@mnaoumov/typescript-lib 0.0.0 → 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 (180) hide show
  1. package/@types/debug/package.json +4 -0
  2. package/LICENSE +21 -0
  3. package/README.md +7 -1
  4. package/dist/lib/cjs/@types/debug.d.cts +21 -0
  5. package/dist/lib/cjs/abort-controller.cjs +202 -0
  6. package/dist/lib/cjs/abort-controller.d.cts +135 -0
  7. package/dist/lib/cjs/aggregate-error.cjs +98 -0
  8. package/dist/lib/cjs/aggregate-error.d.cts +24 -0
  9. package/dist/lib/cjs/array-buffer.cjs +96 -0
  10. package/dist/lib/cjs/array-buffer.d.cts +16 -0
  11. package/dist/lib/cjs/array.cjs +134 -0
  12. package/dist/lib/cjs/array.d.cts +46 -0
  13. package/dist/lib/cjs/async-events.cjs +466 -0
  14. package/dist/lib/cjs/async-events.d.cts +456 -0
  15. package/dist/lib/cjs/async-operation-hook.cjs +113 -0
  16. package/dist/lib/cjs/async-operation-hook.d.cts +59 -0
  17. package/dist/lib/cjs/async.cjs +521 -0
  18. package/dist/lib/cjs/async.d.cts +414 -0
  19. package/dist/lib/cjs/beeper.cjs +126 -0
  20. package/dist/lib/cjs/beeper.d.cts +21 -0
  21. package/dist/lib/cjs/blob.cjs +160 -0
  22. package/dist/lib/cjs/blob.d.cts +59 -0
  23. package/dist/lib/cjs/bytes.cjs +114 -0
  24. package/dist/lib/cjs/bytes.d.cts +17 -0
  25. package/dist/lib/cjs/debug-controller.cjs +80 -0
  26. package/dist/lib/cjs/debug-controller.d.cts +87 -0
  27. package/dist/lib/cjs/debug.cjs +235 -0
  28. package/dist/lib/cjs/debug.d.cts +66 -0
  29. package/dist/lib/cjs/desktop-zip-extractor.cjs +215 -0
  30. package/dist/lib/cjs/desktop-zip-extractor.d.cts +95 -0
  31. package/dist/lib/cjs/disposable.cjs +414 -0
  32. package/dist/lib/cjs/disposable.d.cts +387 -0
  33. package/dist/lib/cjs/enum.cjs +100 -0
  34. package/dist/lib/cjs/enum.d.cts +24 -0
  35. package/dist/lib/cjs/error.cjs +297 -0
  36. package/dist/lib/cjs/error.d.cts +181 -0
  37. package/dist/lib/cjs/function.cjs +141 -0
  38. package/dist/lib/cjs/function.d.cts +128 -0
  39. package/dist/lib/cjs/html-element.cjs +341 -0
  40. package/dist/lib/cjs/html-element.d.cts +199 -0
  41. package/dist/lib/cjs/index.cjs +195 -0
  42. package/dist/lib/cjs/index.d.cts +33 -0
  43. package/dist/lib/cjs/jpeg-metadata.cjs +228 -0
  44. package/dist/lib/cjs/jpeg-metadata.d.cts +42 -0
  45. package/dist/lib/cjs/library.cjs +158 -0
  46. package/dist/lib/cjs/library.d.cts +96 -0
  47. package/dist/lib/cjs/object-utils.cjs +617 -0
  48. package/dist/lib/cjs/object-utils.d.cts +298 -0
  49. package/dist/lib/cjs/path.cjs +202 -0
  50. package/dist/lib/cjs/path.d.cts +154 -0
  51. package/dist/lib/cjs/reg-exp.cjs +254 -0
  52. package/dist/lib/cjs/reg-exp.d.cts +87 -0
  53. package/dist/lib/cjs/string.cjs +326 -0
  54. package/dist/lib/cjs/string.d.cts +361 -0
  55. package/dist/lib/cjs/transformers/date-transformer.cjs +129 -0
  56. package/dist/lib/cjs/transformers/date-transformer.d.cts +39 -0
  57. package/dist/lib/cjs/transformers/group-transformer.cjs +173 -0
  58. package/dist/lib/cjs/transformers/group-transformer.d.cts +70 -0
  59. package/dist/lib/cjs/transformers/index.cjs +123 -0
  60. package/dist/lib/cjs/transformers/index.d.cts +9 -0
  61. package/dist/lib/cjs/transformers/map-transformer.cjs +129 -0
  62. package/dist/lib/cjs/transformers/map-transformer.d.cts +41 -0
  63. package/dist/lib/cjs/transformers/set-transformer.cjs +129 -0
  64. package/dist/lib/cjs/transformers/set-transformer.d.cts +39 -0
  65. package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +127 -0
  66. package/dist/lib/cjs/transformers/skip-private-property-transformer.d.cts +36 -0
  67. package/dist/lib/cjs/transformers/transformer.cjs +170 -0
  68. package/dist/lib/cjs/transformers/transformer.d.cts +70 -0
  69. package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +130 -0
  70. package/dist/lib/cjs/transformers/two-way-map-transformer.d.cts +42 -0
  71. package/dist/lib/cjs/transformers/typed-transformer.cjs +94 -0
  72. package/dist/lib/cjs/transformers/typed-transformer.d.cts +39 -0
  73. package/dist/lib/cjs/two-way-map.cjs +208 -0
  74. package/dist/lib/cjs/two-way-map.d.cts +101 -0
  75. package/dist/lib/cjs/type-guards.cjs +128 -0
  76. package/dist/lib/cjs/type-guards.d.cts +84 -0
  77. package/dist/lib/cjs/type.cjs +121 -0
  78. package/dist/lib/cjs/type.d.cts +122 -0
  79. package/dist/lib/cjs/typescript-lib-state.cjs +126 -0
  80. package/dist/lib/cjs/typescript-lib-state.d.cts +56 -0
  81. package/dist/lib/cjs/url.cjs +136 -0
  82. package/dist/lib/cjs/url.d.cts +74 -0
  83. package/dist/lib/cjs/value-provider.cjs +100 -0
  84. package/dist/lib/cjs/value-provider.d.cts +28 -0
  85. package/dist/lib/cjs/value-wrapper.cjs +144 -0
  86. package/dist/lib/cjs/value-wrapper.d.cts +47 -0
  87. package/dist/lib/esm/@types/debug.d.mts +21 -0
  88. package/dist/lib/esm/abort-controller.d.mts +135 -0
  89. package/dist/lib/esm/abort-controller.mjs +159 -0
  90. package/dist/lib/esm/aggregate-error.d.mts +24 -0
  91. package/dist/lib/esm/aggregate-error.mjs +60 -0
  92. package/dist/lib/esm/array-buffer.d.mts +16 -0
  93. package/dist/lib/esm/array-buffer.mjs +58 -0
  94. package/dist/lib/esm/array.d.mts +46 -0
  95. package/dist/lib/esm/array.mjs +93 -0
  96. package/dist/lib/esm/async-events.d.mts +456 -0
  97. package/dist/lib/esm/async-events.mjs +427 -0
  98. package/dist/lib/esm/async-operation-hook.d.mts +59 -0
  99. package/dist/lib/esm/async-operation-hook.mjs +71 -0
  100. package/dist/lib/esm/async.d.mts +414 -0
  101. package/dist/lib/esm/async.mjs +479 -0
  102. package/dist/lib/esm/beeper.d.mts +21 -0
  103. package/dist/lib/esm/beeper.mjs +88 -0
  104. package/dist/lib/esm/blob.d.mts +59 -0
  105. package/dist/lib/esm/blob.mjs +121 -0
  106. package/dist/lib/esm/bytes.d.mts +17 -0
  107. package/dist/lib/esm/bytes.mjs +76 -0
  108. package/dist/lib/esm/debug-controller.d.mts +87 -0
  109. package/dist/lib/esm/debug-controller.mjs +50 -0
  110. package/dist/lib/esm/debug.d.mts +66 -0
  111. package/dist/lib/esm/debug.mjs +185 -0
  112. package/dist/lib/esm/desktop-zip-extractor.d.mts +95 -0
  113. package/dist/lib/esm/desktop-zip-extractor.mjs +180 -0
  114. package/dist/lib/esm/disposable.d.mts +387 -0
  115. package/dist/lib/esm/disposable.mjs +360 -0
  116. package/dist/lib/esm/enum.d.mts +24 -0
  117. package/dist/lib/esm/enum.mjs +61 -0
  118. package/dist/lib/esm/error.d.mts +181 -0
  119. package/dist/lib/esm/error.mjs +248 -0
  120. package/dist/lib/esm/function.d.mts +128 -0
  121. package/dist/lib/esm/function.mjs +96 -0
  122. package/dist/lib/esm/html-element.d.mts +199 -0
  123. package/dist/lib/esm/html-element.mjs +291 -0
  124. package/dist/lib/esm/index.d.mts +33 -0
  125. package/dist/lib/esm/index.mjs +116 -0
  126. package/dist/lib/esm/jpeg-metadata.d.mts +42 -0
  127. package/dist/lib/esm/jpeg-metadata.mjs +189 -0
  128. package/dist/lib/esm/library.d.mts +96 -0
  129. package/dist/lib/esm/library.mjs +118 -0
  130. package/dist/lib/esm/object-utils.d.mts +298 -0
  131. package/dist/lib/esm/object-utils.mjs +567 -0
  132. package/dist/lib/esm/path.d.mts +154 -0
  133. package/dist/lib/esm/path.mjs +139 -0
  134. package/dist/lib/esm/reg-exp.d.mts +87 -0
  135. package/dist/lib/esm/reg-exp.mjs +213 -0
  136. package/dist/lib/esm/string.d.mts +361 -0
  137. package/dist/lib/esm/string.mjs +274 -0
  138. package/dist/lib/esm/transformers/date-transformer.d.mts +39 -0
  139. package/dist/lib/esm/transformers/date-transformer.mjs +91 -0
  140. package/dist/lib/esm/transformers/group-transformer.d.mts +70 -0
  141. package/dist/lib/esm/transformers/group-transformer.mjs +138 -0
  142. package/dist/lib/esm/transformers/index.d.mts +9 -0
  143. package/dist/lib/esm/transformers/index.mjs +68 -0
  144. package/dist/lib/esm/transformers/map-transformer.d.mts +41 -0
  145. package/dist/lib/esm/transformers/map-transformer.mjs +91 -0
  146. package/dist/lib/esm/transformers/set-transformer.d.mts +39 -0
  147. package/dist/lib/esm/transformers/set-transformer.mjs +91 -0
  148. package/dist/lib/esm/transformers/skip-private-property-transformer.d.mts +36 -0
  149. package/dist/lib/esm/transformers/skip-private-property-transformer.mjs +89 -0
  150. package/dist/lib/esm/transformers/transformer.d.mts +70 -0
  151. package/dist/lib/esm/transformers/transformer.mjs +132 -0
  152. package/dist/lib/esm/transformers/two-way-map-transformer.d.mts +42 -0
  153. package/dist/lib/esm/transformers/two-way-map-transformer.mjs +92 -0
  154. package/dist/lib/esm/transformers/typed-transformer.d.mts +39 -0
  155. package/dist/lib/esm/transformers/typed-transformer.mjs +56 -0
  156. package/dist/lib/esm/two-way-map.d.mts +101 -0
  157. package/dist/lib/esm/two-way-map.mjs +170 -0
  158. package/dist/lib/esm/type-guards.d.mts +84 -0
  159. package/dist/lib/esm/type-guards.mjs +85 -0
  160. package/dist/lib/esm/type.d.mts +122 -0
  161. package/dist/lib/esm/type.mjs +83 -0
  162. package/dist/lib/esm/typescript-lib-state.d.mts +56 -0
  163. package/dist/lib/esm/typescript-lib-state.mjs +84 -0
  164. package/dist/lib/esm/url.d.mts +74 -0
  165. package/dist/lib/esm/url.mjs +94 -0
  166. package/dist/lib/esm/value-provider.d.mts +28 -0
  167. package/dist/lib/esm/value-provider.mjs +62 -0
  168. package/dist/lib/esm/value-wrapper.d.mts +47 -0
  169. package/dist/lib/esm/value-wrapper.mjs +106 -0
  170. package/package.json +111 -13
  171. package/transformers/date-transformer/package.json +6 -0
  172. package/transformers/group-transformer/package.json +6 -0
  173. package/transformers/index/package.json +6 -0
  174. package/transformers/map-transformer/package.json +6 -0
  175. package/transformers/package.json +6 -0
  176. package/transformers/set-transformer/package.json +6 -0
  177. package/transformers/skip-private-property-transformer/package.json +6 -0
  178. package/transformers/transformer/package.json +6 -0
  179. package/transformers/two-way-map-transformer/package.json +6 -0
  180. package/transformers/typed-transformer/package.json +6 -0
