sonamu 0.7.4 → 0.7.6

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 (137) hide show
  1. package/dist/api/config.d.ts +1 -4
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +1 -1
  4. package/dist/api/sonamu.d.ts +2 -0
  5. package/dist/api/sonamu.d.ts.map +1 -1
  6. package/dist/api/sonamu.js +19 -47
  7. package/dist/bin/cli.js +6 -6
  8. package/dist/database/base-model.d.ts +1 -1
  9. package/dist/database/base-model.d.ts.map +1 -1
  10. package/dist/database/base-model.js +15 -4
  11. package/dist/database/code-generator.d.ts.map +1 -1
  12. package/dist/database/code-generator.js +3 -3
  13. package/dist/database/db.d.ts.map +1 -1
  14. package/dist/database/db.js +1 -1
  15. package/dist/database/puri-wrapper.d.ts +11 -11
  16. package/dist/database/puri-wrapper.d.ts.map +1 -1
  17. package/dist/database/puri-wrapper.js +7 -11
  18. package/dist/database/puri.d.ts +36 -17
  19. package/dist/database/puri.d.ts.map +1 -1
  20. package/dist/database/puri.js +54 -7
  21. package/dist/database/puri.types.d.ts +54 -17
  22. package/dist/database/puri.types.d.ts.map +1 -1
  23. package/dist/database/puri.types.js +2 -4
  24. package/dist/database/puri.types.test-d.js +129 -0
  25. package/dist/database/upsert-builder.d.ts +16 -10
  26. package/dist/database/upsert-builder.d.ts.map +1 -1
  27. package/dist/database/upsert-builder.js +10 -19
  28. package/dist/entity/entity-manager.d.ts +113 -22
  29. package/dist/entity/entity-manager.d.ts.map +1 -1
  30. package/dist/entity/entity-manager.js +1 -1
  31. package/dist/entity/entity.d.ts +34 -0
  32. package/dist/entity/entity.d.ts.map +1 -1
  33. package/dist/entity/entity.js +110 -37
  34. package/dist/index.d.ts +5 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +8 -2
  37. package/dist/migration/code-generation.d.ts.map +1 -1
  38. package/dist/migration/code-generation.js +341 -149
  39. package/dist/migration/migration-set.d.ts.map +1 -1
  40. package/dist/migration/migration-set.js +21 -5
  41. package/dist/migration/migrator.d.ts.map +1 -1
  42. package/dist/migration/migrator.js +7 -1
  43. package/dist/migration/postgresql-schema-reader.d.ts +11 -1
  44. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  45. package/dist/migration/postgresql-schema-reader.js +111 -10
  46. package/dist/syncer/syncer.d.ts.map +1 -1
  47. package/dist/syncer/syncer.js +7 -4
  48. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  49. package/dist/template/implementations/generated.template.js +12 -2
  50. package/dist/template/implementations/generated_sso.template.d.ts +3 -3
  51. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  52. package/dist/template/implementations/generated_sso.template.js +50 -2
  53. package/dist/template/implementations/model.template.d.ts.map +1 -1
  54. package/dist/template/implementations/model.template.js +20 -15
  55. package/dist/template/implementations/model_test.template.js +4 -4
  56. package/dist/template/implementations/service.template.d.ts.map +1 -1
  57. package/dist/template/implementations/service.template.js +2 -2
  58. package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
  59. package/dist/template/implementations/view_enums_select.template.js +2 -2
  60. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  61. package/dist/template/implementations/view_form.template.js +12 -9
  62. package/dist/template/implementations/view_id_async_select.template.js +4 -4
  63. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  64. package/dist/template/implementations/view_list.template.js +12 -9
  65. package/dist/template/implementations/view_search_input.template.js +2 -2
  66. package/dist/template/template.js +2 -2
  67. package/dist/template/zod-converter.d.ts.map +1 -1
  68. package/dist/template/zod-converter.js +17 -2
  69. package/dist/testing/fixture-manager.d.ts +2 -1
  70. package/dist/testing/fixture-manager.d.ts.map +1 -1
  71. package/dist/testing/fixture-manager.js +29 -29
  72. package/dist/types/types.d.ts +593 -68
  73. package/dist/types/types.d.ts.map +1 -1
  74. package/dist/types/types.js +113 -9
  75. package/dist/vector/chunking.d.ts +25 -0
  76. package/dist/vector/chunking.d.ts.map +1 -0
  77. package/dist/vector/chunking.js +97 -0
  78. package/dist/vector/config.d.ts +12 -0
  79. package/dist/vector/config.d.ts.map +1 -0
  80. package/dist/vector/config.js +83 -0
  81. package/dist/vector/embedding.d.ts +42 -0
  82. package/dist/vector/embedding.d.ts.map +1 -0
  83. package/dist/vector/embedding.js +147 -0
  84. package/dist/vector/types.d.ts +105 -0
  85. package/dist/vector/types.d.ts.map +1 -0
  86. package/dist/vector/types.js +5 -0
  87. package/dist/vector/vector-search.d.ts +47 -0
  88. package/dist/vector/vector-search.d.ts.map +1 -0
  89. package/dist/vector/vector-search.js +176 -0
  90. package/package.json +9 -8
  91. package/src/api/config.ts +0 -4
  92. package/src/api/sonamu.ts +21 -36
  93. package/src/bin/cli.ts +5 -5
  94. package/src/database/base-model.ts +20 -11
  95. package/src/database/code-generator.ts +6 -2
  96. package/src/database/db.ts +1 -0
  97. package/src/database/puri-wrapper.ts +22 -16
  98. package/src/database/puri.ts +150 -27
  99. package/src/database/puri.types.test-d.ts +457 -0
  100. package/src/database/puri.types.ts +231 -33
  101. package/src/database/upsert-builder.ts +43 -34
  102. package/src/entity/entity-manager.ts +2 -2
  103. package/src/entity/entity.ts +134 -44
  104. package/src/index.ts +6 -0
  105. package/src/migration/code-generation.ts +377 -174
  106. package/src/migration/migration-set.ts +22 -3
  107. package/src/migration/migrator.ts +6 -0
  108. package/src/migration/postgresql-schema-reader.ts +121 -21
  109. package/src/syncer/syncer.ts +6 -3
  110. package/src/template/implementations/generated.template.ts +51 -9
  111. package/src/template/implementations/generated_sso.template.ts +71 -2
  112. package/src/template/implementations/model.template.ts +25 -15
  113. package/src/template/implementations/model_test.template.ts +3 -3
  114. package/src/template/implementations/service.template.ts +5 -1
  115. package/src/template/implementations/view_enums_dropdown.template.ts +1 -1
  116. package/src/template/implementations/view_enums_select.template.ts +1 -1
  117. package/src/template/implementations/view_form.template.ts +11 -8
  118. package/src/template/implementations/view_id_async_select.template.ts +3 -3
  119. package/src/template/implementations/view_list.template.ts +11 -8
  120. package/src/template/implementations/view_search_input.template.ts +1 -1
  121. package/src/template/template.ts +1 -1
  122. package/src/template/zod-converter.ts +20 -0
  123. package/src/testing/fixture-manager.ts +31 -30
  124. package/src/types/types.ts +226 -48
  125. package/src/vector/chunking.ts +115 -0
  126. package/src/vector/config.ts +68 -0
  127. package/src/vector/embedding.ts +193 -0
  128. package/src/vector/types.ts +122 -0
  129. package/src/vector/vector-search.ts +261 -0
  130. package/dist/template/implementations/view_enums_buttonset.template.d.ts +0 -17
  131. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +0 -1
  132. package/dist/template/implementations/view_enums_buttonset.template.js +0 -31
  133. package/dist/template/implementations/view_list_columns.template.d.ts +0 -17
  134. package/dist/template/implementations/view_list_columns.template.d.ts.map +0 -1
  135. package/dist/template/implementations/view_list_columns.template.js +0 -49
  136. package/src/template/implementations/view_enums_buttonset.template.ts +0 -34
  137. package/src/template/implementations/view_list_columns.template.ts +0 -53
@@ -71,10 +71,7 @@ export type SonamuServerOptions = {
71
71
  };
72
72
  };
73
73
  export type SonamuConfigExport = SonamuConfig | Promise<SonamuConfig> | (() => SonamuConfig) | (() => Promise<SonamuConfig>);
