sonamu 0.9.19 → 0.10.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 (282) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +36 -0
  2. package/dist/ai/agents/agent.js +5 -7
  3. package/dist/ai/agents/index.js +1 -2
  4. package/dist/ai/agents/types.js +1 -1
  5. package/dist/ai/index.js +1 -2
  6. package/dist/ai/providers/rtzr/api.js +2 -3
  7. package/dist/ai/providers/rtzr/error.js +14 -29
  8. package/dist/ai/providers/rtzr/index.js +1 -2
  9. package/dist/ai/providers/rtzr/model.js +13 -20
  10. package/dist/ai/providers/rtzr/options.js +2 -3
  11. package/dist/ai/providers/rtzr/provider.js +2 -3
  12. package/dist/ai/providers/rtzr/utils.js +12 -21
  13. package/dist/api/base-frame.js +4 -4
  14. package/dist/api/caster.js +21 -38
  15. package/dist/api/code-converters.js +41 -98
  16. package/dist/api/config.d.ts +1 -10
  17. package/dist/api/config.d.ts.map +1 -1
  18. package/dist/api/config.js +9 -8
  19. package/dist/api/context.js +2 -3
  20. package/dist/api/decorators.js +80 -116
  21. package/dist/api/index.js +2 -3
  22. package/dist/api/secret.js +6 -10
  23. package/dist/api/sonamu.d.ts.map +1 -1
  24. package/dist/api/sonamu.js +200 -387
  25. package/dist/api/validator.js +5 -8
  26. package/dist/api/websocket-helpers.js +21 -32
  27. package/dist/auth/audit-log/builders.js +2 -3
  28. package/dist/auth/audit-log/events.js +2 -2
  29. package/dist/auth/audit-log/plugin.js +30 -61
  30. package/dist/auth/audit-log-ingestor.js +19 -41
  31. package/dist/auth/auth-generator.js +16 -41
  32. package/dist/auth/better-auth-entities.js +3 -4
  33. package/dist/auth/index.js +2 -3
  34. package/dist/auth/knex-adapter.js +18 -45
  35. package/dist/auth/plugins/entity-definitions/admin.js +2 -2
  36. package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
  37. package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
  38. package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
  39. package/dist/auth/plugins/entity-definitions/index.js +2 -3
  40. package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
  41. package/dist/auth/plugins/entity-definitions/organization.js +2 -2
  42. package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
  43. package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
  44. package/dist/auth/plugins/entity-definitions/sso.js +2 -2
  45. package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
  46. package/dist/auth/plugins/entity-definitions/types.js +1 -1
  47. package/dist/auth/plugins/entity-definitions/username.js +2 -2
  48. package/dist/auth/plugins/index.js +1 -2
  49. package/dist/auth/plugins/wrappers/admin.js +2 -3
  50. package/dist/auth/plugins/wrappers/anonymous.js +2 -3
  51. package/dist/auth/plugins/wrappers/api-key.js +2 -3
  52. package/dist/auth/plugins/wrappers/index.js +1 -2
  53. package/dist/auth/plugins/wrappers/jwt.js +2 -3
  54. package/dist/auth/plugins/wrappers/organization.js +2 -3
  55. package/dist/auth/plugins/wrappers/passkey.js +2 -3
  56. package/dist/auth/plugins/wrappers/phone-number.js +2 -3
  57. package/dist/auth/plugins/wrappers/sso.js +2 -3
  58. package/dist/auth/plugins/wrappers/two-factor.js +2 -3
  59. package/dist/auth/plugins/wrappers/username.js +2 -3
  60. package/dist/bin/build-config.js +2 -2
  61. package/dist/bin/cli.js +151 -258
  62. package/dist/bin/fixture.d.ts.map +1 -1
  63. package/dist/bin/fixture.js +55 -97
  64. package/dist/bin/hmr-hook-register.js +3 -3
  65. package/dist/bin/migrate-targets.d.ts +3 -0
  66. package/dist/bin/migrate-targets.d.ts.map +1 -0
  67. package/dist/bin/migrate-targets.js +11 -0
  68. package/dist/bin/test-command.js +25 -55
  69. package/dist/bin/ts-loader-register.js +5 -6
  70. package/dist/bin/ts-loader-registration.js +6 -13
  71. package/dist/cache/cache-manager.js +3 -4
  72. package/dist/cache/decorator.js +11 -21
  73. package/dist/cache/drivers.js +2 -3
  74. package/dist/cache/index.js +2 -3
  75. package/dist/cache/types.js +1 -1
  76. package/dist/cache-control/cache-control.js +21 -34
  77. package/dist/cache-control/types.js +1 -1
  78. package/dist/compress/compress.js +10 -10
  79. package/dist/compress/index.js +1 -2
  80. package/dist/compress/types.js +1 -1
  81. package/dist/cone/cone-generator.js +25 -63
  82. package/dist/database/_batch_update.js +26 -46
  83. package/dist/database/base-model.js +44 -97
  84. package/dist/database/base-model.types.js +1 -1
  85. package/dist/database/db.d.ts +8 -14
  86. package/dist/database/db.d.ts.map +1 -1
  87. package/dist/database/db.js +127 -72
  88. package/dist/database/knex.js +5 -8
  89. package/dist/database/puri-subset.types.js +1 -1
  90. package/dist/database/puri-wrapper.js +11 -15
  91. package/dist/database/puri.js +117 -234
  92. package/dist/database/puri.types.js +3 -4
  93. package/dist/database/transaction-context.js +4 -5
  94. package/dist/database/upsert-builder.js +109 -176
  95. package/dist/dict/en.d.ts +1 -0
  96. package/dist/dict/en.d.ts.map +1 -1
  97. package/dist/dict/en.js +4 -4
  98. package/dist/dict/index.js +2 -3
  99. package/dist/dict/ko.d.ts +1 -0
  100. package/dist/dict/ko.d.ts.map +1 -1
  101. package/dist/dict/ko.js +4 -4
  102. package/dist/dict/rc-keys.js +3 -4
  103. package/dist/dict/sd.js +8 -19
  104. package/dist/dict/sonamu-dictionary.js +141 -284
  105. package/dist/dict/types.js +1 -1
  106. package/dist/dict/utils.js +4 -5
  107. package/dist/entity/entity-manager.d.ts +2 -2
  108. package/dist/entity/entity-manager.js +34 -82
  109. package/dist/entity/entity-template-cone.js +33 -66
  110. package/dist/entity/entity.js +156 -310
  111. package/dist/env.d.ts +14 -0
  112. package/dist/env.d.ts.map +1 -0
  113. package/dist/env.js +75 -0
  114. package/dist/exceptions/error-handler.js +2 -3
  115. package/dist/exceptions/so-exceptions.js +7 -5
  116. package/dist/filter/index.js +1 -2
  117. package/dist/filter/types.js +3 -4
  118. package/dist/filter/utils.js +21 -54
  119. package/dist/index.js +8 -7
  120. package/dist/logger/category.js +6 -12
  121. package/dist/logger/configure.js +23 -34
  122. package/dist/migration/code-generation.js +146 -314
  123. package/dist/migration/index-where-predicate.js +52 -144
  124. package/dist/migration/migration-set.js +19 -33
  125. package/dist/migration/migrator.d.ts +2 -0
  126. package/dist/migration/migrator.d.ts.map +1 -1
  127. package/dist/migration/migrator.js +69 -53
  128. package/dist/migration/postgresql-schema-reader.js +126 -225
  129. package/dist/migration/slack-confirm.d.ts +1 -0
  130. package/dist/migration/slack-confirm.d.ts.map +1 -1
  131. package/dist/migration/slack-confirm.js +28 -38
  132. package/dist/migration/types.js +1 -1
  133. package/dist/naite/messaging-types.js +1 -1
  134. package/dist/naite/naite-reporter.js +15 -32
  135. package/dist/naite/naite.js +43 -76
  136. package/dist/ssr/index.js +6 -9
  137. package/dist/ssr/registry.js +10 -18
  138. package/dist/ssr/renderer.js +10 -21
  139. package/dist/ssr/types.js +1 -1
  140. package/dist/storage/base-file.js +5 -10
  141. package/dist/storage/buffered-file.js +3 -4
  142. package/dist/storage/drivers.js +2 -3
  143. package/dist/storage/index.js +2 -3
  144. package/dist/storage/s3-driver.js +5 -9
  145. package/dist/storage/storage-manager.js +5 -5
  146. package/dist/storage/types.js +1 -1
  147. package/dist/storage/uploaded-file.js +4 -6
  148. package/dist/stream/index.js +1 -2
  149. package/dist/stream/sse.js +8 -13
  150. package/dist/stream/ws-audience-resolver.js +5 -5
  151. package/dist/stream/ws-audience.js +3 -4
  152. package/dist/stream/ws-cluster-bus.js +3 -4
  153. package/dist/stream/ws-core.js +1 -1
  154. package/dist/stream/ws-delivery.js +11 -25
  155. package/dist/stream/ws-local-connection-store.js +9 -18
  156. package/dist/stream/ws-presence-store.js +43 -97
  157. package/dist/stream/ws-registry.js +17 -22
  158. package/dist/stream/ws-telemetry-memory.js +38 -45
  159. package/dist/stream/ws-telemetry-trace.js +4 -6
  160. package/dist/stream/ws-telemetry.js +82 -135
  161. package/dist/stream/ws.js +47 -91
  162. package/dist/syncer/api-parser.js +81 -147
  163. package/dist/syncer/checksum.js +9 -20
  164. package/dist/syncer/code-generator.js +29 -47
  165. package/dist/syncer/entity-operations.js +17 -27
  166. package/dist/syncer/event-batcher.js +8 -15
  167. package/dist/syncer/file-patterns.js +3 -4
  168. package/dist/syncer/file-tracking.js +6 -10
  169. package/dist/syncer/index.js +1 -2
  170. package/dist/syncer/module-loader.js +10 -26
  171. package/dist/syncer/syncer-actions.js +19 -37
  172. package/dist/syncer/syncer.js +46 -98
  173. package/dist/syncer/watcher.js +12 -26
  174. package/dist/tasks/decorator.js +7 -11
  175. package/dist/tasks/step-wrapper.js +7 -8
  176. package/dist/tasks/workflow-manager.js +18 -25
  177. package/dist/template/entity-converter.js +40 -64
  178. package/dist/template/helpers.js +32 -63
  179. package/dist/template/implementations/entity.template.js +7 -11
  180. package/dist/template/implementations/entry-server.template.js +2 -3
  181. package/dist/template/implementations/generated.template.js +25 -51
  182. package/dist/template/implementations/generated_http.template.js +31 -58
  183. package/dist/template/implementations/generated_sso.template.js +45 -85
  184. package/dist/template/implementations/init_types.template.js +4 -7
  185. package/dist/template/implementations/model.template.js +5 -10
  186. package/dist/template/implementations/model_test.template.js +2 -3
  187. package/dist/template/implementations/queries.template.js +4 -7
  188. package/dist/template/implementations/sd.template.js +17 -35
  189. package/dist/template/implementations/services.template.js +18 -30
  190. package/dist/template/implementations/view_form.template.js +72 -125
  191. package/dist/template/implementations/view_id_all_select.template.js +2 -3
  192. package/dist/template/implementations/view_list.template.js +86 -143
  193. package/dist/template/implementations/view_search_input.template.js +2 -3
  194. package/dist/template/index.js +5 -8
  195. package/dist/template/template-manager.js +13 -26
  196. package/dist/template/template-types.js +2 -3
  197. package/dist/template/template.js +7 -11
  198. package/dist/template/zod-converter.js +173 -348
  199. package/dist/testing/_relation-graph.js +18 -37
  200. package/dist/testing/bootstrap.js +5 -8
  201. package/dist/testing/data-explorer.js +34 -78
  202. package/dist/testing/dev-test-routes.js +54 -60
  203. package/dist/testing/dev-vitest-manager.js +33 -84
  204. package/dist/testing/faker-mappings.js +3 -4
  205. package/dist/testing/fixture-generator.d.ts +2 -1
  206. package/dist/testing/fixture-generator.d.ts.map +1 -1
  207. package/dist/testing/fixture-generator.js +159 -321
  208. package/dist/testing/fixture-loader.js +2 -2
  209. package/dist/testing/fixture-manager.d.ts.map +1 -1
  210. package/dist/testing/fixture-manager.js +124 -227
  211. package/dist/testing/global-setup.d.ts.map +1 -1
  212. package/dist/testing/global-setup.js +29 -17
  213. package/dist/testing/index.js +1 -2
  214. package/dist/testing/naite-vitest-reporter.js +2 -3
  215. package/dist/testing/parallel-db-manager.js +5 -3
  216. package/dist/testing/vitest-helpers.d.ts.map +1 -1
  217. package/dist/testing/vitest-helpers.js +15 -12
  218. package/dist/types/types.d.ts +14 -14
  219. package/dist/types/types.js +27 -50
  220. package/dist/ui/ai-api.js +6 -11
  221. package/dist/ui/ai-client.js +86 -134
  222. package/dist/ui/api.js +99 -195
  223. package/dist/ui/cdd-service.js +78 -130
  224. package/dist/ui/cdd-types.js +1 -1
  225. package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
  226. package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
  227. package/dist/ui-web/index.html +2 -2
  228. package/dist/utils/async-utils.js +13 -25
  229. package/dist/utils/class-name.js +3 -4
  230. package/dist/utils/console-util.js +11 -26
  231. package/dist/utils/controller.d.ts.map +1 -1
  232. package/dist/utils/controller.js +14 -12
  233. package/dist/utils/esm-utils.js +5 -8
  234. package/dist/utils/formatter.js +10 -22
  235. package/dist/utils/fs-utils.js +14 -25
  236. package/dist/utils/lodash-able.js +3 -4
  237. package/dist/utils/model.js +7 -14
  238. package/dist/utils/object-utils.js +41 -73
  239. package/dist/utils/path-utils.js +5 -9
  240. package/dist/utils/process-utils.js +4 -7
  241. package/dist/utils/sql-parser.js +6 -13
  242. package/dist/utils/type-utils.js +16 -26
  243. package/dist/utils/utils.js +18 -40
  244. package/dist/utils/zod-error.js +9 -16
  245. package/dist/vector/chunking.js +24 -37
  246. package/dist/vector/config.js +2 -2
  247. package/dist/vector/embedding.js +8 -19
  248. package/dist/vector/index.js +1 -2
  249. package/dist/vector/types.js +1 -1
  250. package/package.json +7 -7
  251. package/src/__tests__/env.test.ts +127 -0
  252. package/src/api/__tests__/config.test.ts +10 -1
  253. package/src/api/config.ts +4 -12
  254. package/src/api/sonamu.ts +14 -4
  255. package/src/bin/__tests__/migrate-targets.test.ts +28 -0
  256. package/src/bin/__tests__/test-command.test.ts +82 -1
  257. package/src/bin/cli.ts +9 -18
  258. package/src/bin/fixture.ts +5 -4
  259. package/src/bin/migrate-targets.ts +7 -0
  260. package/src/bin/test-command.ts +2 -2
  261. package/src/database/__tests__/db.test.ts +175 -0
  262. package/src/database/db.ts +193 -71
  263. package/src/dict/en.ts +2 -0
  264. package/src/dict/ko.ts +2 -0
  265. package/src/env.ts +123 -0
  266. package/src/migration/__tests__/migrator.test.ts +149 -0
  267. package/src/migration/migrator.ts +74 -17
  268. package/src/migration/slack-confirm.ts +21 -0
  269. package/src/skills/sonamu/database.md +1 -1
  270. package/src/skills/sonamu/entity-basic.md +31 -0
  271. package/src/skills/sonamu/puri.md +22 -0
  272. package/src/skills/sonamu/testing-devrunner.md +1 -1
  273. package/src/skills/sonamu/upsert.md +53 -6
  274. package/src/stream/ws-telemetry-memory.ts +2 -2
  275. package/src/testing/fixture-generator.ts +2 -1
  276. package/src/testing/fixture-manager.ts +3 -4
  277. package/src/testing/global-setup.ts +42 -18
  278. package/src/testing/vitest-helpers.ts +14 -0
  279. package/src/utils/controller.ts +14 -7
  280. package/tsdown.api.config.ts +6 -0
  281. package/dist/_virtual/rolldown_runtime.js +0 -39
  282. package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
