sonamu 0.7.53 → 0.8.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 (271) hide show
  1. package/dist/api/config.d.ts +9 -1
  2. package/dist/api/config.d.ts.map +1 -1
  3. package/dist/api/config.js +1 -1
  4. package/dist/api/sonamu.d.ts +21 -1
  5. package/dist/api/sonamu.d.ts.map +1 -1
  6. package/dist/api/sonamu.js +159 -65
  7. package/dist/auth/plugins/entity-definitions/anonymous.d.ts +10 -0
  8. package/dist/auth/plugins/entity-definitions/anonymous.d.ts.map +1 -0
  9. package/dist/auth/plugins/entity-definitions/anonymous.js +23 -0
  10. package/dist/auth/plugins/entity-definitions/api-key.d.ts +9 -0
  11. package/dist/auth/plugins/entity-definitions/api-key.d.ts.map +1 -0
  12. package/dist/auth/plugins/entity-definitions/api-key.js +199 -0
  13. package/dist/auth/plugins/entity-definitions/index.d.ts +6 -0
  14. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
  15. package/dist/auth/plugins/entity-definitions/index.js +20 -2
  16. package/dist/auth/plugins/entity-definitions/jwt.d.ts +9 -0
  17. package/dist/auth/plugins/entity-definitions/jwt.d.ts.map +1 -0
  18. package/dist/auth/plugins/entity-definitions/jwt.js +67 -0
  19. package/dist/auth/plugins/entity-definitions/organization.d.ts +9 -0
  20. package/dist/auth/plugins/entity-definitions/organization.d.ts.map +1 -0
  21. package/dist/auth/plugins/entity-definitions/organization.js +424 -0
  22. package/dist/auth/plugins/entity-definitions/passkey.d.ts +10 -0
  23. package/dist/auth/plugins/entity-definitions/passkey.d.ts.map +1 -0
  24. package/dist/auth/plugins/entity-definitions/passkey.js +129 -0
  25. package/dist/auth/plugins/entity-definitions/sso.d.ts +10 -0
  26. package/dist/auth/plugins/entity-definitions/sso.d.ts.map +1 -0
  27. package/dist/auth/plugins/entity-definitions/sso.js +110 -0
  28. package/dist/auth/plugins/entity-definitions/types.d.ts +1 -1
  29. package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -1
  30. package/dist/auth/plugins/entity-definitions/types.js +1 -1
  31. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
  32. package/dist/auth/plugins/wrappers/admin.js +2 -4
  33. package/dist/auth/plugins/wrappers/anonymous.d.ts +18 -0
  34. package/dist/auth/plugins/wrappers/anonymous.d.ts.map +1 -0
  35. package/dist/auth/plugins/wrappers/anonymous.js +26 -0
  36. package/dist/auth/plugins/wrappers/api-key.d.ts +18 -0
  37. package/dist/auth/plugins/wrappers/api-key.d.ts.map +1 -0
  38. package/dist/auth/plugins/wrappers/api-key.js +38 -0
  39. package/dist/auth/plugins/wrappers/index.d.ts +6 -0
  40. package/dist/auth/plugins/wrappers/index.d.ts.map +1 -1
  41. package/dist/auth/plugins/wrappers/index.js +7 -1
  42. package/dist/auth/plugins/wrappers/jwt.d.ts +18 -0
  43. package/dist/auth/plugins/wrappers/jwt.d.ts.map +1 -0
  44. package/dist/auth/plugins/wrappers/jwt.js +30 -0
  45. package/dist/auth/plugins/wrappers/organization.d.ts +18 -0
  46. package/dist/auth/plugins/wrappers/organization.d.ts.map +1 -0
  47. package/dist/auth/plugins/wrappers/organization.js +67 -0
  48. package/dist/auth/plugins/wrappers/passkey.d.ts +18 -0
  49. package/dist/auth/plugins/wrappers/passkey.d.ts.map +1 -0
  50. package/dist/auth/plugins/wrappers/passkey.js +32 -0
  51. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
  52. package/dist/auth/plugins/wrappers/phone-number.js +2 -4
  53. package/dist/auth/plugins/wrappers/sso.d.ts +853 -0
  54. package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -0
  55. package/dist/auth/plugins/wrappers/sso.js +36 -0
  56. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
  57. package/dist/auth/plugins/wrappers/two-factor.js +2 -4
  58. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
  59. package/dist/auth/plugins/wrappers/username.js +2 -4
  60. package/dist/bin/build-config.d.ts +2 -2
  61. package/dist/bin/build-config.js +6 -7
  62. package/dist/bin/cli.js +417 -32
  63. package/dist/bin/fixture.d.ts +27 -0
  64. package/dist/bin/fixture.d.ts.map +1 -0
  65. package/dist/bin/fixture.js +245 -0
  66. package/dist/cache/decorator.d.ts +4 -3
  67. package/dist/cache/decorator.d.ts.map +1 -1
  68. package/dist/cache/decorator.js +5 -4
  69. package/dist/cone/cone-generator.d.ts +33 -0
  70. package/dist/cone/cone-generator.d.ts.map +1 -0
  71. package/dist/cone/cone-generator.js +286 -0
  72. package/dist/database/_batch_update.d.ts.map +1 -1
  73. package/dist/database/_batch_update.js +16 -2
  74. package/dist/database/puri-subset.test-d.js +1 -1
  75. package/dist/database/puri-subset.types.d.ts +1 -1
  76. package/dist/database/puri-subset.types.d.ts.map +1 -1
  77. package/dist/database/puri-subset.types.js +1 -1
  78. package/dist/database/puri.d.ts +4 -0
  79. package/dist/database/puri.d.ts.map +1 -1
  80. package/dist/database/puri.js +20 -2
  81. package/dist/database/upsert-builder.d.ts.map +1 -1
  82. package/dist/database/upsert-builder.js +19 -3
  83. package/dist/dict/en.d.ts +15 -0
  84. package/dist/dict/en.d.ts.map +1 -1
  85. package/dist/dict/en.js +2 -1
  86. package/dist/dict/ko.d.ts +15 -0
  87. package/dist/dict/ko.d.ts.map +1 -1
  88. package/dist/dict/ko.js +2 -1
  89. package/dist/dict/rc-keys.d.ts +28 -0
  90. package/dist/dict/rc-keys.d.ts.map +1 -1
  91. package/dist/dict/rc-keys.js +31 -1
  92. package/dist/dict/sd.d.ts.map +1 -1
  93. package/dist/dict/sd.js +20 -4
  94. package/dist/entity/entity-manager.d.ts +298 -2
  95. package/dist/entity/entity-manager.d.ts.map +1 -1
  96. package/dist/entity/entity-manager.js +4 -1
  97. package/dist/entity/entity-template-cone.d.ts +14 -0
  98. package/dist/entity/entity-template-cone.d.ts.map +1 -0
  99. package/dist/entity/entity-template-cone.js +222 -0
  100. package/dist/entity/entity.d.ts +47 -2
  101. package/dist/entity/entity.d.ts.map +1 -1
  102. package/dist/entity/entity.js +161 -14
  103. package/dist/ssr/renderer.js +3 -3
  104. package/dist/syncer/api-parser.js +12 -1
  105. package/dist/syncer/checksum.d.ts +0 -14
  106. package/dist/syncer/checksum.d.ts.map +1 -1
  107. package/dist/syncer/checksum.js +1 -23
  108. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  109. package/dist/syncer/syncer-actions.js +8 -2
  110. package/dist/syncer/syncer.d.ts +1 -1
  111. package/dist/syncer/syncer.d.ts.map +1 -1
  112. package/dist/syncer/syncer.js +17 -10
  113. package/dist/tasks/workflow-manager.d.ts +13 -1
  114. package/dist/tasks/workflow-manager.d.ts.map +1 -1
  115. package/dist/tasks/workflow-manager.js +18 -1
  116. package/dist/template/entity-converter.js +4 -4
  117. package/dist/template/helpers.d.ts +10 -0
  118. package/dist/template/helpers.d.ts.map +1 -1
  119. package/dist/template/helpers.js +48 -1
  120. package/dist/template/implementations/entry-server.template.d.ts +1 -1
  121. package/dist/template/implementations/entry-server.template.js +7 -2
  122. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  123. package/dist/template/implementations/generated.template.js +5 -1
  124. package/dist/template/implementations/generated_http.template.d.ts +1 -0
  125. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  126. package/dist/template/implementations/generated_http.template.js +6 -2
  127. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  128. package/dist/template/implementations/generated_sso.template.js +29 -8
  129. package/dist/template/implementations/queries.template.d.ts.map +1 -1
  130. package/dist/template/implementations/queries.template.js +9 -1
  131. package/dist/template/implementations/sd.template.d.ts +1 -1
  132. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  133. package/dist/template/implementations/sd.template.js +28 -4
  134. package/dist/template/implementations/services.template.d.ts.map +1 -1
  135. package/dist/template/implementations/services.template.js +12 -12
  136. package/dist/template/implementations/view_form.template.d.ts +11 -7
  137. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  138. package/dist/template/implementations/view_form.template.js +97 -87
  139. package/dist/template/implementations/view_list.template.d.ts +3 -3
  140. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  141. package/dist/template/implementations/view_list.template.js +115 -109
  142. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  143. package/dist/template/implementations/view_search_input.template.js +18 -14
  144. package/dist/template/zod-converter.d.ts.map +1 -1
  145. package/dist/template/zod-converter.js +95 -7
  146. package/dist/testing/_relation-graph.js +1 -1
  147. package/dist/testing/data-explorer.d.ts +61 -0
  148. package/dist/testing/data-explorer.d.ts.map +1 -0
  149. package/dist/testing/data-explorer.js +274 -0
  150. package/dist/testing/faker-mappings.d.ts +20 -0
  151. package/dist/testing/faker-mappings.d.ts.map +1 -0
  152. package/dist/testing/faker-mappings.js +421 -0
  153. package/dist/testing/fixture-generator.d.ts +161 -0
  154. package/dist/testing/fixture-generator.d.ts.map +1 -0
  155. package/dist/testing/fixture-generator.js +954 -0
  156. package/dist/testing/fixture-manager.d.ts +6 -1
  157. package/dist/testing/fixture-manager.d.ts.map +1 -1
  158. package/dist/testing/fixture-manager.js +72 -4
  159. package/dist/testing/index.d.ts +3 -0
  160. package/dist/testing/index.d.ts.map +1 -1
  161. package/dist/testing/index.js +4 -1
  162. package/dist/types/types.d.ts +1520 -26
  163. package/dist/types/types.d.ts.map +1 -1
  164. package/dist/types/types.js +136 -22
  165. package/dist/ui/ai-client.d.ts.map +1 -1
  166. package/dist/ui/ai-client.js +9 -4
  167. package/dist/ui/api.d.ts.map +1 -1
  168. package/dist/ui/api.js +303 -24
  169. package/dist/ui-web/assets/index-CsUr-_pV.js +254 -0
  170. package/dist/ui-web/assets/index-T42zzs1K.css +1 -0
  171. package/dist/ui-web/index.html +2 -2
  172. package/dist/utils/fs-utils.d.ts +2 -1
  173. package/dist/utils/fs-utils.d.ts.map +1 -1
  174. package/dist/utils/fs-utils.js +14 -3
  175. package/package.json +19 -11
  176. package/src/api/config.ts +12 -1
  177. package/src/api/sonamu.ts +179 -65
  178. package/src/auth/plugins/entity-definitions/anonymous.ts +17 -0
  179. package/src/auth/plugins/entity-definitions/api-key.ts +93 -0
  180. package/src/auth/plugins/entity-definitions/index.ts +18 -0
  181. package/src/auth/plugins/entity-definitions/jwt.ts +35 -0
  182. package/src/auth/plugins/entity-definitions/organization.ts +215 -0
  183. package/src/auth/plugins/entity-definitions/passkey.ts +64 -0
  184. package/src/auth/plugins/entity-definitions/sso.ts +62 -0
  185. package/src/auth/plugins/entity-definitions/types.ts +11 -1
  186. package/src/auth/plugins/wrappers/admin.ts +1 -3
  187. package/src/auth/plugins/wrappers/anonymous.ts +30 -0
  188. package/src/auth/plugins/wrappers/api-key.ts +42 -0
  189. package/src/auth/plugins/wrappers/index.ts +6 -0
  190. package/src/auth/plugins/wrappers/jwt.ts +34 -0
  191. package/src/auth/plugins/wrappers/organization.ts +73 -0
  192. package/src/auth/plugins/wrappers/passkey.ts +36 -0
  193. package/src/auth/plugins/wrappers/phone-number.ts +1 -3
  194. package/src/auth/plugins/wrappers/sso.ts +40 -0
  195. package/src/auth/plugins/wrappers/two-factor.ts +1 -3
  196. package/src/auth/plugins/wrappers/username.ts +1 -3
  197. package/src/bin/build-config.ts +6 -6
  198. package/src/bin/cli.ts +452 -31
  199. package/src/bin/fixture.ts +302 -0
  200. package/src/cache/decorator.ts +4 -3
  201. package/src/cone/cone-generator.ts +363 -0
  202. package/src/database/_batch_update.ts +11 -0
  203. package/src/database/puri-subset.test-d.ts +13 -13
  204. package/src/database/puri-subset.types.ts +1 -1
  205. package/src/database/puri.ts +43 -1
  206. package/src/database/upsert-builder.ts +16 -2
  207. package/src/dict/en.ts +1 -0
  208. package/src/dict/ko.ts +1 -0
  209. package/src/dict/rc-keys.ts +32 -0
  210. package/src/dict/sd.ts +23 -3
  211. package/src/entity/entity-manager.ts +4 -0
  212. package/src/entity/entity-template-cone.ts +298 -0
  213. package/src/entity/entity.ts +189 -13
  214. package/src/shared/app.shared.ts.txt +5 -0
  215. package/src/shared/web.shared.ts.txt +9 -5
  216. package/src/skills/project/README.md +21 -0
  217. package/src/skills/project/architecture.md +373 -0
  218. package/src/skills/project/business-logic.md +270 -0
  219. package/src/skills/project/requirements.md +160 -0
  220. package/src/skills/sonamu/SKILL.md +168 -3
  221. package/src/skills/sonamu/api.md +102 -0
  222. package/src/skills/sonamu/database.md +220 -1
  223. package/src/skills/sonamu/entity-relations.md +89 -1
  224. package/src/skills/sonamu/fixture-cli.md +501 -0
  225. package/src/skills/sonamu/frontend.md +214 -0
  226. package/src/skills/sonamu/i18n.md +95 -0
  227. package/src/skills/sonamu/model.md +153 -0
  228. package/src/skills/sonamu/project-init.md +178 -8
  229. package/src/skills/sonamu/scaffolding.md +112 -0
  230. package/src/skills/sonamu/subset.md +9 -3
  231. package/src/skills/sonamu/testing.md +287 -2
  232. package/src/skills/sonamu/workflow.md +70 -5
  233. package/src/ssr/renderer.ts +2 -2
  234. package/src/syncer/api-parser.ts +12 -0
  235. package/src/syncer/checksum.ts +0 -38
  236. package/src/syncer/syncer-actions.ts +7 -1
  237. package/src/syncer/syncer.ts +16 -5
  238. package/src/tasks/workflow-manager.ts +29 -8
  239. package/src/template/entity-converter.ts +3 -3
  240. package/src/template/helpers.ts +49 -0
  241. package/src/template/implementations/entry-server.template.ts +1 -1
  242. package/src/template/implementations/generated.template.ts +4 -0
  243. package/src/template/implementations/generated_http.template.ts +1 -0
  244. package/src/template/implementations/generated_sso.template.ts +40 -11
  245. package/src/template/implementations/queries.template.ts +8 -0
  246. package/src/template/implementations/sd.template.ts +22 -3
  247. package/src/template/implementations/services.template.ts +11 -10
  248. package/src/template/implementations/view_form.template.ts +111 -101
  249. package/src/template/implementations/view_list.template.ts +120 -119
  250. package/src/template/implementations/view_search_input.template.ts +17 -13
  251. package/src/template/zod-converter.ts +103 -6
  252. package/src/testing/_relation-graph.ts +1 -1
  253. package/src/testing/data-explorer.ts +427 -0
  254. package/src/testing/faker-mappings.ts +434 -0
  255. package/src/testing/fixture-generator.ts +1166 -0
  256. package/src/testing/fixture-manager.ts +91 -6
  257. package/src/testing/index.ts +3 -0
  258. package/src/types/types.ts +222 -26
  259. package/src/ui/ai-client.ts +9 -1
  260. package/src/ui/api.ts +429 -23
  261. package/src/utils/fs-utils.ts +14 -1
  262. package/dist/template/implementations/view_enums_select.template.d.ts +0 -17
  263. package/dist/template/implementations/view_enums_select.template.d.ts.map +0 -1
  264. package/dist/template/implementations/view_enums_select.template.js +0 -62
  265. package/dist/template/implementations/view_id_async_select.template.d.ts +0 -17
  266. package/dist/template/implementations/view_id_async_select.template.d.ts.map +0 -1
  267. package/dist/template/implementations/view_id_async_select.template.js +0 -125
  268. package/dist/ui-web/assets/index-Bd_2AkLb.css +0 -1
  269. package/dist/ui-web/assets/index-BpSbhQWo.js +0 -225
  270. package/src/template/implementations/view_enums_select.template.ts +0 -65
  271. package/src/template/implementations/view_id_async_select.template.ts +0 -139
