sonamu 0.11.16 → 0.13.0

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 (322) 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 +30 -24
  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.d.ts +1 -0
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js +42 -6
  126. package/dist/logger/category.js +2 -3
  127. package/dist/logger/configure.js +5 -5
  128. package/dist/migration/code-generation.js +23 -16
  129. package/dist/migration/index-where-predicate.js +2 -3
  130. package/dist/migration/migration-set.js +2 -3
  131. package/dist/migration/migrator.js +2 -3
  132. package/dist/migration/postgresql-schema-reader.js +6 -9
  133. package/dist/migration/slack-confirm.js +2 -3
  134. package/dist/naite/naite-reporter.js +2 -3
  135. package/dist/naite/naite.js +10 -8
  136. package/dist/runtime-type.js +2 -3
  137. package/dist/ssr/hmr-opt-out.js +1 -2
  138. package/dist/ssr/index.js +7 -4
  139. package/dist/ssr/registry.js +1 -2
  140. package/dist/ssr/renderer.js +2 -3
  141. package/dist/storage/base-file.js +1 -2
  142. package/dist/storage/buffered-file.js +2 -3
  143. package/dist/storage/drivers.js +1 -2
  144. package/dist/storage/index.js +2 -3
  145. package/dist/storage/s3-driver.js +1 -2
  146. package/dist/storage/storage-manager.js +2 -3
  147. package/dist/storage/uploaded-file.js +2 -3
  148. package/dist/stream/__tests__/ws-test-helpers.d.ts +108 -0
  149. package/dist/stream/__tests__/ws-test-helpers.d.ts.map +1 -0
  150. package/dist/stream/__tests__/ws-test-helpers.js +259 -0
  151. package/dist/stream/index.d.ts +1 -0
  152. package/dist/stream/index.d.ts.map +1 -1
  153. package/dist/stream/index.js +15 -4
  154. package/dist/stream/sse.js +1 -2
  155. package/dist/stream/ws-audience-resolver.d.ts +8 -5
  156. package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
  157. package/dist/stream/ws-audience-resolver.js +17 -15
  158. package/dist/stream/ws-audience.js +1 -2
  159. package/dist/stream/ws-cluster-bus.d.ts +9 -4
  160. package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
  161. package/dist/stream/ws-cluster-bus.js +2 -3
  162. package/dist/stream/ws-core.d.ts +10 -0
  163. package/dist/stream/ws-core.d.ts.map +1 -1
  164. package/dist/stream/ws-delivery.d.ts +30 -4
  165. package/dist/stream/ws-delivery.d.ts.map +1 -1
  166. package/dist/stream/ws-delivery.js +200 -54
  167. package/dist/stream/ws-frame.d.ts +15 -0
  168. package/dist/stream/ws-frame.d.ts.map +1 -0
  169. package/dist/stream/ws-frame.js +28 -0
  170. package/dist/stream/ws-local-connection-store.d.ts +4 -4
  171. package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
  172. package/dist/stream/ws-local-connection-store.js +3 -4
  173. package/dist/stream/ws-presence-index.d.ts +36 -0
  174. package/dist/stream/ws-presence-index.d.ts.map +1 -0
  175. package/dist/stream/ws-presence-index.js +176 -0
  176. package/dist/stream/ws-presence-store.d.ts +39 -39
  177. package/dist/stream/ws-presence-store.d.ts.map +1 -1
  178. package/dist/stream/ws-presence-store.js +23 -154
  179. package/dist/stream/ws-registry.d.ts +45 -17
  180. package/dist/stream/ws-registry.d.ts.map +1 -1
  181. package/dist/stream/ws-registry.js +170 -62
  182. package/dist/stream/ws-session-id.d.ts +14 -0
  183. package/dist/stream/ws-session-id.d.ts.map +1 -0
  184. package/dist/stream/ws-session-id.js +36 -0
  185. package/dist/stream/ws-telemetry-memory.js +3 -4
  186. package/dist/stream/ws-telemetry-trace.js +1 -2
  187. package/dist/stream/ws-telemetry.js +2 -3
  188. package/dist/stream/ws.d.ts +20 -10
  189. package/dist/stream/ws.d.ts.map +1 -1
  190. package/dist/stream/ws.js +60 -38
  191. package/dist/syncer/api-parser.js +2 -3
  192. package/dist/syncer/checksum.js +4 -4
  193. package/dist/syncer/code-generator.js +4 -4
  194. package/dist/syncer/entity-operations.js +2 -3
  195. package/dist/syncer/event-batcher.js +1 -2
  196. package/dist/syncer/file-copy.js +2 -3
  197. package/dist/syncer/file-patterns.js +2 -3
  198. package/dist/syncer/file-tracking.js +2 -3
  199. package/dist/syncer/filesystem-dependencies.js +1 -2
  200. package/dist/syncer/index.js +8 -2
  201. package/dist/syncer/module-loader.js +8 -6
  202. package/dist/syncer/syncer-actions.js +8 -7
  203. package/dist/syncer/syncer.js +13 -8
  204. package/dist/syncer/watcher.js +2 -3
  205. package/dist/tasks/decorator.js +1 -2
  206. package/dist/tasks/step-wrapper.js +2 -3
  207. package/dist/tasks/workflow-manager.js +2 -3
  208. package/dist/template/entity-converter.js +17 -16
  209. package/dist/template/helpers.js +2 -3
  210. package/dist/template/implementations/entity.template.js +2 -3
  211. package/dist/template/implementations/entry-server.template.js +2 -3
  212. package/dist/template/implementations/generated.template.js +2 -3
  213. package/dist/template/implementations/generated_http.template.js +6 -6
  214. package/dist/template/implementations/generated_sso.template.js +2 -3
  215. package/dist/template/implementations/http_validators.template.js +2 -3
  216. package/dist/template/implementations/init_types.template.js +2 -3
  217. package/dist/template/implementations/model.template.js +4 -4
  218. package/dist/template/implementations/model_test.template.js +2 -3
  219. package/dist/template/implementations/queries.template.js +2 -3
  220. package/dist/template/implementations/sd.template.js +2 -3
  221. package/dist/template/implementations/services.template.js +2 -3
  222. package/dist/template/implementations/view_form.template.js +12 -9
  223. package/dist/template/implementations/view_id_all_select.template.js +2 -3
  224. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  225. package/dist/template/implementations/view_list.template.js +19 -17
  226. package/dist/template/implementations/view_search_input.template.js +2 -3
  227. package/dist/template/index.js +9 -3
  228. package/dist/template/template-manager.js +2 -3
  229. package/dist/template/template-types.js +1 -2
  230. package/dist/template/template.js +2 -3
  231. package/dist/template/zod-converter.js +54 -47
  232. package/dist/testing/_relation-graph.js +2 -3
  233. package/dist/testing/bootstrap.js +2 -3
  234. package/dist/testing/data-explorer.js +2 -3
  235. package/dist/testing/dev-test-routes.js +2 -3
  236. package/dist/testing/dev-vitest-manager.js +15 -12
  237. package/dist/testing/faker-mappings.js +1 -2
  238. package/dist/testing/filesystem.js +2 -3
  239. package/dist/testing/fixture-generator.js +2 -3
  240. package/dist/testing/fixture-loader.js +1 -2
  241. package/dist/testing/fixture-manager.js +12 -9
  242. package/dist/testing/global-setup.js +5 -5
  243. package/dist/testing/index.js +6 -3
  244. package/dist/testing/naite-vitest-reporter.js +1 -2
  245. package/dist/testing/parallel-db-manager.js +2 -3
  246. package/dist/testing/vitest-helpers.js +2 -3
  247. package/dist/tooling/__tests__/helpers/sonamu-test-root.js +2 -3
  248. package/dist/tooling/cdd-service.js +1 -2
  249. package/dist/tooling/cli-tooling.js +1 -2
  250. package/dist/tooling/fixture-service.js +1 -2
  251. package/dist/tooling/index.js +1 -2
  252. package/dist/tooling/test-run-client.js +2 -3
  253. package/dist/tsdown.api.config.js +1 -2
  254. package/dist/types/types.js +2 -3
  255. package/dist/ui/ai-api.d.ts.map +1 -1
  256. package/dist/ui/ai-api.js +4 -5
  257. package/dist/ui/ai-client.d.ts +2 -2
  258. package/dist/ui/ai-client.d.ts.map +1 -1
  259. package/dist/ui/ai-client.js +9 -8
  260. package/dist/ui/api.d.ts.map +1 -1
  261. package/dist/ui/api.js +11 -8
  262. package/dist/ui/async-route.js +1 -2
  263. package/dist/ui/cdd-service.js +22 -21
  264. package/dist/ui/migrations-api.js +6 -5
  265. package/dist/ui-web/assets/index-QDMyy31K.js +180 -0
  266. package/dist/ui-web/assets/index-dV7akMFB.css +1 -0
  267. package/dist/ui-web/index.html +2 -2
  268. package/dist/utils/async-utils.js +1 -2
  269. package/dist/utils/class-name.js +1 -2
  270. package/dist/utils/console-util.js +1 -2
  271. package/dist/utils/controller.js +2 -3
  272. package/dist/utils/esm-utils.js +1 -2
  273. package/dist/utils/fs-utils.js +2 -3
  274. package/dist/utils/lodash-able.js +1 -2
  275. package/dist/utils/model.js +1 -2
  276. package/dist/utils/object-utils.js +2 -3
  277. package/dist/utils/path-utils.js +2 -3
  278. package/dist/utils/process-utils.js +2 -3
  279. package/dist/utils/runtime-value.js +1 -2
  280. package/dist/utils/sql-parser.js +2 -3
  281. package/dist/utils/type-utils.js +8 -8
  282. package/dist/utils/utils.js +2 -3
  283. package/dist/utils/zod-error.js +2 -3
  284. package/dist/vector/chunking.js +1 -2
  285. package/dist/vector/config.js +1 -2
  286. package/dist/vector/embedding.js +4 -4
  287. package/package.json +63 -63
  288. package/src/ai/agents/agent.ts +1 -1
  289. package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
  290. package/src/api/__tests__/sonamu.websocket-routes.test.ts +234 -0
  291. package/src/api/__tests__/sonamu.websocket.test.ts +241 -24
  292. package/src/api/config.ts +1 -1
  293. package/src/api/context.ts +2 -8
  294. package/src/api/sonamu.ts +46 -28
  295. package/src/auth/audit-log/plugin.ts +2 -0
  296. package/src/compress/types.ts +1 -1
  297. package/src/exceptions/error-handler.ts +3 -2
  298. package/src/index.ts +1 -0
  299. package/src/stream/__tests__/ws-contracts.test.ts +483 -265
  300. package/src/stream/__tests__/ws-multinode.test.ts +326 -0
  301. package/src/stream/__tests__/ws-registry-async.test.ts +855 -0
  302. package/src/stream/__tests__/ws-test-helpers.ts +360 -0
  303. package/src/stream/__tests__/ws.test.ts +342 -145
  304. package/src/stream/index.ts +1 -0
  305. package/src/stream/ws-audience-resolver.ts +21 -19
  306. package/src/stream/ws-cluster-bus.ts +12 -4
  307. package/src/stream/ws-core.ts +14 -0
  308. package/src/stream/ws-delivery.ts +321 -97
  309. package/src/stream/ws-frame.ts +39 -0
  310. package/src/stream/ws-local-connection-store.ts +10 -9
  311. package/src/stream/ws-presence-index.ts +273 -0
  312. package/src/stream/ws-presence-store.ts +64 -284
  313. package/src/stream/ws-registry.ts +272 -85
  314. package/src/stream/ws-session-id.ts +39 -0
  315. package/src/stream/ws.ts +91 -50
  316. package/src/template/implementations/model.template.ts +3 -3
  317. package/src/template/implementations/view_list.template.ts +12 -13
  318. package/src/ui/ai-api.ts +4 -2
  319. package/src/ui/ai-client.ts +2 -2
  320. package/src/ui/api.ts +58 -62
  321. package/dist/ui-web/assets/index-BMdIyKXS.css +0 -1
  322. package/dist/ui-web/assets/index-LpE8u19O.js +0 -178
@@ -5,7 +5,7 @@ import { createKnexInstance, init_knex } from "./knex.js";
5
5
  import { TransactionContext, init_transaction_context } from "./transaction-context.js";
6
6
  import { AsyncLocalStorage } from "async_hooks";
7
7
  import assert from "assert";
8
- //#region src/database/db.ts
8
+ // src/database/db.ts
9
9
  function isPlainObject(value) {
10
10
  return isObjectValue(value) && !Array.isArray(value);
11
11
  }
