sonamu 0.7.3 → 0.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/config.d.ts +1 -4
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/sonamu.d.ts +2 -0
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +19 -47
- package/dist/bin/cli.js +6 -6
- package/dist/database/base-model.d.ts +1 -1
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +15 -4
- package/dist/database/code-generator.d.ts.map +1 -1
- package/dist/database/code-generator.js +3 -3
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +1 -1
- package/dist/database/puri-wrapper.d.ts +11 -11
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri-wrapper.js +7 -11
- package/dist/database/puri.d.ts +36 -17
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +54 -7
- package/dist/database/puri.types.d.ts +54 -17
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +2 -4
- package/dist/database/puri.types.test-d.js +129 -0
- package/dist/database/upsert-builder.d.ts +16 -10
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +10 -19
- package/dist/entity/entity-manager.d.ts +113 -22
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +1 -1
- package/dist/entity/entity.d.ts +34 -0
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +110 -37
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +341 -149
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +21 -5
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +7 -1
- package/dist/migration/postgresql-schema-reader.d.ts +11 -1
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +111 -10
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +5 -4
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +12 -2
- package/dist/template/implementations/generated_sso.template.d.ts +3 -3
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +50 -2
- package/dist/template/implementations/model.template.js +6 -6
- package/dist/template/implementations/model_test.template.js +4 -4
- package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
- package/dist/template/implementations/view_enums_select.template.js +2 -2
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +12 -9
- package/dist/template/implementations/view_id_async_select.template.js +4 -4
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +12 -9
- package/dist/template/implementations/view_search_input.template.js +2 -2
- package/dist/template/template.js +2 -2
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +17 -2
- package/dist/testing/fixture-manager.d.ts +2 -1
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +29 -29
- package/dist/types/types.d.ts +593 -68
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +113 -9
- package/dist/vector/chunking.d.ts +25 -0
- package/dist/vector/chunking.d.ts.map +1 -0
- package/dist/vector/chunking.js +97 -0
- package/dist/vector/config.d.ts +12 -0
- package/dist/vector/config.d.ts.map +1 -0
- package/dist/vector/config.js +83 -0
- package/dist/vector/embedding.d.ts +42 -0
- package/dist/vector/embedding.d.ts.map +1 -0
- package/dist/vector/embedding.js +147 -0
- package/dist/vector/types.d.ts +105 -0
- package/dist/vector/types.d.ts.map +1 -0
- package/dist/vector/types.js +5 -0
- package/dist/vector/vector-search.d.ts +47 -0
- package/dist/vector/vector-search.d.ts.map +1 -0
- package/dist/vector/vector-search.js +176 -0
- package/package.json +11 -11
- package/src/api/config.ts +0 -4
- package/src/api/sonamu.ts +21 -36
- package/src/bin/cli.ts +5 -5
- package/src/database/base-model.ts +20 -11
- package/src/database/code-generator.ts +6 -2
- package/src/database/db.ts +1 -0
- package/src/database/puri-wrapper.ts +22 -16
- package/src/database/puri.ts +150 -27
- package/src/database/puri.types.test-d.ts +457 -0
- package/src/database/puri.types.ts +231 -33
- package/src/database/upsert-builder.ts +43 -34
- package/src/entity/entity-manager.ts +2 -2
- package/src/entity/entity.ts +134 -44
- package/src/index.ts +6 -0
- package/src/migration/code-generation.ts +377 -174
- package/src/migration/migration-set.ts +22 -3
- package/src/migration/migrator.ts +6 -0
- package/src/migration/postgresql-schema-reader.ts +121 -21
- package/src/syncer/syncer.ts +4 -3
- package/src/template/implementations/generated.template.ts +51 -9
- package/src/template/implementations/generated_sso.template.ts +71 -2
- package/src/template/implementations/model.template.ts +5 -5
- package/src/template/implementations/model_test.template.ts +3 -3
- package/src/template/implementations/view_enums_dropdown.template.ts +1 -1
- package/src/template/implementations/view_enums_select.template.ts +1 -1
- package/src/template/implementations/view_form.template.ts +11 -8
- package/src/template/implementations/view_id_async_select.template.ts +3 -3
- package/src/template/implementations/view_list.template.ts +11 -8
- package/src/template/implementations/view_search_input.template.ts +1 -1
- package/src/template/template.ts +1 -1
- package/src/template/zod-converter.ts +20 -0
- package/src/testing/fixture-manager.ts +31 -30
- package/src/types/types.ts +226 -48
- package/src/vector/chunking.ts +115 -0
- package/src/vector/config.ts +68 -0
- package/src/vector/embedding.ts +193 -0
- package/src/vector/types.ts +122 -0
- package/src/vector/vector-search.ts +261 -0
- package/dist/template/implementations/view_enums_buttonset.template.d.ts +0 -17
- package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +0 -1
- package/dist/template/implementations/view_enums_buttonset.template.js +0 -31
- package/dist/template/implementations/view_list_columns.template.d.ts +0 -17
- package/dist/template/implementations/view_list_columns.template.d.ts.map +0 -1
- package/dist/template/implementations/view_list_columns.template.js +0 -49
- package/src/template/implementations/view_enums_buttonset.template.ts +0 -34
- package/src/template/implementations/view_list_columns.template.ts +0 -53
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
/** biome-ignore-all lint/suspicious/noExplicitAny: Puri.types.ts는 다양한 타입을 사용하고 있습니다. */ //
|
|
2
|
-
// - "nothing": DO NOTHING
|
|
3
|
-
// - { update: [...] }: DO UPDATE
|
|
1
|
+
/** biome-ignore-all lint/suspicious/noExplicitAny: Puri.types.ts는 다양한 타입을 사용하고 있습니다. */ // SelectAll 시 모든 조인된 테이블의 컬럼 포함
|
|
4
2
|
export { };
|
|
5
3
|
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJpLnR5cGVzLnRz64qUIOuLpOyWke2VnCDtg4DsnoXsnYQg7IKs7Jqp7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cblxuaW1wb3J0IHR5cGUgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZVNjaGVtYUV4dGVuZCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQdXJpIH0gZnJvbSBcIi4vcHVyaVwiO1xuaW1wb3J0IHR5cGUgeyBQdXJpV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuXG4vLyDrqZTtg4DrjbDsnbTthLAg7Lus65+8IOycoO2LuFxudHlwZSBNZXRhZGF0YUNvbHVtbnMgPSBcIl9fZnVsbHRleHRfX1wiIHwgXCJfX3ZpcnR1YWxfX1wiO1xuXG4vLyB2aXJ0dWFsIOy7rOufvCDtg4DsnoUg7LaU7LacXG50eXBlIFZpcnR1YWxLZXlzPFQ+ID0gVCBleHRlbmRzIHsgX192aXJ0dWFsX186IHJlYWRvbmx5IChpbmZlciBWKVtdIH0gPyBWICYgc3RyaW5nIDogbmV2ZXI7XG5cbi8vIHZpcnR1YWwg7Lus65+8IOygnOqxsFxudHlwZSBTdHJpcFZpcnR1YWw8VD4gPSBPbWl0PFQsIFZpcnR1YWxLZXlzPFQ+PjtcblxuLy8g66mU7YOA642w7J207YSwIO2VhOuTnCDsoJzsmbjtlZwg7Iuk7KCcIOyXlO2LsO2LsCDsu6zrn7xcbmV4cG9ydCB0eXBlIENvbHVtbktleXM8VD4gPSBFeGNsdWRlPGtleW9mIFN0cmlwVmlydHVhbDxUPiwgTWV0YWRhdGFDb2x1bW5zPiAmIHN0cmluZztcblxuLy8gdmlydHVhbCDsu6zrn7wg7KCc6rGwIO2bhCBfX2Z1bGx0ZXh0X18g66mU7YOA642w7J207YSwIOycoOyngFxuZXhwb3J0IHR5cGUgUHVyaVRhYmxlPFQ+ID0gT21pdDxTdHJpcFZpcnR1YWw8VD4sIFwiX192aXJ0dWFsX19cIj47XG5cbi8vIOuplO2DgOuNsOydtO2EsCDsu6zrn7wg7KCc7Jm4IO2DgOyehSDsoJXsnZhcbmV4cG9ydCB0eXBlIE9taXRNZXRhZGF0YUNvbHVtbnM8VD4gPSBPbWl0PFQsIE1ldGFkYXRhQ29sdW1ucz47XG5cbi8vIFRUYWJsZXPsnZgg66qo65OgIO2FjOydtOu4lOyXkOyEnCDsgqzsmqkg6rCA64ql7ZWcIOy7rOufvCDqsr3roZxcbmV4cG9ydCB0eXBlIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID1cbiAgfCB7XG4gICAgICBbVEFsaWFzIGluIGtleW9mIFRUYWJsZXNdOiBgJHtUQWxpYXMgJiBzdHJpbmd9LiR7Q29sdW1uS2V5czxUVGFibGVzW1RBbGlhc10+fWA7XG4gICAgfVtrZXlvZiBUVGFibGVzXVxuICB8IChJc1NpbmdsZUtleTxUVGFibGVzPiBleHRlbmRzIHRydWVcbiAgICAgID8gQ29sdW1uS2V5czxUVGFibGVzW2tleW9mIFRUYWJsZXNdPiAvLyDri6jsnbwg7YWM7J2067iU7J2066m0IOy7rOufvOuqheunjOuPhCDtl4jsmqlcbiAgICAgIDogbmV2ZXIpO1xuXG4vLyBHcm91cCBCeSwgT3JkZXIgQnksIEhhdmluZyDrk7Hsl5DshJwg7ISg7YOdIOqwgOuKpe2VnCDsu6zrn7xcbmV4cG9ydCB0eXBlIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFRSZXN1bHQgPSBhbnk+ID1cbiAgfCBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+XG4gIHwgYCR7a2V5b2YgVFJlc3VsdCAmIHN0cmluZ31gO1xuXG4vLyBTZWxlY3Qg6rCSIO2DgOyehSDtmZXsnqVcbmV4cG9ydCB0eXBlIFNlbGVjdFZhbHVlPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9XG4gIHwgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPlxuICB8IFNxbEV4cHJlc3Npb248XCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIiB8IFwiZGF0ZVwiPjtcblxuLy8gU2VsZWN0IOqwneyytCDtg4DsnoUgKO2YhOyerOuKlCDsu6zrn7wg6rK966Gc66eMIOyngOybkClcbmV4cG9ydCB0eXBlIFNlbGVjdE9iamVjdDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSBSZWNvcmQ8XG4gIHN0cmluZyxcbiAgU2VsZWN0VmFsdWU8VFRhYmxlcz4gLy8gQXZhaWxhYmxlQ29sdW1ucyDrjIDsi6Bcbj47XG5cbi8vIFNlbGVjdCDqsrDqs7wg7YOA7J6FIOy2lOuhoFxuZXhwb3J0IHR5cGUgUGFyc2VTZWxlY3RPYmplY3Q8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+LFxuPiA9IHtcbiAgW0sgaW4ga2V5b2YgVFNlbGVjdF06IFRTZWxlY3RbS10gZXh0ZW5kcyBTcWxFeHByZXNzaW9uPGluZmVyIFI+XG4gICAgPyBSIGV4dGVuZHMgXCJzdHJpbmdcIlxuICAgICAgPyBzdHJpbmdcbiAgICAgIDogUiBleHRlbmRzIFwibnVtYmVyXCJcbiAgICAgICAgPyBudW1iZXJcbiAgICAgICAgOiBSIGV4dGVuZHMgXCJib29sZWFuXCJcbiAgICAgICAgICA/IGJvb2xlYW5cbiAgICAgICAgICA6IFIgZXh0ZW5kcyBcImRhdGVcIlxuICAgICAgICAgICAgPyBEYXRlXG4gICAgICAgICAgICA6IG5ldmVyXG4gICAgOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUU2VsZWN0W0tdICYgc3RyaW5nPjtcbn07XG5cbi8vIOy7rOufvCDqsr3roZzsl5DshJwg7YOA7J6FIOy2lOy2nFxuZXhwb3J0IHR5cGUgRXh0cmFjdENvbHVtblR5cGU8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBQYXRoIGV4dGVuZHMgc3RyaW5nLFxuPiA9IFBhdGggZXh0ZW5kcyBgJHtpbmZlciBUQWxpYXN9LiR7aW5mZXIgVENvbHVtbn1gXG4gID8gVEFsaWFzIGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICAgID8gVENvbHVtbiBleHRlbmRzIGtleW9mIFRUYWJsZXNbVEFsaWFzXVxuICAgICAgPyBUVGFibGVzW1RBbGlhc11bVENvbHVtbl1cbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyXG4gIDogSXNTaW5nbGVLZXk8VFRhYmxlcz4gZXh0ZW5kcyB0cnVlIC8vIOy2lOqwgFxuICAgID8gUGF0aCBleHRlbmRzIGtleW9mIFRUYWJsZXNba2V5b2YgVFRhYmxlc11cbiAgICAgID8gVFRhYmxlc1trZXlvZiBUVGFibGVzXVtQYXRoXVxuICAgICAgOiBuZXZlclxuICAgIDogbmV2ZXI7XG4vLyBXaGVyZSDsobDqsbQg6rCd7LK0IO2DgOyehVxuLy8g7JiIOiB7IFwidS5pZFwiOiAxLCBcInUuc3RhdHVzXCI6IFwiYWN0aXZlXCIgfVxuZXhwb3J0IHR5cGUgV2hlcmVDb25kaXRpb248VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBba2V5IGluIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz5dPzogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywga2V5ICYgc3RyaW5nPjtcbn07XG5cbi8vIEZ1bGx0ZXh0IGluZGV4IOy7rOufvCDstpTstpwg7YOA7J6FXG5leHBvcnQgdHlwZSBGdWxsdGV4dENvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBbVEFsaWFzIGluIGtleW9mIFRUYWJsZXNdOiBUVGFibGVzW1RBbGlhc10gZXh0ZW5kcyB7XG4gICAgX19mdWxsdGV4dF9fOiByZWFkb25seSAoaW5mZXIgQ29sKVtdO1xuICB9XG4gICAgPyBDb2wgZXh0ZW5kcyBzdHJpbmdcbiAgICAgID8gYCR7VEFsaWFzICYgc3RyaW5nfS4ke0NvbH1gXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlcjtcbn1ba2V5b2YgVFRhYmxlc107XG5cbi8vIOu5hOq1kCDsl7DsgrDsnpBcbmV4cG9ydCB0eXBlIENvbXBhcmlzb25PcGVyYXRvciA9IFwiPVwiIHwgXCI+XCIgfCBcIj49XCIgfCBcIjxcIiB8IFwiPD1cIiB8IFwiPD5cIiB8IFwiIT1cIjtcblxuLy8gU1FMIEV4cHJlc3Npb24g7YOA7J6FIOygleydmFxuZXhwb3J0IHR5cGUgU3FsRXhwcmVzc2lvbjxUIGV4dGVuZHMgXCJzdHJpbmdcIiB8IFwibnVtYmVyXCIgfCBcImJvb2xlYW5cIiB8IFwiZGF0ZVwiPiA9IHtcbiAgX3R5cGU6IFwic3FsX2V4cHJlc3Npb25cIjsgLy8g65iQ64qUIFwiY29tcHV0ZWRfdmFsdWVcIlxuICBfcmV0dXJuOiBUO1xuICBfc3FsOiBzdHJpbmc7XG59O1xuXG4vLyDqsrDqs7wg7YOA7J6FIOqwgOuPheyEseydhCDsnITtlZwg7YOA7J6FIO2ZleyepVxuZXhwb3J0IHR5cGUgRXhwYW5kPFQ+ID0gVCBleHRlbmRzIGFueVtdXG4gID8geyBbSyBpbiBrZXlvZiBUWzBdXTogVFswXVtLXSB9W10gLy8g67Cw7Je07J2066m0IOyyqyDrsojsp7gg7JqU7IaM66W8IEV4cGFuZO2VmOqzoCDrsLDsl7TroZwg6rCQ7IyIXG4gIDogVCBleHRlbmRzIG9iamVjdFxuICAgID8geyBbSyBpbiBrZXlvZiBUXTogVFtLXSB9XG4gICAgOiBUO1xuXG50eXBlIElzU2luZ2xlS2V5PFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IGtleW9mIFRUYWJsZXMgZXh0ZW5kcyBpbmZlciBLXG4gID8gSyBleHRlbmRzIGtleW9mIFRUYWJsZXNcbiAgICA/IGtleW9mIFRUYWJsZXMgZXh0ZW5kcyBLIC8vIOyXreuwqe2WpSDssrTtgazroZwg64uo7J28IO2CpCDtmZXsnbhcbiAgICAgID8gdHJ1ZVxuICAgICAgOiBmYWxzZVxuICAgIDogZmFsc2VcbiAgOiBmYWxzZTtcblxuZXhwb3J0IHR5cGUgU2luZ2xlVGFibGVWYWx1ZTxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPVxuICBJc1NpbmdsZUtleTxUVGFibGVzPiBleHRlbmRzIHRydWUgPyBUVGFibGVzW2tleW9mIFRUYWJsZXNdIDogbmV2ZXI7XG5cbi8vIE51bGxhYmxl7J2EIE9wdGlvbmFs66GcIOuzgO2ZmFxudHlwZSBOdWxsYWJsZVRvT3B0aW9uYWw8VD4gPSB7XG4gIFtLIGluIGtleW9mIFQgYXMgVFtLXSBleHRlbmRzIG51bGwgfCB1bmRlZmluZWQgPyBLIDogbmV2ZXJdPzogRXhjbHVkZTxUW0tdLCBudWxsIHwgdW5kZWZpbmVkPjtcbn0gJiBQYXJ0aWFsPHtcbiAgW0sgaW4ga2V5b2YgVCBhcyBUW0tdIGV4dGVuZHMgbnVsbCB8IHVuZGVmaW5lZCA/IG5ldmVyIDogS106IFRbS107XG59PjtcblxuLy8gSW5zZXJ0IO2DgOyehTogaWQsIGNyZWF0ZWRfYXQg7KCc7Jm4XG5leHBvcnQgdHlwZSBJbnNlcnREYXRhPFQ+ID0gTnVsbGFibGVUb09wdGlvbmFsPFxuICBPbWl0PFB1cmlUYWJsZTxUPiwgXCJpZFwiIHwgXCJjcmVhdGVkX2F0XCIgfCBNZXRhZGF0YUNvbHVtbnM+XG4+O1xuXG4vLyBJbnNlcnQgUmVzdWx0IO2DgOyehVxuZXhwb3J0IHR5cGUgSW5zZXJ0UmVzdWx0ID0gUGljazxRdWVyeVJlc3VsdDxhbnk+LCBcImNvbW1hbmRcIiB8IFwicm93Q291bnRcIiB8IFwicm93c1wiIHwgXCJvaWRcIj47XG5cbi8vIFN1YnNldFF1ZXJ566W8IOychO2VnCDtg4DsnoUg7Jyg7Yu466as7YuwXG50eXBlIEV4dHJhY3RUVGFibGVzPFQgZXh0ZW5kcyBQdXJpPGFueSwgYW55LCBhbnk+PiA9IFQgZXh0ZW5kcyBQdXJpPGFueSwgaW5mZXIgVFRhYmxlcywgYW55PlxuICA/IFRUYWJsZXNcbiAgOiBuZXZlcjtcbmV4cG9ydCB0eXBlIFVuaW9uRXh0cmFjdGVkVFRhYmxlczxcbiAgU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nLFxuICBTdWJzZXRRdWVyaWVzIGV4dGVuZHMgUmVjb3JkPFxuICAgIFN1YnNldEtleSxcbiAgICAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IFB1cmk8YW55LCBhbnksIGFueT5cbiAgPixcbj4gPSB7XG4gIFtLIGluIFN1YnNldEtleV06IEV4dHJhY3RUVGFibGVzPFJldHVyblR5cGU8U3Vic2V0UXVlcmllc1tLXT4+O1xufVtTdWJzZXRLZXldO1xuXG4vLyBPTiBDT05GTElDVCDrjIDsg4Eg7YOA7J6FXG4vLyAtIOuLqOydvCDsu6zrn7w6IFwiZW1haWxcIlxuLy8gLSDrs7XsiJgg7Lus65+8OiBbXCJ1c2VyX2lkXCIsIFwicHJvZHVjdF9pZFwiXVxuZXhwb3J0IHR5cGUgT25Db25mbGljdFRhcmdldCA9IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4vLyBPTiBDT05GTElDVCDslaHshZgg7YOA7J6FXG4vLyAtIFwibm90aGluZ1wiOiBETyBOT1RISU5HXG4vLyAtIHsgdXBkYXRlOiBbLi4uXSB9OiBETyBVUERBVEVcbmV4cG9ydCB0eXBlIE9uQ29uZmxpY3RBY3Rpb248VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9XG4gIHwgXCJub3RoaW5nXCJcbiAgfCB7XG4gICAgICB1cGRhdGU6XG4gICAgICAgIHwgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPltdIC8vIOuwsOyXtCDtmJXtg5wgLSBbXCJuYW1lXCIsIFwiZW1haWxcIl1cbiAgICAgICAgfCBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPjsgLy8g6rCd7LK0IO2Yle2DnCAtIHsgbmFtZTogXCJKb2huXCIsIGNvdW50OiBQdXJpLnJhd051bWJlciguLi4pIH1cbiAgICB9O1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNGQUFzRixHQWtLdEYsb0JBQW9CO0FBQ3BCLDBCQUEwQjtBQUMxQixpQ0FBaUM7QUFDakMsV0FNTSJ9
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJpLnR5cGVzLnRz64qUIOuLpOyWke2VnCDtg4DsnoXsnYQg7IKs7Jqp7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cblxuaW1wb3J0IHR5cGUgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUZvcmVpZ25LZXlzLCBEYXRhYmFzZVNjaGVtYUV4dGVuZCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQdXJpIH0gZnJvbSBcIi4vcHVyaVwiO1xuaW1wb3J0IHR5cGUgeyBQdXJpV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8g64K067aAIO2DgOyehSDtgqQgKOuplO2DgOuNsOydtO2EsClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG50eXBlIEZ1bGx0ZXh0S2V5ID0gXCJfX2Z1bGx0ZXh0X19cIjtcbnR5cGUgVmlydHVhbEtleSA9IFwiX192aXJ0dWFsX19cIjtcbnR5cGUgTGVmdEpvaW5lZEtleSA9IFwiX19sZWZ0Sm9pbmVkX19cIjtcbnR5cGUgSGFzRGVmYXVsdCA9IFwiX19oYXNEZWZhdWx0X19cIjtcbnR5cGUgR2VuZXJhdGVkS2V5ID0gXCJfX2dlbmVyYXRlZF9fXCI7XG5cbnR5cGUgSW50ZXJuYWxUeXBlS2V5cyA9IEZ1bGx0ZXh0S2V5IHwgVmlydHVhbEtleSB8IExlZnRKb2luZWRLZXkgfCBIYXNEZWZhdWx0IHwgR2VuZXJhdGVkS2V5O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8g7YOA7J6FIOycoO2LuOumrO2LsFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8g7YWM7J2067iU66qFIO2DgOyehVxuZXhwb3J0IHR5cGUgVGFibGVOYW1lPFRTY2hlbWE+ID0ga2V5b2YgVFNjaGVtYSAmIHN0cmluZztcblxuLy8gdmlydHVhbCDsu6zrn7wg7YOA7J6FIOy2lOy2nFxudHlwZSBWaXJ0dWFsS2V5czxUPiA9IFQgZXh0ZW5kcyB7IFtLIGluIFZpcnR1YWxLZXldOiByZWFkb25seSAoaW5mZXIgVilbXSB9ID8gViAmIHN0cmluZyA6IG5ldmVyO1xuXG4vLyB2aXJ0dWFsIOy7rOufvCDsoJzqsbBcbnR5cGUgU3RyaXBWaXJ0dWFsPFQ+ID0gT21pdDxULCBWaXJ0dWFsS2V5czxUPj47XG5cbi8vIExFRlQgSk9JTiDrp4jsu6QgLSBudWxsYWJsZSBGS+uhnCDsobDsnbjrkJwg7YWM7J2067iUXG4vLyDsnbQg66eI7Luk64qUIG51bGxhYmxlIEZLICsgbGVmdEpvaW4g7KGw7ZWp7JeQ7ISc66eMIOu2meyKteuLiOuLpC5cbi8vIGpvaW4gKyBGSyBudWxsYWJsZSAtPiDslYgg67aZ7J2MXG4vLyBqb2luICsgRksgbm9uLW51bGxhYmxlIC0+IOyViCDrtpnsnYxcbi8vIGxlZnRKb2luICsgRksgbm9uLW51bGxhYmxlIC0+IOyViCDrtpnsnYxcbi8vIGxlZnRKb2luICsgRksgbnVsbGFibGUgLT4g67aZ7J2MIVxuZXhwb3J0IHR5cGUgTGVmdEpvaW5lZE1hcmtlciA9IHsgW0sgaW4gTGVmdEpvaW5lZEtleV06IHRydWUgfTtcblxuLy8g66mU7YOA642w7J207YSwIO2VhOuTnCDsoJzsmbjtlZwg7Iuk7KCcIOyXlO2LsO2LsCDsu6zrn7xcbmV4cG9ydCB0eXBlIENvbHVtbktleXM8VD4gPSBFeGNsdWRlPGtleW9mIFN0cmlwVmlydHVhbDxUPiwgSW50ZXJuYWxUeXBlS2V5cz4gJiBzdHJpbmc7XG5cbi8vIHZpcnR1YWwg7Lus65+8IOygnOqxsCDtm4QgX19mdWxsdGV4dF9fIOycoOyngFxuZXhwb3J0IHR5cGUgUHVyaVRhYmxlPFQ+ID0gT21pdDxTdHJpcFZpcnR1YWw8VD4sIFZpcnR1YWxLZXk+O1xuXG4vLyDrgrTrtoAg7YOA7J6FIO2CpCDsoJzsmbggKOyLpOygnCDsu6zrn7zrp4wg64Ko6rmAKVxuZXhwb3J0IHR5cGUgT21pdEludGVybmFsVHlwZUtleXM8VD4gPSBPbWl0PFQsIEludGVybmFsVHlwZUtleXM+O1xuXG4vLyBUVGFibGVz7J2YIOuqqOuToCDthYzsnbTruJTsl5DshJwg7IKs7JqpIOqwgOuKpe2VnCDsu6zrn7wg6rK966GcXG5leHBvcnQgdHlwZSBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9XG4gIHwge1xuICAgICAgW1RBbGlhcyBpbiBrZXlvZiBUVGFibGVzXTogYCR7VEFsaWFzICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFRhYmxlc1tUQWxpYXNdPn1gO1xuICAgIH1ba2V5b2YgVFRhYmxlc11cbiAgfCAoSXNTaW5nbGVLZXk8VFRhYmxlcz4gZXh0ZW5kcyB0cnVlXG4gICAgICA/IENvbHVtbktleXM8VFRhYmxlc1trZXlvZiBUVGFibGVzXT4gLy8g64uo7J28IO2FjOydtOu4lOydtOuptCDsu6zrn7zrqoXrp4zrj4Qg7ZeI7JqpXG4gICAgICA6IG5ldmVyKTtcblxuLy8g7Iir7J6QIO2DgOyehSDsu6zrn7zrp4wg7LaU7Lac7ZWY64qUIOycoO2LuOumrO2LsCDtg4DsnoVcbnR5cGUgTnVtZXJpY0NvbHVtbktleXM8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50IHwgbnVsbCB8IHVuZGVmaW5lZCA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF0gJlxuICBzdHJpbmc7XG5cbi8vIFRUYWJsZXPsnZgg66qo65OgIO2FjOydtOu4lOyXkOyEnCDsiKvsnpAg7YOA7J6FIOy7rOufvOunjCDstpTstpxcbmV4cG9ydCB0eXBlIE51bWVyaWNDb2x1bW5zPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9XG4gIHwge1xuICAgICAgW1RBbGlhcyBpbiBrZXlvZiBUVGFibGVzXTogYCR7VEFsaWFzICYgc3RyaW5nfS4ke051bWVyaWNDb2x1bW5LZXlzPFRUYWJsZXNbVEFsaWFzXT59YDtcbiAgICB9W2tleW9mIFRUYWJsZXNdXG4gIHwgKElzU2luZ2xlS2V5PFRUYWJsZXM+IGV4dGVuZHMgdHJ1ZVxuICAgICAgPyBOdW1lcmljQ29sdW1uS2V5czxUVGFibGVzW2tleW9mIFRUYWJsZXNdPiAvLyDri6jsnbwg7YWM7J2067iU7J2066m0IOy7rOufvOuqheunjOuPhCDtl4jsmqlcbiAgICAgIDogbmV2ZXIpO1xuXG4vLyBHcm91cCBCeSwgT3JkZXIgQnksIEhhdmluZyDrk7Hsl5DshJwg7ISg7YOdIOqwgOuKpe2VnCDsu6zrn7xcbmV4cG9ydCB0eXBlIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFRSZXN1bHQgPSBhbnk+ID1cbiAgfCBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+XG4gIHwgYCR7a2V5b2YgVFJlc3VsdCAmIHN0cmluZ31gO1xuXG4vLyBTZWxlY3Qg6rCSIO2DgOyehSDtmZXsnqUgKOuLqOydvCDsu6zrn7wg65iQ64qUIFNRTCDtkZztmITsi50pXG5leHBvcnQgdHlwZSBTZWxlY3RWYWx1ZTxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPVxuICB8IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz5cbiAgfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIgfCBcImRhdGVcIj47XG5cbi8vIOykkeyyqSBTZWxlY3Qg6rCd7LK0IO2DgOyehSAo7J6s6reA7KCBKVxuLy8g7JiIOiB7IHBhcmVudDogeyBpZDogXCJwYXJlbnQuaWRcIiwgbmFtZTogXCJwYXJlbnQubmFtZVwiIH0gfVxuZXhwb3J0IHR5cGUgTmVzdGVkU2VsZWN0T2JqZWN0PFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgW2tleTogc3RyaW5nXTogU2VsZWN0VmFsdWU8VFRhYmxlcz4gfCBOZXN0ZWRTZWxlY3RPYmplY3Q8VFRhYmxlcz47XG59O1xuXG4vLyBTZWxlY3Qg6rCd7LK0IO2DgOyehSAoZmxhdCDrmJDripQg7KSR7LKpIO2XiOyaqSlcbmV4cG9ydCB0eXBlIFNlbGVjdE9iamVjdDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSBOZXN0ZWRTZWxlY3RPYmplY3Q8VFRhYmxlcz47XG5cbi8vIOqwkuydtCDspJHssqkg6rCd7LK07J247KeAIO2MkOuzhO2VmOuKlCDtl6ztjbwg7YOA7J6FXG50eXBlIElzTmVzdGVkT2JqZWN0PFQ+ID0gVCBleHRlbmRzIHN0cmluZ1xuICA/IGZhbHNlXG4gIDogVCBleHRlbmRzIFNxbEV4cHJlc3Npb248YW55PlxuICAgID8gZmFsc2VcbiAgICA6IFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICA/IHRydWVcbiAgICAgIDogZmFsc2U7XG5cbi8vIOy7rOufvOydtCBudWxsYWJsZeyduOyngCDtmZXsnbggKOyKpO2CpOuniOyXkOyEnCDsp4HsoJEg7LaU7LacKVxuLy8g7JiIOiBJc051bGxhYmxlQ29sdW1uPFRUYWJsZXMsIFwiZW1wbG95ZWVzLmRlcGFydG1lbnRfaWRcIj4g4oaSIGRlcGFydG1lbnRfaWTqsIAgbnVtYmVyIHwgbnVsbOydtOuptCB0cnVlXG5leHBvcnQgdHlwZSBJc051bGxhYmxlQ29sdW1uPFxuICBUVGFibGVzLFxuICBQYXRoIGV4dGVuZHMgc3RyaW5nLFxuPiA9IFBhdGggZXh0ZW5kcyBgJHtpbmZlciBUQWxpYXN9LiR7aW5mZXIgVENvbHVtbn1gXG4gID8gVEFsaWFzIGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICAgID8gVENvbHVtbiBleHRlbmRzIGtleW9mIFRUYWJsZXNbVEFsaWFzXVxuICAgICAgPyBudWxsIGV4dGVuZHMgVFRhYmxlc1tUQWxpYXNdW1RDb2x1bW5dXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IGZhbHNlXG4gICAgICA6IGZhbHNlXG4gICAgOiBmYWxzZVxuICA6IGZhbHNlO1xuXG4vLyBGSyBudWxsYWJsZSDsl6zrtoDsl5Ag65Sw66W4IOuniOy7pCDtg4DsnoUg6rKw7KCVXG4vLyBudWxsYWJsZSBGS+uhnCBsZWZ0Sm9pbiDihpIgTGVmdEpvaW5lZE1hcmtlciAo6rCd7LK0IOyekOyytOqwgCBudWxs7J28IOyImCDsnojsnYwpXG4vLyBub24tbnVsbCBGS+uhnCBsZWZ0Sm9pbiDihpIg66eI7LukIOyXhuydjCAo67aA66qo6rCAIOyeiOycvOuptCDsnpDsi53rj4Qg67CY65Oc7IucIOyeiOydjClcbmV4cG9ydCB0eXBlIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFBhdGggZXh0ZW5kcyBzdHJpbmc+ID0gSXNOdWxsYWJsZUNvbHVtbjxcbiAgVFRhYmxlcyxcbiAgUGF0aFxuPiBleHRlbmRzIHRydWVcbiAgPyBMZWZ0Sm9pbmVkTWFya2VyXG4gIDoge307XG5cbi8vIOyjvOyWtOynhCDthYzsnbTruJTsnbQgRksgbnVsbGFibGXroZwgbGVmdEpvaW4g65CcIO2FjOydtOu4lOyduOyngCDtmZXsnbjtlanri4jri6QuXG4vLyDsgqzsi6QgTGVmdEpvaW5NYXJrZXLqsIAg67aZ7JeI64qU7KeAIO2ZleyduO2VmOuKlOqyjCDri6TsnoXri4jri6QuXG4vLyDsnbQg66eI7Luk64qUIEZLIG51bGxhYmxlICsgbGVmdEpvaW4g7KGw7ZWp7JeQ7ISc66eMIOu2meyKteuLiOuLpC5cbnR5cGUgSXNOdWxsYWJsZUpvaW5lZFRhYmxlPFRUYWJsZXMsIFRhYmxlS2V5PiA9IFRhYmxlS2V5IGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICA/IFRUYWJsZXNbVGFibGVLZXldIGV4dGVuZHMgTGVmdEpvaW5lZE1hcmtlclxuICAgID8gdHJ1ZSAvLyBMZWZ0Sm9pbmVkTWFya2Vy6rCAIOyeiOycvOuptCBudWxsYWJsZVxuICAgIDogZmFsc2VcbiAgOiBmYWxzZTtcblxuLy8g6rK966GcIOyhsO2VqSDtl6ztjbwgKHByZWZpeOqwgCDsl4bsnLzrqbQga2V566eMLCDsnojsnLzrqbQgcHJlZml4X19rZXkpXG50eXBlIEpvaW5QYXRoPFByZWZpeCBleHRlbmRzIHN0cmluZywgS2V5IGV4dGVuZHMgc3RyaW5nPiA9IFByZWZpeCBleHRlbmRzIFwiXCJcbiAgPyBLZXlcbiAgOiBgJHtQcmVmaXh9X18ke0tleX1gO1xuXG4vLyBTZWxlY3Qg6rKw6rO8IO2DgOyeheydhCDstpTroaDtlbTso7zripQg7Lmc6rWs7J6F64uI64ukLlxuLy8g7J20IO2DgOyeheydgCBQdXJp7J2YIHNlbGVjdCwgYXBwZW5kU2VsZWN07JeQ7IScIFRSZXN1bHTroZwg7IKs7Jqp65Cp64uI64ukLlxuLy9cbi8vIFNjaGVtYeulvCDsnb3slrTshJwgRkvsnZggbnVsbGFiaWxpdHnsl5Ag65Sw6528IGpvaW7rkJwg6rCd7LK07J2YIO2DgOyeheydhCDstpTroaDtlbTso7zripQg6riw64ql7J20IOyeiOyKteuLiOuLpC5cbi8vIOydtOqyjCDrrLTsiqgg7IaM66as64OQPyBGS+qwgCBudWxsYWJsZeyduOuNsCBsZWZ0Sm9pbuuQmOyXiOuLpOuptCwg7ZW064u5IOqwneyytOuKlCBudWxsYWJsZSDtlbTslbwg7ZWo7J2EIO2DgOyehSDstpTroaDsnLzroZwg67CY7JiB7ZW07KSA64uk64qUIOqyg+yeheuLiOuLpC5cbi8vIOuwmOuptCBGS+qwgCBub24tbnVsbGFibGXsnbTqsbDrgpgg6re464OlIGpvaW7snLzroZwg7J207Ja07KGM64uk66m0IO2VtOuLuSDqsJ3ssrTripQgbm9uLW51bGxhYmxl7ZWgIOqygeuLiOuLpC5cbi8vIOusvOuhoCDqsJ3ssrQg64K067aA7J2YIG51bGxhYmlsaXR564qUIOuYkCDrs4TqsJzroZwg7LaU66Gg65Cp64uI64ukLiBcbi8vIFxuLy8g7JWE656Y7JeQ64+EIFBhcnNlU2VsZWN0T2JqZWN0V2l0aFBhdGjrpbwg67mE66Gv7ZW0IEV4dHJhY3RDb2x1bW5UeXBlLCBFeHRyYWN0Q29sdW1uVHlwZVJhdyDrk7HsnZgg7YOA7J6F7J20IOyeiOyKteuLiOuLpC5cbi8vIOydtOuTpOydmCDsl63tlaDsnYAg64uk7J2M6rO8IOqwmeyKteuLiOuLpDpcbi8vIC0gUGFyc2UqOiDqsJ3ssrQg66CI67Ko7JeQ7IScIOykkeyyqSDqtazsobDrpbwg7Iic7ZqM7ZWY66mwIOqwneyytOyXkCB8IG51bGzsnYQg67aZ7J287KeAIOqysOygle2VqeuLiOuLpC5cbi8vIC0gRXh0cmFjdCo6IO2VhOuTnCDroIjrsqjsl5DshJwgXCJ0YWJsZS5jb2x1bW5cIiDqsr3roZzroZzrtoDthLAg7Iuk7KCcIO2DgOyeheydhCDstpTstpztlanri4jri6QuXG4vL1xuLy8g7JiI7IucOlxuLy8gLnNlbGVjdCh7XG4vLyAgIGlkOiBcInVzZXJzLmlkXCIsICAgICAgICAgICAvLyDihpAgRXh0cmFjdENvbHVtblR5cGXsnZgg6rKw6rO864qUIG51bWJlcuyeheuLiOuLpC5cbi8vICAgZGVwYXJ0bWVudDogeyAgICAgICAgICAgICAvLyDihpAgUGFyc2VTZWxlY3RPYmplY3RJbm5lcuyXkCDsnZjtlbQgbnVsbGFibGUg6rCd7LK066GcIOy2lOuhoOuQqeuLiOuLpC5cbi8vICAgICBpZDogXCJkZXBhcnRtZW50LmlkXCIsICAgIC8vIOKGkCBFeHRyYWN0Q29sdW1uVHlwZVJhd+ydmCDqsrDqs7zripQgbnVtYmVy7J6F64uI64ukLlxuLy8gICAgIG5hbWU6IFwiZGVwYXJ0bWVudC5uYW1lXCIgLy8g4oaQIEV4dHJhY3RDb2x1bW5UeXBlUmF37J2YIOqysOqzvOuKlCBzdHJpbmfsnoXri4jri6QuXG4vLyAgIH1cbi8vIH0pXG5leHBvcnQgdHlwZSBQYXJzZVNlbGVjdE9iamVjdDxcbiAgVFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFRTZWxlY3QgZXh0ZW5kcyBTZWxlY3RPYmplY3Q8VFRhYmxlcz4sXG4+ID0gUGFyc2VTZWxlY3RPYmplY3RXaXRoUGF0aDxUVGFibGVzLCBUU2VsZWN0LCBcIlwiPjtcblxuLy8g6rK966Gc66W8IOy2lOygge2VmOuptOyEnCBTZWxlY3Qg6rKw6rO8IO2DgOyeheydhCDstpTroaDtlanri4jri6QuXG50eXBlIFBhcnNlU2VsZWN0T2JqZWN0V2l0aFBhdGg8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+LFxuICBQcmVmaXggZXh0ZW5kcyBzdHJpbmcsXG4+ID0gRXhwYW5kPHtcbiAgW0sgaW4ga2V5b2YgVFNlbGVjdF06IFRTZWxlY3RbS10gZXh0ZW5kcyBTcWxFeHByZXNzaW9uPGluZmVyIFI+XG4gICAgPyBSIGV4dGVuZHMgXCJzdHJpbmdcIlxuICAgICAgPyBzdHJpbmdcbiAgICAgIDogUiBleHRlbmRzIFwibnVtYmVyXCJcbiAgICAgICAgPyBudW1iZXJcbiAgICAgICAgOiBSIGV4dGVuZHMgXCJib29sZWFuXCJcbiAgICAgICAgICA/IGJvb2xlYW5cbiAgICAgICAgICA6IFIgZXh0ZW5kcyBcImRhdGVcIlxuICAgICAgICAgICAgPyBEYXRlXG4gICAgICAgICAgICA6IG5ldmVyXG4gICAgOiBJc05lc3RlZE9iamVjdDxUU2VsZWN0W0tdPiBleHRlbmRzIHRydWVcbiAgICAgID8gVFNlbGVjdFtLXSBleHRlbmRzIE5lc3RlZFNlbGVjdE9iamVjdDxUVGFibGVzPlxuICAgICAgICA/IElzTnVsbGFibGVKb2luZWRUYWJsZTxUVGFibGVzLCBKb2luUGF0aDxQcmVmaXgsIEsgJiBzdHJpbmc+PiBleHRlbmRzIHRydWUgLy8g7KO87Ja07KeEIO2FjOydtOu4lOydtCBGSyBudWxsYWJsZeyXkCBsZWZ0Sm9pbuuQmOyXiOuKlOyngCDsl6zrtoDsl5Ag65Sw6528IHNlbGVjdCDqsrDqs7wg6rCd7LK07J2YIO2DgOyeheydtCDri6zrnbzsp5Hri4jri6QuXG4gICAgICAgICAgPyBFeHBhbmQ8UGFyc2VTZWxlY3RPYmplY3RJbm5lcjxUVGFibGVzLCBUU2VsZWN0W0tdLCBKb2luUGF0aDxQcmVmaXgsIEsgJiBzdHJpbmc+Pj4gfCBudWxsIC8vIOunjOyVvSDtlbTri7ntlZzri6TrqbQg7ZW064u5IOqwneyytCDsnpDssrTripQgbnVsbGFibGUg7ZWY66mwLFxuICAgICAgICAgIDogRXhwYW5kPFBhcnNlU2VsZWN0T2JqZWN0SW5uZXI8VFRhYmxlcywgVFNlbGVjdFtLXSwgSm9pblBhdGg8UHJlZml4LCBLICYgc3RyaW5nPj4+IC8vIOq3uOugh+yngCDslYrri6TrqbQgbm9uLW51bGxhYmxlIO2VqeuLiOuLpC5cbiAgICAgICAgOiBuZXZlclxuICAgICAgOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUU2VsZWN0W0tdICYgc3RyaW5nPjtcbn0+O1xuXG4vLyDspJHssqkg6rCd7LK0IOuCtOu2gOyaqSAtIGxlZnRKb2luIG51bGxhYmxl7J2EIOqwneyytCDroIjrsqjsl5DshJwg7J2066+4IOyymOumrO2WiOycvOuvgOuhnCDtlYTrk5zripQg7JuQ67O4IO2DgOyeheydhCDsgqzsmqntlanri4jri6QuXG4vLyBQYXJzZVNlbGVjdE9iamVjdFdpdGhQYXRo7JmAIOqxsOydmCDrj5nsnbztlZjrgpgsIOuniOyngOunieyXkCBFeHRyYWN0Q29sdW1uVHlwZSDrjIDsi6AgRXh0cmFjdENvbHVtblR5cGVSYXfrpbwg7IKs7Jqp7ZWY7JesXG4vLyDtlYTrk5wg66CI67Ko7JeQ7IScIOykkeuzteycvOuhnCB8IG51bGzsnbQg7LaU6rCA65CY64qUIOqyg+ydhCDrsKnsp4Dtlanri4jri6QuXG50eXBlIFBhcnNlU2VsZWN0T2JqZWN0SW5uZXI8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+LFxuICBQcmVmaXggZXh0ZW5kcyBzdHJpbmcsXG4+ID0gRXhwYW5kPHtcbiAgW0sgaW4ga2V5b2YgVFNlbGVjdF06IFRTZWxlY3RbS10gZXh0ZW5kcyBTcWxFeHByZXNzaW9uPGluZmVyIFI+XG4gICAgPyBSIGV4dGVuZHMgXCJzdHJpbmdcIlxuICAgICAgPyBzdHJpbmdcbiAgICAgIDogUiBleHRlbmRzIFwibnVtYmVyXCJcbiAgICAgICAgPyBudW1iZXJcbiAgICAgICAgOiBSIGV4dGVuZHMgXCJib29sZWFuXCJcbiAgICAgICAgICA/IGJvb2xlYW5cbiAgICAgICAgICA6IFIgZXh0ZW5kcyBcImRhdGVcIlxuICAgICAgICAgICAgPyBEYXRlXG4gICAgICAgICAgICA6IG5ldmVyXG4gICAgOiBJc05lc3RlZE9iamVjdDxUU2VsZWN0W0tdPiBleHRlbmRzIHRydWVcbiAgICAgID8gVFNlbGVjdFtLXSBleHRlbmRzIE5lc3RlZFNlbGVjdE9iamVjdDxUVGFibGVzPlxuICAgICAgICA/IElzTnVsbGFibGVKb2luZWRUYWJsZTxUVGFibGVzLCBKb2luUGF0aDxQcmVmaXgsIEsgJiBzdHJpbmc+PiBleHRlbmRzIHRydWVcbiAgICAgICAgICA/IEV4cGFuZDxQYXJzZVNlbGVjdE9iamVjdElubmVyPFRUYWJsZXMsIFRTZWxlY3RbS10sIEpvaW5QYXRoPFByZWZpeCwgSyAmIHN0cmluZz4+PiB8IG51bGxcbiAgICAgICAgICA6IEV4cGFuZDxQYXJzZVNlbGVjdE9iamVjdElubmVyPFRUYWJsZXMsIFRTZWxlY3RbS10sIEpvaW5QYXRoPFByZWZpeCwgSyAmIHN0cmluZz4+PlxuICAgICAgICA6IG5ldmVyXG4gICAgICA6IEV4dHJhY3RDb2x1bW5UeXBlUmF3PFRUYWJsZXMsIFRTZWxlY3RbS10gJiBzdHJpbmc+OyAvLyBsZWZ0Sm9pbiBudWxsYWJsZSDrrLTsi5xcbn0+O1xuXG4vLyDsu6zrn7wg6rK966Gc7JeQ7IScIO2DgOyeheydhCDstpTstpztlanri4jri6QuIExlZnRKb2luZWRNYXJrZXLqsIAg7J6I7Jy866m0IHwgbnVsbOydhCDstpTqsIDtlanri4jri6QuXG4vLyDstZzsg4HsnIQgc2VsZWN0IO2VhOuTnOyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG5leHBvcnQgdHlwZSBFeHRyYWN0Q29sdW1uVHlwZTxcbiAgVFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFBhdGggZXh0ZW5kcyBzdHJpbmcsXG4+ID0gUGF0aCBleHRlbmRzIGAke2luZmVyIFRBbGlhc30uJHtpbmZlciBUQ29sdW1ufWBcbiAgPyBUQWxpYXMgZXh0ZW5kcyBrZXlvZiBUVGFibGVzXG4gICAgPyBUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFRhYmxlc1tUQWxpYXNdXG4gICAgICA/IFRUYWJsZXNbVEFsaWFzXSBleHRlbmRzIExlZnRKb2luZWRNYXJrZXJcbiAgICAgICAgPyBUVGFibGVzW1RBbGlhc11bVENvbHVtbl0gfCBudWxsIC8vIExFRlQgSk9JTiAobnVsbGFibGUgRkspIOKGkiBudWxsYWJsZVxuICAgICAgICA6IFRUYWJsZXNbVEFsaWFzXVtUQ29sdW1uXSAvLyBJTk5FUiBKT0lOIOuYkOuKlCBub24tbnVsbCBGSyBsZWZ0Sm9pbiDihpIgbm9uLW51bGxhYmxlXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlclxuICA6IElzU2luZ2xlS2V5PFRUYWJsZXM+IGV4dGVuZHMgdHJ1ZVxuICAgID8gUGF0aCBleHRlbmRzIGtleW9mIFRUYWJsZXNba2V5b2YgVFRhYmxlc11cbiAgICAgID8gVFRhYmxlc1trZXlvZiBUVGFibGVzXVtQYXRoXVxuICAgICAgOiBuZXZlclxuICAgIDogbmV2ZXI7XG5cbi8vIOy7rOufvCDqsr3roZzsl5DshJwg7YOA7J6F7J2EIOy2lOy2nO2VqeuLiOuLpC4gbGVmdEpvaW4g7Jes67aA7JmAIOq0gOqzhOyXhuydtCDsm5Drs7gg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbi8vIOykkeyyqSDqsJ3ssrQg64K067aAIO2VhOuTnOyXkOyEnCDsgqzsmqnrkKnri4jri6QuICjqsJ3ssrQg66CI67Ko7JeQ7IScIOydtOuvuCB8IG51bGwg7LKY66as6rCAIOyZhOujjOuQmOyXiOycvOuvgOuhnClcbnR5cGUgRXh0cmFjdENvbHVtblR5cGVSYXc8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBQYXRoIGV4dGVuZHMgc3RyaW5nLFxuPiA9IFBhdGggZXh0ZW5kcyBgJHtpbmZlciBUQWxpYXN9LiR7aW5mZXIgVENvbHVtbn1gXG4gID8gVEFsaWFzIGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICAgID8gVENvbHVtbiBleHRlbmRzIGtleW9mIFRUYWJsZXNbVEFsaWFzXVxuICAgICAgPyBUVGFibGVzW1RBbGlhc11bVENvbHVtbl0gLy8gbGVmdEpvaW4g7Jes67aA7JmAIOq0gOqzhOyXhuydtCDsm5Drs7gg7YOA7J6FXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlclxuICA6IElzU2luZ2xlS2V5PFRUYWJsZXM+IGV4dGVuZHMgdHJ1ZVxuICAgID8gUGF0aCBleHRlbmRzIGtleW9mIFRUYWJsZXNba2V5b2YgVFRhYmxlc11cbiAgICAgID8gVFRhYmxlc1trZXlvZiBUVGFibGVzXVtQYXRoXVxuICAgICAgOiBuZXZlclxuICAgIDogbmV2ZXI7XG5cbi8vIFdoZXJlIOyhsOqxtCDqsJ3ssrQg7YOA7J6FXG4vLyDsmIg6IHsgXCJ1LmlkXCI6IDEsIFwidS5zdGF0dXNcIjogXCJhY3RpdmVcIiB9XG5leHBvcnQgdHlwZSBXaGVyZUNvbmRpdGlvbjxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gIFtrZXkgaW4gQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPl0/OiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBrZXkgJiBzdHJpbmc+O1xufTtcblxuLy8gRnVsbHRleHQgaW5kZXgg7Lus65+8IOy2lOy2nCDtg4DsnoVcbmV4cG9ydCB0eXBlIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gIFtUQWxpYXMgaW4ga2V5b2YgVFRhYmxlc106IFRUYWJsZXNbVEFsaWFzXSBleHRlbmRzIHtcbiAgICBbSyBpbiBGdWxsdGV4dEtleV06IHJlYWRvbmx5IChpbmZlciBDb2wpW107XG4gIH1cbiAgICA/IENvbCBleHRlbmRzIHN0cmluZ1xuICAgICAgPyBgJHtUQWxpYXMgJiBzdHJpbmd9LiR7Q29sfWBcbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xufVtrZXlvZiBUVGFibGVzXTtcblxuLy8g67mE6rWQIOyXsOyCsOyekFxuZXhwb3J0IHR5cGUgQ29tcGFyaXNvbk9wZXJhdG9yID0gXCI9XCIgfCBcIj5cIiB8IFwiPj1cIiB8IFwiPFwiIHwgXCI8PVwiIHwgXCI8PlwiIHwgXCIhPVwiO1xuLy8g7KGw6rG0IOyXsOyCsOyekDog67mE6rWQIOyXsOyCsOyekCArIO2MqO2EtCDrp6Tsua0g7Jew7IKw7J6QXG5leHBvcnQgdHlwZSBXaGVyZU9wZXJhdG9yID0gQ29tcGFyaXNvbk9wZXJhdG9yIHwgXCJsaWtlXCIgfCBcIm5vdCBsaWtlXCI7XG5cbi8vIFNRTCBFeHByZXNzaW9uIO2DgOyehSDsoJXsnZhcbmV4cG9ydCB0eXBlIFNxbEV4cHJlc3Npb248VCBleHRlbmRzIFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIgfCBcImRhdGVcIj4gPSB7XG4gIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCI7IC8vIOuYkOuKlCBcImNvbXB1dGVkX3ZhbHVlXCJcbiAgX3JldHVybjogVDtcbiAgX3NxbDogc3RyaW5nO1xufTtcblxuLy8g6rKw6rO8IO2DgOyehSDqsIDrj4XshLHsnYQg7JyE7ZWcIO2DgOyehSDtmZXsnqVcbmV4cG9ydCB0eXBlIEV4cGFuZDxUPiA9IFQgZXh0ZW5kcyBhbnlbXVxuICA/IHsgW0sgaW4ga2V5b2YgVFswXV06IFRbMF1bS10gfVtdIC8vIOuwsOyXtOydtOuptCDssqsg67KI7Ke4IOyalOyGjOulvCBFeHBhbmTtlZjqs6Ag67Cw7Je066GcIOqwkOyMiFxuICA6IFQgZXh0ZW5kcyBvYmplY3RcbiAgICA/IHsgW0sgaW4ga2V5b2YgVF06IFRbS10gfVxuICAgIDogVDtcblxudHlwZSBJc1NpbmdsZUtleTxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSBrZXlvZiBUVGFibGVzIGV4dGVuZHMgaW5mZXIgS1xuICA/IEsgZXh0ZW5kcyBrZXlvZiBUVGFibGVzXG4gICAgPyBrZXlvZiBUVGFibGVzIGV4dGVuZHMgSyAvLyDsl63rsKntlqUg7LK07YGs66GcIOuLqOydvCDtgqQg7ZmV7J24XG4gICAgICA/IHRydWVcbiAgICAgIDogZmFsc2VcbiAgICA6IGZhbHNlXG4gIDogZmFsc2U7XG5cbmV4cG9ydCB0eXBlIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID1cbiAgSXNTaW5nbGVLZXk8VFRhYmxlcz4gZXh0ZW5kcyB0cnVlID8gVFRhYmxlc1trZXlvZiBUVGFibGVzXSA6IG5ldmVyO1xuXG4vLyBfX2hhc0RlZmF1bHRfX+yXkCDtj6ztlajrkJwg7YKk65Ok7J2EIFB1cmlUYWJsZTxUPuydmCDtgqTroZwg7KCc7ZWcXG50eXBlIEhhc0RlZmF1bHRLZXlzPFQ+ID0gVCBleHRlbmRzIHsgX19oYXNEZWZhdWx0X186IHJlYWRvbmx5IChpbmZlciBLKVtdIH1cbiAgPyBFeHRyYWN0PEssIGtleW9mIFB1cmlUYWJsZTxUPj5cbiAgOiBuZXZlcjtcblxuLy8gX19nZW5lcmF0ZWRfX+yXkCDtj6ztlajrkJwg7YKk65OkIChJTlNFUlQg7IucIOygnOyZuO2VtOyVvCDtlagpXG50eXBlIEdlbmVyYXRlZEtleXM8VD4gPSBUIGV4dGVuZHMgeyBfX2dlbmVyYXRlZF9fOiByZWFkb25seSAoaW5mZXIgSylbXSB9XG4gID8gRXh0cmFjdDxLLCBrZXlvZiBQdXJpVGFibGU8VD4+XG4gIDogbmV2ZXI7XG5cbi8vIEluc2VydCDtg4DsnoU6IOuplO2DgOuNsOydtO2EsCDsoJzqsbAg7ZuELCBfX2hhc0RlZmF1bHRfXyDsu6zrn7zrk6Trp4wgb3B0aW9uYWzroZwg7LKY66asLCBfX2dlbmVyYXRlZF9fIOy7rOufvOydgCDsmYTsoITtnogg7KCc7Jm4XG5leHBvcnQgdHlwZSBJbnNlcnREYXRhPFQ+ID0gT21pdDxcbiAgUHVyaVRhYmxlPFQ+LFxuICBJbnRlcm5hbFR5cGVLZXlzIHwgSGFzRGVmYXVsdEtleXM8VD4gfCBHZW5lcmF0ZWRLZXlzPFQ+XG4+ICYge1xuICBbSyBpbiBIYXNEZWZhdWx0S2V5czxUPl0/OiBQdXJpVGFibGU8VD5bS107XG59O1xuXG4vLyBJbnNlcnQgUmVzdWx0IO2DgOyehVxuZXhwb3J0IHR5cGUgSW5zZXJ0UmVzdWx0ID0gUGljazxRdWVyeVJlc3VsdDxhbnk+LCBcImNvbW1hbmRcIiB8IFwicm93Q291bnRcIiB8IFwicm93c1wiIHwgXCJvaWRcIj47XG5cbi8vIFN1YnNldFF1ZXJ566W8IOychO2VnCDtg4DsnoUg7Jyg7Yu466as7YuwXG50eXBlIEV4dHJhY3RUVGFibGVzPFQgZXh0ZW5kcyBQdXJpPGFueSwgYW55LCBhbnk+PiA9IFQgZXh0ZW5kcyBQdXJpPGFueSwgaW5mZXIgVFRhYmxlcywgYW55PlxuICA/IFRUYWJsZXNcbiAgOiBuZXZlcjtcbmV4cG9ydCB0eXBlIFVuaW9uRXh0cmFjdGVkVFRhYmxlczxcbiAgU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nLFxuICBTdWJzZXRRdWVyaWVzIGV4dGVuZHMgUmVjb3JkPFxuICAgIFN1YnNldEtleSxcbiAgICAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IFB1cmk8YW55LCBhbnksIGFueT5cbiAgPixcbj4gPSB7XG4gIFtLIGluIFN1YnNldEtleV06IEV4dHJhY3RUVGFibGVzPFJldHVyblR5cGU8U3Vic2V0UXVlcmllc1tLXT4+O1xufVtTdWJzZXRLZXldO1xuXG4vLyBPTiBDT05GTElDVCDrjIDsg4Eg7YOA7J6FXG4vLyAtIOuLqOydvCDsu6zrn7w6IFwiZW1haWxcIlxuLy8gLSDrs7XsiJgg7Lus65+8OiBbXCJ1c2VyX2lkXCIsIFwicHJvZHVjdF9pZFwiXVxuZXhwb3J0IHR5cGUgT25Db25mbGljdFRhcmdldCA9IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4vLyBPTiBDT05GTElDVCDslaHshZgg7YOA7J6FXG4vLyAtIFwibm90aGluZ1wiOiBETyBOT1RISU5HXG4vLyAtIHsgdXBkYXRlOiBbLi4uXSB9OiBETyBVUERBVEVcbmV4cG9ydCB0eXBlIE9uQ29uZmxpY3RBY3Rpb248VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9XG4gIHwgXCJub3RoaW5nXCJcbiAgfCB7XG4gICAgICB1cGRhdGU6XG4gICAgICAgIHwgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPltdIC8vIOuwsOyXtCDtmJXtg5wgLSBbXCJuYW1lXCIsIFwiZW1haWxcIl1cbiAgICAgICAgfCBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPjsgLy8g6rCd7LK0IO2Yle2DnCAtIHsgbmFtZTogXCJKb2huXCIsIGNvdW50OiBQdXJpLnJhd051bWJlciguLi4pIH1cbiAgICB9O1xuXG4vLyBGSyDsu6zrn7zrqoUg7LaU7LacIOycoO2LuOumrO2LsCDtg4DsnoUgLSBEYXRhYmFzZUZvcmVpZ25LZXlzIO2ZnOyaqVxuZXhwb3J0IHR5cGUgRm9yZWlnbktleUNvbHVtbnM8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPERhdGFiYXNlU2NoZW1hRXh0ZW5kPj4gPVxuICBUVGFibGUgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZUZvcmVpZ25LZXlzID8gRGF0YWJhc2VGb3JlaWduS2V5c1tUVGFibGVdIDogbmV2ZXI7XG5cbi8vIFVuaW9u7J2EIEludGVyc2VjdGlvbuycvOuhnCDrs4DtmZjtlZjripQg7Jyg7Yu466as7YuwXG50eXBlIFVuaW9uVG9JbnRlcnNlY3Rpb248VT4gPSAoVSBleHRlbmRzIGFueSA/IChrOiBVKSA9PiB2b2lkIDogbmV2ZXIpIGV4dGVuZHMgKGs6IGluZmVyIEkpID0+IHZvaWRcbiAgPyBJXG4gIDogbmV2ZXI7XG5cbi8vIFNlbGVjdEFsbCDsi5wg66qo65OgIOyhsOyduOuQnCDthYzsnbTruJTsnZgg7Lus65+8IO2PrO2VqFxuZXhwb3J0IHR5cGUgU2VsZWN0QWxsUmVzdWx0PFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IFVuaW9uVG9JbnRlcnNlY3Rpb248XG4gIHtcbiAgICBbSyBpbiBrZXlvZiBUVGFibGVzXTogVFRhYmxlc1tLXSBleHRlbmRzIGluZmVyIFRcbiAgICAgID8gVCBleHRlbmRzIExlZnRKb2luZWRNYXJrZXJcbiAgICAgICAgPyBQYXJ0aWFsPE9taXRJbnRlcm5hbFR5cGVLZXlzPFQ+PiAvLyBMRUZUIEpPSU7snYAgbnVsbGFibGUsIOuplO2DgOuNsOydtO2EsCDsoJzqsbBcbiAgICAgICAgOiBPbWl0SW50ZXJuYWxUeXBlS2V5czxUPiAvLyBJTk5FUiBKT0lO7J2AIG5vbi1udWxsYWJsZSwg66mU7YOA642w7J207YSwIOygnOqxsFxuICAgICAgOiBuZXZlcjtcbiAgfVtrZXlvZiBUVGFibGVzXVxuPjtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxzRkFBc0YsR0F3V3RGLGdDQUFnQztBQUNoQyxXQVFFIn0=
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { describe, expectTypeOf, it } from "vitest";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// ExtractColumnType 테스트
|
|
4
|
+
// ============================================================================
|
|
5
|
+
describe("ExtractColumnType", ()=>{
|
|
6
|
+
describe("단일 테이블", ()=>{
|
|
7
|
+
it("기본 컬럼 타입을 추출한다", ()=>{
|
|
8
|
+
const result = {};
|
|
9
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
10
|
+
});
|
|
11
|
+
it("nullable 컬럼 타입을 추출한다", ()=>{
|
|
12
|
+
const result = {};
|
|
13
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
14
|
+
});
|
|
15
|
+
it("단일 테이블에서는 테이블명 없이 컬럼명만으로 추출 가능하다", ()=>{
|
|
16
|
+
const result = {};
|
|
17
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe("innerJoin된 테이블", ()=>{
|
|
21
|
+
it("innerJoin 테이블의 컬럼은 non-null이다", ()=>{
|
|
22
|
+
const result = {};
|
|
23
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe("leftJoin된 테이블", ()=>{
|
|
27
|
+
it("leftJoin 테이블의 컬럼은 nullable이다", ()=>{
|
|
28
|
+
const result = {};
|
|
29
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
30
|
+
});
|
|
31
|
+
it("leftJoin 테이블의 원래 nullable 컬럼도 nullable이다", ()=>{
|
|
32
|
+
const result = {};
|
|
33
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe("non-null FK로 leftJoin된 테이블", ()=>{
|
|
37
|
+
it("non-null FK로 leftJoin된 테이블의 컬럼은 non-null이다 (마커 없음)", ()=>{
|
|
38
|
+
const result = {};
|
|
39
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// ParseSelectObject 테스트
|
|
45
|
+
// ============================================================================
|
|
46
|
+
describe("ParseSelectObject", ()=>{
|
|
47
|
+
describe("단일 테이블 (flat select)", ()=>{
|
|
48
|
+
it("기본 필드를 파싱한다", ()=>{
|
|
49
|
+
const result = {};
|
|
50
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
51
|
+
});
|
|
52
|
+
it("nullable 필드를 파싱한다", ()=>{
|
|
53
|
+
const result = {};
|
|
54
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe("innerJoin + flat select", ()=>{
|
|
58
|
+
it("innerJoin 테이블의 필드는 non-null이다", ()=>{
|
|
59
|
+
const result = {};
|
|
60
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe("leftJoin + flat select", ()=>{
|
|
64
|
+
it("leftJoin 테이블의 필드는 nullable이다", ()=>{
|
|
65
|
+
const result = {};
|
|
66
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
// ============================================================================
|
|
70
|
+
// 핵심: 입체적 select 구조
|
|
71
|
+
// ============================================================================
|
|
72
|
+
describe("innerJoin + nested select (입체적 구조)", ()=>{
|
|
73
|
+
it("innerJoin 테이블의 중첩 객체는 non-null이다", ()=>{
|
|
74
|
+
const result = {};
|
|
75
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe("leftJoin + nested select (입체적 구조)", ()=>{
|
|
79
|
+
it("leftJoin 테이블의 중첩 객체는 nullable이다 (필드는 non-null)", ()=>{
|
|
80
|
+
const result = {};
|
|
81
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
82
|
+
});
|
|
83
|
+
it("leftJoin 테이블 내의 원래 nullable 필드도 non-null이다", ()=>{
|
|
84
|
+
const result = {};
|
|
85
|
+
// employee 객체가 null이 아닐 때만 접근하므로, salary의 원래 nullability 유지
|
|
86
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe("non-null FK leftJoin + nested select (입체적 구조)", ()=>{
|
|
90
|
+
it("non-null FK로 leftJoin된 테이블의 중첩 객체는 non-null이다", ()=>{
|
|
91
|
+
const result = {};
|
|
92
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
93
|
+
});
|
|
94
|
+
it("깊은 중첩에서도 non-null FK leftJoin은 non-null이다", ()=>{
|
|
95
|
+
const result = {};
|
|
96
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
describe("복합 케이스", ()=>{
|
|
100
|
+
it("innerJoin + nullable FK leftJoin + non-null FK leftJoin 조합", ()=>{
|
|
101
|
+
const result = {};
|
|
102
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
103
|
+
});
|
|
104
|
+
it("여러 leftJoin 관계", ()=>{
|
|
105
|
+
const result = {};
|
|
106
|
+
expectTypeOf(result).toEqualTypeOf();
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
// ============================================================================
|
|
111
|
+
// AvailableColumns 테스트
|
|
112
|
+
// ============================================================================
|
|
113
|
+
describe("AvailableColumns", ()=>{
|
|
114
|
+
it("단일 테이블에서 사용 가능한 컬럼을 추출한다", ()=>{
|
|
115
|
+
// "users.id" | "users.name" | "users.email" | "users.department_id" | "id" | "name" | "email" | "department_id"
|
|
116
|
+
const valid1 = "users.id";
|
|
117
|
+
const valid2 = "id"; // 단일 테이블이면 테이블명 생략 가능
|
|
118
|
+
expectTypeOf(valid1).toExtend();
|
|
119
|
+
expectTypeOf(valid2).toExtend();
|
|
120
|
+
});
|
|
121
|
+
it("여러 테이블에서 사용 가능한 컬럼을 추출한다", ()=>{
|
|
122
|
+
const valid1 = "users.id";
|
|
123
|
+
const valid2 = "department.name";
|
|
124
|
+
expectTypeOf(valid1).toExtend();
|
|
125
|
+
expectTypeOf(valid2).toExtend();
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnR5cGVzLnRlc3QtZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZXNjcmliZSwgZXhwZWN0VHlwZU9mLCBpdCB9IGZyb20gXCJ2aXRlc3RcIjtcbmltcG9ydCB0eXBlIHtcbiAgQXZhaWxhYmxlQ29sdW1ucyxcbiAgRXh0cmFjdENvbHVtblR5cGUsXG4gIExlZnRKb2luZWRNYXJrZXIsXG4gIFBhcnNlU2VsZWN0T2JqZWN0LFxufSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIO2FjOyKpO2KuOyaqSBNb2NrIOyKpO2CpOuniFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG50eXBlIE1vY2tTY2hlbWEgPSB7XG4gIHVzZXJzOiB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZW1haWw6IHN0cmluZztcbiAgICBkZXBhcnRtZW50X2lkOiBudW1iZXIgfCBudWxsO1xuICB9O1xuICBkZXBhcnRtZW50czoge1xuICAgIGlkOiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGNvbXBhbnlfaWQ6IG51bWJlcjtcbiAgfTtcbiAgY29tcGFuaWVzOiB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gIH07XG4gIGVtcGxveWVlczoge1xuICAgIGlkOiBudW1iZXI7XG4gICAgZW1wbG95ZWVfbnVtYmVyOiBzdHJpbmc7XG4gICAgc2FsYXJ5OiBzdHJpbmcgfCBudWxsOyAvLyBudWxsYWJsZSDtlYTrk5xcbiAgICB1c2VyX2lkOiBudW1iZXI7XG4gICAgZGVwYXJ0bWVudF9pZDogbnVtYmVyIHwgbnVsbDtcbiAgfTtcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEV4dHJhY3RDb2x1bW5UeXBlIO2FjOyKpO2KuFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5kZXNjcmliZShcIkV4dHJhY3RDb2x1bW5UeXBlXCIsICgpID0+IHtcbiAgZGVzY3JpYmUoXCLri6jsnbwg7YWM7J2067iUXCIsICgpID0+IHtcbiAgICBpdChcIuq4sOuzuCDsu6zrn7wg7YOA7J6F7J2EIOy2lOy2nO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHsgdXNlcnM6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXSB9O1xuICAgICAgdHlwZSBSZXN1bHQgPSBFeHRyYWN0Q29sdW1uVHlwZTxUYWJsZXMsIFwidXNlcnMuaWRcIj47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8bnVtYmVyPigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJudWxsYWJsZSDsu6zrn7wg7YOA7J6F7J2EIOy2lOy2nO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHsgdXNlcnM6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXSB9O1xuICAgICAgdHlwZSBSZXN1bHQgPSBFeHRyYWN0Q29sdW1uVHlwZTxUYWJsZXMsIFwidXNlcnMuZGVwYXJ0bWVudF9pZFwiPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjxudW1iZXIgfCBudWxsPigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCLri6jsnbwg7YWM7J2067iU7JeQ7ISc64qUIO2FjOydtOu4lOuqhSDsl4bsnbQg7Lus65+866qF66eM7Jy866GcIOy2lOy2nCDqsIDriqXtlZjri6RcIiwgKCkgPT4ge1xuICAgICAgdHlwZSBUYWJsZXMgPSB7IHVzZXJzOiBNb2NrU2NoZW1hW1widXNlcnNcIl0gfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gRXh0cmFjdENvbHVtblR5cGU8VGFibGVzLCBcImlkXCI+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPG51bWJlcj4oKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJpbm5lckpvaW7rkJwg7YWM7J2067iUXCIsICgpID0+IHtcbiAgICBpdChcImlubmVySm9pbiDthYzsnbTruJTsnZgg7Lus65+87J2AIG5vbi1udWxs7J2064ukXCIsICgpID0+IHtcbiAgICAgIHR5cGUgVGFibGVzID0ge1xuICAgICAgICB1c2VyczogTW9ja1NjaGVtYVtcInVzZXJzXCJdO1xuICAgICAgICBkZXBhcnRtZW50OiBNb2NrU2NoZW1hW1wiZGVwYXJ0bWVudHNcIl07IC8vIGlubmVySm9pblxuICAgICAgfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gRXh0cmFjdENvbHVtblR5cGU8VGFibGVzLCBcImRlcGFydG1lbnQuaWRcIj47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8bnVtYmVyPigpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcImxlZnRKb2lu65CcIO2FjOydtOu4lFwiLCAoKSA9PiB7XG4gICAgaXQoXCJsZWZ0Sm9pbiDthYzsnbTruJTsnZgg7Lus65+87J2AIG51bGxhYmxl7J2064ukXCIsICgpID0+IHtcbiAgICAgIHR5cGUgVGFibGVzID0ge1xuICAgICAgICB1c2VyczogTW9ja1NjaGVtYVtcInVzZXJzXCJdO1xuICAgICAgICBkZXBhcnRtZW50OiBNb2NrU2NoZW1hW1wiZGVwYXJ0bWVudHNcIl0gJiBMZWZ0Sm9pbmVkTWFya2VyOyAvLyBsZWZ0Sm9pblxuICAgICAgfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gRXh0cmFjdENvbHVtblR5cGU8VGFibGVzLCBcImRlcGFydG1lbnQuaWRcIj47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8bnVtYmVyIHwgbnVsbD4oKTtcbiAgICB9KTtcblxuICAgIGl0KFwibGVmdEpvaW4g7YWM7J2067iU7J2YIOybkOuemCBudWxsYWJsZSDsu6zrn7zrj4QgbnVsbGFibGXsnbTri6RcIiwgKCkgPT4ge1xuICAgICAgdHlwZSBUYWJsZXMgPSB7XG4gICAgICAgIHVzZXJzOiBNb2NrU2NoZW1hW1widXNlcnNcIl07XG4gICAgICAgIGVtcGxveWVlOiBNb2NrU2NoZW1hW1wiZW1wbG95ZWVzXCJdICYgTGVmdEpvaW5lZE1hcmtlcjsgLy8gbGVmdEpvaW5cbiAgICAgIH07XG4gICAgICB0eXBlIFJlc3VsdCA9IEV4dHJhY3RDb2x1bW5UeXBlPFRhYmxlcywgXCJlbXBsb3llZS5zYWxhcnlcIj47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8c3RyaW5nIHwgbnVsbD4oKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJub24tbnVsbCBGS+uhnCBsZWZ0Sm9pbuuQnCDthYzsnbTruJRcIiwgKCkgPT4ge1xuICAgIGl0KFwibm9uLW51bGwgRkvroZwgbGVmdEpvaW7rkJwg7YWM7J2067iU7J2YIOy7rOufvOydgCBub24tbnVsbOydtOuLpCAo66eI7LukIOyXhuydjClcIiwgKCkgPT4ge1xuICAgICAgdHlwZSBUYWJsZXMgPSB7XG4gICAgICAgIHVzZXJzOiBNb2NrU2NoZW1hW1widXNlcnNcIl07XG4gICAgICAgIGRlcGFydG1lbnQ6IE1vY2tTY2hlbWFbXCJkZXBhcnRtZW50c1wiXSAmIExlZnRKb2luZWRNYXJrZXI7IC8vIG51bGxhYmxlIEZLXG4gICAgICAgIGNvbXBhbnk6IE1vY2tTY2hlbWFbXCJjb21wYW5pZXNcIl0gJiBMZWZ0Sm9pbmVkTWFya2VyOyAvLyBub24tbnVsbCBGSyDihpIg66eI7LukIOyXhuydjFxuICAgICAgfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gRXh0cmFjdENvbHVtblR5cGU8VGFibGVzLCBcImNvbXBhbnkuaWRcIj47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8bnVtYmVyPigpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYXJzZVNlbGVjdE9iamVjdCDthYzsiqTtirhcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZGVzY3JpYmUoXCJQYXJzZVNlbGVjdE9iamVjdFwiLCAoKSA9PiB7XG4gIGRlc2NyaWJlKFwi64uo7J28IO2FjOydtOu4lCAoZmxhdCBzZWxlY3QpXCIsICgpID0+IHtcbiAgICBpdChcIuq4sOuzuCDtlYTrk5zrpbwg7YyM7Iux7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIHR5cGUgVGFibGVzID0geyB1c2VyczogTW9ja1NjaGVtYVtcInVzZXJzXCJdIH07XG4gICAgICB0eXBlIFNlbGVjdCA9IHtcbiAgICAgICAgaWQ6IFwidXNlcnMuaWRcIjtcbiAgICAgICAgbmFtZTogXCJ1c2Vycy5uYW1lXCI7XG4gICAgICB9O1xuICAgICAgdHlwZSBSZXN1bHQgPSBQYXJzZVNlbGVjdE9iamVjdDxUYWJsZXMsIFNlbGVjdD47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICB9PigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJudWxsYWJsZSDtlYTrk5zrpbwg7YyM7Iux7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIHR5cGUgVGFibGVzID0geyB1c2VyczogTW9ja1NjaGVtYVtcInVzZXJzXCJdIH07XG4gICAgICB0eXBlIFNlbGVjdCA9IHtcbiAgICAgICAgaWQ6IFwidXNlcnMuaWRcIjtcbiAgICAgICAgZGVwYXJ0bWVudF9pZDogXCJ1c2Vycy5kZXBhcnRtZW50X2lkXCI7XG4gICAgICB9O1xuICAgICAgdHlwZSBSZXN1bHQgPSBQYXJzZVNlbGVjdE9iamVjdDxUYWJsZXMsIFNlbGVjdD47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBkZXBhcnRtZW50X2lkOiBudW1iZXIgfCBudWxsO1xuICAgICAgfT4oKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJpbm5lckpvaW4gKyBmbGF0IHNlbGVjdFwiLCAoKSA9PiB7XG4gICAgaXQoXCJpbm5lckpvaW4g7YWM7J2067iU7J2YIO2VhOuTnOuKlCBub24tbnVsbOydtOuLpFwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHtcbiAgICAgICAgdXNlcnM6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXTtcbiAgICAgICAgZGVwYXJ0bWVudDogTW9ja1NjaGVtYVtcImRlcGFydG1lbnRzXCJdOyAvLyBpbm5lckpvaW5cbiAgICAgIH07XG4gICAgICB0eXBlIFNlbGVjdCA9IHtcbiAgICAgICAgaWQ6IFwidXNlcnMuaWRcIjtcbiAgICAgICAgZGVwdF9pZDogXCJkZXBhcnRtZW50LmlkXCI7XG4gICAgICAgIGRlcHRfbmFtZTogXCJkZXBhcnRtZW50Lm5hbWVcIjtcbiAgICAgIH07XG4gICAgICB0eXBlIFJlc3VsdCA9IFBhcnNlU2VsZWN0T2JqZWN0PFRhYmxlcywgU2VsZWN0PjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIGRlcHRfaWQ6IG51bWJlcjtcbiAgICAgICAgZGVwdF9uYW1lOiBzdHJpbmc7XG4gICAgICB9PigpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcImxlZnRKb2luICsgZmxhdCBzZWxlY3RcIiwgKCkgPT4ge1xuICAgIGl0KFwibGVmdEpvaW4g7YWM7J2067iU7J2YIO2VhOuTnOuKlCBudWxsYWJsZeydtOuLpFwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHtcbiAgICAgICAgdXNlcnM6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXTtcbiAgICAgICAgZGVwYXJ0bWVudDogTW9ja1NjaGVtYVtcImRlcGFydG1lbnRzXCJdICYgTGVmdEpvaW5lZE1hcmtlcjsgLy8gbGVmdEpvaW5cbiAgICAgIH07XG4gICAgICB0eXBlIFNlbGVjdCA9IHtcbiAgICAgICAgaWQ6IFwidXNlcnMuaWRcIjtcbiAgICAgICAgZGVwdF9pZDogXCJkZXBhcnRtZW50LmlkXCI7XG4gICAgICAgIGRlcHRfbmFtZTogXCJkZXBhcnRtZW50Lm5hbWVcIjtcbiAgICAgIH07XG4gICAgICB0eXBlIFJlc3VsdCA9IFBhcnNlU2VsZWN0T2JqZWN0PFRhYmxlcywgU2VsZWN0PjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIGRlcHRfaWQ6IG51bWJlciB8IG51bGw7XG4gICAgICAgIGRlcHRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAgIH0+KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8g7ZW17IusOiDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZGVzY3JpYmUoXCJpbm5lckpvaW4gKyBuZXN0ZWQgc2VsZWN0ICjsnoXssrTsoIEg6rWs7KGwKVwiLCAoKSA9PiB7XG4gICAgaXQoXCJpbm5lckpvaW4g7YWM7J2067iU7J2YIOykkeyyqSDqsJ3ssrTripQgbm9uLW51bGzsnbTri6RcIiwgKCkgPT4ge1xuICAgICAgdHlwZSBUYWJsZXMgPSB7XG4gICAgICAgIHVzZXJzOiBNb2NrU2NoZW1hW1widXNlcnNcIl07XG4gICAgICAgIGRlcGFydG1lbnQ6IE1vY2tTY2hlbWFbXCJkZXBhcnRtZW50c1wiXTsgLy8gaW5uZXJKb2luXG4gICAgICB9O1xuICAgICAgdHlwZSBTZWxlY3QgPSB7XG4gICAgICAgIGlkOiBcInVzZXJzLmlkXCI7XG4gICAgICAgIGRlcGFydG1lbnQ6IHtcbiAgICAgICAgICBpZDogXCJkZXBhcnRtZW50LmlkXCI7XG4gICAgICAgICAgbmFtZTogXCJkZXBhcnRtZW50Lm5hbWVcIjtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICB0eXBlIFJlc3VsdCA9IFBhcnNlU2VsZWN0T2JqZWN0PFRhYmxlcywgU2VsZWN0PjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIGRlcGFydG1lbnQ6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwibGVmdEpvaW4gKyBuZXN0ZWQgc2VsZWN0ICjsnoXssrTsoIEg6rWs7KGwKVwiLCAoKSA9PiB7XG4gICAgaXQoXCJsZWZ0Sm9pbiDthYzsnbTruJTsnZgg7KSR7LKpIOqwneyytOuKlCBudWxsYWJsZeydtOuLpCAo7ZWE65Oc64qUIG5vbi1udWxsKVwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHtcbiAgICAgICAgdXNlcnM6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXTtcbiAgICAgICAgZGVwYXJ0bWVudDogTW9ja1NjaGVtYVtcImRlcGFydG1lbnRzXCJdICYgTGVmdEpvaW5lZE1hcmtlcjsgLy8gbGVmdEpvaW5cbiAgICAgIH07XG4gICAgICB0eXBlIFNlbGVjdCA9IHtcbiAgICAgICAgaWQ6IFwidXNlcnMuaWRcIjtcbiAgICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICAgIGlkOiBcImRlcGFydG1lbnQuaWRcIjtcbiAgICAgICAgICBuYW1lOiBcImRlcGFydG1lbnQubmFtZVwiO1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gUGFyc2VTZWxlY3RPYmplY3Q8VGFibGVzLCBTZWxlY3Q+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICB9IHwgbnVsbDsgLy8g6rCd7LK0IOuLqOychOuhnCBudWxsYWJsZVxuICAgICAgfT4oKTtcbiAgICB9KTtcblxuICAgIGl0KFwibGVmdEpvaW4g7YWM7J2067iUIOuCtOydmCDsm5DrnpggbnVsbGFibGUg7ZWE65Oc64+EIG5vbi1udWxs7J2064ukXCIsICgpID0+IHtcbiAgICAgIHR5cGUgVGFibGVzID0ge1xuICAgICAgICB1c2VyczogTW9ja1NjaGVtYVtcInVzZXJzXCJdO1xuICAgICAgICBlbXBsb3llZTogTW9ja1NjaGVtYVtcImVtcGxveWVlc1wiXSAmIExlZnRKb2luZWRNYXJrZXI7IC8vIGxlZnRKb2luXG4gICAgICB9O1xuICAgICAgdHlwZSBTZWxlY3QgPSB7XG4gICAgICAgIGlkOiBcInVzZXJzLmlkXCI7XG4gICAgICAgIGVtcGxveWVlOiB7XG4gICAgICAgICAgaWQ6IFwiZW1wbG95ZWUuaWRcIjtcbiAgICAgICAgICBzYWxhcnk6IFwiZW1wbG95ZWUuc2FsYXJ5XCI7IC8vIOyKpO2CpOuniOyDgSBudWxsYWJsZeydtOyngOunjC4uLlxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gUGFyc2VTZWxlY3RPYmplY3Q8VGFibGVzLCBTZWxlY3Q+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICAvLyBlbXBsb3llZSDqsJ3ssrTqsIAgbnVsbOydtCDslYTri5Ag65WM66eMIOygkeq3vO2VmOuvgOuhnCwgc2FsYXJ57J2YIOybkOuemCBudWxsYWJpbGl0eSDsnKDsp4BcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBlbXBsb3llZToge1xuICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgc2FsYXJ5OiBzdHJpbmcgfCBudWxsOyAvLyDsiqTtgqTrp4jsnZgg7JuQ656YIG51bGxhYmlsaXR5IOycoOyngFxuICAgICAgICB9IHwgbnVsbDtcbiAgICAgIH0+KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwibm9uLW51bGwgRksgbGVmdEpvaW4gKyBuZXN0ZWQgc2VsZWN0ICjsnoXssrTsoIEg6rWs7KGwKVwiLCAoKSA9PiB7XG4gICAgaXQoXCJub24tbnVsbCBGS+uhnCBsZWZ0Sm9pbuuQnCDthYzsnbTruJTsnZgg7KSR7LKpIOqwneyytOuKlCBub24tbnVsbOydtOuLpFwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHtcbiAgICAgICAgdXNlcnM6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXTtcbiAgICAgICAgZGVwYXJ0bWVudDogTW9ja1NjaGVtYVtcImRlcGFydG1lbnRzXCJdICYgTGVmdEpvaW5lZE1hcmtlcjsgLy8gbnVsbGFibGUgRksg4oaSIOuniOy7pCDsnojsnYxcbiAgICAgICAgZGVwYXJ0bWVudF9fY29tcGFueTogTW9ja1NjaGVtYVtcImNvbXBhbmllc1wiXTsgLy8gbm9uLW51bGwgRksg4oaSIOuniOy7pCDsl4bsnYxcbiAgICAgIH07XG4gICAgICB0eXBlIFNlbGVjdCA9IHtcbiAgICAgICAgaWQ6IFwidXNlcnMuaWRcIjtcbiAgICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICAgIGlkOiBcImRlcGFydG1lbnQuaWRcIjtcbiAgICAgICAgICBuYW1lOiBcImRlcGFydG1lbnQubmFtZVwiO1xuICAgICAgICAgIGNvbXBhbnk6IHtcbiAgICAgICAgICAgIG5hbWU6IFwiZGVwYXJ0bWVudF9fY29tcGFueS5uYW1lXCI7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgICB0eXBlIFJlc3VsdCA9IFBhcnNlU2VsZWN0T2JqZWN0PFRhYmxlcywgU2VsZWN0PjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIGRlcGFydG1lbnQ6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICBjb21wYW55OiB7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgfTsgLy8gbm9uLW51bGwhIChub24tbnVsbCBGS+uhnCDsobDsnbjrkJjslrQg66eI7LukIOyXhuydjClcbiAgICAgICAgfSB8IG51bGw7XG4gICAgICB9PigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCLquYrsnYAg7KSR7LKp7JeQ7ISc64+EIG5vbi1udWxsIEZLIGxlZnRKb2lu7J2AIG5vbi1udWxs7J2064ukXCIsICgpID0+IHtcbiAgICAgIHR5cGUgVGFibGVzID0ge1xuICAgICAgICBlbXBsb3llZXM6IE1vY2tTY2hlbWFbXCJlbXBsb3llZXNcIl07XG4gICAgICAgIHVzZXI6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXTsgLy8gaW5uZXJKb2luIOKGkiDrp4jsu6Qg7JeG7J2MXG4gICAgICAgIHVzZXJfX2VtcGxveWVlOiBNb2NrU2NoZW1hW1wiZW1wbG95ZWVzXCJdICYgTGVmdEpvaW5lZE1hcmtlcjsgLy8gbnVsbGFibGUgRktcbiAgICAgICAgdXNlcl9fZW1wbG95ZWVfX2RlcGFydG1lbnQ6IE1vY2tTY2hlbWFbXCJkZXBhcnRtZW50c1wiXTsgLy8gbm9uLW51bGwgRksg4oaSIOuniOy7pCDsl4bsnYxcbiAgICAgIH07XG4gICAgICB0eXBlIFNlbGVjdCA9IHtcbiAgICAgICAgaWQ6IFwiZW1wbG95ZWVzLmlkXCI7XG4gICAgICAgIHVzZXI6IHtcbiAgICAgICAgICBpZDogXCJ1c2VyLmlkXCI7XG4gICAgICAgICAgZW1wbG95ZWU6IHtcbiAgICAgICAgICAgIGlkOiBcInVzZXJfX2VtcGxveWVlLmlkXCI7XG4gICAgICAgICAgICBkZXBhcnRtZW50OiB7XG4gICAgICAgICAgICAgIGlkOiBcInVzZXJfX2VtcGxveWVlX19kZXBhcnRtZW50LmlkXCI7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9O1xuICAgICAgdHlwZSBSZXN1bHQgPSBQYXJzZVNlbGVjdE9iamVjdDxUYWJsZXMsIFNlbGVjdD47XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgLy8gdXNlcuuKlCBpbm5lckpvaW7snbTrr4DroZwg66y07KGw6rG0IOyhtOyerO2VqeuLiOuLpC5cbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIGVtcGxveWVlOiB7XG4gICAgICAgICAgICAvLyB1c2Vy7J2YIGVtcGxveWVl64qUIG51bGxhYmxlIEZLIGxlZnRKb2lu7J2066+A66GcIG51bGzsnbwg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgICBkZXBhcnRtZW50OiB7XG4gICAgICAgICAgICAgIC8vIGVtcGxveWVl6rCAIOyhtOyerO2VnOuLpOuptCBkZXBhcnRtZW5064qUIG5vbi1udWxsIEZLIGxlZnRKb2lu7J2066+A66GcIOustOyhsOqxtCDsobTsnqztlanri4jri6QuXG4gICAgICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgICB9OyAvLyBub24tbnVsbCBGSyDihpIgbm9uLW51bGxcbiAgICAgICAgICB9IHwgbnVsbDsgLy8gbnVsbGFibGUgRksgbGVmdEpvaW4g4oaSIG51bGxhYmxlXG4gICAgICAgIH07IC8vIGlubmVySm9pbiDihpIgbm9uLW51bGxcbiAgICAgIH0+KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwi67O17ZWpIOy8gOydtOyKpFwiLCAoKSA9PiB7XG4gICAgaXQoXCJpbm5lckpvaW4gKyBudWxsYWJsZSBGSyBsZWZ0Sm9pbiArIG5vbi1udWxsIEZLIGxlZnRKb2luIOyhsO2VqVwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHtcbiAgICAgICAgZW1wbG95ZWVzOiBNb2NrU2NoZW1hW1wiZW1wbG95ZWVzXCJdO1xuICAgICAgICB1c2VyOiBNb2NrU2NoZW1hW1widXNlcnNcIl07IC8vIGlubmVySm9pbiAobm9uLW51bGwgRkspXG4gICAgICAgIGRlcGFydG1lbnQ6IE1vY2tTY2hlbWFbXCJkZXBhcnRtZW50c1wiXSAmIExlZnRKb2luZWRNYXJrZXI7IC8vIG51bGxhYmxlIEZLIGxlZnRKb2luXG4gICAgICAgIGRlcGFydG1lbnRfX2NvbXBhbnk6IE1vY2tTY2hlbWFbXCJjb21wYW5pZXNcIl07IC8vIG5vbi1udWxsIEZLIGxlZnRKb2luIOKGkiDrp4jsu6Qg7JeG7J2MXG4gICAgICB9O1xuICAgICAgdHlwZSBTZWxlY3QgPSB7XG4gICAgICAgIGlkOiBcImVtcGxveWVlcy5pZFwiO1xuICAgICAgICBlbXBsb3llZV9udW1iZXI6IFwiZW1wbG95ZWVzLmVtcGxveWVlX251bWJlclwiO1xuICAgICAgICBzYWxhcnk6IFwiZW1wbG95ZWVzLnNhbGFyeVwiO1xuICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgaWQ6IFwidXNlci5pZFwiO1xuICAgICAgICAgIHVzZXJuYW1lOiBcInVzZXIubmFtZVwiO1xuICAgICAgICB9O1xuICAgICAgICBkZXBhcnRtZW50OiB7XG4gICAgICAgICAgaWQ6IFwiZGVwYXJ0bWVudC5pZFwiO1xuICAgICAgICAgIG5hbWU6IFwiZGVwYXJ0bWVudC5uYW1lXCI7XG4gICAgICAgICAgY29tcGFueToge1xuICAgICAgICAgICAgbmFtZTogXCJkZXBhcnRtZW50X19jb21wYW55Lm5hbWVcIjtcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gUGFyc2VTZWxlY3RPYmplY3Q8VGFibGVzLCBTZWxlY3Q+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgZW1wbG95ZWVfbnVtYmVyOiBzdHJpbmc7XG4gICAgICAgIHNhbGFyeTogc3RyaW5nIHwgbnVsbDsgLy8g7Iqk7YKk66eI7IOBIG51bGxhYmxlXG4gICAgICAgIHVzZXI6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgICAgIH07IC8vIGlubmVySm9pbiDihpIgbm9uLW51bGxcbiAgICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgIGNvbXBhbnk6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICB9OyAvLyBub24tbnVsbCBGSyDihpIgbm9uLW51bGxcbiAgICAgICAgfSB8IG51bGw7IC8vIG51bGxhYmxlIEZLIGxlZnRKb2luIOKGkiBudWxsYWJsZVxuICAgICAgfT4oKTtcbiAgICB9KTtcblxuICAgIGl0KFwi7Jes65+sIGxlZnRKb2luIOq0gOqzhFwiLCAoKSA9PiB7XG4gICAgICB0eXBlIFRhYmxlcyA9IHtcbiAgICAgICAgZW1wbG95ZWVzOiBNb2NrU2NoZW1hW1wiZW1wbG95ZWVzXCJdO1xuICAgICAgICBkZXBhcnRtZW50OiBNb2NrU2NoZW1hW1wiZGVwYXJ0bWVudHNcIl0gJiBMZWZ0Sm9pbmVkTWFya2VyO1xuICAgICAgICBtYW5hZ2VyOiBNb2NrU2NoZW1hW1widXNlcnNcIl0gJiBMZWZ0Sm9pbmVkTWFya2VyO1xuICAgICAgfTtcbiAgICAgIHR5cGUgU2VsZWN0ID0ge1xuICAgICAgICBpZDogXCJlbXBsb3llZXMuaWRcIjtcbiAgICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICAgIG5hbWU6IFwiZGVwYXJ0bWVudC5uYW1lXCI7XG4gICAgICAgIH07XG4gICAgICAgIG1hbmFnZXI6IHtcbiAgICAgICAgICBuYW1lOiBcIm1hbmFnZXIubmFtZVwiO1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIHR5cGUgUmVzdWx0ID0gUGFyc2VTZWxlY3RPYmplY3Q8VGFibGVzLCBTZWxlY3Q+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgZGVwYXJ0bWVudDogeyBuYW1lOiBzdHJpbmcgfSB8IG51bGw7XG4gICAgICAgIG1hbmFnZXI6IHsgbmFtZTogc3RyaW5nIH0gfCBudWxsO1xuICAgICAgfT4oKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQXZhaWxhYmxlQ29sdW1ucyDthYzsiqTtirhcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZGVzY3JpYmUoXCJBdmFpbGFibGVDb2x1bW5zXCIsICgpID0+IHtcbiAgaXQoXCLri6jsnbwg7YWM7J2067iU7JeQ7IScIOyCrOyaqSDqsIDriqXtlZwg7Lus65+87J2EIOy2lOy2nO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBUYWJsZXMgPSB7IHVzZXJzOiBNb2NrU2NoZW1hW1widXNlcnNcIl0gfTtcbiAgICB0eXBlIFJlc3VsdCA9IEF2YWlsYWJsZUNvbHVtbnM8VGFibGVzPjtcblxuICAgIC8vIFwidXNlcnMuaWRcIiB8IFwidXNlcnMubmFtZVwiIHwgXCJ1c2Vycy5lbWFpbFwiIHwgXCJ1c2Vycy5kZXBhcnRtZW50X2lkXCIgfCBcImlkXCIgfCBcIm5hbWVcIiB8IFwiZW1haWxcIiB8IFwiZGVwYXJ0bWVudF9pZFwiXG4gICAgY29uc3QgdmFsaWQxOiBSZXN1bHQgPSBcInVzZXJzLmlkXCI7XG4gICAgY29uc3QgdmFsaWQyOiBSZXN1bHQgPSBcImlkXCI7IC8vIOuLqOydvCDthYzsnbTruJTsnbTrqbQg7YWM7J2067iU66qFIOyDneuetSDqsIDriqVcblxuICAgIGV4cGVjdFR5cGVPZih2YWxpZDEpLnRvRXh0ZW5kPFJlc3VsdD4oKTtcbiAgICBleHBlY3RUeXBlT2YodmFsaWQyKS50b0V4dGVuZDxSZXN1bHQ+KCk7XG4gIH0pO1xuXG4gIGl0KFwi7Jes65+sIO2FjOydtOu4lOyXkOyEnCDsgqzsmqkg6rCA64ql7ZWcIOy7rOufvOydhCDstpTstpztlZzri6RcIiwgKCkgPT4ge1xuICAgIHR5cGUgVGFibGVzID0ge1xuICAgICAgdXNlcnM6IE1vY2tTY2hlbWFbXCJ1c2Vyc1wiXTtcbiAgICAgIGRlcGFydG1lbnQ6IE1vY2tTY2hlbWFbXCJkZXBhcnRtZW50c1wiXTtcbiAgICB9O1xuICAgIHR5cGUgUmVzdWx0ID0gQXZhaWxhYmxlQ29sdW1uczxUYWJsZXM+O1xuXG4gICAgY29uc3QgdmFsaWQxOiBSZXN1bHQgPSBcInVzZXJzLmlkXCI7XG4gICAgY29uc3QgdmFsaWQyOiBSZXN1bHQgPSBcImRlcGFydG1lbnQubmFtZVwiO1xuXG4gICAgZXhwZWN0VHlwZU9mKHZhbGlkMSkudG9FeHRlbmQ8UmVzdWx0PigpO1xuICAgIGV4cGVjdFR5cGVPZih2YWxpZDIpLnRvRXh0ZW5kPFJlc3VsdD4oKTtcbiAgfSk7XG59KTtcbiJdLCJuYW1lcyI6WyJkZXNjcmliZSIsImV4cGVjdFR5cGVPZiIsIml0IiwicmVzdWx0IiwidG9FcXVhbFR5cGVPZiIsInZhbGlkMSIsInZhbGlkMiIsInRvRXh0ZW5kIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLEVBQUVDLFlBQVksRUFBRUMsRUFBRSxRQUFRLFNBQVM7QUFxQ3BELCtFQUErRTtBQUMvRSx3QkFBd0I7QUFDeEIsK0VBQStFO0FBRS9FRixTQUFTLHFCQUFxQjtJQUM1QkEsU0FBUyxVQUFVO1FBQ2pCRSxHQUFHLGtCQUFrQjtZQUluQixNQUFNQyxTQUFTLENBQUM7WUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7UUFDcEM7UUFFQUYsR0FBRyx3QkFBd0I7WUFJekIsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO1FBQ3BDO1FBRUFGLEdBQUcsb0NBQW9DO1lBSXJDLE1BQU1DLFNBQVMsQ0FBQztZQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtRQUNwQztJQUNGO0lBRUFKLFNBQVMsa0JBQWtCO1FBQ3pCRSxHQUFHLGlDQUFpQztZQU9sQyxNQUFNQyxTQUFTLENBQUM7WUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7UUFDcEM7SUFDRjtJQUVBSixTQUFTLGlCQUFpQjtRQUN4QkUsR0FBRyxnQ0FBZ0M7WUFPakMsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO1FBQ3BDO1FBRUFGLEdBQUcsNENBQTRDO1lBTzdDLE1BQU1DLFNBQVMsQ0FBQztZQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtRQUNwQztJQUNGO0lBRUFKLFNBQVMsOEJBQThCO1FBQ3JDRSxHQUFHLHNEQUFzRDtZQVF2RCxNQUFNQyxTQUFTLENBQUM7WUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7UUFDcEM7SUFDRjtBQUNGO0FBRUEsK0VBQStFO0FBQy9FLHdCQUF3QjtBQUN4QiwrRUFBK0U7QUFFL0VKLFNBQVMscUJBQXFCO0lBQzVCQSxTQUFTLHdCQUF3QjtRQUMvQkUsR0FBRyxlQUFlO1lBUWhCLE1BQU1DLFNBQVMsQ0FBQztZQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtRQUlwQztRQUVBRixHQUFHLHFCQUFxQjtZQVF0QixNQUFNQyxTQUFTLENBQUM7WUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7UUFJcEM7SUFDRjtJQUVBSixTQUFTLDJCQUEyQjtRQUNsQ0UsR0FBRyxpQ0FBaUM7WUFZbEMsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO1FBS3BDO0lBQ0Y7SUFFQUosU0FBUywwQkFBMEI7UUFDakNFLEdBQUcsZ0NBQWdDO1lBWWpDLE1BQU1DLFNBQVMsQ0FBQztZQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtRQUtwQztJQUNGO0lBRUEsK0VBQStFO0lBQy9FLG9CQUFvQjtJQUNwQiwrRUFBK0U7SUFFL0VKLFNBQVMsc0NBQXNDO1FBQzdDRSxHQUFHLG9DQUFvQztZQWNyQyxNQUFNQyxTQUFTLENBQUM7WUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7UUFPcEM7SUFDRjtJQUVBSixTQUFTLHFDQUFxQztRQUM1Q0UsR0FBRyxrREFBa0Q7WUFjbkQsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO1FBT3BDO1FBRUFGLEdBQUcsOENBQThDO1lBYy9DLE1BQU1DLFNBQVMsQ0FBQztZQUNoQiw0REFBNEQ7WUFDNURGLGFBQWFFLFFBQVFDLGFBQWE7UUFPcEM7SUFDRjtJQUVBSixTQUFTLGlEQUFpRDtRQUN4REUsR0FBRyxpREFBaUQ7WUFrQmxELE1BQU1DLFNBQVMsQ0FBQztZQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtRQVVwQztRQUVBRixHQUFHLDZDQUE2QztZQXFCOUMsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO1FBZXBDO0lBQ0Y7SUFFQUosU0FBUyxVQUFVO1FBQ2pCRSxHQUFHLDhEQUE4RDtZQXlCL0QsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO1FBZ0JwQztRQUVBRixHQUFHLGtCQUFrQjtZQWlCbkIsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO1FBS3BDO0lBQ0Y7QUFDRjtBQUVBLCtFQUErRTtBQUMvRSx1QkFBdUI7QUFDdkIsK0VBQStFO0FBRS9FSixTQUFTLG9CQUFvQjtJQUMzQkUsR0FBRyw0QkFBNEI7UUFJN0IsZ0hBQWdIO1FBQ2hILE1BQU1HLFNBQWlCO1FBQ3ZCLE1BQU1DLFNBQWlCLE1BQU0sc0JBQXNCO1FBRW5ETCxhQUFhSSxRQUFRRSxRQUFRO1FBQzdCTixhQUFhSyxRQUFRQyxRQUFRO0lBQy9CO0lBRUFMLEdBQUcsNEJBQTRCO1FBTzdCLE1BQU1HLFNBQWlCO1FBQ3ZCLE1BQU1DLFNBQWlCO1FBRXZCTCxhQUFhSSxRQUFRRSxRQUFRO1FBQzdCTixhQUFhSyxRQUFRQyxRQUFRO0lBQy9CO0FBQ0YifQ==
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import type { Knex } from "knex";
|
|
2
|
+
import type { DatabaseForeignKeys, DatabaseSchemaExtend, EntityIndex } from "../types/types";
|
|
3
|
+
import type { ForeignKeyColumns, TableName } from "./puri.types";
|
|
4
|
+
/**
|
|
5
|
+
* FK 타입 추론을 위해 DatabaseForeignKeys export
|
|
6
|
+
* (module augmentation 자동 로드 보장)
|
|
7
|
+
*/
|
|
8
|
+
export type { DatabaseForeignKeys };
|
|
2
9
|
type TableData = {
|
|
3
10
|
references: Set<string>;
|
|
4
11
|
rows: Record<string, unknown>[];
|
|
5
|
-
uniqueIndexes:
|
|
6
|
-
name?: string;
|
|
7
|
-
columns: string[];
|
|
8
|
-
}[];
|
|
12
|
+
uniqueIndexes: EntityIndex[];
|
|
9
13
|
uniquesMap: Map<string, string>;
|
|
10
14
|
};
|
|
11
15
|
export type UBRef = {
|
|
@@ -13,9 +17,12 @@ export type UBRef = {
|
|
|
13
17
|
of: string;
|
|
14
18
|
use?: string;
|
|
15
19
|
};
|
|
16
|
-
type UpsertOptions = {
|
|
20
|
+
export type UpsertOptions<TTable extends TableName<DatabaseSchemaExtend>> = {
|
|
21
|
+
chunkSize?: number;
|
|
22
|
+
cleanOrphans?: ForeignKeyColumns<TTable> | ForeignKeyColumns<TTable>[];
|
|
23
|
+
};
|
|
24
|
+
export type InsertOnlyOptions = {
|
|
17
25
|
chunkSize?: number;
|
|
18
|
-
cleanOrphans?: string | string[];
|
|
19
26
|
};
|
|
20
27
|
export declare function isRefField(field: unknown): field is UBRef;
|
|
21
28
|
export declare class UpsertBuilder {
|
|
@@ -26,9 +33,9 @@ export declare class UpsertBuilder {
|
|
|
26
33
|
register<T extends string>(tableName: string, row: {
|
|
27
34
|
[key in T]?: UBRef | string | number | boolean | bigint | null | object | unknown;
|
|
28
35
|
}): UBRef;
|
|
29
|
-
upsert(wdb: Knex, tableName:
|
|
30
|
-
insertOnly(wdb: Knex, tableName:
|
|
31
|
-
upsertOrInsert(wdb: Knex, tableName:
|
|
36
|
+
upsert<TTable extends TableName<DatabaseSchemaExtend>>(wdb: Knex, tableName: TTable, options?: UpsertOptions<TTable>): Promise<number[]>;
|
|
37
|
+
insertOnly<TTable extends TableName<DatabaseSchemaExtend>>(wdb: Knex, tableName: TTable, options?: InsertOnlyOptions): Promise<number[]>;
|
|
38
|
+
upsertOrInsert<TTable extends TableName<DatabaseSchemaExtend>>(wdb: Knex, tableName: TTable, mode: "upsert" | "insert", options?: UpsertOptions<TTable>): Promise<number[]>;
|
|
32
39
|
updateBatch(wdb: Knex, tableName: string, options?: {
|
|
33
40
|
chunkSize?: number;
|
|
34
41
|
where?: string | string[];
|
|
@@ -40,5 +47,4 @@ export declare class UpsertBuilder {
|
|
|
40
47
|
*/
|
|
41
48
|
private buildInsertLevels;
|
|
42
49
|
}
|
|
43
|
-
export {};
|
|
44
50
|
//# sourceMappingURL=upsert-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upsert-builder.d.ts","sourceRoot":"","sources":["../../src/database/upsert-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"upsert-builder.d.ts","sourceRoot":"","sources":["../../src/database/upsert-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7F,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEjE;;;GAGG;AACH,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAGpC,KAAK,SAAS,GAAG;IACf,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAAC;AAGF,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAGF,MAAM,MAAM,aAAa,CAAC,MAAM,SAAS,SAAS,CAAC,oBAAoB,CAAC,IAAI;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;CACxE,CAAC;AAGF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAOzD;AAED,qBAAa,aAAa;IACxB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;;IAK/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;IAwBtC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIpC,QAAQ,CAAC,CAAC,SAAS,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE;SACF,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO;KAClF,GACA,KAAK;IAqFF,MAAM,CAAC,MAAM,SAAS,SAAS,CAAC,oBAAoB,CAAC,EACzD,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC;IAId,UAAU,CAAC,MAAM,SAAS,SAAS,CAAC,oBAAoB,CAAC,EAC7D,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,EAAE,CAAC;IAId,cAAc,CAAC,MAAM,SAAS,SAAS,CAAC,oBAAoB,CAAC,EACjE,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,QAAQ,GAAG,QAAQ,EACzB,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC;IAwMd,WAAW,CACf,GAAG,EAAE,IAAI,EACT,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC3B,GACA,OAAO,CAAC,IAAI,CAAC;IAyChB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;CA8D1B"}
|
|
@@ -41,11 +41,11 @@ export class UpsertBuilder {
|
|
|
41
41
|
// 해당 테이블의 unique 인덱스를 순회하며 키 생성
|
|
42
42
|
const uniqueKeys = table.uniqueIndexes.map((unqIndex)=>{
|
|
43
43
|
const uniqueKeyArray = unqIndex.columns.map((unqCol)=>{
|
|
44
|
-
const val = row[unqCol];
|
|
44
|
+
const val = row[unqCol.name];
|
|
45
45
|
if (isRefField(val)) {
|
|
46
46
|
return val.uuid;
|
|
47
47
|
} else {
|
|
48
|
-
return row[unqCol] ?? randomUUID(); // nullable인 경우 uuid로 랜덤값 삽입
|
|
48
|
+
return row[unqCol.name] ?? randomUUID(); // nullable인 경우 uuid로 랜덤값 삽입
|
|
49
49
|
}
|
|
50
50
|
});
|
|
51
51
|
// 값이 모두 null인 경우 키 생성 패스
|
|
@@ -118,17 +118,10 @@ export class UpsertBuilder {
|
|
|
118
118
|
});
|
|
119
119
|
return result;
|
|
120
120
|
}
|
|
121
|
-
async upsert(wdb, tableName,
|
|
122
|
-
// 숫자면 { chunkSize: n } 으로 변환
|
|
123
|
-
const options = typeof optionsOrChunkSize === "number" ? {
|
|
124
|
-
chunkSize: optionsOrChunkSize
|
|
125
|
-
} : optionsOrChunkSize;
|
|
121
|
+
async upsert(wdb, tableName, options) {
|
|
126
122
|
return this.upsertOrInsert(wdb, tableName, "upsert", options);
|
|
127
123
|
}
|
|
128
|
-
async insertOnly(wdb, tableName,
|
|
129
|
-
const options = typeof optionsOrChunkSize === "number" ? {
|
|
130
|
-
chunkSize: optionsOrChunkSize
|
|
131
|
-
} : optionsOrChunkSize;
|
|
124
|
+
async insertOnly(wdb, tableName, options) {
|
|
132
125
|
return this.upsertOrInsert(wdb, tableName, "insert", options);
|
|
133
126
|
}
|
|
134
127
|
async upsertOrInsert(wdb, tableName, mode, options) {
|
|
@@ -162,10 +155,6 @@ export class UpsertBuilder {
|
|
|
162
155
|
if (hasCircular) {
|
|
163
156
|
throw new Error(`${tableName}에 순환 자기 참조가 있습니다.`);
|
|
164
157
|
}
|
|
165
|
-
// upsert 모드일 때 유니크 인덱스가 없으면 에러
|
|
166
|
-
if (mode === "upsert" && table.uniqueIndexes.length === 0) {
|
|
167
|
-
throw new Error(`${tableName}에 unique index가 정의되지 않아 upsert를 할 수 없습니다.`);
|
|
168
|
-
}
|
|
169
158
|
const uuidMap = new Map();
|
|
170
159
|
const allIds = [];
|
|
171
160
|
// 레벨별로 순차 처리
|
|
@@ -213,8 +202,10 @@ export class UpsertBuilder {
|
|
|
213
202
|
// INSERT 모드 - RETURNING 사용
|
|
214
203
|
resultRows = await wdb.insert(dataForDb).into(tableName).returning(selectFields);
|
|
215
204
|
} else {
|
|
216
|
-
// UPSERT 모드 - onConflict 사용
|
|
217
|
-
const conflictColumns = table.uniqueIndexes[0].columns
|
|
205
|
+
// UPSERT 모드 - onConflict 사용 (unique index 없으면 PK fallback)
|
|
206
|
+
const conflictColumns = table.uniqueIndexes.length > 0 ? table.uniqueIndexes[0].columns.map((c)=>c.name) : [
|
|
207
|
+
"id"
|
|
208
|
+
];
|
|
218
209
|
const updateColumns = Object.keys(dataForDb[0]).filter((col)=>!conflictColumns.includes(col));
|
|
219
210
|
// updateColumns가 비어있어도 merge()를 사용하여 모든 행이 RETURNING되도록 보장
|
|
220
211
|
const mergeColumns = updateColumns.length > 0 ? updateColumns : conflictColumns;
|
|
@@ -335,7 +326,7 @@ export class UpsertBuilder {
|
|
|
335
326
|
table.uniquesMap.clear();
|
|
336
327
|
}
|
|
337
328
|
// ============================================================================
|
|
338
|
-
// Private
|
|
329
|
+
// Private Helper Methods
|
|
339
330
|
// ============================================================================
|
|
340
331
|
/**
|
|
341
332
|
* rows를 의존성 순서에 따라 레벨별로 그룹화
|
|
@@ -399,4 +390,4 @@ export class UpsertBuilder {
|
|
|
399
390
|
}
|
|
400
391
|
}
|
|
401
392
|
|
|
402
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS91cHNlcnQtYnVpbGRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGlzQXJyYXksIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQsIGNodW5rLCBub25OdWxsYWJsZSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgYmF0Y2hVcGRhdGUsIHR5cGUgUm93V2l0aElkIH0gZnJvbSBcIi4vX2JhdGNoX3VwZGF0ZVwiO1xuXG50eXBlIFRhYmxlRGF0YSA9IHtcbiAgcmVmZXJlbmNlczogU2V0PHN0cmluZz47XG4gIHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gIHVuaXF1ZUluZGV4ZXM6IHsgbmFtZT86IHN0cmluZzsgY29sdW1uczogc3RyaW5nW10gfVtdO1xuICB1bmlxdWVzTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufTtcbmV4cG9ydCB0eXBlIFVCUmVmID0ge1xuICB1dWlkOiBzdHJpbmc7XG4gIG9mOiBzdHJpbmc7XG4gIHVzZT86IHN0cmluZztcbn07XG50eXBlIFVwc2VydE9wdGlvbnMgPSB7XG4gIGNodW5rU2l6ZT86IG51bWJlcjtcbiAgY2xlYW5PcnBoYW5zPzogc3RyaW5nIHwgc3RyaW5nW107IC8vIEZLIOy7rOufvOuqhSjrk6QpXG59O1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVmRmllbGQoZmllbGQ6IHVua25vd24pOiBmaWVsZCBpcyBVQlJlZiB7XG4gIHJldHVybiAoXG4gICAgZmllbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgIGZpZWxkICE9PSBudWxsICYmXG4gICAgKGZpZWxkIGFzIFVCUmVmKT8ub2YgIT09IHVuZGVmaW5lZCAmJlxuICAgIChmaWVsZCBhcyBVQlJlZik/LnV1aWQgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG5leHBvcnQgY2xhc3MgVXBzZXJ0QnVpbGRlciB7XG4gIHRhYmxlczogTWFwPHN0cmluZywgVGFibGVEYXRhPjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy50YWJsZXMgPSBuZXcgTWFwKCk7XG4gIH1cblxuICBnZXRUYWJsZSh0YWJsZU5hbWU6IHN0cmluZyk6IFRhYmxlRGF0YSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlcy5nZXQodGFibGVOYW1lKTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZVNwZWMgPSAoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEVudGl0eU1hbmFnZXIuZ2V0VGFibGVTcGVjKHRhYmxlTmFtZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IHtcbiAgICAgIHJlZmVyZW5jZXM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgcm93czogW10sXG4gICAgICB1bmlxdWVJbmRleGVzOiB0YWJsZVNwZWM/LnVuaXF1ZUluZGV4ZXMgPz8gW10sXG4gICAgICB1bmlxdWVzTWFwOiBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpLFxuICAgIH07XG4gICAgdGhpcy50YWJsZXMuc2V0KHRhYmxlTmFtZSwgdGFibGVEYXRhKTtcbiAgICByZXR1cm4gdGFibGVEYXRhO1xuICB9XG5cbiAgaGFzVGFibGUodGFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZXMuaGFzKHRhYmxlTmFtZSk7XG4gIH1cblxuICByZWdpc3RlcjxUIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICByb3c6IHtcbiAgICAgIFtrZXkgaW4gVF0/OiBVQlJlZiB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQgfCBudWxsIHwgb2JqZWN0IHwgdW5rbm93bjtcbiAgICB9LFxuICApOiBVQlJlZiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLmdldFRhYmxlKHRhYmxlTmFtZSk7XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iU7J2YIHVuaXF1ZSDsnbjrjbHsiqTrpbwg7Iic7ZqM7ZWY66mwIO2CpCDsg53shLFcbiAgICBjb25zdCB1bmlxdWVLZXlzID0gdGFibGUudW5pcXVlSW5kZXhlc1xuICAgICAgLm1hcCgodW5xSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdW5pcXVlS2V5QXJyYXkgPSB1bnFJbmRleC5jb2x1bW5zLm1hcCgodW5xQ29sKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gcm93W3VucUNvbCBhcyBrZXlvZiB0eXBlb2Ygcm93XTtcbiAgICAgICAgICBpZiAoaXNSZWZGaWVsZCh2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnV1aWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByb3dbdW5xQ29sIGFzIGtleW9mIHR5cGVvZiByb3ddID8/IHJhbmRvbVVVSUQoKTsgLy8gbnVsbGFibGXsnbgg6rK97JqwIHV1aWTroZwg656c642k6rCSIOyCveyehVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8g6rCS7J20IOuqqOuRkCBudWxs7J24IOqyveyasCDtgqQg7IOd7ISxIO2MqOyKpFxuICAgICAgICBpZiAodW5pcXVlS2V5QXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuaXF1ZUtleUFycmF5LmpvaW4oXCItLS1kZWxpbWl0ZXItLVwiKTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcblxuICAgIC8vIHV1aWQg7IOd7ISxIOuhnOyngVxuICAgIGNvbnN0IHsgdXVpZCwgaXNSZXVzZWQgfSA9ICgoKSA9PiB7XG4gICAgICAvLyDtgqTrpbwg7Iic7ZqM7ZWY7JesIOydtOuvuCDsobTsnqztlZjripQg7YKk6rCAIOyeiOuKlOyngCDtmZXsnbhcbiAgICAgIGlmICh1bmlxdWVLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChjb25zdCB1bmlxdWVLZXkgb2YgdW5pcXVlS2V5cykge1xuICAgICAgICAgIGlmICh0YWJsZS51bmlxdWVzTWFwLmhhcyh1bmlxdWVLZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICB1dWlkOiBhc3NlcnREZWZpbmVkKHRhYmxlLnVuaXF1ZXNNYXAuZ2V0KHVuaXF1ZUtleSksIFwiVW5pcXVlIGtleSBub3QgZm91bmRcIiksXG4gICAgICAgICAgICAgIGlzUmV1c2VkOiB0cnVlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7LC+7J2EIOyImCDsl4bripQg6rK97JqwIOyDneyEsVxuICAgICAgcmV0dXJuIHsgdXVpZDogcmFuZG9tVVVJRCgpLCBpc1JldXNlZDogZmFsc2UgfTtcbiAgICB9KSgpO1xuXG4gICAgLy8g66qo65OgIOycoOuLiO2BrO2CpOyXkCDrjIDtlbQg7Jyg64uI7YGs66e17JeQIHV1aWQg7KCA7J6lXG4gICAgaWYgKHVuaXF1ZUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCB1bmlxdWVLZXkgb2YgdW5pcXVlS2V5cykge1xuICAgICAgICB0YWJsZS51bmlxdWVzTWFwLnNldCh1bmlxdWVLZXksIHV1aWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOydtCDthYzsnbTruJTsl5Ag7IKs7Jqp65CcIFJlZkZpZWxk66W8IOyInO2ajO2VmOyXrCwg7ZiE7J6sIO2FjOydtOu4lCDsoJXrs7Tsl5Ag7Ja065akIO2VhOuTnOulvCDssLjsobDtlZjripTsp4Ag7LaU6rCAXG4gICAgLy8g7J20IOygleuztOulvCDrgpjspJHsl5Ag7LmY7ZmY7ZWgIOuVjCDsgqzsmqlcbiAgICByb3cgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhyb3cpLm1hcCgoW3Jvd0tleSwgcm93VmFsdWVdKSA9PiB7XG4gICAgICAgIGlmIChpc1JlZkZpZWxkKHJvd1ZhbHVlKSkge1xuICAgICAgICAgIHJvd1ZhbHVlLnVzZSA/Pz0gXCJpZFwiO1xuICAgICAgICAgIHRhYmxlLnJlZmVyZW5jZXMuYWRkKGAke3Jvd1ZhbHVlLm9mfS4ke3Jvd1ZhbHVlLnVzZX1gKTtcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgcm93VmFsdWVdO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByb3dWYWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhKHJvd1ZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAvLyBvYmplY3Tsnbgg6rK97JqwIEpTT07snLzroZwg67OA7ZmYXG4gICAgICAgICAgcmV0dXJuIFtyb3dLZXksIHJvd1ZhbHVlID09PSBudWxsID8gbnVsbCA6IEpTT04uc3RyaW5naWZ5KHJvd1ZhbHVlKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtyb3dLZXksIHJvd1ZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKSBhcyB7IFtrZXkgaW4gVF0/OiB1bmtub3duIH07XG5cbiAgICB0YWJsZS5yb3dzLnB1c2goe1xuICAgICAgdXVpZCxcbiAgICAgIC4uLnJvdyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdDogVUJSZWYgPSB7XG4gICAgICBvZjogdGFibGVOYW1lLFxuICAgICAgdXVpZDogKHJvdyBhcyB7IHV1aWQ/OiBzdHJpbmcgfSkudXVpZCA/PyB1dWlkLFxuICAgIH07XG5cbiAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWdpc3RlclwiLCB7XG4gICAgICB0YWJsZU5hbWUsXG4gICAgICB1dWlkOiByZXN1bHQudXVpZCxcbiAgICAgIGlzVXVpZFJldXNlZDogaXNSZXVzZWQsXG4gICAgICByb3csXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgdXBzZXJ0KFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zT3JDaHVua1NpemU/OiBVcHNlcnRPcHRpb25zLFxuICApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgLy8g7Iir7J6Q66m0IHsgY2h1bmtTaXplOiBuIH0g7Jy866GcIOuzgO2ZmFxuICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgdHlwZW9mIG9wdGlvbnNPckNodW5rU2l6ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICA/IHsgY2h1bmtTaXplOiBvcHRpb25zT3JDaHVua1NpemUgfVxuICAgICAgICA6IG9wdGlvbnNPckNodW5rU2l6ZTtcblxuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcInVwc2VydFwiLCBvcHRpb25zKTtcbiAgfVxuICBhc3luYyBpbnNlcnRPbmx5KFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zT3JDaHVua1NpemU/OiBVcHNlcnRPcHRpb25zIHwgbnVtYmVyLFxuICApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9XG4gICAgICB0eXBlb2Ygb3B0aW9uc09yQ2h1bmtTaXplID09PSBcIm51bWJlclwiXG4gICAgICAgID8geyBjaHVua1NpemU6IG9wdGlvbnNPckNodW5rU2l6ZSB9XG4gICAgICAgIDogb3B0aW9uc09yQ2h1bmtTaXplO1xuXG4gICAgcmV0dXJuIHRoaXMudXBzZXJ0T3JJbnNlcnQod2RiLCB0YWJsZU5hbWUsIFwiaW5zZXJ0XCIsIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgdXBzZXJ0T3JJbnNlcnQoXG4gICAgd2RiOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIG1vZGU6IFwidXBzZXJ0XCIgfCBcImluc2VydFwiLFxuICAgIG9wdGlvbnM/OiBVcHNlcnRPcHRpb25zLFxuICApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgaWYgKHRoaXMuaGFzVGFibGUodGFibGVOYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICh0YWJsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQg7YWM7J2067iUICR7dGFibGVOYW1lfeyXkCB1cHNlcnQg7JqU7LKtYCk7XG4gICAgfSBlbHNlIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhYmxlTmFtZX3sl5AgdXBzZXJ0IO2VoCDrjbDsnbTthLDqsIAg7JeG7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRhYmxlLnJvd3Muc29tZSgocm93KSA9PlxuICAgICAgICBPYmplY3QuZW50cmllcyhyb3cpLnNvbWUoKFssIHZhbHVlXSkgPT4gaXNSZWZGaWVsZCh2YWx1ZSkgJiYgdmFsdWUub2YgIT09IHRhYmxlTmFtZSksXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfSDtlbTqsrDrkJjsp4Ag7JWK7J2AIOywuOyhsOqwgCDsnojsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8g7KCE7LK0IO2FjOydtOu4lCDsiJztmoztlZjsl6wg7ZiE7J6sIO2FjOydtOu4lCDssLjsobDtlZjripQg66qo65OgIO2FjOydtOu4lCDstpTstpxcbiAgICBjb25zdCB7IHJlZmVyZW5jZXMsIHJlZlRhYmxlcyB9ID0gQXJyYXkuZnJvbSh0aGlzLnRhYmxlcykucmVkdWNlKFxuICAgICAgKHIsIFssIHRhYmxlXSkgPT4ge1xuICAgICAgICBjb25zdCByZWZlcmVuY2UgPSBBcnJheS5mcm9tKHRhYmxlLnJlZmVyZW5jZXMudmFsdWVzKCkpLmZpbmQoKHJlZikgPT5cbiAgICAgICAgICByZWYuaW5jbHVkZXMoYCR7dGFibGVOYW1lfS5gKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlZmVyZW5jZSkge1xuICAgICAgICAgIHIucmVmZXJlbmNlcy5wdXNoKHJlZmVyZW5jZSk7XG4gICAgICAgICAgci5yZWZUYWJsZXMucHVzaCh0YWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHJlZmVyZW5jZXM6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgICByZWZUYWJsZXM6IFtdIGFzIFRhYmxlRGF0YVtdLFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IGV4dHJhY3RGaWVsZHMgPSB1bmlxdWUocmVmZXJlbmNlcylcbiAgICAgIC5tYXAoKHJlZmVyZW5jZSkgPT4gcmVmZXJlbmNlLnNwbGl0KFwiLlwiKVsxXSlcbiAgICAgIC5maWx0ZXIoKGZpZWxkKTogZmllbGQgaXMgc3RyaW5nID0+IGZpZWxkICE9PSB1bmRlZmluZWQpO1xuXG4gICAgLy8g7J2Y7KG07ISxIOyInOyEnOyXkCDrlLDrnbwg66CI67Ko67OEIOq3uOujue2ZlCAo7J6Q6riwIOywuOyhsOqwgCDsl4bsnLzrqbQgTGV2ZWwgMCDtlZjrgpgpXG4gICAgY29uc3QgeyBsZXZlbHMsIGhhc0NpcmN1bGFyIH0gPSB0aGlzLmJ1aWxkSW5zZXJ0TGV2ZWxzKHRhYmxlLnJvd3MsIHRhYmxlTmFtZSk7XG5cbiAgICBpZiAoaGFzQ2lyY3VsYXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIOyInO2ZmCDsnpDquLAg7LC47KGw6rCAIOyeiOyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICAvLyB1cHNlcnQg66qo65Oc7J28IOuVjCDsnKDri4jtgawg7J24642x7Iqk6rCAIOyXhuycvOuptCDsl5Drn6xcbiAgICBpZiAobW9kZSA9PT0gXCJ1cHNlcnRcIiAmJiB0YWJsZS51bmlxdWVJbmRleGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhYmxlTmFtZX3sl5AgdW5pcXVlIGluZGV46rCAIOygleydmOuQmOyngCDslYrslYQgdXBzZXJ066W8IO2VoCDsiJgg7JeG7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHV1aWRNYXAgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcbiAgICBjb25zdCBhbGxJZHM6IG51bWJlcltdID0gW107XG5cbiAgICAvLyDroIjrsqjrs4TroZwg7Iic7LCoIOyymOumrFxuICAgIGZvciAoY29uc3QgbGV2ZWxSb3dzIG9mIGxldmVscykge1xuICAgICAgLy8g7J207KCEIOugiOuyqOyXkOyEnCDslrvsnYAgSUTroZwg7J6Q6riwIOywuOyhsCDtlbTqsrBcbiAgICAgIGNvbnN0IHJlc29sdmVkUm93cyA9IGxldmVsUm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICBjb25zdCByZXNvbHZlZCA9IHsgLi4ucm93IH07XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJvdykpIHtcbiAgICAgICAgICBpZiAoaXNSZWZGaWVsZCh2YWx1ZSkgJiYgdmFsdWUub2YgPT09IHRhYmxlTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdXVpZE1hcC5nZXQodmFsdWUudXVpZCk7XG5cbiAgICAgICAgICAgIGlmICghcGFyZW50KSB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgdXVpZCAke3ZhbHVlLnV1aWR9IC0tIGluICR7dGFibGVOYW1lfWApO1xuXG4gICAgICAgICAgICByZXNvbHZlZFtrZXldID0gKHBhcmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbdmFsdWUudXNlID8/IFwiaWRcIl07XG5cbiAgICAgICAgICAgIE5haXRlLnQoXCJwdXJpOnViLXJlZi1yZXNvbHZlZFwiLCB7XG4gICAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgZmllbGQ6IGtleSxcbiAgICAgICAgICAgICAgZnJvbTogeyBvZjogdmFsdWUub2YsIHV1aWQ6IHZhbHVlLnV1aWQsIHVzZTogdmFsdWUudXNlID8/IFwiaWRcIiB9LFxuICAgICAgICAgICAgICB0bzogcmVzb2x2ZWRba2V5XSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICB9KTtcblxuICAgICAgLy8g7ZiE7J6sIOugiOuyqCB1cHNlcnRcbiAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IG9wdGlvbnM/LmNodW5rU2l6ZTtcbiAgICAgIGNvbnN0IGxldmVsQ2h1bmtzID0gY2h1bmtTaXplID8gY2h1bmsocmVzb2x2ZWRSb3dzLCBjaHVua1NpemUpIDogW3Jlc29sdmVkUm93c107XG4gICAgICBjb25zdCBzZWxlY3RGaWVsZHMgPSB1bmlxdWUoW1wiaWRcIiwgLi4uZXh0cmFjdEZpZWxkc10pO1xuXG4gICAgICBmb3IgKGNvbnN0IGRhdGFDaHVuayBvZiBsZXZlbENodW5rcykge1xuICAgICAgICBpZiAoZGF0YUNodW5rLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgLy8gdXVpZOulvCDrs4Trj4TroZwg67O06rSA7ZWY6rOgLCBEQuyXkCDsoIDsnqXtlaAg642w7J207YSw7JeQ7IScIOygnOqxsFxuICAgICAgICBjb25zdCBvcmlnaW5hbFV1aWRzID0gZGF0YUNodW5rLm1hcCgocikgPT4gci51dWlkIGFzIHN0cmluZyk7XG4gICAgICAgIGNvbnN0IGRhdGFGb3JEYiA9IGRhdGFDaHVuay5tYXAoKHsgdXVpZCwgLi4ucmVzdCB9KSA9PiByZXN0KTtcblxuICAgICAgICBsZXQgcmVzdWx0Um93czogeyBpZDogbnVtYmVyOyBba2V5OiBzdHJpbmddOiB1bmtub3duIH1bXTtcblxuICAgICAgICBpZiAobW9kZSA9PT0gXCJpbnNlcnRcIikge1xuICAgICAgICAgIC8vIElOU0VSVCDrqqjrk5wgLSBSRVRVUk5JTkcg7IKs7JqpXG4gICAgICAgICAgcmVzdWx0Um93cyA9IGF3YWl0IHdkYi5pbnNlcnQoZGF0YUZvckRiKS5pbnRvKHRhYmxlTmFtZSkucmV0dXJuaW5nKHNlbGVjdEZpZWxkcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVVBTRVJUIOuqqOuTnCAtIG9uQ29uZmxpY3Qg7IKs7JqpXG4gICAgICAgICAgY29uc3QgY29uZmxpY3RDb2x1bW5zID0gdGFibGUudW5pcXVlSW5kZXhlc1swXS5jb2x1bW5zO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZUNvbHVtbnMgPSBPYmplY3Qua2V5cyhkYXRhRm9yRGJbMF0pLmZpbHRlcihcbiAgICAgICAgICAgIChjb2wpID0+ICFjb25mbGljdENvbHVtbnMuaW5jbHVkZXMoY29sKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gdXBkYXRlQ29sdW1uc+qwgCDruYTslrTsnojslrTrj4QgbWVyZ2UoKeulvCDsgqzsmqntlZjsl6wg66qo65OgIO2WieydtCBSRVRVUk5JTkfrkJjrj4TroZ0g67O07J6lXG4gICAgICAgICAgY29uc3QgbWVyZ2VDb2x1bW5zID0gdXBkYXRlQ29sdW1ucy5sZW5ndGggPiAwID8gdXBkYXRlQ29sdW1ucyA6IGNvbmZsaWN0Q29sdW1ucztcblxuICAgICAgICAgIHJlc3VsdFJvd3MgPSBhd2FpdCB3ZGJcbiAgICAgICAgICAgIC5pbnNlcnQoZGF0YUZvckRiKVxuICAgICAgICAgICAgLmludG8odGFibGVOYW1lKVxuICAgICAgICAgICAgLm9uQ29uZmxpY3QoY29uZmxpY3RDb2x1bW5zKVxuICAgICAgICAgICAgLm1lcmdlKG1lcmdlQ29sdW1ucylcbiAgICAgICAgICAgIC5yZXR1cm5pbmcoc2VsZWN0RmllbGRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcmlnaW5hbFV1aWRzLmxlbmd0aCAhPT0gcmVzdWx0Um93cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfTogcmVnaXN0ZXIvcmV0dXJuaW5nIOu2iOydvOy5mGApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdXVpZE1hcC5zZXQob3JpZ2luYWxVdWlkc1tpXSwgcmVzdWx0Um93c1tpXSk7XG4gICAgICAgICAgYWxsSWRzLnB1c2gocmVzdWx0Um93c1tpXS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iUIOywuOyhsOulvCDsi6TsoJwg67C466WY66GcIOuzgOqyvVxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgcmVmVGFibGVzKSB7XG4gICAgICB0YWJsZS5yb3dzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyb3cpKSB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IHJvd1trZXldO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHByb3ApICYmIHByb3Aub2YgPT09IHRhYmxlTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdXVpZE1hcC5nZXQocHJvcC51dWlkKTtcbiAgICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocHJvcCk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB1dWlkICR7cHJvcC51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSAocGFyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwcm9wLnVzZSA/PyBcImlkXCJdO1xuICAgICAgICAgICAgcm93W2tleV0gPSByZXNvbHZlZFZhbHVlO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHByb3Aub2YsIHV1aWQ6IHByb3AudXVpZCwgdXNlOiBwcm9wLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkVmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5jbGVhbk9ycGhhbnMpIHtcbiAgICAgIGNvbnN0IGNsZWFuT3JwaGFucyA9IG9wdGlvbnMuY2xlYW5PcnBoYW5zO1xuICAgICAgY29uc3QgZmtDb2x1bW5zID0gaXNBcnJheShjbGVhbk9ycGhhbnMpID8gY2xlYW5PcnBoYW5zIDogW2NsZWFuT3JwaGFuc107XG5cbiAgICAgIC8vIO2YhOyerCByZWdpc3RlcuuQnCDroIjsvZTrk5zrk6TsnZggRksg6rCS65OkIOy2lOy2nFxuICAgICAgY29uc3QgZmtDb25kaXRpb25zID0gZmtDb2x1bW5zLm1hcCgoZmtDb2wpID0+IHtcbiAgICAgICAgY29uc3QgZmtWYWx1ZXMgPSBbLi4ubmV3IFNldCh0YWJsZS5yb3dzLm1hcCgocm93KSA9PiByb3dbZmtDb2xdKS5maWx0ZXIoKHYpID0+IHYgIT0gbnVsbCkpXTtcbiAgICAgICAgcmV0dXJuIHsgY29sdW1uOiBma0NvbCwgdmFsdWVzOiBma1ZhbHVlcyB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIOuqqOuToCBGSyDsu6zrn7zsl5Ag6rCS7J20IOyeiOuKlCDqsr3smrDsl5Drp4wg7IKt7KCcIOyLpO2WiVxuICAgICAgaWYgKGZrQ29uZGl0aW9ucy5ldmVyeSgoZmMpID0+IGZjLnZhbHVlcy5sZW5ndGggPiAwKSkge1xuICAgICAgICBsZXQgZGVsZXRlUXVlcnkgPSB3ZGIodGFibGVOYW1lKTtcblxuICAgICAgICAvLyDqsIEgRksg7Lus65+87JeQIOuMgO2VnCBXSEVSRSBJTiDsobDqsbQg7LaU6rCAXG4gICAgICAgIGZvciAoY29uc3QgeyBjb2x1bW4sIHZhbHVlcyB9IG9mIGZrQ29uZGl0aW9ucykge1xuICAgICAgICAgIGRlbGV0ZVF1ZXJ5ID0gZGVsZXRlUXVlcnkud2hlcmVJbihjb2x1bW4sIHZhbHVlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrsKnquIggdXBzZXJ07ZWcIElE64qUIOygnOyZuFxuICAgICAgICBkZWxldGVRdWVyeSA9IGRlbGV0ZVF1ZXJ5LndoZXJlTm90SW4oXCJpZFwiLCBhbGxJZHMpO1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZWRDb3VudCA9IGF3YWl0IGRlbGV0ZVF1ZXJ5LmRlbGV0ZSgpO1xuXG4gICAgICAgIE5haXRlLnQoXCJwdXJpOnViLWNsZWFuLW9ycGhhbnNcIiwge1xuICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICBjbGVhbk9ycGhhbnM6IGZrQ29sdW1ucyxcbiAgICAgICAgICBkZWxldGVkQ291bnQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIO2VtOuLuSDthYzsnbTruJTsnZgg642w7J207YSwIOy0iOq4sO2ZlFxuICAgIHRhYmxlLnJvd3MgPSBbXTtcbiAgICB0YWJsZS5yZWZlcmVuY2VzLmNsZWFyKCk7XG4gICAgdGFibGUudW5pcXVlc01hcC5jbGVhcigpO1xuXG4gICAgTmFpdGUudChcInB1cmk6dWItdXBzZXJ0ZWRcIiwge1xuICAgICAgdGFibGVOYW1lLFxuICAgICAgbW9kZSxcbiAgICAgIHJvd0NvdW50OiBhbGxJZHMubGVuZ3RoLFxuICAgICAgcmV0dXJuZWRJZHM6IGFsbElkcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBhbGxJZHM7XG4gIH1cblxuICBhc3luYyB1cGRhdGVCYXRjaChcbiAgICB3ZGI6IEtuZXgsXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGNodW5rU2l6ZT86IG51bWJlcjtcbiAgICAgIHdoZXJlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBjaHVua1NpemU6IG9wdGlvbnM/LmNodW5rU2l6ZSA/PyA1MDAsXG4gICAgICB3aGVyZTogb3B0aW9ucz8ud2hlcmUgPz8gXCJpZFwiLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5oYXNUYWJsZSh0YWJsZU5hbWUpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICghdGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg65Ox66Gd65CY7KeAIOyViuydgCDthYzsnbTruJQgJHt0YWJsZU5hbWV97JeQIHVwZGF0ZUJhdGNoIOyalOyyrWApO1xuICAgIH0gZWxzZSBpZiAodGFibGUucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3aGVyZUNvbHVtbnMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMud2hlcmUpID8gb3B0aW9ucy53aGVyZSA6IFtvcHRpb25zLndoZXJlID8/IFwiaWRcIl07XG4gICAgY29uc3Qgcm93cyA9IHRhYmxlLnJvd3MubWFwKChfcm93KSA9PiB7XG4gICAgICBjb25zdCB7IHV1aWQ6IF8sIC4uLnJvdyB9ID0gX3JvdzsgLy8gdXVpZCDsoJzsmbhcbiAgICAgIHJldHVybiByb3cgYXMgUm93V2l0aElkPHN0cmluZz47XG4gICAgfSk7XG5cbiAgICBhd2FpdCBiYXRjaFVwZGF0ZSh3ZGIsIHRhYmxlTmFtZSwgd2hlcmVDb2x1bW5zLCByb3dzLCBvcHRpb25zLmNodW5rU2l6ZSk7XG5cbiAgICBOYWl0ZS50KFwicHVyaTp1Yi1iYXRjaC11cGRhdGVkXCIsIHtcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHJvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICAgIHdoZXJlQ29sdW1ucyxcbiAgICB9KTtcblxuICAgIC8vIHVwZGF0ZUJhdGNoIOyZhOujjCDtm4Qg7LKY66as65CcIOuNsOydtO2EsCDsoJzqsbBcbiAgICB0YWJsZS5yb3dzID0gW107XG4gICAgdGFibGUucmVmZXJlbmNlcy5jbGVhcigpO1xuICAgIHRhYmxlLnVuaXF1ZXNNYXAuY2xlYXIoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHJpdmF0ZSBIZWxwZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogcm93c+ulvCDsnZjsobTshLEg7Iic7ISc7JeQIOuUsOudvCDroIjrsqjrs4TroZwg6re466O57ZmUXG4gICAqIC0g7J6Q6riwIOywuOyhsCDsl4bripQg6rK97JqwIDog66qo65OgIHJvd3PqsIAgTGV2ZWwgMFxuICAgKiAtIOyekOq4sCDssLjsobAg7J6I64qUIOqyveyasCA6IOyekOq4sCDssLjsobAg6rSA6rOE66W8IOychOyDgSDsoJXroKztlZjsl6wg66CI67Ko67OE66GcIOq3uOujue2ZlFxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEluc2VydExldmVscyhcbiAgICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiB7IGxldmVsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXVtdOyBoYXNDaXJjdWxhcjogYm9vbGVhbiB9IHtcbiAgICAvLyAxLiDsnpDquLAg7LC47KGw6rCAIOyXhuycvOuptCDtlZwg66CI67Ko66GcIOyymOumrFxuICAgIGNvbnN0IGhhc1NlbGZSZWYgPSByb3dzXG4gICAgICAuZmxhdE1hcCgocm93KSA9PiBPYmplY3QudmFsdWVzKHJvdykpXG4gICAgICAuc29tZSgodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpO1xuICAgIGlmICghaGFzU2VsZlJlZikgcmV0dXJuIHsgbGV2ZWxzOiBbcm93c10sIGhhc0NpcmN1bGFyOiBmYWxzZSB9O1xuXG4gICAgLy8gMi4gdXVpZCDihpIgcm93IOunpO2VkSAo7KSR67O1IHV1aWQg67Cp7KeAKVxuICAgIGNvbnN0IHJvd0J5VXVpZCA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBjb25zdCB1dWlkID0gcm93LnV1aWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCF1dWlkKSB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkSW5zZXJ0TGV2ZWxzOiB1dWlk6rCAIOyXhuuKlCByb3cgLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICByb3dCeVV1aWQuc2V0KHV1aWQsIHJvdyk7XG4gICAgfVxuXG4gICAgbGV0IHBlbmRpbmcgPSBBcnJheS5mcm9tKHJvd0J5VXVpZC52YWx1ZXMoKSk7XG4gICAgY29uc3QgbGV2ZWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdW10gPSBbXTtcbiAgICBjb25zdCBpbnNlcnRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgLy8gMy4g66CI67Ko67OEIOu2hOulmFxuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICAgICAgY29uc3QgbmV4dFBlbmRpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgcGVuZGluZykge1xuICAgICAgICAvLyDsnbQgcm936rCAIOywuOyhsO2VmOuKlCDsnpDquLAg7LC47KGw65OkXG4gICAgICAgIGNvbnN0IHNlbGZSZWZzID0gT2JqZWN0LnZhbHVlcyhyb3cpLmZpbHRlcihcbiAgICAgICAgICAodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUsXG4gICAgICAgICkgYXMgVUJSZWZbXTtcblxuICAgICAgICAvLyDssLjsobDtlZjripQg66qo65OgIHV1aWTqsIAg7J2066+4IGluc2VydGVk7JeQIOyeiOyWtOyVvCDsnbTrsogg66CI67Ko7JeQIO2PrO2VqFxuICAgICAgICBjb25zdCBjYW5JbnNlcnQgPSBzZWxmUmVmcy5ldmVyeSgocmVmKSA9PiB7XG4gICAgICAgICAgaWYgKCFyb3dCeVV1aWQuaGFzKHJlZi51dWlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHtyZWYudXVpZH0gLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpbnNlcnRlZC5oYXMocmVmLnV1aWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2FuSW5zZXJ0KSB7XG4gICAgICAgICAgY3VycmVudExldmVsLnB1c2gocm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0UGVuZGluZy5wdXNoKHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7Iic7ZmYIOywuOyhsCDqsJDsp4BcbiAgICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID09PSAwKSByZXR1cm4geyBsZXZlbHM6IFtdLCBoYXNDaXJjdWxhcjogdHJ1ZSB9O1xuXG4gICAgICAvLyDroIjrsqgg7ZmV7KCVICsgaW5zZXJ0ZWQg6rCx7IugXG4gICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIGluc2VydGVkLmFkZChyb3cudXVpZCBhcyBzdHJpbmcpO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nID0gbmV4dFBlbmRpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbGV2ZWxzLCBoYXNDaXJjdWxhcjogZmFsc2UgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbInJhbmRvbVVVSUQiLCJpc0FycmF5IiwidW5pcXVlIiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiYXNzZXJ0RGVmaW5lZCIsImNodW5rIiwibm9uTnVsbGFibGUiLCJiYXRjaFVwZGF0ZSIsImlzUmVmRmllbGQiLCJmaWVsZCIsInVuZGVmaW5lZCIsIm9mIiwidXVpZCIsIlVwc2VydEJ1aWxkZXIiLCJ0YWJsZXMiLCJNYXAiLCJnZXRUYWJsZSIsInRhYmxlTmFtZSIsInRhYmxlIiwiZ2V0IiwidGFibGVTcGVjIiwiZ2V0VGFibGVTcGVjIiwidGFibGVEYXRhIiwicmVmZXJlbmNlcyIsIlNldCIsInJvd3MiLCJ1bmlxdWVJbmRleGVzIiwidW5pcXVlc01hcCIsInNldCIsImhhc1RhYmxlIiwiaGFzIiwicmVnaXN0ZXIiLCJyb3ciLCJ1bmlxdWVLZXlzIiwibWFwIiwidW5xSW5kZXgiLCJ1bmlxdWVLZXlBcnJheSIsImNvbHVtbnMiLCJ1bnFDb2wiLCJ2YWwiLCJsZW5ndGgiLCJqb2luIiwiZmlsdGVyIiwiaXNSZXVzZWQiLCJ1bmlxdWVLZXkiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJyb3dLZXkiLCJyb3dWYWx1ZSIsInVzZSIsImFkZCIsIkRhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwicHVzaCIsInJlc3VsdCIsInQiLCJpc1V1aWRSZXVzZWQiLCJ1cHNlcnQiLCJ3ZGIiLCJvcHRpb25zT3JDaHVua1NpemUiLCJvcHRpb25zIiwiY2h1bmtTaXplIiwidXBzZXJ0T3JJbnNlcnQiLCJpbnNlcnRPbmx5IiwibW9kZSIsIkVycm9yIiwic29tZSIsInZhbHVlIiwicmVmVGFibGVzIiwiQXJyYXkiLCJmcm9tIiwicmVkdWNlIiwiciIsInJlZmVyZW5jZSIsInZhbHVlcyIsImZpbmQiLCJyZWYiLCJpbmNsdWRlcyIsImV4dHJhY3RGaWVsZHMiLCJzcGxpdCIsImxldmVscyIsImhhc0NpcmN1bGFyIiwiYnVpbGRJbnNlcnRMZXZlbHMiLCJ1dWlkTWFwIiwiYWxsSWRzIiwibGV2ZWxSb3dzIiwicmVzb2x2ZWRSb3dzIiwicmVzb2x2ZWQiLCJrZXkiLCJwYXJlbnQiLCJ0byIsImxldmVsQ2h1bmtzIiwic2VsZWN0RmllbGRzIiwiZGF0YUNodW5rIiwib3JpZ2luYWxVdWlkcyIsImRhdGFGb3JEYiIsInJlc3QiLCJyZXN1bHRSb3dzIiwiaW5zZXJ0IiwiaW50byIsInJldHVybmluZyIsImNvbmZsaWN0Q29sdW1ucyIsInVwZGF0ZUNvbHVtbnMiLCJrZXlzIiwiY29sIiwibWVyZ2VDb2x1bW5zIiwib25Db25mbGljdCIsIm1lcmdlIiwiaSIsImlkIiwicHJvcCIsImNvbnNvbGUiLCJlcnJvciIsInJlc29sdmVkVmFsdWUiLCJjbGVhbk9ycGhhbnMiLCJma0NvbHVtbnMiLCJma0NvbmRpdGlvbnMiLCJma0NvbCIsImZrVmFsdWVzIiwidiIsImNvbHVtbiIsImV2ZXJ5IiwiZmMiLCJkZWxldGVRdWVyeSIsIndoZXJlSW4iLCJ3aGVyZU5vdEluIiwiZGVsZXRlZENvdW50IiwiZGVsZXRlIiwiY2xlYXIiLCJyb3dDb3VudCIsInJldHVybmVkSWRzIiwidXBkYXRlQmF0Y2giLCJ3aGVyZSIsIndoZXJlQ29sdW1ucyIsIl9yb3ciLCJfIiwiaGFzU2VsZlJlZiIsImZsYXRNYXAiLCJyb3dCeVV1aWQiLCJwZW5kaW5nIiwiaW5zZXJ0ZWQiLCJjdXJyZW50TGV2ZWwiLCJuZXh0UGVuZGluZyIsInNlbGZSZWZzIiwiY2FuSW5zZXJ0Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxVQUFVLFFBQVEsU0FBUztBQUVwQyxTQUFTQyxPQUFPLEVBQUVDLE1BQU0sUUFBUSxVQUFVO0FBQzFDLFNBQVNDLGFBQWEsUUFBUSw4QkFBMkI7QUFDekQsU0FBU0MsS0FBSyxRQUFRLG9CQUFpQjtBQUN2QyxTQUFTQyxhQUFhLEVBQUVDLEtBQUssRUFBRUMsV0FBVyxRQUFRLG9CQUFpQjtBQUNuRSxTQUFTQyxXQUFXLFFBQXdCLHFCQUFrQjtBQWlCOUQsT0FBTyxTQUFTQyxXQUFXQyxLQUFjO0lBQ3ZDLE9BQ0VBLFVBQVVDLGFBQ1ZELFVBQVUsUUFDVixBQUFDQSxPQUFpQkUsT0FBT0QsYUFDekIsQUFBQ0QsT0FBaUJHLFNBQVNGO0FBRS9CO0FBRUEsT0FBTyxNQUFNRztJQUNYQyxPQUErQjtJQUMvQixhQUFjO1FBQ1osSUFBSSxDQUFDQSxNQUFNLEdBQUcsSUFBSUM7SUFDcEI7SUFFQUMsU0FBU0MsU0FBaUIsRUFBYTtRQUNyQyxNQUFNQyxRQUFRLElBQUksQ0FBQ0osTUFBTSxDQUFDSyxHQUFHLENBQUNGO1FBQzlCLElBQUlDLE9BQU87WUFDVCxPQUFPQTtRQUNUO1FBRUEsTUFBTUUsWUFBWSxBQUFDLENBQUE7WUFDakIsSUFBSTtnQkFDRixPQUFPbEIsY0FBY21CLFlBQVksQ0FBQ0o7WUFDcEMsRUFBRSxPQUFNO2dCQUNOLE9BQU87WUFDVDtRQUNGLENBQUE7UUFFQSxNQUFNSyxZQUFZO1lBQ2hCQyxZQUFZLElBQUlDO1lBQ2hCQyxNQUFNLEVBQUU7WUFDUkMsZUFBZU4sV0FBV00saUJBQWlCLEVBQUU7WUFDN0NDLFlBQVksSUFBSVo7UUFDbEI7UUFDQSxJQUFJLENBQUNELE1BQU0sQ0FBQ2MsR0FBRyxDQUFDWCxXQUFXSztRQUMzQixPQUFPQTtJQUNUO0lBRUFPLFNBQVNaLFNBQWlCLEVBQVc7UUFDbkMsT0FBTyxJ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
|
|
393
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS91cHNlcnQtYnVpbGRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGlzQXJyYXksIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VGb3JlaWduS2V5cywgRGF0YWJhc2VTY2hlbWFFeHRlbmQsIEVudGl0eUluZGV4IH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBhc3NlcnREZWZpbmVkLCBjaHVuaywgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IGJhdGNoVXBkYXRlLCB0eXBlIFJvd1dpdGhJZCB9IGZyb20gXCIuL19iYXRjaF91cGRhdGVcIjtcbmltcG9ydCB0eXBlIHsgRm9yZWlnbktleUNvbHVtbnMsIFRhYmxlTmFtZSB9IGZyb20gXCIuL3B1cmkudHlwZXNcIjtcblxuLyoqXG4gKiBGSyDtg4DsnoUg7LaU66Gg7J2EIOychO2VtCBEYXRhYmFzZUZvcmVpZ25LZXlzIGV4cG9ydFxuICogKG1vZHVsZSBhdWdtZW50YXRpb24g7J6Q64+ZIOuhnOuTnCDrs7TsnqUpXG4gKi9cbmV4cG9ydCB0eXBlIHsgRGF0YWJhc2VGb3JlaWduS2V5cyB9O1xuXG4vLyDthYzsnbTruJQg642w7J207YSwIO2DgOyehVxudHlwZSBUYWJsZURhdGEgPSB7XG4gIHJlZmVyZW5jZXM6IFNldDxzdHJpbmc+O1xuICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuICB1bmlxdWVJbmRleGVzOiBFbnRpdHlJbmRleFtdO1xuICB1bmlxdWVzTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufTtcblxuLy8g7LC47KGwIO2VhOuTnCDtg4DsnoVcbmV4cG9ydCB0eXBlIFVCUmVmID0ge1xuICB1dWlkOiBzdHJpbmc7XG4gIG9mOiBzdHJpbmc7XG4gIHVzZT86IHN0cmluZztcbn07XG5cbi8vIHVwc2VydCDsmLXshZhcbmV4cG9ydCB0eXBlIFVwc2VydE9wdGlvbnM8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPERhdGFiYXNlU2NoZW1hRXh0ZW5kPj4gPSB7XG4gIGNodW5rU2l6ZT86IG51bWJlcjtcbiAgY2xlYW5PcnBoYW5zPzogRm9yZWlnbktleUNvbHVtbnM8VFRhYmxlPiB8IEZvcmVpZ25LZXlDb2x1bW5zPFRUYWJsZT5bXTtcbn07XG5cbi8vIGluc2VydE9ubHkg7Ji17IWYXG5leHBvcnQgdHlwZSBJbnNlcnRPbmx5T3B0aW9ucyA9IHtcbiAgY2h1bmtTaXplPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVmRmllbGQoZmllbGQ6IHVua25vd24pOiBmaWVsZCBpcyBVQlJlZiB7XG4gIHJldHVybiAoXG4gICAgZmllbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgIGZpZWxkICE9PSBudWxsICYmXG4gICAgKGZpZWxkIGFzIFVCUmVmKT8ub2YgIT09IHVuZGVmaW5lZCAmJlxuICAgIChmaWVsZCBhcyBVQlJlZik/LnV1aWQgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG5leHBvcnQgY2xhc3MgVXBzZXJ0QnVpbGRlciB7XG4gIHRhYmxlczogTWFwPHN0cmluZywgVGFibGVEYXRhPjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy50YWJsZXMgPSBuZXcgTWFwKCk7XG4gIH1cblxuICBnZXRUYWJsZSh0YWJsZU5hbWU6IHN0cmluZyk6IFRhYmxlRGF0YSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlcy5nZXQodGFibGVOYW1lKTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZVNwZWMgPSAoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEVudGl0eU1hbmFnZXIuZ2V0VGFibGVTcGVjKHRhYmxlTmFtZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IHtcbiAgICAgIHJlZmVyZW5jZXM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgcm93czogW10sXG4gICAgICB1bmlxdWVJbmRleGVzOiB0YWJsZVNwZWM/LnVuaXF1ZUluZGV4ZXMgPz8gW10sXG4gICAgICB1bmlxdWVzTWFwOiBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpLFxuICAgIH07XG4gICAgdGhpcy50YWJsZXMuc2V0KHRhYmxlTmFtZSwgdGFibGVEYXRhKTtcbiAgICByZXR1cm4gdGFibGVEYXRhO1xuICB9XG5cbiAgaGFzVGFibGUodGFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZXMuaGFzKHRhYmxlTmFtZSk7XG4gIH1cblxuICByZWdpc3RlcjxUIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICByb3c6IHtcbiAgICAgIFtrZXkgaW4gVF0/OiBVQlJlZiB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQgfCBudWxsIHwgb2JqZWN0IHwgdW5rbm93bjtcbiAgICB9LFxuICApOiBVQlJlZiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLmdldFRhYmxlKHRhYmxlTmFtZSk7XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iU7J2YIHVuaXF1ZSDsnbjrjbHsiqTrpbwg7Iic7ZqM7ZWY66mwIO2CpCDsg53shLFcbiAgICBjb25zdCB1bmlxdWVLZXlzID0gdGFibGUudW5pcXVlSW5kZXhlc1xuICAgICAgLm1hcCgodW5xSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdW5pcXVlS2V5QXJyYXkgPSB1bnFJbmRleC5jb2x1bW5zLm1hcCgodW5xQ29sKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gcm93W3VucUNvbC5uYW1lIGFzIGtleW9mIHR5cGVvZiByb3ddO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWwudXVpZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJvd1t1bnFDb2wubmFtZSBhcyBrZXlvZiB0eXBlb2Ygcm93XSA/PyByYW5kb21VVUlEKCk7IC8vIG51bGxhYmxl7J24IOqyveyasCB1dWlk66GcIOuenOuNpOqwkiDsgr3snoVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIOqwkuydtCDrqqjrkZAgbnVsbOyduCDqsr3smrAg7YKkIOyDneyEsSDtjKjsiqRcbiAgICAgICAgaWYgKHVuaXF1ZUtleUFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmlxdWVLZXlBcnJheS5qb2luKFwiLS0tZGVsaW1pdGVyLS1cIik7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG5cbiAgICAvLyB1dWlkIOyDneyEsSDroZzsp4FcbiAgICBjb25zdCB7IHV1aWQsIGlzUmV1c2VkIH0gPSAoKCkgPT4ge1xuICAgICAgLy8g7YKk66W8IOyInO2ajO2VmOyXrCDsnbTrr7gg7KG07J6s7ZWY64qUIO2CpOqwgCDsnojripTsp4Ag7ZmV7J24XG4gICAgICBpZiAodW5pcXVlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgdW5pcXVlS2V5IG9mIHVuaXF1ZUtleXMpIHtcbiAgICAgICAgICBpZiAodGFibGUudW5pcXVlc01hcC5oYXModW5pcXVlS2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdXVpZDogYXNzZXJ0RGVmaW5lZCh0YWJsZS51bmlxdWVzTWFwLmdldCh1bmlxdWVLZXkpLCBcIlVuaXF1ZSBrZXkgbm90IGZvdW5kXCIpLFxuICAgICAgICAgICAgICBpc1JldXNlZDogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOywvuydhCDsiJgg7JeG64qUIOqyveyasCDsg53shLFcbiAgICAgIHJldHVybiB7IHV1aWQ6IHJhbmRvbVVVSUQoKSwgaXNSZXVzZWQ6IGZhbHNlIH07XG4gICAgfSkoKTtcblxuICAgIC8vIOuqqOuToCDsnKDri4jtgaztgqTsl5Ag64yA7ZW0IOycoOuLiO2BrOunteyXkCB1dWlkIOyggOyepVxuICAgIGlmICh1bmlxdWVLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgdW5pcXVlS2V5IG9mIHVuaXF1ZUtleXMpIHtcbiAgICAgICAgdGFibGUudW5pcXVlc01hcC5zZXQodW5pcXVlS2V5LCB1dWlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsnbQg7YWM7J2067iU7JeQIOyCrOyaqeuQnCBSZWZGaWVsZOulvCDsiJztmoztlZjsl6wsIO2YhOyerCDthYzsnbTruJQg7KCV67O07JeQIOyWtOuWpCDtlYTrk5zrpbwg7LC47KGw7ZWY64qU7KeAIOy2lOqwgFxuICAgIC8vIOydtCDsoJXrs7Trpbwg64KY7KSR7JeQIOy5mO2ZmO2VoCDrlYwg7IKs7JqpXG4gICAgcm93ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMocm93KS5tYXAoKFtyb3dLZXksIHJvd1ZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAoaXNSZWZGaWVsZChyb3dWYWx1ZSkpIHtcbiAgICAgICAgICByb3dWYWx1ZS51c2UgPz89IFwiaWRcIjtcbiAgICAgICAgICB0YWJsZS5yZWZlcmVuY2VzLmFkZChgJHtyb3dWYWx1ZS5vZn0uJHtyb3dWYWx1ZS51c2V9YCk7XG4gICAgICAgICAgcmV0dXJuIFtyb3dLZXksIHJvd1ZhbHVlXTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygcm93VmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIShyb3dWYWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgLy8gb2JqZWN07J24IOqyveyasCBKU09O7Jy866GcIOuzgO2ZmFxuICAgICAgICAgIHJldHVybiBbcm93S2V5LCByb3dWYWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBKU09OLnN0cmluZ2lmeShyb3dWYWx1ZSldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbcm93S2V5LCByb3dWYWx1ZV07XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICkgYXMgeyBba2V5IGluIFRdPzogdW5rbm93biB9O1xuXG4gICAgdGFibGUucm93cy5wdXNoKHtcbiAgICAgIHV1aWQsXG4gICAgICAuLi5yb3csXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFVCUmVmID0ge1xuICAgICAgb2Y6IHRhYmxlTmFtZSxcbiAgICAgIHV1aWQ6IChyb3cgYXMgeyB1dWlkPzogc3RyaW5nIH0pLnV1aWQgPz8gdXVpZCxcbiAgICB9O1xuXG4gICAgTmFpdGUudChcInB1cmk6dWItcmVnaXN0ZXJcIiwge1xuICAgICAgdGFibGVOYW1lLFxuICAgICAgdXVpZDogcmVzdWx0LnV1aWQsXG4gICAgICBpc1V1aWRSZXVzZWQ6IGlzUmV1c2VkLFxuICAgICAgcm93LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIHVwc2VydDxUVGFibGUgZXh0ZW5kcyBUYWJsZU5hbWU8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+PihcbiAgICB3ZGI6IEtuZXgsXG4gICAgdGFibGVOYW1lOiBUVGFibGUsXG4gICAgb3B0aW9ucz86IFVwc2VydE9wdGlvbnM8VFRhYmxlPixcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcInVwc2VydFwiLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydE9ubHk8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPERhdGFiYXNlU2NoZW1hRXh0ZW5kPj4oXG4gICAgd2RiOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICAgIG9wdGlvbnM/OiBJbnNlcnRPbmx5T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcImluc2VydFwiLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIHVwc2VydE9ySW5zZXJ0PFRUYWJsZSBleHRlbmRzIFRhYmxlTmFtZTxEYXRhYmFzZVNjaGVtYUV4dGVuZD4+KFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IFRUYWJsZSxcbiAgICBtb2RlOiBcInVwc2VydFwiIHwgXCJpbnNlcnRcIixcbiAgICBvcHRpb25zPzogVXBzZXJ0T3B0aW9uczxUVGFibGU+LFxuICApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgaWYgKHRoaXMuaGFzVGFibGUodGFibGVOYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICh0YWJsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQg7YWM7J2067iUICR7dGFibGVOYW1lfeyXkCB1cHNlcnQg7JqU7LKtYCk7XG4gICAgfSBlbHNlIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhYmxlTmFtZX3sl5AgdXBzZXJ0IO2VoCDrjbDsnbTthLDqsIAg7JeG7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRhYmxlLnJvd3Muc29tZSgocm93KSA9PlxuICAgICAgICBPYmplY3QuZW50cmllcyhyb3cpLnNvbWUoKFssIHZhbHVlXSkgPT4gaXNSZWZGaWVsZCh2YWx1ZSkgJiYgdmFsdWUub2YgIT09IHRhYmxlTmFtZSksXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfSDtlbTqsrDrkJjsp4Ag7JWK7J2AIOywuOyhsOqwgCDsnojsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8g7KCE7LK0IO2FjOydtOu4lCDsiJztmoztlZjsl6wg7ZiE7J6sIO2FjOydtOu4lCDssLjsobDtlZjripQg66qo65OgIO2FjOydtOu4lCDstpTstpxcbiAgICBjb25zdCB7IHJlZmVyZW5jZXMsIHJlZlRhYmxlcyB9ID0gQXJyYXkuZnJvbSh0aGlzLnRhYmxlcykucmVkdWNlKFxuICAgICAgKHIsIFssIHRhYmxlXSkgPT4ge1xuICAgICAgICBjb25zdCByZWZlcmVuY2UgPSBBcnJheS5mcm9tKHRhYmxlLnJlZmVyZW5jZXMudmFsdWVzKCkpLmZpbmQoKHJlZikgPT5cbiAgICAgICAgICByZWYuaW5jbHVkZXMoYCR7dGFibGVOYW1lfS5gKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlZmVyZW5jZSkge1xuICAgICAgICAgIHIucmVmZXJlbmNlcy5wdXNoKHJlZmVyZW5jZSk7XG4gICAgICAgICAgci5yZWZUYWJsZXMucHVzaCh0YWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHJlZmVyZW5jZXM6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgICByZWZUYWJsZXM6IFtdIGFzIFRhYmxlRGF0YVtdLFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IGV4dHJhY3RGaWVsZHMgPSB1bmlxdWUocmVmZXJlbmNlcylcbiAgICAgIC5tYXAoKHJlZmVyZW5jZSkgPT4gcmVmZXJlbmNlLnNwbGl0KFwiLlwiKVsxXSlcbiAgICAgIC5maWx0ZXIoKGZpZWxkKTogZmllbGQgaXMgc3RyaW5nID0+IGZpZWxkICE9PSB1bmRlZmluZWQpO1xuXG4gICAgLy8g7J2Y7KG07ISxIOyInOyEnOyXkCDrlLDrnbwg66CI67Ko67OEIOq3uOujue2ZlCAo7J6Q6riwIOywuOyhsOqwgCDsl4bsnLzrqbQgTGV2ZWwgMCDtlZjrgpgpXG4gICAgY29uc3QgeyBsZXZlbHMsIGhhc0NpcmN1bGFyIH0gPSB0aGlzLmJ1aWxkSW5zZXJ0TGV2ZWxzKHRhYmxlLnJvd3MsIHRhYmxlTmFtZSk7XG5cbiAgICBpZiAoaGFzQ2lyY3VsYXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIOyInO2ZmCDsnpDquLAg7LC47KGw6rCAIOyeiOyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCB1dWlkTWFwID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gICAgY29uc3QgYWxsSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgLy8g66CI67Ko67OE66GcIOyInOywqCDsspjrpqxcbiAgICBmb3IgKGNvbnN0IGxldmVsUm93cyBvZiBsZXZlbHMpIHtcbiAgICAgIC8vIOydtOyghCDroIjrsqjsl5DshJwg7Ja77J2AIElE66GcIOyekOq4sCDssLjsobAg7ZW06rKwXG4gICAgICBjb25zdCByZXNvbHZlZFJvd3MgPSBsZXZlbFJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB7IC4uLnJvdyB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3cpKSB7XG4gICAgICAgICAgaWYgKGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHV1aWRNYXAuZ2V0KHZhbHVlLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoIXBhcmVudCkgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHt2YWx1ZS51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcblxuICAgICAgICAgICAgcmVzb2x2ZWRba2V5XSA9IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3ZhbHVlLnVzZSA/PyBcImlkXCJdO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHZhbHVlLm9mLCB1dWlkOiB2YWx1ZS51dWlkLCB1c2U6IHZhbHVlLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkW2tleV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIO2YhOyerCDroIjrsqggdXBzZXJ0XG4gICAgICBjb25zdCBjaHVua1NpemUgPSBvcHRpb25zPy5jaHVua1NpemU7XG4gICAgICBjb25zdCBsZXZlbENodW5rcyA9IGNodW5rU2l6ZSA/IGNodW5rKHJlc29sdmVkUm93cywgY2h1bmtTaXplKSA6IFtyZXNvbHZlZFJvd3NdO1xuICAgICAgY29uc3Qgc2VsZWN0RmllbGRzID0gdW5pcXVlKFtcImlkXCIsIC4uLmV4dHJhY3RGaWVsZHNdKTtcblxuICAgICAgZm9yIChjb25zdCBkYXRhQ2h1bmsgb2YgbGV2ZWxDaHVua3MpIHtcbiAgICAgICAgaWYgKGRhdGFDaHVuay5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIHV1aWTrpbwg67OE64+E66GcIOuztOq0gO2VmOqzoCwgRELsl5Ag7KCA7J6l7ZWgIOuNsOydtO2EsOyXkOyEnCDsoJzqsbBcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxVdWlkcyA9IGRhdGFDaHVuay5tYXAoKHIpID0+IHIudXVpZCBhcyBzdHJpbmcpO1xuICAgICAgICBjb25zdCBkYXRhRm9yRGIgPSBkYXRhQ2h1bmsubWFwKCh7IHV1aWQsIC4uLnJlc3QgfSkgPT4gcmVzdCk7XG5cbiAgICAgICAgbGV0IHJlc3VsdFJvd3M6IHsgaWQ6IG51bWJlcjsgW2tleTogc3RyaW5nXTogdW5rbm93biB9W107XG5cbiAgICAgICAgaWYgKG1vZGUgPT09IFwiaW5zZXJ0XCIpIHtcbiAgICAgICAgICAvLyBJTlNFUlQg66qo65OcIC0gUkVUVVJOSU5HIOyCrOyaqVxuICAgICAgICAgIHJlc3VsdFJvd3MgPSBhd2FpdCB3ZGIuaW5zZXJ0KGRhdGFGb3JEYikuaW50byh0YWJsZU5hbWUpLnJldHVybmluZyhzZWxlY3RGaWVsZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVQU0VSVCDrqqjrk5wgLSBvbkNvbmZsaWN0IOyCrOyaqSAodW5pcXVlIGluZGV4IOyXhuycvOuptCBQSyBmYWxsYmFjaylcbiAgICAgICAgICBjb25zdCBjb25mbGljdENvbHVtbnMgPVxuICAgICAgICAgICAgdGFibGUudW5pcXVlSW5kZXhlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gdGFibGUudW5pcXVlSW5kZXhlc1swXS5jb2x1bW5zLm1hcCgoYykgPT4gYy5uYW1lKVxuICAgICAgICAgICAgICA6IFtcImlkXCJdO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZUNvbHVtbnMgPSBPYmplY3Qua2V5cyhkYXRhRm9yRGJbMF0pLmZpbHRlcihcbiAgICAgICAgICAgIChjb2wpID0+ICFjb25mbGljdENvbHVtbnMuaW5jbHVkZXMoY29sKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gdXBkYXRlQ29sdW1uc+qwgCDruYTslrTsnojslrTrj4QgbWVyZ2UoKeulvCDsgqzsmqntlZjsl6wg66qo65OgIO2WieydtCBSRVRVUk5JTkfrkJjrj4TroZ0g67O07J6lXG4gICAgICAgICAgY29uc3QgbWVyZ2VDb2x1bW5zID0gdXBkYXRlQ29sdW1ucy5sZW5ndGggPiAwID8gdXBkYXRlQ29sdW1ucyA6IGNvbmZsaWN0Q29sdW1ucztcblxuICAgICAgICAgIHJlc3VsdFJvd3MgPSBhd2FpdCB3ZGJcbiAgICAgICAgICAgIC5pbnNlcnQoZGF0YUZvckRiKVxuICAgICAgICAgICAgLmludG8odGFibGVOYW1lKVxuICAgICAgICAgICAgLm9uQ29uZmxpY3QoY29uZmxpY3RDb2x1bW5zKVxuICAgICAgICAgICAgLm1lcmdlKG1lcmdlQ29sdW1ucylcbiAgICAgICAgICAgIC5yZXR1cm5pbmcoc2VsZWN0RmllbGRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcmlnaW5hbFV1aWRzLmxlbmd0aCAhPT0gcmVzdWx0Um93cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfTogcmVnaXN0ZXIvcmV0dXJuaW5nIOu2iOydvOy5mGApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdXVpZE1hcC5zZXQob3JpZ2luYWxVdWlkc1tpXSwgcmVzdWx0Um93c1tpXSk7XG4gICAgICAgICAgYWxsSWRzLnB1c2gocmVzdWx0Um93c1tpXS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iUIOywuOyhsOulvCDsi6TsoJwg67C466WY66GcIOuzgOqyvVxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgcmVmVGFibGVzKSB7XG4gICAgICB0YWJsZS5yb3dzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyb3cpKSB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IHJvd1trZXldO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHByb3ApICYmIHByb3Aub2YgPT09IHRhYmxlTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdXVpZE1hcC5nZXQocHJvcC51dWlkKTtcbiAgICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocHJvcCk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB1dWlkICR7cHJvcC51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSAocGFyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwcm9wLnVzZSA/PyBcImlkXCJdO1xuICAgICAgICAgICAgcm93W2tleV0gPSByZXNvbHZlZFZhbHVlO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHByb3Aub2YsIHV1aWQ6IHByb3AudXVpZCwgdXNlOiBwcm9wLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkVmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5jbGVhbk9ycGhhbnMpIHtcbiAgICAgIGNvbnN0IGNsZWFuT3JwaGFucyA9IG9wdGlvbnMuY2xlYW5PcnBoYW5zO1xuICAgICAgY29uc3QgZmtDb2x1bW5zID0gaXNBcnJheShjbGVhbk9ycGhhbnMpXG4gICAgICAgID8gKGNsZWFuT3JwaGFucyBhcyBGb3JlaWduS2V5Q29sdW1uczxUVGFibGU+W10pXG4gICAgICAgIDogW2NsZWFuT3JwaGFucyBhcyBGb3JlaWduS2V5Q29sdW1uczxUVGFibGU+XTtcblxuICAgICAgLy8g7ZiE7J6sIHJlZ2lzdGVy65CcIOugiOy9lOuTnOuTpOydmCBGSyDqsJLrk6Qg7LaU7LacXG4gICAgICBjb25zdCBma0NvbmRpdGlvbnMgPSBma0NvbHVtbnMubWFwKChma0NvbCkgPT4ge1xuICAgICAgICBjb25zdCBma1ZhbHVlcyA9IFsuLi5uZXcgU2V0KHRhYmxlLnJvd3MubWFwKChyb3cpID0+IHJvd1tma0NvbF0pLmZpbHRlcigodikgPT4gdiAhPSBudWxsKSldO1xuICAgICAgICByZXR1cm4geyBjb2x1bW46IGZrQ29sLCB2YWx1ZXM6IGZrVmFsdWVzIH07XG4gICAgICB9KTtcblxuICAgICAgLy8g66qo65OgIEZLIOy7rOufvOyXkCDqsJLsnbQg7J6I64qUIOqyveyasOyXkOunjCDsgq3soJwg7Iuk7ZaJXG4gICAgICBpZiAoZmtDb25kaXRpb25zLmV2ZXJ5KChmYykgPT4gZmMudmFsdWVzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgIGxldCBkZWxldGVRdWVyeSA9IHdkYih0YWJsZU5hbWUpO1xuXG4gICAgICAgIC8vIOqwgSBGSyDsu6zrn7zsl5Ag64yA7ZWcIFdIRVJFIElOIOyhsOqxtCDstpTqsIBcbiAgICAgICAgZm9yIChjb25zdCB7IGNvbHVtbiwgdmFsdWVzIH0gb2YgZmtDb25kaXRpb25zKSB7XG4gICAgICAgICAgZGVsZXRlUXVlcnkgPSBkZWxldGVRdWVyeS53aGVyZUluKGNvbHVtbiwgdmFsdWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuwqeq4iCB1cHNlcnTtlZwgSUTripQg7KCc7Jm4XG4gICAgICAgIGRlbGV0ZVF1ZXJ5ID0gZGVsZXRlUXVlcnkud2hlcmVOb3RJbihcImlkXCIsIGFsbElkcyk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlZENvdW50ID0gYXdhaXQgZGVsZXRlUXVlcnkuZGVsZXRlKCk7XG5cbiAgICAgICAgTmFpdGUudChcInB1cmk6dWItY2xlYW4tb3JwaGFuc1wiLCB7XG4gICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgIGNsZWFuT3JwaGFuczogZmtDb2x1bW5zLFxuICAgICAgICAgIGRlbGV0ZWRDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZW064u5IO2FjOydtOu4lOydmCDrjbDsnbTthLAg7LSI6riw7ZmUXG4gICAgdGFibGUucm93cyA9IFtdO1xuICAgIHRhYmxlLnJlZmVyZW5jZXMuY2xlYXIoKTtcbiAgICB0YWJsZS51bmlxdWVzTWFwLmNsZWFyKCk7XG5cbiAgICBOYWl0ZS50KFwicHVyaTp1Yi11cHNlcnRlZFwiLCB7XG4gICAgICB0YWJsZU5hbWUsXG4gICAgICBtb2RlLFxuICAgICAgcm93Q291bnQ6IGFsbElkcy5sZW5ndGgsXG4gICAgICByZXR1cm5lZElkczogYWxsSWRzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFsbElkcztcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUJhdGNoKFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgY2h1bmtTaXplPzogbnVtYmVyO1xuICAgICAgd2hlcmU/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGNodW5rU2l6ZTogb3B0aW9ucz8uY2h1bmtTaXplID8/IDUwMCxcbiAgICAgIHdoZXJlOiBvcHRpb25zPy53aGVyZSA/PyBcImlkXCIsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmhhc1RhYmxlKHRhYmxlTmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZXMuZ2V0KHRhYmxlTmFtZSk7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDrk7HroZ3rkJjsp4Ag7JWK7J2AIO2FjOydtOu4lCAke3RhYmxlTmFtZX3sl5AgdXBkYXRlQmF0Y2gg7JqU7LKtYCk7XG4gICAgfSBlbHNlIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdoZXJlQ29sdW1ucyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy53aGVyZSkgPyBvcHRpb25zLndoZXJlIDogW29wdGlvbnMud2hlcmUgPz8gXCJpZFwiXTtcbiAgICBjb25zdCByb3dzID0gdGFibGUucm93cy5tYXAoKF9yb3cpID0+IHtcbiAgICAgIGNvbnN0IHsgdXVpZDogXywgLi4ucm93IH0gPSBfcm93OyAvLyB1dWlkIOygnOyZuFxuICAgICAgcmV0dXJuIHJvdyBhcyBSb3dXaXRoSWQ8c3RyaW5nPjtcbiAgICB9KTtcblxuICAgIGF3YWl0IGJhdGNoVXBkYXRlKHdkYiwgdGFibGVOYW1lLCB3aGVyZUNvbHVtbnMsIHJvd3MsIG9wdGlvbnMuY2h1bmtTaXplKTtcblxuICAgIE5haXRlLnQoXCJwdXJpOnViLWJhdGNoLXVwZGF0ZWRcIiwge1xuICAgICAgdGFibGVOYW1lLFxuICAgICAgcm93Q291bnQ6IHJvd3MubGVuZ3RoLFxuICAgICAgd2hlcmVDb2x1bW5zLFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlQmF0Y2gg7JmE66OMIO2bhCDsspjrpqzrkJwg642w7J207YSwIOygnOqxsFxuICAgIHRhYmxlLnJvd3MgPSBbXTtcbiAgICB0YWJsZS5yZWZlcmVuY2VzLmNsZWFyKCk7XG4gICAgdGFibGUudW5pcXVlc01hcC5jbGVhcigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcml2YXRlIEhlbHBlciBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogcm93c+ulvCDsnZjsobTshLEg7Iic7ISc7JeQIOuUsOudvCDroIjrsqjrs4TroZwg6re466O57ZmUXG4gICAqIC0g7J6Q6riwIOywuOyhsCDsl4bripQg6rK97JqwIDog66qo65OgIHJvd3PqsIAgTGV2ZWwgMFxuICAgKiAtIOyekOq4sCDssLjsobAg7J6I64qUIOqyveyasCA6IOyekOq4sCDssLjsobAg6rSA6rOE66W8IOychOyDgSDsoJXroKztlZjsl6wg66CI67Ko67OE66GcIOq3uOujue2ZlFxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEluc2VydExldmVscyhcbiAgICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiB7IGxldmVsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXVtdOyBoYXNDaXJjdWxhcjogYm9vbGVhbiB9IHtcbiAgICAvLyAxLiDsnpDquLAg7LC47KGw6rCAIOyXhuycvOuptCDtlZwg66CI67Ko66GcIOyymOumrFxuICAgIGNvbnN0IGhhc1NlbGZSZWYgPSByb3dzXG4gICAgICAuZmxhdE1hcCgocm93KSA9PiBPYmplY3QudmFsdWVzKHJvdykpXG4gICAgICAuc29tZSgodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpO1xuICAgIGlmICghaGFzU2VsZlJlZikgcmV0dXJuIHsgbGV2ZWxzOiBbcm93c10sIGhhc0NpcmN1bGFyOiBmYWxzZSB9O1xuXG4gICAgLy8gMi4gdXVpZCDihpIgcm93IOunpO2VkSAo7KSR67O1IHV1aWQg67Cp7KeAKVxuICAgIGNvbnN0IHJvd0J5VXVpZCA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBjb25zdCB1dWlkID0gcm93LnV1aWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCF1dWlkKSB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkSW5zZXJ0TGV2ZWxzOiB1dWlk6rCAIOyXhuuKlCByb3cgLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICByb3dCeVV1aWQuc2V0KHV1aWQsIHJvdyk7XG4gICAgfVxuXG4gICAgbGV0IHBlbmRpbmcgPSBBcnJheS5mcm9tKHJvd0J5VXVpZC52YWx1ZXMoKSk7XG4gICAgY29uc3QgbGV2ZWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdW10gPSBbXTtcbiAgICBjb25zdCBpbnNlcnRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgLy8gMy4g66CI67Ko67OEIOu2hOulmFxuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICAgICAgY29uc3QgbmV4dFBlbmRpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgcGVuZGluZykge1xuICAgICAgICAvLyDsnbQgcm936rCAIOywuOyhsO2VmOuKlCDsnpDquLAg7LC47KGw65OkXG4gICAgICAgIGNvbnN0IHNlbGZSZWZzID0gT2JqZWN0LnZhbHVlcyhyb3cpLmZpbHRlcihcbiAgICAgICAgICAodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUsXG4gICAgICAgICkgYXMgVUJSZWZbXTtcblxuICAgICAgICAvLyDssLjsobDtlZjripQg66qo65OgIHV1aWTqsIAg7J2066+4IGluc2VydGVk7JeQIOyeiOyWtOyVvCDsnbTrsogg66CI67Ko7JeQIO2PrO2VqFxuICAgICAgICBjb25zdCBjYW5JbnNlcnQgPSBzZWxmUmVmcy5ldmVyeSgocmVmKSA9PiB7XG4gICAgICAgICAgaWYgKCFyb3dCeVV1aWQuaGFzKHJlZi51dWlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHtyZWYudXVpZH0gLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpbnNlcnRlZC5oYXMocmVmLnV1aWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2FuSW5zZXJ0KSB7XG4gICAgICAgICAgY3VycmVudExldmVsLnB1c2gocm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0UGVuZGluZy5wdXNoKHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7Iic7ZmYIOywuOyhsCDqsJDsp4BcbiAgICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID09PSAwKSByZXR1cm4geyBsZXZlbHM6IFtdLCBoYXNDaXJjdWxhcjogdHJ1ZSB9O1xuXG4gICAgICAvLyDroIjrsqgg7ZmV7KCVICsgaW5zZXJ0ZWQg6rCx7IugXG4gICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIGluc2VydGVkLmFkZChyb3cudXVpZCBhcyBzdHJpbmcpO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nID0gbmV4dFBlbmRpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbGV2ZWxzLCBoYXNDaXJjdWxhcjogZmFsc2UgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbInJhbmRvbVVVSUQiLCJpc0FycmF5IiwidW5pcXVlIiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiYXNzZXJ0RGVmaW5lZCIsImNodW5rIiwibm9uTnVsbGFibGUiLCJiYXRjaFVwZGF0ZSIsImlzUmVmRmllbGQiLCJmaWVsZCIsInVuZGVmaW5lZCIsIm9mIiwidXVpZCIsIlVwc2VydEJ1aWxkZXIiLCJ0YWJsZXMiLCJNYXAiLCJnZXRUYWJsZSIsInRhYmxlTmFtZSIsInRhYmxlIiwiZ2V0IiwidGFibGVTcGVjIiwiZ2V0VGFibGVTcGVjIiwidGFibGVEYXRhIiwicmVmZXJlbmNlcyIsIlNldCIsInJvd3MiLCJ1bmlxdWVJbmRleGVzIiwidW5pcXVlc01hcCIsInNldCIsImhhc1RhYmxlIiwiaGFzIiwicmVnaXN0ZXIiLCJyb3ciLCJ1bmlxdWVLZXlzIiwibWFwIiwidW5xSW5kZXgiLCJ1bmlxdWVLZXlBcnJheSIsImNvbHVtbnMiLCJ1bnFDb2wiLCJ2YWwiLCJuYW1lIiwibGVuZ3RoIiwiam9pbiIsImZpbHRlciIsImlzUmV1c2VkIiwidW5pcXVlS2V5IiwiT2JqZWN0IiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwicm93S2V5Iiwicm93VmFsdWUiLCJ1c2UiLCJhZGQiLCJEYXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsInB1c2giLCJyZXN1bHQiLCJ0IiwiaXNVdWlkUmV1c2VkIiwidXBzZXJ0Iiwid2RiIiwib3B0aW9ucyIsInVwc2VydE9ySW5zZXJ0IiwiaW5zZXJ0T25seSIsIm1vZGUiLCJFcnJvciIsInNvbWUiLCJ2YWx1ZSIsInJlZlRhYmxlcyIsIkFycmF5IiwiZnJvbSIsInJlZHVjZSIsInIiLCJyZWZlcmVuY2UiLCJ2YWx1ZXMiLCJmaW5kIiwicmVmIiwiaW5jbHVkZXMiLCJleHRyYWN0RmllbGRzIiwic3BsaXQiLCJsZXZlbHMiLCJoYXNDaXJjdWxhciIsImJ1aWxkSW5zZXJ0TGV2ZWxzIiwidXVpZE1hcCIsImFsbElkcyIsImxldmVsUm93cyIsInJlc29sdmVkUm93cyIsInJlc29sdmVkIiwia2V5IiwicGFyZW50IiwidG8iLCJjaHVua1NpemUiLCJsZXZlbENodW5rcyIsInNlbGVjdEZpZWxkcyIsImRhdGFDaHVuayIsIm9yaWdpbmFsVXVpZHMiLCJkYXRhRm9yRGIiLCJyZXN0IiwicmVzdWx0Um93cyIsImluc2VydCIsImludG8iLCJyZXR1cm5pbmciLCJjb25mbGljdENvbHVtbnMiLCJjIiwidXBkYXRlQ29sdW1ucyIsImtleXMiLCJjb2wiLCJtZXJnZUNvbHVtbnMiLCJvbkNvbmZsaWN0IiwibWVyZ2UiLCJpIiwiaWQiLCJwcm9wIiwiY29uc29sZSIsImVycm9yIiwicmVzb2x2ZWRWYWx1ZSIsImNsZWFuT3JwaGFucyIsImZrQ29sdW1ucyIsImZrQ29uZGl0aW9ucyIsImZrQ29sIiwiZmtWYWx1ZXMiLCJ2IiwiY29sdW1uIiwiZXZlcnkiLCJmYyIsImRlbGV0ZVF1ZXJ5Iiwid2hlcmVJbiIsIndoZXJlTm90SW4iLCJkZWxldGVkQ291bnQiLCJkZWxldGUiLCJjbGVhciIsInJvd0NvdW50IiwicmV0dXJuZWRJZHMiLCJ1cGRhdGVCYXRjaCIsIndoZXJlIiwid2hlcmVDb2x1bW5zIiwiX3JvdyIsIl8iLCJoYXNTZWxmUmVmIiwiZmxhdE1hcCIsInJvd0J5VXVpZCIsInBlbmRpbmciLCJpbnNlcnRlZCIsImN1cnJlbnRMZXZlbCIsIm5leHRQZW5kaW5nIiwic2VsZlJlZnMiLCJjYW5JbnNlcnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVUsUUFBUSxTQUFTO0FBRXBDLFNBQVNDLE9BQU8sRUFBRUMsTUFBTSxRQUFRLFVBQVU7QUFDMUMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUFTQyxLQUFLLFFBQVEsb0JBQWlCO0FBRXZDLFNBQVNDLGFBQWEsRUFBRUMsS0FBSyxFQUFFQyxXQUFXLFFBQVEsb0JBQWlCO0FBQ25FLFNBQVNDLFdBQVcsUUFBd0IscUJBQWtCO0FBbUM5RCxPQUFPLFNBQVNDLFdBQVdDLEtBQWM7SUFDdkMsT0FDRUEsVUFBVUMsYUFDVkQsVUFBVSxRQUNWLEFBQUNBLE9BQWlCRSxPQUFPRCxhQUN6QixBQUFDRCxPQUFpQkcsU0FBU0Y7QUFFL0I7QUFFQSxPQUFPLE1BQU1HO0lBQ1hDLE9BQStCO0lBQy9CLGFBQWM7UUFDWixJQUFJLENBQUNBLE1BQU0sR0FBRyxJQUFJQztJQUNwQjtJQUVBQyxTQUFTQyxTQUFpQixFQUFhO1FBQ3JDLE1BQU1DLFFBQVEsSUFBSSxDQUFDSixNQUFNLENBQUNLLEdBQUcsQ0FBQ0Y7UUFDOUIsSUFBSUMsT0FBTztZQUNULE9BQU9BO1FBQ1Q7UUFFQSxNQUFNRSxZ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
|