@playwright-repl/browser-extension 0.24.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 (38) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +176 -0
  3. package/dist/background.js +162567 -0
  4. package/dist/background.js.map +1 -0
  5. package/dist/content/recorder.js +479 -0
  6. package/dist/content/trace-loader.js +12 -0
  7. package/dist/devtools/console.html +17 -0
  8. package/dist/devtools/console.js +44 -0
  9. package/dist/devtools/console.js.map +1 -0
  10. package/dist/devtools/devtools.html +8 -0
  11. package/dist/devtools/devtools.js +7 -0
  12. package/dist/devtools/devtools.js.map +1 -0
  13. package/dist/icons/dramaturg_icon_128.png +0 -0
  14. package/dist/icons/dramaturg_icon_16.png +0 -0
  15. package/dist/icons/dramaturg_icon_32.png +0 -0
  16. package/dist/icons/dramaturg_icon_48.png +0 -0
  17. package/dist/index.css +1353 -0
  18. package/dist/index.js +12462 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/index2.js +27328 -0
  21. package/dist/index2.js.map +1 -0
  22. package/dist/manifest.json +49 -0
  23. package/dist/modulepreload-polyfill.js +30 -0
  24. package/dist/modulepreload-polyfill.js.map +1 -0
  25. package/dist/offscreen/offscreen.html +6 -0
  26. package/dist/offscreen/offscreen.js +151 -0
  27. package/dist/offscreen/offscreen.js.map +1 -0
  28. package/dist/panel/panel.html +16 -0
  29. package/dist/panel/panel.js +2258 -0
  30. package/dist/panel/panel.js.map +1 -0
  31. package/dist/preferences/preferences.html +14 -0
  32. package/dist/preferences/preferences.js +102 -0
  33. package/dist/preferences/preferences.js.map +1 -0
  34. package/dist/settings.js +13 -0
  35. package/dist/settings.js.map +1 -0
  36. package/dist/sw-debugger-core.js +1139 -0
  37. package/dist/sw-debugger-core.js.map +1 -0
  38. package/package.json +80 -0
