@playwright-repl/runner 0.21.2

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 (162) hide show
  1. package/README.md +116 -0
  2. package/dist/args.d.ts +16 -0
  3. package/dist/args.d.ts.map +1 -0
  4. package/dist/args.js +48 -0
  5. package/dist/args.js.map +1 -0
  6. package/dist/bridge-utils.cjs +197 -0
  7. package/dist/bridge-utils.cjs.map +1 -0
  8. package/dist/bridge-utils.d.cts +30 -0
  9. package/dist/bridge-utils.d.cts.map +1 -0
  10. package/dist/browser.d.ts +12 -0
  11. package/dist/browser.d.ts.map +1 -0
  12. package/dist/browser.js +40 -0
  13. package/dist/browser.js.map +1 -0
  14. package/dist/bundler.d.ts +6 -0
  15. package/dist/bundler.d.ts.map +1 -0
  16. package/dist/bundler.js +32 -0
  17. package/dist/bundler.js.map +1 -0
  18. package/dist/cdpPreload.cjs +44 -0
  19. package/dist/cdpPreload.cjs.map +1 -0
  20. package/dist/cdpPreload.d.cts +11 -0
  21. package/dist/cdpPreload.d.cts.map +1 -0
  22. package/dist/chrome-extension/background.js +233485 -0
  23. package/dist/chrome-extension/background.js.map +1 -0
  24. package/dist/chrome-extension/content/picker.js +279 -0
  25. package/dist/chrome-extension/content/recorder.js +475 -0
  26. package/dist/chrome-extension/devtools/console.html +17 -0
  27. package/dist/chrome-extension/devtools/console.js +28 -0
  28. package/dist/chrome-extension/devtools/console.js.map +1 -0
  29. package/dist/chrome-extension/devtools/devtools.html +8 -0
  30. package/dist/chrome-extension/devtools/devtools.js +7 -0
  31. package/dist/chrome-extension/devtools/devtools.js.map +1 -0
  32. package/dist/chrome-extension/icons/dramaturg_icon_128.png +0 -0
  33. package/dist/chrome-extension/icons/dramaturg_icon_16.png +0 -0
  34. package/dist/chrome-extension/icons/dramaturg_icon_32.png +0 -0
  35. package/dist/chrome-extension/icons/dramaturg_icon_48.png +0 -0
  36. package/dist/chrome-extension/index.css +1333 -0
  37. package/dist/chrome-extension/index.js +12462 -0
  38. package/dist/chrome-extension/index.js.map +1 -0
  39. package/dist/chrome-extension/index2.js +27327 -0
  40. package/dist/chrome-extension/index2.js.map +1 -0
  41. package/dist/chrome-extension/manifest.json +46 -0
  42. package/dist/chrome-extension/modulepreload-polyfill.js +30 -0
  43. package/dist/chrome-extension/modulepreload-polyfill.js.map +1 -0
  44. package/dist/chrome-extension/newtab/newtab.html +202 -0
  45. package/dist/chrome-extension/offscreen/offscreen.html +6 -0
  46. package/dist/chrome-extension/offscreen/offscreen.js +54 -0
  47. package/dist/chrome-extension/offscreen/offscreen.js.map +1 -0
  48. package/dist/chrome-extension/panel/panel.html +16 -0
  49. package/dist/chrome-extension/panel/panel.js +2210 -0
  50. package/dist/chrome-extension/panel/panel.js.map +1 -0
  51. package/dist/chrome-extension/preferences/preferences.html +14 -0
  52. package/dist/chrome-extension/preferences/preferences.js +102 -0
  53. package/dist/chrome-extension/preferences/preferences.js.map +1 -0
  54. package/dist/chrome-extension/settings.js +13 -0
  55. package/dist/chrome-extension/settings.js.map +1 -0
  56. package/dist/chrome-extension/sw-debugger-core.js +1127 -0
  57. package/dist/chrome-extension/sw-debugger-core.js.map +1 -0
  58. package/dist/cli.d.ts +14 -0
  59. package/dist/cli.d.ts.map +1 -0
  60. package/dist/cli.js +43 -0
  61. package/dist/cli.js.map +1 -0
  62. package/dist/compiler/classify.d.ts +13 -0
  63. package/dist/compiler/classify.d.ts.map +1 -0
  64. package/dist/compiler/classify.js +143 -0
  65. package/dist/compiler/classify.js.map +1 -0
  66. package/dist/compiler/index.d.ts +24 -0
  67. package/dist/compiler/index.d.ts.map +1 -0
  68. package/dist/compiler/index.js +41 -0
  69. package/dist/compiler/index.js.map +1 -0
  70. package/dist/compiler/parser.d.ts +24 -0
  71. package/dist/compiler/parser.d.ts.map +1 -0
  72. package/dist/compiler/parser.js +77 -0
  73. package/dist/compiler/parser.js.map +1 -0
  74. package/dist/compiler/transform.d.ts +20 -0
  75. package/dist/compiler/transform.d.ts.map +1 -0
  76. package/dist/compiler/transform.js +36 -0
  77. package/dist/compiler/transform.js.map +1 -0
  78. package/dist/compiler.d.ts +24 -0
  79. package/dist/compiler.d.ts.map +1 -0
  80. package/dist/compiler.js +129 -0
  81. package/dist/compiler.js.map +1 -0
  82. package/dist/config.d.ts +6 -0
  83. package/dist/config.d.ts.map +1 -0
  84. package/dist/config.js +16 -0
  85. package/dist/config.js.map +1 -0
  86. package/dist/discover.d.ts +5 -0
  87. package/dist/discover.d.ts.map +1 -0
  88. package/dist/discover.js +46 -0
  89. package/dist/discover.js.map +1 -0
  90. package/dist/execute.d.ts +13 -0
  91. package/dist/execute.d.ts.map +1 -0
  92. package/dist/execute.js +281 -0
  93. package/dist/execute.js.map +1 -0
  94. package/dist/index.d.ts +3 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +2 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/mode-detect.d.ts +21 -0
  99. package/dist/mode-detect.d.ts.map +1 -0
  100. package/dist/mode-detect.js +67 -0
  101. package/dist/mode-detect.js.map +1 -0
  102. package/dist/proxy-page.d.ts +32 -0
  103. package/dist/proxy-page.d.ts.map +1 -0
  104. package/dist/proxy-page.js +192 -0
  105. package/dist/proxy-page.js.map +1 -0
  106. package/dist/pw-cli.d.ts +12 -0
  107. package/dist/pw-cli.d.ts.map +1 -0
  108. package/dist/pw-cli.js +73 -0
  109. package/dist/pw-cli.js.map +1 -0
  110. package/dist/pw-launch.d.ts +15 -0
  111. package/dist/pw-launch.d.ts.map +1 -0
  112. package/dist/pw-launch.js +97 -0
  113. package/dist/pw-launch.js.map +1 -0
  114. package/dist/pw-preload.cjs +164 -0
  115. package/dist/pw-preload.cjs.map +1 -0
  116. package/dist/pw-preload.d.cts +15 -0
  117. package/dist/pw-preload.d.cts.map +1 -0
  118. package/dist/pw-repl-extension.d.ts +12 -0
  119. package/dist/pw-repl-extension.d.ts.map +1 -0
  120. package/dist/pw-repl-extension.js +100 -0
  121. package/dist/pw-repl-extension.js.map +1 -0
  122. package/dist/pw-repl.d.ts +12 -0
  123. package/dist/pw-repl.d.ts.map +1 -0
  124. package/dist/pw-repl.js +111 -0
  125. package/dist/pw-repl.js.map +1 -0
  126. package/dist/pw-worker.cjs +216 -0
  127. package/dist/pw-worker.cjs.map +1 -0
  128. package/dist/pw-worker.d.cts +13 -0
  129. package/dist/pw-worker.d.cts.map +1 -0
  130. package/dist/pw-worker.d.ts +11 -0
  131. package/dist/pw-worker.d.ts.map +1 -0
  132. package/dist/pw-worker.js +51 -0
  133. package/dist/pw-worker.js.map +1 -0
  134. package/dist/run-test.d.ts +22 -0
  135. package/dist/run-test.d.ts.map +1 -0
  136. package/dist/run-test.js +358 -0
  137. package/dist/run-test.js.map +1 -0
  138. package/dist/runner.d.ts +10 -0
  139. package/dist/runner.d.ts.map +1 -0
  140. package/dist/runner.js +82 -0
  141. package/dist/runner.js.map +1 -0
  142. package/dist/shim/alias.d.ts +11 -0
  143. package/dist/shim/alias.d.ts.map +1 -0
  144. package/dist/shim/alias.js +24 -0
  145. package/dist/shim/alias.js.map +1 -0
  146. package/dist/shim/framework.d.ts +11 -0
  147. package/dist/shim/framework.d.ts.map +1 -0
  148. package/dist/shim/framework.js +11 -0
  149. package/dist/shim/framework.js.map +1 -0
  150. package/dist/shim/test-runner-node.d.ts +49 -0
  151. package/dist/shim/test-runner-node.d.ts.map +1 -0
  152. package/dist/shim/test-runner-node.js +191 -0
  153. package/dist/shim/test-runner-node.js.map +1 -0
  154. package/dist/shim/test-runner.d.ts +44 -0
  155. package/dist/shim/test-runner.d.ts.map +1 -0
  156. package/dist/shim/test-runner.js +181 -0
  157. package/dist/shim/test-runner.js.map +1 -0
  158. package/dist/types.d.ts +41 -0
  159. package/dist/types.d.ts.map +1 -0
  160. package/dist/types.js +2 -0
  161. package/dist/types.js.map +1 -0
  162. package/package.json +37 -0
