sonamu 0.8.13 → 0.8.14

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.
Files changed (96) hide show
  1. package/dist/api/sonamu.d.ts.map +1 -1
  2. package/dist/api/sonamu.js +2 -3
  3. package/dist/auth/auth-generator.d.ts +8 -0
  4. package/dist/auth/auth-generator.d.ts.map +1 -1
  5. package/dist/auth/auth-generator.js +33 -1
  6. package/dist/auth/better-auth-entities.d.ts.map +1 -1
  7. package/dist/auth/better-auth-entities.js +12 -2
  8. package/dist/bin/cli.js +18 -3
  9. package/dist/cone/cone-generator.js +10 -4
  10. package/dist/database/knex.d.ts.map +1 -1
  11. package/dist/database/knex.js +64 -2
  12. package/dist/database/puri.d.ts +9 -1
  13. package/dist/database/puri.d.ts.map +1 -1
  14. package/dist/database/puri.js +42 -1
  15. package/dist/database/puri.types.d.ts +2 -0
  16. package/dist/database/puri.types.d.ts.map +1 -1
  17. package/dist/database/puri.types.js +6 -2
  18. package/dist/entity/entity-manager.d.ts +149 -1
  19. package/dist/entity/entity-manager.d.ts.map +1 -1
  20. package/dist/entity/entity-manager.js +68 -4
  21. package/dist/migration/__tests__/code-generation.search-text.test.js +435 -0
  22. package/dist/migration/code-generation.d.ts.map +1 -1
  23. package/dist/migration/code-generation.js +696 -32
  24. package/dist/migration/migration-set.js +3 -1
  25. package/dist/migration/postgresql-schema-reader.d.ts +16 -2
  26. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  27. package/dist/migration/postgresql-schema-reader.js +281 -7
  28. package/dist/stream/sse.js +5 -3
  29. package/dist/template/__tests__/generated.template.search-text.test.js +99 -0
  30. package/dist/template/generated.template.test-d.js +24 -0
  31. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  32. package/dist/template/implementations/generated.template.js +2 -2
  33. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  34. package/dist/template/implementations/init_types.template.js +11 -3
  35. package/dist/template/zod-converter.d.ts.map +1 -1
  36. package/dist/template/zod-converter.js +6 -2
  37. package/dist/testing/dev-test-routes.d.ts.map +1 -1
  38. package/dist/testing/dev-test-routes.js +5 -3
  39. package/dist/testing/fixture-generator.d.ts +13 -0
  40. package/dist/testing/fixture-generator.d.ts.map +1 -1
  41. package/dist/testing/fixture-generator.js +105 -8
  42. package/dist/testing/fixture-manager.d.ts.map +1 -1
  43. package/dist/testing/fixture-manager.js +19 -2
  44. package/dist/types/__tests__/entity-json-schema-search-text.test.js +256 -0
  45. package/dist/types/types.d.ts +494 -1
  46. package/dist/types/types.d.ts.map +1 -1
  47. package/dist/types/types.js +117 -13
  48. package/dist/ui/api.d.ts.map +1 -1
  49. package/dist/ui/api.js +14 -2
  50. package/dist/ui/cdd-service.d.ts +16 -14
  51. package/dist/ui/cdd-service.d.ts.map +1 -1
  52. package/dist/ui/cdd-service.js +145 -37
  53. package/dist/ui/cdd-types.d.ts +60 -0
  54. package/dist/ui/cdd-types.d.ts.map +1 -0
  55. package/dist/ui/cdd-types.js +3 -0
  56. package/dist/ui-web/assets/index-D4XFBV-f.css +1 -0
  57. package/dist/ui-web/assets/{index-CQ_S40bD.js → index-D_19-Pi4.js} +87 -87
  58. package/dist/ui-web/index.html +2 -2
  59. package/package.json +7 -3
  60. package/src/api/sonamu.ts +1 -2
  61. package/src/auth/auth-generator.ts +38 -0
  62. package/src/auth/better-auth-entities.ts +18 -1
  63. package/src/bin/cli.ts +15 -1
  64. package/src/cone/cone-generator.ts +9 -3
  65. package/src/database/knex.ts +62 -4
  66. package/src/database/puri.ts +71 -0
  67. package/src/database/puri.types.ts +2 -0
  68. package/src/entity/entity-manager.ts +95 -3
  69. package/src/migration/__tests__/code-generation.search-text.test.ts +390 -0
  70. package/src/migration/code-generation.ts +848 -34
  71. package/src/migration/migration-set.ts +2 -0
  72. package/src/migration/postgresql-schema-reader.ts +366 -9
  73. package/src/skills/sonamu/auth-migration.md +80 -0
  74. package/src/skills/sonamu/cdd.md +148 -28
  75. package/src/skills/sonamu/cone.md +16 -0
  76. package/src/skills/sonamu/entity-relations.md +1 -1
  77. package/src/skills/sonamu/fixture-cli.md +4 -0
  78. package/src/skills/sonamu/frontend.md +65 -0
  79. package/src/skills/sonamu/migration.md +3 -1
  80. package/src/skills/sonamu/model.md +28 -0
  81. package/src/skills/sonamu/workflow.md +12 -5
  82. package/src/stream/sse.ts +4 -2
  83. package/src/template/__tests__/generated.template.search-text.test.ts +89 -0
  84. package/src/template/generated.template.test-d.ts +46 -0
  85. package/src/template/implementations/generated.template.ts +4 -1
  86. package/src/template/implementations/init_types.template.ts +20 -5
  87. package/src/template/zod-converter.ts +5 -0
  88. package/src/testing/dev-test-routes.ts +4 -2
  89. package/src/testing/fixture-generator.ts +157 -9
  90. package/src/testing/fixture-manager.ts +15 -1
  91. package/src/types/__tests__/entity-json-schema-search-text.test.ts +179 -0
  92. package/src/types/types.ts +168 -12
  93. package/src/ui/api.ts +24 -1
  94. package/src/ui/cdd-service.ts +195 -55
  95. package/src/ui/cdd-types.ts +73 -0
  96. package/dist/ui-web/assets/index-egkMxKos.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/ui/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAwC/C,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,iBAu3C/D"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/ui/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAgD/C,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,eAAe,iBAs4C/D"}
package/dist/ui/api.js CHANGED
@@ -19,7 +19,7 @@ import { FixtureManager } from "../testing/fixture-manager.js";
19
19
  import { BUILT_IN_TYPE_IDS, TemplateKey } from "../types/types.js";
20
20
  import { nonNullable } from "../utils/utils.js";
21
21
  import { setAiApi } from "./ai-api.js";
22
- import { editContent, getCddTree, openSourceFile, readContent } from "./cdd-service.js";
22
+ import { editContent, editSchema, getCddTree, listSchemas, openSourceFile, readContent, readSchema } from "./cdd-service.js";
23
23
  export async function sonamuUIApiPlugin(fastify) {
24
24
  fastify.register(async (server)=>{
25
25
  // migrator
@@ -1111,6 +1111,18 @@ export async function sonamuUIApiPlugin(fastify) {
1111
1111
  success: true
1112
1112
  };
1113
1113
  });
1114
+ // CDD Schema API
1115
+ server.get("/api/cdd/schemas", async ()=>{
1116
+ return listSchemas();
1117
+ });
1118
+ server.post("/api/cdd/readSchema", async (request)=>{
1119
+ const { schemaKey } = request.body;
1120
+ return readSchema(schemaKey);
1121
+ });
1122
+ server.post("/api/cdd/editSchema", async (request)=>{
1123
+ const { schemaKey } = request.body;
1124
+ return editSchema(schemaKey);
1125
+ });
1114
1126
  // ui-web 빌드 파일 서빙
1115
1127
  const uiDistPath = path.resolve(import.meta.dirname, "../ui-web");
1116
1128
  // 정적 파일 서빙: 루트 폴더 전체 (assets, setting.svg 등)
@@ -1131,4 +1143,4 @@ export async function sonamuUIApiPlugin(fastify) {
1131
1143
  });
1132
1144
  }
1133
1145
 
