sonamu 0.7.21 → 0.7.23

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 (200) hide show
  1. package/dist/ai/agents/agent.d.ts +6 -1
  2. package/dist/ai/agents/agent.d.ts.map +1 -1
  3. package/dist/ai/agents/agent.js +20 -5
  4. package/dist/api/base-frame.d.ts +4 -0
  5. package/dist/api/base-frame.d.ts.map +1 -1
  6. package/dist/api/base-frame.js +9 -1
  7. package/dist/api/caster.d.ts.map +1 -1
  8. package/dist/api/caster.js +2 -2
  9. package/dist/api/config.d.ts +35 -3
  10. package/dist/api/config.d.ts.map +1 -1
  11. package/dist/api/config.js +1 -1
  12. package/dist/api/decorators.d.ts +4 -4
  13. package/dist/api/decorators.d.ts.map +1 -1
  14. package/dist/api/decorators.js +80 -18
  15. package/dist/api/index.d.ts +1 -0
  16. package/dist/api/index.d.ts.map +1 -1
  17. package/dist/api/index.js +2 -1
  18. package/dist/api/secret.d.ts +7 -0
  19. package/dist/api/secret.d.ts.map +1 -0
  20. package/dist/api/secret.js +17 -0
  21. package/dist/api/sonamu.d.ts +17 -8
  22. package/dist/api/sonamu.d.ts.map +1 -1
  23. package/dist/api/sonamu.js +265 -47
  24. package/dist/cache/cache-manager.d.ts +11 -0
  25. package/dist/cache/cache-manager.d.ts.map +1 -0
  26. package/dist/cache/cache-manager.js +22 -0
  27. package/dist/cache/decorator.d.ts +31 -0
  28. package/dist/cache/decorator.d.ts.map +1 -0
  29. package/dist/cache/decorator.js +86 -0
  30. package/dist/cache/drivers.d.ts +33 -0
  31. package/dist/cache/drivers.d.ts.map +1 -0
  32. package/dist/cache/drivers.js +36 -0
  33. package/dist/cache/index.d.ts +4 -0
  34. package/dist/cache/index.d.ts.map +1 -0
  35. package/dist/cache/index.js +8 -0
  36. package/dist/cache/types.d.ts +28 -0
  37. package/dist/cache/types.d.ts.map +1 -0
  38. package/dist/cache/types.js +6 -0
  39. package/dist/database/base-model.d.ts +4 -2
  40. package/dist/database/base-model.d.ts.map +1 -1
  41. package/dist/database/base-model.js +9 -4
  42. package/dist/database/code-generator.d.ts +3 -1
  43. package/dist/database/code-generator.d.ts.map +1 -1
  44. package/dist/database/code-generator.js +3 -2
  45. package/dist/database/db.d.ts +1 -1
  46. package/dist/database/db.d.ts.map +1 -1
  47. package/dist/database/db.js +5 -5
  48. package/dist/database/knex.d.ts +3 -0
  49. package/dist/database/knex.d.ts.map +1 -0
  50. package/dist/database/knex.js +29 -0
  51. package/dist/database/puri.types.d.ts.map +1 -1
  52. package/dist/database/puri.types.js +1 -1
  53. package/dist/database/upsert-builder.d.ts.map +1 -1
  54. package/dist/database/upsert-builder.js +49 -5
  55. package/dist/index.d.ts +4 -0
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +4 -1
  58. package/dist/logger/category.d.ts +4 -0
  59. package/dist/logger/category.d.ts.map +1 -0
  60. package/dist/logger/category.js +34 -0
  61. package/dist/logger/configure.d.ts +9 -0
  62. package/dist/logger/configure.d.ts.map +1 -0
  63. package/dist/logger/configure.js +115 -0
  64. package/dist/migration/code-generation.d.ts +5 -1
  65. package/dist/migration/code-generation.d.ts.map +1 -1
  66. package/dist/migration/code-generation.js +13 -7
  67. package/dist/migration/migrator.d.ts +1 -1
  68. package/dist/migration/migrator.d.ts.map +1 -1
  69. package/dist/migration/migrator.js +7 -7
  70. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
  71. package/dist/migration/postgresql-schema-reader.js +5 -3
  72. package/dist/naite/naite.d.ts +0 -4
  73. package/dist/naite/naite.d.ts.map +1 -1
  74. package/dist/naite/naite.js +11 -19
  75. package/dist/ssr/index.d.ts +4 -0
  76. package/dist/ssr/index.d.ts.map +1 -0
  77. package/dist/ssr/index.js +4 -0
  78. package/dist/ssr/registry.d.ts +10 -0
  79. package/dist/ssr/registry.d.ts.map +1 -0
  80. package/dist/ssr/registry.js +43 -0
  81. package/dist/ssr/renderer.d.ts +6 -0
  82. package/dist/ssr/renderer.d.ts.map +1 -0
  83. package/dist/ssr/renderer.js +70 -0
  84. package/dist/ssr/types.d.ts +19 -0
  85. package/dist/ssr/types.d.ts.map +1 -0
  86. package/dist/ssr/types.js +4 -0
  87. package/dist/syncer/syncer.d.ts +1 -0
  88. package/dist/syncer/syncer.d.ts.map +1 -1
  89. package/dist/syncer/syncer.js +58 -1
  90. package/dist/tasks/decorator.d.ts +1 -0
  91. package/dist/tasks/decorator.d.ts.map +1 -1
  92. package/dist/tasks/decorator.js +9 -7
  93. package/dist/tasks/step-wrapper.d.ts +5 -0
  94. package/dist/tasks/step-wrapper.d.ts.map +1 -1
  95. package/dist/tasks/step-wrapper.js +11 -6
  96. package/dist/tasks/workflow-manager.d.ts +2 -0
  97. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  98. package/dist/tasks/workflow-manager.js +5 -2
  99. package/dist/template/implementations/entry-server.template.d.ts +17 -0
  100. package/dist/template/implementations/entry-server.template.d.ts.map +1 -0
  101. package/dist/template/implementations/entry-server.template.js +78 -0
  102. package/dist/template/implementations/model.template.d.ts.map +1 -1
  103. package/dist/template/implementations/model.template.js +5 -3
  104. package/dist/template/implementations/queries.template.d.ts +17 -0
  105. package/dist/template/implementations/queries.template.d.ts.map +1 -0
  106. package/dist/template/implementations/queries.template.js +83 -0
  107. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -1
  108. package/dist/template/implementations/view_enums_select.template.js +34 -20
  109. package/dist/template/implementations/view_form.template.d.ts +2 -1
  110. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  111. package/dist/template/implementations/view_form.template.js +301 -129
  112. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -1
  113. package/dist/template/implementations/view_id_async_select.template.js +136 -57
  114. package/dist/template/implementations/view_list.template.d.ts +2 -0
  115. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  116. package/dist/template/implementations/view_list.template.js +392 -227
  117. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  118. package/dist/template/implementations/view_search_input.template.js +46 -30
  119. package/dist/template/zod-converter.d.ts.map +1 -1
  120. package/dist/template/zod-converter.js +2 -2
  121. package/dist/testing/bootstrap.d.ts +28 -0
  122. package/dist/testing/bootstrap.d.ts.map +1 -0
  123. package/dist/testing/bootstrap.js +120 -0
  124. package/dist/testing/fixture-loader.d.ts +21 -0
  125. package/dist/testing/fixture-loader.d.ts.map +1 -0
  126. package/dist/testing/fixture-loader.js +28 -0
  127. package/dist/testing/fixture-manager.d.ts +1 -1
  128. package/dist/testing/fixture-manager.d.ts.map +1 -1
  129. package/dist/testing/fixture-manager.js +7 -7
  130. package/dist/testing/index.d.ts +4 -0
  131. package/dist/testing/index.d.ts.map +1 -0
  132. package/dist/testing/index.js +5 -0
  133. package/dist/testing/naite-vitest-reporter.d.ts +12 -0
  134. package/dist/testing/naite-vitest-reporter.d.ts.map +1 -0
  135. package/dist/testing/naite-vitest-reporter.js +17 -0
  136. package/dist/types/types.d.ts +5 -6
  137. package/dist/types/types.d.ts.map +1 -1
  138. package/dist/types/types.js +7 -8
  139. package/dist/ui/ai-client.d.ts +3 -1
  140. package/dist/ui/ai-client.d.ts.map +1 -1
  141. package/dist/ui/ai-client.js +27 -8
  142. package/dist/ui-web/assets/index-CTYv3qL6.js +92 -0
  143. package/dist/ui-web/index.html +1 -1
  144. package/package.json +43 -20
  145. package/src/ai/agents/agent.ts +38 -19
  146. package/src/api/base-frame.ts +8 -0
  147. package/src/api/caster.ts +6 -1
  148. package/src/api/config.ts +38 -4
  149. package/src/api/decorators.ts +106 -20
  150. package/src/api/index.ts +1 -0
  151. package/src/api/secret.ts +23 -0
  152. package/src/api/sonamu.ts +334 -61
  153. package/src/cache/cache-manager.ts +23 -0
  154. package/src/cache/decorator.ts +116 -0
  155. package/src/cache/drivers.ts +42 -0
  156. package/src/cache/index.ts +16 -0
  157. package/src/cache/types.ts +32 -0
  158. package/src/database/base-model.ts +7 -3
  159. package/src/database/code-generator.ts +3 -1
  160. package/src/database/db.ts +5 -5
  161. package/src/database/knex.ts +34 -0
  162. package/src/database/puri.types.ts +2 -3
  163. package/src/database/upsert-builder.ts +58 -4
  164. package/src/index.ts +4 -0
  165. package/src/logger/category.ts +42 -0
  166. package/src/logger/configure.ts +132 -0
  167. package/src/migration/code-generation.ts +19 -6
  168. package/src/migration/migrator.ts +7 -6
  169. package/src/migration/postgresql-schema-reader.ts +7 -2
  170. package/src/naite/naite.ts +10 -18
  171. package/src/shared/web.shared.ts.txt +1 -1
  172. package/src/ssr/index.ts +13 -0
  173. package/src/ssr/registry.ts +52 -0
  174. package/src/ssr/renderer.ts +105 -0
  175. package/src/ssr/types.ts +20 -0
  176. package/src/syncer/syncer.ts +59 -0
  177. package/src/tasks/decorator.ts +20 -4
  178. package/src/tasks/step-wrapper.ts +14 -5
  179. package/src/tasks/workflow-manager.ts +9 -1
  180. package/src/template/implementations/entry-server.template.ts +81 -0
  181. package/src/template/implementations/model.template.ts +4 -2
  182. package/src/template/implementations/queries.template.ts +111 -0
  183. package/src/template/implementations/view_enums_select.template.ts +33 -19
  184. package/src/template/implementations/view_form.template.ts +324 -145
  185. package/src/template/implementations/view_id_async_select.template.ts +145 -56
  186. package/src/template/implementations/view_list.template.ts +446 -236
  187. package/src/template/implementations/view_search_input.template.ts +45 -29
  188. package/src/template/zod-converter.ts +4 -1
  189. package/src/testing/bootstrap.ts +176 -0
  190. package/src/testing/fixture-loader.ts +28 -0
  191. package/src/testing/fixture-manager.ts +7 -6
  192. package/src/testing/index.ts +3 -0
  193. package/src/testing/naite-vitest-reporter.ts +18 -0
  194. package/src/types/types.ts +4 -5
  195. package/src/ui/ai-client.ts +82 -50
  196. package/dist/template/implementations/view_enums_dropdown.template.d.ts +0 -17
  197. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +0 -1
  198. package/dist/template/implementations/view_enums_dropdown.template.js +0 -50
  199. package/dist/ui-web/assets/index-B87IyofX.js +0 -92
  200. package/src/template/implementations/view_enums_dropdown.template.ts +0 -53