@@ -0,0 +1,475 @@
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
+ UL: "list",
29
+ OL: "list",
30
+ LI: "listitem",
31
+ TABLE: "table",
32
+ TR: "row",
33
+ TH: "columnheader",
34
+ TD: "cell",
35
+ FORM: "form",
36
+ DIALOG: "dialog",
37
+ ARTICLE: "article"
38
+ };
39
+ function getImplicitRole(el) {
40
+ const explicit = el.getAttribute("role");
41
+ if (explicit && explicit !== "none" && explicit !== "presentation") return explicit;
42
+ const entry = IMPLICIT_ROLES[el.tagName];
43
+ if (!entry) return null;
44
+ return typeof entry === "function" ? entry(el) : entry;
45
+ }
46
+ function getAccessibleName(el) {
47
+ const ariaLabel = el.getAttribute("aria-label");
48
+ if (ariaLabel) return ariaLabel.trim();
49
+ const labelledBy = el.getAttribute("aria-labelledby");
50
+ if (labelledBy) {
51
+ const parts = labelledBy.split(/\s+/).map((id) => document.getElementById(id)?.textContent?.trim()).filter(Boolean);
52
+ if (parts.length) return parts.join(" ");
53
+ }
54
+ if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) {
55
+ const label = getLabel(el);
56
+ if (label) return label;
57
+ }
58
+ const role = getImplicitRole(el);
59
+ const NAME_FROM_CONTENT = /* @__PURE__ */ new Set([
60
+ "button",
61
+ "link",
62
+ "heading",
63
+ "tab",
64
+ "menuitem",
65
+ "menuitemcheckbox",
66
+ "menuitemradio",
67
+ "option",
68
+ "radio",
69
+ "checkbox",
70
+ "switch",
71
+ "cell",
72
+ "columnheader",
73
+ "rowheader",
74
+ "tooltip",
75
+ "treeitem"
76
+ ]);
77
+ if (role && NAME_FROM_CONTENT.has(role)) {
78
+ const text = (el.textContent || "").trim();
79
+ if (text && text.length <= 80) return text;
80
+ }
81
+ if (el.tagName === "IMG") {
82
+ const alt = el.getAttribute("alt");
83
+ if (alt) return alt.trim();
84
+ }
85
+ return "";
86
+ }
87
+ function getLabel(el) {
88
+ if (el.id) {
89
+ const label = document.querySelector(`label[for="${CSS.escape(el.id)}"]`);
90
+ if (label) return (label.textContent || "").trim();
91
+ }
92
+ const parentLabel = el.closest("label");
93
+ if (parentLabel) {
94
+ const clone = parentLabel.cloneNode(true);
95
+ clone.querySelectorAll("input,textarea,select").forEach((c) => c.remove());
96
+ const text = (clone.textContent || "").trim();
97
+ if (text) return text;
98
+ }
99
+ return "";
100
+ }
101
+ var CONTAINER_ROLES = /* @__PURE__ */ new Set(["listitem", "row", "article", "group"]);
102
+ function getContextText(ancestor, exclude) {
103
+ function findText(node) {
104
+ for (const child of node.childNodes) {
105
+ if (child === exclude) continue;
106
+ if (child.nodeType === Node.ELEMENT_NODE && child.contains(exclude)) {
107
+ const inner = findText(child);
108
+ if (inner) return inner;
109
+ continue;
110
+ }
111
+ const text = (child.textContent || "").trim();
112
+ if (text && text.length <= 50) return text;
113
+ }
114
+ return "";
115
+ }
116
+ return findText(ancestor);
117
+ }
118
+ function findContainerAncestor(el) {
119
+ let current = el.parentElement;
120
+ while (current && current !== document.body && current !== document.documentElement) {
121
+ const role = getImplicitRole(current);
122
+ if (role && CONTAINER_ROLES.has(role)) return { ancestor: current, role };
123
+ current = current.parentElement;
124
+ }
125
+ return null;
126
+ }
127
+ function tryAncestorContext(el, role, name, matches) {
128
+ const container = findContainerAncestor(el);
129
+ if (!container) return null;
130
+ const contextText = getContextText(container.ancestor, el);
131
+ if (!contextText || contextText.length > 50) return null;
132
+ let count = 0;
133
+ for (const match of matches) {
134
+ const mc = findContainerAncestor(match);
135
+ if (!mc || mc.role !== container.role) continue;
136
+ if ((mc.ancestor.textContent || "").includes(contextText)) {
137
+ count++;
138
+ if (count > 1) return null;
139
+ }
140
+ }
141
+ if (count !== 1) return null;
142
+ return `getByRole(${escapeString(container.role)}).filter({ hasText: ${escapeString(contextText)} }).getByRole(${escapeString(role)}, { name: ${escapeString(name)} })`;
143
+ }
144
+ function findByRoleAndName(role, name) {
145
+ const matches = [];
146
+ for (const el of document.querySelectorAll("*")) {
147
+ if (getImplicitRole(el) === role && getAccessibleName(el) === name && el.checkVisibility?.() !== false)
148
+ matches.push(el);
149
+ }
150
+ return matches;
151
+ }
152
+ function findHoverAncestor(el) {
153
+ let ancestor = el.parentElement;
154
+ while (ancestor && ancestor !== document.body && ancestor !== document.documentElement) {
155
+ if (ancestor.matches(":hover")) return ancestor;
156
+ ancestor = ancestor.parentElement;
157
+ }
158
+ return null;
159
+ }
160
+ function isHoverRevealed(el) {
161
+ for (const sheet of document.styleSheets) {
162
+ try {
163
+ for (const rule of sheet.cssRules) {
164
+ if (!(rule instanceof CSSStyleRule)) continue;
165
+ if (!rule.selectorText.includes(":hover")) continue;
166
+ const s = rule.style;
167
+ const reveals = s.display && s.display !== "none" || s.visibility === "visible" || s.opacity && s.opacity !== "0";
168
+ if (!reveals) continue;
169
+ try {
170
+ if (el.matches(rule.selectorText)) return true;
171
+ } catch {
172
+ }
173
+ }
174
+ } catch {
175
+ }
176
+ }
177
+ return false;
178
+ }
179
+ function locatorToPwArgs(locator, role) {
180
+ const q = (s) => `"${s}"`;
181
+ let nth = "";
182
+ if (/\.first\(\)/.test(locator)) nth = " --nth 0";
183
+ else if (/\.last\(\)/.test(locator)) nth = " --nth -1";
184
+ else {
185
+ const nthMatch = locator.match(/\.nth\((\d+)\)/);
186
+ if (nthMatch) nth = ` --nth ${nthMatch[1]}`;
187
+ }
188
+ const roleNameMatch = locator.match(/getByRole\(['"](.+?)['"],\s*\{[^}]*name:\s*['"](.+?)['"]/);
189
+ if (roleNameMatch) return `${roleNameMatch[1]} ${q(roleNameMatch[2])}${nth}`;
190
+ const roleMatch = locator.match(/getByRole\(['"](.+?)['"]\)/);
191
+ if (roleMatch) return `${roleMatch[1]}${nth}`;
192
+ const testIdMatch = locator.match(/getByTestId\(['"](.+?)['"]\)/);
193
+ if (testIdMatch) return `${q(testIdMatch[1])}${nth}`;
194
+ const getByMatch = locator.match(/getBy\w+\(['"](.+?)['"]\)/);
195
+ if (getByMatch) {
196
+ const prefix = role ? `${role} ` : "";
197
+ return `${prefix}${q(getByMatch[1])}${nth}`;
198
+ }
199
+ const locatorMatch = locator.match(/locator\(['"](.+?)['"]\)/);
200
+ if (locatorMatch) return `${q(locatorMatch[1])}${nth}`;
201
+ return q(locator);
202
+ }
203
+ function escapeString(s) {
204
+ if (!s.includes("'")) return `'${s}'`;
205
+ if (!s.includes('"')) return `"${s}"`;
206
+ return `'${s.replace(/'/g, "\\'")}'`;
207
+ }
208
+ function generateLocator(el) {
209
+ const testId = el.getAttribute("data-testid") || el.getAttribute("data-test-id");
210
+ if (testId) return `getByTestId(${escapeString(testId)})`;
211
+ const role = getImplicitRole(el);
212
+ const name = getAccessibleName(el);
213
+ if (role && name) {
214
+ const matches = findByRoleAndName(role, name);
215
+ if (matches.length > 1) {
216
+ const ancestorLocator = tryAncestorContext(el, role, name, matches);
217
+ if (ancestorLocator) return ancestorLocator;
218
+ const base = `getByRole(${escapeString(role)}, { name: ${escapeString(name)}, exact: true })`;
219
+ const idx = matches.indexOf(el);
220
+ return idx === 0 ? base + ".first()" : base + `.nth(${idx})`;
221
+ }
222
+ return `getByRole(${escapeString(role)}, { name: ${escapeString(name)} })`;
223
+ }
224
+ if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) {
225
+ const label = getLabel(el);
226
+ if (label) return `getByLabel(${escapeString(label)})`;
227
+ }
228
+ const placeholder = el.getAttribute("placeholder");
229
+ if (placeholder) return `getByPlaceholder(${escapeString(placeholder)})`;
230
+ const alt = el.getAttribute("alt");
231
+ if (alt && ["IMG", "APPLET", "AREA", "INPUT"].includes(el.tagName))
232
+ return `getByAltText(${escapeString(alt)})`;
233
+ const title = el.getAttribute("title");
234
+ if (title) return `getByTitle(${escapeString(title)})`;
235
+ const text = (el.textContent || "").trim();
236
+ if (text && text.length <= 80) return `getByText(${escapeString(text)})`;
237
+ if (role) return `getByRole(${escapeString(role)})`;
238
+ return `locator(${escapeString(buildCssSelector(el))})`;
239
+ }
240
+ var ROLE_SHORTHANDS = { listitem: "list" };
241
+ function generateLocatorPair(el) {
242
+ const jsLocator = generateLocator(el);
243
+ if (!jsLocator.includes(".filter(")) return { js: jsLocator, pw: jsLocator };
244
+ const role = getImplicitRole(el);
245
+ const name = getAccessibleName(el);
246
+ const container = findContainerAncestor(el);
247
+ const contextText = container ? getContextText(container.ancestor, el) : "";
248
+ if (container && contextText) {
249
+ const pwLocator2 = `getByRole(${escapeString(role)}, { name: ${escapeString(name)} })`;
250
+ const shortRole = ROLE_SHORTHANDS[container.role] ?? container.role;
251
+ return { js: jsLocator, pw: pwLocator2, ancestor: { role: shortRole, text: contextText } };
252
+ }
253
+ const matches = findByRoleAndName(role, name);
254
+ const base = `getByRole(${escapeString(role)}, { name: ${escapeString(name)}, exact: true })`;
255
+ const idx = matches.indexOf(el);
256
+ const pwLocator = idx === 0 ? base + ".first()" : base + `.nth(${idx})`;
257
+ return { js: jsLocator, pw: pwLocator };
258
+ }
259
+ function isTextField(el) {
260
+ if (el instanceof HTMLTextAreaElement) return true;
261
+ if (el instanceof HTMLInputElement) {
262
+ const type = el.type.toLowerCase();
263
+ return !["checkbox", "radio", "submit", "reset", "button", "hidden", "file", "image", "range", "color"].includes(type);
264
+ }
265
+ if (el.getAttribute("contenteditable") === "true") return true;
266
+ return false;
267
+ }
268
+ function isCheckable(el) {
269
+ return el instanceof HTMLInputElement && (el.type === "checkbox" || el.type === "radio");
270
+ }
271
+ function buildCommands(action, el, opts) {
272
+ const { js: jsLocator, pw: pwLocator, ancestor } = generateLocatorPair(el);
273
+ const jsLoc = `page.${jsLocator}`;
274
+ const role = getImplicitRole(el);
275
+ const pwArgs = locatorToPwArgs(pwLocator, role);
276
+ const q = (s) => `"${s}"`;
277
+ const inFlag = ancestor ? ` --in ${ancestor.role} ${q(ancestor.text)}` : "";
278
+ switch (action) {
279
+ case "hover":
280
+ return {
281
+ pw: `hover ${pwArgs}${inFlag}`,
282
+ js: `await ${jsLoc}.hover();`
283
+ };
284
+ case "click":
285
+ return {
286
+ pw: `click ${pwArgs}${inFlag}`,
287
+ js: `await ${jsLoc}.click();`
288
+ };
289
+ case "fill": {
290
+ const val = opts?.value ?? "";
291
+ return {
292
+ pw: `fill ${pwArgs} ${q(val)}${inFlag}`,
293
+ js: `await ${jsLoc}.fill(${escapeString(val)});`
294
+ };
295
+ }
296
+ case "check":
297
+ return {
298
+ pw: `check ${pwArgs}${inFlag}`,
299
+ js: `await ${jsLoc}.check();`
300
+ };
301
+ case "uncheck":
302
+ return {
303
+ pw: `uncheck ${pwArgs}${inFlag}`,
304
+ js: `await ${jsLoc}.uncheck();`
305
+ };
306
+ case "select": {
307
+ const optVal = opts?.option ?? "";
308
+ return {
309
+ pw: `select ${pwArgs} ${q(optVal)}${inFlag}`,
310
+ js: `await ${jsLoc}.selectOption(${escapeString(optVal)});`
311
+ };
312
+ }
313
+ case "press": {
314
+ const key = opts?.key ?? "";
315
+ if (pwArgs) {
316
+ return {
317
+ pw: `press ${pwArgs} ${key}${inFlag}`,
318
+ js: `await ${jsLoc}.press(${escapeString(key)});`
319
+ };
320
+ }
321
+ return {
322
+ pw: `press ${key}`,
323
+ js: `await page.keyboard.press(${escapeString(key)});`
324
+ };
325
+ }
326
+ default:
327
+ return null;
328
+ }
329
+ }
330
+ function buildCssSelector(el) {
331
+ const tag = el.tagName.toLowerCase();
332
+ if (el.id) return `${tag}#${CSS.escape(el.id)}`;
333
+ const classes = [...el.classList].slice(0, 2).map((c) => "." + CSS.escape(c)).join("");
334
+ if (classes) return `${tag}${classes}`;
335
+ return tag;
336
+ }
337
+
338
+ // src/content/recorder.ts
339
+ var SPECIAL_KEYS = /* @__PURE__ */ new Set([
340
+ "Enter",
341
+ "Tab",
342
+ "Escape",
343
+ "Backspace",
344
+ "Delete",
345
+ "ArrowUp",
346
+ "ArrowDown",
347
+ "ArrowLeft",
348
+ "ArrowRight",
349
+ "Home",
350
+ "End",
351
+ "PageUp",
352
+ "PageDown",
353
+ "F1",
354
+ "F2",
355
+ "F3",
356
+ "F4",
357
+ "F5",
358
+ "F6",
359
+ "F7",
360
+ "F8",
361
+ "F9",
362
+ "F10",
363
+ "F11",
364
+ "F12"
365
+ ]);
366
+ var pendingFill = null;
367
+ function flushPendingFill() {
368
+ pendingFill = null;
369
+ }
370
+ function onClickCapture(e) {
371
+ const target = e.target;
372
+ if (!target) return;
373
+ if (isTextField(target)) return;
374
+ if (isCheckable(target)) return;
375
+ flushPendingFill();
376
+ if (isHoverRevealed(target)) {
377
+ const hoverTarget = findHoverAncestor(target);
378
+ if (hoverTarget) {
379
+ const hoverCmds = buildCommands("hover", hoverTarget);
380
+ if (hoverCmds) {
381
+ chrome.runtime.sendMessage({ type: "recorded-action", action: hoverCmds });
382
+ }
383
+ }
384
+ }
385
+ const cmds = buildCommands("click", target);
386
+ if (cmds) {
387
+ chrome.runtime.sendMessage({ type: "recorded-action", action: cmds });
388
+ }
389
+ }
390
+ function onInputCapture(e) {
391
+ const target = e.target;
392
+ if (!target || !isTextField(target)) return;
393
+ const value = target.value ?? "";
394
+ if (pendingFill && pendingFill.el === target) {
395
+ pendingFill.value = value;
396
+ const cmds = buildCommands("fill", target, { value });
397
+ if (cmds) {
398
+ chrome.runtime.sendMessage({ type: "recorded-fill-update", action: cmds });
399
+ }
400
+ } else {
401
+ flushPendingFill();
402
+ pendingFill = { el: target, value };
403
+ const cmds = buildCommands("fill", target, { value });
404
+ if (cmds) {
405
+ chrome.runtime.sendMessage({ type: "recorded-action", action: cmds });
406
+ }
407
+ }
408
+ }
409
+ function onChangeCapture(e) {
410
+ const target = e.target;
411
+ if (!target) return;
412
+ if (isCheckable(target)) {
413
+ flushPendingFill();
414
+ const checked = target.checked;
415
+ const cmds = buildCommands(checked ? "check" : "uncheck", target);
416
+ if (cmds) {
417
+ chrome.runtime.sendMessage({ type: "recorded-action", action: cmds });
418
+ }
419
+ return;
420
+ }
421
+ if (target instanceof HTMLSelectElement) {
422
+ flushPendingFill();
423
+ const option = target.value;
424
+ const cmds = buildCommands("select", target, { option });
425
+ if (cmds) {
426
+ chrome.runtime.sendMessage({ type: "recorded-action", action: cmds });
427
+ }
428
+ return;
429
+ }
430
+ }
431
+ function onKeyDownCapture(e) {
432
+ if (!SPECIAL_KEYS.has(e.key)) return;
433
+ const target = e.target;
434
+ if (e.key === "Tab") {
435
+ flushPendingFill();
436
+ return;
437
+ }
438
+ if (e.key !== "Enter" && target && isTextField(target)) return;
439
+ flushPendingFill();
440
+ 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)});` };
441
+ if (cmds) {
442
+ chrome.runtime.sendMessage({ type: "recorded-action", action: cmds });
443
+ }
444
+ }
445
+ function onFocusOutCapture(e) {
446
+ if (pendingFill && e.target === pendingFill.el) {
447
+ flushPendingFill();
448
+ }
449
+ }
450
+ function cleanup() {
451
+ flushPendingFill();
452
+ window.__pw_recorder_active = false;
453
+ document.removeEventListener("click", onClickCapture, true);
454
+ document.removeEventListener("input", onInputCapture, true);
455
+ document.removeEventListener("change", onChangeCapture, true);
456
+ document.removeEventListener("keydown", onKeyDownCapture, true);
457
+ document.removeEventListener("focusout", onFocusOutCapture, true);
458
+ chrome.runtime.onMessage.removeListener(onMessage);
459
+ }
460
+ function onMessage(msg) {
461
+ if (msg.type === "record-stop") cleanup();
462
+ }
463
+ function init() {
464
+ if (window.__pw_recorder_active) return;
465
+ window.__pw_recorder_active = true;
466
+ chrome.runtime.onMessage.addListener(onMessage);
467
+ document.addEventListener("click", onClickCapture, true);
468
+ document.addEventListener("input", onInputCapture, true);
469
+ document.addEventListener("change", onChangeCapture, true);
470
+ document.addEventListener("keydown", onKeyDownCapture, true);
471
+ document.addEventListener("focusout", onFocusOutCapture, true);
472
+ }
473
+ init();
474
+ })();
475
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2NvbnRlbnQvbG9jYXRvci50cyIsICJzcmMvY29udGVudC9yZWNvcmRlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXHJcbiAqIFNoYXJlZCBsb2NhdG9yIGdlbmVyYXRpb24gdXRpbGl0aWVzLlxyXG4gKiBVc2VkIGJ5IGJvdGggcGlja2VyLnRzIGFuZCByZWNvcmRlci50cyBjb250ZW50IHNjcmlwdHMuXHJcbiAqIFZpdGUgaW5saW5lcyB0aGlzIGludG8gZWFjaCBjb250ZW50IHNjcmlwdCBidW5kbGUgXHUyMDE0IG5vIHJ1bnRpbWUgbW9kdWxlIGxvYWRpbmcuXHJcbiAqL1xyXG5cclxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEltcGxpY2l0IEFSSUEgcm9sZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG5leHBvcnQgY29uc3QgSU1QTElDSVRfUk9MRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8ICgoZWw6IEVsZW1lbnQpID0+IHN0cmluZyB8IG51bGwpPiA9IHtcclxuICAgIEE6IChlbCkgPT4gZWwuaGFzQXR0cmlidXRlKCdocmVmJykgPyAnbGluaycgOiBudWxsLFxyXG4gICAgQlVUVE9OOiAnYnV0dG9uJyxcclxuICAgIEgxOiAnaGVhZGluZycsIEgyOiAnaGVhZGluZycsIEgzOiAnaGVhZGluZycsIEg0OiAnaGVhZGluZycsIEg1OiAnaGVhZGluZycsIEg2OiAnaGVhZGluZycsXHJcbiAgICBJTlBVVDogKGVsKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdHlwZSA9IChlbCBhcyBIVE1MSW5wdXRFbGVtZW50KS50eXBlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICdjaGVja2JveCcpIHJldHVybiAnY2hlY2tib3gnO1xyXG4gICAgICAgIGlmICh0eXBlID09PSAncmFkaW8nKSByZXR1cm4gJ3JhZGlvJztcclxuICAgICAgICBpZiAodHlwZSA9PT0gJ3N1Ym1pdCcgfHwgdHlwZSA9PT0gJ3Jlc2V0JyB8fCB0eXBlID09PSAnYnV0dG9uJykgcmV0dXJuICdidXR0b24nO1xyXG4gICAgICAgIGlmICh0eXBlID09PSAnaGlkZGVuJykgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuICd0ZXh0Ym94JztcclxuICAgIH0sXHJcbiAgICBURVhUQVJFQTogJ3RleHRib3gnLFxyXG4gICAgU0VMRUNUOiAnY29tYm9ib3gnLFxyXG4gICAgSU1HOiAnaW1nJyxcclxuICAgIE5BVjogJ25hdmlnYXRpb24nLFxyXG4gICAgTUFJTjogJ21haW4nLFxyXG4gICAgSEVBREVSOiAnYmFubmVyJyxcclxuICAgIEZPT1RFUjogJ2NvbnRlbnRpbmZvJyxcclxuICAgIFVMOiAnbGlzdCcsIE9MOiAnbGlzdCcsXHJcbiAgICBMSTogJ2xpc3RpdGVtJyxcclxuICAgIFRBQkxFOiAndGFibGUnLFxyXG4gICAgVFI6ICdyb3cnLFxyXG4gICAgVEg6ICdjb2x1bW5oZWFkZXInLFxyXG4gICAgVEQ6ICdjZWxsJyxcclxuICAgIEZPUk06ICdmb3JtJyxcclxuICAgIERJQUxPRzogJ2RpYWxvZycsXHJcbiAgICBBUlRJQ0xFOiAnYXJ0aWNsZScsXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW1wbGljaXRSb2xlKGVsOiBFbGVtZW50KTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBjb25zdCBleHBsaWNpdCA9IGVsLmdldEF0dHJpYnV0ZSgncm9sZScpO1xyXG4gICAgaWYgKGV4cGxpY2l0ICYmIGV4cGxpY2l0ICE9PSAnbm9uZScgJiYgZXhwbGljaXQgIT09ICdwcmVzZW50YXRpb24nKSByZXR1cm4gZXhwbGljaXQ7XHJcbiAgICBjb25zdCBlbnRyeSA9IElNUExJQ0lUX1JPTEVTW2VsLnRhZ05hbWVdO1xyXG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdHlwZW9mIGVudHJ5ID09PSAnZnVuY3Rpb24nID8gZW50cnkoZWwpIDogZW50cnk7XHJcbn1cclxuXHJcbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBY2Nlc3NpYmxlIG5hbWUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWNjZXNzaWJsZU5hbWUoZWw6IEVsZW1lbnQpOiBzdHJpbmcge1xyXG4gICAgLy8gYXJpYS1sYWJlbFxyXG4gICAgY29uc3QgYXJpYUxhYmVsID0gZWwuZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJyk7XHJcbiAgICBpZiAoYXJpYUxhYmVsKSByZXR1cm4gYXJpYUxhYmVsLnRyaW0oKTtcclxuXHJcbiAgICAvLyBhcmlhLWxhYmVsbGVkYnlcclxuICAgIGNvbnN0IGxhYmVsbGVkQnkgPSBlbC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpO1xyXG4gICAgaWYgKGxhYmVsbGVkQnkpIHtcclxuICAgICAgICBjb25zdCBwYXJ0cyA9IGxhYmVsbGVkQnkuc3BsaXQoL1xccysvKS5tYXAoaWQgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpPy50ZXh0Q29udGVudD8udHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCkgcmV0dXJuIHBhcnRzLmpvaW4oJyAnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3IgaW5wdXRzOiBhc3NvY2lhdGVkIDxsYWJlbD5cclxuICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHwgZWwgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8IGVsIGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBsYWJlbCA9IGdldExhYmVsKGVsKTtcclxuICAgICAgICBpZiAobGFiZWwpIHJldHVybiBsYWJlbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3Igcm9sZXMgdGhhdCBnZXQgbmFtZSBmcm9tIGNvbnRlbnQgKEFSSUEgXCJuYW1lIGZyb20gY29udGVudFwiIHJvbGVzKVxyXG4gICAgY29uc3Qgcm9sZSA9IGdldEltcGxpY2l0Um9sZShlbCk7XHJcbiAgICBjb25zdCBOQU1FX0ZST01fQ09OVEVOVCA9IG5ldyBTZXQoW1xyXG4gICAgICAgICdidXR0b24nLCAnbGluaycsICdoZWFkaW5nJywgJ3RhYicsICdtZW51aXRlbScsICdtZW51aXRlbWNoZWNrYm94JyxcclxuICAgICAgICAnbWVudWl0ZW1yYWRpbycsICdvcHRpb24nLCAncmFkaW8nLCAnY2hlY2tib3gnLCAnc3dpdGNoJywgJ2NlbGwnLFxyXG4gICAgICAgICdjb2x1bW5oZWFkZXInLCAncm93aGVhZGVyJywgJ3Rvb2x0aXAnLCAndHJlZWl0ZW0nLFxyXG4gICAgXSk7XHJcbiAgICBpZiAocm9sZSAmJiBOQU1FX0ZST01fQ09OVEVOVC5oYXMocm9sZSkpIHtcclxuICAgICAgICBjb25zdCB0ZXh0ID0gKGVsLnRleHRDb250ZW50IHx8ICcnKS50cmltKCk7XHJcbiAgICAgICAgaWYgKHRleHQgJiYgdGV4dC5sZW5ndGggPD0gODApIHJldHVybiB0ZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFsdCBmb3IgaW1hZ2VzXHJcbiAgICBpZiAoZWwudGFnTmFtZSA9PT0gJ0lNRycpIHtcclxuICAgICAgICBjb25zdCBhbHQgPSBlbC5nZXRBdHRyaWJ1dGUoJ2FsdCcpO1xyXG4gICAgICAgIGlmIChhbHQpIHJldHVybiBhbHQudHJpbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAnJztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldExhYmVsKGVsOiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50KTogc3RyaW5nIHtcclxuICAgIC8vIEV4cGxpY2l0IGxhYmVsIHZpYSBmb3IgYXR0cmlidXRlXHJcbiAgICBpZiAoZWwuaWQpIHtcclxuICAgICAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYGxhYmVsW2Zvcj1cIiR7Q1NTLmVzY2FwZShlbC5pZCl9XCJdYCk7XHJcbiAgICAgICAgaWYgKGxhYmVsKSByZXR1cm4gKGxhYmVsLnRleHRDb250ZW50IHx8ICcnKS50cmltKCk7XHJcbiAgICB9XHJcbiAgICAvLyBJbXBsaWNpdCBsYWJlbCAoYW5jZXN0b3IpXHJcbiAgICBjb25zdCBwYXJlbnRMYWJlbCA9IGVsLmNsb3Nlc3QoJ2xhYmVsJyk7XHJcbiAgICBpZiAocGFyZW50TGFiZWwpIHtcclxuICAgICAgICAvLyBHZXQgbGFiZWwgdGV4dCBleGNsdWRpbmcgdGhlIGlucHV0J3Mgb3duIHRleHRcclxuICAgICAgICBjb25zdCBjbG9uZSA9IHBhcmVudExhYmVsLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICBjbG9uZS5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCx0ZXh0YXJlYSxzZWxlY3QnKS5mb3JFYWNoKGMgPT4gYy5yZW1vdmUoKSk7XHJcbiAgICAgICAgY29uc3QgdGV4dCA9IChjbG9uZS50ZXh0Q29udGVudCB8fCAnJykudHJpbSgpO1xyXG4gICAgICAgIGlmICh0ZXh0KSByZXR1cm4gdGV4dDtcclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxufVxyXG5cclxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEFuY2VzdG9yIGNvbnRleHQgZGlzYW1iaWd1YXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG4vKiogQ29udGFpbmVyIHJvbGVzIHN1aXRhYmxlIGZvciBhbmNlc3Rvci1jb250ZXh0IGRpc2FtYmlndWF0aW9uLiAqL1xyXG5jb25zdCBDT05UQUlORVJfUk9MRVMgPSBuZXcgU2V0KFsnbGlzdGl0ZW0nLCAncm93JywgJ2FydGljbGUnLCAnZ3JvdXAnXSk7XHJcblxyXG4vKipcclxuICogRmluZCBkaXN0aW5jdGl2ZSB0ZXh0IGluIGFuIGFuY2VzdG9yIHRoYXQgZG9lc24ndCBjb21lIGZyb20gdGhlIGV4Y2x1ZGVkIGVsZW1lbnQncyBzdWJ0cmVlLlxyXG4gKiBSZXR1cm5zIHRleHQgZnJvbSB0aGUgZmlyc3QgY2hpbGQgc3VidHJlZSB0aGF0IGRvZXNuJ3QgY29udGFpbiB0aGUgZXhjbHVkZWQgZWxlbWVudCxcclxuICogcmVjdXJzaW5nIGludG8gd3JhcHBlcnMgdGhhdCBkbyBjb250YWluIGl0LiBUaGlzIGVuc3VyZXMgdGhlIHJldHVybmVkIHRleHQgaXMgYVxyXG4gKiBjb250aWd1b3VzIHN1YnN0cmluZyBvZiB0aGUgYW5jZXN0b3IncyBmdWxsIHRleHRDb250ZW50IChuZWVkZWQgZm9yIGhhc1RleHQgbWF0Y2hpbmcpLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0Q29udGV4dFRleHQoYW5jZXN0b3I6IEVsZW1lbnQsIGV4Y2x1ZGU6IEVsZW1lbnQpOiBzdHJpbmcge1xyXG4gICAgZnVuY3Rpb24gZmluZFRleHQobm9kZTogTm9kZSk6IHN0cmluZyB7XHJcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkTm9kZXMpIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkID09PSBleGNsdWRlKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiAoY2hpbGQgYXMgRWxlbWVudCkuY29udGFpbnMoZXhjbHVkZSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgc3VidHJlZSBjb250YWlucyB0aGUgdGFyZ2V0IFx1MjAxNCByZWN1cnNlIHRvIGZpbmQgbm9uLXRhcmdldCBzaWJsaW5nc1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXIgPSBmaW5kVGV4dChjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXIpIHJldHVybiBpbm5lcjtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoY2hpbGQudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC5sZW5ndGggPD0gNTApIHJldHVybiB0ZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmluZFRleHQoYW5jZXN0b3IpO1xyXG59XHJcblxyXG4vKiogV2FsayB1cCBmcm9tIGVsIHRvIGZpbmQgbmVhcmVzdCBhbmNlc3RvciB3aXRoIGEgY29udGFpbmVyIHJvbGUuICovXHJcbmZ1bmN0aW9uIGZpbmRDb250YWluZXJBbmNlc3RvcihlbDogRWxlbWVudCk6IHsgYW5jZXN0b3I6IEVsZW1lbnQ7IHJvbGU6IHN0cmluZyB9IHwgbnVsbCB7XHJcbiAgICBsZXQgY3VycmVudCA9IGVsLnBhcmVudEVsZW1lbnQ7XHJcbiAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBkb2N1bWVudC5ib2R5ICYmIGN1cnJlbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHJvbGUgPSBnZXRJbXBsaWNpdFJvbGUoY3VycmVudCk7XHJcbiAgICAgICAgaWYgKHJvbGUgJiYgQ09OVEFJTkVSX1JPTEVTLmhhcyhyb2xlKSkgcmV0dXJuIHsgYW5jZXN0b3I6IGN1cnJlbnQsIHJvbGUgfTtcclxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUcnkgdG8gZGlzYW1iaWd1YXRlIHVzaW5nIGFuY2VzdG9yIGNvbnRleHQuXHJcbiAqIFJldHVybnMgYSBjaGFpbmVkIGxvY2F0b3IgbGlrZTpcclxuICogICBnZXRCeVJvbGUoJ2xpc3RpdGVtJykuZmlsdGVyKHsgaGFzVGV4dDogJ3JlYWRpbmcnIH0pLmdldEJ5Um9sZSgnYnV0dG9uJywgeyBuYW1lOiAnRGVsZXRlJyB9KVxyXG4gKiBvciBudWxsIGlmIGFuY2VzdG9yIGNvbnRleHQgZG9lc24ndCBwcm9kdWNlIGEgdW5pcXVlIHJlc3VsdC5cclxuICovXHJcbmZ1bmN0aW9uIHRyeUFuY2VzdG9yQ29udGV4dChlbDogRWxlbWVudCwgcm9sZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIG1hdGNoZXM6IEVsZW1lbnRbXSk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gZmluZENvbnRhaW5lckFuY2VzdG9yKGVsKTtcclxuICAgIGlmICghY29udGFpbmVyKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBjb250ZXh0VGV4dCA9IGdldENvbnRleHRUZXh0KGNvbnRhaW5lci5hbmNlc3RvciwgZWwpO1xyXG4gICAgaWYgKCFjb250ZXh0VGV4dCB8fCBjb250ZXh0VGV4dC5sZW5ndGggPiA1MCkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gVmVyaWZ5IHVuaXF1ZW5lc3M6IG9ubHkgb25lIG1hdGNoJ3MgY29udGFpbmVyIGFuY2VzdG9yIHNob3VsZCBjb250YWluIHRoaXMgdGV4dFxyXG4gICAgbGV0IGNvdW50ID0gMDtcclxuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgbWF0Y2hlcykge1xyXG4gICAgICAgIGNvbnN0IG1jID0gZmluZENvbnRhaW5lckFuY2VzdG9yKG1hdGNoKTtcclxuICAgICAgICBpZiAoIW1jIHx8IG1jLnJvbGUgIT09IGNvbnRhaW5lci5yb2xlKSBjb250aW51ZTtcclxuICAgICAgICBpZiAoKG1jLmFuY2VzdG9yLnRleHRDb250ZW50IHx8ICcnKS5pbmNsdWRlcyhjb250ZXh0VGV4dCkpIHtcclxuICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgaWYgKGNvdW50ID4gMSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKGNvdW50ICE9PSAxKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICByZXR1cm4gYGdldEJ5Um9sZSgke2VzY2FwZVN0cmluZyhjb250YWluZXIucm9sZSl9KS5maWx0ZXIoeyBoYXNUZXh0OiAke2VzY2FwZVN0cmluZyhjb250ZXh0VGV4dCl9IH0pLmdldEJ5Um9sZSgke2VzY2FwZVN0cmluZyhyb2xlKX0sIHsgbmFtZTogJHtlc2NhcGVTdHJpbmcobmFtZSl9IH0pYDtcclxufVxyXG5cclxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIExvY2F0b3IgZGlzYW1iaWd1YXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmluZEJ5Um9sZUFuZE5hbWUocm9sZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBFbGVtZW50W10ge1xyXG4gICAgY29uc3QgbWF0Y2hlczogRWxlbWVudFtdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGVsIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSkge1xyXG4gICAgICAgIGlmIChnZXRJbXBsaWNpdFJvbGUoZWwpID09PSByb2xlICYmIGdldEFjY2Vzc2libGVOYW1lKGVsKSA9PT0gbmFtZVxyXG4gICAgICAgICAgICAmJiAoZWwgYXMgSFRNTEVsZW1lbnQpLmNoZWNrVmlzaWJpbGl0eT8uKCkgIT09IGZhbHNlKVxyXG4gICAgICAgICAgICBtYXRjaGVzLnB1c2goZWwpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG1hdGNoZXM7XHJcbn1cclxuXHJcbi8qKiBMaWtlIGZpbmRCeVJvbGVBbmROYW1lIGJ1dCBpbmNsdWRlcyBoaWRkZW4gZWxlbWVudHMgKGZvciBob3ZlciBkZXRlY3Rpb24pLiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZmluZEFsbEJ5Um9sZUFuZE5hbWUocm9sZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBFbGVtZW50W10ge1xyXG4gICAgY29uc3QgbWF0Y2hlczogRWxlbWVudFtdID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGVsIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSkge1xyXG4gICAgICAgIGlmIChnZXRJbXBsaWNpdFJvbGUoZWwpID09PSByb2xlICYmIGdldEFjY2Vzc2libGVOYW1lKGVsKSA9PT0gbmFtZSlcclxuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGVsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBtYXRjaGVzO1xyXG59XHJcblxyXG4vKiogRmluZCB0aGUgbmVhcmVzdCA6aG92ZXIgYW5jZXN0b3IgKGZvciByZWNvcmRpbmcgaG92ZXIgYmVmb3JlIGNsaWNrKS4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRIb3ZlckFuY2VzdG9yKGVsOiBFbGVtZW50KTogRWxlbWVudCB8IG51bGwge1xyXG4gICAgbGV0IGFuY2VzdG9yID0gZWwucGFyZW50RWxlbWVudDtcclxuICAgIHdoaWxlIChhbmNlc3RvciAmJiBhbmNlc3RvciAhPT0gZG9jdW1lbnQuYm9keSAmJiBhbmNlc3RvciAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKGFuY2VzdG9yLm1hdGNoZXMoJzpob3ZlcicpKSByZXR1cm4gYW5jZXN0b3I7XHJcbiAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnRFbGVtZW50O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiBlbGVtZW50IGlzIHJldmVhbGVkIGJ5IGEgOmhvdmVyIENTUyBydWxlLlxyXG4gKiBTY2FucyBzdHlsZXNoZWV0cyBmb3IgcnVsZXMgbGlrZSBgLnBhcmVudDpob3ZlciAuY2hpbGQgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2sgfWAuXHJcbiAqIEF0IGNsaWNrIHRpbWUgdGhlIGFuY2VzdG9yIElTIGhvdmVyZWQsIHNvIGVsLm1hdGNoZXMoKSB3b3JrcyBhZ2FpbnN0IDpob3ZlciBzZWxlY3RvcnMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNIb3ZlclJldmVhbGVkKGVsOiBFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IHNoZWV0IG9mIGRvY3VtZW50LnN0eWxlU2hlZXRzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIHNoZWV0LmNzc1J1bGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIShydWxlIGluc3RhbmNlb2YgQ1NTU3R5bGVSdWxlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXJ1bGUuc2VsZWN0b3JUZXh0LmluY2x1ZGVzKCc6aG92ZXInKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzID0gcnVsZS5zdHlsZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldmVhbHMgPSAocy5kaXNwbGF5ICYmIHMuZGlzcGxheSAhPT0gJ25vbmUnKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIHMudmlzaWJpbGl0eSA9PT0gJ3Zpc2libGUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgKHMub3BhY2l0eSAmJiBzLm9wYWNpdHkgIT09ICcwJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXJldmVhbHMpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHsgaWYgKGVsLm1hdGNoZXMocnVsZS5zZWxlY3RvclRleHQpKSByZXR1cm4gdHJ1ZTsgfSBjYXRjaCB7IC8qIGludmFsaWQgc2VsZWN0b3IgKi8gfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCB7IC8qIGNyb3NzLW9yaWdpbiBzdHlsZXNoZWV0ICovIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIExvY2F0b3Igc3RyaW5nIGNvbnZlcnNpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG4vKipcclxuICogUGFyc2UgYSBKUyBsb2NhdG9yIHN0cmluZyBpbnRvIFBXIGtleXdvcmQgYXJncy5cclxuICogZS5nLiBgZ2V0QnlSb2xlKCd0YWInLCB7IG5hbWU6ICducG0nLCBleGFjdDogdHJ1ZSB9KS5udGgoMSlgIFx1MjE5MiBgdGFiIFwibnBtXCIgLS1udGggMWBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2NhdG9yVG9Qd0FyZ3MobG9jYXRvcjogc3RyaW5nLCByb2xlPzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBxID0gKHM6IHN0cmluZykgPT4gYFwiJHtzfVwiYDtcclxuXHJcbiAgICAvLyBFeHRyYWN0IG50aCBtb2RpZmllclxyXG4gICAgbGV0IG50aCA9ICcnO1xyXG4gICAgaWYgKC9cXC5maXJzdFxcKFxcKS8udGVzdChsb2NhdG9yKSkgbnRoID0gJyAtLW50aCAwJztcclxuICAgIGVsc2UgaWYgKC9cXC5sYXN0XFwoXFwpLy50ZXN0KGxvY2F0b3IpKSBudGggPSAnIC0tbnRoIC0xJztcclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IG50aE1hdGNoID0gbG9jYXRvci5tYXRjaCgvXFwubnRoXFwoKFxcZCspXFwpLyk7XHJcbiAgICAgICAgaWYgKG50aE1hdGNoKSBudGggPSBgIC0tbnRoICR7bnRoTWF0Y2hbMV19YDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXRCeVJvbGUgd2l0aCBuYW1lIFx1MjAxNCBhbHJlYWR5IGhhcyByb2xlXHJcbiAgICBjb25zdCByb2xlTmFtZU1hdGNoID0gbG9jYXRvci5tYXRjaCgvZ2V0QnlSb2xlXFwoWydcIl0oLis/KVsnXCJdLFxccypcXHtbXn1dKm5hbWU6XFxzKlsnXCJdKC4rPylbJ1wiXS8pO1xyXG4gICAgaWYgKHJvbGVOYW1lTWF0Y2gpIHJldHVybiBgJHtyb2xlTmFtZU1hdGNoWzFdfSAke3Eocm9sZU5hbWVNYXRjaFsyXSl9JHtudGh9YDtcclxuXHJcbiAgICAvLyBnZXRCeVJvbGUgd2l0aG91dCBuYW1lIFx1MjAxNCBhbHJlYWR5IGhhcyByb2xlXHJcbiAgICBjb25zdCByb2xlTWF0Y2ggPSBsb2NhdG9yLm1hdGNoKC9nZXRCeVJvbGVcXChbJ1wiXSguKz8pWydcIl1cXCkvKTtcclxuICAgIGlmIChyb2xlTWF0Y2gpIHJldHVybiBgJHtyb2xlTWF0Y2hbMV19JHtudGh9YDtcclxuXHJcbiAgICAvLyBnZXRCeVRlc3RJZCBcdTIwMTQgdGVzdCBJRCBpcyBub3QgYW4gYWNjZXNzaWJsZSBuYW1lLCBkb24ndCBhZGQgcm9sZVxyXG4gICAgY29uc3QgdGVzdElkTWF0Y2ggPSBsb2NhdG9yLm1hdGNoKC9nZXRCeVRlc3RJZFxcKFsnXCJdKC4rPylbJ1wiXVxcKS8pO1xyXG4gICAgaWYgKHRlc3RJZE1hdGNoKSByZXR1cm4gYCR7cSh0ZXN0SWRNYXRjaFsxXSl9JHtudGh9YDtcclxuXHJcbiAgICAvLyBnZXRCeUxhYmVsIC8gZ2V0QnlUZXh0IC8gZ2V0QnlQbGFjZWhvbGRlciAvIGdldEJ5VGl0bGUgLyBnZXRCeUFsdFRleHQgXHUyMDE0IHByZXBlbmQgcm9sZSBpZiBhdmFpbGFibGVcclxuICAgIGNvbnN0IGdldEJ5TWF0Y2ggPSBsb2NhdG9yLm1hdGNoKC9nZXRCeVxcdytcXChbJ1wiXSguKz8pWydcIl1cXCkvKTtcclxuICAgIGlmIChnZXRCeU1hdGNoKSB7XHJcbiAgICAgICAgY29uc3QgcHJlZml4ID0gcm9sZSA/IGAke3JvbGV9IGAgOiAnJztcclxuICAgICAgICByZXR1cm4gYCR7cHJlZml4fSR7cShnZXRCeU1hdGNoWzFdKX0ke250aH1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGxvY2F0b3IoJ2NzcycpIGZhbGxiYWNrXHJcbiAgICBjb25zdCBsb2NhdG9yTWF0Y2ggPSBsb2NhdG9yLm1hdGNoKC9sb2NhdG9yXFwoWydcIl0oLis/KVsnXCJdXFwpLyk7XHJcbiAgICBpZiAobG9jYXRvck1hdGNoKSByZXR1cm4gYCR7cShsb2NhdG9yTWF0Y2hbMV0pfSR7bnRofWA7XHJcblxyXG4gICAgcmV0dXJuIHEobG9jYXRvcik7XHJcbn1cclxuXHJcbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBMb2NhdG9yIGdlbmVyYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlU3RyaW5nKHM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXMuaW5jbHVkZXMoXCInXCIpKSByZXR1cm4gYCcke3N9J2A7XHJcbiAgICBpZiAoIXMuaW5jbHVkZXMoJ1wiJykpIHJldHVybiBgXCIke3N9XCJgO1xyXG4gICAgcmV0dXJuIGAnJHtzLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKX0nYDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTG9jYXRvcihlbDogRWxlbWVudCk6IHN0cmluZyB7XHJcbiAgICAvLyAxLiBUZXN0IElEXHJcbiAgICBjb25zdCB0ZXN0SWQgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGVzdGlkJykgfHwgZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXRlc3QtaWQnKTtcclxuICAgIGlmICh0ZXN0SWQpIHJldHVybiBgZ2V0QnlUZXN0SWQoJHtlc2NhcGVTdHJpbmcodGVzdElkKX0pYDtcclxuXHJcbiAgICAvLyAyLiBSb2xlICsgYWNjZXNzaWJsZSBuYW1lXHJcbiAgICBjb25zdCByb2xlID0gZ2V0SW1wbGljaXRSb2xlKGVsKTtcclxuICAgIGNvbnN0IG5hbWUgPSBnZXRBY2Nlc3NpYmxlTmFtZShlbCk7XHJcbiAgICBpZiAocm9sZSAmJiBuYW1lKSB7XHJcbiAgICAgICAgLy8gRGlzYW1iaWd1YXRlIHdoZW4gbXVsdGlwbGUgZWxlbWVudHMgc2hhcmUgc2FtZSByb2xlICsgbmFtZVxyXG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBmaW5kQnlSb2xlQW5kTmFtZShyb2xlLCBuYW1lKTtcclxuICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIC8vIFRyeSBhbmNlc3RvciBjb250ZXh0IGZpcnN0IChyZWFkYWJsZSBjaGFpbmVkIGxvY2F0b3JzKVxyXG4gICAgICAgICAgICBjb25zdCBhbmNlc3RvckxvY2F0b3IgPSB0cnlBbmNlc3RvckNvbnRleHQoZWwsIHJvbGUsIG5hbWUsIG1hdGNoZXMpO1xyXG4gICAgICAgICAgICBpZiAoYW5jZXN0b3JMb2NhdG9yKSByZXR1cm4gYW5jZXN0b3JMb2NhdG9yO1xyXG4gICAgICAgICAgICAvLyBGYWxsYmFjayB0byBudGgtYmFzZWQgZGlzYW1iaWd1YXRpb25cclxuICAgICAgICAgICAgY29uc3QgYmFzZSA9IGBnZXRCeVJvbGUoJHtlc2NhcGVTdHJpbmcocm9sZSl9LCB7IG5hbWU6ICR7ZXNjYXBlU3RyaW5nKG5hbWUpfSwgZXhhY3Q6IHRydWUgfSlgO1xyXG4gICAgICAgICAgICBjb25zdCBpZHggPSBtYXRjaGVzLmluZGV4T2YoZWwpO1xyXG4gICAgICAgICAgICByZXR1cm4gaWR4ID09PSAwID8gYmFzZSArICcuZmlyc3QoKScgOiBiYXNlICsgYC5udGgoJHtpZHh9KWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBgZ2V0QnlSb2xlKCR7ZXNjYXBlU3RyaW5nKHJvbGUpfSwgeyBuYW1lOiAke2VzY2FwZVN0cmluZyhuYW1lKX0gfSlgO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDMuIExhYmVsIChmb3IgZm9ybSBlbGVtZW50cylcclxuICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHwgZWwgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8IGVsIGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCBsYWJlbCA9IGdldExhYmVsKGVsKTtcclxuICAgICAgICBpZiAobGFiZWwpIHJldHVybiBgZ2V0QnlMYWJlbCgke2VzY2FwZVN0cmluZyhsYWJlbCl9KWA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNC4gUGxhY2Vob2xkZXJcclxuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gZWwuZ2V0QXR0cmlidXRlKCdwbGFjZWhvbGRlcicpO1xyXG4gICAgaWYgKHBsYWNlaG9sZGVyKSByZXR1cm4gYGdldEJ5UGxhY2Vob2xkZXIoJHtlc2NhcGVTdHJpbmcocGxhY2Vob2xkZXIpfSlgO1xyXG5cclxuICAgIC8vIDUuIEFsdCB0ZXh0XHJcbiAgICBjb25zdCBhbHQgPSBlbC5nZXRBdHRyaWJ1dGUoJ2FsdCcpO1xyXG4gICAgaWYgKGFsdCAmJiBbJ0lNRycsICdBUFBMRVQnLCAnQVJFQScsICdJTlBVVCddLmluY2x1ZGVzKGVsLnRhZ05hbWUpKVxyXG4gICAgICAgIHJldHVybiBgZ2V0QnlBbHRUZXh0KCR7ZXNjYXBlU3RyaW5nKGFsdCl9KWA7XHJcblxyXG4gICAgLy8gNi4gVGl0bGVcclxuICAgIGNvbnN0IHRpdGxlID0gZWwuZ2V0QXR0cmlidXRlKCd0aXRsZScpO1xyXG4gICAgaWYgKHRpdGxlKSByZXR1cm4gYGdldEJ5VGl0bGUoJHtlc2NhcGVTdHJpbmcodGl0bGUpfSlgO1xyXG5cclxuICAgIC8vIDcuIFRleHQgY29udGVudFxyXG4gICAgY29uc3QgdGV4dCA9IChlbC50ZXh0Q29udGVudCB8fCAnJykudHJpbSgpO1xyXG4gICAgaWYgKHRleHQgJiYgdGV4dC5sZW5ndGggPD0gODApIHJldHVybiBgZ2V0QnlUZXh0KCR7ZXNjYXBlU3RyaW5nKHRleHQpfSlgO1xyXG5cclxuICAgIC8vIDguIFJvbGUgd2l0aG91dCBuYW1lXHJcbiAgICBpZiAocm9sZSkgcmV0dXJuIGBnZXRCeVJvbGUoJHtlc2NhcGVTdHJpbmcocm9sZSl9KWA7XHJcblxyXG4gICAgLy8gOS4gQ1NTIGZhbGxiYWNrXHJcbiAgICByZXR1cm4gYGxvY2F0b3IoJHtlc2NhcGVTdHJpbmcoYnVpbGRDc3NTZWxlY3RvcihlbCkpfSlgO1xyXG59XHJcblxyXG4vKiogU2hvcnRoYW5kIG1hcHBpbmcgZm9yIFBXIC0taW4gZmxhZyAobGlzdGl0ZW0gXHUyMTkyIGxpc3QgZm9yIHJlYWRhYmlsaXR5KS4gKi9cclxuY29uc3QgUk9MRV9TSE9SVEhBTkRTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBsaXN0aXRlbTogJ2xpc3QnIH07XHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgc2VwYXJhdGUgSlMgYW5kIFBXIGxvY2F0b3JzLlxyXG4gKiBKUyB1c2VzIGFuY2VzdG9yIGNvbnRleHQgKC5maWx0ZXIgY2hhaW5zKTsgUFcgdXNlcyAtLWluIGZsYWcuXHJcbiAqIEZhbGxzIGJhY2sgdG8gLm50aCgpIHdoZW4gYW5jZXN0b3IgY29udGV4dCBpc24ndCBhdmFpbGFibGUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVMb2NhdG9yUGFpcihlbDogRWxlbWVudCk6IHsganM6IHN0cmluZzsgcHc6IHN0cmluZzsgYW5jZXN0b3I/OiB7IHJvbGU6IHN0cmluZzsgdGV4dDogc3RyaW5nIH0gfSB7XHJcbiAgICBjb25zdCBqc0xvY2F0b3IgPSBnZW5lcmF0ZUxvY2F0b3IoZWwpO1xyXG4gICAgaWYgKCFqc0xvY2F0b3IuaW5jbHVkZXMoJy5maWx0ZXIoJykpIHJldHVybiB7IGpzOiBqc0xvY2F0b3IsIHB3OiBqc0xvY2F0b3IgfTtcclxuXHJcbiAgICAvLyBKUyB1c2VkIGFuY2VzdG9yIGNvbnRleHQgXHUyMDE0IGV4dHJhY3QgYW5jZXN0b3IgaW5mbyBmb3IgUFcgLS1pbiBmbGFnXHJcbiAgICBjb25zdCByb2xlID0gZ2V0SW1wbGljaXRSb2xlKGVsKSE7XHJcbiAgICBjb25zdCBuYW1lID0gZ2V0QWNjZXNzaWJsZU5hbWUoZWwpO1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gZmluZENvbnRhaW5lckFuY2VzdG9yKGVsKTtcclxuICAgIGNvbnN0IGNvbnRleHRUZXh0ID0gY29udGFpbmVyID8gZ2V0Q29udGV4dFRleHQoY29udGFpbmVyLmFuY2VzdG9yLCBlbCkgOiAnJztcclxuXHJcbiAgICBpZiAoY29udGFpbmVyICYmIGNvbnRleHRUZXh0KSB7XHJcbiAgICAgICAgY29uc3QgcHdMb2NhdG9yID0gYGdldEJ5Um9sZSgke2VzY2FwZVN0cmluZyhyb2xlKX0sIHsgbmFtZTogJHtlc2NhcGVTdHJpbmcobmFtZSl9IH0pYDtcclxuICAgICAgICBjb25zdCBzaG9ydFJvbGUgPSBST0xFX1NIT1JUSEFORFNbY29udGFpbmVyLnJvbGVdID8/IGNvbnRhaW5lci5yb2xlO1xyXG4gICAgICAgIHJldHVybiB7IGpzOiBqc0xvY2F0b3IsIHB3OiBwd0xvY2F0b3IsIGFuY2VzdG9yOiB7IHJvbGU6IHNob3J0Um9sZSwgdGV4dDogY29udGV4dFRleHQgfSB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE5vIGFuY2VzdG9yIGNvbnRleHQgXHUyMDE0IGZhbGwgYmFjayB0byAubnRoKClcclxuICAgIGNvbnN0IG1hdGNoZXMgPSBmaW5kQnlSb2xlQW5kTmFtZShyb2xlLCBuYW1lKTtcclxuICAgIGNvbnN0IGJhc2UgPSBgZ2V0QnlSb2xlKCR7ZXNjYXBlU3RyaW5nKHJvbGUpfSwgeyBuYW1lOiAke2VzY2FwZVN0cmluZyhuYW1lKX0sIGV4YWN0OiB0cnVlIH0pYDtcclxuICAgIGNvbnN0IGlkeCA9IG1hdGNoZXMuaW5kZXhPZihlbCk7XHJcbiAgICBjb25zdCBwd0xvY2F0b3IgPSBpZHggPT09IDAgPyBiYXNlICsgJy5maXJzdCgpJyA6IGJhc2UgKyBgLm50aCgke2lkeH0pYDtcclxuICAgIHJldHVybiB7IGpzOiBqc0xvY2F0b3IsIHB3OiBwd0xvY2F0b3IgfTtcclxufVxyXG5cclxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEVsZW1lbnQgY2xhc3NpZmljYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG4vKiogQ2hlY2sgaWYgZWxlbWVudCBpcyBhIHRleHQtZW50cnkgZmllbGQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVGV4dEZpZWxkKGVsOiBFbGVtZW50KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoZWwgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSByZXR1cm4gdHJ1ZTtcclxuICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpIHtcclxuICAgICAgICBjb25zdCB0eXBlID0gZWwudHlwZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIHJldHVybiAhWydjaGVja2JveCcsICdyYWRpbycsICdzdWJtaXQnLCAncmVzZXQnLCAnYnV0dG9uJywgJ2hpZGRlbicsICdmaWxlJywgJ2ltYWdlJywgJ3JhbmdlJywgJ2NvbG9yJ10uaW5jbHVkZXModHlwZSk7XHJcbiAgICB9XHJcbiAgICAvLyBjb250ZW50ZWRpdGFibGVcclxuICAgIGlmIChlbC5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScpID09PSAndHJ1ZScpIHJldHVybiB0cnVlO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG4vKiogQ2hlY2sgaWYgZWxlbWVudCBpcyBhIGNoZWNrYm94IG9yIHJhZGlvICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0NoZWNrYWJsZShlbDogRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGVsIGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiAoZWwudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbC50eXBlID09PSAncmFkaW8nKTtcclxufVxyXG5cclxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENvbW1hbmQgYnVpbGRpbmcgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG4vKiogQnVpbGQgYm90aCBQVyBhbmQgSlMgY29tbWFuZCBzdHJpbmdzIGZvciBhIHJlY29yZGVyIGFjdGlvbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21tYW5kcyhhY3Rpb246IHN0cmluZywgZWw6IEVsZW1lbnQsIG9wdHM/OiB7XHJcbiAgICB2YWx1ZT86IHN0cmluZztcclxuICAgIGtleT86IHN0cmluZztcclxuICAgIGNoZWNrZWQ/OiBib29sZWFuO1xyXG4gICAgb3B0aW9uPzogc3RyaW5nO1xyXG59KTogeyBwdzogc3RyaW5nOyBqczogc3RyaW5nIH0gfCBudWxsIHtcclxuICAgIGNvbnN0IHsganM6IGpzTG9jYXRvciwgcHc6IHB3TG9jYXRvciwgYW5jZXN0b3IgfSA9IGdlbmVyYXRlTG9jYXRvclBhaXIoZWwpO1xyXG4gICAgY29uc3QganNMb2MgPSBgcGFnZS4ke2pzTG9jYXRvcn1gO1xyXG4gICAgY29uc3Qgcm9sZSA9IGdldEltcGxpY2l0Um9sZShlbCk7XHJcbiAgICBjb25zdCBwd0FyZ3MgPSBsb2NhdG9yVG9Qd0FyZ3MocHdMb2NhdG9yLCByb2xlKTtcclxuICAgIGNvbnN0IHEgPSAoczogc3RyaW5nKSA9PiBgXCIke3N9XCJgO1xyXG4gICAgY29uc3QgaW5GbGFnID0gYW5jZXN0b3IgPyBgIC0taW4gJHthbmNlc3Rvci5yb2xlfSAke3EoYW5jZXN0b3IudGV4dCl9YCA6ICcnO1xyXG5cclxuICAgIHN3aXRjaCAoYWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSAnaG92ZXInOlxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgcHc6IGBob3ZlciAke3B3QXJnc30ke2luRmxhZ31gLFxyXG4gICAgICAgICAgICAgICAganM6IGBhd2FpdCAke2pzTG9jfS5ob3ZlcigpO2AsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIGNhc2UgJ2NsaWNrJzpcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHB3OiBgY2xpY2sgJHtwd0FyZ3N9JHtpbkZsYWd9YCxcclxuICAgICAgICAgICAgICAgIGpzOiBgYXdhaXQgJHtqc0xvY30uY2xpY2soKTtgLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICBjYXNlICdmaWxsJzoge1xyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSBvcHRzPy52YWx1ZSA/PyAnJztcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHB3OiBgZmlsbCAke3B3QXJnc30gJHtxKHZhbCl9JHtpbkZsYWd9YCxcclxuICAgICAgICAgICAgICAgIGpzOiBgYXdhaXQgJHtqc0xvY30uZmlsbCgke2VzY2FwZVN0cmluZyh2YWwpfSk7YCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhc2UgJ2NoZWNrJzpcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHB3OiBgY2hlY2sgJHtwd0FyZ3N9JHtpbkZsYWd9YCxcclxuICAgICAgICAgICAgICAgIGpzOiBgYXdhaXQgJHtqc0xvY30uY2hlY2soKTtgLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICBjYXNlICd1bmNoZWNrJzpcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHB3OiBgdW5jaGVjayAke3B3QXJnc30ke2luRmxhZ31gLFxyXG4gICAgICAgICAgICAgICAganM6IGBhd2FpdCAke2pzTG9jfS51bmNoZWNrKCk7YCxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY2FzZSAnc2VsZWN0Jzoge1xyXG4gICAgICAgICAgICBjb25zdCBvcHRWYWwgPSBvcHRzPy5vcHRpb24gPz8gJyc7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBwdzogYHNlbGVjdCAke3B3QXJnc30gJHtxKG9wdFZhbCl9JHtpbkZsYWd9YCxcclxuICAgICAgICAgICAgICAgIGpzOiBgYXdhaXQgJHtqc0xvY30uc2VsZWN0T3B0aW9uKCR7ZXNjYXBlU3RyaW5nKG9wdFZhbCl9KTtgLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FzZSAncHJlc3MnOiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IG9wdHM/LmtleSA/PyAnJztcclxuICAgICAgICAgICAgaWYgKHB3QXJncykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBwdzogYHByZXNzICR7cHdBcmdzfSAke2tleX0ke2luRmxhZ31gLFxyXG4gICAgICAgICAgICAgICAgICAgIGpzOiBgYXdhaXQgJHtqc0xvY30ucHJlc3MoJHtlc2NhcGVTdHJpbmcoa2V5KX0pO2AsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIEdsb2JhbCBrZXkgcHJlc3MgKG5vIGxvY2F0b3IgY29udGV4dClcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHB3OiBgcHJlc3MgJHtrZXl9YCxcclxuICAgICAgICAgICAgICAgIGpzOiBgYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygke2VzY2FwZVN0cmluZyhrZXkpfSk7YCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ1NTIHNlbGVjdG9yIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ3NzU2VsZWN0b3IoZWw6IEVsZW1lbnQpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgaWYgKGVsLmlkKSByZXR1cm4gYCR7dGFnfSMke0NTUy5lc2NhcGUoZWwuaWQpfWA7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gWy4uLmVsLmNsYXNzTGlzdF0uc2xpY2UoMCwgMikubWFwKGMgPT4gJy4nICsgQ1NTLmVzY2FwZShjKSkuam9pbignJyk7XHJcbiAgICBpZiAoY2xhc3NlcykgcmV0dXJuIGAke3RhZ30ke2NsYXNzZXN9YDtcclxuICAgIHJldHVybiB0YWc7XHJcbn1cclxuIiwgIi8qKlxyXG4gKiBSZWNvcmRlciBjb250ZW50IHNjcmlwdC5cclxuICogSW5qZWN0ZWQgaW50byB0aGUgYWN0aXZlIHRhYiB2aWEgY2hyb21lLnNjcmlwdGluZy5leGVjdXRlU2NyaXB0LlxyXG4gKiBDYXB0dXJlcyBET00gZXZlbnRzLCBnZW5lcmF0ZXMgbG9jYXRvciArIFBXL0pTIGNvbW1hbmRzLCBzZW5kcyB0byBwYW5lbC5cclxuICpcclxuICogVHJhbnNwYXJlbnQ6IG5ldmVyIGNhbGxzIHByZXZlbnREZWZhdWx0L3N0b3BQcm9wYWdhdGlvbiBcdTIwMTQgdXNlciBhY3Rpb25zIGZsb3cgbm9ybWFsbHkuXHJcbiAqL1xyXG5pbXBvcnQgeyBlc2NhcGVTdHJpbmcsIGlzVGV4dEZpZWxkLCBpc0NoZWNrYWJsZSwgYnVpbGRDb21tYW5kcywgZmluZEhvdmVyQW5jZXN0b3IsIGlzSG92ZXJSZXZlYWxlZCB9IGZyb20gJy4vbG9jYXRvcic7XHJcblxyXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgU3BlY2lhbCBrZXkgZGV0ZWN0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxyXG5cclxuZXhwb3J0IGNvbnN0IFNQRUNJQUxfS0VZUyA9IG5ldyBTZXQoW1xyXG4gICAgJ0VudGVyJywgJ1RhYicsICdFc2NhcGUnLCAnQmFja3NwYWNlJywgJ0RlbGV0ZScsXHJcbiAgICAnQXJyb3dVcCcsICdBcnJvd0Rvd24nLCAnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnLFxyXG4gICAgJ0hvbWUnLCAnRW5kJywgJ1BhZ2VVcCcsICdQYWdlRG93bicsXHJcbiAgICAnRjEnLCAnRjInLCAnRjMnLCAnRjQnLCAnRjUnLCAnRjYnLCAnRjcnLCAnRjgnLCAnRjknLCAnRjEwJywgJ0YxMScsICdGMTInLFxyXG5dKTtcclxuXHJcbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBGaWxsIGJ1ZmZlcmluZyBzdGF0ZSBtYWNoaW5lIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxyXG5cclxuZXhwb3J0IGxldCBwZW5kaW5nRmlsbDogeyBlbDogRWxlbWVudDsgdmFsdWU6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZmx1c2hQZW5kaW5nRmlsbCgpIHtcclxuICAgIHBlbmRpbmdGaWxsID0gbnVsbDtcclxufVxyXG5cclxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEV2ZW50IGhhbmRsZXJzIChjYXB0dXJlIHBoYXNlLCB0cmFuc3BhcmVudCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gb25DbGlja0NhcHR1cmUoZTogTW91c2VFdmVudCkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgRWxlbWVudDtcclxuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XHJcblxyXG4gICAgLy8gU2tpcCBjbGlja3Mgb24gdGV4dCBmaWVsZHMgKGZvY3VzLWNsaWNrIG5vaXNlIGJlZm9yZSBmaWxsKVxyXG4gICAgaWYgKGlzVGV4dEZpZWxkKHRhcmdldCkpIHJldHVybjtcclxuXHJcbiAgICAvLyBTa2lwIGNsaWNrcyBvbiBjaGVja2FibGUgZWxlbWVudHMgKGhhbmRsZWQgYnkgY2hhbmdlIGV2ZW50KVxyXG4gICAgaWYgKGlzQ2hlY2thYmxlKHRhcmdldCkpIHJldHVybjtcclxuXHJcbiAgICAvLyBGbHVzaCBhbnkgcGVuZGluZyBmaWxsXHJcbiAgICBmbHVzaFBlbmRpbmdGaWxsKCk7XHJcblxyXG4gICAgLy8gRGV0ZWN0IGhvdmVyLXJldmVhbGVkIGVsZW1lbnRzOiBpZiBhIDpob3ZlciBDU1MgcnVsZSByZXZlYWxzIHRoaXMgZWxlbWVudCxcclxuICAgIC8vIGVtaXQgYSBob3ZlciBjb21tYW5kIG9uIHRoZSA6aG92ZXIgYW5jZXN0b3Igc28gcmVwbGF5IHdvcmtzLlxyXG4gICAgaWYgKGlzSG92ZXJSZXZlYWxlZCh0YXJnZXQpKSB7XHJcbiAgICAgICAgY29uc3QgaG92ZXJUYXJnZXQgPSBmaW5kSG92ZXJBbmNlc3Rvcih0YXJnZXQpO1xyXG4gICAgICAgIGlmIChob3ZlclRhcmdldCkge1xyXG4gICAgICAgICAgICBjb25zdCBob3ZlckNtZHMgPSBidWlsZENvbW1hbmRzKCdob3ZlcicsIGhvdmVyVGFyZ2V0KTtcclxuICAgICAgICAgICAgaWYgKGhvdmVyQ21kcykge1xyXG4gICAgICAgICAgICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyB0eXBlOiAncmVjb3JkZWQtYWN0aW9uJywgYWN0aW9uOiBob3ZlckNtZHMgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY21kcyA9IGJ1aWxkQ29tbWFuZHMoJ2NsaWNrJywgdGFyZ2V0KTtcclxuICAgIGlmIChjbWRzKSB7XHJcbiAgICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyB0eXBlOiAncmVjb3JkZWQtYWN0aW9uJywgYWN0aW9uOiBjbWRzIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gb25JbnB1dENhcHR1cmUoZTogRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEVsZW1lbnQ7XHJcbiAgICBpZiAoIXRhcmdldCB8fCAhaXNUZXh0RmllbGQodGFyZ2V0KSkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHZhbHVlID0gKHRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCkudmFsdWUgPz8gJyc7XHJcblxyXG4gICAgaWYgKHBlbmRpbmdGaWxsICYmIHBlbmRpbmdGaWxsLmVsID09PSB0YXJnZXQpIHtcclxuICAgICAgICAvLyBTYW1lIGVsZW1lbnQgXHUyMDE0IHVwZGF0ZVxyXG4gICAgICAgIHBlbmRpbmdGaWxsLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgY29uc3QgY21kcyA9IGJ1aWxkQ29tbWFuZHMoJ2ZpbGwnLCB0YXJnZXQsIHsgdmFsdWUgfSk7XHJcbiAgICAgICAgaWYgKGNtZHMpIHtcclxuICAgICAgICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyB0eXBlOiAncmVjb3JkZWQtZmlsbC11cGRhdGUnLCBhY3Rpb246IGNtZHMgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBEaWZmZXJlbnQgZWxlbWVudCBvciBmaXJzdCBpbnB1dCBcdTIwMTQgZmx1c2ggb2xkLCBzdGFydCBuZXdcclxuICAgICAgICBmbHVzaFBlbmRpbmdGaWxsKCk7XHJcbiAgICAgICAgcGVuZGluZ0ZpbGwgPSB7IGVsOiB0YXJnZXQsIHZhbHVlIH07XHJcbiAgICAgICAgY29uc3QgY21kcyA9IGJ1aWxkQ29tbWFuZHMoJ2ZpbGwnLCB0YXJnZXQsIHsgdmFsdWUgfSk7XHJcbiAgICAgICAgaWYgKGNtZHMpIHtcclxuICAgICAgICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyB0eXBlOiAncmVjb3JkZWQtYWN0aW9uJywgYWN0aW9uOiBjbWRzIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG9uQ2hhbmdlQ2FwdHVyZShlOiBFdmVudCkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgRWxlbWVudDtcclxuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XHJcblxyXG4gICAgLy8gQ2hlY2tib3ggLyByYWRpb1xyXG4gICAgaWYgKGlzQ2hlY2thYmxlKHRhcmdldCkpIHtcclxuICAgICAgICBmbHVzaFBlbmRpbmdGaWxsKCk7XHJcbiAgICAgICAgY29uc3QgY2hlY2tlZCA9ICh0YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCkuY2hlY2tlZDtcclxuICAgICAgICBjb25zdCBjbWRzID0gYnVpbGRDb21tYW5kcyhjaGVja2VkID8gJ2NoZWNrJyA6ICd1bmNoZWNrJywgdGFyZ2V0KTtcclxuICAgICAgICBpZiAoY21kcykge1xyXG4gICAgICAgICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IHR5cGU6ICdyZWNvcmRlZC1hY3Rpb24nLCBhY3Rpb246IGNtZHMgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZWxlY3RcclxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCkge1xyXG4gICAgICAgIGZsdXNoUGVuZGluZ0ZpbGwoKTtcclxuICAgICAgICBjb25zdCBvcHRpb24gPSB0YXJnZXQudmFsdWU7XHJcbiAgICAgICAgY29uc3QgY21kcyA9IGJ1aWxkQ29tbWFuZHMoJ3NlbGVjdCcsIHRhcmdldCwgeyBvcHRpb24gfSk7XHJcbiAgICAgICAgaWYgKGNtZHMpIHtcclxuICAgICAgICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyB0eXBlOiAncmVjb3JkZWQtYWN0aW9uJywgYWN0aW9uOiBjbWRzIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBvbktleURvd25DYXB0dXJlKGU6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICghU1BFQ0lBTF9LRVlTLmhhcyhlLmtleSkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBFbGVtZW50O1xyXG5cclxuICAgIC8vIFRhYiBjaGFuZ2VzIGZvY3VzIGJ1dCBpcyBuYXZpZ2F0aW9uIG5vaXNlIFx1MjAxNCBmbHVzaCBmaWxsLCBkb24ndCBlbWl0XHJcbiAgICBpZiAoZS5rZXkgPT09ICdUYWInKSB7IGZsdXNoUGVuZGluZ0ZpbGwoKTsgcmV0dXJuOyB9XHJcblxyXG4gICAgLy8gSW5zaWRlIGEgdGV4dCBmaWVsZCwgb25seSBFbnRlciBpcyBhIG1lYW5pbmdmdWwgYWN0aW9uIFx1MjAxNFxyXG4gICAgLy8gZXZlcnl0aGluZyBlbHNlIChCYWNrc3BhY2UsIGFycm93cywgZXRjLikgaXMgZWRpdGluZyBub2lzZVxyXG4gICAgaWYgKGUua2V5ICE9PSAnRW50ZXInICYmIHRhcmdldCAmJiBpc1RleHRGaWVsZCh0YXJnZXQpKSByZXR1cm47XHJcblxyXG4gICAgLy8gQW55IHNwZWNpYWwga2V5IGR1cmluZyBmaWxsIFx1MjE5MiBmbHVzaCBmaWxsLCB0aGVuIGZhbGwgdGhyb3VnaCB0byBlbWl0IHByZXNzXHJcbiAgICBmbHVzaFBlbmRpbmdGaWxsKCk7XHJcblxyXG4gICAgY29uc3QgY21kcyA9IHRhcmdldCAmJiB0YXJnZXQgIT09IGRvY3VtZW50LmJvZHkgJiYgdGFyZ2V0ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRcclxuICAgICAgICA/IGJ1aWxkQ29tbWFuZHMoJ3ByZXNzJywgdGFyZ2V0LCB7IGtleTogZS5rZXkgfSlcclxuICAgICAgICA6IHsgcHc6IGBwcmVzcyAke2Uua2V5fWAsIGpzOiBgYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygke2VzY2FwZVN0cmluZyhlLmtleSl9KTtgIH07XHJcbiAgICBpZiAoY21kcykge1xyXG4gICAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgdHlwZTogJ3JlY29yZGVkLWFjdGlvbicsIGFjdGlvbjogY21kcyB9KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIG9uRm9jdXNPdXRDYXB0dXJlKGU6IEZvY3VzRXZlbnQpIHtcclxuICAgIGlmIChwZW5kaW5nRmlsbCAmJiBlLnRhcmdldCA9PT0gcGVuZGluZ0ZpbGwuZWwpIHtcclxuICAgICAgICBmbHVzaFBlbmRpbmdGaWxsKCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBMaWZlY3ljbGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2xlYW51cCgpIHtcclxuICAgIGZsdXNoUGVuZGluZ0ZpbGwoKTtcclxuICAgICh3aW5kb3cgYXMgYW55KS5fX3B3X3JlY29yZGVyX2FjdGl2ZSA9IGZhbHNlO1xyXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrQ2FwdHVyZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdpbnB1dCcsIG9uSW5wdXRDYXB0dXJlLCB0cnVlKTtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG9uQ2hhbmdlQ2FwdHVyZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duQ2FwdHVyZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uRm9jdXNPdXRDYXB0dXJlLCB0cnVlKTtcclxuICAgIGNocm9tZS5ydW50aW1lLm9uTWVzc2FnZS5yZW1vdmVMaXN0ZW5lcihvbk1lc3NhZ2UpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBvbk1lc3NhZ2UobXNnOiBhbnkpIHtcclxuICAgIGlmIChtc2cudHlwZSA9PT0gJ3JlY29yZC1zdG9wJykgY2xlYW51cCgpO1xyXG59XHJcblxyXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgSW5pdCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0KCkge1xyXG4gICAgLy8gR3VhcmQgYWdhaW5zdCBkb3VibGUtaW5qZWN0aW9uXHJcbiAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fcHdfcmVjb3JkZXJfYWN0aXZlKSByZXR1cm47XHJcbiAgICAod2luZG93IGFzIGFueSkuX19wd19yZWNvcmRlcl9hY3RpdmUgPSB0cnVlO1xyXG5cclxuICAgIGNocm9tZS5ydW50aW1lLm9uTWVzc2FnZS5hZGRMaXN0ZW5lcihvbk1lc3NhZ2UpO1xyXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrQ2FwdHVyZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIG9uSW5wdXRDYXB0dXJlLCB0cnVlKTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG9uQ2hhbmdlQ2FwdHVyZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgb25LZXlEb3duQ2FwdHVyZSwgdHJ1ZSk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG9uRm9jdXNPdXRDYXB0dXJlLCB0cnVlKTtcclxufVxyXG5cclxuaW5pdCgpO1xyXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7QUFRTyxNQUFNLGlCQUE0RTtBQUFBLElBQ3JGLEdBQUcsQ0FBQyxPQUFPLEdBQUcsYUFBYSxNQUFNLElBQUksU0FBUztBQUFBLElBQzlDLFFBQVE7QUFBQSxJQUNSLElBQUk7QUFBQSxJQUFXLElBQUk7QUFBQSxJQUFXLElBQUk7QUFBQSxJQUFXLElBQUk7QUFBQSxJQUFXLElBQUk7QUFBQSxJQUFXLElBQUk7QUFBQSxJQUMvRSxPQUFPLENBQUMsT0FBTztBQUNYLFlBQU0sT0FBUSxHQUF3QixLQUFLLFlBQVk7QUFDdkQsVUFBSSxTQUFTLFdBQVksUUFBTztBQUNoQyxVQUFJLFNBQVMsUUFBUyxRQUFPO0FBQzdCLFVBQUksU0FBUyxZQUFZLFNBQVMsV0FBVyxTQUFTLFNBQVUsUUFBTztBQUN2RSxVQUFJLFNBQVMsU0FBVSxRQUFPO0FBQzlCLGFBQU87QUFBQSxJQUNYO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVixRQUFRO0FBQUEsSUFDUixLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxNQUFNO0FBQUEsSUFDTixRQUFRO0FBQUEsSUFDUixRQUFRO0FBQUEsSUFDUixJQUFJO0FBQUEsSUFBUSxJQUFJO0FBQUEsSUFDaEIsSUFBSTtBQUFBLElBQ0osT0FBTztBQUFBLElBQ1AsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sUUFBUTtBQUFBLElBQ1IsU0FBUztBQUFBLEVBQ2I7QUFFTyxXQUFTLGdCQUFnQixJQUE0QjtBQUN4RCxVQUFNLFdBQVcsR0FBRyxhQUFhLE1BQU07QUFDdkMsUUFBSSxZQUFZLGFBQWEsVUFBVSxhQUFhLGVBQWdCLFFBQU87QUFDM0UsVUFBTSxRQUFRLGVBQWUsR0FBRyxPQUFPO0FBQ3ZDLFFBQUksQ0FBQyxN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RUFBRSxRQUFRLE9BQU87QUFBRSx1QkFBaUI7QUFBRztBQUFBLElBQVE7QUFJbkQsUUFBSSxFQUFFLFFBQVEsV0FBVyxVQUFVLFlBQVksTUFBTSxFQUFHO0FBR3hELHFCQUFpQjtBQUVqQixVQUFNLE9BQU8sVUFBVSxXQUFXLFNBQVMsUUFBUSxXQUFXLFNBQVMsa0JBQ2pFLGNBQWMsU0FBUyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUM3QyxFQUFFLElBQUksU0FBUyxFQUFFLEdBQUcsSUFBSSxJQUFJLDZCQUE2QixhQUFhLEVBQUUsR0FBRyxDQUFDLEtBQUs7QUFDdkYsUUFBSSxNQUFNO0FBQ04sYUFBTyxRQUFRLFlBQVksRUFBRSxNQUFNLG1CQUFtQixRQUFRLEtBQUssQ0FBQztBQUFBLElBQ3hFO0FBQUEsRUFDSjtBQUVPLFdBQVMsa0JBQWtCLEdBQWU7QUFDN0MsUUFBSSxlQUFlLEVBQUUsV0FBVyxZQUFZLElBQUk7QUFDNUMsdUJBQWlCO0FBQUEsSUFDckI7QUFBQSxFQUNKO0FBSU8sV0FBUyxVQUFVO0FBQ3RCLHFCQUFpQjtBQUNqQixJQUFDLE9BQWUsdUJBQXVCO0FBQ3ZDLGFBQVMsb0JBQW9CLFNBQVMsZ0JBQWdCLElBQUk7QUFDMUQsYUFBUyxvQkFBb0IsU0FBUyxnQkFBZ0IsSUFBSTtBQUMxRCxhQUFTLG9CQUFvQixVQUFVLGlCQUFpQixJQUFJO0FBQzVELGFBQVMsb0JBQW9CLFdBQVcsa0JBQWtCLElBQUk7QUFDOUQsYUFBUyxvQkFBb0IsWUFBWSxtQkFBbUIsSUFBSTtBQUNoRSxXQUFPLFFBQVEsVUFBVSxlQUFlLFNBQVM7QUFBQSxFQUNyRDtBQUVBLFdBQVMsVUFBVSxLQUFVO0FBQ3pCLFFBQUksSUFBSSxTQUFTLGNBQWUsU0FBUTtBQUFBLEVBQzVDO0FBSU8sV0FBUyxPQUFPO0FBRW5CLFFBQUssT0FBZSxxQkFBc0I7QUFDMUMsSUFBQyxPQUFlLHVCQUF1QjtBQUV2QyxXQUFPLFFBQVEsVUFBVSxZQUFZLFNBQVM7QUFDOUMsYUFBUyxpQkFBaUIsU0FBUyxnQkFBZ0IsSUFBSTtBQUN2RCxhQUFTLGlCQUFpQixTQUFTLGdCQUFnQixJQUFJO0FBQ3ZELGFBQVMsaUJBQWlCLFVBQVUsaUJBQWlCLElBQUk7QUFDekQsYUFBUyxpQkFBaUIsV0FBVyxrQkFBa0IsSUFBSTtBQUMzRCxhQUFTLGlCQUFpQixZQUFZLG1CQUFtQixJQUFJO0FBQUEsRUFDakU7QUFFQSxPQUFLOyIsCiAgIm5hbWVzIjogWyJwd0xvY2F0b3IiXQp9Cg==
@@ -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>
@@ -0,0 +1,28 @@
1
+ import "../modulepreload-polyfill.js";
2
+ import { c as clientExports, j as jsxRuntimeExports, r as reactExports } from "../index.js";
3
+ import { aa as panelReducer, ab as initialState, g as attachToTab, ac as onConsoleEvent, a5 as Console } from "../index2.js";
4
+ import "../sw-debugger-core.js";
5
+ function DevToolsConsole() {
6
+ const [state, dispatch] = reactExports.useReducer(panelReducer, initialState);
7
+ reactExports.useEffect(() => {
8
+ if (chrome.devtools?.inspectedWindow) {
9
+ const tabId = chrome.devtools.inspectedWindow.tabId;
10
+ attachToTab(tabId).then((res) => {
11
+ if (res.ok && res.url)
12
+ dispatch({ type: "ATTACH_SUCCESS", url: res.url, tabId });
13
+ }).catch((e) => console.warn("[pw-repl] auto-attach failed:", e));
14
+ }
15
+ }, []);
16
+ reactExports.useEffect(() => {
17
+ onConsoleEvent((level, args) => {
18
+ for (const arg of args) {
19
+ const type = level === "error" ? "error" : level === "warn" ? "info" : "success";
20
+ dispatch({ type: "ADD_LINE", line: { text: "", type, value: arg } });
21
+ }
22
+ });
23
+ return () => onConsoleEvent(null);
24
+ }, [dispatch]);
25
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(Console, { outputLines: state.outputLines, dispatch });
26
+ }
27
+ clientExports.createRoot(document.getElementById("root")).render(/* @__PURE__ */ jsxRuntimeExports.jsx(DevToolsConsole, {}));
28
+ //# sourceMappingURL=console.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console.js","sources":["../../src/devtools/console.tsx"],"sourcesContent":["/**\r\n * DevTools REPL Console — mounts the Console component in a DevTools panel.\r\n */\r\nimport '../panel/panel.css';\r\nimport { createRoot } from 'react-dom/client';\r\nimport { useReducer, useEffect } from 'react';\r\nimport { panelReducer, initialState } from '../panel/reducer';\r\nimport { attachToTab } from '../panel/lib/bridge';\r\nimport { Console } from '../panel/components/Console';\r\nimport { onConsoleEvent } from '../panel/lib/sw-debugger';\r\n\r\nfunction DevToolsConsole() {\r\n const [state, dispatch] = useReducer(panelReducer, initialState);\r\n\r\n // Auto-attach to the inspected tab\r\n useEffect(() => {\r\n if (chrome.devtools?.inspectedWindow) {\r\n const tabId = chrome.devtools.inspectedWindow.tabId;\r\n attachToTab(tabId).then(res => {\r\n if (res.ok && res.url)\r\n dispatch({ type: 'ATTACH_SUCCESS', url: res.url, tabId });\r\n }).catch(e => console.warn('[pw-repl] auto-attach failed:', e));\r\n }\r\n }, []);\r\n\r\n // Forward console.log/error from the page\r\n useEffect(() => {\r\n onConsoleEvent((level, args) => {\r\n for (const arg of args) {\r\n const type = level === 'error' ? 'error' : level === 'warn' ? 'info' : 'success';\r\n dispatch({ type: 'ADD_LINE', line: { text: '', type, value: arg } });\r\n }\r\n });\r\n return () => onConsoleEvent(null);\r\n }, [dispatch]);\r\n\r\n return <Console outputLines={state.outputLines} dispatch={dispatch} />;\r\n}\r\n\r\ncreateRoot(document.getElementById('root')!).render(<DevToolsConsole />);\r\n"],"names":["useReducer","useEffect","jsx","createRoot"],"mappings":";;;;AAWA,SAAS,kBAAkB;AACzB,QAAM,CAAC,OAAO,QAAQ,IAAIA,aAAAA,WAAW,cAAc,YAAY;AAG/DC,eAAAA,UAAU,MAAM;AACd,QAAI,OAAO,UAAU,iBAAiB;AACpC,YAAM,QAAQ,OAAO,SAAS,gBAAgB;AAC9C,kBAAY,KAAK,EAAE,KAAK,CAAA,QAAO;AAC7B,YAAI,IAAI,MAAM,IAAI;AAChB,mBAAS,EAAE,MAAM,kBAAkB,KAAK,IAAI,KAAK,OAAO;AAAA,MAC5D,CAAC,EAAE,MAAM,CAAA,MAAK,QAAQ,KAAK,iCAAiC,CAAC,CAAC;AAAA,IAChE;AAAA,EACF,GAAG,CAAA,CAAE;AAGLA,eAAAA,UAAU,MAAM;AACd,mBAAe,CAAC,OAAO,SAAS;AAC9B,iBAAW,OAAO,MAAM;AACtB,cAAM,OAAO,UAAU,UAAU,UAAU,UAAU,SAAS,SAAS;AACvE,iBAAS,EAAE,MAAM,YAAY,MAAM,EAAE,MAAM,IAAI,MAAM,OAAO,IAAA,EAAI,CAAG;AAAA,MACrE;AAAA,IACF,CAAC;AACD,WAAO,MAAM,eAAe,IAAI;AAAA,EAClC,GAAG,CAAC,QAAQ,CAAC;AAEb,SAAOC,kCAAAA,IAAC,SAAA,EAAQ,aAAa,MAAM,aAAa,UAAoB;AACtE;AAEAC,cAAAA,WAAW,SAAS,eAAe,MAAM,CAAE,EAAE,OAAOD,kCAAAA,IAAC,mBAAgB,CAAE;"}
@@ -0,0 +1,8 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head><meta charset="UTF-8"> <script type="module" crossorigin src="../devtools/devtools.js"></script>
4
+ <link rel="modulepreload" crossorigin href="../modulepreload-polyfill.js">
5
+ </head>
6
+ <body>
7
+ </body>
8
+ </html>