@@ -0,0 +1,479 @@
1
+ "use strict";
2
+ (() => {
3
+ // src/content/locator.ts
4
+ var IMPLICIT_ROLES = {
5
+ A: (el) => el.hasAttribute("href") ? "link" : null,
6
+ BUTTON: "button",
7
+ H1: "heading",
8
+ H2: "heading",
9
+ H3: "heading",
10
+ H4: "heading",
11
+ H5: "heading",
12
+ H6: "heading",
13
+ INPUT: (el) => {
14
+ const type = el.type.toLowerCase();
15
+ if (type === "checkbox") return "checkbox";
16
+ if (type === "radio") return "radio";
17
+ if (type === "submit" || type === "reset" || type === "button") return "button";
18
+ if (type === "hidden") return null;
19
+ return "textbox";
20
+ },
21
+ TEXTAREA: "textbox",
22
+ SELECT: "combobox",
23
+ IMG: "img",
24
+ NAV: "navigation",
25
+ MAIN: "main",
26
+ HEADER: "banner",
27
+ FOOTER: "contentinfo",
28
+ P: "paragraph",
29
+ UL: "list",
30
+ OL: "list",
31
+ LI: "listitem",
32
+ TABLE: "table",
33
+ TR: "row",
34
+ TH: "columnheader",
35
+ TD: "cell",
36
+ FORM: "form",
37
+ DIALOG: "dialog",
38
+ ARTICLE: "article"
39
+ };
40
+ function getImplicitRole(el) {
41
+ const explicit = el.getAttribute("role");
42
+ if (explicit && explicit !== "none" && explicit !== "presentation") return explicit;
43
+ const entry = IMPLICIT_ROLES[el.tagName];
44
+ if (!entry) return null;
45
+ return typeof entry === "function" ? entry(el) : entry;
46
+ }
47
+ function getAccessibleName(el) {
48
+ const ariaLabel = el.getAttribute("aria-label");
49
+ if (ariaLabel) return ariaLabel.trim();
50
+ const labelledBy = el.getAttribute("aria-labelledby");
51
+ if (labelledBy) {
52
+ const parts = labelledBy.split(/\s+/).map((id) => document.getElementById(id)?.textContent?.trim()).filter(Boolean);
53
+ if (parts.length) return parts.join(" ");
54
+ }
55
+ if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) {
56
+ const label = getLabel(el);
57
+ if (label) return label;
58
+ }
59
+ const role = getImplicitRole(el);
60
+ const NAME_FROM_CONTENT = /* @__PURE__ */ new Set([
61
+ "button",
62
+ "link",
63
+ "heading",
64
+ "tab",
65
+ "menuitem",
66
+ "menuitemcheckbox",
67
+ "menuitemradio",
68
+ "option",
69
+ "radio",
70
+ "checkbox",
71
+ "switch",
72
+ "cell",
73
+ "columnheader",
74
+ "rowheader",
75
+ "tooltip",
76
+ "treeitem"
77
+ ]);
78
+ if (role && NAME_FROM_CONTENT.has(role)) {
79
+ const text = (el.textContent || "").trim();
80
+ if (text && text.length <= 80) return text;
81
+ }
82
+ if (el.tagName === "IMG") {
83
+ const alt = el.getAttribute("alt");
84
+ if (alt) return alt.trim();
85
+ }
86
+ return "";
87
+ }
88
+ function getLabel(el) {
89
+ if (el.id) {
90
+ const label = document.querySelector(`label[for="${CSS.escape(el.id)}"]`);
91
+ if (label) return (label.textContent || "").trim();
92
+ }
93
+ const parentLabel = el.closest("label");
94
+ if (parentLabel) {
95
+ const clone = parentLabel.cloneNode(true);
96
+ clone.querySelectorAll("input,textarea,select").forEach((c) => c.remove());
97
+ const text = (clone.textContent || "").trim();
98
+ if (text) return text;
99
+ }
100
+ return "";
101
+ }
102
+ var CONTAINER_ROLES = /* @__PURE__ */ new Set(["listitem", "row", "article", "group"]);
103
+ function getContextText(ancestor, exclude) {
104
+ function findText(node) {
105
+ for (const child of node.childNodes) {
106
+ if (child === exclude) continue;
107
+ if (child.nodeType === Node.ELEMENT_NODE && child.contains(exclude)) {
108
+ const inner = findText(child);
109
+ if (inner) return inner;
110
+ continue;
111
+ }
112
+ const text = (child.textContent || "").trim();
113
+ if (text && text.length <= 50) return text;
114
+ }
115
+ return "";
116
+ }
117
+ return findText(ancestor);
118
+ }
119
+ function findContainerAncestor(el) {
120
+ let current = el.parentElement;
121
+ while (current && current !== document.body && current !== document.documentElement) {
122
+ const role = getImplicitRole(current);
123
+ if (role && CONTAINER_ROLES.has(role)) return { ancestor: current, role };
124
+ current = current.parentElement;
125
+ }
126
+ return null;
127
+ }
128
+ function tryAncestorContext(el, role, name, matches) {
129
+ const container = findContainerAncestor(el);
130
+ if (!container) return null;
131
+ const contextText = getContextText(container.ancestor, el);
132
+ if (!contextText || contextText.length > 50) return null;
133
+ let count = 0;
134
+ for (const match of matches) {
135
+ const mc = findContainerAncestor(match);
136
+ if (!mc || mc.role !== container.role) continue;
137
+ if ((mc.ancestor.textContent || "").includes(contextText)) {
138
+ count++;
139
+ if (count > 1) return null;
140
+ }
141
+ }
142
+ if (count !== 1) return null;
143
+ return `getByRole(${escapeString(container.role)}).filter({ hasText: ${escapeString(contextText)} }).getByRole(${escapeString(role)}, { name: ${escapeString(name)} })`;
144
+ }
145
+ function findByRoleAndName(role, name) {
146
+ const matches = [];
147
+ for (const el of document.querySelectorAll("*")) {
148
+ if (getImplicitRole(el) === role && getAccessibleName(el) === name && el.checkVisibility?.() !== false)
149
+ matches.push(el);
150
+ }
151
+ return matches;
152
+ }
153
+ function findHoverAncestor(el) {
154
+ let ancestor = el.parentElement;
155
+ while (ancestor && ancestor !== document.body && ancestor !== document.documentElement) {
156
+ if (ancestor.matches(":hover")) return ancestor;
157
+ ancestor = ancestor.parentElement;
158
+ }
159
+ return null;
160
+ }
161
+ function isHoverRevealed(el) {
162
+ for (const sheet of document.styleSheets) {
163
+ try {
164
+ for (const rule of sheet.cssRules) {
165
+ if (!(rule instanceof CSSStyleRule)) continue;
166
+ if (!rule.selectorText.includes(":hover")) continue;
167
+ const s = rule.style;
168
+ const reveals = s.display && s.display !== "none" || s.visibility === "visible" || s.opacity && s.opacity !== "0";
169
+ if (!reveals) continue;
170
+ try {
171
+ if (el.matches(rule.selectorText)) return true;
172
+ } catch {
173
+ }
174
+ }
175
+ } catch {
176
+ }
177
+ }
178
+ return false;
179
+ }
180
+ function locatorToPwArgs(locator, role) {
181
+ const q = (s) => `"${s}"`;
182
+ let nth = "";
183
+ if (/\.first\(\)/.test(locator)) nth = " --nth 0";
184
+ else if (/\.last\(\)/.test(locator)) nth = " --nth -1";
185
+ else {
186
+ const nthMatch = locator.match(/\.nth\((\d+)\)/);
187
+ if (nthMatch) nth = ` --nth ${nthMatch[1]}`;
188
+ }
189
+ const roleNameMatch = locator.match(/getByRole\(['"](.+?)['"],\s*\{[^}]*name:\s*['"](.+?)['"]/);
190
+ if (roleNameMatch) return `${roleNameMatch[1]} ${q(roleNameMatch[2])}${nth}`;
191
+ const roleMatch = locator.match(/getByRole\(['"](.+?)['"]\)/);
192
+ if (roleMatch) return `${roleMatch[1]}${nth}`;
193
+ const testIdMatch = locator.match(/getByTestId\(['"](.+?)['"]\)/);
194
+ if (testIdMatch) return `${q(testIdMatch[1])}${nth}`;
195
+ const getByMatch = locator.match(/getBy\w+\(['"](.+?)['"]\)/);
196
+ if (getByMatch) {
197
+ const prefix = role ? `${role} ` : "";
198
+ return `${prefix}${q(getByMatch[1])}${nth}`;
199
+ }
200
+ const locatorMatch = locator.match(/locator\(['"](.+?)['"]\)/);
201
+ if (locatorMatch) return `${q(locatorMatch[1])}${nth}`;
202
+ return q(locator);
203
+ }
204
+ function escapeString(s) {
205
+ if (!s.includes("'")) return `'${s}'`;
206
+ if (!s.includes('"')) return `"${s}"`;
207
+ return `'${s.replace(/'/g, "\\'")}'`;
208
+ }
209
+ function generateLocator(el) {
210
+ const testId = el.getAttribute("data-testid") || el.getAttribute("data-test-id");
211
+ if (testId) return `getByTestId(${escapeString(testId)})`;
212
+ const role = getImplicitRole(el);
213
+ const name = getAccessibleName(el);
214
+ if (role && name) {
215
+ const matches = findByRoleAndName(role, name);
216
+ if (matches.length > 1) {
217
+ const ancestorLocator = tryAncestorContext(el, role, name, matches);
218
+ if (ancestorLocator) return ancestorLocator;
219
+ const base = `getByRole(${escapeString(role)}, { name: ${escapeString(name)}, exact: true })`;
220
+ const idx = matches.indexOf(el);
221
+ return idx === 0 ? base + ".first()" : base + `.nth(${idx})`;
222
+ }
223
+ return `getByRole(${escapeString(role)}, { name: ${escapeString(name)} })`;
224
+ }
225
+ if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) {
226
+ const label = getLabel(el);
227
+ if (label) return `getByLabel(${escapeString(label)})`;
228
+ }
229
+ const placeholder = el.getAttribute("placeholder");
230
+ if (placeholder) return `getByPlaceholder(${escapeString(placeholder)})`;
231
+ const alt = el.getAttribute("alt");
232
+ if (alt && ["IMG", "APPLET", "AREA", "INPUT"].includes(el.tagName))
233
+ return `getByAltText(${escapeString(alt)})`;
234
+ const title = el.getAttribute("title");
235
+ if (title) return `getByTitle(${escapeString(title)})`;
236
+ const text = (el.textContent || "").trim();
237
+ if (text) {
238
+ const snippet = text.length <= 80 ? text : text.slice(0, 50).replace(/\s+\S*$/, "");
239
+ if (snippet) return `getByText(${escapeString(snippet)})`;
240
+ }
241
+ if (role) return `getByRole(${escapeString(role)})`;
242
+ return `locator(${escapeString(buildCssSelector(el))})`;
243
+ }
244
+ var ROLE_SHORTHANDS = { listitem: "list" };
245
+ function generateLocatorPair(el) {
246
+ const jsLocator = generateLocator(el);
247
+ if (!jsLocator.includes(".filter(")) return { js: jsLocator, pw: jsLocator };
248
+ const role = getImplicitRole(el);
249
+ const name = getAccessibleName(el);
250
+ const container = findContainerAncestor(el);
251
+ const contextText = container ? getContextText(container.ancestor, el) : "";
252
+ if (container && contextText) {
253
+ const pwLocator2 = `getByRole(${escapeString(role)}, { name: ${escapeString(name)} })`;
254
+ const shortRole = ROLE_SHORTHANDS[container.role] ?? container.role;
255
+ return { js: jsLocator, pw: pwLocator2, ancestor: { role: shortRole, text: contextText } };
256
+ }
257
+ const matches = findByRoleAndName(role, name);
258
+ const base = `getByRole(${escapeString(role)}, { name: ${escapeString(name)}, exact: true })`;
259
+ const idx = matches.indexOf(el);
260
+ const pwLocator = idx === 0 ? base + ".first()" : base + `.nth(${idx})`;
261
+ return { js: jsLocator, pw: pwLocator };
262
+ }
263
+ function isTextField(el) {
264
+ if (el instanceof HTMLTextAreaElement) return true;
265
+ if (el instanceof HTMLInputElement) {
266
+ const type = el.type.toLowerCase();
267
+ return !["checkbox", "radio", "submit", "reset", "button", "hidden", "file", "image", "range", "color"].includes(type);
268
+ }
269
+ if (el.getAttribute("contenteditable") === "true") return true;
270
+ return false;
271
+ }
272
+ function isCheckable(el) {
273
+ return el instanceof HTMLInputElement && (el.type === "checkbox" || el.type === "radio");
274
+ }
275
+ function buildCommands(action, el, opts) {
276
+ const { js: jsLocator, pw: pwLocator, ancestor } = generateLocatorPair(el);
277
+ const jsLoc = `page.${jsLocator}`;
278
+ const role = getImplicitRole(el);
279
+ const pwArgs = locatorToPwArgs(pwLocator, role);
280
+ const q = (s) => `"${s}"`;
281
+ const inFlag = ancestor ? ` --in ${ancestor.role} ${q(ancestor.text)}` : "";
282
+ switch (action) {
283
+ case "hover":
284
+ return {
285
+ pw: `hover ${pwArgs}${inFlag}`,
286
+ js: `await ${jsLoc}.hover();`
287
+ };
288
+ case "click":
289
+ return {
290
+ pw: `click ${pwArgs}${inFlag}`,
291
+ js: `await ${jsLoc}.click();`
292
+ };
293
+ case "fill": {
294
+ const val = opts?.value ?? "";
295
+ return {
296
+ pw: `fill ${pwArgs} ${q(val)}${inFlag}`,
297
+ js: `await ${jsLoc}.fill(${escapeString(val)});`
298
+ };
299
+ }
300
+ case "check":
301
+ return {
302
+ pw: `check ${pwArgs}${inFlag}`,
303
+ js: `await ${jsLoc}.check();`
304
+ };
305
+ case "uncheck":
306
+ return {
307
+ pw: `uncheck ${pwArgs}${inFlag}`,
308
+ js: `await ${jsLoc}.uncheck();`
309
+ };
310
+ case "select": {
311
+ const optVal = opts?.option ?? "";
312
+ return {
313
+ pw: `select ${pwArgs} ${q(optVal)}${inFlag}`,
314
+ js: `await ${jsLoc}.selectOption(${escapeString(optVal)});`
315
+ };
316
+ }
317
+ case "press": {
318
+ const key = opts?.key ?? "";
319
+ if (pwArgs) {
320
+ return {
321
+ pw: `press ${pwArgs} ${key}${inFlag}`,
322
+ js: `await ${jsLoc}.press(${escapeString(key)});`
323
+ };
324
+ }
325
+ return {
326
+ pw: `press ${key}`,
327
+ js: `await page.keyboard.press(${escapeString(key)});`
328
+ };
329
+ }
330
+ default:
331
+ return null;
332
+ }
333
+ }
334
+ function buildCssSelector(el) {
335
+ const tag = el.tagName.toLowerCase();
336
+ if (el.id) return `${tag}#${CSS.escape(el.id)}`;
337
+ const classes = [...el.classList].slice(0, 2).map((c) => "." + CSS.escape(c)).join("");
338
+ if (classes) return `${tag}${classes}`;
339
+ return tag;
340
+ }
341
+
342
+ // src/content/recorder.ts
343
+ var SPECIAL_KEYS = /* @__PURE__ */ new Set([
344
+ "Enter",
345
+ "Tab",
346
+ "Escape",
347
+ "Backspace",
348
+ "Delete",
349
+ "ArrowUp",
350
+ "ArrowDown",
351
+ "ArrowLeft",
352
+ "ArrowRight",
353
+ "Home",
354
+ "End",
355
+ "PageUp",
356
+ "PageDown",
357
+ "F1",
358
+ "F2",
359
+ "F3",
360
+ "F4",
361
+ "F5",
362
+ "F6",
363
+ "F7",
364
+ "F8",
365
+ "F9",
366
+ "F10",
367
+ "F11",
368
+ "F12"
369
+ ]);
370
+ var pendingFill = null;
371
+ function flushPendingFill() {
372
+ pendingFill = null;
373
+ }
374
+ function onClickCapture(e) {
375
+ const target = e.target;
376
+ if (!target) return;
377
+ if (isTextField(target)) return;
378
+ if (isCheckable(target)) return;
379
+ flushPendingFill();
380
+ if (isHoverRevealed(target)) {
381
+ const hoverTarget = findHoverAncestor(target);
382
+ if (hoverTarget) {
383
+ const hoverCmds = buildCommands("hover", hoverTarget);
384
+ if (hoverCmds) {
385
+ chrome.runtime.sendMessage({ type: "recorded-action", action: hoverCmds });
386
+ }
387
+ }
388
+ }
389
+ const cmds = buildCommands("click", target);
390
+ if (cmds) {
391
+ chrome.runtime.sendMessage({ type: "recorded-action", action: cmds });
392
+ }
393
+ }
394
+ function onInputCapture(e) {
395
+ const target = e.target;
396
+ if (!target || !isTextField(target)) return;
397
+ const value = target.value ?? "";
398
+ if (pendingFill && pendingFill.el === target) {
399
+ pendingFill.value = value;
400
+ const cmds = buildCommands("fill", target, { value });
401
+ if (cmds) {
402
+ chrome.runtime.sendMessage({ type: "recorded-fill-update", action: cmds });
403
+ }
404
+ } else {
405
+ flushPendingFill();
406
+ pendingFill = { el: target, value };
407
+ const cmds = buildCommands("fill", target, { value });
408
+ if (cmds) {
409
+ chrome.runtime.sendMessage({ type: "recorded-action", action: cmds });
410
+ }
411
+ }
412
+ }
413
+ function onChangeCapture(e) {
414
+ const target = e.target;
415
+ if (!target) return;
416
+ if (isCheckable(target)) {
417
+ flushPendingFill();
418
+ const checked = target.checked;
419
+ const cmds = buildCommands(checked ? "check" : "uncheck", target);
420
+ if (cmds) {
421
+ chrome.runtime.sendMessage({ type: "recorded-action", action: cmds });
422
+ }
423
+ return;
424
+ }
425
+ if (target instanceof HTMLSelectElement) {
426
+ flushPendingFill();
427
+ const option = target.value;
428
+ const cmds = buildCommands("select", target, { option });
429
+ if (cmds) {
430
+ chrome.runtime.sendMessage({ type: "recorded-action", action: cmds });
431
+ }
432
+ return;
433
+ }
434
+ }
435
+ function onKeyDownCapture(e) {
436
+ if (!SPECIAL_KEYS.has(e.key)) return;
437
+ const target = e.target;
438
+ if (e.key === "Tab") {
439
+ flushPendingFill();
440
+ return;
441
+ }
442
+ if (e.key !== "Enter" && target && isTextField(target)) return;
443
+ flushPendingFill();
444
+ const cmds = target && target !== document.body && target !== document.documentElement ? buildCommands("press", target, { key: e.key }) : { pw: `press ${e.key}`, js: `await page.keyboard.press(${escapeString(e.key)});` };
445
+ if (cmds) {
446
+ chrome.runtime.sendMessage({ type: "recorded-action", action: cmds });
447
+ }
448
+ }
449
+ function onFocusOutCapture(e) {
450
+ if (pendingFill && e.target === pendingFill.el) {
451
+ flushPendingFill();
452
+ }
453
+ }
454
+ function cleanup() {
455
+ flushPendingFill();
456
+ window.__pw_recorder_active = false;
457
+ document.removeEventListener("click", onClickCapture, true);
458
+ document.removeEventListener("input", onInputCapture, true);
459
+ document.removeEventListener("change", onChangeCapture, true);
460
+ document.removeEventListener("keydown", onKeyDownCapture, true);
461
+ document.removeEventListener("focusout", onFocusOutCapture, true);
462
+ chrome.runtime.onMessage.removeListener(onMessage);
463
+ }
464
+ function onMessage(msg) {
465
+ if (msg.type === "record-stop") cleanup();
466
+ }
467
+ function init() {
468
+ if (window.__pw_recorder_active) return;
469
+ window.__pw_recorder_active = true;
470
+ chrome.runtime.onMessage.addListener(onMessage);
471
+ document.addEventListener("click", onClickCapture, true);
472
+ document.addEventListener("input", onInputCapture, true);
473
+ document.addEventListener("change", onChangeCapture, true);
474
+ document.addEventListener("keydown", onKeyDownCapture, true);
475
+ document.addEventListener("focusout", onFocusOutCapture, true);
476
+ }
477
+ init();
478
+ })();
479
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2NvbnRlbnQvbG9jYXRvci50cyIsICJzcmMvY29udGVudC9yZWNvcmRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXHJcbiAqIFNoYXJlZCBsb2NhdG9yIGdlbmVyYXRpb24gdXRpbGl0aWVzLlxyXG4gKiBVc2VkIGJ5IGJvdGggcGlja2VyLnRzIGFuZCByZWNvcmRlci50cyBjb250ZW50IHNjcmlwdHMuXHJcbiAqIFZpdGUgaW5saW5lcyB0aGlzIGludG8gZWFjaCBjb250ZW50IHNjcmlwdCBidW5kbGUgXHUyMDE0IG5vIHJ1bnRpbWUgbW9kdWxlIGxvYWRpbmcuXHJcbiAqL1xyXG5cclxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEltcGxpY2l0IEFSSUEgcm9sZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG5leHBvcnQgY29uc3QgSU1QTElDSVRfUk9MRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8ICgoZWw6IEVsZW1lbnQpID0+IHN0cmluZyB8IG51bGwpPiA9IHtcclxuICAgIEE6IChlbCkgPT4gZWwuaGFzQXR0cmlidXRlKCdocmVmJykgPyAnbGluaycgOiBudWxsLFxyXG4gICAgQlVUVE9OOiAnYnV0dG9uJyxcclxuICAgIEgxOiAnaGVhZGluZycsIEgyOiAnaGVhZGluZycsIEgzOiAnaGVhZGluZycsIEg0OiAnaGVhZGluZycsIEg1OiAnaGVhZGluZycsIEg2OiAnaGVhZGluZycsXHJcbiAgICBJTlBVVDogKGVsKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9IChlbCBhcyBIVE1MSW5wdXRFbGVtZW50KS50eXBlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdjaGVja2JveCcpIHJldHVybiAnY2hlY2tib3gnO1xyXG4gICAgICAgIGlmICh0eXBlID09PSAncmFkaW8nKSByZXR1cm4gJ3JhZGlvJztcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0JyB8fCB0eXBlID09PSAnYnV0dG9uJykgcmV0dXJuICdidXR0b24nO1xyXG4gICAgICAgIGlmICh0eXBlID09PSAnaGlkZGVuJykgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuICd0ZXh0Ym94JztcclxuICAgIH0sXHJcbiAgICBURVhUQVJFQTogJ3RleHRib3gnLFxyXG4gICAgU0VMRUNUOiAnY29tYm9ib3gnLFxyXG4gICAgSU1HOiAnaW1nJyxcclxuICAgIE5BVjogJ25hdmlnYXRpb24nLFxyXG4gICAgTUFJTjogJ21haW4nLFxyXG4gICAgSEVBREVSOiAnYmFubmVyJyxcclxuICAgIEZPT1RFUjogJ2NvbnRlbnRpbmZvJyxcclxuICAgIFA6ICdwYXJhZ3JhcGgnLFxyXG4gICAgVUw6ICdsaXN0JywgT0w6ICdsaXN0JyxcclxuICAgIExJOiAnbGlzdGl0ZW0nLFxyXG4gICAgVEFCTEU6ICd0YWJsZScsXHJcbiAgICBUUjogJ3JvdycsXHJcbiAgICBUSDogJ2NvbHVtbmhlYWRlcicsXHJcbiAgICBURDogJ2NlbGwnLFxyXG4gICAgRk9STTogJ2Zvcm0nLFxyXG4gICAgRElBTE9HOiAnZGlhbG9nJyxcclxuICAgIEFSVElDTEU6ICdhcnRpY2xlJyxcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRJbXBsaWNpdFJvbGUoZWw6IEVsZW1lbnQpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IGV4cGxpY2l0ID0gZWwuZ2V0QXR0cmlidXRlKCdyb2xlJyk7XHJcbiAgICBpZiAoZXhwbGljaXQgJiYgZXhwbGljaXQgIT09ICdub25lJyAmJiBleHBsaWNpdCAhPT0gJ3ByZXNlbnRhdGlvbicpIHJldHVybiBleHBsaWNpdDtcclxuICAgIGNvbnN0IGVudHJ5ID0gSU1QTElDSVRfUk9MRVNbZWwudGFnTmFtZV07XHJcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0eXBlb2YgZW50cnkgPT09ICdmdW5jdGlvbicgPyBlbnRyeShlbCkgOiBlbnRyeTtcclxufVxyXG5cclxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEFjY2Vzc2libGUgbmFtZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRBY2Nlc3NpYmxlTmFtZShlbDogRWxlbWVudCk6IHN0cmluZyB7XHJcbiAgICAvLyBhcmlhLWxhYmVsXHJcbiAgICBjb25zdCBhcmlhTGFiZWwgPSBlbC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTtcclxuICAgIGlmIChhcmlhTGFiZWwpIHJldHVybiBhcmlhTGFiZWwudHJpbSgpO1xyXG5cclxuICAgIC8vIGFyaWEtbGFiZWxsZWRieVxyXG4gICAgY29uc3QgbGFiZWxsZWRCeSA9IGVsLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5Jyk7XHJcbiAgICBpZiAobGFiZWxsZWRCeSkge1xyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gbGFiZWxsZWRCeS5zcGxpdCgvXFxzKy8pLm1hcChpZCA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk/LnRleHRDb250ZW50Py50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcclxuICAgICAgICBpZiAocGFydHMubGVuZ3RoKSByZXR1cm4gcGFydHMuam9pbignICcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvciBpbnB1dHM6IGFzc29jaWF0ZWQgPGxhYmVsPlxyXG4gICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCBlbCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHwgZWwgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gZ2V0TGFiZWwoZWwpO1xyXG4gICAgICAgIGlmIChsYWJlbCkgcmV0dXJuIGxhYmVsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvciByb2xlcyB0aGF0IGdldCBuYW1lIGZyb20gY29udGVudCAoQVJJQSBcIm5hbWUgZnJvbSBjb250ZW50XCIgcm9sZXMpXHJcbiAgICBjb25zdCByb2xlID0gZ2V0SW1wbGljaXRSb2xlKGVsKTtcclxuICAgIGNvbnN0IE5BTUVfRlJPTV9DT05URU5UID0gbmV3IFNldChbXHJcbiAgICAgICAgJ2J1dHRvbicsICdsaW5rJywgJ2hlYWRpbmcnLCAndGFiJywgJ21lbnVpdGVtJywgJ21lbnVpdGVtY2hlY2tib3gnLFxyXG4gICAgICAgICdtZW51aXRlbXJhZGlvJywgJ29wdGlvbicsICdyYWRpbycsICdjaGVja2JveCcsICdzd2l0Y2gnLCAnY2VsbCcsXHJcbiAgICAgICAgJ2NvbHVtbmhlYWRlcicsICdyb3doZWFkZXInLCAndG9vbHRpcCcsICd0cmVlaXRlbScsXHJcbiAgICBdKTtcclxuICAgIGlmIChyb2xlICYmIE5BTUVfRlJPTV9DT05URU5ULmhhcyhyb2xlKSkge1xyXG4gICAgICAgIGNvbnN0IHRleHQgPSAoZWwudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICBpZiAodGV4dCAmJiB0ZXh0Lmxlbmd0aCA8PSA4MCkgcmV0dXJuIHRleHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gYWx0IGZvciBpbWFnZXNcclxuICAgIGlmIChlbC50YWdOYW1lID09PSAnSU1HJykge1xyXG4gICAgICAgIGNvbnN0IGFsdCA9IGVsLmdldEF0dHJpYnV0ZSgnYWx0Jyk7XHJcbiAgICAgICAgaWYgKGFsdCkgcmV0dXJuIGFsdC50cmltKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICcnO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFiZWwoZWw6IEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MVGV4dEFyZWFFbGVtZW50IHwgSFRNTFNlbGVjdEVsZW1lbnQpOiBzdHJpbmcge1xyXG4gICAgLy8gRXhwbGljaXQgbGFiZWwgdmlhIGZvciBhdHRyaWJ1dGVcclxuICAgIGlmIChlbC5pZCkge1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgbGFiZWxbZm9yPVwiJHtDU1MuZXNjYXBlKGVsLmlkKX1cIl1gKTtcclxuICAgICAgICBpZiAobGFiZWwpIHJldHVybiAobGFiZWwudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKTtcclxuICAgIH1cclxuICAgIC8vIEltcGxpY2l0IGxhYmVsIChhbmNlc3RvcilcclxuICAgIGNvbnN0IHBhcmVudExhYmVsID0gZWwuY2xvc2VzdCgnbGFiZWwnKTtcclxuICAgIGlmIChwYXJlbnRMYWJlbCkge1xyXG4gICAgICAgIC8vIEdldCBsYWJlbCB0ZXh0IGV4Y2x1ZGluZyB0aGUgaW5wdXQncyBvd24gdGV4dFxyXG4gICAgICAgIGNvbnN0IGNsb25lID0gcGFyZW50TGFiZWwuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGNsb25lLnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LHRleHRhcmVhLHNlbGVjdCcpLmZvckVhY2goYyA9PiBjLnJlbW92ZSgpKTtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKGNsb25lLnRleHRDb250ZW50IHx8ICcnKS50cmltKCk7XHJcbiAgICAgICAgaWYgKHRleHQpIHJldHVybiB0ZXh0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG59XHJcblxyXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQW5jZXN0b3IgY29udGV4dCBkaXNhbWJpZ3VhdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcclxuXHJcbi8qKiBDb250YWluZXIgcm9sZXMgc3VpdGFibGUgZm9yIGFuY2VzdG9yLWNvbnRleHQgZGlzYW1iaWd1YXRpb24uICovXHJcbmNvbnN0IENPTlRBSU5FUl9ST0xFUyA9IG5ldyBTZXQoWydsaXN0aXRlbScsICdyb3cnLCAnYXJ0aWNsZScsICdncm91cCddKTtcclxuXHJcbi8qKlxyXG4gKiBGaW5kIGRpc3RpbmN0aXZlIHRleHQgaW4gYW4gYW5jZXN0b3IgdGhhdCBkb2Vzbid0IGNvbWUgZnJvbSB0aGUgZXhjbHVkZWQgZWxlbWVudCdzIHN1YnRyZWUuXHJcbiAqIFJldHVybnMgdGV4dCBmcm9tIHRoZSBmaXJzdCBjaGlsZCBzdWJ0cmVlIHRoYXQgZG9lc24ndCBjb250YWluIHRoZSBleGNsdWRlZCBlbGVtZW50LFxyXG4gKiByZWN1cnNpbmcgaW50byB3cmFwcGVycyB0aGF0IGRvIGNvbnRhaW4gaXQuIFRoaXMgZW5zdXJlcyB0aGUgcmV0dXJuZWQgdGV4dCBpcyBhXHJcbiAqIGNvbnRpZ3VvdXMgc3Vic3RyaW5nIG9mIHRoZSBhbmNlc3RvcidzIGZ1bGwgdGV4dENvbnRlbnQgKG5lZWRlZCBmb3IgaGFzVGV4dCBtYXRjaGluZykuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRDb250ZXh0VGV4dChhbmNlc3RvcjogRWxlbWVudCwgZXhjbHVkZTogRWxlbWVudCk6IHN0cmluZyB7XHJcbiAgICBmdW5jdGlvbiBmaW5kVGV4dChub2RlOiBOb2RlKTogc3RyaW5nIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGROb2Rlcykge1xyXG4gICAgICAgICAgICBpZiAoY2hpbGQgPT09IGV4Y2x1ZGUpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIChjaGlsZCBhcyBFbGVtZW50KS5jb250YWlucyhleGNsdWRlKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBzdWJ0cmVlIGNvbnRhaW5zIHRoZSB0YXJnZXQgXHUyMDE0IHJlY3Vyc2UgdG8gZmluZCBub24tdGFyZ2V0IHNpYmxpbmdzXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbm5lciA9IGZpbmRUZXh0KGNoaWxkKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbm5lcikgcmV0dXJuIGlubmVyO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChjaGlsZC50ZXh0Q29udGVudCB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0Lmxlbmd0aCA8PSA1MCkgcmV0dXJuIHRleHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIHJldHVybiBmaW5kVGV4dChhbmNlc3Rvcik7XHJcbn1cclxuXHJcbi8qKiBXYWxrIHVwIGZyb20gZWwgdG8gZmluZCBuZWFyZXN0IGFuY2VzdG9yIHdpdGggYSBjb250YWluZXIgcm9sZS4gKi9cclxuZnVuY3Rpb24gZmluZENvbnRhaW5lckFuY2VzdG9yKGVsOiBFbGVtZW50KTogeyBhbmNlc3RvcjogRWxlbWVudDsgcm9sZTogc3RyaW5nIH0gfCBudWxsIHtcclxuICAgIGxldCBjdXJyZW50ID0gZWwucGFyZW50RWxlbWVudDtcclxuICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IGRvY3VtZW50LmJvZHkgJiYgY3VycmVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcbiAgICAgICAgY29uc3Qgcm9sZSA9IGdldEltcGxpY2l0Um9sZShjdXJyZW50KTtcclxuICAgICAgICBpZiAocm9sZSAmJiBDT05UQUlORVJfUk9MRVMuaGFzKHJvbGUpKSByZXR1cm4geyBhbmNlc3RvcjogY3VycmVudCwgcm9sZSB9O1xyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFRyeSB0byBkaXNhbWJpZ3VhdGUgdXNpbmcgYW5jZXN0b3IgY29udGV4dC5cclxuICogUmV0dXJucyBhIGNoYWluZWQgbG9jYXRvciBsaWtlOlxyXG4gKiAgIGdldEJ5Um9sZSgnbGlzdGl0ZW0nKS5maWx0ZXIoeyBoYXNUZXh0OiAncmVhZGluZycgfSkuZ2V0QnlSb2xlKCdidXR0b24nLCB7IG5hbWU6ICdEZWxldGUnIH0pXHJcbiAqIG9yIG51bGwgaWYgYW5jZXN0b3IgY29udGV4dCBkb2Vzbid0IHByb2R1Y2UgYSB1bmlxdWUgcmVzdWx0LlxyXG4gKi9cclxuZnVuY3Rpb24gdHJ5QW5jZXN0b3JDb250ZXh0KGVsOiBFbGVtZW50LCByb2xlOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgbWF0Y2hlczogRWxlbWVudFtdKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSBmaW5kQ29udGFpbmVyQW5jZXN0b3IoZWwpO1xyXG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IGNvbnRleHRUZXh0ID0gZ2V0Q29udGV4dFRleHQoY29udGFpbmVyLmFuY2VzdG9yLCBlbCk7XHJcbiAgICBpZiAoIWNvbnRleHRUZXh0IHx8IGNvbnRleHRUZXh0Lmxlbmd0aCA+IDUwKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAvLyBWZXJpZnkgdW5pcXVlbmVzczogb25seSBvbmUgbWF0Y2gncyBjb250YWluZXIgYW5jZXN0b3Igc2hvdWxkIGNvbnRhaW4gdGhpcyB0ZXh0XHJcbiAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XHJcbiAgICAgICAgY29uc3QgbWMgPSBmaW5kQ29udGFpbmVyQW5jZXN0b3IobWF0Y2gpO1xyXG4gICAgICAgIGlmICghbWMgfHwgbWMucm9sZSAhPT0gY29udGFpbmVyLnJvbGUpIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmICgobWMuYW5jZXN0b3IudGV4dENvbnRlbnQgfHwgJycpLmluY2x1ZGVzKGNvbnRleHRUZXh0KSkge1xyXG4gICAgICAgICAgICBjb3VudCsrO1xyXG4gICAgICAgICAgICBpZiAoY291bnQgPiAxKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoY291bnQgIT09IDEpIHJldHVybiBudWxsO1xyXG5cclxuICAgIHJldHVybiBgZ2V0QnlSb2xlKCR7ZXNjYXBlU3RyaW5nKGNvbnRhaW5lci5yb2xlKX0pLmZpbHRlcih7IGhhc1RleHQ6ICR7ZXNjYXBlU3RyaW5nKGNvbnRleHRUZXh0KX0gfSkuZ2V0QnlSb2xlKCR7ZXNjYXBlU3RyaW5nKHJvbGUpfSwgeyBuYW1lOiAke2VzY2FwZVN0cmluZyhuYW1lKX0gfSlgO1xyXG59XHJcblxyXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgTG9jYXRvciBkaXNhbWJpZ3VhdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBmaW5kQnlSb2xlQW5kTmFtZShyb2xlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IEVsZW1lbnRbXSB7XHJcbiAgICBjb25zdCBtYXRjaGVzOiBFbGVtZW50W10gPSBbXTtcclxuICAgIGZvciAoY29uc3QgZWwgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpKSB7XHJcbiAgICAgICAgaWYgKGdldEltcGxpY2l0Um9sZShlbCkgPT09IHJvbGUgJiYgZ2V0QWNjZXNzaWJsZU5hbWUoZWwpID09PSBuYW1lXHJcbiAgICAgICAgICAgICYmIChlbCBhcyBIVE1MRWxlbWVudCkuY2hlY2tWaXNpYmlsaXR5Py4oKSAhPT0gZmFsc2UpXHJcbiAgICAgICAgICAgIG1hdGNoZXMucHVzaChlbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbWF0Y2hlcztcclxufVxyXG5cclxuLyoqIExpa2UgZmluZEJ5Um9sZUFuZE5hbWUgYnV0IGluY2x1ZGVzIGhpZGRlbiBlbGVtZW50cyAoZm9yIGhvdmVyIGRldGVjdGlvbikuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmaW5kQWxsQnlSb2xlQW5kTmFtZShyb2xlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IEVsZW1lbnRbXSB7XHJcbiAgICBjb25zdCBtYXRjaGVzOiBFbGVtZW50W10gPSBbXTtcclxuICAgIGZvciAoY29uc3QgZWwgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnKicpKSB7XHJcbiAgICAgICAgaWYgKGdldEltcGxpY2l0Um9sZShlbCkgPT09IHJvbGUgJiYgZ2V0QWNjZXNzaWJsZU5hbWUoZWwpID09PSBuYW1lKVxyXG4gICAgICAgICAgICBtYXRjaGVzLnB1c2goZWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1hdGNoZXM7XHJcbn1cclxuXHJcbi8qKiBGaW5kIHRoZSBuZWFyZXN0IDpob3ZlciBhbmNlc3RvciAoZm9yIHJlY29yZGluZyBob3ZlciBiZWZvcmUgY2xpY2spLiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmluZEhvdmVyQW5jZXN0b3IoZWw6IEVsZW1lbnQpOiBFbGVtZW50IHwgbnVsbCB7XHJcbiAgICBsZXQgYW5jZXN0b3IgPSBlbC5wYXJlbnRFbGVtZW50O1xyXG4gICAgd2hpbGUgKGFuY2VzdG9yICYmIGFuY2VzdG9yICE9PSBkb2N1bWVudC5ib2R5ICYmIGFuY2VzdG9yICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoYW5jZXN0b3IubWF0Y2hlcygnOmhvdmVyJykpIHJldHVybiBhbmNlc3RvcjtcclxuICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudEVsZW1lbnQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIGVsZW1lbnQgaXMgcmV2ZWFsZWQgYnkgYSA6aG92ZXIgQ1NTIHJ1bGUuXHJcbiAqIFNjYW5zIHN0eWxlc2hlZXRzIGZvciBydWxlcyBsaWtlIGAucGFyZW50OmhvdmVyIC5jaGlsZCB7IGRpc3BsYXk6IGlubGluZS1ibG9jayB9YC5cclxuICogQXQgY2xpY2sgdGltZSB0aGUgYW5jZXN0b3IgSVMgaG92ZXJlZCwgc28gZWwubWF0Y2hlcygpIHdvcmtzIGFnYWluc3QgOmhvdmVyIHNlbGVjdG9ycy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0hvdmVyUmV2ZWFsZWQoZWw6IEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3Qgc2hlZXQgb2YgZG9jdW1lbnQuc3R5bGVTaGVldHMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2Ygc2hlZXQuY3NzUnVsZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICghKHJ1bGUgaW5zdGFuY2VvZiBDU1NTdHlsZVJ1bGUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGlmICghcnVsZS5zZWxlY3RvclRleHQuaW5jbHVkZXMoJzpob3ZlcicpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBydWxlLnN0eWxlO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV2ZWFscyA9IChzLmRpc3BsYXkgJiYgcy5kaXNwbGF5ICE9PSAnbm9uZScpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgcy52aXNpYmlsaXR5ID09PSAndmlzaWJsZScgfHxcclxuICAgICAgICAgICAgICAgICAgICAocy5vcGFjaXR5ICYmIHMub3BhY2l0eSAhPT0gJzAnKTtcclxuICAgICAgICAgICAgICAgIGlmICghcmV2ZWFscykgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB0cnkgeyBpZiAoZWwubWF0Y2hlcyhydWxlLnNlbGVjdG9yVGV4dCkpIHJldHVybiB0cnVlOyB9IGNhdGNoIHsgLyogaW52YWxpZCBzZWxlY3RvciAqLyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIHsgLyogY3Jvc3Mtb3JpZ2luIHN0eWxlc2hlZXQgKi8gfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgTG9jYXRvciBzdHJpbmcgY29udmVyc2lvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcclxuXHJcbi8qKlxyXG4gKiBQYXJzZSBhIEpTIGxvY2F0b3Igc3RyaW5nIGludG8gUFcga2V5d29yZCBhcmdzLlxyXG4gKiBlLmcuIGBnZXRCeVJvbGUoJ3RhYicsIHsgbmFtZTogJ25wbScsIGV4YWN0OiB0cnVlIH0pLm50aCgxKWAgXHUyMTkyIGB0YWIgXCJucG1cIiAtLW50aCAxYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGxvY2F0b3JUb1B3QXJncyhsb2NhdG9yOiBzdHJpbmcsIHJvbGU/OiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHEgPSAoczogc3RyaW5nKSA9PiBgXCIke3N9XCJgO1xyXG5cclxuICAgIC8vIEV4dHJhY3QgbnRoIG1vZGlmaWVyXHJcbiAgICBsZXQgbnRoID0gJyc7XHJcbiAgICBpZiAoL1xcLmZpcnN0XFwoXFwpLy50ZXN0KGxvY2F0b3IpKSBudGggPSAnIC0tbnRoIDAnO1xyXG4gICAgZWxzZSBpZiAoL1xcLmxhc3RcXChcXCkvLnRlc3QobG9jYXRvcikpIG50aCA9ICcgLS1udGggLTEnO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgY29uc3QgbnRoTWF0Y2ggPSBsb2NhdG9yLm1hdGNoKC9cXC5udGhcXCgoXFxkKylcXCkvKTtcclxuICAgICAgICBpZiAobnRoTWF0Y2gpIG50aCA9IGAgLS1udGggJHtudGhNYXRjaFsxXX1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldEJ5Um9sZSB3aXRoIG5hbWUgXHUyMDE0IGFscmVhZHkgaGFzIHJvbGVcclxuICAgIGNvbnN0IHJvbGVOYW1lTWF0Y2ggPSBsb2NhdG9yLm1hdGNoKC9nZXRCeVJvbGVcXChbJ1wiXSguKz8pWydcIl0sXFxzKlxce1tefV0qbmFtZTpcXHMqWydcIl0oLis/KVsnXCJdLyk7XHJcbiAgICBpZiAocm9sZU5hbWVNYXRjaCkgcmV0dXJuIGAke3JvbGVOYW1lTWF0Y2hbMV19ICR7cShyb2xlTmFtZU1hdGNoWzJdKX0ke250aH1gO1xyXG5cclxuICAgIC8vIGdldEJ5Um9sZSB3aXRob3V0IG5hbWUgXHUyMDE0IGFscmVhZHkgaGFzIHJvbGVcclxuICAgIGNvbnN0IHJvbGVNYXRjaCA9IGxvY2F0b3IubWF0Y2goL2dldEJ5Um9sZVxcKFsnXCJdKC4rPylbJ1wiXVxcKS8pO1xyXG4gICAgaWYgKHJvbGVNYXRjaCkgcmV0dXJuIGAke3JvbGVNYXRjaFsxXX0ke250aH1gO1xyXG5cclxuICAgIC8vIGdldEJ5VGVzdElkIFx1MjAxNCB0ZXN0IElEIGlzIG5vdCBhbiBhY2Nlc3NpYmxlIG5hbWUsIGRvbid0IGFkZCByb2xlXHJcbiAgICBjb25zdCB0ZXN0SWRNYXRjaCA9IGxvY2F0b3IubWF0Y2goL2dldEJ5VGVzdElkXFwoWydcIl0oLis/KVsnXCJdXFwpLyk7XHJcbiAgICBpZiAodGVzdElkTWF0Y2gpIHJldHVybiBgJHtxKHRlc3RJZE1hdGNoWzFdKX0ke250aH1gO1xyXG5cclxuICAgIC8vIGdldEJ5TGFiZWwgLyBnZXRCeVRleHQgLyBnZXRCeVBsYWNlaG9sZGVyIC8gZ2V0QnlUaXRsZSAvIGdldEJ5QWx0VGV4dCBcdTIwMTQgcHJlcGVuZCByb2xlIGlmIGF2YWlsYWJsZVxyXG4gICAgY29uc3QgZ2V0QnlNYXRjaCA9IGxvY2F0b3IubWF0Y2goL2dldEJ5XFx3K1xcKFsnXCJdKC4rPylbJ1wiXVxcKS8pO1xyXG4gICAgaWYgKGdldEJ5TWF0Y2gpIHtcclxuICAgICAgICBjb25zdCBwcmVmaXggPSByb2xlID8gYCR7cm9sZX0gYCA6ICcnO1xyXG4gICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtxKGdldEJ5TWF0Y2hbMV0pfSR7bnRofWA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbG9jYXRvcignY3NzJykgZmFsbGJhY2tcclxuICAgIGNvbnN0IGxvY2F0b3JNYXRjaCA9IGxvY2F0b3IubWF0Y2goL2xvY2F0b3JcXChbJ1wiXSguKz8pWydcIl1cXCkvKTtcclxuICAgIGlmIChsb2NhdG9yTWF0Y2gpIHJldHVybiBgJHtxKGxvY2F0b3JNYXRjaFsxXSl9JHtudGh9YDtcclxuXHJcbiAgICByZXR1cm4gcShsb2NhdG9yKTtcclxufVxyXG5cclxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIExvY2F0b3IgZ2VuZXJhdGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVTdHJpbmcoczogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghcy5pbmNsdWRlcyhcIidcIikpIHJldHVybiBgJyR7c30nYDtcclxuICAgIGlmICghcy5pbmNsdWRlcygnXCInKSkgcmV0dXJuIGBcIiR7c31cImA7XHJcbiAgICByZXR1cm4gYCcke3MucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpfSdgO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVMb2NhdG9yKGVsOiBFbGVtZW50KTogc3RyaW5nIHtcclxuICAgIC8vIDEuIFRlc3QgSURcclxuICAgIGNvbnN0IHRlc3RJZCA9IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS10ZXN0aWQnKSB8fCBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGVzdC1pZCcpO1xyXG4gICAgaWYgKHRlc3RJZCkgcmV0dXJuIGBnZXRCeVRlc3RJZCgke2VzY2FwZVN0cmluZyh0ZXN0SWQpfSlgO1xyXG5cclxuICAgIC8vIDIuIFJvbGUgKyBhY2Nlc3NpYmxlIG5hbWVcclxuICAgIGNvbnN0IHJvbGUgPSBnZXRJbXBsaWNpdFJvbGUoZWwpO1xyXG4gICAgY29uc3QgbmFtZSA9IGdldEFjY2Vzc2libGVOYW1lKGVsKTtcclxuICAgIGlmIChyb2xlICYmIG5hbWUpIHtcclxuICAgICAgICAvLyBEaXNhbWJpZ3VhdGUgd2hlbiBtdWx0aXBsZSBlbGVtZW50cyBzaGFyZSBzYW1lIHJvbGUgKyBuYW1lXHJcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGZpbmRCeVJvbGVBbmROYW1lKHJvbGUsIG5hbWUpO1xyXG4gICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgLy8gVHJ5IGFuY2VzdG9yIGNvbnRleHQgZmlyc3QgKHJlYWRhYmxlIGNoYWluZWQgbG9jYXRvcnMpXHJcbiAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yTG9jYXRvciA9IHRyeUFuY2VzdG9yQ29udGV4dChlbCwgcm9sZSwgbmFtZSwgbWF0Y2hlcyk7XHJcbiAgICAgICAgICAgIGlmIChhbmNlc3RvckxvY2F0b3IpIHJldHVybiBhbmNlc3RvckxvY2F0b3I7XHJcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIG50aC1iYXNlZCBkaXNhbWJpZ3VhdGlvblxyXG4gICAgICAgICAgICBjb25zdCBiYXNlID0gYGdldEJ5Um9sZSgke2VzY2FwZVN0cmluZyhyb2xlKX0sIHsgbmFtZTogJHtlc2NhcGVTdHJpbmcobmFtZSl9LCBleGFjdDogdHJ1ZSB9KWA7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IG1hdGNoZXMuaW5kZXhPZihlbCk7XHJcbiAgICAgICAgICAgIHJldHVybiBpZHggPT09IDAgPyBiYXNlICsgJy5maXJzdCgpJyA6IGJhc2UgKyBgLm50aCgke2lkeH0pYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGBnZXRCeVJvbGUoJHtlc2NhcGVTdHJpbmcocm9sZSl9LCB7IG5hbWU6ICR7ZXNjYXBlU3RyaW5nKG5hbWUpfSB9KWA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMy4gTGFiZWwgKGZvciBmb3JtIGVsZW1lbnRzKVxyXG4gICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fCBlbCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHwgZWwgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gZ2V0TGFiZWwoZWwpO1xyXG4gICAgICAgIGlmIChsYWJlbCkgcmV0dXJuIGBnZXRCeUxhYmVsKCR7ZXNjYXBlU3RyaW5nKGxhYmVsKX0pYDtcclxuICAgIH1cclxuXHJcbiAgICAvLyA0LiBQbGFjZWhvbGRlclxyXG4gICAgY29uc3QgcGxhY2Vob2xkZXIgPSBlbC5nZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJyk7XHJcbiAgICBpZiAocGxhY2Vob2xkZXIpIHJldHVybiBgZ2V0QnlQbGFjZWhvbGRlcigke2VzY2FwZVN0cmluZyhwbGFjZWhvbGRlcil9KWA7XHJcblxyXG4gICAgLy8gNS4gQWx0IHRleHRcclxuICAgIGNvbnN0IGFsdCA9IGVsLmdldEF0dHJpYnV0ZSgnYWx0Jyk7XHJcbiAgICBpZiAoYWx0ICYmIFsnSU1HJywgJ0FQUExFVCcsICdBUkVBJywgJ0lOUFVUJ10uaW5jbHVkZXMoZWwudGFnTmFtZSkpXHJcbiAgICAgICAgcmV0dXJuIGBnZXRCeUFsdFRleHQoJHtlc2NhcGVTdHJpbmcoYWx0KX0pYDtcclxuXHJcbiAgICAvLyA2LiBUaXRsZVxyXG4gICAgY29uc3QgdGl0bGUgPSBlbC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJyk7XHJcbiAgICBpZiAodGl0bGUpIHJldHVybiBgZ2V0QnlUaXRsZSgke2VzY2FwZVN0cmluZyh0aXRsZSl9KWA7XHJcblxyXG4gICAgLy8gNy4gVGV4dCBjb250ZW50ICh1c2Ugc3Vic3RyaW5nIGZvciBsb25nIHRleHQgXHUyMDE0IGdldEJ5VGV4dCBkb2VzIHBhcnRpYWwgbWF0Y2hpbmcpXHJcbiAgICBjb25zdCB0ZXh0ID0gKGVsLnRleHRDb250ZW50IHx8ICcnKS50cmltKCk7XHJcbiAgICBpZiAodGV4dCkge1xyXG4gICAgICAgIGNvbnN0IHNuaXBwZXQgPSB0ZXh0Lmxlbmd0aCA8PSA4MCA/IHRleHQgOiB0ZXh0LnNsaWNlKDAsIDUwKS5yZXBsYWNlKC9cXHMrXFxTKiQvLCAnJyk7XHJcbiAgICAgICAgaWYgKHNuaXBwZXQpIHJldHVybiBgZ2V0QnlUZXh0KCR7ZXNjYXBlU3RyaW5nKHNuaXBwZXQpfSlgO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDguIFJvbGUgd2l0aG91dCBuYW1lXHJcbiAgICBpZiAocm9sZSkgcmV0dXJuIGBnZXRCeVJvbGUoJHtlc2NhcGVTdHJpbmcocm9sZSl9KWA7XHJcblxyXG4gICAgLy8gOS4gQ1NTIGZhbGxiYWNrXHJcbiAgICByZXR1cm4gYGxvY2F0b3IoJHtlc2NhcGVTdHJpbmcoYnVpbGRDc3NTZWxlY3RvcihlbCkpfSlgO1xyXG59XHJcblxyXG4vKiogU2hvcnRoYW5kIG1hcHBpbmcgZm9yIFBXIC0taW4gZmxhZyAobGlzdGl0ZW0gXHUyMTkyIGxpc3QgZm9yIHJlYWRhYmlsaXR5KS4gKi9cclxuY29uc3QgUk9MRV9TSE9SVEhBTkRTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBsaXN0aXRlbTogJ2xpc3QnIH07XHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgc2VwYXJhdGUgSlMgYW5kIFBXIGxvY2F0b3JzLlxyXG4gKiBKUyB1c2VzIGFuY2VzdG9yIGNvbnRleHQgKC5maWx0ZXIgY2hhaW5zKTsgUFcgdXNlcyAtLWluIGZsYWcuXHJcbiAqIEZhbGxzIGJhY2sgdG8gLm50aCgpIHdoZW4gYW5jZXN0b3IgY29udGV4dCBpc24ndCBhdmFpbGFibGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVMb2NhdG9yUGFpcihlbDogRWxlbWVudCk6IHsganM6IHN0cmluZzsgcHc6IHN0cmluZzsgYW5jZXN0b3I/OiB7IHJvbGU6IHN0cmluZzsgdGV4dDogc3RyaW5nIH0gfSB7XHJcbiAgICBjb25zdCBqc0xvY2F0b3IgPSBnZW5lcmF0ZUxvY2F0b3IoZWwpO1xyXG4gICAgaWYgKCFqc0xvY2F0b3IuaW5jbHVkZXMoJy5maWx0ZXIoJykpIHJldHVybiB7IGpzOiBqc0xvY2F0b3IsIHB3OiBqc0xvY2F0b3IgfTtcclxuXHJcbiAgICAvLyBKUyB1c2VkIGFuY2VzdG9yIGNvbnRleHQgXHUyMDE0IGV4dHJhY3QgYW5jZXN0b3IgaW5mbyBmb3IgUFcgLS1pbiBmbGFnXHJcbiAgICBjb25zdCByb2xlID0gZ2V0SW1wbGljaXRSb2xlKGVsKSE7XHJcbiAgICBjb25zdCBuYW1lID0gZ2V0QWNjZXNzaWJsZU5hbWUoZWwpO1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gZmluZENvbnRhaW5lckFuY2VzdG9yKGVsKTtcclxuICAgIGNvbnN0IGNvbnRleHRUZXh0ID0gY29udGFpbmVyID8gZ2V0Q29udGV4dFRleHQoY29udGFpbmVyLmFuY2VzdG9yLCBlbCkgOiAnJztcclxuXHJcbiAgICBpZiAoY29udGFpbmVyICYmIGNvbnRleHRUZXh0KSB7XHJcbiAgICAgICAgY29uc3QgcHdMb2NhdG9yID0gYGdldEJ5Um9sZSgke2VzY2FwZVN0cmluZyhyb2xlKX0sIHsgbmFtZTogJHtlc2NhcGVTdHJpbmcobmFtZSl9IH0pYDtcclxuICAgICAgICBjb25zdCBzaG9ydFJvbGUgPSBST0xFX1NIT1JUSEFORFNbY29udGFpbmVyLnJvbGVdID8/IGNvbnRhaW5lci5yb2xlO1xyXG4gICAgICAgIHJldHVybiB7IGpzOiBqc0xvY2F0b3IsIHB3OiBwd0xvY2F0b3IsIGFuY2VzdG9yOiB7IHJvbGU6IHNob3J0Um9sZSwgdGV4dDogY29udGV4dFRleHQgfSB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE5vIGFuY2VzdG9yIGNvbnRleHQgXHUyMDE0IGZhbGwgYmFjayB0byAubnRoKClcclxuICAgIGNvbnN0IG1hdGNoZXMgPSBmaW5kQnlSb2xlQW5kTmFtZShyb2xlLCBuYW1lKTtcclxuICAgIGNvbnN0IGJhc2UgPSBgZ2V0QnlSb2xlKCR7ZXNjYXBlU3RyaW5nKHJvbGUpfSwgeyBuYW1lOiAke2VzY2FwZVN0cmluZyhuYW1lKX0sIGV4YWN0OiB0cnVlIH0pYDtcclxuICAgIGNvbnN0IGlkeCA9IG1hdGNoZXMuaW5kZXhPZihlbCk7XHJcbiAgICBjb25zdCBwd0xvY2F0b3IgPSBpZHggPT09IDAgPyBiYXNlICsgJy5maXJzdCgpJyA6IGJhc2UgKyBgLm50aCgke2lkeH0pYDtcclxuICAgIHJldHVybiB7IGpzOiBqc0xvY2F0b3IsIHB3OiBwd0xvY2F0b3IgfTtcclxufVxyXG5cclxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEVsZW1lbnQgY2xhc3NpZmljYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG4vKiogQ2hlY2sgaWYgZWxlbWVudCBpcyBhIHRleHQtZW50cnkgZmllbGQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVGV4dEZpZWxkKGVsOiBFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZWwgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSByZXR1cm4gdHJ1ZTtcclxuICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCB0eXBlID0gZWwudHlwZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIHJldHVybiAhWydjaGVja2JveCcsICdyYWRpbycsICdzdWJtaXQnLCAncmVzZXQnLCAnYnV0dG9uJywgJ2hpZGRlbicsICdmaWxlJywgJ2ltYWdlJywgJ3JhbmdlJywgJ2NvbG9yJ10uaW5jbHVkZXModHlwZSk7XHJcbiAgICB9XHJcbiAgICAvLyBjb250ZW50ZWRpdGFibGVcclxuICAgIGlmIChlbC5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpID09PSAndHJ1ZScpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG4vKiogQ2hlY2sgaWYgZWxlbWVudCBpcyBhIGNoZWNrYm94IG9yIHJhZGlvICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0NoZWNrYWJsZShlbDogRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGVsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiAoZWwudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbC50eXBlID09PSAncmFkaW8nKTtcclxufVxyXG5cclxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENvbW1hbmQgYnVpbGRpbmcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG4vKiogQnVpbGQgYm90aCBQVyBhbmQgSlMgY29tbWFuZCBzdHJpbmdzIGZvciBhIHJlY29yZGVyIGFjdGlvbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21tYW5kcyhhY3Rpb246IHN0cmluZywgZWw6IEVsZW1lbnQsIG9wdHM/OiB7XHJcbiAgICB2YWx1ZT86IHN0cmluZztcclxuICAgIGtleT86IHN0cmluZztcclxuICAgIGNoZWNrZWQ/OiBib29sZWFuO1xyXG4gICAgb3B0aW9uPzogc3RyaW5nO1xyXG59KTogeyBwdzogc3RyaW5nOyBqczogc3RyaW5nIH0gfCBudWxsIHtcclxuICAgIGNvbnN0IHsganM6IGpzTG9jYXRvciwgcHc6IHB3TG9jYXRvciwgYW5jZXN0b3IgfSA9IGdlbmVyYXRlTG9jYXRvclBhaXIoZWwpO1xyXG4gICAgY29uc3QganNMb2MgPSBgcGFnZS4ke2pzTG9jYXRvcn1gO1xyXG4gICAgY29uc3Qgcm9sZSA9IGdldEltcGxpY2l0Um9sZShlbCk7XHJcbiAgICBjb25zdCBwd0FyZ3MgPSBsb2NhdG9yVG9Qd0FyZ3MocHdMb2NhdG9yLCByb2xlKTtcclxuICAgIGNvbnN0IHEgPSAoczogc3RyaW5nKSA9PiBgXCIke3N9XCJgO1xyXG4gICAgY29uc3QgaW5GbGFnID0gYW5jZXN0b3IgPyBgIC0taW4gJHthbmNlc3Rvci5yb2xlfSAke3EoYW5jZXN0b3IudGV4dCl9YCA6ICcnO1xyXG5cclxuICAgIHN3aXRjaCAoYWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSAnaG92ZXInOlxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgcHc6IGBob3ZlciAke3B3QXJnc30ke2luRmxhZ31gLFxyXG4gICAgICAgICAgICAgICAganM6IGBhd2FpdCAke2pzTG9jfS5ob3ZlcigpO2AsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIGNhc2UgJ2NsaWNrJzpcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHB3OiBgY2xpY2sgJHtwd0FyZ3N9JHtpbkZsYWd9YCxcclxuICAgICAgICAgICAgICAgIGpzOiBgYXdhaXQgJHtqc0xvY30uY2xpY2soKTtgLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICBjYXNlICdmaWxsJzoge1xyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSBvcHRzPy52YWx1ZSA/PyAnJztcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHB3OiBgZmlsbCAke3B3QXJnc30gJHtxKHZhbCl9JHtpbkZsYWd9YCxcclxuICAgICAgICAgICAgICAgIGpzOiBgYXdhaXQgJHtqc0xvY30uZmlsbCgke2VzY2FwZVN0cmluZyh2YWwpfSk7YCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhc2UgJ2NoZWNrJzpcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHB3OiBgY2hlY2sgJHtwd0FyZ3N9JHtpbkZsYWd9YCxcclxuICAgICAgICAgICAgICAgIGpzOiBgYXdhaXQgJHtqc0xvY30uY2hlY2soKTtgLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICBjYXNlICd1bmNoZWNrJzpcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHB3OiBgdW5jaGVjayAke3B3QXJnc30ke2luRmxhZ31gLFxyXG4gICAgICAgICAgICAgICAganM6IGBhd2FpdCAke2pzTG9jfS51bmNoZWNrKCk7YCxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY2FzZSAnc2VsZWN0Jzoge1xyXG4gICAgICAgICAgICBjb25zdCBvcHRWYWwgPSBvcHRzPy5vcHRpb24gPz8gJyc7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBwdzogYHNlbGVjdCAke3B3QXJnc30gJHtxKG9wdFZhbCl9JHtpbkZsYWd9YCxcclxuICAgICAgICAgICAgICAgIGpzOiBgYXdhaXQgJHtqc0xvY30uc2VsZWN0T3B0aW9uKCR7ZXNjYXBlU3RyaW5nKG9wdFZhbCl9KTtgLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FzZSAncHJlc3MnOiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IG9wdHM/LmtleSA/PyAnJztcclxuICAgICAgICAgICAgaWYgKHB3QXJncykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBwdzogYHByZXNzICR7cHdBcmdzfSAke2tleX0ke2luRmxhZ31gLFxyXG4gICAgICAgICAgICAgICAgICAgIGpzOiBgYXdhaXQgJHtqc0xvY30ucHJlc3MoJHtlc2NhcGVTdHJpbmcoa2V5KX0pO2AsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEdsb2JhbCBrZXkgcHJlc3MgKG5vIGxvY2F0b3IgY29udGV4dClcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHB3OiBgcHJlc3MgJHtrZXl9YCxcclxuICAgICAgICAgICAgICAgIGpzOiBgYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygke2VzY2FwZVN0cmluZyhrZXkpfSk7YCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ1NTIHNlbGVjdG9yIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ3NzU2VsZWN0b3IoZWw6IEVsZW1lbnQpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKGVsLmlkKSByZXR1cm4gYCR7dGFnfSMke0NTUy5lc2NhcGUoZWwuaWQpfWA7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gWy4uLmVsLmNsYXNzTGlzdF0uc2xpY2UoMCwgMikubWFwKGMgPT4gJy4nICsgQ1NTLmVzY2FwZShjKSkuam9pbignJyk7XHJcbiAgICBpZiAoY2xhc3NlcykgcmV0dXJuIGAke3RhZ30ke2NsYXNzZXN9YDtcclxuICAgIHJldHVybiB0YWc7XHJcbn1cclxuIiwgIi8qKlxyXG4gKiBSZWNvcmRlciBjb250ZW50IHNjcmlwdC5cclxuICogSW5qZWN0ZWQgaW50byB0aGUgYWN0aXZlIHRhYiB2aWEgY2hyb21lLnNjcmlwdGluZy5leGVjdXRlU2NyaXB0LlxyXG4gKiBDYXB0dXJlcyBET00gZXZlbnRzLCBnZW5lcmF0ZXMgbG9jYXRvciArIFBXL0pTIGNvbW1hbmRzLCBzZW5kcyB0byBwYW5lbC5cclxuICpcclxuICogVHJhbnNwYXJlbnQ6IG5ldmVyIGNhbGxzIHByZXZlbnREZWZhdWx0L3N0b3BQcm9wYWdhdGlvbiBcdTIwMTQgdXNlciBhY3Rpb25zIGZsb3cgbm9ybWFsbHkuXHJcbiAqL1xyXG5pbXBvcnQgeyBlc2NhcGVTdHJpbmcsIGlzVGV4dEZpZWxkLCBpc0NoZWNrYWJsZSwgYnVpbGRDb21tYW5kcywgZmluZEhvdmVyQW5jZXN0b3IsIGlzSG92ZXJSZXZlYWxlZCB9IGZyb20gJy4vbG9jYXRvcic7XHJcblxyXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgU3BlY2lhbCBrZXkgZGV0ZWN0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxyXG5cclxuZXhwb3J0IGNvbnN0IFNQRUNJQUxfS0VZUyA9IG5ldyBTZXQoW1xyXG4gICAgJ0VudGVyJywgJ1RhYicsICdFc2NhcGUnLCAnQmFja3NwYWNlJywgJ0RlbGV0ZScsXHJcbiAgICAnQXJyb3dVcCcsICdBcnJvd0Rvd24nLCAnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnLFxyXG4gICAgJ0hvbWUnLCAnRW5kJywgJ1BhZ2VVcCcsICdQYWdlRG93bicsXHJcbiAgICAnRjEnLCAnRjInLCAnRjMnLCAnRjQnLCAnRjUnLCAnRjYnLCAnRjcnLCAnRjgnLCAnRjknLCAnRjEwJywgJ0YxMScsICdGMTInLFxyXG5dKTtcclxuXHJcbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBGaWxsIGJ1ZmZlcmluZyBzdGF0ZSBtYWNoaW5lIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxyXG5cclxuZXhwb3J0IGxldCBwZW5kaW5nRmlsbDogeyBlbDogRWxlbWVudDsgdmFsdWU6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmx1c2hQZW5kaW5nRmlsbCgpIHtcclxuICAgIHBlbmRpbmdGaWxsID0gbnVsbDtcclxufVxyXG5cclxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEV2ZW50IGhhbmRsZXJzIChjYXB0dXJlIHBoYXNlLCB0cmFuc3BhcmVudCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gb25DbGlja0NhcHR1cmUoZTogTW91c2VFdmVudCkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgRWxlbWVudDtcclxuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XHJcblxyXG4gICAgLy8gU2tpcCBjbGlja3Mgb24gdGV4dCBmaWVsZHMgKGZvY3VzLWNsaWNrIG5vaXNlIGJlZm9yZSBmaWxsKVxyXG4gICAgaWYgKGlzVGV4dEZpZWxkKHRhcmdldCkpIHJldHVybjtcclxuXHJcbiAgICAvLyBTa2lwIGNsaWNrcyBvbiBjaGVja2FibGUgZWxlbWVudHMgKGhhbmRsZWQgYnkgY2hhbmdlIGV2ZW50KVxyXG4gICAgaWYgKGlzQ2hlY2thYmxlKHRhcmdldCkpIHJldHVybjtcclxuXHJcbiAgICAvLyBGbHVzaCBhbnkgcGVuZGluZyBmaWxsXHJcbiAgICBmbHVzaFBlbmRpbmdGaWxsKCk7XHJcblxyXG4gICAgLy8gRGV0ZWN0IGhvdmVyLXJldmVhbGVkIGVsZW1lbnRzOiBpZiBhIDpob3ZlciBDU1MgcnVsZSByZXZlYWxzIHRoaXMgZWxlbWVudCxcclxuICAgIC8vIGVtaXQgYSBob3ZlciBjb21tYW5kIG9uIHRoZSA6aG92ZXIgYW5jZXN0b3Igc28gcmVwbGF5IHdvcmtzLlxyXG4gICAgaWYgKGlzSG92ZXJSZXZlYWxlZCh0YXJnZXQpKSB7XHJcbiAgICAgICAgY29uc3QgaG92ZXJUYXJnZXQgPSBmaW5kSG92ZXJBbmNlc3Rvcih0YXJnZXQpO1xyXG4gICAgICAgIGlmIChob3ZlclRhcmdldCkge1xyXG4gICAgICAgICAgICBjb25zdCBob3ZlckNtZHMgPSBidWlsZENvbW1hbmRzKCdob3ZlcicsIGhvdmVyVGFyZ2V0KTtcclxuICAgICAgICAgICAgaWYgKGhvdmVyQ21kcykge1xyXG4gICAgICAgICAgICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyB0eXBlOiAncmVjb3JkZWQtYWN0aW9uJywgYWN0aW9uOiBob3ZlckNtZHMgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY21kcyA9IGJ1aWxkQ29tbWFuZHMoJ2NsaWNrJywgdGFyZ2V0KTtcclxuICAgIGlmIChjbWRzKSB7XHJcbiAgICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyB0eXBlOiAncmVjb3JkZWQtYWN0aW9uJywgYWN0aW9uOiBjbWRzIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gb25JbnB1dENhcHR1cmUoZTogRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEVsZW1lbnQ7XHJcbiAgICBpZiAoIXRhcmdldCB8fCAhaXNUZXh0RmllbGQodGFyZ2V0KSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gKHRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCkudmFsdWUgPz8gJyc7XHJcblxyXG4gICAgaWYgKHBlbmRpbmdGaWxsICYmIHBlbmRpbmdGaWxsLmVsID09PSB0YXJnZXQpIHtcclxuICAgICAgICAvLyBTYW1lIGVsZW1lbnQgXHUyMDE0IHVwZGF0ZVxyXG4gICAgICAgIHBlbmRpbmdGaWxsLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgY29uc3QgY21kcyA9IGJ1aWxkQ29tbWFuZHMoJ2ZpbGwnLCB0YXJnZXQsIHsgdmFsdWUgfSk7XHJcbiAgICAgICAgaWYgKGNtZHMpIHtcclxuICAgICAgICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyB0eXBlOiAncmVjb3JkZWQtZmlsbC11cGRhdGUnLCBhY3Rpb246IGNtZHMgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBEaWZmZXJlbnQgZWxlbWVudCBvciBmaXJzdCBpbnB1dCBcdTIwMTQgZmx1c2ggb2xkLCBzdGFydCBuZXdcclxuICAgICAgICBmbHVzaFBlbmRpbmdGaWxsKCk7XHJcbiAgICAgICAgcGVuZGluZ0ZpbGwgPSB7IGVsOiB0YXJnZXQsIHZhbHVlIH07XHJcbiAgICAgICAgY29uc3QgY21kcyA9IGJ1aWxkQ29tbWFuZHMoJ2ZpbGwnLCB0YXJnZXQsIHsgdmFsdWUgfSk7XHJcbiAgICAgICAgaWYgKGNtZHMpIHtcclxuICAgICAgICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyB0eXBlOiAncmVjb3JkZWQtYWN0aW9uJywgYWN0aW9uOiBjbWRzIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG9uQ2hhbmdlQ2FwdHVyZShlOiBFdmVudCkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgRWxlbWVudDtcclxuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XHJcblxyXG4gICAgLy8gQ2hlY2tib3ggLyByYWRpb1xyXG4gICAgaWYgKGlzQ2hlY2thYmxlKHRhcmdldCkpIHtcclxuICAgICAgICBmbHVzaFBlbmRpbmdGaWxsKCk7XHJcbiAgICAgICAgY29uc3QgY2hlY2tlZCA9ICh0YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcclxuICAgICAgICBjb25zdCBjbWRzID0gYnVpbGRDb21tYW5kcyhjaGVja2VkID8gJ2NoZWNrJyA6ICd1bmNoZWNrJywgdGFyZ2V0KTtcclxuICAgICAgICBpZiAoY21kcykge1xyXG4gICAgICAgICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IHR5cGU6ICdyZWNvcmRlZC1hY3Rpb24nLCBhY3Rpb246IGNtZHMgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZWxlY3RcclxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCkge1xyXG4gICAgICAgIGZsdXNoUGVuZGluZ0ZpbGwoKTtcclxuICAgICAgICBjb25zdCBvcHRpb24gPSB0YXJnZXQudmFsdWU7XHJcbiAgICAgICAgY29uc3QgY21kcyA9IGJ1aWxkQ29tbWFuZHMoJ3NlbGVjdCcsIHRhcmdldCwgeyBvcHRpb24gfSk7XHJcbiAgICAgICAgaWYgKGNtZHMpIHtcclxuICAgICAgICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyB0eXBlOiAncmVjb3JkZWQtYWN0aW9uJywgYWN0aW9uOiBjbWRzIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvbktleURvd25DYXB0dXJlKGU6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICghU1BFQ0lBTF9LRVlTLmhhcyhlLmtleSkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBFbGVtZW50O1xyXG5cclxuICAgIC8vIFRhYiBjaGFuZ2VzIGZvY3VzIGJ1dCBpcyBuYXZpZ2F0aW9uIG5vaXNlIFx1MjAxNCBmbHVzaCBmaWxsLCBkb24ndCBlbWl0XHJcbiAgICBpZiAoZS5rZXkgPT09ICdUYWInKSB7IGZsdXNoUGVuZGluZ0ZpbGwoKTsgcmV0dXJuOyB9XHJcblxyXG4gICAgLy8gSW5zaWRlIGEgdGV4dCBmaWVsZCwgb25seSBFbnRlciBpcyBhIG1lYW5pbmdmdWwgYWN0aW9uIFx1MjAxNFxyXG4gICAgLy8gZXZlcnl0aGluZyBlbHNlIChCYWNrc3BhY2UsIGFycm93cywgZXRjLikgaXMgZWRpdGluZyBub2lzZVxyXG4gICAgaWYgKGUua2V5ICE9PSAnRW50ZXInICYmIHRhcmdldCAmJiBpc1RleHRGaWVsZCh0YXJnZXQpKSByZXR1cm47XHJcblxyXG4gICAgLy8gQW55IHNwZWNpYWwga2V5IGR1cmluZyBmaWxsIFx1MjE5MiBmbHVzaCBmaWxsLCB0aGVuIGZhbGwgdGhyb3VnaCB0byBlbWl0IHByZXNzXHJcbiAgICBmbHVzaFBlbmRpbmdGaWxsKCk7XHJcblxyXG4gICAgY29uc3QgY21kcyA9IHRhcmdldCAmJiB0YXJnZXQgIT09IGRvY3VtZW50LmJvZHkgJiYgdGFyZ2V0ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRcclxuICAgICAgICA/IGJ1aWxkQ29tbWFuZHMoJ3ByZXNzJywgdGFyZ2V0LCB7IGtleTogZS5rZXkgfSlcclxuICAgICAgICA6IHsgcHc6IGBwcmVzcyAke2Uua2V5fWAsIGpzOiBgYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygke2VzY2FwZVN0cmluZyhlLmtleSl9KTtgIH07XHJcbiAgICBpZiAoY21kcykge1xyXG4gICAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgdHlwZTogJ3JlY29yZGVkLWFjdGlvbicsIGFjdGlvbjogY21kcyB9KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG9uRm9jdXNPdXRDYXB0dXJlKGU6IEZvY3VzRXZlbnQpIHtcclxuICAgIGlmIChwZW5kaW5nRmlsbCAmJiBlLnRhcmdldCA9PT0gcGVuZGluZ0ZpbGwuZWwpIHtcclxuICAgICAgICBmbHVzaFBlbmRpbmdGaWxsKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBMaWZlY3ljbGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2xlYW51cCgpIHtcclxuICAgIGZsdXNoUGVuZGluZ0ZpbGwoKTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5fX3B3X3JlY29yZGVyX2FjdGl2ZSA9IGZhbHNlO1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrQ2FwdHVyZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdpbnB1dCcsIG9uSW5wdXRDYXB0dXJlLCB0cnVlKTtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG9uQ2hhbmdlQ2FwdHVyZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duQ2FwdHVyZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uRm9jdXNPdXRDYXB0dXJlLCB0cnVlKTtcclxuICAgIGNocm9tZS5ydW50aW1lLm9uTWVzc2FnZS5yZW1vdmVMaXN0ZW5lcihvbk1lc3NhZ2UpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBvbk1lc3NhZ2UobXNnOiBhbnkpIHtcclxuICAgIGlmIChtc2cudHlwZSA9PT0gJ3JlY29yZC1zdG9wJykgY2xlYW51cCgpO1xyXG59XHJcblxyXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgSW5pdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xyXG4gICAgLy8gR3VhcmQgYWdhaW5zdCBkb3VibGUtaW5qZWN0aW9uXHJcbiAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fcHdfcmVjb3JkZXJfYWN0aXZlKSByZXR1cm47XHJcbiAgICAod2luZG93IGFzIGFueSkuX19wd19yZWNvcmRlcl9hY3RpdmUgPSB0cnVlO1xyXG5cclxuICAgIGNocm9tZS5ydW50aW1lLm9uTWVzc2FnZS5hZGRMaXN0ZW5lcihvbk1lc3NhZ2UpO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrQ2FwdHVyZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIG9uSW5wdXRDYXB0dXJlLCB0cnVlKTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG9uQ2hhbmdlQ2FwdHVyZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duQ2FwdHVyZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uRm9jdXNPdXRDYXB0dXJlLCB0cnVlKTtcclxufVxyXG5cclxuaW5pdCgpO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUFRTyxNQUFNLGlCQUE0RTtBQUFBLElBQ3JGLEdBQUcsQ0FBQyxPQUFPLEdBQUcsYUFBYSxNQUFNLElBQUksU0FBUztBQUFBLElBQzlDLFFBQVE7QUFBQSxJQUNSLElBQUk7QUFBQSxJQUFXLElBQUk7QUFBQSxJQUFXLElBQUk7QUFBQSxJQUFXLElBQUk7QUFBQSxJQUFXLElBQUk7QUFBQSxJQUFXLElBQUk7QUFBQSxJQUMvRSxPQUFPLENBQUMsT0FBTztBQUNYLFlBQU0sT0FBUSxHQUF3QixLQUFLLFlBQVk7QUFDdkQsVUFBSSxTQUFTLFdBQVksUUFBTztBQUNoQyxVQUFJLFNBQVMsUUFBUyxRQUFPO0FBQzdCLFVBQUksU0FBUyxZQUFZLFNBQVMsV0FBVyxTQUFTLFNBQVUsUUFBTztBQUN2RSxVQUFJLFNBQVMsU0FBVSxRQUFPO0FBQzlCLGFBQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVixRQUFRO0FBQUEsSUFDUixLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixHQUFHO0FBQUEsSUFDSCxJQUFJO0FBQUEsSUFBUSxJQUFJO0FBQUEsSUFDaEIsSUFBSTtBQUFBLElBQ0osT0FBTztBQUFBLElBQ1AsSUFBSTtBQUFBLElB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
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ (() => {
3
+ // src/content/trace-loader.ts
4
+ chrome.runtime.onMessage.addListener((msg) => {
5
+ if (msg.type !== "load-trace" || !msg.data) return;
6
+ const bytes = new Uint8Array(msg.data);
7
+ const blob = new Blob([bytes], { type: "application/zip" });
8
+ window.postMessage({ method: "load", params: { trace: blob } }, "*");
9
+ });
10
+ chrome.runtime.sendMessage({ type: "trace-loader-ready" });
11
+ })();
12
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2NvbnRlbnQvdHJhY2UtbG9hZGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBDb250ZW50IHNjcmlwdCBpbmplY3RlZCBpbnRvIHRyYWNlLnBsYXl3cmlnaHQuZGV2XHJcbi8vIFJlY2VpdmVzIHRyYWNlIGRhdGEgZnJvbSB0aGUgYmFja2dyb3VuZCBTVyBhbmQgbG9hZHMgaXQgdmlhIHBvc3RNZXNzYWdlLlxyXG5cclxuY2hyb21lLnJ1bnRpbWUub25NZXNzYWdlLmFkZExpc3RlbmVyKChtc2cpID0+IHtcclxuICBpZiAobXNnLnR5cGUgIT09ICdsb2FkLXRyYWNlJyB8fCAhbXNnLmRhdGEpIHJldHVybjtcclxuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KG1zZy5kYXRhKTtcclxuICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2J5dGVzXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vemlwJyB9KTtcclxuICB3aW5kb3cucG9zdE1lc3NhZ2UoeyBtZXRob2Q6ICdsb2FkJywgcGFyYW1zOiB7IHRyYWNlOiBibG9iIH0gfSwgJyonKTtcclxufSk7XHJcblxyXG4vLyBTaWduYWwgcmVhZHlcclxuY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyB0eXBlOiAndHJhY2UtbG9hZGVyLXJlYWR5JyB9KTtcclxuIl0sCiAgIm1hcHBpbmdzIjogIjs7O0FBR0EsU0FBTyxRQUFRLFVBQVUsWUFBWSxDQUFDLFFBQVE7QUFDNUMsUUFBSSxJQUFJLFNBQVMsZ0JBQWdCLENBQUMsSUFBSSxLQUFNO0FBQzVDLFVBQU0sUUFBUSxJQUFJLFdBQVcsSUFBSSxJQUFJO0FBQ3JDLFVBQU0sT0FBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELFdBQU8sWUFBWSxFQUFFLFFBQVEsUUFBUSxRQUFRLEVBQUUsT0FBTyxLQUFLLEVBQUUsR0FBRyxHQUFHO0FBQUEsRUFDckUsQ0FBQztBQUdELFNBQU8sUUFBUSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>REPL</title>
7
+ <script type="module" crossorigin src="../devtools/console.js"></script>
8
+ <link rel="modulepreload" crossorigin href="../modulepreload-polyfill.js">
9
+ <link rel="modulepreload" crossorigin href="../index.js">
10
+ <link rel="modulepreload" crossorigin href="../sw-debugger-core.js">
11
+ <link rel="modulepreload" crossorigin href="../index2.js">
12
+ <link rel="stylesheet" crossorigin href="../index.css">
13
+ </head>
14
+ <body>
15
+ <div id="root"></div>
16
+ </body>
17
+ </html>