1134
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgQWRkcmVzc0luZm8gfSBmcm9tIFwibmV0XCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcmFuZ2UgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCLCB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgc29uYW11RGljdGlvbmFyeSB9IGZyb20gXCIuLi9kaWN0L3NvbmFtdS1kaWN0aW9uYXJ5XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgaXNTb0V4Y2VwdGlvbixcbiAgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uLFxufSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIE1pZ3JhdGlvblJlc3VsdCwgTWlncmF0b3IgfSBmcm9tIFwiLi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5pbXBvcnQgeyBTbGFja0NvbmZpcm0sIHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCB9IGZyb20gXCIuLi9taWdyYXRpb24vc2xhY2stY29uZmlybVwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB7IERhdGFFeHBsb3JlciB9IGZyb20gXCIuLi90ZXN0aW5nL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IEZpeHR1cmVHZW5lcmF0b3IgfSBmcm9tIFwiLi4vdGVzdGluZy9maXh0dXJlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgdHlwZSBEdXBsaWNhdGVDaGVja09wdGlvbnMsIEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgdHlwZSBDb25lLFxuICB0eXBlIEVudGl0eUluZGV4LFxuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5U3Vic2V0Um93LFxuICB0eXBlIEZpeHR1cmVSZWNvcmQsXG4gIHR5cGUgRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gIHR5cGUgRmxhdHRlblN1YnNldFJvdyxcbiAgdHlwZSBQYXRoQW5kQ29kZSxcbiAgVGVtcGxhdGVLZXksXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IHNldEFpQXBpIH0gZnJvbSBcIi4vYWktYXBpXCI7XG5pbXBvcnQgeyBlZGl0Q29udGVudCwgZ2V0Q2RkVHJlZSwgb3BlblNvdXJjZUZpbGUsIHJlYWRDb250ZW50IH0gZnJvbSBcIi4vY2RkLXNlcnZpY2VcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNvbmFtdVVJQXBpUGx1Z2luKGZhc3RpZnk6IEZhc3RpZnlJbnN0YW5jZSkge1xuICBmYXN0aWZ5LnJlZ2lzdGVyKFxuICAgIGFzeW5jIChzZXJ2ZXIpID0+IHtcbiAgICAgIC8vIG1pZ3JhdG9yXG4gICAgICBjb25zdCBtaWdyYXRvciA9IG5ldyBNaWdyYXRvcigpO1xuXG4gICAgICAvLyB3YWl0Rm9ySE1SQ29tcGxldGVkXG4gICAgICBhc3luYyBmdW5jdGlvbiB3YWl0Rm9ySE1SQ29tcGxldGVkPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHdhaXRQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBTb25hbXUuc3luY2VyLmV2ZW50RW1pdHRlci5vZmYoXCJvbkhNUkNvbXBsZXRlZFwiLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9LCAxNTAwKTtcblxuICAgICAgICAgIFNvbmFtdS5zeW5jZXIuZXZlbnRFbWl0dGVyLm9uY2UoXCJvbkhNUkNvbXBsZXRlZFwiLCBoYW5kbGVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oKTtcbiAgICAgICAgYXdhaXQgd2FpdFByb21pc2U7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNldEFpQXBpKHNlcnZlcik7XG5cbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL3NvbmFtdS9jb25maWdcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gU29uYW11LmNvbmZpZztcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUXVlcnlzdHJpbmc6IHtcbiAgICAgICAgICBlbnRpdHlJZD86IHN0cmluZztcbiAgICAgICAgICBwcmVzZXQ/OiBcInR5cGVzXCIgfCBcImVudGl0eS5qc29uXCIgfCBcImdlbmVyYXRlZFwiO1xuICAgICAgICAgIGFic1BhdGg/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvdG9vbHMvb3BlblZzY29kZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBwcmVzZXQsIGFic1BhdGggfSA9IHJlcXVlc3QucXVlcnk7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0UGF0aCA9ICgoKSA9PiB7XG4gICAgICAgICAgaWYgKGVudGl0eUlkICYmIHByZXNldCkge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgICAgY29uc3QgeyBuYW1lcyB9ID0gZW50aXR5O1xuXG4gICAgICAgICAgICBjb25zdCB7IGFwaVJvb3RQYXRoIH0gPSBTb25hbXU7XG4gICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9ICgoKSA9PiB7XG4gICAgICAgICAgICAgIHN3aXRjaCAocHJlc2V0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInR5cGVzXCI6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bmFtZXMuZnN9LnR5cGVzLnRzYDtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW50aXR5Lmpzb25cIjpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtuYW1lcy5mc30uZW50aXR5Lmpzb25gO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJnZW5lcmF0ZWRcIjpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtuYW1lcy5mc30uZ2VuZXJhdGVkLnRzYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIHJldHVybiBgJHthcGlSb290UGF0aH0vc3JjL2FwcGxpY2F0aW9uLyR7ZW50aXR5Lm5hbWVzLnBhcmVudEZzfS8ke2ZpbGVuYW1lfWA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghYWJzUGF0aCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5wcmVzZXRPckFic1BhdGhSZXF1aXJlZFwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWJzUGF0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGV4ZWNTeW5jKGBjb2RlICR7dGFyZ2V0UGF0aH1gKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUXVlcnlzdHJpbmc6IHtcbiAgICAgICAgICBvcmlnaW46IHN0cmluZztcbiAgICAgICAgICBlbnRpdHlJZD86IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS90b29scy9nZXRTdWdnZXN0aW9uXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgb3JpZ2luLCBlbnRpdHlJZCB9ID0gcmVxdWVzdC5xdWVyeTtcblxuICAgICAgICAvLyDsuZjtmZgg7Jqp7Ja07KeRXG4gICAgICAgIGNvbnN0IGdsb3NzYXJ5ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oW1xuICAgICAgICAgIFtcInN0YXR1c1wiLCBcIuyDge2DnFwiXSxcbiAgICAgICAgICBbXCJ0eXBlXCIsIFwi7YOA7J6FXCJdLFxuICAgICAgICAgIFtcImltYWdlXCIsIFwi7J2066+47KeAXCJdLFxuICAgICAgICAgIFtcImltYWdlc1wiLCBcIuydtOuvuOyngOumrOyKpO2KuFwiXSxcbiAgICAgICAgICBbXCJ1cmxcIiwgXCJVUkxcIl0sXG4gICAgICAgICAgW1wiaWRcIiwgXCJJRFwiXSxcbiAgICAgICAgICBbXCJuYW1lXCIsIGB7RW50aXR5SUR966qFYF0sXG4gICAgICAgICAgW1widGl0bGVcIiwgXCJ7RW50aXR5SUR966qFXCJdLFxuICAgICAgICAgIFtcInBhcmVudFwiLCBcIuyDgeychHtFbnRpdHlJRH1cIl0sXG4gICAgICAgICAgW1wiZGVzY1wiLCBcIuyEpOuqhVwiXSxcbiAgICAgICAgICBbXCJhdFwiLCBcIuydvOyLnFwiXSxcbiAgICAgICAgICBbXCJjcmVhdGVkXCIsIFwi65Ox66GdXCJdLFxuICAgICAgICAgIFtcInVwZGF0ZWRcIiwgXCLsiJjsoJVcIl0sXG4gICAgICAgICAgW1wiZGVsZXRlZFwiLCBcIuyCreygnFwiXSxcbiAgICAgICAgICBbXCJieVwiLCBcIuycoOyggFwiXSxcbiAgICAgICAgICBbXCJkYXRlXCIsIFwi7J287J6QXCJdLFxuICAgICAgICAgIFtcInRpbWVcIiwgXCLsi5zqsIRcIl0sXG4gICAgICAgICAgW1wia29cIiwgXCIo7ZWc6riAKVwiXSxcbiAgICAgICAgICBbXCJlblwiLCBcIijsmIHrrLgpXCJdLFxuICAgICAgICAgIFtcImtyd1wiLCBcIijsm5ApXCJdLFxuICAgICAgICAgIFtcInVzZFwiLCBcIihVU0QpXCJdLFxuICAgICAgICAgIFtcImNvbG9yXCIsIFwi7Lus65+sXCJdLFxuICAgICAgICAgIFtcImNvZGVcIiwgXCLsvZTrk5xcIl0sXG4gICAgICAgICAgW1wieFwiLCBcIljsooztkZxcIl0sXG4gICAgICAgICAgW1wieVwiLCBcIlnsooztkZxcIl0sXG4gICAgICAgICAgW1wiY3VycmVudFwiLCBcIu2YhOyerFwiXSxcbiAgICAgICAgICBbXCJzdG9ja1wiLCBcIuyerOqzoFwiXSxcbiAgICAgICAgICBbXCJ0b3RhbFwiLCBcIuy0nVwiXSxcbiAgICAgICAgICBbXCJhZG1pblwiLCBcIuq0gOumrOyekFwiXSxcbiAgICAgICAgICBbXCJncm91cFwiLCBcIuq3uOujuVwiXSxcbiAgICAgICAgICBbXCJpdGVtXCIsIFwi7JWE7J207YWcXCJdLFxuICAgICAgICAgIFtcImNudFwiLCBcIuyImOufiVwiXSxcbiAgICAgICAgICBbXCJwcmljZVwiLCBcIuqwgOqyqVwiXSxcbiAgICAgICAgICBbXCJwcmVzZXRcIiwgXCLtlITrpqzshYtcIl0sXG4gICAgICAgICAgW1wiYWNjdFwiLCBcIuqzhOyijFwiXSxcbiAgICAgICAgICBbXCJ0ZWxcIiwgXCLsoITtmZTrsojtmLhcIl0sXG4gICAgICAgICAgW1wibm9cIiwgXCLrsojtmLhcIl0sXG4gICAgICAgICAgW1wiYm9keVwiLCBcIuuCtOyaqVwiXSxcbiAgICAgICAgICBbXCJjb250ZW50XCIsIFwi64K07JqpXCJdLFxuICAgICAgICAgIFtcIm9yZGVybm9cIiwgXCLsoJXroKzsiJzshJxcIl0sXG4gICAgICAgICAgW1wicHJpb3JpdHlcIiwgXCLsmrDshKDsiJzsnIRcIl0sXG4gICAgICAgICAgW1widGV4dFwiLCBcIu2FjeyKpO2KuFwiXSxcbiAgICAgICAgICBbXCJrZXlcIiwgXCLtgqRcIl0sXG4gICAgICAgICAgW1wic3VtXCIsIFwi7ZWp7IKwXCJdLFxuICAgICAgICAgIFtcImV4cGVjdGVkXCIsIFwi7JiI7IOBXCJdLFxuICAgICAgICAgIFtcImFjdHVhbFwiLCBcIuyLpOygnFwiXSxcbiAgICAgICAgXSk7XG4gICAgICAgIC8vIOyghOyytCDsl5Tti7Dti7Ag7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7Ag7YOA7J207YuA6rO8IO2UhOuhrSDshKTrqoXsnYQg7LmY7ZmYIOyaqeyWtOynkeyXkCDstpTqsIBcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpKSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGlmICgoZW50aXR5LnRpdGxlID8/IFwiXCIpICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBnbG9zc2FyeS5zZXQoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGVudGl0eS5pZCksIGVudGl0eS50aXRsZSk7XG4gICAgICAgICAgICBnbG9zc2FyeS5zZXQoXG4gICAgICAgICAgICAgIGluZmxlY3Rpb24udW5kZXJzY29yZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShlbnRpdHkuaWQpKSxcbiAgICAgICAgICAgICAgYCR7ZW50aXR5LnRpdGxlfeumrOyKpO2KuGAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVudGl0eS5wcm9wcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICAgICAgICBpZiAoZ2xvc3NhcnkuaGFzKHByb3AubmFtZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3AuZGVzYykge1xuICAgICAgICAgICAgICBnbG9zc2FyeS5zZXQocHJvcC5uYW1lLCBwcm9wLmRlc2MucmVwbGFjZShlbnRpdHkudGl0bGUgPz8gXCJcIiwgXCJ7RW50aXR5SUR9XCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1Z2dlc3RlZCA9ICgoKSA9PiB7XG4gICAgICAgICAgLy8g64uo7Ja0IOu2hOumrCwg6rCA64ql7ZWcIOyhsO2VqSDsg53shLFcbiAgICAgICAgICBjb25zdCB3b3JkcyA9IG9yaWdpbi5zcGxpdChcIl9cIik7XG4gICAgICAgICAgY29uc3QgY29tYmluYXRpb25zID0gWy4uLnJhbmdlKHdvcmRzLmxlbmd0aCwgMCwgLTEpXS5mbGF0TWFwKChsZW4pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIC4uLnJhbmdlKDAsIHdvcmRzLmxlbmd0aCAtIGxlbiArIDEsIChpZHgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgbGVuLFxuICAgICAgICAgICAgICAgICAgdzogd29yZHMuc2xpY2UoaWR4LCBpZHggKyBsZW4pLmpvaW4oXCJfXCIpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyhsO2VqeydhCDsiJztmoztlZjrqbAsIOy5mO2ZmCDsmqnslrTsp5Hsl5Ag7J6I64qUIOuLqOyWtOqwgCDtj6ztlajrkJwg6rK97JqwLCDsuZjtmZgg7Jqp7Ja066GcIOy5mO2ZmFxuICAgICAgICAgIGNvbnN0IFJFUExBQ0VEX1BSRUZJWCA9IFwiI1JFUExBQ0VELy9cIjsgLy8g7LmY7ZmY65CcIOuLqOyWtOulvCBqb2luIOydtO2bhOyXkOuPhCDsi53rs4TtlZjquLAg7JyE7ZW0IHByZWZpeCDstpTqsIBcbiAgICAgICAgICBsZXQgcmVtYWluQXJyOiBzdHJpbmdbXSA9IFsuLi53b3Jkc107XG4gICAgICAgICAgZm9yIChjb25zdCBjb21iIG9mIGNvbWJpbmF0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgcmVtYWluU3RyID0gcmVtYWluQXJyLmpvaW4oXCJfXCIpO1xuICAgICAgICAgICAgaWYgKHJlbWFpblN0ci5pbmNsdWRlcyhjb21iLncpICYmIGdsb3NzYXJ5Lmhhcyhjb21iLncpKSB7XG4gICAgICAgICAgICAgIHJlbWFpbkFyciA9IHJlbWFpblN0clxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGNvbWIudywgUkVQTEFDRURfUFJFRklYICsgZ2xvc3NhcnkuZ2V0KGNvbWIudykpXG4gICAgICAgICAgICAgICAgLnNwbGl0KFwiX1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmVtYWluQXJyXG4gICAgICAgICAgICAubWFwKChyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyLnN0YXJ0c1dpdGgoUkVQTEFDRURfUFJFRklYKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByLnJlcGxhY2UoUkVQTEFDRURfUFJFRklYLCBcIlwiKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gci50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oXCJcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC97RW50aXR5SUR9L2csIGVudGl0eUlkID8gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnRpdGxlIDogXCJcIik7XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgcmV0dXJuIHsgc3VnZ2VzdGVkIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldChcIi9hcGkvZW50aXR5L2ZpbmRNYW55XCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgICAgICBmdW5jdGlvbiBmbGF0dGVuU3Vic2V0Um93cyhzdWJzZXRSb3dzOiBFbnRpdHlTdWJzZXRSb3dbXSk6IEZsYXR0ZW5TdWJzZXRSb3dbXSB7XG4gICAgICAgICAgcmV0dXJuIHN1YnNldFJvd3MuZmxhdE1hcCgoc3Vic2V0Um93KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGNoaWxkcmVuLCAuLi5zUm93IH0gPSBzdWJzZXRSb3c7XG4gICAgICAgICAgICByZXR1cm4gW3NSb3csIC4uLmZsYXR0ZW5TdWJzZXRSb3dzKGNoaWxkcmVuKV07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRpdGllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGVudGl0eUlkcy5tYXAoKGVudGl0eUlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgICBjb25zdCBzdWJzZXRSb3dzID0gZW50aXR5LmdldFN1YnNldFJvd3MoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uZW50aXR5LFxuICAgICAgICAgICAgICBmbGF0dGVuU3Vic2V0Um93czogZmxhdHRlblN1YnNldFJvd3Moc3Vic2V0Um93cyksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGVudGl0aWVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICBjb25zdCBhSWQgPSBhLnBhcmVudElkID8/IGEuaWQ7XG4gICAgICAgICAgY29uc3QgYklkID0gYi5wYXJlbnRJZCA/PyBiLmlkO1xuICAgICAgICAgIGlmIChhSWQgPCBiSWQpIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAoYUlkID4gYklkKSByZXR1cm4gMTtcbiAgICAgICAgICBpZiAoYUlkID09PSBiSWQpIHtcbiAgICAgICAgICAgIGlmIChhLnBhcmVudElkID09PSB1bmRlZmluZWQpIHJldHVybiAtMTtcbiAgICAgICAgICAgIGlmIChiLnBhcmVudElkID09PSB1bmRlZmluZWQpIHJldHVybiAxO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgZW50aXRpZXMgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUXVlcnlzdHJpbmc6IHtcbiAgICAgICAgICBmaWx0ZXI/OiBcImVudW1zXCIgfCBcInR5cGVzXCI7XG4gICAgICAgICAgcmVsb2FkPzogXCIxXCI7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L3R5cGVJZHNcIiwgYXN5bmMgKHJlcXVlc3QpOiBQcm9taXNlPHsgdHlwZUlkczogc3RyaW5nW10gfT4gPT4ge1xuICAgICAgICBjb25zdCB7IGZpbHRlciwgcmVsb2FkIH0gPSByZXF1ZXN0LnF1ZXJ5O1xuXG4gICAgICAgIGlmIChyZWxvYWQgPT09IFwiMVwiKSB7XG4gICAgICAgICAgYXdhaXQgU29uYW11LnN5bmNlci5hdXRvbG9hZFR5cGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0eXBlSWRzID0gKCgpID0+IHtcbiAgICAgICAgICAvLyDtlITroZzsoJ3tirjsl5DshJwg7KCV7J2Y7ZWcIO2DgOyeheuTpFxuICAgICAgICAgIGNvbnN0IHByb2plY3RUeXBlSWRzID0gT2JqZWN0LmVudHJpZXMoU29uYW11LnN5bmNlci50eXBlcylcbiAgICAgICAgICAgIC5maWx0ZXIoKFtfdHlwZUlkLCB6b2RUeXBlXSkgPT4gKHpvZFR5cGUuX3pvZC5kZWYudHlwZSBhcyBzdHJpbmcpICE9PSBcImVudW1cIilcbiAgICAgICAgICAgIC5tYXAoKFt0eXBlSWQsIF96b2RUeXBlXSkgPT4gdHlwZUlkKTtcblxuICAgICAgICAgIC8vIOuCtOyepSDtg4DsnoXrk6QgKHNvbmFtdSDsvZTslrTsl5DshJwg7KCc6rO1KVxuICAgICAgICAgIGNvbnN0IGJ1aWx0SW5UeXBlSWRzID0gWy4uLkJVSUxUX0lOX1RZUEVfSURTXTtcblxuICAgICAgICAgIC8vIOuqqOuToCDtg4DsnoUg67OR7ZWpXG4gICAgICAgICAgY29uc3QgYWxsVHlwZUlkcyA9IFsuLi5idWlsdEluVHlwZUlkcywgLi4ucHJvamVjdFR5cGVJZHNdO1xuXG4gICAgICAgICAgaWYgKGZpbHRlciA9PT0gXCJ0eXBlc1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsVHlwZUlkcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbnVtSWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5mbGF0TWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChmaWx0ZXIgPT09IFwiZW51bXNcIikge1xuICAgICAgICAgICAgcmV0dXJuIGVudW1JZHM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbLi4uYWxsVHlwZUlkcywgLi4uZW51bUlkc107XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZUlkcyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBmb3JtOiB7XG4gICAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgICAgdGl0bGU6IHN0cmluZztcbiAgICAgICAgICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgICAgICAgICBwYXJlbnRJZD86IHN0cmluZztcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9jcmVhdGVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZm9ybSB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGF3YWl0IFNvbmFtdS5zeW5jZXIuY3JlYXRlRW50aXR5KHsgLi4uZm9ybSwgZW50aXR5SWQ6IGZvcm0uaWQgfSk7XG5cbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvZGVsXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IFNvbmFtdS5zeW5jZXIuZGVsRW50aXR5KGVudGl0eUlkKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBuZXdWYWx1ZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgICAgICAgICB0YWJsZTogc3RyaW5nO1xuICAgICAgICAgICAgcGFyZW50SWQ/OiBzdHJpbmc7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW9kaWZ5RW50aXR5QmFzZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgbmV3VmFsdWVzIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS50aXRsZSA9IG5ld1ZhbHVlcy50aXRsZTtcbiAgICAgICAgICBlbnRpdHkudGFibGUgPSBuZXdWYWx1ZXMudGFibGU7XG4gICAgICAgICAgZW50aXR5LnBhcmVudElkID0gbmV3VmFsdWVzLnBhcmVudElkO1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBzdWJzZXRLZXk6IHN0cmluZztcbiAgICAgICAgICBmaWVsZHM6IHN0cmluZ1tdO1xuICAgICAgICAgIGZpZWxkc0ludGVybmFsPzogc3RyaW5nW107XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L21vZGlmeVN1YnNldFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgc3Vic2V0S2V5LCBmaWVsZHMsIGZpZWxkc0ludGVybmFsIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBmaWVsZHM7XG4gICAgICAgICAgaWYgKGZpZWxkc0ludGVybmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZHNJbnRlcm5hbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGVudGl0eS5zdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA9IGZpZWxkc0ludGVybmFsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVsZXRlIGVudGl0eS5zdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgIHJldHVybiB7IHVwZGF0ZWQ6IGZpZWxkcywgdXBkYXRlZEludGVybmFsOiBmaWVsZHNJbnRlcm5hbCB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIHN1YnNldEtleTogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9kZWxTdWJzZXRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIHN1YnNldEtleSB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBkZWxldGUgZW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgICBkZWxldGUgZW50aXR5LnN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldO1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBuZXdQcm9wOiBFbnRpdHlQcm9wO1xuICAgICAgICAgIGF0PzogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9jcmVhdGVQcm9wXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBhdCwgbmV3UHJvcCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuY3JlYXRlUHJvcChuZXdQcm9wLCBhdCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgbmV3UHJvcDogRW50aXR5UHJvcDtcbiAgICAgICAgICBhdDogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9tb2RpZnlQcm9wXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBhdCwgbmV3UHJvcCB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5tb2RpZnlQcm9wKG5ld1Byb3AsIGF0KTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIGF0OiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2RlbFByb3BcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGF0IH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZW50aXR5LmRlbFByb3AoYXQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIGF0OiBudW1iZXI7XG4gICAgICAgICAgdG86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW92ZVByb3BcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGF0LCB0byB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5tb3ZlUHJvcChhdCwgdG8pO1xuXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgaW5kZXhlczogRW50aXR5SW5kZXhbXTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW9kaWZ5SW5kZXhlc1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgaW5kZXhlcyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkuaW5kZXhlcyA9IGluZGV4ZXM7XG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgIHJldHVybiB7IHVwZGF0ZWQ6IGluZGV4ZXMgfTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBlbnVtTGFiZWxzOiBFbnRpdHlbXCJlbnVtTGFiZWxzXCJdO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9tb2RpZnlFbnVtTGFiZWxzXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBlbnVtTGFiZWxzIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5lbnVtTGFiZWxzID0gZW51bUxhYmVscztcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuIHsgdXBkYXRlZDogZW51bUxhYmVscyB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIG5ld0VudW1JZDogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9jcmVhdGVFbnVtSWRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIG5ld0VudW1JZCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1tuZXdFbnVtSWRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOydtOuvuCDsobTsnqztlZjripQgZW51bUlk7J6F64uI64ukOiAke25ld0VudW1JZH1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVsc1tuZXdFbnVtSWRdID0ge1xuICAgICAgICAgICAgLi4uKG5ld0VudW1JZC5lbmRzV2l0aChcIlN0YXR1c1wiKVxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZTogXCLrhbjstpxcIixcbiAgICAgICAgICAgICAgICAgIGhpZGRlbjogXCLsiKjquYBcIixcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgXCJcIjogXCJcIixcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBlbnVtSWQ6IHtcbiAgICAgICAgICAgIGJlZm9yZTogc3RyaW5nO1xuICAgICAgICAgICAgYWZ0ZXI6IHN0cmluZztcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9tb2RpZnlFbnVtSWRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGVudW1JZCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgICAgICAgY29uc3QgaXNFeGlzdHMgPSBlbnRpdHlJZHMuc29tZSgoZW50aXR5SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVscykuaW5jbHVkZXMoZW51bUlkLmFmdGVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXNFeGlzdHMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7J2066+4IOyhtOyerO2VmOuKlCBFbnVtSWTsnoXri4jri6Q6ICR7ZW51bUlkLmFmdGVyfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVsc1tlbnVtSWQuYWZ0ZXJdID0gZW50aXR5LmVudW1MYWJlbHNbZW51bUlkLmJlZm9yZV07XG4gICAgICAgICAgZGVsZXRlIGVudGl0eS5lbnVtTGFiZWxzW2VudW1JZC5iZWZvcmVdO1xuXG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgIGZvciAoY29uc3QgZW50aXR5SWQgb2YgZW50aXR5SWRzKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICAgICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwiZW51bVwiICYmIHByb3AuaWQgPT09IGVudW1JZC5iZWZvcmUpIHtcbiAgICAgICAgICAgICAgICBwcm9wLmlkID0gZW51bUlkLmFmdGVyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBlbnVtSWQ6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvZGVsZXRlRW51bUlkXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBlbnVtSWQgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgICAgICAgY29uc3QgaXNSZWZlcmVuY2VkID0gZW50aXR5SWRzXG4gICAgICAgICAgICAuZmxhdE1hcCgoZW50aXR5SWQpID0+IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcylcbiAgICAgICAgICAgIC5zb21lKChwcm9wKSA9PiBwcm9wLnR5cGUgPT09IFwiZW51bVwiICYmIHByb3AuaWQgPT09IGVudW1JZCk7XG4gICAgICAgICAgaWYgKGlzUmVmZXJlbmNlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudW1JZH3rpbwg7LC47KGw7ZWY64qUIO2UhOuhnO2NvO2LsOqwgCDsobTsnqztlanri4jri6QuYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGRlbGV0ZSBlbnRpdHkuZW51bUxhYmVsc1tlbnVtSWRdO1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgdGFyZ2V0OiBcImVudGl0eVwiIHwgXCJwcm9wXCIgfCBcImVudW1cIiB8IFwic3Vic2V0XCI7XG4gICAgICAgICAgcHJvcE5hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgZW51bUlkPzogc3RyaW5nO1xuICAgICAgICAgIHN1YnNldEtleT86IHN0cmluZztcbiAgICAgICAgICBjb25lOiBDb25lO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS91cGRhdGVDb25lXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCB0YXJnZXQsIHByb3BOYW1lLCBlbnVtSWQsIHN1YnNldEtleSwgY29uZSB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICAgICAgICAgIGlmICh0YXJnZXQgPT09IFwiZW50aXR5XCIpIHtcbiAgICAgICAgICAgIGVudGl0eS5jb25lID0gY29uZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PT0gXCJwcm9wXCIgJiYgcHJvcE5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICAgICAgICBpZiAocHJvcCkge1xuICAgICAgICAgICAgICAocHJvcCBhcyB7IGNvbmU/OiBDb25lIH0pLmNvbmUgPSBjb25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09PSBcImVudW1cIiAmJiBlbnVtSWQpIHtcbiAgICAgICAgICAgIGVudGl0eS5lbnVtQ29uZXNbZW51bUlkXSA9IGNvbmU7XG4gICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgPT09IFwic3Vic2V0XCIgJiYgc3Vic2V0S2V5KSB7XG4gICAgICAgICAgICBlbnRpdHkuc3Vic2V0Q29uZXNbc3Vic2V0S2V5XSA9IGNvbmU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBwcmVzZXJ2ZUV4aXN0aW5nPzogYm9vbGVhbjtcbiAgICAgICAgICBvbmx5RW1wdHk/OiBib29sZWFuO1xuICAgICAgICAgIGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvZ2VuZXJhdGVDb25lc1wiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIHByZXNlcnZlRXhpc3RpbmcsIG9ubHlFbXB0eSwgbG9jYWxlIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRW50aXR5IOyhtOyerCDsl6zrtoAg7ZmV7J24XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgICAgICAgIC8vIGxvY2FsZSDquLDrs7jqsJI6IFNvbmFtdS5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlIOyCrOyaqVxuICAgICAgICAgICAgY29uc3QgZWZmZWN0aXZlTG9jYWxlID1cbiAgICAgICAgICAgICAgbG9jYWxlID8/IChTb25hbXUuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZSBhcyBcImtvXCIgfCBcImVuXCIgfCBcImphXCIpO1xuXG4gICAgICAgICAgICAvLyBDb25lIOyDneyEsVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgICAgICAgICBwcmVzZXJ2ZUV4aXN0aW5nOiBwcmVzZXJ2ZUV4aXN0aW5nID8/IHRydWUsXG4gICAgICAgICAgICAgIG9ubHlFbXB0eTogb25seUVtcHR5ID8/IGZhbHNlLFxuICAgICAgICAgICAgICBsb2NhbGU6IGVmZmVjdGl2ZUxvY2FsZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuXG4gICAgICAgICAgICAvLyBFbnRpdHkgbm90IGZvdW5kXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhcIuyhtOyerO2VmOyngCDslYrripQgRW50aXR5XCIpKSB7XG4gICAgICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDQpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlJZH1gLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBUEkg7YKkIOyXhuydjFxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCJBTlRIUk9QSUNfQVBJX0tFWSBub3QgZm91bmRcIikpIHtcbiAgICAgICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgZXJyb3I6IFwiQVBJIGtleSBub3QgY29uZmlndXJlZFwiLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSYXRlIGxpbWl0XG4gICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhcIlJhdGUgbGltaXQgZXhjZWVkZWRcIikpIHtcbiAgICAgICAgICAgICAgcmVwbHkuc3RhdHVzKDQyOSk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgZXJyb3I6IFwiUmF0ZSBsaW1pdCBleGNlZWRlZC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIixcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8g6riw7YOAIOyXkOufrFxuICAgICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGBDb25lIGdlbmVyYXRpb24gZmFpbGVkOiAke21lc3NhZ2V9YCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUXVlcnlzdHJpbmc6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9nZXRUYWJsZUNvbHVtbnNcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBlbnRpdHlJZCB9ID0gcmVxdWVzdC5xdWVyeTtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gZW50aXR5LmdldFRhYmxlQ29sdW1ucygpO1xuICAgICAgICByZXR1cm4geyBjb2x1bW5zIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldChcIi9hcGkvbWlncmF0aW9ucy9zdGF0dXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKTtcblxuICAgICAgICByZXR1cm4geyBzdGF0dXMgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIiB8IFwic2hhZG93XCI7XG4gICAgICAgICAgdGFyZ2V0czogKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdO1xuICAgICAgICAgIGZvcmNlPzogYm9vbGVhbjtcbiAgICAgICAgICBmb3JjZVJlYXNvbj86IHN0cmluZztcbiAgICAgICAgICByZXF1ZXN0b3I/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcbiAgICAgICAgXCIvYXBpL21pZ3JhdGlvbnMvcnVuQWN0aW9uXCIsXG4gICAgICAgIGFzeW5jIChyZXF1ZXN0KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQgfCBTbGFja0NvbmZpcm1QZW5kaW5nUmVzdWx0PiA9PiB7XG4gICAgICAgICAgY29uc3QgeyBhY3Rpb24sIHRhcmdldHMsIGZvcmNlLCBmb3JjZVJlYXNvbiwgcmVxdWVzdG9yIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgICBpZiAoYWN0aW9uID09PSBcInNoYWRvd1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbWlncmF0b3IucnVuU2hhZG93VGVzdCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNsYWNrIOyKueyduCDssrTtgawgKGFwcGx5IOyLnOyXkOunjClcbiAgICAgICAgICBpZiAoYWN0aW9uID09PSBcImFwcGx5XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNsYWNrQ29uZmlybSA9IG5ldyBTbGFja0NvbmZpcm0oKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVzQXBwcm92YWwgPSB0YXJnZXRzLnNvbWUoKHQpID0+IHNsYWNrQ29uZmlybS5pc1RhcmdldFJlcXVpcmVzQXBwcm92YWwodCkpO1xuXG4gICAgICAgICAgICAvLyDroZzsu6wgRELsnbgg6rK97JqwIOyKueyduCDsiqTtgrVcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsSG9zdHMgPSBbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdO1xuICAgICAgICAgICAgY29uc3QgaXNMb2NhbFRhcmdldCA9IHRhcmdldHMuZXZlcnkoKHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0YXJnZXRDb25maWcgPSBTb25hbXUuZGJDb25maWdbdGFyZ2V0XTtcbiAgICAgICAgICAgICAgY29uc3QgaG9zdCA9ICh0YXJnZXRDb25maWc/LmNvbm5lY3Rpb24gYXMgeyBob3N0Pzogc3RyaW5nIH0pPy5ob3N0ID8/IFwibG9jYWxob3N0XCI7XG4gICAgICAgICAgICAgIHJldHVybiBsb2NhbEhvc3RzLmluY2x1ZGVzKGhvc3QudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHJlcXVpcmVzQXBwcm92YWwgJiYgc2xhY2tDb25maXJtLmlzQ29uZmlndXJlZCgpICYmICFpc0xvY2FsVGFyZ2V0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgY29ubnMgfSA9IGF3YWl0IG1pZ3JhdG9yLmdldFN0YXR1cygpO1xuXG4gICAgICAgICAgICAgIC8vIOuqqOuToCDtg4Dqsp8gRELsl5DshJwgcGVuZGluZ+yduCDrp4jsnbTqt7jroIjsnbTshZjsnZgg7ZWp7KeR7ZWp7J2EIOq1rO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ01pZ3JhdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgICAgICAgICAgIGNvbm5zXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGNvbm4pID0+IHRhcmdldHMuaW5jbHVkZXMoY29ubi5jb25uS2V5IGFzIGtleW9mIFNvbmFtdURCQ29uZmlnKSlcbiAgICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoKGNvbm4pID0+IGNvbm4ucGVuZGluZyksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICBpZiAocGVuZGluZ01pZ3JhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIOq4sOyhtCDsirnsnbgg7JqU7LKtIO2ZleyduFxuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc2xhY2tDb25maXJtLmdldEV4aXN0aW5nUmVxdWVzdChwZW5kaW5nTWlncmF0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICAgIC8vIOq4sOyhtCDsmpTssq3snbQg7J6I7Jy866m0IOyKueyduCDsg4Htg5wg7ZmV7J24XG4gICAgICAgICAgICAgICAgICBjb25zdCB7IGFwcHJvdmVkLCByZWplY3RlZCB9ID0gYXdhaXQgc2xhY2tDb25maXJtLmNoZWNrQXBwcm92YWwoXG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnRzLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGFwcHJvdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOyKueyduOuQqCDihpIg7Iuk7ZaJXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihhY3Rpb24sIHRhcmdldHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBzbGFja0NvbmZpcm0ubG9nRXhlY3V0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IubWlncmF0aW9uUmVqZWN0ZWRcIikpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSDsp4TtlolcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xhY2tDb25maXJtLmZvcmNlQXBwcm92YWwoXG4gICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy50cyxcbiAgICAgICAgICAgICAgICAgICAgICBmb3JjZVJlYXNvbiA/PyBcIuyCrOycoCDsl4bsnYxcIixcbiAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0b3IsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihhY3Rpb24sIHRhcmdldHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBzbGFja0NvbmZpcm0ubG9nRXhlY3V0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOuMgOq4sOykkVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwicGVuZGluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6IGV4aXN0aW5nLmNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgICAgdHM6IGV4aXN0aW5nLnRzLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyDsg4gg7Iq57J24IOyalOyyrSDrsJzshqFcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHsgY2hhbm5lbCwgdHMgfSA9IGF3YWl0IHNsYWNrQ29uZmlybS5wb3N0QXBwcm92YWxSZXF1ZXN0KFxuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nTWlncmF0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cyxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdG9yLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHNsYWNrQ29uZmlybS5zYXZlUmVxdWVzdChwZW5kaW5nTWlncmF0aW9ucywgY2hhbm5lbCwgdHMpO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInBlbmRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgdHMsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBtaWdyYXRvci5ydW5BY3Rpb24oYWN0aW9uLCB0YXJnZXRzKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGNoYW5uZWw6IHN0cmluZztcbiAgICAgICAgICB0czogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL21pZ3JhdGlvbnMvY2hlY2tBcHByb3ZhbFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGNoYW5uZWwsIHRzIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIGNvbnN0IHNsYWNrQ29uZmlybSA9IG5ldyBTbGFja0NvbmZpcm0oKTtcblxuICAgICAgICBpZiAoIXNsYWNrQ29uZmlybS5pc0NvbmZpZ3VyZWQoKSkge1xuICAgICAgICAgIHJldHVybiB7IGFwcHJvdmVkOiB0cnVlLCByZWplY3RlZDogZmFsc2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzbGFja0NvbmZpcm0uY2hlY2tBcHByb3ZhbChjaGFubmVsLCB0cyk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgY2hhbm5lbDogc3RyaW5nO1xuICAgICAgICAgIHRzOiBzdHJpbmc7XG4gICAgICAgICAgcmVhc29uOiBzdHJpbmc7XG4gICAgICAgICAgcmVxdWVzdG9yPzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL21pZ3JhdGlvbnMvZm9yY2VBcHByb3ZhbFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGNoYW5uZWwsIHRzLCByZWFzb24sIHJlcXVlc3RvciB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICBjb25zdCBzbGFja0NvbmZpcm0gPSBuZXcgU2xhY2tDb25maXJtKCk7XG5cbiAgICAgICAgaWYgKCFzbGFja0NvbmZpcm0uaXNDb25maWd1cmVkKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNsYWNrQ29uZmlybS5mb3JjZUFwcHJvdmFsKGNoYW5uZWwsIHRzLCByZWFzb24sIHJlcXVlc3Rvcik7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBjb2RlTmFtZXM6IHN0cmluZ1tdO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL21pZ3JhdGlvbnMvZGVsQ29kZXNcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb2RlTmFtZXMgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG1pZ3JhdG9yLmRlbENvZGVzKGNvZGVOYW1lcyk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3QoXCIvYXBpL21pZ3JhdGlvbnMvZ2VuZXJhdGVQcmVwYXJlZENvZGVzXCIsIGFzeW5jIChfcmVxdWVzdHQpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG1pZ3JhdG9yLmdlbmVyYXRlUHJlcGFyZWRDb2RlcygpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkczogc3RyaW5nW107XG4gICAgICAgICAgdGVtcGxhdGVLZXlzOiBzdHJpbmdbXTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9zY2FmZm9sZGluZy9nZXRTdGF0dXNcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBlbnRpdHlJZHMsIHRlbXBsYXRlS2V5czogX3RlbXBsYXRlS2V5cyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICBpZiAoKGVudGl0eUlkcyA/PyBbXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IuZW50aXR5SWRzUmVxdWlyZWRcIikpO1xuICAgICAgICB9IGVsc2UgaWYgKChfdGVtcGxhdGVLZXlzID8/IFtdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci50ZW1wbGF0ZUtleXNSZXF1aXJlZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzb3J0aW5nXG4gICAgICAgIGVudGl0eUlkcy5zb3J0KChhLCBiKSA9PiAoYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApKTtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVLZXlzID0gVGVtcGxhdGVLZXkub3B0aW9ucy5maWx0ZXIoKHRrKSA9PiBfdGVtcGxhdGVLZXlzLmluY2x1ZGVzKHRrKSk7XG5cbiAgICAgICAgY29uc3QgY29tYmluYXRpb25zID0gZW50aXR5SWRzLmZsYXRNYXAoKGVudGl0eUlkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlS2V5cy5tYXAoKHRlbXBsYXRlS2V5KSA9PiBbZW50aXR5SWQsIHRlbXBsYXRlS2V5XSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgY29tYmluYXRpb25zLm1hcChhc3luYyAoW2VudGl0eUlkLCB0ZW1wbGF0ZUtleV0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgc3ViUGF0aCwgZnVsbFBhdGgsIGlzRXhpc3RzIH0gPSBhd2FpdCBTb25hbXUuc3luY2VyLmNoZWNrRXhpc3RzR2VuQ29kZShcbiAgICAgICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgICAgIHRlbXBsYXRlS2V5IGFzIFRlbXBsYXRlS2V5LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgICB0ZW1wbGF0ZUtleSxcbiAgICAgICAgICAgICAgc3ViUGF0aCxcbiAgICAgICAgICAgICAgZnVsbFBhdGgsXG4gICAgICAgICAgICAgIGlzRXhpc3RzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzZXMgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgdGVtcGxhdGVLZXk6IHN0cmluZztcbiAgICAgICAgICAgIGVudW1JZD86IHN0cmluZztcbiAgICAgICAgICAgIG92ZXJ3cml0ZT86IGJvb2xlYW47XG4gICAgICAgICAgfVtdO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NjYWZmb2xkaW5nL2dlbmVyYXRlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgb3B0aW9ucyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5vcHRpb25zUmVxdWlyZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMS4g66qo65OgIO2FnO2UjOumv+yXkOyEnCDtlYTsmpTtlZwgZGljdCDtgqTrpbwg7IiY7KeRXG4gICAgICAgIGNvbnN0IGtleXMgPSBvcHRpb25zLmZsYXRNYXAoKHsgdGVtcGxhdGVLZXkgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGVNYW5hZ2VyLmdldCh0ZW1wbGF0ZUtleSk7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlLmdldFJlcXVpcmVkRGljdEtleXMoKSA/PyBbXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gMi4gdGFyZ2V067OE66GcIGVuc3VyZURpY3RLZXlzIO2YuOy2nCAo7Iic7LCoIOyymOumrClcbiAgICAgICAgYXdhaXQgc29uYW11RGljdGlvbmFyeS5lbnN1cmVEaWN0S2V5cyhbLi4ubmV3IFNldChrZXlzKV0pO1xuXG4gICAgICAgIC8vIDMuIO2FnO2UjOumvyDsg53shLEgKOuzkeugrCDsspjrpqwpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIG9wdGlvbnMubWFwKGFzeW5jICh7IGVudGl0eUlkLCB0ZW1wbGF0ZUtleSwgZW51bUlkLCBvdmVyd3JpdGUgfSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUtleSBhcyBUZW1wbGF0ZUtleSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICAgICAgICAgIGVudW1JZCxcbiAgICAgICAgICAgICAgICB9IGFzIHtcbiAgICAgICAgICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICBlbnVtSWQ/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBvdmVyd3JpdGUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgaWYgKGlzU29FeGNlcHRpb24oZSkgJiYgZS5zdGF0dXNDb2RlID09PSA1NDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmZpbHRlcihub25OdWxsYWJsZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5hbGxGaWxlc0dlbmVyYXRlZFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBvcHRpb246IHtcbiAgICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgICB0ZW1wbGF0ZUtleTogc3RyaW5nO1xuICAgICAgICAgICAgZW51bUlkPzogc3RyaW5nO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvc2NhZmZvbGRpbmcvcHJldmlld1wiLCBhc3luYyAocmVxdWVzdCk6IFByb21pc2U8eyBwYXRoQW5kQ29kZXM6IFBhdGhBbmRDb2RlW10gfT4gPT4ge1xuICAgICAgICBjb25zdCB7IG9wdGlvbiB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyB0ZW1wbGF0ZUtleSwgLi4udGVtcGxhdGVPcHRpb25zIH0gPSBvcHRpb247XG4gICAgICAgICAgY29uc3QgcGF0aEFuZENvZGVzID0gYXdhaXQgU29uYW11LnN5bmNlci5yZW5kZXJUZW1wbGF0ZShcbiAgICAgICAgICAgIHRlbXBsYXRlS2V5IGFzIFRlbXBsYXRlS2V5LFxuICAgICAgICAgICAgdGVtcGxhdGVPcHRpb25zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4geyBwYXRoQW5kQ29kZXMgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0KFwiL2FwaS9maXh0dXJlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc291cmNlREIsIHRhcmdldERCLCBzZWFyY2gsIGR1cGxpY2F0ZUNoZWNrIH0gPSByZXF1ZXN0LmJvZHkgYXMge1xuICAgICAgICAgIHNvdXJjZURCOiBrZXlvZiBTb25hbXVEQkNvbmZpZztcbiAgICAgICAgICB0YXJnZXREQjoga2V5b2YgU29uYW11REJDb25maWc7XG4gICAgICAgICAgc2VhcmNoOiBGaXh0dXJlU2VhcmNoT3B0aW9ucztcbiAgICAgICAgICBkdXBsaWNhdGVDaGVjaz86IER1cGxpY2F0ZUNoZWNrT3B0aW9ucztcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gRml4dHVyZU1hbmFnZXIuZ2V0Rml4dHVyZXMoc291cmNlREIsIHRhcmdldERCLCBzZWFyY2gsIGR1cGxpY2F0ZUNoZWNrKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdChcIi9hcGkvZml4dHVyZS9pbXBvcnRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBkYiwgZml4dHVyZXMgfSA9IHJlcXVlc3QuYm9keSBhcyB7XG4gICAgICAgICAgZGI6IGtleW9mIFNvbmFtdURCQ29uZmlnO1xuICAgICAgICAgIGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW107XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKGRiLCBmaXh0dXJlcyk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3QoXCIvYXBpL2ZpeHR1cmUvYWRkRml4dHVyZUxvYWRlclwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGNvZGUgfSA9IHJlcXVlc3QuYm9keSBhcyB7IGNvZGU6IHN0cmluZyB9O1xuXG4gICAgICAgIHJldHVybiBGaXh0dXJlTWFuYWdlci5hZGRGaXh0dXJlTG9hZGVyKGNvZGUpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL2kxOG4vZGljdGlvbmFyeVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBzb25hbXVEaWN0aW9uYXJ5LmdldERpY3Rpb25hcnkoKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS9pMThuL2V4cG9ydFwiLCBhc3luYyAoX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZmlsZW5hbWUsIGJ1ZmZlciB9ID0gYXdhaXQgc29uYW11RGljdGlvbmFyeS5leHBvcnRUb0V4Y2VsKCk7XG4gICAgICAgIHJlcGx5XG4gICAgICAgICAgLmhlYWRlcihcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCIsXG4gICAgICAgICAgICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0XCIsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5oZWFkZXIoXCJDb250ZW50LURpc3Bvc2l0aW9uXCIsIGBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiR7ZmlsZW5hbWV9XCJgKVxuICAgICAgICAgIC5zZW5kKGJ1ZmZlcik7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3QoXCIvYXBpL2kxOG4vaW1wb3J0XCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXF1ZXN0LmZpbGUoKTtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IuZmlsZU5vdFVwbG9hZGVkXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBkYXRhLnRvQnVmZmVyKCk7XG4gICAgICAgIHJldHVybiBzb25hbXVEaWN0aW9uYXJ5LmltcG9ydEZyb21FeGNlbChidWZmZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIG9sZEtleTogc3RyaW5nO1xuICAgICAgICAgIG5ld0tleTogc3RyaW5nO1xuICAgICAgICAgIHNvdXJjZTogXCJlbnRpdHlcIiB8IFwicHJvamVjdFwiIHwgXCJzb25hbXVcIjtcbiAgICAgICAgICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvaTE4bi91cGRhdGVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgYXdhaXQgc29uYW11RGljdGlvbmFyeS51cGRhdGVFbnRyeShyZXF1ZXN0LmJvZHkpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAga2V5OiBzdHJpbmc7XG4gICAgICAgICAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2kxOG4vY3JlYXRlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuY3JlYXRlRW50cnkocmVxdWVzdC5ib2R5KTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGtleTogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2kxOG4vZGVsZXRlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuZGVsZXRlRW50cnkocmVxdWVzdC5ib2R5LmtleSk7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsga2V5czogc3RyaW5nW10gfSB9PihcIi9hcGkvaTE4bi9jaGVja1VzYWdlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBzb25hbXVEaWN0aW9uYXJ5LmNoZWNrVXNhZ2UocmVxdWVzdC5ib2R5LmtleXMpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRhc2tzIEFQSVxuICAgICAgc2VydmVyLmdldChcIi9hcGkvdGFza3Mvc3RhdHVzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBTb25hbXUud29ya2Zsb3dzO1xuICAgICAgICAgIHJldHVybiB7IGFjdGl2ZTogdHJ1ZSB9O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS90YXNrcy93b3JrZmxvd0RlZmluaXRpb25zXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZGVmaW5pdGlvbnMgPSBTb25hbXUud29ya2Zsb3dzLndvcmtmbG93RGVmaW5pdGlvbnM7XG4gICAgICAgIHJldHVybiB7IGRlZmluaXRpb25zIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldDx7XG4gICAgICAgIFF1ZXJ5c3RyaW5nOiB7XG4gICAgICAgICAgbGltaXQ/OiBzdHJpbmc7XG4gICAgICAgICAgYWZ0ZXI/OiBzdHJpbmc7XG4gICAgICAgICAgYmVmb3JlPzogc3RyaW5nO1xuICAgICAgICAgIG9yZGVyPzogXCJhc2NcIiB8IFwiZGVzY1wiO1xuICAgICAgICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAgICAgICB3b3JrZmxvd05hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgY3JlYXRlZEFmdGVyPzogc3RyaW5nO1xuICAgICAgICAgIGNyZWF0ZWRCZWZvcmU/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvdGFza3Mvd29ya2Zsb3dSdW5zXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGJhY2tlbmQgPSBTb25hbXUud29ya2Zsb3dzLmJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHsgbGltaXQsIGFmdGVyLCBiZWZvcmUsIG9yZGVyLCBzdGF0dXMsIHdvcmtmbG93TmFtZSwgY3JlYXRlZEFmdGVyLCBjcmVhdGVkQmVmb3JlIH0gPVxuICAgICAgICAgIHJlcXVlc3QucXVlcnk7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLmxpc3RXb3JrZmxvd1J1bnMoe1xuICAgICAgICAgIGxpbWl0OiBsaW1pdCA/IE51bWJlci5wYXJzZUludChsaW1pdCwgMTApIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGFmdGVyLFxuICAgICAgICAgIGJlZm9yZSxcbiAgICAgICAgICBvcmRlcixcbiAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA/IHN0YXR1cy5zcGxpdChcIixcIikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvd05hbWUgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGNyZWF0ZWRBZnRlcjogY3JlYXRlZEFmdGVyID8gbmV3IERhdGUoY3JlYXRlZEFmdGVyKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjcmVhdGVkQmVmb3JlOiBjcmVhdGVkQmVmb3JlID8gbmV3IERhdGUoY3JlYXRlZEJlZm9yZSkgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQ8e1xuICAgICAgICBQYXJhbXM6IHsgaWQ6IHN0cmluZyB9O1xuICAgICAgfT4oXCIvYXBpL3Rhc2tzL3dvcmtmbG93UnVucy86aWRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgYmFja2VuZCA9IFNvbmFtdS53b3JrZmxvd3MuYmFja2VuZDtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dSdW4gPSBhd2FpdCBiYWNrZW5kLmdldFdvcmtmbG93UnVuKHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiByZXF1ZXN0LnBhcmFtcy5pZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghd29ya2Zsb3dSdW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdvcmtmbG93IHJ1biBub3QgZm91bmQ6ICR7cmVxdWVzdC5wYXJhbXMuaWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdvcmtmbG93UnVuO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgUGFyYW1zOiB7IGlkOiBzdHJpbmcgfTtcbiAgICAgIH0+KFwiL2FwaS90YXNrcy93b3JrZmxvd1J1bnMvOmlkL2NhbmNlbFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBiYWNrZW5kID0gU29uYW11LndvcmtmbG93cy5iYWNrZW5kO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5jYW5jZWxXb3JrZmxvd1J1bih7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcmVxdWVzdC5wYXJhbXMuaWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgUGFyYW1zOiB7IGlkOiBzdHJpbmcgfTtcbiAgICAgIH0+KFwiL2FwaS90YXNrcy93b3JrZmxvd1J1bnMvOmlkL3BhdXNlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGJhY2tlbmQgPSBTb25hbXUud29ya2Zsb3dzLmJhY2tlbmQ7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLnBhdXNlV29ya2Zsb3dSdW4oe1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJlcXVlc3QucGFyYW1zLmlkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIFBhcmFtczogeyBpZDogc3RyaW5nIH07XG4gICAgICB9PihcIi9hcGkvdGFza3Mvd29ya2Zsb3dSdW5zLzppZC9yZXN1bWVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgYmFja2VuZCA9IFNvbmFtdS53b3JrZmxvd3MuYmFja2VuZDtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQucmVzdW1lV29ya2Zsb3dSdW4oe1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJlcXVlc3QucGFyYW1zLmlkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUGFyYW1zOiB7IGlkOiBzdHJpbmcgfTtcbiAgICAgICAgUXVlcnlzdHJpbmc6IHtcbiAgICAgICAgICBsaW1pdD86IHN0cmluZztcbiAgICAgICAgICBhZnRlcj86IHN0cmluZztcbiAgICAgICAgICBiZWZvcmU/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvdGFza3Mvd29ya2Zsb3dSdW5zLzppZC9zdGVwc1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBiYWNrZW5kID0gU29uYW11LndvcmtmbG93cy5iYWNrZW5kO1xuICAgICAgICBjb25zdCB7IGxpbWl0LCBhZnRlciwgYmVmb3JlIH0gPSByZXF1ZXN0LnF1ZXJ5O1xuICAgICAgICByZXR1cm4gYmFja2VuZC5saXN0U3RlcEF0dGVtcHRzKHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiByZXF1ZXN0LnBhcmFtcy5pZCxcbiAgICAgICAgICBsaW1pdDogbGltaXQgPyBOdW1iZXIucGFyc2VJbnQobGltaXQsIDEwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBhZnRlcixcbiAgICAgICAgICBiZWZvcmUsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8qKlxuICAgICAgICogSGVhbHRoIENoZWNrIEFQSVxuICAgICAgICogTUNQIOuPhOq1rOqwgCBTb25hbXUg7ISc67KE66W8IOyekOuPmSDqsJDsp4DtlZjquLAg7JyE7ZWcIOyXlOuTnO2PrOyduO2KuFxuICAgICAgICovXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS9zb25hbXUvaGVhbHRoXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSByZXF1ZXN0LnNlcnZlci5zZXJ2ZXIuYWRkcmVzcygpO1xuICAgICAgICBjb25zdCBwb3J0ID0gYWRkcmVzcyAmJiB0eXBlb2YgYWRkcmVzcyA9PT0gXCJvYmplY3RcIiA/IChhZGRyZXNzIGFzIEFkZHJlc3NJbmZvKS5wb3J0IDogMDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgIHByb2plY3Q6IHByb2Nlc3MuY3dkKCkuc3BsaXQoXCIvXCIpLnBvcCgpIHx8IFwidW5rbm93blwiLFxuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgLyoqXG4gICAgICAgKiBGaXh0dXJlIOyDneyEsSBBUElcbiAgICAgICAqL1xuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5OiBzdHJpbmc7XG4gICAgICAgICAgY291bnQ/OiBudW1iZXI7XG4gICAgICAgICAgb3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgdGFyZ2V0RGI/OiBcImZpeHR1cmVcIiB8IFwidGVzdFwiO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NvbmFtdS9maXh0dXJlL2dlbmVyYXRlXCIsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB7IGVudGl0eSwgY291bnQgPSAxLCBvdmVycmlkZXMsIHRhcmdldERiID0gXCJmaXh0dXJlXCIgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAvLyDtg4Dqsp8gREIg7ISk7KCVIOqwgOyguOyYpOq4sFxuICAgICAgICBjb25zdCBkYkNvbmZpZyA9IHRhcmdldERiID09PSBcImZpeHR1cmVcIiA/IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlIDogU29uYW11LmRiQ29uZmlnLnRlc3Q7XG5cbiAgICAgICAgLy8gS25leCDsnbjsiqTthLTsiqQg7IOd7ISxXG4gICAgICAgIGNvbnN0IGRiID0gY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEZpeHR1cmVHZW5lcmF0b3Ig7IOd7ISxXG4gICAgICAgICAgY29uc3QgZ2VuZXJhdG9yID0gbmV3IEZpeHR1cmVHZW5lcmF0b3IoZGIsIGRiLCB0YXJnZXREYiwgRW50aXR5TWFuYWdlcik7XG5cbiAgICAgICAgICAvLyDri6jsnbwgRW50aXR5IOuwsOy5mCDsg53shLFcbiAgICAgICAgICBjb25zdCBmaXh0dXJlcyA9IGF3YWl0IGdlbmVyYXRvci5nZW5lcmF0ZUJhdGNoKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgICBjb3VudCxcbiAgICAgICAgICAgICAgb3ZlcnJpZGVzOiBvdmVycmlkZXMgPz8ge30sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICBjb3VudDogZml4dHVyZXMubGVuZ3RoLFxuICAgICAgICAgICAgZml4dHVyZXMsXG4gICAgICAgICAgICB0YXJnZXREYixcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIEZpeHR1cmUg642w7J207YSwIO2DkOyDiSBBUElcbiAgICAgICAqL1xuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5OiBzdHJpbmc7XG4gICAgICAgICAgc3RyYXRlZ3k6IFwic2FtcGxlXCIgfCBcInJlY2VudFwiIHwgXCJyYW5kb21cIiB8IFwicXVlcnlcIjtcbiAgICAgICAgICBsaW1pdD86IG51bWJlcjtcbiAgICAgICAgICB3aGVyZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NvbmFtdS9maXh0dXJlL2V4cGxvcmVcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZW50aXR5LCBzdHJhdGVneSwgbGltaXQgPSAxMCwgd2hlcmUgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAvLyBGaXh0dXJlIERCIOyEpOyglSDqsIDsoLjsmKTquLBcbiAgICAgICAgY29uc3QgZml4dHVyZURiQ29uZmlnID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmU7XG5cbiAgICAgICAgLy8gS25leCDsnbjsiqTthLTsiqQg7IOd7ISxXG4gICAgICAgIGNvbnN0IGZpeHR1cmVEYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShmaXh0dXJlRGJDb25maWcpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRGF0YUV4cGxvcmVyIOyDneyEsVxuICAgICAgICAgIGNvbnN0IGV4cGxvcmVyID0gbmV3IERhdGFFeHBsb3JlcihmaXh0dXJlRGIsIEVudGl0eU1hbmFnZXIpO1xuXG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGV4cGxvcmVyLmV4cGxvcmUoZW50aXR5LCB7XG4gICAgICAgICAgICBzdHJhdGVneSxcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgd2hlcmUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICAgICAgY291bnQ6IGRhdGEubGVuZ3RoLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhd2FpdCBmaXh0dXJlRGIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLyoqXG4gICAgICAgKiBGaXh0dXJlIOuNsOydtO2EsCDqsIDsoLjsmKTquLAgKGZldGNoKSBBUElcbiAgICAgICAqIHByb2R1Y3Rpb24vZGV2ZWxvcG1lbnQgRELsl5DshJwg7Iuk7KCcIOuNsOydtO2EsOulvCBmaXh0dXJlIERC66GcIGltcG9ydFxuICAgICAgICovXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHk6IHN0cmluZztcbiAgICAgICAgICBzdHJhdGVneT86IFwic2FtcGxlXCIgfCBcInJlY2VudFwiIHwgXCJyYW5kb21cIiB8IFwicXVlcnlcIjtcbiAgICAgICAgICBsaW1pdD86IG51bWJlcjtcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zPzogYm9vbGVhbjtcbiAgICAgICAgICBtYXhEZXB0aD86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9zb25hbXUvZml4dHVyZS9mZXRjaFwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICBzdHJhdGVneSA9IFwicmVjZW50XCIsXG4gICAgICAgICAgbGltaXQgPSAxMCxcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zID0gdHJ1ZSxcbiAgICAgICAgICBtYXhEZXB0aCA9IDIsXG4gICAgICAgIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgLy8gU291cmNlIERCIChwcm9kdWN0aW9uL2RldmVsb3BtZW50KSAtIOydveq4sCDsoITsmqlcbiAgICAgICAgY29uc3Qgc291cmNlRGIgPSBEQi5nZXREQihcInJcIik7XG5cbiAgICAgICAgLy8gVGFyZ2V0IERCIChmaXh0dXJlKVxuICAgICAgICBjb25zdCBmaXh0dXJlRGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRml4dHVyZUdlbmVyYXRvciDsg53shLFcbiAgICAgICAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihzb3VyY2VEYiwgZml4dHVyZURiLCBcImZpeHR1cmVcIiwgRW50aXR5TWFuYWdlcik7XG5cbiAgICAgICAgICAvLyBwcm9kdWN0aW9uIOuNsOydtO2EsOulvCBmaXh0dXJlIERC66GcIGltcG9ydFxuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBnZW5lcmF0b3IuaW1wb3J0RnJvbVNvdXJjZShlbnRpdHksIHtcbiAgICAgICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zLFxuICAgICAgICAgICAgbWF4RGVwdGgsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICAgICAgY291bnQ6IHJlc3VsdHMubGVuZ3RoLFxuICAgICAgICAgICAgaW1wb3J0ZWQ6IHJlc3VsdHMsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDAwKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgLy8gc291cmNlRGLripQgU29uYW116rCAIOq0gOumrO2VmOuvgOuhnCBkZXN0cm957ZWY7KeAIOyViuydjFxuICAgICAgICAgIGF3YWl0IGZpeHR1cmVEYi5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIEZpeHR1cmUg642w7J207YSwIOyCreygnCAoY2xlYW4pIEFQSVxuICAgICAgICogRksg7Iic7ISc66W8IOqzoOugpO2VmOyXrCDslYjsoITtlZjqsowg7IKt7KCcXG4gICAgICAgKi9cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0aWVzPzogc3RyaW5nW107XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvc29uYW11L2ZpeHR1cmUvY2xlYW5cIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZW50aXRpZXMgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAvLyBGaXh0dXJlIERCIOyXsOqysFxuICAgICAgICBjb25zdCBmaXh0dXJlRGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g7IKt7KCc7ZWgIEVudGl0eSDrqqnroZ0g6rKw7KCVXG4gICAgICAgICAgY29uc3QgdGFyZ2V0RW50aXRpZXMgPVxuICAgICAgICAgICAgZW50aXRpZXMgJiYgZW50aXRpZXMubGVuZ3RoID4gMCA/IGVudGl0aWVzIDogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgICAgICAgIC8vIEVudGl0eSBJROulvCDthYzsnbTruJTrqoXsnLzroZwg67OA7ZmYIChzbmFrZV9jYXNlIOuzteyImO2YlSlcbiAgICAgICAgICBjb25zdCB0YWJsZU5hbWVzID0gdGFyZ2V0RW50aXRpZXMubWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGVudGl0eS50YWJsZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFBvc3RncmVTUUw6IFRSVU5DQVRFIENBU0NBREXroZwgRksg7Iic7IScIOustOq0gO2VmOqyjCDslYjsoITtlZjqsowg7IKt7KCcXG4gICAgICAgICAgLy8gQ0FTQ0FERSDsmLXshZjsnLzroZwg7J2Y7KG07ISxIOyeiOuKlCDrjbDsnbTthLDrj4Qg7ZWo6ruYIOyCreygnFxuICAgICAgICAgIGF3YWl0IGZpeHR1cmVEYi5yYXcoXG4gICAgICAgICAgICBgVFJVTkNBVEUgVEFCTEUgJHt0YWJsZU5hbWVzLm1hcCgodCkgPT4gYFwiJHt0fVwiYCkuam9pbihcIiwgXCIpfSBSRVNUQVJUIElERU5USVRZIENBU0NBREVgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGNsZWFuZWQ6IHRhYmxlTmFtZXMsXG4gICAgICAgICAgICBjb3VudDogdGFibGVOYW1lcy5sZW5ndGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDAwKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYXdhaXQgZml4dHVyZURiLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENERCBBUElcbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL2NkZC90cmVlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldENkZFRyZWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgZmlsZVBhdGg6IHN0cmluZyB9IH0+KFwiL2FwaS9jZGQvcmVhZENvbnRlbnRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBmaWxlUGF0aCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICByZXR1cm4gcmVhZENvbnRlbnQoZmlsZVBhdGgpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHsgQm9keTogeyBmaWxlUGF0aDogc3RyaW5nIH0gfT4oXCIvYXBpL2NkZC9lZGl0Q29udGVudFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGZpbGVQYXRoIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIHJldHVybiBlZGl0Q29udGVudChmaWxlUGF0aCk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGZpbGVQYXRoOiBzdHJpbmcgfSB9PihcIi9hcGkvY2RkL29wZW5Tb3VyY2VcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBmaWxlUGF0aCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICBvcGVuU291cmNlRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyB1aS13ZWIg67mM65OcIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IHVpRGlzdFBhdGggPSBwYXRoLnJlc29sdmUoaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLi91aS13ZWJcIik7XG5cbiAgICAgIC8vIOygleyggSDtjIzsnbwg7ISc67mZOiDro6jtirgg7Y+0642UIOyghOyytCAoYXNzZXRzLCBzZXR0aW5nLnN2ZyDrk7EpXG4gICAgICBzZXJ2ZXIucmVnaXN0ZXIoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvc3RhdGljXCIpLCB7XG4gICAgICAgIHJvb3Q6IHVpRGlzdFBhdGgsXG4gICAgICAgIHByZWZpeDogXCIvXCIsXG4gICAgICAgIGRlY29yYXRlUmVwbHk6IGZhbHNlLFxuICAgICAgICB3aWxkY2FyZDogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgLy8gU1BBIGZhbGxiYWNrIC0g7KCV7KCBIO2MjOydvOydtCDsl4bripQg66qo65OgIOqyveuhnOuKlCBpbmRleC5odG1s66GcXG4gICAgICBzZXJ2ZXIuZ2V0KFwiKlwiLCBhc3luYyAoX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIHJlcGx5LmhlYWRlcnMoeyBcIkNvbnRlbnQtdHlwZVwiOiBcInRleHQvaHRtbFwiIH0pLnNlbmQoXG4gICAgICAgICAgZnNcbiAgICAgICAgICAgIC5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHVpRGlzdFBhdGgsIFwiaW5kZXguaHRtbFwiKSlcbiAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAucmVwbGFjZShcInt7cHJvamVjdE5hbWV9fVwiLCBTb25hbXUuY29uZmlnLnByb2plY3ROYW1lID8/IFwiVW5rbm93blNvbmFtdVByb2plY3RcIiksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHsgcHJlZml4OiBcIi9zb25hbXUtdWlcIiB9LFxuICApO1xufVxuIl0sIm5hbWVzIjpbImV4ZWNTeW5jIiwiZnMiLCJpbmZsZWN0aW9uIiwicGF0aCIsInJhbmdlIiwiU29uYW11IiwiREIiLCJjcmVhdGVLbmV4SW5zdGFuY2UiLCJTRCIsInNvbmFtdURpY3Rpb25hcnkiLCJFbnRpdHlNYW5hZ2VyIiwiQmFkUmVxdWVzdEV4Y2VwdGlvbiIsImlzU29FeGNlcHRpb24iLCJTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24iLCJNaWdyYXRvciIsIlNsYWNrQ29uZmlybSIsIlRlbXBsYXRlTWFuYWdlciIsIkRhdGFFeHBsb3JlciIsIkZpeHR1cmVHZW5lcmF0b3IiLCJGaXh0dXJlTWFuYWdlciIsIkJVSUxUX0lOX1RZUEVfSURTIiwiVGVtcGxhdGVLZXkiLCJub25OdWxsYWJsZSIsInNldEFpQXBpIiwiZWRpdENvbnRlbnQiLCJnZXRDZGRUcmVlIiwib3BlblNvdXJjZUZpbGUiLCJyZWFkQ29udGVudCIsInNvbmFtdVVJQXBpUGx1Z2luIiwiZmFzdGlmeSIsInJlZ2lzdGVyIiwic2VydmVyIiwibWlncmF0b3IiLCJ3YWl0Rm9ySE1SQ29tcGxldGVkIiwiZm4iLCJ3YWl0UHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwiaGFuZGxlciIsImNsZWFyVGltZW91dCIsInRpbWVvdXQiLCJzZXRUaW1lb3V0Iiwic3luY2VyIiwiZXZlbnRFbWl0dGVyIiwib2ZmIiwib25jZSIsInJlc3VsdCIsImdldCIsImNvbmZpZyIsInJlcXVlc3QiLCJlbnRpdHlJZCIsInByZXNldCIsImFic1BhdGgiLCJxdWVyeSIsInRhcmdldFBhdGgiLCJlbnRpdHkiLCJuYW1lcyIsImFwaVJvb3RQYXRoIiwiZmlsZW5hbWUiLCJwYXJlbnRGcyIsIm9yaWdpbiIsImdsb3NzYXJ5IiwiTWFwIiwiZ2V0QWxsSWRzIiwidGl0bGUiLCJzZXQiLCJ1bmRlcnNjb3JlIiwiaWQiLCJwbHVyYWxpemUiLCJwcm9wcyIsImZvckVhY2giLCJwcm9wIiwiaGFzIiwibmFtZSIsImRlc2MiLCJyZXBsYWNlIiwic3VnZ2VzdGVkIiwid29yZHMiLCJzcGxpdCIsImNvbWJpbmF0aW9ucyIsImxlbmd0aCIsImZsYXRNYXAiLCJsZW4iLCJpZHgiLCJ3Iiwic2xpY2UiLCJqb2luIiwiUkVQTEFDRURfUFJFRklYIiwicmVtYWluQXJyIiwiY29tYiIsInJlbWFpblN0ciIsImluY2x1ZGVzIiwibWFwIiwiciIsInN0YXJ0c1dpdGgiLCJ0b1VwcGVyQ2FzZSIsImVudGl0eUlkcyIsImZsYXR0ZW5TdWJzZXRSb3dzIiwic3Vic2V0Um93cyIsInN1YnNldFJvdyIsImNoaWxkcmVuIiwic1JvdyIsImVudGl0aWVzIiwiYWxsIiwiZ2V0U3Vic2V0Um93cyIsInNvcnQiLCJhIiwiYiIsImFJZCIsInBhcmVudElkIiwiYklkIiwidW5kZWZpbmVkIiwiZmlsdGVyIiwicmVsb2FkIiwiYXV0b2xvYWRUeXBlcyIsInR5cGVJZHMiLCJwcm9qZWN0VHlwZUlkcyIsIk9iamVjdCIsImVudHJpZXMiLCJ0eXBlcyIsIl90eXBlSWQiLCJ6b2RUeXBlIiwiX3pvZCIsImRlZiIsInR5cGUiLCJ0eXBlSWQiLCJfem9kVHlwZSIsImJ1aWx0SW5UeXBlSWRzIiwiYWxsVHlwZUlkcyIsImVudW1JZHMiLCJrZXlzIiwiZW51bUxhYmVscyIsInBvc3QiLCJmb3JtIiwiYm9keSIsImNyZWF0ZUVudGl0eSIsImRlbEVudGl0eSIsIm5ld1ZhbHVlcyIsInRhYmxlIiwic2F2ZSIsInN1YnNldEtleSIsImZpZWxkcyIsImZpZWxkc0ludGVybmFsIiwic3Vic2V0cyIsInN1YnNldHNJbnRlcm5hbCIsInVwZGF0ZWQiLCJ1cGRhdGVkSW50ZXJuYWwiLCJhdCIsIm5ld1Byb3AiLCJjcmVhdGVQcm9wIiwibW9kaWZ5UHJvcCIsImRlbFByb3AiLCJ0byIsIm1vdmVQcm9wIiwiaW5kZXhlcyIsIm5ld0VudW1JZCIsIkVycm9yIiwiZW5kc1dpdGgiLCJhY3RpdmUiLCJoaWRkZW4iLCJlbnVtSWQiLCJpc0V4aXN0cyIsInNvbWUiLCJhZnRlciIsImJlZm9yZSIsImlzUmVmZXJlbmNlZCIsInRhcmdldCIsInByb3BOYW1lIiwiY29uZSIsImZpbmQiLCJwIiwiZW51bUNvbmVzIiwic3Vic2V0Q29uZXMiLCJyZXBseSIsInByZXNlcnZlRXhpc3RpbmciLCJvbmx5RW1wdHkiLCJsb2NhbGUiLCJlZmZlY3RpdmVMb2NhbGUiLCJpMThuIiwiZGVmYXVsdExvY2FsZSIsImdlbmVyYXRlQ29uZXMiLCJlcnJvciIsIm1lc3NhZ2UiLCJTdHJpbmciLCJzdGF0dXMiLCJzdWNjZXNzIiwiY29sdW1ucyIsImdldFRhYmxlQ29sdW1ucyIsImdldFN0YXR1cyIsImFjdGlvbiIsInRhcmdldHMiLCJmb3JjZSIsImZvcmNlUmVhc29uIiwicmVxdWVzdG9yIiwicnVuU2hhZG93VGVzdCIsInNsYWNrQ29uZmlybSIsInJlcXVpcmVzQXBwcm92YWwiLCJ0IiwiaXNUYXJnZXRSZXF1aXJlc0FwcHJvdmFsIiwibG9jYWxIb3N0cyIsImlzTG9jYWxUYXJnZXQiLCJldmVyeSIsInRhcmdldENvbmZpZyIsImRiQ29uZmlnIiwiaG9zdCIsImNvbm5lY3Rpb24iLCJ0b0xvd2VyQ2FzZSIsImlzQ29uZmlndXJlZCIsImNvbm5zIiwicGVuZGluZ01pZ3JhdGlvbnMiLCJTZXQiLCJjb25uIiwiY29ubktleSIsInBlbmRpbmciLCJleGlzdGluZyIsImdldEV4aXN0aW5nUmVxdWVzdCIsImFwcHJvdmVkIiwicmVqZWN0ZWQiLCJjaGVja0FwcHJvdmFsIiwiY2hhbm5lbCIsInRzIiwicnVuQWN0aW9uIiwibG9nRXhlY3V0aW9uIiwiZm9yY2VBcHByb3ZhbCIsInBvc3RBcHByb3ZhbFJlcXVlc3QiLCJzYXZlUmVxdWVzdCIsInJlYXNvbiIsImNvZGVOYW1lcyIsImRlbENvZGVzIiwiX3JlcXVlc3R0IiwiZ2VuZXJhdGVQcmVwYXJlZENvZGVzIiwidGVtcGxhdGVLZXlzIiwiX3RlbXBsYXRlS2V5cyIsIm9wdGlvbnMiLCJ0ayIsInRlbXBsYXRlS2V5Iiwic3RhdHVzZXMiLCJzdWJQYXRoIiwiZnVsbFBhdGgiLCJjaGVja0V4aXN0c0dlbkNvZGUiLCJ0ZW1wbGF0ZSIsImdldFJlcXVpcmVkRGljdEtleXMiLCJlbnN1cmVEaWN0S2V5cyIsIm92ZXJ3cml0ZSIsImdlbmVyYXRlVGVtcGxhdGUiLCJlIiwic3RhdHVzQ29kZSIsImNvbnNvbGUiLCJvcHRpb24iLCJ0ZW1wbGF0ZU9wdGlvbnMiLCJwYXRoQW5kQ29kZXMiLCJyZW5kZXJUZW1wbGF0ZSIsInNvdXJjZURCIiwidGFyZ2V0REIiLCJzZWFyY2giLCJkdXBsaWNhdGVDaGVjayIsImdldEZpeHR1cmVzIiwiZGIiLCJmaXh0dXJlcyIsImluc2VydEZpeHR1cmVzIiwiY29kZSIsImFkZEZpeHR1cmVMb2FkZXIiLCJnZXREaWN0aW9uYXJ5IiwiX3JlcXVlc3QiLCJidWZmZXIiLCJleHBvcnRUb0V4Y2VsIiwiaGVhZGVyIiwic2VuZCIsImRhdGEiLCJmaWxlIiwidG9CdWZmZXIiLCJpbXBvcnRGcm9tRXhjZWwiLCJ1cGRhdGVFbnRyeSIsImNyZWF0ZUVudHJ5IiwiZGVsZXRlRW50cnkiLCJrZXkiLCJjaGVja1VzYWdlIiwid29ya2Zsb3dzIiwiZGVmaW5pdGlvbnMiLCJ3b3JrZmxvd0RlZmluaXRpb25zIiwiYmFja2VuZCIsImxpbWl0Iiwib3JkZXIiLCJ3b3JrZmxvd05hbWUiLCJjcmVhdGVkQWZ0ZXIiLCJjcmVhdGVkQmVmb3JlIiwibGlzdFdvcmtmbG93UnVucyIsIk51bWJlciIsInBhcnNlSW50IiwiRGF0ZSIsIndvcmtmbG93UnVuIiwiZ2V0V29ya2Zsb3dSdW4iLCJ3b3JrZmxvd1J1bklkIiwicGFyYW1zIiwiY2FuY2VsV29ya2Zsb3dSdW4iLCJwYXVzZVdvcmtmbG93UnVuIiwicmVzdW1lV29ya2Zsb3dSdW4iLCJsaXN0U3RlcEF0dGVtcHRzIiwiYWRkcmVzcyIsInBvcnQiLCJvayIsInByb2plY3QiLCJwcm9jZXNzIiwiY3dkIiwicG9wIiwidGltZXN0YW1wIiwidG9JU09TdHJpbmciLCJjb3VudCIsIm92ZXJyaWRlcyIsInRhcmdldERiIiwiZml4dHVyZSIsInRlc3QiLCJnZW5lcmF0b3IiLCJnZW5lcmF0ZUJhdGNoIiwiZGVzdHJveSIsInN0cmF0ZWd5Iiwid2hlcmUiLCJmaXh0dXJlRGJDb25maWciLCJmaXh0dXJlRGIiLCJleHBsb3JlciIsImV4cGxvcmUiLCJpbmNsdWRlUmVsYXRpb25zIiwibWF4RGVwdGgiLCJzb3VyY2VEYiIsImdldERCIiwicmVzdWx0cyIsImltcG9ydEZyb21Tb3VyY2UiLCJpbXBvcnRlZCIsInRhcmdldEVudGl0aWVzIiwidGFibGVOYW1lcyIsInJhdyIsImNsZWFuZWQiLCJmaWxlUGF0aCIsInVpRGlzdFBhdGgiLCJkaXJuYW1lIiwicm9vdCIsInByZWZpeCIsImRlY29yYXRlUmVwbHkiLCJ3aWxkY2FyZCIsImhlYWRlcnMiLCJyZWFkRmlsZVN5bmMiLCJ0b1N0cmluZyIsInByb2plY3ROYW1lIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLFFBQVEsZ0JBQWdCO0FBRXpDLE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxnQkFBZ0IsYUFBYTtBQUVwQyxPQUFPQyxVQUFVLE9BQU87QUFDeEIsU0FBU0MsS0FBSyxRQUFRLFVBQVU7QUFDaEMsU0FBU0MsTUFBTSxRQUFRLG1CQUFnQjtBQUN2QyxTQUFTQyxFQUFFLFFBQTZCLG9CQUFpQjtBQUN6RCxTQUFTQyxrQkFBa0IsUUFBUSxzQkFBbUI7QUFDdEQsU0FBU0MsRUFBRSxRQUFRLGdCQUFhO0FBQ2hDLFNBQVNDLGdCQUFnQixRQUFRLCtCQUE0QjtBQUU3RCxTQUFTQyxhQUFhLFFBQVEsOEJBQTJCO0FBQ3pELFNBQ0VDLG1CQUFtQixFQUNuQkMsYUFBYSxFQUNiQywyQkFBMkIsUUFDdEIsaUNBQThCO0FBQ3JDLFNBQStCQyxRQUFRLFFBQVEsMkJBQXdCO0FBQ3ZF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
1146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB0eXBlIHsgQWRkcmVzc0luZm8gfSBmcm9tIFwibmV0XCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgcmFuZ2UgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IERCLCB0eXBlIFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBjcmVhdGVLbmV4SW5zdGFuY2UgfSBmcm9tIFwiLi4vZGF0YWJhc2Uva25leFwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vZGljdC9zZFwiO1xuaW1wb3J0IHsgc29uYW11RGljdGlvbmFyeSB9IGZyb20gXCIuLi9kaWN0L3NvbmFtdS1kaWN0aW9uYXJ5XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgaXNTb0V4Y2VwdGlvbixcbiAgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uLFxufSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIE1pZ3JhdGlvblJlc3VsdCwgTWlncmF0b3IgfSBmcm9tIFwiLi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5pbXBvcnQgeyBTbGFja0NvbmZpcm0sIHR5cGUgU2xhY2tDb25maXJtUGVuZGluZ1Jlc3VsdCB9IGZyb20gXCIuLi9taWdyYXRpb24vc2xhY2stY29uZmlybVwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB7IERhdGFFeHBsb3JlciB9IGZyb20gXCIuLi90ZXN0aW5nL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IEZpeHR1cmVHZW5lcmF0b3IgfSBmcm9tIFwiLi4vdGVzdGluZy9maXh0dXJlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgdHlwZSBEdXBsaWNhdGVDaGVja09wdGlvbnMsIEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgdHlwZSBDb25lLFxuICB0eXBlIEVudGl0eUluZGV4LFxuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5U3Vic2V0Um93LFxuICB0eXBlIEZpeHR1cmVSZWNvcmQsXG4gIHR5cGUgRml4dHVyZVNlYXJjaE9wdGlvbnMsXG4gIHR5cGUgRmxhdHRlblN1YnNldFJvdyxcbiAgdHlwZSBQYXRoQW5kQ29kZSxcbiAgVGVtcGxhdGVLZXksXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IHNldEFpQXBpIH0gZnJvbSBcIi4vYWktYXBpXCI7XG5pbXBvcnQge1xuICBlZGl0Q29udGVudCxcbiAgZWRpdFNjaGVtYSxcbiAgZ2V0Q2RkVHJlZSxcbiAgbGlzdFNjaGVtYXMsXG4gIG9wZW5Tb3VyY2VGaWxlLFxuICByZWFkQ29udGVudCxcbiAgcmVhZFNjaGVtYSxcbn0gZnJvbSBcIi4vY2RkLXNlcnZpY2VcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNvbmFtdVVJQXBpUGx1Z2luKGZhc3RpZnk6IEZhc3RpZnlJbnN0YW5jZSkge1xuICBmYXN0aWZ5LnJlZ2lzdGVyKFxuICAgIGFzeW5jIChzZXJ2ZXIpID0+IHtcbiAgICAgIC8vIG1pZ3JhdG9yXG4gICAgICBjb25zdCBtaWdyYXRvciA9IG5ldyBNaWdyYXRvcigpO1xuXG4gICAgICAvLyB3YWl0Rm9ySE1SQ29tcGxldGVkXG4gICAgICBhc3luYyBmdW5jdGlvbiB3YWl0Rm9ySE1SQ29tcGxldGVkPFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IHdhaXRQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBTb25hbXUuc3luY2VyLmV2ZW50RW1pdHRlci5vZmYoXCJvbkhNUkNvbXBsZXRlZFwiLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9LCAxNTAwKTtcblxuICAgICAgICAgIFNvbmFtdS5zeW5jZXIuZXZlbnRFbWl0dGVyLm9uY2UoXCJvbkhNUkNvbXBsZXRlZFwiLCBoYW5kbGVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oKTtcbiAgICAgICAgYXdhaXQgd2FpdFByb21pc2U7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNldEFpQXBpKHNlcnZlcik7XG5cbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL3NvbmFtdS9jb25maWdcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gU29uYW11LmNvbmZpZztcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUXVlcnlzdHJpbmc6IHtcbiAgICAgICAgICBlbnRpdHlJZD86IHN0cmluZztcbiAgICAgICAgICBwcmVzZXQ/OiBcInR5cGVzXCIgfCBcImVudGl0eS5qc29uXCIgfCBcImdlbmVyYXRlZFwiO1xuICAgICAgICAgIGFic1BhdGg/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvdG9vbHMvb3BlblZzY29kZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBwcmVzZXQsIGFic1BhdGggfSA9IHJlcXVlc3QucXVlcnk7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0UGF0aCA9ICgoKSA9PiB7XG4gICAgICAgICAgaWYgKGVudGl0eUlkICYmIHByZXNldCkge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgICAgY29uc3QgeyBuYW1lcyB9ID0gZW50aXR5O1xuXG4gICAgICAgICAgICBjb25zdCB7IGFwaVJvb3RQYXRoIH0gPSBTb25hbXU7XG4gICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9ICgoKSA9PiB7XG4gICAgICAgICAgICAgIHN3aXRjaCAocHJlc2V0KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInR5cGVzXCI6XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYCR7bmFtZXMuZnN9LnR5cGVzLnRzYDtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW50aXR5Lmpzb25cIjpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtuYW1lcy5mc30uZW50aXR5Lmpzb25gO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJnZW5lcmF0ZWRcIjpcbiAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtuYW1lcy5mc30uZ2VuZXJhdGVkLnRzYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgIHJldHVybiBgJHthcGlSb290UGF0aH0vc3JjL2FwcGxpY2F0aW9uLyR7ZW50aXR5Lm5hbWVzLnBhcmVudEZzfS8ke2ZpbGVuYW1lfWA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghYWJzUGF0aCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5wcmVzZXRPckFic1BhdGhSZXF1aXJlZFwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWJzUGF0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGV4ZWNTeW5jKGBjb2RlICR7dGFyZ2V0UGF0aH1gKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUXVlcnlzdHJpbmc6IHtcbiAgICAgICAgICBvcmlnaW46IHN0cmluZztcbiAgICAgICAgICBlbnRpdHlJZD86IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS90b29scy9nZXRTdWdnZXN0aW9uXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgb3JpZ2luLCBlbnRpdHlJZCB9ID0gcmVxdWVzdC5xdWVyeTtcblxuICAgICAgICAvLyDsuZjtmZgg7Jqp7Ja07KeRXG4gICAgICAgIGNvbnN0IGdsb3NzYXJ5ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oW1xuICAgICAgICAgIFtcInN0YXR1c1wiLCBcIuyDge2DnFwiXSxcbiAgICAgICAgICBbXCJ0eXBlXCIsIFwi7YOA7J6FXCJdLFxuICAgICAgICAgIFtcImltYWdlXCIsIFwi7J2066+47KeAXCJdLFxuICAgICAgICAgIFtcImltYWdlc1wiLCBcIuydtOuvuOyngOumrOyKpO2KuFwiXSxcbiAgICAgICAgICBbXCJ1cmxcIiwgXCJVUkxcIl0sXG4gICAgICAgICAgW1wiaWRcIiwgXCJJRFwiXSxcbiAgICAgICAgICBbXCJuYW1lXCIsIGB7RW50aXR5SUR966qFYF0sXG4gICAgICAgICAgW1widGl0bGVcIiwgXCJ7RW50aXR5SUR966qFXCJdLFxuICAgICAgICAgIFtcInBhcmVudFwiLCBcIuyDgeychHtFbnRpdHlJRH1cIl0sXG4gICAgICAgICAgW1wiZGVzY1wiLCBcIuyEpOuqhVwiXSxcbiAgICAgICAgICBbXCJhdFwiLCBcIuydvOyLnFwiXSxcbiAgICAgICAgICBbXCJjcmVhdGVkXCIsIFwi65Ox66GdXCJdLFxuICAgICAgICAgIFtcInVwZGF0ZWRcIiwgXCLsiJjsoJVcIl0sXG4gICAgICAgICAgW1wiZGVsZXRlZFwiLCBcIuyCreygnFwiXSxcbiAgICAgICAgICBbXCJieVwiLCBcIuycoOyggFwiXSxcbiAgICAgICAgICBbXCJkYXRlXCIsIFwi7J287J6QXCJdLFxuICAgICAgICAgIFtcInRpbWVcIiwgXCLsi5zqsIRcIl0sXG4gICAgICAgICAgW1wia29cIiwgXCIo7ZWc6riAKVwiXSxcbiAgICAgICAgICBbXCJlblwiLCBcIijsmIHrrLgpXCJdLFxuICAgICAgICAgIFtcImtyd1wiLCBcIijsm5ApXCJdLFxuICAgICAgICAgIFtcInVzZFwiLCBcIihVU0QpXCJdLFxuICAgICAgICAgIFtcImNvbG9yXCIsIFwi7Lus65+sXCJdLFxuICAgICAgICAgIFtcImNvZGVcIiwgXCLsvZTrk5xcIl0sXG4gICAgICAgICAgW1wieFwiLCBcIljsooztkZxcIl0sXG4gICAgICAgICAgW1wieVwiLCBcIlnsooztkZxcIl0sXG4gICAgICAgICAgW1wiY3VycmVudFwiLCBcIu2YhOyerFwiXSxcbiAgICAgICAgICBbXCJzdG9ja1wiLCBcIuyerOqzoFwiXSxcbiAgICAgICAgICBbXCJ0b3RhbFwiLCBcIuy0nVwiXSxcbiAgICAgICAgICBbXCJhZG1pblwiLCBcIuq0gOumrOyekFwiXSxcbiAgICAgICAgICBbXCJncm91cFwiLCBcIuq3uOujuVwiXSxcbiAgICAgICAgICBbXCJpdGVtXCIsIFwi7JWE7J207YWcXCJdLFxuICAgICAgICAgIFtcImNudFwiLCBcIuyImOufiVwiXSxcbiAgICAgICAgICBbXCJwcmljZVwiLCBcIuqwgOqyqVwiXSxcbiAgICAgICAgICBbXCJwcmVzZXRcIiwgXCLtlITrpqzshYtcIl0sXG4gICAgICAgICAgW1wiYWNjdFwiLCBcIuqzhOyijFwiXSxcbiAgICAgICAgICBbXCJ0ZWxcIiwgXCLsoITtmZTrsojtmLhcIl0sXG4gICAgICAgICAgW1wibm9cIiwgXCLrsojtmLhcIl0sXG4gICAgICAgICAgW1wiYm9keVwiLCBcIuuCtOyaqVwiXSxcbiAgICAgICAgICBbXCJjb250ZW50XCIsIFwi64K07JqpXCJdLFxuICAgICAgICAgIFtcIm9yZGVybm9cIiwgXCLsoJXroKzsiJzshJxcIl0sXG4gICAgICAgICAgW1wicHJpb3JpdHlcIiwgXCLsmrDshKDsiJzsnIRcIl0sXG4gICAgICAgICAgW1widGV4dFwiLCBcIu2FjeyKpO2KuFwiXSxcbiAgICAgICAgICBbXCJrZXlcIiwgXCLtgqRcIl0sXG4gICAgICAgICAgW1wic3VtXCIsIFwi7ZWp7IKwXCJdLFxuICAgICAgICAgIFtcImV4cGVjdGVkXCIsIFwi7JiI7IOBXCJdLFxuICAgICAgICAgIFtcImFjdHVhbFwiLCBcIuyLpOygnFwiXSxcbiAgICAgICAgXSk7XG4gICAgICAgIC8vIOyghOyytCDsl5Tti7Dti7Ag7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7Ag7YOA7J207YuA6rO8IO2UhOuhrSDshKTrqoXsnYQg7LmY7ZmYIOyaqeyWtOynkeyXkCDstpTqsIBcbiAgICAgICAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpKSB7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGlmICgoZW50aXR5LnRpdGxlID8/IFwiXCIpICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBnbG9zc2FyeS5zZXQoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGVudGl0eS5pZCksIGVudGl0eS50aXRsZSk7XG4gICAgICAgICAgICBnbG9zc2FyeS5zZXQoXG4gICAgICAgICAgICAgIGluZmxlY3Rpb24udW5kZXJzY29yZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShlbnRpdHkuaWQpKSxcbiAgICAgICAgICAgICAgYCR7ZW50aXR5LnRpdGxlfeumrOyKpO2KuGAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVudGl0eS5wcm9wcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICAgICAgICBpZiAoZ2xvc3NhcnkuaGFzKHByb3AubmFtZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHByb3AuZGVzYykge1xuICAgICAgICAgICAgICBnbG9zc2FyeS5zZXQocHJvcC5uYW1lLCBwcm9wLmRlc2MucmVwbGFjZShlbnRpdHkudGl0bGUgPz8gXCJcIiwgXCJ7RW50aXR5SUR9XCIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1Z2dlc3RlZCA9ICgoKSA9PiB7XG4gICAgICAgICAgLy8g64uo7Ja0IOu2hOumrCwg6rCA64ql7ZWcIOyhsO2VqSDsg53shLFcbiAgICAgICAgICBjb25zdCB3b3JkcyA9IG9yaWdpbi5zcGxpdChcIl9cIik7XG4gICAgICAgICAgY29uc3QgY29tYmluYXRpb25zID0gWy4uLnJhbmdlKHdvcmRzLmxlbmd0aCwgMCwgLTEpXS5mbGF0TWFwKChsZW4pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIC4uLnJhbmdlKDAsIHdvcmRzLmxlbmd0aCAtIGxlbiArIDEsIChpZHgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgbGVuLFxuICAgICAgICAgICAgICAgICAgdzogd29yZHMuc2xpY2UoaWR4LCBpZHggKyBsZW4pLmpvaW4oXCJfXCIpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyhsO2VqeydhCDsiJztmoztlZjrqbAsIOy5mO2ZmCDsmqnslrTsp5Hsl5Ag7J6I64qUIOuLqOyWtOqwgCDtj6ztlajrkJwg6rK97JqwLCDsuZjtmZgg7Jqp7Ja066GcIOy5mO2ZmFxuICAgICAgICAgIGNvbnN0IFJFUExBQ0VEX1BSRUZJWCA9IFwiI1JFUExBQ0VELy9cIjsgLy8g7LmY7ZmY65CcIOuLqOyWtOulvCBqb2luIOydtO2bhOyXkOuPhCDsi53rs4TtlZjquLAg7JyE7ZW0IHByZWZpeCDstpTqsIBcbiAgICAgICAgICBsZXQgcmVtYWluQXJyOiBzdHJpbmdbXSA9IFsuLi53b3Jkc107XG4gICAgICAgICAgZm9yIChjb25zdCBjb21iIG9mIGNvbWJpbmF0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgcmVtYWluU3RyID0gcmVtYWluQXJyLmpvaW4oXCJfXCIpO1xuICAgICAgICAgICAgaWYgKHJlbWFpblN0ci5pbmNsdWRlcyhjb21iLncpICYmIGdsb3NzYXJ5Lmhhcyhjb21iLncpKSB7XG4gICAgICAgICAgICAgIHJlbWFpbkFyciA9IHJlbWFpblN0clxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGNvbWIudywgUkVQTEFDRURfUFJFRklYICsgZ2xvc3NhcnkuZ2V0KGNvbWIudykpXG4gICAgICAgICAgICAgICAgLnNwbGl0KFwiX1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmVtYWluQXJyXG4gICAgICAgICAgICAubWFwKChyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyLnN0YXJ0c1dpdGgoUkVQTEFDRURfUFJFRklYKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByLnJlcGxhY2UoUkVQTEFDRURfUFJFRklYLCBcIlwiKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gci50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oXCJcIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC97RW50aXR5SUR9L2csIGVudGl0eUlkID8gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnRpdGxlIDogXCJcIik7XG4gICAgICAgIH0pKCk7XG5cbiAgICAgICAgcmV0dXJuIHsgc3VnZ2VzdGVkIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldChcIi9hcGkvZW50aXR5L2ZpbmRNYW55XCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgICAgICBmdW5jdGlvbiBmbGF0dGVuU3Vic2V0Um93cyhzdWJzZXRSb3dzOiBFbnRpdHlTdWJzZXRSb3dbXSk6IEZsYXR0ZW5TdWJzZXRSb3dbXSB7XG4gICAgICAgICAgcmV0dXJuIHN1YnNldFJvd3MuZmxhdE1hcCgoc3Vic2V0Um93KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGNoaWxkcmVuLCAuLi5zUm93IH0gPSBzdWJzZXRSb3c7XG4gICAgICAgICAgICByZXR1cm4gW3NSb3csIC4uLmZsYXR0ZW5TdWJzZXRSb3dzKGNoaWxkcmVuKV07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRpdGllcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGVudGl0eUlkcy5tYXAoKGVudGl0eUlkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgICBjb25zdCBzdWJzZXRSb3dzID0gZW50aXR5LmdldFN1YnNldFJvd3MoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uZW50aXR5LFxuICAgICAgICAgICAgICBmbGF0dGVuU3Vic2V0Um93czogZmxhdHRlblN1YnNldFJvd3Moc3Vic2V0Um93cyksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGVudGl0aWVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICBjb25zdCBhSWQgPSBhLnBhcmVudElkID8/IGEuaWQ7XG4gICAgICAgICAgY29uc3QgYklkID0gYi5wYXJlbnRJZCA/PyBiLmlkO1xuICAgICAgICAgIGlmIChhSWQgPCBiSWQpIHJldHVybiAtMTtcbiAgICAgICAgICBpZiAoYUlkID4gYklkKSByZXR1cm4gMTtcbiAgICAgICAgICBpZiAoYUlkID09PSBiSWQpIHtcbiAgICAgICAgICAgIGlmIChhLnBhcmVudElkID09PSB1bmRlZmluZWQpIHJldHVybiAtMTtcbiAgICAgICAgICAgIGlmIChiLnBhcmVudElkID09PSB1bmRlZmluZWQpIHJldHVybiAxO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgZW50aXRpZXMgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUXVlcnlzdHJpbmc6IHtcbiAgICAgICAgICBmaWx0ZXI/OiBcImVudW1zXCIgfCBcInR5cGVzXCI7XG4gICAgICAgICAgcmVsb2FkPzogXCIxXCI7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L3R5cGVJZHNcIiwgYXN5bmMgKHJlcXVlc3QpOiBQcm9taXNlPHsgdHlwZUlkczogc3RyaW5nW10gfT4gPT4ge1xuICAgICAgICBjb25zdCB7IGZpbHRlciwgcmVsb2FkIH0gPSByZXF1ZXN0LnF1ZXJ5O1xuXG4gICAgICAgIGlmIChyZWxvYWQgPT09IFwiMVwiKSB7XG4gICAgICAgICAgYXdhaXQgU29uYW11LnN5bmNlci5hdXRvbG9hZFR5cGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0eXBlSWRzID0gKCgpID0+IHtcbiAgICAgICAgICAvLyDtlITroZzsoJ3tirjsl5DshJwg7KCV7J2Y7ZWcIO2DgOyeheuTpFxuICAgICAgICAgIGNvbnN0IHByb2plY3RUeXBlSWRzID0gT2JqZWN0LmVudHJpZXMoU29uYW11LnN5bmNlci50eXBlcylcbiAgICAgICAgICAgIC5maWx0ZXIoKFtfdHlwZUlkLCB6b2RUeXBlXSkgPT4gKHpvZFR5cGUuX3pvZC5kZWYudHlwZSBhcyBzdHJpbmcpICE9PSBcImVudW1cIilcbiAgICAgICAgICAgIC5tYXAoKFt0eXBlSWQsIF96b2RUeXBlXSkgPT4gdHlwZUlkKTtcblxuICAgICAgICAgIC8vIOuCtOyepSDtg4DsnoXrk6QgKHNvbmFtdSDsvZTslrTsl5DshJwg7KCc6rO1KVxuICAgICAgICAgIGNvbnN0IGJ1aWx0SW5UeXBlSWRzID0gWy4uLkJVSUxUX0lOX1RZUEVfSURTXTtcblxuICAgICAgICAgIC8vIOuqqOuToCDtg4DsnoUg67OR7ZWpXG4gICAgICAgICAgY29uc3QgYWxsVHlwZUlkcyA9IFsuLi5idWlsdEluVHlwZUlkcywgLi4ucHJvamVjdFR5cGVJZHNdO1xuXG4gICAgICAgICAgaWYgKGZpbHRlciA9PT0gXCJ0eXBlc1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsVHlwZUlkcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlbnVtSWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKS5mbGF0TWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChmaWx0ZXIgPT09IFwiZW51bXNcIikge1xuICAgICAgICAgICAgcmV0dXJuIGVudW1JZHM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbLi4uYWxsVHlwZUlkcywgLi4uZW51bUlkc107XG4gICAgICAgICAgfVxuICAgICAgICB9KSgpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZUlkcyxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBmb3JtOiB7XG4gICAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgICAgdGl0bGU6IHN0cmluZztcbiAgICAgICAgICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgICAgICAgICBwYXJlbnRJZD86IHN0cmluZztcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9jcmVhdGVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZm9ybSB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGF3YWl0IFNvbmFtdS5zeW5jZXIuY3JlYXRlRW50aXR5KHsgLi4uZm9ybSwgZW50aXR5SWQ6IGZvcm0uaWQgfSk7XG5cbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvZGVsXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IFNvbmFtdS5zeW5jZXIuZGVsRW50aXR5KGVudGl0eUlkKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBuZXdWYWx1ZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiBzdHJpbmc7XG4gICAgICAgICAgICB0YWJsZTogc3RyaW5nO1xuICAgICAgICAgICAgcGFyZW50SWQ/OiBzdHJpbmc7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW9kaWZ5RW50aXR5QmFzZVwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgbmV3VmFsdWVzIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS50aXRsZSA9IG5ld1ZhbHVlcy50aXRsZTtcbiAgICAgICAgICBlbnRpdHkudGFibGUgPSBuZXdWYWx1ZXMudGFibGU7XG4gICAgICAgICAgZW50aXR5LnBhcmVudElkID0gbmV3VmFsdWVzLnBhcmVudElkO1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBzdWJzZXRLZXk6IHN0cmluZztcbiAgICAgICAgICBmaWVsZHM6IHN0cmluZ1tdO1xuICAgICAgICAgIGZpZWxkc0ludGVybmFsPzogc3RyaW5nW107XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L21vZGlmeVN1YnNldFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgc3Vic2V0S2V5LCBmaWVsZHMsIGZpZWxkc0ludGVybmFsIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBmaWVsZHM7XG4gICAgICAgICAgaWYgKGZpZWxkc0ludGVybmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZHNJbnRlcm5hbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGVudGl0eS5zdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA9IGZpZWxkc0ludGVybmFsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVsZXRlIGVudGl0eS5zdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgIHJldHVybiB7IHVwZGF0ZWQ6IGZpZWxkcywgdXBkYXRlZEludGVybmFsOiBmaWVsZHNJbnRlcm5hbCB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIHN1YnNldEtleTogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9kZWxTdWJzZXRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIHN1YnNldEtleSB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBkZWxldGUgZW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgICBkZWxldGUgZW50aXR5LnN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldO1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBuZXdQcm9wOiBFbnRpdHlQcm9wO1xuICAgICAgICAgIGF0PzogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9jcmVhdGVQcm9wXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBhdCwgbmV3UHJvcCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuY3JlYXRlUHJvcChuZXdQcm9wLCBhdCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgbmV3UHJvcDogRW50aXR5UHJvcDtcbiAgICAgICAgICBhdDogbnVtYmVyO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9tb2RpZnlQcm9wXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBhdCwgbmV3UHJvcCB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5tb2RpZnlQcm9wKG5ld1Byb3AsIGF0KTtcblxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIGF0OiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvZW50aXR5L2RlbFByb3BcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGF0IH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgZW50aXR5LmRlbFByb3AoYXQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIGF0OiBudW1iZXI7XG4gICAgICAgICAgdG86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW92ZVByb3BcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGF0LCB0byB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5tb3ZlUHJvcChhdCwgdG8pO1xuXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgaW5kZXhlczogRW50aXR5SW5kZXhbXTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvbW9kaWZ5SW5kZXhlc1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgd2FpdEZvckhNUkNvbXBsZXRlZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBlbnRpdHlJZCwgaW5kZXhlcyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkuaW5kZXhlcyA9IGluZGV4ZXM7XG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgIHJldHVybiB7IHVwZGF0ZWQ6IGluZGV4ZXMgfTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBlbnVtTGFiZWxzOiBFbnRpdHlbXCJlbnVtTGFiZWxzXCJdO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9tb2RpZnlFbnVtTGFiZWxzXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBlbnVtTGFiZWxzIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGVudGl0eS5lbnVtTGFiZWxzID0gZW51bUxhYmVscztcbiAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuIHsgdXBkYXRlZDogZW51bUxhYmVscyB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgIG5ld0VudW1JZDogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9jcmVhdGVFbnVtSWRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIG5ld0VudW1JZCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICAgICAgICAgIGlmIChlbnRpdHkuZW51bUxhYmVsc1tuZXdFbnVtSWRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOydtOuvuCDsobTsnqztlZjripQgZW51bUlk7J6F64uI64ukOiAke25ld0VudW1JZH1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVsc1tuZXdFbnVtSWRdID0ge1xuICAgICAgICAgICAgLi4uKG5ld0VudW1JZC5lbmRzV2l0aChcIlN0YXR1c1wiKVxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgIGFjdGl2ZTogXCLrhbjstpxcIixcbiAgICAgICAgICAgICAgICAgIGhpZGRlbjogXCLsiKjquYBcIixcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgXCJcIjogXCJcIixcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBlbnVtSWQ6IHtcbiAgICAgICAgICAgIGJlZm9yZTogc3RyaW5nO1xuICAgICAgICAgICAgYWZ0ZXI6IHN0cmluZztcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9tb2RpZnlFbnVtSWRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIGVudW1JZCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgICAgICAgY29uc3QgaXNFeGlzdHMgPSBlbnRpdHlJZHMuc29tZSgoZW50aXR5SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlbnRpdHkuZW51bUxhYmVscykuaW5jbHVkZXMoZW51bUlkLmFmdGVyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaXNFeGlzdHMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7J2066+4IOyhtOyerO2VmOuKlCBFbnVtSWTsnoXri4jri6Q6ICR7ZW51bUlkLmFmdGVyfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVsc1tlbnVtSWQuYWZ0ZXJdID0gZW50aXR5LmVudW1MYWJlbHNbZW51bUlkLmJlZm9yZV07XG4gICAgICAgICAgZGVsZXRlIGVudGl0eS5lbnVtTGFiZWxzW2VudW1JZC5iZWZvcmVdO1xuXG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcblxuICAgICAgICAgIGZvciAoY29uc3QgZW50aXR5SWQgb2YgZW50aXR5SWRzKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgZW50aXR5LnByb3BzKSB7XG4gICAgICAgICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwiZW51bVwiICYmIHByb3AuaWQgPT09IGVudW1JZC5iZWZvcmUpIHtcbiAgICAgICAgICAgICAgICBwcm9wLmlkID0gZW51bUlkLmFmdGVyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCBlbnRpdHkuc2F2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBlbnVtSWQ6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvZGVsZXRlRW51bUlkXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCBlbnVtSWQgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgICAgICAgY29uc3QgaXNSZWZlcmVuY2VkID0gZW50aXR5SWRzXG4gICAgICAgICAgICAuZmxhdE1hcCgoZW50aXR5SWQpID0+IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcylcbiAgICAgICAgICAgIC5zb21lKChwcm9wKSA9PiBwcm9wLnR5cGUgPT09IFwiZW51bVwiICYmIHByb3AuaWQgPT09IGVudW1JZCk7XG4gICAgICAgICAgaWYgKGlzUmVmZXJlbmNlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudW1JZH3rpbwg7LC47KGw7ZWY64qUIO2UhOuhnO2NvO2LsOqwgCDsobTsnqztlanri4jri6QuYCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgIGRlbGV0ZSBlbnRpdHkuZW51bUxhYmVsc1tlbnVtSWRdO1xuICAgICAgICAgIGF3YWl0IGVudGl0eS5zYXZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgdGFyZ2V0OiBcImVudGl0eVwiIHwgXCJwcm9wXCIgfCBcImVudW1cIiB8IFwic3Vic2V0XCI7XG4gICAgICAgICAgcHJvcE5hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgZW51bUlkPzogc3RyaW5nO1xuICAgICAgICAgIHN1YnNldEtleT86IHN0cmluZztcbiAgICAgICAgICBjb25lOiBDb25lO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS91cGRhdGVDb25lXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB3YWl0Rm9ySE1SQ29tcGxldGVkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGVudGl0eUlkLCB0YXJnZXQsIHByb3BOYW1lLCBlbnVtSWQsIHN1YnNldEtleSwgY29uZSB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICAgICAgICAgIGlmICh0YXJnZXQgPT09IFwiZW50aXR5XCIpIHtcbiAgICAgICAgICAgIGVudGl0eS5jb25lID0gY29uZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRhcmdldCA9PT0gXCJwcm9wXCIgJiYgcHJvcE5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICAgICAgICBpZiAocHJvcCkge1xuICAgICAgICAgICAgICAocHJvcCBhcyB7IGNvbmU/OiBDb25lIH0pLmNvbmUgPSBjb25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09PSBcImVudW1cIiAmJiBlbnVtSWQpIHtcbiAgICAgICAgICAgIGVudGl0eS5lbnVtQ29uZXNbZW51bUlkXSA9IGNvbmU7XG4gICAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgPT09IFwic3Vic2V0XCIgJiYgc3Vic2V0S2V5KSB7XG4gICAgICAgICAgICBlbnRpdHkuc3Vic2V0Q29uZXNbc3Vic2V0S2V5XSA9IGNvbmU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgZW50aXR5LnNhdmUoKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICAgICAgICBwcmVzZXJ2ZUV4aXN0aW5nPzogYm9vbGVhbjtcbiAgICAgICAgICBvbmx5RW1wdHk/OiBib29sZWFuO1xuICAgICAgICAgIGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9lbnRpdHkvZ2VuZXJhdGVDb25lc1wiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHdhaXRGb3JITVJDb21wbGV0ZWQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgZW50aXR5SWQsIHByZXNlcnZlRXhpc3RpbmcsIG9ubHlFbXB0eSwgbG9jYWxlIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gRW50aXR5IOyhtOyerCDsl6zrtoAg7ZmV7J24XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgICAgICAgIC8vIGxvY2FsZSDquLDrs7jqsJI6IFNvbmFtdS5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlIOyCrOyaqVxuICAgICAgICAgICAgY29uc3QgZWZmZWN0aXZlTG9jYWxlID1cbiAgICAgICAgICAgICAgbG9jYWxlID8/IChTb25hbXUuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZSBhcyBcImtvXCIgfCBcImVuXCIgfCBcImphXCIpO1xuXG4gICAgICAgICAgICAvLyBDb25lIOyDneyEsVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgICAgICAgICBwcmVzZXJ2ZUV4aXN0aW5nOiBwcmVzZXJ2ZUV4aXN0aW5nID8/IHRydWUsXG4gICAgICAgICAgICAgIG9ubHlFbXB0eTogb25seUVtcHR5ID8/IGZhbHNlLFxuICAgICAgICAgICAgICBsb2NhbGU6IGVmZmVjdGl2ZUxvY2FsZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuXG4gICAgICAgICAgICAvLyBFbnRpdHkgbm90IGZvdW5kXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhcIuyhtOyerO2VmOyngCDslYrripQgRW50aXR5XCIpKSB7XG4gICAgICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDQpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlJZH1gLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBUEkg7YKkIOyXhuydjFxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCJBTlRIUk9QSUNfQVBJX0tFWSBub3QgZm91bmRcIikpIHtcbiAgICAgICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgZXJyb3I6IFwiQVBJIGtleSBub3QgY29uZmlndXJlZFwiLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSYXRlIGxpbWl0XG4gICAgICAgICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhcIlJhdGUgbGltaXQgZXhjZWVkZWRcIikpIHtcbiAgICAgICAgICAgICAgcmVwbHkuc3RhdHVzKDQyOSk7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgZXJyb3I6IFwiUmF0ZSBsaW1pdCBleGNlZWRlZC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci5cIixcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8g6riw7YOAIOyXkOufrFxuICAgICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGBDb25lIGdlbmVyYXRpb24gZmFpbGVkOiAke21lc3NhZ2V9YCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUXVlcnlzdHJpbmc6IHtcbiAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2VudGl0eS9nZXRUYWJsZUNvbHVtbnNcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBlbnRpdHlJZCB9ID0gcmVxdWVzdC5xdWVyeTtcbiAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gZW50aXR5LmdldFRhYmxlQ29sdW1ucygpO1xuICAgICAgICByZXR1cm4geyBjb2x1bW5zIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldChcIi9hcGkvbWlncmF0aW9ucy9zdGF0dXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKTtcblxuICAgICAgICByZXR1cm4geyBzdGF0dXMgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBhY3Rpb246IFwiYXBwbHlcIiB8IFwicm9sbGJhY2tcIiB8IFwic2hhZG93XCI7XG4gICAgICAgICAgdGFyZ2V0czogKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdO1xuICAgICAgICAgIGZvcmNlPzogYm9vbGVhbjtcbiAgICAgICAgICBmb3JjZVJlYXNvbj86IHN0cmluZztcbiAgICAgICAgICByZXF1ZXN0b3I/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcbiAgICAgICAgXCIvYXBpL21pZ3JhdGlvbnMvcnVuQWN0aW9uXCIsXG4gICAgICAgIGFzeW5jIChyZXF1ZXN0KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHQgfCBTbGFja0NvbmZpcm1QZW5kaW5nUmVzdWx0PiA9PiB7XG4gICAgICAgICAgY29uc3QgeyBhY3Rpb24sIHRhcmdldHMsIGZvcmNlLCBmb3JjZVJlYXNvbiwgcmVxdWVzdG9yIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgICBpZiAoYWN0aW9uID09PSBcInNoYWRvd1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbWlncmF0b3IucnVuU2hhZG93VGVzdCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFNsYWNrIOyKueyduCDssrTtgawgKGFwcGx5IOyLnOyXkOunjClcbiAgICAgICAgICBpZiAoYWN0aW9uID09PSBcImFwcGx5XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNsYWNrQ29uZmlybSA9IG5ldyBTbGFja0NvbmZpcm0oKTtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVzQXBwcm92YWwgPSB0YXJnZXRzLnNvbWUoKHQpID0+IHNsYWNrQ29uZmlybS5pc1RhcmdldFJlcXVpcmVzQXBwcm92YWwodCkpO1xuXG4gICAgICAgICAgICAvLyDroZzsu6wgRELsnbgg6rK97JqwIOyKueyduCDsiqTtgrVcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsSG9zdHMgPSBbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdO1xuICAgICAgICAgICAgY29uc3QgaXNMb2NhbFRhcmdldCA9IHRhcmdldHMuZXZlcnkoKHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0YXJnZXRDb25maWcgPSBTb25hbXUuZGJDb25maWdbdGFyZ2V0XTtcbiAgICAgICAgICAgICAgY29uc3QgaG9zdCA9ICh0YXJnZXRDb25maWc/LmNvbm5lY3Rpb24gYXMgeyBob3N0Pzogc3RyaW5nIH0pPy5ob3N0ID8/IFwibG9jYWxob3N0XCI7XG4gICAgICAgICAgICAgIHJldHVybiBsb2NhbEhvc3RzLmluY2x1ZGVzKGhvc3QudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHJlcXVpcmVzQXBwcm92YWwgJiYgc2xhY2tDb25maXJtLmlzQ29uZmlndXJlZCgpICYmICFpc0xvY2FsVGFyZ2V0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgY29ubnMgfSA9IGF3YWl0IG1pZ3JhdG9yLmdldFN0YXR1cygpO1xuXG4gICAgICAgICAgICAgIC8vIOuqqOuToCDtg4Dqsp8gRELsl5DshJwgcGVuZGluZ+yduCDrp4jsnbTqt7jroIjsnbTshZjsnZgg7ZWp7KeR7ZWp7J2EIOq1rO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgY29uc3QgcGVuZGluZ01pZ3JhdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgICAgICAgICAgIGNvbm5zXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGNvbm4pID0+IHRhcmdldHMuaW5jbHVkZXMoY29ubi5jb25uS2V5IGFzIGtleW9mIFNvbmFtdURCQ29uZmlnKSlcbiAgICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoKGNvbm4pID0+IGNvbm4ucGVuZGluZyksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICBpZiAocGVuZGluZ01pZ3JhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIOq4sOyhtCDsirnsnbgg7JqU7LKtIO2ZleyduFxuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgc2xhY2tDb25maXJtLmdldEV4aXN0aW5nUmVxdWVzdChwZW5kaW5nTWlncmF0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICAgIC8vIOq4sOyhtCDsmpTssq3snbQg7J6I7Jy866m0IOyKueyduCDsg4Htg5wg7ZmV7J24XG4gICAgICAgICAgICAgICAgICBjb25zdCB7IGFwcHJvdmVkLCByZWplY3RlZCB9ID0gYXdhaXQgc2xhY2tDb25maXJtLmNoZWNrQXBwcm92YWwoXG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnRzLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGFwcHJvdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOyKueyduOuQqCDihpIg7Iuk7ZaJXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihhY3Rpb24sIHRhcmdldHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBzbGFja0NvbmZpcm0ubG9nRXhlY3V0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IubWlncmF0aW9uUmVqZWN0ZWRcIikpO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGb3JjZSDsp4TtlolcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc2xhY2tDb25maXJtLmZvcmNlQXBwcm92YWwoXG4gICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy50cyxcbiAgICAgICAgICAgICAgICAgICAgICBmb3JjZVJlYXNvbiA/PyBcIuyCrOycoCDsl4bsnYxcIixcbiAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0b3IsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihhY3Rpb24sIHRhcmdldHMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBzbGFja0NvbmZpcm0ubG9nRXhlY3V0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIOuMgOq4sOykkVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwicGVuZGluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6IGV4aXN0aW5nLmNoYW5uZWwsXG4gICAgICAgICAgICAgICAgICAgICAgdHM6IGV4aXN0aW5nLnRzLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyDsg4gg7Iq57J24IOyalOyyrSDrsJzshqFcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHsgY2hhbm5lbCwgdHMgfSA9IGF3YWl0IHNsYWNrQ29uZmlybS5wb3N0QXBwcm92YWxSZXF1ZXN0KFxuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nTWlncmF0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cyxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdG9yLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHNsYWNrQ29uZmlybS5zYXZlUmVxdWVzdChwZW5kaW5nTWlncmF0aW9ucywgY2hhbm5lbCwgdHMpO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInBlbmRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgdHMsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBtaWdyYXRvci5ydW5BY3Rpb24oYWN0aW9uLCB0YXJnZXRzKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGNoYW5uZWw6IHN0cmluZztcbiAgICAgICAgICB0czogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL21pZ3JhdGlvbnMvY2hlY2tBcHByb3ZhbFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGNoYW5uZWwsIHRzIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIGNvbnN0IHNsYWNrQ29uZmlybSA9IG5ldyBTbGFja0NvbmZpcm0oKTtcblxuICAgICAgICBpZiAoIXNsYWNrQ29uZmlybS5pc0NvbmZpZ3VyZWQoKSkge1xuICAgICAgICAgIHJldHVybiB7IGFwcHJvdmVkOiB0cnVlLCByZWplY3RlZDogZmFsc2UgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzbGFja0NvbmZpcm0uY2hlY2tBcHByb3ZhbChjaGFubmVsLCB0cyk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgY2hhbm5lbDogc3RyaW5nO1xuICAgICAgICAgIHRzOiBzdHJpbmc7XG4gICAgICAgICAgcmVhc29uOiBzdHJpbmc7XG4gICAgICAgICAgcmVxdWVzdG9yPzogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL21pZ3JhdGlvbnMvZm9yY2VBcHByb3ZhbFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGNoYW5uZWwsIHRzLCByZWFzb24sIHJlcXVlc3RvciB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICBjb25zdCBzbGFja0NvbmZpcm0gPSBuZXcgU2xhY2tDb25maXJtKCk7XG5cbiAgICAgICAgaWYgKCFzbGFja0NvbmZpcm0uaXNDb25maWd1cmVkKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5zbGFja0NvbmZpcm1Ob3RDb25maWd1cmVkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNsYWNrQ29uZmlybS5mb3JjZUFwcHJvdmFsKGNoYW5uZWwsIHRzLCByZWFzb24sIHJlcXVlc3Rvcik7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBjb2RlTmFtZXM6IHN0cmluZ1tdO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL21pZ3JhdGlvbnMvZGVsQ29kZXNcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb2RlTmFtZXMgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG1pZ3JhdG9yLmRlbENvZGVzKGNvZGVOYW1lcyk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3QoXCIvYXBpL21pZ3JhdGlvbnMvZ2VuZXJhdGVQcmVwYXJlZENvZGVzXCIsIGFzeW5jIChfcmVxdWVzdHQpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IG1pZ3JhdG9yLmdlbmVyYXRlUHJlcGFyZWRDb2RlcygpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0eUlkczogc3RyaW5nW107XG4gICAgICAgICAgdGVtcGxhdGVLZXlzOiBzdHJpbmdbXTtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9zY2FmZm9sZGluZy9nZXRTdGF0dXNcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBlbnRpdHlJZHMsIHRlbXBsYXRlS2V5czogX3RlbXBsYXRlS2V5cyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICBpZiAoKGVudGl0eUlkcyA/PyBbXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IuZW50aXR5SWRzUmVxdWlyZWRcIikpO1xuICAgICAgICB9IGVsc2UgaWYgKChfdGVtcGxhdGVLZXlzID8/IFtdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci50ZW1wbGF0ZUtleXNSZXF1aXJlZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzb3J0aW5nXG4gICAgICAgIGVudGl0eUlkcy5zb3J0KChhLCBiKSA9PiAoYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApKTtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVLZXlzID0gVGVtcGxhdGVLZXkub3B0aW9ucy5maWx0ZXIoKHRrKSA9PiBfdGVtcGxhdGVLZXlzLmluY2x1ZGVzKHRrKSk7XG5cbiAgICAgICAgY29uc3QgY29tYmluYXRpb25zID0gZW50aXR5SWRzLmZsYXRNYXAoKGVudGl0eUlkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlS2V5cy5tYXAoKHRlbXBsYXRlS2V5KSA9PiBbZW50aXR5SWQsIHRlbXBsYXRlS2V5XSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgY29tYmluYXRpb25zLm1hcChhc3luYyAoW2VudGl0eUlkLCB0ZW1wbGF0ZUtleV0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgc3ViUGF0aCwgZnVsbFBhdGgsIGlzRXhpc3RzIH0gPSBhd2FpdCBTb25hbXUuc3luY2VyLmNoZWNrRXhpc3RzR2VuQ29kZShcbiAgICAgICAgICAgICAgZW50aXR5SWQsXG4gICAgICAgICAgICAgIHRlbXBsYXRlS2V5IGFzIFRlbXBsYXRlS2V5LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgICB0ZW1wbGF0ZUtleSxcbiAgICAgICAgICAgICAgc3ViUGF0aCxcbiAgICAgICAgICAgICAgZnVsbFBhdGgsXG4gICAgICAgICAgICAgIGlzRXhpc3RzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzZXMgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgICAgICAgdGVtcGxhdGVLZXk6IHN0cmluZztcbiAgICAgICAgICAgIGVudW1JZD86IHN0cmluZztcbiAgICAgICAgICAgIG92ZXJ3cml0ZT86IGJvb2xlYW47XG4gICAgICAgICAgfVtdO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NjYWZmb2xkaW5nL2dlbmVyYXRlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgb3B0aW9ucyB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5vcHRpb25zUmVxdWlyZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMS4g66qo65OgIO2FnO2UjOumv+yXkOyEnCDtlYTsmpTtlZwgZGljdCDtgqTrpbwg7IiY7KeRXG4gICAgICAgIGNvbnN0IGtleXMgPSBvcHRpb25zLmZsYXRNYXAoKHsgdGVtcGxhdGVLZXkgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGVNYW5hZ2VyLmdldCh0ZW1wbGF0ZUtleSk7XG4gICAgICAgICAgcmV0dXJuIHRlbXBsYXRlLmdldFJlcXVpcmVkRGljdEtleXMoKSA/PyBbXTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gMi4gdGFyZ2V067OE66GcIGVuc3VyZURpY3RLZXlzIO2YuOy2nCAo7Iic7LCoIOyymOumrClcbiAgICAgICAgYXdhaXQgc29uYW11RGljdGlvbmFyeS5lbnN1cmVEaWN0S2V5cyhbLi4ubmV3IFNldChrZXlzKV0pO1xuXG4gICAgICAgIC8vIDMuIO2FnO2UjOumvyDsg53shLEgKOuzkeugrCDsspjrpqwpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIG9wdGlvbnMubWFwKGFzeW5jICh7IGVudGl0eUlkLCB0ZW1wbGF0ZUtleSwgZW51bUlkLCBvdmVyd3JpdGUgfSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUtleSBhcyBUZW1wbGF0ZUtleSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICAgICAgICAgIGVudW1JZCxcbiAgICAgICAgICAgICAgICB9IGFzIHtcbiAgICAgICAgICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICBlbnVtSWQ/OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBvdmVyd3JpdGUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgaWYgKGlzU29FeGNlcHRpb24oZSkgJiYgZS5zdGF0dXNDb2RlID09PSA1NDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmZpbHRlcihub25OdWxsYWJsZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihTRChcInNvbmFtdS5lcnJvci5hbGxGaWxlc0dlbmVyYXRlZFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBvcHRpb246IHtcbiAgICAgICAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICAgICAgICB0ZW1wbGF0ZUtleTogc3RyaW5nO1xuICAgICAgICAgICAgZW51bUlkPzogc3RyaW5nO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvc2NhZmZvbGRpbmcvcHJldmlld1wiLCBhc3luYyAocmVxdWVzdCk6IFByb21pc2U8eyBwYXRoQW5kQ29kZXM6IFBhdGhBbmRDb2RlW10gfT4gPT4ge1xuICAgICAgICBjb25zdCB7IG9wdGlvbiB9ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyB0ZW1wbGF0ZUtleSwgLi4udGVtcGxhdGVPcHRpb25zIH0gPSBvcHRpb247XG4gICAgICAgICAgY29uc3QgcGF0aEFuZENvZGVzID0gYXdhaXQgU29uYW11LnN5bmNlci5yZW5kZXJUZW1wbGF0ZShcbiAgICAgICAgICAgIHRlbXBsYXRlS2V5IGFzIFRlbXBsYXRlS2V5LFxuICAgICAgICAgICAgdGVtcGxhdGVPcHRpb25zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4geyBwYXRoQW5kQ29kZXMgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0KFwiL2FwaS9maXh0dXJlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc291cmNlREIsIHRhcmdldERCLCBzZWFyY2gsIGR1cGxpY2F0ZUNoZWNrIH0gPSByZXF1ZXN0LmJvZHkgYXMge1xuICAgICAgICAgIHNvdXJjZURCOiBrZXlvZiBTb25hbXVEQkNvbmZpZztcbiAgICAgICAgICB0YXJnZXREQjoga2V5b2YgU29uYW11REJDb25maWc7XG4gICAgICAgICAgc2VhcmNoOiBGaXh0dXJlU2VhcmNoT3B0aW9ucztcbiAgICAgICAgICBkdXBsaWNhdGVDaGVjaz86IER1cGxpY2F0ZUNoZWNrT3B0aW9ucztcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gRml4dHVyZU1hbmFnZXIuZ2V0Rml4dHVyZXMoc291cmNlREIsIHRhcmdldERCLCBzZWFyY2gsIGR1cGxpY2F0ZUNoZWNrKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdChcIi9hcGkvZml4dHVyZS9pbXBvcnRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBkYiwgZml4dHVyZXMgfSA9IHJlcXVlc3QuYm9keSBhcyB7XG4gICAgICAgICAgZGI6IGtleW9mIFNvbmFtdURCQ29uZmlnO1xuICAgICAgICAgIGZpeHR1cmVzOiBGaXh0dXJlUmVjb3JkW107XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKGRiLCBmaXh0dXJlcyk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3QoXCIvYXBpL2ZpeHR1cmUvYWRkRml4dHVyZUxvYWRlclwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGNvZGUgfSA9IHJlcXVlc3QuYm9keSBhcyB7IGNvZGU6IHN0cmluZyB9O1xuXG4gICAgICAgIHJldHVybiBGaXh0dXJlTWFuYWdlci5hZGRGaXh0dXJlTG9hZGVyKGNvZGUpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL2kxOG4vZGljdGlvbmFyeVwiLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIHJldHVybiBzb25hbXVEaWN0aW9uYXJ5LmdldERpY3Rpb25hcnkoKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS9pMThuL2V4cG9ydFwiLCBhc3luYyAoX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZmlsZW5hbWUsIGJ1ZmZlciB9ID0gYXdhaXQgc29uYW11RGljdGlvbmFyeS5leHBvcnRUb0V4Y2VsKCk7XG4gICAgICAgIHJlcGx5XG4gICAgICAgICAgLmhlYWRlcihcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCIsXG4gICAgICAgICAgICBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0XCIsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5oZWFkZXIoXCJDb250ZW50LURpc3Bvc2l0aW9uXCIsIGBhdHRhY2htZW50OyBmaWxlbmFtZT1cIiR7ZmlsZW5hbWV9XCJgKVxuICAgICAgICAgIC5zZW5kKGJ1ZmZlcik7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3QoXCIvYXBpL2kxOG4vaW1wb3J0XCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXF1ZXN0LmZpbGUoKTtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJzb25hbXUuZXJyb3IuZmlsZU5vdFVwbG9hZGVkXCIpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBkYXRhLnRvQnVmZmVyKCk7XG4gICAgICAgIHJldHVybiBzb25hbXVEaWN0aW9uYXJ5LmltcG9ydEZyb21FeGNlbChidWZmZXIpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIG9sZEtleTogc3RyaW5nO1xuICAgICAgICAgIG5ld0tleTogc3RyaW5nO1xuICAgICAgICAgIHNvdXJjZTogXCJlbnRpdHlcIiB8IFwicHJvamVjdFwiIHwgXCJzb25hbXVcIjtcbiAgICAgICAgICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvaTE4bi91cGRhdGVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgYXdhaXQgc29uYW11RGljdGlvbmFyeS51cGRhdGVFbnRyeShyZXF1ZXN0LmJvZHkpO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAga2V5OiBzdHJpbmc7XG4gICAgICAgICAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2kxOG4vY3JlYXRlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuY3JlYXRlRW50cnkocmVxdWVzdC5ib2R5KTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGtleTogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL2kxOG4vZGVsZXRlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuZGVsZXRlRW50cnkocmVxdWVzdC5ib2R5LmtleSk7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsga2V5czogc3RyaW5nW10gfSB9PihcIi9hcGkvaTE4bi9jaGVja1VzYWdlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiBzb25hbXVEaWN0aW9uYXJ5LmNoZWNrVXNhZ2UocmVxdWVzdC5ib2R5LmtleXMpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRhc2tzIEFQSVxuICAgICAgc2VydmVyLmdldChcIi9hcGkvdGFza3Mvc3RhdHVzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBTb25hbXUud29ya2Zsb3dzO1xuICAgICAgICAgIHJldHVybiB7IGFjdGl2ZTogdHJ1ZSB9O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4geyBhY3RpdmU6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS90YXNrcy93b3JrZmxvd0RlZmluaXRpb25zXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZGVmaW5pdGlvbnMgPSBTb25hbXUud29ya2Zsb3dzLndvcmtmbG93RGVmaW5pdGlvbnM7XG4gICAgICAgIHJldHVybiB7IGRlZmluaXRpb25zIH07XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLmdldDx7XG4gICAgICAgIFF1ZXJ5c3RyaW5nOiB7XG4gICAgICAgICAgbGltaXQ/OiBzdHJpbmc7XG4gICAgICAgICAgYWZ0ZXI/OiBzdHJpbmc7XG4gICAgICAgICAgYmVmb3JlPzogc3RyaW5nO1xuICAgICAgICAgIG9yZGVyPzogXCJhc2NcIiB8IFwiZGVzY1wiO1xuICAgICAgICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAgICAgICB3b3JrZmxvd05hbWU/OiBzdHJpbmc7XG4gICAgICAgICAgY3JlYXRlZEFmdGVyPzogc3RyaW5nO1xuICAgICAgICAgIGNyZWF0ZWRCZWZvcmU/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvdGFza3Mvd29ya2Zsb3dSdW5zXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGJhY2tlbmQgPSBTb25hbXUud29ya2Zsb3dzLmJhY2tlbmQ7XG4gICAgICAgIGNvbnN0IHsgbGltaXQsIGFmdGVyLCBiZWZvcmUsIG9yZGVyLCBzdGF0dXMsIHdvcmtmbG93TmFtZSwgY3JlYXRlZEFmdGVyLCBjcmVhdGVkQmVmb3JlIH0gPVxuICAgICAgICAgIHJlcXVlc3QucXVlcnk7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLmxpc3RXb3JrZmxvd1J1bnMoe1xuICAgICAgICAgIGxpbWl0OiBsaW1pdCA/IE51bWJlci5wYXJzZUludChsaW1pdCwgMTApIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGFmdGVyLFxuICAgICAgICAgIGJlZm9yZSxcbiAgICAgICAgICBvcmRlcixcbiAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA/IHN0YXR1cy5zcGxpdChcIixcIikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvd05hbWUgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGNyZWF0ZWRBZnRlcjogY3JlYXRlZEFmdGVyID8gbmV3IERhdGUoY3JlYXRlZEFmdGVyKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBjcmVhdGVkQmVmb3JlOiBjcmVhdGVkQmVmb3JlID8gbmV3IERhdGUoY3JlYXRlZEJlZm9yZSkgOiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5nZXQ8e1xuICAgICAgICBQYXJhbXM6IHsgaWQ6IHN0cmluZyB9O1xuICAgICAgfT4oXCIvYXBpL3Rhc2tzL3dvcmtmbG93UnVucy86aWRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgYmFja2VuZCA9IFNvbmFtdS53b3JrZmxvd3MuYmFja2VuZDtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dSdW4gPSBhd2FpdCBiYWNrZW5kLmdldFdvcmtmbG93UnVuKHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiByZXF1ZXN0LnBhcmFtcy5pZCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghd29ya2Zsb3dSdW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdvcmtmbG93IHJ1biBub3QgZm91bmQ6ICR7cmVxdWVzdC5wYXJhbXMuaWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdvcmtmbG93UnVuO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgUGFyYW1zOiB7IGlkOiBzdHJpbmcgfTtcbiAgICAgIH0+KFwiL2FwaS90YXNrcy93b3JrZmxvd1J1bnMvOmlkL2NhbmNlbFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBiYWNrZW5kID0gU29uYW11LndvcmtmbG93cy5iYWNrZW5kO1xuICAgICAgICByZXR1cm4gYmFja2VuZC5jYW5jZWxXb3JrZmxvd1J1bih7XG4gICAgICAgICAgd29ya2Zsb3dSdW5JZDogcmVxdWVzdC5wYXJhbXMuaWQsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgUGFyYW1zOiB7IGlkOiBzdHJpbmcgfTtcbiAgICAgIH0+KFwiL2FwaS90YXNrcy93b3JrZmxvd1J1bnMvOmlkL3BhdXNlXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGJhY2tlbmQgPSBTb25hbXUud29ya2Zsb3dzLmJhY2tlbmQ7XG4gICAgICAgIHJldHVybiBiYWNrZW5kLnBhdXNlV29ya2Zsb3dSdW4oe1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJlcXVlc3QucGFyYW1zLmlkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIFBhcmFtczogeyBpZDogc3RyaW5nIH07XG4gICAgICB9PihcIi9hcGkvdGFza3Mvd29ya2Zsb3dSdW5zLzppZC9yZXN1bWVcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgYmFja2VuZCA9IFNvbmFtdS53b3JrZmxvd3MuYmFja2VuZDtcbiAgICAgICAgcmV0dXJuIGJhY2tlbmQucmVzdW1lV29ya2Zsb3dSdW4oe1xuICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJlcXVlc3QucGFyYW1zLmlkLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIuZ2V0PHtcbiAgICAgICAgUGFyYW1zOiB7IGlkOiBzdHJpbmcgfTtcbiAgICAgICAgUXVlcnlzdHJpbmc6IHtcbiAgICAgICAgICBsaW1pdD86IHN0cmluZztcbiAgICAgICAgICBhZnRlcj86IHN0cmluZztcbiAgICAgICAgICBiZWZvcmU/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvdGFza3Mvd29ya2Zsb3dSdW5zLzppZC9zdGVwc1wiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCBiYWNrZW5kID0gU29uYW11LndvcmtmbG93cy5iYWNrZW5kO1xuICAgICAgICBjb25zdCB7IGxpbWl0LCBhZnRlciwgYmVmb3JlIH0gPSByZXF1ZXN0LnF1ZXJ5O1xuICAgICAgICByZXR1cm4gYmFja2VuZC5saXN0U3RlcEF0dGVtcHRzKHtcbiAgICAgICAgICB3b3JrZmxvd1J1bklkOiByZXF1ZXN0LnBhcmFtcy5pZCxcbiAgICAgICAgICBsaW1pdDogbGltaXQgPyBOdW1iZXIucGFyc2VJbnQobGltaXQsIDEwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBhZnRlcixcbiAgICAgICAgICBiZWZvcmUsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8qKlxuICAgICAgICogSGVhbHRoIENoZWNrIEFQSVxuICAgICAgICogTUNQIOuPhOq1rOqwgCBTb25hbXUg7ISc67KE66W8IOyekOuPmSDqsJDsp4DtlZjquLAg7JyE7ZWcIOyXlOuTnO2PrOyduO2KuFxuICAgICAgICovXG4gICAgICBzZXJ2ZXIuZ2V0KFwiL2FwaS9zb25hbXUvaGVhbHRoXCIsIGFzeW5jIChyZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSByZXF1ZXN0LnNlcnZlci5zZXJ2ZXIuYWRkcmVzcygpO1xuICAgICAgICBjb25zdCBwb3J0ID0gYWRkcmVzcyAmJiB0eXBlb2YgYWRkcmVzcyA9PT0gXCJvYmplY3RcIiA/IChhZGRyZXNzIGFzIEFkZHJlc3NJbmZvKS5wb3J0IDogMDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgIHByb2plY3Q6IHByb2Nlc3MuY3dkKCkuc3BsaXQoXCIvXCIpLnBvcCgpIHx8IFwidW5rbm93blwiLFxuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgLyoqXG4gICAgICAgKiBGaXh0dXJlIOyDneyEsSBBUElcbiAgICAgICAqL1xuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5OiBzdHJpbmc7XG4gICAgICAgICAgY291bnQ/OiBudW1iZXI7XG4gICAgICAgICAgb3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgdGFyZ2V0RGI/OiBcImZpeHR1cmVcIiB8IFwidGVzdFwiO1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NvbmFtdS9maXh0dXJlL2dlbmVyYXRlXCIsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB7IGVudGl0eSwgY291bnQgPSAxLCBvdmVycmlkZXMsIHRhcmdldERiID0gXCJmaXh0dXJlXCIgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAvLyDtg4Dqsp8gREIg7ISk7KCVIOqwgOyguOyYpOq4sFxuICAgICAgICBjb25zdCBkYkNvbmZpZyA9IHRhcmdldERiID09PSBcImZpeHR1cmVcIiA/IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlIDogU29uYW11LmRiQ29uZmlnLnRlc3Q7XG5cbiAgICAgICAgLy8gS25leCDsnbjsiqTthLTsiqQg7IOd7ISxXG4gICAgICAgIGNvbnN0IGRiID0gY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEZpeHR1cmVHZW5lcmF0b3Ig7IOd7ISxXG4gICAgICAgICAgY29uc3QgZ2VuZXJhdG9yID0gbmV3IEZpeHR1cmVHZW5lcmF0b3IoZGIsIGRiLCB0YXJnZXREYiwgRW50aXR5TWFuYWdlcik7XG5cbiAgICAgICAgICAvLyDri6jsnbwgRW50aXR5IOuwsOy5mCDsg53shLFcbiAgICAgICAgICBjb25zdCBmaXh0dXJlcyA9IGF3YWl0IGdlbmVyYXRvci5nZW5lcmF0ZUJhdGNoKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgICBjb3VudCxcbiAgICAgICAgICAgICAgb3ZlcnJpZGVzOiBvdmVycmlkZXMgPz8ge30sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICBjb3VudDogZml4dHVyZXMubGVuZ3RoLFxuICAgICAgICAgICAgZml4dHVyZXMsXG4gICAgICAgICAgICB0YXJnZXREYixcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIEZpeHR1cmUg642w7J207YSwIO2DkOyDiSBBUElcbiAgICAgICAqL1xuICAgICAgc2VydmVyLnBvc3Q8e1xuICAgICAgICBCb2R5OiB7XG4gICAgICAgICAgZW50aXR5OiBzdHJpbmc7XG4gICAgICAgICAgc3RyYXRlZ3k6IFwic2FtcGxlXCIgfCBcInJlY2VudFwiIHwgXCJyYW5kb21cIiB8IFwicXVlcnlcIjtcbiAgICAgICAgICBsaW1pdD86IG51bWJlcjtcbiAgICAgICAgICB3aGVyZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICB9O1xuICAgICAgfT4oXCIvYXBpL3NvbmFtdS9maXh0dXJlL2V4cGxvcmVcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZW50aXR5LCBzdHJhdGVneSwgbGltaXQgPSAxMCwgd2hlcmUgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAvLyBGaXh0dXJlIERCIOyEpOyglSDqsIDsoLjsmKTquLBcbiAgICAgICAgY29uc3QgZml4dHVyZURiQ29uZmlnID0gU29uYW11LmRiQ29uZmlnLmZpeHR1cmU7XG5cbiAgICAgICAgLy8gS25leCDsnbjsiqTthLTsiqQg7IOd7ISxXG4gICAgICAgIGNvbnN0IGZpeHR1cmVEYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZShmaXh0dXJlRGJDb25maWcpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRGF0YUV4cGxvcmVyIOyDneyEsVxuICAgICAgICAgIGNvbnN0IGV4cGxvcmVyID0gbmV3IERhdGFFeHBsb3JlcihmaXh0dXJlRGIsIEVudGl0eU1hbmFnZXIpO1xuXG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGV4cGxvcmVyLmV4cGxvcmUoZW50aXR5LCB7XG4gICAgICAgICAgICBzdHJhdGVneSxcbiAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgd2hlcmUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICAgICAgY291bnQ6IGRhdGEubGVuZ3RoLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg0MDApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBhd2FpdCBmaXh0dXJlRGIuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLyoqXG4gICAgICAgKiBGaXh0dXJlIOuNsOydtO2EsCDqsIDsoLjsmKTquLAgKGZldGNoKSBBUElcbiAgICAgICAqIHByb2R1Y3Rpb24vZGV2ZWxvcG1lbnQgRELsl5DshJwg7Iuk7KCcIOuNsOydtO2EsOulvCBmaXh0dXJlIERC66GcIGltcG9ydFxuICAgICAgICovXG4gICAgICBzZXJ2ZXIucG9zdDx7XG4gICAgICAgIEJvZHk6IHtcbiAgICAgICAgICBlbnRpdHk6IHN0cmluZztcbiAgICAgICAgICBzdHJhdGVneT86IFwic2FtcGxlXCIgfCBcInJlY2VudFwiIHwgXCJyYW5kb21cIiB8IFwicXVlcnlcIjtcbiAgICAgICAgICBsaW1pdD86IG51bWJlcjtcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zPzogYm9vbGVhbjtcbiAgICAgICAgICBtYXhEZXB0aD86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgIH0+KFwiL2FwaS9zb25hbXUvZml4dHVyZS9mZXRjaFwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICBzdHJhdGVneSA9IFwicmVjZW50XCIsXG4gICAgICAgICAgbGltaXQgPSAxMCxcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zID0gdHJ1ZSxcbiAgICAgICAgICBtYXhEZXB0aCA9IDIsXG4gICAgICAgIH0gPSByZXF1ZXN0LmJvZHk7XG5cbiAgICAgICAgLy8gU291cmNlIERCIChwcm9kdWN0aW9uL2RldmVsb3BtZW50KSAtIOydveq4sCDsoITsmqlcbiAgICAgICAgY29uc3Qgc291cmNlRGIgPSBEQi5nZXREQihcInJcIik7XG5cbiAgICAgICAgLy8gVGFyZ2V0IERCIChmaXh0dXJlKVxuICAgICAgICBjb25zdCBmaXh0dXJlRGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRml4dHVyZUdlbmVyYXRvciDsg53shLFcbiAgICAgICAgICBjb25zdCBnZW5lcmF0b3IgPSBuZXcgRml4dHVyZUdlbmVyYXRvcihzb3VyY2VEYiwgZml4dHVyZURiLCBcImZpeHR1cmVcIiwgRW50aXR5TWFuYWdlcik7XG5cbiAgICAgICAgICAvLyBwcm9kdWN0aW9uIOuNsOydtO2EsOulvCBmaXh0dXJlIERC66GcIGltcG9ydFxuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBnZW5lcmF0b3IuaW1wb3J0RnJvbVNvdXJjZShlbnRpdHksIHtcbiAgICAgICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zLFxuICAgICAgICAgICAgbWF4RGVwdGgsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgIHN0cmF0ZWd5LFxuICAgICAgICAgICAgY291bnQ6IHJlc3VsdHMubGVuZ3RoLFxuICAgICAgICAgICAgaW1wb3J0ZWQ6IHJlc3VsdHMsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDAwKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgLy8gc291cmNlRGLripQgU29uYW116rCAIOq0gOumrO2VmOuvgOuhnCBkZXN0cm957ZWY7KeAIOyViuydjFxuICAgICAgICAgIGF3YWl0IGZpeHR1cmVEYi5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvKipcbiAgICAgICAqIEZpeHR1cmUg642w7J207YSwIOyCreygnCAoY2xlYW4pIEFQSVxuICAgICAgICogRksg7Iic7ISc66W8IOqzoOugpO2VmOyXrCDslYjsoITtlZjqsowg7IKt7KCcXG4gICAgICAgKi9cbiAgICAgIHNlcnZlci5wb3N0PHtcbiAgICAgICAgQm9keToge1xuICAgICAgICAgIGVudGl0aWVzPzogc3RyaW5nW107XG4gICAgICAgIH07XG4gICAgICB9PihcIi9hcGkvc29uYW11L2ZpeHR1cmUvY2xlYW5cIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZW50aXRpZXMgfSA9IHJlcXVlc3QuYm9keTtcblxuICAgICAgICAvLyBGaXh0dXJlIERCIOyXsOqysFxuICAgICAgICBjb25zdCBmaXh0dXJlRGIgPSBjcmVhdGVLbmV4SW5zdGFuY2UoU29uYW11LmRiQ29uZmlnLmZpeHR1cmUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8g7IKt7KCc7ZWgIEVudGl0eSDrqqnroZ0g6rKw7KCVXG4gICAgICAgICAgY29uc3QgdGFyZ2V0RW50aXRpZXMgPVxuICAgICAgICAgICAgZW50aXRpZXMgJiYgZW50aXRpZXMubGVuZ3RoID4gMCA/IGVudGl0aWVzIDogRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgICAgICAgIC8vIEVudGl0eSBJROulvCDthYzsnbTruJTrqoXsnLzroZwg67OA7ZmYIChzbmFrZV9jYXNlIOuzteyImO2YlSlcbiAgICAgICAgICBjb25zdCB0YWJsZU5hbWVzID0gdGFyZ2V0RW50aXRpZXMubWFwKChlbnRpdHlJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGVudGl0eS50YWJsZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFBvc3RncmVTUUw6IFRSVU5DQVRFIENBU0NBREXroZwgRksg7Iic7IScIOustOq0gO2VmOqyjCDslYjsoITtlZjqsowg7IKt7KCcXG4gICAgICAgICAgLy8gQ0FTQ0FERSDsmLXshZjsnLzroZwg7J2Y7KG07ISxIOyeiOuKlCDrjbDsnbTthLDrj4Qg7ZWo6ruYIOyCreygnFxuICAgICAgICAgIGF3YWl0IGZpeHR1cmVEYi5yYXcoXG4gICAgICAgICAgICBgVFJVTkNBVEUgVEFCTEUgJHt0YWJsZU5hbWVzLm1hcCgodCkgPT4gYFwiJHt0fVwiYCkuam9pbihcIiwgXCIpfSBSRVNUQVJUIElERU5USVRZIENBU0NBREVgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGNsZWFuZWQ6IHRhYmxlTmFtZXMsXG4gICAgICAgICAgICBjb3VudDogdGFibGVOYW1lcy5sZW5ndGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXBseS5zdGF0dXMoNDAwKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYXdhaXQgZml4dHVyZURiLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENERCBBUElcbiAgICAgIHNlcnZlci5nZXQoXCIvYXBpL2NkZC90cmVlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldENkZFRyZWUoKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgZmlsZVBhdGg6IHN0cmluZyB9IH0+KFwiL2FwaS9jZGQvcmVhZENvbnRlbnRcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBmaWxlUGF0aCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICByZXR1cm4gcmVhZENvbnRlbnQoZmlsZVBhdGgpO1xuICAgICAgfSk7XG5cbiAgICAgIHNlcnZlci5wb3N0PHsgQm9keTogeyBmaWxlUGF0aDogc3RyaW5nIH0gfT4oXCIvYXBpL2NkZC9lZGl0Q29udGVudFwiLCBhc3luYyAocmVxdWVzdCkgPT4ge1xuICAgICAgICBjb25zdCB7IGZpbGVQYXRoIH0gPSByZXF1ZXN0LmJvZHk7XG4gICAgICAgIHJldHVybiBlZGl0Q29udGVudChmaWxlUGF0aCk7XG4gICAgICB9KTtcblxuICAgICAgc2VydmVyLnBvc3Q8eyBCb2R5OiB7IGZpbGVQYXRoOiBzdHJpbmcgfSB9PihcIi9hcGkvY2RkL29wZW5Tb3VyY2VcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBmaWxlUGF0aCB9ID0gcmVxdWVzdC5ib2R5O1xuICAgICAgICBvcGVuU291cmNlRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDREQgU2NoZW1hIEFQSVxuICAgICAgc2VydmVyLmdldChcIi9hcGkvY2RkL3NjaGVtYXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXR1cm4gbGlzdFNjaGVtYXMoKTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgc2NoZW1hS2V5OiBzdHJpbmcgfSB9PihcIi9hcGkvY2RkL3JlYWRTY2hlbWFcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBzY2hlbWFLZXkgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgcmV0dXJuIHJlYWRTY2hlbWEoc2NoZW1hS2V5KTtcbiAgICAgIH0pO1xuXG4gICAgICBzZXJ2ZXIucG9zdDx7IEJvZHk6IHsgc2NoZW1hS2V5OiBzdHJpbmcgfSB9PihcIi9hcGkvY2RkL2VkaXRTY2hlbWFcIiwgYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgY29uc3QgeyBzY2hlbWFLZXkgfSA9IHJlcXVlc3QuYm9keTtcbiAgICAgICAgcmV0dXJuIGVkaXRTY2hlbWEoc2NoZW1hS2V5KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyB1aS13ZWIg67mM65OcIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IHVpRGlzdFBhdGggPSBwYXRoLnJlc29sdmUoaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLi91aS13ZWJcIik7XG5cbiAgICAgIC8vIOygleyggSDtjIzsnbwg7ISc67mZOiDro6jtirgg7Y+0642UIOyghOyytCAoYXNzZXRzLCBzZXR0aW5nLnN2ZyDrk7EpXG4gICAgICBzZXJ2ZXIucmVnaXN0ZXIoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvc3RhdGljXCIpLCB7XG4gICAgICAgIHJvb3Q6IHVpRGlzdFBhdGgsXG4gICAgICAgIHByZWZpeDogXCIvXCIsXG4gICAgICAgIGRlY29yYXRlUmVwbHk6IGZhbHNlLFxuICAgICAgICB3aWxkY2FyZDogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgLy8gU1BBIGZhbGxiYWNrIC0g7KCV7KCBIO2MjOydvOydtCDsl4bripQg66qo65OgIOqyveuhnOuKlCBpbmRleC5odG1s66GcXG4gICAgICBzZXJ2ZXIuZ2V0KFwiKlwiLCBhc3luYyAoX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIHJlcGx5LmhlYWRlcnMoeyBcIkNvbnRlbnQtdHlwZVwiOiBcInRleHQvaHRtbFwiIH0pLnNlbmQoXG4gICAgICAgICAgZnNcbiAgICAgICAgICAgIC5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHVpRGlzdFBhdGgsIFwiaW5kZXguaHRtbFwiKSlcbiAgICAgICAgICAgIC50b1N0cmluZygpXG4gICAgICAgICAgICAucmVwbGFjZShcInt7cHJvamVjdE5hbWV9fVwiLCBTb25hbXUuY29uZmlnLnByb2plY3ROYW1lID8/IFwiVW5rbm93blNvbmFtdVByb2plY3RcIiksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHsgcHJlZml4OiBcIi9zb25hbXUtdWlcIiB9LFxuICApO1xufVxuIl0sIm5hbWVzIjpbImV4ZWNTeW5jIiwiZnMiLCJpbmZsZWN0aW9uIiwicGF0aCIsInJhbmdlIiwiU29uYW11IiwiREIiLCJjcmVhdGVLbmV4SW5zdGFuY2UiLCJTRCIsInNvbmFtdURpY3Rpb25hcnkiLCJFbnRpdHlNYW5hZ2VyIiwiQmFkUmVxdWVzdEV4Y2VwdGlvbiIsImlzU29FeGNlcHRpb24iLCJTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24iLCJNaWdyYXRvciIsIlNsYWNrQ29uZmlybSIsIlRlbXBsYXRlTWFuYWdlciIsIkRhdGFFeHBsb3JlciIsIkZpeHR1cmVHZW5lcmF0b3IiLCJGaXh0dXJlTWFuYWdlciIsIkJVSUxUX0lOX1RZUEVfSURTIiwiVGVtcGxhdGVLZXkiLCJub25OdWxsYWJsZSIsInNldEFpQXBpIiwiZWRpdENvbnRlbnQiLCJlZGl0U2NoZW1hIiwiZ2V0Q2RkVHJlZSIsImxpc3RTY2hlbWFzIiwib3BlblNvdXJjZUZpbGUiLCJyZWFkQ29udGVudCIsInJlYWRTY2hlbWEiLCJzb25hbXVVSUFwaVBsdWdpbiIsImZhc3RpZnkiLCJyZWdpc3RlciIsInNlcnZlciIsIm1pZ3JhdG9yIiwid2FpdEZvckhNUkNvbXBsZXRlZCIsImZuIiwid2FpdFByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsImhhbmRsZXIiLCJjbGVhclRpbWVvdXQiLCJ0aW1lb3V0Iiwic2V0VGltZW91dCIsInN5bmNlciIsImV2ZW50RW1pdHRlciIsIm9mZiIsIm9uY2UiLCJyZXN1bHQiLCJnZXQiLCJjb25maWciLCJyZXF1ZXN0IiwiZW50aXR5SWQiLCJwcmVzZXQiLCJhYnNQYXRoIiwicXVlcnkiLCJ0YXJnZXRQYXRoIiwiZW50aXR5IiwibmFtZXMiLCJhcGlSb290UGF0aCIsImZpbGVuYW1lIiwicGFyZW50RnMiLCJvcmlnaW4iLCJnbG9zc2FyeSIsIk1hcCIsImdldEFsbElkcyIsInRpdGxlIiwic2V0IiwidW5kZXJzY29yZSIsImlkIiwicGx1cmFsaXplIiwicHJvcHMiLCJmb3JFYWNoIiwicHJvcCIsImhhcyIsIm5hbWUiLCJkZXNjIiwicmVwbGFjZSIsInN1Z2dlc3RlZCIsIndvcmRzIiwic3BsaXQiLCJjb21iaW5hdGlvbnMiLCJsZW5ndGgiLCJmbGF0TWFwIiwibGVuIiwiaWR4IiwidyIsInNsaWNlIiwiam9pbiIsIlJFUExBQ0VEX1BSRUZJWCIsInJlbWFpbkFyciIsImNvbWIiLCJyZW1haW5TdHIiLCJpbmNsdWRlcyIsIm1hcCIsInIiLCJzdGFydHNXaXRoIiwidG9VcHBlckNhc2UiLCJlbnRpdHlJZHMiLCJmbGF0dGVuU3Vic2V0Um93cyIsInN1YnNldFJvd3MiLCJzdWJzZXRSb3ciLCJjaGlsZHJlbiIsInNSb3ciLCJlbnRpdGllcyIsImFsbCIsImdldFN1YnNldFJvd3MiLCJzb3J0IiwiYSIsImIiLCJhSWQiLCJwYXJlbnRJZCIsImJJZCIsInVuZGVmaW5lZCIsImZpbHRlciIsInJlbG9hZCIsImF1dG9sb2FkVHlwZXMiLCJ0eXBlSWRzIiwicHJvamVjdFR5cGVJZHMiLCJPYmplY3QiLCJlbnRyaWVzIiwidHlwZXMiLCJfdHlwZUlkIiwiem9kVHlwZSIsIl96b2QiLCJkZWYiLCJ0eXBlIiwidHlwZUlkIiwiX3pvZFR5cGUiLCJidWlsdEluVHlwZUlkcyIsImFsbFR5cGVJZHMiLCJlbnVtSWRzIiwia2V5cyIsImVudW1MYWJlbHMiLCJwb3N0IiwiZm9ybSIsImJvZHkiLCJjcmVhdGVFbnRpdHkiLCJkZWxFbnRpdHkiLCJuZXdWYWx1ZXMiLCJ0YWJsZSIsInNhdmUiLCJzdWJzZXRLZXkiLCJmaWVsZHMiLCJmaWVsZHNJbnRlcm5hbCIsInN1YnNldHMiLCJzdWJzZXRzSW50ZXJuYWwiLCJ1cGRhdGVkIiwidXBkYXRlZEludGVybmFsIiwiYXQiLCJuZXdQcm9wIiwiY3JlYXRlUHJvcCIsIm1vZGlmeVByb3AiLCJkZWxQcm9wIiwidG8iLCJtb3ZlUHJvcCIsImluZGV4ZXMiLCJuZXdFbnVtSWQiLCJFcnJvciIsImVuZHNXaXRoIiwiYWN0aXZlIiwiaGlkZGVuIiwiZW51bUlkIiwiaXNFeGlzdHMiLCJzb21lIiwiYWZ0ZXIiLCJiZWZvcmUiLCJpc1JlZmVyZW5jZWQiLCJ0YXJnZXQiLCJwcm9wTmFtZSIsImNvbmUiLCJmaW5kIiwicCIsImVudW1Db25lcyIsInN1YnNldENvbmVzIiwicmVwbHkiLCJwcmVzZXJ2ZUV4aXN0aW5nIiwib25seUVtcHR5IiwibG9jYWxlIiwiZWZmZWN0aXZlTG9jYWxlIiwiaTE4biIsImRlZmF1bHRMb2NhbGUiLCJnZW5lcmF0ZUNvbmVzIiwiZXJyb3IiLCJtZXNzYWdlIiwiU3RyaW5nIiwic3RhdHVzIiwic3VjY2VzcyIsImNvbHVtbnMiLCJnZXRUYWJsZUNvbHVtbnMiLCJnZXRTdGF0dXMiLCJhY3Rpb24iLCJ0YXJnZXRzIiwiZm9yY2UiLCJmb3JjZVJlYXNvbiIsInJlcXVlc3RvciIsInJ1blNoYWRvd1Rlc3QiLCJzbGFja0NvbmZpcm0iLCJyZXF1aXJlc0FwcHJvdmFsIiwidCIsImlzVGFyZ2V0UmVxdWlyZXNBcHByb3ZhbCIsImxvY2FsSG9zdHMiLCJpc0xvY2FsVGFyZ2V0IiwiZXZlcnkiLCJ0YXJnZXRDb25maWciLCJkYkNvbmZpZyIsImhvc3QiLCJjb25uZWN0aW9uIiwidG9Mb3dlckNhc2UiLCJpc0NvbmZpZ3VyZWQiLCJjb25ucyIsInBlbmRpbmdNaWdyYXRpb25zIiwiU2V0IiwiY29ubiIsImNvbm5LZXkiLCJwZW5kaW5nIiwiZXhpc3RpbmciLCJnZXRFeGlzdGluZ1JlcXVlc3QiLCJhcHByb3ZlZCIsInJlamVjdGVkIiwiY2hlY2tBcHByb3ZhbCIsImNoYW5uZWwiLCJ0cyIsInJ1bkFjdGlvbiIsImxvZ0V4ZWN1dGlvbiIsImZvcmNlQXBwcm92YWwiLCJwb3N0QXBwcm92YWxSZXF1ZXN0Iiwic2F2ZVJlcXVlc3QiLCJyZWFzb24iLCJjb2RlTmFtZXMiLCJkZWxDb2RlcyIsIl9yZXF1ZXN0dCIsImdlbmVyYXRlUHJlcGFyZWRDb2RlcyIsInRlbXBsYXRlS2V5cyIsIl90ZW1wbGF0ZUtleXMiLCJvcHRpb25zIiwidGsiLCJ0ZW1wbGF0ZUtleSIsInN0YXR1c2VzIiwic3ViUGF0aCIsImZ1bGxQYXRoIiwiY2hlY2tFeGlzdHNHZW5Db2RlIiwidGVtcGxhdGUiLCJnZXRSZXF1aXJlZERpY3RLZXlzIiwiZW5zdXJlRGljdEtleXMiLCJvdmVyd3JpdGUiLCJnZW5lcmF0ZVRlbXBsYXRlIiwiZSIsInN0YXR1c0NvZGUiLCJjb25zb2xlIiwib3B0aW9uIiwidGVtcGxhdGVPcHRpb25zIiwicGF0aEFuZENvZGVzIiwicmVuZGVyVGVtcGxhdGUiLCJzb3VyY2VEQiIsInRhcmdldERCIiwic2VhcmNoIiwiZHVwbGljYXRlQ2hlY2siLCJnZXRGaXh0dXJlcyIsImRiIiwiZml4dHVyZXMiLCJpbnNlcnRGaXh0dXJlcyIsImNvZGUiLCJhZGRGaXh0dXJlTG9hZGVyIiwiZ2V0RGljdGlvbmFyeSIsIl9yZXF1ZXN0IiwiYnVmZmVyIiwiZXhwb3J0VG9FeGNlbCIsImhlYWRlciIsInNlbmQiLCJkYXRhIiwiZmlsZSIsInRvQnVmZmVyIiwiaW1wb3J0RnJvbUV4Y2VsIiwidXBkYXRlRW50cnkiLCJjcmVhdGVFbnRyeSIsImRlbGV0ZUVudHJ5Iiwia2V5IiwiY2hlY2tVc2FnZSIsIndvcmtmbG93cyIsImRlZmluaXRpb25zIiwid29ya2Zsb3dEZWZpbml0aW9ucyIsImJhY2tlbmQiLCJsaW1pdCIsIm9yZGVyIiwid29ya2Zsb3dOYW1lIiwiY3JlYXRlZEFmdGVyIiwiY3JlYXRlZEJlZm9yZSIsImxpc3RXb3JrZmxvd1J1bnMiLCJOdW1iZXIiLCJwYXJzZUludCIsIkRhdGUiLCJ3b3JrZmxvd1J1biIsImdldFdvcmtmbG93UnVuIiwid29ya2Zsb3dSdW5JZCIsInBhcmFtcyIsImNhbmNlbFdvcmtmbG93UnVuIiwicGF1c2VXb3JrZmxvd1J1biIsInJlc3VtZVdvcmtmbG93UnVuIiwibGlzdFN0ZXBBdHRlbXB0cyIsImFkZHJlc3MiLCJwb3J0Iiwib2siLCJwcm9qZWN0IiwicHJvY2VzcyIsImN3ZCIsInBvcCIsInRpbWVzdGFtcCIsInRvSVNPU3RyaW5nIiwiY291bnQiLCJvdmVycmlkZXMiLCJ0YXJnZXREYiIsImZpeHR1cmUiLCJ0ZXN0IiwiZ2VuZXJhdG9yIiwiZ2VuZXJhdGVCYXRjaCIsImRlc3Ryb3kiLCJzdHJhdGVneSIsIndoZXJlIiwiZml4dHVyZURiQ29uZmlnIiwiZml4dHVyZURiIiwiZXhwbG9yZXIiLCJleHBsb3JlIiwiaW5jbHVkZVJlbGF0aW9ucyIsIm1heERlcHRoIiwic291cmNlRGIiLCJnZXREQiIsInJlc3VsdHMiLCJpbXBvcnRGcm9tU291cmNlIiwiaW1wb3J0ZWQiLCJ0YXJnZXRFbnRpdGllcyIsInRhYmxlTmFtZXMiLCJyYXciLCJjbGVhbmVkIiwiZmlsZVBhdGgiLCJzY2hlbWFLZXkiLCJ1aURpc3RQYXRoIiwiZGlybmFtZSIsInJvb3QiLCJwcmVmaXgiLCJkZWNvcmF0ZVJlcGx5Iiwid2lsZGNhcmQiLCJoZWFkZXJzIiwicmVhZEZpbGVTeW5jIiwidG9TdHJpbmciLCJwcm9qZWN0TmFtZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsUUFBUSxRQUFRLGdCQUFnQjtBQUV6QyxPQUFPQyxRQUFRLEtBQUs7QUFDcEIsT0FBT0MsZ0JBQWdCLGFBQWE7QUFFcEMsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLEtBQUssUUFBUSxVQUFVO0FBQ2hDLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MsRUFBRSxRQUE2QixvQkFBaUI7QUFDekQsU0FBU0Msa0JBQWtCLFFBQVEsc0JBQW1CO0FBQ3RELFNBQVNDLEVBQUUsUUFBUSxnQkFBYTtBQUNoQyxTQUFTQyxnQkFBZ0IsUUFBUSwrQkFBNEI7QUFFN0QsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUNFQyxtQkFBbUIsRUFDbkJDLGFBQWEsRUFDYkMsMkJBQTJCLFFBQ3RCLGlDQUE4QjtBQUNyQyxTQUErQkMsUUFBUSxRQUFRLDJCQUF3QjtBQUN2RSxTQUFTQyxZQUFZLFFBQXdDLGdDQUE2QjtBQUMxRixTQUFTQyxlQUFlLFFBQVEsa0NBQStCO0FBQy9ELFNBQVNDLFlBQVksUUFBUSw4QkFBMkI7QUFDeEQsU0FBU0MsZ0JBQWdCLFFBQVEsa0NBQStCO0FBQ2hFLFNBQXFDQyxjQUFjLFFBQVEsZ0NBQTZCO0FBQ3hGLFNBQ0VDLGlCQUFpQixFQVNqQkMsV0FBVyxRQUNOLG9CQUFpQjtBQUN4QixTQUFTQyxXQUFXLFFBQVEsb0JBQWlCO0FBQzdDLFNBQVNDLFFBQVEsUUFBUSxjQUFXO0FBQ3BDLFNBQ0VDLFdBQVcsRUFDWEMsVUFBVSxFQUNW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
@@ -1,26 +1,28 @@
1
- export type CddFileType = "contract" | "spec";
2
- export type CddTreeNode = {
3
- name: string;
4
- /** contract/ 기준 상대 경로 */
5
- path: string;
6
- type: "file" | "directory";
7
- /** file인 경우만 존재 */
8
- fileType?: CddFileType;
9
- /** directory인 경우만 존재 */
10
- children?: CddTreeNode[];
11
- };
1
+ import type { CddContentEnvelope, CddSchemaDetailEnvelope, CddSchemaSummary, CddTreeNode } from "./cdd-types";
2
+ export type { CddContentEnvelope, CddFileType, CddSchema, CddSchemaDetailEnvelope, CddSchemaField, CddSchemaFieldType, CddSchemaReference, CddSchemaSummary, CddTreeNode, } from "./cdd-types";
12
3
  /** contract/ 디렉터리의 트리 구조를 반환 */
