sonamu 0.12.0 → 0.13.1

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 (275) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +1 -2
  2. package/dist/ai/agents/agent.js +2 -3
  3. package/dist/ai/agents/index.js +1 -2
  4. package/dist/ai/index.js +1 -2
  5. package/dist/ai/providers/rtzr/api.js +1 -2
  6. package/dist/ai/providers/rtzr/error.js +2 -3
  7. package/dist/ai/providers/rtzr/model.js +1 -2
  8. package/dist/ai/providers/rtzr/options.js +1 -2
  9. package/dist/ai/providers/rtzr/provider.js +1 -2
  10. package/dist/ai/providers/rtzr/utils.js +1 -2
  11. package/dist/api/base-frame.js +4 -4
  12. package/dist/api/caster.d.ts +1 -1
  13. package/dist/api/caster.d.ts.map +1 -1
  14. package/dist/api/caster.js +9 -9
  15. package/dist/api/code-converters.js +6 -5
  16. package/dist/api/config.d.ts +1 -1
  17. package/dist/api/config.d.ts.map +1 -1
  18. package/dist/api/config.js +2 -3
  19. package/dist/api/context.d.ts +2 -3
  20. package/dist/api/context.d.ts.map +1 -1
  21. package/dist/api/context.js +2 -3
  22. package/dist/api/decorators.js +2 -3
  23. package/dist/api/http-validator.js +2 -3
  24. package/dist/api/index.js +8 -3
  25. package/dist/api/secret.js +1 -2
  26. package/dist/api/sonamu.d.ts +3 -5
  27. package/dist/api/sonamu.d.ts.map +1 -1
  28. package/dist/api/sonamu.js +19 -18
  29. package/dist/api/validator.js +1 -2
  30. package/dist/api/websocket-helpers.js +2 -3
  31. package/dist/auth/audit-log/builders.js +1 -2
  32. package/dist/auth/audit-log/client-ip.js +2 -3
  33. package/dist/auth/audit-log/events.js +1 -2
  34. package/dist/auth/audit-log/plugin.d.ts.map +1 -1
  35. package/dist/auth/audit-log/plugin.js +2 -3
  36. package/dist/auth/audit-log-ingestor.js +2 -3
  37. package/dist/auth/auth-generator.js +2 -3
  38. package/dist/auth/better-auth-entities.js +1 -2
  39. package/dist/auth/better-auth-request.js +2 -3
  40. package/dist/auth/index.js +2 -3
  41. package/dist/auth/knex-adapter.js +2 -3
  42. package/dist/auth/plugins/entity-definitions/admin.js +1 -2
  43. package/dist/auth/plugins/entity-definitions/anonymous.js +1 -2
  44. package/dist/auth/plugins/entity-definitions/api-key.js +1 -2
  45. package/dist/auth/plugins/entity-definitions/audit-log.js +1 -2
  46. package/dist/auth/plugins/entity-definitions/index.js +1 -2
  47. package/dist/auth/plugins/entity-definitions/jwt.js +1 -2
  48. package/dist/auth/plugins/entity-definitions/organization.js +1 -2
  49. package/dist/auth/plugins/entity-definitions/passkey.js +1 -2
  50. package/dist/auth/plugins/entity-definitions/phone-number.js +1 -2
  51. package/dist/auth/plugins/entity-definitions/sso.js +1 -2
  52. package/dist/auth/plugins/entity-definitions/two-factor.js +1 -2
  53. package/dist/auth/plugins/entity-definitions/username.js +1 -2
  54. package/dist/auth/plugins/wrappers/admin.d.ts +33 -32
  55. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  56. package/dist/auth/plugins/wrappers/admin.js +2 -3
  57. package/dist/auth/plugins/wrappers/anonymous.js +2 -3
  58. package/dist/auth/plugins/wrappers/api-key.js +2 -3
  59. package/dist/auth/plugins/wrappers/jwt.js +2 -3
  60. package/dist/auth/plugins/wrappers/organization.js +2 -3
  61. package/dist/auth/plugins/wrappers/passkey.js +2 -3
  62. package/dist/auth/plugins/wrappers/phone-number.d.ts +43 -1
  63. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  64. package/dist/auth/plugins/wrappers/phone-number.js +2 -3
  65. package/dist/auth/plugins/wrappers/sso.d.ts +138 -187
  66. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
  67. package/dist/auth/plugins/wrappers/sso.js +1 -2
  68. package/dist/auth/plugins/wrappers/two-factor.d.ts +51 -10
  69. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  70. package/dist/auth/plugins/wrappers/two-factor.js +2 -3
  71. package/dist/auth/plugins/wrappers/username.d.ts +39 -5
  72. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  73. package/dist/auth/plugins/wrappers/username.js +2 -3
  74. package/dist/bin/build-config.js +5 -5
  75. package/dist/bin/compiler-policy.js +2 -3
  76. package/dist/bin/fixture.js +7 -5
  77. package/dist/bin/hmr-hook-register.js +1 -2
  78. package/dist/bin/migrate-targets.js +2 -3
  79. package/dist/bin/test-command.js +2 -3
  80. package/dist/bin/ts-loader-register.js +2 -3
  81. package/dist/bin/ts-loader-registration.js +2 -3
  82. package/dist/bin/typecheck-web.js +2 -3
  83. package/dist/cache/cache-manager.js +1 -2
  84. package/dist/cache/decorator.js +2 -3
  85. package/dist/cache/drivers.js +1 -2
  86. package/dist/cache/index.js +2 -3
  87. package/dist/cache-control/cache-control.js +1 -2
  88. package/dist/code-formatting/index.js +2 -3
  89. package/dist/code-formatting/oxfmt.js +2 -3
  90. package/dist/code-formatting/oxlint.js +2 -3
  91. package/dist/compress/compress.js +1 -2
  92. package/dist/compress/index.js +2 -2
  93. package/dist/compress/types.d.ts +1 -1
  94. package/dist/compress/types.d.ts.map +1 -1
  95. package/dist/cone/cone-generator.js +2 -3
  96. package/dist/database/_batch_update.js +1 -2
  97. package/dist/database/base-model.js +4 -4
  98. package/dist/database/db.js +4 -4
  99. package/dist/database/knex.js +2 -3
  100. package/dist/database/puri-wrapper.js +2 -3
  101. package/dist/database/puri.js +23 -22
  102. package/dist/database/puri.types.js +1 -2
  103. package/dist/database/transaction-context.js +1 -2
  104. package/dist/database/upsert-builder.js +2 -3
  105. package/dist/dict/en.js +2 -3
  106. package/dist/dict/index.js +3 -3
  107. package/dist/dict/ko.js +2 -3
  108. package/dist/dict/rc-keys.js +1 -2
  109. package/dist/dict/sd.js +2 -3
  110. package/dist/dict/sonamu-dictionary.js +7 -6
  111. package/dist/dict/utils.js +2 -3
  112. package/dist/entity/entity-manager.d.ts +66 -66
  113. package/dist/entity/entity-manager.js +4 -4
  114. package/dist/entity/entity-template-cone.js +2 -3
  115. package/dist/entity/entity.js +21 -18
  116. package/dist/env.js +1 -2
  117. package/dist/exceptions/error-handler.d.ts.map +1 -1
  118. package/dist/exceptions/error-handler.js +2 -3
  119. package/dist/exceptions/so-exceptions.js +2 -3
  120. package/dist/filter/index.js +3 -2
  121. package/dist/filter/types.js +1 -2
  122. package/dist/filter/utils.js +7 -6
  123. package/dist/index.js +39 -5
  124. package/dist/logger/category.js +2 -3
  125. package/dist/logger/configure.js +5 -5
  126. package/dist/migration/code-generation.js +23 -16
  127. package/dist/migration/index-where-predicate.js +2 -3
  128. package/dist/migration/migration-set.js +2 -3
  129. package/dist/migration/migrator.js +2 -3
  130. package/dist/migration/postgresql-schema-reader.js +6 -9
  131. package/dist/migration/slack-confirm.js +2 -3
  132. package/dist/naite/naite-reporter.js +2 -3
  133. package/dist/naite/naite.js +10 -8
  134. package/dist/runtime-type.js +2 -3
  135. package/dist/ssr/hmr-opt-out.js +1 -2
  136. package/dist/ssr/index.js +7 -4
  137. package/dist/ssr/registry.js +1 -2
  138. package/dist/ssr/renderer.js +2 -3
  139. package/dist/storage/base-file.js +1 -2
  140. package/dist/storage/buffered-file.js +2 -3
  141. package/dist/storage/drivers.js +1 -2
  142. package/dist/storage/index.js +2 -3
  143. package/dist/storage/s3-driver.js +1 -2
  144. package/dist/storage/storage-manager.js +2 -3
  145. package/dist/storage/uploaded-file.js +2 -3
  146. package/dist/stream/__tests__/ws-test-helpers.js +2 -3
  147. package/dist/stream/index.js +11 -2
  148. package/dist/stream/sse.js +1 -2
  149. package/dist/stream/ws-audience-resolver.js +2 -3
  150. package/dist/stream/ws-audience.js +1 -2
  151. package/dist/stream/ws-cluster-bus.js +1 -2
  152. package/dist/stream/ws-delivery.js +2 -3
  153. package/dist/stream/ws-frame.js +1 -2
  154. package/dist/stream/ws-local-connection-store.js +2 -3
  155. package/dist/stream/ws-presence-index.js +1 -2
  156. package/dist/stream/ws-presence-store.js +2 -3
  157. package/dist/stream/ws-registry.js +2 -3
  158. package/dist/stream/ws-session-id.js +1 -2
  159. package/dist/stream/ws-telemetry-memory.js +3 -4
  160. package/dist/stream/ws-telemetry-trace.js +1 -2
  161. package/dist/stream/ws-telemetry.js +2 -3
  162. package/dist/stream/ws.js +2 -3
  163. package/dist/syncer/api-parser.js +2 -3
  164. package/dist/syncer/checksum.js +4 -4
  165. package/dist/syncer/code-generator.js +4 -4
  166. package/dist/syncer/entity-operations.js +2 -3
  167. package/dist/syncer/event-batcher.js +1 -2
  168. package/dist/syncer/file-copy.js +2 -3
  169. package/dist/syncer/file-patterns.js +2 -3
  170. package/dist/syncer/file-tracking.js +2 -3
  171. package/dist/syncer/filesystem-dependencies.js +1 -2
  172. package/dist/syncer/index.js +8 -2
  173. package/dist/syncer/module-loader.js +8 -6
  174. package/dist/syncer/syncer-actions.js +8 -7
  175. package/dist/syncer/syncer.js +13 -8
  176. package/dist/syncer/watcher.js +2 -3
  177. package/dist/tasks/decorator.js +1 -2
  178. package/dist/tasks/step-wrapper.js +2 -3
  179. package/dist/tasks/workflow-manager.js +2 -3
  180. package/dist/template/entity-converter.js +17 -16
  181. package/dist/template/helpers.js +2 -3
  182. package/dist/template/implementations/entity.template.js +2 -3
  183. package/dist/template/implementations/entry-server.template.js +2 -3
  184. package/dist/template/implementations/generated.template.js +2 -3
  185. package/dist/template/implementations/generated_http.template.js +6 -6
  186. package/dist/template/implementations/generated_sso.template.js +2 -3
  187. package/dist/template/implementations/http_validators.template.js +2 -3
  188. package/dist/template/implementations/init_types.template.js +2 -3
  189. package/dist/template/implementations/model.template.js +4 -4
  190. package/dist/template/implementations/model_test.template.js +2 -3
  191. package/dist/template/implementations/queries.template.js +2 -3
  192. package/dist/template/implementations/sd.template.js +2 -3
  193. package/dist/template/implementations/services.template.js +2 -3
  194. package/dist/template/implementations/view_form.template.js +12 -9
  195. package/dist/template/implementations/view_id_all_select.template.js +2 -3
  196. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  197. package/dist/template/implementations/view_list.template.js +19 -17
  198. package/dist/template/implementations/view_search_input.template.js +2 -3
  199. package/dist/template/index.js +9 -3
  200. package/dist/template/template-manager.js +2 -3
  201. package/dist/template/template-types.js +1 -2
  202. package/dist/template/template.js +2 -3
  203. package/dist/template/zod-converter.js +54 -47
  204. package/dist/testing/_relation-graph.js +2 -3
  205. package/dist/testing/bootstrap.js +2 -3
  206. package/dist/testing/data-explorer.js +2 -3
  207. package/dist/testing/dev-test-routes.js +2 -3
  208. package/dist/testing/dev-vitest-manager.js +15 -12
  209. package/dist/testing/faker-mappings.js +1 -2
  210. package/dist/testing/filesystem.js +2 -3
  211. package/dist/testing/fixture-generator.js +2 -3
  212. package/dist/testing/fixture-loader.js +1 -2
  213. package/dist/testing/fixture-manager.js +12 -9
  214. package/dist/testing/global-setup.js +5 -5
  215. package/dist/testing/index.js +6 -3
  216. package/dist/testing/naite-vitest-reporter.js +1 -2
  217. package/dist/testing/parallel-db-manager.js +2 -3
  218. package/dist/testing/vitest-helpers.js +2 -3
  219. package/dist/tooling/__tests__/helpers/sonamu-test-root.js +2 -3
  220. package/dist/tooling/cdd-service.js +1 -2
  221. package/dist/tooling/cli-tooling.js +1 -2
  222. package/dist/tooling/fixture-service.js +1 -2
  223. package/dist/tooling/index.js +1 -2
  224. package/dist/tooling/test-run-client.js +2 -3
  225. package/dist/tsdown.api.config.js +1 -2
  226. package/dist/types/types.js +2 -3
  227. package/dist/ui/ai-api.d.ts.map +1 -1
  228. package/dist/ui/ai-api.js +4 -5
  229. package/dist/ui/ai-client.d.ts +2 -2
  230. package/dist/ui/ai-client.d.ts.map +1 -1
  231. package/dist/ui/ai-client.js +9 -8
  232. package/dist/ui/api.d.ts.map +1 -1
  233. package/dist/ui/api.js +11 -8
  234. package/dist/ui/async-route.js +1 -2
  235. package/dist/ui/cdd-service.js +22 -21
  236. package/dist/ui/migrations-api.js +6 -5
  237. package/dist/ui-web/assets/index-QDMyy31K.js +180 -0
  238. package/dist/ui-web/assets/index-dV7akMFB.css +1 -0
  239. package/dist/ui-web/index.html +2 -2
  240. package/dist/utils/async-utils.js +1 -2
  241. package/dist/utils/class-name.js +1 -2
  242. package/dist/utils/console-util.js +1 -2
  243. package/dist/utils/controller.js +2 -3
  244. package/dist/utils/esm-utils.js +1 -2
  245. package/dist/utils/fs-utils.js +2 -3
  246. package/dist/utils/lodash-able.js +1 -2
  247. package/dist/utils/model.js +1 -2
  248. package/dist/utils/object-utils.js +2 -3
  249. package/dist/utils/path-utils.js +2 -3
  250. package/dist/utils/process-utils.js +2 -3
  251. package/dist/utils/runtime-value.js +1 -2
  252. package/dist/utils/sql-parser.js +2 -3
  253. package/dist/utils/type-utils.js +8 -8
  254. package/dist/utils/utils.js +2 -3
  255. package/dist/utils/zod-error.js +2 -3
  256. package/dist/vector/chunking.js +1 -2
  257. package/dist/vector/config.js +1 -2
  258. package/dist/vector/embedding.js +4 -4
  259. package/package.json +67 -67
  260. package/src/ai/agents/agent.ts +1 -1
  261. package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
  262. package/src/api/__tests__/sonamu.websocket.test.ts +6 -10
  263. package/src/api/config.ts +1 -1
  264. package/src/api/context.ts +2 -8
  265. package/src/api/sonamu.ts +26 -21
  266. package/src/auth/audit-log/plugin.ts +2 -0
  267. package/src/compress/types.ts +1 -1
  268. package/src/exceptions/error-handler.ts +3 -2
  269. package/src/template/implementations/model.template.ts +3 -3
  270. package/src/template/implementations/view_list.template.ts +12 -13
  271. package/src/ui/ai-api.ts +4 -2
  272. package/src/ui/ai-client.ts +2 -2
  273. package/src/ui/api.ts +58 -62
  274. package/dist/ui-web/assets/index-BMdIyKXS.css +0 -1
  275. package/dist/ui-web/assets/index-LpE8u19O.js +0 -178
@@ -1,5 +1,5 @@
1
1
  import { init_config, loadConfig } from "../api/config.js";
2
- //#region src/testing/vitest-helpers.ts
2
+ // src/testing/vitest-helpers.ts
3
3
  init_config();
4
4
  function restoreProcessEnv(snapshot) {
5
5
  for (const key of Object.keys(process.env)) if (!(key in snapshot)) delete process.env[key];
@@ -37,7 +37,6 @@ async function getSonamuTestConfig(options) {
37
37
  };
38
38
  return options;
39
39
  }
40
- //#endregion
41
40
  export { getSonamuTestConfig };
42
41
 
43
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LWhlbHBlcnMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3Rpbmcvdml0ZXN0LWhlbHBlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBWaXRlVXNlckNvbmZpZyB9IGZyb20gXCJ2aXRlc3QvY29uZmlnXCI7XG5cbmltcG9ydCB7IGxvYWRDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuXG50eXBlIFZpdGVzdENvbmZpZyA9IFZpdGVVc2VyQ29uZmlnW1widGVzdFwiXTtcblxuZnVuY3Rpb24gcmVzdG9yZVByb2Nlc3NFbnYoc25hcHNob3Q6IE5vZGVKUy5Qcm9jZXNzRW52KTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHByb2Nlc3MuZW52KSkge1xuICAgIGlmICghKGtleSBpbiBzbmFwc2hvdCkpIHtcbiAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudltrZXldO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNuYXBzaG90KSkge1xuICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIHNvbmFtdS5jb25maWcudHPsnZggdGVzdCDshKTsoJXsnYQg6riw67CY7Jy866GcIHZpdGVzdCDthYzsiqTtirgg7ISk7KCV7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gdml0ZXN0LmNvbmZpZy50c1xuICogaW1wb3J0IHsgZ2V0U29uYW11VGVzdENvbmZpZyB9IGZyb20gXCJzb25hbXUvdGVzdFwiO1xuICogaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInZpdGVzdC9jb25maWdcIjtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoYXN5bmMgKCkgPT4gKHtcbiAqICAgdGVzdDogYXdhaXQgZ2V0U29uYW11VGVzdENvbmZpZyh7XG4gKiAgICAgc2V0dXBGaWxlczogW1wiLi9zcmMvdGVzdGluZy9zZXR1cC1tb2Nrcy50c1wiXSxcbiAqICAgfSksXG4gKiB9KSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNvbmFtdVRlc3RDb25maWcob3B0aW9ucz86IFZpdGVzdENvbmZpZyk6IFByb21pc2U8Vml0ZXN0Q29uZmlnPiB7XG4gIGNvbnN0IHsgZmluZEFwaVJvb3RQYXRoIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy91dGlsc1wiKTtcbiAgY29uc3QgZW52QmVmb3JlQ29uZmlnTG9hZCA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyhmaW5kQXBpUm9vdFBhdGgoKSk7XG4gIHJlc3RvcmVQcm9jZXNzRW52KGVudkJlZm9yZUNvbmZpZ0xvYWQpO1xuXG4gIGNvbnN0IGlzUGFyYWxsZWwgPSBjb25maWcudGVzdD8ucGFyYWxsZWwgPz8gZmFsc2U7XG4gIGNvbnN0IG1heFdvcmtlcnMgPSBjb25maWcudGVzdD8ubWF4V29ya2VycyA/PyA0O1xuXG4gIGlmIChpc1BhcmFsbGVsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvb2w6IFwiZm9ya3NcIixcbiAgICAgIG1heFdvcmtlcnMsXG4gICAgICBpc29sYXRlOiBmYWxzZSxcbiAgICAgIGVudjoge1xuICAgICAgICBTT05BTVVfV09SS0VSX0RCOiBcInRydWVcIixcbiAgICAgIH0sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7WUFFMEM7QUFJMUMsU0FBUyxrQkFBa0IsVUFBbUM7Q0FDNUQsS0FBSyxNQUFNLE9BQU8sT0FBTyxLQUFLLFFBQVEsR0FBRyxHQUN2QyxJQUFJLEVBQUUsT0FBTyxXQUNYLE9BQU8sUUFBUSxJQUFJO0NBSXZCLEtBQUssTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLFFBQVEsUUFBUSxHQUNoRCxRQUFRLElBQUksT0FBTztBQUV2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsZUFBc0Isb0JBQW9CLFNBQStDO0NBQ3ZGLE1BQU0sRUFBRSxvQkFBb0IsTUFBTSxPQUFPO0NBQ3pDLE1BQU0sc0JBQXNCLEVBQUUsR0FBRyxRQUFRLElBQUk7Q0FDN0MsTUFBTSxTQUFTLE1BQU0sV0FBVyxnQkFBZ0IsQ0FBQztDQUNqRCxrQkFBa0IsbUJBQW1CO0NBRXJDLE1BQU0sYUFBYSxPQUFPLE1BQU0sWUFBWTtDQUM1QyxNQUFNLGFBQWEsT0FBTyxNQUFNLGNBQWM7Q0FFOUMsSUFBSSxZQUNGLE9BQU87RUFDTCxNQUFNO0VBQ047RUFDQSxTQUFTO0VBQ1QsS0FBSyxFQUNILGtCQUFrQixPQUNwQjtFQUNBLEdBQUc7Q0FDTDtDQUdGLE9BQU87QUFDVCJ9
42
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LWhlbHBlcnMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3Rpbmcvdml0ZXN0LWhlbHBlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBWaXRlVXNlckNvbmZpZyB9IGZyb20gXCJ2aXRlc3QvY29uZmlnXCI7XG5cbmltcG9ydCB7IGxvYWRDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuXG50eXBlIFZpdGVzdENvbmZpZyA9IFZpdGVVc2VyQ29uZmlnW1widGVzdFwiXTtcblxuZnVuY3Rpb24gcmVzdG9yZVByb2Nlc3NFbnYoc25hcHNob3Q6IE5vZGVKUy5Qcm9jZXNzRW52KTogdm9pZCB7XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHByb2Nlc3MuZW52KSkge1xuICAgIGlmICghKGtleSBpbiBzbmFwc2hvdCkpIHtcbiAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudltrZXldO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHNuYXBzaG90KSkge1xuICAgIHByb2Nlc3MuZW52W2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIHNvbmFtdS5jb25maWcudHPsnZggdGVzdCDshKTsoJXsnYQg6riw67CY7Jy866GcIHZpdGVzdCDthYzsiqTtirgg7ISk7KCV7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gdml0ZXN0LmNvbmZpZy50c1xuICogaW1wb3J0IHsgZ2V0U29uYW11VGVzdENvbmZpZyB9IGZyb20gXCJzb25hbXUvdGVzdFwiO1xuICogaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInZpdGVzdC9jb25maWdcIjtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoYXN5bmMgKCkgPT4gKHtcbiAqICAgdGVzdDogYXdhaXQgZ2V0U29uYW11VGVzdENvbmZpZyh7XG4gKiAgICAgc2V0dXBGaWxlczogW1wiLi9zcmMvdGVzdGluZy9zZXR1cC1tb2Nrcy50c1wiXSxcbiAqICAgfSksXG4gKiB9KSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNvbmFtdVRlc3RDb25maWcob3B0aW9ucz86IFZpdGVzdENvbmZpZyk6IFByb21pc2U8Vml0ZXN0Q29uZmlnPiB7XG4gIGNvbnN0IHsgZmluZEFwaVJvb3RQYXRoIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy91dGlsc1wiKTtcbiAgY29uc3QgZW52QmVmb3JlQ29uZmlnTG9hZCA9IHsgLi4ucHJvY2Vzcy5lbnYgfTtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgbG9hZENvbmZpZyhmaW5kQXBpUm9vdFBhdGgoKSk7XG4gIHJlc3RvcmVQcm9jZXNzRW52KGVudkJlZm9yZUNvbmZpZ0xvYWQpO1xuXG4gIGNvbnN0IGlzUGFyYWxsZWwgPSBjb25maWcudGVzdD8ucGFyYWxsZWwgPz8gZmFsc2U7XG4gIGNvbnN0IG1heFdvcmtlcnMgPSBjb25maWcudGVzdD8ubWF4V29ya2VycyA/PyA0O1xuXG4gIGlmIChpc1BhcmFsbGVsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvb2w6IFwiZm9ya3NcIixcbiAgICAgIG1heFdvcmtlcnMsXG4gICAgICBpc29sYXRlOiBmYWxzZSxcbiAgICAgIGVudjoge1xuICAgICAgICBTT05BTVVfV09SS0VSX0RCOiBcInRydWVcIixcbiAgICAgIH0sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFFMEMsWUFBQTtBQUkxQyxTQUFTLGtCQUFrQixVQUFtQztDQUM1RCxLQUFLLE1BQU0sT0FBTyxPQUFPLEtBQUssUUFBUSxHQUFHLEdBQ3ZDLElBQUksRUFBRSxPQUFPLFdBQ1gsT0FBTyxRQUFRLElBQUk7Q0FJdkIsS0FBSyxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sUUFBUSxRQUFRLEdBQ2hELFFBQVEsSUFBSSxPQUFPO0FBRXZCOzs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxlQUFzQixvQkFBb0IsU0FBK0M7Q0FDdkYsTUFBTSxFQUFFLG9CQUFvQixNQUFNLE9BQU87Q0FDekMsTUFBTSxzQkFBc0IsRUFBRSxHQUFHLFFBQVEsSUFBSTtDQUM3QyxNQUFNLFNBQVMsTUFBTSxXQUFXLGdCQUFnQixDQUFDO0NBQ2pELGtCQUFrQixtQkFBbUI7Q0FFckMsTUFBTSxhQUFhLE9BQU8sTUFBTSxZQUFZO0NBQzVDLE1BQU0sYUFBYSxPQUFPLE1BQU0sY0FBYztDQUU5QyxJQUFJLFlBQ0YsT0FBTztFQUNMLE1BQU07RUFDTjtFQUNBLFNBQVM7RUFDVCxLQUFLLEVBQ0gsa0JBQWtCLE9BQ3BCO0VBQ0EsR0FBRztDQUNMO0NBR0YsT0FBTztBQUNUIn0=
@@ -2,7 +2,7 @@ import { Sonamu, init_sonamu } from "../../../api/sonamu.js";
2
2
  import os from "node:os";
