@cartanova/qgrid-cli 0.1.1 → 1.0.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 (91) hide show
  1. package/bundle/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js +9 -0
  2. package/bundle/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorateMetadata.js +6 -0
  3. package/bundle/dist/_virtual/_rolldown/runtime.js +15 -0
  4. package/bundle/dist/application/qgrid/oauth.js +140 -0
  5. package/bundle/dist/application/qgrid/pool.js +100 -0
  6. package/bundle/dist/application/qgrid/qgrid.frame.js +280 -0
  7. package/bundle/dist/application/qgrid/qgrid.types.js +79 -0
  8. package/bundle/dist/application/qgrid/worker.js +183 -0
  9. package/bundle/dist/application/queries.generated.js +31 -0
  10. package/bundle/dist/application/request-log/request-log.model.js +113 -0
  11. package/bundle/dist/application/request-log/request-log.types.js +13 -0
  12. package/bundle/dist/application/sonamu.generated.js +99 -0
  13. package/bundle/dist/application/sonamu.generated.sso.js +34 -0
  14. package/bundle/dist/application/token/token.model.js +157 -0
  15. package/bundle/dist/application/token/token.types.js +22 -0
  16. package/bundle/dist/i18n/en.js +63 -0
  17. package/bundle/dist/i18n/ko.js +62 -0
  18. package/bundle/dist/i18n/sd.generated.js +272 -0
  19. package/bundle/dist/index.js +11 -0
  20. package/bundle/dist/migrations/20260410171405_create__request_logs.js +26 -0
  21. package/bundle/dist/migrations/20260410171406_create__tokens.js +24 -0
  22. package/bundle/dist/migrations/20260411120624_alter_tokens_alter2.js +16 -0
  23. package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +155 -0
  24. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.2/node_modules/@vitest/expect/dist/index.js +1484 -0
  25. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js +887 -0
  26. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/chunk-artifact.js +2746 -0
  27. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/index.js +8 -0
  28. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/utils.js +8 -0
  29. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.2/node_modules/@vitest/snapshot/dist/index.js +662 -0
  30. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.2/node_modules/@vitest/spy/dist/index.js +386 -0
  31. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +82 -0
  32. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/constants.js +48 -0
  33. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/diff.js +1307 -0
  34. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/display.js +558 -0
  35. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/error.js +33 -0
  36. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/helpers.js +226 -0
  37. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/offset.js +27 -0
  38. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/serialize.js +77 -0
  39. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/source-map.js +374 -0
  40. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/timers.js +37 -0
  41. package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +2886 -0
  42. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +10 -0
  43. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +109 -0
  44. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +10 -0
  45. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +10 -0
  46. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +10 -0
  47. package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +1127 -0
  48. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +21 -0
  49. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +432 -0
  50. package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +506 -0
  51. package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +86 -0
  52. package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.9.2_@emnapi_runtime@1.9.2_@types_node@25.0.7_esbuild@0.27.4_jiti@2.6.1_sass@1.98.0_tsx@4.21.0/node_modules/vite/dist/node/module-runner.js +426 -0
  53. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +6 -0
  54. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +41 -0
  55. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +19 -0
  56. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +202 -0
  57. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/index.DOa3dzoN.js +16 -0
  58. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +59 -0
  59. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/test.p_J6dB8a.js +2910 -0
  60. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +44 -0
  61. package/bundle/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/index.js +28 -0
  62. package/bundle/dist/sonamu.config.js +196 -0
  63. package/bundle/dist/testing/fixture.js +8 -0
  64. package/bundle/dist/testing/global.js +9 -0
  65. package/bundle/dist/testing/setup-mocks.js +17 -0
  66. package/bundle/dist/utils/subset-loaders.js +12 -0
  67. package/bundle/src/application/request-log/request-log.entity.json +75 -0
  68. package/bundle/src/application/token/token.entity.json +37 -0
  69. package/bundle/src/migrations/20260410171405_create__request_logs.ts +23 -0
  70. package/bundle/src/migrations/20260410171406_create__tokens.ts +21 -0
  71. package/bundle/src/migrations/20260411120624_alter_tokens_alter2.ts +15 -0
  72. package/bundle/web-dist/client/assets/index-DlPchHBY.js +116 -0
  73. package/bundle/web-dist/client/assets/index-vZsvyuFn.css +1 -0
  74. package/bundle/web-dist/client/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
  75. package/bundle/web-dist/client/assets/routes-CagDz23B.js +1 -0
  76. package/bundle/web-dist/client/assets/sd.generated-BrQoQXvv.js +47 -0
  77. package/bundle/web-dist/client/assets/services.generated-BspO2L0j.js +1 -0
  78. package/bundle/web-dist/client/assets/show-aXUGa0gm.js +29 -0
  79. package/bundle/web-dist/client/assets/tokens-DRkXtZ3Q.js +1 -0
  80. package/bundle/web-dist/client/assets/vendor-react-DH4kUfK2.js +9 -0
  81. package/bundle/web-dist/client/assets/vendor-tanstack-CUxlo6YN.js +1 -0
  82. package/bundle/web-dist/client/index.html +18 -0
  83. package/bundle/web-dist/server/assets/react-dom-CGIzOSuj.js +335 -0
  84. package/bundle/web-dist/server/assets/routes-ClzReRep.js +490 -0
  85. package/bundle/web-dist/server/assets/sd.generated-BnonqqKr.js +21694 -0
  86. package/bundle/web-dist/server/assets/services.generated-D5ABD5fr.js +836 -0
  87. package/bundle/web-dist/server/assets/show-C9pcdSxc.js +23364 -0
  88. package/bundle/web-dist/server/assets/tokens-JH6FsnWZ.js +860 -0
  89. package/bundle/web-dist/server/entry-server.generated.js +44646 -0
  90. package/dist/cli.js +38 -89
  91. package/package.json +39 -12