13
4
  export declare function getCddTree(): {
14
5
  exists: boolean;
15
6
  tree: CddTreeNode[];
16
7
  };
17
- /** JSON 파일의 전체 내용을 읽어 반환 (content는 string으로 변환) */
18
- export declare function readContent(filePath: string): Record<string, unknown>;
19
- /** JSON 파일의 content 필드를 외부 에디터로 편집 */
8
+ /** JSON 파일의 전체 내용을 읽어 schema와 함께 envelope로 반환 */
9
+ export declare function readContent(filePath: string): CddContentEnvelope;
10
+ /** JSON 파일을 외부 에디터로 직접 편집 */
20
11
  export declare function editContent(filePath: string): Promise<{
21
12
  success: boolean;
22
13
  filePath: string;
23
14
  }>;
15
+ /** schema 목록 반환 */
16
+ export declare function listSchemas(): {
17
+ schemas: CddSchemaSummary[];
18
+ };
19
+ /** schema 상세 반환 (파일명 기반 key로 조회) */
20
+ export declare function readSchema(schemaKey: string): CddSchemaDetailEnvelope;
21
+ /** schema 파일을 외부 에디터로 편집 (파일명 기반 key로 조회) */
22
+ export declare function editSchema(schemaKey: string): Promise<{
23
+ success: boolean;
24
+ schemaKey: string;
25
+ }>;
24
26
  /** 소스 파일을 외부 에디터로 열기 (대기하지 않음) */