3
3
  import { mkdir, mkdtemp, rm } from "node:fs/promises";
4
4
  import path from "node:path";
5
- //#region src/tooling/__tests__/helpers/sonamu-test-root.ts
5
+ // src/tooling/__tests__/helpers/sonamu-test-root.ts
6
6
  init_sonamu();
7
7
  const createdWorkspaces = [];
8
8
  let capturedSnapshot = null;
@@ -36,7 +36,6 @@ async function detachSonamuTestRoot() {
36
36
  force: true
37
37
  })));
38
38
  }
39
- //#endregion
40
39
  export { attachSonamuTestRoot, detachSonamuTestRoot };
41
40
 
42
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LXRlc3Qtcm9vdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbGluZy9fX3Rlc3RzX18vaGVscGVycy9zb25hbXUtdGVzdC1yb290LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1rZGlyLCBta2R0ZW1wLCBybSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IHsgU29uYW11LCB0eXBlIFNvbmFtdVRlc3RpbmdTbmFwc2hvdCB9IGZyb20gXCIuLi8uLi8uLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9wYXRoLXV0aWxzXCI7XG5cbmNvbnN0IGNyZWF0ZWRXb3Jrc3BhY2VzOiBzdHJpbmdbXSA9IFtdO1xubGV0IGNhcHR1cmVkU25hcHNob3Q6IFNvbmFtdVRlc3RpbmdTbmFwc2hvdCB8IG51bGwgPSBudWxsO1xubGV0IGNhcHR1cmVkSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuLyoqXG4gKiDsnoTsi5wgYXBpIHJvb3Trpbwg66eM65Ok7Ja0IFNvbmFtdSBzaW5nbGV0b27snZgg6rO16rCcIHNldHRlcuuhnCDso7zsnoXtlanri4jri6QuXG4gKlxuICogdG9vbGluZyDsl7DsgrDsnYAgYFNvbmFtdS5pc0luaXRpYWxpemVkYOqwgCDssLjsnbTrqbQg7LSI6riw7ZmU66W8IOqxtOuEiOubsOuvgOuhnCxcbiAqIOyLpOygnCBEQi/shKTsoJUg7JeG7J20IO2MjOydvCDqsr3roZwg6riw67CYIOuPmeyekeunjCDqsoDspp3tlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF0dGFjaFNvbmFtdVRlc3RSb290KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHdvcmtzcGFjZSA9IGF3YWl0IG1rZHRlbXAocGF0aC5qb2luKG9zLnRtcGRpcigpLCBcInNvbmFtdS10b29saW5nLVwiKSk7XG4gIGNyZWF0ZWRXb3Jrc3BhY2VzLnB1c2god29ya3NwYWNlKTtcbiAgY29uc3QgYXBpUm9vdFBhdGggPSBwYXRoLmpvaW4od29ya3NwYWNlLCBcImFwaVwiKTtcbiAgYXdhaXQgbWtkaXIocGF0aC5qb2luKGFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImFwcGxpY2F0aW9uXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjYXB0dXJlZFNuYXBzaG90ID8/PSBTb25hbXUuY2FwdHVyZVRlc3RpbmdTbmFwc2hvdCgpO1xuICBjYXB0dXJlZEluaXRpYWxpemVkID0gU29uYW11LmlzSW5pdGlhbGl6ZWQ7XG4gIC8vIFNBRkVUWTogbWtkdGVtcOqwgCDrsJjtmZjtlZwg7KCI64yAIOqyveuhnOunjCDso7zsnoXtlanri4jri6QuXG4gIFNvbmFtdS5hcGlSb290UGF0aCA9IGFwaVJvb3RQYXRoIGFzIEFic29sdXRlUGF0aDtcbiAgU29uYW11LmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICByZXR1cm4gYXBpUm9vdFBhdGg7XG59XG5cbi8qKiDso7zsnoXtlZwgU29uYW11IOyDge2DnOulvCDrkJjrj4zrpqzqs6Ag7J6E7IucIOuUlOugie2EsOumrOulvCDsoJXrpqztlanri4jri6QuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGV0YWNoU29uYW11VGVzdFJvb3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjYXB0dXJlZFNuYXBzaG90ICE9PSBudWxsKSB7XG4gICAgU29uYW11LnJlc3RvcmVUZXN0aW5nU25hcHNob3QoY2FwdHVyZWRTbmFwc2hvdCk7XG4gICAgY2FwdHVyZWRTbmFwc2hvdCA9IG51bGw7XG4gIH1cbiAgU29uYW11LmlzSW5pdGlhbGl6ZWQgPSBjYXB0dXJlZEluaXRpYWxpemVkO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBjcmVhdGVkV29ya3NwYWNlcy5zcGxpY2UoMCkubWFwKCh3b3Jrc3BhY2UpID0+IHJtKHdvcmtzcGFjZSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pKSxcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7WUFJd0U7QUFHeEUsTUFBTSxvQkFBOEIsQ0FBQztBQUNyQyxJQUFJLG1CQUFpRDtBQUNyRCxJQUFJLHNCQUFzQjs7Ozs7OztBQVExQixlQUFzQix1QkFBd0M7Q0FDNUQsTUFBTSxZQUFZLE1BQU0sUUFBUSxLQUFLLEtBQUssR0FBRyxPQUFPLEdBQUcsaUJBQWlCLENBQUM7Q0FDekUsa0JBQWtCLEtBQUssU0FBUztDQUNoQyxNQUFNLGNBQWMsS0FBSyxLQUFLLFdBQVcsS0FBSztDQUM5QyxNQUFNLE1BQU0sS0FBSyxLQUFLLGFBQWEsT0FBTyxhQUFhLEdBQUcsRUFBRSxXQUFXLEtBQUssQ0FBQztDQUU3RSxxQkFBcUIsT0FBTyx1QkFBdUI7Q0FDbkQsc0JBQXNCLE9BQU87Q0FFN0IsT0FBTyxjQUFjO0NBQ3JCLE9BQU8sZ0JBQWdCO0NBQ3ZCLE9BQU87QUFDVDs7QUFHQSxlQUFzQix1QkFBc0M7Q0FDMUQsSUFBSSxxQkFBcUIsTUFBTTtFQUM3QixPQUFPLHVCQUF1QixnQkFBZ0I7RUFDOUMsbUJBQW1CO0NBQ3JCO0NBQ0EsT0FBTyxnQkFBZ0I7Q0FDdkIsTUFBTSxRQUFRLElBQ1osa0JBQWtCLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxjQUFjLEdBQUcsV0FBVztFQUFFLFdBQVc7RUFBTSxPQUFPO0NBQUssQ0FBQyxDQUFDLENBQ2hHO0FBQ0YifQ==
41
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LXRlc3Qtcm9vdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbGluZy9fX3Rlc3RzX18vaGVscGVycy9zb25hbXUtdGVzdC1yb290LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1rZGlyLCBta2R0ZW1wLCBybSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IHsgU29uYW11LCB0eXBlIFNvbmFtdVRlc3RpbmdTbmFwc2hvdCB9IGZyb20gXCIuLi8uLi8uLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyB0eXBlIEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9wYXRoLXV0aWxzXCI7XG5cbmNvbnN0IGNyZWF0ZWRXb3Jrc3BhY2VzOiBzdHJpbmdbXSA9IFtdO1xubGV0IGNhcHR1cmVkU25hcHNob3Q6IFNvbmFtdVRlc3RpbmdTbmFwc2hvdCB8IG51bGwgPSBudWxsO1xubGV0IGNhcHR1cmVkSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuLyoqXG4gKiDsnoTsi5wgYXBpIHJvb3Trpbwg66eM65Ok7Ja0IFNvbmFtdSBzaW5nbGV0b27snZgg6rO16rCcIHNldHRlcuuhnCDso7zsnoXtlanri4jri6QuXG4gKlxuICogdG9vbGluZyDsl7DsgrDsnYAgYFNvbmFtdS5pc0luaXRpYWxpemVkYOqwgCDssLjsnbTrqbQg7LSI6riw7ZmU66W8IOqxtOuEiOubsOuvgOuhnCxcbiAqIOyLpOygnCBEQi/shKTsoJUg7JeG7J20IO2MjOydvCDqsr3roZwg6riw67CYIOuPmeyekeunjCDqsoDspp3tlaAg7IiYIOyeiOyKteuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF0dGFjaFNvbmFtdVRlc3RSb290KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHdvcmtzcGFjZSA9IGF3YWl0IG1rZHRlbXAocGF0aC5qb2luKG9zLnRtcGRpcigpLCBcInNvbmFtdS10b29saW5nLVwiKSk7XG4gIGNyZWF0ZWRXb3Jrc3BhY2VzLnB1c2god29ya3NwYWNlKTtcbiAgY29uc3QgYXBpUm9vdFBhdGggPSBwYXRoLmpvaW4od29ya3NwYWNlLCBcImFwaVwiKTtcbiAgYXdhaXQgbWtkaXIocGF0aC5qb2luKGFwaVJvb3RQYXRoLCBcInNyY1wiLCBcImFwcGxpY2F0aW9uXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjYXB0dXJlZFNuYXBzaG90ID8/PSBTb25hbXUuY2FwdHVyZVRlc3RpbmdTbmFwc2hvdCgpO1xuICBjYXB0dXJlZEluaXRpYWxpemVkID0gU29uYW11LmlzSW5pdGlhbGl6ZWQ7XG4gIC8vIFNBRkVUWTogbWtkdGVtcOqwgCDrsJjtmZjtlZwg7KCI64yAIOqyveuhnOunjCDso7zsnoXtlanri4jri6QuXG4gIFNvbmFtdS5hcGlSb290UGF0aCA9IGFwaVJvb3RQYXRoIGFzIEFic29sdXRlUGF0aDtcbiAgU29uYW11LmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICByZXR1cm4gYXBpUm9vdFBhdGg7XG59XG5cbi8qKiDso7zsnoXtlZwgU29uYW11IOyDge2DnOulvCDrkJjrj4zrpqzqs6Ag7J6E7IucIOuUlOugie2EsOumrOulvCDsoJXrpqztlanri4jri6QuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGV0YWNoU29uYW11VGVzdFJvb3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChjYXB0dXJlZFNuYXBzaG90ICE9PSBudWxsKSB7XG4gICAgU29uYW11LnJlc3RvcmVUZXN0aW5nU25hcHNob3QoY2FwdHVyZWRTbmFwc2hvdCk7XG4gICAgY2FwdHVyZWRTbmFwc2hvdCA9IG51bGw7XG4gIH1cbiAgU29uYW11LmlzSW5pdGlhbGl6ZWQgPSBjYXB0dXJlZEluaXRpYWxpemVkO1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBjcmVhdGVkV29ya3NwYWNlcy5zcGxpY2UoMCkubWFwKCh3b3Jrc3BhY2UpID0+IHJtKHdvcmtzcGFjZSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pKSxcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFJd0UsWUFBQTtBQUd4RSxNQUFNLG9CQUE4QixDQUFDO0FBQ3JDLElBQUksbUJBQWlEO0FBQ3JELElBQUksc0JBQXNCOzs7Ozs7O0FBUTFCLGVBQXNCLHVCQUF3QztDQUM1RCxNQUFNLFlBQVksTUFBTSxRQUFRLEtBQUssS0FBSyxHQUFHLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQztDQUN6RSxrQkFBa0IsS0FBSyxTQUFTO0NBQ2hDLE1BQU0sY0FBYyxLQUFLLEtBQUssV0FBVyxLQUFLO0NBQzlDLE1BQU0sTUFBTSxLQUFLLEtBQUssYUFBYSxPQUFPLGFBQWEsR0FBRyxFQUFFLFdBQVcsS0FBSyxDQUFDO0NBRTdFLHFCQUFxQixPQUFPLHVCQUF1QjtDQUNuRCxzQkFBc0IsT0FBTztDQUU3QixPQUFPLGNBQWM7Q0FDckIsT0FBTyxnQkFBZ0I7Q0FDdkIsT0FBTztBQUNUOztBQUdBLGVBQXNCLHVCQUFzQztDQUMxRCxJQUFJLHFCQUFxQixNQUFNO0VBQzdCLE9BQU8sdUJBQXVCLGdCQUFnQjtFQUM5QyxtQkFBbUI7Q0FDckI7Q0FDQSxPQUFPLGdCQUFnQjtDQUN2QixNQUFNLFFBQVEsSUFDWixrQkFBa0IsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLGNBQWMsR0FBRyxXQUFXO0VBQUUsV0FBVztFQUFNLE9BQU87Q0FBSyxDQUFDLENBQUMsQ0FDaEc7QUFDRiJ9
@@ -1,7 +1,7 @@
1
1
  import * as defaultFs from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { constants } from "node:fs";