@@ -0,0 +1,558 @@
1
+ import { createDOMElementFilter, format as format$1, plugins } from "../../../../../@vitest_pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js";
2
+ //#region ../../node_modules/.pnpm/@vitest+utils@4.1.2/node_modules/@vitest/utils/dist/display.js
3
+ const ansiColors = {
4
+ bold: ["1", "22"],
5
+ dim: ["2", "22"],
6
+ italic: ["3", "23"],
7
+ underline: ["4", "24"],
8
+ inverse: ["7", "27"],
9
+ hidden: ["8", "28"],
10
+ strike: ["9", "29"],
11
+ black: ["30", "39"],
12
+ red: ["31", "39"],
13
+ green: ["32", "39"],
14
+ yellow: ["33", "39"],
15
+ blue: ["34", "39"],
16
+ magenta: ["35", "39"],
17
+ cyan: ["36", "39"],
18
+ white: ["37", "39"],
19
+ brightblack: ["30;1", "39"],
20
+ brightred: ["31;1", "39"],
21
+ brightgreen: ["32;1", "39"],
22
+ brightyellow: ["33;1", "39"],
23
+ brightblue: ["34;1", "39"],
24
+ brightmagenta: ["35;1", "39"],
25
+ brightcyan: ["36;1", "39"],
26
+ brightwhite: ["37;1", "39"],
27
+ grey: ["90", "39"]
28
+ };
29
+ const styles = {
30
+ special: "cyan",
31
+ number: "yellow",
32
+ bigint: "yellow",
33
+ boolean: "yellow",
34
+ undefined: "grey",
35
+ null: "bold",
36
+ string: "green",
37
+ symbol: "green",
38
+ date: "magenta",
39
+ regexp: "red"
40
+ };
41
+ const truncator = "…";
42
+ function colorise(value, styleType) {
43
+ const color = ansiColors[styles[styleType]] || ansiColors[styleType] || "";
44
+ if (!color) return String(value);
45
+ return `\u001b[${color[0]}m${String(value)}\u001b[${color[1]}m`;
46
+ }
47
+ function normaliseOptions({ showHidden = false, depth = 2, colors = false, customInspect = true, showProxy = false, maxArrayLength = Infinity, breakLength = Infinity, seen = [], truncate = Infinity, stylize = String } = {}, inspect) {
48
+ const options = {
49
+ showHidden: Boolean(showHidden),
50
+ depth: Number(depth),
51
+ colors: Boolean(colors),
52
+ customInspect: Boolean(customInspect),
53
+ showProxy: Boolean(showProxy),
54
+ maxArrayLength: Number(maxArrayLength),
55
+ breakLength: Number(breakLength),
56
+ truncate: Number(truncate),
57
+ seen,
58
+ inspect,
59
+ stylize
60
+ };
61
+ if (options.colors) options.stylize = colorise;
62
+ return options;
63
+ }
64
+ function isHighSurrogate(char) {
65
+ return char >= "\ud800" && char <= "\udbff";
66
+ }
67
+ function truncate(string, length, tail = truncator) {
68
+ string = String(string);
69
+ const tailLength = tail.length;
70
+ const stringLength = string.length;
71
+ if (tailLength > length && stringLength > tailLength) return tail;
72
+ if (stringLength > length && stringLength > tailLength) {
73
+ let end = length - tailLength;
74
+ if (end > 0 && isHighSurrogate(string[end - 1])) end = end - 1;
75
+ return `${string.slice(0, end)}${tail}`;
76
+ }
77
+ return string;
78
+ }
79
+ function inspectList(list, options, inspectItem, separator = ", ") {
80
+ inspectItem = inspectItem || options.inspect;
81
+ const size = list.length;
82
+ if (size === 0) return "";
83
+ const originalLength = options.truncate;
84
+ let output = "";
85
+ let peek = "";
86
+ let truncated = "";
87
+ for (let i = 0; i < size; i += 1) {
88
+ const last = i + 1 === list.length;
89
+ const secondToLast = i + 2 === list.length;
90
+ truncated = `${truncator}(${list.length - i})`;
91
+ const value = list[i];
92
+ options.truncate = originalLength - output.length - (last ? 0 : separator.length);
93
+ const string = peek || inspectItem(value, options) + (last ? "" : separator);
94
+ const nextLength = output.length + string.length;
95
+ const truncatedLength = nextLength + truncated.length;
96
+ if (last && nextLength > originalLength && output.length + truncated.length <= originalLength) break;
97
+ if (!last && !secondToLast && truncatedLength > originalLength) break;
98
+ peek = last ? "" : inspectItem(list[i + 1], options) + (secondToLast ? "" : separator);
99
+ if (!last && secondToLast && truncatedLength > originalLength && nextLength + peek.length > originalLength) break;
100
+ output += string;
101
+ if (!last && !secondToLast && nextLength + peek.length >= originalLength) {
102
+ truncated = `${truncator}(${list.length - i - 1})`;
103
+ break;
104
+ }
105
+ truncated = "";
106
+ }
107
+ return `${output}${truncated}`;
108
+ }
109
+ function quoteComplexKey(key) {
110
+ if (key.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) return key;
111
+ return JSON.stringify(key).replace(/'/g, "\\'").replace(/\\"/g, "\"").replace(/(^"|"$)/g, "'");
112
+ }
113
+ function inspectProperty([key, value], options) {
114
+ options.truncate -= 2;
115
+ if (typeof key === "string") key = quoteComplexKey(key);
116
+ else if (typeof key !== "number") key = `[${options.inspect(key, options)}]`;
117
+ options.truncate -= key.length;
118
+ value = options.inspect(value, options);
119
+ return `${key}: ${value}`;
120
+ }
121
+ function inspectArray(array, options) {
122
+ const nonIndexProperties = Object.keys(array).slice(array.length);
123
+ if (!array.length && !nonIndexProperties.length) return "[]";
124
+ options.truncate -= 4;
125
+ const listContents = inspectList(array, options);
126
+ options.truncate -= listContents.length;
127
+ let propertyContents = "";
128
+ if (nonIndexProperties.length) propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options, inspectProperty);
129
+ return `[ ${listContents}${propertyContents ? `, ${propertyContents}` : ""} ]`;
130
+ }
131
+ const getArrayName = (array) => {
132
+ if (typeof Buffer === "function" && array instanceof Buffer) return "Buffer";
133
+ if (array[Symbol.toStringTag]) return array[Symbol.toStringTag];
134
+ return array.constructor.name;
135
+ };
136
+ function inspectTypedArray(array, options) {
137
+ const name = getArrayName(array);
138
+ options.truncate -= name.length + 4;
139
+ const nonIndexProperties = Object.keys(array).slice(array.length);
140
+ if (!array.length && !nonIndexProperties.length) return `${name}[]`;
141
+ let output = "";
142
+ for (let i = 0; i < array.length; i++) {
143
+ const string = `${options.stylize(truncate(array[i], options.truncate), "number")}${i === array.length - 1 ? "" : ", "}`;
144
+ options.truncate -= string.length;
145
+ if (array[i] !== array.length && options.truncate <= 3) {
146
+ output += `${truncator}(${array.length - array[i] + 1})`;
147
+ break;
148
+ }
149
+ output += string;
150
+ }
151
+ let propertyContents = "";
152
+ if (nonIndexProperties.length) propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options, inspectProperty);
153
+ return `${name}[ ${output}${propertyContents ? `, ${propertyContents}` : ""} ]`;
154
+ }
155
+ function inspectDate(dateObject, options) {
156
+ const stringRepresentation = dateObject.toJSON();
157
+ if (stringRepresentation === null) return "Invalid Date";
158
+ const split = stringRepresentation.split("T");
159
+ const date = split[0];
160
+ return options.stylize(`${date}T${truncate(split[1], options.truncate - date.length - 1)}`, "date");
161
+ }
162
+ function inspectFunction(func, options) {
163
+ const functionType = func[Symbol.toStringTag] || "Function";
164
+ const name = func.name;
165
+ if (!name) return options.stylize(`[${functionType}]`, "special");
166
+ return options.stylize(`[${functionType} ${truncate(name, options.truncate - 11)}]`, "special");
167
+ }
168
+ function inspectMapEntry([key, value], options) {
169
+ options.truncate -= 4;
170
+ key = options.inspect(key, options);
171
+ options.truncate -= key.length;
172
+ value = options.inspect(value, options);
173
+ return `${key} => ${value}`;
174
+ }
175
+ function mapToEntries(map) {
176
+ const entries = [];
177
+ map.forEach((value, key) => {
178
+ entries.push([key, value]);
179
+ });
180
+ return entries;
181
+ }
182
+ function inspectMap(map, options) {
183
+ if (map.size === 0) return "Map{}";
184
+ options.truncate -= 7;
185
+ return `Map{ ${inspectList(mapToEntries(map), options, inspectMapEntry)} }`;
186
+ }
187
+ const isNaN = Number.isNaN || ((i) => i !== i);
188
+ function inspectNumber(number, options) {
189
+ if (isNaN(number)) return options.stylize("NaN", "number");
190
+ if (number === Infinity) return options.stylize("Infinity", "number");
191
+ if (number === -Infinity) return options.stylize("-Infinity", "number");
192
+ if (number === 0) return options.stylize(1 / number === Infinity ? "+0" : "-0", "number");
193
+ return options.stylize(truncate(String(number), options.truncate), "number");
194
+ }
195
+ function inspectBigInt(number, options) {
196
+ let nums = truncate(number.toString(), options.truncate - 1);
197
+ if (nums !== truncator) nums += "n";
198
+ return options.stylize(nums, "bigint");
199
+ }
200
+ function inspectRegExp(value, options) {
201
+ const flags = value.toString().split("/")[2];
202
+ const sourceLength = options.truncate - (2 + flags.length);
203
+ const source = value.source;
204
+ return options.stylize(`/${truncate(source, sourceLength)}/${flags}`, "regexp");
205
+ }
206
+ function arrayFromSet(set) {
207
+ const values = [];
208
+ set.forEach((value) => {
209
+ values.push(value);
210
+ });
211
+ return values;
212
+ }
213
+ function inspectSet(set, options) {
214
+ if (set.size === 0) return "Set{}";
215
+ options.truncate -= 7;
216
+ return `Set{ ${inspectList(arrayFromSet(set), options)} }`;
217
+ }
218
+ const stringEscapeChars = new RegExp("['\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]", "g");
219
+ const escapeCharacters = {
220
+ "\b": "\\b",
221
+ " ": "\\t",
222
+ "\n": "\\n",
223
+ "\f": "\\f",
224
+ "\r": "\\r",
225
+ "'": "\\'",
226
+ "\\": "\\\\"
227
+ };
228
+ const hex = 16;
229
+ function escape(char) {
230
+ return escapeCharacters[char] || `\\u${`0000${char.charCodeAt(0).toString(hex)}`.slice(-4)}`;
231
+ }
232
+ function inspectString(string, options) {
233
+ if (stringEscapeChars.test(string)) string = string.replace(stringEscapeChars, escape);
234
+ return options.stylize(`'${truncate(string, options.truncate - 2)}'`, "string");
235
+ }
236
+ function inspectSymbol(value) {
237
+ if ("description" in Symbol.prototype) return value.description ? `Symbol(${value.description})` : "Symbol()";
238
+ return value.toString();
239
+ }
240
+ const getPromiseValue = () => "Promise{…}";
241
+ function inspectObject$1(object, options) {
242
+ const properties = Object.getOwnPropertyNames(object);
243
+ const symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : [];
244
+ if (properties.length === 0 && symbols.length === 0) return "{}";
245
+ options.truncate -= 4;
246
+ options.seen = options.seen || [];
247
+ if (options.seen.includes(object)) return "[Circular]";
248
+ options.seen.push(object);
249
+ const propertyContents = inspectList(properties.map((key) => [key, object[key]]), options, inspectProperty);
250
+ const symbolContents = inspectList(symbols.map((key) => [key, object[key]]), options, inspectProperty);
251
+ options.seen.pop();
252
+ let sep = "";
253
+ if (propertyContents && symbolContents) sep = ", ";
254
+ return `{ ${propertyContents}${sep}${symbolContents} }`;
255
+ }
256
+ const toStringTag = typeof Symbol !== "undefined" && Symbol.toStringTag ? Symbol.toStringTag : false;
257
+ function inspectClass(value, options) {
258
+ let name = "";
259
+ if (toStringTag && toStringTag in value) name = value[toStringTag];
260
+ name = name || value.constructor.name;
261
+ if (!name || name === "_class") name = "<Anonymous Class>";
262
+ options.truncate -= name.length;
263
+ return `${name}${inspectObject$1(value, options)}`;
264
+ }
265
+ function inspectArguments(args, options) {
266
+ if (args.length === 0) return "Arguments[]";
267
+ options.truncate -= 13;
268
+ return `Arguments[ ${inspectList(args, options)} ]`;
269
+ }
270
+ const errorKeys = [
271
+ "stack",
272
+ "line",
273
+ "column",
274
+ "name",
275
+ "message",
276
+ "fileName",
277
+ "lineNumber",
278
+ "columnNumber",
279
+ "number",
280
+ "description",
281
+ "cause"
282
+ ];
283
+ function inspectObject(error, options) {
284
+ const properties = Object.getOwnPropertyNames(error).filter((key) => errorKeys.indexOf(key) === -1);
285
+ const name = error.name;
286
+ options.truncate -= name.length;
287
+ let message = "";
288
+ if (typeof error.message === "string") message = truncate(error.message, options.truncate);
289
+ else properties.unshift("message");
290
+ message = message ? `: ${message}` : "";
291
+ options.truncate -= message.length + 5;
292
+ options.seen = options.seen || [];
293
+ if (options.seen.includes(error)) return "[Circular]";
294
+ options.seen.push(error);
295
+ const propertyContents = inspectList(properties.map((key) => [key, error[key]]), options, inspectProperty);
296
+ return `${name}${message}${propertyContents ? ` { ${propertyContents} }` : ""}`;
297
+ }
298
+ function inspectAttribute([key, value], options) {
299
+ options.truncate -= 3;
300
+ if (!value) return `${options.stylize(String(key), "yellow")}`;
301
+ return `${options.stylize(String(key), "yellow")}=${options.stylize(`"${value}"`, "string")}`;
302
+ }
303
+ function inspectNodeCollection(collection, options) {
304
+ return inspectList(collection, options, inspectNode, "\n");
305
+ }
306
+ function inspectNode(node, options) {
307
+ switch (node.nodeType) {
308
+ case 1: return inspectHTML(node, options);
309
+ case 3: return options.inspect(node.data, options);
310
+ default: return options.inspect(node, options);
311
+ }
312
+ }
313
+ function inspectHTML(element, options) {
314
+ const properties = element.getAttributeNames();
315
+ const name = element.tagName.toLowerCase();
316
+ const head = options.stylize(`<${name}`, "special");
317
+ const headClose = options.stylize(`>`, "special");
318
+ const tail = options.stylize(`</${name}>`, "special");
319
+ options.truncate -= name.length * 2 + 5;
320
+ let propertyContents = "";
321
+ if (properties.length > 0) {
322
+ propertyContents += " ";
323
+ propertyContents += inspectList(properties.map((key) => [key, element.getAttribute(key)]), options, inspectAttribute, " ");
324
+ }
325
+ options.truncate -= propertyContents.length;
326
+ const truncate = options.truncate;
327
+ let children = inspectNodeCollection(element.children, options);
328
+ if (children && children.length > truncate) children = `${truncator}(${element.children.length})`;
329
+ return `${head}${propertyContents}${headClose}${children}${tail}`;
330
+ }
331
+ const chaiInspect = typeof Symbol === "function" && typeof Symbol.for === "function" ? Symbol.for("chai/inspect") : "@@chai/inspect";
332
+ const nodeInspect = Symbol.for("nodejs.util.inspect.custom");
333
+ const constructorMap = /* @__PURE__ */ new WeakMap();
334
+ const stringTagMap = {};
335
+ const baseTypesMap = {
336
+ undefined: (value, options) => options.stylize("undefined", "undefined"),
337
+ null: (value, options) => options.stylize("null", "null"),
338
+ boolean: (value, options) => options.stylize(String(value), "boolean"),
339
+ Boolean: (value, options) => options.stylize(String(value), "boolean"),
340
+ number: inspectNumber,
341
+ Number: inspectNumber,
342
+ bigint: inspectBigInt,
343
+ BigInt: inspectBigInt,
344
+ string: inspectString,
345
+ String: inspectString,
346
+ function: inspectFunction,
347
+ Function: inspectFunction,
348
+ symbol: inspectSymbol,
349
+ Symbol: inspectSymbol,
350
+ Array: inspectArray,
351
+ Date: inspectDate,
352
+ Map: inspectMap,
353
+ Set: inspectSet,
354
+ RegExp: inspectRegExp,
355
+ Promise: getPromiseValue,
356
+ WeakSet: (value, options) => options.stylize("WeakSet{…}", "special"),
357
+ WeakMap: (value, options) => options.stylize("WeakMap{…}", "special"),
358
+ Arguments: inspectArguments,
359
+ Int8Array: inspectTypedArray,
360
+ Uint8Array: inspectTypedArray,
361
+ Uint8ClampedArray: inspectTypedArray,
362
+ Int16Array: inspectTypedArray,
363
+ Uint16Array: inspectTypedArray,
364
+ Int32Array: inspectTypedArray,
365
+ Uint32Array: inspectTypedArray,
366
+ Float32Array: inspectTypedArray,
367
+ Float64Array: inspectTypedArray,
368
+ Generator: () => "",
369
+ DataView: () => "",
370
+ ArrayBuffer: () => "",
371
+ Error: inspectObject,
372
+ HTMLCollection: inspectNodeCollection,
373
+ NodeList: inspectNodeCollection
374
+ };
375
+ const inspectCustom = (value, options, type, inspectFn) => {
376
+ if (chaiInspect in value && typeof value[chaiInspect] === "function") return value[chaiInspect](options);
377
+ if (nodeInspect in value && typeof value[nodeInspect] === "function") return value[nodeInspect](options.depth, options, inspectFn);
378
+ if ("inspect" in value && typeof value.inspect === "function") return value.inspect(options.depth, options);
379
+ if ("constructor" in value && constructorMap.has(value.constructor)) return constructorMap.get(value.constructor)(value, options);
380
+ if (stringTagMap[type]) return stringTagMap[type](value, options);
381
+ return "";
382
+ };
383
+ const toString = Object.prototype.toString;
384
+ function inspect$1(value, opts = {}) {
385
+ const options = normaliseOptions(opts, inspect$1);
386
+ const { customInspect } = options;
387
+ let type = value === null ? "null" : typeof value;
388
+ if (type === "object") type = toString.call(value).slice(8, -1);
389
+ if (type in baseTypesMap) return baseTypesMap[type](value, options);
390
+ if (customInspect && value) {
391
+ const output = inspectCustom(value, options, type, inspect$1);
392
+ if (output) {
393
+ if (typeof output === "string") return output;
394
+ return inspect$1(output, options);
395
+ }
396
+ }
397
+ const proto = value ? Object.getPrototypeOf(value) : false;
398
+ if (proto === Object.prototype || proto === null) return inspectObject$1(value, options);
399
+ if (value && typeof HTMLElement === "function" && value instanceof HTMLElement) return inspectHTML(value, options);
400
+ if ("constructor" in value) {
401
+ if (value.constructor !== Object) return inspectClass(value, options);
402
+ return inspectObject$1(value, options);
403
+ }
404
+ if (value === Object(value)) return inspectObject$1(value, options);
405
+ return options.stylize(String(value), type);
406
+ }
407
+ const { AsymmetricMatcher, DOMCollection, DOMElement, Immutable, ReactElement, ReactTestComponent } = plugins;
408
+ const PLUGINS = [
409
+ ReactTestComponent,
410
+ ReactElement,
411
+ DOMElement,
412
+ DOMCollection,
413
+ Immutable,
414
+ AsymmetricMatcher
415
+ ];
416
+ function stringify(object, maxDepth = 10, { maxLength, filterNode, ...options } = {}) {
417
+ const MAX_LENGTH = maxLength ?? 1e4;
418
+ let result;
419
+ const filterFn = typeof filterNode === "string" ? createNodeFilterFromSelector(filterNode) : filterNode;
420
+ const plugins = filterFn ? [
421
+ ReactTestComponent,
422
+ ReactElement,
423
+ createDOMElementFilter(filterFn),
424
+ DOMCollection,
425
+ Immutable,
426
+ AsymmetricMatcher
427
+ ] : PLUGINS;
428
+ try {
429
+ result = format$1(object, {
430
+ maxDepth,
431
+ escapeString: false,
432
+ plugins,
433
+ ...options
434
+ });
435
+ } catch {
436
+ result = format$1(object, {
437
+ callToJSON: false,
438
+ maxDepth,
439
+ escapeString: false,
440
+ plugins,
441
+ ...options
442
+ });
443
+ }
444
+ return result.length >= MAX_LENGTH && maxDepth > 1 ? stringify(object, Math.floor(Math.min(maxDepth, Number.MAX_SAFE_INTEGER) / 2), {
445
+ maxLength,
446
+ filterNode,
447
+ ...options
448
+ }) : result;
449
+ }
450
+ function createNodeFilterFromSelector(selector) {
451
+ const ELEMENT_NODE = 1;
452
+ const COMMENT_NODE = 8;
453
+ return (node) => {
454
+ if (node.nodeType === COMMENT_NODE) return false;
455
+ if (node.nodeType === ELEMENT_NODE && node.matches) try {
456
+ return !node.matches(selector);
457
+ } catch {
458
+ return true;
459
+ }
460
+ return true;
461
+ };
462
+ }
463
+ const formatRegExp = /%[sdjifoOc%]/g;
464
+ function baseFormat(args, options = {}) {
465
+ const formatArg = (item, inspecOptions) => {
466
+ if (options.prettifyObject) return stringify(item, void 0, {
467
+ printBasicPrototype: false,
468
+ escapeString: false
469
+ });
470
+ return inspect(item, inspecOptions);
471
+ };
472
+ if (typeof args[0] !== "string") {
473
+ const objects = [];
474
+ for (let i = 0; i < args.length; i++) objects.push(formatArg(args[i], {
475
+ depth: 0,
476
+ colors: false
477
+ }));
478
+ return objects.join(" ");
479
+ }
480
+ const len = args.length;
481
+ let i = 1;
482
+ const template = args[0];
483
+ let str = String(template).replace(formatRegExp, (x) => {
484
+ if (x === "%%") return "%";
485
+ if (i >= len) return x;
486
+ switch (x) {
487
+ case "%s": {
488
+ const value = args[i++];
489
+ if (typeof value === "bigint") return `${value.toString()}n`;
490
+ if (typeof value === "number" && value === 0 && 1 / value < 0) return "-0";
491
+ if (typeof value === "object" && value !== null) {
492
+ if (typeof value.toString === "function" && value.toString !== Object.prototype.toString) return value.toString();
493
+ return formatArg(value, {
494
+ depth: 0,
495
+ colors: false
496
+ });
497
+ }
498
+ return String(value);
499
+ }
500
+ case "%d": {
501
+ const value = args[i++];
502
+ if (typeof value === "bigint") return `${value.toString()}n`;
503
+ if (typeof value === "symbol") return "NaN";
504
+ return Number(value).toString();
505
+ }
506
+ case "%i": {
507
+ const value = args[i++];
508
+ if (typeof value === "bigint") return `${value.toString()}n`;
509
+ return Number.parseInt(String(value)).toString();
510
+ }
511
+ case "%f": return Number.parseFloat(String(args[i++])).toString();
512
+ case "%o": return formatArg(args[i++], {
513
+ showHidden: true,
514
+ showProxy: true
515
+ });
516
+ case "%O": return formatArg(args[i++]);
517
+ case "%c":
518
+ i++;
519
+ return "";
520
+ case "%j": try {
521
+ return JSON.stringify(args[i++]);
522
+ } catch (err) {
523
+ const m = err.message;
524
+ if (m.includes("circular structure") || m.includes("cyclic structures") || m.includes("cyclic object")) return "[Circular]";
525
+ throw err;
526
+ }
527
+ default: return x;
528
+ }
529
+ });
530
+ for (let x = args[i]; i < len; x = args[++i]) if (x === null || typeof x !== "object") str += ` ${typeof x === "symbol" ? x.toString() : x}`;
531
+ else str += ` ${formatArg(x)}`;
532
+ return str;
533
+ }
534
+ function format(...args) {
535
+ return baseFormat(args);
536
+ }
537
+ function inspect(obj, options = {}) {
538
+ if (options.truncate === 0) options.truncate = Number.POSITIVE_INFINITY;
539
+ return inspect$1(obj, options);
540
+ }
541
+ function objDisplay(obj, options = {}) {
542
+ if (typeof options.truncate === "undefined") options.truncate = 40;
543
+ const str = inspect(obj, options);
544
+ const type = Object.prototype.toString.call(obj);
545
+ if (options.truncate && str.length >= options.truncate) if (type === "[object Function]") {
546
+ const fn = obj;
547
+ return !fn.name ? "[Function]" : `[Function: ${fn.name}]`;
548
+ } else if (type === "[object Array]") return `[ Array(${obj.length}) ]`;
549
+ else if (type === "[object Object]") {
550
+ const keys = Object.keys(obj);
551
+ return `{ Object (${keys.length > 2 ? `${keys.splice(0, 2).join(", ")}, ...` : keys.join(", ")}) }`;
552
+ } else return str;
553
+ return str;
554
+ }
555
+ //#endregion
556
+ export { format, formatRegExp, objDisplay, stringify };
557
+
558
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHZpdGVzdCt1dGlsc0A0LjEuMi9ub2RlX21vZHVsZXMvQHZpdGVzdC91dGlscy9kaXN0L2Rpc3BsYXkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGx1Z2lucywgY3JlYXRlRE9NRWxlbWVudEZpbHRlciwgZm9ybWF0IGFzIGZvcm1hdCQxIH0gZnJvbSAnQHZpdGVzdC9wcmV0dHktZm9ybWF0JztcblxuY29uc3QgYW5zaUNvbG9ycyA9IHtcbiAgICBib2xkOiBbJzEnLCAnMjInXSxcbiAgICBkaW06IFsnMicsICcyMiddLFxuICAgIGl0YWxpYzogWyczJywgJzIzJ10sXG4gICAgdW5kZXJsaW5lOiBbJzQnLCAnMjQnXSxcbiAgICAvLyA1ICYgNiBhcmUgYmxpbmtpbmdcbiAgICBpbnZlcnNlOiBbJzcnLCAnMjcnXSxcbiAgICBoaWRkZW46IFsnOCcsICcyOCddLFxuICAgIHN0cmlrZTogWyc5JywgJzI5J10sXG4gICAgLy8gMTAtMjAgYXJlIGZvbnRzXG4gICAgLy8gMjEtMjkgYXJlIHJlc2V0cyBmb3IgMS05XG4gICAgYmxhY2s6IFsnMzAnLCAnMzknXSxcbiAgICByZWQ6IFsnMzEnLCAnMzknXSxcbiAgICBncmVlbjogWyczMicsICczOSddLFxuICAgIHllbGxvdzogWyczMycsICczOSddLFxuICAgIGJsdWU6IFsnMzQnLCAnMzknXSxcbiAgICBtYWdlbnRhOiBbJzM1JywgJzM5J10sXG4gICAgY3lhbjogWyczNicsICczOSddLFxuICAgIHdoaXRlOiBbJzM3JywgJzM5J10sXG4gICAgYnJpZ2h0YmxhY2s6IFsnMzA7MScsICczOSddLFxuICAgIGJyaWdodHJlZDogWyczMTsxJywgJzM5J10sXG4gICAgYnJpZ2h0Z3JlZW46IFsnMzI7MScsICczOSddLFxuICAgIGJyaWdodHllbGxvdzogWyczMzsxJywgJzM5J10sXG4gICAgYnJpZ2h0Ymx1ZTogWyczNDsxJywgJzM5J10sXG4gICAgYnJpZ2h0bWFnZW50YTogWyczNTsxJywgJzM5J10sXG4gICAgYnJpZ2h0Y3lhbjogWyczNjsxJywgJzM5J10sXG4gICAgYnJpZ2h0d2hpdGU6IFsnMzc7MScsICczOSddLFxuICAgIGdyZXk6IFsnOTAnLCAnMzknXSxcbn07XG5jb25zdCBzdHlsZXMgPSB7XG4gICAgc3BlY2lhbDogJ2N5YW4nLFxuICAgIG51bWJlcjogJ3llbGxvdycsXG4gICAgYmlnaW50OiAneWVsbG93JyxcbiAgICBib29sZWFuOiAneWVsbG93JyxcbiAgICB1bmRlZmluZWQ6ICdncmV5JyxcbiAgICBudWxsOiAnYm9sZCcsXG4gICAgc3RyaW5nOiAnZ3JlZW4nLFxuICAgIHN5bWJvbDogJ2dyZWVuJyxcbiAgICBkYXRlOiAnbWFnZW50YScsXG4gICAgcmVnZXhwOiAncmVkJyxcbn07XG5jb25zdCB0cnVuY2F0b3IgPSAn4oCmJztcbmZ1bmN0aW9uIGNvbG9yaXNlKHZhbHVlLCBzdHlsZVR5cGUpIHtcbiAgICBjb25zdCBjb2xvciA9IGFuc2lDb2xvcnNbc3R5bGVzW3N0eWxlVHlwZV1dIHx8IGFuc2lDb2xvcnNbc3R5bGVUeXBlXSB8fCAnJztcbiAgICBpZiAoIWNvbG9yKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gYFxcdTAwMWJbJHtjb2xvclswXX1tJHtTdHJpbmcodmFsdWUpfVxcdTAwMWJbJHtjb2xvclsxXX1tYDtcbn1cbmZ1bmN0aW9uIG5vcm1hbGlzZU9wdGlvbnMoeyBzaG93SGlkZGVuID0gZmFsc2UsIGRlcHRoID0gMiwgY29sb3JzID0gZmFsc2UsIGN1c3RvbUluc3BlY3QgPSB0cnVlLCBzaG93UHJveHkgPSBmYWxzZSwgbWF4QXJyYXlMZW5ndGggPSBJbmZpbml0eSwgYnJlYWtMZW5ndGggPSBJbmZpbml0eSwgc2VlbiA9IFtdLCBcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbnRydW5jYXRlID0gSW5maW5pdHksIHN0eWxpemUgPSBTdHJpbmcsIH0gPSB7fSwgaW5zcGVjdCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHNob3dIaWRkZW46IEJvb2xlYW4oc2hvd0hpZGRlbiksXG4gICAgICAgIGRlcHRoOiBOdW1iZXIoZGVwdGgpLFxuICAgICAgICBjb2xvcnM6IEJvb2xlYW4oY29sb3JzKSxcbiAgICAgICAgY3VzdG9tSW5zcGVjdDogQm9vbGVhbihjdXN0b21JbnNwZWN0KSxcbiAgICAgICAgc2hvd1Byb3h5OiBCb29sZWFuKHNob3dQcm94eSksXG4gICAgICAgIG1heEFycmF5TGVuZ3RoOiBOdW1iZXIobWF4QXJyYXlMZW5ndGgpLFxuICAgICAgICBicmVha0xlbmd0aDogTnVtYmVyKGJyZWFrTGVuZ3RoKSxcbiAgICAgICAgdHJ1bmNhdGU6IE51bWJlcih0cnVuY2F0ZSksXG4gICAgICAgIHNlZW4sXG4gICAgICAgIGluc3BlY3QsXG4gICAgICAgIHN0eWxpemUsXG4gICAgfTtcbiAgICBpZiAob3B0aW9ucy5jb2xvcnMpIHtcbiAgICAgICAgb3B0aW9ucy5zdHlsaXplID0gY29sb3Jpc2U7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zO1xufVxuZnVuY3Rpb24gaXNIaWdoU3Vycm9nYXRlKGNoYXIpIHtcbiAgICByZXR1cm4gY2hhciA+PSAnXFx1ZDgwMCcgJiYgY2hhciA8PSAnXFx1ZGJmZic7XG59XG5mdW5jdGlvbiB0cnVuY2F0ZShzdHJpbmcsIGxlbmd0aCwgdGFpbCA9IHRydW5jYXRvcikge1xuICAgIHN0cmluZyA9IFN0cmluZyhzdHJpbmcpO1xuICAgIGNvbnN0IHRhaWxMZW5ndGggPSB0YWlsLmxlbmd0aDtcbiAgICBjb25zdCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgIGlmICh0YWlsTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRhaWw7XG4gICAgfVxuICAgIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGggJiYgc3RyaW5nTGVuZ3RoID4gdGFpbExlbmd0aCkge1xuICAgICAgICBsZXQgZW5kID0gbGVuZ3RoIC0gdGFpbExlbmd0aDtcbiAgICAgICAgaWYgKGVuZCA+IDAgJiYgaXNIaWdoU3Vycm9nYXRlKHN0cmluZ1tlbmQgLSAxXSkpIHtcbiAgICAgICAgICAgIGVuZCA9IGVuZCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3N0cmluZy5zbGljZSgwLCBlbmQpfSR7dGFpbH1gO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5nO1xufVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIGluc3BlY3RMaXN0KGxpc3QsIG9wdGlvbnMsIGluc3BlY3RJdGVtLCBzZXBhcmF0b3IgPSAnLCAnKSB7XG4gICAgaW5zcGVjdEl0ZW0gPSBpbnNwZWN0SXRlbSB8fCBvcHRpb25zLmluc3BlY3Q7XG4gICAgY29uc3Qgc2l6ZSA9IGxpc3QubGVuZ3RoO1xuICAgIGlmIChzaXplID09PSAwKVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgY29uc3Qgb3JpZ2luYWxMZW5ndGggPSBvcHRpb25zLnRydW5jYXRlO1xuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICBsZXQgcGVlayA9ICcnO1xuICAgIGxldCB0cnVuY2F0ZWQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkgKz0gMSkge1xuICAgICAgICBjb25zdCBsYXN0ID0gaSArIDEgPT09IGxpc3QubGVuZ3RoO1xuICAgICAgICBjb25zdCBzZWNvbmRUb0xhc3QgPSBpICsgMiA9PT0gbGlzdC5sZW5ndGg7XG4gICAgICAgIHRydW5jYXRlZCA9IGAke3RydW5jYXRvcn0oJHtsaXN0Lmxlbmd0aCAtIGl9KWA7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gbGlzdFtpXTtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSByZW1haW5pbmcgd2UgbmVlZCB0byBhY2NvdW50IGZvciBhIHNlcGFyYXRvciBvZiBgLCBgXG4gICAgICAgIG9wdGlvbnMudHJ1bmNhdGUgPSBvcmlnaW5hbExlbmd0aCAtIG91dHB1dC5sZW5ndGggLSAobGFzdCA/IDAgOiBzZXBhcmF0b3IubGVuZ3RoKTtcbiAgICAgICAgY29uc3Qgc3RyaW5nID0gcGVlayB8fCBpbnNwZWN0SXRlbSh2YWx1ZSwgb3B0aW9ucykgKyAobGFzdCA/ICcnIDogc2VwYXJhdG9yKTtcbiAgICAgICAgY29uc3QgbmV4dExlbmd0aCA9IG91dHB1dC5sZW5ndGggKyBzdHJpbmcubGVuZ3RoO1xuICAgICAgICBjb25zdCB0cnVuY2F0ZWRMZW5ndGggPSBuZXh0TGVuZ3RoICsgdHJ1bmNhdGVkLmxlbmd0aDtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgbGFzdCBlbGVtZW50LCBhbmQgYWRkaW5nIGl0IHdvdWxkXG4gICAgICAgIC8vIHRha2UgdXMgb3ZlciBsZW5ndGgsIGJ1dCBhZGRpbmcgdGhlIHRydW5jYXRvciB3b3VsZG4ndCAtIHRoZW4gYnJlYWsgbm93XG4gICAgICAgIGlmIChsYXN0ICYmIG5leHRMZW5ndGggPiBvcmlnaW5hbExlbmd0aCAmJiBvdXRwdXQubGVuZ3RoICsgdHJ1bmNhdGVkLmxlbmd0aCA8PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhpcyBpc24ndCB0aGUgbGFzdCBvciBzZWNvbmQgdG8gbGFzdCBlbGVtZW50IHRvIHNjYW4sXG4gICAgICAgIC8vIGJ1dCB0aGUgc3RyaW5nIGlzIGFscmVhZHkgb3ZlciBsZW5ndGggdGhlbiBicmVhayBoZXJlXG4gICAgICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIHRydW5jYXRlZExlbmd0aCA+IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBQZWVrIGF0IHRoZSBuZXh0IHN0cmluZyB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkXG4gICAgICAgIC8vIGJyZWFrIGVhcmx5IGJlZm9yZSBhZGRpbmcgdGhpcyBpdGVtIHRvIHRoZSBvdXRwdXRcbiAgICAgICAgcGVlayA9IGxhc3QgPyAnJyA6IGluc3BlY3RJdGVtKGxpc3RbaSArIDFdLCBvcHRpb25zKSArIChzZWNvbmRUb0xhc3QgPyAnJyA6IHNlcGFyYXRvcik7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgb25lIGVsZW1lbnQgbGVmdCwgYnV0IHRoaXMgZWxlbWVudCBhbmRcbiAgICAgICAgLy8gdGhlIG5leHQgdGFrZXMgb3ZlciBsZW5ndGgsIHRoZSBicmVhayBlYXJseVxuICAgICAgICBpZiAoIWxhc3QgJiYgc2Vjb25kVG9MYXN0ICYmIHRydW5jYXRlZExlbmd0aCA+IG9yaWdpbmFsTGVuZ3RoICYmIG5leHRMZW5ndGggKyBwZWVrLmxlbmd0aCA+IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBvdXRwdXQgKz0gc3RyaW5nO1xuICAgICAgICAvLyBJZiB0aGUgbmV4dCBlbGVtZW50IHRha2VzIHVzIHRvIGxlbmd0aCAtXG4gICAgICAgIC8vIGJ1dCB0aGVyZSBhcmUgbW9yZSBhZnRlciB0aGF0LCB0aGVuIHdlIHNob3VsZCB0cnVuY2F0ZSBub3dcbiAgICAgICAgaWYgKCFsYXN0ICYmICFzZWNvbmRUb0xhc3QgJiYgbmV4dExlbmd0aCArIHBlZWsubGVuZ3RoID49IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICAgICAgICB0cnVuY2F0ZWQgPSBgJHt0cnVuY2F0b3J9KCR7bGlzdC5sZW5ndGggLSBpIC0gMX0pYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRydW5jYXRlZCA9ICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCR7b3V0cHV0fSR7dHJ1bmNhdGVkfWA7XG59XG5mdW5jdGlvbiBxdW90ZUNvbXBsZXhLZXkoa2V5KSB7XG4gICAgaWYgKGtleS5tYXRjaCgvXlthLXpBLVpfXVthLXpBLVpfMC05XSokLykpIHtcbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGtleSlcbiAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xufVxuZnVuY3Rpb24gaW5zcGVjdFByb3BlcnR5KFtrZXksIHZhbHVlXSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gMjtcbiAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAga2V5ID0gcXVvdGVDb21wbGV4S2V5KGtleSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBrZXkgIT09ICdudW1iZXInKSB7XG4gICAgICAgIGtleSA9IGBbJHtvcHRpb25zLmluc3BlY3Qoa2V5LCBvcHRpb25zKX1dYDtcbiAgICB9XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSBrZXkubGVuZ3RoO1xuICAgIHZhbHVlID0gb3B0aW9ucy5pbnNwZWN0KHZhbHVlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gYCR7a2V5fTogJHt2YWx1ZX1gO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0QXJyYXkoYXJyYXksIG9wdGlvbnMpIHtcbiAgICAvLyBPYmplY3Qua2V5cyB3aWxsIGFsd2F5cyBvdXRwdXQgdGhlIEFycmF5IGluZGljZXMgZmlyc3QsIHNvIHdlIGNhbiBzbGljZSBieVxuICAgIC8vIGBhcnJheS5sZW5ndGhgIHRvIGdldCBub24taW5kZXggcHJvcGVydGllc1xuICAgIGNvbnN0IG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICAgIGlmICghYXJyYXkubGVuZ3RoICYmICFub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gJ1tdJztcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDQ7XG4gICAgY29uc3QgbGlzdENvbnRlbnRzID0gaW5zcGVjdExpc3QoYXJyYXksIG9wdGlvbnMpO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gbGlzdENvbnRlbnRzLmxlbmd0aDtcbiAgICBsZXQgcHJvcGVydHlDb250ZW50cyA9ICcnO1xuICAgIGlmIChub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgICAgIHByb3BlcnR5Q29udGVudHMgPSBpbnNwZWN0TGlzdChub25JbmRleFByb3BlcnRpZXMubWFwKGtleSA9PiBba2V5LCBhcnJheVtrZXldXSksIG9wdGlvbnMsIGluc3BlY3RQcm9wZXJ0eSk7XG4gICAgfVxuICAgIHJldHVybiBgWyAke2xpc3RDb250ZW50c30ke3Byb3BlcnR5Q29udGVudHMgPyBgLCAke3Byb3BlcnR5Q29udGVudHN9YCA6ICcnfSBdYDtcbn1cblxuY29uc3QgZ2V0QXJyYXlOYW1lID0gKGFycmF5KSA9PiB7XG4gICAgLy8gV2UgbmVlZCB0byBzcGVjaWFsIGNhc2UgTm9kZS5qcycgQnVmZmVycywgd2hpY2ggcmVwb3J0IHRvIGJlIFVpbnQ4QXJyYXlcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKHR5cGVvZiBCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgYXJyYXkgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICAgICAgcmV0dXJuICdCdWZmZXInO1xuICAgIH1cbiAgICBpZiAoYXJyYXlbU3ltYm9sLnRvU3RyaW5nVGFnXSkge1xuICAgICAgICByZXR1cm4gYXJyYXlbU3ltYm9sLnRvU3RyaW5nVGFnXTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5LmNvbnN0cnVjdG9yLm5hbWU7XG59O1xuZnVuY3Rpb24gaW5zcGVjdFR5cGVkQXJyYXkoYXJyYXksIG9wdGlvbnMpIHtcbiAgICBjb25zdCBuYW1lID0gZ2V0QXJyYXlOYW1lKGFycmF5KTtcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IG5hbWUubGVuZ3RoICsgNDtcbiAgICAvLyBPYmplY3Qua2V5cyB3aWxsIGFsd2F5cyBvdXRwdXQgdGhlIEFycmF5IGluZGljZXMgZmlyc3QsIHNvIHdlIGNhbiBzbGljZSBieVxuICAgIC8vIGBhcnJheS5sZW5ndGhgIHRvIGdldCBub24taW5kZXggcHJvcGVydGllc1xuICAgIGNvbnN0IG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICAgIGlmICghYXJyYXkubGVuZ3RoICYmICFub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKVxuICAgICAgICByZXR1cm4gYCR7bmFtZX1bXWA7XG4gICAgLy8gQXMgd2Uga25vdyBUeXBlZEFycmF5cyBvbmx5IGNvbnRhaW4gVW5zaWduZWQgSW50ZWdlcnMsIHdlIGNhbiBza2lwIGluc3BlY3RpbmcgZWFjaCBvbmUgYW5kIHNpbXBseVxuICAgIC8vIHN0eWxpc2UgdGhlIHRvU3RyaW5nKCkgdmFsdWUgb2YgdGhlbVxuICAgIGxldCBvdXRwdXQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHN0cmluZyA9IGAke29wdGlvbnMuc3R5bGl6ZSh0cnVuY2F0ZShhcnJheVtpXSwgb3B0aW9ucy50cnVuY2F0ZSksICdudW1iZXInKX0ke2kgPT09IGFycmF5Lmxlbmd0aCAtIDEgPyAnJyA6ICcsICd9YDtcbiAgICAgICAgb3B0aW9ucy50cnVuY2F0ZSAtPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgICBpZiAoYXJyYXlbaV0gIT09IGFycmF5Lmxlbmd0aCAmJiBvcHRpb25zLnRydW5jYXRlIDw9IDMpIHtcbiAgICAgICAgICAgIG91dHB1dCArPSBgJHt0cnVuY2F0b3J9KCR7YXJyYXkubGVuZ3RoIC0gYXJyYXlbaV0gKyAxfSlgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0ICs9IHN0cmluZztcbiAgICB9XG4gICAgbGV0IHByb3BlcnR5Q29udGVudHMgPSAnJztcbiAgICBpZiAobm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgICAgICBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3Qobm9uSW5kZXhQcm9wZXJ0aWVzLm1hcChrZXkgPT4gW2tleSwgYXJyYXlba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICAgIH1cbiAgICByZXR1cm4gYCR7bmFtZX1bICR7b3V0cHV0fSR7cHJvcGVydHlDb250ZW50cyA/IGAsICR7cHJvcGVydHlDb250ZW50c31gIDogJyd9IF1gO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0RGF0ZShkYXRlT2JqZWN0LCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc3RyaW5nUmVwcmVzZW50YXRpb24gPSBkYXRlT2JqZWN0LnRvSlNPTigpO1xuICAgIGlmIChzdHJpbmdSZXByZXNlbnRhdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gJ0ludmFsaWQgRGF0ZSc7XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0ID0gc3RyaW5nUmVwcmVzZW50YXRpb24uc3BsaXQoJ1QnKTtcbiAgICBjb25zdCBkYXRlID0gc3BsaXRbMF07XG4gICAgLy8gSWYgd2UgbmVlZCB0byAtIHRydW5jYXRlIHRoZSB0aW1lIHBvcnRpb24sIGJ1dCBuZXZlciB0aGUgZGF0ZVxuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoYCR7ZGF0ZX1UJHt0cnVuY2F0ZShzcGxpdFsxXSwgb3B0aW9ucy50cnVuY2F0ZSAtIGRhdGUubGVuZ3RoIC0gMSl9YCwgJ2RhdGUnKTtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdEZ1bmN0aW9uKGZ1bmMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBmdW5jdGlvblR5cGUgPSBmdW5jW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgJ0Z1bmN0aW9uJztcbiAgICBjb25zdCBuYW1lID0gZnVuYy5uYW1lO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGBbJHtmdW5jdGlvblR5cGV9XWAsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoYFske2Z1bmN0aW9uVHlwZX0gJHt0cnVuY2F0ZShuYW1lLCBvcHRpb25zLnRydW5jYXRlIC0gMTEpfV1gLCAnc3BlY2lhbCcpO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0TWFwRW50cnkoW2tleSwgdmFsdWVdLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSA0O1xuICAgIGtleSA9IG9wdGlvbnMuaW5zcGVjdChrZXksIG9wdGlvbnMpO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0ga2V5Lmxlbmd0aDtcbiAgICB2YWx1ZSA9IG9wdGlvbnMuaW5zcGVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIGAke2tleX0gPT4gJHt2YWx1ZX1gO1xufVxuLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgYG1hcC5lbnRyaWVzKClgXG5mdW5jdGlvbiBtYXBUb0VudHJpZXMobWFwKSB7XG4gICAgY29uc3QgZW50cmllcyA9IFtdO1xuICAgIG1hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGVudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgIH0pO1xuICAgIHJldHVybiBlbnRyaWVzO1xufVxuZnVuY3Rpb24gaW5zcGVjdE1hcChtYXAsIG9wdGlvbnMpIHtcbiAgICBpZiAobWFwLnNpemUgPT09IDApXG4gICAgICAgIHJldHVybiAnTWFwe30nO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gNztcbiAgICByZXR1cm4gYE1hcHsgJHtpbnNwZWN0TGlzdChtYXBUb0VudHJpZXMobWFwKSwgb3B0aW9ucywgaW5zcGVjdE1hcEVudHJ5KX0gfWA7XG59XG5cbmNvbnN0IGlzTmFOID0gTnVtYmVyLmlzTmFOIHx8IChpID0+IGkgIT09IGkpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxuZnVuY3Rpb24gaW5zcGVjdE51bWJlcihudW1iZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAoaXNOYU4obnVtYmVyKSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKCdOYU4nLCAnbnVtYmVyJyk7XG4gICAgfVxuICAgIGlmIChudW1iZXIgPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoJ0luZmluaXR5JywgJ251bWJlcicpO1xuICAgIH1cbiAgICBpZiAobnVtYmVyID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZSgnLUluZmluaXR5JywgJ251bWJlcicpO1xuICAgIH1cbiAgICBpZiAobnVtYmVyID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoMSAvIG51bWJlciA9PT0gSW5maW5pdHkgPyAnKzAnIDogJy0wJywgJ251bWJlcicpO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKHRydW5jYXRlKFN0cmluZyhudW1iZXIpLCBvcHRpb25zLnRydW5jYXRlKSwgJ251bWJlcicpO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0QmlnSW50KG51bWJlciwgb3B0aW9ucykge1xuICAgIGxldCBudW1zID0gdHJ1bmNhdGUobnVtYmVyLnRvU3RyaW5nKCksIG9wdGlvbnMudHJ1bmNhdGUgLSAxKTtcbiAgICBpZiAobnVtcyAhPT0gdHJ1bmNhdG9yKVxuICAgICAgICBudW1zICs9ICduJztcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKG51bXMsICdiaWdpbnQnKTtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdFJlZ0V4cCh2YWx1ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGZsYWdzID0gdmFsdWUudG9TdHJpbmcoKS5zcGxpdCgnLycpWzJdO1xuICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IG9wdGlvbnMudHJ1bmNhdGUgLSAoMiArIGZsYWdzLmxlbmd0aCk7XG4gICAgY29uc3Qgc291cmNlID0gdmFsdWUuc291cmNlO1xuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoYC8ke3RydW5jYXRlKHNvdXJjZSwgc291cmNlTGVuZ3RoKX0vJHtmbGFnc31gLCAncmVnZXhwJyk7XG59XG5cbi8vIElFMTEgZG9lc24ndCBzdXBwb3J0IGBBcnJheS5mcm9tKHNldClgXG5mdW5jdGlvbiBhcnJheUZyb21TZXQoc2V0KSB7XG4gICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgc2V0LmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbn1cbmZ1bmN0aW9uIGluc3BlY3RTZXQoc2V0LCBvcHRpb25zKSB7XG4gICAgaWYgKHNldC5zaXplID09PSAwKVxuICAgICAgICByZXR1cm4gJ1NldHt9JztcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IDc7XG4gICAgcmV0dXJuIGBTZXR7ICR7aW5zcGVjdExpc3QoYXJyYXlGcm9tU2V0KHNldCksIG9wdGlvbnMpfSB9YDtcbn1cblxuY29uc3Qgc3RyaW5nRXNjYXBlQ2hhcnMgPSBuZXcgUmVnRXhwKFwiWydcXFxcdTAwMDAtXFxcXHUwMDFmXFxcXHUwMDdmLVxcXFx1MDA5ZlxcXFx1MDBhZFxcXFx1MDYwMC1cXFxcdTA2MDRcXFxcdTA3MGZcXFxcdTE3YjRcXFxcdTE3YjVcIiArXG4gICAgJ1xcXFx1MjAwYy1cXFxcdTIwMGZcXFxcdTIwMjgtXFxcXHUyMDJmXFxcXHUyMDYwLVxcXFx1MjA2ZlxcXFx1ZmVmZlxcXFx1ZmZmMC1cXFxcdWZmZmZdJywgJ2cnKTtcbmNvbnN0IGVzY2FwZUNoYXJhY3RlcnMgPSB7XG4gICAgJ1xcYic6ICdcXFxcYicsXG4gICAgJ1xcdCc6ICdcXFxcdCcsXG4gICAgJ1xcbic6ICdcXFxcbicsXG4gICAgJ1xcZic6ICdcXFxcZicsXG4gICAgJ1xccic6ICdcXFxccicsXG4gICAgXCInXCI6IFwiXFxcXCdcIixcbiAgICAnXFxcXCc6ICdcXFxcXFxcXCcsXG59O1xuY29uc3QgaGV4ID0gMTY7XG5mdW5jdGlvbiBlc2NhcGUoY2hhcikge1xuICAgIHJldHVybiAoZXNjYXBlQ2hhcmFjdGVyc1tjaGFyXSB8fFxuICAgICAgICBgXFxcXHUke2AwMDAwJHtjaGFyLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoaGV4KX1gLnNsaWNlKC00KX1gKTtcbn1cbmZ1bmN0aW9uIGluc3BlY3RTdHJpbmcoc3RyaW5nLCBvcHRpb25zKSB7XG4gICAgaWYgKHN0cmluZ0VzY2FwZUNoYXJzLnRlc3Qoc3RyaW5nKSkge1xuICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShzdHJpbmdFc2NhcGVDaGFycywgZXNjYXBlKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShgJyR7dHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zLnRydW5jYXRlIC0gMil9J2AsICdzdHJpbmcnKTtcbn1cblxuZnVuY3Rpb24gaW5zcGVjdFN5bWJvbCh2YWx1ZSkge1xuICAgIGlmICgnZGVzY3JpcHRpb24nIGluIFN5bWJvbC5wcm90b3R5cGUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmRlc2NyaXB0aW9uID8gYFN5bWJvbCgke3ZhbHVlLmRlc2NyaXB0aW9ufSlgIDogJ1N5bWJvbCgpJztcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG59XG5cbmNvbnN0IGdldFByb21pc2VWYWx1ZSA9ICgpID0+ICdQcm9taXNle+KApn0nO1xuXG5mdW5jdGlvbiBpbnNwZWN0T2JqZWN0JDEob2JqZWN0LCBvcHRpb25zKSB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCk7XG4gICAgY29uc3Qgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCkgOiBbXTtcbiAgICBpZiAocHJvcGVydGllcy5sZW5ndGggPT09IDAgJiYgc3ltYm9scy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuICd7fSc7XG4gICAgfVxuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gNDtcbiAgICBvcHRpb25zLnNlZW4gPSBvcHRpb25zLnNlZW4gfHwgW107XG4gICAgaWYgKG9wdGlvbnMuc2Vlbi5pbmNsdWRlcyhvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgfVxuICAgIG9wdGlvbnMuc2Vlbi5wdXNoKG9iamVjdCk7XG4gICAgY29uc3QgcHJvcGVydHlDb250ZW50cyA9IGluc3BlY3RMaXN0KHByb3BlcnRpZXMubWFwKGtleSA9PiBba2V5LCBvYmplY3Rba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICAgIGNvbnN0IHN5bWJvbENvbnRlbnRzID0gaW5zcGVjdExpc3Qoc3ltYm9scy5tYXAoa2V5ID0+IFtrZXksIG9iamVjdFtrZXldXSksIG9wdGlvbnMsIGluc3BlY3RQcm9wZXJ0eSk7XG4gICAgb3B0aW9ucy5zZWVuLnBvcCgpO1xuICAgIGxldCBzZXAgPSAnJztcbiAgICBpZiAocHJvcGVydHlDb250ZW50cyAmJiBzeW1ib2xDb250ZW50cykge1xuICAgICAgICBzZXAgPSAnLCAnO1xuICAgIH1cbiAgICByZXR1cm4gYHsgJHtwcm9wZXJ0eUNvbnRlbnRzfSR7c2VwfSR7c3ltYm9sQ29udGVudHN9IH1gO1xufVxuXG5jb25zdCB0b1N0cmluZ1RhZyA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZyA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IGZhbHNlO1xuZnVuY3Rpb24gaW5zcGVjdENsYXNzKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgbGV0IG5hbWUgPSAnJztcbiAgICBpZiAodG9TdHJpbmdUYWcgJiYgdG9TdHJpbmdUYWcgaW4gdmFsdWUpIHtcbiAgICAgICAgbmFtZSA9IHZhbHVlW3RvU3RyaW5nVGFnXTtcbiAgICB9XG4gICAgbmFtZSA9IG5hbWUgfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgICAvLyBCYWJlbCB0cmFuc2Zvcm1zIGFub255bW91cyBjbGFzc2VzIHRvIHRoZSBuYW1lIGBfY2xhc3NgXG4gICAgaWYgKCFuYW1lIHx8IG5hbWUgPT09ICdfY2xhc3MnKSB7XG4gICAgICAgIG5hbWUgPSAnPEFub255bW91cyBDbGFzcz4nO1xuICAgIH1cbiAgICBvcHRpb25zLnRydW5jYXRlIC09IG5hbWUubGVuZ3RoO1xuICAgIHJldHVybiBgJHtuYW1lfSR7aW5zcGVjdE9iamVjdCQxKHZhbHVlLCBvcHRpb25zKX1gO1xufVxuXG5mdW5jdGlvbiBpbnNwZWN0QXJndW1lbnRzKGFyZ3MsIG9wdGlvbnMpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiAnQXJndW1lbnRzW10nO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gMTM7XG4gICAgcmV0dXJuIGBBcmd1bWVudHNbICR7aW5zcGVjdExpc3QoYXJncywgb3B0aW9ucyl9IF1gO1xufVxuXG5jb25zdCBlcnJvcktleXMgPSBbXG4gICAgJ3N0YWNrJyxcbiAgICAnbGluZScsXG4gICAgJ2NvbHVtbicsXG4gICAgJ25hbWUnLFxuICAgICdtZXNzYWdlJyxcbiAgICAnZmlsZU5hbWUnLFxuICAgICdsaW5lTnVtYmVyJyxcbiAgICAnY29sdW1uTnVtYmVyJyxcbiAgICAnbnVtYmVyJyxcbiAgICAnZGVzY3JpcHRpb24nLFxuICAgICdjYXVzZScsXG5dO1xuZnVuY3Rpb24gaW5zcGVjdE9iamVjdChlcnJvciwgb3B0aW9ucykge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlcnJvcikuZmlsdGVyKGtleSA9PiBlcnJvcktleXMuaW5kZXhPZihrZXkpID09PSAtMSk7XG4gICAgY29uc3QgbmFtZSA9IGVycm9yLm5hbWU7XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aDtcbiAgICBsZXQgbWVzc2FnZSA9ICcnO1xuICAgIGlmICh0eXBlb2YgZXJyb3IubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbWVzc2FnZSA9IHRydW5jYXRlKGVycm9yLm1lc3NhZ2UsIG9wdGlvbnMudHJ1bmNhdGUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcHJvcGVydGllcy51bnNoaWZ0KCdtZXNzYWdlJyk7XG4gICAgfVxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlID8gYDogJHttZXNzYWdlfWAgOiAnJztcbiAgICBvcHRpb25zLnRydW5jYXRlIC09IG1lc3NhZ2UubGVuZ3RoICsgNTtcbiAgICBvcHRpb25zLnNlZW4gPSBvcHRpb25zLnNlZW4gfHwgW107XG4gICAgaWYgKG9wdGlvbnMuc2Vlbi5pbmNsdWRlcyhlcnJvcikpIHtcbiAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICB9XG4gICAgb3B0aW9ucy5zZWVuLnB1c2goZXJyb3IpO1xuICAgIGNvbnN0IHByb3BlcnR5Q29udGVudHMgPSBpbnNwZWN0TGlzdChwcm9wZXJ0aWVzLm1hcChrZXkgPT4gW2tleSwgZXJyb3Jba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICAgIHJldHVybiBgJHtuYW1lfSR7bWVzc2FnZX0ke3Byb3BlcnR5Q29udGVudHMgPyBgIHsgJHtwcm9wZXJ0eUNvbnRlbnRzfSB9YCA6ICcnfWA7XG59XG5cbmZ1bmN0aW9uIGluc3BlY3RBdHRyaWJ1dGUoW2tleSwgdmFsdWVdLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSAzO1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGAke29wdGlvbnMuc3R5bGl6ZShTdHJpbmcoa2V5KSwgJ3llbGxvdycpfWA7XG4gICAgfVxuICAgIHJldHVybiBgJHtvcHRpb25zLnN0eWxpemUoU3RyaW5nKGtleSksICd5ZWxsb3cnKX09JHtvcHRpb25zLnN0eWxpemUoYFwiJHt2YWx1ZX1cImAsICdzdHJpbmcnKX1gO1xufVxuZnVuY3Rpb24gaW5zcGVjdE5vZGVDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gaW5zcGVjdExpc3QoY29sbGVjdGlvbiwgb3B0aW9ucywgaW5zcGVjdE5vZGUsICdcXG4nKTtcbn1cbmZ1bmN0aW9uIGluc3BlY3ROb2RlKG5vZGUsIG9wdGlvbnMpIHtcbiAgICBzd2l0Y2ggKG5vZGUubm9kZVR5cGUpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcmV0dXJuIGluc3BlY3RIVE1MKG5vZGUsIG9wdGlvbnMpO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnNwZWN0KG5vZGUuZGF0YSwgb3B0aW9ucyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnNwZWN0KG5vZGUsIG9wdGlvbnMpO1xuICAgIH1cbn1cbi8vIEB0cy1pZ25vcmUgKERlbm8gZG9lc24ndCBoYXZlIEVsZW1lbnQpXG5mdW5jdGlvbiBpbnNwZWN0SFRNTChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKTtcbiAgICBjb25zdCBuYW1lID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgaGVhZCA9IG9wdGlvbnMuc3R5bGl6ZShgPCR7bmFtZX1gLCAnc3BlY2lhbCcpO1xuICAgIGNvbnN0IGhlYWRDbG9zZSA9IG9wdGlvbnMuc3R5bGl6ZShgPmAsICdzcGVjaWFsJyk7XG4gICAgY29uc3QgdGFpbCA9IG9wdGlvbnMuc3R5bGl6ZShgPC8ke25hbWV9PmAsICdzcGVjaWFsJyk7XG4gICAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aCAqIDIgKyA1O1xuICAgIGxldCBwcm9wZXJ0eUNvbnRlbnRzID0gJyc7XG4gICAgaWYgKHByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBwcm9wZXJ0eUNvbnRlbnRzICs9ICcgJztcbiAgICAgICAgcHJvcGVydHlDb250ZW50cyArPSBpbnNwZWN0TGlzdChwcm9wZXJ0aWVzLm1hcCgoa2V5KSA9PiBba2V5LCBlbGVtZW50LmdldEF0dHJpYnV0ZShrZXkpXSksIG9wdGlvbnMsIGluc3BlY3RBdHRyaWJ1dGUsICcgJyk7XG4gICAgfVxuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gcHJvcGVydHlDb250ZW50cy5sZW5ndGg7XG4gICAgY29uc3QgdHJ1bmNhdGUgPSBvcHRpb25zLnRydW5jYXRlO1xuICAgIGxldCBjaGlsZHJlbiA9IGluc3BlY3ROb2RlQ29sbGVjdGlvbihlbGVtZW50LmNoaWxkcmVuLCBvcHRpb25zKTtcbiAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoID4gdHJ1bmNhdGUpIHtcbiAgICAgICAgY2hpbGRyZW4gPSBgJHt0cnVuY2F0b3J9KCR7ZWxlbWVudC5jaGlsZHJlbi5sZW5ndGh9KWA7XG4gICAgfVxuICAgIHJldHVybiBgJHtoZWFkfSR7cHJvcGVydHlDb250ZW50c30ke2hlYWRDbG9zZX0ke2NoaWxkcmVufSR7dGFpbH1gO1xufVxuXG4vKiAhXG4gKiBsb3VwZVxuICogQ29weXJpZ2h0KGMpIDIwMTMgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuY29uc3Qgc3ltYm9sc1N1cHBvcnRlZCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5mb3IgPT09ICdmdW5jdGlvbic7XG5jb25zdCBjaGFpSW5zcGVjdCA9IHN5bWJvbHNTdXBwb3J0ZWQgPyBTeW1ib2wuZm9yKCdjaGFpL2luc3BlY3QnKSA6ICdAQGNoYWkvaW5zcGVjdCc7XG5jb25zdCBub2RlSW5zcGVjdCA9IFN5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJyk7XG5jb25zdCBjb25zdHJ1Y3Rvck1hcCA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCBzdHJpbmdUYWdNYXAgPSB7fTtcbmNvbnN0IGJhc2VUeXBlc01hcCA9IHtcbiAgICB1bmRlZmluZWQ6ICh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyksXG4gICAgbnVsbDogKHZhbHVlLCBvcHRpb25zKSA9PiBvcHRpb25zLnN0eWxpemUoJ251bGwnLCAnbnVsbCcpLFxuICAgIGJvb2xlYW46ICh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFN0cmluZyh2YWx1ZSksICdib29sZWFuJyksXG4gICAgQm9vbGVhbjogKHZhbHVlLCBvcHRpb25zKSA9PiBvcHRpb25zLnN0eWxpemUoU3RyaW5nKHZhbHVlKSwgJ2Jvb2xlYW4nKSxcbiAgICBudW1iZXI6IGluc3BlY3ROdW1iZXIsXG4gICAgTnVtYmVyOiBpbnNwZWN0TnVtYmVyLFxuICAgIGJpZ2ludDogaW5zcGVjdEJpZ0ludCxcbiAgICBCaWdJbnQ6IGluc3BlY3RCaWdJbnQsXG4gICAgc3RyaW5nOiBpbnNwZWN0U3RyaW5nLFxuICAgIFN0cmluZzogaW5zcGVjdFN0cmluZyxcbiAgICBmdW5jdGlvbjogaW5zcGVjdEZ1bmN0aW9uLFxuICAgIEZ1bmN0aW9uOiBpbnNwZWN0RnVuY3Rpb24sXG4gICAgc3ltYm9sOiBpbnNwZWN0U3ltYm9sLFxuICAgIC8vIEEgU3ltYm9sIHBvbHlmaWxsIHdpbGwgcmV0dXJuIGBTeW1ib2xgIG5vdCBgc3ltYm9sYCBmcm9tIHR5cGVkZXRlY3RcbiAgICBTeW1ib2w6IGluc3BlY3RTeW1ib2wsXG4gICAgQXJyYXk6IGluc3BlY3RBcnJheSxcbiAgICBEYXRlOiBpbnNwZWN0RGF0ZSxcbiAgICBNYXA6IGluc3BlY3RNYXAsXG4gICAgU2V0OiBpbnNwZWN0U2V0LFxuICAgIFJlZ0V4cDogaW5zcGVjdFJlZ0V4cCxcbiAgICBQcm9taXNlOiBnZXRQcm9taXNlVmFsdWUsXG4gICAgLy8gV2Vha1NldCwgV2Vha01hcCBhcmUgdG90YWxseSBvcGFxdWUgdG8gdXNcbiAgICBXZWFrU2V0OiAodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZSgnV2Vha1NldHvigKZ9JywgJ3NwZWNpYWwnKSxcbiAgICBXZWFrTWFwOiAodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZSgnV2Vha01hcHvigKZ9JywgJ3NwZWNpYWwnKSxcbiAgICBBcmd1bWVudHM6IGluc3BlY3RBcmd1bWVudHMsXG4gICAgSW50OEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBVaW50OEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgSW50MTZBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgVWludDE2QXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIEludDMyQXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIFVpbnQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgICBGbG9hdDMyQXJyYXk6IGluc3BlY3RUeXBlZEFycmF5LFxuICAgIEZsb2F0NjRBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gICAgR2VuZXJhdG9yOiAoKSA9PiAnJyxcbiAgICBEYXRhVmlldzogKCkgPT4gJycsXG4gICAgQXJyYXlCdWZmZXI6ICgpID0+ICcnLFxuICAgIEVycm9yOiBpbnNwZWN0T2JqZWN0LFxuICAgIEhUTUxDb2xsZWN0aW9uOiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24sXG4gICAgTm9kZUxpc3Q6IGluc3BlY3ROb2RlQ29sbGVjdGlvbixcbn07XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuY29uc3QgaW5zcGVjdEN1c3RvbSA9ICh2YWx1ZSwgb3B0aW9ucywgdHlwZSwgaW5zcGVjdEZuKSA9PiB7XG4gICAgaWYgKGNoYWlJbnNwZWN0IGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZVtjaGFpSW5zcGVjdF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlW2NoYWlJbnNwZWN0XShvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKG5vZGVJbnNwZWN0IGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZVtub2RlSW5zcGVjdF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlW25vZGVJbnNwZWN0XShvcHRpb25zLmRlcHRoLCBvcHRpb25zLCBpbnNwZWN0Rm4pO1xuICAgIH1cbiAgICBpZiAoJ2luc3BlY3QnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5pbnNwZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5pbnNwZWN0KG9wdGlvbnMuZGVwdGgsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoJ2NvbnN0cnVjdG9yJyBpbiB2YWx1ZSAmJiBjb25zdHJ1Y3Rvck1hcC5oYXModmFsdWUuY29uc3RydWN0b3IpKSB7XG4gICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvck1hcC5nZXQodmFsdWUuY29uc3RydWN0b3IpKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHN0cmluZ1RhZ01hcFt0eXBlXSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nVGFnTWFwW3R5cGVdKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xufTtcbmNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiBpbnNwZWN0JDEodmFsdWUsIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBub3JtYWxpc2VPcHRpb25zKG9wdHMsIGluc3BlY3QkMSk7XG4gICAgY29uc3QgeyBjdXN0b21JbnNwZWN0IH0gPSBvcHRpb25zO1xuICAgIGxldCB0eXBlID0gdmFsdWUgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgdmFsdWU7XG4gICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHR5cGUgPSB0b1N0cmluZy5jYWxsKHZhbHVlKS5zbGljZSg4LCAtMSk7XG4gICAgfVxuICAgIC8vIElmIGl0IGlzIGEgYmFzZSB2YWx1ZSB0aGF0IHdlIGFscmVhZHkgc3VwcG9ydCwgdGhlbiB1c2UgTG91cGUncyBpbnNwZWN0b3JcbiAgICBpZiAodHlwZSBpbiBiYXNlVHlwZXNNYXApIHtcbiAgICAgICAgcmV0dXJuIGJhc2VUeXBlc01hcFt0eXBlXSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIElmIGBvcHRpb25zLmN1c3RvbUluc3BlY3RgIGlzIHNldCB0byB0cnVlIHRoZW4gdHJ5IHRvIHVzZSB0aGUgY3VzdG9tIGluc3BlY3RvclxuICAgIGlmIChjdXN0b21JbnNwZWN0ICYmIHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGluc3BlY3RDdXN0b20odmFsdWUsIG9wdGlvbnMsIHR5cGUsIGluc3BlY3QkMSk7XG4gICAgICAgIGlmIChvdXRwdXQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3V0cHV0ID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICAgICAgcmV0dXJuIGluc3BlY3QkMShvdXRwdXQsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb3RvID0gdmFsdWUgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpIDogZmFsc2U7XG4gICAgLy8gSWYgaXQncyBhIHBsYWluIE9iamVjdCB0aGVuIHVzZSBMb3VwZSdzIGluc3BlY3RvclxuICAgIGlmIChwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gaW5zcGVjdE9iamVjdCQxKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLy8gU3BlY2lmaWNhbGx5IGFjY291bnQgZm9yIEhUTUxFbGVtZW50c1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIEhUTUxFbGVtZW50ID09PSAnZnVuY3Rpb24nICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGluc3BlY3RIVE1MKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKCdjb25zdHJ1Y3RvcicgaW4gdmFsdWUpIHtcbiAgICAgICAgLy8gSWYgaXQgaXMgYSBjbGFzcywgaW5zcGVjdCBpdCBsaWtlIGFuIG9iamVjdCBidXQgYWRkIHRoZSBjb25zdHJ1Y3RvciBuYW1lXG4gICAgICAgIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zcGVjdENsYXNzKHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBpdCBpcyBhbiBvYmplY3Qgd2l0aCBhbiBhbm9ueW1vdXMgcHJvdG90eXBlLCBkaXNwbGF5IGl0IGFzIGFuIG9iamVjdC5cbiAgICAgICAgcmV0dXJuIGluc3BlY3RPYmplY3QkMSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIC8vIGxhc3QgY2hhbmNlIHRvIGNoZWNrIGlmIGl0J3MgYW4gb2JqZWN0XG4gICAgaWYgKHZhbHVlID09PSBPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpbnNwZWN0T2JqZWN0JDEodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvLyBXZSBoYXZlIHJ1biBvdXQgb2Ygb3B0aW9ucyEgSnVzdCBzdHJpbmdpZnkgdGhlIHZhbHVlXG4gICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShTdHJpbmcodmFsdWUpLCB0eXBlKTtcbn1cblxuY29uc3QgeyBBc3ltbWV0cmljTWF0Y2hlciwgRE9NQ29sbGVjdGlvbiwgRE9NRWxlbWVudCwgSW1tdXRhYmxlLCBSZWFjdEVsZW1lbnQsIFJlYWN0VGVzdENvbXBvbmVudCB9ID0gcGx1Z2lucztcbmNvbnN0IFBMVUdJTlMgPSBbXG5cdFJlYWN0VGVzdENvbXBvbmVudCxcblx0UmVhY3RFbGVtZW50LFxuXHRET01FbGVtZW50LFxuXHRET01Db2xsZWN0aW9uLFxuXHRJbW11dGFibGUsXG5cdEFzeW1tZXRyaWNNYXRjaGVyXG5dO1xuZnVuY3Rpb24gc3RyaW5naWZ5KG9iamVjdCwgbWF4RGVwdGggPSAxMCwgeyBtYXhMZW5ndGgsIGZpbHRlck5vZGUsIC4uLm9wdGlvbnMgfSA9IHt9KSB7XG5cdGNvbnN0IE1BWF9MRU5HVEggPSBtYXhMZW5ndGggPz8gMWU0O1xuXHRsZXQgcmVzdWx0O1xuXHQvLyBDb252ZXJ0IHN0cmluZyBzZWxlY3RvciB0byBmaWx0ZXIgZnVuY3Rpb25cblx0Y29uc3QgZmlsdGVyRm4gPSB0eXBlb2YgZmlsdGVyTm9kZSA9PT0gXCJzdHJpbmdcIiA/IGNyZWF0ZU5vZGVGaWx0ZXJGcm9tU2VsZWN0b3IoZmlsdGVyTm9kZSkgOiBmaWx0ZXJOb2RlO1xuXHRjb25zdCBwbHVnaW5zID0gZmlsdGVyRm4gPyBbXG5cdFx0UmVhY3RUZXN0Q29tcG9uZW50LFxuXHRcdFJlYWN0RWxlbWVudCxcblx0XHRjcmVhdGVET01FbGVtZW50RmlsdGVyKGZpbHRlckZuKSxcblx0XHRET01Db2xsZWN0aW9uLFxuXHRcdEltbXV0YWJsZSxcblx0XHRBc3ltbWV0cmljTWF0Y2hlclxuXHRdIDogUExVR0lOUztcblx0dHJ5IHtcblx0XHRyZXN1bHQgPSBmb3JtYXQkMShvYmplY3QsIHtcblx0XHRcdG1heERlcHRoLFxuXHRcdFx0ZXNjYXBlU3RyaW5nOiBmYWxzZSxcblx0XHRcdHBsdWdpbnMsXG5cdFx0XHQuLi5vcHRpb25zXG5cdFx0fSk7XG5cdH0gY2F0Y2gge1xuXHRcdHJlc3VsdCA9IGZvcm1hdCQxKG9iamVjdCwge1xuXHRcdFx0Y2FsbFRvSlNPTjogZmFsc2UsXG5cdFx0XHRtYXhEZXB0aCxcblx0XHRcdGVzY2FwZVN0cmluZzogZmFsc2UsXG5cdFx0XHRwbHVnaW5zLFxuXHRcdFx0Li4ub3B0aW9uc1xuXHRcdH0pO1xuXHR9XG5cdC8vIFByZXZlbnRzIGluZmluaXRlIGxvb3AgaHR0cHM6Ly9naXRodWIuY29tL3ZpdGVzdC1kZXYvdml0ZXN0L2lzc3Vlcy83MjQ5XG5cdHJldHVybiByZXN1bHQubGVuZ3RoID49IE1BWF9MRU5HVEggJiYgbWF4RGVwdGggPiAxID8gc3RyaW5naWZ5KG9iamVjdCwgTWF0aC5mbG9vcihNYXRoLm1pbihtYXhEZXB0aCwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIC8gMiksIHtcblx0XHRtYXhMZW5ndGgsXG5cdFx0ZmlsdGVyTm9kZSxcblx0XHQuLi5vcHRpb25zXG5cdH0pIDogcmVzdWx0O1xufVxuZnVuY3Rpb24gY3JlYXRlTm9kZUZpbHRlckZyb21TZWxlY3RvcihzZWxlY3Rvcikge1xuXHRjb25zdCBFTEVNRU5UX05PREUgPSAxO1xuXHRjb25zdCBDT01NRU5UX05PREUgPSA4O1xuXHRyZXR1cm4gKG5vZGUpID0+IHtcblx0XHQvLyBGaWx0ZXIgb3V0IGNvbW1lbnRzXG5cdFx0aWYgKG5vZGUubm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHQvLyBGaWx0ZXIgb3V0IGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuXHRcdGlmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgbm9kZS5tYXRjaGVzKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXR1cm4gIW5vZGUubWF0Y2hlcyhzZWxlY3Rvcik7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9O1xufVxuY29uc3QgZm9ybWF0UmVnRXhwID0gLyVbc2RqaWZvT2MlXS9nO1xuZnVuY3Rpb24gYmFzZUZvcm1hdChhcmdzLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgZm9ybWF0QXJnID0gKGl0ZW0sIGluc3BlY09wdGlvbnMpID0+IHtcblx0XHRpZiAob3B0aW9ucy5wcmV0dGlmeU9iamVjdCkge1xuXHRcdFx0cmV0dXJuIHN0cmluZ2lmeShpdGVtLCB1bmRlZmluZWQsIHtcblx0XHRcdFx0cHJpbnRCYXNpY1Byb3RvdHlwZTogZmFsc2UsXG5cdFx0XHRcdGVzY2FwZVN0cmluZzogZmFsc2Vcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gaW5zcGVjdChpdGVtLCBpbnNwZWNPcHRpb25zKTtcblx0fTtcblx0aWYgKHR5cGVvZiBhcmdzWzBdICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0Y29uc3Qgb2JqZWN0cyA9IFtdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuXHRcdFx0b2JqZWN0cy5wdXNoKGZvcm1hdEFyZyhhcmdzW2ldLCB7XG5cdFx0XHRcdGRlcHRoOiAwLFxuXHRcdFx0XHRjb2xvcnM6IGZhbHNlXG5cdFx0XHR9KSk7XG5cdFx0fVxuXHRcdHJldHVybiBvYmplY3RzLmpvaW4oXCIgXCIpO1xuXHR9XG5cdGNvbnN0IGxlbiA9IGFyZ3MubGVuZ3RoO1xuXHRsZXQgaSA9IDE7XG5cdGNvbnN0IHRlbXBsYXRlID0gYXJnc1swXTtcblx0bGV0IHN0ciA9IFN0cmluZyh0ZW1wbGF0ZSkucmVwbGFjZShmb3JtYXRSZWdFeHAsICh4KSA9PiB7XG5cdFx0aWYgKHggPT09IFwiJSVcIikge1xuXHRcdFx0cmV0dXJuIFwiJVwiO1xuXHRcdH1cblx0XHRpZiAoaSA+PSBsZW4pIHtcblx0XHRcdHJldHVybiB4O1xuXHRcdH1cblx0XHRzd2l0Y2ggKHgpIHtcblx0XHRcdGNhc2UgXCIlc1wiOiB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gYXJnc1tpKytdO1xuXHRcdFx0XHRpZiAodHlwZW9mIHZhbHVlID09PSBcImJpZ2ludFwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGAke3ZhbHVlLnRvU3RyaW5nKCl9bmA7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiB2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFwiLTBcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZS50b1N0cmluZyA9PT0gXCJmdW5jdGlvblwiICYmIHZhbHVlLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGZvcm1hdEFyZyh2YWx1ZSwge1xuXHRcdFx0XHRcdFx0ZGVwdGg6IDAsXG5cdFx0XHRcdFx0XHRjb2xvcnM6IGZhbHNlXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIFN0cmluZyh2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwiJWRcIjoge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGFyZ3NbaSsrXTtcblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuXHRcdFx0XHRcdHJldHVybiBgJHt2YWx1ZS50b1N0cmluZygpfW5gO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3ltYm9sXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gXCJOYU5cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gTnVtYmVyKHZhbHVlKS50b1N0cmluZygpO1xuXHRcdFx0fVxuXHRcdFx0Y2FzZSBcIiVpXCI6IHtcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSBhcmdzW2krK107XG5cdFx0XHRcdGlmICh0eXBlb2YgdmFsdWUgPT09IFwiYmlnaW50XCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gYCR7dmFsdWUudG9TdHJpbmcoKX1uYDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gTnVtYmVyLnBhcnNlSW50KFN0cmluZyh2YWx1ZSkpLnRvU3RyaW5nKCk7XG5cdFx0XHR9XG5cdFx0XHRjYXNlIFwiJWZcIjogcmV0dXJuIE51bWJlci5wYXJzZUZsb2F0KFN0cmluZyhhcmdzW2krK10pKS50b1N0cmluZygpO1xuXHRcdFx0Y2FzZSBcIiVvXCI6IHJldHVybiBmb3JtYXRBcmcoYXJnc1tpKytdLCB7XG5cdFx0XHRcdHNob3dIaWRkZW46IHRydWUsXG5cdFx0XHRcdHNob3dQcm94eTogdHJ1ZVxuXHRcdFx0fSk7XG5cdFx0XHRjYXNlIFwiJU9cIjogcmV0dXJuIGZvcm1hdEFyZyhhcmdzW2krK10pO1xuXHRcdFx0Y2FzZSBcIiVjXCI6IHtcblx0XHRcdFx0aSsrO1xuXHRcdFx0XHRyZXR1cm4gXCJcIjtcblx0XHRcdH1cblx0XHRcdGNhc2UgXCIlalwiOiB0cnkge1xuXHRcdFx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcblx0XHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0XHRjb25zdCBtID0gZXJyLm1lc3NhZ2U7XG5cdFx0XHRcdGlmIChtLmluY2x1ZGVzKFwiY2lyY3VsYXIgc3RydWN0dXJlXCIpIHx8IG0uaW5jbHVkZXMoXCJjeWNsaWMgc3RydWN0dXJlc1wiKSB8fCBtLmluY2x1ZGVzKFwiY3ljbGljIG9iamVjdFwiKSkge1xuXHRcdFx0XHRcdHJldHVybiBcIltDaXJjdWxhcl1cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aHJvdyBlcnI7XG5cdFx0XHR9XG5cdFx0XHRkZWZhdWx0OiByZXR1cm4geDtcblx0XHR9XG5cdH0pO1xuXHRmb3IgKGxldCB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuXHRcdGlmICh4ID09PSBudWxsIHx8IHR5cGVvZiB4ICE9PSBcIm9iamVjdFwiKSB7XG5cdFx0XHRzdHIgKz0gYCAke3R5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geC50b1N0cmluZygpIDogeH1gO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdHIgKz0gYCAke2Zvcm1hdEFyZyh4KX1gO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gc3RyO1xufVxuZnVuY3Rpb24gZm9ybWF0KC4uLmFyZ3MpIHtcblx0cmV0dXJuIGJhc2VGb3JtYXQoYXJncyk7XG59XG5mdW5jdGlvbiBicm93c2VyRm9ybWF0KC4uLmFyZ3MpIHtcblx0cmV0dXJuIGJhc2VGb3JtYXQoYXJncywgeyBwcmV0dGlmeU9iamVjdDogdHJ1ZSB9KTtcbn1cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRpb25zID0ge30pIHtcblx0aWYgKG9wdGlvbnMudHJ1bmNhdGUgPT09IDApIHtcblx0XHRvcHRpb25zLnRydW5jYXRlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXHR9XG5cdHJldHVybiBpbnNwZWN0JDEob2JqLCBvcHRpb25zKTtcbn1cbmZ1bmN0aW9uIG9iakRpc3BsYXkob2JqLCBvcHRpb25zID0ge30pIHtcblx0aWYgKHR5cGVvZiBvcHRpb25zLnRydW5jYXRlID09PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0b3B0aW9ucy50cnVuY2F0ZSA9IDQwO1xuXHR9XG5cdGNvbnN0IHN0ciA9IGluc3BlY3Qob2JqLCBvcHRpb25zKTtcblx0Y29uc3QgdHlwZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xuXHRpZiAob3B0aW9ucy50cnVuY2F0ZSAmJiBzdHIubGVuZ3RoID49IG9wdGlvbnMudHJ1bmNhdGUpIHtcblx0XHRpZiAodHlwZSA9PT0gXCJbb2JqZWN0IEZ1bmN0aW9uXVwiKSB7XG5cdFx0XHRjb25zdCBmbiA9IG9iajtcblx0XHRcdHJldHVybiAhZm4ubmFtZSA/IFwiW0Z1bmN0aW9uXVwiIDogYFtGdW5jdGlvbjogJHtmbi5uYW1lfV1gO1xuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiKSB7XG5cdFx0XHRyZXR1cm4gYFsgQXJyYXkoJHtvYmoubGVuZ3RofSkgXWA7XG5cdFx0fSBlbHNlIGlmICh0eXBlID09PSBcIltvYmplY3QgT2JqZWN0XVwiKSB7XG5cdFx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcblx0XHRcdGNvbnN0IGtzdHIgPSBrZXlzLmxlbmd0aCA+IDIgPyBgJHtrZXlzLnNwbGljZSgwLCAyKS5qb2luKFwiLCBcIil9LCAuLi5gIDoga2V5cy5qb2luKFwiLCBcIik7XG5cdFx0XHRyZXR1cm4gYHsgT2JqZWN0ICgke2tzdHJ9KSB9YDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHN0cjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IHsgYnJvd3NlckZvcm1hdCwgZm9ybWF0LCBmb3JtYXRSZWdFeHAsIGluc3BlY3QsIG9iakRpc3BsYXksIHN0cmluZ2lmeSB9O1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXSwibWFwcGluZ3MiOiI7O0FBRUEsTUFBTSxhQUFhO0NBQ2YsTUFBTSxDQUFDLEtBQUssS0FBSztDQUNqQixLQUFLLENBQUMsS0FBSyxLQUFLO0NBQ2hCLFFBQVEsQ0FBQyxLQUFLLEtBQUs7Q0FDbkIsV0FBVyxDQUFDLEtBQUssS0FBSztDQUV0QixTQUFTLENBQUMsS0FBSyxLQUFLO0NBQ3BCLFFBQVEsQ0FBQyxLQUFLLEtBQUs7Q0FDbkIsUUFBUSxDQUFDLEtBQUssS0FBSztDQUduQixPQUFPLENBQUMsTUFBTSxLQUFLO0NBQ25CLEtBQUssQ0FBQyxNQUFNLEtBQUs7Q0FDakIsT0FBTyxDQUFDLE1BQU0sS0FBSztDQUNuQixRQUFRLENBQUMsTUFBTSxLQUFLO0NBQ3BCLE1BQU0sQ0FBQyxNQUFNLEtBQUs7Q0FDbEIsU0FBUyxDQUFDLE1BQU0sS0FBSztDQUNyQixNQUFNLENBQUMsTUFBTSxLQUFLO0NBQ2xCLE9BQU8sQ0FBQyxNQUFNLEtBQUs7Q0FDbkIsYUFBYSxDQUFDLFFBQVEsS0FBSztDQUMzQixXQUFXLENBQUMsUUFBUSxLQUFLO0NBQ3pCLGFBQWEsQ0FBQyxRQUFRLEtBQUs7Q0FDM0IsY0FBYyxD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