@pathscale/rsbuild-plugin-ui-css-purge 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1448 @@
1
+ #!/usr/bin/env bun
2
+ // @bun
3
+ var __create = Object.create;
4
+ var __getProtoOf = Object.getPrototypeOf;
5
+ var __defProp = Object.defineProperty;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ function __accessProp(key) {
9
+ return this[key];
10
+ }
11
+ var __toESMCache_node;
12
+ var __toESMCache_esm;
13
+ var __toESM = (mod, isNodeMode, target) => {
14
+ var canCache = mod != null && typeof mod === "object";
15
+ if (canCache) {
16
+ var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
17
+ var cached = cache.get(mod);
18
+ if (cached)
19
+ return cached;
20
+ }
21
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
22
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
23
+ for (let key of __getOwnPropNames(mod))
24
+ if (!__hasOwnProp.call(to, key))
25
+ __defProp(to, key, {
26
+ get: __accessProp.bind(mod, key),
27
+ enumerable: true
28
+ });
29
+ if (canCache)
30
+ cache.set(mod, to);
31
+ return to;
32
+ };
33
+ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
34
+ var __require = import.meta.require;
35
+
36
+ // node_modules/detect-libc/lib/process.js
37
+ var require_process = __commonJS((exports, module) => {
38
+ var isLinux = () => process.platform === "linux";
39
+ var report = null;
40
+ var getReport = () => {
41
+ if (!report) {
42
+ if (isLinux() && process.report) {
43
+ const orig = process.report.excludeNetwork;
44
+ process.report.excludeNetwork = true;
45
+ report = process.report.getReport();
46
+ process.report.excludeNetwork = orig;
47
+ } else {
48
+ report = {};
49
+ }
50
+ }
51
+ return report;
52
+ };
53
+ module.exports = { isLinux, getReport };
54
+ });
55
+
56
+ // node_modules/detect-libc/lib/filesystem.js
57
+ var require_filesystem = __commonJS((exports, module) => {
58
+ var fs = __require("fs");
59
+ var LDD_PATH = "/usr/bin/ldd";
60
+ var SELF_PATH = "/proc/self/exe";
61
+ var MAX_LENGTH = 2048;
62
+ var readFileSync = (path) => {
63
+ const fd = fs.openSync(path, "r");
64
+ const buffer = Buffer.alloc(MAX_LENGTH);
65
+ const bytesRead = fs.readSync(fd, buffer, 0, MAX_LENGTH, 0);
66
+ fs.close(fd, () => {});
67
+ return buffer.subarray(0, bytesRead);
68
+ };
69
+ var readFile = (path) => new Promise((resolve, reject) => {
70
+ fs.open(path, "r", (err, fd) => {
71
+ if (err) {
72
+ reject(err);
73
+ } else {
74
+ const buffer = Buffer.alloc(MAX_LENGTH);
75
+ fs.read(fd, buffer, 0, MAX_LENGTH, 0, (_, bytesRead) => {
76
+ resolve(buffer.subarray(0, bytesRead));
77
+ fs.close(fd, () => {});
78
+ });
79
+ }
80
+ });
81
+ });
82
+ module.exports = {
83
+ LDD_PATH,
84
+ SELF_PATH,
85
+ readFileSync,
86
+ readFile
87
+ };
88
+ });
89
+
90
+ // node_modules/detect-libc/lib/elf.js
91
+ var require_elf = __commonJS((exports, module) => {
92
+ var interpreterPath = (elf) => {
93
+ if (elf.length < 64) {
94
+ return null;
95
+ }
96
+ if (elf.readUInt32BE(0) !== 2135247942) {
97
+ return null;
98
+ }
99
+ if (elf.readUInt8(4) !== 2) {
100
+ return null;
101
+ }
102
+ if (elf.readUInt8(5) !== 1) {
103
+ return null;
104
+ }
105
+ const offset = elf.readUInt32LE(32);
106
+ const size = elf.readUInt16LE(54);
107
+ const count = elf.readUInt16LE(56);
108
+ for (let i = 0;i < count; i++) {
109
+ const headerOffset = offset + i * size;
110
+ const type = elf.readUInt32LE(headerOffset);
111
+ if (type === 3) {
112
+ const fileOffset = elf.readUInt32LE(headerOffset + 8);
113
+ const fileSize = elf.readUInt32LE(headerOffset + 32);
114
+ return elf.subarray(fileOffset, fileOffset + fileSize).toString().replace(/\0.*$/g, "");
115
+ }
116
+ }
117
+ return null;
118
+ };
119
+ module.exports = {
120
+ interpreterPath
121
+ };
122
+ });
123
+
124
+ // node_modules/detect-libc/lib/detect-libc.js
125
+ var require_detect_libc = __commonJS((exports, module) => {
126
+ var childProcess = __require("child_process");
127
+ var { isLinux, getReport } = require_process();
128
+ var { LDD_PATH, SELF_PATH, readFile, readFileSync } = require_filesystem();
129
+ var { interpreterPath } = require_elf();
130
+ var cachedFamilyInterpreter;
131
+ var cachedFamilyFilesystem;
132
+ var cachedVersionFilesystem;
133
+ var command = "getconf GNU_LIBC_VERSION 2>&1 || true; ldd --version 2>&1 || true";
134
+ var commandOut = "";
135
+ var safeCommand = () => {
136
+ if (!commandOut) {
137
+ return new Promise((resolve) => {
138
+ childProcess.exec(command, (err, out) => {
139
+ commandOut = err ? " " : out;
140
+ resolve(commandOut);
141
+ });
142
+ });
143
+ }
144
+ return commandOut;
145
+ };
146
+ var safeCommandSync = () => {
147
+ if (!commandOut) {
148
+ try {
149
+ commandOut = childProcess.execSync(command, { encoding: "utf8" });
150
+ } catch (_err) {
151
+ commandOut = " ";
152
+ }
153
+ }
154
+ return commandOut;
155
+ };
156
+ var GLIBC = "glibc";
157
+ var RE_GLIBC_VERSION = /LIBC[a-z0-9 \-).]*?(\d+\.\d+)/i;
158
+ var MUSL = "musl";
159
+ var isFileMusl = (f) => f.includes("libc.musl-") || f.includes("ld-musl-");
160
+ var familyFromReport = () => {
161
+ const report = getReport();
162
+ if (report.header && report.header.glibcVersionRuntime) {
163
+ return GLIBC;
164
+ }
165
+ if (Array.isArray(report.sharedObjects)) {
166
+ if (report.sharedObjects.some(isFileMusl)) {
167
+ return MUSL;
168
+ }
169
+ }
170
+ return null;
171
+ };
172
+ var familyFromCommand = (out) => {
173
+ const [getconf, ldd1] = out.split(/[\r\n]+/);
174
+ if (getconf && getconf.includes(GLIBC)) {
175
+ return GLIBC;
176
+ }
177
+ if (ldd1 && ldd1.includes(MUSL)) {
178
+ return MUSL;
179
+ }
180
+ return null;
181
+ };
182
+ var familyFromInterpreterPath = (path) => {
183
+ if (path) {
184
+ if (path.includes("/ld-musl-")) {
185
+ return MUSL;
186
+ } else if (path.includes("/ld-linux-")) {
187
+ return GLIBC;
188
+ }
189
+ }
190
+ return null;
191
+ };
192
+ var getFamilyFromLddContent = (content) => {
193
+ content = content.toString();
194
+ if (content.includes("musl")) {
195
+ return MUSL;
196
+ }
197
+ if (content.includes("GNU C Library")) {
198
+ return GLIBC;
199
+ }
200
+ return null;
201
+ };
202
+ var familyFromFilesystem = async () => {
203
+ if (cachedFamilyFilesystem !== undefined) {
204
+ return cachedFamilyFilesystem;
205
+ }
206
+ cachedFamilyFilesystem = null;
207
+ try {
208
+ const lddContent = await readFile(LDD_PATH);
209
+ cachedFamilyFilesystem = getFamilyFromLddContent(lddContent);
210
+ } catch (e) {}
211
+ return cachedFamilyFilesystem;
212
+ };
213
+ var familyFromFilesystemSync = () => {
214
+ if (cachedFamilyFilesystem !== undefined) {
215
+ return cachedFamilyFilesystem;
216
+ }
217
+ cachedFamilyFilesystem = null;
218
+ try {
219
+ const lddContent = readFileSync(LDD_PATH);
220
+ cachedFamilyFilesystem = getFamilyFromLddContent(lddContent);
221
+ } catch (e) {}
222
+ return cachedFamilyFilesystem;
223
+ };
224
+ var familyFromInterpreter = async () => {
225
+ if (cachedFamilyInterpreter !== undefined) {
226
+ return cachedFamilyInterpreter;
227
+ }
228
+ cachedFamilyInterpreter = null;
229
+ try {
230
+ const selfContent = await readFile(SELF_PATH);
231
+ const path = interpreterPath(selfContent);
232
+ cachedFamilyInterpreter = familyFromInterpreterPath(path);
233
+ } catch (e) {}
234
+ return cachedFamilyInterpreter;
235
+ };
236
+ var familyFromInterpreterSync = () => {
237
+ if (cachedFamilyInterpreter !== undefined) {
238
+ return cachedFamilyInterpreter;
239
+ }
240
+ cachedFamilyInterpreter = null;
241
+ try {
242
+ const selfContent = readFileSync(SELF_PATH);
243
+ const path = interpreterPath(selfContent);
244
+ cachedFamilyInterpreter = familyFromInterpreterPath(path);
245
+ } catch (e) {}
246
+ return cachedFamilyInterpreter;
247
+ };
248
+ var family = async () => {
249
+ let family2 = null;
250
+ if (isLinux()) {
251
+ family2 = await familyFromInterpreter();
252
+ if (!family2) {
253
+ family2 = await familyFromFilesystem();
254
+ if (!family2) {
255
+ family2 = familyFromReport();
256
+ }
257
+ if (!family2) {
258
+ const out = await safeCommand();
259
+ family2 = familyFromCommand(out);
260
+ }
261
+ }
262
+ }
263
+ return family2;
264
+ };
265
+ var familySync = () => {
266
+ let family2 = null;
267
+ if (isLinux()) {
268
+ family2 = familyFromInterpreterSync();
269
+ if (!family2) {
270
+ family2 = familyFromFilesystemSync();
271
+ if (!family2) {
272
+ family2 = familyFromReport();
273
+ }
274
+ if (!family2) {
275
+ const out = safeCommandSync();
276
+ family2 = familyFromCommand(out);
277
+ }
278
+ }
279
+ }
280
+ return family2;
281
+ };
282
+ var isNonGlibcLinux = async () => isLinux() && await family() !== GLIBC;
283
+ var isNonGlibcLinuxSync = () => isLinux() && familySync() !== GLIBC;
284
+ var versionFromFilesystem = async () => {
285
+ if (cachedVersionFilesystem !== undefined) {
286
+ return cachedVersionFilesystem;
287
+ }
288
+ cachedVersionFilesystem = null;
289
+ try {
290
+ const lddContent = await readFile(LDD_PATH);
291
+ const versionMatch = lddContent.match(RE_GLIBC_VERSION);
292
+ if (versionMatch) {
293
+ cachedVersionFilesystem = versionMatch[1];
294
+ }
295
+ } catch (e) {}
296
+ return cachedVersionFilesystem;
297
+ };
298
+ var versionFromFilesystemSync = () => {
299
+ if (cachedVersionFilesystem !== undefined) {
300
+ return cachedVersionFilesystem;
301
+ }
302
+ cachedVersionFilesystem = null;
303
+ try {
304
+ const lddContent = readFileSync(LDD_PATH);
305
+ const versionMatch = lddContent.match(RE_GLIBC_VERSION);
306
+ if (versionMatch) {
307
+ cachedVersionFilesystem = versionMatch[1];
308
+ }
309
+ } catch (e) {}
310
+ return cachedVersionFilesystem;
311
+ };
312
+ var versionFromReport = () => {
313
+ const report = getReport();
314
+ if (report.header && report.header.glibcVersionRuntime) {
315
+ return report.header.glibcVersionRuntime;
316
+ }
317
+ return null;
318
+ };
319
+ var versionSuffix = (s) => s.trim().split(/\s+/)[1];
320
+ var versionFromCommand = (out) => {
321
+ const [getconf, ldd1, ldd2] = out.split(/[\r\n]+/);
322
+ if (getconf && getconf.includes(GLIBC)) {
323
+ return versionSuffix(getconf);
324
+ }
325
+ if (ldd1 && ldd2 && ldd1.includes(MUSL)) {
326
+ return versionSuffix(ldd2);
327
+ }
328
+ return null;
329
+ };
330
+ var version = async () => {
331
+ let version2 = null;
332
+ if (isLinux()) {
333
+ version2 = await versionFromFilesystem();
334
+ if (!version2) {
335
+ version2 = versionFromReport();
336
+ }
337
+ if (!version2) {
338
+ const out = await safeCommand();
339
+ version2 = versionFromCommand(out);
340
+ }
341
+ }
342
+ return version2;
343
+ };
344
+ var versionSync = () => {
345
+ let version2 = null;
346
+ if (isLinux()) {
347
+ version2 = versionFromFilesystemSync();
348
+ if (!version2) {
349
+ version2 = versionFromReport();
350
+ }
351
+ if (!version2) {
352
+ const out = safeCommandSync();
353
+ version2 = versionFromCommand(out);
354
+ }
355
+ }
356
+ return version2;
357
+ };
358
+ module.exports = {
359
+ GLIBC,
360
+ MUSL,
361
+ family,
362
+ familySync,
363
+ isNonGlibcLinux,
364
+ isNonGlibcLinuxSync,
365
+ version,
366
+ versionSync
367
+ };
368
+ });
369
+
370
+ // node_modules/lightningcss/node/browserslistToTargets.js
371
+ var require_browserslistToTargets = __commonJS((exports, module) => {
372
+ var BROWSER_MAPPING = {
373
+ and_chr: "chrome",
374
+ and_ff: "firefox",
375
+ ie_mob: "ie",
376
+ op_mob: "opera",
377
+ and_qq: null,
378
+ and_uc: null,
379
+ baidu: null,
380
+ bb: null,
381
+ kaios: null,
382
+ op_mini: null
383
+ };
384
+ function browserslistToTargets(browserslist) {
385
+ let targets = {};
386
+ for (let browser of browserslist) {
387
+ let [name, v] = browser.split(" ");
388
+ if (BROWSER_MAPPING[name] === null) {
389
+ continue;
390
+ }
391
+ let version = parseVersion(v);
392
+ if (version == null) {
393
+ continue;
394
+ }
395
+ if (targets[name] == null || version < targets[name]) {
396
+ targets[name] = version;
397
+ }
398
+ }
399
+ return targets;
400
+ }
401
+ function parseVersion(version) {
402
+ let [major, minor = 0, patch = 0] = version.split("-")[0].split(".").map((v) => parseInt(v, 10));
403
+ if (isNaN(major) || isNaN(minor) || isNaN(patch)) {
404
+ return null;
405
+ }
406
+ return major << 16 | minor << 8 | patch;
407
+ }
408
+ module.exports = browserslistToTargets;
409
+ });
410
+
411
+ // node_modules/lightningcss/node/composeVisitors.js
412
+ var require_composeVisitors = __commonJS((exports, module) => {
413
+ function composeVisitors(visitors) {
414
+ if (visitors.length === 1) {
415
+ return visitors[0];
416
+ }
417
+ if (visitors.some((v) => typeof v === "function")) {
418
+ return (opts) => {
419
+ let v = visitors.map((v2) => typeof v2 === "function" ? v2(opts) : v2);
420
+ return composeVisitors(v);
421
+ };
422
+ }
423
+ let res = {};
424
+ composeSimpleVisitors(res, visitors, "StyleSheet");
425
+ composeSimpleVisitors(res, visitors, "StyleSheetExit");
426
+ composeObjectVisitors(res, visitors, "Rule", ruleVisitor, wrapCustomAndUnknownAtRule);
427
+ composeObjectVisitors(res, visitors, "RuleExit", ruleVisitor, wrapCustomAndUnknownAtRule);
428
+ composeObjectVisitors(res, visitors, "Declaration", declarationVisitor, wrapCustomProperty);
429
+ composeObjectVisitors(res, visitors, "DeclarationExit", declarationVisitor, wrapCustomProperty);
430
+ composeSimpleVisitors(res, visitors, "Url");
431
+ composeSimpleVisitors(res, visitors, "Color");
432
+ composeSimpleVisitors(res, visitors, "Image");
433
+ composeSimpleVisitors(res, visitors, "ImageExit");
434
+ composeSimpleVisitors(res, visitors, "Length");
435
+ composeSimpleVisitors(res, visitors, "Angle");
436
+ composeSimpleVisitors(res, visitors, "Ratio");
437
+ composeSimpleVisitors(res, visitors, "Resolution");
438
+ composeSimpleVisitors(res, visitors, "Time");
439
+ composeSimpleVisitors(res, visitors, "CustomIdent");
440
+ composeSimpleVisitors(res, visitors, "DashedIdent");
441
+ composeArrayFunctions(res, visitors, "MediaQuery");
442
+ composeArrayFunctions(res, visitors, "MediaQueryExit");
443
+ composeSimpleVisitors(res, visitors, "SupportsCondition");
444
+ composeSimpleVisitors(res, visitors, "SupportsConditionExit");
445
+ composeArrayFunctions(res, visitors, "Selector");
446
+ composeTokenVisitors(res, visitors, "Token", "token", false);
447
+ composeTokenVisitors(res, visitors, "Function", "function", false);
448
+ composeTokenVisitors(res, visitors, "FunctionExit", "function", true);
449
+ composeTokenVisitors(res, visitors, "Variable", "var", false);
450
+ composeTokenVisitors(res, visitors, "VariableExit", "var", true);
451
+ composeTokenVisitors(res, visitors, "EnvironmentVariable", "env", false);
452
+ composeTokenVisitors(res, visitors, "EnvironmentVariableExit", "env", true);
453
+ return res;
454
+ }
455
+ module.exports = composeVisitors;
456
+ function wrapCustomAndUnknownAtRule(k, f) {
457
+ if (k === "unknown") {
458
+ return (value) => f({ type: "unknown", value });
459
+ }
460
+ if (k === "custom") {
461
+ return (value) => f({ type: "custom", value });
462
+ }
463
+ return f;
464
+ }
465
+ function wrapCustomProperty(k, f) {
466
+ return k === "custom" ? (value) => f({ property: "custom", value }) : f;
467
+ }
468
+ function ruleVisitor(f, item) {
469
+ if (typeof f === "object") {
470
+ if (item.type === "unknown") {
471
+ let v = f.unknown;
472
+ if (typeof v === "object") {
473
+ v = v[item.value.name];
474
+ }
475
+ return v?.(item.value);
476
+ }
477
+ if (item.type === "custom") {
478
+ let v = f.custom;
479
+ if (typeof v === "object") {
480
+ v = v[item.value.name];
481
+ }
482
+ return v?.(item.value);
483
+ }
484
+ return f[item.type]?.(item);
485
+ }
486
+ return f?.(item);
487
+ }
488
+ function declarationVisitor(f, item) {
489
+ if (typeof f === "object") {
490
+ let name = item.property;
491
+ if (item.property === "unparsed") {
492
+ name = item.value.propertyId.property;
493
+ } else if (item.property === "custom") {
494
+ let v = f.custom;
495
+ if (typeof v === "object") {
496
+ v = v[item.value.name];
497
+ }
498
+ return v?.(item.value);
499
+ }
500
+ return f[name]?.(item);
501
+ }
502
+ return f?.(item);
503
+ }
504
+ function extractObjectsOrFunctions(visitors, key) {
505
+ let values = [];
506
+ let hasFunction = false;
507
+ let allKeys = new Set;
508
+ for (let visitor of visitors) {
509
+ let v = visitor[key];
510
+ if (v) {
511
+ if (typeof v === "function") {
512
+ hasFunction = true;
513
+ } else {
514
+ for (let key2 in v) {
515
+ allKeys.add(key2);
516
+ }
517
+ }
518
+ values.push(v);
519
+ }
520
+ }
521
+ return [values, hasFunction, allKeys];
522
+ }
523
+ function composeObjectVisitors(res, visitors, key, apply, wrapKey) {
524
+ let [values, hasFunction, allKeys] = extractObjectsOrFunctions(visitors, key);
525
+ if (values.length === 0) {
526
+ return;
527
+ }
528
+ if (values.length === 1) {
529
+ res[key] = values[0];
530
+ return;
531
+ }
532
+ let f = createArrayVisitor(visitors, (visitor, item) => apply(visitor[key], item));
533
+ if (hasFunction) {
534
+ res[key] = f;
535
+ } else {
536
+ let v = {};
537
+ for (let k of allKeys) {
538
+ v[k] = wrapKey(k, f);
539
+ }
540
+ res[key] = v;
541
+ }
542
+ }
543
+ function composeTokenVisitors(res, visitors, key, type, isExit) {
544
+ let [values, hasFunction, allKeys] = extractObjectsOrFunctions(visitors, key);
545
+ if (values.length === 0) {
546
+ return;
547
+ }
548
+ if (values.length === 1) {
549
+ res[key] = values[0];
550
+ return;
551
+ }
552
+ let f = createTokenVisitor(visitors, type, isExit);
553
+ if (hasFunction) {
554
+ res[key] = f;
555
+ } else {
556
+ let v = {};
557
+ for (let key2 of allKeys) {
558
+ v[key2] = f;
559
+ }
560
+ res[key] = v;
561
+ }
562
+ }
563
+ function createTokenVisitor(visitors, type, isExit) {
564
+ let v = createArrayVisitor(visitors, (visitor, item) => {
565
+ let f;
566
+ switch (item.type) {
567
+ case "token":
568
+ f = visitor.Token;
569
+ if (typeof f === "object") {
570
+ f = f[item.value.type];
571
+ }
572
+ break;
573
+ case "function":
574
+ f = isExit ? visitor.FunctionExit : visitor.Function;
575
+ if (typeof f === "object") {
576
+ f = f[item.value.name];
577
+ }
578
+ break;
579
+ case "var":
580
+ f = isExit ? visitor.VariableExit : visitor.Variable;
581
+ break;
582
+ case "env":
583
+ f = isExit ? visitor.EnvironmentVariableExit : visitor.EnvironmentVariable;
584
+ if (typeof f === "object") {
585
+ let name;
586
+ switch (item.value.name.type) {
587
+ case "ua":
588
+ case "unknown":
589
+ name = item.value.name.value;
590
+ break;
591
+ case "custom":
592
+ name = item.value.name.ident;
593
+ break;
594
+ }
595
+ f = f[name];
596
+ }
597
+ break;
598
+ case "color":
599
+ f = visitor.Color;
600
+ break;
601
+ case "url":
602
+ f = visitor.Url;
603
+ break;
604
+ case "length":
605
+ f = visitor.Length;
606
+ break;
607
+ case "angle":
608
+ f = visitor.Angle;
609
+ break;
610
+ case "time":
611
+ f = visitor.Time;
612
+ break;
613
+ case "resolution":
614
+ f = visitor.Resolution;
615
+ break;
616
+ case "dashed-ident":
617
+ f = visitor.DashedIdent;
618
+ break;
619
+ }
620
+ if (!f) {
621
+ return;
622
+ }
623
+ let res = f(item.value);
624
+ switch (item.type) {
625
+ case "color":
626
+ case "url":
627
+ case "length":
628
+ case "angle":
629
+ case "time":
630
+ case "resolution":
631
+ case "dashed-ident":
632
+ if (Array.isArray(res)) {
633
+ res = res.map((value) => ({ type: item.type, value }));
634
+ } else if (res) {
635
+ res = { type: item.type, value: res };
636
+ }
637
+ break;
638
+ }
639
+ return res;
640
+ });
641
+ return (value) => v({ type, value });
642
+ }
643
+ function extractFunctions(visitors, key) {
644
+ let functions = [];
645
+ for (let visitor of visitors) {
646
+ let f = visitor[key];
647
+ if (f) {
648
+ functions.push(f);
649
+ }
650
+ }
651
+ return functions;
652
+ }
653
+ function composeSimpleVisitors(res, visitors, key) {
654
+ let functions = extractFunctions(visitors, key);
655
+ if (functions.length === 0) {
656
+ return;
657
+ }
658
+ if (functions.length === 1) {
659
+ res[key] = functions[0];
660
+ return;
661
+ }
662
+ res[key] = (arg) => {
663
+ let mutated = false;
664
+ for (let f of functions) {
665
+ let res2 = f(arg);
666
+ if (res2) {
667
+ arg = res2;
668
+ mutated = true;
669
+ }
670
+ }
671
+ return mutated ? arg : undefined;
672
+ };
673
+ }
674
+ function composeArrayFunctions(res, visitors, key) {
675
+ let functions = extractFunctions(visitors, key);
676
+ if (functions.length === 0) {
677
+ return;
678
+ }
679
+ if (functions.length === 1) {
680
+ res[key] = functions[0];
681
+ return;
682
+ }
683
+ res[key] = createArrayVisitor(functions, (f, item) => f(item));
684
+ }
685
+ function createArrayVisitor(visitors, apply) {
686
+ let seen = new Bitset(visitors.length);
687
+ return (arg) => {
688
+ let arr = [arg];
689
+ let mutated = false;
690
+ seen.clear();
691
+ for (let i = 0;i < arr.length; i++) {
692
+ for (let v = 0;v < visitors.length && i < arr.length; ) {
693
+ if (seen.get(v)) {
694
+ v++;
695
+ continue;
696
+ }
697
+ let item = arr[i];
698
+ let visitor = visitors[v];
699
+ let res = apply(visitor, item);
700
+ if (Array.isArray(res)) {
701
+ if (res.length === 0) {
702
+ arr.splice(i, 1);
703
+ } else if (res.length === 1) {
704
+ arr[i] = res[0];
705
+ } else {
706
+ arr.splice(i, 1, ...res);
707
+ }
708
+ mutated = true;
709
+ seen.set(v);
710
+ v = 0;
711
+ } else if (res) {
712
+ arr[i] = res;
713
+ mutated = true;
714
+ seen.set(v);
715
+ v = 0;
716
+ } else {
717
+ v++;
718
+ }
719
+ }
720
+ }
721
+ if (!mutated) {
722
+ return;
723
+ }
724
+ return arr.length === 1 ? arr[0] : arr;
725
+ };
726
+ }
727
+
728
+ class Bitset {
729
+ constructor(maxBits = 32) {
730
+ this.bits = 0;
731
+ this.more = maxBits > 32 ? new Uint32Array(Math.ceil((maxBits - 32) / 32)) : null;
732
+ }
733
+ get(bit) {
734
+ if (bit >= 32 && this.more) {
735
+ let i = Math.floor((bit - 32) / 32);
736
+ let b = bit % 32;
737
+ return Boolean(this.more[i] & 1 << b);
738
+ } else {
739
+ return Boolean(this.bits & 1 << bit);
740
+ }
741
+ }
742
+ set(bit) {
743
+ if (bit >= 32 && this.more) {
744
+ let i = Math.floor((bit - 32) / 32);
745
+ let b = bit % 32;
746
+ this.more[i] |= 1 << b;
747
+ } else {
748
+ this.bits |= 1 << bit;
749
+ }
750
+ }
751
+ clear() {
752
+ this.bits = 0;
753
+ if (this.more) {
754
+ this.more.fill(0);
755
+ }
756
+ }
757
+ }
758
+ });
759
+
760
+ // node_modules/lightningcss/node/flags.js
761
+ var require_flags = __commonJS((exports) => {
762
+ exports.Features = {
763
+ Nesting: 1,
764
+ NotSelectorList: 2,
765
+ DirSelector: 4,
766
+ LangSelectorList: 8,
767
+ IsSelector: 16,
768
+ TextDecorationThicknessPercent: 32,
769
+ MediaIntervalSyntax: 64,
770
+ MediaRangeSyntax: 128,
771
+ CustomMediaQueries: 256,
772
+ ClampFunction: 512,
773
+ ColorFunction: 1024,
774
+ OklabColors: 2048,
775
+ LabColors: 4096,
776
+ P3Colors: 8192,
777
+ HexAlphaColors: 16384,
778
+ SpaceSeparatedColorNotation: 32768,
779
+ FontFamilySystemUi: 65536,
780
+ DoublePositionGradients: 131072,
781
+ VendorPrefixes: 262144,
782
+ LogicalProperties: 524288,
783
+ LightDark: 1048576,
784
+ Selectors: 31,
785
+ MediaQueries: 448,
786
+ Colors: 1113088
787
+ };
788
+ });
789
+
790
+ // node_modules/lightningcss/node/index.js
791
+ var require_node = __commonJS((exports, module) => {
792
+ var parts = [process.platform, process.arch];
793
+ if (process.platform === "linux") {
794
+ const { MUSL, familySync } = require_detect_libc();
795
+ const family = familySync();
796
+ if (family === MUSL) {
797
+ parts.push("musl");
798
+ } else if (process.arch === "arm") {
799
+ parts.push("gnueabihf");
800
+ } else {
801
+ parts.push("gnu");
802
+ }
803
+ } else if (process.platform === "win32") {
804
+ parts.push("msvc");
805
+ }
806
+ var native;
807
+ try {
808
+ native = __require(`lightningcss-${parts.join("-")}`);
809
+ } catch (err) {
810
+ native = __require(`../lightningcss.${parts.join("-")}.node`);
811
+ }
812
+ exports.transform = wrap(native.transform);
813
+ exports.transformStyleAttribute = wrap(native.transformStyleAttribute);
814
+ exports.bundle = wrap(native.bundle);
815
+ exports.bundleAsync = wrap(native.bundleAsync);
816
+ exports.browserslistToTargets = require_browserslistToTargets();
817
+ exports.composeVisitors = require_composeVisitors();
818
+ exports.Features = require_flags().Features;
819
+ function wrap(call) {
820
+ return (options) => {
821
+ if (typeof options.visitor === "function") {
822
+ let deps = [];
823
+ options.visitor = options.visitor({
824
+ addDependency(dep) {
825
+ deps.push(dep);
826
+ }
827
+ });
828
+ let result = call(options);
829
+ if (result instanceof Promise) {
830
+ result = result.then((res) => {
831
+ if (deps.length) {
832
+ res.dependencies ??= [];
833
+ res.dependencies.push(...deps);
834
+ }
835
+ return res;
836
+ });
837
+ } else if (deps.length) {
838
+ result.dependencies ??= [];
839
+ result.dependencies.push(...deps);
840
+ }
841
+ return result;
842
+ } else {
843
+ return call(options);
844
+ }
845
+ };
846
+ }
847
+ });
848
+
849
+ // src/postbuild-purge.ts
850
+ var {Glob: Glob2 } = globalThis.Bun;
851
+
852
+ // node_modules/lightningcss/node/index.mjs
853
+ var import__ = __toESM(require_node(), 1);
854
+ var { transform, transformStyleAttribute, bundle, bundleAsync, browserslistToTargets, composeVisitors, Features } = import__.default;
855
+
856
+ // src/postbuild-purge.ts
857
+ import postcss from "postcss";
858
+
859
+ // src/scan-consumer.ts
860
+ import swc from "@swc/core";
861
+ var {Glob } = globalThis.Bun;
862
+ import path from "path";
863
+ function walkAST(node, visitor) {
864
+ if (!node || typeof node !== "object")
865
+ return;
866
+ visitor(node);
867
+ for (const key of Object.keys(node)) {
868
+ if (key === "span")
869
+ continue;
870
+ const val = node[key];
871
+ if (Array.isArray(val)) {
872
+ for (const item of val)
873
+ walkAST(item, visitor);
874
+ } else if (val && typeof val === "object") {
875
+ walkAST(val, visitor);
876
+ }
877
+ }
878
+ }
879
+ function extractUIImports(ast) {
880
+ const imports = new Map;
881
+ for (const node of ast.body) {
882
+ if (node.type !== "ImportDeclaration")
883
+ continue;
884
+ const src = node.source?.value;
885
+ if (!src || !src.startsWith("@pathscale/ui"))
886
+ continue;
887
+ for (const spec of node.specifiers) {
888
+ if (spec.type === "ImportSpecifier") {
889
+ const imported = spec.imported?.value ?? spec.local?.value;
890
+ const local = spec.local?.value;
891
+ if (local && imported)
892
+ imports.set(local, imported);
893
+ } else if (spec.type === "ImportDefaultSpecifier") {
894
+ const local = spec.local?.value;
895
+ if (local)
896
+ imports.set(local, local);
897
+ }
898
+ }
899
+ }
900
+ return imports;
901
+ }
902
+ function extractJSXUsages(ast, uiComponents) {
903
+ const usages = [];
904
+ walkAST(ast, (node) => {
905
+ if (node.type !== "JSXOpeningElement")
906
+ return;
907
+ let elementName = null;
908
+ let rootName = null;
909
+ if (node.name?.type === "Identifier") {
910
+ elementName = node.name.value;
911
+ rootName = elementName;
912
+ } else if (node.name?.type === "JSXMemberExpression") {
913
+ const parts = [];
914
+ let cursor = node.name;
915
+ while (cursor?.type === "JSXMemberExpression") {
916
+ parts.unshift(cursor.property?.value);
917
+ cursor = cursor.object;
918
+ }
919
+ if (cursor?.type === "Identifier") {
920
+ parts.unshift(cursor.value);
921
+ rootName = cursor.value;
922
+ }
923
+ elementName = parts.join(".");
924
+ }
925
+ if (!rootName || !uiComponents.has(rootName))
926
+ return;
927
+ const usage = {
928
+ component: elementName,
929
+ props: new Map,
930
+ booleanProps: new Set,
931
+ hasSpread: false
932
+ };
933
+ for (const attr of node.attributes || []) {
934
+ if (attr.type === "SpreadElement" || attr.type === "JSXSpreadAttribute") {
935
+ usage.hasSpread = true;
936
+ continue;
937
+ }
938
+ if (attr.type !== "JSXAttribute")
939
+ continue;
940
+ const propName = attr.name?.value;
941
+ if (!propName)
942
+ continue;
943
+ if (!attr.value) {
944
+ usage.booleanProps.add(propName);
945
+ } else if (attr.value.type === "StringLiteral") {
946
+ usage.props.set(propName, attr.value.value);
947
+ } else {
948
+ usage.props.set(propName, "DYNAMIC");
949
+ }
950
+ }
951
+ usages.push(usage);
952
+ });
953
+ return usages;
954
+ }
955
+ function buildSafelists(allUsages, manifest) {
956
+ const classSafelist = new Set;
957
+ const attrSafelist = new Set;
958
+ const componentUsages = new Map;
959
+ for (const usage of allUsages) {
960
+ const existing = componentUsages.get(usage.component) ?? [];
961
+ existing.push(usage);
962
+ componentUsages.set(usage.component, existing);
963
+ }
964
+ for (const [entryName, entry] of Object.entries(manifest)) {
965
+ const matchingUsages = findMatchingUsages(entryName, componentUsages);
966
+ if (matchingUsages.length === 0) {
967
+ continue;
968
+ }
969
+ for (const cls of entry.classes.always) {
970
+ classSafelist.add(cls);
971
+ }
972
+ for (const [propOrSlot, value] of Object.entries(entry.classes.byProp)) {
973
+ if (Array.isArray(value)) {
974
+ if (isPropUsed(propOrSlot, matchingUsages)) {
975
+ for (const cls of value)
976
+ classSafelist.add(cls);
977
+ }
978
+ } else {
979
+ const usedValues = getUsedEnumValues(propOrSlot, matchingUsages);
980
+ if (usedValues === "ALL") {
981
+ for (const classes of Object.values(value)) {
982
+ for (const cls of classes)
983
+ classSafelist.add(cls);
984
+ }
985
+ } else {
986
+ for (const val of usedValues) {
987
+ if (value[val]) {
988
+ for (const cls of value[val])
989
+ classSafelist.add(cls);
990
+ }
991
+ }
992
+ }
993
+ }
994
+ }
995
+ if (entry.attrs) {
996
+ for (const [propName, attrMap] of Object.entries(entry.attrs)) {
997
+ if (isPropUsed(propName, matchingUsages)) {
998
+ for (const [attr, val] of Object.entries(attrMap)) {
999
+ attrSafelist.add(`${attr}=${val}`);
1000
+ }
1001
+ }
1002
+ }
1003
+ }
1004
+ }
1005
+ return { classSafelist, attrSafelist };
1006
+ }
1007
+ function findMatchingUsages(entryName, usageMap) {
1008
+ if (usageMap.has(entryName)) {
1009
+ return usageMap.get(entryName);
1010
+ }
1011
+ const results = [];
1012
+ for (const [usageName, usages] of usageMap) {
1013
+ if (usageName === entryName) {
1014
+ results.push(...usages);
1015
+ }
1016
+ if (entryName.includes(".")) {
1017
+ const [family, part] = entryName.split(".");
1018
+ if (part === family && usageName === family) {
1019
+ results.push(...usages);
1020
+ }
1021
+ }
1022
+ }
1023
+ return results;
1024
+ }
1025
+ function isPropUsed(propName, usages) {
1026
+ for (const usage of usages) {
1027
+ if (usage.hasSpread)
1028
+ return true;
1029
+ if (usage.booleanProps.has(propName))
1030
+ return true;
1031
+ if (usage.props.has(propName))
1032
+ return true;
1033
+ }
1034
+ return false;
1035
+ }
1036
+ function getUsedEnumValues(slotName, usages) {
1037
+ const values = new Set;
1038
+ for (const usage of usages) {
1039
+ if (usage.hasSpread)
1040
+ return "ALL";
1041
+ const val = usage.props.get(slotName);
1042
+ if (val === "DYNAMIC")
1043
+ return "ALL";
1044
+ if (val !== undefined)
1045
+ values.add(val);
1046
+ if (usage.booleanProps.has(slotName))
1047
+ return "ALL";
1048
+ }
1049
+ return values;
1050
+ }
1051
+ async function scanConsumerSource(srcDir) {
1052
+ const allUsages = [];
1053
+ const glob = new Glob("**/*.{tsx,ts,jsx,js}");
1054
+ for await (const relPath of glob.scan({ cwd: srcDir })) {
1055
+ if (relPath.includes("node_modules"))
1056
+ continue;
1057
+ const fullPath = path.join(srcDir, relPath);
1058
+ const code = await Bun.file(fullPath).text();
1059
+ if (!code.includes("@pathscale/ui"))
1060
+ continue;
1061
+ const isTsx = /\.[tj]sx$/.test(relPath);
1062
+ const ast = await swc.parse(code, { syntax: "typescript", tsx: isTsx });
1063
+ const uiImports = extractUIImports(ast);
1064
+ if (uiImports.size === 0)
1065
+ continue;
1066
+ allUsages.push(...extractJSXUsages(ast, uiImports));
1067
+ }
1068
+ return allUsages;
1069
+ }
1070
+ if (false) {}
1071
+
1072
+ // src/postbuild-purge.ts
1073
+ function parseArgs(argv) {
1074
+ const args = argv.slice(2);
1075
+ let distDir = "./dist";
1076
+ let srcDir = "./src";
1077
+ let manifestPath = "";
1078
+ for (let i = 0;i < args.length; i++) {
1079
+ if (args[i] === "--dist" && args[i + 1])
1080
+ distDir = args[++i];
1081
+ else if (args[i] === "--src" && args[i + 1])
1082
+ srcDir = args[++i];
1083
+ else if (args[i] === "--manifest" && args[i + 1])
1084
+ manifestPath = args[++i];
1085
+ }
1086
+ if (!manifestPath) {
1087
+ console.error("Usage: bunx @pathscale/rsbuild-plugin-ui-css-purge --manifest <path> [--dist <path>] [--src <path>]");
1088
+ process.exit(1);
1089
+ }
1090
+ return { distDir, srcDir, manifestPath };
1091
+ }
1092
+ function collectClassesFromEntry(entry) {
1093
+ const result = [...entry.classes.always];
1094
+ for (const value of Object.values(entry.classes.byProp)) {
1095
+ if (Array.isArray(value)) {
1096
+ result.push(...value);
1097
+ } else {
1098
+ for (const classes of Object.values(value)) {
1099
+ result.push(...classes);
1100
+ }
1101
+ }
1102
+ }
1103
+ return result;
1104
+ }
1105
+ function buildKillList(manifest, importedComponents) {
1106
+ const componentBemRoots = new Map;
1107
+ for (const [key, entry] of Object.entries(manifest)) {
1108
+ const root = key.split(".")[0];
1109
+ const existing = componentBemRoots.get(root) ?? new Set;
1110
+ for (const cls of entry.classes.always) {
1111
+ existing.add(cls);
1112
+ }
1113
+ componentBemRoots.set(root, existing);
1114
+ }
1115
+ const componentClasses = new Map;
1116
+ for (const [key, entry] of Object.entries(manifest)) {
1117
+ const root = key.split(".")[0];
1118
+ const existing = componentClasses.get(root) ?? [];
1119
+ existing.push(...collectClassesFromEntry(entry));
1120
+ componentClasses.set(root, existing);
1121
+ }
1122
+ function isBemClass(cls, bemRoots) {
1123
+ for (const root of bemRoots) {
1124
+ if (cls === root || cls.startsWith(`${root}--`) || cls.startsWith(`${root}__`)) {
1125
+ return true;
1126
+ }
1127
+ }
1128
+ return false;
1129
+ }
1130
+ const killList = new Set;
1131
+ const safeClasses = new Set;
1132
+ for (const [component, classes] of componentClasses) {
1133
+ const bemRoots = componentBemRoots.get(component) ?? new Set;
1134
+ if (importedComponents.has(component)) {
1135
+ for (const cls of classes)
1136
+ safeClasses.add(cls);
1137
+ } else {
1138
+ for (const cls of classes) {
1139
+ if (isBemClass(cls, bemRoots)) {
1140
+ killList.add(cls);
1141
+ }
1142
+ }
1143
+ }
1144
+ }
1145
+ for (const cls of safeClasses) {
1146
+ killList.delete(cls);
1147
+ }
1148
+ return killList;
1149
+ }
1150
+ function kebabToPascal(s) {
1151
+ return s.split("-").map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join("");
1152
+ }
1153
+ async function scanImportedComponents(srcDir) {
1154
+ const imported = new Set;
1155
+ const glob = new Glob2("**/*.{tsx,ts,jsx,js}");
1156
+ for await (const relPath of glob.scan({ cwd: srcDir })) {
1157
+ if (relPath.includes("node_modules"))
1158
+ continue;
1159
+ const fullPath = `${srcDir}/${relPath}`;
1160
+ const code = await Bun.file(fullPath).text();
1161
+ if (!code.includes("@pathscale/ui"))
1162
+ continue;
1163
+ const barrelRegex = /import\s*\{([^}]+)\}\s*from\s*['"]@pathscale\/ui['"]/g;
1164
+ for (const match of code.matchAll(barrelRegex)) {
1165
+ const specifiers = match[1].split(",");
1166
+ for (const spec of specifiers) {
1167
+ const trimmed = spec.trim();
1168
+ if (trimmed.startsWith("type "))
1169
+ continue;
1170
+ const name = trimmed.split(/\s+as\s+/)[0].trim();
1171
+ if (name && /^[A-Z]/.test(name)) {
1172
+ imported.add(name);
1173
+ }
1174
+ }
1175
+ }
1176
+ const deepDefaultRegex = /import\s+([A-Z][a-zA-Z0-9]*)\s+from\s*['"]@pathscale\/ui\/components\/([^'"]+)['"]/g;
1177
+ for (const match of code.matchAll(deepDefaultRegex)) {
1178
+ imported.add(match[1]);
1179
+ }
1180
+ const deepNamedRegex = /import\s*\{([^}]+)\}\s*from\s*['"]@pathscale\/ui\/components\/([^'"]+)['"]/g;
1181
+ for (const match of code.matchAll(deepNamedRegex)) {
1182
+ const specifiers = match[1].split(",");
1183
+ for (const spec of specifiers) {
1184
+ const trimmed = spec.trim();
1185
+ if (trimmed.startsWith("type "))
1186
+ continue;
1187
+ const name = trimmed.split(/\s+as\s+/)[0].trim();
1188
+ if (name && /^[A-Z]/.test(name)) {
1189
+ imported.add(name);
1190
+ }
1191
+ }
1192
+ const dirName = match[2].split("/")[0];
1193
+ imported.add(kebabToPascal(dirName));
1194
+ }
1195
+ }
1196
+ return imported;
1197
+ }
1198
+ function buildDepGraphFromManifest(manifest) {
1199
+ const graph = new Map;
1200
+ for (const [key, entry] of Object.entries(manifest)) {
1201
+ const root = key.split(".")[0];
1202
+ if (entry.deps && entry.deps.length > 0 && !graph.has(root)) {
1203
+ graph.set(root, new Set(entry.deps));
1204
+ }
1205
+ }
1206
+ return graph;
1207
+ }
1208
+ function resolveTransitiveDeps(imported, depGraph) {
1209
+ const resolved = new Set(imported);
1210
+ const queue = [...imported];
1211
+ while (queue.length > 0) {
1212
+ const comp = queue.pop();
1213
+ const deps = depGraph.get(comp);
1214
+ if (!deps)
1215
+ continue;
1216
+ for (const dep of deps) {
1217
+ if (!resolved.has(dep)) {
1218
+ resolved.add(dep);
1219
+ queue.push(dep);
1220
+ }
1221
+ }
1222
+ }
1223
+ return resolved;
1224
+ }
1225
+ function unescapeCss(s) {
1226
+ return s.replace(/\\(.)/g, "$1");
1227
+ }
1228
+ function extractClassesFromSelector(selector) {
1229
+ const matches = selector.matchAll(/\.([a-zA-Z_-](?:[a-zA-Z0-9_-]|\\[^\s])*)/g);
1230
+ return [...matches].map((m) => unescapeCss(m[1]));
1231
+ }
1232
+ var ALWAYS_KEEP_SELECTORS = new Set([
1233
+ "*",
1234
+ "html",
1235
+ "body",
1236
+ ":root",
1237
+ "::before",
1238
+ "::after",
1239
+ ":before",
1240
+ ":after",
1241
+ "::backdrop"
1242
+ ]);
1243
+ function isKeepableNonClassSelector(sel) {
1244
+ const stripped = sel.trim();
1245
+ for (const el of ALWAYS_KEEP_SELECTORS) {
1246
+ if (stripped === el)
1247
+ return true;
1248
+ if (stripped.startsWith(el + ":") || stripped.startsWith(el + "[") || stripped.startsWith(el + " "))
1249
+ return true;
1250
+ }
1251
+ if (/^:root/.test(stripped))
1252
+ return true;
1253
+ if (/^\[data-theme/.test(stripped))
1254
+ return true;
1255
+ if (/^\[hidden/.test(stripped))
1256
+ return true;
1257
+ return false;
1258
+ }
1259
+ function purgeClasses(css, killList) {
1260
+ const root = postcss.parse(css);
1261
+ root.walkRules((rule) => {
1262
+ const selectors = rule.selectors;
1263
+ const kept = [];
1264
+ for (const sel of selectors) {
1265
+ const classes = extractClassesFromSelector(sel);
1266
+ if (classes.length === 0) {
1267
+ if (isKeepableNonClassSelector(sel)) {
1268
+ kept.push(sel);
1269
+ }
1270
+ continue;
1271
+ }
1272
+ if (classes.some((c) => !killList.has(c))) {
1273
+ kept.push(sel);
1274
+ }
1275
+ }
1276
+ if (kept.length === 0) {
1277
+ rule.remove();
1278
+ } else if (kept.length < selectors.length) {
1279
+ rule.selectors = kept;
1280
+ }
1281
+ });
1282
+ const usedKeyframes = new Set;
1283
+ root.walkDecls(/^animation(-name)?$/, (decl) => {
1284
+ for (const part of decl.value.split(",")) {
1285
+ const name = part.trim().split(/\s+/)[0];
1286
+ if (name && name !== "none" && name !== "initial" && name !== "inherit") {
1287
+ usedKeyframes.add(name);
1288
+ }
1289
+ }
1290
+ });
1291
+ root.walkAtRules("keyframes", (atRule) => {
1292
+ if (!usedKeyframes.has(atRule.params.trim())) {
1293
+ atRule.remove();
1294
+ }
1295
+ });
1296
+ const usedFonts = new Set;
1297
+ root.walkDecls(/^font(-family)?$/, (decl) => {
1298
+ for (const part of decl.value.split(",")) {
1299
+ const name = part.trim().replace(/^["']|["']$/g, "");
1300
+ if (name)
1301
+ usedFonts.add(name);
1302
+ }
1303
+ });
1304
+ root.walkAtRules("font-face", (atRule) => {
1305
+ let family = "";
1306
+ atRule.walkDecls("font-family", (decl) => {
1307
+ family = decl.value.trim().replace(/^["']|["']$/g, "");
1308
+ });
1309
+ if (family && !usedFonts.has(family)) {
1310
+ atRule.remove();
1311
+ }
1312
+ });
1313
+ let cleaned = true;
1314
+ while (cleaned) {
1315
+ cleaned = false;
1316
+ root.walkAtRules((atRule) => {
1317
+ if (atRule.nodes && atRule.nodes.length === 0) {
1318
+ atRule.remove();
1319
+ cleaned = true;
1320
+ }
1321
+ });
1322
+ }
1323
+ return root.toString();
1324
+ }
1325
+ function purgeAttributes(css, attrSafelist) {
1326
+ const root = postcss.parse(css);
1327
+ root.walkRules((rule) => {
1328
+ const selectors = rule.selectors;
1329
+ const kept = [];
1330
+ for (const sel of selectors) {
1331
+ const attrMatches = sel.matchAll(/\[(data-[a-z-]+|aria-[a-z-]+)="([^"]+)"\]/g);
1332
+ let shouldKeep = true;
1333
+ for (const match of attrMatches) {
1334
+ if (match[1] === "data-slot")
1335
+ continue;
1336
+ const attrSelector = `[${match[1]}="${match[2]}"]`;
1337
+ if (!attrSafelist.has(attrSelector)) {
1338
+ shouldKeep = false;
1339
+ break;
1340
+ }
1341
+ }
1342
+ if (shouldKeep)
1343
+ kept.push(sel);
1344
+ }
1345
+ if (kept.length === 0) {
1346
+ rule.remove();
1347
+ } else if (kept.length < selectors.length) {
1348
+ rule.selectors = kept;
1349
+ }
1350
+ });
1351
+ return root.toString();
1352
+ }
1353
+ function cleanUnusedVars(css) {
1354
+ let changed = true;
1355
+ let result = css;
1356
+ while (changed) {
1357
+ changed = false;
1358
+ const root = postcss.parse(result);
1359
+ const declared = new Map;
1360
+ root.walkDecls(/^--/, (decl) => {
1361
+ const entries = declared.get(decl.prop) ?? [];
1362
+ entries.push({ rule: decl.parent, prop: decl.prop });
1363
+ declared.set(decl.prop, entries);
1364
+ });
1365
+ const referenced = new Set;
1366
+ root.walkDecls((decl) => {
1367
+ const refs = decl.value.matchAll(/var\(\s*(--[a-zA-Z0-9_-]+)/g);
1368
+ for (const ref of refs)
1369
+ referenced.add(ref[1]);
1370
+ });
1371
+ for (const [varName, entries] of declared) {
1372
+ if (!referenced.has(varName)) {
1373
+ for (const entry of entries) {
1374
+ entry.rule.walkDecls(entry.prop, (decl) => {
1375
+ decl.remove();
1376
+ changed = true;
1377
+ });
1378
+ }
1379
+ }
1380
+ }
1381
+ root.walkRules((rule) => {
1382
+ if (rule.nodes && rule.nodes.length === 0)
1383
+ rule.remove();
1384
+ });
1385
+ root.walkAtRules((atRule) => {
1386
+ if (atRule.nodes && atRule.nodes.length === 0)
1387
+ atRule.remove();
1388
+ });
1389
+ result = root.toString();
1390
+ }
1391
+ return result;
1392
+ }
1393
+ function minify(css) {
1394
+ const { code } = transform({
1395
+ filename: "purged.css",
1396
+ code: Buffer.from(css),
1397
+ minify: true,
1398
+ errorRecovery: true
1399
+ });
1400
+ return code.toString();
1401
+ }
1402
+ async function main() {
1403
+ const { distDir, srcDir, manifestPath } = parseArgs(process.argv);
1404
+ const manifest = JSON.parse(await Bun.file(manifestPath).text());
1405
+ const totalComponents = new Set(Object.keys(manifest).map((k) => k.split(".")[0])).size;
1406
+ console.log(`[css-purge] Manifest loaded: ${Object.keys(manifest).length} entries (${totalComponents} components)`);
1407
+ const directImports = await scanImportedComponents(srcDir);
1408
+ console.log(`[css-purge] Direct imports from app: ${directImports.size} / ${totalComponents}`);
1409
+ const depGraph = buildDepGraphFromManifest(manifest);
1410
+ const importedComponents = resolveTransitiveDeps(directImports, depGraph);
1411
+ const transitive = importedComponents.size - directImports.size;
1412
+ console.log(`[css-purge] Transitive deps: +${transitive} \u2192 ${importedComponents.size} total used components`);
1413
+ const killList = buildKillList(manifest, importedComponents);
1414
+ console.log(`[css-purge] Kill-list: ${killList.size} classes from ${totalComponents - importedComponents.size} unused components`);
1415
+ const usages = await scanConsumerSource(srcDir);
1416
+ const { attrSafelist } = buildSafelists(usages, manifest);
1417
+ const glob = new Glob2("**/*.css");
1418
+ let totalBefore = 0;
1419
+ let totalAfter = 0;
1420
+ for await (const relPath of glob.scan({ cwd: distDir })) {
1421
+ const fullPath = `${distDir}/${relPath}`;
1422
+ const originalCss = await Bun.file(fullPath).text();
1423
+ const originalSize = Buffer.byteLength(originalCss, "utf-8");
1424
+ totalBefore += originalSize;
1425
+ console.log(`[css-purge] Processing ${relPath} (${(originalSize / 1024).toFixed(1)} KB)`);
1426
+ let purgedCss = purgeClasses(originalCss, killList);
1427
+ const afterL1 = Buffer.byteLength(purgedCss, "utf-8");
1428
+ console.log(`[css-purge] L1 class purge: ${(originalSize / 1024).toFixed(1)} \u2192 ${(afterL1 / 1024).toFixed(1)} KB`);
1429
+ purgedCss = purgeAttributes(purgedCss, attrSafelist);
1430
+ const afterL2 = Buffer.byteLength(purgedCss, "utf-8");
1431
+ console.log(`[css-purge] L2 attr purge: ${(afterL1 / 1024).toFixed(1)} \u2192 ${(afterL2 / 1024).toFixed(1)} KB`);
1432
+ purgedCss = cleanUnusedVars(purgedCss);
1433
+ const afterL3 = Buffer.byteLength(purgedCss, "utf-8");
1434
+ console.log(`[css-purge] L3 var cleanup: \u2192 ${(afterL3 / 1024).toFixed(1)} KB`);
1435
+ purgedCss = minify(purgedCss);
1436
+ const finalSize = Buffer.byteLength(purgedCss, "utf-8");
1437
+ totalAfter += finalSize;
1438
+ console.log(`[css-purge] Minify (lightningcss): \u2192 ${(finalSize / 1024).toFixed(1)} KB`);
1439
+ console.log(`[css-purge] Final: ${(originalSize / 1024).toFixed(1)} \u2192 ${(finalSize / 1024).toFixed(1)} KB (${((1 - finalSize / originalSize) * 100).toFixed(1)}% reduction)`);
1440
+ await Bun.write(fullPath, purgedCss);
1441
+ }
1442
+ console.log(`
1443
+ [css-purge] Total: ${(totalBefore / 1024).toFixed(1)} \u2192 ${(totalAfter / 1024).toFixed(1)} KB (${((1 - totalAfter / totalBefore) * 100).toFixed(1)}% reduction)`);
1444
+ }
1445
+ main();
1446
+
1447
+ //# debugId=044B62D65705AFE764756E2164756E21
1448
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2RldGVjdC1saWJjL2xpYi9wcm9jZXNzLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9kZXRlY3QtbGliYy9saWIvZmlsZXN5c3RlbS5qcyIsICIuLi9ub2RlX21vZHVsZXMvZGV0ZWN0LWxpYmMvbGliL2VsZi5qcyIsICIuLi9ub2RlX21vZHVsZXMvZGV0ZWN0LWxpYmMvbGliL2RldGVjdC1saWJjLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9saWdodG5pbmdjc3Mvbm9kZS9icm93c2Vyc2xpc3RUb1RhcmdldHMuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy9ub2RlL2NvbXBvc2VWaXNpdG9ycy5qcyIsICIuLi9ub2RlX21vZHVsZXMvbGlnaHRuaW5nY3NzL25vZGUvZmxhZ3MuanMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy9ub2RlL2luZGV4LmpzIiwgIi4uL3NyYy9wb3N0YnVpbGQtcHVyZ2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xpZ2h0bmluZ2Nzcy9ub2RlL2luZGV4Lm1qcyIsICIuLi9zcmMvc2Nhbi1jb25zdW1lci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvLyBDb3B5cmlnaHQgMjAxNyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzTGludXggPSAoKSA9PiBwcm9jZXNzLnBsYXRmb3JtID09PSAnbGludXgnO1xuXG5sZXQgcmVwb3J0ID0gbnVsbDtcbmNvbnN0IGdldFJlcG9ydCA9ICgpID0+IHtcbiAgaWYgKCFyZXBvcnQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmIChpc0xpbnV4KCkgJiYgcHJvY2Vzcy5yZXBvcnQpIHtcbiAgICAgIGNvbnN0IG9yaWcgPSBwcm9jZXNzLnJlcG9ydC5leGNsdWRlTmV0d29yaztcbiAgICAgIHByb2Nlc3MucmVwb3J0LmV4Y2x1ZGVOZXR3b3JrID0gdHJ1ZTtcbiAgICAgIHJlcG9ydCA9IHByb2Nlc3MucmVwb3J0LmdldFJlcG9ydCgpO1xuICAgICAgcHJvY2Vzcy5yZXBvcnQuZXhjbHVkZU5ldHdvcmsgPSBvcmlnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXBvcnQgPSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcG9ydDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0geyBpc0xpbnV4LCBnZXRSZXBvcnQgfTtcbiIsCiAgICAiLy8gQ29weXJpZ2h0IDIwMTcgTG92ZWxsIEZ1bGxlciBhbmQgb3RoZXJzLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmNvbnN0IExERF9QQVRIID0gJy91c3IvYmluL2xkZCc7XG5jb25zdCBTRUxGX1BBVEggPSAnL3Byb2Mvc2VsZi9leGUnO1xuY29uc3QgTUFYX0xFTkdUSCA9IDIwNDg7XG5cbi8qKlxuICogUmVhZCB0aGUgY29udGVudCBvZiBhIGZpbGUgc3luY2hyb25vdXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHJldHVybnMge0J1ZmZlcn1cbiAqL1xuY29uc3QgcmVhZEZpbGVTeW5jID0gKHBhdGgpID0+IHtcbiAgY29uc3QgZmQgPSBmcy5vcGVuU3luYyhwYXRoLCAncicpO1xuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoTUFYX0xFTkdUSCk7XG4gIGNvbnN0IGJ5dGVzUmVhZCA9IGZzLnJlYWRTeW5jKGZkLCBidWZmZXIsIDAsIE1BWF9MRU5HVEgsIDApO1xuICBmcy5jbG9zZShmZCwgKCkgPT4ge30pO1xuICByZXR1cm4gYnVmZmVyLnN1YmFycmF5KDAsIGJ5dGVzUmVhZCk7XG59O1xuXG4vKipcbiAqIFJlYWQgdGhlIGNvbnRlbnQgb2YgYSBmaWxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59XG4gKi9cbmNvbnN0IHJlYWRGaWxlID0gKHBhdGgpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgZnMub3BlbihwYXRoLCAncicsIChlcnIsIGZkKSA9PiB7XG4gICAgaWYgKGVycikge1xuICAgICAgcmVqZWN0KGVycik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhNQVhfTEVOR1RIKTtcbiAgICAgIGZzLnJlYWQoZmQsIGJ1ZmZlciwgMCwgTUFYX0xFTkdUSCwgMCwgKF8sIGJ5dGVzUmVhZCkgPT4ge1xuICAgICAgICByZXNvbHZlKGJ1ZmZlci5zdWJhcnJheSgwLCBieXRlc1JlYWQpKTtcbiAgICAgICAgZnMuY2xvc2UoZmQsICgpID0+IHt9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIExERF9QQVRILFxuICBTRUxGX1BBVEgsXG4gIHJlYWRGaWxlU3luYyxcbiAgcmVhZEZpbGVcbn07XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDE3IExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgaW50ZXJwcmV0ZXJQYXRoID0gKGVsZikgPT4ge1xuICBpZiAoZWxmLmxlbmd0aCA8IDY0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZi5yZWFkVUludDMyQkUoMCkgIT09IDB4N0Y0NTRDNDYpIHtcbiAgICAvLyBVbmV4cGVjdGVkIG1hZ2ljIGJ5dGVzXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZi5yZWFkVUludDgoNCkgIT09IDIpIHtcbiAgICAvLyBOb3QgYSA2NC1iaXQgRUxGXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZi5yZWFkVUludDgoNSkgIT09IDEpIHtcbiAgICAvLyBOb3QgbGl0dGxlLWVuZGlhblxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IG9mZnNldCA9IGVsZi5yZWFkVUludDMyTEUoMzIpO1xuICBjb25zdCBzaXplID0gZWxmLnJlYWRVSW50MTZMRSg1NCk7XG4gIGNvbnN0IGNvdW50ID0gZWxmLnJlYWRVSW50MTZMRSg1Nik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGNvbnN0IGhlYWRlck9mZnNldCA9IG9mZnNldCArIChpICogc2l6ZSk7XG4gICAgY29uc3QgdHlwZSA9IGVsZi5yZWFkVUludDMyTEUoaGVhZGVyT2Zmc2V0KTtcbiAgICBpZiAodHlwZSA9PT0gMykge1xuICAgICAgY29uc3QgZmlsZU9mZnNldCA9IGVsZi5yZWFkVUludDMyTEUoaGVhZGVyT2Zmc2V0ICsgOCk7XG4gICAgICBjb25zdCBmaWxlU2l6ZSA9IGVsZi5yZWFkVUludDMyTEUoaGVhZGVyT2Zmc2V0ICsgMzIpO1xuICAgICAgcmV0dXJuIGVsZi5zdWJhcnJheShmaWxlT2Zmc2V0LCBmaWxlT2Zmc2V0ICsgZmlsZVNpemUpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwwLiokL2csICcnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaW50ZXJwcmV0ZXJQYXRoXG59O1xuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxNyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNoaWxkUHJvY2VzcyA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTtcbmNvbnN0IHsgaXNMaW51eCwgZ2V0UmVwb3J0IH0gPSByZXF1aXJlKCcuL3Byb2Nlc3MnKTtcbmNvbnN0IHsgTEREX1BBVEgsIFNFTEZfUEFUSCwgcmVhZEZpbGUsIHJlYWRGaWxlU3luYyB9ID0gcmVxdWlyZSgnLi9maWxlc3lzdGVtJyk7XG5jb25zdCB7IGludGVycHJldGVyUGF0aCB9ID0gcmVxdWlyZSgnLi9lbGYnKTtcblxubGV0IGNhY2hlZEZhbWlseUludGVycHJldGVyO1xubGV0IGNhY2hlZEZhbWlseUZpbGVzeXN0ZW07XG5sZXQgY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW07XG5cbmNvbnN0IGNvbW1hbmQgPSAnZ2V0Y29uZiBHTlVfTElCQ19WRVJTSU9OIDI+JjEgfHwgdHJ1ZTsgbGRkIC0tdmVyc2lvbiAyPiYxIHx8IHRydWUnO1xubGV0IGNvbW1hbmRPdXQgPSAnJztcblxuY29uc3Qgc2FmZUNvbW1hbmQgPSAoKSA9PiB7XG4gIGlmICghY29tbWFuZE91dCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgY2hpbGRQcm9jZXNzLmV4ZWMoY29tbWFuZCwgKGVyciwgb3V0KSA9PiB7XG4gICAgICAgIGNvbW1hbmRPdXQgPSBlcnIgPyAnICcgOiBvdXQ7XG4gICAgICAgIHJlc29sdmUoY29tbWFuZE91dCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29tbWFuZE91dDtcbn07XG5cbmNvbnN0IHNhZmVDb21tYW5kU3luYyA9ICgpID0+IHtcbiAgaWYgKCFjb21tYW5kT3V0KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbW1hbmRPdXQgPSBjaGlsZFByb2Nlc3MuZXhlY1N5bmMoY29tbWFuZCwgeyBlbmNvZGluZzogJ3V0ZjgnIH0pO1xuICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgIGNvbW1hbmRPdXQgPSAnICc7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb21tYW5kT3V0O1xufTtcblxuLyoqXG4gKiBBIFN0cmluZyBjb25zdGFudCBjb250YWluaW5nIHRoZSB2YWx1ZSBgZ2xpYmNgLlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgR0xJQkMgPSAnZ2xpYmMnO1xuXG4vKipcbiAqIEEgUmVnZXhwIGNvbnN0YW50IHRvIGdldCB0aGUgR0xJQkMgVmVyc2lvbi5cbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmNvbnN0IFJFX0dMSUJDX1ZFUlNJT04gPSAvTElCQ1thLXowLTkgXFwtKS5dKj8oXFxkK1xcLlxcZCspL2k7XG5cbi8qKlxuICogQSBTdHJpbmcgY29uc3RhbnQgY29udGFpbmluZyB0aGUgdmFsdWUgYG11c2xgLlxuICogQHR5cGUge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgTVVTTCA9ICdtdXNsJztcblxuY29uc3QgaXNGaWxlTXVzbCA9IChmKSA9PiBmLmluY2x1ZGVzKCdsaWJjLm11c2wtJykgfHwgZi5pbmNsdWRlcygnbGQtbXVzbC0nKTtcblxuY29uc3QgZmFtaWx5RnJvbVJlcG9ydCA9ICgpID0+IHtcbiAgY29uc3QgcmVwb3J0ID0gZ2V0UmVwb3J0KCk7XG4gIGlmIChyZXBvcnQuaGVhZGVyICYmIHJlcG9ydC5oZWFkZXIuZ2xpYmNWZXJzaW9uUnVudGltZSkge1xuICAgIHJldHVybiBHTElCQztcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShyZXBvcnQuc2hhcmVkT2JqZWN0cykpIHtcbiAgICBpZiAocmVwb3J0LnNoYXJlZE9iamVjdHMuc29tZShpc0ZpbGVNdXNsKSkge1xuICAgICAgcmV0dXJuIE1VU0w7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUNvbW1hbmQgPSAob3V0KSA9PiB7XG4gIGNvbnN0IFtnZXRjb25mLCBsZGQxXSA9IG91dC5zcGxpdCgvW1xcclxcbl0rLyk7XG4gIGlmIChnZXRjb25mICYmIGdldGNvbmYuaW5jbHVkZXMoR0xJQkMpKSB7XG4gICAgcmV0dXJuIEdMSUJDO1xuICB9XG4gIGlmIChsZGQxICYmIGxkZDEuaW5jbHVkZXMoTVVTTCkpIHtcbiAgICByZXR1cm4gTVVTTDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmNvbnN0IGZhbWlseUZyb21JbnRlcnByZXRlclBhdGggPSAocGF0aCkgPT4ge1xuICBpZiAocGF0aCkge1xuICAgIGlmIChwYXRoLmluY2x1ZGVzKCcvbGQtbXVzbC0nKSkge1xuICAgICAgcmV0dXJuIE1VU0w7XG4gICAgfSBlbHNlIGlmIChwYXRoLmluY2x1ZGVzKCcvbGQtbGludXgtJykpIHtcbiAgICAgIHJldHVybiBHTElCQztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5jb25zdCBnZXRGYW1pbHlGcm9tTGRkQ29udGVudCA9IChjb250ZW50KSA9PiB7XG4gIGNvbnRlbnQgPSBjb250ZW50LnRvU3RyaW5nKCk7XG4gIGlmIChjb250ZW50LmluY2x1ZGVzKCdtdXNsJykpIHtcbiAgICByZXR1cm4gTVVTTDtcbiAgfVxuICBpZiAoY29udGVudC5pbmNsdWRlcygnR05VIEMgTGlicmFyeScpKSB7XG4gICAgcmV0dXJuIEdMSUJDO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUZpbGVzeXN0ZW0gPSBhc3luYyAoKSA9PiB7XG4gIGlmIChjYWNoZWRGYW1pbHlGaWxlc3lzdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkRmFtaWx5RmlsZXN5c3RlbTtcbiAgfVxuICBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZGRDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoTEREX1BBVEgpO1xuICAgIGNhY2hlZEZhbWlseUZpbGVzeXN0ZW0gPSBnZXRGYW1pbHlGcm9tTGRkQ29udGVudChsZGRDb250ZW50KTtcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIGNhY2hlZEZhbWlseUZpbGVzeXN0ZW07XG59O1xuXG5jb25zdCBmYW1pbHlGcm9tRmlsZXN5c3RlbVN5bmMgPSAoKSA9PiB7XG4gIGlmIChjYWNoZWRGYW1pbHlGaWxlc3lzdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkRmFtaWx5RmlsZXN5c3RlbTtcbiAgfVxuICBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZGRDb250ZW50ID0gcmVhZEZpbGVTeW5jKExERF9QQVRIKTtcbiAgICBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtID0gZ2V0RmFtaWx5RnJvbUxkZENvbnRlbnQobGRkQ29udGVudCk7XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHJldHVybiBjYWNoZWRGYW1pbHlGaWxlc3lzdGVtO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUludGVycHJldGVyID0gYXN5bmMgKCkgPT4ge1xuICBpZiAoY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjYWNoZWRGYW1pbHlJbnRlcnByZXRlcjtcbiAgfVxuICBjYWNoZWRGYW1pbHlJbnRlcnByZXRlciA9IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3Qgc2VsZkNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShTRUxGX1BBVEgpO1xuICAgIGNvbnN0IHBhdGggPSBpbnRlcnByZXRlclBhdGgoc2VsZkNvbnRlbnQpO1xuICAgIGNhY2hlZEZhbWlseUludGVycHJldGVyID0gZmFtaWx5RnJvbUludGVycHJldGVyUGF0aChwYXRoKTtcbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIGNhY2hlZEZhbWlseUludGVycHJldGVyO1xufTtcblxuY29uc3QgZmFtaWx5RnJvbUludGVycHJldGVyU3luYyA9ICgpID0+IHtcbiAgaWYgKGNhY2hlZEZhbWlseUludGVycHJldGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXI7XG4gIH1cbiAgY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXIgPSBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IHNlbGZDb250ZW50ID0gcmVhZEZpbGVTeW5jKFNFTEZfUEFUSCk7XG4gICAgY29uc3QgcGF0aCA9IGludGVycHJldGVyUGF0aChzZWxmQ29udGVudCk7XG4gICAgY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXIgPSBmYW1pbHlGcm9tSW50ZXJwcmV0ZXJQYXRoKHBhdGgpO1xuICB9IGNhdGNoIChlKSB7fVxuICByZXR1cm4gY2FjaGVkRmFtaWx5SW50ZXJwcmV0ZXI7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHdpdGggdGhlIGxpYmMgZmFtaWx5IHdoZW4gaXQgY2FuIGJlIGRldGVybWluZWQsIGBudWxsYCBvdGhlcndpc2UuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTw/c3RyaW5nPn1cbiAqL1xuY29uc3QgZmFtaWx5ID0gYXN5bmMgKCkgPT4ge1xuICBsZXQgZmFtaWx5ID0gbnVsbDtcbiAgaWYgKGlzTGludXgoKSkge1xuICAgIGZhbWlseSA9IGF3YWl0IGZhbWlseUZyb21JbnRlcnByZXRlcigpO1xuICAgIGlmICghZmFtaWx5KSB7XG4gICAgICBmYW1pbHkgPSBhd2FpdCBmYW1pbHlGcm9tRmlsZXN5c3RlbSgpO1xuICAgICAgaWYgKCFmYW1pbHkpIHtcbiAgICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbVJlcG9ydCgpO1xuICAgICAgfVxuICAgICAgaWYgKCFmYW1pbHkpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0gYXdhaXQgc2FmZUNvbW1hbmQoKTtcbiAgICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbUNvbW1hbmQob3V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbWlseTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbGliYyBmYW1pbHkgd2hlbiBpdCBjYW4gYmUgZGV0ZXJtaW5lZCwgYG51bGxgIG90aGVyd2lzZS5cbiAqIEByZXR1cm5zIHs/c3RyaW5nfVxuICovXG5jb25zdCBmYW1pbHlTeW5jID0gKCkgPT4ge1xuICBsZXQgZmFtaWx5ID0gbnVsbDtcbiAgaWYgKGlzTGludXgoKSkge1xuICAgIGZhbWlseSA9IGZhbWlseUZyb21JbnRlcnByZXRlclN5bmMoKTtcbiAgICBpZiAoIWZhbWlseSkge1xuICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbUZpbGVzeXN0ZW1TeW5jKCk7XG4gICAgICBpZiAoIWZhbWlseSkge1xuICAgICAgICBmYW1pbHkgPSBmYW1pbHlGcm9tUmVwb3J0KCk7XG4gICAgICB9XG4gICAgICBpZiAoIWZhbWlseSkge1xuICAgICAgICBjb25zdCBvdXQgPSBzYWZlQ29tbWFuZFN5bmMoKTtcbiAgICAgICAgZmFtaWx5ID0gZmFtaWx5RnJvbUNvbW1hbmQob3V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbWlseTtcbn07XG5cbi8qKlxuICogUmVzb2x2ZXMgYHRydWVgIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gaXMgTGludXggYW5kIHRoZSBsaWJjIGZhbWlseSBpcyBub3QgYGdsaWJjYC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICovXG5jb25zdCBpc05vbkdsaWJjTGludXggPSBhc3luYyAoKSA9PiBpc0xpbnV4KCkgJiYgYXdhaXQgZmFtaWx5KCkgIT09IEdMSUJDO1xuXG4vKipcbiAqIFJldHVybnMgYHRydWVgIG9ubHkgd2hlbiB0aGUgcGxhdGZvcm0gaXMgTGludXggYW5kIHRoZSBsaWJjIGZhbWlseSBpcyBub3QgYGdsaWJjYC5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc05vbkdsaWJjTGludXhTeW5jID0gKCkgPT4gaXNMaW51eCgpICYmIGZhbWlseVN5bmMoKSAhPT0gR0xJQkM7XG5cbmNvbnN0IHZlcnNpb25Gcm9tRmlsZXN5c3RlbSA9IGFzeW5jICgpID0+IHtcbiAgaWYgKGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW07XG4gIH1cbiAgY2FjaGVkVmVyc2lvbkZpbGVzeXN0ZW0gPSBudWxsO1xuICB0cnkge1xuICAgIGNvbnN0IGxkZENvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShMRERfUEFUSCk7XG4gICAgY29uc3QgdmVyc2lvbk1hdGNoID0gbGRkQ29udGVudC5tYXRjaChSRV9HTElCQ19WRVJTSU9OKTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICBjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbSA9IHZlcnNpb25NYXRjaFsxXTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHt9XG4gIHJldHVybiBjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbTtcbn07XG5cbmNvbnN0IHZlcnNpb25Gcm9tRmlsZXN5c3RlbVN5bmMgPSAoKSA9PiB7XG4gIGlmIChjYWNoZWRWZXJzaW9uRmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtO1xuICB9XG4gIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZGRDb250ZW50ID0gcmVhZEZpbGVTeW5jKExERF9QQVRIKTtcbiAgICBjb25zdCB2ZXJzaW9uTWF0Y2ggPSBsZGRDb250ZW50Lm1hdGNoKFJFX0dMSUJDX1ZFUlNJT04pO1xuICAgIGlmICh2ZXJzaW9uTWF0Y2gpIHtcbiAgICAgIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtID0gdmVyc2lvbk1hdGNoWzFdO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge31cbiAgcmV0dXJuIGNhY2hlZFZlcnNpb25GaWxlc3lzdGVtO1xufTtcblxuY29uc3QgdmVyc2lvbkZyb21SZXBvcnQgPSAoKSA9PiB7XG4gIGNvbnN0IHJlcG9ydCA9IGdldFJlcG9ydCgpO1xuICBpZiAocmVwb3J0LmhlYWRlciAmJiByZXBvcnQuaGVhZGVyLmdsaWJjVmVyc2lvblJ1bnRpbWUpIHtcbiAgICByZXR1cm4gcmVwb3J0LmhlYWRlci5nbGliY1ZlcnNpb25SdW50aW1lO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3QgdmVyc2lvblN1ZmZpeCA9IChzKSA9PiBzLnRyaW0oKS5zcGxpdCgvXFxzKy8pWzFdO1xuXG5jb25zdCB2ZXJzaW9uRnJvbUNvbW1hbmQgPSAob3V0KSA9PiB7XG4gIGNvbnN0IFtnZXRjb25mLCBsZGQxLCBsZGQyXSA9IG91dC5zcGxpdCgvW1xcclxcbl0rLyk7XG4gIGlmIChnZXRjb25mICYmIGdldGNvbmYuaW5jbHVkZXMoR0xJQkMpKSB7XG4gICAgcmV0dXJuIHZlcnNpb25TdWZmaXgoZ2V0Y29uZik7XG4gIH1cbiAgaWYgKGxkZDEgJiYgbGRkMiAmJiBsZGQxLmluY2x1ZGVzKE1VU0wpKSB7XG4gICAgcmV0dXJuIHZlcnNpb25TdWZmaXgobGRkMik7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIFJlc29sdmVzIHdpdGggdGhlIGxpYmMgdmVyc2lvbiB3aGVuIGl0IGNhbiBiZSBkZXRlcm1pbmVkLCBgbnVsbGAgb3RoZXJ3aXNlLlxuICogQHJldHVybnMge1Byb21pc2U8P3N0cmluZz59XG4gKi9cbmNvbnN0IHZlcnNpb24gPSBhc3luYyAoKSA9PiB7XG4gIGxldCB2ZXJzaW9uID0gbnVsbDtcbiAgaWYgKGlzTGludXgoKSkge1xuICAgIHZlcnNpb24gPSBhd2FpdCB2ZXJzaW9uRnJvbUZpbGVzeXN0ZW0oKTtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIHZlcnNpb24gPSB2ZXJzaW9uRnJvbVJlcG9ydCgpO1xuICAgIH1cbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIGNvbnN0IG91dCA9IGF3YWl0IHNhZmVDb21tYW5kKCk7XG4gICAgICB2ZXJzaW9uID0gdmVyc2lvbkZyb21Db21tYW5kKG91dCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2ZXJzaW9uO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBsaWJjIHZlcnNpb24gd2hlbiBpdCBjYW4gYmUgZGV0ZXJtaW5lZCwgYG51bGxgIG90aGVyd2lzZS5cbiAqIEByZXR1cm5zIHs/c3RyaW5nfVxuICovXG5jb25zdCB2ZXJzaW9uU3luYyA9ICgpID0+IHtcbiAgbGV0IHZlcnNpb24gPSBudWxsO1xuICBpZiAoaXNMaW51eCgpKSB7XG4gICAgdmVyc2lvbiA9IHZlcnNpb25Gcm9tRmlsZXN5c3RlbVN5bmMoKTtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIHZlcnNpb24gPSB2ZXJzaW9uRnJvbVJlcG9ydCgpO1xuICAgIH1cbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIGNvbnN0IG91dCA9IHNhZmVDb21tYW5kU3luYygpO1xuICAgICAgdmVyc2lvbiA9IHZlcnNpb25Gcm9tQ29tbWFuZChvdXQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmVyc2lvbjtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBHTElCQyxcbiAgTVVTTCxcbiAgZmFtaWx5LFxuICBmYW1pbHlTeW5jLFxuICBpc05vbkdsaWJjTGludXgsXG4gIGlzTm9uR2xpYmNMaW51eFN5bmMsXG4gIHZlcnNpb24sXG4gIHZlcnNpb25TeW5jXG59O1xuIiwKICAgICJjb25zdCBCUk9XU0VSX01BUFBJTkcgPSB7XG4gIGFuZF9jaHI6ICdjaHJvbWUnLFxuICBhbmRfZmY6ICdmaXJlZm94JyxcbiAgaWVfbW9iOiAnaWUnLFxuICBvcF9tb2I6ICdvcGVyYScsXG4gIGFuZF9xcTogbnVsbCxcbiAgYW5kX3VjOiBudWxsLFxuICBiYWlkdTogbnVsbCxcbiAgYmI6IG51bGwsXG4gIGthaW9zOiBudWxsLFxuICBvcF9taW5pOiBudWxsLFxufTtcblxuZnVuY3Rpb24gYnJvd3NlcnNsaXN0VG9UYXJnZXRzKGJyb3dzZXJzbGlzdCkge1xuICBsZXQgdGFyZ2V0cyA9IHt9O1xuICBmb3IgKGxldCBicm93c2VyIG9mIGJyb3dzZXJzbGlzdCkge1xuICAgIGxldCBbbmFtZSwgdl0gPSBicm93c2VyLnNwbGl0KCcgJyk7XG4gICAgaWYgKEJST1dTRVJfTUFQUElOR1tuYW1lXSA9PT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IHZlcnNpb24gPSBwYXJzZVZlcnNpb24odik7XG4gICAgaWYgKHZlcnNpb24gPT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldHNbbmFtZV0gPT0gbnVsbCB8fCB2ZXJzaW9uIDwgdGFyZ2V0c1tuYW1lXSkge1xuICAgICAgdGFyZ2V0c1tuYW1lXSA9IHZlcnNpb247XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldHM7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVmVyc2lvbih2ZXJzaW9uKSB7XG4gIGxldCBbbWFqb3IsIG1pbm9yID0gMCwgcGF0Y2ggPSAwXSA9IHZlcnNpb25cbiAgICAuc3BsaXQoJy0nKVswXVxuICAgIC5zcGxpdCgnLicpXG4gICAgLm1hcCh2ID0+IHBhcnNlSW50KHYsIDEwKSk7XG5cbiAgaWYgKGlzTmFOKG1ham9yKSB8fCBpc05hTihtaW5vcikgfHwgaXNOYU4ocGF0Y2gpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gKG1ham9yIDw8IDE2KSB8IChtaW5vciA8PCA4KSB8IHBhdGNoO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJyb3dzZXJzbGlzdFRvVGFyZ2V0cztcbiIsCiAgICAiLy8gQHRzLWNoZWNrXG4vKiogQHR5cGVkZWYge2ltcG9ydCgnLi9pbmRleCcpLlZpc2l0b3J9IFZpc2l0b3IgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KCcuL2luZGV4JykuVmlzaXRvckZ1bmN0aW9ufSBWaXNpdG9yRnVuY3Rpb24gKi9cblxuLyoqXG4gKiBDb21wb3NlcyBtdWx0aXBsZSB2aXNpdG9yIG9iamVjdHMgaW50byBhIHNpbmdsZSBvbmUuXG4gKiBAcGFyYW0geyhWaXNpdG9yIHwgVmlzaXRvckZ1bmN0aW9uKVtdfSB2aXNpdG9ycyBcbiAqIEByZXR1cm4ge1Zpc2l0b3IgfCBWaXNpdG9yRnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VWaXNpdG9ycyh2aXNpdG9ycykge1xuICBpZiAodmlzaXRvcnMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIHZpc2l0b3JzWzBdO1xuICB9XG4gIFxuICBpZiAodmlzaXRvcnMuc29tZSh2ID0+IHR5cGVvZiB2ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIHJldHVybiAob3B0cykgPT4ge1xuICAgICAgbGV0IHYgPSB2aXNpdG9ycy5tYXAodiA9PiB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJyA/IHYob3B0cykgOiB2KTtcbiAgICAgIHJldHVybiBjb21wb3NlVmlzaXRvcnModik7XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAdHlwZSBWaXNpdG9yICovXG4gIGxldCByZXMgPSB7fTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdTdHlsZVNoZWV0Jyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnU3R5bGVTaGVldEV4aXQnKTtcbiAgY29tcG9zZU9iamVjdFZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdSdWxlJywgcnVsZVZpc2l0b3IsIHdyYXBDdXN0b21BbmRVbmtub3duQXRSdWxlKTtcbiAgY29tcG9zZU9iamVjdFZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdSdWxlRXhpdCcsIHJ1bGVWaXNpdG9yLCB3cmFwQ3VzdG9tQW5kVW5rbm93bkF0UnVsZSk7XG4gIGNvbXBvc2VPYmplY3RWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnRGVjbGFyYXRpb24nLCBkZWNsYXJhdGlvblZpc2l0b3IsIHdyYXBDdXN0b21Qcm9wZXJ0eSk7XG4gIGNvbXBvc2VPYmplY3RWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnRGVjbGFyYXRpb25FeGl0JywgZGVjbGFyYXRpb25WaXNpdG9yLCB3cmFwQ3VzdG9tUHJvcGVydHkpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1VybCcpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0NvbG9yJyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnSW1hZ2UnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdJbWFnZUV4aXQnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdMZW5ndGgnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdBbmdsZScpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1JhdGlvJyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnUmVzb2x1dGlvbicpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ1RpbWUnKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdDdXN0b21JZGVudCcpO1xuICBjb21wb3NlU2ltcGxlVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0Rhc2hlZElkZW50Jyk7XG4gIGNvbXBvc2VBcnJheUZ1bmN0aW9ucyhyZXMsIHZpc2l0b3JzLCAnTWVkaWFRdWVyeScpO1xuICBjb21wb3NlQXJyYXlGdW5jdGlvbnMocmVzLCB2aXNpdG9ycywgJ01lZGlhUXVlcnlFeGl0Jyk7XG4gIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnU3VwcG9ydHNDb25kaXRpb24nKTtcbiAgY29tcG9zZVNpbXBsZVZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdTdXBwb3J0c0NvbmRpdGlvbkV4aXQnKTtcbiAgY29tcG9zZUFycmF5RnVuY3Rpb25zKHJlcywgdmlzaXRvcnMsICdTZWxlY3RvcicpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnVG9rZW4nLCAndG9rZW4nLCBmYWxzZSk7XG4gIGNvbXBvc2VUb2tlblZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdGdW5jdGlvbicsICdmdW5jdGlvbicsIGZhbHNlKTtcbiAgY29tcG9zZVRva2VuVmlzaXRvcnMocmVzLCB2aXNpdG9ycywgJ0Z1bmN0aW9uRXhpdCcsICdmdW5jdGlvbicsIHRydWUpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnVmFyaWFibGUnLCAndmFyJywgZmFsc2UpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnVmFyaWFibGVFeGl0JywgJ3ZhcicsIHRydWUpO1xuICBjb21wb3NlVG9rZW5WaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCAnRW52aXJvbm1lbnRWYXJpYWJsZScsICdlbnYnLCBmYWxzZSk7XG4gIGNvbXBvc2VUb2tlblZpc2l0b3JzKHJlcywgdmlzaXRvcnMsICdFbnZpcm9ubWVudFZhcmlhYmxlRXhpdCcsICdlbnYnLCB0cnVlKTtcbiAgcmV0dXJuIHJlcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb21wb3NlVmlzaXRvcnM7XG5cbmZ1bmN0aW9uIHdyYXBDdXN0b21BbmRVbmtub3duQXRSdWxlKGssIGYpIHtcbiAgaWYgKGsgPT09ICd1bmtub3duJykge1xuICAgIHJldHVybiAodmFsdWUgPT4gZih7IHR5cGU6ICd1bmtub3duJywgdmFsdWUgfSkpO1xuICB9XG4gIGlmIChrID09PSAnY3VzdG9tJykge1xuICAgIHJldHVybiAodmFsdWUgPT4gZih7IHR5cGU6ICdjdXN0b20nLCB2YWx1ZSB9KSk7XG4gIH1cbiAgcmV0dXJuIGY7XG59XG5cbmZ1bmN0aW9uIHdyYXBDdXN0b21Qcm9wZXJ0eShrLCBmKSB7XG4gIHJldHVybiBrID09PSAnY3VzdG9tJyA/ICh2YWx1ZSA9PiBmKHsgcHJvcGVydHk6ICdjdXN0b20nLCB2YWx1ZSB9KSkgOiBmO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2luZGV4JykuVmlzaXRvclsnUnVsZSddfSBmIFxuICogQHBhcmFtIHtpbXBvcnQoJy4vYXN0JykuUnVsZX0gaXRlbSBcbiAqL1xuZnVuY3Rpb24gcnVsZVZpc2l0b3IoZiwgaXRlbSkge1xuICBpZiAodHlwZW9mIGYgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gJ3Vua25vd24nKSB7XG4gICAgICBsZXQgdiA9IGYudW5rbm93bjtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdiA9IHZbaXRlbS52YWx1ZS5uYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2Py4oaXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpdGVtLnR5cGUgPT09ICdjdXN0b20nKSB7XG4gICAgICBsZXQgdiA9IGYuY3VzdG9tO1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0Jykge1xuICAgICAgICB2ID0gdltpdGVtLnZhbHVlLm5hbWVdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHY/LihpdGVtLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZbaXRlbS50eXBlXT8uKGl0ZW0pO1xuICB9XG4gIHJldHVybiBmPy4oaXRlbSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW5kZXgnKS5WaXNpdG9yWydEZWNsYXJhdGlvbiddfSBmIFxuICogQHBhcmFtIHtpbXBvcnQoJy4vYXN0JykuRGVjbGFyYXRpb259IGl0ZW0gXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmF0aW9uVmlzaXRvcihmLCBpdGVtKSB7XG4gIGlmICh0eXBlb2YgZiA9PT0gJ29iamVjdCcpIHtcbiAgICAvKiogQHR5cGUge3N0cmluZ30gKi9cbiAgICBsZXQgbmFtZSA9IGl0ZW0ucHJvcGVydHk7XG4gICAgaWYgKGl0ZW0ucHJvcGVydHkgPT09ICd1bnBhcnNlZCcpIHtcbiAgICAgIG5hbWUgPSBpdGVtLnZhbHVlLnByb3BlcnR5SWQucHJvcGVydHk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnByb3BlcnR5ID09PSAnY3VzdG9tJykge1xuICAgICAgbGV0IHYgPSBmLmN1c3RvbTtcbiAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdiA9IHZbaXRlbS52YWx1ZS5uYW1lXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2Py4oaXRlbS52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBmW25hbWVdPy4oaXRlbSk7XG4gIH1cbiAgcmV0dXJuIGY/LihpdGVtKTtcbn1cblxuLyoqXG4gKiBcbiAqIEBwYXJhbSB7VmlzaXRvcltdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgXG4gKiBAcmV0dXJucyB7W2FueVtdLCBib29sZWFuLCBTZXQ8c3RyaW5nPl19XG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RPYmplY3RzT3JGdW5jdGlvbnModmlzaXRvcnMsIGtleSkge1xuICBsZXQgdmFsdWVzID0gW107XG4gIGxldCBoYXNGdW5jdGlvbiA9IGZhbHNlO1xuICBsZXQgYWxsS2V5cyA9IG5ldyBTZXQoKTtcbiAgZm9yIChsZXQgdmlzaXRvciBvZiB2aXNpdG9ycykge1xuICAgIGxldCB2ID0gdmlzaXRvcltrZXldO1xuICAgIGlmICh2KSB7XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaGFzRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHYpIHtcbiAgICAgICAgICBhbGxLZXlzLmFkZChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YWx1ZXMucHVzaCh2KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFt2YWx1ZXMsIGhhc0Z1bmN0aW9uLCBhbGxLZXlzXTtcbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUge2tleW9mIFZpc2l0b3J9IEtcbiAqIEBwYXJhbSB7VmlzaXRvcn0gcmVzXG4gKiBAcGFyYW0ge1Zpc2l0b3JbXX0gdmlzaXRvcnNcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyh2aXNpdG9yOiBWaXNpdG9yW0tdLCBpdGVtOiBhbnkpID0+IGFueSB8IGFueVtdIHwgdm9pZH0gYXBwbHkgXG4gKiBAcGFyYW0geyhrOiBzdHJpbmcsIGY6IGFueSkgPT4gYW55fSB3cmFwS2V5IFxuICovXG5mdW5jdGlvbiBjb21wb3NlT2JqZWN0VmlzaXRvcnMocmVzLCB2aXNpdG9ycywga2V5LCBhcHBseSwgd3JhcEtleSkge1xuICBsZXQgW3ZhbHVlcywgaGFzRnVuY3Rpb24sIGFsbEtleXNdID0gZXh0cmFjdE9iamVjdHNPckZ1bmN0aW9ucyh2aXNpdG9ycywga2V5KTtcbiAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJlc1trZXldID0gdmFsdWVzWzBdO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBmID0gY3JlYXRlQXJyYXlWaXNpdG9yKHZpc2l0b3JzLCAodmlzaXRvciwgaXRlbSkgPT4gYXBwbHkodmlzaXRvcltrZXldLCBpdGVtKSk7XG4gIGlmIChoYXNGdW5jdGlvbikge1xuICAgIHJlc1trZXldID0gZjtcbiAgfSBlbHNlIHtcbiAgICAvKiogQHR5cGUge2FueX0gKi9cbiAgICBsZXQgdiA9IHt9O1xuICAgIGZvciAobGV0IGsgb2YgYWxsS2V5cykge1xuICAgICAgdltrXSA9IHdyYXBLZXkoaywgZik7XG4gICAgfVxuICAgIHJlc1trZXldID0gdjtcbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7VmlzaXRvcn0gcmVzIFxuICogQHBhcmFtIHtWaXNpdG9yW119IHZpc2l0b3JzIFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2FzdCcpLlRva2VuT3JWYWx1ZVsndHlwZSddfSB0eXBlIFxuICogQHBhcmFtIHtib29sZWFufSBpc0V4aXQgXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VUb2tlblZpc2l0b3JzKHJlcywgdmlzaXRvcnMsIGtleSwgdHlwZSwgaXNFeGl0KSB7XG4gIGxldCBbdmFsdWVzLCBoYXNGdW5jdGlvbiwgYWxsS2V5c10gPSBleHRyYWN0T2JqZWN0c09yRnVuY3Rpb25zKHZpc2l0b3JzLCBrZXkpO1xuICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh2YWx1ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgcmVzW2tleV0gPSB2YWx1ZXNbMF07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGYgPSBjcmVhdGVUb2tlblZpc2l0b3IodmlzaXRvcnMsIHR5cGUsIGlzRXhpdCk7XG4gIGlmIChoYXNGdW5jdGlvbikge1xuICAgIHJlc1trZXldID0gZjtcbiAgfSBlbHNlIHtcbiAgICBsZXQgdiA9IHt9O1xuICAgIGZvciAobGV0IGtleSBvZiBhbGxLZXlzKSB7XG4gICAgICB2W2tleV0gPSBmO1xuICAgIH1cbiAgICByZXNba2V5XSA9IHY7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1Zpc2l0b3JbXX0gdmlzaXRvcnMgXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9hc3QnKS5Ub2tlbk9yVmFsdWVbJ3R5cGUnXX0gdHlwZSBcbiAqL1xuZnVuY3Rpb24gY3JlYXRlVG9rZW5WaXNpdG9yKHZpc2l0b3JzLCB0eXBlLCBpc0V4aXQpIHtcbiAgbGV0IHYgPSBjcmVhdGVBcnJheVZpc2l0b3IodmlzaXRvcnMsICh2aXNpdG9yLCAvKiogQHR5cGUge2ltcG9ydCgnLi9hc3QnKS5Ub2tlbk9yVmFsdWV9ICovIGl0ZW0pID0+IHtcbiAgICBsZXQgZjtcbiAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgY2FzZSAndG9rZW4nOlxuICAgICAgICBmID0gdmlzaXRvci5Ub2tlbjtcbiAgICAgICAgaWYgKHR5cGVvZiBmID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGYgPSBmW2l0ZW0udmFsdWUudHlwZV07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgIGYgPSBpc0V4aXQgPyB2aXNpdG9yLkZ1bmN0aW9uRXhpdCA6IHZpc2l0b3IuRnVuY3Rpb247XG4gICAgICAgIGlmICh0eXBlb2YgZiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBmID0gZltpdGVtLnZhbHVlLm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndmFyJzpcbiAgICAgICAgZiA9IGlzRXhpdCA/IHZpc2l0b3IuVmFyaWFibGVFeGl0IDogdmlzaXRvci5WYXJpYWJsZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlbnYnOlxuICAgICAgICBmID0gaXNFeGl0ID8gdmlzaXRvci5FbnZpcm9ubWVudFZhcmlhYmxlRXhpdCA6IHZpc2l0b3IuRW52aXJvbm1lbnRWYXJpYWJsZTtcbiAgICAgICAgaWYgKHR5cGVvZiBmID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGxldCBuYW1lO1xuICAgICAgICAgIHN3aXRjaCAoaXRlbS52YWx1ZS5uYW1lLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3VhJzpcbiAgICAgICAgICAgIGNhc2UgJ3Vua25vd24nOlxuICAgICAgICAgICAgICBuYW1lID0gaXRlbS52YWx1ZS5uYW1lLnZhbHVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2N1c3RvbSc6XG4gICAgICAgICAgICAgIG5hbWUgPSBpdGVtLnZhbHVlLm5hbWUuaWRlbnQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmID0gZltuYW1lXTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvbG9yJzpcbiAgICAgICAgZiA9IHZpc2l0b3IuQ29sb3I7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgZiA9IHZpc2l0b3IuVXJsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xlbmd0aCc6XG4gICAgICAgIGYgPSB2aXNpdG9yLkxlbmd0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbmdsZSc6XG4gICAgICAgIGYgPSB2aXNpdG9yLkFuZ2xlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgICBmID0gdmlzaXRvci5UaW1lO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Jlc29sdXRpb24nOlxuICAgICAgICBmID0gdmlzaXRvci5SZXNvbHV0aW9uO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Rhc2hlZC1pZGVudCc6XG4gICAgICAgIGYgPSB2aXNpdG9yLkRhc2hlZElkZW50O1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoIWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVzID0gZihpdGVtLnZhbHVlKTtcbiAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgY2FzZSAnY29sb3InOlxuICAgICAgY2FzZSAndXJsJzpcbiAgICAgIGNhc2UgJ2xlbmd0aCc6XG4gICAgICBjYXNlICdhbmdsZSc6XG4gICAgICBjYXNlICd0aW1lJzpcbiAgICAgIGNhc2UgJ3Jlc29sdXRpb24nOlxuICAgICAgY2FzZSAnZGFzaGVkLWlkZW50JzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSkge1xuICAgICAgICAgIHJlcyA9IHJlcy5tYXAodmFsdWUgPT4gKHsgdHlwZTogaXRlbS50eXBlLCB2YWx1ZSB9KSlcbiAgICAgICAgfSBlbHNlIGlmIChyZXMpIHtcbiAgICAgICAgICByZXMgPSB7IHR5cGU6IGl0ZW0udHlwZSwgdmFsdWU6IHJlcyB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH0pO1xuXG4gIHJldHVybiB2YWx1ZSA9PiB2KHsgdHlwZSwgdmFsdWUgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtWaXNpdG9yW119IHZpc2l0b3JzIFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEZ1bmN0aW9ucyh2aXNpdG9ycywga2V5KSB7XG4gIGxldCBmdW5jdGlvbnMgPSBbXTtcbiAgZm9yIChsZXQgdmlzaXRvciBvZiB2aXNpdG9ycykge1xuICAgIGxldCBmID0gdmlzaXRvcltrZXldO1xuICAgIGlmIChmKSB7XG4gICAgICBmdW5jdGlvbnMucHVzaChmKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9ucztcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1Zpc2l0b3J9IHJlcyBcbiAqIEBwYXJhbSB7VmlzaXRvcltdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VTaW1wbGVWaXNpdG9ycyhyZXMsIHZpc2l0b3JzLCBrZXkpIHtcbiAgbGV0IGZ1bmN0aW9ucyA9IGV4dHJhY3RGdW5jdGlvbnModmlzaXRvcnMsIGtleSk7XG4gIGlmIChmdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZ1bmN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uc1swXTtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXNba2V5XSA9IGFyZyA9PiB7XG4gICAgbGV0IG11dGF0ZWQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBmIG9mIGZ1bmN0aW9ucykge1xuICAgICAgbGV0IHJlcyA9IGYoYXJnKTtcbiAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgYXJnID0gcmVzO1xuICAgICAgICBtdXRhdGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbXV0YXRlZCA/IGFyZyA6IHVuZGVmaW5lZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1Zpc2l0b3J9IHJlcyBcbiAqIEBwYXJhbSB7VmlzaXRvcltdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VBcnJheUZ1bmN0aW9ucyhyZXMsIHZpc2l0b3JzLCBrZXkpIHtcbiAgbGV0IGZ1bmN0aW9ucyA9IGV4dHJhY3RGdW5jdGlvbnModmlzaXRvcnMsIGtleSk7XG4gIGlmIChmdW5jdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGZ1bmN0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uc1swXTtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXNba2V5XSA9IGNyZWF0ZUFycmF5VmlzaXRvcihmdW5jdGlvbnMsIChmLCBpdGVtKSA9PiBmKGl0ZW0pKTtcbn1cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7VFtdfSB2aXNpdG9ycyBcbiAqIEBwYXJhbSB7KHZpc2l0b3I6IFQsIGl0ZW06IFYpID0+IFYgfCBWW10gfCB2b2lkfSBhcHBseSBcbiAqIEByZXR1cm5zIHsoaXRlbTogVikgPT4gViB8IFZbXSB8IHZvaWR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUFycmF5VmlzaXRvcih2aXNpdG9ycywgYXBwbHkpIHtcbiAgbGV0IHNlZW4gPSBuZXcgQml0c2V0KHZpc2l0b3JzLmxlbmd0aCk7XG4gIHJldHVybiBhcmcgPT4ge1xuICAgIGxldCBhcnIgPSBbYXJnXTtcbiAgICBsZXQgbXV0YXRlZCA9IGZhbHNlO1xuICAgIHNlZW4uY2xlYXIoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gRm9yIGVhY2ggdmFsdWUsIGNhbGwgYWxsIHZpc2l0b3JzLiBJZiBhIHZpc2l0b3IgcmV0dXJucyBhIG5ldyB2YWx1ZSxcbiAgICAgIC8vIHdlIHN0YXJ0IG92ZXIsIGJ1dCBza2lwIHRoZSB2aXNpdG9yIHRoYXQgZ2VuZXJhdGVkIHRoZSB2YWx1ZSBvciBzYXdcbiAgICAgIC8vIGl0IGJlZm9yZSAodG8gYXZvaWQgY3ljbGVzKS4gVGhpcyB3YXksIHZpc2l0b3JzIGNhbiBiZSBjb21wb3NlZCBpbiBhbnkgb3JkZXIuIFxuICAgICAgZm9yIChsZXQgdiA9IDA7IHYgPCB2aXNpdG9ycy5sZW5ndGggJiYgaSA8IGFyci5sZW5ndGg7KSB7XG4gICAgICAgIGlmIChzZWVuLmdldCh2KSkge1xuICAgICAgICAgIHYrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpdGVtID0gYXJyW2ldO1xuICAgICAgICBsZXQgdmlzaXRvciA9IHZpc2l0b3JzW3ZdO1xuICAgICAgICBsZXQgcmVzID0gYXBwbHkodmlzaXRvciwgaXRlbSk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcykpIHtcbiAgICAgICAgICBpZiAocmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgYXJyLnNwbGljZShpLCAxKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGFycltpXSA9IHJlc1swXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyLnNwbGljZShpLCAxLCAuLi5yZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtdXRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZWVuLnNldCh2KTtcbiAgICAgICAgICB2ID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChyZXMpIHtcbiAgICAgICAgICBhcnJbaV0gPSByZXM7XG4gICAgICAgICAgbXV0YXRlZCA9IHRydWU7XG4gICAgICAgICAgc2Vlbi5zZXQodik7XG4gICAgICAgICAgdiA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFtdXRhdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyci5sZW5ndGggPT09IDEgPyBhcnJbMF0gOiBhcnI7XG4gIH07XG59XG5cbmNsYXNzIEJpdHNldCB7XG4gIGNvbnN0cnVjdG9yKG1heEJpdHMgPSAzMikge1xuICAgIHRoaXMuYml0cyA9IDA7XG4gICAgdGhpcy5tb3JlID0gbWF4Qml0cyA+IDMyID8gbmV3IFVpbnQzMkFycmF5KE1hdGguY2VpbCgobWF4Qml0cyAtIDMyKSAvIDMyKSkgOiBudWxsO1xuICB9XG5cbiAgLyoqIEBwYXJhbSB7bnVtYmVyfSBiaXQgKi9cbiAgZ2V0KGJpdCkge1xuICAgIGlmIChiaXQgPj0gMzIgJiYgdGhpcy5tb3JlKSB7XG4gICAgICBsZXQgaSA9IE1hdGguZmxvb3IoKGJpdCAtIDMyKSAvIDMyKTtcbiAgICAgIGxldCBiID0gYml0ICUgMzI7XG4gICAgICByZXR1cm4gQm9vbGVhbih0aGlzLm1vcmVbaV0gJiAoMSA8PCBiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuYml0cyAmICgxIDw8IGJpdCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge251bWJlcn0gYml0ICovXG4gIHNldChiaXQpIHtcbiAgICBpZiAoYml0ID49IDMyICYmIHRoaXMubW9yZSkge1xuICAgICAgbGV0IGkgPSBNYXRoLmZsb29yKChiaXQgLSAzMikgLyAzMik7XG4gICAgICBsZXQgYiA9IGJpdCAlIDMyO1xuICAgICAgdGhpcy5tb3JlW2ldIHw9IDEgPDwgYjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaXRzIHw9IDEgPDwgYml0O1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuYml0cyA9IDA7XG4gICAgaWYgKHRoaXMubW9yZSkge1xuICAgICAgdGhpcy5tb3JlLmZpbGwoMCk7XG4gICAgfVxuICB9XG59XG4iLAogICAgIi8vIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGJ5IGJ1aWxkLXByZWZpeGVzLmpzLiBETyBOT1QgRURJVCFcblxuZXhwb3J0cy5GZWF0dXJlcyA9IHtcbiAgTmVzdGluZzogMSxcbiAgTm90U2VsZWN0b3JMaXN0OiAyLFxuICBEaXJTZWxlY3RvcjogNCxcbiAgTGFuZ1NlbGVjdG9yTGlzdDogOCxcbiAgSXNTZWxlY3RvcjogMTYsXG4gIFRleHREZWNvcmF0aW9uVGhpY2tuZXNzUGVyY2VudDogMzIsXG4gIE1lZGlhSW50ZXJ2YWxTeW50YXg6IDY0LFxuICBNZWRpYVJhbmdlU3ludGF4OiAxMjgsXG4gIEN1c3RvbU1lZGlhUXVlcmllczogMjU2LFxuICBDbGFtcEZ1bmN0aW9uOiA1MTIsXG4gIENvbG9yRnVuY3Rpb246IDEwMjQsXG4gIE9rbGFiQ29sb3JzOiAyMDQ4LFxuICBMYWJDb2xvcnM6IDQwOTYsXG4gIFAzQ29sb3JzOiA4MTkyLFxuICBIZXhBbHBoYUNvbG9yczogMTYzODQsXG4gIFNwYWNlU2VwYXJhdGVkQ29sb3JOb3RhdGlvbjogMzI3NjgsXG4gIEZvbnRGYW1pbHlTeXN0ZW1VaTogNjU1MzYsXG4gIERvdWJsZVBvc2l0aW9uR3JhZGllbnRzOiAxMzEwNzIsXG4gIFZlbmRvclByZWZpeGVzOiAyNjIxNDQsXG4gIExvZ2ljYWxQcm9wZXJ0aWVzOiA1MjQyODgsXG4gIExpZ2h0RGFyazogMTA0ODU3NixcbiAgU2VsZWN0b3JzOiAzMSxcbiAgTWVkaWFRdWVyaWVzOiA0NDgsXG4gIENvbG9yczogMTExMzA4OCxcbn07XG4iLAogICAgImxldCBwYXJ0cyA9IFtwcm9jZXNzLnBsYXRmb3JtLCBwcm9jZXNzLmFyY2hdO1xuaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdsaW51eCcpIHtcbiAgY29uc3QgeyBNVVNMLCBmYW1pbHlTeW5jIH0gPSByZXF1aXJlKCdkZXRlY3QtbGliYycpO1xuICBjb25zdCBmYW1pbHkgPSBmYW1pbHlTeW5jKCk7XG4gIGlmIChmYW1pbHkgPT09IE1VU0wpIHtcbiAgICBwYXJ0cy5wdXNoKCdtdXNsJyk7XG4gIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSAnYXJtJykge1xuICAgIHBhcnRzLnB1c2goJ2dudWVhYmloZicpO1xuICB9IGVsc2Uge1xuICAgIHBhcnRzLnB1c2goJ2dudScpO1xuICB9XG59IGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgcGFydHMucHVzaCgnbXN2YycpO1xufVxuXG5sZXQgbmF0aXZlO1xudHJ5IHtcbiAgbmF0aXZlID0gcmVxdWlyZShgbGlnaHRuaW5nY3NzLSR7cGFydHMuam9pbignLScpfWApO1xufSBjYXRjaCAoZXJyKSB7XG4gIG5hdGl2ZSA9IHJlcXVpcmUoYC4uL2xpZ2h0bmluZ2Nzcy4ke3BhcnRzLmpvaW4oJy0nKX0ubm9kZWApO1xufVxuXG5tb2R1bGUuZXhwb3J0cy50cmFuc2Zvcm0gPSB3cmFwKG5hdGl2ZS50cmFuc2Zvcm0pO1xubW9kdWxlLmV4cG9ydHMudHJhbnNmb3JtU3R5bGVBdHRyaWJ1dGUgPSB3cmFwKG5hdGl2ZS50cmFuc2Zvcm1TdHlsZUF0dHJpYnV0ZSk7XG5tb2R1bGUuZXhwb3J0cy5idW5kbGUgPSB3cmFwKG5hdGl2ZS5idW5kbGUpO1xubW9kdWxlLmV4cG9ydHMuYnVuZGxlQXN5bmMgPSB3cmFwKG5hdGl2ZS5idW5kbGVBc3luYyk7XG5tb2R1bGUuZXhwb3J0cy5icm93c2Vyc2xpc3RUb1RhcmdldHMgPSByZXF1aXJlKCcuL2Jyb3dzZXJzbGlzdFRvVGFyZ2V0cycpO1xubW9kdWxlLmV4cG9ydHMuY29tcG9zZVZpc2l0b3JzID0gcmVxdWlyZSgnLi9jb21wb3NlVmlzaXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzLkZlYXR1cmVzID0gcmVxdWlyZSgnLi9mbGFncycpLkZlYXR1cmVzO1xuXG5mdW5jdGlvbiB3cmFwKGNhbGwpIHtcbiAgcmV0dXJuIChvcHRpb25zKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnZpc2l0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxldCBkZXBzID0gW107XG4gICAgICBvcHRpb25zLnZpc2l0b3IgPSBvcHRpb25zLnZpc2l0b3Ioe1xuICAgICAgICBhZGREZXBlbmRlbmN5KGRlcCkge1xuICAgICAgICAgIGRlcHMucHVzaChkZXApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHJlc3VsdCA9IGNhbGwob3B0aW9ucyk7XG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQudGhlbihyZXMgPT4ge1xuICAgICAgICAgIGlmIChkZXBzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVzLmRlcGVuZGVuY2llcyA/Pz0gW107XG4gICAgICAgICAgICByZXMuZGVwZW5kZW5jaWVzLnB1c2goLi4uZGVwcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkZXBzLmxlbmd0aCkge1xuICAgICAgICByZXN1bHQuZGVwZW5kZW5jaWVzID8/PSBbXTtcbiAgICAgICAgcmVzdWx0LmRlcGVuZGVuY2llcy5wdXNoKC4uLmRlcHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNhbGwob3B0aW9ucyk7XG4gICAgfVxuICB9O1xufVxuIiwKICAgICIjIS91c3IvYmluL2VudiBidW5cbi8qKlxuICogUG9zdGJ1aWxkIENTUyBwdXJnZSDigJQgc3RhbmRhbG9uZSBCdW4gc2NyaXB0LlxuICpcbiAqIFJ1bnMgYWZ0ZXIgcnNidWlsZCBidWlsZCwgcHVyZ2VzIENTUyBmaWxlcyBpbiBkaXN0LyB1c2luZyB0aGUgcHVyZ2UgbWFuaWZlc3RcbiAqIGFuZCBjb25zdW1lciBKU1ggYW5hbHlzaXMuIFplcm8gTm9kZSBpbXBvcnRzLlxuICpcbiAqIFRocmVlLWxldmVsIHB1cmdlOlxuICogICBMMSDigJQgY2xhc3MtbGV2ZWw6IGRyb3AgcnVsZXMgd2hvc2UgY2xhc3Mgc2VsZWN0b3JzIGFyZW4ndCBpbiB0aGUgc2FmZWxpc3QgKHBvc3Rjc3MpXG4gKiAgIEwyIOKAlCBhdHRyLWxldmVsOiBkcm9wIHJ1bGVzIHdpdGggZGF0YS9hcmlhIGF0dHJpYnV0ZSBzZWxlY3RvcnMgZm9yIHVudXNlZCBwcm9wcyAocG9zdGNzcylcbiAqICAgTDMg4oCUIHZhciBjbGVhbnVwOiBpdGVyYXRpdmVseSByZW1vdmUgZGVjbGFyZWQtYnV0LXVucmVmZXJlbmNlZCBDU1MgY3VzdG9tIHByb3BlcnRpZXMgKHBvc3Rjc3MpXG4gKiAgIEZpbmFsIOKAlCBtaW5pZmljYXRpb24gdmlhIExpZ2h0bmluZyBDU1NcbiAqXG4gKiBVc2FnZTpcbiAqICAgYnVueCBAcGF0aHNjYWxlL3JzYnVpbGQtcGx1Z2luLXVpLWNzcy1wdXJnZSBcXFxuICogICAgIC0tZGlzdCBkaXN0IC0tc3JjIHNyYyAtLW1hbmlmZXN0IG5vZGVfbW9kdWxlcy9AcGF0aHNjYWxlL3VpL2Rpc3QvcHVyZ2UtbWFuaWZlc3QuanNvblxuICovXG5cbmltcG9ydCB7IEdsb2IgfSBmcm9tIFwiYnVuXCI7XG5pbXBvcnQgeyB0cmFuc2Zvcm0gfSBmcm9tIFwibGlnaHRuaW5nY3NzXCI7XG5pbXBvcnQgcG9zdGNzcyBmcm9tIFwicG9zdGNzc1wiO1xuaW1wb3J0IHR5cGUgeyBSdWxlLCBBdFJ1bGUgfSBmcm9tIFwicG9zdGNzc1wiO1xuaW1wb3J0IHsgc2NhbkNvbnN1bWVyU291cmNlLCBidWlsZFNhZmVsaXN0cyB9IGZyb20gXCIuL3NjYW4tY29uc3VtZXJcIjtcbmltcG9ydCB0eXBlIHsgUHVyZ2VNYW5pZmVzdCB9IGZyb20gXCIuL3NjYW4tY29uc3VtZXJcIjtcblxuLy8g4pSA4pSAIENMSSBhcmdzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBwYXJzZUFyZ3MoYXJndjogc3RyaW5nW10pOiB7IGRpc3REaXI6IHN0cmluZzsgc3JjRGlyOiBzdHJpbmc7IG1hbmlmZXN0UGF0aDogc3RyaW5nIH0ge1xuICBjb25zdCBhcmdzID0gYXJndi5zbGljZSgyKTtcbiAgbGV0IGRpc3REaXIgPSBcIi4vZGlzdFwiO1xuICBsZXQgc3JjRGlyID0gXCIuL3NyY1wiO1xuICBsZXQgbWFuaWZlc3RQYXRoID0gXCJcIjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYXJnc1tpXSA9PT0gXCItLWRpc3RcIiAmJiBhcmdzW2kgKyAxXSkgZGlzdERpciA9IGFyZ3NbKytpXTtcbiAgICBlbHNlIGlmIChhcmdzW2ldID09PSBcIi0tc3JjXCIgJiYgYXJnc1tpICsgMV0pIHNyY0RpciA9IGFyZ3NbKytpXTtcbiAgICBlbHNlIGlmIChhcmdzW2ldID09PSBcIi0tbWFuaWZlc3RcIiAmJiBhcmdzW2kgKyAxXSkgbWFuaWZlc3RQYXRoID0gYXJnc1srK2ldO1xuICB9XG5cbiAgaWYgKCFtYW5pZmVzdFBhdGgpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJVc2FnZTogYnVueCBAcGF0aHNjYWxlL3JzYnVpbGQtcGx1Z2luLXVpLWNzcy1wdXJnZSAtLW1hbmlmZXN0IDxwYXRoPiBbLS1kaXN0IDxwYXRoPl0gWy0tc3JjIDxwYXRoPl1cIixcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHJldHVybiB7IGRpc3REaXIsIHNyY0RpciwgbWFuaWZlc3RQYXRoIH07XG59XG5cbi8vIOKUgOKUgCBCdWlsZCBraWxsLWxpc3Q6IGNsYXNzZXMgZnJvbSBjb21wb25lbnRzIHRoYXQgYXJlIG5ldmVyIGltcG9ydGVkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBjb2xsZWN0Q2xhc3Nlc0Zyb21FbnRyeShlbnRyeTogeyBjbGFzc2VzOiB7IGFsd2F5czogc3RyaW5nW107IGJ5UHJvcDogUmVjb3JkPHN0cmluZywgc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+IH0gfSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcmVzdWx0ID0gWy4uLmVudHJ5LmNsYXNzZXMuYWx3YXlzXTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKGVudHJ5LmNsYXNzZXMuYnlQcm9wKSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmVzdWx0LnB1c2goLi4udmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGNsYXNzZXMgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2goLi4uY2xhc3Nlcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkS2lsbExpc3QobWFuaWZlc3Q6IFB1cmdlTWFuaWZlc3QsIGltcG9ydGVkQ29tcG9uZW50czogU2V0PHN0cmluZz4pOiBTZXQ8c3RyaW5nPiB7XG4gIC8vIEZvciBlYWNoIG1hbmlmZXN0IGVudHJ5LCBjb2xsZWN0IEJFTSByb290IGNsYXNzZXMgKGZyb20gY2xhc3Nlcy5hbHdheXMpLlxuICAvLyBBIGNsYXNzIGlzIGNvbnNpZGVyZWQgYSBCRU0tb3duZWQgY2xhc3Mgb2YgYSBjb21wb25lbnQgaWYgaXQgbWF0Y2hlc1xuICAvLyBvbmUgb2YgaXRzIHJvb3RzOiBleGFjdCBtYXRjaCwgcm9vdC0tLCBvciByb290X18uXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSAoVGFpbHdpbmQgdXRpbGl0aWVzIGxpa2UgZ2FwLTEsIGZsZXgtY29sKSBpcyBuZXZlciBraWxsZWQuXG4gIGNvbnN0IGNvbXBvbmVudEJlbVJvb3RzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuXG4gIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0KSkge1xuICAgIGNvbnN0IHJvb3QgPSBrZXkuc3BsaXQoXCIuXCIpWzBdO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gY29tcG9uZW50QmVtUm9vdHMuZ2V0KHJvb3QpID8/IG5ldyBTZXQoKTtcbiAgICBmb3IgKGNvbnN0IGNscyBvZiBlbnRyeS5jbGFzc2VzLmFsd2F5cykge1xuICAgICAgZXhpc3RpbmcuYWRkKGNscyk7XG4gICAgfVxuICAgIGNvbXBvbmVudEJlbVJvb3RzLnNldChyb290LCBleGlzdGluZyk7XG4gIH1cblxuICAvLyBDb2xsZWN0IEFMTCBjbGFzc2VzIHBlciBjb21wb25lbnRcbiAgY29uc3QgY29tcG9uZW50Q2xhc3NlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMobWFuaWZlc3QpKSB7XG4gICAgY29uc3Qgcm9vdCA9IGtleS5zcGxpdChcIi5cIilbMF07XG4gICAgY29uc3QgZXhpc3RpbmcgPSBjb21wb25lbnRDbGFzc2VzLmdldChyb290KSA/PyBbXTtcbiAgICBleGlzdGluZy5wdXNoKC4uLmNvbGxlY3RDbGFzc2VzRnJvbUVudHJ5KGVudHJ5KSk7XG4gICAgY29tcG9uZW50Q2xhc3Nlcy5zZXQocm9vdCwgZXhpc3RpbmcpO1xuICB9XG5cbiAgLy8gRmlsdGVyOiBvbmx5IGluY2x1ZGUgY2xhc3NlcyB0aGF0IG1hdGNoIGEgQkVNIHJvb3Qgb2YgdGhlaXIgY29tcG9uZW50XG4gIGZ1bmN0aW9uIGlzQmVtQ2xhc3MoY2xzOiBzdHJpbmcsIGJlbVJvb3RzOiBTZXQ8c3RyaW5nPik6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3Qgcm9vdCBvZiBiZW1Sb290cykge1xuICAgICAgaWYgKGNscyA9PT0gcm9vdCB8fCBjbHMuc3RhcnRzV2l0aChgJHtyb290fS0tYCkgfHwgY2xzLnN0YXJ0c1dpdGgoYCR7cm9vdH1fX2ApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBraWxsTGlzdCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBzYWZlQ2xhc3NlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgW2NvbXBvbmVudCwgY2xhc3Nlc10gb2YgY29tcG9uZW50Q2xhc3Nlcykge1xuICAgIGNvbnN0IGJlbVJvb3RzID0gY29tcG9uZW50QmVtUm9vdHMuZ2V0KGNvbXBvbmVudCkgPz8gbmV3IFNldCgpO1xuICAgIGlmIChpbXBvcnRlZENvbXBvbmVudHMuaGFzKGNvbXBvbmVudCkpIHtcbiAgICAgIGZvciAoY29uc3QgY2xzIG9mIGNsYXNzZXMpIHNhZmVDbGFzc2VzLmFkZChjbHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPbmx5IGtpbGwgQkVNLW93bmVkIGNsYXNzZXMsIG5vdCBUYWlsd2luZCB1dGlsaXRpZXNcbiAgICAgIGZvciAoY29uc3QgY2xzIG9mIGNsYXNzZXMpIHtcbiAgICAgICAgaWYgKGlzQmVtQ2xhc3MoY2xzLCBiZW1Sb290cykpIHtcbiAgICAgICAgICBraWxsTGlzdC5hZGQoY2xzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIElmIGEgY2xhc3MgYXBwZWFycyBpbiBCT1RIIHVzZWQgYW5kIHVudXNlZCBjb21wb25lbnRzLCBrZWVwIGl0XG4gIGZvciAoY29uc3QgY2xzIG9mIHNhZmVDbGFzc2VzKSB7XG4gICAga2lsbExpc3QuZGVsZXRlKGNscyk7XG4gIH1cblxuICByZXR1cm4ga2lsbExpc3Q7XG59XG5cbi8qKiBDb252ZXJ0IGtlYmFiLWNhc2UgZGlyZWN0b3J5IG5hbWUgdG8gUGFzY2FsQ2FzZSBjb21wb25lbnQgbmFtZSAqL1xuZnVuY3Rpb24ga2ViYWJUb1Bhc2NhbChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcy5zcGxpdChcIi1cIikubWFwKChwKSA9PiBwLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcC5zbGljZSgxKSkuam9pbihcIlwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NhbkltcG9ydGVkQ29tcG9uZW50cyhzcmNEaXI6IHN0cmluZyk6IFByb21pc2U8U2V0PHN0cmluZz4+IHtcbiAgY29uc3QgaW1wb3J0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZ2xvYiA9IG5ldyBHbG9iKFwiKiovKi57dHN4LHRzLGpzeCxqc31cIik7XG5cbiAgZm9yIGF3YWl0IChjb25zdCByZWxQYXRoIG9mIGdsb2Iuc2Nhbih7IGN3ZDogc3JjRGlyIH0pKSB7XG4gICAgaWYgKHJlbFBhdGguaW5jbHVkZXMoXCJub2RlX21vZHVsZXNcIikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gYCR7c3JjRGlyfS8ke3JlbFBhdGh9YDtcbiAgICBjb25zdCBjb2RlID0gYXdhaXQgQnVuLmZpbGUoZnVsbFBhdGgpLnRleHQoKTtcbiAgICBpZiAoIWNvZGUuaW5jbHVkZXMoXCJAcGF0aHNjYWxlL3VpXCIpKSBjb250aW51ZTtcblxuICAgIC8vIE1hdGNoIGJhcnJlbDogaW1wb3J0IHsgRm9vLCBCYXIgYXMgQmF6IH0gZnJvbSBcIkBwYXRoc2NhbGUvdWlcIlxuICAgIGNvbnN0IGJhcnJlbFJlZ2V4ID0gL2ltcG9ydFxccypcXHsoW159XSspXFx9XFxzKmZyb21cXHMqWydcIl1AcGF0aHNjYWxlXFwvdWlbJ1wiXS9nO1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgY29kZS5tYXRjaEFsbChiYXJyZWxSZWdleCkpIHtcbiAgICAgIGNvbnN0IHNwZWNpZmllcnMgPSBtYXRjaFsxXS5zcGxpdChcIixcIik7XG4gICAgICBmb3IgKGNvbnN0IHNwZWMgb2Ygc3BlY2lmaWVycykge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gc3BlYy50cmltKCk7XG4gICAgICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoXCJ0eXBlIFwiKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0cmltbWVkLnNwbGl0KC9cXHMrYXNcXHMrLylbMF0udHJpbSgpO1xuICAgICAgICBpZiAobmFtZSAmJiAvXltBLVpdLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgaW1wb3J0ZWQuYWRkKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWF0Y2ggZGVlcC1wYXRoIGRlZmF1bHQ6IGltcG9ydCBGb28gZnJvbSBcIkBwYXRoc2NhbGUvdWkvY29tcG9uZW50cy9mb28tYmFyXCJcbiAgICBjb25zdCBkZWVwRGVmYXVsdFJlZ2V4ID0gL2ltcG9ydFxccysoW0EtWl1bYS16QS1aMC05XSopXFxzK2Zyb21cXHMqWydcIl1AcGF0aHNjYWxlXFwvdWlcXC9jb21wb25lbnRzXFwvKFteJ1wiXSspWydcIl0vZztcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGNvZGUubWF0Y2hBbGwoZGVlcERlZmF1bHRSZWdleCkpIHtcbiAgICAgIGltcG9ydGVkLmFkZChtYXRjaFsxXSk7XG4gICAgfVxuXG4gICAgLy8gTWF0Y2ggZGVlcC1wYXRoIG5hbWVkOiBpbXBvcnQgeyBGb28sIEJhciB9IGZyb20gXCJAcGF0aHNjYWxlL3VpL2NvbXBvbmVudHMvZm9vLWJhclwiXG4gICAgY29uc3QgZGVlcE5hbWVkUmVnZXggPSAvaW1wb3J0XFxzKlxceyhbXn1dKylcXH1cXHMqZnJvbVxccypbJ1wiXUBwYXRoc2NhbGVcXC91aVxcL2NvbXBvbmVudHNcXC8oW14nXCJdKylbJ1wiXS9nO1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgY29kZS5tYXRjaEFsbChkZWVwTmFtZWRSZWdleCkpIHtcbiAgICAgIGNvbnN0IHNwZWNpZmllcnMgPSBtYXRjaFsxXS5zcGxpdChcIixcIik7XG4gICAgICBmb3IgKGNvbnN0IHNwZWMgb2Ygc3BlY2lmaWVycykge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gc3BlYy50cmltKCk7XG4gICAgICAgIGlmICh0cmltbWVkLnN0YXJ0c1dpdGgoXCJ0eXBlIFwiKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0cmltbWVkLnNwbGl0KC9cXHMrYXNcXHMrLylbMF0udHJpbSgpO1xuICAgICAgICBpZiAobmFtZSAmJiAvXltBLVpdLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgaW1wb3J0ZWQuYWRkKG5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBbHNvIGFkZCB0aGUgUGFzY2FsQ2FzZSBuYW1lIGZyb20gdGhlIHBhdGggaXRzZWxmIChjb3ZlcnMgc3ViLWNvbXBvbmVudHMpXG4gICAgICBjb25zdCBkaXJOYW1lID0gbWF0Y2hbMl0uc3BsaXQoXCIvXCIpWzBdO1xuICAgICAgaW1wb3J0ZWQuYWRkKGtlYmFiVG9QYXNjYWwoZGlyTmFtZSkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbXBvcnRlZDtcbn1cblxuLyoqXG4gKiBCdWlsZCBkZXBlbmRlbmN5IGdyYXBoIGZyb20gbWFuaWZlc3QgYGRlcHNgIGZpZWxkcy5cbiAqL1xuZnVuY3Rpb24gYnVpbGREZXBHcmFwaEZyb21NYW5pZmVzdChtYW5pZmVzdDogUHVyZ2VNYW5pZmVzdCk6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PiB7XG4gIGNvbnN0IGdyYXBoID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhtYW5pZmVzdCkpIHtcbiAgICBjb25zdCByb290ID0ga2V5LnNwbGl0KFwiLlwiKVswXTtcbiAgICBpZiAoZW50cnkuZGVwcyAmJiBlbnRyeS5kZXBzLmxlbmd0aCA+IDAgJiYgIWdyYXBoLmhhcyhyb290KSkge1xuICAgICAgZ3JhcGguc2V0KHJvb3QsIG5ldyBTZXQoZW50cnkuZGVwcykpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ3JhcGg7XG59XG5cbi8qKlxuICogR2l2ZW4gZGlyZWN0bHkgaW1wb3J0ZWQgY29tcG9uZW50cyBhbmQgYSBkZXBlbmRlbmN5IGdyYXBoLFxuICogdHJhbnNpdGl2ZWx5IHJlc29sdmUgYWxsIGNvbXBvbmVudHMgdGhhdCBhcmUgbmVlZGVkLlxuICovXG5mdW5jdGlvbiByZXNvbHZlVHJhbnNpdGl2ZURlcHMoXG4gIGltcG9ydGVkOiBTZXQ8c3RyaW5nPixcbiAgZGVwR3JhcGg6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pixcbik6IFNldDxzdHJpbmc+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBuZXcgU2V0KGltcG9ydGVkKTtcbiAgY29uc3QgcXVldWUgPSBbLi4uaW1wb3J0ZWRdO1xuXG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY29tcCA9IHF1ZXVlLnBvcCgpITtcbiAgICBjb25zdCBkZXBzID0gZGVwR3JhcGguZ2V0KGNvbXApO1xuICAgIGlmICghZGVwcykgY29udGludWU7XG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwcykge1xuICAgICAgaWYgKCFyZXNvbHZlZC5oYXMoZGVwKSkge1xuICAgICAgICByZXNvbHZlZC5hZGQoZGVwKTtcbiAgICAgICAgcXVldWUucHVzaChkZXApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXNvbHZlZDtcbn1cblxuLy8g4pSA4pSAIExldmVsIDE6IGNsYXNzLWxldmVsIHB1cmdlICsga2V5ZnJhbWVzICsgZm9udC1mYWNlICsgZWxlbWVudCBzZWxlY3RvcnMg4pSA4pSA4pSAXG5cbi8qKiBVbmVzY2FwZSBDU1MgaWRlbnRpZmllcnM6IGBpY29uLVxcW21kaS0tY29nXFxdYCDihpIgYGljb24tW21kaS0tY29nXWAgKi9cbmZ1bmN0aW9uIHVuZXNjYXBlQ3NzKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzLnJlcGxhY2UoL1xcXFwoLikvZywgXCIkMVwiKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdENsYXNzZXNGcm9tU2VsZWN0b3Ioc2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgLy8gTWF0Y2ggY2xhc3Mgc2VsZWN0b3JzIGluY2x1ZGluZyBDU1MgZXNjYXBlIHNlcXVlbmNlcyAoZS5nLiAuaWNvbi1cXFttZGktLWNvZ1xcXSlcbiAgY29uc3QgbWF0Y2hlcyA9IHNlbGVjdG9yLm1hdGNoQWxsKC9cXC4oW2EtekEtWl8tXSg/OlthLXpBLVowLTlfLV18XFxcXFteXFxzXSkqKS9nKTtcbiAgcmV0dXJuIFsuLi5tYXRjaGVzXS5tYXAoKG0pID0+IHVuZXNjYXBlQ3NzKG1bMV0pKTtcbn1cblxuLy8gRWxlbWVudHMgdGhhdCBhcmUgYWx3YXlzIGtlcHQgKGZ1bmRhbWVudGFsIHJlc2V0IHRhcmdldHMpLlxuLy8gRXZlcnl0aGluZyBlbHNlIChzdWIsIHN1cCwgaW1nLCBzZWxlY3QsIHRleHRhcmVhLCBldGMuKSBpcyBzdHJpcHBlZFxuLy8gdW5sZXNzIGl0IGFwcGVhcnMgYWxvbmdzaWRlIGEgc2FmZWxpc3RlZCBjbGFzcy5cbmNvbnN0IEFMV0FZU19LRUVQX1NFTEVDVE9SUyA9IG5ldyBTZXQoW1xuICBcIipcIiwgXCJodG1sXCIsIFwiYm9keVwiLCBcIjpyb290XCIsIFwiOjpiZWZvcmVcIiwgXCI6OmFmdGVyXCIsXG4gIFwiOmJlZm9yZVwiLCBcIjphZnRlclwiLCBcIjo6YmFja2Ryb3BcIixcbl0pO1xuXG5mdW5jdGlvbiBpc0tlZXBhYmxlTm9uQ2xhc3NTZWxlY3RvcihzZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBzdHJpcHBlZCA9IHNlbC50cmltKCk7XG5cbiAgLy8gRXhhY3QgbWF0Y2ggb24gZnVuZGFtZW50YWwgc2VsZWN0b3JzXG4gIGZvciAoY29uc3QgZWwgb2YgQUxXQVlTX0tFRVBfU0VMRUNUT1JTKSB7XG4gICAgaWYgKHN0cmlwcGVkID09PSBlbCkgcmV0dXJuIHRydWU7XG4gICAgLy8gQWxsb3cgcHNldWRvLWVsZW1lbnRzL2NsYXNzZXMgYXR0YWNoZWQgdG8gZnVuZGFtZW50YWwgc2VsZWN0b3JzXG4gICAgLy8gZS5nLiAqOjpiZWZvcmUsIGh0bWw6bm90KFtkYXRhLXRoZW1lXSlcbiAgICBpZiAoc3RyaXBwZWQuc3RhcnRzV2l0aChlbCArIFwiOlwiKSB8fCBzdHJpcHBlZC5zdGFydHNXaXRoKGVsICsgXCJbXCIpIHx8IHN0cmlwcGVkLnN0YXJ0c1dpdGgoZWwgKyBcIiBcIikpIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gS2VlcCA6cm9vdCB3aXRoIHBzZXVkby9hdHRyICh0aGVtZSBzZWxlY3RvcnMgbGlrZSA6cm9vdDpub3QoW2RhdGEtdGhlbWVdKSlcbiAgaWYgKC9eOnJvb3QvLnRlc3Qoc3RyaXBwZWQpKSByZXR1cm4gdHJ1ZTtcblxuICAvLyBLZWVwIGF0dHJpYnV0ZS1vbmx5IHNlbGVjdG9ycyBsaWtlIFtkYXRhLXRoZW1lPWRhcmtdIOKAlCB0aGVtZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnNcbiAgaWYgKC9eXFxbZGF0YS10aGVtZS8udGVzdChzdHJpcHBlZCkpIHJldHVybiB0cnVlO1xuXG4gIC8vIEtlZXAgW2hpZGRlbl0gcmVzZXQgcnVsZXNcbiAgaWYgKC9eXFxbaGlkZGVuLy50ZXN0KHN0cmlwcGVkKSkgcmV0dXJuIHRydWU7XG5cbiAgLy8gRHJvcCBldmVyeXRoaW5nIGVsc2U6IDpob3N0LCA6d2hlcmUoc2VsZWN0Li4uKSwgZWxlbWVudCBzZWxlY3RvcnMgKHN1Yiwgc3VwLCBpbWcsIGV0Yy4pXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcHVyZ2VDbGFzc2VzKGNzczogc3RyaW5nLCBraWxsTGlzdDogU2V0PHN0cmluZz4pOiBzdHJpbmcge1xuICBjb25zdCByb290ID0gcG9zdGNzcy5wYXJzZShjc3MpO1xuXG4gIC8vIFBhc3MgMTogcmVtb3ZlIHNlbGVjdG9ycyB3aGVyZSBBTEwgY2xhc3NlcyBhcmUgb24gdGhlIGtpbGwtbGlzdFxuICAvLyAoaS5lLiB0aGV5IGJlbG9uZyBleGNsdXNpdmVseSB0byB1bnVzZWQgVUkgY29tcG9uZW50cykuXG4gIC8vIEFueSBzZWxlY3RvciB3aXRoIGV2ZW4gb25lIGNsYXNzIE5PVCBvbiB0aGUga2lsbC1saXN0IGlzIGtlcHQuXG4gIHJvb3Qud2Fsa1J1bGVzKChydWxlKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0b3JzID0gcnVsZS5zZWxlY3RvcnM7XG4gICAgY29uc3Qga2VwdDogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qgc2VsIG9mIHNlbGVjdG9ycykge1xuICAgICAgY29uc3QgY2xhc3NlcyA9IGV4dHJhY3RDbGFzc2VzRnJvbVNlbGVjdG9yKHNlbCk7XG4gICAgICBpZiAoY2xhc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKGlzS2VlcGFibGVOb25DbGFzc1NlbGVjdG9yKHNlbCkpIHtcbiAgICAgICAgICBrZXB0LnB1c2goc2VsKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gS2VlcCBpZiBBTlkgY2xhc3MgaXMgbm90IG9uIHRoZSBraWxsLWxpc3RcbiAgICAgIGlmIChjbGFzc2VzLnNvbWUoKGMpID0+ICFraWxsTGlzdC5oYXMoYykpKSB7XG4gICAgICAgIGtlcHQucHVzaChzZWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChrZXB0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcnVsZS5yZW1vdmUoKTtcbiAgICB9IGVsc2UgaWYgKGtlcHQubGVuZ3RoIDwgc2VsZWN0b3JzLmxlbmd0aCkge1xuICAgICAgcnVsZS5zZWxlY3RvcnMgPSBrZXB0O1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUGFzcyAyOiBjb2xsZWN0IGFuaW1hdGlvbiBuYW1lcyByZWZlcmVuY2VkIGJ5IHN1cnZpdmluZyBydWxlc1xuICBjb25zdCB1c2VkS2V5ZnJhbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHJvb3Qud2Fsa0RlY2xzKC9eYW5pbWF0aW9uKC1uYW1lKT8kLywgKGRlY2wpID0+IHtcbiAgICAvLyBhbmltYXRpb24tbmFtZSBjYW4gYmUgY29tbWEtc2VwYXJhdGVkXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIGRlY2wudmFsdWUuc3BsaXQoXCIsXCIpKSB7XG4gICAgICBjb25zdCBuYW1lID0gcGFydC50cmltKCkuc3BsaXQoL1xccysvKVswXTtcbiAgICAgIGlmIChuYW1lICYmIG5hbWUgIT09IFwibm9uZVwiICYmIG5hbWUgIT09IFwiaW5pdGlhbFwiICYmIG5hbWUgIT09IFwiaW5oZXJpdFwiKSB7XG4gICAgICAgIHVzZWRLZXlmcmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gUGFzcyAzOiByZW1vdmUgdW51c2VkIEBrZXlmcmFtZXNcbiAgcm9vdC53YWxrQXRSdWxlcyhcImtleWZyYW1lc1wiLCAoYXRSdWxlKSA9PiB7XG4gICAgaWYgKCF1c2VkS2V5ZnJhbWVzLmhhcyhhdFJ1bGUucGFyYW1zLnRyaW0oKSkpIHtcbiAgICAgIGF0UnVsZS5yZW1vdmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFBhc3MgNDogY29sbGVjdCBmb250IGZhbWlsaWVzIHJlZmVyZW5jZWQgYnkgc3Vydml2aW5nIHJ1bGVzXG4gIGNvbnN0IHVzZWRGb250cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICByb290LndhbGtEZWNscygvXmZvbnQoLWZhbWlseSk/JC8sIChkZWNsKSA9PiB7XG4gICAgLy8gRXh0cmFjdCBmb250IGZhbWlseSBuYW1lcyAocm91Z2ggYnV0IGNhdGNoZXMgY29tbW9uIHBhdHRlcm5zKVxuICAgIGZvciAoY29uc3QgcGFydCBvZiBkZWNsLnZhbHVlLnNwbGl0KFwiLFwiKSkge1xuICAgICAgY29uc3QgbmFtZSA9IHBhcnQudHJpbSgpLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgXCJcIik7XG4gICAgICBpZiAobmFtZSkgdXNlZEZvbnRzLmFkZChuYW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFBhc3MgNTogcmVtb3ZlIHVudXNlZCBAZm9udC1mYWNlXG4gIHJvb3Qud2Fsa0F0UnVsZXMoXCJmb250LWZhY2VcIiwgKGF0UnVsZSkgPT4ge1xuICAgIGxldCBmYW1pbHkgPSBcIlwiO1xuICAgIGF0UnVsZS53YWxrRGVjbHMoXCJmb250LWZhbWlseVwiLCAoZGVjbCkgPT4ge1xuICAgICAgZmFtaWx5ID0gZGVjbC52YWx1ZS50cmltKCkucmVwbGFjZSgvXltcIiddfFtcIiddJC9nLCBcIlwiKTtcbiAgICB9KTtcbiAgICBpZiAoZmFtaWx5ICYmICF1c2VkRm9udHMuaGFzKGZhbWlseSkpIHtcbiAgICAgIGF0UnVsZS5yZW1vdmUoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFBhc3MgNjogY2xlYW4gZW1wdHkgYXQtcnVsZXNcbiAgbGV0IGNsZWFuZWQgPSB0cnVlO1xuICB3aGlsZSAoY2xlYW5lZCkge1xuICAgIGNsZWFuZWQgPSBmYWxzZTtcbiAgICByb290LndhbGtBdFJ1bGVzKChhdFJ1bGUpID0+IHtcbiAgICAgIGlmIChhdFJ1bGUubm9kZXMgJiYgYXRSdWxlLm5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBhdFJ1bGUucmVtb3ZlKCk7XG4gICAgICAgIGNsZWFuZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QudG9TdHJpbmcoKTtcbn1cblxuLy8g4pSA4pSAIExldmVsIDI6IGF0dHJpYnV0ZSBwdXJnZSAocG9zdGNzcykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIHB1cmdlQXR0cmlidXRlcyhjc3M6IHN0cmluZywgYXR0clNhZmVsaXN0OiBTZXQ8c3RyaW5nPik6IHN0cmluZyB7XG4gIGNvbnN0IHJvb3QgPSBwb3N0Y3NzLnBhcnNlKGNzcyk7XG5cbiAgcm9vdC53YWxrUnVsZXMoKHJ1bGUpID0+IHtcbiAgICBjb25zdCBzZWxlY3RvcnMgPSBydWxlLnNlbGVjdG9ycztcbiAgICBjb25zdCBrZXB0OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBzZWwgb2Ygc2VsZWN0b3JzKSB7XG4gICAgICBjb25zdCBhdHRyTWF0Y2hlcyA9IHNlbC5tYXRjaEFsbCgvXFxbKGRhdGEtW2Etei1dK3xhcmlhLVthLXotXSspPVwiKFteXCJdKylcIlxcXS9nKTtcbiAgICAgIGxldCBzaG91bGRLZWVwID0gdHJ1ZTtcblxuICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBhdHRyTWF0Y2hlcykge1xuICAgICAgICBpZiAobWF0Y2hbMV0gPT09IFwiZGF0YS1zbG90XCIpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBhdHRyU2VsZWN0b3IgPSBgWyR7bWF0Y2hbMV19PVwiJHttYXRjaFsyXX1cIl1gO1xuICAgICAgICBpZiAoIWF0dHJTYWZlbGlzdC5oYXMoYXR0clNlbGVjdG9yKSkge1xuICAgICAgICAgIHNob3VsZEtlZXAgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkS2VlcCkga2VwdC5wdXNoKHNlbCk7XG4gICAgfVxuXG4gICAgaWYgKGtlcHQubGVuZ3RoID09PSAwKSB7XG4gICAgICBydWxlLnJlbW92ZSgpO1xuICAgIH0gZWxzZSBpZiAoa2VwdC5sZW5ndGggPCBzZWxlY3RvcnMubGVuZ3RoKSB7XG4gICAgICBydWxlLnNlbGVjdG9ycyA9IGtlcHQ7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcm9vdC50b1N0cmluZygpO1xufVxuXG4vLyDilIDilIAgTGV2ZWwgMzogdW51c2VkIENTUyB2YXJpYWJsZSBjbGVhbnVwIChwb3N0Y3NzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gY2xlYW5VbnVzZWRWYXJzKGNzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGNoYW5nZWQgPSB0cnVlO1xuICBsZXQgcmVzdWx0ID0gY3NzO1xuXG4gIHdoaWxlIChjaGFuZ2VkKSB7XG4gICAgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHJvb3QgPSBwb3N0Y3NzLnBhcnNlKHJlc3VsdCk7XG5cbiAgICBjb25zdCBkZWNsYXJlZCA9IG5ldyBNYXA8c3RyaW5nLCB7IHJ1bGU6IFJ1bGUgfCBBdFJ1bGU7IHByb3A6IHN0cmluZyB9W10+KCk7XG4gICAgcm9vdC53YWxrRGVjbHMoL14tLS8sIChkZWNsKSA9PiB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gZGVjbGFyZWQuZ2V0KGRlY2wucHJvcCkgPz8gW107XG4gICAgICBlbnRyaWVzLnB1c2goeyBydWxlOiBkZWNsLnBhcmVudCBhcyBSdWxlLCBwcm9wOiBkZWNsLnByb3AgfSk7XG4gICAgICBkZWNsYXJlZC5zZXQoZGVjbC5wcm9wLCBlbnRyaWVzKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlZmVyZW5jZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICByb290LndhbGtEZWNscygoZGVjbCkgPT4ge1xuICAgICAgY29uc3QgcmVmcyA9IGRlY2wudmFsdWUubWF0Y2hBbGwoL3ZhclxcKFxccyooLS1bYS16QS1aMC05Xy1dKykvZyk7XG4gICAgICBmb3IgKGNvbnN0IHJlZiBvZiByZWZzKSByZWZlcmVuY2VkLmFkZChyZWZbMV0pO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBbdmFyTmFtZSwgZW50cmllc10gb2YgZGVjbGFyZWQpIHtcbiAgICAgIGlmICghcmVmZXJlbmNlZC5oYXModmFyTmFtZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgZW50cnkucnVsZS53YWxrRGVjbHMoZW50cnkucHJvcCwgKGRlY2wpID0+IHtcbiAgICAgICAgICAgIGRlY2wucmVtb3ZlKCk7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJvb3Qud2Fsa1J1bGVzKChydWxlKSA9PiB7XG4gICAgICBpZiAocnVsZS5ub2RlcyAmJiBydWxlLm5vZGVzLmxlbmd0aCA9PT0gMCkgcnVsZS5yZW1vdmUoKTtcbiAgICB9KTtcbiAgICByb290LndhbGtBdFJ1bGVzKChhdFJ1bGUpID0+IHtcbiAgICAgIGlmIChhdFJ1bGUubm9kZXMgJiYgYXRSdWxlLm5vZGVzLmxlbmd0aCA9PT0gMCkgYXRSdWxlLnJlbW92ZSgpO1xuICAgIH0pO1xuXG4gICAgcmVzdWx0ID0gcm9vdC50b1N0cmluZygpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLy8g4pSA4pSAIE1pbmlmaWNhdGlvbjogTGlnaHRuaW5nIENTUyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gbWluaWZ5KGNzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjb2RlIH0gPSB0cmFuc2Zvcm0oe1xuICAgIGZpbGVuYW1lOiBcInB1cmdlZC5jc3NcIixcbiAgICBjb2RlOiBCdWZmZXIuZnJvbShjc3MpLFxuICAgIG1pbmlmeTogdHJ1ZSxcbiAgICBlcnJvclJlY292ZXJ5OiB0cnVlLFxuICB9KTtcbiAgcmV0dXJuIGNvZGUudG9TdHJpbmcoKTtcbn1cblxuLy8g4pSA4pSAIE1haW4g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIGNvbnN0IHsgZGlzdERpciwgc3JjRGlyLCBtYW5pZmVzdFBhdGggfSA9IHBhcnNlQXJncyhwcm9jZXNzLmFyZ3YpO1xuXG4gIC8vIDEuIExvYWQgbWFuaWZlc3RcbiAgY29uc3QgbWFuaWZlc3Q6IFB1cmdlTWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgIGF3YWl0IEJ1bi5maWxlKG1hbmlmZXN0UGF0aCkudGV4dCgpLFxuICApO1xuICBjb25zdCB0b3RhbENvbXBvbmVudHMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKG1hbmlmZXN0KS5tYXAoayA9PiBrLnNwbGl0KFwiLlwiKVswXSkpLnNpemU7XG4gIGNvbnNvbGUubG9nKGBbY3NzLXB1cmdlXSBNYW5pZmVzdCBsb2FkZWQ6ICR7T2JqZWN0LmtleXMobWFuaWZlc3QpLmxlbmd0aH0gZW50cmllcyAoJHt0b3RhbENvbXBvbmVudHN9IGNvbXBvbmVudHMpYCk7XG5cbiAgLy8gMi4gU2NhbiBjb25zdW1lciBzb3VyY2UgZm9yIGRpcmVjdGx5IGltcG9ydGVkIGNvbXBvbmVudHNcbiAgY29uc3QgZGlyZWN0SW1wb3J0cyA9IGF3YWl0IHNjYW5JbXBvcnRlZENvbXBvbmVudHMoc3JjRGlyKTtcbiAgY29uc29sZS5sb2coYFtjc3MtcHVyZ2VdIERpcmVjdCBpbXBvcnRzIGZyb20gYXBwOiAke2RpcmVjdEltcG9ydHMuc2l6ZX0gLyAke3RvdGFsQ29tcG9uZW50c31gKTtcblxuICAvLyAzLiBSZXNvbHZlIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIGZyb20gbWFuaWZlc3QgZGVwc1xuICBjb25zdCBkZXBHcmFwaCA9IGJ1aWxkRGVwR3JhcGhGcm9tTWFuaWZlc3QobWFuaWZlc3QpO1xuICBjb25zdCBpbXBvcnRlZENvbXBvbmVudHMgPSByZXNvbHZlVHJhbnNpdGl2ZURlcHMoZGlyZWN0SW1wb3J0cywgZGVwR3JhcGgpO1xuICBjb25zdCB0cmFuc2l0aXZlID0gaW1wb3J0ZWRDb21wb25lbnRzLnNpemUgLSBkaXJlY3RJbXBvcnRzLnNpemU7XG4gIGNvbnNvbGUubG9nKGBbY3NzLXB1cmdlXSBUcmFuc2l0aXZlIGRlcHM6ICske3RyYW5zaXRpdmV9IOKGkiAke2ltcG9ydGVkQ29tcG9uZW50cy5zaXplfSB0b3RhbCB1c2VkIGNvbXBvbmVudHNgKTtcblxuICAvLyA0LiBCdWlsZCBraWxsLWxpc3QgKGNsYXNzZXMgZnJvbSBjb21wb25lbnRzIG5ldmVyIGltcG9ydGVkKSArIGF0dHIgc2FmZWxpc3RcbiAgY29uc3Qga2lsbExpc3QgPSBidWlsZEtpbGxMaXN0KG1hbmlmZXN0LCBpbXBvcnRlZENvbXBvbmVudHMpO1xuICBjb25zb2xlLmxvZyhgW2Nzcy1wdXJnZV0gS2lsbC1saXN0OiAke2tpbGxMaXN0LnNpemV9IGNsYXNzZXMgZnJvbSAke3RvdGFsQ29tcG9uZW50cyAtIGltcG9ydGVkQ29tcG9uZW50cy5zaXplfSB1bnVzZWQgY29tcG9uZW50c2ApO1xuXG4gIC8vIEFsc28gc2NhbiBmb3IgcHJvcC1sZXZlbCBhdHRyIHB1cmdpbmdcbiAgY29uc3QgdXNhZ2VzID0gYXdhaXQgc2NhbkNvbnN1bWVyU291cmNlKHNyY0Rpcik7XG4gIGNvbnN0IHsgYXR0clNhZmVsaXN0IH0gPSBidWlsZFNhZmVsaXN0cyh1c2FnZXMsIG1hbmlmZXN0KTtcblxuICAvLyA0LiBHbG9iIENTUyBmaWxlcyBpbiBkaXN0XG4gIGNvbnN0IGdsb2IgPSBuZXcgR2xvYihcIioqLyouY3NzXCIpO1xuICBsZXQgdG90YWxCZWZvcmUgPSAwO1xuICBsZXQgdG90YWxBZnRlciA9IDA7XG5cbiAgZm9yIGF3YWl0IChjb25zdCByZWxQYXRoIG9mIGdsb2Iuc2Nhbih7IGN3ZDogZGlzdERpciB9KSkge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gYCR7ZGlzdERpcn0vJHtyZWxQYXRofWA7XG4gICAgY29uc3Qgb3JpZ2luYWxDc3MgPSBhd2FpdCBCdW4uZmlsZShmdWxsUGF0aCkudGV4dCgpO1xuICAgIGNvbnN0IG9yaWdpbmFsU2l6ZSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKG9yaWdpbmFsQ3NzLCBcInV0Zi04XCIpO1xuICAgIHRvdGFsQmVmb3JlICs9IG9yaWdpbmFsU2l6ZTtcblxuICAgIGNvbnNvbGUubG9nKGBbY3NzLXB1cmdlXSBQcm9jZXNzaW5nICR7cmVsUGF0aH0gKCR7KG9yaWdpbmFsU2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCKWApO1xuXG4gICAgLy8gTGV2ZWwgMTogY2xhc3MtbGV2ZWwgcHVyZ2UgKHVudXNlZCBjb21wb25lbnRzIG9ubHkpXG4gICAgbGV0IHB1cmdlZENzcyA9IHB1cmdlQ2xhc3NlcyhvcmlnaW5hbENzcywga2lsbExpc3QpO1xuICAgIGNvbnN0IGFmdGVyTDEgPSBCdWZmZXIuYnl0ZUxlbmd0aChwdXJnZWRDc3MsIFwidXRmLThcIik7XG4gICAgY29uc29sZS5sb2coYFtjc3MtcHVyZ2VdICAgTDEgY2xhc3MgcHVyZ2U6ICR7KG9yaWdpbmFsU2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSl9IOKGkiAkeyhhZnRlckwxIC8gMTAyNCkudG9GaXhlZCgxKX0gS0JgKTtcblxuICAgIC8vIExldmVsIDI6IGF0dHJpYnV0ZS1sZXZlbCBwdXJnZVxuICAgIHB1cmdlZENzcyA9IHB1cmdlQXR0cmlidXRlcyhwdXJnZWRDc3MsIGF0dHJTYWZlbGlzdCk7XG4gICAgY29uc3QgYWZ0ZXJMMiA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHB1cmdlZENzcywgXCJ1dGYtOFwiKTtcbiAgICBjb25zb2xlLmxvZyhgW2Nzcy1wdXJnZV0gICBMMiBhdHRyIHB1cmdlOiAkeyhhZnRlckwxIC8gMTAyNCkudG9GaXhlZCgxKX0g4oaSICR7KGFmdGVyTDIgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQmApO1xuXG4gICAgLy8gTGV2ZWwgMzogdW51c2VkIENTUyB2YXJpYWJsZSBjbGVhbnVwXG4gICAgcHVyZ2VkQ3NzID0gY2xlYW5VbnVzZWRWYXJzKHB1cmdlZENzcyk7XG4gICAgY29uc3QgYWZ0ZXJMMyA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHB1cmdlZENzcywgXCJ1dGYtOFwiKTtcbiAgICBjb25zb2xlLmxvZyhgW2Nzcy1wdXJnZV0gICBMMyB2YXIgY2xlYW51cDog4oaSICR7KGFmdGVyTDMgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQmApO1xuXG4gICAgLy8gRmluYWw6IG1pbmlmaWNhdGlvbiB2aWEgTGlnaHRuaW5nIENTU1xuICAgIHB1cmdlZENzcyA9IG1pbmlmeShwdXJnZWRDc3MpO1xuICAgIGNvbnN0IGZpbmFsU2l6ZSA9IEJ1ZmZlci5ieXRlTGVuZ3RoKHB1cmdlZENzcywgXCJ1dGYtOFwiKTtcbiAgICB0b3RhbEFmdGVyICs9IGZpbmFsU2l6ZTtcbiAgICBjb25zb2xlLmxvZyhgW2Nzcy1wdXJnZV0gICBNaW5pZnkgKGxpZ2h0bmluZ2Nzcyk6IOKGkiAkeyhmaW5hbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSBLQmApO1xuICAgIGNvbnNvbGUubG9nKGBbY3NzLXB1cmdlXSAgIEZpbmFsOiAkeyhvcmlnaW5hbFNpemUgLyAxMDI0KS50b0ZpeGVkKDEpfSDihpIgJHsoZmluYWxTaXplIC8gMTAyNCkudG9GaXhlZCgxKX0gS0IgKCR7KCgxIC0gZmluYWxTaXplIC8gb3JpZ2luYWxTaXplKSAqIDEwMCkudG9GaXhlZCgxKX0lIHJlZHVjdGlvbilgKTtcblxuICAgIGF3YWl0IEJ1bi53cml0ZShmdWxsUGF0aCwgcHVyZ2VkQ3NzKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBcXG5bY3NzLXB1cmdlXSBUb3RhbDogJHsodG90YWxCZWZvcmUgLyAxMDI0KS50b0ZpeGVkKDEpfSDihpIgJHsodG90YWxBZnRlciAvIDEwMjQpLnRvRml4ZWQoMSl9IEtCICgkeygoMSAtIHRvdGFsQWZ0ZXIgLyB0b3RhbEJlZm9yZSkgKiAxMDApLnRvRml4ZWQoMSl9JSByZWR1Y3Rpb24pYCk7XG59XG5cbm1haW4oKTtcbiIsCiAgICAiaW1wb3J0IGluZGV4IGZyb20gJy4vaW5kZXguanMnO1xuXG5jb25zdCB7IHRyYW5zZm9ybSwgdHJhbnNmb3JtU3R5bGVBdHRyaWJ1dGUsIGJ1bmRsZSwgYnVuZGxlQXN5bmMsIGJyb3dzZXJzbGlzdFRvVGFyZ2V0cywgY29tcG9zZVZpc2l0b3JzLCBGZWF0dXJlcyB9ID0gaW5kZXg7XG5leHBvcnQgeyB0cmFuc2Zvcm0sIHRyYW5zZm9ybVN0eWxlQXR0cmlidXRlLCBidW5kbGUsIGJ1bmRsZUFzeW5jLCBicm93c2Vyc2xpc3RUb1RhcmdldHMsIGNvbXBvc2VWaXNpdG9ycywgRmVhdHVyZXMgfTtcbiIsCiAgICAiLyoqXG4gKiBDb25zdW1lci1zaWRlIEpTWCBzY2FubmVyLlxuICpcbiAqIFdhbGtzIGEgY29uc3VtZXIncyBzb3VyY2UgdHJlZSwgZmluZHMgY29tcG9uZW50IGltcG9ydHMgZnJvbSBAcGF0aHNjYWxlL3VpLFxuICogY29sbGVjdHMgcHJvcCB2YWx1ZXMsIGFuZCBjcm9zcy1yZWZlcmVuY2VzIHdpdGggdGhlIHB1cmdlIG1hbmlmZXN0IHRvIGJ1aWxkXG4gKiBMZXZlbCAxIChjbGFzcykgYW5kIExldmVsIDIgKGF0dHJpYnV0ZSkgc2FmZWxpc3RzLlxuICpcbiAqIFVzYWdlOiAgYnVuIHJ1biBzcmMvc2Nhbi1jb25zdW1lci50cyA8Y29uc3VtZXItc3JjLWRpcj4gPHB1cmdlLW1hbmlmZXN0Lmpzb24+XG4gKi9cblxuaW1wb3J0IHN3YyBmcm9tIFwiQHN3Yy9jb3JlXCI7XG5pbXBvcnQgeyBHbG9iIH0gZnJvbSBcImJ1blwiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcblxuLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgQ29tcG9uZW50TWFuaWZlc3Qge1xuICBjbGFzc2VzOiB7XG4gICAgYWx3YXlzOiBzdHJpbmdbXTtcbiAgICBieVByb3A6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nW10+PjtcbiAgfTtcbiAgYXR0cnM/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgZGVwcz86IHN0cmluZ1tdO1xufVxuXG50eXBlIFB1cmdlTWFuaWZlc3QgPSBSZWNvcmQ8c3RyaW5nLCBDb21wb25lbnRNYW5pZmVzdD47XG5cbi8qKiBXaGF0IHdlIGNvbGxlY3QgcGVyIGNvbXBvbmVudCB1c2FnZSBmcm9tIEpTWCAqL1xuaW50ZXJmYWNlIFByb3BVc2FnZSB7XG4gIGNvbXBvbmVudDogc3RyaW5nO1xuICBwcm9wczogTWFwPHN0cmluZywgc3RyaW5nIHwgXCJEWU5BTUlDXCI+OyAvLyBwcm9wTmFtZSDihpIgbGl0ZXJhbCB2YWx1ZSBvciBEWU5BTUlDXG4gIGJvb2xlYW5Qcm9wczogU2V0PHN0cmluZz47IC8vIHByb3BzIHByZXNlbnQgd2l0aG91dCBhIHZhbHVlICh0cnV0aHkpXG4gIGhhc1NwcmVhZDogYm9vbGVhbjtcbn1cblxuLy8g4pSA4pSAIEFTVCB3YWxrZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIHdhbGtBU1Qobm9kZTogYW55LCB2aXNpdG9yOiAobm9kZTogYW55KSA9PiB2b2lkKSB7XG4gIGlmICghbm9kZSB8fCB0eXBlb2Ygbm9kZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuO1xuICB2aXNpdG9yKG5vZGUpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhub2RlKSkge1xuICAgIGlmIChrZXkgPT09IFwic3BhblwiKSBjb250aW51ZTtcbiAgICBjb25zdCB2YWwgPSBub2RlW2tleV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbCkgd2Fsa0FTVChpdGVtLCB2aXNpdG9yKTtcbiAgICB9IGVsc2UgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiKSB7XG4gICAgICB3YWxrQVNUKHZhbCwgdmlzaXRvcik7XG4gICAgfVxuICB9XG59XG5cbi8qKiBFeHRyYWN0IEBwYXRoc2NhbGUvdWkgaW1wb3J0cyBmcm9tIGEgcGFyc2VkIG1vZHVsZSAqL1xuZnVuY3Rpb24gZXh0cmFjdFVJSW1wb3J0cyhhc3Q6IGFueSk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBpbXBvcnRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBub2RlIG9mIGFzdC5ib2R5KSB7XG4gICAgaWYgKG5vZGUudHlwZSAhPT0gXCJJbXBvcnREZWNsYXJhdGlvblwiKSBjb250aW51ZTtcbiAgICBjb25zdCBzcmMgPSBub2RlLnNvdXJjZT8udmFsdWUgYXMgc3RyaW5nO1xuICAgIGlmICghc3JjIHx8ICFzcmMuc3RhcnRzV2l0aChcIkBwYXRoc2NhbGUvdWlcIikpIGNvbnRpbnVlO1xuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIG5vZGUuc3BlY2lmaWVycykge1xuICAgICAgaWYgKHNwZWMudHlwZSA9PT0gXCJJbXBvcnRTcGVjaWZpZXJcIikge1xuICAgICAgICBjb25zdCBpbXBvcnRlZCA9IHNwZWMuaW1wb3J0ZWQ/LnZhbHVlID8/IHNwZWMubG9jYWw/LnZhbHVlO1xuICAgICAgICBjb25zdCBsb2NhbCA9IHNwZWMubG9jYWw/LnZhbHVlO1xuICAgICAgICBpZiAobG9jYWwgJiYgaW1wb3J0ZWQpIGltcG9ydHMuc2V0KGxvY2FsLCBpbXBvcnRlZCk7XG4gICAgICB9IGVsc2UgaWYgKHNwZWMudHlwZSA9PT0gXCJJbXBvcnREZWZhdWx0U3BlY2lmaWVyXCIpIHtcbiAgICAgICAgY29uc3QgbG9jYWwgPSBzcGVjLmxvY2FsPy52YWx1ZTtcbiAgICAgICAgaWYgKGxvY2FsKSBpbXBvcnRzLnNldChsb2NhbCwgbG9jYWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaW1wb3J0cztcbn1cblxuLyoqIEV4dHJhY3QgSlNYIHVzYWdlcyBvZiBVSSBjb21wb25lbnRzICovXG5mdW5jdGlvbiBleHRyYWN0SlNYVXNhZ2VzKGFzdDogYW55LCB1aUNvbXBvbmVudHM6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBQcm9wVXNhZ2VbXSB7XG4gIGNvbnN0IHVzYWdlczogUHJvcFVzYWdlW10gPSBbXTtcblxuICB3YWxrQVNUKGFzdCwgKG5vZGUpID0+IHtcbiAgICBpZiAobm9kZS50eXBlICE9PSBcIkpTWE9wZW5pbmdFbGVtZW50XCIpIHJldHVybjtcblxuICAgIGxldCBlbGVtZW50TmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHJvb3ROYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIGlmIChub2RlLm5hbWU/LnR5cGUgPT09IFwiSWRlbnRpZmllclwiKSB7XG4gICAgICBlbGVtZW50TmFtZSA9IG5vZGUubmFtZS52YWx1ZTtcbiAgICAgIHJvb3ROYW1lID0gZWxlbWVudE5hbWU7XG4gICAgfSBlbHNlIGlmIChub2RlLm5hbWU/LnR5cGUgPT09IFwiSlNYTWVtYmVyRXhwcmVzc2lvblwiKSB7XG4gICAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCBjdXJzb3IgPSBub2RlLm5hbWU7XG4gICAgICB3aGlsZSAoY3Vyc29yPy50eXBlID09PSBcIkpTWE1lbWJlckV4cHJlc3Npb25cIikge1xuICAgICAgICBwYXJ0cy51bnNoaWZ0KGN1cnNvci5wcm9wZXJ0eT8udmFsdWUpO1xuICAgICAgICBjdXJzb3IgPSBjdXJzb3Iub2JqZWN0O1xuICAgICAgfVxuICAgICAgaWYgKGN1cnNvcj8udHlwZSA9PT0gXCJJZGVudGlmaWVyXCIpIHtcbiAgICAgICAgcGFydHMudW5zaGlmdChjdXJzb3IudmFsdWUpO1xuICAgICAgICByb290TmFtZSA9IGN1cnNvci52YWx1ZTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnROYW1lID0gcGFydHMuam9pbihcIi5cIik7XG4gICAgfVxuXG4gICAgaWYgKCFyb290TmFtZSB8fCAhdWlDb21wb25lbnRzLmhhcyhyb290TmFtZSkpIHJldHVybjtcblxuICAgIGNvbnN0IHVzYWdlOiBQcm9wVXNhZ2UgPSB7XG4gICAgICBjb21wb25lbnQ6IGVsZW1lbnROYW1lISxcbiAgICAgIHByb3BzOiBuZXcgTWFwKCksXG4gICAgICBib29sZWFuUHJvcHM6IG5ldyBTZXQoKSxcbiAgICAgIGhhc1NwcmVhZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgYXR0ciBvZiBub2RlLmF0dHJpYnV0ZXMgfHwgW10pIHtcbiAgICAgIGlmIChhdHRyLnR5cGUgPT09IFwiU3ByZWFkRWxlbWVudFwiIHx8IGF0dHIudHlwZSA9PT0gXCJKU1hTcHJlYWRBdHRyaWJ1dGVcIikge1xuICAgICAgICB1c2FnZS5oYXNTcHJlYWQgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhdHRyLnR5cGUgIT09IFwiSlNYQXR0cmlidXRlXCIpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwcm9wTmFtZSA9IGF0dHIubmFtZT8udmFsdWU7XG4gICAgICBpZiAoIXByb3BOYW1lKSBjb250aW51ZTtcblxuICAgICAgaWYgKCFhdHRyLnZhbHVlKSB7XG4gICAgICAgIHVzYWdlLmJvb2xlYW5Qcm9wcy5hZGQocHJvcE5hbWUpO1xuICAgICAgfSBlbHNlIGlmIChhdHRyLnZhbHVlLnR5cGUgPT09IFwiU3RyaW5nTGl0ZXJhbFwiKSB7XG4gICAgICAgIHVzYWdlLnByb3BzLnNldChwcm9wTmFtZSwgYXR0ci52YWx1ZS52YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1c2FnZS5wcm9wcy5zZXQocHJvcE5hbWUsIFwiRFlOQU1JQ1wiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1c2FnZXMucHVzaCh1c2FnZSk7XG4gIH0pO1xuXG4gIHJldHVybiB1c2FnZXM7XG59XG5cbi8vIOKUgOKUgCBTYWZlbGlzdCBidWlsZGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgU2FmZWxpc3RzIHtcbiAgY2xhc3NTYWZlbGlzdDogU2V0PHN0cmluZz47XG4gIGF0dHJTYWZlbGlzdDogU2V0PHN0cmluZz47XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU2FmZWxpc3RzKFxuICBhbGxVc2FnZXM6IFByb3BVc2FnZVtdLFxuICBtYW5pZmVzdDogUHVyZ2VNYW5pZmVzdCxcbik6IFNhZmVsaXN0cyB7XG4gIGNvbnN0IGNsYXNzU2FmZWxpc3QgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgYXR0clNhZmVsaXN0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3QgY29tcG9uZW50VXNhZ2VzID0gbmV3IE1hcDxzdHJpbmcsIFByb3BVc2FnZVtdPigpO1xuICBmb3IgKGNvbnN0IHVzYWdlIG9mIGFsbFVzYWdlcykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gY29tcG9uZW50VXNhZ2VzLmdldCh1c2FnZS5jb21wb25lbnQpID8/IFtdO1xuICAgIGV4aXN0aW5nLnB1c2godXNhZ2UpO1xuICAgIGNvbXBvbmVudFVzYWdlcy5zZXQodXNhZ2UuY29tcG9uZW50LCBleGlzdGluZyk7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtlbnRyeU5hbWUsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhtYW5pZmVzdCkpIHtcbiAgICBjb25zdCBtYXRjaGluZ1VzYWdlcyA9IGZpbmRNYXRjaGluZ1VzYWdlcyhlbnRyeU5hbWUsIGNvbXBvbmVudFVzYWdlcyk7XG5cbiAgICBpZiAobWF0Y2hpbmdVc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNscyBvZiBlbnRyeS5jbGFzc2VzLmFsd2F5cykge1xuICAgICAgY2xhc3NTYWZlbGlzdC5hZGQoY2xzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wT3JTbG90LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cnkuY2xhc3Nlcy5ieVByb3ApKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKGlzUHJvcFVzZWQocHJvcE9yU2xvdCwgbWF0Y2hpbmdVc2FnZXMpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjbHMgb2YgdmFsdWUpIGNsYXNzU2FmZWxpc3QuYWRkKGNscyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHVzZWRWYWx1ZXMgPSBnZXRVc2VkRW51bVZhbHVlcyhwcm9wT3JTbG90LCBtYXRjaGluZ1VzYWdlcyk7XG4gICAgICAgIGlmICh1c2VkVmFsdWVzID09PSBcIkFMTFwiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBjbGFzc2VzIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNscyBvZiBjbGFzc2VzKSBjbGFzc1NhZmVsaXN0LmFkZChjbHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB1c2VkVmFsdWVzKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVbdmFsXSkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNscyBvZiB2YWx1ZVt2YWxdKSBjbGFzc1NhZmVsaXN0LmFkZChjbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeS5hdHRycykge1xuICAgICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGF0dHJNYXBdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJ5LmF0dHJzKSkge1xuICAgICAgICBpZiAoaXNQcm9wVXNlZChwcm9wTmFtZSwgbWF0Y2hpbmdVc2FnZXMpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbYXR0ciwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhhdHRyTWFwKSkge1xuICAgICAgICAgICAgYXR0clNhZmVsaXN0LmFkZChgJHthdHRyfT0ke3ZhbH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBjbGFzc1NhZmVsaXN0LCBhdHRyU2FmZWxpc3QgfTtcbn1cblxuZnVuY3Rpb24gZmluZE1hdGNoaW5nVXNhZ2VzKFxuICBlbnRyeU5hbWU6IHN0cmluZyxcbiAgdXNhZ2VNYXA6IE1hcDxzdHJpbmcsIFByb3BVc2FnZVtdPixcbik6IFByb3BVc2FnZVtdIHtcbiAgaWYgKHVzYWdlTWFwLmhhcyhlbnRyeU5hbWUpKSB7XG4gICAgcmV0dXJuIHVzYWdlTWFwLmdldChlbnRyeU5hbWUpITtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdHM6IFByb3BVc2FnZVtdID0gW107XG4gIGZvciAoY29uc3QgW3VzYWdlTmFtZSwgdXNhZ2VzXSBvZiB1c2FnZU1hcCkge1xuICAgIGlmICh1c2FnZU5hbWUgPT09IGVudHJ5TmFtZSkge1xuICAgICAgcmVzdWx0cy5wdXNoKC4uLnVzYWdlcyk7XG4gICAgfVxuICAgIGlmIChlbnRyeU5hbWUuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICBjb25zdCBbZmFtaWx5LCBwYXJ0XSA9IGVudHJ5TmFtZS5zcGxpdChcIi5cIik7XG4gICAgICBpZiAocGFydCA9PT0gZmFtaWx5ICYmIHVzYWdlTmFtZSA9PT0gZmFtaWx5KSB7XG4gICAgICAgIHJlc3VsdHMucHVzaCguLi51c2FnZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gaXNQcm9wVXNlZChwcm9wTmFtZTogc3RyaW5nLCB1c2FnZXM6IFByb3BVc2FnZVtdKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgdXNhZ2Ugb2YgdXNhZ2VzKSB7XG4gICAgaWYgKHVzYWdlLmhhc1NwcmVhZCkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHVzYWdlLmJvb2xlYW5Qcm9wcy5oYXMocHJvcE5hbWUpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodXNhZ2UucHJvcHMuaGFzKHByb3BOYW1lKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRVc2VkRW51bVZhbHVlcyhzbG90TmFtZTogc3RyaW5nLCB1c2FnZXM6IFByb3BVc2FnZVtdKTogU2V0PHN0cmluZz4gfCBcIkFMTFwiIHtcbiAgY29uc3QgdmFsdWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgdXNhZ2Ugb2YgdXNhZ2VzKSB7XG4gICAgaWYgKHVzYWdlLmhhc1NwcmVhZCkgcmV0dXJuIFwiQUxMXCI7XG4gICAgY29uc3QgdmFsID0gdXNhZ2UucHJvcHMuZ2V0KHNsb3ROYW1lKTtcbiAgICBpZiAodmFsID09PSBcIkRZTkFNSUNcIikgcmV0dXJuIFwiQUxMXCI7XG4gICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB2YWx1ZXMuYWRkKHZhbCk7XG4gICAgaWYgKHVzYWdlLmJvb2xlYW5Qcm9wcy5oYXMoc2xvdE5hbWUpKSByZXR1cm4gXCJBTExcIjtcbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuXG4vLyDilIDilIAgQ29uc3VtZXIgc291cmNlIHNjYW5uaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5hc3luYyBmdW5jdGlvbiBzY2FuQ29uc3VtZXJTb3VyY2Uoc3JjRGlyOiBzdHJpbmcpOiBQcm9taXNlPFByb3BVc2FnZVtdPiB7XG4gIGNvbnN0IGFsbFVzYWdlczogUHJvcFVzYWdlW10gPSBbXTtcbiAgY29uc3QgZ2xvYiA9IG5ldyBHbG9iKFwiKiovKi57dHN4LHRzLGpzeCxqc31cIik7XG5cbiAgZm9yIGF3YWl0IChjb25zdCByZWxQYXRoIG9mIGdsb2Iuc2Nhbih7IGN3ZDogc3JjRGlyIH0pKSB7XG4gICAgaWYgKHJlbFBhdGguaW5jbHVkZXMoXCJub2RlX21vZHVsZXNcIikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHNyY0RpciwgcmVsUGF0aCk7XG4gICAgY29uc3QgY29kZSA9IGF3YWl0IEJ1bi5maWxlKGZ1bGxQYXRoKS50ZXh0KCk7XG4gICAgaWYgKCFjb2RlLmluY2x1ZGVzKFwiQHBhdGhzY2FsZS91aVwiKSkgY29udGludWU7XG5cbiAgICBjb25zdCBpc1RzeCA9IC9cXC5bdGpdc3gkLy50ZXN0KHJlbFBhdGgpO1xuICAgIGNvbnN0IGFzdCA9IGF3YWl0IHN3Yy5wYXJzZShjb2RlLCB7IHN5bnRheDogXCJ0eXBlc2NyaXB0XCIsIHRzeDogaXNUc3ggfSk7XG4gICAgY29uc3QgdWlJbXBvcnRzID0gZXh0cmFjdFVJSW1wb3J0cyhhc3QpO1xuICAgIGlmICh1aUltcG9ydHMuc2l6ZSA9PT0gMCkgY29udGludWU7XG5cbiAgICBhbGxVc2FnZXMucHVzaCguLi5leHRyYWN0SlNYVXNhZ2VzKGFzdCwgdWlJbXBvcnRzKSk7XG4gIH1cblxuICByZXR1cm4gYWxsVXNhZ2VzO1xufVxuXG4vLyDilIDilIAgTWFpbiAoc3RhbmRhbG9uZSBDTEkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICBjb25zdCBbc3JjRGlyLCBtYW5pZmVzdFBhdGhdID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpO1xuICBpZiAoIXNyY0RpciB8fCAhbWFuaWZlc3RQYXRoKSB7XG4gICAgY29uc29sZS5lcnJvcihcIlVzYWdlOiBidW4gcnVuIHNyYy9zY2FuLWNvbnN1bWVyLnRzIDxjb25zdW1lci1zcmMtZGlyPiA8cHVyZ2UtbWFuaWZlc3QuanNvbj5cIik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgY29uc3QgbWFuaWZlc3Q6IFB1cmdlTWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgIGF3YWl0IEJ1bi5maWxlKG1hbmlmZXN0UGF0aCkudGV4dCgpLFxuICApO1xuICBjb25zdCByZXNvbHZlZFNyYyA9IHBhdGgucmVzb2x2ZShzcmNEaXIpO1xuICBjb25zb2xlLmxvZyhgU2Nhbm5pbmcgJHtyZXNvbHZlZFNyY30gZm9yIEBwYXRoc2NhbGUvdWkgY29tcG9uZW50IHVzYWdl4oCmYCk7XG4gIGNvbnNvbGUubG9nKGBNYW5pZmVzdDogJHtPYmplY3Qua2V5cyhtYW5pZmVzdCkubGVuZ3RofSBlbnRyaWVzXFxuYCk7XG5cbiAgY29uc3QgdXNhZ2VzID0gYXdhaXQgc2NhbkNvbnN1bWVyU291cmNlKHJlc29sdmVkU3JjKTtcbiAgY29uc3QgeyBjbGFzc1NhZmVsaXN0LCBhdHRyU2FmZWxpc3QgfSA9IGJ1aWxkU2FmZWxpc3RzKHVzYWdlcywgbWFuaWZlc3QpO1xuXG4gIGNvbnNvbGUubG9nKFwiPT09IENsYXNzIFNhZmVsaXN0ID09PVwiKTtcbiAgZm9yIChjb25zdCBjbHMgb2YgWy4uLmNsYXNzU2FmZWxpc3RdLnNvcnQoKSkge1xuICAgIGNvbnNvbGUubG9nKGAgICR7Y2xzfWApO1xuICB9XG5cbiAgY29uc29sZS5sb2coYFxcbj09PSBBdHRyaWJ1dGUgU2FmZWxpc3QgPT09YCk7XG4gIGZvciAoY29uc3QgYXR0ciBvZiBbLi4uYXR0clNhZmVsaXN0XS5zb3J0KCkpIHtcbiAgICBjb25zb2xlLmxvZyhgICBbJHthdHRyfV1gKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBcXG5Ub3RhbDogJHtjbGFzc1NhZmVsaXN0LnNpemV9IGNsYXNzZXMsICR7YXR0clNhZmVsaXN0LnNpemV9IGF0dHJpYnV0ZSBzZWxlY3RvcnNgKTtcbn1cblxuLy8gT25seSBydW4gQ0xJIHdoZW4gaW52b2tlZCBkaXJlY3RseSAobm90IHdoZW4gaW1wb3J0ZWQgYXMgYSBtb2R1bGUpXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBtYWluKCk7XG59XG5cbmV4cG9ydCB7IGV4dHJhY3RVSUltcG9ydHMsIGV4dHJhY3RKU1hVc2FnZXMsIGJ1aWxkU2FmZWxpc3RzLCBzY2FuQ29uc3VtZXJTb3VyY2UgfTtcbmV4cG9ydCB0eXBlIHsgUHJvcFVzYWdlLCBQdXJnZU1hbmlmZXN0LCBDb21wb25lbnRNYW5pZmVzdCwgU2FmZWxpc3RzIH07XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBS0EsSUFBTSxVQUFVLE1BQU0sUUFBUSxhQUFhO0FBQUEsRUFFM0MsSUFBSSxTQUFTO0FBQUEsRUFDYixJQUFNLFlBQVksTUFBTTtBQUFBLElBQ3RCLElBQUksQ0FBQyxRQUFRO0FBQUEsTUFFWCxJQUFJLFFBQVEsS0FBSyxRQUFRLFFBQVE7QUFBQSxRQUMvQixNQUFNLE9BQU8sUUFBUSxPQUFPO0FBQUEsUUFDNUIsUUFBUSxPQUFPLGlCQUFpQjtBQUFBLFFBQ2hDLFNBQVMsUUFBUSxPQUFPLFVBQVU7QUFBQSxRQUNsQyxRQUFRLE9BQU8saUJBQWlCO0FBQUEsTUFDbEMsRUFBTztBQUFBLFFBQ0wsU0FBUyxDQUFDO0FBQUE7QUFBQSxJQUVkO0FBQUEsSUFDQSxPQUFPO0FBQUE7QUFBQSxFQUdULE9BQU8sVUFBVSxFQUFFLFNBQVMsVUFBVTtBQUFBOzs7O0VDbEJ0QyxJQUFNO0FBQUEsRUFFTixJQUFNLFdBQVc7QUFBQSxFQUNqQixJQUFNLFlBQVk7QUFBQSxFQUNsQixJQUFNLGFB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