4
- //#region src/tooling/cdd-service.ts
4
+ // src/tooling/cdd-service.ts
5
5
  function invalidCddPath(relativePath, cause) {
6
6
  return Object.assign(/* @__PURE__ */ new Error(`CDD 경로가 contract 밖을 참조합니다: ${relativePath}`), {
7
7
  code: "INVALID_CDD_PATH",
@@ -209,7 +209,6 @@ function createDefaultCddToolingAdapter({ contractRoot, fs = defaultFs }) {
209
209
  }
210
210
  };
211
211
  }
212
- //#endregion
213
212
  export { createDefaultCddToolingAdapter };
214
213
 
215
214
  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RkLXNlcnZpY2UuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xpbmcvY2RkLXNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCAqIGFzIGRlZmF1bHRGcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG50eXBlIENkZEZpbGVTeXN0ZW0gPSBQaWNrPHR5cGVvZiBkZWZhdWx0RnMsIFwibHN0YXRcIiB8IFwibWtkaXJcIiB8IFwib3BlblwiIHwgXCJvcGVuZGlyXCIgfCBcInJlYWxwYXRoXCI+O1xuXG5mdW5jdGlvbiBpbnZhbGlkQ2RkUGF0aChyZWxhdGl2ZVBhdGg6IHN0cmluZywgY2F1c2U/OiB1bmtub3duKTogRXJyb3Ige1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYENERCDqsr3roZzqsIAgY29udHJhY3Qg67CW7J2EIOywuOyhsO2VqeuLiOuLpDogJHtyZWxhdGl2ZVBhdGh9YCksIHtcbiAgICBjb2RlOiBcIklOVkFMSURfQ0REX1BBVEhcIixcbiAgICBjYXVzZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzV2l0aGluKHJvb3Q6IHN0cmluZywgdGFyZ2V0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgcmVsYXRpdmUgPSBwYXRoLnJlbGF0aXZlKHJvb3QsIHRhcmdldCk7XG4gIHJldHVybiByZWxhdGl2ZSA9PT0gXCJcIiB8fCAoIXJlbGF0aXZlLnN0YXJ0c1dpdGgoYC4uJHtwYXRoLnNlcH1gKSAmJiByZWxhdGl2ZSAhPT0gXCIuLlwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbmVhcmVzdEV4aXN0aW5nUGF0aChmczogQ2RkRmlsZVN5c3RlbSwgdGFyZ2V0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBsZXQgY2FuZGlkYXRlID0gdGFyZ2V0O1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5sc3RhdChjYW5kaWRhdGUpO1xuICAgICAgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gU0FGRVRZOiBub2RlOmZzIGxzdGF0IOyLpO2MqOydmCBjb2Rl66eMIOydveyWtCDqsr3roZwg67aA7J6s66W8IOq1rOu2hO2VqeuLiOuLpC5cbiAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSBcIkVOT0VOVFwiKSB0aHJvdyBlcnJvcjtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZGlybmFtZShjYW5kaWRhdGUpO1xuICAgICAgaWYgKHBhcmVudCA9PT0gY2FuZGlkYXRlKSB0aHJvdyBlcnJvcjtcbiAgICAgIGNhbmRpZGF0ZSA9IHBhcmVudDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2RkRmlsZU9wZXJhdGlvbih7XG4gIGNvbnRyYWN0Um9vdCxcbiAgZnMgPSBkZWZhdWx0RnMsXG59OiB7XG4gIGNvbnRyYWN0Um9vdDogc3RyaW5nO1xuICBmcz86IENkZEZpbGVTeXN0ZW07XG59KSB7XG4gIGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVCb3VuZGFyeShyZWxhdGl2ZVBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IFtjYW5vbmljYWxSb290LCBjb25maWd1cmVkUm9vdF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBmcy5yZWFscGF0aChjb250cmFjdFJvb3QpLFxuICAgICAgUHJvbWlzZS5yZXNvbHZlKHBhdGgucmVzb2x2ZShjb250cmFjdFJvb3QpKSxcbiAgICBdKTtcbiAgICBjb25zdCB0YXJnZXQgPSBwYXRoLnJlc29sdmUoY29uZmlndXJlZFJvb3QsIHJlbGF0aXZlUGF0aCk7XG4gICAgaWYgKCFpc1dpdGhpbihjb25maWd1cmVkUm9vdCwgdGFyZ2V0KSkgdGhyb3cgaW52YWxpZENkZFBhdGgocmVsYXRpdmVQYXRoKTtcbiAgICByZXR1cm4geyBjYW5vbmljYWxSb290LCB0YXJnZXQgfTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGFzc2VydENhbm9uaWNhbFBhdGgoXG4gICAgY2Fub25pY2FsUm9vdDogc3RyaW5nLFxuICAgIHRhcmdldDogc3RyaW5nLFxuICAgIHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGNhbm9uaWNhbFRhcmdldCA9IGF3YWl0IGZzLnJlYWxwYXRoKHRhcmdldCk7XG4gICAgaWYgKCFpc1dpdGhpbihjYW5vbmljYWxSb290LCBjYW5vbmljYWxUYXJnZXQpKSB0aHJvdyBpbnZhbGlkQ2RkUGF0aChyZWxhdGl2ZVBhdGgpO1xuICAgIHJldHVybiBjYW5vbmljYWxUYXJnZXQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFzeW5jIHJlYWREaXJlY3RvcnkocmVsYXRpdmVQYXRoOiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IHsgY2Fub25pY2FsUm9vdCwgdGFyZ2V0IH0gPSBhd2FpdCByZXNvbHZlQm91bmRhcnkocmVsYXRpdmVQYXRoKTtcbiAgICAgIGNvbnN0IGNhbm9uaWNhbFRhcmdldCA9IGF3YWl0IGFzc2VydENhbm9uaWNhbFBhdGgoY2Fub25pY2FsUm9vdCwgdGFyZ2V0LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgbGV0IGRpcmVjdG9yeTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRpcmVjdG9yeSA9IGF3YWl0IGZzLm9wZW5kaXIodGFyZ2V0KTtcbiAgICAgICAgY29uc3QgcmVjaGVja2VkVGFyZ2V0ID0gYXdhaXQgYXNzZXJ0Q2Fub25pY2FsUGF0aChjYW5vbmljYWxSb290LCB0YXJnZXQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIGlmIChyZWNoZWNrZWRUYXJnZXQgIT09IGNhbm9uaWNhbFRhcmdldCkgdGhyb3cgaW52YWxpZENkZFBhdGgocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IFtdO1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgZGlyZWN0b3J5LnJlYWQoKTtcbiAgICAgICAgICBpZiAoZW50cnkgPT09IG51bGwpIHJldHVybiBlbnRyaWVzO1xuICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IGRpcmVjdG9yeT8uY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIHJlYWQocmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgY29uc3QgeyBjYW5vbmljYWxSb290LCB0YXJnZXQgfSA9IGF3YWl0IHJlc29sdmVCb3VuZGFyeShyZWxhdGl2ZVBhdGgpO1xuICAgICAgY29uc3QgY2Fub25pY2FsVGFyZ2V0ID0gYXdhaXQgYXNzZXJ0Q2Fub25pY2FsUGF0aChjYW5vbmljYWxSb290LCB0YXJnZXQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICBsZXQgaGFuZGxlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8g7LWc7KKFIHN5bWxpbmvrpbwg65Sw65286rCA7KeAIOyViuydgCBkZXNjcmlwdG9y66W8IOyXsCDrkqQg7Iuk7KCcIOqyveuhnOulvCDri6Tsi5wg7ZmV7J247ZWp64uI64ukLlxuICAgICAgICBoYW5kbGUgPSBhd2FpdCBmcy5vcGVuKHRhcmdldCwgY29uc3RhbnRzLk9fUkRPTkxZIHwgY29uc3RhbnRzLk9fTk9GT0xMT1cpO1xuICAgICAgICBjb25zdCByZWNoZWNrZWRUYXJnZXQgPSBhd2FpdCBhc3NlcnRDYW5vbmljYWxQYXRoKGNhbm9uaWNhbFJvb3QsIHRhcmdldCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgICAgaWYgKHJlY2hlY2tlZFRhcmdldCAhPT0gY2Fub25pY2FsVGFyZ2V0KSB0aHJvdyBpbnZhbGlkQ2RkUGF0aChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICByZXR1cm4gYXdhaXQgaGFuZGxlLnJlYWRGaWxlKFwidXRmOFwiKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFNBRkVUWTogbm9kZTpmcyBvcGVuIOyLpO2MqOydmCBjb2Rl66eMIOydveyWtCBzeW1saW5rIOqxsOu2gOulvCDsoJXqt5ztmZTtlanri4jri6QuXG4gICAgICAgIGlmICgoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBcIkVMT09QXCIpIHtcbiAgICAgICAgICB0aHJvdyBpbnZhbGlkQ2RkUGF0aChyZWxhdGl2ZVBhdGgsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZT8uY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgd3JpdGUocmVsYXRpdmVQYXRoOiBzdHJpbmcsIGNvbnRlbnRzOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHsgY2Fub25pY2FsUm9vdCwgdGFyZ2V0IH0gPSBhd2FpdCByZXNvbHZlQm91bmRhcnkocmVsYXRpdmVQYXRoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgbmVhcmVzdEV4aXN0aW5nUGF0aChmcywgdGFyZ2V0KTtcbiAgICAgIGNvbnN0IGNhbm9uaWNhbEV4aXN0aW5nID0gYXdhaXQgYXNzZXJ0Q2Fub25pY2FsUGF0aChjYW5vbmljYWxSb290LCBleGlzdGluZywgcmVsYXRpdmVQYXRoKTtcbiAgICAgIGNvbnN0IHRhcmdldEV4aXN0cyA9IGV4aXN0aW5nID09PSB0YXJnZXQ7XG5cbiAgICAgIGlmICghdGFyZ2V0RXhpc3RzKSB7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHBhdGguZGlybmFtZSh0YXJnZXQpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgYXNzZXJ0Q2Fub25pY2FsUGF0aChjYW5vbmljYWxSb290LCBwYXRoLmRpcm5hbWUodGFyZ2V0KSwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGhhbmRsZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIOqygOymnSDsoIQgdHJ1bmNhdGXrpbwg7ZS87ZWY6rOgIOyDiCDtjIzsnbzsnYAg67Cw7YOA7KCB7Jy866GcIOyDneyEse2VqeuLiOuLpC5cbiAgICAgICAgY29uc3QgZmxhZ3MgPSB0YXJnZXRFeGlzdHNcbiAgICAgICAgICA/IGNvbnN0YW50cy5PX1dST05MWSB8IGNvbnN0YW50cy5PX05PRk9MTE9XXG4gICAgICAgICAgOiBjb25zdGFudHMuT19XUk9OTFkgfCBjb25zdGFudHMuT19DUkVBVCB8IGNvbnN0YW50cy5PX0VYQ0wgfCBjb25zdGFudHMuT19OT0ZPTExPVztcbiAgICAgICAgaGFuZGxlID0gYXdhaXQgZnMub3Blbih0YXJnZXQsIGZsYWdzLCAwbzY2Nik7XG4gICAgICAgIGNvbnN0IGNhbm9uaWNhbFRhcmdldCA9IGF3YWl0IGFzc2VydENhbm9uaWNhbFBhdGgoY2Fub25pY2FsUm9vdCwgdGFyZ2V0LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWlzV2l0aGluKGNhbm9uaWNhbFJvb3QsIGNhbm9uaWNhbFRhcmdldCkgfHxcbiAgICAgICAgICAodGFyZ2V0RXhpc3RzICYmIGNhbm9uaWNhbFRhcmdldCAhPT0gY2Fub25pY2FsRXhpc3RpbmcpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IGludmFsaWRDZGRQYXRoKHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgaGFuZGxlLnRydW5jYXRlKDApO1xuICAgICAgICBhd2FpdCBoYW5kbGUud3JpdGVGaWxlKGNvbnRlbnRzLCBcInV0ZjhcIik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBTQUZFVFk6IG5vZGU6ZnMgb3BlbiDsi6TtjKjsnZggY29kZeunjCDsnb3slrQgc3ltbGluayDqsbDrtoDrpbwg7KCV6rec7ZmU7ZWp64uI64ukLlxuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gXCJFTE9PUFwiKSB7XG4gICAgICAgICAgdGhyb3cgaW52YWxpZENkZFBhdGgocmVsYXRpdmVQYXRoLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBoYW5kbGU/LmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxudHlwZSBDZGRSdWxlRG9jdW1lbnQgPSB7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBydWxlcz86IEFycmF5PHsgaWQ6IHN0cmluZzsgd2hlbjogc3RyaW5nOyBpbnN0cnVjdGlvbjogc3RyaW5nOyBleGFtcGxlcz86IHN0cmluZ1tdIH0+O1xufTtcblxuZnVuY3Rpb24gcGFyc2VDZGRSdWxlcyhjb250ZW50czogc3RyaW5nKTogQ2RkUnVsZURvY3VtZW50IHtcbiAgdHJ5IHtcbiAgICAvLyBTQUZFVFk6IENERCDqt5zsuZkg7IaM67mEIOyngOygkOydgCDshKDtg50g7ZWE65Oc66eMIOydveqzoCDrsLDsl7Qg67aA7J6s66W8IOq4sOuzuOqwkuycvOuhnCDsspjrpqztlanri4jri6QuXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudHMpIGFzIENkZFJ1bGVEb2N1bWVudDtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIkNERCBydWxlcyBKU09OIGlzIG1hbGZvcm1lZFwiKSwge1xuICAgICAgY29kZTogXCJJTlZBTElEX0NERF9SVUxFU1wiLFxuICAgICAgZXhpdENvZGU6IDIsXG4gICAgICBjYXVzZSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIOq3nOy5mSDrrLjshJzrpbwg7J2965CYLCDslYTsp4Eg7YyM7J287J20IOyXhuycvOuptCDruYgg66y47ISc66GcIOy3qOq4ie2VqeuLiOuLpC5cbiAqXG4gKiDssqsg6rec7LmZIOuTseuhnSDsi5wgcnVsZXMg65SU66CJ7YSw66as7JmAIO2MjOydvOydtCDsl4bripQg7IOB7YOc66W8IOu2gO2KuOyKpO2KuOueqe2VmOq4sCDsnITtlZwg7LKY66as7J2066mwLFxuICog6rmo7KeEIEpTT07snYAg6re464yA66GcIElOVkFMSURfQ0REX1JVTEVT66GcIOyLpO2MqOyLnOy8nCDrja7slrTsk7DquLDrpbwg66eJ7Iq164uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkQ2RkUnVsZURvY3VtZW50KFxuICBmaWxlczogeyByZWFkKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IH0sXG4gIHJlbGF0aXZlUGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTxDZGRSdWxlRG9jdW1lbnQ+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGFyc2VDZGRSdWxlcyhhd2FpdCBmaWxlcy5yZWFkKHJlbGF0aXZlUGF0aCkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFNBRkVUWTogbm9kZTpmcyDsnb3quLAg7Iuk7Yyo7J2YIGNvZGXrp4wg7J297Ja0IOq3nOy5mSDrrLjshJwg67aA7J6s66W8IOq1rOu2hO2VqeuLiOuLpC5cbiAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHt9O1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0Q2RkVG9vbGluZ0FkYXB0ZXIoe1xuICBjb250cmFjdFJvb3QsXG4gIGZzID0gZGVmYXVsdEZzLFxufToge1xuICBjb250cmFjdFJvb3Q6IHN0cmluZztcbiAgZnM/OiBDZGRGaWxlU3lzdGVtO1xufSkge1xuICBjb25zdCBmaWxlcyA9IGNyZWF0ZUNkZEZpbGVPcGVyYXRpb24oeyBjb250cmFjdFJvb3QsIGZzIH0pO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgcmVhZChpbnB1dDogeyBwYXRoOiBzdHJpbmcgfSkge1xuICAgICAgcmV0dXJuIHsgY29udGVudDogYXdhaXQgZmlsZXMucmVhZChpbnB1dC5wYXRoKSwgZmlsZVR5cGU6IFwiY29udHJhY3RcIiBhcyBjb25zdCB9O1xuICAgIH0sXG4gICAgYXN5bmMgcnVsZXMoKSB7XG4gICAgICBsZXQgZW50cmllcztcbiAgICAgIHRyeSB7XG4gICAgICAgIGVudHJpZXMgPSBhd2FpdCBmaWxlcy5yZWFkRGlyZWN0b3J5KFwicnVsZXNcIik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBTQUZFVFk6IG5vZGU6ZnMg65SU66CJ7YSw66asIOyhsO2ajCDsi6TtjKjsnZggY29kZeunjCDsnb3slrQg6rec7LmZIOuUlOugie2EsOumrCDrtoDsnqzrpbwg6rWs67aE7ZWp64uI64ukLlxuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHsgcnVsZXM6IFtdIH07XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBydWxlcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIucnVsZXMuanNvblwiKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IGtleSA9IGVudHJ5Lm5hbWUucmVwbGFjZSgvXFwucnVsZXNcXC5qc29uJC8sIFwiXCIpO1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBgcnVsZXMvJHtlbnRyeS5uYW1lfWA7XG4gICAgICAgIGNvbnN0IGRvY3VtZW50ID0gcGFyc2VDZGRSdWxlcyhhd2FpdCBmaWxlcy5yZWFkKHJlbGF0aXZlUGF0aCkpO1xuICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgcGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBkb2N1bWVudC5kZXNjcmlwdGlvbiA/PyBcIlwiLFxuICAgICAgICAgIHJ1bGVDb3VudDogZG9jdW1lbnQucnVsZXM/Lmxlbmd0aCA/PyAwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHJ1bGVzIH07XG4gICAgfSxcbiAgICBhc3luYyBzaG93UnVsZShpbnB1dDogeyBydWxlSWQ6IHN0cmluZyB9KSB7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBgcnVsZXMvJHtpbnB1dC5ydWxlSWR9LnJ1bGVzLmpzb25gO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBpbnB1dC5ydWxlSWQsXG4gICAgICAgIHBhdGg6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgLi4ucGFyc2VDZGRSdWxlcyhhd2FpdCBmaWxlcy5yZWFkKHJlbGF0aXZlUGF0aCkpLFxuICAgICAgfTtcbiAgICB9LFxuICAgIGFzeW5jIGFkZFJ1bGUoaW5wdXQ6IHtcbiAgICAgIHJ1bGVLZXk6IHN0cmluZztcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgICB3aGVuOiBzdHJpbmc7XG4gICAgICB0ZXh0OiBzdHJpbmc7XG4gICAgICBleGFtcGxlcz86IHN0cmluZ1tdO1xuICAgICAgZHJ5UnVuOiBib29sZWFuO1xuICAgIH0pIHtcbiAgICAgIGNvbnN0IHJ1bGUgPSB7IHJ1bGVLZXk6IGlucHV0LnJ1bGVLZXksIGlkOiBpbnB1dC5pZCwgd2hlbjogaW5wdXQud2hlbiwgdGV4dDogaW5wdXQudGV4dCB9O1xuICAgICAgaWYgKGlucHV0LmRyeVJ1bikgcmV0dXJuIHsgZHJ5UnVuOiB0cnVlIGFzIGNvbnN0LCBydWxlIH07XG5cbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGBydWxlcy8ke2lucHV0LnJ1bGVLZXl9LnJ1bGVzLmpzb25gO1xuICAgICAgY29uc3QgZG9jdW1lbnQgPSBhd2FpdCByZWFkQ2RkUnVsZURvY3VtZW50KGZpbGVzLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgZG9jdW1lbnQucnVsZXMgPz89IFtdO1xuICAgICAgZG9jdW1lbnQucnVsZXMucHVzaCh7XG4gICAgICAgIGlkOiBpbnB1dC5pZCxcbiAgICAgICAgd2hlbjogaW5wdXQud2hlbixcbiAgICAgICAgaW5zdHJ1Y3Rpb246IGlucHV0LnRleHQsXG4gICAgICAgIGV4YW1wbGVzOiBpbnB1dC5leGFtcGxlcyA/PyBbXSxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgZmlsZXMud3JpdGUocmVsYXRpdmVQYXRoLCBgJHtKU09OLnN0cmluZ2lmeShkb2N1bWVudCwgbnVsbCwgMil9XFxuYCk7XG4gICAgICByZXR1cm4geyBrZXk6IGlucHV0LnJ1bGVLZXksIHBhdGg6IHJlbGF0aXZlUGF0aCwgLi4uZG9jdW1lbnQgfTtcbiAgICB9LFxuICAgIGFzeW5jIGFkZEFjY2VwdGFuY2VDcml0ZXJpb24oaW5wdXQ6IHsgZG9jdW1lbnQ6IHN0cmluZzsgdGV4dDogc3RyaW5nOyBkcnlSdW46IGJvb2xlYW4gfSkge1xuICAgICAgaWYgKGlucHV0LmRyeVJ1bilcbiAgICAgICAgcmV0dXJuIHsgb3BlcmF0aW9uOiBcImFkZEFjY2VwdGFuY2VDcml0ZXJpb25cIiBhcyBjb25zdCwgaW5wdXQsIGRyeVJ1bjogdHJ1ZSB9O1xuICAgICAgY29uc3QgY29udGVudHMgPSBhd2FpdCBmaWxlcy5yZWFkKGlucHV0LmRvY3VtZW50KTtcbiAgICAgIGF3YWl0IGZpbGVzLndyaXRlKGlucHV0LmRvY3VtZW50LCBgJHtjb250ZW50c31cXG4tICR7aW5wdXQudGV4dH1cXG5gKTtcbiAgICAgIHJldHVybiB7IGRvY3VtZW50OiBpbnB1dC5kb2N1bWVudCwgdGV4dDogaW5wdXQudGV4dCwgYXBwbGllZDogdHJ1ZSBhcyBjb25zdCB9O1xuICAgIH0sXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFNQSxTQUFTLGVBQWUsY0FBc0IsT0FBd0I7Q0FDcEUsT0FBTyxPQUFPLHVCQUFPLElB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
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- //#region src/tooling/cli-tooling.ts
2
+ // src/tooling/cli-tooling.ts
3
3
  const jsonValueSchema = z.json();
4
4
  const MIGRATION_TARGETS = /* @__PURE__ */ new Set([
5
5
  "development",
@@ -910,7 +910,6 @@ Object.defineProperty(tooling.migration, "apply", {
910
910
  enumerable: false,
911
911
  value: (input) => invokeDefault("migration", "apply", input)
912
912
  });
913
- //#endregion
914
913
  export { tooling };
915
914
 
916
915
  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXRvb2xpbmcuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xpbmcvY2xpLXRvb2xpbmcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdHlwZSBGaXh0dXJlQ29tbWFuZE9wdGlvbnMgfSBmcm9tIFwiLi4vYmluL2ZpeHR1cmVcIjtcbmltcG9ydCB7IHR5cGUgVGVtcGxhdGVLZXkgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuY29uc3QganNvblZhbHVlU2NoZW1hID0gei5qc29uKCk7XG50eXBlIENvbW1hbmRWYWx1ZSA9IHouaW5mZXI8dHlwZW9mIGpzb25WYWx1ZVNjaGVtYT4gfCB1bmRlZmluZWQ7XG50eXBlIENvbW1hbmRJbnB1dCA9IFJlY29yZDxzdHJpbmcsIENvbW1hbmRWYWx1ZT47XG50eXBlIFRvb2xpbmdSZXN1bHQgPSBvYmplY3QgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHZvaWQgfCBBc3luY0l0ZXJhYmxlPG9iamVjdD47XG50eXBlIFRvb2xpbmdPcGVyYXRpb24gPSAoaW5wdXQ6IENvbW1hbmRJbnB1dCkgPT4gVG9vbGluZ1Jlc3VsdCB8IFByb21pc2U8VG9vbGluZ1Jlc3VsdD47XG50eXBlIFRvb2xpbmdHcm91cCA9IFJlY29yZDxzdHJpbmcsIFRvb2xpbmdPcGVyYXRpb24+O1xuZXhwb3J0IHR5cGUgQ2xpVG9vbGluZ09wZXJhdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBUb29saW5nR3JvdXA+O1xuXG50eXBlIE1pZ3JhdGlvblRhcmdldCA9IFwiZGV2ZWxvcG1lbnRcIiB8IFwic3RhZ2luZ1wiIHwgXCJwcm9kdWN0aW9uXCIgfCBcImZpeHR1cmVcIiB8IFwidGVzdFwiO1xuXG5jb25zdCBNSUdSQVRJT05fVEFSR0VUUyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gIFwiZGV2ZWxvcG1lbnRcIixcbiAgXCJzdGFnaW5nXCIsXG4gIFwicHJvZHVjdGlvblwiLFxuICBcImZpeHR1cmVcIixcbiAgXCJ0ZXN0XCIsXG5dKTtcblxuZnVuY3Rpb24gYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KHRhcmdldDogc3RyaW5nKTogYXNzZXJ0cyB0YXJnZXQgaXMgTWlncmF0aW9uVGFyZ2V0IHtcbiAgLy8gREIg7IOB7YOc66W8IOyhsO2ajO2VmOqxsOuCmCDrs4Dqsr3tlZjquLAg7KCE7JeQIOuqqOuToCDsmbjrtoAg64yA7IOB7J2EIOqygOymne2VqeuLiOuLpC5cbiAgaWYgKE1JR1JBVElPTl9UQVJHRVRTLmhhcyh0YXJnZXQpKSByZXR1cm47XG4gIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBVbnN1cHBvcnRlZCBtaWdyYXRpb24gdGFyZ2V0OiAke3RhcmdldH1gKSwge1xuICAgIGNvZGU6IFwiSU5WQUxJRF9NSUdSQVRJT05fVEFSR0VUXCIsXG4gICAgZXhpdENvZGU6IDIsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRTaGFkb3dNaWdyYXRpb25UYXJnZXQoXG4gIHRhcmdldDogTWlncmF0aW9uVGFyZ2V0LFxuKTogYXNzZXJ0cyB0YXJnZXQgaXMgRXh0cmFjdDxNaWdyYXRpb25UYXJnZXQsIFwiZml4dHVyZVwiIHwgXCJ0ZXN0XCI+IHtcbiAgaWYgKHRhcmdldCA9PT0gXCJmaXh0dXJlXCIgfHwgdGFyZ2V0ID09PSBcInRlc3RcIikgcmV0dXJuO1xuXG4gIC8vIFNoYWRvdyBEQuuKlCDsmrTsmIEg6rOE7Je0IOyXsOqysOyXkCDsoJHqt7ztlZjquLAg7KCE7JeQIO2XiOyaqSDrjIDsg4HsnYQg7KCc7ZWc7ZWp64uI64ukLlxuICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgSW52YWxpZCBzaGFkb3cgbWlncmF0aW9uIHRhcmdldDogJHt0YXJnZXR9YCksIHtcbiAgICBjb2RlOiBcIklOVkFMSURfU0hBRE9XX01JR1JBVElPTl9UQVJHRVRcIixcbiAgICB0YXJnZXQsXG4gICAgZXhpdENvZGU6IDIsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRpb25QbGFuKFxuICB0YXJnZXQ6IE1pZ3JhdGlvblRhcmdldCxcbiAgbWlncmF0aW9uczogc3RyaW5nW10sXG4gIGFjdGlvbjogXCJhcHBseVwiIHwgXCJyb2xsYmFja1wiID0gXCJhcHBseVwiLFxuKSB7XG4gIGNvbnN0IGRpZ2VzdCA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KFxuICAgIFwiU0hBLTI1NlwiLFxuICAgIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeSh7IGFjdGlvbiwgdGFyZ2V0LCBtaWdyYXRpb25zIH0pKSxcbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBraW5kOiBcIm1pZ3JhdGlvbi1wbGFuXCIgYXMgY29uc3QsXG4gICAgYWN0aW9uLFxuICAgIHRhcmdldCxcbiAgICBtaWdyYXRpb25zLFxuICAgIGZpbmdlcnByaW50OiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGRpZ2VzdCksIChieXRlKSA9PlxuICAgICAgYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpLFxuICAgICkuam9pbihcIlwiKSxcbiAgfTtcbn1cblxuY29uc3QgUkVRVUlSRURfTUVUSE9EUyA9IHtcbiAgY29yZTogW1wic3luY1wiXSxcbiAgZW50aXR5OiBbXCJsaXN0XCIsIFwic2hvd1wiLCBcInNlYXJjaFwiLCBcImFwcGx5UGF0Y2hcIiwgXCJjcmVhdGVcIiwgXCJjb25lc1wiXSxcbiAgc2NhZmZvbGQ6IFtcIm1vZGVsXCIsIFwibW9kZWxfdGVzdFwiLCBcInZpZXdfbGlzdFwiLCBcInZpZXdfZm9ybVwiLCBcInN0YXR1c1wiLCBcInByZXZpZXdcIiwgXCJiYXRjaFwiXSxcbiAgbWlncmF0aW9uOiBbXCJydW5cIiwgXCJnZW5lcmF0ZVwiLCBcInN0YXR1c1wiLCBcImNvbm5lY3Rpb25zXCIsIFwiY29kZVwiLCBcInByZXZpZXdcIiwgXCJzaGFkb3dcIiwgXCJyb2xsYmFja1wiXSxcbiAgZml4dHVyZTogW1wiaW5pdFwiLCBcImltcG9ydFwiLCBcInN5bmNcIiwgXCJnZW5cIiwgXCJmZXRjaFwiLCBcImV4cGxvcmVcIl0sXG4gIGJ1aWxkOiBbXCJhbGxcIiwgXCJhcGlcIiwgXCJ3ZWJcIl0sXG4gIHRlc3Q6IFtcInJ1blwiLCBcInN0YXR1c1wiXSxcbiAgYXV0aDogW1wiZ2VuZXJhdGVcIiwgXCJhZGRDb21wYW5pb25zXCJdLFxuICBpMThuOiBbXCJsaXN0XCIsIFwiY2hlY2tcIiwgXCJpbXBvcnRcIiwgXCJleHBvcnRcIiwgXCJjcmVhdGVcIiwgXCJ1cGRhdGVcIiwgXCJyZW1vdmVcIl0sXG4gIHRhc2s6IFtcImRlZmluaXRpb25zXCIsIFwicnVuc1wiLCBcInNob3dcIiwgXCJzdGVwc1wiLCBcIndhdGNoXCIsIFwicGF1c2VcIiwgXCJyZXN1bWVcIiwgXCJjYW5jZWxcIl0sXG4gIGNkZDogW1widHJlZVwiLCBcInJlYWRcIiwgXCJydWxlc1wiLCBcInNob3dSdWxlXCIsIFwiYWRkUnVsZVwiLCBcImFkZEFjY2VwdGFuY2VDcml0ZXJpb25cIl0sXG4gIHN0dWI6IFtcInByYWN0aWNlXCJdLFxufSBhcyBjb25zdDtcblxubGV0IGluaXRpYWxpemF0aW9uOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVTb25hbXUoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgU29uYW11IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9hcGkvc29uYW11XCIpO1xuICBpZiAoU29uYW11LmlzSW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgaW5pdGlhbGl6YXRpb24gPz89IFNvbmFtdS5pbml0KHRydWUsIGZhbHNlKTtcbiAgYXdhaXQgaW5pdGlhbGl6YXRpb247XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN5bmNPcGVyYXRpb24oaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBhd2FpdCBlbnN1cmVTb25hbXUoKTtcbiAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG4gIHJldHVybiBpbnB1dC5mb3JjZSA9PT0gdHJ1ZSA/IFNvbmFtdS5zeW5jZXIuZm9yY2VTeW5jKCkgOiBTb25hbXUuc3luY2VyLnN5bmMoKTtcbn1cblxuZnVuY3Rpb24gdGV4dChpbnB1dDogQ29tbWFuZElucHV0LCBrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gei5zdHJpbmcoKS5zYWZlUGFyc2UoaW5wdXRba2V5XSk7XG4gIHJldHVybiB2YWx1ZS5zdWNjZXNzID8gdmFsdWUuZGF0YSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc3RyaW5ncyhpbnB1dDogQ29tbWFuZElucHV0LCBrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWUgPSB6LmFycmF5KHouc3RyaW5nKCkpLnNhZmVQYXJzZShpbnB1dFtrZXldKTtcbiAgcmV0dXJuIHZhbHVlLnN1Y2Nlc3MgPyB2YWx1ZS5kYXRhIDogW107XG59XG5cbmZ1bmN0aW9uIHJlcXVpcmVkVGV4dChpbnB1dDogQ29tbWFuZElucHV0LCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gdGV4dChpbnB1dCwga2V5KTtcbiAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubGVuZ3RoID4gMCkgcmV0dXJuIHZhbHVlO1xuICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgTWlzc2luZyAke2tleX0uYCksIHsgY29kZTogXCJNSVNTSU5HX0FSR1VNRU5UXCIsIGV4aXRDb2RlOiAyIH0pO1xufVxuXG4vKipcbiAqIOyDneuete2VnCDqsJLsnYAgYHVuZGVmaW5lZGDroZwg7Ya16rO87Iuc7YKk65CYLCDqsJLsnbQg7J6I64qU642wIOusuOyekOyXtOydtCDslYTri4jrqbQg7J247J6QIOyYpOulmOuhnCDqsbDsoIjtlanri4jri6QuXG4gKlxuICogYHRleHQoKWDsspjrn7wg7KGw7Jqp7Z6IIOustOyLnO2VmOuptCDsnpjrqrvrkJwg7YOA7J6F7J2YIOyeheugpeydtCDquLDrs7jqsJLsnLzroZwg65GU6rCR7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBvcHRpb25hbFRleHQoaW5wdXQ6IENvbW1hbmRJbnB1dCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB2YWx1ZSA9IGlucHV0W2tleV07XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJzZWQgPSB6LnN0cmluZygpLnNhZmVQYXJzZSh2YWx1ZSk7XG4gIGlmIChwYXJzZWQuc3VjY2VzcykgcmV0dXJuIHBhcnNlZC5kYXRhO1xuICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgSW52YWxpZCAke2tleX0uYCksIHsgY29kZTogXCJJTlZBTElEX0FSR1VNRU5UXCIsIGV4aXRDb2RlOiAyIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZUpzb248U2NoZW1hIGV4dGVuZHMgei5ab2RUeXBlPihcbiAgY29udGVudHM6IHN0cmluZyxcbiAgY29kZTogc3RyaW5nLFxuICBzY2hlbWE6IFNjaGVtYSxcbik6IHouaW5mZXI8U2NoZW1hPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHNjaGVtYS5wYXJzZShKU09OLnBhcnNlKGNvbnRlbnRzKSk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoXCJJbnZhbGlkIEpTT04gaW5wdXQuXCIpLCB7IGNvZGUsIGV4aXRDb2RlOiAyLCBjYXVzZSB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtdXRhdGlvblJlcXVlc3RlZChpbnB1dDogQ29tbWFuZElucHV0KTogYm9vbGVhbiB7XG4gIHJldHVybiBpbnB1dC5leGVjdXRlID09PSB0cnVlIHx8IGlucHV0LmRyeVJ1biA9PT0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQ6IENvbW1hbmRJbnB1dCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaW5wdXQuZHJ5UnVuID09PSB0cnVlIHx8IGlucHV0LmV4ZWN1dGUgPT09IGZhbHNlO1xufVxuXG5jb25zdCBlbnRpdHlQYXRjaFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZW50aXR5SWQ6IHouc3RyaW5nKCkubWluKDEpLFxuICBvcGVyYXRpb25zOiB6LmFycmF5KFxuICAgIHoub2JqZWN0KHtcbiAgICAgIG9wOiB6LmxpdGVyYWwoXCJhZGRcIiksXG4gICAgICBwYXRoOiB6LmxpdGVyYWwoXCIvcHJvcHMvLVwiKSxcbiAgICAgIHZhbHVlOiB6XG4gICAgICAgIC5vYmplY3QoeyBuYW1lOiB6LnN0cmluZygpLm1pbigxKSwgdHlwZTogei5zdHJpbmcoKS5taW4oMSkgfSlcbiAgICAgICAgLmNhdGNoYWxsKGpzb25WYWx1ZVNjaGVtYSksXG4gICAgfSksXG4gICksXG59KTtcbmNvbnN0IGkxOG5FbnRyaWVzU2NoZW1hID0gei5hcnJheShcbiAgei5vYmplY3QoeyBrZXk6IHouc3RyaW5nKCksIHZhbHVlczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5zdHJpbmcoKSkgfSksXG4pO1xuY29uc3QgZGljdGlvbmFyeVZhbHVlc1NjaGVtYSA9IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpO1xuY29uc3QgZGljdGlvbmFyeVNvdXJjZVNjaGVtYSA9IHouZW51bShbXCJlbnRpdHlcIiwgXCJwcm9qZWN0XCIsIFwic29uYW11XCJdKTtcbmNvbnN0IGNvbmVMb2NhbGVTY2hlbWEgPSB6LmVudW0oW1wia29cIiwgXCJlblwiLCBcImphXCJdKTtcblxuLyoqXG4gKiBjb25lIOyDneyEseyXkCDsgqzsmqntlaAgbG9jYWxl7J2EIOqysOygle2VqeuLiOuLpC5cbiAqXG4gKiDrqoXsi5ztlZwgbG9jYWxl7J20IOy1nOyasOyEoOydtOqzoCwg7JeG7Jy866m0IO2UhOuhnOygne2KuCBpMThuIOq4sOuzuCBsb2NhbGUsIOq3uOuniOyggCDsl4bsnLzrqbQgXCJrb1wi66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvbmVMb2NhbGUoaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8ei5pbmZlcjx0eXBlb2YgY29uZUxvY2FsZVNjaGVtYT4+IHtcbiAgY29uc3QgZXhwbGljaXQgPSBjb25lTG9jYWxlU2NoZW1hLnNhZmVQYXJzZShpbnB1dC5sb2NhbGUpO1xuICBpZiAoZXhwbGljaXQuc3VjY2VzcykgcmV0dXJuIGV4cGxpY2l0LmRhdGE7XG5cbiAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG4gIGxldCBjb25maWd1cmVkTG9jYWxlOiB1bmtub3duO1xuICB0cnkge1xuICAgIGNvbmZpZ3VyZWRMb2NhbGUgPSBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gIH0gY2F0Y2gge1xuICAgIC8vIOyEpOygleydhCDslYTsp4Eg7J297J2EIOyImCDsl4bripQg7Iuk7ZaJIOqyveuhnOyXkOyEnOuKlCDquLDrs7ggbG9jYWxl66GcIO2PtOuwse2VqeuLiOuLpC5cbiAgfVxuICBjb25zdCBjb25maWd1cmVkID0gY29uZUxvY2FsZVNjaGVtYS5zYWZlUGFyc2UoY29uZmlndXJlZExvY2FsZSk7XG4gIHJldHVybiBjb25maWd1cmVkLnN1Y2Nlc3MgPyBjb25maWd1cmVkLmRhdGEgOiBcImtvXCI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGVudGl0eU9wZXJhdGlvbihtZXRob2Q6IHN0cmluZywgaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBhd2FpdCBlbnN1cmVTb25hbXUoKTtcbiAgY29uc3QgeyBFbnRpdHlNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIik7XG4gIGNvbnN0IGVudGl0aWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuXG4gIGlmIChtZXRob2QgPT09IFwibGlzdFwiKSByZXR1cm4gZW50aXRpZXMubWFwKChlbnRpdHkpID0+IGVudGl0eS50b0pzb24oKSk7XG4gIGlmIChtZXRob2QgPT09IFwic2hvd1wiKSB7XG4gICAgY29uc3QgZW50aXR5SWQgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwiZW50aXR5SWRcIik7XG4gICAgaWYgKCFFbnRpdHlNYW5hZ2VyLmV4aXN0cyhlbnRpdHlJZCkpIHtcbiAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBFbnRpdHkgbm90IGZvdW5kOiAke2VudGl0eUlkfWApLCB7XG4gICAgICAgIGNvZGU6IFwiRU5USVRZX05PVF9GT1VORFwiLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkudG9Kc29uKCk7XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJzZWFyY2hcIikge1xuICAgIGNvbnN0IHF1ZXJ5ID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcInF1ZXJ5XCIpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIGVudGl0aWVzXG4gICAgICAubWFwKChlbnRpdHkpID0+IGVudGl0eS50b0pzb24oKSlcbiAgICAgIC5maWx0ZXIoKGVudGl0eSkgPT4gSlNPTi5zdHJpbmdpZnkoZW50aXR5KS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSk7XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJjcmVhdGVcIikge1xuICAgIGNvbnN0IGVudGl0eUlkID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcIm5hbWVcIik7XG4gICAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG4gICAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyBlbnRpdHlJZCwgdGl0bGU6IGVudGl0eUlkIH0pO1xuICAgIGlmIChpbnB1dC5ub0NvbmVzID09PSB0cnVlKSByZXR1cm4geyBlbnRpdHlJZCwgY29uZXM6IFwic2tpcHBlZFwiIH07XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgIGlmIChpbnB1dC5haSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgICAgcHJlc2VydmVFeGlzdGluZzogZmFsc2UsXG4gICAgICAgIG9ubHlFbXB0eTogZmFsc2UsXG4gICAgICAgIGxvY2FsZTogYXdhaXQgcmVzb2x2ZUNvbmVMb2NhbGUoaW5wdXQpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGF3YWl0IGVudGl0eS5nZW5lcmF0ZVRlbXBsYXRlQ29uZXMoKTtcbiAgICByZXR1cm4geyBlbnRpdHlJZCwgY29uZXM6IFwidGVtcGxhdGVcIiB9O1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwiY29uZXNcIikge1xuICAgIGNvbnN0IGVudGl0eUlkID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcImVudGl0eUlkXCIpO1xuICAgIGNvbnN0IHRhcmdldHMgPVxuICAgICAgaW5wdXQuYWxsID09PSB0cnVlIHx8IGVudGl0eUlkID09PSBcImFsbFwiXG4gICAgICAgID8gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpXG4gICAgICAgIDogRW50aXR5TWFuYWdlci5leGlzdHMoZW50aXR5SWQpXG4gICAgICAgICAgPyBbRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpXVxuICAgICAgICAgIDogW107XG4gICAgaWYgKHRhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlJZH1gKSwge1xuICAgICAgICBjb2RlOiBcIkVOVElUWV9OT1RfRk9VTkRcIixcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCByZWdlbmVyYXRlID0gaW5wdXQucmVnZW5lcmF0ZSA9PT0gdHJ1ZTtcbiAgICBjb25zdCBzZWxlY3RlZExvY2FsZSA9IGF3YWl0IHJlc29sdmVDb25lTG9jYWxlKGlucHV0KTtcbiAgICAvLyDtlZwg7JeU7Yuw7Yuw7J2YIOyLpO2MqOqwgCDrgpjrqLjsp4Ag7JeU7Yuw7Yuw7J2YIGNvbmUg7IOd7ISx7J2EIOy3qOyGjO2VmOyngCDslYrrj4TroZ0g7KCE67aAIOuBneq5jOyngCDsi6Ttlontlanri4jri6QuXG4gICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHRhcmdldHMubWFwKGFzeW5jIChlbnRpdHkpID0+ICh7XG4gICAgICAgIGVudGl0eUlkOiBlbnRpdHkuaWQsXG4gICAgICAgIC4uLihhd2FpdCBlbnRpdHkuZ2VuZXJhdGVDb25lcyh7XG4gICAgICAgICAgcHJlc2VydmVFeGlzdGluZzogIXJlZ2VuZXJhdGUsXG4gICAgICAgICAgb25seUVtcHR5OiAhcmVnZW5lcmF0ZSxcbiAgICAgICAgICBsb2NhbGU6IHNlbGVjdGVkTG9jYWxlLFxuICAgICAgICB9KSksXG4gICAgICB9KSksXG4gICAgKTtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgY29uc3QgZmFpbHVyZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgb3V0Y29tZV0gb2Ygc2V0dGxlZC5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChvdXRjb21lLnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIikge1xuICAgICAgICByZXN1bHRzLnB1c2gob3V0Y29tZS52YWx1ZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZmFpbHVyZXMucHVzaCh7XG4gICAgICAgIGVudGl0eUlkOiB0YXJnZXRzW2luZGV4XS5pZCxcbiAgICAgICAgbWVzc2FnZTogb3V0Y29tZS5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IG91dGNvbWUucmVhc29uLm1lc3NhZ2UgOiBTdHJpbmcob3V0Y29tZS5yZWFzb24pLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChmYWlsdXJlcy5sZW5ndGggPT09IDApIHJldHVybiByZXN1bHRzO1xuICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBDb25lIGdlbmVyYXRpb24gZmFpbGVkIGZvciAke2ZhaWx1cmVzLmxlbmd0aH0gZW50aXR5KHMpLmApLCB7XG4gICAgICBjb2RlOiBcIkNPTkVfR0VORVJBVElPTl9GQUlMRURcIixcbiAgICAgIGRldGFpbHM6IHsgcmVzdWx0cywgZmFpbHVyZXMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGZpbGUgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwiZmlsZVwiKTtcbiAgY29uc3QgeyByZWFkRmlsZSB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgY29uc3QgY29udGVudHMgPVxuICAgIGZpbGUgPT09IFwiLVwiXG4gICAgICA/IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2h1bmtzID0gW107XG4gICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBwcm9jZXNzLnN0ZGluKSBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpO1xuICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICB9KSgpXG4gICAgICA6IGF3YWl0IHJlYWRGaWxlKGZpbGUsIFwidXRmOFwiKTtcbiAgY29uc3QgcGF0Y2ggPSBwYXJzZUpzb24oY29udGVudHMsIFwiSU5WQUxJRF9FTlRJVFlfUEFUQ0hcIiwgZW50aXR5UGF0Y2hTY2hlbWEpO1xuICBpZiAoIUVudGl0eU1hbmFnZXIuZXhpc3RzKHBhdGNoLmVudGl0eUlkKSkge1xuICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBFbnRpdHkgbm90IGZvdW5kOiAke3BhdGNoLmVudGl0eUlkfWApLCB7XG4gICAgICBjb2RlOiBcIkVOVElUWV9OT1RfRk9VTkRcIixcbiAgICB9KTtcbiAgfVxuICBjb25zdCB0YXJnZXQgPSBFbnRpdHlNYW5hZ2VyLmdldChwYXRjaC5lbnRpdHlJZCk7XG4gIGNvbnN0IGJlZm9yZSA9IHRhcmdldC50b0pzb24oKTtcbiAgY29uc3QgYWZ0ZXIgPSBzdHJ1Y3R1cmVkQ2xvbmUoYmVmb3JlKTtcbiAgY29uc3QgbmV4dFByb3BzID0gW1xuICAgIC4uLmFmdGVyLnByb3BzLFxuICAgIC4uLnBhdGNoLm9wZXJhdGlvbnMubWFwKCh7IHZhbHVlIH0pID0+IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkpLFxuICBdO1xuICAvLyDtjIzsnbzsnbTrgpgg65Ox66Gd65CcIOyXlO2LsO2LsOulvCDqsbTrk5zrpqzquLAg7KCE7JeQIHBhdGNoIOyggeyaqSDqsrDqs7wg7KCE7LK066W8IGVudGl0eSDsiqTtgqTrp4jroZwg6rKA7Kad7ZWp64uI64ukLlxuICBjb25zdCB7IEVudGl0eUpzb25TY2hlbWEgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICBjb25zdCB2YWxpZGF0aW9uID0gRW50aXR5SnNvblNjaGVtYS5zYWZlUGFyc2UoeyAuLi5hZnRlciwgcHJvcHM6IG5leHRQcm9wcyB9KTtcbiAgaWYgKCF2YWxpZGF0aW9uLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIkludmFsaWQgZW50aXR5IHBhdGNoLlwiKSwge1xuICAgICAgY29kZTogXCJJTlZBTElEX0VOVElUWV9QQVRDSFwiLFxuICAgICAgZXhpdENvZGU6IDIsXG4gICAgICBjYXVzZTogdmFsaWRhdGlvbi5lcnJvcixcbiAgICB9KTtcbiAgfVxuICAvLyBTQUZFVFk6IEVudGl0eUpzb25TY2hlbWHqsIAgcGF0Y2gg7KCB7JqpIOqysOqzvCDsoITssrTrpbwg6rKA7Kad7ZaI7Iq164uI64ukLlxuICBhZnRlci5wcm9wcyA9IG5leHRQcm9wcyBhcyB0eXBlb2YgYWZ0ZXIucHJvcHM7XG4gIGlmIChtdXRhdGlvblJlcXVlc3RlZChpbnB1dCkpIHtcbiAgICAvLyBTQUZFVFk6IGFmdGVyLnByb3BzIG9yaWdpbmF0ZXMgZnJvbSB0aGUgY3VycmVudCBlbnRpdHkgcGx1cyBzY2hlbWEtdmFsaWRhdGVkIHByb3AgYWRkaXRpb25zLlxuICAgIHRhcmdldC5wcm9wcyA9IGFmdGVyLnByb3BzIGFzIHR5cGVvZiB0YXJnZXQucHJvcHM7XG4gICAgYXdhaXQgdGFyZ2V0LnNhdmUoKTtcbiAgfVxuICByZXR1cm4geyBjaGFuZ2VkOiBwYXRjaC5vcGVyYXRpb25zLmxlbmd0aCA+IDAsIGJlZm9yZSwgYWZ0ZXIgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVuZGVyU2NhZmZvbGRzKGlucHV0OiBDb21tYW5kSW5wdXQpIHtcbiAgYXdhaXQgZW5zdXJlU29uYW11KCk7XG4gIGNvbnN0IHsgcmVuZGVyVGVtcGxhdGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci9jb2RlLWdlbmVyYXRvclwiKTtcbiAgY29uc3QgZW50aXRpZXMgPSBzdHJpbmdzKGlucHV0LCBcImVudGl0aWVzXCIpO1xuICBjb25zdCB0ZW1wbGF0ZXMgPSBzdHJpbmdzKGlucHV0LCBcInRlbXBsYXRlc1wiKTtcbiAgY29uc3QgcmVuZGVyZWQgPSBbXTtcbiAgZm9yIChjb25zdCBlbnRpdHlJZCBvZiBlbnRpdGllcykge1xuICAgIGZvciAoY29uc3QgdGVtcGxhdGUgb2YgdGVtcGxhdGVzKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZUtleSA9IHpcbiAgICAgICAgLmVudW0oW1wibW9kZWxcIiwgXCJtb2RlbF90ZXN0XCIsIFwidmlld19saXN0XCIsIFwidmlld19mb3JtXCIsIFwidmlld19zZWFyY2hfaW5wdXRcIl0pXG4gICAgICAgIC5wYXJzZSh0ZW1wbGF0ZSk7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlbmRlclRlbXBsYXRlKHRlbXBsYXRlS2V5LCB7IGVudGl0eUlkIH0pO1xuICAgICAgcmVuZGVyZWQucHVzaCh7IGVudGl0eUlkLCB0ZW1wbGF0ZTogdGVtcGxhdGVLZXksIGZpbGVzIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVuZGVyZWQ7XG59XG5cbi8qKlxuICog7YWc7ZSM66a/7J20IOyalOq1rO2VmOuKlCBkaWN0IO2CpOulvCDtlITroZzsoJ3tirgg7IKs7KCE7JeQIOyxhOybgeuLiOuLpC5cbiAqXG4gKiDsg53shLEg7L2U65Oc7JeQ64qUIFNEKFwiZXJyb3IuZW50aXR5Tm90Rm91bmRcIikg6rCZ7J2AIO2YuOy2nOydtCDrsJXtnojripTrjbAsIO2CpOqwgCDtlITroZzsoJ3tirgg7IKs7KCE7JeQXG4gKiDsl4bsnLzrqbQg67KI7Jet7J20IOuQmOyngCDslYrslYQg7IKs656M7J20IOunpOuyiCDshpDsnLzroZwg7LGE7Jqw6rGw64KYIOuLpOuluCDtgqTroZwg67CU6r+U7JW8IO2VnOuLpC5cbiAqIFNvbmFtdSBVSSDqsr3roZwodWkvYXBpLnRzKeuKlCDsnbTrr7gg6rCZ7J2AIOyymOumrOulvCDtlZjrr4DroZwsIENMSeuPhCDrj5nsnbztlZjqsowg66ee7LaY64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVUZW1wbGF0ZURpY3RLZXlzKHRlbXBsYXRlS2V5czogVGVtcGxhdGVLZXlbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBbeyBUZW1wbGF0ZU1hbmFnZXIgfSwgeyBzb25hbXVEaWN0aW9uYXJ5IH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGltcG9ydChcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIiksXG4gICAgaW1wb3J0KFwiLi4vZGljdC9zb25hbXUtZGljdGlvbmFyeVwiKSxcbiAgXSk7XG5cbiAgY29uc3QgcmVxdWlyZWRLZXlzID0gdGVtcGxhdGVLZXlzLmZsYXRNYXAoXG4gICAgKHRlbXBsYXRlS2V5KSA9PiBUZW1wbGF0ZU1hbmFnZXIuZ2V0KHRlbXBsYXRlS2V5KS5nZXRSZXF1aXJlZERpY3RLZXlzKCkgPz8gW10sXG4gICk7XG4gIGlmIChyZXF1aXJlZEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgc29uYW11RGljdGlvbmFyeS5lbnN1cmVEaWN0S2V5cyhbLi4ubmV3IFNldChyZXF1aXJlZEtleXMpXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkT3BlcmF0aW9uKG1ldGhvZDogc3RyaW5nLCBpbnB1dDogQ29tbWFuZElucHV0KTogUHJvbWlzZTxUb29saW5nUmVzdWx0PiB7XG4gIGNvbnN0IGRpcmVjdFRlbXBsYXRlID0gelxuICAgIC5lbnVtKFtcIm1vZGVsXCIsIFwibW9kZWxfdGVzdFwiLCBcInZpZXdfbGlzdFwiLCBcInZpZXdfZm9ybVwiXSlcbiAgICAuc2FmZVBhcnNlKG1ldGhvZCk7XG4gIGlmIChkaXJlY3RUZW1wbGF0ZS5zdWNjZXNzKSB7XG4gICAgYXdhaXQgZW5zdXJlU29uYW11KCk7XG4gICAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG4gICAgY29uc3QgZW50aXR5SWQgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwiZW50aXR5SWRcIik7XG4gICAgYXdhaXQgZW5zdXJlVGVtcGxhdGVEaWN0S2V5cyhbZGlyZWN0VGVtcGxhdGUuZGF0YV0pO1xuICAgIHJldHVybiBkaXJlY3RUZW1wbGF0ZS5kYXRhID09PSBcInZpZXdfbGlzdFwiXG4gICAgICA/IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcInZpZXdfbGlzdFwiLCB7IGVudGl0eUlkLCBleHRyYTogaW5wdXQuZXh0cmEgfSlcbiAgICAgIDogU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKGRpcmVjdFRlbXBsYXRlLmRhdGEsIHsgZW50aXR5SWQgfSk7XG4gIH1cbiAgY29uc3QgcmVuZGVyZWQgPSBhd2FpdCByZW5kZXJTY2FmZm9sZHMoaW5wdXQpO1xuICBjb25zdCB7IGFjY2VzcyB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpmcy9wcm9taXNlc1wiKTtcbiAgY29uc3QgcGF0aCA9IGF3YWl0IGltcG9ydChcIm5vZGU6cGF0aFwiKTtcbiAgY29uc3QgeyBTb25hbXUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2FwaS9zb25hbXVcIik7XG4gIGNvbnN0IGl0ZW1zID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcmVuZGVyZWQuZmxhdE1hcCgoeyBlbnRpdHlJZCwgdGVtcGxhdGUsIGZpbGVzIH0pID0+XG4gICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gcGF0aC5kZWZhdWx0LmpvaW4oXG4gICAgICAgICAgU29uYW11LmFwcFJvb3RQYXRoLFxuICAgICAgICAgIGZpbGUucGF0aC5yZXBsYWNlKFwiLzp0YXJnZXQvXCIsIFwiL3dlYi9cIiksXG4gICAgICAgICk7XG4gICAgICAgIGxldCBleGlzdHMgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGFjY2Vzcyh0YXJnZXQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBleGlzdHMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBlbnRpdHlJZCwgdGVtcGxhdGUsIHRhcmdldCwgZXhpc3RzLCBjb250ZW50OiBmaWxlLmNvZGUgfTtcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG4gIGlmIChtZXRob2QgPT09IFwic3RhdHVzXCIpIHJldHVybiBpdGVtcy5tYXAoKHsgY29udGVudDogX2NvbnRlbnQsIC4uLml0ZW0gfSkgPT4gaXRlbSk7XG4gIGlmIChtZXRob2QgPT09IFwicHJldmlld1wiIHx8IChtZXRob2QgPT09IFwiYmF0Y2hcIiAmJiBleHBsaWNpdGx5RHJ5UnVuKGlucHV0KSkpIHJldHVybiBpdGVtcztcblxuICAvLyDsi6TsoJzroZwg7YyM7J287J2EIOyTsOuKlCDqsr3smrDsl5Drp4wg7IKs7KCE7J2EIOqxtOuTnOumsOuLpChzdGF0dXMvcHJldmlldy9kcnktcnVu7J2AIOychOyXkOyEnCDrsJjtmZjrkKgpLlxuICBhd2FpdCBlbnN1cmVUZW1wbGF0ZURpY3RLZXlzKFsuLi5uZXcgU2V0KGl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS50ZW1wbGF0ZSkpXSk7XG5cbiAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICBjb25zdCB7IGNvbnRlbnQ6IF9jb250ZW50LCAuLi5zdW1tYXJ5IH0gPSBpdGVtO1xuICAgIGlmIChpdGVtLmV4aXN0cyAmJiBpbnB1dC5vdmVyd3JpdGUgIT09IHRydWUpIHtcbiAgICAgIHJlc3VsdHMucHVzaCh7IC4uLnN1bW1hcnksIHN0YXR1czogXCJza2lwcGVkXCIgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFxuICAgICAgaXRlbS50ZW1wbGF0ZSxcbiAgICAgIHsgZW50aXR5SWQ6IGl0ZW0uZW50aXR5SWQgfSxcbiAgICAgIHsgb3ZlcndyaXRlOiBpbnB1dC5vdmVyd3JpdGUgPT09IHRydWUgfSxcbiAgICApO1xuICAgIHJlc3VsdHMucHVzaCh7IC4uLnN1bW1hcnksIHN0YXR1czogXCJ3cml0dGVuXCIgfSk7XG4gIH1cbiAgcmV0dXJuIHsgaXRlbXM6IHJlc3VsdHMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0aW9uT3BlcmF0aW9uKG1ldGhvZDogc3RyaW5nLCBpbnB1dDogQ29tbWFuZElucHV0KTogUHJvbWlzZTxUb29saW5nUmVzdWx0PiB7XG4gIGxldCBzaGFkb3dUYXJnZXQ6IEV4dHJhY3Q8TWlncmF0aW9uVGFyZ2V0LCBcImZpeHR1cmVcIiB8IFwidGVzdFwiPiB8IHVuZGVmaW5lZDtcbiAgaWYgKG1ldGhvZCA9PT0gXCJzaGFkb3dcIikge1xuICAgIGNvbnN0IHJlcXVlc3RlZFRhcmdldCA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJ0YXJnZXRcIik7XG4gICAgYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KHJlcXVlc3RlZFRhcmdldCk7XG4gICAgYXNzZXJ0U2hhZG93TWlncmF0aW9uVGFyZ2V0KHJlcXVlc3RlZFRhcmdldCk7XG4gICAgc2hhZG93VGFyZ2V0ID0gcmVxdWVzdGVkVGFyZ2V0O1xuICB9XG5cbiAgYXdhaXQgZW5zdXJlU29uYW11KCk7XG4gIGNvbnN0IHsgTWlncmF0b3IgfSA9IGF3YWl0IGltcG9ydChcIi4uL21pZ3JhdGlvbi9taWdyYXRvclwiKTtcbiAgY29uc3QgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcbiAgaWYgKG1ldGhvZCA9PT0gXCJzdGF0dXNcIikgcmV0dXJuIG1pZ3JhdG9yLmdldFN0YXR1cygpO1xuICBpZiAobWV0aG9kID09PSBcImdlbmVyYXRlXCIpIHtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKTtcbiAgICBpZiAoIXN0YXR1cy5jb25ucy5zb21lKChjb25uZWN0aW9uKSA9PiBjb25uZWN0aW9uLnN0YXR1cyA9PT0gMCkpIHtcbiAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwiUGVuZGluZyBtaWdyYXRpb25zIG11c3QgYmUgYXBwbGllZCBiZWZvcmUgZ2VuZXJhdGlvbi5cIiksIHtcbiAgICAgICAgY29kZTogXCJNSUdSQVRJT05fTk9UX1JFQURZXCIsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgY291bnQ6IGF3YWl0IG1pZ3JhdG9yLmdlbmVyYXRlUHJlcGFyZWRDb2RlcygpIH07XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJydW5cIikge1xuICAgIGlmICghbXV0YXRpb25SZXF1ZXN0ZWQoaW5wdXQpKSByZXR1cm4geyBkcnlSdW46IHRydWUgfTtcbiAgICBjb25zdCB7IGdldFNvbmFtdUVudmlyb25tZW50IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9lbnZcIik7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBnZXRTb25hbXVFbnZpcm9ubWVudCgpO1xuICAgIHJldHVybiBtaWdyYXRvci5hcHBseShlbnZpcm9ubWVudCA9PT0gXCJ0ZXN0XCIgPyBbXCJ0ZXN0XCIsIFwiZml4dHVyZVwiXSA6IFtlbnZpcm9ubWVudF0pO1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwiY29ubmVjdGlvbnNcIikgcmV0dXJuIG1pZ3JhdG9yLmdldENvbm5lY3Rpb25zKCk7XG4gIGlmIChtZXRob2QgPT09IFwiYXBwbHlcIikge1xuICAgIGNvbnN0IHJhd1RhcmdldHMgPSBzdHJpbmdzKGlucHV0LCBcInRhcmdldHNcIik7XG4gICAgaWYgKHJhd1RhcmdldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIk1pc3NpbmcgdGFyZ2V0cy5cIiksIHsgY29kZTogXCJNSVNTSU5HX0FSR1VNRU5UXCIsIGV4aXRDb2RlOiAyIH0pO1xuICAgIH1cbiAgICBjb25zdCB0YXJnZXRzID0gcmF3VGFyZ2V0cy5tYXAoKHRhcmdldCkgPT4ge1xuICAgICAgYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KHRhcmdldCk7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0pO1xuICAgIGlmIChtdXRhdGlvblJlcXVlc3RlZChpbnB1dCkpIHJldHVybiBtaWdyYXRvci5hcHBseSh0YXJnZXRzKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICB0YXJnZXRzLm1hcChhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IG1pZ3JhdG9yLmdldENvbm5lY3Rpb25TdGF0dXModGFyZ2V0KTtcbiAgICAgICAgcmV0dXJuIG1pZ3JhdGlvblBsYW4odGFyZ2V0LCBzdGF0dXMucGVuZGluZyk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwic2hhZG93XCIpIHtcbiAgICBpZiAoc2hhZG93VGFyZ2V0ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihcIlNoYWRvdyB0YXJnZXQgdmFsaWRhdGlvbiB3YXMgc2tpcHBlZC5cIik7XG4gICAgaWYgKG11dGF0aW9uUmVxdWVzdGVkKGlucHV0KSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbWlncmF0b3IucnVuU2hhZG93VGVzdCh7IHRhcmdldDogc2hhZG93VGFyZ2V0IH0pO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocmVzdWx0KVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgICAgdGFyZ2V0OiBzaGFkb3dUYXJnZXQsXG4gICAgICAgICAgICBtaWdyYXRpb25zOiByZXN1bHQuZmxhdE1hcCgoeyBhcHBsaWVkIH0pID0+IGFwcGxpZWQpLFxuICAgICAgICAgIH1cbiAgICAgICAgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0Q29ubmVjdGlvblN0YXR1cyhzaGFkb3dUYXJnZXQpO1xuICAgIHJldHVybiBtaWdyYXRpb25QbGFuKHNoYWRvd1RhcmdldCwgc3RhdHVzLnBlbmRpbmcpO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0ID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcInRhcmdldFwiKTtcbiAgYXNzZXJ0TWlncmF0aW9uVGFyZ2V0KHRhcmdldCk7XG4gIGlmIChtZXRob2QgPT09IFwiY29kZVwiKSByZXR1cm4gbWlncmF0b3IuZ2V0UHJlcGFyZWRDb2Rlcyh0YXJnZXQpO1xuXG4gIGNvbnN0IGFjdGlvbiA9XG4gICAgbWV0aG9kID09PSBcInJvbGxiYWNrXCIgfHwgdGV4dChpbnB1dCwgXCJhY3Rpb25cIikgPT09IFwicm9sbGJhY2tcIiA/IFwicm9sbGJhY2tcIiA6IFwiYXBwbHlcIjtcbiAgY29uc3QgbWlncmF0aW9ucyA9XG4gICAgYWN0aW9uID09PSBcImFwcGx5XCJcbiAgICAgID8gKGF3YWl0IG1pZ3JhdG9yLmdldENvbm5lY3Rpb25TdGF0dXModGFyZ2V0KSkucGVuZGluZ1xuICAgICAgOiAoYXdhaXQgbWlncmF0b3IuZ2V0TGF0ZXN0QXBwbGllZEJhdGNoKHRhcmdldCkpLmZpbGVzO1xuICBjb25zdCBwbGFuID0gYXdhaXQgbWlncmF0aW9uUGxhbih0YXJnZXQsIG1pZ3JhdGlvbnMsIGFjdGlvbik7XG4gIGlmIChtZXRob2QgIT09IFwicm9sbGJhY2tcIiB8fCAhbXV0YXRpb25SZXF1ZXN0ZWQoaW5wdXQpKSByZXR1cm4gcGxhbjtcbiAgcmV0dXJuIG1pZ3JhdG9yLnJvbGxiYWNrKFt0YXJnZXRdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZU9wZXJhdGlvbihtZXRob2Q6IHN0cmluZywgaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBhd2FpdCBlbnN1cmVTb25hbXUoKTtcbiAgY29uc3QgW2ZpeHR1cmVDb21tYW5kcywgeyBGaXh0dXJlTWFuYWdlciB9LCBmaXh0dXJlU2VydmljZSwgeyBTb25hbXUgfV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgaW1wb3J0KFwiLi4vYmluL2ZpeHR1cmVcIiksXG4gICAgaW1wb3J0KFwiLi4vdGVzdGluZy9maXh0dXJlLW1hbmFnZXJcIiksXG4gICAgaW1wb3J0KFwiLi9maXh0dXJlLXNlcnZpY2VcIiksXG4gICAgaW1wb3J0KFwiLi4vYXBpL3NvbmFtdVwiKSxcbiAgXSk7XG4gIGlmIChtZXRob2QgPT09IFwiaW5pdFwiKSB7XG4gICAgcmV0dXJuIG11dGF0aW9uUmVxdWVzdGVkKGlucHV0KSA/IGZpeHR1cmVDb21tYW5kcy5maXh0dXJlSW5pdENvbW1hbmQoKSA6IHsgZHJ5UnVuOiB0cnVlIH07XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJpbXBvcnRcIikge1xuICAgIGlmICghbXV0YXRpb25SZXF1ZXN0ZWQoaW5wdXQpKSByZXR1cm4geyBkcnlSdW46IHRydWUgfTtcbiAgICBGaXh0dXJlTWFuYWdlci5pbml0KCk7XG4gICAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShcbiAgICAgIHJlcXVpcmVkVGV4dChpbnB1dCwgXCJlbnRpdHlJZFwiKSxcbiAgICAgIHouYXJyYXkoei5udW1iZXIoKSkucGFyc2UoaW5wdXQucmVjb3JkSWRzKSxcbiAgICApO1xuICAgIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLnN5bmMoKTtcbiAgICByZXR1cm4geyBpbXBvcnRlZDogdHJ1ZSB9O1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwic3luY1wiKSB7XG4gICAgaWYgKCFtdXRhdGlvblJlcXVlc3RlZChpbnB1dCkpIHJldHVybiB7IGRyeVJ1bjogdHJ1ZSB9O1xuICAgIEZpeHR1cmVNYW5hZ2VyLmluaXQoKTtcbiAgICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG4gICAgcmV0dXJuIHsgc3luY2VkOiB0cnVlIH07XG4gIH1cbiAgY29uc3QgbGVnYWN5Q29tbWFuZCA9IHouZW51bShbXCJnZW5cIiwgXCJmZXRjaFwiLCBcImV4cGxvcmVcIl0pLnBhcnNlKG1ldGhvZCk7XG4gIGNvbnN0IGlzVHJhbnNmZXIgPSBbXCJlbnRpdHlJZFwiLCBcInNvdXJjZVwiLCBcInRhcmdldFwiLCBcImZpZWxkXCIsIFwidmFsdWVzXCIsIFwicmVsYXRpb25zXCIsIFwiZGVwdGhcIl0uc29tZShcbiAgICAoa2V5KSA9PiBpbnB1dFtrZXldICE9PSB1bmRlZmluZWQsXG4gICk7XG4gIGlmICghaXNUcmFuc2Zlcikge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBmaXh0dXJlU2VydmljZS5ub3JtYWxpemVMZWdhY3lGaXh0dXJlQ29tbWFuZE9wdGlvbnMobGVnYWN5Q29tbWFuZCwgaW5wdXQpO1xuICAgIGNvbnN0IHN0cmF0ZWd5ID0gelxuICAgICAgLmVudW0oW1wic2FtcGxlXCIsIFwiaWRzXCIsIFwicXVlcnlcIiwgXCJmaWxlXCIsIFwicmVjZW50XCIsIFwicmFuZG9tXCJdKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5wYXJzZShvcHRpb25zLnN0cmF0ZWd5KTtcbiAgICBjb25zdCBmaXh0dXJlT3B0aW9ucyA9IHsgLi4ub3B0aW9ucywgc3RyYXRlZ3kgfSBzYXRpc2ZpZXMgRml4dHVyZUNvbW1hbmRPcHRpb25zO1xuICAgIGlmIChsZWdhY3lDb21tYW5kICE9PSBcImV4cGxvcmVcIiAmJiAhbXV0YXRpb25SZXF1ZXN0ZWQoaW5wdXQpKSB7XG4gICAgICByZXR1cm4geyBkcnlSdW46IHRydWUsIHJlcXVlc3Q6IGZpeHR1cmVPcHRpb25zIH07XG4gICAgfVxuICAgIGlmIChsZWdhY3lDb21tYW5kID09PSBcImdlblwiKSByZXR1cm4gZml4dHVyZUNvbW1hbmRzLmZpeHR1cmVHZW5Db21tYW5kKGZpeHR1cmVPcHRpb25zKTtcbiAgICBpZiAobGVnYWN5Q29tbWFuZCA9PT0gXCJleHBsb3JlXCIpIHJldHVybiBmaXh0dXJlQ29tbWFuZHMuZml4dHVyZUV4cGxvcmVDb21tYW5kKGZpeHR1cmVPcHRpb25zKTtcbiAgICByZXR1cm4gZml4dHVyZUNvbW1hbmRzLmZpeHR1cmVGZXRjaENvbW1hbmQoZml4dHVyZU9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3QgZW50aXR5SWQgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwiZW50aXR5SWRcIik7XG4gIGNvbnN0IHNvdXJjZSA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJzb3VyY2VcIik7XG4gIGNvbnN0IHRhcmdldCA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJ0YXJnZXRcIik7XG4gIGNvbnN0IGZpZWxkID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcImZpZWxkXCIpO1xuICBjb25zdCB2YWx1ZXMgPSBzdHJpbmdzKGlucHV0LCBcInZhbHVlc1wiKTtcbiAgY29uc3QgcmVsYXRpb25zID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcInJlbGF0aW9uc1wiKTtcbiAgLy8gQ0xJIOusuOuyleydtCBpbnRlZ2VyKHsgbWluOiAwIH0p7J2066+A66GcIOq0gOqzhCDsiJztmozrpbwg64GE64qUIGRlcHRoIDDsnYQg7ZeI7Jqp7ZWp64uI64ukLlxuICBjb25zdCBkZXB0aCA9IHoubnVtYmVyKCkuaW50KCkubm9ubmVnYXRpdmUoKS5zYWZlUGFyc2UoaW5wdXQuZGVwdGgpO1xuICBpZiAoXG4gICAgIU9iamVjdC5oYXNPd24oU29uYW11LmRiQ29uZmlnLCBzb3VyY2UpIHx8XG4gICAgIU9iamVjdC5oYXNPd24oU29uYW11LmRiQ29uZmlnLCB0YXJnZXQpIHx8XG4gICAgdmFsdWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICFbXCJpbmNsdWRlXCIsIFwiZXhjbHVkZVwiLCBcIm5vbmVcIl0uaW5jbHVkZXMocmVsYXRpb25zKSB8fFxuICAgICFkZXB0aC5zdWNjZXNzXG4gICkge1xuICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKFwiSW52YWxpZCBmaXh0dXJlIHRyYW5zZmVyIHNlbGVjdG9yLlwiKSwge1xuICAgICAgY29kZTogXCJJTlZBTElEX0ZJWFRVUkVfVFJBTlNGRVJcIixcbiAgICAgIGV4aXRDb2RlOiAyLFxuICAgIH0pO1xuICB9XG4gIC8vIFNBRkVUWTogT2JqZWN0Lmhhc093biBjaGVja3MgYWJvdmUgZXN0YWJsaXNoIGJvdGgga2V5cyBhcyBjb25maWd1cmVkIERCIHByZXNldHMuXG4gIGNvbnN0IHNvdXJjZUtleSA9IHNvdXJjZSBhcyBrZXlvZiB0eXBlb2YgU29uYW11LmRiQ29uZmlnO1xuICAvLyBTQUZFVFk6IE9iamVjdC5oYXNPd24gY2hlY2tzIGFib3ZlIGVzdGFibGlzaCBib3RoIGtleXMgYXMgY29uZmlndXJlZCBEQiBwcmVzZXRzLlxuICBjb25zdCB0YXJnZXRLZXkgPSB0YXJnZXQgYXMga2V5b2YgdHlwZW9mIFNvbmFtdS5kYkNvbmZpZztcbiAgY29uc3QgcmVjb3JkcyA9IChcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHZhbHVlcy5tYXAoKHZhbHVlKSA9PlxuICAgICAgICBGaXh0dXJlTWFuYWdlci5nZXRGaXh0dXJlcyhcbiAgICAgICAgICBzb3VyY2VLZXksXG4gICAgICAgICAgdGFyZ2V0S2V5LFxuICAgICAgICAgIHsgZW50aXR5SWQsIGZpZWxkLCB2YWx1ZSwgc2VhcmNoVHlwZTogXCJlcXVhbHNcIiB9LFxuICAgICAgICAgIHsgaW5jbHVkZVJlbGF0aW9uczogcmVsYXRpb25zID09PSBcImluY2x1ZGVcIiwgbWF4RGVwdGg6IGRlcHRoLmRhdGEgfSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKVxuICApLmZsYXQoKTtcbiAgaWYgKGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQpKSByZXR1cm4geyBkcnlSdW46IHRydWUsIHJlY29yZHMgfTtcbiAgaWYgKHJlY29yZHMubGVuZ3RoID4gMCkgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXModGFyZ2V0S2V5LCByZWNvcmRzKTtcbiAgcmV0dXJuIHsgcmVjb3JkcyB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZE9wZXJhdGlvbihtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBjb25zdCB7IGJ1aWxkQXBpQ29tbWFuZCwgYnVpbGRXZWJDb21tYW5kIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9iaW4vYnVpbGQtY29uZmlnXCIpO1xuICBpZiAobWV0aG9kID09PSBcImFwaVwiKSByZXR1cm4gYnVpbGRBcGlDb21tYW5kKCk7XG4gIGlmIChtZXRob2QgPT09IFwid2ViXCIpIHJldHVybiBidWlsZFdlYkNvbW1hbmQoKTtcbiAgYXdhaXQgYnVpbGRBcGlDb21tYW5kKCk7XG4gIHJldHVybiBidWlsZFdlYkNvbW1hbmQoeyBza2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB0ZXN0T3BlcmF0aW9uKG1ldGhvZDogc3RyaW5nLCBpbnB1dDogQ29tbWFuZElucHV0KTogUHJvbWlzZTxUb29saW5nUmVzdWx0PiB7XG4gIGNvbnN0IHsgY3JlYXRlRGVmYXVsdFRlc3RSdW5DbGllbnQgfSA9IGF3YWl0IGltcG9ydChcIi4vdGVzdC1ydW4tY2xpZW50XCIpO1xuICBjb25zdCBjbGllbnQgPSBjcmVhdGVEZWZhdWx0VGVzdFJ1bkNsaWVudCgpO1xuICBpZiAobWV0aG9kID09PSBcInN0YXR1c1wiKSByZXR1cm4gY2xpZW50LnN0YXR1cygpO1xuICBjb25zdCByZXF1ZXN0ID0ge1xuICAgIGZpbGVzOiB6LmFycmF5KHouc3RyaW5nKCkpLmNhdGNoKFtdKS5wYXJzZShpbnB1dC5maWxlcyksXG4gICAgcGF0dGVybjogei5zdHJpbmcoKS5vcHRpb25hbCgpLnBhcnNlKGlucHV0LnBhdHRlcm4pLFxuICAgIHRyYWNlczogaW5wdXQudHJhY2VzID09PSB0cnVlLFxuICB9O1xuICByZXR1cm4geyByZXF1ZXN0LCByZXN1bHQ6IGF3YWl0IGNsaWVudC5ydW4ocmVxdWVzdCkgfTtcbn1cblxuY29uc3QgYmV0dGVyQXV0aFBsdWdpblNjaGVtYSA9IHouZW51bShbXG4gIFwiMmZhXCIsXG4gIFwiYWRtaW5cIixcbiAgXCJhbm9ueW1vdXNcIixcbiAgXCJhcGkta2V5XCIsXG4gIFwiYXVkaXQtbG9nXCIsXG4gIFwiand0XCIsXG4gIFwib3JnYW5pemF0aW9uXCIsXG4gIFwicGFzc2tleVwiLFxuICBcInBob25lLW51bWJlclwiLFxuICBcInNzb1wiLFxuICBcInVzZXJuYW1lXCIsXG5dKTtcblxuYXN5bmMgZnVuY3Rpb24gYXV0aE9wZXJhdGlvbihtZXRob2Q6IHN0cmluZywgaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBjb25zdCB7IGFkZENvbXBhbmlvbnNUb0VudGl0aWVzLCBnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vYXV0aFwiKTtcbiAgaWYgKG1ldGhvZCA9PT0gXCJhZGRDb21wYW5pb25zXCIpIHJldHVybiBhZGRDb21wYW5pb25zVG9FbnRpdGllcygpO1xuICAvLyBwbHVnaW5z64qUIOyEoO2DnSDsmLXshZjsnbTrr4DroZwg7IOd65617ZWY66m0IGNvcmUg7JeU7Yuw7Yuw66eMIOyDneyEse2VqeuLiOuLpC5cbiAgY29uc3QgcGx1Z2lucyA9IHouYXJyYXkoYmV0dGVyQXV0aFBsdWdpblNjaGVtYSkucGFyc2UoXG4gICAgKG9wdGlvbmFsVGV4dChpbnB1dCwgXCJwbHVnaW5zXCIpID8/IFwiXCIpXG4gICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAubWFwKChwbHVnaW4pID0+IHBsdWdpbi50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pLFxuICApO1xuICByZXR1cm4gZ2VuZXJhdGVCZXR0ZXJBdXRoRW50aXRpZXMoeyBwbHVnaW5zIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpMThuT3BlcmF0aW9uKG1ldGhvZDogc3RyaW5nLCBpbnB1dDogQ29tbWFuZElucHV0KTogUHJvbWlzZTxUb29saW5nUmVzdWx0PiB7XG4gIGF3YWl0IGVuc3VyZVNvbmFtdSgpO1xuICBjb25zdCB7IHNvbmFtdURpY3Rpb25hcnkgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RpY3Qvc29uYW11LWRpY3Rpb25hcnlcIik7XG4gIGlmIChtZXRob2QgPT09IFwibGlzdFwiKSB7XG4gICAgY29uc3QgZGljdGlvbmFyeSA9IGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuZ2V0RGljdGlvbmFyeSgpO1xuICAgIGNvbnN0IGxvY2FsZSA9IHRleHQoaW5wdXQsIFwibG9jYWxlXCIpO1xuICAgIHJldHVybiBsb2NhbGUgPT09IHVuZGVmaW5lZFxuICAgICAgPyBkaWN0aW9uYXJ5XG4gICAgICA6IHtcbiAgICAgICAgICAuLi5kaWN0aW9uYXJ5LFxuICAgICAgICAgIGxvY2FsZXM6IFtsb2NhbGVdLFxuICAgICAgICAgIHJvd3M6IGRpY3Rpb25hcnkucm93cy5tYXAoKHJvdykgPT4gKHtcbiAgICAgICAgICAgIGtleTogcm93LmtleSxcbiAgICAgICAgICAgIHNvdXJjZTogcm93LnNvdXJjZSxcbiAgICAgICAgICAgIFtsb2NhbGVdOiByb3dbbG9jYWxlXSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH07XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJjaGVja1wiKSB7XG4gICAgY29uc3QgZGljdGlvbmFyeSA9IGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuZ2V0RGljdGlvbmFyeSgpO1xuICAgIHJldHVybiBzb25hbXVEaWN0aW9uYXJ5LmNoZWNrVXNhZ2UoZGljdGlvbmFyeS5yb3dzLm1hcCgocm93KSA9PiByb3cua2V5KSk7XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJleHBvcnRcIiB8fCBtZXRob2QgPT09IFwiaW1wb3J0XCIpIHtcbiAgICBjb25zdCBmaWxlID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcImZpbGVcIik7XG4gICAgaWYgKGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQpKSByZXR1cm4geyBvcGVyYXRpb246IG1ldGhvZCwgZHJ5UnVuOiB0cnVlIH07XG4gICAgY29uc3QgeyByZWFkRmlsZSwgd3JpdGVGaWxlIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICAgIGNvbnN0IGZvcm1hdCA9IHRleHQoaW5wdXQsIFwiZm9ybWF0XCIpID09PSBcImpzb25cIiA/IFwianNvblwiIDogXCJ3b3JrYm9va1wiO1xuICAgIGlmIChtZXRob2QgPT09IFwiZXhwb3J0XCIgJiYgZm9ybWF0ID09PSBcIndvcmtib29rXCIpIHtcbiAgICAgIGNvbnN0IHsgYnVmZmVyIH0gPSBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmV4cG9ydFRvRXhjZWwoKTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlLCBidWZmZXIpO1xuICAgICAgcmV0dXJuIHsgZXhwb3J0ZWQ6IDEgfTtcbiAgICB9XG4gICAgaWYgKG1ldGhvZCA9PT0gXCJpbXBvcnRcIiAmJiBmb3JtYXQgPT09IFwid29ya2Jvb2tcIikge1xuICAgICAgcmV0dXJuIHNvbmFtdURpY3Rpb25hcnkuaW1wb3J0RnJvbUV4Y2VsKGF3YWl0IHJlYWRGaWxlKGZpbGUpKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcImV4cG9ydFwiKSB7XG4gICAgICBjb25zdCBkaWN0aW9uYXJ5ID0gYXdhaXQgc29uYW11RGljdGlvbmFyeS5nZXREaWN0aW9uYXJ5KCk7XG4gICAgICBjb25zdCBsb2NhbGUgPSB0ZXh0KGlucHV0LCBcImxvY2FsZVwiKTtcbiAgICAgIGNvbnN0IHJvd3MgPSBkaWN0aW9uYXJ5LnJvd3MubWFwKFxuICAgICAgICAoeyBrZXksIHNvdXJjZTogX3NvdXJjZSwgaXNGdW5jdGlvbjogX2lzRnVuY3Rpb24sIC4uLnZhbHVlcyB9KSA9PiAoe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICB2YWx1ZXM6XG4gICAgICAgICAgICBsb2NhbGUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IHZhbHVlc1xuICAgICAgICAgICAgICA6IHsgW2xvY2FsZV06IHouc3RyaW5nKCkuY2F0Y2goXCJcIikucGFyc2UodmFsdWVzW2xvY2FsZV0pIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlLCBKU09OLnN0cmluZ2lmeShyb3dzLCBudWxsLCAyKSk7XG4gICAgICByZXR1cm4geyBleHBvcnRlZDogcm93cy5sZW5ndGggfTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyaWVzID0gcGFyc2VKc29uKFxuICAgICAgKGF3YWl0IHJlYWRGaWxlKGZpbGUpKS50b1N0cmluZyhcInV0ZjhcIiksXG4gICAgICBcIkkxOE5fSU5WQUxJRF9KU09OXCIsXG4gICAgICBpMThuRW50cmllc1NjaGVtYSxcbiAgICApO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LmdldERpY3Rpb25hcnkoKTtcbiAgICBjb25zdCBleGlzdGluZ0tleXMgPSBuZXcgU2V0KGN1cnJlbnQucm93cy5tYXAoKHsga2V5IH0pID0+IGtleSkpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKGV4aXN0aW5nS2V5cy5oYXMoZW50cnkua2V5KSkge1xuICAgICAgICBhd2FpdCBzb25hbXVEaWN0aW9uYXJ5LnVwZGF0ZUVudHJ5KHtcbiAgICAgICAgICBvbGRLZXk6IGVudHJ5LmtleSxcbiAgICAgICAgICBuZXdLZXk6IGVudHJ5LmtleSxcbiAgICAgICAgICBzb3VyY2U6IFwicHJvamVjdFwiLFxuICAgICAgICAgIHZhbHVlczogZW50cnkudmFsdWVzLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHNvbmFtdURpY3Rpb25hcnkuY3JlYXRlRW50cnkoZW50cnkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBpbXBvcnRlZDogZW50cmllcy5sZW5ndGggfTtcbiAgfVxuICBjb25zdCBrZXkgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwia2V5XCIpO1xuICBpZiAobWV0aG9kID09PSBcImNyZWF0ZVwiKSB7XG4gICAgaWYgKGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQpKSByZXR1cm4geyBvcGVyYXRpb246IFwiY3JlYXRlXCIsIGlucHV0LCBkcnlSdW46IHRydWUgfTtcbiAgICByZXR1cm4gc29uYW11RGljdGlvbmFyeS5jcmVhdGVFbnRyeSh7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZXM6IGRpY3Rpb25hcnlWYWx1ZXNTY2hlbWEucGFyc2UoaW5wdXQudmFsdWVzKSxcbiAgICB9KTtcbiAgfVxuICBpZiAobWV0aG9kID09PSBcInVwZGF0ZVwiKSB7XG4gICAgaWYgKGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQpKSByZXR1cm4geyBvcGVyYXRpb246IFwidXBkYXRlXCIsIGlucHV0LCBkcnlSdW46IHRydWUgfTtcbiAgICBjb25zdCBleHBsaWNpdFNvdXJjZSA9IHRleHQoaW5wdXQsIFwic291cmNlXCIpO1xuICAgIC8vIHNvdXJjZeulvCDsg53rnrXtlZjrqbQg7IKs7KCE7JeQIOuTseuhneuQnCDquLDsobQgc291cmNl66W8IOycoOyngO2VtCBlbnRpdHkg7ZWt66qp7J20IHByb2plY3Qgb3ZlcnJpZGXroZwg642u7J207KeAIOyViuqyjCDtlanri4jri6QuXG4gICAgY29uc3QgcmVzb2x2ZWRTb3VyY2UgPVxuICAgICAgZXhwbGljaXRTb3VyY2UgPT09IHVuZGVmaW5lZFxuICAgICAgICA/ICgoYXdhaXQgc29uYW11RGljdGlvbmFyeS5nZXREaWN0aW9uYXJ5KCkpLnJvd3MuZmluZCgocm93KSA9PiByb3cua2V5ID09PSBrZXkpPy5zb3VyY2UgPz9cbiAgICAgICAgICBcInByb2plY3RcIilcbiAgICAgICAgOiBleHBsaWNpdFNvdXJjZTtcbiAgICByZXR1cm4gc29uYW11RGljdGlvbmFyeS51cGRhdGVFbnRyeSh7XG4gICAgICBvbGRLZXk6IGtleSxcbiAgICAgIG5ld0tleTogdGV4dChpbnB1dCwgXCJuZXdLZXlcIikgPz8ga2V5LFxuICAgICAgc291cmNlOiBkaWN0aW9uYXJ5U291cmNlU2NoZW1hLnBhcnNlKHJlc29sdmVkU291cmNlKSxcbiAgICAgIHZhbHVlczogZGljdGlvbmFyeVZhbHVlc1NjaGVtYS5wYXJzZShpbnB1dC52YWx1ZXMpLFxuICAgIH0pO1xuICB9XG4gIGlmICghbXV0YXRpb25SZXF1ZXN0ZWQoaW5wdXQpKSByZXR1cm4geyBrZXksIG9wZXJhdGlvbjogXCJyZW1vdmVcIiwgZHJ5UnVuOiB0cnVlIH07XG4gIHJldHVybiBzb25hbXVEaWN0aW9uYXJ5LmRlbGV0ZUVudHJ5KGtleSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRhc2tPcGVyYXRpb24obWV0aG9kOiBzdHJpbmcsIGlucHV0OiBDb21tYW5kSW5wdXQpOiBQcm9taXNlPFRvb2xpbmdSZXN1bHQ+IHtcbiAgYXdhaXQgZW5zdXJlU29uYW11KCk7XG4gIGNvbnN0IHsgU29uYW11IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9hcGkvc29uYW11XCIpO1xuICBjb25zdCB3b3JrZmxvd3MgPSBTb25hbXUud29ya2Zsb3dzO1xuICBjb25zdCBiYWNrZW5kID0gd29ya2Zsb3dzLmJhY2tlbmQ7XG4gIGlmIChtZXRob2QgPT09IFwiZGVmaW5pdGlvbnNcIikgcmV0dXJuIHsgZGVmaW5pdGlvbnM6IHdvcmtmbG93cy53b3JrZmxvd0RlZmluaXRpb25zIH07XG4gIGlmIChtZXRob2QgPT09IFwicnVuc1wiKSByZXR1cm4gYmFja2VuZC5saXN0V29ya2Zsb3dSdW5zKHsgbGltaXQ6IDUwIH0pO1xuICBjb25zdCB3b3JrZmxvd1J1bklkID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcInJ1bklkXCIpO1xuICBpZiAobWV0aG9kID09PSBcInNob3dcIikgcmV0dXJuIGJhY2tlbmQuZ2V0V29ya2Zsb3dSdW4oeyB3b3JrZmxvd1J1bklkIH0pO1xuICBpZiAobWV0aG9kID09PSBcIndhdGNoXCIpIHtcbiAgICBjb25zdCB7IGlzRGVlcFN0cmljdEVxdWFsIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlOnV0aWxcIik7XG4gICAgcmV0dXJuIChhc3luYyBmdW5jdGlvbiogd2F0Y2goKSB7XG4gICAgICBsZXQgcHJldmlvdXM6IG9iamVjdCB8IHVuZGVmaW5lZDtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgYmFja2VuZC5nZXRXb3JrZmxvd1J1bih7IHdvcmtmbG93UnVuSWQgfSk7XG4gICAgICAgIGlmIChzbmFwc2hvdCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBXb3JrZmxvdyBydW4gbm90IGZvdW5kOiAke3dvcmtmbG93UnVuSWR9YCksIHtcbiAgICAgICAgICAgIGNvZGU6IFwiVEFTS19SVU5fTk9UX0ZPVU5EXCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmF3U3RhdGUgPSBzbmFwc2hvdC5zdGF0dXMgPT09IFwic3VjY2VlZGVkXCIgPyBcImNvbXBsZXRlZFwiIDogc25hcHNob3Quc3RhdHVzO1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHJhd1N0YXRlID09PSBcImNhbmNlbGVkXCIgPyBcImNhbmNlbGxlZFwiIDogcmF3U3RhdGU7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB7IC4uLnNuYXBzaG90LCBzdGF0ZSB9O1xuICAgICAgICBpZiAoIWlzRGVlcFN0cmljdEVxdWFsKGN1cnJlbnQsIHByZXZpb3VzKSkge1xuICAgICAgICAgIHByZXZpb3VzID0gc3RydWN0dXJlZENsb25lKGN1cnJlbnQpO1xuICAgICAgICAgIHlpZWxkIGN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFtcImNvbXBsZXRlZFwiLCBcImZhaWxlZFwiLCBcImNhbmNlbGxlZFwiXS5pbmNsdWRlcyhzdGF0ZSkpIHJldHVybjtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMV8wMDApKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwic3RlcHNcIikgcmV0dXJuIGJhY2tlbmQubGlzdFN0ZXBBdHRlbXB0cyh7IHdvcmtmbG93UnVuSWQsIGxpbWl0OiAxMDAgfSk7XG4gIGlmICghbXV0YXRpb25SZXF1ZXN0ZWQoaW5wdXQpKSByZXR1cm4geyBvcGVyYXRpb246IG1ldGhvZCwgd29ya2Zsb3dSdW5JZCwgZHJ5UnVuOiB0cnVlIH07XG4gIGlmIChtZXRob2QgPT09IFwicGF1c2VcIikgcmV0dXJuIGJhY2tlbmQucGF1c2VXb3JrZmxvd1J1bih7IHdvcmtmbG93UnVuSWQgfSk7XG4gIGlmIChtZXRob2QgPT09IFwicmVzdW1lXCIpIHJldHVybiBiYWNrZW5kLnJlc3VtZVdvcmtmbG93UnVuKHsgd29ya2Zsb3dSdW5JZCB9KTtcbiAgcmV0dXJuIGJhY2tlbmQuY2FuY2VsV29ya2Zsb3dSdW4oeyB3b3JrZmxvd1J1bklkIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjZGRSb290UGF0aCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBbeyBTb25hbXUgfSwgcGF0aF0gPSBhd2FpdCBQcm9taXNlLmFsbChbaW1wb3J0KFwiLi4vYXBpL3NvbmFtdVwiKSwgaW1wb3J0KFwibm9kZTpwYXRoXCIpXSk7XG4gIHJldHVybiBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBcImNvbnRyYWN0XCIpO1xufVxuXG5jb25zdCBwcmFjdGljZVNlcXVlbmNlUGF0dGVybiA9IC9ecChbMC05XSspLS87XG5cbi8vIOydtOumhOydgCDtjIzsnbzrqoXqs7wg7Iqk7YWBIOuzuOusuOydmCDrrLjsnpDsl7Qg66as7YSw65+07JeQIOq3uOuMgOuhnCDrk6TslrTqsIDrr4DroZwsXG4vLyDqsr3roZwg6rWs67aE7J6QL+yDgeychCDqsr3roZwg7LC47KGwL+uUsOyYtO2RnC/sl63siqzrnpjsi5zrpbwg7JuQ7LKcIOywqOuLqO2VmOuKlCDrrLjsnpDrp4wg7ZeI7Jqp7ZWp64uI64ukLlxuY29uc3QgcHJhY3RpY2VOYW1lUGF0dGVybiA9IC9eW0EtWmEtejAtOV1bQS1aYS16MC05Ll8tXSokLztcblxuZnVuY3Rpb24gaW52YWxpZFByYWN0aWNlTmFtZShuYW1lOiBzdHJpbmcpOiBFcnJvciB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKFxuICAgIG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIHByYWN0aWNlIG5hbWU6ICR7bmFtZX0uIFVzZSBsZXR0ZXJzLCBkaWdpdHMsIFwiLlwiLCBcIi1cIiwgYW5kIFwiX1wiIG9ubHksIHN0YXJ0aW5nIHdpdGggYSBsZXR0ZXIgb3IgZGlnaXQuYCxcbiAgICApLFxuICAgIHsgY29kZTogXCJJTlZBTElEX1BSQUNUSUNFX05BTUVcIiwgZXhpdENvZGU6IDIgfSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gaW52YWxpZFByYWN0aWNlRGlyZWN0b3J5KGRpcmVjdG9yeTogc3RyaW5nKTogRXJyb3Ige1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYFByYWN0aWNlIGRpcmVjdG9yeSBlc2NhcGVzIHRoZSBBUEkgcm9vdDogJHtkaXJlY3Rvcnl9YCksIHtcbiAgICBjb2RlOiBcIklOVkFMSURfUFJBQ1RJQ0VfUEFUSFwiLFxuICAgIGV4aXRDb2RlOiAyLFxuICB9KTtcbn1cblxuLyoqXG4gKiBgc3JjL3ByYWN0aWNlc2Ag7JWE656Y7JeQIOuLpOydjCDsi5ztgIDsiqQg67KI7Zi466W8IOqwgOynhCBwcmFjdGljZSDsiqTthYEg7YyM7J287J2EIOunjOuTreuLiOuLpC5cbiAqXG4gKiDqtawgQ0xJKGBzdHViIHByYWN0aWNlYCnsnZgg7YyM7J2866qFIOq3nOy5meqzvCDsiqTthYEg67O466y47J2EIOq3uOuMgOuhnCDsnKDsp4Dtlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0dWJQcmFjdGljZU9wZXJhdGlvbihpbnB1dDogQ29tbWFuZElucHV0KTogUHJvbWlzZTxUb29saW5nUmVzdWx0PiB7XG4gIGNvbnN0IG5hbWUgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwibmFtZVwiKTtcbiAgaWYgKCFwcmFjdGljZU5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHRocm93IGludmFsaWRQcmFjdGljZU5hbWUobmFtZSk7XG4gIGF3YWl0IGVuc3VyZVNvbmFtdSgpO1xuICBjb25zdCBbeyBTb25hbXUgfSwgeyBjb25zdGFudHMgfSwgeyBta2Rpciwgb3BlbiwgcmVhZGRpciwgcmVhbHBhdGggfSwgcGF0aF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgaW1wb3J0KFwiLi4vYXBpL3NvbmFtdVwiKSxcbiAgICBpbXBvcnQoXCJub2RlOmZzXCIpLFxuICAgIGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIiksXG4gICAgaW1wb3J0KFwibm9kZTpwYXRoXCIpLFxuICBdKTtcbiAgY29uc3QgcHJhY3RpY2VEaXJlY3RvcnkgPSBwYXRoLmRlZmF1bHQuam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwicHJhY3RpY2VzXCIpO1xuICBhd2FpdCBta2RpcihwcmFjdGljZURpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIC8vIGNkZC1zZXJ2aWNl7JmAIOqwmeydtCDsi6TsoJwg6rK966Gc6rmM7KeAIO2ZleyduO2VtCwgc3ltbGlua+uhnCDsl7DqsrDrkJwgcHJhY3RpY2VzIOuUlOugie2EsOumrOqwgFxuICAvLyBhcGkgcm9vdCDrsJbsnYQg6rCA66as7YKk64qUIOqyveyasOulvCDssKjri6jtlanri4jri6QuXG4gIGNvbnN0IFtjYW5vbmljYWxBcGlSb290LCBjYW5vbmljYWxEaXJlY3RvcnldID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIHJlYWxwYXRoKFNvbmFtdS5hcGlSb290UGF0aCksXG4gICAgcmVhbHBhdGgocHJhY3RpY2VEaXJlY3RvcnkpLFxuICBdKTtcbiAgY29uc3QgZGlyZWN0b3J5UmVsYXRpdmUgPSBwYXRoLmRlZmF1bHQucmVsYXRpdmUoY2Fub25pY2FsQXBpUm9vdCwgY2Fub25pY2FsRGlyZWN0b3J5KTtcbiAgaWYgKGRpcmVjdG9yeVJlbGF0aXZlLnN0YXJ0c1dpdGgoXCIuLlwiKSB8fCBwYXRoLmRlZmF1bHQuaXNBYnNvbHV0ZShkaXJlY3RvcnlSZWxhdGl2ZSkpIHtcbiAgICB0aHJvdyBpbnZhbGlkUHJhY3RpY2VEaXJlY3RvcnkocHJhY3RpY2VEaXJlY3RvcnkpO1xuICB9XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXJlY3RvcnkpO1xuICBjb25zdCBtYXhTZXF1ZW5jZSA9IGZpbGVOYW1lc1xuICAgIC5maWx0ZXIoKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5zdGFydHNXaXRoKFwicFwiKSAmJiBmaWxlTmFtZS5lbmRzV2l0aChcIi50c1wiKSlcbiAgICAucmVkdWNlKChsYXJnZXN0LCBmaWxlTmFtZSkgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hlZCA9IHByYWN0aWNlU2VxdWVuY2VQYXR0ZXJuLmV4ZWMoZmlsZU5hbWUpO1xuICAgICAgcmV0dXJuIG1hdGNoZWQgPT09IG51bGwgPyBsYXJnZXN0IDogTWF0aC5tYXgobGFyZ2VzdCwgTnVtYmVyLnBhcnNlSW50KG1hdGNoZWRbMV0sIDEwKSk7XG4gICAgfSwgMCk7XG5cbiAgY29uc3QgZmlsZU5hbWUgPSBgcCR7bWF4U2VxdWVuY2UgKyAxfS0ke25hbWV9LnRzYDtcbiAgLy8g7J2066aEIO2MqO2EtOydtCDqsr3roZwg6rWs67aE7J6Q66W8IOywqOuLqO2VmOuvgOuhnCDtjIzsnbzrqoXsnYAg7ZWt7IOBIOydtCDrlJTroInthLDrpqzsnZgg7KeB6rOEIOyekOyLneyeheuLiOuLpC5cbiAgLy8g6rK966Gc64qUIOyEpOygleuQnCDqsJIg6re464yA66GcIOuPjOugpOyjvOqzoCwg7YOI7LacIOyXrOu2gOuKlCDsnITsnZggY2Fub25pY2FsIOqygOyCrOuhnCDtjJDri6jtlanri4jri6QuXG4gIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5kZWZhdWx0LnJlc29sdmUocHJhY3RpY2VEaXJlY3RvcnksIGZpbGVOYW1lKTtcbiAgY29uc3Qgc3R1YkNvZGUgPSBbXG4gICAgYGltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCJzb25hbXVcIjtgLFxuICAgIFwiXCIsXG4gICAgYGNvbnNvbGUuY2xlYXIoKTtgLFxuICAgIGBjb25zb2xlLmxvZyhcIiR7ZmlsZU5hbWV9XCIpO2AsXG4gICAgXCJcIixcbiAgICBgU29uYW11LnJ1blNjcmlwdChhc3luYyAoKSA9PiB7YCxcbiAgICBgIC8vIFRPRE9gLFxuICAgIGB9KTtgLFxuICAgIFwiXCIsXG4gIF0uam9pbihcIlxcblwiKTtcbiAgbGV0IGhhbmRsZTtcbiAgdHJ5IHtcbiAgICAvLyDquLDsobQg7YyM7J287J2EIHRydW5jYXRl7ZWY7KeAIOyViuuPhOuhnSDrsLDtg4Ag7IOd7ISx7ZWY6rOgLCDstZzsooUg6rK966Gc7J2YIHN5bWxpbmvripQg65Sw65286rCA7KeAIOyViuyKteuLiOuLpC5cbiAgICBoYW5kbGUgPSBhd2FpdCBvcGVuKFxuICAgICAgZmlsZVBhdGgsXG4gICAgICBjb25zdGFudHMuT19XUk9OTFkgfCBjb25zdGFudHMuT19DUkVBVCB8IGNvbnN0YW50cy5PX0VYQ0wgfCBjb25zdGFudHMuT19OT0ZPTExPVyxcbiAgICAgIDBvNjY2LFxuICAgICk7XG4gICAgYXdhaXQgaGFuZGxlLndyaXRlRmlsZShzdHViQ29kZSwgXCJ1dGY4XCIpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFNBRkVUWTogbm9kZTpmcyBvcGVuIOyLpO2MqOydmCBjb2Rl66eMIOydveyWtCDquLDsobQg7YyM7J28L3N5bWxpbmsg7Lap64+M7J2EIOygleq3nO2ZlO2VqeuLiOuLpC5cbiAgICBjb25zdCBlcnJvckNvZGUgPSAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlO1xuICAgIGlmIChlcnJvckNvZGUgPT09IFwiRUVYSVNUXCIgfHwgZXJyb3JDb2RlID09PSBcIkVMT09QXCIpIHtcbiAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBQcmFjdGljZSBmaWxlIGFscmVhZHkgZXhpc3RzOiAke2ZpbGVQYXRofWApLCB7XG4gICAgICAgIGNvZGU6IFwiUFJBQ1RJQ0VfRklMRV9FWElTVFNcIixcbiAgICAgICAgZXhpdENvZGU6IDIsXG4gICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBoYW5kbGU/LmNsb3NlKCk7XG4gIH1cbiAgLy8g7JeQ65SU7YSwIOyXtOq4sC/tgbTrpr3rs7Trk5wg67O17IKsIOqwmeydgCDrjIDtmZTtmJUg67aA7IiY7Zqo6rO864qUIOu5hOuMgO2ZlO2YlSDsi6TtlonsnYQg6rmo65yo66as66+A66GcIO2YuOy2nOyekOyXkOqyjCDrp6HquYHri4jri6QuXG4gIHJldHVybiB7IGZpbGVOYW1lLCBwYXRoOiBmaWxlUGF0aCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkQ2RkVHJlZShkaXJlY3Rvcnk6IHN0cmluZywgcm9vdDogc3RyaW5nKTogUHJvbWlzZTxvYmplY3RbXT4ge1xuICBjb25zdCBbeyByZWFkZGlyIH0sIHBhdGhdID0gYXdhaXQgUHJvbWlzZS5hbGwoW2ltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIiksIGltcG9ydChcIm5vZGU6cGF0aFwiKV0pO1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgbm9kZXMgPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgaWYgKGVudHJ5Lm5hbWUgPT09IFwicnVsZXNcIikgY29udGludWU7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5qb2luKGRpcmVjdG9yeSwgZW50cnkubmFtZSk7XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyb290LCBhYnNvbHV0ZVBhdGgpO1xuICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGF3YWl0IHJlYWRDZGRUcmVlKGFic29sdXRlUGF0aCwgcm9vdCk7XG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBub2Rlcy5wdXNoKHsgbmFtZTogZW50cnkubmFtZSwgcGF0aDogcmVsYXRpdmVQYXRoLCB0eXBlOiBcImRpcmVjdG9yeVwiLCBjaGlsZHJlbiB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIuY29udHJhY3QubWRcIikpIHtcbiAgICAgIG5vZGVzLnB1c2goeyBuYW1lOiBlbnRyeS5uYW1lLCBwYXRoOiByZWxhdGl2ZVBhdGgsIHR5cGU6IFwiZmlsZVwiLCBmaWxlVHlwZTogXCJjb250cmFjdFwiIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbm9kZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNkZE9wZXJhdGlvbihtZXRob2Q6IHN0cmluZywgaW5wdXQ6IENvbW1hbmRJbnB1dCk6IFByb21pc2U8VG9vbGluZ1Jlc3VsdD4ge1xuICBhd2FpdCBlbnN1cmVTb25hbXUoKTtcbiAgY29uc3QgW3sgYWNjZXNzIH0sIHsgY3JlYXRlRGVmYXVsdENkZFRvb2xpbmdBZGFwdGVyIH1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIiksXG4gICAgaW1wb3J0KFwiLi9jZGQtc2VydmljZVwiKSxcbiAgXSk7XG4gIGNvbnN0IGFkYXB0ZXIgPSBjcmVhdGVEZWZhdWx0Q2RkVG9vbGluZ0FkYXB0ZXIoeyBjb250cmFjdFJvb3Q6IGF3YWl0IGNkZFJvb3RQYXRoKCkgfSk7XG4gIGlmIChtZXRob2QgPT09IFwidHJlZVwiKSB7XG4gICAgY29uc3Qgcm9vdCA9IGF3YWl0IGNkZFJvb3RQYXRoKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFjY2Vzcyhyb290KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IGV4aXN0czogZmFsc2UsIHRyZWU6IFtdIH07XG4gICAgfVxuICAgIHJldHVybiB7IGV4aXN0czogdHJ1ZSwgdHJlZTogYXdhaXQgcmVhZENkZFRyZWUocm9vdCwgcm9vdCkgfTtcbiAgfVxuICBpZiAobWV0aG9kID09PSBcInJlYWRcIikge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJwYXRoXCIpO1xuICAgIHJldHVybiBhZGFwdGVyLnJlYWQoeyBwYXRoOiByZWxhdGl2ZVBhdGggfSk7XG4gIH1cbiAgaWYgKG1ldGhvZCA9PT0gXCJydWxlc1wiKSByZXR1cm4gYWRhcHRlci5ydWxlcygpO1xuICBpZiAobWV0aG9kID09PSBcInNob3dSdWxlXCIpIHtcbiAgICBjb25zdCBydWxlSWQgPSByZXF1aXJlZFRleHQoaW5wdXQsIFwicnVsZUlkXCIpO1xuICAgIHJldHVybiBhZGFwdGVyLnNob3dSdWxlKHsgcnVsZUlkIH0pO1xuICB9XG4gIGlmIChtZXRob2QgPT09IFwiYWRkUnVsZVwiKSB7XG4gICAgY29uc3QgcnVsZUtleSA9IHJlcXVpcmVkVGV4dChpbnB1dCwgXCJydWxlS2V5XCIpO1xuICAgIGNvbnN0IGlkID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcImlkXCIpO1xuICAgIGNvbnN0IHdoZW4gPSByZXF1aXJlZFRleHQoaW5wdXQsIFwid2hlblwiKTtcbiAgICBjb25zdCBydWxlVGV4dCA9IHRleHQoaW5wdXQsIFwiaW5zdHJ1Y3Rpb25cIikgPz8gcmVxdWlyZWRUZXh0KGlucHV0LCBcInRleHRcIik7XG4gICAgcmV0dXJuIGFkYXB0ZXIuYWRkUnVsZSh7XG4gICAgICBydWxlS2V5LFxuICAgICAgaWQsXG4gICAgICB3aGVuLFxuICAgICAgdGV4dDogcnVsZVRleHQsXG4gICAgICBleGFtcGxlczogc3RyaW5ncyhpbnB1dCwgXCJleGFtcGxlc1wiKSxcbiAgICAgIGRyeVJ1bjogZXhwbGljaXRseURyeVJ1bihpbnB1dCksXG4gICAgfSk7XG4gIH1cbiAgaWYgKGV4cGxpY2l0bHlEcnlSdW4oaW5wdXQpKSB7XG4gICAgcmV0dXJuIHsgb3BlcmF0aW9uOiBcImFkZEFjY2VwdGFuY2VDcml0ZXJpb25cIiwgaW5wdXQsIGRyeVJ1bjogdHJ1ZSB9O1xuICB9XG4gIGNvbnN0IGRvY3VtZW50ID0gcmVxdWlyZWRUZXh0KGlucHV0LCBcImRvY3VtZW50XCIpO1xuICBjb25zdCBjcml0ZXJpb24gPSByZXF1aXJlZFRleHQoaW5wdXQsIFwidGV4dFwiKTtcbiAgcmV0dXJuIGFkYXB0ZXIuYWRkQWNjZXB0YW5jZUNyaXRlcmlvbih7IGRvY3VtZW50LCB0ZXh0OiBjcml0ZXJpb24sIGRyeVJ1bjogZmFsc2UgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGludm9rZURlZmF1bHQoXG4gIGdyb3VwOiBzdHJpbmcsXG4gIG1ldGhvZDogc3RyaW5nLFxuICBpbnB1dDogQ29tbWFuZElucHV0LFxuKTogUHJvbWlzZTxUb29saW5nUmVzdWx0PiB7XG4gIGlmIChncm91cCA9PT0gXCJjb3JlXCIpIHJldHVybiBzeW5jT3BlcmF0aW9uKGlucHV0KTtcbiAgaWYgKGdyb3VwID09PSBcImVudGl0eVwiKSByZXR1cm4gZW50aXR5T3BlcmF0aW9uKG1ldGhvZCwgaW5wdXQpO1xuICBpZiAoZ3JvdXAgPT09IFwic2NhZmZvbGRcIikgcmV0dXJuIHNjYWZmb2xkT3BlcmF0aW9uKG1ldGhvZCwgaW5wdXQpO1xuICBpZiAoZ3JvdXAgPT09IFwibWlncmF0aW9uXCIpIHJldHVybiBtaWdyYXRpb25PcGVyYXRpb24obWV0aG9kLCBpbnB1dCk7XG4gIGlmIChncm91cCA9PT0gXCJmaXh0dXJlXCIpIHJldHVybiBmaXh0dXJlT3BlcmF0aW9uKG1ldGhvZCwgaW5wdXQpO1xuICBpZiAoZ3JvdXAgPT09IFwiYnVpbGRcIikgcmV0dXJuIGJ1aWxkT3BlcmF0aW9uKG1ldGhvZCk7XG4gIGlmIChncm91cCA9PT0gXCJ0ZXN0XCIpIHJldHVybiB0ZXN0T3BlcmF0aW9uKG1ldGhvZCwgaW5wdXQpO1xuICBpZiAoZ3JvdXAgPT09IFwiYXV0aFwiKSByZXR1cm4gYXV0aE9wZXJhdGlvbihtZXRob2QsIGlucHV0KTtcbiAgaWYgKGdyb3VwID09PSBcImkxOG5cIikgcmV0dXJuIGkxOG5PcGVyYXRpb24obWV0aG9kLCBpbnB1dCk7XG4gIGlmIChncm91cCA9PT0gXCJ0YXNrXCIpIHJldHVybiB0YXNrT3BlcmF0aW9uKG1ldGhvZCwgaW5wdXQpO1xuICBpZiAoZ3JvdXAgPT09IFwic3R1YlwiKSByZXR1cm4gc3R1YlByYWN0aWNlT3BlcmF0aW9uKGlucHV0KTtcbiAgcmV0dXJuIGNkZE9wZXJhdGlvbihtZXRob2QsIGlucHV0KTtcbn1cblxuLy8g6riw67O4IHJlZ2lzdHJ564qUIO2YuOy2nCDsi5zsoJDquYzsp4AgU29uYW11IOy0iOq4sO2ZlOyZgCDsmbjrtoAg7J6R7JeF7J2EIOuqqOuRkCDrr7jro7nri4jri6QuXG5leHBvcnQgY29uc3QgdG9vbGluZzogQ2xpVG9vbGluZ09wZXJhdGlvbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gIE9iamVjdC5lbnRyaWVzKFJFUVVJUkVEX01FVEhPRFMpLm1hcCgoW2dyb3VwLCBtZXRob2RzXSkgPT4gW1xuICAgIGdyb3VwLFxuICAgIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIG1ldGhvZHMubWFwKChtZXRob2QpID0+IFtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICAoaW5wdXQ6IENvbW1hbmRJbnB1dCkgPT4gaW52b2tlRGVmYXVsdChncm91cCwgbWV0aG9kLCBpbnB1dCksXG4gICAgICBdKSxcbiAgICApLFxuICBdKSxcbik7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0b29saW5nLm1pZ3JhdGlvbiwgXCJhcHBseVwiLCB7XG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICB2YWx1ZTogKGlucHV0OiBDb21tYW5kSW5wdXQpID0+IGludm9rZURlZmF1bHQoXCJtaWdyYXRpb25cIiwgXCJhcHBseVwiLCBpbnB1dCksXG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFLQSxNQUFNLGtCQUFrQixFQUFFLEtBQUs7QUFVL0IsTUFBTSxvQ0FBb0IsSUFBSSxJQUFZO0NBQ3hDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7QUFDRixDQUFDO0FBRUQsU0FBUyxzQkFBc0IsUUFBbUQ7Q0FFaEYsSUFBSSxrQkFBa0IsSUFBSSxNQUFNLEdBQUc7Q0FDbkMsTUFBTSxPQUFPLHVCQUFPLElBQUksTUFBTSxpQ0FBaUMsUUFBUSxHQUFHO0VBQ3hFLE1BQU07RUFDTixVQUFVO0NBQ1osQ0FBQztBQUNIO0FBRUEsU0FBUyw0QkFDUCxRQUNnRTtDQUNoRSxJQUFJLFdBQVcsYUFBYSxXQUFXLFFBQVE7Q0FHL0MsTUFBTSxPQUFPLHVCQUFPLElBQUksTUFBTSxvQ0FBb0MsUUFBUSxHQUFHO0VBQzNFLE1BQU07RUFDTjtFQUNBLFVBQVU7Q0FDWixDQUFDO0FBQ0g7QUFFQSxlQUFlLGNBQ2IsUUFDQSxZQUNBLFNBQStCLFNBQy9CO0NBQ0EsTUFBTSxTQUFTLE1BQU0sT0FBTyxPQUFPLE9BQ2pDLFdBQ0EsSUFBSSxZQUFZLENBQUMsQ0FBQyxPQUFPLEtBQUssVUFBVTtFQUFFO0VBQVE7RUFBUTtDQUFXLENBQUMsQ0FBQyxDQUN6RTtDQUNBLE9BQU87RUFDTCxNQUFNO0VBQ047RUFDQTtFQUNBO0VBQ0EsYUFBYSxNQUFNLEtBQUssSUFBSSxXQUFXLE1BQU0sSUFBSSxTQUMvQyxLQUFLLFNBQVMsRUFBRSxD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
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- //#region src/tooling/fixture-service.ts
2
+ // src/tooling/fixture-service.ts
3
3
  const legacyFixtureOptionsSchema = z.object({
4
4
  _: z.array(z.string()).optional(),
5
5
  all: z.boolean().optional(),
@@ -47,7 +47,6 @@ function normalizeLegacyFixtureCommandOptions(command, input) {
47
47
  userMode: normalized.userMode ?? "dummy"
48
48
  };
49
49
  }
50
- //#endregion
51
50
  export { normalizeLegacyFixtureCommandOptions, normalizeLegacyFixtureOptions };
52
51
 
53
52
  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS1zZXJ2aWNlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29saW5nL2ZpeHR1cmUtc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5jb25zdCBsZWdhY3lGaXh0dXJlT3B0aW9uc1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgXzogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICBhbGw6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGluY2x1ZGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZXhjbHVkZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBjb3VudDogei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pLm9wdGlvbmFsKCksXG4gIHN0cmF0ZWd5OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGxpbWl0OiB6LnVuaW9uKFt6LnN0cmluZygpLCB6Lm51bWJlcigpXSkub3B0aW9uYWwoKSxcbiAgc2F2ZVRvOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHVzZUxsbTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgbm9DYWNoZTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgXCJzYXZlLXRvXCI6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgXCJ1c2UtbGxtXCI6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIFwibm8tY2FjaGVcIjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgbm9uSW50ZXJhY3RpdmU6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIHVzZXJNb2RlOiB6LmVudW0oW1wibG9naW5cIiwgXCJkdW1teVwiXSkub3B0aW9uYWwoKSxcbn0pO1xuXG50eXBlIExlZ2FjeUZpeHR1cmVPcHRpb25zID0gei5pbmZlcjx0eXBlb2YgbGVnYWN5Rml4dHVyZU9wdGlvbnNTY2hlbWE+O1xuZXhwb3J0IHR5cGUgTGVnYWN5Rml4dHVyZVNvdXJjZSA9IHouaW5wdXQ8dHlwZW9mIGxlZ2FjeUZpeHR1cmVPcHRpb25zU2NoZW1hPjtcbmV4cG9ydCB0eXBlIExlZ2FjeUZpeHR1cmVDb21tYW5kID0gXCJnZW5cIiB8IFwiZmV0Y2hcIiB8IFwiZXhwbG9yZVwiO1xuZXhwb3J0IHR5cGUgTm9ybWFsaXplZExlZ2FjeUZpeHR1cmVPcHRpb25zID0gT21pdDxcbiAgTGVnYWN5Rml4dHVyZU9wdGlvbnMsXG4gIFwic2F2ZVRvXCIgfCBcInVzZUxsbVwiIHwgXCJub0NhY2hlXCJcbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVMZWdhY3lGaXh0dXJlT3B0aW9ucyhcbiAgaW5wdXQ6IExlZ2FjeUZpeHR1cmVTb3VyY2UsXG4pOiBOb3JtYWxpemVkTGVnYWN5Rml4dHVyZU9wdGlvbnMge1xuICBjb25zdCB7IHNhdmVUbywgdXNlTGxtLCBub0NhY2hlLCAuLi5vcHRpb25zIH0gPSBsZWdhY3lGaXh0dXJlT3B0aW9uc1NjaGVtYS5wYXJzZShpbnB1dCk7XG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBcInNhdmUtdG9cIjogc2F2ZVRvID8/IG9wdGlvbnNbXCJzYXZlLXRvXCJdLFxuICAgIFwidXNlLWxsbVwiOiB1c2VMbG0gPz8gb3B0aW9uc1tcInVzZS1sbG1cIl0sXG4gICAgXCJuby1jYWNoZVwiOiBub0NhY2hlID8/IG9wdGlvbnNbXCJuby1jYWNoZVwiXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaGFzTGVnYWN5Rml4dHVyZVNlbGVjdG9yKFxuICBjb21tYW5kOiBMZWdhY3lGaXh0dXJlQ29tbWFuZCxcbiAgaW5wdXQ6IE5vcm1hbGl6ZWRMZWdhY3lGaXh0dXJlT3B0aW9ucyxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBoYXNJbmNsdWRlID0gaW5wdXQuaW5jbHVkZSAhPT0gdW5kZWZpbmVkICYmIGlucHV0LmluY2x1ZGUudHJpbSgpLmxlbmd0aCA+IDA7XG4gIHJldHVybiBjb21tYW5kID09PSBcImV4cGxvcmVcIiA/IGhhc0luY2x1ZGUgOiBpbnB1dC5hbGwgPT09IHRydWUgfHwgaGFzSW5jbHVkZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUxlZ2FjeUZpeHR1cmVDb21tYW5kT3B0aW9ucyhcbiAgY29tbWFuZDogTGVnYWN5Rml4dHVyZUNvbW1hbmQsXG4gIGlucHV0OiBMZWdhY3lGaXh0dXJlU291cmNlLFxuKTogTm9ybWFsaXplZExlZ2FjeUZpeHR1cmVPcHRpb25zIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZUxlZ2FjeUZpeHR1cmVPcHRpb25zKGlucHV0KTtcbiAgaWYgKG5vcm1hbGl6ZWQubm9uSW50ZXJhY3RpdmUgIT09IHRydWUpIHJldHVybiBub3JtYWxpemVkO1xuXG4gIGlmICghaGFzTGVnYWN5Rml4dHVyZVNlbGVjdG9yKGNvbW1hbmQsIG5vcm1hbGl6ZWQpKSB7XG4gICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IoYE1pc3NpbmcgZml4dHVyZSAke2NvbW1hbmR9IHNlbGVjdG9yLmApLCB7XG4gICAgICBjb2RlOiBcIk1JU1NJTkdfQVJHVU1FTlRcIixcbiAgICAgIGV4aXRDb2RlOiAyLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGNvbW1hbmQgIT09IFwiZ2VuXCIpIHJldHVybiBub3JtYWxpemVkO1xuICByZXR1cm4ge1xuICAgIC4uLm5vcm1hbGl6ZWQsXG4gICAgY291bnQ6IG5vcm1hbGl6ZWQuY291bnQgfHwgNSxcbiAgICBcInNhdmUtdG9cIjogbm9ybWFsaXplZFtcInNhdmUtdG9cIl0gfHwgXCJkYlwiLFxuICAgIFwidXNlLWxsbVwiOiBub3JtYWxpemVkW1widXNlLWxsbVwiXSA/PyBmYWxzZSxcbiAgICBcIm5vLWNhY2hlXCI6IG5vcm1hbGl6ZWRbXCJuby1jYWNoZVwiXSA/PyBmYWxzZSxcbiAgICB1c2VyTW9kZTogbm9ybWFsaXplZC51c2VyTW9kZSA/PyBcImR1bW15XCIsXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBRUEsTUFBTSw2QkFBNkIsRUFBRSxPQUFPO0NBQzFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTO0NBQ2hDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxTQUFTO0NBQzFCLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQzdCLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxTQUFTO0NBQzdCLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRSxPQUFPLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztDQUNsRCxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUztDQUM5QixPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUUsT0FBTyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7Q0FDbEQsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVM7Q0FDNUIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFNBQVM7Q0FDN0IsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFNBQVM7Q0FDOUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVM7Q0FDL0IsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFNBQVM7Q0FDaEMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFNBQVM7Q0FDakMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUMsU0FBUztDQUNyQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTO0FBQ2hELENBQUM7QUFVRCxTQUFnQiw4QkFDZCxPQUNnQztDQUNoQyxNQUFNLEVBQUUsUUFBUSxRQUFRLFNBQVMsR0FBRyxZQUFZLDJCQUEyQixNQUFNLEtBQUs7Q0FDdEYsT0FBTztFQUNMLEdBQUc7RUFDSCxXQUFXLFVBQVUsUUFBUTtFQUM3QixXQUFXLFVBQVUsUUFBUTtFQUM3QixZQUFZLFdBQVcsUUFBUTtDQUNqQztBQUNGO0FBRUEsU0FBUyx5QkFDUCxTQUNBLE9BQ1M7Q0FDVCxNQUFNLGFBQWEsTUFBTSxZQUFZLFVBQWEsTUFBTSxRQUFRLEtBQUssQ0FBQyxDQUFDLFNBQVM7Q0FDaEYsT0FBTyxZQUFZLFlBQVksYUFBYSxNQUFNLFFBQVEsUUFBUTtBQUNwRTtBQUVBLFNBQWdCLHFDQUNkLFNBQ0EsT0FDZ0M7Q0FDaEMsTUFBTSxhQUFhLDhCQUE4QixLQUFLO0NBQ3RELElBQUksV0FBVyxtQkFBbUIsTUFBTSxPQUFPO0NBRS9DLElBQUksQ0FBQyx5QkFBeUIsU0FBUyxVQUFVLEdBQy9DLE1BQU0sT0FBTyx1QkFBTyxJQUFJLE1BQU0sbUJBQW1CLFFBQVEsV0FBVyxHQUFHO0VBQ3JFLE1BQU07RUFDTixVQUFVO0NBQ1osQ0FBQztDQUdILElBQUksWUFBWSxPQUFPLE9BQU87Q0FDOUIsT0FBTztFQUNMLEdBQUc7RUFDSCxPQUFPLFdBQVcsU0FBUztFQUMzQixXQUFXLFdBQVcsY0FBYztFQUNwQyxXQUFXLFdBQVcsY0FBYztFQUNwQyxZQUFZLFdBQVcsZUFBZTtFQUN0QyxVQUFVLFdBQVcsWUFBWTtDQUNuQztBQUNGIn0=
@@ -1,2 +1 @@
1
- import { tooling } from "./cli-tooling.js";
2
- export { tooling };
1
+ export { tooling } from "./cli-tooling.js";
@@ -1,7 +1,7 @@
1
1
  import { findApiRootPath, init_utils } from "../utils/utils.js";
2
2
  import { init_config, loadConfig } from "../api/config.js";
3
3
  import { z } from "zod";
4
- //#region src/tooling/test-run-client.ts
4
+ // src/tooling/test-run-client.ts
5
5
  init_config();
6
6
  init_utils();
7
7
  var TestRunClientError = class extends Error {
@@ -114,7 +114,6 @@ function createDefaultTestRunClient(projectRoot = findApiRootPath()) {
114
114
  fetch: globalThis.fetch
115
115
  });
116
116
  }
117
- //#endregion
118
117
  export { createDefaultTestRunClient };
119
118
 
120
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1ydW4tY2xpZW50LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29saW5nL3Rlc3QtcnVuLWNsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSBcIi4uL2FwaS9jb25maWdcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RSdW5SZXF1ZXN0IHtcbiAgZmlsZXM/OiBzdHJpbmdbXTtcbiAgcGF0dGVybj86IHN0cmluZztcbiAgdHJhY2VzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFRlc3RSdW5SZXN1bHQge1xuICBvazogYm9vbGVhbjtcbiAgc3VtbWFyeToge1xuICAgIHRvdGFsOiBudW1iZXI7XG4gICAgcGFzc2VkOiBudW1iZXI7XG4gICAgZmFpbGVkOiBudW1iZXI7XG4gICAgc2tpcHBlZDogbnVtYmVyO1xuICAgIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgfTtcbiAgcmVzdWx0czogei5pbmZlcjx0eXBlb2YganNvblZhbHVlU2NoZW1hPltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RSdW5DbGllbnQge1xuICBzdGF0dXMoKTogUHJvbWlzZTxKc29uT2JqZWN0PjtcbiAgcnVuKGlucHV0OiBUZXN0UnVuUmVxdWVzdCk6IFByb21pc2U8VGVzdFJ1blJlc3VsdD47XG59XG5cbmludGVyZmFjZSBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzIHtcbiAgcHJvamVjdFJvb3Q6IHN0cmluZztcbiAgbG9hZENvbmZpZyhwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxvYmplY3Q+O1xuICBmZXRjaDogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g7XG59XG5cbmNsYXNzIFRlc3RSdW5DbGllbnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgY29kZTpcbiAgICAgIHwgXCJURVNUX1JVTl9DT05GSUdfRVJST1JcIlxuICAgICAgfCBcIlRFU1RfUlVOX0ZBSUxFRFwiXG4gICAgICB8IFwiVEVTVF9SVU5fSFRUUF9FUlJPUlwiXG4gICAgICB8IFwiVEVTVF9SVU5fTkVUV09SS19FUlJPUlwiLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJUZXN0UnVuQ2xpZW50RXJyb3JcIjtcbiAgfVxufVxuXG5jb25zdCBqc29uVmFsdWVTY2hlbWEgPSB6Lmpzb24oKTtcbmNvbnN0IGpzb25PYmplY3RTY2hlbWEgPSB6LnJlY29yZCh6LnN0cmluZygpLCBqc29uVmFsdWVTY2hlbWEpO1xudHlwZSBKc29uT2JqZWN0ID0gei5pbmZlcjx0eXBlb2YganNvbk9iamVjdFNjaGVtYT47XG5jb25zdCBjb25maWdTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHNlcnZlcjogelxuICAgIC5vYmplY3Qoe1xuICAgICAgbGlzdGVuOiB6Lm9iamVjdCh7IGhvc3Q6IHouc3RyaW5nKCkub3B0aW9uYWwoKSwgcG9ydDogei5udW1iZXIoKS5vcHRpb25hbCgpIH0pLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbiAgdGVzdDogelxuICAgIC5vYmplY3Qoe1xuICAgICAgZGV2UnVubmVyOiB6XG4gICAgICAgIC5vYmplY3QoeyBlbmFibGVkOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLCByb3V0ZVByZWZpeDogei5zdHJpbmcoKS5vcHRpb25hbCgpIH0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcbmNvbnN0IHRlc3RSdW5SZXN1bHRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG9rOiB6LmJvb2xlYW4oKSxcbiAgc3VtbWFyeTogei5vYmplY3Qoe1xuICAgIHRvdGFsOiB6Lm51bWJlcigpLFxuICAgIHBhc3NlZDogei5udW1iZXIoKSxcbiAgICBmYWlsZWQ6IHoubnVtYmVyKCksXG4gICAgc2tpcHBlZDogei5udW1iZXIoKSxcbiAgICBkdXJhdGlvbk1zOiB6Lm51bWJlcigpLFxuICB9KSxcbiAgcmVzdWx0czogei5hcnJheShqc29uVmFsdWVTY2hlbWEpLFxufSk7XG5cbi8qKlxuICogc29uYW11LmNvbmZpZ+ulvCDshozsiqQoYHNyYy9zb25hbXUuY29uZmlnLnRzYCnsl5DshJwg7J2964+E66GdIOqwleygnO2VtCDshKTsoJXsnYQg67aI65+s7Ji164uI64ukLlxuICpcbiAqIGxvYWRDb25maWfripQgVklURVNUL0hPVCDtmZjqsr3rs4DsiJjroZwgZGlzdC/shozsiqQg7ISk7KCV7J2EIOqzoOultOuvgOuhnCwgZGlzdCDruYzrk5zqsIAg7JeG64qUXG4gKiDsnbzrsJgg6rCc67CcIOyFuOyXkOyEnOuPhCDshozsiqQg7ISk7KCV7J2EIOydveuPhOuhnSBWSVRFU1Trpbwg7J6g7IucIOy8nOqzoCDsm5Drnpgg6rCS7J2EIOq3uOuMgOuhnCDrs7Xsm5Dtlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRTb3VyY2VDb25maWcoZGVwZW5kZW5jaWVzOiBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgY29uc3QgcHJldmlvdXNWaXRlc3QgPSBwcm9jZXNzLmVudi5WSVRFU1Q7XG4gIHByb2Nlc3MuZW52LlZJVEVTVCA9IFwidHJ1ZVwiO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBkZXBlbmRlbmNpZXMubG9hZENvbmZpZyhkZXBlbmRlbmNpZXMucHJvamVjdFJvb3QpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChwcmV2aW91c1ZpdGVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuVklURVNUO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzLmVudi5WSVRFU1QgPSBwcmV2aW91c1ZpdGVzdDtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJhc2VVcmwoZGVwZW5kZW5jaWVzOiBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IGNvbmZpZzogb2JqZWN0O1xuICB0cnkge1xuICAgIGNvbmZpZyA9IGF3YWl0IGxvYWRTb3VyY2VDb25maWcoZGVwZW5kZW5jaWVzKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IFRlc3RSdW5DbGllbnRFcnJvcihcbiAgICAgIFwiVEVTVF9SVU5fQ09ORklHX0VSUk9SXCIsXG4gICAgICBcInNvbmFtdS5jb25maWfrpbwg67aI65+s7JisIOyImCDsl4bsirXri4jri6QuIO2UhOuhnOygne2KuCDshKTsoJXsnYQg7ZmV7J247ZWY7IS47JqULlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcGFyc2VkQ29uZmlnID0gY29uZmlnU2NoZW1hLnBhcnNlKGNvbmZpZyk7XG4gIGNvbnN0IGxpc3RlbiA9IHBhcnNlZENvbmZpZy5zZXJ2ZXI/Lmxpc3RlbjtcbiAgY29uc3QgZGV2UnVubmVyID0gcGFyc2VkQ29uZmlnLnRlc3Q/LmRldlJ1bm5lcjtcbiAgaWYgKGRldlJ1bm5lcj8uZW5hYmxlZCAhPT0gdHJ1ZSkge1xuICAgIHRocm93IG5ldyBUZXN0UnVuQ2xpZW50RXJyb3IoXG4gICAgICBcIlRFU1RfUlVOX0NPTkZJR19FUlJPUlwiLFxuICAgICAgXCJzb25hbXUuY29uZmln7J2YIHRlc3QuZGV2UnVubmVyLmVuYWJsZWTrpbwgdHJ1ZeuhnCDshKTsoJXtlbTslbwg7ZWp64uI64ukLlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgY29uZmlndXJlZEhvc3QgPSBsaXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgY29uc3QgaG9zdCA9IFtcIjAuMC4wLjBcIiwgXCI6OlwiXS5pbmNsdWRlcyhjb25maWd1cmVkSG9zdCkgPyBcIjEyNy4wLjAuMVwiIDogY29uZmlndXJlZEhvc3Q7XG4gIGNvbnN0IHBvcnQgPSBsaXN0ZW4/LnBvcnQgPz8gMzAwMDtcbiAgY29uc3Qgcm91dGVQcmVmaXggPSBkZXZSdW5uZXIucm91dGVQcmVmaXggPz8gXCIvX190ZXN0X19cIjtcbiAgY29uc3QgcHJlZml4ID0gKHJvdXRlUHJlZml4LnN0YXJ0c1dpdGgoXCIvXCIpID8gcm91dGVQcmVmaXggOiBgLyR7cm91dGVQcmVmaXh9YCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuICByZXR1cm4gYGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH0ke3ByZWZpeH1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0SnNvbihcbiAgZGVwZW5kZW5jaWVzOiBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzLFxuICB1cmw6IHN0cmluZyxcbiAgaW5pdD86IFJlcXVlc3RJbml0LFxuKTogUHJvbWlzZTxKc29uT2JqZWN0PiB7XG4gIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gIHRyeSB7XG4gICAgcmVzcG9uc2UgPSBhd2FpdCBkZXBlbmRlbmNpZXMuZmV0Y2godXJsLCBpbml0KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IFRlc3RSdW5DbGllbnRFcnJvcihcbiAgICAgIFwiVEVTVF9SVU5fTkVUV09SS19FUlJPUlwiLFxuICAgICAgXCLroZzsu6wgRGV2UnVubmVy7JeQIOyXsOqysO2VoCDsiJgg7JeG7Iq164uI64ukLiBzb25hbXUgZGV2IOyLpO2WiSDsg4Htg5zrpbwg7ZmV7J247ZWY7IS47JqULlwiLFxuICAgICk7XG4gIH1cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBUZXN0UnVuQ2xpZW50RXJyb3IoXG4gICAgICBcIlRFU1RfUlVOX0hUVFBfRVJST1JcIixcbiAgICAgIGBEZXZSdW5uZXIg7JqU7LKt7J20IEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9IOyDge2DnOuhnCDsi6TtjKjtlojsirXri4jri6QuYCxcbiAgICApO1xuICB9XG4gIGNvbnN0IG9iamVjdCA9IGpzb25PYmplY3RTY2hlbWEuc2FmZVBhcnNlKGF3YWl0IHJlc3BvbnNlLmpzb24oKSk7XG4gIGlmICghb2JqZWN0LnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgVGVzdFJ1bkNsaWVudEVycm9yKFwiVEVTVF9SVU5fSFRUUF9FUlJPUlwiLCBcIkRldlJ1bm5lciDsnZHri7XsnbQgSlNPTiDqsJ3ssrTqsIAg7JWE64uZ64uI64ukLlwiKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0LmRhdGE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVzdWx0KHZhbHVlOiBKc29uT2JqZWN0KTogVGVzdFJ1blJlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IHRlc3RSdW5SZXN1bHRTY2hlbWEuc2FmZVBhcnNlKHZhbHVlKTtcbiAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgIHRocm93IG5ldyBUZXN0UnVuQ2xpZW50RXJyb3IoXG4gICAgICBcIlRFU1RfUlVOX0hUVFBfRVJST1JcIixcbiAgICAgIFwiRGV2UnVubmVyIO2FjOyKpO2KuCDqsrDqs7zsnZgg6rWs7KGw6rCAIOyYrOuwlOultOyngCDslYrsirXri4jri6QuXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LmRhdGE7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRlc3RSdW5DbGllbnQoZGVwZW5kZW5jaWVzOiBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzKTogVGVzdFJ1bkNsaWVudCB7XG4gIHJldHVybiB7XG4gICAgYXN5bmMgc3RhdHVzKCkge1xuICAgICAgcmV0dXJuIHJlcXVlc3RKc29uKGRlcGVuZGVuY2llcywgYCR7YXdhaXQgcmVzb2x2ZUJhc2VVcmwoZGVwZW5kZW5jaWVzKX0vc3RhdHVzYCk7XG4gICAgfSxcbiAgICBhc3luYyBydW4oaW5wdXQpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQ6IFRlc3RSdW5SZXF1ZXN0ID0ge307XG4gICAgICBpZiAoaW5wdXQuZmlsZXMgIT09IHVuZGVmaW5lZCkgcGF5bG9hZC5maWxlcyA9IGlucHV0LmZpbGVzO1xuICAgICAgaWYgKGlucHV0LnBhdHRlcm4gIT09IHVuZGVmaW5lZCkgcGF5bG9hZC5wYXR0ZXJuID0gaW5wdXQucGF0dGVybjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlUmVzdWx0KFxuICAgICAgICBhd2FpdCByZXF1ZXN0SnNvbihkZXBlbmRlbmNpZXMsIGAke2F3YWl0IHJlc29sdmVCYXNlVXJsKGRlcGVuZGVuY2llcyl9L3J1bmAsIHtcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBuZXcgVGVzdFJ1bkNsaWVudEVycm9yKFwiVEVTVF9SVU5fRkFJTEVEXCIsIFwi7YWM7Iqk7Yq4IOyLpO2WieydtCDsi6TtjKjtlojsirXri4jri6QuXCIpLFxuICAgICAgICAgIHsgZXhpdENvZGU6IDEsIHJlc3VsdCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdFRlc3RSdW5DbGllbnQocHJvamVjdFJvb3Q6IHN0cmluZyA9IGZpbmRBcGlSb290UGF0aCgpKTogVGVzdFJ1bkNsaWVudCB7XG4gIHJldHVybiBjcmVhdGVUZXN0UnVuQ2xpZW50KHtcbiAgICBwcm9qZWN0Um9vdCxcbiAgICBsb2FkQ29uZmlnLFxuICAgIGZldGNoOiBnbG9iYWxUaGlzLmZldGNoLFxuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztZQUUwQztXQUNNO0FBK0JoRCxJQUFNLHFCQUFOLGNBQWlDLE1BQU07Q0FFMUI7Q0FEWCxZQUNFLE1BS0Es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
119
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1ydW4tY2xpZW50LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b29saW5nL3Rlc3QtcnVuLWNsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBsb2FkQ29uZmlnIH0gZnJvbSBcIi4uL2FwaS9jb25maWdcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RSdW5SZXF1ZXN0IHtcbiAgZmlsZXM/OiBzdHJpbmdbXTtcbiAgcGF0dGVybj86IHN0cmluZztcbiAgdHJhY2VzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFRlc3RSdW5SZXN1bHQge1xuICBvazogYm9vbGVhbjtcbiAgc3VtbWFyeToge1xuICAgIHRvdGFsOiBudW1iZXI7XG4gICAgcGFzc2VkOiBudW1iZXI7XG4gICAgZmFpbGVkOiBudW1iZXI7XG4gICAgc2tpcHBlZDogbnVtYmVyO1xuICAgIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgfTtcbiAgcmVzdWx0czogei5pbmZlcjx0eXBlb2YganNvblZhbHVlU2NoZW1hPltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RSdW5DbGllbnQge1xuICBzdGF0dXMoKTogUHJvbWlzZTxKc29uT2JqZWN0PjtcbiAgcnVuKGlucHV0OiBUZXN0UnVuUmVxdWVzdCk6IFByb21pc2U8VGVzdFJ1blJlc3VsdD47XG59XG5cbmludGVyZmFjZSBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzIHtcbiAgcHJvamVjdFJvb3Q6IHN0cmluZztcbiAgbG9hZENvbmZpZyhwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxvYmplY3Q+O1xuICBmZXRjaDogdHlwZW9mIGdsb2JhbFRoaXMuZmV0Y2g7XG59XG5cbmNsYXNzIFRlc3RSdW5DbGllbnRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgY29kZTpcbiAgICAgIHwgXCJURVNUX1JVTl9DT05GSUdfRVJST1JcIlxuICAgICAgfCBcIlRFU1RfUlVOX0ZBSUxFRFwiXG4gICAgICB8IFwiVEVTVF9SVU5fSFRUUF9FUlJPUlwiXG4gICAgICB8IFwiVEVTVF9SVU5fTkVUV09SS19FUlJPUlwiLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJUZXN0UnVuQ2xpZW50RXJyb3JcIjtcbiAgfVxufVxuXG5jb25zdCBqc29uVmFsdWVTY2hlbWEgPSB6Lmpzb24oKTtcbmNvbnN0IGpzb25PYmplY3RTY2hlbWEgPSB6LnJlY29yZCh6LnN0cmluZygpLCBqc29uVmFsdWVTY2hlbWEpO1xudHlwZSBKc29uT2JqZWN0ID0gei5pbmZlcjx0eXBlb2YganNvbk9iamVjdFNjaGVtYT47XG5jb25zdCBjb25maWdTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHNlcnZlcjogelxuICAgIC5vYmplY3Qoe1xuICAgICAgbGlzdGVuOiB6Lm9iamVjdCh7IGhvc3Q6IHouc3RyaW5nKCkub3B0aW9uYWwoKSwgcG9ydDogei5udW1iZXIoKS5vcHRpb25hbCgpIH0pLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbiAgdGVzdDogelxuICAgIC5vYmplY3Qoe1xuICAgICAgZGV2UnVubmVyOiB6XG4gICAgICAgIC5vYmplY3QoeyBlbmFibGVkOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLCByb3V0ZVByZWZpeDogei5zdHJpbmcoKS5vcHRpb25hbCgpIH0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcbmNvbnN0IHRlc3RSdW5SZXN1bHRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG9rOiB6LmJvb2xlYW4oKSxcbiAgc3VtbWFyeTogei5vYmplY3Qoe1xuICAgIHRvdGFsOiB6Lm51bWJlcigpLFxuICAgIHBhc3NlZDogei5udW1iZXIoKSxcbiAgICBmYWlsZWQ6IHoubnVtYmVyKCksXG4gICAgc2tpcHBlZDogei5udW1iZXIoKSxcbiAgICBkdXJhdGlvbk1zOiB6Lm51bWJlcigpLFxuICB9KSxcbiAgcmVzdWx0czogei5hcnJheShqc29uVmFsdWVTY2hlbWEpLFxufSk7XG5cbi8qKlxuICogc29uYW11LmNvbmZpZ+ulvCDshozsiqQoYHNyYy9zb25hbXUuY29uZmlnLnRzYCnsl5DshJwg7J2964+E66GdIOqwleygnO2VtCDshKTsoJXsnYQg67aI65+s7Ji164uI64ukLlxuICpcbiAqIGxvYWRDb25maWfripQgVklURVNUL0hPVCDtmZjqsr3rs4DsiJjroZwgZGlzdC/shozsiqQg7ISk7KCV7J2EIOqzoOultOuvgOuhnCwgZGlzdCDruYzrk5zqsIAg7JeG64qUXG4gKiDsnbzrsJgg6rCc67CcIOyFuOyXkOyEnOuPhCDshozsiqQg7ISk7KCV7J2EIOydveuPhOuhnSBWSVRFU1Trpbwg7J6g7IucIOy8nOqzoCDsm5Drnpgg6rCS7J2EIOq3uOuMgOuhnCDrs7Xsm5Dtlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRTb3VyY2VDb25maWcoZGVwZW5kZW5jaWVzOiBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgY29uc3QgcHJldmlvdXNWaXRlc3QgPSBwcm9jZXNzLmVudi5WSVRFU1Q7XG4gIHByb2Nlc3MuZW52LlZJVEVTVCA9IFwidHJ1ZVwiO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBkZXBlbmRlbmNpZXMubG9hZENvbmZpZyhkZXBlbmRlbmNpZXMucHJvamVjdFJvb3QpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChwcmV2aW91c1ZpdGVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgcHJvY2Vzcy5lbnYuVklURVNUO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzLmVudi5WSVRFU1QgPSBwcmV2aW91c1ZpdGVzdDtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJhc2VVcmwoZGVwZW5kZW5jaWVzOiBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IGNvbmZpZzogb2JqZWN0O1xuICB0cnkge1xuICAgIGNvbmZpZyA9IGF3YWl0IGxvYWRTb3VyY2VDb25maWcoZGVwZW5kZW5jaWVzKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IFRlc3RSdW5DbGllbnRFcnJvcihcbiAgICAgIFwiVEVTVF9SVU5fQ09ORklHX0VSUk9SXCIsXG4gICAgICBcInNvbmFtdS5jb25maWfrpbwg67aI65+s7JisIOyImCDsl4bsirXri4jri6QuIO2UhOuhnOygne2KuCDshKTsoJXsnYQg7ZmV7J247ZWY7IS47JqULlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcGFyc2VkQ29uZmlnID0gY29uZmlnU2NoZW1hLnBhcnNlKGNvbmZpZyk7XG4gIGNvbnN0IGxpc3RlbiA9IHBhcnNlZENvbmZpZy5zZXJ2ZXI/Lmxpc3RlbjtcbiAgY29uc3QgZGV2UnVubmVyID0gcGFyc2VkQ29uZmlnLnRlc3Q/LmRldlJ1bm5lcjtcbiAgaWYgKGRldlJ1bm5lcj8uZW5hYmxlZCAhPT0gdHJ1ZSkge1xuICAgIHRocm93IG5ldyBUZXN0UnVuQ2xpZW50RXJyb3IoXG4gICAgICBcIlRFU1RfUlVOX0NPTkZJR19FUlJPUlwiLFxuICAgICAgXCJzb25hbXUuY29uZmln7J2YIHRlc3QuZGV2UnVubmVyLmVuYWJsZWTrpbwgdHJ1ZeuhnCDshKTsoJXtlbTslbwg7ZWp64uI64ukLlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgY29uZmlndXJlZEhvc3QgPSBsaXN0ZW4/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgY29uc3QgaG9zdCA9IFtcIjAuMC4wLjBcIiwgXCI6OlwiXS5pbmNsdWRlcyhjb25maWd1cmVkSG9zdCkgPyBcIjEyNy4wLjAuMVwiIDogY29uZmlndXJlZEhvc3Q7XG4gIGNvbnN0IHBvcnQgPSBsaXN0ZW4/LnBvcnQgPz8gMzAwMDtcbiAgY29uc3Qgcm91dGVQcmVmaXggPSBkZXZSdW5uZXIucm91dGVQcmVmaXggPz8gXCIvX190ZXN0X19cIjtcbiAgY29uc3QgcHJlZml4ID0gKHJvdXRlUHJlZml4LnN0YXJ0c1dpdGgoXCIvXCIpID8gcm91dGVQcmVmaXggOiBgLyR7cm91dGVQcmVmaXh9YCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xuICByZXR1cm4gYGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH0ke3ByZWZpeH1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0SnNvbihcbiAgZGVwZW5kZW5jaWVzOiBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzLFxuICB1cmw6IHN0cmluZyxcbiAgaW5pdD86IFJlcXVlc3RJbml0LFxuKTogUHJvbWlzZTxKc29uT2JqZWN0PiB7XG4gIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gIHRyeSB7XG4gICAgcmVzcG9uc2UgPSBhd2FpdCBkZXBlbmRlbmNpZXMuZmV0Y2godXJsLCBpbml0KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IFRlc3RSdW5DbGllbnRFcnJvcihcbiAgICAgIFwiVEVTVF9SVU5fTkVUV09SS19FUlJPUlwiLFxuICAgICAgXCLroZzsu6wgRGV2UnVubmVy7JeQIOyXsOqysO2VoCDsiJgg7JeG7Iq164uI64ukLiBzb25hbXUgZGV2IOyLpO2WiSDsg4Htg5zrpbwg7ZmV7J247ZWY7IS47JqULlwiLFxuICAgICk7XG4gIH1cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBUZXN0UnVuQ2xpZW50RXJyb3IoXG4gICAgICBcIlRFU1RfUlVOX0hUVFBfRVJST1JcIixcbiAgICAgIGBEZXZSdW5uZXIg7JqU7LKt7J20IEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9IOyDge2DnOuhnCDsi6TtjKjtlojsirXri4jri6QuYCxcbiAgICApO1xuICB9XG4gIGNvbnN0IG9iamVjdCA9IGpzb25PYmplY3RTY2hlbWEuc2FmZVBhcnNlKGF3YWl0IHJlc3BvbnNlLmpzb24oKSk7XG4gIGlmICghb2JqZWN0LnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgVGVzdFJ1bkNsaWVudEVycm9yKFwiVEVTVF9SVU5fSFRUUF9FUlJPUlwiLCBcIkRldlJ1bm5lciDsnZHri7XsnbQgSlNPTiDqsJ3ssrTqsIAg7JWE64uZ64uI64ukLlwiKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0LmRhdGE7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUmVzdWx0KHZhbHVlOiBKc29uT2JqZWN0KTogVGVzdFJ1blJlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IHRlc3RSdW5SZXN1bHRTY2hlbWEuc2FmZVBhcnNlKHZhbHVlKTtcbiAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgIHRocm93IG5ldyBUZXN0UnVuQ2xpZW50RXJyb3IoXG4gICAgICBcIlRFU1RfUlVOX0hUVFBfRVJST1JcIixcbiAgICAgIFwiRGV2UnVubmVyIO2FjOyKpO2KuCDqsrDqs7zsnZgg6rWs7KGw6rCAIOyYrOuwlOultOyngCDslYrsirXri4jri6QuXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0LmRhdGE7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVRlc3RSdW5DbGllbnQoZGVwZW5kZW5jaWVzOiBUZXN0UnVuQ2xpZW50RGVwZW5kZW5jaWVzKTogVGVzdFJ1bkNsaWVudCB7XG4gIHJldHVybiB7XG4gICAgYXN5bmMgc3RhdHVzKCkge1xuICAgICAgcmV0dXJuIHJlcXVlc3RKc29uKGRlcGVuZGVuY2llcywgYCR7YXdhaXQgcmVzb2x2ZUJhc2VVcmwoZGVwZW5kZW5jaWVzKX0vc3RhdHVzYCk7XG4gICAgfSxcbiAgICBhc3luYyBydW4oaW5wdXQpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQ6IFRlc3RSdW5SZXF1ZXN0ID0ge307XG4gICAgICBpZiAoaW5wdXQuZmlsZXMgIT09IHVuZGVmaW5lZCkgcGF5bG9hZC5maWxlcyA9IGlucHV0LmZpbGVzO1xuICAgICAgaWYgKGlucHV0LnBhdHRlcm4gIT09IHVuZGVmaW5lZCkgcGF5bG9hZC5wYXR0ZXJuID0gaW5wdXQucGF0dGVybjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlUmVzdWx0KFxuICAgICAgICBhd2FpdCByZXF1ZXN0SnNvbihkZXBlbmRlbmNpZXMsIGAke2F3YWl0IHJlc29sdmVCYXNlVXJsKGRlcGVuZGVuY2llcyl9L3J1bmAsIHtcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgaWYgKCFyZXN1bHQub2spIHtcbiAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICBuZXcgVGVzdFJ1bkNsaWVudEVycm9yKFwiVEVTVF9SVU5fRkFJTEVEXCIsIFwi7YWM7Iqk7Yq4IOyLpO2WieydtCDsi6TtjKjtlojsirXri4jri6QuXCIpLFxuICAgICAgICAgIHsgZXhpdENvZGU6IDEsIHJlc3VsdCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdFRlc3RSdW5DbGllbnQocHJvamVjdFJvb3Q6IHN0cmluZyA9IGZpbmRBcGlSb290UGF0aCgpKTogVGVzdFJ1bkNsaWVudCB7XG4gIHJldHVybiBjcmVhdGVUZXN0UnVuQ2xpZW50KHtcbiAgICBwcm9qZWN0Um9vdCxcbiAgICBsb2FkQ29uZmlnLFxuICAgIGZldGNoOiBnbG9iYWxUaGlzLmZldGNoLFxuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUUwQyxZQUFBO0FBQ00sV0FBQTtBQStCaEQsSUFBTSxxQkFBTixjQUFpQyxNQUFNO0NBRTFCO0NBRFgs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
@@ -1,6 +1,6 @@
1
1
  import { readdir, stat } from "node:fs/promises";
2
2
  import path from "node:path";
3
- //#region tsdown.api.config.ts
3
+ // tsdown.api.config.ts
4
4
  const srcRoot = path.resolve(process.cwd(), "src");
5
5
  const ignoredSuffixes = [
6
6
  ".test.ts",
@@ -42,7 +42,6 @@ var tsdown_api_config_default = {
42
42
  treeshake: false,
43
43
  unbundle: true
44
44
  };
45
- //#endregion
46
45
  export { tsdown_api_config_default as default };
47
46
 
48
47
  //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNkb3duLmFwaS5jb25maWcuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vdHNkb3duLmFwaS5jb25maWcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZGRpciwgc3RhdCB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmNvbnN0IHNyY1Jvb3QgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgXCJzcmNcIik7XG5jb25zdCBpZ25vcmVkU3VmZml4ZXMgPSBbXCIudGVzdC50c1wiLCBcIi50ZXN0LWhvbGQudHNcIiwgXCIuaWdub3JlLnRzXCIsIFwiLmQudHNcIl07XG5jb25zdCBpZ25vcmVkRGlyZWN0b3JpZXMgPSBuZXcgU2V0KFtcIl9fbW9ja3NfX1wiLCBcIl90ZW1wbGF0ZXNcIiwgXCJ3YXN0ZWRfc3JjXCJdKTtcbmludGVyZmFjZSBCdWlsZEVudHJpZXMge1xuICBbZW50cnlOYW1lOiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RFbnRyaWVzKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxCdWlsZEVudHJpZXM+IHtcbiAgY29uc3QgZW50cmllczogQnVpbGRFbnRyaWVzID0ge307XG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBhd2FpdCByZWFkZGlyKGRpcmVjdG9yeSkpIHtcbiAgICBpZiAoaWdub3JlZERpcmVjdG9yaWVzLmhhcyhlbnRyeSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHBhdGguam9pbihkaXJlY3RvcnksIGVudHJ5KTtcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHN0YXQoYWJzb2x1dGVQYXRoKTtcblxuICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGVudHJpZXMsIGF3YWl0IGNvbGxlY3RFbnRyaWVzKGFic29sdXRlUGF0aCkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIWFic29sdXRlUGF0aC5lbmRzV2l0aChcIi50c1wiKSB8fFxuICAgICAgaWdub3JlZFN1ZmZpeGVzLnNvbWUoKHN1ZmZpeCkgPT4gYWJzb2x1dGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHNyY1Jvb3QsIGFic29sdXRlUGF0aCk7XG4gICAgY29uc3QgZW50cnlOYW1lID0gcmVsYXRpdmVQYXRoLnJlcGxhY2UoL1xcLnRzJC8sIFwiXCIpLnNwbGl0KHBhdGguc2VwKS5qb2luKFwiL1wiKTtcbiAgICBlbnRyaWVzW2VudHJ5TmFtZV0gPSBhYnNvbHV0ZVBhdGg7XG4gIH1cblxuICByZXR1cm4gZW50cmllcztcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBjbGVhbjogdHJ1ZSxcbiAgZGVwczoge1xuICAgIG5ldmVyQnVuZGxlOiBbL15zb25hbXUoPzpcXC8uKik/JC9dLFxuICB9LFxuICBkdHM6IGZhbHNlLFxuICBlbnRyeTogYXdhaXQgY29sbGVjdEVudHJpZXMoc3JjUm9vdCksXG4gIGZpeGVkRXh0ZW5zaW9uOiBmYWxzZSxcbiAgZm9ybWF0OiBcImVzbVwiLFxuICBvdXREaXI6IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBcImRpc3RcIiksXG4gIHBsYXRmb3JtOiBcIm5vZGVcIixcbiAgc291cmNlbWFwOiBcImlubGluZVwiLFxuICB0YXJnZXQ6IFwiZXNuZXh0XCIsXG4gIHRyZWVzaGFrZTogZmFsc2UsXG4gIHVuYnVuZGxlOiB0cnVlLFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsTUFBTSxVQUFVLEtBQUssUUFBUSxRQUFRLElBQUksR0FBRyxLQUFLO0FBQ2pELE1BQU0sa0JBQWtCO0NBQUM7Q0FBWTtDQUFpQjtDQUFjO0FBQU87QUFDM0UsTUFBTSxxQ0FBcUIsSUFBSSxJQUFJO0NBQUM7Q0FBYTtDQUFjO0FBQVksQ0FBQztBQUs1RSxlQUFlLGVBQWUsV0FBMEM7Q0FDdEUsTUFBTSxVQUF3QixDQUFDO0NBRS9CLEtBQUssTUFBTSxTQUFTLE1BQU0sUUFBUSxTQUFTLEdBQUc7RUFDNUMsSUFBSSxtQkFBbUIsSUFBSSxLQUFLLEdBQzlCO0VBR0YsTUFBTSxlQUFlLEtBQUssS0FBSyxXQUFXLEtBQUs7RUFHL0MsS0FBSSxNQUZnQixLQUFLLFlBQVksRUFFakMsQ0FBTSxZQUFZLEdBQUc7R0FDdkIsT0FBTyxPQUFPLFNBQVMsTUFBTSxlQUFlLFlBQVksQ0FBQztHQUN6RDtFQUNGO0VBRUEsSUFDRSxDQUFDLGFBQWEsU0FBUyxLQUFLLEtBQzVCLGdCQUFnQixNQUFNLFdBQVcsYUFBYSxTQUFTLE1BQU0sQ0FBQyxHQUU5RDtFQUlGLE1BQU0sWUFEZSxLQUFLLFNBQVMsU0FBUyxZQUMxQixDQUFBLENBQWEsUUFBUSxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUc7RUFDNUUsUUFBUSxhQUFhO0NBQ3ZCO0NBRUEsT0FBTztBQUNUO0FBRUEsSUFBQSw0QkFBZTtDQUNiLE9BQU87Q0FDUCxNQUFNLEVBQ0osYUFBYSxDQUFDLG1CQUFtQixFQUNuQztDQUNBLEtBQUs7Q0FDTCxPQUFPLE1BQU0sZUFBZSxPQUFPO0NBQ25DLGdCQUFnQjtDQUNoQixRQUFRO0NBQ1IsUUFBUSxLQUFLLFFBQVEsUUFBUSxJQUFJLEdBQUcsTUFBTTtDQUMxQyxVQUFVO0NBQ1YsV0FBVztDQUNYLFFBQVE7Q0FDUixXQUFXO0NBQ1gsVUFBVTtBQUNaIn0=