package/dist/bin/cli.js CHANGED
@@ -19,7 +19,37 @@ import { execWithLinePrefix, printBuildSummary, printTaskFailed, printTaskHeader
19
19
  import { exists } from "../utils/fs-utils.js";
20
20
  import { findApiRootPath, findAppRootPath } from "../utils/utils.js";
21
21
  import { API_ARTIFACTS, WEB_ARTIFACTS } from "./build-config.js";
22
+ import { fixtureExploreCommand, fixtureFetchCommand, fixtureGenCommand } from "./fixture.js";
22
23
  let migrator;
24
+ /**
25
+ * CLI 옵션을 파싱하는 헬퍼 함수
26
+ */ function parseCliOptions(argv = process.argv) {
27
+ const flags = new Set();
28
+ const options = {};
29
+ for(let i = 0; i < argv.length; i++){
30
+ const arg = argv[i];
31
+ if (!arg.startsWith("--")) continue;
32
+ // --option=value 형식
33
+ if (arg.includes("=")) {
34
+ const [key, value] = arg.slice(2).split("=");
35
+ options[key] = value;
36
+ continue;
37
+ }
38
+ // --option value 형식인지 확인
39
+ const nextArg = argv[i + 1];
40
+ if (nextArg && !nextArg.startsWith("--") && !nextArg.startsWith("-")) {
41
+ options[arg.slice(2)] = nextArg;
42
+ i++; // 다음 arg는 값이므로 스킵
43
+ } else {
44
+ // --flag 형식
45
+ flags.add(arg.slice(2));
46
+ }
47
+ }
48
+ return {
49
+ flags,
50
+ options
51
+ };
52
+ }
23
53
  async function bootstrap() {
24
54
  const notToInit = [
25
55
  "dev",
@@ -33,23 +63,41 @@ async function bootstrap() {
33
63
  try {
34
64
  // tsicli는 정확한 명령어 매칭만 지원하므로, --로 시작하는 옵션과 그 값을 필터링합니다.
35
65
  // 옵션 파싱은 각 runner 함수에서 원본 process.argv를 사용하여 수행합니다.
66
+ // "--"(bare double dash)는 passthrough 구분자이므로, 그 뒤의 모든 인자도 제외합니다.
36
67
  const filteredArgv = [];
37
68
  let skipNext = false;
38
- for (const arg of process.argv){
69
+ let afterDoubleDash = false;
70
+ for(let i = 0; i < process.argv.length; i++){
71
+ const arg = process.argv[i];
72
+ if (arg === "--") {
73
+ afterDoubleDash = true;
74
+ continue;
75
+ }
76
+ if (afterDoubleDash) continue;
39
77
  if (skipNext) {
40
78
  skipNext = false;
41
79
  continue;
42
80
  }
43
81
  if (arg.startsWith("--")) {
44
82
  // --option=value 형식은 이 arg만 스킵
45
- // --option value 형식은 다음 arg 스킵
46
- if (!arg.includes("=")) {
83
+ if (arg.includes("=")) {
84
+ continue;
85
+ }
86
+ // --option value 형식인지 확인: 다음 arg가 --로 시작하지 않으면 값이 있는 것
87
+ const nextArg = process.argv[i + 1];
88
+ if (nextArg && !nextArg.startsWith("--") && !nextArg.startsWith("-")) {
47
89
  skipNext = true;
48
90
  }
49
91
  continue;
50
92
  }
51
93
  filteredArgv.push(arg);
52
94
  }
95
+ // build/dev 명령어가 서브커맨드 없이 호출될 때 "all"을 기본값으로 추가합니다.
96
+ // 예: `sonamu build` → `sonamu build all`, `sonamu dev` → `sonamu dev all`
97
+ const cmd = filteredArgv[2];
98
+ if ((cmd === "build" || cmd === "dev") && filteredArgv.length === 3) {
99
+ filteredArgv.push("all");
100
+ }
53
101
  await tsicli(filteredArgv, {
54
102
  types: {
55
103
  "#entityId": {
@@ -102,6 +150,18 @@ async function bootstrap() {
102
150
  "fixture",
103
151
  "sync"
104
152
  ],
153
+ [
154
+ "fixture",
155
+ "gen"
156
+ ],
157
+ [
158
+ "fixture",
159
+ "fetch"
160
+ ],
161
+ [
162
+ "fixture",
163
+ "explore"
164
+ ],
105
165
  [
106
166
  "migrate",
107
167
  "run"
@@ -145,14 +205,37 @@ async function bootstrap() {
145
205
  "view_form",
146
206
  "#entityId"
147
207
  ],
208
+ [
209
+ "cone",
210
+ "gen",
211
+ "#entityId"
212
+ ],
148
213
  [
149
214
  "sync"
150
215
  ],
151
216
  [
152
- "dev"
217
+ "build",
218
+ "all"
219
+ ],
220
+ [
221
+ "build",
222
+ "api"
223
+ ],
224
+ [
225
+ "build",
226
+ "web"
227
+ ],
228
+ [
229
+ "dev",
230
+ "all"
231
+ ],
232
+ [
233
+ "dev",
234
+ "api"
153
235
  ],
154
236
  [
155
- "build"
237
+ "dev",
238
+ "web"
156
239
  ],
157
240
  [
158
241
  "start"
@@ -178,15 +261,23 @@ async function bootstrap() {
178
261
  fixture_init,
179
262
  fixture_import,
180
263
  fixture_sync,
264
+ fixture_gen,
265
+ fixture_fetch,
266
+ fixture_explore,
181
267
  stub_practice,
182
268
  stub_entity,
183
269
  scaffold_model,
184
270
  scaffold_model_test,
185
271
  // scaffold_view_list,
186
272
  // scaffold_view_form,
273
+ cone_gen,
187
274
  sync,
188
- dev,
189
- build,
275
+ build_all,
276
+ build_api,
277
+ build_web,
278
+ dev_all,
279
+ dev_api,
280
+ dev_web,
190
281
  start,
191
282
  skills_sync,
192
283
  skills_create,
@@ -207,8 +298,8 @@ bootstrap().finally(async ()=>{
207
298
  await Sonamu.syncer.sync();
208
299
  }
209
300
  /**
210
- * pnpm dev 하면 실행되는 함수입니다.
211
- * 프로젝트에 대해 HMR 지원하는 개발 서버를 띄워줍니다.
301
+ * API 개발 서버를 실행하는 공통 로직입니다.
302
+ * dev_all과 dev_api에서 공유합니다.
212
303
  *
213
304
  * TypeScript를 바로 실행할 수 있도록 @sonamu-kit/ts-loader를,
214
305
  * HMR을 지원하기 위해 @sonamu-kit/hmr-hook을 import하며,
@@ -217,12 +308,9 @@ bootstrap().finally(async ()=>{
217
308
  * 이때 @sonamu-kit/ts-loader와 @sonamu-kit/hmr-hook는 sonamu가 자체적으로 가지고 있는 dependency입니다.
218
309
  * 또한 실행에 사용하는 @sonamu-kit/hmr-runner도 마찬가지로 sonamu가 자체적으로 가지고 있는 dependency입니다.
219
310
  * 따라서 사용자 프로젝트에서는 이 세 패키지를 직접 설치할 필요가 없습니다.
220
- *
221
- * Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
222
- */ async function dev() {
311
+ */ function spawnApiDevServer(options) {
223
312
  const apiRoot = findApiRootPath();
224
313
  const entryPoint = "src/index.ts";
225
- console.log(chalk.yellow.bold("🚀 Starting Sonamu dev server...\n"));
226
314
  // 이 sonamu 패키지가 dependencies로 가지고 있는 @sonamu-kit/hmr-runner의 bin/run.js를 사용합니다.
227
315
  // 이 경로(/bin/run.js)는 @sonamu-kit/hmr-runner의 package.json의 bin 필드에 명시되어 있는 그것과 같습니다.
228
316
  const hotRunnerBinPath = createRequire(import.meta.url).resolve("@sonamu-kit/hmr-runner/bin/run.js");
@@ -244,7 +332,8 @@ bootstrap().finally(async ()=>{
244
332
  ...process.env,
245
333
  NODE_ENV: "development",
246
334
  HOT: "yes",
247
- API_ROOT_PATH: apiRoot
335
+ API_ROOT_PATH: apiRoot,
336
+ ...options?.extraEnv
248
337
  }
249
338
  });
250
339
  // 종료 처리
@@ -257,31 +346,82 @@ bootstrap().finally(async ()=>{
257
346
  process.on("SIGTERM", cleanup);
258
347
  serverProcess.on("exit", (code)=>{
259
348
  if (code !== 0) {
260
- console.error(chalk.red(`❌ Server exited with code ${code}`));
349
+ console.error(chalk.red(`Server exited with code ${code}`));
261
350
  process.exit(code || 1);
262
351
  }
263
352
  });
264
353
  }
265
354
  /**
266
- * pnpm build 하면 실행되는 함수입니다.
267
- * 프로젝트를 빌드합니다.
355
+ * pnpm dev / pnpm dev all 하면 실행되는 함수입니다.
356
+ * 프로젝트에 대해 HMR 지원하는 개발 서버를 띄워줍니다.
268
357
  *
269
- * 빌드에 필요한 .swcrc는 프로젝트 루트에서 찾고, 없으면 sonamu가 관리하는 .swcrc.project-default를 사용합니다.
358
+ * Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
359
+ */ function dev_all() {
360
+ console.log(chalk.yellow.bold("Starting Sonamu dev server...\n"));
361
+ spawnApiDevServer();
362
+ }
363
+ /**
364
+ * pnpm dev api 하면 실행되는 함수입니다.
365
+ * API 전용 개발 서버를 띄웁니다.
366
+ * dev_all과 거의 동일하되, 통합 웹 서버를 비활성화합니다.
270
367
  *
271
- * 실제 빌드 타겟(아티팩트)과 동작은 build-config.ts에 정의되어 있습니다.
272
- * 함수는 build-config.ts에 정의된 동작들을 실행해주는 역할만 합니다.
368
+ * Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
369
+ */ function dev_api() {
370
+ console.log(chalk.yellow.bold("Starting Sonamu API-only dev server...\n"));
371
+ spawnApiDevServer({
372
+ extraEnv: {
373
+ SONAMU_DISABLE_INTEGRATED_WEB: "yes"
374
+ }
375
+ });
376
+ }
377
+ /**
378
+ * pnpm dev web 하면 실행되는 함수입니다.
379
+ * Vite 개발 서버를 단독으로 실행합니다.
380
+ * -- 뒤의 인자는 Vite에 그대로 전달됩니다.
273
381
  *
274
382
  * Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
275
- */ async function build() {
383
+ */ async function dev_web() {
276
384
  const appRoot = findAppRootPath();
277
- // .swcrc 파일을 지정합니다.
385
+ const webPath = path.join(appRoot, "web");
386
+ if (!await exists(webPath)) {
387
+ console.error(`web 디렉토리를 찾을 수 없습니다: ${webPath}`);
388
+ process.exit(1);
389
+ }
390
+ // -- 뒤의 인자 추출
391
+ const doubleDashIndex = process.argv.indexOf("--");
392
+ const passthroughArgs = doubleDashIndex !== -1 ? process.argv.slice(doubleDashIndex + 1) : [];
393
+ const viteArgs = [
394
+ "exec",
395
+ "vite",
396
+ ...passthroughArgs
397
+ ];
398
+ console.log(chalk.yellow.bold("Starting Vite dev server...\n"));
399
+ const viteProcess = spawn("pnpm", viteArgs, {
400
+ cwd: webPath,
401
+ stdio: "inherit"
402
+ });
403
+ viteProcess.on("exit", (code)=>{
404
+ process.exit(code ?? 0);
405
+ });
406
+ // SIGINT/SIGTERM 시 Vite 프로세스를 gracefully 종료합니다.
407
+ for (const signal of [
408
+ "SIGINT",
409
+ "SIGTERM"
410
+ ]){
411
+ process.on(signal, ()=>{
412
+ viteProcess.kill(signal);
413
+ });
414
+ }
415
+ }
416
+ /**
417
+ * SWC 설정 파일 경로를 결정합니다. API 빌드(SWC)에서만 사용됩니다.
418
+ * 프로젝트 루트에 .swcrc가 있으면 그것을, 없으면 sonamu 기본 설정을 사용합니다.
419
+ */ async function resolveSwcConfigPath() {
278
420
  let swcFilePath = ".swcrc";
279
421
  try {
280
422
  if (await exists(swcFilePath)) {
281
- // 사용자 프로젝트에 .swcrc가 있으면 우선으로 사용합니다.
282
423
  console.log(chalk.dim("Using .swcrc from project root..."));
283
424
  } else {
284
- // 아니라면 sonamu가 관리하는 .swcrc.project-default를 가져다 씁니다.
285
425
  console.log(chalk.dim("Using default .swcrc from sonamu package..."));
286
426
  swcFilePath = path.join(import.meta.dirname, "..", "..", ".swcrc.project-default");
287
427
  }
@@ -289,7 +429,25 @@ bootstrap().finally(async ()=>{
289
429
  console.error(chalk.red("Setting up swc config file failed."), error);
290
430
  process.exit(1);
291
431
  }
292
- // API 프로젝트를 빌드합니다.
432
+ return swcFilePath;
433
+ }
434
+ /**
435
+ * sonamu build / sonamu build all 하면 실행되는 함수입니다.
436
+ * build_api + build_web의 합성입니다. Web 디렉토리가 없으면 Web 빌드를 스킵합니다.
437
+ */ async function build_all() {
438
+ await build_api();
439
+ await build_web({
440
+ skipIfMissing: true
441
+ });
442
+ }
443
+ /**
444
+ * pnpm build api 하면 실행되는 함수입니다.
445
+ * API 프로젝트만 빌드합니다.
446
+ *
447
+ * Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
448
+ */ async function build_api() {
449
+ const appRoot = findAppRootPath();
450
+ const swcFilePath = await resolveSwcConfigPath();
293
451
  const apiStartedAt = Date.now();
294
452
  try {
295
453
  for (const artifact of API_ARTIFACTS){
@@ -303,11 +461,28 @@ bootstrap().finally(async ()=>{
303
461
  });
304
462
  }
305
463
  printBuildSummary("API", true, Date.now() - apiStartedAt);
306
- } catch {
464
+ } catch (e) {
307
465
  printBuildSummary("API", false, Date.now() - apiStartedAt);
466
+ console.error(e);
467
+ process.exit(1);
468
+ }
469
+ }
470
+ /**
471
+ * pnpm build web 하면 실행되는 함수입니다.
472
+ * Web 프로젝트만 빌드합니다.
473
+ *
474
+ * Sonamu.init 없이 호출될 것을 상정하여 구현되었습니다.
475
+ */ async function build_web({ skipIfMissing = false } = {}) {
476
+ const appRoot = findAppRootPath();
477
+ const webPath = path.join(appRoot, "web");
478
+ if (!await exists(webPath)) {
479
+ if (skipIfMissing) {
480
+ console.log(chalk.gray("Web 디렉토리가 없으므로 Web 빌드를 건너뜁니다."));
481
+ return;
482
+ }
483
+ console.error(`web 디렉토리를 찾을 수 없습니다: ${webPath}`);
308
484
  process.exit(1);
309
485
  }
310
- // Web 프로젝트를 빌드합니다.
311
486
  const webStartedAt = Date.now();
312
487
  try {
313
488
  for (const artifact of WEB_ARTIFACTS){
@@ -319,8 +494,9 @@ bootstrap().finally(async ()=>{
319
494
  });
320
495
  }
321
496
  printBuildSummary("Web", true, Date.now() - webStartedAt);
322
- } catch {
497
+ } catch (e) {
323
498
  printBuildSummary("Web", false, Date.now() - webStartedAt);
499
+ console.error(e);
324
500
  process.exit(1);
325
501
  }
326
502
  }
@@ -351,9 +527,11 @@ bootstrap().finally(async ()=>{
351
527
  cwd: options.cwd
352
528
  });
353
529
  printTaskSuccess(step.name, isLast);
354
- } catch {
530
+ } catch (e) {
355
531
  printTaskFailed(step.name, isLast);
356
- throw new Error(`${step.name} failed`);
532
+ throw new Error(`${step.name} failed`, {
533
+ cause: e
534
+ });
357
535
  }
358
536
  }
359
537
  }
@@ -370,7 +548,7 @@ bootstrap().finally(async ()=>{
370
548
  const entryPoint = "dist/index.js";
371
549
  if (!await exists(entryPoint)) {
372
550
  console.log(chalk.red(`${entryPoint} not found. Please build your project first.`));
373
- console.log(chalk.blue("Run: yarn sonamu build"));
551
+ console.log(chalk.blue("Run: pnpm sonamu build"));
374
552
  return;
375
553
  }
376
554
  const { spawn } = await import("child_process");
@@ -492,6 +670,64 @@ async function fixture_sync() {
492
670
  await setupFixtureManager();
493
671
  await FixtureManager.sync();
494
672
  }
673
+ /**
674
+ * fixture gen 명령어
675
+ * 옵션을 process.argv에서 파싱
676
+ */ async function fixture_gen() {
677
+ const options = parseOptions(process.argv);
678
+ await fixtureGenCommand(options);
679
+ }
680
+ /**
681
+ * fixture fetch 명령어
682
+ * 옵션을 process.argv에서 파싱
683
+ */ async function fixture_fetch() {
684
+ const options = parseOptions(process.argv);
685
+ await fixtureFetchCommand(options);
686
+ }
687
+ /**
688
+ * fixture explore 명령어
689
+ * 옵션을 process.argv에서 파싱
690
+ */ async function fixture_explore() {
691
+ const options = parseOptions(process.argv);
692
+ await fixtureExploreCommand(options);
693
+ }
694
+ /**
695
+ * 간단한 옵션 파서
696
+ */ function parseOptions(argv) {
697
+ const options = {
698
+ _: []
699
+ };
700
+ for(let i = 0; i < argv.length; i++){
701
+ const arg = argv[i];
702
+ if (arg.startsWith("--")) {
703
+ const key = arg.slice(2);
704
+ if (key.includes("=")) {
705
+ const [k, v] = key.split("=");
706
+ options[k] = v;
707
+ } else {
708
+ const next = argv[i + 1];
709
+ if (next && !next.startsWith("--")) {
710
+ options[key] = next;
711
+ i++;
712
+ } else {
713
+ options[key] = true;
714
+ }
715
+ }
716
+ } else if (arg.startsWith("-")) {
717
+ const key = arg.slice(1);
718
+ const next = argv[i + 1];
719
+ if (next && !next.startsWith("-")) {
720
+ options[key] = next;
721
+ i++;
722
+ } else {
723
+ options[key] = true;
724
+ }
725
+ } else {
726
+ options._.push(arg);
727
+ }
728
+ }
729
+ return options;
730
+ }
495
731
  async function stub_practice(name) {
496
732
  const practiceDir = path.join(Sonamu.apiRootPath, "src", "practices");
497
733
  const fileNames = await readdir(practiceDir);
@@ -538,6 +774,138 @@ async function stub_entity(entityId) {
538
774
  entityId,
539
775
  title: entityId
540
776
  });
777
+ const { flags } = parseCliOptions();
778
+ const useAI = flags.has("ai");
779
+ const noCones = flags.has("no-cones");
780
+ // --no-cones: cone 생성 스킵
781
+ if (noCones) {
782
+ console.log(`✓ Entity '${entityId}' created without cones`);
783
+ return;
784
+ }
785
+ const { EntityManager } = await import("../entity/entity-manager.js");
786
+ const entity = EntityManager.get(entityId);
787
+ if (!entity) {
788
+ console.error(`Entity not found: ${entityId}`);
789
+ return;
790
+ }
791
+ // --ai: LLM으로 cone 생성
792
+ if (useAI) {
793
+ console.log(`✓ Entity '${entityId}' created`);
794
+ console.log(`🌟 Generating AI-powered cones...`);
795
+ try {
796
+ const configLocale = Sonamu.config.i18n?.defaultLocale;
797
+ const locale = configLocale === "ko" || configLocale === "en" || configLocale === "ja" ? configLocale : "ko";
798
+ const result = await entity.generateCones({
799
+ preserveExisting: false,
800
+ onlyEmpty: false,
801
+ locale
802
+ });
803
+ console.log(`✅ Done (${result.tokensUsed} tokens)`);
804
+ } catch (error) {
805
+ if (error instanceof Error && error.message.includes("ANTHROPIC_API_KEY")) {
806
+ console.error(`\n❌ ${error.message}`);
807
+ console.error(`\n💡 Remove --ai flag to use template cones instead`);
808
+ } else {
809
+ throw error;
810
+ }
811
+ }
812
+ return;
813
+ }
814
+ // 기본: 템플릿 cone 자동 생성
815
+ // LLM 없이 faker-mappings.ts를 활용하여 기본 cone 메타데이터를 생성합니다.
816
+ // 이를 통해 ANTHROPIC_API_KEY가 없어도 Sonamu를 사용할 수 있으며,
817
+ // 생성된 템플릿 cone은 나중에 'cone gen' 명령어로 AI를 통해 업그레이드할 수 있습니다.
818
+ console.log(`🌟 Generating template cones...`);
819
+ await entity.generateTemplateCones();
820
+ console.log(`✓ Entity '${entityId}' created with template cones`);
821
+ console.log(`💡 Tip: Run 'pnpm sonamu cone gen ${entityId}' to improve with AI`);
822
+ }
823
+ /**
824
+ * AI를 사용하여 entity의 cone 메타데이터를 생성하거나 업그레이드합니다.
825
+ *
826
+ * 옵션:
827
+ * - --regenerate: 전체 재생성 (기존 cone 덮어쓰기)
828
+ * - --locale <ko|en|ja>: 생성 언어 지정
829
+ * - 기본: onlyEmpty 모드 (기존 fixtureHint 보존)
830
+ *
831
+ * ANTHROPIC_API_KEY 필요 (sonamu.secret.ts 또는 환경변수)
832
+ */ async function cone_gen(entityId) {
833
+ const { EntityManager } = await import("../entity/entity-manager.js");
834
+ const { flags, options } = parseCliOptions();
835
+ // --all 옵션: 모든 entity cone 생성
836
+ if (flags.has("all") || entityId === "all") {
837
+ const allEntities = EntityManager.getAllEntities();
838
+ console.log(`🌟 Generating AI-powered cones for ${allEntities.length} entities...\n`);
839
+ let totalTokens = 0;
840
+ const errors = [];
841
+ for (const entity of allEntities){
842
+ try {
843
+ console.log(`Processing ${entity.id}...`);
844
+ const configLocale = options.locale || Sonamu.config.i18n?.defaultLocale;
845
+ const locale = configLocale === "ko" || configLocale === "en" || configLocale === "ja" ? configLocale : "ko";
846
+ const result = await entity.generateCones({
847
+ preserveExisting: !flags.has("regenerate"),
848
+ onlyEmpty: !flags.has("regenerate"),
849
+ locale
850
+ });
851
+ totalTokens += result.tokensUsed;
852
+ console.log(` ✓ ${entity.id} (${result.tokensUsed} tokens)\n`);
853
+ } catch (error) {
854
+ const message = error instanceof Error ? error.message : "Unknown error";
855
+ errors.push(`${entity.id}: ${message}`);
856
+ console.error(` ✗ ${entity.id}: ${message}\n`);
857
+ }
858
+ }
859
+ console.log(`\n✅ Done! Total: ${totalTokens} tokens used`);
860
+ const estimatedCost = totalTokens * 9 / 1_000_000;
861
+ console.log(`💰 Estimated cost: ~$${estimatedCost.toFixed(4)}`);
862
+ if (errors.length > 0) {
863
+ console.error(`\n❌ Failed entities (${errors.length}):`);
864
+ for (const err of errors){
865
+ console.error(` - ${err}`);
866
+ }
867
+ }
868
+ return;
869
+ }
870
+ // 단일 entity cone 생성
871
+ const entity = EntityManager.get(entityId);
872
+ if (!entity) {
873
+ console.error(`Entity not found: ${entityId}`);
874
+ return;
875
+ }
876
+ const mode = flags.has("regenerate") ? "regenerating" : "generating";
877
+ console.log(`🌟 ${mode === "regenerating" ? "Regenerating" : "Generating"} AI-powered cones for ${entityId}...`);
878
+ try {
879
+ const configLocale = options.locale || Sonamu.config.i18n?.defaultLocale;
880
+ const locale = configLocale === "ko" || configLocale === "en" || configLocale === "ja" ? configLocale : "ko";
881
+ const result = await entity.generateCones({
882
+ preserveExisting: !flags.has("regenerate"),
883
+ onlyEmpty: !flags.has("regenerate"),
884
+ locale
885
+ });
886
+ console.log(`✅ Done! (${result.tokensUsed} tokens used)`);
887
+ // 토큰 비용 계산 (대략적인 추정)
888
+ // Claude Sonnet 4.5: input $3/M tokens, output $15/M tokens
889
+ // 간단하게 평균 $9/M tokens로 계산
890
+ const estimatedCost = result.tokensUsed * 9 / 1_000_000;
891
+ console.log(`💰 Estimated cost: ~$${estimatedCost.toFixed(4)}`);
892
+ } catch (error) {
893
+ if (error instanceof Error) {
894
+ if (error.message.includes("ANTHROPIC_API_KEY")) {
895
+ console.error(`\n❌ ${error.message}`);
896
+ console.error(`\n💡 To use AI-powered cone generation:`);
897
+ console.error(` 1. Get an API key from https://console.anthropic.com/`);
898
+ console.error(` 2. Add it to sonamu.secret.ts or set ANTHROPIC_API_KEY environment variable`);
899
+ } else if (error.message.includes("Rate limit")) {
900
+ console.error(`\n❌ ${error.message}`);
901
+ console.error(`\n💡 Please wait a moment and try again.`);
902
+ } else {
903
+ console.error(`\n❌ Failed to generate cones: ${error.message}`);
904
+ }
905
+ } else {
906
+ console.error(`\n❌ Failed to generate cones: Unknown error`);
907
+ }
908
+ }
541
909
  }
542
910
  async function scaffold_model(entityId) {
543
911
  await Sonamu.syncer.generateTemplate("model", {
@@ -596,6 +964,23 @@ async function scaffold_model_test(entityId) {
596
964
  throw copyError;
597
965
  }
598
966
  }
967
+ // project 디렉토리 초기화 (없으면 생성, 있으면 유지)
968
+ const sourceProjectDir = path.join(sourceBase, "project");
969
+ const targetProjectDir = path.join(claudeDir, "skills", "project");
970
+ if (await exists(sourceProjectDir)) {
971
+ if (!await exists(targetProjectDir)) {
972
+ try {
973
+ await cp(sourceProjectDir, targetProjectDir, {
974
+ recursive: true
975
+ });
976
+ console.log(chalk.green(`✓ Project templates initialized`));
977
+ } catch (error) {
978
+ console.error(chalk.red(`✗ Failed to initialize project templates: ${error instanceof Error ? error.message : String(error)}`));
979
+ }
980
+ } else {
981
+ console.log(chalk.dim(`⏭ Project templates already exist (preserved)`));
982
+ }
983
+ }
599
984
  // CLAUDE.md 복사/업데이트
600
985
  if (await exists(sourceClaudeMd)) {
601
986
  try {
@@ -790,4 +1175,4 @@ status: draft
790
1175
  return findAppRootPath();
791
1176
  }
792
1177
 
793
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgZXhlY1N5bmMsIHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGNwLCBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzeW1saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XG5pbXBvcnQgeyB0c2ljbGkgfSBmcm9tIFwidHNpY2xpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyB9IGZyb20gXCIuLi9hdXRoL2F1dGgtZ2VuZXJhdG9yXCI7XG5pbXBvcnQge1xuICB0eXBlIEJldHRlckF1dGhQbHVnaW5JZCxcbiAgaXNWYWxpZFBsdWdpbklkLFxuICBTVVBQT1JURURfUExVR0lOX0lEUyxcbn0gZnJvbSBcIi4uL2F1dGgvcGx1Z2lucy9lbnRpdHktZGVmaW5pdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBleGVjV2l0aExpbmVQcmVmaXgsXG4gIHByaW50QnVpbGRTdW1tYXJ5LFxuICBwcmludFRhc2tGYWlsZWQsXG4gIHByaW50VGFza0hlYWRlcixcbiAgcHJpbnRUYXNrU3RhcnQsXG4gIHByaW50VGFza1N1Y2Nlc3MsXG59IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoLCBmaW5kQXBwUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IEFQSV9BUlRJRkFDVFMsIHR5cGUgQnVpbGRBcnRpZmFjdCwgV0VCX0FSVElGQUNUUyB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuXG5sZXQgbWlncmF0b3I6IE1pZ3JhdG9yO1xuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gIGNvbnN0IG5vdFRvSW5pdCA9IFtcImRldlwiLCBcImJ1aWxkXCIsIFwic3RhcnRcIiwgXCJza2lsbHNcIl0uaW5jbHVkZXMocHJvY2Vzcy5hcmd2WzJdID8/IFwiXCIpO1xuICBpZiAoIW5vdFRvSW5pdCkge1xuICAgIGF3YWl0IFNvbmFtdS5pbml0KGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIHRzaWNsaeuKlCDsoJXtmZXtlZwg66qF66C57Ja0IOunpOy5reunjCDsp4Dsm5DtlZjrr4DroZwsIC0t66GcIOyLnOyeke2VmOuKlCDsmLXshZjqs7wg6re4IOqwkuydhCDtlYTthLDrp4Htlanri4jri6QuXG4gICAgLy8g7Ji17IWYIO2MjOyLseydgCDqsIEgcnVubmVyIO2VqOyImOyXkOyEnCDsm5Drs7ggcHJvY2Vzcy5hcmd266W8IOyCrOyaqe2VmOyXrCDsiJjtlontlanri4jri6QuXG4gICAgY29uc3QgZmlsdGVyZWRBcmd2OiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBza2lwTmV4dCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgYXJnIG9mIHByb2Nlc3MuYXJndikge1xuICAgICAgaWYgKHNraXBOZXh0KSB7XG4gICAgICAgIHNraXBOZXh0ID0gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKFwiLS1cIikpIHtcbiAgICAgICAgLy8gLS1vcHRpb249dmFsdWUg7ZiV7Iud7J2AIOydtCBhcmfrp4wg7Iqk7YK1XG4gICAgICAgIC8vIC0tb3B0aW9uIHZhbHVlIO2YleyLneydgCDri6TsnYwgYXJn64+EIOyKpO2CtVxuICAgICAgICBpZiAoIWFyZy5pbmNsdWRlcyhcIj1cIikpIHtcbiAgICAgICAgICBza2lwTmV4dCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmaWx0ZXJlZEFyZ3YucHVzaChhcmcpO1xuICAgIH1cbiAgICBhd2FpdCB0c2ljbGkoZmlsdGVyZWRBcmd2LCB7XG4gICAgICB0eXBlczoge1xuICAgICAgICBcIiNlbnRpdHlJZFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJhdXRvY29tcGxldGVcIixcbiAgICAgICAgICBuYW1lOiBcIiNlbnRpdHlJZFwiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiUGxlYXNlIGlucHV0ICNlbnRpdHlJZFwiLFxuICAgICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsUGFyZW50SWRzKCkubWFwKChlbnRpdHlJZCkgPT4gKHtcbiAgICAgICAgICAgIHRpdGxlOiBlbnRpdHlJZCxcbiAgICAgICAgICAgIHZhbHVlOiBlbnRpdHlJZCxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICAgIFwiI3JlY29yZElkc1wiOiBcIm51bWJlcltdXCIsXG4gICAgICAgIFwiI25hbWVcIjogXCJzdHJpbmdcIixcbiAgICAgICAgXCIjdGFyZ2V0c1wiOiB7XG4gICAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICAgIG5hbWU6IFwiI3RhcmdldHNcIixcbiAgICAgICAgICBtZXNzYWdlOiBcIlBsZWFzZSBpbnB1dCAjdGFyZ2V0c1wiLFxuICAgICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiRGV2ZWxvcG1lbnRcIiwgdmFsdWU6IFwiZGV2ZWxvcG1lbnRfbWFzdGVyXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiUHJvZHVjdGlvblwiLCB2YWx1ZTogXCJwcm9kdWN0aW9uX21hc3RlclwiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIkZpeHR1cmVcIiwgdmFsdWU6IFwiZml4dHVyZVwiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIlRlc3RcIiwgdmFsdWU6IFwidGVzdFwiIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhcmdzOiBbXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJpbml0XCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiaW1wb3J0XCIsIFwiI2VudGl0eUlkXCIsIFwiI3JlY29yZElkc1wiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcInN5bmNcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJydW5cIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJhcHBseVwiLCBcIiN0YXJnZXRzXCJdLFxuICAgICAgICBbXCJtaWdyYXRlXCIsIFwic3RhdHVzXCJdLFxuICAgICAgICBbXCJzdHViXCIsIFwicHJhY3RpY2VcIiwgXCIjbmFtZVwiXSxcbiAgICAgICAgW1wic3R1YlwiLCBcImVudGl0eVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsX3Rlc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwidmlld19saXN0XCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfZm9ybVwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic3luY1wiXSxcbiAgICAgICAgW1wiZGV2XCJdLFxuICAgICAgICBbXCJidWlsZFwiXSxcbiAgICAgICAgW1wic3RhcnRcIl0sXG4gICAgICAgIFtcInNraWxsc1wiLCBcInN5bmNcIl0sXG4gICAgICAgIFtcInNraWxsc1wiLCBcImNyZWF0ZVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJhdXRoXCIsIFwiZ2VuZXJhdGVcIl0sXG4gICAgICBdLFxuICAgICAgcnVubmVyczoge1xuICAgICAgICBtaWdyYXRlX3N0YXR1cyxcbiAgICAgICAgbWlncmF0ZV9ydW4sXG4gICAgICAgIG1pZ3JhdGVfYXBwbHksXG4gICAgICAgIGZpeHR1cmVfaW5pdCxcbiAgICAgICAgZml4dHVyZV9pbXBvcnQsXG4gICAgICAgIGZpeHR1cmVfc3luYyxcbiAgICAgICAgc3R1Yl9wcmFjdGljZSxcbiAgICAgICAgc3R1Yl9lbnRpdHksXG4gICAgICAgIHNjYWZmb2xkX21vZGVsLFxuICAgICAgICBzY2FmZm9sZF9tb2RlbF90ZXN0LFxuICAgICAgICAvLyBzY2FmZm9sZF92aWV3X2xpc3QsXG4gICAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfZm9ybSxcbiAgICAgICAgc3luYyxcbiAgICAgICAgZGV2LFxuICAgICAgICBidWlsZCxcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIHNraWxsc19zeW5jLFxuICAgICAgICBza2lsbHNfY3JlYXRlLFxuICAgICAgICBhdXRoX2dlbmVyYXRlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBTb25hbXUuZGVzdHJveSgpO1xuICB9XG59XG5cbmJvb3RzdHJhcCgpLmZpbmFsbHkoYXN5bmMgKCkgPT4ge1xuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5kZXN0cm95KCk7XG59KTtcblxuLyoqXG4gKiBwbnBtIHN5bmMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjrpbwg7Iux7YGs7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBzeW5jKCkge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLnN5bmMoKTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOyXkCDrjIDtlbQgSE1SIOyngOybkO2VmOuKlCDqsJzrsJwg7ISc67KE66W8IOudhOybjOykjeuLiOuLpC5cbiAqXG4gKiBUeXBlU2NyaXB066W8IOuwlOuhnCDsi6TtlontlaAg7IiYIOyeiOuPhOuhnSBAc29uYW11LWtpdC90cy1sb2FkZXLrpbwsXG4gKiBITVLsnYQg7KeA7JuQ7ZWY6riwIOychO2VtCBAc29uYW11LWtpdC9obXItaG9va+ydhCBpbXBvcnTtlZjrqbAsXG4gKiDshozsiqTrp7Ug7KeA7JuQ7J2EIOychO2VtCAtLWVuYWJsZS1zb3VyY2UtbWFwcyDtlIzrnpjqt7jrpbwg7Y+s7ZWo7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiDsnbTrlYwgQHNvbmFtdS1raXQvdHMtbG9hZGVy7JmAIEBzb25hbXUta2l0L2htci1ob29r64qUIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65iQ7ZWcIOyLpO2WieyXkCDsgqzsmqntlZjripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuuPhCDrp4jssKzqsIDsp4DroZwgc29uYW116rCAIOyekOyytOyggeycvOuhnCDqsIDsp4Dqs6Ag7J6I64qUIGRlcGVuZGVuY3nsnoXri4jri6QuXG4gKiDrlLDrnbzshJwg7IKs7Jqp7J6QIO2UhOuhnOygne2KuOyXkOyEnOuKlCDsnbQg7IS4IO2MqO2CpOyngOulvCDsp4HsoJEg7ISk7LmY7ZWgIO2VhOyalOqwgCDsl4bsirXri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGV2KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcInNyYy9pbmRleC50c1wiO1xuXG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKFwi8J+agCBTdGFydGluZyBTb25hbXUgZGV2IHNlcnZlci4uLlxcblwiKSk7XG5cbiAgLy8g7J20IHNvbmFtdSDtjKjtgqTsp4DqsIAgZGVwZW5kZW5jaWVz66GcIOqwgOyngOqzoCDsnojripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuydmCBiaW4vcnVuLmpz66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAgLy8g7J20IOqyveuhnCgvYmluL3J1bi5qcynripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuydmCBwYWNrYWdlLmpzb27snZggYmluIO2VhOuTnOyXkCDrqoXsi5zrkJjslrQg7J6I64qUIOq3uOqyg+qzvCDqsJnsirXri4jri6QuXG4gIGNvbnN0IGhvdFJ1bm5lckJpblBhdGggPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCkucmVzb2x2ZShcbiAgICBcIkBzb25hbXUta2l0L2htci1ydW5uZXIvYmluL3J1bi5qc1wiLFxuICApO1xuXG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLCAvLyBub2RlXG4gICAgW1xuICAgICAgaG90UnVubmVyQmluUGF0aCwgLy8g7J2066CH6rKMIO2VtOyEnCBob3QtcnVubmVy66W8IOyLpO2Wie2VmOq1rOyalFxuICAgICAgXCItLWNsZWFyLXNjcmVlbj1mYWxzZVwiLCAvLyDsnbTtlZggaG90LXJ1bm5lcuyXkOqyjCDrhJjqsqjspIQg7J247J6Q65Ok7J6F64uI64ukLlxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvdHMtbG9hZGVyLXJlZ2lzdGVyXCIsIC8vIFR5cGVTY3JpcHQg7ISc7Y+s7Yq466W8IOychO2VnCDroZzrjZQsXG4gICAgICBcIi0tbm9kZS1hcmdzPS0taW1wb3J0PXNvbmFtdS9obXItaG9vay1yZWdpc3RlclwiLCAvLyBITVLsnYQg7KeA7JuQ7ZWY6riwIOychO2VnCBob29rLFxuICAgICAgXCItLW5vZGUtYXJncz0tLWVuYWJsZS1zb3VyY2UtbWFwc1wiLCAvLyDqt7jrpqzqs6Ag7IaM7Iqk66e1IOyngOybkOydhCDsnITtlZwg7ZSM656Y6re47J6F64uI64ukLlxuICAgICAgXCItLW9uLWtleT1yOnJlc3RhcnQ6UmVzdGFydCBzZXJ2ZXJcIiwgLy8gciDriITrpbTrqbQg7ISc67KEIOyerOyLnOyeke2VmOqyjCDtlbTspJjsmpQuXG4gICAgICBgLS1vbi1rZXk9ZjpzaGVsbChybSAke3BhdGguam9pbihhcGlSb290LCBcInNvbmFtdS5sb2NrXCIpfSk6cmVzdGFydDpGb3JjZSByZXN0YXJ0YCwgLy8gZiDriITrpbTrqbQgc29uYW11LmxvY2sg7YyM7J287J2EIOyngOyasOqzoCDshJzrsoQg7J6s7Iuc7J6R7ZWY6rKMIO2VtOykmOyalC5cblxuICAgICAgXCItLW9uLWtleT1lbnRlcjpzaGVsbChlY2hvIGhpKTpLZXkgYmluZGluZyB0ZXN0XCIsIC8vIGVudGVy66W8IGtleeuhnCDsk7gg7IiYIOyeiOydjOydhCDrs7TsnbTquLAg7JyE7ZWcIO2FjOyKpO2KuOyeheuLiOuLpC5cbiAgICAgIFwiLS1vbi1rZXk9Y3RybCtmIGN0cmwrZjpzaGVsbChnaXQgcHVsbCAmJiBwbnBtIGluc3RhbGwgJiYgcG5wbSAtLWZpbHRlciBzb25hbXUgYnVpbGQgJiYgZWNobyAnU29uYW11IGlzIG5vdyB1cC10by1kYXRlIScpOnJlc3RhcnQ6UHVsbCAmIGluc3RhbGwgJiBidWlsZCAmIHJlc3RhcnRcIiwgLy8gbW9kaWZpZXLsmYDsnZgg7KGw7ZWpLCDqt7jrpqzqs6Ag65GQIOqwnOydmCBjaG9yZOulvCDsgqzsmqntlaAg7IiYIOyeiOydjOydhCDrs7TsnbTquLAg7JyE7ZWcIO2FjOyKpO2KuOyeheuLiOuLpC5cbiAgICAgIGVudHJ5UG9pbnQsIC8vIOuniOyngOunieycvOuhnCDsi6TsoJwg7Iuk7ZaJ7ZWgIOyKpO2BrOumve2KuOydmCDqsr3roZzrpbwg64SY6rKo7KSN64uI64ukLlxuICAgIF0sXG4gICAge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgZW52OiB7XG4gICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICBOT0RFX0VOVjogXCJkZXZlbG9wbWVudFwiLFxuICAgICAgICBIT1Q6IFwieWVzXCIsIC8vIOyWmOqwgCDsnojslrTslbwgSE1S7J20IO2ZnOyEse2ZlOuQqeuLiOuLpC5cbiAgICAgICAgQVBJX1JPT1RfUEFUSDogYXBpUm9vdCwgLy8g7J20IOqyveuhnOqwgCBobXItaG9va+ydmCDro6jtirgg65SU66CJ7Yag66as6rCAIOuQqeuLiOuLpC5cbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICAvLyDsooXro4wg7LKY66asXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwiXFxuXFxu8J+RiyBTaHV0dGluZyBkb3duLi4uXCIpKTtcbiAgICBzZXJ2ZXJQcm9jZXNzLmtpbGwoXCJTSUdURVJNXCIpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsIGNsZWFudXApO1xuICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBjbGVhbnVwKTtcblxuICBzZXJ2ZXJQcm9jZXNzLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChg4p2MIFNlcnZlciBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoY29kZSB8fCAxKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIHBucG0gYnVpbGQg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjrpbwg67mM65Oc7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOyXkCDtlYTsmpTtlZwgLnN3Y3Jj64qUIO2UhOuhnOygne2KuCDro6jtirjsl5DshJwg7LC+6rOgLCDsl4bsnLzrqbQgc29uYW116rCAIOq0gOumrO2VmOuKlCAuc3djcmMucHJvamVjdC1kZWZhdWx066W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqXG4gKiDsi6TsoJwg67mM65OcIO2DgOqynyjslYTti7DtjKntirgp6rO8IOuPmeyekeydgCBidWlsZC1jb25maWcudHPsl5Ag7KCV7J2Y65CY7Ja0IOyeiOyKteuLiOuLpC5cbiAqIOydtCDtlajsiJjripQgYnVpbGQtY29uZmlnLnRz7JeQIOygleydmOuQnCDrj5nsnpHrk6TsnYQg7Iuk7ZaJ7ZW07KO864qUIOyXre2VoOunjCDtlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGQoKSB7XG4gIGNvbnN0IGFwcFJvb3QgPSBmaW5kQXBwUm9vdFBhdGgoKTtcblxuICAvLyAuc3djcmMg7YyM7J287J2EIOyngOygle2VqeuLiOuLpC5cbiAgbGV0IHN3Y0ZpbGVQYXRoID0gXCIuc3djcmNcIjtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHN3Y0ZpbGVQYXRoKSkge1xuICAgICAgLy8g7IKs7Jqp7J6QIO2UhOuhnOygne2KuOyXkCAuc3djcmPqsIAg7J6I7Jy866m0IOyasOyEoOycvOuhnCDsgqzsmqntlanri4jri6QuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCJVc2luZyAuc3djcmMgZnJvbSBwcm9qZWN0IHJvb3QuLi5cIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDslYTri4jrnbzrqbQgc29uYW116rCAIOq0gOumrO2VmOuKlCAuc3djcmMucHJvamVjdC1kZWZhdWx066W8IOqwgOyguOuLpCDslIHri4jri6QuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCJVc2luZyBkZWZhdWx0IC5zd2NyYyBmcm9tIHNvbmFtdSBwYWNrYWdlLi4uXCIpKTtcbiAgICAgIHN3Y0ZpbGVQYXRoID0gcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcIi5zd2NyYy5wcm9qZWN0LWRlZmF1bHRcIik7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiU2V0dGluZyB1cCBzd2MgY29uZmlnIGZpbGUgZmFpbGVkLlwiKSwgZXJyb3IpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIEFQSSDtlITroZzsoJ3tirjrpbwg67mM65Oc7ZWp64uI64ukLlxuICBjb25zdCBhcGlTdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgYXJ0aWZhY3Qgb2YgQVBJX0FSVElGQUNUUykge1xuICAgICAgY29uc3QgY3dkID0gcGF0aC5qb2luKGFwcFJvb3QsIGFydGlmYWN0LnByb2plY3RQYXRoKTtcbiAgICAgIHByaW50VGFza0hlYWRlcihhcnRpZmFjdC5uYW1lLCBhcnRpZmFjdC5kZXNjcmlwdGlvbiwgY3dkKTtcblxuICAgICAgYXdhaXQgcnVuQnVpbGRTdGVwcyhhcnRpZmFjdCwgeyBjd2QsIGJ1aWxkQ29tbWFuZEFyZ3M6IHsgY29uZmlnRmlsZVBhdGg6IHN3Y0ZpbGVQYXRoIH0gfSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIHRydWUsIERhdGUubm93KCkgLSBhcGlTdGFydGVkQXQpO1xuICB9IGNhdGNoIHtcbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIkFQSVwiLCBmYWxzZSwgRGF0ZS5ub3coKSAtIGFwaVN0YXJ0ZWRBdCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gV2ViIO2UhOuhnOygne2KuOulvCDruYzrk5ztlanri4jri6QuXG4gIGNvbnN0IHdlYlN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBXRUJfQVJUSUZBQ1RTKSB7XG4gICAgICBjb25zdCBjd2QgPSBwYXRoLmpvaW4oYXBwUm9vdCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuXG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczoge30gfSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIHRydWUsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICB9IGNhdGNoIHtcbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIldlYlwiLCBmYWxzZSwgRGF0ZS5ub3coKSAtIHdlYlN0YXJ0ZWRBdCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogcHJlLWJ1aWxkLCBidWlsZCwgcG9zdC1idWlsZCDri6jqs4Trpbwg7Iic7LCo7KCB7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwczxUPihcbiAgYXJ0aWZhY3Q6IEJ1aWxkQXJ0aWZhY3Q8VD4sXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmc7IGJ1aWxkQ29tbWFuZEFyZ3M6IFQgfSxcbikge1xuICBjb25zdCBzdGVwcyA9IFtcbiAgICB7IG5hbWU6IFwicHJlLWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucHJlQnVpbGRDb21tYW5kPy4oKSB9LFxuICAgIHsgbmFtZTogXCJidWlsZFwiLCBjbWQ6IGFydGlmYWN0LmJ1aWxkQ29tbWFuZChvcHRpb25zLmJ1aWxkQ29tbWFuZEFyZ3MpIH0sXG4gICAgeyBuYW1lOiBcInBvc3QtYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5wb3N0QnVpbGRDb21tYW5kPy4oKSB9LFxuICBdLmZpbHRlcigoc3RlcCkgPT4gc3RlcC5jbWQpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGVwID0gc3RlcHNbaV07XG4gICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gc3RlcHMubGVuZ3RoIC0gMTtcblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQoc3RlcC5jbWQpO1xuICAgICAgcHJpbnRUYXNrU3RhcnQoc3RlcC5uYW1lLCBzdGVwLmNtZCwgaXNMYXN0KTtcbiAgICAgIGF3YWl0IGV4ZWNXaXRoTGluZVByZWZpeChzdGVwLmNtZCwgeyBjd2Q6IG9wdGlvbnMuY3dkIH0pO1xuICAgICAgcHJpbnRUYXNrU3VjY2VzcyhzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBwcmludFRhc2tGYWlsZWQoc3RlcC5uYW1lLCBpc0xhc3QpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3N0ZXAubmFtZX0gZmFpbGVkYCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogcG5wbSBzdGFydCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOu5jOuTnOuQnCDtlITroZzsoJ3tirjrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOuQnCDqsrDqs7zrrLwoZGlzdCDrlJTroInthqDrpqzsnZggaW5kZXguanMg7JeU7Yq466as7Y+s7J247Yq4KeydtCDsl4bri6TrqbQg7Iuk7ZaJ7J2EIOykkeuLqO2VqeuLiOuLpC5cbiAqIOyGjOyKpOuntSDsp4Dsm5Dqs7wgZG90ZW52IOyngOybkOydhCDtj6ztlajtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcImRpc3QvaW5kZXguanNcIjtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoZW50cnlQb2ludCkpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2VudHJ5UG9pbnR9IG5vdCBmb3VuZC4gUGxlYXNlIGJ1aWxkIHlvdXIgcHJvamVjdCBmaXJzdC5gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJ1bjogeWFybiBzb25hbXUgYnVpbGRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcImNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgIFtcIi0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIFwiLXJcIiwgXCJkb3RlbnYvY29uZmlnXCIsIGVudHJ5UG9pbnRdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9LFxuICApO1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBNaWdyYXRvcigpIHtcbiAgLy8gbWlncmF0b3JcbiAgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBGaXh0dXJlTWFuYWdlcigpIHtcbiAgRml4dHVyZU1hbmFnZXIuaW5pdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX2FwcGx5KHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcImFwcGx5XCIsIHRhcmdldHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3J1bigpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuICBjb25zdCBsb2NhbEhvc3RzID0gW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXTtcbiAgY29uc3QgdGFyZ2V0cyA9IE9iamVjdC5rZXlzKFNvbmFtdS5kYkNvbmZpZykuZmlsdGVyKCh0YXJnZXQpID0+IHtcbiAgICBjb25zdCB0YXJnZXRDb25maWcgPSBTb25hbXUuZGJDb25maWdbdGFyZ2V0IGFzIGtleW9mIFNvbmFtdURCQ29uZmlnXTtcbiAgICBjb25zdCBob3N0ID0gKHRhcmdldENvbmZpZz8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSk/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICByZXR1cm4gbG9jYWxIb3N0cy5pbmNsdWRlcyhob3N0LnRvTG93ZXJDYXNlKCkpO1xuICB9KTtcblxuICAvLyDroZzsu6wg642w7J207YSw67Kg7J207Iqk7JeQIOuMgO2VtOyEnOunjCDsoITssrQg66eI7J206re466CI7J207IWY7JeQ7IScIOuPmeyekVxuICBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oXCJhcHBseVwiLCB0YXJnZXRzIGFzIChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfc3RhdHVzKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG5cbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG4gIC8vIHN0YXR1cztcbiAgY29uc29sZS5sb2coc3RhdHVzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbml0KCkge1xuICBjb25zdCBzcmNDb25maWcgPSBTb25hbXUuZGJDb25maWcuZGV2ZWxvcG1lbnRfbWFzdGVyO1xuICBjb25zdCB0YXJnZXRzID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBcIihSRU1PVEUpIEZpeHR1cmUgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLmZpeHR1cmUsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIFRlc3RpbmcgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICB0b1NraXA6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZS5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgY29uc3QgbG9jYWxDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIHJldHVybiByZW1vdGVDb25uLmhvc3QgPT09IGxvY2FsQ29ubi5ob3N0ICYmIHJlbW90ZUNvbm4uZGF0YWJhc2UgPT09IGxvY2FsQ29ubi5kYXRhYmFzZTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgXSBhcyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgIHRvU2tpcD86IGJvb2xlYW47XG4gIH1bXTtcblxuICAvLyAxLiDquLDspIBEQiDsiqTtgqTrp4jrpbwg642k7ZSEXG4gIGNvbnNvbGUubG9nKFwiRFVNUC4uLlwiKTtcbiAgY29uc3QgZHVtcEZpbGVuYW1lID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm4gPSBzcmNDb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEdW1wID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC1taWdyYXRpb25zLSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgZXhlY1N5bmMoXG4gICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLWQgLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9ID4gJHtkdW1wRmlsZW5hbWV9YCxcbiAgKTtcbiAgY29uc3QgX2RiID0ga25leChzcmNDb25maWcpO1xuICBjb25zdCBbW21pZ3JhdGlvbnNdXSA9IGF3YWl0IF9kYi5yYXcoXG4gICAgXCJTRUxFQ1QgQ09VTlQoKikgYXMgY291bnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ID8gQU5EIHRhYmxlX25hbWUgPSAna25leF9taWdyYXRpb25zJ1wiLFxuICAgIFtzcmNDb25uLmRhdGFiYXNlXSxcbiAgKTtcbiAgaWYgKG1pZ3JhdGlvbnMuY291bnQgPiAwKSB7XG4gICAgZXhlY1N5bmMoXG4gICAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0ga25leF9taWdyYXRpb25zIGtuZXhfbWlncmF0aW9uc19sb2NrID4gJHttaWdyYXRpb25zRHVtcH1gLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDrjIDsg4FEQiDqsIHqsIHsl5Ag64yA7ZWY7JesIOyhtOyerOyXrOu2gCDtmZXsnbgg7ZuEIOu2k+q4sFxuICBmb3IgYXdhaXQgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbm4gPSBjb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG5cbiAgICBpZiAodG9Ta2lwID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7bGFiZWx9OiBTa2lwcGVkIWApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0ga25leCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLigoY29uZmlnLmNvbm5lY3Rpb24gPz8ge30pIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyksXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFtbcm93XV0gPSBhd2FpdCBkYi5yYXcoYFNIT1cgREFUQUJBU0VTIExJS0UgXCIke2Nvbm4uZGF0YWJhc2V9XCJgKTtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCR7bGFiZWx9OiBEYXRhYmFzZSBcIiR7Y29ubi5kYXRhYmFzZX1cIiBBbHJlYWR5IGV4aXN0c2ApKTtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTWU5DIHRvICR7bGFiZWx9Li4uYCk7XG4gICAgY29uc3QgbXlzcWxDbWQgPSBgbXlzcWwgLWgke2Nvbm4uaG9zdH0gLXUke2Nvbm4udXNlcn0gLXAke2Nvbm4ucGFzc3dvcmR9YDtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0RST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdDUkVBVEUgREFUQUJBU0UgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7ZHVtcEZpbGVuYW1lfWApO1xuICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7bWlncmF0aW9uc0R1bXB9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICB9XG5cbiAgYXdhaXQgX2RiLmRlc3Ryb3koKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgcmVjb3JkSWRzOiBudW1iZXJbXSkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShlbnRpdHlJZCwgcmVjb3JkSWRzKTtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX3N5bmMoKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfcHJhY3RpY2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByYWN0aWNlRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJwcmFjdGljZXNcIik7XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXIpO1xuXG4gIGNvbnN0IG1heFNlcU5vID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocHJhY3RpY2VEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkU2VxcyA9IGZpbGVOYW1lc1xuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IGZpbGVOYW1lLnN0YXJ0c1dpdGgoXCJwXCIpICYmIGZpbGVOYW1lLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgWywgc2VxTm9dID0gZmlsZU5hbWUubWF0Y2goL15wKFswLTldKyktLykgPz8gW1wiMFwiLCBcIjBcIl07XG4gICAgICAgIHJldHVybiBwYXJzZUludChzZXFObyk7XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcblxuICAgIGlmIChmaWx0ZXJlZFNlcXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkU2Vxc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSkoKTtcblxuICBjb25zdCBjdXJyZW50U2VxTm8gPSBtYXhTZXFObyArIDE7XG4gIGNvbnN0IGZpbGVOYW1lID0gYHAke2N1cnJlbnRTZXFOb30tJHtuYW1lfS50c2A7XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4ocHJhY3RpY2VEaXIsIGZpbGVOYW1lKTtcblxuICBjb25zdCBjb2RlID0gW1xuICAgIGBpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICBcIlwiLFxuICAgIGBjb25zb2xlLmNsZWFyKCk7YCxcbiAgICBgY29uc29sZS5sb2coXCIke2ZpbGVOYW1lfVwiKTtgLFxuICAgIFwiXCIsXG4gICAgYFNvbmFtdS5ydW5TY3JpcHQoYXN5bmMgKCkgPT4ge2AsXG4gICAgYCAvLyBUT0RPYCxcbiAgICBgfSk7YCxcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZShkc3RQYXRoLCBjb2RlKTtcblxuICBleGVjU3luYyhgY29kZSAke2RzdFBhdGh9YCk7XG5cbiAgY29uc3QgcnVuQ29kZSA9IGB5YXJuIG5vZGUgLXIgZG90ZW52L2NvbmZpZyAtLWVuYWJsZS1zb3VyY2UtbWFwcyBkaXN0L3ByYWN0aWNlcy8ke2ZpbGVOYW1lLnJlcGxhY2UoXG4gICAgXCIudHNcIixcbiAgICBcIi5qc1wiLFxuICApfWA7XG4gIGNvbnNvbGUubG9nKGAke2NoYWxrLmJsdWUocnVuQ29kZSl9IGNvcGllZCB0byBjbGlwYm9hcmQuYCk7XG4gIGV4ZWNTeW5jKGBlY2hvIFwiJHtydW5Db2RlfVwiIHwgcGJjb3B5YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfZW50aXR5KGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyBlbnRpdHlJZCwgdGl0bGU6IGVudGl0eUlkIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZF9tb2RlbChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsXCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsX3Rlc3QoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXCJtb2RlbF90ZXN0XCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgc2tpbGxzIHN5bmMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDqs7Xsi50gU2tpbGxz66W8IOuhnOy7rCDtlITroZzsoJ3tirjroZwg64+Z6riw7ZmU7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBza2lsbHNfc3luYygpIHtcbiAgY29uc3Qgd29ya3NwYWNlUm9vdCA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VSb290KCk7XG4gIGNvbnN0IGNsYXVkZURpciA9IHBhdGguam9pbih3b3Jrc3BhY2VSb290LCBcIi5jbGF1ZGVcIik7XG4gIGNvbnN0IHRhcmdldFNraWxsc0RpciA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwic2tpbGxzXCIsIFwic29uYW11XCIpO1xuXG4gIC8vIOqwnOuwnCDtmZjqsr0gLSBjbGkudHM6IHNvbmFtdS9tb2R1bGVzL3NvbmFtdS9zcmMvYmluL2NsaS50c1xuICAvLyDruYzrk5wg7ZuEIC0gY2xpLmpzOiBub2RlX21vZHVsZXMvc29uYW11L2Rpc3QvYmluL2NsaS5qcyAo7Iuk7KCcIOyLpO2WiSlcbiAgLy8gc2tpbGxzIOychOy5mDogbm9kZV9tb2R1bGVzL3NvbmFtdS9zcmMvc2tpbGxzIChucG0g67Cw7Y+sIOyLnClcbiAgY29uc3Qgc291cmNlQmFzZSA9IHBhdGgucmVzb2x2ZShpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCJzcmNcIiwgXCJza2lsbHNcIik7XG4gIGNvbnN0IHNvdXJjZVNraWxsc0RpciA9IHBhdGguam9pbihzb3VyY2VCYXNlLCBcInNvbmFtdVwiKTtcbiAgY29uc3Qgc291cmNlQ2xhdWRlTWQgPSBwYXRoLmpvaW4oc291cmNlQmFzZSwgXCJDTEFVREUubWRcIik7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHNvdXJjZVNraWxsc0RpcikpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwiU2tpbGxzIHNvdXJjZSBub3QgZm91bmQgaW4gc29uYW11IHBhY2thZ2UuXCIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDquLDsobQg65SU66CJ7Yag66asL3N5bWxpbmsg7IKt7KCcIO2bhCBzeW1saW5rIOyDneyEsVxuICAvLyBleGlzdHMoKeuKlCBicm9rZW4gc3ltbGlua+ulvCDqsJDsp4DtlZjsp4Ag66q77ZWY66+A66GcIHJt7J2EIOustOyhsOqxtCDsi5zrj4Ttlanri4jri6RcbiAgdHJ5IHtcbiAgICBhd2FpdCBybSh0YXJnZXRTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgLy8g7YyM7J287J20IOyXhuycvOuptCDrrLTsi5xcbiAgfVxuXG4gIC8vIOuMgOyDgSDrlJTroInthqDrpqwg7IOd7ISxXG4gIGF3YWl0IG1rZGlyKHBhdGguZGlybmFtZSh0YXJnZXRTa2lsbHNEaXIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICB0cnkge1xuICAgIGF3YWl0IHN5bWxpbmsoc291cmNlU2tpbGxzRGlyLCB0YXJnZXRTa2lsbHNEaXIsIFwiZGlyXCIpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgU2tpbGxzIGxpbmtlZCAoc3ltbGluaylgKSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjaGFsay55ZWxsb3coYOKaoCBTeW1saW5rIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCksXG4gICAgKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCAgRmFsbGluZyBiYWNrIHRvIGNvcHkuLi5gKSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNwKHNvdXJjZVNraWxsc0RpciwgdGFyZ2V0U2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgU2tpbGxzIGNvcGllZGApKTtcbiAgICB9IGNhdGNoIChjb3B5RXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGNoYWxrLnJlZChcbiAgICAgICAgICBg4pyXIEZhaWxlZCB0byBjb3B5IHNraWxsczogJHtjb3B5RXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGNvcHlFcnJvci5tZXNzYWdlIDogU3RyaW5nKGNvcHlFcnJvcil9YCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICB0aHJvdyBjb3B5RXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLy8gQ0xBVURFLm1kIOuzteyCrC/sl4XrjbDsnbTtirhcbiAgaWYgKGF3YWl0IGV4aXN0cyhzb3VyY2VDbGF1ZGVNZCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0Q2xhdWRlTWQgPSBwYXRoLmpvaW4oY2xhdWRlRGlyLCBcIkNMQVVERS5tZFwiKTtcbiAgICAgIGNvbnN0IHNvdXJjZUNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShzb3VyY2VDbGF1ZGVNZCwgXCJ1dGYtOFwiKTtcblxuICAgICAgaWYgKGF3YWl0IGV4aXN0cyh0YXJnZXRDbGF1ZGVNZCkpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0Q29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHRhcmdldENsYXVkZU1kLCBcInV0Zi04XCIpO1xuICAgICAgICBjb25zdCBzdGFydE1hcmtlciA9IFwiPCEtLSBTT05BTVU6U1RBUlQgLS0+XCI7XG4gICAgICAgIGNvbnN0IGVuZE1hcmtlciA9IFwiPCEtLSBTT05BTVU6RU5EIC0tPlwiO1xuICAgICAgICBpZiAodGFyZ2V0Q29udGVudC5pbmNsdWRlcyhzdGFydE1hcmtlcikgJiYgdGFyZ2V0Q29udGVudC5pbmNsdWRlcyhlbmRNYXJrZXIpKSB7XG4gICAgICAgICAgLy8gbWFya2VyIOyYgeyXreunjCDqtZDssrTtlanri4jri6QuXG4gICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSB0YXJnZXRDb250ZW50LmluZGV4T2Yoc3RhcnRNYXJrZXIpO1xuICAgICAgICAgIGNvbnN0IGVuZElkeCA9IHRhcmdldENvbnRlbnQuaW5kZXhPZihlbmRNYXJrZXIpO1xuXG4gICAgICAgICAgaWYgKHN0YXJ0SWR4ICE9PSAtMSAmJiBlbmRJZHggIT09IC0xICYmIHN0YXJ0SWR4IDwgZW5kSWR4KSB7XG4gICAgICAgICAgICBjb25zdCBiZWZvcmUgPSB0YXJnZXRDb250ZW50LnN1YnN0cmluZygwLCBzdGFydElkeCk7XG4gICAgICAgICAgICBjb25zdCBhZnRlciA9IHRhcmdldENvbnRlbnQuc3Vic3RyaW5nKGVuZElkeCArIGVuZE1hcmtlci5sZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAke2JlZm9yZX0ke3N0YXJ0TWFya2VyfVxcbiR7c291cmNlQ29udGVudH1cXG4ke2VuZE1hcmtlcn0ke2FmdGVyfWA7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0Q2xhdWRlTWQsIG5ld0NvbnRlbnQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBDTEFVREUubWQgdXBkYXRlZCAobWFya2VyIHJlZ2lvbilgKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4o+tIENMQVVERS5tZCBtYXJrZXIgcG9zaXRpb25zIGludmFsaWQsIHNraXBwZWRgKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0Q2xhdWRlTWQsIHNvdXJjZUNvbnRlbnQpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIENMQVVERS5tZCBjcmVhdGVkYCkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBjaGFsay5yZWQoXG4gICAgICAgICAgYOKclyBGYWlsZWQgdG8gdXBkYXRlIENMQVVERS5tZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgc2tpbGxzIGNyZWF0ZSA8bmFtZT4g7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDroZzsu6wgc2tpbGwg7LSI7JWI7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2tpbGxzX2NyZWF0ZShuYW1lOiBzdHJpbmcpIHtcbiAgY29uc3Qgd29ya3NwYWNlUm9vdCA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VSb290KCk7XG4gIGNvbnN0IGxvY2FsRGlyID0gcGF0aC5qb2luKHdvcmtzcGFjZVJvb3QsIFwiLmNsYXVkZVwiLCBcInNraWxsc1wiLCBcImxvY2FsXCIpO1xuXG4gIC8vID09PSDtjIzsnbzrqoUg6rKA7KadIOuwjyBTYW5pdGl6ZSA9PT1cbiAgaWYgKCFuYW1lIHx8IG5hbWUudHJpbSgpID09PSBcIlwiKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCLinJcgU2tpbGwgbmFtZSBpcyByZXF1aXJlZFwiKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHNhbml0aXplZCA9IG5hbWVcbiAgICAvLyDqs7XrsLHsnYQg7ZWY7J207ZSI7Jy866GcXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCItXCIpXG4gICAgLy8g6rK966GcIOq1rOu2hOyekCDsoJzqsbBcbiAgICAucmVwbGFjZSgvWy9cXFxcXS9nLCBcIi1cIilcbiAgICAvLyBQYXRoIHRyYXZlcnNhbCDrsKnsp4BcbiAgICAucmVwbGFjZSgvXFwuXFwuL2csIFwiXCIpXG4gICAgLy8gV2luZG93cyDquIjsp4Ag66y47J6QIOygnOqxsFxuICAgIC5yZXBsYWNlKC9bPD46XCJ8PypdL2csIFwiXCIpXG4gICAgLy8g7Iuc7J6RL+uBnSDsoJAsIO2VmOydtO2UiCwg7Ja4642U7Iqk7L2U7Ja0IOygnOqxsFxuICAgIC5yZXBsYWNlKC9eWy5cXC1fXSt8Wy5cXC1fXSskL2csIFwiXCIpXG4gICAgLy8g7Jew7IaN65CcIO2VmOydtO2UiOydhCDtlZjrgpjroZxcbiAgICAucmVwbGFjZSgvLSsvZywgXCItXCIpXG4gICAgLy8g7JWM7YyM67KzLCDsiKvsnpAsIO2VmOydtO2UiCwg7Ja4642U7Iqk7L2U7Ja0LCDtlZzquIDrp4wg7ZeI7JqpXG4gICAgLnJlcGxhY2UoL1teYS16QS1aMC05LV/qsIAt7Z6jXS9nLCBcIlwiKTtcblxuICAvLyDquLjsnbQg7KCc7ZWcXG4gIGNvbnN0IE1BWF9MRU5HVEggPSAxMDA7XG4gIGlmIChzYW5pdGl6ZWQubGVuZ3RoID4gTUFYX0xFTkdUSCkge1xuICAgIHNhbml0aXplZCA9IHNhbml0aXplZC5zdWJzdHJpbmcoMCwgTUFYX0xFTkdUSCk7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgTmFtZSB0cnVuY2F0ZWQgdG8gJHtNQVhfTEVOR1RIfSBjaGFyYWN0ZXJzYCkpO1xuICB9XG5cbiAgLy8gV2luZG93cyDsmIjslb3slrQg7ZmV7J24XG4gIGNvbnN0IFJFU0VSVkVEX05BTUVTID0gW1xuICAgIFwiQ09OXCIsXG4gICAgXCJQUk5cIixcbiAgICBcIkFVWFwiLFxuICAgIFwiTlVMXCIsXG4gICAgXCJDT00xXCIsXG4gICAgXCJDT00yXCIsXG4gICAgXCJDT00zXCIsXG4gICAgXCJDT000XCIsXG4gICAgXCJDT001XCIsXG4gICAgXCJDT002XCIsXG4gICAgXCJDT003XCIsXG4gICAgXCJDT004XCIsXG4gICAgXCJDT005XCIsXG4gICAgXCJMUFQxXCIsXG4gICAgXCJMUFQyXCIsXG4gICAgXCJMUFQzXCIsXG4gICAgXCJMUFQ0XCIsXG4gICAgXCJMUFQ1XCIsXG4gICAgXCJMUFQ2XCIsXG4gICAgXCJMUFQ3XCIsXG4gICAgXCJMUFQ4XCIsXG4gICAgXCJMUFQ5XCIsXG4gIF07XG4gIGlmIChSRVNFUlZFRF9OQU1FUy5pbmNsdWRlcyhzYW5pdGl6ZWQudG9VcHBlckNhc2UoKSkpIHtcbiAgICBzYW5pdGl6ZWQgPSBgc2tpbGwtJHtzYW5pdGl6ZWR9YDtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBSZXNlcnZlZCBuYW1lIGRldGVjdGVkLCBwcmVmaXhlZCB3aXRoIFwic2tpbGwtXCJgKSk7XG4gIH1cblxuICAvLyDruYgg66y47J6Q7Je0IOyytO2BrFxuICBpZiAoc2FuaXRpemVkID09PSBcIlwiKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCLinJcgSW52YWxpZCBza2lsbCBuYW1lIGFmdGVyIHNhbml0aXphdGlvblwiKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIE9yaWdpbmFsOiBcIiR7bmFtZX1cImApKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDrs4Dqsr0g7JWM66a8XG4gIGlmIChzYW5pdGl6ZWQgIT09IG5hbWUpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBOYW1lIHNhbml0aXplZDogXCIke25hbWV9XCIg4oaSIFwiJHtzYW5pdGl6ZWR9XCJgKSk7XG4gIH1cblxuICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihsb2NhbERpciwgYCR7c2FuaXRpemVkfS5tZGApO1xuXG4gIGlmIChhd2FpdCBleGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGBTa2lsbCBcIiR7c2FuaXRpemVkfVwiIGFscmVhZHkgZXhpc3RzLmApKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBta2Rpcihsb2NhbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBgLS0tXG5uYW1lOiAke3Nhbml0aXplZH1cbmNhdGVnb3J5OiBvdGhlclxuY3JlYXRlZF9hdDogJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdfVxuc3RhdHVzOiBkcmFmdFxuLS0tXG5cbiMgJHtzYW5pdGl6ZWR9XG5cbiMjIOyDge2ZqVxuXG5b7Ja065akIOusuOygnOyYgOuKlOyngF1cblxuIyMg7ZW06rKwIOuwqeuylVxuXG5b7Ja065a76rKMIO2VtOqysO2WiOuKlOyngF1cblxuIyMg7L2U65OcIOyYiOyLnFxuXG5cXGBcXGBcXGB0eXBlc2NyaXB0XG4vLyDsmIjsi5wg7L2U65OcXG5cXGBcXGBcXGBcbmA7XG5cbiAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCB0ZW1wbGF0ZSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQ3JlYXRlZCAuY2xhdWRlL3NraWxscy9sb2NhbC8ke3Nhbml0aXplZH0ubWRgKSk7XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgYXV0aCBnZW5lcmF0ZSDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIGJldHRlci1hdXRoIOyXlO2LsO2LsOuTpChVc2VyLCBTZXNzaW9uLCBBY2NvdW50LCBWZXJpZmljYXRpb24p7J2EIOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiDsmLXshZg6XG4gKiAtLXBsdWdpbnMgcGhvbmUtbnVtYmVyLDJmYSAg7ZSM65+s6re47J24IOyXlO2LsO2LsOuPhCDtlajqu5gg7IOd7ISxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGF1dGhfZ2VuZXJhdGUoKSB7XG4gIC8vIC0tcGx1Z2lucyDsmLXshZgg7YyM7IuxXG4gIGNvbnN0IHBsdWdpbnNBcmcgPSBwcm9jZXNzLmFyZ3YuZmluZCgoYXJnKSA9PiBhcmcuc3RhcnRzV2l0aChcIi0tcGx1Z2luc1wiKSk7XG4gIGNvbnN0IHBsdWdpbnM6IEJldHRlckF1dGhQbHVnaW5JZFtdID0gW107XG5cbiAgaWYgKHBsdWdpbnNBcmcpIHtcbiAgICBjb25zdCBwbHVnaW5WYWx1ZSA9IHBsdWdpbnNBcmcuaW5jbHVkZXMoXCI9XCIpXG4gICAgICA/IHBsdWdpbnNBcmcuc3BsaXQoXCI9XCIpWzFdXG4gICAgICA6IHByb2Nlc3MuYXJndltwcm9jZXNzLmFyZ3YuaW5kZXhPZihwbHVnaW5zQXJnKSArIDFdO1xuXG4gICAgaWYgKHBsdWdpblZhbHVlKSB7XG4gICAgICBjb25zdCBwbHVnaW5JZHMgPSBwbHVnaW5WYWx1ZS5zcGxpdChcIixcIikubWFwKChwKSA9PiBwLnRyaW0oKSk7XG5cbiAgICAgIGZvciAoY29uc3QgaWQgb2YgcGx1Z2luSWRzKSB7XG4gICAgICAgIGlmIChpc1ZhbGlkUGx1Z2luSWQoaWQpKSB7XG4gICAgICAgICAgcGx1Z2lucy5wdXNoKGlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKaoCBVbmtub3duIHBsdWdpbjogJHtpZH1gKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKGAgIFN1cHBvcnRlZCBwbHVnaW5zOiAke1NVUFBPUlRFRF9QTFVHSU5fSURTLmpvaW4oXCIsIFwiKX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIvCflJAgR2VuZXJhdGluZyBiZXR0ZXItYXV0aCBlbnRpdGllcy4uLlxcblwiKSk7XG5cbiAgaWYgKHBsdWdpbnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBQbHVnaW5zOiAke3BsdWdpbnMuam9pbihcIiwgXCIpfWApKTtcbiAgfVxuXG4gIGF3YWl0IGdlbmVyYXRlQmV0dGVyQXV0aEVudGl0aWVzKHsgcGx1Z2lucyB9KTtcbn1cblxuLyoqXG4gKiDsm4ztgazsiqTtjpjsnbTsiqQg66Oo7Yq466W8IOywvuyKteuLiOuLpC5cbiAqIOyasOyEoOyInOychDogcG5wbS13b3Jrc3BhY2UueWFtbCA+IENMQVVERS5tZCA+IOujqO2KuCBwYWNrYWdlLmpzb24gKHdvcmtzcGFjZXMg7ZWE65OcKVxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kV29ya3NwYWNlUm9vdCgpIHtcbiAgbGV0IGRpciA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgd2hpbGUgKGRpciAhPT0gcGF0aC5kaXJuYW1lKGRpcikpIHtcbiAgICAvLyAxLiBwbnBtLXdvcmtzcGFjZS55YW1sIO2MjOydvOydtCDsnojripTsp4Ag7ZmV7J24LiDsnojsnLzrqbQg7ZmV7Iuk7ZWcIG1vbm9yZXBvIOujqO2KuC5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHBhdGguam9pbihkaXIsIFwicG5wbS13b3Jrc3BhY2UueWFtbFwiKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuXG4gICAgLy8gMi4gQ0xBVURFLm1kIO2MjOydvOydtCDsnojripTsp4Ag7ZmV7J24LiDsnojsnLzrqbQg7ZSE66Gc7KCd7Yq4IOujqO2KuOuhnCDqsITso7ztlaguXG4gICAgaWYgKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oZGlyLCBcIkNMQVVERS5tZFwiKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuXG4gICAgLy8gMy4gcGFja2FnZS5qc29u7JeQIHdvcmtzcGFjZXMg7ZWE65Oc6rCAIOyeiOycvOuptCDro6jtirguXG4gICAgY29uc3QgcGFja2FnZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBcInBhY2thZ2UuanNvblwiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHBhY2thZ2VQYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKHBhY2thZ2VQYXRoLCBcInV0Zi04XCIpKTtcbiAgICAgICAgaWYgKHBhY2thZ2VKc29uLndvcmtzcGFjZXMpIHtcbiAgICAgICAgICByZXR1cm4gZGlyO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8g7YyM7IuxIOyLpO2MqOyLnCDrrLTsi5xcbiAgICAgIH1cbiAgICB9XG4gICAgZGlyID0gcGF0aC5kaXJuYW1lKGRpcik7XG4gIH1cblxuICAvLyDssL7sp4Ag66q77ZWY66m0IGFwaSDtj7TrjZTsnZgg67aA66qoIOyCrOyaqVxuICByZXR1cm4gZmluZEFwcFJvb3RQYXRoKCk7XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJkb3RlbnYiLCJjb25maWciLCJhc3NlcnQiLCJleGVjU3luYyIsInNwYXduIiwiY3AiLCJta2RpciIsInJlYWRkaXIiLCJyZWFkRmlsZSIsInJtIiwic3ltbGluayIsIndyaXRlRmlsZSIsImtuZXgiLCJjcmVhdGVSZXF1aXJlIiwicGF0aCIsInByb2Nlc3MiLCJ0c2ljbGkiLCJTb25hbXUiLCJnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyIsImlzVmFsaWRQbHVnaW5JZCIsIlNVUFBPUlRFRF9QTFVHSU5fSURTIiwiRW50aXR5TWFuYWdlciIsIk1pZ3JhdG9yIiwiRml4dHVyZU1hbmFnZXIiLCJleGVjV2l0aExpbmVQcmVmaXgiLCJwcmludEJ1aWxkU3VtbWFyeSIsInByaW50VGFza0ZhaWxlZCIsInByaW50VGFza0hlYWRlciIsInByaW50VGFza1N0YXJ0IiwicHJpbnRUYXNrU3VjY2VzcyIsImV4aXN0cyIsImZpbmRBcGlSb290UGF0aCIsImZpbmRBcHBSb290UGF0aCIsIkFQSV9BUlRJRkFDVFMiLCJXRUJfQVJUSUZBQ1RTIiwibWlncmF0b3IiLCJib290c3RyYXAiLCJub3RUb0luaXQiLCJpbmNsdWRlcyIsImFyZ3YiLCJpbml0IiwiZmlsdGVyZWRBcmd2Iiwic2tpcE5leHQiLCJhcmciLCJzdGFydHNXaXRoIiwicHVzaCIsInR5cGVzIiwidHlwZSIsIm5hbWUiLCJtZXNzYWdlIiwiY2hvaWNlcyIsImdldEFsbFBhcmVudElkcyIsIm1hcCIsImVudGl0eUlkIiwidGl0bGUiLCJ2YWx1ZSIsImFyZ3MiLCJydW5uZXJzIiwibWlncmF0ZV9zdGF0dXMiLCJtaWdyYXRlX3J1biIsIm1pZ3JhdGVfYXBwbHkiLCJmaXh0dXJlX2luaXQiLCJmaXh0dXJlX2ltcG9ydCIsImZpeHR1cmVfc3luYyIsInN0dWJfcHJhY3RpY2UiLCJzdHViX2VudGl0eSIsInNjYWZmb2xkX21vZGVsIiwic2NhZmZvbGRfbW9kZWxfdGVzdCIsInN5bmMiLCJkZXYiLCJidWlsZCIsInN0YXJ0Iiwic2tpbGxzX3N5bmMiLCJza2lsbHNfY3JlYXRlIiwiYXV0aF9nZW5lcmF0ZSIsImRlc3Ryb3kiLCJmaW5hbGx5Iiwic3luY2VyIiwiYXBpUm9vdCIsImVudHJ5UG9pbnQiLCJjb25zb2xlIiwibG9nIiwieWVsbG93IiwiYm9sZCIsImhvdFJ1bm5lckJpblBhdGgiLCJ1cmwiLCJyZXNvbHZlIiwic2VydmVyUHJvY2VzcyIsImV4ZWNQYXRoIiwiam9pbiIsImN3ZCIsInN0ZGlvIiwiZW52IiwiTk9ERV9FTlYiLCJIT1QiLCJBUElfUk9PVF9QQVRIIiwiY2xlYW51cCIsImtpbGwiLCJleGl0Iiwib24iLCJjb2RlIiwiZXJyb3IiLCJyZWQiLCJhcHBSb290Iiwic3djRmlsZVBhdGgiLCJkaW0iLCJkaXJuYW1lIiwiYXBpU3RhcnRlZEF0IiwiRGF0ZSIsIm5vdyIsImFydGlmYWN0IiwicHJvamVjdFBhdGgiLCJkZXNjcmlwdGlvbiIsInJ1bkJ1aWxkU3RlcHMiLCJidWlsZENvbW1hbmRBcmdzIiwiY29uZmlnRmlsZVBhdGgiLCJ3ZWJTdGFydGVkQXQiLCJvcHRpb25zIiwic3RlcHMiLCJjbWQiLCJwcmVCdWlsZENvbW1hbmQiLCJidWlsZENvbW1hbmQiLCJwb3N0QnVpbGRDb21tYW5kIiwiZmlsdGVyIiwic3RlcCIsImkiLCJsZW5ndGgiLCJpc0xhc3QiLCJFcnJvciIsImJsdWUiLCJzZXR1cE1pZ3JhdG9yIiwic2V0dXBGaXh0dXJlTWFuYWdlciIsInRhcmdldHMiLCJydW5BY3Rpb24iLCJsb2NhbEhvc3RzIiwiT2JqZWN0Iiwia2V5cyIsImRiQ29uZmlnIiwidGFyZ2V0IiwidGFyZ2V0Q29uZmlnIiwiaG9zdCIsImNvbm5lY3Rpb24iLCJ0b0xvd2VyQ2FzZSIsInN0YXR1cyIsImdldFN0YXR1cyIsInNyY0NvbmZpZyIsImRldmVsb3BtZW50X21hc3RlciIsImxhYmVsIiwiZml4dHVyZSIsInRlc3QiLCJ0b1NraXAiLCJyZW1vdGVDb25uIiwibG9jYWxDb25uIiwiZGF0YWJhc2UiLCJkdW1wRmlsZW5hbWUiLCJzcmNDb25uIiwibWlncmF0aW9uc0R1bXAiLCJ1c2VyIiwicGFzc3dvcmQiLCJfZGIiLCJtaWdyYXRpb25zIiwicmF3IiwiY291bnQiLCJjb25uIiwiZGIiLCJ1bmRlZmluZWQiLCJyb3ciLCJteXNxbENtZCIsInJlY29yZElkcyIsImltcG9ydEZpeHR1cmUiLCJwcmFjdGljZURpciIsImFwaVJvb3RQYXRoIiwiZmlsZU5hbWVzIiwibWF4U2VxTm8iLCJyZWN1cnNpdmUiLCJmaWx0ZXJlZFNlcXMiLCJmaWxlTmFtZSIsImVuZHNXaXRoIiwic2VxTm8iLCJtYXRjaCIsInBhcnNlSW50Iiwic29ydCIsImEiLCJiIiwiY3VycmVudFNlcU5vIiwiZHN0UGF0aCIsInJ1bkNvZGUiLCJyZXBsYWNlIiwiY3JlYXRlRW50aXR5IiwiZ2VuZXJhdGVUZW1wbGF0ZSIsIndvcmtzcGFjZVJvb3QiLCJmaW5kV29ya3NwYWNlUm9vdCIsImNsYXVkZURpciIsInRhcmdldFNraWxsc0RpciIsInNvdXJjZUJhc2UiLCJzb3VyY2VTa2lsbHNEaXIiLCJzb3VyY2VDbGF1ZGVNZCIsImZvcmNlIiwiZ3JlZW4iLCJTdHJpbmciLCJjb3B5RXJyb3IiLCJ0YXJnZXRDbGF1ZGVNZCIsInNvdXJjZUNvbnRlbnQiLCJ0YXJnZXRDb250ZW50Iiwic3RhcnRNYXJrZXIiLCJlbmRNYXJrZXIiLCJzdGFydElkeCIsImluZGV4T2YiLCJlbmRJZHgiLCJiZWZvcmUiLCJzdWJzdHJpbmciLCJhZnRlciIsIm5ld0NvbnRlbnQiLCJsb2NhbERpciIsInRyaW0iLCJzYW5pdGl6ZWQiLCJNQVhfTEVOR1RIIiwiUkVTRVJWRURfTkFNRVMiLCJ0b1VwcGVyQ2FzZSIsImZpbGVQYXRoIiwidGVtcGxhdGUiLCJ0b0lTT1N0cmluZyIsInNwbGl0IiwicGx1Z2luc0FyZyIsImZpbmQiLCJwbHVnaW5zIiwicGx1Z2luVmFsdWUiLCJwbHVnaW5JZHMiLCJwIiwiaWQiLCJkaXIiLCJwYWNrYWdlUGF0aCIsInBhY2thZ2VKc29uIiwiSlNPTiIsInBhcnNlIiwid29ya3NwYWNlcyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBVyxRQUFRO0FBQzFCLE9BQU9DLFlBQVksU0FBUztBQUU1QkEsT0FBT0MsTUFBTTtBQUViLE9BQU9DLFlBQVksU0FBUztBQUM1QixTQUFTQyxRQUFRLEVBQUVDLEtBQUssUUFBUSxnQkFBZ0I7QUFDaEQsU0FBU0MsRUFBRSxFQUFFQyxLQUFLLEVBQUVDLE9BQU8sRUFBRUMsUUFBUSxFQUFFQyxFQUFFLEVBQUVDLE9BQU8sRUFBRUMsU0FBUyxRQUFRLG1CQUFjO0FBQ25GLE9BQU9DLFVBQXlCLE9BQU87QUFDdkMsU0FBU0MsYUFB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
1178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgZXhlY1N5bmMsIHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGNwLCBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHJtLCBzeW1saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XG5pbXBvcnQgeyB0c2ljbGkgfSBmcm9tIFwidHNpY2xpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyB9IGZyb20gXCIuLi9hdXRoL2F1dGgtZ2VuZXJhdG9yXCI7XG5pbXBvcnQge1xuICB0eXBlIEJldHRlckF1dGhQbHVnaW5JZCxcbiAgaXNWYWxpZFBsdWdpbklkLFxuICBTVVBQT1JURURfUExVR0lOX0lEUyxcbn0gZnJvbSBcIi4uL2F1dGgvcGx1Z2lucy9lbnRpdHktZGVmaW5pdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBleGVjV2l0aExpbmVQcmVmaXgsXG4gIHByaW50QnVpbGRTdW1tYXJ5LFxuICBwcmludFRhc2tGYWlsZWQsXG4gIHByaW50VGFza0hlYWRlcixcbiAgcHJpbnRUYXNrU3RhcnQsXG4gIHByaW50VGFza1N1Y2Nlc3MsXG59IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoLCBmaW5kQXBwUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IEFQSV9BUlRJRkFDVFMsIHR5cGUgQnVpbGRBcnRpZmFjdCwgV0VCX0FSVElGQUNUUyB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuaW1wb3J0IHsgZml4dHVyZUV4cGxvcmVDb21tYW5kLCBmaXh0dXJlRmV0Y2hDb21tYW5kLCBmaXh0dXJlR2VuQ29tbWFuZCB9IGZyb20gXCIuL2ZpeHR1cmVcIjtcblxubGV0IG1pZ3JhdG9yOiBNaWdyYXRvcjtcblxuLyoqXG4gKiBDTEkg7Ji17IWY7J2EIO2MjOyLse2VmOuKlCDtl6ztjbwg7ZWo7IiYXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ2xpT3B0aW9ucyhhcmd2OiBzdHJpbmdbXSA9IHByb2Nlc3MuYXJndik6IHtcbiAgZmxhZ3M6IFNldDxzdHJpbmc+OyAvLyAtLXJlZ2VuZXJhdGUsIC0tYWksIC0tbm8tY29uZXMg65OxXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IC8vIC0tbG9jYWxlIGtvIOuTsVxufSB7XG4gIGNvbnN0IGZsYWdzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhcmcgPSBhcmd2W2ldO1xuICAgIGlmICghYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkgY29udGludWU7XG5cbiAgICAvLyAtLW9wdGlvbj12YWx1ZSDtmJXsi51cbiAgICBpZiAoYXJnLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gYXJnLnNsaWNlKDIpLnNwbGl0KFwiPVwiKTtcbiAgICAgIG9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gLS1vcHRpb24gdmFsdWUg7ZiV7Iud7J247KeAIO2ZleyduFxuICAgIGNvbnN0IG5leHRBcmcgPSBhcmd2W2kgKyAxXTtcbiAgICBpZiAobmV4dEFyZyAmJiAhbmV4dEFyZy5zdGFydHNXaXRoKFwiLS1cIikgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgIG9wdGlvbnNbYXJnLnNsaWNlKDIpXSA9IG5leHRBcmc7XG4gICAgICBpKys7IC8vIOuLpOydjCBhcmfripQg6rCS7J2066+A66GcIOyKpO2CtVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAtLWZsYWcg7ZiV7IudXG4gICAgICBmbGFncy5hZGQoYXJnLnNsaWNlKDIpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBmbGFncywgb3B0aW9ucyB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gIGNvbnN0IG5vdFRvSW5pdCA9IFtcImRldlwiLCBcImJ1aWxkXCIsIFwic3RhcnRcIiwgXCJza2lsbHNcIl0uaW5jbHVkZXMocHJvY2Vzcy5hcmd2WzJdID8/IFwiXCIpO1xuICBpZiAoIW5vdFRvSW5pdCkge1xuICAgIGF3YWl0IFNvbmFtdS5pbml0KGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIHRzaWNsaeuKlCDsoJXtmZXtlZwg66qF66C57Ja0IOunpOy5reunjCDsp4Dsm5DtlZjrr4DroZwsIC0t66GcIOyLnOyeke2VmOuKlCDsmLXshZjqs7wg6re4IOqwkuydhCDtlYTthLDrp4Htlanri4jri6QuXG4gICAgLy8g7Ji17IWYIO2MjOyLseydgCDqsIEgcnVubmVyIO2VqOyImOyXkOyEnCDsm5Drs7ggcHJvY2Vzcy5hcmd266W8IOyCrOyaqe2VmOyXrCDsiJjtlontlanri4jri6QuXG4gICAgLy8gXCItLVwiKGJhcmUgZG91YmxlIGRhc2gp64qUIHBhc3N0aHJvdWdoIOq1rOu2hOyekOydtOuvgOuhnCwg6re4IOuSpOydmCDrqqjrk6Ag7J247J6Q64+EIOygnOyZuO2VqeuLiOuLpC5cbiAgICBjb25zdCBmaWx0ZXJlZEFyZ3Y6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHNraXBOZXh0ID0gZmFsc2U7XG4gICAgbGV0IGFmdGVyRG91YmxlRGFzaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzcy5hcmd2Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhcmcgPSBwcm9jZXNzLmFyZ3ZbaV07XG4gICAgICBpZiAoYXJnID09PSBcIi0tXCIpIHtcbiAgICAgICAgYWZ0ZXJEb3VibGVEYXNoID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoYWZ0ZXJEb3VibGVEYXNoKSBjb250aW51ZTtcbiAgICAgIGlmIChza2lwTmV4dCkge1xuICAgICAgICBza2lwTmV4dCA9IGZhbHNlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmcuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICAgIC8vIC0tb3B0aW9uPXZhbHVlIO2YleyLneydgCDsnbQgYXJn66eMIOyKpO2CtVxuICAgICAgICBpZiAoYXJnLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIC0tb3B0aW9uIHZhbHVlIO2YleyLneyduOyngCDtmZXsnbg6IOuLpOydjCBhcmfqsIAgLS3roZwg7Iuc7J6R7ZWY7KeAIOyViuycvOuptCDqsJLsnbQg7J6I64qUIOqyg1xuICAgICAgICBjb25zdCBuZXh0QXJnID0gcHJvY2Vzcy5hcmd2W2kgKyAxXTtcbiAgICAgICAgaWYgKG5leHRBcmcgJiYgIW5leHRBcmcuc3RhcnRzV2l0aChcIi0tXCIpICYmICFuZXh0QXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgc2tpcE5leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZmlsdGVyZWRBcmd2LnB1c2goYXJnKTtcbiAgICB9XG5cbiAgICAvLyBidWlsZC9kZXYg66qF66C57Ja06rCAIOyEnOu4jOy7pOunqOuTnCDsl4bsnbQg7Zi47Lac65CgIOuVjCBcImFsbFwi7J2EIOq4sOuzuOqwkuycvOuhnCDstpTqsIDtlanri4jri6QuXG4gICAgLy8g7JiIOiBgc29uYW11IGJ1aWxkYCDihpIgYHNvbmFtdSBidWlsZCBhbGxgLCBgc29uYW11IGRldmAg4oaSIGBzb25hbXUgZGV2IGFsbGBcbiAgICBjb25zdCBjbWQgPSBmaWx0ZXJlZEFyZ3ZbMl07XG4gICAgaWYgKChjbWQgPT09IFwiYnVpbGRcIiB8fCBjbWQgPT09IFwiZGV2XCIpICYmIGZpbHRlcmVkQXJndi5sZW5ndGggPT09IDMpIHtcbiAgICAgIGZpbHRlcmVkQXJndi5wdXNoKFwiYWxsXCIpO1xuICAgIH1cblxuICAgIGF3YWl0IHRzaWNsaShmaWx0ZXJlZEFyZ3YsIHtcbiAgICAgIHR5cGVzOiB7XG4gICAgICAgIFwiI2VudGl0eUlkXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImF1dG9jb21wbGV0ZVwiLFxuICAgICAgICAgIG5hbWU6IFwiI2VudGl0eUlkXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCJQbGVhc2UgaW5wdXQgI2VudGl0eUlkXCIsXG4gICAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxQYXJlbnRJZHMoKS5tYXAoKGVudGl0eUlkKSA9PiAoe1xuICAgICAgICAgICAgdGl0bGU6IGVudGl0eUlkLFxuICAgICAgICAgICAgdmFsdWU6IGVudGl0eUlkLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgICAgXCIjcmVjb3JkSWRzXCI6IFwibnVtYmVyW11cIixcbiAgICAgICAgXCIjbmFtZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcIiN0YXJnZXRzXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm11bHRpc2VsZWN0XCIsXG4gICAgICAgICAgbmFtZTogXCIjdGFyZ2V0c1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiUGxlYXNlIGlucHV0ICN0YXJnZXRzXCIsXG4gICAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgeyB0aXRsZTogXCJEZXZlbG9wbWVudFwiLCB2YWx1ZTogXCJkZXZlbG9wbWVudF9tYXN0ZXJcIiB9LFxuICAgICAgICAgICAgeyB0aXRsZTogXCJQcm9kdWN0aW9uXCIsIHZhbHVlOiBcInByb2R1Y3Rpb25fbWFzdGVyXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiRml4dHVyZVwiLCB2YWx1ZTogXCJmaXh0dXJlXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiVGVzdFwiLCB2YWx1ZTogXCJ0ZXN0XCIgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImluaXRcIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJpbXBvcnRcIiwgXCIjZW50aXR5SWRcIiwgXCIjcmVjb3JkSWRzXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwic3luY1wiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImdlblwiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImZldGNoXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiZXhwbG9yZVwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcInJ1blwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcImFwcGx5XCIsIFwiI3RhcmdldHNcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJzdGF0dXNcIl0sXG4gICAgICAgIFtcInN0dWJcIiwgXCJwcmFjdGljZVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJzdHViXCIsIFwiZW50aXR5XCIsIFwiI25hbWVcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwibW9kZWxcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwibW9kZWxfdGVzdFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJ2aWV3X2xpc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwidmlld19mb3JtXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJjb25lXCIsIFwiZ2VuXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzeW5jXCJdLFxuICAgICAgICBbXCJidWlsZFwiLCBcImFsbFwiXSxcbiAgICAgICAgW1wiYnVpbGRcIiwgXCJhcGlcIl0sXG4gICAgICAgIFtcImJ1aWxkXCIsIFwid2ViXCJdLFxuICAgICAgICBbXCJkZXZcIiwgXCJhbGxcIl0sXG4gICAgICAgIFtcImRldlwiLCBcImFwaVwiXSxcbiAgICAgICAgW1wiZGV2XCIsIFwid2ViXCJdLFxuICAgICAgICBbXCJzdGFydFwiXSxcbiAgICAgICAgW1wic2tpbGxzXCIsIFwic3luY1wiXSxcbiAgICAgICAgW1wic2tpbGxzXCIsIFwiY3JlYXRlXCIsIFwiI25hbWVcIl0sXG4gICAgICAgIFtcImF1dGhcIiwgXCJnZW5lcmF0ZVwiXSxcbiAgICAgIF0sXG4gICAgICBydW5uZXJzOiB7XG4gICAgICAgIG1pZ3JhdGVfc3RhdHVzLFxuICAgICAgICBtaWdyYXRlX3J1bixcbiAgICAgICAgbWlncmF0ZV9hcHBseSxcbiAgICAgICAgZml4dHVyZV9pbml0LFxuICAgICAgICBmaXh0dXJlX2ltcG9ydCxcbiAgICAgICAgZml4dHVyZV9zeW5jLFxuICAgICAgICBmaXh0dXJlX2dlbixcbiAgICAgICAgZml4dHVyZV9mZXRjaCxcbiAgICAgICAgZml4dHVyZV9leHBsb3JlLFxuICAgICAgICBzdHViX3ByYWN0aWNlLFxuICAgICAgICBzdHViX2VudGl0eSxcbiAgICAgICAgc2NhZmZvbGRfbW9kZWwsXG4gICAgICAgIHNjYWZmb2xkX21vZGVsX3Rlc3QsXG4gICAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfbGlzdCxcbiAgICAgICAgLy8gc2NhZmZvbGRfdmlld19mb3JtLFxuICAgICAgICBjb25lX2dlbixcbiAgICAgICAgc3luYyxcbiAgICAgICAgYnVpbGRfYWxsLFxuICAgICAgICBidWlsZF9hcGksXG4gICAgICAgIGJ1aWxkX3dlYixcbiAgICAgICAgZGV2X2FsbCxcbiAgICAgICAgZGV2X2FwaSxcbiAgICAgICAgZGV2X3dlYixcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIHNraWxsc19zeW5jLFxuICAgICAgICBza2lsbHNfY3JlYXRlLFxuICAgICAgICBhdXRoX2dlbmVyYXRlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBTb25hbXUuZGVzdHJveSgpO1xuICB9XG59XG5cbmJvb3RzdHJhcCgpLmZpbmFsbHkoYXN5bmMgKCkgPT4ge1xuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5kZXN0cm95KCk7XG59KTtcblxuLyoqXG4gKiBwbnBtIHN5bmMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjrpbwg7Iux7YGs7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBzeW5jKCkge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLnN5bmMoKTtcbn1cblxuLyoqXG4gKiBBUEkg6rCc67CcIOyEnOuyhOulvCDsi6TtlontlZjripQg6rO17Ya1IOuhnOyngeyeheuLiOuLpC5cbiAqIGRldl9hbGzqs7wgZGV2X2FwaeyXkOyEnCDqs7XsnKDtlanri4jri6QuXG4gKlxuICogVHlwZVNjcmlwdOulvCDrsJTroZwg7Iuk7ZaJ7ZWgIOyImCDsnojrj4TroZ0gQHNvbmFtdS1raXQvdHMtbG9hZGVy66W8LFxuICogSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlbQgQHNvbmFtdS1raXQvaG1yLWhvb2vsnYQgaW1wb3J07ZWY66mwLFxuICog7IaM7Iqk66e1IOyngOybkOydhCDsnITtlbQgLS1lbmFibGUtc291cmNlLW1hcHMg7ZSM656Y6re466W8IO2PrO2VqO2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gKlxuICog7J2065WMIEBzb25hbXUta2l0L3RzLWxvYWRlcuyZgCBAc29uYW11LWtpdC9obXItaG9va+uKlCBzb25hbXXqsIAg7J6Q7LK07KCB7Jy866GcIOqwgOyngOqzoCDsnojripQgZGVwZW5kZW5jeeyeheuLiOuLpC5cbiAqIOuYkO2VnCDsi6Ttlonsl5Ag7IKs7Jqp7ZWY64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLrj4Qg66eI7LCs6rCA7KeA66GcIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65Sw65287IScIOyCrOyaqeyekCDtlITroZzsoJ3tirjsl5DshJzripQg7J20IOyEuCDtjKjtgqTsp4Drpbwg7KeB7KCRIOyEpOy5mO2VoCDtlYTsmpTqsIAg7JeG7Iq164uI64ukLlxuICovXG5mdW5jdGlvbiBzcGF3bkFwaURldlNlcnZlcihvcHRpb25zPzogeyBleHRyYUVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcInNyYy9pbmRleC50c1wiO1xuXG4gIC8vIOydtCBzb25hbXUg7Yyo7YKk7KeA6rCAIGRlcGVuZGVuY2llc+uhnCDqsIDsp4Dqs6Ag7J6I64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLsnZggYmluL3J1bi5qc+ulvCDsgqzsmqntlanri4jri6QuXG4gIC8vIOydtCDqsr3roZwoL2Jpbi9ydW4uanMp64qUIEBzb25hbXUta2l0L2htci1ydW5uZXLsnZggcGFja2FnZS5qc29u7J2YIGJpbiDtlYTrk5zsl5Ag66qF7Iuc65CY7Ja0IOyeiOuKlCDqt7jqsoPqs7wg6rCZ7Iq164uI64ukLlxuICBjb25zdCBob3RSdW5uZXJCaW5QYXRoID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpLnJlc29sdmUoXG4gICAgXCJAc29uYW11LWtpdC9obXItcnVubmVyL2Jpbi9ydW4uanNcIixcbiAgKTtcblxuICBjb25zdCBzZXJ2ZXJQcm9jZXNzID0gc3Bhd24oXG4gICAgcHJvY2Vzcy5leGVjUGF0aCwgLy8gbm9kZVxuICAgIFtcbiAgICAgIGhvdFJ1bm5lckJpblBhdGgsIC8vIOydtOugh+qyjCDtlbTshJwgaG90LXJ1bm5lcuulvCDsi6TtlontlZjqtazsmpRcbiAgICAgIFwiLS1jbGVhci1zY3JlZW49ZmFsc2VcIiwgLy8g7J207ZWYIGhvdC1ydW5uZXLsl5Dqsowg64SY6rKo7KSEIOyduOyekOuTpOyeheuLiOuLpC5cbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1pbXBvcnQ9c29uYW11L3RzLWxvYWRlci1yZWdpc3RlclwiLCAvLyBUeXBlU2NyaXB0IOyEnO2PrO2KuOulvCDsnITtlZwg66Gc642ULFxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvaG1yLWhvb2stcmVnaXN0ZXJcIiwgLy8gSE1S7J2EIOyngOybkO2VmOq4sCDsnITtlZwgaG9vayxcbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1lbmFibGUtc291cmNlLW1hcHNcIiwgLy8g6re466as6rOgIOyGjOyKpOuntSDsp4Dsm5DsnYQg7JyE7ZWcIO2UjOuemOq3uOyeheuLiOuLpC5cbiAgICAgIFwiLS1vbi1rZXk9cjpyZXN0YXJ0OlJlc3RhcnQgc2VydmVyXCIsIC8vIHIg64iE66W066m0IOyEnOuyhCDsnqzsi5zsnpHtlZjqsowg7ZW07KSY7JqULlxuICAgICAgYC0tb24ta2V5PWY6c2hlbGwocm0gJHtwYXRoLmpvaW4oYXBpUm9vdCwgXCJzb25hbXUubG9ja1wiKX0pOnJlc3RhcnQ6Rm9yY2UgcmVzdGFydGAsIC8vIGYg64iE66W066m0IHNvbmFtdS5sb2NrIO2MjOydvOydhCDsp4DsmrDqs6Ag7ISc67KEIOyerOyLnOyeke2VmOqyjCDtlbTspJjsmpQuXG5cbiAgICAgIFwiLS1vbi1rZXk9ZW50ZXI6c2hlbGwoZWNobyBoaSk6S2V5IGJpbmRpbmcgdGVzdFwiLCAvLyBlbnRlcuulvCBrZXnroZwg7JO4IOyImCDsnojsnYzsnYQg67O07J206riwIOychO2VnCDthYzsiqTtirjsnoXri4jri6QuXG4gICAgICBcIi0tb24ta2V5PWN0cmwrZiBjdHJsK2Y6c2hlbGwoZ2l0IHB1bGwgJiYgcG5wbSBpbnN0YWxsICYmIHBucG0gLS1maWx0ZXIgc29uYW11IGJ1aWxkICYmIGVjaG8gJ1NvbmFtdSBpcyBub3cgdXAtdG8tZGF0ZSEnKTpyZXN0YXJ0OlB1bGwgJiBpbnN0YWxsICYgYnVpbGQgJiByZXN0YXJ0XCIsIC8vIG1vZGlmaWVy7JmA7J2YIOyhsO2VqSwg6re466as6rOgIOuRkCDqsJzsnZggY2hvcmTrpbwg7IKs7Jqp7ZWgIOyImCDsnojsnYzsnYQg67O07J206riwIOychO2VnCDthYzsiqTtirjsnoXri4jri6QuXG4gICAgICBlbnRyeVBvaW50LCAvLyDrp4jsp4Drp4nsnLzroZwg7Iuk7KCcIOyLpO2Wie2VoCDsiqTtgazrpr3tirjsnZgg6rK966Gc66W8IOuEmOqyqOykjeuLiOuLpC5cbiAgICBdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudjoge1xuICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgTk9ERV9FTlY6IFwiZGV2ZWxvcG1lbnRcIixcbiAgICAgICAgSE9UOiBcInllc1wiLCAvLyDslpjqsIAg7J6I7Ja07JW8IEhNUuydtCDtmZzshLHtmZTrkKnri4jri6QuXG4gICAgICAgIEFQSV9ST09UX1BBVEg6IGFwaVJvb3QsIC8vIOydtCDqsr3roZzqsIAgaG1yLWhvb2vsnZgg66Oo7Yq4IOuUlOugie2GoOumrOqwgCDrkKnri4jri6QuXG4gICAgICAgIC4uLm9wdGlvbnM/LmV4dHJhRW52LFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIC8vIOyiheujjCDsspjrpqxcbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24uLi5cIikpO1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgY2xlYW51cCk7XG4gIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIGNsZWFudXApO1xuXG4gIHNlcnZlclByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBTZXJ2ZXIgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KGNvZGUgfHwgMSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiAvIHBucG0gZGV2IGFsbCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOyXkCDrjIDtlbQgSE1SIOyngOybkO2VmOuKlCDqsJzrsJwg7ISc67KE66W8IOudhOybjOykjeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5mdW5jdGlvbiBkZXZfYWxsKCkge1xuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZChcIlN0YXJ0aW5nIFNvbmFtdSBkZXYgc2VydmVyLi4uXFxuXCIpKTtcbiAgc3Bhd25BcGlEZXZTZXJ2ZXIoKTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiBhcGkg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBBUEkg7KCE7JqpIOqwnOuwnCDshJzrsoTrpbwg652E7JuB64uI64ukLlxuICogZGV2X2FsbOqzvCDqsbDsnZgg64+Z7J287ZWY65CYLCDthrXtlakg7Ju5IOyEnOuyhOulvCDruYTtmZzshLHtmZTtlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZGV2X2FwaSgpIHtcbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBTb25hbXUgQVBJLW9ubHkgZGV2IHNlcnZlci4uLlxcblwiKSk7XG4gIHNwYXduQXBpRGV2U2VydmVyKHtcbiAgICBleHRyYUVudjogeyBTT05BTVVfRElTQUJMRV9JTlRFR1JBVEVEX1dFQjogXCJ5ZXNcIiB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiB3ZWIg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBWaXRlIOqwnOuwnCDshJzrsoTrpbwg64uo64+F7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqIC0tIOuSpOydmCDsnbjsnpDripQgVml0ZeyXkCDqt7jrjIDroZwg7KCE64us65Cp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRldl93ZWIoKSB7XG4gIGNvbnN0IGFwcFJvb3QgPSBmaW5kQXBwUm9vdFBhdGgoKTtcbiAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbihhcHBSb290LCBcIndlYlwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMod2ViUGF0aCkpKSB7XG4gICAgY29uc29sZS5lcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIC0tIOuSpOydmCDsnbjsnpAg7LaU7LacXG4gIGNvbnN0IGRvdWJsZURhc2hJbmRleCA9IHByb2Nlc3MuYXJndi5pbmRleE9mKFwiLS1cIik7XG4gIGNvbnN0IHBhc3N0aHJvdWdoQXJncyA9IGRvdWJsZURhc2hJbmRleCAhPT0gLTEgPyBwcm9jZXNzLmFyZ3Yuc2xpY2UoZG91YmxlRGFzaEluZGV4ICsgMSkgOiBbXTtcblxuICBjb25zdCB2aXRlQXJncyA9IFtcImV4ZWNcIiwgXCJ2aXRlXCIsIC4uLnBhc3N0aHJvdWdoQXJnc107XG5cbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCJTdGFydGluZyBWaXRlIGRldiBzZXJ2ZXIuLi5cXG5cIikpO1xuXG4gIGNvbnN0IHZpdGVQcm9jZXNzID0gc3Bhd24oXCJwbnBtXCIsIHZpdGVBcmdzLCB7XG4gICAgY3dkOiB3ZWJQYXRoLFxuICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgfSk7XG5cbiAgdml0ZVByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgcHJvY2Vzcy5leGl0KGNvZGUgPz8gMCk7XG4gIH0pO1xuXG4gIC8vIFNJR0lOVC9TSUdURVJNIOyLnCBWaXRlIO2UhOuhnOyEuOyKpOulvCBncmFjZWZ1bGx5IOyiheujjO2VqeuLiOuLpC5cbiAgZm9yIChjb25zdCBzaWduYWwgb2YgW1wiU0lHSU5UXCIsIFwiU0lHVEVSTVwiXSBhcyBjb25zdCkge1xuICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiB7XG4gICAgICB2aXRlUHJvY2Vzcy5raWxsKHNpZ25hbCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTV0Mg7ISk7KCVIO2MjOydvCDqsr3roZzrpbwg6rKw7KCV7ZWp64uI64ukLiBBUEkg67mM65OcKFNXQynsl5DshJzrp4wg7IKs7Jqp65Cp64uI64ukLlxuICog7ZSE66Gc7KCd7Yq4IOujqO2KuOyXkCAuc3djcmPqsIAg7J6I7Jy866m0IOq3uOqyg+ydhCwg7JeG7Jy866m0IHNvbmFtdSDquLDrs7gg7ISk7KCV7J2EIOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVN3Y0NvbmZpZ1BhdGgoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IHN3Y0ZpbGVQYXRoID0gXCIuc3djcmNcIjtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHN3Y0ZpbGVQYXRoKSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgLnN3Y3JjIGZyb20gcHJvamVjdCByb290Li4uXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgZGVmYXVsdCAuc3djcmMgZnJvbSBzb25hbXUgcGFja2FnZS4uLlwiKSk7XG4gICAgICBzd2NGaWxlUGF0aCA9IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCIuc3djcmMucHJvamVjdC1kZWZhdWx0XCIpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIlNldHRpbmcgdXAgc3djIGNvbmZpZyBmaWxlIGZhaWxlZC5cIiksIGVycm9yKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbiAgcmV0dXJuIHN3Y0ZpbGVQYXRoO1xufVxuXG4vKipcbiAqIHNvbmFtdSBidWlsZCAvIHNvbmFtdSBidWlsZCBhbGwg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBidWlsZF9hcGkgKyBidWlsZF93ZWLsnZgg7ZWp7ISx7J6F64uI64ukLiBXZWIg65SU66CJ7Yag66as6rCAIOyXhuycvOuptCBXZWIg67mM65Oc66W8IOyKpO2Cte2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfYWxsKCkge1xuICBhd2FpdCBidWlsZF9hcGkoKTtcbiAgYXdhaXQgYnVpbGRfd2ViKHsgc2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIGJ1aWxkIGFwaSDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIEFQSSDtlITroZzsoJ3tirjrp4wg67mM65Oc7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkX2FwaSgpIHtcbiAgY29uc3QgYXBwUm9vdCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCBzd2NGaWxlUGF0aCA9IGF3YWl0IHJlc29sdmVTd2NDb25maWdQYXRoKCk7XG5cbiAgY29uc3QgYXBpU3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIEFQSV9BUlRJRkFDVFMpIHtcbiAgICAgIGNvbnN0IGN3ZCA9IHBhdGguam9pbihhcHBSb290LCBhcnRpZmFjdC5wcm9qZWN0UGF0aCk7XG4gICAgICBwcmludFRhc2tIZWFkZXIoYXJ0aWZhY3QubmFtZSwgYXJ0aWZhY3QuZGVzY3JpcHRpb24sIGN3ZCk7XG5cbiAgICAgIGF3YWl0IHJ1bkJ1aWxkU3RlcHMoYXJ0aWZhY3QsIHsgY3dkLCBidWlsZENvbW1hbmRBcmdzOiB7IGNvbmZpZ0ZpbGVQYXRoOiBzd2NGaWxlUGF0aCB9IH0pO1xuICAgIH1cbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIkFQSVwiLCB0cnVlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIHBucG0gYnVpbGQgd2ViIO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICogV2ViIO2UhOuhnOygne2KuOunjCDruYzrk5ztlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRfd2ViKHsgc2tpcElmTWlzc2luZyA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBhcHBSb290ID0gZmluZEFwcFJvb3RQYXRoKCk7XG4gIGNvbnN0IHdlYlBhdGggPSBwYXRoLmpvaW4oYXBwUm9vdCwgXCJ3ZWJcIik7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYlBhdGgpKSkge1xuICAgIGlmIChza2lwSWZNaXNzaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KFwiV2ViIOuUlOugie2GoOumrOqwgCDsl4bsnLzrr4DroZwgV2ViIOu5jOuTnOulvCDqsbTrhIjrnIHri4jri6QuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGNvbnN0IHdlYlN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBXRUJfQVJUSUZBQ1RTKSB7XG4gICAgICBjb25zdCBjd2QgPSBwYXRoLmpvaW4oYXBwUm9vdCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuXG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczoge30gfSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIHRydWUsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJXZWJcIiwgZmFsc2UsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogcHJlLWJ1aWxkLCBidWlsZCwgcG9zdC1idWlsZCDri6jqs4Trpbwg7Iic7LCo7KCB7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwczxUPihcbiAgYXJ0aWZhY3Q6IEJ1aWxkQXJ0aWZhY3Q8VD4sXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmc7IGJ1aWxkQ29tbWFuZEFyZ3M6IFQgfSxcbikge1xuICBjb25zdCBzdGVwcyA9IFtcbiAgICB7IG5hbWU6IFwicHJlLWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucHJlQnVpbGRDb21tYW5kPy4oKSB9LFxuICAgIHsgbmFtZTogXCJidWlsZFwiLCBjbWQ6IGFydGlmYWN0LmJ1aWxkQ29tbWFuZChvcHRpb25zLmJ1aWxkQ29tbWFuZEFyZ3MpIH0sXG4gICAgeyBuYW1lOiBcInBvc3QtYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5wb3N0QnVpbGRDb21tYW5kPy4oKSB9LFxuICBdLmZpbHRlcigoc3RlcCkgPT4gc3RlcC5jbWQpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGVwID0gc3RlcHNbaV07XG4gICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gc3RlcHMubGVuZ3RoIC0gMTtcblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQoc3RlcC5jbWQpO1xuICAgICAgcHJpbnRUYXNrU3RhcnQoc3RlcC5uYW1lLCBzdGVwLmNtZCwgaXNMYXN0KTtcbiAgICAgIGF3YWl0IGV4ZWNXaXRoTGluZVByZWZpeChzdGVwLmNtZCwgeyBjd2Q6IG9wdGlvbnMuY3dkIH0pO1xuICAgICAgcHJpbnRUYXNrU3VjY2VzcyhzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcHJpbnRUYXNrRmFpbGVkKHN0ZXAubmFtZSwgaXNMYXN0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzdGVwLm5hbWV9IGZhaWxlZGAsIHsgY2F1c2U6IGUgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogcG5wbSBzdGFydCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOu5jOuTnOuQnCDtlITroZzsoJ3tirjrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOuQnCDqsrDqs7zrrLwoZGlzdCDrlJTroInthqDrpqzsnZggaW5kZXguanMg7JeU7Yq466as7Y+s7J247Yq4KeydtCDsl4bri6TrqbQg7Iuk7ZaJ7J2EIOykkeuLqO2VqeuLiOuLpC5cbiAqIOyGjOyKpOuntSDsp4Dsm5Dqs7wgZG90ZW52IOyngOybkOydhCDtj6ztlajtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcImRpc3QvaW5kZXguanNcIjtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoZW50cnlQb2ludCkpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2VudHJ5UG9pbnR9IG5vdCBmb3VuZC4gUGxlYXNlIGJ1aWxkIHlvdXIgcHJvamVjdCBmaXJzdC5gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJ1bjogcG5wbSBzb25hbXUgYnVpbGRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcImNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgIFtcIi0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIFwiLXJcIiwgXCJkb3RlbnYvY29uZmlnXCIsIGVudHJ5UG9pbnRdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9LFxuICApO1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBNaWdyYXRvcigpIHtcbiAgLy8gbWlncmF0b3JcbiAgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBGaXh0dXJlTWFuYWdlcigpIHtcbiAgRml4dHVyZU1hbmFnZXIuaW5pdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX2FwcGx5KHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcImFwcGx5XCIsIHRhcmdldHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3J1bigpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuICBjb25zdCBsb2NhbEhvc3RzID0gW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXTtcbiAgY29uc3QgdGFyZ2V0cyA9IE9iamVjdC5rZXlzKFNvbmFtdS5kYkNvbmZpZykuZmlsdGVyKCh0YXJnZXQpID0+IHtcbiAgICBjb25zdCB0YXJnZXRDb25maWcgPSBTb25hbXUuZGJDb25maWdbdGFyZ2V0IGFzIGtleW9mIFNvbmFtdURCQ29uZmlnXTtcbiAgICBjb25zdCBob3N0ID0gKHRhcmdldENvbmZpZz8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSk/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICByZXR1cm4gbG9jYWxIb3N0cy5pbmNsdWRlcyhob3N0LnRvTG93ZXJDYXNlKCkpO1xuICB9KTtcblxuICAvLyDroZzsu6wg642w7J207YSw67Kg7J207Iqk7JeQIOuMgO2VtOyEnOunjCDsoITssrQg66eI7J206re466CI7J207IWY7JeQ7IScIOuPmeyekVxuICBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oXCJhcHBseVwiLCB0YXJnZXRzIGFzIChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfc3RhdHVzKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG5cbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG4gIC8vIHN0YXR1cztcbiAgY29uc29sZS5sb2coc3RhdHVzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbml0KCkge1xuICBjb25zdCBzcmNDb25maWcgPSBTb25hbXUuZGJDb25maWcuZGV2ZWxvcG1lbnRfbWFzdGVyO1xuICBjb25zdCB0YXJnZXRzID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBcIihSRU1PVEUpIEZpeHR1cmUgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLmZpeHR1cmUsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIFRlc3RpbmcgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICB0b1NraXA6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZS5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgY29uc3QgbG9jYWxDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIHJldHVybiByZW1vdGVDb25uLmhvc3QgPT09IGxvY2FsQ29ubi5ob3N0ICYmIHJlbW90ZUNvbm4uZGF0YWJhc2UgPT09IGxvY2FsQ29ubi5kYXRhYmFzZTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgXSBhcyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgIHRvU2tpcD86IGJvb2xlYW47XG4gIH1bXTtcblxuICAvLyAxLiDquLDspIBEQiDsiqTtgqTrp4jrpbwg642k7ZSEXG4gIGNvbnNvbGUubG9nKFwiRFVNUC4uLlwiKTtcbiAgY29uc3QgZHVtcEZpbGVuYW1lID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm4gPSBzcmNDb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEdW1wID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC1taWdyYXRpb25zLSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgZXhlY1N5bmMoXG4gICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLWQgLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9ID4gJHtkdW1wRmlsZW5hbWV9YCxcbiAgKTtcbiAgY29uc3QgX2RiID0ga25leChzcmNDb25maWcpO1xuICBjb25zdCBbW21pZ3JhdGlvbnNdXSA9IGF3YWl0IF9kYi5yYXcoXG4gICAgXCJTRUxFQ1QgQ09VTlQoKikgYXMgY291bnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ID8gQU5EIHRhYmxlX25hbWUgPSAna25leF9taWdyYXRpb25zJ1wiLFxuICAgIFtzcmNDb25uLmRhdGFiYXNlXSxcbiAgKTtcbiAgaWYgKG1pZ3JhdGlvbnMuY291bnQgPiAwKSB7XG4gICAgZXhlY1N5bmMoXG4gICAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0ga25leF9taWdyYXRpb25zIGtuZXhfbWlncmF0aW9uc19sb2NrID4gJHttaWdyYXRpb25zRHVtcH1gLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDrjIDsg4FEQiDqsIHqsIHsl5Ag64yA7ZWY7JesIOyhtOyerOyXrOu2gCDtmZXsnbgg7ZuEIOu2k+q4sFxuICBmb3IgYXdhaXQgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbm4gPSBjb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG5cbiAgICBpZiAodG9Ta2lwID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7bGFiZWx9OiBTa2lwcGVkIWApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0ga25leCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLigoY29uZmlnLmNvbm5lY3Rpb24gPz8ge30pIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyksXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFtbcm93XV0gPSBhd2FpdCBkYi5yYXcoYFNIT1cgREFUQUJBU0VTIExJS0UgXCIke2Nvbm4uZGF0YWJhc2V9XCJgKTtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCR7bGFiZWx9OiBEYXRhYmFzZSBcIiR7Y29ubi5kYXRhYmFzZX1cIiBBbHJlYWR5IGV4aXN0c2ApKTtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTWU5DIHRvICR7bGFiZWx9Li4uYCk7XG4gICAgY29uc3QgbXlzcWxDbWQgPSBgbXlzcWwgLWgke2Nvbm4uaG9zdH0gLXUke2Nvbm4udXNlcn0gLXAke2Nvbm4ucGFzc3dvcmR9YDtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0RST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdDUkVBVEUgREFUQUJBU0UgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7ZHVtcEZpbGVuYW1lfWApO1xuICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7bWlncmF0aW9uc0R1bXB9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICB9XG5cbiAgYXdhaXQgX2RiLmRlc3Ryb3koKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgcmVjb3JkSWRzOiBudW1iZXJbXSkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShlbnRpdHlJZCwgcmVjb3JkSWRzKTtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX3N5bmMoKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbi8qKlxuICogZml4dHVyZSBnZW4g66qF66C57Ja0XG4gKiDsmLXshZjsnYQgcHJvY2Vzcy5hcmd27JeQ7IScIO2MjOyLsVxuICovXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2dlbigpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlR2VuQ29tbWFuZChvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBmaXh0dXJlIGZldGNoIOuqheugueyWtFxuICog7Ji17IWY7J2EIHByb2Nlc3MuYXJnduyXkOyEnCDtjIzsi7FcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9mZXRjaCgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlRmV0Y2hDb21tYW5kKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIGZpeHR1cmUgZXhwbG9yZSDrqoXroLnslrRcbiAqIOyYteyFmOydhCBwcm9jZXNzLmFyZ3bsl5DshJwg7YyM7IuxXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfZXhwbG9yZSgpIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhwcm9jZXNzLmFyZ3YpO1xuICBhd2FpdCBmaXh0dXJlRXhwbG9yZUNvbW1hbmQob3B0aW9ucyk7XG59XG5cbi8qKlxuICog6rCE64uo7ZWcIOyYteyFmCDtjIzshJxcbiAqL1xuZnVuY3Rpb24gcGFyc2VPcHRpb25zKFxuICBhcmd2OiBzdHJpbmdbXSxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IGJvb2xlYW4gfCBzdHJpbmdbXT4gJiB7IF86IHN0cmluZ1tdIH0ge1xuICBjb25zdCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgc3RyaW5nW10+ICYgeyBfOiBzdHJpbmdbXSB9ID0geyBfOiBbXSB9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFyZyA9IGFyZ3ZbaV07XG5cbiAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgY29uc3Qga2V5ID0gYXJnLnNsaWNlKDIpO1xuXG4gICAgICBpZiAoa2V5LmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICBjb25zdCBbaywgdl0gPSBrZXkuc3BsaXQoXCI9XCIpO1xuICAgICAgICBvcHRpb25zW2tdID0gdjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5leHQgPSBhcmd2W2kgKyAxXTtcbiAgICAgICAgaWYgKG5leHQgJiYgIW5leHQuc3RhcnRzV2l0aChcIi0tXCIpKSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gbmV4dDtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3B0aW9uc1trZXldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICBjb25zdCBrZXkgPSBhcmcuc2xpY2UoMSk7XG4gICAgICBjb25zdCBuZXh0ID0gYXJndltpICsgMV07XG5cbiAgICAgIGlmIChuZXh0ICYmICFuZXh0LnN0YXJ0c1dpdGgoXCItXCIpKSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IG5leHQ7XG4gICAgICAgIGkrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnNba2V5XSA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMuXy5wdXNoKGFyZyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfcHJhY3RpY2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByYWN0aWNlRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJwcmFjdGljZXNcIik7XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXIpO1xuXG4gIGNvbnN0IG1heFNlcU5vID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocHJhY3RpY2VEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkU2VxcyA9IGZpbGVOYW1lc1xuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IGZpbGVOYW1lLnN0YXJ0c1dpdGgoXCJwXCIpICYmIGZpbGVOYW1lLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgWywgc2VxTm9dID0gZmlsZU5hbWUubWF0Y2goL15wKFswLTldKyktLykgPz8gW1wiMFwiLCBcIjBcIl07XG4gICAgICAgIHJldHVybiBwYXJzZUludChzZXFObyk7XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcblxuICAgIGlmIChmaWx0ZXJlZFNlcXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkU2Vxc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSkoKTtcblxuICBjb25zdCBjdXJyZW50U2VxTm8gPSBtYXhTZXFObyArIDE7XG4gIGNvbnN0IGZpbGVOYW1lID0gYHAke2N1cnJlbnRTZXFOb30tJHtuYW1lfS50c2A7XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4ocHJhY3RpY2VEaXIsIGZpbGVOYW1lKTtcblxuICBjb25zdCBjb2RlID0gW1xuICAgIGBpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICBcIlwiLFxuICAgIGBjb25zb2xlLmNsZWFyKCk7YCxcbiAgICBgY29uc29sZS5sb2coXCIke2ZpbGVOYW1lfVwiKTtgLFxuICAgIFwiXCIsXG4gICAgYFNvbmFtdS5ydW5TY3JpcHQoYXN5bmMgKCkgPT4ge2AsXG4gICAgYCAvLyBUT0RPYCxcbiAgICBgfSk7YCxcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZShkc3RQYXRoLCBjb2RlKTtcblxuICBleGVjU3luYyhgY29kZSAke2RzdFBhdGh9YCk7XG5cbiAgY29uc3QgcnVuQ29kZSA9IGB5YXJuIG5vZGUgLXIgZG90ZW52L2NvbmZpZyAtLWVuYWJsZS1zb3VyY2UtbWFwcyBkaXN0L3ByYWN0aWNlcy8ke2ZpbGVOYW1lLnJlcGxhY2UoXG4gICAgXCIudHNcIixcbiAgICBcIi5qc1wiLFxuICApfWA7XG4gIGNvbnNvbGUubG9nKGAke2NoYWxrLmJsdWUocnVuQ29kZSl9IGNvcGllZCB0byBjbGlwYm9hcmQuYCk7XG4gIGV4ZWNTeW5jKGBlY2hvIFwiJHtydW5Db2RlfVwiIHwgcGJjb3B5YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfZW50aXR5KGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyBlbnRpdHlJZCwgdGl0bGU6IGVudGl0eUlkIH0pO1xuXG4gIGNvbnN0IHsgZmxhZ3MgfSA9IHBhcnNlQ2xpT3B0aW9ucygpO1xuICBjb25zdCB1c2VBSSA9IGZsYWdzLmhhcyhcImFpXCIpO1xuICBjb25zdCBub0NvbmVzID0gZmxhZ3MuaGFzKFwibm8tY29uZXNcIik7XG5cbiAgLy8gLS1uby1jb25lczogY29uZSDsg53shLEg7Iqk7YK1XG4gIGlmIChub0NvbmVzKSB7XG4gICAgY29uc29sZS5sb2coYOKckyBFbnRpdHkgJyR7ZW50aXR5SWR9JyBjcmVhdGVkIHdpdGhvdXQgY29uZXNgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICBpZiAoIWVudGl0eSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVudGl0eSBub3QgZm91bmQ6ICR7ZW50aXR5SWR9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gLS1haTogTExN7Jy866GcIGNvbmUg7IOd7ISxXG4gIGlmICh1c2VBSSkge1xuICAgIGNvbnNvbGUubG9nKGDinJMgRW50aXR5ICcke2VudGl0eUlkfScgY3JlYXRlZGApO1xuICAgIGNvbnNvbGUubG9nKGDwn4yfIEdlbmVyYXRpbmcgQUktcG93ZXJlZCBjb25lcy4uLmApO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdMb2NhbGUgPSBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgICBjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIlxuICAgICAgICAgID8gY29uZmlnTG9jYWxlXG4gICAgICAgICAgOiBcImtvXCI7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudGl0eS5nZW5lcmF0ZUNvbmVzKHtcbiAgICAgICAgcHJlc2VydmVFeGlzdGluZzogZmFsc2UsXG4gICAgICAgIG9ubHlFbXB0eTogZmFsc2UsXG4gICAgICAgIGxvY2FsZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zb2xlLmxvZyhg4pyFIERvbmUgKCR7cmVzdWx0LnRva2Vuc1VzZWR9IHRva2VucylgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIkFOVEhST1BJQ19BUElfS0VZXCIpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbvCfkqEgUmVtb3ZlIC0tYWkgZmxhZyB0byB1c2UgdGVtcGxhdGUgY29uZXMgaW5zdGVhZGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOq4sOuzuDog7YWc7ZSM66a/IGNvbmUg7J6Q64+ZIOyDneyEsVxuICAvLyBMTE0g7JeG7J20IGZha2VyLW1hcHBpbmdzLnRz66W8IO2ZnOyaqe2VmOyXrCDquLDrs7ggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAvLyDsnbTrpbwg7Ya17ZW0IEFOVEhST1BJQ19BUElfS0VZ6rCAIOyXhuyWtOuPhCBTb25hbXXrpbwg7IKs7Jqp7ZWgIOyImCDsnojsnLzrqbAsXG4gIC8vIOyDneyEseuQnCDthZztlIzrpr8gY29uZeydgCDrgpjspJHsl5AgJ2NvbmUgZ2VuJyDrqoXroLnslrTroZwgQUnrpbwg7Ya17ZW0IOyXheq3uOugiOydtOuTnO2VoCDsiJgg7J6I7Iq164uI64ukLlxuICBjb25zb2xlLmxvZyhg8J+MnyBHZW5lcmF0aW5nIHRlbXBsYXRlIGNvbmVzLi4uYCk7XG4gIGF3YWl0IGVudGl0eS5nZW5lcmF0ZVRlbXBsYXRlQ29uZXMoKTtcbiAgY29uc29sZS5sb2coYOKckyBFbnRpdHkgJyR7ZW50aXR5SWR9JyBjcmVhdGVkIHdpdGggdGVtcGxhdGUgY29uZXNgKTtcbiAgY29uc29sZS5sb2coYPCfkqEgVGlwOiBSdW4gJ3BucG0gc29uYW11IGNvbmUgZ2VuICR7ZW50aXR5SWR9JyB0byBpbXByb3ZlIHdpdGggQUlgKTtcbn1cblxuLyoqXG4gKiBBSeulvCDsgqzsmqntlZjsl6wgZW50aXR57J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOyDneyEse2VmOqxsOuCmCDsl4Xqt7jroIjsnbTrk5ztlanri4jri6QuXG4gKlxuICog7Ji17IWYOlxuICogLSAtLXJlZ2VuZXJhdGU6IOyghOyytCDsnqzsg53shLEgKOq4sOyhtCBjb25lIOuNruyWtOyTsOq4sClcbiAqIC0gLS1sb2NhbGUgPGtvfGVufGphPjog7IOd7ISxIOyWuOyWtCDsp4DsoJVcbiAqIC0g6riw67O4OiBvbmx5RW1wdHkg66qo65OcICjquLDsobQgZml4dHVyZUhpbnQg67O07KG0KVxuICpcbiAqIEFOVEhST1BJQ19BUElfS0VZIO2VhOyalCAoc29uYW11LnNlY3JldC50cyDrmJDripQg7ZmY6rK967OA7IiYKVxuICovXG5hc3luYyBmdW5jdGlvbiBjb25lX2dlbihlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICBjb25zdCB7IGZsYWdzLCBvcHRpb25zIH0gPSBwYXJzZUNsaU9wdGlvbnMoKTtcblxuICAvLyAtLWFsbCDsmLXshZg6IOuqqOuToCBlbnRpdHkgY29uZSDsg53shLFcbiAgaWYgKGZsYWdzLmhhcyhcImFsbFwiKSB8fCBlbnRpdHlJZCA9PT0gXCJhbGxcIikge1xuICAgIGNvbnN0IGFsbEVudGl0aWVzID0gRW50aXR5TWFuYWdlci5nZXRBbGxFbnRpdGllcygpO1xuICAgIGNvbnNvbGUubG9nKGDwn4yfIEdlbmVyYXRpbmcgQUktcG93ZXJlZCBjb25lcyBmb3IgJHthbGxFbnRpdGllcy5sZW5ndGh9IGVudGl0aWVzLi4uXFxuYCk7XG5cbiAgICBsZXQgdG90YWxUb2tlbnMgPSAwO1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGFsbEVudGl0aWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUHJvY2Vzc2luZyAke2VudGl0eS5pZH0uLi5gKTtcbiAgICAgICAgY29uc3QgY29uZmlnTG9jYWxlID0gb3B0aW9ucy5sb2NhbGUgfHwgU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgICAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgICAgIGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiXG4gICAgICAgICAgICA/IGNvbmZpZ0xvY2FsZVxuICAgICAgICAgICAgOiBcImtvXCI7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgICAgIHByZXNlcnZlRXhpc3Rpbmc6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgICAgIG9ubHlFbXB0eTogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICB9KTtcblxuICAgICAgICB0b3RhbFRva2VucyArPSByZXN1bHQudG9rZW5zVXNlZDtcbiAgICAgICAgY29uc29sZS5sb2coYCAg4pyTICR7ZW50aXR5LmlkfSAoJHtyZXN1bHQudG9rZW5zVXNlZH0gdG9rZW5zKVxcbmApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogXCJVbmtub3duIGVycm9yXCI7XG4gICAgICAgIGVycm9ycy5wdXNoKGAke2VudGl0eS5pZH06ICR7bWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICDinJcgJHtlbnRpdHkuaWR9OiAke21lc3NhZ2V9XFxuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFxcbuKchSBEb25lISBUb3RhbDogJHt0b3RhbFRva2Vuc30gdG9rZW5zIHVzZWRgKTtcbiAgICBjb25zdCBlc3RpbWF0ZWRDb3N0ID0gKHRvdGFsVG9rZW5zICogOSkgLyAxXzAwMF8wMDA7XG4gICAgY29uc29sZS5sb2coYPCfkrAgRXN0aW1hdGVkIGNvc3Q6IH4kJHtlc3RpbWF0ZWRDb3N0LnRvRml4ZWQoNCl9YCk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFxcbuKdjCBGYWlsZWQgZW50aXRpZXMgKCR7ZXJyb3JzLmxlbmd0aH0pOmApO1xuICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3JzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgLSAke2Vycn1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8g64uo7J28IGVudGl0eSBjb25lIOyDneyEsVxuICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gIGlmICghZW50aXR5KSB7XG4gICAgY29uc29sZS5lcnJvcihgRW50aXR5IG5vdCBmb3VuZDogJHtlbnRpdHlJZH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtb2RlID0gZmxhZ3MuaGFzKFwicmVnZW5lcmF0ZVwiKSA/IFwicmVnZW5lcmF0aW5nXCIgOiBcImdlbmVyYXRpbmdcIjtcbiAgY29uc29sZS5sb2coXG4gICAgYPCfjJ8gJHttb2RlID09PSBcInJlZ2VuZXJhdGluZ1wiID8gXCJSZWdlbmVyYXRpbmdcIiA6IFwiR2VuZXJhdGluZ1wifSBBSS1wb3dlcmVkIGNvbmVzIGZvciAke2VudGl0eUlkfS4uLmAsXG4gICk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjb25maWdMb2NhbGUgPSBvcHRpb25zLmxvY2FsZSB8fCBTb25hbXUuY29uZmlnLmkxOG4/LmRlZmF1bHRMb2NhbGU7XG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIGNvbmZpZ0xvY2FsZSA9PT0gXCJrb1wiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJlblwiIHx8IGNvbmZpZ0xvY2FsZSA9PT0gXCJqYVwiID8gY29uZmlnTG9jYWxlIDogXCJrb1wiO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW50aXR5LmdlbmVyYXRlQ29uZXMoe1xuICAgICAgcHJlc2VydmVFeGlzdGluZzogIWZsYWdzLmhhcyhcInJlZ2VuZXJhdGVcIiksXG4gICAgICBvbmx5RW1wdHk6ICFmbGFncy5oYXMoXCJyZWdlbmVyYXRlXCIpLFxuICAgICAgbG9jYWxlLFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coYOKchSBEb25lISAoJHtyZXN1bHQudG9rZW5zVXNlZH0gdG9rZW5zIHVzZWQpYCk7XG5cbiAgICAvLyDthqDtgbAg67mE7JqpIOqzhOyCsCAo64yA65617KCB7J24IOy2lOyglSlcbiAgICAvLyBDbGF1ZGUgU29ubmV0IDQuNTogaW5wdXQgJDMvTSB0b2tlbnMsIG91dHB1dCAkMTUvTSB0b2tlbnNcbiAgICAvLyDqsITri6jtlZjqsowg7Y+J6regICQ5L00gdG9rZW5z66GcIOqzhOyCsFxuICAgIGNvbnN0IGVzdGltYXRlZENvc3QgPSAocmVzdWx0LnRva2Vuc1VzZWQgKiA5KSAvIDFfMDAwXzAwMDtcbiAgICBjb25zb2xlLmxvZyhg8J+SsCBFc3RpbWF0ZWQgY29zdDogfiQke2VzdGltYXRlZENvc3QudG9GaXhlZCg0KX1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJBTlRIUk9QSUNfQVBJX0tFWVwiKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBcXG7wn5KhIFRvIHVzZSBBSS1wb3dlcmVkIGNvbmUgZ2VuZXJhdGlvbjpgKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgICAgMS4gR2V0IGFuIEFQSSBrZXkgZnJvbSBodHRwczovL2NvbnNvbGUuYW50aHJvcGljLmNvbS9gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgICAgMi4gQWRkIGl0IHRvIHNvbmFtdS5zZWNyZXQudHMgb3Igc2V0IEFOVEhST1BJQ19BUElfS0VZIGVudmlyb25tZW50IHZhcmlhYmxlYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIlJhdGUgbGltaXRcIikpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu8J+SoSBQbGVhc2Ugd2FpdCBhIG1vbWVudCBhbmQgdHJ5IGFnYWluLmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgXFxu4p2MIEZhaWxlZCB0byBnZW5lcmF0ZSBjb25lczogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBcXG7inYwgRmFpbGVkIHRvIGdlbmVyYXRlIGNvbmVzOiBVbmtub3duIGVycm9yYCk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsKGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFwibW9kZWxcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGRfbW9kZWxfdGVzdChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsX3Rlc3RcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuLyoqXG4gKiBwbnBtIHNvbmFtdSBza2lsbHMgc3luYyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOqzteyLnSBTa2lsbHPrpbwg66Gc7LusIO2UhOuhnOygne2KuOuhnCDrj5nquLDtmZTtlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19zeW5jKCkge1xuICBjb25zdCB3b3Jrc3BhY2VSb290ID0gYXdhaXQgZmluZFdvcmtzcGFjZVJvb3QoKTtcbiAgY29uc3QgY2xhdWRlRGlyID0gcGF0aC5qb2luKHdvcmtzcGFjZVJvb3QsIFwiLmNsYXVkZVwiKTtcbiAgY29uc3QgdGFyZ2V0U2tpbGxzRGlyID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJza2lsbHNcIiwgXCJzb25hbXVcIik7XG5cbiAgLy8g6rCc67CcIO2ZmOqyvSAtIGNsaS50czogc29uYW11L21vZHVsZXMvc29uYW11L3NyYy9iaW4vY2xpLnRzXG4gIC8vIOu5jOuTnCDtm4QgLSBjbGkuanM6IG5vZGVfbW9kdWxlcy9zb25hbXUvZGlzdC9iaW4vY2xpLmpzICjsi6TsoJwg7Iuk7ZaJKVxuICAvLyBza2lsbHMg7JyE7LmYOiBub2RlX21vZHVsZXMvc29uYW11L3NyYy9za2lsbHMgKG5wbSDrsLDtj6wg7IucKVxuICBjb25zdCBzb3VyY2VCYXNlID0gcGF0aC5yZXNvbHZlKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcInNyY1wiLCBcInNraWxsc1wiKTtcbiAgY29uc3Qgc291cmNlU2tpbGxzRGlyID0gcGF0aC5qb2luKHNvdXJjZUJhc2UsIFwic29uYW11XCIpO1xuICBjb25zdCBzb3VyY2VDbGF1ZGVNZCA9IHBhdGguam9pbihzb3VyY2VCYXNlLCBcIkNMQVVERS5tZFwiKTtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoc291cmNlU2tpbGxzRGlyKSkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJTa2lsbHMgc291cmNlIG5vdCBmb3VuZCBpbiBzb25hbXUgcGFja2FnZS5cIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOq4sOyhtCDrlJTroInthqDrpqwvc3ltbGluayDsgq3soJwg7ZuEIHN5bWxpbmsg7IOd7ISxXG4gIC8vIGV4aXN0cygp64qUIGJyb2tlbiBzeW1saW5r66W8IOqwkOyngO2VmOyngCDrqrvtlZjrr4DroZwgcm3snYQg66y07KGw6rG0IOyLnOuPhO2VqeuLiOuLpFxuICB0cnkge1xuICAgIGF3YWl0IHJtKHRhcmdldFNraWxsc0RpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICAvLyDtjIzsnbzsnbQg7JeG7Jy866m0IOustOyLnFxuICB9XG5cbiAgLy8g64yA7IOBIOuUlOugie2GoOumrCDsg53shLFcbiAgYXdhaXQgbWtkaXIocGF0aC5kaXJuYW1lKHRhcmdldFNraWxsc0RpciksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgc3ltbGluayhzb3VyY2VTa2lsbHNEaXIsIHRhcmdldFNraWxsc0RpciwgXCJkaXJcIik7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBTa2lsbHMgbGlua2VkIChzeW1saW5rKWApKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGNoYWxrLnllbGxvdyhg4pqgIFN5bWxpbmsgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKSxcbiAgICApO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgICBGYWxsaW5nIGJhY2sgdG8gY29weS4uLmApKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY3Aoc291cmNlU2tpbGxzRGlyLCB0YXJnZXRTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBTa2lsbHMgY29waWVkYCkpO1xuICAgIH0gY2F0Y2ggKGNvcHlFcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGDinJcgRmFpbGVkIHRvIGNvcHkgc2tpbGxzOiAke2NvcHlFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gY29weUVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoY29weUVycm9yKX1gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHRocm93IGNvcHlFcnJvcjtcbiAgICB9XG4gIH1cblxuICAvLyBwcm9qZWN0IOuUlOugie2GoOumrCDstIjquLDtmZQgKOyXhuycvOuptCDsg53shLEsIOyeiOycvOuptCDsnKDsp4ApXG4gIGNvbnN0IHNvdXJjZVByb2plY3REaXIgPSBwYXRoLmpvaW4oc291cmNlQmFzZSwgXCJwcm9qZWN0XCIpO1xuICBjb25zdCB0YXJnZXRQcm9qZWN0RGlyID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJza2lsbHNcIiwgXCJwcm9qZWN0XCIpO1xuXG4gIGlmIChhd2FpdCBleGlzdHMoc291cmNlUHJvamVjdERpcikpIHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHModGFyZ2V0UHJvamVjdERpcikpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjcChzb3VyY2VQcm9qZWN0RGlyLCB0YXJnZXRQcm9qZWN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBQcm9qZWN0IHRlbXBsYXRlcyBpbml0aWFsaXplZGApKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgICAgYOKclyBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9qZWN0IHRlbXBsYXRlczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYOKPrSBQcm9qZWN0IHRlbXBsYXRlcyBhbHJlYWR5IGV4aXN0IChwcmVzZXJ2ZWQpYCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENMQVVERS5tZCDrs7Xsgqwv7JeF642w7J207Yq4XG4gIGlmIChhd2FpdCBleGlzdHMoc291cmNlQ2xhdWRlTWQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRhcmdldENsYXVkZU1kID0gcGF0aC5qb2luKGNsYXVkZURpciwgXCJDTEFVREUubWRcIik7XG4gICAgICBjb25zdCBzb3VyY2VDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoc291cmNlQ2xhdWRlTWQsIFwidXRmLThcIik7XG5cbiAgICAgIGlmIChhd2FpdCBleGlzdHModGFyZ2V0Q2xhdWRlTWQpKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldENvbnRlbnQgPSBhd2FpdCByZWFkRmlsZSh0YXJnZXRDbGF1ZGVNZCwgXCJ1dGYtOFwiKTtcbiAgICAgICAgY29uc3Qgc3RhcnRNYXJrZXIgPSBcIjwhLS0gU09OQU1VOlNUQVJUIC0tPlwiO1xuICAgICAgICBjb25zdCBlbmRNYXJrZXIgPSBcIjwhLS0gU09OQU1VOkVORCAtLT5cIjtcbiAgICAgICAgaWYgKHRhcmdldENvbnRlbnQuaW5jbHVkZXMoc3RhcnRNYXJrZXIpICYmIHRhcmdldENvbnRlbnQuaW5jbHVkZXMoZW5kTWFya2VyKSkge1xuICAgICAgICAgIC8vIG1hcmtlciDsmIHsl63rp4wg6rWQ7LK07ZWp64uI64ukLlxuICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gdGFyZ2V0Q29udGVudC5pbmRleE9mKHN0YXJ0TWFya2VyKTtcbiAgICAgICAgICBjb25zdCBlbmRJZHggPSB0YXJnZXRDb250ZW50LmluZGV4T2YoZW5kTWFya2VyKTtcblxuICAgICAgICAgIGlmIChzdGFydElkeCAhPT0gLTEgJiYgZW5kSWR4ICE9PSAtMSAmJiBzdGFydElkeCA8IGVuZElkeCkge1xuICAgICAgICAgICAgY29uc3QgYmVmb3JlID0gdGFyZ2V0Q29udGVudC5zdWJzdHJpbmcoMCwgc3RhcnRJZHgpO1xuICAgICAgICAgICAgY29uc3QgYWZ0ZXIgPSB0YXJnZXRDb250ZW50LnN1YnN0cmluZyhlbmRJZHggKyBlbmRNYXJrZXIubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBgJHtiZWZvcmV9JHtzdGFydE1hcmtlcn1cXG4ke3NvdXJjZUNvbnRlbnR9XFxuJHtlbmRNYXJrZXJ9JHthZnRlcn1gO1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHRhcmdldENsYXVkZU1kLCBuZXdDb250ZW50KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQ0xBVURFLm1kIHVwZGF0ZWQgKG1hcmtlciByZWdpb24pYCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYOKPrSBDTEFVREUubWQgbWFya2VyIHBvc2l0aW9ucyBpbnZhbGlkLCBza2lwcGVkYCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHRhcmdldENsYXVkZU1kLCBzb3VyY2VDb250ZW50KTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBDTEFVREUubWQgY3JlYXRlZGApKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgY2hhbGsucmVkKFxuICAgICAgICAgIGDinJcgRmFpbGVkIHRvIHVwZGF0ZSBDTEFVREUubWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIHBucG0gc29uYW11IHNraWxscyBjcmVhdGUgPG5hbWU+IO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog66Gc7LusIHNraWxsIOy0iOyViOydhCDsg53shLHtlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19jcmVhdGUobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHdvcmtzcGFjZVJvb3QgPSBhd2FpdCBmaW5kV29ya3NwYWNlUm9vdCgpO1xuICBjb25zdCBsb2NhbERpciA9IHBhdGguam9pbih3b3Jrc3BhY2VSb290LCBcIi5jbGF1ZGVcIiwgXCJza2lsbHNcIiwgXCJsb2NhbFwiKTtcblxuICAvLyA9PT0g7YyM7J2866qFIOqygOymnSDrsI8gU2FuaXRpemUgPT09XG4gIGlmICghbmFtZSB8fCBuYW1lLnRyaW0oKSA9PT0gXCJcIikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwi4pyXIFNraWxsIG5hbWUgaXMgcmVxdWlyZWRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzYW5pdGl6ZWQgPSBuYW1lXG4gICAgLy8g6rO167Cx7J2EIO2VmOydtO2UiOycvOuhnFxuICAgIC5yZXBsYWNlKC9cXHMrL2csIFwiLVwiKVxuICAgIC8vIOqyveuhnCDqtazrtoTsnpAg7KCc6rGwXG4gICAgLnJlcGxhY2UoL1svXFxcXF0vZywgXCItXCIpXG4gICAgLy8gUGF0aCB0cmF2ZXJzYWwg67Cp7KeAXG4gICAgLnJlcGxhY2UoL1xcLlxcLi9nLCBcIlwiKVxuICAgIC8vIFdpbmRvd3Mg6riI7KeAIOusuOyekCDsoJzqsbBcbiAgICAucmVwbGFjZSgvWzw+OlwifD8qXS9nLCBcIlwiKVxuICAgIC8vIOyLnOyekS/rgZ0g7KCQLCDtlZjsnbTtlIgsIOyWuOuNlOyKpOy9lOyWtCDsoJzqsbBcbiAgICAucmVwbGFjZSgvXlsuXFwtX10rfFsuXFwtX10rJC9nLCBcIlwiKVxuICAgIC8vIOyXsOyGjeuQnCDtlZjsnbTtlIjsnYQg7ZWY64KY66GcXG4gICAgLnJlcGxhY2UoLy0rL2csIFwiLVwiKVxuICAgIC8vIOyVjO2MjOuysywg7Iir7J6QLCDtlZjsnbTtlIgsIOyWuOuNlOyKpOy9lOyWtCwg7ZWc6riA66eMIO2XiOyaqVxuICAgIC5yZXBsYWNlKC9bXmEtekEtWjAtOS1f6rCALe2eo10vZywgXCJcIik7XG5cbiAgLy8g6ri47J20IOygnO2VnFxuICBjb25zdCBNQVhfTEVOR1RIID0gMTAwO1xuICBpZiAoc2FuaXRpemVkLmxlbmd0aCA+IE1BWF9MRU5HVEgpIHtcbiAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQuc3Vic3RyaW5nKDAsIE1BWF9MRU5HVEgpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4pqgIE5hbWUgdHJ1bmNhdGVkIHRvICR7TUFYX0xFTkdUSH0gY2hhcmFjdGVyc2ApKTtcbiAgfVxuXG4gIC8vIFdpbmRvd3Mg7JiI7JW97Ja0IO2ZleyduFxuICBjb25zdCBSRVNFUlZFRF9OQU1FUyA9IFtcbiAgICBcIkNPTlwiLFxuICAgIFwiUFJOXCIsXG4gICAgXCJBVVhcIixcbiAgICBcIk5VTFwiLFxuICAgIFwiQ09NMVwiLFxuICAgIFwiQ09NMlwiLFxuICAgIFwiQ09NM1wiLFxuICAgIFwiQ09NNFwiLFxuICAgIFwiQ09NNVwiLFxuICAgIFwiQ09NNlwiLFxuICAgIFwiQ09NN1wiLFxuICAgIFwiQ09NOFwiLFxuICAgIFwiQ09NOVwiLFxuICAgIFwiTFBUMVwiLFxuICAgIFwiTFBUMlwiLFxuICAgIFwiTFBUM1wiLFxuICAgIFwiTFBUNFwiLFxuICAgIFwiTFBUNVwiLFxuICAgIFwiTFBUNlwiLFxuICAgIFwiTFBUN1wiLFxuICAgIFwiTFBUOFwiLFxuICAgIFwiTFBUOVwiLFxuICBdO1xuICBpZiAoUkVTRVJWRURfTkFNRVMuaW5jbHVkZXMoc2FuaXRpemVkLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgc2FuaXRpemVkID0gYHNraWxsLSR7c2FuaXRpemVkfWA7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgUmVzZXJ2ZWQgbmFtZSBkZXRlY3RlZCwgcHJlZml4ZWQgd2l0aCBcInNraWxsLVwiYCkpO1xuICB9XG5cbiAgLy8g67mIIOusuOyekOyXtCDssrTtgaxcbiAgaWYgKHNhbml0aXplZCA9PT0gXCJcIikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwi4pyXIEludmFsaWQgc2tpbGwgbmFtZSBhZnRlciBzYW5pdGl6YXRpb25cIikpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBPcmlnaW5hbDogXCIke25hbWV9XCJgKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8g67OA6rK9IOyVjOumvFxuICBpZiAoc2FuaXRpemVkICE9PSBuYW1lKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgTmFtZSBzYW5pdGl6ZWQ6IFwiJHtuYW1lfVwiIOKGkiBcIiR7c2FuaXRpemVkfVwiYCkpO1xuICB9XG5cbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4obG9jYWxEaXIsIGAke3Nhbml0aXplZH0ubWRgKTtcblxuICBpZiAoYXdhaXQgZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgU2tpbGwgXCIke3Nhbml0aXplZH1cIiBhbHJlYWR5IGV4aXN0cy5gKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgbWtkaXIobG9jYWxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gYC0tLVxubmFtZTogJHtzYW5pdGl6ZWR9XG5jYXRlZ29yeTogb3RoZXJcbmNyZWF0ZWRfYXQ6ICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXX1cbnN0YXR1czogZHJhZnRcbi0tLVxuXG4jICR7c2FuaXRpemVkfVxuXG4jIyDsg4HtmalcblxuW+yWtOuWpCDrrLjsoJzsmIDripTsp4BdXG5cbiMjIO2VtOqysCDrsKnrspVcblxuW+yWtOuWu+qyjCDtlbTqsrDtlojripTsp4BdXG5cbiMjIOy9lOuTnCDsmIjsi5xcblxuXFxgXFxgXFxgdHlwZXNjcmlwdFxuLy8g7JiI7IucIOy9lOuTnFxuXFxgXFxgXFxgXG5gO1xuXG4gIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgdGVtcGxhdGUpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIENyZWF0ZWQgLmNsYXVkZS9za2lsbHMvbG9jYWwvJHtzYW5pdGl6ZWR9Lm1kYCkpO1xufVxuXG4vKipcbiAqIHBucG0gc29uYW11IGF1dGggZ2VuZXJhdGUg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiBiZXR0ZXItYXV0aCDsl5Tti7Dti7Drk6QoVXNlciwgU2Vzc2lvbiwgQWNjb3VudCwgVmVyaWZpY2F0aW9uKeydhCDsg53shLHtlanri4jri6QuXG4gKlxuICog7Ji17IWYOlxuICogLS1wbHVnaW5zIHBob25lLW51bWJlciwyZmEgIO2UjOufrOq3uOyduCDsl5Tti7Dti7Drj4Qg7ZWo6ruYIOyDneyEsVxuICovXG5hc3luYyBmdW5jdGlvbiBhdXRoX2dlbmVyYXRlKCkge1xuICAvLyAtLXBsdWdpbnMg7Ji17IWYIO2MjOyLsVxuICBjb25zdCBwbHVnaW5zQXJnID0gcHJvY2Vzcy5hcmd2LmZpbmQoKGFyZykgPT4gYXJnLnN0YXJ0c1dpdGgoXCItLXBsdWdpbnNcIikpO1xuICBjb25zdCBwbHVnaW5zOiBCZXR0ZXJBdXRoUGx1Z2luSWRbXSA9IFtdO1xuXG4gIGlmIChwbHVnaW5zQXJnKSB7XG4gICAgY29uc3QgcGx1Z2luVmFsdWUgPSBwbHVnaW5zQXJnLmluY2x1ZGVzKFwiPVwiKVxuICAgICAgPyBwbHVnaW5zQXJnLnNwbGl0KFwiPVwiKVsxXVxuICAgICAgOiBwcm9jZXNzLmFyZ3ZbcHJvY2Vzcy5hcmd2LmluZGV4T2YocGx1Z2luc0FyZykgKyAxXTtcblxuICAgIGlmIChwbHVnaW5WYWx1ZSkge1xuICAgICAgY29uc3QgcGx1Z2luSWRzID0gcGx1Z2luVmFsdWUuc3BsaXQoXCIsXCIpLm1hcCgocCkgPT4gcC50cmltKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IGlkIG9mIHBsdWdpbklkcykge1xuICAgICAgICBpZiAoaXNWYWxpZFBsdWdpbklkKGlkKSkge1xuICAgICAgICAgIHBsdWdpbnMucHVzaChpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGDimqAgVW5rbm93biBwbHVnaW46ICR7aWR9YCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShgICBTdXBwb3J0ZWQgcGx1Z2luczogJHtTVVBQT1JURURfUExVR0lOX0lEUy5qb2luKFwiLCBcIil9YCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCLwn5SQIEdlbmVyYXRpbmcgYmV0dGVyLWF1dGggZW50aXRpZXMuLi5cXG5cIikpO1xuXG4gIGlmIChwbHVnaW5zLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oYCAgUGx1Z2luczogJHtwbHVnaW5zLmpvaW4oXCIsIFwiKX1gKSk7XG4gIH1cblxuICBhd2FpdCBnZW5lcmF0ZUJldHRlckF1dGhFbnRpdGllcyh7IHBsdWdpbnMgfSk7XG59XG5cbi8qKlxuICog7JuM7YGs7Iqk7Y6Y7J207IqkIOujqO2KuOulvCDssL7sirXri4jri6QuXG4gKiDsmrDshKDsiJzsnIQ6IHBucG0td29ya3NwYWNlLnlhbWwgPiBDTEFVREUubWQgPiDro6jtirggcGFja2FnZS5qc29uICh3b3Jrc3BhY2VzIO2VhOuTnClcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZFdvcmtzcGFjZVJvb3QoKSB7XG4gIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIHdoaWxlIChkaXIgIT09IHBhdGguZGlybmFtZShkaXIpKSB7XG4gICAgLy8gMS4gcG5wbS13b3Jrc3BhY2UueWFtbCDtjIzsnbzsnbQg7J6I64qU7KeAIO2ZleyduC4g7J6I7Jy866m0IO2ZleyLpO2VnCBtb25vcmVwbyDro6jtirguXG4gICAgaWYgKGF3YWl0IGV4aXN0cyhwYXRoLmpvaW4oZGlyLCBcInBucG0td29ya3NwYWNlLnlhbWxcIikpKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cblxuICAgIC8vIDIuIENMQVVERS5tZCDtjIzsnbzsnbQg7J6I64qU7KeAIO2ZleyduC4g7J6I7Jy866m0IO2UhOuhnOygne2KuCDro6jtirjroZwg6rCE7KO87ZWoLlxuICAgIGlmIChhd2FpdCBleGlzdHMocGF0aC5qb2luKGRpciwgXCJDTEFVREUubWRcIikpKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cblxuICAgIC8vIDMuIHBhY2thZ2UuanNvbuyXkCB3b3Jrc3BhY2VzIO2VhOuTnOqwgCDsnojsnLzrqbQg66Oo7Yq4LlxuICAgIGNvbnN0IHBhY2thZ2VQYXRoID0gcGF0aC5qb2luKGRpciwgXCJwYWNrYWdlLmpzb25cIik7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhwYWNrYWdlUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShwYWNrYWdlUGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICAgIGlmIChwYWNrYWdlSnNvbi53b3Jrc3BhY2VzKSB7XG4gICAgICAgICAgcmV0dXJuIGRpcjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIO2MjOyLsSDsi6TtjKjsi5wg66y07IucXG4gICAgICB9XG4gICAgfVxuICAgIGRpciA9IHBhdGguZGlybmFtZShkaXIpO1xuICB9XG5cbiAgLy8g7LC+7KeAIOuqu+2VmOuptCBhcGkg7Y+0642U7J2YIOu2gOuqqCDsgqzsmqlcbiAgcmV0dXJuIGZpbmRBcHBSb290UGF0aCgpO1xufVxuIl0sIm5hbWVzIjpbImNoYWxrIiwiZG90ZW52IiwiY29uZmlnIiwiYXNzZXJ0IiwiZXhlY1N5bmMiLCJzcGF3biIsImNwIiwibWtkaXIiLCJyZWFkZGlyIiwicmVhZEZpbGUiLCJybSIsInN5bWxpbmsiLCJ3cml0ZUZpbGUiLCJrbmV4IiwiY3JlYXRlUmVxdWlyZSIsInBhdGgiLCJwcm9jZXNzIiwidHNpY2xpIiwiU29uYW11IiwiZ2VuZXJhdGVCZXR0ZXJBdXRoRW50aXRpZXMiLCJpc1ZhbGlkUGx1Z2luSWQiLCJTVVBQT1JURURfUExVR0lOX0lEUyIsIkVudGl0eU1hbmFnZXIiLCJNaWdyYXRvciIsIkZpeHR1cmVNYW5hZ2VyIiwiZXhlY1dpdGhMaW5lUHJlZml4IiwicHJpbnRCdWlsZFN1bW1hcnkiLCJwcmludFRhc2tGYWlsZWQiLCJwcmludFRhc2tIZWFkZXIiLCJwcmludFRhc2tTdGFydCIsInByaW50VGFza1N1Y2Nlc3MiLCJleGlzdHMiLCJmaW5kQXBpUm9vdFBhdGgiLCJmaW5kQXBwUm9vdFBhdGgiLCJBUElfQVJUSUZBQ1RTIiwiV0VCX0FSVElGQUNUUyIsImZpeHR1cmVFeHBsb3JlQ29tbWFuZCIsImZpeHR1cmVGZXRjaENvbW1hbmQiLCJmaXh0dXJlR2VuQ29tbWFuZCIsIm1pZ3JhdG9yIiwicGFyc2VDbGlPcHRpb25zIiwiYXJndiIsImZsYWdzIiwiU2V0Iiwib3B0aW9ucyIsImkiLCJsZW5ndGgiLCJhcmciLCJzdGFydHNXaXRoIiwiaW5jbHVkZXMiLCJrZXkiLCJ2YWx1ZSIsInNsaWNlIiwic3BsaXQiLCJuZXh0QXJnIiwiYWRkIiwiYm9vdHN0cmFwIiwibm90VG9Jbml0IiwiaW5pdCIsImZpbHRlcmVkQXJndiIsInNraXBOZXh0IiwiYWZ0ZXJEb3VibGVEYXNoIiwicHVzaCIsImNtZCIsInR5cGVzIiwidHlwZSIsIm5hbWUiLCJtZXNzYWdlIiwiY2hvaWNlcyIsImdldEFsbFBhcmVudElkcyIsIm1hcCIsImVudGl0eUlkIiwidGl0bGUiLCJhcmdzIiwicnVubmVycyIsIm1pZ3JhdGVfc3RhdHVzIiwibWlncmF0ZV9ydW4iLCJtaWdyYXRlX2FwcGx5IiwiZml4dHVyZV9pbml0IiwiZml4dHVyZV9pbXBvcnQiLCJmaXh0dXJlX3N5bmMiLCJmaXh0dXJlX2dlbiIsImZpeHR1cmVfZmV0Y2giLCJmaXh0dXJlX2V4cGxvcmUiLCJzdHViX3ByYWN0aWNlIiwic3R1Yl9lbnRpdHkiLCJzY2FmZm9sZF9tb2RlbCIsInNjYWZmb2xkX21vZGVsX3Rlc3QiLCJjb25lX2dlbiIsInN5bmMiLCJidWlsZF9hbGwiLCJidWlsZF9hcGkiLCJidWlsZF93ZWIiLCJkZXZfYWxsIiwiZGV2X2FwaSIsImRldl93ZWIiLCJzdGFydCIsInNraWxsc19zeW5jIiwic2tpbGxzX2NyZWF0ZSIsImF1dGhfZ2VuZXJhdGUiLCJkZXN0cm95IiwiZmluYWxseSIsInN5bmNlciIsInNwYXduQXBpRGV2U2VydmVyIiwiYXBpUm9vdCIsImVudHJ5UG9pbnQiLCJob3RSdW5uZXJCaW5QYXRoIiwidXJsIiwicmVzb2x2ZSIsInNlcnZlclByb2Nlc3MiLCJleGVjUGF0aCIsImpvaW4iLCJjd2QiLCJzdGRpbyIsImVudiIsIk5PREVfRU5WIiwiSE9UIiwiQVBJX1JPT1RfUEFUSCIsImV4dHJhRW52IiwiY2xlYW51cCIsImNvbnNvbGUiLCJsb2ciLCJ5ZWxsb3ciLCJraWxsIiwiZXhpdCIsIm9uIiwiY29kZSIsImVycm9yIiwicmVkIiwiYm9sZCIsIlNPTkFNVV9ESVNBQkxFX0lOVEVHUkFURURfV0VCIiwiYXBwUm9vdCIsIndlYlBhdGgiLCJkb3VibGVEYXNoSW5kZXgiLCJpbmRleE9mIiwicGFzc3Rocm91Z2hBcmdzIiwidml0ZUFyZ3MiLCJ2aXRlUHJvY2VzcyIsInNpZ25hbCIsInJlc29sdmVTd2NDb25maWdQYXRoIiwic3djRmlsZVBhdGgiLCJkaW0iLCJkaXJuYW1lIiwic2tpcElmTWlzc2luZyIsImFwaVN0YXJ0ZWRBdCIsIkRhdGUiLCJub3ciLCJhcnRpZmFjdCIsInByb2plY3RQYXRoIiwiZGVzY3JpcHRpb24iLCJydW5CdWlsZFN0ZXBzIiwiYnVpbGRDb21tYW5kQXJncyIsImNvbmZpZ0ZpbGVQYXRoIiwiZSIsImdyYXkiLCJ3ZWJTdGFydGVkQXQiLCJzdGVwcyIsInByZUJ1aWxkQ29tbWFuZCIsImJ1aWxkQ29tbWFuZCIsInBvc3RCdWlsZENvbW1hbmQiLCJmaWx0ZXIiLCJzdGVwIiwiaXNMYXN0IiwiRXJyb3IiLCJjYXVzZSIsImJsdWUiLCJzZXR1cE1pZ3JhdG9yIiwic2V0dXBGaXh0dXJlTWFuYWdlciIsInRhcmdldHMiLCJydW5BY3Rpb24iLCJsb2NhbEhvc3RzIiwiT2JqZWN0Iiwia2V5cyIsImRiQ29uZmlnIiwidGFyZ2V0IiwidGFyZ2V0Q29uZmlnIiwiaG9zdCIsImNvbm5lY3Rpb24iLCJ0b0xvd2VyQ2FzZSIsInN0YXR1cyIsImdldFN0YXR1cyIsInNyY0NvbmZpZyIsImRldmVsb3BtZW50X21hc3RlciIsImxhYmVsIiwiZml4dHVyZSIsInRlc3QiLCJ0b1NraXAiLCJyZW1vdGVDb25uIiwibG9jYWxDb25uIiwiZGF0YWJhc2UiLCJkdW1wRmlsZW5hbWUiLCJzcmNDb25uIiwibWlncmF0aW9uc0R1bXAiLCJ1c2VyIiwicGFzc3dvcmQiLCJfZGIiLCJtaWdyYXRpb25zIiwicmF3IiwiY291bnQiLCJjb25uIiwiZGIiLCJ1bmRlZmluZWQiLCJyb3ciLCJteXNxbENtZCIsInJlY29yZElkcyIsImltcG9ydEZpeHR1cmUiLCJwYXJzZU9wdGlvbnMiLCJfIiwiayIsInYiLCJuZXh0IiwicHJhY3RpY2VEaXIiLCJhcGlSb290UGF0aCIsImZpbGVOYW1lcyIsIm1heFNlcU5vIiwicmVjdXJzaXZlIiwiZmlsdGVyZWRTZXFzIiwiZmlsZU5hbWUiLCJlbmRzV2l0aCIsInNlcU5vIiwibWF0Y2giLCJwYXJzZUludCIsInNvcnQiLCJhIiwiYiIsImN1cnJlbnRTZXFObyIsImRzdFBhdGgiLCJydW5Db2RlIiwicmVwbGFjZSIsImNyZWF0ZUVudGl0eSIsInVzZUFJIiwiaGFzIiwibm9Db25lcyIsImVudGl0eSIsImdldCIsImNvbmZpZ0xvY2FsZSIsImkxOG4iLCJkZWZhdWx0TG9jYWxlIiwibG9jYWxlIiwicmVzdWx0IiwiZ2VuZXJhdGVDb25lcyIsInByZXNlcnZlRXhpc3RpbmciLCJvbmx5RW1wdHkiLCJ0b2tlbnNVc2VkIiwiZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzIiwiYWxsRW50aXRpZXMiLCJnZXRBbGxFbnRpdGllcyIsInRvdGFsVG9rZW5zIiwiZXJyb3JzIiwiaWQiLCJlc3RpbWF0ZWRDb3N0IiwidG9GaXhlZCIsImVyciIsIm1vZGUiLCJnZW5lcmF0ZVRlbXBsYXRlIiwid29ya3NwYWNlUm9vdCIsImZpbmRXb3Jrc3BhY2VSb290IiwiY2xhdWRlRGlyIiwidGFyZ2V0U2tpbGxzRGlyIiwic291cmNlQmFzZSIsInNvdXJjZVNraWxsc0RpciIsInNvdXJjZUNsYXVkZU1kIiwiZm9yY2UiLCJncmVlbiIsIlN0cmluZyIsImNvcHlFcnJvciIsInNvdXJjZVByb2plY3REaXIiLCJ0YXJnZXRQcm9qZWN0RGlyIiwidGFyZ2V0Q2xhdWRlTWQiLCJzb3VyY2VDb250ZW50IiwidGFyZ2V0Q29udGVudCIsInN0YXJ0TWFya2VyIiwiZW5kTWFya2VyIiwic3RhcnRJZHgiLCJlbmRJZHgiLCJiZWZvcmUiLCJzdWJzdHJpbmciLCJhZnRlciIsIm5ld0NvbnRlbnQiLCJsb2NhbERpciIsInRyaW0iLCJzYW5pdGl6ZWQiLCJNQVhfTEVOR1RIIiwiUkVTRVJWRURfTkFNRVMiLCJ0b1VwcGVyQ2FzZSIsImZpbGVQYXRoIiwidGVtcGxhdGUiLCJ0b0lTT1N0cmluZyIsInBsdWdpbnNBcmciLCJmaW5kIiwicGx1Z2lucyIsInBsdWdpblZhbHVlIiwicGx1Z2luSWRzIiwicCIsImRpciIsInBhY2thZ2VQYXRoIiwicGFja2FnZUpzb24iLCJKU09OIiwicGFyc2UiLCJ3b3Jrc3BhY2VzIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsWUFBWSxTQUFTO0FBRTVCQSxPQUFPQyxNQUFNO0FBRWIsT0FBT0MsWUFBWSxTQUFTO0FBQzVCLFNBQVNDLFFBQVEsRUFBRUMsS0FBSyxRQUFRLGdCQUFnQjtBQUNoRCxTQUFTQyxFQUFFLEVBQUVDLEtBQUssRUFBRUMsT0FBTyxF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