@rusticarcade/palette 0.1.0-rc.5 → 0.2.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/README.md +2 -4
- package/dist/dev/index.js +165 -112
- package/dist/prod/index.d.ts +5 -10
- package/dist/prod/index.js +2 -2
- package/package.json +2 -2
package/dist/dev/index.js
CHANGED
|
@@ -431,6 +431,12 @@ var ArrayMutatorFunctions = new Set([
|
|
|
431
431
|
"fill",
|
|
432
432
|
"copyWithin"
|
|
433
433
|
]);
|
|
434
|
+
var DataStructureMutatorFunctions = new Set([
|
|
435
|
+
"add",
|
|
436
|
+
"delete",
|
|
437
|
+
"clear",
|
|
438
|
+
"set"
|
|
439
|
+
]);
|
|
434
440
|
|
|
435
441
|
class State {
|
|
436
442
|
_data;
|
|
@@ -471,8 +477,9 @@ optimal performance (Warning while evaluating live access to ${path.join(".")})
|
|
|
471
477
|
return obj[key];
|
|
472
478
|
}
|
|
473
479
|
const value = obj[key];
|
|
474
|
-
if (Array.isArray(obj) && typeof value === "function") {
|
|
475
|
-
const
|
|
480
|
+
if ((obj instanceof Set || obj instanceof Map || Array.isArray(obj)) && typeof value === "function") {
|
|
481
|
+
const mutationFns = Array.isArray(obj) ? ArrayMutatorFunctions : DataStructureMutatorFunctions;
|
|
482
|
+
const isMutation = mutationFns.has(key);
|
|
476
483
|
return (...args) => {
|
|
477
484
|
const snapshot = this.snapshot();
|
|
478
485
|
let current = snapshot;
|
|
@@ -728,32 +735,49 @@ function isBoundAttribute(attrName) {
|
|
|
728
735
|
}
|
|
729
736
|
return true;
|
|
730
737
|
}
|
|
738
|
+
var PREFIX_MAPPING = {
|
|
739
|
+
["@" /* Attributes */]: "attr",
|
|
740
|
+
["$" /* State */]: "state",
|
|
741
|
+
["*" /* Data */]: "data",
|
|
742
|
+
["#" /* Item */]: "item"
|
|
743
|
+
};
|
|
744
|
+
var prefixMapping = new Map(Object.entries(PREFIX_MAPPING));
|
|
731
745
|
function parseNotation(notation) {
|
|
732
|
-
let workingNotation = notation;
|
|
733
746
|
let notModifier = false;
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
747
|
+
let pathPart = "";
|
|
748
|
+
const computedPath = [];
|
|
749
|
+
let isFirst = true;
|
|
750
|
+
for (const char of notation) {
|
|
751
|
+
if (isFirst && char === "!") {
|
|
752
|
+
notModifier = true;
|
|
753
|
+
} else if (isFirst) {
|
|
754
|
+
const prefix = prefixMapping.get(char);
|
|
755
|
+
if (!prefix) {
|
|
756
|
+
throw new PaletteError(201 /* TEMPLATE_INVALID_NOTATION */, notation);
|
|
757
|
+
}
|
|
758
|
+
computedPath.push(prefix);
|
|
759
|
+
isFirst = false;
|
|
760
|
+
} else if (char === ".") {
|
|
761
|
+
if (pathPart.length) {
|
|
762
|
+
computedPath.push(pathPart);
|
|
763
|
+
pathPart = "";
|
|
764
|
+
} else {
|
|
765
|
+
throw new PaletteError(201 /* TEMPLATE_INVALID_NOTATION */, notation);
|
|
766
|
+
}
|
|
767
|
+
} else {
|
|
768
|
+
pathPart += char;
|
|
769
|
+
}
|
|
749
770
|
}
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
771
|
+
if (!pathPart.length) {
|
|
772
|
+
throw new PaletteError(201 /* TEMPLATE_INVALID_NOTATION */, notation);
|
|
773
|
+
}
|
|
774
|
+
computedPath.push(pathPart);
|
|
775
|
+
if (computedPath.length < 2) {
|
|
776
|
+
throw new PaletteError(201 /* TEMPLATE_INVALID_NOTATION */, notation);
|
|
753
777
|
}
|
|
754
778
|
return {
|
|
755
779
|
base: notation,
|
|
756
|
-
path,
|
|
780
|
+
path: computedPath,
|
|
757
781
|
modifiers: notModifier ? { not: true } : undefined
|
|
758
782
|
};
|
|
759
783
|
}
|
|
@@ -768,14 +792,14 @@ function buildValueAccessor(notation) {
|
|
|
768
792
|
throw new PaletteError(0 /* INVARIANT */);
|
|
769
793
|
}
|
|
770
794
|
return (source) => {
|
|
795
|
+
const value = source?.[firstKey]?.[secondKey] ?? null;
|
|
771
796
|
if (modifiers?.not) {
|
|
772
|
-
const value = source?.[firstKey]?.[secondKey] ?? null;
|
|
773
797
|
if (firstKey === "attr") {
|
|
774
798
|
return value !== "" && !value;
|
|
775
799
|
}
|
|
776
800
|
return !value;
|
|
777
801
|
}
|
|
778
|
-
return
|
|
802
|
+
return value;
|
|
779
803
|
};
|
|
780
804
|
}
|
|
781
805
|
if (path.length === 3) {
|
|
@@ -784,14 +808,14 @@ function buildValueAccessor(notation) {
|
|
|
784
808
|
throw new PaletteError(0 /* INVARIANT */);
|
|
785
809
|
}
|
|
786
810
|
return (source) => {
|
|
811
|
+
const value = source?.[firstKey]?.[secondKey]?.[thirdKey] ?? null;
|
|
787
812
|
if (modifiers?.not) {
|
|
788
|
-
const value = source?.[firstKey]?.[secondKey]?.[thirdKey] ?? null;
|
|
789
813
|
if (firstKey === "attr") {
|
|
790
814
|
return value !== "" && !value;
|
|
791
815
|
}
|
|
792
816
|
return !value;
|
|
793
817
|
}
|
|
794
|
-
return
|
|
818
|
+
return value;
|
|
795
819
|
};
|
|
796
820
|
}
|
|
797
821
|
return (source) => {
|
|
@@ -827,7 +851,7 @@ function collectOperableNodes(fragment) {
|
|
|
827
851
|
let parent = currentNode.parentNode;
|
|
828
852
|
let isInList = false;
|
|
829
853
|
while (parent && !isInList) {
|
|
830
|
-
if (knownIgnores.has(parent) || parent instanceof HTMLElement && parent.hasAttribute("::each")) {
|
|
854
|
+
if (knownIgnores.has(parent) || parent instanceof HTMLElement && parent.hasAttribute("::each" /* Each */)) {
|
|
831
855
|
isInList = true;
|
|
832
856
|
knownIgnores.add(currentNode);
|
|
833
857
|
break;
|
|
@@ -870,22 +894,22 @@ function compileTemplate(source) {
|
|
|
870
894
|
parsedNotations.set(attributeValue, notation);
|
|
871
895
|
}
|
|
872
896
|
node.removeAttribute(attributeName);
|
|
873
|
-
if (attributeName === "::key") {
|
|
897
|
+
if (attributeName === "::key" /* Key */) {
|
|
874
898
|
continue;
|
|
875
899
|
}
|
|
876
|
-
if (attributeName === "::tag") {
|
|
900
|
+
if (attributeName === "::tag" /* Tag */) {
|
|
877
901
|
schemes.push({
|
|
878
902
|
type: "tag",
|
|
879
903
|
notation,
|
|
880
904
|
nodeRef: ensureNodeRef(node)
|
|
881
905
|
});
|
|
882
|
-
} else if (attributeName === "::each") {
|
|
906
|
+
} else if (attributeName === "::each" /* Each */) {
|
|
883
907
|
const nodeRef = ensureNodeRef(node);
|
|
884
|
-
const keyNotation = node.getAttribute("::key");
|
|
908
|
+
const keyNotation = node.getAttribute("::key" /* Key */);
|
|
885
909
|
if (keyNotation === null) {
|
|
886
910
|
throw new PaletteError(206 /* TEMPLATE_MISSING_LIST_KEY */);
|
|
887
911
|
}
|
|
888
|
-
node.removeAttribute("::key");
|
|
912
|
+
node.removeAttribute("::key" /* Key */);
|
|
889
913
|
const listContentHtml = node.innerHTML;
|
|
890
914
|
while (node.firstChild) {
|
|
891
915
|
node.removeChild(node.firstChild);
|
|
@@ -898,7 +922,7 @@ function compileTemplate(source) {
|
|
|
898
922
|
listContentHtml
|
|
899
923
|
};
|
|
900
924
|
schemes.push(scheme);
|
|
901
|
-
} else if (attributeName === "::swap") {
|
|
925
|
+
} else if (attributeName === "::swap" /* Swap */) {
|
|
902
926
|
const scheme = {
|
|
903
927
|
type: "swap",
|
|
904
928
|
notation,
|
|
@@ -1350,6 +1374,26 @@ class Template {
|
|
|
1350
1374
|
}
|
|
1351
1375
|
// src/component/delegator.ts
|
|
1352
1376
|
class EventDelegator {
|
|
1377
|
+
static nextListenerId = 0;
|
|
1378
|
+
static processTargetDescriptor(targetDescriptor) {
|
|
1379
|
+
if (targetDescriptor instanceof HTMLElement) {
|
|
1380
|
+
if (targetDescriptor.id.length) {
|
|
1381
|
+
return `#${targetDescriptor.id}`;
|
|
1382
|
+
} else {
|
|
1383
|
+
const generatedId = `listen-${EventDelegator.nextListenerId++}`;
|
|
1384
|
+
targetDescriptor.setAttribute("data-listener-id", generatedId);
|
|
1385
|
+
return `[data-listener-id="${generatedId}"]`;
|
|
1386
|
+
}
|
|
1387
|
+
} else if (typeof targetDescriptor === "function") {
|
|
1388
|
+
if (true) {
|
|
1389
|
+
if (targetDescriptor.tagName.length === 0) {
|
|
1390
|
+
console.warn(`[Component] Automatic listener setup failure: Component ${targetDescriptor.name} has no defined tagname`);
|
|
1391
|
+
}
|
|
1392
|
+
}
|
|
1393
|
+
return targetDescriptor.tagName;
|
|
1394
|
+
}
|
|
1395
|
+
return targetDescriptor;
|
|
1396
|
+
}
|
|
1353
1397
|
_root;
|
|
1354
1398
|
_rootListeners = new Map;
|
|
1355
1399
|
_events = new Map;
|
|
@@ -1474,7 +1518,6 @@ class Component extends HTMLElement {
|
|
|
1474
1518
|
_delegator;
|
|
1475
1519
|
_ownListeners = new Set;
|
|
1476
1520
|
_liveAttributeConfigs = new Map;
|
|
1477
|
-
_nextListenerAutoId = 0;
|
|
1478
1521
|
_cleanupFn;
|
|
1479
1522
|
_renderInternals = {
|
|
1480
1523
|
willRender: false,
|
|
@@ -1493,25 +1536,32 @@ class Component extends HTMLElement {
|
|
|
1493
1536
|
this._template = template2 instanceof Template ? template2 : new Template(template2);
|
|
1494
1537
|
}
|
|
1495
1538
|
_getRenderContext(attr) {
|
|
1496
|
-
const data = typeof this.computedProperties === "function" ? this.computedProperties() : this.computedProperties;
|
|
1497
|
-
const state = this.initialState ? this._safeGetState().current : undefined;
|
|
1498
1539
|
return {
|
|
1499
|
-
data,
|
|
1500
1540
|
attr: Object.fromEntries(attr),
|
|
1501
|
-
|
|
1541
|
+
data: typeof this.computedProperties === "function" ? this.computedProperties() : this.computedProperties,
|
|
1542
|
+
state: this._state ? this._state.current : undefined
|
|
1502
1543
|
};
|
|
1503
1544
|
}
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1545
|
+
_escalateError(error) {
|
|
1546
|
+
let node = this.parentNode;
|
|
1547
|
+
while (node) {
|
|
1548
|
+
if (node instanceof Component && "onError" in node && typeof node.onError === "function") {
|
|
1549
|
+
node.onError(error);
|
|
1550
|
+
return;
|
|
1551
|
+
} else if (node instanceof ShadowRoot) {
|
|
1552
|
+
node = node.host;
|
|
1553
|
+
} else {
|
|
1554
|
+
node = node.parentNode;
|
|
1555
|
+
}
|
|
1507
1556
|
}
|
|
1508
|
-
|
|
1557
|
+
throw error;
|
|
1509
1558
|
}
|
|
1510
1559
|
_reportError(error) {
|
|
1511
1560
|
if (!this.onError) {
|
|
1512
|
-
|
|
1561
|
+
this._escalateError(error);
|
|
1562
|
+
} else {
|
|
1563
|
+
this.onError(error);
|
|
1513
1564
|
}
|
|
1514
|
-
this.onError(error);
|
|
1515
1565
|
}
|
|
1516
1566
|
_executeAttributeChangeHandlers = () => {
|
|
1517
1567
|
const prevAttrs = this._renderInternals.lastRenderedAttributeMap;
|
|
@@ -1551,11 +1601,11 @@ class Component extends HTMLElement {
|
|
|
1551
1601
|
this._renderInternals.willRender = false;
|
|
1552
1602
|
this._executeAttributeChangeHandlers();
|
|
1553
1603
|
const prevAttrs = this._renderInternals.lastRenderedAttributeMap;
|
|
1554
|
-
this.beforeUpdate?.
|
|
1604
|
+
this.beforeUpdate?.();
|
|
1555
1605
|
const newAttributes = createAttributeMap(this);
|
|
1556
1606
|
this._template.render(this.root, this._getRenderContext(newAttributes));
|
|
1557
1607
|
this._renderInternals.lastRenderedAttributeMap = newAttributes;
|
|
1558
|
-
this.afterUpdate?.
|
|
1608
|
+
this.afterUpdate?.(prevAttrs);
|
|
1559
1609
|
this._reflectLiveAttributes();
|
|
1560
1610
|
if (this._renderInternals.postRenderCallbacks.size) {
|
|
1561
1611
|
const callbacks = Array.from(this._renderInternals.postRenderCallbacks);
|
|
@@ -1591,6 +1641,9 @@ class Component extends HTMLElement {
|
|
|
1591
1641
|
requestAnimationFrame(this._performUpdate);
|
|
1592
1642
|
};
|
|
1593
1643
|
_adoptState(state) {
|
|
1644
|
+
if (Object.is(this._state, state)) {
|
|
1645
|
+
return;
|
|
1646
|
+
}
|
|
1594
1647
|
if (this._state) {
|
|
1595
1648
|
this._state.removeListener(this._scheduleUpdate);
|
|
1596
1649
|
this._scheduleUpdate();
|
|
@@ -1604,42 +1657,49 @@ class Component extends HTMLElement {
|
|
|
1604
1657
|
if (this._isComponentMounted) {
|
|
1605
1658
|
return;
|
|
1606
1659
|
}
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
const
|
|
1612
|
-
this.
|
|
1660
|
+
queueMicrotask(() => {
|
|
1661
|
+
try {
|
|
1662
|
+
this._renderInternals.isRendering = true;
|
|
1663
|
+
this._renderInternals.willRender = false;
|
|
1664
|
+
const attributes2 = createAttributeMap(this);
|
|
1665
|
+
this._liveAttributeConfigs = new Map(Object.entries(this.liveAttributes ?? {}));
|
|
1666
|
+
if (this.initialState) {
|
|
1667
|
+
const init = typeof this.initialState === "object" ? this.initialState : this.initialState();
|
|
1668
|
+
this._adoptState(init);
|
|
1669
|
+
}
|
|
1670
|
+
this._template.render(this.root, this._getRenderContext(attributes2));
|
|
1671
|
+
this._reflectLiveAttributes();
|
|
1672
|
+
this._renderInternals.lastRenderedAttributeMap = attributes2;
|
|
1673
|
+
this._isComponentMounted = true;
|
|
1674
|
+
this._cleanupFn = this.script?.() ?? undefined;
|
|
1675
|
+
} catch (error) {
|
|
1676
|
+
this._reportError(error);
|
|
1677
|
+
} finally {
|
|
1678
|
+
this._renderInternals.isRendering = false;
|
|
1613
1679
|
}
|
|
1614
|
-
|
|
1615
|
-
this._reflectLiveAttributes();
|
|
1616
|
-
this._renderInternals.lastRenderedAttributeMap = attributes2;
|
|
1617
|
-
this._isComponentMounted = true;
|
|
1618
|
-
this._cleanupFn = this.script?.call(this) ?? undefined;
|
|
1619
|
-
} catch (error) {
|
|
1620
|
-
this._reportError(error);
|
|
1621
|
-
}
|
|
1680
|
+
});
|
|
1622
1681
|
}
|
|
1623
1682
|
disconnectedCallback() {
|
|
1624
1683
|
queueMicrotask(() => {
|
|
1625
|
-
if (
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1684
|
+
if (this.isConnected || !this._isComponentMounted) {
|
|
1685
|
+
return;
|
|
1686
|
+
}
|
|
1687
|
+
try {
|
|
1688
|
+
this._delegator?.cleanup();
|
|
1689
|
+
if (this._ownListeners.size > 0) {
|
|
1690
|
+
for (const listener of this._ownListeners) {
|
|
1691
|
+
this.removeEventListener(listener.event, listener.handler);
|
|
1632
1692
|
}
|
|
1633
|
-
|
|
1634
|
-
|
|
1693
|
+
}
|
|
1694
|
+
this._cleanupFn?.();
|
|
1695
|
+
this._isComponentMounted = false;
|
|
1696
|
+
} catch (error) {
|
|
1697
|
+
this._reportError(error);
|
|
1698
|
+
} finally {
|
|
1699
|
+
try {
|
|
1700
|
+
this.finalize?.();
|
|
1635
1701
|
} catch (error) {
|
|
1636
1702
|
this._reportError(error);
|
|
1637
|
-
} finally {
|
|
1638
|
-
try {
|
|
1639
|
-
this.finalize?.call(this);
|
|
1640
|
-
} catch (error) {
|
|
1641
|
-
this._reportError(error);
|
|
1642
|
-
}
|
|
1643
1703
|
}
|
|
1644
1704
|
}
|
|
1645
1705
|
});
|
|
@@ -1660,23 +1720,19 @@ class Component extends HTMLElement {
|
|
|
1660
1720
|
return this._root;
|
|
1661
1721
|
}
|
|
1662
1722
|
get state() {
|
|
1663
|
-
return this._safeGetState().live;
|
|
1664
|
-
}
|
|
1665
|
-
set state(newState) {
|
|
1666
1723
|
if (!this._state) {
|
|
1667
1724
|
throw new PaletteError(301 /* MISSING_STATE */);
|
|
1668
|
-
} else if (newState instanceof State) {
|
|
1669
|
-
this._state = newState;
|
|
1670
|
-
this._state.addListener(() => {
|
|
1671
|
-
this.requestRender();
|
|
1672
|
-
});
|
|
1673
|
-
this.requestRender();
|
|
1674
|
-
} else {
|
|
1675
|
-
this._state.replace(newState);
|
|
1676
1725
|
}
|
|
1726
|
+
return this._state.live;
|
|
1727
|
+
}
|
|
1728
|
+
set state(newState) {
|
|
1729
|
+
this._adoptState(newState);
|
|
1677
1730
|
}
|
|
1678
1731
|
getState() {
|
|
1679
|
-
|
|
1732
|
+
if (!this._state) {
|
|
1733
|
+
throw new PaletteError(301 /* MISSING_STATE */);
|
|
1734
|
+
}
|
|
1735
|
+
return this._state;
|
|
1680
1736
|
}
|
|
1681
1737
|
requestRender(callback) {
|
|
1682
1738
|
if (callback) {
|
|
@@ -1685,30 +1741,11 @@ class Component extends HTMLElement {
|
|
|
1685
1741
|
this._scheduleUpdate();
|
|
1686
1742
|
}
|
|
1687
1743
|
listen(targetDescriptor, eventName, eventHandler) {
|
|
1688
|
-
|
|
1689
|
-
if (targetDescriptor instanceof HTMLElement) {
|
|
1690
|
-
if (targetDescriptor.id.length) {
|
|
1691
|
-
query = `#${targetDescriptor.id}`;
|
|
1692
|
-
} else {
|
|
1693
|
-
const generatedId = `listen-${this._nextListenerAutoId++}`;
|
|
1694
|
-
targetDescriptor.setAttribute("data-listener-id", generatedId);
|
|
1695
|
-
query = `[data-listener-id="${generatedId}"]`;
|
|
1696
|
-
}
|
|
1697
|
-
} else if (typeof targetDescriptor === "function") {
|
|
1698
|
-
query = targetDescriptor.tagName;
|
|
1699
|
-
if (true) {
|
|
1700
|
-
if (targetDescriptor.tagName.length === 0) {
|
|
1701
|
-
console.warn(`[Component] Automatic listener setup failure: Component ${targetDescriptor.name} has no defined tagname`);
|
|
1702
|
-
}
|
|
1703
|
-
}
|
|
1704
|
-
} else {
|
|
1705
|
-
query = targetDescriptor;
|
|
1706
|
-
}
|
|
1744
|
+
const query = EventDelegator.processTargetDescriptor(targetDescriptor);
|
|
1707
1745
|
if (query === ":host" || query === ":HOST") {
|
|
1708
|
-
|
|
1709
|
-
this.addEventListener(eventName, handler);
|
|
1746
|
+
this.addEventListener(eventName, eventHandler);
|
|
1710
1747
|
this._ownListeners.add({
|
|
1711
|
-
handler,
|
|
1748
|
+
handler: eventHandler,
|
|
1712
1749
|
event: eventName
|
|
1713
1750
|
});
|
|
1714
1751
|
return;
|
|
@@ -1716,7 +1753,23 @@ class Component extends HTMLElement {
|
|
|
1716
1753
|
if (!this._delegator) {
|
|
1717
1754
|
this._delegator = new EventDelegator(this.root);
|
|
1718
1755
|
}
|
|
1719
|
-
this._delegator.addListener(eventName, eventHandler
|
|
1756
|
+
this._delegator.addListener(eventName, eventHandler, query);
|
|
1757
|
+
}
|
|
1758
|
+
stopListening(targetDescriptor, eventName, eventHandler) {
|
|
1759
|
+
const query = EventDelegator.processTargetDescriptor(targetDescriptor);
|
|
1760
|
+
if (query === ":host" || query === ":HOST") {
|
|
1761
|
+
this.removeEventListener(eventName, eventHandler);
|
|
1762
|
+
for (const listener of this._ownListeners) {
|
|
1763
|
+
if (listener.event === eventName && listener.handler === eventHandler) {
|
|
1764
|
+
this._ownListeners.delete(listener);
|
|
1765
|
+
}
|
|
1766
|
+
}
|
|
1767
|
+
return;
|
|
1768
|
+
}
|
|
1769
|
+
if (!this._delegator) {
|
|
1770
|
+
return;
|
|
1771
|
+
}
|
|
1772
|
+
this._delegator.removeListener(eventName, eventHandler, query);
|
|
1720
1773
|
}
|
|
1721
1774
|
dispatchEvent(event, detail, options) {
|
|
1722
1775
|
if (event instanceof Event) {
|
|
@@ -1857,5 +1910,5 @@ export {
|
|
|
1857
1910
|
Component
|
|
1858
1911
|
};
|
|
1859
1912
|
|
|
1860
|
-
//# debugId=
|
|
1861
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2Vycm9ycy50cyIsICJzcmMvaGVscGVyL2Nzcy50cyIsICJzcmMvdXRpbC9hdHRyaWJ1dGVzLnRzIiwgInNyYy91dGlsL2NoYW5nZS10YWcudHMiLCAic3JjL3V0aWwvZWxlbWVudC1tYXRjaC50cyIsICJzcmMvdXRpbC9scnUtY2FjaGUudHMiLCAic3JjL3V0aWwvZnJhZ21lbnRzLnRzIiwgInNyYy9oZWxwZXIvaHRtbC50cyIsICJzcmMvc3RhdGUvc3RhdGUudHMiLCAic3JjL3RlbXBsYXRlL3N5bnRheC50cyIsICJzcmMvdGVtcGxhdGUvYnVpbGQudHMiLCAic3JjL3RlbXBsYXRlL2pvYnMudHMiLCAic3JjL3RlbXBsYXRlL3RlbXBsYXRlLnRzIiwgInNyYy9jb21wb25lbnQvZGVsZWdhdG9yLnRzIiwgInNyYy9jb21wb25lbnQvY29tcG9uZW50LnRzIiwgInNyYy9jb21wb25lbnQvZmFjdG9yeS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbi8qKlxuICogUG9zc2libGUgZXJyb3IgdHlwZXMgZm9yIHtAbGluayBQYWxldHRlRXJyb3J9XG4gKlxuICogQ29kZXMgYXJlIGNhdGVnb3JpemVkIGludG8gZ3JvdXBzIGJ5IHRoZSAxMDAnczpcbiAqXG4gKiAtIDAgLSA5OTogSW52YXJpYW50c1xuICogLSAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyAvIEVudmlyb25tZW50IEVycm9yc1xuICogLSAyMDAgLSAyOTk6IFRlbXBsYXRpbmcgRXJyb3JzXG4gKiAtIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gRXJyb3JDb2RlIHtcbiAgLy8gMCAtIDk5OiBJbnZhcmlhbnRzXG4gIElOVkFSSUFOVCA9IDAsXG4gIElOVkFMSURfRU5WID0gMSxcblxuICAvLyAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyBFcnJvcnNcbiAgRFVQRV9UQUdOQU1FID0gMTAwLFxuICBJTlZBTElEX1RBR05BTUUgPSAxMDEsXG5cbiAgLy8gMjAwIC0gMjk5OiBUZW1wbGF0ZSBFcnJvcnNcbiAgVEVNUExBVEVfSU5WQUxJRCA9IDIwMCxcbiAgVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTiA9IDIwMSxcbiAgVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlQgPSAyMDIsXG4gIFRFTVBMQVRFX0lOVkFMSURfTElTVCA9IDIwMyxcbiAgVEVNUExBVEVfSU5WQUxJRF9OT0RFX1JFRiA9IDIwNCxcbiAgVEVNUExBVEVfTUlTU0lOR19MSVNUX1BBUkVOVCA9IDIwNSxcbiAgVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWSA9IDIwNixcbiAgVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZID0gMjA3LFxuXG4gIC8vIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAgTUlTU0lOR19FTEVNRU5UID0gMzAwLFxuICBNSVNTSU5HX1NUQVRFID0gMzAxLFxuICBJTlZBTElEX0NPTlRFTlQgPSAzMDIsXG4gIElOVkFMSURfU1RBVEVfS0VZID0gMzAzLFxuICBJTlZBTElEX1NUQVRFX1VQREFURSA9IDMwNCxcbiAgU1RBVEVfTE9DS0VEID0gMzA1LFxuICBNQVhfU0VRVUVOVElBTF9SRU5ERVJTID0gMzA2LFxufVxuXG5mdW5jdGlvbiBnZXREZXZFcnJvcihjb2RlOiBFcnJvckNvZGUpIHtcbiAgY29uc3QgREVWX0VSUk9SX0lORk86IFJlY29yZDxFcnJvckNvZGUsIHN0cmluZz4gPSB7XG4gICAgW0Vycm9yQ29kZS5JTlZBUklBTlRdOiBgXG5JTlZBUklBTlRcbkEgY29uZGl0aW9uIGhhcyBvY2N1cnJlZCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBzdWNoIGFzIGEgY29kZSBwYXRoIHRoYXRcbnNob3VsZG4ndCBiZSByZWFjaGFibGUgd2hlbiB1c2luZyBjb3JyZWN0IHR5cGVzLCBvciBhIGRpc2FsbG93ZWQgc3RhdGUuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX0VOVl06IGBcbklOVkFMSURfRU5WXG5GYWlsZWQgdG8gZmluZCBhIGN1c3RvbSBlbGVtZW50cyByZWdpc3RyeSBpbiB0aGlzIGVudmlyb25tZW50LiBJcyBhIHdpbmRvd1xuZ2xvYmFsIGF2YWlsYWJsZSB3aXRoIGEgY3VzdG9tRWxlbWVudHMgcHJvcGVydHk/XG5gLFxuXG4gICAgW0Vycm9yQ29kZS5EVVBFX1RBR05BTUVdOiBgXG5EVVBFX1RBR05BTUVcbkZhaWxlZCB0byByZWdpc3RlciBhIGN1c3RvbSBlbGVtZW50IHdpdGggdGhlIHRhZ25hbWUgJXMgYmVjYXVzZSBhbm90aGVyXG5jdXN0b20gZWxlbWVudCBpcyBhbHJlYWR5IGRlZmluZWQgd2l0aCB0aGF0IG5hbWUuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX1RBR05BTUVdOiBgXG5JTlZBTElEX1RBR05BTUVcbkZhaWxlZCB0byBkZXRlcm1pbmUgYSB2YWxpZCBIVE1MIFRhZyB0byB1c2Ugd2hlbiByZWdpc3RlcmluZyBhIGNvbXBvbmVudCBhcyBhXG5jdXN0b20gZWxlbWVudC4gU3BlY2lmeSBhIHN0YXRpYyByZWFkb25seSB0YWdOYW1lIHByb3BlcnR5IG9uIHlvdXIgY29tcG9uZW50XG5jbGFzcyBvciBwcm92aWRlIGEgdGFnTmFtZSBhcmd1bWVudCB0byBDb21wb25lbnQucmVnaXN0ZXIuXG5cbkFsdGVybmF0aXZlbHksIHlvdSBjYW4gZGlyZWN0bHkgcmVnaXN0ZXIgeW91ciBlbGVtZW50IGFzIHlvdSB3b3VsZCBhbnkgb3RoZXJcbkhUTUwgY3VzdG9tIGVsZW1lbnQ6IGN1c3RvbUVsZW1lbnRzLmRlZmluZShcIm15LXRhZ1wiLCBNeUNvbXBvbmVudENsYXNzKTtcbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1JU1NJTkdfRUxFTUVOVF06IGBcbk1JU1NJTkdfRUxFTUVOVFxuQW4gZWxlbWVudCB3YXMgZXhwZWN0ZWQgdG8gZXhpc3QgYnV0IHdhcyBub3QgZm91bmQgd2hlbiB0aGUgRE9NIHdhcyBxdWVyaWVkLlxuYCxcblxuICAgIFtFcnJvckNvZGUuTUlTU0lOR19TVEFURV06IGBcbk1JU1NJTkdfU1RBVEVcbkEgQ29tcG9uZW50J3MgcmVhY3RpdmUgc3RhdGUgd2FzIGFjY2Vzc2VkLCBidXQgbm8gaW5pdGlhbFN0YXRlIGlzIGRlZmluZWQgZm9yXG50aGUgQ29tcG9uZW50J3MgY2xhc3MuIEluaXRpYWwgc3RhdGUgbXVzdCBiZSBkZWZpbmVkIGFzIGFuIG9iamVjdCBvciBmdW5jdGlvbi5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfQ09OVEVOVF06IGBcbklOVkFMSURfQ09OVEVOVFxuVHJpZWQgdG8gc2V0IGEgdmFsdWUgYXMgY29udGVudCBpbiBhIHRlbXBsYXRlLCBidXQgdGhlIHZhbHVlIHdhcyBub3QgYSBzdXBwb3J0ZWRcbnR5cGUuIFZhbHVlcyBtdXN0IGJlIGEgc3RyaW5nLCBIVE1MRWxlbWVudC5cblxuSW5zdGVhZCwgZ290ICVzOiAlcy5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURdOiBgXG5URU1QTEFURV9JTlZBTElEXG5UaGUgdmFsdWUgJXMgY2Fubm90IGJlIGludGVycG9sYXRlZCB2aWEgdGhlIFRlbXBsYXRlIGh0bWwgc3RyaW5nIGhlbHBlci5cblZhbHVlcyBtYXkgb25seSBiZSBIVE1MVGVtcGxhdGVFbGVtZW50cyAodGVtcGxhdGUgY29udGVudCBpcyBhZG9wdGVkKSBvclxuc3RyaW5ncyAoc2hvcnRoYW5kIGZvciBhIDo6c3dhcCBkaXJlY3RpdmUgb24gYW4gZWxlbWVudClcbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05dOiBgXG5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OXG5BIHRlbXBsYXRlIHZhbHVlIG5vdGF0aW9uIGZhaWxlZCB0byBwYXJzZS4gTm90YXRpb25zIG11c3QgYmVnaW4gd2l0aCBvbmUgb2ZcbkAsICQsICosIG9yICMsIGZvbGxvd2VkIGJ5IGEgZG90LXNlcGFyYXRlZCBwYXRoIG9mIGFjY2Vzc29yIG5hbWVzLiBPcHRpb25hbGx5LFxubm90YXRpb25zIG1heSBoYXZlIG1vZGlmaWVycyBhcm91bmQgdGhlbSwgc3VjaCBhcyB0aGUgTk9UKCkgbW9kaWZpZXIuXG5cblRoZSBub3RhdGlvbiB0aGF0IGZhaWxlZCB0byBwYXJzZSB3YXMgXCIlc1wiXG5gLFxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlRdOiBgXG5URU1QTEFURV9JTlZBTElEX0NPTVBPTkVOVFxuRmFpbGVkIHRvIGludGVycG9sYXRlIGEgQ29tcG9uZW50IGluIGFuIGh0bWwgdGVtcGxhdGUgc3RyaW5nIGR1ZSB0byB0aGVcbkNvbXBvbmVudCBoYXZpbmcgYW4gaW52YWxpZCB0YWdOYW1lIHByb3BlcnR5LlxuXG5Db21wb25lbnQgXCIlc1wiIGhhcyBhbiBpbnZhbGlkIHRhZ05hbWUgcHJvcGVydHkgXCIlc1wiXG4gICAgYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX1BBUkVOVF06IGBcblRFTVBMQVRFX01JU1NJTkdfTElTVF9QQVJFTlRcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIHByZXBhcmUgYW4gOjplYWNoIGRpcmVjdGl2ZSBiZWNhdXNlIG5vIHZhbGlkIHBhcmVudCBub2RlXG53YXMgZm91bmQgZm9yIHRoZSBsaXN0IHRvIHJlbmRlciBpbnRvLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9MSVNUXTogYFxuVEVNUExBVEVfSU5WQUxJRF9MSVNUXG5BIHRlbXBsYXRlIGZhaWxlZCB0byByZW5kZXIgYmVjYXVzZSBhbiA6OmVhY2ggZGlyZWN0aXZlIGZldGNoZWQgYSB2YWx1ZSB3aGljaFxud2FzIG5vdCBhbiBhcnJheSBvZiBhY3Rpb25hYmxlIGRhdGEuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PREVfUkVGXTogYFxuVEVNUExBVEVfSU5WQUxJRF9OT0RFX1JFRlxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gcHJlcGFyZSBhIG5vZGUgZnJvbSBhIGNvbXBpbGVkIHNvdXJjZS4gVHlwaWNhbGx5LCB0aGlzXG5tZWFucyBzb21ldGhpbmcgaXMgYnJva2VuIHdpdGhpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUgcmF0aGVyIHRoYW4gYW4gZXJyb3Igd2l0aFxudGhlIHRlbXBsYXRlIGNvbnRlbnQgaXRzZWxmLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWV06IGBcblRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVlcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIGNvbXBpbGUgYmVjYXVzZSBhbiA6OmVhY2ggZGlyZWN0aXZlIHdhcyBmb3VuZCBvbiBhbiBlbGVtZW50XG53aXRob3V0IGEgY29ycmVzcG9uZGluZyA6OmtleSBkaXJlY3RpdmUuIDo6ZWFjaCBkaXJlY3RpdmVzIG11c3QgaGF2ZSBhIDo6a2V5XG5kaXJlY3RpdmUgc3BlY2lmaWVkIG9uIHRoZSBzYW1lIGVsZW1lbnQsIHdob3NlIG5vdGF0aW9uIGV2YWx1YXRlcyB0byBhIHVuaXF1ZVxudmFsdWUgZm9yIGVhY2ggaXRlbSBpbiB0aGUgbGlzdC5cblxuRXhhbXBsZTogPGxpIDo6ZWFjaD1cIiRpdGVtc1wiIDo6a2V5PVwiI2lkXCI+IC4uLiA8L2xpPlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZXTogYFxuVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZXG5BIGxpc3QgZmFpbGVkIHRvIHJlbmRlciBiZWNhdXNlIGl0ZW0ga2V5ICVzIGFwcGVhcmVkIG11bHRpcGxlIHRpbWVzIHdoZW5cbnJlc29sdmluZyBsaXN0IGl0ZW0ga2V5cy4gRWFjaCA6OmtleSBkaXJlY3RpdmUgbXVzdCByZWZlcmVuY2UgYSBub3RhdGlvbiB3aG9zZVxudmFsdWUgaXMgdW5pcXVlIGZvciBlYWNoIGxpc3QgaXRlbS5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfS0VZXTogYFxuSU5WQUxJRF9TVEFURV9LRVlcblRyaWVkIHRvIGFjY2VzcyBhIHN0YXRlIHByb3BlcnR5IHdoaWNoIGRvZXMgbm90IGV4aXN0XG5cbktleSBwYXRoOiAlc1xuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9VUERBVEVdOiBgXG5JTlZBTElEX1NUQVRFX1VQREFURVxuQSBDb21wb25lbnQncyBzZXRTdGF0ZSgpIHdhcyBjYWxsZWQgd2l0aCBhIHZhbHVlIHdoaWNoIGNvdWxkIG5vdCBiZSBwYXRjaGVkIGluXG50byB0aGUgZXhpc3RpbmcgY29tcG9uZW50IHN0YXRlLlxuXG5zZXRTdGF0ZSgpIHRha2VzIGEgcGFydGlhbCBvYmplY3QgZGVzY3JpYmluZyBzdGF0ZSBrZXlzIHRvIHVwZGF0ZS5cblxuSW5zdGVhZCwgcmVjZWl2ZWQ6ICVzXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5TVEFURV9MT0NLRURdOiBgXG5TVEFURV9MT0NLRURcbkEgU3RhdGUgcmVjZWl2ZWQgYSByZXF1ZXN0IHRvIHVwZGF0ZSBvciBsb2NrIHdoaWxlIGFscmVhZHkgbG9ja2VkLlxuU3RhdGVzIG1heSBiZSBsb2NrZWQgdXNpbmcgdGhlIC5sb2NrKCkgbWV0aG9kIGFuZCB1bmxvY2tlZCB1c2luZyB0aGUgLnVubG9jaygpXG5tZXRob2QuIFN0YXRlcyBsb2NrIGR1cmluZyBhc3luYyBtdXRhdGlvbnMgZG9uZSB0aHJvdWdoIHRoZSAubXV0YXRlQXN5bmMoKVxubWV0aG9kIGlmIFwidHJ1ZVwiIGlzIHBhc3NlZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci5cblxuWW91IGNhbiBjaGVjayB0aGUgbG9jayBzdGF0dXMgb2YgYSBTdGF0ZSBpbnN0YW5jZSB3aXRoIC5pc0xvY2tlZFxuYCxcblxuICAgIFtFcnJvckNvZGUuTUFYX1NFUVVFTlRJQUxfUkVOREVSU106IGBcbk1BWF9TRVFVRU5USUFMX1JFTkRFUlNcbkEgY29tcG9uZW50IGhhcyBlcnJvcmVkIGFmdGVyIHJlLXJlbmRlcmluZyBtb3JlIHRoYW4gJXMgdGltZXMgaW4gdGhlIHNhbWUgZnJhbWUuXG5cblRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgYmVjYXVzZSBzdGF0ZSBvciBsaXZlIGF0dHJpYnV0ZXMgYXJlIGJlaW5nIG1vZGlmaWVkXG5kdXJpbmcgYSByZW5kZXIgbGlmZWN5Y2xlIG1ldGhvZCBzdWNoIGFzIGJlZm9yZVVwZGF0ZSgpIG9yIGFmdGVyVXBkYXRlKCkuIElmXG5zdGF0ZSBjaGFuZ2VzIHVuY29uZGl0aW9uYWxseSBkdXJpbmcgYSByZW5kZXIsIHRoZSByZW5kZXIgd2lsbCBpbmZpbml0ZWx5IGxvb3AuXG5VcGRhdGluZyByZW5kZXIgc291cmNlIGRhdGEgZHVyaW5nIGEgcmVuZGVyIGN5Y2xlIGlzIHN1cHBvcnRlZCwgYnV0IGluZmluaXRlXG51cGRhdGUgbG9vcHMgbWF5IG9jY3VyIGlmIHVuY2hlY2tlZC5cbmAsXG4gIH07XG5cbiAgcmV0dXJuIERFVl9FUlJPUl9JTkZPW2NvZGVdO1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9yaWdpbmF0aW5nIGZyb20gd2l0aGluIGEgUGFsZXR0ZSBzdWJzeXN0ZW0uXG4gKlxuICogSW4gdGhlIGBkZXZlbG9wbWVudGAgZW52aXJvbm1lbnQsIHRoZSBlcnJvciB3aWxsIHN1cmZhY2Ugd2l0aCBleHRlbmRlZCBpbmZvXG4gKiBhYm91dCB0aGUgZXJyb3IgYW5kIGFueSBkZXRhaWxzIHdoaWNoIG1heSBiZSByZWxldmFudCB0byBoZWxwIHdpdGggZGVidWdnaW5nLlxuICpcbiAqIEluIHRoZSBgcHJvZHVjdGlvbmAgZW52aXJvbm1lbnQsIGEgbWluaW1hbCBlcnJvciBvbmx5IHN1cmZhY2luZyB0aGUgbnVtZXJpY1xuICogZXJyb3IgY29kZSBpcyB0aHJvd24gaW5zdGVhZC5cbiAqXG4gKiBDb2RlcyBhcmUgY2F0ZWdvcml6ZWQgaW50byBncm91cHMgYnkgdGhlIDEwMCdzOlxuICpcbiAqIC0gMCAtIDk5OiBJbnZhcmlhbnRzXG4gKiAtIDEwMCAtIDE5OTogQ3VzdG9tIEVsZW1lbnRzIC8gRW52aXJvbm1lbnQgRXJyb3JzXG4gKiAtIDIwMCAtIDI5OTogVGVtcGxhdGluZyBFcnJvcnNcbiAqIC0gMzAwIC0gMzk5OiBSdW50aW1lIEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgUGFsZXR0ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBuYW1lID0gXCJQYWxldHRlRXJyb3JcIjtcbiAgY29kZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvZGU6IG51bWJlciwgLi4udmFsdWVzOiBzdHJpbmdbXSkge1xuICAgIGxldCBtZXNzYWdlID0gYENvZGU6ICR7Y29kZX1gO1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBtZXNzYWdlICs9IGdldERldkVycm9yKGNvZGUpO1xuXG4gICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMpIHtcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZShgJXNgLCBTdHJpbmcodmFsKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbi8qKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Yge0BsaW5rIENTU1N0eWxlU2hlZXR9cyBjb250YWluaW5nIHRoZSBwcm92aWRlZCBDU1NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzcyhcbiAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIC4uLnZhbHVlczogdW5rbm93bltdXG4pOiBDU1NTdHlsZVNoZWV0IHtcbiAgbGV0IHJlc3VsdCA9IHN0cmluZ3NbMF0gPz8gXCJcIjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5leHRWYWwgPSB2YWx1ZXNbaV0gPz8gXCJcIjtcbiAgICBjb25zdCBuZXh0U3RyID0gc3RyaW5nc1tpICsgMV0gPz8gXCJcIjtcbiAgICByZXN1bHQgKz0gYCR7bmV4dFZhbH0ke25leHRTdHJ9YDtcbiAgfVxuXG4gIGNvbnN0IHNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKTtcbiAgc2hlZXQucmVwbGFjZVN5bmMocmVzdWx0KTtcbiAgcmV0dXJuIHNoZWV0O1xufVxuXG50eXBlIENsYXNzVmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCB1bmRlZmluZWRcbiAgfCBudWxsXG4gIHwgQ2xhc3NBcnJheVxuICB8IENsYXNzT2JqZWN0O1xudHlwZSBDbGFzc0FycmF5ID0gQ2xhc3NWYWx1ZVtdO1xudHlwZSBDbGFzc09iamVjdCA9IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbi8qKlxuICogR2l2ZW4gZmxleGlibGUgaW5wdXQsIGdlbmVyYXRlIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBzZXR0aW5nIGFzIGFuIGh0bWwgY2xhc3NcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzaWZ5KFwibXktY2xhc3NcIiwgXCJhbm90aGVyLWNsYXNzXCIpIC8vIFwibXktY2xhc3MgYW5vdGhlci1jbGFzc1wiXG4gKiBjbGFzc2lmeShbXCJteS1jbGFzc1wiLCBcImFub3RoZXItY2xhc3NcIl0pIC8vIFwibXktY2xhc3MgYW5vdGhlci1jbGFzc1wiXG4gKiBjbGFzc2lmeSh7IGVuYWJsZWQ6IHRydWUsIGRpc2FibGVkOiBmYWxzZSB9KSAvLyBcImVuYWJsZWRcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeSguLi5hcmdzOiBDbGFzc1ZhbHVlW10pOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0U3RyaW5nID0gXCJcIjtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBhcmd1bWVudCA9IGFyZ3NbaW5kZXhdO1xuXG4gICAgaWYgKCFhcmd1bWVudCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gU3RyaW5ncy9udW1zIC0+IERpcmVjdCBhcHBlbmRcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBhcmd1bWVudCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICB9XG4gICAgICByZXN1bHRTdHJpbmcgKz0gYXJndW1lbnQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYXJyYXlzIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnQpKSB7XG4gICAgICBjb25zdCBuZXN0ZWRSZXN1bHQgPSBjbGFzc2lmeSguLi5hcmd1bWVudCk7XG4gICAgICBpZiAobmVzdGVkUmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHRTdHJpbmcpIHtcbiAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0U3RyaW5nICs9IG5lc3RlZFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvYmplY3RzIHdpdGggY29uZGl0aW9uYWwgY2xhc3MgbmFtZXNcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGNsYXNzTmFtZSBpbiBhcmd1bWVudCkge1xuICAgICAgICAvLyBPbmx5IGluY2x1ZGUgY2xhc3MgbmFtZSBpZiBpdHMgdmFsdWUgaXMgdHJ1dGh5XG4gICAgICAgIGlmIChhcmd1bWVudFtjbGFzc05hbWVdKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0U3RyaW5nICs9IFwiIFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gY2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFN0cmluZztcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcblxuLyoqIEFuIGF0dHJpYnV0ZSB2YWx1ZSBhcyByZWFkIGZyb20gYSBET00gZWxlbWVudCAqL1xudHlwZSBBdHRyaWJ1dGVWYWx1ZSA9IHN0cmluZyB8IG51bGw7XG5cbi8qKiBBIE1hcCBvZiBzdHJpbmcgYXR0cmlidXRlIG5hbWVzIHRvIHtAbGluayBBdHRyaWJ1dGVWYWx1ZX0gKi9cbnR5cGUgQXR0cmlidXRlTWFwID0gTWFwPHN0cmluZywgQXR0cmlidXRlVmFsdWU+O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQXR0cmlidXRlKHZhbHVlOiB1bmtub3duKTogQXR0cmlidXRlVmFsdWUge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXR0cmlidXRlTWFwKFxuICBzb3VyY2U6IG9iamVjdCB8IE1hcDxzdHJpbmcsIHVua25vd24+IHwgSFRNTEVsZW1lbnQsXG4pOiBBdHRyaWJ1dGVNYXAge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcblxuICBpZiAoc291cmNlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygc291cmNlLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIG1hcC5zZXQobmFtZSwgc2VyaWFsaXplQXR0cmlidXRlKHNvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBNYXApIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2Ygc291cmNlKSB7XG4gICAgICBtYXAuc2V0KGtleSwgc2VyaWFsaXplQXR0cmlidXRlKHZhbCkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIgJiYgc291cmNlICE9PSBudWxsKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpIHtcbiAgICAgIG1hcC5zZXQoa2V5LCBzZXJpYWxpemVBdHRyaWJ1dGUodmFsKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBdHRyaWJ1dGVNYXAoXG4gIHRhcmdldDogSFRNTEVsZW1lbnQsXG4gIGF0dHJzOiBBdHRyaWJ1dGVNYXAsXG4pOiB2b2lkIHtcbiAgY29uc3QgY3VycmVudE5hbWVzID0gbmV3IFNldCh0YXJnZXQuZ2V0QXR0cmlidXRlTmFtZXMoKSk7XG4gIGNvbnN0IGluY29taW5nTmFtZXMgPSBuZXcgU2V0KGF0dHJzLmtleXMoKSk7XG4gIGNvbnN0IGF0dHJpYnV0ZXNUb1JlbW92ZSA9IGN1cnJlbnROYW1lcy5kaWZmZXJlbmNlKGluY29taW5nTmFtZXMpO1xuXG4gIGZvciAoY29uc3QgYXR0ciBvZiBhdHRyaWJ1dGVzVG9SZW1vdmUpIHtcbiAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsXSBvZiBhdHRycykge1xuICAgIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsKTtcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHJlcGxhY2UgaXQgd2l0aCBhIGRpZmZlcmVudCB0YWcsIGFkb3B0aW5nIGFsbCBhdHRyaWJ1dGVzXG4gKiBhbmQgY2hpbGQgZWxlbWVudHMuXG4gKiBAcGFyYW0gJHRhcmdldCBUaGUgZWxlbWVudCB0byBzd2FwIG91dFxuICogQHBhcmFtIG5ld1RhZyBUaGUgbmV3IEhUTUwgdGFnTmFtZSB0byB1c2VcbiAqIEByZXR1cm5zIFRoZSBuZXdseSBzd2FwcGVkLWluIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZVRhZygkdGFyZ2V0OiBIVE1MRWxlbWVudCwgbmV3VGFnOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gIGNvbnN0ICRuZXdFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmV3VGFnKTtcblxuICB3aGlsZSAoJHRhcmdldC5maXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgJG5ld0VsLmFwcGVuZENoaWxkKCR0YXJnZXQuZmlyc3RDaGlsZCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGF0dHJOYW1lIG9mICR0YXJnZXQuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgIGNvbnN0IHZhbCA9ICR0YXJnZXQuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcblxuICAgIGlmICh2YWwgIT09IG51bGwpIHtcbiAgICAgICRuZXdFbC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIHZhbCk7XG4gICAgfVxuICB9XG5cbiAgJHRhcmdldC5yZXBsYWNlV2l0aCgkbmV3RWwpO1xuICByZXR1cm4gJG5ld0VsO1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbmltcG9ydCB7IENoYXJDb2RlcyB9IGZyb20gXCIuL2NoYXJhY3Rlci1jb2Rlc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNUYWdOYW1lKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gRW5zdXJlIHRoZSBjaGFyYWN0ZXIgY29kZSBpcyBhIGxldHRlciBvciBoeXBoZW5cbiAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7XG5cbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICBjaGFyID09PSBDaGFyQ29kZXMuSHlwaGVuIHx8XG4gICAgICAgIChjaGFyID49IENoYXJDb2Rlcy5BICYmIGNoYXIgPD0gQ2hhckNvZGVzLlopIHx8XG4gICAgICAgIChjaGFyID49IENoYXJDb2Rlcy5hICYmIGNoYXIgPD0gQ2hhckNvZGVzLnopXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQSBwZXJmb3JtYW5jZSBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBgLm1hdGNoZXMoKWAgd2hpY2ggaW5jbHVkZXMgZmFzdGVyXG4gKiBtYXRjaGluZyBzdHJhdGVnaWVzIGZvciBjb21tb24gcXVlcmllcy5cbiAqXG4gKiBAcmVtYXJrc1xuICogT3B0aW1pemVkIHF1ZXJ5IHR5cGVzOlxuICpcbiAqIC0gU2luZ2xlIElEIHNlbGVjdG9yIGBcIiNpZGVudGlmaWVyXCJgXG4gKiAtIFNpbmdsZSBjbGFzcyBzZWxlY3RvciBgXCIuY2xhc3NuYW1lXCJgXG4gKiAtIFRhZ25hbWUgc2VsZWN0b3IgYFwiYnV0dG9uXCJgXG4gKiAtIFNpbXBsZSBhdHRyaWJ1dGUgc2VsZWN0b3IgYFwiW2F0dHI9J3ZhbHVlJ11cImBcbiAqXG4gKiBBbGwgb3RoZXIgdHlwZXMgb2YgcXVlcmllcyB1c2UgdGhlIGJhc2UgLm1hdGNoZXMoKSBmb3IgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudE1hdGNoZXMoZWxlbWVudDogRWxlbWVudCwgcXVlcnk6IHN0cmluZykge1xuICAvLyBJZiB0aGUgcXVlcnkgaXMgYSBzaW1wbGUgSUQsIGNoZWNrIGl0IGRpcmVjdGx5XG4gIGlmIChcbiAgICBxdWVyeVswXSA9PT0gXCIjXCIgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiIFwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiLlwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiW1wiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiOlwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiPlwiKSA9PT0gLTFcbiAgKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuaWQgPT09IHF1ZXJ5LnNsaWNlKDEpO1xuICB9XG5cbiAgLy8gSWYgdGhlIHF1ZXJ5IGlzIGEgc2ltcGxlIGNsYXNzbmFtZSwgY2hlY2sgaXQgZGlyZWN0bHlcbiAgaWYgKFxuICAgIHF1ZXJ5WzBdID09PSBcIi5cIiAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIgXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIjXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCJbXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI6XCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI+XCIpID09PSAtMVxuICApIHtcbiAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMocXVlcnkuc2xpY2UoMSkpO1xuICB9XG5cbiAgLy8gSWYgdGhlIHF1ZXJ5IGlzIGZvciBqdXN0IGEgdGFnbmFtZSwgY2hlY2sgaXQgZGlyZWN0bHlcbiAgaWYgKGlzVGFnTmFtZShxdWVyeSkpIHtcbiAgICByZXR1cm4gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICAvLyBJZiB0aGUgcXVlcnkgaXMgZm9yIGEgc2luZ2xlIHNlbGVjdG9yIHZhbHVlLCBjaGVjayBpdCBkaXJlY3RseVxuICBpZiAoXG4gICAgcXVlcnlbMF0gPT09IFwiW1wiICYmXG4gICAgcXVlcnlbcXVlcnkubGVuZ3RoIC0gMV0gPT09IFwiXVwiICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIiBcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIjpcIikgPT09IC0xXG4gICkge1xuICAgIGNvbnN0IGF0dHIgPSBxdWVyeS5zbGljZSgxLCAtMSk7XG4gICAgY29uc3QgZXFJbmRleCA9IGF0dHIuaW5kZXhPZihcIj1cIik7XG4gICAgaWYgKGVxSW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cik7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0ci5zbGljZSgwLCBlcUluZGV4KTtcbiAgICBjb25zdCBhdHRyVmFsdWUgPSBhdHRyLnNsaWNlKGVxSW5kZXggKyAxKS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csIFwiXCIpO1xuICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyTmFtZSkgPT09IGF0dHJWYWx1ZTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwgdXNlIG5hdGl2ZSBgLm1hdGNoZXNgIGZvciBjb21wbGV4IHN0dWZmXG4gIHJldHVybiBlbGVtZW50Lm1hdGNoZXMocXVlcnkpO1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbnR5cGUgTWV0cmljcyA9IHtcbiAgaGl0czogbnVtYmVyO1xuICBtaXNzZXM6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIExSVUNhY2hlTWV0cmljcyA9IHtcbiAgbG9va3VwczogbnVtYmVyO1xuICBoaXRzOiBudW1iZXI7XG4gIG1pc3NlczogbnVtYmVyO1xuICBjYXBhY2l0eTogbnVtYmVyO1xuICBlbnRyaWVzOiBudW1iZXI7XG4gIGhpdFJhdGU6IG51bWJlcjtcbn07XG5cbi8qKlxuICogQSBzaW1wbGUgaW4tbWVtb3J5IExSVSBDYWNoZSB1c2luZyBKYXZhU2NyaXB0IG1hcHMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBDYWNoZWQgbmV0d29yayByZXF1ZXN0XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQSBjYWNoZSBvZiBBUEkgVVJMcyB0byB0aGVpciByZXR1cm5lZCBwYXlsb2Fkc1xuICogY29uc3QgY2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nLCBBUElQYXlsb2FkPigpO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0KHVybDogc3RyaW5nKSB7XG4gKiAgIGxldCBjYWNoZWQgPSBjYWNoZS5nZXQodXJsKTtcbiAqICAgaWYgKGNhY2hlZCkge1xuICogICAgIHJldHVybiBjYWNoZWQ7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIC4uLiBNYWtlIHRoZSByZXF1ZXN0IGFuZCBjYWNoZS5zZXQoKSB0aGUgcmVzcG9uc2VcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTFJVQ2FjaGU8SywgVj4ge1xuICBwcml2YXRlIF9tYXhTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgX2RhdGE6IE1hcDxLLCBWPjtcbiAgcHJpdmF0ZSBfbWV0cmljczogTWV0cmljcyA9IHsgaGl0czogMCwgbWlzc2VzOiAwIH07XG5cbiAgY29uc3RydWN0b3IobWF4U2l6ZTogbnVtYmVyID0gNTAwKSB7XG4gICAgaWYgKG1heFNpemUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTFJVIENhY2hlIGNhcGFjaXR5IG11c3QgYmUgPj0gMVwiKTtcbiAgICB9XG5cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgdGhpcy5fbWV0cmljcyA9IHsgaGl0czogMCwgbWlzc2VzOiAwIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgdGhpcy5fZGF0YSA9IG5ldyBNYXA8SywgVj4oKTtcbiAgfVxuXG4gIHByaXZhdGUgX3RyaW0gPSAoKSA9PiB7XG4gICAgd2hpbGUgKHRoaXMuX2RhdGEuc2l6ZSA+IHRoaXMuX21heFNpemUpIHtcbiAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5fZGF0YS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKGZpcnN0S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdXJkXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0YS5kZWxldGUoZmlyc3RLZXkpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogR2V0IGNhY2hlIHBlcmZvcm1hbmNlIG1ldHJpY3MgZnJvbSB0aGlzIExSVSBDYWNoZSBpbnN0YW5jZS5cbiAgICpcbiAgICogSW4gZGV2ZWxvcG1lbnQgbW9kZSwgdGhpcyByZXR1cm5zIGluc2lnaHRzIGludG8gaGl0cy9taXNzZXMgb2YgdGhlIGNhY2hlLFxuICAgKiBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gYW5kIGVudHJ5IGNvdW50LlxuICAgKlxuICAgKiBJbiBwcm9kdWN0aW9uIG1vZGUsIHRoaXMgcmV0dXJucyBhIHBsYWNlaG9sZGVyIG9iamVjdCwgYXMgbWV0cmljIGNvbGxlY3Rpb25cbiAgICogaXMgbm90IGFjdGl2ZSBpbiBwcm9kdWN0aW9uLlxuICAgKi9cbiAgZ2V0IG1ldHJpY3MoKTogTFJVQ2FjaGVNZXRyaWNzIHtcbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgY29uc3QgeyBoaXRzID0gMCwgbWlzc2VzID0gMCB9ID0gdGhpcy5fbWV0cmljcyA/PyB7fTtcbiAgICAgIGNvbnN0IGxvb2t1cHMgPSBoaXRzICsgbWlzc2VzO1xuICAgICAgY29uc3QgaGl0UmF0ZSA9IGxvb2t1cHMgPT09IDAgPyAwIDogaGl0cyAvIGxvb2t1cHM7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvb2t1cHMsXG4gICAgICAgIGhpdHM6IGhpdHMsXG4gICAgICAgIG1pc3NlczogbWlzc2VzLFxuICAgICAgICBjYXBhY2l0eTogdGhpcy5fbWF4U2l6ZSxcbiAgICAgICAgZW50cmllczogdGhpcy5fZGF0YS5zaXplLFxuICAgICAgICBoaXRSYXRlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9va3VwczogMCxcbiAgICAgIGhpdHM6IDAsXG4gICAgICBtaXNzZXM6IDAsXG4gICAgICBjYXBhY2l0eTogMCxcbiAgICAgIGVudHJpZXM6IDAsXG4gICAgICBoaXRSYXRlOiAwLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBtYXhpbXVtIGNhY2hlIHNpemUgZm9yIHRoaXMgaW5zdGFuY2UuIEltbWVkaWF0ZWx5IHRyaWdnZXJzIGFcbiAgICogcHVyZ2Ugb2YgY2FjaGVkIGNvbnRlbnRzIGlmIHRoZSBuZXcgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50XG4gICAqIG51bWJlciBvZiBjYWNoZWQgZW50cmllcy5cbiAgICovXG4gIHNldENhcGFjaXR5ID0gKG1heFNpemU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGlmIChtYXhTaXplIDw9IDAgJiYgX19ERVZfXykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltQYWxldHRlIExSVSBDYWNoZV0gQ2FjaGUgc2l6ZSBpcyA8PSAwLiBDYWNoZSBpcyBkaXNhYmxlZC5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgdGhpcy5fdHJpbSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaCBhIHZhbHVlIGZyb20gdGhlIGNhY2hlLCByZXR1cm5pbmcgYHVuZGVmaW5lZGAgaWYgbm8gdmFsdWUgd2FzIGZvdW5kXG4gICAqL1xuICBnZXQoa2V5OiBLKTogViB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9kYXRhLmdldChrZXkpO1xuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIHRoaXMuX21ldHJpY3MubWlzc2VzICs9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSBhbmQgcmUtc2V0IHRoZSB2YWx1ZSB0byBtb3ZlIHRoZSBrZXkgdG8gdGhlIGVuZCBvZiB0aGUga2V5IGxpc3RcbiAgICB0aGlzLl9kYXRhLmRlbGV0ZShrZXkpO1xuICAgIHRoaXMuX2RhdGEuc2V0KGtleSwgdmFsdWUpO1xuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHRoaXMuX21ldHJpY3MuaGl0cyArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSB2YWx1ZSBpbiB0aGUgY2FjaGUuIFRoaXMgYWxzbyBtb3ZlcyB0aGUgdmFsdWUgdG8gdGhlIGJhY2sgb2YgdGhlIGxpc3RcbiAgICogb2YgdmFsdWVzIHRvIGNvbnNpZGVyIGV2aWN0aW5nIHdoZW4gdGhlIGNhY2hlIGlzIGZ1bGwuXG4gICAqL1xuICBzZXQoa2V5OiBLLCB2YWx1ZTogVik6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBpZiBleGlzdHMgdG8gdXBkYXRlIHBvc2l0aW9uXG4gICAgaWYgKHRoaXMuX2RhdGEuaGFzKGtleSkpIHtcbiAgICAgIHRoaXMuX2RhdGEuZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICBpZiAodGhpcy5fZGF0YS5zaXplID4gdGhpcy5fbWF4U2l6ZSkge1xuICAgICAgdGhpcy5fdHJpbSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgY29udGVudHMgb2YgdGhpcyBjYWNoZSBpbnN0YW5jZVxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YS5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBjYWNoZSBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zaXplO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExSVUNhY2hlO1xuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbmltcG9ydCBMUlVDYWNoZSBmcm9tIFwiLi9scnUtY2FjaGVcIjtcblxuZXhwb3J0IGNvbnN0IGZyYWdtZW50Q2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nLCBEb2N1bWVudEZyYWdtZW50PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gaHRtbFRvRnJhZ21lbnQoaHRtbDogc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIGNvbnN0IGxvb2t1cCA9IGZyYWdtZW50Q2FjaGUuZ2V0KGh0bWwpO1xuXG4gIGlmIChsb29rdXAgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBsb29rdXAuY2xvbmVOb2RlKHRydWUpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gIH1cblxuICBjb25zdCB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICB0ZW1wLmlubmVySFRNTCA9IGh0bWw7XG4gIGZyYWdtZW50Q2FjaGUuc2V0KGh0bWwsIHRlbXAuY29udGVudCk7XG4gIHJldHVybiB0ZW1wLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIiNjb21wb25lbnRcIjtcbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgaXNUYWdOYW1lIH0gZnJvbSBcIiN1dGlsXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRlbXBsYXRlU3RyaW5nVmFsdWUoXG4gIHZhbDogc3RyaW5nIHwgdHlwZW9mIENvbXBvbmVudCB8IEhUTUxUZW1wbGF0ZUVsZW1lbnQsXG4pOiBzdHJpbmcge1xuICBpZiAodmFsIGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCkge1xuICAgIHJldHVybiB2YWwuaW5uZXJIVE1MO1xuICB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICh2YWwucHJvdG90eXBlIGluc3RhbmNlb2YgQ29tcG9uZW50IHx8IHZhbCA9PT0gQ29tcG9uZW50KVxuICApIHtcbiAgICBjb25zdCB0YWdOYW1lID0gdmFsLnRhZ05hbWU7XG4gICAgaWYgKCFpc1RhZ05hbWUodGFnTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX0NPTVBPTkVOVCxcbiAgICAgICAgdmFsLm5hbWUsXG4gICAgICAgIHZhbC50YWdOYW1lLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhZ05hbWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBgPHNwYW4gOjpzd2FwPVwiJHt2YWx9XCI+PC9zcGFuPmA7XG4gIH1cblxuICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElELCBTdHJpbmcodmFsKSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIHtAbGluayBIVE1MVGVtcGxhdGVFbGVtZW50fSBmcm9tIHRoZSBwcm92aWRlZCBIVE1MIHN0cmluZy5cbiAqXG4gKiBUaGVzZSBIVE1MIFRlbXBsYXRlcyBjYW4gYmUgdXNlZCBhcyBzdGFuZGFyZCBIVE1MIFRlbXBsYXRlcywgb3IgYXMgdGhlXG4gKiBmb3VuZGF0aW9uIGZvciBhIHtAbGluayBDb21wb25lbnR9IG9yIHN0YW5kYWxvbmUge0BsaW5rIFRlbXBsYXRlfVxuICpcbiAqIEludGVycG9sYXRlcyB2YWx1ZXMgaW4gdGhlIHRlbXBsYXRlIHN0cmluZyB0byBwcm92aWRlIGhlbHBlcnMgZm9yIGNvbXBvc2luZ1xuICogdGVtcGxhdGVzOlxuICpcbiAqIC0gSFRNTFRlbXBsYXRlRWxlbWVudCByZWZlcmVuY2VzIGFyZSBzZXJpYWxpemVkIHRvIEhUTUwgYW5kIGlubGluZWRcbiAqIC0gU3RyaW5ncyBhcmUgbW9kaWZpZWQgdG8gYmVjb21lIDxzcGFuPiB0YWdzIHdpdGggdGhlIDo6c3dhcCBkaXJlY3RpdmUgc2V0XG4gKiAgIHRvIHRoZSBzdHJpbmcgdmFsdWUuIFRoaXMgaXMgaGVscGZ1bCBzaG9ydGhhbmQgZm9yIGNvbnRlbnQgcGxhY2Vob2xkZXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogVGhpcyB0ZW1wbGF0ZSBzdHJpbmdcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCAkdGVtcGxhdGUgPSBodG1sYFxuICogPGRpdiA6Y2xhc3M9XCIqY2xhc3NuYW1lc1wiPlxuICogICAke1wiQGNvbnRlbnRcIn1cbiAqIDwvZGl2PlxuICogYFxuICogYGBgXG4gKlxuICogUHJvZHVjZXMgdGhpcyB0ZW1wbGF0ZSBlbGVtZW50IChwb3J0cmF5ZWQgYXMgSFRNTClcbiAqXG4gKiBgYGBodG1sXG4gKiA8dGVtcGxhdGU+XG4gKiAgIDxkaXYgOmNsYXNzPVwiKmNsYXNzbmFtZXNcIj5cbiAqICAgICA8c3BhbiA6OnN3YXA9XCJAY29udGVudFwiPjwvc3Bhbj5cbiAqICAgPC9kaXY+XG4gKiA8L3RlbXBsYXRlPlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBodG1sKFxuICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgLi4udmFsdWVzOiAoXG4gICAgfCBgQCR7c3RyaW5nfWBcbiAgICB8IGAkJHtzdHJpbmd9YFxuICAgIHwgYCMke3N0cmluZ31gXG4gICAgfCBgKiR7c3RyaW5nfWBcbiAgICB8IEhUTUxUZW1wbGF0ZUVsZW1lbnRcbiAgICB8IHR5cGVvZiBDb21wb25lbnQ8YW55PlxuICApW11cbik6IEhUTUxUZW1wbGF0ZUVsZW1lbnQge1xuICBjb25zdCBmdWxsU3RyaW5nID0gc3RyaW5ncy5yZWR1Y2UoKGFjYywgc3RyLCBpKSA9PiB7XG4gICAgY29uc3QgcGFyc2VkVmFsdWUgPSB2YWx1ZXNbaV1cbiAgICAgID8gYCR7cGFyc2VUZW1wbGF0ZVN0cmluZ1ZhbHVlKHZhbHVlc1tpXSl9YFxuICAgICAgOiBcIlwiO1xuICAgIHJldHVybiBhY2MgKyBzdHIgKyBwYXJzZWRWYWx1ZTtcbiAgfSwgXCJcIik7XG5cbiAgY29uc3QgdGVtcGxhdGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICB0ZW1wbGF0ZUVsZW1lbnQuaW5uZXJIVE1MID0gZnVsbFN0cmluZztcbiAgcmV0dXJuIHRlbXBsYXRlRWxlbWVudDtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuXG5leHBvcnQgdHlwZSBTdGF0ZUxpc3RlbmVyPFNoYXBlPiA9IChzdGF0ZTogU2hhcGUpID0+IHZvaWQ7XG5cbmNvbnN0IFBST1hZX0RFUFRIX1dBUk5JTkdfTElNSVQgPSA0O1xuXG5jb25zdCBBcnJheU11dGF0b3JGdW5jdGlvbnMgPSBuZXcgU2V0KFtcbiAgXCJwdXNoXCIsXG4gIFwicG9wXCIsXG4gIFwic2hpZnRcIixcbiAgXCJ1bnNoaWZ0XCIsXG4gIFwic3BsaWNlXCIsXG4gIFwic29ydFwiLFxuICBcInJldmVyc2VcIixcbiAgXCJmaWxsXCIsXG4gIFwiY29weVdpdGhpblwiLFxuXSk7XG5cbi8qKlxuICogUG93ZXJmdWwgYW5kIGZsZXhpYmxlIHN0YXRlIG1hbmFnZW1lbnQgd2l0aCBkZWVwIHJlYWN0aXZpdHksIHRyYW5zYWN0aW9uLCBhbmRcbiAqIGxvY2tpbmcgc3VwcG9ydC5cbiAqXG4gKiBUaGUgU3RhdGUgY2xhc3Mgd3JhcHMgc3RhdGVmdWwgZGF0YSBhbmQgcHJvdmlkZXMgYW4gQVBJIGZvciBtdXRhdGluZyB0aGUgZGF0YVxuICogd2hpbGUgbGlzdGVuZXJzIHN1YnNjcmliZSB0byBtZWFuaW5nZnVsIHVwZGF0ZXMuXG4gKlxuICogTW9kaWZ5IHN0YXRlIHdpdGggc2V0dGVycywgbXV0YXRvcnMsIHRyYW5zYWN0aW9ucywgb3IgcHJveGllZCB1cGRhdGVzIHdpdGhcbiAqIGRlZXAgcmVhY3Rpdml0eSBhbmQgYXJyYXkgbXV0YXRpb24gc3VwcG9ydCBidWlsdCBpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHtjb3VudDogMX0pO1xuICogc3RhdGUuYWRkTGlzdGVuZXIoZGF0YSA9PiBjb25zb2xlLmxvZyhkYXRhKSlcbiAqXG4gKiBzdGF0ZS5zZXQoXCJjb3VudFwiLCAyKTsgLy8gUHJpbnRzIFwiMlwiXG4gKiBzdGF0ZS5zZXQoXCJjb3VudFwiLCAyKTsgLy8gTm90aGluZyBoYXBwZW5zLCBubyBjaGFuZ2VcbiAqIHN0YXRlLmxpdmUuY291bnQgPSAzOyAvLyBQcmludHMgXCIzXCJcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU3RhdGU8U2hhcGUgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgcHJpdmF0ZSBfZGF0YTogU2hhcGU7XG4gIHByaXZhdGUgX2xpc3RlbmVyczogU2V0PFN0YXRlTGlzdGVuZXI8U2hhcGU+PiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBfcHJveHk/OiBTaGFwZTtcbiAgcHJpdmF0ZSBfcHJveHlDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgYW55PigpO1xuICBwcml2YXRlIF9yZXZlcnNlUHJveHlDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgb2JqZWN0PigpO1xuICBwcml2YXRlIF9pc0xvY2tlZCA9IGZhbHNlO1xuXG4gIC8vIE9ubHkgYWxsb3cgd2FybmluZyBpbiBkZXYgbW9kZSwgYW5kIG9ubHkgcHJpbnQgdGhlIHdhcm5pbmcgb25jZSBwZXIgaW5zdFxuICBwcml2YXRlIF9oYXNXYXJuZWQgPSAhX19ERVZfXztcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsRGF0YTogU2hhcGUsIG9uQ2hhbmdlPzogU3RhdGVMaXN0ZW5lcjxTaGFwZT4pIHtcbiAgICB0aGlzLl9kYXRhID0gaW5pdGlhbERhdGE7XG4gICAgdGhpcy5nZXQgPSB0aGlzLmdldC5iaW5kKHRoaXMpO1xuXG4gICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuYWRkKG9uQ2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGF6aWx5IGNyZWF0ZSBhbmQgY2FjaGUgcHJveGllcyBpbnRvIHRoZSBzdGF0ZSBmb3IgcmVhY3RpdmUgdXBkYXRlcyBvblxuICAgKiBuZXN0ZWQgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY3JlYXRlUHJveHk8VD4odGFyZ2V0OiBULCBwYXRoOiBzdHJpbmdbXSA9IFtdKTogVCB7XG4gICAgLy8gUmV0dXJuIHByaW1pdGl2ZXMgaW1tZWRpYXRlbHlcbiAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGEgY2FjaGVkIHByb3h5IGZvciB0aGlzIG9iamVjdFxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuX3Byb3h5Q2FjaGUuZ2V0KHRhcmdldCBhcyBvYmplY3QpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIGlmICghdGhpcy5faGFzV2FybmVkICYmIHBhdGgubGVuZ3RoID4gUFJPWFlfREVQVEhfV0FSTklOR19MSU1JVCkge1xuICAgICAgICB0aGlzLl9oYXNXYXJuZWQgPSB0cnVlO1xuICAgICAgICBjb25zb2xlLndhcm4oYFxuW1N0YXRlXSBEZWVwbHkgbmVzdGVkIGxpdmUgc3RhdGUgYWNjZXNzIG1heSBoYXZlIHBlcmZvcm1hbmNlIGltcGFjdHMuIEZvciBkZWVwbHlcbm5lc3RlZCBvciBjb21wbGV4IHN0YXRlIHVwZGF0ZXMsIHVzZSAubXV0YXRlKCksIC5wYXRjaCgpLCBvciAudHJhbnNhY3Rpb24oKSBmb3Jcbm9wdGltYWwgcGVyZm9ybWFuY2UgKFdhcm5pbmcgd2hpbGUgZXZhbHVhdGluZyBsaXZlIGFjY2VzcyB0byAke3BhdGguam9pbihcIi5cIil9KVxuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBwcm94eSBhbmQgY2FjaGUgaXRcbiAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQgYXMgb2JqZWN0LCB7XG4gICAgICBnZXQ6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIC8vIFN5bWJvbHMgLT4gRGlyZWN0IHJldHVyblxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgIHJldHVybiAob2JqIGFzIGFueSlba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gKG9iaiBhcyBhbnkpW2tleV07XG5cbiAgICAgICAgLy8gQXJyYXkgbWV0aG9kIGludm9jYXRpb25zIC0+IFJ1biBvbiBhIGNsb25lIGFuZCBzcGVjaWFsIGNhc2UgbXV0YXRpb25zXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikgJiYgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBjb25zdCBpc011dGF0aW9uID0gQXJyYXlNdXRhdG9yRnVuY3Rpb25zLmhhcyhrZXkpO1xuXG4gICAgICAgICAgcmV0dXJuICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnNuYXBzaG90KCk7XG5cbiAgICAgICAgICAgIGxldCBjdXJyZW50OiBhbnkgPSBzbmFwc2hvdDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwIG9mIHBhdGgpIHtcbiAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IChjdXJyZW50IGFzIGFueSlba2V5XSguLi5hcmdzKTtcblxuICAgICAgICAgICAgaWYgKGlzTXV0YXRpb24pIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZShzbmFwc2hvdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9iamVjdHMgLT4gcmVjdXJzaXZlbHkgY3JlYXRlIGEgcHJveHlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVQcm94eSh2YWx1ZSwgWy4uLnBhdGgsIGtleV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJpbWl0aXZlcyAtPiBSZXR1cm4gdmFsdWVcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSxcblxuICAgICAgc2V0OiAoX29iaiwga2V5OiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gUmVqZWN0IGlmIGN1cnJlbnRseSBsb2NrZWRcbiAgICAgICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FsbG93IHNldHRpbmcgc3ltYm9sIHByb3BlcnRpZXMgb24gdGFyZ2V0IGRhdGEgdmFsdWVzXG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBhbmQgdXBkYXRlIHRoZSBwYXRoIHdpdGggdGhlIHZhbHVlXG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSBbLi4ucGF0aCwga2V5XTtcbiAgICAgICAgdGhpcy5fc2V0TmVzdGVkKG5ld1BhdGgsIHRoaXMuX3Vud3JhcFByb3h5KHZhbHVlKSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICBoYXM6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIHJldHVybiBrZXkgaW4gb2JqO1xuICAgICAgfSxcblxuICAgICAgb3duS2V5czogKG9iaikgPT4ge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKG9iaik7XG4gICAgICB9LFxuXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IChvYmosIGtleTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwga2V5KTtcblxuICAgICAgICBpZiAoZGVzYykge1xuICAgICAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjO1xuICAgICAgfSxcblxuICAgICAgZGVsZXRlUHJvcGVydHk6IChvYmosIGtleSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIiB8fCAhKGtleSBpbiBvYmopKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBhbmQgdXBkYXRlIHRoZSBwYXRoIHdpdGggdGhlIHZhbHVlXG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSBbLi4ucGF0aCwga2V5XTtcblxuICAgICAgICB0aGlzLl9zZXROZXN0ZWQobmV3UGF0aCwgdW5kZWZpbmVkKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgfSkgYXMgVDtcblxuICAgIHRoaXMuX3Byb3h5Q2FjaGUuc2V0KHRhcmdldCBhcyBvYmplY3QsIHByb3h5KTtcbiAgICB0aGlzLl9yZXZlcnNlUHJveHlDYWNoZS5zZXQocHJveHkgYXMgb2JqZWN0LCB0YXJnZXQgYXMgb2JqZWN0KTtcbiAgICByZXR1cm4gcHJveHk7XG4gIH1cblxuICBwcml2YXRlIF91bndyYXBQcm94eTxUPih2YWx1ZTogVCk6IFQge1xuICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGZvciBwcmltaXRpdmVzXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgb25lIG9mIG91ciBwcm94aWVzXG4gICAgY29uc3QgcmF3VGFyZ2V0ID0gdGhpcy5fcmV2ZXJzZVByb3h5Q2FjaGUuZ2V0KHZhbHVlIGFzIG9iamVjdCk7XG4gICAgaWYgKHJhd1RhcmdldCkge1xuICAgICAgcmV0dXJuIHJhd1RhcmdldCBhcyBUO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHRoaXMuX3Vud3JhcFByb3h5KGl0ZW0pKSBhcyBUO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwbGFpbiBvYmplY3RzXG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAgIGNvbnN0IHVud3JhcHBlZDogYW55ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoT2JqZWN0Lmhhc093bih2YWx1ZSwga2V5KSkge1xuICAgICAgICAgIHVud3JhcHBlZFtrZXldID0gdGhpcy5fdW53cmFwUHJveHkoKHZhbHVlIGFzIGFueSlba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB1bndyYXBwZWQ7XG4gICAgfVxuXG4gICAgLy8gT3RoZXIgb2JqZWN0cyAoRGF0ZSwgTWFwLCBTZXQsIGV0Yy4pIHBhc3MgdGhyb3VnaFxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2V0dGluZyBuZXN0ZWQgdmFsdWVzIGFuZCBlbWl0dGluZyB1cGRhdGVkIGRhdGEgaWYgdGhlIHZhbHVlIGNoYW5nZWRcbiAgICovXG4gIHByaXZhdGUgX3NldE5lc3RlZChwYXRoOiBzdHJpbmdbXSwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIC8vIE5vdGhpbmcgdG8gZG8gd2l0aCBlbXB0eSBwYXRoc1xuICAgIGlmICghcGF0aC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBhdCB0aGUgcm9vdCBhbmQgc2VlayB0byB0aGUgdmFsdWUgYmVpbmcgc2V0XG4gICAgbGV0IGN1cnJlbnQ6IGFueSA9IHRoaXMuX2RhdGE7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBwYXRoW2ldID8/IFwiXCI7XG4gICAgICBpZiAoIShrZXkgaW4gY3VycmVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9LRVksIHBhdGguam9pbihcIi5cIikpO1xuICAgICAgfVxuICAgICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbEtleSA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXSA/PyBcIlwiO1xuICAgIGlmICghKGZpbmFsS2V5IGluIGN1cnJlbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBTElEX1NUQVRFX0tFWSwgcGF0aC5qb2luKFwiLlwiKSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGFuZCBlbWl0IG9ubHkgaWYgdGhlIHZhbHVlIGlzIGRpZmZlcmVudC4gT3RoZXJ3aXNlIG5vLW9wLlxuICAgIGlmIChjdXJyZW50W2ZpbmFsS2V5XSAhPT0gdmFsdWUgJiYgIU9iamVjdC5pcyhjdXJyZW50W2ZpbmFsS2V5XSwgdmFsdWUpKSB7XG4gICAgICBjdXJyZW50W2ZpbmFsS2V5XSA9IHZhbHVlO1xuICAgICAgdGhpcy5fZW1pdCh0aGlzLmN1cnJlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGFuIGluY29taW5nIHBhcnRpYWwgc3RhdGUgYW5kIGVtaXQgdXBkYXRlcyB0byBsaXN0ZW5lcnMgaWYgdGhlcmVcbiAgICogYXJlIGFueSBjaGFuZ2VzIGRldGVjdGVkLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBPYmplY3QuaXMoKSB0byBjaGVjayBmb3IgZGlmZmVyZW5jZXMuIERvZXMgbm90IGF0dGVtcHQgZGVlcCBkaWZmaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcHJvY2Vzc0luY29taW5nU3RhdGUgPSAoaW5jb21pbmdTdGF0ZTogUGFydGlhbDxTaGFwZT4pOiB2b2lkID0+IHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgaW5jb21pbmdTdGF0ZSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgaW5jb21pbmdTdGF0ZSA9PT0gbnVsbCB8fFxuICAgICAgQXJyYXkuaXNBcnJheShpbmNvbWluZ1N0YXRlKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgICAgRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfVVBEQVRFLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShpbmNvbWluZ1N0YXRlKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICAvLyBDaGVjayBpZiBhbnkga2V5L3ZhbHVlIHBhaXIgb24gdGhlIGluY29taW5nIHN0YXRlIGRpZmZlcnMgZnJvbSB0aGVcbiAgICAvLyBleGlzdGluZyBkYXRhXG4gICAgZm9yIChjb25zdCBba2V5LCBuZXdWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5jb21pbmdTdGF0ZSkpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuX2RhdGFba2V5IGFzIGtleW9mIFNoYXBlXTtcbiAgICAgIGlmICghT2JqZWN0LmlzKGN1cnJlbnRWYWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICAodGhpcy5fZGF0YSBhcyBhbnkpW2tleV0gPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzQ2hhbmdlcykge1xuICAgICAgdGhpcy5fZW1pdCh0aGlzLl9kYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEVtaXQgdGhlIGN1cnJlbnQgc3RhdGUgdG8gYWxsIGxpc3RlbmVyc1xuICAgKi9cbiAgcHJpdmF0ZSBfZW1pdCA9IChkYXRhOiBTaGFwZSk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fbGlzdGVuZXJzKSB7XG4gICAgICBsaXN0ZW5lcihkYXRhKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXRlXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaXMgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBzdGF0ZS4gSXQgaXMgbWFya2VkIGFzIFJlYWRvbmx5XG4gICAqIHRvIGhlbHAgcHJldmVudCBhY2NpZGVudGFsIGNoYW5nZXMuIE5ldmVyIGVkaXQgdGhpcyB2YWx1ZSBkaXJlY3RseS5cbiAgICovXG4gIGdldCBjdXJyZW50KCk6IFJlYWRvbmx5PFNoYXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogUHJveGllZCBhY2Nlc3MgdG8gc3RhdGUgcHJvcGVydGllcyB3aXRoIGF1dG9tYXRpYyByZWNvbmNpbGlhdGlvbi5cbiAgICpcbiAgICogQWxsb3dzIGRpcmVjdCBwcm9wZXJ0eSBhY2Nlc3MgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZyBzdGF0ZSB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIERlZXAgcmVhY3Rpdml0eSB3aXRoIHRoZSBgLmxpdmVgIGFjY2Vzc29yXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdGUgPSBuZXcgU3RhdGUoe1xuICAgKiAgIG5lc3RlZDoge1xuICAgKiAgICAgdmFsdWVzOiBbMSwgMiwgM10sXG4gICAqICAgfVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gRGVlcCB2YWx1ZSBhc3NpZ25tZW50IHRyaWdnZXJzIHN0YXRlIHVwZGF0ZXNcbiAgICogc3RhdGUubGl2ZS5uZXN0ZWQudmFsdWVzWzFdID0gNTtcbiAgICpcbiAgICogLy8gQXJyYXkgbXV0YXRvcnMgYXJlIGF1dG9tYXRpY2FsbHkgcmVhY3RpdmUgYXMgd2VsbFxuICAgKiBzdGF0ZS5saXZlLm5lc3RlZC52YWx1ZXMucHVzaCg0KTtcbiAgICogc3RhdGUubGl2ZS5uZXN0ZWQudmFsdWVzLnJldmVyc2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXQgbGl2ZSgpOiBTaGFwZSB7XG4gICAgaWYgKCF0aGlzLl9wcm94eSkge1xuICAgICAgdGhpcy5fcHJveHkgPSB0aGlzLl9jcmVhdGVQcm94eSh0aGlzLl9kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Byb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGlzIHN0YXRlIGlzIGN1cnJlbnRseSBsb2NrZWQgKHRydWUpIG9yIG5vdCAoZmFsc2UpXG4gICAqL1xuICBnZXQgaXNMb2NrZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTG9ja2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHdoZW4gdGhpcyBzdGF0ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBMaXN0ZW5lcnMgYXJlIGludm9rZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHJlZ2lzdGVyZWQgYW5kIGFyZSBwYXNzZWQgYVxuICAgKiByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsbHkgbWFuYWdlZCBzdGF0ZSBvYmplY3QgYXMgYSByZWFkb25seSBvYmplY3QuXG4gICAqXG4gICAqICoqRG8gbm90IG1vZGlmeSBzdGF0ZSB2YWx1ZXMgZGlyZWN0bHkqKi4gSW5zdGVhZCwgdXNlIHtAbGluayBzZXR9IG9yXG4gICAqIHtAbGluayBwYXRjaH0gdG8gbWFrZSBpbW11dGFibGUgdXBkYXRlcy5cbiAgICovXG4gIGFkZExpc3RlbmVyID0gKGxpc3RlbmVyOiBTdGF0ZUxpc3RlbmVyPFNoYXBlPik6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2xpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgc3RhdGUgaGFuZGxlclxuICAgKi9cbiAgcmVtb3ZlTGlzdGVuZXIgPSAobGlzdGVuZXI6IFN0YXRlTGlzdGVuZXI8U2hhcGU+KTogdm9pZCA9PiB7XG4gICAgdGhpcy5fbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSB2YWx1ZSBmcm9tIHRoZSBzdGF0ZSBvYmplY3RcbiAgICpcbiAgICogVGhlIHZhbHVlIGlzIHJldHVybmVkIGFzIFJlYWRvbmx5IHRvIHByZXZlbnQgYWNjaWRlbnRhbCBzdGF0ZSBtdXRhdGlvbnMuXG4gICAqIFRvIG11dGF0ZSBzdGF0ZWZ1bCBwcm9wZXJ0aWVzLCB1c2Uge0BsaW5rIHNldH0gb3Ige0BsaW5rIHBhdGNofSBpbnN0ZWFkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHsgY291bnQ6IDEgfSk7XG4gICAqIGNvbnNvbGUubG9nKHN0YXRlLmdldChcImNvdW50XCIpKTsgLy8gMVxuICAgKiBgYGBcbiAgICpcbiAgICovXG4gIGdldCA9IDxLIGV4dGVuZHMga2V5b2YgU2hhcGU+KGtleTogSyk6IFJlYWRvbmx5PFNoYXBlW0tdPiA9PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFba2V5XSBhcyBSZWFkb25seTxTaGFwZVtLXT47XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkZWVwIGNsb25lIG9mIHRoZSBjdXJyZW50IHN0YXRlIGRhdGEgdXNpbmcgYHN0cnVjdHVyZWRDbG9uZSgpYCB0b1xuICAgKiBtYWtlIHRoZSBjb3B5LlxuICAgKlxuICAgKiBUaGUgb2JqZWN0IHJldHVybmVkIGZyb20gdGhpcyBmdW5jdGlvbiBjYW4gYmUgZWRpdGVkIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZVxuICAgKiBhY3R1YWwgaW50ZXJuYWwgc3RhdGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc25hcCA9IHN0YXRlLnNuYXBzaG90KCk7XG4gICAqIHNuYXAuY291bnQgKz0gMTtcbiAgICogc3RhdGUucGF0Y2goc25hcCk7XG4gICAqIGBgYFxuICAgKi9cbiAgc25hcHNob3QgPSAoKTogU2hhcGUgPT4ge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fZGF0YSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBhIHNpbmdsZSBzdGF0ZWZ1bCBwcm9wZXJ0eSB3aGlsZSBsZWF2aW5nIG90aGVyIHByb3BlcnRpZXMgdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBUcmlnZ2VycyBhbiB1cGRhdGUgdG8gYWxsIGxpc3RlbmVycyBpZiB0aGUgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gYmVmb3JlXG4gICAqIHdoZW4gY29tcGFyZWQgdXNpbmcgc2hhbGxvdyBlcXVhbGl0eS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7IGNvdW50OiAxLCBjb2xvcjogXCJyZWRcIiB9KTtcbiAgICogc3RhdGUuc2V0KFwiY291bnRcIiwgMik7IC8vIFN0YXRlIGlzIG5vdyB7IGNvdW50OiAyLCBjb2xvcjogXCJyZWRcIiB9XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0ID0gPEsgZXh0ZW5kcyBrZXlvZiBTaGFwZT4oa2V5OiBLLCB2YWx1ZTogU2hhcGVbS10pOiB2b2lkID0+IHtcbiAgICAvLyBSZWplY3QgaWYgY3VycmVudGx5IGxvY2tlZFxuICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWFsOiBQYXJ0aWFsPFNoYXBlPiA9IHt9O1xuICAgIHBhcnRpYWxba2V5XSA9IHZhbHVlO1xuXG4gICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUocGFydGlhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBtdWx0aXBsZSBzdGF0ZWZ1bCBwcm9wZXJ0aWVzIGF0IG9uY2UsIGxlYXZpbmcgb21pdHRlZCBwcm9wZXJ0aWVzXG4gICAqIHVuY2hhbmdlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogUGF0Y2ggYSBwYXJ0aWFsIHN0YXRlLCB1cGRhdGluZyBhbGwgbGlzdGVkIHByb3BlcnRpZXMgYXQgb25jZVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHtcbiAgICogICB3ZWF0aGVyOiBcInN1bm55XCIsXG4gICAqICAgdGVtcGVyYXR1cmU6IDMwLFxuICAgKiAgIGh1bWlkaXR5OiA3MCxcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIExlYXZlcyBgdGVtcGVyYXR1cmVgIHVuY2hhbmdlZFxuICAgKiBzdGF0ZS5wYXRjaCh7XG4gICAqICAgd2VhdGhlcjogXCJjbG91ZHlcIixcbiAgICogICBodW1pZGl0eTogNTAsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHBhdGNoID0gKHBhdGNoOiBQYXJ0aWFsPFNoYXBlPik6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgLy8gUmVqZWN0IGlmIGN1cnJlbnRseSBsb2NrZWRcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUocGF0Y2gpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGdWxseSByZXBsYWNlIHRoZSBjdXJyZW50IHN0YXRlIGRhdGEgYW5kIGZvcmNlIGxpc3RlbmVycyB0byByZWNlaXZlIHRoZVxuICAgKiB1cGRhdGVkIGRhdGEgaW1tZWRpYXRlbHkuXG4gICAqL1xuICByZXBsYWNlID0gKHN0YXRlOiBTaGFwZSk6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgLy8gUmVqZWN0IGlmIGN1cnJlbnRseSBsb2NrZWRcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0YSA9IHN0YXRlO1xuICAgIHRoaXMuX2VtaXQodGhpcy5fZGF0YSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIExvY2sgdGhpcyBTdGF0ZSBpbnN0YW5jZSwgcHJldmVudGluZyBmdXJ0aGVyIGV4dGVybmFsIGNoYW5nZXNcbiAgICovXG4gIGxvY2sgPSAoKTogU3RhdGU8U2hhcGU+ID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5faXNMb2NrZWQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVbmxvY2sgdGhpcyBTdGF0ZSBpbnN0YW5jZSwgYWxsb3dpbmcgZnVydGhlciBleHRlcm5hbCBjaGFuZ2VzXG4gICAqL1xuICB1bmxvY2sgPSAoKTogU3RhdGU8U2hhcGU+ID0+IHtcbiAgICB0aGlzLl9pc0xvY2tlZCA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBcHBseSBjb21wbGV4IHVwZGF0ZXMgdG8gdGhlIHN0YXRlIHVzaW5nIGEgbXV0YXRvciBmdW5jdGlvbi5cbiAgICpcbiAgICogVGhlIG11dGF0b3IgZnVuY3Rpb24gdGFrZXMgb25lIHBhcmFtZXRlciB3aGljaCBpcyBhIHN0cnVjdHVyZWRDbG9uZSBjb3B5IG9mXG4gICAqIHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdC4gV2hhdGV2ZXIgaXMgcmV0dXJuZWQgYnkgdGhlIG11dGF0b3IgaXMgdGhlblxuICAgKiBwYXRjaGVkIGluIHRvIHRoZSBzdGF0ZS5cbiAgICovXG4gIG11dGF0ZSA9IChtdXRhdG9yOiAoY3VycmVudDogU2hhcGUpID0+IFNoYXBlKTogU3RhdGU8U2hhcGU+ID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUobXV0YXRvcih0aGlzLnNuYXBzaG90KCkpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUGVyZm9ybSBhbiBhc3luYyBtdXRhdGlvbiBvZiB0aGUgc3RhdGUsIG9wdGlvbmFsbHkgbG9ja2luZyB0aGUgc3RhdGUgZHVyaW5nXG4gICAqIHRoZSBwcm9jZXNzLlxuICAgKiBAcGFyYW0gbXV0YXRvciBBIGZ1bmN0aW9uIHRvIG11dGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXcgc3RhdGVcbiAgICogQHBhcmFtIGxvY2sgSWYgYHRydWVgLCBsb2NrIHRoZSBzdGF0ZSB1bnRpbCB0aGUgbXV0YXRvciBjb21wbGV0ZXNcbiAgICovXG4gIG11dGF0ZUFzeW5jID0gYXN5bmMgKFxuICAgIG11dGF0b3I6IChjdXJyZW50OiBTaGFwZSkgPT4gUHJvbWlzZTxTaGFwZT4sXG4gICAgbG9jayA9IGZhbHNlLFxuICApOiBQcm9taXNlPFN0YXRlPFNoYXBlPj4gPT4ge1xuICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuU1RBVEVfTE9DS0VEKTtcbiAgICB9XG5cbiAgICBpZiAobG9jaykge1xuICAgICAgdGhpcy5faXNMb2NrZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG11dGF0aW9uUmVzdWx0ID0gYXdhaXQgbXV0YXRvcih0aGlzLnNuYXBzaG90KCkpO1xuICAgIHRoaXMuX3Byb2Nlc3NJbmNvbWluZ1N0YXRlKG11dGF0aW9uUmVzdWx0KTtcblxuICAgIGlmIChsb2NrKSB7XG4gICAgICB0aGlzLl9pc0xvY2tlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgdHJhbnNhY3Rpb24tc3R5bGUgc2V0IG9mIGFjdGlvbnMgZGVmaW5lZCB3aXRoaW4gYSBmdW5jdGlvbi5cbiAgICpcbiAgICogVGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGNhbiBkbyBhbnl0aGluZywgYmV5b25kIGp1c3Qgc2V0dGluZyBzdGF0ZS4gQW55XG4gICAqIHVuY2F1Z2h0IGVycm9ycyB0aHJvd24gZnJvbSB3aXRoaW4gdGhlIGZ1bmN0aW9uIHdpbGwgY2F1c2UgdGhlIHRyYW5zYWN0aW9uXG4gICAqIHRvIGZhaWwgYW5kIHRoZSBzdGF0ZSB0byBhdXRvbWF0aWNhbGx5IHJvbGwgYmFjayB0byB0aGUgbGFzdCB2YWxpZCBzdGF0ZS5cbiAgICpcbiAgICogRHVyaW5nIGEgdHJhbnNhY3Rpb24sIHRoaXMgc3RhdGUgaW5zdGFuY2Ugd2lsbCBiZSBsb2NrZWQsIHByZXZlbnRpbmcgb3RoZXJcbiAgICogY2hhbmdlcy5cbiAgICpcbiAgICogVHJhbnNhY3Rpb25zIHdpbGwgYWx3YXlzIHJlc3VsdCBpbiBhIHN0YXRlIHVwZGF0ZSB3aGVuIHN1Y2Nlc3NmdWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFRyYW5zYWN0aW9ucyB3aXRoIGxvY2tpbmcgYW5kIHJvbGxiYWNrIHN1cHBvcnRcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7Y291bnQ6IDF9KTtcbiAgICpcbiAgICogc3RhdGUudHJhbnNhY3Rpb24oYXN5bmMgKHMpID0+IHtcbiAgICogICAvLyBgc2AgaXMgYSBmdWxsIFN0YXRlIG9iamVjdCB5b3UgY2FuIHNhZmVseSBtYW5pcHVsYXRlXG4gICAqICAgcy5zZXQoXCJjb3VudFwiLCAxMCk7XG4gICAqIH0pO1xuICAgKiBzdGF0ZS5nZXQoXCJjb3VudFwiKTsgLy8gPT4gMTA7XG4gICAqXG4gICAqIC8vIEVycm9ycyBpbnNpZGUgdGhlIHRyYW5zYWN0aW9uIHJvbGwgYmFjayB0aGUgc3RhdGVcbiAgICogc3RhdGUudHJhbnNhY3Rpb24oYXN5bmMgKHMpID0+IHtcbiAgICogICBzLnNldChcImNvdW50XCIsIDEwMCk7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAqIH0pO1xuICAgKiBzdGF0ZS5nZXQoXCJjb3VudFwiKTsgLy8gPT4gMTA7XG4gICAqL1xuICB0cmFuc2FjdGlvbiA9IChmbjogKHN0YXRlOiBTdGF0ZTxTaGFwZT4pID0+IHZvaWQpOiBib29sZWFuID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgLy8gTG9jayBvdXRzaWRlIG9mIHRoZSB0cnkvY2F0Y2ggdG8gdGhyb3cgaW1tZWRpYXRlbHksIHNlcGFyYXRpbmcgdGhlXG4gICAgLy8gdHJhbnNhY3Rpb24gZnVuY3Rpb24gZXJyb3IgZnJvbSB0aGUgYWN0dWFsIGNhbGwgc2l0ZSBlcnJvcnNcbiAgICB0aGlzLl9pc0xvY2tlZCA9IHRydWU7XG5cbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHN0YXRlIG9iamVjdCB0byB1c2Ugd2l0aGluIHRoZSB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25TdGF0ZSA9IG5ldyBTdGF0ZTxTaGFwZT4odGhpcy5zbmFwc2hvdCgpKTtcblxuICAgICAgLy8gUnVuIHRoZSB0cmFuc2FjdGlvbiBpdHNlbGZcbiAgICAgIGZuKHRyYW5zYWN0aW9uU3RhdGUpO1xuXG4gICAgICAvLyBBZG9wdCB0aGUgcmVzdWx0aW5nIHN0YXRlIG9mIHRoZSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZSh0cmFuc2FjdGlvblN0YXRlLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbU3RhdGVdIFRyYW5zYWN0aW9uIGZhaWxlZCBkdWUgdG8gY2F1Z2h0IGVycm9yXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNMb2NrZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcblxuICAvKipcbiAgICogUGVyZm9ybSBhIHRyYW5zYWN0aW9uLXN0eWxlIHNldCBvZiBhY3Rpb25zIGRlZmluZWQgd2l0aGluIGFuIGFzeW5jIGZ1bmN0aW9uXG4gICAqXG4gICAqIFRoZSBwcm92aWRlZCBmdW5jdGlvbiBjYW4gZG8gYW55dGhpbmcsIGJleW9uZCBqdXN0IHNldHRpbmcgc3RhdGUuIEFueVxuICAgKiB1bmNhdWdodCBlcnJvcnMgdGhyb3duIGZyb20gd2l0aGluIHRoZSBmdW5jdGlvbiB3aWxsIGNhdXNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiB0byBmYWlsIGFuZCB0aGUgc3RhdGUgdG8gYXV0b21hdGljYWxseSByb2xsIGJhY2sgdG8gdGhlIGxhc3QgdmFsaWQgc3RhdGUuXG4gICAqXG4gICAqIER1cmluZyBhIHRyYW5zYWN0aW9uLCB0aGlzIHN0YXRlIGluc3RhbmNlIHdpbGwgYmUgbG9ja2VkLCBwcmV2ZW50aW5nIG90aGVyXG4gICAqIGNoYW5nZXMuXG4gICAqXG4gICAqIFRyYW5zYWN0aW9ucyB3aWxsIGFsd2F5cyByZXN1bHQgaW4gYSBzdGF0ZSB1cGRhdGUgd2hlbiBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBUcmFuc2FjdGlvbnMgd2l0aCBsb2NraW5nIGFuZCByb2xsYmFjayBzdXBwb3J0XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdGUgPSBuZXcgU3RhdGUoe2NvdW50OiAxfSk7XG4gICAqXG4gICAqIC8vIEF3YWl0aW5nIHRoZSByZXN1bHQgb2YgYSB0cmFuc2FjdGlvblxuICAgKiBhd2FpdCBzdGF0ZS50cmFuc2FjdGlvbkFzeW5jKGFzeW5jIChzKSA9PiB7XG4gICAqICAgLy8gYHNgIGlzIGEgZnVsbCBTdGF0ZSBvYmplY3QgeW91IGNhbiBzYWZlbHkgbWFuaXB1bGF0ZVxuICAgKiAgIHMuc2V0KFwiY291bnRcIiwgMTApO1xuICAgKiB9KTtcbiAgICogc3RhdGUuZ2V0KFwiY291bnRcIik7IC8vID0+IDEwO1xuICAgKlxuICAgKiAvLyBFcnJvcnMgaW5zaWRlIHRoZSB0cmFuc2FjdGlvbiByb2xsIGJhY2sgdGhlIHN0YXRlXG4gICAqIGF3YWl0IHN0YXRlLnRyYW5zYWN0aW9uQXN5bmMoYXN5bmMgKHMpID0+IHtcbiAgICogICBzLnNldChcImNvdW50XCIsIDEwMCk7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAqIH0pO1xuICAgKiBzdGF0ZS5nZXQoXCJjb3VudFwiKTsgLy8gPT4gMTA7XG4gICAqXG4gICAqIC8vIElmIHlvdSBmb3JnZXQgdG8gYXdhaXQgdGhlIHRyYW5zYWN0aW9uLCBpdHMgc3RpbGwgbG9ja2VkXG4gICAqIHN0YXRlLnRyYW5zYWN0aW9uQXN5bmMoYXN5bmMgKHMpID0+IHtcbiAgICogICBhd2FpdCB3YWl0U2Vjb25kcygxKTtcbiAgICogfSk7XG4gICAqIHN0YXRlLnNldChcImNvdW50XCIsIDEpOyAvLyBFcnJvcjogU3RhdGUgaXMgbG9ja2VkIVxuICAgKiBgYGBcbiAgICovXG4gIHRyYW5zYWN0aW9uQXN5bmMgPSBhc3luYyAoXG4gICAgZm46IChzdGF0ZTogU3RhdGU8U2hhcGU+KSA9PiBQcm9taXNlPHZvaWQ+LFxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgLy8gTG9jayBvdXRzaWRlIG9mIHRoZSB0cnkvY2F0Y2ggdG8gdGhyb3cgaW1tZWRpYXRlbHksIHNlcGFyYXRpbmcgdGhlXG4gICAgLy8gdHJhbnNhY3Rpb24gZnVuY3Rpb24gZXJyb3IgZnJvbSB0aGUgYWN0dWFsIGNhbGwgc2l0ZSBlcnJvcnNcbiAgICB0aGlzLl9pc0xvY2tlZCA9IHRydWU7XG5cbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IHN0YXRlIG9iamVjdCB0byB1c2Ugd2l0aGluIHRoZSB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgdHJhbnNhY3Rpb25TdGF0ZSA9IG5ldyBTdGF0ZTxTaGFwZT4odGhpcy5zbmFwc2hvdCgpKTtcblxuICAgICAgLy8gUnVuIHRoZSB0cmFuc2FjdGlvbiBpdHNlbGZcbiAgICAgIGF3YWl0IGZuKHRyYW5zYWN0aW9uU3RhdGUpO1xuXG4gICAgICAvLyBBZG9wdCB0aGUgcmVzdWx0aW5nIHN0YXRlIG9mIHRoZSB0ZW1wb3Jhcnkgb2JqZWN0XG4gICAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZSh0cmFuc2FjdGlvblN0YXRlLmN1cnJlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbU3RhdGVdIFRyYW5zYWN0aW9uIGZhaWxlZCBkdWUgdG8gY2F1Z2h0IGVycm9yXCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNMb2NrZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgQ2hhckNvZGVzIH0gZnJvbSBcIiN1dGlsXCI7XG5pbXBvcnQgdHlwZSB7IFBhcnNlZE5vdGF0aW9uIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBDaGVjayBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBtYXRjaGVzIHRoZSBcImJvdW5kIGF0dHJpYnV0ZVwiIHN5bnRheFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpc0JvdW5kQXR0cmlidXRlKFwiOmNsYXNzXCIpIC8vIHRydWVcbiAqIGlzQm91bmRBdHRyaWJ1dGUoXCI6OmNsYXNzXCIpIC8vIGZhbHNlXG4gKiBpc0JvdW5kQXR0cmlidXRlKFwiY2xhc3NcIikgLy8gZmFsc2VcbiAqIGBgYFxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGZ1bmN0aW9uIHVzZXMgbG9vcHMgYW5kIGNoYXJhY3RlciBjb2RlIGNoZWNrcyBpbnN0ZWFkIG9mIGEgcmVnZXggdG9cbiAqIG9wdGltaXplIGZvciBob3QgcGF0aHMgZHVyaW5nIGluaXRpYWwgcGFyc2luZyBhbmQgcmVuZGVyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCb3VuZEF0dHJpYnV0ZShhdHRyTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChhdHRyTmFtZVswXSAhPT0gXCI6XCIgfHwgYXR0ck5hbWUubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXR0ck5hbWUubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBFbnN1cmUgdGhlIGNoYXJhY3RlciBjb2RlIGlzIGEgbGV0dGVyIG9yIGh5cGhlblxuICAgIGNvbnN0IGNoYXIgPSBhdHRyTmFtZS5jaGFyQ29kZUF0KGkpO1xuXG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgY2hhciA9PT0gQ2hhckNvZGVzLkh5cGhlbiB8fFxuICAgICAgICAoY2hhciA+PSBDaGFyQ29kZXMuQSAmJiBjaGFyIDw9IENoYXJDb2Rlcy5aKSB8fFxuICAgICAgICAoY2hhciA+PSBDaGFyQ29kZXMuYSAmJiBjaGFyIDw9IENoYXJDb2Rlcy56KVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5lbnVtIE5vdGF0aW9uUHJlZml4IHtcbiAgQXR0cmlidXRlcyA9IFwiQFwiLFxuICBTdGF0ZSA9IFwiJFwiLFxuICBEYXRhID0gXCIqXCIsXG4gIEl0ZW0gPSBcIiNcIixcbn1cblxuLyoqXG4gKiBQYXJzZSBhIG5vdGF0aW9uIGludG8gYW4gb2JqZWN0IHdpdGggcnVudGltZSBpbmZvcm1hdGlvblxuICpcbiAqIEByZW1hcmtzXG4gKiBGb3VyIG5vdGF0aW9ucyBhcmUgc3VwcG9ydGVkOlxuICpcbiAqIC0gYEBhdHRybmFtZWAgLT4gUm9vdCBlbGVtZW50IGF0dHJpYnV0ZXNcbiAqIC0gYCRzdGF0ZXZhbHVlYCAtPiBTdGF0ZWZ1bCBjb250ZW50XG4gKiAtIGAqcHJvcGVydHkub3Iud2hhdGV2ZXJgIC0+IENvbXB1dGVkIGRhdGEgcHJvcGVydGllc1xuICogLSBgI2NvbG9yYCAtPiBMaXN0IGl0ZW0gcHJvcGVydGllc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VOb3RhdGlvbihub3RhdGlvbjogc3RyaW5nKTogUGFyc2VkTm90YXRpb24ge1xuICAvLyBDaGVjayBmb3IgcHJlZml4IG1vZGlmaWVyc1xuICBsZXQgd29ya2luZ05vdGF0aW9uID0gbm90YXRpb247XG4gIGxldCBub3RNb2RpZmllciA9IGZhbHNlO1xuXG4gIGlmIChcbiAgICBub3RhdGlvblswXSA9PT0gXCJOXCIgJiZcbiAgICBub3RhdGlvblsxXSA9PT0gXCJPXCIgJiZcbiAgICBub3RhdGlvblsyXSA9PT0gXCJUXCIgJiZcbiAgICBub3RhdGlvblszXSA9PT0gXCI6XCJcbiAgKSB7XG4gICAgd29ya2luZ05vdGF0aW9uID0gbm90YXRpb24uc2xpY2UoNCk7XG4gICAgbm90TW9kaWZpZXIgPSB0cnVlO1xuICB9XG5cbiAgLy8gQmFzZSBub3RhdGlvbiBtdXN0IGJlZ2luIHdpdGggYSBzdXBwb3J0ZWQgaWRlbnRpZmllclxuICBjb25zdCBmaXJzdENoYXIgPSB3b3JraW5nTm90YXRpb25bMF07XG4gIGlmIChmaXJzdENoYXIgPT09IE5vdGF0aW9uUHJlZml4LkF0dHJpYnV0ZXMpIHtcbiAgICB3b3JraW5nTm90YXRpb24gPSBgYXR0ci4ke3dvcmtpbmdOb3RhdGlvbi5zbGljZSgxKX1gO1xuICB9IGVsc2UgaWYgKGZpcnN0Q2hhciA9PT0gTm90YXRpb25QcmVmaXguU3RhdGUpIHtcbiAgICB3b3JraW5nTm90YXRpb24gPSBgc3RhdGUuJHt3b3JraW5nTm90YXRpb24uc2xpY2UoMSl9YDtcbiAgfSBlbHNlIGlmIChmaXJzdENoYXIgPT09IE5vdGF0aW9uUHJlZml4LkRhdGEpIHtcbiAgICB3b3JraW5nTm90YXRpb24gPSBgZGF0YS4ke3dvcmtpbmdOb3RhdGlvbi5zbGljZSgxKX1gO1xuICB9IGVsc2UgaWYgKGZpcnN0Q2hhciA9PT0gTm90YXRpb25QcmVmaXguSXRlbSkge1xuICAgIHdvcmtpbmdOb3RhdGlvbiA9IGBpdGVtLiR7d29ya2luZ05vdGF0aW9uLnNsaWNlKDEpfWA7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgIEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OLFxuICAgICAgd29ya2luZ05vdGF0aW9uLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwYXRoID0gd29ya2luZ05vdGF0aW9uLnNwbGl0KFwiLlwiKTtcblxuICBpZiAocGF0aC5sZW5ndGggPCAyKSB7XG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihcbiAgICAgIEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OLFxuICAgICAgd29ya2luZ05vdGF0aW9uLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhc2U6IG5vdGF0aW9uLFxuICAgIHBhdGgsXG4gICAgbW9kaWZpZXJzOiBub3RNb2RpZmllciA/IHsgbm90OiB0cnVlIH0gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIE5vdGF0aW9uQWNjZXNzb3IgPSAoc291cmNlOiB1bmtub3duKSA9PiB1bmtub3duO1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRWYWx1ZUFjY2Vzc29yKG5vdGF0aW9uOiBQYXJzZWROb3RhdGlvbik6IE5vdGF0aW9uQWNjZXNzb3Ige1xuICBjb25zdCB7IHBhdGgsIG1vZGlmaWVycyB9ID0gbm90YXRpb247XG5cbiAgaWYgKHBhdGgubGVuZ3RoIDwgMikge1xuICAgIC8vIE5vdGF0aW9ucyBtdXN0IGFsd2F5cyBoYXZlIGF0IGxlYXN0IDIgcGFydHM6IHRoZSBuYW1lc3BhY2UsIGFuZCBhdCBsZWFzdFxuICAgIC8vIG9uZSBwcm9wZXJ0eSBuYW1lIG9uIHRoZSBuYW1lc3BhY2UgKGV4YW1wbGU6IFtcInN0YXRlXCIsIFwidmlzaWJsZVwiXSlcbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICB9XG5cbiAgLy8gRm9yIDIgYW5kIDMgbGVuZ3RoIHBhdGhzLCBwcmUtYmFrZSBhY2Nlc3NvcnMgdG8gb3B0aW1pemUgZm9yIGNvbW1vbiBjYXNlc1xuICBpZiAocGF0aC5sZW5ndGggPT09IDIpIHtcbiAgICBjb25zdCBbZmlyc3RLZXksIHNlY29uZEtleV0gPSBwYXRoO1xuXG4gICAgaWYgKGZpcnN0S2V5ID09PSB1bmRlZmluZWQgfHwgc2Vjb25kS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChzb3VyY2U6IHVua25vd24pID0+IHtcbiAgICAgIGlmIChtb2RpZmllcnM/Lm5vdCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChzb3VyY2UgYXMgYW55KT8uW2ZpcnN0S2V5XT8uW3NlY29uZEtleV0gPz8gbnVsbDtcblxuICAgICAgICAvLyBBdHRyaWJ1dGUgdmFsdWVzIG11c3QgdHJlYXQgdGhlIGVtcHR5IHN0cmluZyBhcyB0cnV0aHkgcGVyIERPTSBydWxlc1xuICAgICAgICBpZiAoZmlyc3RLZXkgPT09IFwiYXR0clwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBcIlwiICYmICF2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gKHNvdXJjZSBhcyBhbnkpPy5bZmlyc3RLZXldPy5bc2Vjb25kS2V5XSA/PyBudWxsO1xuICAgIH07XG4gIH1cblxuICBpZiAocGF0aC5sZW5ndGggPT09IDMpIHtcbiAgICBjb25zdCBbZmlyc3RLZXksIHNlY29uZEtleSwgdGhpcmRLZXldID0gcGF0aDtcblxuICAgIGlmIChcbiAgICAgIGZpcnN0S2V5ID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHNlY29uZEtleSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlyZEtleSA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlOiB1bmtub3duKSA9PiB7XG4gICAgICBpZiAobW9kaWZpZXJzPy5ub3QpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPVxuICAgICAgICAgIChzb3VyY2UgYXMgYW55KT8uW2ZpcnN0S2V5XT8uW3NlY29uZEtleV0/Llt0aGlyZEtleV0gPz8gbnVsbDtcblxuICAgICAgICBpZiAoZmlyc3RLZXkgPT09IFwiYXR0clwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBcIlwiICYmICF2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gKHNvdXJjZSBhcyBhbnkpPy5bZmlyc3RLZXldPy5bc2Vjb25kS2V5XT8uW3RoaXJkS2V5XSA/PyBudWxsO1xuICAgIH07XG4gIH1cblxuICAvLyBGb3IgbG9uZ2VyIHBhdGhzLCBvcHQgZm9yIGEgcHJlLWJ1aWx0IGxvb3BcbiAgcmV0dXJuIChzb3VyY2U6IHVua25vd24pID0+IHtcbiAgICBsZXQgY3VycmVudCA9IHNvdXJjZTtcblxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXRoKSB7XG4gICAgICBpZiAoIWN1cnJlbnQgfHwgdHlwZW9mIGN1cnJlbnQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnQgYXMga2V5b2YgdHlwZW9mIGN1cnJlbnRdO1xuICAgIH1cblxuICAgIGlmIChtb2RpZmllcnM/Lm5vdCkge1xuICAgICAgaWYgKHBhdGhbMF0gPT09IFwiYXR0clwiKSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50ICE9PSBcIlwiICYmICFjdXJyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuICFjdXJyZW50O1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50O1xuICB9O1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgaHRtbFRvRnJhZ21lbnQgfSBmcm9tIFwiI3V0aWxcIjtcbmltcG9ydCB7XG4gIGJ1aWxkVmFsdWVBY2Nlc3NvcixcbiAgaXNCb3VuZEF0dHJpYnV0ZSxcbiAgdHlwZSBOb3RhdGlvbkFjY2Vzc29yLFxuICBwYXJzZU5vdGF0aW9uLFxufSBmcm9tIFwiLi9zeW50YXhcIjtcbmltcG9ydCB0eXBlIHtcbiAgQW55UmVuZGVyUGxhbixcbiAgQW55U2NoZW1lLFxuICBBdHRyaWJ1dGVVcGRhdGVQbGFuLFxuICBBdHRyaWJ1dGVVcGRhdGVTY2hlbWUsXG4gIENvbXBpbGVkVGVtcGxhdGUsXG4gIENvbnRlbnRTd2FwUGxhbixcbiAgQ29udGVudFN3YXBTY2hlbWUsXG4gIExpc3RSZW5kZXJQbGFuLFxuICBMaXN0UmVuZGVyU2NoZW1lLFxuICBQYXJzZWROb3RhdGlvbixcbiAgUHJlcGFyZWRUZW1wbGF0ZSxcbiAgVGFnQ2hhbmdlUGxhbixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgUkVGX0FUVFIgPSBcImRhdGEtbm9kZS1yZWZcIjtcblxuZnVuY3Rpb24gY29sbGVjdE9wZXJhYmxlTm9kZXMoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiBIVE1MRWxlbWVudFtdIHtcbiAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihmcmFnbWVudCwgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO1xuICBjb25zdCBrbm93bklnbm9yZXMgPSBuZXcgU2V0PE5vZGU+KCk7XG4gIGNvbnN0IG5vZGVzOiBIVE1MRWxlbWVudFtdID0gW107XG5cbiAgbGV0IGN1cnJlbnROb2RlOiBOb2RlIHwgbnVsbCA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuXG4gIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgIGlmICghKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IHdhbGtlci5uZXh0Tm9kZSgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgbGV0IHBhcmVudCA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgbGV0IGlzSW5MaXN0ID0gZmFsc2U7XG5cbiAgICB3aGlsZSAocGFyZW50ICYmICFpc0luTGlzdCkge1xuICAgICAgaWYgKFxuICAgICAgICBrbm93bklnbm9yZXMuaGFzKHBhcmVudCkgfHxcbiAgICAgICAgKHBhcmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHBhcmVudC5oYXNBdHRyaWJ1dGUoXCI6OmVhY2hcIikpXG4gICAgICApIHtcbiAgICAgICAgaXNJbkxpc3QgPSB0cnVlO1xuICAgICAgICBrbm93bklnbm9yZXMuYWRkKGN1cnJlbnROb2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIGlmICghaXNJbkxpc3QpIHtcbiAgICAgIG5vZGVzLnB1c2goY3VycmVudE5vZGUpO1xuICAgIH1cblxuICAgIGN1cnJlbnROb2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XG4gIH1cblxuICByZXR1cm4gbm9kZXM7XG59XG5cbi8qKlxuICogQ29tcGlsZSBhbiB7QGxpbmsgSFRNTFRlbXBsYXRlRWxlbWVudH0gaW50byBhIHtAbGluayBDb21waWxlZFRlbXBsYXRlfSBmb3JcbiAqIGNhY2hpbmcsIGNsb25pbmcsIG9yIHN0b3JhZ2UuXG4gKlxuICogQ29tcGlsZWQgdGVtcGxhdGUgb2JqZWN0cyBjb250YWluIGEgSlNPTi1zZXJpYWxpemFibGUgZGF0YSByZXByZXNlbnRhdGlvbiBvZlxuICogYSB0ZW1wbGF0ZSBhbmQgY2FuIGJlIHByZXBhcmVkIHVzaW5nIHtAbGluayBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZX0gdG9cbiAqIGNyZWF0ZSBuZXcgVGVtcGxhdGUgaW5zdGFuY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29tcGlsZWQgPSBjb21waWxlVGVtcGxhdGUoJHRlbXBsYXRlRWxlbWVudCk7XG4gKiBjb25zdCBzdHJpbmdpZmllZCA9IEpTT04uc3RyaW5naWZ5KGNvbXBpbGVkKTsgLy8gYSBKU09OIHRlbXBsYXRlIGJ1bmRsZVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlVGVtcGxhdGUoc291cmNlOiBIVE1MVGVtcGxhdGVFbGVtZW50KTogQ29tcGlsZWRUZW1wbGF0ZSB7XG4gIGNvbnN0IHBhcnNlZE5vdGF0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBQYXJzZWROb3RhdGlvbj4oKTtcbiAgY29uc3Qgc2NoZW1lczogQW55U2NoZW1lW10gPSBbXTtcbiAgbGV0IGVsZW1lbnRJZCA9IDA7XG5cbiAgY29uc3QgZW5zdXJlTm9kZVJlZiA9IChlbDogSFRNTEVsZW1lbnQpOiBzdHJpbmcgPT4ge1xuICAgIGxldCByZWYgPSBlbC5nZXRBdHRyaWJ1dGUoUkVGX0FUVFIpO1xuICAgIGlmICghcmVmKSB7XG4gICAgICByZWYgPSBgZWwtJHtlbGVtZW50SWQrK31gO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKFJFRl9BVFRSLCByZWYpO1xuICAgIH1cbiAgICByZXR1cm4gcmVmO1xuICB9O1xuXG4gIGNvbnN0IGNsb25lZFRlbXBsYXRlRWxlbWVudCA9IHNvdXJjZS5jb250ZW50LmNsb25lTm9kZShcbiAgICB0cnVlLFxuICApIGFzIERvY3VtZW50RnJhZ21lbnQ7XG5cbiAgY29uc3Qgbm9kZXM6IEhUTUxFbGVtZW50W10gPSBjb2xsZWN0T3BlcmFibGVOb2RlcyhjbG9uZWRUZW1wbGF0ZUVsZW1lbnQpO1xuXG4gIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgIC8vIENvbGxlY3QgYWxsIGF0dHJpYnV0ZXMgb24gdGhpcyBub2RlXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygbm9kZS5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBhdHRyaWJ1dGVzLnNldChuYW1lLCBub2RlLmdldEF0dHJpYnV0ZShuYW1lKSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGRpcmVjdGl2ZSBhdHRyaWJ1dGVzXG4gICAgZm9yIChjb25zdCBbYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWVdIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIC8vIEJhaWwgcXVpY2tseSBpZiB0aGlzIGlzbid0IGEgZGlyZWN0aXZlXG4gICAgICBpZiAoYXR0cmlidXRlVmFsdWUgPT09IG51bGwgfHwgYXR0cmlidXRlTmFtZVswXSAhPT0gXCI6XCIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBub3RhdGlvbiBoYXMgYmVlbiBwYXJzZWQgYmVmb3JlLCByZXVzZSB0aGF0XG4gICAgICBsZXQgbm90YXRpb24gPSBwYXJzZWROb3RhdGlvbnMuZ2V0KGF0dHJpYnV0ZVZhbHVlKTtcblxuICAgICAgaWYgKG5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbm90YXRpb24gPSBwYXJzZU5vdGF0aW9uKGF0dHJpYnV0ZVZhbHVlKTtcbiAgICAgICAgcGFyc2VkTm90YXRpb25zLnNldChhdHRyaWJ1dGVWYWx1ZSwgbm90YXRpb24pO1xuICAgICAgfVxuXG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblxuICAgICAgLy8gOjprZXkgaXMgaGFuZGxlZCBpbiB0aGUgOjplYWNoIHJvdXRlXG4gICAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gXCI6OmtleVwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUQUcgQ0hBTkdFIFNDSEVNRVNcbiAgICAgIGlmIChhdHRyaWJ1dGVOYW1lID09PSBcIjo6dGFnXCIpIHtcbiAgICAgICAgc2NoZW1lcy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBcInRhZ1wiLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICAgIG5vZGVSZWY6IGVuc3VyZU5vZGVSZWYobm9kZSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBMSVNUIFJFTkRFUiBTQ0hFTUVTXG4gICAgICBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lID09PSBcIjo6ZWFjaFwiKSB7XG4gICAgICAgIGNvbnN0IG5vZGVSZWYgPSBlbnN1cmVOb2RlUmVmKG5vZGUpO1xuXG4gICAgICAgIC8vIEEgOjprZXkgZGlyZWN0aXZlIGlzIHJlcXVpcmVkIHdpdGggYW55IDo6ZWFjaFxuICAgICAgICBjb25zdCBrZXlOb3RhdGlvbiA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiOjprZXlcIik7XG4gICAgICAgIGlmIChrZXlOb3RhdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoXCI6OmtleVwiKTtcblxuICAgICAgICBjb25zdCBsaXN0Q29udGVudEh0bWwgPSBub2RlLmlubmVySFRNTDtcblxuICAgICAgICB3aGlsZSAobm9kZS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NoZW1lOiBMaXN0UmVuZGVyU2NoZW1lID0ge1xuICAgICAgICAgIHR5cGU6IFwiZWFjaFwiLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICAgIGtleU5vdGF0aW9uOiBwYXJzZU5vdGF0aW9uKGtleU5vdGF0aW9uKSxcbiAgICAgICAgICBub2RlUmVmLFxuICAgICAgICAgIGxpc3RDb250ZW50SHRtbCxcbiAgICAgICAgfTtcblxuICAgICAgICBzY2hlbWVzLnB1c2goc2NoZW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ09OVEVOVCBTV0FQIFNDSEVNRVNcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUgPT09IFwiOjpzd2FwXCIpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1lOiBDb250ZW50U3dhcFNjaGVtZSA9IHtcbiAgICAgICAgICB0eXBlOiBcInN3YXBcIixcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgICBub2RlUmVmOiBlbnN1cmVOb2RlUmVmKG5vZGUpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNjaGVtZXMucHVzaChzY2hlbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBBVFRSSUJVVEUgVVBEQVRFIFNDSEVNRVNcbiAgICAgIGVsc2UgaWYgKGlzQm91bmRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgY29uc3QgYmluZE5hbWUgPSBhdHRyaWJ1dGVOYW1lLnNsaWNlKDEpO1xuXG4gICAgICAgIGNvbnN0IHNjaGVtZTogQXR0cmlidXRlVXBkYXRlU2NoZW1lID0ge1xuICAgICAgICAgIHR5cGU6IFwiYXR0clwiLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICAgIGF0dHJpYnV0ZTogYmluZE5hbWUsXG4gICAgICAgICAgbm9kZVJlZjogZW5zdXJlTm9kZVJlZihub2RlKSxcbiAgICAgICAgfTtcblxuICAgICAgICBzY2hlbWVzLnB1c2goc2NoZW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBUZW1wbGF0ZTogJHthdHRyaWJ1dGVOYW1lfSBpcyBub3QgYSB2YWxpZCBkaXJlY3RpdmVgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgUGFyc2VkTm90YXRpb24+ID0ge307XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHBhcnNlZE5vdGF0aW9ucykge1xuICAgIG5vdGF0aW9uc1trZXldID0gdmFsO1xuICB9XG5cbiAgY29uc3QgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHRlbXAuYXBwZW5kQ2hpbGQoY2xvbmVkVGVtcGxhdGVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG4gIGNvbnN0IGh0bWwgPSB0ZW1wLmlubmVySFRNTDtcblxuICBjb25zdCBjb21waWxlZDogQ29tcGlsZWRUZW1wbGF0ZSA9IHtcbiAgICBodG1sLFxuICAgIHNjaGVtZXMsXG4gICAgbm90YXRpb25zLFxuICB9O1xuXG4gIHJldHVybiBjb21waWxlZDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIHtAbGluayBDb21waWxlZFRlbXBsYXRlfSBzdHJ1Y3R1cmUsIHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyB0aGVcbiAqIGRhdGEgbmVlZGVkIHRvIGNyZWF0ZSBuZXcgVGVtcGxhdGUgaW5zdGFuY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29tcGlsZWRUZW1wbGF0ZSA9IGdldENvbXBpbGVkVGVtcGxhdGVKU09OKCk7XG4gKiBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbXBpbGVkVGVtcGxhdGUpO1xuICogY29uc3QgcHJlcGFyZWQgPSBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZShwYXJzZWQpO1xuICpcbiAqIC8vIEVsc2V3aGVyZS4uLlxuICpcbiAqIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHByZXBhcmVkKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUNvbXBpbGVkVGVtcGxhdGUoXG4gIGNvbXBpbGVkOiBDb21waWxlZFRlbXBsYXRlLFxuICBwcm90b3R5cGVGcmFnbWVudD86IERvY3VtZW50RnJhZ21lbnQsXG4pOiBQcmVwYXJlZFRlbXBsYXRlIHtcbiAgY29uc3QgcGxhbnNCeU5vdGF0aW9uOiBNYXA8c3RyaW5nLCBTZXQ8QW55UmVuZGVyUGxhbj4+ID0gbmV3IE1hcCgpO1xuICBjb25zdCBub3RhdGlvbkFjY2Vzc29yczogTWFwPHN0cmluZywgTm90YXRpb25BY2Nlc3Nvcj4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG5vZGVSZWZzOiBNYXA8c3RyaW5nLCBIVE1MRWxlbWVudD4gPSBuZXcgTWFwKCk7XG5cbiAgZm9yIChjb25zdCBbbm90YXRpb24sIHBhcnNlZF0gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZWQubm90YXRpb25zKSkge1xuICAgIG5vdGF0aW9uQWNjZXNzb3JzLnNldChub3RhdGlvbiwgYnVpbGRWYWx1ZUFjY2Vzc29yKHBhcnNlZCkpO1xuICB9XG5cbiAgY29uc3QgZnJhZ21lbnQgPSBwcm90b3R5cGVGcmFnbWVudCA/PyBodG1sVG9GcmFnbWVudChjb21waWxlZC5odG1sKTtcblxuICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGZyYWdtZW50LCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCwge1xuICAgIGFjY2VwdE5vZGUobm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBub2RlLmhhc0F0dHJpYnV0ZShSRUZfQVRUUilcbiAgICAgICAgPyBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFRcbiAgICAgICAgOiBOb2RlRmlsdGVyLkZJTFRFUl9TS0lQO1xuICAgIH0sXG4gIH0pO1xuXG4gIGxldCBtYXJrTm9kZTogTm9kZSB8IG51bGwgPSB3YWxrZXIubmV4dE5vZGUoKTtcblxuICB3aGlsZSAobWFya05vZGUpIHtcbiAgICBpZiAoIShtYXJrTm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVmID0gbWFya05vZGUuZ2V0QXR0cmlidXRlKFJFRl9BVFRSKTtcblxuICAgIGlmIChyZWYgPT09IG51bGwpIHtcbiAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gaW4gcHJhY3RpY2UsIGFzIHRoZSB0cmVlIHdhbGtlciBvbmx5IHN1cmZhY2VzXG4gICAgICAvLyBlbGVtZW50cyB3aXRoIGFuIGV4dGFudCBub2RlIHJlZiBhdHRyaWJ1dGVcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgfVxuXG4gICAgbm9kZVJlZnMuc2V0KHJlZiwgbWFya05vZGUpO1xuICAgIG1hcmtOb2RlLnJlbW92ZUF0dHJpYnV0ZShSRUZfQVRUUik7XG4gICAgbWFya05vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgfVxuXG4gIGNvbnN0IGFzc29jaWF0ZVBsYW4gPSAocGxhbjogQW55UmVuZGVyUGxhbiwgbm90YXRpb246IHN0cmluZykgPT4ge1xuICAgIGxldCBub3RhdGlvblBsYW5zID0gcGxhbnNCeU5vdGF0aW9uLmdldChub3RhdGlvbik7XG4gICAgaWYgKCFub3RhdGlvblBsYW5zKSB7XG4gICAgICBub3RhdGlvblBsYW5zID0gbmV3IFNldCgpO1xuICAgICAgcGxhbnNCeU5vdGF0aW9uLnNldChub3RhdGlvbiwgbm90YXRpb25QbGFucyk7XG4gICAgfVxuICAgIG5vdGF0aW9uUGxhbnMuYWRkKHBsYW4pO1xuICB9O1xuXG4gIGNvbnN0IGdldEJ5Tm9kZVJlZiA9IChub2RlUmVmOiBzdHJpbmcpOiBIVE1MRWxlbWVudCA9PiB7XG4gICAgY29uc3QgY2FjaGVkID0gbm9kZVJlZnMuZ2V0KG5vZGVSZWYpO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PREVfUkVGKTtcbiAgfTtcblxuICBmb3IgKGNvbnN0IHNjaGVtZSBvZiBjb21waWxlZC5zY2hlbWVzKSB7XG4gICAgLy8gSHlkcmF0ZSBMaXN0IHNjaGVtZXMgaW50byBMaXN0IHBsYW5zXG4gICAgaWYgKHNjaGVtZS50eXBlID09PSBcImVhY2hcIikge1xuICAgICAgY29uc3QgaXRlbVByb3RvdHlwZSA9IGdldEJ5Tm9kZVJlZihzY2hlbWUubm9kZVJlZik7XG4gICAgICBjb25zdCBsaXN0Q29udGFpbmVyID0gaXRlbVByb3RvdHlwZS5wYXJlbnRFbGVtZW50O1xuXG4gICAgICBpZiAoIWxpc3RDb250YWluZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX1BBUkVOVCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBsaXN0IHN0YXJ0L2VuZCBtYXJrZXJzXG4gICAgICBjb25zdCBzdGFydE1hcmtlciA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoXCJsaXN0LXN0YXJ0XCIpO1xuICAgICAgY29uc3QgZW5kTWFya2VyID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcImxpc3QtZW5kXCIpO1xuXG4gICAgICBsaXN0Q29udGFpbmVyLmluc2VydEJlZm9yZShzdGFydE1hcmtlciwgaXRlbVByb3RvdHlwZSk7XG4gICAgICBsaXN0Q29udGFpbmVyLmluc2VydEJlZm9yZShlbmRNYXJrZXIsIGl0ZW1Qcm90b3R5cGUubmV4dFNpYmxpbmcpO1xuXG4gICAgICAvLyBTaGFsbG93IGNvcHkgb2YgdGhlIHJvdyByb290XG4gICAgICBjb25zdCByb3dSb290RWxlbWVudCA9IGl0ZW1Qcm90b3R5cGUuY2xvbmVOb2RlKGZhbHNlKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgLy8gQ29weSB0aGUgY29udGVudHMgb2YgdGhlIHJvdyBpbnRvIGEgdGVtcGxhdGVcbiAgICAgIGNvbnN0IHRlbXBsYXRlQ29udGVudFNyYyA9IGh0bWxUb0ZyYWdtZW50KHNjaGVtZS5saXN0Q29udGVudEh0bWwpO1xuICAgICAgY29uc3Qgcm93VGVtcGxhdGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgICAgcm93VGVtcGxhdGVFbGVtZW50LmFwcGVuZENoaWxkKHRlbXBsYXRlQ29udGVudFNyYyk7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgb3JpZ2luYWwgcm9vdCBwcm90b3R5cGUgc2luY2Ugd2Ugd2lsbCBiZSByZW5kZXJpbmcgbmV3IGl0ZW1zXG4gICAgICBpdGVtUHJvdG90eXBlLnJlbW92ZSgpO1xuXG4gICAgICBjb25zdCBwbGFuOiBMaXN0UmVuZGVyUGxhbiA9IHtcbiAgICAgICAgdHlwZTogXCJlYWNoXCIsXG4gICAgICAgIG5vdGF0aW9uOiBzY2hlbWUubm90YXRpb24sXG4gICAgICAgIGtleU5vdGF0aW9uOiBzY2hlbWUua2V5Tm90YXRpb24sXG4gICAgICAgIGxpc3RDb250YWluZXJFbGVtZW50OiBsaXN0Q29udGFpbmVyLFxuICAgICAgICByb3dUZW1wbGF0ZUVsZW1lbnQsXG4gICAgICAgIHJvd1Jvb3RFbGVtZW50LFxuICAgICAgICBzdGFydE1hcmtlcixcbiAgICAgICAgZW5kTWFya2VyLFxuICAgICAgICByb3dUZW1wbGF0ZXNCeVJvb3Q6IG5ldyBXZWFrTWFwKCksXG4gICAgICAgIHJvd1Jvb3RzQnlLZXk6IG5ldyBNYXAoKSxcbiAgICAgIH07XG5cbiAgICAgIGFzc29jaWF0ZVBsYW4ocGxhbiwgc2NoZW1lLm5vdGF0aW9uLmJhc2UpO1xuICAgIH1cbiAgICAvLyBIeWRyYXRlIFN3YXAgc2NoZW1lcyBpbnRvIFN3YXAgcGxhbnNcbiAgICBlbHNlIGlmIChzY2hlbWUudHlwZSA9PT0gXCJzd2FwXCIpIHtcbiAgICAgIGNvbnN0IHBsYW46IENvbnRlbnRTd2FwUGxhbiA9IHtcbiAgICAgICAgdHlwZTogXCJzd2FwXCIsXG4gICAgICAgIG5vdGF0aW9uOiBzY2hlbWUubm90YXRpb24sXG4gICAgICAgIG5vZGU6IGdldEJ5Tm9kZVJlZihzY2hlbWUubm9kZVJlZiksXG4gICAgICB9O1xuXG4gICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIHNjaGVtZS5ub3RhdGlvbi5iYXNlKTtcbiAgICB9XG5cbiAgICAvLyBIeWRyYXRlIFRhZyBjaGFuZ2UgcGxhbnNcbiAgICBlbHNlIGlmIChzY2hlbWUudHlwZSA9PT0gXCJ0YWdcIikge1xuICAgICAgY29uc3QgcGxhbjogVGFnQ2hhbmdlUGxhbiA9IHtcbiAgICAgICAgdHlwZTogXCJ0YWdcIixcbiAgICAgICAgbm90YXRpb246IHNjaGVtZS5ub3RhdGlvbixcbiAgICAgICAgbm9kZTogZ2V0QnlOb2RlUmVmKHNjaGVtZS5ub2RlUmVmKSxcbiAgICAgIH07XG5cbiAgICAgIGFzc29jaWF0ZVBsYW4ocGxhbiwgcGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgICB9XG5cbiAgICAvLyBIeWRyYXRlIEF0dHJpYnV0ZSB1cGRhdGUgcGxhbnNcbiAgICBlbHNlIGlmIChzY2hlbWUudHlwZSA9PT0gXCJhdHRyXCIpIHtcbiAgICAgIGNvbnN0IHBsYW46IEF0dHJpYnV0ZVVwZGF0ZVBsYW4gPSB7XG4gICAgICAgIHR5cGU6IFwiYXR0clwiLFxuICAgICAgICBhdHRyaWJ1dGU6IHNjaGVtZS5hdHRyaWJ1dGUsXG4gICAgICAgIG5vdGF0aW9uOiBzY2hlbWUubm90YXRpb24sXG4gICAgICAgIG5vZGU6IGdldEJ5Tm9kZVJlZihzY2hlbWUubm9kZVJlZiksXG4gICAgICB9O1xuXG4gICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIHBsYW4ubm90YXRpb24uYmFzZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwbGFuc0J5Tm90YXRpb24sXG4gICAgbm90YXRpb25BY2Nlc3NvcnMsXG4gICAgZnJhZ21lbnQsXG4gIH07XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGNsYXNzaWZ5IH0gZnJvbSBcIiNoZWxwZXJcIjtcbmltcG9ydCB7XG4gIGFwcGx5QXR0cmlidXRlTWFwLFxuICBjaGFuZ2VUYWcsXG4gIGNyZWF0ZUF0dHJpYnV0ZU1hcCxcbiAgc2VyaWFsaXplQXR0cmlidXRlLFxufSBmcm9tIFwiI3V0aWxcIjtcbmltcG9ydCB7IGJ1aWxkVmFsdWVBY2Nlc3NvciB9IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHsgVGVtcGxhdGUsIHR5cGUgVGVtcGxhdGVDb250ZXh0IH0gZnJvbSBcIi4vdGVtcGxhdGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgQXR0cmlidXRlVXBkYXRlSm9iLFxuICBBdHRyaWJ1dGVVcGRhdGVQbGFuLFxuICBDb250ZW50U3dhcEpvYixcbiAgQ29udGVudFN3YXBQbGFuLFxuICBMaXN0UmVuZGVySm9iLFxuICBMaXN0UmVuZGVySm9iSXRlbSxcbiAgTGlzdFJlbmRlclBsYW4sXG4gIFRhZ0NoYW5nZUpvYixcbiAgVGFnQ2hhbmdlUGxhbixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IFNLSVBQRURfSk9CID0gU3ltYm9sKFwibm9vcFwiKTtcbmV4cG9ydCB0eXBlIFNraXBwZWRKb2IgPSB0eXBlb2YgU0tJUFBFRF9KT0I7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gQVRUUklCVVRFIFVQREFURSBKT0JTIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVBdHRyaWJ1dGVKb2IoXG4gIHBsYW46IEF0dHJpYnV0ZVVwZGF0ZVBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBBdHRyaWJ1dGVVcGRhdGVKb2IgfCBTa2lwcGVkSm9iIHtcbiAgY29uc3QgcmF3VmFsdWUgPSB2YWx1ZXMuZ2V0KHBsYW4ubm90YXRpb24uYmFzZSk7XG4gIGxldCB2YWx1ZSA9IHR5cGVvZiByYXdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gcmF3VmFsdWUocGxhbi5ub2RlKSA6IHJhd1ZhbHVlO1xuXG4gIC8vIFBhcnNlIHRoZSB2YWx1ZSB3aXRoIGBjbGFzc2lmeWAgaWYgc2V0dGluZyB0aGUgY2xhc3MgYXR0cmlidXRlXG4gIGlmIChwbGFuLmF0dHJpYnV0ZSA9PT0gXCJjbGFzc1wiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHZhbHVlID0gY2xhc3NpZnkodmFsdWUpO1xuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplZFZhbHVlID0gc2VyaWFsaXplQXR0cmlidXRlKHZhbHVlKTtcbiAgY29uc3QgY3VycmVudCA9IHBsYW4ubm9kZS5nZXRBdHRyaWJ1dGUocGxhbi5hdHRyaWJ1dGUpO1xuXG4gIGlmIChzZXJpYWxpemVkVmFsdWUgIT09IGN1cnJlbnQpIHtcbiAgICByZXR1cm4gW3BsYW4ubm9kZSwgcGxhbi5hdHRyaWJ1dGUsIHNlcmlhbGl6ZWRWYWx1ZV07XG4gIH1cblxuICByZXR1cm4gU0tJUFBFRF9KT0I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5BdHRyaWJ1dGVKb2JzKGpvYnM6IEF0dHJpYnV0ZVVwZGF0ZUpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW25vZGUsIG5hbWUsIHZhbHVlXSBvZiBqb2JzKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gQ09OVEVOVCBTV0FQIEpPQlMgLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlQ29udGVudFN3YXBKb2IoXG4gIHBsYW46IENvbnRlbnRTd2FwUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IENvbnRlbnRTd2FwSm9iIHwgU2tpcHBlZEpvYiB7XG4gIGNvbnN0IHJhd1ZhbHVlID0gdmFsdWVzLmdldChwbGFuLm5vdGF0aW9uLmJhc2UpO1xuICBjb25zdCB2YWx1ZSA9IHR5cGVvZiByYXdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gcmF3VmFsdWUocGxhbi5ub2RlKSA6IHJhd1ZhbHVlO1xuXG4gIC8vIFN0cmluZywgTnVtYmVyLCBCb29sZWFuIC0+IFRleHQgTm9kZVxuICBpZiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIlxuICApIHtcbiAgICBjb25zdCBhc1N0ciA9IGAke3ZhbHVlfWA7XG4gICAgaWYgKHBsYW4ubm9kZS50ZXh0Q29udGVudCA9PT0gYXNTdHIpIHtcbiAgICAgIHJldHVybiBTS0lQUEVEX0pPQjtcbiAgICB9XG5cbiAgICByZXR1cm4gW3BsYW4sIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGFzU3RyKV07XG4gIH1cblxuICAvLyBOdWxsaXNoIHZhbHVlcyAtPiBDb21tZW50XG4gIGVsc2UgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocGxhbi5ub2RlIGluc3RhbmNlb2YgQ29tbWVudCkge1xuICAgICAgcmV0dXJuIFNLSVBQRURfSk9CO1xuICAgIH1cblxuICAgIHJldHVybiBbcGxhbiwgZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcImVtcHR5XCIpXTtcbiAgfVxuXG4gIC8vIEhUTUxFbGVtZW50IC0+IFN3YXAgbm9kZXNcbiAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgIGlmIChPYmplY3QuaXMocGxhbi5ub2RlLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBTS0lQUEVEX0pPQjtcbiAgICB9XG5cbiAgICByZXR1cm4gW3BsYW4sIHZhbHVlLmNsb25lTm9kZSh0cnVlKV07XG4gIH1cblxuICAvLyBBbnl0aGluZyBlbHNlIC0+IFVuc3VwcG9ydGVkXG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICBFcnJvckNvZGUuSU5WQUxJRF9DT05URU5ULFxuICAgICAgdHlwZW9mIHZhbHVlLFxuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsdWUpLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNvbnRlbnRTd2FwSm9icyhqb2JzOiBDb250ZW50U3dhcEpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW3BsYW4sIHJlcGxhY2VdIG9mIGpvYnMpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwbGFuLm5vZGUucGFyZW50Tm9kZTtcblxuICAgIGlmICghcGFyZW50KSB7XG4gICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIGluIHByYWN0aWNlXG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgIH1cblxuICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQocmVwbGFjZSwgcGxhbi5ub2RlKTtcbiAgICBwbGFuLm5vZGUgPSByZXBsYWNlO1xuICB9XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gVEFHIENIQU5HRSBKT0JTIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVUYWdDaGFuZ2VKb2IoXG4gIHBsYW46IFRhZ0NoYW5nZVBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBUYWdDaGFuZ2VKb2IgfCBTa2lwcGVkSm9iIHtcbiAgY29uc3QgcmF3VmFsdWUgPSB2YWx1ZXMuZ2V0KHBsYW4ubm90YXRpb24uYmFzZSkgPz8gXCJcIjtcbiAgY29uc3QgdmFsdWUgPSB0eXBlb2YgcmF3VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHJhd1ZhbHVlKHBsYW4ubm9kZSkgOiByYXdWYWx1ZTtcbiAgY29uc3QgbmV4dFRhZyA9IGAke3ZhbHVlfWAudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgY3VycmVudFRhZyA9IHBsYW4ubm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKCFuZXh0VGFnIHx8IG5leHRUYWcgPT09IGN1cnJlbnRUYWcpIHtcbiAgICByZXR1cm4gU0tJUFBFRF9KT0I7XG4gIH1cblxuICByZXR1cm4gW3BsYW4sIG5leHRUYWddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuVGFnQ2hhbmdlSm9icyhqb2JzOiBUYWdDaGFuZ2VKb2JbXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtwbGFuLCBuZXh0VGFnXSBvZiBqb2JzKSB7XG4gICAgcGxhbi5ub2RlID0gY2hhbmdlVGFnKHBsYW4ubm9kZSwgbmV4dFRhZyk7XG4gIH1cbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gTElTVCBSRU5ERVIgSk9CUyAvL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5mdW5jdGlvbiBmZXRjaExpc3REYXRhKFxuICBwbGFuOiBMaXN0UmVuZGVyUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10ge1xuICBjb25zdCBub3RhdGlvblZhbHVlID0gdmFsdWVzLmdldChwbGFuLm5vdGF0aW9uLmJhc2UpO1xuICBjb25zdCBldmFsdWF0ZWRWYWx1ZSA9XG4gICAgdHlwZW9mIG5vdGF0aW9uVmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBub3RhdGlvblZhbHVlKHBsYW4uc3RhcnRNYXJrZXIucGFyZW50Tm9kZSlcbiAgICAgIDogbm90YXRpb25WYWx1ZTtcblxuICBpZiAoZXZhbHVhdGVkVmFsdWUgPT09IG51bGwgfHwgZXZhbHVhdGVkVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGV2YWx1YXRlZFZhbHVlKSkge1xuICAgIHJldHVybiBldmFsdWF0ZWRWYWx1ZTtcbiAgfVxuXG4gIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTElTVCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RIVE1MRWxlbWVudHMoc3RhcnQ6IE5vZGUsIGVuZDogTm9kZSk6IFNldDxIVE1MRWxlbWVudD4ge1xuICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSBzdGFydDtcbiAgY29uc3Qgbm9kZVNldCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG5cbiAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gZW5kKSB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgbm9kZVNldC5hZGQobm9kZSk7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbm9kZVNldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVMaXN0UmVuZGVySm9iKFxuICBwbGFuOiBMaXN0UmVuZGVyUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IExpc3RSZW5kZXJKb2IgfCBTa2lwcGVkSm9iIHtcbiAgLy8gRmV0Y2ggdGhlIGRhdGEgZm9yIHJlbmRlcmluZyB0aGUgdXBkYXRlZCBsaXN0IGl0ZW1zXG4gIGNvbnN0IGxpc3REYXRhID0gZmV0Y2hMaXN0RGF0YShwbGFuLCB2YWx1ZXMpO1xuXG4gIC8vIEVtcHR5IC0+IFJlbW92ZSB0aGUgbGlzdCBjb250ZW50cyBlbnRpcmVseSBhbmQgZXhpdFxuICBpZiAobGlzdERhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtwbGFuLCBbXV07XG4gIH1cblxuICAvLyBDb2xsZWN0IGV4aXN0aW5nIGVsZW1lbnRzIGZyb20gdGhlIERPTSBmb3IgYXNzZXNzbWVudFxuICBjb25zdCB7IHJvd1RlbXBsYXRlc0J5Um9vdCwgcm93VGVtcGxhdGVFbGVtZW50LCByb3dSb290RWxlbWVudCB9ID0gcGxhbjtcbiAgY29uc3Qga2V5QWNjZXNzb3IgPSBidWlsZFZhbHVlQWNjZXNzb3IocGxhbi5rZXlOb3RhdGlvbik7XG4gIGNvbnN0IGxpc3RSZW5kZXJDb250ZXh0czogTWFwPHVua25vd24sIExpc3RSZW5kZXJKb2JJdGVtPiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdERhdGEpIHtcbiAgICBjb25zdCBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQgPSB7XG4gICAgICBpdGVtLFxuICAgIH07XG5cbiAgICBjb25zdCBrZXkgPSBrZXlBY2Nlc3Nvcihjb250ZXh0KTtcblxuICAgIGlmIChsaXN0UmVuZGVyQ29udGV4dHMuaGFzKGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5URU1QTEFURV9EVVBMSUNBVEVfTElTVF9LRVksXG4gICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBIVE1MIEVsZW1lbnQgd2UgZXhwZWN0IHRvIHNlZSBoZXJlXG4gICAgbGV0IHJvd1Jvb3QgPSBwbGFuLnJvd1Jvb3RzQnlLZXkuZ2V0KGtleSk7XG5cbiAgICBpZiAocm93Um9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByb3dSb290ID0gcm93Um9vdEVsZW1lbnQuY2xvbmVOb2RlKGZhbHNlKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHBsYW4ucm93Um9vdHNCeUtleS5zZXQoa2V5LCByb3dSb290KTtcbiAgICB9XG5cbiAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJvdyByb290XG4gICAgbGV0IHJvd1RlbXBsYXRlID0gcm93VGVtcGxhdGVzQnlSb290LmdldChyb3dSb290KTtcblxuICAgIGlmIChyb3dUZW1wbGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByb3dUZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShyb3dUZW1wbGF0ZUVsZW1lbnQpO1xuICAgICAgcm93VGVtcGxhdGVzQnlSb290LnNldChyb3dSb290LCByb3dUZW1wbGF0ZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgam9iSXRlbTogTGlzdFJlbmRlckpvYkl0ZW0gPSB7XG4gICAgICBjb250ZXh0LFxuICAgICAgcm9vdDogcm93Um9vdCxcbiAgICAgIHRlbXBsYXRlOiByb3dUZW1wbGF0ZSxcbiAgICAgIGF0dHJNYXA6IGNyZWF0ZUF0dHJpYnV0ZU1hcChpdGVtKSxcbiAgICB9O1xuXG4gICAgbGlzdFJlbmRlckNvbnRleHRzLnNldChrZXksIGpvYkl0ZW0pO1xuICB9XG5cbiAgLy8gQ2xlYW4gdXAgY2FjaGVkIGRhdGFcbiAgZm9yIChjb25zdCBba2V5LCByb290XSBvZiBwbGFuLnJvd1Jvb3RzQnlLZXkpIHtcbiAgICBpZiAoIWxpc3RSZW5kZXJDb250ZXh0cy5oYXMoa2V5KSkge1xuICAgICAgcGxhbi5yb3dSb290c0J5S2V5LmRlbGV0ZShrZXkpO1xuICAgICAgcGxhbi5yb3dUZW1wbGF0ZXNCeVJvb3QuZGVsZXRlKHJvb3QpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbcGxhbiwgQXJyYXkuZnJvbShsaXN0UmVuZGVyQ29udGV4dHMudmFsdWVzKCkpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkxpc3RSZW5kZXJKb2JzKGpvYnM6IExpc3RSZW5kZXJKb2JbXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtwbGFuLCByZW5kZXJJdGVtc10gb2Ygam9icykge1xuICAgIGNvbnN0IHsgZW5kTWFya2VyLCBsaXN0Q29udGFpbmVyRWxlbWVudCB9ID0gcGxhbjtcblxuICAgIC8vIEZhc3QgcGF0aCBmb3IgZW1wdHkgbGlzdHMgLT4gUmVtb3ZlIGV2ZXJ5dGhpbmcgYW5kIGNvbnRpbnVlXG4gICAgaWYgKHJlbmRlckl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZm9yIChjb25zdCByb290IG9mIHBsYW4ucm93Um9vdHNCeUtleS52YWx1ZXMoKSkge1xuICAgICAgICByb290LnJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgcGxhbi5yb3dSb290c0J5S2V5LmNsZWFyKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHNjYW4gdGhlIGN1cnJlbnQgbm9kZXMgYW5kIG1vZGlmeSBhcyBuZWVkZWRcbiAgICBjb25zdCBleGlzdGluZ0RPTU5vZGVzID0gQXJyYXkuZnJvbShcbiAgICAgIGNvbGxlY3RIVE1MRWxlbWVudHMocGxhbi5zdGFydE1hcmtlciwgcGxhbi5lbmRNYXJrZXIpLFxuICAgICk7XG5cbiAgICBjb25zdCByb290c1RvS2VlcCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG5cbiAgICBsZXQgZXhpc3RpbmdET01Ob2RlSWR4ID0gMDtcblxuICAgIGZvciAoY29uc3QgcmVuZGVySXRlbSBvZiByZW5kZXJJdGVtcykge1xuICAgICAgY29uc3QgeyByb290LCBhdHRyTWFwLCBjb250ZXh0LCB0ZW1wbGF0ZSB9ID0gcmVuZGVySXRlbTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRE9NTm9kZSA9IGV4aXN0aW5nRE9NTm9kZXNbZXhpc3RpbmdET01Ob2RlSWR4XTtcblxuICAgICAgLy8gU3ByZWFkIGl0ZW0gYXMgYXR0cmlidXRlcyBvbiB0aGUgcm9vdCBhbmQgdXBkYXRlIHRoZSB0ZW1wbGF0ZVxuICAgICAgYXBwbHlBdHRyaWJ1dGVNYXAocm9vdCwgYXR0ck1hcCk7XG4gICAgICB0ZW1wbGF0ZS5yZW5kZXIocm9vdCwgY29udGV4dCk7XG5cbiAgICAgIHJvb3RzVG9LZWVwLmFkZChyb290KTtcblxuICAgICAgLy8gTm9kZSBpcyB0aGUgZXhpc3RpbmcgRE9NIE5vZGUsIGNvbnRpbnVlXG4gICAgICBpZiAoT2JqZWN0LmlzKGV4aXN0aW5nRE9NTm9kZSwgcm9vdCkpIHtcbiAgICAgICAgZXhpc3RpbmdET01Ob2RlSWR4ICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBObyBleGlzdGluZyBub2RlIC0+IGFwcGVuZCBpdGVtXG4gICAgICBpZiAoIWV4aXN0aW5nRE9NTm9kZSkge1xuICAgICAgICBsaXN0Q29udGFpbmVyRWxlbWVudC5pbnNlcnRCZWZvcmUocm9vdCwgZW5kTWFya2VyKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIERPTSBub2RlIGV4aXN0cyBidXQgaXNuJ3QgdGhlIG9uZSB3ZSdyZSBsb29raW5nIGZvci4gSW5zZXJ0IGJlZm9yZS5cbiAgICAgIGxpc3RDb250YWluZXJFbGVtZW50Lmluc2VydEJlZm9yZShyb290LCBleGlzdGluZ0RPTU5vZGUpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG9sZCBlbGVtZW50c1xuICAgIGZvciAoY29uc3Qgcm9vdCBvZiBleGlzdGluZ0RPTU5vZGVzKSB7XG4gICAgICBpZiAoIXJvb3RzVG9LZWVwLmhhcyhyb290KSkge1xuICAgICAgICByb290LnJlbW92ZSgpO1xuICAgICAgICBwbGFuLnJvd1RlbXBsYXRlc0J5Um9vdC5kZWxldGUocm9vdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBmcmFnbWVudENhY2hlLCBodG1sVG9GcmFnbWVudCB9IGZyb20gXCIuLi91dGlsL2ZyYWdtZW50c1wiO1xuaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9scnUtY2FjaGVcIjtcbmltcG9ydCB7IGNvbXBpbGVUZW1wbGF0ZSwgcHJlcGFyZUNvbXBpbGVkVGVtcGxhdGUgfSBmcm9tIFwiLi9idWlsZFwiO1xuaW1wb3J0IHtcbiAgcHJlcGFyZUF0dHJpYnV0ZUpvYixcbiAgcHJlcGFyZUNvbnRlbnRTd2FwSm9iLFxuICBwcmVwYXJlTGlzdFJlbmRlckpvYixcbiAgcHJlcGFyZVRhZ0NoYW5nZUpvYixcbiAgcnVuQXR0cmlidXRlSm9icyxcbiAgcnVuQ29udGVudFN3YXBKb2JzLFxuICBydW5MaXN0UmVuZGVySm9icyxcbiAgcnVuVGFnQ2hhbmdlSm9icyxcbiAgU0tJUFBFRF9KT0IsXG59IGZyb20gXCIuL2pvYnNcIjtcbmltcG9ydCB0eXBlIHsgTm90YXRpb25BY2Nlc3NvciB9IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHR5cGUge1xuICBBbnlSZW5kZXJQbGFuLFxuICBBdHRyaWJ1dGVVcGRhdGVKb2IsXG4gIENvbXBpbGVkVGVtcGxhdGUsXG4gIENvbnRlbnRTd2FwSm9iLFxuICBMaXN0UmVuZGVySm9iLFxuICBUYWdDaGFuZ2VKb2IsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIFRlbXBsYXRlUm9vdCA9IEhUTUxFbGVtZW50IHwgU2hhZG93Um9vdDtcbmV4cG9ydCB0eXBlIFRlbXBsYXRlQ29udGV4dCA9IHtcbiAgYXR0cj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+O1xuICBzdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGl0ZW0/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaW5kZXg/OiBudW1iZXI7XG59O1xuXG5jb25zdCBjb21waWxlQ2FjaGUgPSBuZXcgTFJVQ2FjaGU8SFRNTFRlbXBsYXRlRWxlbWVudCwgQ29tcGlsZWRUZW1wbGF0ZT4oKTtcblxuaWYgKF9fREVWX18gJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAod2luZG93IGFzIGFueSkuX19QQUxFVFRFX0RFVlRPT0xTX18gPSB7XG4gICAgZHVtcENhY2hlTWV0cmljczogKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coXCJDb21waWxlZCBUZW1wbGF0ZXMgQ2FjaGVcIiwgY29tcGlsZUNhY2hlLm1ldHJpY3MpO1xuICAgICAgY29uc29sZS5sb2coXCJIVE1MIEZyYWdtZW50cyBDYWNoZVwiLCBmcmFnbWVudENhY2hlLm1ldHJpY3MpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQSByZW5kZXJhYmxlIHRlbXBsYXRlIGZyb20gYW4gSFRNTFRlbXBsYXRlRWxlbWVudFxuICpcbiAqIExldmVyYWdlcyBhIHNpbXBsZSBzeW50YXggdG8gcHJvdmlkZSBhY2Nlc3NvcnMgdG8gdGVtcGxhdGUgZGF0YSBmcm9tIG9uZSBvZlxuICogZm91ciBjYXRlZ29yaWVzLCBiYXNlZCBvbiB1c2UgY2FzZTpcbiAqXG4gKiBgYGBcbiAqIGBAYCAtPiBUaGUgYGF0dHJgIG5hbWVzcGFjZSAodGhlIGhvc3QgZWxlbWVudCdzIGF0dHJpYnV0ZXMpXG4gKiBgJGAgLT4gVGhlIGBzdGF0ZWAgbmFtZXNwYWNlICh0aGUgaG9zdCBlbGVtZW50J3MgcmVhY3RpdmUgc3RhdGUpXG4gKiBgKmAgLT4gVGhlIGBkYXRhYCBuYW1lc3BhY2UgKHRoZSBob3N0IGVsZW1lbnQncyBjb21wdXRlZCBkYXRhKVxuICogYCNgIC0+IFRoZSBgaXRlbWAgbmFtZXNwYWNlIChsaXN0IGl0ZW0gYWNjZXNzIHdpdGggOjplYWNoKVxuICogYGBgXG4gKlxuICogQmluZCBhdHRyaWJ1dGVzIHRvIGEgdmFsdWUgdXNpbmcgdGhlIGA6YXR0cmlidXRlYCBzeW50YXg6XG4gKlxuICogYGBgaHRtbFxuICogPGRpdiA6aWQ9XCIkaWRcIiA6Y2xhc3M9XCJAY2xhc3NuYW1lXCI+PC9kaXY+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlIHtcbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgcmVsYXRlZCB0byB0aGUgZ2xvYmFsIFRlbXBsYXRlIGJ1aWxkIGNhY2hlLlxuICAgKlxuICAgKiBUaGlzIGlzIG5vdCBzb21ldGhpbmcgdHlwaWNhbGx5IG5lZWRlZCBmb3IgZ2VuZXJhbCBhcHAgZGV2ZWxvcG1lbnQsIGJ1dFxuICAgKiBhbGxvd3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gdG8gdHVuZSB0aGUgY2FjaGluZyBzeXN0ZW0gaWYgbmVlZCBiZS5cbiAgICpcbiAgICogQ2FjaGUgc2l6ZXMgZGVmYXVsdCB0byA1MDAgSFRNTCBUZW1wbGF0ZSBGcmFnbWVudHMgYW5kIGNvbXBpbGVkIFBhbGV0dGVcbiAgICogdGVtcGxhdGVzIChpbmNsdWRlcyBuZXN0ZWQgdGVtcGxhdGVzIGxpa2UgbGlzdHMpIHRvIGNvdmVyIG1vc3QgYXBwbGljYXRpb25cbiAgICogbmVlZHMgd2l0aG91dCB1c2luZyBtdWNoIG1lbW9yeS5cbiAgICovXG4gIHN0YXRpYyBjYWNoZSA9IHtcbiAgICAvKipcbiAgICAgKiBXaXBlIGFsbCBjYWNoZWQgdGVtcGxhdGVzIGFuZCBIVE1MIGZyYWdtZW50c1xuICAgICAqL1xuICAgIGNsZWFyOiAoKTogdm9pZCA9PiB7XG4gICAgICBmcmFnbWVudENhY2hlLmNsZWFyKCk7XG4gICAgICBjb21waWxlQ2FjaGUuY2xlYXIoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdGhlIGRlZmF1bHQgY2FjaGUgY2FwYWNpdHkgb2YgNTAwIGl0ZW1zIHBlciBjYWNoZVxuICAgICAqXG4gICAgICogR2VuZXJhbCBjYWNoaW5nIGd1aWRhbmNlOlxuICAgICAqIC0gOTUlIG9mIHRoZSB0aW1lLCA1MDAgd29ya3MgZmluZVxuICAgICAqIC0gRm9yIHZlcnkgbGFyZ2UgYXBwbGljYXRpb25zLCB1cCB0byAxMDAwIGlzIHJlYXNvbmFibGVcbiAgICAgKiAtIEZvciBzbWFsbGVyIGFwcHMsIGRyb3BwaW5nIGRvd24gdG8gMTAwIC0gMjUwIG1heSBzYXZlIG1lbW9yeVxuICAgICAqXG4gICAgICogVWx0aW1hdGVseSB0aGUgaW1wYWN0IHdpbGwgYmUgbWluaW1hbCB1bmxlc3MgeW91ciBhcHAgaGFzIHZlcnkgc3BlY2lmaWNcbiAgICAgKiByZW5kZXJpbmcgbmVlZHMuXG4gICAgICovXG4gICAgc2V0Q2FwYWNpdHk6IChtYXhTaXplOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIGZyYWdtZW50Q2FjaGUuc2V0Q2FwYWNpdHkobWF4U2l6ZSk7XG4gICAgICBjb21waWxlQ2FjaGUuc2V0Q2FwYWNpdHkobWF4U2l6ZSk7XG4gICAgfSxcbiAgfTtcblxuICBwcml2YXRlIF9jb21waWxlZDogQ29tcGlsZWRUZW1wbGF0ZTtcblxuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIHtAbGluayBIVE1MVGVtcGxhdGVFbGVtZW50fSB1c2VkIHRvIGNyZWF0ZSB0aGlzIFRlbXBsYXRlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBNYWtlIHN1cmUgdG8gbmV2ZXIgb3BlcmF0ZSBkaXJlY3RseSBvbiB0aGlzIGVsZW1lbnQuIEFsd2F5cyBjbG9uZS5cbiAgICovXG4gIHByaXZhdGUgX3RlbXBsYXRlRWxlbWVudD86IEhUTUxUZW1wbGF0ZUVsZW1lbnQ7XG5cbiAgLyoqIFRoZSBjdXJyZW50IGtub3duIHJvb3QgZWxlbWVudCB0aGF0IHRoaXMgVGVtcGxhdGUgaXMgcmVuZGVyZWQgaW50byAqL1xuICBwcml2YXRlIF9tb3VudGVkUm9vdD86IFRlbXBsYXRlUm9vdDtcblxuICAvKiogVGhlIG1vc3QgcmVjZW50IHNldCB2YWx1ZSBmb3IgZWFjaCBub3RhdGlvbiB0aGF0IGhhcyByZW5kZXJlZCAqL1xuICBwcml2YXRlIF9sYXRlc3RSZW5kZXJlZFZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqIFRoZSBhY3RpdmUgSFRNTEVsZW1lbnQgd2hpY2ggdGhlIHRlbXBsYXRlIGlzIHVwZGF0aW5nIG9uIHJlbmRlcnMgKi9cbiAgcHJpdmF0ZSBfZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQ7XG5cbiAgLyoqIFZhbHVlIE5vdGF0aW9ucyAtPiBTZXQ8UmVuZGVyIFBsYW5zPiAqL1xuICBwcml2YXRlIF9wbGFuc0J5Tm90YXRpb246IE1hcDxzdHJpbmcsIFNldDxBbnlSZW5kZXJQbGFuPj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqIFZhbHVlIE5vdGF0aW9ucyAtPiBBY2Nlc3NvciBmdW5jdGlvbnMgKi9cbiAgcHJpdmF0ZSBfbm90YXRpb25BY2Nlc3NvcnM6IE1hcDxzdHJpbmcsIE5vdGF0aW9uQWNjZXNzb3I+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlOiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgaWYgKHRlbXBsYXRlIGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgdGhpcy5fdGVtcGxhdGVFbGVtZW50ID0gdGVtcGxhdGU7XG4gICAgICBjb25zdCBjYWNoZWQgPSBjb21waWxlQ2FjaGUuZ2V0KHRlbXBsYXRlKTtcbiAgICAgIGNvbnN0IGNvbXBpbGVkID0gY2FjaGVkID8/IGNvbXBpbGVUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG4gICAgICB0aGlzLl9jb21waWxlZCA9IGNvbXBpbGVkO1xuXG4gICAgICAvLyBBbHdheXMgc2V0IHRoZSBjb21waWxlZCB0ZW1wbGF0ZSB0byBtb3ZlIGl0IHRvIHRoZSBmcm9udCBvZiB0aGUgY2FjaGVcbiAgICAgIGNvbXBpbGVDYWNoZS5zZXQodGVtcGxhdGUsIGNvbXBpbGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY29tcGlsZWQgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIGEgZnJhZ21lbnQgZnJvbSB0aGUgY29tcGlsZWQgSFRNTCAoY2FjaGVkKVxuICAgIGNvbnN0IGZyYWdtZW50ID0gaHRtbFRvRnJhZ21lbnQodGhpcy5fY29tcGlsZWQuaHRtbCk7XG4gICAgY29uc3QgaHlkcmF0ZWQgPSBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZSh0aGlzLl9jb21waWxlZCwgZnJhZ21lbnQpO1xuXG4gICAgdGhpcy5fcGxhbnNCeU5vdGF0aW9uID0gaHlkcmF0ZWQucGxhbnNCeU5vdGF0aW9uO1xuICAgIHRoaXMuX25vdGF0aW9uQWNjZXNzb3JzID0gaHlkcmF0ZWQubm90YXRpb25BY2Nlc3NvcnM7XG4gICAgdGhpcy5fZnJhZ21lbnQgPSBoeWRyYXRlZC5mcmFnbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBmdWxsIGNvcHkgb2YgdGhpcyB0ZW1wbGF0ZSBmb3IgdXNlIGluIHJlbmRlcmluZyB0byBhbm90aGVyIHJvb3RcbiAgICovXG4gIGNsb25lID0gKCk6IFRlbXBsYXRlID0+IHtcbiAgICByZXR1cm4gbmV3IFRlbXBsYXRlKHRoaXMuZWxlbWVudCgpKTtcbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybnMgQW4ge0BsaW5rIEhUTUxUZW1wbGF0ZUVsZW1lbnR9IHJlcHJlc2VudGluZyB0aGlzIHRlbXBsYXRlXG4gICAqL1xuICBlbGVtZW50ID0gKCk6IEhUTUxUZW1wbGF0ZUVsZW1lbnQgPT4ge1xuICAgIGlmICh0aGlzLl90ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gdGhpcy5fY29tcGlsZWQuaHRtbDtcbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH07XG5cbiAgcHJpdmF0ZSBfY29sbGVjdFVwZGF0ZWRWYWx1ZXMgPSAoXG4gICAgY29udGV4dDogVGVtcGxhdGVDb250ZXh0LFxuICApOiBNYXA8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgY29uc3QgdXBkYXRlZFZhbHVlcyA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuXG4gICAgZm9yIChjb25zdCBbcmF3Tm90YXRpb24sIGFjY2Vzc29yXSBvZiB0aGlzLl9ub3RhdGlvbkFjY2Vzc29ycykge1xuICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuX2xhdGVzdFJlbmRlcmVkVmFsdWVzLmdldChyYXdOb3RhdGlvbik7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IGFjY2Vzc29yKGNvbnRleHQpO1xuXG4gICAgICBpZiAocHJldmlvdXNWYWx1ZSAhPT0gbmV3VmFsdWUgJiYgIU9iamVjdC5pcyhwcmV2aW91c1ZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgICAgdXBkYXRlZFZhbHVlcy5zZXQocmF3Tm90YXRpb24sIG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZFZhbHVlcztcbiAgfTtcblxuICBwcml2YXRlIF91cGRhdGUobmV3VmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGNvbnN0IHNjaGVkdWxlZFBsYW5zOiBTZXQ8QW55UmVuZGVyUGxhbj4gPSBuZXcgU2V0KCk7XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVKb2JzOiBBdHRyaWJ1dGVVcGRhdGVKb2JbXSA9IFtdO1xuICAgIGNvbnN0IGNvbnRlbnRTd2FwSm9iczogQ29udGVudFN3YXBKb2JbXSA9IFtdO1xuICAgIGNvbnN0IHRhZ0NoYW5nZUpvYnM6IFRhZ0NoYW5nZUpvYltdID0gW107XG4gICAgY29uc3QgbGlzdFJlbmRlckpvYnM6IExpc3RSZW5kZXJKb2JbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbbm90YXRpb25dIG9mIG5ld1ZhbHVlcykge1xuICAgICAgY29uc3QgYWZmZWN0ZWRQbGFucyA9IHRoaXMuX3BsYW5zQnlOb3RhdGlvbi5nZXQobm90YXRpb24pO1xuXG4gICAgICBpZiAoYWZmZWN0ZWRQbGFucykge1xuICAgICAgICBmb3IgKGNvbnN0IHBsYW4gb2YgYWZmZWN0ZWRQbGFucykge1xuICAgICAgICAgIGlmIChzY2hlZHVsZWRQbGFucy5oYXMocGxhbikpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjaGVkdWxlZFBsYW5zLmFkZChwbGFuKTtcblxuICAgICAgICAgIHN3aXRjaCAocGxhbi50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiYXR0clwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGpvYiA9IHByZXBhcmVBdHRyaWJ1dGVKb2IocGxhbiwgbmV3VmFsdWVzKTtcbiAgICAgICAgICAgICAgaWYgKGpvYiAhPT0gU0tJUFBFRF9KT0IpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVKb2JzLnB1c2goam9iKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJlYWNoXCI6IHtcbiAgICAgICAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUxpc3RSZW5kZXJKb2IocGxhbiwgbmV3VmFsdWVzKTtcbiAgICAgICAgICAgICAgaWYgKGpvYiAhPT0gU0tJUFBFRF9KT0IpIHtcbiAgICAgICAgICAgICAgICBsaXN0UmVuZGVySm9icy5wdXNoKGpvYik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwic3dhcFwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGpvYiA9IHByZXBhcmVDb250ZW50U3dhcEpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRTd2FwSm9icy5wdXNoKGpvYik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidGFnXCI6IHtcbiAgICAgICAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZVRhZ0NoYW5nZUpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgICAgICAgIHRhZ0NoYW5nZUpvYnMucHVzaChqb2IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgLy8gU2hvdWxkIGJlIGltcG9zc2libGUgZ2l2ZW4gYW4gZXhoYXVzdGl2ZSBzd2l0Y2ggY2FzZVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJ1bkF0dHJpYnV0ZUpvYnMoYXR0cmlidXRlSm9icyk7XG4gICAgcnVuTGlzdFJlbmRlckpvYnMobGlzdFJlbmRlckpvYnMpO1xuICAgIHJ1bkNvbnRlbnRTd2FwSm9icyhjb250ZW50U3dhcEpvYnMpO1xuICAgIHJ1blRhZ0NoYW5nZUpvYnModGFnQ2hhbmdlSm9icyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoaXMgdGVtcGxhdGUgaW50byBhIHRhcmdldCBob3N0IGVsZW1lbnQuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIElmIG5vIGNvbnRleHQgaXMgcHJvdmlkZWQsIHRoZSByb290IGVsZW1lbnQgaXMgdXNlZCBhcyB0aGUgY29udGV4dCwgd2hpY2hcbiAgICogYWxsb3dzIGZvciBhY2Nlc3NpbmcgbmVzdGVkIHByb3BlcnRpZXMgb2YgdGhlIGhvc3QgZWxlbWVudCBpdHNlbGYuXG4gICAqL1xuICByZW5kZXIgPSAocm9vdDogVGVtcGxhdGVSb290LCBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQpOiB2b2lkID0+IHtcbiAgICBpZiAocm9vdCAhPT0gdGhpcy5fbW91bnRlZFJvb3QpIHtcbiAgICAgIHRoaXMuX21vdW50ZWRSb290ID0gcm9vdDtcbiAgICAgIHdoaWxlIChyb290LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgcm9vdC5yZW1vdmVDaGlsZChyb290LmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICByb290LmFwcGVuZCh0aGlzLl9mcmFnbWVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRWYWx1ZXMgPSB0aGlzLl9jb2xsZWN0VXBkYXRlZFZhbHVlcyhjb250ZXh0KTtcblxuICAgIGlmIChyZXNvbHZlZFZhbHVlcy5zaXplICE9PSAwKSB7XG4gICAgICB0aGlzLl91cGRhdGUocmVzb2x2ZWRWYWx1ZXMpO1xuXG4gICAgICAvLyBTYXZlIHRoZSB2YWx1ZXMgdGhhdCB3ZXJlIHVzZWQgZm9yIHRoaXMgcmVuZGVyIGlmIHRoZSByZW5kZXIgc3VjY2VlZGVkXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgcmVzb2x2ZWRWYWx1ZXMpIHtcbiAgICAgICAgdGhpcy5fbGF0ZXN0UmVuZGVyZWRWYWx1ZXMuc2V0KGtleSwgdmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IHsgZWxlbWVudE1hdGNoZXMgfSBmcm9tIFwiI3V0aWxcIjtcblxuZXhwb3J0IHR5cGUgRXZlbnROYW1lID0ga2V5b2YgR2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TWFwO1xuZXhwb3J0IHR5cGUgRXZlbnRIYW5kbGVyPEsgZXh0ZW5kcyBFdmVudE5hbWUgPSBFdmVudE5hbWU+ID0gKFxuICBldmVudDogR2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TWFwW0tdLFxuKSA9PiB2b2lkO1xuXG50eXBlIEV2ZW50SGFuZGxlck1hcCA9IE1hcDxzdHJpbmcsIEV2ZW50SGFuZGxlcj47XG5cbi8qKlxuICogTWFuYWdlZCBldmVudCBkZWxlZ2F0aW9uIHRvIGNvYWxlc2NlIGV2ZW50IGxpc3RlbmVycyBmb3IgYW4gZW50aXJlIHRyZWUgaW50b1xuICogc2luZ2xlIHJvb3QtbGV2ZWwgbGlzdGVuZXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBMaXN0ZW4gZm9yIGV2ZW50cyBmcm9tIGFueSBjaGlsZCBlbGVtZW50IG9mIHRoZSBkZWxlZ2F0ZWQgcm9vdFxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGRlbGVnYXRvciA9IG5ldyBFdmVudERlbGVnYXRvcigkcm9vdCk7XG4gKiBkZWxlZ2F0b3IuYWRkRGVsZWdhdGVkTGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGljayk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogTGlzdGVuIGZvciBldmVudHMgZnJvbSBjaGlsZCBlbGVtZW50cyBtYXRjaGluZyBgLmFjdGlvbmBcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkZWxlZ2F0b3IgPSBuZXcgRXZlbnREZWxlZ2F0b3IoJHJvb3QpO1xuICogZGVsZWdhdG9yLmFkZERlbGVnYXRlZExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2xpY2ssIFwiLmFjdGlvblwiKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnREZWxlZ2F0b3Ige1xuICBwcml2YXRlIF9yb290OiBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3QgfCBEb2N1bWVudDtcbiAgcHJpdmF0ZSBfcm9vdExpc3RlbmVyczogRXZlbnRIYW5kbGVyTWFwID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9ldmVudHM6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFNldDxFdmVudEhhbmRsZXI+Pj4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3Iocm9vdDogSFRNTEVsZW1lbnQgfCBTaGFkb3dSb290IHwgRG9jdW1lbnQgPSBkb2N1bWVudCkge1xuICAgIHRoaXMuX3Jvb3QgPSByb290O1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlcnNGb3JFdmVudChldmVudDogc3RyaW5nKTogTWFwPHN0cmluZywgU2V0PEV2ZW50SGFuZGxlcj4+IHtcbiAgICBsZXQgaGFuZGxlck1hcCA9IHRoaXMuX2V2ZW50cy5nZXQoZXZlbnQpO1xuXG4gICAgaWYgKGhhbmRsZXJNYXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFuZGxlck1hcCA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMuX2V2ZW50cy5zZXQoZXZlbnQsIGhhbmRsZXJNYXApO1xuICAgIH1cblxuICAgIHJldHVybiBoYW5kbGVyTWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlcnNGb3JFdmVudEFuZFF1ZXJ5PEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIGV2ZW50OiBFLFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNldDxFdmVudEhhbmRsZXI8RT4+IHtcbiAgICBjb25zdCBoYW5kbGVyTWFwID0gdGhpcy5faGFuZGxlcnNGb3JFdmVudChldmVudCk7XG4gICAgbGV0IGhhbmRsZXJTZXQgPSBoYW5kbGVyTWFwLmdldChxdWVyeSk7XG5cbiAgICBpZiAoaGFuZGxlclNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYW5kbGVyU2V0ID0gbmV3IFNldCgpO1xuICAgICAgaGFuZGxlck1hcC5zZXQocXVlcnksIGhhbmRsZXJTZXQpO1xuICAgIH1cblxuICAgIHJldHVybiBoYW5kbGVyU2V0O1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlUm9vdExpc3RlbmVyKGV2ZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Jvb3RMaXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ZW5lciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZXJzRm9yRXZlbnQgPSB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50TmFtZSk7XG4gICAgICBjb25zdCB7IHRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgIGlmICh0YXJnZXQgPT09IG51bGwgfHwgISh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IHRhcmdldDtcblxuICAgICAgbGV0IHN0b3BJbW1lZGlhdGVDYWxsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRm4gPSBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb247XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSAoKSA9PiB7XG4gICAgICAgIG9yaWdpbmFsRm4uY2FsbChldmVudCk7XG4gICAgICAgIHN0b3BJbW1lZGlhdGVDYWxsZWQgPSB0cnVlO1xuICAgICAgfTtcblxuICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IHRoaXMuX3Jvb3QpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgaW52YWxpZCBlbGVtZW50c1xuICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHtcbiAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW52b2tlIGhhbmRsZXJzXG4gICAgICAgIGZvciAoY29uc3QgW3F1ZXJ5LCBoYW5kbGVyc10gb2YgaGFuZGxlcnNGb3JFdmVudCkge1xuICAgICAgICAgIGlmIChxdWVyeSA9PT0gXCIqXCIgfHwgZWxlbWVudE1hdGNoZXMobm9kZSwgcXVlcnkpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKG5vZGUsIGV2ZW50KTtcblxuICAgICAgICAgICAgICAvLyBSZXNwZWN0IC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBhbmQgLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgaWYgKHN0b3BJbW1lZGlhdGVDYWxsZWQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc3BlY3QgLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgIGlmIChldmVudC5jYW5jZWxCdWJibGUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLl9yb290IHx8IG5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5fcm9vdExpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgdGhpcy5fcm9vdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgYWRkTGlzdGVuZXI8RSBleHRlbmRzIEV2ZW50TmFtZT4oXG4gICAgZXZlbnROYW1lOiBFLFxuICAgIGhhbmRsZXI6IEV2ZW50SGFuZGxlcjxFPixcbiAgICBxdWVyeUZpbHRlcjogc3RyaW5nID0gXCIqXCIsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2hhbmRsZXJzRm9yRXZlbnRBbmRRdWVyeShldmVudE5hbWUsIHF1ZXJ5RmlsdGVyKS5hZGQoaGFuZGxlcik7XG4gICAgdGhpcy5fY3JlYXRlUm9vdExpc3RlbmVyKGV2ZW50TmFtZSk7XG4gIH1cblxuICByZW1vdmVMaXN0ZW5lcihcbiAgICBldmVudE5hbWU6IEV2ZW50TmFtZSxcbiAgICBoYW5kbGVyOiBFdmVudEhhbmRsZXIsXG4gICAgcXVlcnlGaWx0ZXI6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaGFuZGxlclNldCA9IHRoaXMuX2hhbmRsZXJzRm9yRXZlbnRBbmRRdWVyeShldmVudE5hbWUsIHF1ZXJ5RmlsdGVyKTtcbiAgICBoYW5kbGVyU2V0LmRlbGV0ZShoYW5kbGVyKTtcblxuICAgIC8vIElmIHRoYXQgd2FzIHRoZSBsYXN0IGhhbmRsZXIgZm9yIHRoYXQgZXZlbnQvcXVlcnkgY29tYm8sIGRlbGV0ZSB0aGUgc2V0XG4gICAgaWYgKGhhbmRsZXJTZXQuc2l6ZSA9PT0gMCkge1xuICAgICAgY29uc3QgZXZlbnRIYW5kbGVyU2V0cyA9IHRoaXMuX2hhbmRsZXJzRm9yRXZlbnQoZXZlbnROYW1lKTtcbiAgICAgIGV2ZW50SGFuZGxlclNldHMuZGVsZXRlKHF1ZXJ5RmlsdGVyKTtcbiAgICB9XG4gIH1cblxuICBjbGVhbnVwID0gKCk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgW2V2ZW50LCBoYW5kbGVyXSBvZiB0aGlzLl9yb290TGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9yb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xuICAgIH1cblxuICAgIHRoaXMuX3Jvb3RMaXN0ZW5lcnMuY2xlYXIoKTtcbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgY3NzIH0gZnJvbSBcIiNoZWxwZXJcIjtcbmltcG9ydCB7IFN0YXRlIH0gZnJvbSBcIiNzdGF0ZVwiO1xuaW1wb3J0IHsgVGVtcGxhdGUsIHR5cGUgVGVtcGxhdGVDb250ZXh0IH0gZnJvbSBcIiN0ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgY3JlYXRlQXR0cmlidXRlTWFwLCBzZXJpYWxpemVBdHRyaWJ1dGUgfSBmcm9tIFwiI3V0aWxcIjtcbmltcG9ydCB7IEV2ZW50RGVsZWdhdG9yLCB0eXBlIEV2ZW50SGFuZGxlciwgdHlwZSBFdmVudE5hbWUgfSBmcm9tIFwiLi9kZWxlZ2F0b3JcIjtcbmltcG9ydCB0eXBlIHtcbiAgQXR0cmlidXRlTWFwLFxuICBDb21wb25lbnRTdHlsZXMsXG4gIENvbXB1dGVkUHJvcGVydGllcyxcbiAgTGl2ZUF0dHJpYnV0ZXMsXG4gIFN0YXRlSW5pdGlhbGl6ZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmNvbnN0IE1BWF9TRVFVRU5USUFMX1JFTkRFUlMgPSAxMDA7XG5jb25zdCBCTEFOS19URU1QTEFURSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcblxudHlwZSBJbnRlcm5hbFJlbmRlclN0YXR1cyA9IHtcbiAgd2lsbFJlbmRlcjogYm9vbGVhbjtcbiAgaXNSZW5kZXJpbmc6IGJvb2xlYW47XG4gIHNlcXVlbnRpYWxSZW5kZXJzOiBudW1iZXI7XG4gIHBvc3RSZW5kZXJDYWxsYmFja3M6IFNldDxWb2lkRnVuY3Rpb24+O1xuICBsYXN0UmVuZGVyZWRBdHRyaWJ1dGVNYXA6IEF0dHJpYnV0ZU1hcDtcbiAgdHJhY2tlZEF0dHJpYnV0ZUNoYW5nZXM6IEF0dHJpYnV0ZU1hcDtcbn07XG5cbi8qKlxuICogVGhlICoqQ29tcG9uZW50KiogY2xhc3MgZXh0ZW5kcyB0aGUgYmFzZSBIVE1MRWxlbWVudCBjbGFzcyB0byBwcm92aWRlIGFuXG4gKiBlcmdvbm9taWMgd2F5IHRvIGRlc2lnbiBhbmQgZGV2ZWxvcCBXZWIgQ29tcG9uZW50cyB3aXRoIHJlYWN0aXZlIHN0YXRlLFxuICogbWFuYWdlZCBhdHRyaWJ1dGVzLCBhbmQgZHluYW1pYyB0ZW1wbGF0aW5nLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50PFxuICBTdGF0ZVNoYXBlIGV4dGVuZHMgb2JqZWN0ID0ge30sXG4+IGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuICAvLyDila3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila5cbiAgLy8g4pSCICAgICAgICAgICAgICAgICBTdGF0aWMgSGVscGVyIE1ldGhvZHMgICAgICAgICAgICAgICAgICDilIJcbiAgLy8g4pWw4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWvXG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgQ29tcG9uZW50IHdpdGggdGhlIGJyb3dzZXIuIE9wdGlvbmFsbHkgcHJvdmlkZSBhbiBvdmVycmlkaW5nXG4gICAqIHRhZyBuYW1lLlxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGNvbXBvbmVudDogQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yIHwgdHlwZW9mIENvbXBvbmVudCxcbiAgICB0YWdOYW1lPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgICB0eXBlb2Ygd2luZG93LmN1c3RvbUVsZW1lbnRzID09PSBcInVuZGVmaW5lZFwiXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBTElEX0VOVik7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50VGFnbmFtZSA9XG4gICAgICBcInRhZ05hbWVcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC50YWdOYW1lID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY29tcG9uZW50LnRhZ05hbWVcbiAgICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGNvbXB1dGVkVGFnbmFtZSA9IHRhZ05hbWUgPz8gY29tcG9uZW50VGFnbmFtZTtcblxuICAgIGlmIChcbiAgICAgIGNvbXB1dGVkVGFnbmFtZSA9PT0gbnVsbCB8fFxuICAgICAgY29tcHV0ZWRUYWduYW1lLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgIWNvbXB1dGVkVGFnbmFtZS5pbmNsdWRlcyhcIi1cIilcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFMSURfVEFHTkFNRSk7XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5jdXN0b21FbGVtZW50cy5nZXQoY29tcHV0ZWRUYWduYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuRFVQRV9UQUdOQU1FLCB0YWdOYW1lID8/IFwiXCIpO1xuICAgIH1cblxuICAgIHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoXG4gICAgICBjb21wdXRlZFRhZ25hbWUsXG4gICAgICBjb21wb25lbnQgYXMgQ3VzdG9tRWxlbWVudENvbnN0cnVjdG9yLFxuICAgICk7XG4gIH1cblxuICAvLyDila3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila5cbiAgLy8g4pSCICAgICAgIFN0YXRpYyBDb21wb25lbnQgQ29uZmlndXJhdGlvbiBQcm9wZXJ0aWVzICAgICAgICDilIJcbiAgLy8g4pWw4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWvXG5cbiAgLyoqXG4gICAqIFRoZSBIVE1MIHRhZyBuYW1lIHRvIHVzZSBmb3IgdGhpcyBDb21wb25lbnRcbiAgICovXG4gIHN0YXRpYyB0YWdOYW1lOiBzdHJpbmcgPSBcIlwiO1xuXG4gIC8qKlxuICAgKiBBbiBIVE1MIFRlbXBsYXRlIGVsZW1lbnQgZm9yIHRoaXMgZWxlbWVudCB0byB1c2UuXG4gICAqL1xuICBzdGF0aWMgdGVtcGxhdGU6IEhUTUxUZW1wbGF0ZUVsZW1lbnQgfCBUZW1wbGF0ZSA9IEJMQU5LX1RFTVBMQVRFO1xuXG4gIC8qKlxuICAgKiBBIHtAbGluayBDU1NTdHlsZVNoZWV0fSBhcnJheSB0byBhZG9wdCB0byB0aGUgZWxlbWVudCdzIHNoYWRvdyBET01cbiAgICovXG4gIHN0YXRpYyBzdHlsZXM6IENvbXBvbmVudFN0eWxlcyA9IFtdO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBodG1sIGF0dHJpYnV0ZSBuYW1lcyB0byBvYnNlcnZlIHRvIHRyaWdnZXIgdXBkYXRlcy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogSWYgeW91IHVzZSB0aGUge0BsaW5rIGRlZmluZX0gZmFjdG9yeSBoZWxwZXIsIHRoaXMgdmFsdWUgd2lsbCBiZVxuICAgKiBhdXRvbWF0aWNhbGx5IG1lcmdlZCB3aXRoIGEgbGlzdCBvZiBhbnkgZGVmaW5lZCB7QGxpbmsgbGl2ZUF0dHJpYnV0ZXN9LlxuICAgKi9cbiAgc3RhdGljIG9ic2VydmVkQXR0cmlidXRlczogc3RyaW5nW10gPSBbXTtcblxuICAvKipcbiAgICogVGhlIG1vZGUgZm9yIHRoaXMgQ29tcG9uZW50J3MgU2hhZG93Um9vdC5cbiAgICpcbiAgICogLSBgXCJvcGVuXCJgIGFsbG93cyBKUyBhY2Nlc3MgdG8gdGhlIGNoaWxkcmVuIG9mIHRoaXMgY29tcG9uZW50XG4gICAqIC0gYFwiY2xvc2VkXCJgIChkZWZhdWx0KSBkaXNhbGxvd3MgaW50ZXJuYWwgSlMgYWNjZXNzXG4gICAqL1xuICBzdGF0aWMgc2hhZG93Um9vdE1vZGU6IFwiY2xvc2VkXCIgfCBcIm9wZW5cIiA9IFwiY2xvc2VkXCI7XG5cbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICAgICAgICAgICAgIExpZmVjeWNsZSBQcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIC8qKlxuICAgKiBQcmltYXJ5IHNjcmlwdGluZyBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqXG4gICAqIFVzZSBgc2NyaXB0KClgIHRvIGRlZmluZSBwcmltYXJ5IGJlaGF2aW9ycywgbGlzdGVuZXJzLCBhbmQgaW5pdGlhbGl6YXRpb25zLlxuICAgKlxuICAgKiBJZiBuZWVkIGJlLCByZXR1cm4gYSBmdW5jdGlvbiB0byBhdXRvbWF0aWNhbGx5IGNhbGwgd2hlbiB0aGUgY29tcG9uZW50IGlzXG4gICAqIHVubW91bnRpbmcgZm9yIGNsZWFudXAgc2NyaXB0cy4gQWx0ZXJuYXRpdmVseSwgdXNlIHtAbGluayBmaW5hbGl6ZX0gZm9yXG4gICAqIGNsZWFudXAgdGFza3MsIHdoaWNoIHdpbGwgYWx3YXlzIHJ1biBsYXN0LCBldmVuIGFmdGVyIHRoZSByZXR1cm5lZCBmdW5jdGlvblxuICAgKiBmcm9tIHNjcmlwdCgpLlxuICAgKi9cbiAgcHJvdGVjdGVkIHNjcmlwdD8oKTogVm9pZEZ1bmN0aW9uIHwgdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBlYWNoIHRlbXBsYXRlIHVwZGF0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIGJlZm9yZVVwZGF0ZT8oKTogdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggdGVtcGxhdGUgdXBkYXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgYWZ0ZXJVcGRhdGU/KHByZXZpb3VzQXR0cmlidXRlczogTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYXMgdGhlIGZpbmFsIGxpZmVjeWNsZSBtZXRob2QgYXQgdGhlIGVuZCBvZiB0aGUgdW5tb3VudGluZyBwcm9jZXNzLlxuICAgKlxuICAgKiBDb250ZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGFuZCB0aGUgY29tcG9uZW50IGlzIG5vIGxvbmdlclxuICAgKiBjb25zaWRlcmVkIG1vdW50ZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIHJ1bnMuXG4gICAqXG4gICAqIFVzZSB0aGlzIGZvciBmaW5hbCBjbGVhbnVwIHRhc2tzIGFuZCBmcmVlaW5nIHJlc291cmNlcy5cbiAgICovXG4gIHByb3RlY3RlZCBmaW5hbGl6ZT8oKTogdm9pZDtcblxuICAvKipcbiAgICogSWYgZGVmaW5lZCwgcmVjZWl2ZXMgZXJyb3JzIGNhdWdodCBkdXJpbmcgdGhlIGxpZmVjeWNsZSBtZXRob2RzIG9mIHRoaXNcbiAgICogY29tcG9uZW50IGFuZCBpdCdzIGNoaWxkcmVuLiBJZiBub3QgZGVmaW5lZCwgdGhpcyBjb21wb25lbnQgd2lsbCBpbnN0ZWFkXG4gICAqIHRocm93IGVycm9ycyBhcyB0aGV5IGFyZSBmb3VuZC5cbiAgICpcbiAgICogSWYgdGhlIGVycm9yIGNhbm5vdCBiZSBoYW5kbGVkLCBgb25FcnJvcigpYCBzaG91bGQgcmUtdGhyb3cgaXQgZm9yIGEgaGlnaGVyXG4gICAqIHVwIGNvbXBvbmVudCB0byBldmFsdWF0ZS5cbiAgICpcbiAgICogVG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIHdoaWxlIHJlbW92aW5nIGFuIGVycm9yaW5nIGNvbXBvbmVudCBmcm9tIHRoZVxuICAgKiBET00sIHVzZSBgdGhpcy5yZXBsYWNlV2l0aCgpYCBhbmQgYSBuZXdseSBjb25zdHJ1Y3RlZCBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBSZWNvdmVyaW5nIGZyb20gZXJyb3JzIG9yIGRpc3BsYXlpbmcgYSBmYWxsYmFja1xuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG9uRXJyb3IoZXJyb3IpIHtcbiAgICogICAvLyBIYW5kbGUga25vd24gZXJyb3JzXG4gICAqICAgaWYgKGVycm9yLm1lc3NhZ2UgPSBcIkludmFsaWQgSW5wdXRcIikge1xuICAgKiAgICAgdGhpcy5zdGF0ZS5pbnB1dCA9IFwiXCI7XG4gICAqICAgICByZXR1cm47XG4gICAqICAgfVxuICAgKlxuICAgKiAgIC8vIERpc3BsYXkgYSBmYWxsYmFjayBiYW5uZXJcbiAgICogICBjb25zdCBiYW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgKiAgIGJhbm5lci50ZXh0Q29udGVudCA9IFwiQW4gdW5leHBlY3RlZCBlcnJvciBkb25lIGRpZFwiO1xuICAgKiAgIHRoaXMucmVwbGFjZVdpdGgoYmFubmVyKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHByb3RlY3RlZCBvbkVycm9yPyhlcnJvcjogdW5rbm93bik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGlzIENvbXBvbmVudCdzIHJlYWN0aXZlIGludGVybmFsIHN0YXRlLCBpZiBhbnkuXG4gICAqXG4gICAqIElmIGBpbml0aWFsU3RhdGVgIGlzIGRlZmluZWQgYXMgYSBmdW5jdGlvbiwgdGhlIGZ1bmN0aW9uIGlzIGV2YWx1YXRlZCBhdFxuICAgKiBtb3VudGluZyB0aW1lIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGluaXRpYWwgc3RhdGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdGlhbFN0YXRlPzogU3RhdGVJbml0aWFsaXplcjxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHJldHVybmluZyBhbiBvYmplY3Qgd2hpY2ggcG9wdWxhdGVzIHRoZSBgZGF0YWAgdmFsdWVzXG4gICAqIGluIHRoZSB0ZW1wbGF0aW5nIGVuZ2luZS4gU3VjaCB2YWx1ZXMgYXJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBgKmAgbm90YXRpb24uXG4gICAqXG4gICAqIFdoZW4gYSBob3N0ZWQgdmFsdWUgaXMgYWNjZXNzZWQsIGl0J3MgdmFsdWUgaXMgY29lcmNlZCBiYXNlZCBvbiB0aGUgd2F5IGl0XG4gICAqIGlzIGJlaW5nIHVzZWQuIEZvciBhdHRyaWJ1dGVzLCB2YWx1ZXMgYXJlIHNlcmlhbGl6ZWQgdG8gYSBzdHJpbmcgb3IgbnVsbCxcbiAgICogd2hpY2ggd2lsbCBzZXQgdGhlIGF0dHJpYnV0ZSAoc3RyaW5nKSBvciByZW1vdmUgaXQgKG51bGwpLlxuICAgKlxuICAgKiBGb3IgY29udGVudCBzd2Fwcywgc3RyaW5ncywgbnVtYmVycyBhbmQgYm9vbGVhbnMgYXJlIHJlbmRlcmVkIGFzIHN0cmluZ3NcbiAgICogYW5kIHNldCBhcyB0ZXh0Q29udGVudC4gbnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlcyByZW5kZXIgbm90aGluZyAod2l0aCBhXG4gICAqIGNvbW1lbnQgcGxhY2Vob2xkZXIpLCBhbiBIVE1MRWxlbWVudCB3aWxsIGJlIHN3YXBwZWQgaW4gYXMgYSBjbG9uZWQgbm9kZS5cbiAgICpcbiAgICogRnVuY3Rpb25zIGFyZSBldmFsdWF0ZWQgYXQgcmVuZGVyL3VwZGF0ZSB0aW1lLCBhbmQgdGhlaXIgcmV0dXJuIHZhbHVlIGlzXG4gICAqIHVzZWQgaW5zdGVhZC4gRnVuY3Rpb25zIGFyZSBwYXNzZWQgdGhlIGN1cnJlbnQgdGFyZ2V0IG5vZGUgYWNjZXNzaW5nIHRoZVxuICAgKiBwcm9wZXJ0eSBhcyBpdHMgZmlyc3QgYW5kIG9ubHkgYXJndW1lbnQuXG4gICAqXG4gICAqIE90aGVyIHR5cGVzIGFyZSB1bnN1cHBvcnRlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBob3N0ID0ge1xuICAgKiAgIGF2YXRhclVybDogXCJodHRwOi8vLi4uXCIsXG4gICAqICAgcmVuZGVyVGltZTogKCkgPT4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBgYGBodG1sXG4gICAqIDxpbWcgOnNyYz1cIiphdmF0YXJVcmxcIiAvPlxuICAgKiA8c3Bhbj5SZW5kZXJlZCBhdCAke1wiKnJlbmRlclRpbWVcIn08L3NwYW4+XG4gICAqIGBgYFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbXB1dGVkUHJvcGVydGllcz86IENvbXB1dGVkUHJvcGVydGllczxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogRGVjbGFyYXRpb24gb2YgYXR0cmlidXRlIGJlaGF2aW9ycyBkdXJpbmcgdXBkYXRlcy5cbiAgICpcbiAgICogRWFjaCBrZXkgaXMgdGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlLiBWYWx1ZXMgYXJlIGFuIG9iamVjdCB3aXRoIHR3b1xuICAgKiBvcHRpb25hbCBmdW5jdGlvbiBkZWZpbml0aW9uczpcbiAgICpcbiAgICogYG9uQ2hhbmdlKG5ld1ZhbHVlLCBvbGRWYWx1ZSk6IHZvaWRgLCBhIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHdoZW4gdGhlIHZhbHVlXG4gICAqIG9mIHRoaXMgYXR0cmlidXRlIGhhcyBjaGFuZ2VkLiBSdW5zIG9uY2UgcGVyIHVwZGF0ZSBjeWNsZSwgKmJlZm9yZSogdGhlXG4gICAqIHVwZGF0ZSBvY2N1cnMuXG4gICAqXG4gICAqIGByZWZsZWN0KCk6IHVua25vd25gLCBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSB2YWx1ZSB0byBzZXJpYWxpemUgYW5kIHNldFxuICAgKiBhcyB0aGlzIGF0dHJpYnV0ZSAqYWZ0ZXIqIGFuIHVwZGF0ZSBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbGl2ZUF0dHJpYnV0ZXMgPSB7XG4gICAqICAgZG9uZToge1xuICAgKiAgICAgb25DaGFuZ2UobmV3VmFsdWUpIHtcbiAgICogICAgICAgdGhpcy5zdGF0ZS5zZXQoXCJkb25lXCIsICEhbmV3VmFsdWUpO1xuICAgKiAgICAgfSxcbiAgICogICAgIHJlZmxlY3QoKSB7IHJldHVybiB0aGlzLnN0YXRlLmN1cnJlbnQuZG9uZSB9XG4gICAqICAgfVxuICAgKiB9O1xuICAgKiBgYGBcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICpcbiAgICogSWYgdXNpbmcgdGhlIHtAbGluayBkZWZpbmV9IGhlbHBlciwgdGhlIGtleXMgb2YgdGhpcyBwcm9wZXJ0eSBhcmVcbiAgICogYXV0b21hdGljYWxseSBtZXJnZWQgd2l0aCBhbnkgZGVmaW5lZCB7QGxpbmsgb2JzZXJ2ZWRBdHRyaWJ1dGVzfS5cbiAgICpcbiAgICogSWYgeW91IGFyZSBkaXJlY3RseSBleHRlbmRpbmcgdGhlIGNsYXNzLCBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBtdXN0IGJlXG4gICAqIGV4cGxpY2l0bHkgZGVmaW5lZCB3aXRoIGFueSBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIG1vbml0b3JlZCwgcmVnYXJkbGVzc1xuICAgKiBvZiBpZiB0aGV5J3JlIGRlZmluZWQgaGVyZS5cbiAgICovXG4gIHByb3RlY3RlZCBsaXZlQXR0cmlidXRlcz86IExpdmVBdHRyaWJ1dGVzPFN0YXRlU2hhcGU+O1xuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgICAgICBJbnRlcm5hbCBTdGF0ZSBNYW5hZ2VtZW50ICAgICAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICBwcml2YXRlIF9pc0NvbXBvbmVudE1vdW50ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIF90ZW1wbGF0ZTogVGVtcGxhdGU7XG4gIHByaXZhdGUgX3Jvb3Q6IFNoYWRvd1Jvb3Q7XG4gIHByaXZhdGUgX3N0YXRlPzogU3RhdGU8U3RhdGVTaGFwZT47XG4gIHByaXZhdGUgX2RlbGVnYXRvcj86IEV2ZW50RGVsZWdhdG9yO1xuICBwcml2YXRlIF9vd25MaXN0ZW5lcnM6IFNldDx7XG4gICAgaGFuZGxlcjogRXZlbnRIYW5kbGVyO1xuICAgIGV2ZW50OiBFdmVudE5hbWU7XG4gIH0+ID0gbmV3IFNldCgpO1xuICBwcml2YXRlIF9saXZlQXR0cmlidXRlQ29uZmlnczogTWFwPFxuICAgIHN0cmluZyxcbiAgICBMaXZlQXR0cmlidXRlczxTdGF0ZVNoYXBlPltzdHJpbmddXG4gID4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX25leHRMaXN0ZW5lckF1dG9JZCA9IDA7XG4gIHByaXZhdGUgX2NsZWFudXBGbj86IFZvaWRGdW5jdGlvbjtcblxuICBwcml2YXRlIF9yZW5kZXJJbnRlcm5hbHM6IEludGVybmFsUmVuZGVyU3RhdHVzID0ge1xuICAgIHdpbGxSZW5kZXI6IGZhbHNlLFxuXG4gICAgLyoqIFdoZW4gc2V0IHRvIGB0cnVlYCwgdGhlIHJlbmRlci91cGRhdGUgcHJvY2VzcyBpcyBhY3RpdmVseSBydW5uaW5nICovXG4gICAgaXNSZW5kZXJpbmc6IGZhbHNlLFxuICAgIHNlcXVlbnRpYWxSZW5kZXJzOiAwLFxuICAgIHBvc3RSZW5kZXJDYWxsYmFja3M6IG5ldyBTZXQoKSxcbiAgICBsYXN0UmVuZGVyZWRBdHRyaWJ1dGVNYXA6IG5ldyBNYXAoKSxcbiAgICB0cmFja2VkQXR0cmlidXRlQ2hhbmdlczogbmV3IE1hcCgpLFxuICB9O1xuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgICAgSW50ZXJuYWxzIGFuZCBQcml2YXRlIE1ldGhvZHMgICAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgY29uc3QgeyB0ZW1wbGF0ZSwgc3R5bGVzLCBzaGFkb3dSb290TW9kZSB9ID0gdGhpc1xuICAgICAgLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBDb21wb25lbnQ7XG5cbiAgICAvLyBOb3JtYWxpemUgc3R5bGVzIHRvIGFuIGFycmF5IG9mIENTU1N0eWxlU2hlZXQgb2JqZWN0c1xuICAgIGNvbnN0IG5ld1N0eWxlcyA9IEFycmF5LmlzQXJyYXkoc3R5bGVzKVxuICAgICAgPyBzdHlsZXNcbiAgICAgIDogdHlwZW9mIHN0eWxlcyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IFtzdHlsZXNdXG4gICAgICAgIDogW2Nzc2Ake3N0eWxlc31gXTtcblxuICAgIHRoaXMuX3Jvb3QgPSB0aGlzLmF0dGFjaFNoYWRvdyh7IG1vZGU6IHNoYWRvd1Jvb3RNb2RlIH0pO1xuICAgIHRoaXMuX3Jvb3QuYWRvcHRlZFN0eWxlU2hlZXRzLnB1c2goLi4ubmV3U3R5bGVzKTtcbiAgICB0aGlzLl90ZW1wbGF0ZSA9XG4gICAgICB0ZW1wbGF0ZSBpbnN0YW5jZW9mIFRlbXBsYXRlID8gdGVtcGxhdGUgOiBuZXcgVGVtcGxhdGUodGVtcGxhdGUpO1xuICB9XG5cbiAgLyoqIFByb2R1Y2UgdGhlIGRhdGEgb2JqZWN0IHRvIHBhc3MgdG8gdGhlIHRlbXBsYXRlJ3MgcmVuZGVyIGZ1bmN0aW9uICovXG4gIHByaXZhdGUgX2dldFJlbmRlckNvbnRleHQoYXR0cjogTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4pOiBUZW1wbGF0ZUNvbnRleHQge1xuICAgIC8vIENvbXB1dGVkIHByb3BlcnRpZXNcbiAgICBjb25zdCBkYXRhID1cbiAgICAgIHR5cGVvZiB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gdGhpcy5jb21wdXRlZFByb3BlcnRpZXMoKVxuICAgICAgICA6IHRoaXMuY29tcHV0ZWRQcm9wZXJ0aWVzO1xuXG4gICAgLy8gQ3VycmVudCBzdGF0ZVxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5pbml0aWFsU3RhdGUgPyB0aGlzLl9zYWZlR2V0U3RhdGUoKS5jdXJyZW50IDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGEsXG4gICAgICBhdHRyOiBPYmplY3QuZnJvbUVudHJpZXMoYXR0ciksXG4gICAgICBzdGF0ZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfc2FmZUdldFN0YXRlKCk6IFN0YXRlPFN0YXRlU2hhcGU+IHtcbiAgICBpZiAoIXRoaXMuaW5pdGlhbFN0YXRlIHx8ICF0aGlzLl9zdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuTUlTU0lOR19TVEFURSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RXJyb3IoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBFcnJvcnMgZHVyaW5nIHJlc3VycmVjdGlvbiBjYXVzZSBhbiBpbW1lZGlhdGUgdGhyb3csIGFzIGRvZXMgYSBsYWNrIG9mXG4gICAgLy8gYW4gb25FcnJvciBoYW5kbGVyXG4gICAgaWYgKCF0aGlzLm9uRXJyb3IpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIF9leGVjdXRlQXR0cmlidXRlQ2hhbmdlSGFuZGxlcnMgPSAoKSA9PiB7XG4gICAgY29uc3QgcHJldkF0dHJzID0gdGhpcy5fcmVuZGVySW50ZXJuYWxzLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZU1hcDtcblxuICAgIC8vIENvcHkgdGhlIGNoYW5nZXMgdG8gYSBuZXcgbWFwIGFuZCBjbGVhciB0aGUgdHJhY2tpbmcgbWFwXG4gICAgY29uc3QgdHJhY2tlZENoYW5nZXMgPSBuZXcgTWFwKFxuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLFxuICAgICk7XG4gICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLmNsZWFyKCk7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWxdIG9mIHRyYWNrZWRDaGFuZ2VzKSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLl9saXZlQXR0cmlidXRlQ29uZmlncy5nZXQobmFtZSk7XG4gICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFwib25DaGFuZ2VcIiBpbiBjb25maWcpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHByZXZBdHRycy5nZXQobmFtZSkgPz8gbnVsbDtcblxuICAgICAgICBpZiAoY29uZmlnICYmIHByZXZpb3VzVmFsdWUgIT09IHZhbCkge1xuICAgICAgICAgIGNvbmZpZy5vbkNoYW5nZT8uY2FsbCh0aGlzLCB2YWwsIHByZXZpb3VzVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgX3JlZmxlY3RMaXZlQXR0cmlidXRlcyA9ICgpID0+IHtcbiAgICBjb25zdCB0b1NldDogW25hbWU6IHN0cmluZywgdmFsOiBzdHJpbmcgfCBudWxsXVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb25maWddIG9mIHRoaXMuX2xpdmVBdHRyaWJ1dGVDb25maWdzKSB7XG4gICAgICBpZiAoXCJyZWZsZWN0XCIgaW4gY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHNlcmlhbGl6ZUF0dHJpYnV0ZShjb25maWcucmVmbGVjdD8uY2FsbCh0aGlzKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcblxuICAgICAgICBpZiAodmFsICE9PSBjdXJyZW50KSB7XG4gICAgICAgICAgdG9TZXQucHVzaChbbmFtZSwgdmFsXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWxdIG9mIHRvU2V0KSB7XG4gICAgICB0aGlzLnJlZmxlY3RBdHRyaWJ1dGUobmFtZSwgdmFsKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIFRoZSBhY3R1YWwgdXBkYXRlIGJlaGF2aW9yICovXG4gIHByaXZhdGUgX3BlcmZvcm1VcGRhdGUgPSAoKTogdm9pZCA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEltbWVkaWF0ZWx5IGZsaXAgZmxhZ3MgdG8gZGVub3RlIGEgcmVuZGVyIGlzIGluIHByb2dyZXNzIGFuZCBhbGxvd1xuICAgICAgLy8gcXVldWVpbmcgYW5vdGhlciByZW5kZXIgcmVxdWVzdC5cbiAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy5pc1JlbmRlcmluZyA9IHRydWU7XG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlciA9IGZhbHNlO1xuXG4gICAgICAvLyBBdHRyaWJ1dGVzOiBSdW4gYW55IGByZWFkYCBob29rcyBmb3IgY2hhbmdlZCBhdHRyaWJ1dGVzXG4gICAgICB0aGlzLl9leGVjdXRlQXR0cmlidXRlQ2hhbmdlSGFuZGxlcnMoKTtcblxuICAgICAgLy8gQ2FjaGUgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgcHJldmlvdXMgcmVuZGVyXG4gICAgICBjb25zdCBwcmV2QXR0cnMgPSB0aGlzLl9yZW5kZXJJbnRlcm5hbHMubGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwO1xuXG4gICAgICB0aGlzLmJlZm9yZVVwZGF0ZT8uY2FsbCh0aGlzKTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBjdXJyZW50IHNuYXBzaG90IG9mIGF0dHJpYnV0ZXNcbiAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBjcmVhdGVBdHRyaWJ1dGVNYXAodGhpcyk7XG4gICAgICB0aGlzLl90ZW1wbGF0ZS5yZW5kZXIodGhpcy5yb290LCB0aGlzLl9nZXRSZW5kZXJDb250ZXh0KG5ld0F0dHJpYnV0ZXMpKTtcbiAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy5sYXN0UmVuZGVyZWRBdHRyaWJ1dGVNYXAgPSBuZXdBdHRyaWJ1dGVzO1xuICAgICAgdGhpcy5hZnRlclVwZGF0ZT8uY2FsbCh0aGlzLCBwcmV2QXR0cnMpO1xuXG4gICAgICAvLyBBdHRyaWJ1dGVzOiBSdW4gYW55IGB3cml0ZWAgaG9va3MgZm9yIHVwZGF0ZWQgdmFsdWVzXG4gICAgICB0aGlzLl9yZWZsZWN0TGl2ZUF0dHJpYnV0ZXMoKTtcblxuICAgICAgLy8gUnVuIGFueSByZXF1ZXN0ZWQgcmVuZGVyIGNhbGxiYWNrc1xuICAgICAgLy8gVGhlc2UgYXJlIGNvbnNpZGVyZWQgbGlmZWN5Y2xlIG1ldGhvZHMgYXMgd2VsbCwgYW5kIHdpbGwgcmVwb3J0IGVycm9yc1xuICAgICAgLy8gYXMgYW55IG90aGVyIGxpZmVjeWNsZSBtZXRob2Qgd291bGRcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcy5zaXplKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IEFycmF5LmZyb20odGhpcy5fcmVuZGVySW50ZXJuYWxzLnBvc3RSZW5kZXJDYWxsYmFja3MpO1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcy5jbGVhcigpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZm4gb2YgY2FsbGJhY2tzKSB7XG4gICAgICAgICAgZm4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgYHdpbGxSZW5kZXJgIGZsYWcgd2FzIGZsaXBwZWQsIGltbWVkaWF0ZWx5IHBlcmZvcm0gYSByZW5kZXJcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlcikge1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMuc2VxdWVudGlhbFJlbmRlcnMgKz0gMTtcblxuICAgICAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLnNlcXVlbnRpYWxSZW5kZXJzID49IE1BWF9TRVFVRU5USUFMX1JFTkRFUlMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgICAgICAgRXJyb3JDb2RlLk1BWF9TRVFVRU5USUFMX1JFTkRFUlMsXG4gICAgICAgICAgICBgJHt0aGlzLl9yZW5kZXJJbnRlcm5hbHMuc2VxdWVudGlhbFJlbmRlcnN9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcGVyZm9ybVVwZGF0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnNlcXVlbnRpYWxSZW5kZXJzID0gMDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLndpbGxSZW5kZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBTYWZlbHkgcmVxdWVzdCBmb3IgYW4gdXBkYXRlIHRvIHJ1biBvbiB0aGUgbmV4dCBmcmFtZSAqL1xuICBwcml2YXRlIF9zY2hlZHVsZVVwZGF0ZSA9ICgpID0+IHtcbiAgICAvLyBQcmV2ZW50IHNjaGVkdWxpbmcgbXVsdGlwbGUgcmVuZGVyc1xuICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JlbmRlckludGVybmFscy53aWxsUmVuZGVyID0gdHJ1ZTtcblxuICAgIC8vIElmIGN1cnJlbnRseSByZW5kZXJpbmcsIGRvbid0IHJlcXVlc3QgYSByZW5kZXIsIGl0IHdpbGwgYXV0by1jb250aW51ZVxuICAgIC8vIHVudGlsIHRoZXJlIGFyZSBubyBjaGFuZ2VzIHRvIHJlbmRlclxuICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMuaXNSZW5kZXJpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIHJlbmRlciBpcyByZXF1ZXN0ZWQgYW5kIHdlJ3JlIG5vdCByZW5kZXJpbmcsIHJlcXVlc3QgYSByZW5kZXIgZnJhbWVcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fcGVyZm9ybVVwZGF0ZSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBfYWRvcHRTdGF0ZShzdGF0ZTogU3RhdGVTaGFwZSB8IFN0YXRlPFN0YXRlU2hhcGU+KSB7XG4gICAgLy8gSWYgc3RhdGUgZXhpc3RzLCByZW1vdmUgdGhlIGxpc3RlbmVyIGFuZCBzY2hlZHVsZSBhIHJlbmRlclxuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgdGhpcy5fc3RhdGUucmVtb3ZlTGlzdGVuZXIodGhpcy5fc2NoZWR1bGVVcGRhdGUpO1xuICAgICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBBZG9wdCB0aGUgaW5jb21pbmcgc3RhdGUgb2JqIG9yIHdyYXAgYW5kIGFkb3B0IGl0XG4gICAgY29uc3QgaW5jb21pbmdTdGF0ZU9iaiA9IHN0YXRlIGluc3RhbmNlb2YgU3RhdGUgPyBzdGF0ZSA6IG5ldyBTdGF0ZShzdGF0ZSk7XG4gICAgdGhpcy5fc3RhdGUgPSBpbmNvbWluZ1N0YXRlT2JqO1xuXG4gICAgLy8gRW5zdXJlIHRoZXJlIGlzIG5vdCBhY2NpZGVudGFsbHkgdHdvIG9mIHRoZSBzYW1lIHJlbmRlciBsaXN0ZW5lcnNcbiAgICB0aGlzLl9zdGF0ZS5yZW1vdmVMaXN0ZW5lcih0aGlzLl9zY2hlZHVsZVVwZGF0ZSk7XG4gICAgdGhpcy5fc3RhdGUuYWRkTGlzdGVuZXIodGhpcy5fc2NoZWR1bGVVcGRhdGUpO1xuICB9XG5cbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICAgICAgQ3VzdG9tIEVsZW1lbnQgQ2FsbGJhY2sgT3ZlcnJpZGVzICAgICAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNjcmlwdH0gaW5zdGVhZFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0NvbXBvbmVudE1vdW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IGNyZWF0ZUF0dHJpYnV0ZU1hcCh0aGlzKTtcbiAgICAgIHRoaXMuX2xpdmVBdHRyaWJ1dGVDb25maWdzID0gbmV3IE1hcChcbiAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5saXZlQXR0cmlidXRlcyA/PyB7fSksXG4gICAgICApO1xuXG4gICAgICAvLyBJZiB0aGlzIGlzIGEgc3RhdGVmdWwgY29tcG9uZW50LCBzZXQgdXAgdGhhdCBzdGF0ZVxuICAgICAgaWYgKHRoaXMuaW5pdGlhbFN0YXRlKSB7XG4gICAgICAgIGNvbnN0IGluaXQgPVxuICAgICAgICAgIHR5cGVvZiB0aGlzLmluaXRpYWxTdGF0ZSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgPyB0aGlzLmluaXRpYWxTdGF0ZVxuICAgICAgICAgICAgOiB0aGlzLmluaXRpYWxTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMuX2Fkb3B0U3RhdGUoaW5pdCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3RlbXBsYXRlLnJlbmRlcih0aGlzLnJvb3QsIHRoaXMuX2dldFJlbmRlckNvbnRleHQoYXR0cmlidXRlcykpO1xuICAgICAgdGhpcy5fcmVmbGVjdExpdmVBdHRyaWJ1dGVzKCk7XG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMubGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwID0gYXR0cmlidXRlcztcbiAgICAgIHRoaXMuX2lzQ29tcG9uZW50TW91bnRlZCA9IHRydWU7XG4gICAgICB0aGlzLl9jbGVhbnVwRm4gPSB0aGlzLnNjcmlwdD8uY2FsbCh0aGlzKSA/PyB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBmaW5hbGl6ZX1cbiAgICovXG4gIHByb3RlY3RlZCBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAvLyBPbmx5IHJ1biB0aGUgZGlzY29ubmVjdCBpZiB0aGUgZWxlbWVudCBpcyBhY3R1YWxseSB1bm1vdW50ZWQgYW5kIG5vdFxuICAgICAgLy8ganVzdCBtb3ZlZC4gVXNpbmcgdGhpcyBpbiBwbGFjZSBvZiBjb25uZWN0ZWRNb3ZlQ2FsbGJhY2soKSBmb3IgY29tcGF0XG4gICAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQgJiYgdGhpcy5faXNDb21wb25lbnRNb3VudGVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fZGVsZWdhdG9yPy5jbGVhbnVwKCk7XG5cbiAgICAgICAgICAvLyBDbGVhciBhbnkgbGlzdGVuZXJzIHNldCB1cCBvbiBzZWxmXG4gICAgICAgICAgaWYgKHRoaXMuX293bkxpc3RlbmVycy5zaXplID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9vd25MaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGxpc3RlbmVyLmV2ZW50LCBsaXN0ZW5lci5oYW5kbGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLl9jbGVhbnVwRm4/LmNhbGwodGhpcyk7XG4gICAgICAgICAgdGhpcy5faXNDb21wb25lbnRNb3VudGVkID0gZmFsc2U7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoZXJyb3IpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIC8vIFJ1biB0aGUgZmluYWxpemUgY2FsbCBhZnRlciBldmVyeXRoaW5nLCBldmVuIGlmIHRoZSBjbGVhbnVwIGZuIGZhaWxlZFxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmZpbmFsaXplPy5jYWxsKHRoaXMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBsaXZlQXR0cmlidXRlc30gaW5zdGVhZFxuICAgKi9cbiAgcHJvdGVjdGVkIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgXzogc3RyaW5nIHwgbnVsbCxcbiAgICBuZXdWYWx1ZTogc3RyaW5nIHwgbnVsbCxcbiAgKTogdm9pZCB7XG4gICAgLy8gSWdub3JlIGF0dHJpYnV0ZSBjaGFuZ2VzIHRoYXQgb2NjdXIgZHVyaW5nIGFuIHVwZGF0ZSwgYXMgdGhleSBhcmVcbiAgICAvLyBjb21pbmcgZnJvbSBpbnNpZGUgdGhlIGhvdXNlXG4gICAgaWYgKHRoaXMuX3JlbmRlckludGVybmFscy5pc1JlbmRlcmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNraXAgbm9uLWNoYW5nZXMgdXNpbmcgdGhlIHN0b3JlZCBhdHRyaWJ1dGVzIGFzIHJlZmVyZW5jZSB0byBjb21wYXJlXG4gICAgLy8gdG8gdGhlIHJlbmRlciBzdGF0ZSByYXRoZXIgdGhhbiB0aGUgZG9tXG4gICAgaWYgKFxuICAgICAgbmV3VmFsdWUgPT09IHRoaXMuX3JlbmRlckludGVybmFscy5sYXN0UmVuZGVyZWRBdHRyaWJ1dGVNYXA/LmdldChuYW1lKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENhY2hlIHRoZSB1cGRhdGVkIGF0dHJpYnV0ZSB2YWx1ZVxuICAgIHRoaXMuX3JlbmRlckludGVybmFscy50cmFja2VkQXR0cmlidXRlQ2hhbmdlcy5zZXQobmFtZSwgbmV3VmFsdWUpO1xuXG4gICAgLy8gU2NoZWR1bGUgYSByZW5kZXJcbiAgICBpZiAoIXRoaXMuX3JlbmRlckludGVybmFscy53aWxsUmVuZGVyKSB7XG4gICAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgICAgICAgICAgIFB1YmxpYyBJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICAvKipcbiAgICogVGhlIFNoYWRvd1Jvb3Qgbm9kZSBvZiB0aGlzIGVsZW1lbnRcbiAgICovXG4gIGdldCByb290KCk6IFNoYWRvd1Jvb3Qge1xuICAgIHJldHVybiB0aGlzLl9yb290O1xuICB9XG5cbiAgLyoqXG4gICAqIERpcmVjdGx5IGFjY2VzcyBhbmQgbWFuaXB1bGF0ZSB0aGlzIENvbXBvbmVudCdzIHJlYWN0aXZlIHN0YXRlIHdpdGggZGVlcFxuICAgKiByZWFjdGl2aXR5IGVuYWJsZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW5pdGlhbFN0YXRlID0geyB2YWx1ZXM6IHsgY291bnQ6IDEsIHRpbWU6IDAgfSB9O1xuICAgKlxuICAgKiBpbmNyZW1lbnQoKSB7XG4gICAqICAgdGhpcy5zdGF0ZS52YWx1ZXMuY291bnQgPSAyO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGlzIGlzIGEgc2hvcnRoYW5kIGdldHRlciBmb3IgYHRoaXMuZ2V0U3RhdGUoKS5saXZlYFxuICAgKi9cbiAgZ2V0IHN0YXRlKCk6IFN0YXRlU2hhcGUge1xuICAgIHJldHVybiB0aGlzLl9zYWZlR2V0U3RhdGUoKS5saXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIGN1cnJlbnQgc3RhdGUgd2l0aCBhIG5ldyB2YWx1ZSBvciBhZG9wdCBhIHdob2xlIGRpZmZlcmVudCBTdGF0ZVxuICAgKiBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBTdGF0ZSByZXBsYWNlbWVudFxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIEFsd2F5cyB0cmlnZ2VycyBhIHJlbmRlclxuICAgKiB0aGlzLnN0YXRlID0geyBzb21lOiBcIm5ld1N0YXRlXCIgfVxuICAgKlxuICAgKiAvLyBBZG9wdCBhIG5ldyBzdGF0ZSBpbnN0YW5jZSBhbHRvZ2V0aGVyXG4gICAqIGNvbnN0IG90aGVyU3RhdGUgPSBuZXcgU3RhdGUoe3NvbWU6IFwibmV3U3RhdGVcIn0pO1xuICAgKiB0aGlzLnN0YXRlID0gb3RoZXJTdGF0ZTtcbiAgICpcbiAgICogLy8gQ2F1c2VzIGEgcmVuZGVyXG4gICAqIG90aGVyU3RhdGUuc2V0KFwic29tZVwiLCBcInZhbHVlXCIpO1xuICAgKiBgYGBcbiAgICovXG4gIHNldCBzdGF0ZShuZXdTdGF0ZTogU3RhdGVTaGFwZSB8IFN0YXRlPFN0YXRlU2hhcGU+KSB7XG4gICAgaWYgKCF0aGlzLl9zdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuTUlTU0lOR19TVEFURSk7XG4gICAgfSBlbHNlIGlmIChuZXdTdGF0ZSBpbnN0YW5jZW9mIFN0YXRlKSB7XG4gICAgICAvLyBDaGFuZ2UgY3VycmVudCBpbnRlcm5hbCBzdGF0ZSBmb3IgbmV3IG9iamVjdFxuICAgICAgdGhpcy5fc3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIHRoaXMuX3N0YXRlLmFkZExpc3RlbmVyKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0UmVuZGVyKCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVxdWVzdFJlbmRlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdGF0ZS5yZXBsYWNlKG5ld1N0YXRlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWNjZXNzIHRoZSBmdWxsIHtAbGluayBTdGF0ZX0gaW5zdGFuY2UgZm9yIHRoaXMgQ29tcG9uZW50LlxuICAgKlxuICAgKiBVc2luZyB0aGlzIG1ldGhvZCBvbiBhIGNvbXBvbmVudCB3aGljaCBpcyBub3QgdXNpbmcgcmVhY3RpdmUgc3RhdGVcbiAgICogd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IgYmVpbmcgdGhyb3duLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBSZXRyaWV2ZSBzdGF0ZWZ1bCB2YWx1ZVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNsYXNzIEV4YW1wbGUgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgKiAgIGluaXRpYWxTdGF0ZSA9IHsgY291bnQ6IDEgfTtcbiAgICpcbiAgICogICBzY3JpcHQoKSB7XG4gICAqICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuZ2V0U3RhdGUoKTtcbiAgICogICAgIGNvbnNvbGUubG9nKGBUaGUgY291bnQgaXMgJHtzdGF0ZS5nZXQoXCJjb3VudFwiKX1gKTtcbiAgICogICB9XG4gICAqXG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFNldCBhIHN0YXRlZnVsIHZhbHVlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY2xhc3MgRXhhbXBsZSBleHRlbmRzIENvbXBvbmVudCB7XG4gICAqICAgaW5pdGlhbFN0YXRlID0geyBjb3VudDogMSB9O1xuICAgKlxuICAgKiAgIGluY3JlbWVudCgpIHtcbiAgICogICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgKiAgICAgY29uc3QgY3VycmVudCA9IHN0YXRlLmdldChcImNvdW50XCIpO1xuICAgKiAgICAgc3RhdGUuc2V0KFwiY291bnRcIiwgY3VycmVudCArIDEpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGdldFN0YXRlKCk6IFN0YXRlPFN0YXRlU2hhcGU+IHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZUdldFN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogTWFudWFsbHkgc2NoZWR1bGUgYSByZW5kZXIgdG8gb2NjdXJcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogQ2FsbGluZyB7QGxpbmsgcmVxdWVzdFJlbmRlcn0gbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWUgZXZlbnQgbG9vcCB3b24ndFxuICAgKiBzY2hlZHVsZSBtdWx0aXBsZSByZW5kZXJzLiBSZW5kZXJzIGFyZSBzY2hlZHVsZWQgdG8gb2NjdXIgb24gdGhlIG5leHRcbiAgICogYW5pbWF0aW9uIGZyYW1lLlxuICAgKi9cbiAgcmVxdWVzdFJlbmRlcihjYWxsYmFjaz86IFZvaWRGdW5jdGlvbik6IHZvaWQge1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnBvc3RSZW5kZXJDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG1hbmFnZWQgZXZlbnQgbGlzdGVuZXIgb24gdGhpcyBDb21wb25lbnQgd2l0aCBhbiBvcHRpb25hbCBxdWVyeVxuICAgKiBmaWx0ZXIgc3RyaW5nIHRvIHNwZWNpZnkgd2hpY2ggZWxlbWVudHMgdG8gbGlzdGVuIHRvIGV2ZW50cyBmcm9tLlxuICAgKlxuICAgKiBFdmVudCBoYW5kbGVycyBzZXQgdXAgd2l0aCBgbGlzdGVuKClgIGFyZSBhdXRvbWF0aWNhbGx5IGNsZWFuZWQgdXAgd2hlblxuICAgKiB0aGUgY29tcG9uZW50IGlzIHVubW91bnRlZC4gRXZlbnQgbGlzdGVuZXJzIGFyZSBleGVjdXRlZCB3aXRoIHRoaXMgaW5zdGFuY2VcbiAgICogYXMgdGhlIGB0aGlzYCBiaW5kaW5nLlxuICAgKlxuICAgKiBIYW5kbGVycyBhcmUgZGVsZWdhdGVkIHRvIGEgc2luZ2xlIGxpc3RlbmVyIHBlciBldmVudCBvbiB0aGUgcm9vdCBvZiB0aGVcbiAgICogQ29tcG9uZW50LCB3aGljaCBpcyB0aGUgY2xvc2VkIFNoYWRvd1Jvb3QgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogU2V0IHVwIGFuIGV2ZW50IGxpc3RlbmVyIGZvciBhIGNsaWNrIGV2ZW50IGZyb20gYSBidXR0b24gd2l0aCBJRCBcInN1Ym1pdFwiXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGhpcy5saXN0ZW4oXCIjc3VibWl0XCIsIFwiY2xpY2tcIiwgdGhpcy5oYW5kbGVDbGljayk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBTZXQgdXAgYW4gZXZlbnQgbGlzdGVuZXIgb24gdGhlIGhvc3QgZWxlbWVudCBpdHNlbGYgKGB0aGlzYCkuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVXNlIFwiOmhvc3RcIiBvciBcIjpIT1NUXCIgYXMgdGhlIHF1ZXJ5IHNlbGVjdG9yIHRvIHRhcmdlIHRoZSBob3N0IGVsZW1lbnRcbiAgICogdGhpcy5saXN0ZW4oXCI6aG9zdFwiLCBcImFuaW1hdGlvbmVuZFwiLCB0aGlzLmhhbmRsZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIGxpc3RlbjxFIGV4dGVuZHMgRXZlbnROYW1lPihcbiAgICB0YXJnZXREZXNjcmlwdG9yOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50PGFueT4gfCBIVE1MRWxlbWVudCxcbiAgICBldmVudE5hbWU6IEUsXG4gICAgZXZlbnRIYW5kbGVyOiBFdmVudEhhbmRsZXI8RT4sXG4gICk6IHZvaWQge1xuICAgIGxldCBxdWVyeSA9IFwiXCI7XG5cbiAgICAvLyBDcmVhdGUgYSBxdWVyeSBmaWx0ZXIgZnJvbSB0aGUgdGFyZ2V0IGRlc2NyaXB0b3JcbiAgICBpZiAodGFyZ2V0RGVzY3JpcHRvciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgYW4gSUQsIHVzZSB0aGF0XG4gICAgICBpZiAodGFyZ2V0RGVzY3JpcHRvci5pZC5sZW5ndGgpIHtcbiAgICAgICAgcXVlcnkgPSBgIyR7dGFyZ2V0RGVzY3JpcHRvci5pZH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkSWQgPSBgbGlzdGVuLSR7dGhpcy5fbmV4dExpc3RlbmVyQXV0b0lkKyt9YDtcbiAgICAgICAgdGFyZ2V0RGVzY3JpcHRvci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWxpc3RlbmVyLWlkXCIsIGdlbmVyYXRlZElkKTtcbiAgICAgICAgcXVlcnkgPSBgW2RhdGEtbGlzdGVuZXItaWQ9XCIke2dlbmVyYXRlZElkfVwiXWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGFyZ2V0RGVzY3JpcHRvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAvLyBJZiB0aGUgdGFyZ2V0IGRlc2NyaXB0b3IgaXMgYSBDb21wb25lbnQgY2xhc3MsIHB1bGwgdGhlIHRhZ25hbWVcbiAgICAgIHF1ZXJ5ID0gdGFyZ2V0RGVzY3JpcHRvci50YWdOYW1lO1xuXG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBpZiAodGFyZ2V0RGVzY3JpcHRvci50YWdOYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBbQ29tcG9uZW50XSBBdXRvbWF0aWMgbGlzdGVuZXIgc2V0dXAgZmFpbHVyZTogQ29tcG9uZW50ICR7dGFyZ2V0RGVzY3JpcHRvci5uYW1lfSBoYXMgbm8gZGVmaW5lZCB0YWduYW1lYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHF1ZXJ5ID0gdGFyZ2V0RGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgcXVlcnkgZmlsdGVyIGlzIGBcIjpob3N0XCJgLCBzZXQgdXAgYW4gb3duTGlzdGVuZXJcbiAgICBpZiAocXVlcnkgPT09IFwiOmhvc3RcIiB8fCBxdWVyeSA9PT0gXCI6SE9TVFwiKSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gZXZlbnRIYW5kbGVyLmJpbmQodGhpcykgYXMgRXZlbnRIYW5kbGVyO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICB0aGlzLl9vd25MaXN0ZW5lcnMuYWRkKHtcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgZXZlbnQ6IGV2ZW50TmFtZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgc2V0IHVwIGEgcm9vdCBsaXN0ZW5lclxuICAgIGlmICghdGhpcy5fZGVsZWdhdG9yKSB7XG4gICAgICB0aGlzLl9kZWxlZ2F0b3IgPSBuZXcgRXZlbnREZWxlZ2F0b3IodGhpcy5yb290KTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWxlZ2F0b3IuYWRkTGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIuYmluZCh0aGlzKSwgcXVlcnkpO1xuICB9XG5cbiAgZGlzcGF0Y2hFdmVudChldmVudDogRXZlbnQpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhIHtAbGluayBDdXN0b21FdmVudH0gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGRldGFpbFxuICAgKlxuICAgKiBAZXhhbXBsZSBEZWZpbmluZyBjdXN0b20gZXZlbnRzXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRGVmaW5lIHR5cGVzLiBUaGlzIGNhbiBoYXBwZW4gaW4gdGhlIHNhbWUgZmlsZSBvciBlbHNld2hlcmUgZm9yIGNvbW1vblxuICAgKiAvLyBhbmQgc2hhcmVkIGV2ZW50cy5cbiAgICogZXhwb3J0IHR5cGUgTXlFdmVudCA9IEN1c3RvbUV2ZW50PFQ+IC8vIFNldCBgVGAgdG8gdGhlIGV2ZW50IGRldGFpbCB0eXBlXG4gICAqXG4gICAqIGRlY2xhcmUgZ2xvYmFsIHtcbiAgICogIGludGVyZmFjZSBHbG9iYWxFdmVudEhhbmRsZXJzRXZlbnRNYXAge1xuICAgKiAgICBcIm15LWV2ZW50LW5hbWVcIjogTXlFdmVudFxuICAgKiAgfVxuICAgKiB9XG4gICAqXG4gICAqIC8vIERpc3BhdGNoIGEgY3VzdG9tIGV2ZW50XG4gICAqIHRoaXMuZGlzcGF0Y2hFdmVudChcIm15LWV2ZW50LW5hbWVcIiwgVCk7XG4gICAqXG4gICAqIC8vIExpc3RlbiB0byBhIGN1c3RvbSBldmVudFxuICAgKiAkZWwuYWRkRXZlbnRMaXN0ZW5lcihcIm15LWV2ZW50LW5hbWVcIiwgLi4uKTtcbiAgICogYGBgXG4gICAqL1xuICBkaXNwYXRjaEV2ZW50PFQ+KFxuICAgIGV2ZW50OiBzdHJpbmcsXG4gICAgZGV0YWlsPzogVCxcbiAgICBvcHRpb25zPzoge1xuICAgICAgYnViYmxlczogYm9vbGVhbjtcbiAgICAgIGNhbmNlbGFibGU6IGJvb2xlYW47XG4gICAgICBjb21wb3NlZDogYm9vbGVhbjtcbiAgICB9LFxuICApOiBib29sZWFuO1xuICBkaXNwYXRjaEV2ZW50PFQ+KFxuICAgIGV2ZW50OiBzdHJpbmcgfCBFdmVudCxcbiAgICBkZXRhaWw/OiBULFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBidWJibGVzOiBib29sZWFuO1xuICAgICAgY2FuY2VsYWJsZTogYm9vbGVhbjtcbiAgICAgIGNvbXBvc2VkOiBib29sZWFuO1xuICAgIH0sXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudCBpbnN0YW5jZW9mIEV2ZW50KSB7XG4gICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICAgICAgY29tcG9zZWQ6IHRydWUsXG4gICAgICAuLi4ob3B0aW9ucyA/PyB7fSksXG4gICAgfTtcblxuICAgIHJldHVybiBzdXBlci5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3IEN1c3RvbUV2ZW50PFQ+KGV2ZW50LCB7XG4gICAgICAgIGRldGFpbCxcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBxdWVyeVNlbGVjdG9yPEUgZXh0ZW5kcyBIVE1MRWxlbWVudD4ocXVlcnk6IHN0cmluZyk6IEUgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vdC5xdWVyeVNlbGVjdG9yKHF1ZXJ5KTtcbiAgfVxuXG4gIHF1ZXJ5U2VsZWN0b3JBbGw8RSBleHRlbmRzIEhUTUxFbGVtZW50PihxdWVyeTogc3RyaW5nKTogTm9kZUxpc3RPZjxFPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3QucXVlcnlTZWxlY3RvckFsbChxdWVyeSkgYXMgTm9kZUxpc3RPZjxFPjtcbiAgfVxuXG4gIGdldEVsZW1lbnRCeUlkPEUgZXh0ZW5kcyBIVE1MRWxlbWVudD4oaWQ6IHN0cmluZyk6IEUgfCBudWxsIHtcbiAgICBpZiAodGhpcy5fcm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yb290LmdldEVsZW1lbnRCeUlkKGlkKSBhcyBFIHwgbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIEhUTUxFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yLmNhbGwoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAjJHtpZH1gLFxuICAgICAgKSBhcyBFIHwgbnVsbDtcbiAgICB9XG4gIH1cblxuICByZXF1aXJlRWxlbWVudEJ5SWQ8RSBleHRlbmRzIEhUTUxFbGVtZW50PihpZDogc3RyaW5nKTogRSB7XG4gICAgY29uc3QgbG9va3VwID0gdGhpcy5nZXRFbGVtZW50QnlJZDxFPihpZCk7XG4gICAgaWYgKCFsb29rdXApIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLk1JU1NJTkdfRUxFTUVOVCk7XG4gICAgfVxuICAgIHJldHVybiBsb29rdXA7XG4gIH1cblxuICBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IGEgdmFsdWUgYXMgYW4gYXR0cmlidXRlLCBzZXJpYWxpemluZyB0byBhIHN0cmluZyBvciBgbnVsbGAuXG4gICAqXG4gICAqIG51bGwgdmFsdWVzIGNhdXNlIHRoZSBhdHRyaWJ1dGUgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoaXMgZWxlbWVudFxuICAgKi9cbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBzZXJpYWxpemVBdHRyaWJ1dGUodmFsdWUpO1xuICAgIGlmIChzZXJpYWxpemVkID09PSBudWxsKSB7XG4gICAgICBIVE1MRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLmNhbGwodGhpcywgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIEhUTUxFbGVtZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUuY2FsbCh0aGlzLCBuYW1lLCBzZXJpYWxpemVkKTtcbiAgICB9XG4gIH1cblxuICBnZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogR2V0IGFuIGF0dHJpYnV0ZSBhcyBhIG51bWJlciwgZmFsbGluZyBiYWNrIHRvIGEgc3BlY2lmaWVkIGRlZmF1bHQuXG4gICAqXG4gICAqXG4gICAqIGBudWxsYCBhdHRyaWJ1dGVzIGFyZSByZXR1cm5lZCBhcyBgbnVsbGAsIHdoaWxlIHN0cmluZyBhdHRyaWJ1dGVzIGFyZVxuICAgKiBwYXJzZWQgdXNpbmcgdGhlIGBOdW1iZXIoKWAgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIFZhbHVlcyB3aGljaCBldmFsdWF0ZSB0byBOYU4gYXJlIHJldHVybmVkIGFzIGBudWxsYC5cbiAgICovXG4gIGdldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXR0cmlidXRlIGFzIGEgc3RyaW5nLCBmYWxsaW5nIGJhY2sgdG8gYSBzcGVjaWZpZWQgZGVmYXVsdFxuICAgKi9cbiAgZ2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcpOiBzdHJpbmc7XG4gIGdldEF0dHJpYnV0ZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVmYXVsdFZhbHVlPzogc3RyaW5nIHwgbnVtYmVyLFxuICApOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCB2YWx1ZSA9IEhUTUxFbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUuY2FsbCh0aGlzLCBuYW1lKTtcblxuICAgIGlmIChkZWZhdWx0VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGVmYXVsdFZhbHVlID09PSBcIm51bWJlclwiKSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyc2VkID0gTnVtYmVyKHZhbHVlKTtcblxuICAgICAgaWYgKE51bWJlci5pc05hTihwYXJzZWQpKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgfVxuXG4gICAgLy8gSW52YWxpZCBmdW5jdGlvbiBpbnZvY2F0aW9uXG4gICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBvbiB0aGlzIGVsZW1lbnQgaWYgdGhlIHByb3ZpZGVkIHZhbHVlXG4gICAqIGRpZmZlcnMgZnJvbSB0aGUgYXR0cmlidXRlIHdoZW4gc2VyaWFsaXplZFxuICAgKi9cbiAgcmVmbGVjdEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgIGNvbnN0IHJlZmxlY3RlZCA9IHNlcmlhbGl6ZUF0dHJpYnV0ZSh2YWx1ZSk7XG5cbiAgICBpZiAoY3VycmVudCAhPT0gcmVmbGVjdGVkKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCByZWZsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhpcyBlbGVtZW50IHRvIGEgc3RyaW5nXG4gICAqL1xuICB0b1N0cmluZyhmdWxsOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSAodGhpcy5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQ29tcG9uZW50KS5uYW1lO1xuICAgIGNvbnN0IGF0dHJTdHJpbmcgPSB0aGlzLmdldEF0dHJpYnV0ZU5hbWVzKClcbiAgICAgIC5tYXAoKGF0dHJOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICAgICAgcmV0dXJuIHZhbCA/IGAke2F0dHJOYW1lfT1cIiR7dmFsfVwiYCA6IFwiXCI7XG4gICAgICB9KVxuICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIGNvbnN0IGF0dHJzID0gYXR0clN0cmluZy5sZW5ndGggPiAwID8gYCAke2F0dHJTdHJpbmd9YCA6IFwiXCI7XG5cbiAgICBpZiAoZnVsbCkge1xuICAgICAgcmV0dXJuIGBDb21wb25lbnQ8JHtuYW1lfSR7YXR0cnN9PlxcbiR7dGhpcy5yb290LmlubmVySFRNTH1cXG48LyR7bmFtZX0+YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYENvbXBvbmVudDwke25hbWV9JHthdHRyc30+YDtcbiAgfVxufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEF0dHJpYnV0ZU1hcCxcbiAgQ29tcG9uZW50U3R5bGVzLFxuICBDb21wdXRlZFByb3BlcnRpZXMsXG4gIExpdmVBdHRyaWJ1dGVzLFxuICBTdGF0ZUluaXRpYWxpemVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBCTEFOS19URU1QTEFURSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKTtcblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRTaG9ydGhhbmQ8U3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9PiB7XG4gIC8qKlxuICAgKiBBbiBIVE1MIFRlbXBsYXRlIGVsZW1lbnQgZm9yIHRoaXMgZWxlbWVudCB0byB1c2UuXG4gICAqL1xuICB0ZW1wbGF0ZT86IEhUTUxUZW1wbGF0ZUVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIEEge0BsaW5rIENTU1N0eWxlU2hlZXR9IGFycmF5IHRvIGFkb3B0IHRvIHRoZSBlbGVtZW50J3Mgc2hhZG93IERPTVxuICAgKi9cbiAgc3R5bGVzPzogQ29tcG9uZW50U3R5bGVzO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBmb3IgdGhpcyBDb21wb25lbnQncyBTaGFkb3dSb290LlxuICAgKlxuICAgKiAtIGBcIm9wZW5cImAgYWxsb3dzIEpTIGFjY2VzcyB0byB0aGUgY2hpbGRyZW4gb2YgdGhpcyBjb21wb25lbnRcbiAgICogLSBgXCJjbG9zZWRcImAgKGRlZmF1bHQpIGRpc2FsbG93cyBpbnRlcm5hbCBKUyBhY2Nlc3NcbiAgICovXG4gIHNoYWRvd1Jvb3RNb2RlPzogXCJjbG9zZWRcIiB8IFwib3BlblwiO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBzdGF0ZSBmb3IgdGhpcyBDb21wb25lbnQncyByZWFjdGl2ZSBpbnRlcm5hbCBzdGF0ZSwgaWYgYW55LlxuICAgKi9cbiAgaW5pdGlhbFN0YXRlPzogU3RhdGVJbml0aWFsaXplcjxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHJldHVybmluZyBhbiBvYmplY3Qgd2hpY2ggcG9wdWxhdGVzIHRoZSBgZGF0YWAgdmFsdWVzXG4gICAqIGluIHRoZSB0ZW1wbGF0aW5nIGVuZ2luZS4gU3VjaCB2YWx1ZXMgYXJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBgKmAgbm90YXRpb24uXG4gICAqL1xuICBjb21wdXRlZFByb3BlcnRpZXM/OiBDb21wdXRlZFByb3BlcnRpZXM8U3RhdGVTaGFwZT47XG5cbiAgLyoqXG4gICAqIERlY2xhcmF0aW9uIG9mIGF0dHJpYnV0ZSBiZWhhdmlvcnMgZHVyaW5nIHVwZGF0ZXMuXG4gICAqL1xuICBsaXZlQXR0cmlidXRlcz86IExpdmVBdHRyaWJ1dGVzPFN0YXRlU2hhcGU+O1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXphdGlvbiBzY3JpcHRpbmcgZm9yIHRoaXMgQ29tcG9uZW50XG4gICAqL1xuICBzY3JpcHQ/OiAodGhpczogQ29tcG9uZW50PFN0YXRlU2hhcGU+KSA9PiBWb2lkRnVuY3Rpb24gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGVhY2ggdGVtcGxhdGUgdXBkYXRlXG4gICAqL1xuICBiZWZvcmVVcGRhdGU/OiAodGhpczogQ29tcG9uZW50PFN0YXRlU2hhcGU+KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZWFjaCB0ZW1wbGF0ZSB1cGRhdGVcbiAgICovXG4gIGFmdGVyVXBkYXRlPzogKFxuICAgIHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPixcbiAgICBwcmV2aW91c0F0dHJpYnV0ZXM6IEF0dHJpYnV0ZU1hcCxcbiAgKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYXMgdGhlIGZpbmFsIGxpZmVjeWNsZSBtZXRob2QgYXQgdGhlIGVuZCBvZiB0aGUgdW5tb3VudGluZyBwcm9jZXNzLlxuICAgKlxuICAgKiBDb250ZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGFuZCB0aGUgY29tcG9uZW50IGlzIG5vIGxvbmdlclxuICAgKiBjb25zaWRlcmVkIG1vdW50ZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIHJ1bnMuXG4gICAqXG4gICAqIFVzZSB0aGlzIGZvciBmaW5hbCBjbGVhbnVwIHRhc2tzIGFuZCBmcmVlaW5nIHJlc291cmNlcy5cbiAgICovXG4gIGZpbmFsaXplPzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogSWYgZGVmaW5lZCwgcmVjZWl2ZXMgZXJyb3JzIGNhdWdodCBkdXJpbmcgdGhlIGxpZmVjeWNsZSBtZXRob2RzIG9mIHRoaXNcbiAgICogY29tcG9uZW50IGFuZCBpdCdzIGNoaWxkcmVuLiBJZiBub3QgZGVmaW5lZCwgdGhpcyBjb21wb25lbnQgd2lsbCBpbnN0ZWFkXG4gICAqIHRocm93IGVycm9ycyBhcyB0aGV5IGFyZSBmb3VuZC5cbiAgICpcbiAgICogSWYgdGhlIGVycm9yIGNhbm5vdCBiZSBoYW5kbGVkLCBgb25FcnJvcigpYCBzaG91bGQgcmUtdGhyb3cgaXQgZm9yIGEgaGlnaGVyXG4gICAqIHVwIGNvbXBvbmVudCB0byBldmFsdWF0ZS5cbiAgICpcbiAgICogVG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIHdoaWxlIHJlbW92aW5nIGFuIGVycm9yaW5nIGNvbXBvbmVudCBmcm9tIHRoZVxuICAgKiBET00sIHVzZSBgdGhpcy5yZXBsYWNlV2l0aCgpYCBhbmQgYSBuZXdseSBjb25zdHJ1Y3RlZCBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBSZWNvdmVyaW5nIGZyb20gZXJyb3JzIG9yIGRpc3BsYXlpbmcgYSBmYWxsYmFja1xuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG9uRXJyb3IoZXJyb3IpIHtcbiAgICogICAvLyBIYW5kbGUga25vd24gZXJyb3JzXG4gICAqICAgaWYgKGVycm9yLm1lc3NhZ2UgPSBcIkludmFsaWQgSW5wdXRcIikge1xuICAgKiAgICAgdGhpcy5zdGF0ZS5pbnB1dCA9IFwiXCI7XG4gICAqICAgICByZXR1cm47XG4gICAqICAgfVxuICAgKlxuICAgKiAgIC8vIERpc3BsYXkgYSBmYWxsYmFjayBiYW5uZXJcbiAgICogICBjb25zdCBiYW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgKiAgIGJhbm5lci50ZXh0Q29udGVudCA9IFwiQW4gdW5leHBlY3RlZCBlcnJvciBkb25lIGRpZFwiO1xuICAgKiAgIHRoaXMucmVwbGFjZVdpdGgoYmFubmVyKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIG9uRXJyb3I/OiAodGhpczogQ29tcG9uZW50PFN0YXRlU2hhcGU+LCBlcnJvcjogdW5rbm93bikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZTxTdGF0ZVNoYXBlIGV4dGVuZHMgb2JqZWN0ID0ge30+KFxuICB0YWduYW1lOiBzdHJpbmcsXG4gIGRlZmluaXRpb246IENvbXBvbmVudFNob3J0aGFuZDxTdGF0ZVNoYXBlPixcbik6IHR5cGVvZiBDb21wb25lbnQ8U3RhdGVTaGFwZT4ge1xuICBjb25zdCB7XG4gICAgLy8gQ29uZmlnXG4gICAgdGVtcGxhdGUgPSBCTEFOS19URU1QTEFURSxcbiAgICBzdHlsZXMgPSBbXSxcbiAgICBzaGFkb3dSb290TW9kZSA9IFwiY2xvc2VkXCIsXG4gICAgaW5pdGlhbFN0YXRlLFxuICAgIGNvbXB1dGVkUHJvcGVydGllcyA9IHt9LFxuICAgIGxpdmVBdHRyaWJ1dGVzID0ge30sXG5cbiAgICAvLyBMaWZlY3ljbGVcbiAgICBzY3JpcHQsXG4gICAgYmVmb3JlVXBkYXRlLFxuICAgIGFmdGVyVXBkYXRlLFxuICAgIGZpbmFsaXplLFxuICAgIG9uRXJyb3IsXG4gIH0gPSBkZWZpbml0aW9uO1xuXG4gIGNvbnN0IGZ1bGxPYnNlcnZlZEF0dHJpYnV0ZXMgPSBBcnJheS5mcm9tKFxuICAgIG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGxpdmVBdHRyaWJ1dGVzKV0pLFxuICApO1xuXG4gIGNvbnN0IGNscyA9IGNsYXNzIGV4dGVuZHMgQ29tcG9uZW50PFN0YXRlU2hhcGU+IHtcbiAgICBzdGF0aWMgdGFnTmFtZSA9IHRhZ25hbWU7XG4gICAgc3RhdGljIHRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgc3RhdGljIHN0eWxlcyA9IHN0eWxlcztcbiAgICBzdGF0aWMgb2JzZXJ2ZWRBdHRyaWJ1dGVzID0gWy4uLmZ1bGxPYnNlcnZlZEF0dHJpYnV0ZXNdO1xuICAgIHN0YXRpYyBzaGFkb3dSb290TW9kZSA9IHNoYWRvd1Jvb3RNb2RlO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBzdXBlcigpO1xuXG4gICAgICB0aGlzLmluaXRpYWxTdGF0ZSA9XG4gICAgICAgIHR5cGVvZiBpbml0aWFsU3RhdGUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gaW5pdGlhbFN0YXRlLmJpbmQodGhpcylcbiAgICAgICAgICA6IGluaXRpYWxTdGF0ZTtcbiAgICAgIHRoaXMuY29tcHV0ZWRQcm9wZXJ0aWVzID1cbiAgICAgICAgdHlwZW9mIGNvbXB1dGVkUHJvcGVydGllcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBjb21wdXRlZFByb3BlcnRpZXMuYmluZCh0aGlzKVxuICAgICAgICAgIDogY29tcHV0ZWRQcm9wZXJ0aWVzO1xuICAgICAgdGhpcy5saXZlQXR0cmlidXRlcyA9IGxpdmVBdHRyaWJ1dGVzO1xuXG4gICAgICBmb3IgKGNvbnN0IGRlZiBvZiBPYmplY3QudmFsdWVzKHRoaXMubGl2ZUF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIGlmIChkZWYub25DaGFuZ2UpIHtcbiAgICAgICAgICBkZWYub25DaGFuZ2UgPSBkZWYub25DaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWYucmVmbGVjdCkge1xuICAgICAgICAgIGRlZi5yZWZsZWN0ID0gZGVmLnJlZmxlY3QuYmluZCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdD8uYmluZCh0aGlzKSA/PyB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmJlZm9yZVVwZGF0ZSA9IGJlZm9yZVVwZGF0ZT8uYmluZCh0aGlzKSA/PyB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmFmdGVyVXBkYXRlID0gYWZ0ZXJVcGRhdGU/LmJpbmQodGhpcykgPz8gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5maW5hbGl6ZSA9IGZpbmFsaXplPy5iaW5kKHRoaXMpID8/IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMub25FcnJvciA9IG9uRXJyb3I/LmJpbmQodGhpcykgPz8gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuICBDb21wb25lbnQucmVnaXN0ZXIoY2xzLCB0YWduYW1lKTtcblxuICByZXR1cm4gY2xzO1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQTRDQSxTQUFTLFdBQVcsQ0FBQyxNQUFpQjtBQUFBLEVBQ3BDLE1BQU0saUJBQTRDO0FBQUEsS0FDL0Msb0JBQXNCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQU10QixzQkFBd0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBTXhCLHlCQUF5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FNekIsNEJBQTRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBVTVCLDRCQUE0QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBSzVCLDBCQUEwQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FNMUIsNEJBQTRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FRNUIsNkJBQTZCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBTzdCLHNDQUFzQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FRdEMsdUNBQXVDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FRdkMseUNBQXlDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQU16QyxrQ0FBa0M7QUFB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QUFJLFVBQVU7QUFBQSxVQUNoQixJQUFJLFdBQVcsSUFBSSxTQUFTLEtBQUssSUFBSTtBQUFBLFFBQ3ZDO0FBQUEsUUFFQSxJQUFJLElBQUksU0FBUztBQUFBLFVBQ2YsSUFBSSxVQUFVLElBQUksUUFBUSxLQUFLLElBQUk7QUFBQSxRQUNyQztBQUFBLE1BQ0Y7QUFBQSxNQUVBLEtBQUssU0FBUyxRQUFRLEtBQUssSUFBSSxLQUFLO0FBQUEsTUFDcEMsS0FBSyxlQUFlLGNBQWMsS0FBSyxJQUFJLEtBQUs7QUFBQSxNQUNoRCxLQUFLLGNBQWMsYUFBYSxLQUFLLElBQUksS0FBSztBQUFBLE1BQzlDLEtBQUssV0FBVyxVQUFVLEtBQUssSUFBSSxLQUFLO0FBQUEsTUFDeEMsS0FBSyxVQUFVLFNBQVMsS0FBSyxJQUFJLEtBQUs7QUFBQTtBQUFBLEVBRTFDO0FBQUEsRUFFQSxVQUFVLFNBQVMsS0FBSyxPQUFPO0FBQUEsRUFFL0IsT0FBTztBQUFBOyIsCiAgImRlYnVnSWQiOiAiMzMxMDA4QzQ1QURENzY2NzY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|
|
1913
|
+
//# debugId=97FBFEA63861214B64756E2164756E21
|
|
1914
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2Vycm9ycy50cyIsICJzcmMvaGVscGVyL2Nzcy50cyIsICJzcmMvdXRpbC9hdHRyaWJ1dGVzLnRzIiwgInNyYy91dGlsL2NoYW5nZS10YWcudHMiLCAic3JjL3V0aWwvZWxlbWVudC1tYXRjaC50cyIsICJzcmMvdXRpbC9scnUtY2FjaGUudHMiLCAic3JjL3V0aWwvZnJhZ21lbnRzLnRzIiwgInNyYy9oZWxwZXIvaHRtbC50cyIsICJzcmMvc3RhdGUvc3RhdGUudHMiLCAic3JjL3RlbXBsYXRlL3N5bnRheC50cyIsICJzcmMvdGVtcGxhdGUvYnVpbGQudHMiLCAic3JjL3RlbXBsYXRlL2pvYnMudHMiLCAic3JjL3RlbXBsYXRlL3RlbXBsYXRlLnRzIiwgInNyYy9jb21wb25lbnQvZGVsZWdhdG9yLnRzIiwgInNyYy9jb21wb25lbnQvY29tcG9uZW50LnRzIiwgInNyYy9jb21wb25lbnQvZmFjdG9yeS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbi8qKlxuICogUG9zc2libGUgZXJyb3IgdHlwZXMgZm9yIHtAbGluayBQYWxldHRlRXJyb3J9XG4gKlxuICogQ29kZXMgYXJlIGNhdGVnb3JpemVkIGludG8gZ3JvdXBzIGJ5IHRoZSAxMDAnczpcbiAqXG4gKiAtIDAgLSA5OTogSW52YXJpYW50c1xuICogLSAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyAvIEVudmlyb25tZW50IEVycm9yc1xuICogLSAyMDAgLSAyOTk6IFRlbXBsYXRpbmcgRXJyb3JzXG4gKiAtIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gRXJyb3JDb2RlIHtcbiAgLy8gMCAtIDk5OiBJbnZhcmlhbnRzXG4gIElOVkFSSUFOVCA9IDAsXG4gIElOVkFMSURfRU5WID0gMSxcblxuICAvLyAxMDAgLSAxOTk6IEN1c3RvbSBFbGVtZW50cyBFcnJvcnNcbiAgRFVQRV9UQUdOQU1FID0gMTAwLFxuICBJTlZBTElEX1RBR05BTUUgPSAxMDEsXG5cbiAgLy8gMjAwIC0gMjk5OiBUZW1wbGF0ZSBFcnJvcnNcbiAgVEVNUExBVEVfSU5WQUxJRCA9IDIwMCxcbiAgVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTiA9IDIwMSxcbiAgVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlQgPSAyMDIsXG4gIFRFTVBMQVRFX0lOVkFMSURfTElTVCA9IDIwMyxcbiAgVEVNUExBVEVfSU5WQUxJRF9OT0RFX1JFRiA9IDIwNCxcbiAgVEVNUExBVEVfTUlTU0lOR19MSVNUX1BBUkVOVCA9IDIwNSxcbiAgVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWSA9IDIwNixcbiAgVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZID0gMjA3LFxuXG4gIC8vIDMwMCAtIDM5OTogUnVudGltZSBFcnJvcnNcbiAgTUlTU0lOR19FTEVNRU5UID0gMzAwLFxuICBNSVNTSU5HX1NUQVRFID0gMzAxLFxuICBJTlZBTElEX0NPTlRFTlQgPSAzMDIsXG4gIElOVkFMSURfU1RBVEVfS0VZID0gMzAzLFxuICBJTlZBTElEX1NUQVRFX1VQREFURSA9IDMwNCxcbiAgU1RBVEVfTE9DS0VEID0gMzA1LFxuICBNQVhfU0VRVUVOVElBTF9SRU5ERVJTID0gMzA2LFxufVxuXG5mdW5jdGlvbiBnZXREZXZFcnJvcihjb2RlOiBFcnJvckNvZGUpIHtcbiAgY29uc3QgREVWX0VSUk9SX0lORk86IFJlY29yZDxFcnJvckNvZGUsIHN0cmluZz4gPSB7XG4gICAgW0Vycm9yQ29kZS5JTlZBUklBTlRdOiBgXG5JTlZBUklBTlRcbkEgY29uZGl0aW9uIGhhcyBvY2N1cnJlZCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBzdWNoIGFzIGEgY29kZSBwYXRoIHRoYXRcbnNob3VsZG4ndCBiZSByZWFjaGFibGUgd2hlbiB1c2luZyBjb3JyZWN0IHR5cGVzLCBvciBhIGRpc2FsbG93ZWQgc3RhdGUuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX0VOVl06IGBcbklOVkFMSURfRU5WXG5GYWlsZWQgdG8gZmluZCBhIGN1c3RvbSBlbGVtZW50cyByZWdpc3RyeSBpbiB0aGlzIGVudmlyb25tZW50LiBJcyBhIHdpbmRvd1xuZ2xvYmFsIGF2YWlsYWJsZSB3aXRoIGEgY3VzdG9tRWxlbWVudHMgcHJvcGVydHk/XG5gLFxuXG4gICAgW0Vycm9yQ29kZS5EVVBFX1RBR05BTUVdOiBgXG5EVVBFX1RBR05BTUVcbkZhaWxlZCB0byByZWdpc3RlciBhIGN1c3RvbSBlbGVtZW50IHdpdGggdGhlIHRhZ25hbWUgJXMgYmVjYXVzZSBhbm90aGVyXG5jdXN0b20gZWxlbWVudCBpcyBhbHJlYWR5IGRlZmluZWQgd2l0aCB0aGF0IG5hbWUuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5JTlZBTElEX1RBR05BTUVdOiBgXG5JTlZBTElEX1RBR05BTUVcbkZhaWxlZCB0byBkZXRlcm1pbmUgYSB2YWxpZCBIVE1MIFRhZyB0byB1c2Ugd2hlbiByZWdpc3RlcmluZyBhIGNvbXBvbmVudCBhcyBhXG5jdXN0b20gZWxlbWVudC4gU3BlY2lmeSBhIHN0YXRpYyByZWFkb25seSB0YWdOYW1lIHByb3BlcnR5IG9uIHlvdXIgY29tcG9uZW50XG5jbGFzcyBvciBwcm92aWRlIGEgdGFnTmFtZSBhcmd1bWVudCB0byBDb21wb25lbnQucmVnaXN0ZXIuXG5cbkFsdGVybmF0aXZlbHksIHlvdSBjYW4gZGlyZWN0bHkgcmVnaXN0ZXIgeW91ciBlbGVtZW50IGFzIHlvdSB3b3VsZCBhbnkgb3RoZXJcbkhUTUwgY3VzdG9tIGVsZW1lbnQ6IGN1c3RvbUVsZW1lbnRzLmRlZmluZShcIm15LXRhZ1wiLCBNeUNvbXBvbmVudENsYXNzKTtcbmAsXG5cbiAgICBbRXJyb3JDb2RlLk1JU1NJTkdfRUxFTUVOVF06IGBcbk1JU1NJTkdfRUxFTUVOVFxuQW4gZWxlbWVudCB3YXMgZXhwZWN0ZWQgdG8gZXhpc3QgYnV0IHdhcyBub3QgZm91bmQgd2hlbiB0aGUgRE9NIHdhcyBxdWVyaWVkLlxuYCxcblxuICAgIFtFcnJvckNvZGUuTUlTU0lOR19TVEFURV06IGBcbk1JU1NJTkdfU1RBVEVcbkEgQ29tcG9uZW50J3MgcmVhY3RpdmUgc3RhdGUgd2FzIGFjY2Vzc2VkLCBidXQgbm8gaW5pdGlhbFN0YXRlIGlzIGRlZmluZWQgZm9yXG50aGUgQ29tcG9uZW50J3MgY2xhc3MuIEluaXRpYWwgc3RhdGUgbXVzdCBiZSBkZWZpbmVkIGFzIGFuIG9iamVjdCBvciBmdW5jdGlvbi5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfQ09OVEVOVF06IGBcbklOVkFMSURfQ09OVEVOVFxuVHJpZWQgdG8gc2V0IGEgdmFsdWUgYXMgY29udGVudCBpbiBhIHRlbXBsYXRlLCBidXQgdGhlIHZhbHVlIHdhcyBub3QgYSBzdXBwb3J0ZWRcbnR5cGUuIFZhbHVlcyBtdXN0IGJlIGEgc3RyaW5nLCBIVE1MRWxlbWVudC5cblxuSW5zdGVhZCwgZ290ICVzOiAlcy5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURdOiBgXG5URU1QTEFURV9JTlZBTElEXG5UaGUgdmFsdWUgJXMgY2Fubm90IGJlIGludGVycG9sYXRlZCB2aWEgdGhlIFRlbXBsYXRlIGh0bWwgc3RyaW5nIGhlbHBlci5cblZhbHVlcyBtYXkgb25seSBiZSBIVE1MVGVtcGxhdGVFbGVtZW50cyAodGVtcGxhdGUgY29udGVudCBpcyBhZG9wdGVkKSBvclxuc3RyaW5ncyAoc2hvcnRoYW5kIGZvciBhIDo6c3dhcCBkaXJlY3RpdmUgb24gYW4gZWxlbWVudClcbmAsXG5cbiAgICBbRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT05dOiBgXG5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OXG5BIHRlbXBsYXRlIHZhbHVlIG5vdGF0aW9uIGZhaWxlZCB0byBwYXJzZS4gTm90YXRpb25zIG11c3QgYmVnaW4gd2l0aCBvbmUgb2ZcbkAsICQsICosIG9yICMsIGZvbGxvd2VkIGJ5IGEgZG90LXNlcGFyYXRlZCBwYXRoIG9mIGFjY2Vzc29yIG5hbWVzLiBPcHRpb25hbGx5LFxubm90YXRpb25zIG1heSBoYXZlIG1vZGlmaWVycyBhcm91bmQgdGhlbSwgc3VjaCBhcyB0aGUgTk9UKCkgbW9kaWZpZXIuXG5cblRoZSBub3RhdGlvbiB0aGF0IGZhaWxlZCB0byBwYXJzZSB3YXMgXCIlc1wiXG5gLFxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9DT01QT05FTlRdOiBgXG5URU1QTEFURV9JTlZBTElEX0NPTVBPTkVOVFxuRmFpbGVkIHRvIGludGVycG9sYXRlIGEgQ29tcG9uZW50IGluIGFuIGh0bWwgdGVtcGxhdGUgc3RyaW5nIGR1ZSB0byB0aGVcbkNvbXBvbmVudCBoYXZpbmcgYW4gaW52YWxpZCB0YWdOYW1lIHByb3BlcnR5LlxuXG5Db21wb25lbnQgXCIlc1wiIGhhcyBhbiBpbnZhbGlkIHRhZ05hbWUgcHJvcGVydHkgXCIlc1wiXG4gICAgYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX1BBUkVOVF06IGBcblRFTVBMQVRFX01JU1NJTkdfTElTVF9QQVJFTlRcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIHByZXBhcmUgYW4gOjplYWNoIGRpcmVjdGl2ZSBiZWNhdXNlIG5vIHZhbGlkIHBhcmVudCBub2RlXG53YXMgZm91bmQgZm9yIHRoZSBsaXN0IHRvIHJlbmRlciBpbnRvLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9MSVNUXTogYFxuVEVNUExBVEVfSU5WQUxJRF9MSVNUXG5BIHRlbXBsYXRlIGZhaWxlZCB0byByZW5kZXIgYmVjYXVzZSBhbiA6OmVhY2ggZGlyZWN0aXZlIGZldGNoZWQgYSB2YWx1ZSB3aGljaFxud2FzIG5vdCBhbiBhcnJheSBvZiBhY3Rpb25hYmxlIGRhdGEuXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PREVfUkVGXTogYFxuVEVNUExBVEVfSU5WQUxJRF9OT0RFX1JFRlxuQSB0ZW1wbGF0ZSBmYWlsZWQgdG8gcHJlcGFyZSBhIG5vZGUgZnJvbSBhIGNvbXBpbGVkIHNvdXJjZS4gVHlwaWNhbGx5LCB0aGlzXG5tZWFucyBzb21ldGhpbmcgaXMgYnJva2VuIHdpdGhpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUgcmF0aGVyIHRoYW4gYW4gZXJyb3Igd2l0aFxudGhlIHRlbXBsYXRlIGNvbnRlbnQgaXRzZWxmLlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX0tFWV06IGBcblRFTVBMQVRFX01JU1NJTkdfTElTVF9LRVlcbkEgdGVtcGxhdGUgZmFpbGVkIHRvIGNvbXBpbGUgYmVjYXVzZSBhbiA6OmVhY2ggZGlyZWN0aXZlIHdhcyBmb3VuZCBvbiBhbiBlbGVtZW50XG53aXRob3V0IGEgY29ycmVzcG9uZGluZyA6OmtleSBkaXJlY3RpdmUuIDo6ZWFjaCBkaXJlY3RpdmVzIG11c3QgaGF2ZSBhIDo6a2V5XG5kaXJlY3RpdmUgc3BlY2lmaWVkIG9uIHRoZSBzYW1lIGVsZW1lbnQsIHdob3NlIG5vdGF0aW9uIGV2YWx1YXRlcyB0byBhIHVuaXF1ZVxudmFsdWUgZm9yIGVhY2ggaXRlbSBpbiB0aGUgbGlzdC5cblxuRXhhbXBsZTogPGxpIDo6ZWFjaD1cIiRpdGVtc1wiIDo6a2V5PVwiI2lkXCI+IC4uLiA8L2xpPlxuYCxcblxuICAgIFtFcnJvckNvZGUuVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZXTogYFxuVEVNUExBVEVfRFVQTElDQVRFX0xJU1RfS0VZXG5BIGxpc3QgZmFpbGVkIHRvIHJlbmRlciBiZWNhdXNlIGl0ZW0ga2V5ICVzIGFwcGVhcmVkIG11bHRpcGxlIHRpbWVzIHdoZW5cbnJlc29sdmluZyBsaXN0IGl0ZW0ga2V5cy4gRWFjaCA6OmtleSBkaXJlY3RpdmUgbXVzdCByZWZlcmVuY2UgYSBub3RhdGlvbiB3aG9zZVxudmFsdWUgaXMgdW5pcXVlIGZvciBlYWNoIGxpc3QgaXRlbS5cbmAsXG5cbiAgICBbRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfS0VZXTogYFxuSU5WQUxJRF9TVEFURV9LRVlcblRyaWVkIHRvIGFjY2VzcyBhIHN0YXRlIHByb3BlcnR5IHdoaWNoIGRvZXMgbm90IGV4aXN0XG5cbktleSBwYXRoOiAlc1xuYCxcblxuICAgIFtFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9VUERBVEVdOiBgXG5JTlZBTElEX1NUQVRFX1VQREFURVxuQSBDb21wb25lbnQncyBzZXRTdGF0ZSgpIHdhcyBjYWxsZWQgd2l0aCBhIHZhbHVlIHdoaWNoIGNvdWxkIG5vdCBiZSBwYXRjaGVkIGluXG50byB0aGUgZXhpc3RpbmcgY29tcG9uZW50IHN0YXRlLlxuXG5zZXRTdGF0ZSgpIHRha2VzIGEgcGFydGlhbCBvYmplY3QgZGVzY3JpYmluZyBzdGF0ZSBrZXlzIHRvIHVwZGF0ZS5cblxuSW5zdGVhZCwgcmVjZWl2ZWQ6ICVzXG5gLFxuXG4gICAgW0Vycm9yQ29kZS5TVEFURV9MT0NLRURdOiBgXG5TVEFURV9MT0NLRURcbkEgU3RhdGUgcmVjZWl2ZWQgYSByZXF1ZXN0IHRvIHVwZGF0ZSBvciBsb2NrIHdoaWxlIGFscmVhZHkgbG9ja2VkLlxuU3RhdGVzIG1heSBiZSBsb2NrZWQgdXNpbmcgdGhlIC5sb2NrKCkgbWV0aG9kIGFuZCB1bmxvY2tlZCB1c2luZyB0aGUgLnVubG9jaygpXG5tZXRob2QuIFN0YXRlcyBsb2NrIGR1cmluZyBhc3luYyBtdXRhdGlvbnMgZG9uZSB0aHJvdWdoIHRoZSAubXV0YXRlQXN5bmMoKVxubWV0aG9kIGlmIFwidHJ1ZVwiIGlzIHBhc3NlZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci5cblxuWW91IGNhbiBjaGVjayB0aGUgbG9jayBzdGF0dXMgb2YgYSBTdGF0ZSBpbnN0YW5jZSB3aXRoIC5pc0xvY2tlZFxuYCxcblxuICAgIFtFcnJvckNvZGUuTUFYX1NFUVVFTlRJQUxfUkVOREVSU106IGBcbk1BWF9TRVFVRU5USUFMX1JFTkRFUlNcbkEgY29tcG9uZW50IGhhcyBlcnJvcmVkIGFmdGVyIHJlLXJlbmRlcmluZyBtb3JlIHRoYW4gJXMgdGltZXMgaW4gdGhlIHNhbWUgZnJhbWUuXG5cblRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgYmVjYXVzZSBzdGF0ZSBvciBsaXZlIGF0dHJpYnV0ZXMgYXJlIGJlaW5nIG1vZGlmaWVkXG5kdXJpbmcgYSByZW5kZXIgbGlmZWN5Y2xlIG1ldGhvZCBzdWNoIGFzIGJlZm9yZVVwZGF0ZSgpIG9yIGFmdGVyVXBkYXRlKCkuIElmXG5zdGF0ZSBjaGFuZ2VzIHVuY29uZGl0aW9uYWxseSBkdXJpbmcgYSByZW5kZXIsIHRoZSByZW5kZXIgd2lsbCBpbmZpbml0ZWx5IGxvb3AuXG5VcGRhdGluZyByZW5kZXIgc291cmNlIGRhdGEgZHVyaW5nIGEgcmVuZGVyIGN5Y2xlIGlzIHN1cHBvcnRlZCwgYnV0IGluZmluaXRlXG51cGRhdGUgbG9vcHMgbWF5IG9jY3VyIGlmIHVuY2hlY2tlZC5cbmAsXG4gIH07XG5cbiAgcmV0dXJuIERFVl9FUlJPUl9JTkZPW2NvZGVdO1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9yaWdpbmF0aW5nIGZyb20gd2l0aGluIGEgUGFsZXR0ZSBzdWJzeXN0ZW0uXG4gKlxuICogSW4gdGhlIGBkZXZlbG9wbWVudGAgZW52aXJvbm1lbnQsIHRoZSBlcnJvciB3aWxsIHN1cmZhY2Ugd2l0aCBleHRlbmRlZCBpbmZvXG4gKiBhYm91dCB0aGUgZXJyb3IgYW5kIGFueSBkZXRhaWxzIHdoaWNoIG1heSBiZSByZWxldmFudCB0byBoZWxwIHdpdGggZGVidWdnaW5nLlxuICpcbiAqIEluIHRoZSBgcHJvZHVjdGlvbmAgZW52aXJvbm1lbnQsIGEgbWluaW1hbCBlcnJvciBvbmx5IHN1cmZhY2luZyB0aGUgbnVtZXJpY1xuICogZXJyb3IgY29kZSBpcyB0aHJvd24gaW5zdGVhZC5cbiAqXG4gKiBDb2RlcyBhcmUgY2F0ZWdvcml6ZWQgaW50byBncm91cHMgYnkgdGhlIDEwMCdzOlxuICpcbiAqIC0gMCAtIDk5OiBJbnZhcmlhbnRzXG4gKiAtIDEwMCAtIDE5OTogQ3VzdG9tIEVsZW1lbnRzIC8gRW52aXJvbm1lbnQgRXJyb3JzXG4gKiAtIDIwMCAtIDI5OTogVGVtcGxhdGluZyBFcnJvcnNcbiAqIC0gMzAwIC0gMzk5OiBSdW50aW1lIEVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgUGFsZXR0ZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBuYW1lID0gXCJQYWxldHRlRXJyb3JcIjtcbiAgY29kZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvZGU6IG51bWJlciwgLi4udmFsdWVzOiBzdHJpbmdbXSkge1xuICAgIGxldCBtZXNzYWdlID0gYENvZGU6ICR7Y29kZX1gO1xuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBtZXNzYWdlICs9IGdldERldkVycm9yKGNvZGUpO1xuXG4gICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMpIHtcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZShgJXNgLCBTdHJpbmcodmFsKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbi8qKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2Yge0BsaW5rIENTU1N0eWxlU2hlZXR9cyBjb250YWluaW5nIHRoZSBwcm92aWRlZCBDU1NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzcyhcbiAgc3RyaW5nczogVGVtcGxhdGVTdHJpbmdzQXJyYXksXG4gIC4uLnZhbHVlczogdW5rbm93bltdXG4pOiBDU1NTdHlsZVNoZWV0IHtcbiAgbGV0IHJlc3VsdCA9IHN0cmluZ3NbMF0gPz8gXCJcIjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG5leHRWYWwgPSB2YWx1ZXNbaV0gPz8gXCJcIjtcbiAgICBjb25zdCBuZXh0U3RyID0gc3RyaW5nc1tpICsgMV0gPz8gXCJcIjtcbiAgICByZXN1bHQgKz0gYCR7bmV4dFZhbH0ke25leHRTdHJ9YDtcbiAgfVxuXG4gIGNvbnN0IHNoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXQoKTtcbiAgc2hlZXQucmVwbGFjZVN5bmMocmVzdWx0KTtcbiAgcmV0dXJuIHNoZWV0O1xufVxuXG50eXBlIENsYXNzVmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCB1bmRlZmluZWRcbiAgfCBudWxsXG4gIHwgQ2xhc3NBcnJheVxuICB8IENsYXNzT2JqZWN0O1xudHlwZSBDbGFzc0FycmF5ID0gQ2xhc3NWYWx1ZVtdO1xudHlwZSBDbGFzc09iamVjdCA9IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbi8qKlxuICogR2l2ZW4gZmxleGlibGUgaW5wdXQsIGdlbmVyYXRlIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBzZXR0aW5nIGFzIGFuIGh0bWwgY2xhc3NcbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzaWZ5KFwibXktY2xhc3NcIiwgXCJhbm90aGVyLWNsYXNzXCIpIC8vIFwibXktY2xhc3MgYW5vdGhlci1jbGFzc1wiXG4gKiBjbGFzc2lmeShbXCJteS1jbGFzc1wiLCBcImFub3RoZXItY2xhc3NcIl0pIC8vIFwibXktY2xhc3MgYW5vdGhlci1jbGFzc1wiXG4gKiBjbGFzc2lmeSh7IGVuYWJsZWQ6IHRydWUsIGRpc2FibGVkOiBmYWxzZSB9KSAvLyBcImVuYWJsZWRcIlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeSguLi5hcmdzOiBDbGFzc1ZhbHVlW10pOiBzdHJpbmcge1xuICBsZXQgcmVzdWx0U3RyaW5nID0gXCJcIjtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYXJncy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBhcmd1bWVudCA9IGFyZ3NbaW5kZXhdO1xuXG4gICAgaWYgKCFhcmd1bWVudCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gU3RyaW5ncy9udW1zIC0+IERpcmVjdCBhcHBlbmRcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBhcmd1bWVudCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICB9XG4gICAgICByZXN1bHRTdHJpbmcgKz0gYXJndW1lbnQ7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYXJyYXlzIHJlY3Vyc2l2ZWx5XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJndW1lbnQpKSB7XG4gICAgICBjb25zdCBuZXN0ZWRSZXN1bHQgPSBjbGFzc2lmeSguLi5hcmd1bWVudCk7XG4gICAgICBpZiAobmVzdGVkUmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHRTdHJpbmcpIHtcbiAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gXCIgXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0U3RyaW5nICs9IG5lc3RlZFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBvYmplY3RzIHdpdGggY29uZGl0aW9uYWwgY2xhc3MgbmFtZXNcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBmb3IgKGNvbnN0IGNsYXNzTmFtZSBpbiBhcmd1bWVudCkge1xuICAgICAgICAvLyBPbmx5IGluY2x1ZGUgY2xhc3MgbmFtZSBpZiBpdHMgdmFsdWUgaXMgdHJ1dGh5XG4gICAgICAgIGlmIChhcmd1bWVudFtjbGFzc05hbWVdKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdFN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0U3RyaW5nICs9IFwiIFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHRTdHJpbmcgKz0gY2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdFN0cmluZztcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcblxuLyoqIEFuIGF0dHJpYnV0ZSB2YWx1ZSBhcyByZWFkIGZyb20gYSBET00gZWxlbWVudCAqL1xudHlwZSBBdHRyaWJ1dGVWYWx1ZSA9IHN0cmluZyB8IG51bGw7XG5cbi8qKiBBIE1hcCBvZiBzdHJpbmcgYXR0cmlidXRlIG5hbWVzIHRvIHtAbGluayBBdHRyaWJ1dGVWYWx1ZX0gKi9cbnR5cGUgQXR0cmlidXRlTWFwID0gTWFwPHN0cmluZywgQXR0cmlidXRlVmFsdWU+O1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQXR0cmlidXRlKHZhbHVlOiB1bmtub3duKTogQXR0cmlidXRlVmFsdWUge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cblxuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXR0cmlidXRlTWFwKFxuICBzb3VyY2U6IG9iamVjdCB8IE1hcDxzdHJpbmcsIHVua25vd24+IHwgSFRNTEVsZW1lbnQsXG4pOiBBdHRyaWJ1dGVNYXAge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTtcblxuICBpZiAoc291cmNlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygc291cmNlLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIG1hcC5zZXQobmFtZSwgc2VyaWFsaXplQXR0cmlidXRlKHNvdXJjZS5nZXRBdHRyaWJ1dGUobmFtZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBNYXApIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2Ygc291cmNlKSB7XG4gICAgICBtYXAuc2V0KGtleSwgc2VyaWFsaXplQXR0cmlidXRlKHZhbCkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwib2JqZWN0XCIgJiYgc291cmNlICE9PSBudWxsKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkpIHtcbiAgICAgIG1hcC5zZXQoa2V5LCBzZXJpYWxpemVBdHRyaWJ1dGUodmFsKSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBdHRyaWJ1dGVNYXAoXG4gIHRhcmdldDogSFRNTEVsZW1lbnQsXG4gIGF0dHJzOiBBdHRyaWJ1dGVNYXAsXG4pOiB2b2lkIHtcbiAgY29uc3QgY3VycmVudE5hbWVzID0gbmV3IFNldCh0YXJnZXQuZ2V0QXR0cmlidXRlTmFtZXMoKSk7XG4gIGNvbnN0IGluY29taW5nTmFtZXMgPSBuZXcgU2V0KGF0dHJzLmtleXMoKSk7XG4gIGNvbnN0IGF0dHJpYnV0ZXNUb1JlbW92ZSA9IGN1cnJlbnROYW1lcy5kaWZmZXJlbmNlKGluY29taW5nTmFtZXMpO1xuXG4gIGZvciAoY29uc3QgYXR0ciBvZiBhdHRyaWJ1dGVzVG9SZW1vdmUpIHtcbiAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgdmFsXSBvZiBhdHRycykge1xuICAgIGlmICh2YWwgPT09IG51bGwpIHtcbiAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsKTtcbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHJlcGxhY2UgaXQgd2l0aCBhIGRpZmZlcmVudCB0YWcsIGFkb3B0aW5nIGFsbCBhdHRyaWJ1dGVzXG4gKiBhbmQgY2hpbGQgZWxlbWVudHMuXG4gKiBAcGFyYW0gJHRhcmdldCBUaGUgZWxlbWVudCB0byBzd2FwIG91dFxuICogQHBhcmFtIG5ld1RhZyBUaGUgbmV3IEhUTUwgdGFnTmFtZSB0byB1c2VcbiAqIEByZXR1cm5zIFRoZSBuZXdseSBzd2FwcGVkLWluIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZVRhZygkdGFyZ2V0OiBIVE1MRWxlbWVudCwgbmV3VGFnOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gIGNvbnN0ICRuZXdFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmV3VGFnKTtcblxuICB3aGlsZSAoJHRhcmdldC5maXJzdENoaWxkICE9PSBudWxsKSB7XG4gICAgJG5ld0VsLmFwcGVuZENoaWxkKCR0YXJnZXQuZmlyc3RDaGlsZCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGF0dHJOYW1lIG9mICR0YXJnZXQuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgIGNvbnN0IHZhbCA9ICR0YXJnZXQuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcblxuICAgIGlmICh2YWwgIT09IG51bGwpIHtcbiAgICAgICRuZXdFbC5zZXRBdHRyaWJ1dGUoYXR0ck5hbWUsIHZhbCk7XG4gICAgfVxuICB9XG5cbiAgJHRhcmdldC5yZXBsYWNlV2l0aCgkbmV3RWwpO1xuICByZXR1cm4gJG5ld0VsO1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbmltcG9ydCB7IENoYXJDb2RlcyB9IGZyb20gXCIuL2NoYXJhY3Rlci1jb2Rlc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNUYWdOYW1lKHN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gRW5zdXJlIHRoZSBjaGFyYWN0ZXIgY29kZSBpcyBhIGxldHRlciBvciBoeXBoZW5cbiAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7XG5cbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICBjaGFyID09PSBDaGFyQ29kZXMuSHlwaGVuIHx8XG4gICAgICAgIChjaGFyID49IENoYXJDb2Rlcy5BICYmIGNoYXIgPD0gQ2hhckNvZGVzLlopIHx8XG4gICAgICAgIChjaGFyID49IENoYXJDb2Rlcy5hICYmIGNoYXIgPD0gQ2hhckNvZGVzLnopXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQSBwZXJmb3JtYW5jZSBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBgLm1hdGNoZXMoKWAgd2hpY2ggaW5jbHVkZXMgZmFzdGVyXG4gKiBtYXRjaGluZyBzdHJhdGVnaWVzIGZvciBjb21tb24gcXVlcmllcy5cbiAqXG4gKiBAcmVtYXJrc1xuICogT3B0aW1pemVkIHF1ZXJ5IHR5cGVzOlxuICpcbiAqIC0gU2luZ2xlIElEIHNlbGVjdG9yIGBcIiNpZGVudGlmaWVyXCJgXG4gKiAtIFNpbmdsZSBjbGFzcyBzZWxlY3RvciBgXCIuY2xhc3NuYW1lXCJgXG4gKiAtIFRhZ25hbWUgc2VsZWN0b3IgYFwiYnV0dG9uXCJgXG4gKiAtIFNpbXBsZSBhdHRyaWJ1dGUgc2VsZWN0b3IgYFwiW2F0dHI9J3ZhbHVlJ11cImBcbiAqXG4gKiBBbGwgb3RoZXIgdHlwZXMgb2YgcXVlcmllcyB1c2UgdGhlIGJhc2UgLm1hdGNoZXMoKSBmb3IgY29tcGFyaXNvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZWxlbWVudE1hdGNoZXMoZWxlbWVudDogRWxlbWVudCwgcXVlcnk6IHN0cmluZykge1xuICAvLyBJZiB0aGUgcXVlcnkgaXMgYSBzaW1wbGUgSUQsIGNoZWNrIGl0IGRpcmVjdGx5XG4gIGlmIChcbiAgICBxdWVyeVswXSA9PT0gXCIjXCIgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiIFwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiLlwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiW1wiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiOlwiKSA9PT0gLTEgJiZcbiAgICBxdWVyeS5pbmRleE9mKFwiPlwiKSA9PT0gLTFcbiAgKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuaWQgPT09IHF1ZXJ5LnNsaWNlKDEpO1xuICB9XG5cbiAgLy8gSWYgdGhlIHF1ZXJ5IGlzIGEgc2ltcGxlIGNsYXNzbmFtZSwgY2hlY2sgaXQgZGlyZWN0bHlcbiAgaWYgKFxuICAgIHF1ZXJ5WzBdID09PSBcIi5cIiAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIgXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCIjXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCJbXCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI6XCIpID09PSAtMSAmJlxuICAgIHF1ZXJ5LmluZGV4T2YoXCI+XCIpID09PSAtMVxuICApIHtcbiAgICByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMocXVlcnkuc2xpY2UoMSkpO1xuICB9XG5cbiAgLy8gSWYgdGhlIHF1ZXJ5IGlzIGZvciBqdXN0IGEgdGFnbmFtZSwgY2hlY2sgaXQgZGlyZWN0bHlcbiAgaWYgKGlzVGFnTmFtZShxdWVyeSkpIHtcbiAgICByZXR1cm4gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICAvLyBJZiB0aGUgcXVlcnkgaXMgZm9yIGEgc2luZ2xlIHNlbGVjdG9yIHZhbHVlLCBjaGVjayBpdCBkaXJlY3RseVxuICBpZiAoXG4gICAgcXVlcnlbMF0gPT09IFwiW1wiICYmXG4gICAgcXVlcnlbcXVlcnkubGVuZ3RoIC0gMV0gPT09IFwiXVwiICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIiBcIikgPT09IC0xICYmXG4gICAgcXVlcnkuaW5kZXhPZihcIjpcIikgPT09IC0xXG4gICkge1xuICAgIGNvbnN0IGF0dHIgPSBxdWVyeS5zbGljZSgxLCAtMSk7XG4gICAgY29uc3QgZXFJbmRleCA9IGF0dHIuaW5kZXhPZihcIj1cIik7XG4gICAgaWYgKGVxSW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cik7XG4gICAgfVxuICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0ci5zbGljZSgwLCBlcUluZGV4KTtcbiAgICBjb25zdCBhdHRyVmFsdWUgPSBhdHRyLnNsaWNlKGVxSW5kZXggKyAxKS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csIFwiXCIpO1xuICAgIHJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyTmFtZSkgPT09IGF0dHJWYWx1ZTtcbiAgfVxuXG4gIC8vIE90aGVyd2lzZSwgdXNlIG5hdGl2ZSBgLm1hdGNoZXNgIGZvciBjb21wbGV4IHN0dWZmXG4gIHJldHVybiBlbGVtZW50Lm1hdGNoZXMocXVlcnkpO1xufVxuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbnR5cGUgTWV0cmljcyA9IHtcbiAgaGl0czogbnVtYmVyO1xuICBtaXNzZXM6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIExSVUNhY2hlTWV0cmljcyA9IHtcbiAgbG9va3VwczogbnVtYmVyO1xuICBoaXRzOiBudW1iZXI7XG4gIG1pc3NlczogbnVtYmVyO1xuICBjYXBhY2l0eTogbnVtYmVyO1xuICBlbnRyaWVzOiBudW1iZXI7XG4gIGhpdFJhdGU6IG51bWJlcjtcbn07XG5cbi8qKlxuICogQSBzaW1wbGUgaW4tbWVtb3J5IExSVSBDYWNoZSB1c2luZyBKYXZhU2NyaXB0IG1hcHMuXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBDYWNoZWQgbmV0d29yayByZXF1ZXN0XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQSBjYWNoZSBvZiBBUEkgVVJMcyB0byB0aGVpciByZXR1cm5lZCBwYXlsb2Fkc1xuICogY29uc3QgY2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nLCBBUElQYXlsb2FkPigpO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0KHVybDogc3RyaW5nKSB7XG4gKiAgIGxldCBjYWNoZWQgPSBjYWNoZS5nZXQodXJsKTtcbiAqICAgaWYgKGNhY2hlZCkge1xuICogICAgIHJldHVybiBjYWNoZWQ7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIC4uLiBNYWtlIHRoZSByZXF1ZXN0IGFuZCBjYWNoZS5zZXQoKSB0aGUgcmVzcG9uc2VcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTFJVQ2FjaGU8SywgVj4ge1xuICBwcml2YXRlIF9tYXhTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgX2RhdGE6IE1hcDxLLCBWPjtcbiAgcHJpdmF0ZSBfbWV0cmljczogTWV0cmljcyA9IHsgaGl0czogMCwgbWlzc2VzOiAwIH07XG5cbiAgY29uc3RydWN0b3IobWF4U2l6ZTogbnVtYmVyID0gNTAwKSB7XG4gICAgaWYgKG1heFNpemUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTFJVIENhY2hlIGNhcGFjaXR5IG11c3QgYmUgPj0gMVwiKTtcbiAgICB9XG5cbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgdGhpcy5fbWV0cmljcyA9IHsgaGl0czogMCwgbWlzc2VzOiAwIH07XG4gICAgfVxuXG4gICAgdGhpcy5fbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgdGhpcy5fZGF0YSA9IG5ldyBNYXA8SywgVj4oKTtcbiAgfVxuXG4gIHByaXZhdGUgX3RyaW0gPSAoKSA9PiB7XG4gICAgd2hpbGUgKHRoaXMuX2RhdGEuc2l6ZSA+IHRoaXMuX21heFNpemUpIHtcbiAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5fZGF0YS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKGZpcnN0S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWJzdXJkXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZGF0YS5kZWxldGUoZmlyc3RLZXkpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogR2V0IGNhY2hlIHBlcmZvcm1hbmNlIG1ldHJpY3MgZnJvbSB0aGlzIExSVSBDYWNoZSBpbnN0YW5jZS5cbiAgICpcbiAgICogSW4gZGV2ZWxvcG1lbnQgbW9kZSwgdGhpcyByZXR1cm5zIGluc2lnaHRzIGludG8gaGl0cy9taXNzZXMgb2YgdGhlIGNhY2hlLFxuICAgKiBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gYW5kIGVudHJ5IGNvdW50LlxuICAgKlxuICAgKiBJbiBwcm9kdWN0aW9uIG1vZGUsIHRoaXMgcmV0dXJucyBhIHBsYWNlaG9sZGVyIG9iamVjdCwgYXMgbWV0cmljIGNvbGxlY3Rpb25cbiAgICogaXMgbm90IGFjdGl2ZSBpbiBwcm9kdWN0aW9uLlxuICAgKi9cbiAgZ2V0IG1ldHJpY3MoKTogTFJVQ2FjaGVNZXRyaWNzIHtcbiAgICBpZiAoX19ERVZfXykge1xuICAgICAgY29uc3QgeyBoaXRzID0gMCwgbWlzc2VzID0gMCB9ID0gdGhpcy5fbWV0cmljcyA/PyB7fTtcbiAgICAgIGNvbnN0IGxvb2t1cHMgPSBoaXRzICsgbWlzc2VzO1xuICAgICAgY29uc3QgaGl0UmF0ZSA9IGxvb2t1cHMgPT09IDAgPyAwIDogaGl0cyAvIGxvb2t1cHM7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxvb2t1cHMsXG4gICAgICAgIGhpdHM6IGhpdHMsXG4gICAgICAgIG1pc3NlczogbWlzc2VzLFxuICAgICAgICBjYXBhY2l0eTogdGhpcy5fbWF4U2l6ZSxcbiAgICAgICAgZW50cmllczogdGhpcy5fZGF0YS5zaXplLFxuICAgICAgICBoaXRSYXRlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9va3VwczogMCxcbiAgICAgIGhpdHM6IDAsXG4gICAgICBtaXNzZXM6IDAsXG4gICAgICBjYXBhY2l0eTogMCxcbiAgICAgIGVudHJpZXM6IDAsXG4gICAgICBoaXRSYXRlOiAwLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBtYXhpbXVtIGNhY2hlIHNpemUgZm9yIHRoaXMgaW5zdGFuY2UuIEltbWVkaWF0ZWx5IHRyaWdnZXJzIGFcbiAgICogcHVyZ2Ugb2YgY2FjaGVkIGNvbnRlbnRzIGlmIHRoZSBuZXcgY2FwYWNpdHkgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50XG4gICAqIG51bWJlciBvZiBjYWNoZWQgZW50cmllcy5cbiAgICovXG4gIHNldENhcGFjaXR5ID0gKG1heFNpemU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGlmIChtYXhTaXplIDw9IDAgJiYgX19ERVZfXykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIltQYWxldHRlIExSVSBDYWNoZV0gQ2FjaGUgc2l6ZSBpcyA8PSAwLiBDYWNoZSBpcyBkaXNhYmxlZC5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgdGhpcy5fdHJpbSgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBGZXRjaCBhIHZhbHVlIGZyb20gdGhlIGNhY2hlLCByZXR1cm5pbmcgYHVuZGVmaW5lZGAgaWYgbm8gdmFsdWUgd2FzIGZvdW5kXG4gICAqL1xuICBnZXQoa2V5OiBLKTogViB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9kYXRhLmdldChrZXkpO1xuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIHRoaXMuX21ldHJpY3MubWlzc2VzICs9IDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIERlbGV0ZSBhbmQgcmUtc2V0IHRoZSB2YWx1ZSB0byBtb3ZlIHRoZSBrZXkgdG8gdGhlIGVuZCBvZiB0aGUga2V5IGxpc3RcbiAgICB0aGlzLl9kYXRhLmRlbGV0ZShrZXkpO1xuICAgIHRoaXMuX2RhdGEuc2V0KGtleSwgdmFsdWUpO1xuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHRoaXMuX21ldHJpY3MuaGl0cyArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSB2YWx1ZSBpbiB0aGUgY2FjaGUuIFRoaXMgYWxzbyBtb3ZlcyB0aGUgdmFsdWUgdG8gdGhlIGJhY2sgb2YgdGhlIGxpc3RcbiAgICogb2YgdmFsdWVzIHRvIGNvbnNpZGVyIGV2aWN0aW5nIHdoZW4gdGhlIGNhY2hlIGlzIGZ1bGwuXG4gICAqL1xuICBzZXQoa2V5OiBLLCB2YWx1ZTogVik6IHZvaWQge1xuICAgIC8vIFJlbW92ZSBpZiBleGlzdHMgdG8gdXBkYXRlIHBvc2l0aW9uXG4gICAgaWYgKHRoaXMuX2RhdGEuaGFzKGtleSkpIHtcbiAgICAgIHRoaXMuX2RhdGEuZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG5cbiAgICBpZiAodGhpcy5fZGF0YS5zaXplID4gdGhpcy5fbWF4U2l6ZSkge1xuICAgICAgdGhpcy5fdHJpbSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgY29udGVudHMgb2YgdGhpcyBjYWNoZSBpbnN0YW5jZVxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5fZGF0YS5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBjYWNoZSBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5zaXplO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExSVUNhY2hlO1xuIiwKICAgICIvKlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cbmltcG9ydCBMUlVDYWNoZSBmcm9tIFwiLi9scnUtY2FjaGVcIjtcblxuZXhwb3J0IGNvbnN0IGZyYWdtZW50Q2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nLCBEb2N1bWVudEZyYWdtZW50PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gaHRtbFRvRnJhZ21lbnQoaHRtbDogc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIGNvbnN0IGxvb2t1cCA9IGZyYWdtZW50Q2FjaGUuZ2V0KGh0bWwpO1xuXG4gIGlmIChsb29rdXAgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBsb29rdXAuY2xvbmVOb2RlKHRydWUpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gIH1cblxuICBjb25zdCB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICB0ZW1wLmlubmVySFRNTCA9IGh0bWw7XG4gIGZyYWdtZW50Q2FjaGUuc2V0KGh0bWwsIHRlbXAuY29udGVudCk7XG4gIHJldHVybiB0ZW1wLmNvbnRlbnQuY2xvbmVOb2RlKHRydWUpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIiNjb21wb25lbnRcIjtcbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuaW1wb3J0IHsgaXNUYWdOYW1lIH0gZnJvbSBcIiN1dGlsXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRlbXBsYXRlU3RyaW5nVmFsdWUoXG4gIHZhbDogc3RyaW5nIHwgdHlwZW9mIENvbXBvbmVudCB8IEhUTUxUZW1wbGF0ZUVsZW1lbnQsXG4pOiBzdHJpbmcge1xuICBpZiAodmFsIGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCkge1xuICAgIHJldHVybiB2YWwuaW5uZXJIVE1MO1xuICB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICh2YWwucHJvdG90eXBlIGluc3RhbmNlb2YgQ29tcG9uZW50IHx8IHZhbCA9PT0gQ29tcG9uZW50KVxuICApIHtcbiAgICBjb25zdCB0YWdOYW1lID0gdmFsLnRhZ05hbWU7XG4gICAgaWYgKCFpc1RhZ05hbWUodGFnTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX0NPTVBPTkVOVCxcbiAgICAgICAgdmFsLm5hbWUsXG4gICAgICAgIHZhbC50YWdOYW1lLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhZ05hbWU7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBgPHNwYW4gOjpzd2FwPVwiJHt2YWx9XCI+PC9zcGFuPmA7XG4gIH1cblxuICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElELCBTdHJpbmcodmFsKSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIHtAbGluayBIVE1MVGVtcGxhdGVFbGVtZW50fSBmcm9tIHRoZSBwcm92aWRlZCBIVE1MIHN0cmluZy5cbiAqXG4gKiBUaGVzZSBIVE1MIFRlbXBsYXRlcyBjYW4gYmUgdXNlZCBhcyBzdGFuZGFyZCBIVE1MIFRlbXBsYXRlcywgb3IgYXMgdGhlXG4gKiBmb3VuZGF0aW9uIGZvciBhIHtAbGluayBDb21wb25lbnR9IG9yIHN0YW5kYWxvbmUge0BsaW5rIFRlbXBsYXRlfVxuICpcbiAqIEludGVycG9sYXRlcyB2YWx1ZXMgaW4gdGhlIHRlbXBsYXRlIHN0cmluZyB0byBwcm92aWRlIGhlbHBlcnMgZm9yIGNvbXBvc2luZ1xuICogdGVtcGxhdGVzOlxuICpcbiAqIC0gSFRNTFRlbXBsYXRlRWxlbWVudCByZWZlcmVuY2VzIGFyZSBzZXJpYWxpemVkIHRvIEhUTUwgYW5kIGlubGluZWRcbiAqIC0gU3RyaW5ncyBhcmUgbW9kaWZpZWQgdG8gYmVjb21lIDxzcGFuPiB0YWdzIHdpdGggdGhlIDo6c3dhcCBkaXJlY3RpdmUgc2V0XG4gKiAgIHRvIHRoZSBzdHJpbmcgdmFsdWUuIFRoaXMgaXMgaGVscGZ1bCBzaG9ydGhhbmQgZm9yIGNvbnRlbnQgcGxhY2Vob2xkZXJzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogVGhpcyB0ZW1wbGF0ZSBzdHJpbmdcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCAkdGVtcGxhdGUgPSBodG1sYFxuICogPGRpdiA6Y2xhc3M9XCIqY2xhc3NuYW1lc1wiPlxuICogICAke1wiQGNvbnRlbnRcIn1cbiAqIDwvZGl2PlxuICogYFxuICogYGBgXG4gKlxuICogUHJvZHVjZXMgdGhpcyB0ZW1wbGF0ZSBlbGVtZW50IChwb3J0cmF5ZWQgYXMgSFRNTClcbiAqXG4gKiBgYGBodG1sXG4gKiA8dGVtcGxhdGU+XG4gKiAgIDxkaXYgOmNsYXNzPVwiKmNsYXNzbmFtZXNcIj5cbiAqICAgICA8c3BhbiA6OnN3YXA9XCJAY29udGVudFwiPjwvc3Bhbj5cbiAqICAgPC9kaXY+XG4gKiA8L3RlbXBsYXRlPlxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBodG1sKFxuICBzdHJpbmdzOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSxcbiAgLi4udmFsdWVzOiAoXG4gICAgfCBgQCR7c3RyaW5nfWBcbiAgICB8IGAkJHtzdHJpbmd9YFxuICAgIHwgYCMke3N0cmluZ31gXG4gICAgfCBgKiR7c3RyaW5nfWBcbiAgICB8IEhUTUxUZW1wbGF0ZUVsZW1lbnRcbiAgICB8IHR5cGVvZiBDb21wb25lbnQ8YW55PlxuICApW11cbik6IEhUTUxUZW1wbGF0ZUVsZW1lbnQge1xuICBjb25zdCBmdWxsU3RyaW5nID0gc3RyaW5ncy5yZWR1Y2UoKGFjYywgc3RyLCBpKSA9PiB7XG4gICAgY29uc3QgcGFyc2VkVmFsdWUgPSB2YWx1ZXNbaV1cbiAgICAgID8gYCR7cGFyc2VUZW1wbGF0ZVN0cmluZ1ZhbHVlKHZhbHVlc1tpXSl9YFxuICAgICAgOiBcIlwiO1xuICAgIHJldHVybiBhY2MgKyBzdHIgKyBwYXJzZWRWYWx1ZTtcbiAgfSwgXCJcIik7XG5cbiAgY29uc3QgdGVtcGxhdGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICB0ZW1wbGF0ZUVsZW1lbnQuaW5uZXJIVE1MID0gZnVsbFN0cmluZztcbiAgcmV0dXJuIHRlbXBsYXRlRWxlbWVudDtcbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IEVycm9yQ29kZSwgUGFsZXR0ZUVycm9yIH0gZnJvbSBcIiNlcnJvclwiO1xuXG5leHBvcnQgdHlwZSBTdGF0ZUxpc3RlbmVyPFNoYXBlPiA9IChzdGF0ZTogU2hhcGUpID0+IHZvaWQ7XG5cbmNvbnN0IFBST1hZX0RFUFRIX1dBUk5JTkdfTElNSVQgPSA0O1xuXG5jb25zdCBBcnJheU11dGF0b3JGdW5jdGlvbnMgPSBuZXcgU2V0KFtcbiAgXCJwdXNoXCIsXG4gIFwicG9wXCIsXG4gIFwic2hpZnRcIixcbiAgXCJ1bnNoaWZ0XCIsXG4gIFwic3BsaWNlXCIsXG4gIFwic29ydFwiLFxuICBcInJldmVyc2VcIixcbiAgXCJmaWxsXCIsXG4gIFwiY29weVdpdGhpblwiLFxuXSk7XG5cbmNvbnN0IERhdGFTdHJ1Y3R1cmVNdXRhdG9yRnVuY3Rpb25zID0gbmV3IFNldChbXG4gIFwiYWRkXCIsXG4gIFwiZGVsZXRlXCIsXG4gIFwiY2xlYXJcIixcbiAgXCJzZXRcIixcbl0pO1xuXG4vKipcbiAqIFBvd2VyZnVsIGFuZCBmbGV4aWJsZSBzdGF0ZSBtYW5hZ2VtZW50IHdpdGggZGVlcCByZWFjdGl2aXR5LCB0cmFuc2FjdGlvbiwgYW5kXG4gKiBsb2NraW5nIHN1cHBvcnQuXG4gKlxuICogVGhlIFN0YXRlIGNsYXNzIHdyYXBzIHN0YXRlZnVsIGRhdGEgYW5kIHByb3ZpZGVzIGFuIEFQSSBmb3IgbXV0YXRpbmcgdGhlIGRhdGFcbiAqIHdoaWxlIGxpc3RlbmVycyBzdWJzY3JpYmUgdG8gbWVhbmluZ2Z1bCB1cGRhdGVzLlxuICpcbiAqIE1vZGlmeSBzdGF0ZSB3aXRoIHNldHRlcnMsIG11dGF0b3JzLCB0cmFuc2FjdGlvbnMsIG9yIHByb3hpZWQgdXBkYXRlcyB3aXRoXG4gKiBkZWVwIHJlYWN0aXZpdHkgYW5kIGFycmF5IG11dGF0aW9uIHN1cHBvcnQgYnVpbHQgaW4uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7Y291bnQ6IDF9KTtcbiAqIHN0YXRlLmFkZExpc3RlbmVyKGRhdGEgPT4gY29uc29sZS5sb2coZGF0YSkpXG4gKlxuICogc3RhdGUuc2V0KFwiY291bnRcIiwgMik7IC8vIFByaW50cyBcIjJcIlxuICogc3RhdGUuc2V0KFwiY291bnRcIiwgMik7IC8vIE5vdGhpbmcgaGFwcGVucywgbm8gY2hhbmdlXG4gKiBzdGF0ZS5saXZlLmNvdW50ID0gMzsgLy8gUHJpbnRzIFwiM1wiXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXRlPFNoYXBlIGV4dGVuZHMgb2JqZWN0PiB7XG4gIHByaXZhdGUgX2RhdGE6IFNoYXBlO1xuICBwcml2YXRlIF9saXN0ZW5lcnM6IFNldDxTdGF0ZUxpc3RlbmVyPFNoYXBlPj4gPSBuZXcgU2V0KCk7XG4gIHByaXZhdGUgX3Byb3h5PzogU2hhcGU7XG4gIHByaXZhdGUgX3Byb3h5Q2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIGFueT4oKTtcbiAgcHJpdmF0ZSBfcmV2ZXJzZVByb3h5Q2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIG9iamVjdD4oKTtcbiAgcHJpdmF0ZSBfaXNMb2NrZWQgPSBmYWxzZTtcblxuICAvLyBPbmx5IGFsbG93IHdhcm5pbmcgaW4gZGV2IG1vZGUsIGFuZCBvbmx5IHByaW50IHRoZSB3YXJuaW5nIG9uY2UgcGVyIGluc3RcbiAgcHJpdmF0ZSBfaGFzV2FybmVkID0gIV9fREVWX187XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbERhdGE6IFNoYXBlLCBvbkNoYW5nZT86IFN0YXRlTGlzdGVuZXI8U2hhcGU+KSB7XG4gICAgdGhpcy5fZGF0YSA9IGluaXRpYWxEYXRhO1xuICAgIHRoaXMuZ2V0ID0gdGhpcy5nZXQuYmluZCh0aGlzKTtcblxuICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLmFkZChvbkNoYW5nZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExhemlseSBjcmVhdGUgYW5kIGNhY2hlIHByb3hpZXMgaW50byB0aGUgc3RhdGUgZm9yIHJlYWN0aXZlIHVwZGF0ZXMgb25cbiAgICogbmVzdGVkIHZhbHVlcy5cbiAgICovXG4gIHByaXZhdGUgX2NyZWF0ZVByb3h5PFQ+KHRhcmdldDogVCwgcGF0aDogc3RyaW5nW10gPSBbXSk6IFQge1xuICAgIC8vIFJldHVybiBwcmltaXRpdmVzIGltbWVkaWF0ZWx5XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBhIGNhY2hlZCBwcm94eSBmb3IgdGhpcyBvYmplY3RcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLl9wcm94eUNhY2hlLmdldCh0YXJnZXQgYXMgb2JqZWN0KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICBpZiAoIXRoaXMuX2hhc1dhcm5lZCAmJiBwYXRoLmxlbmd0aCA+IFBST1hZX0RFUFRIX1dBUk5JTkdfTElNSVQpIHtcbiAgICAgICAgdGhpcy5faGFzV2FybmVkID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS53YXJuKGBcbltTdGF0ZV0gRGVlcGx5IG5lc3RlZCBsaXZlIHN0YXRlIGFjY2VzcyBtYXkgaGF2ZSBwZXJmb3JtYW5jZSBpbXBhY3RzLiBGb3IgZGVlcGx5XG5uZXN0ZWQgb3IgY29tcGxleCBzdGF0ZSB1cGRhdGVzLCB1c2UgLm11dGF0ZSgpLCAucGF0Y2goKSwgb3IgLnRyYW5zYWN0aW9uKCkgZm9yXG5vcHRpbWFsIHBlcmZvcm1hbmNlIChXYXJuaW5nIHdoaWxlIGV2YWx1YXRpbmcgbGl2ZSBhY2Nlc3MgdG8gJHtwYXRoLmpvaW4oXCIuXCIpfSlcbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgcHJveHkgYW5kIGNhY2hlIGl0XG4gICAgY29uc3QgcHJveHkgPSBuZXcgUHJveHkodGFyZ2V0IGFzIG9iamVjdCwge1xuICAgICAgZ2V0OiAob2JqLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkgPT4ge1xuICAgICAgICAvLyBTeW1ib2xzIC0+IERpcmVjdCByZXR1cm5cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgICByZXR1cm4gKG9iaiBhcyBhbnkpW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IChvYmogYXMgYW55KVtrZXldO1xuXG4gICAgICAgIC8vIEZvciBBcnJheXMsIE1hcHMsIGFuZCBTZXRzLCBoYW5kbGUgbXV0YXRvciBmdW5jdGlvbnMgY29ycmVjdGx5XG4gICAgICAgIGlmIChcbiAgICAgICAgICAob2JqIGluc3RhbmNlb2YgU2V0IHx8IG9iaiBpbnN0YW5jZW9mIE1hcCB8fCBBcnJheS5pc0FycmF5KG9iaikpICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbXV0YXRpb25GbnMgPSBBcnJheS5pc0FycmF5KG9iailcbiAgICAgICAgICAgID8gQXJyYXlNdXRhdG9yRnVuY3Rpb25zXG4gICAgICAgICAgICA6IERhdGFTdHJ1Y3R1cmVNdXRhdG9yRnVuY3Rpb25zO1xuICAgICAgICAgIGNvbnN0IGlzTXV0YXRpb24gPSBtdXRhdGlvbkZucy5oYXMoa2V5KTtcblxuICAgICAgICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy5zbmFwc2hvdCgpO1xuXG4gICAgICAgICAgICBsZXQgY3VycmVudDogYW55ID0gc25hcHNob3Q7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcCBvZiBwYXRoKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZXMgPSAoY3VycmVudCBhcyBhbnkpW2tleV0oLi4uYXJncyk7XG5cbiAgICAgICAgICAgIGlmIChpc011dGF0aW9uKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUoc25hcHNob3QpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPYmplY3RzIC0+IHJlY3Vyc2l2ZWx5IGNyZWF0ZSBhIHByb3h5XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlUHJveHkodmFsdWUsIFsuLi5wYXRoLCBrZXldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByaW1pdGl2ZXMgLT4gUmV0dXJuIHZhbHVlXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG5cbiAgICAgIHNldDogKF9vYmosIGtleTogc3RyaW5nIHwgc3ltYm9sLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgIC8vIFJlamVjdCBpZiBjdXJyZW50bHkgbG9ja2VkXG4gICAgICAgIGlmICh0aGlzLl9pc0xvY2tlZCkge1xuICAgICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaXNhbGxvdyBzZXR0aW5nIHN5bWJvbCBwcm9wZXJ0aWVzIG9uIHRhcmdldCBkYXRhIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXB1dGUgYW5kIHVwZGF0ZSB0aGUgcGF0aCB3aXRoIHRoZSB2YWx1ZVxuICAgICAgICBjb25zdCBuZXdQYXRoID0gWy4uLnBhdGgsIGtleV07XG4gICAgICAgIHRoaXMuX3NldE5lc3RlZChuZXdQYXRoLCB0aGlzLl91bndyYXBQcm94eSh2YWx1ZSkpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgaGFzOiAob2JqLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkgPT4ge1xuICAgICAgICByZXR1cm4ga2V5IGluIG9iajtcbiAgICAgIH0sXG5cbiAgICAgIG93bktleXM6IChvYmopID0+IHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhvYmopO1xuICAgICAgfSxcblxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAob2JqLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkgPT4ge1xuICAgICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSk7XG5cbiAgICAgICAgaWYgKGRlc2MpIHtcbiAgICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzYztcbiAgICAgIH0sXG5cbiAgICAgIGRlbGV0ZVByb3BlcnR5OiAob2JqLCBrZXkpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIgfHwgIShrZXkgaW4gb2JqKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXB1dGUgYW5kIHVwZGF0ZSB0aGUgcGF0aCB3aXRoIHRoZSB2YWx1ZVxuICAgICAgICBjb25zdCBuZXdQYXRoID0gWy4uLnBhdGgsIGtleV07XG5cbiAgICAgICAgdGhpcy5fc2V0TmVzdGVkKG5ld1BhdGgsIHVuZGVmaW5lZCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgIH0pIGFzIFQ7XG5cbiAgICB0aGlzLl9wcm94eUNhY2hlLnNldCh0YXJnZXQgYXMgb2JqZWN0LCBwcm94eSk7XG4gICAgdGhpcy5fcmV2ZXJzZVByb3h5Q2FjaGUuc2V0KHByb3h5IGFzIG9iamVjdCwgdGFyZ2V0IGFzIG9iamVjdCk7XG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG5cbiAgcHJpdmF0ZSBfdW53cmFwUHJveHk8VD4odmFsdWU6IFQpOiBUIHtcbiAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBmb3IgcHJpbWl0aXZlc1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGlzIG9uZSBvZiBvdXIgcHJveGllc1xuICAgIGNvbnN0IHJhd1RhcmdldCA9IHRoaXMuX3JldmVyc2VQcm94eUNhY2hlLmdldCh2YWx1ZSBhcyBvYmplY3QpO1xuICAgIGlmIChyYXdUYXJnZXQpIHtcbiAgICAgIHJldHVybiByYXdUYXJnZXQgYXMgVDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYXJyYXlzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUubWFwKChpdGVtKSA9PiB0aGlzLl91bndyYXBQcm94eShpdGVtKSkgYXMgVDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcGxhaW4gb2JqZWN0c1xuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICBjb25zdCB1bndyYXBwZWQ6IGFueSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd24odmFsdWUsIGtleSkpIHtcbiAgICAgICAgICB1bndyYXBwZWRba2V5XSA9IHRoaXMuX3Vud3JhcFByb3h5KCh2YWx1ZSBhcyBhbnkpW2tleV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdW53cmFwcGVkO1xuICAgIH1cblxuICAgIC8vIE90aGVyIG9iamVjdHMgKERhdGUsIE1hcCwgU2V0LCBldGMuKSBwYXNzIHRocm91Z2hcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHNldHRpbmcgbmVzdGVkIHZhbHVlcyBhbmQgZW1pdHRpbmcgdXBkYXRlZCBkYXRhIGlmIHRoZSB2YWx1ZSBjaGFuZ2VkXG4gICAqL1xuICBwcml2YXRlIF9zZXROZXN0ZWQocGF0aDogc3RyaW5nW10sIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBOb3RoaW5nIHRvIGRvIHdpdGggZW1wdHkgcGF0aHNcbiAgICBpZiAoIXBhdGgubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgYXQgdGhlIHJvb3QgYW5kIHNlZWsgdG8gdGhlIHZhbHVlIGJlaW5nIHNldFxuICAgIGxldCBjdXJyZW50OiBhbnkgPSB0aGlzLl9kYXRhO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gcGF0aFtpXSA/PyBcIlwiO1xuICAgICAgaWYgKCEoa2V5IGluIGN1cnJlbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFMSURfU1RBVEVfS0VZLCBwYXRoLmpvaW4oXCIuXCIpKTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gICAgfVxuXG4gICAgY29uc3QgZmluYWxLZXkgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPz8gXCJcIjtcbiAgICBpZiAoIShmaW5hbEtleSBpbiBjdXJyZW50KSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQUxJRF9TVEFURV9LRVksIHBhdGguam9pbihcIi5cIikpO1xuICAgIH1cblxuICAgIC8vIFNldCBhbmQgZW1pdCBvbmx5IGlmIHRoZSB2YWx1ZSBpcyBkaWZmZXJlbnQuIE90aGVyd2lzZSBuby1vcC5cbiAgICBpZiAoY3VycmVudFtmaW5hbEtleV0gIT09IHZhbHVlICYmICFPYmplY3QuaXMoY3VycmVudFtmaW5hbEtleV0sIHZhbHVlKSkge1xuICAgICAgY3VycmVudFtmaW5hbEtleV0gPSB2YWx1ZTtcbiAgICAgIHRoaXMuX2VtaXQodGhpcy5jdXJyZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyBhbiBpbmNvbWluZyBwYXJ0aWFsIHN0YXRlIGFuZCBlbWl0IHVwZGF0ZXMgdG8gbGlzdGVuZXJzIGlmIHRoZXJlXG4gICAqIGFyZSBhbnkgY2hhbmdlcyBkZXRlY3RlZC5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogT2JqZWN0LmlzKCkgdG8gY2hlY2sgZm9yIGRpZmZlcmVuY2VzLiBEb2VzIG5vdCBhdHRlbXB0IGRlZXAgZGlmZmluZy5cbiAgICovXG4gIHByaXZhdGUgX3Byb2Nlc3NJbmNvbWluZ1N0YXRlID0gKGluY29taW5nU3RhdGU6IFBhcnRpYWw8U2hhcGU+KTogdm9pZCA9PiB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGluY29taW5nU3RhdGUgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgIGluY29taW5nU3RhdGUgPT09IG51bGwgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkoaW5jb21pbmdTdGF0ZSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5JTlZBTElEX1NUQVRFX1VQREFURSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoaW5jb21pbmdTdGF0ZSksXG4gICAgICApO1xuICAgIH1cbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgLy8gQ2hlY2sgaWYgYW55IGtleS92YWx1ZSBwYWlyIG9uIHRoZSBpbmNvbWluZyBzdGF0ZSBkaWZmZXJzIGZyb20gdGhlXG4gICAgLy8gZXhpc3RpbmcgZGF0YVxuICAgIGZvciAoY29uc3QgW2tleSwgbmV3VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluY29taW5nU3RhdGUpKSB7XG4gICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLl9kYXRhW2tleSBhcyBrZXlvZiBTaGFwZV07XG4gICAgICBpZiAoIU9iamVjdC5pcyhjdXJyZW50VmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgKHRoaXMuX2RhdGEgYXMgYW55KVtrZXldID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc0NoYW5nZXMpIHtcbiAgICAgIHRoaXMuX2VtaXQodGhpcy5fZGF0YSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBFbWl0IHRoZSBjdXJyZW50IHN0YXRlIHRvIGFsbCBsaXN0ZW5lcnNcbiAgICovXG4gIHByaXZhdGUgX2VtaXQgPSAoZGF0YTogU2hhcGUpOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoZGF0YSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBzdGF0ZVxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGlzIGlzIGEgZGlyZWN0IHJlZmVyZW5jZSB0byB0aGUgaW50ZXJuYWwgc3RhdGUuIEl0IGlzIG1hcmtlZCBhcyBSZWFkb25seVxuICAgKiB0byBoZWxwIHByZXZlbnQgYWNjaWRlbnRhbCBjaGFuZ2VzLiBOZXZlciBlZGl0IHRoaXMgdmFsdWUgZGlyZWN0bHkuXG4gICAqL1xuICBnZXQgY3VycmVudCgpOiBSZWFkb25seTxTaGFwZT4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3hpZWQgYWNjZXNzIHRvIHN0YXRlIHByb3BlcnRpZXMgd2l0aCBhdXRvbWF0aWMgcmVjb25jaWxpYXRpb24uXG4gICAqXG4gICAqIEFsbG93cyBkaXJlY3QgcHJvcGVydHkgYWNjZXNzIGZvciBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcgc3RhdGUgdmFsdWVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBEZWVwIHJlYWN0aXZpdHkgd2l0aCB0aGUgYC5saXZlYCBhY2Nlc3NvclxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHtcbiAgICogICBuZXN0ZWQ6IHtcbiAgICogICAgIHZhbHVlczogWzEsIDIsIDNdLFxuICAgKiAgIH1cbiAgICogfSk7XG4gICAqXG4gICAqIC8vIERlZXAgdmFsdWUgYXNzaWdubWVudCB0cmlnZ2VycyBzdGF0ZSB1cGRhdGVzXG4gICAqIHN0YXRlLmxpdmUubmVzdGVkLnZhbHVlc1sxXSA9IDU7XG4gICAqXG4gICAqIC8vIEFycmF5IG11dGF0b3JzIGFyZSBhdXRvbWF0aWNhbGx5IHJlYWN0aXZlIGFzIHdlbGxcbiAgICogc3RhdGUubGl2ZS5uZXN0ZWQudmFsdWVzLnB1c2goNCk7XG4gICAqIHN0YXRlLmxpdmUubmVzdGVkLnZhbHVlcy5yZXZlcnNlKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0IGxpdmUoKTogU2hhcGUge1xuICAgIGlmICghdGhpcy5fcHJveHkpIHtcbiAgICAgIHRoaXMuX3Byb3h5ID0gdGhpcy5fY3JlYXRlUHJveHkodGhpcy5fZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcm94eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBzdGF0ZSBpcyBjdXJyZW50bHkgbG9ja2VkICh0cnVlKSBvciBub3QgKGZhbHNlKVxuICAgKi9cbiAgZ2V0IGlzTG9ja2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0xvY2tlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIGZ1bmN0aW9uIGZvciB3aGVuIHRoaXMgc3RhdGUgY2hhbmdlcy5cbiAgICpcbiAgICogTGlzdGVuZXJzIGFyZSBpbnZva2VkIGluIHRoZSBvcmRlciB0aGV5IGFyZSByZWdpc3RlcmVkIGFuZCBhcmUgcGFzc2VkIGFcbiAgICogcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbGx5IG1hbmFnZWQgc3RhdGUgb2JqZWN0IGFzIGEgcmVhZG9ubHkgb2JqZWN0LlxuICAgKlxuICAgKiAqKkRvIG5vdCBtb2RpZnkgc3RhdGUgdmFsdWVzIGRpcmVjdGx5KiouIEluc3RlYWQsIHVzZSB7QGxpbmsgc2V0fSBvclxuICAgKiB7QGxpbmsgcGF0Y2h9IHRvIG1ha2UgaW1tdXRhYmxlIHVwZGF0ZXMuXG4gICAqL1xuICBhZGRMaXN0ZW5lciA9IChsaXN0ZW5lcjogU3RhdGVMaXN0ZW5lcjxTaGFwZT4pOiB2b2lkID0+IHtcbiAgICB0aGlzLl9saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIHN0YXRlIGhhbmRsZXJcbiAgICovXG4gIHJlbW92ZUxpc3RlbmVyID0gKGxpc3RlbmVyOiBTdGF0ZUxpc3RlbmVyPFNoYXBlPik6IHZvaWQgPT4ge1xuICAgIHRoaXMuX2xpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgYSBzaW5nbGUgdmFsdWUgZnJvbSB0aGUgc3RhdGUgb2JqZWN0XG4gICAqXG4gICAqIFRoZSB2YWx1ZSBpcyByZXR1cm5lZCBhcyBSZWFkb25seSB0byBwcmV2ZW50IGFjY2lkZW50YWwgc3RhdGUgbXV0YXRpb25zLlxuICAgKiBUbyBtdXRhdGUgc3RhdGVmdWwgcHJvcGVydGllcywgdXNlIHtAbGluayBzZXR9IG9yIHtAbGluayBwYXRjaH0gaW5zdGVhZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7IGNvdW50OiAxIH0pO1xuICAgKiBjb25zb2xlLmxvZyhzdGF0ZS5nZXQoXCJjb3VudFwiKSk7IC8vIDFcbiAgICogYGBgXG4gICAqXG4gICAqL1xuICBnZXQgPSA8SyBleHRlbmRzIGtleW9mIFNoYXBlPihrZXk6IEspOiBSZWFkb25seTxTaGFwZVtLXT4gPT4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhW2tleV0gYXMgUmVhZG9ubHk8U2hhcGVbS10+O1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZGVlcCBjbG9uZSBvZiB0aGUgY3VycmVudCBzdGF0ZSBkYXRhIHVzaW5nIGBzdHJ1Y3R1cmVkQ2xvbmUoKWAgdG9cbiAgICogbWFrZSB0aGUgY29weS5cbiAgICpcbiAgICogVGhlIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGVkaXRlZCB3aXRob3V0IG1vZGlmeWluZyB0aGVcbiAgICogYWN0dWFsIGludGVybmFsIHN0YXRlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNuYXAgPSBzdGF0ZS5zbmFwc2hvdCgpO1xuICAgKiBzbmFwLmNvdW50ICs9IDE7XG4gICAqIHN0YXRlLnBhdGNoKHNuYXApO1xuICAgKiBgYGBcbiAgICovXG4gIHNuYXBzaG90ID0gKCk6IFNoYXBlID0+IHtcbiAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKHRoaXMuX2RhdGEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgYSBzaW5nbGUgc3RhdGVmdWwgcHJvcGVydHkgd2hpbGUgbGVhdmluZyBvdGhlciBwcm9wZXJ0aWVzIHVuY2hhbmdlZC5cbiAgICpcbiAgICogVHJpZ2dlcnMgYW4gdXBkYXRlIHRvIGFsbCBsaXN0ZW5lcnMgaWYgdGhlIHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIGJlZm9yZVxuICAgKiB3aGVuIGNvbXBhcmVkIHVzaW5nIHNoYWxsb3cgZXF1YWxpdHkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdGUgPSBuZXcgU3RhdGUoeyBjb3VudDogMSwgY29sb3I6IFwicmVkXCIgfSk7XG4gICAqIHN0YXRlLnNldChcImNvdW50XCIsIDIpOyAvLyBTdGF0ZSBpcyBub3cgeyBjb3VudDogMiwgY29sb3I6IFwicmVkXCIgfVxuICAgKiBgYGBcbiAgICovXG4gIHNldCA9IDxLIGV4dGVuZHMga2V5b2YgU2hhcGU+KGtleTogSywgdmFsdWU6IFNoYXBlW0tdKTogdm9pZCA9PiB7XG4gICAgLy8gUmVqZWN0IGlmIGN1cnJlbnRseSBsb2NrZWRcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFydGlhbDogUGFydGlhbDxTaGFwZT4gPSB7fTtcbiAgICBwYXJ0aWFsW2tleV0gPSB2YWx1ZTtcblxuICAgIHRoaXMuX3Byb2Nlc3NJbmNvbWluZ1N0YXRlKHBhcnRpYWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgbXVsdGlwbGUgc3RhdGVmdWwgcHJvcGVydGllcyBhdCBvbmNlLCBsZWF2aW5nIG9taXR0ZWQgcHJvcGVydGllc1xuICAgKiB1bmNoYW5nZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFBhdGNoIGEgcGFydGlhbCBzdGF0ZSwgdXBkYXRpbmcgYWxsIGxpc3RlZCBwcm9wZXJ0aWVzIGF0IG9uY2VcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0ZSA9IG5ldyBTdGF0ZSh7XG4gICAqICAgd2VhdGhlcjogXCJzdW5ueVwiLFxuICAgKiAgIHRlbXBlcmF0dXJlOiAzMCxcbiAgICogICBodW1pZGl0eTogNzAsXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBMZWF2ZXMgYHRlbXBlcmF0dXJlYCB1bmNoYW5nZWRcbiAgICogc3RhdGUucGF0Y2goe1xuICAgKiAgIHdlYXRoZXI6IFwiY2xvdWR5XCIsXG4gICAqICAgaHVtaWRpdHk6IDUwLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwYXRjaCA9IChwYXRjaDogUGFydGlhbDxTaGFwZT4pOiBTdGF0ZTxTaGFwZT4gPT4ge1xuICAgIC8vIFJlamVjdCBpZiBjdXJyZW50bHkgbG9ja2VkXG4gICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5TVEFURV9MT0NLRUQpO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2Nlc3NJbmNvbWluZ1N0YXRlKHBhdGNoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogRnVsbHkgcmVwbGFjZSB0aGUgY3VycmVudCBzdGF0ZSBkYXRhIGFuZCBmb3JjZSBsaXN0ZW5lcnMgdG8gcmVjZWl2ZSB0aGVcbiAgICogdXBkYXRlZCBkYXRhIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgcmVwbGFjZSA9IChzdGF0ZTogU2hhcGUpOiBTdGF0ZTxTaGFwZT4gPT4ge1xuICAgIC8vIFJlamVjdCBpZiBjdXJyZW50bHkgbG9ja2VkXG4gICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5TVEFURV9MT0NLRUQpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGEgPSBzdGF0ZTtcbiAgICB0aGlzLl9lbWl0KHRoaXMuX2RhdGEpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBMb2NrIHRoaXMgU3RhdGUgaW5zdGFuY2UsIHByZXZlbnRpbmcgZnVydGhlciBleHRlcm5hbCBjaGFuZ2VzXG4gICAqL1xuICBsb2NrID0gKCk6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5TVEFURV9MT0NLRUQpO1xuICAgIH1cblxuICAgIHRoaXMuX2lzTG9ja2VkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogVW5sb2NrIHRoaXMgU3RhdGUgaW5zdGFuY2UsIGFsbG93aW5nIGZ1cnRoZXIgZXh0ZXJuYWwgY2hhbmdlc1xuICAgKi9cbiAgdW5sb2NrID0gKCk6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgdGhpcy5faXNMb2NrZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogQXBwbHkgY29tcGxleCB1cGRhdGVzIHRvIHRoZSBzdGF0ZSB1c2luZyBhIG11dGF0b3IgZnVuY3Rpb24uXG4gICAqXG4gICAqIFRoZSBtdXRhdG9yIGZ1bmN0aW9uIHRha2VzIG9uZSBwYXJhbWV0ZXIgd2hpY2ggaXMgYSBzdHJ1Y3R1cmVkQ2xvbmUgY29weSBvZlxuICAgKiB0aGUgY3VycmVudCBzdGF0ZSBvYmplY3QuIFdoYXRldmVyIGlzIHJldHVybmVkIGJ5IHRoZSBtdXRhdG9yIGlzIHRoZW5cbiAgICogcGF0Y2hlZCBpbiB0byB0aGUgc3RhdGUuXG4gICAqL1xuICBtdXRhdGUgPSAobXV0YXRvcjogKGN1cnJlbnQ6IFNoYXBlKSA9PiBTaGFwZSk6IFN0YXRlPFNoYXBlPiA9PiB7XG4gICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5TVEFURV9MT0NLRUQpO1xuICAgIH1cblxuICAgIHRoaXMuX3Byb2Nlc3NJbmNvbWluZ1N0YXRlKG11dGF0b3IodGhpcy5zbmFwc2hvdCgpKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYW4gYXN5bmMgbXV0YXRpb24gb2YgdGhlIHN0YXRlLCBvcHRpb25hbGx5IGxvY2tpbmcgdGhlIHN0YXRlIGR1cmluZ1xuICAgKiB0aGUgcHJvY2Vzcy5cbiAgICogQHBhcmFtIG11dGF0b3IgQSBmdW5jdGlvbiB0byBtdXRhdGUgYW5kIHJldHVybiB0aGUgbmV3IHN0YXRlXG4gICAqIEBwYXJhbSBsb2NrIElmIGB0cnVlYCwgbG9jayB0aGUgc3RhdGUgdW50aWwgdGhlIG11dGF0b3IgY29tcGxldGVzXG4gICAqL1xuICBtdXRhdGVBc3luYyA9IGFzeW5jIChcbiAgICBtdXRhdG9yOiAoY3VycmVudDogU2hhcGUpID0+IFByb21pc2U8U2hhcGU+LFxuICAgIGxvY2sgPSBmYWxzZSxcbiAgKTogUHJvbWlzZTxTdGF0ZTxTaGFwZT4+ID0+IHtcbiAgICBpZiAodGhpcy5faXNMb2NrZWQpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlNUQVRFX0xPQ0tFRCk7XG4gICAgfVxuXG4gICAgaWYgKGxvY2spIHtcbiAgICAgIHRoaXMuX2lzTG9ja2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtdXRhdGlvblJlc3VsdCA9IGF3YWl0IG11dGF0b3IodGhpcy5zbmFwc2hvdCgpKTtcbiAgICB0aGlzLl9wcm9jZXNzSW5jb21pbmdTdGF0ZShtdXRhdGlvblJlc3VsdCk7XG5cbiAgICBpZiAobG9jaykge1xuICAgICAgdGhpcy5faXNMb2NrZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvKipcbiAgICogUGVyZm9ybSBhIHRyYW5zYWN0aW9uLXN0eWxlIHNldCBvZiBhY3Rpb25zIGRlZmluZWQgd2l0aGluIGEgZnVuY3Rpb24uXG4gICAqXG4gICAqIFRoZSBwcm92aWRlZCBmdW5jdGlvbiBjYW4gZG8gYW55dGhpbmcsIGJleW9uZCBqdXN0IHNldHRpbmcgc3RhdGUuIEFueVxuICAgKiB1bmNhdWdodCBlcnJvcnMgdGhyb3duIGZyb20gd2l0aGluIHRoZSBmdW5jdGlvbiB3aWxsIGNhdXNlIHRoZSB0cmFuc2FjdGlvblxuICAgKiB0byBmYWlsIGFuZCB0aGUgc3RhdGUgdG8gYXV0b21hdGljYWxseSByb2xsIGJhY2sgdG8gdGhlIGxhc3QgdmFsaWQgc3RhdGUuXG4gICAqXG4gICAqIER1cmluZyBhIHRyYW5zYWN0aW9uLCB0aGlzIHN0YXRlIGluc3RhbmNlIHdpbGwgYmUgbG9ja2VkLCBwcmV2ZW50aW5nIG90aGVyXG4gICAqIGNoYW5nZXMuXG4gICAqXG4gICAqIFRyYW5zYWN0aW9ucyB3aWxsIGFsd2F5cyByZXN1bHQgaW4gYSBzdGF0ZSB1cGRhdGUgd2hlbiBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBUcmFuc2FjdGlvbnMgd2l0aCBsb2NraW5nIGFuZCByb2xsYmFjayBzdXBwb3J0XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdGUgPSBuZXcgU3RhdGUoe2NvdW50OiAxfSk7XG4gICAqXG4gICAqIHN0YXRlLnRyYW5zYWN0aW9uKGFzeW5jIChzKSA9PiB7XG4gICAqICAgLy8gYHNgIGlzIGEgZnVsbCBTdGF0ZSBvYmplY3QgeW91IGNhbiBzYWZlbHkgbWFuaXB1bGF0ZVxuICAgKiAgIHMuc2V0KFwiY291bnRcIiwgMTApO1xuICAgKiB9KTtcbiAgICogc3RhdGUuZ2V0KFwiY291bnRcIik7IC8vID0+IDEwO1xuICAgKlxuICAgKiAvLyBFcnJvcnMgaW5zaWRlIHRoZSB0cmFuc2FjdGlvbiByb2xsIGJhY2sgdGhlIHN0YXRlXG4gICAqIHN0YXRlLnRyYW5zYWN0aW9uKGFzeW5jIChzKSA9PiB7XG4gICAqICAgcy5zZXQoXCJjb3VudFwiLCAxMDApO1xuICAgKiAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgKiB9KTtcbiAgICogc3RhdGUuZ2V0KFwiY291bnRcIik7IC8vID0+IDEwO1xuICAgKi9cbiAgdHJhbnNhY3Rpb24gPSAoZm46IChzdGF0ZTogU3RhdGU8U2hhcGU+KSA9PiB2b2lkKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5TVEFURV9MT0NLRUQpO1xuICAgIH1cblxuICAgIC8vIExvY2sgb3V0c2lkZSBvZiB0aGUgdHJ5L2NhdGNoIHRvIHRocm93IGltbWVkaWF0ZWx5LCBzZXBhcmF0aW5nIHRoZVxuICAgIC8vIHRyYW5zYWN0aW9uIGZ1bmN0aW9uIGVycm9yIGZyb20gdGhlIGFjdHVhbCBjYWxsIHNpdGUgZXJyb3JzXG4gICAgdGhpcy5faXNMb2NrZWQgPSB0cnVlO1xuXG4gICAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBzdGF0ZSBvYmplY3QgdG8gdXNlIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uU3RhdGUgPSBuZXcgU3RhdGU8U2hhcGU+KHRoaXMuc25hcHNob3QoKSk7XG5cbiAgICAgIC8vIFJ1biB0aGUgdHJhbnNhY3Rpb24gaXRzZWxmXG4gICAgICBmbih0cmFuc2FjdGlvblN0YXRlKTtcblxuICAgICAgLy8gQWRvcHQgdGhlIHJlc3VsdGluZyBzdGF0ZSBvZiB0aGUgdGVtcG9yYXJ5IG9iamVjdFxuICAgICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUodHJhbnNhY3Rpb25TdGF0ZS5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW1N0YXRlXSBUcmFuc2FjdGlvbiBmYWlsZWQgZHVlIHRvIGNhdWdodCBlcnJvclwiLCBlcnJvcik7XG4gICAgICB9XG4gICAgICBzdWNjZXNzID0gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2lzTG9ja2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH07XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSB0cmFuc2FjdGlvbi1zdHlsZSBzZXQgb2YgYWN0aW9ucyBkZWZpbmVkIHdpdGhpbiBhbiBhc3luYyBmdW5jdGlvblxuICAgKlxuICAgKiBUaGUgcHJvdmlkZWQgZnVuY3Rpb24gY2FuIGRvIGFueXRoaW5nLCBiZXlvbmQganVzdCBzZXR0aW5nIHN0YXRlLiBBbnlcbiAgICogdW5jYXVnaHQgZXJyb3JzIHRocm93biBmcm9tIHdpdGhpbiB0aGUgZnVuY3Rpb24gd2lsbCBjYXVzZSB0aGUgdHJhbnNhY3Rpb25cbiAgICogdG8gZmFpbCBhbmQgdGhlIHN0YXRlIHRvIGF1dG9tYXRpY2FsbHkgcm9sbCBiYWNrIHRvIHRoZSBsYXN0IHZhbGlkIHN0YXRlLlxuICAgKlxuICAgKiBEdXJpbmcgYSB0cmFuc2FjdGlvbiwgdGhpcyBzdGF0ZSBpbnN0YW5jZSB3aWxsIGJlIGxvY2tlZCwgcHJldmVudGluZyBvdGhlclxuICAgKiBjaGFuZ2VzLlxuICAgKlxuICAgKiBUcmFuc2FjdGlvbnMgd2lsbCBhbHdheXMgcmVzdWx0IGluIGEgc3RhdGUgdXBkYXRlIHdoZW4gc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogVHJhbnNhY3Rpb25zIHdpdGggbG9ja2luZyBhbmQgcm9sbGJhY2sgc3VwcG9ydFxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHN0YXRlID0gbmV3IFN0YXRlKHtjb3VudDogMX0pO1xuICAgKlxuICAgKiAvLyBBd2FpdGluZyB0aGUgcmVzdWx0IG9mIGEgdHJhbnNhY3Rpb25cbiAgICogYXdhaXQgc3RhdGUudHJhbnNhY3Rpb25Bc3luYyhhc3luYyAocykgPT4ge1xuICAgKiAgIC8vIGBzYCBpcyBhIGZ1bGwgU3RhdGUgb2JqZWN0IHlvdSBjYW4gc2FmZWx5IG1hbmlwdWxhdGVcbiAgICogICBzLnNldChcImNvdW50XCIsIDEwKTtcbiAgICogfSk7XG4gICAqIHN0YXRlLmdldChcImNvdW50XCIpOyAvLyA9PiAxMDtcbiAgICpcbiAgICogLy8gRXJyb3JzIGluc2lkZSB0aGUgdHJhbnNhY3Rpb24gcm9sbCBiYWNrIHRoZSBzdGF0ZVxuICAgKiBhd2FpdCBzdGF0ZS50cmFuc2FjdGlvbkFzeW5jKGFzeW5jIChzKSA9PiB7XG4gICAqICAgcy5zZXQoXCJjb3VudFwiLCAxMDApO1xuICAgKiAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgKiB9KTtcbiAgICogc3RhdGUuZ2V0KFwiY291bnRcIik7IC8vID0+IDEwO1xuICAgKlxuICAgKiAvLyBJZiB5b3UgZm9yZ2V0IHRvIGF3YWl0IHRoZSB0cmFuc2FjdGlvbiwgaXRzIHN0aWxsIGxvY2tlZFxuICAgKiBzdGF0ZS50cmFuc2FjdGlvbkFzeW5jKGFzeW5jIChzKSA9PiB7XG4gICAqICAgYXdhaXQgd2FpdFNlY29uZHMoMSk7XG4gICAqIH0pO1xuICAgKiBzdGF0ZS5zZXQoXCJjb3VudFwiLCAxKTsgLy8gRXJyb3I6IFN0YXRlIGlzIGxvY2tlZCFcbiAgICogYGBgXG4gICAqL1xuICB0cmFuc2FjdGlvbkFzeW5jID0gYXN5bmMgKFxuICAgIGZuOiAoc3RhdGU6IFN0YXRlPFNoYXBlPikgPT4gUHJvbWlzZTx2b2lkPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgaWYgKHRoaXMuX2lzTG9ja2VkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5TVEFURV9MT0NLRUQpO1xuICAgIH1cblxuICAgIC8vIExvY2sgb3V0c2lkZSBvZiB0aGUgdHJ5L2NhdGNoIHRvIHRocm93IGltbWVkaWF0ZWx5LCBzZXBhcmF0aW5nIHRoZVxuICAgIC8vIHRyYW5zYWN0aW9uIGZ1bmN0aW9uIGVycm9yIGZyb20gdGhlIGFjdHVhbCBjYWxsIHNpdGUgZXJyb3JzXG4gICAgdGhpcy5faXNMb2NrZWQgPSB0cnVlO1xuXG4gICAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBzdGF0ZSBvYmplY3QgdG8gdXNlIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uU3RhdGUgPSBuZXcgU3RhdGU8U2hhcGU+KHRoaXMuc25hcHNob3QoKSk7XG5cbiAgICAgIC8vIFJ1biB0aGUgdHJhbnNhY3Rpb24gaXRzZWxmXG4gICAgICBhd2FpdCBmbih0cmFuc2FjdGlvblN0YXRlKTtcblxuICAgICAgLy8gQWRvcHQgdGhlIHJlc3VsdGluZyBzdGF0ZSBvZiB0aGUgdGVtcG9yYXJ5IG9iamVjdFxuICAgICAgdGhpcy5fcHJvY2Vzc0luY29taW5nU3RhdGUodHJhbnNhY3Rpb25TdGF0ZS5jdXJyZW50KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW1N0YXRlXSBUcmFuc2FjdGlvbiBmYWlsZWQgZHVlIHRvIGNhdWdodCBlcnJvclwiLCBlcnJvcik7XG4gICAgICB9XG4gICAgICBzdWNjZXNzID0gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2lzTG9ja2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1Y2Nlc3M7XG4gIH07XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IENoYXJDb2RlcyB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHR5cGUgeyBQYXJzZWROb3RhdGlvbiB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gYXR0cmlidXRlIG5hbWUgbWF0Y2hlcyB0aGUgXCJib3VuZCBhdHRyaWJ1dGVcIiBzeW50YXhcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaXNCb3VuZEF0dHJpYnV0ZShcIjpjbGFzc1wiKSAvLyB0cnVlXG4gKiBpc0JvdW5kQXR0cmlidXRlKFwiOjpjbGFzc1wiKSAvLyBmYWxzZVxuICogaXNCb3VuZEF0dHJpYnV0ZShcImNsYXNzXCIpIC8vIGZhbHNlXG4gKiBgYGBcbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBmdW5jdGlvbiB1c2VzIGxvb3BzIGFuZCBjaGFyYWN0ZXIgY29kZSBjaGVja3MgaW5zdGVhZCBvZiBhIHJlZ2V4IHRvXG4gKiBvcHRpbWl6ZSBmb3IgaG90IHBhdGhzIGR1cmluZyBpbml0aWFsIHBhcnNpbmcgYW5kIHJlbmRlcmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQm91bmRBdHRyaWJ1dGUoYXR0ck5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoYXR0ck5hbWVbMF0gIT09IFwiOlwiIHx8IGF0dHJOYW1lLmxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMTsgaSA8IGF0dHJOYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gRW5zdXJlIHRoZSBjaGFyYWN0ZXIgY29kZSBpcyBhIGxldHRlciBvciBoeXBoZW5cbiAgICBjb25zdCBjaGFyID0gYXR0ck5hbWUuY2hhckNvZGVBdChpKTtcblxuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIGNoYXIgPT09IENoYXJDb2Rlcy5IeXBoZW4gfHxcbiAgICAgICAgKGNoYXIgPj0gQ2hhckNvZGVzLkEgJiYgY2hhciA8PSBDaGFyQ29kZXMuWikgfHxcbiAgICAgICAgKGNoYXIgPj0gQ2hhckNvZGVzLmEgJiYgY2hhciA8PSBDaGFyQ29kZXMueilcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuY29uc3QgZW51bSBOb3RhdGlvblByZWZpeCB7XG4gIEF0dHJpYnV0ZXMgPSBcIkBcIixcbiAgU3RhdGUgPSBcIiRcIixcbiAgRGF0YSA9IFwiKlwiLFxuICBJdGVtID0gXCIjXCIsXG59XG5cbmNvbnN0IFBSRUZJWF9NQVBQSU5HOiBSZWNvcmQ8Tm90YXRpb25QcmVmaXgsIHN0cmluZz4gPSB7XG4gIFtOb3RhdGlvblByZWZpeC5BdHRyaWJ1dGVzXTogXCJhdHRyXCIsXG4gIFtOb3RhdGlvblByZWZpeC5TdGF0ZV06IFwic3RhdGVcIixcbiAgW05vdGF0aW9uUHJlZml4LkRhdGFdOiBcImRhdGFcIixcbiAgW05vdGF0aW9uUHJlZml4Lkl0ZW1dOiBcIml0ZW1cIixcbn07XG5cbmNvbnN0IHByZWZpeE1hcHBpbmcgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKFBSRUZJWF9NQVBQSU5HKSk7XG5cbi8qKlxuICogUGFyc2UgYSBub3RhdGlvbiBpbnRvIGFuIG9iamVjdCB3aXRoIHJ1bnRpbWUgaW5mb3JtYXRpb25cbiAqXG4gKiBAcmVtYXJrc1xuICogRm91ciBub3RhdGlvbnMgYXJlIHN1cHBvcnRlZDpcbiAqXG4gKiAtIGBAYXR0cm5hbWVgIC0+IFJvb3QgZWxlbWVudCBhdHRyaWJ1dGVzXG4gKiAtIGAkc3RhdGV2YWx1ZWAgLT4gU3RhdGVmdWwgY29udGVudFxuICogLSBgKnByb3BlcnR5Lm9yLndoYXRldmVyYCAtPiBDb21wdXRlZCBkYXRhIHByb3BlcnRpZXNcbiAqIC0gYCNjb2xvcmAgLT4gTGlzdCBpdGVtIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTm90YXRpb24obm90YXRpb246IHN0cmluZyk6IFBhcnNlZE5vdGF0aW9uIHtcbiAgLy8gQ2hlY2sgZm9yIHByZWZpeCBtb2RpZmllcnNcbiAgbGV0IG5vdE1vZGlmaWVyID0gZmFsc2U7XG5cbiAgbGV0IHBhdGhQYXJ0ID0gXCJcIjtcbiAgY29uc3QgY29tcHV0ZWRQYXRoOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGxldCBpc0ZpcnN0ID0gdHJ1ZTtcbiAgZm9yIChjb25zdCBjaGFyIG9mIG5vdGF0aW9uKSB7XG4gICAgLy8gISBhdCBwb3NpdGlvbiAwIC0+IEVuYWJsZSBOT1QgbW9kaWZpZXIsIGRvbnQgY291bnQgdG93YXJkcyBpZHhcbiAgICBpZiAoaXNGaXJzdCAmJiBjaGFyID09PSBcIiFcIikge1xuICAgICAgbm90TW9kaWZpZXIgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIE90aGVyd2lzZSwgcG9zaXRpb24gMCBtdXN0IGJlIGEgcHJlZml4XG4gICAgZWxzZSBpZiAoaXNGaXJzdCkge1xuICAgICAgY29uc3QgcHJlZml4ID0gcHJlZml4TWFwcGluZy5nZXQoY2hhcik7XG5cbiAgICAgIGlmICghcHJlZml4KSB7XG4gICAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT04sIG5vdGF0aW9uKTtcbiAgICAgIH1cblxuICAgICAgY29tcHV0ZWRQYXRoLnB1c2gocHJlZml4KTtcbiAgICAgIGlzRmlyc3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb2xsZWN0IGNoYXJhY3RlcnMgYW5kIHB1c2ggd2hlbiBoaXR0aW5nIGEgZG90IG9yIGVuZFxuICAgIGVsc2UgaWYgKGNoYXIgPT09IFwiLlwiKSB7XG4gICAgICBpZiAocGF0aFBhcnQubGVuZ3RoKSB7XG4gICAgICAgIGNvbXB1dGVkUGF0aC5wdXNoKHBhdGhQYXJ0KTtcbiAgICAgICAgcGF0aFBhcnQgPSBcIlwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfSU5WQUxJRF9OT1RBVElPTiwgbm90YXRpb24pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXRoUGFydCArPSBjaGFyO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB0aGUgZmluYWwgcGFydCB3aGljaCBtdXN0IGV4aXN0IChvdGhlcndpc2UsIGl0IGVuZGVkIGluIGEgZG90KVxuICBpZiAoIXBhdGhQYXJ0Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTk9UQVRJT04sIG5vdGF0aW9uKTtcbiAgfVxuXG4gIGNvbXB1dGVkUGF0aC5wdXNoKHBhdGhQYXJ0KTtcblxuICBpZiAoY29tcHV0ZWRQYXRoLmxlbmd0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PVEFUSU9OLCBub3RhdGlvbik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhc2U6IG5vdGF0aW9uLFxuICAgIHBhdGg6IGNvbXB1dGVkUGF0aCxcbiAgICBtb2RpZmllcnM6IG5vdE1vZGlmaWVyID8geyBub3Q6IHRydWUgfSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgTm90YXRpb25BY2Nlc3NvciA9IChzb3VyY2U6IHVua25vd24pID0+IHVua25vd247XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFZhbHVlQWNjZXNzb3Iobm90YXRpb246IFBhcnNlZE5vdGF0aW9uKTogTm90YXRpb25BY2Nlc3NvciB7XG4gIGNvbnN0IHsgcGF0aCwgbW9kaWZpZXJzIH0gPSBub3RhdGlvbjtcblxuICBpZiAocGF0aC5sZW5ndGggPCAyKSB7XG4gICAgLy8gTm90YXRpb25zIG11c3QgYWx3YXlzIGhhdmUgYXQgbGVhc3QgMiBwYXJ0czogdGhlIG5hbWVzcGFjZSwgYW5kIGF0IGxlYXN0XG4gICAgLy8gb25lIHByb3BlcnR5IG5hbWUgb24gdGhlIG5hbWVzcGFjZSAoZXhhbXBsZTogW1wic3RhdGVcIiwgXCJ2aXNpYmxlXCJdKVxuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gIH1cblxuICAvLyBGb3IgMiBhbmQgMyBsZW5ndGggcGF0aHMsIHByZS1iYWtlIGFjY2Vzc29ycyB0byBvcHRpbWl6ZSBmb3IgY29tbW9uIGNhc2VzXG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMikge1xuICAgIGNvbnN0IFtmaXJzdEtleSwgc2Vjb25kS2V5XSA9IHBhdGg7XG5cbiAgICBpZiAoZmlyc3RLZXkgPT09IHVuZGVmaW5lZCB8fCBzZWNvbmRLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQVJJQU5UKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHNvdXJjZTogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSAoc291cmNlIGFzIGFueSk/LltmaXJzdEtleV0/LltzZWNvbmRLZXldID8/IG51bGw7XG4gICAgICBpZiAobW9kaWZpZXJzPy5ub3QpIHtcbiAgICAgICAgLy8gQXR0cmlidXRlIHZhbHVlcyBtdXN0IHRyZWF0IHRoZSBlbXB0eSBzdHJpbmcgYXMgdHJ1dGh5IHBlciBET00gcnVsZXNcbiAgICAgICAgaWYgKGZpcnN0S2V5ID09PSBcImF0dHJcIikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gXCJcIiAmJiAhdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIXZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gIH1cblxuICBpZiAocGF0aC5sZW5ndGggPT09IDMpIHtcbiAgICBjb25zdCBbZmlyc3RLZXksIHNlY29uZEtleSwgdGhpcmRLZXldID0gcGF0aDtcblxuICAgIGlmIChcbiAgICAgIGZpcnN0S2V5ID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHNlY29uZEtleSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlyZEtleSA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgIH1cblxuICAgIHJldHVybiAoc291cmNlOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgIChzb3VyY2UgYXMgYW55KT8uW2ZpcnN0S2V5XT8uW3NlY29uZEtleV0/Llt0aGlyZEtleV0gPz8gbnVsbDtcbiAgICAgIGlmIChtb2RpZmllcnM/Lm5vdCkge1xuICAgICAgICBpZiAoZmlyc3RLZXkgPT09IFwiYXR0clwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBcIlwiICYmICF2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIC8vIEZvciBsb25nZXIgcGF0aHMsIG9wdCBmb3IgYSBwcmUtYnVpbHQgbG9vcFxuICByZXR1cm4gKHNvdXJjZTogdW5rbm93bikgPT4ge1xuICAgIGxldCBjdXJyZW50ID0gc291cmNlO1xuXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhdGgpIHtcbiAgICAgIGlmICghY3VycmVudCB8fCB0eXBlb2YgY3VycmVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydCBhcyBrZXlvZiB0eXBlb2YgY3VycmVudF07XG4gICAgfVxuXG4gICAgaWYgKG1vZGlmaWVycz8ubm90KSB7XG4gICAgICBpZiAocGF0aFswXSA9PT0gXCJhdHRyXCIpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgIT09IFwiXCIgJiYgIWN1cnJlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gIWN1cnJlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH07XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgeyBodG1sVG9GcmFnbWVudCB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHtcbiAgYnVpbGRWYWx1ZUFjY2Vzc29yLFxuICBpc0JvdW5kQXR0cmlidXRlLFxuICB0eXBlIE5vdGF0aW9uQWNjZXNzb3IsXG4gIHBhcnNlTm90YXRpb24sXG59IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBBbnlSZW5kZXJQbGFuLFxuICB0eXBlIEFueVNjaGVtZSxcbiAgdHlwZSBBdHRyaWJ1dGVVcGRhdGVQbGFuLFxuICB0eXBlIEF0dHJpYnV0ZVVwZGF0ZVNjaGVtZSxcbiAgdHlwZSBDb21waWxlZFRlbXBsYXRlLFxuICB0eXBlIENvbnRlbnRTd2FwUGxhbixcbiAgdHlwZSBDb250ZW50U3dhcFNjaGVtZSxcbiAgRGlyZWN0aXZlLFxuICB0eXBlIExpc3RSZW5kZXJQbGFuLFxuICB0eXBlIExpc3RSZW5kZXJTY2hlbWUsXG4gIHR5cGUgUGFyc2VkTm90YXRpb24sXG4gIHR5cGUgUHJlcGFyZWRUZW1wbGF0ZSxcbiAgdHlwZSBUYWdDaGFuZ2VQbGFuLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBSRUZfQVRUUiA9IFwiZGF0YS1ub2RlLXJlZlwiO1xuXG5mdW5jdGlvbiBjb2xsZWN0T3BlcmFibGVOb2RlcyhmcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCk6IEhUTUxFbGVtZW50W10ge1xuICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGZyYWdtZW50LCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG4gIGNvbnN0IGtub3duSWdub3JlcyA9IG5ldyBTZXQ8Tm9kZT4oKTtcbiAgY29uc3Qgbm9kZXM6IEhUTUxFbGVtZW50W10gPSBbXTtcblxuICBsZXQgY3VycmVudE5vZGU6IE5vZGUgfCBudWxsID0gd2Fsa2VyLm5leHROb2RlKCk7XG5cbiAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XG4gICAgaWYgKCEoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgIGN1cnJlbnROb2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBsZXQgcGFyZW50ID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICBsZXQgaXNJbkxpc3QgPSBmYWxzZTtcblxuICAgIHdoaWxlIChwYXJlbnQgJiYgIWlzSW5MaXN0KSB7XG4gICAgICBpZiAoXG4gICAgICAgIGtub3duSWdub3Jlcy5oYXMocGFyZW50KSB8fFxuICAgICAgICAocGFyZW50IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgcGFyZW50Lmhhc0F0dHJpYnV0ZShEaXJlY3RpdmUuRWFjaCkpXG4gICAgICApIHtcbiAgICAgICAgaXNJbkxpc3QgPSB0cnVlO1xuICAgICAgICBrbm93bklnbm9yZXMuYWRkKGN1cnJlbnROb2RlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIGlmICghaXNJbkxpc3QpIHtcbiAgICAgIG5vZGVzLnB1c2goY3VycmVudE5vZGUpO1xuICAgIH1cblxuICAgIGN1cnJlbnROb2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XG4gIH1cblxuICByZXR1cm4gbm9kZXM7XG59XG5cbi8qKlxuICogQ29tcGlsZSBhbiB7QGxpbmsgSFRNTFRlbXBsYXRlRWxlbWVudH0gaW50byBhIHtAbGluayBDb21waWxlZFRlbXBsYXRlfSBmb3JcbiAqIGNhY2hpbmcsIGNsb25pbmcsIG9yIHN0b3JhZ2UuXG4gKlxuICogQ29tcGlsZWQgdGVtcGxhdGUgb2JqZWN0cyBjb250YWluIGEgSlNPTi1zZXJpYWxpemFibGUgZGF0YSByZXByZXNlbnRhdGlvbiBvZlxuICogYSB0ZW1wbGF0ZSBhbmQgY2FuIGJlIHByZXBhcmVkIHVzaW5nIHtAbGluayBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZX0gdG9cbiAqIGNyZWF0ZSBuZXcgVGVtcGxhdGUgaW5zdGFuY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29tcGlsZWQgPSBjb21waWxlVGVtcGxhdGUoJHRlbXBsYXRlRWxlbWVudCk7XG4gKiBjb25zdCBzdHJpbmdpZmllZCA9IEpTT04uc3RyaW5naWZ5KGNvbXBpbGVkKTsgLy8gYSBKU09OIHRlbXBsYXRlIGJ1bmRsZVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlVGVtcGxhdGUoc291cmNlOiBIVE1MVGVtcGxhdGVFbGVtZW50KTogQ29tcGlsZWRUZW1wbGF0ZSB7XG4gIGNvbnN0IHBhcnNlZE5vdGF0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBQYXJzZWROb3RhdGlvbj4oKTtcbiAgY29uc3Qgc2NoZW1lczogQW55U2NoZW1lW10gPSBbXTtcbiAgbGV0IGVsZW1lbnRJZCA9IDA7XG5cbiAgY29uc3QgZW5zdXJlTm9kZVJlZiA9IChlbDogSFRNTEVsZW1lbnQpOiBzdHJpbmcgPT4ge1xuICAgIGxldCByZWYgPSBlbC5nZXRBdHRyaWJ1dGUoUkVGX0FUVFIpO1xuICAgIGlmICghcmVmKSB7XG4gICAgICByZWYgPSBgZWwtJHtlbGVtZW50SWQrK31gO1xuICAgICAgZWwuc2V0QXR0cmlidXRlKFJFRl9BVFRSLCByZWYpO1xuICAgIH1cbiAgICByZXR1cm4gcmVmO1xuICB9O1xuXG4gIGNvbnN0IGNsb25lZFRlbXBsYXRlRWxlbWVudCA9IHNvdXJjZS5jb250ZW50LmNsb25lTm9kZShcbiAgICB0cnVlLFxuICApIGFzIERvY3VtZW50RnJhZ21lbnQ7XG5cbiAgY29uc3Qgbm9kZXM6IEhUTUxFbGVtZW50W10gPSBjb2xsZWN0T3BlcmFibGVOb2RlcyhjbG9uZWRUZW1wbGF0ZUVsZW1lbnQpO1xuXG4gIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgIC8vIENvbGxlY3QgYWxsIGF0dHJpYnV0ZXMgb24gdGhpcyBub2RlXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygbm9kZS5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBhdHRyaWJ1dGVzLnNldChuYW1lLCBub2RlLmdldEF0dHJpYnV0ZShuYW1lKSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGRpcmVjdGl2ZSBhdHRyaWJ1dGVzXG4gICAgZm9yIChjb25zdCBbYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlVmFsdWVdIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgIC8vIEJhaWwgcXVpY2tseSBpZiB0aGlzIGlzbid0IGEgZGlyZWN0aXZlXG4gICAgICBpZiAoYXR0cmlidXRlVmFsdWUgPT09IG51bGwgfHwgYXR0cmlidXRlTmFtZVswXSAhPT0gXCI6XCIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBub3RhdGlvbiBoYXMgYmVlbiBwYXJzZWQgYmVmb3JlLCByZXVzZSB0aGF0XG4gICAgICBsZXQgbm90YXRpb24gPSBwYXJzZWROb3RhdGlvbnMuZ2V0KGF0dHJpYnV0ZVZhbHVlKTtcblxuICAgICAgaWYgKG5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbm90YXRpb24gPSBwYXJzZU5vdGF0aW9uKGF0dHJpYnV0ZVZhbHVlKTtcbiAgICAgICAgcGFyc2VkTm90YXRpb25zLnNldChhdHRyaWJ1dGVWYWx1ZSwgbm90YXRpb24pO1xuICAgICAgfVxuXG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcblxuICAgICAgLy8gOjprZXkgaXMgaGFuZGxlZCBpbiB0aGUgOjplYWNoIHJvdXRlXG4gICAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gRGlyZWN0aXZlLktleSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVEFHIENIQU5HRSBTQ0hFTUVTXG4gICAgICBpZiAoYXR0cmlidXRlTmFtZSA9PT0gRGlyZWN0aXZlLlRhZykge1xuICAgICAgICBzY2hlbWVzLnB1c2goe1xuICAgICAgICAgIHR5cGU6IFwidGFnXCIsXG4gICAgICAgICAgbm90YXRpb24sXG4gICAgICAgICAgbm9kZVJlZjogZW5zdXJlTm9kZVJlZihub2RlKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIExJU1QgUkVOREVSIFNDSEVNRVNcbiAgICAgIGVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUgPT09IERpcmVjdGl2ZS5FYWNoKSB7XG4gICAgICAgIGNvbnN0IG5vZGVSZWYgPSBlbnN1cmVOb2RlUmVmKG5vZGUpO1xuXG4gICAgICAgIC8vIEEgOjprZXkgZGlyZWN0aXZlIGlzIHJlcXVpcmVkIHdpdGggYW55IDo6ZWFjaFxuICAgICAgICBjb25zdCBrZXlOb3RhdGlvbiA9IG5vZGUuZ2V0QXR0cmlidXRlKERpcmVjdGl2ZS5LZXkpO1xuICAgICAgICBpZiAoa2V5Tm90YXRpb24gPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9NSVNTSU5HX0xJU1RfS0VZKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKERpcmVjdGl2ZS5LZXkpO1xuXG4gICAgICAgIGNvbnN0IGxpc3RDb250ZW50SHRtbCA9IG5vZGUuaW5uZXJIVE1MO1xuXG4gICAgICAgIHdoaWxlIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUuZmlyc3RDaGlsZCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzY2hlbWU6IExpc3RSZW5kZXJTY2hlbWUgPSB7XG4gICAgICAgICAgdHlwZTogXCJlYWNoXCIsXG4gICAgICAgICAgbm90YXRpb24sXG4gICAgICAgICAga2V5Tm90YXRpb246IHBhcnNlTm90YXRpb24oa2V5Tm90YXRpb24pLFxuICAgICAgICAgIG5vZGVSZWYsXG4gICAgICAgICAgbGlzdENvbnRlbnRIdG1sLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNjaGVtZXMucHVzaChzY2hlbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBDT05URU5UIFNXQVAgU0NIRU1FU1xuICAgICAgZWxzZSBpZiAoYXR0cmlidXRlTmFtZSA9PT0gRGlyZWN0aXZlLlN3YXApIHtcbiAgICAgICAgY29uc3Qgc2NoZW1lOiBDb250ZW50U3dhcFNjaGVtZSA9IHtcbiAgICAgICAgICB0eXBlOiBcInN3YXBcIixcbiAgICAgICAgICBub3RhdGlvbixcbiAgICAgICAgICBub2RlUmVmOiBlbnN1cmVOb2RlUmVmKG5vZGUpLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNjaGVtZXMucHVzaChzY2hlbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBBVFRSSUJVVEUgVVBEQVRFIFNDSEVNRVNcbiAgICAgIGVsc2UgaWYgKGlzQm91bmRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgY29uc3QgYmluZE5hbWUgPSBhdHRyaWJ1dGVOYW1lLnNsaWNlKDEpO1xuXG4gICAgICAgIGNvbnN0IHNjaGVtZTogQXR0cmlidXRlVXBkYXRlU2NoZW1lID0ge1xuICAgICAgICAgIHR5cGU6IFwiYXR0clwiLFxuICAgICAgICAgIG5vdGF0aW9uLFxuICAgICAgICAgIGF0dHJpYnV0ZTogYmluZE5hbWUsXG4gICAgICAgICAgbm9kZVJlZjogZW5zdXJlTm9kZVJlZihub2RlKSxcbiAgICAgICAgfTtcblxuICAgICAgICBzY2hlbWVzLnB1c2goc2NoZW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBUZW1wbGF0ZTogJHthdHRyaWJ1dGVOYW1lfSBpcyBub3QgYSB2YWxpZCBkaXJlY3RpdmVgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5vdGF0aW9uczogUmVjb3JkPHN0cmluZywgUGFyc2VkTm90YXRpb24+ID0ge307XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIHBhcnNlZE5vdGF0aW9ucykge1xuICAgIG5vdGF0aW9uc1trZXldID0gdmFsO1xuICB9XG5cbiAgY29uc3QgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHRlbXAuYXBwZW5kQ2hpbGQoY2xvbmVkVGVtcGxhdGVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG4gIGNvbnN0IGh0bWwgPSB0ZW1wLmlubmVySFRNTDtcblxuICBjb25zdCBjb21waWxlZDogQ29tcGlsZWRUZW1wbGF0ZSA9IHtcbiAgICBodG1sLFxuICAgIHNjaGVtZXMsXG4gICAgbm90YXRpb25zLFxuICB9O1xuXG4gIHJldHVybiBjb21waWxlZDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIHtAbGluayBDb21waWxlZFRlbXBsYXRlfSBzdHJ1Y3R1cmUsIHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyB0aGVcbiAqIGRhdGEgbmVlZGVkIHRvIGNyZWF0ZSBuZXcgVGVtcGxhdGUgaW5zdGFuY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29tcGlsZWRUZW1wbGF0ZSA9IGdldENvbXBpbGVkVGVtcGxhdGVKU09OKCk7XG4gKiBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbXBpbGVkVGVtcGxhdGUpO1xuICogY29uc3QgcHJlcGFyZWQgPSBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZShwYXJzZWQpO1xuICpcbiAqIC8vIEVsc2V3aGVyZS4uLlxuICpcbiAqIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHByZXBhcmVkKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUNvbXBpbGVkVGVtcGxhdGUoXG4gIGNvbXBpbGVkOiBDb21waWxlZFRlbXBsYXRlLFxuICBwcm90b3R5cGVGcmFnbWVudD86IERvY3VtZW50RnJhZ21lbnQsXG4pOiBQcmVwYXJlZFRlbXBsYXRlIHtcbiAgY29uc3QgcGxhbnNCeU5vdGF0aW9uOiBNYXA8c3RyaW5nLCBTZXQ8QW55UmVuZGVyUGxhbj4+ID0gbmV3IE1hcCgpO1xuICBjb25zdCBub3RhdGlvbkFjY2Vzc29yczogTWFwPHN0cmluZywgTm90YXRpb25BY2Nlc3Nvcj4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG5vZGVSZWZzOiBNYXA8c3RyaW5nLCBIVE1MRWxlbWVudD4gPSBuZXcgTWFwKCk7XG5cbiAgZm9yIChjb25zdCBbbm90YXRpb24sIHBhcnNlZF0gb2YgT2JqZWN0LmVudHJpZXMoY29tcGlsZWQubm90YXRpb25zKSkge1xuICAgIG5vdGF0aW9uQWNjZXNzb3JzLnNldChub3RhdGlvbiwgYnVpbGRWYWx1ZUFjY2Vzc29yKHBhcnNlZCkpO1xuICB9XG5cbiAgY29uc3QgZnJhZ21lbnQgPSBwcm90b3R5cGVGcmFnbWVudCA/PyBodG1sVG9GcmFnbWVudChjb21waWxlZC5odG1sKTtcblxuICBjb25zdCB3YWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKGZyYWdtZW50LCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCwge1xuICAgIGFjY2VwdE5vZGUobm9kZTogSFRNTEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBub2RlLmhhc0F0dHJpYnV0ZShSRUZfQVRUUilcbiAgICAgICAgPyBOb2RlRmlsdGVyLkZJTFRFUl9BQ0NFUFRcbiAgICAgICAgOiBOb2RlRmlsdGVyLkZJTFRFUl9TS0lQO1xuICAgIH0sXG4gIH0pO1xuXG4gIGxldCBtYXJrTm9kZTogTm9kZSB8IG51bGwgPSB3YWxrZXIubmV4dE5vZGUoKTtcblxuICB3aGlsZSAobWFya05vZGUpIHtcbiAgICBpZiAoIShtYXJrTm9kZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVmID0gbWFya05vZGUuZ2V0QXR0cmlidXRlKFJFRl9BVFRSKTtcblxuICAgIGlmIChyZWYgPT09IG51bGwpIHtcbiAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gaW4gcHJhY3RpY2UsIGFzIHRoZSB0cmVlIHdhbGtlciBvbmx5IHN1cmZhY2VzXG4gICAgICAvLyBlbGVtZW50cyB3aXRoIGFuIGV4dGFudCBub2RlIHJlZiBhdHRyaWJ1dGVcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gICAgfVxuXG4gICAgbm9kZVJlZnMuc2V0KHJlZiwgbWFya05vZGUpO1xuICAgIG1hcmtOb2RlLnJlbW92ZUF0dHJpYnV0ZShSRUZfQVRUUik7XG4gICAgbWFya05vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcbiAgfVxuXG4gIGNvbnN0IGFzc29jaWF0ZVBsYW4gPSAocGxhbjogQW55UmVuZGVyUGxhbiwgbm90YXRpb246IHN0cmluZykgPT4ge1xuICAgIGxldCBub3RhdGlvblBsYW5zID0gcGxhbnNCeU5vdGF0aW9uLmdldChub3RhdGlvbik7XG4gICAgaWYgKCFub3RhdGlvblBsYW5zKSB7XG4gICAgICBub3RhdGlvblBsYW5zID0gbmV3IFNldCgpO1xuICAgICAgcGxhbnNCeU5vdGF0aW9uLnNldChub3RhdGlvbiwgbm90YXRpb25QbGFucyk7XG4gICAgfVxuICAgIG5vdGF0aW9uUGxhbnMuYWRkKHBsYW4pO1xuICB9O1xuXG4gIGNvbnN0IGdldEJ5Tm9kZVJlZiA9IChub2RlUmVmOiBzdHJpbmcpOiBIVE1MRWxlbWVudCA9PiB7XG4gICAgY29uc3QgY2FjaGVkID0gbm9kZVJlZnMuZ2V0KG5vZGVSZWYpO1xuXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5URU1QTEFURV9JTlZBTElEX05PREVfUkVGKTtcbiAgfTtcblxuICBmb3IgKGNvbnN0IHNjaGVtZSBvZiBjb21waWxlZC5zY2hlbWVzKSB7XG4gICAgLy8gSHlkcmF0ZSBMaXN0IHNjaGVtZXMgaW50byBMaXN0IHBsYW5zXG4gICAgaWYgKHNjaGVtZS50eXBlID09PSBcImVhY2hcIikge1xuICAgICAgY29uc3QgaXRlbVByb3RvdHlwZSA9IGdldEJ5Tm9kZVJlZihzY2hlbWUubm9kZVJlZik7XG4gICAgICBjb25zdCBsaXN0Q29udGFpbmVyID0gaXRlbVByb3RvdHlwZS5wYXJlbnRFbGVtZW50O1xuXG4gICAgICBpZiAoIWxpc3RDb250YWluZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuVEVNUExBVEVfTUlTU0lOR19MSVNUX1BBUkVOVCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBsaXN0IHN0YXJ0L2VuZCBtYXJrZXJzXG4gICAgICBjb25zdCBzdGFydE1hcmtlciA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoXCJsaXN0LXN0YXJ0XCIpO1xuICAgICAgY29uc3QgZW5kTWFya2VyID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcImxpc3QtZW5kXCIpO1xuXG4gICAgICBsaXN0Q29udGFpbmVyLmluc2VydEJlZm9yZShzdGFydE1hcmtlciwgaXRlbVByb3RvdHlwZSk7XG4gICAgICBsaXN0Q29udGFpbmVyLmluc2VydEJlZm9yZShlbmRNYXJrZXIsIGl0ZW1Qcm90b3R5cGUubmV4dFNpYmxpbmcpO1xuXG4gICAgICAvLyBTaGFsbG93IGNvcHkgb2YgdGhlIHJvdyByb290XG4gICAgICBjb25zdCByb3dSb290RWxlbWVudCA9IGl0ZW1Qcm90b3R5cGUuY2xvbmVOb2RlKGZhbHNlKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgLy8gQ29weSB0aGUgY29udGVudHMgb2YgdGhlIHJvdyBpbnRvIGEgdGVtcGxhdGVcbiAgICAgIGNvbnN0IHRlbXBsYXRlQ29udGVudFNyYyA9IGh0bWxUb0ZyYWdtZW50KHNjaGVtZS5saXN0Q29udGVudEh0bWwpO1xuICAgICAgY29uc3Qgcm93VGVtcGxhdGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICAgICAgcm93VGVtcGxhdGVFbGVtZW50LmFwcGVuZENoaWxkKHRlbXBsYXRlQ29udGVudFNyYyk7XG5cbiAgICAgIC8vIFJlbW92ZSB0aGUgb3JpZ2luYWwgcm9vdCBwcm90b3R5cGUgc2luY2Ugd2Ugd2lsbCBiZSByZW5kZXJpbmcgbmV3IGl0ZW1zXG4gICAgICBpdGVtUHJvdG90eXBlLnJlbW92ZSgpO1xuXG4gICAgICBjb25zdCBwbGFuOiBMaXN0UmVuZGVyUGxhbiA9IHtcbiAgICAgICAgdHlwZTogXCJlYWNoXCIsXG4gICAgICAgIG5vdGF0aW9uOiBzY2hlbWUubm90YXRpb24sXG4gICAgICAgIGtleU5vdGF0aW9uOiBzY2hlbWUua2V5Tm90YXRpb24sXG4gICAgICAgIGxpc3RDb250YWluZXJFbGVtZW50OiBsaXN0Q29udGFpbmVyLFxuICAgICAgICByb3dUZW1wbGF0ZUVsZW1lbnQsXG4gICAgICAgIHJvd1Jvb3RFbGVtZW50LFxuICAgICAgICBzdGFydE1hcmtlcixcbiAgICAgICAgZW5kTWFya2VyLFxuICAgICAgICByb3dUZW1wbGF0ZXNCeVJvb3Q6IG5ldyBXZWFrTWFwKCksXG4gICAgICAgIHJvd1Jvb3RzQnlLZXk6IG5ldyBNYXAoKSxcbiAgICAgIH07XG5cbiAgICAgIGFzc29jaWF0ZVBsYW4ocGxhbiwgc2NoZW1lLm5vdGF0aW9uLmJhc2UpO1xuICAgIH1cbiAgICAvLyBIeWRyYXRlIFN3YXAgc2NoZW1lcyBpbnRvIFN3YXAgcGxhbnNcbiAgICBlbHNlIGlmIChzY2hlbWUudHlwZSA9PT0gXCJzd2FwXCIpIHtcbiAgICAgIGNvbnN0IHBsYW46IENvbnRlbnRTd2FwUGxhbiA9IHtcbiAgICAgICAgdHlwZTogXCJzd2FwXCIsXG4gICAgICAgIG5vdGF0aW9uOiBzY2hlbWUubm90YXRpb24sXG4gICAgICAgIG5vZGU6IGdldEJ5Tm9kZVJlZihzY2hlbWUubm9kZVJlZiksXG4gICAgICB9O1xuXG4gICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIHNjaGVtZS5ub3RhdGlvbi5iYXNlKTtcbiAgICB9XG5cbiAgICAvLyBIeWRyYXRlIFRhZyBjaGFuZ2UgcGxhbnNcbiAgICBlbHNlIGlmIChzY2hlbWUudHlwZSA9PT0gXCJ0YWdcIikge1xuICAgICAgY29uc3QgcGxhbjogVGFnQ2hhbmdlUGxhbiA9IHtcbiAgICAgICAgdHlwZTogXCJ0YWdcIixcbiAgICAgICAgbm90YXRpb246IHNjaGVtZS5ub3RhdGlvbixcbiAgICAgICAgbm9kZTogZ2V0QnlOb2RlUmVmKHNjaGVtZS5ub2RlUmVmKSxcbiAgICAgIH07XG5cbiAgICAgIGFzc29jaWF0ZVBsYW4ocGxhbiwgcGxhbi5ub3RhdGlvbi5iYXNlKTtcbiAgICB9XG5cbiAgICAvLyBIeWRyYXRlIEF0dHJpYnV0ZSB1cGRhdGUgcGxhbnNcbiAgICBlbHNlIGlmIChzY2hlbWUudHlwZSA9PT0gXCJhdHRyXCIpIHtcbiAgICAgIGNvbnN0IHBsYW46IEF0dHJpYnV0ZVVwZGF0ZVBsYW4gPSB7XG4gICAgICAgIHR5cGU6IFwiYXR0clwiLFxuICAgICAgICBhdHRyaWJ1dGU6IHNjaGVtZS5hdHRyaWJ1dGUsXG4gICAgICAgIG5vdGF0aW9uOiBzY2hlbWUubm90YXRpb24sXG4gICAgICAgIG5vZGU6IGdldEJ5Tm9kZVJlZihzY2hlbWUubm9kZVJlZiksXG4gICAgICB9O1xuXG4gICAgICBhc3NvY2lhdGVQbGFuKHBsYW4sIHBsYW4ubm90YXRpb24uYmFzZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwbGFuc0J5Tm90YXRpb24sXG4gICAgbm90YXRpb25BY2Nlc3NvcnMsXG4gICAgZnJhZ21lbnQsXG4gIH07XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuXG5pbXBvcnQgeyBFcnJvckNvZGUsIFBhbGV0dGVFcnJvciB9IGZyb20gXCIjZXJyb3JcIjtcbmltcG9ydCB7IGNsYXNzaWZ5IH0gZnJvbSBcIiNoZWxwZXJcIjtcbmltcG9ydCB7XG4gIGFwcGx5QXR0cmlidXRlTWFwLFxuICBjaGFuZ2VUYWcsXG4gIGNyZWF0ZUF0dHJpYnV0ZU1hcCxcbiAgc2VyaWFsaXplQXR0cmlidXRlLFxufSBmcm9tIFwiI3V0aWxcIjtcbmltcG9ydCB7IGJ1aWxkVmFsdWVBY2Nlc3NvciB9IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHsgVGVtcGxhdGUsIHR5cGUgVGVtcGxhdGVDb250ZXh0IH0gZnJvbSBcIi4vdGVtcGxhdGVcIjtcbmltcG9ydCB0eXBlIHtcbiAgQXR0cmlidXRlVXBkYXRlSm9iLFxuICBBdHRyaWJ1dGVVcGRhdGVQbGFuLFxuICBDb250ZW50U3dhcEpvYixcbiAgQ29udGVudFN3YXBQbGFuLFxuICBMaXN0UmVuZGVySm9iLFxuICBMaXN0UmVuZGVySm9iSXRlbSxcbiAgTGlzdFJlbmRlclBsYW4sXG4gIFRhZ0NoYW5nZUpvYixcbiAgVGFnQ2hhbmdlUGxhbixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IFNLSVBQRURfSk9CID0gU3ltYm9sKFwibm9vcFwiKTtcbmV4cG9ydCB0eXBlIFNraXBwZWRKb2IgPSB0eXBlb2YgU0tJUFBFRF9KT0I7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gQVRUUklCVVRFIFVQREFURSBKT0JTIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVBdHRyaWJ1dGVKb2IoXG4gIHBsYW46IEF0dHJpYnV0ZVVwZGF0ZVBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBBdHRyaWJ1dGVVcGRhdGVKb2IgfCBTa2lwcGVkSm9iIHtcbiAgY29uc3QgcmF3VmFsdWUgPSB2YWx1ZXMuZ2V0KHBsYW4ubm90YXRpb24uYmFzZSk7XG4gIGxldCB2YWx1ZSA9IHR5cGVvZiByYXdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gcmF3VmFsdWUocGxhbi5ub2RlKSA6IHJhd1ZhbHVlO1xuXG4gIC8vIFBhcnNlIHRoZSB2YWx1ZSB3aXRoIGBjbGFzc2lmeWAgaWYgc2V0dGluZyB0aGUgY2xhc3MgYXR0cmlidXRlXG4gIGlmIChwbGFuLmF0dHJpYnV0ZSA9PT0gXCJjbGFzc1wiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgIHZhbHVlID0gY2xhc3NpZnkodmFsdWUpO1xuICB9XG5cbiAgY29uc3Qgc2VyaWFsaXplZFZhbHVlID0gc2VyaWFsaXplQXR0cmlidXRlKHZhbHVlKTtcbiAgY29uc3QgY3VycmVudCA9IHBsYW4ubm9kZS5nZXRBdHRyaWJ1dGUocGxhbi5hdHRyaWJ1dGUpO1xuXG4gIGlmIChzZXJpYWxpemVkVmFsdWUgIT09IGN1cnJlbnQpIHtcbiAgICByZXR1cm4gW3BsYW4ubm9kZSwgcGxhbi5hdHRyaWJ1dGUsIHNlcmlhbGl6ZWRWYWx1ZV07XG4gIH1cblxuICByZXR1cm4gU0tJUFBFRF9KT0I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5BdHRyaWJ1dGVKb2JzKGpvYnM6IEF0dHJpYnV0ZVVwZGF0ZUpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW25vZGUsIG5hbWUsIHZhbHVlXSBvZiBqb2JzKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gQ09OVEVOVCBTV0FQIEpPQlMgLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlQ29udGVudFN3YXBKb2IoXG4gIHBsYW46IENvbnRlbnRTd2FwUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IENvbnRlbnRTd2FwSm9iIHwgU2tpcHBlZEpvYiB7XG4gIGNvbnN0IHJhd1ZhbHVlID0gdmFsdWVzLmdldChwbGFuLm5vdGF0aW9uLmJhc2UpO1xuICBjb25zdCB2YWx1ZSA9IHR5cGVvZiByYXdWYWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gcmF3VmFsdWUocGxhbi5ub2RlKSA6IHJhd1ZhbHVlO1xuXG4gIC8vIFN0cmluZywgTnVtYmVyLCBCb29sZWFuIC0+IFRleHQgTm9kZVxuICBpZiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiIHx8XG4gICAgdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIlxuICApIHtcbiAgICBjb25zdCBhc1N0ciA9IGAke3ZhbHVlfWA7XG4gICAgaWYgKHBsYW4ubm9kZS50ZXh0Q29udGVudCA9PT0gYXNTdHIpIHtcbiAgICAgIHJldHVybiBTS0lQUEVEX0pPQjtcbiAgICB9XG5cbiAgICByZXR1cm4gW3BsYW4sIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGFzU3RyKV07XG4gIH1cblxuICAvLyBOdWxsaXNoIHZhbHVlcyAtPiBDb21tZW50XG4gIGVsc2UgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocGxhbi5ub2RlIGluc3RhbmNlb2YgQ29tbWVudCkge1xuICAgICAgcmV0dXJuIFNLSVBQRURfSk9CO1xuICAgIH1cblxuICAgIHJldHVybiBbcGxhbiwgZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcImVtcHR5XCIpXTtcbiAgfVxuXG4gIC8vIEhUTUxFbGVtZW50IC0+IFN3YXAgbm9kZXNcbiAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgIGlmIChPYmplY3QuaXMocGxhbi5ub2RlLCB2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBTS0lQUEVEX0pPQjtcbiAgICB9XG5cbiAgICByZXR1cm4gW3BsYW4sIHZhbHVlLmNsb25lTm9kZSh0cnVlKV07XG4gIH1cblxuICAvLyBBbnl0aGluZyBlbHNlIC0+IFVuc3VwcG9ydGVkXG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICBFcnJvckNvZGUuSU5WQUxJRF9DT05URU5ULFxuICAgICAgdHlwZW9mIHZhbHVlLFxuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsdWUpLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNvbnRlbnRTd2FwSm9icyhqb2JzOiBDb250ZW50U3dhcEpvYltdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW3BsYW4sIHJlcGxhY2VdIG9mIGpvYnMpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBwbGFuLm5vZGUucGFyZW50Tm9kZTtcblxuICAgIGlmICghcGFyZW50KSB7XG4gICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIGluIHByYWN0aWNlXG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgIH1cblxuICAgIHBhcmVudC5yZXBsYWNlQ2hpbGQocmVwbGFjZSwgcGxhbi5ub2RlKTtcbiAgICBwbGFuLm5vZGUgPSByZXBsYWNlO1xuICB9XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gVEFHIENIQU5HRSBKT0JTIC8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVUYWdDaGFuZ2VKb2IoXG4gIHBsYW46IFRhZ0NoYW5nZVBsYW4sXG4gIHZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4pOiBUYWdDaGFuZ2VKb2IgfCBTa2lwcGVkSm9iIHtcbiAgY29uc3QgcmF3VmFsdWUgPSB2YWx1ZXMuZ2V0KHBsYW4ubm90YXRpb24uYmFzZSkgPz8gXCJcIjtcbiAgY29uc3QgdmFsdWUgPSB0eXBlb2YgcmF3VmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHJhd1ZhbHVlKHBsYW4ubm9kZSkgOiByYXdWYWx1ZTtcbiAgY29uc3QgbmV4dFRhZyA9IGAke3ZhbHVlfWAudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgY3VycmVudFRhZyA9IHBsYW4ubm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKCFuZXh0VGFnIHx8IG5leHRUYWcgPT09IGN1cnJlbnRUYWcpIHtcbiAgICByZXR1cm4gU0tJUFBFRF9KT0I7XG4gIH1cblxuICByZXR1cm4gW3BsYW4sIG5leHRUYWddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuVGFnQ2hhbmdlSm9icyhqb2JzOiBUYWdDaGFuZ2VKb2JbXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtwbGFuLCBuZXh0VGFnXSBvZiBqb2JzKSB7XG4gICAgcGxhbi5ub2RlID0gY2hhbmdlVGFnKHBsYW4ubm9kZSwgbmV4dFRhZyk7XG4gIH1cbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gTElTVCBSRU5ERVIgSk9CUyAvL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5mdW5jdGlvbiBmZXRjaExpc3REYXRhKFxuICBwbGFuOiBMaXN0UmVuZGVyUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10ge1xuICBjb25zdCBub3RhdGlvblZhbHVlID0gdmFsdWVzLmdldChwbGFuLm5vdGF0aW9uLmJhc2UpO1xuICBjb25zdCBldmFsdWF0ZWRWYWx1ZSA9XG4gICAgdHlwZW9mIG5vdGF0aW9uVmFsdWUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBub3RhdGlvblZhbHVlKHBsYW4uc3RhcnRNYXJrZXIucGFyZW50Tm9kZSlcbiAgICAgIDogbm90YXRpb25WYWx1ZTtcblxuICBpZiAoZXZhbHVhdGVkVmFsdWUgPT09IG51bGwgfHwgZXZhbHVhdGVkVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGV2YWx1YXRlZFZhbHVlKSkge1xuICAgIHJldHVybiBldmFsdWF0ZWRWYWx1ZTtcbiAgfVxuXG4gIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLlRFTVBMQVRFX0lOVkFMSURfTElTVCk7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RIVE1MRWxlbWVudHMoc3RhcnQ6IE5vZGUsIGVuZDogTm9kZSk6IFNldDxIVE1MRWxlbWVudD4ge1xuICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSBzdGFydDtcbiAgY29uc3Qgbm9kZVNldCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG5cbiAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gZW5kKSB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgbm9kZVNldC5hZGQobm9kZSk7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gIH1cblxuICByZXR1cm4gbm9kZVNldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVMaXN0UmVuZGVySm9iKFxuICBwbGFuOiBMaXN0UmVuZGVyUGxhbixcbiAgdmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPixcbik6IExpc3RSZW5kZXJKb2IgfCBTa2lwcGVkSm9iIHtcbiAgLy8gRmV0Y2ggdGhlIGRhdGEgZm9yIHJlbmRlcmluZyB0aGUgdXBkYXRlZCBsaXN0IGl0ZW1zXG4gIGNvbnN0IGxpc3REYXRhID0gZmV0Y2hMaXN0RGF0YShwbGFuLCB2YWx1ZXMpO1xuXG4gIC8vIEVtcHR5IC0+IFJlbW92ZSB0aGUgbGlzdCBjb250ZW50cyBlbnRpcmVseSBhbmQgZXhpdFxuICBpZiAobGlzdERhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtwbGFuLCBbXV07XG4gIH1cblxuICAvLyBDb2xsZWN0IGV4aXN0aW5nIGVsZW1lbnRzIGZyb20gdGhlIERPTSBmb3IgYXNzZXNzbWVudFxuICBjb25zdCB7IHJvd1RlbXBsYXRlc0J5Um9vdCwgcm93VGVtcGxhdGVFbGVtZW50LCByb3dSb290RWxlbWVudCB9ID0gcGxhbjtcbiAgY29uc3Qga2V5QWNjZXNzb3IgPSBidWlsZFZhbHVlQWNjZXNzb3IocGxhbi5rZXlOb3RhdGlvbik7XG4gIGNvbnN0IGxpc3RSZW5kZXJDb250ZXh0czogTWFwPHVua25vd24sIExpc3RSZW5kZXJKb2JJdGVtPiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgbGlzdERhdGEpIHtcbiAgICBjb25zdCBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQgPSB7XG4gICAgICBpdGVtLFxuICAgIH07XG5cbiAgICBjb25zdCBrZXkgPSBrZXlBY2Nlc3Nvcihjb250ZXh0KTtcblxuICAgIGlmIChsaXN0UmVuZGVyQ29udGV4dHMuaGFzKGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoXG4gICAgICAgIEVycm9yQ29kZS5URU1QTEFURV9EVVBMSUNBVEVfTElTVF9LRVksXG4gICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBIVE1MIEVsZW1lbnQgd2UgZXhwZWN0IHRvIHNlZSBoZXJlXG4gICAgbGV0IHJvd1Jvb3QgPSBwbGFuLnJvd1Jvb3RzQnlLZXkuZ2V0KGtleSk7XG5cbiAgICBpZiAocm93Um9vdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByb3dSb290ID0gcm93Um9vdEVsZW1lbnQuY2xvbmVOb2RlKGZhbHNlKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHBsYW4ucm93Um9vdHNCeUtleS5zZXQoa2V5LCByb3dSb290KTtcbiAgICB9XG5cbiAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJvdyByb290XG4gICAgbGV0IHJvd1RlbXBsYXRlID0gcm93VGVtcGxhdGVzQnlSb290LmdldChyb3dSb290KTtcblxuICAgIGlmIChyb3dUZW1wbGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByb3dUZW1wbGF0ZSA9IG5ldyBUZW1wbGF0ZShyb3dUZW1wbGF0ZUVsZW1lbnQpO1xuICAgICAgcm93VGVtcGxhdGVzQnlSb290LnNldChyb3dSb290LCByb3dUZW1wbGF0ZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgam9iSXRlbTogTGlzdFJlbmRlckpvYkl0ZW0gPSB7XG4gICAgICBjb250ZXh0LFxuICAgICAgcm9vdDogcm93Um9vdCxcbiAgICAgIHRlbXBsYXRlOiByb3dUZW1wbGF0ZSxcbiAgICAgIGF0dHJNYXA6IGNyZWF0ZUF0dHJpYnV0ZU1hcChpdGVtKSxcbiAgICB9O1xuXG4gICAgbGlzdFJlbmRlckNvbnRleHRzLnNldChrZXksIGpvYkl0ZW0pO1xuICB9XG5cbiAgLy8gQ2xlYW4gdXAgY2FjaGVkIGRhdGFcbiAgZm9yIChjb25zdCBba2V5LCByb290XSBvZiBwbGFuLnJvd1Jvb3RzQnlLZXkpIHtcbiAgICBpZiAoIWxpc3RSZW5kZXJDb250ZXh0cy5oYXMoa2V5KSkge1xuICAgICAgcGxhbi5yb3dSb290c0J5S2V5LmRlbGV0ZShrZXkpO1xuICAgICAgcGxhbi5yb3dUZW1wbGF0ZXNCeVJvb3QuZGVsZXRlKHJvb3QpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBbcGxhbiwgQXJyYXkuZnJvbShsaXN0UmVuZGVyQ29udGV4dHMudmFsdWVzKCkpXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bkxpc3RSZW5kZXJKb2JzKGpvYnM6IExpc3RSZW5kZXJKb2JbXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtwbGFuLCByZW5kZXJJdGVtc10gb2Ygam9icykge1xuICAgIGNvbnN0IHsgZW5kTWFya2VyLCBsaXN0Q29udGFpbmVyRWxlbWVudCB9ID0gcGxhbjtcblxuICAgIC8vIEZhc3QgcGF0aCBmb3IgZW1wdHkgbGlzdHMgLT4gUmVtb3ZlIGV2ZXJ5dGhpbmcgYW5kIGNvbnRpbnVlXG4gICAgaWYgKHJlbmRlckl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZm9yIChjb25zdCByb290IG9mIHBsYW4ucm93Um9vdHNCeUtleS52YWx1ZXMoKSkge1xuICAgICAgICByb290LnJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgcGxhbi5yb3dSb290c0J5S2V5LmNsZWFyKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHNjYW4gdGhlIGN1cnJlbnQgbm9kZXMgYW5kIG1vZGlmeSBhcyBuZWVkZWRcbiAgICBjb25zdCBleGlzdGluZ0RPTU5vZGVzID0gQXJyYXkuZnJvbShcbiAgICAgIGNvbGxlY3RIVE1MRWxlbWVudHMocGxhbi5zdGFydE1hcmtlciwgcGxhbi5lbmRNYXJrZXIpLFxuICAgICk7XG5cbiAgICBjb25zdCByb290c1RvS2VlcCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG5cbiAgICBsZXQgZXhpc3RpbmdET01Ob2RlSWR4ID0gMDtcblxuICAgIGZvciAoY29uc3QgcmVuZGVySXRlbSBvZiByZW5kZXJJdGVtcykge1xuICAgICAgY29uc3QgeyByb290LCBhdHRyTWFwLCBjb250ZXh0LCB0ZW1wbGF0ZSB9ID0gcmVuZGVySXRlbTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRE9NTm9kZSA9IGV4aXN0aW5nRE9NTm9kZXNbZXhpc3RpbmdET01Ob2RlSWR4XTtcblxuICAgICAgLy8gU3ByZWFkIGl0ZW0gYXMgYXR0cmlidXRlcyBvbiB0aGUgcm9vdCBhbmQgdXBkYXRlIHRoZSB0ZW1wbGF0ZVxuICAgICAgYXBwbHlBdHRyaWJ1dGVNYXAocm9vdCwgYXR0ck1hcCk7XG4gICAgICB0ZW1wbGF0ZS5yZW5kZXIocm9vdCwgY29udGV4dCk7XG5cbiAgICAgIHJvb3RzVG9LZWVwLmFkZChyb290KTtcblxuICAgICAgLy8gTm9kZSBpcyB0aGUgZXhpc3RpbmcgRE9NIE5vZGUsIGNvbnRpbnVlXG4gICAgICBpZiAoT2JqZWN0LmlzKGV4aXN0aW5nRE9NTm9kZSwgcm9vdCkpIHtcbiAgICAgICAgZXhpc3RpbmdET01Ob2RlSWR4ICs9IDE7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBObyBleGlzdGluZyBub2RlIC0+IGFwcGVuZCBpdGVtXG4gICAgICBpZiAoIWV4aXN0aW5nRE9NTm9kZSkge1xuICAgICAgICBsaXN0Q29udGFpbmVyRWxlbWVudC5pbnNlcnRCZWZvcmUocm9vdCwgZW5kTWFya2VyKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIERPTSBub2RlIGV4aXN0cyBidXQgaXNuJ3QgdGhlIG9uZSB3ZSdyZSBsb29raW5nIGZvci4gSW5zZXJ0IGJlZm9yZS5cbiAgICAgIGxpc3RDb250YWluZXJFbGVtZW50Lmluc2VydEJlZm9yZShyb290LCBleGlzdGluZ0RPTU5vZGUpO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG9sZCBlbGVtZW50c1xuICAgIGZvciAoY29uc3Qgcm9vdCBvZiBleGlzdGluZ0RPTU5vZGVzKSB7XG4gICAgICBpZiAoIXJvb3RzVG9LZWVwLmhhcyhyb290KSkge1xuICAgICAgICByb290LnJlbW92ZSgpO1xuICAgICAgICBwbGFuLnJvd1RlbXBsYXRlc0J5Um9vdC5kZWxldGUocm9vdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBmcmFnbWVudENhY2hlLCBodG1sVG9GcmFnbWVudCB9IGZyb20gXCIuLi91dGlsL2ZyYWdtZW50c1wiO1xuaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tIFwiLi4vdXRpbC9scnUtY2FjaGVcIjtcbmltcG9ydCB7IGNvbXBpbGVUZW1wbGF0ZSwgcHJlcGFyZUNvbXBpbGVkVGVtcGxhdGUgfSBmcm9tIFwiLi9idWlsZFwiO1xuaW1wb3J0IHtcbiAgcHJlcGFyZUF0dHJpYnV0ZUpvYixcbiAgcHJlcGFyZUNvbnRlbnRTd2FwSm9iLFxuICBwcmVwYXJlTGlzdFJlbmRlckpvYixcbiAgcHJlcGFyZVRhZ0NoYW5nZUpvYixcbiAgcnVuQXR0cmlidXRlSm9icyxcbiAgcnVuQ29udGVudFN3YXBKb2JzLFxuICBydW5MaXN0UmVuZGVySm9icyxcbiAgcnVuVGFnQ2hhbmdlSm9icyxcbiAgU0tJUFBFRF9KT0IsXG59IGZyb20gXCIuL2pvYnNcIjtcbmltcG9ydCB0eXBlIHsgTm90YXRpb25BY2Nlc3NvciB9IGZyb20gXCIuL3N5bnRheFwiO1xuaW1wb3J0IHR5cGUge1xuICBBbnlSZW5kZXJQbGFuLFxuICBBdHRyaWJ1dGVVcGRhdGVKb2IsXG4gIENvbXBpbGVkVGVtcGxhdGUsXG4gIENvbnRlbnRTd2FwSm9iLFxuICBMaXN0UmVuZGVySm9iLFxuICBUYWdDaGFuZ2VKb2IsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIFRlbXBsYXRlUm9vdCA9IEhUTUxFbGVtZW50IHwgU2hhZG93Um9vdDtcbmV4cG9ydCB0eXBlIFRlbXBsYXRlQ29udGV4dCA9IHtcbiAgYXR0cj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+O1xuICBzdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGl0ZW0/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaW5kZXg/OiBudW1iZXI7XG59O1xuXG5jb25zdCBjb21waWxlQ2FjaGUgPSBuZXcgTFJVQ2FjaGU8SFRNTFRlbXBsYXRlRWxlbWVudCwgQ29tcGlsZWRUZW1wbGF0ZT4oKTtcblxuaWYgKF9fREVWX18gJiYgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAod2luZG93IGFzIGFueSkuX19QQUxFVFRFX0RFVlRPT0xTX18gPSB7XG4gICAgZHVtcENhY2hlTWV0cmljczogKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coXCJDb21waWxlZCBUZW1wbGF0ZXMgQ2FjaGVcIiwgY29tcGlsZUNhY2hlLm1ldHJpY3MpO1xuICAgICAgY29uc29sZS5sb2coXCJIVE1MIEZyYWdtZW50cyBDYWNoZVwiLCBmcmFnbWVudENhY2hlLm1ldHJpY3MpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQSByZW5kZXJhYmxlIHRlbXBsYXRlIGZyb20gYW4gSFRNTFRlbXBsYXRlRWxlbWVudFxuICpcbiAqIExldmVyYWdlcyBhIHNpbXBsZSBzeW50YXggdG8gcHJvdmlkZSBhY2Nlc3NvcnMgdG8gdGVtcGxhdGUgZGF0YSBmcm9tIG9uZSBvZlxuICogZm91ciBjYXRlZ29yaWVzLCBiYXNlZCBvbiB1c2UgY2FzZTpcbiAqXG4gKiBgYGBcbiAqIGBAYCAtPiBUaGUgYGF0dHJgIG5hbWVzcGFjZSAodGhlIGhvc3QgZWxlbWVudCdzIGF0dHJpYnV0ZXMpXG4gKiBgJGAgLT4gVGhlIGBzdGF0ZWAgbmFtZXNwYWNlICh0aGUgaG9zdCBlbGVtZW50J3MgcmVhY3RpdmUgc3RhdGUpXG4gKiBgKmAgLT4gVGhlIGBkYXRhYCBuYW1lc3BhY2UgKHRoZSBob3N0IGVsZW1lbnQncyBjb21wdXRlZCBkYXRhKVxuICogYCNgIC0+IFRoZSBgaXRlbWAgbmFtZXNwYWNlIChsaXN0IGl0ZW0gYWNjZXNzIHdpdGggOjplYWNoKVxuICogYGBgXG4gKlxuICogQmluZCBhdHRyaWJ1dGVzIHRvIGEgdmFsdWUgdXNpbmcgdGhlIGA6YXR0cmlidXRlYCBzeW50YXg6XG4gKlxuICogYGBgaHRtbFxuICogPGRpdiA6aWQ9XCIkaWRcIiA6Y2xhc3M9XCJAY2xhc3NuYW1lXCI+PC9kaXY+XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlIHtcbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgcmVsYXRlZCB0byB0aGUgZ2xvYmFsIFRlbXBsYXRlIGJ1aWxkIGNhY2hlLlxuICAgKlxuICAgKiBUaGlzIGlzIG5vdCBzb21ldGhpbmcgdHlwaWNhbGx5IG5lZWRlZCBmb3IgZ2VuZXJhbCBhcHAgZGV2ZWxvcG1lbnQsIGJ1dFxuICAgKiBhbGxvd3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gdG8gdHVuZSB0aGUgY2FjaGluZyBzeXN0ZW0gaWYgbmVlZCBiZS5cbiAgICpcbiAgICogQ2FjaGUgc2l6ZXMgZGVmYXVsdCB0byA1MDAgSFRNTCBUZW1wbGF0ZSBGcmFnbWVudHMgYW5kIGNvbXBpbGVkIFBhbGV0dGVcbiAgICogdGVtcGxhdGVzIChpbmNsdWRlcyBuZXN0ZWQgdGVtcGxhdGVzIGxpa2UgbGlzdHMpIHRvIGNvdmVyIG1vc3QgYXBwbGljYXRpb25cbiAgICogbmVlZHMgd2l0aG91dCB1c2luZyBtdWNoIG1lbW9yeS5cbiAgICovXG4gIHN0YXRpYyBjYWNoZSA9IHtcbiAgICAvKipcbiAgICAgKiBXaXBlIGFsbCBjYWNoZWQgdGVtcGxhdGVzIGFuZCBIVE1MIGZyYWdtZW50c1xuICAgICAqL1xuICAgIGNsZWFyOiAoKTogdm9pZCA9PiB7XG4gICAgICBmcmFnbWVudENhY2hlLmNsZWFyKCk7XG4gICAgICBjb21waWxlQ2FjaGUuY2xlYXIoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogdGhlIGRlZmF1bHQgY2FjaGUgY2FwYWNpdHkgb2YgNTAwIGl0ZW1zIHBlciBjYWNoZVxuICAgICAqXG4gICAgICogR2VuZXJhbCBjYWNoaW5nIGd1aWRhbmNlOlxuICAgICAqIC0gOTUlIG9mIHRoZSB0aW1lLCA1MDAgd29ya3MgZmluZVxuICAgICAqIC0gRm9yIHZlcnkgbGFyZ2UgYXBwbGljYXRpb25zLCB1cCB0byAxMDAwIGlzIHJlYXNvbmFibGVcbiAgICAgKiAtIEZvciBzbWFsbGVyIGFwcHMsIGRyb3BwaW5nIGRvd24gdG8gMTAwIC0gMjUwIG1heSBzYXZlIG1lbW9yeVxuICAgICAqXG4gICAgICogVWx0aW1hdGVseSB0aGUgaW1wYWN0IHdpbGwgYmUgbWluaW1hbCB1bmxlc3MgeW91ciBhcHAgaGFzIHZlcnkgc3BlY2lmaWNcbiAgICAgKiByZW5kZXJpbmcgbmVlZHMuXG4gICAgICovXG4gICAgc2V0Q2FwYWNpdHk6IChtYXhTaXplOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIGZyYWdtZW50Q2FjaGUuc2V0Q2FwYWNpdHkobWF4U2l6ZSk7XG4gICAgICBjb21waWxlQ2FjaGUuc2V0Q2FwYWNpdHkobWF4U2l6ZSk7XG4gICAgfSxcbiAgfTtcblxuICBwcml2YXRlIF9jb21waWxlZDogQ29tcGlsZWRUZW1wbGF0ZTtcblxuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIHtAbGluayBIVE1MVGVtcGxhdGVFbGVtZW50fSB1c2VkIHRvIGNyZWF0ZSB0aGlzIFRlbXBsYXRlLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBNYWtlIHN1cmUgdG8gbmV2ZXIgb3BlcmF0ZSBkaXJlY3RseSBvbiB0aGlzIGVsZW1lbnQuIEFsd2F5cyBjbG9uZS5cbiAgICovXG4gIHByaXZhdGUgX3RlbXBsYXRlRWxlbWVudD86IEhUTUxUZW1wbGF0ZUVsZW1lbnQ7XG5cbiAgLyoqIFRoZSBjdXJyZW50IGtub3duIHJvb3QgZWxlbWVudCB0aGF0IHRoaXMgVGVtcGxhdGUgaXMgcmVuZGVyZWQgaW50byAqL1xuICBwcml2YXRlIF9tb3VudGVkUm9vdD86IFRlbXBsYXRlUm9vdDtcblxuICAvKiogVGhlIG1vc3QgcmVjZW50IHNldCB2YWx1ZSBmb3IgZWFjaCBub3RhdGlvbiB0aGF0IGhhcyByZW5kZXJlZCAqL1xuICBwcml2YXRlIF9sYXRlc3RSZW5kZXJlZFZhbHVlczogTWFwPHN0cmluZywgdW5rbm93bj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqIFRoZSBhY3RpdmUgSFRNTEVsZW1lbnQgd2hpY2ggdGhlIHRlbXBsYXRlIGlzIHVwZGF0aW5nIG9uIHJlbmRlcnMgKi9cbiAgcHJpdmF0ZSBfZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQ7XG5cbiAgLyoqIFZhbHVlIE5vdGF0aW9ucyAtPiBTZXQ8UmVuZGVyIFBsYW5zPiAqL1xuICBwcml2YXRlIF9wbGFuc0J5Tm90YXRpb246IE1hcDxzdHJpbmcsIFNldDxBbnlSZW5kZXJQbGFuPj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqIFZhbHVlIE5vdGF0aW9ucyAtPiBBY2Nlc3NvciBmdW5jdGlvbnMgKi9cbiAgcHJpdmF0ZSBfbm90YXRpb25BY2Nlc3NvcnM6IE1hcDxzdHJpbmcsIE5vdGF0aW9uQWNjZXNzb3I+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlOiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7XG4gICAgaWYgKHRlbXBsYXRlIGluc3RhbmNlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgdGhpcy5fdGVtcGxhdGVFbGVtZW50ID0gdGVtcGxhdGU7XG4gICAgICBjb25zdCBjYWNoZWQgPSBjb21waWxlQ2FjaGUuZ2V0KHRlbXBsYXRlKTtcbiAgICAgIGNvbnN0IGNvbXBpbGVkID0gY2FjaGVkID8/IGNvbXBpbGVUZW1wbGF0ZSh0ZW1wbGF0ZSk7XG4gICAgICB0aGlzLl9jb21waWxlZCA9IGNvbXBpbGVkO1xuXG4gICAgICAvLyBBbHdheXMgc2V0IHRoZSBjb21waWxlZCB0ZW1wbGF0ZSB0byBtb3ZlIGl0IHRvIHRoZSBmcm9udCBvZiB0aGUgY2FjaGVcbiAgICAgIGNvbXBpbGVDYWNoZS5zZXQodGVtcGxhdGUsIGNvbXBpbGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY29tcGlsZWQgPSB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIGEgZnJhZ21lbnQgZnJvbSB0aGUgY29tcGlsZWQgSFRNTCAoY2FjaGVkKVxuICAgIGNvbnN0IGZyYWdtZW50ID0gaHRtbFRvRnJhZ21lbnQodGhpcy5fY29tcGlsZWQuaHRtbCk7XG4gICAgY29uc3QgaHlkcmF0ZWQgPSBwcmVwYXJlQ29tcGlsZWRUZW1wbGF0ZSh0aGlzLl9jb21waWxlZCwgZnJhZ21lbnQpO1xuXG4gICAgdGhpcy5fcGxhbnNCeU5vdGF0aW9uID0gaHlkcmF0ZWQucGxhbnNCeU5vdGF0aW9uO1xuICAgIHRoaXMuX25vdGF0aW9uQWNjZXNzb3JzID0gaHlkcmF0ZWQubm90YXRpb25BY2Nlc3NvcnM7XG4gICAgdGhpcy5fZnJhZ21lbnQgPSBoeWRyYXRlZC5mcmFnbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBmdWxsIGNvcHkgb2YgdGhpcyB0ZW1wbGF0ZSBmb3IgdXNlIGluIHJlbmRlcmluZyB0byBhbm90aGVyIHJvb3RcbiAgICovXG4gIGNsb25lID0gKCk6IFRlbXBsYXRlID0+IHtcbiAgICByZXR1cm4gbmV3IFRlbXBsYXRlKHRoaXMuZWxlbWVudCgpKTtcbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybnMgQW4ge0BsaW5rIEhUTUxUZW1wbGF0ZUVsZW1lbnR9IHJlcHJlc2VudGluZyB0aGlzIHRlbXBsYXRlXG4gICAqL1xuICBlbGVtZW50ID0gKCk6IEhUTUxUZW1wbGF0ZUVsZW1lbnQgPT4ge1xuICAgIGlmICh0aGlzLl90ZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gdGhpcy5fY29tcGlsZWQuaHRtbDtcbiAgICByZXR1cm4gdGVtcGxhdGU7XG4gIH07XG5cbiAgcHJpdmF0ZSBfY29sbGVjdFVwZGF0ZWRWYWx1ZXMgPSAoXG4gICAgY29udGV4dDogVGVtcGxhdGVDb250ZXh0LFxuICApOiBNYXA8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgY29uc3QgdXBkYXRlZFZhbHVlcyA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuXG4gICAgZm9yIChjb25zdCBbcmF3Tm90YXRpb24sIGFjY2Vzc29yXSBvZiB0aGlzLl9ub3RhdGlvbkFjY2Vzc29ycykge1xuICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuX2xhdGVzdFJlbmRlcmVkVmFsdWVzLmdldChyYXdOb3RhdGlvbik7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IGFjY2Vzc29yKGNvbnRleHQpO1xuXG4gICAgICBpZiAocHJldmlvdXNWYWx1ZSAhPT0gbmV3VmFsdWUgJiYgIU9iamVjdC5pcyhwcmV2aW91c1ZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgICAgdXBkYXRlZFZhbHVlcy5zZXQocmF3Tm90YXRpb24sIG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZFZhbHVlcztcbiAgfTtcblxuICBwcml2YXRlIF91cGRhdGUobmV3VmFsdWVzOiBNYXA8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGNvbnN0IHNjaGVkdWxlZFBsYW5zOiBTZXQ8QW55UmVuZGVyUGxhbj4gPSBuZXcgU2V0KCk7XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVKb2JzOiBBdHRyaWJ1dGVVcGRhdGVKb2JbXSA9IFtdO1xuICAgIGNvbnN0IGNvbnRlbnRTd2FwSm9iczogQ29udGVudFN3YXBKb2JbXSA9IFtdO1xuICAgIGNvbnN0IHRhZ0NoYW5nZUpvYnM6IFRhZ0NoYW5nZUpvYltdID0gW107XG4gICAgY29uc3QgbGlzdFJlbmRlckpvYnM6IExpc3RSZW5kZXJKb2JbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbbm90YXRpb25dIG9mIG5ld1ZhbHVlcykge1xuICAgICAgY29uc3QgYWZmZWN0ZWRQbGFucyA9IHRoaXMuX3BsYW5zQnlOb3RhdGlvbi5nZXQobm90YXRpb24pO1xuXG4gICAgICBpZiAoYWZmZWN0ZWRQbGFucykge1xuICAgICAgICBmb3IgKGNvbnN0IHBsYW4gb2YgYWZmZWN0ZWRQbGFucykge1xuICAgICAgICAgIGlmIChzY2hlZHVsZWRQbGFucy5oYXMocGxhbikpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjaGVkdWxlZFBsYW5zLmFkZChwbGFuKTtcblxuICAgICAgICAgIHN3aXRjaCAocGxhbi50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwiYXR0clwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGpvYiA9IHByZXBhcmVBdHRyaWJ1dGVKb2IocGxhbiwgbmV3VmFsdWVzKTtcbiAgICAgICAgICAgICAgaWYgKGpvYiAhPT0gU0tJUFBFRF9KT0IpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVKb2JzLnB1c2goam9iKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJlYWNoXCI6IHtcbiAgICAgICAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZUxpc3RSZW5kZXJKb2IocGxhbiwgbmV3VmFsdWVzKTtcbiAgICAgICAgICAgICAgaWYgKGpvYiAhPT0gU0tJUFBFRF9KT0IpIHtcbiAgICAgICAgICAgICAgICBsaXN0UmVuZGVySm9icy5wdXNoKGpvYik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwic3dhcFwiOiB7XG4gICAgICAgICAgICAgIGNvbnN0IGpvYiA9IHByZXBhcmVDb250ZW50U3dhcEpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRTd2FwSm9icy5wdXNoKGpvYik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwidGFnXCI6IHtcbiAgICAgICAgICAgICAgY29uc3Qgam9iID0gcHJlcGFyZVRhZ0NoYW5nZUpvYihwbGFuLCBuZXdWYWx1ZXMpO1xuICAgICAgICAgICAgICBpZiAoam9iICE9PSBTS0lQUEVEX0pPQikge1xuICAgICAgICAgICAgICAgIHRhZ0NoYW5nZUpvYnMucHVzaChqb2IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgLy8gU2hvdWxkIGJlIGltcG9zc2libGUgZ2l2ZW4gYW4gZXhoYXVzdGl2ZSBzd2l0Y2ggY2FzZVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5JTlZBUklBTlQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJ1bkF0dHJpYnV0ZUpvYnMoYXR0cmlidXRlSm9icyk7XG4gICAgcnVuTGlzdFJlbmRlckpvYnMobGlzdFJlbmRlckpvYnMpO1xuICAgIHJ1bkNvbnRlbnRTd2FwSm9icyhjb250ZW50U3dhcEpvYnMpO1xuICAgIHJ1blRhZ0NoYW5nZUpvYnModGFnQ2hhbmdlSm9icyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoaXMgdGVtcGxhdGUgaW50byBhIHRhcmdldCBob3N0IGVsZW1lbnQuXG4gICAqL1xuICByZW5kZXIgPSAocm9vdDogVGVtcGxhdGVSb290LCBjb250ZXh0OiBUZW1wbGF0ZUNvbnRleHQpOiB2b2lkID0+IHtcbiAgICBpZiAocm9vdCAhPT0gdGhpcy5fbW91bnRlZFJvb3QpIHtcbiAgICAgIHRoaXMuX21vdW50ZWRSb290ID0gcm9vdDtcbiAgICAgIHdoaWxlIChyb290LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgcm9vdC5yZW1vdmVDaGlsZChyb290LmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuXG4gICAgICByb290LmFwcGVuZCh0aGlzLl9mcmFnbWVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRWYWx1ZXMgPSB0aGlzLl9jb2xsZWN0VXBkYXRlZFZhbHVlcyhjb250ZXh0KTtcblxuICAgIGlmIChyZXNvbHZlZFZhbHVlcy5zaXplICE9PSAwKSB7XG4gICAgICB0aGlzLl91cGRhdGUocmVzb2x2ZWRWYWx1ZXMpO1xuXG4gICAgICAvLyBTYXZlIHRoZSB2YWx1ZXMgdGhhdCB3ZXJlIHVzZWQgZm9yIHRoaXMgcmVuZGVyIGlmIHRoZSByZW5kZXIgc3VjY2VlZGVkXG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgcmVzb2x2ZWRWYWx1ZXMpIHtcbiAgICAgICAgdGhpcy5fbGF0ZXN0UmVuZGVyZWRWYWx1ZXMuc2V0KGtleSwgdmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iLAogICAgIi8qXG4gKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cHM6Ly9tb3ppbGxhLm9yZy9NUEwvMi4wLy5cbiAqL1xuaW1wb3J0IHsgZWxlbWVudE1hdGNoZXMgfSBmcm9tIFwiI3V0aWxcIjtcbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50XCI7XG5cbmV4cG9ydCB0eXBlIEV2ZW50TmFtZSA9IGtleW9mIEdsb2JhbEV2ZW50SGFuZGxlcnNFdmVudE1hcDtcbmV4cG9ydCB0eXBlIEV2ZW50SGFuZGxlcjxLIGV4dGVuZHMgRXZlbnROYW1lID0gRXZlbnROYW1lPiA9IChcbiAgZXZlbnQ6IEdsb2JhbEV2ZW50SGFuZGxlcnNFdmVudE1hcFtLXSxcbikgPT4gdm9pZDtcblxudHlwZSBFdmVudEhhbmRsZXJNYXAgPSBNYXA8c3RyaW5nLCBFdmVudEhhbmRsZXI+O1xuXG4vKipcbiAqIE1hbmFnZWQgZXZlbnQgZGVsZWdhdGlvbiB0byBjb2FsZXNjZSBldmVudCBsaXN0ZW5lcnMgZm9yIGFuIGVudGlyZSB0cmVlIGludG9cbiAqIHNpbmdsZSByb290LWxldmVsIGxpc3RlbmVycy5cbiAqXG4gKiBAZXhhbXBsZVxuICogTGlzdGVuIGZvciBldmVudHMgZnJvbSBhbnkgY2hpbGQgZWxlbWVudCBvZiB0aGUgZGVsZWdhdGVkIHJvb3RcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkZWxlZ2F0b3IgPSBuZXcgRXZlbnREZWxlZ2F0b3IoJHJvb3QpO1xuICogZGVsZWdhdG9yLmFkZERlbGVnYXRlZExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQ2xpY2spO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIExpc3RlbiBmb3IgZXZlbnRzIGZyb20gY2hpbGQgZWxlbWVudHMgbWF0Y2hpbmcgYC5hY3Rpb25gXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZGVsZWdhdG9yID0gbmV3IEV2ZW50RGVsZWdhdG9yKCRyb290KTtcbiAqIGRlbGVnYXRvci5hZGREZWxlZ2F0ZWRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrLCBcIi5hY3Rpb25cIik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50RGVsZWdhdG9yIHtcbiAgc3RhdGljIG5leHRMaXN0ZW5lcklkID0gMDtcblxuICBzdGF0aWMgcHJvY2Vzc1RhcmdldERlc2NyaXB0b3IoXG4gICAgdGFyZ2V0RGVzY3JpcHRvcjogc3RyaW5nIHwgdHlwZW9mIENvbXBvbmVudDxhbnk+IHwgSFRNTEVsZW1lbnQsXG4gICk6IHN0cmluZyB7XG4gICAgLy8gQ3JlYXRlIGEgcXVlcnkgZmlsdGVyIGZyb20gdGhlIHRhcmdldCBkZXNjcmlwdG9yXG4gICAgaWYgKHRhcmdldERlc2NyaXB0b3IgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaGFzIGFuIElELCB1c2UgdGhhdFxuICAgICAgaWYgKHRhcmdldERlc2NyaXB0b3IuaWQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBgIyR7dGFyZ2V0RGVzY3JpcHRvci5pZH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkSWQgPSBgbGlzdGVuLSR7RXZlbnREZWxlZ2F0b3IubmV4dExpc3RlbmVySWQrK31gO1xuICAgICAgICB0YXJnZXREZXNjcmlwdG9yLnNldEF0dHJpYnV0ZShcImRhdGEtbGlzdGVuZXItaWRcIiwgZ2VuZXJhdGVkSWQpO1xuICAgICAgICByZXR1cm4gYFtkYXRhLWxpc3RlbmVyLWlkPVwiJHtnZW5lcmF0ZWRJZH1cIl1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhcmdldERlc2NyaXB0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgaWYgKHRhcmdldERlc2NyaXB0b3IudGFnTmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgW0NvbXBvbmVudF0gQXV0b21hdGljIGxpc3RlbmVyIHNldHVwIGZhaWx1cmU6IENvbXBvbmVudCAke3RhcmdldERlc2NyaXB0b3IubmFtZX0gaGFzIG5vIGRlZmluZWQgdGFnbmFtZWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgdGFyZ2V0IGRlc2NyaXB0b3IgaXMgYSBDb21wb25lbnQgY2xhc3MsIHB1bGwgdGhlIHRhZ25hbWVcbiAgICAgIHJldHVybiB0YXJnZXREZXNjcmlwdG9yLnRhZ05hbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldERlc2NyaXB0b3I7XG4gIH1cblxuICBwcml2YXRlIF9yb290OiBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3QgfCBEb2N1bWVudDtcbiAgcHJpdmF0ZSBfcm9vdExpc3RlbmVyczogRXZlbnRIYW5kbGVyTWFwID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9ldmVudHM6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFNldDxFdmVudEhhbmRsZXI+Pj4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3Iocm9vdDogSFRNTEVsZW1lbnQgfCBTaGFkb3dSb290IHwgRG9jdW1lbnQgPSBkb2N1bWVudCkge1xuICAgIHRoaXMuX3Jvb3QgPSByb290O1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlcnNGb3JFdmVudChldmVudDogc3RyaW5nKTogTWFwPHN0cmluZywgU2V0PEV2ZW50SGFuZGxlcj4+IHtcbiAgICBsZXQgaGFuZGxlck1hcCA9IHRoaXMuX2V2ZW50cy5nZXQoZXZlbnQpO1xuXG4gICAgaWYgKGhhbmRsZXJNYXAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFuZGxlck1hcCA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMuX2V2ZW50cy5zZXQoZXZlbnQsIGhhbmRsZXJNYXApO1xuICAgIH1cblxuICAgIHJldHVybiBoYW5kbGVyTWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlcnNGb3JFdmVudEFuZFF1ZXJ5PEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIGV2ZW50OiBFLFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICk6IFNldDxFdmVudEhhbmRsZXI8RT4+IHtcbiAgICBjb25zdCBoYW5kbGVyTWFwID0gdGhpcy5faGFuZGxlcnNGb3JFdmVudChldmVudCk7XG4gICAgbGV0IGhhbmRsZXJTZXQgPSBoYW5kbGVyTWFwLmdldChxdWVyeSk7XG5cbiAgICBpZiAoaGFuZGxlclNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYW5kbGVyU2V0ID0gbmV3IFNldCgpO1xuICAgICAgaGFuZGxlck1hcC5zZXQocXVlcnksIGhhbmRsZXJTZXQpO1xuICAgIH1cblxuICAgIHJldHVybiBoYW5kbGVyU2V0O1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlUm9vdExpc3RlbmVyKGV2ZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3Jvb3RMaXN0ZW5lcnMuaGFzKGV2ZW50TmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0ZW5lciA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZXJzRm9yRXZlbnQgPSB0aGlzLl9oYW5kbGVyc0ZvckV2ZW50KGV2ZW50TmFtZSk7XG4gICAgICBjb25zdCB7IHRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgIGlmICh0YXJnZXQgPT09IG51bGwgfHwgISh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBub2RlOiBOb2RlIHwgbnVsbCA9IHRhcmdldDtcblxuICAgICAgbGV0IHN0b3BJbW1lZGlhdGVDYWxsZWQgPSBmYWxzZTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRm4gPSBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb247XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gPSAoKSA9PiB7XG4gICAgICAgIG9yaWdpbmFsRm4uY2FsbChldmVudCk7XG4gICAgICAgIHN0b3BJbW1lZGlhdGVDYWxsZWQgPSB0cnVlO1xuICAgICAgfTtcblxuICAgICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IHRoaXMuX3Jvb3QpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgaW52YWxpZCBlbGVtZW50c1xuICAgICAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHtcbiAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW52b2tlIGhhbmRsZXJzXG4gICAgICAgIGZvciAoY29uc3QgW3F1ZXJ5LCBoYW5kbGVyc10gb2YgaGFuZGxlcnNGb3JFdmVudCkge1xuICAgICAgICAgIGlmIChxdWVyeSA9PT0gXCIqXCIgfHwgZWxlbWVudE1hdGNoZXMobm9kZSwgcXVlcnkpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKG5vZGUsIGV2ZW50KTtcblxuICAgICAgICAgICAgICAvLyBSZXNwZWN0IC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSBhbmQgLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgaWYgKHN0b3BJbW1lZGlhdGVDYWxsZWQgfHwgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc3BlY3QgLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgIGlmIChldmVudC5jYW5jZWxCdWJibGUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLl9yb290IHx8IG5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5fcm9vdExpc3RlbmVycy5zZXQoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgdGhpcy5fcm9vdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgYWRkTGlzdGVuZXI8RSBleHRlbmRzIEV2ZW50TmFtZT4oXG4gICAgZXZlbnROYW1lOiBFLFxuICAgIGhhbmRsZXI6IEV2ZW50SGFuZGxlcjxFPixcbiAgICBxdWVyeUZpbHRlcjogc3RyaW5nID0gXCIqXCIsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2hhbmRsZXJzRm9yRXZlbnRBbmRRdWVyeShldmVudE5hbWUsIHF1ZXJ5RmlsdGVyKS5hZGQoaGFuZGxlcik7XG4gICAgdGhpcy5fY3JlYXRlUm9vdExpc3RlbmVyKGV2ZW50TmFtZSk7XG4gIH1cblxuICByZW1vdmVMaXN0ZW5lcihcbiAgICBldmVudE5hbWU6IEV2ZW50TmFtZSxcbiAgICBoYW5kbGVyOiBFdmVudEhhbmRsZXIsXG4gICAgcXVlcnlGaWx0ZXI6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaGFuZGxlclNldCA9IHRoaXMuX2hhbmRsZXJzRm9yRXZlbnRBbmRRdWVyeShldmVudE5hbWUsIHF1ZXJ5RmlsdGVyKTtcbiAgICBoYW5kbGVyU2V0LmRlbGV0ZShoYW5kbGVyKTtcblxuICAgIC8vIElmIHRoYXQgd2FzIHRoZSBsYXN0IGhhbmRsZXIgZm9yIHRoYXQgZXZlbnQvcXVlcnkgY29tYm8sIGRlbGV0ZSB0aGUgc2V0XG4gICAgaWYgKGhhbmRsZXJTZXQuc2l6ZSA9PT0gMCkge1xuICAgICAgY29uc3QgZXZlbnRIYW5kbGVyU2V0cyA9IHRoaXMuX2hhbmRsZXJzRm9yRXZlbnQoZXZlbnROYW1lKTtcbiAgICAgIGV2ZW50SGFuZGxlclNldHMuZGVsZXRlKHF1ZXJ5RmlsdGVyKTtcbiAgICB9XG4gIH1cblxuICBjbGVhbnVwID0gKCk6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3QgW2V2ZW50LCBoYW5kbGVyXSBvZiB0aGlzLl9yb290TGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9yb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGhhbmRsZXIpO1xuICAgIH1cblxuICAgIHRoaXMuX3Jvb3RMaXN0ZW5lcnMuY2xlYXIoKTtcbiAgfTtcbn1cbiIsCiAgICAiLypcbiAqIENvcHlyaWdodCDCqSBSdXN0aWMgQXJjYWRlLCBMTEMgMjAyNlxuICogVGhpcyBTb3VyY2UgQ29kZSBGb3JtIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoZSBNb3ppbGxhIFB1YmxpY1xuICogTGljZW5zZSwgdi4gMi4wLiBJZiBhIGNvcHkgb2YgdGhlIE1QTCB3YXMgbm90IGRpc3RyaWJ1dGVkIHdpdGggdGhpc1xuICogZmlsZSwgWW91IGNhbiBvYnRhaW4gb25lIGF0IGh0dHBzOi8vbW96aWxsYS5vcmcvTVBMLzIuMC8uXG4gKi9cblxuaW1wb3J0IHsgRXJyb3JDb2RlLCBQYWxldHRlRXJyb3IgfSBmcm9tIFwiI2Vycm9yXCI7XG5pbXBvcnQgeyBjc3MgfSBmcm9tIFwiI2hlbHBlclwiO1xuaW1wb3J0IHsgU3RhdGUgfSBmcm9tIFwiI3N0YXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSwgdHlwZSBUZW1wbGF0ZUNvbnRleHQgfSBmcm9tIFwiI3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBjcmVhdGVBdHRyaWJ1dGVNYXAsIHNlcmlhbGl6ZUF0dHJpYnV0ZSB9IGZyb20gXCIjdXRpbFwiO1xuaW1wb3J0IHsgRXZlbnREZWxlZ2F0b3IsIHR5cGUgRXZlbnRIYW5kbGVyLCB0eXBlIEV2ZW50TmFtZSB9IGZyb20gXCIuL2RlbGVnYXRvclwiO1xuaW1wb3J0IHR5cGUge1xuICBBdHRyaWJ1dGVNYXAsXG4gIENvbXBvbmVudFN0eWxlcyxcbiAgQ29tcHV0ZWRQcm9wZXJ0aWVzLFxuICBMaXZlQXR0cmlidXRlcyxcbiAgU3RhdGVJbml0aWFsaXplcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgTUFYX1NFUVVFTlRJQUxfUkVOREVSUyA9IDEwMDtcbmNvbnN0IEJMQU5LX1RFTVBMQVRFID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuXG50eXBlIEludGVybmFsUmVuZGVyU3RhdHVzID0ge1xuICB3aWxsUmVuZGVyOiBib29sZWFuO1xuICBpc1JlbmRlcmluZzogYm9vbGVhbjtcbiAgc2VxdWVudGlhbFJlbmRlcnM6IG51bWJlcjtcbiAgcG9zdFJlbmRlckNhbGxiYWNrczogU2V0PFZvaWRGdW5jdGlvbj47XG4gIGxhc3RSZW5kZXJlZEF0dHJpYnV0ZU1hcDogQXR0cmlidXRlTWFwO1xuICB0cmFja2VkQXR0cmlidXRlQ2hhbmdlczogQXR0cmlidXRlTWFwO1xufTtcblxuLyoqXG4gKiBUaGUgKipDb21wb25lbnQqKiBjbGFzcyBleHRlbmRzIHRoZSBiYXNlIEhUTUxFbGVtZW50IGNsYXNzIHRvIHByb3ZpZGUgYW5cbiAqIGVyZ29ub21pYyB3YXkgdG8gZGVzaWduIGFuZCBkZXZlbG9wIFdlYiBDb21wb25lbnRzIHdpdGggcmVhY3RpdmUgc3RhdGUsXG4gKiBtYW5hZ2VkIGF0dHJpYnV0ZXMsIGFuZCBkeW5hbWljIHRlbXBsYXRpbmcuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnQ8XG4gIFN0YXRlU2hhcGUgZXh0ZW5kcyBvYmplY3QgPSB7fSxcbj4gZXh0ZW5kcyBIVE1MRWxlbWVudCB7XG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgICAgICAgIFN0YXRpYyBIZWxwZXIgTWV0aG9kcyAgICAgICAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBDb21wb25lbnQgd2l0aCB0aGUgYnJvd3Nlci4gT3B0aW9uYWxseSBwcm92aWRlIGFuIG92ZXJyaWRpbmdcbiAgICogdGFnIG5hbWUuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXIoXG4gICAgY29tcG9uZW50OiBDdXN0b21FbGVtZW50Q29uc3RydWN0b3IgfCB0eXBlb2YgQ29tcG9uZW50LFxuICAgIHRhZ05hbWU/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICAgIHR5cGVvZiB3aW5kb3cuY3VzdG9tRWxlbWVudHMgPT09IFwidW5kZWZpbmVkXCJcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFMSURfRU5WKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnRUYWduYW1lID1cbiAgICAgIFwidGFnTmFtZVwiIGluIGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50LnRhZ05hbWUgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBjb21wb25lbnQudGFnTmFtZVxuICAgICAgICA6IG51bGw7XG4gICAgY29uc3QgY29tcHV0ZWRUYWduYW1lID0gdGFnTmFtZSA/PyBjb21wb25lbnRUYWduYW1lO1xuXG4gICAgaWYgKFxuICAgICAgY29tcHV0ZWRUYWduYW1lID09PSBudWxsIHx8XG4gICAgICBjb21wdXRlZFRhZ25hbWUubGVuZ3RoID09PSAwIHx8XG4gICAgICAhY29tcHV0ZWRUYWduYW1lLmluY2x1ZGVzKFwiLVwiKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuSU5WQUxJRF9UQUdOQU1FKTtcbiAgICB9XG5cbiAgICBpZiAod2luZG93LmN1c3RvbUVsZW1lbnRzLmdldChjb21wdXRlZFRhZ25hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5EVVBFX1RBR05BTUUsIHRhZ05hbWUgPz8gXCJcIik7XG4gICAgfVxuXG4gICAgd2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZShcbiAgICAgIGNvbXB1dGVkVGFnbmFtZSxcbiAgICAgIGNvbXBvbmVudCBhcyBDdXN0b21FbGVtZW50Q29uc3RydWN0b3IsXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgU3RhdGljIENvbXBvbmVudCBDb25maWd1cmF0aW9uIFByb3BlcnRpZXMgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICAvKipcbiAgICogVGhlIEhUTUwgdGFnIG5hbWUgdG8gdXNlIGZvciB0aGlzIENvbXBvbmVudFxuICAgKi9cbiAgc3RhdGljIHRhZ05hbWU6IHN0cmluZyA9IFwiXCI7XG5cbiAgLyoqXG4gICAqIEFuIEhUTUwgVGVtcGxhdGUgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50IHRvIHVzZS5cbiAgICovXG4gIHN0YXRpYyB0ZW1wbGF0ZTogSFRNTFRlbXBsYXRlRWxlbWVudCB8IFRlbXBsYXRlID0gQkxBTktfVEVNUExBVEU7XG5cbiAgLyoqXG4gICAqIEEge0BsaW5rIENTU1N0eWxlU2hlZXR9IGFycmF5IG9yIHN0cmluZyB0byBhZG9wdCBhcyB0aGUgY29tcG9uZW50J3Mgc2NvcGVkIHN0eWxlc1xuICAgKi9cbiAgc3RhdGljIHN0eWxlczogQ29tcG9uZW50U3R5bGVzID0gW107XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIGh0bWwgYXR0cmlidXRlIG5hbWVzIHRvIG9ic2VydmUgdG8gdHJpZ2dlciB1cGRhdGVzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBJZiB5b3UgdXNlIHRoZSB7QGxpbmsgZGVmaW5lfSBmYWN0b3J5IGhlbHBlciwgdGhpcyB2YWx1ZSB3aWxsIGJlXG4gICAqIGF1dG9tYXRpY2FsbHkgbWVyZ2VkIHdpdGggYSBsaXN0IG9mIGFueSBkZWZpbmVkIHtAbGluayBsaXZlQXR0cmlidXRlc30uXG4gICAqL1xuICBzdGF0aWMgb2JzZXJ2ZWRBdHRyaWJ1dGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBmb3IgdGhpcyBDb21wb25lbnQncyBTaGFkb3dSb290LlxuICAgKlxuICAgKiAtIGBcIm9wZW5cImAgYWxsb3dzIEpTIGFjY2VzcyB0byB0aGUgY2hpbGRyZW4gb2YgdGhpcyBjb21wb25lbnRcbiAgICogLSBgXCJjbG9zZWRcImAgKGRlZmF1bHQpIGRpc2FsbG93cyBpbnRlcm5hbCBKUyBhY2Nlc3NcbiAgICovXG4gIHN0YXRpYyBzaGFkb3dSb290TW9kZTogXCJjbG9zZWRcIiB8IFwib3BlblwiID0gXCJjbG9zZWRcIjtcblxuICAvLyDila3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila5cbiAgLy8g4pSCICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlIFByb3BlcnRpZXMgICAgICAgICAgICAgICAgICDilIJcbiAgLy8g4pWw4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWvXG5cbiAgLyoqXG4gICAqIFByaW1hcnkgc2NyaXB0aW5nIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICpcbiAgICogVXNlIGBzY3JpcHQoKWAgdG8gZGVmaW5lIHByaW1hcnkgYmVoYXZpb3JzLCBsaXN0ZW5lcnMsIGFuZCBpbml0aWFsaXphdGlvbnMuXG4gICAqXG4gICAqIElmIG5lZWQgYmUsIHJldHVybiBhIGZ1bmN0aW9uIHRvIGF1dG9tYXRpY2FsbHkgY2FsbCB3aGVuIHRoZSBjb21wb25lbnQgaXNcbiAgICogdW5tb3VudGluZyBmb3IgY2xlYW51cCBzY3JpcHRzLiBBbHRlcm5hdGl2ZWx5LCB1c2Uge0BsaW5rIGZpbmFsaXplfSBmb3JcbiAgICogY2xlYW51cCB0YXNrcywgd2hpY2ggd2lsbCBhbHdheXMgcnVuIGxhc3QsIGV2ZW4gYWZ0ZXIgdGhlIHJldHVybmVkIGZ1bmN0aW9uXG4gICAqIGZyb20gc2NyaXB0KCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgc2NyaXB0PygpOiBWb2lkRnVuY3Rpb24gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGVhY2ggdGVtcGxhdGUgdXBkYXRlXG4gICAqL1xuICBwcm90ZWN0ZWQgYmVmb3JlVXBkYXRlPygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZWFjaCB0ZW1wbGF0ZSB1cGRhdGVcbiAgICovXG4gIHByb3RlY3RlZCBhZnRlclVwZGF0ZT8ocHJldmlvdXNBdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNYXApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgYXMgdGhlIGZpbmFsIGxpZmVjeWNsZSBtZXRob2QgYXQgdGhlIGVuZCBvZiB0aGUgdW5tb3VudGluZyBwcm9jZXNzLlxuICAgKlxuICAgKiBDb250ZW50IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGFuZCB0aGUgY29tcG9uZW50IGlzIG5vIGxvbmdlclxuICAgKiBjb25zaWRlcmVkIG1vdW50ZWQgd2hlbiB0aGlzIGZ1bmN0aW9uIHJ1bnMuXG4gICAqXG4gICAqIFVzZSB0aGlzIGZvciBmaW5hbCBjbGVhbnVwIHRhc2tzIGFuZCBmcmVlaW5nIHJlc291cmNlcy5cbiAgICovXG4gIHByb3RlY3RlZCBmaW5hbGl6ZT8oKTogdm9pZDtcblxuICAvKipcbiAgICogSWYgZGVmaW5lZCwgcmVjZWl2ZXMgZXJyb3JzIGNhdWdodCBkdXJpbmcgdGhlIGxpZmVjeWNsZSBtZXRob2RzIG9mIHRoaXNcbiAgICogY29tcG9uZW50IGFuZCBpdCdzIGNoaWxkcmVuLiBJZiBub3QgZGVmaW5lZCwgdGhpcyBjb21wb25lbnQgd2lsbCBpbnN0ZWFkXG4gICAqIHRocm93IGVycm9ycyBhcyB0aGV5IGFyZSBmb3VuZC5cbiAgICpcbiAgICogSWYgdGhlIGVycm9yIGNhbm5vdCBiZSBoYW5kbGVkLCBgb25FcnJvcigpYCBzaG91bGQgcmUtdGhyb3cgaXQgZm9yIGEgaGlnaGVyXG4gICAqIHVwIGNvbXBvbmVudCB0byBldmFsdWF0ZS5cbiAgICpcbiAgICogVG8gZGlzcGxheSBhbiBlcnJvciBtZXNzYWdlIHdoaWxlIHJlbW92aW5nIGFuIGVycm9yaW5nIGNvbXBvbmVudCBmcm9tIHRoZVxuICAgKiBET00sIHVzZSBgdGhpcy5yZXBsYWNlV2l0aCgpYCBhbmQgYSBuZXdseSBjb25zdHJ1Y3RlZCBwbGFjZWhvbGRlciBlbGVtZW50LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBSZWNvdmVyaW5nIGZyb20gZXJyb3JzIG9yIGRpc3BsYXlpbmcgYSBmYWxsYmFja1xuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG9uRXJyb3IoZXJyb3IpIHtcbiAgICogICAvLyBIYW5kbGUga25vd24gZXJyb3JzXG4gICAqICAgaWYgKGVycm9yLm1lc3NhZ2UgPSBcIkludmFsaWQgSW5wdXRcIikge1xuICAgKiAgICAgdGhpcy5zdGF0ZS5pbnB1dCA9IFwiXCI7XG4gICAqICAgICByZXR1cm47XG4gICAqICAgfVxuICAgKlxuICAgKiAgIC8vIERpc3BsYXkgYSBmYWxsYmFjayBiYW5uZXJcbiAgICogICBjb25zdCBiYW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgKiAgIGJhbm5lci50ZXh0Q29udGVudCA9IFwiQW4gdW5leHBlY3RlZCBlcnJvciBkb25lIGRpZFwiO1xuICAgKiAgIHRoaXMucmVwbGFjZVdpdGgoYmFubmVyKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHByb3RlY3RlZCBvbkVycm9yPyhlcnJvcjogdW5rbm93bik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGlzIENvbXBvbmVudCdzIHJlYWN0aXZlIGludGVybmFsIHN0YXRlLCBpZiBhbnkuXG4gICAqXG4gICAqIElmIGBpbml0aWFsU3RhdGVgIGlzIGRlZmluZWQgYXMgYSBmdW5jdGlvbiwgdGhlIGZ1bmN0aW9uIGlzIGV2YWx1YXRlZCBhdFxuICAgKiBtb3VudGluZyB0aW1lIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGluaXRpYWwgc3RhdGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdGlhbFN0YXRlPzogU3RhdGVJbml0aWFsaXplcjxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IG9yIGZ1bmN0aW9uIHJldHVybmluZyBhbiBvYmplY3Qgd2hpY2ggcG9wdWxhdGVzIHRoZSBgZGF0YWAgdmFsdWVzXG4gICAqIGluIHRoZSB0ZW1wbGF0aW5nIGVuZ2luZS4gU3VjaCB2YWx1ZXMgYXJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBgKmAgbm90YXRpb24uXG4gICAqXG4gICAqIFdoZW4gYSBob3N0ZWQgdmFsdWUgaXMgYWNjZXNzZWQsIGl0J3MgdmFsdWUgaXMgY29lcmNlZCBiYXNlZCBvbiB0aGUgd2F5IGl0XG4gICAqIGlzIGJlaW5nIHVzZWQuIEZvciBhdHRyaWJ1dGVzLCB2YWx1ZXMgYXJlIHNlcmlhbGl6ZWQgdG8gYSBzdHJpbmcgb3IgbnVsbCxcbiAgICogd2hpY2ggd2lsbCBzZXQgdGhlIGF0dHJpYnV0ZSAoc3RyaW5nKSBvciByZW1vdmUgaXQgKG51bGwpLlxuICAgKlxuICAgKiBGb3IgY29udGVudCBzd2Fwcywgc3RyaW5ncywgbnVtYmVycyBhbmQgYm9vbGVhbnMgYXJlIHJlbmRlcmVkIGFzIHN0cmluZ3NcbiAgICogYW5kIHNldCBhcyB0ZXh0Q29udGVudC4gbnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlcyByZW5kZXIgbm90aGluZyAod2l0aCBhXG4gICAqIGNvbW1lbnQgcGxhY2Vob2xkZXIpLCBhbiBIVE1MRWxlbWVudCB3aWxsIGJlIHN3YXBwZWQgaW4gYXMgYSBjbG9uZWQgbm9kZS5cbiAgICpcbiAgICogRnVuY3Rpb25zIGFyZSBldmFsdWF0ZWQgYXQgcmVuZGVyL3VwZGF0ZSB0aW1lLCBhbmQgdGhlaXIgcmV0dXJuIHZhbHVlIGlzXG4gICAqIHVzZWQgaW5zdGVhZC4gRnVuY3Rpb25zIGFyZSBwYXNzZWQgdGhlIGN1cnJlbnQgdGFyZ2V0IG5vZGUgYWNjZXNzaW5nIHRoZVxuICAgKiBwcm9wZXJ0eSBhcyBpdHMgZmlyc3QgYW5kIG9ubHkgYXJndW1lbnQuXG4gICAqXG4gICAqIE90aGVyIHR5cGVzIGFyZSB1bnN1cHBvcnRlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBob3N0ID0ge1xuICAgKiAgIGF2YXRhclVybDogXCJodHRwOi8vLi4uXCIsXG4gICAqICAgcmVuZGVyVGltZTogKCkgPT4gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgKiB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBgYGBodG1sXG4gICAqIDxpbWcgOnNyYz1cIiphdmF0YXJVcmxcIiAvPlxuICAgKiA8c3Bhbj5SZW5kZXJlZCBhdCAke1wiKnJlbmRlclRpbWVcIn08L3NwYW4+XG4gICAqIGBgYFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbXB1dGVkUHJvcGVydGllcz86IENvbXB1dGVkUHJvcGVydGllczxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogRGVjbGFyYXRpb24gb2YgYXR0cmlidXRlIGJlaGF2aW9ycyBkdXJpbmcgdXBkYXRlcy5cbiAgICpcbiAgICogRWFjaCBrZXkgaXMgdGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlLiBWYWx1ZXMgYXJlIGFuIG9iamVjdCB3aXRoIHR3b1xuICAgKiBvcHRpb25hbCBmdW5jdGlvbiBkZWZpbml0aW9uczpcbiAgICpcbiAgICogYG9uQ2hhbmdlKG5ld1ZhbHVlLCBvbGRWYWx1ZSk6IHZvaWRgLCBhIGhhbmRsZXIgZnVuY3Rpb24gZm9yIHdoZW4gdGhlIHZhbHVlXG4gICAqIG9mIHRoaXMgYXR0cmlidXRlIGhhcyBjaGFuZ2VkLiBSdW5zIG9uY2UgcGVyIHVwZGF0ZSBjeWNsZSwgKmJlZm9yZSogdGhlXG4gICAqIHVwZGF0ZSBvY2N1cnMuXG4gICAqXG4gICAqIGByZWZsZWN0KCk6IHVua25vd25gLCBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSB2YWx1ZSB0byBzZXJpYWxpemUgYW5kIHNldFxuICAgKiBhcyB0aGlzIGF0dHJpYnV0ZSAqYWZ0ZXIqIGFuIHVwZGF0ZSBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbGl2ZUF0dHJpYnV0ZXMgPSB7XG4gICAqICAgZG9uZToge1xuICAgKiAgICAgb25DaGFuZ2UobmV3VmFsdWUpIHtcbiAgICogICAgICAgdGhpcy5zdGF0ZS5zZXQoXCJkb25lXCIsICEhbmV3VmFsdWUpO1xuICAgKiAgICAgfSxcbiAgICogICAgIHJlZmxlY3QoKSB7IHJldHVybiB0aGlzLnN0YXRlLmN1cnJlbnQuZG9uZSB9XG4gICAqICAgfVxuICAgKiB9O1xuICAgKiBgYGBcbiAgICpcbiAgICogQHJlbWFya3NcbiAgICpcbiAgICogSWYgdXNpbmcgdGhlIHtAbGluayBkZWZpbmV9IGhlbHBlciwgdGhlIGtleXMgb2YgdGhpcyBwcm9wZXJ0eSBhcmVcbiAgICogYXV0b21hdGljYWxseSBtZXJnZWQgd2l0aCBhbnkgZGVmaW5lZCB7QGxpbmsgb2JzZXJ2ZWRBdHRyaWJ1dGVzfS5cbiAgICpcbiAgICogSWYgeW91IGFyZSBkaXJlY3RseSBleHRlbmRpbmcgdGhlIGNsYXNzLCBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBtdXN0IGJlXG4gICAqIGV4cGxpY2l0bHkgZGVmaW5lZCB3aXRoIGFueSBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIG1vbml0b3JlZCwgcmVnYXJkbGVzc1xuICAgKiBvZiBpZiB0aGV5J3JlIGRlZmluZWQgaGVyZS5cbiAgICovXG4gIHByb3RlY3RlZCBsaXZlQXR0cmlidXRlcz86IExpdmVBdHRyaWJ1dGVzPFN0YXRlU2hhcGU+O1xuXG4gIC8vIOKVreKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVrlxuICAvLyDilIIgICAgICAgICAgICAgICBJbnRlcm5hbCBTdGF0ZSBNYW5hZ2VtZW50ICAgICAgICAgICAgICAgIOKUglxuICAvLyDilbDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila9cblxuICBwcml2YXRlIF9pc0NvbXBvbmVudE1vdW50ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdGVtcGxhdGU6IFRlbXBsYXRlO1xuICBwcml2YXRlIF9yb290OiBTaGFkb3dSb290O1xuICBwcml2YXRlIF9zdGF0ZT86IFN0YXRlPFN0YXRlU2hhcGU+O1xuICBwcml2YXRlIF9kZWxlZ2F0b3I/OiBFdmVudERlbGVnYXRvcjtcbiAgcHJpdmF0ZSBfb3duTGlzdGVuZXJzOiBTZXQ8e1xuICAgIGhhbmRsZXI6IEV2ZW50SGFuZGxlcjtcbiAgICBldmVudDogRXZlbnROYW1lO1xuICB9PiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSBfbGl2ZUF0dHJpYnV0ZUNvbmZpZ3M6IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgTGl2ZUF0dHJpYnV0ZXM8U3RhdGVTaGFwZT5bc3RyaW5nXVxuICA+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9jbGVhbnVwRm4/OiBWb2lkRnVuY3Rpb247XG5cbiAgcHJpdmF0ZSBfcmVuZGVySW50ZXJuYWxzOiBJbnRlcm5hbFJlbmRlclN0YXR1cyA9IHtcbiAgICB3aWxsUmVuZGVyOiBmYWxzZSxcblxuICAgIC8qKiBXaGVuIHNldCB0byBgdHJ1ZWAsIHRoZSByZW5kZXIvdXBkYXRlIHByb2Nlc3MgaXMgYWN0aXZlbHkgcnVubmluZyAqL1xuICAgIGlzUmVuZGVyaW5nOiBmYWxzZSxcbiAgICBzZXF1ZW50aWFsUmVuZGVyczogMCxcbiAgICBwb3N0UmVuZGVyQ2FsbGJhY2tzOiBuZXcgU2V0KCksXG4gICAgbGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwOiBuZXcgTWFwKCksXG4gICAgdHJhY2tlZEF0dHJpYnV0ZUNoYW5nZXM6IG5ldyBNYXAoKSxcbiAgfTtcblxuICAvLyDila3ilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDila5cbiAgLy8g4pSCICAgICAgICAgICAgIEludGVybmFscyBhbmQgUHJpdmF0ZSBNZXRob2RzICAgICAgICAgICAgICDilIJcbiAgLy8g4pWw4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWvXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGNvbnN0IHsgdGVtcGxhdGUsIHN0eWxlcywgc2hhZG93Um9vdE1vZGUgfSA9IHRoaXNcbiAgICAgIC5jb25zdHJ1Y3RvciBhcyB0eXBlb2YgQ29tcG9uZW50O1xuXG4gICAgLy8gTm9ybWFsaXplIHN0eWxlcyB0byBhbiBhcnJheSBvZiBDU1NTdHlsZVNoZWV0IG9iamVjdHNcbiAgICBjb25zdCBuZXdTdHlsZXMgPSBBcnJheS5pc0FycmF5KHN0eWxlcylcbiAgICAgID8gc3R5bGVzXG4gICAgICA6IHR5cGVvZiBzdHlsZXMgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBbc3R5bGVzXVxuICAgICAgICA6IFtjc3NgJHtzdHlsZXN9YF07XG5cbiAgICB0aGlzLl9yb290ID0gdGhpcy5hdHRhY2hTaGFkb3coeyBtb2RlOiBzaGFkb3dSb290TW9kZSB9KTtcbiAgICB0aGlzLl9yb290LmFkb3B0ZWRTdHlsZVNoZWV0cy5wdXNoKC4uLm5ld1N0eWxlcyk7XG4gICAgdGhpcy5fdGVtcGxhdGUgPVxuICAgICAgdGVtcGxhdGUgaW5zdGFuY2VvZiBUZW1wbGF0ZSA/IHRlbXBsYXRlIDogbmV3IFRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgfVxuXG4gIC8qKiBQcm9kdWNlIHRoZSBkYXRhIG9iamVjdCB0byBwYXNzIHRvIHRoZSB0ZW1wbGF0ZSdzIHJlbmRlciBmdW5jdGlvbiAqL1xuICBwcml2YXRlIF9nZXRSZW5kZXJDb250ZXh0KGF0dHI6IEF0dHJpYnV0ZU1hcCk6IFRlbXBsYXRlQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHI6IE9iamVjdC5mcm9tRW50cmllcyhhdHRyKSxcbiAgICAgIGRhdGE6XG4gICAgICAgIHR5cGVvZiB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyB0aGlzLmNvbXB1dGVkUHJvcGVydGllcygpXG4gICAgICAgICAgOiB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyxcbiAgICAgIHN0YXRlOiB0aGlzLl9zdGF0ZSA/IHRoaXMuX3N0YXRlLmN1cnJlbnQgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2VzY2FsYXRlRXJyb3IoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICBsZXQgbm9kZTogTm9kZSB8IG51bGwgPSB0aGlzLnBhcmVudE5vZGU7XG5cbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgaWYgKFxuICAgICAgICBub2RlIGluc3RhbmNlb2YgQ29tcG9uZW50ICYmXG4gICAgICAgIFwib25FcnJvclwiIGluIG5vZGUgJiZcbiAgICAgICAgdHlwZW9mIG5vZGUub25FcnJvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICApIHtcbiAgICAgICAgbm9kZS5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICBub2RlID0gbm9kZS5ob3N0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCB0byBlc2NhbGF0ZSB0bywgdGhyb3cgdGhlIGVycm9yXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwcml2YXRlIF9yZXBvcnRFcnJvcihlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghdGhpcy5vbkVycm9yKSB7XG4gICAgICB0aGlzLl9lc2NhbGF0ZUVycm9yKGVycm9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9leGVjdXRlQXR0cmlidXRlQ2hhbmdlSGFuZGxlcnMgPSAoKSA9PiB7XG4gICAgY29uc3QgcHJldkF0dHJzID0gdGhpcy5fcmVuZGVySW50ZXJuYWxzLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZU1hcDtcblxuICAgIC8vIENvcHkgdGhlIGNoYW5nZXMgdG8gYSBuZXcgbWFwIGFuZCBjbGVhciB0aGUgdHJhY2tpbmcgbWFwXG4gICAgY29uc3QgdHJhY2tlZENoYW5nZXMgPSBuZXcgTWFwKFxuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLFxuICAgICk7XG4gICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLmNsZWFyKCk7XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWxdIG9mIHRyYWNrZWRDaGFuZ2VzKSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLl9saXZlQXR0cmlidXRlQ29uZmlncy5nZXQobmFtZSk7XG4gICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFwib25DaGFuZ2VcIiBpbiBjb25maWcpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHByZXZBdHRycy5nZXQobmFtZSkgPz8gbnVsbDtcblxuICAgICAgICBpZiAoY29uZmlnICYmIHByZXZpb3VzVmFsdWUgIT09IHZhbCkge1xuICAgICAgICAgIGNvbmZpZy5vbkNoYW5nZT8uY2FsbCh0aGlzLCB2YWwsIHByZXZpb3VzVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgX3JlZmxlY3RMaXZlQXR0cmlidXRlcyA9ICgpID0+IHtcbiAgICBjb25zdCB0b1NldDogW25hbWU6IHN0cmluZywgdmFsOiBzdHJpbmcgfCBudWxsXVtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb25maWddIG9mIHRoaXMuX2xpdmVBdHRyaWJ1dGVDb25maWdzKSB7XG4gICAgICBpZiAoXCJyZWZsZWN0XCIgaW4gY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IHNlcmlhbGl6ZUF0dHJpYnV0ZShjb25maWcucmVmbGVjdD8uY2FsbCh0aGlzKSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcblxuICAgICAgICBpZiAodmFsICE9PSBjdXJyZW50KSB7XG4gICAgICAgICAgdG9TZXQucHVzaChbbmFtZSwgdmFsXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWxdIG9mIHRvU2V0KSB7XG4gICAgICB0aGlzLnJlZmxlY3RBdHRyaWJ1dGUobmFtZSwgdmFsKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIFRoZSBhY3R1YWwgdXBkYXRlIGJlaGF2aW9yICovXG4gIHByaXZhdGUgX3BlcmZvcm1VcGRhdGUgPSAoKTogdm9pZCA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEltbWVkaWF0ZWx5IGZsaXAgZmxhZ3MgdG8gZGVub3RlIGEgcmVuZGVyIGlzIGluIHByb2dyZXNzIGFuZCBhbGxvd1xuICAgICAgLy8gcXVldWVpbmcgYW5vdGhlciByZW5kZXIgcmVxdWVzdC5cbiAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy5pc1JlbmRlcmluZyA9IHRydWU7XG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlciA9IGZhbHNlO1xuXG4gICAgICAvLyBBdHRyaWJ1dGVzOiBSdW4gYW55IGByZWFkYCBob29rcyBmb3IgY2hhbmdlZCBhdHRyaWJ1dGVzXG4gICAgICB0aGlzLl9leGVjdXRlQXR0cmlidXRlQ2hhbmdlSGFuZGxlcnMoKTtcblxuICAgICAgLy8gQ2FjaGUgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgcHJldmlvdXMgcmVuZGVyXG4gICAgICBjb25zdCBwcmV2QXR0cnMgPSB0aGlzLl9yZW5kZXJJbnRlcm5hbHMubGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwO1xuXG4gICAgICB0aGlzLmJlZm9yZVVwZGF0ZT8uKCk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBzbmFwc2hvdCBvZiBhdHRyaWJ1dGVzXG4gICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gY3JlYXRlQXR0cmlidXRlTWFwKHRoaXMpO1xuICAgICAgdGhpcy5fdGVtcGxhdGUucmVuZGVyKHRoaXMucm9vdCwgdGhpcy5fZ2V0UmVuZGVyQ29udGV4dChuZXdBdHRyaWJ1dGVzKSk7XG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMubGFzdFJlbmRlcmVkQXR0cmlidXRlTWFwID0gbmV3QXR0cmlidXRlcztcbiAgICAgIHRoaXMuYWZ0ZXJVcGRhdGU/LihwcmV2QXR0cnMpO1xuXG4gICAgICAvLyBBdHRyaWJ1dGVzOiBSdW4gYW55IGB3cml0ZWAgaG9va3MgZm9yIHVwZGF0ZWQgdmFsdWVzXG4gICAgICB0aGlzLl9yZWZsZWN0TGl2ZUF0dHJpYnV0ZXMoKTtcblxuICAgICAgLy8gUnVuIGFueSByZXF1ZXN0ZWQgcmVuZGVyIGNhbGxiYWNrc1xuICAgICAgLy8gVGhlc2UgYXJlIGNvbnNpZGVyZWQgbGlmZWN5Y2xlIG1ldGhvZHMgYXMgd2VsbCwgYW5kIHdpbGwgcmVwb3J0IGVycm9yc1xuICAgICAgLy8gYXMgYW55IG90aGVyIGxpZmVjeWNsZSBtZXRob2Qgd291bGRcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcy5zaXplKSB7XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IEFycmF5LmZyb20odGhpcy5fcmVuZGVySW50ZXJuYWxzLnBvc3RSZW5kZXJDYWxsYmFja3MpO1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcy5jbGVhcigpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZm4gb2YgY2FsbGJhY2tzKSB7XG4gICAgICAgICAgZm4oKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgYHdpbGxSZW5kZXJgIGZsYWcgd2FzIGZsaXBwZWQsIGltbWVkaWF0ZWx5IHBlcmZvcm0gYSByZW5kZXJcbiAgICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlcikge1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMuc2VxdWVudGlhbFJlbmRlcnMgKz0gMTtcblxuICAgICAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLnNlcXVlbnRpYWxSZW5kZXJzID49IE1BWF9TRVFVRU5USUFMX1JFTkRFUlMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKFxuICAgICAgICAgICAgRXJyb3JDb2RlLk1BWF9TRVFVRU5USUFMX1JFTkRFUlMsXG4gICAgICAgICAgICBgJHt0aGlzLl9yZW5kZXJJbnRlcm5hbHMuc2VxdWVudGlhbFJlbmRlcnN9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcGVyZm9ybVVwZGF0ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnNlcXVlbnRpYWxSZW5kZXJzID0gMDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLndpbGxSZW5kZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBTYWZlbHkgcmVxdWVzdCBmb3IgYW4gdXBkYXRlIHRvIHJ1biBvbiB0aGUgbmV4dCBmcmFtZSAqL1xuICBwcml2YXRlIF9zY2hlZHVsZVVwZGF0ZSA9ICgpID0+IHtcbiAgICAvLyBQcmV2ZW50IHNjaGVkdWxpbmcgbXVsdGlwbGUgcmVuZGVyc1xuICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3JlbmRlckludGVybmFscy53aWxsUmVuZGVyID0gdHJ1ZTtcblxuICAgIC8vIElmIGN1cnJlbnRseSByZW5kZXJpbmcsIGRvbid0IHJlcXVlc3QgYSByZW5kZXIsIGl0IHdpbGwgYXV0by1jb250aW51ZVxuICAgIC8vIHVudGlsIHRoZXJlIGFyZSBubyBjaGFuZ2VzIHRvIHJlbmRlclxuICAgIGlmICh0aGlzLl9yZW5kZXJJbnRlcm5hbHMuaXNSZW5kZXJpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBhIHJlbmRlciBpcyByZXF1ZXN0ZWQgYW5kIHdlJ3JlIG5vdCByZW5kZXJpbmcsIHJlcXVlc3QgYSByZW5kZXIgZnJhbWVcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fcGVyZm9ybVVwZGF0ZSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBfYWRvcHRTdGF0ZShzdGF0ZTogU3RhdGVTaGFwZSB8IFN0YXRlPFN0YXRlU2hhcGU+KSB7XG4gICAgLy8gSWYgdGhpcyBpcyBleGFjdGx5IG91ciBvd24gc3RhdGUgb2JqZWN0LCBkbyBub3RoaW5nXG4gICAgaWYgKE9iamVjdC5pcyh0aGlzLl9zdGF0ZSwgc3RhdGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgc3RhdGUgZXhpc3RzLCByZW1vdmUgdGhlIGxpc3RlbmVyIGFuZCBzY2hlZHVsZSBhIHJlbmRlclxuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgdGhpcy5fc3RhdGUucmVtb3ZlTGlzdGVuZXIodGhpcy5fc2NoZWR1bGVVcGRhdGUpO1xuICAgICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBBZG9wdCB0aGUgaW5jb21pbmcgc3RhdGUgb2JqIG9yIHdyYXAgYW5kIGFkb3B0IGl0XG4gICAgY29uc3QgaW5jb21pbmdTdGF0ZU9iaiA9IHN0YXRlIGluc3RhbmNlb2YgU3RhdGUgPyBzdGF0ZSA6IG5ldyBTdGF0ZShzdGF0ZSk7XG4gICAgdGhpcy5fc3RhdGUgPSBpbmNvbWluZ1N0YXRlT2JqO1xuXG4gICAgLy8gRW5zdXJlIHRoZXJlIGlzIG5vdCBhY2NpZGVudGFsbHkgdHdvIG9mIHRoZSBzYW1lIHJlbmRlciBsaXN0ZW5lcnNcbiAgICB0aGlzLl9zdGF0ZS5yZW1vdmVMaXN0ZW5lcih0aGlzLl9zY2hlZHVsZVVwZGF0ZSk7XG4gICAgdGhpcy5fc3RhdGUuYWRkTGlzdGVuZXIodGhpcy5fc2NoZWR1bGVVcGRhdGUpO1xuICB9XG5cbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICAgICAgQ3VzdG9tIEVsZW1lbnQgQ2FsbGJhY2sgT3ZlcnJpZGVzICAgICAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNjcmlwdH0gaW5zdGVhZFxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0NvbXBvbmVudE1vdW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMuaXNSZW5kZXJpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMud2lsbFJlbmRlciA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBjcmVhdGVBdHRyaWJ1dGVNYXAodGhpcyk7XG4gICAgICAgIHRoaXMuX2xpdmVBdHRyaWJ1dGVDb25maWdzID0gbmV3IE1hcChcbiAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLmxpdmVBdHRyaWJ1dGVzID8/IHt9KSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3RhdGVmdWwgY29tcG9uZW50LCBzZXQgdXAgdGhhdCBzdGF0ZVxuICAgICAgICBpZiAodGhpcy5pbml0aWFsU3RhdGUpIHtcbiAgICAgICAgICBjb25zdCBpbml0ID1cbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmluaXRpYWxTdGF0ZSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICA/IHRoaXMuaW5pdGlhbFN0YXRlXG4gICAgICAgICAgICAgIDogdGhpcy5pbml0aWFsU3RhdGUoKTtcblxuICAgICAgICAgIHRoaXMuX2Fkb3B0U3RhdGUoaW5pdCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90ZW1wbGF0ZS5yZW5kZXIodGhpcy5yb290LCB0aGlzLl9nZXRSZW5kZXJDb250ZXh0KGF0dHJpYnV0ZXMpKTtcbiAgICAgICAgdGhpcy5fcmVmbGVjdExpdmVBdHRyaWJ1dGVzKCk7XG4gICAgICAgIHRoaXMuX3JlbmRlckludGVybmFscy5sYXN0UmVuZGVyZWRBdHRyaWJ1dGVNYXAgPSBhdHRyaWJ1dGVzO1xuICAgICAgICB0aGlzLl9pc0NvbXBvbmVudE1vdW50ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9jbGVhbnVwRm4gPSB0aGlzLnNjcmlwdD8uKCkgPz8gdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fcmVwb3J0RXJyb3IoZXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBmaW5hbGl6ZX1cbiAgICovXG4gIHByb3RlY3RlZCBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAvLyBJZiB0aGlzIHRhc2sgcnVucyBidXQgdGhlIGNvbXBvbmVudCBpcyBzdGlsbCBjb25uZWN0ZWQsIHRoZW4gZG8gbm90aGluZ1xuICAgICAgLy8gYmVjYXVzZSB0aGUgY29tcG9uZW50IHdhcyBqdXN0IG1vdmVkIGluIHRoZSBET00uXG4gICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCB8fCAhdGhpcy5faXNDb21wb25lbnRNb3VudGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBydW4gdGhlIGRpc2Nvbm5lY3QgaWYgdGhlIGVsZW1lbnQgaXMgYWN0dWFsbHkgdW5tb3VudGVkIGFuZCBub3RcbiAgICAgIC8vIGp1c3QgbW92ZWQuIFVzaW5nIHRoaXMgaW4gcGxhY2Ugb2YgY29ubmVjdGVkTW92ZUNhbGxiYWNrKCkgZm9yIGNvbXBhdFxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fZGVsZWdhdG9yPy5jbGVhbnVwKCk7XG5cbiAgICAgICAgLy8gQ2xlYXIgYW55IGxpc3RlbmVycyBzZXQgdXAgb24gc2VsZlxuICAgICAgICBpZiAodGhpcy5fb3duTGlzdGVuZXJzLnNpemUgPiAwKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9vd25MaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihsaXN0ZW5lci5ldmVudCwgbGlzdGVuZXIuaGFuZGxlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xlYW51cEZuPy4oKTtcbiAgICAgICAgdGhpcy5faXNDb21wb25lbnRNb3VudGVkID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlcnJvcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBSdW4gdGhlIGZpbmFsaXplIGNhbGwgYWZ0ZXIgZXZlcnl0aGluZywgZXZlbiBpZiB0aGUgY2xlYW51cCBmbiBmYWlsZWRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLmZpbmFsaXplPy4oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGxpdmVBdHRyaWJ1dGVzfSBpbnN0ZWFkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBfOiBzdHJpbmcgfCBudWxsLFxuICAgIG5ld1ZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICApOiB2b2lkIHtcbiAgICAvLyBJZ25vcmUgYXR0cmlidXRlIGNoYW5nZXMgdGhhdCBvY2N1ciBkdXJpbmcgYW4gdXBkYXRlLCBhcyB0aGV5IGFyZVxuICAgIC8vIGNvbWluZyBmcm9tIGluc2lkZSB0aGUgaG91c2VcbiAgICBpZiAodGhpcy5fcmVuZGVySW50ZXJuYWxzLmlzUmVuZGVyaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2tpcCBub24tY2hhbmdlcyB1c2luZyB0aGUgc3RvcmVkIGF0dHJpYnV0ZXMgYXMgcmVmZXJlbmNlIHRvIGNvbXBhcmVcbiAgICAvLyB0byB0aGUgcmVuZGVyIHN0YXRlIHJhdGhlciB0aGFuIHRoZSBkb21cbiAgICBpZiAoXG4gICAgICBuZXdWYWx1ZSA9PT0gdGhpcy5fcmVuZGVySW50ZXJuYWxzLmxhc3RSZW5kZXJlZEF0dHJpYnV0ZU1hcD8uZ2V0KG5hbWUpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FjaGUgdGhlIHVwZGF0ZWQgYXR0cmlidXRlIHZhbHVlXG4gICAgdGhpcy5fcmVuZGVySW50ZXJuYWxzLnRyYWNrZWRBdHRyaWJ1dGVDaGFuZ2VzLnNldChuYW1lLCBuZXdWYWx1ZSk7XG5cbiAgICAvLyBTY2hlZHVsZSBhIHJlbmRlclxuICAgIGlmICghdGhpcy5fcmVuZGVySW50ZXJuYWxzLndpbGxSZW5kZXIpIHtcbiAgICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pWt4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pWuXG4gIC8vIOKUgiAgICAgICAgICAgICAgICAgICAgUHVibGljIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAg4pSCXG4gIC8vIOKVsOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKVr1xuXG4gIC8qKlxuICAgKiBUaGUgU2hhZG93Um9vdCBub2RlIG9mIHRoaXMgZWxlbWVudFxuICAgKi9cbiAgZ2V0IHJvb3QoKTogU2hhZG93Um9vdCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3Q7XG4gIH1cblxuICAvKipcbiAgICogRGlyZWN0bHkgYWNjZXNzIGFuZCBtYW5pcHVsYXRlIHRoaXMgQ29tcG9uZW50J3MgcmVhY3RpdmUgc3RhdGUgd2l0aCBkZWVwXG4gICAqIHJlYWN0aXZpdHkgZW5hYmxlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbml0aWFsU3RhdGUgPSB7IHZhbHVlczogeyBjb3VudDogMSwgdGltZTogMCB9IH07XG4gICAqXG4gICAqIGluY3JlbWVudCgpIHtcbiAgICogICB0aGlzLnN0YXRlLnZhbHVlcy5jb3VudCA9IDI7XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaXMgYSBzaG9ydGhhbmQgZ2V0dGVyIGZvciBgdGhpcy5nZXRTdGF0ZSgpLmxpdmVgXG4gICAqL1xuICBnZXQgc3RhdGUoKTogU3RhdGVTaGFwZSB7XG4gICAgaWYgKCF0aGlzLl9zdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IFBhbGV0dGVFcnJvcihFcnJvckNvZGUuTUlTU0lOR19TVEFURSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLmxpdmU7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgY3VycmVudCBzdGF0ZSB3aXRoIGEgbmV3IHZhbHVlIG9yIGFkb3B0IGEgd2hvbGUgZGlmZmVyZW50IFN0YXRlXG4gICAqIGluc3RhbmNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFN0YXRlIHJlcGxhY2VtZW50XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQWx3YXlzIHRyaWdnZXJzIGEgcmVuZGVyXG4gICAqIHRoaXMuc3RhdGUgPSB7IHNvbWU6IFwibmV3U3RhdGVcIiB9XG4gICAqXG4gICAqIC8vIEFkb3B0IGEgbmV3IHN0YXRlIGluc3RhbmNlIGFsdG9nZXRoZXJcbiAgICogY29uc3Qgb3RoZXJTdGF0ZSA9IG5ldyBTdGF0ZSh7c29tZTogXCJuZXdTdGF0ZVwifSk7XG4gICAqIHRoaXMuc3RhdGUgPSBvdGhlclN0YXRlO1xuICAgKlxuICAgKiAvLyBDYXVzZXMgYSByZW5kZXJcbiAgICogb3RoZXJTdGF0ZS5zZXQoXCJzb21lXCIsIFwidmFsdWVcIik7XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0IHN0YXRlKG5ld1N0YXRlOiBTdGF0ZVNoYXBlIHwgU3RhdGU8U3RhdGVTaGFwZT4pIHtcbiAgICB0aGlzLl9hZG9wdFN0YXRlKG5ld1N0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdGhlIGZ1bGwge0BsaW5rIFN0YXRlfSBpbnN0YW5jZSBmb3IgdGhpcyBDb21wb25lbnQuXG4gICAqXG4gICAqIFVzaW5nIHRoaXMgbWV0aG9kIG9uIGEgY29tcG9uZW50IHdoaWNoIGlzIG5vdCB1c2luZyByZWFjdGl2ZSBzdGF0ZVxuICAgKiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBiZWluZyB0aHJvd24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIFJldHJpZXZlIHN0YXRlZnVsIHZhbHVlXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY2xhc3MgRXhhbXBsZSBleHRlbmRzIENvbXBvbmVudCB7XG4gICAqICAgaW5pdGlhbFN0YXRlID0geyBjb3VudDogMSB9O1xuICAgKlxuICAgKiAgIHNjcmlwdCgpIHtcbiAgICogICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXRTdGF0ZSgpO1xuICAgKiAgICAgY29uc29sZS5sb2coYFRoZSBjb3VudCBpcyAke3N0YXRlLmdldChcImNvdW50XCIpfWApO1xuICAgKiAgIH1cbiAgICpcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogU2V0IGEgc3RhdGVmdWwgdmFsdWVcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBFeGFtcGxlIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICogICBpbml0aWFsU3RhdGUgPSB7IGNvdW50OiAxIH07XG4gICAqXG4gICAqICAgaW5jcmVtZW50KCkge1xuICAgKiAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmdldFN0YXRlKCk7XG4gICAqICAgICBjb25zdCBjdXJyZW50ID0gc3RhdGUuZ2V0KFwiY291bnRcIik7XG4gICAqICAgICBzdGF0ZS5zZXQoXCJjb3VudFwiLCBjdXJyZW50ICsgMSk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0U3RhdGUoKTogU3RhdGU8U3RhdGVTaGFwZT4ge1xuICAgIGlmICghdGhpcy5fc3RhdGUpIHtcbiAgICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLk1JU1NJTkdfU1RBVEUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBzY2hlZHVsZSBhIHJlbmRlciB0byBvY2N1clxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBDYWxsaW5nIHtAbGluayByZXF1ZXN0UmVuZGVyfSBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBldmVudCBsb29wIHdvbid0XG4gICAqIHNjaGVkdWxlIG11bHRpcGxlIHJlbmRlcnMuIFJlbmRlcnMgYXJlIHNjaGVkdWxlZCB0byBvY2N1ciBvbiB0aGUgbmV4dFxuICAgKiBhbmltYXRpb24gZnJhbWUuXG4gICAqL1xuICByZXF1ZXN0UmVuZGVyKGNhbGxiYWNrPzogVm9pZEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLl9yZW5kZXJJbnRlcm5hbHMucG9zdFJlbmRlckNhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbWFuYWdlZCBldmVudCBsaXN0ZW5lciBvbiB0aGlzIENvbXBvbmVudCB3aXRoIGFuIG9wdGlvbmFsIHF1ZXJ5XG4gICAqIGZpbHRlciBzdHJpbmcgdG8gc3BlY2lmeSB3aGljaCBlbGVtZW50cyB0byBsaXN0ZW4gdG8gZXZlbnRzIGZyb20uXG4gICAqXG4gICAqIEV2ZW50IGhhbmRsZXJzIHNldCB1cCB3aXRoIGBsaXN0ZW4oKWAgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cCB3aGVuXG4gICAqIHRoZSBjb21wb25lbnQgaXMgdW5tb3VudGVkLlxuICAgKlxuICAgKiBIYW5kbGVycyBhcmUgZGVsZWdhdGVkIHRvIGEgc2luZ2xlIGxpc3RlbmVyIHBlciBldmVudCBvbiB0aGUgcm9vdCBvZiB0aGVcbiAgICogQ29tcG9uZW50LCB3aGljaCBpcyB0aGUgY2xvc2VkIFNoYWRvd1Jvb3QgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogU2V0IHVwIGFuIGV2ZW50IGxpc3RlbmVyIGZvciBhIGNsaWNrIGV2ZW50IGZyb20gYSBidXR0b24gd2l0aCBJRCBcInN1Ym1pdFwiXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGhpcy5saXN0ZW4oXCIjc3VibWl0XCIsIFwiY2xpY2tcIiwgdGhpcy5oYW5kbGVDbGljayk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBTZXQgdXAgYW4gZXZlbnQgbGlzdGVuZXIgb24gdGhlIGhvc3QgZWxlbWVudCBpdHNlbGYgKGB0aGlzYCkuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVXNlIFwiOmhvc3RcIiBvciBcIjpIT1NUXCIgYXMgdGhlIHF1ZXJ5IHNlbGVjdG9yIHRvIHRhcmdlIHRoZSBob3N0IGVsZW1lbnRcbiAgICogdGhpcy5saXN0ZW4oXCI6aG9zdFwiLCBcImFuaW1hdGlvbmVuZFwiLCB0aGlzLmhhbmRsZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIGxpc3RlbjxFIGV4dGVuZHMgRXZlbnROYW1lPihcbiAgICB0YXJnZXREZXNjcmlwdG9yOiBzdHJpbmcgfCB0eXBlb2YgQ29tcG9uZW50PGFueT4gfCBIVE1MRWxlbWVudCxcbiAgICBldmVudE5hbWU6IEUsXG4gICAgZXZlbnRIYW5kbGVyOiBFdmVudEhhbmRsZXI8RT4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXJ5ID0gRXZlbnREZWxlZ2F0b3IucHJvY2Vzc1RhcmdldERlc2NyaXB0b3IodGFyZ2V0RGVzY3JpcHRvcik7XG5cbiAgICAvLyBJZiB0aGUgcXVlcnkgZmlsdGVyIGlzIGBcIjpob3N0XCJgLCBzZXQgdXAgYW4gb3duTGlzdGVuZXJcbiAgICBpZiAocXVlcnkgPT09IFwiOmhvc3RcIiB8fCBxdWVyeSA9PT0gXCI6SE9TVFwiKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEhhbmRsZXIpO1xuICAgICAgdGhpcy5fb3duTGlzdGVuZXJzLmFkZCh7XG4gICAgICAgIGhhbmRsZXI6IGV2ZW50SGFuZGxlciBhcyBFdmVudEhhbmRsZXIsXG4gICAgICAgIGV2ZW50OiBldmVudE5hbWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UsIHNldCB1cCBhIHJvb3QgbGlzdGVuZXJcbiAgICBpZiAoIXRoaXMuX2RlbGVnYXRvcikge1xuICAgICAgdGhpcy5fZGVsZWdhdG9yID0gbmV3IEV2ZW50RGVsZWdhdG9yKHRoaXMucm9vdCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGVsZWdhdG9yLmFkZExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyLCBxdWVyeSk7XG4gIH1cblxuICBzdG9wTGlzdGVuaW5nPEUgZXh0ZW5kcyBFdmVudE5hbWU+KFxuICAgIHRhcmdldERlc2NyaXB0b3I6IHN0cmluZyB8IHR5cGVvZiBDb21wb25lbnQ8YW55PiB8IEhUTUxFbGVtZW50LFxuICAgIGV2ZW50TmFtZTogRSxcbiAgICBldmVudEhhbmRsZXI6IEV2ZW50SGFuZGxlcjxFPixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgcXVlcnkgPSBFdmVudERlbGVnYXRvci5wcm9jZXNzVGFyZ2V0RGVzY3JpcHRvcih0YXJnZXREZXNjcmlwdG9yKTtcblxuICAgIC8vIElmIHRoZSBxdWVyeSBmaWx0ZXIgaXMgYFwiOmhvc3RcImAsIHJlbW92ZSBmcm9tIHRoZSBvd25MaXN0ZW5lciBsaXN0XG4gICAgaWYgKHF1ZXJ5ID09PSBcIjpob3N0XCIgfHwgcXVlcnkgPT09IFwiOkhPU1RcIikge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyIGFzIEV2ZW50SGFuZGxlcik7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX293bkxpc3RlbmVycykge1xuICAgICAgICBpZiAobGlzdGVuZXIuZXZlbnQgPT09IGV2ZW50TmFtZSAmJiBsaXN0ZW5lci5oYW5kbGVyID09PSBldmVudEhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLl9vd25MaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBkZWxlZ2F0b3IgaXMgbm90IHNldCB1cCwgdGhlcmUncyBub3RoaW5nIHRvIGRvXG4gICAgaWYgKCF0aGlzLl9kZWxlZ2F0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9kZWxlZ2F0b3IucmVtb3ZlTGlzdGVuZXIoXG4gICAgICBldmVudE5hbWUsXG4gICAgICBldmVudEhhbmRsZXIgYXMgRXZlbnRIYW5kbGVyLFxuICAgICAgcXVlcnksXG4gICAgKTtcbiAgfVxuXG4gIGRpc3BhdGNoRXZlbnQoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGlzcGF0Y2ggYSB7QGxpbmsgQ3VzdG9tRXZlbnR9IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBkZXRhaWxcbiAgICpcbiAgICogQGV4YW1wbGUgRGVmaW5pbmcgY3VzdG9tIGV2ZW50c1xuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlZmluZSB0eXBlcy4gVGhpcyBjYW4gaGFwcGVuIGluIHRoZSBzYW1lIGZpbGUgb3IgZWxzZXdoZXJlIGZvciBjb21tb25cbiAgICogLy8gYW5kIHNoYXJlZCBldmVudHMuXG4gICAqIGV4cG9ydCB0eXBlIE15RXZlbnQgPSBDdXN0b21FdmVudDxUPiAvLyBTZXQgYFRgIHRvIHRoZSBldmVudCBkZXRhaWwgdHlwZVxuICAgKlxuICAgKiBkZWNsYXJlIGdsb2JhbCB7XG4gICAqICBpbnRlcmZhY2UgR2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TWFwIHtcbiAgICogICAgXCJteS1ldmVudC1uYW1lXCI6IE15RXZlbnRcbiAgICogIH1cbiAgICogfVxuICAgKlxuICAgKiAvLyBEaXNwYXRjaCBhIGN1c3RvbSBldmVudFxuICAgKiB0aGlzLmRpc3BhdGNoRXZlbnQoXCJteS1ldmVudC1uYW1lXCIsIFQpO1xuICAgKlxuICAgKiAvLyBMaXN0ZW4gdG8gYSBjdXN0b20gZXZlbnRcbiAgICogJGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJteS1ldmVudC1uYW1lXCIsIC4uLik7XG4gICAqIGBgYFxuICAgKi9cbiAgZGlzcGF0Y2hFdmVudDxUPihcbiAgICBldmVudDogc3RyaW5nLFxuICAgIGRldGFpbD86IFQsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGJ1YmJsZXM6IGJvb2xlYW47XG4gICAgICBjYW5jZWxhYmxlOiBib29sZWFuO1xuICAgICAgY29tcG9zZWQ6IGJvb2xlYW47XG4gICAgfSxcbiAgKTogYm9vbGVhbjtcbiAgZGlzcGF0Y2hFdmVudDxUPihcbiAgICBldmVudDogc3RyaW5nIHwgRXZlbnQsXG4gICAgZGV0YWlsPzogVCxcbiAgICBvcHRpb25zPzoge1xuICAgICAgYnViYmxlczogYm9vbGVhbjtcbiAgICAgIGNhbmNlbGFibGU6IGJvb2xlYW47XG4gICAgICBjb21wb3NlZDogYm9vbGVhbjtcbiAgICB9LFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBFdmVudCkge1xuICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgICAgLi4uKG9wdGlvbnMgPz8ge30pLFxuICAgIH07XG5cbiAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudDxUPihldmVudCwge1xuICAgICAgICBkZXRhaWwsXG4gICAgICAgIC4uLm9wdHMsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcXVlcnlTZWxlY3RvcjxFIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KHF1ZXJ5OiBzdHJpbmcpOiBFIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jvb3QucXVlcnlTZWxlY3RvcihxdWVyeSk7XG4gIH1cblxuICBxdWVyeVNlbGVjdG9yQWxsPEUgZXh0ZW5kcyBIVE1MRWxlbWVudD4ocXVlcnk6IHN0cmluZyk6IE5vZGVMaXN0T2Y8RT4ge1xuICAgIHJldHVybiB0aGlzLl9yb290LnF1ZXJ5U2VsZWN0b3JBbGwocXVlcnkpIGFzIE5vZGVMaXN0T2Y8RT47XG4gIH1cblxuICBnZXRFbGVtZW50QnlJZDxFIGV4dGVuZHMgSFRNTEVsZW1lbnQ+KGlkOiBzdHJpbmcpOiBFIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuX3Jvb3QgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gdGhpcy5fcm9vdC5nZXRFbGVtZW50QnlJZChpZCkgYXMgRSB8IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBIVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3Rvci5jYWxsKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgIyR7aWR9YCxcbiAgICAgICkgYXMgRSB8IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVxdWlyZUVsZW1lbnRCeUlkPEUgZXh0ZW5kcyBIVE1MRWxlbWVudD4oaWQ6IHN0cmluZyk6IEUge1xuICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMuZ2V0RWxlbWVudEJ5SWQ8RT4oaWQpO1xuICAgIGlmICghbG9va3VwKSB7XG4gICAgICB0aHJvdyBuZXcgUGFsZXR0ZUVycm9yKEVycm9yQ29kZS5NSVNTSU5HX0VMRU1FTlQpO1xuICAgIH1cbiAgICByZXR1cm4gbG9va3VwO1xuICB9XG5cbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGFzIGFuIGF0dHJpYnV0ZSwgc2VyaWFsaXppbmcgdG8gYSBzdHJpbmcgb3IgYG51bGxgLlxuICAgKlxuICAgKiBudWxsIHZhbHVlcyBjYXVzZSB0aGUgYXR0cmlidXRlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGlzIGVsZW1lbnRcbiAgICovXG4gIHNldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgc2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gc2VyaWFsaXplQXR0cmlidXRlKHZhbHVlKTtcbiAgICBpZiAoc2VyaWFsaXplZCA9PT0gbnVsbCkge1xuICAgICAgSFRNTEVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZS5jYWxsKHRoaXMsIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBIVE1MRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlLmNhbGwodGhpcywgbmFtZSwgc2VyaWFsaXplZCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0QXR0cmlidXRlKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhdHRyaWJ1dGUgYXMgYSBudW1iZXIsIGZhbGxpbmcgYmFjayB0byBhIHNwZWNpZmllZCBkZWZhdWx0LlxuICAgKlxuICAgKlxuICAgKiBgbnVsbGAgYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQgYXMgYG51bGxgLCB3aGlsZSBzdHJpbmcgYXR0cmlidXRlcyBhcmVcbiAgICogcGFyc2VkIHVzaW5nIHRoZSBgTnVtYmVyKClgIGNvbnN0cnVjdG9yLlxuICAgKlxuICAgKiBWYWx1ZXMgd2hpY2ggZXZhbHVhdGUgdG8gTmFOIGFyZSByZXR1cm5lZCBhcyBgbnVsbGAuXG4gICAqL1xuICBnZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IG51bWJlcik6IG51bWJlcjtcblxuICAvKipcbiAgICogR2V0IGFuIGF0dHJpYnV0ZSBhcyBhIHN0cmluZywgZmFsbGluZyBiYWNrIHRvIGEgc3BlY2lmaWVkIGRlZmF1bHRcbiAgICovXG4gIGdldEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nKTogc3RyaW5nO1xuICBnZXRBdHRyaWJ1dGUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZT86IHN0cmluZyB8IG51bWJlcixcbiAgKTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsdWUgPSBIVE1MRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlLmNhbGwodGhpcywgbmFtZSk7XG5cbiAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG5cbiAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cblxuICAgIC8vIEludmFsaWQgZnVuY3Rpb24gaW52b2NhdGlvblxuICAgIHRocm93IG5ldyBQYWxldHRlRXJyb3IoRXJyb3JDb2RlLklOVkFSSUFOVCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgb24gdGhpcyBlbGVtZW50IGlmIHRoZSBwcm92aWRlZCB2YWx1ZVxuICAgKiBkaWZmZXJzIGZyb20gdGhlIGF0dHJpYnV0ZSB3aGVuIHNlcmlhbGl6ZWRcbiAgICovXG4gIHJlZmxlY3RBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICBjb25zdCByZWZsZWN0ZWQgPSBzZXJpYWxpemVBdHRyaWJ1dGUodmFsdWUpO1xuXG4gICAgaWYgKGN1cnJlbnQgIT09IHJlZmxlY3RlZCkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgcmVmbGVjdGVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoaXMgZWxlbWVudCB0byBhIHN0cmluZ1xuICAgKi9cbiAgdG9TdHJpbmcoZnVsbDogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gKHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIENvbXBvbmVudCkubmFtZTtcbiAgICBjb25zdCBhdHRyU3RyaW5nID0gdGhpcy5nZXRBdHRyaWJ1dGVOYW1lcygpXG4gICAgICAubWFwKChhdHRyTmFtZSkgPT4ge1xuICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgIHJldHVybiB2YWwgPyBgJHthdHRyTmFtZX09XCIke3ZhbH1cImAgOiBcIlwiO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiIFwiKTtcbiAgICBjb25zdCBhdHRycyA9IGF0dHJTdHJpbmcubGVuZ3RoID4gMCA/IGAgJHthdHRyU3RyaW5nfWAgOiBcIlwiO1xuXG4gICAgaWYgKGZ1bGwpIHtcbiAgICAgIHJldHVybiBgQ29tcG9uZW50PCR7bmFtZX0ke2F0dHJzfT5cXG4ke3RoaXMucm9vdC5pbm5lckhUTUx9XFxuPC8ke25hbWV9PmA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBDb21wb25lbnQ8JHtuYW1lfSR7YXR0cnN9PmA7XG4gIH1cbn1cbiIsCiAgICAiLypcbiAqIFRoaXMgU291cmNlIENvZGUgRm9ybSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGUgTW96aWxsYSBQdWJsaWNcbiAqIExpY2Vuc2UsIHYuIDIuMC4gSWYgYSBjb3B5IG9mIHRoZSBNUEwgd2FzIG5vdCBkaXN0cmlidXRlZCB3aXRoIHRoaXNcbiAqIGZpbGUsIFlvdSBjYW4gb2J0YWluIG9uZSBhdCBodHRwczovL21vemlsbGEub3JnL01QTC8yLjAvLlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuL2NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUge1xuICBBdHRyaWJ1dGVNYXAsXG4gIENvbXBvbmVudFN0eWxlcyxcbiAgQ29tcHV0ZWRQcm9wZXJ0aWVzLFxuICBMaXZlQXR0cmlidXRlcyxcbiAgU3RhdGVJbml0aWFsaXplcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgQkxBTktfVEVNUExBVEUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50U2hvcnRoYW5kPFN0YXRlU2hhcGUgZXh0ZW5kcyBvYmplY3QgPSB7fT4ge1xuICAvKipcbiAgICogQW4gSFRNTCBUZW1wbGF0ZSBlbGVtZW50IGZvciB0aGlzIGVsZW1lbnQgdG8gdXNlLlxuICAgKi9cbiAgdGVtcGxhdGU/OiBIVE1MVGVtcGxhdGVFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBBIHtAbGluayBDU1NTdHlsZVNoZWV0fSBhcnJheSB0byBhZG9wdCB0byB0aGUgZWxlbWVudCdzIHNoYWRvdyBET01cbiAgICovXG4gIHN0eWxlcz86IENvbXBvbmVudFN0eWxlcztcblxuICAvKipcbiAgICogVGhlIG1vZGUgZm9yIHRoaXMgQ29tcG9uZW50J3MgU2hhZG93Um9vdC5cbiAgICpcbiAgICogLSBgXCJvcGVuXCJgIGFsbG93cyBKUyBhY2Nlc3MgdG8gdGhlIGNoaWxkcmVuIG9mIHRoaXMgY29tcG9uZW50XG4gICAqIC0gYFwiY2xvc2VkXCJgIChkZWZhdWx0KSBkaXNhbGxvd3MgaW50ZXJuYWwgSlMgYWNjZXNzXG4gICAqL1xuICBzaGFkb3dSb290TW9kZT86IFwiY2xvc2VkXCIgfCBcIm9wZW5cIjtcblxuICAvKipcbiAgICogVGhlIGluaXRpYWwgc3RhdGUgZm9yIHRoaXMgQ29tcG9uZW50J3MgcmVhY3RpdmUgaW50ZXJuYWwgc3RhdGUsIGlmIGFueS5cbiAgICovXG4gIGluaXRpYWxTdGF0ZT86IFN0YXRlSW5pdGlhbGl6ZXI8U3RhdGVTaGFwZT47XG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBvciBmdW5jdGlvbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdoaWNoIHBvcHVsYXRlcyB0aGUgYGRhdGFgIHZhbHVlc1xuICAgKiBpbiB0aGUgdGVtcGxhdGluZyBlbmdpbmUuIFN1Y2ggdmFsdWVzIGFyZSBhY2Nlc3NlZCB1c2luZyB0aGUgYCpgIG5vdGF0aW9uLlxuICAgKi9cbiAgY29tcHV0ZWRQcm9wZXJ0aWVzPzogQ29tcHV0ZWRQcm9wZXJ0aWVzPFN0YXRlU2hhcGU+O1xuXG4gIC8qKlxuICAgKiBEZWNsYXJhdGlvbiBvZiBhdHRyaWJ1dGUgYmVoYXZpb3JzIGR1cmluZyB1cGRhdGVzLlxuICAgKi9cbiAgbGl2ZUF0dHJpYnV0ZXM/OiBMaXZlQXR0cmlidXRlczxTdGF0ZVNoYXBlPjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6YXRpb24gc2NyaXB0aW5nIGZvciB0aGlzIENvbXBvbmVudFxuICAgKi9cbiAgc2NyaXB0PzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPikgPT4gVm9pZEZ1bmN0aW9uIHwgdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBlYWNoIHRlbXBsYXRlIHVwZGF0ZVxuICAgKi9cbiAgYmVmb3JlVXBkYXRlPzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPikgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGVhY2ggdGVtcGxhdGUgdXBkYXRlXG4gICAqL1xuICBhZnRlclVwZGF0ZT86IChcbiAgICB0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4sXG4gICAgcHJldmlvdXNBdHRyaWJ1dGVzOiBBdHRyaWJ1dGVNYXAsXG4gICkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIGFzIHRoZSBmaW5hbCBsaWZlY3ljbGUgbWV0aG9kIGF0IHRoZSBlbmQgb2YgdGhlIHVubW91bnRpbmcgcHJvY2Vzcy5cbiAgICpcbiAgICogQ29udGVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIERPTSBhbmQgdGhlIGNvbXBvbmVudCBpcyBubyBsb25nZXJcbiAgICogY29uc2lkZXJlZCBtb3VudGVkIHdoZW4gdGhpcyBmdW5jdGlvbiBydW5zLlxuICAgKlxuICAgKiBVc2UgdGhpcyBmb3IgZmluYWwgY2xlYW51cCB0YXNrcyBhbmQgZnJlZWluZyByZXNvdXJjZXMuXG4gICAqL1xuICBmaW5hbGl6ZT86ICh0aGlzOiBDb21wb25lbnQ8U3RhdGVTaGFwZT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIElmIGRlZmluZWQsIHJlY2VpdmVzIGVycm9ycyBjYXVnaHQgZHVyaW5nIHRoZSBsaWZlY3ljbGUgbWV0aG9kcyBvZiB0aGlzXG4gICAqIGNvbXBvbmVudCBhbmQgaXQncyBjaGlsZHJlbi4gSWYgbm90IGRlZmluZWQsIHRoaXMgY29tcG9uZW50IHdpbGwgaW5zdGVhZFxuICAgKiB0aHJvdyBlcnJvcnMgYXMgdGhleSBhcmUgZm91bmQuXG4gICAqXG4gICAqIElmIHRoZSBlcnJvciBjYW5ub3QgYmUgaGFuZGxlZCwgYG9uRXJyb3IoKWAgc2hvdWxkIHJlLXRocm93IGl0IGZvciBhIGhpZ2hlclxuICAgKiB1cCBjb21wb25lbnQgdG8gZXZhbHVhdGUuXG4gICAqXG4gICAqIFRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSB3aGlsZSByZW1vdmluZyBhbiBlcnJvcmluZyBjb21wb25lbnQgZnJvbSB0aGVcbiAgICogRE9NLCB1c2UgYHRoaXMucmVwbGFjZVdpdGgoKWAgYW5kIGEgbmV3bHkgY29uc3RydWN0ZWQgcGxhY2Vob2xkZXIgZWxlbWVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogUmVjb3ZlcmluZyBmcm9tIGVycm9ycyBvciBkaXNwbGF5aW5nIGEgZmFsbGJhY2tcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBvbkVycm9yKGVycm9yKSB7XG4gICAqICAgLy8gSGFuZGxlIGtub3duIGVycm9yc1xuICAgKiAgIGlmIChlcnJvci5tZXNzYWdlID0gXCJJbnZhbGlkIElucHV0XCIpIHtcbiAgICogICAgIHRoaXMuc3RhdGUuaW5wdXQgPSBcIlwiO1xuICAgKiAgICAgcmV0dXJuO1xuICAgKiAgIH1cbiAgICpcbiAgICogICAvLyBEaXNwbGF5IGEgZmFsbGJhY2sgYmFubmVyXG4gICAqICAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICogICBiYW5uZXIudGV4dENvbnRlbnQgPSBcIkFuIHVuZXhwZWN0ZWQgZXJyb3IgZG9uZSBkaWRcIjtcbiAgICogICB0aGlzLnJlcGxhY2VXaXRoKGJhbm5lcik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBvbkVycm9yPzogKHRoaXM6IENvbXBvbmVudDxTdGF0ZVNoYXBlPiwgZXJyb3I6IHVua25vd24pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmU8U3RhdGVTaGFwZSBleHRlbmRzIG9iamVjdCA9IHt9PihcbiAgdGFnbmFtZTogc3RyaW5nLFxuICBkZWZpbml0aW9uOiBDb21wb25lbnRTaG9ydGhhbmQ8U3RhdGVTaGFwZT4sXG4pOiB0eXBlb2YgQ29tcG9uZW50PFN0YXRlU2hhcGU+IHtcbiAgY29uc3Qge1xuICAgIC8vIENvbmZpZ1xuICAgIHRlbXBsYXRlID0gQkxBTktfVEVNUExBVEUsXG4gICAgc3R5bGVzID0gW10sXG4gICAgc2hhZG93Um9vdE1vZGUgPSBcImNsb3NlZFwiLFxuICAgIGluaXRpYWxTdGF0ZSxcbiAgICBjb21wdXRlZFByb3BlcnRpZXMgPSB7fSxcbiAgICBsaXZlQXR0cmlidXRlcyA9IHt9LFxuXG4gICAgLy8gTGlmZWN5Y2xlXG4gICAgc2NyaXB0LFxuICAgIGJlZm9yZVVwZGF0ZSxcbiAgICBhZnRlclVwZGF0ZSxcbiAgICBmaW5hbGl6ZSxcbiAgICBvbkVycm9yLFxuICB9ID0gZGVmaW5pdGlvbjtcblxuICBjb25zdCBmdWxsT2JzZXJ2ZWRBdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShcbiAgICBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhsaXZlQXR0cmlidXRlcyldKSxcbiAgKTtcblxuICBjb25zdCBjbHMgPSBjbGFzcyBleHRlbmRzIENvbXBvbmVudDxTdGF0ZVNoYXBlPiB7XG4gICAgc3RhdGljIHRhZ05hbWUgPSB0YWduYW1lO1xuICAgIHN0YXRpYyB0ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHN0YXRpYyBzdHlsZXMgPSBzdHlsZXM7XG4gICAgc3RhdGljIG9ic2VydmVkQXR0cmlidXRlcyA9IFsuLi5mdWxsT2JzZXJ2ZWRBdHRyaWJ1dGVzXTtcbiAgICBzdGF0aWMgc2hhZG93Um9vdE1vZGUgPSBzaGFkb3dSb290TW9kZTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgc3VwZXIoKTtcblxuICAgICAgdGhpcy5pbml0aWFsU3RhdGUgPVxuICAgICAgICB0eXBlb2YgaW5pdGlhbFN0YXRlID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IGluaXRpYWxTdGF0ZS5iaW5kKHRoaXMpXG4gICAgICAgICAgOiBpbml0aWFsU3RhdGU7XG4gICAgICB0aGlzLmNvbXB1dGVkUHJvcGVydGllcyA9XG4gICAgICAgIHR5cGVvZiBjb21wdXRlZFByb3BlcnRpZXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gY29tcHV0ZWRQcm9wZXJ0aWVzLmJpbmQodGhpcylcbiAgICAgICAgICA6IGNvbXB1dGVkUHJvcGVydGllcztcbiAgICAgIHRoaXMubGl2ZUF0dHJpYnV0ZXMgPSBsaXZlQXR0cmlidXRlcztcblxuICAgICAgZm9yIChjb25zdCBkZWYgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmxpdmVBdHRyaWJ1dGVzKSkge1xuICAgICAgICBpZiAoZGVmLm9uQ2hhbmdlKSB7XG4gICAgICAgICAgZGVmLm9uQ2hhbmdlID0gZGVmLm9uQ2hhbmdlLmJpbmQodGhpcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVmLnJlZmxlY3QpIHtcbiAgICAgICAgICBkZWYucmVmbGVjdCA9IGRlZi5yZWZsZWN0LmJpbmQodGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5zY3JpcHQgPSBzY3JpcHQ/LmJpbmQodGhpcykgPz8gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5iZWZvcmVVcGRhdGUgPSBiZWZvcmVVcGRhdGU/LmJpbmQodGhpcykgPz8gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5hZnRlclVwZGF0ZSA9IGFmdGVyVXBkYXRlPy5iaW5kKHRoaXMpID8/IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZmluYWxpemUgPSBmaW5hbGl6ZT8uYmluZCh0aGlzKSA/PyB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm9uRXJyb3IgPSBvbkVycm9yPy5iaW5kKHRoaXMpID8/IHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgQ29tcG9uZW50LnJlZ2lzdGVyKGNscywgdGFnbmFtZSk7XG5cbiAgcmV0dXJuIGNscztcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUE0Q0EsU0FBUyxXQUFXLENBQUMsTUFBaUI7QUFBQSxFQUNwQyxNQUFNLGlCQUE0QztBQUFBLEtBQy9DLG9CQUFzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FNdEIsc0JBQXdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQU14Qix5QkFBeUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBTXpCLDRCQUE0QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQVU1Qiw0QkFBNEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxLQUs1QiwwQkFBMEI7QUFBQTtBQUFBO0FBQUE7QUFB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Q1osTUFBTTtBQUFBLE1BRU4sS0FBSyxlQUNILE9BQU8saUJBQWlCLGFBQ3BCLGFBQWEsS0FBSyxJQUFJLElBQ3RCO0FBQUEsTUFDTixLQUFLLHFCQUNILE9BQU8sdUJBQXVCLGFBQzFCLG1CQUFtQixLQUFLLElBQUksSUFDNUI7QUFBQSxNQUNOLEtBQUssaUJBQWlCO0FBQUEsTUFFdEIsV0FBVyxPQUFPLE9BQU8sT0FBTyxLQUFLLGNBQWMsR0FBRztBQUFBLFFBQ3BELElBQUksSUFBSSxVQUFVO0FBQUEsVUFDaEIsSUFBSSxXQUFXLElBQUksU0FBUyxLQUFLLElBQUk7QUFBQSxRQUN2QztBQUFBLFFBRUEsSUFBSSxJQUFJLFNBQVM7QUFBQSxVQUNmLElBQUksVUFBVSxJQUFJLFFBQVEsS0FBSyxJQUFJO0FBQUEsUUFDckM7QUFBQSxNQUNGO0FBQUEsTUFFQSxLQUFLLFNBQVMsUUFBUSxLQUFLLElBQUksS0FBSztBQUFBLE1BQ3BDLEtBQUssZUFBZSxjQUFjLEtBQUssSUFBSSxLQUFLO0FBQUEsTUFDaEQsS0FBSyxjQUFjLGFBQWEsS0FBSyxJQUFJLEtBQUs7QUFBQSxNQUM5QyxLQUFLLFdBQVcsVUFBVSxLQUFLLElBQUksS0FBSztBQUFBLE1BQ3hDLEtBQUssVUFBVSxTQUFTLEtBQUssSUFBSSxLQUFLO0FBQUE7QUFBQSxFQUUxQztBQUFBLEVBRUEsVUFBVSxTQUFTLEtBQUssT0FBTztBQUFBLEVBRS9CLE9BQU87QUFBQTsiLAogICJkZWJ1Z0lkIjogIjk3RkJGRUE2Mzg2MTIxNEI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|