@beiguancyc/parse-server 9.10.5-ruixiang.1 → 9.10.6-ruixiang.1
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/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +9 -2
- package/lib/Adapters/Storage/StorageAdapter.js +1 -1
- package/lib/Auth.js +10 -5
- package/lib/Controllers/SchemaController.js +8 -2
- package/lib/Options/Definitions.js +2 -2
- package/lib/Options/docs.js +2 -2
- package/lib/Options/index.js +1 -1
- package/lib/RestWrite.js +248 -32
- package/lib/Routers/SessionsRouter.js +5 -1
- package/lib/Utils.js +17 -1
- package/lib/cloud-code/Parse.Cloud.js +3 -1
- package/lib/triggers.js +4 -4
- package/package.json +1 -1
package/lib/RestWrite.js
CHANGED
|
@@ -111,6 +111,8 @@ RestWrite.prototype.execute = function () {
|
|
|
111
111
|
return this.checkRestrictedFields();
|
|
112
112
|
}).then(() => {
|
|
113
113
|
return this.resolveFileUrls();
|
|
114
|
+
}).then(() => {
|
|
115
|
+
return this.validateDotNotationKeys();
|
|
114
116
|
}).then(() => {
|
|
115
117
|
return this.runBeforeSaveTrigger();
|
|
116
118
|
}).then(() => {
|
|
@@ -141,7 +143,7 @@ RestWrite.prototype.execute = function () {
|
|
|
141
143
|
}).then(() => {
|
|
142
144
|
return this.cleanUserAuthData();
|
|
143
145
|
}).then(() => {
|
|
144
|
-
return this.
|
|
146
|
+
return this.filterUnreadableFieldsInResponse();
|
|
145
147
|
}).then(() => {
|
|
146
148
|
return this.filterProtectedFieldsInResponse();
|
|
147
149
|
}).then(() => {
|
|
@@ -306,6 +308,7 @@ RestWrite.prototype.runBeforeSaveTrigger = function () {
|
|
|
306
308
|
} catch (error) {
|
|
307
309
|
throw new Parse.Error(Parse.Error.INVALID_KEY_NAME, `${error}`);
|
|
308
310
|
}
|
|
311
|
+
this.validateDotNotationKeys();
|
|
309
312
|
if (response && response.object) {
|
|
310
313
|
// The trigger may have set file pointers without URL
|
|
311
314
|
return this.resolveFileUrls();
|
|
@@ -1007,6 +1010,7 @@ RestWrite.prototype.createSessionToken = async function () {
|
|
|
1007
1010
|
});
|
|
1008
1011
|
if (this.response && this.response.response) {
|
|
1009
1012
|
this.response.response.sessionToken = sessionData.sessionToken;
|
|
1013
|
+
this.storage.issuedSessionToken = sessionData.sessionToken;
|
|
1010
1014
|
}
|
|
1011
1015
|
return createSession();
|
|
1012
1016
|
};
|
|
@@ -1513,10 +1517,17 @@ RestWrite.prototype.runDatabaseOperation = function () {
|
|
|
1513
1517
|
}
|
|
1514
1518
|
return defer.then(() => {
|
|
1515
1519
|
// Run an update
|
|
1516
|
-
|
|
1520
|
+
// The unsanitized result of a client update carries the read access of the object
|
|
1521
|
+
const raw = !this.runOptions.many && !this.auth.isMaster && !this.auth.isMaintenance;
|
|
1522
|
+
return this.config.database.update(this.className, this.query, this.data, this.runOptions, raw, false, this.validSchemaController).catch(error => {
|
|
1517
1523
|
this._throwIfAuthDataDuplicate(error);
|
|
1518
1524
|
throw error;
|
|
1519
|
-
}).then(
|
|
1525
|
+
}).then(async result => {
|
|
1526
|
+
let response = result;
|
|
1527
|
+
if (raw) {
|
|
1528
|
+
this.writtenReadAccess = result._rperm;
|
|
1529
|
+
response = await this.config.database._sanitizeDatabaseResult(this.data, result);
|
|
1530
|
+
}
|
|
1520
1531
|
response.updatedAt = this.updatedAt;
|
|
1521
1532
|
this._updateResponseWithData(response, this.data);
|
|
1522
1533
|
this.response = {
|
|
@@ -1601,6 +1612,9 @@ RestWrite.prototype.runDatabaseOperation = function () {
|
|
|
1601
1612
|
response.username = this.data.username;
|
|
1602
1613
|
}
|
|
1603
1614
|
this._updateResponseWithData(response, this.data);
|
|
1615
|
+
// Read access as stored
|
|
1616
|
+
const acl = this.data.ACL;
|
|
1617
|
+
this.writtenReadAccess = acl ? Object.keys(acl).filter(key => acl[key].read) : null;
|
|
1604
1618
|
this.response = {
|
|
1605
1619
|
status: 201,
|
|
1606
1620
|
response,
|
|
@@ -1643,6 +1657,8 @@ RestWrite.prototype.runAfterSaveTrigger = function () {
|
|
|
1643
1657
|
return triggers.maybeRunTrigger(triggers.Types.afterSave, this.auth, updatedObject, originalObject, this.config, this.context).then(result => {
|
|
1644
1658
|
const jsonReturned = result && !result._toFullJSON;
|
|
1645
1659
|
if (jsonReturned) {
|
|
1660
|
+
// The returned object is the response as is
|
|
1661
|
+
this.storage.responseFromTrigger = true;
|
|
1646
1662
|
this.pendingOps.operations = {};
|
|
1647
1663
|
this.response.response = result;
|
|
1648
1664
|
} else {
|
|
@@ -1678,6 +1694,114 @@ RestWrite.prototype.sanitizedData = function () {
|
|
|
1678
1694
|
return Parse._decode(undefined, data);
|
|
1679
1695
|
};
|
|
1680
1696
|
|
|
1697
|
+
// A raw view of the object's fields (stored values overlaid with whole-field
|
|
1698
|
+
// writes in this request) used to resolve whether a dot notation key targets a
|
|
1699
|
+
// pointer's object ID.
|
|
1700
|
+
RestWrite.prototype._dotNotationFieldRoot = function () {
|
|
1701
|
+
const root = Object.assign({}, this.originalData);
|
|
1702
|
+
if (this.data) {
|
|
1703
|
+
for (const key of Object.keys(this.data)) {
|
|
1704
|
+
if (key.indexOf('.') < 0) {
|
|
1705
|
+
root[key] = this.data[key];
|
|
1706
|
+
}
|
|
1707
|
+
}
|
|
1708
|
+
}
|
|
1709
|
+
return root;
|
|
1710
|
+
};
|
|
1711
|
+
const prohibitedDotNotationKey = key => new Parse.Error(Parse.Error.INVALID_KEY_NAME, `Prohibited dot notation key in request data: ${JSON.stringify(key)}.`);
|
|
1712
|
+
|
|
1713
|
+
// Values the SDK decodes to an instance rather than a plain object: an operation or a
|
|
1714
|
+
// typed value
|
|
1715
|
+
const decodesToInstance = value => {
|
|
1716
|
+
if (typeof value.__op === 'string') {
|
|
1717
|
+
return true;
|
|
1718
|
+
}
|
|
1719
|
+
switch (value.__type) {
|
|
1720
|
+
case 'Pointer':
|
|
1721
|
+
case 'Object':
|
|
1722
|
+
return !!value.className;
|
|
1723
|
+
case 'Relation':
|
|
1724
|
+
case 'Date':
|
|
1725
|
+
case 'File':
|
|
1726
|
+
case 'GeoPoint':
|
|
1727
|
+
case 'Polygon':
|
|
1728
|
+
return true;
|
|
1729
|
+
default:
|
|
1730
|
+
return false;
|
|
1731
|
+
}
|
|
1732
|
+
};
|
|
1733
|
+
|
|
1734
|
+
// Whether the SDK would resolve a non-leaf segment of the key, from the given depth
|
|
1735
|
+
// on, through the prototype chain of the container instead of an own key, writing
|
|
1736
|
+
// the final segment onto a shared built-in.
|
|
1737
|
+
const descendsIntoPrototype = (container, segments, depth = 0) => {
|
|
1738
|
+
for (let i = depth; i < segments.length - 1; i++) {
|
|
1739
|
+
if (container === null || typeof container !== 'object') {
|
|
1740
|
+
return false;
|
|
1741
|
+
}
|
|
1742
|
+
// A further segment walks the prototype of the decoded instance
|
|
1743
|
+
if (decodesToInstance(container)) {
|
|
1744
|
+
return true;
|
|
1745
|
+
}
|
|
1746
|
+
const segment = segments[i];
|
|
1747
|
+
if (!hasOwn(container, segment)) {
|
|
1748
|
+
// An inherited member of a nested value resolves to a shared built-in; the root
|
|
1749
|
+
// has no prototype in the SDK, and a missing key is created fresh
|
|
1750
|
+
return i > 0 && segment in container;
|
|
1751
|
+
}
|
|
1752
|
+
container = container[segment];
|
|
1753
|
+
}
|
|
1754
|
+
return false;
|
|
1755
|
+
};
|
|
1756
|
+
|
|
1757
|
+
// The container a written value provides for keys below it: the value itself, or
|
|
1758
|
+
// the elements an array operation adds
|
|
1759
|
+
const writtenContainer = value => {
|
|
1760
|
+
if (value === null || typeof value !== 'object') {
|
|
1761
|
+
return undefined;
|
|
1762
|
+
}
|
|
1763
|
+
if (typeof value.__op === 'string') {
|
|
1764
|
+
return Array.isArray(value.objects) ? value.objects : undefined;
|
|
1765
|
+
}
|
|
1766
|
+
return value;
|
|
1767
|
+
};
|
|
1768
|
+
|
|
1769
|
+
// Rejects a dot notation key that the SDK would apply through a prototype member of
|
|
1770
|
+
// the stored object (the trigger object is built from it before the other fields of
|
|
1771
|
+
// this request are applied), of the object as written by this request, or of a value
|
|
1772
|
+
// another key of this request writes above it.
|
|
1773
|
+
RestWrite.prototype.validateDotNotationKeys = function () {
|
|
1774
|
+
const keys = Object.keys(this.data);
|
|
1775
|
+
const keySet = new Set(keys);
|
|
1776
|
+
const roots = [this._dotNotationFieldRoot()];
|
|
1777
|
+
if (this.originalData) {
|
|
1778
|
+
roots.push(this.originalData);
|
|
1779
|
+
}
|
|
1780
|
+
// Only a key that is a prefix of this key, ending on a segment boundary, writes above it
|
|
1781
|
+
const writtenAbove = segments => {
|
|
1782
|
+
let prefix = segments[0];
|
|
1783
|
+
for (let depth = 1; depth < segments.length - 1; depth++) {
|
|
1784
|
+
if (keySet.has(prefix)) {
|
|
1785
|
+
const container = writtenContainer(this.data[prefix]);
|
|
1786
|
+
if (container !== undefined && descendsIntoPrototype(container, segments, depth)) {
|
|
1787
|
+
return true;
|
|
1788
|
+
}
|
|
1789
|
+
}
|
|
1790
|
+
prefix += `.${segments[depth]}`;
|
|
1791
|
+
}
|
|
1792
|
+
return false;
|
|
1793
|
+
};
|
|
1794
|
+
for (const key of keys) {
|
|
1795
|
+
if (key.indexOf('.') < 0) {
|
|
1796
|
+
continue;
|
|
1797
|
+
}
|
|
1798
|
+
const segments = key.split('.');
|
|
1799
|
+
if (roots.some(root => descendsIntoPrototype(root, segments)) || writtenAbove(segments)) {
|
|
1800
|
+
throw prohibitedDotNotationKey(key);
|
|
1801
|
+
}
|
|
1802
|
+
}
|
|
1803
|
+
};
|
|
1804
|
+
|
|
1681
1805
|
// Returns an updated copy of the object
|
|
1682
1806
|
RestWrite.prototype.buildParseObjects = function () {
|
|
1683
1807
|
const extraData = {
|
|
@@ -1704,11 +1828,14 @@ RestWrite.prototype.buildParseObjects = function () {
|
|
|
1704
1828
|
}
|
|
1705
1829
|
}
|
|
1706
1830
|
const updatedObject = triggers.inflate(extraData, this.originalData);
|
|
1831
|
+
const pointerRoot = this._dotNotationFieldRoot();
|
|
1707
1832
|
Object.keys(this.data).reduce(function (data, key) {
|
|
1708
1833
|
if (key.indexOf('.') > 0) {
|
|
1709
1834
|
// Null and undefined are set at their own dot notation path, like an operation
|
|
1710
1835
|
if (data[key] == null || typeof data[key].__op === 'string') {
|
|
1711
|
-
|
|
1836
|
+
// A dot notation key that removes a pointer's object ID would leave the
|
|
1837
|
+
// pointer unserializable and break the trigger object, so skip it.
|
|
1838
|
+
if (!readOnlyAttributes.includes(key) && !targetsPointerId(pointerRoot, key)) {
|
|
1712
1839
|
// The SDK key name rules apply to top-level fields only
|
|
1713
1840
|
updatedObject.set(key, data[key], {
|
|
1714
1841
|
ignoreValidation: true
|
|
@@ -1796,6 +1923,22 @@ const getOwnPath = (object, path) => {
|
|
|
1796
1923
|
return value;
|
|
1797
1924
|
};
|
|
1798
1925
|
|
|
1926
|
+
// Whether a dot notation key targets a pointer's object ID (`id`/`objectId`).
|
|
1927
|
+
// Removing it leaves the pointer unserializable (`toPointer` throws), which
|
|
1928
|
+
// corrupts the trigger object; other sub-keys below a pointer are left to the
|
|
1929
|
+
// existing handling.
|
|
1930
|
+
const targetsPointerId = (root, key) => {
|
|
1931
|
+
const segments = key.split('.');
|
|
1932
|
+
for (let depth = 1; depth < segments.length; depth++) {
|
|
1933
|
+
const parent = getOwnPath(root, segments.slice(0, depth));
|
|
1934
|
+
if (parent !== null && typeof parent === 'object' && parent.__type === 'Pointer') {
|
|
1935
|
+
const next = segments[depth];
|
|
1936
|
+
return next === 'id' || next === 'objectId';
|
|
1937
|
+
}
|
|
1938
|
+
}
|
|
1939
|
+
return false;
|
|
1940
|
+
};
|
|
1941
|
+
|
|
1799
1942
|
// Restores a reverted dot notation key in the response
|
|
1800
1943
|
RestWrite.prototype._restoreRevertedPath = function (response, writeData, written, key, finalObject) {
|
|
1801
1944
|
// A write at or beneath the key governs
|
|
@@ -1880,44 +2023,117 @@ RestWrite.prototype._restoreRevertedPath = function (response, writeData, writte
|
|
|
1880
2023
|
} : value;
|
|
1881
2024
|
};
|
|
1882
2025
|
|
|
1883
|
-
//
|
|
1884
|
-
RestWrite.prototype.
|
|
2026
|
+
// Whether the reader can read the written object, or undefined if only a read can tell
|
|
2027
|
+
RestWrite.prototype._readAccessWithoutQuery = function (aclGroup) {
|
|
2028
|
+
const readers = this.writtenReadAccess;
|
|
2029
|
+
if (readers === undefined || readers !== null && !Array.isArray(readers)) {
|
|
2030
|
+
return undefined;
|
|
2031
|
+
}
|
|
2032
|
+
// Every client read applies the object ACL
|
|
2033
|
+
if (readers && !readers.some(reader => aclGroup.includes(reader))) {
|
|
2034
|
+
return false;
|
|
2035
|
+
}
|
|
2036
|
+
// afterSave may change the object after the write
|
|
2037
|
+
if (triggers.triggerExists(this.className, triggers.Types.afterSave, this.config.applicationId)) {
|
|
2038
|
+
return undefined;
|
|
2039
|
+
}
|
|
2040
|
+
// System classes have their own read rules, except for a created user, installation or role
|
|
2041
|
+
if (this.className.startsWith('_') && (this.query || !['_User', '_Installation', '_Role'].includes(this.className))) {
|
|
2042
|
+
return undefined;
|
|
2043
|
+
}
|
|
2044
|
+
if (this.validSchemaController.testPermissionsForClassName(this.className, aclGroup, 'get')) {
|
|
2045
|
+
return true;
|
|
2046
|
+
}
|
|
2047
|
+
};
|
|
2048
|
+
|
|
2049
|
+
// Returns stored values in a save response only as the caller can read them
|
|
2050
|
+
RestWrite.prototype.filterUnreadableFieldsInResponse = async function () {
|
|
1885
2051
|
const response = this.response?.response;
|
|
1886
|
-
if (!
|
|
2052
|
+
if (!response || this.storage.responseFromTrigger) {
|
|
2053
|
+
return;
|
|
2054
|
+
}
|
|
2055
|
+
// Login and session requests build their own response
|
|
2056
|
+
if (!this.query && this.writtenReadAccess === undefined) {
|
|
1887
2057
|
return;
|
|
1888
2058
|
}
|
|
1889
2059
|
if (this.auth.isMaster || this.auth.isMaintenance) {
|
|
1890
2060
|
return;
|
|
1891
2061
|
}
|
|
1892
|
-
|
|
1893
|
-
const
|
|
1894
|
-
|
|
1895
|
-
const
|
|
1896
|
-
|
|
2062
|
+
// A session token issued by this request is not a stored value
|
|
2063
|
+
const issued = this.storage.issuedSessionToken;
|
|
2064
|
+
// Nor is a required column that echoes the caller's unchanged input
|
|
2065
|
+
const echoed = key => (_SchemaController.requiredColumns.read[this.className] || []).includes(key) && !(this.storage.fieldsChangedByTrigger || []).includes(key) && !(key === 'username' && this.responseShouldHaveUsername) && util.isDeepStrictEqual(response[key], this.data[key]);
|
|
2066
|
+
const fields = Object.keys(response).filter(key => !['objectId', 'createdAt', 'updatedAt'].includes(key) && !(key === 'sessionToken' && issued && response[key] === issued) && !echoed(key));
|
|
2067
|
+
if (!fields.length) {
|
|
2068
|
+
return;
|
|
2069
|
+
}
|
|
2070
|
+
let reverted = [];
|
|
2071
|
+
// A created object has no stored value to restore
|
|
2072
|
+
if (this.query && this.pendingOps.operations) {
|
|
2073
|
+
const stateController = Parse.CoreManager.getObjectStateController();
|
|
2074
|
+
const [pending] = stateController.getPendingOps(this.pendingOps.identifier);
|
|
2075
|
+
reverted = Object.keys(this.pendingOps.operations).filter(key => !pending[key]);
|
|
2076
|
+
}
|
|
2077
|
+
const keys = fields.filter(key => reverted.some(path => path === key || path.startsWith(`${key}.`)));
|
|
2078
|
+
// A sign-up response is for the new user if it issues the new user a session
|
|
2079
|
+
const signUp = !this.query && this.className === '_User' && !!issued;
|
|
2080
|
+
const aclGroup = signUp ? ['*', this.data.objectId] : this.runOptions.acl || [];
|
|
2081
|
+
const readable = this._readAccessWithoutQuery(aclGroup);
|
|
2082
|
+
if (readable && !keys.length) {
|
|
1897
2083
|
return;
|
|
1898
2084
|
}
|
|
1899
2085
|
let view;
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
2086
|
+
if (readable !== false) {
|
|
2087
|
+
try {
|
|
2088
|
+
const query = await (0, _RestQuery.default)({
|
|
2089
|
+
method: _RestQuery.default.Method.get,
|
|
2090
|
+
config: this.config,
|
|
2091
|
+
auth: signUp ? new Auth.Auth({
|
|
2092
|
+
config: this.config,
|
|
2093
|
+
isMaster: false,
|
|
2094
|
+
user: Parse.Object.fromJSON({
|
|
2095
|
+
className: '_User',
|
|
2096
|
+
objectId: this.data.objectId
|
|
2097
|
+
}),
|
|
2098
|
+
installationId: this.auth.installationId
|
|
2099
|
+
}) : this.auth,
|
|
2100
|
+
className: this.className,
|
|
2101
|
+
restWhere: {
|
|
2102
|
+
// A session update wraps the addressed objectId
|
|
2103
|
+
objectId: this.query ? this.query.objectId ?? this.query.$and?.[0]?.objectId : this.data.objectId
|
|
2104
|
+
},
|
|
2105
|
+
// A secondary may not have the write yet
|
|
2106
|
+
restOptions: {
|
|
2107
|
+
readPreference: 'primary'
|
|
2108
|
+
},
|
|
2109
|
+
runBeforeFind: false,
|
|
2110
|
+
runAfterFind: false,
|
|
2111
|
+
context: this.context
|
|
2112
|
+
});
|
|
2113
|
+
view = (await query.execute()).results[0];
|
|
2114
|
+
} catch (error) {
|
|
2115
|
+
// Fails closed; access denial is expected
|
|
2116
|
+
const denied = [Parse.Error.OPERATION_FORBIDDEN, Parse.Error.OBJECT_NOT_FOUND];
|
|
2117
|
+
if (!(error instanceof Parse.Error) || !denied.includes(error.code)) {
|
|
2118
|
+
_logger.default.warn('Failed to read the object for the save response', error);
|
|
2119
|
+
}
|
|
1919
2120
|
}
|
|
1920
2121
|
}
|
|
2122
|
+
if (!view) {
|
|
2123
|
+
// No stored values for a caller who cannot read the object
|
|
2124
|
+
for (const key of fields) {
|
|
2125
|
+
delete response[key];
|
|
2126
|
+
}
|
|
2127
|
+
for (const field of new Set(fields.map(key => key.split('.')[0]))) {
|
|
2128
|
+
// The SDK cannot apply an operation to ACL
|
|
2129
|
+
if (field !== 'ACL') {
|
|
2130
|
+
response[field] = {
|
|
2131
|
+
__op: 'Delete'
|
|
2132
|
+
};
|
|
2133
|
+
}
|
|
2134
|
+
}
|
|
2135
|
+
return;
|
|
2136
|
+
}
|
|
1921
2137
|
for (const key of keys) {
|
|
1922
2138
|
// Removed beneath a key the caller cannot read
|
|
1923
2139
|
if (!hasOwn(response, key)) {
|
|
@@ -2018,4 +2234,4 @@ RestWrite.prototype._updateResponseWithData = function (response, data, isFinalO
|
|
|
2018
2234
|
};
|
|
2019
2235
|
var _default = exports.default = RestWrite;
|
|
2020
2236
|
module.exports = RestWrite;
|
|
2021
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUmVzdFF1ZXJ5IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbG9kYXNoIiwiX2xvZ2dlciIsIl9TY2hlbWFDb250cm9sbGVyIiwiX0Vycm9yIiwiX0F1dGhEYXRhTG9jayIsIkluc3RhbGxhdGlvbkRlZHVwIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJkZWZhdWx0IiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJTY2hlbWFDb250cm9sbGVyIiwiQXV0aCIsIlV0aWxzIiwiY3J5cHRvVXRpbHMiLCJwYXNzd29yZENyeXB0byIsIlBhcnNlIiwidHJpZ2dlcnMiLCJ1dGlsIiwiUmVzdFdyaXRlIiwiY29uZmlnIiwiYXV0aCIsImNsYXNzTmFtZSIsInF1ZXJ5IiwiZGF0YSIsIm9yaWdpbmFsRGF0YSIsImNvbnRleHQiLCJhY3Rpb24iLCJpc1JlYWRPbmx5IiwiY3JlYXRlU2FuaXRpemVkRXJyb3IiLCJFcnJvciIsIk9QRVJBVElPTl9GT1JCSURERU4iLCJzdG9yYWdlIiwicnVuT3B0aW9ucyIsImFsbG93Q3VzdG9tT2JqZWN0SWQiLCJwcm90b3R5cGUiLCJvYmplY3RJZCIsIk1JU1NJTkdfT0JKRUNUX0lEIiwiSU5WQUxJRF9LRVlfTkFNRSIsImlkIiwicmVzcG9uc2UiLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJ1cGRhdGVkQXQiLCJfZW5jb2RlIiwiRGF0ZSIsImlzbyIsInZhbGlkU2NoZW1hQ29udHJvbGxlciIsInBlbmRpbmdPcHMiLCJvcGVyYXRpb25zIiwiaWRlbnRpZmllciIsImV4ZWN1dGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJjaGVja0ludGVybmFsRmllbGRzIiwiZ2V0VXNlckFuZFJvbGVBQ0wiLCJ2YWxpZGF0ZUNsaWVudENsYXNzQ3JlYXRpb24iLCJoYW5kbGVJbnN0YWxsYXRpb24iLCJoYW5kbGVTZXNzaW9uIiwiYXV0aG9yaXplVXNlclVwZGF0ZSIsInZhbGlkYXRlQXV0aERhdGEiLCJjaGVja1Jlc3RyaWN0ZWRGaWVsZHMiLCJyZXNvbHZlRmlsZVVybHMiLCJydW5CZWZvcmVTYXZlVHJpZ2dlciIsImVuc3VyZVVuaXF1ZUF1dGhEYXRhSWQiLCJkZWxldGVFbWFpbFJlc2V0VG9rZW5JZk5lZWRlZCIsInZhbGlkYXRlV3JpdGVQZXJtaXNzaW9uIiwidmFsaWRhdGVTY2hlbWEiLCJzY2hlbWFDb250cm9sbGVyIiwic2V0UmVxdWlyZWRGaWVsZHNJZk5lZWRlZCIsInRyYW5zZm9ybVVzZXIiLCJleHBhbmRGaWxlc0ZvckV4aXN0aW5nT2JqZWN0cyIsImRlc3Ryb3lEdXBsaWNhdGVkU2Vzc2lvbnMiLCJydW5EYXRhYmFzZU9wZXJhdGlvbiIsImNyZWF0ZVNlc3Npb25Ub2tlbklmTmVlZGVkIiwiaGFuZGxlRm9sbG93dXAiLCJydW5BZnRlclNhdmVUcmlnZ2VyIiwiY2xlYW5Vc2VyQXV0aERhdGEiLCJmaWx0ZXJSZXZlcnRlZEZpZWxkc0luUmVzcG9uc2UiLCJmaWx0ZXJQcm90ZWN0ZWRGaWVsZHNJblJlc3BvbnNlIiwiYXV0aERhdGFSZXNwb25zZSIsInJlamVjdFNpZ251cCIsInByZXZlbnRTaWdudXBXaXRoVW52ZXJpZmllZEVtYWlsIiwiRU1BSUxfTk9UX0ZPVU5EIiwiaXNNYXN0ZXIiLCJpc01haW50ZW5hbmNlIiwiYWNsIiwidXNlciIsImdldFVzZXJSb2xlcyIsInJvbGVzIiwiY29uY2F0IiwiYWxsb3dDbGllbnRDbGFzc0NyZWF0aW9uIiwic3lzdGVtQ2xhc3NlcyIsImluZGV4T2YiLCJkYXRhYmFzZSIsImxvYWRTY2hlbWEiLCJoYXNDbGFzcyIsInZhbGlkYXRlT2JqZWN0IiwiZmlsZXMiLCJjcmVhdGUiLCJjb2xsZWN0IiwidmFsdWUiLCJfX3R5cGUiLCJuYW1lIiwiSU5DT1JSRUNUX1RZUEUiLCJ1cmwiLCJ2YWx1ZXMiLCJmb3JFYWNoIiwia2V5cyIsImxlbmd0aCIsImZpbGVzQ29udHJvbGxlciIsImV4cGFuZEZpbGVzSW5PYmplY3QiLCJmaWxlVXJscyIsImFzc2lnbiIsImNsb25lV2l0aEZpbGVVcmxzIiwib2JqZWN0IiwiYWRkVXJscyIsImZpbGUiLCJtYW55IiwidHJpZ2dlckV4aXN0cyIsIlR5cGVzIiwiYmVmb3JlU2F2ZSIsImFwcGxpY2F0aW9uSWQiLCJvcmlnaW5hbE9iamVjdCIsInVwZGF0ZWRPYmplY3QiLCJidWlsZFBhcnNlT2JqZWN0cyIsIl9nZXRTdGF0ZUlkZW50aWZpZXIiLCJzdGF0ZUNvbnRyb2xsZXIiLCJDb3JlTWFuYWdlciIsImdldE9iamVjdFN0YXRlQ29udHJvbGxlciIsInBlbmRpbmciLCJnZXRQZW5kaW5nT3BzIiwiZGF0YWJhc2VQcm9taXNlIiwidXBkYXRlIiwicmVzdWx0IiwiT0JKRUNUX05PVF9GT1VORCIsIm1heWJlUnVuVHJpZ2dlciIsImZpZWxkc0NoYW5nZWRCeVRyaWdnZXIiLCJfIiwicmVkdWNlIiwia2V5IiwiaXNFcXVhbCIsInB1c2giLCJjaGVja1Byb2hpYml0ZWRLZXl3b3JkcyIsImVycm9yIiwicnVuQmVmb3JlTG9naW5UcmlnZ2VyIiwidXNlckRhdGEiLCJiZWZvcmVMb2dpbiIsImV4dHJhRGF0YSIsImluZmxhdGUiLCJnZXRBbGxDbGFzc2VzIiwiYWxsQ2xhc3NlcyIsInNjaGVtYSIsImZpbmQiLCJvbmVDbGFzcyIsInNldFJlcXVpcmVkRmllbGRJZk5lZWRlZCIsImZpZWxkTmFtZSIsInNldERlZmF1bHQiLCJ1bmRlZmluZWQiLCJfX29wIiwiZmllbGRzIiwiZGVmYXVsdFZhbHVlIiwicmVxdWlyZWQiLCJWQUxJREFUSU9OX0VSUk9SIiwiY2xhc3NMZXZlbFBlcm1pc3Npb25zIiwiQUNMIiwiSlNPTiIsInN0cmluZ2lmeSIsInJlYWQiLCJ3cml0ZSIsImN1cnJlbnRVc2VyIiwiY3JlYXRlZEF0IiwibmV3T2JqZWN0SWQiLCJvYmplY3RJZFNpemUiLCJhdXRoRGF0YSIsImhhc1VzZXJuYW1lQW5kUGFzc3dvcmQiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiaGFzQXV0aERhdGEiLCJzb21lIiwicHJvdmlkZXIiLCJwcm92aWRlckRhdGEiLCJyZXF1aXJlc0NyZWRlbnRpYWxzIiwiaXNNaXNzaW5nIiwiaXNFbXB0eSIsImNoZWNrVXNlcm5hbWUiLCJjaGVja1Bhc3N3b3JkIiwiVVNFUk5BTUVfTUlTU0lORyIsIlBBU1NXT1JEX01JU1NJTkciLCJVTlNVUFBPUlRFRF9TRVJWSUNFIiwicHJvdmlkZXJzIiwiY2FuSGFuZGxlQXV0aERhdGEiLCJwcm92aWRlckF1dGhEYXRhIiwiZ2V0VXNlcklkIiwiaGFuZGxlQXV0aERhdGEiLCJmaWx0ZXJlZE9iamVjdHNCeUFDTCIsIm9iamVjdHMiLCJmaWx0ZXIiLCJfdGhyb3dJZkF1dGhEYXRhRHVwbGljYXRlIiwiY29kZSIsIkRVUExJQ0FURV9WQUxVRSIsInVzZXJJbmZvIiwiZHVwbGljYXRlZF9maWVsZCIsInN0YXJ0c1dpdGgiLCJBQ0NPVU5UX0FMUkVBRFlfTElOS0VEIiwiaGFzQXV0aERhdGFJZCIsImZpbmRVc2Vyc1dpdGhBdXRoRGF0YSIsInJlc3VsdHMiLCJ1c2VySWQiLCJjdXJyZW50VXNlckF1dGhEYXRhIiwiaXNMb2dpbiIsInVzZXJSZXN1bHQiLCJmb3VuZFVzZXJJc05vdEN1cnJlbnRVc2VyIiwiaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uIiwidmFsaWRhdGVkQXV0aERhdGEiLCJhdXRoUHJvdmlkZXIiLCJqb2luIiwiaGFzTXV0YXRlZEF1dGhEYXRhIiwibXV0YXRlZEF1dGhEYXRhIiwiaXNDdXJyZW50VXNlckxvZ2dlZE9yTWFzdGVyIiwibG9jYXRpb24iLCJjaGVja0lmVXNlckhhc1Byb3ZpZGVkQ29uZmlndXJlZFByb3ZpZGVyc0ZvckxvZ2luIiwiYWxsb3dFeHBpcmVkQXV0aERhdGFUb2tlbiIsInJlcyIsIm9yaWdpbmFsQXV0aERhdGEiLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJtYXAiLCJrIiwidiIsImFwcGx5QXV0aERhdGFPcHRpbWlzdGljTG9jayIsIlNDUklQVF9GQUlMRUQiLCJjaGFyQXQiLCJ2YWxpZGF0ZVBlcm1pc3Npb24iLCJpc1VuYXV0aGVudGljYXRlZCIsIlNFU1NJT05fTUlTU0lORyIsInByb21pc2UiLCJSZXN0UXVlcnkiLCJtZXRob2QiLCJNZXRob2QiLCJtYXN0ZXIiLCJydW5CZWZvcmVGaW5kIiwicmVzdFdoZXJlIiwic2Vzc2lvbiIsImNhY2hlQ29udHJvbGxlciIsImRlbCIsInNlc3Npb25Ub2tlbiIsIl92YWxpZGF0ZVBhc3N3b3JkUG9saWN5IiwiaGFzaCIsImhhc2hlZFBhc3N3b3JkIiwiX2hhc2hlZF9wYXNzd29yZCIsIl92YWxpZGF0ZVVzZXJOYW1lIiwiX3ZhbGlkYXRlRW1haWwiLCJyYW5kb21TdHJpbmciLCJyZXNwb25zZVNob3VsZEhhdmVVc2VybmFtZSIsIiRuZSIsImxpbWl0IiwiY2FzZUluc2Vuc2l0aXZlIiwiVVNFUk5BTUVfVEFLRU4iLCJidWlsZENyZWF0ZWRXaXRoIiwiZ2V0Q3JlYXRlZFdpdGgiLCJjcmVhdGVkV2l0aCIsImlzQ3JlYXRlT3BlcmF0aW9uIiwiYXV0aERhdGFQcm92aWRlciIsInJlc29sdmVkQXV0aFByb3ZpZGVyIiwiZW1haWwiLCJtYXRjaCIsInJlamVjdCIsIklOVkFMSURfRU1BSUxfQUREUkVTUyIsIkVNQUlMX1RBS0VOIiwicmVxdWVzdCIsIm9yaWdpbmFsIiwiaXAiLCJpbnN0YWxsYXRpb25JZCIsInVzZXJDb250cm9sbGVyIiwic2V0RW1haWxWZXJpZnlUb2tlbiIsInBhc3N3b3JkUG9saWN5IiwiX3ZhbGlkYXRlUGFzc3dvcmRSZXF1aXJlbWVudHMiLCJfdmFsaWRhdGVQYXNzd29yZEhpc3RvcnkiLCJwb2xpY3lFcnJvciIsInZhbGlkYXRpb25FcnJvciIsImNvbnRhaW5zVXNlcm5hbWVFcnJvciIsInBhdHRlcm5WYWxpZGF0b3IiLCJ2YWxpZGF0b3JDYWxsYmFjayIsImRvTm90QWxsb3dVc2VybmFtZSIsIm1heFBhc3N3b3JkSGlzdG9yeSIsIm1haW50ZW5hbmNlIiwib2xkUGFzc3dvcmRzIiwiX3Bhc3N3b3JkX2hpc3RvcnkiLCJ0YWtlIiwibmV3UGFzc3dvcmQiLCJwcm9taXNlcyIsImNvbXBhcmUiLCJhbGwiLCJjYXRjaCIsImVyciIsInZlcmlmeVVzZXJFbWFpbHMiLCJwcmV2ZW50TG9naW5XaXRoVW52ZXJpZmllZEVtYWlsIiwiY3JlYXRlU2Vzc2lvblRva2VuIiwic2Vzc2lvbkRhdGEiLCJjcmVhdGVTZXNzaW9uIiwiYWRkaXRpb25hbFNlc3Npb25EYXRhIiwidG9rZW4iLCJuZXdUb2tlbiIsImV4cGlyZXNBdCIsImdlbmVyYXRlU2Vzc2lvbkV4cGlyZXNBdCIsImFkZE9wcyIsIl9wZXJpc2hhYmxlX3Rva2VuIiwiX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdCIsImRlc3Ryb3kiLCJyZXZva2VTZXNzaW9uT25QYXNzd29yZFJlc2V0Iiwic2Vzc2lvblF1ZXJ5IiwiYmluZCIsInNlbmRWZXJpZmljYXRpb25FbWFpbCIsIklOVkFMSURfU0VTU0lPTl9UT0tFTiIsIiRhbmQiLCJ2YWxpZGF0ZWQiLCJJTlRFUk5BTF9TRVJWRVJfRVJST1IiLCJzdGF0dXMiLCJhY3R1YWxUeXBlIiwiQXJyYXkiLCJpc0FycmF5IiwicmVwbGFjZSIsImNoYXJhY3RlciIsInRvVXBwZXJDYXNlIiwiZGV2aWNlVG9rZW4iLCJ0b0xvd2VyQ2FzZSIsImRldmljZVR5cGUiLCJpZE1hdGNoIiwib2JqZWN0SWRNYXRjaCIsImluc3RhbGxhdGlvbklkTWF0Y2giLCJkZXZpY2VUb2tlbk1hdGNoZXMiLCJvclF1ZXJpZXMiLCIkb3IiLCJkZWxRdWVyeSIsImFwcElkZW50aWZpZXIiLCJpbnN0YWxsYXRpb25PcHRzIiwiaW5zdGFsbGF0aW9uIiwicmVtb3ZlQ29uZmxpY3RpbmdEZXZpY2VUb2tlbiIsImR1cGxpY2F0ZURldmljZVRva2VuQWN0aW9uIiwiZW5mb3JjZUF1dGgiLCJkdXBsaWNhdGVEZXZpY2VUb2tlbkFjdGlvbkVuZm9yY2VBdXRoIiwiYXBwbHlEdXBsaWNhdGVEZXZpY2VUb2tlbk1lcmdlIiwiZGV2aWNlVG9rZW5NYXRjaCIsIm1lcmdlUHJpb3JpdHkiLCJkdXBsaWNhdGVEZXZpY2VUb2tlbk1lcmdlUHJpb3JpdHkiLCJvYmpJZCIsInJvbGUiLCJjbGVhciIsImxpdmVRdWVyeUNvbnRyb2xsZXIiLCJjbGVhckNhY2hlZFJvbGVzIiwiZG93bmxvYWQiLCJkb3dubG9hZE5hbWUiLCJJTlZBTElEX0FDTCIsIm1heFBhc3N3b3JkQWdlIiwiX3Bhc3N3b3JkX2NoYW5nZWRfYXQiLCJkZWZlciIsIk1hdGgiLCJtYXgiLCJzaGlmdCIsIl91cGRhdGVSZXNwb25zZVdpdGhEYXRhIiwiZW5mb3JjZVByaXZhdGVVc2VycyIsImhhc0FmdGVyU2F2ZUhvb2siLCJhZnRlclNhdmUiLCJoYXNMaXZlUXVlcnkiLCJfaGFuZGxlU2F2ZVJlc3BvbnNlIiwicGVybXMiLCJnZXRDbGFzc0xldmVsUGVybWlzc2lvbnMiLCJvbkFmdGVyU2F2ZSIsImxvZ2dlciIsImpzb25SZXR1cm5lZCIsIl90b0Z1bGxKU09OIiwidG9KU09OIiwid2FybiIsIm1pZGRsZSIsIm1vdW50Iiwic2VydmVyVVJMIiwic2FuaXRpemVkRGF0YSIsInRlc3QiLCJfZGVjb2RlIiwiZnJvbUpTT04iLCJyZWFkT25seUF0dHJpYnV0ZXMiLCJjb25zdHJ1Y3RvciIsImlzUm9sZUFmdGVyU2F2ZSIsImluY2x1ZGVzIiwiYXR0cmlidXRlIiwiaWdub3JlVmFsaWRhdGlvbiIsInNwbGl0dGVkS2V5Iiwic3BsaXQiLCJwYXJlbnRQcm9wIiwicGFyZW50VmFsIiwic2FuaXRpemVkIiwicHJvdGVjdGVkRmllbGRzU2F2ZVJlc3BvbnNlRXhlbXB0IiwicHJvdGVjdGVkRmllbGRzIiwiYWRkUHJvdGVjdGVkRmllbGRzIiwidXNlclJvbGVzIiwiZmllbGQiLCJoYXNPd24iLCJpc0NvbnRhaW5lciIsImdldE93blBhdGgiLCJwYXRoIiwiX3Jlc3RvcmVSZXZlcnRlZFBhdGgiLCJ3cml0ZURhdGEiLCJ3cml0dGVuIiwiZmluYWxPYmplY3QiLCJmcm9tRmluYWwiLCJkZXB0aCIsImF1dGhvcml0YXRpdmUiLCJhbmNlc3RvciIsInNvcnQiLCJhIiwiYiIsImFuY2VzdG9yUGF0aCIsInJldHVybmVkIiwib3AiLCJtaXNzaW5nSW5kZXgiLCJ1bmNoYW5nZWQiLCJpc0RlZXBTdHJpY3RFcXVhbCIsInNsaWNlIiwidGFyZ2V0Iiwib3ZlcmxhcHMiLCJwcmVmaXgiLCJyZXNwb25zZUtleSIsInJldmVydGVkIiwidmlldyIsInJ1bkFmdGVyRmluZCIsImRlbmllZCIsImlzRmluYWxPYmplY3QiLCJyZXZlcnRlZERhdGEiLCJyZXZlcnRlZFBhdGhzIiwicmVzcG9uc2VEYXRhIiwic2tpcEtleXMiLCJyZXF1aXJlZENvbHVtbnMiLCJkYXRhVmFsdWUiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJtb2R1bGUiXSwic291cmNlcyI6WyIuLi9zcmMvUmVzdFdyaXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEEgUmVzdFdyaXRlIGVuY2Fwc3VsYXRlcyBldmVyeXRoaW5nIHdlIG5lZWQgdG8gcnVuIGFuIG9wZXJhdGlvblxuLy8gdGhhdCB3cml0ZXMgdG8gdGhlIGRhdGFiYXNlLlxuLy8gVGhpcyBjb3VsZCBiZSBlaXRoZXIgYSBcImNyZWF0ZVwiIG9yIGFuIFwidXBkYXRlXCIuXG5cbnZhciBTY2hlbWFDb250cm9sbGVyID0gcmVxdWlyZSgnLi9Db250cm9sbGVycy9TY2hlbWFDb250cm9sbGVyJyk7XG5cbmNvbnN0IEF1dGggPSByZXF1aXJlKCcuL0F1dGgnKTtcbmNvbnN0IFV0aWxzID0gcmVxdWlyZSgnLi9VdGlscycpO1xudmFyIGNyeXB0b1V0aWxzID0gcmVxdWlyZSgnLi9jcnlwdG9VdGlscycpO1xudmFyIHBhc3N3b3JkQ3J5cHRvID0gcmVxdWlyZSgnLi9wYXNzd29yZCcpO1xudmFyIFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpO1xudmFyIHRyaWdnZXJzID0gcmVxdWlyZSgnLi90cmlnZ2VycycpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmltcG9ydCBSZXN0UXVlcnkgZnJvbSAnLi9SZXN0UXVlcnknO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgcmVxdWlyZWRDb2x1bW5zIH0gZnJvbSAnLi9Db250cm9sbGVycy9TY2hlbWFDb250cm9sbGVyJztcbmltcG9ydCB7IGNyZWF0ZVNhbml0aXplZEVycm9yIH0gZnJvbSAnLi9FcnJvcic7XG5pbXBvcnQgeyBhcHBseUF1dGhEYXRhT3B0aW1pc3RpY0xvY2sgfSBmcm9tICcuL0F1dGhEYXRhTG9jayc7XG5pbXBvcnQgKiBhcyBJbnN0YWxsYXRpb25EZWR1cCBmcm9tICcuL0luc3RhbGxhdGlvbkRlZHVwJztcblxuLy8gcXVlcnkgYW5kIGRhdGEgYXJlIGJvdGggcHJvdmlkZWQgaW4gUkVTVCBBUEkgZm9ybWF0LiBTbyBkYXRhXG4vLyB0eXBlcyBhcmUgZW5jb2RlZCBieSBwbGFpbiBvbGQgb2JqZWN0cy5cbi8vIElmIHF1ZXJ5IGlzIG51bGwsIHRoaXMgaXMgYSBcImNyZWF0ZVwiIGFuZCB0aGUgZGF0YSBpbiBkYXRhIHNob3VsZCBiZVxuLy8gY3JlYXRlZC5cbi8vIE90aGVyd2lzZSB0aGlzIGlzIGFuIFwidXBkYXRlXCIgLSB0aGUgb2JqZWN0IG1hdGNoaW5nIHRoZSBxdWVyeVxuLy8gc2hvdWxkIGdldCB1cGRhdGVkIHdpdGggZGF0YS5cbi8vIFJlc3RXcml0ZSB3aWxsIGhhbmRsZSBvYmplY3RJZCwgY3JlYXRlZEF0LCBhbmQgdXBkYXRlZEF0IGZvclxuLy8gZXZlcnl0aGluZy4gSXQgYWxzbyBrbm93cyB0byB1c2UgdHJpZ2dlcnMgYW5kIHNwZWNpYWwgbW9kaWZpY2F0aW9uc1xuLy8gZm9yIHRoZSBfVXNlciBjbGFzcy5cbmZ1bmN0aW9uIFJlc3RXcml0ZShjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgcXVlcnksIGRhdGEsIG9yaWdpbmFsRGF0YSwgY29udGV4dCwgYWN0aW9uKSB7XG4gIGlmIChhdXRoLmlzUmVhZE9ubHkpIHtcbiAgICB0aHJvdyBjcmVhdGVTYW5pdGl6ZWRFcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sXG4gICAgICAnQ2Fubm90IHBlcmZvcm0gYSB3cml0ZSBvcGVyYXRpb24gd2hlbiB1c2luZyByZWFkT25seU1hc3RlcktleScsXG4gICAgICBjb25maWdcbiAgICApO1xuICB9XG4gIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB0aGlzLmF1dGggPSBhdXRoO1xuICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgdGhpcy5zdG9yYWdlID0ge307XG4gIHRoaXMucnVuT3B0aW9ucyA9IHt9O1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHt9O1xuXG4gIGlmIChhY3Rpb24pIHtcbiAgICB0aGlzLnJ1bk9wdGlvbnMuYWN0aW9uID0gYWN0aW9uO1xuICB9XG5cbiAgaWYgKCFxdWVyeSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd0N1c3RvbU9iamVjdElkKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsICdvYmplY3RJZCcpICYmICFkYXRhLm9iamVjdElkKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5NSVNTSU5HX09CSkVDVF9JRCxcbiAgICAgICAgICAnb2JqZWN0SWQgbXVzdCBub3QgYmUgZW1wdHksIG51bGwgb3IgdW5kZWZpbmVkJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGF0YS5vYmplY3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSwgJ29iamVjdElkIGlzIGFuIGludmFsaWQgZmllbGQgbmFtZS4nKTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmlkKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0tFWV9OQU1FLCAnaWQgaXMgYW4gaW52YWxpZCBmaWVsZCBuYW1lLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSwgdGhpcy5yZXNwb25zZSBtYXkgaGF2ZSBzZXZlcmFsXG4gIC8vIGZpZWxkcy5cbiAgLy8gcmVzcG9uc2U6IHRoZSBhY3R1YWwgZGF0YSB0byBiZSByZXR1cm5lZFxuICAvLyBzdGF0dXM6IHRoZSBodHRwIHN0YXR1cyBjb2RlLiBpZiBub3QgcHJlc2VudCwgdHJlYXRlZCBsaWtlIGEgMjAwXG4gIC8vIGxvY2F0aW9uOiB0aGUgbG9jYXRpb24gaGVhZGVyLiBpZiBub3QgcHJlc2VudCwgbm8gbG9jYXRpb24gaGVhZGVyXG4gIHRoaXMucmVzcG9uc2UgPSBudWxsO1xuXG4gIC8vIFByb2Nlc3NpbmcgdGhpcyBvcGVyYXRpb24gbWF5IG11dGF0ZSBvdXIgZGF0YSwgc28gd2Ugb3BlcmF0ZSBvbiBhXG4gIC8vIGNvcHlcbiAgdGhpcy5xdWVyeSA9IHN0cnVjdHVyZWRDbG9uZShxdWVyeSk7XG4gIHRoaXMuZGF0YSA9IHN0cnVjdHVyZWRDbG9uZShkYXRhKTtcbiAgLy8gV2UgbmV2ZXIgY2hhbmdlIG9yaWdpbmFsRGF0YSwgc28gd2UgZG8gbm90IG5lZWQgYSBkZWVwIGNvcHlcbiAgdGhpcy5vcmlnaW5hbERhdGEgPSBvcmlnaW5hbERhdGE7XG5cbiAgLy8gVGhlIHRpbWVzdGFtcCB3ZSdsbCB1c2UgZm9yIHRoaXMgd2hvbGUgb3BlcmF0aW9uXG4gIHRoaXMudXBkYXRlZEF0ID0gUGFyc2UuX2VuY29kZShuZXcgRGF0ZSgpKS5pc287XG5cbiAgLy8gU2hhcmVkIFNjaGVtYUNvbnRyb2xsZXIgdG8gYmUgcmV1c2VkIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGxvYWRTY2hlbWEoKSBjYWxscyBwZXIgcmVxdWVzdFxuICAvLyBPbmNlIHNldCB0aGUgc2NoZW1hRGF0YSBzaG91bGQgYmUgaW1tdXRhYmxlXG4gIHRoaXMudmFsaWRTY2hlbWFDb250cm9sbGVyID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nT3BzID0ge1xuICAgIG9wZXJhdGlvbnM6IG51bGwsXG4gICAgaWRlbnRpZmllcjogbnVsbCxcbiAgfTtcbn1cblxuLy8gQSBjb252ZW5pZW50IG1ldGhvZCB0byBwZXJmb3JtIGFsbCB0aGUgc3RlcHMgb2YgcHJvY2Vzc2luZyB0aGVcbi8vIHdyaXRlLCBpbiBvcmRlci5cbi8vIFJldHVybnMgYSBwcm9taXNlIGZvciBhIHtyZXNwb25zZSwgc3RhdHVzLCBsb2NhdGlvbn0gb2JqZWN0LlxuLy8gc3RhdHVzIGFuZCBsb2NhdGlvbiBhcmUgb3B0aW9uYWwuXG5SZXN0V3JpdGUucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNoZWNrSW50ZXJuYWxGaWVsZHMoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmdldFVzZXJBbmRSb2xlQUNMKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUNsaWVudENsYXNzQ3JlYXRpb24oKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUluc3RhbGxhdGlvbigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlU2Vzc2lvbigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuYXV0aG9yaXplVXNlclVwZGF0ZSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVBdXRoRGF0YSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2hlY2tSZXN0cmljdGVkRmllbGRzKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlRmlsZVVybHMoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJ1bkJlZm9yZVNhdmVUcmlnZ2VyKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5lbnN1cmVVbmlxdWVBdXRoRGF0YUlkKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kZWxldGVFbWFpbFJlc2V0VG9rZW5JZk5lZWRlZCgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVXcml0ZVBlcm1pc3Npb24oKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlU2NoZW1hKCk7XG4gICAgfSlcbiAgICAudGhlbihzY2hlbWFDb250cm9sbGVyID0+IHtcbiAgICAgIHRoaXMudmFsaWRTY2hlbWFDb250cm9sbGVyID0gc2NoZW1hQ29udHJvbGxlcjtcbiAgICAgIHJldHVybiB0aGlzLnNldFJlcXVpcmVkRmllbGRzSWZOZWVkZWQoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVVzZXIoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmV4cGFuZEZpbGVzRm9yRXhpc3RpbmdPYmplY3RzKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5kZXN0cm95RHVwbGljYXRlZFNlc3Npb25zKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5ydW5EYXRhYmFzZU9wZXJhdGlvbigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2Vzc2lvblRva2VuSWZOZWVkZWQoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUZvbGxvd3VwKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5ydW5BZnRlclNhdmVUcmlnZ2VyKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5jbGVhblVzZXJBdXRoRGF0YSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyUmV2ZXJ0ZWRGaWVsZHNJblJlc3BvbnNlKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJQcm90ZWN0ZWRGaWVsZHNJblJlc3BvbnNlKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICAvLyBBcHBlbmQgdGhlIGF1dGhEYXRhUmVzcG9uc2UgaWYgZXhpc3RzXG4gICAgICBpZiAodGhpcy5hdXRoRGF0YVJlc3BvbnNlKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc3BvbnNlICYmIHRoaXMucmVzcG9uc2UucmVzcG9uc2UpIHtcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlLmF1dGhEYXRhUmVzcG9uc2UgPSB0aGlzLmF1dGhEYXRhUmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0b3JhZ2UucmVqZWN0U2lnbnVwICYmIHRoaXMuY29uZmlnLnByZXZlbnRTaWdudXBXaXRoVW52ZXJpZmllZEVtYWlsKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5FTUFJTF9OT1RfRk9VTkQsICdVc2VyIGVtYWlsIGlzIG5vdCB2ZXJpZmllZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlO1xuICAgIH0pO1xufTtcblxuLy8gVXNlcyB0aGUgQXV0aCBvYmplY3QgdG8gZ2V0IHRoZSBsaXN0IG9mIHJvbGVzLCBhZGRzIHRoZSB1c2VyIGlkXG5SZXN0V3JpdGUucHJvdG90eXBlLmdldFVzZXJBbmRSb2xlQUNMID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyIHx8IHRoaXMuYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgdGhpcy5ydW5PcHRpb25zLmFjbCA9IFsnKiddO1xuXG4gIGlmICh0aGlzLmF1dGgudXNlcikge1xuICAgIHJldHVybiB0aGlzLmF1dGguZ2V0VXNlclJvbGVzKCkudGhlbihyb2xlcyA9PiB7XG4gICAgICB0aGlzLnJ1bk9wdGlvbnMuYWNsID0gdGhpcy5ydW5PcHRpb25zLmFjbC5jb25jYXQocm9sZXMsIFt0aGlzLmF1dGgudXNlci5pZF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufTtcblxuLy8gVmFsaWRhdGVzIHRoaXMgb3BlcmF0aW9uIGFnYWluc3QgdGhlIGFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiBjb25maWcuXG5SZXN0V3JpdGUucHJvdG90eXBlLnZhbGlkYXRlQ2xpZW50Q2xhc3NDcmVhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKFxuICAgIHRoaXMuY29uZmlnLmFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiA9PT0gZmFsc2UgJiZcbiAgICAhdGhpcy5hdXRoLmlzTWFzdGVyICYmXG4gICAgIXRoaXMuYXV0aC5pc01haW50ZW5hbmNlICYmXG4gICAgU2NoZW1hQ29udHJvbGxlci5zeXN0ZW1DbGFzc2VzLmluZGV4T2YodGhpcy5jbGFzc05hbWUpID09PSAtMVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5sb2FkU2NoZW1hKClcbiAgICAgIC50aGVuKHNjaGVtYUNvbnRyb2xsZXIgPT4gc2NoZW1hQ29udHJvbGxlci5oYXNDbGFzcyh0aGlzLmNsYXNzTmFtZSkpXG4gICAgICAudGhlbihoYXNDbGFzcyA9PiB7XG4gICAgICAgIGlmIChoYXNDbGFzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgICAgICAgICdUaGlzIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzIG5vbi1leGlzdGVudCBjbGFzczogJyArIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICAgICAgdGhpcy5jb25maWdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbn07XG5cbi8vIFZhbGlkYXRlcyB0aGlzIG9wZXJhdGlvbiBhZ2FpbnN0IHRoZSBzY2hlbWEuXG5SZXN0V3JpdGUucHJvdG90eXBlLnZhbGlkYXRlU2NoZW1hID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UudmFsaWRhdGVPYmplY3QoXG4gICAgdGhpcy5jbGFzc05hbWUsXG4gICAgdGhpcy5kYXRhLFxuICAgIHRoaXMucXVlcnksXG4gICAgdGhpcy5ydW5PcHRpb25zLFxuICAgIHRoaXMuYXV0aC5pc01haW50ZW5hbmNlXG4gICk7XG59O1xuXG4vLyBSZXNvbHZlcyB0aGUgVVJMcyBvZiBmaWxlIHBvaW50ZXJzIGluIHRoZSBkYXRhIHRoYXQgaGF2ZSBubyBVUkwsIHNvIHRoYXQgdGhlXG4vLyBQYXJzZSBvYmplY3RzIGJ1aWx0IGZvciB0cmlnZ2VycyBhbmQgTGl2ZVF1ZXJ5IGNhbiBiZSBlbmNvZGVkLlxuUmVzdFdyaXRlLnByb3RvdHlwZS5yZXNvbHZlRmlsZVVybHMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGZpbGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgY29uc3QgY29sbGVjdCA9IHZhbHVlID0+IHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ0ZpbGUnKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLm5hbWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTkNPUlJFQ1RfVFlQRSwgJ1RoaXMgaXMgbm90IGEgdmFsaWQgRmlsZScpO1xuICAgICAgfVxuICAgICAgaWYgKCF2YWx1ZS51cmwpIHtcbiAgICAgICAgZmlsZXNbdmFsdWUubmFtZV0gPSB7IF9fdHlwZTogJ0ZpbGUnLCBuYW1lOiB2YWx1ZS5uYW1lIH07XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE9iamVjdC52YWx1ZXModmFsdWUpLmZvckVhY2goY29sbGVjdCk7XG4gIH07XG4gIGNvbGxlY3QodGhpcy5kYXRhKTtcbiAgaWYgKE9iamVjdC5rZXlzKGZpbGVzKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgdGhpcy5jb25maWcuZmlsZXNDb250cm9sbGVyLmV4cGFuZEZpbGVzSW5PYmplY3QodGhpcy5jb25maWcsIGZpbGVzKTtcbiAgdGhpcy5maWxlVXJscyA9IE9iamVjdC5hc3NpZ24odGhpcy5maWxlVXJscyB8fCBPYmplY3QuY3JlYXRlKG51bGwpLCBmaWxlcyk7XG59O1xuXG4vLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgZGF0YSB3aXRoIHRoZSByZXNvbHZlZCBVUkxzIGFkZGVkIHRvIGZpbGUgcG9pbnRlcnMuXG5SZXN0V3JpdGUucHJvdG90eXBlLmNsb25lV2l0aEZpbGVVcmxzID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICBjb25zdCBkYXRhID0gc3RydWN0dXJlZENsb25lKG9iamVjdCk7XG4gIGlmICghdGhpcy5maWxlVXJscykge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIGNvbnN0IGFkZFVybHMgPSB2YWx1ZSA9PiB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWx1ZS5fX3R5cGUgPT09ICdGaWxlJykge1xuICAgICAgY29uc3QgZmlsZSA9IHR5cGVvZiB2YWx1ZS5uYW1lID09PSAnc3RyaW5nJyAmJiB0aGlzLmZpbGVVcmxzW3ZhbHVlLm5hbWVdO1xuICAgICAgaWYgKCF2YWx1ZS51cmwgJiYgZmlsZSkge1xuICAgICAgICB2YWx1ZS51cmwgPSBmaWxlLnVybDtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgT2JqZWN0LnZhbHVlcyh2YWx1ZSkuZm9yRWFjaChhZGRVcmxzKTtcbiAgfTtcbiAgYWRkVXJscyhkYXRhKTtcbiAgcmV0dXJuIGRhdGE7XG59O1xuXG4vLyBSdW5zIGFueSBiZWZvcmVTYXZlIHRyaWdnZXJzIGFnYWluc3QgdGhpcyBvcGVyYXRpb24uXG4vLyBBbnkgY2hhbmdlIGxlYWRzIHRvIG91ciBkYXRhIGJlaW5nIG11dGF0ZWQuXG5SZXN0V3JpdGUucHJvdG90eXBlLnJ1bkJlZm9yZVNhdmVUcmlnZ2VyID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXNwb25zZSB8fCB0aGlzLnJ1bk9wdGlvbnMubWFueSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEF2b2lkIGRvaW5nIGFueSBzZXR1cCBmb3IgdHJpZ2dlcnMgaWYgdGhlcmUgaXMgbm8gJ2JlZm9yZVNhdmUnIHRyaWdnZXIgZm9yIHRoaXMgY2xhc3MuXG4gIGlmIChcbiAgICAhdHJpZ2dlcnMudHJpZ2dlckV4aXN0cyh0aGlzLmNsYXNzTmFtZSwgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlU2F2ZSwgdGhpcy5jb25maWcuYXBwbGljYXRpb25JZClcbiAgKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgY29uc3QgeyBvcmlnaW5hbE9iamVjdCwgdXBkYXRlZE9iamVjdCB9ID0gdGhpcy5idWlsZFBhcnNlT2JqZWN0cygpO1xuICBjb25zdCBpZGVudGlmaWVyID0gdXBkYXRlZE9iamVjdC5fZ2V0U3RhdGVJZGVudGlmaWVyKCk7XG4gIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IFBhcnNlLkNvcmVNYW5hZ2VyLmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICBjb25zdCBbcGVuZGluZ10gPSBzdGF0ZUNvbnRyb2xsZXIuZ2V0UGVuZGluZ09wcyhpZGVudGlmaWVyKTtcbiAgdGhpcy5wZW5kaW5nT3BzID0ge1xuICAgIG9wZXJhdGlvbnM6IHsgLi4ucGVuZGluZyB9LFxuICAgIGlkZW50aWZpZXIsXG4gIH07XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gQmVmb3JlIGNhbGxpbmcgdGhlIHRyaWdnZXIsIHZhbGlkYXRlIHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHNhdmUgb3BlcmF0aW9uXG4gICAgICBsZXQgZGF0YWJhc2VQcm9taXNlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnF1ZXJ5KSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIGZvciB1cGRhdGluZ1xuICAgICAgICBkYXRhYmFzZVByb21pc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS51cGRhdGUoXG4gICAgICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgdGhpcy5xdWVyeSxcbiAgICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgICAgdGhpcy5ydW5PcHRpb25zLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgZm9yIGNyZWF0aW5nXG4gICAgICAgIGRhdGFiYXNlUHJvbWlzZSA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmNyZWF0ZShcbiAgICAgICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgICAgdGhpcy5ydW5PcHRpb25zLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gcGVybWlzc2lvbiBmb3IgdGhlIG9wZXJhdGlvbiwgaXQgdGhyb3dzIGFuIGVycm9yXG4gICAgICByZXR1cm4gZGF0YWJhc2VQcm9taXNlLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0Lmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kLicpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIoXG4gICAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZVNhdmUsXG4gICAgICAgIHRoaXMuYXV0aCxcbiAgICAgICAgdXBkYXRlZE9iamVjdCxcbiAgICAgICAgb3JpZ2luYWxPYmplY3QsXG4gICAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgICk7XG4gICAgfSlcbiAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uub2JqZWN0KSB7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyID0gXy5yZWR1Y2UoXG4gICAgICAgICAgcmVzcG9uc2Uub2JqZWN0LFxuICAgICAgICAgIChyZXN1bHQsIHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghXy5pc0VxdWFsKHRoaXMuZGF0YVtrZXldLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbXVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRhdGEgPSByZXNwb25zZS5vYmplY3Q7XG4gICAgICAgIC8vIFdlIHNob3VsZCBkZWxldGUgdGhlIG9iamVjdElkIGZvciBhbiB1cGRhdGUgd3JpdGVcbiAgICAgICAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmRhdGEub2JqZWN0SWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIFV0aWxzLmNoZWNrUHJvaGliaXRlZEtleXdvcmRzKHRoaXMuY29uZmlnLCB0aGlzLmRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsIGAke2Vycm9yfWApO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLm9iamVjdCkge1xuICAgICAgICAvLyBUaGUgdHJpZ2dlciBtYXkgaGF2ZSBzZXQgZmlsZSBwb2ludGVycyB3aXRob3V0IFVSTFxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlRmlsZVVybHMoKTtcbiAgICAgIH1cbiAgICB9KTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUucnVuQmVmb3JlTG9naW5UcmlnZ2VyID0gYXN5bmMgZnVuY3Rpb24gKHVzZXJEYXRhKSB7XG4gIC8vIEF2b2lkIGRvaW5nIGFueSBzZXR1cCBmb3IgdHJpZ2dlcnMgaWYgdGhlcmUgaXMgbm8gJ2JlZm9yZUxvZ2luJyB0cmlnZ2VyXG4gIGlmIChcbiAgICAhdHJpZ2dlcnMudHJpZ2dlckV4aXN0cyh0aGlzLmNsYXNzTmFtZSwgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlTG9naW4sIHRoaXMuY29uZmlnLmFwcGxpY2F0aW9uSWQpXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENsb3VkIGNvZGUgZ2V0cyBhIGJpdCBvZiBleHRyYSBkYXRhIGZvciBpdHMgb2JqZWN0c1xuICBjb25zdCBleHRyYURhdGEgPSB7IGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUgfTtcblxuICAvLyBFeHBhbmQgZmlsZSBvYmplY3RzXG4gIGF3YWl0IHRoaXMuY29uZmlnLmZpbGVzQ29udHJvbGxlci5leHBhbmRGaWxlc0luT2JqZWN0KHRoaXMuY29uZmlnLCB1c2VyRGF0YSk7XG5cbiAgY29uc3QgdXNlciA9IHRyaWdnZXJzLmluZmxhdGUoZXh0cmFEYXRhLCB1c2VyRGF0YSk7XG5cbiAgLy8gbm8gbmVlZCB0byByZXR1cm4gYSByZXNwb25zZVxuICBhd2FpdCB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIoXG4gICAgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlTG9naW4sXG4gICAgdGhpcy5hdXRoLFxuICAgIHVzZXIsXG4gICAgbnVsbCxcbiAgICB0aGlzLmNvbmZpZyxcbiAgICB0aGlzLmNvbnRleHRcbiAgKTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuc2V0UmVxdWlyZWRGaWVsZHNJZk5lZWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlci5nZXRBbGxDbGFzc2VzKCkudGhlbihhbGxDbGFzc2VzID0+IHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGFsbENsYXNzZXMuZmluZChvbmVDbGFzcyA9PiBvbmVDbGFzcy5jbGFzc05hbWUgPT09IHRoaXMuY2xhc3NOYW1lKTtcbiAgICAgIGNvbnN0IHNldFJlcXVpcmVkRmllbGRJZk5lZWRlZCA9IChmaWVsZE5hbWUsIHNldERlZmF1bHQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICB0aGlzLmRhdGFbZmllbGROYW1lXSA9PT0gbnVsbCB8fFxuICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSAnJyB8fFxuICAgICAgICAgICh0eXBlb2YgdGhpcy5kYXRhW2ZpZWxkTmFtZV0gPT09ICdvYmplY3QnICYmIHRoaXMuZGF0YVtmaWVsZE5hbWVdLl9fb3AgPT09ICdEZWxldGUnKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzZXREZWZhdWx0ICYmXG4gICAgICAgICAgICBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiZcbiAgICAgICAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS5kZWZhdWx0VmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRhdGFbZmllbGROYW1lXSA9PT0gJ29iamVjdCcgJiYgdGhpcy5kYXRhW2ZpZWxkTmFtZV0uX19vcCA9PT0gJ0RlbGV0ZScpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5kYXRhW2ZpZWxkTmFtZV0gPSBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0uZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlLmZpZWxkc0NoYW5nZWRCeVRyaWdnZXIgPSB0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlciB8fCBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlci5pbmRleE9mKGZpZWxkTmFtZSkgPCAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyLnB1c2goZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYS5maWVsZHNbZmllbGROYW1lXSAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0ucmVxdWlyZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLCBgJHtmaWVsZE5hbWV9IGlzIHJlcXVpcmVkYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBhZGQgZGVmYXVsdCBBQ0wgKG9ubHkgb24gQ1JFQVRFLCBub3QgVVBEQVRFKVxuICAgICAgaWYgKCF0aGlzLnF1ZXJ5ICYmXG4gICAgICAgIHNjaGVtYT8uY2xhc3NMZXZlbFBlcm1pc3Npb25zPy5BQ0wgJiZcbiAgICAgICAgIXRoaXMuZGF0YS5BQ0wgJiZcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoc2NoZW1hLmNsYXNzTGV2ZWxQZXJtaXNzaW9ucy5BQ0wpICE9PVxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHsgJyonOiB7IHJlYWQ6IHRydWUsIHdyaXRlOiB0cnVlIH0gfSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBhY2wgPSBzdHJ1Y3R1cmVkQ2xvbmUoc2NoZW1hLmNsYXNzTGV2ZWxQZXJtaXNzaW9ucy5BQ0wpO1xuICAgICAgICBpZiAoYWNsLmN1cnJlbnRVc2VyKSB7XG4gICAgICAgICAgaWYgKHRoaXMuYXV0aC51c2VyPy5pZCkge1xuICAgICAgICAgICAgYWNsW3RoaXMuYXV0aC51c2VyPy5pZF0gPSBzdHJ1Y3R1cmVkQ2xvbmUoYWNsLmN1cnJlbnRVc2VyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIGFjbC5jdXJyZW50VXNlcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGEuQUNMID0gYWNsO1xuICAgICAgICB0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlciA9IHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyIHx8IFtdO1xuICAgICAgICB0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlci5wdXNoKCdBQ0wnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGRlZmF1bHQgZmllbGRzXG4gICAgICBpZiAoIXRoaXMucXVlcnkpIHtcbiAgICAgICAgLy8gYWxsb3cgY3VzdG9taXppbmcgY3JlYXRlZEF0IGFuZCB1cGRhdGVkQXQgd2hlbiB1c2luZyBtYWludGVuYW5jZSBrZXlcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYXV0aC5pc01haW50ZW5hbmNlICYmXG4gICAgICAgICAgdGhpcy5kYXRhLmNyZWF0ZWRBdCAmJlxuICAgICAgICAgIHRoaXMuZGF0YS5jcmVhdGVkQXQuX190eXBlID09PSAnRGF0ZSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLmNyZWF0ZWRBdCA9IHRoaXMuZGF0YS5jcmVhdGVkQXQuaXNvO1xuXG4gICAgICAgICAgaWYgKHRoaXMuZGF0YS51cGRhdGVkQXQgJiYgdGhpcy5kYXRhLnVwZGF0ZWRBdC5fX3R5cGUgPT09ICdEYXRlJykge1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID0gbmV3IERhdGUodGhpcy5kYXRhLmNyZWF0ZWRBdCk7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkQXQgPSBuZXcgRGF0ZSh0aGlzLmRhdGEudXBkYXRlZEF0Lmlzbyk7XG5cbiAgICAgICAgICAgIGlmICh1cGRhdGVkQXQgPCBjcmVhdGVkQXQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICAgIFBhcnNlLkVycm9yLlZBTElEQVRJT05fRVJST1IsXG4gICAgICAgICAgICAgICAgJ3VwZGF0ZWRBdCBjYW5ub3Qgb2NjdXIgYmVmb3JlIGNyZWF0ZWRBdCdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5kYXRhLnVwZGF0ZWRBdCA9IHRoaXMuZGF0YS51cGRhdGVkQXQuaXNvO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpZiBubyB1cGRhdGVkQXQgaXMgcHJvdmlkZWQsIHNldCBpdCB0byBjcmVhdGVkQXQgdG8gbWF0Y2ggZGVmYXVsdCBiZWhhdmlvclxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnVwZGF0ZWRBdCA9IHRoaXMuZGF0YS5jcmVhdGVkQXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGF0YS51cGRhdGVkQXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICAgICAgICB0aGlzLmRhdGEuY3JlYXRlZEF0ID0gdGhpcy51cGRhdGVkQXQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IGFzc2lnbiBuZXcgb2JqZWN0SWQgaWYgd2UgYXJlIGNyZWF0aW5nIG5ldyBvYmplY3RcbiAgICAgICAgaWYgKCF0aGlzLmRhdGEub2JqZWN0SWQpIHtcbiAgICAgICAgICB0aGlzLmRhdGEub2JqZWN0SWQgPSBjcnlwdG9VdGlscy5uZXdPYmplY3RJZCh0aGlzLmNvbmZpZy5vYmplY3RJZFNpemUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhzY2hlbWEuZmllbGRzKS5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XG4gICAgICAgICAgICBzZXRSZXF1aXJlZEZpZWxkSWZOZWVkZWQoZmllbGROYW1lLCB0cnVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzY2hlbWEpIHtcbiAgICAgICAgdGhpcy5kYXRhLnVwZGF0ZWRBdCA9IHRoaXMudXBkYXRlZEF0O1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgICAgIHNldFJlcXVpcmVkRmllbGRJZk5lZWRlZChmaWVsZE5hbWUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufTtcblxuLy8gVHJhbnNmb3JtcyBhdXRoIGRhdGEgZm9yIGEgdXNlciBvYmplY3QuXG4vLyBEb2VzIG5vdGhpbmcgaWYgdGhpcyBpc24ndCBhIHVzZXIgb2JqZWN0LlxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZW4gd2UncmUgZG9uZSBpZiBpdCBjYW4ndCBmaW5pc2ggdGhpcyB0aWNrLlxuUmVzdFdyaXRlLnByb3RvdHlwZS52YWxpZGF0ZUF1dGhEYXRhID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbGFzc05hbWUgIT09ICdfVXNlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZGF0YS5hdXRoRGF0YTtcbiAgY29uc3QgaGFzVXNlcm5hbWVBbmRQYXNzd29yZCA9XG4gICAgdHlwZW9mIHRoaXMuZGF0YS51c2VybmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHRoaXMuZGF0YS5wYXNzd29yZCA9PT0gJ3N0cmluZyc7XG4gIGNvbnN0IGhhc0F1dGhEYXRhID1cbiAgICBhdXRoRGF0YSAmJlxuICAgIE9iamVjdC5rZXlzKGF1dGhEYXRhKS5zb21lKHByb3ZpZGVyID0+IHtcbiAgICAgIGNvbnN0IHByb3ZpZGVyRGF0YSA9IGF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICAgIHJldHVybiBwcm92aWRlckRhdGEgJiYgdHlwZW9mIHByb3ZpZGVyRGF0YSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMocHJvdmlkZXJEYXRhKS5sZW5ndGg7XG4gICAgfSk7XG5cbiAgY29uc3QgcmVxdWlyZXNDcmVkZW50aWFscyA9ICF0aGlzLnF1ZXJ5ICYmICFoYXNBdXRoRGF0YTtcbiAgY29uc3QgaXNNaXNzaW5nID0gdmFsdWUgPT4gdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCBfLmlzRW1wdHkodmFsdWUpO1xuICAvLyBBbiBlbXB0eSB1c2VybmFtZSBvbiBjcmVhdGUgd2l0aCBhdXRoRGF0YSBpcyByZXBsYWNlZCBieSBhIHJhbmRvbSBvbmVcbiAgY29uc3QgY2hlY2tVc2VybmFtZSA9IHJlcXVpcmVzQ3JlZGVudGlhbHMgfHwgKHRoaXMucXVlcnkgJiYgdGhpcy5kYXRhLnVzZXJuYW1lICE9PSB1bmRlZmluZWQpO1xuICBjb25zdCBjaGVja1Bhc3N3b3JkID0gcmVxdWlyZXNDcmVkZW50aWFscyB8fCB0aGlzLmRhdGEucGFzc3dvcmQgIT09IHVuZGVmaW5lZDtcbiAgaWYgKGNoZWNrVXNlcm5hbWUgJiYgaXNNaXNzaW5nKHRoaXMuZGF0YS51c2VybmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVVNFUk5BTUVfTUlTU0lORywgJ2JhZCBvciBtaXNzaW5nIHVzZXJuYW1lJyk7XG4gIH1cbiAgaWYgKGNoZWNrUGFzc3dvcmQgJiYgaXNNaXNzaW5nKHRoaXMuZGF0YS5wYXNzd29yZCkpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuUEFTU1dPUkRfTUlTU0lORywgJ3Bhc3N3b3JkIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmRhdGEsICdhdXRoRGF0YScpKSB7XG4gICAgLy8gTm90aGluZyB0byB2YWxpZGF0ZSBoZXJlXG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKCF0aGlzLmRhdGEuYXV0aERhdGEpIHtcbiAgICAvLyBIYW5kbGUgc2F2aW5nIGF1dGhEYXRhIHRvIG51bGxcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5VTlNVUFBPUlRFRF9TRVJWSUNFLFxuICAgICAgJ1RoaXMgYXV0aGVudGljYXRpb24gbWV0aG9kIGlzIHVuc3VwcG9ydGVkLidcbiAgICApO1xuICB9XG5cbiAgdmFyIHByb3ZpZGVycyA9IE9iamVjdC5rZXlzKGF1dGhEYXRhKTtcbiAgaWYgKCFwcm92aWRlcnMubGVuZ3RoKSB7XG4gICAgLy8gRW1wdHkgYXV0aERhdGEgb2JqZWN0LCBub3RoaW5nIHRvIHZhbGlkYXRlXG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGNhbkhhbmRsZUF1dGhEYXRhID0gcHJvdmlkZXJzLnNvbWUocHJvdmlkZXIgPT4ge1xuICAgIGNvbnN0IHByb3ZpZGVyQXV0aERhdGEgPSBhdXRoRGF0YVtwcm92aWRlcl0gfHwge307XG4gICAgcmV0dXJuICEhT2JqZWN0LmtleXMocHJvdmlkZXJBdXRoRGF0YSkubGVuZ3RoO1xuICB9KTtcbiAgaWYgKGNhbkhhbmRsZUF1dGhEYXRhIHx8IGhhc1VzZXJuYW1lQW5kUGFzc3dvcmQgfHwgdGhpcy5hdXRoLmlzTWFzdGVyIHx8IHRoaXMuZ2V0VXNlcklkKCkpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVBdXRoRGF0YShhdXRoRGF0YSk7XG4gIH1cbiAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgIFBhcnNlLkVycm9yLlVOU1VQUE9SVEVEX1NFUlZJQ0UsXG4gICAgJ1RoaXMgYXV0aGVudGljYXRpb24gbWV0aG9kIGlzIHVuc3VwcG9ydGVkLidcbiAgKTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuZmlsdGVyZWRPYmplY3RzQnlBQ0wgPSBmdW5jdGlvbiAob2JqZWN0cykge1xuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyIHx8IHRoaXMuYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH1cbiAgcmV0dXJuIG9iamVjdHMuZmlsdGVyKG9iamVjdCA9PiB7XG4gICAgaWYgKCFvYmplY3QuQUNMKSB7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gbGVnYWN5IHVzZXJzIHRoYXQgaGF2ZSBubyBBQ0wgZmllbGQgb24gdGhlbVxuICAgIH1cbiAgICAvLyBSZWd1bGFyIHVzZXJzIHRoYXQgaGF2ZSBiZWVuIGxvY2tlZCBvdXQuXG4gICAgcmV0dXJuIG9iamVjdC5BQ0wgJiYgT2JqZWN0LmtleXMob2JqZWN0LkFDTCkubGVuZ3RoID4gMDtcbiAgfSk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmdldFVzZXJJZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCAmJiB0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5Lm9iamVjdElkO1xuICB9IGVsc2UgaWYgKHRoaXMuYXV0aCAmJiB0aGlzLmF1dGgudXNlciAmJiB0aGlzLmF1dGgudXNlci5pZCkge1xuICAgIHJldHVybiB0aGlzLmF1dGgudXNlci5pZDtcbiAgfVxufTtcblxuLy8gRGV2ZWxvcGVycyBhcmUgYWxsb3dlZCB0byBjaGFuZ2UgYXV0aERhdGEgdmlhIGJlZm9yZSBzYXZlIHRyaWdnZXJcblJlc3RXcml0ZS5wcm90b3R5cGUuX3Rocm93SWZBdXRoRGF0YUR1cGxpY2F0ZSA9IGZ1bmN0aW9uIChlcnJvcikge1xuICBpZiAoXG4gICAgdGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgJiZcbiAgICBlcnJvcj8uY29kZSA9PT0gUGFyc2UuRXJyb3IuRFVQTElDQVRFX1ZBTFVFICYmXG4gICAgZXJyb3IudXNlckluZm8/LmR1cGxpY2F0ZWRfZmllbGQ/LnN0YXJ0c1dpdGgoJ19hdXRoX2RhdGFfJylcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkFDQ09VTlRfQUxSRUFEWV9MSU5LRUQsICd0aGlzIGF1dGggaXMgYWxyZWFkeSB1c2VkJyk7XG4gIH1cbn07XG5cbi8vIHdlIG5lZWQgYWZ0ZXIgYmVmb3JlIHNhdmUgdG8gZW5zdXJlIHRoYXQgdGhlIGRldmVsb3BlclxuLy8gaXMgbm90IGN1cnJlbnRseSBkdXBsaWNhdGluZyBhdXRoIGRhdGEgSURcblJlc3RXcml0ZS5wcm90b3R5cGUuZW5zdXJlVW5pcXVlQXV0aERhdGFJZCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9PSAnX1VzZXInIHx8ICF0aGlzLmRhdGEuYXV0aERhdGEpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoYXNBdXRoRGF0YUlkID0gT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5zb21lKFxuICAgIGtleSA9PiB0aGlzLmRhdGEuYXV0aERhdGFba2V5XSAmJiB0aGlzLmRhdGEuYXV0aERhdGFba2V5XS5pZFxuICApO1xuXG4gIGlmICghaGFzQXV0aERhdGFJZCkgeyByZXR1cm47IH1cblxuICBjb25zdCByID0gYXdhaXQgQXV0aC5maW5kVXNlcnNXaXRoQXV0aERhdGEodGhpcy5jb25maWcsIHRoaXMuZGF0YS5hdXRoRGF0YSk7XG4gIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmZpbHRlcmVkT2JqZWN0c0J5QUNMKHIpO1xuICBpZiAocmVzdWx0cy5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkFDQ09VTlRfQUxSRUFEWV9MSU5LRUQsICd0aGlzIGF1dGggaXMgYWxyZWFkeSB1c2VkJyk7XG4gIH1cbiAgLy8gdXNlIGRhdGEub2JqZWN0SWQgaW4gY2FzZSBvZiBsb2dpbiB0aW1lIGFuZCBmb3VuZCB1c2VyIGR1cmluZyBoYW5kbGUgdmFsaWRhdGVBdXRoRGF0YVxuICBjb25zdCB1c2VySWQgPSB0aGlzLmdldFVzZXJJZCgpIHx8IHRoaXMuZGF0YS5vYmplY3RJZDtcbiAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAxICYmIHVzZXJJZCAhPT0gcmVzdWx0c1swXS5vYmplY3RJZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5BQ0NPVU5UX0FMUkVBRFlfTElOS0VELCAndGhpcyBhdXRoIGlzIGFscmVhZHkgdXNlZCcpO1xuICB9XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmhhbmRsZUF1dGhEYXRhID0gYXN5bmMgZnVuY3Rpb24gKGF1dGhEYXRhKSB7XG4gIGxldCBjdXJyZW50VXNlckF1dGhEYXRhO1xuICBpZiAodGhpcy5xdWVyeT8ub2JqZWN0SWQpIHtcbiAgICBjb25zdCBbY3VycmVudFVzZXJdID0gYXdhaXQgdGhpcy5jb25maWcuZGF0YWJhc2UuZmluZChcbiAgICAgICdfVXNlcicsXG4gICAgICB7IG9iamVjdElkOiB0aGlzLnF1ZXJ5Lm9iamVjdElkIH1cbiAgICApO1xuICAgIGN1cnJlbnRVc2VyQXV0aERhdGEgPSBjdXJyZW50VXNlcj8uYXV0aERhdGE7XG4gIH1cbiAgY29uc3QgciA9IGF3YWl0IEF1dGguZmluZFVzZXJzV2l0aEF1dGhEYXRhKHRoaXMuY29uZmlnLCBhdXRoRGF0YSwgdHJ1ZSwgY3VycmVudFVzZXJBdXRoRGF0YSk7XG4gIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmZpbHRlcmVkT2JqZWN0c0J5QUNMKHIpO1xuXG4gIGNvbnN0IHVzZXJJZCA9IHRoaXMuZ2V0VXNlcklkKCk7XG4gIGNvbnN0IGlzTG9naW4gPSAhdXNlcklkO1xuICBjb25zdCB1c2VyUmVzdWx0ID0gcmVzdWx0c1swXTtcbiAgY29uc3QgZm91bmRVc2VySXNOb3RDdXJyZW50VXNlciA9IHVzZXJJZCAmJiB1c2VyUmVzdWx0ICYmIHVzZXJJZCAhPT0gdXNlclJlc3VsdC5vYmplY3RJZDtcblxuICBpZiAocmVzdWx0cy5sZW5ndGggPiAxIHx8IGZvdW5kVXNlcklzTm90Q3VycmVudFVzZXIpIHtcbiAgICAvLyBUbyBhdm9pZCBodHRwczovL2dpdGh1Yi5jb20vcGFyc2UtY29tbXVuaXR5L3BhcnNlLXNlcnZlci9zZWN1cml0eS9hZHZpc29yaWVzL0dIU0EtOHczai1nOTgzLThqaDVcbiAgICAvLyBMZXQncyBydW4gc29tZSB2YWxpZGF0aW9uIGJlZm9yZSB0aHJvd2luZ1xuICAgIGF3YWl0IEF1dGguaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uKGF1dGhEYXRhLCB0aGlzLCB1c2VyUmVzdWx0LCB7IGlzTG9naW4gfSk7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkFDQ09VTlRfQUxSRUFEWV9MSU5LRUQsICd0aGlzIGF1dGggaXMgYWxyZWFkeSB1c2VkJyk7XG4gIH1cblxuICAvLyBObyB1c2VyIGZvdW5kIHdpdGggcHJvdmlkZWQgYXV0aERhdGEgd2UgbmVlZCB0byB2YWxpZGF0ZVxuICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7XG4gICAgY29uc3QgeyBhdXRoRGF0YTogdmFsaWRhdGVkQXV0aERhdGEsIGF1dGhEYXRhUmVzcG9uc2UgfSA9IGF3YWl0IEF1dGguaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uKFxuICAgICAgYXV0aERhdGEsXG4gICAgICB0aGlzLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgeyBpc0xvZ2luIH1cbiAgICApO1xuICAgIHRoaXMuYXV0aERhdGFSZXNwb25zZSA9IGF1dGhEYXRhUmVzcG9uc2U7XG4gICAgLy8gUmVwbGFjZSBjdXJyZW50IGF1dGhEYXRhIGJ5IHRoZSBuZXcgdmFsaWRhdGVkIG9uZVxuICAgIHRoaXMuZGF0YS5hdXRoRGF0YSA9IHZhbGlkYXRlZEF1dGhEYXRhO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFVzZXIgZm91bmQgd2l0aCBwcm92aWRlZCBhdXRoRGF0YVxuICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDEpIHtcbiAgICB0aGlzLnN0b3JhZ2UuYXV0aFByb3ZpZGVyID0gT2JqZWN0LmtleXMoYXV0aERhdGEpLmpvaW4oJywnKTtcblxuICAgIGNvbnN0IHsgaGFzTXV0YXRlZEF1dGhEYXRhLCBtdXRhdGVkQXV0aERhdGEgfSA9IEF1dGguaGFzTXV0YXRlZEF1dGhEYXRhKFxuICAgICAgYXV0aERhdGEsXG4gICAgICB1c2VyUmVzdWx0LmF1dGhEYXRhXG4gICAgKTtcblxuICAgIGNvbnN0IGlzQ3VycmVudFVzZXJMb2dnZWRPck1hc3RlciA9XG4gICAgICAodGhpcy5hdXRoICYmIHRoaXMuYXV0aC51c2VyICYmIHRoaXMuYXV0aC51c2VyLmlkID09PSB1c2VyUmVzdWx0Lm9iamVjdElkKSB8fFxuICAgICAgdGhpcy5hdXRoLmlzTWFzdGVyO1xuXG4gICAgaWYgKGlzTG9naW4gfHwgaXNDdXJyZW50VXNlckxvZ2dlZE9yTWFzdGVyKSB7XG4gICAgICAvLyBubyB1c2VyIG1ha2luZyB0aGUgY2FsbFxuICAgICAgLy8gT1IgdGhlIHVzZXIgbWFraW5nIHRoZSBjYWxsIGlzIHRoZSByaWdodCBvbmVcbiAgICAgIC8vIExvZ2luIHdpdGggYXV0aCBkYXRhXG4gICAgICBkZWxldGUgcmVzdWx0c1swXS5wYXNzd29yZDtcblxuICAgICAgLy8gbmVlZCB0byBzZXQgdGhlIG9iamVjdElkIGZpcnN0IG90aGVyd2lzZSBsb2NhdGlvbiBoYXMgdHJhaWxpbmcgdW5kZWZpbmVkXG4gICAgICB0aGlzLmRhdGEub2JqZWN0SWQgPSB1c2VyUmVzdWx0Lm9iamVjdElkO1xuXG4gICAgICBpZiAoIXRoaXMucXVlcnkgfHwgIXRoaXMucXVlcnkub2JqZWN0SWQpIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHtcbiAgICAgICAgICByZXNwb25zZTogdXNlclJlc3VsdCxcbiAgICAgICAgICBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbigpLFxuICAgICAgICB9O1xuICAgICAgICAvLyBSdW4gYmVmb3JlTG9naW4gaG9vayBiZWZvcmUgc3RvcmluZyBhbnkgdXBkYXRlc1xuICAgICAgICAvLyB0byBhdXRoRGF0YSBvbiB0aGUgZGI7IGNoYW5nZXMgdG8gdXNlclJlc3VsdFxuICAgICAgICAvLyB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICAgIGF3YWl0IHRoaXMucnVuQmVmb3JlTG9naW5UcmlnZ2VyKHN0cnVjdHVyZWRDbG9uZSh1c2VyUmVzdWx0KSk7XG5cbiAgICAgICAgLy8gSWYgd2UgYXJlIGluIGxvZ2luIG9wZXJhdGlvbiB2aWEgYXV0aERhdGFcbiAgICAgICAgLy8gd2UgbmVlZCB0byBiZSBzdXJlIHRoYXQgdGhlIHVzZXIgaGFzIHByb3ZpZGVkXG4gICAgICAgIC8vIHJlcXVpcmVkIGF1dGhEYXRhXG4gICAgICAgIEF1dGguY2hlY2tJZlVzZXJIYXNQcm92aWRlZENvbmZpZ3VyZWRQcm92aWRlcnNGb3JMb2dpbihcbiAgICAgICAgICB7IGNvbmZpZzogdGhpcy5jb25maWcsIGF1dGg6IHRoaXMuYXV0aCB9LFxuICAgICAgICAgIGF1dGhEYXRhLFxuICAgICAgICAgIHVzZXJSZXN1bHQuYXV0aERhdGEsXG4gICAgICAgICAgdGhpcy5jb25maWdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJldmVudCB2YWxpZGF0aW5nIGlmIG5vIG11dGF0ZWQgZGF0YSBkZXRlY3RlZCBvbiB1cGRhdGVcbiAgICAgIGlmICghaXNMb2dpbiAmJiAhaGFzTXV0YXRlZEF1dGhEYXRhICYmIGlzQ3VycmVudFVzZXJMb2dnZWRPck1hc3Rlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEFsd2F5cyB2YWxpZGF0ZSBhbGwgcHJvdmlkZWQgYXV0aERhdGEgb24gbG9naW4gdG8gcHJldmVudCBhdXRoZW50aWNhdGlvblxuICAgICAgLy8gYnlwYXNzIHZpYSBwYXJ0aWFsIGF1dGhEYXRhIChlLmcuIHNlbmRpbmcgb25seSB0aGUgcHJvdmlkZXIgSUQgd2l0aG91dFxuICAgICAgLy8gYW4gYWNjZXNzIHRva2VuKTsgb24gdXBkYXRlIG9ubHkgdmFsaWRhdGUgbXV0YXRlZCBvbmVzXG4gICAgICBpZiAoaXNMb2dpbiB8fCBoYXNNdXRhdGVkQXV0aERhdGEgfHwgIXRoaXMuY29uZmlnLmFsbG93RXhwaXJlZEF1dGhEYXRhVG9rZW4pIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgQXV0aC5oYW5kbGVBdXRoRGF0YVZhbGlkYXRpb24oXG4gICAgICAgICAgaXNMb2dpbiA/IGF1dGhEYXRhIDogbXV0YXRlZEF1dGhEYXRhLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdXNlclJlc3VsdCxcbiAgICAgICAgICB7IGlzTG9naW4gfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRhdGEuYXV0aERhdGEgPSByZXMuYXV0aERhdGE7XG4gICAgICAgIHRoaXMuYXV0aERhdGFSZXNwb25zZSA9IHJlcy5hdXRoRGF0YVJlc3BvbnNlO1xuICAgICAgfVxuXG4gICAgICAvLyBDYXB0dXJlIG9yaWdpbmFsIGF1dGhEYXRhIGJlZm9yZSBtdXRhdGluZyB1c2VyUmVzdWx0IHZpYSB0aGUgcmVzcG9uc2UgcmVmZXJlbmNlXG4gICAgICBjb25zdCBvcmlnaW5hbEF1dGhEYXRhID0gdXNlclJlc3VsdD8uYXV0aERhdGFcbiAgICAgICAgPyBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXModXNlclJlc3VsdC5hdXRoRGF0YSkubWFwKChbaywgdl0pID0+XG4gICAgICAgICAgICBbaywgdiAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyB7IC4uLnYgfSA6IHZdXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyBJRiB3ZSBhcmUgaW4gbG9naW4gd2UnbGwgc2tpcCB0aGUgZGF0YWJhc2Ugb3BlcmF0aW9uIC8gYmVmb3JlU2F2ZSAvIGFmdGVyU2F2ZSBldGMuLi5cbiAgICAgIC8vIHdlIG5lZWQgdG8gc2V0IGl0IHVwIHRoZXJlLlxuICAgICAgLy8gV2UgYXJlIHN1cHBvc2VkIHRvIGhhdmUgYSByZXNwb25zZSBvbmx5IG9uIExPR0lOIHdpdGggYXV0aERhdGEsIHNvIHdlIHNraXAgdGhvc2VcbiAgICAgIC8vIElmIHdlJ3JlIG5vdCBsb2dnaW5nIGluLCBidXQganVzdCB1cGRhdGluZyB0aGUgY3VycmVudCB1c2VyLCB3ZSBjYW4gc2FmZWx5IHNraXAgdGhhdCBwYXJ0XG4gICAgICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgICAgICAvLyBBc3NpZ24gdGhlIG5ldyBhdXRoRGF0YSBpbiB0aGUgcmVzcG9uc2VcbiAgICAgICAgT2JqZWN0LmtleXMobXV0YXRlZEF1dGhEYXRhKS5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlLmF1dGhEYXRhW3Byb3ZpZGVyXSA9IG11dGF0ZWRBdXRoRGF0YVtwcm92aWRlcl07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJ1biB0aGUgREIgdXBkYXRlIGRpcmVjdGx5LCBhcyAnbWFzdGVyJyBvbmx5IGlmIGF1dGhEYXRhIGNvbnRhaW5zIHNvbWUga2V5c1xuICAgICAgICAvLyBhdXRoRGF0YSBjb3VsZCBub3QgY29udGFpbnMga2V5cyBhZnRlciB2YWxpZGF0aW9uIGlmIHRoZSBhdXRoQWRhcHRlclxuICAgICAgICAvLyB1c2VzIHRoZSBgZG9Ob3RTYXZlYCBvcHRpb24uIEp1c3QgdXBkYXRlIHRoZSBhdXRoRGF0YSBwYXJ0XG4gICAgICAgIC8vIFRoZW4gd2UncmUgZ29vZCBmb3IgdGhlIHVzZXIsIGVhcmx5IGV4aXQgb2Ygc29ydHNcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZGF0YS5hdXRoRGF0YSkubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgcXVlcnkgPSB7IG9iamVjdElkOiB0aGlzLmRhdGEub2JqZWN0SWQgfTtcbiAgICAgICAgICAvLyBPcHRpbWlzdGljIGxvY2tpbmc6IGluY2x1ZGUgZWFjaCBjaGFuZ2VkIG9yaWdpbmFsIGZpZWxkIGluIHRoZSBXSEVSRSBjbGF1c2VcbiAgICAgICAgICAvLyBmb3IgcHJvdmlkZXJzIHdob3NlIGRhdGEgaXMgYmVpbmcgdXBkYXRlZC4gVGhpcyBwcmV2ZW50cyBjb25jdXJyZW50IHJlcXVlc3RzXG4gICAgICAgICAgLy8gZnJvbSBib3RoIHN1Y2NlZWRpbmcgd2hlbiBjb25zdW1pbmcgc2luZ2xlLXVzZSB0b2tlbnMgKGUuZy4gTUZBIHJlY292ZXJ5IGNvZGVzXG4gICAgICAgICAgLy8gYXMgYXJyYXlzLCBvciBNRkEgU01TIE9UUCB0b2tlbnMgYXMgc3RyaW5ncykuXG4gICAgICAgICAgYXBwbHlBdXRoRGF0YU9wdGltaXN0aWNMb2NrKHF1ZXJ5LCBvcmlnaW5hbEF1dGhEYXRhLCB0aGlzLmRhdGEuYXV0aERhdGEpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZy5kYXRhYmFzZS51cGRhdGUoXG4gICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgeyBhdXRoRGF0YTogdGhpcy5kYXRhLmF1dGhEYXRhIH0sXG4gICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuU0NSSVBUX0ZBSUxFRCwgJ0ludmFsaWQgYXV0aCBkYXRhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl90aHJvd0lmQXV0aERhdGFEdXBsaWNhdGUoZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5kYXRhLmF1dGhEYXRhICYmIE9iamVjdC5rZXlzKHRoaXMuZGF0YS5hdXRoRGF0YSkubGVuZ3RoKSB7XG4gICAgICAgIC8vIFVQREFURSBwYXRoIChlLmcuIFBVVCAvdXNlcnMvOmlkIGR1cmluZyBsaW5rZWQtcHJvdmlkZXIgcmUtYXV0aCk6IGFwcGx5XG4gICAgICAgIC8vIHRoZSBzYW1lIG9wdGltaXN0aWMgbG9jayB0byB0aGUgc3Vic2VxdWVudCBydW5EYXRhYmFzZU9wZXJhdGlvbiB1cGRhdGUgc29cbiAgICAgICAgLy8gY29uY3VycmVudCBzaW5nbGUtdXNlIHRva2VuIGNvbnN1bWVycyBjYW5ub3QgYm90aCBzdWNjZWVkLlxuICAgICAgICBhcHBseUF1dGhEYXRhT3B0aW1pc3RpY0xvY2sodGhpcy5xdWVyeSwgb3JpZ2luYWxBdXRoRGF0YSwgdGhpcy5kYXRhLmF1dGhEYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8vIFJlamVjdHMgaW50ZXJuYWwgZmllbGRzIGluIGNsaWVudC1zdXBwbGllZCBkYXRhXG5SZXN0V3JpdGUucHJvdG90eXBlLmNoZWNrSW50ZXJuYWxGaWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmF1dGguaXNNYXN0ZXIgfHwgdGhpcy5hdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChjb25zdCBmaWVsZE5hbWUgaW4gdGhpcy5kYXRhKSB7XG4gICAgaWYgKGZpZWxkTmFtZS5jaGFyQXQoMCkgPT09ICdfJykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsIGBJbnZhbGlkIGZpZWxkIG5hbWU6ICR7ZmllbGROYW1lfS5gKTtcbiAgICB9XG4gIH1cbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuY2hlY2tSZXN0cmljdGVkRmllbGRzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbGFzc05hbWUgIT09ICdfVXNlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXRoaXMuYXV0aC5pc01haW50ZW5hbmNlICYmICF0aGlzLmF1dGguaXNNYXN0ZXIgJiYgJ2VtYWlsVmVyaWZpZWQnIGluIHRoaXMuZGF0YSkge1xuICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgIFwiQ2xpZW50cyBhcmVuJ3QgYWxsb3dlZCB0byBtYW51YWxseSB1cGRhdGUgZW1haWwgdmVyaWZpY2F0aW9uLlwiLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59O1xuXG4vLyBWYWxpZGF0ZXMgdGhlIGNyZWF0ZSBvciB1cGRhdGUgY2xhc3MtbGV2ZWwgcGVybWlzc2lvbiBiZWZvcmUgc2NoZW1hIHZhbGlkYXRpb25cblJlc3RXcml0ZS5wcm90b3R5cGUudmFsaWRhdGVXcml0ZVBlcm1pc3Npb24gPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmF1dGguaXNNYXN0ZXIgfHwgdGhpcy5hdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc2NoZW1hQ29udHJvbGxlciA9IGF3YWl0IHRoaXMuY29uZmlnLmRhdGFiYXNlLmxvYWRTY2hlbWEoKTtcbiAgYXdhaXQgc2NoZW1hQ29udHJvbGxlci52YWxpZGF0ZVBlcm1pc3Npb24oXG4gICAgdGhpcy5jbGFzc05hbWUsXG4gICAgdGhpcy5ydW5PcHRpb25zLmFjbCB8fCBbXSxcbiAgICB0aGlzLnF1ZXJ5ID8gJ3VwZGF0ZScgOiAnY3JlYXRlJ1xuICApO1xufTtcblxuLy8gQXV0aG9yaXplIGEgX1VzZXIgdXBkYXRlIGJlZm9yZSBhbnkgc3RlcCByZWFkcyB0aGUgdGFyZ2V0IGFjY291bnRcblJlc3RXcml0ZS5wcm90b3R5cGUuYXV0aG9yaXplVXNlclVwZGF0ZSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9PSAnX1VzZXInIHx8ICF0aGlzLnF1ZXJ5KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0aGlzLmF1dGguaXNNYXN0ZXIgfHwgdGhpcy5hdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHRoaXMuYXV0aC5pc1VuYXV0aGVudGljYXRlZCgpKSB7XG4gICAgdGhyb3cgY3JlYXRlU2FuaXRpemVkRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5TRVNTSU9OX01JU1NJTkcsXG4gICAgICBgQ2Fubm90IG1vZGlmeSB1c2VyICR7dGhpcy5xdWVyeS5vYmplY3RJZH0uYCxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxuICAvLyBCb2R5IG9iamVjdElkIG11c3Qgbm90IHJldGFyZ2V0IHRoZSB1cGRhdGVcbiAgaWYgKHRoaXMuZGF0YS5vYmplY3RJZCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZGF0YS5vYmplY3RJZCAhPT0gdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnT2JqZWN0IG5vdCBmb3VuZC4nKTtcbiAgfVxuICAvLyBPd25lciB1cGRhdGUgcmVhZHMgb25seSBvd24gZGF0YTsgdGhlIHdyaXRlIHN0YXlzIEFDTC1jaGVja2VkXG4gIGlmICh0aGlzLmF1dGgudXNlci5pZCA9PT0gdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBXcml0ZSBhY2Nlc3MgY2hlY2sgdmlhIHRoZSB3cml0ZS1wYXRoIEFDTCBlbmZvcmNlbWVudFxuICBhd2FpdCB0aGlzLmNvbmZpZy5kYXRhYmFzZS51cGRhdGUoXG4gICAgdGhpcy5jbGFzc05hbWUsXG4gICAgeyBvYmplY3RJZDogdGhpcy5xdWVyeS5vYmplY3RJZCB9LFxuICAgIHt9LFxuICAgIHRoaXMucnVuT3B0aW9ucyxcbiAgICBmYWxzZSxcbiAgICB0cnVlXG4gICk7XG59O1xuXG4vLyBUaGUgbm9uLXRoaXJkLXBhcnR5IHBhcnRzIG9mIFVzZXIgdHJhbnNmb3JtYXRpb25cblJlc3RXcml0ZS5wcm90b3R5cGUudHJhbnNmb3JtVXNlciA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9PSAnX1VzZXInKSB7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICAvLyBEbyBub3QgY2xlYW51cCBzZXNzaW9uIGlmIG9iamVjdElkIGlzIG5vdCBzZXRcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5vYmplY3RJZCgpKSB7XG4gICAgLy8gSWYgd2UncmUgdXBkYXRpbmcgYSBfVXNlciBvYmplY3QsIHdlIG5lZWQgdG8gY2xlYXIgb3V0IHRoZSBjYWNoZSBmb3IgdGhhdCB1c2VyLiBGaW5kIGFsbCB0aGVpclxuICAgIC8vIHNlc3Npb24gdG9rZW5zLCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgY2FjaGUuXG4gICAgY29uc3QgcXVlcnkgPSBhd2FpdCBSZXN0UXVlcnkoe1xuICAgICAgbWV0aG9kOiBSZXN0UXVlcnkuTWV0aG9kLmZpbmQsXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgYXV0aDogQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpLFxuICAgICAgY2xhc3NOYW1lOiAnX1Nlc3Npb24nLFxuICAgICAgcnVuQmVmb3JlRmluZDogZmFsc2UsXG4gICAgICByZXN0V2hlcmU6IHtcbiAgICAgICAgdXNlcjoge1xuICAgICAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgICAgICBvYmplY3RJZDogdGhpcy5vYmplY3RJZCgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBwcm9taXNlID0gcXVlcnkuZXhlY3V0ZSgpLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICByZXN1bHRzLnJlc3VsdHMuZm9yRWFjaChzZXNzaW9uID0+XG4gICAgICAgIHRoaXMuY29uZmlnLmNhY2hlQ29udHJvbGxlci51c2VyLmRlbChzZXNzaW9uLnNlc3Npb25Ub2tlbilcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHJvbWlzZVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIC8vIFRyYW5zZm9ybSB0aGUgcGFzc3dvcmRcbiAgICAgIGlmICh0aGlzLmRhdGEucGFzc3dvcmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBpZ25vcmUgb25seSBpZiB1bmRlZmluZWQuIHNob3VsZCBwcm9jZWVkIGlmIGVtcHR5ICgnJylcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdWVyeSkge1xuICAgICAgICB0aGlzLnN0b3JhZ2VbJ2NsZWFyU2Vzc2lvbnMnXSA9IHRydWU7XG4gICAgICAgIC8vIEdlbmVyYXRlIGEgbmV3IHNlc3Npb24gb25seSBpZiB0aGUgdXNlciByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKCF0aGlzLmF1dGguaXNNYXN0ZXIgJiYgIXRoaXMuYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgICAgICAgdGhpcy5zdG9yYWdlWydnZW5lcmF0ZU5ld1Nlc3Npb24nXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlUGFzc3dvcmRQb2xpY3koKS50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHBhc3N3b3JkQ3J5cHRvLmhhc2godGhpcy5kYXRhLnBhc3N3b3JkKS50aGVuKGhhc2hlZFBhc3N3b3JkID0+IHtcbiAgICAgICAgICB0aGlzLmRhdGEuX2hhc2hlZF9wYXNzd29yZCA9IGhhc2hlZFBhc3N3b3JkO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmRhdGEucGFzc3dvcmQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVVc2VyTmFtZSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlRW1haWwoKTtcbiAgICB9KTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuX3ZhbGlkYXRlVXNlck5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIENoZWNrIGZvciB1c2VybmFtZSB1bmlxdWVuZXNzXG4gIGlmICghdGhpcy5kYXRhLnVzZXJuYW1lKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXJ5KSB7XG4gICAgICB0aGlzLmRhdGEudXNlcm5hbWUgPSBjcnlwdG9VdGlscy5yYW5kb21TdHJpbmcoMjUpO1xuICAgICAgdGhpcy5yZXNwb25zZVNob3VsZEhhdmVVc2VybmFtZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICAvKlxuICAgIFVzZXJuYW1lcyBzaG91bGQgYmUgdW5pcXVlIHdoZW4gY29tcGFyZWQgY2FzZSBpbnNlbnNpdGl2ZWx5XG5cbiAgICBVc2VycyBzaG91bGQgYmUgYWJsZSB0byBtYWtlIGNhc2Ugc2Vuc2l0aXZlIHVzZXJuYW1lcyBhbmRcbiAgICBsb2dpbiB1c2luZyB0aGUgY2FzZSB0aGV5IGVudGVyZWQuICBJLmUuICdTbm9vcHknIHNob3VsZCBwcmVjbHVkZVxuICAgICdzbm9vcHknIGFzIGEgdmFsaWQgdXNlcm5hbWUuXG4gICovXG4gIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgIC5maW5kKFxuICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICB7XG4gICAgICAgIHVzZXJuYW1lOiB0aGlzLmRhdGEudXNlcm5hbWUsXG4gICAgICAgIG9iamVjdElkOiB7ICRuZTogdGhpcy5vYmplY3RJZCgpIH0sXG4gICAgICB9LFxuICAgICAgeyBsaW1pdDogMSwgY2FzZUluc2Vuc2l0aXZlOiB0cnVlIH0sXG4gICAgICB7fSxcbiAgICAgIHRoaXMudmFsaWRTY2hlbWFDb250cm9sbGVyXG4gICAgKVxuICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuVVNFUk5BTUVfVEFLRU4sXG4gICAgICAgICAgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdXNlcm5hbWUuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xufTtcblxuUmVzdFdyaXRlLmJ1aWxkQ3JlYXRlZFdpdGggPSBmdW5jdGlvbiAoYWN0aW9uLCBhdXRoUHJvdmlkZXIpIHtcbiAgcmV0dXJuIHsgYWN0aW9uLCBhdXRoUHJvdmlkZXI6IGF1dGhQcm92aWRlciB8fCAncGFzc3dvcmQnIH07XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmdldENyZWF0ZWRXaXRoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5zdG9yYWdlLmNyZWF0ZWRXaXRoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5jcmVhdGVkV2l0aDtcbiAgfVxuICBjb25zdCBpc0NyZWF0ZU9wZXJhdGlvbiA9ICF0aGlzLnF1ZXJ5O1xuICBjb25zdCBhdXRoRGF0YVByb3ZpZGVyID1cbiAgICB0aGlzLmRhdGE/LmF1dGhEYXRhICYmXG4gICAgT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5sZW5ndGggJiZcbiAgICBPYmplY3Qua2V5cyh0aGlzLmRhdGEuYXV0aERhdGEpLmpvaW4oJywnKTtcbiAgY29uc3QgYXV0aFByb3ZpZGVyID0gdGhpcy5zdG9yYWdlLmF1dGhQcm92aWRlciB8fCBhdXRoRGF0YVByb3ZpZGVyO1xuICAvLyBzdG9yYWdlLmF1dGhQcm92aWRlciBpcyBvbmx5IHNldCBmb3IgbG9naW4gKGV4aXN0aW5nIHVzZXIgZm91bmQgaW4gaGFuZGxlQXV0aERhdGEpXG4gIGNvbnN0IGFjdGlvbiA9IHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgPyAnbG9naW4nIDogaXNDcmVhdGVPcGVyYXRpb24gPyAnc2lnbnVwJyA6IHVuZGVmaW5lZDtcbiAgaWYgKCFhY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcmVzb2x2ZWRBdXRoUHJvdmlkZXIgPSBhdXRoUHJvdmlkZXIgfHwgKGFjdGlvbiA9PT0gJ3NpZ251cCcgPyAncGFzc3dvcmQnIDogdW5kZWZpbmVkKTtcbiAgdGhpcy5zdG9yYWdlLmNyZWF0ZWRXaXRoID0gUmVzdFdyaXRlLmJ1aWxkQ3JlYXRlZFdpdGgoYWN0aW9uLCByZXNvbHZlZEF1dGhQcm92aWRlcik7XG4gIHJldHVybiB0aGlzLnN0b3JhZ2UuY3JlYXRlZFdpdGg7XG59O1xuXG4vKlxuICBBcyB3aXRoIHVzZXJuYW1lcywgUGFyc2Ugc2hvdWxkIG5vdCBhbGxvdyBjYXNlIGluc2Vuc2l0aXZlIGNvbGxpc2lvbnMgb2YgZW1haWwuXG4gIHVubGlrZSB3aXRoIHVzZXJuYW1lcyAod2hpY2ggY2FuIGhhdmUgY2FzZSBpbnNlbnNpdGl2ZSBjb2xsaXNpb25zIGluIHRoZSBjYXNlIG9mXG4gIGF1dGggYWRhcHRlcnMpLCBlbWFpbHMgc2hvdWxkIG5ldmVyIGhhdmUgYSBjYXNlIGluc2Vuc2l0aXZlIGNvbGxpc2lvbi5cblxuICBUaGlzIGJlaGF2aW9yIGNhbiBiZSBlbmZvcmNlZCB0aHJvdWdoIGEgcHJvcGVybHkgY29uZmlndXJlZCBpbmRleCBzZWU6XG4gIGh0dHBzOi8vZG9jcy5tb25nb2RiLmNvbS9tYW51YWwvY29yZS9pbmRleC1jYXNlLWluc2Vuc2l0aXZlLyNjcmVhdGUtYS1jYXNlLWluc2Vuc2l0aXZlLWluZGV4XG4gIHdoaWNoIGNvdWxkIGJlIGltcGxlbWVudGVkIGluc3RlYWQgb2YgdGhpcyBjb2RlIGJhc2VkIHZhbGlkYXRpb24uXG5cbiAgR2l2ZW4gdGhhdCB0aGlzIGxvb2t1cCBzaG91bGQgYmUgYSByZWxhdGl2ZWx5IGxvdyB1c2UgY2FzZSBhbmQgdGhhdCB0aGUgY2FzZSBzZW5zaXRpdmVcbiAgdW5pcXVlIGluZGV4IHdpbGwgYmUgdXNlZCBieSB0aGUgZGIgZm9yIHRoZSBxdWVyeSwgdGhpcyBpcyBhbiBhZGVxdWF0ZSBzb2x1dGlvbi5cbiovXG5SZXN0V3JpdGUucHJvdG90eXBlLl92YWxpZGF0ZUVtYWlsID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuZGF0YS5lbWFpbCB8fCB0aGlzLmRhdGEuZW1haWwuX19vcCA9PT0gJ0RlbGV0ZScpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgLy8gVmFsaWRhdGUgYmFzaWMgZW1haWwgYWRkcmVzcyBmb3JtYXRcbiAgaWYgKCF0aGlzLmRhdGEuZW1haWwubWF0Y2goL14uK0AuKyQvKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0VNQUlMX0FERFJFU1MsICdFbWFpbCBhZGRyZXNzIGZvcm1hdCBpcyBpbnZhbGlkLicpXG4gICAgKTtcbiAgfVxuICAvLyBDYXNlIGluc2Vuc2l0aXZlIG1hdGNoLCBzZWUgbm90ZSBhYm92ZSBmdW5jdGlvbi5cbiAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgLmZpbmQoXG4gICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIHtcbiAgICAgICAgZW1haWw6IHRoaXMuZGF0YS5lbWFpbCxcbiAgICAgICAgb2JqZWN0SWQ6IHsgJG5lOiB0aGlzLm9iamVjdElkKCkgfSxcbiAgICAgIH0sXG4gICAgICB7IGxpbWl0OiAxLCBjYXNlSW5zZW5zaXRpdmU6IHRydWUgfSxcbiAgICAgIHt9LFxuICAgICAgdGhpcy52YWxpZFNjaGVtYUNvbnRyb2xsZXJcbiAgICApXG4gICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5FTUFJTF9UQUtFTixcbiAgICAgICAgICAnQWNjb3VudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBlbWFpbCBhZGRyZXNzLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuZGF0YS5hdXRoRGF0YSB8fFxuICAgICAgICAhT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5sZW5ndGggfHxcbiAgICAgICAgKE9iamVjdC5rZXlzKHRoaXMuZGF0YS5hdXRoRGF0YSkubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKVswXSA9PT0gJ2Fub255bW91cycpXG4gICAgICApIHtcbiAgICAgICAgLy8gV2UgdXBkYXRlZCB0aGUgZW1haWwsIHNlbmQgYSBuZXcgdmFsaWRhdGlvblxuICAgICAgICBjb25zdCB7IG9yaWdpbmFsT2JqZWN0LCB1cGRhdGVkT2JqZWN0IH0gPSB0aGlzLmJ1aWxkUGFyc2VPYmplY3RzKCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgb3JpZ2luYWw6IG9yaWdpbmFsT2JqZWN0LFxuICAgICAgICAgIG9iamVjdDogdXBkYXRlZE9iamVjdCxcbiAgICAgICAgICBtYXN0ZXI6IHRoaXMuYXV0aC5pc01hc3RlcixcbiAgICAgICAgICBpcDogdGhpcy5jb25maWcuaXAsXG4gICAgICAgICAgaW5zdGFsbGF0aW9uSWQ6IHRoaXMuYXV0aC5pbnN0YWxsYXRpb25JZCxcbiAgICAgICAgICBjcmVhdGVkV2l0aDogdGhpcy5nZXRDcmVhdGVkV2l0aCgpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcudXNlckNvbnRyb2xsZXIuc2V0RW1haWxWZXJpZnlUb2tlbih0aGlzLmRhdGEsIHJlcXVlc3QsIHRoaXMuc3RvcmFnZSk7XG4gICAgICB9XG4gICAgfSk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLl92YWxpZGF0ZVBhc3N3b3JkUG9saWN5ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgfVxuICByZXR1cm4gdGhpcy5fdmFsaWRhdGVQYXNzd29yZFJlcXVpcmVtZW50cygpLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZVBhc3N3b3JkSGlzdG9yeSgpO1xuICB9KTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuX3ZhbGlkYXRlUGFzc3dvcmRSZXF1aXJlbWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIGNoZWNrIGlmIHRoZSBwYXNzd29yZCBjb25mb3JtcyB0byB0aGUgZGVmaW5lZCBwYXNzd29yZCBwb2xpY3kgaWYgY29uZmlndXJlZFxuICAvLyBJZiB3ZSBzcGVjaWZpZWQgYSBjdXN0b20gZXJyb3IgaW4gb3VyIGNvbmZpZ3VyYXRpb24gdXNlIGl0LlxuICAvLyBFeGFtcGxlOiBcIlBhc3N3b3JkcyBtdXN0IGluY2x1ZGUgYSBDYXBpdGFsIExldHRlciwgTG93ZXJjYXNlIExldHRlciwgYW5kIGEgbnVtYmVyLlwiXG4gIC8vXG4gIC8vIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgb24gdGhlIGdlbmVyaWMgXCJwYXNzd29yZCByZXNldFwiIHBhZ2UsXG4gIC8vIGFzIGl0IGFsbG93cyB0aGUgcHJvZ3JhbW1lciB0byBjb21tdW5pY2F0ZSBzcGVjaWZpYyByZXF1aXJlbWVudHMgaW5zdGVhZCBvZjpcbiAgLy8gYS4gbWFraW5nIHRoZSB1c2VyIGd1ZXNzIHdoYXRzIHdyb25nXG4gIC8vIGIuIG1ha2luZyBhIGN1c3RvbSBwYXNzd29yZCByZXNldCBwYWdlIHRoYXQgc2hvd3MgdGhlIHJlcXVpcmVtZW50c1xuICBjb25zdCBwb2xpY3lFcnJvciA9IHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnZhbGlkYXRpb25FcnJvclxuICAgID8gdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kudmFsaWRhdGlvbkVycm9yXG4gICAgOiAnUGFzc3dvcmQgZG9lcyBub3QgbWVldCB0aGUgUGFzc3dvcmQgUG9saWN5IHJlcXVpcmVtZW50cy4nO1xuICBjb25zdCBjb250YWluc1VzZXJuYW1lRXJyb3IgPSAnUGFzc3dvcmQgY2Fubm90IGNvbnRhaW4geW91ciB1c2VybmFtZS4nO1xuXG4gIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHBhc3N3b3JkIG1lZXRzIHRoZSBwYXNzd29yZCBzdHJlbmd0aCByZXF1aXJlbWVudHNcbiAgaWYgKFxuICAgICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5wYXR0ZXJuVmFsaWRhdG9yICYmXG4gICAgICAhdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kucGF0dGVyblZhbGlkYXRvcih0aGlzLmRhdGEucGFzc3dvcmQpKSB8fFxuICAgICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS52YWxpZGF0b3JDYWxsYmFjayAmJlxuICAgICAgIXRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnZhbGlkYXRvckNhbGxiYWNrKHRoaXMuZGF0YS5wYXNzd29yZCkpXG4gICkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVkFMSURBVElPTl9FUlJPUiwgcG9saWN5RXJyb3IpKTtcbiAgfVxuXG4gIC8vIGNoZWNrIHdoZXRoZXIgcGFzc3dvcmQgY29udGFpbiB1c2VybmFtZVxuICBpZiAodGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kuZG9Ob3RBbGxvd1VzZXJuYW1lID09PSB0cnVlKSB7XG4gICAgaWYgKHRoaXMuZGF0YS51c2VybmFtZSkge1xuICAgICAgLy8gdXNlcm5hbWUgaXMgbm90IHBhc3NlZCBkdXJpbmcgcGFzc3dvcmQgcmVzZXRcbiAgICAgIGlmICh0aGlzLmRhdGEucGFzc3dvcmQuaW5kZXhPZih0aGlzLmRhdGEudXNlcm5hbWUpID49IDApXG4gICAgICB7IHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVkFMSURBVElPTl9FUlJPUiwgY29udGFpbnNVc2VybmFtZUVycm9yKSk7IH1cbiAgICB9IGVsc2UgaWYgKHRoaXMucXVlcnkpIHtcbiAgICAgIC8vIHJldHJpZXZlIHRoZSBVc2VyIG9iamVjdCB1c2luZyB0aGUgVVJMIG9iamVjdCBJRCBkdXJpbmcgcGFzc3dvcmQgcmVzZXRcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS5maW5kKCdfVXNlcicsIHsgb2JqZWN0SWQ6IHRoaXMucXVlcnkub2JqZWN0SWQgfSkudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ09iamVjdCBub3QgZm91bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YS5wYXNzd29yZC5pbmRleE9mKHJlc3VsdHNbMF0udXNlcm5hbWUpID49IDApXG4gICAgICAgIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICAgIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLCBjb250YWluc1VzZXJuYW1lRXJyb3IpXG4gICAgICAgICk7IH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuX3ZhbGlkYXRlUGFzc3dvcmRIaXN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAvLyBjaGVjayB3aGV0aGVyIHBhc3N3b3JkIGlzIHJlcGVhdGluZyBmcm9tIHNwZWNpZmllZCBoaXN0b3J5XG4gIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeSkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmZpbmQoXG4gICAgICAgICdfVXNlcicsXG4gICAgICAgIHsgb2JqZWN0SWQ6IHRoaXMucXVlcnkub2JqZWN0SWQgfSxcbiAgICAgICAgeyBrZXlzOiBbJ19wYXNzd29yZF9oaXN0b3J5JywgJ19oYXNoZWRfcGFzc3dvcmQnXSB9LFxuICAgICAgICBBdXRoLm1haW50ZW5hbmNlKHRoaXMuY29uZmlnKVxuICAgICAgKVxuICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVzZXIgPSByZXN1bHRzWzBdO1xuICAgICAgICBsZXQgb2xkUGFzc3dvcmRzID0gW107XG4gICAgICAgIGlmICh1c2VyLl9wYXNzd29yZF9oaXN0b3J5KVxuICAgICAgICB7IG9sZFBhc3N3b3JkcyA9IF8udGFrZShcbiAgICAgICAgICB1c2VyLl9wYXNzd29yZF9oaXN0b3J5LFxuICAgICAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeSAtIDFcbiAgICAgICAgKTsgfVxuICAgICAgICBvbGRQYXNzd29yZHMucHVzaCh1c2VyLnBhc3N3b3JkKTtcbiAgICAgICAgY29uc3QgbmV3UGFzc3dvcmQgPSB0aGlzLmRhdGEucGFzc3dvcmQ7XG4gICAgICAgIC8vIGNvbXBhcmUgdGhlIG5ldyBwYXNzd29yZCBoYXNoIHdpdGggYWxsIG9sZCBwYXNzd29yZCBoYXNoZXNcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBvbGRQYXNzd29yZHMubWFwKGZ1bmN0aW9uIChoYXNoKSB7XG4gICAgICAgICAgcmV0dXJuIHBhc3N3b3JkQ3J5cHRvLmNvbXBhcmUobmV3UGFzc3dvcmQsIGhhc2gpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAvLyByZWplY3QgaWYgdGhlcmUgaXMgYSBtYXRjaFxuICAgICAgICAgICAgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ1JFUEVBVF9QQVNTV09SRCcpOyB9XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB3YWl0IGZvciBhbGwgY29tcGFyaXNvbnMgdG8gY29tcGxldGVcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgaWYgKGVyciA9PT0gJ1JFUEVBVF9QQVNTV09SRCcpXG4gICAgICAgICAgICAvLyBhIG1hdGNoIHdhcyBmb3VuZFxuICAgICAgICAgICAgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgICAgIG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgICBQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLFxuICAgICAgICAgICAgICAgIGBOZXcgcGFzc3dvcmQgc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSBhcyBsYXN0ICR7dGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRIaXN0b3J5fSBwYXNzd29yZHMuYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApOyB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmNyZWF0ZVNlc3Npb25Ub2tlbklmTmVlZGVkID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbGFzc05hbWUgIT09ICdfVXNlcicpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gRG9uJ3QgZ2VuZXJhdGUgc2Vzc2lvbiBmb3IgdXBkYXRpbmcgdXNlciAodGhpcy5xdWVyeSBpcyBzZXQpIHVubGVzcyBhdXRoRGF0YSBleGlzdHNcbiAgaWYgKHRoaXMucXVlcnkgJiYgIXRoaXMuZGF0YS5hdXRoRGF0YSkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBEb24ndCBnZW5lcmF0ZSBuZXcgc2Vzc2lvblRva2VuIGlmIGxpbmtpbmcgdmlhIHNlc3Npb25Ub2tlblxuICBpZiAodGhpcy5hdXRoLnVzZXIgJiYgdGhpcy5kYXRhLmF1dGhEYXRhKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIElmIHNpZ24tdXAgY2FsbFxuICBpZiAoIXRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIpIHtcbiAgICAvLyBDcmVhdGUgcmVxdWVzdCBvYmplY3QgZm9yIHZlcmlmaWNhdGlvbiBmdW5jdGlvbnNcbiAgICBjb25zdCB7IG9yaWdpbmFsT2JqZWN0LCB1cGRhdGVkT2JqZWN0IH0gPSB0aGlzLmJ1aWxkUGFyc2VPYmplY3RzKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIG9yaWdpbmFsOiBvcmlnaW5hbE9iamVjdCxcbiAgICAgIG9iamVjdDogdXBkYXRlZE9iamVjdCxcbiAgICAgIG1hc3RlcjogdGhpcy5hdXRoLmlzTWFzdGVyLFxuICAgICAgaXA6IHRoaXMuY29uZmlnLmlwLFxuICAgICAgaW5zdGFsbGF0aW9uSWQ6IHRoaXMuYXV0aC5pbnN0YWxsYXRpb25JZCxcbiAgICAgIGNyZWF0ZWRXaXRoOiB0aGlzLmdldENyZWF0ZWRXaXRoKCksXG4gICAgfTtcbiAgICAvLyBHZXQgdmVyaWZpY2F0aW9uIGNvbmRpdGlvbnMgd2hpY2ggY2FuIGJlIGJvb2xlYW5zIG9yIGZ1bmN0aW9uczsgdGhlIHB1cnBvc2Ugb2YgdGhpcyBhc3luYy9hd2FpdFxuICAgIC8vIHN0cnVjdHVyZSBpcyB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IGV4ZWN1dGluZyBzdWJzZXF1ZW50IGZ1bmN0aW9ucyBpZiBwcmV2aW91cyBvbmVzIGZhaWwgaW4gdGhlXG4gICAgLy8gY29uZGl0aW9uYWwgc3RhdGVtZW50IGJlbG93LCBhcyBhIGRldmVsb3BlciBtYXkgZGVjaWRlIHRvIGV4ZWN1dGUgZXhwZW5zaXZlIG9wZXJhdGlvbnMgaW4gdGhlbVxuICAgIGNvbnN0IHZlcmlmeVVzZXJFbWFpbHMgPSBhc3luYyAoKSA9PiB0aGlzLmNvbmZpZy52ZXJpZnlVc2VyRW1haWxzID09PSB0cnVlIHx8ICh0eXBlb2YgdGhpcy5jb25maWcudmVyaWZ5VXNlckVtYWlscyA9PT0gJ2Z1bmN0aW9uJyAmJiBhd2FpdCBQcm9taXNlLnJlc29sdmUodGhpcy5jb25maWcudmVyaWZ5VXNlckVtYWlscyhyZXF1ZXN0KSkgPT09IHRydWUpO1xuICAgIGNvbnN0IHByZXZlbnRMb2dpbldpdGhVbnZlcmlmaWVkRW1haWwgPSBhc3luYyAoKSA9PiB0aGlzLmNvbmZpZy5wcmV2ZW50TG9naW5XaXRoVW52ZXJpZmllZEVtYWlsID09PSB0cnVlIHx8ICh0eXBlb2YgdGhpcy5jb25maWcucHJldmVudExvZ2luV2l0aFVudmVyaWZpZWRFbWFpbCA9PT0gJ2Z1bmN0aW9uJyAmJiBhd2FpdCBQcm9taXNlLnJlc29sdmUodGhpcy5jb25maWcucHJldmVudExvZ2luV2l0aFVudmVyaWZpZWRFbWFpbChyZXF1ZXN0KSkgPT09IHRydWUpO1xuICAgIC8vIElmIHZlcmlmaWNhdGlvbiBpcyByZXF1aXJlZFxuICAgIGlmIChhd2FpdCB2ZXJpZnlVc2VyRW1haWxzKCkgJiYgYXdhaXQgcHJldmVudExvZ2luV2l0aFVudmVyaWZpZWRFbWFpbCgpKSB7XG4gICAgICB0aGlzLnN0b3JhZ2UucmVqZWN0U2lnbnVwID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuY3JlYXRlU2Vzc2lvblRva2VuKCk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmNyZWF0ZVNlc3Npb25Ub2tlbiA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgLy8gY2xvdWQgaW5zdGFsbGF0aW9uSWQgZnJvbSBDbG91ZCBDb2RlLFxuICAvLyBuZXZlciBjcmVhdGUgc2Vzc2lvbiB0b2tlbnMgZnJvbSB0aGVyZS5cbiAgaWYgKHRoaXMuYXV0aC5pbnN0YWxsYXRpb25JZCAmJiB0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWQgPT09ICdjbG91ZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodGhpcy5zdG9yYWdlLmF1dGhQcm92aWRlciA9PSBudWxsICYmIHRoaXMuZGF0YS5hdXRoRGF0YSkge1xuICAgIHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgPSBPYmplY3Qua2V5cyh0aGlzLmRhdGEuYXV0aERhdGEpLmpvaW4oJywnKTtcbiAgICAvLyBJbnZhbGlkYXRlIGNhY2hlZCBjcmVhdGVkV2l0aCBzaW5jZSBhdXRoUHJvdmlkZXIgd2FzIGp1c3QgcmVzb2x2ZWRcbiAgICBkZWxldGUgdGhpcy5zdG9yYWdlLmNyZWF0ZWRXaXRoO1xuICB9XG5cbiAgY29uc3QgY3JlYXRlZFdpdGggPSB0aGlzLmdldENyZWF0ZWRXaXRoKCk7XG4gIGNvbnN0IHsgc2Vzc2lvbkRhdGEsIGNyZWF0ZVNlc3Npb24gfSA9IFJlc3RXcml0ZS5jcmVhdGVTZXNzaW9uKHRoaXMuY29uZmlnLCB7XG4gICAgdXNlcklkOiB0aGlzLm9iamVjdElkKCksXG4gICAgY3JlYXRlZFdpdGgsXG4gICAgaW5zdGFsbGF0aW9uSWQ6IHRoaXMuYXV0aC5pbnN0YWxsYXRpb25JZCxcbiAgfSk7XG5cbiAgaWYgKHRoaXMucmVzcG9uc2UgJiYgdGhpcy5yZXNwb25zZS5yZXNwb25zZSkge1xuICAgIHRoaXMucmVzcG9uc2UucmVzcG9uc2Uuc2Vzc2lvblRva2VuID0gc2Vzc2lvbkRhdGEuc2Vzc2lvblRva2VuO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZVNlc3Npb24oKTtcbn07XG5cblJlc3RXcml0ZS5jcmVhdGVTZXNzaW9uID0gZnVuY3Rpb24gKFxuICBjb25maWcsXG4gIHsgdXNlcklkLCBjcmVhdGVkV2l0aCwgaW5zdGFsbGF0aW9uSWQsIGFkZGl0aW9uYWxTZXNzaW9uRGF0YSB9XG4pIHtcbiAgY29uc3QgdG9rZW4gPSAncjonICsgY3J5cHRvVXRpbHMubmV3VG9rZW4oKTtcbiAgY29uc3QgZXhwaXJlc0F0ID0gY29uZmlnLmdlbmVyYXRlU2Vzc2lvbkV4cGlyZXNBdCgpO1xuICBjb25zdCBzZXNzaW9uRGF0YSA9IHtcbiAgICBzZXNzaW9uVG9rZW46IHRva2VuLFxuICAgIHVzZXI6IHtcbiAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgY2xhc3NOYW1lOiAnX1VzZXInLFxuICAgICAgb2JqZWN0SWQ6IHVzZXJJZCxcbiAgICB9LFxuICAgIGNyZWF0ZWRXaXRoLFxuICAgIGV4cGlyZXNBdDogUGFyc2UuX2VuY29kZShleHBpcmVzQXQpLFxuICB9O1xuXG4gIGlmIChpbnN0YWxsYXRpb25JZCkge1xuICAgIHNlc3Npb25EYXRhLmluc3RhbGxhdGlvbklkID0gaW5zdGFsbGF0aW9uSWQ7XG4gIH1cblxuICBPYmplY3QuYXNzaWduKHNlc3Npb25EYXRhLCBhZGRpdGlvbmFsU2Vzc2lvbkRhdGEpO1xuXG4gIHJldHVybiB7XG4gICAgc2Vzc2lvbkRhdGEsXG4gICAgY3JlYXRlU2Vzc2lvbjogKCkgPT5cbiAgICAgIG5ldyBSZXN0V3JpdGUoY29uZmlnLCBBdXRoLm1hc3Rlcihjb25maWcpLCAnX1Nlc3Npb24nLCBudWxsLCBzZXNzaW9uRGF0YSkuZXhlY3V0ZSgpLFxuICB9O1xufTtcblxuLy8gRGVsZXRlIGVtYWlsIHJlc2V0IHRva2VucyBpZiB1c2VyIGlzIGNoYW5naW5nIHBhc3N3b3JkIG9yIGVtYWlsLlxuUmVzdFdyaXRlLnByb3RvdHlwZS5kZWxldGVFbWFpbFJlc2V0VG9rZW5JZk5lZWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9PSAnX1VzZXInIHx8IHRoaXMucXVlcnkgPT09IG51bGwpIHtcbiAgICAvLyBudWxsIHF1ZXJ5IG1lYW5zIGNyZWF0ZVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICgncGFzc3dvcmQnIGluIHRoaXMuZGF0YSB8fCAnZW1haWwnIGluIHRoaXMuZGF0YSkge1xuICAgIGNvbnN0IGFkZE9wcyA9IHtcbiAgICAgIF9wZXJpc2hhYmxlX3Rva2VuOiB7IF9fb3A6ICdEZWxldGUnIH0sXG4gICAgICBfcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0OiB7IF9fb3A6ICdEZWxldGUnIH0sXG4gICAgfTtcbiAgICB0aGlzLmRhdGEgPSBPYmplY3QuYXNzaWduKHRoaXMuZGF0YSwgYWRkT3BzKTtcbiAgfVxufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5kZXN0cm95RHVwbGljYXRlZFNlc3Npb25zID0gZnVuY3Rpb24gKCkge1xuICAvLyBTa2lwIGlmIHRoZSByZXNwb25zZSBpcyBhbHJlYWR5IHNldCwgbWF0Y2hpbmcgdGhlIG90aGVyIHdyaXRlLXBpcGVsaW5lIHN0ZXBzXG4gIC8vIChydW5EYXRhYmFzZU9wZXJhdGlvbiwgcnVuQWZ0ZXJTYXZlVHJpZ2dlcikuIEEgbm9uLW1hc3RlciBQT1NUIC9jbGFzc2VzL19TZXNzaW9uXG4gIC8vIGNyZWF0ZSBoYXMgaGFuZGxlU2Vzc2lvbigpIHNldCB0aGlzLnJlc3BvbnNlIGJlZm9yZSB0aGlzIHJ1bnMsIHNvIHRoaXMgZ3VhcmRcbiAgLy8gcHJldmVudHMgdGhlIGRlZHVwIGRlbGV0ZSBmcm9tIGFjdGluZyBvbiB0aGUgY2xpZW50LXN1cHBsaWVkIGB1c2VyYC9gaW5zdGFsbGF0aW9uSWRgXG4gIC8vIHJhdGhlciB0aGFuIG9uIHRoZSBzZXJ2ZXItZ2VuZXJhdGVkIHNlc3Npb24gZGF0YS5cbiAgaWYgKHRoaXMucmVzcG9uc2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gT25seSBmb3IgX1Nlc3Npb24sIGFuZCBhdCBjcmVhdGlvbiB0aW1lXG4gIGlmICh0aGlzLmNsYXNzTmFtZSAhPSAnX1Nlc3Npb24nIHx8IHRoaXMucXVlcnkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gRGVzdHJveSB0aGUgc2Vzc2lvbnMgaW4gJ0JhY2tncm91bmQnXG4gIGNvbnN0IHsgdXNlciwgaW5zdGFsbGF0aW9uSWQsIHNlc3Npb25Ub2tlbiB9ID0gdGhpcy5kYXRhO1xuICBpZiAoIXVzZXIgfHwgIWluc3RhbGxhdGlvbklkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghdXNlci5vYmplY3RJZCkge1xuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UuZGVzdHJveShcbiAgICAnX1Nlc3Npb24nLFxuICAgIHtcbiAgICAgIHVzZXIsXG4gICAgICBpbnN0YWxsYXRpb25JZCxcbiAgICAgIHNlc3Npb25Ub2tlbjogeyAkbmU6IHNlc3Npb25Ub2tlbiB9LFxuICAgIH0sXG4gICAge30sXG4gICAgdGhpcy52YWxpZFNjaGVtYUNvbnRyb2xsZXJcbiAgKS5jYXRjaChlID0+IHtcbiAgICBpZiAoZS5jb2RlICE9PSBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5EKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vLyBIYW5kbGVzIGFueSBmb2xsb3d1cCBsb2dpY1xuUmVzdFdyaXRlLnByb3RvdHlwZS5oYW5kbGVGb2xsb3d1cCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuc3RvcmFnZSAmJiB0aGlzLnN0b3JhZ2VbJ2NsZWFyU2Vzc2lvbnMnXSAmJiB0aGlzLmNvbmZpZy5yZXZva2VTZXNzaW9uT25QYXNzd29yZFJlc2V0KSB7XG4gICAgdmFyIHNlc3Npb25RdWVyeSA9IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgICAgb2JqZWN0SWQ6IHRoaXMub2JqZWN0SWQoKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5zdG9yYWdlWydjbGVhclNlc3Npb25zJ107XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgICAuZGVzdHJveSgnX1Nlc3Npb24nLCBzZXNzaW9uUXVlcnkpXG4gICAgICAudGhlbih0aGlzLmhhbmRsZUZvbGxvd3VwLmJpbmQodGhpcykpO1xuICB9XG5cbiAgaWYgKHRoaXMuc3RvcmFnZSAmJiB0aGlzLnN0b3JhZ2VbJ2dlbmVyYXRlTmV3U2Vzc2lvbiddKSB7XG4gICAgZGVsZXRlIHRoaXMuc3RvcmFnZVsnZ2VuZXJhdGVOZXdTZXNzaW9uJ107XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU2Vzc2lvblRva2VuKCkudGhlbih0aGlzLmhhbmRsZUZvbGxvd3VwLmJpbmQodGhpcykpO1xuICB9XG5cbiAgaWYgKHRoaXMuc3RvcmFnZSAmJiB0aGlzLnN0b3JhZ2VbJ3NlbmRWZXJpZmljYXRpb25FbWFpbCddKSB7XG4gICAgZGVsZXRlIHRoaXMuc3RvcmFnZVsnc2VuZFZlcmlmaWNhdGlvbkVtYWlsJ107XG4gICAgLy8gRmlyZSBhbmQgZm9yZ2V0IVxuICAgIHRoaXMuY29uZmlnLnVzZXJDb250cm9sbGVyLnNlbmRWZXJpZmljYXRpb25FbWFpbCh0aGlzLmRhdGEsIHsgYXV0aDogdGhpcy5hdXRoIH0pO1xuICAgIHJldHVybiB0aGlzLmhhbmRsZUZvbGxvd3VwLmJpbmQodGhpcyk7XG4gIH1cbn07XG5cbi8vIEhhbmRsZXMgdGhlIF9TZXNzaW9uIGNsYXNzIHNwZWNpYWxuZXNzLlxuLy8gRG9lcyBub3RoaW5nIGlmIHRoaXMgaXNuJ3QgYW4gX1Nlc3Npb24gb2JqZWN0LlxuUmVzdFdyaXRlLnByb3RvdHlwZS5oYW5kbGVTZXNzaW9uID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXNwb25zZSB8fCB0aGlzLmNsYXNzTmFtZSAhPT0gJ19TZXNzaW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghdGhpcy5hdXRoLnVzZXIgJiYgIXRoaXMuYXV0aC5pc01hc3RlciAmJiAhdGhpcy5hdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9TRVNTSU9OX1RPS0VOLCAnU2Vzc2lvbiB0b2tlbiByZXF1aXJlZC4nKTtcbiAgfVxuXG4gIC8vIFRPRE86IFZlcmlmeSBwcm9wZXIgZXJyb3IgdG8gdGhyb3dcbiAgaWYgKCdBQ0wnIGluIHRoaXMuZGF0YSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0tFWV9OQU1FLCAnQ2Fubm90IHNldCAnICsgJ0FDTCBvbiBhIFNlc3Npb24uJyk7XG4gIH1cblxuICBpZiAodGhpcy5xdWVyeSkge1xuICAgIGlmICgndXNlcicgaW4gdGhpcy5kYXRhICYmICF0aGlzLmF1dGguaXNNYXN0ZXIgJiYgdGhpcy5kYXRhLnVzZXI/Lm9iamVjdElkICE9PSB0aGlzLmF1dGgudXNlci5pZCkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsICdJbnZhbGlkIGtleSBuYW1lOiB1c2VyJyk7XG4gICAgfSBlbHNlIGlmICgnaW5zdGFsbGF0aW9uSWQnIGluIHRoaXMuZGF0YSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsICdJbnZhbGlkIGtleSBuYW1lOiBpbnN0YWxsYXRpb25JZCcpO1xuICAgIH0gZWxzZSBpZiAoJ3Nlc3Npb25Ub2tlbicgaW4gdGhpcy5kYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSwgJ0ludmFsaWQga2V5IG5hbWU6IHNlc3Npb25Ub2tlbicpO1xuICAgIH0gZWxzZSBpZiAoJ2V4cGlyZXNBdCcgaW4gdGhpcy5kYXRhICYmICF0aGlzLmF1dGguaXNNYXN0ZXIgJiYgIXRoaXMuYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSwgJ0ludmFsaWQga2V5IG5hbWU6IGV4cGlyZXNBdCcpO1xuICAgIH0gZWxzZSBpZiAoJ2NyZWF0ZWRXaXRoJyBpbiB0aGlzLmRhdGEgJiYgIXRoaXMuYXV0aC5pc01hc3RlciAmJiAhdGhpcy5hdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0tFWV9OQU1FLCAnSW52YWxpZCBrZXkgbmFtZTogY3JlYXRlZFdpdGgnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmF1dGguaXNNYXN0ZXIpIHtcbiAgICAgIHRoaXMucXVlcnkgPSB7XG4gICAgICAgICRhbmQ6IFtcbiAgICAgICAgICB0aGlzLnF1ZXJ5LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuYXV0aC51c2VyLmlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXRoaXMucXVlcnkgJiYgIXRoaXMuYXV0aC5pc01hc3RlciAmJiAhdGhpcy5hdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICBjb25zdCBhZGRpdGlvbmFsU2Vzc2lvbkRhdGEgPSB7fTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5kYXRhKSB7XG4gICAgICBpZiAoa2V5ID09PSAnb2JqZWN0SWQnIHx8IGtleSA9PT0gJ3VzZXInIHx8IGtleSA9PT0gJ3Nlc3Npb25Ub2tlbicgfHwga2V5ID09PSAnZXhwaXJlc0F0JyB8fCBrZXkgPT09ICdjcmVhdGVkV2l0aCcpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBhZGRpdGlvbmFsU2Vzc2lvbkRhdGFba2V5XSA9IHRoaXMuZGF0YVtrZXldO1xuICAgIH1cblxuICAgIGNvbnN0IHsgc2Vzc2lvbkRhdGEsIGNyZWF0ZVNlc3Npb24gfSA9IFJlc3RXcml0ZS5jcmVhdGVTZXNzaW9uKHRoaXMuY29uZmlnLCB7XG4gICAgICB1c2VySWQ6IHRoaXMuYXV0aC51c2VyLmlkLFxuICAgICAgY3JlYXRlZFdpdGg6IHtcbiAgICAgICAgYWN0aW9uOiAnY3JlYXRlJyxcbiAgICAgIH0sXG4gICAgICBhZGRpdGlvbmFsU2Vzc2lvbkRhdGEsXG4gICAgfSk7XG5cbiAgICAvLyBFbmZvcmNlIHRoZSBjYWxsZXIncyBjbGFzcy1sZXZlbCBwZXJtaXNzaW9ucyBhbmQgc2NoZW1hIGJlZm9yZSB0aGUgbWFzdGVyIHdyaXRlXG4gICAgY29uc3QgdmFsaWRhdGVkID0gdGhpcy52YWxpZGF0ZVdyaXRlUGVybWlzc2lvbigpLnRoZW4oKCkgPT4gdGhpcy52YWxpZGF0ZVNjaGVtYSgpKTtcbiAgICByZXR1cm4gdmFsaWRhdGVkLnRoZW4oKCkgPT4gY3JlYXRlU2Vzc2lvbigpKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgaWYgKCFyZXN1bHRzLnJlc3BvbnNlKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlRFUk5BTF9TRVJWRVJfRVJST1IsICdFcnJvciBjcmVhdGluZyBzZXNzaW9uLicpO1xuICAgICAgfVxuICAgICAgc2Vzc2lvbkRhdGFbJ29iamVjdElkJ10gPSByZXN1bHRzLnJlc3BvbnNlWydvYmplY3RJZCddO1xuICAgICAgdGhpcy5yZXNwb25zZSA9IHtcbiAgICAgICAgc3RhdHVzOiAyMDEsXG4gICAgICAgIGxvY2F0aW9uOiByZXN1bHRzLmxvY2F0aW9uLFxuICAgICAgICByZXNwb25zZTogc2Vzc2lvbkRhdGEsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59O1xuXG4vLyBIYW5kbGVzIHRoZSBfSW5zdGFsbGF0aW9uIGNsYXNzIHNwZWNpYWxuZXNzLlxuLy8gRG9lcyBub3RoaW5nIGlmIHRoaXMgaXNuJ3QgYW4gaW5zdGFsbGF0aW9uIG9iamVjdC5cbi8vIElmIGFuIGluc3RhbGxhdGlvbiBpcyBmb3VuZCwgdGhpcyBjYW4gbXV0YXRlIHRoaXMucXVlcnkgYW5kIHR1cm4gYSBjcmVhdGVcbi8vIGludG8gYW4gdXBkYXRlLlxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZW4gd2UncmUgZG9uZSBpZiBpdCBjYW4ndCBmaW5pc2ggdGhpcyB0aWNrLlxuUmVzdFdyaXRlLnByb3RvdHlwZS5oYW5kbGVJbnN0YWxsYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnJlc3BvbnNlIHx8IHRoaXMuY2xhc3NOYW1lICE9PSAnX0luc3RhbGxhdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgZGVkdXBsaWNhdGlvbiBiZWxvdyBlbWJlZHMgdGhlc2UgY2xpZW50LXN1cHBsaWVkIHZhbHVlcyBkaXJlY3RseSBpbnRvIGRhdGFiYXNlXG4gIC8vIHF1ZXJpZXMgdGhhdCBkZWxldGUgb3IgdXBkYXRlIHJvd3Mgd2l0aCBtYXN0ZXIgcHJpdmlsZWdlcywgYW5kIGl0IHJ1bnMgYmVmb3JlXG4gIC8vIGB2YWxpZGF0ZVNjaGVtYWAsIHNvIHRoZWlyIHR5cGVzIG11c3QgYmUgZW5mb3JjZWQgaGVyZTogYSBub24tc3RyaW5nIHZhbHVlIHdvdWxkXG4gIC8vIG90aGVyd2lzZSByZWFjaCB0aGUgZGF0YWJhc2UgYXMgYSBxdWVyeSBjb25zdHJhaW50IChzdWNoIGFzIGFuIG9wZXJhdG9yIG9iamVjdFxuICAvLyBge1wiJG5lXCI6IG51bGx9YCkgbWF0Y2hpbmcgcm93cyB0aGUgY2xpZW50IG5ldmVyIGlkZW50aWZpZWQsIGluc3RlYWQgb2YgYXMgYSBsaXRlcmFsXG4gIC8vIHZhbHVlIHRvIG1hdGNoIGFnYWluc3QuIFRoZSBzY2hlbWEgZGVjbGFyZXMgYWxsIHRocmVlIGFzIGBTdHJpbmdgLCBidXQgdGhhdCBjaGVja1xuICAvLyBjYW5ub3QgYmUgcmV1c2VkIGhlcmU7IGl0IHJ1bnMgbGF0ZXIgaW4gdGhlIHdyaXRlIHBpcGVsaW5lIGFuZCBtb3ZpbmcgaXQgZWFybGllclxuICAvLyB3b3VsZCBtdXRhdGUgdGhlIHNjaGVtYSBiZWZvcmUgdGhlIHBlcm1pc3Npb24gY2hlY2suIFRoZSBmaWVsZCBsaXN0IGlzIGEgcHJvcGVydHkgb2ZcbiAgLy8gdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiBvZiB0aGUgc2NoZW1hOiBpdCBpcyB0aGUgc2V0IG9mIHZhbHVlcyBzcGxpY2VkIGludG8gdGhlXG4gIC8vIGRlZHVwbGljYXRpb24gcXVlcmllcyBiZWxvdy5cbiAgZm9yIChjb25zdCBmaWVsZE5hbWUgb2YgWydkZXZpY2VUb2tlbicsICdpbnN0YWxsYXRpb25JZCcsICdhcHBJZGVudGlmaWVyJ10pIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVtmaWVsZE5hbWVdO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZmllbGROYW1lID09PSAnYXBwSWRlbnRpZmllcicgJiYgdmFsdWUuX19vcCA9PT0gJ0RlbGV0ZScpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBhY3R1YWxUeXBlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gJ0FycmF5J1xuICAgICAgOiBgJHt0eXBlb2YgdmFsdWV9YC5yZXBsYWNlKC9eLi8sIGNoYXJhY3RlciA9PiBjaGFyYWN0ZXIudG9VcHBlckNhc2UoKSk7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuSU5DT1JSRUNUX1RZUEUsXG4gICAgICBgc2NoZW1hIG1pc21hdGNoIGZvciBfSW5zdGFsbGF0aW9uLiR7ZmllbGROYW1lfTsgZXhwZWN0ZWQgU3RyaW5nIGJ1dCBnb3QgJHthY3R1YWxUeXBlfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKFxuICAgICF0aGlzLnF1ZXJ5ICYmXG4gICAgIXRoaXMuZGF0YS5kZXZpY2VUb2tlbiAmJlxuICAgICF0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQgJiZcbiAgICAhdGhpcy5hdXRoLmluc3RhbGxhdGlvbklkXG4gICkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIDEzNSxcbiAgICAgICdhdCBsZWFzdCBvbmUgSUQgZmllbGQgKGRldmljZVRva2VuLCBpbnN0YWxsYXRpb25JZCkgJyArICdtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGlzIG9wZXJhdGlvbidcbiAgICApO1xuICB9XG5cbiAgLy8gSWYgdGhlIGRldmljZSB0b2tlbiBpcyA2NCBjaGFyYWN0ZXJzIGxvbmcsIHdlIGFzc3VtZSBpdCBpcyBmb3IgaU9TXG4gIC8vIGFuZCBsb3dlcmNhc2UgaXQuXG4gIGlmICh0aGlzLmRhdGEuZGV2aWNlVG9rZW4gJiYgdGhpcy5kYXRhLmRldmljZVRva2VuLmxlbmd0aCA9PSA2NCkge1xuICAgIHRoaXMuZGF0YS5kZXZpY2VUb2tlbiA9IHRoaXMuZGF0YS5kZXZpY2VUb2tlbi50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLy8gV2UgbG93ZXJjYXNlIHRoZSBpbnN0YWxsYXRpb25JZCBpZiBwcmVzZW50XG4gIGlmICh0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQpIHtcbiAgICB0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQgPSB0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIGxldCBpbnN0YWxsYXRpb25JZCA9IHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZDtcblxuICAvLyBDcmVhdGUgb25seTogdGhlIHJlcXVlc3QgaW5zdGFsbGF0aW9uIElEIG5hbWVzIHRoZSBjYWxsZXIncyBvd24gaW5zdGFsbGF0aW9uXG4gIGlmICghaW5zdGFsbGF0aW9uSWQgJiYgIXRoaXMucXVlcnkgJiYgIXRoaXMuYXV0aC5pc01hc3RlciAmJiAhdGhpcy5hdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICBpbnN0YWxsYXRpb25JZCA9IHRoaXMuYXV0aC5pbnN0YWxsYXRpb25JZDtcbiAgfVxuXG4gIGlmIChpbnN0YWxsYXRpb25JZCkge1xuICAgIGluc3RhbGxhdGlvbklkID0gaW5zdGFsbGF0aW9uSWQudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIC8vIFVwZGF0aW5nIF9JbnN0YWxsYXRpb24gYnV0IG5vdCB1cGRhdGluZyBhbnl0aGluZyBjcml0aWNhbFxuICBpZiAodGhpcy5xdWVyeSAmJiAhdGhpcy5kYXRhLmRldmljZVRva2VuICYmICFpbnN0YWxsYXRpb25JZCAmJiAhdGhpcy5kYXRhLmRldmljZVR5cGUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIHZhciBpZE1hdGNoOyAvLyBXaWxsIGJlIGEgbWF0Y2ggb24gZWl0aGVyIG9iamVjdElkIG9yIGluc3RhbGxhdGlvbklkXG4gIHZhciBvYmplY3RJZE1hdGNoO1xuICB2YXIgaW5zdGFsbGF0aW9uSWRNYXRjaDtcbiAgdmFyIGRldmljZVRva2VuTWF0Y2hlcyA9IFtdO1xuXG4gIC8vIEluc3RlYWQgb2YgaXNzdWluZyAzIHJlYWRzLCBsZXQncyBkbyBpdCB3aXRoIG9uZSBPUi5cbiAgY29uc3Qgb3JRdWVyaWVzID0gW107XG4gIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMucXVlcnkub2JqZWN0SWQpIHtcbiAgICBvclF1ZXJpZXMucHVzaCh7XG4gICAgICBvYmplY3RJZDogdGhpcy5xdWVyeS5vYmplY3RJZCxcbiAgICB9KTtcbiAgfVxuICBpZiAoaW5zdGFsbGF0aW9uSWQpIHtcbiAgICBvclF1ZXJpZXMucHVzaCh7XG4gICAgICBpbnN0YWxsYXRpb25JZDogaW5zdGFsbGF0aW9uSWQsXG4gICAgfSk7XG4gIH1cbiAgaWYgKHRoaXMuZGF0YS5kZXZpY2VUb2tlbikge1xuICAgIG9yUXVlcmllcy5wdXNoKHsgZGV2aWNlVG9rZW46IHRoaXMuZGF0YS5kZXZpY2VUb2tlbiB9KTtcbiAgfVxuXG4gIGlmIChvclF1ZXJpZXMubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwcm9taXNlID0gcHJvbWlzZVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS5maW5kKFxuICAgICAgICAnX0luc3RhbGxhdGlvbicsXG4gICAgICAgIHtcbiAgICAgICAgICAkb3I6IG9yUXVlcmllcyxcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgICk7XG4gICAgfSlcbiAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgIHJlc3VsdHMuZm9yRWFjaChyZXN1bHQgPT4ge1xuICAgICAgICBpZiAodGhpcy5xdWVyeSAmJiB0aGlzLnF1ZXJ5Lm9iamVjdElkICYmIHJlc3VsdC5vYmplY3RJZCA9PSB0aGlzLnF1ZXJ5Lm9iamVjdElkKSB7XG4gICAgICAgICAgb2JqZWN0SWRNYXRjaCA9IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0Lmluc3RhbGxhdGlvbklkID09IGluc3RhbGxhdGlvbklkKSB7XG4gICAgICAgICAgaW5zdGFsbGF0aW9uSWRNYXRjaCA9IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmRldmljZVRva2VuID09IHRoaXMuZGF0YS5kZXZpY2VUb2tlbikge1xuICAgICAgICAgIGRldmljZVRva2VuTWF0Y2hlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBTYW5pdHkgY2hlY2tzIHdoZW4gcnVubmluZyBhIHF1ZXJ5XG4gICAgICBpZiAodGhpcy5xdWVyeSAmJiB0aGlzLnF1ZXJ5Lm9iamVjdElkKSB7XG4gICAgICAgIGlmICghb2JqZWN0SWRNYXRjaCkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnT2JqZWN0IG5vdCBmb3VuZCBmb3IgdXBkYXRlLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQgJiZcbiAgICAgICAgICBvYmplY3RJZE1hdGNoLmluc3RhbGxhdGlvbklkICYmXG4gICAgICAgICAgdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkICE9PSBvYmplY3RJZE1hdGNoLmluc3RhbGxhdGlvbklkXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxMzYsICdpbnN0YWxsYXRpb25JZCBtYXkgbm90IGJlIGNoYW5nZWQgaW4gdGhpcyAnICsgJ29wZXJhdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmRhdGEuZGV2aWNlVG9rZW4gJiZcbiAgICAgICAgICBvYmplY3RJZE1hdGNoLmRldmljZVRva2VuICYmXG4gICAgICAgICAgdGhpcy5kYXRhLmRldmljZVRva2VuICE9PSBvYmplY3RJZE1hdGNoLmRldmljZVRva2VuICYmXG4gICAgICAgICAgIXRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCAmJlxuICAgICAgICAgICFvYmplY3RJZE1hdGNoLmluc3RhbGxhdGlvbklkXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxMzYsICdkZXZpY2VUb2tlbiBtYXkgbm90IGJlIGNoYW5nZWQgaW4gdGhpcyAnICsgJ29wZXJhdGlvbicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmRhdGEuZGV2aWNlVHlwZSAmJlxuICAgICAgICAgIHRoaXMuZGF0YS5kZXZpY2VUeXBlICYmXG4gICAgICAgICAgdGhpcy5kYXRhLmRldmljZVR5cGUgIT09IG9iamVjdElkTWF0Y2guZGV2aWNlVHlwZVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoMTM2LCAnZGV2aWNlVHlwZSBtYXkgbm90IGJlIGNoYW5nZWQgaW4gdGhpcyAnICsgJ29wZXJhdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMucXVlcnkub2JqZWN0SWQgJiYgb2JqZWN0SWRNYXRjaCkge1xuICAgICAgICBpZE1hdGNoID0gb2JqZWN0SWRNYXRjaDtcbiAgICAgIH1cblxuICAgICAgaWYgKGluc3RhbGxhdGlvbklkICYmIGluc3RhbGxhdGlvbklkTWF0Y2gpIHtcbiAgICAgICAgaWRNYXRjaCA9IGluc3RhbGxhdGlvbklkTWF0Y2g7XG4gICAgICB9XG4gICAgICAvLyBuZWVkIHRvIHNwZWNpZnkgZGV2aWNlVHlwZSBvbmx5IGlmIGl0J3MgbmV3XG4gICAgICBpZiAoIXRoaXMucXVlcnkgJiYgIXRoaXMuZGF0YS5kZXZpY2VUeXBlICYmICFpZE1hdGNoKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxMzUsICdkZXZpY2VUeXBlIG11c3QgYmUgc3BlY2lmaWVkIGluIHRoaXMgb3BlcmF0aW9uJyk7XG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIWlkTWF0Y2gpIHtcbiAgICAgICAgaWYgKCFkZXZpY2VUb2tlbk1hdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIGRldmljZVRva2VuTWF0Y2hlcy5sZW5ndGggPT0gMSAmJlxuICAgICAgICAgICghZGV2aWNlVG9rZW5NYXRjaGVzWzBdWydpbnN0YWxsYXRpb25JZCddIHx8ICFpbnN0YWxsYXRpb25JZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gU2luZ2xlIG1hdGNoIG9uIGRldmljZSB0b2tlbiBidXQgbm9uZSBvbiBpbnN0YWxsYXRpb25JZCwgYW5kIGVpdGhlclxuICAgICAgICAgIC8vIHRoZSBwYXNzZWQgb2JqZWN0IG9yIHRoZSBtYXRjaCBpcyBtaXNzaW5nIGFuIGluc3RhbGxhdGlvbklkLCBzbyB3ZVxuICAgICAgICAgIC8vIGNhbiBqdXN0IHJldHVybiB0aGUgbWF0Y2guXG4gICAgICAgICAgcmV0dXJuIGRldmljZVRva2VuTWF0Y2hlc1swXVsnb2JqZWN0SWQnXTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgMTMyLFxuICAgICAgICAgICAgJ011c3Qgc3BlY2lmeSBpbnN0YWxsYXRpb25JZCB3aGVuIGRldmljZVRva2VuICcgK1xuICAgICAgICAgICAgICAnbWF0Y2hlcyBtdWx0aXBsZSBJbnN0YWxsYXRpb24gb2JqZWN0cydcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE11bHRpcGxlIGRldmljZSB0b2tlbiBtYXRjaGVzIGFuZCB3ZSBzcGVjaWZpZWQgYW4gaW5zdGFsbGF0aW9uIElELFxuICAgICAgICAgIC8vIG9yIGEgc2luZ2xlIG1hdGNoIHdoZXJlIGJvdGggdGhlIHBhc3NlZCBhbmQgbWF0Y2hpbmcgb2JqZWN0cyBoYXZlXG4gICAgICAgICAgLy8gYW4gaW5zdGFsbGF0aW9uIElELiBDbGVhbiBvdXQgb3RoZXIgaW5zdGFsbGF0aW9ucyB0aGF0IG1hdGNoIHRoZVxuICAgICAgICAgIC8vIGRldmljZVRva2VuLCBhbmQgcmV0dXJuIG5pbCB0byBzaWduYWwgdGhhdCBhIG5ldyBvYmplY3Qgc2hvdWxkIGJlXG4gICAgICAgICAgLy8gY3JlYXRlZC5cbiAgICAgICAgICBjb25zdCBkZWxRdWVyeSA9IHtcbiAgICAgICAgICAgIGRldmljZVRva2VuOiB0aGlzLmRhdGEuZGV2aWNlVG9rZW4sXG4gICAgICAgICAgICBpbnN0YWxsYXRpb25JZDoge1xuICAgICAgICAgICAgICAkbmU6IGluc3RhbGxhdGlvbklkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh0aGlzLmRhdGEuYXBwSWRlbnRpZmllcikge1xuICAgICAgICAgICAgLy8gQSBgRGVsZXRlYCBvcGVyYXRpb24gaXMgYXBwbGllZCBvbmx5IGFmdGVyIHRoZSBkZWR1cGxpY2F0aW9uIHJ1bnMsIGFuZCBub1xuICAgICAgICAgICAgLy8gaW5zdGFsbGF0aW9uIG1hdGNoZWQgaGVyZSB0byB0YWtlIGEgc2NvcGUgZnJvbS4gU2tpcCB0aGUgY2xlYW51cCByYXRoZXIgdGhhblxuICAgICAgICAgICAgLy8gcnVuIGl0IHVuc2NvcGVkIGFjcm9zcyBldmVyeSBhcHBsaWNhdGlvbiwgb3IgcXVlcnkgb24gdGhlIG9wZXJhdGlvbiBpdHNlbGYuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGF0YS5hcHBJZGVudGlmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxRdWVyeVsnYXBwSWRlbnRpZmllciddID0gdGhpcy5kYXRhLmFwcElkZW50aWZpZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGluc3RhbGxhdGlvbk9wdHMgPSB0aGlzLmNvbmZpZy5pbnN0YWxsYXRpb24gfHwge307XG4gICAgICAgICAgcmV0dXJuIEluc3RhbGxhdGlvbkRlZHVwLnJlbW92ZUNvbmZsaWN0aW5nRGV2aWNlVG9rZW4oe1xuICAgICAgICAgICAgZGF0YWJhc2U6IHRoaXMuY29uZmlnLmRhdGFiYXNlLFxuICAgICAgICAgICAgcXVlcnk6IGRlbFF1ZXJ5LFxuICAgICAgICAgICAgYWN0aW9uOiBpbnN0YWxsYXRpb25PcHRzLmR1cGxpY2F0ZURldmljZVRva2VuQWN0aW9uIHx8ICdkZWxldGUnLFxuICAgICAgICAgICAgZW5mb3JjZUF1dGg6IGluc3RhbGxhdGlvbk9wdHMuZHVwbGljYXRlRGV2aWNlVG9rZW5BY3Rpb25FbmZvcmNlQXV0aCA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIHJ1bk9wdGlvbnM6IHRoaXMucnVuT3B0aW9ucyxcbiAgICAgICAgICAgIHZhbGlkU2NoZW1hQ29udHJvbGxlcjogdGhpcy52YWxpZFNjaGVtYUNvbnRyb2xsZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChkZXZpY2VUb2tlbk1hdGNoZXMubGVuZ3RoID09IDEgJiYgIWRldmljZVRva2VuTWF0Y2hlc1swXVsnaW5zdGFsbGF0aW9uSWQnXSkge1xuICAgICAgICAgIC8vIEV4YWN0bHkgb25lIGRldmljZSB0b2tlbiBtYXRjaCBhbmQgaXQgZG9lc24ndCBoYXZlIGFuIGluc3RhbGxhdGlvblxuICAgICAgICAgIC8vIElELiBUaGUgdHdvIHJvd3MgcmVwcmVzZW50IHRoZSBzYW1lIGluc3RhbGw7IHJlc29sdmUgdGhlIG1lcmdlIHBlclxuICAgICAgICAgIC8vIHRoZSBjb25maWd1cmVkIG9wdGlvbnMuXG4gICAgICAgICAgY29uc3QgaW5zdGFsbGF0aW9uT3B0cyA9IHRoaXMuY29uZmlnLmluc3RhbGxhdGlvbiB8fCB7fTtcbiAgICAgICAgICByZXR1cm4gSW5zdGFsbGF0aW9uRGVkdXAuYXBwbHlEdXBsaWNhdGVEZXZpY2VUb2tlbk1lcmdlKHtcbiAgICAgICAgICAgIGRhdGFiYXNlOiB0aGlzLmNvbmZpZy5kYXRhYmFzZSxcbiAgICAgICAgICAgIGlkTWF0Y2gsXG4gICAgICAgICAgICBkZXZpY2VUb2tlbk1hdGNoOiBkZXZpY2VUb2tlbk1hdGNoZXNbMF0sXG4gICAgICAgICAgICBhY3Rpb246IGluc3RhbGxhdGlvbk9wdHMuZHVwbGljYXRlRGV2aWNlVG9rZW5BY3Rpb24gfHwgJ2RlbGV0ZScsXG4gICAgICAgICAgICBtZXJnZVByaW9yaXR5OiBpbnN0YWxsYXRpb25PcHRzLmR1cGxpY2F0ZURldmljZVRva2VuTWVyZ2VQcmlvcml0eSB8fCAnZGV2aWNlVG9rZW4nLFxuICAgICAgICAgICAgZW5mb3JjZUF1dGg6IGluc3RhbGxhdGlvbk9wdHMuZHVwbGljYXRlRGV2aWNlVG9rZW5BY3Rpb25FbmZvcmNlQXV0aCA9PT0gdHJ1ZSxcbiAgICAgICAgICAgIHJ1bk9wdGlvbnM6IHRoaXMucnVuT3B0aW9ucyxcbiAgICAgICAgICAgIHZhbGlkU2NoZW1hQ29udHJvbGxlcjogdGhpcy52YWxpZFNjaGVtYUNvbnRyb2xsZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGF0YS5kZXZpY2VUb2tlbiAmJiBpZE1hdGNoLmRldmljZVRva2VuICE9IHRoaXMuZGF0YS5kZXZpY2VUb2tlbikge1xuICAgICAgICAgICAgLy8gV2UncmUgc2V0dGluZyB0aGUgZGV2aWNlIHRva2VuIG9uIGFuIGV4aXN0aW5nIGluc3RhbGxhdGlvbiwgc29cbiAgICAgICAgICAgIC8vIHdlIHNob3VsZCB0cnkgY2xlYW5pbmcgb3V0IG9sZCBpbnN0YWxsYXRpb25zIHRoYXQgbWF0Y2ggdGhpc1xuICAgICAgICAgICAgLy8gZGV2aWNlIHRva2VuLlxuICAgICAgICAgICAgY29uc3QgZGVsUXVlcnkgPSB7XG4gICAgICAgICAgICAgIGRldmljZVRva2VuOiB0aGlzLmRhdGEuZGV2aWNlVG9rZW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHVuaXF1ZSBpbnN0YWxsIElkLCB1c2UgdGhhdCB0byBwcmVzZXJ2ZVxuICAgICAgICAgICAgLy8gdGhlIGludGVyZXN0aW5nIGluc3RhbGxhdGlvblxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCkge1xuICAgICAgICAgICAgICBkZWxRdWVyeVsnaW5zdGFsbGF0aW9uSWQnXSA9IHtcbiAgICAgICAgICAgICAgICAkbmU6IHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIGlkTWF0Y2gub2JqZWN0SWQgJiZcbiAgICAgICAgICAgICAgdGhpcy5kYXRhLm9iamVjdElkICYmXG4gICAgICAgICAgICAgIGlkTWF0Y2gub2JqZWN0SWQgPT0gdGhpcy5kYXRhLm9iamVjdElkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gd2UgcGFzc2VkIGFuIG9iamVjdElkLCBwcmVzZXJ2ZSB0aGF0IGluc3RhbGF0aW9uXG4gICAgICAgICAgICAgIGRlbFF1ZXJ5WydvYmplY3RJZCddID0ge1xuICAgICAgICAgICAgICAgICRuZTogaWRNYXRjaC5vYmplY3RJZCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFdoYXQgdG8gZG8gaGVyZT8gY2FuJ3QgcmVhbGx5IGNsZWFuIHVwIGV2ZXJ5dGhpbmcuLi5cbiAgICAgICAgICAgICAgcmV0dXJuIGlkTWF0Y2gub2JqZWN0SWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLmFwcElkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgLy8gQSBgRGVsZXRlYCBvcGVyYXRpb24gaXMgYXBwbGllZCBvbmx5IGFmdGVyIHRoZSBkZWR1cGxpY2F0aW9uIHJ1bnMsIHNvIHNjb3BlXG4gICAgICAgICAgICAgIC8vIHRoZSBjbGVhbnVwIHRvIHRoZSB2YWx1ZSB0aGUgbWF0Y2hlZCBpbnN0YWxsYXRpb24gc3RpbGwgaG9sZHMuIERyb3BwaW5nIHRoZVxuICAgICAgICAgICAgICAvLyBjb25zdHJhaW50IHdvdWxkIGxldCB0aGUgY2xlYW51cCByZWFjaCBpbnN0YWxsYXRpb25zIG9mIG90aGVyIGFwcGxpY2F0aW9ucyxcbiAgICAgICAgICAgICAgLy8gYW5kIHRoZSBvcGVyYXRpb24gaXRzZWxmIGNhbm5vdCBtYXRjaCBhIFN0cmluZywgc28gc2tpcCB0aGUgY2xlYW51cCB3aGVuIG5vXG4gICAgICAgICAgICAgIC8vIHNjb3BlIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgICAgY29uc3QgYXBwSWRlbnRpZmllciA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMuZGF0YS5hcHBJZGVudGlmaWVyID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgPyB0aGlzLmRhdGEuYXBwSWRlbnRpZmllclxuICAgICAgICAgICAgICAgICAgOiBpZE1hdGNoLmFwcElkZW50aWZpZXI7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgYXBwSWRlbnRpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWRNYXRjaC5vYmplY3RJZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWxRdWVyeVsnYXBwSWRlbnRpZmllciddID0gYXBwSWRlbnRpZmllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGluc3RhbGxhdGlvbk9wdHMgPSB0aGlzLmNvbmZpZy5pbnN0YWxsYXRpb24gfHwge307XG4gICAgICAgICAgICByZXR1cm4gSW5zdGFsbGF0aW9uRGVkdXAucmVtb3ZlQ29uZmxpY3RpbmdEZXZpY2VUb2tlbih7XG4gICAgICAgICAgICAgIGRhdGFiYXNlOiB0aGlzLmNvbmZpZy5kYXRhYmFzZSxcbiAgICAgICAgICAgICAgcXVlcnk6IGRlbFF1ZXJ5LFxuICAgICAgICAgICAgICBhY3Rpb246IGluc3RhbGxhdGlvbk9wdHMuZHVwbGljYXRlRGV2aWNlVG9rZW5BY3Rpb24gfHwgJ2RlbGV0ZScsXG4gICAgICAgICAgICAgIGVuZm9yY2VBdXRoOiBpbnN0YWxsYXRpb25PcHRzLmR1cGxpY2F0ZURldmljZVRva2VuQWN0aW9uRW5mb3JjZUF1dGggPT09IHRydWUsXG4gICAgICAgICAgICAgIHJ1bk9wdGlvbnM6IHRoaXMucnVuT3B0aW9ucyxcbiAgICAgICAgICAgICAgdmFsaWRTY2hlbWFDb250cm9sbGVyOiB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlcixcbiAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4gaWRNYXRjaC5vYmplY3RJZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEluIG5vbi1tZXJnZSBzY2VuYXJpb3MsIGp1c3QgcmV0dXJuIHRoZSBpbnN0YWxsYXRpb24gbWF0Y2ggaWRcbiAgICAgICAgICByZXR1cm4gaWRNYXRjaC5vYmplY3RJZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgLnRoZW4ob2JqSWQgPT4ge1xuICAgICAgaWYgKG9iaklkKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSB7IG9iamVjdElkOiBvYmpJZCB9O1xuICAgICAgICBkZWxldGUgdGhpcy5kYXRhLm9iamVjdElkO1xuICAgICAgICBkZWxldGUgdGhpcy5kYXRhLmNyZWF0ZWRBdDtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IFZhbGlkYXRlIG9wcyAoYWRkL3JlbW92ZSBvbiBjaGFubmVscywgJGluYyBvbiBiYWRnZSwgZXRjLilcbiAgICB9KTtcbiAgcmV0dXJuIHByb21pc2U7XG59O1xuXG4vLyBJZiB3ZSBzaG9ydC1jaXJjdWl0ZWQgdGhlIG9iamVjdCByZXNwb25zZSAtIHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgZXhwYW5kIGFsbCB0aGUgZmlsZXMsXG4vLyBzaW5jZSB0aGlzIG1pZ2h0IG5vdCBoYXZlIGEgcXVlcnksIG1lYW5pbmcgaXQgd29uJ3QgcmV0dXJuIHRoZSBmdWxsIHJlc3VsdCBiYWNrLlxuLy8gVE9ETzogKG5sdXRzZW5rbykgVGhpcyBzaG91bGQgZGllIHdoZW4gd2UgbW92ZSB0byBwZXItY2xhc3MgYmFzZWQgY29udHJvbGxlcnMgb24gX1Nlc3Npb24vX1VzZXJcblJlc3RXcml0ZS5wcm90b3R5cGUuZXhwYW5kRmlsZXNGb3JFeGlzdGluZ09iamVjdHMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIC8vIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIHNob3J0LWNpcmN1aXRlZCByZXNwb25zZSAtIG9ubHkgdGhlbiBydW4gZXhwYW5zaW9uLlxuICBpZiAodGhpcy5yZXNwb25zZSAmJiB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlKSB7XG4gICAgYXdhaXQgdGhpcy5jb25maWcuZmlsZXNDb250cm9sbGVyLmV4cGFuZEZpbGVzSW5PYmplY3QodGhpcy5jb25maWcsIHRoaXMucmVzcG9uc2UucmVzcG9uc2UpO1xuICB9XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLnJ1bkRhdGFiYXNlT3BlcmF0aW9uID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Sb2xlJykge1xuICAgIHRoaXMuY29uZmlnLmNhY2hlQ29udHJvbGxlci5yb2xlLmNsZWFyKCk7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIpIHtcbiAgICAgIHRoaXMuY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIuY2xlYXJDYWNoZWRSb2xlcyh0aGlzLmF1dGgudXNlcik7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInICYmIHRoaXMucXVlcnkgJiYgdGhpcy5hdXRoLmlzVW5hdXRoZW50aWNhdGVkKCkpIHtcbiAgICB0aHJvdyBjcmVhdGVTYW5pdGl6ZWRFcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLlNFU1NJT05fTUlTU0lORyxcbiAgICAgIGBDYW5ub3QgbW9kaWZ5IHVzZXIgJHt0aGlzLnF1ZXJ5Lm9iamVjdElkfS5gLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG5cbiAgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnX1Byb2R1Y3QnICYmIHRoaXMuZGF0YS5kb3dubG9hZCkge1xuICAgIHRoaXMuZGF0YS5kb3dubG9hZE5hbWUgPSB0aGlzLmRhdGEuZG93bmxvYWQubmFtZTtcbiAgfVxuXG4gIC8vIFRPRE86IEFkZCBiZXR0ZXIgZGV0ZWN0aW9uIGZvciBBQ0wsIGVuc3VyaW5nIGEgdXNlciBjYW4ndCBiZSBsb2NrZWQgZnJvbVxuICAvLyAgICAgICB0aGVpciBvd24gdXNlciByZWNvcmQuXG4gIGlmICh0aGlzLmRhdGEuQUNMICYmIHRoaXMuZGF0YS5BQ0xbJyp1bnJlc29sdmVkJ10pIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9BQ0wsICdJbnZhbGlkIEFDTC4nKTtcbiAgfVxuXG4gIGlmICh0aGlzLnF1ZXJ5KSB7XG4gICAgLy8gRm9yY2UgdGhlIHVzZXIgdG8gbm90IGxvY2tvdXRcbiAgICAvLyBNYXRjaGVkIHdpdGggcGFyc2UuY29tXG4gICAgaWYgKFxuICAgICAgdGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgJiZcbiAgICAgIHRoaXMuZGF0YS5BQ0wgJiZcbiAgICAgIHRoaXMuYXV0aC5pc01hc3RlciAhPT0gdHJ1ZSAmJlxuICAgICAgdGhpcy5hdXRoLmlzTWFpbnRlbmFuY2UgIT09IHRydWVcbiAgICApIHtcbiAgICAgIHRoaXMuZGF0YS5BQ0xbdGhpcy5xdWVyeS5vYmplY3RJZF0gPSB7IHJlYWQ6IHRydWUsIHdyaXRlOiB0cnVlIH07XG4gICAgfVxuICAgIC8vIHVwZGF0ZSBwYXNzd29yZCB0aW1lc3RhbXAgaWYgdXNlciBwYXNzd29yZCBpcyBiZWluZyBjaGFuZ2VkXG4gICAgaWYgKFxuICAgICAgdGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgJiZcbiAgICAgIHRoaXMuZGF0YS5faGFzaGVkX3Bhc3N3b3JkICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeSAmJlxuICAgICAgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRBZ2VcbiAgICApIHtcbiAgICAgIHRoaXMuZGF0YS5fcGFzc3dvcmRfY2hhbmdlZF9hdCA9IFBhcnNlLl9lbmNvZGUobmV3IERhdGUoKSk7XG4gICAgfVxuICAgIC8vIElnbm9yZSBjcmVhdGVkQXQgd2hlbiB1cGRhdGVcbiAgICBkZWxldGUgdGhpcy5kYXRhLmNyZWF0ZWRBdDtcblxuICAgIGxldCBkZWZlciA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIC8vIGlmIHBhc3N3b3JkIGhpc3RvcnkgaXMgZW5hYmxlZCB0aGVuIHNhdmUgdGhlIGN1cnJlbnQgcGFzc3dvcmQgdG8gaGlzdG9yeVxuICAgIGlmIChcbiAgICAgIHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInICYmXG4gICAgICB0aGlzLmRhdGEuX2hhc2hlZF9wYXNzd29yZCAmJlxuICAgICAgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kgJiZcbiAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeVxuICAgICkge1xuICAgICAgZGVmZXIgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgICAuZmluZChcbiAgICAgICAgICAnX1VzZXInLFxuICAgICAgICAgIHsgb2JqZWN0SWQ6IHRoaXMucXVlcnkub2JqZWN0SWQgfSxcbiAgICAgICAgICB7IGtleXM6IFsnX3Bhc3N3b3JkX2hpc3RvcnknLCAnX2hhc2hlZF9wYXNzd29yZCddIH0sXG4gICAgICAgICAgQXV0aC5tYWludGVuYW5jZSh0aGlzLmNvbmZpZylcbiAgICAgICAgKVxuICAgICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT0gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB1c2VyID0gcmVzdWx0c1swXTtcbiAgICAgICAgICBsZXQgb2xkUGFzc3dvcmRzID0gW107XG4gICAgICAgICAgaWYgKHVzZXIuX3Bhc3N3b3JkX2hpc3RvcnkpIHtcbiAgICAgICAgICAgIG9sZFBhc3N3b3JkcyA9IF8udGFrZShcbiAgICAgICAgICAgICAgdXNlci5fcGFzc3dvcmRfaGlzdG9yeSxcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRIaXN0b3J5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL24tMSBwYXNzd29yZHMgZ28gaW50byBoaXN0b3J5IGluY2x1ZGluZyBsYXN0IHBhc3N3b3JkXG4gICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgb2xkUGFzc3dvcmRzLmxlbmd0aCA+IE1hdGgubWF4KDAsIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeSAtIDIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBvbGRQYXNzd29yZHMuc2hpZnQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2xkUGFzc3dvcmRzLnB1c2godXNlci5wYXNzd29yZCk7XG4gICAgICAgICAgdGhpcy5kYXRhLl9wYXNzd29yZF9oaXN0b3J5ID0gb2xkUGFzc3dvcmRzO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmZXIudGhlbigoKSA9PiB7XG4gICAgICAvLyBSdW4gYW4gdXBkYXRlXG4gICAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgICAgLnVwZGF0ZShcbiAgICAgICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgICAgICB0aGlzLnF1ZXJ5LFxuICAgICAgICAgIHRoaXMuZGF0YSxcbiAgICAgICAgICB0aGlzLnJ1bk9wdGlvbnMsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgdGhpcy52YWxpZFNjaGVtYUNvbnRyb2xsZXJcbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHRoaXMuX3Rocm93SWZBdXRoRGF0YUR1cGxpY2F0ZShlcnJvcik7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICByZXNwb25zZS51cGRhdGVkQXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICAgICAgICB0aGlzLl91cGRhdGVSZXNwb25zZVdpdGhEYXRhKHJlc3BvbnNlLCB0aGlzLmRhdGEpO1xuICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSB7IHJlc3BvbnNlIH07XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIFNldCB0aGUgZGVmYXVsdCBBQ0wgYW5kIHBhc3N3b3JkIHRpbWVzdGFtcCBmb3IgdGhlIG5ldyBfVXNlclxuICAgIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgICAgdmFyIEFDTCA9IHRoaXMuZGF0YS5BQ0w7XG4gICAgICAvLyBkZWZhdWx0IHB1YmxpYyByL3cgQUNMXG4gICAgICBpZiAoIUFDTCkge1xuICAgICAgICBBQ0wgPSB7fTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5lbmZvcmNlUHJpdmF0ZVVzZXJzKSB7XG4gICAgICAgICAgQUNMWycqJ10gPSB7IHJlYWQ6IHRydWUsIHdyaXRlOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBtYWtlIHN1cmUgdGhlIHVzZXIgaXMgbm90IGxvY2tlZCBkb3duXG4gICAgICBBQ0xbdGhpcy5kYXRhLm9iamVjdElkXSA9IHsgcmVhZDogdHJ1ZSwgd3JpdGU6IHRydWUgfTtcbiAgICAgIHRoaXMuZGF0YS5BQ0wgPSBBQ0w7XG4gICAgICAvLyBwYXNzd29yZCB0aW1lc3RhbXAgdG8gYmUgdXNlZCB3aGVuIHBhc3N3b3JkIGV4cGlyeSBwb2xpY3kgaXMgZW5mb3JjZWRcbiAgICAgIGlmICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeSAmJiB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEFnZSkge1xuICAgICAgICB0aGlzLmRhdGEuX3Bhc3N3b3JkX2NoYW5nZWRfYXQgPSBQYXJzZS5fZW5jb2RlKG5ldyBEYXRlKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJ1biBhIGNyZWF0ZVxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmNyZWF0ZSh0aGlzLmNsYXNzTmFtZSwgdGhpcy5kYXRhLCB0aGlzLnJ1bk9wdGlvbnMsIGZhbHNlLCB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlcilcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNsYXNzTmFtZSAhPT0gJ19Vc2VyJyB8fCBlcnJvci5jb2RlICE9PSBQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Rocm93SWZBdXRoRGF0YUR1cGxpY2F0ZShlcnJvcik7XG5cbiAgICAgICAgLy8gUXVpY2sgY2hlY2ssIGlmIHdlIHdlcmUgYWJsZSB0byBpbmZlciB0aGUgZHVwbGljYXRlZCBmaWVsZCBuYW1lXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci51c2VySW5mbyAmJiBlcnJvci51c2VySW5mby5kdXBsaWNhdGVkX2ZpZWxkID09PSAndXNlcm5hbWUnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuVVNFUk5BTUVfVEFLRU4sXG4gICAgICAgICAgICAnQWNjb3VudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyB1c2VybmFtZS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci51c2VySW5mbyAmJiBlcnJvci51c2VySW5mby5kdXBsaWNhdGVkX2ZpZWxkID09PSAnZW1haWwnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuRU1BSUxfVEFLRU4sXG4gICAgICAgICAgICAnQWNjb3VudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBlbWFpbCBhZGRyZXNzLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhpcyB3YXMgYSBmYWlsZWQgdXNlciBjcmVhdGlvbiBkdWUgdG8gdXNlcm5hbWUgb3IgZW1haWwgYWxyZWFkeSB0YWtlbiwgd2UgbmVlZCB0b1xuICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGl0IHdhcyB1c2VybmFtZSBvciBlbWFpbCBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBlcnJvci5cbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gdGhlIG9yaWdpbmFsIG1ldGhvZFxuICAgICAgICAvLyBUT0RPOiBTZWUgaWYgd2UgY2FuIGxhdGVyIGRvIHRoaXMgd2l0aG91dCBhZGRpdGlvbmFsIHF1ZXJpZXMgYnkgdXNpbmcgbmFtZWQgaW5kZXhlcy5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgICAgICAgLmZpbmQoXG4gICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdXNlcm5hbWU6IHRoaXMuZGF0YS51c2VybmFtZSxcbiAgICAgICAgICAgICAgb2JqZWN0SWQ6IHsgJG5lOiB0aGlzLm9iamVjdElkKCkgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IGxpbWl0OiAxIH1cbiAgICAgICAgICApXG4gICAgICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgICBQYXJzZS5FcnJvci5VU0VSTkFNRV9UQUtFTixcbiAgICAgICAgICAgICAgICAnQWNjb3VudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyB1c2VybmFtZS4nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UuZmluZChcbiAgICAgICAgICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgICAgIHsgZW1haWw6IHRoaXMuZGF0YS5lbWFpbCwgb2JqZWN0SWQ6IHsgJG5lOiB0aGlzLm9iamVjdElkKCkgfSB9LFxuICAgICAgICAgICAgICB7IGxpbWl0OiAxIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICAgIFBhcnNlLkVycm9yLkVNQUlMX1RBS0VOLFxuICAgICAgICAgICAgICAgICdBY2NvdW50IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIGVtYWlsIGFkZHJlc3MuJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICBQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUsXG4gICAgICAgICAgICAgICdBIGR1cGxpY2F0ZSB2YWx1ZSBmb3IgYSBmaWVsZCB3aXRoIHVuaXF1ZSB2YWx1ZXMgd2FzIHByb3ZpZGVkJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgIHJlc3BvbnNlLm9iamVjdElkID0gdGhpcy5kYXRhLm9iamVjdElkO1xuICAgICAgICByZXNwb25zZS5jcmVhdGVkQXQgPSB0aGlzLmRhdGEuY3JlYXRlZEF0O1xuXG4gICAgICAgIGlmICh0aGlzLnJlc3BvbnNlU2hvdWxkSGF2ZVVzZXJuYW1lKSB7XG4gICAgICAgICAgcmVzcG9uc2UudXNlcm5hbWUgPSB0aGlzLmRhdGEudXNlcm5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdXBkYXRlUmVzcG9uc2VXaXRoRGF0YShyZXNwb25zZSwgdGhpcy5kYXRhKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHtcbiAgICAgICAgICBzdGF0dXM6IDIwMSxcbiAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbigpLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cbn07XG5cbi8vIFJldHVybnMgbm90aGluZyAtIGRvZXNuJ3Qgd2FpdCBmb3IgdGhlIHRyaWdnZXIuXG5SZXN0V3JpdGUucHJvdG90eXBlLnJ1bkFmdGVyU2F2ZVRyaWdnZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5yZXNwb25zZSB8fCAhdGhpcy5yZXNwb25zZS5yZXNwb25zZSB8fCB0aGlzLnJ1bk9wdGlvbnMubWFueSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEF2b2lkIGRvaW5nIGFueSBzZXR1cCBmb3IgdHJpZ2dlcnMgaWYgdGhlcmUgaXMgbm8gJ2FmdGVyU2F2ZScgdHJpZ2dlciBmb3IgdGhpcyBjbGFzcy5cbiAgY29uc3QgaGFzQWZ0ZXJTYXZlSG9vayA9IHRyaWdnZXJzLnRyaWdnZXJFeGlzdHMoXG4gICAgdGhpcy5jbGFzc05hbWUsXG4gICAgdHJpZ2dlcnMuVHlwZXMuYWZ0ZXJTYXZlLFxuICAgIHRoaXMuY29uZmlnLmFwcGxpY2F0aW9uSWRcbiAgKTtcbiAgY29uc3QgaGFzTGl2ZVF1ZXJ5ID0gdGhpcy5jb25maWcubGl2ZVF1ZXJ5Q29udHJvbGxlci5oYXNMaXZlUXVlcnkodGhpcy5jbGFzc05hbWUpO1xuICBpZiAoIWhhc0FmdGVyU2F2ZUhvb2sgJiYgIWhhc0xpdmVRdWVyeSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIGNvbnN0IHsgb3JpZ2luYWxPYmplY3QsIHVwZGF0ZWRPYmplY3QgfSA9IHRoaXMuYnVpbGRQYXJzZU9iamVjdHMoKTtcbiAgdXBkYXRlZE9iamVjdC5faGFuZGxlU2F2ZVJlc3BvbnNlKFxuICAgIHRoaXMuY2xvbmVXaXRoRmlsZVVybHModGhpcy5yZXNwb25zZS5yZXNwb25zZSksXG4gICAgdGhpcy5yZXNwb25zZS5zdGF0dXMgfHwgMjAwXG4gICk7XG5cbiAgaWYgKGhhc0xpdmVRdWVyeSkge1xuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgICAubG9hZFNjaGVtYSgpXG4gICAgICAudGhlbihzY2hlbWFDb250cm9sbGVyID0+IHtcbiAgICAgICAgLy8gTm90aWZ5IExpdmVRdWVyeVNlcnZlciBpZiBwb3NzaWJsZVxuICAgICAgICBjb25zdCBwZXJtcyA9IHNjaGVtYUNvbnRyb2xsZXIuZ2V0Q2xhc3NMZXZlbFBlcm1pc3Npb25zKHVwZGF0ZWRPYmplY3QuY2xhc3NOYW1lKTtcbiAgICAgICAgdGhpcy5jb25maWcubGl2ZVF1ZXJ5Q29udHJvbGxlci5vbkFmdGVyU2F2ZShcbiAgICAgICAgICB1cGRhdGVkT2JqZWN0LmNsYXNzTmFtZSxcbiAgICAgICAgICB1cGRhdGVkT2JqZWN0LFxuICAgICAgICAgIG9yaWdpbmFsT2JqZWN0LFxuICAgICAgICAgIHBlcm1zXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignTGl2ZVF1ZXJ5IGFmdGVyU2F2ZSBub3RpZmljYXRpb24gZmFpbGVkJywgZXJyKTtcbiAgICAgIH0pO1xuICB9XG4gIGlmICghaGFzQWZ0ZXJTYXZlSG9vaykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICAvLyBSdW4gYWZ0ZXJTYXZlIHRyaWdnZXJcbiAgcmV0dXJuIHRyaWdnZXJzXG4gICAgLm1heWJlUnVuVHJpZ2dlcihcbiAgICAgIHRyaWdnZXJzLlR5cGVzLmFmdGVyU2F2ZSxcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIHVwZGF0ZWRPYmplY3QsXG4gICAgICBvcmlnaW5hbE9iamVjdCxcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgdGhpcy5jb250ZXh0XG4gICAgKVxuICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBjb25zdCBqc29uUmV0dXJuZWQgPSByZXN1bHQgJiYgIXJlc3VsdC5fdG9GdWxsSlNPTjtcbiAgICAgIGlmIChqc29uUmV0dXJuZWQpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nT3BzLm9wZXJhdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXNwb25zZS5yZXNwb25zZSA9IHJlc3VsdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UucmVzcG9uc2UgPSB0aGlzLl91cGRhdGVSZXNwb25zZVdpdGhEYXRhKFxuICAgICAgICAgIChyZXN1bHQgfHwgdXBkYXRlZE9iamVjdCkudG9KU09OKCksXG4gICAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybignYWZ0ZXJTYXZlIGNhdWdodCBhbiBlcnJvcicsIGVycik7XG4gICAgfSk7XG59O1xuXG4vLyBBIGhlbHBlciB0byBmaWd1cmUgb3V0IHdoYXQgbG9jYXRpb24gdGhpcyBvcGVyYXRpb24gaGFwcGVucyBhdC5cblJlc3RXcml0ZS5wcm90b3R5cGUubG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBtaWRkbGUgPSB0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJyA/ICcvdXNlcnMvJyA6ICcvY2xhc3Nlcy8nICsgdGhpcy5jbGFzc05hbWUgKyAnLyc7XG4gIGNvbnN0IG1vdW50ID0gdGhpcy5jb25maWcubW91bnQgfHwgdGhpcy5jb25maWcuc2VydmVyVVJMO1xuICByZXR1cm4gbW91bnQgKyBtaWRkbGUgKyB0aGlzLmRhdGEub2JqZWN0SWQ7XG59O1xuXG4vLyBBIGhlbHBlciB0byBnZXQgdGhlIG9iamVjdCBpZCBmb3IgdGhpcyBvcGVyYXRpb24uXG4vLyBCZWNhdXNlIGl0IGNvdWxkIGJlIGVpdGhlciBvbiB0aGUgcXVlcnkgb3Igb24gdGhlIGRhdGFcblJlc3RXcml0ZS5wcm90b3R5cGUub2JqZWN0SWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmRhdGEub2JqZWN0SWQgfHwgdGhpcy5xdWVyeS5vYmplY3RJZDtcbn07XG5cbi8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBkYXRhIGFuZCBkZWxldGUgYmFkIGtleXMgKF9hdXRoX2RhdGEsIF9oYXNoZWRfcGFzc3dvcmQuLi4pXG5SZXN0V3JpdGUucHJvdG90eXBlLnNhbml0aXplZERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGRhdGEgPSBPYmplY3Qua2V5cyh0aGlzLmRhdGEpLnJlZHVjZSgoZGF0YSwga2V5KSA9PiB7XG4gICAgLy8gUmVnZXhwIGNvbWVzIGZyb20gUGFyc2UuT2JqZWN0LnByb3RvdHlwZS52YWxpZGF0ZVxuICAgIGlmICghL15bQS1aYS16XVswLTlBLVphLXpfXSokLy50ZXN0KGtleSkpIHtcbiAgICAgIGRlbGV0ZSBkYXRhW2tleV07XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9LCB0aGlzLmNsb25lV2l0aEZpbGVVcmxzKHRoaXMuZGF0YSkpO1xuICByZXR1cm4gUGFyc2UuX2RlY29kZSh1bmRlZmluZWQsIGRhdGEpO1xufTtcblxuLy8gUmV0dXJucyBhbiB1cGRhdGVkIGNvcHkgb2YgdGhlIG9iamVjdFxuUmVzdFdyaXRlLnByb3RvdHlwZS5idWlsZFBhcnNlT2JqZWN0cyA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZXh0cmFEYXRhID0geyBjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lLCBvYmplY3RJZDogdGhpcy5xdWVyeT8ub2JqZWN0SWQgfTtcbiAgbGV0IG9yaWdpbmFsT2JqZWN0O1xuICBpZiAodGhpcy5xdWVyeSAmJiB0aGlzLnF1ZXJ5Lm9iamVjdElkKSB7XG4gICAgb3JpZ2luYWxPYmplY3QgPSB0cmlnZ2Vycy5pbmZsYXRlKGV4dHJhRGF0YSwgdGhpcy5vcmlnaW5hbERhdGEpO1xuICB9XG5cbiAgY29uc3QgY2xhc3NOYW1lID0gUGFyc2UuT2JqZWN0LmZyb21KU09OKGV4dHJhRGF0YSk7XG4gIGNvbnN0IHJlYWRPbmx5QXR0cmlidXRlcyA9IGNsYXNzTmFtZS5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXNcbiAgICA/IGNsYXNzTmFtZS5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXMoKVxuICAgIDogW107XG5cbiAgLy8gRm9yIF9Sb2xlIGNsYXNzLCAnbmFtZScgY2Fubm90IGJlIHNldCBhZnRlciB0aGUgcm9sZSBoYXMgYW4gb2JqZWN0SWQuXG4gIC8vIEluIGFmdGVyU2F2ZSBjb250ZXh0LCBfaGFuZGxlU2F2ZVJlc3BvbnNlIGhhcyBhbHJlYWR5IHNldCB0aGUgb2JqZWN0SWQsXG4gIC8vIHNvIHdlIHRyZWF0ICduYW1lJyBhcyByZWFkLW9ubHkgdG8gYXZvaWQgUGFyc2UgU0RLIHZhbGlkYXRpb24gZXJyb3JzLlxuICBjb25zdCBpc1JvbGVBZnRlclNhdmUgPSB0aGlzLmNsYXNzTmFtZSA9PT0gJ19Sb2xlJyAmJiB0aGlzLnJlc3BvbnNlICYmICF0aGlzLnF1ZXJ5O1xuICBpZiAoaXNSb2xlQWZ0ZXJTYXZlICYmIHRoaXMuZGF0YS5uYW1lICYmICFyZWFkT25seUF0dHJpYnV0ZXMuaW5jbHVkZXMoJ25hbWUnKSkge1xuICAgIHJlYWRPbmx5QXR0cmlidXRlcy5wdXNoKCduYW1lJyk7XG4gIH1cbiAgaWYgKCF0aGlzLm9yaWdpbmFsRGF0YSkge1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIHJlYWRPbmx5QXR0cmlidXRlcykge1xuICAgICAgZXh0cmFEYXRhW2F0dHJpYnV0ZV0gPSB0aGlzLmRhdGFbYXR0cmlidXRlXTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdXBkYXRlZE9iamVjdCA9IHRyaWdnZXJzLmluZmxhdGUoZXh0cmFEYXRhLCB0aGlzLm9yaWdpbmFsRGF0YSk7XG4gIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkucmVkdWNlKGZ1bmN0aW9uIChkYXRhLCBrZXkpIHtcbiAgICBpZiAoa2V5LmluZGV4T2YoJy4nKSA+IDApIHtcbiAgICAgIC8vIE51bGwgYW5kIHVuZGVmaW5lZCBhcmUgc2V0IGF0IHRoZWlyIG93biBkb3Qgbm90YXRpb24gcGF0aCwgbGlrZSBhbiBvcGVyYXRpb25cbiAgICAgIGlmIChkYXRhW2tleV0gPT0gbnVsbCB8fCB0eXBlb2YgZGF0YVtrZXldLl9fb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICghcmVhZE9ubHlBdHRyaWJ1dGVzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAvLyBUaGUgU0RLIGtleSBuYW1lIHJ1bGVzIGFwcGx5IHRvIHRvcC1sZXZlbCBmaWVsZHMgb25seVxuICAgICAgICAgIHVwZGF0ZWRPYmplY3Quc2V0KGtleSwgZGF0YVtrZXldLCB7IGlnbm9yZVZhbGlkYXRpb246IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHN1YmRvY3VtZW50IGtleSB3aXRoIGRvdCBub3RhdGlvbiB7ICd4LnknOiB2IH0gPT4geyAneCc6IHsgJ3knIDogdiB9IH0pXG4gICAgICAgIGNvbnN0IHNwbGl0dGVkS2V5ID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IHBhcmVudFByb3AgPSBzcGxpdHRlZEtleVswXTtcbiAgICAgICAgbGV0IHBhcmVudFZhbCA9IHVwZGF0ZWRPYmplY3QuZ2V0KHBhcmVudFByb3ApO1xuICAgICAgICBpZiAodHlwZW9mIHBhcmVudFZhbCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBwYXJlbnRWYWwgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBwYXJlbnRWYWxbc3BsaXR0ZWRLZXlbMV1dID0gZGF0YVtrZXldO1xuICAgICAgICB1cGRhdGVkT2JqZWN0LnNldChwYXJlbnRQcm9wLCBwYXJlbnRWYWwpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGRhdGFba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH0sIHRoaXMuY2xvbmVXaXRoRmlsZVVybHModGhpcy5kYXRhKSk7XG5cbiAgY29uc3Qgc2FuaXRpemVkID0gdGhpcy5zYW5pdGl6ZWREYXRhKCk7XG4gIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIHJlYWRPbmx5QXR0cmlidXRlcykge1xuICAgIGRlbGV0ZSBzYW5pdGl6ZWRbYXR0cmlidXRlXTtcbiAgfVxuICB1cGRhdGVkT2JqZWN0LnNldChzYW5pdGl6ZWQpO1xuICByZXR1cm4geyB1cGRhdGVkT2JqZWN0LCBvcmlnaW5hbE9iamVjdCB9O1xufTtcblxuUmVzdFdyaXRlLnByb3RvdHlwZS5jbGVhblVzZXJBdXRoRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucmVzcG9uc2UgJiYgdGhpcy5yZXNwb25zZS5yZXNwb25zZSAmJiB0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlO1xuICAgIGlmICh1c2VyLmF1dGhEYXRhKSB7XG4gICAgICBPYmplY3Qua2V5cyh1c2VyLmF1dGhEYXRhKS5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICAgICAgaWYgKHVzZXIuYXV0aERhdGFbcHJvdmlkZXJdID09PSBudWxsKSB7XG4gICAgICAgICAgZGVsZXRlIHVzZXIuYXV0aERhdGFbcHJvdmlkZXJdO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh1c2VyLmF1dGhEYXRhKS5sZW5ndGggPT0gMCkge1xuICAgICAgICBkZWxldGUgdXNlci5hdXRoRGF0YTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8vIFN0cmlwcyBwcm90ZWN0ZWQgZmllbGRzIGZyb20gdGhlIHdyaXRlIHJlc3BvbnNlIHdoZW4gcHJvdGVjdGVkRmllbGRzU2F2ZVJlc3BvbnNlRXhlbXB0IGlzIGZhbHNlLlxuUmVzdFdyaXRlLnByb3RvdHlwZS5maWx0ZXJQcm90ZWN0ZWRGaWVsZHNJblJlc3BvbnNlID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jb25maWcucHJvdGVjdGVkRmllbGRzU2F2ZVJlc3BvbnNlRXhlbXB0ICE9PSBmYWxzZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyIHx8IHRoaXMuYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghdGhpcy5yZXNwb25zZSB8fCAhdGhpcy5yZXNwb25zZS5yZXNwb25zZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzY2hlbWFDb250cm9sbGVyID0gYXdhaXQgdGhpcy5jb25maWcuZGF0YWJhc2UubG9hZFNjaGVtYSgpO1xuICBjb25zdCBwcm90ZWN0ZWRGaWVsZHMgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5hZGRQcm90ZWN0ZWRGaWVsZHMoXG4gICAgc2NoZW1hQ29udHJvbGxlcixcbiAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICB0aGlzLnF1ZXJ5ID8geyBvYmplY3RJZDogdGhpcy5xdWVyeS5vYmplY3RJZCB9IDoge30sXG4gICAgdGhpcy5hdXRoLnVzZXIgPyBbdGhpcy5hdXRoLnVzZXIuaWRdLmNvbmNhdCh0aGlzLmF1dGgudXNlclJvbGVzIHx8IFtdKSA6IFtdLFxuICAgIHRoaXMuYXV0aCxcbiAgICB7fVxuICApO1xuICBpZiAoIXByb3RlY3RlZEZpZWxkcykge1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnJlc3BvbnNlLnJlc3BvbnNlKSkge1xuICAgIGlmIChwcm90ZWN0ZWRGaWVsZHMuc29tZShmaWVsZCA9PiBrZXkgPT09IGZpZWxkIHx8IGtleS5zdGFydHNXaXRoKGAke2ZpZWxkfS5gKSkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlW2tleV07XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBoYXNPd24gPSAob2JqZWN0LCBrZXkpID0+XG4gIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QgIT09IHVuZGVmaW5lZCAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpO1xuXG4vLyBXaGV0aGVyIGEgZG90IG5vdGF0aW9uIHBhdGggY2FuIGRlc2NlbmQgaW50byB0aGUgdmFsdWVcbmNvbnN0IGlzQ29udGFpbmVyID0gdmFsdWUgPT5cbiAgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhdmFsdWUuX190eXBlICYmICF2YWx1ZS5fX29wO1xuXG4vLyBSZWFkcyBhIGRvdCBub3RhdGlvbiBwYXRoIHRocm91Z2ggb3duIHByb3BlcnRpZXMgb2YgY29udGFpbmVycyBvbmx5XG5jb25zdCBnZXRPd25QYXRoID0gKG9iamVjdCwgcGF0aCkgPT4ge1xuICBsZXQgdmFsdWUgPSBvYmplY3Q7XG4gIGZvciAoY29uc3Qga2V5IG9mIHBhdGgpIHtcbiAgICBpZiAoIWlzQ29udGFpbmVyKHZhbHVlKSB8fCAhaGFzT3duKHZhbHVlLCBrZXkpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YWx1ZSA9IHZhbHVlW2tleV07XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLy8gUmVzdG9yZXMgYSByZXZlcnRlZCBkb3Qgbm90YXRpb24ga2V5IGluIHRoZSByZXNwb25zZVxuUmVzdFdyaXRlLnByb3RvdHlwZS5fcmVzdG9yZVJldmVydGVkUGF0aCA9IGZ1bmN0aW9uIChyZXNwb25zZSwgd3JpdGVEYXRhLCB3cml0dGVuLCBrZXksIGZpbmFsT2JqZWN0KSB7XG4gIC8vIEEgd3JpdGUgYXQgb3IgYmVuZWF0aCB0aGUga2V5IGdvdmVybnNcbiAgaWYgKHdyaXR0ZW4uc29tZShrID0+IGsgPT09IGtleSB8fCBrLnN0YXJ0c1dpdGgoYCR7a2V5fS5gKSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcGF0aCA9IGtleS5zcGxpdCgnLicpO1xuICAvLyBBIHJldHVybmVkIG9iamVjdCB3aXRob3V0IHRoZSBmaWVsZCBsZWF2ZXMgdGhlIHN0b3JlZCB2YWx1ZVxuICBjb25zdCBmcm9tRmluYWwgPSAhIWZpbmFsT2JqZWN0ICYmIGhhc093bihmaW5hbE9iamVjdCwgcGF0aFswXSk7XG4gIGxldCB2YWx1ZSA9IGZyb21GaW5hbCA/IGZpbmFsT2JqZWN0IDogdGhpcy5vcmlnaW5hbERhdGEgfHwge307XG4gIGxldCBkZXB0aCA9IDA7XG4gIGxldCBhdXRob3JpdGF0aXZlID0gZnJvbUZpbmFsO1xuICBpZiAoIWZyb21GaW5hbCkge1xuICAgIC8vIEEgd3JpdHRlbiBhbmNlc3RvciBnb3Zlcm5zOyBjb21wdXRlZCBvcGVyYXRpb25zIGFyZSByZXR1cm5lZCBleHBhbmRlZFxuICAgIGNvbnN0IGFuY2VzdG9yID0gd3JpdHRlblxuICAgICAgLmZpbHRlcihrID0+IGtleS5zdGFydHNXaXRoKGAke2t9LmApKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpWzBdO1xuICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgY29uc3QgYW5jZXN0b3JQYXRoID0gYW5jZXN0b3Iuc3BsaXQoJy4nKTtcbiAgICAgIGxldCByZXR1cm5lZCA9IGdldE93blBhdGgocmVzcG9uc2UsIGFuY2VzdG9yUGF0aCk7XG4gICAgICAvLyBBbiB1bmNoYW5nZWQgY29tcHV0ZWQgcmVzdWx0IGlzIG5vIGxvbmdlciBpbiB0aGUgcmVzcG9uc2VcbiAgICAgIGNvbnN0IG9wID0gd3JpdGVEYXRhW2FuY2VzdG9yXT8uX19vcDtcbiAgICAgIGlmIChyZXR1cm5lZCA9PT0gdW5kZWZpbmVkICYmIG9wICYmIG9wICE9PSAnRGVsZXRlJykge1xuICAgICAgICByZXR1cm5lZCA9IGdldE93blBhdGgodGhpcy5vcmlnaW5hbERhdGEsIGFuY2VzdG9yUGF0aCk7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHJldHVybmVkICE9PSB1bmRlZmluZWQgPyByZXR1cm5lZCA6IHdyaXRlRGF0YVthbmNlc3Rvcl07XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKHZhbHVlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkZXB0aCA9IGFuY2VzdG9yUGF0aC5sZW5ndGg7XG4gICAgICBhdXRob3JpdGF0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgd2hpbGUgKGRlcHRoIDwgcGF0aC5sZW5ndGggJiYgaXNDb250YWluZXIodmFsdWUpICYmIGhhc093bih2YWx1ZSwgcGF0aFtkZXB0aF0pKSB7XG4gICAgdmFsdWUgPSB2YWx1ZVtwYXRoW2RlcHRoKytdXTtcbiAgfVxuICAvLyBBIG1pc3NpbmcgYXJyYXkgaW5kZXggcmV0dXJucyB0aGUgd2hvbGUgYXJyYXksIHNvIHRoZSBjbGllbnQga2VlcHMgbm8gaG9sZVxuICBjb25zdCBtaXNzaW5nSW5kZXggPSBkZXB0aCA8IHBhdGgubGVuZ3RoICYmIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIC9eXFxkKyQvLnRlc3QocGF0aFtkZXB0aF0pO1xuICBpZiAoZGVwdGggPCBwYXRoLmxlbmd0aCAmJiAhbWlzc2luZ0luZGV4KSB7XG4gICAgaWYgKGlzQ29udGFpbmVyKHZhbHVlKSkge1xuICAgICAgLy8gRGVsZXRlIGF0IHRoZSBmaXJzdCBtaXNzaW5nIGtleVxuICAgICAgZGVwdGgrKztcbiAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodmFsdWU/Ll9fb3ApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdW5jaGFuZ2VkID0gdXRpbC5pc0RlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdldE93blBhdGgodGhpcy5vcmlnaW5hbERhdGEsIHBhdGguc2xpY2UoMCwgZGVwdGgpKVxuICAgICAgKTtcbiAgICAgIGlmICghZnJvbUZpbmFsIHx8IHVuY2hhbmdlZCkge1xuICAgICAgICAvLyBDbGVhcnMgdGhlIGNsaWVudCBvcGVyYXRpb24gYmVuZWF0aCBhbiB1bmNoYW5nZWQgdHlwZWQgdmFsdWVcbiAgICAgICAgaWYgKHZhbHVlPy5fX3R5cGUgJiYgdW5jaGFuZ2VkKSB7XG4gICAgICAgICAgcmVzcG9uc2Vba2V5XSA9IHsgX19vcDogJ0RlbGV0ZScgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHRhcmdldCA9IHBhdGguc2xpY2UoMCwgZGVwdGgpLmpvaW4oJy4nKTtcbiAgY29uc3Qga2V5cyA9IFsuLi53cml0dGVuLCAuLi5PYmplY3Qua2V5cyhyZXNwb25zZSldO1xuICBjb25zdCBvdmVybGFwcyA9IHByZWZpeCA9PlxuICAgIGtleXMuc29tZShrID0+IGsgPT09IHByZWZpeCB8fCBrLnN0YXJ0c1dpdGgoYCR7cHJlZml4fS5gKSB8fCBwcmVmaXguc3RhcnRzV2l0aChgJHtrfS5gKSk7XG4gIGlmICghYXV0aG9yaXRhdGl2ZSAmJiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBtaXNzaW5nSW5kZXgpICYmIG92ZXJsYXBzKHRhcmdldCkpIHtcbiAgICAvLyBBbm90aGVyIHdyaXRlIGNyZWF0ZXMgdGhlIHBhdGg7IGNsZWFyIHRoZSBzaGFsbG93ZXN0IHVudG91Y2hlZCByZXZlcnRlZCBwYXJ0XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAobGV0IGxlbmd0aCA9IGRlcHRoICsgMTsgbGVuZ3RoIDw9IHBhdGgubGVuZ3RoOyBsZW5ndGgrKykge1xuICAgICAgICBjb25zdCBwcmVmaXggPSBwYXRoLnNsaWNlKDAsIGxlbmd0aCkuam9pbignLicpO1xuICAgICAgICBpZiAoIW92ZXJsYXBzKHByZWZpeCkpIHtcbiAgICAgICAgICByZXNwb25zZVtwcmVmaXhdID0geyBfX29wOiAnRGVsZXRlJyB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGNvbnN0IHJlc3BvbnNlS2V5IG9mIE9iamVjdC5rZXlzKHJlc3BvbnNlKSkge1xuICAgIGlmIChyZXNwb25zZUtleS5zdGFydHNXaXRoKGAke3RhcmdldH0uYCkpIHtcbiAgICAgIGRlbGV0ZSByZXNwb25zZVtyZXNwb25zZUtleV07XG4gICAgfVxuICB9XG4gIHJlc3BvbnNlW3RhcmdldF0gPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8geyBfX29wOiAnRGVsZXRlJyB9IDogdmFsdWU7XG59O1xuXG4vLyBSZXR1cm5zIHJldmVydGVkIGZpZWxkcyBvZiBhbiB1cGRhdGUgb25seSBhcyB0aGUgY2FsbGVyIGNhbiByZWFkIHRoZW1cblJlc3RXcml0ZS5wcm90b3R5cGUuZmlsdGVyUmV2ZXJ0ZWRGaWVsZHNJblJlc3BvbnNlID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCByZXNwb25zZSA9IHRoaXMucmVzcG9uc2U/LnJlc3BvbnNlO1xuICBpZiAoIXRoaXMucXVlcnkgfHwgIXJlc3BvbnNlIHx8ICF0aGlzLnBlbmRpbmdPcHMub3BlcmF0aW9ucykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyIHx8IHRoaXMuYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IFBhcnNlLkNvcmVNYW5hZ2VyLmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICBjb25zdCBbcGVuZGluZ10gPSBzdGF0ZUNvbnRyb2xsZXIuZ2V0UGVuZGluZ09wcyh0aGlzLnBlbmRpbmdPcHMuaWRlbnRpZmllcik7XG4gIGNvbnN0IHJldmVydGVkID0gT2JqZWN0LmtleXModGhpcy5wZW5kaW5nT3BzLm9wZXJhdGlvbnMpLmZpbHRlcihrZXkgPT4gIXBlbmRpbmdba2V5XSk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyZXNwb25zZSkuZmlsdGVyKGtleSA9PlxuICAgIHJldmVydGVkLnNvbWUocGF0aCA9PiBwYXRoID09PSBrZXkgfHwgcGF0aC5zdGFydHNXaXRoKGAke2tleX0uYCkpXG4gICk7XG4gIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IHZpZXc7XG4gIHRyeSB7XG4gICAgY29uc3QgcXVlcnkgPSBhd2FpdCBSZXN0UXVlcnkoe1xuICAgICAgbWV0aG9kOiBSZXN0UXVlcnkuTWV0aG9kLmdldCxcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBhdXRoOiB0aGlzLmF1dGgsXG4gICAgICBjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lLFxuICAgICAgcmVzdFdoZXJlOiB7IG9iamVjdElkOiB0aGlzLnF1ZXJ5Lm9iamVjdElkIH0sXG4gICAgICBydW5CZWZvcmVGaW5kOiBmYWxzZSxcbiAgICAgIHJ1bkFmdGVyRmluZDogZmFsc2UsXG4gICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQsXG4gICAgfSk7XG4gICAgdmlldyA9IChhd2FpdCBxdWVyeS5leGVjdXRlKCkpLnJlc3VsdHNbMF07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRmFpbHMgY2xvc2VkOyBhY2Nlc3MgZGVuaWFsIGlzIGV4cGVjdGVkXG4gICAgY29uc3QgZGVuaWVkID0gW1BhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkRdO1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgUGFyc2UuRXJyb3IpIHx8ICFkZW5pZWQuaW5jbHVkZXMoZXJyb3IuY29kZSkpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gcmVhZCByZXZlcnRlZCBmaWVsZHMgZm9yIHRoZSBzYXZlIHJlc3BvbnNlJywgZXJyb3IpO1xuICAgIH1cbiAgfVxuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgLy8gUmVtb3ZlZCBiZW5lYXRoIGEga2V5IHRoZSBjYWxsZXIgY2Fubm90IHJlYWRcbiAgICBpZiAoIWhhc093bihyZXNwb25zZSwga2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHBhdGggPSBrZXkuc3BsaXQoJy4nKTtcbiAgICBjb25zdCB2YWx1ZSA9IGdldE93blBhdGgodmlldywgcGF0aCk7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAoY29uc3QgcmVzcG9uc2VLZXkgb2YgT2JqZWN0LmtleXMocmVzcG9uc2UpKSB7XG4gICAgICAgIGlmIChyZXNwb25zZUtleS5zdGFydHNXaXRoKGAke2tleX0uYCkpIHtcbiAgICAgICAgICBkZWxldGUgcmVzcG9uc2VbcmVzcG9uc2VLZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoa2V5ID09PSAnQUNMJykge1xuICAgICAgICAvLyBUaGUgU0RLIGNhbm5vdCBhcHBseSBhbiBvcGVyYXRpb24gdG8gQUNMXG4gICAgICAgIGRlbGV0ZSByZXNwb25zZVtrZXldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2Vba2V5XSA9IHsgX19vcDogJ0RlbGV0ZScgfTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHV0aWwuaXNEZWVwU3RyaWN0RXF1YWwocmVzcG9uc2Vba2V5XSwgZ2V0T3duUGF0aCh0aGlzLm9yaWdpbmFsRGF0YSwgcGF0aCkpKSB7XG4gICAgICAvLyBUaGUgc3RvcmVkIHZhbHVlIGFzIHRoZSBjYWxsZXIgcmVhZHMgaXRcbiAgICAgIHJlc3BvbnNlW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuX3VwZGF0ZVJlc3BvbnNlV2l0aERhdGEgPSBmdW5jdGlvbiAocmVzcG9uc2UsIGRhdGEsIGlzRmluYWxPYmplY3QgPSBmYWxzZSkge1xuICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBQYXJzZS5Db3JlTWFuYWdlci5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgY29uc3QgW3BlbmRpbmddID0gc3RhdGVDb250cm9sbGVyLmdldFBlbmRpbmdPcHModGhpcy5wZW5kaW5nT3BzLmlkZW50aWZpZXIpO1xuICBsZXQgcmV2ZXJ0ZWREYXRhO1xuICBjb25zdCByZXZlcnRlZFBhdGhzID0gW107XG4gIGZvciAoY29uc3Qga2V5IGluIHRoaXMucGVuZGluZ09wcy5vcGVyYXRpb25zKSB7XG4gICAgaWYgKHBlbmRpbmdba2V5XSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIFRoZSBTREsgY2Fubm90IGFwcGx5IGFuIG9wZXJhdGlvbiBvciBhIGRvdCBub3RhdGlvbiBwYXRoIHRvIEFDTFxuICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnQUNMLicpIHx8IChrZXkgPT09ICdBQ0wnICYmICFoYXNPd24odGhpcy5vcmlnaW5hbERhdGEsICdBQ0wnKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoa2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgIHJldmVydGVkUGF0aHMucHVzaChrZXkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIFJlc3BvbnNlIG9ubHk7IHRoZSB3cml0ZSBkYXRhIGJ1aWxkcyB0aGUgYWZ0ZXJTYXZlIGFuZCBMaXZlUXVlcnkgb2JqZWN0c1xuICAgIHJldmVydGVkRGF0YSB8fD0geyAuLi5kYXRhIH07XG4gICAgcmV2ZXJ0ZWREYXRhW2tleV0gPSBoYXNPd24odGhpcy5vcmlnaW5hbERhdGEsIGtleSlcbiAgICAgID8gdGhpcy5vcmlnaW5hbERhdGFba2V5XVxuICAgICAgOiB7IF9fb3A6ICdEZWxldGUnIH07XG4gICAgdGhpcy5zdG9yYWdlLmZpZWxkc0NoYW5nZWRCeVRyaWdnZXIgfHw9IFtdO1xuICAgIC8vIE9uY2Ugb25seSwgc28gYW4gYWZ0ZXJTYXZlIHVuc2V0IGlzIG5vdCB1bmRvbmUgYnkgYSBzZWNvbmQgZW50cnlcbiAgICBpZiAodGhpcy5zdG9yYWdlLmZpZWxkc0NoYW5nZWRCeVRyaWdnZXIuaW5kZXhPZihrZXkpIDwgMCkge1xuICAgICAgdGhpcy5zdG9yYWdlLmZpZWxkc0NoYW5nZWRCeVRyaWdnZXIucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICBjb25zdCByZXNwb25zZURhdGEgPSByZXZlcnRlZERhdGEgfHwgZGF0YTtcbiAgLy8gVGhlIGZpbmFsIG9iamVjdCwgYmVmb3JlIHVuY2hhbmdlZCBmaWVsZHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcmVzcG9uc2VcbiAgY29uc3QgZmluYWxPYmplY3QgPSBpc0ZpbmFsT2JqZWN0ICYmIHJldmVydGVkUGF0aHMubGVuZ3RoID8geyAuLi5yZXNwb25zZSB9IDogdW5kZWZpbmVkO1xuICBjb25zdCBza2lwS2V5cyA9IFsuLi4ocmVxdWlyZWRDb2x1bW5zLnJlYWRbdGhpcy5jbGFzc05hbWVdIHx8IFtdKV07XG4gIGlmICghdGhpcy5xdWVyeSkge1xuICAgIHNraXBLZXlzLnB1c2goJ29iamVjdElkJywgJ2NyZWF0ZWRBdCcpO1xuICB9IGVsc2Uge1xuICAgIHNraXBLZXlzLnB1c2goJ3VwZGF0ZWRBdCcpO1xuICAgIGRlbGV0ZSByZXNwb25zZS5vYmplY3RJZDtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiByZXNwb25zZSkge1xuICAgIGlmIChza2lwS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSByZXNwb25zZVtrZXldO1xuICAgIGlmIChcbiAgICAgIHZhbHVlID09IG51bGwgfHxcbiAgICAgICh2YWx1ZS5fX3R5cGUgJiYgdmFsdWUuX190eXBlID09PSAnUG9pbnRlcicpIHx8XG4gICAgICB1dGlsLmlzRGVlcFN0cmljdEVxdWFsKHJlc3BvbnNlRGF0YVtrZXldLCB2YWx1ZSkgfHxcbiAgICAgIHV0aWwuaXNEZWVwU3RyaWN0RXF1YWwoKHRoaXMub3JpZ2luYWxEYXRhIHx8IHt9KVtrZXldLCB2YWx1ZSlcbiAgICApIHtcbiAgICAgIGRlbGV0ZSByZXNwb25zZVtrZXldO1xuICAgIH1cbiAgfVxuICAodGhpcy5zdG9yYWdlLmZpZWxkc0NoYW5nZWRCeVRyaWdnZXIgfHwgW10pLmZvckVhY2goZmllbGROYW1lID0+IHtcbiAgICBjb25zdCBkYXRhVmFsdWUgPSByZXNwb25zZURhdGFbZmllbGROYW1lXTtcblxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3BvbnNlLCBmaWVsZE5hbWUpKSB7XG4gICAgICByZXNwb25zZVtmaWVsZE5hbWVdID0gZGF0YVZhbHVlO1xuICAgIH1cblxuICAgIGlmIChyZXNwb25zZVtmaWVsZE5hbWVdICYmIHJlc3BvbnNlW2ZpZWxkTmFtZV0uX19vcCkge1xuICAgICAgZGVsZXRlIHJlc3BvbnNlW2ZpZWxkTmFtZV07XG4gICAgICBpZiAoZGF0YVZhbHVlLl9fb3AgPT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgcmVzcG9uc2VbZmllbGROYW1lXSA9IGRhdGFWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBpZiAocmV2ZXJ0ZWRQYXRocy5sZW5ndGgpIHtcbiAgICBjb25zdCB3cml0dGVuID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgcmV2ZXJ0ZWRQYXRocykge1xuICAgICAgdGhpcy5fcmVzdG9yZVJldmVydGVkUGF0aChyZXNwb25zZSwgZGF0YSwgd3JpdHRlbiwga2V5LCBmaW5hbE9iamVjdCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJlc3RXcml0ZTtcbm1vZHVsZS5leHBvcnRzID0gUmVzdFdyaXRlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFhQSxJQUFBQSxVQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxpQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssYUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0saUJBQUEsR0FBQUMsdUJBQUEsQ0FBQVAsT0FBQTtBQUF5RCxTQUFBTyx3QkFBQUMsQ0FBQSxFQUFBQyxDQUFBLDZCQUFBQyxPQUFBLE1BQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUgsdUJBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxFQUFBQyxDQUFBLFNBQUFBLENBQUEsSUFBQUQsQ0FBQSxJQUFBQSxDQUFBLENBQUFLLFVBQUEsU0FBQUwsQ0FBQSxNQUFBTSxDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxLQUFBQyxTQUFBLFFBQUFDLE9BQUEsRUFBQVYsQ0FBQSxpQkFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxTQUFBUSxDQUFBLE1BQUFGLENBQUEsR0FBQUwsQ0FBQSxHQUFBRyxDQUFB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
|
|
2237
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUmVzdFF1ZXJ5IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbG9kYXNoIiwiX2xvZ2dlciIsIl9TY2hlbWFDb250cm9sbGVyIiwiX0Vycm9yIiwiX0F1dGhEYXRhTG9jayIsIkluc3RhbGxhdGlvbkRlZHVwIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJkZWZhdWx0IiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJTY2hlbWFDb250cm9sbGVyIiwiQXV0aCIsIlV0aWxzIiwiY3J5cHRvVXRpbHMiLCJwYXNzd29yZENyeXB0byIsIlBhcnNlIiwidHJpZ2dlcnMiLCJ1dGlsIiwiUmVzdFdyaXRlIiwiY29uZmlnIiwiYXV0aCIsImNsYXNzTmFtZSIsInF1ZXJ5IiwiZGF0YSIsIm9yaWdpbmFsRGF0YSIsImNvbnRleHQiLCJhY3Rpb24iLCJpc1JlYWRPbmx5IiwiY3JlYXRlU2FuaXRpemVkRXJyb3IiLCJFcnJvciIsIk9QRVJBVElPTl9GT1JCSURERU4iLCJzdG9yYWdlIiwicnVuT3B0aW9ucyIsImFsbG93Q3VzdG9tT2JqZWN0SWQiLCJwcm90b3R5cGUiLCJvYmplY3RJZCIsIk1JU1NJTkdfT0JKRUNUX0lEIiwiSU5WQUxJRF9LRVlfTkFNRSIsImlkIiwicmVzcG9uc2UiLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJ1cGRhdGVkQXQiLCJfZW5jb2RlIiwiRGF0ZSIsImlzbyIsInZhbGlkU2NoZW1hQ29udHJvbGxlciIsInBlbmRpbmdPcHMiLCJvcGVyYXRpb25zIiwiaWRlbnRpZmllciIsImV4ZWN1dGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJjaGVja0ludGVybmFsRmllbGRzIiwiZ2V0VXNlckFuZFJvbGVBQ0wiLCJ2YWxpZGF0ZUNsaWVudENsYXNzQ3JlYXRpb24iLCJoYW5kbGVJbnN0YWxsYXRpb24iLCJoYW5kbGVTZXNzaW9uIiwiYXV0aG9yaXplVXNlclVwZGF0ZSIsInZhbGlkYXRlQXV0aERhdGEiLCJjaGVja1Jlc3RyaWN0ZWRGaWVsZHMiLCJyZXNvbHZlRmlsZVVybHMiLCJ2YWxpZGF0ZURvdE5vdGF0aW9uS2V5cyIsInJ1bkJlZm9yZVNhdmVUcmlnZ2VyIiwiZW5zdXJlVW5pcXVlQXV0aERhdGFJZCIsImRlbGV0ZUVtYWlsUmVzZXRUb2tlbklmTmVlZGVkIiwidmFsaWRhdGVXcml0ZVBlcm1pc3Npb24iLCJ2YWxpZGF0ZVNjaGVtYSIsInNjaGVtYUNvbnRyb2xsZXIiLCJzZXRSZXF1aXJlZEZpZWxkc0lmTmVlZGVkIiwidHJhbnNmb3JtVXNlciIsImV4cGFuZEZpbGVzRm9yRXhpc3RpbmdPYmplY3RzIiwiZGVzdHJveUR1cGxpY2F0ZWRTZXNzaW9ucyIsInJ1bkRhdGFiYXNlT3BlcmF0aW9uIiwiY3JlYXRlU2Vzc2lvblRva2VuSWZOZWVkZWQiLCJoYW5kbGVGb2xsb3d1cCIsInJ1bkFmdGVyU2F2ZVRyaWdnZXIiLCJjbGVhblVzZXJBdXRoRGF0YSIsImZpbHRlclVucmVhZGFibGVGaWVsZHNJblJlc3BvbnNlIiwiZmlsdGVyUHJvdGVjdGVkRmllbGRzSW5SZXNwb25zZSIsImF1dGhEYXRhUmVzcG9uc2UiLCJyZWplY3RTaWdudXAiLCJwcmV2ZW50U2lnbnVwV2l0aFVudmVyaWZpZWRFbWFpbCIsIkVNQUlMX05PVF9GT1VORCIsImlzTWFzdGVyIiwiaXNNYWludGVuYW5jZSIsImFjbCIsInVzZXIiLCJnZXRVc2VyUm9sZXMiLCJyb2xlcyIsImNvbmNhdCIsImFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiIsInN5c3RlbUNsYXNzZXMiLCJpbmRleE9mIiwiZGF0YWJhc2UiLCJsb2FkU2NoZW1hIiwiaGFzQ2xhc3MiLCJ2YWxpZGF0ZU9iamVjdCIsImZpbGVzIiwiY3JlYXRlIiwiY29sbGVjdCIsInZhbHVlIiwiX190eXBlIiwibmFtZSIsIklOQ09SUkVDVF9UWVBFIiwidXJsIiwidmFsdWVzIiwiZm9yRWFjaCIsImtleXMiLCJsZW5ndGgiLCJmaWxlc0NvbnRyb2xsZXIiLCJleHBhbmRGaWxlc0luT2JqZWN0IiwiZmlsZVVybHMiLCJhc3NpZ24iLCJjbG9uZVdpdGhGaWxlVXJscyIsIm9iamVjdCIsImFkZFVybHMiLCJmaWxlIiwibWFueSIsInRyaWdnZXJFeGlzdHMiLCJUeXBlcyIsImJlZm9yZVNhdmUiLCJhcHBsaWNhdGlvbklkIiwib3JpZ2luYWxPYmplY3QiLCJ1cGRhdGVkT2JqZWN0IiwiYnVpbGRQYXJzZU9iamVjdHMiLCJfZ2V0U3RhdGVJZGVudGlmaWVyIiwic3RhdGVDb250cm9sbGVyIiwiQ29yZU1hbmFnZXIiLCJnZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIiLCJwZW5kaW5nIiwiZ2V0UGVuZGluZ09wcyIsImRhdGFiYXNlUHJvbWlzZSIsInVwZGF0ZSIsInJlc3VsdCIsIk9CSkVDVF9OT1RfRk9VTkQiLCJtYXliZVJ1blRyaWdnZXIiLCJmaWVsZHNDaGFuZ2VkQnlUcmlnZ2VyIiwiXyIsInJlZHVjZSIsImtleSIsImlzRXF1YWwiLCJwdXNoIiwiY2hlY2tQcm9oaWJpdGVkS2V5d29yZHMiLCJlcnJvciIsInJ1bkJlZm9yZUxvZ2luVHJpZ2dlciIsInVzZXJEYXRhIiwiYmVmb3JlTG9naW4iLCJleHRyYURhdGEiLCJpbmZsYXRlIiwiZ2V0QWxsQ2xhc3NlcyIsImFsbENsYXNzZXMiLCJzY2hlbWEiLCJmaW5kIiwib25lQ2xhc3MiLCJzZXRSZXF1aXJlZEZpZWxkSWZOZWVkZWQiLCJmaWVsZE5hbWUiLCJzZXREZWZhdWx0IiwidW5kZWZpbmVkIiwiX19vcCIsImZpZWxkcyIsImRlZmF1bHRWYWx1ZSIsInJlcXVpcmVkIiwiVkFMSURBVElPTl9FUlJPUiIsImNsYXNzTGV2ZWxQZXJtaXNzaW9ucyIsIkFDTCIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZWFkIiwid3JpdGUiLCJjdXJyZW50VXNlciIsImNyZWF0ZWRBdCIsIm5ld09iamVjdElkIiwib2JqZWN0SWRTaXplIiwiYXV0aERhdGEiLCJoYXNVc2VybmFtZUFuZFBhc3N3b3JkIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImhhc0F1dGhEYXRhIiwic29tZSIsInByb3ZpZGVyIiwicHJvdmlkZXJEYXRhIiwicmVxdWlyZXNDcmVkZW50aWFscyIsImlzTWlzc2luZyIsImlzRW1wdHkiLCJjaGVja1VzZXJuYW1lIiwiY2hlY2tQYXNzd29yZCIsIlVTRVJOQU1FX01JU1NJTkciLCJQQVNTV09SRF9NSVNTSU5HIiwiVU5TVVBQT1JURURfU0VSVklDRSIsInByb3ZpZGVycyIsImNhbkhhbmRsZUF1dGhEYXRhIiwicHJvdmlkZXJBdXRoRGF0YSIsImdldFVzZXJJZCIsImhhbmRsZUF1dGhEYXRhIiwiZmlsdGVyZWRPYmplY3RzQnlBQ0wiLCJvYmplY3RzIiwiZmlsdGVyIiwiX3Rocm93SWZBdXRoRGF0YUR1cGxpY2F0ZSIsImNvZGUiLCJEVVBMSUNBVEVfVkFMVUUiLCJ1c2VySW5mbyIsImR1cGxpY2F0ZWRfZmllbGQiLCJzdGFydHNXaXRoIiwiQUNDT1VOVF9BTFJFQURZX0xJTktFRCIsImhhc0F1dGhEYXRhSWQiLCJmaW5kVXNlcnNXaXRoQXV0aERhdGEiLCJyZXN1bHRzIiwidXNlcklkIiwiY3VycmVudFVzZXJBdXRoRGF0YSIsImlzTG9naW4iLCJ1c2VyUmVzdWx0IiwiZm91bmRVc2VySXNOb3RDdXJyZW50VXNlciIsImhhbmRsZUF1dGhEYXRhVmFsaWRhdGlvbiIsInZhbGlkYXRlZEF1dGhEYXRhIiwiYXV0aFByb3ZpZGVyIiwiam9pbiIsImhhc011dGF0ZWRBdXRoRGF0YSIsIm11dGF0ZWRBdXRoRGF0YSIsImlzQ3VycmVudFVzZXJMb2dnZWRPck1hc3RlciIsImxvY2F0aW9uIiwiY2hlY2tJZlVzZXJIYXNQcm92aWRlZENvbmZpZ3VyZWRQcm92aWRlcnNGb3JMb2dpbiIsImFsbG93RXhwaXJlZEF1dGhEYXRhVG9rZW4iLCJyZXMiLCJvcmlnaW5hbEF1dGhEYXRhIiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwibWFwIiwiayIsInYiLCJhcHBseUF1dGhEYXRhT3B0aW1pc3RpY0xvY2siLCJTQ1JJUFRfRkFJTEVEIiwiY2hhckF0IiwidmFsaWRhdGVQZXJtaXNzaW9uIiwiaXNVbmF1dGhlbnRpY2F0ZWQiLCJTRVNTSU9OX01JU1NJTkciLCJwcm9taXNlIiwiUmVzdFF1ZXJ5IiwibWV0aG9kIiwiTWV0aG9kIiwibWFzdGVyIiwicnVuQmVmb3JlRmluZCIsInJlc3RXaGVyZSIsInNlc3Npb24iLCJjYWNoZUNvbnRyb2xsZXIiLCJkZWwiLCJzZXNzaW9uVG9rZW4iLCJfdmFsaWRhdGVQYXNzd29yZFBvbGljeSIsImhhc2giLCJoYXNoZWRQYXNzd29yZCIsIl9oYXNoZWRfcGFzc3dvcmQiLCJfdmFsaWRhdGVVc2VyTmFtZSIsIl92YWxpZGF0ZUVtYWlsIiwicmFuZG9tU3RyaW5nIiwicmVzcG9uc2VTaG91bGRIYXZlVXNlcm5hbWUiLCIkbmUiLCJsaW1pdCIsImNhc2VJbnNlbnNpdGl2ZSIsIlVTRVJOQU1FX1RBS0VOIiwiYnVpbGRDcmVhdGVkV2l0aCIsImdldENyZWF0ZWRXaXRoIiwiY3JlYXRlZFdpdGgiLCJpc0NyZWF0ZU9wZXJhdGlvbiIsImF1dGhEYXRhUHJvdmlkZXIiLCJyZXNvbHZlZEF1dGhQcm92aWRlciIsImVtYWlsIiwibWF0Y2giLCJyZWplY3QiLCJJTlZBTElEX0VNQUlMX0FERFJFU1MiLCJFTUFJTF9UQUtFTiIsInJlcXVlc3QiLCJvcmlnaW5hbCIsImlwIiwiaW5zdGFsbGF0aW9uSWQiLCJ1c2VyQ29udHJvbGxlciIsInNldEVtYWlsVmVyaWZ5VG9rZW4iLCJwYXNzd29yZFBvbGljeSIsIl92YWxpZGF0ZVBhc3N3b3JkUmVxdWlyZW1lbnRzIiwiX3ZhbGlkYXRlUGFzc3dvcmRIaXN0b3J5IiwicG9saWN5RXJyb3IiLCJ2YWxpZGF0aW9uRXJyb3IiLCJjb250YWluc1VzZXJuYW1lRXJyb3IiLCJwYXR0ZXJuVmFsaWRhdG9yIiwidmFsaWRhdG9yQ2FsbGJhY2siLCJkb05vdEFsbG93VXNlcm5hbWUiLCJtYXhQYXNzd29yZEhpc3RvcnkiLCJtYWludGVuYW5jZSIsIm9sZFBhc3N3b3JkcyIsIl9wYXNzd29yZF9oaXN0b3J5IiwidGFrZSIsIm5ld1Bhc3N3b3JkIiwicHJvbWlzZXMiLCJjb21wYXJlIiwiYWxsIiwiY2F0Y2giLCJlcnIiLCJ2ZXJpZnlVc2VyRW1haWxzIiwicHJldmVudExvZ2luV2l0aFVudmVyaWZpZWRFbWFpbCIsImNyZWF0ZVNlc3Npb25Ub2tlbiIsInNlc3Npb25EYXRhIiwiY3JlYXRlU2Vzc2lvbiIsImlzc3VlZFNlc3Npb25Ub2tlbiIsImFkZGl0aW9uYWxTZXNzaW9uRGF0YSIsInRva2VuIiwibmV3VG9rZW4iLCJleHBpcmVzQXQiLCJnZW5lcmF0ZVNlc3Npb25FeHBpcmVzQXQiLCJhZGRPcHMiLCJfcGVyaXNoYWJsZV90b2tlbiIsIl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQiLCJkZXN0cm95IiwicmV2b2tlU2Vzc2lvbk9uUGFzc3dvcmRSZXNldCIsInNlc3Npb25RdWVyeSIsImJpbmQiLCJzZW5kVmVyaWZpY2F0aW9uRW1haWwiLCJJTlZBTElEX1NFU1NJT05fVE9LRU4iLCIkYW5kIiwidmFsaWRhdGVkIiwiSU5URVJOQUxfU0VSVkVSX0VSUk9SIiwic3RhdHVzIiwiYWN0dWFsVHlwZSIsIkFycmF5IiwiaXNBcnJheSIsInJlcGxhY2UiLCJjaGFyYWN0ZXIiLCJ0b1VwcGVyQ2FzZSIsImRldmljZVRva2VuIiwidG9Mb3dlckNhc2UiLCJkZXZpY2VUeXBlIiwiaWRNYXRjaCIsIm9iamVjdElkTWF0Y2giLCJpbnN0YWxsYXRpb25JZE1hdGNoIiwiZGV2aWNlVG9rZW5NYXRjaGVzIiwib3JRdWVyaWVzIiwiJG9yIiwiZGVsUXVlcnkiLCJhcHBJZGVudGlmaWVyIiwiaW5zdGFsbGF0aW9uT3B0cyIsImluc3RhbGxhdGlvbiIsInJlbW92ZUNvbmZsaWN0aW5nRGV2aWNlVG9rZW4iLCJkdXBsaWNhdGVEZXZpY2VUb2tlbkFjdGlvbiIsImVuZm9yY2VBdXRoIiwiZHVwbGljYXRlRGV2aWNlVG9rZW5BY3Rpb25FbmZvcmNlQXV0aCIsImFwcGx5RHVwbGljYXRlRGV2aWNlVG9rZW5NZXJnZSIsImRldmljZVRva2VuTWF0Y2giLCJtZXJnZVByaW9yaXR5IiwiZHVwbGljYXRlRGV2aWNlVG9rZW5NZXJnZVByaW9yaXR5Iiwib2JqSWQiLCJyb2xlIiwiY2xlYXIiLCJsaXZlUXVlcnlDb250cm9sbGVyIiwiY2xlYXJDYWNoZWRSb2xlcyIsImRvd25sb2FkIiwiZG93bmxvYWROYW1lIiwiSU5WQUxJRF9BQ0wiLCJtYXhQYXNzd29yZEFnZSIsIl9wYXNzd29yZF9jaGFuZ2VkX2F0IiwiZGVmZXIiLCJNYXRoIiwibWF4Iiwic2hpZnQiLCJyYXciLCJ3cml0dGVuUmVhZEFjY2VzcyIsIl9ycGVybSIsIl9zYW5pdGl6ZURhdGFiYXNlUmVzdWx0IiwiX3VwZGF0ZVJlc3BvbnNlV2l0aERhdGEiLCJlbmZvcmNlUHJpdmF0ZVVzZXJzIiwiaGFzQWZ0ZXJTYXZlSG9vayIsImFmdGVyU2F2ZSIsImhhc0xpdmVRdWVyeSIsIl9oYW5kbGVTYXZlUmVzcG9uc2UiLCJwZXJtcyIsImdldENsYXNzTGV2ZWxQZXJtaXNzaW9ucyIsIm9uQWZ0ZXJTYXZlIiwibG9nZ2VyIiwianNvblJldHVybmVkIiwiX3RvRnVsbEpTT04iLCJyZXNwb25zZUZyb21UcmlnZ2VyIiwidG9KU09OIiwid2FybiIsIm1pZGRsZSIsIm1vdW50Iiwic2VydmVyVVJMIiwic2FuaXRpemVkRGF0YSIsInRlc3QiLCJfZGVjb2RlIiwiX2RvdE5vdGF0aW9uRmllbGRSb290Iiwicm9vdCIsInByb2hpYml0ZWREb3ROb3RhdGlvbktleSIsImRlY29kZXNUb0luc3RhbmNlIiwiZGVzY2VuZHNJbnRvUHJvdG90eXBlIiwiY29udGFpbmVyIiwic2VnbWVudHMiLCJkZXB0aCIsInNlZ21lbnQiLCJoYXNPd24iLCJ3cml0dGVuQ29udGFpbmVyIiwia2V5U2V0IiwiU2V0Iiwicm9vdHMiLCJ3cml0dGVuQWJvdmUiLCJwcmVmaXgiLCJzcGxpdCIsImZyb21KU09OIiwicmVhZE9ubHlBdHRyaWJ1dGVzIiwiY29uc3RydWN0b3IiLCJpc1JvbGVBZnRlclNhdmUiLCJpbmNsdWRlcyIsImF0dHJpYnV0ZSIsInBvaW50ZXJSb290IiwidGFyZ2V0c1BvaW50ZXJJZCIsImlnbm9yZVZhbGlkYXRpb24iLCJzcGxpdHRlZEtleSIsInBhcmVudFByb3AiLCJwYXJlbnRWYWwiLCJzYW5pdGl6ZWQiLCJwcm90ZWN0ZWRGaWVsZHNTYXZlUmVzcG9uc2VFeGVtcHQiLCJwcm90ZWN0ZWRGaWVsZHMiLCJhZGRQcm90ZWN0ZWRGaWVsZHMiLCJ1c2VyUm9sZXMiLCJmaWVsZCIsImlzQ29udGFpbmVyIiwiZ2V0T3duUGF0aCIsInBhdGgiLCJwYXJlbnQiLCJzbGljZSIsIm5leHQiLCJfcmVzdG9yZVJldmVydGVkUGF0aCIsIndyaXRlRGF0YSIsIndyaXR0ZW4iLCJmaW5hbE9iamVjdCIsImZyb21GaW5hbCIsImF1dGhvcml0YXRpdmUiLCJhbmNlc3RvciIsInNvcnQiLCJhIiwiYiIsImFuY2VzdG9yUGF0aCIsInJldHVybmVkIiwib3AiLCJtaXNzaW5nSW5kZXgiLCJ1bmNoYW5nZWQiLCJpc0RlZXBTdHJpY3RFcXVhbCIsInRhcmdldCIsIm92ZXJsYXBzIiwicmVzcG9uc2VLZXkiLCJfcmVhZEFjY2Vzc1dpdGhvdXRRdWVyeSIsImFjbEdyb3VwIiwicmVhZGVycyIsInJlYWRlciIsInRlc3RQZXJtaXNzaW9uc0ZvckNsYXNzTmFtZSIsImlzc3VlZCIsImVjaG9lZCIsInJlcXVpcmVkQ29sdW1ucyIsInJldmVydGVkIiwic2lnblVwIiwicmVhZGFibGUiLCJ2aWV3IiwicmVzdE9wdGlvbnMiLCJyZWFkUHJlZmVyZW5jZSIsInJ1bkFmdGVyRmluZCIsImRlbmllZCIsImlzRmluYWxPYmplY3QiLCJyZXZlcnRlZERhdGEiLCJyZXZlcnRlZFBhdGhzIiwicmVzcG9uc2VEYXRhIiwic2tpcEtleXMiLCJkYXRhVmFsdWUiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJtb2R1bGUiXSwic291cmNlcyI6WyIuLi9zcmMvUmVzdFdyaXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEEgUmVzdFdyaXRlIGVuY2Fwc3VsYXRlcyBldmVyeXRoaW5nIHdlIG5lZWQgdG8gcnVuIGFuIG9wZXJhdGlvblxuLy8gdGhhdCB3cml0ZXMgdG8gdGhlIGRhdGFiYXNlLlxuLy8gVGhpcyBjb3VsZCBiZSBlaXRoZXIgYSBcImNyZWF0ZVwiIG9yIGFuIFwidXBkYXRlXCIuXG5cbnZhciBTY2hlbWFDb250cm9sbGVyID0gcmVxdWlyZSgnLi9Db250cm9sbGVycy9TY2hlbWFDb250cm9sbGVyJyk7XG5cbmNvbnN0IEF1dGggPSByZXF1aXJlKCcuL0F1dGgnKTtcbmNvbnN0IFV0aWxzID0gcmVxdWlyZSgnLi9VdGlscycpO1xudmFyIGNyeXB0b1V0aWxzID0gcmVxdWlyZSgnLi9jcnlwdG9VdGlscycpO1xudmFyIHBhc3N3b3JkQ3J5cHRvID0gcmVxdWlyZSgnLi9wYXNzd29yZCcpO1xudmFyIFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpO1xudmFyIHRyaWdnZXJzID0gcmVxdWlyZSgnLi90cmlnZ2VycycpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmltcG9ydCBSZXN0UXVlcnkgZnJvbSAnLi9SZXN0UXVlcnknO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgcmVxdWlyZWRDb2x1bW5zIH0gZnJvbSAnLi9Db250cm9sbGVycy9TY2hlbWFDb250cm9sbGVyJztcbmltcG9ydCB7IGNyZWF0ZVNhbml0aXplZEVycm9yIH0gZnJvbSAnLi9FcnJvcic7XG5pbXBvcnQgeyBhcHBseUF1dGhEYXRhT3B0aW1pc3RpY0xvY2sgfSBmcm9tICcuL0F1dGhEYXRhTG9jayc7XG5pbXBvcnQgKiBhcyBJbnN0YWxsYXRpb25EZWR1cCBmcm9tICcuL0luc3RhbGxhdGlvbkRlZHVwJztcblxuLy8gcXVlcnkgYW5kIGRhdGEgYXJlIGJvdGggcHJvdmlkZWQgaW4gUkVTVCBBUEkgZm9ybWF0LiBTbyBkYXRhXG4vLyB0eXBlcyBhcmUgZW5jb2RlZCBieSBwbGFpbiBvbGQgb2JqZWN0cy5cbi8vIElmIHF1ZXJ5IGlzIG51bGwsIHRoaXMgaXMgYSBcImNyZWF0ZVwiIGFuZCB0aGUgZGF0YSBpbiBkYXRhIHNob3VsZCBiZVxuLy8gY3JlYXRlZC5cbi8vIE90aGVyd2lzZSB0aGlzIGlzIGFuIFwidXBkYXRlXCIgLSB0aGUgb2JqZWN0IG1hdGNoaW5nIHRoZSBxdWVyeVxuLy8gc2hvdWxkIGdldCB1cGRhdGVkIHdpdGggZGF0YS5cbi8vIFJlc3RXcml0ZSB3aWxsIGhhbmRsZSBvYmplY3RJZCwgY3JlYXRlZEF0LCBhbmQgdXBkYXRlZEF0IGZvclxuLy8gZXZlcnl0aGluZy4gSXQgYWxzbyBrbm93cyB0byB1c2UgdHJpZ2dlcnMgYW5kIHNwZWNpYWwgbW9kaWZpY2F0aW9uc1xuLy8gZm9yIHRoZSBfVXNlciBjbGFzcy5cbmZ1bmN0aW9uIFJlc3RXcml0ZShjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgcXVlcnksIGRhdGEsIG9yaWdpbmFsRGF0YSwgY29udGV4dCwgYWN0aW9uKSB7XG4gIGlmIChhdXRoLmlzUmVhZE9ubHkpIHtcbiAgICB0aHJvdyBjcmVhdGVTYW5pdGl6ZWRFcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sXG4gICAgICAnQ2Fubm90IHBlcmZvcm0gYSB3cml0ZSBvcGVyYXRpb24gd2hlbiB1c2luZyByZWFkT25seU1hc3RlcktleScsXG4gICAgICBjb25maWdcbiAgICApO1xuICB9XG4gIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB0aGlzLmF1dGggPSBhdXRoO1xuICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgdGhpcy5zdG9yYWdlID0ge307XG4gIHRoaXMucnVuT3B0aW9ucyA9IHt9O1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0IHx8IHt9O1xuXG4gIGlmIChhY3Rpb24pIHtcbiAgICB0aGlzLnJ1bk9wdGlvbnMuYWN0aW9uID0gYWN0aW9uO1xuICB9XG5cbiAgaWYgKCFxdWVyeSkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5hbGxvd0N1c3RvbU9iamVjdElkKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsICdvYmplY3RJZCcpICYmICFkYXRhLm9iamVjdElkKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5NSVNTSU5HX09CSkVDVF9JRCxcbiAgICAgICAgICAnb2JqZWN0SWQgbXVzdCBub3QgYmUgZW1wdHksIG51bGwgb3IgdW5kZWZpbmVkJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGF0YS5vYmplY3RJZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSwgJ29iamVjdElkIGlzIGFuIGludmFsaWQgZmllbGQgbmFtZS4nKTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLmlkKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0tFWV9OQU1FLCAnaWQgaXMgYW4gaW52YWxpZCBmaWVsZCBuYW1lLicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZSwgdGhpcy5yZXNwb25zZSBtYXkgaGF2ZSBzZXZlcmFsXG4gIC8vIGZpZWxkcy5cbiAgLy8gcmVzcG9uc2U6IHRoZSBhY3R1YWwgZGF0YSB0byBiZSByZXR1cm5lZFxuICAvLyBzdGF0dXM6IHRoZSBodHRwIHN0YXR1cyBjb2RlLiBpZiBub3QgcHJlc2VudCwgdHJlYXRlZCBsaWtlIGEgMjAwXG4gIC8vIGxvY2F0aW9uOiB0aGUgbG9jYXRpb24gaGVhZGVyLiBpZiBub3QgcHJlc2VudCwgbm8gbG9jYXRpb24gaGVhZGVyXG4gIHRoaXMucmVzcG9uc2UgPSBudWxsO1xuXG4gIC8vIFByb2Nlc3NpbmcgdGhpcyBvcGVyYXRpb24gbWF5IG11dGF0ZSBvdXIgZGF0YSwgc28gd2Ugb3BlcmF0ZSBvbiBhXG4gIC8vIGNvcHlcbiAgdGhpcy5xdWVyeSA9IHN0cnVjdHVyZWRDbG9uZShxdWVyeSk7XG4gIHRoaXMuZGF0YSA9IHN0cnVjdHVyZWRDbG9uZShkYXRhKTtcbiAgLy8gV2UgbmV2ZXIgY2hhbmdlIG9yaWdpbmFsRGF0YSwgc28gd2UgZG8gbm90IG5lZWQgYSBkZWVwIGNvcHlcbiAgdGhpcy5vcmlnaW5hbERhdGEgPSBvcmlnaW5hbERhdGE7XG5cbiAgLy8gVGhlIHRpbWVzdGFtcCB3ZSdsbCB1c2UgZm9yIHRoaXMgd2hvbGUgb3BlcmF0aW9uXG4gIHRoaXMudXBkYXRlZEF0ID0gUGFyc2UuX2VuY29kZShuZXcgRGF0ZSgpKS5pc287XG5cbiAgLy8gU2hhcmVkIFNjaGVtYUNvbnRyb2xsZXIgdG8gYmUgcmV1c2VkIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGxvYWRTY2hlbWEoKSBjYWxscyBwZXIgcmVxdWVzdFxuICAvLyBPbmNlIHNldCB0aGUgc2NoZW1hRGF0YSBzaG91bGQgYmUgaW1tdXRhYmxlXG4gIHRoaXMudmFsaWRTY2hlbWFDb250cm9sbGVyID0gbnVsbDtcbiAgdGhpcy5wZW5kaW5nT3BzID0ge1xuICAgIG9wZXJhdGlvbnM6IG51bGwsXG4gICAgaWRlbnRpZmllcjogbnVsbCxcbiAgfTtcbn1cblxuLy8gQSBjb252ZW5pZW50IG1ldGhvZCB0byBwZXJmb3JtIGFsbCB0aGUgc3RlcHMgb2YgcHJvY2Vzc2luZyB0aGVcbi8vIHdyaXRlLCBpbiBvcmRlci5cbi8vIFJldHVybnMgYSBwcm9taXNlIGZvciBhIHtyZXNwb25zZSwgc3RhdHVzLCBsb2NhdGlvbn0gb2JqZWN0LlxuLy8gc3RhdHVzIGFuZCBsb2NhdGlvbiBhcmUgb3B0aW9uYWwuXG5SZXN0V3JpdGUucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNoZWNrSW50ZXJuYWxGaWVsZHMoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmdldFVzZXJBbmRSb2xlQUNMKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUNsaWVudENsYXNzQ3JlYXRpb24oKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUluc3RhbGxhdGlvbigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlU2Vzc2lvbigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuYXV0aG9yaXplVXNlclVwZGF0ZSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVBdXRoRGF0YSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2hlY2tSZXN0cmljdGVkRmllbGRzKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZlRmlsZVVybHMoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlRG90Tm90YXRpb25LZXlzKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5ydW5CZWZvcmVTYXZlVHJpZ2dlcigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZW5zdXJlVW5pcXVlQXV0aERhdGFJZCgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlRW1haWxSZXNldFRva2VuSWZOZWVkZWQoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlV3JpdGVQZXJtaXNzaW9uKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVNjaGVtYSgpO1xuICAgIH0pXG4gICAgLnRoZW4oc2NoZW1hQ29udHJvbGxlciA9PiB7XG4gICAgICB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlciA9IHNjaGVtYUNvbnRyb2xsZXI7XG4gICAgICByZXR1cm4gdGhpcy5zZXRSZXF1aXJlZEZpZWxkc0lmTmVlZGVkKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1Vc2VyKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5leHBhbmRGaWxlc0ZvckV4aXN0aW5nT2JqZWN0cygpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGVzdHJveUR1cGxpY2F0ZWRTZXNzaW9ucygpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucnVuRGF0YWJhc2VPcGVyYXRpb24oKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNlc3Npb25Ub2tlbklmTmVlZGVkKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVGb2xsb3d1cCgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucnVuQWZ0ZXJTYXZlVHJpZ2dlcigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY2xlYW5Vc2VyQXV0aERhdGEoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlclVucmVhZGFibGVGaWVsZHNJblJlc3BvbnNlKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJQcm90ZWN0ZWRGaWVsZHNJblJlc3BvbnNlKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICAvLyBBcHBlbmQgdGhlIGF1dGhEYXRhUmVzcG9uc2UgaWYgZXhpc3RzXG4gICAgICBpZiAodGhpcy5hdXRoRGF0YVJlc3BvbnNlKSB7XG4gICAgICAgIGlmICh0aGlzLnJlc3BvbnNlICYmIHRoaXMucmVzcG9uc2UucmVzcG9uc2UpIHtcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlLmF1dGhEYXRhUmVzcG9uc2UgPSB0aGlzLmF1dGhEYXRhUmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0b3JhZ2UucmVqZWN0U2lnbnVwICYmIHRoaXMuY29uZmlnLnByZXZlbnRTaWdudXBXaXRoVW52ZXJpZmllZEVtYWlsKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5FTUFJTF9OT1RfRk9VTkQsICdVc2VyIGVtYWlsIGlzIG5vdCB2ZXJpZmllZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlO1xuICAgIH0pO1xufTtcblxuLy8gVXNlcyB0aGUgQXV0aCBvYmplY3QgdG8gZ2V0IHRoZSBsaXN0IG9mIHJvbGVzLCBhZGRzIHRoZSB1c2VyIGlkXG5SZXN0V3JpdGUucHJvdG90eXBlLmdldFVzZXJBbmRSb2xlQUNMID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyIHx8IHRoaXMuYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgdGhpcy5ydW5PcHRpb25zLmFjbCA9IFsnKiddO1xuXG4gIGlmICh0aGlzLmF1dGgudXNlcikge1xuICAgIHJldHVybiB0aGlzLmF1dGguZ2V0VXNlclJvbGVzKCkudGhlbihyb2xlcyA9PiB7XG4gICAgICB0aGlzLnJ1bk9wdGlvbnMuYWNsID0gdGhpcy5ydW5PcHRpb25zLmFjbC5jb25jYXQocm9sZXMsIFt0aGlzLmF1dGgudXNlci5pZF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufTtcblxuLy8gVmFsaWRhdGVzIHRoaXMgb3BlcmF0aW9uIGFnYWluc3QgdGhlIGFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiBjb25maWcuXG5SZXN0V3JpdGUucHJvdG90eXBlLnZhbGlkYXRlQ2xpZW50Q2xhc3NDcmVhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKFxuICAgIHRoaXMuY29uZmlnLmFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiA9PT0gZmFsc2UgJiZcbiAgICAhdGhpcy5hdXRoLmlzTWFzdGVyICYmXG4gICAgIXRoaXMuYXV0aC5pc01haW50ZW5hbmNlICYmXG4gICAgU2NoZW1hQ29udHJvbGxlci5zeXN0ZW1DbGFzc2VzLmluZGV4T2YodGhpcy5jbGFzc05hbWUpID09PSAtMVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5sb2FkU2NoZW1hKClcbiAgICAgIC50aGVuKHNjaGVtYUNvbnRyb2xsZXIgPT4gc2NoZW1hQ29udHJvbGxlci5oYXNDbGFzcyh0aGlzLmNsYXNzTmFtZSkpXG4gICAgICAudGhlbihoYXNDbGFzcyA9PiB7XG4gICAgICAgIGlmIChoYXNDbGFzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgICAgICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgICAgICAgICdUaGlzIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gYWNjZXNzIG5vbi1leGlzdGVudCBjbGFzczogJyArIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICAgICAgdGhpcy5jb25maWdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbn07XG5cbi8vIFZhbGlkYXRlcyB0aGlzIG9wZXJhdGlvbiBhZ2FpbnN0IHRoZSBzY2hlbWEuXG5SZXN0V3JpdGUucHJvdG90eXBlLnZhbGlkYXRlU2NoZW1hID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UudmFsaWRhdGVPYmplY3QoXG4gICAgdGhpcy5jbGFzc05hbWUsXG4gICAgdGhpcy5kYXRhLFxuICAgIHRoaXMucXVlcnksXG4gICAgdGhpcy5ydW5PcHRpb25zLFxuICAgIHRoaXMuYXV0aC5pc01haW50ZW5hbmNlXG4gICk7XG59O1xuXG4vLyBSZXNvbHZlcyB0aGUgVVJMcyBvZiBmaWxlIHBvaW50ZXJzIGluIHRoZSBkYXRhIHRoYXQgaGF2ZSBubyBVUkwsIHNvIHRoYXQgdGhlXG4vLyBQYXJzZSBvYmplY3RzIGJ1aWx0IGZvciB0cmlnZ2VycyBhbmQgTGl2ZVF1ZXJ5IGNhbiBiZSBlbmNvZGVkLlxuUmVzdFdyaXRlLnByb3RvdHlwZS5yZXNvbHZlRmlsZVVybHMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGZpbGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgY29uc3QgY29sbGVjdCA9IHZhbHVlID0+IHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbHVlLl9fdHlwZSA9PT0gJ0ZpbGUnKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlLm5hbWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTkNPUlJFQ1RfVFlQRSwgJ1RoaXMgaXMgbm90IGEgdmFsaWQgRmlsZScpO1xuICAgICAgfVxuICAgICAgaWYgKCF2YWx1ZS51cmwpIHtcbiAgICAgICAgZmlsZXNbdmFsdWUubmFtZV0gPSB7IF9fdHlwZTogJ0ZpbGUnLCBuYW1lOiB2YWx1ZS5uYW1lIH07XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE9iamVjdC52YWx1ZXModmFsdWUpLmZvckVhY2goY29sbGVjdCk7XG4gIH07XG4gIGNvbGxlY3QodGhpcy5kYXRhKTtcbiAgaWYgKE9iamVjdC5rZXlzKGZpbGVzKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgdGhpcy5jb25maWcuZmlsZXNDb250cm9sbGVyLmV4cGFuZEZpbGVzSW5PYmplY3QodGhpcy5jb25maWcsIGZpbGVzKTtcbiAgdGhpcy5maWxlVXJscyA9IE9iamVjdC5hc3NpZ24odGhpcy5maWxlVXJscyB8fCBPYmplY3QuY3JlYXRlKG51bGwpLCBmaWxlcyk7XG59O1xuXG4vLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgZGF0YSB3aXRoIHRoZSByZXNvbHZlZCBVUkxzIGFkZGVkIHRvIGZpbGUgcG9pbnRlcnMuXG5SZXN0V3JpdGUucHJvdG90eXBlLmNsb25lV2l0aEZpbGVVcmxzID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICBjb25zdCBkYXRhID0gc3RydWN0dXJlZENsb25lKG9iamVjdCk7XG4gIGlmICghdGhpcy5maWxlVXJscykge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG4gIGNvbnN0IGFkZFVybHMgPSB2YWx1ZSA9PiB7XG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh2YWx1ZS5fX3R5cGUgPT09ICdGaWxlJykge1xuICAgICAgY29uc3QgZmlsZSA9IHR5cGVvZiB2YWx1ZS5uYW1lID09PSAnc3RyaW5nJyAmJiB0aGlzLmZpbGVVcmxzW3ZhbHVlLm5hbWVdO1xuICAgICAgaWYgKCF2YWx1ZS51cmwgJiYgZmlsZSkge1xuICAgICAgICB2YWx1ZS51cmwgPSBmaWxlLnVybDtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgT2JqZWN0LnZhbHVlcyh2YWx1ZSkuZm9yRWFjaChhZGRVcmxzKTtcbiAgfTtcbiAgYWRkVXJscyhkYXRhKTtcbiAgcmV0dXJuIGRhdGE7XG59O1xuXG4vLyBSdW5zIGFueSBiZWZvcmVTYXZlIHRyaWdnZXJzIGFnYWluc3QgdGhpcyBvcGVyYXRpb24uXG4vLyBBbnkgY2hhbmdlIGxlYWRzIHRvIG91ciBkYXRhIGJlaW5nIG11dGF0ZWQuXG5SZXN0V3JpdGUucHJvdG90eXBlLnJ1bkJlZm9yZVNhdmVUcmlnZ2VyID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXNwb25zZSB8fCB0aGlzLnJ1bk9wdGlvbnMubWFueSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEF2b2lkIGRvaW5nIGFueSBzZXR1cCBmb3IgdHJpZ2dlcnMgaWYgdGhlcmUgaXMgbm8gJ2JlZm9yZVNhdmUnIHRyaWdnZXIgZm9yIHRoaXMgY2xhc3MuXG4gIGlmIChcbiAgICAhdHJpZ2dlcnMudHJpZ2dlckV4aXN0cyh0aGlzLmNsYXNzTmFtZSwgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlU2F2ZSwgdGhpcy5jb25maWcuYXBwbGljYXRpb25JZClcbiAgKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgY29uc3QgeyBvcmlnaW5hbE9iamVjdCwgdXBkYXRlZE9iamVjdCB9ID0gdGhpcy5idWlsZFBhcnNlT2JqZWN0cygpO1xuICBjb25zdCBpZGVudGlmaWVyID0gdXBkYXRlZE9iamVjdC5fZ2V0U3RhdGVJZGVudGlmaWVyKCk7XG4gIGNvbnN0IHN0YXRlQ29udHJvbGxlciA9IFBhcnNlLkNvcmVNYW5hZ2VyLmdldE9iamVjdFN0YXRlQ29udHJvbGxlcigpO1xuICBjb25zdCBbcGVuZGluZ10gPSBzdGF0ZUNvbnRyb2xsZXIuZ2V0UGVuZGluZ09wcyhpZGVudGlmaWVyKTtcbiAgdGhpcy5wZW5kaW5nT3BzID0ge1xuICAgIG9wZXJhdGlvbnM6IHsgLi4ucGVuZGluZyB9LFxuICAgIGlkZW50aWZpZXIsXG4gIH07XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgLy8gQmVmb3JlIGNhbGxpbmcgdGhlIHRyaWdnZXIsIHZhbGlkYXRlIHRoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHNhdmUgb3BlcmF0aW9uXG4gICAgICBsZXQgZGF0YWJhc2VQcm9taXNlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLnF1ZXJ5KSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIGZvciB1cGRhdGluZ1xuICAgICAgICBkYXRhYmFzZVByb21pc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS51cGRhdGUoXG4gICAgICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICAgICAgdGhpcy5xdWVyeSxcbiAgICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgICAgdGhpcy5ydW5PcHRpb25zLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgZm9yIGNyZWF0aW5nXG4gICAgICAgIGRhdGFiYXNlUHJvbWlzZSA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmNyZWF0ZShcbiAgICAgICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgICAgICB0aGlzLmRhdGEsXG4gICAgICAgICAgdGhpcy5ydW5PcHRpb25zLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgbm8gcGVybWlzc2lvbiBmb3IgdGhlIG9wZXJhdGlvbiwgaXQgdGhyb3dzIGFuIGVycm9yXG4gICAgICByZXR1cm4gZGF0YWJhc2VQcm9taXNlLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0Lmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kLicpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIoXG4gICAgICAgIHRyaWdnZXJzLlR5cGVzLmJlZm9yZVNhdmUsXG4gICAgICAgIHRoaXMuYXV0aCxcbiAgICAgICAgdXBkYXRlZE9iamVjdCxcbiAgICAgICAgb3JpZ2luYWxPYmplY3QsXG4gICAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgICk7XG4gICAgfSlcbiAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uub2JqZWN0KSB7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyID0gXy5yZWR1Y2UoXG4gICAgICAgICAgcmVzcG9uc2Uub2JqZWN0LFxuICAgICAgICAgIChyZXN1bHQsIHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghXy5pc0VxdWFsKHRoaXMuZGF0YVtrZXldLCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbXVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRhdGEgPSByZXNwb25zZS5vYmplY3Q7XG4gICAgICAgIC8vIFdlIHNob3VsZCBkZWxldGUgdGhlIG9iamVjdElkIGZvciBhbiB1cGRhdGUgd3JpdGVcbiAgICAgICAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmRhdGEub2JqZWN0SWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIFV0aWxzLmNoZWNrUHJvaGliaXRlZEtleXdvcmRzKHRoaXMuY29uZmlnLCB0aGlzLmRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsIGAke2Vycm9yfWApO1xuICAgICAgfVxuICAgICAgdGhpcy52YWxpZGF0ZURvdE5vdGF0aW9uS2V5cygpO1xuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLm9iamVjdCkge1xuICAgICAgICAvLyBUaGUgdHJpZ2dlciBtYXkgaGF2ZSBzZXQgZmlsZSBwb2ludGVycyB3aXRob3V0IFVSTFxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlRmlsZVVybHMoKTtcbiAgICAgIH1cbiAgICB9KTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUucnVuQmVmb3JlTG9naW5UcmlnZ2VyID0gYXN5bmMgZnVuY3Rpb24gKHVzZXJEYXRhKSB7XG4gIC8vIEF2b2lkIGRvaW5nIGFueSBzZXR1cCBmb3IgdHJpZ2dlcnMgaWYgdGhlcmUgaXMgbm8gJ2JlZm9yZUxvZ2luJyB0cmlnZ2VyXG4gIGlmIChcbiAgICAhdHJpZ2dlcnMudHJpZ2dlckV4aXN0cyh0aGlzLmNsYXNzTmFtZSwgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlTG9naW4sIHRoaXMuY29uZmlnLmFwcGxpY2F0aW9uSWQpXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENsb3VkIGNvZGUgZ2V0cyBhIGJpdCBvZiBleHRyYSBkYXRhIGZvciBpdHMgb2JqZWN0c1xuICBjb25zdCBleHRyYURhdGEgPSB7IGNsYXNzTmFtZTogdGhpcy5jbGFzc05hbWUgfTtcblxuICAvLyBFeHBhbmQgZmlsZSBvYmplY3RzXG4gIGF3YWl0IHRoaXMuY29uZmlnLmZpbGVzQ29udHJvbGxlci5leHBhbmRGaWxlc0luT2JqZWN0KHRoaXMuY29uZmlnLCB1c2VyRGF0YSk7XG5cbiAgY29uc3QgdXNlciA9IHRyaWdnZXJzLmluZmxhdGUoZXh0cmFEYXRhLCB1c2VyRGF0YSk7XG5cbiAgLy8gbm8gbmVlZCB0byByZXR1cm4gYSByZXNwb25zZVxuICBhd2FpdCB0cmlnZ2Vycy5tYXliZVJ1blRyaWdnZXIoXG4gICAgdHJpZ2dlcnMuVHlwZXMuYmVmb3JlTG9naW4sXG4gICAgdGhpcy5hdXRoLFxuICAgIHVzZXIsXG4gICAgbnVsbCxcbiAgICB0aGlzLmNvbmZpZyxcbiAgICB0aGlzLmNvbnRleHRcbiAgKTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuc2V0UmVxdWlyZWRGaWVsZHNJZk5lZWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuZGF0YSkge1xuICAgIHJldHVybiB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlci5nZXRBbGxDbGFzc2VzKCkudGhlbihhbGxDbGFzc2VzID0+IHtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IGFsbENsYXNzZXMuZmluZChvbmVDbGFzcyA9PiBvbmVDbGFzcy5jbGFzc05hbWUgPT09IHRoaXMuY2xhc3NOYW1lKTtcbiAgICAgIGNvbnN0IHNldFJlcXVpcmVkRmllbGRJZk5lZWRlZCA9IChmaWVsZE5hbWUsIHNldERlZmF1bHQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICB0aGlzLmRhdGFbZmllbGROYW1lXSA9PT0gbnVsbCB8fFxuICAgICAgICAgIHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSAnJyB8fFxuICAgICAgICAgICh0eXBlb2YgdGhpcy5kYXRhW2ZpZWxkTmFtZV0gPT09ICdvYmplY3QnICYmIHRoaXMuZGF0YVtmaWVsZE5hbWVdLl9fb3AgPT09ICdEZWxldGUnKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzZXREZWZhdWx0ICYmXG4gICAgICAgICAgICBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gJiZcbiAgICAgICAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS5kZWZhdWx0VmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHNjaGVtYS5maWVsZHNbZmllbGROYW1lXS5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKHRoaXMuZGF0YVtmaWVsZE5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgKHR5cGVvZiB0aGlzLmRhdGFbZmllbGROYW1lXSA9PT0gJ29iamVjdCcgJiYgdGhpcy5kYXRhW2ZpZWxkTmFtZV0uX19vcCA9PT0gJ0RlbGV0ZScpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5kYXRhW2ZpZWxkTmFtZV0gPSBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0uZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlLmZpZWxkc0NoYW5nZWRCeVRyaWdnZXIgPSB0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlciB8fCBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlci5pbmRleE9mKGZpZWxkTmFtZSkgPCAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyLnB1c2goZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYS5maWVsZHNbZmllbGROYW1lXSAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0ucmVxdWlyZWQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLCBgJHtmaWVsZE5hbWV9IGlzIHJlcXVpcmVkYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBhZGQgZGVmYXVsdCBBQ0wgKG9ubHkgb24gQ1JFQVRFLCBub3QgVVBEQVRFKVxuICAgICAgaWYgKCF0aGlzLnF1ZXJ5ICYmXG4gICAgICAgIHNjaGVtYT8uY2xhc3NMZXZlbFBlcm1pc3Npb25zPy5BQ0wgJiZcbiAgICAgICAgIXRoaXMuZGF0YS5BQ0wgJiZcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoc2NoZW1hLmNsYXNzTGV2ZWxQZXJtaXNzaW9ucy5BQ0wpICE9PVxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHsgJyonOiB7IHJlYWQ6IHRydWUsIHdyaXRlOiB0cnVlIH0gfSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBhY2wgPSBzdHJ1Y3R1cmVkQ2xvbmUoc2NoZW1hLmNsYXNzTGV2ZWxQZXJtaXNzaW9ucy5BQ0wpO1xuICAgICAgICBpZiAoYWNsLmN1cnJlbnRVc2VyKSB7XG4gICAgICAgICAgaWYgKHRoaXMuYXV0aC51c2VyPy5pZCkge1xuICAgICAgICAgICAgYWNsW3RoaXMuYXV0aC51c2VyPy5pZF0gPSBzdHJ1Y3R1cmVkQ2xvbmUoYWNsLmN1cnJlbnRVc2VyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsZXRlIGFjbC5jdXJyZW50VXNlcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGEuQUNMID0gYWNsO1xuICAgICAgICB0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlciA9IHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyIHx8IFtdO1xuICAgICAgICB0aGlzLnN0b3JhZ2UuZmllbGRzQ2hhbmdlZEJ5VHJpZ2dlci5wdXNoKCdBQ0wnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGRlZmF1bHQgZmllbGRzXG4gICAgICBpZiAoIXRoaXMucXVlcnkpIHtcbiAgICAgICAgLy8gYWxsb3cgY3VzdG9taXppbmcgY3JlYXRlZEF0IGFuZCB1cGRhdGVkQXQgd2hlbiB1c2luZyBtYWludGVuYW5jZSBrZXlcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuYXV0aC5pc01haW50ZW5hbmNlICYmXG4gICAgICAgICAgdGhpcy5kYXRhLmNyZWF0ZWRBdCAmJlxuICAgICAgICAgIHRoaXMuZGF0YS5jcmVhdGVkQXQuX190eXBlID09PSAnRGF0ZSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLmNyZWF0ZWRBdCA9IHRoaXMuZGF0YS5jcmVhdGVkQXQuaXNvO1xuXG4gICAgICAgICAgaWYgKHRoaXMuZGF0YS51cGRhdGVkQXQgJiYgdGhpcy5kYXRhLnVwZGF0ZWRBdC5fX3R5cGUgPT09ICdEYXRlJykge1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID0gbmV3IERhdGUodGhpcy5kYXRhLmNyZWF0ZWRBdCk7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkQXQgPSBuZXcgRGF0ZSh0aGlzLmRhdGEudXBkYXRlZEF0Lmlzbyk7XG5cbiAgICAgICAgICAgIGlmICh1cGRhdGVkQXQgPCBjcmVhdGVkQXQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICAgIFBhcnNlLkVycm9yLlZBTElEQVRJT05fRVJST1IsXG4gICAgICAgICAgICAgICAgJ3VwZGF0ZWRBdCBjYW5ub3Qgb2NjdXIgYmVmb3JlIGNyZWF0ZWRBdCdcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5kYXRhLnVwZGF0ZWRBdCA9IHRoaXMuZGF0YS51cGRhdGVkQXQuaXNvO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpZiBubyB1cGRhdGVkQXQgaXMgcHJvdmlkZWQsIHNldCBpdCB0byBjcmVhdGVkQXQgdG8gbWF0Y2ggZGVmYXVsdCBiZWhhdmlvclxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXRhLnVwZGF0ZWRBdCA9IHRoaXMuZGF0YS5jcmVhdGVkQXQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZGF0YS51cGRhdGVkQXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICAgICAgICB0aGlzLmRhdGEuY3JlYXRlZEF0ID0gdGhpcy51cGRhdGVkQXQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPbmx5IGFzc2lnbiBuZXcgb2JqZWN0SWQgaWYgd2UgYXJlIGNyZWF0aW5nIG5ldyBvYmplY3RcbiAgICAgICAgaWYgKCF0aGlzLmRhdGEub2JqZWN0SWQpIHtcbiAgICAgICAgICB0aGlzLmRhdGEub2JqZWN0SWQgPSBjcnlwdG9VdGlscy5uZXdPYmplY3RJZCh0aGlzLmNvbmZpZy5vYmplY3RJZFNpemUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzY2hlbWEpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhzY2hlbWEuZmllbGRzKS5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XG4gICAgICAgICAgICBzZXRSZXF1aXJlZEZpZWxkSWZOZWVkZWQoZmllbGROYW1lLCB0cnVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzY2hlbWEpIHtcbiAgICAgICAgdGhpcy5kYXRhLnVwZGF0ZWRBdCA9IHRoaXMudXBkYXRlZEF0O1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgICAgIHNldFJlcXVpcmVkRmllbGRJZk5lZWRlZChmaWVsZE5hbWUsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufTtcblxuLy8gVHJhbnNmb3JtcyBhdXRoIGRhdGEgZm9yIGEgdXNlciBvYmplY3QuXG4vLyBEb2VzIG5vdGhpbmcgaWYgdGhpcyBpc24ndCBhIHVzZXIgb2JqZWN0LlxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZW4gd2UncmUgZG9uZSBpZiBpdCBjYW4ndCBmaW5pc2ggdGhpcyB0aWNrLlxuUmVzdFdyaXRlLnByb3RvdHlwZS52YWxpZGF0ZUF1dGhEYXRhID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbGFzc05hbWUgIT09ICdfVXNlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhdXRoRGF0YSA9IHRoaXMuZGF0YS5hdXRoRGF0YTtcbiAgY29uc3QgaGFzVXNlcm5hbWVBbmRQYXNzd29yZCA9XG4gICAgdHlwZW9mIHRoaXMuZGF0YS51c2VybmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHRoaXMuZGF0YS5wYXNzd29yZCA9PT0gJ3N0cmluZyc7XG4gIGNvbnN0IGhhc0F1dGhEYXRhID1cbiAgICBhdXRoRGF0YSAmJlxuICAgIE9iamVjdC5rZXlzKGF1dGhEYXRhKS5zb21lKHByb3ZpZGVyID0+IHtcbiAgICAgIGNvbnN0IHByb3ZpZGVyRGF0YSA9IGF1dGhEYXRhW3Byb3ZpZGVyXTtcbiAgICAgIHJldHVybiBwcm92aWRlckRhdGEgJiYgdHlwZW9mIHByb3ZpZGVyRGF0YSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMocHJvdmlkZXJEYXRhKS5sZW5ndGg7XG4gICAgfSk7XG5cbiAgY29uc3QgcmVxdWlyZXNDcmVkZW50aWFscyA9ICF0aGlzLnF1ZXJ5ICYmICFoYXNBdXRoRGF0YTtcbiAgY29uc3QgaXNNaXNzaW5nID0gdmFsdWUgPT4gdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCBfLmlzRW1wdHkodmFsdWUpO1xuICAvLyBBbiBlbXB0eSB1c2VybmFtZSBvbiBjcmVhdGUgd2l0aCBhdXRoRGF0YSBpcyByZXBsYWNlZCBieSBhIHJhbmRvbSBvbmVcbiAgY29uc3QgY2hlY2tVc2VybmFtZSA9IHJlcXVpcmVzQ3JlZGVudGlhbHMgfHwgKHRoaXMucXVlcnkgJiYgdGhpcy5kYXRhLnVzZXJuYW1lICE9PSB1bmRlZmluZWQpO1xuICBjb25zdCBjaGVja1Bhc3N3b3JkID0gcmVxdWlyZXNDcmVkZW50aWFscyB8fCB0aGlzLmRhdGEucGFzc3dvcmQgIT09IHVuZGVmaW5lZDtcbiAgaWYgKGNoZWNrVXNlcm5hbWUgJiYgaXNNaXNzaW5nKHRoaXMuZGF0YS51c2VybmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVVNFUk5BTUVfTUlTU0lORywgJ2JhZCBvciBtaXNzaW5nIHVzZXJuYW1lJyk7XG4gIH1cbiAgaWYgKGNoZWNrUGFzc3dvcmQgJiYgaXNNaXNzaW5nKHRoaXMuZGF0YS5wYXNzd29yZCkpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuUEFTU1dPUkRfTUlTU0lORywgJ3Bhc3N3b3JkIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmRhdGEsICdhdXRoRGF0YScpKSB7XG4gICAgLy8gTm90aGluZyB0byB2YWxpZGF0ZSBoZXJlXG4gICAgcmV0dXJuO1xuICB9IGVsc2UgaWYgKCF0aGlzLmRhdGEuYXV0aERhdGEpIHtcbiAgICAvLyBIYW5kbGUgc2F2aW5nIGF1dGhEYXRhIHRvIG51bGxcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5VTlNVUFBPUlRFRF9TRVJWSUNFLFxuICAgICAgJ1RoaXMgYXV0aGVudGljYXRpb24gbWV0aG9kIGlzIHVuc3VwcG9ydGVkLidcbiAgICApO1xuICB9XG5cbiAgdmFyIHByb3ZpZGVycyA9IE9iamVjdC5rZXlzKGF1dGhEYXRhKTtcbiAgaWYgKCFwcm92aWRlcnMubGVuZ3RoKSB7XG4gICAgLy8gRW1wdHkgYXV0aERhdGEgb2JqZWN0LCBub3RoaW5nIHRvIHZhbGlkYXRlXG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGNhbkhhbmRsZUF1dGhEYXRhID0gcHJvdmlkZXJzLnNvbWUocHJvdmlkZXIgPT4ge1xuICAgIGNvbnN0IHByb3ZpZGVyQXV0aERhdGEgPSBhdXRoRGF0YVtwcm92aWRlcl0gfHwge307XG4gICAgcmV0dXJuICEhT2JqZWN0LmtleXMocHJvdmlkZXJBdXRoRGF0YSkubGVuZ3RoO1xuICB9KTtcbiAgaWYgKGNhbkhhbmRsZUF1dGhEYXRhIHx8IGhhc1VzZXJuYW1lQW5kUGFzc3dvcmQgfHwgdGhpcy5hdXRoLmlzTWFzdGVyIHx8IHRoaXMuZ2V0VXNlcklkKCkpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVBdXRoRGF0YShhdXRoRGF0YSk7XG4gIH1cbiAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgIFBhcnNlLkVycm9yLlVOU1VQUE9SVEVEX1NFUlZJQ0UsXG4gICAgJ1RoaXMgYXV0aGVudGljYXRpb24gbWV0aG9kIGlzIHVuc3VwcG9ydGVkLidcbiAgKTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuZmlsdGVyZWRPYmplY3RzQnlBQ0wgPSBmdW5jdGlvbiAob2JqZWN0cykge1xuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyIHx8IHRoaXMuYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgcmV0dXJuIG9iamVjdHM7XG4gIH1cbiAgcmV0dXJuIG9iamVjdHMuZmlsdGVyKG9iamVjdCA9PiB7XG4gICAgaWYgKCFvYmplY3QuQUNMKSB7XG4gICAgICByZXR1cm4gdHJ1ZTsgLy8gbGVnYWN5IHVzZXJzIHRoYXQgaGF2ZSBubyBBQ0wgZmllbGQgb24gdGhlbVxuICAgIH1cbiAgICAvLyBSZWd1bGFyIHVzZXJzIHRoYXQgaGF2ZSBiZWVuIGxvY2tlZCBvdXQuXG4gICAgcmV0dXJuIG9iamVjdC5BQ0wgJiYgT2JqZWN0LmtleXMob2JqZWN0LkFDTCkubGVuZ3RoID4gMDtcbiAgfSk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmdldFVzZXJJZCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCAmJiB0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJykge1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5Lm9iamVjdElkO1xuICB9IGVsc2UgaWYgKHRoaXMuYXV0aCAmJiB0aGlzLmF1dGgudXNlciAmJiB0aGlzLmF1dGgudXNlci5pZCkge1xuICAgIHJldHVybiB0aGlzLmF1dGgudXNlci5pZDtcbiAgfVxufTtcblxuLy8gRGV2ZWxvcGVycyBhcmUgYWxsb3dlZCB0byBjaGFuZ2UgYXV0aERhdGEgdmlhIGJlZm9yZSBzYXZlIHRyaWdnZXJcblJlc3RXcml0ZS5wcm90b3R5cGUuX3Rocm93SWZBdXRoRGF0YUR1cGxpY2F0ZSA9IGZ1bmN0aW9uIChlcnJvcikge1xuICBpZiAoXG4gICAgdGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgJiZcbiAgICBlcnJvcj8uY29kZSA9PT0gUGFyc2UuRXJyb3IuRFVQTElDQVRFX1ZBTFVFICYmXG4gICAgZXJyb3IudXNlckluZm8/LmR1cGxpY2F0ZWRfZmllbGQ/LnN0YXJ0c1dpdGgoJ19hdXRoX2RhdGFfJylcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkFDQ09VTlRfQUxSRUFEWV9MSU5LRUQsICd0aGlzIGF1dGggaXMgYWxyZWFkeSB1c2VkJyk7XG4gIH1cbn07XG5cbi8vIHdlIG5lZWQgYWZ0ZXIgYmVmb3JlIHNhdmUgdG8gZW5zdXJlIHRoYXQgdGhlIGRldmVsb3BlclxuLy8gaXMgbm90IGN1cnJlbnRseSBkdXBsaWNhdGluZyBhdXRoIGRhdGEgSURcblJlc3RXcml0ZS5wcm90b3R5cGUuZW5zdXJlVW5pcXVlQXV0aERhdGFJZCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9PSAnX1VzZXInIHx8ICF0aGlzLmRhdGEuYXV0aERhdGEpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoYXNBdXRoRGF0YUlkID0gT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5zb21lKFxuICAgIGtleSA9PiB0aGlzLmRhdGEuYXV0aERhdGFba2V5XSAmJiB0aGlzLmRhdGEuYXV0aERhdGFba2V5XS5pZFxuICApO1xuXG4gIGlmICghaGFzQXV0aERhdGFJZCkgeyByZXR1cm47IH1cblxuICBjb25zdCByID0gYXdhaXQgQXV0aC5maW5kVXNlcnNXaXRoQXV0aERhdGEodGhpcy5jb25maWcsIHRoaXMuZGF0YS5hdXRoRGF0YSk7XG4gIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmZpbHRlcmVkT2JqZWN0c0J5QUNMKHIpO1xuICBpZiAocmVzdWx0cy5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkFDQ09VTlRfQUxSRUFEWV9MSU5LRUQsICd0aGlzIGF1dGggaXMgYWxyZWFkeSB1c2VkJyk7XG4gIH1cbiAgLy8gdXNlIGRhdGEub2JqZWN0SWQgaW4gY2FzZSBvZiBsb2dpbiB0aW1lIGFuZCBmb3VuZCB1c2VyIGR1cmluZyBoYW5kbGUgdmFsaWRhdGVBdXRoRGF0YVxuICBjb25zdCB1c2VySWQgPSB0aGlzLmdldFVzZXJJZCgpIHx8IHRoaXMuZGF0YS5vYmplY3RJZDtcbiAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAxICYmIHVzZXJJZCAhPT0gcmVzdWx0c1swXS5vYmplY3RJZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5BQ0NPVU5UX0FMUkVBRFlfTElOS0VELCAndGhpcyBhdXRoIGlzIGFscmVhZHkgdXNlZCcpO1xuICB9XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmhhbmRsZUF1dGhEYXRhID0gYXN5bmMgZnVuY3Rpb24gKGF1dGhEYXRhKSB7XG4gIGxldCBjdXJyZW50VXNlckF1dGhEYXRhO1xuICBpZiAodGhpcy5xdWVyeT8ub2JqZWN0SWQpIHtcbiAgICBjb25zdCBbY3VycmVudFVzZXJdID0gYXdhaXQgdGhpcy5jb25maWcuZGF0YWJhc2UuZmluZChcbiAgICAgICdfVXNlcicsXG4gICAgICB7IG9iamVjdElkOiB0aGlzLnF1ZXJ5Lm9iamVjdElkIH1cbiAgICApO1xuICAgIGN1cnJlbnRVc2VyQXV0aERhdGEgPSBjdXJyZW50VXNlcj8uYXV0aERhdGE7XG4gIH1cbiAgY29uc3QgciA9IGF3YWl0IEF1dGguZmluZFVzZXJzV2l0aEF1dGhEYXRhKHRoaXMuY29uZmlnLCBhdXRoRGF0YSwgdHJ1ZSwgY3VycmVudFVzZXJBdXRoRGF0YSk7XG4gIGNvbnN0IHJlc3VsdHMgPSB0aGlzLmZpbHRlcmVkT2JqZWN0c0J5QUNMKHIpO1xuXG4gIGNvbnN0IHVzZXJJZCA9IHRoaXMuZ2V0VXNlcklkKCk7XG4gIGNvbnN0IGlzTG9naW4gPSAhdXNlcklkO1xuICBjb25zdCB1c2VyUmVzdWx0ID0gcmVzdWx0c1swXTtcbiAgY29uc3QgZm91bmRVc2VySXNOb3RDdXJyZW50VXNlciA9IHVzZXJJZCAmJiB1c2VyUmVzdWx0ICYmIHVzZXJJZCAhPT0gdXNlclJlc3VsdC5vYmplY3RJZDtcblxuICBpZiAocmVzdWx0cy5sZW5ndGggPiAxIHx8IGZvdW5kVXNlcklzTm90Q3VycmVudFVzZXIpIHtcbiAgICAvLyBUbyBhdm9pZCBodHRwczovL2dpdGh1Yi5jb20vcGFyc2UtY29tbXVuaXR5L3BhcnNlLXNlcnZlci9zZWN1cml0eS9hZHZpc29yaWVzL0dIU0EtOHczai1nOTgzLThqaDVcbiAgICAvLyBMZXQncyBydW4gc29tZSB2YWxpZGF0aW9uIGJlZm9yZSB0aHJvd2luZ1xuICAgIGF3YWl0IEF1dGguaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uKGF1dGhEYXRhLCB0aGlzLCB1c2VyUmVzdWx0LCB7IGlzTG9naW4gfSk7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkFDQ09VTlRfQUxSRUFEWV9MSU5LRUQsICd0aGlzIGF1dGggaXMgYWxyZWFkeSB1c2VkJyk7XG4gIH1cblxuICAvLyBObyB1c2VyIGZvdW5kIHdpdGggcHJvdmlkZWQgYXV0aERhdGEgd2UgbmVlZCB0byB2YWxpZGF0ZVxuICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7XG4gICAgY29uc3QgeyBhdXRoRGF0YTogdmFsaWRhdGVkQXV0aERhdGEsIGF1dGhEYXRhUmVzcG9uc2UgfSA9IGF3YWl0IEF1dGguaGFuZGxlQXV0aERhdGFWYWxpZGF0aW9uKFxuICAgICAgYXV0aERhdGEsXG4gICAgICB0aGlzLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgeyBpc0xvZ2luIH1cbiAgICApO1xuICAgIHRoaXMuYXV0aERhdGFSZXNwb25zZSA9IGF1dGhEYXRhUmVzcG9uc2U7XG4gICAgLy8gUmVwbGFjZSBjdXJyZW50IGF1dGhEYXRhIGJ5IHRoZSBuZXcgdmFsaWRhdGVkIG9uZVxuICAgIHRoaXMuZGF0YS5hdXRoRGF0YSA9IHZhbGlkYXRlZEF1dGhEYXRhO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFVzZXIgZm91bmQgd2l0aCBwcm92aWRlZCBhdXRoRGF0YVxuICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDEpIHtcbiAgICB0aGlzLnN0b3JhZ2UuYXV0aFByb3ZpZGVyID0gT2JqZWN0LmtleXMoYXV0aERhdGEpLmpvaW4oJywnKTtcblxuICAgIGNvbnN0IHsgaGFzTXV0YXRlZEF1dGhEYXRhLCBtdXRhdGVkQXV0aERhdGEgfSA9IEF1dGguaGFzTXV0YXRlZEF1dGhEYXRhKFxuICAgICAgYXV0aERhdGEsXG4gICAgICB1c2VyUmVzdWx0LmF1dGhEYXRhXG4gICAgKTtcblxuICAgIGNvbnN0IGlzQ3VycmVudFVzZXJMb2dnZWRPck1hc3RlciA9XG4gICAgICAodGhpcy5hdXRoICYmIHRoaXMuYXV0aC51c2VyICYmIHRoaXMuYXV0aC51c2VyLmlkID09PSB1c2VyUmVzdWx0Lm9iamVjdElkKSB8fFxuICAgICAgdGhpcy5hdXRoLmlzTWFzdGVyO1xuXG4gICAgaWYgKGlzTG9naW4gfHwgaXNDdXJyZW50VXNlckxvZ2dlZE9yTWFzdGVyKSB7XG4gICAgICAvLyBubyB1c2VyIG1ha2luZyB0aGUgY2FsbFxuICAgICAgLy8gT1IgdGhlIHVzZXIgbWFraW5nIHRoZSBjYWxsIGlzIHRoZSByaWdodCBvbmVcbiAgICAgIC8vIExvZ2luIHdpdGggYXV0aCBkYXRhXG4gICAgICBkZWxldGUgcmVzdWx0c1swXS5wYXNzd29yZDtcblxuICAgICAgLy8gbmVlZCB0byBzZXQgdGhlIG9iamVjdElkIGZpcnN0IG90aGVyd2lzZSBsb2NhdGlvbiBoYXMgdHJhaWxpbmcgdW5kZWZpbmVkXG4gICAgICB0aGlzLmRhdGEub2JqZWN0SWQgPSB1c2VyUmVzdWx0Lm9iamVjdElkO1xuXG4gICAgICBpZiAoIXRoaXMucXVlcnkgfHwgIXRoaXMucXVlcnkub2JqZWN0SWQpIHtcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHtcbiAgICAgICAgICByZXNwb25zZTogdXNlclJlc3VsdCxcbiAgICAgICAgICBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbigpLFxuICAgICAgICB9O1xuICAgICAgICAvLyBSdW4gYmVmb3JlTG9naW4gaG9vayBiZWZvcmUgc3RvcmluZyBhbnkgdXBkYXRlc1xuICAgICAgICAvLyB0byBhdXRoRGF0YSBvbiB0aGUgZGI7IGNoYW5nZXMgdG8gdXNlclJlc3VsdFxuICAgICAgICAvLyB3aWxsIGJlIGlnbm9yZWQuXG4gICAgICAgIGF3YWl0IHRoaXMucnVuQmVmb3JlTG9naW5UcmlnZ2VyKHN0cnVjdHVyZWRDbG9uZSh1c2VyUmVzdWx0KSk7XG5cbiAgICAgICAgLy8gSWYgd2UgYXJlIGluIGxvZ2luIG9wZXJhdGlvbiB2aWEgYXV0aERhdGFcbiAgICAgICAgLy8gd2UgbmVlZCB0byBiZSBzdXJlIHRoYXQgdGhlIHVzZXIgaGFzIHByb3ZpZGVkXG4gICAgICAgIC8vIHJlcXVpcmVkIGF1dGhEYXRhXG4gICAgICAgIEF1dGguY2hlY2tJZlVzZXJIYXNQcm92aWRlZENvbmZpZ3VyZWRQcm92aWRlcnNGb3JMb2dpbihcbiAgICAgICAgICB7IGNvbmZpZzogdGhpcy5jb25maWcsIGF1dGg6IHRoaXMuYXV0aCB9LFxuICAgICAgICAgIGF1dGhEYXRhLFxuICAgICAgICAgIHVzZXJSZXN1bHQuYXV0aERhdGEsXG4gICAgICAgICAgdGhpcy5jb25maWdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJldmVudCB2YWxpZGF0aW5nIGlmIG5vIG11dGF0ZWQgZGF0YSBkZXRlY3RlZCBvbiB1cGRhdGVcbiAgICAgIGlmICghaXNMb2dpbiAmJiAhaGFzTXV0YXRlZEF1dGhEYXRhICYmIGlzQ3VycmVudFVzZXJMb2dnZWRPck1hc3Rlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEFsd2F5cyB2YWxpZGF0ZSBhbGwgcHJvdmlkZWQgYXV0aERhdGEgb24gbG9naW4gdG8gcHJldmVudCBhdXRoZW50aWNhdGlvblxuICAgICAgLy8gYnlwYXNzIHZpYSBwYXJ0aWFsIGF1dGhEYXRhIChlLmcuIHNlbmRpbmcgb25seSB0aGUgcHJvdmlkZXIgSUQgd2l0aG91dFxuICAgICAgLy8gYW4gYWNjZXNzIHRva2VuKTsgb24gdXBkYXRlIG9ubHkgdmFsaWRhdGUgbXV0YXRlZCBvbmVzXG4gICAgICBpZiAoaXNMb2dpbiB8fCBoYXNNdXRhdGVkQXV0aERhdGEgfHwgIXRoaXMuY29uZmlnLmFsbG93RXhwaXJlZEF1dGhEYXRhVG9rZW4pIHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgQXV0aC5oYW5kbGVBdXRoRGF0YVZhbGlkYXRpb24oXG4gICAgICAgICAgaXNMb2dpbiA/IGF1dGhEYXRhIDogbXV0YXRlZEF1dGhEYXRhLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgdXNlclJlc3VsdCxcbiAgICAgICAgICB7IGlzTG9naW4gfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRhdGEuYXV0aERhdGEgPSByZXMuYXV0aERhdGE7XG4gICAgICAgIHRoaXMuYXV0aERhdGFSZXNwb25zZSA9IHJlcy5hdXRoRGF0YVJlc3BvbnNlO1xuICAgICAgfVxuXG4gICAgICAvLyBDYXB0dXJlIG9yaWdpbmFsIGF1dGhEYXRhIGJlZm9yZSBtdXRhdGluZyB1c2VyUmVzdWx0IHZpYSB0aGUgcmVzcG9uc2UgcmVmZXJlbmNlXG4gICAgICBjb25zdCBvcmlnaW5hbEF1dGhEYXRhID0gdXNlclJlc3VsdD8uYXV0aERhdGFcbiAgICAgICAgPyBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXModXNlclJlc3VsdC5hdXRoRGF0YSkubWFwKChbaywgdl0pID0+XG4gICAgICAgICAgICBbaywgdiAmJiB0eXBlb2YgdiA9PT0gJ29iamVjdCcgPyB7IC4uLnYgfSA6IHZdXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyBJRiB3ZSBhcmUgaW4gbG9naW4gd2UnbGwgc2tpcCB0aGUgZGF0YWJhc2Ugb3BlcmF0aW9uIC8gYmVmb3JlU2F2ZSAvIGFmdGVyU2F2ZSBldGMuLi5cbiAgICAgIC8vIHdlIG5lZWQgdG8gc2V0IGl0IHVwIHRoZXJlLlxuICAgICAgLy8gV2UgYXJlIHN1cHBvc2VkIHRvIGhhdmUgYSByZXNwb25zZSBvbmx5IG9uIExPR0lOIHdpdGggYXV0aERhdGEsIHNvIHdlIHNraXAgdGhvc2VcbiAgICAgIC8vIElmIHdlJ3JlIG5vdCBsb2dnaW5nIGluLCBidXQganVzdCB1cGRhdGluZyB0aGUgY3VycmVudCB1c2VyLCB3ZSBjYW4gc2FmZWx5IHNraXAgdGhhdCBwYXJ0XG4gICAgICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgICAgICAvLyBBc3NpZ24gdGhlIG5ldyBhdXRoRGF0YSBpbiB0aGUgcmVzcG9uc2VcbiAgICAgICAgT2JqZWN0LmtleXMobXV0YXRlZEF1dGhEYXRhKS5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICAgICAgICB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlLmF1dGhEYXRhW3Byb3ZpZGVyXSA9IG11dGF0ZWRBdXRoRGF0YVtwcm92aWRlcl07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJ1biB0aGUgREIgdXBkYXRlIGRpcmVjdGx5LCBhcyAnbWFzdGVyJyBvbmx5IGlmIGF1dGhEYXRhIGNvbnRhaW5zIHNvbWUga2V5c1xuICAgICAgICAvLyBhdXRoRGF0YSBjb3VsZCBub3QgY29udGFpbnMga2V5cyBhZnRlciB2YWxpZGF0aW9uIGlmIHRoZSBhdXRoQWRhcHRlclxuICAgICAgICAvLyB1c2VzIHRoZSBgZG9Ob3RTYXZlYCBvcHRpb24uIEp1c3QgdXBkYXRlIHRoZSBhdXRoRGF0YSBwYXJ0XG4gICAgICAgIC8vIFRoZW4gd2UncmUgZ29vZCBmb3IgdGhlIHVzZXIsIGVhcmx5IGV4aXQgb2Ygc29ydHNcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZGF0YS5hdXRoRGF0YSkubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgcXVlcnkgPSB7IG9iamVjdElkOiB0aGlzLmRhdGEub2JqZWN0SWQgfTtcbiAgICAgICAgICAvLyBPcHRpbWlzdGljIGxvY2tpbmc6IGluY2x1ZGUgZWFjaCBjaGFuZ2VkIG9yaWdpbmFsIGZpZWxkIGluIHRoZSBXSEVSRSBjbGF1c2VcbiAgICAgICAgICAvLyBmb3IgcHJvdmlkZXJzIHdob3NlIGRhdGEgaXMgYmVpbmcgdXBkYXRlZC4gVGhpcyBwcmV2ZW50cyBjb25jdXJyZW50IHJlcXVlc3RzXG4gICAgICAgICAgLy8gZnJvbSBib3RoIHN1Y2NlZWRpbmcgd2hlbiBjb25zdW1pbmcgc2luZ2xlLXVzZSB0b2tlbnMgKGUuZy4gTUZBIHJlY292ZXJ5IGNvZGVzXG4gICAgICAgICAgLy8gYXMgYXJyYXlzLCBvciBNRkEgU01TIE9UUCB0b2tlbnMgYXMgc3RyaW5ncykuXG4gICAgICAgICAgYXBwbHlBdXRoRGF0YU9wdGltaXN0aWNMb2NrKHF1ZXJ5LCBvcmlnaW5hbEF1dGhEYXRhLCB0aGlzLmRhdGEuYXV0aERhdGEpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZy5kYXRhYmFzZS51cGRhdGUoXG4gICAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICAgICAgeyBhdXRoRGF0YTogdGhpcy5kYXRhLmF1dGhEYXRhIH0sXG4gICAgICAgICAgICAgIHt9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuU0NSSVBUX0ZBSUxFRCwgJ0ludmFsaWQgYXV0aCBkYXRhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl90aHJvd0lmQXV0aERhdGFEdXBsaWNhdGUoZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5kYXRhLmF1dGhEYXRhICYmIE9iamVjdC5rZXlzKHRoaXMuZGF0YS5hdXRoRGF0YSkubGVuZ3RoKSB7XG4gICAgICAgIC8vIFVQREFURSBwYXRoIChlLmcuIFBVVCAvdXNlcnMvOmlkIGR1cmluZyBsaW5rZWQtcHJvdmlkZXIgcmUtYXV0aCk6IGFwcGx5XG4gICAgICAgIC8vIHRoZSBzYW1lIG9wdGltaXN0aWMgbG9jayB0byB0aGUgc3Vic2VxdWVudCBydW5EYXRhYmFzZU9wZXJhdGlvbiB1cGRhdGUgc29cbiAgICAgICAgLy8gY29uY3VycmVudCBzaW5nbGUtdXNlIHRva2VuIGNvbnN1bWVycyBjYW5ub3QgYm90aCBzdWNjZWVkLlxuICAgICAgICBhcHBseUF1dGhEYXRhT3B0aW1pc3RpY0xvY2sodGhpcy5xdWVyeSwgb3JpZ2luYWxBdXRoRGF0YSwgdGhpcy5kYXRhLmF1dGhEYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8vIFJlamVjdHMgaW50ZXJuYWwgZmllbGRzIGluIGNsaWVudC1zdXBwbGllZCBkYXRhXG5SZXN0V3JpdGUucHJvdG90eXBlLmNoZWNrSW50ZXJuYWxGaWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmF1dGguaXNNYXN0ZXIgfHwgdGhpcy5hdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChjb25zdCBmaWVsZE5hbWUgaW4gdGhpcy5kYXRhKSB7XG4gICAgaWYgKGZpZWxkTmFtZS5jaGFyQXQoMCkgPT09ICdfJykge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsIGBJbnZhbGlkIGZpZWxkIG5hbWU6ICR7ZmllbGROYW1lfS5gKTtcbiAgICB9XG4gIH1cbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuY2hlY2tSZXN0cmljdGVkRmllbGRzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbGFzc05hbWUgIT09ICdfVXNlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXRoaXMuYXV0aC5pc01haW50ZW5hbmNlICYmICF0aGlzLmF1dGguaXNNYXN0ZXIgJiYgJ2VtYWlsVmVyaWZpZWQnIGluIHRoaXMuZGF0YSkge1xuICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT1BFUkFUSU9OX0ZPUkJJRERFTixcbiAgICAgIFwiQ2xpZW50cyBhcmVuJ3QgYWxsb3dlZCB0byBtYW51YWxseSB1cGRhdGUgZW1haWwgdmVyaWZpY2F0aW9uLlwiLFxuICAgICAgdGhpcy5jb25maWdcbiAgICApO1xuICB9XG59O1xuXG4vLyBWYWxpZGF0ZXMgdGhlIGNyZWF0ZSBvciB1cGRhdGUgY2xhc3MtbGV2ZWwgcGVybWlzc2lvbiBiZWZvcmUgc2NoZW1hIHZhbGlkYXRpb25cblJlc3RXcml0ZS5wcm90b3R5cGUudmFsaWRhdGVXcml0ZVBlcm1pc3Npb24gPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmF1dGguaXNNYXN0ZXIgfHwgdGhpcy5hdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc2NoZW1hQ29udHJvbGxlciA9IGF3YWl0IHRoaXMuY29uZmlnLmRhdGFiYXNlLmxvYWRTY2hlbWEoKTtcbiAgYXdhaXQgc2NoZW1hQ29udHJvbGxlci52YWxpZGF0ZVBlcm1pc3Npb24oXG4gICAgdGhpcy5jbGFzc05hbWUsXG4gICAgdGhpcy5ydW5PcHRpb25zLmFjbCB8fCBbXSxcbiAgICB0aGlzLnF1ZXJ5ID8gJ3VwZGF0ZScgOiAnY3JlYXRlJ1xuICApO1xufTtcblxuLy8gQXV0aG9yaXplIGEgX1VzZXIgdXBkYXRlIGJlZm9yZSBhbnkgc3RlcCByZWFkcyB0aGUgdGFyZ2V0IGFjY291bnRcblJlc3RXcml0ZS5wcm90b3R5cGUuYXV0aG9yaXplVXNlclVwZGF0ZSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9PSAnX1VzZXInIHx8ICF0aGlzLnF1ZXJ5KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0aGlzLmF1dGguaXNNYXN0ZXIgfHwgdGhpcy5hdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHRoaXMuYXV0aC5pc1VuYXV0aGVudGljYXRlZCgpKSB7XG4gICAgdGhyb3cgY3JlYXRlU2FuaXRpemVkRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5TRVNTSU9OX01JU1NJTkcsXG4gICAgICBgQ2Fubm90IG1vZGlmeSB1c2VyICR7dGhpcy5xdWVyeS5vYmplY3RJZH0uYCxcbiAgICAgIHRoaXMuY29uZmlnXG4gICAgKTtcbiAgfVxuICAvLyBCb2R5IG9iamVjdElkIG11c3Qgbm90IHJldGFyZ2V0IHRoZSB1cGRhdGVcbiAgaWYgKHRoaXMuZGF0YS5vYmplY3RJZCAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZGF0YS5vYmplY3RJZCAhPT0gdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnT2JqZWN0IG5vdCBmb3VuZC4nKTtcbiAgfVxuICAvLyBPd25lciB1cGRhdGUgcmVhZHMgb25seSBvd24gZGF0YTsgdGhlIHdyaXRlIHN0YXlzIEFDTC1jaGVja2VkXG4gIGlmICh0aGlzLmF1dGgudXNlci5pZCA9PT0gdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBXcml0ZSBhY2Nlc3MgY2hlY2sgdmlhIHRoZSB3cml0ZS1wYXRoIEFDTCBlbmZvcmNlbWVudFxuICBhd2FpdCB0aGlzLmNvbmZpZy5kYXRhYmFzZS51cGRhdGUoXG4gICAgdGhpcy5jbGFzc05hbWUsXG4gICAgeyBvYmplY3RJZDogdGhpcy5xdWVyeS5vYmplY3RJZCB9LFxuICAgIHt9LFxuICAgIHRoaXMucnVuT3B0aW9ucyxcbiAgICBmYWxzZSxcbiAgICB0cnVlXG4gICk7XG59O1xuXG4vLyBUaGUgbm9uLXRoaXJkLXBhcnR5IHBhcnRzIG9mIFVzZXIgdHJhbnNmb3JtYXRpb25cblJlc3RXcml0ZS5wcm90b3R5cGUudHJhbnNmb3JtVXNlciA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9PSAnX1VzZXInKSB7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICAvLyBEbyBub3QgY2xlYW51cCBzZXNzaW9uIGlmIG9iamVjdElkIGlzIG5vdCBzZXRcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5vYmplY3RJZCgpKSB7XG4gICAgLy8gSWYgd2UncmUgdXBkYXRpbmcgYSBfVXNlciBvYmplY3QsIHdlIG5lZWQgdG8gY2xlYXIgb3V0IHRoZSBjYWNoZSBmb3IgdGhhdCB1c2VyLiBGaW5kIGFsbCB0aGVpclxuICAgIC8vIHNlc3Npb24gdG9rZW5zLCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgY2FjaGUuXG4gICAgY29uc3QgcXVlcnkgPSBhd2FpdCBSZXN0UXVlcnkoe1xuICAgICAgbWV0aG9kOiBSZXN0UXVlcnkuTWV0aG9kLmZpbmQsXG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgYXV0aDogQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpLFxuICAgICAgY2xhc3NOYW1lOiAnX1Nlc3Npb24nLFxuICAgICAgcnVuQmVmb3JlRmluZDogZmFsc2UsXG4gICAgICByZXN0V2hlcmU6IHtcbiAgICAgICAgdXNlcjoge1xuICAgICAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgICAgICBvYmplY3RJZDogdGhpcy5vYmplY3RJZCgpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBwcm9taXNlID0gcXVlcnkuZXhlY3V0ZSgpLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICByZXN1bHRzLnJlc3VsdHMuZm9yRWFjaChzZXNzaW9uID0+XG4gICAgICAgIHRoaXMuY29uZmlnLmNhY2hlQ29udHJvbGxlci51c2VyLmRlbChzZXNzaW9uLnNlc3Npb25Ub2tlbilcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHJvbWlzZVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIC8vIFRyYW5zZm9ybSB0aGUgcGFzc3dvcmRcbiAgICAgIGlmICh0aGlzLmRhdGEucGFzc3dvcmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBpZ25vcmUgb25seSBpZiB1bmRlZmluZWQuIHNob3VsZCBwcm9jZWVkIGlmIGVtcHR5ICgnJylcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5xdWVyeSkge1xuICAgICAgICB0aGlzLnN0b3JhZ2VbJ2NsZWFyU2Vzc2lvbnMnXSA9IHRydWU7XG4gICAgICAgIC8vIEdlbmVyYXRlIGEgbmV3IHNlc3Npb24gb25seSBpZiB0aGUgdXNlciByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKCF0aGlzLmF1dGguaXNNYXN0ZXIgJiYgIXRoaXMuYXV0aC5pc01haW50ZW5hbmNlKSB7XG4gICAgICAgICAgdGhpcy5zdG9yYWdlWydnZW5lcmF0ZU5ld1Nlc3Npb24nXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlUGFzc3dvcmRQb2xpY3koKS50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHBhc3N3b3JkQ3J5cHRvLmhhc2godGhpcy5kYXRhLnBhc3N3b3JkKS50aGVuKGhhc2hlZFBhc3N3b3JkID0+IHtcbiAgICAgICAgICB0aGlzLmRhdGEuX2hhc2hlZF9wYXNzd29yZCA9IGhhc2hlZFBhc3N3b3JkO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmRhdGEucGFzc3dvcmQ7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVVc2VyTmFtZSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlRW1haWwoKTtcbiAgICB9KTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuX3ZhbGlkYXRlVXNlck5hbWUgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIENoZWNrIGZvciB1c2VybmFtZSB1bmlxdWVuZXNzXG4gIGlmICghdGhpcy5kYXRhLnVzZXJuYW1lKSB7XG4gICAgaWYgKCF0aGlzLnF1ZXJ5KSB7XG4gICAgICB0aGlzLmRhdGEudXNlcm5hbWUgPSBjcnlwdG9VdGlscy5yYW5kb21TdHJpbmcoMjUpO1xuICAgICAgdGhpcy5yZXNwb25zZVNob3VsZEhhdmVVc2VybmFtZSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICAvKlxuICAgIFVzZXJuYW1lcyBzaG91bGQgYmUgdW5pcXVlIHdoZW4gY29tcGFyZWQgY2FzZSBpbnNlbnNpdGl2ZWx5XG5cbiAgICBVc2VycyBzaG91bGQgYmUgYWJsZSB0byBtYWtlIGNhc2Ugc2Vuc2l0aXZlIHVzZXJuYW1lcyBhbmRcbiAgICBsb2dpbiB1c2luZyB0aGUgY2FzZSB0aGV5IGVudGVyZWQuICBJLmUuICdTbm9vcHknIHNob3VsZCBwcmVjbHVkZVxuICAgICdzbm9vcHknIGFzIGEgdmFsaWQgdXNlcm5hbWUuXG4gICovXG4gIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgIC5maW5kKFxuICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICB7XG4gICAgICAgIHVzZXJuYW1lOiB0aGlzLmRhdGEudXNlcm5hbWUsXG4gICAgICAgIG9iamVjdElkOiB7ICRuZTogdGhpcy5vYmplY3RJZCgpIH0sXG4gICAgICB9LFxuICAgICAgeyBsaW1pdDogMSwgY2FzZUluc2Vuc2l0aXZlOiB0cnVlIH0sXG4gICAgICB7fSxcbiAgICAgIHRoaXMudmFsaWRTY2hlbWFDb250cm9sbGVyXG4gICAgKVxuICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgUGFyc2UuRXJyb3IuVVNFUk5BTUVfVEFLRU4sXG4gICAgICAgICAgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgdXNlcm5hbWUuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xufTtcblxuUmVzdFdyaXRlLmJ1aWxkQ3JlYXRlZFdpdGggPSBmdW5jdGlvbiAoYWN0aW9uLCBhdXRoUHJvdmlkZXIpIHtcbiAgcmV0dXJuIHsgYWN0aW9uLCBhdXRoUHJvdmlkZXI6IGF1dGhQcm92aWRlciB8fCAncGFzc3dvcmQnIH07XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmdldENyZWF0ZWRXaXRoID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5zdG9yYWdlLmNyZWF0ZWRXaXRoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5jcmVhdGVkV2l0aDtcbiAgfVxuICBjb25zdCBpc0NyZWF0ZU9wZXJhdGlvbiA9ICF0aGlzLnF1ZXJ5O1xuICBjb25zdCBhdXRoRGF0YVByb3ZpZGVyID1cbiAgICB0aGlzLmRhdGE/LmF1dGhEYXRhICYmXG4gICAgT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5sZW5ndGggJiZcbiAgICBPYmplY3Qua2V5cyh0aGlzLmRhdGEuYXV0aERhdGEpLmpvaW4oJywnKTtcbiAgY29uc3QgYXV0aFByb3ZpZGVyID0gdGhpcy5zdG9yYWdlLmF1dGhQcm92aWRlciB8fCBhdXRoRGF0YVByb3ZpZGVyO1xuICAvLyBzdG9yYWdlLmF1dGhQcm92aWRlciBpcyBvbmx5IHNldCBmb3IgbG9naW4gKGV4aXN0aW5nIHVzZXIgZm91bmQgaW4gaGFuZGxlQXV0aERhdGEpXG4gIGNvbnN0IGFjdGlvbiA9IHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgPyAnbG9naW4nIDogaXNDcmVhdGVPcGVyYXRpb24gPyAnc2lnbnVwJyA6IHVuZGVmaW5lZDtcbiAgaWYgKCFhY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcmVzb2x2ZWRBdXRoUHJvdmlkZXIgPSBhdXRoUHJvdmlkZXIgfHwgKGFjdGlvbiA9PT0gJ3NpZ251cCcgPyAncGFzc3dvcmQnIDogdW5kZWZpbmVkKTtcbiAgdGhpcy5zdG9yYWdlLmNyZWF0ZWRXaXRoID0gUmVzdFdyaXRlLmJ1aWxkQ3JlYXRlZFdpdGgoYWN0aW9uLCByZXNvbHZlZEF1dGhQcm92aWRlcik7XG4gIHJldHVybiB0aGlzLnN0b3JhZ2UuY3JlYXRlZFdpdGg7XG59O1xuXG4vKlxuICBBcyB3aXRoIHVzZXJuYW1lcywgUGFyc2Ugc2hvdWxkIG5vdCBhbGxvdyBjYXNlIGluc2Vuc2l0aXZlIGNvbGxpc2lvbnMgb2YgZW1haWwuXG4gIHVubGlrZSB3aXRoIHVzZXJuYW1lcyAod2hpY2ggY2FuIGhhdmUgY2FzZSBpbnNlbnNpdGl2ZSBjb2xsaXNpb25zIGluIHRoZSBjYXNlIG9mXG4gIGF1dGggYWRhcHRlcnMpLCBlbWFpbHMgc2hvdWxkIG5ldmVyIGhhdmUgYSBjYXNlIGluc2Vuc2l0aXZlIGNvbGxpc2lvbi5cblxuICBUaGlzIGJlaGF2aW9yIGNhbiBiZSBlbmZvcmNlZCB0aHJvdWdoIGEgcHJvcGVybHkgY29uZmlndXJlZCBpbmRleCBzZWU6XG4gIGh0dHBzOi8vZG9jcy5tb25nb2RiLmNvbS9tYW51YWwvY29yZS9pbmRleC1jYXNlLWluc2Vuc2l0aXZlLyNjcmVhdGUtYS1jYXNlLWluc2Vuc2l0aXZlLWluZGV4XG4gIHdoaWNoIGNvdWxkIGJlIGltcGxlbWVudGVkIGluc3RlYWQgb2YgdGhpcyBjb2RlIGJhc2VkIHZhbGlkYXRpb24uXG5cbiAgR2l2ZW4gdGhhdCB0aGlzIGxvb2t1cCBzaG91bGQgYmUgYSByZWxhdGl2ZWx5IGxvdyB1c2UgY2FzZSBhbmQgdGhhdCB0aGUgY2FzZSBzZW5zaXRpdmVcbiAgdW5pcXVlIGluZGV4IHdpbGwgYmUgdXNlZCBieSB0aGUgZGIgZm9yIHRoZSBxdWVyeSwgdGhpcyBpcyBhbiBhZGVxdWF0ZSBzb2x1dGlvbi5cbiovXG5SZXN0V3JpdGUucHJvdG90eXBlLl92YWxpZGF0ZUVtYWlsID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuZGF0YS5lbWFpbCB8fCB0aGlzLmRhdGEuZW1haWwuX19vcCA9PT0gJ0RlbGV0ZScpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgLy8gVmFsaWRhdGUgYmFzaWMgZW1haWwgYWRkcmVzcyBmb3JtYXRcbiAgaWYgKCF0aGlzLmRhdGEuZW1haWwubWF0Y2goL14uK0AuKyQvKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0VNQUlMX0FERFJFU1MsICdFbWFpbCBhZGRyZXNzIGZvcm1hdCBpcyBpbnZhbGlkLicpXG4gICAgKTtcbiAgfVxuICAvLyBDYXNlIGluc2Vuc2l0aXZlIG1hdGNoLCBzZWUgbm90ZSBhYm92ZSBmdW5jdGlvbi5cbiAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgLmZpbmQoXG4gICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIHtcbiAgICAgICAgZW1haWw6IHRoaXMuZGF0YS5lbWFpbCxcbiAgICAgICAgb2JqZWN0SWQ6IHsgJG5lOiB0aGlzLm9iamVjdElkKCkgfSxcbiAgICAgIH0sXG4gICAgICB7IGxpbWl0OiAxLCBjYXNlSW5zZW5zaXRpdmU6IHRydWUgfSxcbiAgICAgIHt9LFxuICAgICAgdGhpcy52YWxpZFNjaGVtYUNvbnRyb2xsZXJcbiAgICApXG4gICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICBQYXJzZS5FcnJvci5FTUFJTF9UQUtFTixcbiAgICAgICAgICAnQWNjb3VudCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBlbWFpbCBhZGRyZXNzLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuZGF0YS5hdXRoRGF0YSB8fFxuICAgICAgICAhT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKS5sZW5ndGggfHxcbiAgICAgICAgKE9iamVjdC5rZXlzKHRoaXMuZGF0YS5hdXRoRGF0YSkubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgT2JqZWN0LmtleXModGhpcy5kYXRhLmF1dGhEYXRhKVswXSA9PT0gJ2Fub255bW91cycpXG4gICAgICApIHtcbiAgICAgICAgLy8gV2UgdXBkYXRlZCB0aGUgZW1haWwsIHNlbmQgYSBuZXcgdmFsaWRhdGlvblxuICAgICAgICBjb25zdCB7IG9yaWdpbmFsT2JqZWN0LCB1cGRhdGVkT2JqZWN0IH0gPSB0aGlzLmJ1aWxkUGFyc2VPYmplY3RzKCk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgb3JpZ2luYWw6IG9yaWdpbmFsT2JqZWN0LFxuICAgICAgICAgIG9iamVjdDogdXBkYXRlZE9iamVjdCxcbiAgICAgICAgICBtYXN0ZXI6IHRoaXMuYXV0aC5pc01hc3RlcixcbiAgICAgICAgICBpcDogdGhpcy5jb25maWcuaXAsXG4gICAgICAgICAgaW5zdGFsbGF0aW9uSWQ6IHRoaXMuYXV0aC5pbnN0YWxsYXRpb25JZCxcbiAgICAgICAgICBjcmVhdGVkV2l0aDogdGhpcy5nZXRDcmVhdGVkV2l0aCgpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcudXNlckNvbnRyb2xsZXIuc2V0RW1haWxWZXJpZnlUb2tlbih0aGlzLmRhdGEsIHJlcXVlc3QsIHRoaXMuc3RvcmFnZSk7XG4gICAgICB9XG4gICAgfSk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLl92YWxpZGF0ZVBhc3N3b3JkUG9saWN5ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsgfVxuICByZXR1cm4gdGhpcy5fdmFsaWRhdGVQYXNzd29yZFJlcXVpcmVtZW50cygpLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZVBhc3N3b3JkSGlzdG9yeSgpO1xuICB9KTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuX3ZhbGlkYXRlUGFzc3dvcmRSZXF1aXJlbWVudHMgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIGNoZWNrIGlmIHRoZSBwYXNzd29yZCBjb25mb3JtcyB0byB0aGUgZGVmaW5lZCBwYXNzd29yZCBwb2xpY3kgaWYgY29uZmlndXJlZFxuICAvLyBJZiB3ZSBzcGVjaWZpZWQgYSBjdXN0b20gZXJyb3IgaW4gb3VyIGNvbmZpZ3VyYXRpb24gdXNlIGl0LlxuICAvLyBFeGFtcGxlOiBcIlBhc3N3b3JkcyBtdXN0IGluY2x1ZGUgYSBDYXBpdGFsIExldHRlciwgTG93ZXJjYXNlIExldHRlciwgYW5kIGEgbnVtYmVyLlwiXG4gIC8vXG4gIC8vIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgb24gdGhlIGdlbmVyaWMgXCJwYXNzd29yZCByZXNldFwiIHBhZ2UsXG4gIC8vIGFzIGl0IGFsbG93cyB0aGUgcHJvZ3JhbW1lciB0byBjb21tdW5pY2F0ZSBzcGVjaWZpYyByZXF1aXJlbWVudHMgaW5zdGVhZCBvZjpcbiAgLy8gYS4gbWFraW5nIHRoZSB1c2VyIGd1ZXNzIHdoYXRzIHdyb25nXG4gIC8vIGIuIG1ha2luZyBhIGN1c3RvbSBwYXNzd29yZCByZXNldCBwYWdlIHRoYXQgc2hvd3MgdGhlIHJlcXVpcmVtZW50c1xuICBjb25zdCBwb2xpY3lFcnJvciA9IHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnZhbGlkYXRpb25FcnJvclxuICAgID8gdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kudmFsaWRhdGlvbkVycm9yXG4gICAgOiAnUGFzc3dvcmQgZG9lcyBub3QgbWVldCB0aGUgUGFzc3dvcmQgUG9saWN5IHJlcXVpcmVtZW50cy4nO1xuICBjb25zdCBjb250YWluc1VzZXJuYW1lRXJyb3IgPSAnUGFzc3dvcmQgY2Fubm90IGNvbnRhaW4geW91ciB1c2VybmFtZS4nO1xuXG4gIC8vIGNoZWNrIHdoZXRoZXIgdGhlIHBhc3N3b3JkIG1lZXRzIHRoZSBwYXNzd29yZCBzdHJlbmd0aCByZXF1aXJlbWVudHNcbiAgaWYgKFxuICAgICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5wYXR0ZXJuVmFsaWRhdG9yICYmXG4gICAgICAhdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kucGF0dGVyblZhbGlkYXRvcih0aGlzLmRhdGEucGFzc3dvcmQpKSB8fFxuICAgICh0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS52YWxpZGF0b3JDYWxsYmFjayAmJlxuICAgICAgIXRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnZhbGlkYXRvckNhbGxiYWNrKHRoaXMuZGF0YS5wYXNzd29yZCkpXG4gICkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVkFMSURBVElPTl9FUlJPUiwgcG9saWN5RXJyb3IpKTtcbiAgfVxuXG4gIC8vIGNoZWNrIHdoZXRoZXIgcGFzc3dvcmQgY29udGFpbiB1c2VybmFtZVxuICBpZiAodGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kuZG9Ob3RBbGxvd1VzZXJuYW1lID09PSB0cnVlKSB7XG4gICAgaWYgKHRoaXMuZGF0YS51c2VybmFtZSkge1xuICAgICAgLy8gdXNlcm5hbWUgaXMgbm90IHBhc3NlZCBkdXJpbmcgcGFzc3dvcmQgcmVzZXRcbiAgICAgIGlmICh0aGlzLmRhdGEucGFzc3dvcmQuaW5kZXhPZih0aGlzLmRhdGEudXNlcm5hbWUpID49IDApXG4gICAgICB7IHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuVkFMSURBVElPTl9FUlJPUiwgY29udGFpbnNVc2VybmFtZUVycm9yKSk7IH1cbiAgICB9IGVsc2UgaWYgKHRoaXMucXVlcnkpIHtcbiAgICAgIC8vIHJldHJpZXZlIHRoZSBVc2VyIG9iamVjdCB1c2luZyB0aGUgVVJMIG9iamVjdCBJRCBkdXJpbmcgcGFzc3dvcmQgcmVzZXRcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS5maW5kKCdfVXNlcicsIHsgb2JqZWN0SWQ6IHRoaXMucXVlcnkub2JqZWN0SWQgfSkudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ09iamVjdCBub3QgZm91bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YS5wYXNzd29yZC5pbmRleE9mKHJlc3VsdHNbMF0udXNlcm5hbWUpID49IDApXG4gICAgICAgIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICAgIG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLCBjb250YWluc1VzZXJuYW1lRXJyb3IpXG4gICAgICAgICk7IH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUuX3ZhbGlkYXRlUGFzc3dvcmRIaXN0b3J5ID0gZnVuY3Rpb24gKCkge1xuICAvLyBjaGVjayB3aGV0aGVyIHBhc3N3b3JkIGlzIHJlcGVhdGluZyBmcm9tIHNwZWNpZmllZCBoaXN0b3J5XG4gIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeSkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmZpbmQoXG4gICAgICAgICdfVXNlcicsXG4gICAgICAgIHsgb2JqZWN0SWQ6IHRoaXMucXVlcnkub2JqZWN0SWQgfSxcbiAgICAgICAgeyBrZXlzOiBbJ19wYXNzd29yZF9oaXN0b3J5JywgJ19oYXNoZWRfcGFzc3dvcmQnXSB9LFxuICAgICAgICBBdXRoLm1haW50ZW5hbmNlKHRoaXMuY29uZmlnKVxuICAgICAgKVxuICAgICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVzZXIgPSByZXN1bHRzWzBdO1xuICAgICAgICBsZXQgb2xkUGFzc3dvcmRzID0gW107XG4gICAgICAgIGlmICh1c2VyLl9wYXNzd29yZF9oaXN0b3J5KVxuICAgICAgICB7IG9sZFBhc3N3b3JkcyA9IF8udGFrZShcbiAgICAgICAgICB1c2VyLl9wYXNzd29yZF9oaXN0b3J5LFxuICAgICAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeSAtIDFcbiAgICAgICAgKTsgfVxuICAgICAgICBvbGRQYXNzd29yZHMucHVzaCh1c2VyLnBhc3N3b3JkKTtcbiAgICAgICAgY29uc3QgbmV3UGFzc3dvcmQgPSB0aGlzLmRhdGEucGFzc3dvcmQ7XG4gICAgICAgIC8vIGNvbXBhcmUgdGhlIG5ldyBwYXNzd29yZCBoYXNoIHdpdGggYWxsIG9sZCBwYXNzd29yZCBoYXNoZXNcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBvbGRQYXNzd29yZHMubWFwKGZ1bmN0aW9uIChoYXNoKSB7XG4gICAgICAgICAgcmV0dXJuIHBhc3N3b3JkQ3J5cHRvLmNvbXBhcmUobmV3UGFzc3dvcmQsIGhhc2gpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAvLyByZWplY3QgaWYgdGhlcmUgaXMgYSBtYXRjaFxuICAgICAgICAgICAgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ1JFUEVBVF9QQVNTV09SRCcpOyB9XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB3YWl0IGZvciBhbGwgY29tcGFyaXNvbnMgdG8gY29tcGxldGVcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgaWYgKGVyciA9PT0gJ1JFUEVBVF9QQVNTV09SRCcpXG4gICAgICAgICAgICAvLyBhIG1hdGNoIHdhcyBmb3VuZFxuICAgICAgICAgICAgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgICAgIG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgICAgICBQYXJzZS5FcnJvci5WQUxJREFUSU9OX0VSUk9SLFxuICAgICAgICAgICAgICAgIGBOZXcgcGFzc3dvcmQgc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSBhcyBsYXN0ICR7dGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRIaXN0b3J5fSBwYXNzd29yZHMuYFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApOyB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmNyZWF0ZVNlc3Npb25Ub2tlbklmTmVlZGVkID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbGFzc05hbWUgIT09ICdfVXNlcicpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gRG9uJ3QgZ2VuZXJhdGUgc2Vzc2lvbiBmb3IgdXBkYXRpbmcgdXNlciAodGhpcy5xdWVyeSBpcyBzZXQpIHVubGVzcyBhdXRoRGF0YSBleGlzdHNcbiAgaWYgKHRoaXMucXVlcnkgJiYgIXRoaXMuZGF0YS5hdXRoRGF0YSkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBEb24ndCBnZW5lcmF0ZSBuZXcgc2Vzc2lvblRva2VuIGlmIGxpbmtpbmcgdmlhIHNlc3Npb25Ub2tlblxuICBpZiAodGhpcy5hdXRoLnVzZXIgJiYgdGhpcy5kYXRhLmF1dGhEYXRhKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIElmIHNpZ24tdXAgY2FsbFxuICBpZiAoIXRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIpIHtcbiAgICAvLyBDcmVhdGUgcmVxdWVzdCBvYmplY3QgZm9yIHZlcmlmaWNhdGlvbiBmdW5jdGlvbnNcbiAgICBjb25zdCB7IG9yaWdpbmFsT2JqZWN0LCB1cGRhdGVkT2JqZWN0IH0gPSB0aGlzLmJ1aWxkUGFyc2VPYmplY3RzKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIG9yaWdpbmFsOiBvcmlnaW5hbE9iamVjdCxcbiAgICAgIG9iamVjdDogdXBkYXRlZE9iamVjdCxcbiAgICAgIG1hc3RlcjogdGhpcy5hdXRoLmlzTWFzdGVyLFxuICAgICAgaXA6IHRoaXMuY29uZmlnLmlwLFxuICAgICAgaW5zdGFsbGF0aW9uSWQ6IHRoaXMuYXV0aC5pbnN0YWxsYXRpb25JZCxcbiAgICAgIGNyZWF0ZWRXaXRoOiB0aGlzLmdldENyZWF0ZWRXaXRoKCksXG4gICAgfTtcbiAgICAvLyBHZXQgdmVyaWZpY2F0aW9uIGNvbmRpdGlvbnMgd2hpY2ggY2FuIGJlIGJvb2xlYW5zIG9yIGZ1bmN0aW9uczsgdGhlIHB1cnBvc2Ugb2YgdGhpcyBhc3luYy9hd2FpdFxuICAgIC8vIHN0cnVjdHVyZSBpcyB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IGV4ZWN1dGluZyBzdWJzZXF1ZW50IGZ1bmN0aW9ucyBpZiBwcmV2aW91cyBvbmVzIGZhaWwgaW4gdGhlXG4gICAgLy8gY29uZGl0aW9uYWwgc3RhdGVtZW50IGJlbG93LCBhcyBhIGRldmVsb3BlciBtYXkgZGVjaWRlIHRvIGV4ZWN1dGUgZXhwZW5zaXZlIG9wZXJhdGlvbnMgaW4gdGhlbVxuICAgIGNvbnN0IHZlcmlmeVVzZXJFbWFpbHMgPSBhc3luYyAoKSA9PiB0aGlzLmNvbmZpZy52ZXJpZnlVc2VyRW1haWxzID09PSB0cnVlIHx8ICh0eXBlb2YgdGhpcy5jb25maWcudmVyaWZ5VXNlckVtYWlscyA9PT0gJ2Z1bmN0aW9uJyAmJiBhd2FpdCBQcm9taXNlLnJlc29sdmUodGhpcy5jb25maWcudmVyaWZ5VXNlckVtYWlscyhyZXF1ZXN0KSkgPT09IHRydWUpO1xuICAgIGNvbnN0IHByZXZlbnRMb2dpbldpdGhVbnZlcmlmaWVkRW1haWwgPSBhc3luYyAoKSA9PiB0aGlzLmNvbmZpZy5wcmV2ZW50TG9naW5XaXRoVW52ZXJpZmllZEVtYWlsID09PSB0cnVlIHx8ICh0eXBlb2YgdGhpcy5jb25maWcucHJldmVudExvZ2luV2l0aFVudmVyaWZpZWRFbWFpbCA9PT0gJ2Z1bmN0aW9uJyAmJiBhd2FpdCBQcm9taXNlLnJlc29sdmUodGhpcy5jb25maWcucHJldmVudExvZ2luV2l0aFVudmVyaWZpZWRFbWFpbChyZXF1ZXN0KSkgPT09IHRydWUpO1xuICAgIC8vIElmIHZlcmlmaWNhdGlvbiBpcyByZXF1aXJlZFxuICAgIGlmIChhd2FpdCB2ZXJpZnlVc2VyRW1haWxzKCkgJiYgYXdhaXQgcHJldmVudExvZ2luV2l0aFVudmVyaWZpZWRFbWFpbCgpKSB7XG4gICAgICB0aGlzLnN0b3JhZ2UucmVqZWN0U2lnbnVwID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuY3JlYXRlU2Vzc2lvblRva2VuKCk7XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmNyZWF0ZVNlc3Npb25Ub2tlbiA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgLy8gY2xvdWQgaW5zdGFsbGF0aW9uSWQgZnJvbSBDbG91ZCBDb2RlLFxuICAvLyBuZXZlciBjcmVhdGUgc2Vzc2lvbiB0b2tlbnMgZnJvbSB0aGVyZS5cbiAgaWYgKHRoaXMuYXV0aC5pbnN0YWxsYXRpb25JZCAmJiB0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWQgPT09ICdjbG91ZCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodGhpcy5zdG9yYWdlLmF1dGhQcm92aWRlciA9PSBudWxsICYmIHRoaXMuZGF0YS5hdXRoRGF0YSkge1xuICAgIHRoaXMuc3RvcmFnZS5hdXRoUHJvdmlkZXIgPSBPYmplY3Qua2V5cyh0aGlzLmRhdGEuYXV0aERhdGEpLmpvaW4oJywnKTtcbiAgICAvLyBJbnZhbGlkYXRlIGNhY2hlZCBjcmVhdGVkV2l0aCBzaW5jZSBhdXRoUHJvdmlkZXIgd2FzIGp1c3QgcmVzb2x2ZWRcbiAgICBkZWxldGUgdGhpcy5zdG9yYWdlLmNyZWF0ZWRXaXRoO1xuICB9XG5cbiAgY29uc3QgY3JlYXRlZFdpdGggPSB0aGlzLmdldENyZWF0ZWRXaXRoKCk7XG4gIGNvbnN0IHsgc2Vzc2lvbkRhdGEsIGNyZWF0ZVNlc3Npb24gfSA9IFJlc3RXcml0ZS5jcmVhdGVTZXNzaW9uKHRoaXMuY29uZmlnLCB7XG4gICAgdXNlcklkOiB0aGlzLm9iamVjdElkKCksXG4gICAgY3JlYXRlZFdpdGgsXG4gICAgaW5zdGFsbGF0aW9uSWQ6IHRoaXMuYXV0aC5pbnN0YWxsYXRpb25JZCxcbiAgfSk7XG5cbiAgaWYgKHRoaXMucmVzcG9uc2UgJiYgdGhpcy5yZXNwb25zZS5yZXNwb25zZSkge1xuICAgIHRoaXMucmVzcG9uc2UucmVzcG9uc2Uuc2Vzc2lvblRva2VuID0gc2Vzc2lvbkRhdGEuc2Vzc2lvblRva2VuO1xuICAgIHRoaXMuc3RvcmFnZS5pc3N1ZWRTZXNzaW9uVG9rZW4gPSBzZXNzaW9uRGF0YS5zZXNzaW9uVG9rZW47XG4gIH1cblxuICByZXR1cm4gY3JlYXRlU2Vzc2lvbigpO1xufTtcblxuUmVzdFdyaXRlLmNyZWF0ZVNlc3Npb24gPSBmdW5jdGlvbiAoXG4gIGNvbmZpZyxcbiAgeyB1c2VySWQsIGNyZWF0ZWRXaXRoLCBpbnN0YWxsYXRpb25JZCwgYWRkaXRpb25hbFNlc3Npb25EYXRhIH1cbikge1xuICBjb25zdCB0b2tlbiA9ICdyOicgKyBjcnlwdG9VdGlscy5uZXdUb2tlbigpO1xuICBjb25zdCBleHBpcmVzQXQgPSBjb25maWcuZ2VuZXJhdGVTZXNzaW9uRXhwaXJlc0F0KCk7XG4gIGNvbnN0IHNlc3Npb25EYXRhID0ge1xuICAgIHNlc3Npb25Ub2tlbjogdG9rZW4sXG4gICAgdXNlcjoge1xuICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICBjbGFzc05hbWU6ICdfVXNlcicsXG4gICAgICBvYmplY3RJZDogdXNlcklkLFxuICAgIH0sXG4gICAgY3JlYXRlZFdpdGgsXG4gICAgZXhwaXJlc0F0OiBQYXJzZS5fZW5jb2RlKGV4cGlyZXNBdCksXG4gIH07XG5cbiAgaWYgKGluc3RhbGxhdGlvbklkKSB7XG4gICAgc2Vzc2lvbkRhdGEuaW5zdGFsbGF0aW9uSWQgPSBpbnN0YWxsYXRpb25JZDtcbiAgfVxuXG4gIE9iamVjdC5hc3NpZ24oc2Vzc2lvbkRhdGEsIGFkZGl0aW9uYWxTZXNzaW9uRGF0YSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzZXNzaW9uRGF0YSxcbiAgICBjcmVhdGVTZXNzaW9uOiAoKSA9PlxuICAgICAgbmV3IFJlc3RXcml0ZShjb25maWcsIEF1dGgubWFzdGVyKGNvbmZpZyksICdfU2Vzc2lvbicsIG51bGwsIHNlc3Npb25EYXRhKS5leGVjdXRlKCksXG4gIH07XG59O1xuXG4vLyBEZWxldGUgZW1haWwgcmVzZXQgdG9rZW5zIGlmIHVzZXIgaXMgY2hhbmdpbmcgcGFzc3dvcmQgb3IgZW1haWwuXG5SZXN0V3JpdGUucHJvdG90eXBlLmRlbGV0ZUVtYWlsUmVzZXRUb2tlbklmTmVlZGVkID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5jbGFzc05hbWUgIT09ICdfVXNlcicgfHwgdGhpcy5xdWVyeSA9PT0gbnVsbCkge1xuICAgIC8vIG51bGwgcXVlcnkgbWVhbnMgY3JlYXRlXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCdwYXNzd29yZCcgaW4gdGhpcy5kYXRhIHx8ICdlbWFpbCcgaW4gdGhpcy5kYXRhKSB7XG4gICAgY29uc3QgYWRkT3BzID0ge1xuICAgICAgX3BlcmlzaGFibGVfdG9rZW46IHsgX19vcDogJ0RlbGV0ZScgfSxcbiAgICAgIF9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQ6IHsgX19vcDogJ0RlbGV0ZScgfSxcbiAgICB9O1xuICAgIHRoaXMuZGF0YSA9IE9iamVjdC5hc3NpZ24odGhpcy5kYXRhLCBhZGRPcHMpO1xuICB9XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmRlc3Ryb3lEdXBsaWNhdGVkU2Vzc2lvbnMgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFNraXAgaWYgdGhlIHJlc3BvbnNlIGlzIGFscmVhZHkgc2V0LCBtYXRjaGluZyB0aGUgb3RoZXIgd3JpdGUtcGlwZWxpbmUgc3RlcHNcbiAgLy8gKHJ1bkRhdGFiYXNlT3BlcmF0aW9uLCBydW5BZnRlclNhdmVUcmlnZ2VyKS4gQSBub24tbWFzdGVyIFBPU1QgL2NsYXNzZXMvX1Nlc3Npb25cbiAgLy8gY3JlYXRlIGhhcyBoYW5kbGVTZXNzaW9uKCkgc2V0IHRoaXMucmVzcG9uc2UgYmVmb3JlIHRoaXMgcnVucywgc28gdGhpcyBndWFyZFxuICAvLyBwcmV2ZW50cyB0aGUgZGVkdXAgZGVsZXRlIGZyb20gYWN0aW5nIG9uIHRoZSBjbGllbnQtc3VwcGxpZWQgYHVzZXJgL2BpbnN0YWxsYXRpb25JZGBcbiAgLy8gcmF0aGVyIHRoYW4gb24gdGhlIHNlcnZlci1nZW5lcmF0ZWQgc2Vzc2lvbiBkYXRhLlxuICBpZiAodGhpcy5yZXNwb25zZSkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBPbmx5IGZvciBfU2Vzc2lvbiwgYW5kIGF0IGNyZWF0aW9uIHRpbWVcbiAgaWYgKHRoaXMuY2xhc3NOYW1lICE9ICdfU2Vzc2lvbicgfHwgdGhpcy5xdWVyeSkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBEZXN0cm95IHRoZSBzZXNzaW9ucyBpbiAnQmFja2dyb3VuZCdcbiAgY29uc3QgeyB1c2VyLCBpbnN0YWxsYXRpb25JZCwgc2Vzc2lvblRva2VuIH0gPSB0aGlzLmRhdGE7XG4gIGlmICghdXNlciB8fCAhaW5zdGFsbGF0aW9uSWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCF1c2VyLm9iamVjdElkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kZXN0cm95KFxuICAgICdfU2Vzc2lvbicsXG4gICAge1xuICAgICAgdXNlcixcbiAgICAgIGluc3RhbGxhdGlvbklkLFxuICAgICAgc2Vzc2lvblRva2VuOiB7ICRuZTogc2Vzc2lvblRva2VuIH0sXG4gICAgfSxcbiAgICB7fSxcbiAgICB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlclxuICApLmNhdGNoKGUgPT4ge1xuICAgIGlmIChlLmNvZGUgIT09IFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9KTtcbn07XG5cbi8vIEhhbmRsZXMgYW55IGZvbGxvd3VwIGxvZ2ljXG5SZXN0V3JpdGUucHJvdG90eXBlLmhhbmRsZUZvbGxvd3VwID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5zdG9yYWdlICYmIHRoaXMuc3RvcmFnZVsnY2xlYXJTZXNzaW9ucyddICYmIHRoaXMuY29uZmlnLnJldm9rZVNlc3Npb25PblBhc3N3b3JkUmVzZXQpIHtcbiAgICB2YXIgc2Vzc2lvblF1ZXJ5ID0ge1xuICAgICAgdXNlcjoge1xuICAgICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgICAgY2xhc3NOYW1lOiAnX1VzZXInLFxuICAgICAgICBvYmplY3RJZDogdGhpcy5vYmplY3RJZCgpLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLnN0b3JhZ2VbJ2NsZWFyU2Vzc2lvbnMnXTtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5kZXN0cm95KCdfU2Vzc2lvbicsIHNlc3Npb25RdWVyeSlcbiAgICAgIC50aGVuKHRoaXMuaGFuZGxlRm9sbG93dXAuYmluZCh0aGlzKSk7XG4gIH1cblxuICBpZiAodGhpcy5zdG9yYWdlICYmIHRoaXMuc3RvcmFnZVsnZ2VuZXJhdGVOZXdTZXNzaW9uJ10pIHtcbiAgICBkZWxldGUgdGhpcy5zdG9yYWdlWydnZW5lcmF0ZU5ld1Nlc3Npb24nXTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTZXNzaW9uVG9rZW4oKS50aGVuKHRoaXMuaGFuZGxlRm9sbG93dXAuYmluZCh0aGlzKSk7XG4gIH1cblxuICBpZiAodGhpcy5zdG9yYWdlICYmIHRoaXMuc3RvcmFnZVsnc2VuZFZlcmlmaWNhdGlvbkVtYWlsJ10pIHtcbiAgICBkZWxldGUgdGhpcy5zdG9yYWdlWydzZW5kVmVyaWZpY2F0aW9uRW1haWwnXTtcbiAgICAvLyBGaXJlIGFuZCBmb3JnZXQhXG4gICAgdGhpcy5jb25maWcudXNlckNvbnRyb2xsZXIuc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHRoaXMuZGF0YSwgeyBhdXRoOiB0aGlzLmF1dGggfSk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlRm9sbG93dXAuYmluZCh0aGlzKTtcbiAgfVxufTtcblxuLy8gSGFuZGxlcyB0aGUgX1Nlc3Npb24gY2xhc3Mgc3BlY2lhbG5lc3MuXG4vLyBEb2VzIG5vdGhpbmcgaWYgdGhpcyBpc24ndCBhbiBfU2Vzc2lvbiBvYmplY3QuXG5SZXN0V3JpdGUucHJvdG90eXBlLmhhbmRsZVNlc3Npb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnJlc3BvbnNlIHx8IHRoaXMuY2xhc3NOYW1lICE9PSAnX1Nlc3Npb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCF0aGlzLmF1dGgudXNlciAmJiAhdGhpcy5hdXRoLmlzTWFzdGVyICYmICF0aGlzLmF1dGguaXNNYWludGVuYW5jZSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1NFU1NJT05fVE9LRU4sICdTZXNzaW9uIHRva2VuIHJlcXVpcmVkLicpO1xuICB9XG5cbiAgLy8gVE9ETzogVmVyaWZ5IHByb3BlciBlcnJvciB0byB0aHJvd1xuICBpZiAoJ0FDTCcgaW4gdGhpcy5kYXRhKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsICdDYW5ub3Qgc2V0ICcgKyAnQUNMIG9uIGEgU2Vzc2lvbi4nKTtcbiAgfVxuXG4gIGlmICh0aGlzLnF1ZXJ5KSB7XG4gICAgaWYgKCd1c2VyJyBpbiB0aGlzLmRhdGEgJiYgIXRoaXMuYXV0aC5pc01hc3RlciAmJiB0aGlzLmRhdGEudXNlcj8ub2JqZWN0SWQgIT09IHRoaXMuYXV0aC51c2VyLmlkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSwgJ0ludmFsaWQga2V5IG5hbWU6IHVzZXInKTtcbiAgICB9IGVsc2UgaWYgKCdpbnN0YWxsYXRpb25JZCcgaW4gdGhpcy5kYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9LRVlfTkFNRSwgJ0ludmFsaWQga2V5IG5hbWU6IGluc3RhbGxhdGlvbklkJyk7XG4gICAgfSBlbHNlIGlmICgnc2Vzc2lvblRva2VuJyBpbiB0aGlzLmRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0tFWV9OQU1FLCAnSW52YWxpZCBrZXkgbmFtZTogc2Vzc2lvblRva2VuJyk7XG4gICAgfSBlbHNlIGlmICgnZXhwaXJlc0F0JyBpbiB0aGlzLmRhdGEgJiYgIXRoaXMuYXV0aC5pc01hc3RlciAmJiAhdGhpcy5hdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0tFWV9OQU1FLCAnSW52YWxpZCBrZXkgbmFtZTogZXhwaXJlc0F0Jyk7XG4gICAgfSBlbHNlIGlmICgnY3JlYXRlZFdpdGgnIGluIHRoaXMuZGF0YSAmJiAhdGhpcy5hdXRoLmlzTWFzdGVyICYmICF0aGlzLmF1dGguaXNNYWludGVuYW5jZSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsICdJbnZhbGlkIGtleSBuYW1lOiBjcmVhdGVkV2l0aCcpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYXV0aC5pc01hc3Rlcikge1xuICAgICAgdGhpcy5xdWVyeSA9IHtcbiAgICAgICAgJGFuZDogW1xuICAgICAgICAgIHRoaXMucXVlcnksXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnX1VzZXInLFxuICAgICAgICAgICAgICBvYmplY3RJZDogdGhpcy5hdXRoLnVzZXIuaWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmICghdGhpcy5xdWVyeSAmJiAhdGhpcy5hdXRoLmlzTWFzdGVyICYmICF0aGlzLmF1dGguaXNNYWludGVuYW5jZSkge1xuICAgIGNvbnN0IGFkZGl0aW9uYWxTZXNzaW9uRGF0YSA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgIGlmIChrZXkgPT09ICdvYmplY3RJZCcgfHwga2V5ID09PSAndXNlcicgfHwga2V5ID09PSAnc2Vzc2lvblRva2VuJyB8fCBrZXkgPT09ICdleHBpcmVzQXQnIHx8IGtleSA9PT0gJ2NyZWF0ZWRXaXRoJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGFkZGl0aW9uYWxTZXNzaW9uRGF0YVtrZXldID0gdGhpcy5kYXRhW2tleV07XG4gICAgfVxuXG4gICAgY29uc3QgeyBzZXNzaW9uRGF0YSwgY3JlYXRlU2Vzc2lvbiB9ID0gUmVzdFdyaXRlLmNyZWF0ZVNlc3Npb24odGhpcy5jb25maWcsIHtcbiAgICAgIHVzZXJJZDogdGhpcy5hdXRoLnVzZXIuaWQsXG4gICAgICBjcmVhdGVkV2l0aDoge1xuICAgICAgICBhY3Rpb246ICdjcmVhdGUnLFxuICAgICAgfSxcbiAgICAgIGFkZGl0aW9uYWxTZXNzaW9uRGF0YSxcbiAgICB9KTtcblxuICAgIC8vIEVuZm9yY2UgdGhlIGNhbGxlcidzIGNsYXNzLWxldmVsIHBlcm1pc3Npb25zIGFuZCBzY2hlbWEgYmVmb3JlIHRoZSBtYXN0ZXIgd3JpdGVcbiAgICBjb25zdCB2YWxpZGF0ZWQgPSB0aGlzLnZhbGlkYXRlV3JpdGVQZXJtaXNzaW9uKCkudGhlbigoKSA9PiB0aGlzLnZhbGlkYXRlU2NoZW1hKCkpO1xuICAgIHJldHVybiB2YWxpZGF0ZWQudGhlbigoKSA9PiBjcmVhdGVTZXNzaW9uKCkpLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICBpZiAoIXJlc3VsdHMucmVzcG9uc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVEVSTkFMX1NFUlZFUl9FUlJPUiwgJ0Vycm9yIGNyZWF0aW5nIHNlc3Npb24uJyk7XG4gICAgICB9XG4gICAgICBzZXNzaW9uRGF0YVsnb2JqZWN0SWQnXSA9IHJlc3VsdHMucmVzcG9uc2VbJ29iamVjdElkJ107XG4gICAgICB0aGlzLnJlc3BvbnNlID0ge1xuICAgICAgICBzdGF0dXM6IDIwMSxcbiAgICAgICAgbG9jYXRpb246IHJlc3VsdHMubG9jYXRpb24sXG4gICAgICAgIHJlc3BvbnNlOiBzZXNzaW9uRGF0YSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn07XG5cbi8vIEhhbmRsZXMgdGhlIF9JbnN0YWxsYXRpb24gY2xhc3Mgc3BlY2lhbG5lc3MuXG4vLyBEb2VzIG5vdGhpbmcgaWYgdGhpcyBpc24ndCBhbiBpbnN0YWxsYXRpb24gb2JqZWN0LlxuLy8gSWYgYW4gaW5zdGFsbGF0aW9uIGlzIGZvdW5kLCB0aGlzIGNhbiBtdXRhdGUgdGhpcy5xdWVyeSBhbmQgdHVybiBhIGNyZWF0ZVxuLy8gaW50byBhbiB1cGRhdGUuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3Igd2hlbiB3ZSdyZSBkb25lIGlmIGl0IGNhbid0IGZpbmlzaCB0aGlzIHRpY2suXG5SZXN0V3JpdGUucHJvdG90eXBlLmhhbmRsZUluc3RhbGxhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHRoaXMucmVzcG9uc2UgfHwgdGhpcy5jbGFzc05hbWUgIT09ICdfSW5zdGFsbGF0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSBkZWR1cGxpY2F0aW9uIGJlbG93IGVtYmVkcyB0aGVzZSBjbGllbnQtc3VwcGxpZWQgdmFsdWVzIGRpcmVjdGx5IGludG8gZGF0YWJhc2VcbiAgLy8gcXVlcmllcyB0aGF0IGRlbGV0ZSBvciB1cGRhdGUgcm93cyB3aXRoIG1hc3RlciBwcml2aWxlZ2VzLCBhbmQgaXQgcnVucyBiZWZvcmVcbiAgLy8gYHZhbGlkYXRlU2NoZW1hYCwgc28gdGhlaXIgdHlwZXMgbXVzdCBiZSBlbmZvcmNlZCBoZXJlOiBhIG5vbi1zdHJpbmcgdmFsdWUgd291bGRcbiAgLy8gb3RoZXJ3aXNlIHJlYWNoIHRoZSBkYXRhYmFzZSBhcyBhIHF1ZXJ5IGNvbnN0cmFpbnQgKHN1Y2ggYXMgYW4gb3BlcmF0b3Igb2JqZWN0XG4gIC8vIGB7XCIkbmVcIjogbnVsbH1gKSBtYXRjaGluZyByb3dzIHRoZSBjbGllbnQgbmV2ZXIgaWRlbnRpZmllZCwgaW5zdGVhZCBvZiBhcyBhIGxpdGVyYWxcbiAgLy8gdmFsdWUgdG8gbWF0Y2ggYWdhaW5zdC4gVGhlIHNjaGVtYSBkZWNsYXJlcyBhbGwgdGhyZWUgYXMgYFN0cmluZ2AsIGJ1dCB0aGF0IGNoZWNrXG4gIC8vIGNhbm5vdCBiZSByZXVzZWQgaGVyZTsgaXQgcnVucyBsYXRlciBpbiB0aGUgd3JpdGUgcGlwZWxpbmUgYW5kIG1vdmluZyBpdCBlYXJsaWVyXG4gIC8vIHdvdWxkIG11dGF0ZSB0aGUgc2NoZW1hIGJlZm9yZSB0aGUgcGVybWlzc2lvbiBjaGVjay4gVGhlIGZpZWxkIGxpc3QgaXMgYSBwcm9wZXJ0eSBvZlxuICAvLyB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIG9mIHRoZSBzY2hlbWE6IGl0IGlzIHRoZSBzZXQgb2YgdmFsdWVzIHNwbGljZWQgaW50byB0aGVcbiAgLy8gZGVkdXBsaWNhdGlvbiBxdWVyaWVzIGJlbG93LlxuICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiBbJ2RldmljZVRva2VuJywgJ2luc3RhbGxhdGlvbklkJywgJ2FwcElkZW50aWZpZXInXSkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kYXRhW2ZpZWxkTmFtZV07XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChmaWVsZE5hbWUgPT09ICdhcHBJZGVudGlmaWVyJyAmJiB2YWx1ZS5fX29wID09PSAnRGVsZXRlJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGFjdHVhbFR5cGUgPSBBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgPyAnQXJyYXknXG4gICAgICA6IGAke3R5cGVvZiB2YWx1ZX1gLnJlcGxhY2UoL14uLywgY2hhcmFjdGVyID0+IGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpKTtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5JTkNPUlJFQ1RfVFlQRSxcbiAgICAgIGBzY2hlbWEgbWlzbWF0Y2ggZm9yIF9JbnN0YWxsYXRpb24uJHtmaWVsZE5hbWV9OyBleHBlY3RlZCBTdHJpbmcgYnV0IGdvdCAke2FjdHVhbFR5cGV9YFxuICAgICk7XG4gIH1cblxuICBpZiAoXG4gICAgIXRoaXMucXVlcnkgJiZcbiAgICAhdGhpcy5kYXRhLmRldmljZVRva2VuICYmXG4gICAgIXRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCAmJlxuICAgICF0aGlzLmF1dGguaW5zdGFsbGF0aW9uSWRcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgMTM1LFxuICAgICAgJ2F0IGxlYXN0IG9uZSBJRCBmaWVsZCAoZGV2aWNlVG9rZW4sIGluc3RhbGxhdGlvbklkKSAnICsgJ211c3QgYmUgc3BlY2lmaWVkIGluIHRoaXMgb3BlcmF0aW9uJ1xuICAgICk7XG4gIH1cblxuICAvLyBJZiB0aGUgZGV2aWNlIHRva2VuIGlzIDY0IGNoYXJhY3RlcnMgbG9uZywgd2UgYXNzdW1lIGl0IGlzIGZvciBpT1NcbiAgLy8gYW5kIGxvd2VyY2FzZSBpdC5cbiAgaWYgKHRoaXMuZGF0YS5kZXZpY2VUb2tlbiAmJiB0aGlzLmRhdGEuZGV2aWNlVG9rZW4ubGVuZ3RoID09IDY0KSB7XG4gICAgdGhpcy5kYXRhLmRldmljZVRva2VuID0gdGhpcy5kYXRhLmRldmljZVRva2VuLnRvTG93ZXJDYXNlKCk7XG4gIH1cblxuICAvLyBXZSBsb3dlcmNhc2UgdGhlIGluc3RhbGxhdGlvbklkIGlmIHByZXNlbnRcbiAgaWYgKHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCkge1xuICAgIHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCA9IHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgbGV0IGluc3RhbGxhdGlvbklkID0gdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkO1xuXG4gIC8vIENyZWF0ZSBvbmx5OiB0aGUgcmVxdWVzdCBpbnN0YWxsYXRpb24gSUQgbmFtZXMgdGhlIGNhbGxlcidzIG93biBpbnN0YWxsYXRpb25cbiAgaWYgKCFpbnN0YWxsYXRpb25JZCAmJiAhdGhpcy5xdWVyeSAmJiAhdGhpcy5hdXRoLmlzTWFzdGVyICYmICF0aGlzLmF1dGguaXNNYWludGVuYW5jZSkge1xuICAgIGluc3RhbGxhdGlvbklkID0gdGhpcy5hdXRoLmluc3RhbGxhdGlvbklkO1xuICB9XG5cbiAgaWYgKGluc3RhbGxhdGlvbklkKSB7XG4gICAgaW5zdGFsbGF0aW9uSWQgPSBpbnN0YWxsYXRpb25JZC50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgLy8gVXBkYXRpbmcgX0luc3RhbGxhdGlvbiBidXQgbm90IHVwZGF0aW5nIGFueXRoaW5nIGNyaXRpY2FsXG4gIGlmICh0aGlzLnF1ZXJ5ICYmICF0aGlzLmRhdGEuZGV2aWNlVG9rZW4gJiYgIWluc3RhbGxhdGlvbklkICYmICF0aGlzLmRhdGEuZGV2aWNlVHlwZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgdmFyIGlkTWF0Y2g7IC8vIFdpbGwgYmUgYSBtYXRjaCBvbiBlaXRoZXIgb2JqZWN0SWQgb3IgaW5zdGFsbGF0aW9uSWRcbiAgdmFyIG9iamVjdElkTWF0Y2g7XG4gIHZhciBpbnN0YWxsYXRpb25JZE1hdGNoO1xuICB2YXIgZGV2aWNlVG9rZW5NYXRjaGVzID0gW107XG5cbiAgLy8gSW5zdGVhZCBvZiBpc3N1aW5nIDMgcmVhZHMsIGxldCdzIGRvIGl0IHdpdGggb25lIE9SLlxuICBjb25zdCBvclF1ZXJpZXMgPSBbXTtcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCkge1xuICAgIG9yUXVlcmllcy5wdXNoKHtcbiAgICAgIG9iamVjdElkOiB0aGlzLnF1ZXJ5Lm9iamVjdElkLFxuICAgIH0pO1xuICB9XG4gIGlmIChpbnN0YWxsYXRpb25JZCkge1xuICAgIG9yUXVlcmllcy5wdXNoKHtcbiAgICAgIGluc3RhbGxhdGlvbklkOiBpbnN0YWxsYXRpb25JZCxcbiAgICB9KTtcbiAgfVxuICBpZiAodGhpcy5kYXRhLmRldmljZVRva2VuKSB7XG4gICAgb3JRdWVyaWVzLnB1c2goeyBkZXZpY2VUb2tlbjogdGhpcy5kYXRhLmRldmljZVRva2VuIH0pO1xuICB9XG5cbiAgaWYgKG9yUXVlcmllcy5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb21pc2UgPSBwcm9taXNlXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICdfSW5zdGFsbGF0aW9uJyxcbiAgICAgICAge1xuICAgICAgICAgICRvcjogb3JRdWVyaWVzLFxuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKTtcbiAgICB9KVxuICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgcmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMucXVlcnkub2JqZWN0SWQgJiYgcmVzdWx0Lm9iamVjdElkID09IHRoaXMucXVlcnkub2JqZWN0SWQpIHtcbiAgICAgICAgICBvYmplY3RJZE1hdGNoID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuaW5zdGFsbGF0aW9uSWQgPT0gaW5zdGFsbGF0aW9uSWQpIHtcbiAgICAgICAgICBpbnN0YWxsYXRpb25JZE1hdGNoID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuZGV2aWNlVG9rZW4gPT0gdGhpcy5kYXRhLmRldmljZVRva2VuKSB7XG4gICAgICAgICAgZGV2aWNlVG9rZW5NYXRjaGVzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNhbml0eSBjaGVja3Mgd2hlbiBydW5uaW5nIGEgcXVlcnlcbiAgICAgIGlmICh0aGlzLnF1ZXJ5ICYmIHRoaXMucXVlcnkub2JqZWN0SWQpIHtcbiAgICAgICAgaWYgKCFvYmplY3RJZE1hdGNoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdPYmplY3Qgbm90IGZvdW5kIGZvciB1cGRhdGUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YS5pbnN0YWxsYXRpb25JZCAmJlxuICAgICAgICAgIG9iamVjdElkTWF0Y2guaW5zdGFsbGF0aW9uSWQgJiZcbiAgICAgICAgICB0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQgIT09IG9iamVjdElkTWF0Y2guaW5zdGFsbGF0aW9uSWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKDEzNiwgJ2luc3RhbGxhdGlvbklkIG1heSBub3QgYmUgY2hhbmdlZCBpbiB0aGlzICcgKyAnb3BlcmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YS5kZXZpY2VUb2tlbiAmJlxuICAgICAgICAgIG9iamVjdElkTWF0Y2guZGV2aWNlVG9rZW4gJiZcbiAgICAgICAgICB0aGlzLmRhdGEuZGV2aWNlVG9rZW4gIT09IG9iamVjdElkTWF0Y2guZGV2aWNlVG9rZW4gJiZcbiAgICAgICAgICAhdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkICYmXG4gICAgICAgICAgIW9iamVjdElkTWF0Y2guaW5zdGFsbGF0aW9uSWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKDEzNiwgJ2RldmljZVRva2VuIG1heSBub3QgYmUgY2hhbmdlZCBpbiB0aGlzICcgKyAnb3BlcmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMuZGF0YS5kZXZpY2VUeXBlICYmXG4gICAgICAgICAgdGhpcy5kYXRhLmRldmljZVR5cGUgJiZcbiAgICAgICAgICB0aGlzLmRhdGEuZGV2aWNlVHlwZSAhPT0gb2JqZWN0SWRNYXRjaC5kZXZpY2VUeXBlXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcigxMzYsICdkZXZpY2VUeXBlIG1heSBub3QgYmUgY2hhbmdlZCBpbiB0aGlzICcgKyAnb3BlcmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeS5vYmplY3RJZCAmJiBvYmplY3RJZE1hdGNoKSB7XG4gICAgICAgIGlkTWF0Y2ggPSBvYmplY3RJZE1hdGNoO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5zdGFsbGF0aW9uSWQgJiYgaW5zdGFsbGF0aW9uSWRNYXRjaCkge1xuICAgICAgICBpZE1hdGNoID0gaW5zdGFsbGF0aW9uSWRNYXRjaDtcbiAgICAgIH1cbiAgICAgIC8vIG5lZWQgdG8gc3BlY2lmeSBkZXZpY2VUeXBlIG9ubHkgaWYgaXQncyBuZXdcbiAgICAgIGlmICghdGhpcy5xdWVyeSAmJiAhdGhpcy5kYXRhLmRldmljZVR5cGUgJiYgIWlkTWF0Y2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKDEzNSwgJ2RldmljZVR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGhpcyBvcGVyYXRpb24nKTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIGlmICghaWRNYXRjaCkge1xuICAgICAgICBpZiAoIWRldmljZVRva2VuTWF0Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZGV2aWNlVG9rZW5NYXRjaGVzLmxlbmd0aCA9PSAxICYmXG4gICAgICAgICAgKCFkZXZpY2VUb2tlbk1hdGNoZXNbMF1bJ2luc3RhbGxhdGlvbklkJ10gfHwgIWluc3RhbGxhdGlvbklkKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBTaW5nbGUgbWF0Y2ggb24gZGV2aWNlIHRva2VuIGJ1dCBub25lIG9uIGluc3RhbGxhdGlvbklkLCBhbmQgZWl0aGVyXG4gICAgICAgICAgLy8gdGhlIHBhc3NlZCBvYmplY3Qgb3IgdGhlIG1hdGNoIGlzIG1pc3NpbmcgYW4gaW5zdGFsbGF0aW9uSWQsIHNvIHdlXG4gICAgICAgICAgLy8gY2FuIGp1c3QgcmV0dXJuIHRoZSBtYXRjaC5cbiAgICAgICAgICByZXR1cm4gZGV2aWNlVG9rZW5NYXRjaGVzWzBdWydvYmplY3RJZCddO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRhdGEuaW5zdGFsbGF0aW9uSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAxMzIsXG4gICAgICAgICAgICAnTXVzdCBzcGVjaWZ5IGluc3RhbGxhdGlvbklkIHdoZW4gZGV2aWNlVG9rZW4gJyArXG4gICAgICAgICAgICAgICdtYXRjaGVzIG11bHRpcGxlIEluc3RhbGxhdGlvbiBvYmplY3RzJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTXVsdGlwbGUgZGV2aWNlIHRva2VuIG1hdGNoZXMgYW5kIHdlIHNwZWNpZmllZCBhbiBpbnN0YWxsYXRpb24gSUQsXG4gICAgICAgICAgLy8gb3IgYSBzaW5nbGUgbWF0Y2ggd2hlcmUgYm90aCB0aGUgcGFzc2VkIGFuZCBtYXRjaGluZyBvYmplY3RzIGhhdmVcbiAgICAgICAgICAvLyBhbiBpbnN0YWxsYXRpb24gSUQuIENsZWFuIG91dCBvdGhlciBpbnN0YWxsYXRpb25zIHRoYXQgbWF0Y2ggdGhlXG4gICAgICAgICAgLy8gZGV2aWNlVG9rZW4sIGFuZCByZXR1cm4gbmlsIHRvIHNpZ25hbCB0aGF0IGEgbmV3IG9iamVjdCBzaG91bGQgYmVcbiAgICAgICAgICAvLyBjcmVhdGVkLlxuICAgICAgICAgIGNvbnN0IGRlbFF1ZXJ5ID0ge1xuICAgICAgICAgICAgZGV2aWNlVG9rZW46IHRoaXMuZGF0YS5kZXZpY2VUb2tlbixcbiAgICAgICAgICAgIGluc3RhbGxhdGlvbklkOiB7XG4gICAgICAgICAgICAgICRuZTogaW5zdGFsbGF0aW9uSWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHRoaXMuZGF0YS5hcHBJZGVudGlmaWVyKSB7XG4gICAgICAgICAgICAvLyBBIGBEZWxldGVgIG9wZXJhdGlvbiBpcyBhcHBsaWVkIG9ubHkgYWZ0ZXIgdGhlIGRlZHVwbGljYXRpb24gcnVucywgYW5kIG5vXG4gICAgICAgICAgICAvLyBpbnN0YWxsYXRpb24gbWF0Y2hlZCBoZXJlIHRvIHRha2UgYSBzY29wZSBmcm9tLiBTa2lwIHRoZSBjbGVhbnVwIHJhdGhlciB0aGFuXG4gICAgICAgICAgICAvLyBydW4gaXQgdW5zY29wZWQgYWNyb3NzIGV2ZXJ5IGFwcGxpY2F0aW9uLCBvciBxdWVyeSBvbiB0aGUgb3BlcmF0aW9uIGl0c2VsZi5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5kYXRhLmFwcElkZW50aWZpZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbFF1ZXJ5WydhcHBJZGVudGlmaWVyJ10gPSB0aGlzLmRhdGEuYXBwSWRlbnRpZmllcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaW5zdGFsbGF0aW9uT3B0cyA9IHRoaXMuY29uZmlnLmluc3RhbGxhdGlvbiB8fCB7fTtcbiAgICAgICAgICByZXR1cm4gSW5zdGFsbGF0aW9uRGVkdXAucmVtb3ZlQ29uZmxpY3RpbmdEZXZpY2VUb2tlbih7XG4gICAgICAgICAgICBkYXRhYmFzZTogdGhpcy5jb25maWcuZGF0YWJhc2UsXG4gICAgICAgICAgICBxdWVyeTogZGVsUXVlcnksXG4gICAgICAgICAgICBhY3Rpb246IGluc3RhbGxhdGlvbk9wdHMuZHVwbGljYXRlRGV2aWNlVG9rZW5BY3Rpb24gfHwgJ2RlbGV0ZScsXG4gICAgICAgICAgICBlbmZvcmNlQXV0aDogaW5zdGFsbGF0aW9uT3B0cy5kdXBsaWNhdGVEZXZpY2VUb2tlbkFjdGlvbkVuZm9yY2VBdXRoID09PSB0cnVlLFxuICAgICAgICAgICAgcnVuT3B0aW9uczogdGhpcy5ydW5PcHRpb25zLFxuICAgICAgICAgICAgdmFsaWRTY2hlbWFDb250cm9sbGVyOiB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlcixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGRldmljZVRva2VuTWF0Y2hlcy5sZW5ndGggPT0gMSAmJiAhZGV2aWNlVG9rZW5NYXRjaGVzWzBdWydpbnN0YWxsYXRpb25JZCddKSB7XG4gICAgICAgICAgLy8gRXhhY3RseSBvbmUgZGV2aWNlIHRva2VuIG1hdGNoIGFuZCBpdCBkb2Vzbid0IGhhdmUgYW4gaW5zdGFsbGF0aW9uXG4gICAgICAgICAgLy8gSUQuIFRoZSB0d28gcm93cyByZXByZXNlbnQgdGhlIHNhbWUgaW5zdGFsbDsgcmVzb2x2ZSB0aGUgbWVyZ2UgcGVyXG4gICAgICAgICAgLy8gdGhlIGNvbmZpZ3VyZWQgb3B0aW9ucy5cbiAgICAgICAgICBjb25zdCBpbnN0YWxsYXRpb25PcHRzID0gdGhpcy5jb25maWcuaW5zdGFsbGF0aW9uIHx8IHt9O1xuICAgICAgICAgIHJldHVybiBJbnN0YWxsYXRpb25EZWR1cC5hcHBseUR1cGxpY2F0ZURldmljZVRva2VuTWVyZ2Uoe1xuICAgICAgICAgICAgZGF0YWJhc2U6IHRoaXMuY29uZmlnLmRhdGFiYXNlLFxuICAgICAgICAgICAgaWRNYXRjaCxcbiAgICAgICAgICAgIGRldmljZVRva2VuTWF0Y2g6IGRldmljZVRva2VuTWF0Y2hlc1swXSxcbiAgICAgICAgICAgIGFjdGlvbjogaW5zdGFsbGF0aW9uT3B0cy5kdXBsaWNhdGVEZXZpY2VUb2tlbkFjdGlvbiB8fCAnZGVsZXRlJyxcbiAgICAgICAgICAgIG1lcmdlUHJpb3JpdHk6IGluc3RhbGxhdGlvbk9wdHMuZHVwbGljYXRlRGV2aWNlVG9rZW5NZXJnZVByaW9yaXR5IHx8ICdkZXZpY2VUb2tlbicsXG4gICAgICAgICAgICBlbmZvcmNlQXV0aDogaW5zdGFsbGF0aW9uT3B0cy5kdXBsaWNhdGVEZXZpY2VUb2tlbkFjdGlvbkVuZm9yY2VBdXRoID09PSB0cnVlLFxuICAgICAgICAgICAgcnVuT3B0aW9uczogdGhpcy5ydW5PcHRpb25zLFxuICAgICAgICAgICAgdmFsaWRTY2hlbWFDb250cm9sbGVyOiB0aGlzLnZhbGlkU2NoZW1hQ29udHJvbGxlcixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhLmRldmljZVRva2VuICYmIGlkTWF0Y2guZGV2aWNlVG9rZW4gIT0gdGhpcy5kYXRhLmRldmljZVRva2VuKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBzZXR0aW5nIHRoZSBkZXZpY2UgdG9rZW4gb24gYW4gZXhpc3RpbmcgaW5zdGFsbGF0aW9uLCBzb1xuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIHRyeSBjbGVhbmluZyBvdXQgb2xkIGluc3RhbGxhdGlvbnMgdGhhdCBtYXRjaCB0aGlzXG4gICAgICAgICAgICAvLyBkZXZpY2UgdG9rZW4uXG4gICAgICAgICAgICBjb25zdCBkZWxRdWVyeSA9IHtcbiAgICAgICAgICAgICAgZGV2aWNlVG9rZW46IHRoaXMuZGF0YS5kZXZpY2VUb2tlbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBXZSBoYXZlIGEgdW5pcXVlIGluc3RhbGwgSWQsIHVzZSB0aGF0IHRvIHByZXNlcnZlXG4gICAgICAgICAgICAvLyB0aGUgaW50ZXJlc3RpbmcgaW5zdGFsbGF0aW9uXG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLmluc3RhbGxhdGlvbklkKSB7XG4gICAgICAgICAgICAgIGRlbFF1ZXJ5WydpbnN0YWxsYXRpb25JZCddID0ge1xuICAgICAgICAgICAgICAgICRuZTogdGhpcy5kYXRhLmluc3RhbGxhdGlvbklkLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgaWRNYXRjaC5vYmplY3RJZCAmJlxuICAgICAgICAgICAgICB0aGlzLmRhdGEub2JqZWN0SWQgJiZcbiAgICAgICAgICAgICAgaWRNYXRjaC5vYmplY3RJZCA9PSB0aGlzLmRhdGEub2JqZWN0SWRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyB3ZSBwYXNzZWQgYW4gb2JqZWN0SWQsIHByZXNlcnZlIHRoYXQgaW5zdGFsYXRpb25cbiAgICAgICAgICAgICAgZGVsUXVlcnlbJ29iamVjdElkJ10gPSB7XG4gICAgICAgICAgICAgICAgJG5lOiBpZE1hdGNoLm9iamVjdElkLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gV2hhdCB0byBkbyBoZXJlPyBjYW4ndCByZWFsbHkgY2xlYW4gdXAgZXZlcnl0aGluZy4uLlxuICAgICAgICAgICAgICByZXR1cm4gaWRNYXRjaC5vYmplY3RJZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuYXBwSWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAvLyBBIGBEZWxldGVgIG9wZXJhdGlvbiBpcyBhcHBsaWVkIG9ubHkgYWZ0ZXIgdGhlIGRlZHVwbGljYXRpb24gcnVucywgc28gc2NvcGVcbiAgICAgICAgICAgICAgLy8gdGhlIGNsZWFudXAgdG8gdGhlIHZhbHVlIHRoZSBtYXRjaGVkIGluc3RhbGxhdGlvbiBzdGlsbCBob2xkcy4gRHJvcHBpbmcgdGhlXG4gICAgICAgICAgICAgIC8vIGNvbnN0cmFpbnQgd291bGQgbGV0IHRoZSBjbGVhbnVwIHJlYWNoIGluc3RhbGxhdGlvbnMgb2Ygb3RoZXIgYXBwbGljYXRpb25zLFxuICAgICAgICAgICAgICAvLyBhbmQgdGhlIG9wZXJhdGlvbiBpdHNlbGYgY2Fubm90IG1hdGNoIGEgU3RyaW5nLCBzbyBza2lwIHRoZSBjbGVhbnVwIHdoZW4gbm9cbiAgICAgICAgICAgICAgLy8gc2NvcGUgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgICBjb25zdCBhcHBJZGVudGlmaWVyID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5kYXRhLmFwcElkZW50aWZpZXIgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuZGF0YS5hcHBJZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgICA6IGlkTWF0Y2guYXBwSWRlbnRpZmllcjtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcHBJZGVudGlmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBpZE1hdGNoLm9iamVjdElkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRlbFF1ZXJ5WydhcHBJZGVudGlmaWVyJ10gPSBhcHBJZGVudGlmaWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgaW5zdGFsbGF0aW9uT3B0cyA9IHRoaXMuY29uZmlnLmluc3RhbGxhdGlvbiB8fCB7fTtcbiAgICAgICAgICAgIHJldHVybiBJbnN0YWxsYXRpb25EZWR1cC5yZW1vdmVDb25mbGljdGluZ0RldmljZVRva2VuKHtcbiAgICAgICAgICAgICAgZGF0YWJhc2U6IHRoaXMuY29uZmlnLmRhdGFiYXNlLFxuICAgICAgICAgICAgICBxdWVyeTogZGVsUXVlcnksXG4gICAgICAgICAgICAgIGFjdGlvbjogaW5zdGFsbGF0aW9uT3B0cy5kdXBsaWNhdGVEZXZpY2VUb2tlbkFjdGlvbiB8fCAnZGVsZXRlJyxcbiAgICAgICAgICAgICAgZW5mb3JjZUF1dGg6IGluc3RhbGxhdGlvbk9wdHMuZHVwbGljYXRlRGV2aWNlVG9rZW5BY3Rpb25FbmZvcmNlQXV0aCA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgcnVuT3B0aW9uczogdGhpcy5ydW5PcHRpb25zLFxuICAgICAgICAgICAgICB2YWxpZFNjaGVtYUNvbnRyb2xsZXI6IHRoaXMudmFsaWRTY2hlbWFDb250cm9sbGVyLFxuICAgICAgICAgICAgfSkudGhlbigoKSA9PiBpZE1hdGNoLm9iamVjdElkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSW4gbm9uLW1lcmdlIHNjZW5hcmlvcywganVzdCByZXR1cm4gdGhlIGluc3RhbGxhdGlvbiBtYXRjaCBpZFxuICAgICAgICAgIHJldHVybiBpZE1hdGNoLm9iamVjdElkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbihvYmpJZCA9PiB7XG4gICAgICBpZiAob2JqSWQpIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHsgb2JqZWN0SWQ6IG9iaklkIH07XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRhdGEub2JqZWN0SWQ7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRhdGEuY3JlYXRlZEF0O1xuICAgICAgfVxuICAgICAgLy8gVE9ETzogVmFsaWRhdGUgb3BzIChhZGQvcmVtb3ZlIG9uIGNoYW5uZWxzLCAkaW5jIG9uIGJhZGdlLCBldGMuKVxuICAgIH0pO1xuICByZXR1cm4gcHJvbWlzZTtcbn07XG5cbi8vIElmIHdlIHNob3J0LWNpcmN1aXRlZCB0aGUgb2JqZWN0IHJlc3BvbnNlIC0gdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBleHBhbmQgYWxsIHRoZSBmaWxlcyxcbi8vIHNpbmNlIHRoaXMgbWlnaHQgbm90IGhhdmUgYSBxdWVyeSwgbWVhbmluZyBpdCB3b24ndCByZXR1cm4gdGhlIGZ1bGwgcmVzdWx0IGJhY2suXG4vLyBUT0RPOiAobmx1dHNlbmtvKSBUaGlzIHNob3VsZCBkaWUgd2hlbiB3ZSBtb3ZlIHRvIHBlci1jbGFzcyBiYXNlZCBjb250cm9sbGVycyBvbiBfU2Vzc2lvbi9fVXNlclxuUmVzdFdyaXRlLnByb3RvdHlwZS5leHBhbmRGaWxlc0ZvckV4aXN0aW5nT2JqZWN0cyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgLy8gQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgc2hvcnQtY2lyY3VpdGVkIHJlc3BvbnNlIC0gb25seSB0aGVuIHJ1biBleHBhbnNpb24uXG4gIGlmICh0aGlzLnJlc3BvbnNlICYmIHRoaXMucmVzcG9uc2UucmVzcG9uc2UpIHtcbiAgICBhd2FpdCB0aGlzLmNvbmZpZy5maWxlc0NvbnRyb2xsZXIuZXhwYW5kRmlsZXNJbk9iamVjdCh0aGlzLmNvbmZpZywgdGhpcy5yZXNwb25zZS5yZXNwb25zZSk7XG4gIH1cbn07XG5cblJlc3RXcml0ZS5wcm90b3R5cGUucnVuRGF0YWJhc2VPcGVyYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLnJlc3BvbnNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnX1JvbGUnKSB7XG4gICAgdGhpcy5jb25maWcuY2FjaGVDb250cm9sbGVyLnJvbGUuY2xlYXIoKTtcbiAgICBpZiAodGhpcy5jb25maWcubGl2ZVF1ZXJ5Q29udHJvbGxlcikge1xuICAgICAgdGhpcy5jb25maWcubGl2ZVF1ZXJ5Q29udHJvbGxlci5jbGVhckNhY2hlZFJvbGVzKHRoaXMuYXV0aC51c2VyKTtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgJiYgdGhpcy5xdWVyeSAmJiB0aGlzLmF1dGguaXNVbmF1dGhlbnRpY2F0ZWQoKSkge1xuICAgIHRocm93IGNyZWF0ZVNhbml0aXplZEVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuU0VTU0lPTl9NSVNTSU5HLFxuICAgICAgYENhbm5vdCBtb2RpZnkgdXNlciAke3RoaXMucXVlcnkub2JqZWN0SWR9LmAsXG4gICAgICB0aGlzLmNvbmZpZ1xuICAgICk7XG4gIH1cblxuICBpZiAodGhpcy5jbGFzc05hbWUgPT09ICdfUHJvZHVjdCcgJiYgdGhpcy5kYXRhLmRvd25sb2FkKSB7XG4gICAgdGhpcy5kYXRhLmRvd25sb2FkTmFtZSA9IHRoaXMuZGF0YS5kb3dubG9hZC5uYW1lO1xuICB9XG5cbiAgLy8gVE9ETzogQWRkIGJldHRlciBkZXRlY3Rpb24gZm9yIEFDTCwgZW5zdXJpbmcgYSB1c2VyIGNhbid0IGJlIGxvY2tlZCBmcm9tXG4gIC8vICAgICAgIHRoZWlyIG93biB1c2VyIHJlY29yZC5cbiAgaWYgKHRoaXMuZGF0YS5BQ0wgJiYgdGhpcy5kYXRhLkFDTFsnKnVucmVzb2x2ZWQnXSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0FDTCwgJ0ludmFsaWQgQUNMLicpO1xuICB9XG5cbiAgaWYgKHRoaXMucXVlcnkpIHtcbiAgICAvLyBGb3JjZSB0aGUgdXNlciB0byBub3QgbG9ja291dFxuICAgIC8vIE1hdGNoZWQgd2l0aCBwYXJzZS5jb21cbiAgICBpZiAoXG4gICAgICB0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJyAmJlxuICAgICAgdGhpcy5kYXRhLkFDTCAmJlxuICAgICAgdGhpcy5hdXRoLmlzTWFzdGVyICE9PSB0cnVlICYmXG4gICAgICB0aGlzLmF1dGguaXNNYWludGVuYW5jZSAhPT0gdHJ1ZVxuICAgICkge1xuICAgICAgdGhpcy5kYXRhLkFDTFt0aGlzLnF1ZXJ5Lm9iamVjdElkXSA9IHsgcmVhZDogdHJ1ZSwgd3JpdGU6IHRydWUgfTtcbiAgICB9XG4gICAgLy8gdXBkYXRlIHBhc3N3b3JkIHRpbWVzdGFtcCBpZiB1c2VyIHBhc3N3b3JkIGlzIGJlaW5nIGNoYW5nZWRcbiAgICBpZiAoXG4gICAgICB0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJyAmJlxuICAgICAgdGhpcy5kYXRhLl9oYXNoZWRfcGFzc3dvcmQgJiZcbiAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEFnZVxuICAgICkge1xuICAgICAgdGhpcy5kYXRhLl9wYXNzd29yZF9jaGFuZ2VkX2F0ID0gUGFyc2UuX2VuY29kZShuZXcgRGF0ZSgpKTtcbiAgICB9XG4gICAgLy8gSWdub3JlIGNyZWF0ZWRBdCB3aGVuIHVwZGF0ZVxuICAgIGRlbGV0ZSB0aGlzLmRhdGEuY3JlYXRlZEF0O1xuXG4gICAgbGV0IGRlZmVyID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgLy8gaWYgcGFzc3dvcmQgaGlzdG9yeSBpcyBlbmFibGVkIHRoZW4gc2F2ZSB0aGUgY3VycmVudCBwYXNzd29yZCB0byBoaXN0b3J5XG4gICAgaWYgKFxuICAgICAgdGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgJiZcbiAgICAgIHRoaXMuZGF0YS5faGFzaGVkX3Bhc3N3b3JkICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeSAmJlxuICAgICAgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRIaXN0b3J5XG4gICAgKSB7XG4gICAgICBkZWZlciA9IHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgICAgIC5maW5kKFxuICAgICAgICAgICdfVXNlcicsXG4gICAgICAgICAgeyBvYmplY3RJZDogdGhpcy5xdWVyeS5vYmplY3RJZCB9LFxuICAgICAgICAgIHsga2V5czogWydfcGFzc3dvcmRfaGlzdG9yeScsICdfaGFzaGVkX3Bhc3N3b3JkJ10gfSxcbiAgICAgICAgICBBdXRoLm1haW50ZW5hbmNlKHRoaXMuY29uZmlnKVxuICAgICAgICApXG4gICAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPSAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ09iamVjdCBub3QgZm91bmQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHVzZXIgPSByZXN1bHRzWzBdO1xuICAgICAgICAgIGxldCBvbGRQYXNzd29yZHMgPSBbXTtcbiAgICAgICAgICBpZiAodXNlci5fcGFzc3dvcmRfaGlzdG9yeSkge1xuICAgICAgICAgICAgb2xkUGFzc3dvcmRzID0gXy50YWtlKFxuICAgICAgICAgICAgICB1c2VyLl9wYXNzd29yZF9oaXN0b3J5LFxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3RvcnlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vbi0xIHBhc3N3b3JkcyBnbyBpbnRvIGhpc3RvcnkgaW5jbHVkaW5nIGxhc3QgcGFzc3dvcmRcbiAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICBvbGRQYXNzd29yZHMubGVuZ3RoID4gTWF0aC5tYXgoMCwgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRIaXN0b3J5IC0gMilcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG9sZFBhc3N3b3Jkcy5zaGlmdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvbGRQYXNzd29yZHMucHVzaCh1c2VyLnBhc3N3b3JkKTtcbiAgICAgICAgICB0aGlzLmRhdGEuX3Bhc3N3b3JkX2hpc3RvcnkgPSBvbGRQYXNzd29yZHM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZlci50aGVuKCgpID0+IHtcbiAgICAgIC8vIFJ1biBhbiB1cGRhdGVcbiAgICAgIC8vIFRoZSB1bnNhbml0aXplZCByZXN1bHQgb2YgYSBjbGllbnQgdXBkYXRlIGNhcnJpZXMgdGhlIHJlYWQgYWNjZXNzIG9mIHRoZSBvYmplY3RcbiAgICAgIGNvbnN0IHJhdyA9ICF0aGlzLnJ1bk9wdGlvbnMubWFueSAmJiAhdGhpcy5hdXRoLmlzTWFzdGVyICYmICF0aGlzLmF1dGguaXNNYWludGVuYW5jZTtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgICAudXBkYXRlKFxuICAgICAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICAgIHRoaXMucXVlcnksXG4gICAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICAgIHRoaXMucnVuT3B0aW9ucyxcbiAgICAgICAgICByYXcsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgdGhpcy52YWxpZFNjaGVtYUNvbnRyb2xsZXJcbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgIHRoaXMuX3Rocm93SWZBdXRoRGF0YUR1cGxpY2F0ZShlcnJvcik7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKGFzeW5jIHJlc3VsdCA9PiB7XG4gICAgICAgICAgbGV0IHJlc3BvbnNlID0gcmVzdWx0O1xuICAgICAgICAgIGlmIChyYXcpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdHRlblJlYWRBY2Nlc3MgPSByZXN1bHQuX3JwZXJtO1xuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbmZpZy5kYXRhYmFzZS5fc2FuaXRpemVEYXRhYmFzZVJlc3VsdCh0aGlzLmRhdGEsIHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3BvbnNlLnVwZGF0ZWRBdCA9IHRoaXMudXBkYXRlZEF0O1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZVJlc3BvbnNlV2l0aERhdGEocmVzcG9uc2UsIHRoaXMuZGF0YSk7XG4gICAgICAgICAgdGhpcy5yZXNwb25zZSA9IHsgcmVzcG9uc2UgfTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0IEFDTCBhbmQgcGFzc3dvcmQgdGltZXN0YW1wIGZvciB0aGUgbmV3IF9Vc2VyXG4gICAgaWYgKHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInKSB7XG4gICAgICB2YXIgQUNMID0gdGhpcy5kYXRhLkFDTDtcbiAgICAgIC8vIGRlZmF1bHQgcHVibGljIHIvdyBBQ0xcbiAgICAgIGlmICghQUNMKSB7XG4gICAgICAgIEFDTCA9IHt9O1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmVuZm9yY2VQcml2YXRlVXNlcnMpIHtcbiAgICAgICAgICBBQ0xbJyonXSA9IHsgcmVhZDogdHJ1ZSwgd3JpdGU6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdXNlciBpcyBub3QgbG9ja2VkIGRvd25cbiAgICAgIEFDTFt0aGlzLmRhdGEub2JqZWN0SWRdID0geyByZWFkOiB0cnVlLCB3cml0ZTogdHJ1ZSB9O1xuICAgICAgdGhpcy5kYXRhLkFDTCA9IEFDTDtcbiAgICAgIC8vIHBhc3N3b3JkIHRpbWVzdGFtcCB0byBiZSB1c2VkIHdoZW4gcGFzc3dvcmQgZXhwaXJ5IHBvbGljeSBpcyBlbmZvcmNlZFxuICAgICAgaWYgKHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkQWdlKSB7XG4gICAgICAgIHRoaXMuZGF0YS5fcGFzc3dvcmRfY2hhbmdlZF9hdCA9IFBhcnNlLl9lbmNvZGUobmV3IERhdGUoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUnVuIGEgY3JlYXRlXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgICAuY3JlYXRlKHRoaXMuY2xhc3NOYW1lLCB0aGlzLmRhdGEsIHRoaXMucnVuT3B0aW9ucywgZmFsc2UsIHRoaXMudmFsaWRTY2hlbWFDb250cm9sbGVyKVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2xhc3NOYW1lICE9PSAnX1VzZXInIHx8IGVycm9yLmNvZGUgIT09IFBhcnNlLkVycm9yLkRVUExJQ0FURV9WQUxVRSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdGhyb3dJZkF1dGhEYXRhRHVwbGljYXRlKGVycm9yKTtcblxuICAgICAgICAvLyBRdWljayBjaGVjaywgaWYgd2Ugd2VyZSBhYmxlIHRvIGluZmVyIHRoZSBkdXBsaWNhdGVkIGZpZWxkIG5hbWVcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnVzZXJJbmZvICYmIGVycm9yLnVzZXJJbmZvLmR1cGxpY2F0ZWRfZmllbGQgPT09ICd1c2VybmFtZScpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5VU0VSTkFNRV9UQUtFTixcbiAgICAgICAgICAgICdBY2NvdW50IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHVzZXJuYW1lLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnVzZXJJbmZvICYmIGVycm9yLnVzZXJJbmZvLmR1cGxpY2F0ZWRfZmllbGQgPT09ICdlbWFpbCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5FTUFJTF9UQUtFTixcbiAgICAgICAgICAgICdBY2NvdW50IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIGVtYWlsIGFkZHJlc3MuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIHdhcyBhIGZhaWxlZCB1c2VyIGNyZWF0aW9uIGR1ZSB0byB1c2VybmFtZSBvciBlbWFpbCBhbHJlYWR5IHRha2VuLCB3ZSBuZWVkIHRvXG4gICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgaXQgd2FzIHVzZXJuYW1lIG9yIGVtYWlsIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGVycm9yLlxuICAgICAgICAvLyBGYWxsYmFjayB0byB0aGUgb3JpZ2luYWwgbWV0aG9kXG4gICAgICAgIC8vIFRPRE86IFNlZSBpZiB3ZSBjYW4gbGF0ZXIgZG8gdGhpcyB3aXRob3V0IGFkZGl0aW9uYWwgcXVlcmllcyBieSB1c2luZyBuYW1lZCBpbmRleGVzLlxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgICAgICAuZmluZChcbiAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB1c2VybmFtZTogdGhpcy5kYXRhLnVzZXJuYW1lLFxuICAgICAgICAgICAgICBvYmplY3RJZDogeyAkbmU6IHRoaXMub2JqZWN0SWQoKSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgbGltaXQ6IDEgfVxuICAgICAgICAgIClcbiAgICAgICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICAgICAgICAgIFBhcnNlLkVycm9yLlVTRVJOQU1FX1RBS0VOLFxuICAgICAgICAgICAgICAgICdBY2NvdW50IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHVzZXJuYW1lLidcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS5maW5kKFxuICAgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgeyBlbWFpbDogdGhpcy5kYXRhLmVtYWlsLCBvYmplY3RJZDogeyAkbmU6IHRoaXMub2JqZWN0SWQoKSB9IH0sXG4gICAgICAgICAgICAgIHsgbGltaXQ6IDEgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuRU1BSUxfVEFLRU4sXG4gICAgICAgICAgICAgICAgJ0FjY291bnQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgZW1haWwgYWRkcmVzcy4nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgIFBhcnNlLkVycm9yLkRVUExJQ0FURV9WQUxVRSxcbiAgICAgICAgICAgICAgJ0EgZHVwbGljYXRlIHZhbHVlIGZvciBhIGZpZWxkIHdpdGggdW5pcXVlIHZhbHVlcyB3YXMgcHJvdmlkZWQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgcmVzcG9uc2Uub2JqZWN0SWQgPSB0aGlzLmRhdGEub2JqZWN0SWQ7XG4gICAgICAgIHJlc3BvbnNlLmNyZWF0ZWRBdCA9IHRoaXMuZGF0YS5jcmVhdGVkQXQ7XG5cbiAgICAgICAgaWYgKHRoaXMucmVzcG9uc2VTaG91bGRIYXZlVXNlcm5hbWUpIHtcbiAgICAgICAgICByZXNwb25zZS51c2VybmFtZSA9IHRoaXMuZGF0YS51c2VybmFtZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91cGRhdGVSZXNwb25zZVdpdGhEYXRhKHJlc3BvbnNlLCB0aGlzLmRhdGEpO1xuICAgICAgICAvLyBSZWFkIGFjY2VzcyBhcyBzdG9yZWRcbiAgICAgICAgY29uc3QgYWNsID0gdGhpcy5kYXRhLkFDTDtcbiAgICAgICAgdGhpcy53cml0dGVuUmVhZEFjY2VzcyA9IGFjbCA/IE9iamVjdC5rZXlzKGFjbCkuZmlsdGVyKGtleSA9PiBhY2xba2V5XS5yZWFkKSA6IG51bGw7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSB7XG4gICAgICAgICAgc3RhdHVzOiAyMDEsXG4gICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgbG9jYXRpb246IHRoaXMubG9jYXRpb24oKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG59O1xuXG4vLyBSZXR1cm5zIG5vdGhpbmcgLSBkb2Vzbid0IHdhaXQgZm9yIHRoZSB0cmlnZ2VyLlxuUmVzdFdyaXRlLnByb3RvdHlwZS5ydW5BZnRlclNhdmVUcmlnZ2VyID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMucmVzcG9uc2UgfHwgIXRoaXMucmVzcG9uc2UucmVzcG9uc2UgfHwgdGhpcy5ydW5PcHRpb25zLm1hbnkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBBdm9pZCBkb2luZyBhbnkgc2V0dXAgZm9yIHRyaWdnZXJzIGlmIHRoZXJlIGlzIG5vICdhZnRlclNhdmUnIHRyaWdnZXIgZm9yIHRoaXMgY2xhc3MuXG4gIGNvbnN0IGhhc0FmdGVyU2F2ZUhvb2sgPSB0cmlnZ2Vycy50cmlnZ2VyRXhpc3RzKFxuICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgIHRyaWdnZXJzLlR5cGVzLmFmdGVyU2F2ZSxcbiAgICB0aGlzLmNvbmZpZy5hcHBsaWNhdGlvbklkXG4gICk7XG4gIGNvbnN0IGhhc0xpdmVRdWVyeSA9IHRoaXMuY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIuaGFzTGl2ZVF1ZXJ5KHRoaXMuY2xhc3NOYW1lKTtcbiAgaWYgKCFoYXNBZnRlclNhdmVIb29rICYmICFoYXNMaXZlUXVlcnkpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBjb25zdCB7IG9yaWdpbmFsT2JqZWN0LCB1cGRhdGVkT2JqZWN0IH0gPSB0aGlzLmJ1aWxkUGFyc2VPYmplY3RzKCk7XG4gIHVwZGF0ZWRPYmplY3QuX2hhbmRsZVNhdmVSZXNwb25zZShcbiAgICB0aGlzLmNsb25lV2l0aEZpbGVVcmxzKHRoaXMucmVzcG9uc2UucmVzcG9uc2UpLFxuICAgIHRoaXMucmVzcG9uc2Uuc3RhdHVzIHx8IDIwMFxuICApO1xuXG4gIGlmIChoYXNMaXZlUXVlcnkpIHtcbiAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgICAgLmxvYWRTY2hlbWEoKVxuICAgICAgLnRoZW4oc2NoZW1hQ29udHJvbGxlciA9PiB7XG4gICAgICAgIC8vIE5vdGlmeSBMaXZlUXVlcnlTZXJ2ZXIgaWYgcG9zc2libGVcbiAgICAgICAgY29uc3QgcGVybXMgPSBzY2hlbWFDb250cm9sbGVyLmdldENsYXNzTGV2ZWxQZXJtaXNzaW9ucyh1cGRhdGVkT2JqZWN0LmNsYXNzTmFtZSk7XG4gICAgICAgIHRoaXMuY29uZmlnLmxpdmVRdWVyeUNvbnRyb2xsZXIub25BZnRlclNhdmUoXG4gICAgICAgICAgdXBkYXRlZE9iamVjdC5jbGFzc05hbWUsXG4gICAgICAgICAgdXBkYXRlZE9iamVjdCxcbiAgICAgICAgICBvcmlnaW5hbE9iamVjdCxcbiAgICAgICAgICBwZXJtc1xuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0xpdmVRdWVyeSBhZnRlclNhdmUgbm90aWZpY2F0aW9uIGZhaWxlZCcsIGVycik7XG4gICAgICB9KTtcbiAgfVxuICBpZiAoIWhhc0FmdGVyU2F2ZUhvb2spIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgLy8gUnVuIGFmdGVyU2F2ZSB0cmlnZ2VyXG4gIHJldHVybiB0cmlnZ2Vyc1xuICAgIC5tYXliZVJ1blRyaWdnZXIoXG4gICAgICB0cmlnZ2Vycy5UeXBlcy5hZnRlclNhdmUsXG4gICAgICB0aGlzLmF1dGgsXG4gICAgICB1cGRhdGVkT2JqZWN0LFxuICAgICAgb3JpZ2luYWxPYmplY3QsXG4gICAgICB0aGlzLmNvbmZpZyxcbiAgICAgIHRoaXMuY29udGV4dFxuICAgIClcbiAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgY29uc3QganNvblJldHVybmVkID0gcmVzdWx0ICYmICFyZXN1bHQuX3RvRnVsbEpTT047XG4gICAgICBpZiAoanNvblJldHVybmVkKSB7XG4gICAgICAgIC8vIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgdGhlIHJlc3BvbnNlIGFzIGlzXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZXNwb25zZUZyb21UcmlnZ2VyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wZW5kaW5nT3BzLm9wZXJhdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXNwb25zZS5yZXNwb25zZSA9IHJlc3VsdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UucmVzcG9uc2UgPSB0aGlzLl91cGRhdGVSZXNwb25zZVdpdGhEYXRhKFxuICAgICAgICAgIChyZXN1bHQgfHwgdXBkYXRlZE9iamVjdCkudG9KU09OKCksXG4gICAgICAgICAgdGhpcy5kYXRhLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KVxuICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybignYWZ0ZXJTYXZlIGNhdWdodCBhbiBlcnJvcicsIGVycik7XG4gICAgfSk7XG59O1xuXG4vLyBBIGhlbHBlciB0byBmaWd1cmUgb3V0IHdoYXQgbG9jYXRpb24gdGhpcyBvcGVyYXRpb24gaGFwcGVucyBhdC5cblJlc3RXcml0ZS5wcm90b3R5cGUubG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBtaWRkbGUgPSB0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJyA/ICcvdXNlcnMvJyA6ICcvY2xhc3Nlcy8nICsgdGhpcy5jbGFzc05hbWUgKyAnLyc7XG4gIGNvbnN0IG1vdW50ID0gdGhpcy5jb25maWcubW91bnQgfHwgdGhpcy5jb25maWcuc2VydmVyVVJMO1xuICByZXR1cm4gbW91bnQgKyBtaWRkbGUgKyB0aGlzLmRhdGEub2JqZWN0SWQ7XG59O1xuXG4vLyBBIGhlbHBlciB0byBnZXQgdGhlIG9iamVjdCBpZCBmb3IgdGhpcyBvcGVyYXRpb24uXG4vLyBCZWNhdXNlIGl0IGNvdWxkIGJlIGVpdGhlciBvbiB0aGUgcXVlcnkgb3Igb24gdGhlIGRhdGFcblJlc3RXcml0ZS5wcm90b3R5cGUub2JqZWN0SWQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLmRhdGEub2JqZWN0SWQgfHwgdGhpcy5xdWVyeS5vYmplY3RJZDtcbn07XG5cbi8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBkYXRhIGFuZCBkZWxldGUgYmFkIGtleXMgKF9hdXRoX2RhdGEsIF9oYXNoZWRfcGFzc3dvcmQuLi4pXG5SZXN0V3JpdGUucHJvdG90eXBlLnNhbml0aXplZERhdGEgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGRhdGEgPSBPYmplY3Qua2V5cyh0aGlzLmRhdGEpLnJlZHVjZSgoZGF0YSwga2V5KSA9PiB7XG4gICAgLy8gUmVnZXhwIGNvbWVzIGZyb20gUGFyc2UuT2JqZWN0LnByb3RvdHlwZS52YWxpZGF0ZVxuICAgIGlmICghL15bQS1aYS16XVswLTlBLVphLXpfXSokLy50ZXN0KGtleSkpIHtcbiAgICAgIGRlbGV0ZSBkYXRhW2tleV07XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9LCB0aGlzLmNsb25lV2l0aEZpbGVVcmxzKHRoaXMuZGF0YSkpO1xuICByZXR1cm4gUGFyc2UuX2RlY29kZSh1bmRlZmluZWQsIGRhdGEpO1xufTtcblxuLy8gQSByYXcgdmlldyBvZiB0aGUgb2JqZWN0J3MgZmllbGRzIChzdG9yZWQgdmFsdWVzIG92ZXJsYWlkIHdpdGggd2hvbGUtZmllbGRcbi8vIHdyaXRlcyBpbiB0aGlzIHJlcXVlc3QpIHVzZWQgdG8gcmVzb2x2ZSB3aGV0aGVyIGEgZG90IG5vdGF0aW9uIGtleSB0YXJnZXRzIGFcbi8vIHBvaW50ZXIncyBvYmplY3QgSUQuXG5SZXN0V3JpdGUucHJvdG90eXBlLl9kb3ROb3RhdGlvbkZpZWxkUm9vdCA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3Qgcm9vdCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMub3JpZ2luYWxEYXRhKTtcbiAgaWYgKHRoaXMuZGF0YSkge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuZGF0YSkpIHtcbiAgICAgIGlmIChrZXkuaW5kZXhPZignLicpIDwgMCkge1xuICAgICAgICByb290W2tleV0gPSB0aGlzLmRhdGFba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJvb3Q7XG59O1xuXG5jb25zdCBwcm9oaWJpdGVkRG90Tm90YXRpb25LZXkgPSBrZXkgPT5cbiAgbmV3IFBhcnNlLkVycm9yKFxuICAgIFBhcnNlLkVycm9yLklOVkFMSURfS0VZX05BTUUsXG4gICAgYFByb2hpYml0ZWQgZG90IG5vdGF0aW9uIGtleSBpbiByZXF1ZXN0IGRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoa2V5KX0uYFxuICApO1xuXG4vLyBWYWx1ZXMgdGhlIFNESyBkZWNvZGVzIHRvIGFuIGluc3RhbmNlIHJhdGhlciB0aGFuIGEgcGxhaW4gb2JqZWN0OiBhbiBvcGVyYXRpb24gb3IgYVxuLy8gdHlwZWQgdmFsdWVcbmNvbnN0IGRlY29kZXNUb0luc3RhbmNlID0gdmFsdWUgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlLl9fb3AgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgc3dpdGNoICh2YWx1ZS5fX3R5cGUpIHtcbiAgICBjYXNlICdQb2ludGVyJzpcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuICEhdmFsdWUuY2xhc3NOYW1lO1xuICAgIGNhc2UgJ1JlbGF0aW9uJzpcbiAgICBjYXNlICdEYXRlJzpcbiAgICBjYXNlICdGaWxlJzpcbiAgICBjYXNlICdHZW9Qb2ludCc6XG4gICAgY2FzZSAnUG9seWdvbic6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vLyBXaGV0aGVyIHRoZSBTREsgd291bGQgcmVzb2x2ZSBhIG5vbi1sZWFmIHNlZ21lbnQgb2YgdGhlIGtleSwgZnJvbSB0aGUgZ2l2ZW4gZGVwdGhcbi8vIG9uLCB0aHJvdWdoIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgdGhlIGNvbnRhaW5lciBpbnN0ZWFkIG9mIGFuIG93biBrZXksIHdyaXRpbmdcbi8vIHRoZSBmaW5hbCBzZWdtZW50IG9udG8gYSBzaGFyZWQgYnVpbHQtaW4uXG5jb25zdCBkZXNjZW5kc0ludG9Qcm90b3R5cGUgPSAoY29udGFpbmVyLCBzZWdtZW50cywgZGVwdGggPSAwKSA9PiB7XG4gIGZvciAobGV0IGkgPSBkZXB0aDsgaSA8IHNlZ21lbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGlmIChjb250YWluZXIgPT09IG51bGwgfHwgdHlwZW9mIGNvbnRhaW5lciAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gQSBmdXJ0aGVyIHNlZ21lbnQgd2Fsa3MgdGhlIHByb3RvdHlwZSBvZiB0aGUgZGVjb2RlZCBpbnN0YW5jZVxuICAgIGlmIChkZWNvZGVzVG9JbnN0YW5jZShjb250YWluZXIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgc2VnbWVudCA9IHNlZ21lbnRzW2ldO1xuICAgIGlmICghaGFzT3duKGNvbnRhaW5lciwgc2VnbWVudCkpIHtcbiAgICAgIC8vIEFuIGluaGVyaXRlZCBtZW1iZXIgb2YgYSBuZXN0ZWQgdmFsdWUgcmVzb2x2ZXMgdG8gYSBzaGFyZWQgYnVpbHQtaW47IHRoZSByb290XG4gICAgICAvLyBoYXMgbm8gcHJvdG90eXBlIGluIHRoZSBTREssIGFuZCBhIG1pc3Npbmcga2V5IGlzIGNyZWF0ZWQgZnJlc2hcbiAgICAgIHJldHVybiBpID4gMCAmJiBzZWdtZW50IGluIGNvbnRhaW5lcjtcbiAgICB9XG4gICAgY29udGFpbmVyID0gY29udGFpbmVyW3NlZ21lbnRdO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8vIFRoZSBjb250YWluZXIgYSB3cml0dGVuIHZhbHVlIHByb3ZpZGVzIGZvciBrZXlzIGJlbG93IGl0OiB0aGUgdmFsdWUgaXRzZWxmLCBvclxuLy8gdGhlIGVsZW1lbnRzIGFuIGFycmF5IG9wZXJhdGlvbiBhZGRzXG5jb25zdCB3cml0dGVuQ29udGFpbmVyID0gdmFsdWUgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZS5fX29wID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlLm9iamVjdHMpID8gdmFsdWUub2JqZWN0cyA6IHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vLyBSZWplY3RzIGEgZG90IG5vdGF0aW9uIGtleSB0aGF0IHRoZSBTREsgd291bGQgYXBwbHkgdGhyb3VnaCBhIHByb3RvdHlwZSBtZW1iZXIgb2Zcbi8vIHRoZSBzdG9yZWQgb2JqZWN0ICh0aGUgdHJpZ2dlciBvYmplY3QgaXMgYnVpbHQgZnJvbSBpdCBiZWZvcmUgdGhlIG90aGVyIGZpZWxkcyBvZlxuLy8gdGhpcyByZXF1ZXN0IGFyZSBhcHBsaWVkKSwgb2YgdGhlIG9iamVjdCBhcyB3cml0dGVuIGJ5IHRoaXMgcmVxdWVzdCwgb3Igb2YgYSB2YWx1ZVxuLy8gYW5vdGhlciBrZXkgb2YgdGhpcyByZXF1ZXN0IHdyaXRlcyBhYm92ZSBpdC5cblJlc3RXcml0ZS5wcm90b3R5cGUudmFsaWRhdGVEb3ROb3RhdGlvbktleXMgPSBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmRhdGEpO1xuICBjb25zdCBrZXlTZXQgPSBuZXcgU2V0KGtleXMpO1xuICBjb25zdCByb290cyA9IFt0aGlzLl9kb3ROb3RhdGlvbkZpZWxkUm9vdCgpXTtcbiAgaWYgKHRoaXMub3JpZ2luYWxEYXRhKSB7XG4gICAgcm9vdHMucHVzaCh0aGlzLm9yaWdpbmFsRGF0YSk7XG4gIH1cbiAgLy8gT25seSBhIGtleSB0aGF0IGlzIGEgcHJlZml4IG9mIHRoaXMga2V5LCBlbmRpbmcgb24gYSBzZWdtZW50IGJvdW5kYXJ5LCB3cml0ZXMgYWJvdmUgaXRcbiAgY29uc3Qgd3JpdHRlbkFib3ZlID0gc2VnbWVudHMgPT4ge1xuICAgIGxldCBwcmVmaXggPSBzZWdtZW50c1swXTtcbiAgICBmb3IgKGxldCBkZXB0aCA9IDE7IGRlcHRoIDwgc2VnbWVudHMubGVuZ3RoIC0gMTsgZGVwdGgrKykge1xuICAgICAgaWYgKGtleVNldC5oYXMocHJlZml4KSkge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB3cml0dGVuQ29udGFpbmVyKHRoaXMuZGF0YVtwcmVmaXhdKTtcbiAgICAgICAgaWYgKGNvbnRhaW5lciAhPT0gdW5kZWZpbmVkICYmIGRlc2NlbmRzSW50b1Byb3RvdHlwZShjb250YWluZXIsIHNlZ21lbnRzLCBkZXB0aCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJlZml4ICs9IGAuJHtzZWdtZW50c1tkZXB0aF19YDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgaWYgKGtleS5pbmRleE9mKCcuJykgPCAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qgc2VnbWVudHMgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICBpZiAocm9vdHMuc29tZShyb290ID0+IGRlc2NlbmRzSW50b1Byb3RvdHlwZShyb290LCBzZWdtZW50cykpIHx8IHdyaXR0ZW5BYm92ZShzZWdtZW50cykpIHtcbiAgICAgIHRocm93IHByb2hpYml0ZWREb3ROb3RhdGlvbktleShrZXkpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gUmV0dXJucyBhbiB1cGRhdGVkIGNvcHkgb2YgdGhlIG9iamVjdFxuUmVzdFdyaXRlLnByb3RvdHlwZS5idWlsZFBhcnNlT2JqZWN0cyA9IGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZXh0cmFEYXRhID0geyBjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lLCBvYmplY3RJZDogdGhpcy5xdWVyeT8ub2JqZWN0SWQgfTtcbiAgbGV0IG9yaWdpbmFsT2JqZWN0O1xuICBpZiAodGhpcy5xdWVyeSAmJiB0aGlzLnF1ZXJ5Lm9iamVjdElkKSB7XG4gICAgb3JpZ2luYWxPYmplY3QgPSB0cmlnZ2Vycy5pbmZsYXRlKGV4dHJhRGF0YSwgdGhpcy5vcmlnaW5hbERhdGEpO1xuICB9XG5cbiAgY29uc3QgY2xhc3NOYW1lID0gUGFyc2UuT2JqZWN0LmZyb21KU09OKGV4dHJhRGF0YSk7XG4gIGNvbnN0IHJlYWRPbmx5QXR0cmlidXRlcyA9IGNsYXNzTmFtZS5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXNcbiAgICA/IGNsYXNzTmFtZS5jb25zdHJ1Y3Rvci5yZWFkT25seUF0dHJpYnV0ZXMoKVxuICAgIDogW107XG5cbiAgLy8gRm9yIF9Sb2xlIGNsYXNzLCAnbmFtZScgY2Fubm90IGJlIHNldCBhZnRlciB0aGUgcm9sZSBoYXMgYW4gb2JqZWN0SWQuXG4gIC8vIEluIGFmdGVyU2F2ZSBjb250ZXh0LCBfaGFuZGxlU2F2ZVJlc3BvbnNlIGhhcyBhbHJlYWR5IHNldCB0aGUgb2JqZWN0SWQsXG4gIC8vIHNvIHdlIHRyZWF0ICduYW1lJyBhcyByZWFkLW9ubHkgdG8gYXZvaWQgUGFyc2UgU0RLIHZhbGlkYXRpb24gZXJyb3JzLlxuICBjb25zdCBpc1JvbGVBZnRlclNhdmUgPSB0aGlzLmNsYXNzTmFtZSA9PT0gJ19Sb2xlJyAmJiB0aGlzLnJlc3BvbnNlICYmICF0aGlzLnF1ZXJ5O1xuICBpZiAoaXNSb2xlQWZ0ZXJTYXZlICYmIHRoaXMuZGF0YS5uYW1lICYmICFyZWFkT25seUF0dHJpYnV0ZXMuaW5jbHVkZXMoJ25hbWUnKSkge1xuICAgIHJlYWRPbmx5QXR0cmlidXRlcy5wdXNoKCduYW1lJyk7XG4gIH1cbiAgaWYgKCF0aGlzLm9yaWdpbmFsRGF0YSkge1xuICAgIGZvciAoY29uc3QgYXR0cmlidXRlIG9mIHJlYWRPbmx5QXR0cmlidXRlcykge1xuICAgICAgZXh0cmFEYXRhW2F0dHJpYnV0ZV0gPSB0aGlzLmRhdGFbYXR0cmlidXRlXTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdXBkYXRlZE9iamVjdCA9IHRyaWdnZXJzLmluZmxhdGUoZXh0cmFEYXRhLCB0aGlzLm9yaWdpbmFsRGF0YSk7XG4gIGNvbnN0IHBvaW50ZXJSb290ID0gdGhpcy5fZG90Tm90YXRpb25GaWVsZFJvb3QoKTtcbiAgT2JqZWN0LmtleXModGhpcy5kYXRhKS5yZWR1Y2UoZnVuY3Rpb24gKGRhdGEsIGtleSkge1xuICAgIGlmIChrZXkuaW5kZXhPZignLicpID4gMCkge1xuICAgICAgLy8gTnVsbCBhbmQgdW5kZWZpbmVkIGFyZSBzZXQgYXQgdGhlaXIgb3duIGRvdCBub3RhdGlvbiBwYXRoLCBsaWtlIGFuIG9wZXJhdGlvblxuICAgICAgaWYgKGRhdGFba2V5XSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhW2tleV0uX19vcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgLy8gQSBkb3Qgbm90YXRpb24ga2V5IHRoYXQgcmVtb3ZlcyBhIHBvaW50ZXIncyBvYmplY3QgSUQgd291bGQgbGVhdmUgdGhlXG4gICAgICAgIC8vIHBvaW50ZXIgdW5zZXJpYWxpemFibGUgYW5kIGJyZWFrIHRoZSB0cmlnZ2VyIG9iamVjdCwgc28gc2tpcCBpdC5cbiAgICAgICAgaWYgKCFyZWFkT25seUF0dHJpYnV0ZXMuaW5jbHVkZXMoa2V5KSAmJiAhdGFyZ2V0c1BvaW50ZXJJZChwb2ludGVyUm9vdCwga2V5KSkge1xuICAgICAgICAgIC8vIFRoZSBTREsga2V5IG5hbWUgcnVsZXMgYXBwbHkgdG8gdG9wLWxldmVsIGZpZWxkcyBvbmx5XG4gICAgICAgICAgdXBkYXRlZE9iamVjdC5zZXQoa2V5LCBkYXRhW2tleV0sIHsgaWdub3JlVmFsaWRhdGlvbjogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3ViZG9jdW1lbnQga2V5IHdpdGggZG90IG5vdGF0aW9uIHsgJ3gueSc6IHYgfSA9PiB7ICd4JzogeyAneScgOiB2IH0gfSlcbiAgICAgICAgY29uc3Qgc3BsaXR0ZWRLZXkgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICAgICAgY29uc3QgcGFyZW50UHJvcCA9IHNwbGl0dGVkS2V5WzBdO1xuICAgICAgICBsZXQgcGFyZW50VmFsID0gdXBkYXRlZE9iamVjdC5nZXQocGFyZW50UHJvcCk7XG4gICAgICAgIGlmICh0eXBlb2YgcGFyZW50VmFsICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHBhcmVudFZhbCA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudFZhbFtzcGxpdHRlZEtleVsxXV0gPSBkYXRhW2tleV07XG4gICAgICAgIHVwZGF0ZWRPYmplY3Quc2V0KHBhcmVudFByb3AsIHBhcmVudFZhbCk7XG4gICAgICB9XG4gICAgICBkZWxldGUgZGF0YVtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbiAgfSwgdGhpcy5jbG9uZVdpdGhGaWxlVXJscyh0aGlzLmRhdGEpKTtcblxuICBjb25zdCBzYW5pdGl6ZWQgPSB0aGlzLnNhbml0aXplZERhdGEoKTtcbiAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgcmVhZE9ubHlBdHRyaWJ1dGVzKSB7XG4gICAgZGVsZXRlIHNhbml0aXplZFthdHRyaWJ1dGVdO1xuICB9XG4gIHVwZGF0ZWRPYmplY3Quc2V0KHNhbml0aXplZCk7XG4gIHJldHVybiB7IHVwZGF0ZWRPYmplY3QsIG9yaWdpbmFsT2JqZWN0IH07XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLmNsZWFuVXNlckF1dGhEYXRhID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5yZXNwb25zZSAmJiB0aGlzLnJlc3BvbnNlLnJlc3BvbnNlICYmIHRoaXMuY2xhc3NOYW1lID09PSAnX1VzZXInKSB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMucmVzcG9uc2UucmVzcG9uc2U7XG4gICAgaWYgKHVzZXIuYXV0aERhdGEpIHtcbiAgICAgIE9iamVjdC5rZXlzKHVzZXIuYXV0aERhdGEpLmZvckVhY2gocHJvdmlkZXIgPT4ge1xuICAgICAgICBpZiAodXNlci5hdXRoRGF0YVtwcm92aWRlcl0gPT09IG51bGwpIHtcbiAgICAgICAgICBkZWxldGUgdXNlci5hdXRoRGF0YVtwcm92aWRlcl07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHVzZXIuYXV0aERhdGEpLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIGRlbGV0ZSB1c2VyLmF1dGhEYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLy8gU3RyaXBzIHByb3RlY3RlZCBmaWVsZHMgZnJvbSB0aGUgd3JpdGUgcmVzcG9uc2Ugd2hlbiBwcm90ZWN0ZWRGaWVsZHNTYXZlUmVzcG9uc2VFeGVtcHQgaXMgZmFsc2UuXG5SZXN0V3JpdGUucHJvdG90eXBlLmZpbHRlclByb3RlY3RlZEZpZWxkc0luUmVzcG9uc2UgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmNvbmZpZy5wcm90ZWN0ZWRGaWVsZHNTYXZlUmVzcG9uc2VFeGVtcHQgIT09IGZhbHNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0aGlzLmF1dGguaXNNYXN0ZXIgfHwgdGhpcy5hdXRoLmlzTWFpbnRlbmFuY2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCF0aGlzLnJlc3BvbnNlIHx8ICF0aGlzLnJlc3BvbnNlLnJlc3BvbnNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNjaGVtYUNvbnRyb2xsZXIgPSBhd2FpdCB0aGlzLmNvbmZpZy5kYXRhYmFzZS5sb2FkU2NoZW1hKCk7XG4gIGNvbnN0IHByb3RlY3RlZEZpZWxkcyA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmFkZFByb3RlY3RlZEZpZWxkcyhcbiAgICBzY2hlbWFDb250cm9sbGVyLFxuICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgIHRoaXMucXVlcnkgPyB7IG9iamVjdElkOiB0aGlzLnF1ZXJ5Lm9iamVjdElkIH0gOiB7fSxcbiAgICB0aGlzLmF1dGgudXNlciA/IFt0aGlzLmF1dGgudXNlci5pZF0uY29uY2F0KHRoaXMuYXV0aC51c2VyUm9sZXMgfHwgW10pIDogW10sXG4gICAgdGhpcy5hdXRoLFxuICAgIHt9XG4gICk7XG4gIGlmICghcHJvdGVjdGVkRmllbGRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMucmVzcG9uc2UucmVzcG9uc2UpKSB7XG4gICAgaWYgKHByb3RlY3RlZEZpZWxkcy5zb21lKGZpZWxkID0+IGtleSA9PT0gZmllbGQgfHwga2V5LnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApKSkge1xuICAgICAgZGVsZXRlIHRoaXMucmVzcG9uc2UucmVzcG9uc2Vba2V5XTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IGhhc093biA9IChvYmplY3QsIGtleSkgPT5cbiAgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdCAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSk7XG5cbi8vIFdoZXRoZXIgYSBkb3Qgbm90YXRpb24gcGF0aCBjYW4gZGVzY2VuZCBpbnRvIHRoZSB2YWx1ZVxuY29uc3QgaXNDb250YWluZXIgPSB2YWx1ZSA9PlxuICB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICF2YWx1ZS5fX3R5cGUgJiYgIXZhbHVlLl9fb3A7XG5cbi8vIFJlYWRzIGEgZG90IG5vdGF0aW9uIHBhdGggdGhyb3VnaCBvd24gcHJvcGVydGllcyBvZiBjb250YWluZXJzIG9ubHlcbmNvbnN0IGdldE93blBhdGggPSAob2JqZWN0LCBwYXRoKSA9PiB7XG4gIGxldCB2YWx1ZSA9IG9iamVjdDtcbiAgZm9yIChjb25zdCBrZXkgb2YgcGF0aCkge1xuICAgIGlmICghaXNDb250YWluZXIodmFsdWUpIHx8ICFoYXNPd24odmFsdWUsIGtleSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhbHVlID0gdmFsdWVba2V5XTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vLyBXaGV0aGVyIGEgZG90IG5vdGF0aW9uIGtleSB0YXJnZXRzIGEgcG9pbnRlcidzIG9iamVjdCBJRCAoYGlkYC9gb2JqZWN0SWRgKS5cbi8vIFJlbW92aW5nIGl0IGxlYXZlcyB0aGUgcG9pbnRlciB1bnNlcmlhbGl6YWJsZSAoYHRvUG9pbnRlcmAgdGhyb3dzKSwgd2hpY2hcbi8vIGNvcnJ1cHRzIHRoZSB0cmlnZ2VyIG9iamVjdDsgb3RoZXIgc3ViLWtleXMgYmVsb3cgYSBwb2ludGVyIGFyZSBsZWZ0IHRvIHRoZVxuLy8gZXhpc3RpbmcgaGFuZGxpbmcuXG5jb25zdCB0YXJnZXRzUG9pbnRlcklkID0gKHJvb3QsIGtleSkgPT4ge1xuICBjb25zdCBzZWdtZW50cyA9IGtleS5zcGxpdCgnLicpO1xuICBmb3IgKGxldCBkZXB0aCA9IDE7IGRlcHRoIDwgc2VnbWVudHMubGVuZ3RoOyBkZXB0aCsrKSB7XG4gICAgY29uc3QgcGFyZW50ID0gZ2V0T3duUGF0aChyb290LCBzZWdtZW50cy5zbGljZSgwLCBkZXB0aCkpO1xuICAgIGlmIChwYXJlbnQgIT09IG51bGwgJiYgdHlwZW9mIHBhcmVudCA9PT0gJ29iamVjdCcgJiYgcGFyZW50Ll9fdHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICBjb25zdCBuZXh0ID0gc2VnbWVudHNbZGVwdGhdO1xuICAgICAgcmV0dXJuIG5leHQgPT09ICdpZCcgfHwgbmV4dCA9PT0gJ29iamVjdElkJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLy8gUmVzdG9yZXMgYSByZXZlcnRlZCBkb3Qgbm90YXRpb24ga2V5IGluIHRoZSByZXNwb25zZVxuUmVzdFdyaXRlLnByb3RvdHlwZS5fcmVzdG9yZVJldmVydGVkUGF0aCA9IGZ1bmN0aW9uIChyZXNwb25zZSwgd3JpdGVEYXRhLCB3cml0dGVuLCBrZXksIGZpbmFsT2JqZWN0KSB7XG4gIC8vIEEgd3JpdGUgYXQgb3IgYmVuZWF0aCB0aGUga2V5IGdvdmVybnNcbiAgaWYgKHdyaXR0ZW4uc29tZShrID0+IGsgPT09IGtleSB8fCBrLnN0YXJ0c1dpdGgoYCR7a2V5fS5gKSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcGF0aCA9IGtleS5zcGxpdCgnLicpO1xuICAvLyBBIHJldHVybmVkIG9iamVjdCB3aXRob3V0IHRoZSBmaWVsZCBsZWF2ZXMgdGhlIHN0b3JlZCB2YWx1ZVxuICBjb25zdCBmcm9tRmluYWwgPSAhIWZpbmFsT2JqZWN0ICYmIGhhc093bihmaW5hbE9iamVjdCwgcGF0aFswXSk7XG4gIGxldCB2YWx1ZSA9IGZyb21GaW5hbCA/IGZpbmFsT2JqZWN0IDogdGhpcy5vcmlnaW5hbERhdGEgfHwge307XG4gIGxldCBkZXB0aCA9IDA7XG4gIGxldCBhdXRob3JpdGF0aXZlID0gZnJvbUZpbmFsO1xuICBpZiAoIWZyb21GaW5hbCkge1xuICAgIC8vIEEgd3JpdHRlbiBhbmNlc3RvciBnb3Zlcm5zOyBjb21wdXRlZCBvcGVyYXRpb25zIGFyZSByZXR1cm5lZCBleHBhbmRlZFxuICAgIGNvbnN0IGFuY2VzdG9yID0gd3JpdHRlblxuICAgICAgLmZpbHRlcihrID0+IGtleS5zdGFydHNXaXRoKGAke2t9LmApKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpWzBdO1xuICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgY29uc3QgYW5jZXN0b3JQYXRoID0gYW5jZXN0b3Iuc3BsaXQoJy4nKTtcbiAgICAgIGxldCByZXR1cm5lZCA9IGdldE93blBhdGgocmVzcG9uc2UsIGFuY2VzdG9yUGF0aCk7XG4gICAgICAvLyBBbiB1bmNoYW5nZWQgY29tcHV0ZWQgcmVzdWx0IGlzIG5vIGxvbmdlciBpbiB0aGUgcmVzcG9uc2VcbiAgICAgIGNvbnN0IG9wID0gd3JpdGVEYXRhW2FuY2VzdG9yXT8uX19vcDtcbiAgICAgIGlmIChyZXR1cm5lZCA9PT0gdW5kZWZpbmVkICYmIG9wICYmIG9wICE9PSAnRGVsZXRlJykge1xuICAgICAgICByZXR1cm5lZCA9IGdldE93blBhdGgodGhpcy5vcmlnaW5hbERhdGEsIGFuY2VzdG9yUGF0aCk7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IHJldHVybmVkICE9PSB1bmRlZmluZWQgPyByZXR1cm5lZCA6IHdyaXRlRGF0YVthbmNlc3Rvcl07XG4gICAgICBpZiAoIWlzQ29udGFpbmVyKHZhbHVlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkZXB0aCA9IGFuY2VzdG9yUGF0aC5sZW5ndGg7XG4gICAgICBhdXRob3JpdGF0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgd2hpbGUgKGRlcHRoIDwgcGF0aC5sZW5ndGggJiYgaXNDb250YWluZXIodmFsdWUpICYmIGhhc093bih2YWx1ZSwgcGF0aFtkZXB0aF0pKSB7XG4gICAgdmFsdWUgPSB2YWx1ZVtwYXRoW2RlcHRoKytdXTtcbiAgfVxuICAvLyBBIG1pc3NpbmcgYXJyYXkgaW5kZXggcmV0dXJucyB0aGUgd2hvbGUgYXJyYXksIHNvIHRoZSBjbGllbnQga2VlcHMgbm8gaG9sZVxuICBjb25zdCBtaXNzaW5nSW5kZXggPSBkZXB0aCA8IHBhdGgubGVuZ3RoICYmIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIC9eXFxkKyQvLnRlc3QocGF0aFtkZXB0aF0pO1xuICBpZiAoZGVwdGggPCBwYXRoLmxlbmd0aCAmJiAhbWlzc2luZ0luZGV4KSB7XG4gICAgaWYgKGlzQ29udGFpbmVyKHZhbHVlKSkge1xuICAgICAgLy8gRGVsZXRlIGF0IHRoZSBmaXJzdCBtaXNzaW5nIGtleVxuICAgICAgZGVwdGgrKztcbiAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAodmFsdWU/Ll9fb3ApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdW5jaGFuZ2VkID0gdXRpbC5pc0RlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGdldE93blBhdGgodGhpcy5vcmlnaW5hbERhdGEsIHBhdGguc2xpY2UoMCwgZGVwdGgpKVxuICAgICAgKTtcbiAgICAgIGlmICghZnJvbUZpbmFsIHx8IHVuY2hhbmdlZCkge1xuICAgICAgICAvLyBDbGVhcnMgdGhlIGNsaWVudCBvcGVyYXRpb24gYmVuZWF0aCBhbiB1bmNoYW5nZWQgdHlwZWQgdmFsdWVcbiAgICAgICAgaWYgKHZhbHVlPy5fX3R5cGUgJiYgdW5jaGFuZ2VkKSB7XG4gICAgICAgICAgcmVzcG9uc2Vba2V5XSA9IHsgX19vcDogJ0RlbGV0ZScgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHRhcmdldCA9IHBhdGguc2xpY2UoMCwgZGVwdGgpLmpvaW4oJy4nKTtcbiAgY29uc3Qga2V5cyA9IFsuLi53cml0dGVuLCAuLi5PYmplY3Qua2V5cyhyZXNwb25zZSldO1xuICBjb25zdCBvdmVybGFwcyA9IHByZWZpeCA9PlxuICAgIGtleXMuc29tZShrID0+IGsgPT09IHByZWZpeCB8fCBrLnN0YXJ0c1dpdGgoYCR7cHJlZml4fS5gKSB8fCBwcmVmaXguc3RhcnRzV2l0aChgJHtrfS5gKSk7XG4gIGlmICghYXV0aG9yaXRhdGl2ZSAmJiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCBtaXNzaW5nSW5kZXgpICYmIG92ZXJsYXBzKHRhcmdldCkpIHtcbiAgICAvLyBBbm90aGVyIHdyaXRlIGNyZWF0ZXMgdGhlIHBhdGg7IGNsZWFyIHRoZSBzaGFsbG93ZXN0IHVudG91Y2hlZCByZXZlcnRlZCBwYXJ0XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAobGV0IGxlbmd0aCA9IGRlcHRoICsgMTsgbGVuZ3RoIDw9IHBhdGgubGVuZ3RoOyBsZW5ndGgrKykge1xuICAgICAgICBjb25zdCBwcmVmaXggPSBwYXRoLnNsaWNlKDAsIGxlbmd0aCkuam9pbignLicpO1xuICAgICAgICBpZiAoIW92ZXJsYXBzKHByZWZpeCkpIHtcbiAgICAgICAgICByZXNwb25zZVtwcmVmaXhdID0geyBfX29wOiAnRGVsZXRlJyB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGNvbnN0IHJlc3BvbnNlS2V5IG9mIE9iamVjdC5rZXlzKHJlc3BvbnNlKSkge1xuICAgIGlmIChyZXNwb25zZUtleS5zdGFydHNXaXRoKGAke3RhcmdldH0uYCkpIHtcbiAgICAgIGRlbGV0ZSByZXNwb25zZVtyZXNwb25zZUtleV07XG4gICAgfVxuICB9XG4gIHJlc3BvbnNlW3RhcmdldF0gPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8geyBfX29wOiAnRGVsZXRlJyB9IDogdmFsdWU7XG59O1xuXG4vLyBXaGV0aGVyIHRoZSByZWFkZXIgY2FuIHJlYWQgdGhlIHdyaXR0ZW4gb2JqZWN0LCBvciB1bmRlZmluZWQgaWYgb25seSBhIHJlYWQgY2FuIHRlbGxcblJlc3RXcml0ZS5wcm90b3R5cGUuX3JlYWRBY2Nlc3NXaXRob3V0UXVlcnkgPSBmdW5jdGlvbiAoYWNsR3JvdXApIHtcbiAgY29uc3QgcmVhZGVycyA9IHRoaXMud3JpdHRlblJlYWRBY2Nlc3M7XG4gIGlmIChyZWFkZXJzID09PSB1bmRlZmluZWQgfHwgKHJlYWRlcnMgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocmVhZGVycykpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvLyBFdmVyeSBjbGllbnQgcmVhZCBhcHBsaWVzIHRoZSBvYmplY3QgQUNMXG4gIGlmIChyZWFkZXJzICYmICFyZWFkZXJzLnNvbWUocmVhZGVyID0+IGFjbEdyb3VwLmluY2x1ZGVzKHJlYWRlcikpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIGFmdGVyU2F2ZSBtYXkgY2hhbmdlIHRoZSBvYmplY3QgYWZ0ZXIgdGhlIHdyaXRlXG4gIGlmICh0cmlnZ2Vycy50cmlnZ2VyRXhpc3RzKHRoaXMuY2xhc3NOYW1lLCB0cmlnZ2Vycy5UeXBlcy5hZnRlclNhdmUsIHRoaXMuY29uZmlnLmFwcGxpY2F0aW9uSWQpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvLyBTeXN0ZW0gY2xhc3NlcyBoYXZlIHRoZWlyIG93biByZWFkIHJ1bGVzLCBleGNlcHQgZm9yIGEgY3JlYXRlZCB1c2VyLCBpbnN0YWxsYXRpb24gb3Igcm9sZVxuICBpZiAoXG4gICAgdGhpcy5jbGFzc05hbWUuc3RhcnRzV2l0aCgnXycpICYmXG4gICAgKHRoaXMucXVlcnkgfHwgIVsnX1VzZXInLCAnX0luc3RhbGxhdGlvbicsICdfUm9sZSddLmluY2x1ZGVzKHRoaXMuY2xhc3NOYW1lKSlcbiAgKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodGhpcy52YWxpZFNjaGVtYUNvbnRyb2xsZXIudGVzdFBlcm1pc3Npb25zRm9yQ2xhc3NOYW1lKHRoaXMuY2xhc3NOYW1lLCBhY2xHcm91cCwgJ2dldCcpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbi8vIFJldHVybnMgc3RvcmVkIHZhbHVlcyBpbiBhIHNhdmUgcmVzcG9uc2Ugb25seSBhcyB0aGUgY2FsbGVyIGNhbiByZWFkIHRoZW1cblJlc3RXcml0ZS5wcm90b3R5cGUuZmlsdGVyVW5yZWFkYWJsZUZpZWxkc0luUmVzcG9uc2UgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5yZXNwb25zZT8ucmVzcG9uc2U7XG4gIGlmICghcmVzcG9uc2UgfHwgdGhpcy5zdG9yYWdlLnJlc3BvbnNlRnJvbVRyaWdnZXIpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gTG9naW4gYW5kIHNlc3Npb24gcmVxdWVzdHMgYnVpbGQgdGhlaXIgb3duIHJlc3BvbnNlXG4gIGlmICghdGhpcy5xdWVyeSAmJiB0aGlzLndyaXR0ZW5SZWFkQWNjZXNzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHRoaXMuYXV0aC5pc01hc3RlciB8fCB0aGlzLmF1dGguaXNNYWludGVuYW5jZSkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBBIHNlc3Npb24gdG9rZW4gaXNzdWVkIGJ5IHRoaXMgcmVxdWVzdCBpcyBub3QgYSBzdG9yZWQgdmFsdWVcbiAgY29uc3QgaXNzdWVkID0gdGhpcy5zdG9yYWdlLmlzc3VlZFNlc3Npb25Ub2tlbjtcbiAgLy8gTm9yIGlzIGEgcmVxdWlyZWQgY29sdW1uIHRoYXQgZWNob2VzIHRoZSBjYWxsZXIncyB1bmNoYW5nZWQgaW5wdXRcbiAgY29uc3QgZWNob2VkID0ga2V5ID0+XG4gICAgKHJlcXVpcmVkQ29sdW1ucy5yZWFkW3RoaXMuY2xhc3NOYW1lXSB8fCBbXSkuaW5jbHVkZXMoa2V5KSAmJlxuICAgICEodGhpcy5zdG9yYWdlLmZpZWxkc0NoYW5nZWRCeVRyaWdnZXIgfHwgW10pLmluY2x1ZGVzKGtleSkgJiZcbiAgICAhKGtleSA9PT0gJ3VzZXJuYW1lJyAmJiB0aGlzLnJlc3BvbnNlU2hvdWxkSGF2ZVVzZXJuYW1lKSAmJlxuICAgIHV0aWwuaXNEZWVwU3RyaWN0RXF1YWwocmVzcG9uc2Vba2V5XSwgdGhpcy5kYXRhW2tleV0pO1xuICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhyZXNwb25zZSkuZmlsdGVyKFxuICAgIGtleSA9PlxuICAgICAgIVsnb2JqZWN0SWQnLCAnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCddLmluY2x1ZGVzKGtleSkgJiZcbiAgICAgICEoa2V5ID09PSAnc2Vzc2lvblRva2VuJyAmJiBpc3N1ZWQgJiYgcmVzcG9uc2Vba2V5XSA9PT0gaXNzdWVkKSAmJlxuICAgICAgIWVjaG9lZChrZXkpXG4gICk7XG4gIGlmICghZmllbGRzLmxlbmd0aCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgcmV2ZXJ0ZWQgPSBbXTtcbiAgLy8gQSBjcmVhdGVkIG9iamVjdCBoYXMgbm8gc3RvcmVkIHZhbHVlIHRvIHJlc3RvcmVcbiAgaWYgKHRoaXMucXVlcnkgJiYgdGhpcy5wZW5kaW5nT3BzLm9wZXJhdGlvbnMpIHtcbiAgICBjb25zdCBzdGF0ZUNvbnRyb2xsZXIgPSBQYXJzZS5Db3JlTWFuYWdlci5nZXRPYmplY3RTdGF0ZUNvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBbcGVuZGluZ10gPSBzdGF0ZUNvbnRyb2xsZXIuZ2V0UGVuZGluZ09wcyh0aGlzLnBlbmRpbmdPcHMuaWRlbnRpZmllcik7XG4gICAgcmV2ZXJ0ZWQgPSBPYmplY3Qua2V5cyh0aGlzLnBlbmRpbmdPcHMub3BlcmF0aW9ucykuZmlsdGVyKGtleSA9PiAhcGVuZGluZ1trZXldKTtcbiAgfVxuICBjb25zdCBrZXlzID0gZmllbGRzLmZpbHRlcihrZXkgPT5cbiAgICByZXZlcnRlZC5zb21lKHBhdGggPT4gcGF0aCA9PT0ga2V5IHx8IHBhdGguc3RhcnRzV2l0aChgJHtrZXl9LmApKVxuICApO1xuICAvLyBBIHNpZ24tdXAgcmVzcG9uc2UgaXMgZm9yIHRoZSBuZXcgdXNlciBpZiBpdCBpc3N1ZXMgdGhlIG5ldyB1c2VyIGEgc2Vzc2lvblxuICBjb25zdCBzaWduVXAgPSAhdGhpcy5xdWVyeSAmJiB0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJyAmJiAhIWlzc3VlZDtcbiAgY29uc3QgYWNsR3JvdXAgPSBzaWduVXAgPyBbJyonLCB0aGlzLmRhdGEub2JqZWN0SWRdIDogdGhpcy5ydW5PcHRpb25zLmFjbCB8fCBbXTtcbiAgY29uc3QgcmVhZGFibGUgPSB0aGlzLl9yZWFkQWNjZXNzV2l0aG91dFF1ZXJ5KGFjbEdyb3VwKTtcbiAgaWYgKHJlYWRhYmxlICYmICFrZXlzLmxlbmd0aCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgdmlldztcbiAgaWYgKHJlYWRhYmxlICE9PSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeSA9IGF3YWl0IFJlc3RRdWVyeSh7XG4gICAgICAgIG1ldGhvZDogUmVzdFF1ZXJ5Lk1ldGhvZC5nZXQsXG4gICAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICAgIGF1dGg6IHNpZ25VcFxuICAgICAgICAgID8gbmV3IEF1dGguQXV0aCh7XG4gICAgICAgICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgICAgICAgaXNNYXN0ZXI6IGZhbHNlLFxuICAgICAgICAgICAgdXNlcjogUGFyc2UuT2JqZWN0LmZyb21KU09OKHsgY2xhc3NOYW1lOiAnX1VzZXInLCBvYmplY3RJZDogdGhpcy5kYXRhLm9iamVjdElkIH0pLFxuICAgICAgICAgICAgaW5zdGFsbGF0aW9uSWQ6IHRoaXMuYXV0aC5pbnN0YWxsYXRpb25JZCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIDogdGhpcy5hdXRoLFxuICAgICAgICBjbGFzc05hbWU6IHRoaXMuY2xhc3NOYW1lLFxuICAgICAgICByZXN0V2hlcmU6IHtcbiAgICAgICAgICAvLyBBIHNlc3Npb24gdXBkYXRlIHdyYXBzIHRoZSBhZGRyZXNzZWQgb2JqZWN0SWRcbiAgICAgICAgICBvYmplY3RJZDogdGhpcy5xdWVyeVxuICAgICAgICAgICAgPyB0aGlzLnF1ZXJ5Lm9iamVjdElkID8/IHRoaXMucXVlcnkuJGFuZD8uWzBdPy5vYmplY3RJZFxuICAgICAgICAgICAgOiB0aGlzLmRhdGEub2JqZWN0SWQsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIEEgc2Vjb25kYXJ5IG1heSBub3QgaGF2ZSB0aGUgd3JpdGUgeWV0XG4gICAgICAgIHJlc3RPcHRpb25zOiB7IHJlYWRQcmVmZXJlbmNlOiAncHJpbWFyeScgfSxcbiAgICAgICAgcnVuQmVmb3JlRmluZDogZmFsc2UsXG4gICAgICAgIHJ1bkFmdGVyRmluZDogZmFsc2UsXG4gICAgICAgIGNvbnRleHQ6IHRoaXMuY29udGV4dCxcbiAgICAgIH0pO1xuICAgICAgdmlldyA9IChhd2FpdCBxdWVyeS5leGVjdXRlKCkpLnJlc3VsdHNbMF07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhaWxzIGNsb3NlZDsgYWNjZXNzIGRlbmlhbCBpcyBleHBlY3RlZFxuICAgICAgY29uc3QgZGVuaWVkID0gW1BhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkRdO1xuICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBQYXJzZS5FcnJvcikgfHwgIWRlbmllZC5pbmNsdWRlcyhlcnJvci5jb2RlKSkge1xuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHJlYWQgdGhlIG9iamVjdCBmb3IgdGhlIHNhdmUgcmVzcG9uc2UnLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghdmlldykge1xuICAgIC8vIE5vIHN0b3JlZCB2YWx1ZXMgZm9yIGEgY2FsbGVyIHdobyBjYW5ub3QgcmVhZCB0aGUgb2JqZWN0XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZmllbGRzKSB7XG4gICAgICBkZWxldGUgcmVzcG9uc2Vba2V5XTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBuZXcgU2V0KGZpZWxkcy5tYXAoa2V5ID0+IGtleS5zcGxpdCgnLicpWzBdKSkpIHtcbiAgICAgIC8vIFRoZSBTREsgY2Fubm90IGFwcGx5IGFuIG9wZXJhdGlvbiB0byBBQ0xcbiAgICAgIGlmIChmaWVsZCAhPT0gJ0FDTCcpIHtcbiAgICAgICAgcmVzcG9uc2VbZmllbGRdID0geyBfX29wOiAnRGVsZXRlJyB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIC8vIFJlbW92ZWQgYmVuZWF0aCBhIGtleSB0aGUgY2FsbGVyIGNhbm5vdCByZWFkXG4gICAgaWYgKCFoYXNPd24ocmVzcG9uc2UsIGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBwYXRoID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRPd25QYXRoKHZpZXcsIHBhdGgpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlS2V5IG9mIE9iamVjdC5rZXlzKHJlc3BvbnNlKSkge1xuICAgICAgICBpZiAocmVzcG9uc2VLZXkuc3RhcnRzV2l0aChgJHtrZXl9LmApKSB7XG4gICAgICAgICAgZGVsZXRlIHJlc3BvbnNlW3Jlc3BvbnNlS2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gJ0FDTCcpIHtcbiAgICAgICAgLy8gVGhlIFNESyBjYW5ub3QgYXBwbHkgYW4gb3BlcmF0aW9uIHRvIEFDTFxuICAgICAgICBkZWxldGUgcmVzcG9uc2Vba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlW2tleV0gPSB7IF9fb3A6ICdEZWxldGUnIH07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh1dGlsLmlzRGVlcFN0cmljdEVxdWFsKHJlc3BvbnNlW2tleV0sIGdldE93blBhdGgodGhpcy5vcmlnaW5hbERhdGEsIHBhdGgpKSkge1xuICAgICAgLy8gVGhlIHN0b3JlZCB2YWx1ZSBhcyB0aGUgY2FsbGVyIHJlYWRzIGl0XG4gICAgICByZXNwb25zZVtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG59O1xuXG5SZXN0V3JpdGUucHJvdG90eXBlLl91cGRhdGVSZXNwb25zZVdpdGhEYXRhID0gZnVuY3Rpb24gKHJlc3BvbnNlLCBkYXRhLCBpc0ZpbmFsT2JqZWN0ID0gZmFsc2UpIHtcbiAgY29uc3Qgc3RhdGVDb250cm9sbGVyID0gUGFyc2UuQ29yZU1hbmFnZXIuZ2V0T2JqZWN0U3RhdGVDb250cm9sbGVyKCk7XG4gIGNvbnN0IFtwZW5kaW5nXSA9IHN0YXRlQ29udHJvbGxlci5nZXRQZW5kaW5nT3BzKHRoaXMucGVuZGluZ09wcy5pZGVudGlmaWVyKTtcbiAgbGV0IHJldmVydGVkRGF0YTtcbiAgY29uc3QgcmV2ZXJ0ZWRQYXRocyA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnBlbmRpbmdPcHMub3BlcmF0aW9ucykge1xuICAgIGlmIChwZW5kaW5nW2tleV0pIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBUaGUgU0RLIGNhbm5vdCBhcHBseSBhbiBvcGVyYXRpb24gb3IgYSBkb3Qgbm90YXRpb24gcGF0aCB0byBBQ0xcbiAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoJ0FDTC4nKSB8fCAoa2V5ID09PSAnQUNMJyAmJiAhaGFzT3duKHRoaXMub3JpZ2luYWxEYXRhLCAnQUNMJykpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICByZXZlcnRlZFBhdGhzLnB1c2goa2V5KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBSZXNwb25zZSBvbmx5OyB0aGUgd3JpdGUgZGF0YSBidWlsZHMgdGhlIGFmdGVyU2F2ZSBhbmQgTGl2ZVF1ZXJ5IG9iamVjdHNcbiAgICByZXZlcnRlZERhdGEgfHw9IHsgLi4uZGF0YSB9O1xuICAgIHJldmVydGVkRGF0YVtrZXldID0gaGFzT3duKHRoaXMub3JpZ2luYWxEYXRhLCBrZXkpXG4gICAgICA/IHRoaXMub3JpZ2luYWxEYXRhW2tleV1cbiAgICAgIDogeyBfX29wOiAnRGVsZXRlJyB9O1xuICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyIHx8PSBbXTtcbiAgICAvLyBPbmNlIG9ubHksIHNvIGFuIGFmdGVyU2F2ZSB1bnNldCBpcyBub3QgdW5kb25lIGJ5IGEgc2Vjb25kIGVudHJ5XG4gICAgaWYgKHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyLmluZGV4T2Yoa2V5KSA8IDApIHtcbiAgICAgIHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyLnB1c2goa2V5KTtcbiAgICB9XG4gIH1cbiAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmV2ZXJ0ZWREYXRhIHx8IGRhdGE7XG4gIC8vIFRoZSBmaW5hbCBvYmplY3QsIGJlZm9yZSB1bmNoYW5nZWQgZmllbGRzIGFyZSByZW1vdmVkIGZyb20gdGhlIHJlc3BvbnNlXG4gIGNvbnN0IGZpbmFsT2JqZWN0ID0gaXNGaW5hbE9iamVjdCAmJiByZXZlcnRlZFBhdGhzLmxlbmd0aCA/IHsgLi4ucmVzcG9uc2UgfSA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2tpcEtleXMgPSBbLi4uKHJlcXVpcmVkQ29sdW1ucy5yZWFkW3RoaXMuY2xhc3NOYW1lXSB8fCBbXSldO1xuICBpZiAoIXRoaXMucXVlcnkpIHtcbiAgICBza2lwS2V5cy5wdXNoKCdvYmplY3RJZCcsICdjcmVhdGVkQXQnKTtcbiAgfSBlbHNlIHtcbiAgICBza2lwS2V5cy5wdXNoKCd1cGRhdGVkQXQnKTtcbiAgICBkZWxldGUgcmVzcG9uc2Uub2JqZWN0SWQ7XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gcmVzcG9uc2UpIHtcbiAgICBpZiAoc2tpcEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gcmVzcG9uc2Vba2V5XTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSA9PSBudWxsIHx8XG4gICAgICAodmFsdWUuX190eXBlICYmIHZhbHVlLl9fdHlwZSA9PT0gJ1BvaW50ZXInKSB8fFxuICAgICAgdXRpbC5pc0RlZXBTdHJpY3RFcXVhbChyZXNwb25zZURhdGFba2V5XSwgdmFsdWUpIHx8XG4gICAgICB1dGlsLmlzRGVlcFN0cmljdEVxdWFsKCh0aGlzLm9yaWdpbmFsRGF0YSB8fCB7fSlba2V5XSwgdmFsdWUpXG4gICAgKSB7XG4gICAgICBkZWxldGUgcmVzcG9uc2Vba2V5XTtcbiAgICB9XG4gIH1cbiAgKHRoaXMuc3RvcmFnZS5maWVsZHNDaGFuZ2VkQnlUcmlnZ2VyIHx8IFtdKS5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XG4gICAgY29uc3QgZGF0YVZhbHVlID0gcmVzcG9uc2VEYXRhW2ZpZWxkTmFtZV07XG5cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXNwb25zZSwgZmllbGROYW1lKSkge1xuICAgICAgcmVzcG9uc2VbZmllbGROYW1lXSA9IGRhdGFWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2VbZmllbGROYW1lXSAmJiByZXNwb25zZVtmaWVsZE5hbWVdLl9fb3ApIHtcbiAgICAgIGRlbGV0ZSByZXNwb25zZVtmaWVsZE5hbWVdO1xuICAgICAgaWYgKGRhdGFWYWx1ZS5fX29wID09ICdEZWxldGUnKSB7XG4gICAgICAgIHJlc3BvbnNlW2ZpZWxkTmFtZV0gPSBkYXRhVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgaWYgKHJldmVydGVkUGF0aHMubGVuZ3RoKSB7XG4gICAgY29uc3Qgd3JpdHRlbiA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHJldmVydGVkUGF0aHMpIHtcbiAgICAgIHRoaXMuX3Jlc3RvcmVSZXZlcnRlZFBhdGgocmVzcG9uc2UsIGRhdGEsIHdyaXR0ZW4sIGtleSwgZmluYWxPYmplY3QpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSZXN0V3JpdGU7XG5tb2R1bGUuZXhwb3J0cyA9IFJlc3RXcml0ZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBYUEsSUFBQUEsVUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxP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
|