@milkio/vite-plugin-milkio 1.3.34 → 1.3.36

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.
@@ -0,0 +1,2372 @@
1
+ import {
2
+ __commonJS,
3
+ __require,
4
+ __toESM
5
+ } from "./chunk-d85ypywj.js";
6
+
7
+ // node_modules/esbuild/lib/main.js
8
+ var require_main = __commonJS((exports, module) => {
9
+ var __dirname = "/home/runner/work/milkio/milkio/node_modules/esbuild/lib", __filename = "/home/runner/work/milkio/milkio/node_modules/esbuild/lib/main.js";
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __export = (target, all) => {
15
+ for (var name in all)
16
+ __defProp(target, name, { get: all[name], enumerable: true });
17
+ };
18
+ var __copyProps = (to, from, except, desc) => {
19
+ if (from && typeof from === "object" || typeof from === "function") {
20
+ for (let key of __getOwnPropNames(from))
21
+ if (!__hasOwnProp.call(to, key) && key !== except)
22
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
23
+ }
24
+ return to;
25
+ };
26
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
27
+ var node_exports = {};
28
+ __export(node_exports, {
29
+ analyzeMetafile: () => analyzeMetafile,
30
+ analyzeMetafileSync: () => analyzeMetafileSync,
31
+ build: () => build,
32
+ buildSync: () => buildSync,
33
+ context: () => context,
34
+ default: () => node_default,
35
+ formatMessages: () => formatMessages,
36
+ formatMessagesSync: () => formatMessagesSync,
37
+ initialize: () => initialize,
38
+ stop: () => stop,
39
+ transform: () => transform,
40
+ transformSync: () => transformSync,
41
+ version: () => version
42
+ });
43
+ module.exports = __toCommonJS(node_exports);
44
+ function encodePacket(packet) {
45
+ let visit = (value) => {
46
+ if (value === null) {
47
+ bb.write8(0);
48
+ } else if (typeof value === "boolean") {
49
+ bb.write8(1);
50
+ bb.write8(+value);
51
+ } else if (typeof value === "number") {
52
+ bb.write8(2);
53
+ bb.write32(value | 0);
54
+ } else if (typeof value === "string") {
55
+ bb.write8(3);
56
+ bb.write(encodeUTF8(value));
57
+ } else if (value instanceof Uint8Array) {
58
+ bb.write8(4);
59
+ bb.write(value);
60
+ } else if (value instanceof Array) {
61
+ bb.write8(5);
62
+ bb.write32(value.length);
63
+ for (let item of value) {
64
+ visit(item);
65
+ }
66
+ } else {
67
+ let keys = Object.keys(value);
68
+ bb.write8(6);
69
+ bb.write32(keys.length);
70
+ for (let key of keys) {
71
+ bb.write(encodeUTF8(key));
72
+ visit(value[key]);
73
+ }
74
+ }
75
+ };
76
+ let bb = new ByteBuffer;
77
+ bb.write32(0);
78
+ bb.write32(packet.id << 1 | +!packet.isRequest);
79
+ visit(packet.value);
80
+ writeUInt32LE(bb.buf, bb.len - 4, 0);
81
+ return bb.buf.subarray(0, bb.len);
82
+ }
83
+ function decodePacket(bytes) {
84
+ let visit = () => {
85
+ switch (bb.read8()) {
86
+ case 0:
87
+ return null;
88
+ case 1:
89
+ return !!bb.read8();
90
+ case 2:
91
+ return bb.read32();
92
+ case 3:
93
+ return decodeUTF8(bb.read());
94
+ case 4:
95
+ return bb.read();
96
+ case 5: {
97
+ let count = bb.read32();
98
+ let value2 = [];
99
+ for (let i = 0;i < count; i++) {
100
+ value2.push(visit());
101
+ }
102
+ return value2;
103
+ }
104
+ case 6: {
105
+ let count = bb.read32();
106
+ let value2 = {};
107
+ for (let i = 0;i < count; i++) {
108
+ value2[decodeUTF8(bb.read())] = visit();
109
+ }
110
+ return value2;
111
+ }
112
+ default:
113
+ throw new Error("Invalid packet");
114
+ }
115
+ };
116
+ let bb = new ByteBuffer(bytes);
117
+ let id = bb.read32();
118
+ let isRequest = (id & 1) === 0;
119
+ id >>>= 1;
120
+ let value = visit();
121
+ if (bb.ptr !== bytes.length) {
122
+ throw new Error("Invalid packet");
123
+ }
124
+ return { id, isRequest, value };
125
+ }
126
+ var ByteBuffer = class {
127
+ constructor(buf = new Uint8Array(1024)) {
128
+ this.buf = buf;
129
+ this.len = 0;
130
+ this.ptr = 0;
131
+ }
132
+ _write(delta) {
133
+ if (this.len + delta > this.buf.length) {
134
+ let clone = new Uint8Array((this.len + delta) * 2);
135
+ clone.set(this.buf);
136
+ this.buf = clone;
137
+ }
138
+ this.len += delta;
139
+ return this.len - delta;
140
+ }
141
+ write8(value) {
142
+ let offset = this._write(1);
143
+ this.buf[offset] = value;
144
+ }
145
+ write32(value) {
146
+ let offset = this._write(4);
147
+ writeUInt32LE(this.buf, value, offset);
148
+ }
149
+ write(bytes) {
150
+ let offset = this._write(4 + bytes.length);
151
+ writeUInt32LE(this.buf, bytes.length, offset);
152
+ this.buf.set(bytes, offset + 4);
153
+ }
154
+ _read(delta) {
155
+ if (this.ptr + delta > this.buf.length) {
156
+ throw new Error("Invalid packet");
157
+ }
158
+ this.ptr += delta;
159
+ return this.ptr - delta;
160
+ }
161
+ read8() {
162
+ return this.buf[this._read(1)];
163
+ }
164
+ read32() {
165
+ return readUInt32LE(this.buf, this._read(4));
166
+ }
167
+ read() {
168
+ let length = this.read32();
169
+ let bytes = new Uint8Array(length);
170
+ let ptr = this._read(bytes.length);
171
+ bytes.set(this.buf.subarray(ptr, ptr + length));
172
+ return bytes;
173
+ }
174
+ };
175
+ var encodeUTF8;
176
+ var decodeUTF8;
177
+ var encodeInvariant;
178
+ if (typeof TextEncoder !== "undefined" && typeof TextDecoder !== "undefined") {
179
+ let encoder = new TextEncoder;
180
+ let decoder = new TextDecoder;
181
+ encodeUTF8 = (text) => encoder.encode(text);
182
+ decodeUTF8 = (bytes) => decoder.decode(bytes);
183
+ encodeInvariant = 'new TextEncoder().encode("")';
184
+ } else if (typeof Buffer !== "undefined") {
185
+ encodeUTF8 = (text) => Buffer.from(text);
186
+ decodeUTF8 = (bytes) => {
187
+ let { buffer, byteOffset, byteLength } = bytes;
188
+ return Buffer.from(buffer, byteOffset, byteLength).toString();
189
+ };
190
+ encodeInvariant = 'Buffer.from("")';
191
+ } else {
192
+ throw new Error("No UTF-8 codec found");
193
+ }
194
+ if (!(encodeUTF8("") instanceof Uint8Array))
195
+ throw new Error(`Invariant violation: "${encodeInvariant} instanceof Uint8Array" is incorrectly false
196
+
197
+ This indicates that your JavaScript environment is broken. You cannot use
198
+ esbuild in this environment because esbuild relies on this invariant. This
199
+ is not a problem with esbuild. You need to fix your environment instead.
200
+ `);
201
+ function readUInt32LE(buffer, offset) {
202
+ return buffer[offset++] | buffer[offset++] << 8 | buffer[offset++] << 16 | buffer[offset++] << 24;
203
+ }
204
+ function writeUInt32LE(buffer, value, offset) {
205
+ buffer[offset++] = value;
206
+ buffer[offset++] = value >> 8;
207
+ buffer[offset++] = value >> 16;
208
+ buffer[offset++] = value >> 24;
209
+ }
210
+ var quote = JSON.stringify;
211
+ var buildLogLevelDefault = "warning";
212
+ var transformLogLevelDefault = "silent";
213
+ function validateAndJoinStringArray(values, what) {
214
+ const toJoin = [];
215
+ for (const value of values) {
216
+ validateStringValue(value, what);
217
+ if (value.indexOf(",") >= 0)
218
+ throw new Error(`Invalid ${what}: ${value}`);
219
+ toJoin.push(value);
220
+ }
221
+ return toJoin.join(",");
222
+ }
223
+ var canBeAnything = () => null;
224
+ var mustBeBoolean = (value) => typeof value === "boolean" ? null : "a boolean";
225
+ var mustBeString = (value) => typeof value === "string" ? null : "a string";
226
+ var mustBeRegExp = (value) => value instanceof RegExp ? null : "a RegExp object";
227
+ var mustBeInteger = (value) => typeof value === "number" && value === (value | 0) ? null : "an integer";
228
+ var mustBeValidPortNumber = (value) => typeof value === "number" && value === (value | 0) && value >= 0 && value <= 65535 ? null : "a valid port number";
229
+ var mustBeFunction = (value) => typeof value === "function" ? null : "a function";
230
+ var mustBeArray = (value) => Array.isArray(value) ? null : "an array";
231
+ var mustBeArrayOfStrings = (value) => Array.isArray(value) && value.every((x) => typeof x === "string") ? null : "an array of strings";
232
+ var mustBeObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value) ? null : "an object";
233
+ var mustBeEntryPoints = (value) => typeof value === "object" && value !== null ? null : "an array or an object";
234
+ var mustBeWebAssemblyModule = (value) => value instanceof WebAssembly.Module ? null : "a WebAssembly.Module";
235
+ var mustBeObjectOrNull = (value) => typeof value === "object" && !Array.isArray(value) ? null : "an object or null";
236
+ var mustBeStringOrBoolean = (value) => typeof value === "string" || typeof value === "boolean" ? null : "a string or a boolean";
237
+ var mustBeStringOrObject = (value) => typeof value === "string" || typeof value === "object" && value !== null && !Array.isArray(value) ? null : "a string or an object";
238
+ var mustBeStringOrArrayOfStrings = (value) => typeof value === "string" || Array.isArray(value) && value.every((x) => typeof x === "string") ? null : "a string or an array of strings";
239
+ var mustBeStringOrUint8Array = (value) => typeof value === "string" || value instanceof Uint8Array ? null : "a string or a Uint8Array";
240
+ var mustBeStringOrURL = (value) => typeof value === "string" || value instanceof URL ? null : "a string or a URL";
241
+ function getFlag(object, keys, key, mustBeFn) {
242
+ let value = object[key];
243
+ keys[key + ""] = true;
244
+ if (value === undefined)
245
+ return;
246
+ let mustBe = mustBeFn(value);
247
+ if (mustBe !== null)
248
+ throw new Error(`${quote(key)} must be ${mustBe}`);
249
+ return value;
250
+ }
251
+ function checkForInvalidFlags(object, keys, where) {
252
+ for (let key in object) {
253
+ if (!(key in keys)) {
254
+ throw new Error(`Invalid option ${where}: ${quote(key)}`);
255
+ }
256
+ }
257
+ }
258
+ function validateInitializeOptions(options) {
259
+ let keys = /* @__PURE__ */ Object.create(null);
260
+ let wasmURL = getFlag(options, keys, "wasmURL", mustBeStringOrURL);
261
+ let wasmModule = getFlag(options, keys, "wasmModule", mustBeWebAssemblyModule);
262
+ let worker = getFlag(options, keys, "worker", mustBeBoolean);
263
+ checkForInvalidFlags(options, keys, "in initialize() call");
264
+ return {
265
+ wasmURL,
266
+ wasmModule,
267
+ worker
268
+ };
269
+ }
270
+ function validateMangleCache(mangleCache) {
271
+ let validated;
272
+ if (mangleCache !== undefined) {
273
+ validated = /* @__PURE__ */ Object.create(null);
274
+ for (let key in mangleCache) {
275
+ let value = mangleCache[key];
276
+ if (typeof value === "string" || value === false) {
277
+ validated[key] = value;
278
+ } else {
279
+ throw new Error(`Expected ${quote(key)} in mangle cache to map to either a string or false`);
280
+ }
281
+ }
282
+ }
283
+ return validated;
284
+ }
285
+ function pushLogFlags(flags, options, keys, isTTY2, logLevelDefault) {
286
+ let color = getFlag(options, keys, "color", mustBeBoolean);
287
+ let logLevel = getFlag(options, keys, "logLevel", mustBeString);
288
+ let logLimit = getFlag(options, keys, "logLimit", mustBeInteger);
289
+ if (color !== undefined)
290
+ flags.push(`--color=${color}`);
291
+ else if (isTTY2)
292
+ flags.push(`--color=true`);
293
+ flags.push(`--log-level=${logLevel || logLevelDefault}`);
294
+ flags.push(`--log-limit=${logLimit || 0}`);
295
+ }
296
+ function validateStringValue(value, what, key) {
297
+ if (typeof value !== "string") {
298
+ throw new Error(`Expected value for ${what}${key !== undefined ? " " + quote(key) : ""} to be a string, got ${typeof value} instead`);
299
+ }
300
+ return value;
301
+ }
302
+ function pushCommonFlags(flags, options, keys) {
303
+ let legalComments = getFlag(options, keys, "legalComments", mustBeString);
304
+ let sourceRoot = getFlag(options, keys, "sourceRoot", mustBeString);
305
+ let sourcesContent = getFlag(options, keys, "sourcesContent", mustBeBoolean);
306
+ let target = getFlag(options, keys, "target", mustBeStringOrArrayOfStrings);
307
+ let format = getFlag(options, keys, "format", mustBeString);
308
+ let globalName = getFlag(options, keys, "globalName", mustBeString);
309
+ let mangleProps = getFlag(options, keys, "mangleProps", mustBeRegExp);
310
+ let reserveProps = getFlag(options, keys, "reserveProps", mustBeRegExp);
311
+ let mangleQuoted = getFlag(options, keys, "mangleQuoted", mustBeBoolean);
312
+ let minify = getFlag(options, keys, "minify", mustBeBoolean);
313
+ let minifySyntax = getFlag(options, keys, "minifySyntax", mustBeBoolean);
314
+ let minifyWhitespace = getFlag(options, keys, "minifyWhitespace", mustBeBoolean);
315
+ let minifyIdentifiers = getFlag(options, keys, "minifyIdentifiers", mustBeBoolean);
316
+ let lineLimit = getFlag(options, keys, "lineLimit", mustBeInteger);
317
+ let drop = getFlag(options, keys, "drop", mustBeArrayOfStrings);
318
+ let dropLabels = getFlag(options, keys, "dropLabels", mustBeArrayOfStrings);
319
+ let charset = getFlag(options, keys, "charset", mustBeString);
320
+ let treeShaking = getFlag(options, keys, "treeShaking", mustBeBoolean);
321
+ let ignoreAnnotations = getFlag(options, keys, "ignoreAnnotations", mustBeBoolean);
322
+ let jsx = getFlag(options, keys, "jsx", mustBeString);
323
+ let jsxFactory = getFlag(options, keys, "jsxFactory", mustBeString);
324
+ let jsxFragment = getFlag(options, keys, "jsxFragment", mustBeString);
325
+ let jsxImportSource = getFlag(options, keys, "jsxImportSource", mustBeString);
326
+ let jsxDev = getFlag(options, keys, "jsxDev", mustBeBoolean);
327
+ let jsxSideEffects = getFlag(options, keys, "jsxSideEffects", mustBeBoolean);
328
+ let define = getFlag(options, keys, "define", mustBeObject);
329
+ let logOverride = getFlag(options, keys, "logOverride", mustBeObject);
330
+ let supported = getFlag(options, keys, "supported", mustBeObject);
331
+ let pure = getFlag(options, keys, "pure", mustBeArrayOfStrings);
332
+ let keepNames = getFlag(options, keys, "keepNames", mustBeBoolean);
333
+ let platform = getFlag(options, keys, "platform", mustBeString);
334
+ let tsconfigRaw = getFlag(options, keys, "tsconfigRaw", mustBeStringOrObject);
335
+ let absPaths = getFlag(options, keys, "absPaths", mustBeArrayOfStrings);
336
+ if (legalComments)
337
+ flags.push(`--legal-comments=${legalComments}`);
338
+ if (sourceRoot !== undefined)
339
+ flags.push(`--source-root=${sourceRoot}`);
340
+ if (sourcesContent !== undefined)
341
+ flags.push(`--sources-content=${sourcesContent}`);
342
+ if (target)
343
+ flags.push(`--target=${validateAndJoinStringArray(Array.isArray(target) ? target : [target], "target")}`);
344
+ if (format)
345
+ flags.push(`--format=${format}`);
346
+ if (globalName)
347
+ flags.push(`--global-name=${globalName}`);
348
+ if (platform)
349
+ flags.push(`--platform=${platform}`);
350
+ if (tsconfigRaw)
351
+ flags.push(`--tsconfig-raw=${typeof tsconfigRaw === "string" ? tsconfigRaw : JSON.stringify(tsconfigRaw)}`);
352
+ if (minify)
353
+ flags.push("--minify");
354
+ if (minifySyntax)
355
+ flags.push("--minify-syntax");
356
+ if (minifyWhitespace)
357
+ flags.push("--minify-whitespace");
358
+ if (minifyIdentifiers)
359
+ flags.push("--minify-identifiers");
360
+ if (lineLimit)
361
+ flags.push(`--line-limit=${lineLimit}`);
362
+ if (charset)
363
+ flags.push(`--charset=${charset}`);
364
+ if (treeShaking !== undefined)
365
+ flags.push(`--tree-shaking=${treeShaking}`);
366
+ if (ignoreAnnotations)
367
+ flags.push(`--ignore-annotations`);
368
+ if (drop)
369
+ for (let what of drop)
370
+ flags.push(`--drop:${validateStringValue(what, "drop")}`);
371
+ if (dropLabels)
372
+ flags.push(`--drop-labels=${validateAndJoinStringArray(dropLabels, "drop label")}`);
373
+ if (absPaths)
374
+ flags.push(`--abs-paths=${validateAndJoinStringArray(absPaths, "abs paths")}`);
375
+ if (mangleProps)
376
+ flags.push(`--mangle-props=${jsRegExpToGoRegExp(mangleProps)}`);
377
+ if (reserveProps)
378
+ flags.push(`--reserve-props=${jsRegExpToGoRegExp(reserveProps)}`);
379
+ if (mangleQuoted !== undefined)
380
+ flags.push(`--mangle-quoted=${mangleQuoted}`);
381
+ if (jsx)
382
+ flags.push(`--jsx=${jsx}`);
383
+ if (jsxFactory)
384
+ flags.push(`--jsx-factory=${jsxFactory}`);
385
+ if (jsxFragment)
386
+ flags.push(`--jsx-fragment=${jsxFragment}`);
387
+ if (jsxImportSource)
388
+ flags.push(`--jsx-import-source=${jsxImportSource}`);
389
+ if (jsxDev)
390
+ flags.push(`--jsx-dev`);
391
+ if (jsxSideEffects)
392
+ flags.push(`--jsx-side-effects`);
393
+ if (define) {
394
+ for (let key in define) {
395
+ if (key.indexOf("=") >= 0)
396
+ throw new Error(`Invalid define: ${key}`);
397
+ flags.push(`--define:${key}=${validateStringValue(define[key], "define", key)}`);
398
+ }
399
+ }
400
+ if (logOverride) {
401
+ for (let key in logOverride) {
402
+ if (key.indexOf("=") >= 0)
403
+ throw new Error(`Invalid log override: ${key}`);
404
+ flags.push(`--log-override:${key}=${validateStringValue(logOverride[key], "log override", key)}`);
405
+ }
406
+ }
407
+ if (supported) {
408
+ for (let key in supported) {
409
+ if (key.indexOf("=") >= 0)
410
+ throw new Error(`Invalid supported: ${key}`);
411
+ const value = supported[key];
412
+ if (typeof value !== "boolean")
413
+ throw new Error(`Expected value for supported ${quote(key)} to be a boolean, got ${typeof value} instead`);
414
+ flags.push(`--supported:${key}=${value}`);
415
+ }
416
+ }
417
+ if (pure)
418
+ for (let fn of pure)
419
+ flags.push(`--pure:${validateStringValue(fn, "pure")}`);
420
+ if (keepNames)
421
+ flags.push(`--keep-names`);
422
+ }
423
+ function flagsForBuildOptions(callName, options, isTTY2, logLevelDefault, writeDefault) {
424
+ var _a2;
425
+ let flags = [];
426
+ let entries = [];
427
+ let keys = /* @__PURE__ */ Object.create(null);
428
+ let stdinContents = null;
429
+ let stdinResolveDir = null;
430
+ pushLogFlags(flags, options, keys, isTTY2, logLevelDefault);
431
+ pushCommonFlags(flags, options, keys);
432
+ let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean);
433
+ let bundle = getFlag(options, keys, "bundle", mustBeBoolean);
434
+ let splitting = getFlag(options, keys, "splitting", mustBeBoolean);
435
+ let preserveSymlinks = getFlag(options, keys, "preserveSymlinks", mustBeBoolean);
436
+ let metafile = getFlag(options, keys, "metafile", mustBeBoolean);
437
+ let outfile = getFlag(options, keys, "outfile", mustBeString);
438
+ let outdir = getFlag(options, keys, "outdir", mustBeString);
439
+ let outbase = getFlag(options, keys, "outbase", mustBeString);
440
+ let tsconfig = getFlag(options, keys, "tsconfig", mustBeString);
441
+ let resolveExtensions = getFlag(options, keys, "resolveExtensions", mustBeArrayOfStrings);
442
+ let nodePathsInput = getFlag(options, keys, "nodePaths", mustBeArrayOfStrings);
443
+ let mainFields = getFlag(options, keys, "mainFields", mustBeArrayOfStrings);
444
+ let conditions = getFlag(options, keys, "conditions", mustBeArrayOfStrings);
445
+ let external = getFlag(options, keys, "external", mustBeArrayOfStrings);
446
+ let packages = getFlag(options, keys, "packages", mustBeString);
447
+ let alias = getFlag(options, keys, "alias", mustBeObject);
448
+ let loader = getFlag(options, keys, "loader", mustBeObject);
449
+ let outExtension = getFlag(options, keys, "outExtension", mustBeObject);
450
+ let publicPath = getFlag(options, keys, "publicPath", mustBeString);
451
+ let entryNames = getFlag(options, keys, "entryNames", mustBeString);
452
+ let chunkNames = getFlag(options, keys, "chunkNames", mustBeString);
453
+ let assetNames = getFlag(options, keys, "assetNames", mustBeString);
454
+ let inject = getFlag(options, keys, "inject", mustBeArrayOfStrings);
455
+ let banner = getFlag(options, keys, "banner", mustBeObject);
456
+ let footer = getFlag(options, keys, "footer", mustBeObject);
457
+ let entryPoints = getFlag(options, keys, "entryPoints", mustBeEntryPoints);
458
+ let absWorkingDir = getFlag(options, keys, "absWorkingDir", mustBeString);
459
+ let stdin = getFlag(options, keys, "stdin", mustBeObject);
460
+ let write = (_a2 = getFlag(options, keys, "write", mustBeBoolean)) != null ? _a2 : writeDefault;
461
+ let allowOverwrite = getFlag(options, keys, "allowOverwrite", mustBeBoolean);
462
+ let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject);
463
+ keys.plugins = true;
464
+ checkForInvalidFlags(options, keys, `in ${callName}() call`);
465
+ if (sourcemap)
466
+ flags.push(`--sourcemap${sourcemap === true ? "" : `=${sourcemap}`}`);
467
+ if (bundle)
468
+ flags.push("--bundle");
469
+ if (allowOverwrite)
470
+ flags.push("--allow-overwrite");
471
+ if (splitting)
472
+ flags.push("--splitting");
473
+ if (preserveSymlinks)
474
+ flags.push("--preserve-symlinks");
475
+ if (metafile)
476
+ flags.push(`--metafile`);
477
+ if (outfile)
478
+ flags.push(`--outfile=${outfile}`);
479
+ if (outdir)
480
+ flags.push(`--outdir=${outdir}`);
481
+ if (outbase)
482
+ flags.push(`--outbase=${outbase}`);
483
+ if (tsconfig)
484
+ flags.push(`--tsconfig=${tsconfig}`);
485
+ if (packages)
486
+ flags.push(`--packages=${packages}`);
487
+ if (resolveExtensions)
488
+ flags.push(`--resolve-extensions=${validateAndJoinStringArray(resolveExtensions, "resolve extension")}`);
489
+ if (publicPath)
490
+ flags.push(`--public-path=${publicPath}`);
491
+ if (entryNames)
492
+ flags.push(`--entry-names=${entryNames}`);
493
+ if (chunkNames)
494
+ flags.push(`--chunk-names=${chunkNames}`);
495
+ if (assetNames)
496
+ flags.push(`--asset-names=${assetNames}`);
497
+ if (mainFields)
498
+ flags.push(`--main-fields=${validateAndJoinStringArray(mainFields, "main field")}`);
499
+ if (conditions)
500
+ flags.push(`--conditions=${validateAndJoinStringArray(conditions, "condition")}`);
501
+ if (external)
502
+ for (let name of external)
503
+ flags.push(`--external:${validateStringValue(name, "external")}`);
504
+ if (alias) {
505
+ for (let old in alias) {
506
+ if (old.indexOf("=") >= 0)
507
+ throw new Error(`Invalid package name in alias: ${old}`);
508
+ flags.push(`--alias:${old}=${validateStringValue(alias[old], "alias", old)}`);
509
+ }
510
+ }
511
+ if (banner) {
512
+ for (let type in banner) {
513
+ if (type.indexOf("=") >= 0)
514
+ throw new Error(`Invalid banner file type: ${type}`);
515
+ flags.push(`--banner:${type}=${validateStringValue(banner[type], "banner", type)}`);
516
+ }
517
+ }
518
+ if (footer) {
519
+ for (let type in footer) {
520
+ if (type.indexOf("=") >= 0)
521
+ throw new Error(`Invalid footer file type: ${type}`);
522
+ flags.push(`--footer:${type}=${validateStringValue(footer[type], "footer", type)}`);
523
+ }
524
+ }
525
+ if (inject)
526
+ for (let path3 of inject)
527
+ flags.push(`--inject:${validateStringValue(path3, "inject")}`);
528
+ if (loader) {
529
+ for (let ext in loader) {
530
+ if (ext.indexOf("=") >= 0)
531
+ throw new Error(`Invalid loader extension: ${ext}`);
532
+ flags.push(`--loader:${ext}=${validateStringValue(loader[ext], "loader", ext)}`);
533
+ }
534
+ }
535
+ if (outExtension) {
536
+ for (let ext in outExtension) {
537
+ if (ext.indexOf("=") >= 0)
538
+ throw new Error(`Invalid out extension: ${ext}`);
539
+ flags.push(`--out-extension:${ext}=${validateStringValue(outExtension[ext], "out extension", ext)}`);
540
+ }
541
+ }
542
+ if (entryPoints) {
543
+ if (Array.isArray(entryPoints)) {
544
+ for (let i = 0, n = entryPoints.length;i < n; i++) {
545
+ let entryPoint = entryPoints[i];
546
+ if (typeof entryPoint === "object" && entryPoint !== null) {
547
+ let entryPointKeys = /* @__PURE__ */ Object.create(null);
548
+ let input = getFlag(entryPoint, entryPointKeys, "in", mustBeString);
549
+ let output = getFlag(entryPoint, entryPointKeys, "out", mustBeString);
550
+ checkForInvalidFlags(entryPoint, entryPointKeys, "in entry point at index " + i);
551
+ if (input === undefined)
552
+ throw new Error('Missing property "in" for entry point at index ' + i);
553
+ if (output === undefined)
554
+ throw new Error('Missing property "out" for entry point at index ' + i);
555
+ entries.push([output, input]);
556
+ } else {
557
+ entries.push(["", validateStringValue(entryPoint, "entry point at index " + i)]);
558
+ }
559
+ }
560
+ } else {
561
+ for (let key in entryPoints) {
562
+ entries.push([key, validateStringValue(entryPoints[key], "entry point", key)]);
563
+ }
564
+ }
565
+ }
566
+ if (stdin) {
567
+ let stdinKeys = /* @__PURE__ */ Object.create(null);
568
+ let contents = getFlag(stdin, stdinKeys, "contents", mustBeStringOrUint8Array);
569
+ let resolveDir = getFlag(stdin, stdinKeys, "resolveDir", mustBeString);
570
+ let sourcefile = getFlag(stdin, stdinKeys, "sourcefile", mustBeString);
571
+ let loader2 = getFlag(stdin, stdinKeys, "loader", mustBeString);
572
+ checkForInvalidFlags(stdin, stdinKeys, 'in "stdin" object');
573
+ if (sourcefile)
574
+ flags.push(`--sourcefile=${sourcefile}`);
575
+ if (loader2)
576
+ flags.push(`--loader=${loader2}`);
577
+ if (resolveDir)
578
+ stdinResolveDir = resolveDir;
579
+ if (typeof contents === "string")
580
+ stdinContents = encodeUTF8(contents);
581
+ else if (contents instanceof Uint8Array)
582
+ stdinContents = contents;
583
+ }
584
+ let nodePaths = [];
585
+ if (nodePathsInput) {
586
+ for (let value of nodePathsInput) {
587
+ value += "";
588
+ nodePaths.push(value);
589
+ }
590
+ }
591
+ return {
592
+ entries,
593
+ flags,
594
+ write,
595
+ stdinContents,
596
+ stdinResolveDir,
597
+ absWorkingDir,
598
+ nodePaths,
599
+ mangleCache: validateMangleCache(mangleCache)
600
+ };
601
+ }
602
+ function flagsForTransformOptions(callName, options, isTTY2, logLevelDefault) {
603
+ let flags = [];
604
+ let keys = /* @__PURE__ */ Object.create(null);
605
+ pushLogFlags(flags, options, keys, isTTY2, logLevelDefault);
606
+ pushCommonFlags(flags, options, keys);
607
+ let sourcemap = getFlag(options, keys, "sourcemap", mustBeStringOrBoolean);
608
+ let sourcefile = getFlag(options, keys, "sourcefile", mustBeString);
609
+ let loader = getFlag(options, keys, "loader", mustBeString);
610
+ let banner = getFlag(options, keys, "banner", mustBeString);
611
+ let footer = getFlag(options, keys, "footer", mustBeString);
612
+ let mangleCache = getFlag(options, keys, "mangleCache", mustBeObject);
613
+ checkForInvalidFlags(options, keys, `in ${callName}() call`);
614
+ if (sourcemap)
615
+ flags.push(`--sourcemap=${sourcemap === true ? "external" : sourcemap}`);
616
+ if (sourcefile)
617
+ flags.push(`--sourcefile=${sourcefile}`);
618
+ if (loader)
619
+ flags.push(`--loader=${loader}`);
620
+ if (banner)
621
+ flags.push(`--banner=${banner}`);
622
+ if (footer)
623
+ flags.push(`--footer=${footer}`);
624
+ return {
625
+ flags,
626
+ mangleCache: validateMangleCache(mangleCache)
627
+ };
628
+ }
629
+ function createChannel(streamIn) {
630
+ const requestCallbacksByKey = {};
631
+ const closeData = { didClose: false, reason: "" };
632
+ let responseCallbacks = {};
633
+ let nextRequestID = 0;
634
+ let nextBuildKey = 0;
635
+ let stdout = new Uint8Array(16 * 1024);
636
+ let stdoutUsed = 0;
637
+ let readFromStdout = (chunk) => {
638
+ let limit = stdoutUsed + chunk.length;
639
+ if (limit > stdout.length) {
640
+ let swap = new Uint8Array(limit * 2);
641
+ swap.set(stdout);
642
+ stdout = swap;
643
+ }
644
+ stdout.set(chunk, stdoutUsed);
645
+ stdoutUsed += chunk.length;
646
+ let offset = 0;
647
+ while (offset + 4 <= stdoutUsed) {
648
+ let length = readUInt32LE(stdout, offset);
649
+ if (offset + 4 + length > stdoutUsed) {
650
+ break;
651
+ }
652
+ offset += 4;
653
+ handleIncomingPacket(stdout.subarray(offset, offset + length));
654
+ offset += length;
655
+ }
656
+ if (offset > 0) {
657
+ stdout.copyWithin(0, offset, stdoutUsed);
658
+ stdoutUsed -= offset;
659
+ }
660
+ };
661
+ let afterClose = (error) => {
662
+ closeData.didClose = true;
663
+ if (error)
664
+ closeData.reason = ": " + (error.message || error);
665
+ const text = "The service was stopped" + closeData.reason;
666
+ for (let id in responseCallbacks) {
667
+ responseCallbacks[id](text, null);
668
+ }
669
+ responseCallbacks = {};
670
+ };
671
+ let sendRequest = (refs, value, callback) => {
672
+ if (closeData.didClose)
673
+ return callback("The service is no longer running" + closeData.reason, null);
674
+ let id = nextRequestID++;
675
+ responseCallbacks[id] = (error, response) => {
676
+ try {
677
+ callback(error, response);
678
+ } finally {
679
+ if (refs)
680
+ refs.unref();
681
+ }
682
+ };
683
+ if (refs)
684
+ refs.ref();
685
+ streamIn.writeToStdin(encodePacket({ id, isRequest: true, value }));
686
+ };
687
+ let sendResponse = (id, value) => {
688
+ if (closeData.didClose)
689
+ throw new Error("The service is no longer running" + closeData.reason);
690
+ streamIn.writeToStdin(encodePacket({ id, isRequest: false, value }));
691
+ };
692
+ let handleRequest = async (id, request) => {
693
+ try {
694
+ if (request.command === "ping") {
695
+ sendResponse(id, {});
696
+ return;
697
+ }
698
+ if (typeof request.key === "number") {
699
+ const requestCallbacks = requestCallbacksByKey[request.key];
700
+ if (!requestCallbacks) {
701
+ return;
702
+ }
703
+ const callback = requestCallbacks[request.command];
704
+ if (callback) {
705
+ await callback(id, request);
706
+ return;
707
+ }
708
+ }
709
+ throw new Error(`Invalid command: ` + request.command);
710
+ } catch (e) {
711
+ const errors = [extractErrorMessageV8(e, streamIn, null, undefined, "")];
712
+ try {
713
+ sendResponse(id, { errors });
714
+ } catch {}
715
+ }
716
+ };
717
+ let isFirstPacket = true;
718
+ let handleIncomingPacket = (bytes) => {
719
+ if (isFirstPacket) {
720
+ isFirstPacket = false;
721
+ let binaryVersion = String.fromCharCode(...bytes);
722
+ if (binaryVersion !== "0.25.12") {
723
+ throw new Error(`Cannot start service: Host version "${"0.25.12"}" does not match binary version ${quote(binaryVersion)}`);
724
+ }
725
+ return;
726
+ }
727
+ let packet = decodePacket(bytes);
728
+ if (packet.isRequest) {
729
+ handleRequest(packet.id, packet.value);
730
+ } else {
731
+ let callback = responseCallbacks[packet.id];
732
+ delete responseCallbacks[packet.id];
733
+ if (packet.value.error)
734
+ callback(packet.value.error, {});
735
+ else
736
+ callback(null, packet.value);
737
+ }
738
+ };
739
+ let buildOrContext = ({ callName, refs, options, isTTY: isTTY2, defaultWD: defaultWD2, callback }) => {
740
+ let refCount = 0;
741
+ const buildKey = nextBuildKey++;
742
+ const requestCallbacks = {};
743
+ const buildRefs = {
744
+ ref() {
745
+ if (++refCount === 1) {
746
+ if (refs)
747
+ refs.ref();
748
+ }
749
+ },
750
+ unref() {
751
+ if (--refCount === 0) {
752
+ delete requestCallbacksByKey[buildKey];
753
+ if (refs)
754
+ refs.unref();
755
+ }
756
+ }
757
+ };
758
+ requestCallbacksByKey[buildKey] = requestCallbacks;
759
+ buildRefs.ref();
760
+ buildOrContextImpl(callName, buildKey, sendRequest, sendResponse, buildRefs, streamIn, requestCallbacks, options, isTTY2, defaultWD2, (err, res) => {
761
+ try {
762
+ callback(err, res);
763
+ } finally {
764
+ buildRefs.unref();
765
+ }
766
+ });
767
+ };
768
+ let transform2 = ({ callName, refs, input, options, isTTY: isTTY2, fs: fs3, callback }) => {
769
+ const details = createObjectStash();
770
+ let start = (inputPath) => {
771
+ try {
772
+ if (typeof input !== "string" && !(input instanceof Uint8Array))
773
+ throw new Error('The input to "transform" must be a string or a Uint8Array');
774
+ let {
775
+ flags,
776
+ mangleCache
777
+ } = flagsForTransformOptions(callName, options, isTTY2, transformLogLevelDefault);
778
+ let request = {
779
+ command: "transform",
780
+ flags,
781
+ inputFS: inputPath !== null,
782
+ input: inputPath !== null ? encodeUTF8(inputPath) : typeof input === "string" ? encodeUTF8(input) : input
783
+ };
784
+ if (mangleCache)
785
+ request.mangleCache = mangleCache;
786
+ sendRequest(refs, request, (error, response) => {
787
+ if (error)
788
+ return callback(new Error(error), null);
789
+ let errors = replaceDetailsInMessages(response.errors, details);
790
+ let warnings = replaceDetailsInMessages(response.warnings, details);
791
+ let outstanding = 1;
792
+ let next = () => {
793
+ if (--outstanding === 0) {
794
+ let result = {
795
+ warnings,
796
+ code: response.code,
797
+ map: response.map,
798
+ mangleCache: undefined,
799
+ legalComments: undefined
800
+ };
801
+ if ("legalComments" in response)
802
+ result.legalComments = response == null ? undefined : response.legalComments;
803
+ if (response.mangleCache)
804
+ result.mangleCache = response == null ? undefined : response.mangleCache;
805
+ callback(null, result);
806
+ }
807
+ };
808
+ if (errors.length > 0)
809
+ return callback(failureErrorWithLog("Transform failed", errors, warnings), null);
810
+ if (response.codeFS) {
811
+ outstanding++;
812
+ fs3.readFile(response.code, (err, contents) => {
813
+ if (err !== null) {
814
+ callback(err, null);
815
+ } else {
816
+ response.code = contents;
817
+ next();
818
+ }
819
+ });
820
+ }
821
+ if (response.mapFS) {
822
+ outstanding++;
823
+ fs3.readFile(response.map, (err, contents) => {
824
+ if (err !== null) {
825
+ callback(err, null);
826
+ } else {
827
+ response.map = contents;
828
+ next();
829
+ }
830
+ });
831
+ }
832
+ next();
833
+ });
834
+ } catch (e) {
835
+ let flags = [];
836
+ try {
837
+ pushLogFlags(flags, options, {}, isTTY2, transformLogLevelDefault);
838
+ } catch {}
839
+ const error = extractErrorMessageV8(e, streamIn, details, undefined, "");
840
+ sendRequest(refs, { command: "error", flags, error }, () => {
841
+ error.detail = details.load(error.detail);
842
+ callback(failureErrorWithLog("Transform failed", [error], []), null);
843
+ });
844
+ }
845
+ };
846
+ if ((typeof input === "string" || input instanceof Uint8Array) && input.length > 1024 * 1024) {
847
+ let next = start;
848
+ start = () => fs3.writeFile(input, next);
849
+ }
850
+ start(null);
851
+ };
852
+ let formatMessages2 = ({ callName, refs, messages, options, callback }) => {
853
+ if (!options)
854
+ throw new Error(`Missing second argument in ${callName}() call`);
855
+ let keys = {};
856
+ let kind = getFlag(options, keys, "kind", mustBeString);
857
+ let color = getFlag(options, keys, "color", mustBeBoolean);
858
+ let terminalWidth = getFlag(options, keys, "terminalWidth", mustBeInteger);
859
+ checkForInvalidFlags(options, keys, `in ${callName}() call`);
860
+ if (kind === undefined)
861
+ throw new Error(`Missing "kind" in ${callName}() call`);
862
+ if (kind !== "error" && kind !== "warning")
863
+ throw new Error(`Expected "kind" to be "error" or "warning" in ${callName}() call`);
864
+ let request = {
865
+ command: "format-msgs",
866
+ messages: sanitizeMessages(messages, "messages", null, "", terminalWidth),
867
+ isWarning: kind === "warning"
868
+ };
869
+ if (color !== undefined)
870
+ request.color = color;
871
+ if (terminalWidth !== undefined)
872
+ request.terminalWidth = terminalWidth;
873
+ sendRequest(refs, request, (error, response) => {
874
+ if (error)
875
+ return callback(new Error(error), null);
876
+ callback(null, response.messages);
877
+ });
878
+ };
879
+ let analyzeMetafile2 = ({ callName, refs, metafile, options, callback }) => {
880
+ if (options === undefined)
881
+ options = {};
882
+ let keys = {};
883
+ let color = getFlag(options, keys, "color", mustBeBoolean);
884
+ let verbose = getFlag(options, keys, "verbose", mustBeBoolean);
885
+ checkForInvalidFlags(options, keys, `in ${callName}() call`);
886
+ let request = {
887
+ command: "analyze-metafile",
888
+ metafile
889
+ };
890
+ if (color !== undefined)
891
+ request.color = color;
892
+ if (verbose !== undefined)
893
+ request.verbose = verbose;
894
+ sendRequest(refs, request, (error, response) => {
895
+ if (error)
896
+ return callback(new Error(error), null);
897
+ callback(null, response.result);
898
+ });
899
+ };
900
+ return {
901
+ readFromStdout,
902
+ afterClose,
903
+ service: {
904
+ buildOrContext,
905
+ transform: transform2,
906
+ formatMessages: formatMessages2,
907
+ analyzeMetafile: analyzeMetafile2
908
+ }
909
+ };
910
+ }
911
+ function buildOrContextImpl(callName, buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, options, isTTY2, defaultWD2, callback) {
912
+ const details = createObjectStash();
913
+ const isContext = callName === "context";
914
+ const handleError = (e, pluginName) => {
915
+ const flags = [];
916
+ try {
917
+ pushLogFlags(flags, options, {}, isTTY2, buildLogLevelDefault);
918
+ } catch {}
919
+ const message = extractErrorMessageV8(e, streamIn, details, undefined, pluginName);
920
+ sendRequest(refs, { command: "error", flags, error: message }, () => {
921
+ message.detail = details.load(message.detail);
922
+ callback(failureErrorWithLog(isContext ? "Context failed" : "Build failed", [message], []), null);
923
+ });
924
+ };
925
+ let plugins;
926
+ if (typeof options === "object") {
927
+ const value = options.plugins;
928
+ if (value !== undefined) {
929
+ if (!Array.isArray(value))
930
+ return handleError(new Error(`"plugins" must be an array`), "");
931
+ plugins = value;
932
+ }
933
+ }
934
+ if (plugins && plugins.length > 0) {
935
+ if (streamIn.isSync)
936
+ return handleError(new Error("Cannot use plugins in synchronous API calls"), "");
937
+ handlePlugins(buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, options, plugins, details).then((result) => {
938
+ if (!result.ok)
939
+ return handleError(result.error, result.pluginName);
940
+ try {
941
+ buildOrContextContinue(result.requestPlugins, result.runOnEndCallbacks, result.scheduleOnDisposeCallbacks);
942
+ } catch (e) {
943
+ handleError(e, "");
944
+ }
945
+ }, (e) => handleError(e, ""));
946
+ return;
947
+ }
948
+ try {
949
+ buildOrContextContinue(null, (result, done) => done([], []), () => {});
950
+ } catch (e) {
951
+ handleError(e, "");
952
+ }
953
+ function buildOrContextContinue(requestPlugins, runOnEndCallbacks, scheduleOnDisposeCallbacks) {
954
+ const writeDefault = streamIn.hasFS;
955
+ const {
956
+ entries,
957
+ flags,
958
+ write,
959
+ stdinContents,
960
+ stdinResolveDir,
961
+ absWorkingDir,
962
+ nodePaths,
963
+ mangleCache
964
+ } = flagsForBuildOptions(callName, options, isTTY2, buildLogLevelDefault, writeDefault);
965
+ if (write && !streamIn.hasFS)
966
+ throw new Error(`The "write" option is unavailable in this environment`);
967
+ const request = {
968
+ command: "build",
969
+ key: buildKey,
970
+ entries,
971
+ flags,
972
+ write,
973
+ stdinContents,
974
+ stdinResolveDir,
975
+ absWorkingDir: absWorkingDir || defaultWD2,
976
+ nodePaths,
977
+ context: isContext
978
+ };
979
+ if (requestPlugins)
980
+ request.plugins = requestPlugins;
981
+ if (mangleCache)
982
+ request.mangleCache = mangleCache;
983
+ const buildResponseToResult = (response, callback2) => {
984
+ const result = {
985
+ errors: replaceDetailsInMessages(response.errors, details),
986
+ warnings: replaceDetailsInMessages(response.warnings, details),
987
+ outputFiles: undefined,
988
+ metafile: undefined,
989
+ mangleCache: undefined
990
+ };
991
+ const originalErrors = result.errors.slice();
992
+ const originalWarnings = result.warnings.slice();
993
+ if (response.outputFiles)
994
+ result.outputFiles = response.outputFiles.map(convertOutputFiles);
995
+ if (response.metafile)
996
+ result.metafile = JSON.parse(response.metafile);
997
+ if (response.mangleCache)
998
+ result.mangleCache = response.mangleCache;
999
+ if (response.writeToStdout !== undefined)
1000
+ console.log(decodeUTF8(response.writeToStdout).replace(/\n$/, ""));
1001
+ runOnEndCallbacks(result, (onEndErrors, onEndWarnings) => {
1002
+ if (originalErrors.length > 0 || onEndErrors.length > 0) {
1003
+ const error = failureErrorWithLog("Build failed", originalErrors.concat(onEndErrors), originalWarnings.concat(onEndWarnings));
1004
+ return callback2(error, null, onEndErrors, onEndWarnings);
1005
+ }
1006
+ callback2(null, result, onEndErrors, onEndWarnings);
1007
+ });
1008
+ };
1009
+ let latestResultPromise;
1010
+ let provideLatestResult;
1011
+ if (isContext)
1012
+ requestCallbacks["on-end"] = (id, request2) => new Promise((resolve) => {
1013
+ buildResponseToResult(request2, (err, result, onEndErrors, onEndWarnings) => {
1014
+ const response = {
1015
+ errors: onEndErrors,
1016
+ warnings: onEndWarnings
1017
+ };
1018
+ if (provideLatestResult)
1019
+ provideLatestResult(err, result);
1020
+ latestResultPromise = undefined;
1021
+ provideLatestResult = undefined;
1022
+ sendResponse(id, response);
1023
+ resolve();
1024
+ });
1025
+ });
1026
+ sendRequest(refs, request, (error, response) => {
1027
+ if (error)
1028
+ return callback(new Error(error), null);
1029
+ if (!isContext) {
1030
+ return buildResponseToResult(response, (err, res) => {
1031
+ scheduleOnDisposeCallbacks();
1032
+ return callback(err, res);
1033
+ });
1034
+ }
1035
+ if (response.errors.length > 0) {
1036
+ return callback(failureErrorWithLog("Context failed", response.errors, response.warnings), null);
1037
+ }
1038
+ let didDispose = false;
1039
+ const result = {
1040
+ rebuild: () => {
1041
+ if (!latestResultPromise)
1042
+ latestResultPromise = new Promise((resolve, reject) => {
1043
+ let settlePromise;
1044
+ provideLatestResult = (err, result2) => {
1045
+ if (!settlePromise)
1046
+ settlePromise = () => err ? reject(err) : resolve(result2);
1047
+ };
1048
+ const triggerAnotherBuild = () => {
1049
+ const request2 = {
1050
+ command: "rebuild",
1051
+ key: buildKey
1052
+ };
1053
+ sendRequest(refs, request2, (error2, response2) => {
1054
+ if (error2) {
1055
+ reject(new Error(error2));
1056
+ } else if (settlePromise) {
1057
+ settlePromise();
1058
+ } else {
1059
+ triggerAnotherBuild();
1060
+ }
1061
+ });
1062
+ };
1063
+ triggerAnotherBuild();
1064
+ });
1065
+ return latestResultPromise;
1066
+ },
1067
+ watch: (options2 = {}) => new Promise((resolve, reject) => {
1068
+ if (!streamIn.hasFS)
1069
+ throw new Error(`Cannot use the "watch" API in this environment`);
1070
+ const keys = {};
1071
+ const delay = getFlag(options2, keys, "delay", mustBeInteger);
1072
+ checkForInvalidFlags(options2, keys, `in watch() call`);
1073
+ const request2 = {
1074
+ command: "watch",
1075
+ key: buildKey
1076
+ };
1077
+ if (delay)
1078
+ request2.delay = delay;
1079
+ sendRequest(refs, request2, (error2) => {
1080
+ if (error2)
1081
+ reject(new Error(error2));
1082
+ else
1083
+ resolve(undefined);
1084
+ });
1085
+ }),
1086
+ serve: (options2 = {}) => new Promise((resolve, reject) => {
1087
+ if (!streamIn.hasFS)
1088
+ throw new Error(`Cannot use the "serve" API in this environment`);
1089
+ const keys = {};
1090
+ const port = getFlag(options2, keys, "port", mustBeValidPortNumber);
1091
+ const host = getFlag(options2, keys, "host", mustBeString);
1092
+ const servedir = getFlag(options2, keys, "servedir", mustBeString);
1093
+ const keyfile = getFlag(options2, keys, "keyfile", mustBeString);
1094
+ const certfile = getFlag(options2, keys, "certfile", mustBeString);
1095
+ const fallback = getFlag(options2, keys, "fallback", mustBeString);
1096
+ const cors = getFlag(options2, keys, "cors", mustBeObject);
1097
+ const onRequest = getFlag(options2, keys, "onRequest", mustBeFunction);
1098
+ checkForInvalidFlags(options2, keys, `in serve() call`);
1099
+ const request2 = {
1100
+ command: "serve",
1101
+ key: buildKey,
1102
+ onRequest: !!onRequest
1103
+ };
1104
+ if (port !== undefined)
1105
+ request2.port = port;
1106
+ if (host !== undefined)
1107
+ request2.host = host;
1108
+ if (servedir !== undefined)
1109
+ request2.servedir = servedir;
1110
+ if (keyfile !== undefined)
1111
+ request2.keyfile = keyfile;
1112
+ if (certfile !== undefined)
1113
+ request2.certfile = certfile;
1114
+ if (fallback !== undefined)
1115
+ request2.fallback = fallback;
1116
+ if (cors) {
1117
+ const corsKeys = {};
1118
+ const origin = getFlag(cors, corsKeys, "origin", mustBeStringOrArrayOfStrings);
1119
+ checkForInvalidFlags(cors, corsKeys, `on "cors" object`);
1120
+ if (Array.isArray(origin))
1121
+ request2.corsOrigin = origin;
1122
+ else if (origin !== undefined)
1123
+ request2.corsOrigin = [origin];
1124
+ }
1125
+ sendRequest(refs, request2, (error2, response2) => {
1126
+ if (error2)
1127
+ return reject(new Error(error2));
1128
+ if (onRequest) {
1129
+ requestCallbacks["serve-request"] = (id, request3) => {
1130
+ onRequest(request3.args);
1131
+ sendResponse(id, {});
1132
+ };
1133
+ }
1134
+ resolve(response2);
1135
+ });
1136
+ }),
1137
+ cancel: () => new Promise((resolve) => {
1138
+ if (didDispose)
1139
+ return resolve();
1140
+ const request2 = {
1141
+ command: "cancel",
1142
+ key: buildKey
1143
+ };
1144
+ sendRequest(refs, request2, () => {
1145
+ resolve();
1146
+ });
1147
+ }),
1148
+ dispose: () => new Promise((resolve) => {
1149
+ if (didDispose)
1150
+ return resolve();
1151
+ didDispose = true;
1152
+ const request2 = {
1153
+ command: "dispose",
1154
+ key: buildKey
1155
+ };
1156
+ sendRequest(refs, request2, () => {
1157
+ resolve();
1158
+ scheduleOnDisposeCallbacks();
1159
+ refs.unref();
1160
+ });
1161
+ })
1162
+ };
1163
+ refs.ref();
1164
+ callback(null, result);
1165
+ });
1166
+ }
1167
+ }
1168
+ var handlePlugins = async (buildKey, sendRequest, sendResponse, refs, streamIn, requestCallbacks, initialOptions, plugins, details) => {
1169
+ let onStartCallbacks = [];
1170
+ let onEndCallbacks = [];
1171
+ let onResolveCallbacks = {};
1172
+ let onLoadCallbacks = {};
1173
+ let onDisposeCallbacks = [];
1174
+ let nextCallbackID = 0;
1175
+ let i = 0;
1176
+ let requestPlugins = [];
1177
+ let isSetupDone = false;
1178
+ plugins = [...plugins];
1179
+ for (let item of plugins) {
1180
+ let keys = {};
1181
+ if (typeof item !== "object")
1182
+ throw new Error(`Plugin at index ${i} must be an object`);
1183
+ const name = getFlag(item, keys, "name", mustBeString);
1184
+ if (typeof name !== "string" || name === "")
1185
+ throw new Error(`Plugin at index ${i} is missing a name`);
1186
+ try {
1187
+ let setup = getFlag(item, keys, "setup", mustBeFunction);
1188
+ if (typeof setup !== "function")
1189
+ throw new Error(`Plugin is missing a setup function`);
1190
+ checkForInvalidFlags(item, keys, `on plugin ${quote(name)}`);
1191
+ let plugin = {
1192
+ name,
1193
+ onStart: false,
1194
+ onEnd: false,
1195
+ onResolve: [],
1196
+ onLoad: []
1197
+ };
1198
+ i++;
1199
+ let resolve = (path3, options = {}) => {
1200
+ if (!isSetupDone)
1201
+ throw new Error('Cannot call "resolve" before plugin setup has completed');
1202
+ if (typeof path3 !== "string")
1203
+ throw new Error(`The path to resolve must be a string`);
1204
+ let keys2 = /* @__PURE__ */ Object.create(null);
1205
+ let pluginName = getFlag(options, keys2, "pluginName", mustBeString);
1206
+ let importer = getFlag(options, keys2, "importer", mustBeString);
1207
+ let namespace = getFlag(options, keys2, "namespace", mustBeString);
1208
+ let resolveDir = getFlag(options, keys2, "resolveDir", mustBeString);
1209
+ let kind = getFlag(options, keys2, "kind", mustBeString);
1210
+ let pluginData = getFlag(options, keys2, "pluginData", canBeAnything);
1211
+ let importAttributes = getFlag(options, keys2, "with", mustBeObject);
1212
+ checkForInvalidFlags(options, keys2, "in resolve() call");
1213
+ return new Promise((resolve2, reject) => {
1214
+ const request = {
1215
+ command: "resolve",
1216
+ path: path3,
1217
+ key: buildKey,
1218
+ pluginName: name
1219
+ };
1220
+ if (pluginName != null)
1221
+ request.pluginName = pluginName;
1222
+ if (importer != null)
1223
+ request.importer = importer;
1224
+ if (namespace != null)
1225
+ request.namespace = namespace;
1226
+ if (resolveDir != null)
1227
+ request.resolveDir = resolveDir;
1228
+ if (kind != null)
1229
+ request.kind = kind;
1230
+ else
1231
+ throw new Error(`Must specify "kind" when calling "resolve"`);
1232
+ if (pluginData != null)
1233
+ request.pluginData = details.store(pluginData);
1234
+ if (importAttributes != null)
1235
+ request.with = sanitizeStringMap(importAttributes, "with");
1236
+ sendRequest(refs, request, (error, response) => {
1237
+ if (error !== null)
1238
+ reject(new Error(error));
1239
+ else
1240
+ resolve2({
1241
+ errors: replaceDetailsInMessages(response.errors, details),
1242
+ warnings: replaceDetailsInMessages(response.warnings, details),
1243
+ path: response.path,
1244
+ external: response.external,
1245
+ sideEffects: response.sideEffects,
1246
+ namespace: response.namespace,
1247
+ suffix: response.suffix,
1248
+ pluginData: details.load(response.pluginData)
1249
+ });
1250
+ });
1251
+ });
1252
+ };
1253
+ let promise = setup({
1254
+ initialOptions,
1255
+ resolve,
1256
+ onStart(callback) {
1257
+ let registeredText = `This error came from the "onStart" callback registered here:`;
1258
+ let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onStart");
1259
+ onStartCallbacks.push({ name, callback, note: registeredNote });
1260
+ plugin.onStart = true;
1261
+ },
1262
+ onEnd(callback) {
1263
+ let registeredText = `This error came from the "onEnd" callback registered here:`;
1264
+ let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onEnd");
1265
+ onEndCallbacks.push({ name, callback, note: registeredNote });
1266
+ plugin.onEnd = true;
1267
+ },
1268
+ onResolve(options, callback) {
1269
+ let registeredText = `This error came from the "onResolve" callback registered here:`;
1270
+ let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onResolve");
1271
+ let keys2 = {};
1272
+ let filter = getFlag(options, keys2, "filter", mustBeRegExp);
1273
+ let namespace = getFlag(options, keys2, "namespace", mustBeString);
1274
+ checkForInvalidFlags(options, keys2, `in onResolve() call for plugin ${quote(name)}`);
1275
+ if (filter == null)
1276
+ throw new Error(`onResolve() call is missing a filter`);
1277
+ let id = nextCallbackID++;
1278
+ onResolveCallbacks[id] = { name, callback, note: registeredNote };
1279
+ plugin.onResolve.push({ id, filter: jsRegExpToGoRegExp(filter), namespace: namespace || "" });
1280
+ },
1281
+ onLoad(options, callback) {
1282
+ let registeredText = `This error came from the "onLoad" callback registered here:`;
1283
+ let registeredNote = extractCallerV8(new Error(registeredText), streamIn, "onLoad");
1284
+ let keys2 = {};
1285
+ let filter = getFlag(options, keys2, "filter", mustBeRegExp);
1286
+ let namespace = getFlag(options, keys2, "namespace", mustBeString);
1287
+ checkForInvalidFlags(options, keys2, `in onLoad() call for plugin ${quote(name)}`);
1288
+ if (filter == null)
1289
+ throw new Error(`onLoad() call is missing a filter`);
1290
+ let id = nextCallbackID++;
1291
+ onLoadCallbacks[id] = { name, callback, note: registeredNote };
1292
+ plugin.onLoad.push({ id, filter: jsRegExpToGoRegExp(filter), namespace: namespace || "" });
1293
+ },
1294
+ onDispose(callback) {
1295
+ onDisposeCallbacks.push(callback);
1296
+ },
1297
+ esbuild: streamIn.esbuild
1298
+ });
1299
+ if (promise)
1300
+ await promise;
1301
+ requestPlugins.push(plugin);
1302
+ } catch (e) {
1303
+ return { ok: false, error: e, pluginName: name };
1304
+ }
1305
+ }
1306
+ requestCallbacks["on-start"] = async (id, request) => {
1307
+ details.clear();
1308
+ let response = { errors: [], warnings: [] };
1309
+ await Promise.all(onStartCallbacks.map(async ({ name, callback, note }) => {
1310
+ try {
1311
+ let result = await callback();
1312
+ if (result != null) {
1313
+ if (typeof result !== "object")
1314
+ throw new Error(`Expected onStart() callback in plugin ${quote(name)} to return an object`);
1315
+ let keys = {};
1316
+ let errors = getFlag(result, keys, "errors", mustBeArray);
1317
+ let warnings = getFlag(result, keys, "warnings", mustBeArray);
1318
+ checkForInvalidFlags(result, keys, `from onStart() callback in plugin ${quote(name)}`);
1319
+ if (errors != null)
1320
+ response.errors.push(...sanitizeMessages(errors, "errors", details, name, undefined));
1321
+ if (warnings != null)
1322
+ response.warnings.push(...sanitizeMessages(warnings, "warnings", details, name, undefined));
1323
+ }
1324
+ } catch (e) {
1325
+ response.errors.push(extractErrorMessageV8(e, streamIn, details, note && note(), name));
1326
+ }
1327
+ }));
1328
+ sendResponse(id, response);
1329
+ };
1330
+ requestCallbacks["on-resolve"] = async (id, request) => {
1331
+ let response = {}, name = "", callback, note;
1332
+ for (let id2 of request.ids) {
1333
+ try {
1334
+ ({ name, callback, note } = onResolveCallbacks[id2]);
1335
+ let result = await callback({
1336
+ path: request.path,
1337
+ importer: request.importer,
1338
+ namespace: request.namespace,
1339
+ resolveDir: request.resolveDir,
1340
+ kind: request.kind,
1341
+ pluginData: details.load(request.pluginData),
1342
+ with: request.with
1343
+ });
1344
+ if (result != null) {
1345
+ if (typeof result !== "object")
1346
+ throw new Error(`Expected onResolve() callback in plugin ${quote(name)} to return an object`);
1347
+ let keys = {};
1348
+ let pluginName = getFlag(result, keys, "pluginName", mustBeString);
1349
+ let path3 = getFlag(result, keys, "path", mustBeString);
1350
+ let namespace = getFlag(result, keys, "namespace", mustBeString);
1351
+ let suffix = getFlag(result, keys, "suffix", mustBeString);
1352
+ let external = getFlag(result, keys, "external", mustBeBoolean);
1353
+ let sideEffects = getFlag(result, keys, "sideEffects", mustBeBoolean);
1354
+ let pluginData = getFlag(result, keys, "pluginData", canBeAnything);
1355
+ let errors = getFlag(result, keys, "errors", mustBeArray);
1356
+ let warnings = getFlag(result, keys, "warnings", mustBeArray);
1357
+ let watchFiles = getFlag(result, keys, "watchFiles", mustBeArrayOfStrings);
1358
+ let watchDirs = getFlag(result, keys, "watchDirs", mustBeArrayOfStrings);
1359
+ checkForInvalidFlags(result, keys, `from onResolve() callback in plugin ${quote(name)}`);
1360
+ response.id = id2;
1361
+ if (pluginName != null)
1362
+ response.pluginName = pluginName;
1363
+ if (path3 != null)
1364
+ response.path = path3;
1365
+ if (namespace != null)
1366
+ response.namespace = namespace;
1367
+ if (suffix != null)
1368
+ response.suffix = suffix;
1369
+ if (external != null)
1370
+ response.external = external;
1371
+ if (sideEffects != null)
1372
+ response.sideEffects = sideEffects;
1373
+ if (pluginData != null)
1374
+ response.pluginData = details.store(pluginData);
1375
+ if (errors != null)
1376
+ response.errors = sanitizeMessages(errors, "errors", details, name, undefined);
1377
+ if (warnings != null)
1378
+ response.warnings = sanitizeMessages(warnings, "warnings", details, name, undefined);
1379
+ if (watchFiles != null)
1380
+ response.watchFiles = sanitizeStringArray(watchFiles, "watchFiles");
1381
+ if (watchDirs != null)
1382
+ response.watchDirs = sanitizeStringArray(watchDirs, "watchDirs");
1383
+ break;
1384
+ }
1385
+ } catch (e) {
1386
+ response = { id: id2, errors: [extractErrorMessageV8(e, streamIn, details, note && note(), name)] };
1387
+ break;
1388
+ }
1389
+ }
1390
+ sendResponse(id, response);
1391
+ };
1392
+ requestCallbacks["on-load"] = async (id, request) => {
1393
+ let response = {}, name = "", callback, note;
1394
+ for (let id2 of request.ids) {
1395
+ try {
1396
+ ({ name, callback, note } = onLoadCallbacks[id2]);
1397
+ let result = await callback({
1398
+ path: request.path,
1399
+ namespace: request.namespace,
1400
+ suffix: request.suffix,
1401
+ pluginData: details.load(request.pluginData),
1402
+ with: request.with
1403
+ });
1404
+ if (result != null) {
1405
+ if (typeof result !== "object")
1406
+ throw new Error(`Expected onLoad() callback in plugin ${quote(name)} to return an object`);
1407
+ let keys = {};
1408
+ let pluginName = getFlag(result, keys, "pluginName", mustBeString);
1409
+ let contents = getFlag(result, keys, "contents", mustBeStringOrUint8Array);
1410
+ let resolveDir = getFlag(result, keys, "resolveDir", mustBeString);
1411
+ let pluginData = getFlag(result, keys, "pluginData", canBeAnything);
1412
+ let loader = getFlag(result, keys, "loader", mustBeString);
1413
+ let errors = getFlag(result, keys, "errors", mustBeArray);
1414
+ let warnings = getFlag(result, keys, "warnings", mustBeArray);
1415
+ let watchFiles = getFlag(result, keys, "watchFiles", mustBeArrayOfStrings);
1416
+ let watchDirs = getFlag(result, keys, "watchDirs", mustBeArrayOfStrings);
1417
+ checkForInvalidFlags(result, keys, `from onLoad() callback in plugin ${quote(name)}`);
1418
+ response.id = id2;
1419
+ if (pluginName != null)
1420
+ response.pluginName = pluginName;
1421
+ if (contents instanceof Uint8Array)
1422
+ response.contents = contents;
1423
+ else if (contents != null)
1424
+ response.contents = encodeUTF8(contents);
1425
+ if (resolveDir != null)
1426
+ response.resolveDir = resolveDir;
1427
+ if (pluginData != null)
1428
+ response.pluginData = details.store(pluginData);
1429
+ if (loader != null)
1430
+ response.loader = loader;
1431
+ if (errors != null)
1432
+ response.errors = sanitizeMessages(errors, "errors", details, name, undefined);
1433
+ if (warnings != null)
1434
+ response.warnings = sanitizeMessages(warnings, "warnings", details, name, undefined);
1435
+ if (watchFiles != null)
1436
+ response.watchFiles = sanitizeStringArray(watchFiles, "watchFiles");
1437
+ if (watchDirs != null)
1438
+ response.watchDirs = sanitizeStringArray(watchDirs, "watchDirs");
1439
+ break;
1440
+ }
1441
+ } catch (e) {
1442
+ response = { id: id2, errors: [extractErrorMessageV8(e, streamIn, details, note && note(), name)] };
1443
+ break;
1444
+ }
1445
+ }
1446
+ sendResponse(id, response);
1447
+ };
1448
+ let runOnEndCallbacks = (result, done) => done([], []);
1449
+ if (onEndCallbacks.length > 0) {
1450
+ runOnEndCallbacks = (result, done) => {
1451
+ (async () => {
1452
+ const onEndErrors = [];
1453
+ const onEndWarnings = [];
1454
+ for (const { name, callback, note } of onEndCallbacks) {
1455
+ let newErrors;
1456
+ let newWarnings;
1457
+ try {
1458
+ const value = await callback(result);
1459
+ if (value != null) {
1460
+ if (typeof value !== "object")
1461
+ throw new Error(`Expected onEnd() callback in plugin ${quote(name)} to return an object`);
1462
+ let keys = {};
1463
+ let errors = getFlag(value, keys, "errors", mustBeArray);
1464
+ let warnings = getFlag(value, keys, "warnings", mustBeArray);
1465
+ checkForInvalidFlags(value, keys, `from onEnd() callback in plugin ${quote(name)}`);
1466
+ if (errors != null)
1467
+ newErrors = sanitizeMessages(errors, "errors", details, name, undefined);
1468
+ if (warnings != null)
1469
+ newWarnings = sanitizeMessages(warnings, "warnings", details, name, undefined);
1470
+ }
1471
+ } catch (e) {
1472
+ newErrors = [extractErrorMessageV8(e, streamIn, details, note && note(), name)];
1473
+ }
1474
+ if (newErrors) {
1475
+ onEndErrors.push(...newErrors);
1476
+ try {
1477
+ result.errors.push(...newErrors);
1478
+ } catch {}
1479
+ }
1480
+ if (newWarnings) {
1481
+ onEndWarnings.push(...newWarnings);
1482
+ try {
1483
+ result.warnings.push(...newWarnings);
1484
+ } catch {}
1485
+ }
1486
+ }
1487
+ done(onEndErrors, onEndWarnings);
1488
+ })();
1489
+ };
1490
+ }
1491
+ let scheduleOnDisposeCallbacks = () => {
1492
+ for (const cb of onDisposeCallbacks) {
1493
+ setTimeout(() => cb(), 0);
1494
+ }
1495
+ };
1496
+ isSetupDone = true;
1497
+ return {
1498
+ ok: true,
1499
+ requestPlugins,
1500
+ runOnEndCallbacks,
1501
+ scheduleOnDisposeCallbacks
1502
+ };
1503
+ };
1504
+ function createObjectStash() {
1505
+ const map = /* @__PURE__ */ new Map;
1506
+ let nextID = 0;
1507
+ return {
1508
+ clear() {
1509
+ map.clear();
1510
+ },
1511
+ load(id) {
1512
+ return map.get(id);
1513
+ },
1514
+ store(value) {
1515
+ if (value === undefined)
1516
+ return -1;
1517
+ const id = nextID++;
1518
+ map.set(id, value);
1519
+ return id;
1520
+ }
1521
+ };
1522
+ }
1523
+ function extractCallerV8(e, streamIn, ident) {
1524
+ let note;
1525
+ let tried = false;
1526
+ return () => {
1527
+ if (tried)
1528
+ return note;
1529
+ tried = true;
1530
+ try {
1531
+ let lines = (e.stack + "").split(`
1532
+ `);
1533
+ lines.splice(1, 1);
1534
+ let location = parseStackLinesV8(streamIn, lines, ident);
1535
+ if (location) {
1536
+ note = { text: e.message, location };
1537
+ return note;
1538
+ }
1539
+ } catch {}
1540
+ };
1541
+ }
1542
+ function extractErrorMessageV8(e, streamIn, stash, note, pluginName) {
1543
+ let text = "Internal error";
1544
+ let location = null;
1545
+ try {
1546
+ text = (e && e.message || e) + "";
1547
+ } catch {}
1548
+ try {
1549
+ location = parseStackLinesV8(streamIn, (e.stack + "").split(`
1550
+ `), "");
1551
+ } catch {}
1552
+ return { id: "", pluginName, text, location, notes: note ? [note] : [], detail: stash ? stash.store(e) : -1 };
1553
+ }
1554
+ function parseStackLinesV8(streamIn, lines, ident) {
1555
+ let at = " at ";
1556
+ if (streamIn.readFileSync && !lines[0].startsWith(at) && lines[1].startsWith(at)) {
1557
+ for (let i = 1;i < lines.length; i++) {
1558
+ let line = lines[i];
1559
+ if (!line.startsWith(at))
1560
+ continue;
1561
+ line = line.slice(at.length);
1562
+ while (true) {
1563
+ let match = /^(?:new |async )?\S+ \((.*)\)$/.exec(line);
1564
+ if (match) {
1565
+ line = match[1];
1566
+ continue;
1567
+ }
1568
+ match = /^eval at \S+ \((.*)\)(?:, \S+:\d+:\d+)?$/.exec(line);
1569
+ if (match) {
1570
+ line = match[1];
1571
+ continue;
1572
+ }
1573
+ match = /^(\S+):(\d+):(\d+)$/.exec(line);
1574
+ if (match) {
1575
+ let contents;
1576
+ try {
1577
+ contents = streamIn.readFileSync(match[1], "utf8");
1578
+ } catch {
1579
+ break;
1580
+ }
1581
+ let lineText = contents.split(/\r\n|\r|\n|\u2028|\u2029/)[+match[2] - 1] || "";
1582
+ let column = +match[3] - 1;
1583
+ let length = lineText.slice(column, column + ident.length) === ident ? ident.length : 0;
1584
+ return {
1585
+ file: match[1],
1586
+ namespace: "file",
1587
+ line: +match[2],
1588
+ column: encodeUTF8(lineText.slice(0, column)).length,
1589
+ length: encodeUTF8(lineText.slice(column, column + length)).length,
1590
+ lineText: lineText + `
1591
+ ` + lines.slice(1).join(`
1592
+ `),
1593
+ suggestion: ""
1594
+ };
1595
+ }
1596
+ break;
1597
+ }
1598
+ }
1599
+ }
1600
+ return null;
1601
+ }
1602
+ function failureErrorWithLog(text, errors, warnings) {
1603
+ let limit = 5;
1604
+ text += errors.length < 1 ? "" : ` with ${errors.length} error${errors.length < 2 ? "" : "s"}:` + errors.slice(0, limit + 1).map((e, i) => {
1605
+ if (i === limit)
1606
+ return `
1607
+ ...`;
1608
+ if (!e.location)
1609
+ return `
1610
+ error: ${e.text}`;
1611
+ let { file, line, column } = e.location;
1612
+ let pluginText = e.pluginName ? `[plugin: ${e.pluginName}] ` : "";
1613
+ return `
1614
+ ${file}:${line}:${column}: ERROR: ${pluginText}${e.text}`;
1615
+ }).join("");
1616
+ let error = new Error(text);
1617
+ for (const [key, value] of [["errors", errors], ["warnings", warnings]]) {
1618
+ Object.defineProperty(error, key, {
1619
+ configurable: true,
1620
+ enumerable: true,
1621
+ get: () => value,
1622
+ set: (value2) => Object.defineProperty(error, key, {
1623
+ configurable: true,
1624
+ enumerable: true,
1625
+ value: value2
1626
+ })
1627
+ });
1628
+ }
1629
+ return error;
1630
+ }
1631
+ function replaceDetailsInMessages(messages, stash) {
1632
+ for (const message of messages) {
1633
+ message.detail = stash.load(message.detail);
1634
+ }
1635
+ return messages;
1636
+ }
1637
+ function sanitizeLocation(location, where, terminalWidth) {
1638
+ if (location == null)
1639
+ return null;
1640
+ let keys = {};
1641
+ let file = getFlag(location, keys, "file", mustBeString);
1642
+ let namespace = getFlag(location, keys, "namespace", mustBeString);
1643
+ let line = getFlag(location, keys, "line", mustBeInteger);
1644
+ let column = getFlag(location, keys, "column", mustBeInteger);
1645
+ let length = getFlag(location, keys, "length", mustBeInteger);
1646
+ let lineText = getFlag(location, keys, "lineText", mustBeString);
1647
+ let suggestion = getFlag(location, keys, "suggestion", mustBeString);
1648
+ checkForInvalidFlags(location, keys, where);
1649
+ if (lineText) {
1650
+ const relevantASCII = lineText.slice(0, (column && column > 0 ? column : 0) + (length && length > 0 ? length : 0) + (terminalWidth && terminalWidth > 0 ? terminalWidth : 80));
1651
+ if (!/[\x7F-\uFFFF]/.test(relevantASCII) && !/\n/.test(lineText)) {
1652
+ lineText = relevantASCII;
1653
+ }
1654
+ }
1655
+ return {
1656
+ file: file || "",
1657
+ namespace: namespace || "",
1658
+ line: line || 0,
1659
+ column: column || 0,
1660
+ length: length || 0,
1661
+ lineText: lineText || "",
1662
+ suggestion: suggestion || ""
1663
+ };
1664
+ }
1665
+ function sanitizeMessages(messages, property, stash, fallbackPluginName, terminalWidth) {
1666
+ let messagesClone = [];
1667
+ let index = 0;
1668
+ for (const message of messages) {
1669
+ let keys = {};
1670
+ let id = getFlag(message, keys, "id", mustBeString);
1671
+ let pluginName = getFlag(message, keys, "pluginName", mustBeString);
1672
+ let text = getFlag(message, keys, "text", mustBeString);
1673
+ let location = getFlag(message, keys, "location", mustBeObjectOrNull);
1674
+ let notes = getFlag(message, keys, "notes", mustBeArray);
1675
+ let detail = getFlag(message, keys, "detail", canBeAnything);
1676
+ let where = `in element ${index} of "${property}"`;
1677
+ checkForInvalidFlags(message, keys, where);
1678
+ let notesClone = [];
1679
+ if (notes) {
1680
+ for (const note of notes) {
1681
+ let noteKeys = {};
1682
+ let noteText = getFlag(note, noteKeys, "text", mustBeString);
1683
+ let noteLocation = getFlag(note, noteKeys, "location", mustBeObjectOrNull);
1684
+ checkForInvalidFlags(note, noteKeys, where);
1685
+ notesClone.push({
1686
+ text: noteText || "",
1687
+ location: sanitizeLocation(noteLocation, where, terminalWidth)
1688
+ });
1689
+ }
1690
+ }
1691
+ messagesClone.push({
1692
+ id: id || "",
1693
+ pluginName: pluginName || fallbackPluginName,
1694
+ text: text || "",
1695
+ location: sanitizeLocation(location, where, terminalWidth),
1696
+ notes: notesClone,
1697
+ detail: stash ? stash.store(detail) : -1
1698
+ });
1699
+ index++;
1700
+ }
1701
+ return messagesClone;
1702
+ }
1703
+ function sanitizeStringArray(values, property) {
1704
+ const result = [];
1705
+ for (const value of values) {
1706
+ if (typeof value !== "string")
1707
+ throw new Error(`${quote(property)} must be an array of strings`);
1708
+ result.push(value);
1709
+ }
1710
+ return result;
1711
+ }
1712
+ function sanitizeStringMap(map, property) {
1713
+ const result = /* @__PURE__ */ Object.create(null);
1714
+ for (const key in map) {
1715
+ const value = map[key];
1716
+ if (typeof value !== "string")
1717
+ throw new Error(`key ${quote(key)} in object ${quote(property)} must be a string`);
1718
+ result[key] = value;
1719
+ }
1720
+ return result;
1721
+ }
1722
+ function convertOutputFiles({ path: path3, contents, hash }) {
1723
+ let text = null;
1724
+ return {
1725
+ path: path3,
1726
+ contents,
1727
+ hash,
1728
+ get text() {
1729
+ const binary = this.contents;
1730
+ if (text === null || binary !== contents) {
1731
+ contents = binary;
1732
+ text = decodeUTF8(binary);
1733
+ }
1734
+ return text;
1735
+ }
1736
+ };
1737
+ }
1738
+ function jsRegExpToGoRegExp(regexp) {
1739
+ let result = regexp.source;
1740
+ if (regexp.flags)
1741
+ result = `(?${regexp.flags})${result}`;
1742
+ return result;
1743
+ }
1744
+ var fs = __require("fs");
1745
+ var os = __require("os");
1746
+ var path = __require("path");
1747
+ var ESBUILD_BINARY_PATH = process.env.ESBUILD_BINARY_PATH || ESBUILD_BINARY_PATH;
1748
+ var isValidBinaryPath = (x) => !!x && x !== "/usr/bin/esbuild";
1749
+ var packageDarwin_arm64 = "@esbuild/darwin-arm64";
1750
+ var packageDarwin_x64 = "@esbuild/darwin-x64";
1751
+ var knownWindowsPackages = {
1752
+ "win32 arm64 LE": "@esbuild/win32-arm64",
1753
+ "win32 ia32 LE": "@esbuild/win32-ia32",
1754
+ "win32 x64 LE": "@esbuild/win32-x64"
1755
+ };
1756
+ var knownUnixlikePackages = {
1757
+ "aix ppc64 BE": "@esbuild/aix-ppc64",
1758
+ "android arm64 LE": "@esbuild/android-arm64",
1759
+ "darwin arm64 LE": "@esbuild/darwin-arm64",
1760
+ "darwin x64 LE": "@esbuild/darwin-x64",
1761
+ "freebsd arm64 LE": "@esbuild/freebsd-arm64",
1762
+ "freebsd x64 LE": "@esbuild/freebsd-x64",
1763
+ "linux arm LE": "@esbuild/linux-arm",
1764
+ "linux arm64 LE": "@esbuild/linux-arm64",
1765
+ "linux ia32 LE": "@esbuild/linux-ia32",
1766
+ "linux mips64el LE": "@esbuild/linux-mips64el",
1767
+ "linux ppc64 LE": "@esbuild/linux-ppc64",
1768
+ "linux riscv64 LE": "@esbuild/linux-riscv64",
1769
+ "linux s390x BE": "@esbuild/linux-s390x",
1770
+ "linux x64 LE": "@esbuild/linux-x64",
1771
+ "linux loong64 LE": "@esbuild/linux-loong64",
1772
+ "netbsd arm64 LE": "@esbuild/netbsd-arm64",
1773
+ "netbsd x64 LE": "@esbuild/netbsd-x64",
1774
+ "openbsd arm64 LE": "@esbuild/openbsd-arm64",
1775
+ "openbsd x64 LE": "@esbuild/openbsd-x64",
1776
+ "sunos x64 LE": "@esbuild/sunos-x64"
1777
+ };
1778
+ var knownWebAssemblyFallbackPackages = {
1779
+ "android arm LE": "@esbuild/android-arm",
1780
+ "android x64 LE": "@esbuild/android-x64",
1781
+ "openharmony arm64 LE": "@esbuild/openharmony-arm64"
1782
+ };
1783
+ function pkgAndSubpathForCurrentPlatform() {
1784
+ let pkg;
1785
+ let subpath;
1786
+ let isWASM = false;
1787
+ let platformKey = `${process.platform} ${os.arch()} ${os.endianness()}`;
1788
+ if (platformKey in knownWindowsPackages) {
1789
+ pkg = knownWindowsPackages[platformKey];
1790
+ subpath = "esbuild.exe";
1791
+ } else if (platformKey in knownUnixlikePackages) {
1792
+ pkg = knownUnixlikePackages[platformKey];
1793
+ subpath = "bin/esbuild";
1794
+ } else if (platformKey in knownWebAssemblyFallbackPackages) {
1795
+ pkg = knownWebAssemblyFallbackPackages[platformKey];
1796
+ subpath = "bin/esbuild";
1797
+ isWASM = true;
1798
+ } else {
1799
+ throw new Error(`Unsupported platform: ${platformKey}`);
1800
+ }
1801
+ return { pkg, subpath, isWASM };
1802
+ }
1803
+ function pkgForSomeOtherPlatform() {
1804
+ const libMainJS = __require.resolve("esbuild");
1805
+ const nodeModulesDirectory = path.dirname(path.dirname(path.dirname(libMainJS)));
1806
+ if (path.basename(nodeModulesDirectory) === "node_modules") {
1807
+ for (const unixKey in knownUnixlikePackages) {
1808
+ try {
1809
+ const pkg = knownUnixlikePackages[unixKey];
1810
+ if (fs.existsSync(path.join(nodeModulesDirectory, pkg)))
1811
+ return pkg;
1812
+ } catch {}
1813
+ }
1814
+ for (const windowsKey in knownWindowsPackages) {
1815
+ try {
1816
+ const pkg = knownWindowsPackages[windowsKey];
1817
+ if (fs.existsSync(path.join(nodeModulesDirectory, pkg)))
1818
+ return pkg;
1819
+ } catch {}
1820
+ }
1821
+ }
1822
+ return null;
1823
+ }
1824
+ function downloadedBinPath(pkg, subpath) {
1825
+ const esbuildLibDir = path.dirname(__require.resolve("esbuild"));
1826
+ return path.join(esbuildLibDir, `downloaded-${pkg.replace("/", "-")}-${path.basename(subpath)}`);
1827
+ }
1828
+ function generateBinPath() {
1829
+ if (isValidBinaryPath(ESBUILD_BINARY_PATH)) {
1830
+ if (!fs.existsSync(ESBUILD_BINARY_PATH)) {
1831
+ console.warn(`[esbuild] Ignoring bad configuration: ESBUILD_BINARY_PATH=${ESBUILD_BINARY_PATH}`);
1832
+ } else {
1833
+ return { binPath: ESBUILD_BINARY_PATH, isWASM: false };
1834
+ }
1835
+ }
1836
+ const { pkg, subpath, isWASM } = pkgAndSubpathForCurrentPlatform();
1837
+ let binPath;
1838
+ try {
1839
+ binPath = __require.resolve(`${pkg}/${subpath}`);
1840
+ } catch (e) {
1841
+ binPath = downloadedBinPath(pkg, subpath);
1842
+ if (!fs.existsSync(binPath)) {
1843
+ try {
1844
+ __require.resolve(pkg);
1845
+ } catch {
1846
+ const otherPkg = pkgForSomeOtherPlatform();
1847
+ if (otherPkg) {
1848
+ let suggestions = `
1849
+ Specifically the "${otherPkg}" package is present but this platform
1850
+ needs the "${pkg}" package instead. People often get into this
1851
+ situation by installing esbuild on Windows or macOS and copying "node_modules"
1852
+ into a Docker image that runs Linux, or by copying "node_modules" between
1853
+ Windows and WSL environments.
1854
+
1855
+ If you are installing with npm, you can try not copying the "node_modules"
1856
+ directory when you copy the files over, and running "npm ci" or "npm install"
1857
+ on the destination platform after the copy. Or you could consider using yarn
1858
+ instead of npm which has built-in support for installing a package on multiple
1859
+ platforms simultaneously.
1860
+
1861
+ If you are installing with yarn, you can try listing both this platform and the
1862
+ other platform in your ".yarnrc.yml" file using the "supportedArchitectures"
1863
+ feature: https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures
1864
+ Keep in mind that this means multiple copies of esbuild will be present.
1865
+ `;
1866
+ if (pkg === packageDarwin_x64 && otherPkg === packageDarwin_arm64 || pkg === packageDarwin_arm64 && otherPkg === packageDarwin_x64) {
1867
+ suggestions = `
1868
+ Specifically the "${otherPkg}" package is present but this platform
1869
+ needs the "${pkg}" package instead. People often get into this
1870
+ situation by installing esbuild with npm running inside of Rosetta 2 and then
1871
+ trying to use it with node running outside of Rosetta 2, or vice versa (Rosetta
1872
+ 2 is Apple's on-the-fly x86_64-to-arm64 translation service).
1873
+
1874
+ If you are installing with npm, you can try ensuring that both npm and node are
1875
+ not running under Rosetta 2 and then reinstalling esbuild. This likely involves
1876
+ changing how you installed npm and/or node. For example, installing node with
1877
+ the universal installer here should work: https://nodejs.org/en/download/. Or
1878
+ you could consider using yarn instead of npm which has built-in support for
1879
+ installing a package on multiple platforms simultaneously.
1880
+
1881
+ If you are installing with yarn, you can try listing both "arm64" and "x64"
1882
+ in your ".yarnrc.yml" file using the "supportedArchitectures" feature:
1883
+ https://yarnpkg.com/configuration/yarnrc/#supportedArchitectures
1884
+ Keep in mind that this means multiple copies of esbuild will be present.
1885
+ `;
1886
+ }
1887
+ throw new Error(`
1888
+ You installed esbuild for another platform than the one you're currently using.
1889
+ This won't work because esbuild is written with native code and needs to
1890
+ install a platform-specific binary executable.
1891
+ ${suggestions}
1892
+ Another alternative is to use the "esbuild-wasm" package instead, which works
1893
+ the same way on all platforms. But it comes with a heavy performance cost and
1894
+ can sometimes be 10x slower than the "esbuild" package, so you may also not
1895
+ want to do that.
1896
+ `);
1897
+ }
1898
+ throw new Error(`The package "${pkg}" could not be found, and is needed by esbuild.
1899
+
1900
+ If you are installing esbuild with npm, make sure that you don't specify the
1901
+ "--no-optional" or "--omit=optional" flags. The "optionalDependencies" feature
1902
+ of "package.json" is used by esbuild to install the correct binary executable
1903
+ for your current platform.`);
1904
+ }
1905
+ throw e;
1906
+ }
1907
+ }
1908
+ if (/\.zip\//.test(binPath)) {
1909
+ let pnpapi;
1910
+ try {
1911
+ pnpapi = (()=>{throw new Error("Cannot require module "+"pnpapi");})();
1912
+ } catch (e) {}
1913
+ if (pnpapi) {
1914
+ const root = pnpapi.getPackageInformation(pnpapi.topLevel).packageLocation;
1915
+ const binTargetPath = path.join(root, "node_modules", ".cache", "esbuild", `pnpapi-${pkg.replace("/", "-")}-${"0.25.12"}-${path.basename(subpath)}`);
1916
+ if (!fs.existsSync(binTargetPath)) {
1917
+ fs.mkdirSync(path.dirname(binTargetPath), { recursive: true });
1918
+ fs.copyFileSync(binPath, binTargetPath);
1919
+ fs.chmodSync(binTargetPath, 493);
1920
+ }
1921
+ return { binPath: binTargetPath, isWASM };
1922
+ }
1923
+ }
1924
+ return { binPath, isWASM };
1925
+ }
1926
+ var child_process = __require("child_process");
1927
+ var crypto = __require("crypto");
1928
+ var path2 = __require("path");
1929
+ var fs2 = __require("fs");
1930
+ var os2 = __require("os");
1931
+ var tty = __require("tty");
1932
+ var worker_threads;
1933
+ if (process.env.ESBUILD_WORKER_THREADS !== "0") {
1934
+ try {
1935
+ worker_threads = __require("worker_threads");
1936
+ } catch {}
1937
+ let [major, minor] = process.versions.node.split(".");
1938
+ if (+major < 12 || +major === 12 && +minor < 17 || +major === 13 && +minor < 13) {
1939
+ worker_threads = undefined;
1940
+ }
1941
+ }
1942
+ var _a;
1943
+ var isInternalWorkerThread = ((_a = worker_threads == null ? undefined : worker_threads.workerData) == null ? undefined : _a.esbuildVersion) === "0.25.12";
1944
+ var esbuildCommandAndArgs = () => {
1945
+ if ((!ESBUILD_BINARY_PATH || false) && (path2.basename(__filename) !== "main.js" || path2.basename(__dirname) !== "lib")) {
1946
+ throw new Error(`The esbuild JavaScript API cannot be bundled. Please mark the "esbuild" package as external so it's not included in the bundle.
1947
+
1948
+ More information: The file containing the code for esbuild's JavaScript API (${__filename}) does not appear to be inside the esbuild package on the file system, which usually means that the esbuild package was bundled into another file. This is problematic because the API needs to run a binary executable inside the esbuild package which is located using a relative path from the API code to the executable. If the esbuild package is bundled, the relative path will be incorrect and the executable won't be found.`);
1949
+ }
1950
+ if (false) {} else {
1951
+ const { binPath, isWASM } = generateBinPath();
1952
+ if (isWASM) {
1953
+ return ["node", [binPath]];
1954
+ } else {
1955
+ return [binPath, []];
1956
+ }
1957
+ }
1958
+ };
1959
+ var isTTY = () => tty.isatty(2);
1960
+ var fsSync = {
1961
+ readFile(tempFile, callback) {
1962
+ try {
1963
+ let contents = fs2.readFileSync(tempFile, "utf8");
1964
+ try {
1965
+ fs2.unlinkSync(tempFile);
1966
+ } catch {}
1967
+ callback(null, contents);
1968
+ } catch (err) {
1969
+ callback(err, null);
1970
+ }
1971
+ },
1972
+ writeFile(contents, callback) {
1973
+ try {
1974
+ let tempFile = randomFileName();
1975
+ fs2.writeFileSync(tempFile, contents);
1976
+ callback(tempFile);
1977
+ } catch {
1978
+ callback(null);
1979
+ }
1980
+ }
1981
+ };
1982
+ var fsAsync = {
1983
+ readFile(tempFile, callback) {
1984
+ try {
1985
+ fs2.readFile(tempFile, "utf8", (err, contents) => {
1986
+ try {
1987
+ fs2.unlink(tempFile, () => callback(err, contents));
1988
+ } catch {
1989
+ callback(err, contents);
1990
+ }
1991
+ });
1992
+ } catch (err) {
1993
+ callback(err, null);
1994
+ }
1995
+ },
1996
+ writeFile(contents, callback) {
1997
+ try {
1998
+ let tempFile = randomFileName();
1999
+ fs2.writeFile(tempFile, contents, (err) => err !== null ? callback(null) : callback(tempFile));
2000
+ } catch {
2001
+ callback(null);
2002
+ }
2003
+ }
2004
+ };
2005
+ var version = "0.25.12";
2006
+ var build = (options) => ensureServiceIsRunning().build(options);
2007
+ var context = (buildOptions) => ensureServiceIsRunning().context(buildOptions);
2008
+ var transform = (input, options) => ensureServiceIsRunning().transform(input, options);
2009
+ var formatMessages = (messages, options) => ensureServiceIsRunning().formatMessages(messages, options);
2010
+ var analyzeMetafile = (messages, options) => ensureServiceIsRunning().analyzeMetafile(messages, options);
2011
+ var buildSync = (options) => {
2012
+ if (worker_threads && !isInternalWorkerThread) {
2013
+ if (!workerThreadService)
2014
+ workerThreadService = startWorkerThreadService(worker_threads);
2015
+ return workerThreadService.buildSync(options);
2016
+ }
2017
+ let result;
2018
+ runServiceSync((service) => service.buildOrContext({
2019
+ callName: "buildSync",
2020
+ refs: null,
2021
+ options,
2022
+ isTTY: isTTY(),
2023
+ defaultWD,
2024
+ callback: (err, res) => {
2025
+ if (err)
2026
+ throw err;
2027
+ result = res;
2028
+ }
2029
+ }));
2030
+ return result;
2031
+ };
2032
+ var transformSync = (input, options) => {
2033
+ if (worker_threads && !isInternalWorkerThread) {
2034
+ if (!workerThreadService)
2035
+ workerThreadService = startWorkerThreadService(worker_threads);
2036
+ return workerThreadService.transformSync(input, options);
2037
+ }
2038
+ let result;
2039
+ runServiceSync((service) => service.transform({
2040
+ callName: "transformSync",
2041
+ refs: null,
2042
+ input,
2043
+ options: options || {},
2044
+ isTTY: isTTY(),
2045
+ fs: fsSync,
2046
+ callback: (err, res) => {
2047
+ if (err)
2048
+ throw err;
2049
+ result = res;
2050
+ }
2051
+ }));
2052
+ return result;
2053
+ };
2054
+ var formatMessagesSync = (messages, options) => {
2055
+ if (worker_threads && !isInternalWorkerThread) {
2056
+ if (!workerThreadService)
2057
+ workerThreadService = startWorkerThreadService(worker_threads);
2058
+ return workerThreadService.formatMessagesSync(messages, options);
2059
+ }
2060
+ let result;
2061
+ runServiceSync((service) => service.formatMessages({
2062
+ callName: "formatMessagesSync",
2063
+ refs: null,
2064
+ messages,
2065
+ options,
2066
+ callback: (err, res) => {
2067
+ if (err)
2068
+ throw err;
2069
+ result = res;
2070
+ }
2071
+ }));
2072
+ return result;
2073
+ };
2074
+ var analyzeMetafileSync = (metafile, options) => {
2075
+ if (worker_threads && !isInternalWorkerThread) {
2076
+ if (!workerThreadService)
2077
+ workerThreadService = startWorkerThreadService(worker_threads);
2078
+ return workerThreadService.analyzeMetafileSync(metafile, options);
2079
+ }
2080
+ let result;
2081
+ runServiceSync((service) => service.analyzeMetafile({
2082
+ callName: "analyzeMetafileSync",
2083
+ refs: null,
2084
+ metafile: typeof metafile === "string" ? metafile : JSON.stringify(metafile),
2085
+ options,
2086
+ callback: (err, res) => {
2087
+ if (err)
2088
+ throw err;
2089
+ result = res;
2090
+ }
2091
+ }));
2092
+ return result;
2093
+ };
2094
+ var stop = () => {
2095
+ if (stopService)
2096
+ stopService();
2097
+ if (workerThreadService)
2098
+ workerThreadService.stop();
2099
+ return Promise.resolve();
2100
+ };
2101
+ var initializeWasCalled = false;
2102
+ var initialize = (options) => {
2103
+ options = validateInitializeOptions(options || {});
2104
+ if (options.wasmURL)
2105
+ throw new Error(`The "wasmURL" option only works in the browser`);
2106
+ if (options.wasmModule)
2107
+ throw new Error(`The "wasmModule" option only works in the browser`);
2108
+ if (options.worker)
2109
+ throw new Error(`The "worker" option only works in the browser`);
2110
+ if (initializeWasCalled)
2111
+ throw new Error('Cannot call "initialize" more than once');
2112
+ ensureServiceIsRunning();
2113
+ initializeWasCalled = true;
2114
+ return Promise.resolve();
2115
+ };
2116
+ var defaultWD = process.cwd();
2117
+ var longLivedService;
2118
+ var stopService;
2119
+ var ensureServiceIsRunning = () => {
2120
+ if (longLivedService)
2121
+ return longLivedService;
2122
+ let [command, args] = esbuildCommandAndArgs();
2123
+ let child = child_process.spawn(command, args.concat(`--service=${"0.25.12"}`, "--ping"), {
2124
+ windowsHide: true,
2125
+ stdio: ["pipe", "pipe", "inherit"],
2126
+ cwd: defaultWD
2127
+ });
2128
+ let { readFromStdout, afterClose, service } = createChannel({
2129
+ writeToStdin(bytes) {
2130
+ child.stdin.write(bytes, (err) => {
2131
+ if (err)
2132
+ afterClose(err);
2133
+ });
2134
+ },
2135
+ readFileSync: fs2.readFileSync,
2136
+ isSync: false,
2137
+ hasFS: true,
2138
+ esbuild: node_exports
2139
+ });
2140
+ child.stdin.on("error", afterClose);
2141
+ child.on("error", afterClose);
2142
+ const stdin = child.stdin;
2143
+ const stdout = child.stdout;
2144
+ stdout.on("data", readFromStdout);
2145
+ stdout.on("end", afterClose);
2146
+ stopService = () => {
2147
+ stdin.destroy();
2148
+ stdout.destroy();
2149
+ child.kill();
2150
+ initializeWasCalled = false;
2151
+ longLivedService = undefined;
2152
+ stopService = undefined;
2153
+ };
2154
+ let refCount = 0;
2155
+ child.unref();
2156
+ if (stdin.unref) {
2157
+ stdin.unref();
2158
+ }
2159
+ if (stdout.unref) {
2160
+ stdout.unref();
2161
+ }
2162
+ const refs = {
2163
+ ref() {
2164
+ if (++refCount === 1)
2165
+ child.ref();
2166
+ },
2167
+ unref() {
2168
+ if (--refCount === 0)
2169
+ child.unref();
2170
+ }
2171
+ };
2172
+ longLivedService = {
2173
+ build: (options) => new Promise((resolve, reject) => {
2174
+ service.buildOrContext({
2175
+ callName: "build",
2176
+ refs,
2177
+ options,
2178
+ isTTY: isTTY(),
2179
+ defaultWD,
2180
+ callback: (err, res) => err ? reject(err) : resolve(res)
2181
+ });
2182
+ }),
2183
+ context: (options) => new Promise((resolve, reject) => service.buildOrContext({
2184
+ callName: "context",
2185
+ refs,
2186
+ options,
2187
+ isTTY: isTTY(),
2188
+ defaultWD,
2189
+ callback: (err, res) => err ? reject(err) : resolve(res)
2190
+ })),
2191
+ transform: (input, options) => new Promise((resolve, reject) => service.transform({
2192
+ callName: "transform",
2193
+ refs,
2194
+ input,
2195
+ options: options || {},
2196
+ isTTY: isTTY(),
2197
+ fs: fsAsync,
2198
+ callback: (err, res) => err ? reject(err) : resolve(res)
2199
+ })),
2200
+ formatMessages: (messages, options) => new Promise((resolve, reject) => service.formatMessages({
2201
+ callName: "formatMessages",
2202
+ refs,
2203
+ messages,
2204
+ options,
2205
+ callback: (err, res) => err ? reject(err) : resolve(res)
2206
+ })),
2207
+ analyzeMetafile: (metafile, options) => new Promise((resolve, reject) => service.analyzeMetafile({
2208
+ callName: "analyzeMetafile",
2209
+ refs,
2210
+ metafile: typeof metafile === "string" ? metafile : JSON.stringify(metafile),
2211
+ options,
2212
+ callback: (err, res) => err ? reject(err) : resolve(res)
2213
+ }))
2214
+ };
2215
+ return longLivedService;
2216
+ };
2217
+ var runServiceSync = (callback) => {
2218
+ let [command, args] = esbuildCommandAndArgs();
2219
+ let stdin = new Uint8Array;
2220
+ let { readFromStdout, afterClose, service } = createChannel({
2221
+ writeToStdin(bytes) {
2222
+ if (stdin.length !== 0)
2223
+ throw new Error("Must run at most one command");
2224
+ stdin = bytes;
2225
+ },
2226
+ isSync: true,
2227
+ hasFS: true,
2228
+ esbuild: node_exports
2229
+ });
2230
+ callback(service);
2231
+ let stdout = child_process.execFileSync(command, args.concat(`--service=${"0.25.12"}`), {
2232
+ cwd: defaultWD,
2233
+ windowsHide: true,
2234
+ input: stdin,
2235
+ maxBuffer: +process.env.ESBUILD_MAX_BUFFER || 16 * 1024 * 1024
2236
+ });
2237
+ readFromStdout(stdout);
2238
+ afterClose(null);
2239
+ };
2240
+ var randomFileName = () => {
2241
+ return path2.join(os2.tmpdir(), `esbuild-${crypto.randomBytes(32).toString("hex")}`);
2242
+ };
2243
+ var workerThreadService = null;
2244
+ var startWorkerThreadService = (worker_threads2) => {
2245
+ let { port1: mainPort, port2: workerPort } = new worker_threads2.MessageChannel;
2246
+ let worker = new worker_threads2.Worker(__filename, {
2247
+ workerData: { workerPort, defaultWD, esbuildVersion: "0.25.12" },
2248
+ transferList: [workerPort],
2249
+ execArgv: []
2250
+ });
2251
+ let nextID = 0;
2252
+ let fakeBuildError = (text) => {
2253
+ let error = new Error(`Build failed with 1 error:
2254
+ error: ${text}`);
2255
+ let errors = [{ id: "", pluginName: "", text, location: null, notes: [], detail: undefined }];
2256
+ error.errors = errors;
2257
+ error.warnings = [];
2258
+ return error;
2259
+ };
2260
+ let validateBuildSyncOptions = (options) => {
2261
+ if (!options)
2262
+ return;
2263
+ let plugins = options.plugins;
2264
+ if (plugins && plugins.length > 0)
2265
+ throw fakeBuildError(`Cannot use plugins in synchronous API calls`);
2266
+ };
2267
+ let applyProperties = (object, properties) => {
2268
+ for (let key in properties) {
2269
+ object[key] = properties[key];
2270
+ }
2271
+ };
2272
+ let runCallSync = (command, args) => {
2273
+ let id = nextID++;
2274
+ let sharedBuffer = new SharedArrayBuffer(8);
2275
+ let sharedBufferView = new Int32Array(sharedBuffer);
2276
+ let msg = { sharedBuffer, id, command, args };
2277
+ worker.postMessage(msg);
2278
+ let status = Atomics.wait(sharedBufferView, 0, 0);
2279
+ if (status !== "ok" && status !== "not-equal")
2280
+ throw new Error("Internal error: Atomics.wait() failed: " + status);
2281
+ let { message: { id: id2, resolve, reject, properties } } = worker_threads2.receiveMessageOnPort(mainPort);
2282
+ if (id !== id2)
2283
+ throw new Error(`Internal error: Expected id ${id} but got id ${id2}`);
2284
+ if (reject) {
2285
+ applyProperties(reject, properties);
2286
+ throw reject;
2287
+ }
2288
+ return resolve;
2289
+ };
2290
+ worker.unref();
2291
+ return {
2292
+ buildSync(options) {
2293
+ validateBuildSyncOptions(options);
2294
+ return runCallSync("build", [options]);
2295
+ },
2296
+ transformSync(input, options) {
2297
+ return runCallSync("transform", [input, options]);
2298
+ },
2299
+ formatMessagesSync(messages, options) {
2300
+ return runCallSync("formatMessages", [messages, options]);
2301
+ },
2302
+ analyzeMetafileSync(metafile, options) {
2303
+ return runCallSync("analyzeMetafile", [metafile, options]);
2304
+ },
2305
+ stop() {
2306
+ worker.terminate();
2307
+ workerThreadService = null;
2308
+ }
2309
+ };
2310
+ };
2311
+ var startSyncServiceWorker = () => {
2312
+ let workerPort = worker_threads.workerData.workerPort;
2313
+ let parentPort = worker_threads.parentPort;
2314
+ let extractProperties = (object) => {
2315
+ let properties = {};
2316
+ if (object && typeof object === "object") {
2317
+ for (let key in object) {
2318
+ properties[key] = object[key];
2319
+ }
2320
+ }
2321
+ return properties;
2322
+ };
2323
+ try {
2324
+ let service = ensureServiceIsRunning();
2325
+ defaultWD = worker_threads.workerData.defaultWD;
2326
+ parentPort.on("message", (msg) => {
2327
+ (async () => {
2328
+ let { sharedBuffer, id, command, args } = msg;
2329
+ let sharedBufferView = new Int32Array(sharedBuffer);
2330
+ try {
2331
+ switch (command) {
2332
+ case "build":
2333
+ workerPort.postMessage({ id, resolve: await service.build(args[0]) });
2334
+ break;
2335
+ case "transform":
2336
+ workerPort.postMessage({ id, resolve: await service.transform(args[0], args[1]) });
2337
+ break;
2338
+ case "formatMessages":
2339
+ workerPort.postMessage({ id, resolve: await service.formatMessages(args[0], args[1]) });
2340
+ break;
2341
+ case "analyzeMetafile":
2342
+ workerPort.postMessage({ id, resolve: await service.analyzeMetafile(args[0], args[1]) });
2343
+ break;
2344
+ default:
2345
+ throw new Error(`Invalid command: ${command}`);
2346
+ }
2347
+ } catch (reject) {
2348
+ workerPort.postMessage({ id, reject, properties: extractProperties(reject) });
2349
+ }
2350
+ Atomics.add(sharedBufferView, 0, 1);
2351
+ Atomics.notify(sharedBufferView, 0, Infinity);
2352
+ })();
2353
+ });
2354
+ } catch (reject) {
2355
+ parentPort.on("message", (msg) => {
2356
+ let { sharedBuffer, id } = msg;
2357
+ let sharedBufferView = new Int32Array(sharedBuffer);
2358
+ workerPort.postMessage({ id, reject, properties: extractProperties(reject) });
2359
+ Atomics.add(sharedBufferView, 0, 1);
2360
+ Atomics.notify(sharedBufferView, 0, Infinity);
2361
+ });
2362
+ }
2363
+ };
2364
+ if (isInternalWorkerThread) {
2365
+ startSyncServiceWorker();
2366
+ }
2367
+ var node_default = node_exports;
2368
+ });
2369
+ export default require_main();
2370
+
2371
+ //# debugId=F026D32E880DFAD264756E2164756E21
2372
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2VzYnVpbGQvbGliL21haW4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGUgPSBPYmplY3QuY3JlYXRlO1xudmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2dldE93blByb3BEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbnZhciBfX2dldE93blByb3BOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzO1xudmFyIF9fZ2V0UHJvdG9PZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbnZhciBfX2hhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIF9fZXhwb3J0ID0gKHRhcmdldCwgYWxsKSA9PiB7XG4gIGZvciAodmFyIG5hbWUgaW4gYWxsKVxuICAgIF9fZGVmUHJvcCh0YXJnZXQsIG5hbWUsIHsgZ2V0OiBhbGxbbmFtZV0sIGVudW1lcmFibGU6IHRydWUgfSk7XG59O1xudmFyIF9fY29weVByb3BzID0gKHRvLCBmcm9tLCBleGNlcHQsIGRlc2MpID0+IHtcbiAgaWYgKGZyb20gJiYgdHlwZW9mIGZyb20gPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGZyb20gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZvciAobGV0IGtleSBvZiBfX2dldE93blByb3BOYW1lcyhmcm9tKSlcbiAgICAgIGlmICghX19oYXNPd25Qcm9wLmNhbGwodG8sIGtleSkgJiYga2V5ICE9PSBleGNlcHQpXG4gICAgICAgIF9fZGVmUHJvcCh0bywga2V5LCB7IGdldDogKCkgPT4gZnJvbVtrZXldLCBlbnVtZXJhYmxlOiAhKGRlc2MgPSBfX2dldE93blByb3BEZXNjKGZyb20sIGtleSkpIHx8IGRlc2MuZW51bWVyYWJsZSB9KTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xudmFyIF9fdG9FU00gPSAobW9kLCBpc05vZGVNb2RlLCB0YXJnZXQpID0+ICh0YXJnZXQgPSBtb2QgIT0gbnVsbCA/IF9fY3JlYXRlKF9fZ2V0UHJvdG9PZihtb2QpKSA6IHt9LCBfX2NvcHlQcm9wcyhcbiAgLy8gSWYgdGhlIGltcG9ydGVyIGlzIGluIG5vZGUgY29tcGF0aWJpbGl0eSBtb2RlIG9yIHRoaXMgaXMgbm90IGFuIEVTTVxuICAvLyBmaWxlIHRoYXQgaGFzIGJlZW4gY29udmVydGVkIHRvIGEgQ29tbW9uSlMgZmlsZSB1c2luZyBhIEJhYmVsLVxuICAvLyBjb21wYXRpYmxlIHRyYW5zZm9ybSAoaS5lLiBcIl9fZXNNb2R1bGVcIiBoYXMgbm90IGJlZW4gc2V0KSwgdGhlbiBzZXRcbiAgLy8gXCJkZWZhdWx0XCIgdG8gdGhlIENvbW1vbkpTIFwibW9kdWxlLmV4cG9ydHNcIiBmb3Igbm9kZSBjb21wYXRpYmlsaXR5LlxuICBpc05vZGVNb2RlIHx8ICFtb2QgfHwgIW1vZC5fX2VzTW9kdWxlID8gX19kZWZQcm9wKHRhcmdldCwgXCJkZWZhdWx0XCIsIHsgdmFsdWU6IG1vZCwgZW51bWVyYWJsZTogdHJ1ZSB9KSA6IHRhcmdldCxcbiAgbW9kXG4pKTtcbnZhciBfX3RvQ29tbW9uSlMgPSAobW9kKSA9PiBfX2NvcHlQcm9wcyhfX2RlZlByb3Aoe30sIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pLCBtb2QpO1xuXG4vLyBsaWIvbnBtL25vZGUudHNcbnZhciBub2RlX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KG5vZGVfZXhwb3J0cywge1xuICBhbmFseXplTWV0YWZpbGU6ICgpID0+IGFuYWx5emVNZXRhZmlsZSxcbiAgYW5hbHl6ZU1ldGFmaWxlU3luYzogKCkgPT4gYW5hbHl6ZU1ldGFmaWxlU3luYyxcbiAgYnVpbGQ6ICgpID0+IGJ1aWxkLFxuICBidWlsZFN5bmM6ICgpID0+IGJ1aWxkU3luYyxcbiAgY29udGV4dDogKCkgPT4gY29udGV4dCxcbiAgZGVmYXVsdDogKCkgPT4gbm9kZV9kZWZhdWx0LFxuICBmb3JtYXRNZXNzYWdlczogKCkgPT4gZm9ybWF0TWVzc2FnZXMsXG4gIGZvcm1hdE1lc3NhZ2VzU3luYzogKCkgPT4gZm9ybWF0TWVzc2FnZXNTeW5jLFxuICBpbml0aWFsaXplOiAoKSA9PiBpbml0aWFsaXplLFxuICBzdG9wOiAoKSA9PiBzdG9wLFxuICB0cmFuc2Zvcm06ICgpID0+IHRyYW5zZm9ybSxcbiAgdHJhbnNmb3JtU3luYzogKCkgPT4gdHJhbnNmb3JtU3luYyxcbiAgdmVyc2lvbjogKCkgPT4gdmVyc2lvblxufSk7XG5tb2R1bGUuZXhwb3J0cyA9IF9fdG9Db21tb25KUyhub2RlX2V4cG9ydHMpO1xuXG4vLyBsaWIvc2hhcmVkL3N0ZGlvX3Byb3RvY29sLnRzXG5mdW5jdGlvbiBlbmNvZGVQYWNrZXQocGFja2V0KSB7XG4gIGxldCB2aXNpdCA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgYmIud3JpdGU4KDApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgYmIud3JpdGU4KDEpO1xuICAgICAgYmIud3JpdGU4KCt2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGJiLndyaXRlOCgyKTtcbiAgICAgIGJiLndyaXRlMzIodmFsdWUgfCAwKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgYmIud3JpdGU4KDMpO1xuICAgICAgYmIud3JpdGUoZW5jb2RlVVRGOCh2YWx1ZSkpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICBiYi53cml0ZTgoNCk7XG4gICAgICBiYi53cml0ZSh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBiYi53cml0ZTgoNSk7XG4gICAgICBiYi53cml0ZTMyKHZhbHVlLmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIHZpc2l0KGl0ZW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgIGJiLndyaXRlOCg2KTtcbiAgICAgIGJiLndyaXRlMzIoa2V5cy5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICAgICAgYmIud3JpdGUoZW5jb2RlVVRGOChrZXkpKTtcbiAgICAgICAgdmlzaXQodmFsdWVba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBsZXQgYmIgPSBuZXcgQnl0ZUJ1ZmZlcigpO1xuICBiYi53cml0ZTMyKDApO1xuICBiYi53cml0ZTMyKHBhY2tldC5pZCA8PCAxIHwgKyFwYWNrZXQuaXNSZXF1ZXN0KTtcbiAgdmlzaXQocGFja2V0LnZhbHVlKTtcbiAgd3JpdGVVSW50MzJMRShiYi5idWYsIGJiLmxlbiAtIDQsIDApO1xuICByZXR1cm4gYmIuYnVmLnN1YmFycmF5KDAsIGJiLmxlbik7XG59XG5mdW5jdGlvbiBkZWNvZGVQYWNrZXQoYnl0ZXMpIHtcbiAgbGV0IHZpc2l0ID0gKCkgPT4ge1xuICAgIHN3aXRjaCAoYmIucmVhZDgoKSkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuICEhYmIucmVhZDgoKTtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIGJiLnJlYWQzMigpO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gZGVjb2RlVVRGOChiYi5yZWFkKCkpO1xuICAgICAgY2FzZSA0OlxuICAgICAgICByZXR1cm4gYmIucmVhZCgpO1xuICAgICAgY2FzZSA1OiB7XG4gICAgICAgIGxldCBjb3VudCA9IGJiLnJlYWQzMigpO1xuICAgICAgICBsZXQgdmFsdWUyID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgIHZhbHVlMi5wdXNoKHZpc2l0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTI7XG4gICAgICB9XG4gICAgICBjYXNlIDY6IHtcbiAgICAgICAgbGV0IGNvdW50ID0gYmIucmVhZDMyKCk7XG4gICAgICAgIGxldCB2YWx1ZTIgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgdmFsdWUyW2RlY29kZVVURjgoYmIucmVhZCgpKV0gPSB2aXNpdCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTI7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhY2tldFwiKTtcbiAgICB9XG4gIH07XG4gIGxldCBiYiA9IG5ldyBCeXRlQnVmZmVyKGJ5dGVzKTtcbiAgbGV0IGlkID0gYmIucmVhZDMyKCk7XG4gIGxldCBpc1JlcXVlc3QgPSAoaWQgJiAxKSA9PT0gMDtcbiAgaWQgPj4+PSAxO1xuICBsZXQgdmFsdWUgPSB2aXNpdCgpO1xuICBpZiAoYmIucHRyICE9PSBieXRlcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhY2tldFwiKTtcbiAgfVxuICByZXR1cm4geyBpZCwgaXNSZXF1ZXN0LCB2YWx1ZSB9O1xufVxudmFyIEJ5dGVCdWZmZXIgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGJ1ZiA9IG5ldyBVaW50OEFycmF5KDEwMjQpKSB7XG4gICAgdGhpcy5idWYgPSBidWY7XG4gICAgdGhpcy5sZW4gPSAwO1xuICAgIHRoaXMucHRyID0gMDtcbiAgfVxuICBfd3JpdGUoZGVsdGEpIHtcbiAgICBpZiAodGhpcy5sZW4gKyBkZWx0YSA+IHRoaXMuYnVmLmxlbmd0aCkge1xuICAgICAgbGV0IGNsb25lID0gbmV3IFVpbnQ4QXJyYXkoKHRoaXMubGVuICsgZGVsdGEpICogMik7XG4gICAgICBjbG9uZS5zZXQodGhpcy5idWYpO1xuICAgICAgdGhpcy5idWYgPSBjbG9uZTtcbiAgICB9XG4gICAgdGhpcy5sZW4gKz0gZGVsdGE7XG4gICAgcmV0dXJuIHRoaXMubGVuIC0gZGVsdGE7XG4gIH1cbiAgd3JpdGU4KHZhbHVlKSB7XG4gICAgbGV0IG9mZnNldCA9IHRoaXMuX3dyaXRlKDEpO1xuICAgIHRoaXMuYnVmW29mZnNldF0gPSB2YWx1ZTtcbiAgfVxuICB3cml0ZTMyKHZhbHVlKSB7XG4gICAgbGV0IG9mZnNldCA9IHRoaXMuX3dyaXRlKDQpO1xuICAgIHdyaXRlVUludDMyTEUodGhpcy5idWYsIHZhbHVlLCBvZmZzZXQpO1xuICB9XG4gIHdyaXRlKGJ5dGVzKSB7XG4gICAgbGV0IG9mZnNldCA9IHRoaXMuX3dyaXRlKDQgKyBieXRlcy5sZW5ndGgpO1xuICAgIHdyaXRlVUludDMyTEUodGhpcy5idWYsIGJ5dGVzLmxlbmd0aCwgb2Zmc2V0KTtcbiAgICB0aGlzLmJ1Zi5zZXQoYnl0ZXMsIG9mZnNldCArIDQpO1xuICB9XG4gIF9yZWFkKGRlbHRhKSB7XG4gICAgaWYgKHRoaXMucHRyICsgZGVsdGEgPiB0aGlzLmJ1Zi5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFja2V0XCIpO1xuICAgIH1cbiAgICB0aGlzLnB0ciArPSBkZWx0YTtcbiAgICByZXR1cm4gdGhpcy5wdHIgLSBkZWx0YTtcbiAgfVxuICByZWFkOCgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZbdGhpcy5fcmVhZCgxKV07XG4gIH1cbiAgcmVhZDMyKCkge1xuICAgIHJldHVybiByZWFkVUludDMyTEUodGhpcy5idWYsIHRoaXMuX3JlYWQoNCkpO1xuICB9XG4gIHJlYWQoKSB7XG4gICAgbGV0IGxlbmd0aCA9IHRoaXMucmVhZDMyKCk7XG4gICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICBsZXQgcHRyID0gdGhpcy5fcmVhZChieXRlcy5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldCh0aGlzLmJ1Zi5zdWJhcnJheShwdHIsIHB0ciArIGxlbmd0aCkpO1xuICAgIHJldHVybiBieXRlcztcbiAgfVxufTtcbnZhciBlbmNvZGVVVEY4O1xudmFyIGRlY29kZVVURjg7XG52YXIgZW5jb2RlSW52YXJpYW50O1xuaWYgKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgVGV4dERlY29kZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgbGV0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgbGV0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgZW5jb2RlVVRGOCA9ICh0ZXh0KSA9PiBlbmNvZGVyLmVuY29kZSh0ZXh0KTtcbiAgZGVjb2RlVVRGOCA9IChieXRlcykgPT4gZGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuICBlbmNvZGVJbnZhcmlhbnQgPSAnbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFwiXCIpJztcbn0gZWxzZSBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICBlbmNvZGVVVEY4ID0gKHRleHQpID0+IEJ1ZmZlci5mcm9tKHRleHQpO1xuICBkZWNvZGVVVEY4ID0gKGJ5dGVzKSA9PiB7XG4gICAgbGV0IHsgYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoIH0gPSBieXRlcztcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKS50b1N0cmluZygpO1xuICB9O1xuICBlbmNvZGVJbnZhcmlhbnQgPSAnQnVmZmVyLmZyb20oXCJcIiknO1xufSBlbHNlIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwiTm8gVVRGLTggY29kZWMgZm91bmRcIik7XG59XG5pZiAoIShlbmNvZGVVVEY4KFwiXCIpIGluc3RhbmNlb2YgVWludDhBcnJheSkpXG4gIHRocm93IG5ldyBFcnJvcihgSW52YXJpYW50IHZpb2xhdGlvbjogXCIke2VuY29kZUludmFyaWFudH0gaW5zdGFuY2VvZiBVaW50OEFycmF5XCIgaXMgaW5jb3JyZWN0bHkgZmFsc2VcblxuVGhpcyBpbmRpY2F0ZXMgdGhhdCB5b3VyIEphdmFTY3JpcHQgZW52aXJvbm1lbnQgaXMgYnJva2VuLiBZb3UgY2Fubm90IHVzZVxuZXNidWlsZCBpbiB0aGlzIGVudmlyb25tZW50IGJlY2F1c2UgZXNidWlsZCByZWxpZXMgb24gdGhpcyBpbnZhcmlhbnQuIFRoaXNcbmlzIG5vdCBhIHByb2JsZW0gd2l0aCBlc2J1aWxkLiBZb3UgbmVlZCB0byBmaXggeW91ciBlbnZpcm9ubWVudCBpbnN0ZWFkLlxuYCk7XG5mdW5jdGlvbiByZWFkVUludDMyTEUoYnVmZmVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIGJ1ZmZlcltvZmZzZXQrK10gfCBidWZmZXJbb2Zmc2V0KytdIDw8IDggfCBidWZmZXJbb2Zmc2V0KytdIDw8IDE2IHwgYnVmZmVyW29mZnNldCsrXSA8PCAyNDtcbn1cbmZ1bmN0aW9uIHdyaXRlVUludDMyTEUoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0KSB7XG4gIGJ1ZmZlcltvZmZzZXQrK10gPSB2YWx1ZTtcbiAgYnVmZmVyW29mZnNldCsrXSA9IHZhbHVlID4+IDg7XG4gIGJ1ZmZlcltvZmZzZXQrK10gPSB2YWx1ZSA+PiAxNjtcbiAgYnVmZmVyW29mZnNldCsrXSA9IHZhbHVlID4+IDI0O1xufVxuXG4vLyBsaWIvc2hhcmVkL2NvbW1vbi50c1xudmFyIHF1b3RlID0gSlNPTi5zdHJpbmdpZnk7XG52YXIgYnVpbGRMb2dMZXZlbERlZmF1bHQgPSBcIndhcm5pbmdcIjtcbnZhciB0cmFuc2Zvcm1Mb2dMZXZlbERlZmF1bHQgPSBcInNpbGVudFwiO1xuZnVuY3Rpb24gdmFsaWRhdGVBbmRKb2luU3RyaW5nQXJyYXkodmFsdWVzLCB3aGF0KSB7XG4gIGNvbnN0IHRvSm9pbiA9IFtdO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgIHZhbGlkYXRlU3RyaW5nVmFsdWUodmFsdWUsIHdoYXQpO1xuICAgIGlmICh2YWx1ZS5pbmRleE9mKFwiLFwiKSA+PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgJHt3aGF0fTogJHt2YWx1ZX1gKTtcbiAgICB0b0pvaW4ucHVzaCh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHRvSm9pbi5qb2luKFwiLFwiKTtcbn1cbnZhciBjYW5CZUFueXRoaW5nID0gKCkgPT4gbnVsbDtcbnZhciBtdXN0QmVCb29sZWFuID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiID8gbnVsbCA6IFwiYSBib29sZWFuXCI7XG52YXIgbXVzdEJlU3RyaW5nID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyBudWxsIDogXCJhIHN0cmluZ1wiO1xudmFyIG11c3RCZVJlZ0V4cCA9ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgPyBudWxsIDogXCJhIFJlZ0V4cCBvYmplY3RcIjtcbnZhciBtdXN0QmVJbnRlZ2VyID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgdmFsdWUgPT09ICh2YWx1ZSB8IDApID8gbnVsbCA6IFwiYW4gaW50ZWdlclwiO1xudmFyIG11c3RCZVZhbGlkUG9ydE51bWJlciA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIHZhbHVlID09PSAodmFsdWUgfCAwKSAmJiB2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDY1NTM1ID8gbnVsbCA6IFwiYSB2YWxpZCBwb3J0IG51bWJlclwiO1xudmFyIG11c3RCZUZ1bmN0aW9uID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IG51bGwgOiBcImEgZnVuY3Rpb25cIjtcbnZhciBtdXN0QmVBcnJheSA9ICh2YWx1ZSkgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBudWxsIDogXCJhbiBhcnJheVwiO1xudmFyIG11c3RCZUFycmF5T2ZTdHJpbmdzID0gKHZhbHVlKSA9PiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoeCkgPT4gdHlwZW9mIHggPT09IFwic3RyaW5nXCIpID8gbnVsbCA6IFwiYW4gYXJyYXkgb2Ygc3RyaW5nc1wiO1xudmFyIG11c3RCZU9iamVjdCA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSA/IG51bGwgOiBcImFuIG9iamVjdFwiO1xudmFyIG11c3RCZUVudHJ5UG9pbnRzID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgPyBudWxsIDogXCJhbiBhcnJheSBvciBhbiBvYmplY3RcIjtcbnZhciBtdXN0QmVXZWJBc3NlbWJseU1vZHVsZSA9ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBXZWJBc3NlbWJseS5Nb2R1bGUgPyBudWxsIDogXCJhIFdlYkFzc2VtYmx5Lk1vZHVsZVwiO1xudmFyIG11c3RCZU9iamVjdE9yTnVsbCA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSA/IG51bGwgOiBcImFuIG9iamVjdCBvciBudWxsXCI7XG52YXIgbXVzdEJlU3RyaW5nT3JCb29sZWFuID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIiA/IG51bGwgOiBcImEgc3RyaW5nIG9yIGEgYm9vbGVhblwiO1xudmFyIG11c3RCZVN0cmluZ09yT2JqZWN0ID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSA/IG51bGwgOiBcImEgc3RyaW5nIG9yIGFuIG9iamVjdFwiO1xudmFyIG11c3RCZVN0cmluZ09yQXJyYXlPZlN0cmluZ3MgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoeCkgPT4gdHlwZW9mIHggPT09IFwic3RyaW5nXCIpID8gbnVsbCA6IFwiYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5nc1wiO1xudmFyIG11c3RCZVN0cmluZ09yVWludDhBcnJheSA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSA/IG51bGwgOiBcImEgc3RyaW5nIG9yIGEgVWludDhBcnJheVwiO1xudmFyIG11c3RCZVN0cmluZ09yVVJMID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgaW5zdGFuY2VvZiBVUkwgPyBudWxsIDogXCJhIHN0cmluZyBvciBhIFVSTFwiO1xuZnVuY3Rpb24gZ2V0RmxhZyhvYmplY3QsIGtleXMsIGtleSwgbXVzdEJlRm4pIHtcbiAgbGV0IHZhbHVlID0gb2JqZWN0W2tleV07XG4gIGtleXNba2V5ICsgXCJcIl0gPSB0cnVlO1xuICBpZiAodmFsdWUgPT09IHZvaWQgMCkgcmV0dXJuIHZvaWQgMDtcbiAgbGV0IG11c3RCZSA9IG11c3RCZUZuKHZhbHVlKTtcbiAgaWYgKG11c3RCZSAhPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKGAke3F1b3RlKGtleSl9IG11c3QgYmUgJHttdXN0QmV9YCk7XG4gIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9iamVjdCwga2V5cywgd2hlcmUpIHtcbiAgZm9yIChsZXQga2V5IGluIG9iamVjdCkge1xuICAgIGlmICghKGtleSBpbiBrZXlzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG9wdGlvbiAke3doZXJlfTogJHtxdW90ZShrZXkpfWApO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gdmFsaWRhdGVJbml0aWFsaXplT3B0aW9ucyhvcHRpb25zKSB7XG4gIGxldCBrZXlzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGxldCB3YXNtVVJMID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIndhc21VUkxcIiwgbXVzdEJlU3RyaW5nT3JVUkwpO1xuICBsZXQgd2FzbU1vZHVsZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ3YXNtTW9kdWxlXCIsIG11c3RCZVdlYkFzc2VtYmx5TW9kdWxlKTtcbiAgbGV0IHdvcmtlciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ3b3JrZXJcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMsIFwiaW4gaW5pdGlhbGl6ZSgpIGNhbGxcIik7XG4gIHJldHVybiB7XG4gICAgd2FzbVVSTCxcbiAgICB3YXNtTW9kdWxlLFxuICAgIHdvcmtlclxuICB9O1xufVxuZnVuY3Rpb24gdmFsaWRhdGVNYW5nbGVDYWNoZShtYW5nbGVDYWNoZSkge1xuICBsZXQgdmFsaWRhdGVkO1xuICBpZiAobWFuZ2xlQ2FjaGUgIT09IHZvaWQgMCkge1xuICAgIHZhbGlkYXRlZCA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGZvciAobGV0IGtleSBpbiBtYW5nbGVDYWNoZSkge1xuICAgICAgbGV0IHZhbHVlID0gbWFuZ2xlQ2FjaGVba2V5XTtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHZhbGlkYXRlZFtrZXldID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7cXVvdGUoa2V5KX0gaW4gbWFuZ2xlIGNhY2hlIHRvIG1hcCB0byBlaXRoZXIgYSBzdHJpbmcgb3IgZmFsc2VgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbGlkYXRlZDtcbn1cbmZ1bmN0aW9uIHB1c2hMb2dGbGFncyhmbGFncywgb3B0aW9ucywga2V5cywgaXNUVFkyLCBsb2dMZXZlbERlZmF1bHQpIHtcbiAgbGV0IGNvbG9yID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImNvbG9yXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbG9nTGV2ZWwgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibG9nTGV2ZWxcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGxvZ0xpbWl0ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxvZ0xpbWl0XCIsIG11c3RCZUludGVnZXIpO1xuICBpZiAoY29sb3IgIT09IHZvaWQgMCkgZmxhZ3MucHVzaChgLS1jb2xvcj0ke2NvbG9yfWApO1xuICBlbHNlIGlmIChpc1RUWTIpIGZsYWdzLnB1c2goYC0tY29sb3I9dHJ1ZWApO1xuICBmbGFncy5wdXNoKGAtLWxvZy1sZXZlbD0ke2xvZ0xldmVsIHx8IGxvZ0xldmVsRGVmYXVsdH1gKTtcbiAgZmxhZ3MucHVzaChgLS1sb2ctbGltaXQ9JHtsb2dMaW1pdCB8fCAwfWApO1xufVxuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmdWYWx1ZSh2YWx1ZSwgd2hhdCwga2V5KSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHZhbHVlIGZvciAke3doYXR9JHtrZXkgIT09IHZvaWQgMCA/IFwiIFwiICsgcXVvdGUoa2V5KSA6IFwiXCJ9IHRvIGJlIGEgc3RyaW5nLCBnb3QgJHt0eXBlb2YgdmFsdWV9IGluc3RlYWRgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBwdXNoQ29tbW9uRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMpIHtcbiAgbGV0IGxlZ2FsQ29tbWVudHMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibGVnYWxDb21tZW50c1wiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgc291cmNlUm9vdCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzb3VyY2VSb290XCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBzb3VyY2VzQ29udGVudCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzb3VyY2VzQ29udGVudFwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IHRhcmdldCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ0YXJnZXRcIiwgbXVzdEJlU3RyaW5nT3JBcnJheU9mU3RyaW5ncyk7XG4gIGxldCBmb3JtYXQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiZm9ybWF0XCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBnbG9iYWxOYW1lID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImdsb2JhbE5hbWVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IG1hbmdsZVByb3BzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1hbmdsZVByb3BzXCIsIG11c3RCZVJlZ0V4cCk7XG4gIGxldCByZXNlcnZlUHJvcHMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwicmVzZXJ2ZVByb3BzXCIsIG11c3RCZVJlZ0V4cCk7XG4gIGxldCBtYW5nbGVRdW90ZWQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFuZ2xlUXVvdGVkXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbWluaWZ5ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1pbmlmeVwiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IG1pbmlmeVN5bnRheCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJtaW5pZnlTeW50YXhcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBtaW5pZnlXaGl0ZXNwYWNlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1pbmlmeVdoaXRlc3BhY2VcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBtaW5pZnlJZGVudGlmaWVycyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJtaW5pZnlJZGVudGlmaWVyc1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IGxpbmVMaW1pdCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJsaW5lTGltaXRcIiwgbXVzdEJlSW50ZWdlcik7XG4gIGxldCBkcm9wID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImRyb3BcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgZHJvcExhYmVscyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJkcm9wTGFiZWxzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IGNoYXJzZXQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiY2hhcnNldFwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgdHJlZVNoYWtpbmcgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwidHJlZVNoYWtpbmdcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBpZ25vcmVBbm5vdGF0aW9ucyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJpZ25vcmVBbm5vdGF0aW9uc1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IGpzeCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGpzeEZhY3RvcnkgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwianN4RmFjdG9yeVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQganN4RnJhZ21lbnQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwianN4RnJhZ21lbnRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGpzeEltcG9ydFNvdXJjZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hJbXBvcnRTb3VyY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGpzeERldiA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hEZXZcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBqc3hTaWRlRWZmZWN0cyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJqc3hTaWRlRWZmZWN0c1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IGRlZmluZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJkZWZpbmVcIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IGxvZ092ZXJyaWRlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxvZ092ZXJyaWRlXCIsIG11c3RCZU9iamVjdCk7XG4gIGxldCBzdXBwb3J0ZWQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwic3VwcG9ydGVkXCIsIG11c3RCZU9iamVjdCk7XG4gIGxldCBwdXJlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInB1cmVcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQga2VlcE5hbWVzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImtlZXBOYW1lc1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgbGV0IHBsYXRmb3JtID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInBsYXRmb3JtXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCB0c2NvbmZpZ1JhdyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ0c2NvbmZpZ1Jhd1wiLCBtdXN0QmVTdHJpbmdPck9iamVjdCk7XG4gIGxldCBhYnNQYXRocyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJhYnNQYXRoc1wiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gIGlmIChsZWdhbENvbW1lbnRzKSBmbGFncy5wdXNoKGAtLWxlZ2FsLWNvbW1lbnRzPSR7bGVnYWxDb21tZW50c31gKTtcbiAgaWYgKHNvdXJjZVJvb3QgIT09IHZvaWQgMCkgZmxhZ3MucHVzaChgLS1zb3VyY2Utcm9vdD0ke3NvdXJjZVJvb3R9YCk7XG4gIGlmIChzb3VyY2VzQ29udGVudCAhPT0gdm9pZCAwKSBmbGFncy5wdXNoKGAtLXNvdXJjZXMtY29udGVudD0ke3NvdXJjZXNDb250ZW50fWApO1xuICBpZiAodGFyZ2V0KSBmbGFncy5wdXNoKGAtLXRhcmdldD0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KEFycmF5LmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldCA6IFt0YXJnZXRdLCBcInRhcmdldFwiKX1gKTtcbiAgaWYgKGZvcm1hdCkgZmxhZ3MucHVzaChgLS1mb3JtYXQ9JHtmb3JtYXR9YCk7XG4gIGlmIChnbG9iYWxOYW1lKSBmbGFncy5wdXNoKGAtLWdsb2JhbC1uYW1lPSR7Z2xvYmFsTmFtZX1gKTtcbiAgaWYgKHBsYXRmb3JtKSBmbGFncy5wdXNoKGAtLXBsYXRmb3JtPSR7cGxhdGZvcm19YCk7XG4gIGlmICh0c2NvbmZpZ1JhdykgZmxhZ3MucHVzaChgLS10c2NvbmZpZy1yYXc9JHt0eXBlb2YgdHNjb25maWdSYXcgPT09IFwic3RyaW5nXCIgPyB0c2NvbmZpZ1JhdyA6IEpTT04uc3RyaW5naWZ5KHRzY29uZmlnUmF3KX1gKTtcbiAgaWYgKG1pbmlmeSkgZmxhZ3MucHVzaChcIi0tbWluaWZ5XCIpO1xuICBpZiAobWluaWZ5U3ludGF4KSBmbGFncy5wdXNoKFwiLS1taW5pZnktc3ludGF4XCIpO1xuICBpZiAobWluaWZ5V2hpdGVzcGFjZSkgZmxhZ3MucHVzaChcIi0tbWluaWZ5LXdoaXRlc3BhY2VcIik7XG4gIGlmIChtaW5pZnlJZGVudGlmaWVycykgZmxhZ3MucHVzaChcIi0tbWluaWZ5LWlkZW50aWZpZXJzXCIpO1xuICBpZiAobGluZUxpbWl0KSBmbGFncy5wdXNoKGAtLWxpbmUtbGltaXQ9JHtsaW5lTGltaXR9YCk7XG4gIGlmIChjaGFyc2V0KSBmbGFncy5wdXNoKGAtLWNoYXJzZXQ9JHtjaGFyc2V0fWApO1xuICBpZiAodHJlZVNoYWtpbmcgIT09IHZvaWQgMCkgZmxhZ3MucHVzaChgLS10cmVlLXNoYWtpbmc9JHt0cmVlU2hha2luZ31gKTtcbiAgaWYgKGlnbm9yZUFubm90YXRpb25zKSBmbGFncy5wdXNoKGAtLWlnbm9yZS1hbm5vdGF0aW9uc2ApO1xuICBpZiAoZHJvcCkgZm9yIChsZXQgd2hhdCBvZiBkcm9wKSBmbGFncy5wdXNoKGAtLWRyb3A6JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKHdoYXQsIFwiZHJvcFwiKX1gKTtcbiAgaWYgKGRyb3BMYWJlbHMpIGZsYWdzLnB1c2goYC0tZHJvcC1sYWJlbHM9JHt2YWxpZGF0ZUFuZEpvaW5TdHJpbmdBcnJheShkcm9wTGFiZWxzLCBcImRyb3AgbGFiZWxcIil9YCk7XG4gIGlmIChhYnNQYXRocykgZmxhZ3MucHVzaChgLS1hYnMtcGF0aHM9JHt2YWxpZGF0ZUFuZEpvaW5TdHJpbmdBcnJheShhYnNQYXRocywgXCJhYnMgcGF0aHNcIil9YCk7XG4gIGlmIChtYW5nbGVQcm9wcykgZmxhZ3MucHVzaChgLS1tYW5nbGUtcHJvcHM9JHtqc1JlZ0V4cFRvR29SZWdFeHAobWFuZ2xlUHJvcHMpfWApO1xuICBpZiAocmVzZXJ2ZVByb3BzKSBmbGFncy5wdXNoKGAtLXJlc2VydmUtcHJvcHM9JHtqc1JlZ0V4cFRvR29SZWdFeHAocmVzZXJ2ZVByb3BzKX1gKTtcbiAgaWYgKG1hbmdsZVF1b3RlZCAhPT0gdm9pZCAwKSBmbGFncy5wdXNoKGAtLW1hbmdsZS1xdW90ZWQ9JHttYW5nbGVRdW90ZWR9YCk7XG4gIGlmIChqc3gpIGZsYWdzLnB1c2goYC0tanN4PSR7anN4fWApO1xuICBpZiAoanN4RmFjdG9yeSkgZmxhZ3MucHVzaChgLS1qc3gtZmFjdG9yeT0ke2pzeEZhY3Rvcnl9YCk7XG4gIGlmIChqc3hGcmFnbWVudCkgZmxhZ3MucHVzaChgLS1qc3gtZnJhZ21lbnQ9JHtqc3hGcmFnbWVudH1gKTtcbiAgaWYgKGpzeEltcG9ydFNvdXJjZSkgZmxhZ3MucHVzaChgLS1qc3gtaW1wb3J0LXNvdXJjZT0ke2pzeEltcG9ydFNvdXJjZX1gKTtcbiAgaWYgKGpzeERldikgZmxhZ3MucHVzaChgLS1qc3gtZGV2YCk7XG4gIGlmIChqc3hTaWRlRWZmZWN0cykgZmxhZ3MucHVzaChgLS1qc3gtc2lkZS1lZmZlY3RzYCk7XG4gIGlmIChkZWZpbmUpIHtcbiAgICBmb3IgKGxldCBrZXkgaW4gZGVmaW5lKSB7XG4gICAgICBpZiAoa2V5LmluZGV4T2YoXCI9XCIpID49IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkZWZpbmU6ICR7a2V5fWApO1xuICAgICAgZmxhZ3MucHVzaChgLS1kZWZpbmU6JHtrZXl9PSR7dmFsaWRhdGVTdHJpbmdWYWx1ZShkZWZpbmVba2V5XSwgXCJkZWZpbmVcIiwga2V5KX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKGxvZ092ZXJyaWRlKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGxvZ092ZXJyaWRlKSB7XG4gICAgICBpZiAoa2V5LmluZGV4T2YoXCI9XCIpID49IDApIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb2cgb3ZlcnJpZGU6ICR7a2V5fWApO1xuICAgICAgZmxhZ3MucHVzaChgLS1sb2ctb3ZlcnJpZGU6JHtrZXl9PSR7dmFsaWRhdGVTdHJpbmdWYWx1ZShsb2dPdmVycmlkZVtrZXldLCBcImxvZyBvdmVycmlkZVwiLCBrZXkpfWApO1xuICAgIH1cbiAgfVxuICBpZiAoc3VwcG9ydGVkKSB7XG4gICAgZm9yIChsZXQga2V5IGluIHN1cHBvcnRlZCkge1xuICAgICAgaWYgKGtleS5pbmRleE9mKFwiPVwiKSA+PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3VwcG9ydGVkOiAke2tleX1gKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gc3VwcG9ydGVkW2tleV07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCB2YWx1ZSBmb3Igc3VwcG9ydGVkICR7cXVvdGUoa2V5KX0gdG8gYmUgYSBib29sZWFuLCBnb3QgJHt0eXBlb2YgdmFsdWV9IGluc3RlYWRgKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tc3VwcG9ydGVkOiR7a2V5fT0ke3ZhbHVlfWApO1xuICAgIH1cbiAgfVxuICBpZiAocHVyZSkgZm9yIChsZXQgZm4gb2YgcHVyZSkgZmxhZ3MucHVzaChgLS1wdXJlOiR7dmFsaWRhdGVTdHJpbmdWYWx1ZShmbiwgXCJwdXJlXCIpfWApO1xuICBpZiAoa2VlcE5hbWVzKSBmbGFncy5wdXNoKGAtLWtlZXAtbmFtZXNgKTtcbn1cbmZ1bmN0aW9uIGZsYWdzRm9yQnVpbGRPcHRpb25zKGNhbGxOYW1lLCBvcHRpb25zLCBpc1RUWTIsIGxvZ0xldmVsRGVmYXVsdCwgd3JpdGVEZWZhdWx0KSB7XG4gIHZhciBfYTI7XG4gIGxldCBmbGFncyA9IFtdO1xuICBsZXQgZW50cmllcyA9IFtdO1xuICBsZXQga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBsZXQgc3RkaW5Db250ZW50cyA9IG51bGw7XG4gIGxldCBzdGRpblJlc29sdmVEaXIgPSBudWxsO1xuICBwdXNoTG9nRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMsIGlzVFRZMiwgbG9nTGV2ZWxEZWZhdWx0KTtcbiAgcHVzaENvbW1vbkZsYWdzKGZsYWdzLCBvcHRpb25zLCBrZXlzKTtcbiAgbGV0IHNvdXJjZW1hcCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzb3VyY2VtYXBcIiwgbXVzdEJlU3RyaW5nT3JCb29sZWFuKTtcbiAgbGV0IGJ1bmRsZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJidW5kbGVcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBzcGxpdHRpbmcgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwic3BsaXR0aW5nXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgcHJlc2VydmVTeW1saW5rcyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJwcmVzZXJ2ZVN5bWxpbmtzXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbWV0YWZpbGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWV0YWZpbGVcIiwgbXVzdEJlQm9vbGVhbik7XG4gIGxldCBvdXRmaWxlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm91dGZpbGVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IG91dGRpciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJvdXRkaXJcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IG91dGJhc2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwib3V0YmFzZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgdHNjb25maWcgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwidHNjb25maWdcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IHJlc29sdmVFeHRlbnNpb25zID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInJlc29sdmVFeHRlbnNpb25zXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IG5vZGVQYXRoc0lucHV0ID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm5vZGVQYXRoc1wiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gIGxldCBtYWluRmllbGRzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm1haW5GaWVsZHNcIiwgbXVzdEJlQXJyYXlPZlN0cmluZ3MpO1xuICBsZXQgY29uZGl0aW9ucyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJjb25kaXRpb25zXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IGV4dGVybmFsID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImV4dGVybmFsXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IHBhY2thZ2VzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInBhY2thZ2VzXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBhbGlhcyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJhbGlhc1wiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgbG9hZGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxvYWRlclwiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgb3V0RXh0ZW5zaW9uID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcIm91dEV4dGVuc2lvblwiLCBtdXN0QmVPYmplY3QpO1xuICBsZXQgcHVibGljUGF0aCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJwdWJsaWNQYXRoXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBlbnRyeU5hbWVzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImVudHJ5TmFtZXNcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGNodW5rTmFtZXMgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiY2h1bmtOYW1lc1wiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgYXNzZXROYW1lcyA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJhc3NldE5hbWVzXCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBpbmplY3QgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiaW5qZWN0XCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgbGV0IGJhbm5lciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJiYW5uZXJcIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IGZvb3RlciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJmb290ZXJcIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IGVudHJ5UG9pbnRzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImVudHJ5UG9pbnRzXCIsIG11c3RCZUVudHJ5UG9pbnRzKTtcbiAgbGV0IGFic1dvcmtpbmdEaXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwiYWJzV29ya2luZ0RpclwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgc3RkaW4gPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwic3RkaW5cIiwgbXVzdEJlT2JqZWN0KTtcbiAgbGV0IHdyaXRlID0gKF9hMiA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ3cml0ZVwiLCBtdXN0QmVCb29sZWFuKSkgIT0gbnVsbCA/IF9hMiA6IHdyaXRlRGVmYXVsdDtcbiAgbGV0IGFsbG93T3ZlcndyaXRlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImFsbG93T3ZlcndyaXRlXCIsIG11c3RCZUJvb2xlYW4pO1xuICBsZXQgbWFuZ2xlQ2FjaGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFuZ2xlQ2FjaGVcIiwgbXVzdEJlT2JqZWN0KTtcbiAga2V5cy5wbHVnaW5zID0gdHJ1ZTtcbiAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9ucywga2V5cywgYGluICR7Y2FsbE5hbWV9KCkgY2FsbGApO1xuICBpZiAoc291cmNlbWFwKSBmbGFncy5wdXNoKGAtLXNvdXJjZW1hcCR7c291cmNlbWFwID09PSB0cnVlID8gXCJcIiA6IGA9JHtzb3VyY2VtYXB9YH1gKTtcbiAgaWYgKGJ1bmRsZSkgZmxhZ3MucHVzaChcIi0tYnVuZGxlXCIpO1xuICBpZiAoYWxsb3dPdmVyd3JpdGUpIGZsYWdzLnB1c2goXCItLWFsbG93LW92ZXJ3cml0ZVwiKTtcbiAgaWYgKHNwbGl0dGluZykgZmxhZ3MucHVzaChcIi0tc3BsaXR0aW5nXCIpO1xuICBpZiAocHJlc2VydmVTeW1saW5rcykgZmxhZ3MucHVzaChcIi0tcHJlc2VydmUtc3ltbGlua3NcIik7XG4gIGlmIChtZXRhZmlsZSkgZmxhZ3MucHVzaChgLS1tZXRhZmlsZWApO1xuICBpZiAob3V0ZmlsZSkgZmxhZ3MucHVzaChgLS1vdXRmaWxlPSR7b3V0ZmlsZX1gKTtcbiAgaWYgKG91dGRpcikgZmxhZ3MucHVzaChgLS1vdXRkaXI9JHtvdXRkaXJ9YCk7XG4gIGlmIChvdXRiYXNlKSBmbGFncy5wdXNoKGAtLW91dGJhc2U9JHtvdXRiYXNlfWApO1xuICBpZiAodHNjb25maWcpIGZsYWdzLnB1c2goYC0tdHNjb25maWc9JHt0c2NvbmZpZ31gKTtcbiAgaWYgKHBhY2thZ2VzKSBmbGFncy5wdXNoKGAtLXBhY2thZ2VzPSR7cGFja2FnZXN9YCk7XG4gIGlmIChyZXNvbHZlRXh0ZW5zaW9ucykgZmxhZ3MucHVzaChgLS1yZXNvbHZlLWV4dGVuc2lvbnM9JHt2YWxpZGF0ZUFuZEpvaW5TdHJpbmdBcnJheShyZXNvbHZlRXh0ZW5zaW9ucywgXCJyZXNvbHZlIGV4dGVuc2lvblwiKX1gKTtcbiAgaWYgKHB1YmxpY1BhdGgpIGZsYWdzLnB1c2goYC0tcHVibGljLXBhdGg9JHtwdWJsaWNQYXRofWApO1xuICBpZiAoZW50cnlOYW1lcykgZmxhZ3MucHVzaChgLS1lbnRyeS1uYW1lcz0ke2VudHJ5TmFtZXN9YCk7XG4gIGlmIChjaHVua05hbWVzKSBmbGFncy5wdXNoKGAtLWNodW5rLW5hbWVzPSR7Y2h1bmtOYW1lc31gKTtcbiAgaWYgKGFzc2V0TmFtZXMpIGZsYWdzLnB1c2goYC0tYXNzZXQtbmFtZXM9JHthc3NldE5hbWVzfWApO1xuICBpZiAobWFpbkZpZWxkcykgZmxhZ3MucHVzaChgLS1tYWluLWZpZWxkcz0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KG1haW5GaWVsZHMsIFwibWFpbiBmaWVsZFwiKX1gKTtcbiAgaWYgKGNvbmRpdGlvbnMpIGZsYWdzLnB1c2goYC0tY29uZGl0aW9ucz0ke3ZhbGlkYXRlQW5kSm9pblN0cmluZ0FycmF5KGNvbmRpdGlvbnMsIFwiY29uZGl0aW9uXCIpfWApO1xuICBpZiAoZXh0ZXJuYWwpIGZvciAobGV0IG5hbWUgb2YgZXh0ZXJuYWwpIGZsYWdzLnB1c2goYC0tZXh0ZXJuYWw6JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKG5hbWUsIFwiZXh0ZXJuYWxcIil9YCk7XG4gIGlmIChhbGlhcykge1xuICAgIGZvciAobGV0IG9sZCBpbiBhbGlhcykge1xuICAgICAgaWYgKG9sZC5pbmRleE9mKFwiPVwiKSA+PSAwKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcGFja2FnZSBuYW1lIGluIGFsaWFzOiAke29sZH1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tYWxpYXM6JHtvbGR9PSR7dmFsaWRhdGVTdHJpbmdWYWx1ZShhbGlhc1tvbGRdLCBcImFsaWFzXCIsIG9sZCl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChiYW5uZXIpIHtcbiAgICBmb3IgKGxldCB0eXBlIGluIGJhbm5lcikge1xuICAgICAgaWYgKHR5cGUuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGJhbm5lciBmaWxlIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tYmFubmVyOiR7dHlwZX09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGJhbm5lclt0eXBlXSwgXCJiYW5uZXJcIiwgdHlwZSl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChmb290ZXIpIHtcbiAgICBmb3IgKGxldCB0eXBlIGluIGZvb3Rlcikge1xuICAgICAgaWYgKHR5cGUuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZvb3RlciBmaWxlIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIGZsYWdzLnB1c2goYC0tZm9vdGVyOiR7dHlwZX09JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKGZvb3Rlclt0eXBlXSwgXCJmb290ZXJcIiwgdHlwZSl9YCk7XG4gICAgfVxuICB9XG4gIGlmIChpbmplY3QpIGZvciAobGV0IHBhdGgzIG9mIGluamVjdCkgZmxhZ3MucHVzaChgLS1pbmplY3Q6JHt2YWxpZGF0ZVN0cmluZ1ZhbHVlKHBhdGgzLCBcImluamVjdFwiKX1gKTtcbiAgaWYgKGxvYWRlcikge1xuICAgIGZvciAobGV0IGV4dCBpbiBsb2FkZXIpIHtcbiAgICAgIGlmIChleHQuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGxvYWRlciBleHRlbnNpb246ICR7ZXh0fWApO1xuICAgICAgZmxhZ3MucHVzaChgLS1sb2FkZXI6JHtleHR9PSR7dmFsaWRhdGVTdHJpbmdWYWx1ZShsb2FkZXJbZXh0XSwgXCJsb2FkZXJcIiwgZXh0KX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKG91dEV4dGVuc2lvbikge1xuICAgIGZvciAobGV0IGV4dCBpbiBvdXRFeHRlbnNpb24pIHtcbiAgICAgIGlmIChleHQuaW5kZXhPZihcIj1cIikgPj0gMCkgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG91dCBleHRlbnNpb246ICR7ZXh0fWApO1xuICAgICAgZmxhZ3MucHVzaChgLS1vdXQtZXh0ZW5zaW9uOiR7ZXh0fT0ke3ZhbGlkYXRlU3RyaW5nVmFsdWUob3V0RXh0ZW5zaW9uW2V4dF0sIFwib3V0IGV4dGVuc2lvblwiLCBleHQpfWApO1xuICAgIH1cbiAgfVxuICBpZiAoZW50cnlQb2ludHMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShlbnRyeVBvaW50cykpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBuID0gZW50cnlQb2ludHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGxldCBlbnRyeVBvaW50ID0gZW50cnlQb2ludHNbaV07XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnlQb2ludCA9PT0gXCJvYmplY3RcIiAmJiBlbnRyeVBvaW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgbGV0IGVudHJ5UG9pbnRLZXlzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgbGV0IGlucHV0ID0gZ2V0RmxhZyhlbnRyeVBvaW50LCBlbnRyeVBvaW50S2V5cywgXCJpblwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBvdXRwdXQgPSBnZXRGbGFnKGVudHJ5UG9pbnQsIGVudHJ5UG9pbnRLZXlzLCBcIm91dFwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKGVudHJ5UG9pbnQsIGVudHJ5UG9pbnRLZXlzLCBcImluIGVudHJ5IHBvaW50IGF0IGluZGV4IFwiICsgaSk7XG4gICAgICAgICAgaWYgKGlucHV0ID09PSB2b2lkIDApIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcm9wZXJ0eSBcImluXCIgZm9yIGVudHJ5IHBvaW50IGF0IGluZGV4ICcgKyBpKTtcbiAgICAgICAgICBpZiAob3V0cHV0ID09PSB2b2lkIDApIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwcm9wZXJ0eSBcIm91dFwiIGZvciBlbnRyeSBwb2ludCBhdCBpbmRleCAnICsgaSk7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtvdXRwdXQsIGlucHV0XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKFtcIlwiLCB2YWxpZGF0ZVN0cmluZ1ZhbHVlKGVudHJ5UG9pbnQsIFwiZW50cnkgcG9pbnQgYXQgaW5kZXggXCIgKyBpKV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGtleSBpbiBlbnRyeVBvaW50cykge1xuICAgICAgICBlbnRyaWVzLnB1c2goW2tleSwgdmFsaWRhdGVTdHJpbmdWYWx1ZShlbnRyeVBvaW50c1trZXldLCBcImVudHJ5IHBvaW50XCIsIGtleSldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHN0ZGluKSB7XG4gICAgbGV0IHN0ZGluS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBjb250ZW50cyA9IGdldEZsYWcoc3RkaW4sIHN0ZGluS2V5cywgXCJjb250ZW50c1wiLCBtdXN0QmVTdHJpbmdPclVpbnQ4QXJyYXkpO1xuICAgIGxldCByZXNvbHZlRGlyID0gZ2V0RmxhZyhzdGRpbiwgc3RkaW5LZXlzLCBcInJlc29sdmVEaXJcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICBsZXQgc291cmNlZmlsZSA9IGdldEZsYWcoc3RkaW4sIHN0ZGluS2V5cywgXCJzb3VyY2VmaWxlXCIsIG11c3RCZVN0cmluZyk7XG4gICAgbGV0IGxvYWRlcjIgPSBnZXRGbGFnKHN0ZGluLCBzdGRpbktleXMsIFwibG9hZGVyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Moc3RkaW4sIHN0ZGluS2V5cywgJ2luIFwic3RkaW5cIiBvYmplY3QnKTtcbiAgICBpZiAoc291cmNlZmlsZSkgZmxhZ3MucHVzaChgLS1zb3VyY2VmaWxlPSR7c291cmNlZmlsZX1gKTtcbiAgICBpZiAobG9hZGVyMikgZmxhZ3MucHVzaChgLS1sb2FkZXI9JHtsb2FkZXIyfWApO1xuICAgIGlmIChyZXNvbHZlRGlyKSBzdGRpblJlc29sdmVEaXIgPSByZXNvbHZlRGlyO1xuICAgIGlmICh0eXBlb2YgY29udGVudHMgPT09IFwic3RyaW5nXCIpIHN0ZGluQ29udGVudHMgPSBlbmNvZGVVVEY4KGNvbnRlbnRzKTtcbiAgICBlbHNlIGlmIChjb250ZW50cyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHN0ZGluQ29udGVudHMgPSBjb250ZW50cztcbiAgfVxuICBsZXQgbm9kZVBhdGhzID0gW107XG4gIGlmIChub2RlUGF0aHNJbnB1dCkge1xuICAgIGZvciAobGV0IHZhbHVlIG9mIG5vZGVQYXRoc0lucHV0KSB7XG4gICAgICB2YWx1ZSArPSBcIlwiO1xuICAgICAgbm9kZVBhdGhzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGVudHJpZXMsXG4gICAgZmxhZ3MsXG4gICAgd3JpdGUsXG4gICAgc3RkaW5Db250ZW50cyxcbiAgICBzdGRpblJlc29sdmVEaXIsXG4gICAgYWJzV29ya2luZ0RpcixcbiAgICBub2RlUGF0aHMsXG4gICAgbWFuZ2xlQ2FjaGU6IHZhbGlkYXRlTWFuZ2xlQ2FjaGUobWFuZ2xlQ2FjaGUpXG4gIH07XG59XG5mdW5jdGlvbiBmbGFnc0ZvclRyYW5zZm9ybU9wdGlvbnMoY2FsbE5hbWUsIG9wdGlvbnMsIGlzVFRZMiwgbG9nTGV2ZWxEZWZhdWx0KSB7XG4gIGxldCBmbGFncyA9IFtdO1xuICBsZXQga2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBwdXNoTG9nRmxhZ3MoZmxhZ3MsIG9wdGlvbnMsIGtleXMsIGlzVFRZMiwgbG9nTGV2ZWxEZWZhdWx0KTtcbiAgcHVzaENvbW1vbkZsYWdzKGZsYWdzLCBvcHRpb25zLCBrZXlzKTtcbiAgbGV0IHNvdXJjZW1hcCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJzb3VyY2VtYXBcIiwgbXVzdEJlU3RyaW5nT3JCb29sZWFuKTtcbiAgbGV0IHNvdXJjZWZpbGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwic291cmNlZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgbG9hZGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImxvYWRlclwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgYmFubmVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImJhbm5lclwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgZm9vdGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImZvb3RlclwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgbWFuZ2xlQ2FjaGUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMsIFwibWFuZ2xlQ2FjaGVcIiwgbXVzdEJlT2JqZWN0KTtcbiAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9ucywga2V5cywgYGluICR7Y2FsbE5hbWV9KCkgY2FsbGApO1xuICBpZiAoc291cmNlbWFwKSBmbGFncy5wdXNoKGAtLXNvdXJjZW1hcD0ke3NvdXJjZW1hcCA9PT0gdHJ1ZSA/IFwiZXh0ZXJuYWxcIiA6IHNvdXJjZW1hcH1gKTtcbiAgaWYgKHNvdXJjZWZpbGUpIGZsYWdzLnB1c2goYC0tc291cmNlZmlsZT0ke3NvdXJjZWZpbGV9YCk7XG4gIGlmIChsb2FkZXIpIGZsYWdzLnB1c2goYC0tbG9hZGVyPSR7bG9hZGVyfWApO1xuICBpZiAoYmFubmVyKSBmbGFncy5wdXNoKGAtLWJhbm5lcj0ke2Jhbm5lcn1gKTtcbiAgaWYgKGZvb3RlcikgZmxhZ3MucHVzaChgLS1mb290ZXI9JHtmb290ZXJ9YCk7XG4gIHJldHVybiB7XG4gICAgZmxhZ3MsXG4gICAgbWFuZ2xlQ2FjaGU6IHZhbGlkYXRlTWFuZ2xlQ2FjaGUobWFuZ2xlQ2FjaGUpXG4gIH07XG59XG5mdW5jdGlvbiBjcmVhdGVDaGFubmVsKHN0cmVhbUluKSB7XG4gIGNvbnN0IHJlcXVlc3RDYWxsYmFja3NCeUtleSA9IHt9O1xuICBjb25zdCBjbG9zZURhdGEgPSB7IGRpZENsb3NlOiBmYWxzZSwgcmVhc29uOiBcIlwiIH07XG4gIGxldCByZXNwb25zZUNhbGxiYWNrcyA9IHt9O1xuICBsZXQgbmV4dFJlcXVlc3RJRCA9IDA7XG4gIGxldCBuZXh0QnVpbGRLZXkgPSAwO1xuICBsZXQgc3Rkb3V0ID0gbmV3IFVpbnQ4QXJyYXkoMTYgKiAxMDI0KTtcbiAgbGV0IHN0ZG91dFVzZWQgPSAwO1xuICBsZXQgcmVhZEZyb21TdGRvdXQgPSAoY2h1bmspID0+IHtcbiAgICBsZXQgbGltaXQgPSBzdGRvdXRVc2VkICsgY2h1bmsubGVuZ3RoO1xuICAgIGlmIChsaW1pdCA+IHN0ZG91dC5sZW5ndGgpIHtcbiAgICAgIGxldCBzd2FwID0gbmV3IFVpbnQ4QXJyYXkobGltaXQgKiAyKTtcbiAgICAgIHN3YXAuc2V0KHN0ZG91dCk7XG4gICAgICBzdGRvdXQgPSBzd2FwO1xuICAgIH1cbiAgICBzdGRvdXQuc2V0KGNodW5rLCBzdGRvdXRVc2VkKTtcbiAgICBzdGRvdXRVc2VkICs9IGNodW5rLmxlbmd0aDtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICB3aGlsZSAob2Zmc2V0ICsgNCA8PSBzdGRvdXRVc2VkKSB7XG4gICAgICBsZXQgbGVuZ3RoID0gcmVhZFVJbnQzMkxFKHN0ZG91dCwgb2Zmc2V0KTtcbiAgICAgIGlmIChvZmZzZXQgKyA0ICsgbGVuZ3RoID4gc3Rkb3V0VXNlZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG9mZnNldCArPSA0O1xuICAgICAgaGFuZGxlSW5jb21pbmdQYWNrZXQoc3Rkb3V0LnN1YmFycmF5KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSk7XG4gICAgICBvZmZzZXQgKz0gbGVuZ3RoO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0ID4gMCkge1xuICAgICAgc3Rkb3V0LmNvcHlXaXRoaW4oMCwgb2Zmc2V0LCBzdGRvdXRVc2VkKTtcbiAgICAgIHN0ZG91dFVzZWQgLT0gb2Zmc2V0O1xuICAgIH1cbiAgfTtcbiAgbGV0IGFmdGVyQ2xvc2UgPSAoZXJyb3IpID0+IHtcbiAgICBjbG9zZURhdGEuZGlkQ2xvc2UgPSB0cnVlO1xuICAgIGlmIChlcnJvcikgY2xvc2VEYXRhLnJlYXNvbiA9IFwiOiBcIiArIChlcnJvci5tZXNzYWdlIHx8IGVycm9yKTtcbiAgICBjb25zdCB0ZXh0ID0gXCJUaGUgc2VydmljZSB3YXMgc3RvcHBlZFwiICsgY2xvc2VEYXRhLnJlYXNvbjtcbiAgICBmb3IgKGxldCBpZCBpbiByZXNwb25zZUNhbGxiYWNrcykge1xuICAgICAgcmVzcG9uc2VDYWxsYmFja3NbaWRdKHRleHQsIG51bGwpO1xuICAgIH1cbiAgICByZXNwb25zZUNhbGxiYWNrcyA9IHt9O1xuICB9O1xuICBsZXQgc2VuZFJlcXVlc3QgPSAocmVmcywgdmFsdWUsIGNhbGxiYWNrKSA9PiB7XG4gICAgaWYgKGNsb3NlRGF0YS5kaWRDbG9zZSkgcmV0dXJuIGNhbGxiYWNrKFwiVGhlIHNlcnZpY2UgaXMgbm8gbG9uZ2VyIHJ1bm5pbmdcIiArIGNsb3NlRGF0YS5yZWFzb24sIG51bGwpO1xuICAgIGxldCBpZCA9IG5leHRSZXF1ZXN0SUQrKztcbiAgICByZXNwb25zZUNhbGxiYWNrc1tpZF0gPSAoZXJyb3IsIHJlc3BvbnNlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjYWxsYmFjayhlcnJvciwgcmVzcG9uc2UpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKHJlZnMpIHJlZnMudW5yZWYoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChyZWZzKSByZWZzLnJlZigpO1xuICAgIHN0cmVhbUluLndyaXRlVG9TdGRpbihlbmNvZGVQYWNrZXQoeyBpZCwgaXNSZXF1ZXN0OiB0cnVlLCB2YWx1ZSB9KSk7XG4gIH07XG4gIGxldCBzZW5kUmVzcG9uc2UgPSAoaWQsIHZhbHVlKSA9PiB7XG4gICAgaWYgKGNsb3NlRGF0YS5kaWRDbG9zZSkgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHNlcnZpY2UgaXMgbm8gbG9uZ2VyIHJ1bm5pbmdcIiArIGNsb3NlRGF0YS5yZWFzb24pO1xuICAgIHN0cmVhbUluLndyaXRlVG9TdGRpbihlbmNvZGVQYWNrZXQoeyBpZCwgaXNSZXF1ZXN0OiBmYWxzZSwgdmFsdWUgfSkpO1xuICB9O1xuICBsZXQgaGFuZGxlUmVxdWVzdCA9IGFzeW5jIChpZCwgcmVxdWVzdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAocmVxdWVzdC5jb21tYW5kID09PSBcInBpbmdcIikge1xuICAgICAgICBzZW5kUmVzcG9uc2UoaWQsIHt9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0LmtleSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICBjb25zdCByZXF1ZXN0Q2FsbGJhY2tzID0gcmVxdWVzdENhbGxiYWNrc0J5S2V5W3JlcXVlc3Qua2V5XTtcbiAgICAgICAgaWYgKCFyZXF1ZXN0Q2FsbGJhY2tzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gcmVxdWVzdENhbGxiYWNrc1tyZXF1ZXN0LmNvbW1hbmRdO1xuICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICBhd2FpdCBjYWxsYmFjayhpZCwgcmVxdWVzdCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29tbWFuZDogYCArIHJlcXVlc3QuY29tbWFuZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgZXJyb3JzID0gW2V4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgbnVsbCwgdm9pZCAwLCBcIlwiKV07XG4gICAgICB0cnkge1xuICAgICAgICBzZW5kUmVzcG9uc2UoaWQsIHsgZXJyb3JzIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBsZXQgaXNGaXJzdFBhY2tldCA9IHRydWU7XG4gIGxldCBoYW5kbGVJbmNvbWluZ1BhY2tldCA9IChieXRlcykgPT4ge1xuICAgIGlmIChpc0ZpcnN0UGFja2V0KSB7XG4gICAgICBpc0ZpcnN0UGFja2V0ID0gZmFsc2U7XG4gICAgICBsZXQgYmluYXJ5VmVyc2lvbiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnl0ZXMpO1xuICAgICAgaWYgKGJpbmFyeVZlcnNpb24gIT09IFwiMC4yNS4xMlwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHN0YXJ0IHNlcnZpY2U6IEhvc3QgdmVyc2lvbiBcIiR7XCIwLjI1LjEyXCJ9XCIgZG9lcyBub3QgbWF0Y2ggYmluYXJ5IHZlcnNpb24gJHtxdW90ZShiaW5hcnlWZXJzaW9uKX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHBhY2tldCA9IGRlY29kZVBhY2tldChieXRlcyk7XG4gICAgaWYgKHBhY2tldC5pc1JlcXVlc3QpIHtcbiAgICAgIGhhbmRsZVJlcXVlc3QocGFja2V0LmlkLCBwYWNrZXQudmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY2FsbGJhY2sgPSByZXNwb25zZUNhbGxiYWNrc1twYWNrZXQuaWRdO1xuICAgICAgZGVsZXRlIHJlc3BvbnNlQ2FsbGJhY2tzW3BhY2tldC5pZF07XG4gICAgICBpZiAocGFja2V0LnZhbHVlLmVycm9yKSBjYWxsYmFjayhwYWNrZXQudmFsdWUuZXJyb3IsIHt9KTtcbiAgICAgIGVsc2UgY2FsbGJhY2sobnVsbCwgcGFja2V0LnZhbHVlKTtcbiAgICB9XG4gIH07XG4gIGxldCBidWlsZE9yQ29udGV4dCA9ICh7IGNhbGxOYW1lLCByZWZzLCBvcHRpb25zLCBpc1RUWTogaXNUVFkyLCBkZWZhdWx0V0Q6IGRlZmF1bHRXRDIsIGNhbGxiYWNrIH0pID0+IHtcbiAgICBsZXQgcmVmQ291bnQgPSAwO1xuICAgIGNvbnN0IGJ1aWxkS2V5ID0gbmV4dEJ1aWxkS2V5Kys7XG4gICAgY29uc3QgcmVxdWVzdENhbGxiYWNrcyA9IHt9O1xuICAgIGNvbnN0IGJ1aWxkUmVmcyA9IHtcbiAgICAgIHJlZigpIHtcbiAgICAgICAgaWYgKCsrcmVmQ291bnQgPT09IDEpIHtcbiAgICAgICAgICBpZiAocmVmcykgcmVmcy5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVucmVmKCkge1xuICAgICAgICBpZiAoLS1yZWZDb3VudCA9PT0gMCkge1xuICAgICAgICAgIGRlbGV0ZSByZXF1ZXN0Q2FsbGJhY2tzQnlLZXlbYnVpbGRLZXldO1xuICAgICAgICAgIGlmIChyZWZzKSByZWZzLnVucmVmKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHJlcXVlc3RDYWxsYmFja3NCeUtleVtidWlsZEtleV0gPSByZXF1ZXN0Q2FsbGJhY2tzO1xuICAgIGJ1aWxkUmVmcy5yZWYoKTtcbiAgICBidWlsZE9yQ29udGV4dEltcGwoXG4gICAgICBjYWxsTmFtZSxcbiAgICAgIGJ1aWxkS2V5LFxuICAgICAgc2VuZFJlcXVlc3QsXG4gICAgICBzZW5kUmVzcG9uc2UsXG4gICAgICBidWlsZFJlZnMsXG4gICAgICBzdHJlYW1JbixcbiAgICAgIHJlcXVlc3RDYWxsYmFja3MsXG4gICAgICBvcHRpb25zLFxuICAgICAgaXNUVFkyLFxuICAgICAgZGVmYXVsdFdEMixcbiAgICAgIChlcnIsIHJlcykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBidWlsZFJlZnMudW5yZWYoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH07XG4gIGxldCB0cmFuc2Zvcm0yID0gKHsgY2FsbE5hbWUsIHJlZnMsIGlucHV0LCBvcHRpb25zLCBpc1RUWTogaXNUVFkyLCBmczogZnMzLCBjYWxsYmFjayB9KSA9PiB7XG4gICAgY29uc3QgZGV0YWlscyA9IGNyZWF0ZU9iamVjdFN0YXNoKCk7XG4gICAgbGV0IHN0YXJ0ID0gKGlucHV0UGF0aCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gXCJzdHJpbmdcIiAmJiAhKGlucHV0IGluc3RhbmNlb2YgVWludDhBcnJheSkpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgaW5wdXQgdG8gXCJ0cmFuc2Zvcm1cIiBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgVWludDhBcnJheScpO1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGZsYWdzLFxuICAgICAgICAgIG1hbmdsZUNhY2hlXG4gICAgICAgIH0gPSBmbGFnc0ZvclRyYW5zZm9ybU9wdGlvbnMoY2FsbE5hbWUsIG9wdGlvbnMsIGlzVFRZMiwgdHJhbnNmb3JtTG9nTGV2ZWxEZWZhdWx0KTtcbiAgICAgICAgbGV0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgY29tbWFuZDogXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgICBmbGFncyxcbiAgICAgICAgICBpbnB1dEZTOiBpbnB1dFBhdGggIT09IG51bGwsXG4gICAgICAgICAgaW5wdXQ6IGlucHV0UGF0aCAhPT0gbnVsbCA/IGVuY29kZVVURjgoaW5wdXRQYXRoKSA6IHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiA/IGVuY29kZVVURjgoaW5wdXQpIDogaW5wdXRcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG1hbmdsZUNhY2hlKSByZXF1ZXN0Lm1hbmdsZUNhY2hlID0gbWFuZ2xlQ2FjaGU7XG4gICAgICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QsIChlcnJvciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoZXJyb3IpLCBudWxsKTtcbiAgICAgICAgICBsZXQgZXJyb3JzID0gcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLmVycm9ycywgZGV0YWlscyk7XG4gICAgICAgICAgbGV0IHdhcm5pbmdzID0gcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLndhcm5pbmdzLCBkZXRhaWxzKTtcbiAgICAgICAgICBsZXQgb3V0c3RhbmRpbmcgPSAxO1xuICAgICAgICAgIGxldCBuZXh0ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKC0tb3V0c3RhbmRpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICB3YXJuaW5ncyxcbiAgICAgICAgICAgICAgICBjb2RlOiByZXNwb25zZS5jb2RlLFxuICAgICAgICAgICAgICAgIG1hcDogcmVzcG9uc2UubWFwLFxuICAgICAgICAgICAgICAgIG1hbmdsZUNhY2hlOiB2b2lkIDAsXG4gICAgICAgICAgICAgICAgbGVnYWxDb21tZW50czogdm9pZCAwXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGlmIChcImxlZ2FsQ29tbWVudHNcIiBpbiByZXNwb25zZSkgcmVzdWx0LmxlZ2FsQ29tbWVudHMgPSByZXNwb25zZSA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2UubGVnYWxDb21tZW50cztcbiAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm1hbmdsZUNhY2hlKSByZXN1bHQubWFuZ2xlQ2FjaGUgPSByZXNwb25zZSA9PSBudWxsID8gdm9pZCAwIDogcmVzcG9uc2UubWFuZ2xlQ2FjaGU7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHJldHVybiBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKFwiVHJhbnNmb3JtIGZhaWxlZFwiLCBlcnJvcnMsIHdhcm5pbmdzKSwgbnVsbCk7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmNvZGVGUykge1xuICAgICAgICAgICAgb3V0c3RhbmRpbmcrKztcbiAgICAgICAgICAgIGZzMy5yZWFkRmlsZShyZXNwb25zZS5jb2RlLCAoZXJyLCBjb250ZW50cykgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXJyICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBudWxsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZS5jb2RlID0gY29udGVudHM7XG4gICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLm1hcEZTKSB7XG4gICAgICAgICAgICBvdXRzdGFuZGluZysrO1xuICAgICAgICAgICAgZnMzLnJlYWRGaWxlKHJlc3BvbnNlLm1hcCwgKGVyciwgY29udGVudHMpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVyciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgbnVsbCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UubWFwID0gY29udGVudHM7XG4gICAgICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV4dCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbGV0IGZsYWdzID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcHVzaExvZ0ZsYWdzKGZsYWdzLCBvcHRpb25zLCB7fSwgaXNUVFkyLCB0cmFuc2Zvcm1Mb2dMZXZlbERlZmF1bHQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlcnJvciA9IGV4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgZGV0YWlscywgdm9pZCAwLCBcIlwiKTtcbiAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgeyBjb21tYW5kOiBcImVycm9yXCIsIGZsYWdzLCBlcnJvciB9LCAoKSA9PiB7XG4gICAgICAgICAgZXJyb3IuZGV0YWlsID0gZGV0YWlscy5sb2FkKGVycm9yLmRldGFpbCk7XG4gICAgICAgICAgY2FsbGJhY2soZmFpbHVyZUVycm9yV2l0aExvZyhcIlRyYW5zZm9ybSBmYWlsZWRcIiwgW2Vycm9yXSwgW10pLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiB8fCBpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpICYmIGlucHV0Lmxlbmd0aCA+IDEwMjQgKiAxMDI0KSB7XG4gICAgICBsZXQgbmV4dCA9IHN0YXJ0O1xuICAgICAgc3RhcnQgPSAoKSA9PiBmczMud3JpdGVGaWxlKGlucHV0LCBuZXh0KTtcbiAgICB9XG4gICAgc3RhcnQobnVsbCk7XG4gIH07XG4gIGxldCBmb3JtYXRNZXNzYWdlczIgPSAoeyBjYWxsTmFtZSwgcmVmcywgbWVzc2FnZXMsIG9wdGlvbnMsIGNhbGxiYWNrIH0pID0+IHtcbiAgICBpZiAoIW9wdGlvbnMpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBzZWNvbmQgYXJndW1lbnQgaW4gJHtjYWxsTmFtZX0oKSBjYWxsYCk7XG4gICAgbGV0IGtleXMgPSB7fTtcbiAgICBsZXQga2luZCA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJraW5kXCIsIG11c3RCZVN0cmluZyk7XG4gICAgbGV0IGNvbG9yID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcImNvbG9yXCIsIG11c3RCZUJvb2xlYW4pO1xuICAgIGxldCB0ZXJtaW5hbFdpZHRoID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzLCBcInRlcm1pbmFsV2lkdGhcIiwgbXVzdEJlSW50ZWdlcik7XG4gICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9ucywga2V5cywgYGluICR7Y2FsbE5hbWV9KCkgY2FsbGApO1xuICAgIGlmIChraW5kID09PSB2b2lkIDApIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBcImtpbmRcIiBpbiAke2NhbGxOYW1lfSgpIGNhbGxgKTtcbiAgICBpZiAoa2luZCAhPT0gXCJlcnJvclwiICYmIGtpbmQgIT09IFwid2FybmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFwia2luZFwiIHRvIGJlIFwiZXJyb3JcIiBvciBcIndhcm5pbmdcIiBpbiAke2NhbGxOYW1lfSgpIGNhbGxgKTtcbiAgICBsZXQgcmVxdWVzdCA9IHtcbiAgICAgIGNvbW1hbmQ6IFwiZm9ybWF0LW1zZ3NcIixcbiAgICAgIG1lc3NhZ2VzOiBzYW5pdGl6ZU1lc3NhZ2VzKG1lc3NhZ2VzLCBcIm1lc3NhZ2VzXCIsIG51bGwsIFwiXCIsIHRlcm1pbmFsV2lkdGgpLFxuICAgICAgaXNXYXJuaW5nOiBraW5kID09PSBcIndhcm5pbmdcIlxuICAgIH07XG4gICAgaWYgKGNvbG9yICE9PSB2b2lkIDApIHJlcXVlc3QuY29sb3IgPSBjb2xvcjtcbiAgICBpZiAodGVybWluYWxXaWR0aCAhPT0gdm9pZCAwKSByZXF1ZXN0LnRlcm1pbmFsV2lkdGggPSB0ZXJtaW5hbFdpZHRoO1xuICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QsIChlcnJvciwgcmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChlcnJvcikgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihlcnJvciksIG51bGwpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UubWVzc2FnZXMpO1xuICAgIH0pO1xuICB9O1xuICBsZXQgYW5hbHl6ZU1ldGFmaWxlMiA9ICh7IGNhbGxOYW1lLCByZWZzLCBtZXRhZmlsZSwgb3B0aW9ucywgY2FsbGJhY2sgfSkgPT4ge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIG9wdGlvbnMgPSB7fTtcbiAgICBsZXQga2V5cyA9IHt9O1xuICAgIGxldCBjb2xvciA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJjb2xvclwiLCBtdXN0QmVCb29sZWFuKTtcbiAgICBsZXQgdmVyYm9zZSA9IGdldEZsYWcob3B0aW9ucywga2V5cywgXCJ2ZXJib3NlXCIsIG11c3RCZUJvb2xlYW4pO1xuICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMsIGBpbiAke2NhbGxOYW1lfSgpIGNhbGxgKTtcbiAgICBsZXQgcmVxdWVzdCA9IHtcbiAgICAgIGNvbW1hbmQ6IFwiYW5hbHl6ZS1tZXRhZmlsZVwiLFxuICAgICAgbWV0YWZpbGVcbiAgICB9O1xuICAgIGlmIChjb2xvciAhPT0gdm9pZCAwKSByZXF1ZXN0LmNvbG9yID0gY29sb3I7XG4gICAgaWYgKHZlcmJvc2UgIT09IHZvaWQgMCkgcmVxdWVzdC52ZXJib3NlID0gdmVyYm9zZTtcbiAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0LCAoZXJyb3IsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoZXJyb3IpLCBudWxsKTtcbiAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlLnJlc3VsdCk7XG4gICAgfSk7XG4gIH07XG4gIHJldHVybiB7XG4gICAgcmVhZEZyb21TdGRvdXQsXG4gICAgYWZ0ZXJDbG9zZSxcbiAgICBzZXJ2aWNlOiB7XG4gICAgICBidWlsZE9yQ29udGV4dCxcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtMixcbiAgICAgIGZvcm1hdE1lc3NhZ2VzOiBmb3JtYXRNZXNzYWdlczIsXG4gICAgICBhbmFseXplTWV0YWZpbGU6IGFuYWx5emVNZXRhZmlsZTJcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBidWlsZE9yQ29udGV4dEltcGwoY2FsbE5hbWUsIGJ1aWxkS2V5LCBzZW5kUmVxdWVzdCwgc2VuZFJlc3BvbnNlLCByZWZzLCBzdHJlYW1JbiwgcmVxdWVzdENhbGxiYWNrcywgb3B0aW9ucywgaXNUVFkyLCBkZWZhdWx0V0QyLCBjYWxsYmFjaykge1xuICBjb25zdCBkZXRhaWxzID0gY3JlYXRlT2JqZWN0U3Rhc2goKTtcbiAgY29uc3QgaXNDb250ZXh0ID0gY2FsbE5hbWUgPT09IFwiY29udGV4dFwiO1xuICBjb25zdCBoYW5kbGVFcnJvciA9IChlLCBwbHVnaW5OYW1lKSA9PiB7XG4gICAgY29uc3QgZmxhZ3MgPSBbXTtcbiAgICB0cnkge1xuICAgICAgcHVzaExvZ0ZsYWdzKGZsYWdzLCBvcHRpb25zLCB7fSwgaXNUVFkyLCBidWlsZExvZ0xldmVsRGVmYXVsdCk7XG4gICAgfSBjYXRjaCB7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBleHRyYWN0RXJyb3JNZXNzYWdlVjgoZSwgc3RyZWFtSW4sIGRldGFpbHMsIHZvaWQgMCwgcGx1Z2luTmFtZSk7XG4gICAgc2VuZFJlcXVlc3QocmVmcywgeyBjb21tYW5kOiBcImVycm9yXCIsIGZsYWdzLCBlcnJvcjogbWVzc2FnZSB9LCAoKSA9PiB7XG4gICAgICBtZXNzYWdlLmRldGFpbCA9IGRldGFpbHMubG9hZChtZXNzYWdlLmRldGFpbCk7XG4gICAgICBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKGlzQ29udGV4dCA/IFwiQ29udGV4dCBmYWlsZWRcIiA6IFwiQnVpbGQgZmFpbGVkXCIsIFttZXNzYWdlXSwgW10pLCBudWxsKTtcbiAgICB9KTtcbiAgfTtcbiAgbGV0IHBsdWdpbnM7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy5wbHVnaW5zO1xuICAgIGlmICh2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gaGFuZGxlRXJyb3IobmV3IEVycm9yKGBcInBsdWdpbnNcIiBtdXN0IGJlIGFuIGFycmF5YCksIFwiXCIpO1xuICAgICAgcGx1Z2lucyA9IHZhbHVlO1xuICAgIH1cbiAgfVxuICBpZiAocGx1Z2lucyAmJiBwbHVnaW5zLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc3RyZWFtSW4uaXNTeW5jKSByZXR1cm4gaGFuZGxlRXJyb3IobmV3IEVycm9yKFwiQ2Fubm90IHVzZSBwbHVnaW5zIGluIHN5bmNocm9ub3VzIEFQSSBjYWxsc1wiKSwgXCJcIik7XG4gICAgaGFuZGxlUGx1Z2lucyhcbiAgICAgIGJ1aWxkS2V5LFxuICAgICAgc2VuZFJlcXVlc3QsXG4gICAgICBzZW5kUmVzcG9uc2UsXG4gICAgICByZWZzLFxuICAgICAgc3RyZWFtSW4sXG4gICAgICByZXF1ZXN0Q2FsbGJhY2tzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHBsdWdpbnMsXG4gICAgICBkZXRhaWxzXG4gICAgKS50aGVuKFxuICAgICAgKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoIXJlc3VsdC5vaykgcmV0dXJuIGhhbmRsZUVycm9yKHJlc3VsdC5lcnJvciwgcmVzdWx0LnBsdWdpbk5hbWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJ1aWxkT3JDb250ZXh0Q29udGludWUocmVzdWx0LnJlcXVlc3RQbHVnaW5zLCByZXN1bHQucnVuT25FbmRDYWxsYmFja3MsIHJlc3VsdC5zY2hlZHVsZU9uRGlzcG9zZUNhbGxiYWNrcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBoYW5kbGVFcnJvcihlLCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIChlKSA9PiBoYW5kbGVFcnJvcihlLCBcIlwiKVxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgYnVpbGRPckNvbnRleHRDb250aW51ZShudWxsLCAocmVzdWx0LCBkb25lKSA9PiBkb25lKFtdLCBbXSksICgpID0+IHtcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGhhbmRsZUVycm9yKGUsIFwiXCIpO1xuICB9XG4gIGZ1bmN0aW9uIGJ1aWxkT3JDb250ZXh0Q29udGludWUocmVxdWVzdFBsdWdpbnMsIHJ1bk9uRW5kQ2FsbGJhY2tzLCBzY2hlZHVsZU9uRGlzcG9zZUNhbGxiYWNrcykge1xuICAgIGNvbnN0IHdyaXRlRGVmYXVsdCA9IHN0cmVhbUluLmhhc0ZTO1xuICAgIGNvbnN0IHtcbiAgICAgIGVudHJpZXMsXG4gICAgICBmbGFncyxcbiAgICAgIHdyaXRlLFxuICAgICAgc3RkaW5Db250ZW50cyxcbiAgICAgIHN0ZGluUmVzb2x2ZURpcixcbiAgICAgIGFic1dvcmtpbmdEaXIsXG4gICAgICBub2RlUGF0aHMsXG4gICAgICBtYW5nbGVDYWNoZVxuICAgIH0gPSBmbGFnc0ZvckJ1aWxkT3B0aW9ucyhjYWxsTmFtZSwgb3B0aW9ucywgaXNUVFkyLCBidWlsZExvZ0xldmVsRGVmYXVsdCwgd3JpdGVEZWZhdWx0KTtcbiAgICBpZiAod3JpdGUgJiYgIXN0cmVhbUluLmhhc0ZTKSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcIndyaXRlXCIgb3B0aW9uIGlzIHVuYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnRgKTtcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgY29tbWFuZDogXCJidWlsZFwiLFxuICAgICAga2V5OiBidWlsZEtleSxcbiAgICAgIGVudHJpZXMsXG4gICAgICBmbGFncyxcbiAgICAgIHdyaXRlLFxuICAgICAgc3RkaW5Db250ZW50cyxcbiAgICAgIHN0ZGluUmVzb2x2ZURpcixcbiAgICAgIGFic1dvcmtpbmdEaXI6IGFic1dvcmtpbmdEaXIgfHwgZGVmYXVsdFdEMixcbiAgICAgIG5vZGVQYXRocyxcbiAgICAgIGNvbnRleHQ6IGlzQ29udGV4dFxuICAgIH07XG4gICAgaWYgKHJlcXVlc3RQbHVnaW5zKSByZXF1ZXN0LnBsdWdpbnMgPSByZXF1ZXN0UGx1Z2lucztcbiAgICBpZiAobWFuZ2xlQ2FjaGUpIHJlcXVlc3QubWFuZ2xlQ2FjaGUgPSBtYW5nbGVDYWNoZTtcbiAgICBjb25zdCBidWlsZFJlc3BvbnNlVG9SZXN1bHQgPSAocmVzcG9uc2UsIGNhbGxiYWNrMikgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBlcnJvcnM6IHJlcGxhY2VEZXRhaWxzSW5NZXNzYWdlcyhyZXNwb25zZS5lcnJvcnMsIGRldGFpbHMpLFxuICAgICAgICB3YXJuaW5nczogcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLndhcm5pbmdzLCBkZXRhaWxzKSxcbiAgICAgICAgb3V0cHV0RmlsZXM6IHZvaWQgMCxcbiAgICAgICAgbWV0YWZpbGU6IHZvaWQgMCxcbiAgICAgICAgbWFuZ2xlQ2FjaGU6IHZvaWQgMFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3JzID0gcmVzdWx0LmVycm9ycy5zbGljZSgpO1xuICAgICAgY29uc3Qgb3JpZ2luYWxXYXJuaW5ncyA9IHJlc3VsdC53YXJuaW5ncy5zbGljZSgpO1xuICAgICAgaWYgKHJlc3BvbnNlLm91dHB1dEZpbGVzKSByZXN1bHQub3V0cHV0RmlsZXMgPSByZXNwb25zZS5vdXRwdXRGaWxlcy5tYXAoY29udmVydE91dHB1dEZpbGVzKTtcbiAgICAgIGlmIChyZXNwb25zZS5tZXRhZmlsZSkgcmVzdWx0Lm1ldGFmaWxlID0gSlNPTi5wYXJzZShyZXNwb25zZS5tZXRhZmlsZSk7XG4gICAgICBpZiAocmVzcG9uc2UubWFuZ2xlQ2FjaGUpIHJlc3VsdC5tYW5nbGVDYWNoZSA9IHJlc3BvbnNlLm1hbmdsZUNhY2hlO1xuICAgICAgaWYgKHJlc3BvbnNlLndyaXRlVG9TdGRvdXQgIT09IHZvaWQgMCkgY29uc29sZS5sb2coZGVjb2RlVVRGOChyZXNwb25zZS53cml0ZVRvU3Rkb3V0KS5yZXBsYWNlKC9cXG4kLywgXCJcIikpO1xuICAgICAgcnVuT25FbmRDYWxsYmFja3MocmVzdWx0LCAob25FbmRFcnJvcnMsIG9uRW5kV2FybmluZ3MpID0+IHtcbiAgICAgICAgaWYgKG9yaWdpbmFsRXJyb3JzLmxlbmd0aCA+IDAgfHwgb25FbmRFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gZmFpbHVyZUVycm9yV2l0aExvZyhcIkJ1aWxkIGZhaWxlZFwiLCBvcmlnaW5hbEVycm9ycy5jb25jYXQob25FbmRFcnJvcnMpLCBvcmlnaW5hbFdhcm5pbmdzLmNvbmNhdChvbkVuZFdhcm5pbmdzKSk7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrMihlcnJvciwgbnVsbCwgb25FbmRFcnJvcnMsIG9uRW5kV2FybmluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrMihudWxsLCByZXN1bHQsIG9uRW5kRXJyb3JzLCBvbkVuZFdhcm5pbmdzKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgbGV0IGxhdGVzdFJlc3VsdFByb21pc2U7XG4gICAgbGV0IHByb3ZpZGVMYXRlc3RSZXN1bHQ7XG4gICAgaWYgKGlzQ29udGV4dClcbiAgICAgIHJlcXVlc3RDYWxsYmFja3NbXCJvbi1lbmRcIl0gPSAoaWQsIHJlcXVlc3QyKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBidWlsZFJlc3BvbnNlVG9SZXN1bHQocmVxdWVzdDIsIChlcnIsIHJlc3VsdCwgb25FbmRFcnJvcnMsIG9uRW5kV2FybmluZ3MpID0+IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgICAgICAgIGVycm9yczogb25FbmRFcnJvcnMsXG4gICAgICAgICAgICB3YXJuaW5nczogb25FbmRXYXJuaW5nc1xuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHByb3ZpZGVMYXRlc3RSZXN1bHQpIHByb3ZpZGVMYXRlc3RSZXN1bHQoZXJyLCByZXN1bHQpO1xuICAgICAgICAgIGxhdGVzdFJlc3VsdFByb21pc2UgPSB2b2lkIDA7XG4gICAgICAgICAgcHJvdmlkZUxhdGVzdFJlc3VsdCA9IHZvaWQgMDtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoaWQsIHJlc3BvbnNlKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdCwgKGVycm9yLCByZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGVycm9yKSByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGVycm9yKSwgbnVsbCk7XG4gICAgICBpZiAoIWlzQ29udGV4dCkge1xuICAgICAgICByZXR1cm4gYnVpbGRSZXNwb25zZVRvUmVzdWx0KHJlc3BvbnNlLCAoZXJyLCByZXMpID0+IHtcbiAgICAgICAgICBzY2hlZHVsZU9uRGlzcG9zZUNhbGxiYWNrcygpO1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIsIHJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3BvbnNlLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhmYWlsdXJlRXJyb3JXaXRoTG9nKFwiQ29udGV4dCBmYWlsZWRcIiwgcmVzcG9uc2UuZXJyb3JzLCByZXNwb25zZS53YXJuaW5ncyksIG51bGwpO1xuICAgICAgfVxuICAgICAgbGV0IGRpZERpc3Bvc2UgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgcmVidWlsZDogKCkgPT4ge1xuICAgICAgICAgIGlmICghbGF0ZXN0UmVzdWx0UHJvbWlzZSkgbGF0ZXN0UmVzdWx0UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBzZXR0bGVQcm9taXNlO1xuICAgICAgICAgICAgcHJvdmlkZUxhdGVzdFJlc3VsdCA9IChlcnIsIHJlc3VsdDIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFzZXR0bGVQcm9taXNlKSBzZXR0bGVQcm9taXNlID0gKCkgPT4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlc3VsdDIpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJBbm90aGVyQnVpbGQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QyID0ge1xuICAgICAgICAgICAgICAgIGNvbW1hbmQ6IFwicmVidWlsZFwiLFxuICAgICAgICAgICAgICAgIGtleTogYnVpbGRLZXlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdDIsIChlcnJvcjIsIHJlc3BvbnNlMikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcjIpIHtcbiAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoZXJyb3IyKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZXR0bGVQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICBzZXR0bGVQcm9taXNlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRyaWdnZXJBbm90aGVyQnVpbGQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyaWdnZXJBbm90aGVyQnVpbGQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbGF0ZXN0UmVzdWx0UHJvbWlzZTtcbiAgICAgICAgfSxcbiAgICAgICAgd2F0Y2g6IChvcHRpb25zMiA9IHt9KSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgaWYgKCFzdHJlYW1Jbi5oYXNGUykgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgdXNlIHRoZSBcIndhdGNoXCIgQVBJIGluIHRoaXMgZW52aXJvbm1lbnRgKTtcbiAgICAgICAgICBjb25zdCBrZXlzID0ge307XG4gICAgICAgICAgY29uc3QgZGVsYXkgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcImRlbGF5XCIsIG11c3RCZUludGVnZXIpO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMyLCBrZXlzLCBgaW4gd2F0Y2goKSBjYWxsYCk7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdDIgPSB7XG4gICAgICAgICAgICBjb21tYW5kOiBcIndhdGNoXCIsXG4gICAgICAgICAgICBrZXk6IGJ1aWxkS2V5XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoZGVsYXkpIHJlcXVlc3QyLmRlbGF5ID0gZGVsYXk7XG4gICAgICAgICAgc2VuZFJlcXVlc3QocmVmcywgcmVxdWVzdDIsIChlcnJvcjIpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcjIpIHJlamVjdChuZXcgRXJyb3IoZXJyb3IyKSk7XG4gICAgICAgICAgICBlbHNlIHJlc29sdmUodm9pZCAwKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIHNlcnZlOiAob3B0aW9uczIgPSB7fSkgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGlmICghc3RyZWFtSW4uaGFzRlMpIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHVzZSB0aGUgXCJzZXJ2ZVwiIEFQSSBpbiB0aGlzIGVudmlyb25tZW50YCk7XG4gICAgICAgICAgY29uc3Qga2V5cyA9IHt9O1xuICAgICAgICAgIGNvbnN0IHBvcnQgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcInBvcnRcIiwgbXVzdEJlVmFsaWRQb3J0TnVtYmVyKTtcbiAgICAgICAgICBjb25zdCBob3N0ID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJob3N0XCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgY29uc3Qgc2VydmVkaXIgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcInNlcnZlZGlyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgY29uc3Qga2V5ZmlsZSA9IGdldEZsYWcob3B0aW9uczIsIGtleXMsIFwia2V5ZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGNlcnRmaWxlID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJjZXJ0ZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGZhbGxiYWNrID0gZ2V0RmxhZyhvcHRpb25zMiwga2V5cywgXCJmYWxsYmFja1wiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNvbnN0IGNvcnMgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcImNvcnNcIiwgbXVzdEJlT2JqZWN0KTtcbiAgICAgICAgICBjb25zdCBvblJlcXVlc3QgPSBnZXRGbGFnKG9wdGlvbnMyLCBrZXlzLCBcIm9uUmVxdWVzdFwiLCBtdXN0QmVGdW5jdGlvbik7XG4gICAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3Mob3B0aW9uczIsIGtleXMsIGBpbiBzZXJ2ZSgpIGNhbGxgKTtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0MiA9IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6IFwic2VydmVcIixcbiAgICAgICAgICAgIGtleTogYnVpbGRLZXksXG4gICAgICAgICAgICBvblJlcXVlc3Q6ICEhb25SZXF1ZXN0XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAocG9ydCAhPT0gdm9pZCAwKSByZXF1ZXN0Mi5wb3J0ID0gcG9ydDtcbiAgICAgICAgICBpZiAoaG9zdCAhPT0gdm9pZCAwKSByZXF1ZXN0Mi5ob3N0ID0gaG9zdDtcbiAgICAgICAgICBpZiAoc2VydmVkaXIgIT09IHZvaWQgMCkgcmVxdWVzdDIuc2VydmVkaXIgPSBzZXJ2ZWRpcjtcbiAgICAgICAgICBpZiAoa2V5ZmlsZSAhPT0gdm9pZCAwKSByZXF1ZXN0Mi5rZXlmaWxlID0ga2V5ZmlsZTtcbiAgICAgICAgICBpZiAoY2VydGZpbGUgIT09IHZvaWQgMCkgcmVxdWVzdDIuY2VydGZpbGUgPSBjZXJ0ZmlsZTtcbiAgICAgICAgICBpZiAoZmFsbGJhY2sgIT09IHZvaWQgMCkgcmVxdWVzdDIuZmFsbGJhY2sgPSBmYWxsYmFjaztcbiAgICAgICAgICBpZiAoY29ycykge1xuICAgICAgICAgICAgY29uc3QgY29yc0tleXMgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbiA9IGdldEZsYWcoY29ycywgY29yc0tleXMsIFwib3JpZ2luXCIsIG11c3RCZVN0cmluZ09yQXJyYXlPZlN0cmluZ3MpO1xuICAgICAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3MoY29ycywgY29yc0tleXMsIGBvbiBcImNvcnNcIiBvYmplY3RgKTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9yaWdpbikpIHJlcXVlc3QyLmNvcnNPcmlnaW4gPSBvcmlnaW47XG4gICAgICAgICAgICBlbHNlIGlmIChvcmlnaW4gIT09IHZvaWQgMCkgcmVxdWVzdDIuY29yc09yaWdpbiA9IFtvcmlnaW5dO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0MiwgKGVycm9yMiwgcmVzcG9uc2UyKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IyKSByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihlcnJvcjIpKTtcbiAgICAgICAgICAgIGlmIChvblJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgcmVxdWVzdENhbGxiYWNrc1tcInNlcnZlLXJlcXVlc3RcIl0gPSAoaWQsIHJlcXVlc3QzKSA9PiB7XG4gICAgICAgICAgICAgICAgb25SZXF1ZXN0KHJlcXVlc3QzLmFyZ3MpO1xuICAgICAgICAgICAgICAgIHNlbmRSZXNwb25zZShpZCwge30pO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZTIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgY2FuY2VsOiAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGlmIChkaWREaXNwb3NlKSByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QyID0ge1xuICAgICAgICAgICAgY29tbWFuZDogXCJjYW5jZWxcIixcbiAgICAgICAgICAgIGtleTogYnVpbGRLZXlcbiAgICAgICAgICB9O1xuICAgICAgICAgIHNlbmRSZXF1ZXN0KHJlZnMsIHJlcXVlc3QyLCAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICBkaXNwb3NlOiAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGlmIChkaWREaXNwb3NlKSByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgIGRpZERpc3Bvc2UgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QyID0ge1xuICAgICAgICAgICAgY29tbWFuZDogXCJkaXNwb3NlXCIsXG4gICAgICAgICAgICBrZXk6IGJ1aWxkS2V5XG4gICAgICAgICAgfTtcbiAgICAgICAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0MiwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgc2NoZWR1bGVPbkRpc3Bvc2VDYWxsYmFja3MoKTtcbiAgICAgICAgICAgIHJlZnMudW5yZWYoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgICByZWZzLnJlZigpO1xuICAgICAgY2FsbGJhY2sobnVsbCwgcmVzdWx0KTtcbiAgICB9KTtcbiAgfVxufVxudmFyIGhhbmRsZVBsdWdpbnMgPSBhc3luYyAoYnVpbGRLZXksIHNlbmRSZXF1ZXN0LCBzZW5kUmVzcG9uc2UsIHJlZnMsIHN0cmVhbUluLCByZXF1ZXN0Q2FsbGJhY2tzLCBpbml0aWFsT3B0aW9ucywgcGx1Z2lucywgZGV0YWlscykgPT4ge1xuICBsZXQgb25TdGFydENhbGxiYWNrcyA9IFtdO1xuICBsZXQgb25FbmRDYWxsYmFja3MgPSBbXTtcbiAgbGV0IG9uUmVzb2x2ZUNhbGxiYWNrcyA9IHt9O1xuICBsZXQgb25Mb2FkQ2FsbGJhY2tzID0ge307XG4gIGxldCBvbkRpc3Bvc2VDYWxsYmFja3MgPSBbXTtcbiAgbGV0IG5leHRDYWxsYmFja0lEID0gMDtcbiAgbGV0IGkgPSAwO1xuICBsZXQgcmVxdWVzdFBsdWdpbnMgPSBbXTtcbiAgbGV0IGlzU2V0dXBEb25lID0gZmFsc2U7XG4gIHBsdWdpbnMgPSBbLi4ucGx1Z2luc107XG4gIGZvciAobGV0IGl0ZW0gb2YgcGx1Z2lucykge1xuICAgIGxldCBrZXlzID0ge307XG4gICAgaWYgKHR5cGVvZiBpdGVtICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiBhdCBpbmRleCAke2l9IG11c3QgYmUgYW4gb2JqZWN0YCk7XG4gICAgY29uc3QgbmFtZSA9IGdldEZsYWcoaXRlbSwga2V5cywgXCJuYW1lXCIsIG11c3RCZVN0cmluZyk7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiIHx8IG5hbWUgPT09IFwiXCIpIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIGF0IGluZGV4ICR7aX0gaXMgbWlzc2luZyBhIG5hbWVgKTtcbiAgICB0cnkge1xuICAgICAgbGV0IHNldHVwID0gZ2V0RmxhZyhpdGVtLCBrZXlzLCBcInNldHVwXCIsIG11c3RCZUZ1bmN0aW9uKTtcbiAgICAgIGlmICh0eXBlb2Ygc2V0dXAgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gaXMgbWlzc2luZyBhIHNldHVwIGZ1bmN0aW9uYCk7XG4gICAgICBjaGVja0ZvckludmFsaWRGbGFncyhpdGVtLCBrZXlzLCBgb24gcGx1Z2luICR7cXVvdGUobmFtZSl9YCk7XG4gICAgICBsZXQgcGx1Z2luID0ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBvblN0YXJ0OiBmYWxzZSxcbiAgICAgICAgb25FbmQ6IGZhbHNlLFxuICAgICAgICBvblJlc29sdmU6IFtdLFxuICAgICAgICBvbkxvYWQ6IFtdXG4gICAgICB9O1xuICAgICAgaSsrO1xuICAgICAgbGV0IHJlc29sdmUgPSAocGF0aDMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBpZiAoIWlzU2V0dXBEb25lKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjYWxsIFwicmVzb2x2ZVwiIGJlZm9yZSBwbHVnaW4gc2V0dXAgaGFzIGNvbXBsZXRlZCcpO1xuICAgICAgICBpZiAodHlwZW9mIHBhdGgzICE9PSBcInN0cmluZ1wiKSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwYXRoIHRvIHJlc29sdmUgbXVzdCBiZSBhIHN0cmluZ2ApO1xuICAgICAgICBsZXQga2V5czIgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgbGV0IHBsdWdpbk5hbWUgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcInBsdWdpbk5hbWVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgbGV0IGltcG9ydGVyID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJpbXBvcnRlclwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICBsZXQgbmFtZXNwYWNlID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJuYW1lc3BhY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgbGV0IHJlc29sdmVEaXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcInJlc29sdmVEaXJcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgbGV0IGtpbmQgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcImtpbmRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgbGV0IHBsdWdpbkRhdGEgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcInBsdWdpbkRhdGFcIiwgY2FuQmVBbnl0aGluZyk7XG4gICAgICAgIGxldCBpbXBvcnRBdHRyaWJ1dGVzID0gZ2V0RmxhZyhvcHRpb25zLCBrZXlzMiwgXCJ3aXRoXCIsIG11c3RCZU9iamVjdCk7XG4gICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMyLCBcImluIHJlc29sdmUoKSBjYWxsXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICAgICAgY29tbWFuZDogXCJyZXNvbHZlXCIsXG4gICAgICAgICAgICBwYXRoOiBwYXRoMyxcbiAgICAgICAgICAgIGtleTogYnVpbGRLZXksXG4gICAgICAgICAgICBwbHVnaW5OYW1lOiBuYW1lXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAocGx1Z2luTmFtZSAhPSBudWxsKSByZXF1ZXN0LnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lO1xuICAgICAgICAgIGlmIChpbXBvcnRlciAhPSBudWxsKSByZXF1ZXN0LmltcG9ydGVyID0gaW1wb3J0ZXI7XG4gICAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsKSByZXF1ZXN0Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcbiAgICAgICAgICBpZiAocmVzb2x2ZURpciAhPSBudWxsKSByZXF1ZXN0LnJlc29sdmVEaXIgPSByZXNvbHZlRGlyO1xuICAgICAgICAgIGlmIChraW5kICE9IG51bGwpIHJlcXVlc3Qua2luZCA9IGtpbmQ7XG4gICAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoYE11c3Qgc3BlY2lmeSBcImtpbmRcIiB3aGVuIGNhbGxpbmcgXCJyZXNvbHZlXCJgKTtcbiAgICAgICAgICBpZiAocGx1Z2luRGF0YSAhPSBudWxsKSByZXF1ZXN0LnBsdWdpbkRhdGEgPSBkZXRhaWxzLnN0b3JlKHBsdWdpbkRhdGEpO1xuICAgICAgICAgIGlmIChpbXBvcnRBdHRyaWJ1dGVzICE9IG51bGwpIHJlcXVlc3Qud2l0aCA9IHNhbml0aXplU3RyaW5nTWFwKGltcG9ydEF0dHJpYnV0ZXMsIFwid2l0aFwiKTtcbiAgICAgICAgICBzZW5kUmVxdWVzdChyZWZzLCByZXF1ZXN0LCAoZXJyb3IsIHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHJlamVjdChuZXcgRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgICAgIGVsc2UgcmVzb2x2ZTIoe1xuICAgICAgICAgICAgICBlcnJvcnM6IHJlcGxhY2VEZXRhaWxzSW5NZXNzYWdlcyhyZXNwb25zZS5lcnJvcnMsIGRldGFpbHMpLFxuICAgICAgICAgICAgICB3YXJuaW5nczogcmVwbGFjZURldGFpbHNJbk1lc3NhZ2VzKHJlc3BvbnNlLndhcm5pbmdzLCBkZXRhaWxzKSxcbiAgICAgICAgICAgICAgcGF0aDogcmVzcG9uc2UucGF0aCxcbiAgICAgICAgICAgICAgZXh0ZXJuYWw6IHJlc3BvbnNlLmV4dGVybmFsLFxuICAgICAgICAgICAgICBzaWRlRWZmZWN0czogcmVzcG9uc2Uuc2lkZUVmZmVjdHMsXG4gICAgICAgICAgICAgIG5hbWVzcGFjZTogcmVzcG9uc2UubmFtZXNwYWNlLFxuICAgICAgICAgICAgICBzdWZmaXg6IHJlc3BvbnNlLnN1ZmZpeCxcbiAgICAgICAgICAgICAgcGx1Z2luRGF0YTogZGV0YWlscy5sb2FkKHJlc3BvbnNlLnBsdWdpbkRhdGEpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgbGV0IHByb21pc2UgPSBzZXR1cCh7XG4gICAgICAgIGluaXRpYWxPcHRpb25zLFxuICAgICAgICByZXNvbHZlLFxuICAgICAgICBvblN0YXJ0KGNhbGxiYWNrKSB7XG4gICAgICAgICAgbGV0IHJlZ2lzdGVyZWRUZXh0ID0gYFRoaXMgZXJyb3IgY2FtZSBmcm9tIHRoZSBcIm9uU3RhcnRcIiBjYWxsYmFjayByZWdpc3RlcmVkIGhlcmU6YDtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZE5vdGUgPSBleHRyYWN0Q2FsbGVyVjgobmV3IEVycm9yKHJlZ2lzdGVyZWRUZXh0KSwgc3RyZWFtSW4sIFwib25TdGFydFwiKTtcbiAgICAgICAgICBvblN0YXJ0Q2FsbGJhY2tzLnB1c2goeyBuYW1lLCBjYWxsYmFjaywgbm90ZTogcmVnaXN0ZXJlZE5vdGUgfSk7XG4gICAgICAgICAgcGx1Z2luLm9uU3RhcnQgPSB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBvbkVuZChjYWxsYmFjaykge1xuICAgICAgICAgIGxldCByZWdpc3RlcmVkVGV4dCA9IGBUaGlzIGVycm9yIGNhbWUgZnJvbSB0aGUgXCJvbkVuZFwiIGNhbGxiYWNrIHJlZ2lzdGVyZWQgaGVyZTpgO1xuICAgICAgICAgIGxldCByZWdpc3RlcmVkTm90ZSA9IGV4dHJhY3RDYWxsZXJWOChuZXcgRXJyb3IocmVnaXN0ZXJlZFRleHQpLCBzdHJlYW1JbiwgXCJvbkVuZFwiKTtcbiAgICAgICAgICBvbkVuZENhbGxiYWNrcy5wdXNoKHsgbmFtZSwgY2FsbGJhY2ssIG5vdGU6IHJlZ2lzdGVyZWROb3RlIH0pO1xuICAgICAgICAgIHBsdWdpbi5vbkVuZCA9IHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIG9uUmVzb2x2ZShvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgIGxldCByZWdpc3RlcmVkVGV4dCA9IGBUaGlzIGVycm9yIGNhbWUgZnJvbSB0aGUgXCJvblJlc29sdmVcIiBjYWxsYmFjayByZWdpc3RlcmVkIGhlcmU6YDtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZE5vdGUgPSBleHRyYWN0Q2FsbGVyVjgobmV3IEVycm9yKHJlZ2lzdGVyZWRUZXh0KSwgc3RyZWFtSW4sIFwib25SZXNvbHZlXCIpO1xuICAgICAgICAgIGxldCBrZXlzMiA9IHt9O1xuICAgICAgICAgIGxldCBmaWx0ZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcImZpbHRlclwiLCBtdXN0QmVSZWdFeHApO1xuICAgICAgICAgIGxldCBuYW1lc3BhY2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcIm5hbWVzcGFjZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMyLCBgaW4gb25SZXNvbHZlKCkgY2FsbCBmb3IgcGx1Z2luICR7cXVvdGUobmFtZSl9YCk7XG4gICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoYG9uUmVzb2x2ZSgpIGNhbGwgaXMgbWlzc2luZyBhIGZpbHRlcmApO1xuICAgICAgICAgIGxldCBpZCA9IG5leHRDYWxsYmFja0lEKys7XG4gICAgICAgICAgb25SZXNvbHZlQ2FsbGJhY2tzW2lkXSA9IHsgbmFtZSwgY2FsbGJhY2ssIG5vdGU6IHJlZ2lzdGVyZWROb3RlIH07XG4gICAgICAgICAgcGx1Z2luLm9uUmVzb2x2ZS5wdXNoKHsgaWQsIGZpbHRlcjoganNSZWdFeHBUb0dvUmVnRXhwKGZpbHRlciksIG5hbWVzcGFjZTogbmFtZXNwYWNlIHx8IFwiXCIgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uTG9hZChvcHRpb25zLCBjYWxsYmFjaykge1xuICAgICAgICAgIGxldCByZWdpc3RlcmVkVGV4dCA9IGBUaGlzIGVycm9yIGNhbWUgZnJvbSB0aGUgXCJvbkxvYWRcIiBjYWxsYmFjayByZWdpc3RlcmVkIGhlcmU6YDtcbiAgICAgICAgICBsZXQgcmVnaXN0ZXJlZE5vdGUgPSBleHRyYWN0Q2FsbGVyVjgobmV3IEVycm9yKHJlZ2lzdGVyZWRUZXh0KSwgc3RyZWFtSW4sIFwib25Mb2FkXCIpO1xuICAgICAgICAgIGxldCBrZXlzMiA9IHt9O1xuICAgICAgICAgIGxldCBmaWx0ZXIgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcImZpbHRlclwiLCBtdXN0QmVSZWdFeHApO1xuICAgICAgICAgIGxldCBuYW1lc3BhY2UgPSBnZXRGbGFnKG9wdGlvbnMsIGtleXMyLCBcIm5hbWVzcGFjZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGNoZWNrRm9ySW52YWxpZEZsYWdzKG9wdGlvbnMsIGtleXMyLCBgaW4gb25Mb2FkKCkgY2FsbCBmb3IgcGx1Z2luICR7cXVvdGUobmFtZSl9YCk7XG4gICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoYG9uTG9hZCgpIGNhbGwgaXMgbWlzc2luZyBhIGZpbHRlcmApO1xuICAgICAgICAgIGxldCBpZCA9IG5leHRDYWxsYmFja0lEKys7XG4gICAgICAgICAgb25Mb2FkQ2FsbGJhY2tzW2lkXSA9IHsgbmFtZSwgY2FsbGJhY2ssIG5vdGU6IHJlZ2lzdGVyZWROb3RlIH07XG4gICAgICAgICAgcGx1Z2luLm9uTG9hZC5wdXNoKHsgaWQsIGZpbHRlcjoganNSZWdFeHBUb0dvUmVnRXhwKGZpbHRlciksIG5hbWVzcGFjZTogbmFtZXNwYWNlIHx8IFwiXCIgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRGlzcG9zZShjYWxsYmFjaykge1xuICAgICAgICAgIG9uRGlzcG9zZUNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXNidWlsZDogc3RyZWFtSW4uZXNidWlsZFxuICAgICAgfSk7XG4gICAgICBpZiAocHJvbWlzZSkgYXdhaXQgcHJvbWlzZTtcbiAgICAgIHJlcXVlc3RQbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4geyBvazogZmFsc2UsIGVycm9yOiBlLCBwbHVnaW5OYW1lOiBuYW1lIH07XG4gICAgfVxuICB9XG4gIHJlcXVlc3RDYWxsYmFja3NbXCJvbi1zdGFydFwiXSA9IGFzeW5jIChpZCwgcmVxdWVzdCkgPT4ge1xuICAgIGRldGFpbHMuY2xlYXIoKTtcbiAgICBsZXQgcmVzcG9uc2UgPSB7IGVycm9yczogW10sIHdhcm5pbmdzOiBbXSB9O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKG9uU3RhcnRDYWxsYmFja3MubWFwKGFzeW5jICh7IG5hbWUsIGNhbGxiYWNrLCBub3RlIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBjYWxsYmFjaygpO1xuICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvblN0YXJ0KCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9IHRvIHJldHVybiBhbiBvYmplY3RgKTtcbiAgICAgICAgICBsZXQga2V5cyA9IHt9O1xuICAgICAgICAgIGxldCBlcnJvcnMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJlcnJvcnNcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgIGxldCB3YXJuaW5ncyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIndhcm5pbmdzXCIsIG11c3RCZUFycmF5KTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhyZXN1bHQsIGtleXMsIGBmcm9tIG9uU3RhcnQoKSBjYWxsYmFjayBpbiBwbHVnaW4gJHtxdW90ZShuYW1lKX1gKTtcbiAgICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpIHJlc3BvbnNlLmVycm9ycy5wdXNoKC4uLnNhbml0aXplTWVzc2FnZXMoZXJyb3JzLCBcImVycm9yc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApKTtcbiAgICAgICAgICBpZiAod2FybmluZ3MgIT0gbnVsbCkgcmVzcG9uc2Uud2FybmluZ3MucHVzaCguLi5zYW5pdGl6ZU1lc3NhZ2VzKHdhcm5pbmdzLCBcIndhcm5pbmdzXCIsIGRldGFpbHMsIG5hbWUsIHZvaWQgMCkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlc3BvbnNlLmVycm9ycy5wdXNoKGV4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgZGV0YWlscywgbm90ZSAmJiBub3RlKCksIG5hbWUpKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgc2VuZFJlc3BvbnNlKGlkLCByZXNwb25zZSk7XG4gIH07XG4gIHJlcXVlc3RDYWxsYmFja3NbXCJvbi1yZXNvbHZlXCJdID0gYXN5bmMgKGlkLCByZXF1ZXN0KSA9PiB7XG4gICAgbGV0IHJlc3BvbnNlID0ge30sIG5hbWUgPSBcIlwiLCBjYWxsYmFjaywgbm90ZTtcbiAgICBmb3IgKGxldCBpZDIgb2YgcmVxdWVzdC5pZHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgICh7IG5hbWUsIGNhbGxiYWNrLCBub3RlIH0gPSBvblJlc29sdmVDYWxsYmFja3NbaWQyXSk7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBjYWxsYmFjayh7XG4gICAgICAgICAgcGF0aDogcmVxdWVzdC5wYXRoLFxuICAgICAgICAgIGltcG9ydGVyOiByZXF1ZXN0LmltcG9ydGVyLFxuICAgICAgICAgIG5hbWVzcGFjZTogcmVxdWVzdC5uYW1lc3BhY2UsXG4gICAgICAgICAgcmVzb2x2ZURpcjogcmVxdWVzdC5yZXNvbHZlRGlyLFxuICAgICAgICAgIGtpbmQ6IHJlcXVlc3Qua2luZCxcbiAgICAgICAgICBwbHVnaW5EYXRhOiBkZXRhaWxzLmxvYWQocmVxdWVzdC5wbHVnaW5EYXRhKSxcbiAgICAgICAgICB3aXRoOiByZXF1ZXN0LndpdGhcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG9uUmVzb2x2ZSgpIGNhbGxiYWNrIGluIHBsdWdpbiAke3F1b3RlKG5hbWUpfSB0byByZXR1cm4gYW4gb2JqZWN0YCk7XG4gICAgICAgICAgbGV0IGtleXMgPSB7fTtcbiAgICAgICAgICBsZXQgcGx1Z2luTmFtZSA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcInBsdWdpbk5hbWVcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgcGF0aDMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJwYXRoXCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgbGV0IG5hbWVzcGFjZSA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIm5hbWVzcGFjZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBzdWZmaXggPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJzdWZmaXhcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgZXh0ZXJuYWwgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJleHRlcm5hbFwiLCBtdXN0QmVCb29sZWFuKTtcbiAgICAgICAgICBsZXQgc2lkZUVmZmVjdHMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJzaWRlRWZmZWN0c1wiLCBtdXN0QmVCb29sZWFuKTtcbiAgICAgICAgICBsZXQgcGx1Z2luRGF0YSA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcInBsdWdpbkRhdGFcIiwgY2FuQmVBbnl0aGluZyk7XG4gICAgICAgICAgbGV0IGVycm9ycyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcImVycm9yc1wiLCBtdXN0QmVBcnJheSk7XG4gICAgICAgICAgbGV0IHdhcm5pbmdzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwid2FybmluZ3NcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgIGxldCB3YXRjaEZpbGVzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwid2F0Y2hGaWxlc1wiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gICAgICAgICAgbGV0IHdhdGNoRGlycyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcIndhdGNoRGlyc1wiLCBtdXN0QmVBcnJheU9mU3RyaW5ncyk7XG4gICAgICAgICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3MocmVzdWx0LCBrZXlzLCBgZnJvbSBvblJlc29sdmUoKSBjYWxsYmFjayBpbiBwbHVnaW4gJHtxdW90ZShuYW1lKX1gKTtcbiAgICAgICAgICByZXNwb25zZS5pZCA9IGlkMjtcbiAgICAgICAgICBpZiAocGx1Z2luTmFtZSAhPSBudWxsKSByZXNwb25zZS5wbHVnaW5OYW1lID0gcGx1Z2luTmFtZTtcbiAgICAgICAgICBpZiAocGF0aDMgIT0gbnVsbCkgcmVzcG9uc2UucGF0aCA9IHBhdGgzO1xuICAgICAgICAgIGlmIChuYW1lc3BhY2UgIT0gbnVsbCkgcmVzcG9uc2UubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICAgICAgICAgIGlmIChzdWZmaXggIT0gbnVsbCkgcmVzcG9uc2Uuc3VmZml4ID0gc3VmZml4O1xuICAgICAgICAgIGlmIChleHRlcm5hbCAhPSBudWxsKSByZXNwb25zZS5leHRlcm5hbCA9IGV4dGVybmFsO1xuICAgICAgICAgIGlmIChzaWRlRWZmZWN0cyAhPSBudWxsKSByZXNwb25zZS5zaWRlRWZmZWN0cyA9IHNpZGVFZmZlY3RzO1xuICAgICAgICAgIGlmIChwbHVnaW5EYXRhICE9IG51bGwpIHJlc3BvbnNlLnBsdWdpbkRhdGEgPSBkZXRhaWxzLnN0b3JlKHBsdWdpbkRhdGEpO1xuICAgICAgICAgIGlmIChlcnJvcnMgIT0gbnVsbCkgcmVzcG9uc2UuZXJyb3JzID0gc2FuaXRpemVNZXNzYWdlcyhlcnJvcnMsIFwiZXJyb3JzXCIsIGRldGFpbHMsIG5hbWUsIHZvaWQgMCk7XG4gICAgICAgICAgaWYgKHdhcm5pbmdzICE9IG51bGwpIHJlc3BvbnNlLndhcm5pbmdzID0gc2FuaXRpemVNZXNzYWdlcyh3YXJuaW5ncywgXCJ3YXJuaW5nc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApO1xuICAgICAgICAgIGlmICh3YXRjaEZpbGVzICE9IG51bGwpIHJlc3BvbnNlLndhdGNoRmlsZXMgPSBzYW5pdGl6ZVN0cmluZ0FycmF5KHdhdGNoRmlsZXMsIFwid2F0Y2hGaWxlc1wiKTtcbiAgICAgICAgICBpZiAod2F0Y2hEaXJzICE9IG51bGwpIHJlc3BvbnNlLndhdGNoRGlycyA9IHNhbml0aXplU3RyaW5nQXJyYXkod2F0Y2hEaXJzLCBcIndhdGNoRGlyc1wiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXNwb25zZSA9IHsgaWQ6IGlkMiwgZXJyb3JzOiBbZXh0cmFjdEVycm9yTWVzc2FnZVY4KGUsIHN0cmVhbUluLCBkZXRhaWxzLCBub3RlICYmIG5vdGUoKSwgbmFtZSldIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBzZW5kUmVzcG9uc2UoaWQsIHJlc3BvbnNlKTtcbiAgfTtcbiAgcmVxdWVzdENhbGxiYWNrc1tcIm9uLWxvYWRcIl0gPSBhc3luYyAoaWQsIHJlcXVlc3QpID0+IHtcbiAgICBsZXQgcmVzcG9uc2UgPSB7fSwgbmFtZSA9IFwiXCIsIGNhbGxiYWNrLCBub3RlO1xuICAgIGZvciAobGV0IGlkMiBvZiByZXF1ZXN0Lmlkcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHsgbmFtZSwgY2FsbGJhY2ssIG5vdGUgfSA9IG9uTG9hZENhbGxiYWNrc1tpZDJdKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGNhbGxiYWNrKHtcbiAgICAgICAgICBwYXRoOiByZXF1ZXN0LnBhdGgsXG4gICAgICAgICAgbmFtZXNwYWNlOiByZXF1ZXN0Lm5hbWVzcGFjZSxcbiAgICAgICAgICBzdWZmaXg6IHJlcXVlc3Quc3VmZml4LFxuICAgICAgICAgIHBsdWdpbkRhdGE6IGRldGFpbHMubG9hZChyZXF1ZXN0LnBsdWdpbkRhdGEpLFxuICAgICAgICAgIHdpdGg6IHJlcXVlc3Qud2l0aFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgb25Mb2FkKCkgY2FsbGJhY2sgaW4gcGx1Z2luICR7cXVvdGUobmFtZSl9IHRvIHJldHVybiBhbiBvYmplY3RgKTtcbiAgICAgICAgICBsZXQga2V5cyA9IHt9O1xuICAgICAgICAgIGxldCBwbHVnaW5OYW1lID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwicGx1Z2luTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICAgIGxldCBjb250ZW50cyA9IGdldEZsYWcocmVzdWx0LCBrZXlzLCBcImNvbnRlbnRzXCIsIG11c3RCZVN0cmluZ09yVWludDhBcnJheSk7XG4gICAgICAgICAgbGV0IHJlc29sdmVEaXIgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJyZXNvbHZlRGlyXCIsIG11c3RCZVN0cmluZyk7XG4gICAgICAgICAgbGV0IHBsdWdpbkRhdGEgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJwbHVnaW5EYXRhXCIsIGNhbkJlQW55dGhpbmcpO1xuICAgICAgICAgIGxldCBsb2FkZXIgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJsb2FkZXJcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICAgICAgICBsZXQgZXJyb3JzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwiZXJyb3JzXCIsIG11c3RCZUFycmF5KTtcbiAgICAgICAgICBsZXQgd2FybmluZ3MgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJ3YXJuaW5nc1wiLCBtdXN0QmVBcnJheSk7XG4gICAgICAgICAgbGV0IHdhdGNoRmlsZXMgPSBnZXRGbGFnKHJlc3VsdCwga2V5cywgXCJ3YXRjaEZpbGVzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgICAgICAgICBsZXQgd2F0Y2hEaXJzID0gZ2V0RmxhZyhyZXN1bHQsIGtleXMsIFwid2F0Y2hEaXJzXCIsIG11c3RCZUFycmF5T2ZTdHJpbmdzKTtcbiAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhyZXN1bHQsIGtleXMsIGBmcm9tIG9uTG9hZCgpIGNhbGxiYWNrIGluIHBsdWdpbiAke3F1b3RlKG5hbWUpfWApO1xuICAgICAgICAgIHJlc3BvbnNlLmlkID0gaWQyO1xuICAgICAgICAgIGlmIChwbHVnaW5OYW1lICE9IG51bGwpIHJlc3BvbnNlLnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lO1xuICAgICAgICAgIGlmIChjb250ZW50cyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHJlc3BvbnNlLmNvbnRlbnRzID0gY29udGVudHM7XG4gICAgICAgICAgZWxzZSBpZiAoY29udGVudHMgIT0gbnVsbCkgcmVzcG9uc2UuY29udGVudHMgPSBlbmNvZGVVVEY4KGNvbnRlbnRzKTtcbiAgICAgICAgICBpZiAocmVzb2x2ZURpciAhPSBudWxsKSByZXNwb25zZS5yZXNvbHZlRGlyID0gcmVzb2x2ZURpcjtcbiAgICAgICAgICBpZiAocGx1Z2luRGF0YSAhPSBudWxsKSByZXNwb25zZS5wbHVnaW5EYXRhID0gZGV0YWlscy5zdG9yZShwbHVnaW5EYXRhKTtcbiAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHJlc3BvbnNlLmxvYWRlciA9IGxvYWRlcjtcbiAgICAgICAgICBpZiAoZXJyb3JzICE9IG51bGwpIHJlc3BvbnNlLmVycm9ycyA9IHNhbml0aXplTWVzc2FnZXMoZXJyb3JzLCBcImVycm9yc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApO1xuICAgICAgICAgIGlmICh3YXJuaW5ncyAhPSBudWxsKSByZXNwb25zZS53YXJuaW5ncyA9IHNhbml0aXplTWVzc2FnZXMod2FybmluZ3MsIFwid2FybmluZ3NcIiwgZGV0YWlscywgbmFtZSwgdm9pZCAwKTtcbiAgICAgICAgICBpZiAod2F0Y2hGaWxlcyAhPSBudWxsKSByZXNwb25zZS53YXRjaEZpbGVzID0gc2FuaXRpemVTdHJpbmdBcnJheSh3YXRjaEZpbGVzLCBcIndhdGNoRmlsZXNcIik7XG4gICAgICAgICAgaWYgKHdhdGNoRGlycyAhPSBudWxsKSByZXNwb25zZS53YXRjaERpcnMgPSBzYW5pdGl6ZVN0cmluZ0FycmF5KHdhdGNoRGlycywgXCJ3YXRjaERpcnNcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVzcG9uc2UgPSB7IGlkOiBpZDIsIGVycm9yczogW2V4dHJhY3RFcnJvck1lc3NhZ2VWOChlLCBzdHJlYW1JbiwgZGV0YWlscywgbm90ZSAmJiBub3RlKCksIG5hbWUpXSB9O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgc2VuZFJlc3BvbnNlKGlkLCByZXNwb25zZSk7XG4gIH07XG4gIGxldCBydW5PbkVuZENhbGxiYWNrcyA9IChyZXN1bHQsIGRvbmUpID0+IGRvbmUoW10sIFtdKTtcbiAgaWYgKG9uRW5kQ2FsbGJhY2tzLmxlbmd0aCA+IDApIHtcbiAgICBydW5PbkVuZENhbGxiYWNrcyA9IChyZXN1bHQsIGRvbmUpID0+IHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9uRW5kRXJyb3JzID0gW107XG4gICAgICAgIGNvbnN0IG9uRW5kV2FybmluZ3MgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB7IG5hbWUsIGNhbGxiYWNrLCBub3RlIH0gb2Ygb25FbmRDYWxsYmFja3MpIHtcbiAgICAgICAgICBsZXQgbmV3RXJyb3JzO1xuICAgICAgICAgIGxldCBuZXdXYXJuaW5ncztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBjYWxsYmFjayhyZXN1bHQpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvbkVuZCgpIGNhbGxiYWNrIGluIHBsdWdpbiAke3F1b3RlKG5hbWUpfSB0byByZXR1cm4gYW4gb2JqZWN0YCk7XG4gICAgICAgICAgICAgIGxldCBrZXlzID0ge307XG4gICAgICAgICAgICAgIGxldCBlcnJvcnMgPSBnZXRGbGFnKHZhbHVlLCBrZXlzLCBcImVycm9yc1wiLCBtdXN0QmVBcnJheSk7XG4gICAgICAgICAgICAgIGxldCB3YXJuaW5ncyA9IGdldEZsYWcodmFsdWUsIGtleXMsIFwid2FybmluZ3NcIiwgbXVzdEJlQXJyYXkpO1xuICAgICAgICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyh2YWx1ZSwga2V5cywgYGZyb20gb25FbmQoKSBjYWxsYmFjayBpbiBwbHVnaW4gJHtxdW90ZShuYW1lKX1gKTtcbiAgICAgICAgICAgICAgaWYgKGVycm9ycyAhPSBudWxsKSBuZXdFcnJvcnMgPSBzYW5pdGl6ZU1lc3NhZ2VzKGVycm9ycywgXCJlcnJvcnNcIiwgZGV0YWlscywgbmFtZSwgdm9pZCAwKTtcbiAgICAgICAgICAgICAgaWYgKHdhcm5pbmdzICE9IG51bGwpIG5ld1dhcm5pbmdzID0gc2FuaXRpemVNZXNzYWdlcyh3YXJuaW5ncywgXCJ3YXJuaW5nc1wiLCBkZXRhaWxzLCBuYW1lLCB2b2lkIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIG5ld0Vycm9ycyA9IFtleHRyYWN0RXJyb3JNZXNzYWdlVjgoZSwgc3RyZWFtSW4sIGRldGFpbHMsIG5vdGUgJiYgbm90ZSgpLCBuYW1lKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZXdFcnJvcnMpIHtcbiAgICAgICAgICAgIG9uRW5kRXJyb3JzLnB1c2goLi4ubmV3RXJyb3JzKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCguLi5uZXdFcnJvcnMpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuZXdXYXJuaW5ncykge1xuICAgICAgICAgICAgb25FbmRXYXJuaW5ncy5wdXNoKC4uLm5ld1dhcm5pbmdzKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlc3VsdC53YXJuaW5ncy5wdXNoKC4uLm5ld1dhcm5pbmdzKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkb25lKG9uRW5kRXJyb3JzLCBvbkVuZFdhcm5pbmdzKTtcbiAgICAgIH0pKCk7XG4gICAgfTtcbiAgfVxuICBsZXQgc2NoZWR1bGVPbkRpc3Bvc2VDYWxsYmFja3MgPSAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBjYiBvZiBvbkRpc3Bvc2VDYWxsYmFja3MpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2IoKSwgMCk7XG4gICAgfVxuICB9O1xuICBpc1NldHVwRG9uZSA9IHRydWU7XG4gIHJldHVybiB7XG4gICAgb2s6IHRydWUsXG4gICAgcmVxdWVzdFBsdWdpbnMsXG4gICAgcnVuT25FbmRDYWxsYmFja3MsXG4gICAgc2NoZWR1bGVPbkRpc3Bvc2VDYWxsYmFja3NcbiAgfTtcbn07XG5mdW5jdGlvbiBjcmVhdGVPYmplY3RTdGFzaCgpIHtcbiAgY29uc3QgbWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgbGV0IG5leHRJRCA9IDA7XG4gIHJldHVybiB7XG4gICAgY2xlYXIoKSB7XG4gICAgICBtYXAuY2xlYXIoKTtcbiAgICB9LFxuICAgIGxvYWQoaWQpIHtcbiAgICAgIHJldHVybiBtYXAuZ2V0KGlkKTtcbiAgICB9LFxuICAgIHN0b3JlKHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkgcmV0dXJuIC0xO1xuICAgICAgY29uc3QgaWQgPSBuZXh0SUQrKztcbiAgICAgIG1hcC5zZXQoaWQsIHZhbHVlKTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBleHRyYWN0Q2FsbGVyVjgoZSwgc3RyZWFtSW4sIGlkZW50KSB7XG4gIGxldCBub3RlO1xuICBsZXQgdHJpZWQgPSBmYWxzZTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAodHJpZWQpIHJldHVybiBub3RlO1xuICAgIHRyaWVkID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgbGV0IGxpbmVzID0gKGUuc3RhY2sgKyBcIlwiKS5zcGxpdChcIlxcblwiKTtcbiAgICAgIGxpbmVzLnNwbGljZSgxLCAxKTtcbiAgICAgIGxldCBsb2NhdGlvbiA9IHBhcnNlU3RhY2tMaW5lc1Y4KHN0cmVhbUluLCBsaW5lcywgaWRlbnQpO1xuICAgICAgaWYgKGxvY2F0aW9uKSB7XG4gICAgICAgIG5vdGUgPSB7IHRleHQ6IGUubWVzc2FnZSwgbG9jYXRpb24gfTtcbiAgICAgICAgcmV0dXJuIG5vdGU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gZXh0cmFjdEVycm9yTWVzc2FnZVY4KGUsIHN0cmVhbUluLCBzdGFzaCwgbm90ZSwgcGx1Z2luTmFtZSkge1xuICBsZXQgdGV4dCA9IFwiSW50ZXJuYWwgZXJyb3JcIjtcbiAgbGV0IGxvY2F0aW9uID0gbnVsbDtcbiAgdHJ5IHtcbiAgICB0ZXh0ID0gKGUgJiYgZS5tZXNzYWdlIHx8IGUpICsgXCJcIjtcbiAgfSBjYXRjaCB7XG4gIH1cbiAgdHJ5IHtcbiAgICBsb2NhdGlvbiA9IHBhcnNlU3RhY2tMaW5lc1Y4KHN0cmVhbUluLCAoZS5zdGFjayArIFwiXCIpLnNwbGl0KFwiXFxuXCIpLCBcIlwiKTtcbiAgfSBjYXRjaCB7XG4gIH1cbiAgcmV0dXJuIHsgaWQ6IFwiXCIsIHBsdWdpbk5hbWUsIHRleHQsIGxvY2F0aW9uLCBub3Rlczogbm90ZSA/IFtub3RlXSA6IFtdLCBkZXRhaWw6IHN0YXNoID8gc3Rhc2guc3RvcmUoZSkgOiAtMSB9O1xufVxuZnVuY3Rpb24gcGFyc2VTdGFja0xpbmVzVjgoc3RyZWFtSW4sIGxpbmVzLCBpZGVudCkge1xuICBsZXQgYXQgPSBcIiAgICBhdCBcIjtcbiAgaWYgKHN0cmVhbUluLnJlYWRGaWxlU3luYyAmJiAhbGluZXNbMF0uc3RhcnRzV2l0aChhdCkgJiYgbGluZXNbMV0uc3RhcnRzV2l0aChhdCkpIHtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgbGluZSA9IGxpbmVzW2ldO1xuICAgICAgaWYgKCFsaW5lLnN0YXJ0c1dpdGgoYXQpKSBjb250aW51ZTtcbiAgICAgIGxpbmUgPSBsaW5lLnNsaWNlKGF0Lmxlbmd0aCk7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSAvXig/Om5ldyB8YXN5bmMgKT9cXFMrIFxcKCguKilcXCkkLy5leGVjKGxpbmUpO1xuICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICBsaW5lID0gbWF0Y2hbMV07XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbWF0Y2ggPSAvXmV2YWwgYXQgXFxTKyBcXCgoLiopXFwpKD86LCBcXFMrOlxcZCs6XFxkKyk/JC8uZXhlYyhsaW5lKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgbGluZSA9IG1hdGNoWzFdO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoID0gL14oXFxTKyk6KFxcZCspOihcXGQrKSQvLmV4ZWMobGluZSk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGxldCBjb250ZW50cztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29udGVudHMgPSBzdHJlYW1Jbi5yZWFkRmlsZVN5bmMobWF0Y2hbMV0sIFwidXRmOFwiKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgbGluZVRleHQgPSBjb250ZW50cy5zcGxpdCgvXFxyXFxufFxccnxcXG58XFx1MjAyOHxcXHUyMDI5LylbK21hdGNoWzJdIC0gMV0gfHwgXCJcIjtcbiAgICAgICAgICBsZXQgY29sdW1uID0gK21hdGNoWzNdIC0gMTtcbiAgICAgICAgICBsZXQgbGVuZ3RoID0gbGluZVRleHQuc2xpY2UoY29sdW1uLCBjb2x1bW4gKyBpZGVudC5sZW5ndGgpID09PSBpZGVudCA/IGlkZW50Lmxlbmd0aCA6IDA7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGU6IG1hdGNoWzFdLFxuICAgICAgICAgICAgbmFtZXNwYWNlOiBcImZpbGVcIixcbiAgICAgICAgICAgIGxpbmU6ICttYXRjaFsyXSxcbiAgICAgICAgICAgIGNvbHVtbjogZW5jb2RlVVRGOChsaW5lVGV4dC5zbGljZSgwLCBjb2x1bW4pKS5sZW5ndGgsXG4gICAgICAgICAgICBsZW5ndGg6IGVuY29kZVVURjgobGluZVRleHQuc2xpY2UoY29sdW1uLCBjb2x1bW4gKyBsZW5ndGgpKS5sZW5ndGgsXG4gICAgICAgICAgICBsaW5lVGV4dDogbGluZVRleHQgKyBcIlxcblwiICsgbGluZXMuc2xpY2UoMSkuam9pbihcIlxcblwiKSxcbiAgICAgICAgICAgIHN1Z2dlc3Rpb246IFwiXCJcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGZhaWx1cmVFcnJvcldpdGhMb2codGV4dCwgZXJyb3JzLCB3YXJuaW5ncykge1xuICBsZXQgbGltaXQgPSA1O1xuICB0ZXh0ICs9IGVycm9ycy5sZW5ndGggPCAxID8gXCJcIiA6IGAgd2l0aCAke2Vycm9ycy5sZW5ndGh9IGVycm9yJHtlcnJvcnMubGVuZ3RoIDwgMiA/IFwiXCIgOiBcInNcIn06YCArIGVycm9ycy5zbGljZSgwLCBsaW1pdCArIDEpLm1hcCgoZSwgaSkgPT4ge1xuICAgIGlmIChpID09PSBsaW1pdCkgcmV0dXJuIFwiXFxuLi4uXCI7XG4gICAgaWYgKCFlLmxvY2F0aW9uKSByZXR1cm4gYFxuZXJyb3I6ICR7ZS50ZXh0fWA7XG4gICAgbGV0IHsgZmlsZSwgbGluZSwgY29sdW1uIH0gPSBlLmxvY2F0aW9uO1xuICAgIGxldCBwbHVnaW5UZXh0ID0gZS5wbHVnaW5OYW1lID8gYFtwbHVnaW46ICR7ZS5wbHVnaW5OYW1lfV0gYCA6IFwiXCI7XG4gICAgcmV0dXJuIGBcbiR7ZmlsZX06JHtsaW5lfToke2NvbHVtbn06IEVSUk9SOiAke3BsdWdpblRleHR9JHtlLnRleHR9YDtcbiAgfSkuam9pbihcIlwiKTtcbiAgbGV0IGVycm9yID0gbmV3IEVycm9yKHRleHQpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBbW1wiZXJyb3JzXCIsIGVycm9yc10sIFtcIndhcm5pbmdzXCIsIHdhcm5pbmdzXV0pIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyb3IsIGtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogKCkgPT4gdmFsdWUsXG4gICAgICBzZXQ6ICh2YWx1ZTIpID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlcnJvciwga2V5LCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHZhbHVlMlxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5mdW5jdGlvbiByZXBsYWNlRGV0YWlsc0luTWVzc2FnZXMobWVzc2FnZXMsIHN0YXNoKSB7XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgIG1lc3NhZ2UuZGV0YWlsID0gc3Rhc2gubG9hZChtZXNzYWdlLmRldGFpbCk7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2VzO1xufVxuZnVuY3Rpb24gc2FuaXRpemVMb2NhdGlvbihsb2NhdGlvbiwgd2hlcmUsIHRlcm1pbmFsV2lkdGgpIHtcbiAgaWYgKGxvY2F0aW9uID09IG51bGwpIHJldHVybiBudWxsO1xuICBsZXQga2V5cyA9IHt9O1xuICBsZXQgZmlsZSA9IGdldEZsYWcobG9jYXRpb24sIGtleXMsIFwiZmlsZVwiLCBtdXN0QmVTdHJpbmcpO1xuICBsZXQgbmFtZXNwYWNlID0gZ2V0RmxhZyhsb2NhdGlvbiwga2V5cywgXCJuYW1lc3BhY2VcIiwgbXVzdEJlU3RyaW5nKTtcbiAgbGV0IGxpbmUgPSBnZXRGbGFnKGxvY2F0aW9uLCBrZXlzLCBcImxpbmVcIiwgbXVzdEJlSW50ZWdlcik7XG4gIGxldCBjb2x1bW4gPSBnZXRGbGFnKGxvY2F0aW9uLCBrZXlzLCBcImNvbHVtblwiLCBtdXN0QmVJbnRlZ2VyKTtcbiAgbGV0IGxlbmd0aCA9IGdldEZsYWcobG9jYXRpb24sIGtleXMsIFwibGVuZ3RoXCIsIG11c3RCZUludGVnZXIpO1xuICBsZXQgbGluZVRleHQgPSBnZXRGbGFnKGxvY2F0aW9uLCBrZXlzLCBcImxpbmVUZXh0XCIsIG11c3RCZVN0cmluZyk7XG4gIGxldCBzdWdnZXN0aW9uID0gZ2V0RmxhZyhsb2NhdGlvbiwga2V5cywgXCJzdWdnZXN0aW9uXCIsIG11c3RCZVN0cmluZyk7XG4gIGNoZWNrRm9ySW52YWxpZEZsYWdzKGxvY2F0aW9uLCBrZXlzLCB3aGVyZSk7XG4gIGlmIChsaW5lVGV4dCkge1xuICAgIGNvbnN0IHJlbGV2YW50QVNDSUkgPSBsaW5lVGV4dC5zbGljZShcbiAgICAgIDAsXG4gICAgICAoY29sdW1uICYmIGNvbHVtbiA+IDAgPyBjb2x1bW4gOiAwKSArIChsZW5ndGggJiYgbGVuZ3RoID4gMCA/IGxlbmd0aCA6IDApICsgKHRlcm1pbmFsV2lkdGggJiYgdGVybWluYWxXaWR0aCA+IDAgPyB0ZXJtaW5hbFdpZHRoIDogODApXG4gICAgKTtcbiAgICBpZiAoIS9bXFx4N0YtXFx1RkZGRl0vLnRlc3QocmVsZXZhbnRBU0NJSSkgJiYgIS9cXG4vLnRlc3QobGluZVRleHQpKSB7XG4gICAgICBsaW5lVGV4dCA9IHJlbGV2YW50QVNDSUk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgZmlsZTogZmlsZSB8fCBcIlwiLFxuICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlIHx8IFwiXCIsXG4gICAgbGluZTogbGluZSB8fCAwLFxuICAgIGNvbHVtbjogY29sdW1uIHx8IDAsXG4gICAgbGVuZ3RoOiBsZW5ndGggfHwgMCxcbiAgICBsaW5lVGV4dDogbGluZVRleHQgfHwgXCJcIixcbiAgICBzdWdnZXN0aW9uOiBzdWdnZXN0aW9uIHx8IFwiXCJcbiAgfTtcbn1cbmZ1bmN0aW9uIHNhbml0aXplTWVzc2FnZXMobWVzc2FnZXMsIHByb3BlcnR5LCBzdGFzaCwgZmFsbGJhY2tQbHVnaW5OYW1lLCB0ZXJtaW5hbFdpZHRoKSB7XG4gIGxldCBtZXNzYWdlc0Nsb25lID0gW107XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgIGxldCBrZXlzID0ge307XG4gICAgbGV0IGlkID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcImlkXCIsIG11c3RCZVN0cmluZyk7XG4gICAgbGV0IHBsdWdpbk5hbWUgPSBnZXRGbGFnKG1lc3NhZ2UsIGtleXMsIFwicGx1Z2luTmFtZVwiLCBtdXN0QmVTdHJpbmcpO1xuICAgIGxldCB0ZXh0ID0gZ2V0RmxhZyhtZXNzYWdlLCBrZXlzLCBcInRleHRcIiwgbXVzdEJlU3RyaW5nKTtcbiAgICBsZXQgbG9jYXRpb24gPSBnZXRGbGFnKG1lc3NhZ2UsIGtleXMsIFwibG9jYXRpb25cIiwgbXVzdEJlT2JqZWN0T3JOdWxsKTtcbiAgICBsZXQgbm90ZXMgPSBnZXRGbGFnKG1lc3NhZ2UsIGtleXMsIFwibm90ZXNcIiwgbXVzdEJlQXJyYXkpO1xuICAgIGxldCBkZXRhaWwgPSBnZXRGbGFnKG1lc3NhZ2UsIGtleXMsIFwiZGV0YWlsXCIsIGNhbkJlQW55dGhpbmcpO1xuICAgIGxldCB3aGVyZSA9IGBpbiBlbGVtZW50ICR7aW5kZXh9IG9mIFwiJHtwcm9wZXJ0eX1cImA7XG4gICAgY2hlY2tGb3JJbnZhbGlkRmxhZ3MobWVzc2FnZSwga2V5cywgd2hlcmUpO1xuICAgIGxldCBub3Rlc0Nsb25lID0gW107XG4gICAgaWYgKG5vdGVzKSB7XG4gICAgICBmb3IgKGNvbnN0IG5vdGUgb2Ygbm90ZXMpIHtcbiAgICAgICAgbGV0IG5vdGVLZXlzID0ge307XG4gICAgICAgIGxldCBub3RlVGV4dCA9IGdldEZsYWcobm90ZSwgbm90ZUtleXMsIFwidGV4dFwiLCBtdXN0QmVTdHJpbmcpO1xuICAgICAgICBsZXQgbm90ZUxvY2F0aW9uID0gZ2V0RmxhZyhub3RlLCBub3RlS2V5cywgXCJsb2NhdGlvblwiLCBtdXN0QmVPYmplY3RPck51bGwpO1xuICAgICAgICBjaGVja0ZvckludmFsaWRGbGFncyhub3RlLCBub3RlS2V5cywgd2hlcmUpO1xuICAgICAgICBub3Rlc0Nsb25lLnB1c2goe1xuICAgICAgICAgIHRleHQ6IG5vdGVUZXh0IHx8IFwiXCIsXG4gICAgICAgICAgbG9jYXRpb246IHNhbml0aXplTG9jYXRpb24obm90ZUxvY2F0aW9uLCB3aGVyZSwgdGVybWluYWxXaWR0aClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIG1lc3NhZ2VzQ2xvbmUucHVzaCh7XG4gICAgICBpZDogaWQgfHwgXCJcIixcbiAgICAgIHBsdWdpbk5hbWU6IHBsdWdpbk5hbWUgfHwgZmFsbGJhY2tQbHVnaW5OYW1lLFxuICAgICAgdGV4dDogdGV4dCB8fCBcIlwiLFxuICAgICAgbG9jYXRpb246IHNhbml0aXplTG9jYXRpb24obG9jYXRpb24sIHdoZXJlLCB0ZXJtaW5hbFdpZHRoKSxcbiAgICAgIG5vdGVzOiBub3Rlc0Nsb25lLFxuICAgICAgZGV0YWlsOiBzdGFzaCA/IHN0YXNoLnN0b3JlKGRldGFpbCkgOiAtMVxuICAgIH0pO1xuICAgIGluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2VzQ2xvbmU7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZVN0cmluZ0FycmF5KHZhbHVlcywgcHJvcGVydHkpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikgdGhyb3cgbmV3IEVycm9yKGAke3F1b3RlKHByb3BlcnR5KX0gbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzYCk7XG4gICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5mdW5jdGlvbiBzYW5pdGl6ZVN0cmluZ01hcChtYXAsIHByb3BlcnR5KSB7XG4gIGNvbnN0IHJlc3VsdCA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBmb3IgKGNvbnN0IGtleSBpbiBtYXApIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1hcFtrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihga2V5ICR7cXVvdGUoa2V5KX0gaW4gb2JqZWN0ICR7cXVvdGUocHJvcGVydHkpfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG4gICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gY29udmVydE91dHB1dEZpbGVzKHsgcGF0aDogcGF0aDMsIGNvbnRlbnRzLCBoYXNoIH0pIHtcbiAgbGV0IHRleHQgPSBudWxsO1xuICByZXR1cm4ge1xuICAgIHBhdGg6IHBhdGgzLFxuICAgIGNvbnRlbnRzLFxuICAgIGhhc2gsXG4gICAgZ2V0IHRleHQoKSB7XG4gICAgICBjb25zdCBiaW5hcnkgPSB0aGlzLmNvbnRlbnRzO1xuICAgICAgaWYgKHRleHQgPT09IG51bGwgfHwgYmluYXJ5ICE9PSBjb250ZW50cykge1xuICAgICAgICBjb250ZW50cyA9IGJpbmFyeTtcbiAgICAgICAgdGV4dCA9IGRlY29kZVVURjgoYmluYXJ5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGpzUmVnRXhwVG9Hb1JlZ0V4cChyZWdleHApIHtcbiAgbGV0IHJlc3VsdCA9IHJlZ2V4cC5zb3VyY2U7XG4gIGlmIChyZWdleHAuZmxhZ3MpIHJlc3VsdCA9IGAoPyR7cmVnZXhwLmZsYWdzfSkke3Jlc3VsdH1gO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBsaWIvbnBtL25vZGUtcGxhdGZvcm0udHNcbnZhciBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbnZhciBvcyA9IHJlcXVpcmUoXCJvc1wiKTtcbnZhciBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG52YXIgRVNCVUlMRF9CSU5BUllfUEFUSCA9IHByb2Nlc3MuZW52LkVTQlVJTERfQklOQVJZX1BBVEggfHwgRVNCVUlMRF9CSU5BUllfUEFUSDtcbnZhciBpc1ZhbGlkQmluYXJ5UGF0aCA9ICh4KSA9PiAhIXggJiYgeCAhPT0gXCIvdXNyL2Jpbi9lc2J1aWxkXCI7XG52YXIgcGFja2FnZURhcndpbl9hcm02NCA9IFwiQGVzYnVpbGQvZGFyd2luLWFybTY0XCI7XG52YXIgcGFja2FnZURhcndpbl94NjQgPSBcIkBlc2J1aWxkL2Rhcndpbi14NjRcIjtcbnZhciBrbm93bldpbmRvd3NQYWNrYWdlcyA9IHtcbiAgXCJ3aW4zMiBhcm02NCBMRVwiOiBcIkBlc2J1aWxkL3dpbjMyLWFybTY0XCIsXG4gIFwid2luMzIgaWEzMiBMRVwiOiBcIkBlc2J1aWxkL3dpbjMyLWlhMzJcIixcbiAgXCJ3aW4zMiB4NjQgTEVcIjogXCJAZXNidWlsZC93aW4zMi14NjRcIlxufTtcbnZhciBrbm93blVuaXhsaWtlUGFja2FnZXMgPSB7XG4gIFwiYWl4IHBwYzY0IEJFXCI6IFwiQGVzYnVpbGQvYWl4LXBwYzY0XCIsXG4gIFwiYW5kcm9pZCBhcm02NCBMRVwiOiBcIkBlc2J1aWxkL2FuZHJvaWQtYXJtNjRcIixcbiAgXCJkYXJ3aW4gYXJtNjQgTEVcIjogXCJAZXNidWlsZC9kYXJ3aW4tYXJtNjRcIixcbiAgXCJkYXJ3aW4geDY0IExFXCI6IFwiQGVzYnVpbGQvZGFyd2luLXg2NFwiLFxuICBcImZyZWVic2QgYXJtNjQgTEVcIjogXCJAZXNidWlsZC9mcmVlYnNkLWFybTY0XCIsXG4gIFwiZnJlZWJzZCB4NjQgTEVcIjogXCJAZXNidWlsZC9mcmVlYnNkLXg2NFwiLFxuICBcImxpbnV4IGFybSBMRVwiOiBcIkBlc2J1aWxkL2xpbnV4LWFybVwiLFxuICBcImxpbnV4IGFybTY0IExFXCI6IFwiQGVzYnVpbGQvbGludXgtYXJtNjRcIixcbiAgXCJsaW51eCBpYTMyIExFXCI6IFwiQGVzYnVpbGQvbGludXgtaWEzMlwiLFxuICBcImxpbnV4IG1pcHM2NGVsIExFXCI6IFwiQGVzYnVpbGQvbGludXgtbWlwczY0ZWxcIixcbiAgXCJsaW51eCBwcGM2NCBMRVwiOiBcIkBlc2J1aWxkL2xpbnV4LXBwYzY0XCIsXG4gIFwibGludXggcmlzY3Y2NCBMRVwiOiBcIkBlc2J1aWxkL2xpbnV4LXJpc2N2NjRcIixcbiAgXCJsaW51eCBzMzkweCBCRVwiOiBcIkBlc2J1aWxkL2xpbnV4LXMzOTB4XCIsXG4gIFwibGludXggeDY0IExFXCI6IFwiQGVzYnVpbGQvbGludXgteDY0XCIsXG4gIFwibGludXggbG9vbmc2NCBMRVwiOiBcIkBlc2J1aWxkL2xpbnV4LWxvb25nNjRcIixcbiAgXCJuZXRic2QgYXJtNjQgTEVcIjogXCJAZXNidWlsZC9uZXRic2QtYXJtNjRcIixcbiAgXCJuZXRic2QgeDY0IExFXCI6IFwiQGVzYnVpbGQvbmV0YnNkLXg2NFwiLFxuICBcIm9wZW5ic2QgYXJtNjQgTEVcIjogXCJAZXNidWlsZC9vcGVuYnNkLWFybTY0XCIsXG4gIFwib3BlbmJzZCB4NjQgTEVcIjogXCJAZXNidWlsZC9vcGVuYnNkLXg2NFwiLFxuICBcInN1bm9zIHg2NCBMRVwiOiBcIkBlc2J1aWxkL3N1bm9zLXg2NFwiXG59O1xudmFyIGtub3duV2ViQXNzZW1ibHlGYWxsYmFja1BhY2thZ2VzID0ge1xuICBcImFuZHJvaWQgYXJtIExFXCI6IFwiQGVzYnVpbGQvYW5kcm9pZC1hcm1cIixcbiAgXCJhbmRyb2lkIHg2NCBMRVwiOiBcIkBlc2J1aWxkL2FuZHJvaWQteDY0XCIsXG4gIFwib3Blbmhhcm1vbnkgYXJtNjQgTEVcIjogXCJAZXNidWlsZC9vcGVuaGFybW9ueS1hcm02NFwiXG59O1xuZnVuY3Rpb24gcGtnQW5kU3VicGF0aEZvckN1cnJlbnRQbGF0Zm9ybSgpIHtcbiAgbGV0IHBrZztcbiAgbGV0IHN1YnBhdGg7XG4gIGxldCBpc1dBU00gPSBmYWxzZTtcbiAgbGV0IHBsYXRmb3JtS2V5ID0gYCR7cHJvY2Vzcy5wbGF0Zm9ybX0gJHtvcy5hcmNoKCl9ICR7b3MuZW5kaWFubmVzcygpfWA7XG4gIGlmIChwbGF0Zm9ybUtleSBpbiBrbm93bldpbmRvd3NQYWNrYWdlcykge1xuICAgIHBrZyA9IGtub3duV2luZG93c1BhY2thZ2VzW3BsYXRmb3JtS2V5XTtcbiAgICBzdWJwYXRoID0gXCJlc2J1aWxkLmV4ZVwiO1xuICB9IGVsc2UgaWYgKHBsYXRmb3JtS2V5IGluIGtub3duVW5peGxpa2VQYWNrYWdlcykge1xuICAgIHBrZyA9IGtub3duVW5peGxpa2VQYWNrYWdlc1twbGF0Zm9ybUtleV07XG4gICAgc3VicGF0aCA9IFwiYmluL2VzYnVpbGRcIjtcbiAgfSBlbHNlIGlmIChwbGF0Zm9ybUtleSBpbiBrbm93bldlYkFzc2VtYmx5RmFsbGJhY2tQYWNrYWdlcykge1xuICAgIHBrZyA9IGtub3duV2ViQXNzZW1ibHlGYWxsYmFja1BhY2thZ2VzW3BsYXRmb3JtS2V5XTtcbiAgICBzdWJwYXRoID0gXCJiaW4vZXNidWlsZFwiO1xuICAgIGlzV0FTTSA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBwbGF0Zm9ybTogJHtwbGF0Zm9ybUtleX1gKTtcbiAgfVxuICByZXR1cm4geyBwa2csIHN1YnBhdGgsIGlzV0FTTSB9O1xufVxuZnVuY3Rpb24gcGtnRm9yU29tZU90aGVyUGxhdGZvcm0oKSB7XG4gIGNvbnN0IGxpYk1haW5KUyA9IHJlcXVpcmUucmVzb2x2ZShcImVzYnVpbGRcIik7XG4gIGNvbnN0IG5vZGVNb2R1bGVzRGlyZWN0b3J5ID0gcGF0aC5kaXJuYW1lKHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUobGliTWFpbkpTKSkpO1xuICBpZiAocGF0aC5iYXNlbmFtZShub2RlTW9kdWxlc0RpcmVjdG9yeSkgPT09IFwibm9kZV9tb2R1bGVzXCIpIHtcbiAgICBmb3IgKGNvbnN0IHVuaXhLZXkgaW4ga25vd25Vbml4bGlrZVBhY2thZ2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwa2cgPSBrbm93blVuaXhsaWtlUGFja2FnZXNbdW5peEtleV07XG4gICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihub2RlTW9kdWxlc0RpcmVjdG9yeSwgcGtnKSkpIHJldHVybiBwa2c7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB3aW5kb3dzS2V5IGluIGtub3duV2luZG93c1BhY2thZ2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwa2cgPSBrbm93bldpbmRvd3NQYWNrYWdlc1t3aW5kb3dzS2V5XTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKG5vZGVNb2R1bGVzRGlyZWN0b3J5LCBwa2cpKSkgcmV0dXJuIHBrZztcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIGRvd25sb2FkZWRCaW5QYXRoKHBrZywgc3VicGF0aCkge1xuICBjb25zdCBlc2J1aWxkTGliRGlyID0gcGF0aC5kaXJuYW1lKHJlcXVpcmUucmVzb2x2ZShcImVzYnVpbGRcIikpO1xuICByZXR1cm4gcGF0aC5qb2luKGVzYnVpbGRMaWJEaXIsIGBkb3dubG9hZGVkLSR7cGtnLnJlcGxhY2UoXCIvXCIsIFwiLVwiKX0tJHtwYXRoLmJhc2VuYW1lKHN1YnBhdGgpfWApO1xufVxuZnVuY3Rpb24gZ2VuZXJhdGVCaW5QYXRoKCkge1xuICBpZiAoaXNWYWxpZEJpbmFyeVBhdGgoRVNCVUlMRF9CSU5BUllfUEFUSCkpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoRVNCVUlMRF9CSU5BUllfUEFUSCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW2VzYnVpbGRdIElnbm9yaW5nIGJhZCBjb25maWd1cmF0aW9uOiBFU0JVSUxEX0JJTkFSWV9QQVRIPSR7RVNCVUlMRF9CSU5BUllfUEFUSH1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHsgYmluUGF0aDogRVNCVUlMRF9CSU5BUllfUEFUSCwgaXNXQVNNOiBmYWxzZSB9O1xuICAgIH1cbiAgfVxuICBjb25zdCB7IHBrZywgc3VicGF0aCwgaXNXQVNNIH0gPSBwa2dBbmRTdWJwYXRoRm9yQ3VycmVudFBsYXRmb3JtKCk7XG4gIGxldCBiaW5QYXRoO1xuICB0cnkge1xuICAgIGJpblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGtnfS8ke3N1YnBhdGh9YCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBiaW5QYXRoID0gZG93bmxvYWRlZEJpblBhdGgocGtnLCBzdWJwYXRoKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYmluUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcXVpcmUucmVzb2x2ZShwa2cpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IG90aGVyUGtnID0gcGtnRm9yU29tZU90aGVyUGxhdGZvcm0oKTtcbiAgICAgICAgaWYgKG90aGVyUGtnKSB7XG4gICAgICAgICAgbGV0IHN1Z2dlc3Rpb25zID0gYFxuU3BlY2lmaWNhbGx5IHRoZSBcIiR7b3RoZXJQa2d9XCIgcGFja2FnZSBpcyBwcmVzZW50IGJ1dCB0aGlzIHBsYXRmb3JtXG5uZWVkcyB0aGUgXCIke3BrZ31cIiBwYWNrYWdlIGluc3RlYWQuIFBlb3BsZSBvZnRlbiBnZXQgaW50byB0aGlzXG5zaXR1YXRpb24gYnkgaW5zdGFsbGluZyBlc2J1aWxkIG9uIFdpbmRvd3Mgb3IgbWFjT1MgYW5kIGNvcHlpbmcgXCJub2RlX21vZHVsZXNcIlxuaW50byBhIERvY2tlciBpbWFnZSB0aGF0IHJ1bnMgTGludXgsIG9yIGJ5IGNvcHlpbmcgXCJub2RlX21vZHVsZXNcIiBiZXR3ZWVuXG5XaW5kb3dzIGFuZCBXU0wgZW52aXJvbm1lbnRzLlxuXG5JZiB5b3UgYXJlIGluc3RhbGxpbmcgd2l0aCBucG0sIHlvdSBjYW4gdHJ5IG5vdCBjb3B5aW5nIHRoZSBcIm5vZGVfbW9kdWxlc1wiXG5kaXJlY3Rvcnkgd2hlbiB5b3UgY29weSB0aGUgZmlsZXMgb3ZlciwgYW5kIHJ1bm5pbmcgXCJucG0gY2lcIiBvciBcIm5wbSBpbnN0YWxsXCJcbm9uIHRoZSBkZXN0aW5hdGlvbiBwbGF0Zm9ybSBhZnRlciB0aGUgY29weS4gT3IgeW91IGNvdWxkIGNvbnNpZGVyIHVzaW5nIHlhcm5cbmluc3RlYWQgb2YgbnBtIHdoaWNoIGhhcyBidWlsdC1pbiBzdXBwb3J0IGZvciBpbnN0YWxsaW5nIGEgcGFja2FnZSBvbiBtdWx0aXBsZVxucGxhdGZvcm1zIHNpbXVsdGFuZW91c2x5LlxuXG5JZiB5b3UgYXJlIGluc3RhbGxpbmcgd2l0aCB5YXJuLCB5b3UgY2FuIHRyeSBsaXN0aW5nIGJvdGggdGhpcyBwbGF0Zm9ybSBhbmQgdGhlXG5vdGhlciBwbGF0Zm9ybSBpbiB5b3VyIFwiLnlhcm5yYy55bWxcIiBmaWxlIHVzaW5nIHRoZSBcInN1cHBvcnRlZEFyY2hpdGVjdHVyZXNcIlxuZmVhdHVyZTogaHR0cHM6Ly95YXJucGtnLmNvbS9jb25maWd1cmF0aW9uL3lhcm5yYy8jc3VwcG9ydGVkQXJjaGl0ZWN0dXJlc1xuS2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBtZWFucyBtdWx0aXBsZSBjb3BpZXMgb2YgZXNidWlsZCB3aWxsIGJlIHByZXNlbnQuXG5gO1xuICAgICAgICAgIGlmIChwa2cgPT09IHBhY2thZ2VEYXJ3aW5feDY0ICYmIG90aGVyUGtnID09PSBwYWNrYWdlRGFyd2luX2FybTY0IHx8IHBrZyA9PT0gcGFja2FnZURhcndpbl9hcm02NCAmJiBvdGhlclBrZyA9PT0gcGFja2FnZURhcndpbl94NjQpIHtcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zID0gYFxuU3BlY2lmaWNhbGx5IHRoZSBcIiR7b3RoZXJQa2d9XCIgcGFja2FnZSBpcyBwcmVzZW50IGJ1dCB0aGlzIHBsYXRmb3JtXG5uZWVkcyB0aGUgXCIke3BrZ31cIiBwYWNrYWdlIGluc3RlYWQuIFBlb3BsZSBvZnRlbiBnZXQgaW50byB0aGlzXG5zaXR1YXRpb24gYnkgaW5zdGFsbGluZyBlc2J1aWxkIHdpdGggbnBtIHJ1bm5pbmcgaW5zaWRlIG9mIFJvc2V0dGEgMiBhbmQgdGhlblxudHJ5aW5nIHRvIHVzZSBpdCB3aXRoIG5vZGUgcnVubmluZyBvdXRzaWRlIG9mIFJvc2V0dGEgMiwgb3IgdmljZSB2ZXJzYSAoUm9zZXR0YVxuMiBpcyBBcHBsZSdzIG9uLXRoZS1mbHkgeDg2XzY0LXRvLWFybTY0IHRyYW5zbGF0aW9uIHNlcnZpY2UpLlxuXG5JZiB5b3UgYXJlIGluc3RhbGxpbmcgd2l0aCBucG0sIHlvdSBjYW4gdHJ5IGVuc3VyaW5nIHRoYXQgYm90aCBucG0gYW5kIG5vZGUgYXJlXG5ub3QgcnVubmluZyB1bmRlciBSb3NldHRhIDIgYW5kIHRoZW4gcmVpbnN0YWxsaW5nIGVzYnVpbGQuIFRoaXMgbGlrZWx5IGludm9sdmVzXG5jaGFuZ2luZyBob3cgeW91IGluc3RhbGxlZCBucG0gYW5kL29yIG5vZGUuIEZvciBleGFtcGxlLCBpbnN0YWxsaW5nIG5vZGUgd2l0aFxudGhlIHVuaXZlcnNhbCBpbnN0YWxsZXIgaGVyZSBzaG91bGQgd29yazogaHR0cHM6Ly9ub2RlanMub3JnL2VuL2Rvd25sb2FkLy4gT3JcbnlvdSBjb3VsZCBjb25zaWRlciB1c2luZyB5YXJuIGluc3RlYWQgb2YgbnBtIHdoaWNoIGhhcyBidWlsdC1pbiBzdXBwb3J0IGZvclxuaW5zdGFsbGluZyBhIHBhY2thZ2Ugb24gbXVsdGlwbGUgcGxhdGZvcm1zIHNpbXVsdGFuZW91c2x5LlxuXG5JZiB5b3UgYXJlIGluc3RhbGxpbmcgd2l0aCB5YXJuLCB5b3UgY2FuIHRyeSBsaXN0aW5nIGJvdGggXCJhcm02NFwiIGFuZCBcIng2NFwiXG5pbiB5b3VyIFwiLnlhcm5yYy55bWxcIiBmaWxlIHVzaW5nIHRoZSBcInN1cHBvcnRlZEFyY2hpdGVjdHVyZXNcIiBmZWF0dXJlOlxuaHR0cHM6Ly95YXJucGtnLmNvbS9jb25maWd1cmF0aW9uL3lhcm5yYy8jc3VwcG9ydGVkQXJjaGl0ZWN0dXJlc1xuS2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBtZWFucyBtdWx0aXBsZSBjb3BpZXMgb2YgZXNidWlsZCB3aWxsIGJlIHByZXNlbnQuXG5gO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuWW91IGluc3RhbGxlZCBlc2J1aWxkIGZvciBhbm90aGVyIHBsYXRmb3JtIHRoYW4gdGhlIG9uZSB5b3UncmUgY3VycmVudGx5IHVzaW5nLlxuVGhpcyB3b24ndCB3b3JrIGJlY2F1c2UgZXNidWlsZCBpcyB3cml0dGVuIHdpdGggbmF0aXZlIGNvZGUgYW5kIG5lZWRzIHRvXG5pbnN0YWxsIGEgcGxhdGZvcm0tc3BlY2lmaWMgYmluYXJ5IGV4ZWN1dGFibGUuXG4ke3N1Z2dlc3Rpb25zfVxuQW5vdGhlciBhbHRlcm5hdGl2ZSBpcyB0byB1c2UgdGhlIFwiZXNidWlsZC13YXNtXCIgcGFja2FnZSBpbnN0ZWFkLCB3aGljaCB3b3Jrc1xudGhlIHNhbWUgd2F5IG9uIGFsbCBwbGF0Zm9ybXMuIEJ1dCBpdCBjb21lcyB3aXRoIGEgaGVhdnkgcGVyZm9ybWFuY2UgY29zdCBhbmRcbmNhbiBzb21ldGltZXMgYmUgMTB4IHNsb3dlciB0aGFuIHRoZSBcImVzYnVpbGRcIiBwYWNrYWdlLCBzbyB5b3UgbWF5IGFsc28gbm90XG53YW50IHRvIGRvIHRoYXQuXG5gKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwYWNrYWdlIFwiJHtwa2d9XCIgY291bGQgbm90IGJlIGZvdW5kLCBhbmQgaXMgbmVlZGVkIGJ5IGVzYnVpbGQuXG5cbklmIHlvdSBhcmUgaW5zdGFsbGluZyBlc2J1aWxkIHdpdGggbnBtLCBtYWtlIHN1cmUgdGhhdCB5b3UgZG9uJ3Qgc3BlY2lmeSB0aGVcblwiLS1uby1vcHRpb25hbFwiIG9yIFwiLS1vbWl0PW9wdGlvbmFsXCIgZmxhZ3MuIFRoZSBcIm9wdGlvbmFsRGVwZW5kZW5jaWVzXCIgZmVhdHVyZVxub2YgXCJwYWNrYWdlLmpzb25cIiBpcyB1c2VkIGJ5IGVzYnVpbGQgdG8gaW5zdGFsbCB0aGUgY29ycmVjdCBiaW5hcnkgZXhlY3V0YWJsZVxuZm9yIHlvdXIgY3VycmVudCBwbGF0Zm9ybS5gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG4gIGlmICgvXFwuemlwXFwvLy50ZXN0KGJpblBhdGgpKSB7XG4gICAgbGV0IHBucGFwaTtcbiAgICB0cnkge1xuICAgICAgcG5wYXBpID0gcmVxdWlyZShcInBucGFwaVwiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgfVxuICAgIGlmIChwbnBhcGkpIHtcbiAgICAgIGNvbnN0IHJvb3QgPSBwbnBhcGkuZ2V0UGFja2FnZUluZm9ybWF0aW9uKHBucGFwaS50b3BMZXZlbCkucGFja2FnZUxvY2F0aW9uO1xuICAgICAgY29uc3QgYmluVGFyZ2V0UGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgcm9vdCxcbiAgICAgICAgXCJub2RlX21vZHVsZXNcIixcbiAgICAgICAgXCIuY2FjaGVcIixcbiAgICAgICAgXCJlc2J1aWxkXCIsXG4gICAgICAgIGBwbnBhcGktJHtwa2cucmVwbGFjZShcIi9cIiwgXCItXCIpfS0ke1wiMC4yNS4xMlwifS0ke3BhdGguYmFzZW5hbWUoc3VicGF0aCl9YFxuICAgICAgKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhiaW5UYXJnZXRQYXRoKSkge1xuICAgICAgICBmcy5ta2RpclN5bmMocGF0aC5kaXJuYW1lKGJpblRhcmdldFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgZnMuY29weUZpbGVTeW5jKGJpblBhdGgsIGJpblRhcmdldFBhdGgpO1xuICAgICAgICBmcy5jaG1vZFN5bmMoYmluVGFyZ2V0UGF0aCwgNDkzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGJpblBhdGg6IGJpblRhcmdldFBhdGgsIGlzV0FTTSB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBiaW5QYXRoLCBpc1dBU00gfTtcbn1cblxuLy8gbGliL25wbS9ub2RlLnRzXG52YXIgY2hpbGRfcHJvY2VzcyA9IHJlcXVpcmUoXCJjaGlsZF9wcm9jZXNzXCIpO1xudmFyIGNyeXB0byA9IHJlcXVpcmUoXCJjcnlwdG9cIik7XG52YXIgcGF0aDIgPSByZXF1aXJlKFwicGF0aFwiKTtcbnZhciBmczIgPSByZXF1aXJlKFwiZnNcIik7XG52YXIgb3MyID0gcmVxdWlyZShcIm9zXCIpO1xudmFyIHR0eSA9IHJlcXVpcmUoXCJ0dHlcIik7XG52YXIgd29ya2VyX3RocmVhZHM7XG5pZiAocHJvY2Vzcy5lbnYuRVNCVUlMRF9XT1JLRVJfVEhSRUFEUyAhPT0gXCIwXCIpIHtcbiAgdHJ5IHtcbiAgICB3b3JrZXJfdGhyZWFkcyA9IHJlcXVpcmUoXCJ3b3JrZXJfdGhyZWFkc1wiKTtcbiAgfSBjYXRjaCB7XG4gIH1cbiAgbGV0IFttYWpvciwgbWlub3JdID0gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KFwiLlwiKTtcbiAgaWYgKFxuICAgIC8vIDx2MTIuMTcuMCBkb2VzIG5vdCB3b3JrXG4gICAgK21ham9yIDwgMTIgfHwgK21ham9yID09PSAxMiAmJiArbWlub3IgPCAxNyB8fCArbWFqb3IgPT09IDEzICYmICttaW5vciA8IDEzXG4gICkge1xuICAgIHdvcmtlcl90aHJlYWRzID0gdm9pZCAwO1xuICB9XG59XG52YXIgX2E7XG52YXIgaXNJbnRlcm5hbFdvcmtlclRocmVhZCA9ICgoX2EgPSB3b3JrZXJfdGhyZWFkcyA9PSBudWxsID8gdm9pZCAwIDogd29ya2VyX3RocmVhZHMud29ya2VyRGF0YSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLmVzYnVpbGRWZXJzaW9uKSA9PT0gXCIwLjI1LjEyXCI7XG52YXIgZXNidWlsZENvbW1hbmRBbmRBcmdzID0gKCkgPT4ge1xuICBpZiAoKCFFU0JVSUxEX0JJTkFSWV9QQVRIIHx8IGZhbHNlKSAmJiAocGF0aDIuYmFzZW5hbWUoX19maWxlbmFtZSkgIT09IFwibWFpbi5qc1wiIHx8IHBhdGgyLmJhc2VuYW1lKF9fZGlybmFtZSkgIT09IFwibGliXCIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBlc2J1aWxkIEphdmFTY3JpcHQgQVBJIGNhbm5vdCBiZSBidW5kbGVkLiBQbGVhc2UgbWFyayB0aGUgXCJlc2J1aWxkXCIgcGFja2FnZSBhcyBleHRlcm5hbCBzbyBpdCdzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYnVuZGxlLlxuXG5Nb3JlIGluZm9ybWF0aW9uOiBUaGUgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGZvciBlc2J1aWxkJ3MgSmF2YVNjcmlwdCBBUEkgKCR7X19maWxlbmFtZX0pIGRvZXMgbm90IGFwcGVhciB0byBiZSBpbnNpZGUgdGhlIGVzYnVpbGQgcGFja2FnZSBvbiB0aGUgZmlsZSBzeXN0ZW0sIHdoaWNoIHVzdWFsbHkgbWVhbnMgdGhhdCB0aGUgZXNidWlsZCBwYWNrYWdlIHdhcyBidW5kbGVkIGludG8gYW5vdGhlciBmaWxlLiBUaGlzIGlzIHByb2JsZW1hdGljIGJlY2F1c2UgdGhlIEFQSSBuZWVkcyB0byBydW4gYSBiaW5hcnkgZXhlY3V0YWJsZSBpbnNpZGUgdGhlIGVzYnVpbGQgcGFja2FnZSB3aGljaCBpcyBsb2NhdGVkIHVzaW5nIGEgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBBUEkgY29kZSB0byB0aGUgZXhlY3V0YWJsZS4gSWYgdGhlIGVzYnVpbGQgcGFja2FnZSBpcyBidW5kbGVkLCB0aGUgcmVsYXRpdmUgcGF0aCB3aWxsIGJlIGluY29ycmVjdCBhbmQgdGhlIGV4ZWN1dGFibGUgd29uJ3QgYmUgZm91bmQuYFxuICAgICk7XG4gIH1cbiAgaWYgKGZhbHNlKSB7XG4gICAgcmV0dXJuIFtcIm5vZGVcIiwgW3BhdGgyLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwiYmluXCIsIFwiZXNidWlsZFwiKV1dO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHsgYmluUGF0aCwgaXNXQVNNIH0gPSBnZW5lcmF0ZUJpblBhdGgoKTtcbiAgICBpZiAoaXNXQVNNKSB7XG4gICAgICByZXR1cm4gW1wibm9kZVwiLCBbYmluUGF0aF1dO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW2JpblBhdGgsIFtdXTtcbiAgICB9XG4gIH1cbn07XG52YXIgaXNUVFkgPSAoKSA9PiB0dHkuaXNhdHR5KDIpO1xudmFyIGZzU3luYyA9IHtcbiAgcmVhZEZpbGUodGVtcEZpbGUsIGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50cyA9IGZzMi5yZWFkRmlsZVN5bmModGVtcEZpbGUsIFwidXRmOFwiKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZzMi51bmxpbmtTeW5jKHRlbXBGaWxlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgfVxuICAgICAgY2FsbGJhY2sobnVsbCwgY29udGVudHMpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY2FsbGJhY2soZXJyLCBudWxsKTtcbiAgICB9XG4gIH0sXG4gIHdyaXRlRmlsZShjb250ZW50cywgY2FsbGJhY2spIHtcbiAgICB0cnkge1xuICAgICAgbGV0IHRlbXBGaWxlID0gcmFuZG9tRmlsZU5hbWUoKTtcbiAgICAgIGZzMi53cml0ZUZpbGVTeW5jKHRlbXBGaWxlLCBjb250ZW50cyk7XG4gICAgICBjYWxsYmFjayh0ZW1wRmlsZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjYWxsYmFjayhudWxsKTtcbiAgICB9XG4gIH1cbn07XG52YXIgZnNBc3luYyA9IHtcbiAgcmVhZEZpbGUodGVtcEZpbGUsIGNhbGxiYWNrKSB7XG4gICAgdHJ5IHtcbiAgICAgIGZzMi5yZWFkRmlsZSh0ZW1wRmlsZSwgXCJ1dGY4XCIsIChlcnIsIGNvbnRlbnRzKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZnMyLnVubGluayh0ZW1wRmlsZSwgKCkgPT4gY2FsbGJhY2soZXJyLCBjb250ZW50cykpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnIsIGNvbnRlbnRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjYWxsYmFjayhlcnIsIG51bGwpO1xuICAgIH1cbiAgfSxcbiAgd3JpdGVGaWxlKGNvbnRlbnRzLCBjYWxsYmFjaykge1xuICAgIHRyeSB7XG4gICAgICBsZXQgdGVtcEZpbGUgPSByYW5kb21GaWxlTmFtZSgpO1xuICAgICAgZnMyLndyaXRlRmlsZSh0ZW1wRmlsZSwgY29udGVudHMsIChlcnIpID0+IGVyciAhPT0gbnVsbCA/IGNhbGxiYWNrKG51bGwpIDogY2FsbGJhY2sodGVtcEZpbGUpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNhbGxiYWNrKG51bGwpO1xuICAgIH1cbiAgfVxufTtcbnZhciB2ZXJzaW9uID0gXCIwLjI1LjEyXCI7XG52YXIgYnVpbGQgPSAob3B0aW9ucykgPT4gZW5zdXJlU2VydmljZUlzUnVubmluZygpLmJ1aWxkKG9wdGlvbnMpO1xudmFyIGNvbnRleHQgPSAoYnVpbGRPcHRpb25zKSA9PiBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCkuY29udGV4dChidWlsZE9wdGlvbnMpO1xudmFyIHRyYW5zZm9ybSA9IChpbnB1dCwgb3B0aW9ucykgPT4gZW5zdXJlU2VydmljZUlzUnVubmluZygpLnRyYW5zZm9ybShpbnB1dCwgb3B0aW9ucyk7XG52YXIgZm9ybWF0TWVzc2FnZXMgPSAobWVzc2FnZXMsIG9wdGlvbnMpID0+IGVuc3VyZVNlcnZpY2VJc1J1bm5pbmcoKS5mb3JtYXRNZXNzYWdlcyhtZXNzYWdlcywgb3B0aW9ucyk7XG52YXIgYW5hbHl6ZU1ldGFmaWxlID0gKG1lc3NhZ2VzLCBvcHRpb25zKSA9PiBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCkuYW5hbHl6ZU1ldGFmaWxlKG1lc3NhZ2VzLCBvcHRpb25zKTtcbnZhciBidWlsZFN5bmMgPSAob3B0aW9ucykgPT4ge1xuICBpZiAod29ya2VyX3RocmVhZHMgJiYgIWlzSW50ZXJuYWxXb3JrZXJUaHJlYWQpIHtcbiAgICBpZiAoIXdvcmtlclRocmVhZFNlcnZpY2UpIHdvcmtlclRocmVhZFNlcnZpY2UgPSBzdGFydFdvcmtlclRocmVhZFNlcnZpY2Uod29ya2VyX3RocmVhZHMpO1xuICAgIHJldHVybiB3b3JrZXJUaHJlYWRTZXJ2aWNlLmJ1aWxkU3luYyhvcHRpb25zKTtcbiAgfVxuICBsZXQgcmVzdWx0O1xuICBydW5TZXJ2aWNlU3luYygoc2VydmljZSkgPT4gc2VydmljZS5idWlsZE9yQ29udGV4dCh7XG4gICAgY2FsbE5hbWU6IFwiYnVpbGRTeW5jXCIsXG4gICAgcmVmczogbnVsbCxcbiAgICBvcHRpb25zLFxuICAgIGlzVFRZOiBpc1RUWSgpLFxuICAgIGRlZmF1bHRXRCxcbiAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiB7XG4gICAgICBpZiAoZXJyKSB0aHJvdyBlcnI7XG4gICAgICByZXN1bHQgPSByZXM7XG4gICAgfVxuICB9KSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIHRyYW5zZm9ybVN5bmMgPSAoaW5wdXQsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHdvcmtlcl90aHJlYWRzICYmICFpc0ludGVybmFsV29ya2VyVGhyZWFkKSB7XG4gICAgaWYgKCF3b3JrZXJUaHJlYWRTZXJ2aWNlKSB3b3JrZXJUaHJlYWRTZXJ2aWNlID0gc3RhcnRXb3JrZXJUaHJlYWRTZXJ2aWNlKHdvcmtlcl90aHJlYWRzKTtcbiAgICByZXR1cm4gd29ya2VyVGhyZWFkU2VydmljZS50cmFuc2Zvcm1TeW5jKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICBsZXQgcmVzdWx0O1xuICBydW5TZXJ2aWNlU3luYygoc2VydmljZSkgPT4gc2VydmljZS50cmFuc2Zvcm0oe1xuICAgIGNhbGxOYW1lOiBcInRyYW5zZm9ybVN5bmNcIixcbiAgICByZWZzOiBudWxsLFxuICAgIGlucHV0LFxuICAgIG9wdGlvbnM6IG9wdGlvbnMgfHwge30sXG4gICAgaXNUVFk6IGlzVFRZKCksXG4gICAgZnM6IGZzU3luYyxcbiAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiB7XG4gICAgICBpZiAoZXJyKSB0aHJvdyBlcnI7XG4gICAgICByZXN1bHQgPSByZXM7XG4gICAgfVxuICB9KSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIGZvcm1hdE1lc3NhZ2VzU3luYyA9IChtZXNzYWdlcywgb3B0aW9ucykgPT4ge1xuICBpZiAod29ya2VyX3RocmVhZHMgJiYgIWlzSW50ZXJuYWxXb3JrZXJUaHJlYWQpIHtcbiAgICBpZiAoIXdvcmtlclRocmVhZFNlcnZpY2UpIHdvcmtlclRocmVhZFNlcnZpY2UgPSBzdGFydFdvcmtlclRocmVhZFNlcnZpY2Uod29ya2VyX3RocmVhZHMpO1xuICAgIHJldHVybiB3b3JrZXJUaHJlYWRTZXJ2aWNlLmZvcm1hdE1lc3NhZ2VzU3luYyhtZXNzYWdlcywgb3B0aW9ucyk7XG4gIH1cbiAgbGV0IHJlc3VsdDtcbiAgcnVuU2VydmljZVN5bmMoKHNlcnZpY2UpID0+IHNlcnZpY2UuZm9ybWF0TWVzc2FnZXMoe1xuICAgIGNhbGxOYW1lOiBcImZvcm1hdE1lc3NhZ2VzU3luY1wiLFxuICAgIHJlZnM6IG51bGwsXG4gICAgbWVzc2FnZXMsXG4gICAgb3B0aW9ucyxcbiAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiB7XG4gICAgICBpZiAoZXJyKSB0aHJvdyBlcnI7XG4gICAgICByZXN1bHQgPSByZXM7XG4gICAgfVxuICB9KSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIGFuYWx5emVNZXRhZmlsZVN5bmMgPSAobWV0YWZpbGUsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHdvcmtlcl90aHJlYWRzICYmICFpc0ludGVybmFsV29ya2VyVGhyZWFkKSB7XG4gICAgaWYgKCF3b3JrZXJUaHJlYWRTZXJ2aWNlKSB3b3JrZXJUaHJlYWRTZXJ2aWNlID0gc3RhcnRXb3JrZXJUaHJlYWRTZXJ2aWNlKHdvcmtlcl90aHJlYWRzKTtcbiAgICByZXR1cm4gd29ya2VyVGhyZWFkU2VydmljZS5hbmFseXplTWV0YWZpbGVTeW5jKG1ldGFmaWxlLCBvcHRpb25zKTtcbiAgfVxuICBsZXQgcmVzdWx0O1xuICBydW5TZXJ2aWNlU3luYygoc2VydmljZSkgPT4gc2VydmljZS5hbmFseXplTWV0YWZpbGUoe1xuICAgIGNhbGxOYW1lOiBcImFuYWx5emVNZXRhZmlsZVN5bmNcIixcbiAgICByZWZzOiBudWxsLFxuICAgIG1ldGFmaWxlOiB0eXBlb2YgbWV0YWZpbGUgPT09IFwic3RyaW5nXCIgPyBtZXRhZmlsZSA6IEpTT04uc3RyaW5naWZ5KG1ldGFmaWxlKSxcbiAgICBvcHRpb25zLFxuICAgIGNhbGxiYWNrOiAoZXJyLCByZXMpID0+IHtcbiAgICAgIGlmIChlcnIpIHRocm93IGVycjtcbiAgICAgIHJlc3VsdCA9IHJlcztcbiAgICB9XG4gIH0pKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgc3RvcCA9ICgpID0+IHtcbiAgaWYgKHN0b3BTZXJ2aWNlKSBzdG9wU2VydmljZSgpO1xuICBpZiAod29ya2VyVGhyZWFkU2VydmljZSkgd29ya2VyVGhyZWFkU2VydmljZS5zdG9wKCk7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn07XG52YXIgaW5pdGlhbGl6ZVdhc0NhbGxlZCA9IGZhbHNlO1xudmFyIGluaXRpYWxpemUgPSAob3B0aW9ucykgPT4ge1xuICBvcHRpb25zID0gdmFsaWRhdGVJbml0aWFsaXplT3B0aW9ucyhvcHRpb25zIHx8IHt9KTtcbiAgaWYgKG9wdGlvbnMud2FzbVVSTCkgdGhyb3cgbmV3IEVycm9yKGBUaGUgXCJ3YXNtVVJMXCIgb3B0aW9uIG9ubHkgd29ya3MgaW4gdGhlIGJyb3dzZXJgKTtcbiAgaWYgKG9wdGlvbnMud2FzbU1vZHVsZSkgdGhyb3cgbmV3IEVycm9yKGBUaGUgXCJ3YXNtTW9kdWxlXCIgb3B0aW9uIG9ubHkgd29ya3MgaW4gdGhlIGJyb3dzZXJgKTtcbiAgaWYgKG9wdGlvbnMud29ya2VyKSB0aHJvdyBuZXcgRXJyb3IoYFRoZSBcIndvcmtlclwiIG9wdGlvbiBvbmx5IHdvcmtzIGluIHRoZSBicm93c2VyYCk7XG4gIGlmIChpbml0aWFsaXplV2FzQ2FsbGVkKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjYWxsIFwiaW5pdGlhbGl6ZVwiIG1vcmUgdGhhbiBvbmNlJyk7XG4gIGVuc3VyZVNlcnZpY2VJc1J1bm5pbmcoKTtcbiAgaW5pdGlhbGl6ZVdhc0NhbGxlZCA9IHRydWU7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn07XG52YXIgZGVmYXVsdFdEID0gcHJvY2Vzcy5jd2QoKTtcbnZhciBsb25nTGl2ZWRTZXJ2aWNlO1xudmFyIHN0b3BTZXJ2aWNlO1xudmFyIGVuc3VyZVNlcnZpY2VJc1J1bm5pbmcgPSAoKSA9PiB7XG4gIGlmIChsb25nTGl2ZWRTZXJ2aWNlKSByZXR1cm4gbG9uZ0xpdmVkU2VydmljZTtcbiAgbGV0IFtjb21tYW5kLCBhcmdzXSA9IGVzYnVpbGRDb21tYW5kQW5kQXJncygpO1xuICBsZXQgY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsIGFyZ3MuY29uY2F0KGAtLXNlcnZpY2U9JHtcIjAuMjUuMTJcIn1gLCBcIi0tcGluZ1wiKSwge1xuICAgIHdpbmRvd3NIaWRlOiB0cnVlLFxuICAgIHN0ZGlvOiBbXCJwaXBlXCIsIFwicGlwZVwiLCBcImluaGVyaXRcIl0sXG4gICAgY3dkOiBkZWZhdWx0V0RcbiAgfSk7XG4gIGxldCB7IHJlYWRGcm9tU3Rkb3V0LCBhZnRlckNsb3NlLCBzZXJ2aWNlIH0gPSBjcmVhdGVDaGFubmVsKHtcbiAgICB3cml0ZVRvU3RkaW4oYnl0ZXMpIHtcbiAgICAgIGNoaWxkLnN0ZGluLndyaXRlKGJ5dGVzLCAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIGFmdGVyQ2xvc2UoZXJyKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcmVhZEZpbGVTeW5jOiBmczIucmVhZEZpbGVTeW5jLFxuICAgIGlzU3luYzogZmFsc2UsXG4gICAgaGFzRlM6IHRydWUsXG4gICAgZXNidWlsZDogbm9kZV9leHBvcnRzXG4gIH0pO1xuICBjaGlsZC5zdGRpbi5vbihcImVycm9yXCIsIGFmdGVyQ2xvc2UpO1xuICBjaGlsZC5vbihcImVycm9yXCIsIGFmdGVyQ2xvc2UpO1xuICBjb25zdCBzdGRpbiA9IGNoaWxkLnN0ZGluO1xuICBjb25zdCBzdGRvdXQgPSBjaGlsZC5zdGRvdXQ7XG4gIHN0ZG91dC5vbihcImRhdGFcIiwgcmVhZEZyb21TdGRvdXQpO1xuICBzdGRvdXQub24oXCJlbmRcIiwgYWZ0ZXJDbG9zZSk7XG4gIHN0b3BTZXJ2aWNlID0gKCkgPT4ge1xuICAgIHN0ZGluLmRlc3Ryb3koKTtcbiAgICBzdGRvdXQuZGVzdHJveSgpO1xuICAgIGNoaWxkLmtpbGwoKTtcbiAgICBpbml0aWFsaXplV2FzQ2FsbGVkID0gZmFsc2U7XG4gICAgbG9uZ0xpdmVkU2VydmljZSA9IHZvaWQgMDtcbiAgICBzdG9wU2VydmljZSA9IHZvaWQgMDtcbiAgfTtcbiAgbGV0IHJlZkNvdW50ID0gMDtcbiAgY2hpbGQudW5yZWYoKTtcbiAgaWYgKHN0ZGluLnVucmVmKSB7XG4gICAgc3RkaW4udW5yZWYoKTtcbiAgfVxuICBpZiAoc3Rkb3V0LnVucmVmKSB7XG4gICAgc3Rkb3V0LnVucmVmKCk7XG4gIH1cbiAgY29uc3QgcmVmcyA9IHtcbiAgICByZWYoKSB7XG4gICAgICBpZiAoKytyZWZDb3VudCA9PT0gMSkgY2hpbGQucmVmKCk7XG4gICAgfSxcbiAgICB1bnJlZigpIHtcbiAgICAgIGlmICgtLXJlZkNvdW50ID09PSAwKSBjaGlsZC51bnJlZigpO1xuICAgIH1cbiAgfTtcbiAgbG9uZ0xpdmVkU2VydmljZSA9IHtcbiAgICBidWlsZDogKG9wdGlvbnMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNlcnZpY2UuYnVpbGRPckNvbnRleHQoe1xuICAgICAgICBjYWxsTmFtZTogXCJidWlsZFwiLFxuICAgICAgICByZWZzLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBpc1RUWTogaXNUVFkoKSxcbiAgICAgICAgZGVmYXVsdFdELFxuICAgICAgICBjYWxsYmFjazogKGVyciwgcmVzKSA9PiBlcnIgPyByZWplY3QoZXJyKSA6IHJlc29sdmUocmVzKVxuICAgICAgfSk7XG4gICAgfSksXG4gICAgY29udGV4dDogKG9wdGlvbnMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHNlcnZpY2UuYnVpbGRPckNvbnRleHQoe1xuICAgICAgY2FsbE5hbWU6IFwiY29udGV4dFwiLFxuICAgICAgcmVmcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBpc1RUWTogaXNUVFkoKSxcbiAgICAgIGRlZmF1bHRXRCxcbiAgICAgIGNhbGxiYWNrOiAoZXJyLCByZXMpID0+IGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShyZXMpXG4gICAgfSkpLFxuICAgIHRyYW5zZm9ybTogKGlucHV0LCBvcHRpb25zKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBzZXJ2aWNlLnRyYW5zZm9ybSh7XG4gICAgICBjYWxsTmFtZTogXCJ0cmFuc2Zvcm1cIixcbiAgICAgIHJlZnMsXG4gICAgICBpbnB1dCxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMgfHwge30sXG4gICAgICBpc1RUWTogaXNUVFkoKSxcbiAgICAgIGZzOiBmc0FzeW5jLFxuICAgICAgY2FsbGJhY2s6IChlcnIsIHJlcykgPT4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlcylcbiAgICB9KSksXG4gICAgZm9ybWF0TWVzc2FnZXM6IChtZXNzYWdlcywgb3B0aW9ucykgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc2VydmljZS5mb3JtYXRNZXNzYWdlcyh7XG4gICAgICBjYWxsTmFtZTogXCJmb3JtYXRNZXNzYWdlc1wiLFxuICAgICAgcmVmcyxcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGNhbGxiYWNrOiAoZXJyLCByZXMpID0+IGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShyZXMpXG4gICAgfSkpLFxuICAgIGFuYWx5emVNZXRhZmlsZTogKG1ldGFmaWxlLCBvcHRpb25zKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBzZXJ2aWNlLmFuYWx5emVNZXRhZmlsZSh7XG4gICAgICBjYWxsTmFtZTogXCJhbmFseXplTWV0YWZpbGVcIixcbiAgICAgIHJlZnMsXG4gICAgICBtZXRhZmlsZTogdHlwZW9mIG1ldGFmaWxlID09PSBcInN0cmluZ1wiID8gbWV0YWZpbGUgOiBKU09OLnN0cmluZ2lmeShtZXRhZmlsZSksXG4gICAgICBvcHRpb25zLFxuICAgICAgY2FsbGJhY2s6IChlcnIsIHJlcykgPT4gZXJyID8gcmVqZWN0KGVycikgOiByZXNvbHZlKHJlcylcbiAgICB9KSlcbiAgfTtcbiAgcmV0dXJuIGxvbmdMaXZlZFNlcnZpY2U7XG59O1xudmFyIHJ1blNlcnZpY2VTeW5jID0gKGNhbGxiYWNrKSA9PiB7XG4gIGxldCBbY29tbWFuZCwgYXJnc10gPSBlc2J1aWxkQ29tbWFuZEFuZEFyZ3MoKTtcbiAgbGV0IHN0ZGluID0gbmV3IFVpbnQ4QXJyYXkoKTtcbiAgbGV0IHsgcmVhZEZyb21TdGRvdXQsIGFmdGVyQ2xvc2UsIHNlcnZpY2UgfSA9IGNyZWF0ZUNoYW5uZWwoe1xuICAgIHdyaXRlVG9TdGRpbihieXRlcykge1xuICAgICAgaWYgKHN0ZGluLmxlbmd0aCAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKFwiTXVzdCBydW4gYXQgbW9zdCBvbmUgY29tbWFuZFwiKTtcbiAgICAgIHN0ZGluID0gYnl0ZXM7XG4gICAgfSxcbiAgICBpc1N5bmM6IHRydWUsXG4gICAgaGFzRlM6IHRydWUsXG4gICAgZXNidWlsZDogbm9kZV9leHBvcnRzXG4gIH0pO1xuICBjYWxsYmFjayhzZXJ2aWNlKTtcbiAgbGV0IHN0ZG91dCA9IGNoaWxkX3Byb2Nlc3MuZXhlY0ZpbGVTeW5jKGNvbW1hbmQsIGFyZ3MuY29uY2F0KGAtLXNlcnZpY2U9JHtcIjAuMjUuMTJcIn1gKSwge1xuICAgIGN3ZDogZGVmYXVsdFdELFxuICAgIHdpbmRvd3NIaWRlOiB0cnVlLFxuICAgIGlucHV0OiBzdGRpbixcbiAgICAvLyBXZSBkb24ndCBrbm93IGhvdyBsYXJnZSB0aGUgb3V0cHV0IGNvdWxkIGJlLiBJZiBpdCdzIHRvbyBsYXJnZSwgdGhlXG4gICAgLy8gY29tbWFuZCB3aWxsIGZhaWwgd2l0aCBFTk9CVUZTLiBSZXNlcnZlIDE2bWIgZm9yIG5vdyBzaW5jZSB0aGF0IGZlZWxzXG4gICAgLy8gbGlrZSBpdCBzaG91bGQgYmUgZW5vdWdoLiBBbHNvIGFsbG93IG92ZXJyaWRpbmcgdGhpcyB3aXRoIGFuIGVudmlyb25tZW50XG4gICAgLy8gdmFyaWFibGUuXG4gICAgbWF4QnVmZmVyOiArcHJvY2Vzcy5lbnYuRVNCVUlMRF9NQVhfQlVGRkVSIHx8IDE2ICogMTAyNCAqIDEwMjRcbiAgfSk7XG4gIHJlYWRGcm9tU3Rkb3V0KHN0ZG91dCk7XG4gIGFmdGVyQ2xvc2UobnVsbCk7XG59O1xudmFyIHJhbmRvbUZpbGVOYW1lID0gKCkgPT4ge1xuICByZXR1cm4gcGF0aDIuam9pbihvczIudG1wZGlyKCksIGBlc2J1aWxkLSR7Y3J5cHRvLnJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZyhcImhleFwiKX1gKTtcbn07XG52YXIgd29ya2VyVGhyZWFkU2VydmljZSA9IG51bGw7XG52YXIgc3RhcnRXb3JrZXJUaHJlYWRTZXJ2aWNlID0gKHdvcmtlcl90aHJlYWRzMikgPT4ge1xuICBsZXQgeyBwb3J0MTogbWFpblBvcnQsIHBvcnQyOiB3b3JrZXJQb3J0IH0gPSBuZXcgd29ya2VyX3RocmVhZHMyLk1lc3NhZ2VDaGFubmVsKCk7XG4gIGxldCB3b3JrZXIgPSBuZXcgd29ya2VyX3RocmVhZHMyLldvcmtlcihfX2ZpbGVuYW1lLCB7XG4gICAgd29ya2VyRGF0YTogeyB3b3JrZXJQb3J0LCBkZWZhdWx0V0QsIGVzYnVpbGRWZXJzaW9uOiBcIjAuMjUuMTJcIiB9LFxuICAgIHRyYW5zZmVyTGlzdDogW3dvcmtlclBvcnRdLFxuICAgIC8vIEZyb20gbm9kZSdzIGRvY3VtZW50YXRpb246IGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvd29ya2VyX3RocmVhZHMuaHRtbFxuICAgIC8vXG4gICAgLy8gICBUYWtlIGNhcmUgd2hlbiBsYXVuY2hpbmcgd29ya2VyIHRocmVhZHMgZnJvbSBwcmVsb2FkIHNjcmlwdHMgKHNjcmlwdHMgbG9hZGVkXG4gICAgLy8gICBhbmQgcnVuIHVzaW5nIHRoZSBgLXJgIGNvbW1hbmQgbGluZSBmbGFnKS4gVW5sZXNzIHRoZSBgZXhlY0FyZ3ZgIG9wdGlvbiBpc1xuICAgIC8vICAgZXhwbGljaXRseSBzZXQsIG5ldyBXb3JrZXIgdGhyZWFkcyBhdXRvbWF0aWNhbGx5IGluaGVyaXQgdGhlIGNvbW1hbmQgbGluZSBmbGFnc1xuICAgIC8vICAgZnJvbSB0aGUgcnVubmluZyBwcm9jZXNzIGFuZCB3aWxsIHByZWxvYWQgdGhlIHNhbWUgcHJlbG9hZCBzY3JpcHRzIGFzIHRoZSBtYWluXG4gICAgLy8gICB0aHJlYWQuIElmIHRoZSBwcmVsb2FkIHNjcmlwdCB1bmNvbmRpdGlvbmFsbHkgbGF1bmNoZXMgYSB3b3JrZXIgdGhyZWFkLCBldmVyeVxuICAgIC8vICAgdGhyZWFkIHNwYXduZWQgd2lsbCBzcGF3biBhbm90aGVyIHVudGlsIHRoZSBhcHBsaWNhdGlvbiBjcmFzaGVzLlxuICAgIC8vXG4gICAgZXhlY0FyZ3Y6IFtdXG4gIH0pO1xuICBsZXQgbmV4dElEID0gMDtcbiAgbGV0IGZha2VCdWlsZEVycm9yID0gKHRleHQpID0+IHtcbiAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoYEJ1aWxkIGZhaWxlZCB3aXRoIDEgZXJyb3I6XG5lcnJvcjogJHt0ZXh0fWApO1xuICAgIGxldCBlcnJvcnMgPSBbeyBpZDogXCJcIiwgcGx1Z2luTmFtZTogXCJcIiwgdGV4dCwgbG9jYXRpb246IG51bGwsIG5vdGVzOiBbXSwgZGV0YWlsOiB2b2lkIDAgfV07XG4gICAgZXJyb3IuZXJyb3JzID0gZXJyb3JzO1xuICAgIGVycm9yLndhcm5pbmdzID0gW107XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xuICBsZXQgdmFsaWRhdGVCdWlsZFN5bmNPcHRpb25zID0gKG9wdGlvbnMpID0+IHtcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybjtcbiAgICBsZXQgcGx1Z2lucyA9IG9wdGlvbnMucGx1Z2lucztcbiAgICBpZiAocGx1Z2lucyAmJiBwbHVnaW5zLmxlbmd0aCA+IDApIHRocm93IGZha2VCdWlsZEVycm9yKGBDYW5ub3QgdXNlIHBsdWdpbnMgaW4gc3luY2hyb25vdXMgQVBJIGNhbGxzYCk7XG4gIH07XG4gIGxldCBhcHBseVByb3BlcnRpZXMgPSAob2JqZWN0LCBwcm9wZXJ0aWVzKSA9PiB7XG4gICAgZm9yIChsZXQga2V5IGluIHByb3BlcnRpZXMpIHtcbiAgICAgIG9iamVjdFtrZXldID0gcHJvcGVydGllc1trZXldO1xuICAgIH1cbiAgfTtcbiAgbGV0IHJ1bkNhbGxTeW5jID0gKGNvbW1hbmQsIGFyZ3MpID0+IHtcbiAgICBsZXQgaWQgPSBuZXh0SUQrKztcbiAgICBsZXQgc2hhcmVkQnVmZmVyID0gbmV3IFNoYXJlZEFycmF5QnVmZmVyKDgpO1xuICAgIGxldCBzaGFyZWRCdWZmZXJWaWV3ID0gbmV3IEludDMyQXJyYXkoc2hhcmVkQnVmZmVyKTtcbiAgICBsZXQgbXNnID0geyBzaGFyZWRCdWZmZXIsIGlkLCBjb21tYW5kLCBhcmdzIH07XG4gICAgd29ya2VyLnBvc3RNZXNzYWdlKG1zZyk7XG4gICAgbGV0IHN0YXR1cyA9IEF0b21pY3Mud2FpdChzaGFyZWRCdWZmZXJWaWV3LCAwLCAwKTtcbiAgICBpZiAoc3RhdHVzICE9PSBcIm9rXCIgJiYgc3RhdHVzICE9PSBcIm5vdC1lcXVhbFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBlcnJvcjogQXRvbWljcy53YWl0KCkgZmFpbGVkOiBcIiArIHN0YXR1cyk7XG4gICAgbGV0IHsgbWVzc2FnZTogeyBpZDogaWQyLCByZXNvbHZlLCByZWplY3QsIHByb3BlcnRpZXMgfSB9ID0gd29ya2VyX3RocmVhZHMyLnJlY2VpdmVNZXNzYWdlT25Qb3J0KG1haW5Qb3J0KTtcbiAgICBpZiAoaWQgIT09IGlkMikgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBlcnJvcjogRXhwZWN0ZWQgaWQgJHtpZH0gYnV0IGdvdCBpZCAke2lkMn1gKTtcbiAgICBpZiAocmVqZWN0KSB7XG4gICAgICBhcHBseVByb3BlcnRpZXMocmVqZWN0LCBwcm9wZXJ0aWVzKTtcbiAgICAgIHRocm93IHJlamVjdDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc29sdmU7XG4gIH07XG4gIHdvcmtlci51bnJlZigpO1xuICByZXR1cm4ge1xuICAgIGJ1aWxkU3luYyhvcHRpb25zKSB7XG4gICAgICB2YWxpZGF0ZUJ1aWxkU3luY09wdGlvbnMob3B0aW9ucyk7XG4gICAgICByZXR1cm4gcnVuQ2FsbFN5bmMoXCJidWlsZFwiLCBbb3B0aW9uc10pO1xuICAgIH0sXG4gICAgdHJhbnNmb3JtU3luYyhpbnB1dCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIHJ1bkNhbGxTeW5jKFwidHJhbnNmb3JtXCIsIFtpbnB1dCwgb3B0aW9uc10pO1xuICAgIH0sXG4gICAgZm9ybWF0TWVzc2FnZXNTeW5jKG1lc3NhZ2VzLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gcnVuQ2FsbFN5bmMoXCJmb3JtYXRNZXNzYWdlc1wiLCBbbWVzc2FnZXMsIG9wdGlvbnNdKTtcbiAgICB9LFxuICAgIGFuYWx5emVNZXRhZmlsZVN5bmMobWV0YWZpbGUsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBydW5DYWxsU3luYyhcImFuYWx5emVNZXRhZmlsZVwiLCBbbWV0YWZpbGUsIG9wdGlvbnNdKTtcbiAgICB9LFxuICAgIHN0b3AoKSB7XG4gICAgICB3b3JrZXIudGVybWluYXRlKCk7XG4gICAgICB3b3JrZXJUaHJlYWRTZXJ2aWNlID0gbnVsbDtcbiAgICB9XG4gIH07XG59O1xudmFyIHN0YXJ0U3luY1NlcnZpY2VXb3JrZXIgPSAoKSA9PiB7XG4gIGxldCB3b3JrZXJQb3J0ID0gd29ya2VyX3RocmVhZHMud29ya2VyRGF0YS53b3JrZXJQb3J0O1xuICBsZXQgcGFyZW50UG9ydCA9IHdvcmtlcl90aHJlYWRzLnBhcmVudFBvcnQ7XG4gIGxldCBleHRyYWN0UHJvcGVydGllcyA9IChvYmplY3QpID0+IHtcbiAgICBsZXQgcHJvcGVydGllcyA9IHt9O1xuICAgIGlmIChvYmplY3QgJiYgdHlwZW9mIG9iamVjdCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgZm9yIChsZXQga2V5IGluIG9iamVjdCkge1xuICAgICAgICBwcm9wZXJ0aWVzW2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gIH07XG4gIHRyeSB7XG4gICAgbGV0IHNlcnZpY2UgPSBlbnN1cmVTZXJ2aWNlSXNSdW5uaW5nKCk7XG4gICAgZGVmYXVsdFdEID0gd29ya2VyX3RocmVhZHMud29ya2VyRGF0YS5kZWZhdWx0V0Q7XG4gICAgcGFyZW50UG9ydC5vbihcIm1lc3NhZ2VcIiwgKG1zZykgPT4ge1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IHsgc2hhcmVkQnVmZmVyLCBpZCwgY29tbWFuZCwgYXJncyB9ID0gbXNnO1xuICAgICAgICBsZXQgc2hhcmVkQnVmZmVyVmlldyA9IG5ldyBJbnQzMkFycmF5KHNoYXJlZEJ1ZmZlcik7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwiYnVpbGRcIjpcbiAgICAgICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZXNvbHZlOiBhd2FpdCBzZXJ2aWNlLmJ1aWxkKGFyZ3NbMF0pIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ0cmFuc2Zvcm1cIjpcbiAgICAgICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZXNvbHZlOiBhd2FpdCBzZXJ2aWNlLnRyYW5zZm9ybShhcmdzWzBdLCBhcmdzWzFdKSB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZm9ybWF0TWVzc2FnZXNcIjpcbiAgICAgICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZXNvbHZlOiBhd2FpdCBzZXJ2aWNlLmZvcm1hdE1lc3NhZ2VzKGFyZ3NbMF0sIGFyZ3NbMV0pIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJhbmFseXplTWV0YWZpbGVcIjpcbiAgICAgICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZXNvbHZlOiBhd2FpdCBzZXJ2aWNlLmFuYWx5emVNZXRhZmlsZShhcmdzWzBdLCBhcmdzWzFdKSB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29tbWFuZDogJHtjb21tYW5kfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAocmVqZWN0KSB7XG4gICAgICAgICAgd29ya2VyUG9ydC5wb3N0TWVzc2FnZSh7IGlkLCByZWplY3QsIHByb3BlcnRpZXM6IGV4dHJhY3RQcm9wZXJ0aWVzKHJlamVjdCkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgQXRvbWljcy5hZGQoc2hhcmVkQnVmZmVyVmlldywgMCwgMSk7XG4gICAgICAgIEF0b21pY3Mubm90aWZ5KHNoYXJlZEJ1ZmZlclZpZXcsIDAsIEluZmluaXR5KTtcbiAgICAgIH0pKCk7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKHJlamVjdCkge1xuICAgIHBhcmVudFBvcnQub24oXCJtZXNzYWdlXCIsIChtc2cpID0+IHtcbiAgICAgIGxldCB7IHNoYXJlZEJ1ZmZlciwgaWQgfSA9IG1zZztcbiAgICAgIGxldCBzaGFyZWRCdWZmZXJWaWV3ID0gbmV3IEludDMyQXJyYXkoc2hhcmVkQnVmZmVyKTtcbiAgICAgIHdvcmtlclBvcnQucG9zdE1lc3NhZ2UoeyBpZCwgcmVqZWN0LCBwcm9wZXJ0aWVzOiBleHRyYWN0UHJvcGVydGllcyhyZWplY3QpIH0pO1xuICAgICAgQXRvbWljcy5hZGQoc2hhcmVkQnVmZmVyVmlldywgMCwgMSk7XG4gICAgICBBdG9taWNzLm5vdGlmeShzaGFyZWRCdWZmZXJWaWV3LCAwLCBJbmZpbml0eSk7XG4gICAgfSk7XG4gIH1cbn07XG5pZiAoaXNJbnRlcm5hbFdvcmtlclRocmVhZCkge1xuICBzdGFydFN5bmNTZXJ2aWNlV29ya2VyKCk7XG59XG52YXIgbm9kZV9kZWZhdWx0ID0gbm9kZV9leHBvcnRzO1xuLy8gQW5ub3RhdGUgdGhlIENvbW1vbkpTIGV4cG9ydCBuYW1lcyBmb3IgRVNNIGltcG9ydCBpbiBub2RlOlxuMCAmJiAobW9kdWxlLmV4cG9ydHMgPSB7XG4gIGFuYWx5emVNZXRhZmlsZSxcbiAgYW5hbHl6ZU1ldGFmaWxlU3luYyxcbiAgYnVpbGQsXG4gIGJ1aWxkU3luYyxcbiAgY29udGV4dCxcbiAgZm9ybWF0TWVzc2FnZXMsXG4gIGZvcm1hdE1lc3NhZ2VzU3luYyxcbiAgaW5pdGlhbGl6ZSxcbiAgc3RvcCxcbiAgdHJhbnNmb3JtLFxuICB0cmFuc2Zvcm1TeW5jLFxuICB2ZXJzaW9uXG59KTtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7OztFQUVBLElBQUksWUFBWSxPQUFPO0FBQUEsRUFDdkIsSUFBSSxtQkFBbUIsT0FBTztBQUFBLEVBQzlCLElBQUksb0JBQW9CLE9BQU87QUFBQSxFQUUvQixJQUFJLGVBQWUsT0FBTyxVQUFVO0FBQUEsRUFDcEMsSUFBSSxXQUFXLENBQUMsUUFBUSxRQUFRO0FBQUEsSUFDOUIsU0FBUyxRQUFRO0FBQUEsTUFDZixVQUFVLFFBQVEsTUFBTSxFQUFFLEtBQUssSUFBSSxPQUFPLFlBQVksS0FBSyxDQUFDO0FBQUE7QUFBQSxFQUVoRSxJQUFJLGNBQWMsQ0FBQyxJQUFJLE1BQU0sUUFBUSxTQUFTO0FBQUEsSUFDNUMsSUFBSSxRQUFRLE9BQU8sU0FBUyxZQUFZLE9BQU8sU0FBUyxZQUFZO0FBQUEsTUFDbEUsU0FBUyxPQUFPLGtCQUFrQixJQUFJO0FBQUEsUUFDcEMsSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLEdBQUcsS0FBSyxRQUFRO0FBQUEsVUFDekMsVUFBVSxJQUFJLEtBQUssRUFBRSxLQUFLLE1BQU0sS0FBSyxNQUFNLFlBQVksRUFBRSxPQUFP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QVEsWUFBWSxrQkFBa0IsTUFBTSxFQUFFLENBQUM7QUFBQTtBQUFBLFVBRTlFLFFBQVEsSUFBSSxrQkFBa0IsR0FBRyxDQUFDO0FBQUEsVUFDbEMsUUFBUSxPQUFPLGtCQUFrQixHQUFHLFFBQVE7QUFBQSxXQUMzQztBQUFBLE9BQ0o7QUFBQSxNQUNELE9BQU8sUUFBUTtBQUFBLE1BQ2YsV0FBVyxHQUFHLFdBQVcsQ0FBQyxRQUFRO0FBQUEsUUFDaEMsTUFBTSxjQUFjLE9BQU87QUFBQSxRQUMzQixJQUFJLG1CQUFtQixJQUFJLFdBQVcsWUFBWTtBQUFBLFFBQ2xELFdBQVcsWUFBWSxFQUFFLElBQUksUUFBUSxZQUFZLGtCQUFrQixNQUFNLEVBQUUsQ0FBQztBQUFBLFFBQzVFLFFBQVEsSUFBSSxrQkFBa0IsR0FBRyxDQUFDO0FBQUEsUUFDbEMsUUFBUSxPQUFPLGtCQUFrQixHQUFHLFFBQVE7QUFBQSxPQUM3QztBQUFBO0FBQUE7QUFBQSxFQUdMLElBQUksd0JBQXdCO0FBQUEsSUFDMUIsdUJBQXVCO0FBQUEsRUFDekI7QUFBQSxFQUNBLElBQUksZUFBZTtBQUFBOyIsCiAgImRlYnVnSWQiOiAiRjAyNkQzMkU4ODBERkFEMjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=