@@ -0,0 +1,10 @@
1
+ import type { SSRRoute } from "./types";
2
+ export declare function registerSSR(route: SSRRoute): void;
3
+ export declare function getSSRRoutes(): SSRRoute[];
4
+ export declare function clearSSRRoutes(): void;
5
+ export declare function matchSSRRoute(url: string): {
6
+ route: SSRRoute;
7
+ params: Record<string, string>;
8
+ } | null;
9
+ export declare function matchPath(pattern: string, url: string): Record<string, string> | null;
10
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/ssr/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAIxC,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAED,wBAAgB,YAAY,IAAI,QAAQ,EAAE,CAEzC;AAED,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,GACV;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,IAAI,CAQ5D;AAGD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAsBrF"}
@@ -0,0 +1,43 @@
1
+ const ssrRoutes = [];
2
+ export function registerSSR(route) {
3
+ ssrRoutes.push(route);
4
+ }
5
+ export function getSSRRoutes() {
6
+ return ssrRoutes;
7
+ }
8
+ export function clearSSRRoutes() {
9
+ ssrRoutes.length = 0;
10
+ }
11
+ export function matchSSRRoute(url) {
12
+ for (const route of ssrRoutes){
13
+ const params = matchPath(route.path, url);
14
+ if (params !== null) {
15
+ return {
16
+ route,
17
+ params
18
+ };
19
+ }
20
+ }
21
+ return null;
22
+ }
23
+ // 간단한 path matching
24
+ export function matchPath(pattern, url) {
25
+ const patternParts = pattern.split("/").filter(Boolean);
26
+ const urlParts = url.split("?")[0].split("/").filter(Boolean);
27
+ if (patternParts.length !== urlParts.length) {
28
+ return null;
29
+ }
30
+ const params = {};
31
+ for(let i = 0; i < patternParts.length; i++){
32
+ const patternPart = patternParts[i];
33
+ const urlPart = urlParts[i];
34
+ if (patternPart.startsWith(":")) {
35
+ params[patternPart.slice(1)] = urlPart;
36
+ } else if (patternPart !== urlPart) {
37
+ return null;
38
+ }
39
+ }
40
+ return params;
41
+ }
42
+
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zc3IvcmVnaXN0cnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTU1JSb3V0ZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IHNzclJvdXRlczogU1NSUm91dGVbXSA9IFtdO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTU1Iocm91dGU6IFNTUlJvdXRlKTogdm9pZCB7XG4gIHNzclJvdXRlcy5wdXNoKHJvdXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNTUlJvdXRlcygpOiBTU1JSb3V0ZVtdIHtcbiAgcmV0dXJuIHNzclJvdXRlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyU1NSUm91dGVzKCk6IHZvaWQge1xuICBzc3JSb3V0ZXMubGVuZ3RoID0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoU1NSUm91dGUoXG4gIHVybDogc3RyaW5nLFxuKTogeyByb3V0ZTogU1NSUm91dGU7IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9IHwgbnVsbCB7XG4gIGZvciAoY29uc3Qgcm91dGUgb2Ygc3NyUm91dGVzKSB7XG4gICAgY29uc3QgcGFyYW1zID0gbWF0Y2hQYXRoKHJvdXRlLnBhdGgsIHVybCk7XG4gICAgaWYgKHBhcmFtcyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgcm91dGUsIHBhcmFtcyB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8g6rCE64uo7ZWcIHBhdGggbWF0Y2hpbmdcbmV4cG9ydCBmdW5jdGlvbiBtYXRjaFBhdGgocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBudWxsIHtcbiAgY29uc3QgcGF0dGVyblBhcnRzID0gcGF0dGVybi5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICBjb25zdCB1cmxQYXJ0cyA9IHVybC5zcGxpdChcIj9cIilbMF0uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcblxuICBpZiAocGF0dGVyblBhcnRzLmxlbmd0aCAhPT0gdXJsUGFydHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0ID0gcGF0dGVyblBhcnRzW2ldO1xuICAgIGNvbnN0IHVybFBhcnQgPSB1cmxQYXJ0c1tpXTtcblxuICAgIGlmIChwYXR0ZXJuUGFydC5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgcGFyYW1zW3BhdHRlcm5QYXJ0LnNsaWNlKDEpXSA9IHVybFBhcnQ7XG4gICAgfSBlbHNlIGlmIChwYXR0ZXJuUGFydCAhPT0gdXJsUGFydCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcmFtcztcbn1cbiJdLCJuYW1lcyI6WyJzc3JSb3V0ZXMiLCJyZWdpc3RlclNTUiIsInJvdXRlIiwicHVzaCIsImdldFNTUlJvdXRlcyIsImNsZWFyU1NSUm91dGVzIiwibGVuZ3RoIiwibWF0Y2hTU1JSb3V0ZSIsInVybCIsInBhcmFtcyIsIm1hdGNoUGF0aCIsInBhdGgiLCJwYXR0ZXJuIiwicGF0dGVyblBhcnRzIiwic3BsaXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwidXJsUGFydHMiLCJpIiwicGF0dGVyblBhcnQiLCJ1cmxQYXJ0Iiwic3RhcnRzV2l0aCIsInNsaWNlIl0sIm1hcHBpbmdzIjoiQUFFQSxNQUFNQSxZQUF3QixFQUFFO0FBRWhDLE9BQU8sU0FBU0MsWUFBWUMsS0FBZTtJQUN6Q0YsVUFBVUcsSUFBSSxDQUFDRDtBQUNqQjtBQUVBLE9BQU8sU0FBU0U7SUFDZCxPQUFPSjtBQUNUO0FBRUEsT0FBTyxTQUFTSztJQUNkTCxVQUFVTSxNQUFNLEdBQUc7QUFDckI7QUFFQSxPQUFPLFNBQVNDLGNBQ2RDLEdBQVc7SUFFWCxLQUFLLE1BQU1OLFNBQVNGLFVBQVc7UUFDN0IsTUFBTVMsU0FBU0MsVUFBVVIsTUFBTVMsSUFBSSxFQUFFSDtRQUNyQyxJQUFJQyxXQUFXLE1BQU07WUFDbkIsT0FBTztnQkFBRVA7Z0JBQU9PO1lBQU87UUFDekI7SUFDRjtJQUNBLE9BQU87QUFDVDtBQUVBLG9CQUFvQjtBQUNwQixPQUFPLFNBQVNDLFVBQVVFLE9BQWUsRUFBRUosR0FBVztJQUNwRCxNQUFNSyxlQUFlRCxRQUFRRSxLQUFLLENBQUMsS0FBS0MsTUFBTSxDQUFDQztJQUMvQyxNQUFNQyxXQUFXVCxJQUFJTSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQ0EsS0FBSyxDQUFDLEtBQUtDLE1BQU0sQ0FBQ0M7SUFFckQsSUFBSUgsYUFBYVAsTUFBTSxLQUFLVyxTQUFTWCxNQUFNLEVBQUU7UUFDM0MsT0FBTztJQUNUO0lBRUEsTUFBTUcsU0FBaUMsQ0FBQztJQUV4QyxJQUFLLElBQUlTLElBQUksR0FBR0EsSUFBSUwsYUFBYVAsTUFBTSxFQUFFWSxJQUFLO1FBQzVDLE1BQU1DLGNBQWNOLFlBQVksQ0FBQ0ssRUFBRTtRQUNuQyxNQUFNRSxVQUFVSCxRQUFRLENBQUNDLEVBQUU7UUFFM0IsSUFBSUMsWUFBWUUsVUFBVSxDQUFDLE1BQU07WUFDL0JaLE1BQU0sQ0FBQ1UsWUFBWUcsS0FBSyxDQUFDLEdBQUcsR0FBR0Y7UUFDakMsT0FBTyxJQUFJRCxnQkFBZ0JDLFNBQVM7WUFDbEMsT0FBTztRQUNUO0lBQ0Y7SUFFQSxPQUFPWDtBQUNUIn0=
@@ -0,0 +1,6 @@
1
+ import type { FastifyReply, FastifyRequest } from "fastify";
2
+ import type { ViteDevServer } from "vite";
3
+ import type { SonamuFastifyConfig } from "../types/types";
4
+ import type { SSRRoute } from "./types";
5
+ export declare function renderSSR(url: string, route: SSRRoute, params: Record<string, string>, request: FastifyRequest, reply: FastifyReply, config: SonamuFastifyConfig, vite?: ViteDevServer): Promise<string>;
6
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/ssr/renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEvD,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,mBAAmB,EAC3B,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,MAAM,CAAC,CAiFjB"}
@@ -0,0 +1,70 @@
1
+ import path from "node:path";
2
+ export async function renderSSR(url, route, params, request, reply, config, vite) {
3
+ const { Sonamu } = await import("../api/sonamu.js");
4
+ // 1. preload 실행 → SSRQuery[] 획득 (dev/prod 공통)
5
+ const preloadConfig = route.preload ? route.preload(params) : [];
6
+ const preloadedData = [];
7
+ for (const { modelName, methodName, params: apiParams, serviceKey } of preloadConfig){
8
+ const api = Sonamu.syncer.apis.find((a)=>a.modelName === modelName && a.methodName === methodName);
9
+ if (!api) {
10
+ console.warn(`API not found: ${modelName}.${methodName}`);
11
+ continue;
12
+ }
13
+ try {
14
+ const result = await Sonamu.invokeApiForSSR(api, apiParams, config, request, reply);
15
+ preloadedData.push({
16
+ queryKey: [
17
+ ...serviceKey,
18
+ ...apiParams
19
+ ],
20
+ data: result
21
+ });
22
+ } catch (e) {
23
+ console.error(`Failed to preload ${modelName}.${methodName}:`, e);
24
+ }
25
+ }
26
+ // 2. Dev/Prod 스크립트 추출
27
+ let viteScripts;
28
+ let render;
29
+ if (vite) {
30
+ // Dev: Vite Dev Server
31
+ const fs = await import("node:fs/promises");
32
+ const indexHtmlPath = path.join(vite.config.root, "index.html");
33
+ const originalHtml = await fs.readFile(indexHtmlPath, "utf-8");
34
+ const transformedHtml = await vite.transformIndexHtml(url, originalHtml);
35
+ // Vite가 주입한 스크립트 추출
36
+ viteScripts = extractScriptTags(transformedHtml);
37
+ const entryModule = await vite.ssrLoadModule("/src/entry-server.generated.tsx");
38
+ render = entryModule.render;
39
+ } else {
40
+ // Prod: 빌드된 파일
41
+ const fs = await import("node:fs");
42
+ const webDistPath = path.join(Sonamu.apiRootPath, "public", "web");
43
+ const ssrPath = path.join(Sonamu.apiRootPath, "dist", "ssr");
44
+ // 빌드된 index.html에서 스크립트 추출
45
+ const builtHtml = fs.readFileSync(path.join(webDistPath, "index.html"), "utf-8");
46
+ viteScripts = extractScriptTags(builtHtml);
47
+ const entryModule = await import(path.join(ssrPath, "entry-server.generated.js"));
48
+ render = entryModule.render;
49
+ }
50
+ // 3. RouterProvider 렌더링 (full document)
51
+ const { html: fullDocHtml, dehydratedState } = await render(url, preloadedData);
52
+ // 4. SSR 데이터 스크립트 생성
53
+ const ssrDataScript = dehydratedState ? `<script>window.__SONAMU_SSR__ = ${JSON.stringify(dehydratedState).replace(/</g, "\\u003c")};</script>` : "";
54
+ // 5. SSR Config 스크립트 생성 (disableHydrate)
55
+ const ssrConfigScript = route.disableHydrate ? `<script>window.__SONAMU_SSR_CONFIG__ = ${JSON.stringify({
56
+ disableHydrate: true
57
+ })};</script>` : "";
58
+ // 6. Vite 스크립트와 SSR 데이터를 </body> 직전에 주입
59
+ const finalHtml = fullDocHtml.replace("</body>", `${ssrConfigScript}\n${ssrDataScript}\n${viteScripts}\n</body>`);
60
+ return finalHtml;
61
+ }
62
+ /**
63
+ * HTML에서 <script>, <link> 태그를 추출
64
+ */ function extractScriptTags(html) {
65
+ const scriptRegex = /<script[^>]*>[\s\S]*?<\/script>|<link[^>]*>/gi;
66
+ const matches = html.match(scriptRegex) || [];
67
+ return matches.join("\n");
68
+ }
69
+
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zc3IvcmVuZGVyZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5UmVwbHksIEZhc3RpZnlSZXF1ZXN0IH0gZnJvbSBcImZhc3RpZnlcIjtcbmltcG9ydCB0eXBlIHsgVml0ZURldlNlcnZlciB9IGZyb20gXCJ2aXRlXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUZhc3RpZnlDb25maWcgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgUHJlbG9hZGVkRGF0YSwgU1NSUm91dGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyU1NSKFxuICB1cmw6IHN0cmluZyxcbiAgcm91dGU6IFNTUlJvdXRlLFxuICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICByZXBseTogRmFzdGlmeVJlcGx5LFxuICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gIHZpdGU/OiBWaXRlRGV2U2VydmVyLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG5cbiAgLy8gMS4gcHJlbG9hZCDsi6Ttlokg4oaSIFNTUlF1ZXJ5W10g7ZqN65OdIChkZXYvcHJvZCDqs7XthrUpXG4gIGNvbnN0IHByZWxvYWRDb25maWcgPSByb3V0ZS5wcmVsb2FkID8gcm91dGUucHJlbG9hZChwYXJhbXMpIDogW107XG4gIGNvbnN0IHByZWxvYWRlZERhdGE6IFByZWxvYWRlZERhdGFbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgeyBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIHBhcmFtczogYXBpUGFyYW1zLCBzZXJ2aWNlS2V5IH0gb2YgcHJlbG9hZENvbmZpZykge1xuICAgIGNvbnN0IGFwaSA9IFNvbmFtdS5zeW5jZXIuYXBpcy5maW5kKFxuICAgICAgKGEpID0+IGEubW9kZWxOYW1lID09PSBtb2RlbE5hbWUgJiYgYS5tZXRob2ROYW1lID09PSBtZXRob2ROYW1lLFxuICAgICk7XG5cbiAgICBpZiAoIWFwaSkge1xuICAgICAgY29uc29sZS53YXJuKGBBUEkgbm90IGZvdW5kOiAke21vZGVsTmFtZX0uJHttZXRob2ROYW1lfWApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFNvbmFtdS5pbnZva2VBcGlGb3JTU1IoYXBpLCBhcGlQYXJhbXMsIGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuICAgICAgcHJlbG9hZGVkRGF0YS5wdXNoKHtcbiAgICAgICAgcXVlcnlLZXk6IFsuLi5zZXJ2aWNlS2V5LCAuLi5hcGlQYXJhbXNdLFxuICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcHJlbG9hZCAke21vZGVsTmFtZX0uJHttZXRob2ROYW1lfTpgLCBlKTtcbiAgICB9XG4gIH1cblxuICAvLyAyLiBEZXYvUHJvZCDsiqTtgazrpr3tirgg7LaU7LacXG4gIGxldCB2aXRlU2NyaXB0czogc3RyaW5nO1xuICBsZXQgcmVuZGVyOiAoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgcHJlbG9hZGVkRGF0YTogUHJlbG9hZGVkRGF0YVtdLFxuICApID0+IFByb21pc2U8eyBodG1sOiBzdHJpbmc7IGRlaHlkcmF0ZWRTdGF0ZTogdW5rbm93biB9PjtcblxuICBpZiAodml0ZSkge1xuICAgIC8vIERldjogVml0ZSBEZXYgU2VydmVyXG4gICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICAgIGNvbnN0IGluZGV4SHRtbFBhdGggPSBwYXRoLmpvaW4odml0ZS5jb25maWcucm9vdCwgXCJpbmRleC5odG1sXCIpO1xuICAgIGNvbnN0IG9yaWdpbmFsSHRtbCA9IGF3YWl0IGZzLnJlYWRGaWxlKGluZGV4SHRtbFBhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3QgdHJhbnNmb3JtZWRIdG1sID0gYXdhaXQgdml0ZS50cmFuc2Zvcm1JbmRleEh0bWwodXJsLCBvcmlnaW5hbEh0bWwpO1xuXG4gICAgLy8gVml0ZeqwgCDso7zsnoXtlZwg7Iqk7YGs66a97Yq4IOy2lOy2nFxuICAgIHZpdGVTY3JpcHRzID0gZXh0cmFjdFNjcmlwdFRhZ3ModHJhbnNmb3JtZWRIdG1sKTtcblxuICAgIGNvbnN0IGVudHJ5TW9kdWxlID0gYXdhaXQgdml0ZS5zc3JMb2FkTW9kdWxlKFwiL3NyYy9lbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLnRzeFwiKTtcbiAgICByZW5kZXIgPSBlbnRyeU1vZHVsZS5yZW5kZXI7XG4gIH0gZWxzZSB7XG4gICAgLy8gUHJvZDog67mM65Oc65CcIO2MjOydvFxuICAgIGNvbnN0IGZzID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmc1wiKTtcbiAgICBjb25zdCB3ZWJEaXN0UGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwicHVibGljXCIsIFwid2ViXCIpO1xuICAgIGNvbnN0IHNzclBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcImRpc3RcIiwgXCJzc3JcIik7XG5cbiAgICAvLyDruYzrk5zrkJwgaW5kZXguaHRtbOyXkOyEnCDsiqTtgazrpr3tirgg7LaU7LacXG4gICAgY29uc3QgYnVpbHRIdG1sID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJpbmRleC5odG1sXCIpLCBcInV0Zi04XCIpO1xuICAgIHZpdGVTY3JpcHRzID0gZXh0cmFjdFNjcmlwdFRhZ3MoYnVpbHRIdG1sKTtcblxuICAgIGNvbnN0IGVudHJ5TW9kdWxlID0gYXdhaXQgaW1wb3J0KHBhdGguam9pbihzc3JQYXRoLCBcImVudHJ5LXNlcnZlci5nZW5lcmF0ZWQuanNcIikpO1xuICAgIHJlbmRlciA9IGVudHJ5TW9kdWxlLnJlbmRlcjtcbiAgfVxuXG4gIC8vIDMuIFJvdXRlclByb3ZpZGVyIOugjOuNlOungSAoZnVsbCBkb2N1bWVudClcbiAgY29uc3QgeyBodG1sOiBmdWxsRG9jSHRtbCwgZGVoeWRyYXRlZFN0YXRlIH0gPSBhd2FpdCByZW5kZXIodXJsLCBwcmVsb2FkZWREYXRhKTtcblxuICAvLyA0LiBTU1Ig642w7J207YSwIOyKpO2BrOumve2KuCDsg53shLFcbiAgY29uc3Qgc3NyRGF0YVNjcmlwdCA9IGRlaHlkcmF0ZWRTdGF0ZVxuICAgID8gYDxzY3JpcHQ+d2luZG93Ll9fU09OQU1VX1NTUl9fID0gJHtKU09OLnN0cmluZ2lmeShkZWh5ZHJhdGVkU3RhdGUpLnJlcGxhY2UoLzwvZywgXCJcXFxcdTAwM2NcIil9Ozwvc2NyaXB0PmBcbiAgICA6IFwiXCI7XG5cbiAgLy8gNS4gU1NSIENvbmZpZyDsiqTtgazrpr3tirgg7IOd7ISxIChkaXNhYmxlSHlkcmF0ZSlcbiAgY29uc3Qgc3NyQ29uZmlnU2NyaXB0ID0gcm91dGUuZGlzYWJsZUh5ZHJhdGVcbiAgICA/IGA8c2NyaXB0PndpbmRvdy5fX1NPTkFNVV9TU1JfQ09ORklHX18gPSAke0pTT04uc3RyaW5naWZ5KHsgZGlzYWJsZUh5ZHJhdGU6IHRydWUgfSl9Ozwvc2NyaXB0PmBcbiAgICA6IFwiXCI7XG5cbiAgLy8gNi4gVml0ZSDsiqTtgazrpr3tirjsmYAgU1NSIOuNsOydtO2EsOulvCA8L2JvZHk+IOyngeyghOyXkCDso7zsnoVcbiAgY29uc3QgZmluYWxIdG1sID0gZnVsbERvY0h0bWwucmVwbGFjZShcbiAgICBcIjwvYm9keT5cIixcbiAgICBgJHtzc3JDb25maWdTY3JpcHR9XFxuJHtzc3JEYXRhU2NyaXB0fVxcbiR7dml0ZVNjcmlwdHN9XFxuPC9ib2R5PmAsXG4gICk7XG5cbiAgcmV0dXJuIGZpbmFsSHRtbDtcbn1cblxuLyoqXG4gKiBIVE1M7JeQ7IScIDxzY3JpcHQ+LCA8bGluaz4g7YOc6re466W8IOy2lOy2nFxuICovXG5mdW5jdGlvbiBleHRyYWN0U2NyaXB0VGFncyhodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzY3JpcHRSZWdleCA9IC88c2NyaXB0W14+XSo+W1xcc1xcU10qPzxcXC9zY3JpcHQ+fDxsaW5rW14+XSo+L2dpO1xuICBjb25zdCBtYXRjaGVzID0gaHRtbC5tYXRjaChzY3JpcHRSZWdleCkgfHwgW107XG4gIHJldHVybiBtYXRjaGVzLmpvaW4oXCJcXG5cIik7XG59XG4iXSwibmFtZXMiOlsicGF0aCIsInJlbmRlclNTUiIsInVybCIsInJvdXRlIiwicGFyYW1zIiwicmVxdWVzdCIsInJlcGx5IiwiY29uZmlnIiwidml0ZSIsIlNvbmFtdSIsInByZWxvYWRDb25maWciLCJwcmVsb2FkIiwicHJlbG9hZGVkRGF0YSIsIm1vZGVsTmFtZSIsIm1ldGhvZE5hbWUiLCJhcGlQYXJhbXMiLCJzZXJ2aWNlS2V5IiwiYXBpIiwic3luY2VyIiwiYXBpcyIsImZpbmQiLCJhIiwiY29uc29sZSIsIndhcm4iLCJyZXN1bHQiLCJpbnZva2VBcGlGb3JTU1IiLCJwdXNoIiwicXVlcnlLZXkiLCJkYXRhIiwiZSIsImVycm9yIiwidml0ZVNjcmlwdHMiLCJyZW5kZXIiLCJmcyIsImluZGV4SHRtbFBhdGgiLCJqb2luIiwicm9vdCIsIm9yaWdpbmFsSHRtbCIsInJlYWRGaWxlIiwidHJhbnNmb3JtZWRIdG1sIiwidHJhbnNmb3JtSW5kZXhIdG1sIiwiZXh0cmFjdFNjcmlwdFRhZ3MiLCJlbnRyeU1vZHVsZSIsInNzckxvYWRNb2R1bGUiLCJ3ZWJEaXN0UGF0aCIsImFwaVJvb3RQYXRoIiwic3NyUGF0aCIsImJ1aWx0SHRtbCIsInJlYWRGaWxlU3luYyIsImh0bWwiLCJmdWxsRG9jSHRtbCIsImRlaHlkcmF0ZWRTdGF0ZSIsInNzckRhdGFTY3JpcHQiLCJKU09OIiwic3RyaW5naWZ5IiwicmVwbGFjZSIsInNzckNvbmZpZ1NjcmlwdCIsImRpc2Fi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
@@ -0,0 +1,19 @@
1
+ export type SSRQuery = {
2
+ modelName: string;
3
+ methodName: string;
4
+ params: unknown[];
5
+ serviceKey: [string, string];
6
+ } & {
7
+ __brand: "SSRQuery";
8
+ };
9
+ export type PreloadConfig = SSRQuery[];
10
+ export type SSRRoute = {
11
+ path: string;
12
+ preload?: (params: Record<string, string>) => PreloadConfig;
13
+ disableHydrate?: boolean;
14
+ };
15
+ export type PreloadedData = {
16
+ queryKey: unknown[];
17
+ data: unknown;
18
+ };
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ssr/types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,QAAQ,GAAG;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,GAAG;IAAE,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC;AAE5B,MAAM,MAAM,aAAa,GAAG,QAAQ,EAAE,CAAC;AAEvC,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,aAAa,CAAC;IAC5D,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC"}
@@ -0,0 +1,4 @@
1
+ // Branded type - 실수로 일반 객체 사용 방지
2
+ export { };
3
+
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zc3IvdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQnJhbmRlZCB0eXBlIC0g7Iuk7IiY66GcIOydvOuwmCDqsJ3ssrQg7IKs7JqpIOuwqeyngFxuZXhwb3J0IHR5cGUgU1NSUXVlcnkgPSB7XG4gIG1vZGVsTmFtZTogc3RyaW5nOyAvLyAnVXNlck1vZGVsJyAtIOyEnOuyhCDrqqjrjbgg7Zi47Lac7JqpXG4gIG1ldGhvZE5hbWU6IHN0cmluZzsgLy8gJ2ZpbmRCeUlkJyAtIOyEnOuyhCDrqZTshJzrk5wg7Zi47Lac7JqpXG4gIHBhcmFtczogdW5rbm93bltdOyAvLyBbc3Vic2V0LCBpZF0gLSBDb250ZXh0IOygnOyZuO2VnCDsi6TsoJwg7YyM652866+47YSwXG4gIHNlcnZpY2VLZXk6IFtzdHJpbmcsIHN0cmluZ107IC8vIFsnVXNlcicsICdnZXRVc2VycyddIC0gUmVhY3QgUXVlcnkgcXVlcnlLZXnsmqlcbn0gJiB7IF9fYnJhbmQ6IFwiU1NSUXVlcnlcIiB9O1xuXG5leHBvcnQgdHlwZSBQcmVsb2FkQ29uZmlnID0gU1NSUXVlcnlbXTtcblxuZXhwb3J0IHR5cGUgU1NSUm91dGUgPSB7XG4gIHBhdGg6IHN0cmluZztcbiAgcHJlbG9hZD86IChwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+IFByZWxvYWRDb25maWc7XG4gIGRpc2FibGVIeWRyYXRlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFByZWxvYWRlZERhdGEgPSB7XG4gIHF1ZXJ5S2V5OiB1bmtub3duW107XG4gIGRhdGE6IHVua25vd247XG59O1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlDQUFpQztBQWdCakMsV0FHRSJ9
@@ -37,6 +37,7 @@ export declare class Syncer {
37
37
  autoloadModels(): Promise<void>;
38
38
  autoloadApis(): Promise<void>;
39
39
  autoloadWorkflows(): Promise<void>;
40
+ autoloadSSRRoutes(): Promise<void>;
40
41
  /**
41
42
  * 실제 싱크를 수행하는 본체입니다.
42
43
  * 변경된 파일들을 타입별로 분류하고 각 타입에 맞는 액션을 실행합니다.
@@ -1 +1 @@
1
- {"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/syncer/syncer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/syncer/syncer.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ import { group, unique } from "radashi";
10
10
  import { registeredApis } from "../api/decorators.js";
11
11
  import { Sonamu } from "../api/sonamu.js";
12
12
  import { EntityManager } from "../entity/entity-manager.js";
13
+ import { AlreadyProcessedException } from "../exceptions/so-exceptions.js";
13
14
  import { Naite } from "../naite/naite.js";
14
15
  import { TemplateManager } from "../template/template-manager.js";
15
16
  import { TemplateKey } from "../types/types.js";
@@ -42,6 +43,20 @@ export class Syncer {
42
43
  const changedFiles = await findChangedFilesUsingChecksums();
43
44
  if (changedFiles.length === 0) {
44
45
  console.log(chalk.black.bgGreen(centerText("All files are synced!")));
46
+ // 변경사항이 없어도 SSR 템플릿은 생성 (초기 설정 시, 이미 존재하면 스킵)
47
+ try {
48
+ await generateTemplate("queries", {}, {
49
+ overwrite: false
50
+ });
51
+ await generateTemplate("entry_server", {}, {
52
+ overwrite: false
53
+ });
54
+ } catch (e) {
55
+ // 파일이 이미 존재하면 무시
56
+ if (!(e instanceof AlreadyProcessedException)) {
57
+ console.error("Failed to generate SSR templates:", e);
58
+ }
59
+ }
45
60
  return;
46
61
  }
47
62
  // 만약 싱크 중에 프로세스가 죽으면 꼬여버리기 때문에,
@@ -65,6 +80,17 @@ export class Syncer {
65
80
  if (event !== "change" && event !== "add" && event !== "unlink") {
66
81
  return;
67
82
  }
83
+ // SSR 설정 파일 변경 감지
84
+ if (diffFilePath.includes("/src/ssr/")) {
85
+ console.log(chalk.bold.yellow("SSR config changed - reloading..."));
86
+ // SSR 파일도 invalidate 후 reload
87
+ if (!isTest()) {
88
+ await hot.invalidateFile(diffFilePath, event);
89
+ }
90
+ await this.autoloadSSRRoutes();
91
+ this.eventEmitter.emit("onHMRCompleted");
92
+ return;
93
+ }
68
94
  // 일단 변경된 파일과 dependent 파일들을 invalidate 합니다.
69
95
  // 한 번 이상 import된 친구들에 대해서만 실제 작업이 일어납니다.
70
96
  // 그러니 안심하고 invalidate 해도 됩니다.
@@ -168,6 +194,30 @@ export class Syncer {
168
194
  this.workflows = await loadWorkflows();
169
195
  await Sonamu.workflows.synchronize(this.workflows);
170
196
  }
197
+ async autoloadSSRRoutes() {
198
+ const ssrConfigPath = path.join(Sonamu.apiRootPath, "src/ssr");
199
+ // 기존 routes 초기화
200
+ const { clearSSRRoutes } = await import("../ssr/index.js");
201
+ clearSSRRoutes();
202
+ // ssr 폴더 없으면 스킵
203
+ if (!await exists(ssrConfigPath)) {
204
+ return;
205
+ }
206
+ // ssr 폴더 안의 모든 .ts 파일 로드
207
+ const { globAsync } = await import("../utils/async-utils.js");
208
+ const { importMembers } = await import("../utils/esm-utils.js");
209
+ const { runtimePath } = await import("../utils/path-utils.js");
210
+ // runtimePath를 사용하여 개발/프로덕션 환경에 맞는 확장자 처리
211
+ const files = await globAsync(path.join(ssrConfigPath, runtimePath("**/*.ts")));
212
+ for (const file of files){
213
+ try {
214
+ // importMembers를 사용하면 파일의 side effect(registerSSR 호출)가 실행됨
215
+ await importMembers(file);
216
+ } catch (e) {
217
+ console.error(`Failed to load SSR route: ${file}`, e);
218
+ }
219
+ }
220
+ }
171
221
  /**
172
222
  * 실제 싱크를 수행하는 본체입니다.
173
223
  * 변경된 파일들을 타입별로 분류하고 각 타입에 맞는 액션을 실행합니다.
@@ -290,6 +340,13 @@ export class Syncer {
290
340
  });
291
341
  await this.actionGenerateServices(params);
292
342
  await this.actionGenerateHttps();
343
+ // queries.generated.ts 및 entry-server.generated.tsx 재생성
344
+ await generateTemplate("queries", {}, {
345
+ overwrite: true
346
+ });
347
+ await generateTemplate("entry_server", {}, {
348
+ overwrite: true
349
+ });
293
350
  }
294
351
  // web/.sonamu.env 에 현재 설정값 저장
295
352
  async actionSyncConfig() {
@@ -455,4 +512,4 @@ export class Syncer {
455
512
  }
456
513
  }
457
514
 
458
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCBwYXRoLCB7IGRpcm5hbWUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGFyZUZpbGVzU2FtZSwgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zLCByZW5ld0NoZWNrc3VtcyB9IGZyb20gXCIuL2NoZWNrc3VtXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRlbXBsYXRlLCByZW5kZXJUZW1wbGF0ZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHksIGRlbEVudGl0eSB9IGZyb20gXCIuL2VudGl0eS1vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlLCBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBMb2FkZWRBcGlzLFxuICB0eXBlIExvYWRlZE1vZGVscyxcbiAgdHlwZSBMb2FkZWRUeXBlcyxcbiAgbG9hZEFwaXMsXG4gIGxvYWRNb2RlbHMsXG4gIGxvYWRUeXBlcyxcbiAgbG9hZFdvcmtmbG93cyxcbn0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuXG50eXBlIERpZmZHcm91cHMgPSB7XG4gIFtrZXkgaW4gRmlsZVR5cGVdOiBBYnNvbHV0ZVBhdGhbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW5jZXIge1xuICBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuICB3b3JrZmxvd3M6IE1hcDxzdHJpbmcsIFdvcmtmbG93TWV0YWRhdGFbXT4gPSBuZXcgTWFwKCk7XG4gIGlzU3luY2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKipcbiAgICog7LK07YGs7ISs7J20IOuzgOqyveuQnCDrtoDrtoTsl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOuLpOunjCBzb25hbXUuc2hhcmVkLnRz64qUIOyytO2BrOyErCDruYTqtZAg7JeG7J20IOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG5cbiAgICAvLyBzb25hbXUuc2hhcmVkLnRz64qUIOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmNvcHlTaGFyZWRUb1RhcmdldHModGFyZ2V0cyk7XG5cbiAgICAvLyDqt7gg64uk7J2M67aA7YSw64qUIOuzgOqyveuQnCDtjIzsnbzsnYQg7LC+7JWE7IScIOuPmeq4sO2ZlCDsnpHsl4XsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGNvbnN0IGNoYW5nZWRGaWxlcyA9IGF3YWl0IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpO1xuICAgIGlmIChjaGFuZ2VkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQoXCJBbGwgZmlsZXMgYXJlIHN5bmNlZCFcIikpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDrp4zslb0g7Iux7YGsIOykkeyXkCDtlITroZzshLjsiqTqsIAg7KO97Jy866m0IOq8rOyXrOuyhOumrOq4sCDrlYzrrLjsl5AsXG4gICAgLy8g7Iuc6re464SQ7JeQ64+EIOyeoOyLnCDrsoTti7gg7IiYIOyeiOuKlCDtmZjqsr0g7IaN7JeQ7IScIOyLse2BrOulvCDsi6Ttlontlanri4jri6QuXG4gICAgYXdhaXQgcnVuV2l0aEdyYWNlZnVsU2h1dGRvd24oXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIOyWmOqwgCDsi7Htgawg7J6R7JeFIOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhjaGFuZ2VkRmlsZXMpO1xuXG4gICAgICAgIC8vIOyLse2BrCDslaHshZjsnbQg64Gd64KY66m0IO2VreyDgSDssrTtgazshKzsnYQg64uk7IucIOqwseyLoO2VqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgICAgIH0sXG4gICAgICB7IHdoZW5UaGlzSGFwcGVuczogXCJTSUdVU1IyXCIsIHdhaXRGb3JVcFRvOiAyMDAwMCB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCDqsJDsp4DtlZwg7YyM7J28IOuzgOqyvSDsgqztla3sl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyjvOyWtOynhCDrs4Dqsr0g7YyM7J2865OkIOykkSDssrTtgazshKwg6rSA66asIOuMgOyDgeyduCDqsoPrk6Trp4wg6rCA7KC464uk6rCAIOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyytO2BrOyErCDtjIzsnbwg7JeF642w7J207Yq464qUIOyXrOq4sOyXkOyEnCDtlZjsp4Ag7JWK7Iq164uI64ukLiDtmLjstpzsnpDqsIAg7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRoIC0g67OA6rK9IO2MjOydvOuTpC4g7ZSE66Gc7KCd7Yq4IOujqO2KuOu2gO2EsCBcInNyYy9cIiDrmJDripQgXCJkaXN0L1wi66GcIOyLnOyeke2VmOuKlCDsg4HrjIAg6rK966Gc7J6F64uI64ukLiDsmIjsi5w6IFwic3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gICAqL1xuICBhc3luYyBzeW5jRnJvbVdhdGNoZXIoZXZlbnQ6IHN0cmluZywgZGlmZkZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIgJiYgZXZlbnQgIT09IFwidW5saW5rXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDsnbzri6gg67OA6rK965CcIO2MjOydvOqzvCBkZXBlbmRlbnQg7YyM7J2865Ok7J2EIGludmFsaWRhdGUg7ZWp64uI64ukLlxuICAgIC8vIO2VnCDrsogg7J207IOBIGltcG9ydOuQnCDsuZzqtazrk6Tsl5Ag64yA7ZW07ISc66eMIOyLpOygnCDsnpHsl4XsnbQg7J287Ja064Kp64uI64ukLlxuICAgIC8vIOq3uOufrOuLiCDslYjsi6ztlZjqs6AgaW52YWxpZGF0ZSDtlbTrj4Qg65Cp64uI64ukLlxuICAgIC8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzripQgaG90LmludmFsaWRhdGVGaWxl7IucIOy0iOq4sCDsl5Drn6zqsIAg67Cc7IOd7ZWY6riwIOuVjOusuOyXkCBpbnZhbGlkYXRlIO2VmOyngCDslYrsirXri4jri6QuXG4gICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgY29uc3QgaW52YWxpZGF0ZWRQYXRocyA9IChhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoZGlmZkZpbGVQYXRoLCBldmVudCkpIGFzIEFic29sdXRlUGF0aFtdO1xuXG4gICAgICBpZiAoaW52YWxpZGF0ZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYPCflIQgSW52YWxpZGF0ZWQ6YCkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW52YWxpZGF0ZWRQYXRoIG9mIGludmFsaWRhdGVkUGF0aHMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8g66eM7JW9IG1vZGVsLnRzIO2MjOydvOydtCDrs4Dqsr0oaW52YWxpZGF0ZSnrkJjsl4jri6Q/IOq3uOufrOuptCByZWdpc3RlcmVkQXBpcyDspJHsl5DshJwg7J20IOuqqOuNuOyXkCDtlbTri7ntlZjripQgYXBp65Ok7J2AIOyngOybjOykmOyalC5cbiAgICAgICAgICAgIC8vIHJlZ2lzdGVyZWRBcGlz64qUIO2GteycvOuhnCDri6Qg64Kg66Ck67KE66a0IOyImCDsl4bsirXri4jri6QuIHJlZ2lzdGVyZWRBcGlz7JeQIOyYrOudvOyYpOuKlCDsuZzqtazrk6TsnYAg7LSI6riwIOuhnOuTnOyLnCDrmJDripQgSE1S7Iuc7JeQ66eMIOuTseuhneuQmOq4sCDrlYzrrLjsnoXri4jri6QuXG4gICAgICAgICAgICAvLyDrlLDrnbzshJwgbW9kZWwudHMg7YyM7J287J2YIOuzgOqyveycvOuhnCDri6TsnYzrsogg7IOI66Gc7Jq0IGV2YWzsnbQg7JiI7IOB65CY64qUIOydtCDsi5zsoJDsl5DshJzrp4wsIOydtCDrqqjrjbjsl5DshJwg64KY7JioIHJlZ2lzdGVyZWRBcGlz65Ok7J2EIOyngOybjOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZEFwaXMgPSB0aGlzLnJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkQXBpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgIGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSxcbiAgICAgICAgICAgICAgICBjaGFsay5ncmF5KGAod2l0aCAke3JlbW92ZWRBcGlzLmxlbmd0aH0gQVBJcylgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGNoYWxrLnJlZChgRmFpbGVkIHRvIHJlbW92ZSBpbnZhbGlkYXRlZCByZWdpc3RlcmVkIEFQSXMgZm9yICR7aW52YWxpZGF0ZWRQYXRofWApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc0luQ2hlY2tQYXR0ZXJuR3JvdXAgPSBPYmplY3QudmFsdWVzKGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgoKSkuc29tZShcbiAgICAgIChwYXR0ZXJuKSA9PiBtaW5pbWF0Y2goZGlmZkZpbGVQYXRoLCBwYXR0ZXJuKSxcbiAgICApO1xuXG4gICAgLy8g7ZWgIOydvChzeW5jKeydtCDsnojsnLzrqbQg7ZWp64uI64ukLlxuICAgIGlmIChpc0luQ2hlY2tQYXR0ZXJuR3JvdXApIHtcbiAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhbZGlmZkZpbGVQYXRoXSk7XG4gICAgfVxuXG4gICAgLy8g7Iux7YGsIOyekeyXheydtCDrgZ3rgpjrqbQg66qo65OgIOuqqOuTiOydhCDroZzrk5ztlanri4jri6QuXG4gICAgLy8gaG1yLWhvb2vsl5Ag7J2Y7ZW0IGludmFsaWRhdGXrkJwg67aA67aE65Ok7J20IOyVhOuLiOudvOuptCDsupDsi5wg6re464yA66GcIOycoOyngO2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG5cbiAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwib25ITVJDb21wbGV0ZWRcIik7XG4gIH1cblxuICByZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzKFxuICAgIGludmFsaWRhdGVkUGF0aDogQWJzb2x1dGVQYXRoLFxuICApOiAodHlwZW9mIHJlZ2lzdGVyZWRBcGlzKVtudW1iZXJdW10ge1xuICAgIGlmICghaW52YWxpZGF0ZWRQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIgLyrshozsiqQg7L2U65Oc66W8IOuLpOujqOuKlCDsg4HtmansnbTri4ggLnRzIOqyveuhnOuhnCDrtIXri4jri6QuKi8pKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5SWQgPSBFbnRpdHlNYW5hZ2VyLmdldEVudGl0eUlkRnJvbVBhdGgoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICBjb25zdCB0b1JlbW92ZSA9IHJlZ2lzdGVyZWRBcGlzLmZpbHRlcigoYXBpKSA9PiBhcGkubW9kZWxOYW1lID09PSBgJHtlbnRpdHlJZH1Nb2RlbGApO1xuICAgIGZvciAoY29uc3QgYXBpIG9mIHRvUmVtb3ZlKSB7XG4gICAgICByZWdpc3RlcmVkQXBpcy5zcGxpY2UocmVnaXN0ZXJlZEFwaXMuaW5kZXhPZihhcGkpLCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9SZW1vdmU7XG4gIH1cblxuICBhc3luYyBjb3B5U2hhcmVkVG9UYXJnZXRzKHRhcmdldHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7Yq57KCVIOuzgOyImCDsuZjtmZjsnYQg7JyE7ZW07IScIOyCrOyaqe2VqeuLiOuLpC5cbiAgICBjb25zdCBjb252ZXJ0TWFwID0ge1xuICAgICAgYmFzZVVybDpcbiAgICAgICAgU29uYW11LmNvbmZpZy5zZXJ2ZXIuYmFzZVVybCA/P1xuICAgICAgICBgaHR0cDovLyR7U29uYW11LmNvbmZpZy5zZXJ2ZXIubGlzdGVuPy5ob3N0ID8/IFwibG9jYWxob3N0XCJ9OiR7U29uYW11LmNvbmZpZy5zZXJ2ZXIubGlzdGVuPy5wb3J0ID8/IDMwMDB9YCxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgLy8g7KeA6riIIOqwgOyguOqwgOugpOuKlCDsnbQg7YyM7J287J2AIFNvbmFtdSDsvZTrk5zrsqDsnbTsiqTsnZgg7J2867aA7J6F64uI64ukLlxuICAgICAgLy8g6re465+w642wIGRpc3Qg7IaNIOu5jOuTnOuQnCDshozsiqQg7L2U65OcIO2MjOydvOydtCDtlYTsmpTtlZwg6rKD7J20IOyVhOuLiOqzoCwgc3Jj7JeQ66eMIOyeiOuKlCDthY3siqTtirgg7YyM7J287J20IO2VhOyalO2VqeuLiOuLpC5cbiAgICAgIC8vIOuUsOudvOyEnCAvc3JjL+yXkOyEnCDssL7sirXri4jri6QuXG4gICAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICBpbXBvcnQubWV0YS5kaXJuYW1lLnJlcGxhY2UoXCIvZGlzdC9cIiwgXCIvc3JjL1wiKSxcbiAgICAgICAgYC4uL3NoYXJlZC8ke3RhcmdldH0uc2hhcmVkLnRzLnR4dGAsXG4gICAgICApO1xuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHNyY1BhdGgpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQpKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUcmllZCB0byBjb3B5IHNvbmFtdS5zaGFyZWQudHMgdG8gdGFyZ2V0ICcke3RhcmdldH0nIGJ1dCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIGNoZWNrIHlvdXIgcHJvamVjdCBkaXJlY3Rvcnkgc3RydWN0dXJlLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZ1bGxUZXh0ID0gYXdhaXQgcmVhZEZpbGUoc3JjUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgIGNvbnN0IGNvbnZlcnRlZFRleHQgPSBPYmplY3QuZW50cmllcyhjb252ZXJ0TWFwKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIFtrZXksIHZhbHVlXSkgPT4gYWNjLnJlcGxhY2UoYCRbWyR7a2V5fV1dYCwgdmFsdWUpLFxuICAgICAgICBmdWxsVGV4dCxcbiAgICAgICk7XG5cbiAgICAgIC8vIOydtOqxtCDtlITroZzsoJ3tirjsl5AgLnRzIOyGjOyKpCDsvZTrk5wg7YyM7J287J2EIOyDneyEse2VmOuKlCDqsoPsnbTrr4DroZwgc3Jj7J2YIC50cyDqsr3roZzroZwg6rCR64uI64ukLlxuICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIFwic3JjL3NlcnZpY2VzL3NvbmFtdS5zaGFyZWQudHNcIik7XG5cbiAgICAgIC8vIOygleunkCDtmLnsi5zrgpjsp4Drp4wgdGFyZ2V0IOuUlOugie2GoOumrOuKlCDsnojslrTrj4Qgc3JjL3NlcnZpY2VzIOuUlOugie2GoOumrOuKlCDsl4bsnYQg7IiYIOyeiOycvOuvgOuhnCDrr7jrpqwg7IOd7ISx7ZW07KSN64uI64ukLlxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguZGlybmFtZShkZXN0UGF0aCkpKSkge1xuICAgICAgICBhd2FpdCBta2RpcihwYXRoLmRpcm5hbWUoZGVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS53YXJuKGBDcmVhdGVkIGRpcmVjdG9yeSAnJHtwYXRoLmRpcm5hbWUoZGVzdFBhdGgpfScgYmVjYXVzZSBpdCBkaWQgbm90IGV4aXN0LmApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgYXJlRmlsZXNTYW1lKHsgZGF0YTogY29udmVydGVkVGV4dCB9LCB7IHBhdGg6IGRlc3RQYXRoIH0pKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZGVzdFBhdGgsIGNvbnZlcnRlZFRleHQpO1xuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmJsdWUocGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIGRlc3RQYXRoKSksXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRUeXBlcygpIHtcbiAgICB0aGlzLnR5cGVzID0gYXdhaXQgbG9hZFR5cGVzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZE1vZGVscygpIHtcbiAgICB0aGlzLm1vZGVscyA9IGF3YWl0IGxvYWRNb2RlbHMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkQXBpcygpIHtcbiAgICB0aGlzLmFwaXMgPSBhd2FpdCBsb2FkQXBpcygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRXb3JrZmxvd3MoKSB7XG4gICAgdGhpcy53b3JrZmxvd3MgPSBhd2FpdCBsb2FkV29ya2Zsb3dzKCk7XG4gICAgYXdhaXQgU29uYW11LndvcmtmbG93cy5zeW5jaHJvbml6ZSh0aGlzLndvcmtmbG93cyk7XG4gIH1cblxuICAvKipcbiAgICog7Iuk7KCcIOyLse2BrOulvCDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgKiDrs4Dqsr3rkJwg7YyM7J2865Ok7J2EIO2DgOyeheuzhOuhnCDrtoTrpZjtlZjqs6Ag6rCBIO2DgOyeheyXkCDrp57ripQg7JWh7IWY7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aHMgLSDrs4Dqsr3rkJwg7YyM7J2865Ok7J2YIOygiOuMgCDqsr3roZwg66qp66GdXG4gICAqIEByZXR1cm5zIGRpZmZUeXBlcyAtIOuzgOqyveuQnCDtjIzsnbzsnZgg7YOA7J6FIOuqqeuhnSAoZW50aXR5LCB0eXBlcywgbW9kZWwg65OxKVxuICAgKi9cbiAgYXN5bmMgZG9TeW5jQWN0aW9ucyhkaWZmRmlsZVBhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8eyBkaWZmVHlwZXM6IHN0cmluZ1tdIH0+IHtcbiAgICBjb25zdCBkaWZmR3JvdXBzID0gdGhpcy5jYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlUGF0aHMpO1xuICAgIGNvbnN0IGRpZmZUeXBlcyA9IE9iamVjdC5rZXlzKGRpZmZHcm91cHMpO1xuXG4gICAgLy8g7Yq466as6rGwOiBlbnRpdHksIHR5cGVzXG4gICAgLy8g7JWh7IWYOiDsiqTtgqTrp4gg7IOd7ISxXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcImVudGl0eVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFbnRpdHlDaGFuZ2UoZGlmZkdyb3VwcywgZGlmZlR5cGVzKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IHR5cGVzLCBlbnVtcywgZ2VuZXJhdGVkIOuzgOqyveyLnFxuICAgIC8vIOyVoeyFmDog7YyM7J28IOyLse2BrCB0eXBlcywgZW51bXMsIGdlbmVyYXRlZFxuICAgIGlmIChcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcInR5cGVzXCIpIHx8XG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJmdW5jdGlvbnNcIikgfHxcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcImdlbmVyYXRlZFwiKVxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2UoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiBtb2RlbFxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJtb2RlbFwiKSB8fCBkaWZmVHlwZXMuaW5jbHVkZXMoXCJmcmFtZVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2UoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiBjb25maWdcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwiY29uZmlnXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmFjdGlvblN5bmNDb25maWcoKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IHdvcmtmbG93XG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcIndvcmtmbG93XCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpZmZUeXBlcyxcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZXM6IEFic29sdXRlUGF0aFtdKTogRGlmZkdyb3VwcyB7XG4gICAgcmV0dXJuIGdyb3VwKGRpZmZGaWxlcywgKHIpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZWQgPSByLm1hdGNoKC9cXC4obW9kZWx8dHlwZXN8ZnVuY3Rpb25zfGVudGl0eXxnZW5lcmF0ZWR8ZnJhbWV8Y29uZmlnKVxcLlt0al1zLyk7XG4gICAgICByZXR1cm4gbWF0Y2hlZD8uWzFdID8/IFwidW5rbm93blwiO1xuICAgIH0pIGFzIHVua25vd24gYXMgRGlmZkdyb3VwcztcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUVudGl0eUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzLCBkaWZmVHlwZXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUVudGl0eUNoYW5nZVwiLCB7IGRpZmZHcm91cHMsIGRpZmZUeXBlcyB9KTtcblxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAvLyB0eXBlcyDsg53shLEoZW50aXR5IOyDiOuhnCDstpTqsIDrkJwg6rK97JqwKVxuICAgIC8vIHBhcmVudElk6rCAIOyXhuqzoCwgdHlwZXPqsIAg7JeG64qUIOqyveyasOyXkOunjCDsg53shLFcbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChkaWZmR3JvdXBzLmVudGl0eT8uWzBdKTtcblxuICAgIGlmIChlbnRpdHlJZCkge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgLy8g7ZSE66Gc7KCd7Yq47JeQIOyDneyEseuQmOyWtOyVvCDtlZjripQgLnRzIO2MjOydvOydmCDqsr3roZzsnoXri4jri6QuXG4gICAgICBjb25zdCB0eXBlRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke2VudGl0eS5uYW1lcy5mc30vJHtlbnRpdHkubmFtZXMuZnN9LnR5cGVzLnRzYCxcbiAgICAgICk7XG4gICAgICBpZiAoZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgIShhd2FpdCBleGlzdHModHlwZUZpbGVQYXRoKSkpIHtcbiAgICAgICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcImluaXRfdHlwZXNcIiwgeyBlbnRpdHlJZCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2NoZW1hcygpO1xuXG4gICAgZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPSB1bmlxdWUoW1xuICAgICAgLi4uKGRpZmZHcm91cHMuZ2VuZXJhdGVkID8/IFtdKSxcbiAgICAgIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjL2FwcGxpY2F0aW9uL3NvbmFtdS5nZW5lcmF0ZWQudHNcIikgYXMgQWJzb2x1dGVQYXRoLFxuICAgIF0pO1xuICAgIGRpZmZUeXBlcy5wdXNoKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPEZpbGVUeXBlW10+IHtcbiAgICBjb25zdCB0c1BhdGhzID0gdW5pcXVlKFtcbiAgICAgIC4uLihkaWZmR3JvdXBzLnR5cGVzID8/IFtdKSxcbiAgICAgIC4uLihkaWZmR3JvdXBzLmZ1bmN0aW9ucyA/PyBbXSksXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPz8gW10pLFxuICAgIF0pO1xuICAgIE5haXRlLnQoXCJoYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzIH0pO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIHR5cGVzL2Z1bmN0aW9ucy9nZW5lcmF0ZWQgY2hhbmdlczogJHt0c1BhdGhzLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHApKS5qb2luKFwiLCBcIil9YFxuICAgIC8vICAgKVxuICAgIC8vICk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzKTtcblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZVwiLCB7IGRpZmZHcm91cHMgfSk7XG4gICAgY29uc3QgbWVyZ2VkR3JvdXAgPSBbLi4uKGRpZmZHcm91cHMubW9kZWwgPz8gW10pLCAuLi4oZGlmZkdyb3Vwcy5mcmFtZSA/PyBbXSldO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIG1vZGVsL2ZyYW1lIGNoYW5nZXM6ICR7bWVyZ2VkR3JvdXAubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgcCkpLmpvaW4oXCIsIFwiKX1gXG4gICAgLy8gICApXG4gICAgLy8gKTtcblxuICAgIC8vIGdlbmVyYXRlZF9odHRwLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci50eXBlc+ulvCDslIHri4jri6QuXG4gICAgLy8gc2VydmljZS50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIuYXBpc+ulvCDslIHri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICBjb25zdCBwYXJhbXM6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10gPSBtZXJnZWRHcm91cC5tYXAoKG1vZGVsUGF0aCkgPT4ge1xuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiKSkge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChtb2RlbFBhdGgpO1xuICAgICAgICBhc3NlcnQoZW50aXR5SWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlbFBhdGguZW5kc1dpdGgoXCIuZnJhbWUudHNcIikpIHtcbiAgICAgICAgY29uc3QgWywgZnJhbWVOYW1lXSA9IG1vZGVsUGF0aC5tYXRjaCgvLitcXC8oLispXFwuZnJhbWVcXC50cyQvKSA/PyBbXTtcbiAgICAgICAgYXNzZXJ0KGZyYW1lTmFtZSk7XG4gICAgICAgIC8vIGZyYW1lTmFtZeydhCBQYXNjYWxDYXNl66GcIOuzgO2ZmCAoZGFzaGJvYXJkIC0+IERhc2hib2FyZClcbiAgICAgICAgY29uc3QgZnJhbWVJZCA9IGluZmxlY3Rpb24uY2FtZWxpemUoZnJhbWVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChmcmFtZUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCByZWFjaGFibGVcIik7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2VydmljZXMocGFyYW1zKTtcbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlSHR0cHMoKTtcbiAgfVxuXG4gIC8vIHdlYi8uc29uYW11LmVudiDsl5Ag7ZiE7J6sIOyEpOygleqwkiDsoIDsnqVcbiAgYXN5bmMgYWN0aW9uU3luY0NvbmZpZygpIHtcbiAgICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IFNvbmFtdS5jb25maWcuc2VydmVyLmxpc3RlbiA/PyB7fTtcbiAgICBjb25zdCBjb250ZW50ID0gYEFQSV9IT1NUPSR7aG9zdCA/PyBcImxvY2FsaG9zdFwifVxcbkFQSV9QT1JUPSR7cG9ydCA/PyAzMDAwfWA7XG5cbiAgICBOYWl0ZS50KFwiYWN0aW9uU3luY0NvbmZpZ1wiLCB7IGNvbnRlbnQgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBTb25hbXUuY29uZmlnLnN5bmMudGFyZ2V0cy5tYXAoYXN5bmMgKHRhcmdldCkgPT4ge1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcIi5zb25hbXUuZW52XCIpLCBjb250ZW50KTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogc2VydmljZXMuZ2VuZXJhdGVkLnRz66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHBhcmFtIHBhcmFtc0FycmF5XG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlU2VydmljZXMoXG4gICAgcGFyYW1zQXJyYXk6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10sXG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBOYWl0ZS50KFwiYWN0aW9uR2VuZXJhdGVTZXJ2aWNlc1wiLCBwYXJhbXNBcnJheSk7XG5cbiAgICAvLyBzZXJ2aWNlcy5nZW5lcmF0ZWQudHMg7Ya17ZWpIO2MjOydvCDsg53shLFcbiAgICBjb25zdCBzZXJ2aWNlc0ZpbGUgPSBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFxuICAgICAgXCJzZXJ2aWNlc1wiLFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBbLi4uc2VydmljZXNGaWxlXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUuZ2VuZXJhdGVkLnRz7JmAIHNvbmFtdS5nZW5lcmF0ZWQuc3NvLnRz66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkX3Nzb1wiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gICAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRcIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICAgICAgXSlcbiAgICApXG4gICAgICAuZmxhdCgpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdS5nZW5lcmF0ZWQuaHR0cOulvCDsg53shLHtlanri4jri6QuXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcLlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVIdHRwcygpOiBQcm9taXNlPEFic29sdXRlUGF0aD4ge1xuICAgIGNvbnN0IFtyZXNdID0gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICAgIFwiZ2VuZXJhdGVkX2h0dHBcIixcbiAgICAgIHsgZW50aXR5SWQ6IFwiZHVtbXlcIiB9LFxuICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfSxcbiAgICApO1xuICAgIGFzc2VydChyZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogKi50eXBlcy50cywgKi5mdW5jdGlvbnMudHMsICouZ2VuZXJhdGVkLnRz66W8IO2DgOqynyDrlJTroInthqDrpqzsl5Ag67O17IKs7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gdHNQYXRoc1xuICAgKiBAcmV0dXJucyDrs7XsgqzrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHNQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgY29uc3QgeyBkaXI6IGFwaURpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHRhcmdldHMubWFwKGFzeW5jICh0YXJnZXQpID0+XG4gICAgICAgICAgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB0c1BhdGhzLm1hcChhc3luYyAocmVhbFNyYykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBkc3QgPSByZWFsU3JjXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoYC8ke2FwaURpcn0vYCwgYC8ke3RhcmdldH0vYClcbiAgICAgICAgICAgICAgICAucmVwbGFjZShcIi9hcHBsaWNhdGlvbi9cIiwgXCIvc2VydmljZXMvXCIpO1xuICAgICAgICAgICAgICBjb25zdCBkaXIgPSBkaXJuYW1lKGRzdCk7XG4gICAgICAgICAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhkaXIpKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5ibHVlKGRzdC5yZXBsYWNlKGAke1NvbmFtdS5hcHBSb290UGF0aH0vYCwgXCJcIikpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChyZWFsU3JjLCBkc3QpO1xuICAgICAgICAgICAgICByZXR1cm4gZHN0O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICApLmZsYXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChmcm9tUGF0aDogc3RyaW5nLCB0b1BhdGg6IHN0cmluZykge1xuICAgIGlmICghKGF3YWl0IGV4aXN0cyhmcm9tUGF0aCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkRmlsZUNvbnRlbnQgPSAoYXdhaXQgcmVhZEZpbGUoZnJvbVBhdGgpKS50b1N0cmluZygpO1xuXG4gICAgY29uc3QgbmV3RmlsZUNvbnRlbnQgPSAoKCkgPT4ge1xuICAgICAgLy8gd2Vi7J2064KYIGFwcCDrk7Hsl5DripQgc29uYW116rCAIOyXhuyKteuLiOuLpC5cbiAgICAgIC8vIOuUsOudvOyEnCBzb25hbXXsl5Ag64yA7ZWcIGltcG9ydOuKlCDtlajqu5gg67O17IKs65CY64qUIHNvbmFtdS5zaGFyZWQudHPsl5Ag64yA7ZWcIGltcG9ydOuhnCDsuZjtmZjtlbTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g66y47KCc64qUIOumrOyGjOyKpCDsooXrpZjsl5Ag65Sw6528IHNvbmFtdS5zaGFyZWQudHProZwg6rCA64qUIOqyveuhnOqwgCDri6TrpbTri6TripQg7KCQ7J6F64uI64ukLlxuICAgICAgLy8g7JiI66W8IOuTpOyWtCBzb25hbXUuZ2VuZXJhdGVkLnRzIOyeheyepeyXkOyEnCBzb25hbXUuc2hhcmVkLnRz64qUIOqwmeydgCDrlJTroInthqDrpqzsl5Ag7J6I7Jy864uIIC4vc29uYW11LnNoYXJlZOuhnCDsuZjtmZjtlZjrqbQg65CY7KeA66eMLFxuICAgICAgLy8gdXNlci50eXBlcy50cyDsnoXsnqXsl5DshJwgc29uYW11LnNoYXJlZC50c+uKlCDsg4HsnIQg65SU66CJ7Yag66as7JeQIOyeiOycvOuLiCAuLi9zb25hbXUuc2hhcmVk66GcIOy5mO2ZmO2VtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDsnbQg66y47KCc66W8IO2VtOqysO2VmOq4sCDsnITtlbQg67O17IKs7ZWY6rOg7J6QIO2VmOuKlCDrpqzshozsiqTsnZgg6rK966GcKHRvUGF0aCnrpbwg6riw7KSA7Jy866GcIHNvbmFtdS5zaGFyZWQudHPqsIAg7J6I64qUIOuUlOugie2GoOumrOulvCDssL7slYTshJwg7IOB64yAIOqyveuhnOulvCDqs4TsgrDtlZjrj4TroZ0g7ZWY7JiA7Iq164uI64ukLlxuICAgICAgY29uc3Qgc2VydmljZXNEaXIgPSB0b1BhdGgucmVwbGFjZSgvXFwvc2VydmljZXNcXC8uKiQvLCBcIi9zZXJ2aWNlc1wiKTtcbiAgICAgIGNvbnN0IGZpbGVEaXIgPSBkaXJuYW1lKHRvUGF0aCk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKGZpbGVEaXIsIHNlcnZpY2VzRGlyKTtcbiAgICAgIGNvbnN0IHNoYXJlZFBhdGggPSByZWxhdGl2ZVBhdGggPT09IFwiXCIgPyBcIi4vc29uYW11LnNoYXJlZFwiIDogYCR7cmVsYXRpdmVQYXRofS9zb25hbXUuc2hhcmVkYDtcblxuICAgICAgY29uc3QgbmZjID0gb2xkRmlsZUNvbnRlbnQucmVwbGFjZSgvZnJvbSBcInNvbmFtdVwiL2csIGBmcm9tIFwiJHtzaGFyZWRQYXRofVwiYCk7XG4gICAgICByZXR1cm4gbmZjO1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIHdyaXRlRmlsZSh0b1BhdGgsIG5ld0ZpbGVDb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7JeU7Yuw7Yuw7JmAIO2FnO2UjOumvyDtgqTsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIHRlbXBsYXRlS2V5IO2FnO2UjOumvyDtgqRcbiAgICogQHBhcmFtIGVudW1JZCDsl7TqsbDtmJUgSURcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0c0dlbkNvZGUoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICB0ZW1wbGF0ZUtleTogVGVtcGxhdGVLZXksXG4gICAgZW51bUlkPzogc3RyaW5nLFxuICApOiBQcm9taXNlPHsgc3ViUGF0aDogc3RyaW5nOyBmdWxsUGF0aDogc3RyaW5nOyBpc0V4aXN0czogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IGdlblBhdGggfSA9IFRlbXBsYXRlTWFuYWdlci5nZXQodGVtcGxhdGVLZXkpLmdldFRhcmdldEFuZFBhdGgoXG4gICAgICBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgIGVudW1JZCxcbiAgICApO1xuXG4gICAgY29uc3Qgc3ViUGF0aCA9IHBhdGguam9pbih0YXJnZXQsIGdlblBhdGgpO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgc3ViUGF0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN1YlBhdGgsXG4gICAgICBmdWxsUGF0aCxcbiAgICAgIGlzRXhpc3RzOiBhd2FpdCBleGlzdHMoZnVsbFBhdGgpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDsl7TqsbDtmJXsl5Ag64yA7ZW0LCDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqIEBwYXJhbSBlbnRpdHlJZCDsl5Tti7Dti7AgSURcbiAgICogQHBhcmFtIGVudW1zIOyXtOqxsO2YlSDroIjsnbTruJRcbiAgICogQHJldHVybnMg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7Jes67aAXG4gICAqL1xuICBhc3luYyBjaGVja0V4aXN0cyhcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGVudW1zOiB7XG4gICAgICBbbmFtZTogc3RyaW5nXTogei5ab2RFbnVtPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4+PjtcbiAgICB9LFxuICApOiBQcm9taXNlPFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPj4ge1xuICAgIGNvbnN0IGtleXM6IFRlbXBsYXRlS2V5W10gPSBUZW1wbGF0ZUtleS5vcHRpb25zO1xuICAgIGNvbnN0IG5hbWVzID0gRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCk7XG4gICAgY29uc3QgZW51bXNLZXlzID0gT2JqZWN0LmtleXMoZW51bXMpLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gbmFtZXMuY29uc3RhbnQpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHJlZHVjZUFzeW5jKFxuICAgICAga2V5cyxcbiAgICAgIGFzeW5jIChyZXN1bHQsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCB0cGwgPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KGtleSk7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChcInZpZXdfZW51bXNcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyhlbnVtc0tleXMsIGFzeW5jIChjb21wb25lbnRJZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IHAgfSA9IHRwbC5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzLCBjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHtjb21wb25lbnRJZH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcyk7XG4gICAgICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgICAgICBpZiAodGFyZ2V0LmluY2x1ZGVzKFwiOnRhcmdldFwiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKHRhcmdldHMsIGFzeW5jICh0KSA9PiB7XG4gICAgICAgICAgICByZXN1bHRbYCR7a2V5fV9fJHt0fWBdID0gYXdhaXQgZXhpc3RzKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQucmVwbGFjZShcIjp0YXJnZXRcIiwgdCksIHApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHRba2V5XSA9IGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIHApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAge30gYXMgUmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBjcmVhdGVFbnRpdHkoZm9ybTogVGVtcGxhdGVPcHRpb25zW1wiZW50aXR5XCJdKSB7XG4gICAgcmV0dXJuIGF3YWl0IGNyZWF0ZUVudGl0eShmb3JtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGRlbEVudGl0eShlbnRpdHlJZDogc3RyaW5nKTogUHJvbWlzZTx7IGRlbFBhdGhzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGRlbEVudGl0eShlbnRpdHlJZCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVRlbXBsYXRlPFQgZXh0ZW5kcyBUZW1wbGF0ZUtleT4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICAgIF9nZW5lcmF0ZU9wdGlvbnM/OiBHZW5lcmF0ZU9wdGlvbnMsXG4gICk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucywgX2dlbmVyYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5kZXJUZW1wbGF0ZTxUIGV4dGVuZHMga2V5b2YgVGVtcGxhdGVPcHRpb25zPihcbiAgICBrZXk6IFQsXG4gICAgdGVtcGxhdGVPcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4gICk6IFByb21pc2U8UGF0aEFuZENvZGVbXT4ge1xuICAgIHJldHVybiBhd2FpdCByZW5kZXJUZW1wbGF0ZShrZXksIHRlbXBsYXRlT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyByZW5ld0NoZWNrc3VtcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImhvdCIsImFzc2VydCIsImNoYWxrIiwiRXZlbnRFbWl0dGVyIiwibWtkaXIiLCJyZWFkRmlsZSIsIndyaXRlRmlsZSIsImluZmxlY3Rpb24iLCJtaW5pbWF0Y2giLCJwYXRoIiwiZGlybmFtZSIsImdyb3VwIiwidW5pcXVlIiwicmVnaXN0ZXJlZEFwaXMiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJUZW1wbGF0ZU1hbmFnZXIiLCJUZW1wbGF0ZUtleSIsIm1hcEFzeW5jIiwicmVkdWNlQXN5bmMiLCJjZW50ZXJUZXh0IiwiaXNUZXN0IiwiZXhpc3RzIiwicnVuV2l0aEdyYWNlZnVsU2h1dGRvd24iLCJhcmVGaWxlc1NhbWUiLCJmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMiLCJyZW5ld0NoZWNrc3VtcyIsImdlbmVyYXRlVGVtcGxhdGUiLCJyZW5kZXJUZW1wbGF0ZSIsImNyZWF0ZUVudGl0eSIsImRlbEVudGl0eSIsImdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgiLCJsb2FkQXBpcyIsImxvYWRNb2RlbHMiLCJsb2FkVHlwZXMiLCJsb2FkV29ya2Zsb3dzIiwiU3luY2VyIiwiYXBpcyIsInR5cGVzIiwibW9kZWxzIiwid29ya2Zsb3dzIiwiTWFwIiwiaXNTeW5jaW5nIiwiZXZlbnRFbWl0dGVyIiwic3luYyIsInRhcmdldHMiLCJjb25maWciLCJjb3B5U2hhcmVkVG9UYXJnZXRzIiwiY2hhbmdlZEZpbGVzIiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsImJsYWNrIiwiYmdHcmVlbiIsImRvU3luY0FjdGlvbnMiLCJ3aGVuVGhpc0hhcHBlbnMiLCJ3YWl0Rm9yVXBUbyIsInN5bmNGcm9tV2F0Y2hlciIsImV2ZW50IiwiZGlmZkZpbGVQYXRoIiwiaW52YWxpZGF0ZWRQYXRocyIsImludmFsaWRhdGVGaWxlIiwiYm9sZCIsImludmFsaWRhdGVkUGF0aCIsInJlbW92ZWRBcGlzIiwicmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyIsImJsdWUiLCJyZWxhdGl2ZSIsImFwaVJvb3RQYXRoIiwiZ3JheSIsImUiLCJlcnJvciIsInJlZCIsImlzSW5DaGVja1BhdHRlcm5Hcm91cCIsIk9iamVjdCIsInZhbHVlcyIsInNvbWUiLCJwYXR0ZXJuIiwiYXV0b2xvYWRUeXBlcyIsImF1dG9sb2FkTW9kZWxzIiwiYXV0b2xvYWRBcGlzIiwiYXV0b2xvYWRXb3JrZmxvd3MiLCJlbWl0IiwiZW5kc1dpdGgiLCJlbnRpdHlJZCIsImdldEVudGl0eUlkRnJvbVBhdGgiLCJ0b1JlbW92ZSIsImZpbHRlciIsImFwaSIsIm1vZGVsTmFtZSIsInNwbGljZSIsImluZGV4T2YiLCJjb252ZXJ0TWFwIiwiYmFzZVVybCIsInNlcnZlciIsImxpc3RlbiIsImhvc3QiLCJwb3J0IiwidGFyZ2V0Iiwic3JjUGF0aCIsImpvaW4iLCJyZXBsYWNlIiwiYXBwUm9vdFBhdGgiLCJFcnJvciIsImZ1bGxUZXh0IiwiY29udmVydGVkVGV4dCIsImVudHJpZXMiLCJyZWR1Y2UiLCJhY2MiLCJrZXkiLCJ2YWx1ZSIsImRlc3RQYXRoIiwicmVjdXJzaXZlIiwid2FybiIsImRhdGEiLCJzeW5jaHJvbml6ZSIsImRpZmZGaWxlUGF0aHMiLCJkaWZmR3JvdXBzIiwiY2FsY3VsYXRlRGlmZkdyb3VwcyIsImRpZmZUeXBlcyIsImtleXMiLCJpbmNsdWRlcyIsImhhbmRsZUVudGl0eUNoYW5nZSIsImhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZSIsImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZSIsImFjdGlvblN5bmNDb25maWciLCJkaWZmRmlsZXMiLCJyIiwibWF0Y2hlZCIsIm1hdGNoIiwidCIsInJlbG9hZCIsImVudGl0eSIsImdldCIsInR5cGVGaWxlUGF0aCIsIm5hbWVzIiwiZnMiLCJwYXJlbnRJZCIsInVuZGVmaW5lZCIsImFjdGlvbkdlbmVyYXRlU2NoZW1hcyIsImdlbmVyYXRlZCIsInB1c2giLCJ0c1BhdGhzIiwiZnVuY3Rpb25zIiwiYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzIiwibWVyZ2VkR3JvdXAiLCJtb2RlbCIsImZyYW1lIiwicGFyYW1zIiwibWFwIiwibW9kZWxQYXRoIiwibmFtZXNSZWNvcmQiLCJnZXROYW1lc0Zyb21JZCIsImZyYW1lTmFtZSIsImZyYW1lSWQiLCJjYW1lbGl6ZSIsImFjdGlvbkdlbmVyYXRlU2VydmljZXMiLCJhY3Rpb25HZW5lcmF0ZUh0dHBzIiwiY29udGVudCIsIlByb21pc2UiLCJhbGwiLCJwYXJhbXNBcnJheSIsInNlcnZpY2VzRmlsZSIsIm92ZXJ3cml0ZSIsImZsYXQiLCJyZXMiLCJkaXIiLCJhcGlEaXIiLCJyZWFsU3JjIiwiZHN0IiwiY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZCIsImZyb21QYXRoIiwidG9QYXRoIiwib2xkRmlsZUNvbnRlbnQiLCJ0b1N0cmluZyIsIm5ld0ZpbGVDb250ZW50Iiwic2VydmljZXNEaXIiLCJmaWxlRGlyIiwicmVsYXRpdmVQYXRoIiwic2hhcmVkUGF0aCIsIm5mYyIsImNoZWNrRXhpc3RzR2VuQ29kZSIsInRlbXBsYXRlS2V5IiwiZW51bUlkIiwiZ2VuUGF0aCIsImdldFRhcmdldEFuZFBhdGgiLCJzdWJQYXRoIiwiZnVsbFBhdGgiLCJpc0V4aXN0cyIsImNoZWNrRXhpc3RzIiwiZW51bXMiLCJvcHRpb25zIiwiZW51bXNLZXlzIiwibmFtZSIsImNvbnN0YW50IiwicmVzdWx0IiwidHBsIiwic3RhcnRzV2l0aCIsImNvbXBvbmVudElkIiwicCIsImZvcm0iLCJ0ZW1wbGF0ZU9wdGlvbnMiLCJfZ2VuZXJhdGVPcHRpb25zIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxHQUFHLFFBQVEsdUJBQXVCO0FBQzNDLE9BQU9DLFlBQVksU0FBUztBQUM1QixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBU0MsWUFBWSxRQUFRLFNBQVM7QUFDdEMsU0FBU0MsS0FBSyxFQUFFQyxRQUFRLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUN6RCxPQUFPQyxnQkFBZ0IsYUFBYTtBQUNwQyxTQUFTQyxTQUFTLFFBQVEsWUFBWTtBQUN0QyxPQUFPQyxRQUFRQyxPQUFPLFFBQVEsT0FBTztBQUNyQyxTQUFTQyxLQUFLLEVBQUVDLE1BQU0sUUFBUSxVQUFVO0FBR3hDLFNBQVNDLGNBQWMsUUFBUSx1QkFBb0I7QUFDbkQsU0FBU0MsTUFBTSxRQUFRLG1CQUFnQjtBQUN2QyxTQUFTQyxhQUFhLFFBQWdDLDhCQUEyQjtBQUNqRixTQUFTQyxLQUFLLFFBQVEsb0JBQWlCO0FBQ3ZDLFNBQVNDLGVBQWUsUUFBUSxrQ0FBK0I7QUFFL0QsU0FBU0MsV0FBVyxRQUE4QixvQkFBaUI7QUFDbkUsU0FBU0MsUUFBUSxFQUFFQyxXQUFXLFFBQVEsMEJBQXVCO0FBQzdELFNBQVNDLFVBQVUsUUFBUSwyQkFBd0I7QUFDbkQsU0FBU0MsTUFBTSxRQUFRLHlCQUFzQjtB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
515
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCBwYXRoLCB7IGRpcm5hbWUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tIFwiLi5cIjtcbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IEFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24gfSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVPcHRpb25zLCBQYXRoQW5kQ29kZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGVLZXksIHR5cGUgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBtYXBBc3luYywgcmVkdWNlQXN5bmMgfSBmcm9tIFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIjtcbmltcG9ydCB7IGNlbnRlclRleHQgfSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBpc1Rlc3QgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW5XaXRoR3JhY2VmdWxTaHV0ZG93biB9IGZyb20gXCIuLi91dGlscy9wcm9jZXNzLXV0aWxzXCI7XG5pbXBvcnQgeyBhcmVGaWxlc1NhbWUsIGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcywgcmVuZXdDaGVja3N1bXMgfSBmcm9tIFwiLi9jaGVja3N1bVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSwgcmVuZGVyVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlRW50aXR5LCBkZWxFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHktb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBGaWxlVHlwZSwgZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCB9IGZyb20gXCIuL2ZpbGUtcGF0dGVybnNcIjtcbmltcG9ydCB7XG4gIHR5cGUgTG9hZGVkQXBpcyxcbiAgdHlwZSBMb2FkZWRNb2RlbHMsXG4gIHR5cGUgTG9hZGVkVHlwZXMsXG4gIGxvYWRBcGlzLFxuICBsb2FkTW9kZWxzLFxuICBsb2FkVHlwZXMsXG4gIGxvYWRXb3JrZmxvd3MsXG59IGZyb20gXCIuL21vZHVsZS1sb2FkZXJcIjtcblxudHlwZSBEaWZmR3JvdXBzID0ge1xuICBba2V5IGluIEZpbGVUeXBlXTogQWJzb2x1dGVQYXRoW107XG59O1xuXG5leHBvcnQgY2xhc3MgU3luY2VyIHtcbiAgYXBpczogTG9hZGVkQXBpcyA9IFtdO1xuICB0eXBlczogTG9hZGVkVHlwZXMgPSB7fTtcbiAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcbiAgd29ya2Zsb3dzOiBNYXA8c3RyaW5nLCBXb3JrZmxvd01ldGFkYXRhW10+ID0gbmV3IE1hcCgpO1xuICBpc1N5bmNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIOyytO2BrOyErOydtCDrs4Dqsr3rkJwg67aA67aE7JeQIOuMgO2VtCDsi7Htgazrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKiDri6Trp4wgc29uYW11LnNoYXJlZC50c+uKlCDssrTtgazshKwg67mE6rWQIOyXhuydtCDrrLTsobDqsbQg7Iux7YGsKOuzteyCrCntlanri4jri6QuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuXG4gICAgLy8gc29uYW11LnNoYXJlZC50c+uKlCDrrLTsobDqsbQg7Iux7YGsKOuzteyCrCntlanri4jri6QuXG4gICAgYXdhaXQgdGhpcy5jb3B5U2hhcmVkVG9UYXJnZXRzKHRhcmdldHMpO1xuXG4gICAgLy8g6re4IOuLpOydjOu2gO2EsOuKlCDrs4Dqsr3rkJwg7YyM7J287J2EIOywvuyVhOyEnCDrj5nquLDtmZQg7J6R7JeF7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICBjb25zdCBjaGFuZ2VkRmlsZXMgPSBhd2FpdCBmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMoKTtcbiAgICBpZiAoY2hhbmdlZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KFwiQWxsIGZpbGVzIGFyZSBzeW5jZWQhXCIpKSk7XG5cbiAgICAgIC8vIOuzgOqyveyCrO2VreydtCDsl4bslrTrj4QgU1NSIO2FnO2UjOumv+ydgCDsg53shLEgKOy0iOq4sCDshKTsoJUg7IucLCDsnbTrr7gg7KG07J6s7ZWY66m0IOyKpO2CtSlcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXCJxdWVyaWVzXCIsIHt9LCB7IG92ZXJ3cml0ZTogZmFsc2UgfSk7XG4gICAgICAgIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXCJlbnRyeV9zZXJ2ZXJcIiwge30sIHsgb3ZlcndyaXRlOiBmYWxzZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8g7YyM7J287J20IOydtOuvuCDsobTsnqztlZjrqbQg66y07IucXG4gICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBBbHJlYWR5UHJvY2Vzc2VkRXhjZXB0aW9uKSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZ2VuZXJhdGUgU1NSIHRlbXBsYXRlczpcIiwgZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOunjOyVvSDsi7Htgawg7KSR7JeQIO2UhOuhnOyEuOyKpOqwgCDso73snLzrqbQg6rys7Jes67KE66as6riwIOuVjOusuOyXkCxcbiAgICAvLyDsi5zqt7jrhJDsl5Drj4Qg7J6g7IucIOuyhO2LuCDsiJgg7J6I64qUIO2ZmOqyvSDsho3sl5DshJwg7Iux7YGs66W8IOyLpO2Wie2VqeuLiOuLpC5cbiAgICBhd2FpdCBydW5XaXRoR3JhY2VmdWxTaHV0ZG93bihcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8g7JaY6rCAIOyLse2BrCDsnpHsl4Ug7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICAgICAgYXdhaXQgdGhpcy5kb1N5bmNBY3Rpb25zKGNoYW5nZWRGaWxlcyk7XG5cbiAgICAgICAgLy8g7Iux7YGsIOyVoeyFmOydtCDrgZ3rgpjrqbQg7ZWt7IOBIOyytO2BrOyErOydhCDri6Tsi5wg6rCx7Iug7ZWp64uI64ukLlxuICAgICAgICBhd2FpdCByZW5ld0NoZWNrc3VtcygpO1xuICAgICAgfSxcbiAgICAgIHsgd2hlblRoaXNIYXBwZW5zOiBcIlNJR1VTUjJcIiwgd2FpdEZvclVwVG86IDIwMDAwIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaGVy6rCAIOqwkOyngO2VnCDtjIzsnbwg67OA6rK9IOyCrO2VreyXkCDrjIDtlbQg7Iux7YGs66W8IOynhO2Wie2VqeuLiOuLpC5cbiAgICog7KO87Ja07KeEIOuzgOqyvSDtjIzsnbzrk6Qg7KSRIOyytO2BrOyErCDqtIDrpqwg64yA7IOB7J24IOqyg+uTpOunjCDqsIDsoLjri6TqsIAg7Iux7YGs66W8IOynhO2Wie2VqeuLiOuLpC5cbiAgICog7LK07YGs7ISsIO2MjOydvCDsl4XrjbDsnbTtirjripQg7Jes6riw7JeQ7IScIO2VmOyngCDslYrsirXri4jri6QuIO2YuOy2nOyekOqwgCDtlanri4jri6QuXG4gICAqIEBwYXJhbSBkaWZmRmlsZVBhdGggLSDrs4Dqsr0g7YyM7J2865OkLiDtlITroZzsoJ3tirgg66Oo7Yq467aA7YSwIFwic3JjL1wiIOuYkOuKlCBcImRpc3QvXCLroZwg7Iuc7J6R7ZWY64qUIOyDgeuMgCDqsr3roZzsnoXri4jri6QuIOyYiOyLnDogXCJzcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJcbiAgICovXG4gIGFzeW5jIHN5bmNGcm9tV2F0Y2hlcihldmVudDogc3RyaW5nLCBkaWZmRmlsZVBhdGg6IEFic29sdXRlUGF0aCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChldmVudCAhPT0gXCJjaGFuZ2VcIiAmJiBldmVudCAhPT0gXCJhZGRcIiAmJiBldmVudCAhPT0gXCJ1bmxpbmtcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNTUiDshKTsoJUg7YyM7J28IOuzgOqyvSDqsJDsp4BcbiAgICBpZiAoZGlmZkZpbGVQYXRoLmluY2x1ZGVzKFwiL3NyYy9zc3IvXCIpKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkLnllbGxvdyhcIlNTUiBjb25maWcgY2hhbmdlZCAtIHJlbG9hZGluZy4uLlwiKSk7XG4gICAgICAvLyBTU1Ig7YyM7J2864+EIGludmFsaWRhdGUg7ZuEIHJlbG9hZFxuICAgICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgICBhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoZGlmZkZpbGVQYXRoLCBldmVudCk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmF1dG9sb2FkU1NSUm91dGVzKCk7XG4gICAgICB0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwib25ITVJDb21wbGV0ZWRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7J2864uoIOuzgOqyveuQnCDtjIzsnbzqs7wgZGVwZW5kZW50IO2MjOydvOuTpOydhCBpbnZhbGlkYXRlIO2VqeuLiOuLpC5cbiAgICAvLyDtlZwg67KIIOydtOyDgSBpbXBvcnTrkJwg7Lmc6rWs65Ok7JeQIOuMgO2VtOyEnOunjCDsi6TsoJwg7J6R7JeF7J20IOydvOyWtOuCqeuLiOuLpC5cbiAgICAvLyDqt7jrn6zri4gg7JWI7Ius7ZWY6rOgIGludmFsaWRhdGUg7ZW064+EIOuQqeuLiOuLpC5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIGhvdC5pbnZhbGlkYXRlRmlsZeyLnCDstIjquLAg7JeQ65+s6rCAIOuwnOyDne2VmOq4sCDrlYzrrLjsl5AgaW52YWxpZGF0ZSDtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgIGNvbnN0IGludmFsaWRhdGVkUGF0aHMgPSAoYXdhaXQgaG90LmludmFsaWRhdGVGaWxlKGRpZmZGaWxlUGF0aCwgZXZlbnQpKSBhcyBBYnNvbHV0ZVBhdGhbXTtcblxuICAgICAgaWYgKGludmFsaWRhdGVkUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGDwn5SEIEludmFsaWRhdGVkOmApKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGludmFsaWRhdGVkUGF0aCBvZiBpbnZhbGlkYXRlZFBhdGhzKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIOunjOyVvSBtb2RlbC50cyDtjIzsnbzsnbQg67OA6rK9KGludmFsaWRhdGUp65CY7JeI64ukPyDqt7jrn6zrqbQgcmVnaXN0ZXJlZEFwaXMg7KSR7JeQ7IScIOydtCDrqqjrjbjsl5Ag7ZW064u57ZWY64qUIGFwaeuTpOydgCDsp4Dsm4zspJjsmpQuXG4gICAgICAgICAgICAvLyByZWdpc3RlcmVkQXBpc+uKlCDthrXsnLzroZwg64ukIOuCoOugpOuyhOumtCDsiJgg7JeG7Iq164uI64ukLiByZWdpc3RlcmVkQXBpc+yXkCDsmKzrnbzsmKTripQg7Lmc6rWs65Ok7J2AIOy0iOq4sCDroZzrk5zsi5wg65iQ64qUIEhNUuyLnOyXkOunjCDrk7HroZ3rkJjquLAg65WM66y47J6F64uI64ukLlxuICAgICAgICAgICAgLy8g65Sw65287IScIG1vZGVsLnRzIO2MjOydvOydmCDrs4Dqsr3snLzroZwg64uk7J2M67KIIOyDiOuhnOyatCBldmFs7J20IOyYiOyDgeuQmOuKlCDsnbQg7Iuc7KCQ7JeQ7ISc66eMLCDsnbQg66qo64247JeQ7IScIOuCmOyYqCByZWdpc3RlcmVkQXBpc+uTpOydhCDsp4Dsm4zspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZWRBcGlzID0gdGhpcy5yZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzKGludmFsaWRhdGVkUGF0aCk7XG4gICAgICAgICAgICBpZiAocmVtb3ZlZEFwaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBjaGFsay5ibHVlKGAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGludmFsaWRhdGVkUGF0aCl9YCksXG4gICAgICAgICAgICAgICAgY2hhbGsuZ3JheShgKHdpdGggJHtyZW1vdmVkQXBpcy5sZW5ndGh9IEFQSXMpYCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGludmFsaWRhdGVkUGF0aCl9YCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBjaGFsay5yZWQoYEZhaWxlZCB0byByZW1vdmUgaW52YWxpZGF0ZWQgcmVnaXN0ZXJlZCBBUElzIGZvciAke2ludmFsaWRhdGVkUGF0aH1gKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNJbkNoZWNrUGF0dGVybkdyb3VwID0gT2JqZWN0LnZhbHVlcyhnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCkpLnNvbWUoXG4gICAgICAocGF0dGVybikgPT4gbWluaW1hdGNoKGRpZmZGaWxlUGF0aCwgcGF0dGVybiksXG4gICAgKTtcblxuICAgIC8vIO2VoCDsnbwoc3luYynsnbQg7J6I7Jy866m0IO2VqeuLiOuLpC5cbiAgICBpZiAoaXNJbkNoZWNrUGF0dGVybkdyb3VwKSB7XG4gICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoW2RpZmZGaWxlUGF0aF0pO1xuICAgIH1cblxuICAgIC8vIOyLse2BrCDsnpHsl4XsnbQg64Gd64KY66m0IOuqqOuToCDrqqjrk4jsnYQg66Gc65Oc7ZWp64uI64ukLlxuICAgIC8vIGhtci1ob29r7JeQIOydmO2VtCBpbnZhbGlkYXRl65CcIOu2gOu2hOuTpOydtCDslYTri4jrnbzrqbQg7LqQ7IucIOq3uOuMgOuhnCDsnKDsp4Dtlanri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFdvcmtmbG93cygpO1xuXG4gICAgdGhpcy5ldmVudEVtaXR0ZXIuZW1pdChcIm9uSE1SQ29tcGxldGVkXCIpO1xuICB9XG5cbiAgcmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhcbiAgICBpbnZhbGlkYXRlZFBhdGg6IEFic29sdXRlUGF0aCxcbiAgKTogKHR5cGVvZiByZWdpc3RlcmVkQXBpcylbbnVtYmVyXVtdIHtcbiAgICBpZiAoIWludmFsaWRhdGVkUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiIC8q7IaM7IqkIOy9lOuTnOulvCDri6Tro6jripQg7IOB7Zmp7J2064uIIC50cyDqsr3roZzroZwg67SF64uI64ukLiovKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGludmFsaWRhdGVkUGF0aCk7XG4gICAgY29uc3QgdG9SZW1vdmUgPSByZWdpc3RlcmVkQXBpcy5maWx0ZXIoKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gYCR7ZW50aXR5SWR9TW9kZWxgKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiB0b1JlbW92ZSkge1xuICAgICAgcmVnaXN0ZXJlZEFwaXMuc3BsaWNlKHJlZ2lzdGVyZWRBcGlzLmluZGV4T2YoYXBpKSwgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvUmVtb3ZlO1xuICB9XG5cbiAgYXN5bmMgY29weVNoYXJlZFRvVGFyZ2V0cyh0YXJnZXRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIO2KueyglSDrs4DsiJgg7LmY7ZmY7J2EIOychO2VtOyEnCDsgqzsmqntlanri4jri6QuXG4gICAgY29uc3QgY29udmVydE1hcCA9IHtcbiAgICAgIGJhc2VVcmw6XG4gICAgICAgIFNvbmFtdS5jb25maWcuc2VydmVyLmJhc2VVcmwgPz9cbiAgICAgICAgYGh0dHA6Ly8ke1NvbmFtdS5jb25maWcuc2VydmVyLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwifToke1NvbmFtdS5jb25maWcuc2VydmVyLmxpc3Rlbj8ucG9ydCA/PyAzMDAwfWAsXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIC8vIOyngOq4iCDqsIDsoLjqsIDroKTripQg7J20IO2MjOydvOydgCBTb25hbXUg7L2U65Oc67Kg7J207Iqk7J2YIOydvOu2gOyeheuLiOuLpC5cbiAgICAgIC8vIOq3uOufsOuNsCBkaXN0IOyGjSDruYzrk5zrkJwg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnbQg7ZWE7JqU7ZWcIOqyg+ydtCDslYTri4jqs6AsIHNyY+yXkOunjCDsnojripQg7YWN7Iqk7Yq4IO2MjOydvOydtCDtlYTsmpTtlanri4jri6QuXG4gICAgICAvLyDrlLDrnbzshJwgL3NyYy/sl5DshJwg7LC+7Iq164uI64ukLlxuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgICAgIGAuLi9zaGFyZWQvJHt0YXJnZXR9LnNoYXJlZC50cy50eHRgLFxuICAgICAgKTtcbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNQYXRoKSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0KSkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVHJpZWQgdG8gY29weSBzb25hbXUuc2hhcmVkLnRzIHRvIHRhcmdldCAnJHt0YXJnZXR9JyBidXQgdGhlIHRhcmdldCBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIFBsZWFzZSBjaGVjayB5b3VyIHByb2plY3QgZGlyZWN0b3J5IHN0cnVjdHVyZS5gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmdWxsVGV4dCA9IGF3YWl0IHJlYWRGaWxlKHNyY1BhdGgsIFwidXRmLThcIik7XG4gICAgICBjb25zdCBjb252ZXJ0ZWRUZXh0ID0gT2JqZWN0LmVudHJpZXMoY29udmVydE1hcCkucmVkdWNlKFxuICAgICAgICAoYWNjLCBba2V5LCB2YWx1ZV0pID0+IGFjYy5yZXBsYWNlKGAkW1ske2tleX1dXWAsIHZhbHVlKSxcbiAgICAgICAgZnVsbFRleHQsXG4gICAgICApO1xuXG4gICAgICAvLyDsnbTqsbQg7ZSE66Gc7KCd7Yq47JeQIC50cyDshozsiqQg7L2U65OcIO2MjOydvOydhCDsg53shLHtlZjripQg6rKD7J2066+A66GcIHNyY+ydmCAudHMg6rK966Gc66GcIOqwkeuLiOuLpC5cbiAgICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcInNyYy9zZXJ2aWNlcy9zb25hbXUuc2hhcmVkLnRzXCIpO1xuXG4gICAgICAvLyDsoJXrp5Ag7Zi57Iuc64KY7KeA66eMIHRhcmdldCDrlJTroInthqDrpqzripQg7J6I7Ja064+EIHNyYy9zZXJ2aWNlcyDrlJTroInthqDrpqzripQg7JeG7J2EIOyImCDsnojsnLzrr4DroZwg66+466asIOyDneyEse2VtOykjeuLiOuLpC5cbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhwYXRoLmRpcm5hbWUoZGVzdFBhdGgpKSkpIHtcbiAgICAgICAgYXdhaXQgbWtkaXIocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUud2FybihgQ3JlYXRlZCBkaXJlY3RvcnkgJyR7cGF0aC5kaXJuYW1lKGRlc3RQYXRoKX0nIGJlY2F1c2UgaXQgZGlkIG5vdCBleGlzdC5gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IGFyZUZpbGVzU2FtZSh7IGRhdGE6IGNvbnZlcnRlZFRleHQgfSwgeyBwYXRoOiBkZXN0UGF0aCB9KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgd3JpdGVGaWxlKGRlc3RQYXRoLCBjb252ZXJ0ZWRUZXh0KTtcbiAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5ibHVlKHBhdGgucmVsYXRpdmUoU29uYW11LmFwcFJvb3RQYXRoLCBkZXN0UGF0aCkpLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkVHlwZXMoKSB7XG4gICAgdGhpcy50eXBlcyA9IGF3YWl0IGxvYWRUeXBlcygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRNb2RlbHMoKSB7XG4gICAgdGhpcy5tb2RlbHMgPSBhd2FpdCBsb2FkTW9kZWxzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZEFwaXMoKSB7XG4gICAgdGhpcy5hcGlzID0gYXdhaXQgbG9hZEFwaXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkV29ya2Zsb3dzKCkge1xuICAgIHRoaXMud29ya2Zsb3dzID0gYXdhaXQgbG9hZFdvcmtmbG93cygpO1xuICAgIGF3YWl0IFNvbmFtdS53b3JrZmxvd3Muc3luY2hyb25pemUodGhpcy53b3JrZmxvd3MpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRTU1JSb3V0ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3NyQ29uZmlnUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjL3NzclwiKTtcblxuICAgIC8vIOq4sOyhtCByb3V0ZXMg7LSI6riw7ZmUXG4gICAgY29uc3QgeyBjbGVhclNTUlJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyXCIpO1xuICAgIGNsZWFyU1NSUm91dGVzKCk7XG5cbiAgICAvLyBzc3Ig7Y+0642UIOyXhuycvOuptCDsiqTtgrVcbiAgICBpZiAoIShhd2FpdCBleGlzdHMoc3NyQ29uZmlnUGF0aCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc3NyIO2PtOuNlCDslYjsnZgg66qo65OgIC50cyDtjIzsnbwg66Gc65OcXG4gICAgY29uc3QgeyBnbG9iQXN5bmMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2FzeW5jLXV0aWxzXCIpO1xuICAgIGNvbnN0IHsgaW1wb3J0TWVtYmVycyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvZXNtLXV0aWxzXCIpO1xuICAgIGNvbnN0IHsgcnVudGltZVBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIik7XG5cbiAgICAvLyBydW50aW1lUGF0aOulvCDsgqzsmqntlZjsl6wg6rCc67CcL+2UhOuhnOuNleyFmCDtmZjqsr3sl5Ag66ee64qUIO2ZleyepeyekCDsspjrpqxcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGdsb2JBc3luYyhwYXRoLmpvaW4oc3NyQ29uZmlnUGF0aCwgcnVudGltZVBhdGgoXCIqKi8qLnRzXCIpKSk7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGltcG9ydE1lbWJlcnPrpbwg7IKs7Jqp7ZWY66m0IO2MjOydvOydmCBzaWRlIGVmZmVjdChyZWdpc3RlclNTUiDtmLjstpwp6rCAIOyLpO2WieuQqFxuICAgICAgICBhd2FpdCBpbXBvcnRNZW1iZXJzKGZpbGUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCBTU1Igcm91dGU6ICR7ZmlsZX1gLCBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog7Iuk7KCcIOyLse2BrOulvCDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgKiDrs4Dqsr3rkJwg7YyM7J2865Ok7J2EIO2DgOyeheuzhOuhnCDrtoTrpZjtlZjqs6Ag6rCBIO2DgOyeheyXkCDrp57ripQg7JWh7IWY7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aHMgLSDrs4Dqsr3rkJwg7YyM7J2865Ok7J2YIOygiOuMgCDqsr3roZwg66qp66GdXG4gICAqIEByZXR1cm5zIGRpZmZUeXBlcyAtIOuzgOqyveuQnCDtjIzsnbzsnZgg7YOA7J6FIOuqqeuhnSAoZW50aXR5LCB0eXBlcywgbW9kZWwg65OxKVxuICAgKi9cbiAgYXN5bmMgZG9TeW5jQWN0aW9ucyhkaWZmRmlsZVBhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8eyBkaWZmVHlwZXM6IHN0cmluZ1tdIH0+IHtcbiAgICBjb25zdCBkaWZmR3JvdXBzID0gdGhpcy5jYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlUGF0aHMpO1xuICAgIGNvbnN0IGRpZmZUeXBlcyA9IE9iamVjdC5rZXlzKGRpZmZHcm91cHMpO1xuXG4gICAgLy8g7Yq466as6rGwOiBlbnRpdHksIHR5cGVzXG4gICAgLy8g7JWh7IWYOiDsiqTtgqTrp4gg7IOd7ISxXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcImVudGl0eVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFbnRpdHlDaGFuZ2UoZGlmZkdyb3VwcywgZGlmZlR5cGVzKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IHR5cGVzLCBlbnVtcywgZ2VuZXJhdGVkIOuzgOqyveyLnFxuICAgIC8vIOyVoeyFmDog7YyM7J28IOyLse2BrCB0eXBlcywgZW51bXMsIGdlbmVyYXRlZFxuICAgIGlmIChcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcInR5cGVzXCIpIHx8XG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJmdW5jdGlvbnNcIikgfHxcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcImdlbmVyYXRlZFwiKVxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2UoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiBtb2RlbFxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJtb2RlbFwiKSB8fCBkaWZmVHlwZXMuaW5jbHVkZXMoXCJmcmFtZVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2UoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiBjb25maWdcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwiY29uZmlnXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmFjdGlvblN5bmNDb25maWcoKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IHdvcmtmbG93XG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcIndvcmtmbG93XCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpZmZUeXBlcyxcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZXM6IEFic29sdXRlUGF0aFtdKTogRGlmZkdyb3VwcyB7XG4gICAgcmV0dXJuIGdyb3VwKGRpZmZGaWxlcywgKHIpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZWQgPSByLm1hdGNoKC9cXC4obW9kZWx8dHlwZXN8ZnVuY3Rpb25zfGVudGl0eXxnZW5lcmF0ZWR8ZnJhbWV8Y29uZmlnKVxcLlt0al1zLyk7XG4gICAgICByZXR1cm4gbWF0Y2hlZD8uWzFdID8/IFwidW5rbm93blwiO1xuICAgIH0pIGFzIHVua25vd24gYXMgRGlmZkdyb3VwcztcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUVudGl0eUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzLCBkaWZmVHlwZXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUVudGl0eUNoYW5nZVwiLCB7IGRpZmZHcm91cHMsIGRpZmZUeXBlcyB9KTtcblxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAvLyB0eXBlcyDsg53shLEoZW50aXR5IOyDiOuhnCDstpTqsIDrkJwg6rK97JqwKVxuICAgIC8vIHBhcmVudElk6rCAIOyXhuqzoCwgdHlwZXPqsIAg7JeG64qUIOqyveyasOyXkOunjCDsg53shLFcbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChkaWZmR3JvdXBzLmVudGl0eT8uWzBdKTtcblxuICAgIGlmIChlbnRpdHlJZCkge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgLy8g7ZSE66Gc7KCd7Yq47JeQIOyDneyEseuQmOyWtOyVvCDtlZjripQgLnRzIO2MjOydvOydmCDqsr3roZzsnoXri4jri6QuXG4gICAgICBjb25zdCB0eXBlRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke2VudGl0eS5uYW1lcy5mc30vJHtlbnRpdHkubmFtZXMuZnN9LnR5cGVzLnRzYCxcbiAgICAgICk7XG4gICAgICBpZiAoZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgIShhd2FpdCBleGlzdHModHlwZUZpbGVQYXRoKSkpIHtcbiAgICAgICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcImluaXRfdHlwZXNcIiwgeyBlbnRpdHlJZCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2NoZW1hcygpO1xuXG4gICAgZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPSB1bmlxdWUoW1xuICAgICAgLi4uKGRpZmZHcm91cHMuZ2VuZXJhdGVkID8/IFtdKSxcbiAgICAgIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjL2FwcGxpY2F0aW9uL3NvbmFtdS5nZW5lcmF0ZWQudHNcIikgYXMgQWJzb2x1dGVQYXRoLFxuICAgIF0pO1xuICAgIGRpZmZUeXBlcy5wdXNoKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPEZpbGVUeXBlW10+IHtcbiAgICBjb25zdCB0c1BhdGhzID0gdW5pcXVlKFtcbiAgICAgIC4uLihkaWZmR3JvdXBzLnR5cGVzID8/IFtdKSxcbiAgICAgIC4uLihkaWZmR3JvdXBzLmZ1bmN0aW9ucyA/PyBbXSksXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPz8gW10pLFxuICAgIF0pO1xuICAgIE5haXRlLnQoXCJoYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzIH0pO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIHR5cGVzL2Z1bmN0aW9ucy9nZW5lcmF0ZWQgY2hhbmdlczogJHt0c1BhdGhzLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHApKS5qb2luKFwiLCBcIil9YFxuICAgIC8vICAgKVxuICAgIC8vICk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzKTtcblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZVwiLCB7IGRpZmZHcm91cHMgfSk7XG4gICAgY29uc3QgbWVyZ2VkR3JvdXAgPSBbLi4uKGRpZmZHcm91cHMubW9kZWwgPz8gW10pLCAuLi4oZGlmZkdyb3Vwcy5mcmFtZSA/PyBbXSldO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIG1vZGVsL2ZyYW1lIGNoYW5nZXM6ICR7bWVyZ2VkR3JvdXAubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgcCkpLmpvaW4oXCIsIFwiKX1gXG4gICAgLy8gICApXG4gICAgLy8gKTtcblxuICAgIC8vIGdlbmVyYXRlZF9odHRwLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci50eXBlc+ulvCDslIHri4jri6QuXG4gICAgLy8gc2VydmljZS50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIuYXBpc+ulvCDslIHri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICBjb25zdCBwYXJhbXM6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10gPSBtZXJnZWRHcm91cC5tYXAoKG1vZGVsUGF0aCkgPT4ge1xuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiKSkge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChtb2RlbFBhdGgpO1xuICAgICAgICBhc3NlcnQoZW50aXR5SWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlbFBhdGguZW5kc1dpdGgoXCIuZnJhbWUudHNcIikpIHtcbiAgICAgICAgY29uc3QgWywgZnJhbWVOYW1lXSA9IG1vZGVsUGF0aC5tYXRjaCgvLitcXC8oLispXFwuZnJhbWVcXC50cyQvKSA/PyBbXTtcbiAgICAgICAgYXNzZXJ0KGZyYW1lTmFtZSk7XG4gICAgICAgIC8vIGZyYW1lTmFtZeydhCBQYXNjYWxDYXNl66GcIOuzgO2ZmCAoZGFzaGJvYXJkIC0+IERhc2hib2FyZClcbiAgICAgICAgY29uc3QgZnJhbWVJZCA9IGluZmxlY3Rpb24uY2FtZWxpemUoZnJhbWVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChmcmFtZUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCByZWFjaGFibGVcIik7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2VydmljZXMocGFyYW1zKTtcbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlSHR0cHMoKTtcblxuICAgIC8vIHF1ZXJpZXMuZ2VuZXJhdGVkLnRzIOuwjyBlbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLnRzeCDsnqzsg53shLFcbiAgICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwicXVlcmllc1wiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcImVudHJ5X3NlcnZlclwiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gIH1cblxuICAvLyB3ZWIvLnNvbmFtdS5lbnYg7JeQIO2YhOyerCDshKTsoJXqsJIg7KCA7J6lXG4gIGFzeW5jIGFjdGlvblN5bmNDb25maWcoKSB7XG4gICAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSBTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4gPz8ge307XG4gICAgY29uc3QgY29udGVudCA9IGBBUElfSE9TVD0ke2hvc3QgPz8gXCJsb2NhbGhvc3RcIn1cXG5BUElfUE9SVD0ke3BvcnQgPz8gMzAwMH1gO1xuXG4gICAgTmFpdGUudChcImFjdGlvblN5bmNDb25maWdcIiwgeyBjb250ZW50IH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHMubWFwKGFzeW5jICh0YXJnZXQpID0+IHtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCIuc29uYW11LmVudlwiKSwgY29udGVudCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIHNlcnZpY2VzLmdlbmVyYXRlZC50c+ulvCDsg53shLHtlanri4jri6QuXG4gICAqIEBwYXJhbSBwYXJhbXNBcnJheVxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKFxuICAgIHBhcmFtc0FycmF5OiB7XG4gICAgICBuYW1lc1JlY29yZDogRW50aXR5TmFtZXNSZWNvcmQ7XG4gICAgfVtdLFxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgTmFpdGUudChcImFjdGlvbkdlbmVyYXRlU2VydmljZXNcIiwgcGFyYW1zQXJyYXkpO1xuXG4gICAgLy8gc2VydmljZXMuZ2VuZXJhdGVkLnRzIO2Gte2VqSDtjIzsnbwg7IOd7ISxXG4gICAgY29uc3Qgc2VydmljZXNGaWxlID0gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICAgIFwic2VydmljZXNcIixcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gWy4uLnNlcnZpY2VzRmlsZV07XG4gIH1cblxuICAvKipcbiAgICogc29uYW11LmdlbmVyYXRlZC50c+yZgCBzb25hbXUuZ2VuZXJhdGVkLnNzby50c+ulvCDsg53shLHtlanri4jri6QuXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlU2NoZW1hcygpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgZ2VuZXJhdGVUZW1wbGF0ZShcImdlbmVyYXRlZF9zc29cIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KSxcbiAgICAgIF0pXG4gICAgKVxuICAgICAgLmZsYXQoKVxuICAgICAgLmZsYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUuZ2VuZXJhdGVkLmh0dHDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlSHR0cHMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGg+IHtcbiAgICBjb25zdCBbcmVzXSA9IGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXG4gICAgICBcImdlbmVyYXRlZF9odHRwXCIsXG4gICAgICB7IGVudGl0eUlkOiBcImR1bW15XCIgfSxcbiAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH0sXG4gICAgKTtcbiAgICBhc3NlcnQocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqICoudHlwZXMudHMsICouZnVuY3Rpb25zLnRzLCAqLmdlbmVyYXRlZC50c+ulvCDtg4Dqsp8g65SU66CJ7Yag66as7JeQIOuzteyCrO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIHRzUGF0aHNcbiAgICogQHJldHVybnMg67O17IKs65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHM6IEFic29sdXRlUGF0aFtdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgIGNvbnN0IHsgZGlyOiBhcGlEaXIgfSA9IFNvbmFtdS5jb25maWcuYXBpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB0YXJnZXRzLm1hcChhc3luYyAodGFyZ2V0KSA9PlxuICAgICAgICAgIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgdHNQYXRocy5tYXAoYXN5bmMgKHJlYWxTcmMpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZHN0ID0gcmVhbFNyY1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGAvJHthcGlEaXJ9L2AsIGAvJHt0YXJnZXR9L2ApXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIvYXBwbGljYXRpb24vXCIsIFwiL3NlcnZpY2VzL1wiKTtcbiAgICAgICAgICAgICAgY29uc3QgZGlyID0gZGlybmFtZShkc3QpO1xuICAgICAgICAgICAgICBpZiAoIShhd2FpdCBleGlzdHMoZGlyKSkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShkc3QucmVwbGFjZShgJHtTb25hbXUuYXBwUm9vdFBhdGh9L2AsIFwiXCIpKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQocmVhbFNyYywgZHN0KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGRzdDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApXG4gICAgKS5mbGF0KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQoZnJvbVBhdGg6IHN0cmluZywgdG9QYXRoOiBzdHJpbmcpIHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMoZnJvbVBhdGgpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZEZpbGVDb250ZW50ID0gKGF3YWl0IHJlYWRGaWxlKGZyb21QYXRoKSkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IG5ld0ZpbGVDb250ZW50ID0gKCgpID0+IHtcbiAgICAgIC8vIHdlYuydtOuCmCBhcHAg65Ox7JeQ64qUIHNvbmFtdeqwgCDsl4bsirXri4jri6QuXG4gICAgICAvLyDrlLDrnbzshJwgc29uYW117JeQIOuMgO2VnCBpbXBvcnTripQg7ZWo6ruYIOuzteyCrOuQmOuKlCBzb25hbXUuc2hhcmVkLnRz7JeQIOuMgO2VnCBpbXBvcnTroZwg7LmY7ZmY7ZW07JW8IO2VqeuLiOuLpC5cbiAgICAgIC8vIOusuOygnOuKlCDrpqzshozsiqQg7KKF66WY7JeQIOuUsOudvCBzb25hbXUuc2hhcmVkLnRz66GcIOqwgOuKlCDqsr3roZzqsIAg64uk66W064uk64qUIOygkOyeheuLiOuLpC5cbiAgICAgIC8vIOyYiOulvCDrk6TslrQgc29uYW11LmdlbmVyYXRlZC50cyDsnoXsnqXsl5DshJwgc29uYW11LnNoYXJlZC50c+uKlCDqsJnsnYAg65SU66CJ7Yag66as7JeQIOyeiOycvOuLiCAuL3NvbmFtdS5zaGFyZWTroZwg7LmY7ZmY7ZWY66m0IOuQmOyngOunjCxcbiAgICAgIC8vIHVzZXIudHlwZXMudHMg7J6F7J6l7JeQ7IScIHNvbmFtdS5zaGFyZWQudHPripQg7IOB7JyEIOuUlOugie2GoOumrOyXkCDsnojsnLzri4ggLi4vc29uYW11LnNoYXJlZOuhnCDsuZjtmZjtlbTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g7J20IOusuOygnOulvCDtlbTqsrDtlZjquLAg7JyE7ZW0IOuzteyCrO2VmOqzoOyekCDtlZjripQg66as7IaM7Iqk7J2YIOqyveuhnCh0b1BhdGgp66W8IOq4sOykgOycvOuhnCBzb25hbXUuc2hhcmVkLnRz6rCAIOyeiOuKlCDrlJTroInthqDrpqzrpbwg7LC+7JWE7IScIOyDgeuMgCDqsr3roZzrpbwg6rOE7IKw7ZWY64+E66GdIO2VmOyYgOyKteuLiOuLpC5cbiAgICAgIGNvbnN0IHNlcnZpY2VzRGlyID0gdG9QYXRoLnJlcGxhY2UoL1xcL3NlcnZpY2VzXFwvLiokLywgXCIvc2VydmljZXNcIik7XG4gICAgICBjb25zdCBmaWxlRGlyID0gZGlybmFtZSh0b1BhdGgpO1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShmaWxlRGlyLCBzZXJ2aWNlc0Rpcik7XG4gICAgICBjb25zdCBzaGFyZWRQYXRoID0gcmVsYXRpdmVQYXRoID09PSBcIlwiID8gXCIuL3NvbmFtdS5zaGFyZWRcIiA6IGAke3JlbGF0aXZlUGF0aH0vc29uYW11LnNoYXJlZGA7XG5cbiAgICAgIGNvbnN0IG5mYyA9IG9sZEZpbGVDb250ZW50LnJlcGxhY2UoL2Zyb20gXCJzb25hbXVcIi9nLCBgZnJvbSBcIiR7c2hhcmVkUGF0aH1cImApO1xuICAgICAgcmV0dXJuIG5mYztcbiAgICB9KSgpO1xuICAgIHJldHVybiB3cml0ZUZpbGUodG9QYXRoLCBuZXdGaWxlQ29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDthZztlIzrpr8g7YKk7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZUtleSDthZztlIzrpr8g7YKkXG4gICAqIEBwYXJhbSBlbnVtSWQg7Je06rGw7ZiVIElEXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHNHZW5Db2RlKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVLZXk6IFRlbXBsYXRlS2V5LFxuICAgIGVudW1JZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IHN1YlBhdGg6IHN0cmluZzsgZnVsbFBhdGg6IHN0cmluZzsgaXNFeGlzdHM6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBnZW5QYXRoIH0gPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KHRlbXBsYXRlS2V5KS5nZXRUYXJnZXRBbmRQYXRoKFxuICAgICAgRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICBlbnVtSWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHN1YlBhdGggPSBwYXRoLmpvaW4odGFyZ2V0LCBnZW5QYXRoKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHN1YlBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWJQYXRoLFxuICAgICAgZnVsbFBhdGgsXG4gICAgICBpc0V4aXN0czogYXdhaXQgZXhpc3RzKGZ1bGxQYXRoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7Je06rGw7ZiV7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSBlbnVtcyDsl7TqsbDtmJUg66CI7J2067iUXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHMoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICBlbnVtczoge1xuICAgICAgW25hbWU6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+Pj47XG4gICAgfSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8YCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCwgYm9vbGVhbj4+IHtcbiAgICBjb25zdCBrZXlzOiBUZW1wbGF0ZUtleVtdID0gVGVtcGxhdGVLZXkub3B0aW9ucztcbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuICAgIGNvbnN0IGVudW1zS2V5cyA9IE9iamVjdC5rZXlzKGVudW1zKS5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09IG5hbWVzLmNvbnN0YW50KTtcblxuICAgIHJldHVybiBhd2FpdCByZWR1Y2VBc3luYyhcbiAgICAgIGtleXMsXG4gICAgICBhc3luYyAocmVzdWx0LCBrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdHBsID0gVGVtcGxhdGVNYW5hZ2VyLmdldChrZXkpO1xuICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJ2aWV3X2VudW1zXCIpKSB7XG4gICAgICAgICAgYXdhaXQgbWFwQXN5bmMoZW51bXNLZXlzLCBhc3luYyAoY29tcG9uZW50SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcywgY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmVzdWx0W2Ake2tleX1fXyR7Y29tcG9uZW50SWR9YF0gPSBhd2FpdCBleGlzdHMoXG4gICAgICAgICAgICAgIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMpO1xuICAgICAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgICAgICAgaWYgKHRhcmdldC5pbmNsdWRlcyhcIjp0YXJnZXRcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyh0YXJnZXRzLCBhc3luYyAodCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0W2Ake2tleX1fXyR7dH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LnJlcGxhY2UoXCI6dGFyZ2V0XCIsIHQpLCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBhd2FpdCBleGlzdHMocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHt9IGFzIFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPixcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50aXR5KGZvcm06IFRlbXBsYXRlT3B0aW9uc1tcImVudGl0eVwiXSkge1xuICAgIHJldHVybiBhd2FpdCBjcmVhdGVFbnRpdHkoZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBkZWxFbnRpdHkoZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8eyBkZWxQYXRoczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiBhd2FpdCBkZWxFbnRpdHkoZW50aXR5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMsIF9nZW5lcmF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGU8VCBleHRlbmRzIGtleW9mIFRlbXBsYXRlT3B0aW9ucz4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICApOiBQcm9taXNlPFBhdGhBbmRDb2RlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZGVyVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZXdDaGVja3N1bXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJob3QiLCJhc3NlcnQiLCJjaGFsayIsIkV2ZW50RW1pdHRlciIsIm1rZGlyIiwicmVhZEZpbGUiLCJ3cml0ZUZpbGUiLCJpbmZsZWN0aW9uIiwibWluaW1hdGNoIiwicGF0aCIsImRpcm5hbWUiLCJncm91cCIsInVuaXF1ZSIsInJlZ2lzdGVyZWRBcGlzIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIkFscmVhZHlQcm9jZXNzZWRFeGNlcHRpb24iLCJOYWl0ZSIsIlRlbXBsYXRlTWFuYWdlciIsIlRlbXBsYXRlS2V5IiwibWFwQXN5bmMiLCJyZWR1Y2VBc3luYyIsImNlbnRlclRleHQiLCJpc1Rlc3QiLCJleGlzdHMiLCJydW5XaXRoR3JhY2VmdWxTaHV0ZG93biIsImFyZUZpbGVzU2FtZSIsImZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcyIsInJlbmV3Q2hlY2tzdW1zIiwiZ2VuZXJhdGVUZW1wbGF0ZSIsInJlbmRlclRlbXBsYXRlIiwiY3JlYXRlRW50aXR5IiwiZGVsRW50aXR5IiwiZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCIsImxvYWRBcGlzIiwibG9hZE1vZGVscyIsImxvYWRUeXBlcyIsImxvYWRXb3JrZmxvd3MiLCJTeW5jZXIiLCJhcGlzIiwidHlwZXMiLCJtb2RlbHMiLCJ3b3JrZmxvd3MiLCJNYXAiLCJpc1N5bmNpbmciLCJldmVudEVtaXR0ZXIiLCJzeW5jIiwidGFyZ2V0cyIsImNvbmZpZyIsImNvcHlTaGFyZWRUb1RhcmdldHMiLCJjaGFuZ2VkRmlsZXMiLCJsZW5ndGgiLCJjb25zb2xlIiwibG9nIiwiYmxhY2siLCJiZ0dyZWVuIiwib3ZlcndyaXRlIiwiZSIsImVycm9yIiwiZG9TeW5jQWN0aW9ucyIsIndoZW5UaGlzSGFwcGVucyIsIndhaXRGb3JVcFRvIiwic3luY0Zyb21XYXRjaGVyIiwiZXZlbnQiLCJkaWZmRmlsZVBhdGgiLCJpbmNsdWRlcyIsImJvbGQiLCJ5ZWxsb3ciLCJpbnZhbGlkYXRlRmlsZSIsImF1dG9sb2FkU1NSUm91dGVzIiwiZW1pdCIsImludmFsaWRhdGVkUGF0aHMiLCJpbnZhbGlkYXRlZFBhdGgiLCJyZW1vdmVkQXBpcyIsInJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMiLCJibHVlIiwicmVsYXRpdmUiLCJhcGlSb290UGF0aCIsImdyYXkiLCJyZWQiLCJpc0luQ2hlY2tQYXR0ZXJuR3JvdXAiLCJPYmplY3QiLCJ2YWx1ZXMiLCJzb21lIiwicGF0dGVybiIsImF1dG9sb2FkVHlwZXMiLCJhdXRvbG9hZE1vZGVscyIsImF1dG9sb2FkQXBpcyIsImF1dG9sb2FkV29ya2Zsb3dzIiwiZW5kc1dpdGgiLCJlbnRpdHlJZCIsImdldEVudGl0eUlkRnJvbVBhdGgiLCJ0b1JlbW92ZSIsImZpbHRlciIsImFwaSIsIm1vZGVsTmFtZSIsInNwbGljZSIsImluZGV4T2YiLCJjb252ZXJ0TWFwIiwiYmFzZVVybCIsInNlcnZlciIsImxpc3RlbiIsImhvc3QiLCJwb3J0IiwidGFyZ2V0Iiwic3JjUGF0aCIsImpvaW4iLCJyZXBsYWNlIiwiYXBwUm9vdFBhdGgiLCJFcnJvciIsImZ1bGxUZXh0IiwiY29udmVydGVkVGV4dCIsImVudHJpZXMiLCJyZWR1Y2UiLCJhY2MiLCJrZXkiLCJ2YWx1ZSIsImRlc3RQYXRoIiwicmVjdXJzaXZlIiwid2FybiIsImRhdGEiLCJzeW5jaHJvbml6ZSIsInNzckNvbmZpZ1BhdGgiLCJjbGVhclNTUlJvdXRlcyIsImdsb2JBc3luYyIsImltcG9ydE1lbWJlcnMiLCJydW50aW1lUGF0aCIsImZpbGVzIiwiZmlsZSIsImRpZmZGaWxlUGF0aHMiLCJkaWZmR3JvdXBzIiwiY2FsY3VsYXRlRGlmZkdyb3VwcyIsImRpZmZUeXBlcyIsImtleXMiLCJoYW5kbGVFbnRpdHlDaGFuZ2UiLCJoYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2UiLCJoYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2UiLCJhY3Rpb25TeW5jQ29uZmlnIiwiZGlmZkZpbGVzIiwiciIsIm1hdGNoZWQiLCJtYXRjaCIsInQiLCJyZWxvYWQiLCJlbnRpdHkiLCJnZXQiLCJ0eXBlRmlsZVBhdGgiLCJuYW1lcyIsImZzIiwicGFyZW50SWQiLCJ1bmRlZmluZWQiLCJhY3Rpb25HZW5lcmF0ZVNjaGVtYXMiLCJnZW5lcmF0ZWQiLCJwdXNoIiwidHNQYXRocyIsImZ1bmN0aW9ucyIsImFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyIsIm1lcmdlZEdyb3VwIiwibW9kZWwiLCJmcmFtZSIsInBhcmFtcyIsIm1hcCIsIm1vZGVsUGF0aCIsIm5hbWVzUmVjb3JkIiwiZ2V0TmFtZXNGcm9tSWQiLCJmcmFtZU5hbWUiLCJmcmFtZUlkIiwiY2FtZWxpemUiLCJhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzIiwiYWN0aW9uR2VuZXJhdGVIdHRwcyIsImNvbnRlbnQiLCJQcm9taXNlIiwiYWxsIiwicGFyYW1zQXJyYXkiLCJzZXJ2aWNlc0ZpbGUiLCJmbGF0IiwicmVzIiwiZGlyIiwiYXBpRGlyIiwicmVhbFNyYyIsImRzdCIsImNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQiLCJmcm9tUGF0aCIsInRvUGF0aCIsIm9sZEZpbGVDb250ZW50IiwidG9TdHJpbmciLCJuZXdGaWxlQ29udGVudCIsInNlcnZpY2VzRGlyIiwiZmlsZURpciIsInJlbGF0aXZlUGF0aCIsInNoYXJlZFBhdGgiLCJuZmMiLCJjaGVja0V4aXN0c0dlbkNvZGUiLCJ0ZW1wbGF0ZUtleSIsImVudW1JZCIsImdlblBhdGgiLCJnZXRUYXJnZXRBbmRQYXRoIiwic3ViUGF0aCIsImZ1bGxQYXRoIiwiaXNFeGlzdHMiLCJjaGVja0V4aXN0cyIsImVudW1zIiwib3B0aW9ucyIsImVudW1zS2V5cyIsIm5hbWUiLCJjb25zdGFudCIsInJlc3VsdCIsInRwbCIsInN0YXJ0c1dpdGgiLCJjb21wb25lbnRJZCIsInAiLCJm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
@@ -23,4 +23,5 @@ export type DefineWorkflowOptions<Input, Output, TSchema extends StandardSchemaV
23
23
  }[];
24
24
  };
25
25
  export declare function workflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(options: DefineWorkflowOptions<Input, Output, TSchema>): (fn: WorkflowFunction<SchemaOutput<TSchema, Input>, Output>) => WorkflowMetadata;
26
+ export declare function workflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(options: DefineWorkflowOptions<Input, Output, TSchema>, fn: WorkflowFunction<SchemaOutput<TSchema, Input>, Output>): WorkflowMetadata;
26
27
  //# sourceMappingURL=decorator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"decorator.d.ts","sourceRoot":"","sources":["../../src/tasks/decorator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACvD,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;KAC9D,EAAE,CAAC;IACJ,EAAE,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACxC;AAGD,MAAM,MAAM,qBAAqB,CAC/B,KAAK,EACL,MAAM,EACN,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,IACtD,IAAI,CACN,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAC/E,MAAM,CACP,GAAG;IACF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QACV,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;KAC7D,EAAE,CAAC;CACL,CAAC;AAIF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EAC9F,OAAO,EAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,IAE9C,IAAI,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,sBAsBnE"}
1
+ {"version":3,"file":"decorator.d.ts","sourceRoot":"","sources":["../../src/tasks/decorator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACvD,SAAS,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;KAC9D,EAAE,CAAC;IACJ,EAAE,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACxC;AAGD,MAAM,MAAM,qBAAqB,CAC/B,KAAK,EACL,MAAM,EACN,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,IACtD,IAAI,CACN,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAC/E,MAAM,CACP,GAAG;IACF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QACV,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;KAC7D,EAAE,CAAC;CACL,CAAC;AAIF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EAC9F,OAAO,EAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GACrD,CAAC,EAAE,EAAE,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,gBAAgB,CAAC;AACpF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EAC9F,OAAO,EAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EACtD,EAAE,EAAE,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,GACzD,gBAAgB,CAAC"}