@mnaoumov/obsidian-dev-toolkit 3.2.1 → 3.4.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.
- package/dist/lib/cjs/demo-vault-coverage.cjs +139 -44
- package/dist/lib/cjs/demo-vault-coverage.d.cts +100 -5
- package/dist/lib/cjs/index.cjs +1 -7
- package/dist/lib/cjs/index.d.cts +0 -2
- package/dist/lib/cjs/test-runners/index.cjs +1 -4
- package/dist/lib/cjs/test-runners/index.d.cts +0 -1
- package/dist/lib/esm/demo-vault-coverage.d.mts +100 -5
- package/dist/lib/esm/demo-vault-coverage.mjs +139 -44
- package/dist/lib/esm/index.d.mts +0 -2
- package/dist/lib/esm/index.mjs +1 -5
- package/dist/lib/esm/test-runners/index.d.mts +0 -1
- package/dist/lib/esm/test-runners/index.mjs +1 -3
- package/package.json +2 -2
|
@@ -139,15 +139,16 @@ class DemoVaultCoverageChecker {
|
|
|
139
139
|
return this.collectCheckableNotes().filter((note) => !hasIntroProse(note.content)).map((note) => note.relativePath);
|
|
140
140
|
}
|
|
141
141
|
/**
|
|
142
|
-
* Finds notes whose
|
|
143
|
-
*
|
|
144
|
-
* any more, which would go on hiding
|
|
142
|
+
* Finds notes whose exemptions are not doing any work — a wikilink allowance or an inline directive for
|
|
143
|
+
* any rule declared without a reason, misspelled, or covering nothing that breaks its rule. All of them
|
|
144
|
+
* are drift: an exemption nobody can justify, and one nothing needs any more, which would go on hiding
|
|
145
|
+
* the next mistake somebody makes by accident.
|
|
145
146
|
*
|
|
146
|
-
* @returns
|
|
147
|
+
* @returns One `<note>: <problem>` entry per problem found.
|
|
147
148
|
*/
|
|
148
149
|
findNotesWithUnjustifiedWikilinkAllowance() {
|
|
149
150
|
return this.collectCheckableNotes().flatMap((note) => {
|
|
150
|
-
const scan =
|
|
151
|
+
const scan = scanDirectives(note.content);
|
|
151
152
|
const problems = [...scan.problems];
|
|
152
153
|
const reason = readWikilinkAllowanceReason(note.content);
|
|
153
154
|
if (reason !== null) {
|
|
@@ -155,7 +156,7 @@ class DemoVaultCoverageChecker {
|
|
|
155
156
|
problems.push("a note-level allowance with no reason");
|
|
156
157
|
} else if (!hasWikilink(note.content)) {
|
|
157
158
|
problems.push("a note-level allowance covering no wikilink");
|
|
158
|
-
} else if (scan.
|
|
159
|
+
} else if (getAllowedLineIndexes(scan, WIKILINK_RULE).size > 0) {
|
|
159
160
|
problems.push("inline directives the note-level allowance already covers");
|
|
160
161
|
}
|
|
161
162
|
}
|
|
@@ -175,7 +176,7 @@ class DemoVaultCoverageChecker {
|
|
|
175
176
|
if (readWikilinkAllowanceReason(note.content) !== null) {
|
|
176
177
|
return false;
|
|
177
178
|
}
|
|
178
|
-
const
|
|
179
|
+
const allowedLineIndexes = getAllowedLineIndexes(scanDirectives(note.content), WIKILINK_RULE);
|
|
179
180
|
return findWikilinkLineIndexes(note.content).some((lineIndex) => !allowedLineIndexes.has(lineIndex));
|
|
180
181
|
}).map((note) => note.relativePath);
|
|
181
182
|
}
|
|
@@ -190,6 +191,21 @@ class DemoVaultCoverageChecker {
|
|
|
190
191
|
const referenced = [...this.readCorpus().matchAll(new RegExp(String.raw`${params.receiver}\.(?<member>\w+)`, "g"))].map((match) => (0, import_reg_exp.getMandatoryNamedGroup)(match, "member"));
|
|
191
192
|
return [...new Set(referenced)].filter((member) => !validMembers.has(member));
|
|
192
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* Finds `Try it` sections with no `code-button` in them. A `Try it` section is a heading of any level
|
|
196
|
+
* starting `Try it`, up to the next heading of the same or a higher level; the setup it asks for is
|
|
197
|
+
* what a button is for, so a section that leaves the reader to do it by hand is the shape this check
|
|
198
|
+
* rejects. A section whose heading a `demo-vault-validation/try-it-code-button` directive covers has
|
|
199
|
+
* stated why it cannot be scripted, and is skipped — see the file overview.
|
|
200
|
+
*
|
|
201
|
+
* @returns One `<note>: line <n>` entry per offending section, naming the line of its heading.
|
|
202
|
+
*/
|
|
203
|
+
findTryItSectionsWithoutCodeButton() {
|
|
204
|
+
return this.collectCheckableNotes().flatMap((note) => {
|
|
205
|
+
const allowedLineIndexes = getAllowedLineIndexes(scanDirectives(note.content), TRY_IT_RULE);
|
|
206
|
+
return findTryItLineIndexesWithoutCodeButton(note.content).filter((lineIndex) => !allowedLineIndexes.has(lineIndex)).map((lineIndex) => `${note.relativePath}: ${formatLineNumber(lineIndex)}`);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
193
209
|
/**
|
|
194
210
|
* Finds members that are not demonstrated anywhere in the demo corpus.
|
|
195
211
|
*
|
|
@@ -305,6 +321,7 @@ function registerDemoVaultCoverageSuite(params) {
|
|
|
305
321
|
rootFolder: params.rootFolder
|
|
306
322
|
}));
|
|
307
323
|
const startNote = params.authoring?.startNote ?? DEFAULT_START_NOTE;
|
|
324
|
+
const tryItCodeButtons = params.authoring?.tryItCodeButtons ?? DEFAULT_TRY_IT_CODE_BUTTONS_SEVERITY;
|
|
308
325
|
(0, import_vitest.describe)("demo-vault coverage", () => {
|
|
309
326
|
for (const spec of params.interfaces ?? []) {
|
|
310
327
|
(0, import_vitest.it)(`demonstrates every ${spec.interfaceName} ${spec.kind}`, () => {
|
|
@@ -350,9 +367,19 @@ function registerDemoVaultCoverageSuite(params) {
|
|
|
350
367
|
(0, import_vitest.it)("uses no wikilinks, which do not render on GitHub", () => {
|
|
351
368
|
(0, import_vitest.expect)(checker.findNotesWithWikilinks()).toEqual([]);
|
|
352
369
|
});
|
|
353
|
-
(0, import_vitest.it)("justifies every wikilink allowance, and declares none it no longer needs", () => {
|
|
370
|
+
(0, import_vitest.it)("justifies every wikilink allowance and directive, and declares none it no longer needs", () => {
|
|
354
371
|
(0, import_vitest.expect)(checker.findNotesWithUnjustifiedWikilinkAllowance()).toEqual([]);
|
|
355
372
|
});
|
|
373
|
+
(0, import_vitest.it)("gives every Try it section a code button, or a stated reason it has none", () => {
|
|
374
|
+
const sections = checker.findTryItSectionsWithoutCodeButton();
|
|
375
|
+
if (tryItCodeButtons === "error") {
|
|
376
|
+
(0, import_vitest.expect)(sections).toEqual([]);
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
if (sections.length > 0) {
|
|
380
|
+
console.warn(formatTryItWarning(sections));
|
|
381
|
+
}
|
|
382
|
+
});
|
|
356
383
|
(0, import_vitest.it)("carries no Docs link line, because the note is the docs", () => {
|
|
357
384
|
(0, import_vitest.expect)(checker.findNotesWithDocsLinks()).toEqual([]);
|
|
358
385
|
});
|
|
@@ -377,25 +404,35 @@ const ABSOLUTE_URL_REG_EXP = /^[a-z][\w+.-]*:/i;
|
|
|
377
404
|
const ARROW_REG_EXP = /^\s*=>/;
|
|
378
405
|
const FUNCTION_TYPE_PARAMETERS_REG_EXP = /^<[^>]*>\s*/;
|
|
379
406
|
const ANGLE_BRACKETS_REG_EXP = /^<|>$/g;
|
|
407
|
+
const CODE_BUTTON_FENCE_REG_EXP = /^\s*(?:```|~~~)\s*code-button\b/;
|
|
380
408
|
const CODE_FENCE_REG_EXP = /^\s*(?:```|~~~)/;
|
|
381
409
|
const DEFAULT_EXCLUDED_NOTES = ["README.md"];
|
|
382
410
|
const DEFAULT_START_NOTE = "00 Start.md";
|
|
411
|
+
const DEFAULT_TRY_IT_CODE_BUTTONS_SEVERITY = "error";
|
|
383
412
|
const DOCS_LINK_REG_EXP = /^\s*\[Docs]\(/;
|
|
384
413
|
const FRONTMATTER_REG_EXP = /^---\r?\n[\s\S]*?\r?\n---[^\S\n]*\r?\n?/;
|
|
385
414
|
const H1_REG_EXP = /^# \S/;
|
|
415
|
+
const HEADING_LEVEL_REG_EXP = /^ {0,3}(?<hashes>#{1,6})(?:\s|$)/;
|
|
386
416
|
const HEADING_REG_EXP = /^#{1,6} /;
|
|
387
417
|
const INLINE_CODE_REG_EXP = /`[^`\n]*`/g;
|
|
388
418
|
const MARKDOWN_LINK_REG_EXP = /\[[^\]]*]\((?<target>[^)]+)\)/g;
|
|
389
419
|
const DIRECTIVE_REG_EXP = /^\s*<!--\s*obsidian-dev-utils-(?<action>disable-next-line|disable|enable)\s+(?<rule>[\w-]+\/[\w-]+)(?:\s+--\s+(?<reason>.*?))?\s*-->\s*$/;
|
|
390
420
|
const DIRECTIVE_PROBE_REG_EXP = /<!--\s*obsidian-dev-utils-/;
|
|
421
|
+
const TRY_IT_HEADING_REG_EXP = /^ {0,3}#{1,6}\s+Try it\b/i;
|
|
422
|
+
const TRY_IT_RULE = "demo-vault-validation/try-it-code-button";
|
|
391
423
|
const WIKILINK_RULE = "demo-vault-validation/no-wikilinks";
|
|
424
|
+
const DIRECTIVE_RULE_TARGETS = /* @__PURE__ */ new Map([
|
|
425
|
+
[TRY_IT_RULE, "Try it section without a code button"],
|
|
426
|
+
[WIKILINK_RULE, "wikilink"]
|
|
427
|
+
]);
|
|
392
428
|
const WIKILINK_ALLOWANCE_REG_EXP = /^obsidian-dev-utils:[^\S\n]*\n(?:[^\S\n]+.*\n)*?[^\S\n]+demo-vault-validation:[^\S\n]*\n(?:[^\S\n]+.*\n)*?[^\S\n]+allow-wikilinks:(?<reason>.*)$/m;
|
|
393
429
|
const WIKILINK_REG_EXP = /\[\[[^\]]+]]/;
|
|
394
|
-
function
|
|
430
|
+
function applyDirective(state, lineIndex, match) {
|
|
395
431
|
const action = (0, import_reg_exp.getMandatoryNamedGroup)(match, "action");
|
|
396
432
|
const rule = (0, import_reg_exp.getMandatoryNamedGroup)(match, "rule");
|
|
397
433
|
const reason = match.groups?.["reason"]?.trim() ?? "";
|
|
398
|
-
|
|
434
|
+
const target = DIRECTIVE_RULE_TARGETS.get(rule);
|
|
435
|
+
if (target === void 0) {
|
|
399
436
|
state.problems.push(`an unknown rule "${rule}" on ${formatLineNumber(lineIndex)}`);
|
|
400
437
|
return;
|
|
401
438
|
}
|
|
@@ -404,40 +441,46 @@ function applyWikilinkDirective(state, lineIndex, match) {
|
|
|
404
441
|
return;
|
|
405
442
|
}
|
|
406
443
|
if (action === "disable-next-line") {
|
|
407
|
-
state.
|
|
444
|
+
state.pendingNextLineIndexesByRule.set(rule, lineIndex);
|
|
408
445
|
return;
|
|
409
446
|
}
|
|
447
|
+
const openRegion = state.openRegionsByRule.get(rule);
|
|
410
448
|
if (action === "disable") {
|
|
411
|
-
if (
|
|
412
|
-
state.problems.push(`a disable on ${formatLineNumber(lineIndex)} inside the region opened on ${formatLineNumber(
|
|
449
|
+
if (openRegion) {
|
|
450
|
+
state.problems.push(`a disable on ${formatLineNumber(lineIndex)} inside the region opened on ${formatLineNumber(openRegion.lineIndex)}`);
|
|
413
451
|
return;
|
|
414
452
|
}
|
|
415
|
-
state.
|
|
453
|
+
state.openRegionsByRule.set(rule, { isUsed: false, lineIndex });
|
|
416
454
|
return;
|
|
417
455
|
}
|
|
418
|
-
if (!
|
|
456
|
+
if (!openRegion) {
|
|
419
457
|
state.problems.push(`an enable on ${formatLineNumber(lineIndex)} with no region open`);
|
|
420
458
|
return;
|
|
421
459
|
}
|
|
422
|
-
if (!
|
|
423
|
-
state.problems.push(`a region opened on ${formatLineNumber(
|
|
460
|
+
if (!openRegion.isUsed) {
|
|
461
|
+
state.problems.push(`a region opened on ${formatLineNumber(openRegion.lineIndex)} covering no ${target}`);
|
|
424
462
|
}
|
|
425
|
-
state.
|
|
463
|
+
state.openRegionsByRule.delete(rule);
|
|
426
464
|
}
|
|
427
|
-
function
|
|
428
|
-
|
|
429
|
-
state.
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
465
|
+
function applyDirectiveScanLine(state, lineIndex, line) {
|
|
466
|
+
for (const [rule, target] of DIRECTIVE_RULE_TARGETS) {
|
|
467
|
+
const isTarget = (0, import_type_guards.ensureNonNullable)(state.targetLineIndexesByRule.get(rule)).has(lineIndex);
|
|
468
|
+
const openRegion = state.openRegionsByRule.get(rule);
|
|
469
|
+
if (openRegion) {
|
|
470
|
+
getOrCreateLineIndexes(state.allowedLineIndexesByRule, rule).add(lineIndex);
|
|
471
|
+
openRegion.isUsed ||= isTarget;
|
|
472
|
+
continue;
|
|
473
|
+
}
|
|
474
|
+
const pendingNextLineIndex = state.pendingNextLineIndexesByRule.get(rule);
|
|
475
|
+
if (pendingNextLineIndex === void 0 || line.trim() === "") {
|
|
476
|
+
continue;
|
|
477
|
+
}
|
|
478
|
+
getOrCreateLineIndexes(state.allowedLineIndexesByRule, rule).add(lineIndex);
|
|
479
|
+
if (!isTarget) {
|
|
480
|
+
state.problems.push(`a disable-next-line on ${formatLineNumber(pendingNextLineIndex)} covering no ${target}`);
|
|
481
|
+
}
|
|
482
|
+
state.pendingNextLineIndexesByRule.delete(rule);
|
|
439
483
|
}
|
|
440
|
-
state.pendingNextLineIndex = null;
|
|
441
484
|
}
|
|
442
485
|
function buildMembers(methods, properties) {
|
|
443
486
|
return {
|
|
@@ -491,15 +534,64 @@ function extractMethodNames(interfaceBody) {
|
|
|
491
534
|
function extractPropertyNames(interfaceBody) {
|
|
492
535
|
return matchPropertySignatures(interfaceBody).filter((match) => !isFunctionType(interfaceBody, match)).map((match) => (0, import_reg_exp.getMandatoryNamedGroup)(match, "name"));
|
|
493
536
|
}
|
|
537
|
+
function findTryItLineIndexesWithoutCodeButton(content) {
|
|
538
|
+
const lineIndexes = [];
|
|
539
|
+
let section = null;
|
|
540
|
+
let isInsideFence = false;
|
|
541
|
+
for (const [index, line] of content.split("\n").entries()) {
|
|
542
|
+
if (CODE_FENCE_REG_EXP.test(line)) {
|
|
543
|
+
if (!isInsideFence && section && CODE_BUTTON_FENCE_REG_EXP.test(line)) {
|
|
544
|
+
section.hasCodeButton = true;
|
|
545
|
+
}
|
|
546
|
+
isInsideFence = !isInsideFence;
|
|
547
|
+
continue;
|
|
548
|
+
}
|
|
549
|
+
const hashes = isInsideFence ? void 0 : HEADING_LEVEL_REG_EXP.exec(line)?.groups?.["hashes"];
|
|
550
|
+
if (hashes === void 0) {
|
|
551
|
+
continue;
|
|
552
|
+
}
|
|
553
|
+
if (section && hashes.length <= section.level) {
|
|
554
|
+
if (!section.hasCodeButton) {
|
|
555
|
+
lineIndexes.push(section.lineIndex);
|
|
556
|
+
}
|
|
557
|
+
section = null;
|
|
558
|
+
}
|
|
559
|
+
if (!section && TRY_IT_HEADING_REG_EXP.test(line)) {
|
|
560
|
+
section = { hasCodeButton: false, level: hashes.length, lineIndex: index };
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
if (section && !section.hasCodeButton) {
|
|
564
|
+
lineIndexes.push(section.lineIndex);
|
|
565
|
+
}
|
|
566
|
+
return lineIndexes;
|
|
567
|
+
}
|
|
494
568
|
function findWikilinkLineIndexes(content) {
|
|
495
569
|
return collectLinesOutsideFences(content).filter((noteLine) => WIKILINK_REG_EXP.test(stripInlineCode(noteLine.line))).map((noteLine) => noteLine.index);
|
|
496
570
|
}
|
|
497
571
|
function formatLineNumber(lineIndex) {
|
|
498
572
|
return `line ${String(lineIndex + 1)}`;
|
|
499
573
|
}
|
|
574
|
+
function formatTryItWarning(sections) {
|
|
575
|
+
return [
|
|
576
|
+
`demo-vault coverage: ${String(sections.length)} Try it section(s) have no code-button to perform their setup.`,
|
|
577
|
+
`Add one, or state why the steps cannot be scripted with <!-- obsidian-dev-utils-disable-next-line ${TRY_IT_RULE} -- <reason> --> above the heading.`,
|
|
578
|
+
...sections.map((section) => ` ${section}`)
|
|
579
|
+
].join("\n");
|
|
580
|
+
}
|
|
581
|
+
function getAllowedLineIndexes(scan, rule) {
|
|
582
|
+
return scan.allowedLineIndexesByRule.get(rule) ?? /* @__PURE__ */ new Set();
|
|
583
|
+
}
|
|
500
584
|
function getLinesOutsideFences(content) {
|
|
501
585
|
return collectLinesOutsideFences(content).map((noteLine) => noteLine.line);
|
|
502
586
|
}
|
|
587
|
+
function getOrCreateLineIndexes(lineIndexesByRule, rule) {
|
|
588
|
+
let lineIndexes = lineIndexesByRule.get(rule);
|
|
589
|
+
if (!lineIndexes) {
|
|
590
|
+
lineIndexes = /* @__PURE__ */ new Set();
|
|
591
|
+
lineIndexesByRule.set(rule, lineIndexes);
|
|
592
|
+
}
|
|
593
|
+
return lineIndexes;
|
|
594
|
+
}
|
|
503
595
|
function hasH1(content) {
|
|
504
596
|
for (const line of stripFrontmatter(content).split("\n")) {
|
|
505
597
|
const trimmedLine = line.trim();
|
|
@@ -573,31 +665,34 @@ function readWikilinkAllowanceReason(content) {
|
|
|
573
665
|
const reason = WIKILINK_ALLOWANCE_REG_EXP.exec(frontmatter)?.groups?.["reason"];
|
|
574
666
|
return reason === void 0 ? null : reason.trim().replace(/^(?<quote>["'])(?<value>[\s\S]*)\k<quote>$/, "$<value>");
|
|
575
667
|
}
|
|
576
|
-
function
|
|
668
|
+
function scanDirectives(content) {
|
|
577
669
|
const state = {
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
670
|
+
allowedLineIndexesByRule: /* @__PURE__ */ new Map(),
|
|
671
|
+
openRegionsByRule: /* @__PURE__ */ new Map(),
|
|
672
|
+
pendingNextLineIndexesByRule: /* @__PURE__ */ new Map(),
|
|
581
673
|
problems: [],
|
|
582
|
-
|
|
674
|
+
targetLineIndexesByRule: /* @__PURE__ */ new Map([
|
|
675
|
+
[TRY_IT_RULE, new Set(findTryItLineIndexesWithoutCodeButton(content))],
|
|
676
|
+
[WIKILINK_RULE, new Set(findWikilinkLineIndexes(content))]
|
|
677
|
+
])
|
|
583
678
|
};
|
|
584
679
|
for (const { index, line } of collectLinesOutsideFences(content)) {
|
|
585
680
|
const match = DIRECTIVE_REG_EXP.exec(line);
|
|
586
681
|
if (match) {
|
|
587
|
-
|
|
682
|
+
applyDirective(state, index, match);
|
|
588
683
|
} else if (DIRECTIVE_PROBE_REG_EXP.test(line)) {
|
|
589
684
|
state.problems.push(`a malformed directive on ${formatLineNumber(index)}`);
|
|
590
685
|
} else {
|
|
591
|
-
|
|
686
|
+
applyDirectiveScanLine(state, index, line);
|
|
592
687
|
}
|
|
593
688
|
}
|
|
594
|
-
|
|
595
|
-
state.problems.push(`a region opened on ${formatLineNumber(
|
|
689
|
+
for (const openRegion of state.openRegionsByRule.values()) {
|
|
690
|
+
state.problems.push(`a region opened on ${formatLineNumber(openRegion.lineIndex)} that is never enabled again`);
|
|
596
691
|
}
|
|
597
|
-
|
|
598
|
-
state.problems.push(`a disable-next-line on ${formatLineNumber(
|
|
692
|
+
for (const [rule, pendingNextLineIndex] of state.pendingNextLineIndexesByRule) {
|
|
693
|
+
state.problems.push(`a disable-next-line on ${formatLineNumber(pendingNextLineIndex)} covering no ${(0, import_type_guards.ensureNonNullable)(DIRECTIVE_RULE_TARGETS.get(rule))}`);
|
|
599
694
|
}
|
|
600
|
-
return {
|
|
695
|
+
return { allowedLineIndexesByRule: state.allowedLineIndexesByRule, problems: state.problems };
|
|
601
696
|
}
|
|
602
697
|
function stripFrontmatter(content) {
|
|
603
698
|
return content.replace(FRONTMATTER_REG_EXP, "");
|
|
@@ -617,4 +712,4 @@ function tryDecodeUriComponent(value) {
|
|
|
617
712
|
DemoVaultCoverageChecker,
|
|
618
713
|
registerDemoVaultCoverageSuite
|
|
619
714
|
});
|
|
620
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vLXZhdWx0LWNvdmVyYWdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTdGF0aWMgY292ZXJhZ2UvZnJlc2huZXNzIGNoZWNrcyB0aGF0IGtlZXAgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AgaW4gc3luYyB3aXRoIGl0cyBwdWJsaWMgc3VyZmFjZS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gc2hpcCBhIGN1cmF0ZWQgZGVtbyB2YXVsdCBhdCBgZGVtby12YXVsdC9gIGluIGl0cyByZXBvIHJvb3QuIFRoZXNlIGhlbHBlcnMgcmVmbGVjdCB0aGUgcmVhbFxuICogcHVibGljIEFQSS9jb25maWcvZG9jcyBzdHJhaWdodCBmcm9tIHNvdXJjZSBhbmQgYXNzZXJ0IOKAlCBXSVRIT1VUIGxhdW5jaGluZyBPYnNpZGlhbiDigJQgdGhhdCBldmVyeSBmZWF0dXJlIGlzXG4gKiBkZW1vbnN0cmF0ZWQgaW4gdGhlIG5vdGVzIGFuZCB0aGF0IHRoZSBub3RlcyByZWZlcmVuY2Ugbm8gQVBJIG1lbWJlciB0aGF0IG5vIGxvbmdlciBleGlzdHMgKHJlbmFtZSBkcmlmdCkuXG4gKiBUaGUgcnVudGltZSBiZWhhdmlvciBvZiB0aGUgcGx1Z2luIGlzIGNvdmVyZWQgYnkgaXRzIG90aGVyIGludGVncmF0aW9uIHRlc3RzLCBub3QgYnkgdGhlIGRlbW8gdmF1bHQ7IHRoZVxuICogdmF1bHQgaXMgYSBsZWFybmluZyByZXNvdXJjZSwgYW5kIHRoZXNlIGNoZWNrcyBvbmx5IGd1YXJkIHRoYXQgaXQgc3RheXMgdHJ1dGhmdWwuXG4gKlxuICogVGhleSBhbHNvIGd1YXJkIHRoZSB2YXVsdCdzIG93biBgLm9ic2lkaWFuL2FwcC5qc29uYDogdGhlIHNldHRpbmdzIGxpc3RlZCBpblxuICoge0BsaW5rIERFTU9fVkFVTFRfQVBQX0pTT05fU0VUVElOR1N9IGJlbG9uZyB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYCwgd2hpY2ggd3JpdGVzIHRoZW0gaW50byB0aGUgYXJjaGl2ZWRcbiAqIHZhdWx0IGF0IHJlbGVhc2UgdGltZSwgc28gYSB2YXVsdCB0aGF0IGNvbW1pdHMgYW55IG9mIHRoZW0gaXMga2VlcGluZyBhIHNlY29uZCBjb3B5IG5vdGhpbmcgcmVjb25jaWxlcy5cbiAqXG4gKiBUaGV5IGFsc28gZW5mb3JjZSB0aGUgZGVtby12YXVsdCBBVVRIT1JJTkcgY29udmVudGlvbiDigJQgZXZlcnkgbm90ZSBvcGVucyB3aXRoIGFuIGAjIEgxYCBhbmQgYSBwbGFpblxuICogcHJvc2UgcGFyYWdyYXBoLCBldmVyeSBub3RlIGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBzdGFydCBub3RlLCBhbmQgbm8gbm90ZSB1c2VzIGEgYFtbd2lraWxpbmtdXWAgb3IgYVxuICogYFtEb2NzXSjigKYpYCBsaW5lLiBUaGVzZSBjaGVja3MgYXJlIHVuY29uZGl0aW9uYWw6IHRoZSBkZW1vIHZhdWx0IGlzIHRoZSBwdWJsaXNoZWQgZG9jdW1lbnRhdGlvbiwgcmVhZFxuICogaW4gT2JzaWRpYW4gQU5EIG9uIEdpdEh1YiAod2hlcmUgYSB3aWtpbGluayBkb2VzIG5vdCByZW5kZXIpLCBzbyBhIG5vdGUgdGhhdCBicmVha3MgdGhlIGNvbnZlbnRpb24gaXNcbiAqIGJyb2tlbiBmb3IgcmVhbCByZWFkZXJzLiBgYXV0aG9yaW5nYCBvbmx5IHR1bmVzIHRoZW0gKHdoaWNoIG5vdGUgaXMgdGhlIHN0YXJ0LCB3aGljaCBub3RlcyBzaXQgb3V0c2lkZVxuICogdGhlIGxlYXJuaW5nIHBhdGgpOyBpdCBjYW5ub3Qgc3dpdGNoIHRoZW0gb2ZmLlxuICpcbiAqIE9ubHkgYHJvb3RGb2xkZXJgIGlzIHJlcXVpcmVkLCBzbyBhIHBsdWdpbiB3aXRoIG5vIHNldHRpbmdzIGFuZCBubyBwdWJsaWMgQVBJIHRvIHJlZmxlY3QgcmVnaXN0ZXJzIHRoZVxuICogc3VpdGUgd2l0aCB0aGF0IGFsb25lIGFuZCBzdGlsbCBnZXRzIGV2ZXJ5IGF1dGhvcmluZyBjaGVjayDigJQgdGhlIGNoZWNrcyBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCB3aGF0IHRoZVxuICogcGx1Z2luIGV4cG9zZXMuIEVhY2ggcmVmbGVjdGlvbiBzcGVjIChgY29uZmlnSW50ZXJmYWNlc2AsIGBpbnRlcmZhY2VzYCwgYG5vblRyaXZpYWxHdWFyZGApIGFkZHMgdGhlIGNoZWNrc1xuICogaXQgZGVzY3JpYmVzIHdoZW4gc3VwcGxpZWQuIFRoZSB2YXVsdCBpcyBndWFyZGVkIGFnYWluc3QgYmVpbmcgZW1wdHkgZWl0aGVyIHdheTogd2l0aCBubyBub3RlcyB0byByZWFkLFxuICogZXZlcnkgYXV0aG9yaW5nIGNoZWNrIHdvdWxkIHBhc3MgYnkgaGF2aW5nIG5vdGhpbmcgdG8gbG9vayBhdC5cbiAqXG4gKiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBhIG5vdGUgd2hvc2UgU1VCSkVDVCBpcyB0aGUgd2lraWxpbmsg4oCUIGFuIGVtYmVkIHNwZWxsaW5nIHRoZSByZWFkZXIgaXMgYmVpbmcgdGF1Z2h0XG4gKiB0byB0eXBlLCBhIGZyb250bWF0dGVyIHByb3BlcnR5IHZhbHVlIHRoYXQgZXhpc3RzIHRvIGNvbnRyYXN0IHdpdGggYSBNYXJrZG93biBsaW5rLCBhIGZpeHR1cmUgdGhhdCBtdXN0XG4gKiBrZWVwIHRoZSB3aWtpbGluayBhIGNvbW1hbmQgaXMgc3VwcG9zZWQgdG8gbGVhdmUgYWxvbmUsIGEgbGluayB0aGUgcmVhZGVyIGNsaWNrcyB3aGlsZSBpdCBzdGlsbCByZXNvbHZlc1xuICogdG8gbm90aGluZy4gU3VjaCBhIG5vdGUgc2F5cyBzbyBpdHNlbGYsIHN0YXRpbmcgd2h5LCBpbiBvbmUgb2YgdHdvIGZvcm1zIG1vZGVsbGVkIG9uIEVTTGludCdzLlxuICpcbiAqIFBlciBsaW5lIG9yIHBlciByZWdpb24sIHdyaXR0ZW4gYXMgYW4gSFRNTCBjb21tZW50IHNvIGl0IGlzIGludmlzaWJsZSBpbiBPYnNpZGlhbiBBTkQgb24gR2l0SHViIOKAlCB0aGVcbiAqIHNwZWxsaW5nIHRoZXNlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWA6XG4gKlxuICogYGBgbWFya2Rvd25cbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUtbmV4dC1saW5lIGRlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MgLS0gQ2xpY2tpbmcgYSBsaW5rIHRvIGEgbm90ZSB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCBJUyB0aGUgZmVhdHVyZS4gLS0+XG4gKiAyLiBDbGljayB0aGlzIGxpbms6IFtbUHJvamVjdHMvRnJlc2ggaWRlYV1dLlxuICpcbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLSBUaGUgd2lraWxpbmsgZW1iZWQgaXMgdGhlIHN5bnRheCB0aGlzIG5vdGUgdGVhY2hlcy4gLS0+XG4gKiAhW1tiYXNpYy5odG1sfDQwMF1dXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1lbmFibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLT5cbiAqIGBgYFxuICpcbiAqIFBlciBub3RlLCBpbiB0aGUgbm90ZSdzIG93biBmcm9udG1hdHRlciDigJQgdGhlIG9ubHkgZm9ybSB0aGF0IGNhbiByZWFjaCBhIHdpa2lsaW5rIElOU0lERSBmcm9udG1hdHRlcixcbiAqIHdoZXJlIGEgY29tbWVudCBjYW5ub3QgZ286XG4gKlxuICogYGBgeWFtbFxuICogLS0tXG4gKiBvYnNpZGlhbi1kZXYtdXRpbHM6XG4gKiAgIGRlbW8tdmF1bHQtdmFsaWRhdGlvbjpcbiAqICAgICBhbGxvdy13aWtpbGlua3M6IFRoZSBgd2lraWxpbmtgIHByb3BlcnR5IHZhbHVlIGlzIHRoZSBjb250cmFzdCB0aGlzIG5vdGUgaXMgYnVpbHQgYXJvdW5kLlxuICogLS0tXG4gKiBgYGBcbiAqXG4gKiBFaXRoZXIgd2F5IHRoZSBkZWNsYXJhdGlvbiB0cmF2ZWxzIHdpdGggdGhlIG5vdGUgcmF0aGVyIHRoYW4gc2l0dGluZyBpbiBhIGxpc3Qgc29tZXdoZXJlIGVsc2UsIGl0IGNhcnJpZXNcbiAqIGl0cyBqdXN0aWZpY2F0aW9uLCBhbmQgaXQgZXhlbXB0cyBvbmx5IHRoZSBXSUtJTElOSyBjaGVjayDigJQgdGhlIEgxLCBwcm9zZSwgcmVhY2hhYmlsaXR5IGFuZCBgW0RvY3NdYFxuICogY2hlY2tzIHN0aWxsIGFwcGx5LiBBIGRlY2xhcmF0aW9uIHdpdGggbm8gcmVhc29uLCBvbmUgY292ZXJpbmcgbm8gd2lraWxpbmssIGEgcmVnaW9uIG5ldmVyIGVuYWJsZWQgYWdhaW4sXG4gKiBvciBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlIGFsbCBmYWlsOiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCB0aGF0IG5vdGhpbmcgbmVlZHMgYW55IG1vcmUsIG9yIHRoYXRcbiAqIHNpbGVudGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vIGV4ZW1wdGlvbiBhdCBhbGwuXG4gKlxuICogVHdvIGxheWVycyBhcmUgZXhwb3NlZDpcbiAqIC0ge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0g4oCUIGEgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgdGhhdCByZWFkcyB0aGUgY29ycHVzLCBwYXJzZXMgaW50ZXJmYWNlIC9cbiAqICAgY2xhc3MgLyBlbnVtIG1lbWJlcnMgYW5kIGV4cG9ydGVkIGZ1bmN0aW9ucywgYW5kIHJldHVybnMgZGlhZ25vc3RpYyBhcnJheXMgKHdoYXQgaXMgdW5kZW1vbnN0cmF0ZWQgLyBzdGFsZVxuICogICAvIHVubGlua2VkIC8gb2ZmLWNvbnZlbnRpb24pLlxuICogLSB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfSDigJQgYSB0aGluIHdyYXBwZXIgdGhhdCByZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSBvdmVyIHRoZSBjb3JlLCBzb1xuICogICBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCBpcyBhIHNpbmdsZSBkZWNsYXJhdGl2ZSBjYWxsLlxuICovXG5cbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBkZXNjcmliZSxcbiAgZXhwZWN0LFxuICBpdFxufSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQge1xuICBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MsXG4gIHBhcnNlRGVtb1ZhdWx0QXBwSnNvblxufSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcblxuLyoqXG4gKiBUdW5lcyB0aGUgYWx3YXlzLW9uIGF1dGhvcmluZyBjaGVja3MuIEl0IGNhbm5vdCBkaXNhYmxlIHRoZW0g4oCUIHNlZSB0aGUgZmlsZSBvdmVydmlldy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRBdXRob3JpbmdTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlcyAocGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoYXQgc2l0IG91dHNpZGUgdGhlIGxlYXJuaW5nIHBhdGggYW5kIGFyZSB0aGVyZWZvcmVcbiAgICogZXhlbXB0IGZyb20gZXZlcnkgYXV0aG9yaW5nIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgdmF1bHQncyBvd24gYFJFQURNRS5tZGAsIHdoaWNoIGFkZHJlc3NlcyBzb21lb25lXG4gICAqIGJyb3dzaW5nIHRoZSByZXBvIG9uIEdpdEh1YiByYXRoZXIgdGhhbiBhIHJlYWRlciB3b3JraW5nIHRocm91Z2ggdGhlIHZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgZXZlcnkgb3RoZXIgbm90ZSBtdXN0IGJlIHJlYWNoYWJsZSBmcm9tLiBEZWZhdWx0cyB0b1xuICAgKiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnROb3RlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgY29uZmlnIGludGVyZmFjZSB3aG9zZSBvcHRpb25zIGFyZSBkZW1vbnN0cmF0ZWQgYnkgdGhlaXIgYmFyZSBuYW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvbmZpZ0ludGVyZmFjZUNvdmVyYWdlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB3aG9zZSBwcm9wZXJ0aWVzIGFyZSB0aGUgY29uZmlnXG4gICAqIG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5vdGVzIChwYXRocyByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgZXhlbXB0IGZyb20gdGhlIGF1dGhvcmluZyBjaGVja3MuIERlZmF1bHRzIHRvIHRoZVxuICAgKiB2YXVsdCdzIG93biBgUkVBRE1FLm1kYC5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTm90ZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHBsdWdpbiByZXBvIHJvb3Qg4oCUIHRoZSBmb2xkZXIgY29udGFpbmluZyBgZGVtby12YXVsdC9gIGFuZCB0aGUgc291cmNlIGJlaW5nXG4gICAqIHJlZmxlY3RlZC4gQ2FsbGVycyB0eXBpY2FsbHkgcGFzcyBgZ2V0Um9vdEZvbGRlcigpID8/IHByb2Nlc3MuY3dkKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRTdGFsZVJlZmVyZW5jZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRTdGFsZVJlZmVyZW5jZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHJlY2VpdmVyIHdob3NlIGBgIGAke3JlY2VpdmVyfS48bWVtYmVyPmAgYGAgcmVmZXJlbmNlcyBhcmUgc2Nhbm5lZCBmb3IgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjZWl2ZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1lbWJlcnMgdGhhdCBjdXJyZW50bHkgZXhpc3Qgb24gdGhlIHJlY2VpdmVyOyBhbnkgcmVmZXJlbmNlZCBtZW1iZXIgbm90IGluIHRoaXMgc2V0IGlzIHN0YWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsaWRNZW1iZXJzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBtZW1iZXIgbmFtZXMgdGhhdCBtdXN0IGVhY2ggYXBwZWFyIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICovXG4gIHJlYWRvbmx5IG1lbWJlcnM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGVuIHNldCwgYSBtZW1iZXIgaXMgZGVtb25zdHJhdGVkIG9ubHkgaWYgYGAgYCR7cmVjZWl2ZXJ9LiR7bWVtYmVyfWAgYGAgYXBwZWFycyAoZS5nLiBhIGNvbnRleHQgb2JqZWN0J3NcbiAgICogbWV0aG9kcyk7IHdoZW4gYWJzZW50LCB0aGUgYmFyZSBtZW1iZXIgbmFtZSBpcyBsb29rZWQgdXAgKGUuZy4gYSBjb25maWcgb3B0aW9uKS5cbiAgICovXG4gIHJlYWRvbmx5IHJlY2VpdmVyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5saW5rZWRGZWF0dXJlRG9jc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZG9jcyBmb2xkZXIgKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHdob3NlIHRvcC1sZXZlbCBgKi5tZGAgZmlsZXMgYXJlIHRoZSBmZWF0dXJlIGRvY3MuXG4gICAqL1xuICByZWFkb25seSBkb2NzRm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkb2MgYmFzZW5hbWVzICh3aXRob3V0IGAubWRgKSB0aGF0IGFyZSBOT1QgcGVyLWZlYXR1cmUgcGFnZXMgYW5kIHNvIG5lZWQgbm8gbGlua2luZyBkZW1vIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBub25GZWF0dXJlRG9jczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFVucmVhY2hhYmxlTm90ZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbnJlYWNoYWJsZU5vdGVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlIChwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSB0aGUgd2FsayBzdGFydHMgZnJvbSwgZS5nLiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnROb3RlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZ2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBhcmUgcGFyc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEludGVyZmFjZU1lbWJlcnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgdG8gcGFyc2UuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGZlYXR1cmUtZG9jIGxpbmtpbmcgY2hlY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0RG9jc0NvdmVyYWdlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgZG9jcyBmb2xkZXIgKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHdob3NlIHRvcC1sZXZlbCBgKi5tZGAgZmlsZXMgYXJlIHRoZSBmZWF0dXJlIGRvY3MuXG4gICAqL1xuICByZWFkb25seSBmb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvYyBiYXNlbmFtZXMgKHdpdGhvdXQgYC5tZGApIHRoYXQgYXJlIE5PVCBwZXItZmVhdHVyZSBwYWdlcyBhbmQgc28gbmVlZCBubyBsaW5raW5nIGRlbW8gbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vbkZlYXR1cmVEb2NzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBSZWZsZWN0cyBhIG1vZHVsZSdzIGV4cG9ydGVkIGZ1bmN0aW9ucywgZWFjaCBkZW1vbnN0cmF0ZWQgYnkgaXRzIGJhcmUgbmFtZSBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0RnVuY3Rpb25zQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB3aG9zZSBgZXhwb3J0IGZ1bmN0aW9uYHMgbXVzdCBlYWNoIGJlIGRlbW9uc3RyYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWZsZWN0cyBhIHNpbmdsZSBpbnRlcmZhY2UncyBtZW1iZXJzIGFuZCBkZW1vbnN0cmF0ZXMgdGhlbSB2aWEgYGAgYCR7cmVjZWl2ZXJ9LjxtZW1iZXI+YCBgYCByZWZlcmVuY2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdEludGVyZmFjZUNvdmVyYWdlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB0byByZWZsZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkZW1vbnN0cmF0ZWQgbWVtYmVycyBhcmUgdGhlIHJlZmxlY3RlZCB0eXBlJ3MgbWV0aG9kcyBvciBpdHMgcHJvcGVydGllcyAoZW51bSBtZW1iZXJzIGNvdW50IGFzXG4gICAqIHByb3BlcnRpZXMpLlxuICAgKi9cbiAgcmVhZG9ubHkga2luZDogRGVtb1ZhdWx0SW50ZXJmYWNlTWVtYmVyS2luZDtcblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgdGhlIG5vdGVzIGNhbGwgdGhlIG1lbWJlcnMgb24gKGUuZy4gYGNvZGVCdXR0b25Db250ZXh0YCkuXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIGludGVyZmFjZSdzIGRlbW9uc3RyYXRlZCBtZW1iZXJzIGFyZSBpdHMgbWV0aG9kcyBvciBpdHMgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVtb1ZhdWx0SW50ZXJmYWNlTWVtYmVyS2luZCA9ICdtZXRob2RzJyB8ICdwcm9wZXJ0aWVzJztcblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSBndWFyZCB0aGF0IHRoZSByZWZsZWN0ZWQgc3VyZmFjZSBpcyBub24tdHJpdmlhbCAocHJvdGVjdHMgYWdhaW5zdCBhIHBhcnNpbmcgcmVncmVzc2lvblxuICogc2lsZW50bHkgZW1wdHlpbmcgZXZlcnkgb3RoZXIgY2hlY2spLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdE5vblRyaXZpYWxHdWFyZFNwZWMge1xuICAvKipcbiAgICogQSBkZW1vIG5vdGUgKHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoYXQgbXVzdCBiZSBwcmVzZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhwZWN0RGVtb05vdGU6IHN0cmluZztcblxuICAvKipcbiAgICogQSBtZW1iZXIgdGhhdCBtdXN0IGJlIHJlZmxlY3RlZCBmcm9tIHtAbGluayBEZW1vVmF1bHROb25Ucml2aWFsR3VhcmRTcGVjLmludGVyZmFjZU5hbWV9LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhwZWN0TWVtYmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHdob3NlIG1lbWJlcnMgYXJlIHJlLXBhcnNlZCBmb3IgdGhlXG4gICAqIGd1YXJkLlxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJmYWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgdGhhdCBkZWNsYXJlcyB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBkZW1vIG5vdGUsIGFzIHJlYWQgZnJvbSB0aGUgZGVtbyB2YXVsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHROb3RlIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlJ3MgcmF3IE1hcmtkb3duIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RlJ3MgcGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBmb2xkZXIsIGUuZy4gYDAwIFN0YXJ0Lm1kYC5cbiAgICovXG4gIHJlYWRvbmx5IHJlbGF0aXZlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwYXJzZWQgbWVtYmVycyBvZiBhIHNvdXJjZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyZmFjZU1lbWJlcnMge1xuICAvKipcbiAgICogRXZlcnkgbWVtYmVyIOKAlCB7QGxpbmsgSW50ZXJmYWNlTWVtYmVycy5tZXRob2RzfSBmb2xsb3dlZCBieSB7QGxpbmsgSW50ZXJmYWNlTWVtYmVycy5wcm9wZXJ0aWVzfS5cbiAgICovXG4gIHJlYWRvbmx5IGFsbDogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2QgbWVtYmVycyAoZGVjbGFyZWQgYXMgYG5hbWUoLi4uKWApLlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0aG9kczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSBtZW1iZXJzIChkZWNsYXJlZCBhcyBgbmFtZT86IC4uLmApLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydGllczogc3RyaW5nW107XG59XG5cbi8qKlxuICogQSBub3RlIGxpbmUgcGFpcmVkIHdpdGggdGhlIGxpbmUgbnVtYmVyIGl0IGNhbWUgZnJvbSwgc28gYSBjaGVjayB0aGF0IHNraXBzIGZlbmNlZCBibG9ja3MgY2FuIHN0aWxsXG4gKiByZXBvcnQg4oCUIGFuZCBhbiBpbmxpbmUgZGlyZWN0aXZlIGNhbiBzdGlsbCBuYW1lIOKAlCB0aGUgbGluZSBhcyB0aGUgcmVhZGVyIHNlZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm90ZUxpbmUge1xuICAvKipcbiAgICogVGhlIHplcm8tYmFzZWQgbGluZSBudW1iZXIgd2l0aGluIHRoZSBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGxpbmUncyByYXcgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGBkaXNhYmxlYCByZWdpb24gdGhhdCBoYXMgYmVlbiBvcGVuZWQgYW5kIG5vdCB5ZXQgZW5hYmxlZCBhZ2Fpbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuV2lraWxpbmtEaXJlY3RpdmVSZWdpb24ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcmVnaW9uIGhhcyBjb3ZlcmVkIGEgd2lraWxpbmssIHdoaWNoIGlzIHdoYXQgc3RvcHMgaXQgYmVpbmcgcmVwb3J0ZWQgYXMgcG9pbnRsZXNzLlxuICAgKi9cbiAgaXNVc2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSB0aGUgcmVnaW9uIHdhcyBvcGVuZWQgb24uXG4gICAqL1xuICByZWFkb25seSBsaW5lSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFR1bmVzIHRoZSBhbHdheXMtb24gYXV0aG9yaW5nIGNoZWNrcywgb3IgYHVuZGVmaW5lZGAgdG8gdGFrZSB0aGVpciBkZWZhdWx0cy4gSXQgY2Fubm90IGRpc2FibGUgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcmluZz86IERlbW9WYXVsdEF1dGhvcmluZ1NwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25maWcgaW50ZXJmYWNlcyB3aG9zZSBvcHRpb25zIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQgYnkgdGhlaXIgYmFyZSBuYW1lLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICAgKiBwbHVnaW4gaGFzIG5vIHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnSW50ZXJmYWNlcz86IERlbW9WYXVsdENvbmZpZ0ludGVyZmFjZUNvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjaywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGx1Z2luIHNoaXBzIG5vIGBkb2NzL2AgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9jcz86IERlbW9WYXVsdERvY3NDb3ZlcmFnZVNwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2R1bGVzIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAgICogcGx1Z2luIGV4cG9zZXMgbm8gc3VjaCBtb2R1bGUgdG8gY2hlY2suXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk1vZHVsZXM/OiBEZW1vVmF1bHRGdW5jdGlvbnNDb3ZlcmFnZVNwZWNbXTtcblxuICAvKipcbiAgICogVGhlIGludGVyZmFjZXMgd2hvc2UgbWVtYmVycyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIChhbmQgcmVmZXJlbmNlZCB3aXRob3V0IGRyaWZ0KSwgb3IgYHVuZGVmaW5lZGAgd2hlblxuICAgKiB0aGUgcGx1Z2luIGV4cG9zZXMgbm8gcHVibGljIEFQSSBzdXJmYWNlIHRvIHJlZmxlY3QuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VzPzogRGVtb1ZhdWx0SW50ZXJmYWNlQ292ZXJhZ2VTcGVjW107XG5cbiAgLyoqXG4gICAqIFRoZSBndWFyZCB0aGF0IGtlZXBzIHRoZSByZWZsZWN0ZWQgc3VyZmFjZSBub24tdHJpdmlhbCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBubyByZWZsZWN0ZWQgc3VyZmFjZVxuICAgKiB0byBndWFyZC4gVGhlIHZhdWx0IGlzIGNoZWNrZWQgZm9yIGJlaW5nIG5vbi1lbXB0eSBlaXRoZXIgd2F5LlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uVHJpdmlhbEd1YXJkPzogRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYztcblxuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHBsdWdpbiByZXBvIHJvb3QuIENhbGxlcnMgdHlwaWNhbGx5IHBhc3MgYGdldFJvb3RGb2xkZXIoKSA/PyBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGEgbm90ZSdzIGlubGluZSBgb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGXigKZgIGRpcmVjdGl2ZXMgYWxsb3csIGFuZCB3aGF0IGlzIHdyb25nIHdpdGggdGhlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaWtpbGlua0RpcmVjdGl2ZVNjYW4ge1xuICAvKipcbiAgICogVGhlIHplcm8tYmFzZWQgbGluZSBudW1iZXJzIGEgZGlyZWN0aXZlIGFsbG93cyBhIHdpa2lsaW5rIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZExpbmVJbmRleGVzOiBSZWFkb25seVNldDxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aXZlIG1pc3Rha2VzIGZvdW5kLCBlYWNoIHBocmFzZWQgZm9yIGEgZmFpbGluZyBhc3NlcnRpb24uXG4gICAqL1xuICByZWFkb25seSBwcm9ibGVtczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIHJ1bm5pbmcgc3RhdGUgb2YgYSBkaXJlY3RpdmUgc2NhbiwgdGhyZWFkZWQgdGhyb3VnaCB0aGUgcGVyLWxpbmUgaGVscGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaWtpbGlua0RpcmVjdGl2ZVNjYW5TdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgbGluZXMgYSBkaXJlY3RpdmUgaGFzIGFsbG93ZWQgYSB3aWtpbGluayBvbiBzbyBmYXIuXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGluZUluZGV4ZXM6IFNldDxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIGN1cnJlbnRseSBvcGVuLCBhbmQgd2hldGhlciBpdCBoYXMgY292ZXJlZCBhIHdpa2lsaW5rIHlldC5cbiAgICovXG4gIG9wZW5SZWdpb246IG51bGwgfCBPcGVuV2lraWxpbmtEaXJlY3RpdmVSZWdpb247XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGEgYGRpc2FibGUtbmV4dC1saW5lYCB3YXMgcmVhZCBvbiwgd2hpbGUgaXQgc3RpbGwgd2FpdHMgZm9yIHRoZSBsaW5lIGl0IGNvdmVycy5cbiAgICovXG4gIHBlbmRpbmdOZXh0TGluZUluZGV4OiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aXZlIG1pc3Rha2VzIGZvdW5kIHNvIGZhci5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JsZW1zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGxpbmVzIG9mIHRoZSBub3RlIHRoYXQgY2FycnkgYSB3aWtpbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHdpa2lsaW5rTGluZUluZGV4ZXM6IFJlYWRvbmx5U2V0PG51bWJlcj47XG59XG5cbi8qKlxuICogUmVmbGVjdHMgYSBwbHVnaW4ncyBwdWJsaWMgc3VyZmFjZSBmcm9tIHNvdXJjZSBhbmQgY2hlY2tzIGl0cyBpbi1yZXBvIGBkZW1vLXZhdWx0L2Agc3RheXMgaW4gc3luYyB3aXRoIGl0LlxuICpcbiAqIEV2ZXJ5IG1ldGhvZCBpcyBhIHB1cmUgcXVlcnkgb3ZlciBmaWxlcyB1bmRlciB0aGUgcmVwbyByb290ICh0aGUgZGVtbyBjb3JwdXMgaXMgcmVhZCBvbmNlIGFuZCBjYWNoZWQpLCBzb1xuICogdGhlIGNoZWNrZXIgaXMgdHJpdmlhbGx5IHVuaXQtdGVzdGFibGUgYWdhaW5zdCBhIGZpeHR1cmUgcmVwbyBhbmQgY2FycmllcyBubyB0ZXN0LWZyYW1ld29yayBkZXBlbmRlbmN5LlxuICovXG5leHBvcnQgY2xhc3MgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyIHtcbiAgcHJpdmF0ZSBjYWNoZWRDb3JwdXM6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGNhY2hlZE5vdGVzOiBEZW1vVmF1bHROb3RlW10gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZW1vVmF1bHRGb2xkZXI6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBleGNsdWRlZE5vdGVzOiBTZXQ8c3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSByb290Rm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjaGVja2VyIHJvb3RlZCBhdCBhIHBsdWdpbiByZXBvLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5yb290Rm9sZGVyID0gcGFyYW1zLnJvb3RGb2xkZXI7XG4gICAgdGhpcy5kZW1vVmF1bHRGb2xkZXIgPSBqb2luKHRoaXMucm9vdEZvbGRlciwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGVtb1ZhdWx0KTtcbiAgICB0aGlzLmV4Y2x1ZGVkTm90ZXMgPSBuZXcgU2V0KHBhcmFtcy5leGNsdWRlZE5vdGVzID8/IERFRkFVTFRfRVhDTFVERURfTk9URVMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3RzIHRoZSBkZW1vIG5vdGVzIGFzIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IGZvbGRlciAoZm9yIGEgbm9uLXRyaXZpYWwtc3VyZmFjZSBndWFyZCkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiBldmVyeSBgKi5tZGAgbm90ZSBpbiB0aGUgZGVtbyB2YXVsdC5cbiAgICovXG4gIHB1YmxpYyBjb2xsZWN0RGVtb05vdGVSZWxhdGl2ZVBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Tm90ZXMoKS5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbmQgY2FjaGVzIGV2ZXJ5IGRlbW8gbm90ZSBpbmRpdmlkdWFsbHkg4oCUIHRoZSBwZXItbm90ZSB2aWV3IHRoZSBhdXRob3JpbmcgY2hlY2tzIHdvcmsgb24sIGFzXG4gICAqIG9wcG9zZWQgdG8gdGhlIGNvbmNhdGVuYXRlZCB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLnJlYWRDb3JwdXN9LlxuICAgKlxuICAgKiBAcmV0dXJucyBFdmVyeSBgKi5tZGAgbm90ZSBpbiB0aGUgZGVtbyB2YXVsdCwgZXhjbHVkZWQgb25lcyBpbmNsdWRlZC5cbiAgICovXG4gIHB1YmxpYyBjb2xsZWN0Tm90ZXMoKTogRGVtb1ZhdWx0Tm90ZVtdIHtcbiAgICB0aGlzLmNhY2hlZE5vdGVzID8/PSB0aGlzLmNvbGxlY3RNYXJrZG93bkZpbGVzKHRoaXMuZGVtb1ZhdWx0Rm9sZGVyKS5tYXAoKGZpbGUpID0+ICh7XG4gICAgICBjb250ZW50OiByZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JyksXG4gICAgICByZWxhdGl2ZVBhdGg6IHJlbGF0aXZlKHRoaXMuZGVtb1ZhdWx0Rm9sZGVyLCBmaWxlKVxuICAgIH0pKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWROb3RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgYC5vYnNpZGlhbi9hcHAuanNvbmAgc2V0dGluZ3MgdGhlIHZhdWx0IGNvbW1pdHMgdGhhdCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBvd25zIGFuZCB3cml0ZXNcbiAgICogaW50byB0aGUgYXJjaGl2ZWQgdmF1bHQgaXRzZWxmLiBBIGNvbW1pdHRlZCBvbmUgaXMgYSBzZWNvbmQgY29weSBvZiBhIHNldHRpbmcgbm90aGluZyByZWNvbmNpbGVzLCBhbmRcbiAgICogaXQgaXMgdGhlIGNvcHkgdGhhdCBnb2VzIHN0YWxlIOKAlCBzbyB0aGUgY29udmVudGlvbiBpcyB0aGF0IHRoZSB2YXVsdCBjb21taXRzIG5vbmUgb2YgdGhlbS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIG5hbWVzIG9mIHRoZSBvd25lZCBzZXR0aW5ncyB0aGUgY29tbWl0dGVkIGBhcHAuanNvbmAgc2V0cy4gQSB2YXVsdCB0aGF0IGNvbW1pdHMgbm9cbiAgICogYGFwcC5qc29uYCBhdCBhbGwgaXMgZmluZSwgYW5kIHlpZWxkcyBub25lLlxuICAgKi9cbiAgcHVibGljIGZpbmRDb21taXR0ZWRBcHBKc29uU2V0dGluZ3MoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGFwcEpzb25QYXRoID0gam9pbih0aGlzLmRlbW9WYXVsdEZvbGRlciwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRG90T2JzaWRpYW4sIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkFwcEpzb24pO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBleGlzdHNTeW5jKGFwcEpzb25QYXRoKSA/IHJlYWRGaWxlU3luYyhhcHBKc29uUGF0aCwgJ3V0Zi04JykgOiBudWxsO1xuICAgIHJldHVybiBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MoeyBhcHBKc29uOiBwYXJzZURlbW9WYXVsdEFwcEpzb24oeyBjb250ZW50LCBwYXRoOiBhcHBKc29uUGF0aCB9KSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyBjYXJyeWluZyBhIGBbRG9jc10o4oCmKWAgbGluayBsaW5lLiBUaGUgbm90ZSBJUyB0aGUgZG9jdW1lbnRhdGlvbiwgc28gYSBsaW5lIHBvaW50aW5nXG4gICAqIGVsc2V3aGVyZSBmb3IgdGhlIHJlYWwgZXhwbGFuYXRpb24gaXMgdGhlIHNoYXBlIHRoaXMgY29udmVudGlvbiBleGlzdHMgdG8gcmVtb3ZlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG9mZmVuZGluZyBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRoRG9jc0xpbmtzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLmZpbHRlcigobm90ZSkgPT4gZ2V0TGluZXNPdXRzaWRlRmVuY2VzKG5vdGUuY29udGVudCkuc29tZSgobGluZSkgPT4gRE9DU19MSU5LX1JFR19FWFAudGVzdChsaW5lKSkpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgdGhhdCBkbyBub3Qgb3BlbiB3aXRoIGFuIGAjIEgxYCAoZnJvbnRtYXR0ZXIgYXNpZGUpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIG9mZmVuZGluZyBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRob3V0SDEoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiAhaGFzSDEobm90ZS5jb250ZW50KSlcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB3aXRoIG5vIHByb3NlIHBhcmFncmFwaCBiZWZvcmUgdGhlaXIgZmlyc3QgY29kZSBmZW5jZSDigJQgdGhlIDEtMyBzZW50ZW5jZXMgc2F5aW5nIHdoYXQgdGhlXG4gICAqIGZlYXR1cmUgZG9lcyBhbmQgd2h5IGEgcmVhZGVyIHdvdWxkIHdhbnQgaXQsIHdpdGhvdXQgd2hpY2ggdGhlIG5vdGUgaXMgYSBidXR0b24gd2l0aCBubyBsZXNzb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhvdXRJbnRyb1Byb3NlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLmZpbHRlcigobm90ZSkgPT4gIWhhc0ludHJvUHJvc2Uobm90ZS5jb250ZW50KSlcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB3aG9zZSB3aWtpbGluayBhbGxvd2FuY2UgaXMgbm90IGRvaW5nIGFueSB3b3JrIOKAlCBkZWNsYXJlZCB3aXRob3V0IGEgcmVhc29uLCBvciBvbiBhIG5vdGVcbiAgICogdGhhdCBjYXJyaWVzIG5vIHdpa2lsaW5rIGF0IGFsbC4gQm90aCBhcmUgZHJpZnQ6IGFuIGV4ZW1wdGlvbiBub2JvZHkgY2FuIGp1c3RpZnksIGFuZCBvbmUgbm90aGluZyBuZWVkc1xuICAgKiBhbnkgbW9yZSwgd2hpY2ggd291bGQgZ28gb24gaGlkaW5nIHRoZSBuZXh0IHdpa2lsaW5rIHNvbWVib2R5IGFkZHMgYnkgYWNjaWRlbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhVbmp1c3RpZmllZFdpa2lsaW5rQWxsb3dhbmNlKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKS5mbGF0TWFwKChub3RlKSA9PiB7XG4gICAgICBjb25zdCBzY2FuID0gc2Nhbldpa2lsaW5rRGlyZWN0aXZlcyhub3RlLmNvbnRlbnQpO1xuICAgICAgY29uc3QgcHJvYmxlbXMgPSBbLi4uc2Nhbi5wcm9ibGVtc107XG4gICAgICBjb25zdCByZWFzb24gPSByZWFkV2lraWxpbmtBbGxvd2FuY2VSZWFzb24obm90ZS5jb250ZW50KTtcbiAgICAgIGlmIChyZWFzb24gIT09IG51bGwpIHtcbiAgICAgICAgaWYgKHJlYXNvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCgnYSBub3RlLWxldmVsIGFsbG93YW5jZSB3aXRoIG5vIHJlYXNvbicpO1xuICAgICAgICB9IGVsc2UgaWYgKCFoYXNXaWtpbGluayhub3RlLmNvbnRlbnQpKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCgnYSBub3RlLWxldmVsIGFsbG93YW5jZSBjb3ZlcmluZyBubyB3aWtpbGluaycpO1xuICAgICAgICB9IGVsc2UgaWYgKHNjYW4uYWxsb3dlZExpbmVJbmRleGVzLnNpemUgPiAwKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCgnaW5saW5lIGRpcmVjdGl2ZXMgdGhlIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIGFscmVhZHkgY292ZXJzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9ibGVtcy5tYXAoKHByb2JsZW0pID0+IGAke25vdGUucmVsYXRpdmVQYXRofTogJHtwcm9ibGVtfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHVzaW5nIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gIG91dHNpZGUgYSBjb2RlIGZlbmNlLiBUaGUgZGVtbyB2YXVsdCBpcyBhbHNvIHJlYWQgb25cbiAgICogR2l0SHViLCB3aGVyZSBhIHdpa2lsaW5rIHJlbmRlcnMgYXMgbGl0ZXJhbCBicmFja2V0cyBhbmQgbGVhZHMgbm93aGVyZS4gQSB3aWtpbGluayBzaG93biBJTlNJREUgYVxuICAgKiBmZW5jZSBpcyBzYW1wbGUgdGV4dCwgbm90IG5hdmlnYXRpb24sIHNvIGZlbmNlZCBibG9ja3MgYXJlIHNraXBwZWQsIGFzIGlzIGEgbm90ZSB0aGF0IGRlY2xhcmVzIGluIGl0c1xuICAgKiBmcm9udG1hdHRlciB3aHkgaXRzIHdpa2lsaW5rcyBhcmUgdGhlIHBvaW50IOKAlCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhXaWtpbGlua3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiB7XG4gICAgICAgIGlmIChyZWFkV2lraWxpbmtBbGxvd2FuY2VSZWFzb24obm90ZS5jb250ZW50KSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGFsbG93ZWRMaW5lSW5kZXhlcyB9ID0gc2Nhbldpa2lsaW5rRGlyZWN0aXZlcyhub3RlLmNvbnRlbnQpO1xuICAgICAgICByZXR1cm4gZmluZFdpa2lsaW5rTGluZUluZGV4ZXMobm90ZS5jb250ZW50KS5zb21lKChsaW5lSW5kZXgpID0+ICFhbGxvd2VkTGluZUluZGV4ZXMuaGFzKGxpbmVJbmRleCkpO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBtZW1iZXJzIHRoYXQgdGhlIGRlbW8gbm90ZXMgcmVmZXJlbmNlIG9uIGEgcmVjZWl2ZXIgYnV0IHRoYXQgbm8gbG9uZ2VyIGV4aXN0IG9uIGl0IChyZW5hbWUgZHJpZnQpLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBkaXN0aW5jdCBzdGFsZSBtZW1iZXIgbmFtZXMgcmVmZXJlbmNlZCBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqL1xuICBwdWJsaWMgZmluZFN0YWxlUmVmZXJlbmNlcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRTdGFsZVJlZmVyZW5jZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmFsaWRNZW1iZXJzID0gbmV3IFNldChwYXJhbXMudmFsaWRNZW1iZXJzKTtcbiAgICBjb25zdCByZWZlcmVuY2VkID0gWy4uLnRoaXMucmVhZENvcnB1cygpLm1hdGNoQWxsKG5ldyBSZWdFeHAoU3RyaW5nLnJhd2Ake3BhcmFtcy5yZWNlaXZlcn1cXC4oPzxtZW1iZXI+XFx3KylgLCAnZycpKV1cbiAgICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbWVtYmVyJykpO1xuICAgIHJldHVybiBbLi4ubmV3IFNldChyZWZlcmVuY2VkKV0uZmlsdGVyKChtZW1iZXIpID0+ICF2YWxpZE1lbWJlcnMuaGFzKG1lbWJlcikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG1lbWJlcnMgdGhhdCBhcmUgbm90IGRlbW9uc3RyYXRlZCBhbnl3aGVyZSBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIG1lbWJlciBuYW1lcyB3aXRoIG5vIGRlbW9uc3RyYXRpb24uXG4gICAqL1xuICBwdWJsaWMgZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY29ycHVzID0gdGhpcy5yZWFkQ29ycHVzKCk7XG4gICAgcmV0dXJuIHBhcmFtcy5tZW1iZXJzLmZpbHRlcigobWVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBuZWVkbGUgPSBwYXJhbXMucmVjZWl2ZXIgPT09IHVuZGVmaW5lZCA/IG1lbWJlciA6IGAke3BhcmFtcy5yZWNlaXZlcn0uJHttZW1iZXJ9YDtcbiAgICAgIHJldHVybiAhY29ycHVzLmluY2x1ZGVzKG5lZWRsZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgZmVhdHVyZSBkb2NzIHRoYXQgbm8gZGVtbyBub3RlIGxpbmtzIHRvLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBmZWF0dXJlLWRvYyBiYXNlbmFtZXMgKHdpdGhvdXQgYC5tZGApIG5vdCBsaW5rZWQgZnJvbSBhbnkgZGVtbyBub3RlLlxuICAgKi9cbiAgcHVibGljIGZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVubGlua2VkRmVhdHVyZURvY3NQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm9uRmVhdHVyZURvY3MgPSBuZXcgU2V0KHBhcmFtcy5ub25GZWF0dXJlRG9jcyk7XG4gICAgY29uc3QgZmVhdHVyZURvY3MgPSByZWFkZGlyU3luYyhqb2luKHRoaXMucm9vdEZvbGRlciwgcGFyYW1zLmRvY3NGb2xkZXIpKVxuICAgICAgLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aCgnLm1kJykpXG4gICAgICAubWFwKChmaWxlKSA9PiBmaWxlLnJlcGxhY2UoL1xcLm1kJC8sICcnKSlcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+ICFub25GZWF0dXJlRG9jcy5oYXMobmFtZSkpO1xuICAgIGNvbnN0IGxpbmtlZERvY3MgPSBuZXcgU2V0KFxuICAgICAgWy4uLnRoaXMucmVhZENvcnB1cygpLm1hdGNoQWxsKC9kb2NzXFwvKD88ZG9jPltcXHctXSspXFwubWQvZyldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdkb2MnKSlcbiAgICApO1xuICAgIHJldHVybiBmZWF0dXJlRG9jcy5maWx0ZXIoKGRvYykgPT4gIWxpbmtlZERvY3MuaGFzKGRvYykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHRoYXQgY2Fubm90IGJlIHJlYWNoZWQgZnJvbSB0aGUgc3RhcnQgbm90ZSBieSBmb2xsb3dpbmcgTWFya2Rvd24gbGlua3MgYmV0d2VlbiBub3Rlcy5cbiAgICpcbiAgICogVGhlIHdhbGsgc3RhcnRzIGF0IHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5yZWFjaGFibGVOb3Rlc1BhcmFtcy5zdGFydE5vdGV9IGFuZCBmb2xsb3dzXG4gICAqIGV2ZXJ5IGBbVGV4dF0oPC4vTk4gTmFtZS5tZD4pYCBsaW5rIG91dHNpZGUgYSBjb2RlIGZlbmNlLCB0cmFuc2l0aXZlbHkuIEEgbm90ZSBub3RoaW5nIGxpbmtzIHRvIGlzXG4gICAqIG9uZSBhIHJlYWRlciBjYW4gb25seSBmaW5kIGJ5IGJyb3dzaW5nIHRoZSBmaWxlIGxpc3Qg4oCUIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB0aGUgZ3JvdXBlZCBpbmRleCBpbiB0aGVcbiAgICogc3RhcnQgbm90ZSBpcyBtZWFudCB0byByZXBsYWNlLiBXaGVuIHRoZSBzdGFydCBub3RlIGl0c2VsZiBpcyBtaXNzaW5nLCBFVkVSWSBub3RlIGlzIHVucmVhY2hhYmxlLFxuICAgKiBiZWNhdXNlIHRoZXJlIGlzIG5vd2hlcmUgdG8gc3RhcnQgZnJvbS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgd2Fsay5cbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSB1bnJlYWNoYWJsZSBub3Rlcy5cbiAgICovXG4gIHB1YmxpYyBmaW5kVW5yZWFjaGFibGVOb3RlcyhwYXJhbXM6IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbnJlYWNoYWJsZU5vdGVzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG5vdGVzQnlSZWxhdGl2ZVBhdGggPSBuZXcgTWFwKHRoaXMuY29sbGVjdE5vdGVzKCkubWFwKChub3RlKSA9PiBbbm90ZS5yZWxhdGl2ZVBhdGgsIG5vdGVdKSk7XG4gICAgY29uc3QgcmVhY2hlZE5vdGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgcGVuZGluZ05vdGVzID0gW3BhcmFtcy5zdGFydE5vdGVdO1xuXG4gICAgd2hpbGUgKHBlbmRpbmdOb3Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub3RlUGF0aCA9IGVuc3VyZU5vbk51bGxhYmxlKHBlbmRpbmdOb3Rlcy5wb3AoKSk7XG4gICAgICBjb25zdCBub3RlID0gbm90ZXNCeVJlbGF0aXZlUGF0aC5nZXQobm90ZVBhdGgpO1xuICAgICAgaWYgKCFub3RlIHx8IHJlYWNoZWROb3Rlcy5oYXMobm90ZVBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmVhY2hlZE5vdGVzLmFkZChub3RlUGF0aCk7XG4gICAgICBwZW5kaW5nTm90ZXMucHVzaCguLi5jb2xsZWN0Tm90ZUxpbmtUYXJnZXRzKG5vdGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Q2hlY2thYmxlTm90ZXMoKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpXG4gICAgICAuZmlsdGVyKChub3RlUGF0aCkgPT4gIXJlYWNoZWROb3Rlcy5oYXMobm90ZVBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIG5hbWVzIG9mIHRoZSBgZXhwb3J0IGZ1bmN0aW9uYHMgKGluY2x1ZGluZyBgYXN5bmNgIGFuZCBnZW5lcmF0b3IgZGVjbGFyYXRpb25zKSBpbiBhIHNvdXJjZSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBleHBvcnRlZCBmdW5jdGlvbiBuYW1lcyBpbiBzb3VyY2Ugb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzUGFyYW1zKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlYWRGaWxlU3luYyhqb2luKHRoaXMucm9vdEZvbGRlciwgcGFyYW1zLnNvdXJjZVBhdGgpLCAndXRmLTgnKTtcbiAgICByZXR1cm4gWy4uLnNvdXJjZS5tYXRjaEFsbCgvXmV4cG9ydCAoPzphc3luYyApP2Z1bmN0aW9uXFwqPyAoPzxuYW1lPlxcdyspL2dtKV1cbiAgICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIG1lbWJlcnMgb2YgYW4gYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCBkZWNsYXJlZCBpbiBhIHNvdXJjZSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBsb29rdXAuXG4gICAqIEByZXR1cm5zIFRoZSBwYXJzZWQge0BsaW5rIEludGVyZmFjZU1lbWJlcnN9LlxuICAgKiBAdGhyb3dzIFdoZW4gdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0gY2Fubm90IGJlIGZvdW5kIGluIHRoZSBzb3VyY2UgZmlsZS5cbiAgICovXG4gIHB1YmxpYyBnZXRJbnRlcmZhY2VNZW1iZXJzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0SW50ZXJmYWNlTWVtYmVyc1BhcmFtcyk6IEludGVyZmFjZU1lbWJlcnMge1xuICAgIGNvbnN0IHNvdXJjZSA9IHJlYWRGaWxlU3luYyhqb2luKHRoaXMucm9vdEZvbGRlciwgcGFyYW1zLnNvdXJjZVBhdGgpLCAndXRmLTgnKTtcbiAgICBjb25zdCBtYXRjaCA9IG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BleHBvcnQgKD88a2V5d29yZD5pbnRlcmZhY2V8Y2xhc3N8ZW51bSkgJHtwYXJhbXMuaW50ZXJmYWNlTmFtZX1cXGJbXntdKlxceyg/PGJvZHk+W1xcc1xcU10qPylcXG5cXH1gKS5leGVjKHNvdXJjZSk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBpbnRlcmZhY2UgJHtwYXJhbXMuaW50ZXJmYWNlTmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlTWVtYmVycyhnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAna2V5d29yZCcpLCBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnYm9keScpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbmQgY2FjaGVzIHRoZSBkZW1vIGNvcnB1cyDigJQgZXZlcnkgYCoubWRgIG5vdGUgaW4gdGhlIGRlbW8gdmF1bHQgam9pbmVkIGludG8gb25lIHN0cmluZy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNvbmNhdGVuYXRlZCBkZW1vLW5vdGUgY29udGVudHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZENvcnB1cygpOiBzdHJpbmcge1xuICAgIHRoaXMuY2FjaGVkQ29ycHVzID8/PSB0aGlzLmNvbGxlY3ROb3RlcygpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLmNvbnRlbnQpXG4gICAgICAuam9pbignXFxuJyk7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkQ29ycHVzO1xuICB9XG5cbiAgLy8gVGhlIG5vdGVzIHRoZSBhdXRob3JpbmcgY2hlY2tzIGFwcGx5IHRvOiBldmVyeSBub3RlIGV4Y2VwdCB0aGUgb25lcyBkZWNsYXJlZCBvdXRzaWRlIHRoZSBsZWFybmluZ1xuICAvLyBwYXRoICh0aGUgdmF1bHQncyBvd24gYFJFQURNRS5tZGAgYnkgZGVmYXVsdCkuXG4gIHByaXZhdGUgY29sbGVjdENoZWNrYWJsZU5vdGVzKCk6IERlbW9WYXVsdE5vdGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdE5vdGVzKCkuZmlsdGVyKChub3RlKSA9PiAhdGhpcy5leGNsdWRlZE5vdGVzLmhhcyhub3RlLnJlbGF0aXZlUGF0aCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2xsZWN0TWFya2Rvd25GaWxlcyhmb2xkZXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdID0gW107XG4gICAgLy8gYHJlYWRkaXJTeW5jYCByZXR1cm5zIGVudHJpZXMgaW4gdGhlIGZpbGUgc3lzdGVtJ3Mgb3duIG9yZGVyOiBieSBuYW1lIG9uIE5URlMsIGJ1dCBieSBoYXNoIG9uIGV4dDQsIHNvXG4gICAgLy8gc29ydCB0aGVtIHNvIGV2ZXJ5IGNoZWNrIHJlcG9ydHMgaXRzIG5vdGVzIGluIHRoZSBzYW1lIG9yZGVyIG9uIGV2ZXJ5IHBsYXRmb3JtLlxuICAgIGNvbnN0IGVudHJpZXMgPSByZWFkZGlyU3luYyhmb2xkZXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUsICdlbicpKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGlmIChlbnRyeS5uYW1lID09PSBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Ob2RlTW9kdWxlcyBhcyBzdHJpbmcpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLmNvbGxlY3RNYXJrZG93bkZpbGVzKGpvaW4oZm9sZGVyLCBlbnRyeS5uYW1lKSkpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSkge1xuICAgICAgICByZXN1bHQucHVzaChqb2luKGZvbGRlciwgZW50cnkubmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgYHZpdGVzdGAgc3VpdGUgdGhhdCBrZWVwcyBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCBpbiBzeW5jIHdpdGggaXRzIHB1YmxpYyBzdXJmYWNlLlxuICpcbiAqIENhbGwgaXQgb25jZSBmcm9tIGEgcGx1Z2luJ3MgYGRlbW8tdmF1bHQubm8tYXBwLmludGVncmF0aW9uLnRlc3QudHNgOyBpdCByZWdpc3RlcnMgb25lIHRlc3QgcGVyIGNoZWNrLFxuICogZGVsZWdhdGluZyB0byB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyfS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRlY2xhcmF0aXZlIGNvdmVyYWdlIHNwZWNpZmljYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGUocGFyYW1zOiBSZWdpc3RlckRlbW9WYXVsdENvdmVyYWdlU3VpdGVQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgY2hlY2tlciA9IG5ldyBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckNvbnN0cnVjdG9yUGFyYW1zPih7XG4gICAgZXhjbHVkZWROb3RlczogcGFyYW1zLmF1dGhvcmluZz8uZXhjbHVkZWROb3RlcyxcbiAgICByb290Rm9sZGVyOiBwYXJhbXMucm9vdEZvbGRlclxuICB9KSk7XG4gIGNvbnN0IHN0YXJ0Tm90ZSA9IHBhcmFtcy5hdXRob3Jpbmc/LnN0YXJ0Tm90ZSA/PyBERUZBVUxUX1NUQVJUX05PVEU7XG5cbiAgZGVzY3JpYmUoJ2RlbW8tdmF1bHQgY292ZXJhZ2UnLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5pbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5ICR7c3BlYy5pbnRlcmZhY2VOYW1lfSAke3NwZWMua2luZH1gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoc3BlYyk7XG4gICAgICAgIGNvbnN0IGRlbW9uc3RyYXRlZCA9IG1lbWJlcnNbc3BlYy5raW5kXTtcbiAgICAgICAgZXhwZWN0KGRlbW9uc3RyYXRlZC5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyh7IG1lbWJlcnM6IGRlbW9uc3RyYXRlZCwgcmVjZWl2ZXI6IHNwZWMucmVjZWl2ZXIgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KGByZWZlcmVuY2VzIG5vICR7c3BlYy5pbnRlcmZhY2VOYW1lfSBtZW1iZXIgdGhhdCBubyBsb25nZXIgZXhpc3RzYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kU3RhbGVSZWZlcmVuY2VzKHsgcmVjZWl2ZXI6IHNwZWMucmVjZWl2ZXIsIHZhbGlkTWVtYmVyczogbWVtYmVycy5hbGwgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5jb25maWdJbnRlcmZhY2VzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5ICR7c3BlYy5pbnRlcmZhY2VOYW1lfSBvcHRpb25gLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoc3BlYyk7XG4gICAgICAgIGV4cGVjdChtZW1iZXJzLnByb3BlcnRpZXMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMoeyBtZW1iZXJzOiBtZW1iZXJzLnByb3BlcnRpZXMgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHBhcmFtcy5mdW5jdGlvbk1vZHVsZXMgPz8gW10pIHtcbiAgICAgIGl0KGBkZW1vbnN0cmF0ZXMgZXZlcnkgZXhwb3J0ZWQgZnVuY3Rpb24gaW4gJHtzcGVjLnNvdXJjZVBhdGh9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWVzID0gY2hlY2tlci5nZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXMoc3BlYyk7XG4gICAgICAgIGV4cGVjdChmdW5jdGlvbk5hbWVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHsgbWVtYmVyczogZnVuY3Rpb25OYW1lcyB9KSkudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBkb2NzID0gcGFyYW1zLmRvY3M7XG4gICAgaWYgKGRvY3MpIHtcbiAgICAgIGl0KCdsaW5rcyBhIGRlbW8gbm90ZSBmb3IgZXZlcnkgZmVhdHVyZSBkb2MnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzKHsgZG9jc0ZvbGRlcjogZG9jcy5mb2xkZXIsIG5vbkZlYXR1cmVEb2NzOiBkb2NzLm5vbkZlYXR1cmVEb2NzIH0pKVxuICAgICAgICAgIC50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGl0KCdvcGVucyBldmVyeSBub3RlIHdpdGggYW4gSDEnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRob3V0SDEoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnb3BlbnMgZXZlcnkgbm90ZSB3aXRoIGEgcHJvc2UgcGFyYWdyYXBoIGJlZm9yZSBpdHMgZmlyc3QgY29kZSBibG9jaycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhvdXRJbnRyb1Byb3NlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoYHJlYWNoZXMgZXZlcnkgbm90ZSBmcm9tICR7c3RhcnROb3RlfWAsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbnJlYWNoYWJsZU5vdGVzKHsgc3RhcnROb3RlIH0pKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCd1c2VzIG5vIHdpa2lsaW5rcywgd2hpY2ggZG8gbm90IHJlbmRlciBvbiBHaXRIdWInLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRoV2lraWxpbmtzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2p1c3RpZmllcyBldmVyeSB3aWtpbGluayBhbGxvd2FuY2UsIGFuZCBkZWNsYXJlcyBub25lIGl0IG5vIGxvbmdlciBuZWVkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhVbmp1c3RpZmllZFdpa2lsaW5rQWxsb3dhbmNlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhcnJpZXMgbm8gRG9jcyBsaW5rIGxpbmUsIGJlY2F1c2UgdGhlIG5vdGUgaXMgdGhlIGRvY3MnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRoRG9jc0xpbmtzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvbW1pdHMgbm9uZSBvZiB0aGUgYXBwLmpzb24gc2V0dGluZ3Mgb2JzaWRpYW4tZGV2LXV0aWxzIGluamVjdHMgYXQgcmVsZWFzZSB0aW1lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZENvbW1pdHRlZEFwcEpzb25TZXR0aW5ncygpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIC8vIFdpdGggbm8gbm90ZXMgdG8gcmVhZCwgZXZlcnkgYXV0aG9yaW5nIGNoZWNrIGFib3ZlIHBhc3NlcyBieSBoYXZpbmcgbm90aGluZyB0byBsb29rIGF0LCBzbyBhIHZhdWx0XG4gICAgLy8gdGhhdCBzdG9wcGVkIGJlaW5nIGZvdW5kIHdvdWxkIGdvIG9uIHJlcG9ydGluZyBpdHNlbGYgY2xlYW4uIFRoaXMgaXMgdGhlIGhhbGYgb2YgdGhlIG5vbi10cml2aWFsXG4gICAgLy8gZ3VhcmQgdGhhdCBzdGlsbCBhcHBsaWVzIHdoZW4gdGhlIHBsdWdpbiBleHBvc2VzIG5vdGhpbmcgdG8gcmVmbGVjdC5cbiAgICBpdCgncmVhZHMgYSBub24tZW1wdHkgZGVtbyB2YXVsdCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmNvbGxlY3REZW1vTm90ZVJlbGF0aXZlUGF0aHMoKS5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGd1YXJkID0gcGFyYW1zLm5vblRyaXZpYWxHdWFyZDtcbiAgICBpZiAoZ3VhcmQpIHtcbiAgICAgIGl0KCdrZWVwcyB0aGUgcmVmbGVjdGVkIHN1cmZhY2Ugbm9uLXRyaXZpYWwnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnMgPSBjaGVja2VyLmdldEludGVyZmFjZU1lbWJlcnMoZ3VhcmQpO1xuICAgICAgICBleHBlY3QobWVtYmVycy5hbGwpLnRvQ29udGFpbihndWFyZC5leHBlY3RNZW1iZXIpO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5jb2xsZWN0RGVtb05vdGVSZWxhdGl2ZVBhdGhzKCkpLnRvQ29udGFpbihndWFyZC5leHBlY3REZW1vTm90ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCBDTEFTU19NRU1CRVJfTU9ESUZJRVJTID0gU3RyaW5nLnJhd2AoPzooPzpwdWJsaWN8cHJpdmF0ZXxwcm90ZWN0ZWR8cmVhZG9ubHl8c3RhdGljfGFic3RyYWN0fG92ZXJyaWRlKVxccyspKmA7XG5jb25zdCBBQlNPTFVURV9VUkxfUkVHX0VYUCA9IC9eW2Etel1bXFx3Ky4tXSo6L2k7XG5jb25zdCBBUlJPV19SRUdfRVhQID0gL15cXHMqPT4vO1xuY29uc3QgRlVOQ1RJT05fVFlQRV9QQVJBTUVURVJTX1JFR19FWFAgPSAvXjxbXj5dKj5cXHMqLztcbmNvbnN0IEFOR0xFX0JSQUNLRVRTX1JFR19FWFAgPSAvXjx8PiQvZztcbmNvbnN0IENPREVfRkVOQ0VfUkVHX0VYUCA9IC9eXFxzKig/OmBgYHx+fn4pLztcbmNvbnN0IERFRkFVTFRfRVhDTFVERURfTk9URVMgPSBbJ1JFQURNRS5tZCddO1xuY29uc3QgREVGQVVMVF9TVEFSVF9OT1RFID0gJzAwIFN0YXJ0Lm1kJztcbmNvbnN0IERPQ1NfTElOS19SRUdfRVhQID0gL15cXHMqXFxbRG9jc11cXCgvO1xuY29uc3QgRlJPTlRNQVRURVJfUkVHX0VYUCA9IC9eLS0tXFxyP1xcbltcXHNcXFNdKj9cXHI/XFxuLS0tW15cXFNcXG5dKlxccj9cXG4/LztcbmNvbnN0IEgxX1JFR19FWFAgPSAvXiMgXFxTLztcbmNvbnN0IEhFQURJTkdfUkVHX0VYUCA9IC9eI3sxLDZ9IC87XG5jb25zdCBJTkxJTkVfQ09ERV9SRUdfRVhQID0gL2BbXmBcXG5dKmAvZztcbmNvbnN0IE1BUktET1dOX0xJTktfUkVHX0VYUCA9IC9cXFtbXlxcXV0qXVxcKCg/PHRhcmdldD5bXildKylcXCkvZztcbi8vIEFuIGlubGluZSBkaXJlY3RpdmUsIHNoYXBlZCBhZnRlciBFU0xpbnQncyBhbmQgd3JpdHRlbiBhcyBhbiBIVE1MIGNvbW1lbnQgc28gaXQgaXMgaW52aXNpYmxlIEJPVEggaW5cbi8vIE9ic2lkaWFuIGFuZCBvbiBHaXRIdWIg4oCUIHRoZSBzYW1lIHNwZWxsaW5nIHRoZSB2YXVsdHMgYWxyZWFkeSB1c2UgZm9yIGBtYXJrZG93bmxpbnQtZGlzYWJsZS1uZXh0LWxpbmVgLlxuLy8gQW4gT2JzaWRpYW4gYCUlIOKApiAlJWAgY29tbWVudCB3b3VsZCBzaG93IHVwIGFzIGxpdGVyYWwgdGV4dCBvbiBHaXRIdWIsIHdoaWNoIGlzIGhhbGYgdGhlIHJlYWRlcnNoaXAuXG5jb25zdCBESVJFQ1RJVkVfUkVHX0VYUCA9IC9eXFxzKjwhLS1cXHMqb2JzaWRpYW4tZGV2LXV0aWxzLSg/PGFjdGlvbj5kaXNhYmxlLW5leHQtbGluZXxkaXNhYmxlfGVuYWJsZSlcXHMrKD88cnVsZT5bXFx3LV0rXFwvW1xcdy1dKykoPzpcXHMrLS1cXHMrKD88cmVhc29uPi4qPykpP1xccyotLT5cXHMqJC87XG4vLyBDYXRjaGVzIGEgZGlyZWN0aXZlIHRoYXQgd2FzIE1FQU5UIHRvIGJlIG9uZSBidXQgaXMgbWlzc3BlbGxlZDogaXQgd291bGQgb3RoZXJ3aXNlIHJlYWQgYXMgYW4gb3JkaW5hcnlcbi8vIGNvbW1lbnQgYW5kIHNpbGVudGx5IGRvIG5vdGhpbmcsIHdoaWNoIGlzIHRoZSBmYWlsdXJlIG1vZGUgYSBzdXBwcmVzc2lvbiBzeW50YXggbXVzdCBuZXZlciBoYXZlLlxuY29uc3QgRElSRUNUSVZFX1BST0JFX1JFR19FWFAgPSAvPCEtLVxccypvYnNpZGlhbi1kZXYtdXRpbHMtLztcbmNvbnN0IFdJS0lMSU5LX1JVTEUgPSAnZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyc7XG4vLyBUaGUgYG9ic2lkaWFuLWRldi11dGlscyA+IGRlbW8tdmF1bHQtdmFsaWRhdGlvbiA+IGFsbG93LXdpa2lsaW5rc2AgZnJvbnRtYXR0ZXIgcGF0aCwgYXQgYW55IGluZGVudGF0aW9uOlxuLy8gVGhlIGtleXMgbXVzdCBuZXN0IGluIHRoYXQgb3JkZXIsIGFuZCBhbnkgbGluZSBiZXR3ZWVuIHRoZW0gaGFzIHRvIHN0YXkgaW5kZW50ZWQsIHNvIGEgZGVkZW50IHRvIHRoZVxuLy8gZG9jdW1lbnQncyBvd24gdG9wIGxldmVsIGVuZHMgdGhlIG1hdGNoIHJhdGhlciB0aGFuIHJlYWNoaW5nIGEgc2FtZS1uYW1lZCBrZXkgdW5kZXIgYW5vdGhlciBwYXJlbnQuXG5jb25zdCBXSUtJTElOS19BTExPV0FOQ0VfUkVHX0VYUCA9IC9eb2JzaWRpYW4tZGV2LXV0aWxzOlteXFxTXFxuXSpcXG4oPzpbXlxcU1xcbl0rLipcXG4pKj9bXlxcU1xcbl0rZGVtby12YXVsdC12YWxpZGF0aW9uOlteXFxTXFxuXSpcXG4oPzpbXlxcU1xcbl0rLipcXG4pKj9bXlxcU1xcbl0rYWxsb3ctd2lraWxpbmtzOig/PHJlYXNvbj4uKikkL207XG5jb25zdCBXSUtJTElOS19SRUdfRVhQID0gL1xcW1xcW1teXFxdXStdXS87XG5cbi8vIEFwcGxpZXMgb25lIHBhcnNlZCBkaXJlY3RpdmUgdG8gdGhlIHNjYW4uXG5mdW5jdGlvbiBhcHBseVdpa2lsaW5rRGlyZWN0aXZlKHN0YXRlOiBXaWtpbGlua0RpcmVjdGl2ZVNjYW5TdGF0ZSwgbGluZUluZGV4OiBudW1iZXIsIG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkpOiB2b2lkIHtcbiAgY29uc3QgYWN0aW9uID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2FjdGlvbicpO1xuICBjb25zdCBydWxlID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3J1bGUnKTtcbiAgY29uc3QgcmVhc29uID0gbWF0Y2guZ3JvdXBzPy5bJ3JlYXNvbiddPy50cmltKCkgPz8gJyc7XG4gIGlmIChydWxlICE9PSBXSUtJTElOS19SVUxFKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYW4gdW5rbm93biBydWxlIFwiJHtydWxlfVwiIG9uICR7Zm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXgpfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYWN0aW9uICE9PSAnZW5hYmxlJyAmJiByZWFzb24gPT09ICcnKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXJlY3RpdmUgd2l0aCBubyByZWFzb24gb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUtbmV4dC1saW5lJykge1xuICAgIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ID0gbGluZUluZGV4O1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChhY3Rpb24gPT09ICdkaXNhYmxlJykge1xuICAgIGlmIChzdGF0ZS5vcGVuUmVnaW9uKSB7XG4gICAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIGRpc2FibGUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9IGluc2lkZSB0aGUgcmVnaW9uIG9wZW5lZCBvbiAke2Zvcm1hdExpbmVOdW1iZXIoc3RhdGUub3BlblJlZ2lvbi5saW5lSW5kZXgpfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdGF0ZS5vcGVuUmVnaW9uID0geyBpc1VzZWQ6IGZhbHNlLCBsaW5lSW5kZXggfTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXN0YXRlLm9wZW5SZWdpb24pIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhbiBlbmFibGUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9IHdpdGggbm8gcmVnaW9uIG9wZW5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFzdGF0ZS5vcGVuUmVnaW9uLmlzVXNlZCkge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgcmVnaW9uIG9wZW5lZCBvbiAke2Zvcm1hdExpbmVOdW1iZXIoc3RhdGUub3BlblJlZ2lvbi5saW5lSW5kZXgpfSBjb3ZlcmluZyBubyB3aWtpbGlua2ApO1xuICB9XG4gIHN0YXRlLm9wZW5SZWdpb24gPSBudWxsO1xufVxuXG4vLyBBcHBsaWVzIG9uZSBvcmRpbmFyeSBsaW5lIHRvIHRoZSBzY2FuOiBhbiBvcGVuIHJlZ2lvbiBjb3ZlcnMgaXQsIGFuZCBhIHBlbmRpbmcgYGRpc2FibGUtbmV4dC1saW5lYFxuLy8gY2xhaW1zIHRoZSBmaXJzdCBsaW5lIHdpdGggY29udGVudCBvbiBpdCDigJQgdGhlIGRpcmVjdGl2ZSBhbmQgaXRzIHRhcmdldCBhcmUgdXN1YWxseSBhIGJsYW5rIGxpbmUgYXBhcnQuXG5mdW5jdGlvbiBhcHBseVdpa2lsaW5rU2NhbkxpbmUoc3RhdGU6IFdpa2lsaW5rRGlyZWN0aXZlU2NhblN0YXRlLCBsaW5lSW5kZXg6IG51bWJlciwgbGluZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChzdGF0ZS5vcGVuUmVnaW9uKSB7XG4gICAgc3RhdGUuYWxsb3dlZExpbmVJbmRleGVzLmFkZChsaW5lSW5kZXgpO1xuICAgIHN0YXRlLm9wZW5SZWdpb24uaXNVc2VkIHx8PSBzdGF0ZS53aWtpbGlua0xpbmVJbmRleGVzLmhhcyhsaW5lSW5kZXgpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXggPT09IG51bGwgfHwgbGluZS50cmltKCkgPT09ICcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHN0YXRlLmFsbG93ZWRMaW5lSW5kZXhlcy5hZGQobGluZUluZGV4KTtcbiAgaWYgKCFzdGF0ZS53aWtpbGlua0xpbmVJbmRleGVzLmhhcyhsaW5lSW5kZXgpKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXNhYmxlLW5leHQtbGluZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIoc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXgpfSBjb3ZlcmluZyBubyB3aWtpbGlua2ApO1xuICB9XG4gIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gYnVpbGRNZW1iZXJzKG1ldGhvZHM6IHN0cmluZ1tdLCBwcm9wZXJ0aWVzOiBzdHJpbmdbXSk6IEludGVyZmFjZU1lbWJlcnMge1xuICByZXR1cm4ge1xuICAgIGFsbDogWy4uLm1ldGhvZHMsIC4uLnByb3BlcnRpZXNdLFxuICAgIG1ldGhvZHMsXG4gICAgcHJvcGVydGllc1xuICB9O1xufVxuXG4vLyBSZXNvbHZlcyB0aGUgbm90ZXMgYSBub3RlIGxpbmtzIHRvOiBldmVyeSBNYXJrZG93biBsaW5rIG91dHNpZGUgYSBjb2RlIGZlbmNlIHdob3NlIHRhcmdldCBpcyBhIGAubWRgXG4vLyBmaWxlLCBtYWRlIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHNvIGl0IGNhbiBiZSBsb29rZWQgdXAgaW4gdGhlIG5vdGUgbWFwLiBFeHRlcm5hbCBVUkxzIGFuZFxuLy8gbm9uLW5vdGUgdGFyZ2V0cyAoaW1hZ2VzLCBzY3JpcHRzKSBhcmUgbm90IHBhcnQgb2YgdGhlIGxlYXJuaW5nIHBhdGggYW5kIGFyZSBza2lwcGVkOyBhIGAjYW5jaG9yYCBpc1xuLy8gZHJvcHBlZCwgc2luY2UgaXQgYWRkcmVzc2VzIGEgcGxhY2UgaW5zaWRlIGFuIGFscmVhZHktcmVzb2x2ZWQgbm90ZS5cbi8vIFJldHVybnMgdGhlIG5vdGUncyBsaW5lcyB3aXRoIGZlbmNlZCBjb2RlIGJsb2NrcyByZW1vdmVkICh0aGUgZmVuY2UgbGluZXMgaW5jbHVkZWQpLCBwYWlyZWQgd2l0aCB0aGVcbi8vIGxpbmUgbnVtYmVyIGVhY2ggY2FtZSBmcm9tLCBzbyBhIGNoZWNrIG5ldmVyIG1pc3Rha2VzIHNhbXBsZSBjb2RlIGZvciBwcm9zZSDigJQgYSBgW1t3aWtpbGlua11dYFxuLy8gZGVtb25zdHJhdGVkIGluc2lkZSBhIGZlbmNlIGlzIHRleHQsIG5vdCBuYXZpZ2F0aW9uIOKAlCBhbmQgYW4gaW5saW5lIGRpcmVjdGl2ZSBjYW4gc3RpbGwgbmFtZSBhIGxpbmUuXG5mdW5jdGlvbiBjb2xsZWN0TGluZXNPdXRzaWRlRmVuY2VzKGNvbnRlbnQ6IHN0cmluZyk6IE5vdGVMaW5lW10ge1xuICBjb25zdCBub3RlTGluZXM6IE5vdGVMaW5lW10gPSBbXTtcbiAgbGV0IGlzSW5zaWRlRmVuY2UgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpLmVudHJpZXMoKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgaXNJbnNpZGVGZW5jZSA9ICFpc0luc2lkZUZlbmNlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghaXNJbnNpZGVGZW5jZSkge1xuICAgICAgbm90ZUxpbmVzLnB1c2goeyBpbmRleCwgbGluZSB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vdGVMaW5lcztcbn1cblxuZnVuY3Rpb24gY29sbGVjdE5vdGVMaW5rVGFyZ2V0cyhub3RlOiBEZW1vVmF1bHROb3RlKTogc3RyaW5nW10ge1xuICBjb25zdCB0YXJnZXRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgZ2V0TGluZXNPdXRzaWRlRmVuY2VzKG5vdGUuY29udGVudCkpIHtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHN0cmlwSW5saW5lQ29kZShsaW5lKS5tYXRjaEFsbChNQVJLRE9XTl9MSU5LX1JFR19FWFApKSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAndGFyZ2V0JykucmVwbGFjZUFsbChBTkdMRV9CUkFDS0VUU19SRUdfRVhQLCAnJyk7XG4gICAgICBjb25zdCBbbm90ZVBhdGggPSAnJ10gPSB0YXJnZXQuc3BsaXQoJyMnLCAxKTtcbiAgICAgIGlmIChBQlNPTFVURV9VUkxfUkVHX0VYUC50ZXN0KG5vdGVQYXRoKSB8fCAhbm90ZVBhdGgudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnLm1kJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0YXJnZXRzLnB1c2goam9pbihkaXJuYW1lKG5vdGUucmVsYXRpdmVQYXRoKSwgdHJ5RGVjb2RlVXJpQ29tcG9uZW50KG5vdGVQYXRoKSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0cztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdENsYXNzTWV0aG9kTmFtZXMoY2xhc3NCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uY2xhc3NCb2R5Lm1hdGNoQWxsKG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeIHsyfSg/PG1vZGlmaWVycz4ke0NMQVNTX01FTUJFUl9NT0RJRklFUlN9KSg/PG5hbWU+XFx3KykoPzo8W14+XSo+KT9cXChgLCAnZ20nKSldXG4gICAgLmZpbHRlcigobWF0Y2gpID0+ICFpc05vblB1YmxpY01lbWJlcihnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbW9kaWZpZXJzJykpKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdENsYXNzUHJvcGVydHlOYW1lcyhjbGFzc0JvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5jbGFzc0JvZHkubWF0Y2hBbGwobmV3IFJlZ0V4cChTdHJpbmcucmF3YF4gezJ9KD88bW9kaWZpZXJzPiR7Q0xBU1NfTUVNQkVSX01PRElGSUVSU30pKD88bmFtZT5cXHcrKVxccypcXD8/XFxzKls6PV1gLCAnZ20nKSldXG4gICAgLmZpbHRlcigobWF0Y2gpID0+ICFpc05vblB1YmxpY01lbWJlcihnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbW9kaWZpZXJzJykpKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEVudW1NZW1iZXJOYW1lcyhlbnVtQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmVudW1Cb2R5Lm1hdGNoQWxsKC9eIHsyfSg/PG5hbWU+XFx3KykvZ20pXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbn1cblxuLy8gQSBtZXRob2QgaXMgY2FsbGFibGUgc3VyZmFjZSBob3dldmVyIGl0IGlzIHdyaXR0ZW46IGEgbWV0aG9kIHNpZ25hdHVyZSAoYGZvbyhiYXI6IHN0cmluZyk6IHZvaWQ7YCkgb3IgYVxuLy8gcHJvcGVydHkgc2lnbmF0dXJlIHdob3NlIHR5cGUgaXMgYSBmdW5jdGlvbiB0eXBlIChgZm9vOiAoYmFyOiBzdHJpbmcpID0+IHZvaWQ7YCkuIFRoZSBzaGFyZWQgRVNMaW50IGNvbmZpZ1xuLy8gcnVucyBgQHR5cGVzY3JpcHQtZXNsaW50L21ldGhvZC1zaWduYXR1cmUtc3R5bGVgIGF0IGl0cyBgcHJvcGVydHlgIGRlZmF1bHQsIHNvIGBsaW50OmZpeGAgcmV3cml0ZXMgdGhlXG4vLyBmaXJzdCBzaGFwZSBpbnRvIHRoZSBzZWNvbmQg4oCUIHJlYWRpbmcgb25seSB0aGUgZmlyc3QgcmVwb3J0ZWQgemVybyBtZXRob2RzIGZvciBldmVyeSBzdWNoIGludGVyZmFjZS5cbmZ1bmN0aW9uIGV4dHJhY3RNZXRob2ROYW1lcyhpbnRlcmZhY2VCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG1ldGhvZFNpZ25hdHVyZU5hbWVzID0gWy4uLmludGVyZmFjZUJvZHkubWF0Y2hBbGwoL14gezJ9KD88bmFtZT5cXHcrKSg/OjxbXj5dKj4pP1xcKC9nbSldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xuICBjb25zdCBmdW5jdGlvblByb3BlcnR5TmFtZXMgPSBtYXRjaFByb3BlcnR5U2lnbmF0dXJlcyhpbnRlcmZhY2VCb2R5KVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiBpc0Z1bmN0aW9uVHlwZShpbnRlcmZhY2VCb2R5LCBtYXRjaCkpXG4gICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xuICByZXR1cm4gWy4uLm1ldGhvZFNpZ25hdHVyZU5hbWVzLCAuLi5mdW5jdGlvblByb3BlcnR5TmFtZXNdO1xufVxuXG4vLyBFdmVyeSBwcm9wZXJ0eSBzaWduYXR1cmUgd2hvc2UgdHlwZSBpcyBub3QgYSBmdW5jdGlvbiB0eXBlLCBzbyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHN0YXkgYSBwYXJ0aXRpb24uXG5mdW5jdGlvbiBleHRyYWN0UHJvcGVydHlOYW1lcyhpbnRlcmZhY2VCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBtYXRjaFByb3BlcnR5U2lnbmF0dXJlcyhpbnRlcmZhY2VCb2R5KVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNGdW5jdGlvblR5cGUoaW50ZXJmYWNlQm9keSwgbWF0Y2gpKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbn1cblxuLy8gVGhlIGxpbmUgbnVtYmVycyBjYXJyeWluZyBhIHdpa2lsaW5rIHRoYXQgaXMgbmF2aWdhdGlvbiByYXRoZXIgdGhhbiBzYW1wbGUgdGV4dC5cbmZ1bmN0aW9uIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudClcbiAgICAuZmlsdGVyKChub3RlTGluZSkgPT4gV0lLSUxJTktfUkVHX0VYUC50ZXN0KHN0cmlwSW5saW5lQ29kZShub3RlTGluZS5saW5lKSkpXG4gICAgLm1hcCgobm90ZUxpbmUpID0+IG5vdGVMaW5lLmluZGV4KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgbGluZSAke1N0cmluZyhsaW5lSW5kZXggKyAxKX1gO1xufVxuXG5mdW5jdGlvbiBnZXRMaW5lc091dHNpZGVGZW5jZXMoY29udGVudDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50KS5tYXAoKG5vdGVMaW5lKSA9PiBub3RlTGluZS5saW5lKTtcbn1cblxuLy8gV2hldGhlciB0aGUgbm90ZSdzIGZpcnN0IGNvbnRlbnQgbGluZSAoZnJvbnRtYXR0ZXIgYW5kIGJsYW5rIGxpbmVzIGFzaWRlKSBpcyBhbiBgIyBIMWAuXG5mdW5jdGlvbiBoYXNIMShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAodHJpbW1lZExpbmUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIEgxX1JFR19FWFAudGVzdCh0cmltbWVkTGluZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIGEgcGxhaW4gcHJvc2UgbGluZSBhcHBlYXJzIGJlZm9yZSB0aGUgbm90ZSdzIGZpcnN0IGNvZGUgZmVuY2UuIEhlYWRpbmdzIGFyZSBub3QgcHJvc2Ug4oCUIGEgbm90ZVxuLy8gdGhhdCBnb2VzIHN0cmFpZ2h0IGZyb20gaXRzIHRpdGxlIHRvIGEgYnV0dG9uIGlzIGV4YWN0bHkgdGhlIHNoYXBlIHRoaXMgY2hlY2sgcmVqZWN0cy5cbmZ1bmN0aW9uIGhhc0ludHJvUHJvc2UoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBzdHJpcEZyb250bWF0dGVyKGNvbnRlbnQpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICh0cmltbWVkTGluZSA9PT0gJycgfHwgSEVBRElOR19SRUdfRVhQLnRlc3QodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIHRoZSBub3RlIG5hdmlnYXRlcyB3aXRoIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gLiBGZW5jZWQgYmxvY2tzIGFuZCBpbmxpbmUgY29kZSBhcmUgc2FtcGxlXG4vLyB0ZXh0IHJhdGhlciB0aGFuIG5hdmlnYXRpb24sIHNvIHRoZXkgYXJlIHJlbW92ZWQgYmVmb3JlIGxvb2tpbmcuXG5mdW5jdGlvbiBoYXNXaWtpbGluayhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpLmxlbmd0aCA+IDA7XG59XG5cbi8vIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNpZ25hdHVyZSdzIHR5cGUsIHN0YXJ0aW5nIHJpZ2h0IGFmdGVyIGl0cyBgOmAsIGlzIGEgZnVuY3Rpb24gdHlwZTogYW4gb3B0aW9uYWwgdHlwZVxuLy8gcGFyYW1ldGVyIGxpc3QsIGEgcGFyYW1ldGVyIGxpc3QsIHRoZW4gYD0+YC4gVGhlIHBhcmFtZXRlciBsaXN0IGlzIHdhbGtlZCBieSBicmFja2V0IGRlcHRoIHJhdGhlciB0aGFuIGJ5IGFcbi8vIHJlZ3VsYXIgZXhwcmVzc2lvbiwgc28gYSBwYXJlbnRoZXNpemVkIG5vbi1mdW5jdGlvbiB0eXBlIChgKHN0cmluZyB8IG51bWJlcilbXWApIGFuZCBhIHBhcmFtZXRlciB3aG9zZSBvd25cbi8vIHR5cGUgaG9sZHMgcGFyZW50aGVzZXMgKGAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWRgKSBhcmUgYm90aCByZWFkIGNvcnJlY3RseSwgYWNyb3NzIGxpbmVzIHRvby5cbmZ1bmN0aW9uIGlzRnVuY3Rpb25UeXBlKGludGVyZmFjZUJvZHk6IHN0cmluZywgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSk6IGJvb2xlYW4ge1xuICBsZXQgaW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgaW5kZXggKz0gRlVOQ1RJT05fVFlQRV9QQVJBTUVURVJTX1JFR19FWFAuZXhlYyhpbnRlcmZhY2VCb2R5LnNsaWNlKGluZGV4KSk/LlswXS5sZW5ndGggPz8gMDtcbiAgaWYgKGludGVyZmFjZUJvZHlbaW5kZXhdICE9PSAnKCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGRlcHRoID0gMDtcbiAgZm9yICg7IGluZGV4IDwgaW50ZXJmYWNlQm9keS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBpbnRlcmZhY2VCb2R5W2luZGV4XTtcbiAgICBpZiAoY2hhcmFjdGVyID09PSAnKCcpIHtcbiAgICAgIGRlcHRoKys7XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICcpJykge1xuICAgICAgZGVwdGgtLTtcbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQVJST1dfUkVHX0VYUC50ZXN0KGludGVyZmFjZUJvZHkuc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNOb25QdWJsaWNNZW1iZXIobW9kaWZpZXJzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGIoPzpwcml2YXRlfHByb3RlY3RlZClcXGIvLnRlc3QobW9kaWZpZXJzKTtcbn1cblxuLy8gYHJlYWRvbmx5YCBpcyB0aGUgb25seSBtb2RpZmllciBhIHByb3BlcnR5IHNpZ25hdHVyZSB0YWtlcywgYW5kIGEgbWV0aG9kIHNpZ25hdHVyZSB0YWtlcyBub25lIOKAlCBUeXBlU2NyaXB0XG4vLyByZWplY3RzIGByZWFkb25seSBmb28oKTogdm9pZDtgIOKAlCBzbyB0aGUgbWV0aG9kLXNpZ25hdHVyZSByZWdleCBuZWVkcyBubyBjb3VudGVycGFydC5cbmZ1bmN0aW9uIG1hdGNoUHJvcGVydHlTaWduYXR1cmVzKGludGVyZmFjZUJvZHk6IHN0cmluZyk6IFJlZ0V4cEV4ZWNBcnJheVtdIHtcbiAgcmV0dXJuIFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/OnJlYWRvbmx5XFxzKyk/KD88bmFtZT5cXHcrKVxcPz86XFxzKi9nbSldO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1lbWJlcnMoa2V5d29yZDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgc3dpdGNoIChrZXl3b3JkKSB7XG4gICAgY2FzZSAnY2xhc3MnOiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGJvZHkpLCBleHRyYWN0Q2xhc3NQcm9wZXJ0eU5hbWVzKGJvZHkpKTtcbiAgICB9XG4gICAgY2FzZSAnZW51bSc6IHtcbiAgICAgIHJldHVybiBidWlsZE1lbWJlcnMoW10sIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoYm9keSkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RNZXRob2ROYW1lcyhib2R5KSwgZXh0cmFjdFByb3BlcnR5TmFtZXMoYm9keSkpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBSZWFkcyB0aGUgbm90ZSdzIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGRlY2xhcmF0aW9uOiB0aGUgc3RhdGVkXG4vLyByZWFzb24sIGAnJ2Agd2hlbiB0aGUga2V5IGlzIHByZXNlbnQgd2l0aCBub3RoaW5nIGFmdGVyIGl0LCBvciBgbnVsbGAgd2hlbiB0aGUgbm90ZSBkZWNsYXJlcyBub3RoaW5nLlxuLy8gUmVhZCB3aXRoIGEgcmVndWxhciBleHByZXNzaW9uIHJhdGhlciB0aGFuIGEgWUFNTCBwYXJzZXI6IGl0IGlzIG9uZSBrbm93biBrZXkgcGF0aCwgYW5kIGV2ZXJ5IHBsdWdpbiB0aGF0XG4vLyBpbnN0YWxscyB0aGlzIHBhY2thZ2Ugd291bGQgb3RoZXJ3aXNlIGNhcnJ5IGEgWUFNTCBkZXBlbmRlbmN5IGZvciBpdC5cbmZ1bmN0aW9uIHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihjb250ZW50OiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBGUk9OVE1BVFRFUl9SRUdfRVhQLmV4ZWMoY29udGVudCk/LlswXTtcbiAgaWYgKGZyb250bWF0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCByZWFzb24gPSBXSUtJTElOS19BTExPV0FOQ0VfUkVHX0VYUC5leGVjKGZyb250bWF0dGVyKT8uZ3JvdXBzPy5bJ3JlYXNvbiddO1xuICByZXR1cm4gcmVhc29uID09PSB1bmRlZmluZWQgPyBudWxsIDogcmVhc29uLnRyaW0oKS5yZXBsYWNlKC9eKD88cXVvdGU+W1wiJ10pKD88dmFsdWU+W1xcc1xcU10qKVxcazxxdW90ZT4kLywgJyQ8dmFsdWU+Jyk7XG59XG5cbi8vIFJlYWRzIHRoZSBub3RlJ3MgaW5saW5lIGBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZeKApmAgZGlyZWN0aXZlcywgcmV0dXJuaW5nIHdoaWNoIGxpbmVzIHRoZXkgYWxsb3cgYVxuLy8gd2lraWxpbmsgb24gYW5kIGV2ZXJ5dGhpbmcgd3Jvbmcgd2l0aCB0aGVtLiBBIHN1cHByZXNzaW9uIHRoYXQgcXVpZXRseSBkb2VzIG5vdGhpbmcgaXMgd29yc2UgdGhhbiBub25lLFxuLy8gc28gYSBtaXNzcGVsbGVkIGRpcmVjdGl2ZSwgb25lIHdpdGggbm8gcmVhc29uLCBhbiB1bmNsb3NlZCByZWdpb24gYW5kIG9uZSBjb3ZlcmluZyBubyB3aWtpbGluayBhdCBhbGxcbi8vIGFyZSBlYWNoIHJlcG9ydGVkIHJhdGhlciB0aGFuIGlnbm9yZWQuXG5mdW5jdGlvbiBzY2FuV2lraWxpbmtEaXJlY3RpdmVzKGNvbnRlbnQ6IHN0cmluZyk6IFdpa2lsaW5rRGlyZWN0aXZlU2NhbiB7XG4gIGNvbnN0IHN0YXRlOiBXaWtpbGlua0RpcmVjdGl2ZVNjYW5TdGF0ZSA9IHtcbiAgICBhbGxvd2VkTGluZUluZGV4ZXM6IG5ldyBTZXQ8bnVtYmVyPigpLFxuICAgIG9wZW5SZWdpb246IG51bGwsXG4gICAgcGVuZGluZ05leHRMaW5lSW5kZXg6IG51bGwsXG4gICAgcHJvYmxlbXM6IFtdLFxuICAgIHdpa2lsaW5rTGluZUluZGV4ZXM6IG5ldyBTZXQoZmluZFdpa2lsaW5rTGluZUluZGV4ZXMoY29udGVudCkpXG4gIH07XG5cbiAgZm9yIChjb25zdCB7IGluZGV4LCBsaW5lIH0gb2YgY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50KSkge1xuICAgIGNvbnN0IG1hdGNoID0gRElSRUNUSVZFX1JFR19FWFAuZXhlYyhsaW5lKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGFwcGx5V2lraWxpbmtEaXJlY3RpdmUoc3RhdGUsIGluZGV4LCBtYXRjaCk7XG4gICAgfSBlbHNlIGlmIChESVJFQ1RJVkVfUFJPQkVfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIG1hbGZvcm1lZCBkaXJlY3RpdmUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGluZGV4KX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXBwbHlXaWtpbGlua1NjYW5MaW5lKHN0YXRlLCBpbmRleCwgbGluZSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLm9wZW5SZWdpb24pIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhIHJlZ2lvbiBvcGVuZWQgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHN0YXRlLm9wZW5SZWdpb24ubGluZUluZGV4KX0gdGhhdCBpcyBuZXZlciBlbmFibGVkIGFnYWluYCk7XG4gIH1cbiAgaWYgKHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ICE9PSBudWxsKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXNhYmxlLW5leHQtbGluZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIoc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXgpfSBjb3ZlcmluZyBubyB3aWtpbGlua2ApO1xuICB9XG4gIHJldHVybiB7IGFsbG93ZWRMaW5lSW5kZXhlczogc3RhdGUuYWxsb3dlZExpbmVJbmRleGVzLCBwcm9ibGVtczogc3RhdGUucHJvYmxlbXMgfTtcbn1cblxuZnVuY3Rpb24gc3RyaXBGcm9udG1hdHRlcihjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY29udGVudC5yZXBsYWNlKEZST05UTUFUVEVSX1JFR19FWFAsICcnKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBJbmxpbmVDb2RlKGxpbmU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lLnJlcGxhY2VBbGwoSU5MSU5FX0NPREVfUkVHX0VYUCwgJycpO1xufVxuXG4vLyBBIGhhbmQtd3JpdHRlbiBsaW5rIG1heSBjb250YWluIGEgYmFyZSBgJWAgKG9yIGFueSBvdGhlciBpbnZhbGlkIHBlcmNlbnQtZXNjYXBlKSwgd2hpY2ggbWFrZXNcbi8vIGBkZWNvZGVVUklDb21wb25lbnRgIHRocm93LiBTdWNoIGEgdGFyZ2V0IGlzIG1lYW50IGxpdGVyYWxseSwgc28gaXQgaXMgdXNlZCBhcyB3cml0dGVuLlxuZnVuY3Rpb24gdHJ5RGVjb2RlVXJpQ29tcG9uZW50KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFzRUEsMEJBQTRDO0FBQzVDLGtCQUlPO0FBQ1AscUJB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
|
|
715
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vLXZhdWx0LWNvdmVyYWdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTdGF0aWMgY292ZXJhZ2UvZnJlc2huZXNzIGNoZWNrcyB0aGF0IGtlZXAgYSBwbHVnaW4ncyBpbi1yZXBvIGBkZW1vLXZhdWx0L2AgaW4gc3luYyB3aXRoIGl0cyBwdWJsaWMgc3VyZmFjZS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gc2hpcCBhIGN1cmF0ZWQgZGVtbyB2YXVsdCBhdCBgZGVtby12YXVsdC9gIGluIGl0cyByZXBvIHJvb3QuIFRoZXNlIGhlbHBlcnMgcmVmbGVjdCB0aGUgcmVhbFxuICogcHVibGljIEFQSS9jb25maWcvZG9jcyBzdHJhaWdodCBmcm9tIHNvdXJjZSBhbmQgYXNzZXJ0IOKAlCBXSVRIT1VUIGxhdW5jaGluZyBPYnNpZGlhbiDigJQgdGhhdCBldmVyeSBmZWF0dXJlIGlzXG4gKiBkZW1vbnN0cmF0ZWQgaW4gdGhlIG5vdGVzIGFuZCB0aGF0IHRoZSBub3RlcyByZWZlcmVuY2Ugbm8gQVBJIG1lbWJlciB0aGF0IG5vIGxvbmdlciBleGlzdHMgKHJlbmFtZSBkcmlmdCkuXG4gKiBUaGUgcnVudGltZSBiZWhhdmlvciBvZiB0aGUgcGx1Z2luIGlzIGNvdmVyZWQgYnkgaXRzIG90aGVyIGludGVncmF0aW9uIHRlc3RzLCBub3QgYnkgdGhlIGRlbW8gdmF1bHQ7IHRoZVxuICogdmF1bHQgaXMgYSBsZWFybmluZyByZXNvdXJjZSwgYW5kIHRoZXNlIGNoZWNrcyBvbmx5IGd1YXJkIHRoYXQgaXQgc3RheXMgdHJ1dGhmdWwuXG4gKlxuICogVGhleSBhbHNvIGd1YXJkIHRoZSB2YXVsdCdzIG93biBgLm9ic2lkaWFuL2FwcC5qc29uYDogdGhlIHNldHRpbmdzIGxpc3RlZCBpblxuICoge0BsaW5rIERFTU9fVkFVTFRfQVBQX0pTT05fU0VUVElOR1N9IGJlbG9uZyB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYCwgd2hpY2ggd3JpdGVzIHRoZW0gaW50byB0aGUgYXJjaGl2ZWRcbiAqIHZhdWx0IGF0IHJlbGVhc2UgdGltZSwgc28gYSB2YXVsdCB0aGF0IGNvbW1pdHMgYW55IG9mIHRoZW0gaXMga2VlcGluZyBhIHNlY29uZCBjb3B5IG5vdGhpbmcgcmVjb25jaWxlcy5cbiAqXG4gKiBUaGV5IGFsc28gZW5mb3JjZSB0aGUgZGVtby12YXVsdCBBVVRIT1JJTkcgY29udmVudGlvbiDigJQgZXZlcnkgbm90ZSBvcGVucyB3aXRoIGFuIGAjIEgxYCBhbmQgYSBwbGFpblxuICogcHJvc2UgcGFyYWdyYXBoLCBldmVyeSBub3RlIGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBzdGFydCBub3RlLCBhbmQgbm8gbm90ZSB1c2VzIGEgYFtbd2lraWxpbmtdXWAgb3IgYVxuICogYFtEb2NzXSjigKYpYCBsaW5lLiBUaGVzZSBjaGVja3MgYXJlIHVuY29uZGl0aW9uYWw6IHRoZSBkZW1vIHZhdWx0IGlzIHRoZSBwdWJsaXNoZWQgZG9jdW1lbnRhdGlvbiwgcmVhZFxuICogaW4gT2JzaWRpYW4gQU5EIG9uIEdpdEh1YiAod2hlcmUgYSB3aWtpbGluayBkb2VzIG5vdCByZW5kZXIpLCBzbyBhIG5vdGUgdGhhdCBicmVha3MgdGhlIGNvbnZlbnRpb24gaXNcbiAqIGJyb2tlbiBmb3IgcmVhbCByZWFkZXJzLiBgYXV0aG9yaW5nYCBvbmx5IHR1bmVzIHRoZW0gKHdoaWNoIG5vdGUgaXMgdGhlIHN0YXJ0LCB3aGljaCBub3RlcyBzaXQgb3V0c2lkZVxuICogdGhlIGxlYXJuaW5nIHBhdGgpOyBpdCBjYW5ub3Qgc3dpdGNoIHRoZW0gb2ZmLlxuICpcbiAqIE9ubHkgYHJvb3RGb2xkZXJgIGlzIHJlcXVpcmVkLCBzbyBhIHBsdWdpbiB3aXRoIG5vIHNldHRpbmdzIGFuZCBubyBwdWJsaWMgQVBJIHRvIHJlZmxlY3QgcmVnaXN0ZXJzIHRoZVxuICogc3VpdGUgd2l0aCB0aGF0IGFsb25lIGFuZCBzdGlsbCBnZXRzIGV2ZXJ5IGF1dGhvcmluZyBjaGVjayDigJQgdGhlIGNoZWNrcyBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCB3aGF0IHRoZVxuICogcGx1Z2luIGV4cG9zZXMuIEVhY2ggcmVmbGVjdGlvbiBzcGVjIChgY29uZmlnSW50ZXJmYWNlc2AsIGBpbnRlcmZhY2VzYCwgYG5vblRyaXZpYWxHdWFyZGApIGFkZHMgdGhlIGNoZWNrc1xuICogaXQgZGVzY3JpYmVzIHdoZW4gc3VwcGxpZWQuIFRoZSB2YXVsdCBpcyBndWFyZGVkIGFnYWluc3QgYmVpbmcgZW1wdHkgZWl0aGVyIHdheTogd2l0aCBubyBub3RlcyB0byByZWFkLFxuICogZXZlcnkgYXV0aG9yaW5nIGNoZWNrIHdvdWxkIHBhc3MgYnkgaGF2aW5nIG5vdGhpbmcgdG8gbG9vayBhdC5cbiAqXG4gKiBUaGUgb25lIGV4Y2VwdGlvbiBpcyBhIG5vdGUgd2hvc2UgU1VCSkVDVCBpcyB0aGUgd2lraWxpbmsg4oCUIGFuIGVtYmVkIHNwZWxsaW5nIHRoZSByZWFkZXIgaXMgYmVpbmcgdGF1Z2h0XG4gKiB0byB0eXBlLCBhIGZyb250bWF0dGVyIHByb3BlcnR5IHZhbHVlIHRoYXQgZXhpc3RzIHRvIGNvbnRyYXN0IHdpdGggYSBNYXJrZG93biBsaW5rLCBhIGZpeHR1cmUgdGhhdCBtdXN0XG4gKiBrZWVwIHRoZSB3aWtpbGluayBhIGNvbW1hbmQgaXMgc3VwcG9zZWQgdG8gbGVhdmUgYWxvbmUsIGEgbGluayB0aGUgcmVhZGVyIGNsaWNrcyB3aGlsZSBpdCBzdGlsbCByZXNvbHZlc1xuICogdG8gbm90aGluZy4gU3VjaCBhIG5vdGUgc2F5cyBzbyBpdHNlbGYsIHN0YXRpbmcgd2h5LCBpbiBvbmUgb2YgdHdvIGZvcm1zIG1vZGVsbGVkIG9uIEVTTGludCdzLlxuICpcbiAqIFBlciBsaW5lIG9yIHBlciByZWdpb24sIHdyaXR0ZW4gYXMgYW4gSFRNTCBjb21tZW50IHNvIGl0IGlzIGludmlzaWJsZSBpbiBPYnNpZGlhbiBBTkQgb24gR2l0SHViIOKAlCB0aGVcbiAqIHNwZWxsaW5nIHRoZXNlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWA6XG4gKlxuICogYGBgbWFya2Rvd25cbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUtbmV4dC1saW5lIGRlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MgLS0gQ2xpY2tpbmcgYSBsaW5rIHRvIGEgbm90ZSB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCBJUyB0aGUgZmVhdHVyZS4gLS0+XG4gKiAyLiBDbGljayB0aGlzIGxpbms6IFtbUHJvamVjdHMvRnJlc2ggaWRlYV1dLlxuICpcbiAqIDwhLS0gb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLSBUaGUgd2lraWxpbmsgZW1iZWQgaXMgdGhlIHN5bnRheCB0aGlzIG5vdGUgdGVhY2hlcy4gLS0+XG4gKiAhW1tiYXNpYy5odG1sfDQwMF1dXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1lbmFibGUgZGVtby12YXVsdC12YWxpZGF0aW9uL25vLXdpa2lsaW5rcyAtLT5cbiAqIGBgYFxuICpcbiAqIFBlciBub3RlLCBpbiB0aGUgbm90ZSdzIG93biBmcm9udG1hdHRlciDigJQgdGhlIG9ubHkgZm9ybSB0aGF0IGNhbiByZWFjaCBhIHdpa2lsaW5rIElOU0lERSBmcm9udG1hdHRlcixcbiAqIHdoZXJlIGEgY29tbWVudCBjYW5ub3QgZ286XG4gKlxuICogYGBgeWFtbFxuICogLS0tXG4gKiBvYnNpZGlhbi1kZXYtdXRpbHM6XG4gKiAgIGRlbW8tdmF1bHQtdmFsaWRhdGlvbjpcbiAqICAgICBhbGxvdy13aWtpbGlua3M6IFRoZSBgd2lraWxpbmtgIHByb3BlcnR5IHZhbHVlIGlzIHRoZSBjb250cmFzdCB0aGlzIG5vdGUgaXMgYnVpbHQgYXJvdW5kLlxuICogLS0tXG4gKiBgYGBcbiAqXG4gKiBFaXRoZXIgd2F5IHRoZSBkZWNsYXJhdGlvbiB0cmF2ZWxzIHdpdGggdGhlIG5vdGUgcmF0aGVyIHRoYW4gc2l0dGluZyBpbiBhIGxpc3Qgc29tZXdoZXJlIGVsc2UsIGl0IGNhcnJpZXNcbiAqIGl0cyBqdXN0aWZpY2F0aW9uLCBhbmQgaXQgZXhlbXB0cyBvbmx5IHRoZSBXSUtJTElOSyBjaGVjayDigJQgdGhlIEgxLCBwcm9zZSwgcmVhY2hhYmlsaXR5IGFuZCBgW0RvY3NdYFxuICogY2hlY2tzIHN0aWxsIGFwcGx5LiBBIGRlY2xhcmF0aW9uIHdpdGggbm8gcmVhc29uLCBvbmUgY292ZXJpbmcgbm8gd2lraWxpbmssIGEgcmVnaW9uIG5ldmVyIGVuYWJsZWQgYWdhaW4sXG4gKiBvciBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlIGFsbCBmYWlsOiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCB0aGF0IG5vdGhpbmcgbmVlZHMgYW55IG1vcmUsIG9yIHRoYXRcbiAqIHNpbGVudGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vIGV4ZW1wdGlvbiBhdCBhbGwuXG4gKlxuICogVGhleSBhbHNvIGNoZWNrIHRoYXQgZXZlcnkgYFRyeSBpdGAgc2VjdGlvbiDigJQgYSBoZWFkaW5nIG9mIGFueSBsZXZlbCBzdGFydGluZyBgVHJ5IGl0YCwgdXAgdG8gdGhlIG5leHRcbiAqIGhlYWRpbmcgb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWwg4oCUIGhvbGRzIGEgYGNvZGUtYnV0dG9uYCB0aGF0IHBlcmZvcm1zIGl0cyBzZXR1cCwgYmVjYXVzZSBhIHJlYWRlclxuICogYXNrZWQgdG8gY29uZmlndXJlIHRoaW5ncyBieSBoYW5kIGlzIGEgcmVhZGVyIHRoZSBkZW1vIGxvc3QuIEEgc2VjdGlvbiB3aG9zZSBzdGVwcyByZWFsbHkgY2Fubm90IGJlXG4gKiBzY3JpcHRlZCBzYXlzIHNvIHdpdGggdGhlIHNhbWUgZGlyZWN0aXZlLCBuYW1pbmcgdGhlIGBkZW1vLXZhdWx0LXZhbGlkYXRpb24vdHJ5LWl0LWNvZGUtYnV0dG9uYCBydWxlIG9uXG4gKiB0aGUgaGVhZGluZywgYW5kIHdpdGggdGhlIHNhbWUgY2hlY2tzIG9uIHRoZSBkaXJlY3RpdmUgaXRzZWxmOlxuICpcbiAqIGBgYG1hcmtkb3duXG4gKiA8IS0tIG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxlLW5leHQtbGluZSBkZW1vLXZhdWx0LXZhbGlkYXRpb24vdHJ5LWl0LWNvZGUtYnV0dG9uIC0tIERyYWdnaW5nIGEgZmlsZSBpbiBmcm9tIG91dHNpZGUgT2JzaWRpYW4gY2Fubm90IGJlIHNjcmlwdGVkLiAtLT5cbiAqICMjIFRyeSBpdFxuICogYGBgXG4gKlxuICogVGhhdCBjaGVjayBmYWlscyB0aGUgc3VpdGUgYnkgZGVmYXVsdDsge0BsaW5rIERlbW9WYXVsdEF1dGhvcmluZ1NwZWMudHJ5SXRDb2RlQnV0dG9uc30gc2V0IHRvIGAnd2FybidgXG4gKiBwcmludHMgdGhlIHNlY3Rpb25zIGluc3RlYWQsIGZvciBhIHZhdWx0IHN0aWxsIGJlaW5nIGJyb3VnaHQgdXAgdG8gaXQuXG4gKlxuICogVHdvIGxheWVycyBhcmUgZXhwb3NlZDpcbiAqIC0ge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcn0g4oCUIGEgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgdGhhdCByZWFkcyB0aGUgY29ycHVzLCBwYXJzZXMgaW50ZXJmYWNlIC9cbiAqICAgY2xhc3MgLyBlbnVtIG1lbWJlcnMgYW5kIGV4cG9ydGVkIGZ1bmN0aW9ucywgYW5kIHJldHVybnMgZGlhZ25vc3RpYyBhcnJheXMgKHdoYXQgaXMgdW5kZW1vbnN0cmF0ZWQgLyBzdGFsZVxuICogICAvIHVubGlua2VkIC8gb2ZmLWNvbnZlbnRpb24pLlxuICogLSB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlfSDigJQgYSB0aGluIHdyYXBwZXIgdGhhdCByZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSBvdmVyIHRoZSBjb3JlLCBzb1xuICogICBhIHBsdWdpbidzIGBkZW1vLXZhdWx0Lm5vLWFwcC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCBpcyBhIHNpbmdsZSBkZWNsYXJhdGl2ZSBjYWxsLlxuICovXG5cbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBkZXNjcmliZSxcbiAgZXhwZWN0LFxuICBpdFxufSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQge1xuICBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3MsXG4gIHBhcnNlRGVtb1ZhdWx0QXBwSnNvblxufSBmcm9tICcuL2RlbW8tdmF1bHQtYXBwLWpzb24udHMnO1xuaW1wb3J0IHsgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcblxuLyoqXG4gKiBUdW5lcyB0aGUgYWx3YXlzLW9uIGF1dGhvcmluZyBjaGVja3MuIEl0IGNhbm5vdCBkaXNhYmxlIHRoZW0g4oCUIHNlZSB0aGUgZmlsZSBvdmVydmlldy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRBdXRob3JpbmdTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBub3RlcyAocGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoYXQgc2l0IG91dHNpZGUgdGhlIGxlYXJuaW5nIHBhdGggYW5kIGFyZSB0aGVyZWZvcmVcbiAgICogZXhlbXB0IGZyb20gZXZlcnkgYXV0aG9yaW5nIGNoZWNrLiBEZWZhdWx0cyB0byB0aGUgdmF1bHQncyBvd24gYFJFQURNRS5tZGAsIHdoaWNoIGFkZHJlc3NlcyBzb21lb25lXG4gICAqIGJyb3dzaW5nIHRoZSByZXBvIG9uIEdpdEh1YiByYXRoZXIgdGhhbiBhIHJlYWRlciB3b3JraW5nIHRocm91Z2ggdGhlIHZhdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgZXZlcnkgb3RoZXIgbm90ZSBtdXN0IGJlIHJlYWNoYWJsZSBmcm9tLiBEZWZhdWx0cyB0b1xuICAgKiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnROb3RlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgYSBgVHJ5IGl0YCBzZWN0aW9uIHdpdGggbm8gYGNvZGUtYnV0dG9uYCBhbmQgbm8gZGlyZWN0aXZlIGV4cGxhaW5pbmcgd2h5IGlzIHJlcG9ydGVkOiBgJ3dhcm4nYFxuICAgKiBwcmludHMgdGhlIHNlY3Rpb25zIGFuZCBwYXNzZXMsIGAnZXJyb3InYCBmYWlscyB0aGUgc3VpdGUuIERlZmF1bHRzIHRvIGAnZXJyb3InYC5cbiAgICovXG4gIHJlYWRvbmx5IHRyeUl0Q29kZUJ1dHRvbnM/OiBEZW1vVmF1bHRDaGVja1NldmVyaXR5O1xufVxuXG4vKipcbiAqIEhvdyBhIGNoZWNrIHRoYXQgaXMgYmVpbmcgaW50cm9kdWNlZCBncmFkdWFsbHkgcmVwb3J0cyB3aGF0IGl0IGZpbmRzOiBgJ3dhcm4nYCBwcmludHMgaXQgYW5kIHBhc3NlcyxcbiAqIGAnZXJyb3InYCBmYWlscy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVtb1ZhdWx0Q2hlY2tTZXZlcml0eSA9ICdlcnJvcicgfCAnd2Fybic7XG5cbi8qKlxuICogUmVmbGVjdHMgYSBjb25maWcgaW50ZXJmYWNlIHdob3NlIG9wdGlvbnMgYXJlIGRlbW9uc3RyYXRlZCBieSB0aGVpciBiYXJlIG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q29uZmlnSW50ZXJmYWNlQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHdob3NlIHByb3BlcnRpZXMgYXJlIHRoZSBjb25maWdcbiAgICogb3B0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZXMgKHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0KSBleGVtcHQgZnJvbSB0aGUgYXV0aG9yaW5nIGNoZWNrcy4gRGVmYXVsdHMgdG8gdGhlXG4gICAqIHZhdWx0J3Mgb3duIGBSRUFETUUubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcGx1Z2luIHJlcG8gcm9vdCDigJQgdGhlIGZvbGRlciBjb250YWluaW5nIGBkZW1vLXZhdWx0L2AgYW5kIHRoZSBzb3VyY2UgYmVpbmdcbiAgICogcmVmbGVjdGVkLiBDYWxsZXJzIHR5cGljYWxseSBwYXNzIGBnZXRSb290Rm9sZGVyKCkgPz8gcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICByZWFkb25seSByb290Rm9sZGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFN0YWxlUmVmZXJlbmNlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFN0YWxlUmVmZXJlbmNlc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcmVjZWl2ZXIgd2hvc2UgYGAgYCR7cmVjZWl2ZXJ9LjxtZW1iZXI+YCBgYCByZWZlcmVuY2VzIGFyZSBzY2FubmVkIGZvciBpbiB0aGUgZGVtbyBjb3JwdXMuXG4gICAqL1xuICByZWFkb25seSByZWNlaXZlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbWVtYmVycyB0aGF0IGN1cnJlbnRseSBleGlzdCBvbiB0aGUgcmVjZWl2ZXI7IGFueSByZWZlcmVuY2VkIG1lbWJlciBub3QgaW4gdGhpcyBzZXQgaXMgc3RhbGUuXG4gICAqL1xuICByZWFkb25seSB2YWxpZE1lbWJlcnM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciB7QGxpbmsgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG1lbWJlciBuYW1lcyB0aGF0IG11c3QgZWFjaCBhcHBlYXIgaW4gdGhlIGRlbW8gY29ycHVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVtYmVyczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBhIG1lbWJlciBpcyBkZW1vbnN0cmF0ZWQgb25seSBpZiBgYCBgJHtyZWNlaXZlcn0uJHttZW1iZXJ9YCBgYCBhcHBlYXJzIChlLmcuIGEgY29udGV4dCBvYmplY3Qnc1xuICAgKiBtZXRob2RzKTsgd2hlbiBhYnNlbnQsIHRoZSBiYXJlIG1lbWJlciBuYW1lIGlzIGxvb2tlZCB1cCAoZS5nLiBhIGNvbmZpZyBvcHRpb24pLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVjZWl2ZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZmluZFVubGlua2VkRmVhdHVyZURvY3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbmxpbmtlZEZlYXR1cmVEb2NzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkb2NzIGZvbGRlciAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgdG9wLWxldmVsIGAqLm1kYCBmaWxlcyBhcmUgdGhlIGZlYXR1cmUgZG9jcy5cbiAgICovXG4gIHJlYWRvbmx5IGRvY3NGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRvYyBiYXNlbmFtZXMgKHdpdGhvdXQgYC5tZGApIHRoYXQgYXJlIE5PVCBwZXItZmVhdHVyZSBwYWdlcyBhbmQgc28gbmVlZCBubyBsaW5raW5nIGRlbW8gbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vbkZlYXR1cmVEb2NzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5maW5kVW5yZWFjaGFibGVOb3Rlc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVucmVhY2hhYmxlTm90ZXNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5vdGUgKHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQpIHRoZSB3YWxrIHN0YXJ0cyBmcm9tLCBlLmcuIGAwMCBTdGFydC5tZGAuXG4gICAqL1xuICByZWFkb25seSBzdGFydE5vdGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlci5nZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckdldEV4cG9ydGVkRnVuY3Rpb25OYW1lc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZpbGUgcGF0aCAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgYGV4cG9ydCBmdW5jdGlvbmBzIGFyZSBwYXJzZWQuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIuZ2V0SW50ZXJmYWNlTWVtYmVyc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyR2V0SW50ZXJmYWNlTWVtYmVyc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYGV4cG9ydCBpbnRlcmZhY2VgLCBgZXhwb3J0IGNsYXNzYCwgb3IgYGV4cG9ydCBlbnVtYCB0byBwYXJzZS5cbiAgICovXG4gIHJlYWRvbmx5IGludGVyZmFjZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHRoYXQgZGVjbGFyZXMgdGhlIGludGVyZmFjZSwgY2xhc3MsIG9yIGVudW0uXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyB0aGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHREb2NzQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBkb2NzIGZvbGRlciAocmVsYXRpdmUgdG8gdGhlIHJlcG8gcm9vdCkgd2hvc2UgdG9wLWxldmVsIGAqLm1kYCBmaWxlcyBhcmUgdGhlIGZlYXR1cmUgZG9jcy5cbiAgICovXG4gIHJlYWRvbmx5IGZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgdGhhdCBhcmUgTk9UIHBlci1mZWF0dXJlIHBhZ2VzIGFuZCBzbyBuZWVkIG5vIGxpbmtpbmcgZGVtbyBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uRmVhdHVyZURvY3M6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgbW9kdWxlJ3MgZXhwb3J0ZWQgZnVuY3Rpb25zLCBlYWNoIGRlbW9uc3RyYXRlZCBieSBpdHMgYmFyZSBuYW1lIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRGdW5jdGlvbnNDb3ZlcmFnZVNwZWMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSBmaWxlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QpIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlZmxlY3RzIGEgc2luZ2xlIGludGVyZmFjZSdzIG1lbWJlcnMgYW5kIGRlbW9uc3RyYXRlcyB0aGVtIHZpYSBgYCBgJHtyZWNlaXZlcn0uPG1lbWJlcj5gIGBgIHJlZmVyZW5jZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0SW50ZXJmYWNlQ292ZXJhZ2VTcGVjIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIHRvIHJlZmxlY3QuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGRlbW9uc3RyYXRlZCBtZW1iZXJzIGFyZSB0aGUgcmVmbGVjdGVkIHR5cGUncyBtZXRob2RzIG9yIGl0cyBwcm9wZXJ0aWVzIChlbnVtIG1lbWJlcnMgY291bnQgYXNcbiAgICogcHJvcGVydGllcykuXG4gICAqL1xuICByZWFkb25seSBraW5kOiBEZW1vVmF1bHRJbnRlcmZhY2VNZW1iZXJLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciB0aGUgbm90ZXMgY2FsbCB0aGUgbWVtYmVycyBvbiAoZS5nLiBgY29kZUJ1dHRvbkNvbnRleHRgKS5cbiAgICovXG4gIHJlYWRvbmx5IHJlY2VpdmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gaW50ZXJmYWNlJ3MgZGVtb25zdHJhdGVkIG1lbWJlcnMgYXJlIGl0cyBtZXRob2RzIG9yIGl0cyBwcm9wZXJ0aWVzLlxuICovXG5leHBvcnQgdHlwZSBEZW1vVmF1bHRJbnRlcmZhY2VNZW1iZXJLaW5kID0gJ21ldGhvZHMnIHwgJ3Byb3BlcnRpZXMnO1xuXG4vKipcbiAqIENvbmZpZ3VyZXMgdGhlIGd1YXJkIHRoYXQgdGhlIHJlZmxlY3RlZCBzdXJmYWNlIGlzIG5vbi10cml2aWFsIChwcm90ZWN0cyBhZ2FpbnN0IGEgcGFyc2luZyByZWdyZXNzaW9uXG4gKiBzaWxlbnRseSBlbXB0eWluZyBldmVyeSBvdGhlciBjaGVjaykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYyB7XG4gIC8qKlxuICAgKiBBIGRlbW8gbm90ZSAocGF0aCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCkgdGhhdCBtdXN0IGJlIHByZXNlbnQuXG4gICAqL1xuICByZWFkb25seSBleHBlY3REZW1vTm90ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIG1lbWJlciB0aGF0IG11c3QgYmUgcmVmbGVjdGVkIGZyb20ge0BsaW5rIERlbW9WYXVsdE5vblRyaXZpYWxHdWFyZFNwZWMuaW50ZXJmYWNlTmFtZX0uXG4gICAqL1xuICByZWFkb25seSBleHBlY3RNZW1iZXI6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGBleHBvcnQgaW50ZXJmYWNlYCwgYGV4cG9ydCBjbGFzc2AsIG9yIGBleHBvcnQgZW51bWAgd2hvc2UgbWVtYmVycyBhcmUgcmUtcGFyc2VkIGZvciB0aGVcbiAgICogZ3VhcmQuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZSBwYXRoIChyZWxhdGl2ZSB0byB0aGUgcmVwbyByb290KSB0aGF0IGRlY2xhcmVzIHRoZSBpbnRlcmZhY2UsIGNsYXNzLCBvciBlbnVtLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGRlbW8gbm90ZSwgYXMgcmVhZCBmcm9tIHRoZSBkZW1vIHZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlbW9WYXVsdE5vdGUge1xuICAvKipcbiAgICogVGhlIG5vdGUncyByYXcgTWFya2Rvd24gY29udGVudC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGUncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IGZvbGRlciwgZS5nLiBgMDAgU3RhcnQubWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogV2hhdCBhIG5vdGUncyBpbmxpbmUgYG9ic2lkaWFuLWRldi11dGlscy1kaXNhYmxl4oCmYCBkaXJlY3RpdmVzIGFsbG93LCBydWxlIGJ5IHJ1bGUsIGFuZCB3aGF0IGlzIHdyb25nIHdpdGhcbiAqIHRoZW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0aXZlU2NhbiB7XG4gIC8qKlxuICAgKiBGb3IgZWFjaCBydWxlLCB0aGUgemVyby1iYXNlZCBsaW5lIG51bWJlcnMgYSBkaXJlY3RpdmUgZXhlbXB0cyBmcm9tIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZExpbmVJbmRleGVzQnlSdWxlOiBSZWFkb25seU1hcDxzdHJpbmcsIFJlYWRvbmx5U2V0PG51bWJlcj4+O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlyZWN0aXZlIG1pc3Rha2VzIGZvdW5kLCBlYWNoIHBocmFzZWQgZm9yIGEgZmFpbGluZyBhc3NlcnRpb24uXG4gICAqL1xuICByZWFkb25seSBwcm9ibGVtczogc3RyaW5nW107XG59XG5cbi8qKlxuICogVGhlIHJ1bm5pbmcgc3RhdGUgb2YgYSBkaXJlY3RpdmUgc2NhbiwgdGhyZWFkZWQgdGhyb3VnaCB0aGUgcGVyLWxpbmUgaGVscGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXJlY3RpdmVTY2FuU3RhdGUge1xuICAvKipcbiAgICogRm9yIGVhY2ggcnVsZSwgdGhlIGxpbmVzIGEgZGlyZWN0aXZlIGhhcyBleGVtcHRlZCBmcm9tIGl0IHNvIGZhci5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRMaW5lSW5kZXhlc0J5UnVsZTogTWFwPHN0cmluZywgU2V0PG51bWJlcj4+O1xuXG4gIC8qKlxuICAgKiBGb3IgZWFjaCBydWxlLCB0aGUgcmVnaW9uIGN1cnJlbnRseSBvcGVuLCBhbmQgd2hldGhlciBpdCBoYXMgY292ZXJlZCBhIHRhcmdldCB5ZXQuXG4gICAqL1xuICByZWFkb25seSBvcGVuUmVnaW9uc0J5UnVsZTogTWFwPHN0cmluZywgT3BlbkRpcmVjdGl2ZVJlZ2lvbj47XG5cbiAgLyoqXG4gICAqIEZvciBlYWNoIHJ1bGUsIHRoZSBsaW5lIGEgYGRpc2FibGUtbmV4dC1saW5lYCB3YXMgcmVhZCBvbiwgd2hpbGUgaXQgc3RpbGwgd2FpdHMgZm9yIHRoZSBsaW5lIGl0IGNvdmVycy5cbiAgICovXG4gIHJlYWRvbmx5IHBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGU6IE1hcDxzdHJpbmcsIG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RpdmUgbWlzdGFrZXMgZm91bmQgc28gZmFyLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvYmxlbXM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBGb3IgZWFjaCBydWxlLCB0aGUgbGluZXMgb2YgdGhlIG5vdGUgdGhhdCBicmVhayBpdCDigJQgdGhlIGxpbmVzIGEgZGlyZWN0aXZlIGZvciBpdCBoYXMgdG8gY292ZXIgdG8gYmVcbiAgICogZG9pbmcgYW55IHdvcmsuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRMaW5lSW5kZXhlc0J5UnVsZTogUmVhZG9ubHlNYXA8c3RyaW5nLCBSZWFkb25seVNldDxudW1iZXI+Pjtcbn1cblxuLyoqXG4gKiBUaGUgcGFyc2VkIG1lbWJlcnMgb2YgYSBzb3VyY2UgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgLyoqXG4gICAqIEV2ZXJ5IG1lbWJlciDigJQge0BsaW5rIEludGVyZmFjZU1lbWJlcnMubWV0aG9kc30gZm9sbG93ZWQgYnkge0BsaW5rIEludGVyZmFjZU1lbWJlcnMucHJvcGVydGllc30uXG4gICAqL1xuICByZWFkb25seSBhbGw6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIG1lbWJlcnMgKGRlY2xhcmVkIGFzIGBuYW1lKC4uLilgKS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZHM6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgbWVtYmVycyAoZGVjbGFyZWQgYXMgYG5hbWU/OiAuLi5gKS5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnRpZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgbm90ZSBsaW5lIHBhaXJlZCB3aXRoIHRoZSBsaW5lIG51bWJlciBpdCBjYW1lIGZyb20sIHNvIGEgY2hlY2sgdGhhdCBza2lwcyBmZW5jZWQgYmxvY2tzIGNhbiBzdGlsbFxuICogcmVwb3J0IOKAlCBhbmQgYW4gaW5saW5lIGRpcmVjdGl2ZSBjYW4gc3RpbGwgbmFtZSDigJQgdGhlIGxpbmUgYXMgdGhlIHJlYWRlciBzZWVzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGVMaW5lIHtcbiAgLyoqXG4gICAqIFRoZSB6ZXJvLWJhc2VkIGxpbmUgbnVtYmVyIHdpdGhpbiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lJ3MgcmF3IHRleHQuXG4gICAqL1xuICByZWFkb25seSBsaW5lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBgZGlzYWJsZWAgcmVnaW9uIHRoYXQgaGFzIGJlZW4gb3BlbmVkIGFuZCBub3QgeWV0IGVuYWJsZWQgYWdhaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkRpcmVjdGl2ZVJlZ2lvbiB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSByZWdpb24gaGFzIGNvdmVyZWQgYSBsaW5lIGJyZWFraW5nIGl0cyBydWxlLCB3aGljaCBpcyB3aGF0IHN0b3BzIGl0IGJlaW5nIHJlcG9ydGVkIGFzXG4gICAqIHBvaW50bGVzcy5cbiAgICovXG4gIGlzVXNlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxpbmUgdGhlIHJlZ2lvbiB3YXMgb3BlbmVkIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluZUluZGV4OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBgZGlzYWJsZWAgcmVnaW9uIHRoYXQgaGFzIGJlZW4gb3BlbmVkIGFuZCBub3QgeWV0IGVuYWJsZWQgYWdhaW4uXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBPcGVuRGlyZWN0aXZlUmVnaW9ufTogdGhlIGRpcmVjdGl2ZXMgbm93IHNlcnZlIG1vcmUgdGhhbiB0aGUgd2lraWxpbmsgcnVsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuV2lraWxpbmtEaXJlY3RpdmVSZWdpb24ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcmVnaW9uIGhhcyBjb3ZlcmVkIGEgd2lraWxpbmssIHdoaWNoIGlzIHdoYXQgc3RvcHMgaXQgYmVpbmcgcmVwb3J0ZWQgYXMgcG9pbnRsZXNzLlxuICAgKi9cbiAgaXNVc2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSB0aGUgcmVnaW9uIHdhcyBvcGVuZWQgb24uXG4gICAqL1xuICByZWFkb25seSBsaW5lSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJEZW1vVmF1bHRDb3ZlcmFnZVN1aXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFR1bmVzIHRoZSBhbHdheXMtb24gYXV0aG9yaW5nIGNoZWNrcywgb3IgYHVuZGVmaW5lZGAgdG8gdGFrZSB0aGVpciBkZWZhdWx0cy4gSXQgY2Fubm90IGRpc2FibGUgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGF1dGhvcmluZz86IERlbW9WYXVsdEF1dGhvcmluZ1NwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25maWcgaW50ZXJmYWNlcyB3aG9zZSBvcHRpb25zIG11c3QgZWFjaCBiZSBkZW1vbnN0cmF0ZWQgYnkgdGhlaXIgYmFyZSBuYW1lLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZVxuICAgKiBwbHVnaW4gaGFzIG5vIHNldHRpbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnSW50ZXJmYWNlcz86IERlbW9WYXVsdENvbmZpZ0ludGVyZmFjZUNvdmVyYWdlU3BlY1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZmVhdHVyZS1kb2MgbGlua2luZyBjaGVjaywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcGx1Z2luIHNoaXBzIG5vIGBkb2NzL2AgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZG9jcz86IERlbW9WYXVsdERvY3NDb3ZlcmFnZVNwZWM7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2R1bGVzIHdob3NlIGBleHBvcnQgZnVuY3Rpb25gcyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIGJ5IHRoZWlyIGJhcmUgbmFtZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAgICogcGx1Z2luIGV4cG9zZXMgbm8gc3VjaCBtb2R1bGUgdG8gY2hlY2suXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk1vZHVsZXM/OiBEZW1vVmF1bHRGdW5jdGlvbnNDb3ZlcmFnZVNwZWNbXTtcblxuICAvKipcbiAgICogVGhlIGludGVyZmFjZXMgd2hvc2UgbWVtYmVycyBtdXN0IGVhY2ggYmUgZGVtb25zdHJhdGVkIChhbmQgcmVmZXJlbmNlZCB3aXRob3V0IGRyaWZ0KSwgb3IgYHVuZGVmaW5lZGAgd2hlblxuICAgKiB0aGUgcGx1Z2luIGV4cG9zZXMgbm8gcHVibGljIEFQSSBzdXJmYWNlIHRvIHJlZmxlY3QuXG4gICAqL1xuICByZWFkb25seSBpbnRlcmZhY2VzPzogRGVtb1ZhdWx0SW50ZXJmYWNlQ292ZXJhZ2VTcGVjW107XG5cbiAgLyoqXG4gICAqIFRoZSBndWFyZCB0aGF0IGtlZXBzIHRoZSByZWZsZWN0ZWQgc3VyZmFjZSBub24tdHJpdmlhbCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBubyByZWZsZWN0ZWQgc3VyZmFjZVxuICAgKiB0byBndWFyZC4gVGhlIHZhdWx0IGlzIGNoZWNrZWQgZm9yIGJlaW5nIG5vbi1lbXB0eSBlaXRoZXIgd2F5LlxuICAgKi9cbiAgcmVhZG9ubHkgbm9uVHJpdmlhbEd1YXJkPzogRGVtb1ZhdWx0Tm9uVHJpdmlhbEd1YXJkU3BlYztcblxuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHBsdWdpbiByZXBvIHJvb3QuIENhbGxlcnMgdHlwaWNhbGx5IHBhc3MgYGdldFJvb3RGb2xkZXIoKSA/PyBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGEgbm90ZSdzIGlubGluZSBgb2JzaWRpYW4tZGV2LXV0aWxzLWRpc2FibGXigKZgIGRpcmVjdGl2ZXMgYWxsb3csIGFuZCB3aGF0IGlzIHdyb25nIHdpdGggdGhlbS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIERpcmVjdGl2ZVNjYW59OiB0aGUgZGlyZWN0aXZlcyBub3cgc2VydmUgbW9yZSB0aGFuIHRoZSB3aWtpbGluayBydWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdpa2lsaW5rRGlyZWN0aXZlU2NhbiB7XG4gIC8qKlxuICAgKiBUaGUgemVyby1iYXNlZCBsaW5lIG51bWJlcnMgYSBkaXJlY3RpdmUgYWxsb3dzIGEgd2lraWxpbmsgb24uXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGluZUluZGV4ZXM6IFJlYWRvbmx5U2V0PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIFRoZSBkaXJlY3RpdmUgbWlzdGFrZXMgZm91bmQsIGVhY2ggcGhyYXNlZCBmb3IgYSBmYWlsaW5nIGFzc2VydGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHByb2JsZW1zOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBUaGUgcnVubmluZyBzdGF0ZSBvZiBhIGRpcmVjdGl2ZSBzY2FuLCB0aHJlYWRlZCB0aHJvdWdoIHRoZSBwZXItbGluZSBoZWxwZXJzLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgRGlyZWN0aXZlU2NhblN0YXRlfTogdGhlIGRpcmVjdGl2ZXMgbm93IHNlcnZlIG1vcmUgdGhhbiB0aGUgd2lraWxpbmsgcnVsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaWtpbGlua0RpcmVjdGl2ZVNjYW5TdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgbGluZXMgYSBkaXJlY3RpdmUgaGFzIGFsbG93ZWQgYSB3aWtpbGluayBvbiBzbyBmYXIuXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkTGluZUluZGV4ZXM6IFNldDxudW1iZXI+O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIGN1cnJlbnRseSBvcGVuLCBhbmQgd2hldGhlciBpdCBoYXMgY292ZXJlZCBhIHdpa2lsaW5rIHlldC5cbiAgICovXG4gIG9wZW5SZWdpb246IG51bGwgfCBPcGVuRGlyZWN0aXZlUmVnaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgbGluZSBhIGBkaXNhYmxlLW5leHQtbGluZWAgd2FzIHJlYWQgb24sIHdoaWxlIGl0IHN0aWxsIHdhaXRzIGZvciB0aGUgbGluZSBpdCBjb3ZlcnMuXG4gICAqL1xuICBwZW5kaW5nTmV4dExpbmVJbmRleDogbnVsbCB8IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRpcmVjdGl2ZSBtaXN0YWtlcyBmb3VuZCBzbyBmYXIuXG4gICAqL1xuICByZWFkb25seSBwcm9ibGVtczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBsaW5lcyBvZiB0aGUgbm90ZSB0aGF0IGNhcnJ5IGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSB3aWtpbGlua0xpbmVJbmRleGVzOiBSZWFkb25seVNldDxudW1iZXI+O1xufVxuXG4vKipcbiAqIEEgYFRyeSBpdGAgc2VjdGlvbiBiZWluZyByZWFkLCBmcm9tIGl0cyBoZWFkaW5nIHRvIHRoZSBuZXh0IGhlYWRpbmcgb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWwuXG4gKi9cbmludGVyZmFjZSBUcnlJdFNlY3Rpb24ge1xuICBoYXNDb2RlQnV0dG9uOiBib29sZWFuO1xuICByZWFkb25seSBsZXZlbDogbnVtYmVyO1xuICByZWFkb25seSBsaW5lSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZWZsZWN0cyBhIHBsdWdpbidzIHB1YmxpYyBzdXJmYWNlIGZyb20gc291cmNlIGFuZCBjaGVja3MgaXRzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCBzdGF5cyBpbiBzeW5jIHdpdGggaXQuXG4gKlxuICogRXZlcnkgbWV0aG9kIGlzIGEgcHVyZSBxdWVyeSBvdmVyIGZpbGVzIHVuZGVyIHRoZSByZXBvIHJvb3QgKHRoZSBkZW1vIGNvcnB1cyBpcyByZWFkIG9uY2UgYW5kIGNhY2hlZCksIHNvXG4gKiB0aGUgY2hlY2tlciBpcyB0cml2aWFsbHkgdW5pdC10ZXN0YWJsZSBhZ2FpbnN0IGEgZml4dHVyZSByZXBvIGFuZCBjYXJyaWVzIG5vIHRlc3QtZnJhbWV3b3JrIGRlcGVuZGVuY3kuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIge1xuICBwcml2YXRlIGNhY2hlZENvcnB1czogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgY2FjaGVkTm90ZXM6IERlbW9WYXVsdE5vdGVbXSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbW9WYXVsdEZvbGRlcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGV4Y2x1ZGVkTm90ZXM6IFNldDxzdHJpbmc+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNoZWNrZXIgcm9vdGVkIGF0IGEgcGx1Z2luIHJlcG8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbnN0cnVjdG9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLnJvb3RGb2xkZXIgPSBwYXJhbXMucm9vdEZvbGRlcjtcbiAgICB0aGlzLmRlbW9WYXVsdEZvbGRlciA9IGpvaW4odGhpcy5yb290Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EZW1vVmF1bHQpO1xuICAgIHRoaXMuZXhjbHVkZWROb3RlcyA9IG5ldyBTZXQocGFyYW1zLmV4Y2x1ZGVkTm90ZXMgPz8gREVGQVVMVF9FWENMVURFRF9OT1RFUyk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdHMgdGhlIGRlbW8gbm90ZXMgYXMgcGF0aHMgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQgZm9sZGVyIChmb3IgYSBub24tdHJpdmlhbC1zdXJmYWNlIGd1YXJkKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIGV2ZXJ5IGAqLm1kYCBub3RlIGluIHRoZSBkZW1vIHZhdWx0LlxuICAgKi9cbiAgcHVibGljIGNvbGxlY3REZW1vTm90ZVJlbGF0aXZlUGF0aHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3ROb3RlcygpLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuZCBjYWNoZXMgZXZlcnkgZGVtbyBub3RlIGluZGl2aWR1YWxseSDigJQgdGhlIHBlci1ub3RlIHZpZXcgdGhlIGF1dGhvcmluZyBjaGVja3Mgd29yayBvbiwgYXNcbiAgICogb3Bwb3NlZCB0byB0aGUgY29uY2F0ZW5hdGVkIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXIucmVhZENvcnB1c30uXG4gICAqXG4gICAqIEByZXR1cm5zIEV2ZXJ5IGAqLm1kYCBub3RlIGluIHRoZSBkZW1vIHZhdWx0LCBleGNsdWRlZCBvbmVzIGluY2x1ZGVkLlxuICAgKi9cbiAgcHVibGljIGNvbGxlY3ROb3RlcygpOiBEZW1vVmF1bHROb3RlW10ge1xuICAgIHRoaXMuY2FjaGVkTm90ZXMgPz89IHRoaXMuY29sbGVjdE1hcmtkb3duRmlsZXModGhpcy5kZW1vVmF1bHRGb2xkZXIpLm1hcCgoZmlsZSkgPT4gKHtcbiAgICAgIGNvbnRlbnQ6IHJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKSxcbiAgICAgIHJlbGF0aXZlUGF0aDogcmVsYXRpdmUodGhpcy5kZW1vVmF1bHRGb2xkZXIsIGZpbGUpXG4gICAgfSkpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlZE5vdGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBgLm9ic2lkaWFuL2FwcC5qc29uYCBzZXR0aW5ncyB0aGUgdmF1bHQgY29tbWl0cyB0aGF0IGBvYnNpZGlhbi1kZXYtdXRpbHNgIG93bnMgYW5kIHdyaXRlc1xuICAgKiBpbnRvIHRoZSBhcmNoaXZlZCB2YXVsdCBpdHNlbGYuIEEgY29tbWl0dGVkIG9uZSBpcyBhIHNlY29uZCBjb3B5IG9mIGEgc2V0dGluZyBub3RoaW5nIHJlY29uY2lsZXMsIGFuZFxuICAgKiBpdCBpcyB0aGUgY29weSB0aGF0IGdvZXMgc3RhbGUg4oCUIHNvIHRoZSBjb252ZW50aW9uIGlzIHRoYXQgdGhlIHZhdWx0IGNvbW1pdHMgbm9uZSBvZiB0aGVtLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbmFtZXMgb2YgdGhlIG93bmVkIHNldHRpbmdzIHRoZSBjb21taXR0ZWQgYGFwcC5qc29uYCBzZXRzLiBBIHZhdWx0IHRoYXQgY29tbWl0cyBub1xuICAgKiBgYXBwLmpzb25gIGF0IGFsbCBpcyBmaW5lLCBhbmQgeWllbGRzIG5vbmUuXG4gICAqL1xuICBwdWJsaWMgZmluZENvbW1pdHRlZEFwcEpzb25TZXR0aW5ncygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgYXBwSnNvblBhdGggPSBqb2luKHRoaXMuZGVtb1ZhdWx0Rm9sZGVyLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5Eb3RPYnNpZGlhbiwgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQXBwSnNvbik7XG4gICAgY29uc3QgY29udGVudCA9IGV4aXN0c1N5bmMoYXBwSnNvblBhdGgpID8gcmVhZEZpbGVTeW5jKGFwcEpzb25QYXRoLCAndXRmLTgnKSA6IG51bGw7XG4gICAgcmV0dXJuIGZpbmRPd25lZERlbW9WYXVsdEFwcEpzb25TZXR0aW5ncyh7IGFwcEpzb246IHBhcnNlRGVtb1ZhdWx0QXBwSnNvbih7IGNvbnRlbnQsIHBhdGg6IGFwcEpzb25QYXRoIH0pIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIGNhcnJ5aW5nIGEgYFtEb2NzXSjigKYpYCBsaW5rIGxpbmUuIFRoZSBub3RlIElTIHRoZSBkb2N1bWVudGF0aW9uLCBzbyBhIGxpbmUgcG9pbnRpbmdcbiAgICogZWxzZXdoZXJlIGZvciB0aGUgcmVhbCBleHBsYW5hdGlvbiBpcyB0aGUgc2hhcGUgdGhpcyBjb252ZW50aW9uIGV4aXN0cyB0byByZW1vdmUuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhEb2NzTGlua3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiBnZXRMaW5lc091dHNpZGVGZW5jZXMobm90ZS5jb250ZW50KS5zb21lKChsaW5lKSA9PiBET0NTX0xJTktfUkVHX0VYUC50ZXN0KGxpbmUpKSlcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUucmVsYXRpdmVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBub3RlcyB0aGF0IGRvIG5vdCBvcGVuIHdpdGggYW4gYCMgSDFgIChmcm9udG1hdHRlciBhc2lkZSkuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhvdXRIMSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKClcbiAgICAgIC5maWx0ZXIoKG5vdGUpID0+ICFoYXNIMShub3RlLmNvbnRlbnQpKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHdpdGggbm8gcHJvc2UgcGFyYWdyYXBoIGJlZm9yZSB0aGVpciBmaXJzdCBjb2RlIGZlbmNlIOKAlCB0aGUgMS0zIHNlbnRlbmNlcyBzYXlpbmcgd2hhdCB0aGVcbiAgICogZmVhdHVyZSBkb2VzIGFuZCB3aHkgYSByZWFkZXIgd291bGQgd2FudCBpdCwgd2l0aG91dCB3aGljaCB0aGUgbm90ZSBpcyBhIGJ1dHRvbiB3aXRoIG5vIGxlc3Nvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZSBvZmZlbmRpbmcgbm90ZXMuXG4gICAqL1xuICBwdWJsaWMgZmluZE5vdGVzV2l0aG91dEludHJvUHJvc2UoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiAhaGFzSW50cm9Qcm9zZShub3RlLmNvbnRlbnQpKVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHdob3NlIGV4ZW1wdGlvbnMgYXJlIG5vdCBkb2luZyBhbnkgd29yayDigJQgYSB3aWtpbGluayBhbGxvd2FuY2Ugb3IgYW4gaW5saW5lIGRpcmVjdGl2ZSBmb3JcbiAgICogYW55IHJ1bGUgZGVjbGFyZWQgd2l0aG91dCBhIHJlYXNvbiwgbWlzc3BlbGxlZCwgb3IgY292ZXJpbmcgbm90aGluZyB0aGF0IGJyZWFrcyBpdHMgcnVsZS4gQWxsIG9mIHRoZW1cbiAgICogYXJlIGRyaWZ0OiBhbiBleGVtcHRpb24gbm9ib2R5IGNhbiBqdXN0aWZ5LCBhbmQgb25lIG5vdGhpbmcgbmVlZHMgYW55IG1vcmUsIHdoaWNoIHdvdWxkIGdvIG9uIGhpZGluZ1xuICAgKiB0aGUgbmV4dCBtaXN0YWtlIHNvbWVib2R5IG1ha2VzIGJ5IGFjY2lkZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBPbmUgYDxub3RlPjogPHByb2JsZW0+YCBlbnRyeSBwZXIgcHJvYmxlbSBmb3VuZC5cbiAgICovXG4gIHB1YmxpYyBmaW5kTm90ZXNXaXRoVW5qdXN0aWZpZWRXaWtpbGlua0FsbG93YW5jZSgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKCkuZmxhdE1hcCgobm90ZSkgPT4ge1xuICAgICAgY29uc3Qgc2NhbiA9IHNjYW5EaXJlY3RpdmVzKG5vdGUuY29udGVudCk7XG4gICAgICBjb25zdCBwcm9ibGVtcyA9IFsuLi5zY2FuLnByb2JsZW1zXTtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihub3RlLmNvbnRlbnQpO1xuICAgICAgaWYgKHJlYXNvbiAhPT0gbnVsbCkge1xuICAgICAgICBpZiAocmVhc29uLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdhIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIHdpdGggbm8gcmVhc29uJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWhhc1dpa2lsaW5rKG5vdGUuY29udGVudCkpIHtcbiAgICAgICAgICBwcm9ibGVtcy5wdXNoKCdhIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIGNvdmVyaW5nIG5vIHdpa2lsaW5rJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZ2V0QWxsb3dlZExpbmVJbmRleGVzKHNjYW4sIFdJS0lMSU5LX1JVTEUpLnNpemUgPiAwKSB7XG4gICAgICAgICAgcHJvYmxlbXMucHVzaCgnaW5saW5lIGRpcmVjdGl2ZXMgdGhlIG5vdGUtbGV2ZWwgYWxsb3dhbmNlIGFscmVhZHkgY292ZXJzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9ibGVtcy5tYXAoKHByb2JsZW0pID0+IGAke25vdGUucmVsYXRpdmVQYXRofTogJHtwcm9ibGVtfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5vdGVzIHVzaW5nIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gIG91dHNpZGUgYSBjb2RlIGZlbmNlLiBUaGUgZGVtbyB2YXVsdCBpcyBhbHNvIHJlYWQgb25cbiAgICogR2l0SHViLCB3aGVyZSBhIHdpa2lsaW5rIHJlbmRlcnMgYXMgbGl0ZXJhbCBicmFja2V0cyBhbmQgbGVhZHMgbm93aGVyZS4gQSB3aWtpbGluayBzaG93biBJTlNJREUgYVxuICAgKiBmZW5jZSBpcyBzYW1wbGUgdGV4dCwgbm90IG5hdmlnYXRpb24sIHNvIGZlbmNlZCBibG9ja3MgYXJlIHNraXBwZWQsIGFzIGlzIGEgbm90ZSB0aGF0IGRlY2xhcmVzIGluIGl0c1xuICAgKiBmcm9udG1hdHRlciB3aHkgaXRzIHdpa2lsaW5rcyBhcmUgdGhlIHBvaW50IOKAlCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGUgb2ZmZW5kaW5nIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmROb3Rlc1dpdGhXaWtpbGlua3MoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAuZmlsdGVyKChub3RlKSA9PiB7XG4gICAgICAgIGlmIChyZWFkV2lraWxpbmtBbGxvd2FuY2VSZWFzb24obm90ZS5jb250ZW50KSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGxvd2VkTGluZUluZGV4ZXMgPSBnZXRBbGxvd2VkTGluZUluZGV4ZXMoc2NhbkRpcmVjdGl2ZXMobm90ZS5jb250ZW50KSwgV0lLSUxJTktfUlVMRSk7XG4gICAgICAgIHJldHVybiBmaW5kV2lraWxpbmtMaW5lSW5kZXhlcyhub3RlLmNvbnRlbnQpLnNvbWUoKGxpbmVJbmRleCkgPT4gIWFsbG93ZWRMaW5lSW5kZXhlcy5oYXMobGluZUluZGV4KSk7XG4gICAgICB9KVxuICAgICAgLm1hcCgobm90ZSkgPT4gbm90ZS5yZWxhdGl2ZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG1lbWJlcnMgdGhhdCB0aGUgZGVtbyBub3RlcyByZWZlcmVuY2Ugb24gYSByZWNlaXZlciBidXQgdGhhdCBubyBsb25nZXIgZXhpc3Qgb24gaXQgKHJlbmFtZSBkcmlmdCkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGRpc3RpbmN0IHN0YWxlIG1lbWJlciBuYW1lcyByZWZlcmVuY2VkIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICovXG4gIHB1YmxpYyBmaW5kU3RhbGVSZWZlcmVuY2VzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFN0YWxlUmVmZXJlbmNlc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2YWxpZE1lbWJlcnMgPSBuZXcgU2V0KHBhcmFtcy52YWxpZE1lbWJlcnMpO1xuICAgIGNvbnN0IHJlZmVyZW5jZWQgPSBbLi4udGhpcy5yZWFkQ29ycHVzKCkubWF0Y2hBbGwobmV3IFJlZ0V4cChTdHJpbmcucmF3YCR7cGFyYW1zLnJlY2VpdmVyfVxcLig/PG1lbWJlcj5cXHcrKWAsICdnJykpXVxuICAgICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdtZW1iZXInKSk7XG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KHJlZmVyZW5jZWQpXS5maWx0ZXIoKG1lbWJlcikgPT4gIXZhbGlkTWVtYmVycy5oYXMobWVtYmVyKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYFRyeSBpdGAgc2VjdGlvbnMgd2l0aCBubyBgY29kZS1idXR0b25gIGluIHRoZW0uIEEgYFRyeSBpdGAgc2VjdGlvbiBpcyBhIGhlYWRpbmcgb2YgYW55IGxldmVsXG4gICAqIHN0YXJ0aW5nIGBUcnkgaXRgLCB1cCB0byB0aGUgbmV4dCBoZWFkaW5nIG9mIHRoZSBzYW1lIG9yIGEgaGlnaGVyIGxldmVsOyB0aGUgc2V0dXAgaXQgYXNrcyBmb3IgaXNcbiAgICogd2hhdCBhIGJ1dHRvbiBpcyBmb3IsIHNvIGEgc2VjdGlvbiB0aGF0IGxlYXZlcyB0aGUgcmVhZGVyIHRvIGRvIGl0IGJ5IGhhbmQgaXMgdGhlIHNoYXBlIHRoaXMgY2hlY2tcbiAgICogcmVqZWN0cy4gQSBzZWN0aW9uIHdob3NlIGhlYWRpbmcgYSBgZGVtby12YXVsdC12YWxpZGF0aW9uL3RyeS1pdC1jb2RlLWJ1dHRvbmAgZGlyZWN0aXZlIGNvdmVycyBoYXNcbiAgICogc3RhdGVkIHdoeSBpdCBjYW5ub3QgYmUgc2NyaXB0ZWQsIGFuZCBpcyBza2lwcGVkIOKAlCBzZWUgdGhlIGZpbGUgb3ZlcnZpZXcuXG4gICAqXG4gICAqIEByZXR1cm5zIE9uZSBgPG5vdGU+OiBsaW5lIDxuPmAgZW50cnkgcGVyIG9mZmVuZGluZyBzZWN0aW9uLCBuYW1pbmcgdGhlIGxpbmUgb2YgaXRzIGhlYWRpbmcuXG4gICAqL1xuICBwdWJsaWMgZmluZFRyeUl0U2VjdGlvbnNXaXRob3V0Q29kZUJ1dHRvbigpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdENoZWNrYWJsZU5vdGVzKCkuZmxhdE1hcCgobm90ZSkgPT4ge1xuICAgICAgY29uc3QgYWxsb3dlZExpbmVJbmRleGVzID0gZ2V0QWxsb3dlZExpbmVJbmRleGVzKHNjYW5EaXJlY3RpdmVzKG5vdGUuY29udGVudCksIFRSWV9JVF9SVUxFKTtcbiAgICAgIHJldHVybiBmaW5kVHJ5SXRMaW5lSW5kZXhlc1dpdGhvdXRDb2RlQnV0dG9uKG5vdGUuY29udGVudClcbiAgICAgICAgLmZpbHRlcigobGluZUluZGV4KSA9PiAhYWxsb3dlZExpbmVJbmRleGVzLmhhcyhsaW5lSW5kZXgpKVxuICAgICAgICAubWFwKChsaW5lSW5kZXgpID0+IGAke25vdGUucmVsYXRpdmVQYXRofTogJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbWVtYmVycyB0aGF0IGFyZSBub3QgZGVtb25zdHJhdGVkIGFueXdoZXJlIGluIHRoZSBkZW1vIGNvcnB1cy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICAgKiBAcmV0dXJucyBUaGUgbWVtYmVyIG5hbWVzIHdpdGggbm8gZGVtb25zdHJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBmaW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVuZGVtb25zdHJhdGVkTWVtYmVyc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb3JwdXMgPSB0aGlzLnJlYWRDb3JwdXMoKTtcbiAgICByZXR1cm4gcGFyYW1zLm1lbWJlcnMuZmlsdGVyKChtZW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IG5lZWRsZSA9IHBhcmFtcy5yZWNlaXZlciA9PT0gdW5kZWZpbmVkID8gbWVtYmVyIDogYCR7cGFyYW1zLnJlY2VpdmVyfS4ke21lbWJlcn1gO1xuICAgICAgcmV0dXJuICFjb3JwdXMuaW5jbHVkZXMobmVlZGxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBmZWF0dXJlIGRvY3MgdGhhdCBubyBkZW1vIG5vdGUgbGlua3MgdG8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGZlYXR1cmUtZG9jIGJhc2VuYW1lcyAod2l0aG91dCBgLm1kYCkgbm90IGxpbmtlZCBmcm9tIGFueSBkZW1vIG5vdGUuXG4gICAqL1xuICBwdWJsaWMgZmluZFVubGlua2VkRmVhdHVyZURvY3MocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJGaW5kVW5saW5rZWRGZWF0dXJlRG9jc1BhcmFtcyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBub25GZWF0dXJlRG9jcyA9IG5ldyBTZXQocGFyYW1zLm5vbkZlYXR1cmVEb2NzKTtcbiAgICBjb25zdCBmZWF0dXJlRG9jcyA9IHJlYWRkaXJTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuZG9jc0ZvbGRlcikpXG4gICAgICAuZmlsdGVyKChmaWxlKSA9PiBmaWxlLmVuZHNXaXRoKCcubWQnKSlcbiAgICAgIC5tYXAoKGZpbGUpID0+IGZpbGUucmVwbGFjZSgvXFwubWQkLywgJycpKVxuICAgICAgLmZpbHRlcigobmFtZSkgPT4gIW5vbkZlYXR1cmVEb2NzLmhhcyhuYW1lKSk7XG4gICAgY29uc3QgbGlua2VkRG9jcyA9IG5ldyBTZXQoXG4gICAgICBbLi4udGhpcy5yZWFkQ29ycHVzKCkubWF0Y2hBbGwoL2RvY3NcXC8oPzxkb2M+W1xcdy1dKylcXC5tZC9nKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ2RvYycpKVxuICAgICk7XG4gICAgcmV0dXJuIGZlYXR1cmVEb2NzLmZpbHRlcigoZG9jKSA9PiAhbGlua2VkRG9jcy5oYXMoZG9jKSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbm90ZXMgdGhhdCBjYW5ub3QgYmUgcmVhY2hlZCBmcm9tIHRoZSBzdGFydCBub3RlIGJ5IGZvbGxvd2luZyBNYXJrZG93biBsaW5rcyBiZXR3ZWVuIG5vdGVzLlxuICAgKlxuICAgKiBUaGUgd2FsayBzdGFydHMgYXQge0BsaW5rIERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlckZpbmRVbnJlYWNoYWJsZU5vdGVzUGFyYW1zLnN0YXJ0Tm90ZX0gYW5kIGZvbGxvd3NcbiAgICogZXZlcnkgYFtUZXh0XSg8Li9OTiBOYW1lLm1kPilgIGxpbmsgb3V0c2lkZSBhIGNvZGUgZmVuY2UsIHRyYW5zaXRpdmVseS4gQSBub3RlIG5vdGhpbmcgbGlua3MgdG8gaXNcbiAgICogb25lIGEgcmVhZGVyIGNhbiBvbmx5IGZpbmQgYnkgYnJvd3NpbmcgdGhlIGZpbGUgbGlzdCDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHRoZSBncm91cGVkIGluZGV4IGluIHRoZVxuICAgKiBzdGFydCBub3RlIGlzIG1lYW50IHRvIHJlcGxhY2UuIFdoZW4gdGhlIHN0YXJ0IG5vdGUgaXRzZWxmIGlzIG1pc3NpbmcsIEVWRVJZIG5vdGUgaXMgdW5yZWFjaGFibGUsXG4gICAqIGJlY2F1c2UgdGhlcmUgaXMgbm93aGVyZSB0byBzdGFydCBmcm9tLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3YWxrLlxuICAgKiBAcmV0dXJucyBUaGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlIHVucmVhY2hhYmxlIG5vdGVzLlxuICAgKi9cbiAgcHVibGljIGZpbmRVbnJlYWNoYWJsZU5vdGVzKHBhcmFtczogRGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyRmluZFVucmVhY2hhYmxlTm90ZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm90ZXNCeVJlbGF0aXZlUGF0aCA9IG5ldyBNYXAodGhpcy5jb2xsZWN0Tm90ZXMoKS5tYXAoKG5vdGUpID0+IFtub3RlLnJlbGF0aXZlUGF0aCwgbm90ZV0pKTtcbiAgICBjb25zdCByZWFjaGVkTm90ZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBwZW5kaW5nTm90ZXMgPSBbcGFyYW1zLnN0YXJ0Tm90ZV07XG5cbiAgICB3aGlsZSAocGVuZGluZ05vdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vdGVQYXRoID0gZW5zdXJlTm9uTnVsbGFibGUocGVuZGluZ05vdGVzLnBvcCgpKTtcbiAgICAgIGNvbnN0IG5vdGUgPSBub3Rlc0J5UmVsYXRpdmVQYXRoLmdldChub3RlUGF0aCk7XG4gICAgICBpZiAoIW5vdGUgfHwgcmVhY2hlZE5vdGVzLmhhcyhub3RlUGF0aCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZWFjaGVkTm90ZXMuYWRkKG5vdGVQYXRoKTtcbiAgICAgIHBlbmRpbmdOb3Rlcy5wdXNoKC4uLmNvbGxlY3ROb3RlTGlua1RhcmdldHMobm90ZSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbGxlY3RDaGVja2FibGVOb3RlcygpXG4gICAgICAubWFwKChub3RlKSA9PiBub3RlLnJlbGF0aXZlUGF0aClcbiAgICAgIC5maWx0ZXIoKG5vdGVQYXRoKSA9PiAhcmVhY2hlZE5vdGVzLmhhcyhub3RlUGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgbmFtZXMgb2YgdGhlIGBleHBvcnQgZnVuY3Rpb25gcyAoaW5jbHVkaW5nIGBhc3luY2AgYW5kIGdlbmVyYXRvciBkZWNsYXJhdGlvbnMpIGluIGEgc291cmNlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIGV4cG9ydGVkIGZ1bmN0aW9uIG5hbWVzIGluIHNvdXJjZSBvcmRlci5cbiAgICovXG4gIHB1YmxpYyBnZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRFeHBvcnRlZEZ1bmN0aW9uTmFtZXNQYXJhbXMpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc291cmNlID0gcmVhZEZpbGVTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuc291cmNlUGF0aCksICd1dGYtOCcpO1xuICAgIHJldHVybiBbLi4uc291cmNlLm1hdGNoQWxsKC9eZXhwb3J0ICg/OmFzeW5jICk/ZnVuY3Rpb25cXCo/ICg/PG5hbWU+XFx3KykvZ20pXVxuICAgICAgLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICduYW1lJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgbWVtYmVycyBvZiBhbiBgZXhwb3J0IGludGVyZmFjZWAsIGBleHBvcnQgY2xhc3NgLCBvciBgZXhwb3J0IGVudW1gIGRlY2xhcmVkIGluIGEgc291cmNlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAgICogQHJldHVybnMgVGhlIHBhcnNlZCB7QGxpbmsgSW50ZXJmYWNlTWVtYmVyc30uXG4gICAqIEB0aHJvd3MgV2hlbiB0aGUgaW50ZXJmYWNlLCBjbGFzcywgb3IgZW51bSBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIHNvdXJjZSBmaWxlLlxuICAgKi9cbiAgcHVibGljIGdldEludGVyZmFjZU1lbWJlcnMocGFyYW1zOiBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJHZXRJbnRlcmZhY2VNZW1iZXJzUGFyYW1zKTogSW50ZXJmYWNlTWVtYmVycyB7XG4gICAgY29uc3Qgc291cmNlID0gcmVhZEZpbGVTeW5jKGpvaW4odGhpcy5yb290Rm9sZGVyLCBwYXJhbXMuc291cmNlUGF0aCksICd1dGYtOCcpO1xuICAgIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChTdHJpbmcucmF3YGV4cG9ydCAoPzxrZXl3b3JkPmludGVyZmFjZXxjbGFzc3xlbnVtKSAke3BhcmFtcy5pbnRlcmZhY2VOYW1lfVxcYltee10qXFx7KD88Ym9keT5bXFxzXFxTXSo/KVxcblxcfWApLmV4ZWMoc291cmNlKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGludGVyZmFjZSAke3BhcmFtcy5pbnRlcmZhY2VOYW1lfWApO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VNZW1iZXJzKGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdrZXl3b3JkJyksIGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdib2R5JykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGFuZCBjYWNoZXMgdGhlIGRlbW8gY29ycHVzIOKAlCBldmVyeSBgKi5tZGAgbm90ZSBpbiB0aGUgZGVtbyB2YXVsdCBqb2luZWQgaW50byBvbmUgc3RyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY29uY2F0ZW5hdGVkIGRlbW8tbm90ZSBjb250ZW50cy5cbiAgICovXG4gIHB1YmxpYyByZWFkQ29ycHVzKCk6IHN0cmluZyB7XG4gICAgdGhpcy5jYWNoZWRDb3JwdXMgPz89IHRoaXMuY29sbGVjdE5vdGVzKClcbiAgICAgIC5tYXAoKG5vdGUpID0+IG5vdGUuY29udGVudClcbiAgICAgIC5qb2luKCdcXG4nKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZWRDb3JwdXM7XG4gIH1cblxuICAvLyBUaGUgbm90ZXMgdGhlIGF1dGhvcmluZyBjaGVja3MgYXBwbHkgdG86IGV2ZXJ5IG5vdGUgZXhjZXB0IHRoZSBvbmVzIGRlY2xhcmVkIG91dHNpZGUgdGhlIGxlYXJuaW5nXG4gIC8vIHBhdGggKHRoZSB2YXVsdCdzIG93biBgUkVBRE1FLm1kYCBieSBkZWZhdWx0KS5cbiAgcHJpdmF0ZSBjb2xsZWN0Q2hlY2thYmxlTm90ZXMoKTogRGVtb1ZhdWx0Tm90ZVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb2xsZWN0Tm90ZXMoKS5maWx0ZXIoKG5vdGUpID0+ICF0aGlzLmV4Y2x1ZGVkTm90ZXMuaGFzKG5vdGUucmVsYXRpdmVQYXRoKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbGxlY3RNYXJrZG93bkZpbGVzKGZvbGRlcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICAvLyBgcmVhZGRpclN5bmNgIHJldHVybnMgZW50cmllcyBpbiB0aGUgZmlsZSBzeXN0ZW0ncyBvd24gb3JkZXI6IGJ5IG5hbWUgb24gTlRGUywgYnV0IGJ5IGhhc2ggb24gZXh0NCwgc29cbiAgICAvLyBzb3J0IHRoZW0gc28gZXZlcnkgY2hlY2sgcmVwb3J0cyBpdHMgbm90ZXMgaW4gdGhlIHNhbWUgb3JkZXIgb24gZXZlcnkgcGxhdGZvcm0uXG4gICAgY29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSwgJ2VuJykpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk5vZGVNb2R1bGVzIGFzIHN0cmluZykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuY29sbGVjdE1hcmtkb3duRmlsZXMoam9pbihmb2xkZXIsIGVudHJ5Lm5hbWUpKSk7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGpvaW4oZm9sZGVyLCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBgdml0ZXN0YCBzdWl0ZSB0aGF0IGtlZXBzIGEgcGx1Z2luJ3MgaW4tcmVwbyBgZGVtby12YXVsdC9gIGluIHN5bmMgd2l0aCBpdHMgcHVibGljIHN1cmZhY2UuXG4gKlxuICogQ2FsbCBpdCBvbmNlIGZyb20gYSBwbHVnaW4ncyBgZGVtby12YXVsdC5uby1hcHAuaW50ZWdyYXRpb24udGVzdC50c2A7IGl0IHJlZ2lzdGVycyBvbmUgdGVzdCBwZXIgY2hlY2ssXG4gKiBkZWxlZ2F0aW5nIHRvIHtAbGluayBEZW1vVmF1bHRDb3ZlcmFnZUNoZWNrZXJ9LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGVjbGFyYXRpdmUgY292ZXJhZ2Ugc3BlY2lmaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZShwYXJhbXM6IFJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZVBhcmFtcyk6IHZvaWQge1xuICBjb25zdCBjaGVja2VyID0gbmV3IERlbW9WYXVsdENvdmVyYWdlQ2hlY2tlcihub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RGVtb1ZhdWx0Q292ZXJhZ2VDaGVja2VyQ29uc3RydWN0b3JQYXJhbXM+KHtcbiAgICBleGNsdWRlZE5vdGVzOiBwYXJhbXMuYXV0aG9yaW5nPy5leGNsdWRlZE5vdGVzLFxuICAgIHJvb3RGb2xkZXI6IHBhcmFtcy5yb290Rm9sZGVyXG4gIH0pKTtcbiAgY29uc3Qgc3RhcnROb3RlID0gcGFyYW1zLmF1dGhvcmluZz8uc3RhcnROb3RlID8/IERFRkFVTFRfU1RBUlRfTk9URTtcbiAgY29uc3QgdHJ5SXRDb2RlQnV0dG9ucyA9IHBhcmFtcy5hdXRob3Jpbmc/LnRyeUl0Q29kZUJ1dHRvbnMgPz8gREVGQVVMVF9UUllfSVRfQ09ERV9CVVRUT05TX1NFVkVSSVRZO1xuXG4gIGRlc2NyaWJlKCdkZW1vLXZhdWx0IGNvdmVyYWdlJywgKCkgPT4ge1xuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuaW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgaXQoYGRlbW9uc3RyYXRlcyBldmVyeSAke3NwZWMuaW50ZXJmYWNlTmFtZX0gJHtzcGVjLmtpbmR9YCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBjb25zdCBkZW1vbnN0cmF0ZWQgPSBtZW1iZXJzW3NwZWMua2luZF07XG4gICAgICAgIGV4cGVjdChkZW1vbnN0cmF0ZWQubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmZpbmRVbmRlbW9uc3RyYXRlZE1lbWJlcnMoeyBtZW1iZXJzOiBkZW1vbnN0cmF0ZWQsIHJlY2VpdmVyOiBzcGVjLnJlY2VpdmVyIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdChgcmVmZXJlbmNlcyBubyAke3NwZWMuaW50ZXJmYWNlTmFtZX0gbWVtYmVyIHRoYXQgbm8gbG9uZ2VyIGV4aXN0c2AsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWVtYmVycyA9IGNoZWNrZXIuZ2V0SW50ZXJmYWNlTWVtYmVycyhzcGVjKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFN0YWxlUmVmZXJlbmNlcyh7IHJlY2VpdmVyOiBzcGVjLnJlY2VpdmVyLCB2YWxpZE1lbWJlcnM6IG1lbWJlcnMuYWxsIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuY29uZmlnSW50ZXJmYWNlcyA/PyBbXSkge1xuICAgICAgaXQoYGRlbW9uc3RyYXRlcyBldmVyeSAke3NwZWMuaW50ZXJmYWNlTmFtZX0gb3B0aW9uYCwgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gY2hlY2tlci5nZXRJbnRlcmZhY2VNZW1iZXJzKHNwZWMpO1xuICAgICAgICBleHBlY3QobWVtYmVycy5wcm9wZXJ0aWVzLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5kZW1vbnN0cmF0ZWRNZW1iZXJzKHsgbWVtYmVyczogbWVtYmVycy5wcm9wZXJ0aWVzIH0pKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3BlYyBvZiBwYXJhbXMuZnVuY3Rpb25Nb2R1bGVzID8/IFtdKSB7XG4gICAgICBpdChgZGVtb25zdHJhdGVzIGV2ZXJ5IGV4cG9ydGVkIGZ1bmN0aW9uIGluICR7c3BlYy5zb3VyY2VQYXRofWAsICgpID0+IHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lcyA9IGNoZWNrZXIuZ2V0RXhwb3J0ZWRGdW5jdGlvbk5hbWVzKHNwZWMpO1xuICAgICAgICBleHBlY3QoZnVuY3Rpb25OYW1lcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZFVuZGVtb25zdHJhdGVkTWVtYmVycyh7IG1lbWJlcnM6IGZ1bmN0aW9uTmFtZXMgfSkpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZG9jcyA9IHBhcmFtcy5kb2NzO1xuICAgIGlmIChkb2NzKSB7XG4gICAgICBpdCgnbGlua3MgYSBkZW1vIG5vdGUgZm9yIGV2ZXJ5IGZlYXR1cmUgZG9jJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5saW5rZWRGZWF0dXJlRG9jcyh7IGRvY3NGb2xkZXI6IGRvY3MuZm9sZGVyLCBub25GZWF0dXJlRG9jczogZG9jcy5ub25GZWF0dXJlRG9jcyB9KSlcbiAgICAgICAgICAudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpdCgnb3BlbnMgZXZlcnkgbm90ZSB3aXRoIGFuIEgxJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aG91dEgxKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ29wZW5zIGV2ZXJ5IG5vdGUgd2l0aCBhIHByb3NlIHBhcmFncmFwaCBiZWZvcmUgaXRzIGZpcnN0IGNvZGUgYmxvY2snLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kTm90ZXNXaXRob3V0SW50cm9Qcm9zZSgpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KGByZWFjaGVzIGV2ZXJ5IG5vdGUgZnJvbSAke3N0YXJ0Tm90ZX1gLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kVW5yZWFjaGFibGVOb3Rlcyh7IHN0YXJ0Tm90ZSB9KSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgndXNlcyBubyB3aWtpbGlua3MsIHdoaWNoIGRvIG5vdCByZW5kZXIgb24gR2l0SHViJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuZmluZE5vdGVzV2l0aFdpa2lsaW5rcygpKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdqdXN0aWZpZXMgZXZlcnkgd2lraWxpbmsgYWxsb3dhbmNlIGFuZCBkaXJlY3RpdmUsIGFuZCBkZWNsYXJlcyBub25lIGl0IG5vIGxvbmdlciBuZWVkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhVbmp1c3RpZmllZFdpa2lsaW5rQWxsb3dhbmNlKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2dpdmVzIGV2ZXJ5IFRyeSBpdCBzZWN0aW9uIGEgY29kZSBidXR0b24sIG9yIGEgc3RhdGVkIHJlYXNvbiBpdCBoYXMgbm9uZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNlY3Rpb25zID0gY2hlY2tlci5maW5kVHJ5SXRTZWN0aW9uc1dpdGhvdXRDb2RlQnV0dG9uKCk7XG4gICAgICBpZiAodHJ5SXRDb2RlQnV0dG9ucyA9PT0gJ2Vycm9yJykge1xuICAgICAgICBleHBlY3Qoc2VjdGlvbnMpLnRvRXF1YWwoW10pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLndhcm4oZm9ybWF0VHJ5SXRXYXJuaW5nKHNlY3Rpb25zKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnY2FycmllcyBubyBEb2NzIGxpbmsgbGluZSwgYmVjYXVzZSB0aGUgbm90ZSBpcyB0aGUgZG9jcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjaGVja2VyLmZpbmROb3Rlc1dpdGhEb2NzTGlua3MoKSkudG9FcXVhbChbXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY29tbWl0cyBub25lIG9mIHRoZSBhcHAuanNvbiBzZXR0aW5ncyBvYnNpZGlhbi1kZXYtdXRpbHMgaW5qZWN0cyBhdCByZWxlYXNlIHRpbWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY2hlY2tlci5maW5kQ29tbWl0dGVkQXBwSnNvblNldHRpbmdzKCkpLnRvRXF1YWwoW10pO1xuICAgIH0pO1xuXG4gICAgLy8gV2l0aCBubyBub3RlcyB0byByZWFkLCBldmVyeSBhdXRob3JpbmcgY2hlY2sgYWJvdmUgcGFzc2VzIGJ5IGhhdmluZyBub3RoaW5nIHRvIGxvb2sgYXQsIHNvIGEgdmF1bHRcbiAgICAvLyB0aGF0IHN0b3BwZWQgYmVpbmcgZm91bmQgd291bGQgZ28gb24gcmVwb3J0aW5nIGl0c2VsZiBjbGVhbi4gVGhpcyBpcyB0aGUgaGFsZiBvZiB0aGUgbm9uLXRyaXZpYWxcbiAgICAvLyBndWFyZCB0aGF0IHN0aWxsIGFwcGxpZXMgd2hlbiB0aGUgcGx1Z2luIGV4cG9zZXMgbm90aGluZyB0byByZWZsZWN0LlxuICAgIGl0KCdyZWFkcyBhIG5vbi1lbXB0eSBkZW1vIHZhdWx0JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNoZWNrZXIuY29sbGVjdERlbW9Ob3RlUmVsYXRpdmVQYXRocygpLmxlbmd0aCkudG9CZUdyZWF0ZXJUaGFuKDApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZ3VhcmQgPSBwYXJhbXMubm9uVHJpdmlhbEd1YXJkO1xuICAgIGlmIChndWFyZCkge1xuICAgICAgaXQoJ2tlZXBzIHRoZSByZWZsZWN0ZWQgc3VyZmFjZSBub24tdHJpdmlhbCcsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWVtYmVycyA9IGNoZWNrZXIuZ2V0SW50ZXJmYWNlTWVtYmVycyhndWFyZCk7XG4gICAgICAgIGV4cGVjdChtZW1iZXJzLmFsbCkudG9Db250YWluKGd1YXJkLmV4cGVjdE1lbWJlcik7XG4gICAgICAgIGV4cGVjdChjaGVja2VyLmNvbGxlY3REZW1vTm90ZVJlbGF0aXZlUGF0aHMoKSkudG9Db250YWluKGd1YXJkLmV4cGVjdERlbW9Ob3RlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmNvbnN0IENMQVNTX01FTUJFUl9NT0RJRklFUlMgPSBTdHJpbmcucmF3YCg/Oig/OnB1YmxpY3xwcml2YXRlfHByb3RlY3RlZHxyZWFkb25seXxzdGF0aWN8YWJzdHJhY3R8b3ZlcnJpZGUpXFxzKykqYDtcbmNvbnN0IEFCU09MVVRFX1VSTF9SRUdfRVhQID0gL15bYS16XVtcXHcrLi1dKjovaTtcbmNvbnN0IEFSUk9XX1JFR19FWFAgPSAvXlxccyo9Pi87XG5jb25zdCBGVU5DVElPTl9UWVBFX1BBUkFNRVRFUlNfUkVHX0VYUCA9IC9ePFtePl0qPlxccyovO1xuY29uc3QgQU5HTEVfQlJBQ0tFVFNfUkVHX0VYUCA9IC9ePHw+JC9nO1xuY29uc3QgQ09ERV9CVVRUT05fRkVOQ0VfUkVHX0VYUCA9IC9eXFxzKig/OmBgYHx+fn4pXFxzKmNvZGUtYnV0dG9uXFxiLztcbmNvbnN0IENPREVfRkVOQ0VfUkVHX0VYUCA9IC9eXFxzKig/OmBgYHx+fn4pLztcbmNvbnN0IERFRkFVTFRfRVhDTFVERURfTk9URVMgPSBbJ1JFQURNRS5tZCddO1xuY29uc3QgREVGQVVMVF9TVEFSVF9OT1RFID0gJzAwIFN0YXJ0Lm1kJztcbi8vIEl0IHNoaXBwZWQgYXMgYSB3YXJuaW5nIHdoaWxlIGV4aXN0aW5nIHZhdWx0cyB3ZXJlIGJyb3VnaHQgdXAgdG8gdGhlIGNoZWNrLCBhbmQgYmVjYW1lIGFuIGVycm9yIG9uY2UgdGhleSB3ZXJlLlxuY29uc3QgREVGQVVMVF9UUllfSVRfQ09ERV9CVVRUT05TX1NFVkVSSVRZOiBEZW1vVmF1bHRDaGVja1NldmVyaXR5ID0gJ2Vycm9yJztcbmNvbnN0IERPQ1NfTElOS19SRUdfRVhQID0gL15cXHMqXFxbRG9jc11cXCgvO1xuY29uc3QgRlJPTlRNQVRURVJfUkVHX0VYUCA9IC9eLS0tXFxyP1xcbltcXHNcXFNdKj9cXHI/XFxuLS0tW15cXFNcXG5dKlxccj9cXG4/LztcbmNvbnN0IEgxX1JFR19FWFAgPSAvXiMgXFxTLztcbmNvbnN0IEhFQURJTkdfTEVWRUxfUkVHX0VYUCA9IC9eIHswLDN9KD88aGFzaGVzPiN7MSw2fSkoPzpcXHN8JCkvO1xuY29uc3QgSEVBRElOR19SRUdfRVhQID0gL14jezEsNn0gLztcbmNvbnN0IElOTElORV9DT0RFX1JFR19FWFAgPSAvYFteYFxcbl0qYC9nO1xuY29uc3QgTUFSS0RPV05fTElOS19SRUdfRVhQID0gL1xcW1teXFxdXSpdXFwoKD88dGFyZ2V0PlteKV0rKVxcKS9nO1xuLy8gQW4gaW5saW5lIGRpcmVjdGl2ZSwgc2hhcGVkIGFmdGVyIEVTTGludCdzIGFuZCB3cml0dGVuIGFzIGFuIEhUTUwgY29tbWVudCBzbyBpdCBpcyBpbnZpc2libGUgQk9USCBpblxuLy8gT2JzaWRpYW4gYW5kIG9uIEdpdEh1YiDigJQgdGhlIHNhbWUgc3BlbGxpbmcgdGhlIHZhdWx0cyBhbHJlYWR5IHVzZSBmb3IgYG1hcmtkb3dubGludC1kaXNhYmxlLW5leHQtbGluZWAuXG4vLyBBbiBPYnNpZGlhbiBgJSUg4oCmICUlYCBjb21tZW50IHdvdWxkIHNob3cgdXAgYXMgbGl0ZXJhbCB0ZXh0IG9uIEdpdEh1Yiwgd2hpY2ggaXMgaGFsZiB0aGUgcmVhZGVyc2hpcC5cbmNvbnN0IERJUkVDVElWRV9SRUdfRVhQID0gL15cXHMqPCEtLVxccypvYnNpZGlhbi1kZXYtdXRpbHMtKD88YWN0aW9uPmRpc2FibGUtbmV4dC1saW5lfGRpc2FibGV8ZW5hYmxlKVxccysoPzxydWxlPltcXHctXStcXC9bXFx3LV0rKSg/OlxccystLVxccysoPzxyZWFzb24+Lio/KSk/XFxzKi0tPlxccyokLztcbi8vIENhdGNoZXMgYSBkaXJlY3RpdmUgdGhhdCB3YXMgTUVBTlQgdG8gYmUgb25lIGJ1dCBpcyBtaXNzcGVsbGVkOiBpdCB3b3VsZCBvdGhlcndpc2UgcmVhZCBhcyBhbiBvcmRpbmFyeVxuLy8gY29tbWVudCBhbmQgc2lsZW50bHkgZG8gbm90aGluZywgd2hpY2ggaXMgdGhlIGZhaWx1cmUgbW9kZSBhIHN1cHByZXNzaW9uIHN5bnRheCBtdXN0IG5ldmVyIGhhdmUuXG5jb25zdCBESVJFQ1RJVkVfUFJPQkVfUkVHX0VYUCA9IC88IS0tXFxzKm9ic2lkaWFuLWRldi11dGlscy0vO1xuY29uc3QgVFJZX0lUX0hFQURJTkdfUkVHX0VYUCA9IC9eIHswLDN9I3sxLDZ9XFxzK1RyeSBpdFxcYi9pO1xuY29uc3QgVFJZX0lUX1JVTEUgPSAnZGVtby12YXVsdC12YWxpZGF0aW9uL3RyeS1pdC1jb2RlLWJ1dHRvbic7XG5jb25zdCBXSUtJTElOS19SVUxFID0gJ2RlbW8tdmF1bHQtdmFsaWRhdGlvbi9uby13aWtpbGlua3MnO1xuLy8gRXZlcnkgcnVsZSBhIGRpcmVjdGl2ZSBtYXkgbmFtZSwgd2l0aCB3aGF0IGEgbGluZSBicmVha2luZyBpdCBpcyBjYWxsZWQgaW4gYSBwcm9ibGVtIG1lc3NhZ2UuXG5jb25zdCBESVJFQ1RJVkVfUlVMRV9UQVJHRVRTID0gbmV3IE1hcChbXG4gIFtUUllfSVRfUlVMRSwgJ1RyeSBpdCBzZWN0aW9uIHdpdGhvdXQgYSBjb2RlIGJ1dHRvbiddLFxuICBbV0lLSUxJTktfUlVMRSwgJ3dpa2lsaW5rJ11cbl0pO1xuLy8gVGhlIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGZyb250bWF0dGVyIHBhdGgsIGF0IGFueSBpbmRlbnRhdGlvbjpcbi8vIFRoZSBrZXlzIG11c3QgbmVzdCBpbiB0aGF0IG9yZGVyLCBhbmQgYW55IGxpbmUgYmV0d2VlbiB0aGVtIGhhcyB0byBzdGF5IGluZGVudGVkLCBzbyBhIGRlZGVudCB0byB0aGVcbi8vIGRvY3VtZW50J3Mgb3duIHRvcCBsZXZlbCBlbmRzIHRoZSBtYXRjaCByYXRoZXIgdGhhbiByZWFjaGluZyBhIHNhbWUtbmFtZWQga2V5IHVuZGVyIGFub3RoZXIgcGFyZW50LlxuY29uc3QgV0lLSUxJTktfQUxMT1dBTkNFX1JFR19FWFAgPSAvXm9ic2lkaWFuLWRldi11dGlsczpbXlxcU1xcbl0qXFxuKD86W15cXFNcXG5dKy4qXFxuKSo/W15cXFNcXG5dK2RlbW8tdmF1bHQtdmFsaWRhdGlvbjpbXlxcU1xcbl0qXFxuKD86W15cXFNcXG5dKy4qXFxuKSo/W15cXFNcXG5dK2FsbG93LXdpa2lsaW5rczooPzxyZWFzb24+LiopJC9tO1xuY29uc3QgV0lLSUxJTktfUkVHX0VYUCA9IC9cXFtcXFtbXlxcXV0rXV0vO1xuXG4vLyBBcHBsaWVzIG9uZSBwYXJzZWQgZGlyZWN0aXZlIHRvIHRoZSBzY2FuLiBFYWNoIHJ1bGUga2VlcHMgaXRzIG93biByZWdpb24gYW5kIGl0cyBvd24gcGVuZGluZ1xuLy8gYGRpc2FibGUtbmV4dC1saW5lYCwgc28gYSBkaXJlY3RpdmUgZm9yIG9uZSBydWxlIG5ldmVyIGV4ZW1wdHMgYSBsaW5lIGZyb20gYW5vdGhlci5cbmZ1bmN0aW9uIGFwcGx5RGlyZWN0aXZlKHN0YXRlOiBEaXJlY3RpdmVTY2FuU3RhdGUsIGxpbmVJbmRleDogbnVtYmVyLCBtYXRjaDogUmVnRXhwRXhlY0FycmF5KTogdm9pZCB7XG4gIGNvbnN0IGFjdGlvbiA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdhY3Rpb24nKTtcbiAgY29uc3QgcnVsZSA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdydWxlJyk7XG4gIGNvbnN0IHJlYXNvbiA9IG1hdGNoLmdyb3Vwcz8uWydyZWFzb24nXT8udHJpbSgpID8/ICcnO1xuICBjb25zdCB0YXJnZXQgPSBESVJFQ1RJVkVfUlVMRV9UQVJHRVRTLmdldChydWxlKTtcbiAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYW4gdW5rbm93biBydWxlIFwiJHtydWxlfVwiIG9uICR7Zm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXgpfWApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYWN0aW9uICE9PSAnZW5hYmxlJyAmJiByZWFzb24gPT09ICcnKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXJlY3RpdmUgd2l0aCBubyByZWFzb24gb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUtbmV4dC1saW5lJykge1xuICAgIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGUuc2V0KHJ1bGUsIGxpbmVJbmRleCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3BlblJlZ2lvbiA9IHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLmdldChydWxlKTtcbiAgaWYgKGFjdGlvbiA9PT0gJ2Rpc2FibGUnKSB7XG4gICAgaWYgKG9wZW5SZWdpb24pIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIobGluZUluZGV4KX0gaW5zaWRlIHRoZSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihvcGVuUmVnaW9uLmxpbmVJbmRleCl9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLnNldChydWxlLCB7IGlzVXNlZDogZmFsc2UsIGxpbmVJbmRleCB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIW9wZW5SZWdpb24pIHtcbiAgICBzdGF0ZS5wcm9ibGVtcy5wdXNoKGBhbiBlbmFibGUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKGxpbmVJbmRleCl9IHdpdGggbm8gcmVnaW9uIG9wZW5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFvcGVuUmVnaW9uLmlzVXNlZCkge1xuICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgcmVnaW9uIG9wZW5lZCBvbiAke2Zvcm1hdExpbmVOdW1iZXIob3BlblJlZ2lvbi5saW5lSW5kZXgpfSBjb3ZlcmluZyBubyAke3RhcmdldH1gKTtcbiAgfVxuICBzdGF0ZS5vcGVuUmVnaW9uc0J5UnVsZS5kZWxldGUocnVsZSk7XG59XG5cbi8vIEFwcGxpZXMgb25lIG9yZGluYXJ5IGxpbmUgdG8gdGhlIHNjYW4sIHJ1bGUgYnkgcnVsZTogYW4gb3BlbiByZWdpb24gY292ZXJzIGl0LCBhbmQgYSBwZW5kaW5nXG4vLyBgZGlzYWJsZS1uZXh0LWxpbmVgIGNsYWltcyB0aGUgZmlyc3QgbGluZSB3aXRoIGNvbnRlbnQgb24gaXQg4oCUIHRoZSBkaXJlY3RpdmUgYW5kIGl0cyB0YXJnZXQgYXJlIHVzdWFsbHkgYVxuLy8gYmxhbmsgbGluZSBhcGFydC5cbmZ1bmN0aW9uIGFwcGx5RGlyZWN0aXZlU2NhbkxpbmUoc3RhdGU6IERpcmVjdGl2ZVNjYW5TdGF0ZSwgbGluZUluZGV4OiBudW1iZXIsIGxpbmU6IHN0cmluZyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtydWxlLCB0YXJnZXRdIG9mIERJUkVDVElWRV9SVUxFX1RBUkdFVFMpIHtcbiAgICBjb25zdCBpc1RhcmdldCA9IGVuc3VyZU5vbk51bGxhYmxlKHN0YXRlLnRhcmdldExpbmVJbmRleGVzQnlSdWxlLmdldChydWxlKSkuaGFzKGxpbmVJbmRleCk7XG4gICAgY29uc3Qgb3BlblJlZ2lvbiA9IHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLmdldChydWxlKTtcbiAgICBpZiAob3BlblJlZ2lvbikge1xuICAgICAgZ2V0T3JDcmVhdGVMaW5lSW5kZXhlcyhzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUsIHJ1bGUpLmFkZChsaW5lSW5kZXgpO1xuICAgICAgb3BlblJlZ2lvbi5pc1VzZWQgfHw9IGlzVGFyZ2V0O1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBlbmRpbmdOZXh0TGluZUluZGV4ID0gc3RhdGUucGVuZGluZ05leHRMaW5lSW5kZXhlc0J5UnVsZS5nZXQocnVsZSk7XG4gICAgaWYgKHBlbmRpbmdOZXh0TGluZUluZGV4ID09PSB1bmRlZmluZWQgfHwgbGluZS50cmltKCkgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgZ2V0T3JDcmVhdGVMaW5lSW5kZXhlcyhzdGF0ZS5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUsIHJ1bGUpLmFkZChsaW5lSW5kZXgpO1xuICAgIGlmICghaXNUYXJnZXQpIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgZGlzYWJsZS1uZXh0LWxpbmUgb24gJHtmb3JtYXRMaW5lTnVtYmVyKHBlbmRpbmdOZXh0TGluZUluZGV4KX0gY292ZXJpbmcgbm8gJHt0YXJnZXR9YCk7XG4gICAgfVxuICAgIHN0YXRlLnBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGUuZGVsZXRlKHJ1bGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWVtYmVycyhtZXRob2RzOiBzdHJpbmdbXSwgcHJvcGVydGllczogc3RyaW5nW10pOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgcmV0dXJuIHtcbiAgICBhbGw6IFsuLi5tZXRob2RzLCAuLi5wcm9wZXJ0aWVzXSxcbiAgICBtZXRob2RzLFxuICAgIHByb3BlcnRpZXNcbiAgfTtcbn1cblxuLy8gUmVzb2x2ZXMgdGhlIG5vdGVzIGEgbm90ZSBsaW5rcyB0bzogZXZlcnkgTWFya2Rvd24gbGluayBvdXRzaWRlIGEgY29kZSBmZW5jZSB3aG9zZSB0YXJnZXQgaXMgYSBgLm1kYFxuLy8gZmlsZSwgbWFkZSByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCBzbyBpdCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBub3RlIG1hcC4gRXh0ZXJuYWwgVVJMcyBhbmRcbi8vIG5vbi1ub3RlIHRhcmdldHMgKGltYWdlcywgc2NyaXB0cykgYXJlIG5vdCBwYXJ0IG9mIHRoZSBsZWFybmluZyBwYXRoIGFuZCBhcmUgc2tpcHBlZDsgYSBgI2FuY2hvcmAgaXNcbi8vIGRyb3BwZWQsIHNpbmNlIGl0IGFkZHJlc3NlcyBhIHBsYWNlIGluc2lkZSBhbiBhbHJlYWR5LXJlc29sdmVkIG5vdGUuXG4vLyBSZXR1cm5zIHRoZSBub3RlJ3MgbGluZXMgd2l0aCBmZW5jZWQgY29kZSBibG9ja3MgcmVtb3ZlZCAodGhlIGZlbmNlIGxpbmVzIGluY2x1ZGVkKSwgcGFpcmVkIHdpdGggdGhlXG4vLyBsaW5lIG51bWJlciBlYWNoIGNhbWUgZnJvbSwgc28gYSBjaGVjayBuZXZlciBtaXN0YWtlcyBzYW1wbGUgY29kZSBmb3IgcHJvc2Ug4oCUIGEgYFtbd2lraWxpbmtdXWBcbi8vIGRlbW9uc3RyYXRlZCBpbnNpZGUgYSBmZW5jZSBpcyB0ZXh0LCBub3QgbmF2aWdhdGlvbiDigJQgYW5kIGFuIGlubGluZSBkaXJlY3RpdmUgY2FuIHN0aWxsIG5hbWUgYSBsaW5lLlxuZnVuY3Rpb24gY29sbGVjdExpbmVzT3V0c2lkZUZlbmNlcyhjb250ZW50OiBzdHJpbmcpOiBOb3RlTGluZVtdIHtcbiAgY29uc3Qgbm90ZUxpbmVzOiBOb3RlTGluZVtdID0gW107XG4gIGxldCBpc0luc2lkZUZlbmNlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2luZGV4LCBsaW5lXSBvZiBjb250ZW50LnNwbGl0KCdcXG4nKS5lbnRyaWVzKCkpIHtcbiAgICBpZiAoQ09ERV9GRU5DRV9SRUdfRVhQLnRlc3QobGluZSkpIHtcbiAgICAgIGlzSW5zaWRlRmVuY2UgPSAhaXNJbnNpZGVGZW5jZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWlzSW5zaWRlRmVuY2UpIHtcbiAgICAgIG5vdGVMaW5lcy5wdXNoKHsgaW5kZXgsIGxpbmUgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBub3RlTGluZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3ROb3RlTGlua1RhcmdldHMobm90ZTogRGVtb1ZhdWx0Tm90ZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdGFyZ2V0czogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGdldExpbmVzT3V0c2lkZUZlbmNlcyhub3RlLmNvbnRlbnQpKSB7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBzdHJpcElubGluZUNvZGUobGluZSkubWF0Y2hBbGwoTUFSS0RPV05fTElOS19SRUdfRVhQKSkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3RhcmdldCcpLnJlcGxhY2VBbGwoQU5HTEVfQlJBQ0tFVFNfUkVHX0VYUCwgJycpO1xuICAgICAgY29uc3QgW25vdGVQYXRoID0gJyddID0gdGFyZ2V0LnNwbGl0KCcjJywgMSk7XG4gICAgICBpZiAoQUJTT0xVVEVfVVJMX1JFR19FWFAudGVzdChub3RlUGF0aCkgfHwgIW5vdGVQYXRoLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5tZCcpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGFyZ2V0cy5wdXNoKGpvaW4oZGlybmFtZShub3RlLnJlbGF0aXZlUGF0aCksIHRyeURlY29kZVVyaUNvbXBvbmVudChub3RlUGF0aCkpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldHM7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGNsYXNzQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmNsYXNzQm9keS5tYXRjaEFsbChuZXcgUmVnRXhwKFN0cmluZy5yYXdgXiB7Mn0oPzxtb2RpZmllcnM+JHtDTEFTU19NRU1CRVJfTU9ESUZJRVJTfSkoPzxuYW1lPlxcdyspKD86PFtePl0qPik/XFwoYCwgJ2dtJykpXVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNOb25QdWJsaWNNZW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21vZGlmaWVycycpKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RDbGFzc1Byb3BlcnR5TmFtZXMoY2xhc3NCb2R5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4uY2xhc3NCb2R5Lm1hdGNoQWxsKG5ldyBSZWdFeHAoU3RyaW5nLnJhd2BeIHsyfSg/PG1vZGlmaWVycz4ke0NMQVNTX01FTUJFUl9NT0RJRklFUlN9KSg/PG5hbWU+XFx3KylcXHMqXFw/P1xccypbOj1dYCwgJ2dtJykpXVxuICAgIC5maWx0ZXIoKG1hdGNoKSA9PiAhaXNOb25QdWJsaWNNZW1iZXIoZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ21vZGlmaWVycycpKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoZW51bUJvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5lbnVtQm9keS5tYXRjaEFsbCgvXiB7Mn0oPzxuYW1lPlxcdyspL2dtKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbi8vIEEgbWV0aG9kIGlzIGNhbGxhYmxlIHN1cmZhY2UgaG93ZXZlciBpdCBpcyB3cml0dGVuOiBhIG1ldGhvZCBzaWduYXR1cmUgKGBmb28oYmFyOiBzdHJpbmcpOiB2b2lkO2ApIG9yIGFcbi8vIHByb3BlcnR5IHNpZ25hdHVyZSB3aG9zZSB0eXBlIGlzIGEgZnVuY3Rpb24gdHlwZSAoYGZvbzogKGJhcjogc3RyaW5nKSA9PiB2b2lkO2ApLiBUaGUgc2hhcmVkIEVTTGludCBjb25maWdcbi8vIHJ1bnMgYEB0eXBlc2NyaXB0LWVzbGludC9tZXRob2Qtc2lnbmF0dXJlLXN0eWxlYCBhdCBpdHMgYHByb3BlcnR5YCBkZWZhdWx0LCBzbyBgbGludDpmaXhgIHJld3JpdGVzIHRoZVxuLy8gZmlyc3Qgc2hhcGUgaW50byB0aGUgc2Vjb25kIOKAlCByZWFkaW5nIG9ubHkgdGhlIGZpcnN0IHJlcG9ydGVkIHplcm8gbWV0aG9kcyBmb3IgZXZlcnkgc3VjaCBpbnRlcmZhY2UuXG5mdW5jdGlvbiBleHRyYWN0TWV0aG9kTmFtZXMoaW50ZXJmYWNlQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBtZXRob2RTaWduYXR1cmVOYW1lcyA9IFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/PG5hbWU+XFx3KykoPzo8W14+XSo+KT9cXCgvZ20pXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbiAgY29uc3QgZnVuY3Rpb25Qcm9wZXJ0eU5hbWVzID0gbWF0Y2hQcm9wZXJ0eVNpZ25hdHVyZXMoaW50ZXJmYWNlQm9keSlcbiAgICAuZmlsdGVyKChtYXRjaCkgPT4gaXNGdW5jdGlvblR5cGUoaW50ZXJmYWNlQm9keSwgbWF0Y2gpKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAnbmFtZScpKTtcbiAgcmV0dXJuIFsuLi5tZXRob2RTaWduYXR1cmVOYW1lcywgLi4uZnVuY3Rpb25Qcm9wZXJ0eU5hbWVzXTtcbn1cblxuLy8gRXZlcnkgcHJvcGVydHkgc2lnbmF0dXJlIHdob3NlIHR5cGUgaXMgbm90IGEgZnVuY3Rpb24gdHlwZSwgc28gbWV0aG9kcyBhbmQgcHJvcGVydGllcyBzdGF5IGEgcGFydGl0aW9uLlxuZnVuY3Rpb24gZXh0cmFjdFByb3BlcnR5TmFtZXMoaW50ZXJmYWNlQm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gbWF0Y2hQcm9wZXJ0eVNpZ25hdHVyZXMoaW50ZXJmYWNlQm9keSlcbiAgICAuZmlsdGVyKChtYXRjaCkgPT4gIWlzRnVuY3Rpb25UeXBlKGludGVyZmFjZUJvZHksIG1hdGNoKSlcbiAgICAubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ25hbWUnKSk7XG59XG5cbi8vIFRoZSBoZWFkaW5nIGxpbmVzIG9mIHRoZSBgVHJ5IGl0YCBzZWN0aW9ucyB0aGF0IGhvbGQgbm8gYGNvZGUtYnV0dG9uYC4gQSBzZWN0aW9uIHJ1bnMgdG8gdGhlIG5leHQgaGVhZGluZ1xuLy8gb2YgdGhlIHNhbWUgb3IgYSBoaWdoZXIgbGV2ZWwsIHNvIGEgYCMjIyBTdGVwIDFgIGluc2lkZSBhIGAjIyBUcnkgaXRgIHN0YXlzIHBhcnQgb2YgaXQuIEhlYWRpbmdzIGFuZFxuLy8gZmVuY2VzIGluc2lkZSBhIGZlbmNlZCBibG9jayBhcmUgc2FtcGxlIHRleHQsIHNvIG9ubHkgYSBmZW5jZSB0aGF0IE9QRU5TIGEgYmxvY2sgY2FuIGJlIHRoZSBidXR0b24uXG5mdW5jdGlvbiBmaW5kVHJ5SXRMaW5lSW5kZXhlc1dpdGhvdXRDb2RlQnV0dG9uKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgY29uc3QgbGluZUluZGV4ZXM6IG51bWJlcltdID0gW107XG4gIGxldCBzZWN0aW9uOiBudWxsIHwgVHJ5SXRTZWN0aW9uID0gbnVsbDtcbiAgbGV0IGlzSW5zaWRlRmVuY2UgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBbaW5kZXgsIGxpbmVdIG9mIGNvbnRlbnQuc3BsaXQoJ1xcbicpLmVudHJpZXMoKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgaWYgKCFpc0luc2lkZUZlbmNlICYmIHNlY3Rpb24gJiYgQ09ERV9CVVRUT05fRkVOQ0VfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICAgIHNlY3Rpb24uaGFzQ29kZUJ1dHRvbiA9IHRydWU7XG4gICAgICB9XG4gICAgICBpc0luc2lkZUZlbmNlID0gIWlzSW5zaWRlRmVuY2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaGFzaGVzID0gaXNJbnNpZGVGZW5jZSA/IHVuZGVmaW5lZCA6IEhFQURJTkdfTEVWRUxfUkVHX0VYUC5leGVjKGxpbmUpPy5ncm91cHM/LlsnaGFzaGVzJ107XG4gICAgaWYgKGhhc2hlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHNlY3Rpb24gJiYgaGFzaGVzLmxlbmd0aCA8PSBzZWN0aW9uLmxldmVsKSB7XG4gICAgICBpZiAoIXNlY3Rpb24uaGFzQ29kZUJ1dHRvbikge1xuICAgICAgICBsaW5lSW5kZXhlcy5wdXNoKHNlY3Rpb24ubGluZUluZGV4KTtcbiAgICAgIH1cbiAgICAgIHNlY3Rpb24gPSBudWxsO1xuICAgIH1cbiAgICBpZiAoIXNlY3Rpb24gJiYgVFJZX0lUX0hFQURJTkdfUkVHX0VYUC50ZXN0KGxpbmUpKSB7XG4gICAgICBzZWN0aW9uID0geyBoYXNDb2RlQnV0dG9uOiBmYWxzZSwgbGV2ZWw6IGhhc2hlcy5sZW5ndGgsIGxpbmVJbmRleDogaW5kZXggfTtcbiAgICB9XG4gIH1cbiAgaWYgKHNlY3Rpb24gJiYgIXNlY3Rpb24uaGFzQ29kZUJ1dHRvbikge1xuICAgIGxpbmVJbmRleGVzLnB1c2goc2VjdGlvbi5saW5lSW5kZXgpO1xuICB9XG4gIHJldHVybiBsaW5lSW5kZXhlcztcbn1cblxuLy8gVGhlIGxpbmUgbnVtYmVycyBjYXJyeWluZyBhIHdpa2lsaW5rIHRoYXQgaXMgbmF2aWdhdGlvbiByYXRoZXIgdGhhbiBzYW1wbGUgdGV4dC5cbmZ1bmN0aW9uIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudClcbiAgICAuZmlsdGVyKChub3RlTGluZSkgPT4gV0lLSUxJTktfUkVHX0VYUC50ZXN0KHN0cmlwSW5saW5lQ29kZShub3RlTGluZS5saW5lKSkpXG4gICAgLm1hcCgobm90ZUxpbmUpID0+IG5vdGVMaW5lLmluZGV4KTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGluZU51bWJlcihsaW5lSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgbGluZSAke1N0cmluZyhsaW5lSW5kZXggKyAxKX1gO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUcnlJdFdhcm5pbmcoc2VjdGlvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICBgZGVtby12YXVsdCBjb3ZlcmFnZTogJHtTdHJpbmcoc2VjdGlvbnMubGVuZ3RoKX0gVHJ5IGl0IHNlY3Rpb24ocykgaGF2ZSBubyBjb2RlLWJ1dHRvbiB0byBwZXJmb3JtIHRoZWlyIHNldHVwLmAsXG4gICAgYEFkZCBvbmUsIG9yIHN0YXRlIHdoeSB0aGUgc3RlcHMgY2Fubm90IGJlIHNjcmlwdGVkIHdpdGggPCEtLSBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZS1uZXh0LWxpbmUgJHtUUllfSVRfUlVMRX0gLS0gPHJlYXNvbj4gLS0+IGFib3ZlIHRoZSBoZWFkaW5nLmAsXG4gICAgLi4uc2VjdGlvbnMubWFwKChzZWN0aW9uKSA9PiBgICAke3NlY3Rpb259YClcbiAgXS5qb2luKCdcXG4nKTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxsb3dlZExpbmVJbmRleGVzKHNjYW46IERpcmVjdGl2ZVNjYW4sIHJ1bGU6IHN0cmluZyk6IFJlYWRvbmx5U2V0PG51bWJlcj4ge1xuICByZXR1cm4gc2Nhbi5hbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGUuZ2V0KHJ1bGUpID8/IG5ldyBTZXQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0TGluZXNPdXRzaWRlRmVuY2VzKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudCkubWFwKChub3RlTGluZSkgPT4gbm90ZUxpbmUubGluZSk7XG59XG5cbmZ1bmN0aW9uIGdldE9yQ3JlYXRlTGluZUluZGV4ZXMobGluZUluZGV4ZXNCeVJ1bGU6IE1hcDxzdHJpbmcsIFNldDxudW1iZXI+PiwgcnVsZTogc3RyaW5nKTogU2V0PG51bWJlcj4ge1xuICBsZXQgbGluZUluZGV4ZXMgPSBsaW5lSW5kZXhlc0J5UnVsZS5nZXQocnVsZSk7XG4gIGlmICghbGluZUluZGV4ZXMpIHtcbiAgICBsaW5lSW5kZXhlcyA9IG5ldyBTZXQoKTtcbiAgICBsaW5lSW5kZXhlc0J5UnVsZS5zZXQocnVsZSwgbGluZUluZGV4ZXMpO1xuICB9XG4gIHJldHVybiBsaW5lSW5kZXhlcztcbn1cblxuLy8gV2hldGhlciB0aGUgbm90ZSdzIGZpcnN0IGNvbnRlbnQgbGluZSAoZnJvbnRtYXR0ZXIgYW5kIGJsYW5rIGxpbmVzIGFzaWRlKSBpcyBhbiBgIyBIMWAuXG5mdW5jdGlvbiBoYXNIMShjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudCkuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKTtcbiAgICBpZiAodHJpbW1lZExpbmUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIEgxX1JFR19FWFAudGVzdCh0cmltbWVkTGluZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIGEgcGxhaW4gcHJvc2UgbGluZSBhcHBlYXJzIGJlZm9yZSB0aGUgbm90ZSdzIGZpcnN0IGNvZGUgZmVuY2UuIEhlYWRpbmdzIGFyZSBub3QgcHJvc2Ug4oCUIGEgbm90ZVxuLy8gdGhhdCBnb2VzIHN0cmFpZ2h0IGZyb20gaXRzIHRpdGxlIHRvIGEgYnV0dG9uIGlzIGV4YWN0bHkgdGhlIHNoYXBlIHRoaXMgY2hlY2sgcmVqZWN0cy5cbmZ1bmN0aW9uIGhhc0ludHJvUHJvc2UoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBzdHJpcEZyb250bWF0dGVyKGNvbnRlbnQpLnNwbGl0KCdcXG4nKSkge1xuICAgIGlmIChDT0RFX0ZFTkNFX1JFR19FWFAudGVzdChsaW5lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0cmltbWVkTGluZSA9IGxpbmUudHJpbSgpO1xuICAgIGlmICh0cmltbWVkTGluZSA9PT0gJycgfHwgSEVBRElOR19SRUdfRVhQLnRlc3QodHJpbW1lZExpbmUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBXaGV0aGVyIHRoZSBub3RlIG5hdmlnYXRlcyB3aXRoIGFuIE9ic2lkaWFuIGBbW3dpa2lsaW5rXV1gLiBGZW5jZWQgYmxvY2tzIGFuZCBpbmxpbmUgY29kZSBhcmUgc2FtcGxlXG4vLyB0ZXh0IHJhdGhlciB0aGFuIG5hdmlnYXRpb24sIHNvIHRoZXkgYXJlIHJlbW92ZWQgYmVmb3JlIGxvb2tpbmcuXG5mdW5jdGlvbiBoYXNXaWtpbGluayhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpLmxlbmd0aCA+IDA7XG59XG5cbi8vIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNpZ25hdHVyZSdzIHR5cGUsIHN0YXJ0aW5nIHJpZ2h0IGFmdGVyIGl0cyBgOmAsIGlzIGEgZnVuY3Rpb24gdHlwZTogYW4gb3B0aW9uYWwgdHlwZVxuLy8gcGFyYW1ldGVyIGxpc3QsIGEgcGFyYW1ldGVyIGxpc3QsIHRoZW4gYD0+YC4gVGhlIHBhcmFtZXRlciBsaXN0IGlzIHdhbGtlZCBieSBicmFja2V0IGRlcHRoIHJhdGhlciB0aGFuIGJ5IGFcbi8vIHJlZ3VsYXIgZXhwcmVzc2lvbiwgc28gYSBwYXJlbnRoZXNpemVkIG5vbi1mdW5jdGlvbiB0eXBlIChgKHN0cmluZyB8IG51bWJlcilbXWApIGFuZCBhIHBhcmFtZXRlciB3aG9zZSBvd25cbi8vIHR5cGUgaG9sZHMgcGFyZW50aGVzZXMgKGAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWRgKSBhcmUgYm90aCByZWFkIGNvcnJlY3RseSwgYWNyb3NzIGxpbmVzIHRvby5cbmZ1bmN0aW9uIGlzRnVuY3Rpb25UeXBlKGludGVyZmFjZUJvZHk6IHN0cmluZywgbWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSk6IGJvb2xlYW4ge1xuICBsZXQgaW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgaW5kZXggKz0gRlVOQ1RJT05fVFlQRV9QQVJBTUVURVJTX1JFR19FWFAuZXhlYyhpbnRlcmZhY2VCb2R5LnNsaWNlKGluZGV4KSk/LlswXS5sZW5ndGggPz8gMDtcbiAgaWYgKGludGVyZmFjZUJvZHlbaW5kZXhdICE9PSAnKCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGRlcHRoID0gMDtcbiAgZm9yICg7IGluZGV4IDwgaW50ZXJmYWNlQm9keS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSBpbnRlcmZhY2VCb2R5W2luZGV4XTtcbiAgICBpZiAoY2hhcmFjdGVyID09PSAnKCcpIHtcbiAgICAgIGRlcHRoKys7XG4gICAgfSBlbHNlIGlmIChjaGFyYWN0ZXIgPT09ICcpJykge1xuICAgICAgZGVwdGgtLTtcbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQVJST1dfUkVHX0VYUC50ZXN0KGludGVyZmFjZUJvZHkuc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNOb25QdWJsaWNNZW1iZXIobW9kaWZpZXJzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9cXGIoPzpwcml2YXRlfHByb3RlY3RlZClcXGIvLnRlc3QobW9kaWZpZXJzKTtcbn1cblxuLy8gYHJlYWRvbmx5YCBpcyB0aGUgb25seSBtb2RpZmllciBhIHByb3BlcnR5IHNpZ25hdHVyZSB0YWtlcywgYW5kIGEgbWV0aG9kIHNpZ25hdHVyZSB0YWtlcyBub25lIOKAlCBUeXBlU2NyaXB0XG4vLyByZWplY3RzIGByZWFkb25seSBmb28oKTogdm9pZDtgIOKAlCBzbyB0aGUgbWV0aG9kLXNpZ25hdHVyZSByZWdleCBuZWVkcyBubyBjb3VudGVycGFydC5cbmZ1bmN0aW9uIG1hdGNoUHJvcGVydHlTaWduYXR1cmVzKGludGVyZmFjZUJvZHk6IHN0cmluZyk6IFJlZ0V4cEV4ZWNBcnJheVtdIHtcbiAgcmV0dXJuIFsuLi5pbnRlcmZhY2VCb2R5Lm1hdGNoQWxsKC9eIHsyfSg/OnJlYWRvbmx5XFxzKyk/KD88bmFtZT5cXHcrKVxcPz86XFxzKi9nbSldO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1lbWJlcnMoa2V5d29yZDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBJbnRlcmZhY2VNZW1iZXJzIHtcbiAgc3dpdGNoIChrZXl3b3JkKSB7XG4gICAgY2FzZSAnY2xhc3MnOiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RDbGFzc01ldGhvZE5hbWVzKGJvZHkpLCBleHRyYWN0Q2xhc3NQcm9wZXJ0eU5hbWVzKGJvZHkpKTtcbiAgICB9XG4gICAgY2FzZSAnZW51bSc6IHtcbiAgICAgIHJldHVybiBidWlsZE1lbWJlcnMoW10sIGV4dHJhY3RFbnVtTWVtYmVyTmFtZXMoYm9keSkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gYnVpbGRNZW1iZXJzKGV4dHJhY3RNZXRob2ROYW1lcyhib2R5KSwgZXh0cmFjdFByb3BlcnR5TmFtZXMoYm9keSkpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBSZWFkcyB0aGUgbm90ZSdzIGBvYnNpZGlhbi1kZXYtdXRpbHMgPiBkZW1vLXZhdWx0LXZhbGlkYXRpb24gPiBhbGxvdy13aWtpbGlua3NgIGRlY2xhcmF0aW9uOiB0aGUgc3RhdGVkXG4vLyByZWFzb24sIGAnJ2Agd2hlbiB0aGUga2V5IGlzIHByZXNlbnQgd2l0aCBub3RoaW5nIGFmdGVyIGl0LCBvciBgbnVsbGAgd2hlbiB0aGUgbm90ZSBkZWNsYXJlcyBub3RoaW5nLlxuLy8gUmVhZCB3aXRoIGEgcmVndWxhciBleHByZXNzaW9uIHJhdGhlciB0aGFuIGEgWUFNTCBwYXJzZXI6IGl0IGlzIG9uZSBrbm93biBrZXkgcGF0aCwgYW5kIGV2ZXJ5IHBsdWdpbiB0aGF0XG4vLyBpbnN0YWxscyB0aGlzIHBhY2thZ2Ugd291bGQgb3RoZXJ3aXNlIGNhcnJ5IGEgWUFNTCBkZXBlbmRlbmN5IGZvciBpdC5cbmZ1bmN0aW9uIHJlYWRXaWtpbGlua0FsbG93YW5jZVJlYXNvbihjb250ZW50OiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3QgZnJvbnRtYXR0ZXIgPSBGUk9OVE1BVFRFUl9SRUdfRVhQLmV4ZWMoY29udGVudCk/LlswXTtcbiAgaWYgKGZyb250bWF0dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCByZWFzb24gPSBXSUtJTElOS19BTExPV0FOQ0VfUkVHX0VYUC5leGVjKGZyb250bWF0dGVyKT8uZ3JvdXBzPy5bJ3JlYXNvbiddO1xuICByZXR1cm4gcmVhc29uID09PSB1bmRlZmluZWQgPyBudWxsIDogcmVhc29uLnRyaW0oKS5yZXBsYWNlKC9eKD88cXVvdGU+W1wiJ10pKD88dmFsdWU+W1xcc1xcU10qKVxcazxxdW90ZT4kLywgJyQ8dmFsdWU+Jyk7XG59XG5cbi8vIFJlYWRzIHRoZSBub3RlJ3MgaW5saW5lIGBvYnNpZGlhbi1kZXYtdXRpbHMtZGlzYWJsZeKApmAgZGlyZWN0aXZlcywgcmV0dXJuaW5nIHdoaWNoIGxpbmVzIHRoZXkgZXhlbXB0IGZyb21cbi8vIGVhY2ggcnVsZSBhbmQgZXZlcnl0aGluZyB3cm9uZyB3aXRoIHRoZW0uIEEgc3VwcHJlc3Npb24gdGhhdCBxdWlldGx5IGRvZXMgbm90aGluZyBpcyB3b3JzZSB0aGFuIG5vbmUsIHNvXG4vLyBhIG1pc3NwZWxsZWQgZGlyZWN0aXZlLCBvbmUgd2l0aCBubyByZWFzb24sIGFuIHVuY2xvc2VkIHJlZ2lvbiBhbmQgb25lIGNvdmVyaW5nIG5vdGhpbmcgdGhhdCBicmVha3MgaXRzXG4vLyBydWxlIGFyZSBlYWNoIHJlcG9ydGVkIHJhdGhlciB0aGFuIGlnbm9yZWQuXG5mdW5jdGlvbiBzY2FuRGlyZWN0aXZlcyhjb250ZW50OiBzdHJpbmcpOiBEaXJlY3RpdmVTY2FuIHtcbiAgY29uc3Qgc3RhdGU6IERpcmVjdGl2ZVNjYW5TdGF0ZSA9IHtcbiAgICBhbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoKSxcbiAgICBvcGVuUmVnaW9uc0J5UnVsZTogbmV3IE1hcCgpLFxuICAgIHBlbmRpbmdOZXh0TGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoKSxcbiAgICBwcm9ibGVtczogW10sXG4gICAgdGFyZ2V0TGluZUluZGV4ZXNCeVJ1bGU6IG5ldyBNYXAoW1xuICAgICAgW1RSWV9JVF9SVUxFLCBuZXcgU2V0KGZpbmRUcnlJdExpbmVJbmRleGVzV2l0aG91dENvZGVCdXR0b24oY29udGVudCkpXSxcbiAgICAgIFtXSUtJTElOS19SVUxFLCBuZXcgU2V0KGZpbmRXaWtpbGlua0xpbmVJbmRleGVzKGNvbnRlbnQpKV1cbiAgICBdKVxuICB9O1xuXG4gIGZvciAoY29uc3QgeyBpbmRleCwgbGluZSB9IG9mIGNvbGxlY3RMaW5lc091dHNpZGVGZW5jZXMoY29udGVudCkpIHtcbiAgICBjb25zdCBtYXRjaCA9IERJUkVDVElWRV9SRUdfRVhQLmV4ZWMobGluZSk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBhcHBseURpcmVjdGl2ZShzdGF0ZSwgaW5kZXgsIG1hdGNoKTtcbiAgICB9IGVsc2UgaWYgKERJUkVDVElWRV9QUk9CRV9SRUdfRVhQLnRlc3QobGluZSkpIHtcbiAgICAgIHN0YXRlLnByb2JsZW1zLnB1c2goYGEgbWFsZm9ybWVkIGRpcmVjdGl2ZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIoaW5kZXgpfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcHBseURpcmVjdGl2ZVNjYW5MaW5lKHN0YXRlLCBpbmRleCwgbGluZSk7XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBvcGVuUmVnaW9uIG9mIHN0YXRlLm9wZW5SZWdpb25zQnlSdWxlLnZhbHVlcygpKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSByZWdpb24gb3BlbmVkIG9uICR7Zm9ybWF0TGluZU51bWJlcihvcGVuUmVnaW9uLmxpbmVJbmRleCl9IHRoYXQgaXMgbmV2ZXIgZW5hYmxlZCBhZ2FpbmApO1xuICB9XG4gIGZvciAoY29uc3QgW3J1bGUsIHBlbmRpbmdOZXh0TGluZUluZGV4XSBvZiBzdGF0ZS5wZW5kaW5nTmV4dExpbmVJbmRleGVzQnlSdWxlKSB7XG4gICAgc3RhdGUucHJvYmxlbXMucHVzaChgYSBkaXNhYmxlLW5leHQtbGluZSBvbiAke2Zvcm1hdExpbmVOdW1iZXIocGVuZGluZ05leHRMaW5lSW5kZXgpfSBjb3ZlcmluZyBubyAke2Vuc3VyZU5vbk51bGxhYmxlKERJUkVDVElWRV9SVUxFX1RBUkdFVFMuZ2V0KHJ1bGUpKX1gKTtcbiAgfVxuICByZXR1cm4geyBhbGxvd2VkTGluZUluZGV4ZXNCeVJ1bGU6IHN0YXRlLmFsbG93ZWRMaW5lSW5kZXhlc0J5UnVsZSwgcHJvYmxlbXM6IHN0YXRlLnByb2JsZW1zIH07XG59XG5cbmZ1bmN0aW9uIHN0cmlwRnJvbnRtYXR0ZXIoY29udGVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbnRlbnQucmVwbGFjZShGUk9OVE1BVFRFUl9SRUdfRVhQLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHN0cmlwSW5saW5lQ29kZShsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbGluZS5yZXBsYWNlQWxsKElOTElORV9DT0RFX1JFR19FWFAsICcnKTtcbn1cblxuLy8gQSBoYW5kLXdyaXR0ZW4gbGluayBtYXkgY29udGFpbiBhIGJhcmUgYCVgIChvciBhbnkgb3RoZXIgaW52YWxpZCBwZXJjZW50LWVzY2FwZSksIHdoaWNoIG1ha2VzXG4vLyBgZGVjb2RlVVJJQ29tcG9uZW50YCB0aHJvdy4gU3VjaCBhIHRhcmdldCBpcyBtZWFudCBsaXRlcmFsbHksIHNvIGl0IGlzIHVzZWQgYXMgd3JpdHRlbi5cbmZ1bmN0aW9uIHRyeURlY29kZVVyaUNvbXBvbmVudCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50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
|