@@ -0,0 +1,326 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
+ symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return '/';
17
+ },
18
+ env: {},
19
+ platform: 'android'
20
+ };
21
+
22
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
23
+ const existingProcess = globalThis.process;
24
+
25
+ if (!existingProcess) {
26
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
27
+ globalThis.process = browserProcess;
28
+ return;
29
+ }
30
+
31
+ if (existingProcess.versions?.node) {
32
+ return;
33
+ }
34
+
35
+ const existingProcessRecord = existingProcess;
36
+
37
+ for (const [key, value] of Object.entries(browserProcess)) {
38
+ existingProcessRecord[key] ??= value;
39
+ }
40
+
41
+ existingProcessRecord['browser'] = true;
42
+ }
43
+
44
+ function keepName($unknown) {
45
+ return $unknown;
46
+ }
47
+
48
+ (function initCjs() {
49
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
50
+ const globalThisRecord = globalThis;
51
+ ensureDisposeSymbols();
52
+ globalThisRecord['__name'] ??= keepName;
53
+ globalThisRecord['__extractDefault'] ??= extractDefault;
54
+
55
+ ensureBrowserProcess();
56
+
57
+ // eslint-disable-next-line unicorn/consistent-function-scoping -- Serialized with initCjs into the banner; at module scope it would be left out of it.
58
+ function extractDefault(module) {
59
+ return module && module.__esModule && 'default' in module ? module.default : module;
60
+ }
61
+ })();
62
+ })();
63
+
64
+ "use strict";
65
+ var __defProp = Object.defineProperty;
66
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
67
+ var __getOwnPropNames = Object.getOwnPropertyNames;
68
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
69
+ var __export = (target, all) => {
70
+ for (var name in all)
71
+ __defProp(target, name, { get: all[name], enumerable: true });
72
+ };
73
+ var __copyProps = (to, from, except, desc) => {
74
+ if (from && typeof from === "object" || typeof from === "function") {
75
+ for (let key of __getOwnPropNames(from))
76
+ if (!__hasOwnProp.call(to, key) && key !== except)
77
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
78
+ }
79
+ return to;
80
+ };
81
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
82
+ var string_exports = {};
83
+ __export(string_exports, {
84
+ EMPTY: () => EMPTY,
85
+ ensureEndsWith: () => ensureEndsWith,
86
+ ensureLfEndings: () => ensureLfEndings,
87
+ ensureStartsWith: () => ensureStartsWith,
88
+ escape: () => escape,
89
+ getLfNormalizedOffsetToOriginalOffsetMapper: () => getLfNormalizedOffsetToOriginalOffsetMapper,
90
+ hasSingleOccurrence: () => hasSingleOccurrence,
91
+ indent: () => indent,
92
+ insertAt: () => insertAt,
93
+ makeValidVariableName: () => makeValidVariableName,
94
+ normalizeString: () => normalizeString,
95
+ replace: () => replace,
96
+ replaceAll: () => replaceAll,
97
+ replaceAllAsync: () => replaceAllAsync,
98
+ trimEnd: () => trimEnd,
99
+ trimStart: () => trimStart,
100
+ unescape: () => unescape,
101
+ unindent: () => unindent
102
+ });
103
+ module.exports = __toCommonJS(string_exports);
104
+ var import_abort_controller = require('./abort-controller.cjs');
105
+ var import_reg_exp = require('./reg-exp.cjs');
106
+ var import_type_guards = require('./type-guards.cjs');
107
+ var import_value_provider = require('./value-provider.cjs');
108
+ const EMPTY = "";
109
+ const ESCAPE_MAP = {
110
+ "\n": String.raw`\n`,
111
+ "\r": String.raw`\r`,
112
+ " ": String.raw`\t`,
113
+ "\b": String.raw`\b`,
114
+ "\f": String.raw`\f`,
115
+ "'": String.raw`\'`,
116
+ '"': String.raw`\"`,
117
+ "\\": "\\\\"
118
+ };
119
+ const CR = "\r";
120
+ const LF = "\n";
121
+ const NOT_FOUND_INDEX = -1;
122
+ const UNESCAPE_MAP = {};
123
+ for (const [key, value] of Object.entries(ESCAPE_MAP)) {
124
+ UNESCAPE_MAP[value] = key;
125
+ }
126
+ function ensureEndsWith(params) {
127
+ const { $string, suffix } = params;
128
+ return $string.endsWith(suffix) ? $string : $string + suffix;
129
+ }
130
+ function ensureLfEndings($string) {
131
+ return $string.replaceAll(/\r\n?/g, "\n");
132
+ }
133
+ function ensureStartsWith(params) {
134
+ const { $string, prefix } = params;
135
+ return $string.startsWith(prefix) ? $string : prefix + $string;
136
+ }
137
+ function escape($string) {
138
+ return replace($string, ESCAPE_MAP);
139
+ }
140
+ function getLfNormalizedOffsetToOriginalOffsetMapper($string) {
141
+ const lfOffsetToOriginalOffsetMap = [];
142
+ for (let index = 0; index < $string.length; index++) {
143
+ if ($string[index] === CR && $string[index + 1] === LF) {
144
+ lfOffsetToOriginalOffsetMap.push(index + 1);
145
+ index++;
146
+ } else {
147
+ lfOffsetToOriginalOffsetMap.push(index);
148
+ }
149
+ }
150
+ return (lfOffset) => {
151
+ if (lfOffset < 0) {
152
+ return lfOffset;
153
+ }
154
+ if (lfOffset >= lfOffsetToOriginalOffsetMap.length) {
155
+ return lfOffset - lfOffsetToOriginalOffsetMap.length + $string.length;
156
+ }
157
+ (0, import_type_guards.assert)(lfOffsetToOriginalOffsetMap[lfOffset] !== void 0, "Could not map offset");
158
+ return lfOffsetToOriginalOffsetMap[lfOffset];
159
+ };
160
+ }
161
+ function hasSingleOccurrence(params) {
162
+ const { $string, searchValue } = params;
163
+ const firstIndex = $string.indexOf(searchValue);
164
+ const lastIndex = $string.lastIndexOf(searchValue);
165
+ return firstIndex !== NOT_FOUND_INDEX && firstIndex === lastIndex;
166
+ }
167
+ function indent(params) {
168
+ const { prefix, text } = params;
169
+ return text.split("\n").map((line) => `${prefix}${line}`).join("\n");
170
+ }
171
+ function insertAt(params) {
172
+ const {
173
+ $string,
174
+ endIndex,
175
+ startIndex,
176
+ substring
177
+ } = params;
178
+ const effectiveEndIndex = endIndex ?? startIndex;
179
+ return $string.slice(0, startIndex) + substring + $string.slice(effectiveEndIndex);
180
+ }
181
+ function makeValidVariableName($string) {
182
+ return replaceAll({
183
+ $string,
184
+ replacer: "_",
185
+ searchValue: /[^a-zA-Z0-9_]/g
186
+ });
187
+ }
188
+ function normalizeString($string) {
189
+ return replaceAll({
190
+ $string,
191
+ replacer: " ",
192
+ // eslint-disable-next-line unicorn/prefer-unicode-code-point-escapes -- These are the conventional spellings for U+00A0 and U+202F. The code-point form is only unambiguous with the `u` flag, so taking the fix would also change how the pattern is parsed.
193
+ searchValue: /\u00A0|\u202F/g
194
+ }).normalize("NFC");
195
+ }
196
+ function replace($string, replacementsMap) {
197
+ const regExp = new RegExp(Object.keys(replacementsMap).map((source) => (0, import_reg_exp.escapeRegExp)(source)).join("|"), "g");
198
+ return replaceAll({
199
+ $string,
200
+ replacer: ({ substring: source }) => (0, import_type_guards.ensureNonNullable)(replacementsMap[source]),
201
+ searchValue: regExp
202
+ });
203
+ }
204
+ function replaceAll(params) {
205
+ const { $string, replacer } = params;
206
+ let { searchValue } = params;
207
+ if (replacer === void 0) {
208
+ return $string;
209
+ }
210
+ if (searchValue instanceof RegExp && !searchValue.global) {
211
+ searchValue = new RegExp(searchValue.source, `${searchValue.flags}g`);
212
+ }
213
+ return typeof replacer === "string" ? $string.replaceAll(searchValue, replacer) : $string.replaceAll(searchValue, (substring, ...$arguments) => {
214
+ const SOURCE_INDEX_OFFSET_FOR_GROUP_ARG = 2;
215
+ const hasGroupsArgument = typeof $arguments.at(-1) === "object";
216
+ const sourceIndex = hasGroupsArgument ? $arguments.length - SOURCE_INDEX_OFFSET_FOR_GROUP_ARG : $arguments.length - 1;
217
+ const replaceArguments = {
218
+ // eslint-disable-next-line no-restricted-syntax -- Can't avoid.
219
+ capturedGroupArguments: [],
220
+ groups: hasGroupsArgument ? $arguments.at(-1) : void 0,
221
+ missingGroupIndices: [],
222
+ offset: $arguments.at(sourceIndex - 1),
223
+ source: $arguments.at(sourceIndex),
224
+ substring
225
+ };
226
+ for (let index = 0; index < sourceIndex - 1; index++) {
227
+ const item = $arguments[index];
228
+ if (typeof item === "string") {
229
+ replaceArguments.capturedGroupArguments.push(item);
230
+ } else if (item === void 0) {
231
+ replaceArguments.missingGroupIndices.push(index);
232
+ }
233
+ }
234
+ return replacer(replaceArguments) ?? replaceArguments.substring;
235
+ });
236
+ }
237
+ async function replaceAllAsync(params) {
238
+ const { $string, replacer, searchValue } = params;
239
+ let { abortSignal } = params;
240
+ abortSignal ??= (0, import_abort_controller.abortSignalNever)();
241
+ abortSignal.throwIfAborted();
242
+ if (typeof replacer === "string") {
243
+ return replaceAll({
244
+ $string,
245
+ replacer,
246
+ searchValue
247
+ });
248
+ }
249
+ const replacementAsyncFns = [];
250
+ replaceAll({
251
+ $string,
252
+ replacer: ($arguments) => {
253
+ replacementAsyncFns.push(() => (0, import_value_provider.resolveValue)(replacer, { abortSignal, ...$arguments }));
254
+ return "";
255
+ },
256
+ searchValue
257
+ });
258
+ const replacements = [];
259
+ for (const asyncFunction of replacementAsyncFns) {
260
+ abortSignal.throwIfAborted();
261
+ replacements.push(await asyncFunction());
262
+ }
263
+ abortSignal.throwIfAborted();
264
+ return replaceAll({
265
+ $string,
266
+ replacer: ($arguments) => replacements.shift() ?? $arguments.substring,
267
+ searchValue
268
+ });
269
+ }
270
+ function trimEnd(params) {
271
+ const { $string, shouldValidate, suffix } = params;
272
+ if ($string.endsWith(suffix)) {
273
+ return $string.slice(0, -suffix.length);
274
+ }
275
+ if (shouldValidate) {
276
+ throw new Error(`String ${$string} does not end with suffix ${suffix}`);
277
+ }
278
+ return $string;
279
+ }
280
+ function trimStart(params) {
281
+ const { $string, prefix, shouldValidate } = params;
282
+ if ($string.startsWith(prefix)) {
283
+ return $string.slice(prefix.length);
284
+ }
285
+ if (shouldValidate) {
286
+ throw new Error(`String ${$string} does not start with prefix ${prefix}`);
287
+ }
288
+ return $string;
289
+ }
290
+ function unescape($string) {
291
+ return replace($string, UNESCAPE_MAP);
292
+ }
293
+ function unindent(params) {
294
+ const { prefix, shouldThrowIfNotIndented = false, text } = params;
295
+ return text.split("\n").map((line) => {
296
+ if (line.startsWith(prefix)) {
297
+ return line.slice(prefix.length);
298
+ }
299
+ if (shouldThrowIfNotIndented) {
300
+ throw new Error(`Line "${line}" is not indented with "${prefix}"`);
301
+ }
302
+ return line;
303
+ }).join("\n");
304
+ }
305
+ // Annotate the CommonJS export names for ESM import in node:
306
+ 0 && (module.exports = {
307
+ EMPTY,
308
+ ensureEndsWith,
309
+ ensureLfEndings,
310
+ ensureStartsWith,
311
+ escape,
312
+ getLfNormalizedOffsetToOriginalOffsetMapper,
313
+ hasSingleOccurrence,
314
+ indent,
315
+ insertAt,
316
+ makeValidVariableName,
317
+ normalizeString,
318
+ replace,
319
+ replaceAll,
320
+ replaceAllAsync,
321
+ trimEnd,
322
+ trimStart,
323
+ unescape,
324
+ unindent
325
+ });
326
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3N0cmluZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBzdHJpbmcgb3BlcmF0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHsgVmFsdWVQcm92aWRlciB9IGZyb20gJy4vdmFsdWUtcHJvdmlkZXIudHMnO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbE5ldmVyIH0gZnJvbSAnLi9hYm9ydC1jb250cm9sbGVyLnRzJztcbmltcG9ydCB7IGVzY2FwZVJlZ0V4cCB9IGZyb20gJy4vcmVnLWV4cC50cyc7XG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIGVuc3VyZU5vbk51bGxhYmxlXG59IGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHsgcmVzb2x2ZVZhbHVlIH0gZnJvbSAnLi92YWx1ZS1wcm92aWRlci50cyc7XG5cbi8qKlxuICogQW4gZW1wdHkgc3RyaW5nIGNvbnN0YW50LlxuICpcbiAqIEEgc2hhcmVkIHNlbnRpbmVsIGZvciB0aGUgYCR7RU1QVFl9YCBwcmVmaXggdGhhdCBzaWxlbmNlcyB0aGUgYG9ic2lkaWFubWQvdWkvc2VudGVuY2UtY2FzZWAgRVNMaW50XG4gKiBmYWxzZSBwb3NpdGl2ZSBvbiBsZWdpdGltYXRlIGxvd2VyLWNhc2UgVUkgdGV4dCAoZS5nLiBgY3Vyc29yYCBjb2xsaWRpbmcgd2l0aCB0aGUgYEN1cnNvcmAgYnJhbmQpLlxuICogYHNldE5hbWUoYCR7RU1QVFl9Li4uYXQgY3Vyc29yLi4uYClgIHJlbmRlcnMgYnl0ZS1pZGVudGljYWwgYCcnYCBhdCBydW50aW1lIHdoaWxlIHRoZSBgey4uLn1gXG4gKiBwbGFjZWhvbGRlciBtYWtlcyB0aGUgcnVsZSBza2lwIHRoZSBzdHJpbmcuIENvbnN1bWVycyBpbXBvcnQgdGhpcyBpbnN0ZWFkIG9mIHJlZGVmaW5pbmcgYSBwZXItZmlsZVxuICogYGNvbnN0IEVNUFRZID0gJydgLlxuICovXG5leHBvcnQgY29uc3QgRU1QVFkgPSAnJztcblxuLyoqXG4gKiBBIHN5bmNocm9ub3VzL2FzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyByZXBsYWNlbWVudCBzdHJpbmdzLCBvciBhIHN0cmluZyB0byByZXBsYWNlIHdpdGguXG4gKlxuICogQHR5cGVQYXJhbSBDYXB0dXJlZEdyb3VwQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBjYXB0dXJlZCBncm91cCBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIEFzeW5jUmVwbGFjZXI8Q2FwdHVyZWRHcm91cEFyZ3VtZW50cyBleHRlbmRzIHN0cmluZ1tdPiA9IFZhbHVlUHJvdmlkZXI8U3RyaW5nUmVwbGFjZW1lbnQsIFJlcGxhY2VBcmd1bWVudHM8Q2FwdHVyZWRHcm91cEFyZ3VtZW50cz4+O1xuXG4vKipcbiAqIENvbW1vbiBhcmd1bWVudHMgZm9yIHRoZSBgcmVwbGFjZUFsbGAvYHJlcGxhY2VBbGxBc3luY2AgZnVuY3Rpb25zLlxuICpcbiAqIEB0eXBlUGFyYW0gQ2FwdHVyZWRHcm91cEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgY2FwdHVyZWQgZ3JvdXAgYXJndW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcGxhY2VBcmd1bWVudHM8Q2FwdHVyZWRHcm91cEFyZ3VtZW50cyBleHRlbmRzIHN0cmluZ1tdPiB7XG4gIC8qKlxuICAgKiBDYXB0dXJlZCBncm91cCBhcmd1bWVudHMuXG4gICAqL1xuICBjYXB0dXJlZEdyb3VwQXJndW1lbnRzOiBDYXB0dXJlZEdyb3VwQXJndW1lbnRzO1xuXG4gIC8qKlxuICAgKiBHcm91cHMgb2YgdGhlIG1hdGNoLlxuICAgKi9cbiAgZ3JvdXBzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbmRpY2VzIG9mIHRoZSBncm91cHMgdGhhdCB3ZXJlIG5vdCBmb3VuZCBpbiB0aGUgbWF0Y2guXG4gICAqL1xuICBtaXNzaW5nR3JvdXBJbmRpY2VzOiBudW1iZXJbXTtcblxuICAvKipcbiAgICogQW4gb2Zmc2V0IG9mIHRoZSBtYXRjaC5cbiAgICovXG4gIG9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBvZiB0aGUgbWF0Y2guXG4gICAqL1xuICBzb3VyY2U6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdWJzdHJpbmcgb2YgdGhlIG1hdGNoLlxuICAgKi9cbiAgc3Vic3RyaW5nOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyByZXBsYWNlbWVudCBzdHJpbmdzLCBvciBhIHN0cmluZyB0byByZXBsYWNlIHdpdGguXG4gKlxuICogQHR5cGVQYXJhbSBDYXB0dXJlZEdyb3VwQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBjYXB0dXJlZCBncm91cCBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIFJlcGxhY2VyPENhcHR1cmVkR3JvdXBBcmd1bWVudHMgZXh0ZW5kcyBzdHJpbmdbXT4gPSAoKCRhcmd1bWVudHM6IFJlcGxhY2VBcmd1bWVudHM8Q2FwdHVyZWRHcm91cEFyZ3VtZW50cz4pID0+IFN0cmluZ1JlcGxhY2VtZW50KSB8IFN0cmluZ1JlcGxhY2VtZW50O1xuXG50eXBlIFN0cmluZ1JlcGxhY2VtZW50ID0gTWF5YmVSZXR1cm48c3RyaW5nPjtcblxuLyoqXG4gKiBNYXBwaW5nIG9mIHNwZWNpYWwgY2hhcmFjdGVycyB0byB0aGVpciBlc2NhcGVkIGNvdW50ZXJwYXJ0cy5cbiAqL1xuY29uc3QgRVNDQVBFX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ1xcbic6IFN0cmluZy5yYXdgXFxuYCxcbiAgJ1xccic6IFN0cmluZy5yYXdgXFxyYCxcbiAgJ1xcdCc6IFN0cmluZy5yYXdgXFx0YCxcbiAgJ1xcYic6IFN0cmluZy5yYXdgXFxiYCxcbiAgJ1xcZic6IFN0cmluZy5yYXdgXFxmYCxcbiAgJ1xcJyc6IFN0cmluZy5yYXdgXFwnYCxcbiAgJ1wiJzogU3RyaW5nLnJhd2BcXFwiYCxcbiAgJ1xcXFwnOiAnXFxcXFxcXFwnXG59IGFzIGNvbnN0O1xuXG5jb25zdCBDUiA9ICdcXHInO1xuY29uc3QgTEYgPSAnXFxuJztcbmNvbnN0IE5PVF9GT1VORF9JTkRFWCA9IC0xO1xuXG4vKipcbiAqIE1hcHBpbmcgb2YgZXNjYXBlZCBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gdGhlaXIgdW5lc2NhcGVkIGNvdW50ZXJwYXJ0cy5cbiAqL1xuY29uc3QgVU5FU0NBUEVfTUFQOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5mb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhFU0NBUEVfTUFQKSkge1xuICBVTkVTQ0FQRV9NQVBbdmFsdWVdID0ga2V5O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlbnN1cmVFbmRzV2l0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5zdXJlRW5kc1dpdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHN0cmluZyB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5ICRzdHJpbmc6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHN1ZmZpeCB0byBlbnN1cmUuXG4gICAqL1xuICByZWFkb25seSBzdWZmaXg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5zdXJlU3RhcnRzV2l0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5zdXJlU3RhcnRzV2l0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIHRvIGNoZWNrLlxuICAgKi9cbiAgcmVhZG9ubHkgJHN0cmluZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IHRvIGVuc3VyZS5cbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBoYXNTaW5nbGVPY2N1cnJlbmNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIYXNTaW5nbGVPY2N1cnJlbmNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBzdHJpbmcgdG8gY2hlY2suXG4gICAqL1xuICByZWFkb25seSAkc3RyaW5nOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWFyY2ggdmFsdWUgdG8gY2hlY2sgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VhcmNoVmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW5kZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmRlbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHByZWZpeCB0byBhZGQgdG8gZWFjaCBsaW5lLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJpbmcgdG8gaW5kZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBpbnNlcnRBdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0QXRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHN0cmluZyB0byBpbnNlcnQgdGhlIHN1YnN0cmluZyBpbnRvLlxuICAgKi9cbiAgcmVhZG9ubHkgJHN0cmluZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5kZXggdG8gZW5kIHRoZSBzdWJzdHJpbmcgYXQuXG4gICAqL1xuICByZWFkb25seSBlbmRJbmRleD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGluZGV4IHRvIGluc2VydCB0aGUgc3Vic3RyaW5nIGF0LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRJbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3Vic3RyaW5nIHRvIGluc2VydC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnN0cmluZzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXBsYWNlQWxsQXN5bmN9LlxuICpcbiAqIEB0eXBlUGFyYW0gUmVwbGFjZUdyb3VwQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBjYXB0dXJlZCBncm91cCBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwbGFjZUFsbEFzeW5jUGFyYW1zPFJlcGxhY2VHcm91cEFyZ3VtZW50cyBleHRlbmRzIHN0cmluZ1tdPiB7XG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIGluIHdoaWNoIHRvIHBlcmZvcm0gcmVwbGFjZW1lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgJHN0cmluZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBIHN5bmNocm9ub3VzL2FzeW5jaHJvbm91cyBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyByZXBsYWNlbWVudCBzdHJpbmdzLCBvciBhIHN0cmluZyB0byByZXBsYWNlIHdpdGguXG4gICAqL1xuICByZWFkb25seSByZXBsYWNlcjogQXN5bmNSZXBsYWNlcjxSZXBsYWNlR3JvdXBBcmd1bWVudHM+O1xuXG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VhcmNoVmFsdWU6IFJlZ0V4cCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVwbGFjZUFsbH0uXG4gKlxuICogQHR5cGVQYXJhbSBDYXB0dXJlZEdyb3VwQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBjYXB0dXJlZCBncm91cCBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVwbGFjZUFsbFBhcmFtczxDYXB0dXJlZEdyb3VwQXJndW1lbnRzIGV4dGVuZHMgc3RyaW5nW10+IHtcbiAgLyoqXG4gICAqIFRoZSBzdHJpbmcgaW4gd2hpY2ggdG8gcGVyZm9ybSByZXBsYWNlbWVudHMuXG4gICAqL1xuICByZWFkb25seSAkc3RyaW5nOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcmVwbGFjZXIgZnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgcmVwbGFjZW1lbnQgc3RyaW5ncywgb3IgYSBzdHJpbmcgdG8gcmVwbGFjZSB3aXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwbGFjZXI6IFJlcGxhY2VyPENhcHR1cmVkR3JvdXBBcmd1bWVudHM+O1xuXG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzZWFyY2ggZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VhcmNoVmFsdWU6IFJlZ0V4cCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdHJpbUVuZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJpbUVuZFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAqL1xuICByZWFkb25seSAkc3RyaW5nOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBzdHJpbmcgZG9lcyBub3QgZW5kIHdpdGggdGhlIHN1ZmZpeC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmFsaWRhdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc3VmZml4IHRvIHJlbW92ZSBmcm9tIHRoZSBlbmQgb2YgdGhlIHN0cmluZy5cbiAgICovXG4gIHJlYWRvbmx5IHN1ZmZpeDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB0cmltU3RhcnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyaW1TdGFydFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAqL1xuICByZWFkb25seSAkc3RyaW5nOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmVmaXggdG8gcmVtb3ZlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBwcmVmaXg6IHN0cmluZztcblxuICAvKipcbiAgICogSWYgYHRydWVgLCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIHN0cmluZyBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBwcmVmaXguXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFZhbGlkYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdW5pbmRlbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaW5kZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwcmVmaXggdG8gcmVtb3ZlIGZyb20gZWFjaCBsaW5lLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgdGhyb3dzIGFuIGVycm9yIGlmIGEgbGluZSBpcyBub3QgaW5kZW50ZWQgd2l0aCB0aGUgcHJlZml4LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUaHJvd0lmTm90SW5kZW50ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RyaW5nIHRvIHVuaW5kZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCBhIHN0cmluZyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCBzdWZmaXgsIGFkZGluZyBpdCBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHN0cmluZyB0aGF0IGVuZHMgd2l0aCB0aGUgc3VmZml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlRW5kc1dpdGgocGFyYW1zOiBFbnN1cmVFbmRzV2l0aFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgJHN0cmluZywgc3VmZml4IH0gPSBwYXJhbXM7XG4gIHJldHVybiAkc3RyaW5nLmVuZHNXaXRoKHN1ZmZpeCkgPyAkc3RyaW5nIDogJHN0cmluZyArIHN1ZmZpeDtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgYSBzdHJpbmcgaGFzIGBMRmAgbGluZSBlbmRpbmdzLlxuICpcbiAqIEl0IHJlcGxhY2VzIGBDUkxGYCBsaW5lIGVuZGluZ3Mgd2l0aCBgTEZgLlxuICpcbiAqIEBwYXJhbSAkc3RyaW5nIC0gVGhlIHN0cmluZy5cbiAqIEByZXR1cm5zIFRoZSBzdHJpbmcgd2l0aCBgTEZgIGxpbmUgZW5kaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUxmRW5kaW5ncygkc3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gJHN0cmluZy5yZXBsYWNlQWxsKC9cXHJcXG4/L2csICdcXG4nKTtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgYSBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIGFkZGluZyBpdCBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBwcmVmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVTdGFydHNXaXRoKHBhcmFtczogRW5zdXJlU3RhcnRzV2l0aFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgJHN0cmluZywgcHJlZml4IH0gPSBwYXJhbXM7XG4gIHJldHVybiAkc3RyaW5nLnN0YXJ0c1dpdGgocHJlZml4KSA/ICRzdHJpbmcgOiBwcmVmaXggKyAkc3RyaW5nO1xufVxuXG4vKipcbiAqIEVzY2FwZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSAkc3RyaW5nIC0gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyBUaGUgZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGUoJHN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2UoJHN0cmluZywgRVNDQVBFX01BUCk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgbWFwcyBMRi1ub3JtYWxpemVkIG9mZnNldHMgdG8gb3JpZ2luYWwgb2Zmc2V0cy5cbiAqXG4gKiBAcGFyYW0gJHN0cmluZyAtIFRoZSBzdHJpbmcgdG8gZ2V0IHRoZSBMRi1ub3JtYWxpemVkIGluZGljZXMgZnJvbS5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBtYXBzIExGLW5vcm1hbGl6ZWQgb2Zmc2V0cyB0byBvcmlnaW5hbCBvZmZzZXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGZOb3JtYWxpemVkT2Zmc2V0VG9PcmlnaW5hbE9mZnNldE1hcHBlcigkc3RyaW5nOiBzdHJpbmcpOiAobGZPZmZzZXQ6IG51bWJlcikgPT4gbnVtYmVyIHtcbiAgY29uc3QgbGZPZmZzZXRUb09yaWdpbmFsT2Zmc2V0TWFwOiBudW1iZXJbXSA9IFtdO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCAkc3RyaW5nLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGlmICgkc3RyaW5nW2luZGV4XSA9PT0gQ1IgJiYgJHN0cmluZ1tpbmRleCArIDFdID09PSBMRikge1xuICAgICAgbGZPZmZzZXRUb09yaWdpbmFsT2Zmc2V0TWFwLnB1c2goaW5kZXggKyAxKTtcbiAgICAgIGluZGV4Kys7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxmT2Zmc2V0VG9PcmlnaW5hbE9mZnNldE1hcC5wdXNoKGluZGV4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKGxmT2Zmc2V0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgIGlmIChsZk9mZnNldCA8IDApIHtcbiAgICAgIHJldHVybiBsZk9mZnNldDtcbiAgICB9XG4gICAgaWYgKGxmT2Zmc2V0ID49IGxmT2Zmc2V0VG9PcmlnaW5hbE9mZnNldE1hcC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBsZk9mZnNldCAtIGxmT2Zmc2V0VG9PcmlnaW5hbE9mZnNldE1hcC5sZW5ndGggKyAkc3RyaW5nLmxlbmd0aDtcbiAgICB9XG5cbiAgICBhc3NlcnQobGZPZmZzZXRUb09yaWdpbmFsT2Zmc2V0TWFwW2xmT2Zmc2V0XSAhPT0gdW5kZWZpbmVkLCAnQ291bGQgbm90IG1hcCBvZmZzZXQnKTtcbiAgICByZXR1cm4gbGZPZmZzZXRUb09yaWdpbmFsT2Zmc2V0TWFwW2xmT2Zmc2V0XTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBzdHJpbmcgaGFzIGEgc2luZ2xlIG9jY3VycmVuY2Ugb2YgYSBzZWFyY2ggdmFsdWUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBzdHJpbmcgaGFzIGEgc2luZ2xlIG9jY3VycmVuY2Ugb2YgdGhlIHNlYXJjaCB2YWx1ZSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNTaW5nbGVPY2N1cnJlbmNlKHBhcmFtczogSGFzU2luZ2xlT2NjdXJyZW5jZVBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7ICRzdHJpbmcsIHNlYXJjaFZhbHVlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGZpcnN0SW5kZXggPSAkc3RyaW5nLmluZGV4T2Yoc2VhcmNoVmFsdWUpO1xuICBjb25zdCBsYXN0SW5kZXggPSAkc3RyaW5nLmxhc3RJbmRleE9mKHNlYXJjaFZhbHVlKTtcbiAgcmV0dXJuIGZpcnN0SW5kZXggIT09IE5PVF9GT1VORF9JTkRFWCAmJiBmaXJzdEluZGV4ID09PSBsYXN0SW5kZXg7XG59XG5cbi8qKlxuICogSW5kZW50cyBhIHN0cmluZyBieSBhZGRpbmcgYSBwcmVmaXggdG8gZWFjaCBsaW5lLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBpbmRlbnRlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRlbnQocGFyYW1zOiBJbmRlbnRQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IHByZWZpeCwgdGV4dCB9ID0gcGFyYW1zO1xuICByZXR1cm4gdGV4dC5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiBgJHtwcmVmaXh9JHtsaW5lfWApLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIEluc2VydHMgYSBzdWJzdHJpbmcgYXQgYSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIG1vZGlmaWVkIHN0cmluZyB3aXRoIHRoZSBzdWJzdHJpbmcgaW5zZXJ0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRBdChwYXJhbXM6IEluc2VydEF0UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgICRzdHJpbmcsXG4gICAgZW5kSW5kZXgsXG4gICAgc3RhcnRJbmRleCxcbiAgICBzdWJzdHJpbmdcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgZWZmZWN0aXZlRW5kSW5kZXggPSBlbmRJbmRleCA/PyBzdGFydEluZGV4O1xuICByZXR1cm4gJHN0cmluZy5zbGljZSgwLCBzdGFydEluZGV4KSArIHN1YnN0cmluZyArICRzdHJpbmcuc2xpY2UoZWZmZWN0aXZlRW5kSW5kZXgpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc3RyaW5nIGludG8gYSB2YWxpZCBKYXZhU2NyaXB0IHZhcmlhYmxlIG5hbWUgYnkgcmVwbGFjaW5nIGludmFsaWQgY2hhcmFjdGVycyB3aXRoIHVuZGVyc2NvcmVzLlxuICpcbiAqIEBwYXJhbSAkc3RyaW5nIC0gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHJldHVybnMgVGhlIHZhbGlkIHZhcmlhYmxlIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVmFsaWRWYXJpYWJsZU5hbWUoJHN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmcsXG4gICAgcmVwbGFjZXI6ICdfJyxcbiAgICBzZWFyY2hWYWx1ZTogL1teYS16QS1aMC05X10vZ1xuICB9KTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgc3RyaW5nIGJ5IGNvbnZlcnRpbmcgaXQgdG8gdGhlIE5GQyBmb3JtIGFuZCByZXBsYWNpbmcgbm9uLWJyZWFraW5nIHNwYWNlcyB3aXRoIHJlZ3VsYXIgc3BhY2VzLlxuICpcbiAqIEBwYXJhbSAkc3RyaW5nIC0gVGhlIHN0cmluZyB0byBub3JtYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTdHJpbmcoJHN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmcsXG4gICAgcmVwbGFjZXI6ICcgJyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItdW5pY29kZS1jb2RlLXBvaW50LWVzY2FwZXMgLS0gVGhlc2UgYXJlIHRoZSBjb252ZW50aW9uYWwgc3BlbGxpbmdzIGZvciBVKzAwQTAgYW5kIFUrMjAyRi4gVGhlIGNvZGUtcG9pbnQgZm9ybSBpcyBvbmx5IHVuYW1iaWd1b3VzIHdpdGggdGhlIGB1YCBmbGFnLCBzbyB0YWtpbmcgdGhlIGZpeCB3b3VsZCBhbHNvIGNoYW5nZSBob3cgdGhlIHBhdHRlcm4gaXMgcGFyc2VkLlxuICAgIHNlYXJjaFZhbHVlOiAvXFx1MDBBMHxcXHUyMDJGL2dcbiAgfSkubm9ybWFsaXplKCdORkMnKTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlcyBvY2N1cnJlbmNlcyBvZiBzdHJpbmdzIGluIGEgZ2l2ZW4gc3RyaW5nIGJhc2VkIG9uIGEgcmVwbGFjZW1lbnRzIG1hcC5cbiAqXG4gKiBAcGFyYW0gJHN0cmluZyAtIFRoZSBzdHJpbmcgdG8gcGVyZm9ybSByZXBsYWNlbWVudHMgb24uXG4gKiBAcGFyYW0gcmVwbGFjZW1lbnRzTWFwIC0gQW4gb2JqZWN0IG1hcHBpbmcgc3RyaW5ncyB0byB0aGVpciByZXBsYWNlbWVudCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBUaGUgbW9kaWZpZWQgc3RyaW5nIHdpdGggcmVwbGFjZW1lbnRzIGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlKCRzdHJpbmc6IHN0cmluZywgcmVwbGFjZW1lbnRzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyhyZXBsYWNlbWVudHNNYXApLm1hcCgoc291cmNlKSA9PiBlc2NhcGVSZWdFeHAoc291cmNlKSkuam9pbignfCcpLCAnZycpO1xuICByZXR1cm4gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZyxcbiAgICByZXBsYWNlcjogKHsgc3Vic3RyaW5nOiBzb3VyY2UgfSkgPT4gZW5zdXJlTm9uTnVsbGFibGUocmVwbGFjZW1lbnRzTWFwW3NvdXJjZV0pLFxuICAgIHNlYXJjaFZhbHVlOiByZWdFeHBcbiAgfSk7XG59XG5cbi8qKlxuICogUmVwbGFjZXMgYWxsIG9jY3VycmVuY2VzIG9mIGEgc2VhcmNoIHN0cmluZyBvciBwYXR0ZXJuIHdpdGggdGhlIHJlc3VsdHMgb2YgYW4gcmVwbGFjZXIgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBDYXB0dXJlZEdyb3VwQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBjYXB0dXJlZCBncm91cCBhcmd1bWVudHMuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgc3RyaW5nIHdpdGggYWxsIHJlcGxhY2VtZW50cyBtYWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUFsbDxDYXB0dXJlZEdyb3VwQXJndW1lbnRzIGV4dGVuZHMgc3RyaW5nW10+KHBhcmFtczogUmVwbGFjZUFsbFBhcmFtczxDYXB0dXJlZEdyb3VwQXJndW1lbnRzPik6IHN0cmluZyB7XG4gIGNvbnN0IHsgJHN0cmluZywgcmVwbGFjZXIgfSA9IHBhcmFtcztcbiAgbGV0IHsgc2VhcmNoVmFsdWUgfSA9IHBhcmFtcztcbiAgaWYgKHJlcGxhY2VyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJHN0cmluZztcbiAgfVxuXG4gIGlmIChzZWFyY2hWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCAmJiAhc2VhcmNoVmFsdWUuZ2xvYmFsKSB7XG4gICAgc2VhcmNoVmFsdWUgPSBuZXcgUmVnRXhwKHNlYXJjaFZhbHVlLnNvdXJjZSwgYCR7c2VhcmNoVmFsdWUuZmxhZ3N9Z2ApO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVvZiByZXBsYWNlciA9PT0gJ3N0cmluZydcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby11bnNhZmUtc3RyaW5nLXJlcGxhY2VtZW50IC0tIFRoZSBwYXNzLXRocm91Z2ggaXMgbG9hZC1iZWFyaW5nOiBjYWxsZXJzIHJlbHkgb24gYCQmYCBhbmQgZnJpZW5kcyBiZWluZyBleHBhbmRlZC4gYGVzY2FwZUFsaWFzYCBwYXNzZXMgYFxcJCZgIHRvIHByZWZpeCBlYWNoIG1hdGNoZWQgY2hhcmFjdGVyIHdpdGggYSBiYWNrc2xhc2gsIGFuZCBgY2xpLXV0aWxzYCBwYXNzZXMgYF4kJmAuIEluc2VydGluZyB0aGUgc3RyaW5nIGxpdGVyYWxseSB3b3VsZCBicmVhayBib3RoLlxuICAgID8gJHN0cmluZy5yZXBsYWNlQWxsKHNlYXJjaFZhbHVlLCByZXBsYWNlcilcbiAgICA6ICRzdHJpbmcucmVwbGFjZUFsbChzZWFyY2hWYWx1ZSwgKHN1YnN0cmluZzogc3RyaW5nLCAuLi4kYXJndW1lbnRzOiB1bmtub3duW10pID0+IHtcbiAgICAgIGNvbnN0IFNPVVJDRV9JTkRFWF9PRkZTRVRfRk9SX0dST1VQX0FSRyA9IDI7XG4gICAgICBjb25zdCBoYXNHcm91cHNBcmd1bWVudCA9IHR5cGVvZiAkYXJndW1lbnRzLmF0KC0xKSA9PT0gJ29iamVjdCc7XG4gICAgICBjb25zdCBzb3VyY2VJbmRleCA9IGhhc0dyb3Vwc0FyZ3VtZW50ID8gJGFyZ3VtZW50cy5sZW5ndGggLSBTT1VSQ0VfSU5ERVhfT0ZGU0VUX0ZPUl9HUk9VUF9BUkcgOiAkYXJndW1lbnRzLmxlbmd0aCAtIDE7XG5cbiAgICAgIGNvbnN0IHJlcGxhY2VBcmd1bWVudHM6IFJlcGxhY2VBcmd1bWVudHM8Q2FwdHVyZWRHcm91cEFyZ3VtZW50cz4gPSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBDYW4ndCBhdm9pZC5cbiAgICAgICAgY2FwdHVyZWRHcm91cEFyZ3VtZW50czogW10gYXMgdW5rbm93bltdIGFzIENhcHR1cmVkR3JvdXBBcmd1bWVudHMsXG4gICAgICAgIGdyb3VwczogaGFzR3JvdXBzQXJndW1lbnQgPyAkYXJndW1lbnRzLmF0KC0xKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IDogdW5kZWZpbmVkLFxuICAgICAgICBtaXNzaW5nR3JvdXBJbmRpY2VzOiBbXSxcbiAgICAgICAgb2Zmc2V0OiAkYXJndW1lbnRzLmF0KHNvdXJjZUluZGV4IC0gMSkgYXMgbnVtYmVyLFxuICAgICAgICBzb3VyY2U6ICRhcmd1bWVudHMuYXQoc291cmNlSW5kZXgpIGFzIHN0cmluZyxcbiAgICAgICAgc3Vic3RyaW5nXG4gICAgICB9O1xuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlSW5kZXggLSAxOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSAkYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJlcGxhY2VBcmd1bWVudHMuY2FwdHVyZWRHcm91cEFyZ3VtZW50cy5wdXNoKGl0ZW0pO1xuICAgICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSB2OCB0cmFja3MgdGhlIGltcGxpY2l0IGVsc2UgYnJhbmNoIHRoYXQgbmV2ZXIgaGFwcGVucy4gKi9cbiAgICAgICAgfSBlbHNlIGlmIChpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgICAgIHJlcGxhY2VBcmd1bWVudHMubWlzc2luZ0dyb3VwSW5kaWNlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gKHJlcGxhY2VyKHJlcGxhY2VBcmd1bWVudHMpIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gcmVwbGFjZUFyZ3VtZW50cy5zdWJzdHJpbmc7XG4gICAgfSk7XG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgcmVwbGFjZXMgYWxsIG9jY3VycmVuY2VzIG9mIGEgc2VhcmNoIHN0cmluZyBvciBwYXR0ZXJuIHdpdGggdGhlIHJlc3VsdHMgb2YgYW4gYXN5bmNocm9ub3VzIHJlcGxhY2VyIGZ1bmN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gUmVwbGFjZUdyb3VwQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBjYXB0dXJlZCBncm91cCBhcmd1bWVudHMuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzdHJpbmcgd2l0aCBhbGwgcmVwbGFjZW1lbnRzIG1hZGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXBsYWNlQWxsQXN5bmM8UmVwbGFjZUdyb3VwQXJndW1lbnRzIGV4dGVuZHMgc3RyaW5nW10+KHBhcmFtczogUmVwbGFjZUFsbEFzeW5jUGFyYW1zPFJlcGxhY2VHcm91cEFyZ3VtZW50cz4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7ICRzdHJpbmcsIHJlcGxhY2VyLCBzZWFyY2hWYWx1ZSB9ID0gcGFyYW1zO1xuICBsZXQgeyBhYm9ydFNpZ25hbCB9ID0gcGFyYW1zO1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICBpZiAodHlwZW9mIHJlcGxhY2VyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiByZXBsYWNlQWxsKHtcbiAgICAgICRzdHJpbmcsXG4gICAgICByZXBsYWNlcixcbiAgICAgIHNlYXJjaFZhbHVlXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCByZXBsYWNlbWVudEFzeW5jRm5zOiAoKCkgPT4gUHJvbWlzZTxTdHJpbmdSZXBsYWNlbWVudD4pW10gPSBbXTtcblxuICByZXBsYWNlQWxsPFJlcGxhY2VHcm91cEFyZ3VtZW50cz4oe1xuICAgICRzdHJpbmcsXG4gICAgcmVwbGFjZXI6ICgkYXJndW1lbnRzKSA9PiB7XG4gICAgICByZXBsYWNlbWVudEFzeW5jRm5zLnB1c2goKCkgPT4gcmVzb2x2ZVZhbHVlKHJlcGxhY2VyLCB7IGFib3J0U2lnbmFsLCAuLi4kYXJndW1lbnRzIH0pKTtcbiAgICAgIHJldHVybiAnJztcbiAgICB9LFxuICAgIHNlYXJjaFZhbHVlXG4gIH0pO1xuXG4gIGNvbnN0IHJlcGxhY2VtZW50czogU3RyaW5nUmVwbGFjZW1lbnRbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgYXN5bmNGdW5jdGlvbiBvZiByZXBsYWNlbWVudEFzeW5jRm5zKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICByZXBsYWNlbWVudHMucHVzaChhd2FpdCBhc3luY0Z1bmN0aW9uKCkpO1xuICB9XG5cbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgcmV0dXJuIHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmcsXG4gICAgcmVwbGFjZXI6ICgkYXJndW1lbnRzKTogc3RyaW5nID0+IHJlcGxhY2VtZW50cy5zaGlmdCgpID8/ICRhcmd1bWVudHMuc3Vic3RyaW5nLFxuICAgIHNlYXJjaFZhbHVlXG4gIH0pO1xufVxuXG4vKipcbiAqIFRyaW1zIHRoZSBzcGVjaWZpZWQgc3VmZml4IGZyb20gdGhlIGVuZCBvZiBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgdHJpbW1lZCBzdHJpbmcuXG4gKiBAdGhyb3dzIElmIGBzaG91bGRWYWxpZGF0ZWAgaXMgYHRydWVgIGFuZCB0aGUgc3RyaW5nIGRvZXMgbm90IGVuZCB3aXRoIHRoZSBzdWZmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltRW5kKHBhcmFtczogVHJpbUVuZFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgJHN0cmluZywgc2hvdWxkVmFsaWRhdGUsIHN1ZmZpeCB9ID0gcGFyYW1zO1xuICBpZiAoJHN0cmluZy5lbmRzV2l0aChzdWZmaXgpKSB7XG4gICAgcmV0dXJuICRzdHJpbmcuc2xpY2UoMCwgLXN1ZmZpeC5sZW5ndGgpO1xuICB9XG5cbiAgaWYgKHNob3VsZFZhbGlkYXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcgJHskc3RyaW5nfSBkb2VzIG5vdCBlbmQgd2l0aCBzdWZmaXggJHtzdWZmaXh9YCk7XG4gIH1cblxuICByZXR1cm4gJHN0cmluZztcbn1cblxuLyoqXG4gKiBUcmltcyB0aGUgc3BlY2lmaWVkIHByZWZpeCBmcm9tIHRoZSBzdGFydCBvZiBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgdHJpbW1lZCBzdHJpbmcuXG4gKiBAdGhyb3dzIElmIGBzaG91bGRWYWxpZGF0ZWAgaXMgYHRydWVgIGFuZCB0aGUgc3RyaW5nIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIHByZWZpeC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW1TdGFydChwYXJhbXM6IFRyaW1TdGFydFBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgJHN0cmluZywgcHJlZml4LCBzaG91bGRWYWxpZGF0ZSB9ID0gcGFyYW1zO1xuICBpZiAoJHN0cmluZy5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICByZXR1cm4gJHN0cmluZy5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiAgfVxuXG4gIGlmIChzaG91bGRWYWxpZGF0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU3RyaW5nICR7JHN0cmluZ30gZG9lcyBub3Qgc3RhcnQgd2l0aCBwcmVmaXggJHtwcmVmaXh9YCk7XG4gIH1cblxuICByZXR1cm4gJHN0cmluZztcbn1cblxuLyoqXG4gKiBVbmVzY2FwZXMgYSBzdHJpbmcgYnkgcmVwbGFjaW5nIGVzY2FwZSBzZXF1ZW5jZXMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIGNoYXJhY3RlcnMuXG4gKlxuICogQHBhcmFtICRzdHJpbmcgLSBUaGUgc3RyaW5nIHRvIHVuZXNjYXBlLlxuICogQHJldHVybnMgVGhlIHVuZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmVzY2FwZSgkc3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcmVwbGFjZSgkc3RyaW5nLCBVTkVTQ0FQRV9NQVApO1xufVxuXG4vKipcbiAqIFVuaW5kZW50cyBhIHN0cmluZyBieSByZW1vdmluZyBhIHByZWZpeCBmcm9tIGVhY2ggbGluZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgdW5pbmRlbnRlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmluZGVudChwYXJhbXM6IFVuaW5kZW50UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBwcmVmaXgsIHNob3VsZFRocm93SWZOb3RJbmRlbnRlZCA9IGZhbHNlLCB0ZXh0IH0gPSBwYXJhbXM7XG4gIHJldHVybiB0ZXh0LnNwbGl0KCdcXG4nKS5tYXAoKGxpbmUpID0+IHtcbiAgICBpZiAobGluZS5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgIHJldHVybiBsaW5lLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgIH1cbiAgICBpZiAoc2hvdWxkVGhyb3dJZk5vdEluZGVudGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmUgXCIke2xpbmV9XCIgaXMgbm90IGluZGVudGVkIHdpdGggXCIke3ByZWZpeH1cImApO1xuICAgIH1cbiAgICByZXR1cm4gbGluZTtcbiAgfSkuam9pbignXFxuJyk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBLDhCQUFpQztBQUNqQyxxQkFBNkI7QUFDN0IseUJBR087QUFDUCw0QkFBNkI7QUFXdEIsTUFBTSxRQUFRO0FBMERyQixNQUFNLGFBQXFDO0FBQUEsRUFDekMsTUFBTSxPQUFPO0FBQUEsRUFDYixNQUFNLE9BQU87QUFBQSxFQUNiLEtBQU0sT0FBTztBQUFBLEVBQ2IsTUFBTSxPQUFPO0FBQUEsRUFDYixNQUFNLE9BQU87QUFBQSxFQUNiLEtBQU0sT0FBTztBQUFBLEVBQ2IsS0FBSyxPQUFPO0FBQUEs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