@@ -83,7 +83,8 @@ var init_db = __esmMin((() => {
83
83
  currentConfig = null;
84
84
  transactionStorage = new AsyncLocalStorage();
85
85
  runWithTransactionScope(preset, transaction, callback) {
86
- const transactionContext = new TransactionContext(this.transactionStorage.getStore(), {
86
+ const parentContext = this.transactionStorage.getStore();
87
+ const transactionContext = new TransactionContext(parentContext, {
87
88
  preset,
88
89
  transaction
89
90
  });
@@ -251,8 +252,7 @@ var init_db = __esmMin((() => {
251
252
  };
252
253
  DB = new DBClass();
253
254
  }));
254
- //#endregion
255
255
  init_db();
256
256
  export { DB, DBClass, init_db };
257
257
 
258
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFiYXNlL2RiLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcblxuaW1wb3J0IHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcblxuaW1wb3J0IHsgdHlwZSBEYXRhYmFzZUNvbmZpZywgdHlwZSBTb25hbXVDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZ2V0U29uYW11RW52aXJvbm1lbnQsIHR5cGUgRW52aXJvbm1lbnRTbmFwc2hvdHMsIHR5cGUgU29uYW11RW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vZW52XCI7XG5pbXBvcnQgeyBpc09iamVjdFZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IGNyZWF0ZUtuZXhJbnN0YW5jZSB9IGZyb20gXCIuL2tuZXhcIjtcbmltcG9ydCB7IHR5cGUgUHVyaVRyYW5zYWN0aW9uV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHJhbnNhY3Rpb24tY29udGV4dFwiO1xuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0PFZhbHVlPih2YWx1ZTogVmFsdWUpOiB2YWx1ZSBpcyBWYWx1ZSAmIG9iamVjdCB7XG4gIHJldHVybiBpc09iamVjdFZhbHVlKHZhbHVlKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUmVjb3JkPFRhcmdldCBleHRlbmRzIG9iamVjdCwgU291cmNlIGV4dGVuZHMgb2JqZWN0PihcbiAgdGFyZ2V0OiBUYXJnZXQsXG4gIHNvdXJjZTogU291cmNlLFxuKTogVGFyZ2V0IHtcbiAgY29uc3QgdGFyZ2V0RW50cmllcyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXModGFyZ2V0KSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSkge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRhcmdldEVudHJpZXMuZ2V0KGtleSk7XG4gICAgY29uc3QgbWVyZ2VkVmFsdWUgPVxuICAgICAgaXNQbGFpbk9iamVjdChjdXJyZW50VmFsdWUpICYmIGlzUGxhaW5PYmplY3QodmFsdWUpXG4gICAgICAgID8gbWVyZ2VSZWNvcmQoeyAuLi5jdXJyZW50VmFsdWUgfSwgdmFsdWUpXG4gICAgICAgIDogdmFsdWU7XG4gICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IG1lcmdlZFZhbHVlIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gbWVyZ2VDb25maWdzPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBiYXNlQ29uZmlnOiBULFxuICAuLi5jb25maWdzOiAoUGFydGlhbDxUPiB8IHVuZGVmaW5lZCB8IG51bGwpW11cbik6IFQge1xuICBjb25zdCBtZXJnZWQgPSB7IC4uLmJhc2VDb25maWcgfTtcblxuICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBjb25maWdzKSB7XG4gICAgaWYgKGNvbmZpZyAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZyAhPT0gbnVsbCkge1xuICAgICAgbWVyZ2VSZWNvcmQobWVyZ2VkLCBjb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbmV4cG9ydCB0eXBlIFNvbmFtdU1haW5EQlByZXNldCA9IFwidGVzdFwiIHwgXCJmaXh0dXJlXCIgfCBTb25hbXVFbnZpcm9ubWVudDtcbmV4cG9ydCB0eXBlIFNvbmFtdVJlYWRvbmx5REJQcmVzZXQgPVxuICB8IFwidGVzdF9yZWFkb25seVwiXG4gIHwgXCJkZXZlbG9wbWVudF9yZWFkb25seVwiXG4gIHwgXCJzdGFnaW5nX3JlYWRvbmx5XCJcbiAgfCBcInByb2R1Y3Rpb25fcmVhZG9ubHlcIjtcbmV4cG9ydCB0eXBlIFNvbmFtdURCUHJlc2V0ID0gU29uYW11TWFpbkRCUHJlc2V0IHwgU29uYW11UmVhZG9ubHlEQlByZXNldDtcbmV4cG9ydCB0eXBlIERCUHJlc2V0ID0gXCJ3XCIgfCBcInJcIiB8IFNvbmFtdURCUHJlc2V0O1xuXG5leHBvcnQgdHlwZSBTb25hbXVEQkNvbmZpZyA9IFJlY29yZDxTb25hbXVEQlByZXNldCwgS25leC5Db25maWc+O1xuXG5mdW5jdGlvbiBpc0NvbmNyZXRlUHJlc2V0KHZhbHVlOiBEQlByZXNldCk6IHZhbHVlIGlzIFNvbmFtdURCUHJlc2V0IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBcIndcIiAmJiB2YWx1ZSAhPT0gXCJyXCI7XG59XG5cbmZ1bmN0aW9uIGdldFJlYWRvbmx5UHJlc2V0KGVudmlyb25tZW50OiBTb25hbXVFbnZpcm9ubWVudCk6IFNvbmFtdVJlYWRvbmx5REJQcmVzZXQge1xuICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICByZXR1cm4gYCR7ZW52aXJvbm1lbnR9X3JlYWRvbmx5YCBhcyBTb25hbXVSZWFkb25seURCUHJlc2V0O1xufVxuXG5mdW5jdGlvbiBnZXRQcm9qZWN0RGF0YWJhc2VCYXNlTmFtZShwcm9qZWN0TmFtZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAocHJvamVjdE5hbWUgPz8gXCJzb25hbXVcIilcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csIFwiX1wiKVxuICAgIC5yZXBsYWNlKC9eXyt8XyskL2csIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBudW1iZXJGcm9tRW52KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgIHJldHVybiBmYWxsYmFjaztcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG4gIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRhYmFzZSBwb3J0OiAke3ZhbHVlfWApO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gY29ubmVjdGlvbkZyb21FbnYob3B0aW9uczoge1xuICBiYXNlTmFtZTogc3RyaW5nO1xuICBzdWZmaXg6IFNvbmFtdU1haW5EQlByZXNldDtcbiAgYmFzZUNvbm5lY3Rpb24/OiBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgcHJlZml4PzogXCJTT05BTVVfREJfUkVBRE9OTFlcIiB8IFwiU09OQU1VX0RCX0ZJWFRVUkVcIjtcbiAgZW52PzogTm9kZUpTLlByb2Nlc3NFbnY7XG59KTogS25leC5QZ0Nvbm5lY3Rpb25Db25maWcge1xuICBjb25zdCB7XG4gICAgYmFzZU5hbWUsXG4gICAgc3VmZml4LFxuICAgIGJhc2VDb25uZWN0aW9uID0ge30sXG4gICAgcHJlZml4ID0gXCJTT05BTVVfREJcIixcbiAgICBlbnYgPSBwcm9jZXNzLmVudixcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJlYWQgPSAoa2V5OiBcIkhPU1RcIiB8IFwiUE9SVFwiIHwgXCJVU0VSXCIgfCBcIlBBU1NXT1JEXCIgfCBcIk5BTUVcIikgPT4ge1xuICAgIGNvbnN0IHByZWZpeGVkVmFsdWUgPSBlbnZbYCR7cHJlZml4fV8ke2tleX1gXTtcbiAgICBpZiAocHJlZml4ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcHJlZml4ZWRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHByZWZpeCA9PT0gXCJTT05BTVVfREJfRklYVFVSRVwiICYmIGtleSA9PT0gXCJOQU1FXCIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudltgU09OQU1VX0RCXyR7a2V5fWBdO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uYmFzZUNvbm5lY3Rpb24sXG4gICAgaG9zdDogcmVhZChcIkhPU1RcIikgPz8gYmFzZUNvbm5lY3Rpb24uaG9zdCA/PyBcIjAuMC4wLjBcIixcbiAgICBwb3J0OiBudW1iZXJGcm9tRW52KHJlYWQoXCJQT1JUXCIpLCBiYXNlQ29ubmVjdGlvbi5wb3J0ID8/IDU0MzIpLFxuICAgIHVzZXI6IHJlYWQoXCJVU0VSXCIpID8/IGJhc2VDb25uZWN0aW9uLnVzZXIgPz8gXCJwb3N0Z3Jlc1wiLFxuICAgIHBhc3N3b3JkOiByZWFkKFwiUEFTU1dPUkRcIikgPz8gYmFzZUNvbm5lY3Rpb24ucGFzc3dvcmQsXG4gICAgZGF0YWJhc2U6IHJlYWQoXCJOQU1FXCIpID8/IGAke2Jhc2VOYW1lfV8ke3N1ZmZpeH1gLFxuICB9O1xufVxuXG5mdW5jdGlvbiBuZXV0cmFsaXplRW52aXJvbm1lbnRDb25uZWN0aW9uRmllbGRzKFxuICBjb25uZWN0aW9uOiBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZyB8IHVuZGVmaW5lZCxcbik6IEtuZXguUGdDb25uZWN0aW9uQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbm5lY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBuZXV0cmFsQ29ubmVjdGlvbiA9IHsgLi4uY29ubmVjdGlvbiB9O1xuICBkZWxldGUgbmV1dHJhbENvbm5lY3Rpb24uaG9zdDtcbiAgZGVsZXRlIG5ldXRyYWxDb25uZWN0aW9uLnBvcnQ7XG4gIGRlbGV0ZSBuZXV0cmFsQ29ubmVjdGlvbi51c2VyO1xuICBkZWxldGUgbmV1dHJhbENvbm5lY3Rpb24ucGFzc3dvcmQ7XG4gIGRlbGV0ZSBuZXV0cmFsQ29ubmVjdGlvbi5kYXRhYmFzZTtcblxuICByZXR1cm4gbmV1dHJhbENvbm5lY3Rpb247XG59XG5cbmZ1bmN0aW9uIGFzc2VydE5vTGVnYWN5RGF0YWJhc2VDb25maWcoY29uZmlnOiBTb25hbXVDb25maWdbXCJkYXRhYmFzZVwiXSk6IHZvaWQge1xuICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICBjb25zdCBsZWdhY3lDb25maWcgPSBjb25maWcgYXMgU29uYW11Q29uZmlnW1wiZGF0YWJhc2VcIl0gJiB7XG4gICAgbmFtZT86IHVua25vd247XG4gICAgZW52aXJvbm1lbnRzPzogdW5rbm93bjtcbiAgfTtcblxuICBpZiAobGVnYWN5Q29uZmlnLm5hbWUgIT09IHVuZGVmaW5lZCB8fCBsZWdhY3lDb25maWcuZW52aXJvbm1lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIlNvbmFtdSBkYXRhYmFzZS5uYW1lIGFuZCBkYXRhYmFzZS5lbnZpcm9ubWVudHMgd2VyZSByZW1vdmVkLiBVc2UgU09OQU1VX0RCXyogZG90ZW52IHZhcmlhYmxlcyBpbnN0ZWFkLlwiLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERCQ2xhc3Mge1xuICBwcml2YXRlIHdkYj86IEtuZXg7XG4gIHByaXZhdGUgcmRiPzogS25leDtcbiAgcHJpdmF0ZSBwcmVzZXREQnM6IE1hcDxTb25hbXVEQlByZXNldCwgS25leD4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgd29ya2VyREJzOiBNYXA8bnVtYmVyLCBLbmV4PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBjdXJyZW50Q29uZmlnOiBTb25hbXVEQkNvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyB0cmFuc2FjdGlvblN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8VHJhbnNhY3Rpb25Db250ZXh0PigpO1xuXG4gIHB1YmxpYyBydW5XaXRoVHJhbnNhY3Rpb25TY29wZTxUPihcbiAgICBwcmVzZXQ6IERCUHJlc2V0LFxuICAgIHRyYW5zYWN0aW9uOiBQdXJpVHJhbnNhY3Rpb25XcmFwcGVyLFxuICAgIGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBwYXJlbnRDb250ZXh0ID0gdGhpcy50cmFuc2FjdGlvblN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkNvbnRleHQgPSBuZXcgVHJhbnNhY3Rpb25Db250ZXh0KHBhcmVudENvbnRleHQsIHsgcHJlc2V0LCB0cmFuc2FjdGlvbiB9KTtcblxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU3RvcmFnZS5ydW4odHJhbnNhY3Rpb25Db250ZXh0LCBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIGRldGFjaGVkIGRlc2NlbmRhbnTqsIAg7JmE66OM65CcIO2KuOuenOyereyFmOydhCDri6Tsi5wg7IKs7Jqp7ZWY7KeAIOyViuuPhOuhnSBsb2NhbCBzY29wZeulvCDruYTsmrTri6QuXG4gICAgICAgIHRyYW5zYWN0aW9uQ29udGV4dC5jbGVhckxvY2FsKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXRDb25maWcoZGJDb25maWc6IFNvbmFtdURCQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50Q29uZmlnID0gZGJDb25maWc7XG4gIH1cblxuICBwcml2YXRlIGdldEN1cnJlbnRDb25maWcoKTogU29uYW11REJDb25maWcge1xuICAgIGlmICh0aGlzLmN1cnJlbnRDb25maWcgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBEQiBjb25maWcgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRDb25maWc7XG4gIH1cblxuICBwdWJsaWMgZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCk6IFRyYW5zYWN0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TdG9yYWdlLmdldFN0b3JlKCkgPz8gbmV3IFRyYW5zYWN0aW9uQ29udGV4dCgpO1xuICB9XG5cbiAgZ2V0REIod2hpY2g6IERCUHJlc2V0KTogS25leCB7XG4gICAgY29uc3QgZGJDb25maWcgPSB0aGlzLmdldEN1cnJlbnRDb25maWcoKTtcblxuICAgIGlmIChpc0NvbmNyZXRlUHJlc2V0KHdoaWNoKSkge1xuICAgICAgaWYgKCF0aGlzLnByZXNldERCcy5oYXMod2hpY2gpKSB7XG4gICAgICAgIHRoaXMucHJlc2V0REJzLnNldCh3aGljaCwgY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnW3doaWNoXSkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYiA9IHRoaXMucHJlc2V0REJzLmdldCh3aGljaCk7XG4gICAgICBhc3NlcnQoZGIsIGBEQiBwcmVzZXQgJHt3aGljaH0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm4gZGI7XG4gICAgfVxuXG4gICAgaWYgKGdldFNvbmFtdUVudmlyb25tZW50KCkgPT09IFwidGVzdFwiKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuU09OQU1VX1dPUktFUl9EQiA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0V29ya2VyREIoZGJDb25maWcpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy50ZXN0VHJhbnNhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVzdFRyYW5zYWN0aW9uO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLndkYikge1xuICAgICAgICByZXR1cm4gdGhpcy53ZGI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZSh7XG4gICAgICAgICAgLi4uZGJDb25maWcudGVzdCxcbiAgICAgICAgICBwb29sOiB7XG4gICAgICAgICAgICBtaW46IDEsXG4gICAgICAgICAgICBtYXg6IDEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLndkYjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZU5hbWUgPSB3aGljaCA9PT0gXCJ3XCIgPyBcIndkYlwiIDogXCJyZGJcIjtcblxuICAgIGlmICghdGhpc1tpbnN0YW5jZU5hbWVdKSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldERCQ29uZmlnKHdoaWNoKTtcbiAgICAgIHRoaXNbaW5zdGFuY2VOYW1lXSA9IGNyZWF0ZUtuZXhJbnN0YW5jZShjb25maWcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzW2luc3RhbmNlTmFtZV07XG4gIH1cblxuICBwcml2YXRlIGdldFdvcmtlckRCKGRiQ29uZmlnOiBTb25hbXVEQkNvbmZpZyk6IEtuZXgge1xuICAgIGlmICh0aGlzLnRlc3RUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMudGVzdFRyYW5zYWN0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlcklkID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSUQgPz8gXCIxXCIsIDEwKTtcblxuICAgIGlmICghdGhpcy53b3JrZXJEQnMuaGFzKHdvcmtlcklkKSkge1xuICAgICAgY29uc3QgYmFzZVRlc3RDb25maWcgPSBkYkNvbmZpZy50ZXN0O1xuICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBiYXNlVGVzdENvbmZpZy5jb25uZWN0aW9uIGFzIHsgZGF0YWJhc2U6IHN0cmluZyB9O1xuICAgICAgY29uc3Qgd29ya2VyRGJOYW1lID0gYCR7Y29ubmVjdGlvbi5kYXRhYmFzZX1fJHt3b3JrZXJJZH1gO1xuXG4gICAgICBjb25zdCB3b3JrZXJDb25maWcgPSB7XG4gICAgICAgIC4uLmJhc2VUZXN0Q29uZmlnLFxuICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgLi4uY29ubmVjdGlvbixcbiAgICAgICAgICBkYXRhYmFzZTogd29ya2VyRGJOYW1lLFxuICAgICAgICB9LFxuICAgICAgICBwb29sOiB7IG1pbjogMSwgbWF4OiAxIH0sXG4gICAgICB9O1xuXG4gICAgICB0aGlzLndvcmtlckRCcy5zZXQod29ya2VySWQsIGNyZWF0ZUtuZXhJbnN0YW5jZSh3b3JrZXJDb25maWcpKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYiA9IHRoaXMud29ya2VyREJzLmdldCh3b3JrZXJJZCk7XG4gICAgYXNzZXJ0KGRiLCBgV29ya2VyIERCICR7d29ya2VySWR9IG5vdCBmb3VuZGApO1xuICAgIHJldHVybiBkYjtcbiAgfVxuXG4gIGdldERCQ29uZmlnKHdoaWNoOiBEQlByZXNldCk6IEtuZXguQ29uZmlnIHtcbiAgICBjb25zdCBkYkNvbmZpZyA9IHRoaXMuZ2V0Q3VycmVudENvbmZpZygpO1xuXG4gICAgaWYgKGlzQ29uY3JldGVQcmVzZXQod2hpY2gpKSB7XG4gICAgICByZXR1cm4gZGJDb25maWdbd2hpY2hdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gZ2V0U29uYW11RW52aXJvbm1lbnQoKTtcbiAgICBpZiAoZW52aXJvbm1lbnQgPT09IFwidGVzdFwiKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB3aGljaCA9PT0gXCJ3XCIgPyBkYkNvbmZpZy50ZXN0IDogZGJDb25maWcudGVzdF9yZWFkb25seTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRhcmdldCxcbiAgICAgICAgcG9vbDoge1xuICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICBtYXg6IDEsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB3aGljaCA9PT0gXCJ3XCIgPyBkYkNvbmZpZ1tlbnZpcm9ubWVudF0gOiBkYkNvbmZpZ1tnZXRSZWFkb25seVByZXNldChlbnZpcm9ubWVudCldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy53ZGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgdGhpcy53ZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy53ZGIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLnJkYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhd2FpdCB0aGlzLnJkYi5kZXN0cm95KCk7XG4gICAgICB0aGlzLnJkYiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkYiBvZiB0aGlzLnByZXNldERCcy52YWx1ZXMoKSkge1xuICAgICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICAgIH1cbiAgICB0aGlzLnByZXNldERCcy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgZGIgb2YgdGhpcy53b3JrZXJEQnMudmFsdWVzKCkpIHtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy53b3JrZXJEQnMuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZW5lcmF0ZURCQ29uZmlnKFxuICAgIGNvbmZpZzogU29uYW11Q29uZmlnW1wiZGF0YWJhc2VcIl0sXG4gICAgcHJvamVjdE5hbWU/OiBzdHJpbmcsXG4gICAgc25hcHNob3RzPzogRW52aXJvbm1lbnRTbmFwc2hvdHMsXG4gICkge1xuICAgIGFzc2VydE5vTGVnYWN5RGF0YWJhc2VDb25maWcoY29uZmlnKTtcblxuICAgIGNvbnN0IGJhc2VOYW1lID0gZ2V0UHJvamVjdERhdGFiYXNlQmFzZU5hbWUocHJvamVjdE5hbWUpO1xuICAgIGNvbnN0IGRlZmF1bHRLbmV4Q29uZmlnID0gbWVyZ2VDb25maWdzPFBhcnRpYWw8RGF0YWJhc2VDb25maWc+PihcbiAgICAgIHtcbiAgICAgICAgY2xpZW50OiBjb25maWcuZGF0YWJhc2UgPT09IFwicGduYXRpdmVcIiA/IFwicGduYXRpdmVcIiA6IFwicG9zdGdyZXNxbFwiLFxuICAgICAgICBwb29sOiB7XG4gICAgICAgICAgbWluOiAxLFxuICAgICAgICAgIG1heDogNSxcbiAgICAgICAgfSxcbiAgICAgICAgbWlncmF0aW9uczoge1xuICAgICAgICAgIGRpcmVjdG9yeTogXCIuL3NyYy9taWdyYXRpb25zXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29uZmlnLmRlZmF1bHRPcHRpb25zLFxuICAgICk7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICBjb25zdCBiYXNlQ29ubmVjdGlvbiA9IGRlZmF1bHRLbmV4Q29uZmlnLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZW52aXJvbm1lbnRGYWxsYmFja0Nvbm5lY3Rpb24gPSBzbmFwc2hvdHNcbiAgICAgID8gbmV1dHJhbGl6ZUVudmlyb25tZW50Q29ubmVjdGlvbkZpZWxkcyhiYXNlQ29ubmVjdGlvbilcbiAgICAgIDogYmFzZUNvbm5lY3Rpb247XG5cbiAgICBjb25zdCBlbnZGb3JQcmVzZXQgPSAocHJlc2V0OiBTb25hbXVNYWluREJQcmVzZXQpOiBOb2RlSlMuUHJvY2Vzc0VudiA9PiB7XG4gICAgICBpZiAoIXNuYXBzaG90cykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnY7XG4gICAgICB9XG4gICAgICBpZiAocHJlc2V0ID09PSBcImZpeHR1cmVcIikge1xuICAgICAgICByZXR1cm4gc25hcHNob3RzLnRlc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gc25hcHNob3RzW3ByZXNldF07XG4gICAgfTtcblxuICAgIGNvbnN0IG1haW5Db25maWcgPSAocHJlc2V0OiBTb25hbXVNYWluREJQcmVzZXQpOiBLbmV4LkNvbmZpZyA9PlxuICAgICAgbWVyZ2VDb25maWdzKGRlZmF1bHRLbmV4Q29uZmlnLCB7XG4gICAgICAgIGNvbm5lY3Rpb246IGNvbm5lY3Rpb25Gcm9tRW52KHtcbiAgICAgICAgICBiYXNlTmFtZSxcbiAgICAgICAgICBzdWZmaXg6IHByZXNldCxcbiAgICAgICAgICBiYXNlQ29ubmVjdGlvbjogZW52aXJvbm1lbnRGYWxsYmFja0Nvbm5lY3Rpb24sXG4gICAgICAgICAgZW52OiBlbnZGb3JQcmVzZXQocHJlc2V0KSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICBjb25zdCByZWFkb25seUNvbmZpZyA9IChlbnZpcm9ubWVudDogU29uYW11RW52aXJvbm1lbnQpOiBLbmV4LkNvbmZpZyA9PlxuICAgICAgbWVyZ2VDb25maWdzPEtuZXguQ29uZmlnPihkZWZhdWx0S25leENvbmZpZywgbWFpbkNvbmZpZyhlbnZpcm9ubWVudCksIHtcbiAgICAgICAgY29ubmVjdGlvbjogY29ubmVjdGlvbkZyb21FbnYoe1xuICAgICAgICAgIGJhc2VOYW1lLFxuICAgICAgICAgIHN1ZmZpeDogZW52aXJvbm1lbnQsXG4gICAgICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICBiYXNlQ29ubmVjdGlvbjogbWFpbkNvbmZpZyhlbnZpcm9ubWVudCkuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZyxcbiAgICAgICAgICBwcmVmaXg6IFwiU09OQU1VX0RCX1JFQURPTkxZXCIsXG4gICAgICAgICAgZW52OiBlbnZGb3JQcmVzZXQoZW52aXJvbm1lbnQpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgdGVzdCA9IG1haW5Db25maWcoXCJ0ZXN0XCIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRlc3QsXG4gICAgICB0ZXN0X3JlYWRvbmx5OiByZWFkb25seUNvbmZpZyhcInRlc3RcIiksXG4gICAgICBmaXh0dXJlOiBtZXJnZUNvbmZpZ3MoZGVmYXVsdEtuZXhDb25maWcsIHtcbiAgICAgICAgY29ubmVjdGlvbjogY29ubmVjdGlvbkZyb21FbnYoe1xuICAgICAgICAgIGJhc2VOYW1lLFxuICAgICAgICAgIHN1ZmZpeDogXCJmaXh0dXJlXCIsXG4gICAgICAgICAgYmFzZUNvbm5lY3Rpb246IGVudmlyb25tZW50RmFsbGJhY2tDb25uZWN0aW9uLFxuICAgICAgICAgIHByZWZpeDogXCJTT05BTVVfREJfRklYVFVSRVwiLFxuICAgICAgICAgIGVudjogZW52Rm9yUHJlc2V0KFwiZml4dHVyZVwiKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIGRldmVsb3BtZW50OiBtYWluQ29uZmlnKFwiZGV2ZWxvcG1lbnRcIiksXG4gICAgICBkZXZlbG9wbWVudF9yZWFkb25seTogcmVhZG9ubHlDb25maWcoXCJkZXZlbG9wbWVudFwiKSxcbiAgICAgIHN0YWdpbmc6IG1haW5Db25maWcoXCJzdGFnaW5nXCIpLFxuICAgICAgc3RhZ2luZ19yZWFkb25seTogcmVhZG9ubHlDb25maWcoXCJzdGFnaW5nXCIpLFxuICAgICAgcHJvZHVjdGlvbjogbWFpbkNvbmZpZyhcInByb2R1Y3Rpb25cIiksXG4gICAgICBwcm9kdWN0aW9uX3JlYWRvbmx5OiByZWFkb25seUNvbmZpZyhcInByb2R1Y3Rpb25cIiksXG4gICAgfSBzYXRpc2ZpZXMgU29uYW11REJDb25maWc7XG4gIH1cblxuICBwdWJsaWMgdGVzdFRyYW5zYWN0aW9uOiBLbmV4LlRyYW5zYWN0aW9uIHwgbnVsbCA9IG51bGw7XG4gIGFzeW5jIGNyZWF0ZVRlc3RUcmFuc2FjdGlvbigpOiBQcm9taXNlPEtuZXguVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIoXCJ3XCIpO1xuICAgIHRoaXMudGVzdFRyYW5zYWN0aW9uID0gYXdhaXQgZGIudHJhbnNhY3Rpb24oKTtcbiAgICByZXR1cm4gdGhpcy50ZXN0VHJhbnNhY3Rpb247XG4gIH1cbiAgYXN5bmMgY2xlYXJUZXN0VHJhbnNhY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy50ZXN0VHJhbnNhY3Rpb24/LnJvbGxiYWNrKCk7XG4gICAgdGhpcy50ZXN0VHJhbnNhY3Rpb24gPSBudWxsO1xuICB9XG4gIGFzeW5jIGdldFRlc3RDb25uZWN0aW9uKCk6IFByb21pc2U8S25leD4ge1xuICAgIGNvbnN0IGRiID0gdGhpcy5nZXREQihcIndcIik7XG4gICAgcmV0dXJuIGRiO1xuICB9XG59XG5leHBvcnQgY29uc3QgREIgPSBuZXcgREJDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVlBLFNBQVMsY0FBcUIsT0FBdUM7Q0FDbkUsT0FBTyxjQUFjLEtBQUssS0FBSyxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBQ3JEO0FBRUEsU0FBUyxZQUNQLFFBQ0EsUUFDUTtDQUNSLE1BQU0sZ0JBQWdCLElBQUksSUFBSSxPQUFPLFFBQVEsTUFBTSxDQUFDO0NBRXBELEtBQUssTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLFFBQVEsTUFBTSxHQUFHO0VBQ2pELE1BQU0sZUFBZSxjQUFjLElBQUksR0FBRztFQUMxQyxNQUFNLGNBQ0osY0FBYyxZQUFZLEtBQUssY0FBYyxLQUFLLElBQzlDLFlBQVksRUFBRSxHQUFHLGFBQWEsR0FBRyxLQUFLLElBQ3RDO0VBQ04sT0FBTyxPQUFPLFFBQVEsR0FBRyxNQUFNLFlBQVksQ0FBQztDQUM5QztDQUVBLE9BQU87QUFDVDtBQUVBLFNBQVMsYUFDUCxZQUNBLEdBQUcsU0FDQTtDQUNILE1BQU0sU0FBUyxFQUFFLEdBQUcsV0FBVztDQUUvQixLQUFLLE1BQU0sVUFBVSxTQUNuQixJQUFJLFdBQVcsVUFBYSxXQUFXLE1BQ3JDLFlBQVksUUFBUSxNQUFNO0NBSTlCLE9BQU87QUFDVDtBQWFBLFNBQVMsaUJBQWlCLE9BQTBDO0NB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
258
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFiYXNlL2RiLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcblxuaW1wb3J0IHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcblxuaW1wb3J0IHsgdHlwZSBEYXRhYmFzZUNvbmZpZywgdHlwZSBTb25hbXVDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZ2V0U29uYW11RW52aXJvbm1lbnQsIHR5cGUgRW52aXJvbm1lbnRTbmFwc2hvdHMsIHR5cGUgU29uYW11RW52aXJvbm1lbnQgfSBmcm9tIFwiLi4vZW52XCI7XG5pbXBvcnQgeyBpc09iamVjdFZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IGNyZWF0ZUtuZXhJbnN0YW5jZSB9IGZyb20gXCIuL2tuZXhcIjtcbmltcG9ydCB7IHR5cGUgUHVyaVRyYW5zYWN0aW9uV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHJhbnNhY3Rpb24tY29udGV4dFwiO1xuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0PFZhbHVlPih2YWx1ZTogVmFsdWUpOiB2YWx1ZSBpcyBWYWx1ZSAmIG9iamVjdCB7XG4gIHJldHVybiBpc09iamVjdFZhbHVlKHZhbHVlKSAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIG1lcmdlUmVjb3JkPFRhcmdldCBleHRlbmRzIG9iamVjdCwgU291cmNlIGV4dGVuZHMgb2JqZWN0PihcbiAgdGFyZ2V0OiBUYXJnZXQsXG4gIHNvdXJjZTogU291cmNlLFxuKTogVGFyZ2V0IHtcbiAgY29uc3QgdGFyZ2V0RW50cmllcyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXModGFyZ2V0KSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSkge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRhcmdldEVudHJpZXMuZ2V0KGtleSk7XG4gICAgY29uc3QgbWVyZ2VkVmFsdWUgPVxuICAgICAgaXNQbGFpbk9iamVjdChjdXJyZW50VmFsdWUpICYmIGlzUGxhaW5PYmplY3QodmFsdWUpXG4gICAgICAgID8gbWVyZ2VSZWNvcmQoeyAuLi5jdXJyZW50VmFsdWUgfSwgdmFsdWUpXG4gICAgICAgIDogdmFsdWU7XG4gICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IG1lcmdlZFZhbHVlIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gbWVyZ2VDb25maWdzPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBiYXNlQ29uZmlnOiBULFxuICAuLi5jb25maWdzOiAoUGFydGlhbDxUPiB8IHVuZGVmaW5lZCB8IG51bGwpW11cbik6IFQge1xuICBjb25zdCBtZXJnZWQgPSB7IC4uLmJhc2VDb25maWcgfTtcblxuICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBjb25maWdzKSB7XG4gICAgaWYgKGNvbmZpZyAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZyAhPT0gbnVsbCkge1xuICAgICAgbWVyZ2VSZWNvcmQobWVyZ2VkLCBjb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbmV4cG9ydCB0eXBlIFNvbmFtdU1haW5EQlByZXNldCA9IFwidGVzdFwiIHwgXCJmaXh0dXJlXCIgfCBTb25hbXVFbnZpcm9ubWVudDtcbmV4cG9ydCB0eXBlIFNvbmFtdVJlYWRvbmx5REJQcmVzZXQgPVxuICB8IFwidGVzdF9yZWFkb25seVwiXG4gIHwgXCJkZXZlbG9wbWVudF9yZWFkb25seVwiXG4gIHwgXCJzdGFnaW5nX3JlYWRvbmx5XCJcbiAgfCBcInByb2R1Y3Rpb25fcmVhZG9ubHlcIjtcbmV4cG9ydCB0eXBlIFNvbmFtdURCUHJlc2V0ID0gU29uYW11TWFpbkRCUHJlc2V0IHwgU29uYW11UmVhZG9ubHlEQlByZXNldDtcbmV4cG9ydCB0eXBlIERCUHJlc2V0ID0gXCJ3XCIgfCBcInJcIiB8IFNvbmFtdURCUHJlc2V0O1xuXG5leHBvcnQgdHlwZSBTb25hbXVEQkNvbmZpZyA9IFJlY29yZDxTb25hbXVEQlByZXNldCwgS25leC5Db25maWc+O1xuXG5mdW5jdGlvbiBpc0NvbmNyZXRlUHJlc2V0KHZhbHVlOiBEQlByZXNldCk6IHZhbHVlIGlzIFNvbmFtdURCUHJlc2V0IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBcIndcIiAmJiB2YWx1ZSAhPT0gXCJyXCI7XG59XG5cbmZ1bmN0aW9uIGdldFJlYWRvbmx5UHJlc2V0KGVudmlyb25tZW50OiBTb25hbXVFbnZpcm9ubWVudCk6IFNvbmFtdVJlYWRvbmx5REJQcmVzZXQge1xuICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICByZXR1cm4gYCR7ZW52aXJvbm1lbnR9X3JlYWRvbmx5YCBhcyBTb25hbXVSZWFkb25seURCUHJlc2V0O1xufVxuXG5mdW5jdGlvbiBnZXRQcm9qZWN0RGF0YWJhc2VCYXNlTmFtZShwcm9qZWN0TmFtZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAocHJvamVjdE5hbWUgPz8gXCJzb25hbXVcIilcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csIFwiX1wiKVxuICAgIC5yZXBsYWNlKC9eXyt8XyskL2csIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBudW1iZXJGcm9tRW52KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZhbGxiYWNrOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgIHJldHVybiBmYWxsYmFjaztcbiAgfVxuXG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG4gIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRhYmFzZSBwb3J0OiAke3ZhbHVlfWApO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gY29ubmVjdGlvbkZyb21FbnYob3B0aW9uczoge1xuICBiYXNlTmFtZTogc3RyaW5nO1xuICBzdWZmaXg6IFNvbmFtdU1haW5EQlByZXNldDtcbiAgYmFzZUNvbm5lY3Rpb24/OiBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZztcbiAgcHJlZml4PzogXCJTT05BTVVfREJfUkVBRE9OTFlcIiB8IFwiU09OQU1VX0RCX0ZJWFRVUkVcIjtcbiAgZW52PzogTm9kZUpTLlByb2Nlc3NFbnY7XG59KTogS25leC5QZ0Nvbm5lY3Rpb25Db25maWcge1xuICBjb25zdCB7XG4gICAgYmFzZU5hbWUsXG4gICAgc3VmZml4LFxuICAgIGJhc2VDb25uZWN0aW9uID0ge30sXG4gICAgcHJlZml4ID0gXCJTT05BTVVfREJcIixcbiAgICBlbnYgPSBwcm9jZXNzLmVudixcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHJlYWQgPSAoa2V5OiBcIkhPU1RcIiB8IFwiUE9SVFwiIHwgXCJVU0VSXCIgfCBcIlBBU1NXT1JEXCIgfCBcIk5BTUVcIikgPT4ge1xuICAgIGNvbnN0IHByZWZpeGVkVmFsdWUgPSBlbnZbYCR7cHJlZml4fV8ke2tleX1gXTtcbiAgICBpZiAocHJlZml4ZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcHJlZml4ZWRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHByZWZpeCA9PT0gXCJTT05BTVVfREJfRklYVFVSRVwiICYmIGtleSA9PT0gXCJOQU1FXCIpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudltgU09OQU1VX0RCXyR7a2V5fWBdO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uYmFzZUNvbm5lY3Rpb24sXG4gICAgaG9zdDogcmVhZChcIkhPU1RcIikgPz8gYmFzZUNvbm5lY3Rpb24uaG9zdCA/PyBcIjAuMC4wLjBcIixcbiAgICBwb3J0OiBudW1iZXJGcm9tRW52KHJlYWQoXCJQT1JUXCIpLCBiYXNlQ29ubmVjdGlvbi5wb3J0ID8/IDU0MzIpLFxuICAgIHVzZXI6IHJlYWQoXCJVU0VSXCIpID8/IGJhc2VDb25uZWN0aW9uLnVzZXIgPz8gXCJwb3N0Z3Jlc1wiLFxuICAgIHBhc3N3b3JkOiByZWFkKFwiUEFTU1dPUkRcIikgPz8gYmFzZUNvbm5lY3Rpb24ucGFzc3dvcmQsXG4gICAgZGF0YWJhc2U6IHJlYWQoXCJOQU1FXCIpID8/IGAke2Jhc2VOYW1lfV8ke3N1ZmZpeH1gLFxuICB9O1xufVxuXG5mdW5jdGlvbiBuZXV0cmFsaXplRW52aXJvbm1lbnRDb25uZWN0aW9uRmllbGRzKFxuICBjb25uZWN0aW9uOiBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZyB8IHVuZGVmaW5lZCxcbik6IEtuZXguUGdDb25uZWN0aW9uQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvbm5lY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBuZXV0cmFsQ29ubmVjdGlvbiA9IHsgLi4uY29ubmVjdGlvbiB9O1xuICBkZWxldGUgbmV1dHJhbENvbm5lY3Rpb24uaG9zdDtcbiAgZGVsZXRlIG5ldXRyYWxDb25uZWN0aW9uLnBvcnQ7XG4gIGRlbGV0ZSBuZXV0cmFsQ29ubmVjdGlvbi51c2VyO1xuICBkZWxldGUgbmV1dHJhbENvbm5lY3Rpb24ucGFzc3dvcmQ7XG4gIGRlbGV0ZSBuZXV0cmFsQ29ubmVjdGlvbi5kYXRhYmFzZTtcblxuICByZXR1cm4gbmV1dHJhbENvbm5lY3Rpb247XG59XG5cbmZ1bmN0aW9uIGFzc2VydE5vTGVnYWN5RGF0YWJhc2VDb25maWcoY29uZmlnOiBTb25hbXVDb25maWdbXCJkYXRhYmFzZVwiXSk6IHZvaWQge1xuICAvLyBTQUZFVFk6IOy/vOumrCDruYzrjZTsnZgg7KCc64Sk66atIOqzhOyVveqzvCDshKDtlokg6rKA7Kad7J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICBjb25zdCBsZWdhY3lDb25maWcgPSBjb25maWcgYXMgU29uYW11Q29uZmlnW1wiZGF0YWJhc2VcIl0gJiB7XG4gICAgbmFtZT86IHVua25vd247XG4gICAgZW52aXJvbm1lbnRzPzogdW5rbm93bjtcbiAgfTtcblxuICBpZiAobGVnYWN5Q29uZmlnLm5hbWUgIT09IHVuZGVmaW5lZCB8fCBsZWdhY3lDb25maWcuZW52aXJvbm1lbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIlNvbmFtdSBkYXRhYmFzZS5uYW1lIGFuZCBkYXRhYmFzZS5lbnZpcm9ubWVudHMgd2VyZSByZW1vdmVkLiBVc2UgU09OQU1VX0RCXyogZG90ZW52IHZhcmlhYmxlcyBpbnN0ZWFkLlwiLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERCQ2xhc3Mge1xuICBwcml2YXRlIHdkYj86IEtuZXg7XG4gIHByaXZhdGUgcmRiPzogS25leDtcbiAgcHJpdmF0ZSBwcmVzZXREQnM6IE1hcDxTb25hbXVEQlByZXNldCwgS25leD4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgd29ya2VyREJzOiBNYXA8bnVtYmVyLCBLbmV4PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBjdXJyZW50Q29uZmlnOiBTb25hbXVEQkNvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyB0cmFuc2FjdGlvblN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8VHJhbnNhY3Rpb25Db250ZXh0PigpO1xuXG4gIHB1YmxpYyBydW5XaXRoVHJhbnNhY3Rpb25TY29wZTxUPihcbiAgICBwcmVzZXQ6IERCUHJlc2V0LFxuICAgIHRyYW5zYWN0aW9uOiBQdXJpVHJhbnNhY3Rpb25XcmFwcGVyLFxuICAgIGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBwYXJlbnRDb250ZXh0ID0gdGhpcy50cmFuc2FjdGlvblN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkNvbnRleHQgPSBuZXcgVHJhbnNhY3Rpb25Db250ZXh0KHBhcmVudENvbnRleHQsIHsgcHJlc2V0LCB0cmFuc2FjdGlvbiB9KTtcblxuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU3RvcmFnZS5ydW4odHJhbnNhY3Rpb25Db250ZXh0LCBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIGRldGFjaGVkIGRlc2NlbmRhbnTqsIAg7JmE66OM65CcIO2KuOuenOyereyFmOydhCDri6Tsi5wg7IKs7Jqp7ZWY7KeAIOyViuuPhOuhnSBsb2NhbCBzY29wZeulvCDruYTsmrTri6QuXG4gICAgICAgIHRyYW5zYWN0aW9uQ29udGV4dC5jbGVhckxvY2FsKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXRDb25maWcoZGJDb25maWc6IFNvbmFtdURCQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50Q29uZmlnID0gZGJDb25maWc7XG4gIH1cblxuICBwcml2YXRlIGdldEN1cnJlbnRDb25maWcoKTogU29uYW11REJDb25maWcge1xuICAgIGlmICh0aGlzLmN1cnJlbnRDb25maWcgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBEQiBjb25maWcgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRDb25maWc7XG4gIH1cblxuICBwdWJsaWMgZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCk6IFRyYW5zYWN0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TdG9yYWdlLmdldFN0b3JlKCkgPz8gbmV3IFRyYW5zYWN0aW9uQ29udGV4dCgpO1xuICB9XG5cbiAgZ2V0REIod2hpY2g6IERCUHJlc2V0KTogS25leCB7XG4gICAgY29uc3QgZGJDb25maWcgPSB0aGlzLmdldEN1cnJlbnRDb25maWcoKTtcblxuICAgIGlmIChpc0NvbmNyZXRlUHJlc2V0KHdoaWNoKSkge1xuICAgICAgaWYgKCF0aGlzLnByZXNldERCcy5oYXMod2hpY2gpKSB7XG4gICAgICAgIHRoaXMucHJlc2V0REJzLnNldCh3aGljaCwgY3JlYXRlS25leEluc3RhbmNlKGRiQ29uZmlnW3doaWNoXSkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYiA9IHRoaXMucHJlc2V0REJzLmdldCh3aGljaCk7XG4gICAgICBhc3NlcnQoZGIsIGBEQiBwcmVzZXQgJHt3aGljaH0gbm90IGZvdW5kYCk7XG4gICAgICByZXR1cm4gZGI7XG4gICAgfVxuXG4gICAgaWYgKGdldFNvbmFtdUVudmlyb25tZW50KCkgPT09IFwidGVzdFwiKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuU09OQU1VX1dPUktFUl9EQiA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0V29ya2VyREIoZGJDb25maWcpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy50ZXN0VHJhbnNhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVzdFRyYW5zYWN0aW9uO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLndkYikge1xuICAgICAgICByZXR1cm4gdGhpcy53ZGI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndkYiA9IGNyZWF0ZUtuZXhJbnN0YW5jZSh7XG4gICAgICAgICAgLi4uZGJDb25maWcudGVzdCxcbiAgICAgICAgICBwb29sOiB7XG4gICAgICAgICAgICBtaW46IDEsXG4gICAgICAgICAgICBtYXg6IDEsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLndkYjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZU5hbWUgPSB3aGljaCA9PT0gXCJ3XCIgPyBcIndkYlwiIDogXCJyZGJcIjtcblxuICAgIGlmICghdGhpc1tpbnN0YW5jZU5hbWVdKSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldERCQ29uZmlnKHdoaWNoKTtcbiAgICAgIHRoaXNbaW5zdGFuY2VOYW1lXSA9IGNyZWF0ZUtuZXhJbnN0YW5jZShjb25maWcpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzW2luc3RhbmNlTmFtZV07XG4gIH1cblxuICBwcml2YXRlIGdldFdvcmtlckRCKGRiQ29uZmlnOiBTb25hbXVEQkNvbmZpZyk6IEtuZXgge1xuICAgIGlmICh0aGlzLnRlc3RUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMudGVzdFRyYW5zYWN0aW9uO1xuICAgIH1cblxuICAgIGNvbnN0IHdvcmtlcklkID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuVklURVNUX1BPT0xfSUQgPz8gXCIxXCIsIDEwKTtcblxuICAgIGlmICghdGhpcy53b3JrZXJEQnMuaGFzKHdvcmtlcklkKSkge1xuICAgICAgY29uc3QgYmFzZVRlc3RDb25maWcgPSBkYkNvbmZpZy50ZXN0O1xuICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBiYXNlVGVzdENvbmZpZy5jb25uZWN0aW9uIGFzIHsgZGF0YWJhc2U6IHN0cmluZyB9O1xuICAgICAgY29uc3Qgd29ya2VyRGJOYW1lID0gYCR7Y29ubmVjdGlvbi5kYXRhYmFzZX1fJHt3b3JrZXJJZH1gO1xuXG4gICAgICBjb25zdCB3b3JrZXJDb25maWcgPSB7XG4gICAgICAgIC4uLmJhc2VUZXN0Q29uZmlnLFxuICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgLi4uY29ubmVjdGlvbixcbiAgICAgICAgICBkYXRhYmFzZTogd29ya2VyRGJOYW1lLFxuICAgICAgICB9LFxuICAgICAgICBwb29sOiB7IG1pbjogMSwgbWF4OiAxIH0sXG4gICAgICB9O1xuXG4gICAgICB0aGlzLndvcmtlckRCcy5zZXQod29ya2VySWQsIGNyZWF0ZUtuZXhJbnN0YW5jZSh3b3JrZXJDb25maWcpKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYiA9IHRoaXMud29ya2VyREJzLmdldCh3b3JrZXJJZCk7XG4gICAgYXNzZXJ0KGRiLCBgV29ya2VyIERCICR7d29ya2VySWR9IG5vdCBmb3VuZGApO1xuICAgIHJldHVybiBkYjtcbiAgfVxuXG4gIGdldERCQ29uZmlnKHdoaWNoOiBEQlByZXNldCk6IEtuZXguQ29uZmlnIHtcbiAgICBjb25zdCBkYkNvbmZpZyA9IHRoaXMuZ2V0Q3VycmVudENvbmZpZygpO1xuXG4gICAgaWYgKGlzQ29uY3JldGVQcmVzZXQod2hpY2gpKSB7XG4gICAgICByZXR1cm4gZGJDb25maWdbd2hpY2hdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudmlyb25tZW50ID0gZ2V0U29uYW11RW52aXJvbm1lbnQoKTtcbiAgICBpZiAoZW52aXJvbm1lbnQgPT09IFwidGVzdFwiKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB3aGljaCA9PT0gXCJ3XCIgPyBkYkNvbmZpZy50ZXN0IDogZGJDb25maWcudGVzdF9yZWFkb25seTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnRhcmdldCxcbiAgICAgICAgcG9vbDoge1xuICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICBtYXg6IDEsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB3aGljaCA9PT0gXCJ3XCIgPyBkYkNvbmZpZ1tlbnZpcm9ubWVudF0gOiBkYkNvbmZpZ1tnZXRSZWFkb25seVByZXNldChlbnZpcm9ubWVudCldO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy53ZGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgdGhpcy53ZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy53ZGIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLnJkYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhd2FpdCB0aGlzLnJkYi5kZXN0cm95KCk7XG4gICAgICB0aGlzLnJkYiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkYiBvZiB0aGlzLnByZXNldERCcy52YWx1ZXMoKSkge1xuICAgICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICAgIH1cbiAgICB0aGlzLnByZXNldERCcy5jbGVhcigpO1xuICAgIGZvciAoY29uc3QgZGIgb2YgdGhpcy53b3JrZXJEQnMudmFsdWVzKCkpIHtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy53b3JrZXJEQnMuY2xlYXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZW5lcmF0ZURCQ29uZmlnKFxuICAgIGNvbmZpZzogU29uYW11Q29uZmlnW1wiZGF0YWJhc2VcIl0sXG4gICAgcHJvamVjdE5hbWU/OiBzdHJpbmcsXG4gICAgc25hcHNob3RzPzogRW52aXJvbm1lbnRTbmFwc2hvdHMsXG4gICkge1xuICAgIGFzc2VydE5vTGVnYWN5RGF0YWJhc2VDb25maWcoY29uZmlnKTtcblxuICAgIGNvbnN0IGJhc2VOYW1lID0gZ2V0UHJvamVjdERhdGFiYXNlQmFzZU5hbWUocHJvamVjdE5hbWUpO1xuICAgIGNvbnN0IGRlZmF1bHRLbmV4Q29uZmlnID0gbWVyZ2VDb25maWdzPFBhcnRpYWw8RGF0YWJhc2VDb25maWc+PihcbiAgICAgIHtcbiAgICAgICAgY2xpZW50OiBjb25maWcuZGF0YWJhc2UgPT09IFwicGduYXRpdmVcIiA/IFwicGduYXRpdmVcIiA6IFwicG9zdGdyZXNxbFwiLFxuICAgICAgICBwb29sOiB7XG4gICAgICAgICAgbWluOiAxLFxuICAgICAgICAgIG1heDogNSxcbiAgICAgICAgfSxcbiAgICAgICAgbWlncmF0aW9uczoge1xuICAgICAgICAgIGRpcmVjdG9yeTogXCIuL3NyYy9taWdyYXRpb25zXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29uZmlnLmRlZmF1bHRPcHRpb25zLFxuICAgICk7XG4gICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICBjb25zdCBiYXNlQ29ubmVjdGlvbiA9IGRlZmF1bHRLbmV4Q29uZmlnLmNvbm5lY3Rpb24gYXMgS25leC5QZ0Nvbm5lY3Rpb25Db25maWcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZW52aXJvbm1lbnRGYWxsYmFja0Nvbm5lY3Rpb24gPSBzbmFwc2hvdHNcbiAgICAgID8gbmV1dHJhbGl6ZUVudmlyb25tZW50Q29ubmVjdGlvbkZpZWxkcyhiYXNlQ29ubmVjdGlvbilcbiAgICAgIDogYmFzZUNvbm5lY3Rpb247XG5cbiAgICBjb25zdCBlbnZGb3JQcmVzZXQgPSAocHJlc2V0OiBTb25hbXVNYWluREJQcmVzZXQpOiBOb2RlSlMuUHJvY2Vzc0VudiA9PiB7XG4gICAgICBpZiAoIXNuYXBzaG90cykge1xuICAgICAgICByZXR1cm4gcHJvY2Vzcy5lbnY7XG4gICAgICB9XG4gICAgICBpZiAocHJlc2V0ID09PSBcImZpeHR1cmVcIikge1xuICAgICAgICByZXR1cm4gc25hcHNob3RzLnRlc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gc25hcHNob3RzW3ByZXNldF07XG4gICAgfTtcblxuICAgIGNvbnN0IG1haW5Db25maWcgPSAocHJlc2V0OiBTb25hbXVNYWluREJQcmVzZXQpOiBLbmV4LkNvbmZpZyA9PlxuICAgICAgbWVyZ2VDb25maWdzKGRlZmF1bHRLbmV4Q29uZmlnLCB7XG4gICAgICAgIGNvbm5lY3Rpb246IGNvbm5lY3Rpb25Gcm9tRW52KHtcbiAgICAgICAgICBiYXNlTmFtZSxcbiAgICAgICAgICBzdWZmaXg6IHByZXNldCxcbiAgICAgICAgICBiYXNlQ29ubmVjdGlvbjogZW52aXJvbm1lbnRGYWxsYmFja0Nvbm5lY3Rpb24sXG4gICAgICAgICAgZW52OiBlbnZGb3JQcmVzZXQocHJlc2V0KSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICBjb25zdCByZWFkb25seUNvbmZpZyA9IChlbnZpcm9ubWVudDogU29uYW11RW52aXJvbm1lbnQpOiBLbmV4LkNvbmZpZyA9PlxuICAgICAgbWVyZ2VDb25maWdzPEtuZXguQ29uZmlnPihkZWZhdWx0S25leENvbmZpZywgbWFpbkNvbmZpZyhlbnZpcm9ubWVudCksIHtcbiAgICAgICAgY29ubmVjdGlvbjogY29ubmVjdGlvbkZyb21FbnYoe1xuICAgICAgICAgIGJhc2VOYW1lLFxuICAgICAgICAgIHN1ZmZpeDogZW52aXJvbm1lbnQsXG4gICAgICAgICAgLy8gU0FGRVRZOiDsv7zrpqwg67mM642U7J2YIOygnOuEpOumrSDqs4Tslb3qs7wg7ISg7ZaJIOqygOymneydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICBiYXNlQ29ubmVjdGlvbjogbWFpbkNvbmZpZyhlbnZpcm9ubWVudCkuY29ubmVjdGlvbiBhcyBLbmV4LlBnQ29ubmVjdGlvbkNvbmZpZyxcbiAgICAgICAgICBwcmVmaXg6IFwiU09OQU1VX0RCX1JFQURPTkxZXCIsXG4gICAgICAgICAgZW52OiBlbnZGb3JQcmVzZXQoZW52aXJvbm1lbnQpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgdGVzdCA9IG1haW5Db25maWcoXCJ0ZXN0XCIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRlc3QsXG4gICAgICB0ZXN0X3JlYWRvbmx5OiByZWFkb25seUNvbmZpZyhcInRlc3RcIiksXG4gICAgICBmaXh0dXJlOiBtZXJnZUNvbmZpZ3MoZGVmYXVsdEtuZXhDb25maWcsIHtcbiAgICAgICAgY29ubmVjdGlvbjogY29ubmVjdGlvbkZyb21FbnYoe1xuICAgICAgICAgIGJhc2VOYW1lLFxuICAgICAgICAgIHN1ZmZpeDogXCJmaXh0dXJlXCIsXG4gICAgICAgICAgYmFzZUNvbm5lY3Rpb246IGVudmlyb25tZW50RmFsbGJhY2tDb25uZWN0aW9uLFxuICAgICAgICAgIHByZWZpeDogXCJTT05BTVVfREJfRklYVFVSRVwiLFxuICAgICAgICAgIGVudjogZW52Rm9yUHJlc2V0KFwiZml4dHVyZVwiKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICAgIGRldmVsb3BtZW50OiBtYWluQ29uZmlnKFwiZGV2ZWxvcG1lbnRcIiksXG4gICAgICBkZXZlbG9wbWVudF9yZWFkb25seTogcmVhZG9ubHlDb25maWcoXCJkZXZlbG9wbWVudFwiKSxcbiAgICAgIHN0YWdpbmc6IG1haW5Db25maWcoXCJzdGFnaW5nXCIpLFxuICAgICAgc3RhZ2luZ19yZWFkb25seTogcmVhZG9ubHlDb25maWcoXCJzdGFnaW5nXCIpLFxuICAgICAgcHJvZHVjdGlvbjogbWFpbkNvbmZpZyhcInByb2R1Y3Rpb25cIiksXG4gICAgICBwcm9kdWN0aW9uX3JlYWRvbmx5OiByZWFkb25seUNvbmZpZyhcInByb2R1Y3Rpb25cIiksXG4gICAgfSBzYXRpc2ZpZXMgU29uYW11REJDb25maWc7XG4gIH1cblxuICBwdWJsaWMgdGVzdFRyYW5zYWN0aW9uOiBLbmV4LlRyYW5zYWN0aW9uIHwgbnVsbCA9IG51bGw7XG4gIGFzeW5jIGNyZWF0ZVRlc3RUcmFuc2FjdGlvbigpOiBQcm9taXNlPEtuZXguVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIoXCJ3XCIpO1xuICAgIHRoaXMudGVzdFRyYW5zYWN0aW9uID0gYXdhaXQgZGIudHJhbnNhY3Rpb24oKTtcbiAgICByZXR1cm4gdGhpcy50ZXN0VHJhbnNhY3Rpb247XG4gIH1cbiAgYXN5bmMgY2xlYXJUZXN0VHJhbnNhY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy50ZXN0VHJhbnNhY3Rpb24/LnJvbGxiYWNrKCk7XG4gICAgdGhpcy50ZXN0VHJhbnNhY3Rpb24gPSBudWxsO1xuICB9XG4gIGFzeW5jIGdldFRlc3RDb25uZWN0aW9uKCk6IFByb21pc2U8S25leD4ge1xuICAgIGNvbnN0IGRiID0gdGhpcy5nZXREQihcIndcIik7XG4gICAgcmV0dXJuIGRiO1xuICB9XG59XG5leHBvcnQgY29uc3QgREIgPSBuZXcgREJDbGFzcygpO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVlBLFNBQVMsY0FBcUIsT0FBdUM7Q0FDbkUsT0FBTyxjQUFjLEtBQUssS0FBSyxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBQ3JEO0FBRUEsU0FBUyxZQUNQLFFBQ0EsUUFDUTtDQUNSLE1BQU0sZ0JBQWdCLElBQUksSUFBSSxPQUFPLFFBQVEsTUFBTSxDQUFDO0NBRXBELEtBQUssTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLFFBQVEsTUFBTSxHQUFHO0VBQ2pELE1BQU0sZUFBZSxjQUFjLElBQUksR0FBRztFQUMxQyxNQUFNLGNBQ0osY0FBYyxZQUFZLEtBQUssY0FBYyxLQUFLLElBQzlDLFlBQVksRUFBRSxHQUFHLGFBQWEsR0FBRyxLQUFLLElBQ3RDO0VBQ04sT0FBTyxPQUFPLFFBQVEsR0FBRyxNQUFNLFlBQVksQ0FBQztDQUM5QztDQUVBLE9BQU87QUFDVDtBQUVBLFNBQVMsYUFDUCxZQUNBLEdBQUcsU0FDQTtDQUNILE1BQU0sU0FBUyxFQUFFLEdBQUcsV0FBVztDQUUvQixLQUFLLE1BQU0sVUFBVSxTQUNuQixJQUFJLFdBQVcsVUFBYSxXQUFXLE1BQ3JDLFlBQVksUUFBUSxNQUFNO0NBSTlCLE9BQU87QUFDVDtBQWFBLFNBQVMsaUJBQWlCLE9BQTBDO0NB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
@@ -1,7 +1,7 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { init_runtime_value, isObjectValue } from "../utils/runtime-value.js";
3
3
  import knex from "knex";
4
- //#region src/database/knex.ts
4
+ // src/database/knex.ts
5
5
  function createKnexInstance(config) {
6
6
  if (config.connection && isObjectValue(config.connection)) {
7
7
  const keepAlive = "keepAlive" in config.connection ? config.connection.keepAlive : void 0;
@@ -36,8 +36,7 @@ function createKnexInstance(config) {
36
36
  var init_knex = __esmMin((() => {
37
37
  init_runtime_value();
38
38
  }));
39
- //#endregion
40
39
  init_knex();
41
40
  export { createKnexInstance, init_knex };
42
41
 
43
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia25leC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2Uva25leC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IGtuZXggZnJvbSBcImtuZXhcIjtcblxuaW1wb3J0IHsgaXNPYmplY3RWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5cbnR5cGUgS25leENsaWVudFdpdGhDb25uZWN0aW9uID0gS25leC5DbGllbnQgJiB7XG4gIGNvbm5lY3Rpb24/OiB7XG4gICAgc3RyZWFtPzoge1xuICAgICAgc2V0S2VlcEFsaXZlPzogKGVuYWJsZTogYm9vbGVhbiwgaW5pdGlhbERlbGF5OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVLbmV4SW5zdGFuY2UoY29uZmlnOiBLbmV4LkNvbmZpZyk6IEtuZXgge1xuICBpZiAoY29uZmlnLmNvbm5lY3Rpb24gJiYgaXNPYmplY3RWYWx1ZShjb25maWcuY29ubmVjdGlvbikpIHtcbiAgICBjb25zdCBrZWVwQWxpdmUgPSBcImtlZXBBbGl2ZVwiIGluIGNvbmZpZy5jb25uZWN0aW9uID8gY29uZmlnLmNvbm5lY3Rpb24ua2VlcEFsaXZlIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGluaXRpYWxEZWxheSA9XG4gICAgICBcImtlZXBBbGl2ZUluaXRpYWxEZWxheU1pbGxpc1wiIGluIGNvbmZpZy5jb25uZWN0aW9uXG4gICAgICAgID8gY29uZmlnLmNvbm5lY3Rpb24ua2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGtlZXBBbGl2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNvbmZpZy5jb25uZWN0aW9uLCB7XG4gICAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAga2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzOiBpbml0aWFsRGVsYXkgPz8gMTAwMDAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjb25maWcucG9vbCA9IHtcbiAgICAvLyDslYTrnpjripQg6riw67O46rCS7J2066mwLCDtmLjstpzsuKHsnbQgY29uZmlnLnBvb2zroZwg642u7Ja07JO4IOyImCDsnojri6QuXG4gICAgLy8gKOyYiDog66eI7J206re466CI7J207IWYIOyDge2DnCDsobDtmozripQgZmFpbC1mYXN066W8IOychO2VtCDsp6fsnYAg7YOA7J6E7JWE7JuDICsgcHJvcGFnYXRlQ3JlYXRlRXJyb3Lrpbwg7KeA7KCVKVxuICAgIG1heENvbm5lY3Rpb25MaWZldGltZU1pbGxpczogMTgwMDAwMCxcbiAgICBtYXhDb25uZWN0aW9uTGlmZXRpbWVKaXR0ZXJNaWxsaXM6IDMwMDAwMCxcbiAgICBwcm9wYWdhdGVDcmVhdGVFcnJvcjogZmFsc2UsXG4gICAgaWRsZVRpbWVvdXRNaWxsaXM6IDEwMDAwLFxuICAgIHJlYXBJbnRlcnZhbE1pbGxpczogMTAwMCxcbiAgICBhY3F1aXJlVGltZW91dE1pbGxpczogMzAwMDAsXG4gICAgY3JlYXRlVGltZW91dE1pbGxpczogMzAwMDAsXG4gICAgLi4uY29uZmlnLnBvb2wsXG4gICAgLy8gdmFsaWRhdGUvYWZ0ZXJDcmVhdGXripQg7ZWt7IOBIO2UhOugiOyehOybjO2BrCDquLDrs7jqsJLsnYQg7IKs7Jqp7ZWc64ukLlxuICAgIHZhbGlkYXRlOiA8Q29ubmVjdGlvbj4oY29ubmVjdGlvbjogQ29ubmVjdGlvbikgPT4ge1xuICAgICAgaWYgKCFpc09iamVjdFZhbHVlKGNvbm5lY3Rpb24pKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBpc0VuZGluZyA9IFwiX2VuZGluZ1wiIGluIGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbltcIl9lbmRpbmdcIl0gPT09IHRydWU7XG4gICAgICBjb25zdCBpc0Nsb3NlZCA9IFwiX2Nsb3NlZFwiIGluIGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbltcIl9jbG9zZWRcIl0gPT09IHRydWU7XG4gICAgICByZXR1cm4gIWlzRW5kaW5nICYmICFpc0Nsb3NlZDtcbiAgICB9LFxuICAgIGFmdGVyQ3JlYXRlOiAoKFxuICAgICAgY29ubjogS25leENsaWVudFdpdGhDb25uZWN0aW9uLFxuICAgICAgZG9uZTogKGVycjogRXJyb3IgfCBudWxsLCBjb25uOiBLbmV4LkNsaWVudCkgPT4gdm9pZCxcbiAgICApID0+IHtcbiAgICAgIC8vIHBnIGRyaXZlciDshozsvJPsl5Aga2VlcEFsaXZl66W8IOyggeyaqe2VtCDsnKDtnLQg7Jew6rKwIOuLqOygiOydhCDspITsnoXri4jri6QuXG4gICAgICBpZiAoY29ubi5jb25uZWN0aW9uPy5zdHJlYW0/LnNldEtlZXBBbGl2ZSkge1xuICAgICAgICBjb25uLmNvbm5lY3Rpb24uc3RyZWFtLnNldEtlZXBBbGl2ZSh0cnVlLCAxMDAwMCk7XG4gICAgICB9XG5cbiAgICAgIGRvbmUobnVsbCwgY29ubik7XG4gICAgfSkgc2F0aXNmaWVzIEtuZXguUG9vbENvbmZpZ1tcImFmdGVyQ3JlYXRlXCJdLFxuICB9O1xuXG4gIHJldHVybiBrbmV4KGNvbmZpZyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFhQSxTQUFnQixtQkFBbUIsUUFBMkI7Q0FDNUQsSUFBSSxPQUFPLGNBQWMsY0FBYyxPQUFPLFVBQVUsR0FBRztFQUN6RCxNQUFNLFlBQVksZUFBZSxPQUFPLGFBQWEsT0FBTyxXQUFXLFlBQVk7RUFDbkYsTUFBTSxlQUNKLGlDQUFpQyxPQUFPLGFBQ3BDLE9BQU8sV0FBVyw4QkFDbEI7RUFFTixJQUFJLGNBQWMsUUFDaEIsT0FBTyxPQUFPLE9BQU8sWUFBWTtHQUMvQixXQUFXO0dBQ1gsNkJBQTZCLGdCQUFnQjtFQUMvQyxDQUFDO0NBRUw7Q0FFQSxPQUFPLE9BQU87RUFHWiw2QkFBNkI7RUFDN0IsbUNBQW1DO0VBQ25DLHNCQUFzQjtFQUN0QixtQkFBbUI7RUFDbkIsb0JBQW9CO0VBQ3BCLHNCQUFzQjtFQUN0QixxQkFBcUI7RUFDckIsR0FBRyxPQUFPO0VBRVYsV0FBdUIsZUFBMkI7R0FDaEQsSUFBSSxDQUFDLGNBQWMsVUFBVSxHQUFHLE9BQU87R0FDdkMsTUFBTSxXQUFXLGFBQWEsY0FBYyxXQUFXLGVBQWU7R0FDdEUsTUFBTSxXQUFXLGFBQWEsY0FBYyxXQUFXLGVBQWU7R0FDdEUsT0FBTyxDQUFDLFlBQVksQ0FBQztFQUN2QjtFQUNBLGVBQ0UsTUFDQSxTQUNHO0dBRUgsSUFBSSxLQUFLLFlBQVksUUFBUSxjQUMzQixLQUFLLFdBQVcsT0FBTyxhQUFhLE1BQU0sR0FBSztHQUdqRCxLQUFLLE1BQU0sSUFBSTtFQUNqQjtDQUNGO0NBRUEsT0FBTyxLQUFLLE1BQU07QUFDcEI7O29CQTFEc0QifQ==
42
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia25leC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2Uva25leC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IGtuZXggZnJvbSBcImtuZXhcIjtcblxuaW1wb3J0IHsgaXNPYmplY3RWYWx1ZSB9IGZyb20gXCIuLi91dGlscy9ydW50aW1lLXZhbHVlXCI7XG5cbnR5cGUgS25leENsaWVudFdpdGhDb25uZWN0aW9uID0gS25leC5DbGllbnQgJiB7XG4gIGNvbm5lY3Rpb24/OiB7XG4gICAgc3RyZWFtPzoge1xuICAgICAgc2V0S2VlcEFsaXZlPzogKGVuYWJsZTogYm9vbGVhbiwgaW5pdGlhbERlbGF5OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVLbmV4SW5zdGFuY2UoY29uZmlnOiBLbmV4LkNvbmZpZyk6IEtuZXgge1xuICBpZiAoY29uZmlnLmNvbm5lY3Rpb24gJiYgaXNPYmplY3RWYWx1ZShjb25maWcuY29ubmVjdGlvbikpIHtcbiAgICBjb25zdCBrZWVwQWxpdmUgPSBcImtlZXBBbGl2ZVwiIGluIGNvbmZpZy5jb25uZWN0aW9uID8gY29uZmlnLmNvbm5lY3Rpb24ua2VlcEFsaXZlIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGluaXRpYWxEZWxheSA9XG4gICAgICBcImtlZXBBbGl2ZUluaXRpYWxEZWxheU1pbGxpc1wiIGluIGNvbmZpZy5jb25uZWN0aW9uXG4gICAgICAgID8gY29uZmlnLmNvbm5lY3Rpb24ua2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGtlZXBBbGl2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNvbmZpZy5jb25uZWN0aW9uLCB7XG4gICAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAga2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzOiBpbml0aWFsRGVsYXkgPz8gMTAwMDAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBjb25maWcucG9vbCA9IHtcbiAgICAvLyDslYTrnpjripQg6riw67O46rCS7J2066mwLCDtmLjstpzsuKHsnbQgY29uZmlnLnBvb2zroZwg642u7Ja07JO4IOyImCDsnojri6QuXG4gICAgLy8gKOyYiDog66eI7J206re466CI7J207IWYIOyDge2DnCDsobDtmozripQgZmFpbC1mYXN066W8IOychO2VtCDsp6fsnYAg7YOA7J6E7JWE7JuDICsgcHJvcGFnYXRlQ3JlYXRlRXJyb3Lrpbwg7KeA7KCVKVxuICAgIG1heENvbm5lY3Rpb25MaWZldGltZU1pbGxpczogMTgwMDAwMCxcbiAgICBtYXhDb25uZWN0aW9uTGlmZXRpbWVKaXR0ZXJNaWxsaXM6IDMwMDAwMCxcbiAgICBwcm9wYWdhdGVDcmVhdGVFcnJvcjogZmFsc2UsXG4gICAgaWRsZVRpbWVvdXRNaWxsaXM6IDEwMDAwLFxuICAgIHJlYXBJbnRlcnZhbE1pbGxpczogMTAwMCxcbiAgICBhY3F1aXJlVGltZW91dE1pbGxpczogMzAwMDAsXG4gICAgY3JlYXRlVGltZW91dE1pbGxpczogMzAwMDAsXG4gICAgLi4uY29uZmlnLnBvb2wsXG4gICAgLy8gdmFsaWRhdGUvYWZ0ZXJDcmVhdGXripQg7ZWt7IOBIO2UhOugiOyehOybjO2BrCDquLDrs7jqsJLsnYQg7IKs7Jqp7ZWc64ukLlxuICAgIHZhbGlkYXRlOiA8Q29ubmVjdGlvbj4oY29ubmVjdGlvbjogQ29ubmVjdGlvbikgPT4ge1xuICAgICAgaWYgKCFpc09iamVjdFZhbHVlKGNvbm5lY3Rpb24pKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBpc0VuZGluZyA9IFwiX2VuZGluZ1wiIGluIGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbltcIl9lbmRpbmdcIl0gPT09IHRydWU7XG4gICAgICBjb25zdCBpc0Nsb3NlZCA9IFwiX2Nsb3NlZFwiIGluIGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbltcIl9jbG9zZWRcIl0gPT09IHRydWU7XG4gICAgICByZXR1cm4gIWlzRW5kaW5nICYmICFpc0Nsb3NlZDtcbiAgICB9LFxuICAgIGFmdGVyQ3JlYXRlOiAoKFxuICAgICAgY29ubjogS25leENsaWVudFdpdGhDb25uZWN0aW9uLFxuICAgICAgZG9uZTogKGVycjogRXJyb3IgfCBudWxsLCBjb25uOiBLbmV4LkNsaWVudCkgPT4gdm9pZCxcbiAgICApID0+IHtcbiAgICAgIC8vIHBnIGRyaXZlciDshozsvJPsl5Aga2VlcEFsaXZl66W8IOyggeyaqe2VtCDsnKDtnLQg7Jew6rKwIOuLqOygiOydhCDspITsnoXri4jri6QuXG4gICAgICBpZiAoY29ubi5jb25uZWN0aW9uPy5zdHJlYW0/LnNldEtlZXBBbGl2ZSkge1xuICAgICAgICBjb25uLmNvbm5lY3Rpb24uc3RyZWFtLnNldEtlZXBBbGl2ZSh0cnVlLCAxMDAwMCk7XG4gICAgICB9XG5cbiAgICAgIGRvbmUobnVsbCwgY29ubik7XG4gICAgfSkgc2F0aXNmaWVzIEtuZXguUG9vbENvbmZpZ1tcImFmdGVyQ3JlYXRlXCJdLFxuICB9O1xuXG4gIHJldHVybiBrbmV4KGNvbmZpZyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFhQSxTQUFnQixtQkFBbUIsUUFBMkI7Q0FDNUQsSUFBSSxPQUFPLGNBQWMsY0FBYyxPQUFPLFVBQVUsR0FBRztFQUN6RCxNQUFNLFlBQVksZUFBZSxPQUFPLGFBQWEsT0FBTyxXQUFXLFlBQVk7RUFDbkYsTUFBTSxlQUNKLGlDQUFpQyxPQUFPLGFBQ3BDLE9BQU8sV0FBVyw4QkFDbEI7RUFFTixJQUFJLGNBQWMsUUFDaEIsT0FBTyxPQUFPLE9BQU8sWUFBWTtHQUMvQixXQUFXO0dBQ1gsNkJBQTZCLGdCQUFnQjtFQUMvQyxDQUFDO0NBRUw7Q0FFQSxPQUFPLE9BQU87RUFHWiw2QkFBNkI7RUFDN0IsbUNBQW1DO0VBQ25DLHNCQUFzQjtFQUN0QixtQkFBbUI7RUFDbkIsb0JBQW9CO0VBQ3BCLHNCQUFzQjtFQUN0QixxQkFBcUI7RUFDckIsR0FBRyxPQUFPO0VBRVYsV0FBdUIsZUFBMkI7R0FDaEQsSUFBSSxDQUFDLGNBQWMsVUFBVSxHQUFHLE9BQU87R0FDdkMsTUFBTSxXQUFXLGFBQWEsY0FBYyxXQUFXLGVBQWU7R0FDdEUsTUFBTSxXQUFXLGFBQWEsY0FBYyxXQUFXLGVBQWU7R0FDdEUsT0FBTyxDQUFDLFlBQVksQ0FBQztFQUN2QjtFQUNBLGVBQ0UsTUFDQSxTQUNHO0dBRUgsSUFBSSxLQUFLLFlBQVksUUFBUSxjQUMzQixLQUFLLFdBQVcsT0FBTyxhQUFhLE1BQU0sR0FBSztHQUdqRCxLQUFLLE1BQU0sSUFBSTtFQUNqQjtDQUNGO0NBRUEsT0FBTyxLQUFLLE1BQU07QUFDcEI7O0NBMURzRCxtQkFBQSJ9
@@ -1,7 +1,7 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { Puri, init_puri } from "./puri.js";
3
3
  import chalk from "chalk";
4
- //#region src/database/puri-wrapper.ts
4
+ // src/database/puri-wrapper.ts
5
5
  var PuriWrapper, PuriTransactionWrapper;
6
6
  var init_puri_wrapper = __esmMin((() => {
7
7
  init_puri();
@@ -89,8 +89,7 @@ var init_puri_wrapper = __esmMin((() => {
89
89
  }
90
90
  };
91
91
  }));
92
- //#endregion
93
92
  init_puri_wrapper();
94
93
  export { PuriTransactionWrapper, PuriWrapper, init_puri_wrapper };
95
94
 
96
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVyaS13cmFwcGVyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLXdyYXBwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogb3hsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqLyAvLyBQdXJpV3JhcHBlcuuKlCDri6TslpHtlZwg7YOA7J6F7J2EIOyCrOyaqe2VmOqzoCDsnojsirXri4jri6QuXG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgREJQcmVzZXQgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHsgUHVyaSB9IGZyb20gXCIuL3B1cmlcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29sdW1uS2V5cyxcbiAgdHlwZSBJZFR5cGUsXG4gIHR5cGUgT21pdEludGVybmFsVHlwZUtleXMsXG4gIHR5cGUgUHVyaVRhYmxlLFxufSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEluc2VydE9ubHlPcHRpb25zLFxuICB0eXBlIFVCUmVmLFxuICB0eXBlIFVwc2VydEJ1aWxkZXIsXG4gIHR5cGUgVXBzZXJ0T3B0aW9ucyxcbn0gZnJvbSBcIi4vdXBzZXJ0LWJ1aWxkZXJcIjtcblxudHlwZSBUYWJsZU5hbWU8VFNjaGVtYSBleHRlbmRzIERhdGFiYXNlU2NoZW1hRXh0ZW5kPiA9IEV4dHJhY3Q8a2V5b2YgVFNjaGVtYSwgc3RyaW5nPjtcblxuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25hbE9wdGlvbnMgPSB7XG4gIGlzb2xhdGlvbj86IEV4Y2x1ZGU8S25leC5Jc29sYXRpb25MZXZlbHMsIFwic25hcHNob3RcIj47IC8vIHNuYXBzaG90OiBtc3NxbCBvbmx5XG4gIGRiUHJlc2V0PzogREJQcmVzZXQ7XG4gIHJlYWRPbmx5PzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBQdXJpV3JhcHBlcjxUU2NoZW1hIGV4dGVuZHMgRGF0YWJhc2VTY2hlbWFFeHRlbmQgPSBEYXRhYmFzZVNjaGVtYUV4dGVuZD4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMga25leDogS25leCxcbiAgICBwdWJsaWMgdXBzZXJ0QnVpbGRlcjogVXBzZXJ0QnVpbGRlcixcbiAgKSB7fVxuXG4gIHJhdyhzcWw6IHN0cmluZyk6IEtuZXguUmF3IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4LnJhdyhzcWwpO1xuICB9XG5cbiAgLy8g7YWM7J2067iU66qF7Jy866GcIOyLnOyekVxuICBmcm9tPFRUYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgUmVjb3JkPFRUYWJsZSwgUHVyaVRhYmxlPFRTY2hlbWFbVFRhYmxlXT4+LFxuICAgIE9taXRJbnRlcm5hbFR5cGVLZXlzPFB1cmlUYWJsZTxUU2NoZW1hW1RUYWJsZV0+PlxuICA+O1xuICAvLyDthYzsnbTruJTrqoUgKyBBbGlhc+uhnCDsi5zsnpFcbiAgZnJvbTxUVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KHNwZWM6IHtcbiAgICBbSyBpbiBUQWxpYXNdOiBUVGFibGU7XG4gIH0pOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgUmVjb3JkPFRBbGlhcywgUHVyaVRhYmxlPFRTY2hlbWFbVFRhYmxlXT4+LFxuICAgIE9taXRJbnRlcm5hbFR5cGVLZXlzPFB1cmlUYWJsZTxUU2NoZW1hW1RUYWJsZV0+PlxuICA+O1xuICAvLyDshJzruIzsv7zrpqzroZwg7Iuc7J6RXG4gIGZyb208VEFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihzcGVjOiB7XG4gICAgW0sgaW4gVEFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+O1xuICB9KTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFJlY29yZDxUQWxpYXMsIFB1cmlUYWJsZTxUU3ViUmVzdWx0Pj4sXG4gICAgT21pdEludGVybmFsVHlwZUtleXM8UHVyaVRhYmxlPFRTdWJSZXN1bHQ+PlxuICA+O1xuICBmcm9tKHNwZWM6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBQdXJpKHRoaXMua25leCwgc3BlYyk7XG4gIH1cblxuICAvLyDthYzsnbTruJTrqoXsnLzroZwg7Iuc7J6RXG4gIHRhYmxlPFRUYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgUmVjb3JkPFRUYWJsZSwgUHVyaVRhYmxlPFRTY2hlbWFbVFRhYmxlXT4+LFxuICAgIE9taXRJbnRlcm5hbFR5cGVLZXlzPFB1cmlUYWJsZTxUU2NoZW1hW1RUYWJsZV0+PlxuICA+O1xuICAvLyDthYzsnbTruJTrqoUgKyBBbGlhc+uhnCDsi5zsnpFcbiAgdGFibGU8VFRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEFsaWFzIGV4dGVuZHMgc3RyaW5nPihzcGVjOiB7XG4gICAgW0sgaW4gVEFsaWFzXTogVFRhYmxlO1xuICB9KTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFJlY29yZDxUQWxpYXMsIFB1cmlUYWJsZTxUU2NoZW1hW1RUYWJsZV0+PixcbiAgICBPbWl0SW50ZXJuYWxUeXBlS2V5czxQdXJpVGFibGU8VFNjaGVtYVtUVGFibGVdPj5cbiAgPjtcbiAgLy8g7ISc67iM7L+866as66GcIOyLnOyekVxuICB0YWJsZTxUQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KHNwZWM6IHtcbiAgICBbSyBpbiBUQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD47XG4gIH0pOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgUmVjb3JkPFRBbGlhcywgUHVyaVRhYmxlPFRTdWJSZXN1bHQ+PixcbiAgICBPbWl0SW50ZXJuYWxUeXBlS2V5czxQdXJpVGFibGU8VFN1YlJlc3VsdD4+XG4gID47XG4gIHRhYmxlKHNwZWM6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBQdXJpKHRoaXMua25leCwgc3BlYyk7XG4gIH1cblxuICBhc3luYyB0cmFuc2FjdGlvbjxUPihcbiAgICBjYWxsYmFjazogKHRyeDogUHVyaVRyYW5zYWN0aW9uV3JhcHBlcikgPT4gUHJvbWlzZTxUPixcbiAgICBvcHRpb25zOiBUcmFuc2FjdGlvbmFsT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB7IGlzb2xhdGlvbiwgcmVhZE9ubHksIGRiUHJlc2V0ID0gXCJ3XCIgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCB7IERCIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2RiXCIpO1xuXG4gICAgY29uc3Qgc3RhcnRUcmFuc2FjdGlvbiA9IGFzeW5jIChcbiAgICAgIGtuZXg6IEtuZXggfCBLbmV4LlRyYW5zYWN0aW9uLFxuICAgICAgdXBzZXJ0QnVpbGRlcjogVXBzZXJ0QnVpbGRlcixcbiAgICApID0+IHtcbiAgICAgIHJldHVybiBrbmV4LnRyYW5zYWN0aW9uKFxuICAgICAgICBhc3luYyAodHJ4KSA9PiB7XG4gICAgICAgICAgY29uc3QgdHJ4V3JhcHBlciA9IG5ldyBQdXJpVHJhbnNhY3Rpb25XcmFwcGVyKHRyeCwgdXBzZXJ0QnVpbGRlcik7XG5cbiAgICAgICAgICByZXR1cm4gREIucnVuV2l0aFRyYW5zYWN0aW9uU2NvcGUoZGJQcmVzZXQsIHRyeFdyYXBwZXIsICgpID0+IGNhbGxiYWNrKHRyeFdyYXBwZXIpKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyBpc29sYXRpb25MZXZlbDogaXNvbGF0aW9uLCByZWFkT25seSB9LFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZXhpc3RpbmdUcnggPSBEQi50cmFuc2FjdGlvblN0b3JhZ2UuZ2V0U3RvcmUoKT8uZ2V0VHJhbnNhY3Rpb24oZGJQcmVzZXQpO1xuICAgIGlmIChleGlzdGluZ1RyeCkge1xuICAgICAgLy8g6rCZ7J2AIHByZXNldOydmCDspJHssqkg7Yq4656c7J6t7IWY7J2AIOq4sOyhtCDsl7DqsrDsl5DshJwgU0FWRVBPSU5U66GcIOyLnOyeke2VnOuLpC5cbiAgICAgIHJldHVybiBzdGFydFRyYW5zYWN0aW9uKGV4aXN0aW5nVHJ4LnRyeCwgZXhpc3RpbmdUcngudXBzZXJ0QnVpbGRlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXJ0VHJhbnNhY3Rpb24odGhpcy5rbmV4LCB0aGlzLnVwc2VydEJ1aWxkZXIpO1xuICB9XG5cbiAgdWJSZWdpc3RlcjxUVGFibGUgZXh0ZW5kcyBUYWJsZU5hbWU8VFNjaGVtYT4+KFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICAgIHJvdzogUGFydGlhbDx7XG4gICAgICBbSyBpbiBDb2x1bW5LZXlzPFRTY2hlbWFbVFRhYmxlXT5dOiBUU2NoZW1hW1RUYWJsZV1bS10gfCBVQlJlZjtcbiAgICB9PixcbiAgKTogVUJSZWYge1xuICAgIHJldHVybiB0aGlzLnVwc2VydEJ1aWxkZXIucmVnaXN0ZXIodGFibGVOYW1lLCByb3cpO1xuICB9XG5cbiAgdWJVcHNlcnQ8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPFRTY2hlbWE+ICYga2V5b2YgRGF0YWJhc2VTY2hlbWFFeHRlbmQ+KFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICAgIG9wdGlvbnM/OiBVcHNlcnRPcHRpb25zPFRUYWJsZT4sXG4gICk6IFByb21pc2U8SWRUeXBlPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBUVGFibGU+W10+IHtcbiAgICByZXR1cm4gdGhpcy51cHNlcnRCdWlsZGVyLnVwc2VydCh0aGlzLmtuZXgsIHRhYmxlTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICB1Ykluc2VydE9ubHk8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPFRTY2hlbWE+ICYga2V5b2YgRGF0YWJhc2VTY2hlbWFFeHRlbmQ+KFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICAgIG9wdGlvbnM/OiBJbnNlcnRPbmx5T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxJZFR5cGU8RGF0YWJhc2VTY2hlbWFFeHRlbmQsIFRUYWJsZT5bXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydEJ1aWxkZXIuaW5zZXJ0T25seSh0aGlzLmtuZXgsIHRhYmxlTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICB1YlVwc2VydE9ySW5zZXJ0PFRUYWJsZSBleHRlbmRzIFRhYmxlTmFtZTxUU2NoZW1hPiAmIGtleW9mIERhdGFiYXNlU2NoZW1hRXh0ZW5kPihcbiAgICB0YWJsZU5hbWU6IFRUYWJsZSxcbiAgICBtb2RlOiBcInVwc2VydFwiIHwgXCJpbnNlcnRcIixcbiAgICBvcHRpb25zPzogVXBzZXJ0T3B0aW9uczxUVGFibGU+LFxuICApOiBQcm9taXNlPElkVHlwZTxEYXRhYmFzZVNjaGVtYUV4dGVuZCwgVFRhYmxlPltdPiB7XG4gICAgcmV0dXJuIHRoaXMudXBzZXJ0QnVpbGRlci51cHNlcnRPckluc2VydCh0aGlzLmtuZXgsIHRhYmxlTmFtZSwgbW9kZSwgb3B0aW9ucyk7XG4gIH1cblxuICB1YlVwZGF0ZUJhdGNoKFxuICAgIHRhYmxlTmFtZTogVGFibGVOYW1lPFRTY2hlbWE+LFxuICAgIG9wdGlvbnM/OiB7IGNodW5rU2l6ZT86IG51bWJlcjsgd2hlcmU/OiBzdHJpbmcgfCBzdHJpbmdbXSB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy51cHNlcnRCdWlsZGVyLnVwZGF0ZUJhdGNoKHRoaXMua25leCwgdGFibGVOYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIO2KuOuenOyereyFmCDsl7DqsrAg7YWM7Iqk7Yq47JqpXG4gIGFzeW5jIGRlYnVnVHJhbnNhY3Rpb24oKSB7XG4gICAgY29uc3QgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0VHJhbnNhY3Rpb25JbmZvKCk7XG4gICAgY29uc29sZS5sb2coYCR7Y2hhbGsuY3lhbihcIltQdXJpIFRyYW5zYWN0aW9uXVwiKX0gJHtjaGFsay5tYWdlbnRhKGluZm8pfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRUcmFuc2FjdGlvbkluZm8oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyDsl7DqsrAgSUQg7KGw7ZqMXG4gICAgY29uc3QgW2Nvbm5lY3Rpb25JZFJvd3NdID0gYXdhaXQgdGhpcy5rbmV4LnJhdyhgU0VMRUNUIENPTk5FQ1RJT05fSUQoKSBhcyBjb25uZWN0aW9uX2lkYCk7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkUm93c1swXS5jb25uZWN0aW9uX2lkO1xuXG4gICAgLy8g7Yq4656c7J6t7IWYIOygleuztCDsobDtmoxcbiAgICBjb25zdCBbdHJ4Um93c10gPSBhd2FpdCB0aGlzLmtuZXgucmF3KGBcbiAgICAgICAgU0VMRUNUIFNUQVRFLCBJU09MQVRJT05fTEVWRUwsIFRIUkVBRF9JRCwgRVZFTlRfSURcbiAgICAgICAgRlJPTSBwZXJmb3JtYW5jZV9zY2hlbWEuZXZlbnRzX3RyYW5zYWN0aW9uc19jdXJyZW50XG4gICAgICAgIFdIRVJFIFRIUkVBRF9JRCA9IFxuICAgICAgICAgIChTRUxFQ1QgVEhSRUFEX0lEXG4gICAgICAgICAgRlJPTSBwZXJmb3JtYW5jZV9zY2hlbWEudGhyZWFkcyBcbiAgICAgICAgICBXSEVSRSBQUk9DRVNTTElTVF9JRCA9IENPTk5FQ1RJT05fSUQoKSlcbiAgICAgIGApO1xuXG4gICAgaWYgKHRyeFJvd3MubGVuZ3RoID4gMCAmJiB0cnhSb3dzWzBdLlNUQVRFICE9PSBcIkNPTU1JVFRFRFwiKSB7XG4gICAgICBjb25zdCB0cnggPSB0cnhSb3dzWzBdO1xuICAgICAgcmV0dXJuIGBJbiBUcmFuc2FjdGlvbiwgQ29ubklEOiAke2Nvbm5lY3Rpb25JZH0sIFRocmVhZElEOiAke3RyeC5USFJFQURfSUR9LCBFdmVudElEOiAke3RyeC5FVkVOVF9JRH0sIElubm9EQiBUUlg6ICR7dHJ4LlNUQVRFfSgke3RyeC5JU09MQVRJT05fTEVWRUx9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgTm90IGluIFRyYW5zYWN0aW9uLCBDb25uSUQ6ICR7Y29ubmVjdGlvbklkfWA7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQdXJpVHJhbnNhY3Rpb25XcmFwcGVyIGV4dGVuZHMgUHVyaVdyYXBwZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdHJ4OiBLbmV4LlRyYW5zYWN0aW9uLFxuICAgIHB1YmxpYyB1cHNlcnRCdWlsZGVyOiBVcHNlcnRCdWlsZGVyLFxuICApIHtcbiAgICBzdXBlcih0cngsIHVwc2VydEJ1aWxkZXIpO1xuICB9XG5cbiAgYXN5bmMgcm9sbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy50cngucm9sbGJhY2soKTtcbiAgfVxuXG4gIGFzeW5jIGNvbW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnRyeC5jb21taXQoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7V0FPNkI7Q0FzQmhCLGNBQWIsTUFBc0Y7RUFFM0U7RUFDQTtFQUZULFlBQ0UsTUFDQSxlQUNBO0dBRk8sS0FBQSxPQUFBO0dBQ0EsS0FBQSxnQkFBQTtFQUNOO0VBRUgsSUFBSSxLQUF1QjtHQUN6QixPQUFPLEtBQUssS0FBSyxJQUFJLEdBQUc7RUFDMUI7RUEwQkEsS0FBSyxNQUFnQjtHQUNuQixPQUFPLElBQUksS0FBSyxLQUFLLE1BQU0sSUFBSTtFQUNqQztFQTBCQSxNQUFNLE1BQWdCO0dBQ3BCLE9BQU8sSUFBSSxLQUFLLEtBQUssTUFBTSxJQUFJO0VBQ2pDO0VBRUEsTUFBTSxZQUNKLFVBQ0EsVUFBZ0MsQ0FBQyxHQUNyQjtHQUNaLE1BQU0sRUFBRSxXQUFXLFVBQVUsV0FBVyxRQUFRO0dBRWhELE1BQU0sRUFBRSxPQUFPLE1BQU0sT0FBTztHQUU1QixNQUFNLG1CQUFtQixPQUN2QixNQUNBLGtCQUNHO0lBQ0gsT0FBTyxLQUFLLFlBQ1YsT0FBTyxRQUFRO0tBQ2IsTUFBTSxhQUFhLElBQUksdUJBQXVCLEtBQUssYUFBYTtLQUVoRSxPQUFPLEdBQUcsd0JBQXdCLFVBQVUsa0JBQWtCLFNBQVMsVUFBVSxDQUFDO0lBQ3BGLEdBQ0E7S0FBRSxnQkFBZ0I7S0FBVztJQUFTLENBQ3hDO0dBQ0Y7R0FFQSxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsU0FBUyxDQUFDLEVBQUUsZUFBZSxRQUFRO0dBQzdFLElBQUksYUFFRixPQUFPLGlCQUFpQixZQUFZLEtBQUssWUFBWSxhQUFhO0dBR3BFLE9BQU8saUJBQWlCLEtBQUssTUFBTSxLQUFLLGFBQWE7RUFDdkQ7RUFFQSxXQUNFLFdBQ0EsS0FHTztHQUNQLE9BQU8sS0FBSyxjQUFjLFNBQVMsV0FBVyxHQUFHO0VBQ25EO0VBRUEsU0FDRSxXQUNBLFNBQ2lEO0dBQ2pELE9BQU8sS0FBSyxjQUFjLE9BQU8sS0FBSyxNQUFNLFdBQVcsT0FBTztFQUNoRTtFQUVBLGFBQ0UsV0FDQSxTQUNpRDtHQUNqRCxPQUFPLEtBQUssY0FBYyxXQUFXLEtBQUssTUFBTSxXQUFXLE9BQU87RUFDcEU7RUFFQSxpQkFDRSxXQUNBLE1BQ0EsU0FDaUQ7R0FDakQsT0FBTyxLQUFLLGNBQWMsZUFBZSxLQUFLLE1BQU0sV0FBVyxNQUFNLE9BQU87RUFDOUU7RUFFQSxjQUNFLFdBQ0EsU0FDZTtHQUNmLE9BQU8sS0FBSyxjQUFjLFlBQVksS0FBSyxNQUFNLFdBQVcsT0FBTztFQUNyRTtFQUdBLE1BQU0sbUJBQW1CO0dBQ3ZCLE1BQU0sT0FBTyxNQUFNLEtBQUssbUJBQW1CO0dBQzNDLFFBQVEsSUFBSSxHQUFHLE1BQU0sS0FBSyxvQkFBb0IsRUFBRSxHQUFHLE1BQU0sUUFBUSxJQUFJLEdBQUc7RUFDMUU7RUFFQSxNQUFjLHFCQUFzQztHQUVsRCxNQUFNLENBQUMsb0JBQW9CLE1BQU0sS0FBSyxLQUFLLElBQUkseUNBQXlDO0dBQ3hGLE1BQU0sZUFBZSxpQkFBaUIsRUFBRSxDQUFDO0dBR3pDLE1BQU0sQ0FBQyxXQUFXLE1BQU0sS0FBSyxLQUFLLElBQUk7Ozs7Ozs7T0FPbkM7R0FFSCxJQUFJLFFBQVEsU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDLFVBQVUsYUFBYTtJQUMxRCxNQUFNLE1BQU0sUUFBUTtJQUNwQixPQUFPLDJCQUEyQixhQUFhLGNBQWMsSUFBSSxVQUFVLGFBQWEsSUFBSSxTQUFTLGdCQUFnQixJQUFJLE1BQU0sR0FBRyxJQUFJLGdCQUFnQjtHQUN4SixPQUNFLE9BQU8sK0JBQStCO0VBRTFDO0NBQ0Y7Q0FFYSx5QkFBYixjQUE0QyxZQUFZO0VBRTdDO0VBQ0E7RUFGVCxZQUNFLEtBQ0EsZUFDQTtHQUNBLE1BQU0sS0FBSyxhQUFhO0dBSGpCLEtBQUEsTUFBQTtHQUNBLEtBQUEsZ0JBQUE7RUFHVDtFQUVBLE1BQU0sV0FBMEI7R0FDOUIsTUFBTSxLQUFLLElBQUksU0FBUztFQUMxQjtFQUVBLE1BQU0sU0FBd0I7R0FDNUIsTUFBTSxLQUFLLElBQUksT0FBTztFQUN4QjtDQUNGIn0=
95
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVyaS13cmFwcGVyLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLXdyYXBwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogb3hsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqLyAvLyBQdXJpV3JhcHBlcuuKlCDri6TslpHtlZwg7YOA7J6F7J2EIOyCrOyaqe2VmOqzoCDsnojsirXri4jri6QuXG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmltcG9ydCB7IHR5cGUgRGF0YWJhc2VTY2hlbWFFeHRlbmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgREJQcmVzZXQgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHsgUHVyaSB9IGZyb20gXCIuL3B1cmlcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29sdW1uS2V5cyxcbiAgdHlwZSBJZFR5cGUsXG4gIHR5cGUgT21pdEludGVybmFsVHlwZUtleXMsXG4gIHR5cGUgUHVyaVRhYmxlLFxufSBmcm9tIFwiLi9wdXJpLnR5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIEluc2VydE9ubHlPcHRpb25zLFxuICB0eXBlIFVCUmVmLFxuICB0eXBlIFVwc2VydEJ1aWxkZXIsXG4gIHR5cGUgVXBzZXJ0T3B0aW9ucyxcbn0gZnJvbSBcIi4vdXBzZXJ0LWJ1aWxkZXJcIjtcblxudHlwZSBUYWJsZU5hbWU8VFNjaGVtYSBleHRlbmRzIERhdGFiYXNlU2NoZW1hRXh0ZW5kPiA9IEV4dHJhY3Q8a2V5b2YgVFNjaGVtYSwgc3RyaW5nPjtcblxuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25hbE9wdGlvbnMgPSB7XG4gIGlzb2xhdGlvbj86IEV4Y2x1ZGU8S25leC5Jc29sYXRpb25MZXZlbHMsIFwic25hcHNob3RcIj47IC8vIHNuYXBzaG90OiBtc3NxbCBvbmx5XG4gIGRiUHJlc2V0PzogREJQcmVzZXQ7XG4gIHJlYWRPbmx5PzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjbGFzcyBQdXJpV3JhcHBlcjxUU2NoZW1hIGV4dGVuZHMgRGF0YWJhc2VTY2hlbWFFeHRlbmQgPSBEYXRhYmFzZVNjaGVtYUV4dGVuZD4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMga25leDogS25leCxcbiAgICBwdWJsaWMgdXBzZXJ0QnVpbGRlcjogVXBzZXJ0QnVpbGRlcixcbiAgKSB7fVxuXG4gIHJhdyhzcWw6IHN0cmluZyk6IEtuZXguUmF3IHtcbiAgICByZXR1cm4gdGhpcy5rbmV4LnJhdyhzcWwpO1xuICB9XG5cbiAgLy8g7YWM7J2067iU66qF7Jy866GcIOyLnOyekVxuICBmcm9tPFRUYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgUmVjb3JkPFRUYWJsZSwgUHVyaVRhYmxlPFRTY2hlbWFbVFRhYmxlXT4+LFxuICAgIE9taXRJbnRlcm5hbFR5cGVLZXlzPFB1cmlUYWJsZTxUU2NoZW1hW1RUYWJsZV0+PlxuICA+O1xuICAvLyDthYzsnbTruJTrqoUgKyBBbGlhc+uhnCDsi5zsnpFcbiAgZnJvbTxUVGFibGUgZXh0ZW5kcyBrZXlvZiBUU2NoZW1hLCBUQWxpYXMgZXh0ZW5kcyBzdHJpbmc+KHNwZWM6IHtcbiAgICBbSyBpbiBUQWxpYXNdOiBUVGFibGU7XG4gIH0pOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgUmVjb3JkPFRBbGlhcywgUHVyaVRhYmxlPFRTY2hlbWFbVFRhYmxlXT4+LFxuICAgIE9taXRJbnRlcm5hbFR5cGVLZXlzPFB1cmlUYWJsZTxUU2NoZW1hW1RUYWJsZV0+PlxuICA+O1xuICAvLyDshJzruIzsv7zrpqzroZwg7Iuc7J6RXG4gIGZyb208VEFsaWFzIGV4dGVuZHMgc3RyaW5nLCBUU3ViUmVzdWx0PihzcGVjOiB7XG4gICAgW0sgaW4gVEFsaWFzXTogUHVyaTxUU2NoZW1hLCBhbnksIFRTdWJSZXN1bHQ+O1xuICB9KTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFJlY29yZDxUQWxpYXMsIFB1cmlUYWJsZTxUU3ViUmVzdWx0Pj4sXG4gICAgT21pdEludGVybmFsVHlwZUtleXM8UHVyaVRhYmxlPFRTdWJSZXN1bHQ+PlxuICA+O1xuICBmcm9tKHNwZWM6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBQdXJpKHRoaXMua25leCwgc3BlYyk7XG4gIH1cblxuICAvLyDthYzsnbTruJTrqoXsnLzroZwg7Iuc7J6RXG4gIHRhYmxlPFRUYWJsZSBleHRlbmRzIGtleW9mIFRTY2hlbWE+KFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICApOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgUmVjb3JkPFRUYWJsZSwgUHVyaVRhYmxlPFRTY2hlbWFbVFRhYmxlXT4+LFxuICAgIE9taXRJbnRlcm5hbFR5cGVLZXlzPFB1cmlUYWJsZTxUU2NoZW1hW1RUYWJsZV0+PlxuICA+O1xuICAvLyDthYzsnbTruJTrqoUgKyBBbGlhc+uhnCDsi5zsnpFcbiAgdGFibGU8VFRhYmxlIGV4dGVuZHMga2V5b2YgVFNjaGVtYSwgVEFsaWFzIGV4dGVuZHMgc3RyaW5nPihzcGVjOiB7XG4gICAgW0sgaW4gVEFsaWFzXTogVFRhYmxlO1xuICB9KTogUHVyaTxcbiAgICBUU2NoZW1hLFxuICAgIFJlY29yZDxUQWxpYXMsIFB1cmlUYWJsZTxUU2NoZW1hW1RUYWJsZV0+PixcbiAgICBPbWl0SW50ZXJuYWxUeXBlS2V5czxQdXJpVGFibGU8VFNjaGVtYVtUVGFibGVdPj5cbiAgPjtcbiAgLy8g7ISc67iM7L+866as66GcIOyLnOyekVxuICB0YWJsZTxUQWxpYXMgZXh0ZW5kcyBzdHJpbmcsIFRTdWJSZXN1bHQ+KHNwZWM6IHtcbiAgICBbSyBpbiBUQWxpYXNdOiBQdXJpPFRTY2hlbWEsIGFueSwgVFN1YlJlc3VsdD47XG4gIH0pOiBQdXJpPFxuICAgIFRTY2hlbWEsXG4gICAgUmVjb3JkPFRBbGlhcywgUHVyaVRhYmxlPFRTdWJSZXN1bHQ+PixcbiAgICBPbWl0SW50ZXJuYWxUeXBlS2V5czxQdXJpVGFibGU8VFN1YlJlc3VsdD4+XG4gID47XG4gIHRhYmxlKHNwZWM6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBQdXJpKHRoaXMua25leCwgc3BlYyk7XG4gIH1cblxuICBhc3luYyB0cmFuc2FjdGlvbjxUPihcbiAgICBjYWxsYmFjazogKHRyeDogUHVyaVRyYW5zYWN0aW9uV3JhcHBlcikgPT4gUHJvbWlzZTxUPixcbiAgICBvcHRpb25zOiBUcmFuc2FjdGlvbmFsT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB7IGlzb2xhdGlvbiwgcmVhZE9ubHksIGRiUHJlc2V0ID0gXCJ3XCIgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCB7IERCIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2RiXCIpO1xuXG4gICAgY29uc3Qgc3RhcnRUcmFuc2FjdGlvbiA9IGFzeW5jIChcbiAgICAgIGtuZXg6IEtuZXggfCBLbmV4LlRyYW5zYWN0aW9uLFxuICAgICAgdXBzZXJ0QnVpbGRlcjogVXBzZXJ0QnVpbGRlcixcbiAgICApID0+IHtcbiAgICAgIHJldHVybiBrbmV4LnRyYW5zYWN0aW9uKFxuICAgICAgICBhc3luYyAodHJ4KSA9PiB7XG4gICAgICAgICAgY29uc3QgdHJ4V3JhcHBlciA9IG5ldyBQdXJpVHJhbnNhY3Rpb25XcmFwcGVyKHRyeCwgdXBzZXJ0QnVpbGRlcik7XG5cbiAgICAgICAgICByZXR1cm4gREIucnVuV2l0aFRyYW5zYWN0aW9uU2NvcGUoZGJQcmVzZXQsIHRyeFdyYXBwZXIsICgpID0+IGNhbGxiYWNrKHRyeFdyYXBwZXIpKTtcbiAgICAgICAgfSxcbiAgICAgICAgeyBpc29sYXRpb25MZXZlbDogaXNvbGF0aW9uLCByZWFkT25seSB9LFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZXhpc3RpbmdUcnggPSBEQi50cmFuc2FjdGlvblN0b3JhZ2UuZ2V0U3RvcmUoKT8uZ2V0VHJhbnNhY3Rpb24oZGJQcmVzZXQpO1xuICAgIGlmIChleGlzdGluZ1RyeCkge1xuICAgICAgLy8g6rCZ7J2AIHByZXNldOydmCDspJHssqkg7Yq4656c7J6t7IWY7J2AIOq4sOyhtCDsl7DqsrDsl5DshJwgU0FWRVBPSU5U66GcIOyLnOyeke2VnOuLpC5cbiAgICAgIHJldHVybiBzdGFydFRyYW5zYWN0aW9uKGV4aXN0aW5nVHJ4LnRyeCwgZXhpc3RpbmdUcngudXBzZXJ0QnVpbGRlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YXJ0VHJhbnNhY3Rpb24odGhpcy5rbmV4LCB0aGlzLnVwc2VydEJ1aWxkZXIpO1xuICB9XG5cbiAgdWJSZWdpc3RlcjxUVGFibGUgZXh0ZW5kcyBUYWJsZU5hbWU8VFNjaGVtYT4+KFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICAgIHJvdzogUGFydGlhbDx7XG4gICAgICBbSyBpbiBDb2x1bW5LZXlzPFRTY2hlbWFbVFRhYmxlXT5dOiBUU2NoZW1hW1RUYWJsZV1bS10gfCBVQlJlZjtcbiAgICB9PixcbiAgKTogVUJSZWYge1xuICAgIHJldHVybiB0aGlzLnVwc2VydEJ1aWxkZXIucmVnaXN0ZXIodGFibGVOYW1lLCByb3cpO1xuICB9XG5cbiAgdWJVcHNlcnQ8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPFRTY2hlbWE+ICYga2V5b2YgRGF0YWJhc2VTY2hlbWFFeHRlbmQ+KFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICAgIG9wdGlvbnM/OiBVcHNlcnRPcHRpb25zPFRUYWJsZT4sXG4gICk6IFByb21pc2U8SWRUeXBlPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBUVGFibGU+W10+IHtcbiAgICByZXR1cm4gdGhpcy51cHNlcnRCdWlsZGVyLnVwc2VydCh0aGlzLmtuZXgsIHRhYmxlTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICB1Ykluc2VydE9ubHk8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPFRTY2hlbWE+ICYga2V5b2YgRGF0YWJhc2VTY2hlbWFFeHRlbmQ+KFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICAgIG9wdGlvbnM/OiBJbnNlcnRPbmx5T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxJZFR5cGU8RGF0YWJhc2VTY2hlbWFFeHRlbmQsIFRUYWJsZT5bXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydEJ1aWxkZXIuaW5zZXJ0T25seSh0aGlzLmtuZXgsIHRhYmxlTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICB1YlVwc2VydE9ySW5zZXJ0PFRUYWJsZSBleHRlbmRzIFRhYmxlTmFtZTxUU2NoZW1hPiAmIGtleW9mIERhdGFiYXNlU2NoZW1hRXh0ZW5kPihcbiAgICB0YWJsZU5hbWU6IFRUYWJsZSxcbiAgICBtb2RlOiBcInVwc2VydFwiIHwgXCJpbnNlcnRcIixcbiAgICBvcHRpb25zPzogVXBzZXJ0T3B0aW9uczxUVGFibGU+LFxuICApOiBQcm9taXNlPElkVHlwZTxEYXRhYmFzZVNjaGVtYUV4dGVuZCwgVFRhYmxlPltdPiB7XG4gICAgcmV0dXJuIHRoaXMudXBzZXJ0QnVpbGRlci51cHNlcnRPckluc2VydCh0aGlzLmtuZXgsIHRhYmxlTmFtZSwgbW9kZSwgb3B0aW9ucyk7XG4gIH1cblxuICB1YlVwZGF0ZUJhdGNoKFxuICAgIHRhYmxlTmFtZTogVGFibGVOYW1lPFRTY2hlbWE+LFxuICAgIG9wdGlvbnM/OiB7IGNodW5rU2l6ZT86IG51bWJlcjsgd2hlcmU/OiBzdHJpbmcgfCBzdHJpbmdbXSB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy51cHNlcnRCdWlsZGVyLnVwZGF0ZUJhdGNoKHRoaXMua25leCwgdGFibGVOYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIO2KuOuenOyereyFmCDsl7DqsrAg7YWM7Iqk7Yq47JqpXG4gIGFzeW5jIGRlYnVnVHJhbnNhY3Rpb24oKSB7XG4gICAgY29uc3QgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0VHJhbnNhY3Rpb25JbmZvKCk7XG4gICAgY29uc29sZS5sb2coYCR7Y2hhbGsuY3lhbihcIltQdXJpIFRyYW5zYWN0aW9uXVwiKX0gJHtjaGFsay5tYWdlbnRhKGluZm8pfWApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRUcmFuc2FjdGlvbkluZm8oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyDsl7DqsrAgSUQg7KGw7ZqMXG4gICAgY29uc3QgW2Nvbm5lY3Rpb25JZFJvd3NdID0gYXdhaXQgdGhpcy5rbmV4LnJhdyhgU0VMRUNUIENPTk5FQ1RJT05fSUQoKSBhcyBjb25uZWN0aW9uX2lkYCk7XG4gICAgY29uc3QgY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkUm93c1swXS5jb25uZWN0aW9uX2lkO1xuXG4gICAgLy8g7Yq4656c7J6t7IWYIOygleuztCDsobDtmoxcbiAgICBjb25zdCBbdHJ4Um93c10gPSBhd2FpdCB0aGlzLmtuZXgucmF3KGBcbiAgICAgICAgU0VMRUNUIFNUQVRFLCBJU09MQVRJT05fTEVWRUwsIFRIUkVBRF9JRCwgRVZFTlRfSURcbiAgICAgICAgRlJPTSBwZXJmb3JtYW5jZV9zY2hlbWEuZXZlbnRzX3RyYW5zYWN0aW9uc19jdXJyZW50XG4gICAgICAgIFdIRVJFIFRIUkVBRF9JRCA9IFxuICAgICAgICAgIChTRUxFQ1QgVEhSRUFEX0lEXG4gICAgICAgICAgRlJPTSBwZXJmb3JtYW5jZV9zY2hlbWEudGhyZWFkcyBcbiAgICAgICAgICBXSEVSRSBQUk9DRVNTTElTVF9JRCA9IENPTk5FQ1RJT05fSUQoKSlcbiAgICAgIGApO1xuXG4gICAgaWYgKHRyeFJvd3MubGVuZ3RoID4gMCAmJiB0cnhSb3dzWzBdLlNUQVRFICE9PSBcIkNPTU1JVFRFRFwiKSB7XG4gICAgICBjb25zdCB0cnggPSB0cnhSb3dzWzBdO1xuICAgICAgcmV0dXJuIGBJbiBUcmFuc2FjdGlvbiwgQ29ubklEOiAke2Nvbm5lY3Rpb25JZH0sIFRocmVhZElEOiAke3RyeC5USFJFQURfSUR9LCBFdmVudElEOiAke3RyeC5FVkVOVF9JRH0sIElubm9EQiBUUlg6ICR7dHJ4LlNUQVRFfSgke3RyeC5JU09MQVRJT05fTEVWRUx9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgTm90IGluIFRyYW5zYWN0aW9uLCBDb25uSUQ6ICR7Y29ubmVjdGlvbklkfWA7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQdXJpVHJhbnNhY3Rpb25XcmFwcGVyIGV4dGVuZHMgUHVyaVdyYXBwZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdHJ4OiBLbmV4LlRyYW5zYWN0aW9uLFxuICAgIHB1YmxpYyB1cHNlcnRCdWlsZGVyOiBVcHNlcnRCdWlsZGVyLFxuICApIHtcbiAgICBzdXBlcih0cngsIHVwc2VydEJ1aWxkZXIpO1xuICB9XG5cbiAgYXN5bmMgcm9sbGJhY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy50cngucm9sbGJhY2soKTtcbiAgfVxuXG4gIGFzeW5jIGNvbW1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnRyeC5jb21taXQoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Q0FPNkIsVUFBQTtDQXNCaEIsY0FBYixNQUFzRjtFQUUzRTtFQUNBO0VBRlQsWUFDRSxNQUNBLGVBQ0E7R0FGTyxLQUFBLE9BQUE7R0FDQSxLQUFBLGdCQUFBO0VBQ047RUFFSCxJQUFJLEtBQXVCO0dBQ3pCLE9BQU8sS0FBSyxLQUFLLElBQUksR0FBRztFQUMxQjtFQTBCQSxLQUFLLE1BQWdCO0dBQ25CLE9BQU8sSUFBSSxLQUFLLEtBQUssTUFBTSxJQUFJO0VBQ2pDO0VBMEJBLE1BQU0sTUFBZ0I7R0FDcEIsT0FBTyxJQUFJLEtBQUssS0FBSyxNQUFNLElBQUk7RUFDakM7RUFFQSxNQUFNLFlBQ0osVUFDQSxVQUFnQyxDQUFDLEdBQ3JCO0dBQ1osTUFBTSxFQUFFLFdBQVcsVUFBVSxXQUFXLFFBQVE7R0FFaEQsTUFBTSxFQUFFLE9BQU8sTUFBTSxPQUFPO0dBRTVCLE1BQU0sbUJBQW1CLE9BQ3ZCLE1BQ0Esa0JBQ0c7SUFDSCxPQUFPLEtBQUssWUFDVixPQUFPLFFBQVE7S0FDYixNQUFNLGFBQWEsSUFBSSx1QkFBdUIsS0FBSyxhQUFhO0tBRWhFLE9BQU8sR0FBRyx3QkFBd0IsVUFBVSxrQkFBa0IsU0FBUyxVQUFVLENBQUM7SUFDcEYsR0FDQTtLQUFFLGdCQUFnQjtLQUFXO0lBQVMsQ0FDeEM7R0FDRjtHQUVBLE1BQU0sY0FBYyxHQUFHLG1CQUFtQixTQUFTLENBQUMsRUFBRSxlQUFlLFFBQVE7R0FDN0UsSUFBSSxhQUVGLE9BQU8saUJBQWlCLFlBQVksS0FBSyxZQUFZLGFBQWE7R0FHcEUsT0FBTyxpQkFBaUIsS0FBSyxNQUFNLEtBQUssYUFBYTtFQUN2RDtFQUVBLFdBQ0UsV0FDQSxLQUdPO0dBQ1AsT0FBTyxLQUFLLGNBQWMsU0FBUyxXQUFXLEdBQUc7RUFDbkQ7RUFFQSxTQUNFLFdBQ0EsU0FDaUQ7R0FDakQsT0FBTyxLQUFLLGNBQWMsT0FBTyxLQUFLLE1BQU0sV0FBVyxPQUFPO0VBQ2hFO0VBRUEsYUFDRSxXQUNBLFNBQ2lEO0dBQ2pELE9BQU8sS0FBSyxjQUFjLFdBQVcsS0FBSyxNQUFNLFdBQVcsT0FBTztFQUNwRTtFQUVBLGlCQUNFLFdBQ0EsTUFDQSxTQUNpRDtHQUNqRCxPQUFPLEtBQUssY0FBYyxlQUFlLEtBQUssTUFBTSxXQUFXLE1BQU0sT0FBTztFQUM5RTtFQUVBLGNBQ0UsV0FDQSxTQUNlO0dBQ2YsT0FBTyxLQUFLLGNBQWMsWUFBWSxLQUFLLE1BQU0sV0FBVyxPQUFPO0VBQ3JFO0VBR0EsTUFBTSxtQkFBbUI7R0FDdkIsTUFBTSxPQUFPLE1BQU0sS0FBSyxtQkFBbUI7R0FDM0MsUUFBUSxJQUFJLEdBQUcsTUFBTSxLQUFLLG9CQUFvQixFQUFFLEdBQUcsTUFBTSxRQUFRLElBQUksR0FBRztFQUMxRTtFQUVBLE1BQWMscUJBQXNDO0dBRWxELE1BQU0sQ0FBQyxvQkFBb0IsTUFBTSxLQUFLLEtBQUssSUFBSSx5Q0FBeUM7R0FDeEYsTUFBTSxlQUFlLGlCQUFpQixFQUFFLENBQUM7R0FHekMsTUFBTSxDQUFDLFdBQVcsTUFBTSxLQUFLLEtBQUssSUFBSTs7Ozs7OztPQU9uQztHQUVILElBQUksUUFBUSxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUMsVUFBVSxhQUFhO0lBQzFELE1BQU0sTUFBTSxRQUFRO0lBQ3BCLE9BQU8sMkJBQTJCLGFBQWEsY0FBYyxJQUFJLFVBQVUsYUFBYSxJQUFJLFNBQVMsZ0JBQWdCLElBQUksTUFBTSxHQUFHLElBQUksZ0JBQWdCO0dBQ3hKLE9BQ0UsT0FBTywrQkFBK0I7RUFFMUM7Q0FDRjtDQUVhLHlCQUFiLGNBQTRDLFlBQVk7RUFFN0M7RUFDQTtFQUZULFlBQ0UsS0FDQSxlQUNBO0dBQ0EsTUFBTSxLQUFLLGFBQWE7R0FIakIsS0FBQSxNQUFBO0dBQ0EsS0FBQSxnQkFBQTtFQUdUO0VBRUEsTUFBTSxXQUEwQjtHQUM5QixNQUFNLEtBQUssSUFBSSxTQUFTO0VBQzFCO0VBRUEsTUFBTSxTQUF3QjtHQUM1QixNQUFNLEtBQUssSUFBSSxPQUFPO0VBQ3hCO0NBQ0YifQ==