74
- export declare function defineConfig(config: SonamuConfig): Promise<SonamuConfig>;
75
- export declare function defineConfig(config: Promise<SonamuConfig>): Promise<SonamuConfig>;
76
- export declare function defineConfig(config: () => SonamuConfig): Promise<SonamuConfig>;
77
- export declare function defineConfig(config: () => Promise<SonamuConfig>): Promise<SonamuConfig>;
74
+ export declare function defineConfig(config: SonamuConfigExport): Promise<SonamuConfig>;
78
75
  /**
79
76
  * sonamu.config.ts 파일을 로드합니다.
80
77
  * 이 설정 파일은 환경에 따라 다른 경로에 있을 수 있습니다.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/api/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/api/config.ts"],"names":[],"mappings":"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"}
@@ -25,4 +25,4 @@ export function defineConfig(config) {
25
25
  return config;
26
26
  }
27
27
 
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRmFzdGlmeUNvcnNPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L2NvcnNcIjtcbmltcG9ydCB0eXBlIHsgRmFzdGlmeUZvcm1ib2R5T3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9mb3JtYm9keVwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5TXVsdGlwYXJ0T3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9tdWx0aXBhcnRcIjtcbmltcG9ydCB0eXBlIHsgRGVzZXJpYWxpemVGdW5jdGlvbiwgU2VyaWFsaXplRnVuY3Rpb24gfSBmcm9tIFwiQGZhc3RpZnkvcGFzc3BvcnQvZGlzdC9BdXRoZW50aWNhdG9yXCI7XG5pbXBvcnQgdHlwZSB7IFNlY3VyZVNlc3Npb25QbHVnaW5PcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L3NlY3VyZS1zZXNzaW9uXCI7XG5pbXBvcnQgdHlwZSB7IEZhc3RpZnlTdGF0aWNPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L3N0YXRpY1wiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UsIEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QsIEZhc3RpZnlTZXJ2ZXJPcHRpb25zIH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCB0eXBlIHsgUXNQbHVnaW5PcHRpb25zIH0gZnJvbSBcImZhc3RpZnktcXNcIjtcbmltcG9ydCB0eXBlIHsgU3NlUGx1Z2luT3B0aW9ucyB9IGZyb20gXCJmYXN0aWZ5LXNzZS12Mi9saWIvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgdHlwZSB7IERyaXZlciB9IGZyb20gXCIuLi9maWxlLXN0b3JhZ2UvZHJpdmVyXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUZhc3RpZnlDb25maWcgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VDb25maWcgPSBPbWl0PEtuZXguQ29uZmlnLCBcImNvbm5lY3Rpb25cIj4gJiB7XG4gIGNvbm5lY3Rpb24/OiBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbn07XG5cbmV4cG9ydCB0eXBlIFNvbmFtdUNvbmZpZyA9IHtcbiAgcHJvamVjdE5hbWU/OiBzdHJpbmc7XG5cbiAgYXBpOiB7XG4gICAgZGlyOiBzdHJpbmc7XG4gICAgcm91dGU6IHtcbiAgICAgIHByZWZpeDogc3RyaW5nO1xuICAgIH07XG4gICAgdGltZXpvbmU/OiBzdHJpbmc7XG4gIH07XG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBzdHJpbmdbXTsgLy8gXCJ3ZWJcIiwgXCJhcHBcIiDrk7FcbiAgfTtcbiAgdWk/OiB7XG4gICAgcG9ydDogbnVtYmVyO1xuICB9O1xuXG4gIGRhdGFiYXNlOiB7XG4gICAgLy8g642w7J207YSw67Kg7J207IqkXG4gICAgZGF0YWJhc2U/OiBcInBvc3RncmVzcWxcIjtcbiAgICAvLyDquLDrs7gg642w7J207YSw67Kg7J207IqkIOydtOumhFxuICAgIG5hbWU6IHN0cmluZztcbiAgICAvLyDrqqjrk6Ag7ZmY6rK97JeQIOyggeyaqeuQoCDquLDrs7ggS25leCDsmLXshZhcbiAgICBkZWZhdWx0T3B0aW9uczogRGF0YWJhc2VDb25maWc7XG4gICAgLy8g7ZmY6rK967OEIOyEpOyglVxuICAgIGVudmlyb25tZW50cz86IHtcbiAgICAgIGRldmVsb3BtZW50PzogRGF0YWJhc2VDb25maWc7XG4gICAgICBkZXZlbG9wbWVudF9zbGF2ZT86IERhdGFiYXNlQ29uZmlnO1xuICAgICAgcHJvZHVjdGlvbj86IERhdGFiYXNlQ29uZmlnO1xuICAgICAgcHJvZHVjdGlvbl9zbGF2ZT86IERhdGFiYXNlQ29uZmlnO1xuICAgICAgcmVtb3RlX2ZpeHR1cmU/OiBEYXRhYmFzZUNvbmZpZztcbiAgICB9O1xuICB9O1xuXG4gIHNlcnZlcjogU29uYW11U2VydmVyT3B0aW9ucztcbn07XG5cbmV4cG9ydCB0eXBlIFNvbmFtdVNlcnZlck9wdGlvbnMgPSB7XG4gIGZhc3RpZnk/OiBGYXN0aWZ5U2VydmVyT3B0aW9ucztcblxuICBsaXN0ZW4/OiB7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIGhvc3Q/OiBzdHJpbmc7XG4gIH07XG5cbiAgcGx1Z2lucz86IHtcbiAgICBjb3JzPzogYm9vbGVhbiB8IEZhc3RpZnlDb3JzT3B0aW9ucztcbiAgICBmb3JtYm9keT86IGJvb2xlYW4gfCBGYXN0aWZ5Rm9ybWJvZHlPcHRpb25zO1xuICAgIG11bHRpcGFydD86IGJvb2xlYW4gfCBGYXN0aWZ5TXVsdGlwYXJ0T3B0aW9ucztcbiAgICBxcz86IGJvb2xlYW4gfCBRc1BsdWdpbk9wdGlvbnM7XG4gICAgc3NlPzogYm9vbGVhbiB8IFNzZVBsdWdpbk9wdGlvbnM7XG4gICAgc3RhdGljPzogYm9vbGVhbiB8IEZhc3RpZnlTdGF0aWNPcHRpb25zO1xuICAgIHNlc3Npb24/OiBib29sZWFuIHwgU2VjdXJlU2Vzc2lvblBsdWdpbk9wdGlvbnM7XG5cbiAgICBjdXN0b20/OiAoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UpID0+IHZvaWQ7XG4gIH07XG5cbiAgYXV0aD86XG4gICAgfCBib29sZWFuXG4gICAgfCB7XG4gICAgICAgIHVzZXJTZXJpYWxpemVyOiBTZXJpYWxpemVGdW5jdGlvbjx1bmtub3duLCB1bmtub3duPjtcbiAgICAgICAgdXNlckRlc2VyaWFsaXplcjogRGVzZXJpYWxpemVGdW5jdGlvbjx1bmtub3duLCB1bmtub3duPjtcbiAgICAgIH07XG5cbiAgYXBpQ29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnO1xuXG4gIHN0b3JhZ2U/OiBEcml2ZXI7XG5cbiAgbGlmZWN5Y2xlPzoge1xuICAgIG9uU3RhcnQ/OiAoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIG9uU2h1dGRvd24/OiAoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yLCByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gIH07XG59O1xuXG4vLyBOT1RFKEhhemUsIDI1MTIwOSk6IGNvbmZpZ+yXkOuKlCBULCBQcm9taXNlPFQ+LCAoKSA9PiBULCAoKSA9PiBQcm9taXNlPFQ+6rCAIOuqqOuRkCDsmKwg7IiYIOyeiOyWtOyVvCDtlaguXG5leHBvcnQgdHlwZSBTb25hbXVDb25maWdFeHBvcnQgPVxuICB8IFNvbmFtdUNvbmZpZ1xuICB8IFByb21pc2U8U29uYW11Q29uZmlnPlxuICB8ICgoKSA9PiBTb25hbXVDb25maWcpXG4gIHwgKCgpID0+IFByb21pc2U8U29uYW11Q29uZmlnPik7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb25maWcoY29uZmlnOiBTb25hbXVDb25maWcpOiBQcm9taXNlPFNvbmFtdUNvbmZpZz47XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29uZmlnKGNvbmZpZzogUHJvbWlzZTxTb25hbXVDb25maWc+KTogUHJvbWlzZTxTb25hbXVDb25maWc+O1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUNvbmZpZyhjb25maWc6ICgpID0+IFNvbmFtdUNvbmZpZyk6IFByb21pc2U8U29uYW11Q29uZmlnPjtcbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb25maWcoY29uZmlnOiAoKSA9PiBQcm9taXNlPFNvbmFtdUNvbmZpZz4pOiBQcm9taXNlPFNvbmFtdUNvbmZpZz47XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29uZmlnKGNvbmZpZzogU29uYW11Q29uZmlnRXhwb3J0KTogUHJvbWlzZTxTb25hbXVDb25maWc+IHtcbiAgaWYgKHR5cGVvZiBjb25maWcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29uZmlnKCkpO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb25maWcpO1xufVxuXG4vKipcbiAqIHNvbmFtdS5jb25maWcudHMg7YyM7J287J2EIOuhnOuTnO2VqeuLiOuLpC5cbiAqIOydtCDshKTsoJUg7YyM7J287J2AIO2ZmOqyveyXkCDrlLDrnbwg64uk66W4IOqyveuhnOyXkCDsnojsnYQg7IiYIOyeiOyKteuLiOuLpC5cbiAqIGRpc3Trpbwg67mM65Oc7ZWY64qUIO2ZmOqyveydtOudvOuptCBkaXN0IOuwlOuhnCDslYTrnpjsl5Ag7J6I7J2EIOqyg+ydtOqzoChjbGktd3JhcHBlci50c+yXkOyEnCDruYzrk5wpLFxuICog6re466CH7KeAIOyViuydgCDtmZjqsr3snbTrnbzrqbQg7ZSE66Gc7KCd7Yq4IOujqO2KuOyXkCDsnojsnYQg6rKD7J6F64uI64ukLlxuICpcbiAqIOydtCDtlajsiJjripQg7J2Y64+E7KCB7Jy866GcIOuLpOuluCDsnZjsobTshLHsnZgg7IKs7Jqp7J2EIOy1nOuMgO2VnCDrsLDsoJztlZjsmIDsirXri4jri6QuXG4gKiDsnbTripQg7Iuk7ZaJIOy0iOq4sOyXkCDstZzrjIDtlZwg67mg66W06rKMIOyEpOygleydhCDsnb3slrTsmKwg7IiYIOyeiOuPhOuhnSDtlZjquLAg7JyE7ZWo7J6F64uI64ukLlxuICog65Sw65287IScIOqyveuhnCBjb25jYXTqs7wgVVJMIHNjaGVtZSDstpTqsIDrj4Qg64uo7Iic7ZWcIOusuOyekOyXtCDsobDsnpHsnLzroZwg7LKY66as7ZWY7JiA7Iq164uI64ukLlxuICpcbiAqIEBwYXJhbSByb290UGF0aFxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRDb25maWcocm9vdFBhdGg6IHN0cmluZyk6IFByb21pc2U8U29uYW11Q29uZmlnPiB7XG4gIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPVxuICAgIHByb2Nlc3MuZW52LkhPVCA9PT0gXCJ5ZXNcIiB8fCBwcm9jZXNzLmVudi5WSVRFU1QgPT09IFwidHJ1ZVwiXG4gICAgICA/IGAke3Jvb3RQYXRofS9zcmMvc29uYW11LmNvbmZpZy50c2BcbiAgICAgIDogYCR7cm9vdFBhdGh9L2Rpc3Qvc29uYW11LmNvbmZpZy5qc2A7XG4gIGNvbnN0IHsgZGVmYXVsdDogY29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoYGZpbGU6Ly8ke2NvbmZpZ1BhdGh9YCk7XG4gIGNvbnN0IGltcG9ydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0O1xuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJ0ZXN0XCIgJiZcbiAgICBjb25zb2xlLmxvZyhgW1RJTUlOR10gbG9hZENvbmZpZyB0b29rICR7aW1wb3J0VGltZS50b0ZpeGVkKDIpfW1zYCk7XG4gIHJldHVybiBjb25maWc7XG59XG4iXSwibmFtZXMiOlsiZGVmaW5lQ29uZmlnIiwiY29uZmlnIiwiUHJvbWlzZSIsInJlc29sdmUiLCJsb2FkQ29uZmlnIiwicm9vdFBhdGgiLCJzdGFydCIsInBlcmZvcm1hbmNlIiwibm93IiwiY29uZmlnUGF0aCIsInByb2Nlc3MiLCJlbnYiLCJIT1QiLCJWSVRFU1QiLCJkZWZhdWx0IiwiaW1wb3J0VGltZSIsIk5PREVfRU5WIiwiY29uc29sZSIsImxvZyIsInRvRml4ZWQiXSwibWFwcGluZ3MiOiJBQXVHQSxPQUFPLFNBQVNBLGFBQWFDLE1BQTBCO0lBQ3JELElBQUksT0FBT0EsV0FBVyxZQUFZO1FBQ2hDLE9BQU9DLFFBQVFDLE9BQU8sQ0FBQ0Y7SUFDekI7SUFFQSxPQUFPQyxRQUFRQyxPQUFPLENBQUNGO0FBQ3pCO0FBRUE7Ozs7Ozs7Ozs7OztDQVlDLEdBQ0QsT0FBTyxlQUFlRyxXQUFXQyxRQUFnQjtJQUMvQyxNQUFNQyxRQUFRQyxZQUFZQyxHQUFHO0lBQzdCLE1BQU1DLGFBQ0pDLFFBQVFDLEdBQUcsQ0FBQ0MsR0FBRyxLQUFLLFNBQVNGLFFBQVFDLEdBQUcsQ0FBQ0UsTUFBTSxLQUFLLFNBQ2hELEdBQUdSLFNBQVMscUJBQXFCLENBQUMsR0FDbEMsR0FBR0EsU0FBUyxzQkFBc0IsQ0FBQztJQUN6QyxNQUFNLEVBQUVTLFNBQVNiLE1BQU0sRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFUSxZQUFZO0lBQy9ELE1BQU1NLGFBQWFSLFlBQVlDLEdBQUcsS0FBS0Y7SUFDdkNJLFFBQVFDLEdBQUcsQ0FBQ0ssUUFBUSxLQUFLLFVBQ3ZCQyxRQUFRQyxHQUFHLENBQUMsQ0FBQyx5QkFBeUIsRUFBRUgsV0FBV0ksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ25FLE9BQU9sQjtBQUNUIn0=
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRmFzdGlmeUNvcnNPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L2NvcnNcIjtcbmltcG9ydCB0eXBlIHsgRmFzdGlmeUZvcm1ib2R5T3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9mb3JtYm9keVwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5TXVsdGlwYXJ0T3B0aW9ucyB9IGZyb20gXCJAZmFzdGlmeS9tdWx0aXBhcnRcIjtcbmltcG9ydCB0eXBlIHsgRGVzZXJpYWxpemVGdW5jdGlvbiwgU2VyaWFsaXplRnVuY3Rpb24gfSBmcm9tIFwiQGZhc3RpZnkvcGFzc3BvcnQvZGlzdC9BdXRoZW50aWNhdG9yXCI7XG5pbXBvcnQgdHlwZSB7IFNlY3VyZVNlc3Npb25QbHVnaW5PcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L3NlY3VyZS1zZXNzaW9uXCI7XG5pbXBvcnQgdHlwZSB7IEZhc3RpZnlTdGF0aWNPcHRpb25zIH0gZnJvbSBcIkBmYXN0aWZ5L3N0YXRpY1wiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UsIEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QsIEZhc3RpZnlTZXJ2ZXJPcHRpb25zIH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCB0eXBlIHsgUXNQbHVnaW5PcHRpb25zIH0gZnJvbSBcImZhc3RpZnktcXNcIjtcbmltcG9ydCB0eXBlIHsgU3NlUGx1Z2luT3B0aW9ucyB9IGZyb20gXCJmYXN0aWZ5LXNzZS12Mi9saWIvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgdHlwZSB7IERyaXZlciB9IGZyb20gXCIuLi9maWxlLXN0b3JhZ2UvZHJpdmVyXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUZhc3RpZnlDb25maWcgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VDb25maWcgPSBPbWl0PEtuZXguQ29uZmlnLCBcImNvbm5lY3Rpb25cIj4gJiB7XG4gIGNvbm5lY3Rpb24/OiBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbn07XG5cbmV4cG9ydCB0eXBlIFNvbmFtdUNvbmZpZyA9IHtcbiAgcHJvamVjdE5hbWU/OiBzdHJpbmc7XG5cbiAgYXBpOiB7XG4gICAgZGlyOiBzdHJpbmc7XG4gICAgcm91dGU6IHtcbiAgICAgIHByZWZpeDogc3RyaW5nO1xuICAgIH07XG4gICAgdGltZXpvbmU/OiBzdHJpbmc7XG4gIH07XG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBzdHJpbmdbXTsgLy8gXCJ3ZWJcIiwgXCJhcHBcIiDrk7FcbiAgfTtcbiAgdWk/OiB7XG4gICAgcG9ydDogbnVtYmVyO1xuICB9O1xuXG4gIGRhdGFiYXNlOiB7XG4gICAgLy8g642w7J207YSw67Kg7J207IqkXG4gICAgZGF0YWJhc2U/OiBcInBvc3RncmVzcWxcIjtcbiAgICAvLyDquLDrs7gg642w7J207YSw67Kg7J207IqkIOydtOumhFxuICAgIG5hbWU6IHN0cmluZztcbiAgICAvLyDrqqjrk6Ag7ZmY6rK97JeQIOyggeyaqeuQoCDquLDrs7ggS25leCDsmLXshZhcbiAgICBkZWZhdWx0T3B0aW9uczogRGF0YWJhc2VDb25maWc7XG4gICAgLy8g7ZmY6rK967OEIOyEpOyglVxuICAgIGVudmlyb25tZW50cz86IHtcbiAgICAgIGRldmVsb3BtZW50PzogRGF0YWJhc2VDb25maWc7XG4gICAgICBkZXZlbG9wbWVudF9zbGF2ZT86IERhdGFiYXNlQ29uZmlnO1xuICAgICAgcHJvZHVjdGlvbj86IERhdGFiYXNlQ29uZmlnO1xuICAgICAgcHJvZHVjdGlvbl9zbGF2ZT86IERhdGFiYXNlQ29uZmlnO1xuICAgICAgcmVtb3RlX2ZpeHR1cmU/OiBEYXRhYmFzZUNvbmZpZztcbiAgICB9O1xuICB9O1xuXG4gIHNlcnZlcjogU29uYW11U2VydmVyT3B0aW9ucztcbn07XG5cbmV4cG9ydCB0eXBlIFNvbmFtdVNlcnZlck9wdGlvbnMgPSB7XG4gIGZhc3RpZnk/OiBGYXN0aWZ5U2VydmVyT3B0aW9ucztcblxuICBsaXN0ZW4/OiB7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIGhvc3Q/OiBzdHJpbmc7XG4gIH07XG5cbiAgcGx1Z2lucz86IHtcbiAgICBjb3JzPzogYm9vbGVhbiB8IEZhc3RpZnlDb3JzT3B0aW9ucztcbiAgICBmb3JtYm9keT86IGJvb2xlYW4gfCBGYXN0aWZ5Rm9ybWJvZHlPcHRpb25zO1xuICAgIG11bHRpcGFydD86IGJvb2xlYW4gfCBGYXN0aWZ5TXVsdGlwYXJ0T3B0aW9ucztcbiAgICBxcz86IGJvb2xlYW4gfCBRc1BsdWdpbk9wdGlvbnM7XG4gICAgc3NlPzogYm9vbGVhbiB8IFNzZVBsdWdpbk9wdGlvbnM7XG4gICAgc3RhdGljPzogYm9vbGVhbiB8IEZhc3RpZnlTdGF0aWNPcHRpb25zO1xuICAgIHNlc3Npb24/OiBib29sZWFuIHwgU2VjdXJlU2Vzc2lvblBsdWdpbk9wdGlvbnM7XG5cbiAgICBjdXN0b20/OiAoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UpID0+IHZvaWQ7XG4gIH07XG5cbiAgYXV0aD86XG4gICAgfCBib29sZWFuXG4gICAgfCB7XG4gICAgICAgIHVzZXJTZXJpYWxpemVyOiBTZXJpYWxpemVGdW5jdGlvbjx1bmtub3duLCB1bmtub3duPjtcbiAgICAgICAgdXNlckRlc2VyaWFsaXplcjogRGVzZXJpYWxpemVGdW5jdGlvbjx1bmtub3duLCB1bmtub3duPjtcbiAgICAgIH07XG5cbiAgYXBpQ29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnO1xuXG4gIHN0b3JhZ2U/OiBEcml2ZXI7XG5cbiAgbGlmZWN5Y2xlPzoge1xuICAgIG9uU3RhcnQ/OiAoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIG9uU2h1dGRvd24/OiAoc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuICAgIG9uRXJyb3I/OiAoZXJyb3I6IEVycm9yLCByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG4gIH07XG59O1xuXG4vLyBOT1RFKEhhemUsIDI1MTIwOSk6IGNvbmZpZ+yXkOuKlCBULCBQcm9taXNlPFQ+LCAoKSA9PiBULCAoKSA9PiBQcm9taXNlPFQ+6rCAIOuqqOuRkCDsmKwg7IiYIOyeiOyWtOyVvCDtlaguXG5leHBvcnQgdHlwZSBTb25hbXVDb25maWdFeHBvcnQgPVxuICB8IFNvbmFtdUNvbmZpZ1xuICB8IFByb21pc2U8U29uYW11Q29uZmlnPlxuICB8ICgoKSA9PiBTb25hbXVDb25maWcpXG4gIHwgKCgpID0+IFByb21pc2U8U29uYW11Q29uZmlnPik7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVDb25maWcoY29uZmlnOiBTb25hbXVDb25maWdFeHBvcnQpOiBQcm9taXNlPFNvbmFtdUNvbmZpZz4ge1xuICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb25maWcoKSk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG59XG5cbi8qKlxuICogc29uYW11LmNvbmZpZy50cyDtjIzsnbzsnYQg66Gc65Oc7ZWp64uI64ukLlxuICog7J20IOyEpOyglSDtjIzsnbzsnYAg7ZmY6rK97JeQIOuUsOudvCDri6Trpbgg6rK966Gc7JeQIOyeiOydhCDsiJgg7J6I7Iq164uI64ukLlxuICogZGlzdOulvCDruYzrk5ztlZjripQg7ZmY6rK97J20652866m0IGRpc3Qg67CU66GcIOyVhOuemOyXkCDsnojsnYQg6rKD7J206rOgKGNsaS13cmFwcGVyLnRz7JeQ7IScIOu5jOuTnCksXG4gKiDqt7jroIfsp4Ag7JWK7J2AIO2ZmOqyveydtOudvOuptCDtlITroZzsoJ3tirgg66Oo7Yq47JeQIOyeiOydhCDqsoPsnoXri4jri6QuXG4gKlxuICog7J20IO2VqOyImOuKlCDsnZjrj4TsoIHsnLzroZwg64uk66W4IOydmOyhtOyEseydmCDsgqzsmqnsnYQg7LWc64yA7ZWcIOuwsOygnO2VmOyYgOyKteuLiOuLpC5cbiAqIOydtOuKlCDsi6Ttlokg7LSI6riw7JeQIOy1nOuMgO2VnCDruaDrpbTqsowg7ISk7KCV7J2EIOydveyWtOyYrCDsiJgg7J6I64+E66GdIO2VmOq4sCDsnITtlajsnoXri4jri6QuXG4gKiDrlLDrnbzshJwg6rK966GcIGNvbmNhdOqzvCBVUkwgc2NoZW1lIOy2lOqwgOuPhCDri6jsiJztlZwg66y47J6Q7Je0IOyhsOyekeycvOuhnCDsspjrpqztlZjsmIDsirXri4jri6QuXG4gKlxuICogQHBhcmFtIHJvb3RQYXRoXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZENvbmZpZyhyb290UGF0aDogc3RyaW5nKTogUHJvbWlzZTxTb25hbXVDb25maWc+IHtcbiAgY29uc3Qgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgY29uc3QgY29uZmlnUGF0aCA9XG4gICAgcHJvY2Vzcy5lbnYuSE9UID09PSBcInllc1wiIHx8IHByb2Nlc3MuZW52LlZJVEVTVCA9PT0gXCJ0cnVlXCJcbiAgICAgID8gYCR7cm9vdFBhdGh9L3NyYy9zb25hbXUuY29uZmlnLnRzYFxuICAgICAgOiBgJHtyb290UGF0aH0vZGlzdC9zb25hbXUuY29uZmlnLmpzYDtcbiAgY29uc3QgeyBkZWZhdWx0OiBjb25maWcgfSA9IGF3YWl0IGltcG9ydChgZmlsZTovLyR7Y29uZmlnUGF0aH1gKTtcbiAgY29uc3QgaW1wb3J0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQ7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInRlc3RcIiAmJlxuICAgIGNvbnNvbGUubG9nKGBbVElNSU5HXSBsb2FkQ29uZmlnIHRvb2sgJHtpbXBvcnRUaW1lLnRvRml4ZWQoMil9bXNgKTtcbiAgcmV0dXJuIGNvbmZpZztcbn1cbiJdLCJuYW1lcyI6WyJkZWZpbmVDb25maWciLCJjb25maWciLCJQcm9taXNlIiwicmVzb2x2ZSIsImxvYWRDb25maWciLCJyb290UGF0aCIsInN0YXJ0IiwicGVyZm9ybWFuY2UiLCJub3ciLCJjb25maWdQYXRoIiwicHJvY2VzcyIsImVudiIsIkhPVCIsIlZJVEVTVCIsImRlZmF1bHQiLCJpbXBvcnRUaW1lIiwiTk9ERV9FTlYiLCJjb25zb2xlIiwibG9nIiwidG9GaXhlZCJdLCJtYXBwaW5ncyI6IkFBbUdBLE9BQU8sU0FBU0EsYUFBYUMsTUFBMEI7SUFDckQsSUFBSSxPQUFPQSxXQUFXLFlBQVk7UUFDaEMsT0FBT0MsUUFBUUMsT0FBTyxDQUFDRjtJQUN6QjtJQUVBLE9BQU9DLFFBQVFDLE9BQU8sQ0FBQ0Y7QUFDekI7QUFFQTs7Ozs7Ozs7Ozs7O0NBWUMsR0FDRCxPQUFPLGVBQWVHLFdBQVdDLFFBQWdCO0lBQy9DLE1BQU1DLFFBQVFDLFlBQVlDLEdBQUc7SUFDN0IsTUFBTUMsYUFDSkMsUUFBUUMsR0FBRyxDQUFDQyxHQUFHLEtBQUssU0FBU0YsUUFBUUMsR0FBRyxDQUFDRSxNQUFNLEtBQUssU0FDaEQsR0FBR1IsU0FBUyxxQkFBcUIsQ0FBQyxHQUNsQyxHQUFHQSxTQUFTLHNCQUFzQixDQUFDO0lBQ3pDLE1BQU0sRUFBRVMsU0FBU2IsTUFBTSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUVRLFlBQVk7SUFDL0QsTUFBTU0sYUFBYVIsWUFBWUMsR0FBRyxLQUFLRjtJQUN2Q0ksUUFBUUMsR0FBRyxDQUFDSyxRQUFRLEtBQUssVUFDdkJDLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLHlCQUF5QixFQUFFSCxXQUFXSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbkUsT0FBT2xCO0FBQ1QifQ==
@@ -12,6 +12,8 @@ import type { Context, UploadContext } from "./context";
12
12
  import type { ExtendedApi } from "./decorators";
13
13
  export type SonamuSecrets = {
14
14
  anthropic_api_key?: string;
15
+ voyage_api_key?: string;
16
+ openai_api_key?: string;
15
17
  };
16
18
  declare class SonamuClass {
17
19
  isInitialized: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"sonamu.d.ts","sourceRoot":"","sources":["../../src/api/sonamu.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sonamu.d.ts","sourceRoot":"","sources":["../../src/api/sonamu.ts"],"names":[],"mappings":"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"}
@@ -112,10 +112,19 @@ class SonamuClass {
112
112
  this.config = await loadConfig(this.apiRootPath);
113
113
  // sonamu.config.ts 기본값 설정
114
114
  this.config.database.database = this.config.database.database ?? "postgresql";
115
+ // API 키 환경변수 로드
116
+ const secrets = {};
115
117
  if (process.env.ANTHROPIC_API_KEY) {
116
- this.secrets = {
117
- anthropic_api_key: process.env.ANTHROPIC_API_KEY
118
- };
118
+ secrets.anthropic_api_key = process.env.ANTHROPIC_API_KEY;
119
+ }
120
+ if (process.env.VOYAGE_API_KEY) {
121
+ secrets.voyage_api_key = process.env.VOYAGE_API_KEY;
122
+ }
123
+ if (process.env.OPENAI_API_KEY) {
124
+ secrets.openai_api_key = process.env.OPENAI_API_KEY;
125
+ }
126
+ if (Object.keys(secrets).length > 0) {
127
+ this.secrets = secrets;
119
128
  }
120
129
  // DB 로드
121
130
  const { DB } = await import("../database/db.js");
@@ -124,14 +133,16 @@ class SonamuClass {
124
133
  const chalk = (await import("chalk")).default;
125
134
  console.log(chalk.green("DB Config Loaded!"));
126
135
  }
127
- // 테스팅인 경우 엔티티 로드 & 싱크 없이 중단
136
+ // Entity 로드
137
+ // 테스트에서도 Entity 정보는 필요합니다.
138
+ // upsert가 제대로 작동하려면 entity의 unique index 정보가 필요하기 때문입니다.
139
+ const { EntityManager } = await import("../entity/entity-manager.js");
140
+ await EntityManager.autoload(doSilent);
141
+ // 테스팅인 경우 싱크 없이 중단
128
142
  if (forTesting) {
129
143
  this.isInitialized = true;
130
144
  return;
131
145
  }
132
- // Entity 로드
133
- const { EntityManager } = await import("../entity/entity-manager.js");
134
- await EntityManager.autoload(doSilent);
135
146
  // Syncer
136
147
  const { Syncer } = await import("../syncer/syncer.js");
137
148
  this.syncer = new Syncer();
@@ -281,41 +292,6 @@ class SonamuClass {
281
292
  }
282
293
  // Content-Type
283
294
  reply.type(api.options.contentType ?? "application/json");
284
- // 캐시
285
- const { cacheKey, cacheTtl, cachedData } = await (async ()=>{
286
- if (config.cache) {
287
- try {
288
- const cacheKeyRes = config.cache.resolveKey(api.path, reqBody);
289
- if (cacheKeyRes.cache === false) {
290
- return {
291
- cacheKey: null,
292
- cachedData: null
293
- };
294
- }
295
- const cacheKey = cacheKeyRes.key;
296
- const cacheTtl = cacheKeyRes.ttl;
297
- const cachedData = await config.cache.get(cacheKey);
298
- return {
299
- cacheKey,
300
- cacheTtl,
301
- cachedData
302
- };
303
- } catch (e) {
304
- console.error(e);
305
- }
306
- return {
307
- cacheKey: null,
308
- cachedData: null
309
- };
310
- }
311
- return {
312
- cacheKey: null,
313
- cachedData: null
314
- };
315
- })();
316
- if (cachedData !== null) {
317
- return cachedData;
318
- }
319
295
  // createSSEFactory 함수에 미리 request의 socket과 reply를 바인딩.
320
296
  const { createSSEFactory } = await import("../stream/sse.js");
321
297
  const createSSE = ((_request, _reply, _events)=>createSSEFactory(_request.socket, _reply, _events)).bind(null, request, reply);
@@ -349,10 +325,6 @@ class SonamuClass {
349
325
  }
350
326
  }));
351
327
  reply.type(api.options.contentType ?? "application/json");
352
- // 캐시 키 있는 경우 갱신 후 저장
353
- if (config.cache && cacheKey) {
354
- await config.cache.put(cacheKey, result, cacheTtl);
355
- }
356
328
  return result;
357
329
  });
358
330
  };
@@ -510,4 +482,4 @@ class SonamuClass {
510
482
  }
511
483
  export const Sonamu = new SonamuClass();
512
484
 
513
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCB0eXBlIHsgRlNXYXRjaGVyIH0gZnJvbSBcImNob2tpZGFyXCI7XG5pbXBvcnQgdHlwZSB7IEZhc3RpZnlJbnN0YW5jZSwgRmFzdGlmeVJlcGx5LCBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgdHlwZSB7IEluY29taW5nTWVzc2FnZSwgU2VydmVyLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgdHlwZSB7IERyaXZlciB9IGZyb20gXCIuLi9maWxlLXN0b3JhZ2UvZHJpdmVyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHR5cGUgeyBTeW5jZXIgfSBmcm9tIFwiLi4vc3luY2VyL3N5bmNlclwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVGYXN0aWZ5Q29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUNvbmZpZywgU29uYW11U2VydmVyT3B0aW9ucyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoQ29udGV4dCwgQ29udGV4dCwgVXBsb2FkQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCB0eXBlIFNvbmFtdVNlY3JldHMgPSB7XG4gIGFudGhyb3BpY19hcGlfa2V5Pzogc3RyaW5nO1xufTtcbmNsYXNzIFNvbmFtdUNsYXNzIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGFzeW5jTG9jYWxTdG9yYWdlOiBBc3luY0xvY2FsU3RvcmFnZTx7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcblxuICBwdWJsaWMgdXBsb2FkU3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8e1xuICAgIHVwbG9hZENvbnRleHQ6IFVwbG9hZENvbnRleHQ7XG4gIH0+ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG5cbiAgcHVibGljIGdldENvbnRleHQoKTogQ29udGV4dCB7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKHN0b3JlPy5jb250ZXh0KSB7XG4gICAgICByZXR1cm4gc3RvcmUuY29udGV4dDtcbiAgICB9XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICAvLyDthYzsiqTtjIUg7ZmY6rK97JeQ7IScIOy7qO2FjeyKpO2KuOqwgCDso7zsnoXrkJjsp4Ag7JWK7J2AIOqyveyasCDruYgg7Luo7YWN7Iqk7Yq4IOumrO2EtFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVxdWVzdDogbnVsbCxcbiAgICAgICAgcmVwbHk6IG51bGwsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBjcmVhdGVTU0U6ICgpID0+IHt9LFxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICAgIG5haXRlU3RvcmU6IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCksXG4gICAgICB9IGFzIHVua25vd24gYXMgQ29udGV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGNhbm5vdCBmaW5kIGNvbnRleHRcIik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFVwbG9hZENvbnRleHQoKTogVXBsb2FkQ29udGV4dCB7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLnVwbG9hZFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LnVwbG9hZENvbnRleHQpIHtcbiAgICAgIHJldHVybiBzdG9yZS51cGxvYWRDb250ZXh0O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgdXBsb2FkIGNvbnRleHQuIERpZCB5b3UgdXNlIEB1cGxvYWQgZGVjb3JhdG9yP1wiKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwaVJvb3RQYXRoOiBBYnNvbHV0ZVBhdGggfCBudWxsID0gbnVsbDtcbiAgc2V0IGFwaVJvb3RQYXRoKGFwaVJvb3RQYXRoOiBBYnNvbHV0ZVBhdGgpIHtcbiAgICB0aGlzLl9hcGlSb290UGF0aCA9IGFwaVJvb3RQYXRoO1xuICB9XG4gIGdldCBhcGlSb290UGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICAgIGlmICh0aGlzLl9hcGlSb290UGF0aCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FwaVJvb3RQYXRoO1xuICB9XG4gIGdldCBhcHBSb290UGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFwaVJvb3RQYXRoLnNwbGl0KHBhdGguc2VwKS5zbGljZSgwLCAtMSkuam9pbihwYXRoLnNlcCk7XG4gIH1cblxuICBwcml2YXRlIF9kYkNvbmZpZzogU29uYW11REJDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGRiQ29uZmlnKGRiQ29uZmlnOiBTb25hbXVEQkNvbmZpZykge1xuICAgIHRoaXMuX2RiQ29uZmlnID0gZGJDb25maWc7XG4gIH1cbiAgZ2V0IGRiQ29uZmlnKCk6IFNvbmFtdURCQ29uZmlnIHtcbiAgICBpZiAodGhpcy5fZGJDb25maWcgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kYkNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNlcjogU3luY2VyIHwgbnVsbCA9IG51bGw7XG4gIHNldCBzeW5jZXIoc3luY2VyOiBTeW5jZXIpIHtcbiAgICB0aGlzLl9zeW5jZXIgPSBzeW5jZXI7XG4gIH1cbiAgZ2V0IHN5bmNlcigpOiBTeW5jZXIge1xuICAgIGlmICh0aGlzLl9zeW5jZXIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zeW5jZXI7XG4gIH1cblxuICBwcml2YXRlIF9jb25maWc6IFNvbmFtdUNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBzZXQgY29uZmlnKGNvbmZpZzogU29uYW11Q29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICB9XG4gIGdldCBjb25maWcoKTogU29uYW11Q29uZmlnIHtcbiAgICBpZiAodGhpcy5fY29uZmlnID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2VjcmV0czogU29uYW11U2VjcmV0cyB8IG51bGwgPSBudWxsO1xuICBzZXQgc2VjcmV0cyhzZWNyZXRzOiBTb25hbXVTZWNyZXRzKSB7XG4gICAgdGhpcy5fc2VjcmV0cyA9IHNlY3JldHM7XG4gIH1cbiAgZ2V0IHNlY3JldHMoKTogU29uYW11U2VjcmV0cyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zZWNyZXRzO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RvcmFnZTogRHJpdmVyIHwgbnVsbCA9IG51bGw7XG4gIHNldCBzdG9yYWdlKHN0b3JhZ2U6IERyaXZlcikge1xuICAgIHRoaXMuX3N0b3JhZ2UgPSBzdG9yYWdlO1xuICB9XG4gIGdldCBzdG9yYWdlKCk6IERyaXZlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlO1xuICB9XG5cbiAgLy8gSE1SIOyymOumrFxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVuZGluZ0ZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGhtclN0YXJ0VGltZTogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UgfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBpbml0Rm9yVGVzdGluZygpIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBpbml0KFxuICAgIGRvU2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4gICAgZW5hYmxlU3luYzogYm9vbGVhbiA9IHRydWUsXG4gICAgYXBpUm9vdFBhdGg/OiBBYnNvbHV0ZVBhdGgsXG4gICAgZm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zb2xlLnRpbWUoY2hhbGsuY3lhbihgU29uYW11LmluaXQke2ZvclRlc3RpbmcgPyBcIiBmb3IgdGVzdGluZ1wiIDogXCJcIn1gKSk7XG4gICAgfVxuXG4gICAgLy8gQVBJIOujqO2KuCDtjKjsiqRcbiAgICBjb25zdCB7IGZpbmRBcGlSb290UGF0aCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvdXRpbHNcIik7XG4gICAgdGhpcy5hcGlSb290UGF0aCA9IGFwaVJvb3RQYXRoID8/IGZpbmRBcGlSb290UGF0aCgpO1xuXG4gICAgY29uc3QgeyBsb2FkQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvbmZpZ1wiKTtcbiAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcodGhpcy5hcGlSb290UGF0aCk7XG4gICAgLy8gc29uYW11LmNvbmZpZy50cyDquLDrs7jqsJIg7ISk7KCVXG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBvc3RncmVzcWxcIjtcblxuICAgIGlmIChwcm9jZXNzLmVudi5BTlRIUk9QSUNfQVBJX0tFWSkge1xuICAgICAgdGhpcy5zZWNyZXRzID0ge1xuICAgICAgICBhbnRocm9waWNfYXBpX2tleTogcHJvY2Vzcy5lbnYuQU5USFJPUElDX0FQSV9LRVksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIERCIOuhnOuTnFxuICAgIGNvbnN0IHsgREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIHRoaXMuZGJDb25maWcgPSBEQi5nZW5lcmF0ZURCQ29uZmlnKHRoaXMuY29uZmlnLmRhdGFiYXNlKTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiREIgQ29uZmlnIExvYWRlZCFcIikpO1xuICAgIH1cblxuICAgIC8vIO2FjOyKpO2MheyduCDqsr3smrAg7JeU7Yuw7YuwIOuhnOuTnCAmIOyLse2BrCDsl4bsnbQg7KSR64uoXG4gICAgaWYgKGZvclRlc3RpbmcpIHtcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRW50aXR5IOuhnOuTnFxuICAgIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoZG9TaWxlbnQpO1xuXG4gICAgLy8gU3luY2VyXG4gICAgY29uc3QgeyBTeW5jZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci9zeW5jZXJcIik7XG4gICAgdGhpcy5zeW5jZXIgPSBuZXcgU3luY2VyKCk7XG5cbiAgICAvLyBBdXRvbG9hZDogTW9kZWxzIC8gVHlwZXMgLyBBUElzXG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICBjb25zdCB7IFRlbXBsYXRlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGVtcGxhdGVcIik7XG4gICAgYXdhaXQgVGVtcGxhdGVNYW5hZ2VyLmF1dG9sb2FkKCk7XG5cbiAgICBjb25zdCB7IGlzTG9jYWwsIGlzVGVzdCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICAvLyDroZzsu6zsl5DshJzripQg7L2U65OcIOyDneyEseydhCDsnITtlbQgQmlvbWUg7IWL7JeF7J20IO2VhOyalO2VqCAo7ZiE7J6sIGFwaVJvb3RQYXRoIOyghOuLrO2VmOyXrCDsi6TtlokpXG4gICAgICAoYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvZm9ybWF0dGVyXCIpKS5zZXR1cEJpb21lKHRoaXMuYXBpUm9vdFBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaXNIb3RSZWxvYWRTZXJ2ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSAmJiAhaXNUZXN0KCkgJiYgaXNIb3RSZWxvYWRTZXJ2ZXIoKSAmJiBlbmFibGVTeW5jKSB7XG4gICAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jKCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXYXRjaGVyKCk7XG5cbiAgICAgIHRoaXMuc3luY2VyLnN5bmNVSSgpO1xuICAgIH1cblxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zb2xlLnRpbWVFbmQoY2hhbGsuY3lhbihcIlNvbmFtdS5pbml0XCIpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXJ2ZXIoaW5pdE9wdGlvbnM/OiB7IGVuYWJsZVN5bmM/OiBib29sZWFuOyBkb1NpbGVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQoaW5pdE9wdGlvbnM/LmRvU2lsZW50LCBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBjb25zdCBmYXN0aWZ5ID0gKGF3YWl0IGltcG9ydChcImZhc3RpZnlcIikpLmRlZmF1bHQ7XG4gICAgY29uc3Qgc2VydmVyID0gZmFzdGlmeShvcHRpb25zLmZhc3RpZnkpO1xuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg7KCA7J6lXG4gICAgaWYgKG9wdGlvbnMuc3RvcmFnZSkge1xuICAgICAgdGhpcy5zdG9yYWdlID0gb3B0aW9ucy5zdG9yYWdlO1xuICAgIH1cblxuICAgIC8vIO2UjOufrOq3uOyduCDrk7HroZ1cbiAgICBpZiAob3B0aW9ucy5wbHVnaW5zKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXIsIG9wdGlvbnMucGx1Z2lucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgICAgaWYgKCFvcHRpb25zLnBsdWdpbnM/LnNlc3Npb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXV0aCByZXF1aXJlcyBzZXNzaW9uIHBsdWdpbi4gUGxlYXNlIGFkZCBwbHVnaW5zLnNlc3Npb24gY29uZmlndXJhdGlvbi5cIik7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHNlcnZlcjtcbiAgfVxuXG4gIGFzeW5jIHdpdGhGYXN0aWZ5KFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBlbmFibGVTeW5jPzogYm9vbGVhbjtcbiAgICAgIGRvU2lsZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KG9wdGlvbnM/LmRvU2lsZW50LCBvcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIHRpbWV6b25lIOyEpOyglVxuICAgIGNvbnN0IHRpbWV6b25lID0gdGhpcy5jb25maWcuYXBpLnRpbWV6b25lO1xuICAgIGlmICh0aW1lem9uZSkge1xuICAgICAgLy8g7YOA7J6E7KG07JeQIOunnuqyjCDsnZHri7Ug64Kg7KecIOyKpO2KuOungeydhCDrs4DtmZjtlbTso7zslrTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g6rCA66C5IHRpbWV6b25l7J20IFwiQXNpYS9TZW91bFwiIOydtOuptFxuICAgICAgLy8gXCIyMDI1LTExLTIxVDAwOjAwOjAwLjAwMFpcIiDrpbwgXCIyMDI1LTExLTIxVDA5OjAwOjAwKzA5OjAwXCIg7Jy866GcIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICBjb25zdCB7IGZvcm1hdEluVGltZVpvbmUgfSA9IGF3YWl0IGltcG9ydChcImRhdGUtZm5zLXR6XCIpO1xuXG4gICAgICAvLyBJU08gODYwMSDrgqDsp5wg7ZiV7IudIOygleq3nOyLnSAo7JiIOiAyMDI0LTAxLTE1VDA5OjMwOjAwLjAwMFopXG4gICAgICBjb25zdCBJU09fREFURV9SRUdFWCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkezN9KT9aJC87XG5cbiAgICAgIC8vIFTrpbwg65GY65+s7Iu8IOyekeydgOuUsOyYtO2RnOqwgCDsl4bri6TrqbQgXCIyMDI1LTExLTE5MTc2MzU0NjE4OTAwMDE4OjU2OjI5KzA5OjAwXCLsmYAg6rCZ7J2AIOqysOqzvOqwgCDrgpjsmLXri4jri6QuXG4gICAgICAvLyDsnbTripQgZGF0ZS1mbnMg7Yq57J6F64uI64ukLlxuICAgICAgLy8g7J2066CH6rKMIO2VtOuPhCDqtJzssK7sirXri4jri6QuIFwiMjAyNS0xMS0xOVQxODo1NjoyOSswOTowMFwiIOuqqOyWkeycvOuhnCDsnpgg64KY7Ji164uI64ukLlxuICAgICAgY29uc3QgREFURV9GT1JNQVQgPSBcInl5eXktTU0tZGQnVCdISDptbTpzc1hYWFwiO1xuXG4gICAgICBzZXJ2ZXIuc2V0UmVwbHlTZXJpYWxpemVyKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIElTT19EQVRFX1JFR0VYLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0SW5UaW1lWm9uZShcbiAgICAgICAgICAgICAgbmV3IERhdGUodmFsdWUpLFxuICAgICAgICAgICAgICB0aW1lem9uZSBhcyBgJHtzdHJpbmd9LyR7c3RyaW5nfWAsXG4gICAgICAgICAgICAgIERBVEVfRk9STUFULFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFvcHRpb25zPy5kb1NpbGVudCkge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFRpbWV6b25lIHNldCB0byAke3RpbWV6b25lfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsoITssrQg65287Jqw7YyFIOumrOyKpO2KuFxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9yb3V0ZXNgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHR5cGVvZiB0aGlzLnN5bmNlci5hcGlzPiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlci5hcGlzO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gSGVhbHRoY2hlY2sgQVBJXG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L2hlYWx0aGNoZWNrYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEFQSSDrnbzsmrDtjIUgKOuhnOy7rEhNUiDsg4Htg5zsmYAg6rWs67aEKVxuICAgIGNvbnN0IHsgaXNMb2NhbCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICBzZXJ2ZXIuYWxsKFwiKlwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLnN5bmNlci5hcGlzLmZpbmQoXG4gICAgICAgICAgKGFwaSkgPT5cbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXggKyBhcGkucGF0aCA9PT0gcmVxdWVzdC51cmwuc3BsaXQoXCI/XCIpWzBdICYmXG4gICAgICAgICAgICAoYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiKSA9PT0gcmVxdWVzdC5tZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXBpSGFuZGxlcihmb3VuZCwgY29uZmlnKShyZXF1ZXN0LCByZXBseSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBOb3RGb3VuZEV4Y2VwdGlvbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCIpO1xuICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oXCLsobTsnqztlZjsp4Ag7JWK64qUIEFQSSDsoJHqt7zsnoXri4jri6QuXCIpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHRoaXMuc3luY2VyLmFwaXMpIHtcbiAgICAgICAgLy8gbW9kZWxcbiAgICAgICAgaWYgKHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsoJXsnZjrkJjsp4Ag7JWK7J2AIOuqqOuNuOyXkCDsoJHqt7wgJHthcGkubW9kZWxOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcm91dGVcbiAgICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgICBtZXRob2Q6IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPz8gXCJHRVRcIixcbiAgICAgICAgICB1cmw6IHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXggKyBhcGkucGF0aCxcbiAgICAgICAgICBoYW5kbGVyOiB0aGlzLmdldEFwaUhhbmRsZXIoYXBpLCBjb25maWcpLFxuICAgICAgICB9KTsgLy8gRU5EIHNlcnZlci5yb3V0ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldEFwaUhhbmRsZXIoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICk6IChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSkgPT4gUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGFzeW5jIChyZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCwgcmVwbHk6IEZhc3RpZnlSZXBseSk6IFByb21pc2U8dW5rbm93bj4gPT4ge1xuICAgICAgKGFwaS5vcHRpb25zLmd1YXJkcyA/PyBbXSkuZXZlcnkoKGd1YXJkKSA9PiBjb25maWcuZ3VhcmRIYW5kbGVyKGd1YXJkLCByZXF1ZXN0LCBhcGkpKTtcblxuICAgICAgLy8g7YyM652866+47YSwIOygleuztOuhnCB6b2Qg7Iqk7YKk66eIIOu5jOuTnFxuICAgICAgY29uc3QgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvZGUtY29udmVydGVyc1wiKTtcbiAgICAgIGNvbnN0IFJlcVR5cGUgPSBnZXRab2RPYmplY3RGcm9tQXBpKGFwaSwgdGhpcy5zeW5jZXIudHlwZXMpO1xuXG4gICAgICAvLyByZXF1ZXN0IO2MjOyLsVxuICAgICAgY29uc3Qgd2hpY2ggPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIkdFVFwiID8gXCJxdWVyeVwiIDogXCJib2R5XCI7XG4gICAgICBsZXQgcmVxQm9keToge1xuICAgICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgZmFzdGlmeUNhc3RlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jYXN0ZXJcIik7XG4gICAgICAgIHJlcUJvZHkgPSBmYXN0aWZ5Q2FzdGVyKFJlcVR5cGUpLnBhcnNlKHJlcXVlc3Rbd2hpY2hdID8/IHt9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3QgeyBab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiem9kXCIpO1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFpvZEVycm9yKSB7XG4gICAgICAgICAgY29uc3QgeyBodW1hbml6ZVpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy96b2QtZXJyb3JcIik7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBodW1hbml6ZVpvZEVycm9yKGUpXG4gICAgICAgICAgICAubWFwKChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSlcbiAgICAgICAgICAgIC5qb2luKFwiIFwiKTtcbiAgICAgICAgICBjb25zdCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSA9IGF3YWl0IGltcG9ydChcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiKTtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihtZXNzYWdlcywge1xuICAgICAgICAgICAgem9kRXJyb3I6IGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDb250ZW50LVR5cGVcbiAgICAgIHJlcGx5LnR5cGUoYXBpLm9wdGlvbnMuY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgICAvLyDsupDsi5xcbiAgICAgIGNvbnN0IHsgY2FjaGVLZXksIGNhY2hlVHRsLCBjYWNoZWREYXRhIH0gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoY29uZmlnLmNhY2hlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlS2V5UmVzID0gY29uZmlnLmNhY2hlLnJlc29sdmVLZXkoYXBpLnBhdGgsIHJlcUJvZHkpO1xuICAgICAgICAgICAgaWYgKGNhY2hlS2V5UmVzLmNhY2hlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICByZXR1cm4geyBjYWNoZUtleTogbnVsbCwgY2FjaGVkRGF0YTogbnVsbCB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IGNhY2hlS2V5UmVzLmtleTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlVHRsID0gY2FjaGVLZXlSZXMudHRsO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkRGF0YSA9IGF3YWl0IGNvbmZpZy5jYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHsgY2FjaGVLZXksIGNhY2hlVHRsLCBjYWNoZWREYXRhIH07XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgY2FjaGVLZXk6IG51bGwsIGNhY2hlZERhdGE6IG51bGwgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjYWNoZUtleTogbnVsbCwgY2FjaGVkRGF0YTogbnVsbCB9O1xuICAgICAgfSkoKTtcbiAgICAgIGlmIChjYWNoZWREYXRhICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWREYXRhO1xuICAgICAgfVxuXG4gICAgICAvLyBjcmVhdGVTU0VGYWN0b3J5IO2VqOyImOyXkCDrr7jrpqwgcmVxdWVzdOydmCBzb2NrZXTqs7wgcmVwbHnrpbwg67CU7J2465SpLlxuICAgICAgY29uc3QgeyBjcmVhdGVTU0VGYWN0b3J5IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zdHJlYW0vc3NlXCIpO1xuICAgICAgY29uc3QgY3JlYXRlU1NFID0gKDxUIGV4dGVuZHMgWm9kT2JqZWN0PihcbiAgICAgICAgX3JlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgICAgICBfcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgICAgICAgX2V2ZW50czogVCxcbiAgICAgICkgPT4gY3JlYXRlU1NFRmFjdG9yeShfcmVxdWVzdC5zb2NrZXQsIF9yZXBseSwgX2V2ZW50cykpLmJpbmQobnVsbCwgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0ge1xuICAgICAgICAuLi4oYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICAgIGNvbmZpZy5jb250ZXh0UHJvdmlkZXIoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICAgIHJlcGx5LFxuICAgICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICAgICAgbmFpdGVTdG9yZTogTmFpdGUuY3JlYXRlU3RvcmUoKSxcbiAgICAgICAgICAgICAgLy8gYXV0aFxuICAgICAgICAgICAgICB1c2VyOiByZXF1ZXN0LnVzZXIgPz8gbnVsbCxcbiAgICAgICAgICAgICAgcGFzc3BvcnQ6IHtcbiAgICAgICAgICAgICAgICBsb2dpbjogcmVxdWVzdC5sb2dpbi5iaW5kKHJlcXVlc3QpIGFzIEF1dGhDb250ZXh0W1wicGFzc3BvcnRcIl1bXCJsb2dpblwiXSxcbiAgICAgICAgICAgICAgICBsb2dvdXQ6IHJlcXVlc3QubG9nb3V0LmJpbmQocmVxdWVzdCkgYXMgQXV0aENvbnRleHRbXCJwYXNzcG9ydFwiXVtcImxvZ291dFwiXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgcmVwbHksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXTtcbiAgICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IEFwaVBhcmFtVHlwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIik7XG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogbW9kZWzsnYAg66qo6424IOyduOyKpO2EtOyKpOydtOuvgOuhnCDrqZTshJzrk5wg7Zi47LacIOqwgOuKpVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAobW9kZWwgYXMgYW55KVthcGkubWV0aG9kTmFtZV0uYXBwbHkoXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgLy8gQ29udGV4dCDsnbjsoJ3shZhcbiAgICAgICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcUJvZHlbcGFyYW0ubmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIHJlcGx5LnR5cGUoYXBpLm9wdGlvbnMuY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgICAgIC8vIOy6kOyLnCDtgqQg7J6I64qUIOqyveyasCDqsLHsi6Ag7ZuEIOyggOyepVxuICAgICAgICBpZiAoY29uZmlnLmNhY2hlICYmIGNhY2hlS2V5KSB7XG4gICAgICAgICAgYXdhaXQgY29uZmlnLmNhY2hlLnB1dChjYWNoZUtleSwgcmVzdWx0LCBjYWNoZVR0bCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBhc3luYyBzdGFydFdhdGNoZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2F0Y2hQYXRoID0gW3BhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInNyY1wiKV07XG5cbiAgICBjb25zdCBjaG9raWRhciA9IChhd2FpdCBpbXBvcnQoXCJjaG9raWRhclwiKSkuZGVmYXVsdDtcbiAgICB0aGlzLndhdGNoZXIgPSBjaG9raWRhci53YXRjaCh3YXRjaFBhdGgsIHtcbiAgICAgIGlnbm9yZWQ6IChwYXRoLCBzdGF0cykgPT5cbiAgICAgICAgISFzdGF0cz8uaXNGaWxlKCkgJiYgIXBhdGguZW5kc1dpdGgoXCIudHNcIikgJiYgIXBhdGguZW5kc1dpdGgoXCIuanNvblwiKSxcbiAgICAgIHBlcnNpc3RlbnQ6IHRydWUsXG4gICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy53YXRjaGVyLm9uKFwiYWxsXCIsIGFzeW5jIChldmVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCBhcyBBYnNvbHV0ZVBhdGg7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGFic29sdXRlUGF0aC5zdGFydHNXaXRoKHRoaXMuYXBpUm9vdFBhdGgpLFxuICAgICAgICBcIkZpbGUgcGF0aCBpcyBub3Qgd2l0aGluIHRoZSBBUEkgcm9vdCBwYXRoXCIsXG4gICAgICApO1xuXG4gICAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBzb25hbXUuY29uZmlnLnRzIOuzgOqyvSDsi5wg7J6s7Iuc7J6RXG4gICAgICAgIGNvbnN0IGlzQ29uZmlnVHMgPSBmaWxlUGF0aCA9PT0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcblxuICAgICAgICBpZiAoaXNDb25maWdUcykge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UodGhpcy5hcGlSb290UGF0aCwgXCJhcGlcIik7XG4gICAgICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfSAtIFJlc3RhcnRpbmcuLi5gKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgXCJTSUdVU1IyXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmlsZUNoYW5nZShldmVudCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAgIEEgZnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW5pdCBhbmQgZGVzdHJveSB3aGVuIHVzaW5nIFNvbmFtdSB2aWEgc2NyaXB0cy4gICAgXG4gICovXG4gIGFzeW5jIHJ1blNjcmlwdChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQbHVnaW5zKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBwbHVnaW5zOiBTb25hbXVTZXJ2ZXJPcHRpb25zW1wicGx1Z2luc1wiXSkge1xuICAgIGlmICghcGx1Z2lucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbnNNb2R1bGVzID0ge1xuICAgICAgY29yczogXCJAZmFzdGlmeS9jb3JzXCIsXG4gICAgICBmb3JtYm9keTogXCJAZmFzdGlmeS9mb3JtYm9keVwiLFxuICAgICAgbXVsdGlwYXJ0OiBcIkBmYXN0aWZ5L211bHRpcGFydFwiLFxuICAgICAgcXM6IFwiZmFzdGlmeS1xc1wiLFxuICAgICAgc3NlOiBcImZhc3RpZnktc3NlLXYyXCIsXG4gICAgICBzdGF0aWM6IFwiQGZhc3RpZnkvc3RhdGljXCIsXG4gICAgICBzZXNzaW9uOiBcIkBmYXN0aWZ5L3NlY3VyZS1zZXNzaW9uXCIsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyUGx1Z2luID0gYXN5bmMgPEsgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTx0eXBlb2YgcGx1Z2lucz4+KFxuICAgICAga2V5OiBLLFxuICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcGx1Z2luc1trZXldO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBwbHVnaW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zTW9kdWxlcykpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyUGx1Z2luKGtleSBhcyBrZXlvZiB0eXBlb2YgcGx1Z2lucywgcGx1Z2luTmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnMuY3VzdG9tKSB7XG4gICAgICBwbHVnaW5zLmN1c3RvbShzZXJ2ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJBdXRoKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLFxuICAgIG9wdGlvbnM6IE5vbk51bGxhYmxlPFNvbmFtdVNlcnZlck9wdGlvbnNbXCJhdXRoXCJdPixcbiAgKSB7XG4gICAgLy8gYXdhaXQgaW1wb3J0KFwiZmFzdGlmeVwiKTtcbiAgICBjb25zdCBmYXN0aWZ5UGFzc3BvcnQgPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvcGFzc3BvcnRcIikpLmRlZmF1bHQ7XG4gICAgc2VydmVyLnJlZ2lzdGVyKGZhc3RpZnlQYXNzcG9ydC5pbml0aWFsaXplKCkpO1xuICAgIHNlcnZlci5yZWdpc3RlcihmYXN0aWZ5UGFzc3BvcnQuc2VjdXJlU2Vzc2lvbigpKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGZhc3RpZnlQYXNzcG9ydC5yZWdpc3RlclVzZXJTZXJpYWxpemVyKGFzeW5jICh1c2VyLCBfcmVxdWVzdCkgPT4gdXNlcik7XG4gICAgICBmYXN0aWZ5UGFzc3BvcnQucmVnaXN0ZXJVc2VyRGVzZXJpYWxpemVyKGFzeW5jIChzZXJpYWxpemVkLCBfcmVxdWVzdCkgPT4gc2VyaWFsaXplZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZhc3RpZnlQYXNzcG9ydC5yZWdpc3RlclVzZXJTZXJpYWxpemVyKG9wdGlvbnMudXNlclNlcmlhbGl6ZXIpO1xuICAgICAgZmFzdGlmeVBhc3Nwb3J0LnJlZ2lzdGVyVXNlckRlc2VyaWFsaXplcihvcHRpb25zLnVzZXJEZXNlcmlhbGl6ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYm9vdChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgb3B0aW9uczogU29uYW11U2VydmVyT3B0aW9ucykge1xuICAgIGNvbnN0IHBvcnQgPSBvcHRpb25zLmxpc3Rlbj8ucG9ydCA/PyAzMDAwO1xuICAgIGNvbnN0IGhvc3QgPSBvcHRpb25zLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblNodXRkb3duPy4oc2VydmVyKTtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2h1dGRvd24gPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgc2h1dGRvd246XCIsIGVycik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgc2h1dGRvd24pO1xuXG4gICAgaWYgKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKSB7XG4gICAgICBzZXJ2ZXIuc2V0RXJyb3JIYW5kbGVyKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKTtcbiAgICB9XG5cbiAgICBzZXJ2ZXJcbiAgICAgIC5saXN0ZW4oeyBwb3J0LCBob3N0IH0pXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblN0YXJ0Py4oc2VydmVyKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goYXN5bmMgKGVycikgPT4ge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJGYWlsZWQgdG8gc3RhcnQgc2VydmVyOlwiLCBlcnIpKTtcbiAgICAgICAgYXdhaXQgc2h1dGRvd24oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlKGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDssqsg67KI7Ke4IO2MjOydvOydtOuptCBITVIg7Iuc7J6RIOyLnOqwhCDquLDroZ1cbiAgICBpZiAodGhpcy5wZW5kaW5nRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmhtclN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0ZpbGVzLnB1c2goZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmFwaVJvb3RQYXRoLCBmaWxlUGF0aCk7XG4gICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChgRGV0ZWN0ZWQoJHtldmVudH0pOiAke2NoYWxrLmJsdWUocmVsYXRpdmVQYXRoKX1gKSk7XG5cbiAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jRnJvbVdhdGNoZXIoZXZlbnQsIGZpbGVQYXRoKTtcblxuICAgIC8vIOyymOumrCDsmYTro4zrkJwg7YyM7J287J2EIOuMgOq4sCDrqqnroZ3sl5DshJwg7KCc6rGwXG4gICAgdGhpcy5wZW5kaW5nRmlsZXMgPSB0aGlzLnBlbmRpbmdGaWxlcy5zbGljZSgxKTtcblxuICAgIC8vIOuqqOuToCDtjIzsnbwg7LKY66as6rCAIOyZhOujjOuQmOuptCDstZzsooUg66mU7Iuc7KeAIOy2nOugpVxuICAgIGlmICh0aGlzLnBlbmRpbmdGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZmluaXNoSE1SKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5pc2hITVIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIucmVuZXdDaGVja3N1bXMoKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRvdGFsVGltZSA9IGVuZFRpbWUgLSB0aGlzLmhtclN0YXJ0VGltZTtcbiAgICBjb25zdCBbY2hhbGssIHsgY2VudGVyVGV4dCB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdCxcbiAgICAgIGltcG9ydChcIi4uL3V0aWxzL2NvbnNvbGUtdXRpbFwiKSxcbiAgICBdKTtcbiAgICBjb25zdCBtc2cgPSBgSE1SIERvbmUhICR7Y2hhbGsuYm9sZC53aGl0ZShgJHt0b3RhbFRpbWV9bXNgKX1gO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KG1zZykpKTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBCYXNlTW9kZWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIik7XG4gICAgYXdhaXQgQmFzZU1vZGVsLmRlc3Ryb3koKTtcbiAgICBhd2FpdCB0aGlzLndhdGNoZXI/LmNsb3NlKCk7XG4gICAgdGhpcy5zdG9yYWdlPy5kZXN0cm95KCk7XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBTb25hbXUgPSBuZXcgU29uYW11Q2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJBc3luY0xvY2FsU3RvcmFnZSIsInBhdGgiLCJOYWl0ZSIsIlNvbmFtdUNsYXNzIiwiaXNJbml0aWFsaXplZCIsImFzeW5jTG9jYWxTdG9yYWdlIiwidXBsb2FkU3RvcmFnZSIsImdldENvbnRleHQiLCJzdG9yZSIsImdldFN0b3JlIiwiY29udGV4dCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsInJlcXVlc3QiLCJyZXBseSIsImhlYWRlcnMiLCJjcmVhdGVTU0UiLCJuYWl0ZVN0b3JlIiwiTWFwIiwiRXJyb3IiLCJnZXRVcGxvYWRDb250ZXh0IiwidXBsb2FkQ29udGV4dCIsIl9hcGlSb290UGF0aCIsImFwaVJvb3RQYXRoIiwiYXBwUm9vdFBhdGgiLCJzcGxpdCIsInNlcCIsInNsaWNlIiwiam9pbiIsIl9kYkNvbmZpZyIsImRiQ29uZmlnIiwiX3N5bmNlciIsInN5bmNlciIsIl9jb25maWciLCJjb25maWciLCJfc2VjcmV0cyIsInNlY3JldHMiLCJfc3RvcmFnZSIsInN0b3JhZ2UiLCJ3YXRjaGVyIiwicGVuZGluZ0ZpbGVzIiwiaG1yU3RhcnRUaW1lIiwic2VydmVyIiwiaW5pdEZvclRlc3RpbmciLCJpbml0IiwidW5kZWZpbmVkIiwiZG9TaWxlbnQiLCJlbmFibGVTeW5jIiwiZm9yVGVzdGluZyIsImNoYWxrIiwiZGVmYXVsdCIsImNvbnNvbGUiLCJ0aW1lIiwiY3lhbiIsImZpbmRBcGlSb290UGF0aCIsImxvYWRDb25maWciLCJkYXRhYmFzZSIsIkFOVEhST1BJQ19BUElfS0VZIiwiYW50aHJvcGljX2FwaV9rZXkiLCJEQiIsImdlbmVyYXRlREJDb25maWciLCJsb2ciLCJncmVlbiIsIkVudGl0eU1hbmFnZXIiLCJhdXRvbG9hZCIsIlN5bmNlciIsImF1dG9sb2FkVHlwZXMiLCJhdXRvbG9hZE1vZGVscyIsImF1dG9sb2FkQXBpcyIsIlRlbXBsYXRlTWFuYWdlciIsImlzTG9jYWwiLCJpc1Rlc3QiLCJzZXR1cEJpb21lIiwiaXNIb3RSZWxvYWRTZXJ2ZXIiLCJzeW5jIiwic3RhcnRXYXRjaGVyIiwic3luY1VJIiwidGltZUVuZCIsImNyZWF0ZVNlcnZlciIsImluaXRPcHRpb25zIiwib3B0aW9ucyIsImZhc3RpZnkiLCJwbHVnaW5zIiwicmVnaXN0ZXJQbHVnaW5zIiwiYXV0aCIsInNlc3Npb24iLCJyZWdpc3RlckF1dGgiLCJ3aXRoRmFzdGlmeSIsImFwaUNvbmZpZyIsImJvb3QiLCJ0aW1lem9uZSIsImFwaSIsImZvcm1hdEluVGltZVpvbmUiLCJJU09fREFURV9SRUdFWCIsIkRBVEVfRk9STUFUIiwic2V0UmVwbHlTZXJpYWxpemVyIiwicGF5bG9hZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJfa2V5IiwidmFsdWUiLCJ0ZXN0IiwiRGF0ZSIsImdldCIsInJvdXRlIiwicHJlZml4IiwiX3JlcXVlc3QiLCJfcmVwbHkiLCJhcGlzIiwiYWxsIiwiZm91bmQiLCJmaW5kIiwidXJsIiwiaHR0cE1ldGhvZCIsIm1ldGhvZCIsInRvVXBwZXJDYXNlIiwiZ2V0QXBpSGFuZGxlciIsIk5vdEZvdW5kRXhjZXB0aW9uIiwibW9kZWxzIiwibW9kZWxOYW1lIiwiaGFuZGxlciIsImd1YXJkcyIsImV2ZXJ5IiwiZ3VhcmQiLCJndWFyZEhhbmRsZXIiLCJnZXRab2RPYmplY3RGcm9tQXBpIiwiUmVxVHlwZSIsInR5cGVzIiwid2hpY2giLCJyZXFCb2R5IiwiZmFzdGlmeUNhc3RlciIsInBhcnNlIiwiZSIsIlpvZEVycm9yIiwiaHVtYW5pemVab2RFcnJvciIsIm1lc3NhZ2VzIiwibWFwIiwiaXNzdWUiLCJtZXNzYWdlIiwiQmFkUmVxdWVzdEV4Y2VwdGlvbiIsInpvZEVycm9yIiwidHlwZSIsImNvbnRlbnRUeXBlIiwiY2FjaGVLZXkiLCJjYWNoZVR0bCIsImNhY2hlZERhdGEiLCJjYWNoZSIsImNhY2hlS2V5UmVzIiwicmVzb2x2ZUtleSIsImtleSIsInR0bCIsImVycm9yIiwiY3JlYXRlU1NFRmFjdG9yeSIsIl9ldmVudHMiLCJzb2NrZXQiLCJiaW5kIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjb250ZXh0UHJvdmlkZXIiLCJjcmVhdGVTdG9yZSIsInVzZXIiLCJwYXNzcG9ydCIsImxvZ2luIiwibG9nb3V0IiwibW9kZWwiLCJydW4iLCJBcGlQYXJhbVR5cGUiLCJyZXN1bHQiLCJtZXRob2ROYW1lIiwiYXBwbHkiLCJwYXJhbWV0ZXJzIiwicGFyYW0iLCJpc0NvbnRleHQiLCJuYW1lIiwicHV0Iiwid2F0Y2hQYXRoIiwiY2hva2lkYXIiLCJ3YXRjaCIsImlnbm9yZWQiLCJzdGF0cyIsImlzRmlsZSIsImVuZHNXaXRoIiwicGVyc2lzdGVudCIsImlnbm9yZUluaXRpYWwiLCJvbiIsImV2ZW50IiwiZmlsZVBhdGgiLCJhYnNvbHV0ZVBhdGgiLCJzdGFydHNXaXRoIiwiaXNDb25maWdUcyIsInJlbGF0aXZlUGF0aCIsInJlcGxhY2UiLCJib2xkIiwiYmx1ZSIsImtpbGwiLCJwaWQiLCJoYW5kbGVGaWxlQ2hhbmdlIiwicnVuU2NyaXB0IiwiZm4iLCJkZXN0cm95IiwicGx1Z2luc01vZHVsZXMiLCJjb3JzIiwiZm9ybWJvZHkiLCJtdWx0aXBhcnQiLCJxcyIsInNzZSIsInN0YXRpYyIsInJlZ2lzdGVyUGx1Z2luIiwicGx1Z2luTmFtZSIsIm9wdGlvbiIsInJlZ2lzdGVyIiwiT2JqZWN0IiwiZW50cmllcyIsImN1c3RvbSIsImZhc3RpZnlQYXNzcG9ydCIsImluaXRpYWxpemUiLCJzZWN1cmVTZXNzaW9uIiwicmVnaXN0ZXJVc2VyU2VyaWFsaXplciIsInJlZ2lzdGVyVXNlckRlc2VyaWFsaXplciIsInNlcmlhbGl6ZWQiLCJ1c2VyU2VyaWFsaXplciIsInVzZXJEZXNlcmlhbGl6ZXIiLCJwb3J0IiwibGlzdGVuIiwiaG9zdCIsImFkZEhvb2siLCJsaWZlY3ljbGUiLCJvblNodXRkb3duIiwic2h1dGRvd24iLCJjbG9zZSIsImV4aXQiLCJlcnIiLCJvbkVycm9yIiwic2V0RXJyb3JIYW5kbGVyIiwidGhlbiIsIm9uU3RhcnQiLCJjYXRjaCIsInJlZCIsImxlbmd0aCIsIm5vdyIsInB1c2giLCJyZWxhdGl2ZSIsInN5bmNGcm9tV2F0Y2hlciIsImZpbmlzaEhNUiIsInJlbmV3Q2hlY2tzdW1zIiwiZW5kVGltZSIsInRvdGFsVGltZSIsImNlbnRlclRleHQiLCJtc2ciLCJ3aGl0ZSIsImJsYWNrIiwiYmdHcmVlbiIsIkJhc2VNb2RlbCIsIlNvbmFtdSJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsWUFBWSxTQUFTO0FBQzVCLFNBQVNDLGlCQUFpQixRQUFRLGNBQWM7QUFJaEQsT0FBT0MsVUFBVSxPQUFPO0FBSXhCLFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFXdkMsTUFBTUM7SUFDR0MsZ0JBQXlCLE1BQU07SUFDL0JDLG9CQUVGLElBQUlMLG9CQUFvQjtJQUV0Qk0sZ0JBRUYsSUFBSU4sb0JBQW9CO0lBRXRCTyxhQUFzQjtRQUMzQixNQUFNQyxRQUFRLElBQUksQ0FBQ0gsaUJBQWlCLENBQUNJLFFBQVE7UUFDN0MsSUFBSUQsT0FBT0UsU0FBUztZQUNsQixPQUFPRixNQUFNRSxPQUFPO1FBQ3RCO1FBRUEsSUFBSUMsUUFBUUMsR0FBRyxDQUFDQyxRQUFRLEtBQUssUUFBUTtZQUNuQyxzQ0FBc0M7WUFDdEMsT0FBTztnQkFDTEMsU0FBUztnQkFDVEMsT0FBTztnQkFDUEMs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
485
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCB0eXBlIHsgRlNXYXRjaGVyIH0gZnJvbSBcImNob2tpZGFyXCI7XG5pbXBvcnQgdHlwZSB7IEZhc3RpZnlJbnN0YW5jZSwgRmFzdGlmeVJlcGx5LCBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgdHlwZSB7IEluY29taW5nTWVzc2FnZSwgU2VydmVyLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCJodHRwXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgdHlwZSB7IERyaXZlciB9IGZyb20gXCIuLi9maWxlLXN0b3JhZ2UvZHJpdmVyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHR5cGUgeyBTeW5jZXIgfSBmcm9tIFwiLi4vc3luY2VyL3N5bmNlclwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVGYXN0aWZ5Q29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUNvbmZpZywgU29uYW11U2VydmVyT3B0aW9ucyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoQ29udGV4dCwgQ29udGV4dCwgVXBsb2FkQ29udGV4dCB9IGZyb20gXCIuL2NvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgRXh0ZW5kZWRBcGkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCB0eXBlIFNvbmFtdVNlY3JldHMgPSB7XG4gIGFudGhyb3BpY19hcGlfa2V5Pzogc3RyaW5nO1xuICB2b3lhZ2VfYXBpX2tleT86IHN0cmluZztcbiAgb3BlbmFpX2FwaV9rZXk/OiBzdHJpbmc7XG59O1xuY2xhc3MgU29uYW11Q2xhc3Mge1xuICBwdWJsaWMgaXNJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgYXN5bmNMb2NhbFN0b3JhZ2U6IEFzeW5jTG9jYWxTdG9yYWdlPHtcbiAgICBjb250ZXh0OiBDb250ZXh0O1xuICB9PiA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZSgpO1xuXG4gIHB1YmxpYyB1cGxvYWRTdG9yYWdlOiBBc3luY0xvY2FsU3RvcmFnZTx7XG4gICAgdXBsb2FkQ29udGV4dDogVXBsb2FkQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcblxuICBwdWJsaWMgZ2V0Q29udGV4dCgpOiBDb250ZXh0IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LmNvbnRleHQpIHtcbiAgICAgIHJldHVybiBzdG9yZS5jb250ZXh0O1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIC8vIO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXF1ZXN0OiBudWxsLFxuICAgICAgICByZXBseTogbnVsbCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGNyZWF0ZVNTRTogKCkgPT4ge30sXG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcDxzdHJpbmcsIGFueT4oKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBDb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgY29udGV4dFwiKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0VXBsb2FkQ29udGV4dCgpOiBVcGxvYWRDb250ZXh0IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMudXBsb2FkU3RvcmFnZS5nZXRTdG9yZSgpO1xuICAgIGlmIChzdG9yZT8udXBsb2FkQ29udGV4dCkge1xuICAgICAgcmV0dXJuIHN0b3JlLnVwbG9hZENvbnRleHQ7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBjYW5ub3QgZmluZCB1cGxvYWQgY29udGV4dC4gRGlkIHlvdSB1c2UgQHVwbG9hZCBkZWNvcmF0b3I/XCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCB8IG51bGwgPSBudWxsO1xuICBzZXQgYXBpUm9vdFBhdGgoYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCkge1xuICAgIHRoaXMuX2FwaVJvb3RQYXRoID0gYXBpUm9vdFBhdGg7XG4gIH1cbiAgZ2V0IGFwaVJvb3RQYXRoKCk6IEFic29sdXRlUGF0aCB7XG4gICAgaWYgKHRoaXMuX2FwaVJvb3RQYXRoID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYXBpUm9vdFBhdGg7XG4gIH1cbiAgZ2V0IGFwcFJvb3RQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXBpUm9vdFBhdGguc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RiQ29uZmlnOiBTb25hbXVEQkNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBzZXQgZGJDb25maWcoZGJDb25maWc6IFNvbmFtdURCQ29uZmlnKSB7XG4gICAgdGhpcy5fZGJDb25maWcgPSBkYkNvbmZpZztcbiAgfVxuICBnZXQgZGJDb25maWcoKTogU29uYW11REJDb25maWcge1xuICAgIGlmICh0aGlzLl9kYkNvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RiQ29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY2VyOiBTeW5jZXIgfCBudWxsID0gbnVsbDtcbiAgc2V0IHN5bmNlcihzeW5jZXI6IFN5bmNlcikge1xuICAgIHRoaXMuX3N5bmNlciA9IHN5bmNlcjtcbiAgfVxuICBnZXQgc3luY2VyKCk6IFN5bmNlciB7XG4gICAgaWYgKHRoaXMuX3N5bmNlciA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N5bmNlcjtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbmZpZzogU29uYW11Q29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBjb25maWcoY29uZmlnOiBTb25hbXVDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gIH1cbiAgZ2V0IGNvbmZpZygpOiBTb25hbXVDb25maWcge1xuICAgIGlmICh0aGlzLl9jb25maWcgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBwcml2YXRlIF9zZWNyZXRzOiBTb25hbXVTZWNyZXRzIHwgbnVsbCA9IG51bGw7XG4gIHNldCBzZWNyZXRzKHNlY3JldHM6IFNvbmFtdVNlY3JldHMpIHtcbiAgICB0aGlzLl9zZWNyZXRzID0gc2VjcmV0cztcbiAgfVxuICBnZXQgc2VjcmV0cygpOiBTb25hbXVTZWNyZXRzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NlY3JldHM7XG4gIH1cblxuICBwcml2YXRlIF9zdG9yYWdlOiBEcml2ZXIgfCBudWxsID0gbnVsbDtcbiAgc2V0IHN0b3JhZ2Uoc3RvcmFnZTogRHJpdmVyKSB7XG4gICAgdGhpcy5fc3RvcmFnZSA9IHN0b3JhZ2U7XG4gIH1cbiAgZ2V0IHN0b3JhZ2UoKTogRHJpdmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2U7XG4gIH1cblxuICAvLyBITVIg7LKY66asXG4gIHB1YmxpYyB3YXRjaGVyOiBGU1dhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nRmlsZXM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgaG1yU3RhcnRUaW1lOiBudW1iZXIgPSAwO1xuXG4gIHB1YmxpYyBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIGluaXRGb3JUZXN0aW5nKCkge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGluaXQoXG4gICAgZG9TaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBlbmFibGVTeW5jOiBib29sZWFuID0gdHJ1ZSxcbiAgICBhcGlSb290UGF0aD86IEFic29sdXRlUGF0aCxcbiAgICBmb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2UsXG4gICkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUudGltZShjaGFsay5jeWFuKGBTb25hbXUuaW5pdCR7Zm9yVGVzdGluZyA/IFwiIGZvciB0ZXN0aW5nXCIgOiBcIlwifWApKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg66Oo7Yq4IO2MqOyKpFxuICAgIGNvbnN0IHsgZmluZEFwaVJvb3RQYXRoIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy91dGlsc1wiKTtcbiAgICB0aGlzLmFwaVJvb3RQYXRoID0gYXBpUm9vdFBhdGggPz8gZmluZEFwaVJvb3RQYXRoKCk7XG5cbiAgICBjb25zdCB7IGxvYWRDb25maWcgfSA9IGF3YWl0IGltcG9ydChcIi4vY29uZmlnXCIpO1xuICAgIHRoaXMuY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyh0aGlzLmFwaVJvb3RQYXRoKTtcbiAgICAvLyBzb25hbXUuY29uZmlnLnRzIOq4sOuzuOqwkiDshKTsoJVcbiAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID8/IFwicG9zdGdyZXNxbFwiO1xuXG4gICAgLy8gQVBJIO2CpCDtmZjqsr3rs4DsiJgg66Gc65OcXG4gICAgY29uc3Qgc2VjcmV0czogU29uYW11U2VjcmV0cyA9IHt9O1xuICAgIGlmIChwcm9jZXNzLmVudi5BTlRIUk9QSUNfQVBJX0tFWSkge1xuICAgICAgc2VjcmV0cy5hbnRocm9waWNfYXBpX2tleSA9IHByb2Nlc3MuZW52LkFOVEhST1BJQ19BUElfS0VZO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuVk9ZQUdFX0FQSV9LRVkpIHtcbiAgICAgIHNlY3JldHMudm95YWdlX2FwaV9rZXkgPSBwcm9jZXNzLmVudi5WT1lBR0VfQVBJX0tFWTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52Lk9QRU5BSV9BUElfS0VZKSB7XG4gICAgICBzZWNyZXRzLm9wZW5haV9hcGlfa2V5ID0gcHJvY2Vzcy5lbnYuT1BFTkFJX0FQSV9LRVk7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyhzZWNyZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNlY3JldHMgPSBzZWNyZXRzO1xuICAgIH1cblxuICAgIC8vIERCIOuhnOuTnFxuICAgIGNvbnN0IHsgREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIHRoaXMuZGJDb25maWcgPSBEQi5nZW5lcmF0ZURCQ29uZmlnKHRoaXMuY29uZmlnLmRhdGFiYXNlKTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiREIgQ29uZmlnIExvYWRlZCFcIikpO1xuICAgIH1cblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIO2FjOyKpO2MheyduCDqsr3smrAg7Iux7YGsIOyXhuydtCDspJHri6hcbiAgICBpZiAoZm9yVGVzdGluZykge1xuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTeW5jZXJcbiAgICBjb25zdCB7IFN5bmNlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3luY2VyL3N5bmNlclwiKTtcbiAgICB0aGlzLnN5bmNlciA9IG5ldyBTeW5jZXIoKTtcblxuICAgIC8vIEF1dG9sb2FkOiBNb2RlbHMgLyBUeXBlcyAvIEFQSXNcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZEFwaXMoKTtcblxuICAgIGNvbnN0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90ZW1wbGF0ZVwiKTtcbiAgICBhd2FpdCBUZW1wbGF0ZU1hbmFnZXIuYXV0b2xvYWQoKTtcblxuICAgIGNvbnN0IHsgaXNMb2NhbCwgaXNUZXN0IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIC8vIOuhnOy7rOyXkOyEnOuKlCDsvZTrk5wg7IOd7ISx7J2EIOychO2VtCBCaW9tZSDshYvsl4XsnbQg7ZWE7JqU7ZWoICjtmITsnqwgYXBpUm9vdFBhdGgg7KCE64us7ZWY7JesIOyLpO2WiSlcbiAgICAgIChhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9mb3JtYXR0ZXJcIikpLnNldHVwQmlvbWUodGhpcy5hcGlSb290UGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBpc0hvdFJlbG9hZFNlcnZlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpICYmICFpc1Rlc3QoKSAmJiBpc0hvdFJlbG9hZFNlcnZlcigpICYmIGVuYWJsZVN5bmMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc3luY2VyLnN5bmMoKTtcblxuICAgICAgYXdhaXQgdGhpcy5zdGFydFdhdGNoZXIoKTtcblxuICAgICAgdGhpcy5zeW5jZXIuc3luY1VJKCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUudGltZUVuZChjaGFsay5jeWFuKFwiU29uYW11LmluaXRcIikpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlcnZlcihpbml0T3B0aW9ucz86IHsgZW5hYmxlU3luYz86IGJvb2xlYW47IGRvU2lsZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdChpbml0T3B0aW9ucz8uZG9TaWxlbnQsIGluaXRPcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5jb25maWcuc2VydmVyO1xuICAgIGNvbnN0IGZhc3RpZnkgPSAoYXdhaXQgaW1wb3J0KFwiZmFzdGlmeVwiKSkuZGVmYXVsdDtcbiAgICBjb25zdCBzZXJ2ZXIgPSBmYXN0aWZ5KG9wdGlvbnMuZmFzdGlmeSk7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG5cbiAgICAvLyBTdG9yYWdlIOyEpOyglSDsoIDsnqVcbiAgICBpZiAob3B0aW9ucy5zdG9yYWdlKSB7XG4gICAgICB0aGlzLnN0b3JhZ2UgPSBvcHRpb25zLnN0b3JhZ2U7XG4gICAgfVxuXG4gICAgLy8g7ZSM65+s6re47J24IOuTseuhnVxuICAgIGlmIChvcHRpb25zLnBsdWdpbnMpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJQbHVnaW5zKHNlcnZlciwgb3B0aW9ucy5wbHVnaW5zKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hdXRoKSB7XG4gICAgICBpZiAoIW9wdGlvbnMucGx1Z2lucz8uc2Vzc2lvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdXRoIHJlcXVpcmVzIHNlc3Npb24gcGx1Z2luLiBQbGVhc2UgYWRkIHBsdWdpbnMuc2Vzc2lvbiBjb25maWd1cmF0aW9uLlwiKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlckF1dGgoc2VydmVyLCBvcHRpb25zLmF1dGgpO1xuICAgIH1cblxuICAgIC8vIEFQSSDrnbzsmrDtjIUg7ISk7KCVXG4gICAgYXdhaXQgdGhpcy53aXRoRmFzdGlmeShzZXJ2ZXIsIG9wdGlvbnMuYXBpQ29uZmlnLCB7XG4gICAgICBlbmFibGVTeW5jOiBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyxcbiAgICAgIGRvU2lsZW50OiBpbml0T3B0aW9ucz8uZG9TaWxlbnQsXG4gICAgfSk7XG5cbiAgICAvLyDshJzrsoQg7Iuc7J6RXG4gICAgYXdhaXQgdGhpcy5ib290KHNlcnZlciwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gc2VydmVyO1xuICB9XG5cbiAgYXN5bmMgd2l0aEZhc3RpZnkoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGVuYWJsZVN5bmM/OiBib29sZWFuO1xuICAgICAgZG9TaWxlbnQ/OiBib29sZWFuO1xuICAgIH0sXG4gICkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQob3B0aW9ucz8uZG9TaWxlbnQsIG9wdGlvbnM/LmVuYWJsZVN5bmMpO1xuICAgIH1cblxuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuXG4gICAgLy8gdGltZXpvbmUg7ISk7KCVXG4gICAgY29uc3QgdGltZXpvbmUgPSB0aGlzLmNvbmZpZy5hcGkudGltZXpvbmU7XG4gICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAvLyDtg4DsnoTsobTsl5Ag66ee6rKMIOydkeuLtSDrgqDsp5wg7Iqk7Yq466eB7J2EIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDqsIDroLkgdGltZXpvbmXsnbQgXCJBc2lhL1Nlb3VsXCIg7J2066m0XG4gICAgICAvLyBcIjIwMjUtMTEtMjFUMDA6MDA6MDAuMDAwWlwiIOulvCBcIjIwMjUtMTEtMjFUMDk6MDA6MDArMDk6MDBcIiDsnLzroZwg67OA7ZmY7ZW07KO87Ja07JW8IO2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IHsgZm9ybWF0SW5UaW1lWm9uZSB9ID0gYXdhaXQgaW1wb3J0KFwiZGF0ZS1mbnMtdHpcIik7XG5cbiAgICAgIC8vIElTTyA4NjAxIOuCoOynnCDtmJXsi50g7KCV6rec7IudICjsmIg6IDIwMjQtMDEtMTVUMDk6MzA6MDAuMDAwWilcbiAgICAgIGNvbnN0IElTT19EQVRFX1JFR0VYID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGR7M30pP1okLztcblxuICAgICAgLy8gVOulvCDrkZjrn6zsi7wg7J6R7J2A65Sw7Ji07ZGc6rCAIOyXhuuLpOuptCBcIjIwMjUtMTEtMTkxNzYzNTQ2MTg5MDAwMTg6NTY6MjkrMDk6MDBcIuyZgCDqsJnsnYAg6rKw6rO86rCAIOuCmOyYteuLiOuLpC5cbiAgICAgIC8vIOydtOuKlCBkYXRlLWZucyDtirnsnoXri4jri6QuXG4gICAgICAvLyDsnbTroIfqsowg7ZW064+EIOq0nOywruyKteuLiOuLpC4gXCIyMDI1LTExLTE5VDE4OjU2OjI5KzA5OjAwXCIg66qo7JaR7Jy866GcIOyemCDrgpjsmLXri4jri6QuXG4gICAgICBjb25zdCBEQVRFX0ZPUk1BVCA9IFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWFhYXCI7XG5cbiAgICAgIHNlcnZlci5zZXRSZXBseVNlcmlhbGl6ZXIoKHBheWxvYWQpID0+IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgSVNPX0RBVEVfUkVHRVgudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRJblRpbWVab25lKFxuICAgICAgICAgICAgICBuZXcgRGF0ZSh2YWx1ZSksXG4gICAgICAgICAgICAgIHRpbWV6b25lIGFzIGAke3N0cmluZ30vJHtzdHJpbmd9YCxcbiAgICAgICAgICAgICAgREFURV9GT1JNQVQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBpZiAoIW9wdGlvbnM/LmRvU2lsZW50KSB7XG4gICAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgVGltZXpvbmUgc2V0IHRvICR7dGltZXpvbmV9YCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOyghOyytCDrnbzsmrDtjIUg66as7Iqk7Yq4XG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L3JvdXRlc2AsXG4gICAgICBhc3luYyAoX3JlcXVlc3QsIF9yZXBseSk6IFByb21pc2U8dHlwZW9mIHRoaXMuc3luY2VyLmFwaXM+ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY2VyLmFwaXM7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBIZWFsdGhjaGVjayBBUElcbiAgICBzZXJ2ZXIuZ2V0KFxuICAgICAgYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vaGVhbHRoY2hlY2tgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICByZXR1cm4gXCJva1wiO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gQVBJIOudvOyasO2MhSAo66Gc7LusSE1SIOyDge2DnOyZgCDqtazrtoQpXG4gICAgY29uc3QgeyBpc0xvY2FsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIHNlcnZlci5hbGwoXCIqXCIsIGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuc3luY2VyLmFwaXMuZmluZChcbiAgICAgICAgICAoYXBpKSA9PlxuICAgICAgICAgICAgdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoID09PSByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0gJiZcbiAgICAgICAgICAgIChhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIpID09PSByZXF1ZXN0Lm1ldGhvZC50b1VwcGVyQ2FzZSgpLFxuICAgICAgICApO1xuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBcGlIYW5kbGVyKGZvdW5kLCBjb25maWcpKHJlcXVlc3QsIHJlcGx5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IE5vdEZvdW5kRXhjZXB0aW9uIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9leGNlcHRpb25zL3NvLWV4Y2VwdGlvbnNcIik7XG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihcIuyhtOyerO2VmOyngCDslYrripQgQVBJIOygkeq3vOyeheuLiOuLpC5cIik7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBhcGkgb2YgdGhpcy5zeW5jZXIuYXBpcykge1xuICAgICAgICAvLyBtb2RlbFxuICAgICAgICBpZiAodGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOygleydmOuQmOyngCDslYrsnYAg66qo64247JeQIOygkeq3vCAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByb3V0ZVxuICAgICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICAgIG1ldGhvZDogYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgICAgIHVybDogdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoLFxuICAgICAgICAgIGhhbmRsZXI6IHRoaXMuZ2V0QXBpSGFuZGxlcihhcGksIGNvbmZpZyksXG4gICAgICAgIH0pOyAvLyBFTkQgc2VydmVyLnJvdXRlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0QXBpSGFuZGxlcihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gYXN5bmMgKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgICAoYXBpLm9wdGlvbnMuZ3VhcmRzID8/IFtdKS5ldmVyeSgoZ3VhcmQpID0+IGNvbmZpZy5ndWFyZEhhbmRsZXIoZ3VhcmQsIHJlcXVlc3QsIGFwaSkpO1xuXG4gICAgICAvLyDtjIzrnbzrr7jthLAg7KCV67O066GcIHpvZCDsiqTtgqTrp4gg67mM65OcXG4gICAgICBjb25zdCB7IGdldFpvZE9iamVjdEZyb21BcGkgfSA9IGF3YWl0IGltcG9ydChcIi4vY29kZS1jb252ZXJ0ZXJzXCIpO1xuICAgICAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGkoYXBpLCB0aGlzLnN5bmNlci50eXBlcyk7XG5cbiAgICAgIC8vIHJlcXVlc3Qg7YyM7IuxXG4gICAgICBjb25zdCB3aGljaCA9IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPT09IFwiR0VUXCIgPyBcInF1ZXJ5XCIgOiBcImJvZHlcIjtcbiAgICAgIGxldCByZXFCb2R5OiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBmYXN0aWZ5Q2FzdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2Nhc3RlclwiKTtcbiAgICAgICAgcmVxQm9keSA9IGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UocmVxdWVzdFt3aGljaF0gPz8ge30pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCB7IFpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCJ6b2RcIik7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgWm9kRXJyb3IpIHtcbiAgICAgICAgICBjb25zdCB7IGh1bWFuaXplWm9kRXJyb3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3pvZC1lcnJvclwiKTtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGh1bWFuaXplWm9kRXJyb3IoZSlcbiAgICAgICAgICAgIC5tYXAoKGlzc3VlKSA9PiBpc3N1ZS5tZXNzYWdlKVxuICAgICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgICAgIGNvbnN0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCIpO1xuICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKG1lc3NhZ2VzLCB7XG4gICAgICAgICAgICB6b2RFcnJvcjogZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRlbnQtVHlwZVxuICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgIC8vIGNyZWF0ZVNTRUZhY3Rvcnkg7ZWo7IiY7JeQIOuvuOumrCByZXF1ZXN07J2YIHNvY2tldOqzvCByZXBseeulvCDrsJTsnbjrlKkuXG4gICAgICBjb25zdCB7IGNyZWF0ZVNTRUZhY3RvcnkgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0cmVhbS9zc2VcIik7XG4gICAgICBjb25zdCBjcmVhdGVTU0UgPSAoPFQgZXh0ZW5kcyBab2RPYmplY3Q+KFxuICAgICAgICBfcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgICAgIF9yZXBseTogRmFzdGlmeVJlcGx5LFxuICAgICAgICBfZXZlbnRzOiBULFxuICAgICAgKSA9PiBjcmVhdGVTU0VGYWN0b3J5KF9yZXF1ZXN0LnNvY2tldCwgX3JlcGx5LCBfZXZlbnRzKSkuYmluZChudWxsLCByZXF1ZXN0LCByZXBseSk7XG5cbiAgICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICAgIC4uLihhd2FpdCBQcm9taXNlLnJlc29sdmUoXG4gICAgICAgICAgY29uZmlnLmNvbnRleHRQcm92aWRlcihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgICAgcmVwbHksXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICAgICAgY3JlYXRlU1NFLFxuICAgICAgICAgICAgICBuYWl0ZVN0b3JlOiBOYWl0ZS5jcmVhdGVTdG9yZSgpLFxuICAgICAgICAgICAgICAvLyBhdXRoXG4gICAgICAgICAgICAgIHVzZXI6IHJlcXVlc3QudXNlciA/PyBudWxsLFxuICAgICAgICAgICAgICBwYXNzcG9ydDoge1xuICAgICAgICAgICAgICAgIGxvZ2luOiByZXF1ZXN0LmxvZ2luLmJpbmQocmVxdWVzdCkgYXMgQXV0aENvbnRleHRbXCJwYXNzcG9ydFwiXVtcImxvZ2luXCJdLFxuICAgICAgICAgICAgICAgIGxvZ291dDogcmVxdWVzdC5sb2dvdXQuYmluZChyZXF1ZXN0KSBhcyBBdXRoQ29udGV4dFtcInBhc3Nwb3J0XCJdW1wibG9nb3V0XCJdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICByZXBseSxcbiAgICAgICAgICApLFxuICAgICAgICApKSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdO1xuICAgICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBtb2RlbOydgCDrqqjrjbgg7J247Iqk7YS07Iqk7J2066+A66GcIOuplOyEnOuTnCDtmLjstpwg6rCA64qlXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChtb2RlbCBhcyBhbnkpW2FwaS5tZXRob2ROYW1lXS5hcHBseShcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgICAvLyBDb250ZXh0IOyduOygneyFmFxuICAgICAgICAgICAgaWYgKEFwaVBhcmFtVHlwZS5pc0NvbnRleHQocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gcmVxQm9keVtwYXJhbS5uYW1lXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBhc3luYyBzdGFydFdhdGNoZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2F0Y2hQYXRoID0gW3BhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInNyY1wiKV07XG5cbiAgICBjb25zdCBjaG9raWRhciA9IChhd2FpdCBpbXBvcnQoXCJjaG9raWRhclwiKSkuZGVmYXVsdDtcbiAgICB0aGlzLndhdGNoZXIgPSBjaG9raWRhci53YXRjaCh3YXRjaFBhdGgsIHtcbiAgICAgIGlnbm9yZWQ6IChwYXRoLCBzdGF0cykgPT5cbiAgICAgICAgISFzdGF0cz8uaXNGaWxlKCkgJiYgIXBhdGguZW5kc1dpdGgoXCIudHNcIikgJiYgIXBhdGguZW5kc1dpdGgoXCIuanNvblwiKSxcbiAgICAgIHBlcnNpc3RlbnQ6IHRydWUsXG4gICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy53YXRjaGVyLm9uKFwiYWxsXCIsIGFzeW5jIChldmVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCBhcyBBYnNvbHV0ZVBhdGg7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGFic29sdXRlUGF0aC5zdGFydHNXaXRoKHRoaXMuYXBpUm9vdFBhdGgpLFxuICAgICAgICBcIkZpbGUgcGF0aCBpcyBub3Qgd2l0aGluIHRoZSBBUEkgcm9vdCBwYXRoXCIsXG4gICAgICApO1xuXG4gICAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBzb25hbXUuY29uZmlnLnRzIOuzgOqyvSDsi5wg7J6s7Iuc7J6RXG4gICAgICAgIGNvbnN0IGlzQ29uZmlnVHMgPSBmaWxlUGF0aCA9PT0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcblxuICAgICAgICBpZiAoaXNDb25maWdUcykge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UodGhpcy5hcGlSb290UGF0aCwgXCJhcGlcIik7XG4gICAgICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfSAtIFJlc3RhcnRpbmcuLi5gKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgXCJTSUdVU1IyXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmlsZUNoYW5nZShldmVudCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAgIEEgZnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW5pdCBhbmQgZGVzdHJveSB3aGVuIHVzaW5nIFNvbmFtdSB2aWEgc2NyaXB0cy4gICAgXG4gICovXG4gIGFzeW5jIHJ1blNjcmlwdChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQbHVnaW5zKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBwbHVnaW5zOiBTb25hbXVTZXJ2ZXJPcHRpb25zW1wicGx1Z2luc1wiXSkge1xuICAgIGlmICghcGx1Z2lucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbnNNb2R1bGVzID0ge1xuICAgICAgY29yczogXCJAZmFzdGlmeS9jb3JzXCIsXG4gICAgICBmb3JtYm9keTogXCJAZmFzdGlmeS9mb3JtYm9keVwiLFxuICAgICAgbXVsdGlwYXJ0OiBcIkBmYXN0aWZ5L211bHRpcGFydFwiLFxuICAgICAgcXM6IFwiZmFzdGlmeS1xc1wiLFxuICAgICAgc3NlOiBcImZhc3RpZnktc3NlLXYyXCIsXG4gICAgICBzdGF0aWM6IFwiQGZhc3RpZnkvc3RhdGljXCIsXG4gICAgICBzZXNzaW9uOiBcIkBmYXN0aWZ5L3NlY3VyZS1zZXNzaW9uXCIsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyUGx1Z2luID0gYXN5bmMgPEsgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTx0eXBlb2YgcGx1Z2lucz4+KFxuICAgICAga2V5OiBLLFxuICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcGx1Z2luc1trZXldO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBwbHVnaW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zTW9kdWxlcykpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyUGx1Z2luKGtleSBhcyBrZXlvZiB0eXBlb2YgcGx1Z2lucywgcGx1Z2luTmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnMuY3VzdG9tKSB7XG4gICAgICBwbHVnaW5zLmN1c3RvbShzZXJ2ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJBdXRoKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLFxuICAgIG9wdGlvbnM6IE5vbk51bGxhYmxlPFNvbmFtdVNlcnZlck9wdGlvbnNbXCJhdXRoXCJdPixcbiAgKSB7XG4gICAgLy8gYXdhaXQgaW1wb3J0KFwiZmFzdGlmeVwiKTtcbiAgICBjb25zdCBmYXN0aWZ5UGFzc3BvcnQgPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvcGFzc3BvcnRcIikpLmRlZmF1bHQ7XG4gICAgc2VydmVyLnJlZ2lzdGVyKGZhc3RpZnlQYXNzcG9ydC5pbml0aWFsaXplKCkpO1xuICAgIHNlcnZlci5yZWdpc3RlcihmYXN0aWZ5UGFzc3BvcnQuc2VjdXJlU2Vzc2lvbigpKTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGZhc3RpZnlQYXNzcG9ydC5yZWdpc3RlclVzZXJTZXJpYWxpemVyKGFzeW5jICh1c2VyLCBfcmVxdWVzdCkgPT4gdXNlcik7XG4gICAgICBmYXN0aWZ5UGFzc3BvcnQucmVnaXN0ZXJVc2VyRGVzZXJpYWxpemVyKGFzeW5jIChzZXJpYWxpemVkLCBfcmVxdWVzdCkgPT4gc2VyaWFsaXplZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZhc3RpZnlQYXNzcG9ydC5yZWdpc3RlclVzZXJTZXJpYWxpemVyKG9wdGlvbnMudXNlclNlcmlhbGl6ZXIpO1xuICAgICAgZmFzdGlmeVBhc3Nwb3J0LnJlZ2lzdGVyVXNlckRlc2VyaWFsaXplcihvcHRpb25zLnVzZXJEZXNlcmlhbGl6ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYm9vdChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgb3B0aW9uczogU29uYW11U2VydmVyT3B0aW9ucykge1xuICAgIGNvbnN0IHBvcnQgPSBvcHRpb25zLmxpc3Rlbj8ucG9ydCA/PyAzMDAwO1xuICAgIGNvbnN0IGhvc3QgPSBvcHRpb25zLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblNodXRkb3duPy4oc2VydmVyKTtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2h1dGRvd24gPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgc2h1dGRvd246XCIsIGVycik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgc2h1dGRvd24pO1xuXG4gICAgaWYgKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKSB7XG4gICAgICBzZXJ2ZXIuc2V0RXJyb3JIYW5kbGVyKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKTtcbiAgICB9XG5cbiAgICBzZXJ2ZXJcbiAgICAgIC5saXN0ZW4oeyBwb3J0LCBob3N0IH0pXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblN0YXJ0Py4oc2VydmVyKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goYXN5bmMgKGVycikgPT4ge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJGYWlsZWQgdG8gc3RhcnQgc2VydmVyOlwiLCBlcnIpKTtcbiAgICAgICAgYXdhaXQgc2h1dGRvd24oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlKGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDssqsg67KI7Ke4IO2MjOydvOydtOuptCBITVIg7Iuc7J6RIOyLnOqwhCDquLDroZ1cbiAgICBpZiAodGhpcy5wZW5kaW5nRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmhtclN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0ZpbGVzLnB1c2goZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmFwaVJvb3RQYXRoLCBmaWxlUGF0aCk7XG4gICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChgRGV0ZWN0ZWQoJHtldmVudH0pOiAke2NoYWxrLmJsdWUocmVsYXRpdmVQYXRoKX1gKSk7XG5cbiAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jRnJvbVdhdGNoZXIoZXZlbnQsIGZpbGVQYXRoKTtcblxuICAgIC8vIOyymOumrCDsmYTro4zrkJwg7YyM7J287J2EIOuMgOq4sCDrqqnroZ3sl5DshJwg7KCc6rGwXG4gICAgdGhpcy5wZW5kaW5nRmlsZXMgPSB0aGlzLnBlbmRpbmdGaWxlcy5zbGljZSgxKTtcblxuICAgIC8vIOuqqOuToCDtjIzsnbwg7LKY66as6rCAIOyZhOujjOuQmOuptCDstZzsooUg66mU7Iuc7KeAIOy2nOugpVxuICAgIGlmICh0aGlzLnBlbmRpbmdGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZmluaXNoSE1SKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5pc2hITVIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIucmVuZXdDaGVja3N1bXMoKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRvdGFsVGltZSA9IGVuZFRpbWUgLSB0aGlzLmhtclN0YXJ0VGltZTtcbiAgICBjb25zdCBbY2hhbGssIHsgY2VudGVyVGV4dCB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdCxcbiAgICAgIGltcG9ydChcIi4uL3V0aWxzL2NvbnNvbGUtdXRpbFwiKSxcbiAgICBdKTtcbiAgICBjb25zdCBtc2cgPSBgSE1SIERvbmUhICR7Y2hhbGsuYm9sZC53aGl0ZShgJHt0b3RhbFRpbWV9bXNgKX1gO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KG1zZykpKTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBCYXNlTW9kZWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIik7XG4gICAgYXdhaXQgQmFzZU1vZGVsLmRlc3Ryb3koKTtcbiAgICBhd2FpdCB0aGlzLndhdGNoZXI/LmNsb3NlKCk7XG4gICAgdGhpcy5zdG9yYWdlPy5kZXN0cm95KCk7XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBTb25hbXUgPSBuZXcgU29uYW11Q2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJBc3luY0xvY2FsU3RvcmFnZSIsInBhdGgiLCJOYWl0ZSIsIlNvbmFtdUNsYXNzIiwiaXNJbml0aWFsaXplZCIsImFzeW5jTG9jYWxTdG9yYWdlIiwidXBsb2FkU3RvcmFnZSIsImdldENvbnRleHQiLCJzdG9yZSIsImdldFN0b3JlIiwiY29udGV4dCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsInJlcXVlc3QiLCJyZXBseSIsImhlYWRlcnMiLCJjcmVhdGVTU0UiLCJuYWl0ZVN0b3JlIiwiTWFwIiwiRXJyb3IiLCJnZXRVcGxvYWRDb250ZXh0IiwidXBsb2FkQ29udGV4dCIsIl9hcGlSb290UGF0aCIsImFwaVJvb3RQYXRoIiwiYXBwUm9vdFBhdGgiLCJzcGxpdCIsInNlcCIsInNsaWNlIiwiam9pbiIsIl9kYkNvbmZpZyIsImRiQ29uZmlnIiwiX3N5bmNlciIsInN5bmNlciIsIl9jb25maWciLCJjb25maWciLCJfc2VjcmV0cyIsInNlY3JldHMiLCJfc3RvcmFnZSIsInN0b3JhZ2UiLCJ3YXRjaGVyIiwicGVuZGluZ0ZpbGVzIiwiaG1yU3RhcnRUaW1lIiwic2VydmVyIiwiaW5pdEZvclRlc3RpbmciLCJpbml0IiwidW5kZWZpbmVkIiwiZG9TaWxlbnQiLCJlbmFibGVTeW5jIiwiZm9yVGVzdGluZyIsImNoYWxrIiwiZGVmYXVsdCIsImNvbnNvbGUiLCJ0aW1lIiwiY3lhbiIsImZpbmRBcGlSb290UGF0aCIsImxvYWRDb25maWciLCJkYXRhYmFzZSIsIkFOVEhST1BJQ19BUElfS0VZIiwiYW50aHJvcGljX2FwaV9rZXkiLCJWT1lBR0VfQVBJX0tFWSIsInZveWFnZV9hcGlfa2V5IiwiT1BFTkFJX0FQSV9LRVkiLCJvcGVuYWlfYXBpX2tleSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJEQiIsImdlbmVyYXRlREJDb25maWciLCJsb2ciLCJncmVlbiIsIkVudGl0eU1hbmFnZXIiLCJhdXRvbG9hZCIsIlN5bmNlciIsImF1dG9sb2FkVHlwZXMiLCJhdXRvbG9hZE1vZGVscyIsImF1dG9sb2FkQXBpcyIsIlRlbXBsYXRlTWFuYWdlciIsImlzTG9jYWwiLCJpc1Rlc3QiLCJzZXR1cEJpb21lIiwiaXNIb3RSZWxvYWRTZXJ2ZXIiLCJzeW5jIiwic3RhcnRXYXRjaGVyIiwic3luY1VJIiwidGltZUVuZCIsImNyZWF0ZVNlcnZlciIsImluaXRPcHRpb25zIiwib3B0aW9ucyIsImZhc3RpZnkiLCJwbHVnaW5zIiwicmVnaXN0ZXJQbHVnaW5zIiwiYXV0aCIsInNlc3Npb24iLCJyZWdpc3RlckF1dGgiLCJ3aXRoRmFzdGlmeSIsImFwaUNvbmZpZyIsImJvb3QiLCJ0aW1lem9uZSIsImFwaSIsImZvcm1hdEluVGltZVpvbmUiLCJJU09fREFURV9SRUdFWCIsIkRBVEVfRk9STUFUIiwic2V0UmVwbHlTZXJpYWxpemVyIiwicGF5bG9hZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJfa2V5IiwidmFsdWUiLCJ0ZXN0IiwiRGF0ZSIsImdldCIsInJvdXRlIiwicHJlZml4IiwiX3JlcXVlc3QiLCJfcmVwbHkiLCJhcGlzIiwiYWxsIiwiZm91bmQiLCJmaW5kIiwidXJsIiwiaHR0cE1ldGhvZCIsIm1ldGhvZCIsInRvVXBwZXJDYXNlIiwiZ2V0QXBpSGFuZGxlciIsIk5vdEZvdW5kRXhjZXB0aW9uIiwibW9kZWxzIiwibW9kZWxOYW1lIiwiaGFuZGxlciIsImd1YXJkcyIsImV2ZXJ5IiwiZ3VhcmQiLCJndWFyZEhhbmRsZXIiLCJnZXRab2RPYmplY3RGcm9tQXBpIiwiUmVxVHlwZSIsInR5cGVzIiwid2hpY2giLCJyZXFCb2R5IiwiZmFzdGlmeUNhc3RlciIsInBhcnNlIiwiZSIsIlpvZEVycm9yIiwiaHVtYW5pemVab2RFcnJvciIsIm1lc3NhZ2VzIiwibWFwIiwiaXNzdWUiLCJtZXNzYWdlIiwiQmFkUmVxdWVzdEV4Y2VwdGlvbiIsInpvZEVycm9yIiwidHlwZSIsImNvbnRlbnRUeXBlIiwiY3JlYXRlU1NFRmFjdG9yeSIsIl9ldmVudHMiLCJzb2NrZXQiLCJiaW5kIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjb250ZXh0UHJvdmlkZXIiLCJjcmVhdGVTdG9yZSIsInVzZXIiLCJwYXNzcG9ydCIsImxvZ2luIiwibG9nb3V0IiwibW9kZWwiLCJydW4iLCJBcGlQYXJhbVR5cGUiLCJyZXN1bHQiLCJtZXRob2ROYW1lIiwiYXBwbHkiLCJwYXJhbWV0ZXJzIiwicGFyYW0iLCJpc0NvbnRleHQiLCJuYW1lIiwid2F0Y2hQYXRoIiwiY2hva2lkYXIiLCJ3YXRjaCIsImlnbm9yZWQiLCJzdGF0cyIsImlzRmlsZSIsImVuZHNXaXRoIiwicGVyc2lzdGVudCIsImlnbm9yZUluaXRpYWwiLCJvbiIsImV2ZW50IiwiZmlsZVBhdGgiLCJhYnNvbHV0ZVBhdGgiLCJzdGFydHNXaXRoIiwiaXNDb25maWdUcyIsInJlbGF0aXZlUGF0aCIsInJlcGxhY2UiLCJib2xkIiwiYmx1ZSIsImtpbGwiLCJwaWQiLCJoYW5kbGVGaWxlQ2hhbmdlIiwiZXJyb3IiLCJydW5TY3JpcHQiLCJmbiIsImRlc3Ryb3kiLCJwbHVnaW5zTW9kdWxlcyIsImNvcnMiLCJmb3JtYm9keSIsIm11bHRpcGFydCIsInFzIiwic3NlIiwic3RhdGljIiwicmVnaXN0ZXJQbHVnaW4iLCJrZXkiLCJwbHVnaW5OYW1lIiwib3B0aW9uIiwicmVnaXN0ZXIiLCJlbnRyaWVzIiwiY3VzdG9tIiwiZmFzdGlmeVBhc3Nwb3J0IiwiaW5pdGlhbGl6ZSIsInNlY3VyZVNlc3Npb24iLCJyZWdpc3RlclVzZXJTZXJpYWxpemVyIiwicmVnaXN0ZXJVc2VyRGVzZXJpYWxpemVyIiwic2VyaWFsaXplZCIsInVzZXJTZXJpYWxpemVyIiwidXNlckRlc2VyaWFsaXplciIsInBvcnQiLCJsaXN0ZW4iLCJob3N0IiwiYWRkSG9vayIsImxpZmVjeWNsZSIsIm9uU2h1dGRvd24iLCJzaHV0ZG93biIsImNsb3NlIiwiZXhpdCIsImVyciIsIm9uRXJyb3IiLCJzZXRFcnJvckhhbmRsZXIiLCJ0aGVuIiwib25TdGFydCIsImNhdGNoIiwicmVkIiwibm93IiwicHVzaCIsInJlbGF0aXZlIiwic3luY0Zyb21XYXRjaGVyIiwiZmluaXNoSE1SIiwicmVuZXdDaGVja3N1bXMiLCJlbmRUaW1lIiwidG90YWxUaW1lIiwiY2VudGVyVGV4dCIsIm1zZyIsIndoaXRlIiwi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