25
27
  export declare function openSourceFile(filePath: string): void;
26
28
  //# sourceMappingURL=cdd-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cdd-service.d.ts","sourceRoot":"","sources":["../../src/ui/cdd-service.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,mBAAmB;IACnB,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,wBAAwB;IACxB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B,CAAC;AAwDF,gCAAgC;AAChC,wBAAgB,UAAU,IAAI;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,WAAW,EAAE,CAAA;CAAE,CAOrE;AASD,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAarE;AAED,sCAAsC;AACtC,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA0CjD;AA0DD,kCAAkC;AAClC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAarD"}
1
+ {"version":3,"file":"cdd-service.d.ts","sourceRoot":"","sources":["../../src/ui/cdd-service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,kBAAkB,EAGlB,uBAAuB,EAEvB,gBAAgB,EAChB,WAAW,EACZ,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,SAAS,EACT,uBAAuB,EACvB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,GACZ,MAAM,aAAa,CAAC;AAwDrB,gCAAgC;AAChC,wBAAgB,UAAU,IAAI;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,WAAW,EAAE,CAAA;CAAE,CAOrE;AAWD,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAqBhE;AAED,6BAA6B;AAC7B,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAcjD;AA+HD,mBAAmB;AACnB,wBAAgB,WAAW,IAAI;IAAE,OAAO,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAmC7D;AAED,oCAAoC;AACpC,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,uBAAuB,CAsBrE;AAED,6CAA6C;AAC7C,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAclD;AAED,kCAAkC;AAClC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAarD"}