@@ -4,7 +4,6 @@ import { getEnumInfoFromColName, getRelationNameFromColumnName, getRelationPropF
4
4
  import inflection from "inflection";
5
5
  import { z as z$1 } from "zod";
6
6
  import { flat } from "radashi";
7
-
8
7
  //#region src/template/implementations/view_list.template.ts
9
8
  init_entity_manager();
10
9
  init_helpers();
@@ -27,47 +26,30 @@ var Template__view_list = class extends Template {
27
26
  }
28
27
  renderColumn(entityId, col, names, parentObj = "row", withoutName = false) {
29
28
  let colName;
30
- if (withoutName) {
31
- colName = parentObj;
32
- } else if (col.name.includes(".")) {
33
- const parts = col.name.split(".");
34
- colName = `${parentObj}.${parts.join("?.")}`;
35
- } else {
36
- colName = `${parentObj}.${col.name}`;
37
- }
29
+ if (withoutName) colName = parentObj;
30
+ else if (col.name.includes(".")) colName = `${parentObj}.${col.name.split(".").join("?.")}`;
31
+ else colName = `${parentObj}.${col.name}`;
38
32
  switch (col.renderType) {
39
33
  case "string-plain":
40
34
  case "string-date":
41
35
  case "number-id":
42
36
  case "string-id": return `<>{${colName}}</>`;
43
37
  case "number-fk_id":
44
- case "string-fk_id": {
45
- try {
46
- const baseName = col.name.includes(".") ? (col.name.split(".").pop() ?? col.name).replace("_id", "") : col.name.replace("_id", "");
47
- const relPropFk = getRelationPropFromColName(entityId, baseName);
48
- return `<>${relPropFk.with}#{${colName}}</>`;
49
- } catch {
50
- return `<>{${colName}}</>`;
51
- }
52
- }
53
- case "datetime": if (col.nullable || col.name.includes(".")) {
54
- return `<span>{${colName} ? datetimeF(${colName}) : '-'}</span>`;
55
- } else {
56
- return `<span>{datetimeF(${colName})}</span>`;
57
- }
58
- case "string-datetime": if (col.nullable || col.name.includes(".")) {
59
- return `<span>{${colName} ? dateF(${colName}) : '-'}</span>`;
60
- } else {
61
- return `<span>{dateF(${colName})}</span>`;
38
+ case "string-fk_id": try {
39
+ return `<>${getRelationPropFromColName(entityId, col.name.includes(".") ? (col.name.split(".").pop() ?? col.name).replace("_id", "") : col.name.replace("_id", "")).with}#{${colName}}</>`;
40
+ } catch {
41
+ return `<>{${colName}}</>`;
62
42
  }
43
+ case "datetime": if (col.nullable || col.name.includes(".")) return `<span>{${colName} ? datetimeF(${colName}) : '-'}</span>`;
44
+ else return `<span>{datetimeF(${colName})}</span>`;
45
+ case "string-datetime": if (col.nullable || col.name.includes(".")) return `<span>{${colName} ? dateF(${colName}) : '-'}</span>`;
46
+ else return `<span>{dateF(${colName})}</span>`;
63
47
  case "boolean": return `<>{${colName} ? <Badge variant="default">O</Badge> : <Badge variant="secondary">X</Badge>}</>`;
64
- case "enums": {
65
- try {
66
- const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
67
- return `<>{${col.nullable ? `${colName} && ` : ""}${enumId}Label[${colName}]}</>`;
68
- } catch {
69
- return `<>{${colName}}</>`;
70
- }
48
+ case "enums": try {
49
+ const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
50
+ return `<>{${col.nullable ? `${colName} && ` : ""}${enumId}Label[${colName}]}</>`;
51
+ } catch {
52
+ return `<>{${colName}}</>`;
71
53
  }
72
54
  case "array-images": return `<div className="flex gap-1">{ ${colName}?.map((r, i) => ${col.nullable ? `r && ` : ""}<img key={i} src={r} alt={\`${col.label ?? col.name} \${i + 1}\`} className="h-8 w-8 object-cover rounded" />) }</div>`;
73
55
  case "json-sonamufile": return `<div className="flex items-center gap-2">{${colName} ? <img src={${colName}.url} alt={${colName}.name} className="h-8 w-8 object-cover rounded" /> : '-'}</div>`;
@@ -76,9 +58,7 @@ var Template__view_list = class extends Template {
76
58
  case "object": return `<span className="text-xs">{${col.nullable ? `${colName} ? ` : ""}JSON.stringify(${colName})${col.nullable ? ` : '-'` : ""}}</span>`;
77
59
  case "object-pick": {
78
60
  const pickedChild = col.children?.find((child) => child.name === col.config?.picked);
79
- if (!pickedChild) {
80
- throw new Error(`object-pick 선택 실패 (오브젝트: ${col.name})`);
81
- }
61
+ if (!pickedChild) throw new Error(`object-pick 선택 실패 (오브젝트: ${col.name})`);
82
62
  return this.renderColumn(entityId, pickedChild, names, `${colName}${col.nullable ? "?" : ""}`);
83
63
  }
84
64
  case "array": return `<>{ /* array ${colName} */ }</>`;
@@ -90,82 +70,64 @@ var Template__view_list = class extends Template {
90
70
  if (col.renderType === "enums") {
91
71
  const { id: enumId } = getEnumInfoFromColName(names.capital, col.name);
92
72
  return [`import { ${enumId}Label } from '@/services/sonamu.generated';`];
93
- } else if (col.renderType === "object") {
94
- try {
95
- const relProp = getRelationPropFromColName(entityId, col.name);
96
- const result = (col.children ?? []).map((child) => {
97
- entityId = relProp.with;
98
- names = EntityManager.getNamesFromId(relProp.with);
99
- return this.renderColumnImport(entityId, child, names);
100
- });
101
- return flat(result);
102
- } catch {
103
- return [null];
104
- }
105
- } else if (col.renderType === "array") {
73
+ } else if (col.renderType === "object") try {
74
+ const relProp = getRelationPropFromColName(entityId, col.name);
75
+ return flat((col.children ?? []).map((child) => {
76
+ entityId = relProp.with;
77
+ names = EntityManager.getNamesFromId(relProp.with);
78
+ return this.renderColumnImport(entityId, child, names);
79
+ }));
80
+ } catch {
81
+ return [null];
82
+ }
83
+ else if (col.renderType === "array") {
106
84
  if (!col.element) return [null];
107
85
  return this.renderColumnImport(entityId, col.element, names);
108
86
  }
109
87
  return [null];
110
88
  }
111
89
  renderFilterImport(entityId, col, names) {
112
- if (col.name === "search") {
113
- return `import { ${names.capital}SearchInput } from "@/components/${names.fs}/${names.capital}SearchInput";`;
114
- } else if (col.renderType === "enums") {
115
- if (col.name === "orderBy") {
116
- const componentId = `${names.capital}${inflection.camelize(col.name)}Select`;
117
- return `import { ${componentId} } from "@/components/${names.fs}/${componentId}";`;
118
- } else {
119
- try {
120
- const { id, targetEntityNames: targetMDNames } = getEnumInfoFromColName(entityId, col.name);
121
- const componentId = `${id}Select`;
122
- return `import { ${componentId} } from "@/components/${targetMDNames.fs}/${componentId}";`;
123
- } catch {
124
- return "";
125
- }
126
- }
127
- } else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
128
- try {
129
- const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
130
- const targetNames = EntityManager.getNamesFromId(relProp.with);
131
- const componentId = `${relProp.with}IdAsyncSelect`;
132
- return `import { ${componentId} } from "@/components/${targetNames.fs}/${componentId}";`;
133
- } catch {
134
- return "";
135
- }
136
- } else {
137
- throw new Error(`렌더 불가능한 필터 임포트 ${col.name} ${col.renderType}`);
90
+ if (col.name === "search") return `import { ${names.capital}SearchInput } from "@/components/${names.fs}/${names.capital}SearchInput";`;
91
+ else if (col.renderType === "enums") if (col.name === "orderBy") {
92
+ const componentId = `${names.capital}${inflection.camelize(col.name)}Select`;
93
+ return `import { ${componentId} } from "@/components/${names.fs}/${componentId}";`;
94
+ } else try {
95
+ const { id, targetEntityNames: targetMDNames } = getEnumInfoFromColName(entityId, col.name);
96
+ const componentId = `${id}Select`;
97
+ return `import { ${componentId} } from "@/components/${targetMDNames.fs}/${componentId}";`;
98
+ } catch {
99
+ return "";
138
100
  }
139
- }
140
- renderFilter(entityId, col, names) {
141
- if (col.name === "search") {
101
+ else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") try {
102
+ const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
103
+ const targetNames = EntityManager.getNamesFromId(relProp.with);
104
+ const componentId = `${relProp.with}IdAsyncSelect`;
105
+ return `import { ${componentId} } from "@/components/${targetNames.fs}/${componentId}";`;
106
+ } catch {
142
107
  return "";
143
108
  }
109
+ else throw new Error(`렌더 불가능한 필터 임포트 ${col.name} ${col.renderType}`);
110
+ }
111
+ renderFilter(entityId, col, names) {
112
+ if (col.name === "search") return "";
144
113
  const isClearable = col.optional === true && col.name !== "orderBy";
145
114
  let componentId;
146
115
  if (col.renderType === "enums") {
147
- if (col.name === "orderBy") {
148
- componentId = `${names.capital}${inflection.camelize(col.name)}Select`;
149
- } else {
150
- try {
151
- const { id } = getEnumInfoFromColName(entityId, col.name);
152
- componentId = `${id}Select`;
153
- } catch {
154
- return "";
155
- }
156
- }
157
- return `<${componentId} {...register('${col.name}')} ${isClearable ? "clearable" : ""} />`;
158
- } else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
159
- try {
160
- const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
161
- componentId = `${relProp.with}IdAsyncSelect`;
162
- return `<${componentId} {...register('${col.name}')} ${isClearable ? "clearable" : ""} subset="A" />`;
116
+ if (col.name === "orderBy") componentId = `${names.capital}${inflection.camelize(col.name)}Select`;
117
+ else try {
118
+ const { id } = getEnumInfoFromColName(entityId, col.name);
119
+ componentId = `${id}Select`;
163
120
  } catch {
164
121
  return "";
165
122
  }
166
- } else {
167
- throw new Error(`렌더 불가능한 필터 임포트 ${col.name} ${col.renderType}`);
123
+ return `<${componentId} {...register('${col.name}')} ${isClearable ? "clearable" : ""} />`;
124
+ } else if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") try {
125
+ componentId = `${getRelationPropFromColName(entityId, col.name.replace("_id", "")).with}IdAsyncSelect`;
126
+ return `<${componentId} {...register('${col.name}')} ${isClearable ? "clearable" : ""} subset="A" />`;
127
+ } catch {
128
+ return "";
168
129
  }
130
+ else throw new Error(`렌더 불가능한 필터 임포트 ${col.name} ${col.renderType}`);
169
131
  }
170
132
  getDefault(columns) {
171
133
  const def = {
@@ -190,8 +152,7 @@ var Template__view_list = class extends Template {
190
152
  const { getColumnsNode } = await import("../entity-converter.js");
191
153
  const { getZodTypeById, zodTypeToRenderingNode } = await import("../zod-converter.js");
192
154
  const columnsNode = await getColumnsNode(entityId, "A");
193
- const listParamsZodType = await getZodTypeById(`${entityId}ListParams`);
194
- const listParamsNode = zodTypeToRenderingNode(listParamsZodType);
155
+ const listParamsNode = zodTypeToRenderingNode(await getZodTypeById(`${entityId}ListParams`));
195
156
  const names = EntityManager.getNamesFromId(entityId);
196
157
  const entity = EntityManager.get(entityId);
197
158
  const pkType = entity.getPkType();
@@ -199,12 +160,9 @@ var Template__view_list = class extends Template {
199
160
  const columns = columnsNode.children.toSorted((a, b) => a.name === "id" ? -1 : b.name === "id" ? 1 : 0).map((col) => {
200
161
  const rendered = this.renderColumn(entityId, col, names);
201
162
  let label;
202
- if (col.name === "id") {
203
- label = "\"ID\"";
204
- } else if (["created_at"].includes(col.name)) {
205
- const camelName = col.name.replace(/_([a-z])/g, (_, char) => char.toUpperCase());
206
- label = `SD("common.${camelName}")`;
207
- } else {
163
+ if (col.name === "id") label = "\"ID\"";
164
+ else if (["created_at"].includes(col.name)) label = `SD("common.${col.name.replace(/_([a-z])/g, (_, char) => char.toUpperCase())}")`;
165
+ else {
208
166
  const labelName = getRelationNameFromColumnName(entityId, col.name);
209
167
  label = `SD("entity.${names.capital}.${labelName}")`;
210
168
  }
@@ -213,7 +171,7 @@ var Template__view_list = class extends Template {
213
171
  label,
214
172
  tc: `(row) => ${rendered}`,
215
173
  fit: col.name === "id" || col.renderType === "number-id" || col.renderType === "datetime" || col.renderType === "string-datetime",
216
- align: col.name === "id" || col.renderType === "number-id" ? "center" : undefined
174
+ align: col.name === "id" || col.renderType === "number-id" ? "center" : void 0
217
175
  };
218
176
  });
219
177
  const filterColumns = listParamsNode.children.filter((col) => col.name !== "id" && col.name !== "queryMode" && [
@@ -227,12 +185,10 @@ var Template__view_list = class extends Template {
227
185
  const preTemplates = [];
228
186
  const columnEnums = [];
229
187
  (columnsNode.children ?? []).forEach((col) => {
230
- if (col.renderType === "enums") {
231
- try {
232
- const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
233
- columnEnums.push(enumId);
234
- } catch {}
235
- }
188
+ if (col.renderType === "enums") try {
189
+ const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
190
+ columnEnums.push(enumId);
191
+ } catch {}
236
192
  });
237
193
  return {
238
194
  ...this.getTargetAndPath(names),
@@ -256,16 +212,10 @@ import { ${names.capital}Service } from "@/services/services.generated";
256
212
  import { ${names.capital}ListParams } from "@/services/${names.fs}/${names.fs}.types";
257
213
  import { ${(() => {
258
214
  const baseEnums = [];
259
- if (filterColumns.some((col) => col.name === "orderBy")) {
260
- baseEnums.push(`${names.capital}OrderBy`, `${names.capital}OrderByLabel`);
261
- }
262
- if (filterColumns.some((col) => col.name === "search")) {
263
- baseEnums.push(`${names.capital}SearchField`, `${names.capital}SearchFieldLabel`);
264
- }
215
+ if (filterColumns.some((col) => col.name === "orderBy")) baseEnums.push(`${names.capital}OrderBy`, `${names.capital}OrderByLabel`);
216
+ if (filterColumns.some((col) => col.name === "search")) baseEnums.push(`${names.capital}SearchField`, `${names.capital}SearchFieldLabel`);
265
217
  const filterEnumIds = filterColumns.filter((col) => col.renderType === "enums" && col.name !== "search" && col.name !== "orderBy").map((col) => {
266
- if (col.config && "enumId" in col.config) {
267
- return col.config.enumId;
268
- }
218
+ if (col.config && "enumId" in col.config) return col.config.enumId;
269
219
  try {
270
220
  const { id: enumId } = getEnumInfoFromColName(entityId, col.name);
271
221
  return enumId;
@@ -273,17 +223,14 @@ import { ${(() => {
273
223
  return null;
274
224
  }
275
225
  }).filter(Boolean);
276
- const allEnums = [...new Set([...filterEnumIds, ...columnEnums])];
277
- const enumImports = allEnums.flatMap((enumId) => [`${enumId}`, `${enumId}Label`]);
226
+ const enumImports = [.../* @__PURE__ */ new Set([...filterEnumIds, ...columnEnums])].flatMap((enumId) => [`${enumId}`, `${enumId}Label`]);
278
227
  return [...baseEnums, ...enumImports].join(", ");
279
228
  })()} } from "@/services/sonamu.generated";
280
229
  import { IdAsyncSelect } from "@sonamu-kit/react-components/components";
281
230
  ${(() => {
282
- const fkColumns = filterColumns.filter((col) => col.renderType === "number-fk_id" || col.renderType === "string-fk_id");
283
- const configNames = fkColumns.map((col) => {
231
+ const configNames = filterColumns.filter((col) => col.renderType === "number-fk_id" || col.renderType === "string-fk_id").map((col) => {
284
232
  try {
285
- const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
286
- return `${relProp.with}AsyncIdConfig`;
233
+ return `${getRelationPropFromColName(entityId, col.name.replace("_id", "")).with}AsyncIdConfig`;
287
234
  } catch {
288
235
  return "";
289
236
  }
@@ -472,10 +419,9 @@ ${filterColumns.some((col) => col.name === "search") ? ` <EnumS
472
419
 
473
420
  <div className="flex items-center gap-3 flex-wrap">
474
421
  ${filterColumns.filter((col) => col.name !== "search" && col.name !== "orderBy").map((col) => {
475
- if (col.renderType === "enums") {
476
- try {
477
- const enumId = col.config && "enumId" in col.config ? col.config.enumId : getEnumInfoFromColName(entityId, col.name).id;
478
- return ` <EnumSelect
422
+ if (col.renderType === "enums") try {
423
+ const enumId = col.config && "enumId" in col.config ? col.config.enumId : getEnumInfoFromColName(entityId, col.name).id;
424
+ return ` <EnumSelect
479
425
  key={\`${col.name}-\${listParams.${col.name}}\`}
480
426
  enum={${enumId}}
481
427
  labels={${enumId}Label}
@@ -484,14 +430,12 @@ ${filterColumns.filter((col) => col.name !== "search" && col.name !== "orderBy")
484
430
  clearable
485
431
  className="w-50 h-8 bg-white border-gray-300 text-xs"
486
432
  />`;
487
- } catch {
488
- return "";
489
- }
433
+ } catch {
434
+ return "";
490
435
  }
491
- if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") {
492
- try {
493
- const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
494
- return ` <IdAsyncSelect
436
+ if (col.renderType === "number-fk_id" || col.renderType === "string-fk_id") try {
437
+ const relProp = getRelationPropFromColName(entityId, col.name.replace("_id", ""));
438
+ return ` <IdAsyncSelect
495
439
  config={${relProp.with}AsyncIdConfig}
496
440
  subset="A"
497
441
  {...register("${col.name}")}
@@ -499,9 +443,8 @@ ${filterColumns.filter((col) => col.name !== "search" && col.name !== "orderBy")
499
443
  clearable
500
444
  className="w-50 h-8 text-xs"
501
445
  />`;
502
- } catch {
503
- return "";
504
- }
446
+ } catch {
447
+ return "";
505
448
  }
506
449
  return "";
507
450
  }).filter(Boolean).join("\n")}
@@ -604,7 +547,7 @@ ${filterColumns.some((col) => col.name === "orderBy") ? ` <Enum
604
547
  };
605
548
  }
606
549
  };
607
-
608
550
  //#endregion
609
551
  export { Template__view_list };
610
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19saXN0LnRlbXBsYXRlLmpzIiwibmFtZXMiOlsiY29sTmFtZTogc3RyaW5nIiwiY29tcG9uZW50SWQ6IHN0cmluZyIsInoiLCJsYWJlbDogc3RyaW5nIiwicHJlVGVtcGxhdGVzOiBSZW5kZXJlZFRlbXBsYXRlW1wicHJlVGVtcGxhdGVzXCJdIiwiY29sdW1uRW51bXM6IHN0cmluZ1tdIiwiYmFzZUVudW1zOiBzdHJpbmdbXSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19saXN0LnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBmbGF0IH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBSZW5kZXJpbmdOb2RlLCB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSxcbiAgZ2V0UmVsYXRpb25OYW1lRnJvbUNvbHVtbk5hbWUsXG4gIGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lLFxufSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgdHlwZSBSZW5kZXJlZFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX3ZpZXdfbGlzdCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJ2aWV3X2xpc3RcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IFwid2ViL3NyYy9yb3V0ZXMvYWRtaW5cIixcbiAgICAgIHBhdGg6IGAke25hbWVzLmZzUGx1cmFsfS9pbmRleC50c3hgLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXF1aXJlZERpY3RLZXlzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIFtcImVudGl0eS5saXN0TWFuYWdlXCIsIFwiY29tbW9uLmFsbFwiXTtcbiAgfVxuXG4gIHdyYXBUYyhib2R5OiBzdHJpbmcsIGtleTogc3RyaW5nLCBjb2xsYXBzaW5nOiBib29sZWFuID0gdHJ1ZSwgY2xhc3NOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgcmV0dXJuIGA8VGFibGUuQ2VsbCBrZXk9XCIke2tleX1cIiR7Y29sbGFwc2luZyA/IFwiIGNvbGxhcHNpbmdcIiA6IFwiXCJ9JHtcbiAgICAgIGNsYXNzTmFtZSA/IGAgY2xhc3NOYW1lPXtcXGAke2NsYXNzTmFtZX1cXGB9YCA6IFwiXCJcbiAgICB9PiR7Ym9keX08L1RhYmxlLkNlbGw+YDtcbiAgfVxuXG4gIHJlbmRlckNvbHVtbihcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGNvbDogUmVuZGVyaW5nTm9kZSxcbiAgICBuYW1lczogRW50aXR5TmFtZXNSZWNvcmQsXG4gICAgcGFyZW50T2JqOiBzdHJpbmcgPSBcInJvd1wiLFxuICAgIHdpdGhvdXROYW1lOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZyB7XG4gICAgLy8g7KSR7LKpIOqyveuhnCDsspjrpqwgKOyYiDogXCJ1c2VyLm5hbWVcIiAtPiBcInJvdy51c2VyPy5uYW1lXCIpXG4gICAgbGV0IGNvbE5hbWU6IHN0cmluZztcbiAgICBpZiAod2l0aG91dE5hbWUpIHtcbiAgICAgIGNvbE5hbWUgPSBwYXJlbnRPYmo7XG4gICAgfSBlbHNlIGlmIChjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIC8vIOykkeyyqSDqsr3roZzripQgb3B0aW9uYWwgY2hhaW5pbmfsnLzroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGNvbC5uYW1lLnNwbGl0KFwiLlwiKTtcbiAgICAgIGNvbE5hbWUgPSBgJHtwYXJlbnRPYmp9LiR7cGFydHMuam9pbihcIj8uXCIpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbE5hbWUgPSBgJHtwYXJlbnRPYmp9LiR7Y29sLm5hbWV9YDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbC5yZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlIFwic3RyaW5nLXBsYWluXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWRhdGVcIjpcbiAgICAgIGNhc2UgXCJudW1iZXItaWRcIjpcbiAgICAgIGNhc2UgXCJzdHJpbmctaWRcIjpcbiAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICBjYXNlIFwibnVtYmVyLWZrX2lkXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWZrX2lkXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKVxuICAgICAgICAgICAgPyAoY29sLm5hbWUuc3BsaXQoXCIuXCIpLnBvcCgpID8/IGNvbC5uYW1lKS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpXG4gICAgICAgICAgICA6IGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIik7XG4gICAgICAgICAgY29uc3QgcmVsUHJvcEZrID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGJhc2VOYW1lKTtcbiAgICAgICAgICByZXR1cm4gYDw+JHtyZWxQcm9wRmsud2l0aH0jeyR7Y29sTmFtZX19PC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgXCJkYXRldGltZVwiOlxuICAgICAgICBpZiAoY29sLm51bGxhYmxlIHx8IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+eyR7Y29sTmFtZX0gPyBkYXRldGltZUYoJHtjb2xOYW1lfSkgOiAnLSd9PC9zcGFuPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGA8c3Bhbj57ZGF0ZXRpbWVGKCR7Y29sTmFtZX0pfTwvc3Bhbj5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwic3RyaW5nLWRhdGV0aW1lXCI6XG4gICAgICAgIGlmIChjb2wubnVsbGFibGUgfHwgY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIGA8c3Bhbj57JHtjb2xOYW1lfSA/IGRhdGVGKCR7Y29sTmFtZX0pIDogJy0nfTwvc3Bhbj5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+e2RhdGVGKCR7Y29sTmFtZX0pfTwvc3Bhbj5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sTmFtZX0gPyA8QmFkZ2UgdmFyaWFudD1cImRlZmF1bHRcIj5PPC9CYWRnZT4gOiA8QmFkZ2UgdmFyaWFudD1cInNlY29uZGFyeVwiPlg8L0JhZGdlPn08Lz5gO1xuICAgICAgY2FzZSBcImVudW1zXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkOiBlbnVtSWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gJiYgYCA6IFwiXCJ9JHtlbnVtSWR9TGFiZWxbJHtjb2xOYW1lfV19PC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhcnJheS1pbWFnZXNcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTFcIj57ICR7Y29sTmFtZX0/Lm1hcCgociwgaSkgPT4gJHtcbiAgICAgICAgICBjb2wubnVsbGFibGUgPyBgciAmJiBgIDogXCJcIlxuICAgICAgICB9PGltZyBrZXk9e2l9IHNyYz17cn0gYWx0PXtcXGAke2NvbC5sYWJlbCA/PyBjb2wubmFtZX0gXFwke2kgKyAxfVxcYH0gY2xhc3NOYW1lPVwiaC04IHctOCBvYmplY3QtY292ZXIgcm91bmRlZFwiIC8+KSB9PC9kaXY+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGVcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+eyR7Y29sTmFtZX0gPyA8aW1nIHNyYz17JHtjb2xOYW1lfS51cmx9IGFsdD17JHtjb2xOYW1lfS5uYW1lfSBjbGFzc05hbWU9XCJoLTggdy04IG9iamVjdC1jb3ZlciByb3VuZGVkXCIgLz4gOiAnLSd9PC9kaXY+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTFcIj57ICR7Y29sTmFtZX0/Lm1hcCgociwgaSkgPT4gJHtcbiAgICAgICAgICBjb2wubnVsbGFibGUgPyBgciAmJiBgIDogXCJcIlxuICAgICAgICB9PGltZyBrZXk9e2l9IHNyYz17ci51cmx9IGFsdD17XFxgJHtjb2wubGFiZWwgPz8gY29sLm5hbWV9IFxcJHtpICsgMX1cXGB9IGNsYXNzTmFtZT1cImgtOCB3LTggb2JqZWN0LWNvdmVyIHJvdW5kZWRcIiAvPikgfTwvZGl2PmA7XG4gICAgICBjYXNlIFwibnVtYmVyLXBsYWluXCI6XG4gICAgICAgIHJldHVybiBgPD57JHtjb2wubnVsbGFibGUgfHwgY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpID8gYCR7Y29sTmFtZX0gJiYgYCA6IFwiXCJ9bnVtRigke2NvbE5hbWV9KX08Lz5gO1xuICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICByZXR1cm4gYDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57JHtjb2wubnVsbGFibGUgPyBgJHtjb2xOYW1lfSA/IGAgOiBcIlwifUpTT04uc3RyaW5naWZ5KCR7Y29sTmFtZX0pJHtjb2wubnVsbGFibGUgPyBgIDogJy0nYCA6IFwiXCJ9fTwvc3Bhbj5gO1xuICAgICAgY2FzZSBcIm9iamVjdC1waWNrXCI6IHtcbiAgICAgICAgY29uc3QgcGlja2VkQ2hpbGQgPSBjb2wuY2hpbGRyZW4/LmZpbmQoKGNoaWxkKSA9PiBjaGlsZC5uYW1lID09PSBjb2wuY29uZmlnPy5waWNrZWQpO1xuICAgICAgICBpZiAoIXBpY2tlZENoaWxkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBvYmplY3QtcGljayDshKDtg50g7Iuk7YyoICjsmKTruIzsoJ3tirg6ICR7Y29sLm5hbWV9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbihcbiAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICBwaWNrZWRDaGlsZCxcbiAgICAgICAgICBuYW1lcyxcbiAgICAgICAgICBgJHtjb2xOYW1lfSR7Y29sLm51bGxhYmxlID8gXCI/XCIgOiBcIlwifWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIGA8PnsgLyogYXJyYXkgJHtjb2xOYW1lfSAqLyB9PC8+YDtcbiAgICAgIGNhc2UgXCJ2ZWN0b3JcIjpcbiAgICAgICAgLy8gdmVjdG9yIO2DgOyeheydgCDssKjsm5Ag7IiY66eMIO2RnOyLnCAo7Iuk7KCcIOuNsOydtO2EsOuKlCDrhIjrrLQg6rmAKVxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gPyBgIDogXCJcIn1bVmVjdG9yOiB7JHtjb2xOYW1lfSR7Y29sLm51bGxhYmxlID8gXCJcIiA6IFwiID8/IFtdXCJ9Lmxlbmd0aH1kXSR7Y29sLm51bGxhYmxlID8gXCIgOiAnLSdcIiA6IFwiXCJ9fTwvPmA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOugjOuNlCDrtojqsIAg7Lus65+8ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyQ29sdW1uSW1wb3J0KFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgY29sOiBSZW5kZXJpbmdOb2RlLFxuICAgIG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCxcbiAgKTogKHN0cmluZyB8IG51bGwpW10ge1xuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICBjb25zdCB7IGlkOiBlbnVtSWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUobmFtZXMuY2FwaXRhbCwgY29sLm5hbWUpO1xuICAgICAgcmV0dXJuIFtgaW1wb3J0IHsgJHtlbnVtSWR9TGFiZWwgfSBmcm9tICdAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWQnO2BdO1xuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoY29sLmNoaWxkcmVuID8/IFtdKS5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgICAgZW50aXR5SWQgPSByZWxQcm9wLndpdGg7XG4gICAgICAgICAgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ29sdW1uSW1wb3J0KGVudGl0eUlkLCBjaGlsZCwgbmFtZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZsYXQocmVzdWx0KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW251bGxdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgICAgaWYgKCFjb2wuZWxlbWVudCkgcmV0dXJuIFtudWxsXTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbkltcG9ydChlbnRpdHlJZCwgY29sLmVsZW1lbnQsIG5hbWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW251bGxdO1xuICB9XG5cbiAgcmVuZGVyRmlsdGVySW1wb3J0KGVudGl0eUlkOiBzdHJpbmcsIGNvbDogUmVuZGVyaW5nTm9kZSwgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgaWYgKGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSB7XG4gICAgICByZXR1cm4gYGltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZWFyY2hJbnB1dCB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHtuYW1lcy5mc30vJHtuYW1lcy5jYXBpdGFsfVNlYXJjaElucHV0XCI7YDtcbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGlmIChjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBgJHtuYW1lcy5jYXBpdGFsfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShjb2wubmFtZSl9U2VsZWN0YDtcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHtuYW1lcy5mc30vJHtjb21wb25lbnRJZH1cIjtgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkLCB0YXJnZXRFbnRpdHlOYW1lczogdGFyZ2V0TUROYW1lcyB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShcbiAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgY29sLm5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGAke2lkfVNlbGVjdGA7XG4gICAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHt0YXJnZXRNRE5hbWVzLmZzfS8ke2NvbXBvbmVudElkfVwiO2A7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkID0gYCR7cmVsUHJvcC53aXRofUlkQXN5bmNTZWxlY3RgO1xuICAgICAgICByZXR1cm4gYGltcG9ydCB7ICR7Y29tcG9uZW50SWR9IH0gZnJvbSBcIkAvY29tcG9uZW50cy8ke3RhcmdldE5hbWVzLmZzfS8ke2NvbXBvbmVudElkfVwiO2A7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg66CM642UIOu2iOqwgOuKpe2VnCDtlYTthLAg7J6E7Y+s7Yq4ICR7Y29sLm5hbWV9ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyRmlsdGVyKGVudGl0eUlkOiBzdHJpbmcsIGNvbDogUmVuZGVyaW5nTm9kZSwgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgaWYgKGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBjb25zdCBpc0NsZWFyYWJsZSA9IGNvbC5vcHRpb25hbCA9PT0gdHJ1ZSAmJiBjb2wubmFtZSAhPT0gXCJvcmRlckJ5XCI7XG4gICAgbGV0IGNvbXBvbmVudElkOiBzdHJpbmc7XG4gICAgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGlmIChjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpIHtcbiAgICAgICAgY29tcG9uZW50SWQgPSBgJHtuYW1lcy5jYXBpdGFsfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShjb2wubmFtZSl9U2VsZWN0YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGNvbXBvbmVudElkID0gYCR7aWR9U2VsZWN0YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBgPCR7Y29tcG9uZW50SWR9IHsuLi5yZWdpc3RlcignJHtjb2wubmFtZX0nKX0gJHtpc0NsZWFyYWJsZSA/IFwiY2xlYXJhYmxlXCIgOiBcIlwifSAvPmA7XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgY29tcG9uZW50SWQgPSBgJHtyZWxQcm9wLndpdGh9SWRBc3luY1NlbGVjdGA7XG4gICAgICAgIHJldHVybiBgPCR7Y29tcG9uZW50SWR9IHsuLi5yZWdpc3RlcignJHtjb2wubmFtZX0nKX0gJHtcbiAgICAgICAgICBpc0NsZWFyYWJsZSA/IFwiY2xlYXJhYmxlXCIgOiBcIlwiXG4gICAgICAgIH0gc3Vic2V0PVwiQVwiIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDroIzrjZQg67aI6rCA64ql7ZWcIO2VhO2EsCDsnoTtj6ztirggJHtjb2wubmFtZX0gJHtjb2wucmVuZGVyVHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBnZXREZWZhdWx0KGNvbHVtbnM6IFJlbmRlcmluZ05vZGVbXSk6IHtcbiAgICBvcmRlckJ5OiBzdHJpbmc7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgaGFzU2VhcmNoOiBib29sZWFuO1xuICAgIGhhc09yZGVyQnk6IGJvb2xlYW47XG4gIH0ge1xuICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgIG9yZGVyQnk6IFwiXCIsXG4gICAgICBzZWFyY2g6IFwiXCIsXG4gICAgICBoYXNTZWFyY2g6IGZhbHNlLFxuICAgICAgaGFzT3JkZXJCeTogZmFsc2UsXG4gICAgfTtcbiAgICBjb25zdCBvcmRlckJ5Wm9kVHlwZSA9IGNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpPy56b2RUeXBlO1xuICAgIGlmIChvcmRlckJ5Wm9kVHlwZSAmJiBvcmRlckJ5Wm9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgICAgZGVmLm9yZGVyQnkgPSBPYmplY3Qua2V5cyhvcmRlckJ5Wm9kVHlwZS5lbnVtKVswXTtcbiAgICAgIGRlZi5oYXNPcmRlckJ5ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoWm9kVHlwZSA9IGNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIik/LnpvZFR5cGU7XG4gICAgaWYgKHNlYXJjaFpvZFR5cGUgJiYgc2VhcmNoWm9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgICAgZGVmLnNlYXJjaCA9IE9iamVjdC5rZXlzKHNlYXJjaFpvZFR5cGUuZW51bSlbMF07XG4gICAgICBkZWYuaGFzU2VhcmNoID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZjtcbiAgfVxuXG4gIGFzeW5jIHJlbmRlcih7IGVudGl0eUlkIH06IFRlbXBsYXRlT3B0aW9uc1tcInZpZXdfbGlzdFwiXSkge1xuICAgIGNvbnN0IHsgZ2V0Q29sdW1uc05vZGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS1jb252ZXJ0ZXJcIik7XG4gICAgY29uc3QgeyBnZXRab2RUeXBlQnlJZCwgem9kVHlwZVRvUmVuZGVyaW5nTm9kZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vem9kLWNvbnZlcnRlclwiKTtcblxuICAgIGNvbnN0IGNvbHVtbnNOb2RlID0gYXdhaXQgZ2V0Q29sdW1uc05vZGUoZW50aXR5SWQsIFwiQVwiKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zWm9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKGAke2VudGl0eUlkfUxpc3RQYXJhbXNgKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zTm9kZSA9IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUobGlzdFBhcmFtc1pvZFR5cGUpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAvLyBQSyDtg4DsnoUg6rCQ7KeAXG4gICAgY29uc3QgcGtUeXBlID0gZW50aXR5LmdldFBrVHlwZSgpO1xuICAgIGNvbnN0IGlkVHNUeXBlID0gcGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcblxuICAgIC8vIOyLpOygnCDrpqzsiqTtirgg7Lus65+8XG4gICAgY29uc3QgY29sdW1ucyA9IChjb2x1bW5zTm9kZS5jaGlsZHJlbiBhcyBSZW5kZXJpbmdOb2RlW10pXG5cbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gKGEubmFtZSA9PT0gXCJpZFwiID8gLTEgOiBiLm5hbWUgPT09IFwiaWRcIiA/IDEgOiAwKSlcbiAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICBjb25zdCByZW5kZXJlZCA9IHRoaXMucmVuZGVyQ29sdW1uKGVudGl0eUlkLCBjb2wsIG5hbWVzKTtcblxuICAgICAgICAvLyDrnbzrsqgg7IOd7ISxOiBjb21tb24g7ZWE65OcKGNyZWF0ZWRfYXQp64qUIFNEKFwiY29tbW9uLntmaWVsZH1cIiksIGVudGl0eSDtlYTrk5zripQgU0QoXCJlbnRpdHkue0VudGl0eX0ue2ZpZWxkfVwiKVxuICAgICAgICBsZXQgbGFiZWw6IHN0cmluZztcbiAgICAgICAgaWYgKGNvbC5uYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgICBsYWJlbCA9ICdcIklEXCInO1xuICAgICAgICB9IGVsc2UgaWYgKFtcImNyZWF0ZWRfYXRcIl0uaW5jbHVkZXMoY29sLm5hbWUpKSB7XG4gICAgICAgICAgLy8gY2FtZWxDYXNl66GcIOuzgO2ZmCAoY3JlYXRlZF9hdCAtPiBjcmVhdGVkQXQpXG4gICAgICAgICAgY29uc3QgY2FtZWxOYW1lID0gY29sLm5hbWUucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGNoYXIpID0+IGNoYXIudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgbGFiZWwgPSBgU0QoXCJjb21tb24uJHtjYW1lbE5hbWV9XCIpYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBsYWJlbE5hbWUgPSBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGxhYmVsID0gYFNEKFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH0uJHtsYWJlbE5hbWV9XCIpYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogY29sLm5hbWUsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgdGM6IGAocm93KSA9PiAke3JlbmRlcmVkfWAsXG4gICAgICAgICAgZml0OlxuICAgICAgICAgICAgY29sLm5hbWUgPT09IFwiaWRcIiB8fFxuICAgICAgICAgICAgY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWlkXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcImRhdGV0aW1lXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1kYXRldGltZVwiLFxuICAgICAgICAgIGFsaWduOiBjb2wubmFtZSA9PT0gXCJpZFwiIHx8IGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1pZFwiID8gXCJjZW50ZXJcIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgLy8g7ZWE7YSwIOy7rOufvFxuICAgIGNvbnN0IGZpbHRlckNvbHVtbnMgPSAobGlzdFBhcmFtc05vZGUuY2hpbGRyZW4gYXMgUmVuZGVyaW5nTm9kZVtdKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGNvbCkgPT5cbiAgICAgICAgICBjb2wubmFtZSAhPT0gXCJpZFwiICYmXG4gICAgICAgICAgY29sLm5hbWUgIT09IFwicXVlcnlNb2RlXCIgJiZcbiAgICAgICAgICBbXCJlbnVtc1wiLCBcIm51bWJlci1pZFwiLCBcIm51bWJlci1ma19pZFwiLCBcInN0cmluZy1ma19pZFwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSksXG4gICAgICApXG4gICAgICAvLyBvcmRlckJ56rCAIOqwgOyepSDrkqTroZwg7Jik6rKMIOyInOyEnCDsobDsoJVcbiAgICAgIC50b1NvcnRlZCgoYSkgPT4ge1xuICAgICAgICByZXR1cm4gYS5uYW1lID09PSBcIm9yZGVyQnlcIiA/IDEgOiAtMTtcbiAgICAgIH0pO1xuXG4gICAgLy8g7ZWE7YSwIOy7rOufvOydhCDtlITrpqwg7YWc7ZSM66a/7Jy866GcIOyEpOyglVxuICAgIGNvbnN0IHByZVRlbXBsYXRlczogUmVuZGVyZWRUZW1wbGF0ZVtcInByZVRlbXBsYXRlc1wiXSA9IFtdO1xuXG4gICAgLy8g7Lus65+87JeQ7IScIOyCrOyaqe2VmOuKlCBlbnVt65OkIOyImOynkVxuICAgIGNvbnN0IGNvbHVtbkVudW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIChjb2x1bW5zTm9kZS5jaGlsZHJlbiA/PyBbXSkuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgaWQ6IGVudW1JZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGNvbHVtbkVudW1zLnB1c2goZW51bUlkKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g65SU7Y+07Yq4IO2MjOudvOuvuO2EsFxuICAgIC8vIGNvbnN0IGRlZiA9IHRoaXMuZ2V0RGVmYXVsdChmaWx0ZXJDb2x1bW5zKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgobmFtZXMpLFxuICAgICAgYm9keTogYFxuaW1wb3J0IHsgdXNlU3RhdGUsIEZyYWdtZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVGaWxlUm91dGUsIHVzZU5hdmlnYXRlIH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1yb3V0ZXJcIjtcblxuaW1wb3J0IHsgQ2FyZCwgQ2FyZENvbnRlbnQsIENhcmRIZWFkZXIgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBCYWRnZSB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IFBhZ2luYXRpb24sIFRhYmxlLCBUYWJsZUJvZHksIFRhYmxlQ2VsbCwgdHlwZSBUYWJsZUNvbCwgVGFibGVIZWFkLCBUYWJsZUhlYWRlciwgVGFibGVSb3cgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBFbnVtU2VsZWN0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgQWxlcnREaWFsb2csIEFsZXJ0RGlhbG9nQWN0aW9uLCBBbGVydERpYWxvZ0NhbmNlbCwgQWxlcnREaWFsb2dDb250ZW50LCBBbGVydERpYWxvZ0Rlc2NyaXB0aW9uLCBBbGVydERpYWxvZ0Zvb3RlciwgQWxlcnREaWFsb2dIZWFkZXIsIEFsZXJ0RGlhbG9nVGl0bGUgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IENoZWNrYm94IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgU29uYW11RmlsdGVyTW9kYWwsIFNvbmFtdUZpbHRlclBvcG92ZXIsIGV4dHJhY3RGaWVsZE1ldGFGcm9tU2NoZW1hLCB0eXBlIFJ1bGUgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5cbmltcG9ydCB7IHVzZUxpc3RQYXJhbXMsIG51bUYsIGRhdGVGLCBkYXRldGltZUYgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9saWJcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TdWJzZXRBLCAke25hbWVzLmNhcGl0YWx9QmFzZVNjaGVtYSB9IGZyb20gXCJAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvc2VydmljZXMuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyAke25hbWVzLmNhcGl0YWx9TGlzdFBhcmFtcyB9IGZyb20gXCJAL3NlcnZpY2VzLyR7bmFtZXMuZnN9LyR7bmFtZXMuZnN9LnR5cGVzXCI7XG5pbXBvcnQgeyAkeygoKSA9PiB7XG4gICAgICAgIC8vIOq4sOuzuCBlbnVtIOyImOynkSAoZmlsdGVyQ29sdW1uc+yXkCDsnojripQg6rKD66eMKVxuICAgICAgICBjb25zdCBiYXNlRW51bXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKSkge1xuICAgICAgICAgIGJhc2VFbnVtcy5wdXNoKGAke25hbWVzLmNhcGl0YWx9T3JkZXJCeWAsIGAke25hbWVzLmNhcGl0YWx9T3JkZXJCeUxhYmVsYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIikpIHtcbiAgICAgICAgICBiYXNlRW51bXMucHVzaChgJHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkYCwgYCR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZExhYmVsYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtlYTthLAgZW51bSDsiJjsp5EgKGNvbmZpZy5lbnVtSWQg7Jqw7ISgLCDsl4bsnLzrqbQgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSlcbiAgICAgICAgY29uc3QgZmlsdGVyRW51bUlkcyA9IGZpbHRlckNvbHVtbnNcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIiAmJiBjb2wubmFtZSAhPT0gXCJzZWFyY2hcIiAmJiBjb2wubmFtZSAhPT0gXCJvcmRlckJ5XCIsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbC5jb25maWcgJiYgXCJlbnVtSWRcIiBpbiBjb2wuY29uZmlnKSB7XG4gICAgICAgICAgICAgIHJldHVybiAoY29sLmNvbmZpZyBhcyB7IGVudW1JZDogc3RyaW5nIH0pLmVudW1JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgaWQ6IGVudW1JZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICByZXR1cm4gZW51bUlkO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAvLyDrqqjrk6AgZW51bSDtlansuZjqs6Ag7KSR67O1IOygnOqxsFxuICAgICAgICBjb25zdCBhbGxFbnVtcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFbnVtSWRzLCAuLi5jb2x1bW5FbnVtc10pXTtcbiAgICAgICAgY29uc3QgZW51bUltcG9ydHMgPSBhbGxFbnVtcy5mbGF0TWFwKChlbnVtSWQpID0+IFtgJHtlbnVtSWR9YCwgYCR7ZW51bUlkfUxhYmVsYF0pO1xuXG4gICAgICAgIHJldHVybiBbLi4uYmFzZUVudW1zLCAuLi5lbnVtSW1wb3J0c10uam9pbihcIiwgXCIpO1xuICAgICAgfSkoKX0gfSBmcm9tIFwiQC9zZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBJZEFzeW5jU2VsZWN0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuJHsoKCkgPT4ge1xuICAvLyBGSyDtlYTrk5zsnZggQXN5bmNJZENvbmZpZyBpbXBvcnRcbiAgY29uc3QgZmtDb2x1bW5zID0gZmlsdGVyQ29sdW1ucy5maWx0ZXIoXG4gICAgKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIsXG4gICk7XG4gIGNvbnN0IGNvbmZpZ05hbWVzID0gZmtDb2x1bW5zXG4gICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICByZXR1cm4gYCR7cmVsUHJvcC53aXRofUFzeW5jSWRDb25maWdgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIGNvbmZpZ05hbWVzLmxlbmd0aCA+IDBcbiAgICA/IGBpbXBvcnQgeyAke2NvbmZpZ05hbWVzLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiQC9zZXJ2aWNlcy9zZXJ2aWNlcy5nZW5lcmF0ZWRcIjtgXG4gICAgOiBcIlwiO1xufSkoKX1cblxuaW1wb3J0IEVkaXRJY29uIGZyb20gXCJ+aWNvbnMvbHVjaWRlL3NxdWFyZS1wZW5cIjtcbmltcG9ydCBUcmFzaEljb24gZnJvbSBcIn5pY29ucy9sdWNpZGUvdHJhc2gtMlwiO1xuaW1wb3J0IEZpbHRlckljb24gZnJvbSBcIn5pY29ucy9tZGkvZmlsdGVyLXZhcmlhbnRcIjtcbmltcG9ydCBMaXN0SWNvbiBmcm9tIFwifmljb25zL21kaS9mb3JtYXQtbGlzdC1idWxsZXRlZFwiO1xuaW1wb3J0IFNlYXJjaEljb24gZnJvbSBcIn5pY29ucy9tZGkvbWFnbmlmeVwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiQC9pMThuL3NkLmdlbmVyYXRlZFwiO1xuXG5leHBvcnQgY29uc3QgUm91dGUgPSBjcmVhdGVGaWxlUm91dGUoXCIvYWRtaW4vJHtuYW1lcy5mc1BsdXJhbH0vXCIpKHtcXG4gIGhlYWQ6ICgpID0+ICh7XFxuICAgIG1ldGE6IFtcXG4gICAgICB7IHRpdGxlOiBcIiR7ZW50aXR5LnRpdGxlID8/IG5hbWVzLmNhcGl0YWx9IExpc3RcIiB9LFxcbiAgICAgIHsgbmFtZTogXCJkZXNjcmlwdGlvblwiLCBjb250ZW50OiBTRChcImVudGl0eS5saXN0TWFuYWdlXCIpKFwiJHtlbnRpdHkudGl0bGUgPz8gbmFtZXMuY2FwaXRhbH1cIikgfSxcXG4gICAgXSxcXG4gIH0pLFxcbiAgY29tcG9uZW50OiAke25hbWVzLmNhcGl0YWx9TGlzdCxcXG59KTtcXG5cXG50eXBlICR7bmFtZXMuY2FwaXRhbH1MaXN0UHJvcHMgPSB7fTtcblxuZnVuY3Rpb24gJHtuYW1lcy5jYXBpdGFsfUxpc3Qoe306ICR7bmFtZXMuY2FwaXRhbH1MaXN0UHJvcHMpIHtcbiAgY29uc3QgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuXG4gIC8vIOyDge2DnCDqtIDrpqxcbiAgY29uc3QgW3NlbGVjdGVkSXRlbXMsIHNldFNlbGVjdGVkSXRlbXNdID0gdXNlU3RhdGU8U2V0PCR7aWRUc1R5cGV9Pj4obmV3IFNldCgpKTtcbiAgY29uc3QgW2RlbGV0ZURpYWxvZ09wZW4sIHNldERlbGV0ZURpYWxvZ09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXRlbVRvRGVsZXRlLCBzZXRJdGVtVG9EZWxldGVdID0gdXNlU3RhdGU8eyBpZDogJHtpZFRzVHlwZX07IG5hbWU/OiBzdHJpbmcgfSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbZmlsdGVyTW9kYWxPcGVuLCBzZXRGaWx0ZXJNb2RhbE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbYXBwbGllZFJ1bGVzLCBzZXRBcHBsaWVkUnVsZXNdID0gdXNlU3RhdGU8UnVsZVtdPihbXSk7XG5cbiAgLy8g66as7Iqk7Yq4IO2VhO2EsFxuICBjb25zdCB7IGxpc3RQYXJhbXMsIHJlZ2lzdGVyLCBzZXRMaXN0UGFyYW1zIH0gPSB1c2VMaXN0UGFyYW1zKCR7bmFtZXMuY2FwaXRhbH1MaXN0UGFyYW1zLCB7XG4gICAgbnVtOiAxMCxcbiAgICBwYWdlOiAxLFxuICAgIGtleXdvcmQ6IFwiXCIsJHtcbiAgICAgIGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIilcbiAgICAgICAgPyBgXG4gICAgc2VhcmNoOiAke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGQub3B0aW9uc1swXSxgXG4gICAgICAgIDogXCJcIlxuICAgIH0ke1xuICAgICAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcIm9yZGVyQnlcIilcbiAgICAgICAgPyBgXG4gICAgb3JkZXJCeTogJHtuYW1lcy5jYXBpdGFsfU9yZGVyQnkub3B0aW9uc1swXSxgXG4gICAgICAgIDogXCJcIlxuICAgIH1cbiAgICBzb25hbXVGaWx0ZXI6IHt9LFxuICB9KTtcblxuICAvLyDrpqzsiqTtirgg7L+866asXG4gIGNvbnN0IHsgZGF0YSwgcmVmZXRjaCwgaXNMb2FkaW5nIH0gPSAke25hbWVzLmNhcGl0YWx9U2VydmljZS51c2Uke25hbWVzLmNhcGl0YWxQbHVyYWx9KFwiQVwiLCBsaXN0UGFyYW1zKTtcbiAgY29uc3QgeyByb3dzLCB0b3RhbCB9ID0gZGF0YSA/PyB7fTtcblxuICAvLyDtmITsnqwg6rK966Gc7JmAIO2DgOydtO2LgFxuICBjb25zdCBQQUdFID0ge1xuICAgIHJvdXRlOiBcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfVwiLFxuICAgIHRpdGxlOiBTRChcImVudGl0eS5saXN0XCIpKFNEKFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH1cIikpLFxuICB9O1xuXG4gIC8vIOy7rOufvCDsoJXsnZhcbiAgdHlwZSAke25hbWVzLmNhcGl0YWx9Um93ID0gTm9uTnVsbGFibGU8dHlwZW9mIHJvd3M+W251bWJlcl07XG4gIGNvbnN0IGNvbHVtbnM6IFRhYmxlQ29sPCR7bmFtZXMuY2FwaXRhbH1Sb3c+W10gPSBbXG4ke2NvbHVtbnNcbiAgLm1hcChcbiAgICAoY29sKSA9PiBgICAgIHtcbiAgICAgIGxhYmVsOiAke2NvbC5sYWJlbH0sXG4gICAgICB0YzogJHtjb2wudGN9LCR7XG4gICAgICAgIGNvbC5maXRcbiAgICAgICAgICA/IGBcbiAgICAgIGZpdDogdHJ1ZSxgXG4gICAgICAgICAgOiBcIlwiXG4gICAgICB9JHtcbiAgICAgICAgY29sLmFsaWduXG4gICAgICAgICAgPyBgXG4gICAgICBhbGlnbjogXCIke2NvbC5hbGlnbn1cIixgXG4gICAgICAgICAgOiBcIlwiXG4gICAgICB9XG4gICAgfWAsXG4gIClcbiAgLmpvaW4oXCIsXFxuXCIpfSxcbiAgICB7XG4gICAgICBsYWJlbDogU0QoXCJjb21tb24ubWFuYWdlXCIpLFxuICAgICAgZml0OiB0cnVlLFxuICAgICAgYWxpZ246IFwiY2VudGVyXCIsXG4gICAgICB0YzogKHJvdykgPT4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cInllbGxvd1wiXG4gICAgICAgICAgICBzaXplPVwieHNcIlxuICAgICAgICAgICAgaWNvbj17PEVkaXRJY29uIC8+fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gbmF2aWdhdGUoeyB0bzogXFxgXFwke1BBR0Uucm91dGV9L2Zvcm1cXGAsIHNlYXJjaDogeyBpZDogcm93LmlkIH0gfSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwicmVkXCJcbiAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICBpY29uPXs8VHJhc2hJY29uIC8+fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlRGVsZXRlQ2xpY2socm93LmlkKX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICksXG4gICAgfSxcbiAgXTtcblxuICAvLyDshKDtg50g7ZW465Ok65+sXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZUl0ZW0gPSAoaWQ6ICR7aWRUc1R5cGV9KSA9PiB7XG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gbmV3IFNldChzZWxlY3RlZEl0ZW1zKTtcbiAgICBpZiAobmV3U2VsZWN0aW9uLmhhcyhpZCkpIHtcbiAgICAgIG5ld1NlbGVjdGlvbi5kZWxldGUoaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTZWxlY3Rpb24uYWRkKGlkKTtcbiAgICB9XG4gICAgc2V0U2VsZWN0ZWRJdGVtcyhuZXdTZWxlY3Rpb24pO1xuICB9O1xuXG4gIGNvbnN0IGlzQWxsU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIChyb3dzPy5sZW5ndGggPz8gMCkgPiAwICYmIHJvd3MhLmV2ZXJ5KChyb3cpID0+IHNlbGVjdGVkSXRlbXMuaGFzKHJvdy5pZCkpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdEFsbCA9IChjaGVja2VkOiBib29sZWFuKSA9PiB7XG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIHNldFNlbGVjdGVkSXRlbXMobmV3IFNldChyb3dzPy5tYXAoKHJvdykgPT4gcm93LmlkKSA/PyBbXSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTZWxlY3RlZEl0ZW1zKG5ldyBTZXQoKSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIOyCreygnCDtlbjrk6Trn6xcbiAgY29uc3QgaGFuZGxlRGVsZXRlQ2xpY2sgPSAoaWQ6ICR7aWRUc1R5cGV9LCBuYW1lPzogc3RyaW5nKSA9PiB7XG4gICAgc2V0SXRlbVRvRGVsZXRlKHsgaWQsIG5hbWUgfSk7XG4gICAgc2V0RGVsZXRlRGlhbG9nT3Blbih0cnVlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDb25maXJtRGVsZXRlID0gKCkgPT4ge1xuICAgIGlmIChpdGVtVG9EZWxldGUpIHtcbiAgICAgICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLmRlbChbaXRlbVRvRGVsZXRlLmlkXSkudGhlbigoKSA9PiB7XG4gICAgICAgIHJlZmV0Y2goKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBzZXREZWxldGVEaWFsb2dPcGVuKGZhbHNlKTtcbiAgICBzZXRJdGVtVG9EZWxldGUobnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1heC13LVsxODAwcHhdIG14LWF1dG8gcC04XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS02IG1iLThcIj5cbiAgICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxMaXN0SWNvbiBjbGFzc05hbWU9XCJoLTUgdy01XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCBoLTVcIj57UEFHRS50aXRsZX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8Q2FyZCBjbGFzc05hbWU9XCJzaGFkb3ctc20gYm9yZGVyLWJvcmRlci80MCBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgIDxDYXJkSGVhZGVyIGNsYXNzTmFtZT1cInBiLTAgcHgtMCBwdC0wXCI+XG4gICAgICAgICAgICAgIHsvKiBGaWx0ZXJzICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWdyYXktMTAwIHB4LTYgcHktNCBzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIGZsZXgtd3JhcFwiPlxuJHtcbiAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcInNlYXJjaFwiKVxuICAgID8gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZH1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXske25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGRMYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwic2VhcmNoXCIpfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17U0QoXCJjb21tb24uc2VhcmNoVHlwZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy01MCBoLTggYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gXG4gICAgOiBcIlwiXG59XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleC0xIG1heC13LXhzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcImtleXdvcmRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e1NEKFwiY29tbW9uLnNlYXJjaFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggcHItOCB0ZXh0LXhzIGJnLXdoaXRlIGJvcmRlci1ncmF5LTMwMFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj17PFNlYXJjaEljb24gLz59XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMCB0b3AtMCBoLTggdy04IGhvdmVyOmJnLXRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1sLWF1dG8gZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtOCBweC00IGJnLXByaW1hcnkgaG92ZXI6YmctcHJpbWFyeS85MCB0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBuYXZpZ2F0ZSh7IHRvOiBcXGBcXCR7UEFHRS5yb3V0ZX0vZm9ybVxcYCB9KX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57U0QoXCJjb21tb24uY3JlYXRlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxTb25hbXVGaWx0ZXJQb3BvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgcnVsZXM9e2FwcGxpZWRSdWxlc31cbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZE1ldGE9e2V4dHJhY3RGaWVsZE1ldGFGcm9tU2NoZW1hKFxuICAgICAgICAgICAgICAgICAgICAgICAgJHtuYW1lcy5jYXBpdGFsfUJhc2VTY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICBTRCBhcyAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249ezxGaWx0ZXJJY29uIC8+fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0RmlsdGVyTW9kYWxPcGVuKHRydWUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC04XCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzXCI+e1NEKFwicmMuc29uYW11RmlsdGVyLnRpdGxlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHthcHBsaWVkUnVsZXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxCYWRnZSB2YXJpYW50PVwic2Vjb25kYXJ5XCIgY2xhc3NOYW1lPVwibWwtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthcHBsaWVkUnVsZXMubGVuZ3RofVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0JhZGdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9Tb25hbXVGaWx0ZXJQb3BvdmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIGZsZXgtd3JhcFwiPlxuJHtmaWx0ZXJDb2x1bW5zXG4gIC5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUgIT09IFwic2VhcmNoXCIgJiYgY29sLm5hbWUgIT09IFwib3JkZXJCeVwiKVxuICAubWFwKChjb2wpID0+IHtcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gY29uZmlnLmVudW1JZOqwgCDsnojsnLzrqbQg7Jqw7ISgIOyCrOyaqSwg7JeG7Jy866m0IGdldEVudW1JbmZvRnJvbUNvbE5hbWUg7Iuc64+EXG4gICAgICAgIGNvbnN0IGVudW1JZCA9XG4gICAgICAgICAgY29sLmNvbmZpZyAmJiBcImVudW1JZFwiIGluIGNvbC5jb25maWdcbiAgICAgICAgICAgID8gKGNvbC5jb25maWcgYXMgeyBlbnVtSWQ6IHN0cmluZyB9KS5lbnVtSWRcbiAgICAgICAgICAgIDogZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpLmlkO1xuICAgICAgICByZXR1cm4gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGtleT17XFxgJHtjb2wubmFtZX0tXFwke2xpc3RQYXJhbXMuJHtjb2wubmFtZX19XFxgfVxuICAgICAgICAgICAgICAgICAgICBlbnVtPXske2VudW1JZH19XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscz17JHtlbnVtSWR9TGFiZWx9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcIiR7Y29sLm5hbWV9XCIpfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiR7Y29sLmxhYmVsfVwiXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyYWJsZVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCBiZy13aGl0ZSBib3JkZXItZ3JheS0zMDAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAvPmA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZLIO2VhOuTnCAoSWRBc3luY1NlbGVjdClcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIHJldHVybiBgICAgICAgICAgICAgICAgICAgPElkQXN5bmNTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnPXske3JlbFByb3Aud2l0aH1Bc3luY0lkQ29uZmlnfVxuICAgICAgICAgICAgICAgICAgICBzdWJzZXQ9XCJBXCJcbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwiJHtjb2wubmFtZX1cIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiJHtjb2wubGFiZWwgPz8gcmVsUHJvcC53aXRofVwiXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyYWJsZVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH0pXG4gIC5maWx0ZXIoQm9vbGVhbilcbiAgLmpvaW4oXCJcXG5cIil9XG4ke1xuICBmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKVxuICAgID8gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5fVxuICAgICAgICAgICAgICAgICAgICBsYWJlbHM9eyR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5TGFiZWx9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcIm9yZGVyQnlcIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtTRChcImNvbW1vbi5zb3J0XCIpfVxuICAgICAgICAgICAgICAgICAgICB0ZXh0UHJlZml4PXtcXGBcXCR7U0QoXCJjb21tb24uc29ydFwiKX06IFxcYH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy01MCBoLTggYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gXG4gICAgOiBcIlwiXG59XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPntTRChcImNvbW1vbi5yZXN1bHRzXCIpKHRvdGFsID8/IDApfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0NhcmRIZWFkZXI+XG5cbiAgICAgICAgICAgIDxDYXJkQ29udGVudCBjbGFzc05hbWU9XCJweC02IHBiLTYgcHQtNiBiZy13aGl0ZVwiPlxuICAgICAgICAgICAgICB7LyogVGFibGUgKi99XG4gICAgICAgICAgICAgIDxUYWJsZT5cbiAgICAgICAgICAgICAgICA8VGFibGVIZWFkZXI+XG4gICAgICAgICAgICAgICAgICA8VGFibGVSb3cgY2xhc3NOYW1lPVwiaG92ZXI6YmctdHJhbnNwYXJlbnQgYmctZ3JheS0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPFRhYmxlSGVhZCBjbGFzc05hbWU9XCJoLTkgdGV4dC14cyB3LVs0MHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17aXNBbGxTZWxlY3RlZCgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17aGFuZGxlU2VsZWN0QWxsfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvVGFibGVIZWFkPlxuICAgICAgICAgICAgICAgICAgICB7Y29sdW1ucy5tYXAoKGNvbCwgaWR4KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPFRhYmxlSGVhZCBrZXk9e2lkeH0gZml0PXtjb2wuZml0fSBhbGlnbj17Y29sLmFsaWdufT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2wubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UYWJsZUhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9UYWJsZVJvdz5cbiAgICAgICAgICAgICAgICA8L1RhYmxlSGVhZGVyPlxuICAgICAgICAgICAgICAgIDxUYWJsZUJvZHk+XG4gICAgICAgICAgICAgICAgICB7IWlzTG9hZGluZyAmJiByb3dzICYmIHJvd3MubWFwKChyb3cpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPEZyYWdtZW50IGtleT17cm93LmlkfT5cbiAgICAgICAgICAgICAgICAgICAgICA8VGFibGVSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGFibGVDZWxsIGNsYXNzTmFtZT1cInB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWRJdGVtcy5oYXMocm93LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsoKSA9PiBoYW5kbGVUb2dnbGVJdGVtKHJvdy5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2x1bW5zLm1hcCgoY29sLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFRhYmxlQ2VsbCBrZXk9e2lkeH0gZml0PXtjb2wuZml0fSBhbGlnbj17Y29sLmFsaWdufSBjbGFzc05hbWU9XCJweS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvbC50Yyhyb3cpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVSb3c+XG4gICAgICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L1RhYmxlQm9keT5cbiAgICAgICAgICAgICAgPC9UYWJsZT5cblxuICAgICAgICAgICAgICB7LyogUGFnaW5hdGlvbiAqL31cbiAgICAgICAgICAgICAgPFBhZ2luYXRpb25cbiAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCJwYWdlXCIpfVxuICAgICAgICAgICAgICAgIHRvdGFsPXt0b3RhbCA/PyAwfVxuICAgICAgICAgICAgICAgIGl0ZW1zUGVyUGFnZT17bGlzdFBhcmFtcy5udW0gPz8gMTB9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L0NhcmRDb250ZW50PlxuICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIERlbGV0ZSBEaWFsb2cgKi99XG4gICAgICA8QWxlcnREaWFsb2cgb3Blbj17ZGVsZXRlRGlhbG9nT3Blbn0gb25PcGVuQ2hhbmdlPXtzZXREZWxldGVEaWFsb2dPcGVufT5cbiAgICAgICAgPEFsZXJ0RGlhbG9nQ29udGVudD5cbiAgICAgICAgICA8QWxlcnREaWFsb2dIZWFkZXI+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dUaXRsZT57U0QoXCJkZWxldGUuY29uZmlybS50aXRsZVwiKX08L0FsZXJ0RGlhbG9nVGl0bGU+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dEZXNjcmlwdGlvbj57U0QoXCJkZWxldGUuY29uZmlybS5kZXNjcmlwdGlvblwiKX08L0FsZXJ0RGlhbG9nRGVzY3JpcHRpb24+XG4gICAgICAgICAgPC9BbGVydERpYWxvZ0hlYWRlcj5cbiAgICAgICAgICA8QWxlcnREaWFsb2dGb290ZXI+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dDYW5jZWw+e1NEKFwiY29tbW9uLmNhbmNlbFwiKX08L0FsZXJ0RGlhbG9nQ2FuY2VsPlxuICAgICAgICAgICAgPEFsZXJ0RGlhbG9nQWN0aW9uIG9uQ2xpY2s9e2hhbmRsZUNvbmZpcm1EZWxldGV9PlxuICAgICAgICAgICAgICB7U0QoXCJjb21tb24uZGVsZXRlXCIpfVxuICAgICAgICAgICAgPC9BbGVydERpYWxvZ0FjdGlvbj5cbiAgICAgICAgICA8L0FsZXJ0RGlhbG9nRm9vdGVyPlxuICAgICAgICA8L0FsZXJ0RGlhbG9nQ29udGVudD5cbiAgICAgIDwvQWxlcnREaWFsb2c+XG5cbiAgICAgIHsvKiBTb25hbXUgRmlsdGVyIE1vZGFsICovfVxuICAgICAgPFNvbmFtdUZpbHRlck1vZGFsXG4gICAgICAgIGJhc2VTY2hlbWE9eyR7bmFtZXMuY2FwaXRhbH1CYXNlU2NoZW1hfVxuICAgICAgICBvcGVuPXtmaWx0ZXJNb2RhbE9wZW59XG4gICAgICAgIG9uT3BlbkNoYW5nZT17c2V0RmlsdGVyTW9kYWxPcGVufVxuICAgICAgICBpbml0aWFsUnVsZXM9e2FwcGxpZWRSdWxlc31cbiAgICAgICAgb25BcHBseT17KGZpbHRlcnMsIHJ1bGVzKSA9PiB7XG4gICAgICAgICAgc2V0TGlzdFBhcmFtcyh7IC4uLmxpc3RQYXJhbXMsIHNvbmFtdUZpbHRlcjogZmlsdGVycywgcGFnZTogMSB9KTtcbiAgICAgICAgICBzZXRBcHBsaWVkUnVsZXMocnVsZXMpO1xuICAgICAgICB9fVxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiAgICAgIGAudHJpbSgpLFxuICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgICBwcmVUZW1wbGF0ZXMsXG4gICAgfTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztxQkFJNEQ7Y0FPeEM7ZUFFbUI7QUFFdkMsSUFBYSxzQkFBYixjQUF5QyxTQUFTO0NBQ2hELGNBQWM7QUFDWixRQUFNLFlBQVk7O0NBR3BCLGlCQUFpQixPQUEwQjtBQUN6QyxTQUFPO0dBQ0wsUUFBUTtHQUNSLE1BQU0sR0FBRyxNQUFNLFNBQVM7R0FDekI7O0NBR0gsQUFBUyxzQkFBdUM7QUFDOUMsU0FBTyxDQUFDLHFCQUFxQixhQUFhOztDQUc1QyxPQUFPLE1BQWMsS0FBYSxhQUFzQixNQUFNLFlBQW9CLElBQUk7QUFDcEYsU0FBTyxvQkFBb0IsSUFBSSxHQUFHLGFBQWEsZ0JBQWdCLEtBQzdELFlBQVksaUJBQWlCLFVBQVUsT0FBTyxHQUMvQyxHQUFHLEtBQUs7O0NBR1gsYUFDRSxVQUNBLEtBQ0EsT0FDQSxZQUFvQixPQUNwQixjQUF1QixPQUNmO0VBRVIsSUFBSUE7QUFDSixNQUFJLGFBQWE7QUFDZixhQUFVO2FBQ0QsSUFBSSxLQUFLLFNBQVMsSUFBSSxFQUFFO0dBRWpDLE1BQU0sUUFBUSxJQUFJLEtBQUssTUFBTSxJQUFJO0FBQ2pDLGFBQVUsR0FBRyxVQUFVLEdBQUcsTUFBTSxLQUFLLEtBQUs7U0FDckM7QUFDTCxhQUFVLEdBQUcsVUFBVSxHQUFHLElBQUk7O0FBR2hDLFVBQVEsSUFBSSxZQUFaO0dBQ0UsS0FBSztHQUNMLEtBQUs7R0FDTCxLQUFLO0dBQ0wsS0FBSyxZQUNILFFBQU8sTUFBTSxRQUFRO0dBQ3ZCLEtBQUs7R0FDTCxLQUFLLGdCQUFnQjtBQUNuQixRQUFJO0tBQ0YsTUFBTSxX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
552
+
553
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld19saXN0LnRlbXBsYXRlLmpzIiwibmFtZXMiOlsieiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvdmlld19saXN0LnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBmbGF0IH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBSZW5kZXJpbmdOb2RlLCB0eXBlIFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSxcbiAgZ2V0UmVsYXRpb25OYW1lRnJvbUNvbHVtbk5hbWUsXG4gIGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lLFxufSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHsgdHlwZSBSZW5kZXJlZFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVfX3ZpZXdfbGlzdCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJ2aWV3X2xpc3RcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IFwid2ViL3NyYy9yb3V0ZXMvYWRtaW5cIixcbiAgICAgIHBhdGg6IGAke25hbWVzLmZzUGx1cmFsfS9pbmRleC50c3hgLFxuICAgIH07XG4gIH1cblxuICBvdmVycmlkZSBnZXRSZXF1aXJlZERpY3RLZXlzKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgcmV0dXJuIFtcImVudGl0eS5saXN0TWFuYWdlXCIsIFwiY29tbW9uLmFsbFwiXTtcbiAgfVxuXG4gIHdyYXBUYyhib2R5OiBzdHJpbmcsIGtleTogc3RyaW5nLCBjb2xsYXBzaW5nOiBib29sZWFuID0gdHJ1ZSwgY2xhc3NOYW1lOiBzdHJpbmcgPSBcIlwiKSB7XG4gICAgcmV0dXJuIGA8VGFibGUuQ2VsbCBrZXk9XCIke2tleX1cIiR7Y29sbGFwc2luZyA/IFwiIGNvbGxhcHNpbmdcIiA6IFwiXCJ9JHtcbiAgICAgIGNsYXNzTmFtZSA/IGAgY2xhc3NOYW1lPXtcXGAke2NsYXNzTmFtZX1cXGB9YCA6IFwiXCJcbiAgICB9PiR7Ym9keX08L1RhYmxlLkNlbGw+YDtcbiAgfVxuXG4gIHJlbmRlckNvbHVtbihcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIGNvbDogUmVuZGVyaW5nTm9kZSxcbiAgICBuYW1lczogRW50aXR5TmFtZXNSZWNvcmQsXG4gICAgcGFyZW50T2JqOiBzdHJpbmcgPSBcInJvd1wiLFxuICAgIHdpdGhvdXROYW1lOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZyB7XG4gICAgLy8g7KSR7LKpIOqyveuhnCDsspjrpqwgKOyYiDogXCJ1c2VyLm5hbWVcIiAtPiBcInJvdy51c2VyPy5uYW1lXCIpXG4gICAgbGV0IGNvbE5hbWU6IHN0cmluZztcbiAgICBpZiAod2l0aG91dE5hbWUpIHtcbiAgICAgIGNvbE5hbWUgPSBwYXJlbnRPYmo7XG4gICAgfSBlbHNlIGlmIChjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgIC8vIOykkeyyqSDqsr3roZzripQgb3B0aW9uYWwgY2hhaW5pbmfsnLzroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGNvbC5uYW1lLnNwbGl0KFwiLlwiKTtcbiAgICAgIGNvbE5hbWUgPSBgJHtwYXJlbnRPYmp9LiR7cGFydHMuam9pbihcIj8uXCIpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbE5hbWUgPSBgJHtwYXJlbnRPYmp9LiR7Y29sLm5hbWV9YDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGNvbC5yZW5kZXJUeXBlKSB7XG4gICAgICBjYXNlIFwic3RyaW5nLXBsYWluXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWRhdGVcIjpcbiAgICAgIGNhc2UgXCJudW1iZXItaWRcIjpcbiAgICAgIGNhc2UgXCJzdHJpbmctaWRcIjpcbiAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICBjYXNlIFwibnVtYmVyLWZrX2lkXCI6XG4gICAgICBjYXNlIFwic3RyaW5nLWZrX2lkXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBiYXNlTmFtZSA9IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKVxuICAgICAgICAgICAgPyAoY29sLm5hbWUuc3BsaXQoXCIuXCIpLnBvcCgpID8/IGNvbC5uYW1lKS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpXG4gICAgICAgICAgICA6IGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIik7XG4gICAgICAgICAgY29uc3QgcmVsUHJvcEZrID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGJhc2VOYW1lKTtcbiAgICAgICAgICByZXR1cm4gYDw+JHtyZWxQcm9wRmsud2l0aH0jeyR7Y29sTmFtZX19PC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgXCJkYXRldGltZVwiOlxuICAgICAgICBpZiAoY29sLm51bGxhYmxlIHx8IGNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+eyR7Y29sTmFtZX0gPyBkYXRldGltZUYoJHtjb2xOYW1lfSkgOiAnLSd9PC9zcGFuPmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGA8c3Bhbj57ZGF0ZXRpbWVGKCR7Y29sTmFtZX0pfTwvc3Bhbj5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwic3RyaW5nLWRhdGV0aW1lXCI6XG4gICAgICAgIGlmIChjb2wubnVsbGFibGUgfHwgY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgcmV0dXJuIGA8c3Bhbj57JHtjb2xOYW1lfSA/IGRhdGVGKCR7Y29sTmFtZX0pIDogJy0nfTwvc3Bhbj5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBgPHNwYW4+e2RhdGVGKCR7Y29sTmFtZX0pfTwvc3Bhbj5gO1xuICAgICAgICB9XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sTmFtZX0gPyA8QmFkZ2UgdmFyaWFudD1cImRlZmF1bHRcIj5PPC9CYWRnZT4gOiA8QmFkZ2UgdmFyaWFudD1cInNlY29uZGFyeVwiPlg8L0JhZGdlPn08Lz5gO1xuICAgICAgY2FzZSBcImVudW1zXCI6IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkOiBlbnVtSWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lKTtcbiAgICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gJiYgYCA6IFwiXCJ9JHtlbnVtSWR9TGFiZWxbJHtjb2xOYW1lfV19PC8+YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGA8Pnske2NvbE5hbWV9fTwvPmA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgXCJhcnJheS1pbWFnZXNcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTFcIj57ICR7Y29sTmFtZX0/Lm1hcCgociwgaSkgPT4gJHtcbiAgICAgICAgICBjb2wubnVsbGFibGUgPyBgciAmJiBgIDogXCJcIlxuICAgICAgICB9PGltZyBrZXk9e2l9IHNyYz17cn0gYWx0PXtcXGAke2NvbC5sYWJlbCA/PyBjb2wubmFtZX0gXFwke2kgKyAxfVxcYH0gY2xhc3NOYW1lPVwiaC04IHctOCBvYmplY3QtY292ZXIgcm91bmRlZFwiIC8+KSB9PC9kaXY+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGVcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+eyR7Y29sTmFtZX0gPyA8aW1nIHNyYz17JHtjb2xOYW1lfS51cmx9IGFsdD17JHtjb2xOYW1lfS5uYW1lfSBjbGFzc05hbWU9XCJoLTggdy04IG9iamVjdC1jb3ZlciByb3VuZGVkXCIgLz4gOiAnLSd9PC9kaXY+YDtcbiAgICAgIGNhc2UgXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTFcIj57ICR7Y29sTmFtZX0/Lm1hcCgociwgaSkgPT4gJHtcbiAgICAgICAgICBjb2wubnVsbGFibGUgPyBgciAmJiBgIDogXCJcIlxuICAgICAgICB9PGltZyBrZXk9e2l9IHNyYz17ci51cmx9IGFsdD17XFxgJHtjb2wubGFiZWwgPz8gY29sLm5hbWV9IFxcJHtpICsgMX1cXGB9IGNsYXNzTmFtZT1cImgtOCB3LTggb2JqZWN0LWNvdmVyIHJvdW5kZWRcIiAvPikgfTwvZGl2PmA7XG4gICAgICBjYXNlIFwibnVtYmVyLXBsYWluXCI6XG4gICAgICAgIHJldHVybiBgPD57JHtjb2wubnVsbGFibGUgfHwgY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpID8gYCR7Y29sTmFtZX0gJiYgYCA6IFwiXCJ9bnVtRigke2NvbE5hbWV9KX08Lz5gO1xuICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICByZXR1cm4gYDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57JHtjb2wubnVsbGFibGUgPyBgJHtjb2xOYW1lfSA/IGAgOiBcIlwifUpTT04uc3RyaW5naWZ5KCR7Y29sTmFtZX0pJHtjb2wubnVsbGFibGUgPyBgIDogJy0nYCA6IFwiXCJ9fTwvc3Bhbj5gO1xuICAgICAgY2FzZSBcIm9iamVjdC1waWNrXCI6IHtcbiAgICAgICAgY29uc3QgcGlja2VkQ2hpbGQgPSBjb2wuY2hpbGRyZW4/LmZpbmQoKGNoaWxkKSA9PiBjaGlsZC5uYW1lID09PSBjb2wuY29uZmlnPy5waWNrZWQpO1xuICAgICAgICBpZiAoIXBpY2tlZENoaWxkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBvYmplY3QtcGljayDshKDtg50g7Iuk7YyoICjsmKTruIzsoJ3tirg6ICR7Y29sLm5hbWV9KWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbihcbiAgICAgICAgICBlbnRpdHlJZCxcbiAgICAgICAgICBwaWNrZWRDaGlsZCxcbiAgICAgICAgICBuYW1lcyxcbiAgICAgICAgICBgJHtjb2xOYW1lfSR7Y29sLm51bGxhYmxlID8gXCI/XCIgOiBcIlwifWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgcmV0dXJuIGA8PnsgLyogYXJyYXkgJHtjb2xOYW1lfSAqLyB9PC8+YDtcbiAgICAgIGNhc2UgXCJ2ZWN0b3JcIjpcbiAgICAgICAgLy8gdmVjdG9yIO2DgOyeheydgCDssKjsm5Ag7IiY66eMIO2RnOyLnCAo7Iuk7KCcIOuNsOydtO2EsOuKlCDrhIjrrLQg6rmAKVxuICAgICAgICByZXR1cm4gYDw+eyR7Y29sLm51bGxhYmxlID8gYCR7Y29sTmFtZX0gPyBgIDogXCJcIn1bVmVjdG9yOiB7JHtjb2xOYW1lfSR7Y29sLm51bGxhYmxlID8gXCJcIiA6IFwiID8/IFtdXCJ9Lmxlbmd0aH1kXSR7Y29sLm51bGxhYmxlID8gXCIgOiAnLSdcIiA6IFwiXCJ9fTwvPmA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOugjOuNlCDrtojqsIAg7Lus65+8ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyQ29sdW1uSW1wb3J0KFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgY29sOiBSZW5kZXJpbmdOb2RlLFxuICAgIG5hbWVzOiBFbnRpdHlOYW1lc1JlY29yZCxcbiAgKTogKHN0cmluZyB8IG51bGwpW10ge1xuICAgIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJlbnVtc1wiKSB7XG4gICAgICBjb25zdCB7IGlkOiBlbnVtSWQgfSA9IGdldEVudW1JbmZvRnJvbUNvbE5hbWUobmFtZXMuY2FwaXRhbCwgY29sLm5hbWUpO1xuICAgICAgcmV0dXJuIFtgaW1wb3J0IHsgJHtlbnVtSWR9TGFiZWwgfSBmcm9tICdAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWQnO2BdO1xuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoY29sLmNoaWxkcmVuID8/IFtdKS5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgICAgZW50aXR5SWQgPSByZWxQcm9wLndpdGg7XG4gICAgICAgICAgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQ29sdW1uSW1wb3J0KGVudGl0eUlkLCBjaGlsZCwgbmFtZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZsYXQocmVzdWx0KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW251bGxdO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiYXJyYXlcIikge1xuICAgICAgaWYgKCFjb2wuZWxlbWVudCkgcmV0dXJuIFtudWxsXTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckNvbHVtbkltcG9ydChlbnRpdHlJZCwgY29sLmVsZW1lbnQsIG5hbWVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW251bGxdO1xuICB9XG5cbiAgcmVuZGVyRmlsdGVySW1wb3J0KGVudGl0eUlkOiBzdHJpbmcsIGNvbDogUmVuZGVyaW5nTm9kZSwgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgaWYgKGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSB7XG4gICAgICByZXR1cm4gYGltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZWFyY2hJbnB1dCB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHtuYW1lcy5mc30vJHtuYW1lcy5jYXBpdGFsfVNlYXJjaElucHV0XCI7YDtcbiAgICB9IGVsc2UgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGlmIChjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50SWQgPSBgJHtuYW1lcy5jYXBpdGFsfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShjb2wubmFtZSl9U2VsZWN0YDtcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHtuYW1lcy5mc30vJHtjb21wb25lbnRJZH1cIjtgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IGlkLCB0YXJnZXRFbnRpdHlOYW1lczogdGFyZ2V0TUROYW1lcyB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShcbiAgICAgICAgICAgIGVudGl0eUlkLFxuICAgICAgICAgICAgY29sLm5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IGAke2lkfVNlbGVjdGA7XG4gICAgICAgICAgcmV0dXJuIGBpbXBvcnQgeyAke2NvbXBvbmVudElkfSB9IGZyb20gXCJAL2NvbXBvbmVudHMvJHt0YXJnZXRNRE5hbWVzLmZzfS8ke2NvbXBvbmVudElkfVwiO2A7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0TmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKHJlbFByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkID0gYCR7cmVsUHJvcC53aXRofUlkQXN5bmNTZWxlY3RgO1xuICAgICAgICByZXR1cm4gYGltcG9ydCB7ICR7Y29tcG9uZW50SWR9IH0gZnJvbSBcIkAvY29tcG9uZW50cy8ke3RhcmdldE5hbWVzLmZzfS8ke2NvbXBvbmVudElkfVwiO2A7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg66CM642UIOu2iOqwgOuKpe2VnCDtlYTthLAg7J6E7Y+s7Yq4ICR7Y29sLm5hbWV9ICR7Y29sLnJlbmRlclR5cGV9YCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyRmlsdGVyKGVudGl0eUlkOiBzdHJpbmcsIGNvbDogUmVuZGVyaW5nTm9kZSwgbmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgaWYgKGNvbC5uYW1lID09PSBcInNlYXJjaFwiKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBjb25zdCBpc0NsZWFyYWJsZSA9IGNvbC5vcHRpb25hbCA9PT0gdHJ1ZSAmJiBjb2wubmFtZSAhPT0gXCJvcmRlckJ5XCI7XG4gICAgbGV0IGNvbXBvbmVudElkOiBzdHJpbmc7XG4gICAgaWYgKGNvbC5yZW5kZXJUeXBlID09PSBcImVudW1zXCIpIHtcbiAgICAgIGlmIChjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpIHtcbiAgICAgICAgY29tcG9uZW50SWQgPSBgJHtuYW1lcy5jYXBpdGFsfSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShjb2wubmFtZSl9U2VsZWN0YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgeyBpZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGNvbXBvbmVudElkID0gYCR7aWR9U2VsZWN0YDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBgPCR7Y29tcG9uZW50SWR9IHsuLi5yZWdpc3RlcignJHtjb2wubmFtZX0nKX0gJHtpc0NsZWFyYWJsZSA/IFwiY2xlYXJhYmxlXCIgOiBcIlwifSAvPmA7XG4gICAgfSBlbHNlIGlmIChjb2wucmVuZGVyVHlwZSA9PT0gXCJudW1iZXItZmtfaWRcIiB8fCBjb2wucmVuZGVyVHlwZSA9PT0gXCJzdHJpbmctZmtfaWRcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVsUHJvcCA9IGdldFJlbGF0aW9uUHJvcEZyb21Db2xOYW1lKGVudGl0eUlkLCBjb2wubmFtZS5yZXBsYWNlKFwiX2lkXCIsIFwiXCIpKTtcbiAgICAgICAgY29tcG9uZW50SWQgPSBgJHtyZWxQcm9wLndpdGh9SWRBc3luY1NlbGVjdGA7XG4gICAgICAgIHJldHVybiBgPCR7Y29tcG9uZW50SWR9IHsuLi5yZWdpc3RlcignJHtjb2wubmFtZX0nKX0gJHtcbiAgICAgICAgICBpc0NsZWFyYWJsZSA/IFwiY2xlYXJhYmxlXCIgOiBcIlwiXG4gICAgICAgIH0gc3Vic2V0PVwiQVwiIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDroIzrjZQg67aI6rCA64ql7ZWcIO2VhO2EsCDsnoTtj6ztirggJHtjb2wubmFtZX0gJHtjb2wucmVuZGVyVHlwZX1gKTtcbiAgICB9XG4gIH1cblxuICBnZXREZWZhdWx0KGNvbHVtbnM6IFJlbmRlcmluZ05vZGVbXSk6IHtcbiAgICBvcmRlckJ5OiBzdHJpbmc7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgaGFzU2VhcmNoOiBib29sZWFuO1xuICAgIGhhc09yZGVyQnk6IGJvb2xlYW47XG4gIH0ge1xuICAgIGNvbnN0IGRlZiA9IHtcbiAgICAgIG9yZGVyQnk6IFwiXCIsXG4gICAgICBzZWFyY2g6IFwiXCIsXG4gICAgICBoYXNTZWFyY2g6IGZhbHNlLFxuICAgICAgaGFzT3JkZXJCeTogZmFsc2UsXG4gICAgfTtcbiAgICBjb25zdCBvcmRlckJ5Wm9kVHlwZSA9IGNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJvcmRlckJ5XCIpPy56b2RUeXBlO1xuICAgIGlmIChvcmRlckJ5Wm9kVHlwZSAmJiBvcmRlckJ5Wm9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgICAgZGVmLm9yZGVyQnkgPSBPYmplY3Qua2V5cyhvcmRlckJ5Wm9kVHlwZS5lbnVtKVswXTtcbiAgICAgIGRlZi5oYXNPcmRlckJ5ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgc2VhcmNoWm9kVHlwZSA9IGNvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIik/LnpvZFR5cGU7XG4gICAgaWYgKHNlYXJjaFpvZFR5cGUgJiYgc2VhcmNoWm9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgICAgZGVmLnNlYXJjaCA9IE9iamVjdC5rZXlzKHNlYXJjaFpvZFR5cGUuZW51bSlbMF07XG4gICAgICBkZWYuaGFzU2VhcmNoID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGRlZjtcbiAgfVxuXG4gIGFzeW5jIHJlbmRlcih7IGVudGl0eUlkIH06IFRlbXBsYXRlT3B0aW9uc1tcInZpZXdfbGlzdFwiXSkge1xuICAgIGNvbnN0IHsgZ2V0Q29sdW1uc05vZGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS1jb252ZXJ0ZXJcIik7XG4gICAgY29uc3QgeyBnZXRab2RUeXBlQnlJZCwgem9kVHlwZVRvUmVuZGVyaW5nTm9kZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vem9kLWNvbnZlcnRlclwiKTtcblxuICAgIGNvbnN0IGNvbHVtbnNOb2RlID0gYXdhaXQgZ2V0Q29sdW1uc05vZGUoZW50aXR5SWQsIFwiQVwiKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zWm9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKGAke2VudGl0eUlkfUxpc3RQYXJhbXNgKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zTm9kZSA9IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUobGlzdFBhcmFtc1pvZFR5cGUpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAvLyBQSyDtg4DsnoUg6rCQ7KeAXG4gICAgY29uc3QgcGtUeXBlID0gZW50aXR5LmdldFBrVHlwZSgpO1xuICAgIGNvbnN0IGlkVHNUeXBlID0gcGtUeXBlID09PSBcInN0cmluZ1wiIHx8IHBrVHlwZSA9PT0gXCJ1dWlkXCIgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcblxuICAgIC8vIOyLpOygnCDrpqzsiqTtirgg7Lus65+8XG4gICAgY29uc3QgY29sdW1ucyA9IChjb2x1bW5zTm9kZS5jaGlsZHJlbiBhcyBSZW5kZXJpbmdOb2RlW10pXG5cbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gKGEubmFtZSA9PT0gXCJpZFwiID8gLTEgOiBiLm5hbWUgPT09IFwiaWRcIiA/IDEgOiAwKSlcbiAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICBjb25zdCByZW5kZXJlZCA9IHRoaXMucmVuZGVyQ29sdW1uKGVudGl0eUlkLCBjb2wsIG5hbWVzKTtcblxuICAgICAgICAvLyDrnbzrsqgg7IOd7ISxOiBjb21tb24g7ZWE65OcKGNyZWF0ZWRfYXQp64qUIFNEKFwiY29tbW9uLntmaWVsZH1cIiksIGVudGl0eSDtlYTrk5zripQgU0QoXCJlbnRpdHkue0VudGl0eX0ue2ZpZWxkfVwiKVxuICAgICAgICBsZXQgbGFiZWw6IHN0cmluZztcbiAgICAgICAgaWYgKGNvbC5uYW1lID09PSBcImlkXCIpIHtcbiAgICAgICAgICBsYWJlbCA9ICdcIklEXCInO1xuICAgICAgICB9IGVsc2UgaWYgKFtcImNyZWF0ZWRfYXRcIl0uaW5jbHVkZXMoY29sLm5hbWUpKSB7XG4gICAgICAgICAgLy8gY2FtZWxDYXNl66GcIOuzgO2ZmCAoY3JlYXRlZF9hdCAtPiBjcmVhdGVkQXQpXG4gICAgICAgICAgY29uc3QgY2FtZWxOYW1lID0gY29sLm5hbWUucmVwbGFjZSgvXyhbYS16XSkvZywgKF8sIGNoYXIpID0+IGNoYXIudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgbGFiZWwgPSBgU0QoXCJjb21tb24uJHtjYW1lbE5hbWV9XCIpYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBsYWJlbE5hbWUgPSBnZXRSZWxhdGlvbk5hbWVGcm9tQ29sdW1uTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGxhYmVsID0gYFNEKFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH0uJHtsYWJlbE5hbWV9XCIpYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogY29sLm5hbWUsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgdGM6IGAocm93KSA9PiAke3JlbmRlcmVkfWAsXG4gICAgICAgICAgZml0OlxuICAgICAgICAgICAgY29sLm5hbWUgPT09IFwiaWRcIiB8fFxuICAgICAgICAgICAgY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWlkXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcImRhdGV0aW1lXCIgfHxcbiAgICAgICAgICAgIGNvbC5yZW5kZXJUeXBlID09PSBcInN0cmluZy1kYXRldGltZVwiLFxuICAgICAgICAgIGFsaWduOiBjb2wubmFtZSA9PT0gXCJpZFwiIHx8IGNvbC5yZW5kZXJUeXBlID09PSBcIm51bWJlci1pZFwiID8gXCJjZW50ZXJcIiA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgLy8g7ZWE7YSwIOy7rOufvFxuICAgIGNvbnN0IGZpbHRlckNvbHVtbnMgPSAobGlzdFBhcmFtc05vZGUuY2hpbGRyZW4gYXMgUmVuZGVyaW5nTm9kZVtdKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGNvbCkgPT5cbiAgICAgICAgICBjb2wubmFtZSAhPT0gXCJpZFwiICYmXG4gICAgICAgICAgY29sLm5hbWUgIT09IFwicXVlcnlNb2RlXCIgJiZcbiAgICAgICAgICBbXCJlbnVtc1wiLCBcIm51bWJlci1pZFwiLCBcIm51bWJlci1ma19pZFwiLCBcInN0cmluZy1ma19pZFwiXS5pbmNsdWRlcyhjb2wucmVuZGVyVHlwZSksXG4gICAgICApXG4gICAgICAvLyBvcmRlckJ56rCAIOqwgOyepSDrkqTroZwg7Jik6rKMIOyInOyEnCDsobDsoJVcbiAgICAgIC50b1NvcnRlZCgoYSkgPT4ge1xuICAgICAgICByZXR1cm4gYS5uYW1lID09PSBcIm9yZGVyQnlcIiA/IDEgOiAtMTtcbiAgICAgIH0pO1xuXG4gICAgLy8g7ZWE7YSwIOy7rOufvOydhCDtlITrpqwg7YWc7ZSM66a/7Jy866GcIOyEpOyglVxuICAgIGNvbnN0IHByZVRlbXBsYXRlczogUmVuZGVyZWRUZW1wbGF0ZVtcInByZVRlbXBsYXRlc1wiXSA9IFtdO1xuXG4gICAgLy8g7Lus65+87JeQ7IScIOyCrOyaqe2VmOuKlCBlbnVt65OkIOyImOynkVxuICAgIGNvbnN0IGNvbHVtbkVudW1zOiBzdHJpbmdbXSA9IFtdO1xuICAgIChjb2x1bW5zTm9kZS5jaGlsZHJlbiA/PyBbXSkuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgaWQ6IGVudW1JZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgIGNvbHVtbkVudW1zLnB1c2goZW51bUlkKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8g65SU7Y+07Yq4IO2MjOudvOuvuO2EsFxuICAgIC8vIGNvbnN0IGRlZiA9IHRoaXMuZ2V0RGVmYXVsdChmaWx0ZXJDb2x1bW5zKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgobmFtZXMpLFxuICAgICAgYm9keTogYFxuaW1wb3J0IHsgdXNlU3RhdGUsIEZyYWdtZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBjcmVhdGVGaWxlUm91dGUsIHVzZU5hdmlnYXRlIH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1yb3V0ZXJcIjtcblxuaW1wb3J0IHsgQ2FyZCwgQ2FyZENvbnRlbnQsIENhcmRIZWFkZXIgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBCYWRnZSB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IFBhZ2luYXRpb24sIFRhYmxlLCBUYWJsZUJvZHksIFRhYmxlQ2VsbCwgdHlwZSBUYWJsZUNvbCwgVGFibGVIZWFkLCBUYWJsZUhlYWRlciwgVGFibGVSb3cgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBFbnVtU2VsZWN0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgQWxlcnREaWFsb2csIEFsZXJ0RGlhbG9nQWN0aW9uLCBBbGVydERpYWxvZ0NhbmNlbCwgQWxlcnREaWFsb2dDb250ZW50LCBBbGVydERpYWxvZ0Rlc2NyaXB0aW9uLCBBbGVydERpYWxvZ0Zvb3RlciwgQWxlcnREaWFsb2dIZWFkZXIsIEFsZXJ0RGlhbG9nVGl0bGUgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gXCJAc29uYW11LWtpdC9yZWFjdC1jb21wb25lbnRzL2NvbXBvbmVudHNcIjtcbmltcG9ydCB7IENoZWNrYm94IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgU29uYW11RmlsdGVyTW9kYWwsIFNvbmFtdUZpbHRlclBvcG92ZXIsIGV4dHJhY3RGaWVsZE1ldGFGcm9tU2NoZW1hLCB0eXBlIFJ1bGUgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9jb21wb25lbnRzXCI7XG5cbmltcG9ydCB7IHVzZUxpc3RQYXJhbXMsIG51bUYsIGRhdGVGLCBkYXRldGltZUYgfSBmcm9tIFwiQHNvbmFtdS1raXQvcmVhY3QtY29tcG9uZW50cy9saWJcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TdWJzZXRBLCAke25hbWVzLmNhcGl0YWx9QmFzZVNjaGVtYSB9IGZyb20gXCJAL3NlcnZpY2VzL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7ICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlIH0gZnJvbSBcIkAvc2VydmljZXMvc2VydmljZXMuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyAke25hbWVzLmNhcGl0YWx9TGlzdFBhcmFtcyB9IGZyb20gXCJAL3NlcnZpY2VzLyR7bmFtZXMuZnN9LyR7bmFtZXMuZnN9LnR5cGVzXCI7XG5pbXBvcnQgeyAkeygoKSA9PiB7XG4gICAgICAgIC8vIOq4sOuzuCBlbnVtIOyImOynkSAoZmlsdGVyQ29sdW1uc+yXkCDsnojripQg6rKD66eMKVxuICAgICAgICBjb25zdCBiYXNlRW51bXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKSkge1xuICAgICAgICAgIGJhc2VFbnVtcy5wdXNoKGAke25hbWVzLmNhcGl0YWx9T3JkZXJCeWAsIGAke25hbWVzLmNhcGl0YWx9T3JkZXJCeUxhYmVsYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIikpIHtcbiAgICAgICAgICBiYXNlRW51bXMucHVzaChgJHtuYW1lcy5jYXBpdGFsfVNlYXJjaEZpZWxkYCwgYCR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZExhYmVsYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtlYTthLAgZW51bSDsiJjsp5EgKGNvbmZpZy5lbnVtSWQg7Jqw7ISgLCDsl4bsnLzrqbQgZ2V0RW51bUluZm9Gcm9tQ29sTmFtZSlcbiAgICAgICAgY29uc3QgZmlsdGVyRW51bUlkcyA9IGZpbHRlckNvbHVtbnNcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIiAmJiBjb2wubmFtZSAhPT0gXCJzZWFyY2hcIiAmJiBjb2wubmFtZSAhPT0gXCJvcmRlckJ5XCIsXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbC5jb25maWcgJiYgXCJlbnVtSWRcIiBpbiBjb2wuY29uZmlnKSB7XG4gICAgICAgICAgICAgIHJldHVybiAoY29sLmNvbmZpZyBhcyB7IGVudW1JZDogc3RyaW5nIH0pLmVudW1JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgaWQ6IGVudW1JZCB9ID0gZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpO1xuICAgICAgICAgICAgICByZXR1cm4gZW51bUlkO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAvLyDrqqjrk6AgZW51bSDtlansuZjqs6Ag7KSR67O1IOygnOqxsFxuICAgICAgICBjb25zdCBhbGxFbnVtcyA9IFsuLi5uZXcgU2V0KFsuLi5maWx0ZXJFbnVtSWRzLCAuLi5jb2x1bW5FbnVtc10pXTtcbiAgICAgICAgY29uc3QgZW51bUltcG9ydHMgPSBhbGxFbnVtcy5mbGF0TWFwKChlbnVtSWQpID0+IFtgJHtlbnVtSWR9YCwgYCR7ZW51bUlkfUxhYmVsYF0pO1xuXG4gICAgICAgIHJldHVybiBbLi4uYmFzZUVudW1zLCAuLi5lbnVtSW1wb3J0c10uam9pbihcIiwgXCIpO1xuICAgICAgfSkoKX0gfSBmcm9tIFwiQC9zZXJ2aWNlcy9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBJZEFzeW5jU2VsZWN0IH0gZnJvbSBcIkBzb25hbXUta2l0L3JlYWN0LWNvbXBvbmVudHMvY29tcG9uZW50c1wiO1xuJHsoKCkgPT4ge1xuICAvLyBGSyDtlYTrk5zsnZggQXN5bmNJZENvbmZpZyBpbXBvcnRcbiAgY29uc3QgZmtDb2x1bW5zID0gZmlsdGVyQ29sdW1ucy5maWx0ZXIoXG4gICAgKGNvbCkgPT4gY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIsXG4gICk7XG4gIGNvbnN0IGNvbmZpZ05hbWVzID0gZmtDb2x1bW5zXG4gICAgLm1hcCgoY29sKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWxQcm9wID0gZ2V0UmVsYXRpb25Qcm9wRnJvbUNvbE5hbWUoZW50aXR5SWQsIGNvbC5uYW1lLnJlcGxhY2UoXCJfaWRcIiwgXCJcIikpO1xuICAgICAgICByZXR1cm4gYCR7cmVsUHJvcC53aXRofUFzeW5jSWRDb25maWdgO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIGNvbmZpZ05hbWVzLmxlbmd0aCA+IDBcbiAgICA/IGBpbXBvcnQgeyAke2NvbmZpZ05hbWVzLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiQC9zZXJ2aWNlcy9zZXJ2aWNlcy5nZW5lcmF0ZWRcIjtgXG4gICAgOiBcIlwiO1xufSkoKX1cblxuaW1wb3J0IEVkaXRJY29uIGZyb20gXCJ+aWNvbnMvbHVjaWRlL3NxdWFyZS1wZW5cIjtcbmltcG9ydCBUcmFzaEljb24gZnJvbSBcIn5pY29ucy9sdWNpZGUvdHJhc2gtMlwiO1xuaW1wb3J0IEZpbHRlckljb24gZnJvbSBcIn5pY29ucy9tZGkvZmlsdGVyLXZhcmlhbnRcIjtcbmltcG9ydCBMaXN0SWNvbiBmcm9tIFwifmljb25zL21kaS9mb3JtYXQtbGlzdC1idWxsZXRlZFwiO1xuaW1wb3J0IFNlYXJjaEljb24gZnJvbSBcIn5pY29ucy9tZGkvbWFnbmlmeVwiO1xuaW1wb3J0IHsgU0QgfSBmcm9tIFwiQC9pMThuL3NkLmdlbmVyYXRlZFwiO1xuXG5leHBvcnQgY29uc3QgUm91dGUgPSBjcmVhdGVGaWxlUm91dGUoXCIvYWRtaW4vJHtuYW1lcy5mc1BsdXJhbH0vXCIpKHtcXG4gIGhlYWQ6ICgpID0+ICh7XFxuICAgIG1ldGE6IFtcXG4gICAgICB7IHRpdGxlOiBcIiR7ZW50aXR5LnRpdGxlID8/IG5hbWVzLmNhcGl0YWx9IExpc3RcIiB9LFxcbiAgICAgIHsgbmFtZTogXCJkZXNjcmlwdGlvblwiLCBjb250ZW50OiBTRChcImVudGl0eS5saXN0TWFuYWdlXCIpKFwiJHtlbnRpdHkudGl0bGUgPz8gbmFtZXMuY2FwaXRhbH1cIikgfSxcXG4gICAgXSxcXG4gIH0pLFxcbiAgY29tcG9uZW50OiAke25hbWVzLmNhcGl0YWx9TGlzdCxcXG59KTtcXG5cXG50eXBlICR7bmFtZXMuY2FwaXRhbH1MaXN0UHJvcHMgPSB7fTtcblxuZnVuY3Rpb24gJHtuYW1lcy5jYXBpdGFsfUxpc3Qoe306ICR7bmFtZXMuY2FwaXRhbH1MaXN0UHJvcHMpIHtcbiAgY29uc3QgbmF2aWdhdGUgPSB1c2VOYXZpZ2F0ZSgpO1xuXG4gIC8vIOyDge2DnCDqtIDrpqxcbiAgY29uc3QgW3NlbGVjdGVkSXRlbXMsIHNldFNlbGVjdGVkSXRlbXNdID0gdXNlU3RhdGU8U2V0PCR7aWRUc1R5cGV9Pj4obmV3IFNldCgpKTtcbiAgY29uc3QgW2RlbGV0ZURpYWxvZ09wZW4sIHNldERlbGV0ZURpYWxvZ09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaXRlbVRvRGVsZXRlLCBzZXRJdGVtVG9EZWxldGVdID0gdXNlU3RhdGU8eyBpZDogJHtpZFRzVHlwZX07IG5hbWU/OiBzdHJpbmcgfSB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbZmlsdGVyTW9kYWxPcGVuLCBzZXRGaWx0ZXJNb2RhbE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbYXBwbGllZFJ1bGVzLCBzZXRBcHBsaWVkUnVsZXNdID0gdXNlU3RhdGU8UnVsZVtdPihbXSk7XG5cbiAgLy8g66as7Iqk7Yq4IO2VhO2EsFxuICBjb25zdCB7IGxpc3RQYXJhbXMsIHJlZ2lzdGVyLCBzZXRMaXN0UGFyYW1zIH0gPSB1c2VMaXN0UGFyYW1zKCR7bmFtZXMuY2FwaXRhbH1MaXN0UGFyYW1zLCB7XG4gICAgbnVtOiAxMCxcbiAgICBwYWdlOiAxLFxuICAgIGtleXdvcmQ6IFwiXCIsJHtcbiAgICAgIGZpbHRlckNvbHVtbnMuc29tZSgoY29sKSA9PiBjb2wubmFtZSA9PT0gXCJzZWFyY2hcIilcbiAgICAgICAgPyBgXG4gICAgc2VhcmNoOiAke25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGQub3B0aW9uc1swXSxgXG4gICAgICAgIDogXCJcIlxuICAgIH0ke1xuICAgICAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcIm9yZGVyQnlcIilcbiAgICAgICAgPyBgXG4gICAgb3JkZXJCeTogJHtuYW1lcy5jYXBpdGFsfU9yZGVyQnkub3B0aW9uc1swXSxgXG4gICAgICAgIDogXCJcIlxuICAgIH1cbiAgICBzb25hbXVGaWx0ZXI6IHt9LFxuICB9KTtcblxuICAvLyDrpqzsiqTtirgg7L+866asXG4gIGNvbnN0IHsgZGF0YSwgcmVmZXRjaCwgaXNMb2FkaW5nIH0gPSAke25hbWVzLmNhcGl0YWx9U2VydmljZS51c2Uke25hbWVzLmNhcGl0YWxQbHVyYWx9KFwiQVwiLCBsaXN0UGFyYW1zKTtcbiAgY29uc3QgeyByb3dzLCB0b3RhbCB9ID0gZGF0YSA/PyB7fTtcblxuICAvLyDtmITsnqwg6rK966Gc7JmAIO2DgOydtO2LgFxuICBjb25zdCBQQUdFID0ge1xuICAgIHJvdXRlOiBcIi9hZG1pbi8ke25hbWVzLmZzUGx1cmFsfVwiLFxuICAgIHRpdGxlOiBTRChcImVudGl0eS5saXN0XCIpKFNEKFwiZW50aXR5LiR7bmFtZXMuY2FwaXRhbH1cIikpLFxuICB9O1xuXG4gIC8vIOy7rOufvCDsoJXsnZhcbiAgdHlwZSAke25hbWVzLmNhcGl0YWx9Um93ID0gTm9uTnVsbGFibGU8dHlwZW9mIHJvd3M+W251bWJlcl07XG4gIGNvbnN0IGNvbHVtbnM6IFRhYmxlQ29sPCR7bmFtZXMuY2FwaXRhbH1Sb3c+W10gPSBbXG4ke2NvbHVtbnNcbiAgLm1hcChcbiAgICAoY29sKSA9PiBgICAgIHtcbiAgICAgIGxhYmVsOiAke2NvbC5sYWJlbH0sXG4gICAgICB0YzogJHtjb2wudGN9LCR7XG4gICAgICAgIGNvbC5maXRcbiAgICAgICAgICA/IGBcbiAgICAgIGZpdDogdHJ1ZSxgXG4gICAgICAgICAgOiBcIlwiXG4gICAgICB9JHtcbiAgICAgICAgY29sLmFsaWduXG4gICAgICAgICAgPyBgXG4gICAgICBhbGlnbjogXCIke2NvbC5hbGlnbn1cIixgXG4gICAgICAgICAgOiBcIlwiXG4gICAgICB9XG4gICAgfWAsXG4gIClcbiAgLmpvaW4oXCIsXFxuXCIpfSxcbiAgICB7XG4gICAgICBsYWJlbDogU0QoXCJjb21tb24ubWFuYWdlXCIpLFxuICAgICAgZml0OiB0cnVlLFxuICAgICAgYWxpZ246IFwiY2VudGVyXCIsXG4gICAgICB0YzogKHJvdykgPT4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cInllbGxvd1wiXG4gICAgICAgICAgICBzaXplPVwieHNcIlxuICAgICAgICAgICAgaWNvbj17PEVkaXRJY29uIC8+fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gbmF2aWdhdGUoeyB0bzogXFxgXFwke1BBR0Uucm91dGV9L2Zvcm1cXGAsIHNlYXJjaDogeyBpZDogcm93LmlkIH0gfSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwicmVkXCJcbiAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICBpY29uPXs8VHJhc2hJY29uIC8+fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlRGVsZXRlQ2xpY2socm93LmlkKX1cbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICksXG4gICAgfSxcbiAgXTtcblxuICAvLyDshKDtg50g7ZW465Ok65+sXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZUl0ZW0gPSAoaWQ6ICR7aWRUc1R5cGV9KSA9PiB7XG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gbmV3IFNldChzZWxlY3RlZEl0ZW1zKTtcbiAgICBpZiAobmV3U2VsZWN0aW9uLmhhcyhpZCkpIHtcbiAgICAgIG5ld1NlbGVjdGlvbi5kZWxldGUoaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTZWxlY3Rpb24uYWRkKGlkKTtcbiAgICB9XG4gICAgc2V0U2VsZWN0ZWRJdGVtcyhuZXdTZWxlY3Rpb24pO1xuICB9O1xuXG4gIGNvbnN0IGlzQWxsU2VsZWN0ZWQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIChyb3dzPy5sZW5ndGggPz8gMCkgPiAwICYmIHJvd3MhLmV2ZXJ5KChyb3cpID0+IHNlbGVjdGVkSXRlbXMuaGFzKHJvdy5pZCkpO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdEFsbCA9IChjaGVja2VkOiBib29sZWFuKSA9PiB7XG4gICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgIHNldFNlbGVjdGVkSXRlbXMobmV3IFNldChyb3dzPy5tYXAoKHJvdykgPT4gcm93LmlkKSA/PyBbXSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTZWxlY3RlZEl0ZW1zKG5ldyBTZXQoKSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIOyCreygnCDtlbjrk6Trn6xcbiAgY29uc3QgaGFuZGxlRGVsZXRlQ2xpY2sgPSAoaWQ6ICR7aWRUc1R5cGV9LCBuYW1lPzogc3RyaW5nKSA9PiB7XG4gICAgc2V0SXRlbVRvRGVsZXRlKHsgaWQsIG5hbWUgfSk7XG4gICAgc2V0RGVsZXRlRGlhbG9nT3Blbih0cnVlKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDb25maXJtRGVsZXRlID0gKCkgPT4ge1xuICAgIGlmIChpdGVtVG9EZWxldGUpIHtcbiAgICAgICR7bmFtZXMuY2FwaXRhbH1TZXJ2aWNlLmRlbChbaXRlbVRvRGVsZXRlLmlkXSkudGhlbigoKSA9PiB7XG4gICAgICAgIHJlZmV0Y2goKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBzZXREZWxldGVEaWFsb2dPcGVuKGZhbHNlKTtcbiAgICBzZXRJdGVtVG9EZWxldGUobnVsbCk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1heC13LVsxODAwcHhdIG14LWF1dG8gcC04XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS02IG1iLThcIj5cbiAgICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxMaXN0SWNvbiBjbGFzc05hbWU9XCJoLTUgdy01XCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtbGcgZm9udC1zZW1pYm9sZCBoLTVcIj57UEFHRS50aXRsZX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8Q2FyZCBjbGFzc05hbWU9XCJzaGFkb3ctc20gYm9yZGVyLWJvcmRlci80MCBvdmVyZmxvdy1oaWRkZW5cIj5cbiAgICAgICAgICAgIDxDYXJkSGVhZGVyIGNsYXNzTmFtZT1cInBiLTAgcHgtMCBwdC0wXCI+XG4gICAgICAgICAgICAgIHsvKiBGaWx0ZXJzICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJnLWdyYXktMTAwIHB4LTYgcHktNCBzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIGZsZXgtd3JhcFwiPlxuJHtcbiAgZmlsdGVyQ29sdW1ucy5zb21lKChjb2wpID0+IGNvbC5uYW1lID09PSBcInNlYXJjaFwiKVxuICAgID8gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7bmFtZXMuY2FwaXRhbH1TZWFyY2hGaWVsZH1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXske25hbWVzLmNhcGl0YWx9U2VhcmNoRmllbGRMYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwic2VhcmNoXCIpfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17U0QoXCJjb21tb24uc2VhcmNoVHlwZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy01MCBoLTggYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gXG4gICAgOiBcIlwiXG59XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleC0xIG1heC13LXhzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcImtleXdvcmRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e1NEKFwiY29tbW9uLnNlYXJjaFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggcHItOCB0ZXh0LXhzIGJnLXdoaXRlIGJvcmRlci1ncmF5LTMwMFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWNvbj17PFNlYXJjaEljb24gLz59XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMCB0b3AtMCBoLTggdy04IGhvdmVyOmJnLXRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1sLWF1dG8gZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtOCBweC00IGJnLXByaW1hcnkgaG92ZXI6YmctcHJpbWFyeS85MCB0ZXh0LXdoaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBuYXZpZ2F0ZSh7IHRvOiBcXGBcXCR7UEFHRS5yb3V0ZX0vZm9ybVxcYCB9KX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHNcIj57U0QoXCJjb21tb24uY3JlYXRlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxTb25hbXVGaWx0ZXJQb3BvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgcnVsZXM9e2FwcGxpZWRSdWxlc31cbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZE1ldGE9e2V4dHJhY3RGaWVsZE1ldGFGcm9tU2NoZW1hKFxuICAgICAgICAgICAgICAgICAgICAgICAgJHtuYW1lcy5jYXBpdGFsfUJhc2VTY2hlbWEsXG4gICAgICAgICAgICAgICAgICAgICAgICBTRCBhcyAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249ezxGaWx0ZXJJY29uIC8+fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0RmlsdGVyTW9kYWxPcGVuKHRydWUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC04XCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzXCI+e1NEKFwicmMuc29uYW11RmlsdGVyLnRpdGxlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHthcHBsaWVkUnVsZXMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxCYWRnZSB2YXJpYW50PVwic2Vjb25kYXJ5XCIgY2xhc3NOYW1lPVwibWwtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthcHBsaWVkUnVsZXMubGVuZ3RofVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0JhZGdlPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9Tb25hbXVGaWx0ZXJQb3BvdmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0zIGZsZXgtd3JhcFwiPlxuJHtmaWx0ZXJDb2x1bW5zXG4gIC5maWx0ZXIoKGNvbCkgPT4gY29sLm5hbWUgIT09IFwic2VhcmNoXCIgJiYgY29sLm5hbWUgIT09IFwib3JkZXJCeVwiKVxuICAubWFwKChjb2wpID0+IHtcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwiZW51bXNcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gY29uZmlnLmVudW1JZOqwgCDsnojsnLzrqbQg7Jqw7ISgIOyCrOyaqSwg7JeG7Jy866m0IGdldEVudW1JbmZvRnJvbUNvbE5hbWUg7Iuc64+EXG4gICAgICAgIGNvbnN0IGVudW1JZCA9XG4gICAgICAgICAgY29sLmNvbmZpZyAmJiBcImVudW1JZFwiIGluIGNvbC5jb25maWdcbiAgICAgICAgICAgID8gKGNvbC5jb25maWcgYXMgeyBlbnVtSWQ6IHN0cmluZyB9KS5lbnVtSWRcbiAgICAgICAgICAgIDogZ2V0RW51bUluZm9Gcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUpLmlkO1xuICAgICAgICByZXR1cm4gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGtleT17XFxgJHtjb2wubmFtZX0tXFwke2xpc3RQYXJhbXMuJHtjb2wubmFtZX19XFxgfVxuICAgICAgICAgICAgICAgICAgICBlbnVtPXske2VudW1JZH19XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscz17JHtlbnVtSWR9TGFiZWx9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcIiR7Y29sLm5hbWV9XCIpfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiR7Y29sLmxhYmVsfVwiXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyYWJsZVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCBiZy13aGl0ZSBib3JkZXItZ3JheS0zMDAgdGV4dC14c1wiXG4gICAgICAgICAgICAgICAgICAvPmA7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEZLIO2VhOuTnCAoSWRBc3luY1NlbGVjdClcbiAgICBpZiAoY29sLnJlbmRlclR5cGUgPT09IFwibnVtYmVyLWZrX2lkXCIgfHwgY29sLnJlbmRlclR5cGUgPT09IFwic3RyaW5nLWZrX2lkXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlbFByb3AgPSBnZXRSZWxhdGlvblByb3BGcm9tQ29sTmFtZShlbnRpdHlJZCwgY29sLm5hbWUucmVwbGFjZShcIl9pZFwiLCBcIlwiKSk7XG4gICAgICAgIHJldHVybiBgICAgICAgICAgICAgICAgICAgPElkQXN5bmNTZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnPXske3JlbFByb3Aud2l0aH1Bc3luY0lkQ29uZmlnfVxuICAgICAgICAgICAgICAgICAgICBzdWJzZXQ9XCJBXCJcbiAgICAgICAgICAgICAgICAgICAgey4uLnJlZ2lzdGVyKFwiJHtjb2wubmFtZX1cIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiJHtjb2wubGFiZWwgPz8gcmVsUHJvcC53aXRofVwiXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyYWJsZVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTUwIGgtOCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgIC8+YDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwiXCI7XG4gIH0pXG4gIC5maWx0ZXIoQm9vbGVhbilcbiAgLmpvaW4oXCJcXG5cIil9XG4ke1xuICBmaWx0ZXJDb2x1bW5zLnNvbWUoKGNvbCkgPT4gY29sLm5hbWUgPT09IFwib3JkZXJCeVwiKVxuICAgID8gYCAgICAgICAgICAgICAgICAgIDxFbnVtU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGVudW09eyR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5fVxuICAgICAgICAgICAgICAgICAgICBsYWJlbHM9eyR7bmFtZXMuY2FwaXRhbH1PcmRlckJ5TGFiZWx9XG4gICAgICAgICAgICAgICAgICAgIHsuLi5yZWdpc3RlcihcIm9yZGVyQnlcIil9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtTRChcImNvbW1vbi5zb3J0XCIpfVxuICAgICAgICAgICAgICAgICAgICB0ZXh0UHJlZml4PXtcXGBcXCR7U0QoXCJjb21tb24uc29ydFwiKX06IFxcYH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy01MCBoLTggYmctd2hpdGUgYm9yZGVyLWdyYXktMzAwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgLz5gXG4gICAgOiBcIlwiXG59XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPntTRChcImNvbW1vbi5yZXN1bHRzXCIpKHRvdGFsID8/IDApfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0NhcmRIZWFkZXI+XG5cbiAgICAgICAgICAgIDxDYXJkQ29udGVudCBjbGFzc05hbWU9XCJweC02IHBiLTYgcHQtNiBiZy13aGl0ZVwiPlxuICAgICAgICAgICAgICB7LyogVGFibGUgKi99XG4gICAgICAgICAgICAgIDxUYWJsZT5cbiAgICAgICAgICAgICAgICA8VGFibGVIZWFkZXI+XG4gICAgICAgICAgICAgICAgICA8VGFibGVSb3cgY2xhc3NOYW1lPVwiaG92ZXI6YmctdHJhbnNwYXJlbnQgYmctZ3JheS0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPFRhYmxlSGVhZCBjbGFzc05hbWU9XCJoLTkgdGV4dC14cyB3LVs0MHB4XVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17aXNBbGxTZWxlY3RlZCgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25WYWx1ZUNoYW5nZT17aGFuZGxlU2VsZWN0QWxsfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvVGFibGVIZWFkPlxuICAgICAgICAgICAgICAgICAgICB7Y29sdW1ucy5tYXAoKGNvbCwgaWR4KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPFRhYmxlSGVhZCBrZXk9e2lkeH0gZml0PXtjb2wuZml0fSBhbGlnbj17Y29sLmFsaWdufT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2wubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgPC9UYWJsZUhlYWQ+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9UYWJsZVJvdz5cbiAgICAgICAgICAgICAgICA8L1RhYmxlSGVhZGVyPlxuICAgICAgICAgICAgICAgIDxUYWJsZUJvZHk+XG4gICAgICAgICAgICAgICAgICB7IWlzTG9hZGluZyAmJiByb3dzICYmIHJvd3MubWFwKChyb3cpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPEZyYWdtZW50IGtleT17cm93LmlkfT5cbiAgICAgICAgICAgICAgICAgICAgICA8VGFibGVSb3c+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGFibGVDZWxsIGNsYXNzTmFtZT1cInB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17c2VsZWN0ZWRJdGVtcy5oYXMocm93LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbHVlQ2hhbmdlPXsoKSA9PiBoYW5kbGVUb2dnbGVJdGVtKHJvdy5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb2x1bW5zLm1hcCgoY29sLCBpZHgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPFRhYmxlQ2VsbCBrZXk9e2lkeH0gZml0PXtjb2wuZml0fSBhbGlnbj17Y29sLmFsaWdufSBjbGFzc05hbWU9XCJweS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NvbC50Yyhyb3cpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RhYmxlQ2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvVGFibGVSb3c+XG4gICAgICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICA8L1RhYmxlQm9keT5cbiAgICAgICAgICAgICAgPC9UYWJsZT5cblxuICAgICAgICAgICAgICB7LyogUGFnaW5hdGlvbiAqL31cbiAgICAgICAgICAgICAgPFBhZ2luYXRpb25cbiAgICAgICAgICAgICAgICB7Li4ucmVnaXN0ZXIoXCJwYWdlXCIpfVxuICAgICAgICAgICAgICAgIHRvdGFsPXt0b3RhbCA/PyAwfVxuICAgICAgICAgICAgICAgIGl0ZW1zUGVyUGFnZT17bGlzdFBhcmFtcy5udW0gPz8gMTB9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L0NhcmRDb250ZW50PlxuICAgICAgICAgIDwvQ2FyZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIERlbGV0ZSBEaWFsb2cgKi99XG4gICAgICA8QWxlcnREaWFsb2cgb3Blbj17ZGVsZXRlRGlhbG9nT3Blbn0gb25PcGVuQ2hhbmdlPXtzZXREZWxldGVEaWFsb2dPcGVufT5cbiAgICAgICAgPEFsZXJ0RGlhbG9nQ29udGVudD5cbiAgICAgICAgICA8QWxlcnREaWFsb2dIZWFkZXI+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dUaXRsZT57U0QoXCJkZWxldGUuY29uZmlybS50aXRsZVwiKX08L0FsZXJ0RGlhbG9nVGl0bGU+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dEZXNjcmlwdGlvbj57U0QoXCJkZWxldGUuY29uZmlybS5kZXNjcmlwdGlvblwiKX08L0FsZXJ0RGlhbG9nRGVzY3JpcHRpb24+XG4gICAgICAgICAgPC9BbGVydERpYWxvZ0hlYWRlcj5cbiAgICAgICAgICA8QWxlcnREaWFsb2dGb290ZXI+XG4gICAgICAgICAgICA8QWxlcnREaWFsb2dDYW5jZWw+e1NEKFwiY29tbW9uLmNhbmNlbFwiKX08L0FsZXJ0RGlhbG9nQ2FuY2VsPlxuICAgICAgICAgICAgPEFsZXJ0RGlhbG9nQWN0aW9uIG9uQ2xpY2s9e2hhbmRsZUNvbmZpcm1EZWxldGV9PlxuICAgICAgICAgICAgICB7U0QoXCJjb21tb24uZGVsZXRlXCIpfVxuICAgICAgICAgICAgPC9BbGVydERpYWxvZ0FjdGlvbj5cbiAgICAgICAgICA8L0FsZXJ0RGlhbG9nRm9vdGVyPlxuICAgICAgICA8L0FsZXJ0RGlhbG9nQ29udGVudD5cbiAgICAgIDwvQWxlcnREaWFsb2c+XG5cbiAgICAgIHsvKiBTb25hbXUgRmlsdGVyIE1vZGFsICovfVxuICAgICAgPFNvbmFtdUZpbHRlck1vZGFsXG4gICAgICAgIGJhc2VTY2hlbWE9eyR7bmFtZXMuY2FwaXRhbH1CYXNlU2NoZW1hfVxuICAgICAgICBvcGVuPXtmaWx0ZXJNb2RhbE9wZW59XG4gICAgICAgIG9uT3BlbkNoYW5nZT17c2V0RmlsdGVyTW9kYWxPcGVufVxuICAgICAgICBpbml0aWFsUnVsZXM9e2FwcGxpZWRSdWxlc31cbiAgICAgICAgb25BcHBseT17KGZpbHRlcnMsIHJ1bGVzKSA9PiB7XG4gICAgICAgICAgc2V0TGlzdFBhcmFtcyh7IC4uLmxpc3RQYXJhbXMsIHNvbmFtdUZpbHRlcjogZmlsdGVycywgcGFnZTogMSB9KTtcbiAgICAgICAgICBzZXRBcHBsaWVkUnVsZXMocnVsZXMpO1xuICAgICAgICB9fVxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiAgICAgIGAudHJpbSgpLFxuICAgICAgaW1wb3J0S2V5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