@k8slens/injectable 26.1.0 → 26.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/index.js +93 -30
- package/index.d.ts +33 -6
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1096,17 +1096,25 @@ var getRelatedInjectablesFor = ({ injectablesByInjectionToken, injectableSet })
|
|
|
1096
1096
|
};
|
|
1097
1097
|
|
|
1098
1098
|
// src/dependency-injection-container/register.js
|
|
1099
|
-
var registerFor = ({
|
|
1099
|
+
var registerFor = ({
|
|
1100
|
+
registerSingle,
|
|
1101
|
+
injectMany,
|
|
1102
|
+
getApplicableDecorators,
|
|
1103
|
+
resolveInjectionTokenOf,
|
|
1104
|
+
getInjectionTokenOf
|
|
1105
|
+
}) => ({ injectables, context, source }) => {
|
|
1100
1106
|
const flatInjectables = toFlatInjectables_default(injectables);
|
|
1101
1107
|
const phase0Injectables = [];
|
|
1102
1108
|
const registeredRegistrationDecoratorInjectables = [];
|
|
1103
1109
|
const phase2Injectables = [];
|
|
1104
1110
|
for (let i = 0; i < flatInjectables.length; i++) {
|
|
1105
1111
|
const injectable = flatInjectables[i];
|
|
1106
|
-
|
|
1112
|
+
resolveInjectionTokenOf(injectable, context);
|
|
1113
|
+
const injectionToken = getInjectionTokenOf(injectable);
|
|
1114
|
+
if (isRelatedToToken(injectionToken, registrationDecoratorToken)) {
|
|
1107
1115
|
registerSingle(injectable, context);
|
|
1108
1116
|
registeredRegistrationDecoratorInjectables.push(injectable);
|
|
1109
|
-
} else if (isRelatedToToken(
|
|
1117
|
+
} else if (isRelatedToToken(injectionToken, instantiationDecoratorToken)) {
|
|
1110
1118
|
phase0Injectables.push(injectable);
|
|
1111
1119
|
} else {
|
|
1112
1120
|
phase2Injectables.push(injectable);
|
|
@@ -1120,8 +1128,9 @@ var registerFor = ({ registerSingle, injectMany, getApplicableDecorators }) => (
|
|
|
1120
1128
|
instantiationParameters: [],
|
|
1121
1129
|
injectingInjectable: source
|
|
1122
1130
|
});
|
|
1131
|
+
const injectionToken = getInjectionTokenOf(injectable);
|
|
1123
1132
|
for (let j = 0; j < callbacks2.length; j++) {
|
|
1124
|
-
callbacks2[j](injectable);
|
|
1133
|
+
callbacks2[j](injectable, injectionToken);
|
|
1125
1134
|
}
|
|
1126
1135
|
};
|
|
1127
1136
|
const registerThroughPipeline = (injectable) => {
|
|
@@ -1161,8 +1170,9 @@ var registerFor = ({ registerSingle, injectMany, getApplicableDecorators }) => (
|
|
|
1161
1170
|
return;
|
|
1162
1171
|
}
|
|
1163
1172
|
const fireBatchCallbacks = (injectable) => {
|
|
1173
|
+
const injectionToken = getInjectionTokenOf(injectable);
|
|
1164
1174
|
for (let j = 0; j < callbacks.length; j++) {
|
|
1165
|
-
callbacks[j](injectable);
|
|
1175
|
+
callbacks[j](injectable, injectionToken);
|
|
1166
1176
|
}
|
|
1167
1177
|
};
|
|
1168
1178
|
registeredRegistrationDecoratorInjectables.forEach(fireBatchCallbacks);
|
|
@@ -1176,15 +1186,18 @@ var registerSingleFor = ({
|
|
|
1176
1186
|
injectablesByInjectionToken,
|
|
1177
1187
|
injectableAndRegistrationContext,
|
|
1178
1188
|
childrenByParentMap,
|
|
1179
|
-
firePurgeCallbacks
|
|
1189
|
+
firePurgeCallbacks,
|
|
1190
|
+
resolveInjectionTokenOf,
|
|
1191
|
+
getInjectionTokenOf
|
|
1180
1192
|
}) => {
|
|
1181
1193
|
const getNamespacedId = getNamespacedIdFor(injectableAndRegistrationContext);
|
|
1182
1194
|
return (injectable, injectionContext) => {
|
|
1183
|
-
var _a, _b, _c, _d;
|
|
1184
1195
|
const injectableId = injectable.id;
|
|
1185
1196
|
if (!injectableId) {
|
|
1186
1197
|
throw new Error("Tried to register injectable without ID.");
|
|
1187
1198
|
}
|
|
1199
|
+
resolveInjectionTokenOf(injectable, injectionContext);
|
|
1200
|
+
const injectionToken = getInjectionTokenOf(injectable);
|
|
1188
1201
|
for (let i = 0; i < injectionContext.length; i++) {
|
|
1189
1202
|
const parent = injectionContext[i].injectable;
|
|
1190
1203
|
let children = childrenByParentMap.get(parent);
|
|
@@ -1212,13 +1225,13 @@ var registerSingleFor = ({
|
|
|
1212
1225
|
`Tried to register multiple injectables for ID "${namespacedId}"`
|
|
1213
1226
|
);
|
|
1214
1227
|
}
|
|
1215
|
-
const upperBoundedCardinality = (
|
|
1228
|
+
const upperBoundedCardinality = (injectionToken == null ? void 0 : injectionToken.cardinality) === "one" || (injectionToken == null ? void 0 : injectionToken.cardinality) === "zero-or-one" ? injectionToken.cardinality : void 0;
|
|
1216
1229
|
if (upperBoundedCardinality) {
|
|
1217
|
-
const token =
|
|
1230
|
+
const token = injectionToken;
|
|
1218
1231
|
const registered = injectablesByInjectionToken.get(token);
|
|
1219
1232
|
if (registered) {
|
|
1220
1233
|
for (const member of registered) {
|
|
1221
|
-
if (member
|
|
1234
|
+
if (getInjectionTokenOf(member) === token) {
|
|
1222
1235
|
throw new Error(
|
|
1223
1236
|
`Tried to register injectable "${namespacedId}" with injection token "${token.id}", but its cardinality "${upperBoundedCardinality}" allows at most one registration and "${namespacedIdByInjectableMap.get(
|
|
1224
1237
|
member
|
|
@@ -1231,19 +1244,19 @@ var registerSingleFor = ({
|
|
|
1231
1244
|
injectableIdSet.add(namespacedId);
|
|
1232
1245
|
injectableSet.add(injectable);
|
|
1233
1246
|
namespacedIdByInjectableMap.set(injectable, namespacedId);
|
|
1234
|
-
if (
|
|
1247
|
+
if (injectionToken == null ? void 0 : injectionToken.abstract) {
|
|
1235
1248
|
throw new Error(
|
|
1236
|
-
`Tried to register injectable "${namespacedId}" with injection token "${
|
|
1249
|
+
`Tried to register injectable "${namespacedId}" with injection token "${injectionToken.id}", but it is abstract. Use ".for(specifier)" for a concrete token.`
|
|
1237
1250
|
);
|
|
1238
1251
|
}
|
|
1239
|
-
const maxCacheSize = injectable.maxCacheSize ?? (
|
|
1252
|
+
const maxCacheSize = injectable.maxCacheSize ?? (injectionToken == null ? void 0 : injectionToken.maxCacheSize);
|
|
1240
1253
|
if (maxCacheSize > 0 && injectable.lifecycle.id !== "singleton") {
|
|
1241
1254
|
const instanceMap = new LruCompositeMap(maxCacheSize, {
|
|
1242
1255
|
onEvict: (instance, keyArray) => firePurgeCallbacks(injectable, instance, keyArray)
|
|
1243
1256
|
});
|
|
1244
1257
|
instancesByInjectableMap.set(injectable, instanceMap);
|
|
1245
1258
|
}
|
|
1246
|
-
const tokens = getRelatedTokens(
|
|
1259
|
+
const tokens = getRelatedTokens(injectionToken);
|
|
1247
1260
|
for (let t = 0; t < tokens.length; t++) {
|
|
1248
1261
|
const token = tokens[t];
|
|
1249
1262
|
let injectablesSet = injectablesByInjectionToken.get(token);
|
|
@@ -1351,7 +1364,9 @@ var deregisterFor = ({
|
|
|
1351
1364
|
// Todo: get rid of function usage.
|
|
1352
1365
|
getDi,
|
|
1353
1366
|
decoratorCache,
|
|
1354
|
-
syncInjectWiring
|
|
1367
|
+
syncInjectWiring,
|
|
1368
|
+
getInjectionTokenOf,
|
|
1369
|
+
forgetInjectionTokenOf
|
|
1355
1370
|
}) => ({ injectables, context, source }) => {
|
|
1356
1371
|
const callbacks = injectMany({
|
|
1357
1372
|
alias: deregistrationCallbackToken,
|
|
@@ -1360,8 +1375,9 @@ var deregisterFor = ({
|
|
|
1360
1375
|
});
|
|
1361
1376
|
const flatInjectables = toFlatInjectables_default(injectables);
|
|
1362
1377
|
flatInjectables.forEach((injectable) => {
|
|
1378
|
+
const injectionToken = getInjectionTokenOf(injectable);
|
|
1363
1379
|
callbacks.forEach((callback) => {
|
|
1364
|
-
callback(injectable);
|
|
1380
|
+
callback(injectable, injectionToken);
|
|
1365
1381
|
});
|
|
1366
1382
|
});
|
|
1367
1383
|
const di = getDi();
|
|
@@ -1374,15 +1390,18 @@ var deregisterFor = ({
|
|
|
1374
1390
|
injectableIdSet,
|
|
1375
1391
|
namespacedIdByInjectableMap,
|
|
1376
1392
|
childrenByParentMap,
|
|
1377
|
-
di
|
|
1393
|
+
di,
|
|
1394
|
+
getInjectionTokenOf,
|
|
1395
|
+
forgetInjectionTokenOf
|
|
1378
1396
|
});
|
|
1379
1397
|
let injectWiringChanged = false;
|
|
1380
1398
|
flatInjectables.forEach((injectable) => {
|
|
1381
|
-
|
|
1399
|
+
const injectionToken = getInjectionTokenOf(injectable);
|
|
1400
|
+
if (isRelatedToToken(injectionToken, injectionDecoratorToken)) {
|
|
1382
1401
|
decoratorCache.injection = null;
|
|
1383
1402
|
injectWiringChanged = true;
|
|
1384
1403
|
}
|
|
1385
|
-
if (isRelatedToToken(
|
|
1404
|
+
if (isRelatedToToken(injectionToken, preInjectCallbackToken)) {
|
|
1386
1405
|
decoratorCache.preInject = null;
|
|
1387
1406
|
injectWiringChanged = true;
|
|
1388
1407
|
}
|
|
@@ -1411,7 +1430,9 @@ var deregisterSingleFor = ({
|
|
|
1411
1430
|
injectableIdSet,
|
|
1412
1431
|
namespacedIdByInjectableMap,
|
|
1413
1432
|
childrenByParentMap,
|
|
1414
|
-
di
|
|
1433
|
+
di,
|
|
1434
|
+
getInjectionTokenOf,
|
|
1435
|
+
forgetInjectionTokenOf
|
|
1415
1436
|
}) => (injectable) => {
|
|
1416
1437
|
if (isInjectionToken_default(injectable)) {
|
|
1417
1438
|
throw new Error(
|
|
@@ -1441,12 +1462,13 @@ var deregisterSingleFor = ({
|
|
|
1441
1462
|
injectableIdSet.delete(namespacedId);
|
|
1442
1463
|
injectableSet.delete(injectable);
|
|
1443
1464
|
namespacedIdByInjectableMap.delete(injectable);
|
|
1444
|
-
const tokens = getRelatedTokens(injectable
|
|
1465
|
+
const tokens = getRelatedTokens(getInjectionTokenOf(injectable));
|
|
1445
1466
|
tokens.forEach((token) => {
|
|
1446
1467
|
const tokenSet = injectablesByInjectionToken.get(token);
|
|
1447
1468
|
tokenSet.delete(injectable);
|
|
1448
1469
|
invalidateRelatedInjectablesCache(tokenSet);
|
|
1449
1470
|
});
|
|
1471
|
+
forgetInjectionTokenOf(injectable);
|
|
1450
1472
|
overridingInjectables.delete(injectable);
|
|
1451
1473
|
};
|
|
1452
1474
|
|
|
@@ -1710,7 +1732,7 @@ var firePurgeCallbacksFor = ({ getApplicableDecorators }) => (injectable, instan
|
|
|
1710
1732
|
|
|
1711
1733
|
// src/dependency-injection-container/getApplicableDecoratorsFor.js
|
|
1712
1734
|
var EMPTY2 = Object.freeze([]);
|
|
1713
|
-
var getApplicableDecoratorsFor = ({ injectMany, injectablesByInjectionToken }) => ({ decoratorToken, target, injectingInjectable }) => {
|
|
1735
|
+
var getApplicableDecoratorsFor = ({ injectMany, injectablesByInjectionToken, getInjectionTokenOf }) => ({ decoratorToken, target, injectingInjectable }) => {
|
|
1714
1736
|
const registered = injectablesByInjectionToken.get(decoratorToken);
|
|
1715
1737
|
if (!registered || registered.size === 0) {
|
|
1716
1738
|
return EMPTY2;
|
|
@@ -1730,7 +1752,7 @@ var getApplicableDecoratorsFor = ({ injectMany, injectablesByInjectionToken }) =
|
|
|
1730
1752
|
};
|
|
1731
1753
|
dispatch(decoratorToken.for(target));
|
|
1732
1754
|
const chain = getRelatedTokens(
|
|
1733
|
-
target
|
|
1755
|
+
getInjectionTokenOf(target) ?? target.specificTokenOf
|
|
1734
1756
|
);
|
|
1735
1757
|
for (const t of chain) {
|
|
1736
1758
|
dispatch(decoratorToken.for(t));
|
|
@@ -1758,6 +1780,38 @@ var getApplicableDecoratorsFor = ({ injectMany, injectablesByInjectionToken }) =
|
|
|
1758
1780
|
return out;
|
|
1759
1781
|
};
|
|
1760
1782
|
|
|
1783
|
+
// src/dependency-injection-container/injectionTokenResolutionFor.js
|
|
1784
|
+
var isInjectionTokenResolver = (maybeResolver) => typeof maybeResolver === "function" && !isInjectionToken_default(maybeResolver);
|
|
1785
|
+
var injectionTokenResolutionFor = ({
|
|
1786
|
+
injectableAndRegistrationContext
|
|
1787
|
+
}) => {
|
|
1788
|
+
const getScopedId = getScopedIdFor(injectableAndRegistrationContext);
|
|
1789
|
+
const resolvedTokenByInjectable = /* @__PURE__ */ new WeakMap();
|
|
1790
|
+
const resolveInjectionTokenOf = (injectable, registrationContext) => {
|
|
1791
|
+
const resolver = injectable.injectionToken;
|
|
1792
|
+
if (!isInjectionTokenResolver(resolver)) {
|
|
1793
|
+
return;
|
|
1794
|
+
}
|
|
1795
|
+
const owner = registrationContext[registrationContext.length - 1];
|
|
1796
|
+
const scopeIds = !owner || owner.injectable.aliasType === "container" ? [] : getScopedId(owner.injectable);
|
|
1797
|
+
const token = resolver({ scopeIds });
|
|
1798
|
+
if (!isInjectionToken_default(token)) {
|
|
1799
|
+
throw new Error(
|
|
1800
|
+
`Tried to register injectable "${injectable.id}", but its injection token resolver returned something that is not an injection token.`
|
|
1801
|
+
);
|
|
1802
|
+
}
|
|
1803
|
+
resolvedTokenByInjectable.set(injectable, token);
|
|
1804
|
+
};
|
|
1805
|
+
const getInjectionTokenOf = (aliasOrInjectable) => {
|
|
1806
|
+
const tokenOrResolver = aliasOrInjectable.injectionToken;
|
|
1807
|
+
return isInjectionTokenResolver(tokenOrResolver) ? resolvedTokenByInjectable.get(aliasOrInjectable) : tokenOrResolver;
|
|
1808
|
+
};
|
|
1809
|
+
const forgetInjectionTokenOf = (injectable) => {
|
|
1810
|
+
resolvedTokenByInjectable.delete(injectable);
|
|
1811
|
+
};
|
|
1812
|
+
return { resolveInjectionTokenOf, getInjectionTokenOf, forgetInjectionTokenOf };
|
|
1813
|
+
};
|
|
1814
|
+
|
|
1761
1815
|
// src/dependency-injection-container/createContainer.js
|
|
1762
1816
|
var createContainer_default = (containerId) => {
|
|
1763
1817
|
const injectableSet = /* @__PURE__ */ new Set();
|
|
@@ -1779,6 +1833,7 @@ var createContainer_default = (containerId) => {
|
|
|
1779
1833
|
const childrenByParentMap = /* @__PURE__ */ new Map();
|
|
1780
1834
|
const getNamespacedId = getNamespacedIdFor(injectableAndRegistrationContext);
|
|
1781
1835
|
const getScopedId = getScopedIdFor(injectableAndRegistrationContext);
|
|
1836
|
+
const { resolveInjectionTokenOf, getInjectionTokenOf, forgetInjectionTokenOf } = injectionTokenResolutionFor({ injectableAndRegistrationContext });
|
|
1782
1837
|
const getRelatedInjectables = getRelatedInjectablesFor({
|
|
1783
1838
|
injectablesByInjectionToken,
|
|
1784
1839
|
injectableSet
|
|
@@ -1804,7 +1859,8 @@ var createContainer_default = (containerId) => {
|
|
|
1804
1859
|
});
|
|
1805
1860
|
const getApplicableDecorators = getApplicableDecoratorsFor({
|
|
1806
1861
|
injectMany: nonDecoratedPrivateInjectMany,
|
|
1807
|
-
injectablesByInjectionToken
|
|
1862
|
+
injectablesByInjectionToken,
|
|
1863
|
+
getInjectionTokenOf
|
|
1808
1864
|
});
|
|
1809
1865
|
const getSideEffectsArePrevented = (injectable) => sideEffectsArePrevented && injectable.causesSideEffects && !injectablesWithPermittedSideEffects.has(injectable);
|
|
1810
1866
|
const checkForSideEffects = checkForSideEffectsFor({
|
|
@@ -1919,16 +1975,19 @@ var createContainer_default = (containerId) => {
|
|
|
1919
1975
|
injectableIdSet,
|
|
1920
1976
|
injectableAndRegistrationContext,
|
|
1921
1977
|
childrenByParentMap,
|
|
1922
|
-
firePurgeCallbacks
|
|
1978
|
+
firePurgeCallbacks,
|
|
1979
|
+
resolveInjectionTokenOf,
|
|
1980
|
+
getInjectionTokenOf
|
|
1923
1981
|
});
|
|
1924
1982
|
const registerSingle = (injectable, context) => {
|
|
1925
1983
|
rawRegisterSingle(injectable, context);
|
|
1984
|
+
const injectionToken = getInjectionTokenOf(injectable);
|
|
1926
1985
|
let wiringChanged = false;
|
|
1927
|
-
if (isRelatedToToken(
|
|
1986
|
+
if (isRelatedToToken(injectionToken, injectionDecoratorToken)) {
|
|
1928
1987
|
decoratorCache.injection = null;
|
|
1929
1988
|
wiringChanged = true;
|
|
1930
1989
|
}
|
|
1931
|
-
if (isRelatedToToken(
|
|
1990
|
+
if (isRelatedToToken(injectionToken, preInjectCallbackToken)) {
|
|
1932
1991
|
decoratorCache.preInject = null;
|
|
1933
1992
|
wiringChanged = true;
|
|
1934
1993
|
}
|
|
@@ -1967,12 +2026,16 @@ var createContainer_default = (containerId) => {
|
|
|
1967
2026
|
// Todo: get rid of function usage.
|
|
1968
2027
|
getDi: () => privateDi,
|
|
1969
2028
|
decoratorCache,
|
|
1970
|
-
syncInjectWiring
|
|
2029
|
+
syncInjectWiring,
|
|
2030
|
+
getInjectionTokenOf,
|
|
2031
|
+
forgetInjectionTokenOf
|
|
1971
2032
|
});
|
|
1972
2033
|
const privateRegister = registerFor({
|
|
1973
2034
|
registerSingle,
|
|
1974
2035
|
injectMany: nonDecoratedPrivateInjectMany,
|
|
1975
|
-
getApplicableDecorators
|
|
2036
|
+
getApplicableDecorators,
|
|
2037
|
+
resolveInjectionTokenOf,
|
|
2038
|
+
getInjectionTokenOf
|
|
1976
2039
|
});
|
|
1977
2040
|
const earlyOverride = earlyOverrideFor({
|
|
1978
2041
|
getRelatedInjectables,
|
|
@@ -2203,4 +2266,4 @@ var getKeyedSingletonCompositeKey = getCompositeKey;
|
|
|
2203
2266
|
registrationDecoratorToken,
|
|
2204
2267
|
toFlatInjectables
|
|
2205
2268
|
});
|
|
2206
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXguanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtLmpzIiwgIi4uL3NyYy9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5LmpzIiwgIi4uL3NyYy9nZXRJbmplY3RhYmxlL2dldEluamVjdGFibGUuanMiLCAiLi4vc3JjL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyLmpzIiwgIi4uL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9pbmplY3Rpb25Ub2tlblRhZy5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0SW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjIuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b2tlbnMuanMiLCAiLi4vc3JjL2NvbXBvc2l0ZS1tYXAvY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2Zhc3RGbG93LmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdEZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3dpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdE1hbnlGb3IuanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9nZXRTY29wZWRJZEZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldE5hbWVzcGFjZWRJZEZvci5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0YWJsZUJ1bmNoL2dldEluamVjdGFibGVCdW5jaC5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0YWJsZUJ1bmNoL2lzSW5qZWN0YWJsZUJ1bmNoLmpzIiwgIi4uL3NyYy9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZS5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3RvRmxhdEluamVjdGFibGVzLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvZ2V0UmVsYXRlZFRva2Vucy5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldFJlbGF0ZWRJbmplY3RhYmxlc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3JlZ2lzdGVyLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHVyZ2VJbnN0YW5jZXMuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9kZXJlZ2lzdGVyLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvb3ZlcnJpZGUuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9jaGVja0Zvck5vTWF0Y2hlc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NoZWNrRm9yVG9vTWFueU1hdGNoZXMuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9jaGVja0ZvclNpZGVFZmZlY3RzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JVbmRlY2xhcmVkQ29uc3VtcHRpb25Gb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci92YWxpZGF0ZS5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2Vhcmx5LW92ZXJyaWRlLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvd2l0aFByZUluamVjdENhbGxiYWNrc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2ZpcmVQdXJnZUNhbGxiYWNrc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY3JlYXRlQ29udGFpbmVyLmpzIiwgIi4uL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9nZXRUeXBlZFNwZWNpZmllci5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IGNyZWF0ZUNvbnRhaW5lciBmcm9tICcuL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY3JlYXRlQ29udGFpbmVyJztcblxuaW1wb3J0IGdldEluamVjdGFibGUgZnJvbSAnLi9zcmMvZ2V0SW5qZWN0YWJsZS9nZXRJbmplY3RhYmxlJztcbmltcG9ydCBnZXRJbmplY3RhYmxlMiBmcm9tICcuL3NyYy9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5pbXBvcnQgaXNJbmplY3RhYmxlIGZyb20gJy4vc3JjL2dldEluamVjdGFibGUvaXNJbmplY3RhYmxlJztcbmltcG9ydCBsaWZlY3ljbGVFbnVtIGZyb20gJy4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtJztcblxuaW1wb3J0IHtcbiAgZ2V0SW5qZWN0aW9uVG9rZW4sXG4gIGdldFNwZWNpZmljSW5qZWN0aW9uVG9rZW4sXG59IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2dldEluamVjdGlvblRva2VuJztcblxuaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSAnLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4yL2dldEluamVjdGlvblRva2VuMic7XG5cbmltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuXG5pbXBvcnQgZ2V0SW5qZWN0YWJsZUJ1bmNoIGZyb20gJy4vc3JjL2dldEluamVjdGFibGVCdW5jaC9nZXRJbmplY3RhYmxlQnVuY2gnO1xuaW1wb3J0IGlzSW5qZWN0YWJsZUJ1bmNoIGZyb20gJy4vc3JjL2dldEluamVjdGFibGVCdW5jaC9pc0luamVjdGFibGVCdW5jaCc7XG5pbXBvcnQgdG9GbGF0SW5qZWN0YWJsZXMgZnJvbSAnLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3RvRmxhdEluamVjdGFibGVzJztcbmltcG9ydCB7IGdldENvbXBvc2l0ZUtleSB9IGZyb20gJy4vc3JjL2dldENvbXBvc2l0ZUtleS9nZXRDb21wb3NpdGVLZXknO1xuXG5leHBvcnQgeyBnZXRUeXBlZFNwZWNpZmllciB9IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2dldFR5cGVkU3BlY2lmaWVyJztcbmV4cG9ydCB7IGluamVjdGlvblRva2VuVGFnIH0gZnJvbSAnLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vaW5qZWN0aW9uVG9rZW5UYWcnO1xuXG5leHBvcnQgY29uc3QgZ2V0S2V5ZWRTaW5nbGV0b25Db21wb3NpdGVLZXkgPSBnZXRDb21wb3NpdGVLZXk7XG5cblxuXG5leHBvcnQge1xuICBkZXJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gIGRlcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbixcbiAgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICBwcmVJbmplY3RDYWxsYmFja1Rva2VuLFxuICByZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbn0gZnJvbSAnLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3Rva2Vucyc7XG5cbmV4cG9ydCB7XG4gIGNyZWF0ZUNvbnRhaW5lcixcbiAgZ2V0SW5qZWN0YWJsZSxcbiAgZ2V0SW5qZWN0YWJsZTIsXG4gIGlzSW5qZWN0YWJsZSxcbiAgZ2V0SW5qZWN0YWJsZUJ1bmNoLFxuICBpc0luamVjdGFibGVCdW5jaCxcbiAgZ2V0SW5qZWN0aW9uVG9rZW4sXG4gIGdldEluamVjdGlvblRva2VuMixcbiAgZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbixcbiAgaXNJbmplY3Rpb25Ub2tlbixcbiAgbGlmZWN5Y2xlRW51bSxcbiAgdG9GbGF0SW5qZWN0YWJsZXMsXG59O1xuIiwgImV4cG9ydCBjb25zdCBub25TdG9yZWRJbnN0YW5jZUtleSA9IFN5bWJvbCgnbm9uLXN0b3JlZC1pbnN0YW5jZS1rZXknKTtcbmV4cG9ydCBjb25zdCBzdG9yZWRJbnN0YW5jZUtleSA9IFN5bWJvbCgnc3RvcmVkLWluc3RhbmNlLWtleScpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNpbmdsZXRvbjoge1xuICAgIGlkOiAnc2luZ2xldG9uJyxcblxuICAgIGdldEluc3RhbmNlS2V5OiAoKSA9PiBzdG9yZWRJbnN0YW5jZUtleSxcbiAgfSxcblxuICBrZXllZFNpbmdsZXRvbjogKHsgZ2V0SW5zdGFuY2VLZXkgfSkgPT4gKHtcbiAgICBpZDogJ2tleWVkU2luZ2xldG9uJyxcbiAgICBnZXRJbnN0YW5jZUtleSxcbiAgfSksXG5cbiAgdHJhbnNpZW50OiB7XG4gICAgaWQ6ICd0cmFuc2llbnQnLFxuICAgIGdldEluc3RhbmNlS2V5OiAoKSA9PiBub25TdG9yZWRJbnN0YW5jZUtleSxcbiAgfSxcbn07XG4iLCAiZXhwb3J0IGNvbnN0IGNvbXBvc2l0ZUtleVN5bWJvbCA9IFN5bWJvbCgnY29tcG9zaXRlLWtleScpO1xuZXhwb3J0IGNvbnN0IGdldENvbXBvc2l0ZUtleSA9ICguLi5rZXlzKSA9PiAoe1xuICBbY29tcG9zaXRlS2V5U3ltYm9sXTogdHJ1ZSxcbiAga2V5cyxcbn0pO1xuXG5leHBvcnQgY29uc3QgaXNDb21wb3NpdGVLZXkgPSB0aGluZyA9PlxuICB0aGluZyAmJiB0aGluZ1tjb21wb3NpdGVLZXlTeW1ib2xdID09PSB0cnVlO1xuIiwgImltcG9ydCBsaWZlY3ljbGVFbnVtIGZyb20gJy4uL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtJztcblxuZXhwb3J0IGNvbnN0IGluamVjdGFibGVTeW1ib2wgPSAnaW5qZWN0YWJsZSc7XG5cbmV4cG9ydCBkZWZhdWx0ICh7IGxpZmVjeWNsZSA9IGxpZmVjeWNsZUVudW0uc2luZ2xldG9uLCAuLi5pbmplY3RhYmxlIH0pID0+ICh7XG4gIGFsaWFzVHlwZTogaW5qZWN0YWJsZVN5bWJvbCxcbiAgbGlmZWN5Y2xlLFxuICAuLi5pbmplY3RhYmxlLFxufSk7XG4iLCAiaW1wb3J0IGxpZmVjeWNsZUVudW0gZnJvbSAnLi4vZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgc3RvcmVkSW5zdGFuY2VLZXkgfSBmcm9tICcuLi9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvbGlmZWN5Y2xlRW51bSc7XG5pbXBvcnQgeyBnZXRDb21wb3NpdGVLZXkgfSBmcm9tICcuLi9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5JztcblxuZXhwb3J0IGNvbnN0IGluamVjdGFibGVTeW1ib2wyID0gJ2luamVjdGFibGUyJztcblxuLy8gSG9pc3RlZCBhbmQgc2hhcmVkIGFjcm9zcyBldmVyeSBub24tdHJhbnNpZW50IGdldEluamVjdGFibGUyIFx1MjAxNCBzYXZlcyBhXG4vLyBwZXItY2FsbCBsaWZlY3ljbGUgYWxsb2NhdGlvbiwgYW5kIHRoZSBgX2lzVjJEZWZhdWx0TGlmZWN5Y2xlYCB0YWcgbGV0c1xuLy8gcHJpdmF0ZUluamVjdEZvciBza2lwIHRoZSBnZXRJbnN0YW5jZUtleSBjYWxsICsga2V5LWFycmF5IGFsbG9jYXRpb24gd2hlblxuLy8gYSB2MiBpbmplY3RhYmxlIGlzIGluamVjdGVkIHdpdGggbm8gYXJncyAodGhlIGNvbW1vbiBjYXNlIGZvclxuLy8gbm9uLXBhcmFtZXRyaWMgdjIpLiBUaGUgdGFnIGlzIHRoZSAqb25seSogc2lnbmFsIHdlIHRydXN0IHRvIGJ5cGFzc1xuLy8gZ2V0SW5zdGFuY2VLZXkgYmVjYXVzZSB1c2VyLXByb3ZpZGVkIGdldEluc3RhbmNlS2V5IG1heSBsZWdpdGltYXRlbHlcbi8vIHJldHVybiBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc3RvcmVkSW5zdGFuY2VLZXlgIGZvciBlbXB0eSBhcmdzLlxuY29uc3QgdjJEZWZhdWx0TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRW51bS5rZXllZFNpbmdsZXRvbih7XG4gIGdldEluc3RhbmNlS2V5OiAoZGksIC4uLmFyZ3MpID0+IHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiBzdG9yZWRJbnN0YW5jZUtleTtcbiAgICByZXR1cm4gZ2V0Q29tcG9zaXRlS2V5KC4uLmFyZ3MpO1xuICB9LFxufSk7XG5cbnYyRGVmYXVsdExpZmVjeWNsZS5faXNWMkRlZmF1bHRMaWZlY3ljbGUgPSB0cnVlO1xuXG5leHBvcnQgZGVmYXVsdCAoeyBpbnN0YW50aWF0ZSwgdHJhbnNpZW50ID0gZmFsc2UsIC4uLnJlc3QgfSkgPT4gKHtcbiAgYWxpYXNUeXBlOiBpbmplY3RhYmxlU3ltYm9sMixcbiAgaW5zdGFudGlhdGUsXG4gIHRyYW5zaWVudCxcbiAgbGlmZWN5Y2xlOiB0cmFuc2llbnQgPyBsaWZlY3ljbGVFbnVtLnRyYW5zaWVudCA6IHYyRGVmYXVsdExpZmVjeWNsZSxcbiAgLi4ucmVzdCxcbn0pO1xuIiwgIi8vIFRoZSBpbml0aWFsIHRhZyBjYXJyaWVkIGJ5IGV2ZXJ5IGluamVjdGlvbiB0b2tlbiAodjEgYW5kIHYyKSwgcGVybWl0dGluZ1xuLy8gdGFnLWtleWVkIGRlY29yYXRvcnMgdG8gdGFyZ2V0IGFueSB0b2tlbiwgZS5nLlxuLy8gYGluamVjdGlvbkRlY29yYXRvclRva2VuLmZvcihpbmplY3Rpb25Ub2tlblRhZylgLlxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuVGFnID0gJ2luamVjdGlvblRva2VuJztcbiIsICJpbXBvcnQgeyBpbmplY3Rpb25Ub2tlblRhZyB9IGZyb20gJy4vaW5qZWN0aW9uVG9rZW5UYWcnO1xuXG5leHBvcnQgY29uc3QgaW5qZWN0aW9uVG9rZW5TeW1ib2wgPSAnaW5qZWN0aW9uLXRva2VuJztcblxuZXhwb3J0IGNvbnN0IGdldEluamVjdGlvblRva2VuID0gKHtcbiAgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3Rvcnk6IHNwZWNpZmljVG9rZW5GYWN0b3J5ID0gZ2V0U3BlY2lmaWNUb2tlbkJ5SWQsXG5cbiAgdGFyZ2V0LFxuXG4gIHRhZ3MsXG5cbiAgLi4ucmVzdFxufSkgPT4ge1xuICBjb25zdCBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eSA9IG5ldyBNYXAoKTtcblxuICAvLyBUaGUgZmFjdG9yeSBpcyBhc3N1bWVkIHB1cmUgYW5kIGRldGVybWluaXN0aWM6IGEgc3BlY2lmaWVyIGFsd2F5cyBtYXBzXG4gIC8vIHRvIHRoZSBzYW1lIHRva2VuLCBzbyBzaW5nbGUtc3BlY2lmaWVyIGNhbGxzIGFyZSBtZW1vaXplZCBieSBzcGVjaWZpZXJcbiAgLy8gdG8gc2tpcCBjb25zdHJ1Y3RpbmcgYSB0aHJvd2F3YXkgY2FuZGlkYXRlIG9uIHJlcGVhdCBgLmZvcigpYCBjYWxscy5cbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllciA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZW5lcmFsVG9rZW4gPSBPYmplY3QuYXNzaWduKHRhcmdldCA/PyB7fSwge1xuICAgIC4uLnJlc3QsXG5cbiAgICB0YWdzOiBbaW5qZWN0aW9uVG9rZW5UYWcsIC4uLih0YWdzID8/IFtdKV0sXG5cbiAgICBhbGlhc1R5cGU6IGluamVjdGlvblRva2VuU3ltYm9sLFxuXG4gICAgZm9yOiAoLi4uc3BlY2lmaWVycykgPT4ge1xuICAgICAgY29uc3QgbWVtb2l6ZWRUb2tlbiA9XG4gICAgICAgIHNwZWNpZmllcnMubGVuZ3RoID09PSAxXG4gICAgICAgICAgPyBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLmdldChzcGVjaWZpZXJzWzBdKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobWVtb2l6ZWRUb2tlbikge1xuICAgICAgICByZXR1cm4gbWVtb2l6ZWRUb2tlbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3BlY2lmaWNUb2tlbkNhbmRpZGF0ZSA9IHNwZWNpZmljVG9rZW5GYWN0b3J5KC4uLnNwZWNpZmllcnMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5nZXQoXG4gICAgICAgIHNwZWNpZmljVG9rZW5DYW5kaWRhdGUuc3BlY2lhbGl0eSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChleGlzdGluZ1NwZWNpZmljVG9rZW4pIHtcbiAgICAgICAgaWYgKHNwZWNpZmllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgZXhpc3RpbmdTcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGlzdGluZ1NwZWNpZmljVG9rZW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlO1xuXG4gICAgICBzcGVjaWZpY1Rva2VuLmlkID0gYCR7Z2VuZXJhbFRva2VuLmlkfS8ke3NwZWNpZmljVG9rZW4uaWR9YDtcbiAgICAgIHNwZWNpZmljVG9rZW4uc3BlY2lmaWNUb2tlbk9mID0gZ2VuZXJhbFRva2VuO1xuICAgICAgc3BlY2lmaWNUb2tlbi5tYXhDYWNoZVNpemUgPSBnZW5lcmFsVG9rZW4ubWF4Q2FjaGVTaXplO1xuICAgICAgc3BlY2lmaWNUb2tlbi50YWdzID0gZ2VuZXJhbFRva2VuLnRhZ3M7XG5cbiAgICAgIHNwZWNpZmljVG9rZW5zQnlTcGVjaWFsaXR5LnNldChzcGVjaWZpY1Rva2VuLnNwZWNpYWxpdHksIHNwZWNpZmljVG9rZW4pO1xuXG4gICAgICBpZiAoc3BlY2lmaWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgc3BlY2lmaWNUb2tlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzcGVjaWZpY1Rva2VuO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBnZW5lcmFsVG9rZW47XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbiA9ICguLi5hcmdzKSA9PlxuICBnZXRJbmplY3Rpb25Ub2tlbiguLi5hcmdzKTtcblxuY29uc3QgZ2V0U3BlY2lmaWNUb2tlbkJ5SWQgPSBpZCA9PiBnZXRJbmplY3Rpb25Ub2tlbih7IGlkLCBzcGVjaWFsaXR5OiBpZCB9KTtcbiIsICJpbXBvcnQgeyBpbmplY3Rpb25Ub2tlblRhZyB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2luamVjdGlvblRva2VuVGFnJztcblxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuU3ltYm9sMiA9ICdpbmplY3Rpb24tdG9rZW4yJztcblxuY29uc3QgY2FyZGluYWxpdGllcyA9IFsnb25lJywgJ3plcm8tb3Itb25lJywgJ3plcm8tb3ItbWFueScsICdvbmUtb3ItbWFueSddO1xuXG5jb25zdCBidWlsZFRva2VuID0gKHtcbiAgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnksXG4gIHRhcmdldCxcbiAgdGFncyxcbiAgLi4ucmVzdFxufSkgPT4ge1xuICAvLyBBIHNwZWNpZmljIHRva2VuIG1heSBkZWNsYXJlIGl0cyBvd24gY2FyZGluYWxpdHkgXHUyMDE0IGl0cyBmYW1pbHkncyBnZW5lcmFsXG4gIC8vIHRva2VuIG9mdGVuIGhhcyBhIGRpZmZlcmVudCBvbmUgXHUyMDE0IGFuZCBpbmhlcml0cyB3aGVuIGl0IGRvZXMgbm90LCB3aGljaFxuICAvLyBpcyB3aHkgb25seSBnZW5lcmFsIHRva2VucyBhcmUgcmVxdWlyZWQgdG8gZGVjbGFyZS5cbiAgaWYgKHJlc3QuY2FyZGluYWxpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChyZXN0LnNwZWNpYWxpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gY3JlYXRlIGluamVjdGlvbiB0b2tlbiBcIiR7cmVzdC5pZH1cIiB3aXRob3V0IGNhcmRpbmFsaXR5LmAsXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmICghY2FyZGluYWxpdGllcy5pbmNsdWRlcyhyZXN0LmNhcmRpbmFsaXR5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUcmllZCB0byBjcmVhdGUgaW5qZWN0aW9uIHRva2VuIFwiJHtyZXN0LmlkfVwiIHdpdGggdW5rbm93biBjYXJkaW5hbGl0eSBcIiR7cmVzdC5jYXJkaW5hbGl0eX1cIi5gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eSA9IG5ldyBNYXAoKTtcblxuICAvLyBUaGUgZmFjdG9yeSBpcyBhc3N1bWVkIHB1cmUgYW5kIGRldGVybWluaXN0aWM6IGEgc3BlY2lmaWVyIGFsd2F5cyBtYXBzXG4gIC8vIHRvIHRoZSBzYW1lIHRva2VuLCBzbyBzaW5nbGUtc3BlY2lmaWVyIGNhbGxzIGFyZSBtZW1vaXplZCBieSBzcGVjaWZpZXJcbiAgLy8gdG8gc2tpcCBjb25zdHJ1Y3RpbmcgYSB0aHJvd2F3YXkgY2FuZGlkYXRlIG9uIHJlcGVhdCBgLmZvcigpYCBjYWxscy5cbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllciA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZW5lcmFsVG9rZW4gPSBPYmplY3QuYXNzaWduKHRhcmdldCA/PyB7fSwge1xuICAgIC4uLnJlc3QsXG5cbiAgICB0YWdzOiBbaW5qZWN0aW9uVG9rZW5UYWcsIC4uLih0YWdzID8/IFtdKV0sXG5cbiAgICBhbGlhc1R5cGU6IGluamVjdGlvblRva2VuU3ltYm9sMixcblxuICAgIC8vIE5vIGZhY3RvcnkgbWVhbnMgbm8gYC5mb3IoKWAgYXQgYWxsLCBtYXRjaGluZyB0aGUgdHlwZTogYSB0b2tlbiBpc24ndFxuICAgIC8vIHJlcXVpcmVkIHRvIGJlIHBhcnQgb2YgYSBmYW1pbHkuIEEgZmFjdG9yeSBhbHNvIG1ha2VzIHRoZSB0b2tlblxuICAgIC8vIGFic3RyYWN0OiBpdCdzIG9ubHkgZXZlciB1c2VmdWwgcmVzb2x2ZWQgdmlhIGEgcmVhbCBgLmZvcigpYCwgc28gaXRcbiAgICAvLyBjYW5ub3QgYmUgaW5qZWN0ZWQvcmVnaXN0ZXJlZCBkaXJlY3RseSBcdTIwMTQgc2VlIGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvclxuICAgIC8vIGFuZCByZWdpc3Rlci5qcydzIGBpbmplY3Rpb25Ub2tlbj8uYWJzdHJhY3RgIGNoZWNrLlxuICAgIC4uLihzcGVjaWZpY0luamVjdGlvblRva2VuRmFjdG9yeSAmJiB7XG4gICAgICBhYnN0cmFjdDogdHJ1ZSxcblxuICAgICAgZm9yOiAoLi4uc3BlY2lmaWVycykgPT4ge1xuICAgICAgICBjb25zdCBtZW1vaXplZFRva2VuID1cbiAgICAgICAgICBzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgPyBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLmdldChzcGVjaWZpZXJzWzBdKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG1lbW9pemVkVG9rZW4pIHtcbiAgICAgICAgICByZXR1cm4gbWVtb2l6ZWRUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW5DYW5kaWRhdGUgPSBzcGVjaWZpY0luamVjdGlvblRva2VuRmFjdG9yeShcbiAgICAgICAgICAuLi5zcGVjaWZpZXJzLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWNUb2tlbiA9IHNwZWNpZmljVG9rZW5zQnlTcGVjaWFsaXR5LmdldChcbiAgICAgICAgICBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlLnNwZWNpYWxpdHksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGV4aXN0aW5nU3BlY2lmaWNUb2tlbikge1xuICAgICAgICAgIGlmIChzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgZXhpc3RpbmdTcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdTcGVjaWZpY1Rva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BlY2lmaWNUb2tlbiA9IHNwZWNpZmljVG9rZW5DYW5kaWRhdGU7XG5cbiAgICAgICAgc3BlY2lmaWNUb2tlbi5pZCA9IGAke2dlbmVyYWxUb2tlbi5pZH0vJHtzcGVjaWZpY1Rva2VuLmlkfWA7XG4gICAgICAgIHNwZWNpZmljVG9rZW4uc3BlY2lmaWNUb2tlbk9mID0gZ2VuZXJhbFRva2VuO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLm1heENhY2hlU2l6ZSA9IGdlbmVyYWxUb2tlbi5tYXhDYWNoZVNpemU7XG4gICAgICAgIHNwZWNpZmljVG9rZW4udGFncyA9IGdlbmVyYWxUb2tlbi50YWdzO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLmNhcmRpbmFsaXR5ID1cbiAgICAgICAgICBzcGVjaWZpY1Rva2VuLmNhcmRpbmFsaXR5ID8/IGdlbmVyYWxUb2tlbi5jYXJkaW5hbGl0eTtcblxuICAgICAgICBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5zZXQoc3BlY2lmaWNUb2tlbi5zcGVjaWFsaXR5LCBzcGVjaWZpY1Rva2VuKTtcblxuICAgICAgICBpZiAoc3BlY2lmaWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLnNldChzcGVjaWZpZXJzWzBdLCBzcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzcGVjaWZpY1Rva2VuO1xuICAgICAgfSxcbiAgICB9KSxcbiAgfSk7XG5cbiAgcmV0dXJuIGdlbmVyYWxUb2tlbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbmplY3Rpb25Ub2tlbjIgPSAoLi4uYXJncykgPT4ge1xuICAvLyBBIHNpbmdsZSwgbm9uLWN1cnJpZWQgY2FsbDogb3B0aW9ucyBnaXZlbiBkaXJlY3RseSwgZmFjdG9yeSBjdXJyaWVkIGFzXG4gIC8vIGl0cyBvd24gdHJhaWxpbmcgY2FsbCBcdTIwMTQgZ2V0SW5qZWN0aW9uVG9rZW4yKG9wdGlvbnMpKGZhY3RvcnkpLCBvclxuICAvLyBnZXRJbmplY3Rpb25Ub2tlbjIob3B0aW9ucykoKSBmb3IgYSBjb25jcmV0ZSB0b2tlbiB3aXRoIG5vIGAuZm9yKClgIGF0XG4gIC8vIGFsbC4gUGFzc2luZyBhIGZhY3RvcnkgYWxzbyBtYWtlcyB0aGUgdG9rZW4gYWJzdHJhY3QgXHUyMDE0IHNlZSBidWlsZFRva2VuLlxuICAvLyBUaGUgZXhwbGljaXQtU0YgZXNjYXBlIGhhdGNoIChnZXRJbmplY3Rpb25Ub2tlbjI8RiwgTUYsIFNGPihvcHRpb25zKSlcbiAgLy8gdXNlcyB0aGlzIGV4YWN0IHNhbWUgc2hhcGUsIGZhY3RvcnkganVzdCBvcHRpb25hbCBvbiB0aGUgdHJhaWxpbmcgY2FsbFxuICAvLyBpbnN0ZWFkIG9mIHJlcXVpcmVkIFx1MjAxNCBub3RoaW5nIGRpc3Rpbmd1aXNoZXMgdGhlbSBhdCBydW50aW1lLCBzaW5jZSBTRlxuICAvLyBiZWluZyBzcGVsbGVkIG91dCBleHBsaWNpdGx5IHZzIGluZmVycmVkIGZyb20gdGhlIGZhY3RvcnkgdmFsdWUgaXNcbiAgLy8gZXJhc2VkIGJ5IHRoZSB0aW1lIHRoaXMgY29kZSBydW5zLlxuICAvL1xuICAvLyBBIGBzcGVjaWFsaXR5YCBpbiBvcHRpb25zIGJ1aWxkcyBhIHNwZWNpZmljIHRva2VuIGRpcmVjdGx5IFx1MjAxNCB0aGlzIGlzIGhvd1xuICAvLyBnZXRTcGVjaWZpY0luamVjdGlvblRva2VuMiB1c2VkIHRvIGJlIGl0cyBvd24gZnVuY3Rpb247IGZvbGRlZCBpbiBoZXJlXG4gIC8vIHNpbmNlIGJ1aWxkVG9rZW4gYWxyZWFkeSB0aHJlYWRzIGBzcGVjaWFsaXR5YCB0aHJvdWdoIHZpYSBgLi4ucmVzdGBcbiAgLy8gcmVnYXJkbGVzcyBvZiB3aGljaCBjcmVhdG9yIGlzIGNhbGxlZC4gVW5saWtlIHRoZSBvbGRcbiAgLy8gZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbjIsIHRoaXMgYWxzbyBhY2NlcHRzIGEgZmFjdG9yeSwgc28gYSBzcGVjaWZpY1xuICAvLyB0b2tlbiBjYW4gaXRzZWxmIGJlIGEgZmFtaWx5IHJvb3QgZm9yIG5lc3RlZCBzcGVjaWZpY2l0eSBcdTIwMTQgc2VlIHRoZVxuICAvLyBjb21tZW50IG9uIGJ1aWxkVG9rZW4gZm9yIHdoeSB0aGF0IG1ha2VzIGl0IGFic3RyYWN0IHRvby5cbiAgaWYgKGFyZ3MubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRyaWVkIHRvIGNyZWF0ZSBpbmplY3Rpb24gdG9rZW4ke1xuICAgICAgICBhcmdzWzBdPy5pZCA/IGAgXCIke2FyZ3NbMF0uaWR9XCJgIDogJydcbiAgICAgIH0gd2l0aCAke1xuICAgICAgICBhcmdzLmxlbmd0aFxuICAgICAgfSBhcmd1bWVudHM7IGdldEluamVjdGlvblRva2VuMiB0YWtlcyBleGFjdGx5IG9uZSAob3B0aW9ucykuYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgW29wdGlvbnNdID0gYXJncztcblxuICByZXR1cm4gc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkgPT5cbiAgICBidWlsZFRva2VuKHsgLi4ub3B0aW9ucywgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkgfSk7XG59O1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuIH0gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0SW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4yL2dldEluamVjdGlvblRva2VuMic7XG5cbi8vIE1hY2hpbmVyeSB0b2tlbnMgY2Fycnkgbm8gdGFnczogdGFnIGRpc3BhdGNoIHJlYWRzIHRoZSB0YXJnZXQncyB0b2tlblxuLy8gY2hhaW4sIHNvIGEgZGVjb3JhdG9yIHJlZ2lzdGVyZWQgdW5kZXIgZS5nLlxuLy8gYGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbi5mb3IoJ2luamVjdGlvblRva2VuJylgIHdvdWxkIG90aGVyd2lzZSBiZVxuLy8gZm91bmQgdmlhIGl0cyBvd24gcmVnaXN0cmF0aW9uIHRva2VuIGR1cmluZyBpdHMgb3duIGluc3RhbnRpYXRpb24gXHUyMDE0XG4vLyBpbmZpbml0ZSByZWN1cnNpb24uIGAuZm9yKClgIGNoaWxkcmVuIGNvcHkgdGhlIGdlbmVyYWwgdG9rZW4ncyB0YWdzIGF0XG4vLyBjcmVhdGlvbiwgc28gdGhlIGV4ZW1wdGlvbiBwcm9wYWdhdGVzIHRvIHRoZW0uIChTYW1lIHJvbGUgdGhlIHJlbW92ZWRcbi8vIGBkZWNvcmFibGU6IGZhbHNlYCBmbGFnIGhhZC4pXG5jb25zdCB1bnRhZ2dlZCA9IHRva2VuID0+IHtcbiAgdG9rZW4udGFncyA9IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRva2VuO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4gPSB1bnRhZ2dlZChcbiAgZ2V0SW5qZWN0aW9uVG9rZW4oe1xuICAgIGlkOiAncmVnaXN0cmF0aW9uLWNhbGxiYWNrLXRva2VuJyxcbiAgfSksXG4pO1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuKHtcbiAgICBpZDogJ2RlcmVnaXN0cmF0aW9uLWNhbGxiYWNrLXRva2VuJyxcbiAgfSksXG4pO1xuXG5leHBvcnQgY29uc3QgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdpbnN0YW50aWF0ZS1kZWNvcmF0b3ItdG9rZW4nLFxuICAgIGNhcmRpbmFsaXR5OiAnemVyby1vci1tYW55JyxcbiAgfSkodGFyZ2V0ID0+IGdldEluamVjdGlvblRva2VuMih7IGlkOiB0YXJnZXQuaWQsIHNwZWNpYWxpdHk6IHRhcmdldCB9KSgpKSxcbik7XG5cbmV4cG9ydCBjb25zdCBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnaW5qZWN0aW9uLWRlY29yYXRvci10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdpbnN0YW5jZS1wdXJnZS1jYWxsYmFjay10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdyZWdpc3RyYXRpb24tZGVjb3JhdG9yLXRva2VuJyxcbiAgICBjYXJkaW5hbGl0eTogJ3plcm8tb3ItbWFueScsXG4gIH0pKHRhcmdldCA9PiBnZXRJbmplY3Rpb25Ub2tlbjIoeyBpZDogdGFyZ2V0LmlkLCBzcGVjaWFsaXR5OiB0YXJnZXQgfSkoKSksXG4pO1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnZGVyZWdpc3RyYXRpb24tZGVjb3JhdG9yLXRva2VuJyxcbiAgICBjYXJkaW5hbGl0eTogJ3plcm8tb3ItbWFueScsXG4gIH0pKHRhcmdldCA9PiBnZXRJbmplY3Rpb25Ub2tlbjIoeyBpZDogdGFyZ2V0LmlkLCBzcGVjaWFsaXR5OiB0YXJnZXQgfSkoKSksXG4pO1xuXG5leHBvcnQgY29uc3QgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAncHJlLWluamVjdC1jYWxsYmFjay10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcbiIsICJjb25zdCBpc09iamVjdEtleSA9IGtleSA9PlxuICAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYga2V5ICE9PSBudWxsKSB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nO1xuXG5jb25zdCBtYWtlTm9kZSA9ICgpID0+ICh7XG4gIGxheWVyOiBuZXcgTWFwKCksXG4gIHdlYWtMYXllcjogbmV3IFdlYWtNYXAoKSxcbiAgY2hpbGRyZW46IG5ldyBNYXAoKSxcbiAgd2Vha0NoaWxkcmVuOiBuZXcgV2Vha01hcCgpLFxuICBoYXNXZWFrRW50cmllczogZmFsc2UsXG59KTtcblxuZXhwb3J0IGNsYXNzIENvbXBvc2l0ZU1hcCB7XG4gICNpbnRlcm5hbE1hcCA9IG1ha2VOb2RlKCk7XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlcyA9IFtdKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaW5pdGlhbFZhbHVlcykge1xuICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgI2xheWVyRm9yKG1hcEVudHJ5LCBrZXkpIHtcbiAgICByZXR1cm4gaXNPYmplY3RLZXkoa2V5KSA/IG1hcEVudHJ5LndlYWtMYXllciA6IG1hcEVudHJ5LmxheWVyO1xuICB9XG5cbiAgI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBrZXkpIHtcbiAgICByZXR1cm4gaXNPYmplY3RLZXkoa2V5KSA/IG1hcEVudHJ5LndlYWtDaGlsZHJlbiA6IG1hcEVudHJ5LmNoaWxkcmVuO1xuICB9XG5cbiAgI3NldChtYXBFbnRyeSwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IGtleVswXTtcbiAgICAgIHRoaXMuI2xheWVyRm9yKG1hcEVudHJ5LCBmaXJzdCkuc2V0KGZpcnN0LCB2YWx1ZSk7XG4gICAgICBpZiAoaXNPYmplY3RLZXkoZmlyc3QpKSBtYXBFbnRyeS5oYXNXZWFrRW50cmllcyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBrZXk7XG4gICAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCk7XG4gICAgICBsZXQgbmV4dE1hcEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGZpcnN0KTtcblxuICAgICAgaWYgKCFuZXh0TWFwRW50cnkpIHtcbiAgICAgICAgbmV4dE1hcEVudHJ5ID0gbWFrZU5vZGUoKTtcbiAgICAgICAgY2hpbGRNYXAuc2V0KGZpcnN0LCBuZXh0TWFwRW50cnkpO1xuICAgICAgICBpZiAoaXNPYmplY3RLZXkoZmlyc3QpKSBtYXBFbnRyeS5oYXNXZWFrRW50cmllcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuI3NldChuZXh0TWFwRW50cnksIHJlc3QsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBrZXkgdG8gYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignS2V5cyBtdXN0IGJlIGF0IGxlYXN0IGxlbmd0aCAxJyk7XG4gICAgfVxuXG4gICAgdGhpcy4jc2V0KHRoaXMuI2ludGVybmFsTWFwLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gICNnZXQobWFwRW50cnksIGtleSkge1xuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy4jbGF5ZXJGb3IobWFwRW50cnksIGtleVswXSkuZ2V0KGtleVswXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBrZXk7XG4gICAgICBjb25zdCBuZXh0TWFwRW50cnkgPSB0aGlzLiNjaGlsZHJlbkZvcihtYXBFbnRyeSwgZmlyc3QpLmdldChmaXJzdCk7XG5cbiAgICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLiNnZXQobmV4dE1hcEVudHJ5LCByZXN0KTtcbiAgICB9XG4gIH1cblxuICBnZXQoa2V5KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGtleSB0byBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNnZXQodGhpcy4jaW50ZXJuYWxNYXAsIGtleSk7XG4gIH1cblxuICAjaGFzKG1hcEVudHJ5LCBrZXkpIHtcbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuI2xheWVyRm9yKG1hcEVudHJ5LCBrZXlbMF0pLmhhcyhrZXlbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGZpcnN0KS5nZXQoZmlyc3QpO1xuXG4gICAgICBpZiAoIW5leHRNYXBFbnRyeSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLiNoYXMobmV4dE1hcEVudHJ5LCByZXN0KTtcbiAgICB9XG4gIH1cblxuICBoYXMoa2V5KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGtleSB0byBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2hhcyh0aGlzLiNpbnRlcm5hbE1hcCwga2V5KTtcbiAgfVxuXG4gICp2YWx1ZXMoKSB7XG4gICAgZm9yIChjb25zdCBbLCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gICprZXlzKCkge1xuICAgIGZvciAoY29uc3QgW2tleV0gb2YgdGhpcy5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIGtleTtcbiAgICB9XG4gIH1cblxuICAqI2VudHJpZXMobWFwRW50cnksIGtleSkge1xuICAgIGZvciAoY29uc3QgW2xheWVyS2V5LCBsYXllclZhbHVlXSBvZiBtYXBFbnRyeS5sYXllci5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIFtbLi4ua2V5LCBsYXllcktleV0sIGxheWVyVmFsdWVdO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2xheWVyS2V5LCBsYXllck1hcEVudHJ5XSBvZiBtYXBFbnRyeS5jaGlsZHJlbi5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkKiB0aGlzLiNlbnRyaWVzKGxheWVyTWFwRW50cnksIFsuLi5rZXksIGxheWVyS2V5XSk7XG4gICAgfVxuICB9XG5cbiAgKmVudHJpZXMoKSB7XG4gICAgeWllbGQqIHRoaXMuI2VudHJpZXModGhpcy4jaW50ZXJuYWxNYXAsIFtdKTtcbiAgfVxuXG4gICNjYW5QcnVuZShub2RlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICFub2RlLmhhc1dlYWtFbnRyaWVzICYmIG5vZGUubGF5ZXIuc2l6ZSA9PT0gMCAmJiBub2RlLmNoaWxkcmVuLnNpemUgPT09IDBcbiAgICApO1xuICB9XG5cbiAgI2RlbGV0ZShtYXBFbnRyeSwga2V5KSB7XG4gICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwga2V5WzBdKS5kZWxldGUoa2V5WzBdKTtcbiAgICB9XG5cbiAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgIGNvbnN0IGNoaWxkTWFwID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGZpcnN0KTtcbiAgICBjb25zdCBuZXh0TWFwRW50cnkgPSBjaGlsZE1hcC5nZXQoZmlyc3QpO1xuXG4gICAgaWYgKCFuZXh0TWFwRW50cnkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy4jZGVsZXRlKG5leHRNYXBFbnRyeSwgcmVzdCk7XG5cbiAgICBpZiAoZGVsZXRlZCAmJiB0aGlzLiNjYW5QcnVuZShuZXh0TWFwRW50cnkpKSB7XG4gICAgICBjaGlsZE1hcC5kZWxldGUoZmlyc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgZGVsZXRlKGtleSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpIHx8IGtleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlKHRoaXMuI2ludGVybmFsTWFwLCBrZXkpO1xuICB9XG5cbiAgI2ZvckVhY2hJblN1YnRyZWUobWFwRW50cnksIG9uVmFsdWUpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG1hcEVudHJ5LmxheWVyLnZhbHVlcygpKSB7XG4gICAgICBvblZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkRW50cnkgb2YgbWFwRW50cnkuY2hpbGRyZW4udmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuI2ZvckVhY2hJblN1YnRyZWUoY2hpbGRFbnRyeSwgb25WYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgI2RlbGV0ZUJ5UHJlZml4KG1hcEVudHJ5LCBrZXlQcmVmaXgsIG9uVmFsdWUpIHtcbiAgICBpZiAoa2V5UHJlZml4Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5UHJlZml4WzBdO1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwga2V5KTtcbiAgICAgIGNvbnN0IGNoaWxkTWFwID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGtleSk7XG4gICAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAobGF5ZXIuaGFzKGtleSkpIHtcbiAgICAgICAgaWYgKG9uVmFsdWUpIG9uVmFsdWUobGF5ZXIuZ2V0KGtleSkpO1xuICAgICAgICBsYXllci5kZWxldGUoa2V5KTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaWxkRW50cnkgPSBjaGlsZE1hcC5nZXQoa2V5KTtcblxuICAgICAgaWYgKGNoaWxkRW50cnkpIHtcbiAgICAgICAgaWYgKG9uVmFsdWUpIHRoaXMuI2ZvckVhY2hJblN1YnRyZWUoY2hpbGRFbnRyeSwgb25WYWx1ZSk7XG4gICAgICAgIGNoaWxkTWFwLmRlbGV0ZShrZXkpO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IGtleVByZWZpeDtcbiAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCk7XG4gICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGZpcnN0KTtcblxuICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMuI2RlbGV0ZUJ5UHJlZml4KG5leHRNYXBFbnRyeSwgcmVzdCwgb25WYWx1ZSk7XG5cbiAgICBpZiAoZGVsZXRlZCAmJiB0aGlzLiNjYW5QcnVuZShuZXh0TWFwRW50cnkpKSB7XG4gICAgICBjaGlsZE1hcC5kZWxldGUoZmlyc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgZGVsZXRlQnlQcmVmaXgoa2V5UHJlZml4LCBvblZhbHVlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleVByZWZpeCkgfHwga2V5UHJlZml4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNkZWxldGVCeVByZWZpeCh0aGlzLiNpbnRlcm5hbE1hcCwga2V5UHJlZml4LCBvblZhbHVlKTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuI2ludGVybmFsTWFwID0gbWFrZU5vZGUoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IENvbXBvc2l0ZU1hcCB9IGZyb20gJy4vY29tcG9zaXRlLW1hcCc7XG5cbmV4cG9ydCBjbGFzcyBMcnVDb21wb3NpdGVNYXAge1xuICAjaW5uZXIgPSBuZXcgQ29tcG9zaXRlTWFwKCk7XG4gICNtYXhTaXplO1xuICAjc2l6ZSA9IDA7XG4gICNoZWFkID0gbnVsbDtcbiAgI3RhaWwgPSBudWxsO1xuICAjb25FdmljdDtcblxuICBjb25zdHJ1Y3RvcihtYXhTaXplLCB7IG9uRXZpY3QgfSA9IHt9KSB7XG4gICAgdGhpcy4jbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgdGhpcy4jb25FdmljdCA9IG9uRXZpY3Q7XG4gIH1cblxuICAjYWRkVG9IZWFkKG5vZGUpIHtcbiAgICBub2RlLm5leHQgPSB0aGlzLiNoZWFkO1xuICAgIG5vZGUucHJldiA9IG51bGw7XG5cbiAgICBpZiAodGhpcy4jaGVhZCkge1xuICAgICAgdGhpcy4jaGVhZC5wcmV2ID0gbm9kZTtcbiAgICB9XG5cbiAgICB0aGlzLiNoZWFkID0gbm9kZTtcblxuICAgIGlmICghdGhpcy4jdGFpbCkge1xuICAgICAgdGhpcy4jdGFpbCA9IG5vZGU7XG4gICAgfVxuICB9XG5cbiAgI3JlbW92ZU5vZGUobm9kZSkge1xuICAgIGlmIChub2RlLnByZXYpIHtcbiAgICAgIG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNoZWFkID0gbm9kZS5uZXh0O1xuICAgIH1cblxuICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgIG5vZGUubmV4dC5wcmV2ID0gbm9kZS5wcmV2O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiN0YWlsID0gbm9kZS5wcmV2O1xuICAgIH1cblxuICAgIG5vZGUucHJldiA9IG51bGw7XG4gICAgbm9kZS5uZXh0ID0gbnVsbDtcbiAgfVxuXG4gICNwcm9tb3RlTm9kZShub2RlKSB7XG4gICAgaWYgKG5vZGUgPT09IHRoaXMuI2hlYWQpIHJldHVybjtcbiAgICB0aGlzLiNyZW1vdmVOb2RlKG5vZGUpO1xuICAgIHRoaXMuI2FkZFRvSGVhZChub2RlKTtcbiAgfVxuXG4gICNldmljdExydSgpIHtcbiAgICBjb25zdCBscnVOb2RlID0gdGhpcy4jdGFpbDtcbiAgICBjb25zdCBrZXkgPSBscnVOb2RlLmtleTtcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy4jaW5uZXIuZ2V0KGtleSk7XG4gICAgdGhpcy4jcmVtb3ZlTm9kZShscnVOb2RlKTtcbiAgICB0aGlzLiNpbm5lci5kZWxldGUoa2V5KTtcbiAgICB0aGlzLiNzaXplLS07XG5cbiAgICBpZiAodGhpcy4jb25FdmljdCkgdGhpcy4jb25FdmljdCh3cmFwcGVyLnZhbHVlLCBrZXkpO1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLiNpbm5lci5nZXQoa2V5KTtcblxuICAgIGlmICh3cmFwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy4jcHJvbW90ZU5vZGUod3JhcHBlci5scnVOb2RlKTtcblxuICAgIHJldHVybiB3cmFwcGVyLnZhbHVlO1xuICB9XG5cbiAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuI2lubmVyLmdldChrZXkpO1xuXG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy4jcHJvbW90ZU5vZGUoZXhpc3RpbmcubHJ1Tm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbHJ1Tm9kZSA9IHsga2V5LCBwcmV2OiBudWxsLCBuZXh0OiBudWxsIH07XG4gICAgdGhpcy4jaW5uZXIuc2V0KGtleSwgeyB2YWx1ZSwgbHJ1Tm9kZSB9KTtcbiAgICB0aGlzLiNhZGRUb0hlYWQobHJ1Tm9kZSk7XG4gICAgdGhpcy4jc2l6ZSsrO1xuXG4gICAgaWYgKHRoaXMuI3NpemUgPiB0aGlzLiNtYXhTaXplKSB7XG4gICAgICB0aGlzLiNldmljdExydSgpO1xuICAgIH1cbiAgfVxuXG4gIGhhcyhrZXkpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5uZXIuaGFzKGtleSk7XG4gIH1cblxuICAqdmFsdWVzKCkge1xuICAgIGZvciAoY29uc3Qgd3JhcHBlciBvZiB0aGlzLiNpbm5lci52YWx1ZXMoKSkge1xuICAgICAgeWllbGQgd3JhcHBlci52YWx1ZTtcbiAgICB9XG4gIH1cblxuICAqa2V5cygpIHtcbiAgICB5aWVsZCogdGhpcy4jaW5uZXIua2V5cygpO1xuICB9XG5cbiAgKmVudHJpZXMoKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB3cmFwcGVyXSBvZiB0aGlzLiNpbm5lci5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIFtrZXksIHdyYXBwZXIudmFsdWVdO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZUJ5UHJlZml4KGtleVByZWZpeCkge1xuICAgIHJldHVybiB0aGlzLiNpbm5lci5kZWxldGVCeVByZWZpeChrZXlQcmVmaXgsIHdyYXBwZXIgPT4ge1xuICAgICAgdGhpcy4jcmVtb3ZlTm9kZSh3cmFwcGVyLmxydU5vZGUpO1xuICAgICAgdGhpcy4jc2l6ZS0tO1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy4jaW5uZXIuY2xlYXIoKTtcbiAgICB0aGlzLiNoZWFkID0gbnVsbDtcbiAgICB0aGlzLiN0YWlsID0gbnVsbDtcbiAgICB0aGlzLiNzaXplID0gMDtcbiAgfVxufVxuIiwgImV4cG9ydCBkZWZhdWx0ICguLi5mdW5jdGlvbnMpID0+XG4gIHggPT4ge1xuICAgIGxldCB2YWwgPSB4O1xuXG4gICAgZnVuY3Rpb25zLmZvckVhY2goZiA9PiB7XG4gICAgICB2YWwgPSBmKHZhbCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmFsO1xuICB9O1xuIiwgImltcG9ydCB7IG5vblN0b3JlZEluc3RhbmNlS2V5LCBzdG9yZWRJbnN0YW5jZUtleSB9IGZyb20gJy4vbGlmZWN5Y2xlRW51bSc7XG5pbXBvcnQgeyBpc0NvbXBvc2l0ZUtleSB9IGZyb20gJy4uL2dldENvbXBvc2l0ZUtleS9nZXRDb21wb3NpdGVLZXknO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbCB9IGZyb20gJy4uL2dldEluamVjdGFibGUvZ2V0SW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcbmltcG9ydCB7IGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbiB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IENvbXBvc2l0ZU1hcCB9IGZyb20gJy4uL2NvbXBvc2l0ZS1tYXAvY29tcG9zaXRlLW1hcCc7XG5pbXBvcnQgeyBMcnVDb21wb3NpdGVNYXAgfSBmcm9tICcuLi9jb21wb3NpdGUtbWFwL2xydS1jb21wb3NpdGUtbWFwJztcbmltcG9ydCBmbG93IGZyb20gJy4vZmFzdEZsb3cnO1xuXG4vLyBQcmUtYWxsb2NhdGVkIGtleSBmb3Igc2luZ2xldG9uIGluc3RhbmNlIGxvb2t1cCBcdTIwMTQgYXZvaWRzIGFycmF5IGNyZWF0aW9uIHBlciBpbmplY3QoKVxuY29uc3Qgc2luZ2xldG9uQ29tcG9zaXRlS2V5ID0gW3N0b3JlZEluc3RhbmNlS2V5XTtcblxuLy8gRGV0ZWN0cyB0aGUga2V5ZWRTaW5nbGV0b24gc3RvcmFnZSBzaGFwZS4gU2luZ2xldG9ucyAoYW5kIHYyLWRlZmF1bHRcbi8vIGluamVjdGFibGVzIHRoYXQgaGF2ZSBvbmx5IGV2ZXIgYmVlbiBjYWxsZWQgd2l0aG91dCBhcmdzKSBzdG9yZSB0aGVcbi8vIGluc3RhbmNlIGRpcmVjdGx5OyBrZXllZFNpbmdsZXRvbiB3aXRoLWFyZ3Mgc3RvcmFnZSB1c2VzIGEgQ29tcG9zaXRlTWFwLlxuZXhwb3J0IGNvbnN0IGlzQ29tcG9zaXRlU3RvcmFnZSA9IHN0b3JlZCA9PlxuICBzdG9yZWQgaW5zdGFuY2VvZiBDb21wb3NpdGVNYXAgfHwgc3RvcmVkIGluc3RhbmNlb2YgTHJ1Q29tcG9zaXRlTWFwO1xuXG5leHBvcnQgY29uc3QgcHJpdmF0ZUluamVjdEZvciA9XG4gICh7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGluamVjdGFibGVTZXQsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZ2V0RGksXG4gICAgY2hlY2tGb3JOb01hdGNoZXMsXG4gICAgY2hlY2tGb3JUb29NYW55TWF0Y2hlcyxcbiAgICBjaGVja0ZvclNpZGVFZmZlY3RzLFxuICAgIGNoZWNrRm9yQWJzdHJhY3RUb2tlbixcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgICBnZXRTY29wZWRJZCxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSkgPT5cbiAgKHsgd2l0aE1ldGEgfSkgPT5cbiAgKHsgYWxpYXMsIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLCBpbmplY3RpbmdJbmplY3RhYmxlIH0pID0+IHtcbiAgICBjb25zdCBkaSA9IGdldERpKCk7XG5cbiAgICBsZXQgb3JpZ2luYWxJbmplY3RhYmxlO1xuXG4gICAgLy8gRmFzdCBwYXRoOiBhbGlhcyBpcyBpdHNlbGYgYW4gaW5qZWN0YWJsZSAodGhlIGRvbWluYW50IGNhc2UgXHUyMDE0IGV2ZXJ5XG4gICAgLy8gY2FsbCBmcm9tIHByaXZhdGVJbmplY3RNYW55IGxhbmRzIGhlcmUgYmVjYXVzZSBpdCBpdGVyYXRlcyByZXNvbHZlZFxuICAgIC8vIGluamVjdGFibGVzKS4gU2tpcCBnZXRSZWxhdGVkSW5qZWN0YWJsZXMgKHdoaWNoIHdvdWxkIGFsbG9jYXRlIGFcbiAgICAvLyBzaW5nbGUtZWxlbWVudCBbYWxpYXNdIGFycmF5KSwgdGhlIHNpbmdsZS1tYXRjaC9uby1tYXRjaCB2YWxpZGF0b3JzLFxuICAgIC8vIGFuZCB0aGUgYWJzdHJhY3QtdG9rZW4gY2hlY2sgKGluamVjdGFibGVzIGFyZSBuZXZlciBhYnN0cmFjdCkuXG4gICAgY29uc3QgYWxpYXNUeXBlID0gYWxpYXMuYWxpYXNUeXBlO1xuXG4gICAgaWYgKGFsaWFzVHlwZSA9PT0gaW5qZWN0YWJsZVN5bWJvbCB8fCBhbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgICBpZiAoIWluamVjdGFibGVTZXQuaGFzKGFsaWFzKSkge1xuICAgICAgICAvLyBSZXVzZSB0aGUgZXhpc3RpbmcgdGhyb3cgd2l0aCB0aGUgc2FtZSB3b3JkaW5nIGFzIHRoZSB0b2tlbiBwYXRoLlxuICAgICAgICBjaGVja0Zvck5vTWF0Y2hlcyhbXSwgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxJbmplY3RhYmxlID0gYWxpYXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoZWNrRm9yQWJzdHJhY3RUb2tlbihhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG5cbiAgICAgIGNvbnN0IHJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICAgIGNoZWNrRm9yVG9vTWFueU1hdGNoZXMocmVsYXRlZEluamVjdGFibGVzLCBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG4gICAgICBjaGVja0Zvck5vTWF0Y2hlcyhyZWxhdGVkSW5qZWN0YWJsZXMsIGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKTtcblxuICAgICAgb3JpZ2luYWxJbmplY3RhYmxlID0gcmVsYXRlZEluamVjdGFibGVzWzBdO1xuICAgIH1cblxuICAgIGFscmVhZHlJbmplY3RlZC5hZGQob3JpZ2luYWxJbmplY3RhYmxlKTtcblxuICAgIGNvbnN0IGluamVjdGFibGUgPVxuICAgICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLnNpemUgPiAwXG4gICAgICAgID8gb3ZlcnJpZGluZ0luamVjdGFibGVzLmdldChvcmlnaW5hbEluamVjdGFibGUpIHx8IG9yaWdpbmFsSW5qZWN0YWJsZVxuICAgICAgICA6IG9yaWdpbmFsSW5qZWN0YWJsZTtcblxuICAgIGNoZWNrRm9yU2lkZUVmZmVjdHMoaW5qZWN0YWJsZSwgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG5cbiAgICAvLyBCYWNrd2FyZCBjb21wYXQ6IG9sZC1zdHlsZSBzaW5nbGV0b25zIHRvbGVyYXRlZCBgaW5qZWN0KGFsaWFzLCB1bmRlZmluZWQpYC5cbiAgICAvLyBOb3JtYWxpemUgYWxsLXVuZGVmaW5lZCBhcmdzIHRvIFtdIHNvIGZhc3QtcGF0aCBhbmQgc2luZ2xldG9uIGd1YXJkIGJlaGF2ZVxuICAgIC8vIGFzIGlmIG5vIHBhcmFtZXRlciB3YXMgc3VwcGxpZWQuXG4gICAgaWYgKFxuICAgICAgaW5qZWN0YWJsZS5hbGlhc1R5cGUgIT09IGluamVjdGFibGVTeW1ib2wyICYmXG4gICAgICBpbmplY3RhYmxlLmxpZmVjeWNsZS5pZCA9PT0gJ3NpbmdsZXRvbicgJiZcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCA+IDAgJiZcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmV2ZXJ5KHAgPT4gcCA9PT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBGYXN0IHBhdGg6IHNpbmdsZXRvbiBjYWNoZSBoaXQgXHUyMDE0IGF2b2lkIGNyZWF0aW5nIG1pbmltYWxEaSBlbnRpcmVseS5cbiAgICAvLyBUaGUgc3RvcmVkIHZhbHVlIGlzIG9uZSBvZjpcbiAgICAvLyAgIC0gdW5kZWZpbmVkOiBub3RoaW5nIGNhY2hlZCB5ZXRcbiAgICAvLyAgIC0gQ29tcG9zaXRlTWFwIC8gTHJ1Q29tcG9zaXRlTWFwOiBrZXllZFNpbmdsZXRvbiBjYWNoZSwgbG9vayB1cCBieVxuICAgIC8vICAgICBzaW5nbGV0b25Db21wb3NpdGVLZXkgZm9yIGEgbm8tYXJncyBjYWxsXG4gICAgLy8gICAtIGFueSBvdGhlciB2YWx1ZTogaW5zdGFuY2UgZGlyZWN0bHkgKHNpbmdsZXRvbiBsaWZlY3ljbGUsIG9yIHYyXG4gICAgLy8gICAgIGRlZmF1bHQgbGlmZWN5Y2xlIHRoYXQgaGFzIG9ubHkgZXZlciBiZWVuIGNhbGxlZCB3aXRoIG5vIGFyZ3MpXG4gICAgLy9cbiAgICAvLyBXZSBkaXNwYXRjaCBvbiBsaWZlY3ljbGUuaWQgZmlyc3Qgc28gcGxhaW4gc2luZ2xldG9ucyAodGhlIGRvbWluYW50XG4gICAgLy8gY2FzZSkgc2tpcCB0aGUgaW5zdGFuY2VvZiBjaGVja3MgZW50aXJlbHk7IG9ubHkga2V5ZWRTaW5nbGV0b24tc2hhcGVkXG4gICAgLy8gbGlmZWN5Y2xlcyBmYWxsIHRocm91Z2ggdG8gdGhlIHN0cnVjdHVyYWwgY2hlY2suXG4gICAgaWYgKGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgaW5qZWN0YWJsZS5vdmVycmlkZGVuSW5qZWN0YWJsZSB8fCBpbmplY3RhYmxlLFxuICAgICAgKTtcblxuICAgICAgbGV0IGV4aXN0aW5nSW5zdGFuY2U7XG5cbiAgICAgIGlmIChpbmplY3RhYmxlLmxpZmVjeWNsZS5pZCA9PT0gJ3NpbmdsZXRvbicpIHtcbiAgICAgICAgZXhpc3RpbmdJbnN0YW5jZSA9IHN0b3JlZDtcbiAgICAgIH0gZWxzZSBpZiAoaXNDb21wb3NpdGVTdG9yYWdlKHN0b3JlZCkpIHtcbiAgICAgICAgZXhpc3RpbmdJbnN0YW5jZSA9IHN0b3JlZC5nZXQoc2luZ2xldG9uQ29tcG9zaXRlS2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXN0aW5nSW5zdGFuY2UgPSBzdG9yZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgICAgIGlmICghd2l0aE1ldGEpIHtcbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJbnN0YW5jZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5zdGFuY2U6IGV4aXN0aW5nSW5zdGFuY2UsXG4gICAgICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0SW5zdGFuY2UoXG4gICAgICBkaSxcbiAgICAgIGluamVjdGFibGUsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICBnZXROYW1lc3BhY2VkSWQsXG4gICAgICBnZXRTY29wZWRJZCxcbiAgICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgICk7XG5cbiAgICBpZiAoIXdpdGhNZXRhKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgIH07XG4gIH07XG5cbmNvbnN0IGNyZWF0ZU1pbmltYWxEaSA9IChcbiAgZGksXG4gIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gIGdldFNjb3BlZElkLFxuICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4pID0+IHtcbiAgLy8gQ2xvc3VyZS1jYXB0dXJlZCBtZXRob2RzIGFyZSBmaXhlZCB1cC1mcm9udCAoYHNoYXJlZGAgcGx1cyBpbmplY3QqKSxcbiAgLy8gc28gdXNlciBjb2RlIGNhbiBkZXRhY2ggdGhlbSBcdTIwMTQgYGNvbnN0IHsgcmVnaXN0ZXIgfSA9IGRpOyByZWdpc3RlciguLi4pYFxuICAvLyBhbmQgc2ltaWxhciBwYXR0ZXJucyBhcHBlYXIgaW4gdGVzdHMuIEEgY2xhc3Mtd2l0aC1wcm90b3R5cGUgZGlzcGF0Y2hlclxuICAvLyB3b3VsZCBiZSBjaGVhcGVyIHRvIGFsbG9jYXRlIGJ1dCBsb3NlcyB0aGF0IGRldGFjaC1mcmllbmRseSBiZWhhdmlvci5cbiAgY29uc3Qgc2hhcmVkID0ge1xuICAgIHJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIGRpLnJlZ2lzdGVyKHtcbiAgICAgICAgaW5qZWN0YWJsZXMsXG4gICAgICAgIGNvbnRleHQ6IFt7IGluamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkIH1dLFxuICAgICAgICBzb3VyY2U6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGRlcmVnaXN0ZXI6ICguLi5pbmplY3RhYmxlcykgPT4ge1xuICAgICAgZGkuZGVyZWdpc3Rlcih7XG4gICAgICAgIGluamVjdGFibGVzLFxuICAgICAgICBjb250ZXh0OiBbeyBpbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCB9XSxcbiAgICAgICAgc291cmNlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXQgc291cmNlTmFtZXNwYWNlKCkge1xuICAgICAgY29uc3QgbnNJZCA9IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG4gICAgICBjb25zdCBsYXN0Q29sb24gPSBuc0lkID8gbnNJZC5sYXN0SW5kZXhPZignOicpIDogLTE7XG5cbiAgICAgIHJldHVybiBsYXN0Q29sb24gPiAwID8gbnNJZC5zbGljZSgwLCBsYXN0Q29sb24pIDogdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICBoYXNSZWdpc3RyYXRpb25zOiBkaS5oYXNSZWdpc3RyYXRpb25zLFxuICAgIGdldE51bWJlck9mUmVnaXN0cmF0aW9uczogZGkuZ2V0TnVtYmVyT2ZSZWdpc3RyYXRpb25zLFxuICAgIGdldE51bWJlck9mSW5zdGFuY2VzOiBkaS5nZXROdW1iZXJPZkluc3RhbmNlcyxcblxuICAgIHB1cmdlOiAoYWxpYXMsIC4uLmtleVBhcnRzKSA9PlxuICAgICAgZGkuc2NvcGVkUHVyZ2UoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsIGFsaWFzLCAuLi5rZXlQYXJ0cyksXG5cbiAgICByZWdpc3RlcmVkSW5Mb2NhbFNjb3BlOiBhbGlhcyA9PlxuICAgICAgZGkucmVnaXN0ZXJlZEluU2NvcGVPZihpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCwgYWxpYXMpLFxuXG4gICAgcmVnaXN0ZXJlZEluTG9jYWxTY29wZVN1YnRyZWU6IGFsaWFzID0+XG4gICAgICBkaS5yZWdpc3RlcmVkSW5TdWJ0cmVlT2YoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsIGFsaWFzKSxcbiAgfTtcblxuICBpZiAoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQuYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgIC8vIEFuIGltcGVyYXRpdmUgb3ZlcnJpZGUgKGRpLm92ZXJyaWRlIC8gZGkuZWFybHlPdmVycmlkZSkgaW5zdGFudGlhdGVzIGFcbiAgICAvLyBzdGFuZC1pbiBvYmplY3QgdGhhdCB3YXMgbmV2ZXIgcmVnaXN0ZXJlZDsgdGhlIHJlZ2lzdHJhdGlvbiB0cmVlIG9ubHlcbiAgICAvLyBrbm93cyB0aGUgb3JpZ2luYWwsIHNvIHRoZSBzY29wZSB3YWxrIHN0YXJ0cyBmcm9tIGl0LlxuICAgIGNvbnN0IHJlZ2lzdGVyZWRJbmplY3RhYmxlID1cbiAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZDtcblxuICAgIC8vIFYyIG1pbmltYWxEaTogaW5qZWN0L2luamVjdE1hbnkvZXRjIGFyZSBmYWN0b3J5LXJldHVybmluZy4gRWFjaCBtZXRob2RcbiAgICAvLyBpcyBpbmxpbmVkIGRpcmVjdGx5IGFnYWluc3QgYGRpYCAobm8gbWluaW1hbEluamVjdCogaW50ZXJtZWRpYXJ5KSBzb1xuICAgIC8vIHdlIGRvbid0IGFsbG9jYXRlIGZvdXIgZXh0cmEgY2xvc3VyZXMgcGVyIG1pbmltYWxEaSBqdXN0IHRvIGZvcndhcmQuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNoYXJlZCxcblxuICAgICAgLy8gVGhlIGlkZW50aXR5IG9mIHdoYXQgaXMgYmVpbmcgaW5zdGFudGlhdGVkLCBmb3IgaW5zdGFudGlhdGUtY29kZVxuICAgICAgLy8gc2hhcmVkIGFjcm9zcyBpbmplY3RhYmxlcyAoZGVjb3JhdG9ycywgcmV1c2FibGUgZmFjdG9yaWVzKS4gYGlkYCBpcyBhXG4gICAgICAvLyBwbGFpbiByZWFkOyB0aGUgc2NvcGUgcGFpciB3YWxrcyB0aGUgcmVnaXN0cmF0aW9uIHRyZWUgcGVyIHJlYWQsXG4gICAgICAvLyBoZW5jZSBnZXR0ZXJzLlxuICAgICAgaWQ6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmlkLFxuXG4gICAgICBnZXQgc2NvcGVJZHMoKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IGdldFNjb3BlZElkKHJlZ2lzdGVyZWRJbmplY3RhYmxlKTtcblxuICAgICAgICBpZHMucG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIGlkcztcbiAgICAgIH0sXG5cbiAgICAgIGdldCBzY29wZWRJZCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFNjb3BlZElkKHJlZ2lzdGVyZWRJbmplY3RhYmxlKTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdDpcbiAgICAgICAgYWxpYXMgPT5cbiAgICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgICBkaS5pbmplY3Qoe1xuICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogcGFyYW1zLFxuICAgICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgICAgfSksXG5cbiAgICAgIGluamVjdE1hbnk6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KSxcblxuICAgICAgaW5qZWN0TWF5YmU6IGFsaWFzID0+IHtcbiAgICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCk7XG5cbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdFdpdGhNZXRhOlxuICAgICAgICBhbGlhcyA9PlxuICAgICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYW55V2l0aE1ldGE6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYXliZVdpdGhNZXRhOiBhbGlhcyA9PiB7XG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eShhbGlhcywgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQpO1xuXG4gICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFYxIG1pbmltYWxEaTogaW5qZWN0L2luamVjdE1hbnkvZXRjIHJldHVybiBpbnN0YW5jZXMgZGlyZWN0bHkuXG4gIGNvbnN0IG1pbmltYWxJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBkaS5pbmplY3RNYW55KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0V2l0aE1ldGEoe1xuICAgICAgYWxpYXMsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogYXJncyxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIH0pO1xuXG4gIGNvbnN0IG1pbmltYWxJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLnNoYXJlZCxcblxuICAgIGluamVjdDogbWluaW1hbEluamVjdCxcbiAgICBpbmplY3RNYW55OiBtaW5pbWFsSW5qZWN0TWFueSxcbiAgICBpbmplY3RXaXRoTWV0YTogbWluaW1hbEluamVjdFdpdGhNZXRhLFxuICAgIGluamVjdE1hbnlXaXRoTWV0YTogbWluaW1hbEluamVjdE1hbnlXaXRoTWV0YSxcblxuICAgIGluamVjdEZhY3Rvcnk6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgbWluaW1hbEluamVjdChhbGlhcywgLi4ucGFyYW1zKSxcbiAgfTtcbn07XG5cbmNvbnN0IGluc3RhbnRpYXRlID0gKFxuICBkaSxcbiAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gIG1pbmltYWxEaSxcbiAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuKSA9PiB7XG4gIC8vIERlY29yYXRvcnMgYWx3YXlzIGxvb2sgdXAgYWdhaW5zdCB0aGUgb3JpZ2luYWwgaW5qZWN0YWJsZSBzbyB0aGF0IGFuXG4gIC8vIGltcGVyYXRpdmUgb3ZlcnJpZGUgKGRpLm92ZXJyaWRlIC8gZGkuZWFybHlPdmVycmlkZSkgaXMgd3JhcHBlZCBieSBhbnlcbiAgLy8gZGVjb3JhdG9ycyByZWdpc3RlcmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRhcmdldCBcdTIwMTQgY29tcG9zaW5nIGRlY29yYXRvcnNcbiAgLy8gcmVseSBvbiB0aGlzLlxuICBjb25zdCB0YXJnZXQgPVxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQ7XG5cbiAgY29uc3QgZGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzKHtcbiAgICBkZWNvcmF0b3JUb2tlbjogaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICAgIHRhcmdldCxcbiAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgfSk7XG5cbiAgY29uc3QgZGVjb3JhdGVkID1cbiAgICBkZWNvcmF0b3JzLmxlbmd0aCA9PT0gMFxuICAgICAgPyBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5pbnN0YW50aWF0ZVxuICAgICAgOiBmbG93KC4uLmRlY29yYXRvcnMpKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmluc3RhbnRpYXRlKTtcblxuICAvLyBOZXctc3R5bGUgaW5qZWN0YWJsZTI6IGN1cnJpZWQgKGRpKSA9PiAoLi4ucGFyYW1zKSA9PiBpbnN0YW5jZVxuICBpZiAoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQuYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgIHJldHVybiBkZWNvcmF0ZWQobWluaW1hbERpKSguLi5pbnN0YW50aWF0aW9uUGFyYW1ldGVycyk7XG4gIH1cblxuICAvLyBPbGQtc3R5bGU6IChkaSwgLi4ucGFyYW1zKSA9PiBpbnN0YW5jZVxuICByZXR1cm4gZGVjb3JhdGVkKG1pbmltYWxEaSwgLi4uaW5zdGFudGlhdGlvblBhcmFtZXRlcnMpO1xufTtcblxuY29uc3QgZW5zdXJlSW5zdGFuY2VNYXAgPSAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBrZXkpID0+IHtcbiAgbGV0IGluc3RhbmNlTWFwID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChrZXkpO1xuXG4gIGlmICghaW5zdGFuY2VNYXApIHtcbiAgICBpbnN0YW5jZU1hcCA9IG5ldyBDb21wb3NpdGVNYXAoKTtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGtleSwgaW5zdGFuY2VNYXApO1xuICB9XG5cbiAgcmV0dXJuIGluc3RhbmNlTWFwO1xufTtcblxuY29uc3QgZ2V0SW5zdGFuY2UgPSAoXG4gIGRpLFxuICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICBnZXROYW1lc3BhY2VkSWQsXG4gIGdldFNjb3BlZElkLFxuICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuKSA9PiB7XG4gIGNvbnN0IGNhY2hlS2V5ID1cbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5vdmVycmlkZGVuSW5qZWN0YWJsZSB8fFxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkO1xuXG4gIGNvbnN0IGxpZmVjeWNsZUlkID0gaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQubGlmZWN5Y2xlLmlkO1xuXG4gIC8vIFNpbmdsZXRvbjogZmFzdCBwYXRoIGluIHByaXZhdGVJbmplY3RGb3IgYWxyZWFkeSBjaGVja2VkIGNhY2hlIGFuZCBtaXNzZWQuXG4gIC8vIFNraXAgcmVkdW5kYW50IGdldEluc3RhbmNlS2V5ICsgY2FjaGUgY2hlY2sgXHUyMDE0IGdvIHN0cmFpZ2h0IHRvIGluc3RhbnRpYXRpb24uXG4gIGlmIChsaWZlY3ljbGVJZCA9PT0gJ3NpbmdsZXRvbicpIHtcbiAgICBpZiAoaW5zdGFudGlhdGlvblBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IHNpbmdsZXRvbiBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICApfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaWxsZWdhbGx5IHRvIHNpbmdsZXRvbnMsIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzIHdlcmUgcHJvdmlkZWQ6IFwiJHtpbnN0YW50aWF0aW9uUGFyYW1ldGVyc31cIi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtaW5pbWFsRGkgPSBjcmVhdGVNaW5pbWFsRGkoXG4gICAgICBkaSxcbiAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIGdldFNjb3BlZElkLFxuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgICk7XG5cbiAgICBjb25zdCBuZXdJbnN0YW5jZSA9IGluc3RhbnRpYXRlKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIG1pbmltYWxEaSxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgKTtcblxuICAgIC8vIFNpbmdsZXRvbnMgc3RvcmUgdGhlIGluc3RhbmNlIGRpcmVjdGx5IGluIHRoZSBtYXAgXHUyMDE0IG5vIHBlci1pbmplY3RhYmxlXG4gICAgLy8gQ29tcG9zaXRlTWFwIHdyYXBwZXIuIFNhdmVzIH41IG9iamVjdCBhbGxvY2F0aW9ucyBwZXIgZmlyc3QtaW5qZWN0LlxuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5zZXQoY2FjaGVLZXksIG5ld0luc3RhbmNlKTtcblxuICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgfVxuXG4gIC8vIFRyYW5zaWVudDogbmV2ZXIgY2FjaGVkIFx1MjAxNCBza2lwIGtleSByZXNvbHV0aW9uLCBjYWNoZSBjaGVjaywgYW5kIGNhY2hlIHN0b3JlLlxuICBpZiAobGlmZWN5Y2xlSWQgPT09ICd0cmFuc2llbnQnKSB7XG4gICAgY29uc3QgbWluaW1hbERpID0gY3JlYXRlTWluaW1hbERpKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICBnZXRTY29wZWRJZCxcbiAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGluc3RhbnRpYXRlKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIG1pbmltYWxEaSxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFYyLWRlZmF1bHQgKyBuby1hcmdzIGZhc3QgcGF0aDogYmVoYXZlcyBsaWtlIGEgc2luZ2xldG9uLiBTa2lwXG4gIC8vIGdldEluc3RhbmNlS2V5ICsga2V5LWFycmF5IGFsbG9jYXRpb24gKyBDb21wb3NpdGVNYXAgYWxsb2NhdGlvbi4gVGhlXG4gIC8vIGluc3RhbmNlIGlzIHN0b3JlZCBkaXJlY3RseSB1bmRlciBjYWNoZUtleSwgbWF0Y2hpbmcgdGhlIHNpbmdsZXRvblxuICAvLyBzaGFwZS4gSWYgdGhlIHNhbWUgdjIgaW5qZWN0YWJsZSBpcyBsYXRlciBjYWxsZWQgd2l0aCBhcmdzIChyYXJlIG1peGVkXG4gIC8vIHVzYWdlKSwgdGhlIGtleWVkU2luZ2xldG9uIHBhdGggYmVsb3cgbWlncmF0ZXMgdGhlIGV4aXN0aW5nIGluc3RhbmNlXG4gIC8vIGludG8gYSBDb21wb3NpdGVNYXAgdW5kZXIgc2luZ2xldG9uQ29tcG9zaXRlS2V5IGJlZm9yZSBhZGRpbmcgdGhlIG5ld1xuICAvLyBrZXllZCBlbnRyeS5cbiAgaWYgKFxuICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCAmJlxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmxpZmVjeWNsZS5faXNWMkRlZmF1bHRMaWZlY3ljbGVcbiAgKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuZ2V0KGNhY2hlS2V5KTtcblxuICAgIGlmICghaXNDb21wb3NpdGVTdG9yYWdlKGV4aXN0aW5nKSkge1xuICAgICAgY29uc3QgbWluaW1hbERpID0gY3JlYXRlTWluaW1hbERpKFxuICAgICAgICBkaSxcbiAgICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgICAgZ2V0U2NvcGVkSWQsXG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gaW5zdGFudGlhdGUoXG4gICAgICAgIGRpLFxuICAgICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgbWluaW1hbERpLFxuICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgICApO1xuXG4gICAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGNhY2hlS2V5LCBuZXdJbnN0YW5jZSk7XG4gICAgICByZXR1cm4gbmV3SW5zdGFuY2U7XG4gICAgfVxuICAgIC8vIGV4aXN0aW5nIGlzIGEgQ29tcG9zaXRlTWFwIChtaXhlZCB1c2FnZSBwYXRoKSBcdTIwMTQgZmFsbCB0aHJvdWdoLlxuICB9XG5cbiAgLy8ga2V5ZWRTaW5nbGV0b24gLyBjdXN0b20gbGlmZWN5Y2xlOiBmdWxsIGtleSByZXNvbHV0aW9uICsgY2FjaGUgY2hlY2suXG4gIGNvbnN0IG1pbmltYWxEaSA9IGNyZWF0ZU1pbmltYWxEaShcbiAgICBkaSxcbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBnZXRTY29wZWRJZCxcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICk7XG5cbiAgY29uc3QgaW5zdGFuY2VLZXkgPSBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuZ2V0SW5zdGFuY2VLZXkoXG4gICAgbWluaW1hbERpLFxuICAgIC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICApO1xuXG4gIGNvbnN0IGluc3RhbmNlQ29tcG9zaXRlS2V5ID0gaXNDb21wb3NpdGVLZXkoaW5zdGFuY2VLZXkpXG4gICAgPyBpbnN0YW5jZUtleS5rZXlzXG4gICAgOiBbaW5zdGFuY2VLZXldO1xuXG4gIGxldCBleGlzdGluZ01hcCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoY2FjaGVLZXkpO1xuXG4gIC8vIE1peGVkLXVzYWdlIG1pZ3JhdGlvbjogb25seSB2Mi1kZWZhdWx0IGluamVjdGFibGVzIGNhbiBoYXZlIGFycml2ZWRcbiAgLy8gaGVyZSB3aXRoIGFuIGluc3RhbmNlIGluIHRoZSBzbG90IChmcm9tIGEgcHJpb3Igbm8tYXJncyBjYWxsKS4gRm9yXG4gIC8vIGV2ZXJ5IG90aGVyIGtleWVkU2luZ2xldG9uLCB0aGUgc2xvdCBpcyBlaXRoZXIgdW5kZWZpbmVkIG9yIGFcbiAgLy8gQ29tcG9zaXRlTWFwLCBzbyBza2lwIHRoZSBzdHJ1Y3R1cmFsIGNoZWNrLlxuICBpZiAoXG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQubGlmZWN5Y2xlLl9pc1YyRGVmYXVsdExpZmVjeWNsZSAmJlxuICAgIGV4aXN0aW5nTWFwICE9PSB1bmRlZmluZWQgJiZcbiAgICAhaXNDb21wb3NpdGVTdG9yYWdlKGV4aXN0aW5nTWFwKVxuICApIHtcbiAgICBjb25zdCBwcmV2aW91c0luc3RhbmNlID0gZXhpc3RpbmdNYXA7XG4gICAgZXhpc3RpbmdNYXAgPSBuZXcgQ29tcG9zaXRlTWFwKCk7XG4gICAgZXhpc3RpbmdNYXAuc2V0KHNpbmdsZXRvbkNvbXBvc2l0ZUtleSwgcHJldmlvdXNJbnN0YW5jZSk7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLnNldChjYWNoZUtleSwgZXhpc3RpbmdNYXApO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IGV4aXN0aW5nTWFwPy5nZXQoaW5zdGFuY2VDb21wb3NpdGVLZXkpO1xuXG4gIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2U7XG4gIH1cblxuICBjb25zdCBuZXdJbnN0YW5jZSA9IGluc3RhbnRpYXRlKFxuICAgIGRpLFxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIG1pbmltYWxEaSxcbiAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgKTtcblxuICBpZiAoaW5zdGFuY2VDb21wb3NpdGVLZXlbMF0gIT09IG5vblN0b3JlZEluc3RhbmNlS2V5KSB7XG4gICAgZW5zdXJlSW5zdGFuY2VNYXAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBjYWNoZUtleSkuc2V0KFxuICAgICAgaW5zdGFuY2VDb21wb3NpdGVLZXksXG4gICAgICBuZXdJbnN0YW5jZSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5ld0luc3RhbmNlO1xufTtcbiIsICJpbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcbmltcG9ydCB7IGluamVjdGlvbkRlY29yYXRvclRva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG5leHBvcnQgY29uc3Qgd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3IgPVxuICAoeyBkZWNvcmF0b3JDYWNoZSwgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAgdG9CZURlY29yYXRlZCA9PlxuICAoeyBhbGlhcywgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsIGluamVjdGluZ0luamVjdGFibGUgfSkgPT4ge1xuICAgIC8vIFdoZW4gZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uIGlzIG51bGwsIGEgZGVjb3JhdG9yIHdhcyByZWdpc3RlcmVkIG9yXG4gICAgLy8gZGVyZWdpc3RlcmVkIFx1MjAxNCBpbnZhbGlkYXRlIGFsbCBwZXItYWxpYXMgY2FjaGVkIGNvbXBvc2l0aW9ucy5cbiAgICBpZiAoZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uID09PSBudWxsKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSB0cnVlO1xuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcyA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBsZXQgZGVjb3JhdGVkID0gZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcy5nZXQoYWxpYXMpO1xuXG4gICAgaWYgKGRlY29yYXRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgICBkZWNvcmF0b3JUb2tlbjogaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgICAgIHRhcmdldDogYWxpYXMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBib3VuZEluamVjdCA9ICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgdG9CZURlY29yYXRlZCh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGRlY29yYXRlZCA9IGZsb3coLi4uZGVjb3JhdG9ycykoYm91bmRJbmplY3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb3JhdGVkID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcy5zZXQoYWxpYXMsIGRlY29yYXRlZCk7XG4gICAgfVxuXG4gICAgaWYgKGRlY29yYXRlZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRvQmVEZWNvcmF0ZWQoe1xuICAgICAgICBhbGlhcyxcbiAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdGVkKC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzKTtcbiAgfTtcbiIsICJleHBvcnQgY29uc3QgcHJpdmF0ZUluamVjdE1hbnlGb3IgPVxuICAoeyBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsIGdldEluamVjdCwgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwIH0pID0+XG4gICh7IHdpdGhNZXRhIH0pID0+XG4gICh7IGFsaWFzLCBpbnN0YW50aWF0aW9uUGFyYW1ldGVycywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgY29uc3QgaW5qZWN0ID0gZ2V0SW5qZWN0KCk7XG5cbiAgICBjb25zdCByZWxhdGVkSW5qZWN0YWJsZXMgPSBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpO1xuICAgIGNvbnN0IG4gPSByZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoO1xuXG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobik7XG5cbiAgICAvLyBUaGUgYXJnIG9iamVjdCBpcyByZXVzZWQgYWNyb3NzIGl0ZXJhdGlvbnMgXHUyMDE0IHByaXZhdGVJbmplY3RGb3JcbiAgICAvLyBkZXN0cnVjdHVyZXMgaXQgb24gZW50cnkgYW5kIG5ldmVyIHJldGFpbnMgYSByZWZlcmVuY2UsIHNvIG11dGF0aW5nXG4gICAgLy8gLmFsaWFzIGJldHdlZW4gY2FsbHMgaXMgc2FmZS5cbiAgICBjb25zdCBhcmcgPSB7XG4gICAgICBhbGlhczogdW5kZWZpbmVkLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBhbGlhcyxcbiAgICB9O1xuXG4gICAgaWYgKHdpdGhNZXRhKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCBpbmplY3RhYmxlID0gcmVsYXRlZEluamVjdGFibGVzW2ldO1xuICAgICAgICBhcmcuYWxpYXMgPSBpbmplY3RhYmxlO1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGluamVjdChhcmcpO1xuICAgICAgICByZXN1bHRbaV0gPSB7XG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBhcmcuYWxpYXMgPSByZWxhdGVkSW5qZWN0YWJsZXNbaV07XG4gICAgICAgIHJlc3VsdFtpXSA9IGluamVjdChhcmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4iLCAiaW1wb3J0IHsgaW5qZWN0aW9uVG9rZW5TeW1ib2wgfSBmcm9tICcuL2dldEluamVjdGlvblRva2VuJztcbmltcG9ydCB7IGluamVjdGlvblRva2VuU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGlvblRva2VuID0+XG4gIG1heWJlSW5qZWN0aW9uVG9rZW4/LmFsaWFzVHlwZSA9PT0gaW5qZWN0aW9uVG9rZW5TeW1ib2wgfHxcbiAgbWF5YmVJbmplY3Rpb25Ub2tlbj8uYWxpYXNUeXBlID09PSBpbmplY3Rpb25Ub2tlblN5bWJvbDI7XG4iLCAiLy8gVGhlIGlkcyBvZiB0aGUgc2NvcGVzIGFuIGFsaWFzIHdhcyByZWdpc3RlcmVkIHVuZGVyLCBvdXRlcm1vc3QgZmlyc3QgYW5kXG4vLyB0aGUgaW1tZWRpYXRlIG93bmVyIGxhc3QuIEVtcHR5IGZvciBjb250YWluZXItbGV2ZWwgcmVnaXN0cmF0aW9ucywgYW5kIGZvclxuLy8gYW55dGhpbmcgbmV2ZXIgcmVnaXN0ZXJlZCAoaW5qZWN0aW9uIHRva2VucywgdGhlIGNvbnRhaW5lciByb290KS5cbmNvbnN0IGdldFNjb3BlSWRzRm9yID0gaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQgPT4gYWxpYXMgPT4ge1xuICBjb25zdCBpZHMgPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSBhbGlhcztcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5nZXQoY3VycmVudCk7XG5cbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IGNvbnRleHRbY29udGV4dC5sZW5ndGggLSAxXTtcblxuICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcicpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlkcy5wdXNoKHBhcmVudC5pbmplY3RhYmxlLmlkKTtcbiAgICBjdXJyZW50ID0gcGFyZW50LmluamVjdGFibGU7XG4gIH1cblxuICBpZHMucmV2ZXJzZSgpO1xuICByZXR1cm4gaWRzO1xufTtcblxuLy8gVGhlIHNjb3BlIGlkcyBmb2xsb3dlZCBieSB0aGUgYWxpYXMncyBvd24gaWQgXHUyMDE0IHRoZSBzZWdtZW50cyBvZiBpdHNcbi8vIG5hbWVzcGFjZWQgaWQsIHdoaWNoIGlzIHRoZXNlIGpvaW5lZC4gV2Fsa3MgdGhlIHJlZ2lzdHJhdGlvbiB0cmVlIG9uIGV2ZXJ5XG4vLyBjYWxsLCBzbyBjYWxsZXJzIHdhbnRpbmcgaXQgY2hlYXAgc2hvdWxkIGNhY2hlOyB0aGUgYXJyYXkgaXMgZnJlc2ggcGVyIGNhbGxcbi8vIGFuZCB0aGUgY2FsbGVyJ3MgdG8ga2VlcC5cbmV4cG9ydCBjb25zdCBnZXRTY29wZWRJZEZvciA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0ID0+IHtcbiAgY29uc3QgZ2V0U2NvcGVJZHMgPSBnZXRTY29wZUlkc0ZvcihpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCk7XG5cbiAgcmV0dXJuIGFsaWFzID0+IHtcbiAgICBjb25zdCBpZHMgPSBnZXRTY29wZUlkcyhhbGlhcyk7XG5cbiAgICBpZHMucHVzaChhbGlhcy5pZCk7XG5cbiAgICByZXR1cm4gaWRzO1xuICB9O1xufTtcbiIsICJpbXBvcnQgaXNJbmplY3Rpb25Ub2tlbiBmcm9tICcuLi9nZXRJbmplY3Rpb25Ub2tlbi9pc0luamVjdGlvblRva2VuJztcbmltcG9ydCB7IGdldFNjb3BlZElkRm9yIH0gZnJvbSAnLi9nZXRTY29wZWRJZEZvcic7XG5cbi8vIFRoZSBzY29wZWQgaWQgam9pbmVkIHdpdGggJzonLiBBbiBpbmplY3Rpb24gdG9rZW4gaXMgbmV2ZXIgcmVnaXN0ZXJlZCBhbmRcbi8vIHNvIGhhcyBubyBzY29wZXM7IGl0cyBpZCBpcyBwYXJlbnRoZXNpemVkIHRvIHRlbGwgaXQgYXBhcnQgZnJvbSBhblxuLy8gaW5qZWN0YWJsZSdzIHdoZXJlIGl0IHN0YW5kcyBpbiBhcyB0aGUgaW5qZWN0aW5nIHBhcnR5LlxuZXhwb3J0IGNvbnN0IGdldE5hbWVzcGFjZWRJZEZvciA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0ID0+IHtcbiAgY29uc3QgZ2V0U2NvcGVkSWQgPSBnZXRTY29wZWRJZEZvcihpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCk7XG5cbiAgcmV0dXJuIGFsaWFzID0+XG4gICAgaXNJbmplY3Rpb25Ub2tlbihhbGlhcylcbiAgICAgID8gYCgke2FsaWFzLmlkfSlgXG4gICAgICA6IGdldFNjb3BlZElkKGFsaWFzKS5qb2luKCc6Jyk7XG59O1xuIiwgImV4cG9ydCBjb25zdCBpbmplY3RhYmxlQnVuY2hTeW1ib2wgPSAnaW5qZWN0YWJsZS1idW5jaCc7XG5cbmV4cG9ydCBkZWZhdWx0IGJ1bmNoID0+XG4gIE9iamVjdC5hc3NpZ24oYnVuY2gsIHtcbiAgICBhbGlhc1R5cGU6IGluamVjdGFibGVCdW5jaFN5bWJvbCxcbiAgfSk7XG4iLCAiaW1wb3J0IHsgaW5qZWN0YWJsZUJ1bmNoU3ltYm9sIH0gZnJvbSAnLi9nZXRJbmplY3RhYmxlQnVuY2gnO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGFibGVCdW5jaCA9PlxuICBtYXliZUluamVjdGFibGVCdW5jaD8uYWxpYXNUeXBlID09PSBpbmplY3RhYmxlQnVuY2hTeW1ib2w7XG4iLCAiaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbCB9IGZyb20gJy4vZ2V0SW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcblxuZXhwb3J0IGRlZmF1bHQgbWF5YmVJbmplY3RhYmxlID0+XG4gIG1heWJlSW5qZWN0YWJsZT8uYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sIHx8XG4gIG1heWJlSW5qZWN0YWJsZT8uYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMjtcbiIsICJpbXBvcnQgaXNJbmplY3RhYmxlQnVuY2ggZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZUJ1bmNoL2lzSW5qZWN0YWJsZUJ1bmNoJztcbmltcG9ydCBpc0luamVjdGFibGUgZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZS9pc0luamVjdGFibGUnO1xuXG5jb25zdCBjb2xsZWN0RGVlcEJ1bmNoVmFsdWVzID0gKGJ1bmNoLCBvdXQpID0+IHtcbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhidW5jaCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0aGluZyA9IHZhbHVlc1tpXTtcblxuICAgIGlmIChpc0luamVjdGFibGVCdW5jaCh0aGluZykpIHtcbiAgICAgIGNvbGxlY3REZWVwQnVuY2hWYWx1ZXModGhpbmcsIG91dCk7XG4gICAgfSBlbHNlIGlmIChpc0luamVjdGFibGUodGhpbmcpKSB7XG4gICAgICBvdXQucHVzaCh0aGluZyk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RhYmxlcyA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5qZWN0YWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpbmplY3RhYmxlID0gaW5qZWN0YWJsZXNbaV07XG5cbiAgICBpZiAoaXNJbmplY3RhYmxlQnVuY2goaW5qZWN0YWJsZSkpIHtcbiAgICAgIGNvbGxlY3REZWVwQnVuY2hWYWx1ZXMoaW5qZWN0YWJsZSwgcmVzdWx0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goaW5qZWN0YWJsZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAiLy8gVG9rZW4gaGllcmFyY2hpZXMgKHNwZWNpZmljVG9rZW5PZiBjaGFpbnMpIGFyZSBpbW11dGFibGUgXHUyMDE0IGNhY2hlIHBlciB0b2tlbi5cbmNvbnN0IHRva2VuQ2hhaW5DYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5cbmV4cG9ydCBjb25zdCBnZXRSZWxhdGVkVG9rZW5zID0gdG9rZW4gPT4ge1xuICBpZiAodG9rZW4gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBlbXB0eUFycmF5O1xuICB9XG5cbiAgbGV0IGNhY2hlZCA9IHRva2VuQ2hhaW5DYWNoZS5nZXQodG9rZW4pO1xuXG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgY29uc3QgdG9rZW5zID0gW107XG4gIGxldCBjdXJyZW50ID0gdG9rZW47XG5cbiAgd2hpbGUgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHRva2Vucy5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LnNwZWNpZmljVG9rZW5PZjtcbiAgfVxuXG4gIHRva2VuQ2hhaW5DYWNoZS5zZXQodG9rZW4sIHRva2Vucyk7XG5cbiAgcmV0dXJuIHRva2Vucztcbn07XG5cbmV4cG9ydCBjb25zdCBpc1JlbGF0ZWRUb1Rva2VuID0gKHRva2VuLCBhbmNlc3RvcikgPT4ge1xuICBsZXQgY3VycmVudCA9IHRva2VuO1xuXG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IGFuY2VzdG9yKSByZXR1cm4gdHJ1ZTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5zcGVjaWZpY1Rva2VuT2Y7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBlbXB0eUFycmF5ID0gW107XG4iLCAiaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5cbi8vIENhY2hlZCBhcnJheSBwZXIgdG9rZW4gXHUyMDE0IGF2b2lkcyBzcHJlYWRpbmcgU2V0IHRvIEFycmF5IG9uIGV2ZXJ5IGluamVjdCgpIGNhbGwuXG4vLyBJbnZhbGlkYXRlZCBieSBzZXR0aW5nIHRvIG51bGwgd2hlbiB0aGUgU2V0IGlzIG11dGF0ZWQgKHJlZ2lzdGVyL2RlcmVnaXN0ZXIpLlxuY29uc3QgYXJyYXlDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5cbmNvbnN0IEVNUFRZID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbmNvbnN0IGdldENhY2hlZEFycmF5ID0gc2V0ID0+IHtcbiAgbGV0IGFyciA9IGFycmF5Q2FjaGUuZ2V0KHNldCk7XG5cbiAgaWYgKCFhcnIpIHtcbiAgICBhcnIgPSBbLi4uc2V0XTtcbiAgICBhcnJheUNhY2hlLnNldChzZXQsIGFycik7XG4gIH1cblxuICByZXR1cm4gYXJyO1xufTtcblxuZXhwb3J0IGNvbnN0IGludmFsaWRhdGVSZWxhdGVkSW5qZWN0YWJsZXNDYWNoZSA9IHNldCA9PiB7XG4gIGFycmF5Q2FjaGUuZGVsZXRlKHNldCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yID1cbiAgKHsgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLCBpbmplY3RhYmxlU2V0IH0pID0+XG4gIGFsaWFzID0+IHtcbiAgICBpZiAoaXNJbmplY3RhYmxlKGFsaWFzKSkge1xuICAgICAgcmV0dXJuIGluamVjdGFibGVTZXQuaGFzKGFsaWFzKSA/IFthbGlhc10gOiBFTVBUWTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGFsaWFzKTtcblxuICAgIGlmICghc2V0IHx8IHNldC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldENhY2hlZEFycmF5KHNldCk7XG4gIH07XG4iLCAiaW1wb3J0IHsgZ2V0TmFtZXNwYWNlZElkRm9yIH0gZnJvbSAnLi9nZXROYW1lc3BhY2VkSWRGb3InO1xuaW1wb3J0IHtcbiAgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICByZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbn0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHRvRmxhdEluamVjdGFibGVzIGZyb20gJy4vdG9GbGF0SW5qZWN0YWJsZXMnO1xuaW1wb3J0IHsgTHJ1Q29tcG9zaXRlTWFwIH0gZnJvbSAnLi4vY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcCc7XG5pbXBvcnQgeyBnZXRSZWxhdGVkVG9rZW5zLCBpc1JlbGF0ZWRUb1Rva2VuIH0gZnJvbSAnLi9nZXRSZWxhdGVkVG9rZW5zJztcbmltcG9ydCB7IGludmFsaWRhdGVSZWxhdGVkSW5qZWN0YWJsZXNDYWNoZSB9IGZyb20gJy4vZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yJztcbmltcG9ydCBmbG93IGZyb20gJy4vZmFzdEZsb3cnO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJGb3IgPVxuICAoeyByZWdpc3RlclNpbmdsZSwgaW5qZWN0TWFueSwgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAgKHsgaW5qZWN0YWJsZXMsIGNvbnRleHQsIHNvdXJjZSB9KSA9PiB7XG4gICAgY29uc3QgZmxhdEluamVjdGFibGVzID0gdG9GbGF0SW5qZWN0YWJsZXMoaW5qZWN0YWJsZXMpO1xuXG4gICAgLy8gUGhhc2UgMDogaW5zdGFudGlhdGlvbi1kZWNvcmF0b3ItdGFnZ2VkIGluamVjdGFibGVzLiBUaGV5IHJlZ2lzdGVyXG4gICAgLy8gICBmaXJzdCBzbyB0aGF0IGFueSBzYW1lLWJhdGNoIG92ZXJyaWRlcyBvZiAocmVnaXN0cmF0aW9uLSlkZWNvcmF0b3JzXG4gICAgLy8gICBhcmUgYWxyZWFkeSBpbiBwbGFjZSBieSB0aGUgdGltZSB0aG9zZSBkZWNvcmF0b3JzIGFyZSBpbnN0YW50aWF0ZWRcbiAgICAvLyAgIGluIHBoYXNlIDIuIFRoZXkgZ28gdGhyb3VnaCB0aGUgcmVnaXN0cmF0aW9uLWRlY29yYXRvciBwaXBlbGluZSBzb1xuICAgIC8vICAgcHJvZHVjdGlvbiBjb2RlIGNhbiBvcHQgdGhlbSBvdXQgdmlhIHRhZy90YXJnZXQta2V5ZWQgZGVjb3JhdG9ycy5cbiAgICAvLyBQaGFzZSAxOiByZWdpc3RyYXRpb24tZGVjb3JhdG9yLXRhZ2dlZCBpbmplY3RhYmxlcy4gVGhleSByZWdpc3RlclxuICAgIC8vICAgZGlyZWN0bHkgdmlhIHJlZ2lzdGVyU2luZ2xlIChubyByZWN1cnNpdmUgZGVjb3JhdGlvbikgdG8gYXZvaWRcbiAgICAvLyAgIGJvb3RzdHJhcCBjaGFvcy5cbiAgICAvLyBQaGFzZSAyOiByZWd1bGFyIGluamVjdGFibGVzIHJlZ2lzdGVyIHRocm91Z2ggdGhlIGRlY29yYXRvciBwaXBlbGluZS5cbiAgICBjb25zdCBwaGFzZTBJbmplY3RhYmxlcyA9IFtdO1xuICAgIGNvbnN0IHJlZ2lzdGVyZWRSZWdpc3RyYXRpb25EZWNvcmF0b3JJbmplY3RhYmxlcyA9IFtdO1xuICAgIGNvbnN0IHBoYXNlMkluamVjdGFibGVzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZsYXRJbmplY3RhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5qZWN0YWJsZSA9IGZsYXRJbmplY3RhYmxlc1tpXTtcblxuICAgICAgaWYgKFxuICAgICAgICBpc1JlbGF0ZWRUb1Rva2VuKGluamVjdGFibGUuaW5qZWN0aW9uVG9rZW4sIHJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuKVxuICAgICAgKSB7XG4gICAgICAgIHJlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUsIGNvbnRleHQpO1xuICAgICAgICByZWdpc3RlcmVkUmVnaXN0cmF0aW9uRGVjb3JhdG9ySW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbiwgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuKVxuICAgICAgKSB7XG4gICAgICAgIHBoYXNlMEluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwaGFzZTJJbmplY3RhYmxlcy5wdXNoKGluamVjdGFibGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBiYXRjaEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgIGNvbnN0IHJlZ2lzdGVyZWRJbmplY3RhYmxlcyA9IFtdO1xuXG4gICAgY29uc3QgZmlyZUNhbGxiYWNrc0ZvciA9IGluamVjdGFibGUgPT4ge1xuICAgICAgY29uc3QgY2FsbGJhY2tzID0gaW5qZWN0TWFueSh7XG4gICAgICAgIGFsaWFzOiByZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogW10sXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNhbGxiYWNrcy5sZW5ndGg7IGorKykge1xuICAgICAgICBjYWxsYmFja3Nbal0oaW5qZWN0YWJsZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHJlZ2lzdGVyVGhyb3VnaFBpcGVsaW5lID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgICBkZWNvcmF0b3JUb2tlbjogcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgICAgIHRhcmdldDogaW5qZWN0YWJsZSxcbiAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZWdpc3RlclNpbmdsZShpbmplY3RhYmxlLCBjb250ZXh0KTtcbiAgICAgICAgcmVnaXN0ZXJlZEluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IHdhc1JlZ2lzdGVyZWRUaGlzSW5qZWN0YWJsZSA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBib3VuZFJlZ2lzdGVyU2luZ2xlID0gaW5qID0+IHtcbiAgICAgICAgcmVnaXN0ZXJTaW5nbGUoaW5qLCBjb250ZXh0KTtcbiAgICAgICAgd2FzUmVnaXN0ZXJlZFRoaXNJbmplY3RhYmxlID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIWJhdGNoSW5Qcm9ncmVzcykge1xuICAgICAgICAgIGZpcmVDYWxsYmFja3NGb3IoaW5qKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgZGVjb3JhdGVkUmVnaXN0ZXIgPSBmbG93KC4uLmRlY29yYXRvcnMpKGJvdW5kUmVnaXN0ZXJTaW5nbGUpO1xuXG4gICAgICBkZWNvcmF0ZWRSZWdpc3RlcihpbmplY3RhYmxlKTtcblxuICAgICAgaWYgKHdhc1JlZ2lzdGVyZWRUaGlzSW5qZWN0YWJsZSkge1xuICAgICAgICByZWdpc3RlcmVkSW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcGhhc2UwSW5qZWN0YWJsZXMuZm9yRWFjaChyZWdpc3RlclRocm91Z2hQaXBlbGluZSk7XG4gICAgcGhhc2UySW5qZWN0YWJsZXMuZm9yRWFjaChyZWdpc3RlclRocm91Z2hQaXBlbGluZSk7XG5cbiAgICBiYXRjaEluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAgIGNvbnN0IGNhbGxiYWNrcyA9IGluamVjdE1hbnkoe1xuICAgICAgYWxpYXM6IHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogW10sXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBzb3VyY2UsXG4gICAgfSk7XG5cbiAgICAvLyBTa2lwIHRoZSBwZXItaW5qZWN0YWJsZSBmb3JFYWNoIGxvb3AgZW50aXJlbHkgd2hlbiBubyByZWdpc3RyYXRpb25cbiAgICAvLyBjYWxsYmFja3MgYXJlIHdpcmVkIHVwIFx1MjAxNCB0aGlzIGF2b2lkcyAzMGsrIHRyaXZpYWwgZnVuY3Rpb24gY2FsbHNcbiAgICAvLyBkdXJpbmcgYSAzMGstaW5qZWN0YWJsZSBib290c3RyYXAgd2l0aCBubyBjYWxsYmFja3MgKHRoZSBwZXJmLXRlc3RcbiAgICAvLyBjYXNlIGFuZCB0aGUgY29tbW9uIGNhc2UpLlxuICAgIGlmIChjYWxsYmFja3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmlyZUJhdGNoQ2FsbGJhY2tzID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNhbGxiYWNrcy5sZW5ndGg7IGorKykge1xuICAgICAgICBjYWxsYmFja3Nbal0oaW5qZWN0YWJsZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJlZ2lzdGVyZWRSZWdpc3RyYXRpb25EZWNvcmF0b3JJbmplY3RhYmxlcy5mb3JFYWNoKGZpcmVCYXRjaENhbGxiYWNrcyk7XG4gICAgcmVnaXN0ZXJlZEluamVjdGFibGVzLmZvckVhY2goZmlyZUJhdGNoQ2FsbGJhY2tzKTtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyU2luZ2xlRm9yID0gKHtcbiAgaW5qZWN0YWJsZVNldCxcbiAgaW5qZWN0YWJsZUlkU2V0LFxuICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgZmlyZVB1cmdlQ2FsbGJhY2tzLFxufSkgPT4ge1xuICBjb25zdCBnZXROYW1lc3BhY2VkSWQgPSBnZXROYW1lc3BhY2VkSWRGb3IoaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQpO1xuXG4gIHJldHVybiAoaW5qZWN0YWJsZSwgaW5qZWN0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGluamVjdGFibGVJZCA9IGluamVjdGFibGUuaWQ7XG5cbiAgICBpZiAoIWluamVjdGFibGVJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byByZWdpc3RlciBpbmplY3RhYmxlIHdpdGhvdXQgSUQuJyk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgcmV2ZXJzZSBpbmRleDogZm9yIGVhY2ggcGFyZW50IGluIHRoZSBjb250ZXh0LCByZWNvcmQgdGhpcyBpbmplY3RhYmxlIGFzIGEgY2hpbGQuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmplY3Rpb25Db250ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBpbmplY3Rpb25Db250ZXh0W2ldLmluamVjdGFibGU7XG4gICAgICBsZXQgY2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50TWFwLmdldChwYXJlbnQpO1xuXG4gICAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICAgIGNoaWxkcmVuID0gbmV3IFNldCgpO1xuICAgICAgICBjaGlsZHJlbkJ5UGFyZW50TWFwLnNldChwYXJlbnQsIGNoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGRyZW4uYWRkKGluamVjdGFibGUpO1xuICAgIH1cblxuICAgIC8vIEZhc3QgcGF0aDogY29udGFpbmVyLWxldmVsIHJlZ2lzdHJhdGlvbiAodGhlIGRvbWluYW50IGNhc2UpIHlpZWxkcyBhXG4gICAgLy8gbmFtZXNwYWNlZCBpZCBlcXVhbCB0byB0aGUgYmFyZSBpZCBcdTIwMTQgc2tpcCB0aGUgTWFwIHJvdW5kdHJpcCArIHBhcmVudFxuICAgIC8vIHdhbGsgaW5zaWRlIGdldE5hbWVzcGFjZWRJZCwgYW5kIHNraXAgcmVjb3JkaW5nIHRoZSByZWdpc3RyYXRpb25cbiAgICAvLyBjb250ZXh0IGFsdG9nZXRoZXIgKGBnZXROYW1lc3BhY2VkSWRGb3JgIGFuZCBgZGVyZWdpc3RlcmAgYm90aCB0cmVhdFxuICAgIC8vIGEgbWlzc2luZyBlbnRyeSBhcyBcIm5vIG5lc3RlZCBjb250ZXh0XCIgYWxyZWFkeSkuXG4gICAgY29uc3QgaW1tZWRpYXRlUGFyZW50ID1cbiAgICAgIGluamVjdGlvbkNvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICA/IGluamVjdGlvbkNvbnRleHRbaW5qZWN0aW9uQ29udGV4dC5sZW5ndGggLSAxXVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGlzQ29udGFpbmVyTGV2ZWwgPVxuICAgICAgIWltbWVkaWF0ZVBhcmVudCB8fCBpbW1lZGlhdGVQYXJlbnQuaW5qZWN0YWJsZS5hbGlhc1R5cGUgPT09ICdjb250YWluZXInO1xuXG4gICAgaWYgKCFpc0NvbnRhaW5lckxldmVsKSB7XG4gICAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5zZXQoaW5qZWN0YWJsZSwgaW5qZWN0aW9uQ29udGV4dCk7XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZXNwYWNlZElkID0gaXNDb250YWluZXJMZXZlbFxuICAgICAgPyBpbmplY3RhYmxlSWRcbiAgICAgIDogZ2V0TmFtZXNwYWNlZElkKGluamVjdGFibGUpO1xuXG4gICAgaWYgKG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5oYXMoaW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIHJlZ2lzdGVyIHNhbWUgaW5qZWN0YWJsZSBtdWx0aXBsZSB0aW1lczogXCIke25hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoXG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgKX1cImAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpbmplY3RhYmxlSWRTZXQuaGFzKG5hbWVzcGFjZWRJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIHJlZ2lzdGVyIG11bHRpcGxlIGluamVjdGFibGVzIGZvciBJRCBcIiR7bmFtZXNwYWNlZElkfVwiYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdXBwZXJCb3VuZGVkQ2FyZGluYWxpdHkgPVxuICAgICAgaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbj8uY2FyZGluYWxpdHkgPT09ICdvbmUnIHx8XG4gICAgICBpbmplY3RhYmxlLmluamVjdGlvblRva2VuPy5jYXJkaW5hbGl0eSA9PT0gJ3plcm8tb3Itb25lJ1xuICAgICAgICA/IGluamVjdGFibGUuaW5qZWN0aW9uVG9rZW4uY2FyZGluYWxpdHlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAodXBwZXJCb3VuZGVkQ2FyZGluYWxpdHkpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbjtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KHRva2VuKTtcblxuICAgICAgaWYgKHJlZ2lzdGVyZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBtZW1iZXIgb2YgcmVnaXN0ZXJlZCkge1xuICAgICAgICAgIC8vIEV4YWN0IHJlZ2lzdHJhdGlvbnMgb25seTogdGhlIGluZGV4IGFsc28gaG9sZHMgYC5mb3IoKWBcbiAgICAgICAgICAvLyBkZXNjZW5kYW50cyBvZiB0aGUgdG9rZW4sIGFuZCBzcGVjaWFsaXphdGlvbiBtdXN0IG5vdCBiZVxuICAgICAgICAgIC8vIG91dGxhd2VkIGJ5IHRoZSBiYXNlIHRva2VuJ3MgYm91bmQuXG4gICAgICAgICAgaWYgKG1lbWJlci5pbmplY3Rpb25Ub2tlbiA9PT0gdG9rZW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFRyaWVkIHRvIHJlZ2lzdGVyIGluamVjdGFibGUgXCIke25hbWVzcGFjZWRJZH1cIiB3aXRoIGluamVjdGlvbiB0b2tlbiBcIiR7XG4gICAgICAgICAgICAgICAgdG9rZW4uaWRcbiAgICAgICAgICAgICAgfVwiLCBidXQgaXRzIGNhcmRpbmFsaXR5IFwiJHt1cHBlckJvdW5kZWRDYXJkaW5hbGl0eX1cIiBhbGxvd3MgYXQgbW9zdCBvbmUgcmVnaXN0cmF0aW9uIGFuZCBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgICBtZW1iZXIsXG4gICAgICAgICAgICAgICl9XCIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLmAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGluamVjdGFibGVJZFNldC5hZGQobmFtZXNwYWNlZElkKTtcbiAgICBpbmplY3RhYmxlU2V0LmFkZChpbmplY3RhYmxlKTtcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuc2V0KGluamVjdGFibGUsIG5hbWVzcGFjZWRJZCk7XG4gICAgaWYgKGluamVjdGFibGUuaW5qZWN0aW9uVG9rZW4/LmFic3RyYWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byByZWdpc3RlciBpbmplY3RhYmxlIFwiJHtuYW1lc3BhY2VkSWR9XCIgd2l0aCBpbmplY3Rpb24gdG9rZW4gXCIke2luamVjdGFibGUuaW5qZWN0aW9uVG9rZW4uaWR9XCIsIGJ1dCBpdCBpcyBhYnN0cmFjdC4gVXNlIFwiLmZvcihzcGVjaWZpZXIpXCIgZm9yIGEgY29uY3JldGUgdG9rZW4uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbWF4Q2FjaGVTaXplID1cbiAgICAgIGluamVjdGFibGUubWF4Q2FjaGVTaXplID8/IGluamVjdGFibGUuaW5qZWN0aW9uVG9rZW4/Lm1heENhY2hlU2l6ZTtcblxuICAgIC8vIExSVSBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIGtleWVkIGxpZmVjeWNsZXMgXHUyMDE0IHNpbmdsZXRvbnMgaG9sZCBvbmVcbiAgICAvLyBpbnN0YW5jZSBhbmQgd291bGQgbmV2ZXIgb3ZlcmZsb3cuIEZvciBrZXllZCBsaWZlY3ljbGVzIHdpdGggYSBzaXplXG4gICAgLy8gY2FwLCBhbGxvY2F0ZSBlYWdlcmx5IHNvIHRoZSBldmljdGlvbiBjYWxsYmFjayBpcyB3aXJlZCBiZWZvcmUgYW55XG4gICAgLy8gc3RvcmUuIEZvciBldmVyeXRoaW5nIGVsc2UsIHRoZSBtYXAgaXMgYWxsb2NhdGVkIGxhemlseSBvbiBmaXJzdFxuICAgIC8vIHN0b3JlIChzaW5nbGV0b25zIHN0b3JlIHRoZSBpbnN0YW5jZSBkaXJlY3RseTsga2V5ZWRTaW5nbGV0b24gc3RvcmVzXG4gICAgLy8gYSBDb21wb3NpdGVNYXAgXHUyMDE0IHNlZSBwcml2YXRlSW5qZWN0Rm9yLmpzKS5cbiAgICBpZiAobWF4Q2FjaGVTaXplID4gMCAmJiBpbmplY3RhYmxlLmxpZmVjeWNsZS5pZCAhPT0gJ3NpbmdsZXRvbicpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlTWFwID0gbmV3IExydUNvbXBvc2l0ZU1hcChtYXhDYWNoZVNpemUsIHtcbiAgICAgICAgb25FdmljdDogKGluc3RhbmNlLCBrZXlBcnJheSkgPT5cbiAgICAgICAgICBmaXJlUHVyZ2VDYWxsYmFja3MoaW5qZWN0YWJsZSwgaW5zdGFuY2UsIGtleUFycmF5KSxcbiAgICAgIH0pO1xuXG4gICAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGluamVjdGFibGUsIGluc3RhbmNlTWFwKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbnMgPSBnZXRSZWxhdGVkVG9rZW5zKGluamVjdGFibGUuaW5qZWN0aW9uVG9rZW4pO1xuXG4gICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW3RdO1xuICAgICAgbGV0IGluamVjdGFibGVzU2V0ID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldCh0b2tlbik7XG5cbiAgICAgIGlmICghaW5qZWN0YWJsZXNTZXQpIHtcbiAgICAgICAgaW5qZWN0YWJsZXNTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5zZXQodG9rZW4sIGluamVjdGFibGVzU2V0KTtcbiAgICAgIH1cblxuICAgICAgaW5qZWN0YWJsZXNTZXQuYWRkKGluamVjdGFibGUpO1xuICAgICAgaW52YWxpZGF0ZVJlbGF0ZWRJbmplY3RhYmxlc0NhY2hlKGluamVjdGFibGVzU2V0KTtcbiAgICB9XG4gIH07XG59O1xuIiwgImltcG9ydCB7IHN0b3JlZEluc3RhbmNlS2V5IH0gZnJvbSAnLi9saWZlY3ljbGVFbnVtJztcbmltcG9ydCB7IGlzQ29tcG9zaXRlU3RvcmFnZSB9IGZyb20gJy4vcHJpdmF0ZUluamVjdEZvcic7XG5cbmNvbnN0IHNpbmdsZXRvbktleUFycmF5ID0gW3N0b3JlZEluc3RhbmNlS2V5XTtcblxuY29uc3Qga2V5QXJyYXlTdGFydHNXaXRoID0gKGtleUFycmF5LCBwcmVmaXgpID0+IHtcbiAgaWYgKHByZWZpeC5sZW5ndGggPiBrZXlBcnJheS5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcmVmaXgubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoa2V5QXJyYXlbaV0gIT09IHByZWZpeFtpXSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuY29uc3QgZXZpY3QgPSAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBpbmplY3RhYmxlc0luU2NvcGUsIGtleVBhcnRzKSA9PiB7XG4gIGZvciAoY29uc3QgaW5qZWN0YWJsZSBvZiBpbmplY3RhYmxlc0luU2NvcGUpIHtcbiAgICBjb25zdCBzdG9yZWQgPSBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuZ2V0KGluamVjdGFibGUpO1xuICAgIGlmIChzdG9yZWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICBpZiAoIWlzQ29tcG9zaXRlU3RvcmFnZShzdG9yZWQpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGtleVBhcnRzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICBrZXlBcnJheVN0YXJ0c1dpdGgoc2luZ2xldG9uS2V5QXJyYXksIGtleVBhcnRzKVxuICAgICAgKSB7XG4gICAgICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5kZWxldGUoaW5qZWN0YWJsZSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoa2V5UGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBzdG9yZWQuY2xlYXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcmVkLmRlbGV0ZUJ5UHJlZml4KGtleVBhcnRzKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIFB1cmdlcyB0aGUgc3RvcmVkIGluc3RhbmNlcyBvZiBhIGdpdmVuIHNldCBvZiBpbmplY3RhYmxlcy4gU2hhcmVkIGJ5IHRoZVxuLy8gY29udGFpbmVyLXdpZGUgcHVyZ2UgYW5kIHRoZSBzY29wZS1yZXN0cmljdGVkIG9uZSwgc28gdGhhdCBib3RoIGZpcmVcbi8vIGluc3RhbmNlLXB1cmdlIGNhbGxiYWNrcyB0aGUgc2FtZSB3YXkuXG5leHBvcnQgY29uc3QgcHVyZ2VTdG9yZWRJbnN0YW5jZXNGb3IgPVxuICAoe1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gICAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxuICB9KSA9PlxuICAoaW5qZWN0YWJsZXNJblNjb3BlLCBrZXlQYXJ0cykgPT4ge1xuICAgIC8vIE5vdGhpbmcgY2FuIG9ic2VydmUgdGhpcyBwdXJnZSwgc28gc2tpcCBnYXRoZXJpbmcgdGhlIHNuYXBzaG90IGFuZCBnb1xuICAgIC8vIHN0cmFpZ2h0IHRvIGV2aWN0aW9uIFx1MjAxNCB0aGUgc2FtZSBydWxlIHRoZSBpbmplY3Qgd2lyaW5nIGZvbGxvd3MsIHdoZXJlIGFcbiAgICAvLyBjb250YWluZXIgd2l0aCBubyBkZWNvcmF0b3JzIHBheXMgZm9yIG5vbmUuXG4gICAgaWYgKCFhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQoKSkge1xuICAgICAgZXZpY3QoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBpbmplY3RhYmxlc0luU2NvcGUsIGtleVBhcnRzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQaGFzZSAxIFx1MjAxNCBHYXRoZXIgc25hcHNob3QgdHVwbGVzIHdpdGhvdXQgbXV0YXRpbmcgY2FjaGVzLiBUaGUgc3RvcmVkXG4gICAgLy8gdmFsdWUgaXMgZGlzcGF0Y2hlZCBzdHJ1Y3R1cmFsbHk6IGEgQ29tcG9zaXRlTWFwLXNoYXBlIHN0b3JlcyBrZXllZFxuICAgIC8vIGVudHJpZXM7IGFueXRoaW5nIGVsc2UgaXMgYSBkaXJlY3RseS1zdG9yZWQgaW5zdGFuY2UgKHNpbmdsZXRvbiBvclxuICAgIC8vIHYyLWRlZmF1bHQtbm8tYXJncykuXG4gICAgY29uc3QgdHVwbGVzID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGluamVjdGFibGUgb2YgaW5qZWN0YWJsZXNJblNjb3BlKSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuZ2V0KGluamVjdGFibGUpO1xuICAgICAgaWYgKHN0b3JlZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgICAgaWYgKCFpc0NvbXBvc2l0ZVN0b3JhZ2Uoc3RvcmVkKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAga2V5UGFydHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICFrZXlBcnJheVN0YXJ0c1dpdGgoc2luZ2xldG9uS2V5QXJyYXksIGtleVBhcnRzKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0dXBsZXMucHVzaCh7XG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICBpbnN0YW5jZTogc3RvcmVkLFxuICAgICAgICAgIGtleUFycmF5OiBzaW5nbGV0b25LZXlBcnJheSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtrZXlBcnJheSwgaW5zdGFuY2VdIG9mIHN0b3JlZC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKGtleVBhcnRzLmxlbmd0aCA+IDAgJiYgIWtleUFycmF5U3RhcnRzV2l0aChrZXlBcnJheSwga2V5UGFydHMpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdHVwbGVzLnB1c2goeyBpbmplY3RhYmxlLCBpbnN0YW5jZSwga2V5QXJyYXkgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUGhhc2UgMiBcdTIwMTQgRmlyZSBjYWxsYmFja3MuIENhY2hlcyBzdGF5IHBvcHVsYXRlZCBzbyBwZWVyLWNvb3JkaW5hdGlvblxuICAgIC8vIGluc2lkZSBhIGNhbGxiYWNrIHdvcmtzIChgZGkuaW5qZWN0KHBlZXIpYCByZXR1cm5zIHRoZSBjYWNoZWQgaW5zdGFuY2UpLlxuICAgIGZvciAoY29uc3QgeyBpbmplY3RhYmxlLCBpbnN0YW5jZSwga2V5QXJyYXkgfSBvZiB0dXBsZXMpIHtcbiAgICAgIGZpcmVQdXJnZUNhbGxiYWNrcyhpbmplY3RhYmxlLCBpbnN0YW5jZSwga2V5QXJyYXkpO1xuICAgIH1cblxuICAgIC8vIFBoYXNlIDMgXHUyMDE0IEV2aWN0LiBTd2VlcHMgYm90aCB0aGUgb3JpZ2luYWwgc25hcHNob3QgZW50cmllcyBhbmQgYW55dGhpbmdcbiAgICAvLyByZS1wb3B1bGF0ZWQgYnkgcGhhc2UgMiBjYWxsYmFja3MuIENhbGxiYWNrcyBkbyBOT1QgcmUtZmlyZSBoZXJlLlxuICAgIGV2aWN0KGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCwgaW5qZWN0YWJsZXNJblNjb3BlLCBrZXlQYXJ0cyk7XG4gIH07XG5cbmV4cG9ydCBjb25zdCBwdXJnZUluc3RhbmNlc0ZvciA9ICh7XG4gIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gIGFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCxcbn0pID0+IHtcbiAgY29uc3QgcHVyZ2VTdG9yZWRJbnN0YW5jZXMgPSBwdXJnZVN0b3JlZEluc3RhbmNlc0Zvcih7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pO1xuXG4gIHJldHVybiAoYWxpYXMsIC4uLmtleVBhcnRzKSA9PlxuICAgIHB1cmdlU3RvcmVkSW5zdGFuY2VzKFxuICAgICAgYWxpYXMgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IFsuLi5pbnN0YW5jZXNCeUluamVjdGFibGVNYXAua2V5cygpXVxuICAgICAgICA6IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyksXG4gICAgICBrZXlQYXJ0cyxcbiAgICApO1xufTtcbiIsICJpbXBvcnQge1xuICBkZXJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gIGRlcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICBwcmVJbmplY3RDYWxsYmFja1Rva2VuLFxufSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgdG9GbGF0SW5qZWN0YWJsZXMgZnJvbSAnLi90b0ZsYXRJbmplY3RhYmxlcyc7XG5pbXBvcnQgaXNJbmplY3Rpb25Ub2tlbiBmcm9tICcuLi9nZXRJbmplY3Rpb25Ub2tlbi9pc0luamVjdGlvblRva2VuJztcbmltcG9ydCB7IGdldFJlbGF0ZWRUb2tlbnMsIGlzUmVsYXRlZFRvVG9rZW4gfSBmcm9tICcuL2dldFJlbGF0ZWRUb2tlbnMnO1xuaW1wb3J0IHsgaW52YWxpZGF0ZVJlbGF0ZWRJbmplY3RhYmxlc0NhY2hlIH0gZnJvbSAnLi9nZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3InO1xuaW1wb3J0IGZsb3cgZnJvbSAnLi9mYXN0Rmxvdyc7XG5cbmV4cG9ydCBjb25zdCBkZXJlZ2lzdGVyRm9yID1cbiAgKHtcbiAgICBpbmplY3RNYW55LFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICAgIGluamVjdGFibGVTZXQsXG4gICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQsXG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBwdXJnZUluc3RhbmNlcyxcbiAgICBpbmplY3RhYmxlSWRTZXQsXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAsXG4gICAgLy8gVG9kbzogZ2V0IHJpZCBvZiBmdW5jdGlvbiB1c2FnZS5cbiAgICBnZXREaSxcbiAgICBkZWNvcmF0b3JDYWNoZSxcbiAgICBzeW5jSW5qZWN0V2lyaW5nLFxuICB9KSA9PlxuICAoeyBpbmplY3RhYmxlcywgY29udGV4dCwgc291cmNlIH0pID0+IHtcbiAgICAvLyBDb2xsZWN0IGNhbGxiYWNrcyBmaXJzdCAod2hpbGUgYWxsIGluamVjdGFibGVzIGFyZSBzdGlsbCByZWdpc3RlcmVkKVxuICAgIGNvbnN0IGNhbGxiYWNrcyA9IGluamVjdE1hbnkoe1xuICAgICAgYWxpYXM6IGRlcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGZsYXRJbmplY3RhYmxlcyA9IHRvRmxhdEluamVjdGFibGVzKGluamVjdGFibGVzKTtcblxuICAgIC8vIEZpcmUgY2FsbGJhY2tzIGZvciBhbGwgaW5qZWN0YWJsZXMgYmVpbmcgZGVyZWdpc3RlcmVkIChvcmlnaW5hbCBiYXRjaCBzZW1hbnRpY3MpXG4gICAgZmxhdEluamVjdGFibGVzLmZvckVhY2goaW5qZWN0YWJsZSA9PiB7XG4gICAgICBjYWxsYmFja3MuZm9yRWFjaChjYWxsYmFjayA9PiB7XG4gICAgICAgIGNhbGxiYWNrKGluamVjdGFibGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBkaSA9IGdldERpKCk7XG5cbiAgICBjb25zdCBkZXJlZ2lzdGVyU2luZ2xlID0gZGVyZWdpc3RlclNpbmdsZUZvcih7XG4gICAgICBpbmplY3RhYmxlU2V0LFxuICAgICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQsXG4gICAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgICBwdXJnZUluc3RhbmNlcyxcbiAgICAgIGluamVjdGFibGVJZFNldCxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAsXG4gICAgICBkaSxcbiAgICB9KTtcblxuICAgIGxldCBpbmplY3RXaXJpbmdDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICBmbGF0SW5qZWN0YWJsZXMuZm9yRWFjaChpbmplY3RhYmxlID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaXNSZWxhdGVkVG9Ub2tlbihpbmplY3RhYmxlLmluamVjdGlvblRva2VuLCBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbilcbiAgICAgICkge1xuICAgICAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSBudWxsO1xuICAgICAgICBpbmplY3RXaXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbiwgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbikpIHtcbiAgICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0ID0gbnVsbDtcbiAgICAgICAgaW5qZWN0V2lyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiBkZXJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuLFxuICAgICAgICB0YXJnZXQ6IGluamVjdGFibGUsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVjb3JhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVyZWdpc3RlclNpbmdsZShpbmplY3RhYmxlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWNvcmF0ZWREZXJlZ2lzdGVyID0gZmxvdyguLi5kZWNvcmF0b3JzKShkZXJlZ2lzdGVyU2luZ2xlKTtcblxuICAgICAgZGVjb3JhdGVkRGVyZWdpc3RlcihpbmplY3RhYmxlKTtcbiAgICB9KTtcblxuICAgIC8vIFJlY29tcHV0ZWQgZnJvbSB0aGUgcmVnaXN0cmF0aW9uIGluZGV4IGFmdGVyIHRoZSByZW1vdmFscywgc28gYVxuICAgIC8vIGRlcmVnaXN0cmF0aW9uIGRlY29yYXRvciB0aGF0IHByZXZlbnRlZCB0aGUgcmVtb3ZhbCBpcyBoYW5kbGVkIHRvby5cbiAgICBpZiAoaW5qZWN0V2lyaW5nQ2hhbmdlZCkge1xuICAgICAgc3luY0luamVjdFdpcmluZygpO1xuICAgIH1cbiAgfTtcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0ZXJTaW5nbGVGb3IgPVxuICAoe1xuICAgIGluamVjdGFibGVTZXQsXG4gICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQsXG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBwdXJnZUluc3RhbmNlcyxcbiAgICBpbmplY3RhYmxlSWRTZXQsXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAsXG4gICAgZGksXG4gIH0pID0+XG4gIGluamVjdGFibGUgPT4ge1xuICAgIGlmIChpc0luamVjdGlvblRva2VuKGluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBkZXJlZ2lzdGVyIHVzaW5nIGluamVjdGlvbiB0b2tlbiBcIiR7aW5qZWN0YWJsZS5pZH1cIiwgYnV0IGRlcmVnaXN0cmF0aW9uIHVzaW5nIHRva2VuIGlzIGlsbGVnYWwuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpbmplY3RhYmxlU2V0LmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gZGVyZWdpc3RlciBub24tcmVnaXN0ZXJlZCBpbmplY3RhYmxlIFwiJHtpbmplY3RhYmxlLmlkfVwiLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENhc2NhZGUgZGVyZWdpc3RlciBjaGlsZHJlbiB1c2luZyB0aGUgcmV2ZXJzZSBpbmRleCAoTygxKSBsb29rdXApLlxuICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudE1hcC5nZXQoaW5qZWN0YWJsZSk7XG5cbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5kZWxldGUoY2hpbGQpO1xuXG4gICAgICAgIGlmIChpbmplY3RhYmxlU2V0LmhhcyhjaGlsZCkpIHtcbiAgICAgICAgICBkaS5kZXJlZ2lzdGVyKHtcbiAgICAgICAgICAgIGluamVjdGFibGVzOiBbY2hpbGRdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRyZW5CeVBhcmVudE1hcC5kZWxldGUoaW5qZWN0YWJsZSk7XG4gICAgfVxuXG4gICAgcHVyZ2VJbnN0YW5jZXMoaW5qZWN0YWJsZSk7XG4gICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQuZGVsZXRlKGluamVjdGFibGUpO1xuICAgIGNvbnN0IG5hbWVzcGFjZWRJZCA9IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG4gICAgaW5qZWN0YWJsZUlkU2V0LmRlbGV0ZShuYW1lc3BhY2VkSWQpO1xuICAgIGluamVjdGFibGVTZXQuZGVsZXRlKGluamVjdGFibGUpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5kZWxldGUoaW5qZWN0YWJsZSk7XG5cbiAgICBjb25zdCB0b2tlbnMgPSBnZXRSZWxhdGVkVG9rZW5zKGluamVjdGFibGUuaW5qZWN0aW9uVG9rZW4pO1xuXG4gICAgdG9rZW5zLmZvckVhY2godG9rZW4gPT4ge1xuICAgICAgY29uc3QgdG9rZW5TZXQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KHRva2VuKTtcbiAgICAgIHRva2VuU2V0LmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICAgIGludmFsaWRhdGVSZWxhdGVkSW5qZWN0YWJsZXNDYWNoZSh0b2tlblNldCk7XG4gICAgfSk7XG5cbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuZGVsZXRlKGluamVjdGFibGUpO1xuICB9O1xuIiwgImV4cG9ydCBjb25zdCBvdmVycmlkZUZvciA9XG4gICh7IGdldFJlbGF0ZWRJbmplY3RhYmxlcywgZWFybHlPdmVycmlkZSB9KSA9PlxuICAoYWxpYXMsIGluc3RhbnRpYXRlU3R1YikgPT4ge1xuICAgIGNvbnN0IHJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGFsaWFzLmFsaWFzVHlwZSA9PT0gJ2luamVjdGlvbi10b2tlbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUcmllZCB0byBvdmVycmlkZSBzaW5nbGUgaW1wbGVtZW50YXRpb24gb2YgaW5qZWN0aW9uIHRva2VuIFwiJHthbGlhcy5pZH1cIiwgYnV0IGZvdW5kIG5vIHJlZ2lzdGVyZWQgaW1wbGVtZW50YXRpb25zLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIFwiJHthbGlhcy5pZH1cIiB3aGljaCBpcyBub3QgcmVnaXN0ZXJlZC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBlYXJseU92ZXJyaWRlKGFsaWFzLCBpbnN0YW50aWF0ZVN0dWIpO1xuICB9O1xuXG5leHBvcnQgY29uc3QgdW5vdmVycmlkZUZvciA9XG4gICh7IG92ZXJyaWRpbmdJbmplY3RhYmxlcywgZ2V0UmVsYXRlZEluamVjdGFibGVzLCBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgYWxpYXMgPT4ge1xuICAgIGNvbnN0IFtpbmplY3RhYmxlXSA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICBpZiAoIWluamVjdGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIHVub3ZlcnJpZGUgXCIke2FsaWFzLmlkfVwiLCBidXQgaXQgd2FzIG5vdCByZWdpc3RlcmVkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghb3ZlcnJpZGluZ0luamVjdGFibGVzLmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gdW5vdmVycmlkZSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdCB3YXMgbm90IG92ZXJyaWRkZW4uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JOb01hdGNoZXNGb3IgPVxuICAoeyBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKHJlbGF0ZWRJbmplY3RhYmxlcywgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IG5vbi1yZWdpc3RlcmVkIGluamVjdGFibGUgXCIke1xuICAgICAgICAgIGFsaWFzLmlkXG4gICAgICAgIH1cIiBmcm9tIFwiJHtnZXROYW1lc3BhY2VkSWQoaW5qZWN0aW5nSW5qZWN0YWJsZSl9XCIuYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0ZvclRvb01hbnlNYXRjaGVzRm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gIChyZWxhdGVkSW5qZWN0YWJsZXMsIGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKSA9PiB7XG4gICAgaWYgKHJlbGF0ZWRJbmplY3RhYmxlcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3Qgc2luZ2xlIGluamVjdGFibGUgZm9yIGluamVjdGlvbiB0b2tlbiBcIiR7XG4gICAgICAgICAgYWxpYXMuaWRcbiAgICAgICAgfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiIGJ1dCBmb3VuZCBtdWx0aXBsZSBpbmplY3RhYmxlczogXCIke3JlbGF0ZWRJbmplY3RhYmxlc1xuICAgICAgICAgIC5tYXAoZ2V0TmFtZXNwYWNlZElkKVxuICAgICAgICAgIC5qb2luKCdcIiwgXCInKX1cImAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JTaWRlRWZmZWN0c0ZvciA9XG4gICh7IGdldFNpZGVFZmZlY3RzQXJlUHJldmVudGVkLCBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKGluamVjdGFibGUsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAoZ2V0U2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQoaW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGluamVjdCBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICl9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIgd2hlbiBzaWRlLWVmZmVjdHMgYXJlIHByZXZlbnRlZC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4iLCAiZXhwb3J0IGNvbnN0IGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvciA9XG4gICh7IGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAoYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAoYWxpYXMuYWJzdHJhY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGluamVjdCBpbmplY3Rpb24gdG9rZW4gXCIke2FsaWFzLmlkfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaXQgaXMgYWJzdHJhY3QuIFVzZSBcIi5mb3Ioc3BlY2lmaWVyKVwiIGZvciBhIGNvbmNyZXRlIHRva2VuLmAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gIChhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChhbGlhcy5jYXJkaW5hbGl0eSAhPT0gJ3plcm8tb3Itb25lJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0TWF5YmUgXCIke2FsaWFzLmlkfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaXRzIGNhcmRpbmFsaXR5IGlzIFwiJHtcbiAgICAgICAgICBhbGlhcy5jYXJkaW5hbGl0eVxuICAgICAgICB9XCIgaW5zdGVhZCBvZiBcInplcm8tb3Itb25lXCIuYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImltcG9ydCBpc0luamVjdGFibGUgZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZS9pc0luamVjdGFibGUnO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5cbi8vIERlY2xhcmVkIHNldHMgYXJlIGRlcml2ZWQgb25jZSBwZXIgaW5qZWN0YWJsZTogYSBgY29uc3VtcHRpb25zYCBhcnJheSBpc1xuLy8gZml4ZWQgYXQgY3JlYXRpb24sIGFuZCBpbmplY3RhYmxlIGlkZW50aXR5IG91dGxpdmVzIGFueSBzaW5nbGUgY29udGFpbmVyLlxuY29uc3QgZGVjbGFyZWRTZXRzQnlJbmplY3RhYmxlID0gbmV3IFdlYWtNYXAoKTtcblxuY29uc3QgZ2V0RGVjbGFyZWRTZXQgPSBpbmplY3RhYmxlID0+IHtcbiAgbGV0IGRlY2xhcmVkID0gZGVjbGFyZWRTZXRzQnlJbmplY3RhYmxlLmdldChpbmplY3RhYmxlKTtcblxuICBpZiAoIWRlY2xhcmVkKSB7XG4gICAgZGVjbGFyZWQgPSBuZXcgU2V0KGluamVjdGFibGUuY29uc3VtcHRpb25zID8/IFtdKTtcbiAgICBkZWNsYXJlZFNldHNCeUluamVjdGFibGUuc2V0KGluamVjdGFibGUsIGRlY2xhcmVkKTtcbiAgfVxuXG4gIHJldHVybiBkZWNsYXJlZDtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbkZvciA9XG4gICh7IGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAoeyBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgLy8gT25seSBpbmplY3RhYmxlMiBkZWNsYXJlcyBjb25zdW1wdGlvbnMuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBleGVtcHQgYnlcbiAgICAvLyB0aGlzIG9uZSBjaGVjazogdGhlIGNvbnRhaW5lciByb290LCB2MSBpbmplY3RhYmxlcywgYW5kIHRoZSB0b2tlbiB0aGF0XG4gICAgLy8gc3RhbmRzIGluIGFzIHRoZSBpbmplY3RpbmcgcGFydHkgZm9yIGluamVjdE1hbnkncyBlbGVtZW50IGluamVjdHMuXG4gICAgaWYgKGluamVjdGluZ0luamVjdGFibGUuYWxpYXNUeXBlICE9PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluamVjdGluZyBhbiBpbmplY3RhYmxlIGJ5IHJlZmVyZW5jZSBhbHJlYWR5IGltcGxpZXMgYSBkZXBlbmRlbmN5IG9uXG4gICAgLy8gd2hhdGV2ZXIgcGFja2FnZSBpdCBsaXZlcyBpbiwgc28gb25seSB0b2tlbnMgYXJlIGRlY2xhcmVkLlxuICAgIGlmIChpc0luamVjdGFibGUoYWxpYXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVjbGFyZWQgPSBnZXREZWNsYXJlZFNldChpbmplY3RpbmdJbmplY3RhYmxlKTtcblxuICAgIC8vIERlY2xhcmluZyBhIGdlbmVyYWwgdG9rZW4gY292ZXJzIGV2ZXJ5IGAuZm9yKClgIGRlcml2YXRpdmUgb2YgaXQsIHdoaWNoXG4gICAgLy8gaXMgd2hhdCBtYWtlcyBydW50aW1lIHNwZWNpZmllcnMgZGVjbGFyYWJsZSBhdCBhbGwuIFRoZSB3YWxrIGlzIHVwd2FyZHNcbiAgICAvLyBvbmx5OiBkZWNsYXJpbmcgYSBzcGVjaWZpYyB0b2tlbiBkb2VzIG5vdCBjb3ZlciBpdHMgZ2VuZXJhbCB0b2tlbi5cbiAgICBsZXQgY2FuZGlkYXRlID0gYWxpYXM7XG5cbiAgICB3aGlsZSAoY2FuZGlkYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChkZWNsYXJlZC5oYXMoY2FuZGlkYXRlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5zcGVjaWZpY1Rva2VuT2Y7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRyaWVkIHRvIGluamVjdCBcIiR7YWxpYXMuaWR9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgKX1cIiwgYnV0IGl0IGlzIG5vdCBhIGRlY2xhcmVkIGNvbnN1bXB0aW9uLmAsXG4gICAgKTtcbiAgfTtcbiIsICJpbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcblxuY29uc3QgaXNUb2tlbjIgPSBhbGlhcyA9PiBhbGlhcy5hbGlhc1R5cGUgPT09ICdpbmplY3Rpb24tdG9rZW4yJztcblxuLy8gUmVhZC1vbmx5OiByZWFkcyB0aGUgcmVnaXN0cmF0aW9uIHN0YXRlIGRpcmVjdGx5IGFuZCBob2xkcyBub3RoaW5nIG9mIGl0c1xuLy8gb3duLCBzbyByZWdpc3RlcmluZyBhZnRlciB2YWxpZGF0aW5nIHdvcmtzIGFuZCB2YWxpZGF0aW5nIGFnYWluIHJlZmxlY3RzIGl0LlxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRm9yID1cbiAgKHtcbiAgICBjb250YWluZXJJZCxcbiAgICBpbmplY3RhYmxlU2V0LFxuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICB9KSA9PlxuICAoKSA9PiB7XG4gICAgY29uc3QgdmVyaWZpZWRJZHMgPSBbXTtcbiAgICBjb25zdCB1bnZlcmlmaWVkSWRzID0gW107XG4gICAgY29uc3QgdW52ZXJpZmlhYmxlQ29uc3VtcHRpb25zID0gW107XG4gICAgY29uc3QgdmlvbGF0aW9ucyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBpbmplY3RhYmxlIG9mIGluamVjdGFibGVTZXQpIHtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZWRJZCA9IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG5cbiAgICAgIC8vIE9ubHkgaW5qZWN0YWJsZTIgZGVjbGFyZXMgY29uc3VtcHRpb25zOyB2MSBpbmplY3RhYmxlcyBhcmUgYmV5b25kXG4gICAgICAvLyB3aGF0IHRoaXMgY2FuIGNoZWNrLlxuICAgICAgaWYgKGluamVjdGFibGUuYWxpYXNUeXBlICE9PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgICAgICB1bnZlcmlmaWVkSWRzLnB1c2gobmFtZXNwYWNlZElkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZlcmlmaWVkSWRzLnB1c2gobmFtZXNwYWNlZElkKTtcblxuICAgICAgLy8gQW4gb3ZlcnJpZGRlbiBpbmplY3RhYmxlJ3Mgb3duIGluc3RhbnRpYXRlIG5ldmVyIHJ1bnMsIHNvIGl0c1xuICAgICAgLy8gZGVjbGFyYXRpb25zIHNheSBub3RoaW5nIGFib3V0IHdoYXQgdGhpcyBjb250YWluZXIgbmVlZHMuXG4gICAgICBpZiAob3ZlcnJpZGluZ0luamVjdGFibGVzLmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBjb25zdW1wdGlvbiBvZiBpbmplY3RhYmxlLmNvbnN1bXB0aW9ucyA/PyBbXSkge1xuICAgICAgICBpZiAoIWlzVG9rZW4yKGNvbnN1bXB0aW9uKSkge1xuICAgICAgICAgIC8vIEEgdjEgdG9rZW4gY2FycmllcyBubyBjYXJkaW5hbGl0eSwgc28gdGhlcmUgaXMgbm8gYXJpdHkgdG8gY2hlY2suXG4gICAgICAgICAgdW52ZXJpZmlhYmxlQ29uc3VtcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgaW5qZWN0YWJsZUlkOiBuYW1lc3BhY2VkSWQsXG4gICAgICAgICAgICBjb25zdW1wdGlvbklkOiBjb25zdW1wdGlvbi5pZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBjYXJkaW5hbGl0eSB9ID0gY29uc3VtcHRpb247XG5cbiAgICAgICAgaWYgKGNhcmRpbmFsaXR5ICE9PSAnb25lJyAmJiBjYXJkaW5hbGl0eSAhPT0gJ29uZS1vci1tYW55Jykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGluZGV4IGhvbGRzIGV2ZXJ5IHJlZ2lzdHJhdGlvbiBtYWRlIGFnYWluc3QgdGhlIHRva2VuIG9yIGFueSBvZlxuICAgICAgICAvLyBpdHMgYC5mb3IoKWAgZGVyaXZhdGl2ZXMsIHdoaWNoIGlzIGhvdyBhIGdlbmVyYWwtdG9rZW4gZGVjbGFyYXRpb25cbiAgICAgICAgLy8gaXMgc2F0aXNmaWVkIGJ5IGFuIGltcGxlbWVudGF0aW9uIG9mIG9uZSBvZiBpdHMgc3BlY2lmaWMgdG9rZW5zLlxuICAgICAgICBjb25zdCByZWdpc3RlcmVkID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChjb25zdW1wdGlvbik7XG5cbiAgICAgICAgLy8gT25seSB0aGUgbG93ZXIgYm91bmQgaXMgY2hlY2tlZCBoZXJlOiB0aGUgdXBwZXIgYm91bmQgY2Fubm90IGJlXG4gICAgICAgIC8vIGV4Y2VlZGVkLCBzaW5jZSByZWdpc3RlcmluZyByZWplY3RzIHRoZSBzZWNvbmQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgIGlmIChyZWdpc3RlcmVkID09PSB1bmRlZmluZWQgfHwgcmVnaXN0ZXJlZC5zaXplID09PSAwKSB7XG4gICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYEluamVjdGFibGUgXCIke25hbWVzcGFjZWRJZH1cIiBjb25zdW1lcyBpbmplY3Rpb24gdG9rZW4gXCIke2NvbnN1bXB0aW9uLmlkfVwiIHdpdGggY2FyZGluYWxpdHkgXCIke2NhcmRpbmFsaXR5fVwiLCBidXQgaXQgaGFzIG5vIHJlZ2lzdHJhdGlvbnMuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZpb2xhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gdmFsaWRhdGUgY29udGFpbmVyIFwiJHtjb250YWluZXJJZH1cIiwgYnV0IGZvdW5kIHZpb2xhdGlvbnM6XFxuJHt2aW9sYXRpb25zXG4gICAgICAgICAgLm1hcCh2aW9sYXRpb24gPT4gYCAtICR7dmlvbGF0aW9ufWApXG4gICAgICAgICAgLmpvaW4oJ1xcbicpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNvcnRlZCA9IGlkcyA9PiBbLi4uaWRzXS5zb3J0KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmVyaWZpZWRJbmplY3RhYmxlczoge1xuICAgICAgICBjb3VudDogdmVyaWZpZWRJZHMubGVuZ3RoLFxuICAgICAgICBpZHM6IHNvcnRlZCh2ZXJpZmllZElkcyksXG4gICAgICB9LFxuXG4gICAgICB1bnZlcmlmaWVkSW5qZWN0YWJsZXM6IHtcbiAgICAgICAgY291bnQ6IHVudmVyaWZpZWRJZHMubGVuZ3RoLFxuICAgICAgICBpZHM6IHNvcnRlZCh1bnZlcmlmaWVkSWRzKSxcbiAgICAgIH0sXG5cbiAgICAgIHVudmVyaWZpYWJsZUNvbnN1bXB0aW9ucyxcbiAgICB9O1xuICB9O1xuIiwgImltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5pbXBvcnQgeyBpbmplY3Rpb25Ub2tlblN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3Rpb25Ub2tlbjIvZ2V0SW5qZWN0aW9uVG9rZW4yJztcblxuY29uc3QgdGFyZ2V0SXNWMiA9IGluamVjdGFibGUgPT5cbiAgaW5qZWN0YWJsZS5hbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyIHx8XG4gIGluamVjdGFibGUuYWxpYXNUeXBlID09PSBpbmplY3Rpb25Ub2tlblN5bWJvbDI7XG5cbi8vIHYxLXNoYXBlIHN0dWI6IChkaSwgLi4ucGFyYW1zKSA9PiBpbnN0YW5jZS4gV3JhcHMgZm9yIHYyIHRhcmdldHMuXG5jb25zdCBhc1YxU2hhcGUgPSAoc3R1YiwgaXNWMlRhcmdldCkgPT5cbiAgaXNWMlRhcmdldFxuICAgID8gZGkgPT5cbiAgICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgICBzdHViKGRpLCAuLi5wYXJhbXMpXG4gICAgOiBzdHViO1xuXG4vLyB2Mi1zaGFwZSBzdHViOiAoZGkpID0+ICguLi5wYXJhbXMpID0+IGluc3RhbmNlLiBVbndyYXBzIGZvciB2MSB0YXJnZXRzLlxuY29uc3QgYXNWMlNoYXBlID0gKHN0dWIsIGlzVjJUYXJnZXQpID0+XG4gIGlzVjJUYXJnZXQgPyBzdHViIDogKGRpLCAuLi5wYXJhbXMpID0+IHN0dWIoZGkpKC4uLnBhcmFtcyk7XG5cbmNvbnN0IGVhcmx5T3ZlcnJpZGVJbXBsRm9yID1cbiAgbm9ybWFsaXplID0+XG4gICh7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KSA9PlxuICAoYWxpYXMsIGluc3RhbnRpYXRlU3R1YikgPT4ge1xuICAgIGNvbnN0IHJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIHNpbmdsZSBpbXBsZW1lbnRhdGlvbiBvZiBpbmplY3Rpb24gdG9rZW4gXCIke1xuICAgICAgICAgIGFsaWFzLmlkXG4gICAgICAgIH1cIiwgYnV0IGZvdW5kIG11bHRpcGxlIHJlZ2lzdGVyZWQgaW1wbGVtZW50YXRpb25zOiBcIiR7cmVsYXRlZEluamVjdGFibGVzXG4gICAgICAgICAgLm1hcChnZXROYW1lc3BhY2VkSWQpXG4gICAgICAgICAgLmpvaW4oJ1wiLCBcIicpfVwiLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID09PSAwICYmIGlzSW5qZWN0aW9uVG9rZW4oYWxpYXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBlYXJseS1vdmVycmlkZSBhbiBpbmplY3Rpb24gdG9rZW4gXCIke2FsaWFzLmlkfVwiLCBidXQgdGhhdCBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbEluamVjdGFibGUgPSByZWxhdGVkSW5qZWN0YWJsZXNbMF0gfHwgYWxpYXM7XG5cbiAgICBpZiAoYWxyZWFkeUluamVjdGVkLmhhcyhhbGlhcykgfHwgYWxyZWFkeUluamVjdGVkLmhhcyhvcmlnaW5hbEluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBvdmVycmlkZSBpbmplY3RhYmxlIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgb3JpZ2luYWxJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaXQgd2FzIGFscmVhZHkgaW5qZWN0ZWQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLnNldChvcmlnaW5hbEluamVjdGFibGUsIHtcbiAgICAgIC4uLm9yaWdpbmFsSW5qZWN0YWJsZSxcbiAgICAgIG92ZXJyaWRkZW5JbmplY3RhYmxlOiBvcmlnaW5hbEluamVjdGFibGUsXG4gICAgICBjYXVzZXNTaWRlRWZmZWN0czogZmFsc2UsXG4gICAgICBpbnN0YW50aWF0ZTogbm9ybWFsaXplKGluc3RhbnRpYXRlU3R1YiwgdGFyZ2V0SXNWMihvcmlnaW5hbEluamVjdGFibGUpKSxcbiAgICB9KTtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IGVhcmx5T3ZlcnJpZGVGb3IgPSBlYXJseU92ZXJyaWRlSW1wbEZvcihhc1YxU2hhcGUpO1xuZXhwb3J0IGNvbnN0IGVhcmx5T3ZlcnJpZGUyRm9yID0gZWFybHlPdmVycmlkZUltcGxGb3IoYXNWMlNoYXBlKTtcbiIsICJpbXBvcnQgeyBwcmVJbmplY3RDYWxsYmFja1Rva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG4vLyBOb24td3JhcHBpbmcgZW50cnkgaG9vazogZmlyZXMgZXZlcnkgcHJlLWluamVjdCBjYWxsYmFjayBhcHBsaWNhYmxlIHRvIHRoZVxuLy8gYWxpYXMsIHRoZW4gY2FsbHMgdGhyb3VnaC4gRmlyZXMgYmVmb3JlIGFueSByZXNvbHV0aW9uIG9yIGZhaWx1cmUgY2hlY2ssXG4vLyBzbyBhIGNhbGxiYWNrIGNhbiByZWdpc3RlciBpbXBsZW1lbnRhdGlvbnMgdGhhdCB0aGUgc2FtZSBvcGVyYXRpb24gdGhlblxuLy8gb2JzZXJ2ZXMuIGBraW5kYCBpcyBiYWtlZCBpbiBhdCB3cmFwIHRpbWU6ICdpbmplY3QnIGZvciB0aGUgaW5qZWN0XG4vLyB2YXJpYW50cywgJ2luamVjdE1hbnknIGZvciB0aGUgaW5qZWN0TWFueSB2YXJpYW50cyAod2l0aE1ldGEgdmFyaWFudHNcbi8vIHJlcG9ydCB0aGVpciBiYXNlIGtpbmQpLiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGluamVjdGluZyBwYXJ0eTogdGhlXG4vLyBpbmplY3RhYmxlIHdob3NlIGluc3RhbnRpYXRlIG1hZGUgdGhlIGNhbGwsIG9yIHRoZSBjb250YWluZXIgcm9vdCBmb3Jcbi8vIGluamVjdHMgbWFkZSBkaXJlY3RseSBvbiBgZGlgLlxuZXhwb3J0IGNvbnN0IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3IgPVxuICAoeyBkZWNvcmF0b3JDYWNoZSwgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAga2luZCA9PlxuICB0b0JlQ2FsbGVkID0+XG4gIGFyZ3MgPT4ge1xuICAgIC8vIFdoZW4gZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0IGlzIG51bGwsIGEgY2FsbGJhY2sgd2FzIHJlZ2lzdGVyZWQgb3JcbiAgICAvLyBkZXJlZ2lzdGVyZWQgXHUyMDE0IGludmFsaWRhdGUgYWxsIHBlci1hbGlhcyBjYWNoZWQgY2FsbGJhY2sgbGlzdHMuXG4gICAgaWYgKGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9PT0gbnVsbCkge1xuICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0ID0gdHJ1ZTtcbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdEJ5QWxpYXMgPSBuZXcgTWFwKCk7XG4gICAgfVxuXG4gICAgbGV0IGNhbGxiYWNrcyA9IGRlY29yYXRvckNhY2hlLnByZUluamVjdEJ5QWxpYXMuZ2V0KGFyZ3MuYWxpYXMpO1xuXG4gICAgaWYgKGNhbGxiYWNrcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBhcHBsaWNhYmxlID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgICBkZWNvcmF0b3JUb2tlbjogcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbiAgICAgICAgdGFyZ2V0OiBhcmdzLmFsaWFzLFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBhcmdzLmluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcblxuICAgICAgY2FsbGJhY2tzID0gYXBwbGljYWJsZS5sZW5ndGggPiAwID8gYXBwbGljYWJsZSA6IG51bGw7XG5cbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdEJ5QWxpYXMuc2V0KGFyZ3MuYWxpYXMsIGNhbGxiYWNrcyk7XG4gICAgfVxuXG4gICAgaWYgKGNhbGxiYWNrcyAhPT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBjYWxsYmFja3MpIHtcbiAgICAgICAgY2FsbGJhY2soYXJncy5hbGlhcywga2luZCwgYXJncy5pbmplY3RpbmdJbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9CZUNhbGxlZChhcmdzKTtcbiAgfTtcbiIsICJpbXBvcnQgeyBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbiB9IGZyb20gJy4vdG9rZW5zJztcblxuZXhwb3J0IGNvbnN0IGZpcmVQdXJnZUNhbGxiYWNrc0ZvciA9XG4gICh7IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzIH0pID0+XG4gIChpbmplY3RhYmxlLCBpbnN0YW5jZSwga2V5QXJyYXkpID0+IHtcbiAgICBjb25zdCBwYXlsb2FkID0geyBpbnN0YW5jZSB9O1xuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgZGVjb3JhdG9yVG9rZW46IGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuLFxuICAgICAgdGFyZ2V0OiBpbmplY3RhYmxlLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogaW5qZWN0YWJsZSxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgY2Igb2YgY2FsbGJhY2tzKSB7XG4gICAgICBjYihwYXlsb2FkKSguLi5rZXlBcnJheSk7XG4gICAgfVxuICB9O1xuIiwgImltcG9ydCB7IGdldFJlbGF0ZWRUb2tlbnMgfSBmcm9tICcuL2dldFJlbGF0ZWRUb2tlbnMnO1xuXG4vLyBSZXR1cm5zIGV2ZXJ5IGRlY29yYXRvci9jYWxsYmFjayBpbnN0YW5jZSB0aGF0IGFwcGxpZXMgdG8gYHRhcmdldGAgZm9yIHRoZVxuLy8gZ2l2ZW4gYGRlY29yYXRvclRva2VuYC4gVGhyZWUgbG9va3VwIGRpbWVuc2lvbnMgYXJlIHVuaWZpZWQ6XG4vL1xuLy8gICAxLiBEaXJlY3Q6ICAgZGVjb3JhdG9yVG9rZW4uZm9yKHRhcmdldCkuXG4vLyAgIDIuIENoYWluOiAgICB3YWxrIGBzcGVjaWZpY1Rva2VuT2ZgIGFuY2VzdG9ycyBvZiB0aGUgY29udHJhY3QgdG9rZW4gXHUyMDE0XG4vLyAgICAgICAgICAgICAgICBgdGFyZ2V0LmluamVjdGlvblRva2VuYCBmb3IgaW5qZWN0YWJsZSB0YXJnZXRzLFxuLy8gICAgICAgICAgICAgICAgYHRhcmdldC5zcGVjaWZpY1Rva2VuT2ZgIGZvciB0b2tlbiB0YXJnZXRzIFx1MjAxNCBhbmQgbG9vayB1cFxuLy8gICAgICAgICAgICAgICAgYGRlY29yYXRvclRva2VuLmZvcihhbmNlc3RvcilgIGZvciBlYWNoLiBUaGlzIGlzIHN5bW1ldHJpY1xuLy8gICAgICAgICAgICAgICAgd2l0aCB0aGUgcmVnaXN0cmF0aW9uLXRpbWUgY2hhaW4gaW5kZXhpbmcgaW5cbi8vICAgICAgICAgICAgICAgIGBnZXRSZWxhdGVkVG9rZW5zYDogYSBjb250cmlidXRvciByZWdpc3RlcmVkIHVuZGVyXG4vLyAgICAgICAgICAgICAgICBgc29tZVRva2VuLmZvcihzcGVjaWZpZXIpYCBpcyBhbHJlYWR5IHJldHJpZXZhYmxlIHZpYVxuLy8gICAgICAgICAgICAgICAgYGluamVjdE1hbnkoc29tZVRva2VuKWAsIGFuZCBhIGRlY29yYXRvciB0YXJnZXRpbmcgdGhlXG4vLyAgICAgICAgICAgICAgICBwYXJlbnQgY29udHJhY3Qgc2hvdWxkIGZpcmUgZm9yIHRoZSBjaGlsZCBzcGVjaWFsaXphdGlvbi5cbi8vICAgMy4gVGFnczogICAgIGZvciBldmVyeSB0YWcgb2YgdGhlIHRhcmdldCBhbmQgb2YgZXZlcnkgdG9rZW4gaW4gaXRzXG4vLyAgICAgICAgICAgICAgICBjaGFpbiwgbG9vayB1cCBgZGVjb3JhdG9yVG9rZW4uZm9yKHRhZylgLiBUYWdzIGFyZSBkZWR1cGVkXG4vLyAgICAgICAgICAgICAgICBhY3Jvc3MgdGhlc2Ugc291cmNlczogYC5mb3IoKWAgY2hpbGRyZW4gaW5oZXJpdCB0aGUgZ2VuZXJhbFxuLy8gICAgICAgICAgICAgICAgdG9rZW4ncyB0YWdzLCBzbyB0aGUgc2FtZSB0YWcgdHlwaWNhbGx5IG9jY3VycyBvbiBldmVyeVxuLy8gICAgICAgICAgICAgICAgY2hhaW4gbGV2ZWwuIFRoaXMgbWFrZXMgYSB0YWcgb24gYSB0b2tlbiBmaXJlIGV2ZXJ5d2hlcmVcbi8vICAgICAgICAgICAgICAgIGAuZm9yKHRva2VuKWAgd291bGQuXG4vL1xuLy8gSW5qZWN0YWJsZXMgd2l0aG91dCBhbiBgaW5qZWN0aW9uVG9rZW5gIHNraXAgdGhlIGNoYWluIGRpbWVuc2lvbi5cbi8vXG4vLyBGYXN0IHBhdGg6IGlmIG5vIGluamVjdGFibGUgaXMgcmVnaXN0ZXJlZCB1bmRlciB0aGUgYWJzdHJhY3QgYGRlY29yYXRvclRva2VuYFxuLy8gaXRzZWxmLCBub25lIG9mIHRoZSB0aHJlZSBsb29rdXAgZGltZW5zaW9ucyBjYW4gZXZlciBtYXRjaC4gYHJlZ2lzdGVyLmpzYFxuLy8gaW5kZXhlcyBldmVyeSBzcGVjaWZpYyBkZWNvcmF0b3IgYnkgd2Fsa2luZyBgZ2V0UmVsYXRlZFRva2VucyhpbmplY3Rpb25Ub2tlbilgLFxuLy8gd2hpY2ggdGVybWluYXRlcyBhdCB0aGUgYWJzdHJhY3QgdG9rZW4gXHUyMDE0IHNvIHRoZSBhYnN0cmFjdCBzZXQgaXMgbm9uLWVtcHR5XG4vLyBpZmYgYXQgbGVhc3Qgb25lIGRlY29yYXRvciBvZiB0aGlzIHR5cGUgaXMgcmVnaXN0ZXJlZCBhbnl3aGVyZS5cbmNvbnN0IEVNUFRZID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbmV4cG9ydCBjb25zdCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9yc0ZvciA9XG4gICh7IGluamVjdE1hbnksIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbiB9KSA9PlxuICAoeyBkZWNvcmF0b3JUb2tlbiwgdGFyZ2V0LCBpbmplY3RpbmdJbmplY3RhYmxlIH0pID0+IHtcbiAgICBjb25zdCByZWdpc3RlcmVkID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChkZWNvcmF0b3JUb2tlbik7XG5cbiAgICBpZiAoIXJlZ2lzdGVyZWQgfHwgcmVnaXN0ZXJlZC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0ID0gW107XG5cbiAgICAvLyBNb3N0IGRpc3BhdGNoIGtleXMgaGF2ZSBubyByZWdpc3RyYXRpb25zIFx1MjAxNCBjaGVja2luZyB0aGUgcmVnaXN0cmF0aW9uXG4gICAgLy8gaW5kZXggZGlyZWN0bHkgc2tpcHMgdGhlIGluamVjdE1hbnkgbWFjaGluZXJ5IGZvciB0aGVtLiBgLmZvcigpYCBpdHNlbGZcbiAgICAvLyBpcyBjaGVhcCBvbiByZXBlYXQgY2FsbHMgKG1lbW9pemVkIGJ5IHNwZWNpZmllcikuXG4gICAgY29uc3QgZGlzcGF0Y2ggPSBhbGlhcyA9PiB7XG4gICAgICBjb25zdCByZWdpc3RlcmVkRm9yQWxpYXMgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGFsaWFzKTtcblxuICAgICAgaWYgKHJlZ2lzdGVyZWRGb3JBbGlhcyAmJiByZWdpc3RlcmVkRm9yQWxpYXMuc2l6ZSA+IDApIHtcbiAgICAgICAgb3V0LnB1c2goXG4gICAgICAgICAgLi4uaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRpc3BhdGNoKGRlY29yYXRvclRva2VuLmZvcih0YXJnZXQpKTtcblxuICAgIGNvbnN0IGNoYWluID0gZ2V0UmVsYXRlZFRva2VucyhcbiAgICAgIHRhcmdldC5pbmplY3Rpb25Ub2tlbiA/PyB0YXJnZXQuc3BlY2lmaWNUb2tlbk9mLFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHQgb2YgY2hhaW4pIHtcbiAgICAgIGRpc3BhdGNoKGRlY29yYXRvclRva2VuLmZvcih0KSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0VGFncyA9IHRhcmdldC50YWdzO1xuXG4gICAgaWYgKHRhcmdldFRhZ3MpIHtcbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhcmdldFRhZ3MpIHtcbiAgICAgICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHRhZykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlZHVwIHdpdGhvdXQgYWxsb2NhdGlvbnM6IGAuZm9yKClgIGNoaWxkcmVuIHNoYXJlIHRoZSBnZW5lcmFsIHRva2VuJ3NcbiAgICAvLyB0YWdzIGFycmF5LCBzbyBhIGNoYWluIGNhcnJpZXMgYXQgbW9zdCBvbmUgZGlzdGluY3QgdGFncyBhcnJheSBcdTIwMTQgc2tpcFxuICAgIC8vIHJlcGVhdHMgYnkgcmVmZXJlbmNlLCBhbmQgc2tpcCB0YWdzIGFscmVhZHkgZGlzcGF0Y2hlZCB2aWEgdGFyZ2V0LnRhZ3NcbiAgICAvLyB3aXRoIGluZGV4T2YgKHRoZSBhcnJheXMgYXJlIHRpbnkpLlxuICAgIGxldCBwcm9jZXNzZWRDaGFpblRhZ3MgPSB0YXJnZXRUYWdzO1xuXG4gICAgZm9yIChjb25zdCB0IG9mIGNoYWluKSB7XG4gICAgICBjb25zdCBjaGFpblRhZ3MgPSB0LnRhZ3M7XG5cbiAgICAgIGlmICghY2hhaW5UYWdzIHx8IGNoYWluVGFncyA9PT0gcHJvY2Vzc2VkQ2hhaW5UYWdzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzZWRDaGFpblRhZ3MgPSBjaGFpblRhZ3M7XG5cbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIGNoYWluVGFncykge1xuICAgICAgICBpZiAodGFyZ2V0VGFncyAmJiB0YXJnZXRUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3BhdGNoKGRlY29yYXRvclRva2VuLmZvcih0YWcpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xuICB9O1xuIiwgImltcG9ydCB7IHByaXZhdGVJbmplY3RGb3IgfSBmcm9tICcuL3ByaXZhdGVJbmplY3RGb3InO1xuaW1wb3J0IHsgd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3IgfSBmcm9tICcuL3dpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yJztcbmltcG9ydCB7IHByaXZhdGVJbmplY3RNYW55Rm9yIGFzIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yIH0gZnJvbSAnLi9wcml2YXRlSW5qZWN0TWFueUZvcic7XG5pbXBvcnQgeyByZWdpc3RlckZvciwgcmVnaXN0ZXJTaW5nbGVGb3IgfSBmcm9tICcuL3JlZ2lzdGVyJztcbmltcG9ydCB7IHB1cmdlSW5zdGFuY2VzRm9yLCBwdXJnZVN0b3JlZEluc3RhbmNlc0ZvciB9IGZyb20gJy4vcHVyZ2VJbnN0YW5jZXMnO1xuaW1wb3J0IHsgZGVyZWdpc3RlckZvciB9IGZyb20gJy4vZGVyZWdpc3Rlcic7XG5pbXBvcnQgeyBvdmVycmlkZUZvciwgdW5vdmVycmlkZUZvciB9IGZyb20gJy4vb3ZlcnJpZGUnO1xuaW1wb3J0IHsgZ2V0TmFtZXNwYWNlZElkRm9yIH0gZnJvbSAnLi9nZXROYW1lc3BhY2VkSWRGb3InO1xuaW1wb3J0IHsgZ2V0U2NvcGVkSWRGb3IgfSBmcm9tICcuL2dldFNjb3BlZElkRm9yJztcbmltcG9ydCB7IGNoZWNrRm9yTm9NYXRjaGVzRm9yIH0gZnJvbSAnLi9jaGVja0Zvck5vTWF0Y2hlc0Zvcic7XG5pbXBvcnQgeyBjaGVja0ZvclRvb01hbnlNYXRjaGVzRm9yIH0gZnJvbSAnLi9jaGVja0ZvclRvb01hbnlNYXRjaGVzJztcbmltcG9ydCB7IGNoZWNrRm9yU2lkZUVmZmVjdHNGb3IgfSBmcm9tICcuL2NoZWNrRm9yU2lkZUVmZmVjdHNGb3InO1xuaW1wb3J0IHsgY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yIH0gZnJvbSAnLi9jaGVja0ZvckFic3RyYWN0VG9rZW5Gb3InO1xuaW1wb3J0IHsgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yIH0gZnJvbSAnLi9jaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHlGb3InO1xuaW1wb3J0IHsgY2hlY2tGb3JVbmRlY2xhcmVkQ29uc3VtcHRpb25Gb3IgfSBmcm9tICcuL2NoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yJztcbmltcG9ydCB7IHZhbGlkYXRlRm9yIH0gZnJvbSAnLi92YWxpZGF0ZSc7XG5pbXBvcnQgeyBnZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3IgfSBmcm9tICcuL2dldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcic7XG5pbXBvcnQgeyBlYXJseU92ZXJyaWRlRm9yLCBlYXJseU92ZXJyaWRlMkZvciB9IGZyb20gJy4vZWFybHktb3ZlcnJpZGUnO1xuaW1wb3J0IHtcbiAgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuLFxuICBwcmVJbmplY3RDYWxsYmFja1Rva2VuLFxufSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9yIH0gZnJvbSAnLi93aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9yJztcbmltcG9ydCB7IGlzUmVsYXRlZFRvVG9rZW4gfSBmcm9tICcuL2dldFJlbGF0ZWRUb2tlbnMnO1xuaW1wb3J0IHsgZmlyZVB1cmdlQ2FsbGJhY2tzRm9yIH0gZnJvbSAnLi9maXJlUHVyZ2VDYWxsYmFja3NGb3InO1xuaW1wb3J0IHsgZ2V0QXBwbGljYWJsZURlY29yYXRvcnNGb3IgfSBmcm9tICcuL2dldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yJztcbmltcG9ydCB7IGlzQ29tcG9zaXRlU3RvcmFnZSB9IGZyb20gJy4vcHJpdmF0ZUluamVjdEZvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRhaW5lcklkID0+IHtcbiAgY29uc3QgaW5qZWN0YWJsZVNldCA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBkZWNvcmF0b3JDYWNoZSA9IHtcbiAgICBpbmplY3Rpb246IG51bGwsXG4gICAgaW5qZWN0aW9uQnlBbGlhczogbmV3IE1hcCgpLFxuICAgIHByZUluamVjdDogbnVsbCxcbiAgICBwcmVJbmplY3RCeUFsaWFzOiBuZXcgTWFwKCksXG4gIH07XG4gIGNvbnN0IG92ZXJyaWRpbmdJbmplY3RhYmxlcyA9IG5ldyBNYXAoKTtcbiAgbGV0IHNpZGVFZmZlY3RzQXJlUHJldmVudGVkID0gdHJ1ZTtcbiAgY29uc3QgYWxyZWFkeUluamVjdGVkID0gbmV3IFNldCgpO1xuICBjb25zdCBpbmplY3RhYmxlc1dpdGhQZXJtaXR0ZWRTaWRlRWZmZWN0cyA9IG5ldyBTZXQoKTtcbiAgY29uc3QgaW5qZWN0YWJsZUlkU2V0ID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0ID0gbmV3IE1hcCgpO1xuICBjb25zdCBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbiA9IG5ldyBNYXAoKTtcbiAgY29uc3QgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwID0gbmV3IE1hcCgpO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50TWFwID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0IGdldE5hbWVzcGFjZWRJZCA9IGdldE5hbWVzcGFjZWRJZEZvcihpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCk7XG4gIGNvbnN0IGdldFNjb3BlZElkID0gZ2V0U2NvcGVkSWRGb3IoaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQpO1xuXG4gIGNvbnN0IGdldFJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcih7XG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIGluamVjdGFibGVTZXQsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbnRhaW5lclJvb3RDb250ZXh0SXRlbSA9IHtcbiAgICBpbmplY3RhYmxlOiB7IGlkOiBjb250YWluZXJJZCwgYWxpYXNUeXBlOiAnY29udGFpbmVyJyB9LFxuICB9O1xuXG4gIGNvbnN0IHJvb3RJbmplY3RhYmxlID0gY29udGFpbmVyUm9vdENvbnRleHRJdGVtLmluamVjdGFibGU7XG5cbiAgY29uc3QgY2hlY2tGb3JBYnN0cmFjdFRva2VuID0gY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yKHsgZ2V0TmFtZXNwYWNlZElkIH0pO1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yVW5rbm93bk1ldGEgPVxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yKHtcbiAgICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICAgIC8vIEVsZW1lbnRzIGdvIHRocm91Z2ggdGhlIGVsZW1lbnQgc2xvdCwgbm90IGBwcml2YXRlRGkuaW5qZWN0YDogZW50cnlcbiAgICAgIC8vIHdyYXBwZXJzIChvbmNlLXBlci1vcGVyYXRpb24gaG9va3MpIG11c3Qgbm90IHJlLWZpcmUgcGVyIGVsZW1lbnQsXG4gICAgICAvLyB3aGlsZSBpbmplY3Rpb24gZGVjb3JhdG9ycyBzdGlsbCBhcHBseSBwZXIgZWxlbWVudC5cbiAgICAgIGdldEluamVjdDogKCkgPT4gZWxlbWVudEluamVjdCxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogZmFsc2UsXG4gICAgfSk7XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogdHJ1ZSxcbiAgICB9KTtcblxuICBjb25zdCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yKHtcbiAgICBpbmplY3RNYW55OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gIH0pO1xuXG4gIGNvbnN0IGdldFNpZGVFZmZlY3RzQXJlUHJldmVudGVkID0gaW5qZWN0YWJsZSA9PlxuICAgIHNpZGVFZmZlY3RzQXJlUHJldmVudGVkICYmXG4gICAgaW5qZWN0YWJsZS5jYXVzZXNTaWRlRWZmZWN0cyAmJlxuICAgICFpbmplY3RhYmxlc1dpdGhQZXJtaXR0ZWRTaWRlRWZmZWN0cy5oYXMoaW5qZWN0YWJsZSk7XG5cbiAgY29uc3QgY2hlY2tGb3JTaWRlRWZmZWN0cyA9IGNoZWNrRm9yU2lkZUVmZmVjdHNGb3Ioe1xuICAgIGdldFNpZGVFZmZlY3RzQXJlUHJldmVudGVkLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgfSk7XG5cbiAgY29uc3QgY2hlY2tGb3JOb01hdGNoZXMgPSBjaGVja0Zvck5vTWF0Y2hlc0Zvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBjaGVja0ZvclRvb01hbnlNYXRjaGVzID0gY2hlY2tGb3JUb29NYW55TWF0Y2hlc0Zvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHkgPSBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHlGb3Ioe1xuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgfSk7XG5cbiAgY29uc3QgY2hlY2tGb3JVbmRlY2xhcmVkQ29uc3VtcHRpb24gPSBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbkZvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICAvLyBFbmZvcmNlbWVudCB3cmFwcyB0aGUgc2xvdHMgcmF0aGVyIHRoYW4gbGl2aW5nIGluc2lkZSB0aGUgb3BlcmF0aW9uXG4gIC8vIGZ1bmN0aW9ucywgc28gdGhhdCB0aGUgbWFjaGluZXJ5IFx1MjAxNCBkZWNvcmF0b3IgYW5kIGNhbGxiYWNrIGRpc3BhdGNoLCBwdXJnZVxuICAvLyBjYWxsYmFja3MgXHUyMDE0IHN0YXlzIGV4ZW1wdDogaXQgaG9sZHMgdGhlIHJhdyBvcGVyYXRpb25zIGNhcHR1cmVkIGF0XG4gIC8vIGNvbnN0cnVjdGlvbiBhbmQgbmV2ZXIgcmVhZHMgdGhlc2Ugc2xvdHMuXG4gIGNvbnN0IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50ID0gdG9CZUNhbGxlZCA9PiBhcmdzID0+IHtcbiAgICBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbihhcmdzKTtcblxuICAgIHJldHVybiB0b0JlQ2FsbGVkKGFyZ3MpO1xuICB9O1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RVbmtub3duTWV0YSA9IHByaXZhdGVJbmplY3RGb3Ioe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBpbmplY3RhYmxlU2V0LFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldERpOiAoKSA9PiBwcml2YXRlRGksXG4gICAgY2hlY2tGb3JOb01hdGNoZXMsXG4gICAgY2hlY2tGb3JUb29NYW55TWF0Y2hlcyxcbiAgICBjaGVja0ZvclNpZGVFZmZlY3RzLFxuICAgIGNoZWNrRm9yQWJzdHJhY3RUb2tlbixcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgICBnZXRTY29wZWRJZCxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSk7XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdCA9IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RVbmtub3duTWV0YSh7XG4gICAgd2l0aE1ldGE6IGZhbHNlLFxuICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEgPVxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogdHJ1ZSxcbiAgICB9KTtcblxuICBjb25zdCB3aXRoSW5qZWN0aW9uRGVjb3JhdG9ycyA9IHdpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yKHtcbiAgICBkZWNvcmF0b3JDYWNoZSxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSk7XG5cbiAgLy8gSW5qZWN0aW9uIGRlY29yYXRvcnMgYXBwbHkgb25seSBvbiB0aGUgcGVyLWluamVjdGFibGUgaW5qZWN0IHBhdGguXG4gIC8vIGluamVjdE1hbnkgcmVzb2x2ZXMgcmVsYXRlZCBpbmplY3RhYmxlcyBhbmQgY2FsbHMgdGhlIChkZWNvcmF0ZWQpIGluamVjdFxuICAvLyBvbiBlYWNoLCBzbyBkZWNvcmF0b3JzIHN0aWxsIGZpcmUgcGVyIGVsZW1lbnQgXHUyMDE0IGJ1dCB0aGUgdG9rZW4tbGV2ZWxcbiAgLy8gaW5qZWN0TWFueSBpcyBuZXZlciB3cmFwcGVkLlxuICBjb25zdCBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0ID0gd2l0aEluamVjdGlvbkRlY29yYXRvcnMoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdCxcbiAgKTtcblxuICBjb25zdCBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEgPSB3aXRoSW5qZWN0aW9uRGVjb3JhdG9ycyhcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICk7XG5cbiAgY29uc3Qgd2l0aFByZUluamVjdENhbGxiYWNrcyA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3Ioe1xuICAgIGRlY29yYXRvckNhY2hlLFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICBjb25zdCB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0ID0gd2l0aFByZUluamVjdENhbGxiYWNrcygnaW5qZWN0Jyk7XG5cbiAgY29uc3Qgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdE1hbnkgPVxuICAgIHdpdGhQcmVJbmplY3RDYWxsYmFja3MoJ2luamVjdE1hbnknKTtcblxuICBjb25zdCBwcmVJbmplY3ROb25EZWNvcmF0ZWRJbmplY3QgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0KFxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3QsXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0RGVjb3JhdGVkSW5qZWN0ID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdChcbiAgICBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICApO1xuXG4gIGNvbnN0IHByZUluamVjdE5vbkRlY29yYXRlZEluamVjdFdpdGhNZXRhID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdChcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0RGVjb3JhdGVkSW5qZWN0V2l0aE1ldGEgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0KFxuICAgIGRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSxcbiAgKTtcblxuICBjb25zdCBwcmVJbmplY3RJbmplY3RNYW55ID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdE1hbnkoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0SW5qZWN0TWFueVdpdGhNZXRhID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdE1hbnkoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YSxcbiAgKTtcblxuICAvLyBUaGUgaW5qZWN0IHVzZWQgZm9yIGluamVjdE1hbnkgZWxlbWVudHM6IGRlY29yYXRlZCBwZXIgZWxlbWVudCB3aGVuXG4gIC8vIGluamVjdGlvbiBkZWNvcmF0b3JzIGV4aXN0LCBidXQgbmV2ZXIgd3JhcHBlZCBieSBlbnRyeS1sZXZlbCBob29rc1xuICAvLyAocHJlLWluamVjdCBjYWxsYmFja3MgZmlyZSBvbmNlIHBlciBvcGVyYXRpb24sIG5vdCBwZXIgZWxlbWVudCkuXG4gIGxldCBlbGVtZW50SW5qZWN0ID0gbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdDtcblxuICAvLyBXaXJlcyB0aGUgZGVjb3JhdGVkIGFuZCBwcmUtaW5qZWN0LWhvb2tlZCB2YXJpYW50cyBpbiBvbmx5IHdoaWxlIGF0XG4gIC8vIGxlYXN0IG9uZSBtYXRjaGluZyBjb250cmlidXRvciBpcyByZWdpc3RlcmVkLCBzbyB0aGUgY29tbW9uIGJhcmUgY2FzZVxuICAvLyBwYXlzIG5vIHdyYXBwZXIgZnJhbWUgYXQgYWxsLiBFdmVyeSByZWFkZXIgb2YgdGhlIHByaXZhdGVEaSBzbG90cyAoYW5kXG4gIC8vIGBlbGVtZW50SW5qZWN0YCwgdmlhIHRoZSBnZXRJbmplY3QgdGh1bmspIHJlYWRzIHRoZW0gYXQgY2FsbCB0aW1lLlxuICBjb25zdCBzeW5jSW5qZWN0V2lyaW5nID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWREZWNvcmF0b3JzID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChcbiAgICAgIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICAgICk7XG5cbiAgICBjb25zdCBkZWNvcmF0b3JzQWN0aXZlID1cbiAgICAgIHJlZ2lzdGVyZWREZWNvcmF0b3JzICE9PSB1bmRlZmluZWQgJiYgcmVnaXN0ZXJlZERlY29yYXRvcnMuc2l6ZSA+IDA7XG5cbiAgICBjb25zdCByZWdpc3RlcmVkUHJlSW5qZWN0Q2FsbGJhY2tzID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChcbiAgICAgIHByZUluamVjdENhbGxiYWNrVG9rZW4sXG4gICAgKTtcblxuICAgIGNvbnN0IHByZUluamVjdEFjdGl2ZSA9XG4gICAgICByZWdpc3RlcmVkUHJlSW5qZWN0Q2FsbGJhY2tzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHJlZ2lzdGVyZWRQcmVJbmplY3RDYWxsYmFja3Muc2l6ZSA+IDA7XG5cbiAgICBlbGVtZW50SW5qZWN0ID0gZGVjb3JhdG9yc0FjdGl2ZVxuICAgICAgPyBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0XG4gICAgICA6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3Q7XG5cbiAgICBwcml2YXRlRGkuaW5qZWN0ID0gcHJlSW5qZWN0QWN0aXZlXG4gICAgICA/IGRlY29yYXRvcnNBY3RpdmVcbiAgICAgICAgPyBwcmVJbmplY3REZWNvcmF0ZWRJbmplY3RcbiAgICAgICAgOiBwcmVJbmplY3ROb25EZWNvcmF0ZWRJbmplY3RcbiAgICAgIDogZWxlbWVudEluamVjdDtcblxuICAgIHByaXZhdGVEaS5pbmplY3RXaXRoTWV0YSA9IHByZUluamVjdEFjdGl2ZVxuICAgICAgPyBkZWNvcmF0b3JzQWN0aXZlXG4gICAgICAgID8gcHJlSW5qZWN0RGVjb3JhdGVkSW5qZWN0V2l0aE1ldGFcbiAgICAgICAgOiBwcmVJbmplY3ROb25EZWNvcmF0ZWRJbmplY3RXaXRoTWV0YVxuICAgICAgOiBkZWNvcmF0b3JzQWN0aXZlXG4gICAgICA/IGRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YVxuICAgICAgOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGE7XG5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueSA9IHByZUluamVjdEFjdGl2ZVxuICAgICAgPyBwcmVJbmplY3RJbmplY3RNYW55XG4gICAgICA6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55O1xuXG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSA9IHByZUluamVjdEFjdGl2ZVxuICAgICAgPyBwcmVJbmplY3RJbmplY3RNYW55V2l0aE1ldGFcbiAgICAgIDogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YTtcblxuICAgIC8vIGBlbGVtZW50SW5qZWN0YCBpcyBkZWxpYmVyYXRlbHkgbGVmdCB1bndyYXBwZWQ6IGVuZm9yY2VtZW50IGlzIHBlclxuICAgIC8vIGluamVjdCBvcGVyYXRpb24sIGFuZCBhbiBpbmplY3RNYW55J3MgZWxlbWVudHMgd2VyZSBhbHJlYWR5IGNvdmVyZWQgYnlcbiAgICAvLyB0aGUgY2hlY2sgb24gdGhlIG9wZXJhdGlvbiBpdHNlbGYuXG4gICAgcHJpdmF0ZURpLmluamVjdCA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KHByaXZhdGVEaS5pbmplY3QpO1xuICAgIHByaXZhdGVEaS5pbmplY3RXaXRoTWV0YSA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KFxuICAgICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhLFxuICAgICk7XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnkgPSB3aXRoQ29uc3VtcHRpb25FbmZvcmNlbWVudChwcml2YXRlRGkuaW5qZWN0TWFueSk7XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KFxuICAgICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSxcbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IGZpcmVQdXJnZUNhbGxiYWNrcyA9IGZpcmVQdXJnZUNhbGxiYWNrc0Zvcih7XG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gIH0pO1xuXG4gIGNvbnN0IHJhd1JlZ2lzdGVyU2luZ2xlID0gcmVnaXN0ZXJTaW5nbGVGb3Ioe1xuICAgIGluamVjdGFibGVTZXQsXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgaW5qZWN0YWJsZUlkU2V0LFxuICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAsXG4gICAgZmlyZVB1cmdlQ2FsbGJhY2tzLFxuICB9KTtcblxuICBjb25zdCByZWdpc3RlclNpbmdsZSA9IChpbmplY3RhYmxlLCBjb250ZXh0KSA9PiB7XG4gICAgcmF3UmVnaXN0ZXJTaW5nbGUoaW5qZWN0YWJsZSwgY29udGV4dCk7XG5cbiAgICBsZXQgd2lyaW5nQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbiwgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4pKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSBudWxsO1xuICAgICAgd2lyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbiwgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbikpIHtcbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9IG51bGw7XG4gICAgICB3aXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAod2lyaW5nQ2hhbmdlZCkge1xuICAgICAgc3luY0luamVjdFdpcmluZygpO1xuICAgIH1cbiAgfTtcblxuICAvLyBDYWxsYmFja3MgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgc3BlY2lmaWMgdGFyZ2V0IGFsc28gbGFuZCB1bmRlciB0aGVcbiAgLy8gYWJzdHJhY3QgdG9rZW4sIHNvIGFuIGVtcHR5IHNldCBoZXJlIG1lYW5zIG5vIHB1cmdlIGNhbGxiYWNrIGNhbiBhcHBseS5cbiAgY29uc3QgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KFxuICAgICAgaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG4gICAgKTtcblxuICAgIHJldHVybiByZWdpc3RlcmVkICE9PSB1bmRlZmluZWQgJiYgcmVnaXN0ZXJlZC5zaXplID4gMDtcbiAgfTtcblxuICBjb25zdCBwdXJnZUluc3RhbmNlcyA9IHB1cmdlSW5zdGFuY2VzRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pO1xuXG4gIGNvbnN0IHB1cmdlU3RvcmVkSW5zdGFuY2VzID0gcHVyZ2VTdG9yZWRJbnN0YW5jZXNGb3Ioe1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gICAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxuICB9KTtcblxuICBjb25zdCBkZXJlZ2lzdGVyID0gZGVyZWdpc3RlckZvcih7XG4gICAgaW5qZWN0TWFueTogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAvLyBUb2RvOiBnZXQgcmlkIG9mIGZ1bmN0aW9uIHVzYWdlLlxuICAgIGdldERpOiAoKSA9PiBwcml2YXRlRGksXG4gICAgZGVjb3JhdG9yQ2FjaGUsXG4gICAgc3luY0luamVjdFdpcmluZyxcbiAgfSk7XG5cbiAgY29uc3QgcHJpdmF0ZVJlZ2lzdGVyID0gcmVnaXN0ZXJGb3Ioe1xuICAgIHJlZ2lzdGVyU2luZ2xlLFxuICAgIGluamVjdE1hbnk6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55LFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICBjb25zdCBlYXJseU92ZXJyaWRlID0gZWFybHlPdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBlYXJseU92ZXJyaWRlMiA9IGVhcmx5T3ZlcnJpZGUyRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVGb3Ioe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBlYXJseU92ZXJyaWRlLFxuICB9KTtcblxuICBjb25zdCBvdmVycmlkZTIgPSBvdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGVhcmx5T3ZlcnJpZGU6IGVhcmx5T3ZlcnJpZGUyLFxuICB9KTtcblxuICBjb25zdCB1bm92ZXJyaWRlID0gdW5vdmVycmlkZUZvcih7XG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IHB1cmdlQWxsQnV0T3ZlcnJpZGVzID0gKCkgPT4ge1xuICAgIGluamVjdGFibGVTZXQuY2xlYXIoKTtcbiAgICBhbHJlYWR5SW5qZWN0ZWQuY2xlYXIoKTtcbiAgICBpbmplY3RhYmxlSWRTZXQuY2xlYXIoKTtcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5jbGVhcigpO1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5jbGVhcigpO1xuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5jbGVhcigpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5jbGVhcigpO1xuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAuY2xlYXIoKTtcbiAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSBudWxsO1xuICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9IG51bGw7XG4gICAgc3luY0luamVjdFdpcmluZygpO1xuICB9O1xuXG4gIC8vIFRoZSBpbW1lZGlhdGUgcGFyZW50IGlzIHRoZSBsYXN0IHJlZ2lzdHJhdGlvbiBjb250ZXh0IGl0ZW07IGEgbWlzc2luZ1xuICAvLyBlbnRyeSBvciBhIGNvbnRhaW5lci1sZXZlbCBwYXJlbnQgbm9ybWFsaXplcyB0byByb290SW5qZWN0YWJsZSBzbyB0aGF0XG4gIC8vIHNjb3BlIGNvbXBhcmlzb25zIHdvcmsgdW5pZm9ybWx5IGZvciByb290IGFuZCBuZXN0ZWQgc2NvcGVzLlxuICBjb25zdCBnZXRJbW1lZGlhdGVTY29wZU9mID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmdldChpbmplY3RhYmxlKTtcbiAgICBjb25zdCBpbW1lZGlhdGVQYXJlbnQgPSBjb250ZXh0Py5bY29udGV4dC5sZW5ndGggLSAxXT8uaW5qZWN0YWJsZTtcblxuICAgIHJldHVybiAhaW1tZWRpYXRlUGFyZW50IHx8IGltbWVkaWF0ZVBhcmVudC5hbGlhc1R5cGUgPT09ICdjb250YWluZXInXG4gICAgICA/IHJvb3RJbmplY3RhYmxlXG4gICAgICA6IGltbWVkaWF0ZVBhcmVudDtcbiAgfTtcblxuICBjb25zdCBwcml2YXRlRGkgPSB7XG4gICAgLy8gU3dhcHBlZCBieSBzeW5jSW5qZWN0V2lyaW5nOiB0aGUgZGVjb3JhdGVkIHZhcmlhbnRzIGFyZSB3aXJlZFxuICAgIC8vIGluIG9ubHkgd2hpbGUgYXQgbGVhc3Qgb25lIGluamVjdGlvbiBkZWNvcmF0b3IgaXMgcmVnaXN0ZXJlZCwgc28gdGhlXG4gICAgLy8gY29tbW9uIG5vLWRlY29yYXRvciBjYXNlIHBheXMgbm8gd3JhcHBlciBmcmFtZSBhdCBhbGwuXG4gICAgaW5qZWN0OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICAgIGluamVjdFdpdGhNZXRhOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICAgaW5qZWN0TWFueTogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueVdpdGhNZXRhLFxuXG4gICAgaW5qZWN0RmFjdG9yeTpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3QoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICByZWdpc3RlcjogcHJpdmF0ZVJlZ2lzdGVyLFxuICAgIGRlcmVnaXN0ZXIsXG4gICAgb3ZlcnJpZGUsXG4gICAgb3ZlcnJpZGUyLFxuICAgIGVhcmx5T3ZlcnJpZGUsXG4gICAgZWFybHlPdmVycmlkZTIsXG4gICAgdW5vdmVycmlkZSxcblxuICAgIHJlc2V0OiAoKSA9PiB7XG4gICAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuY2xlYXIoKTtcbiAgICB9LFxuXG4gICAgcGVybWl0U2lkZUVmZmVjdHM6IGFsaWFzID0+IHtcbiAgICAgIGlmIChhbGlhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNpZGVFZmZlY3RzQXJlUHJldmVudGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5mb3JFYWNoKGluamVjdGFibGUgPT5cbiAgICAgICAgaW5qZWN0YWJsZXNXaXRoUGVybWl0dGVkU2lkZUVmZmVjdHMuYWRkKGluamVjdGFibGUpLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgcHVyZ2U6IHB1cmdlSW5zdGFuY2VzLFxuXG4gICAgc2NvcGVkUHVyZ2U6IChzY29wZUluamVjdGFibGUsIGFsaWFzLCAuLi5rZXlQYXJ0cykgPT4ge1xuICAgICAgLy8gV2l0aG91dCBhbiBhbGlhcywgdGhlIHNjb3BlJ3Mgb3duIGluc3RhbmNlcyBhbmQgdGhvc2Ugb2Ygd2hhdGV2ZXIgaXRcbiAgICAgIC8vIHJlZ2lzdGVyZWQgZGlyZWN0bHkuXG4gICAgICBpZiAoYWxpYXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnRNYXAuZ2V0KHNjb3BlSW5qZWN0YWJsZSk7XG5cbiAgICAgICAgcHVyZ2VTdG9yZWRJbnN0YW5jZXMoXG4gICAgICAgICAgY2hpbGRyZW4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBbc2NvcGVJbmplY3RhYmxlXVxuICAgICAgICAgICAgOiBbc2NvcGVJbmplY3RhYmxlLCAuLi5jaGlsZHJlbl0sXG4gICAgICAgICAga2V5UGFydHMsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG4gICAgICBjb25zdCBhbGxvd2VkQ2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50TWFwLmdldChzY29wZUluamVjdGFibGUpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluamVjdGFibGUgPSBpbmplY3RhYmxlc1tpXTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5qZWN0YWJsZSAhPT0gc2NvcGVJbmplY3RhYmxlICYmXG4gICAgICAgICAgIWFsbG93ZWRDaGlsZHJlbj8uaGFzKGluamVjdGFibGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUcmllZCB0byBwdXJnZSBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICAgICl9XCIgZnJvbSBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgc2NvcGVJbmplY3RhYmxlLFxuICAgICAgICAgICAgKX1cIiwgYnV0IGl0IGlzIG5vdCB3aXRoaW4gaXRzIHJlZ2lzdHJhdGlvbiBjb250ZXh0IHRyZWUuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1cmdlU3RvcmVkSW5zdGFuY2VzKGluamVjdGFibGVzLCBrZXlQYXJ0cyk7XG4gICAgfSxcblxuICAgIHB1cmdlQWxsQnV0T3ZlcnJpZGVzLFxuICAgIGhhc1JlZ2lzdHJhdGlvbnM6IGFsaWFzID0+ICEhZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5sZW5ndGgsXG4gICAgZ2V0TnVtYmVyT2ZSZWdpc3RyYXRpb25zOiBhbGlhcyA9PiBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpLmxlbmd0aCxcblxuICAgIHJlZ2lzdGVyZWRJblNjb3BlT2Y6IChzY29wZUluamVjdGFibGUsIGFsaWFzKSA9PlxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5zb21lKFxuICAgICAgICBpbmplY3RhYmxlID0+IGdldEltbWVkaWF0ZVNjb3BlT2YoaW5qZWN0YWJsZSkgPT09IHNjb3BlSW5qZWN0YWJsZSxcbiAgICAgICksXG5cbiAgICByZWdpc3RlcmVkSW5TdWJ0cmVlT2Y6IChzY29wZUluamVjdGFibGUsIGFsaWFzKSA9PlxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5zb21lKGluamVjdGFibGUgPT4ge1xuICAgICAgICBsZXQgc2NvcGUgPSBnZXRJbW1lZGlhdGVTY29wZU9mKGluamVjdGFibGUpO1xuXG4gICAgICAgIHdoaWxlIChzY29wZSAhPT0gc2NvcGVJbmplY3RhYmxlICYmIHNjb3BlICE9PSByb290SW5qZWN0YWJsZSkge1xuICAgICAgICAgIHNjb3BlID0gZ2V0SW1tZWRpYXRlU2NvcGVPZihzY29wZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2NvcGUgPT09IHNjb3BlSW5qZWN0YWJsZTtcbiAgICAgIH0pLFxuXG4gICAgZ2V0TnVtYmVyT2ZJbnN0YW5jZXM6ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaW5qZWN0YWJsZSwgc3RvcmVkXSBvZiBpbnN0YW5jZXNCeUluamVjdGFibGVNYXApIHtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlZElkID0gbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcbiAgICAgICAgaWYgKCFuYW1lc3BhY2VkSWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChpc0NvbXBvc2l0ZVN0b3JhZ2Uoc3RvcmVkKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgXyBvZiBzdG9yZWQudmFsdWVzKCkpIGNvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudCA+IDApIHJlc3VsdFtuYW1lc3BhY2VkSWRdID0gY291bnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG5cbiAgLy8gVGhlIHNsb3RzIHN0YXJ0IG91dCBob2xkaW5nIHRoZSBiYXJlIG9wZXJhdGlvbnM7IHdpcmUgdGhlbSBvbmNlIHVwLWZyb250XG4gIC8vIHNvIGVuZm9yY2VtZW50IGFwcGxpZXMgZXZlbiBpbiBhIGNvbnRhaW5lciB3aGVyZSBub3RoaW5nIGlzIHJlZ2lzdGVyZWQuXG4gIHN5bmNJbmplY3RXaXJpbmcoKTtcblxuICBjb25zdCBwdWJsaWNJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdCh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueSh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiByb290SW5qZWN0YWJsZSxcbiAgICB9KTtcblxuICBjb25zdCBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljRGkgPSB7XG4gICAgLi4ucHJpdmF0ZURpLFxuXG4gICAgaW5qZWN0OiBwdWJsaWNJbmplY3QsXG4gICAgaW5qZWN0V2l0aE1ldGE6IHB1YmxpY0luamVjdFdpdGhNZXRhLFxuICAgIGluamVjdE1hbnk6IHB1YmxpY0luamVjdE1hbnksXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEsXG5cbiAgICBpbmplY3QyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdChhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIGluamVjdE1hbnkyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdE1hbnkoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICAvLyBSZXNvbHZlcyBwZXIgY2FsbCBsaWtlIGluamVjdE1hbnksIGJ1dCB1bndyYXBzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb3JcbiAgICAvLyB1bmRlZmluZWQgXHUyMDE0IHRoZSAnemVyby1vci1vbmUnIHVwcGVyIGJvdW5kIGd1YXJhbnRlZXMgYXQgbW9zdCBvbmUuXG4gICAgaW5qZWN0TWF5YmUyOiBhbGlhcyA9PiB7XG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHkoYWxpYXMsIHJvb3RJbmplY3RhYmxlKTtcblxuICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHB1YmxpY0luamVjdE1hbnkoYWxpYXMsIC4uLnBhcmFtcylbMF07XG4gICAgfSxcblxuICAgIGluamVjdFdpdGhNZXRhMjpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3RXaXRoTWV0YShhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIGluamVjdE1hbnlXaXRoTWV0YTI6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgcHVibGljSW5qZWN0TWFueVdpdGhNZXRhKGFsaWFzLCAuLi5wYXJhbXMpLFxuXG4gICAgLy8gaW5qZWN0TWF5YmUyIG92ZXIgdGhlIHdpdGgtbWV0YSBwbGFuZTogdW53cmFwcyB0byB0aGUgc2luZ2xlXG4gICAgLy8gbWV0YS13cmFwcGVkIGluc3RhbmNlIG9yIHVuZGVmaW5lZC5cbiAgICBpbmplY3RNYXliZVdpdGhNZXRhMjogYWxpYXMgPT4ge1xuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCByb290SW5qZWN0YWJsZSk7XG5cbiAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEoYWxpYXMsIC4uLnBhcmFtcylbMF07XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIHByaXZhdGVEaS5yZWdpc3Rlcih7XG4gICAgICAgIGluamVjdGFibGVzLFxuICAgICAgICBjb250ZXh0OiBbY29udGFpbmVyUm9vdENvbnRleHRJdGVtXSxcbiAgICAgICAgc291cmNlOiByb290SW5qZWN0YWJsZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBkZXJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIHByaXZhdGVEaS5kZXJlZ2lzdGVyKHtcbiAgICAgICAgaW5qZWN0YWJsZXMsXG4gICAgICAgIGNvbnRleHQ6IFtjb250YWluZXJSb290Q29udGV4dEl0ZW1dLFxuICAgICAgICBzb3VyY2U6IHJvb3RJbmplY3RhYmxlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGU6IGFsaWFzID0+XG4gICAgICBwcml2YXRlRGkucmVnaXN0ZXJlZEluU2NvcGVPZihyb290SW5qZWN0YWJsZSwgYWxpYXMpLFxuXG4gICAgdmFsaWRhdGU6IHZhbGlkYXRlRm9yKHtcbiAgICAgIGNvbnRhaW5lcklkLFxuICAgICAgaW5qZWN0YWJsZVNldCxcbiAgICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICB9KSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGVTdWJ0cmVlOiBhbGlhcyA9PlxuICAgICAgcHJpdmF0ZURpLnJlZ2lzdGVyZWRJblN1YnRyZWVPZihyb290SW5qZWN0YWJsZSwgYWxpYXMpLFxuICB9O1xuXG4gIHJldHVybiBwdWJsaWNEaTtcbn07XG4iLCAiaW1wb3J0IHsgaWRlbnRpdHksIGNvbnN0YW50IH0gZnJvbSAnbG9kYXNoL2ZwJztcblxuZXhwb3J0IGNvbnN0IGdldFR5cGVkU3BlY2lmaWVyID0gY29uc3RhbnQoaWRlbnRpdHkpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQU8sSUFBTSx1QkFBdUIsT0FBTyx5QkFBeUI7QUFDN0QsSUFBTSxvQkFBb0IsT0FBTyxxQkFBcUI7QUFFN0QsSUFBTyx3QkFBUTtBQUFBLEVBQ2IsV0FBVztBQUFBLElBQ1QsSUFBSTtBQUFBLElBRUosZ0JBQWdCLE1BQU07QUFBQSxFQUN4QjtBQUFBLEVBRUEsZ0JBQWdCLENBQUMsRUFBRSxlQUFlLE9BQU87QUFBQSxJQUN2QyxJQUFJO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLFdBQVc7QUFBQSxJQUNULElBQUk7QUFBQSxJQUNKLGdCQUFnQixNQUFNO0FBQUEsRUFDeEI7QUFDRjs7O0FDbkJPLElBQU0scUJBQXFCLE9BQU8sZUFBZTtBQUNqRCxJQUFNLGtCQUFrQixJQUFJLFVBQVU7QUFBQSxFQUMzQyxDQUFDLGtCQUFrQixHQUFHO0FBQUEsRUFDdEI7QUFDRjtBQUVPLElBQU0saUJBQWlCLFdBQzVCLFNBQVMsTUFBTSxrQkFBa0IsTUFBTTs7O0FDTGxDLElBQU0sbUJBQW1CO0FBRWhDLElBQU8sd0JBQVEsQ0FBQyxFQUFFLFlBQVksc0JBQWMsV0FBVyxHQUFHLFdBQVcsT0FBTztBQUFBLEVBQzFFLFdBQVc7QUFBQSxFQUNYO0FBQUEsRUFDQSxHQUFHO0FBQ0w7OztBQ0pPLElBQU0sb0JBQW9CO0FBU2pDLElBQU0scUJBQXFCLHNCQUFjLGVBQWU7QUFBQSxFQUN0RCxnQkFBZ0IsQ0FBQyxP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O0FBQUEsSUFFQSxZQUFZLElBQUksZ0JBQWdCO0FBQzlCLGdCQUFVLFdBQVc7QUFBQSxRQUNuQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSx3QkFBd0IsV0FDdEIsVUFBVSxvQkFBb0IsZ0JBQWdCLEtBQUs7QUFBQSxJQUVyRCxVQUFVLFlBQVk7QUFBQSxNQUNwQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUVELCtCQUErQixXQUM3QixVQUFVLHNCQUFzQixnQkFBZ0IsS0FBSztBQUFBLEVBQ3pEO0FBRUEsU0FBTztBQUNUOzs7QUN0bkJBLGdCQUFtQztBQUU1QixJQUFNLHdCQUFvQixvQkFBUyxrQkFBUTs7O0F4Q3NCM0MsSUFBTSxnQ0FBZ0M7IiwKICAibmFtZXMiOiBbImluc3RhbnRpYXRlIiwgImNoaWxkTWFwIiwgImRlbGV0ZWQiLCAibWluaW1hbERpIiwgIm5ld0luc3RhbmNlIiwgImNhbGxiYWNrcyIsICJFTVBUWSJdCn0K
|
|
2269
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXguanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtLmpzIiwgIi4uL3NyYy9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5LmpzIiwgIi4uL3NyYy9nZXRJbmplY3RhYmxlL2dldEluamVjdGFibGUuanMiLCAiLi4vc3JjL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyLmpzIiwgIi4uL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9pbmplY3Rpb25Ub2tlblRhZy5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0SW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjIuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b2tlbnMuanMiLCAiLi4vc3JjL2NvbXBvc2l0ZS1tYXAvY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2Zhc3RGbG93LmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdEZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3dpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdE1hbnlGb3IuanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9nZXRTY29wZWRJZEZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldE5hbWVzcGFjZWRJZEZvci5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0YWJsZUJ1bmNoL2dldEluamVjdGFibGVCdW5jaC5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0YWJsZUJ1bmNoL2lzSW5qZWN0YWJsZUJ1bmNoLmpzIiwgIi4uL3NyYy9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZS5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3RvRmxhdEluamVjdGFibGVzLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvZ2V0UmVsYXRlZFRva2Vucy5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldFJlbGF0ZWRJbmplY3RhYmxlc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3JlZ2lzdGVyLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHVyZ2VJbnN0YW5jZXMuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9kZXJlZ2lzdGVyLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvb3ZlcnJpZGUuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9jaGVja0Zvck5vTWF0Y2hlc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NoZWNrRm9yVG9vTWFueU1hdGNoZXMuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9jaGVja0ZvclNpZGVFZmZlY3RzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JVbmRlY2xhcmVkQ29uc3VtcHRpb25Gb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci92YWxpZGF0ZS5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2Vhcmx5LW92ZXJyaWRlLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvd2l0aFByZUluamVjdENhbGxiYWNrc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2ZpcmVQdXJnZUNhbGxiYWNrc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvaW5qZWN0aW9uVG9rZW5SZXNvbHV0aW9uRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY3JlYXRlQ29udGFpbmVyLmpzIiwgIi4uL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9nZXRUeXBlZFNwZWNpZmllci5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IGNyZWF0ZUNvbnRhaW5lciBmcm9tICcuL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY3JlYXRlQ29udGFpbmVyJztcblxuaW1wb3J0IGdldEluamVjdGFibGUgZnJvbSAnLi9zcmMvZ2V0SW5qZWN0YWJsZS9nZXRJbmplY3RhYmxlJztcbmltcG9ydCBnZXRJbmplY3RhYmxlMiBmcm9tICcuL3NyYy9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5pbXBvcnQgaXNJbmplY3RhYmxlIGZyb20gJy4vc3JjL2dldEluamVjdGFibGUvaXNJbmplY3RhYmxlJztcbmltcG9ydCBsaWZlY3ljbGVFbnVtIGZyb20gJy4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtJztcblxuaW1wb3J0IHtcbiAgZ2V0SW5qZWN0aW9uVG9rZW4sXG4gIGdldFNwZWNpZmljSW5qZWN0aW9uVG9rZW4sXG59IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2dldEluamVjdGlvblRva2VuJztcblxuaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSAnLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4yL2dldEluamVjdGlvblRva2VuMic7XG5cbmltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuXG5pbXBvcnQgZ2V0SW5qZWN0YWJsZUJ1bmNoIGZyb20gJy4vc3JjL2dldEluamVjdGFibGVCdW5jaC9nZXRJbmplY3RhYmxlQnVuY2gnO1xuaW1wb3J0IGlzSW5qZWN0YWJsZUJ1bmNoIGZyb20gJy4vc3JjL2dldEluamVjdGFibGVCdW5jaC9pc0luamVjdGFibGVCdW5jaCc7XG5pbXBvcnQgdG9GbGF0SW5qZWN0YWJsZXMgZnJvbSAnLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3RvRmxhdEluamVjdGFibGVzJztcbmltcG9ydCB7IGdldENvbXBvc2l0ZUtleSB9IGZyb20gJy4vc3JjL2dldENvbXBvc2l0ZUtleS9nZXRDb21wb3NpdGVLZXknO1xuXG5leHBvcnQgeyBnZXRUeXBlZFNwZWNpZmllciB9IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2dldFR5cGVkU3BlY2lmaWVyJztcbmV4cG9ydCB7IGluamVjdGlvblRva2VuVGFnIH0gZnJvbSAnLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vaW5qZWN0aW9uVG9rZW5UYWcnO1xuXG5leHBvcnQgY29uc3QgZ2V0S2V5ZWRTaW5nbGV0b25Db21wb3NpdGVLZXkgPSBnZXRDb21wb3NpdGVLZXk7XG5cblxuXG5leHBvcnQge1xuICBkZXJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gIGRlcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbixcbiAgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICBwcmVJbmplY3RDYWxsYmFja1Rva2VuLFxuICByZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbn0gZnJvbSAnLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3Rva2Vucyc7XG5cbmV4cG9ydCB7XG4gIGNyZWF0ZUNvbnRhaW5lcixcbiAgZ2V0SW5qZWN0YWJsZSxcbiAgZ2V0SW5qZWN0YWJsZTIsXG4gIGlzSW5qZWN0YWJsZSxcbiAgZ2V0SW5qZWN0YWJsZUJ1bmNoLFxuICBpc0luamVjdGFibGVCdW5jaCxcbiAgZ2V0SW5qZWN0aW9uVG9rZW4sXG4gIGdldEluamVjdGlvblRva2VuMixcbiAgZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbixcbiAgaXNJbmplY3Rpb25Ub2tlbixcbiAgbGlmZWN5Y2xlRW51bSxcbiAgdG9GbGF0SW5qZWN0YWJsZXMsXG59O1xuIiwgImV4cG9ydCBjb25zdCBub25TdG9yZWRJbnN0YW5jZUtleSA9IFN5bWJvbCgnbm9uLXN0b3JlZC1pbnN0YW5jZS1rZXknKTtcbmV4cG9ydCBjb25zdCBzdG9yZWRJbnN0YW5jZUtleSA9IFN5bWJvbCgnc3RvcmVkLWluc3RhbmNlLWtleScpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNpbmdsZXRvbjoge1xuICAgIGlkOiAnc2luZ2xldG9uJyxcblxuICAgIGdldEluc3RhbmNlS2V5OiAoKSA9PiBzdG9yZWRJbnN0YW5jZUtleSxcbiAgfSxcblxuICBrZXllZFNpbmdsZXRvbjogKHsgZ2V0SW5zdGFuY2VLZXkgfSkgPT4gKHtcbiAgICBpZDogJ2tleWVkU2luZ2xldG9uJyxcbiAgICBnZXRJbnN0YW5jZUtleSxcbiAgfSksXG5cbiAgdHJhbnNpZW50OiB7XG4gICAgaWQ6ICd0cmFuc2llbnQnLFxuICAgIGdldEluc3RhbmNlS2V5OiAoKSA9PiBub25TdG9yZWRJbnN0YW5jZUtleSxcbiAgfSxcbn07XG4iLCAiZXhwb3J0IGNvbnN0IGNvbXBvc2l0ZUtleVN5bWJvbCA9IFN5bWJvbCgnY29tcG9zaXRlLWtleScpO1xuZXhwb3J0IGNvbnN0IGdldENvbXBvc2l0ZUtleSA9ICguLi5rZXlzKSA9PiAoe1xuICBbY29tcG9zaXRlS2V5U3ltYm9sXTogdHJ1ZSxcbiAga2V5cyxcbn0pO1xuXG5leHBvcnQgY29uc3QgaXNDb21wb3NpdGVLZXkgPSB0aGluZyA9PlxuICB0aGluZyAmJiB0aGluZ1tjb21wb3NpdGVLZXlTeW1ib2xdID09PSB0cnVlO1xuIiwgImltcG9ydCBsaWZlY3ljbGVFbnVtIGZyb20gJy4uL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtJztcblxuZXhwb3J0IGNvbnN0IGluamVjdGFibGVTeW1ib2wgPSAnaW5qZWN0YWJsZSc7XG5cbmV4cG9ydCBkZWZhdWx0ICh7IGxpZmVjeWNsZSA9IGxpZmVjeWNsZUVudW0uc2luZ2xldG9uLCAuLi5pbmplY3RhYmxlIH0pID0+ICh7XG4gIGFsaWFzVHlwZTogaW5qZWN0YWJsZVN5bWJvbCxcbiAgbGlmZWN5Y2xlLFxuICAuLi5pbmplY3RhYmxlLFxufSk7XG4iLCAiaW1wb3J0IGxpZmVjeWNsZUVudW0gZnJvbSAnLi4vZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgc3RvcmVkSW5zdGFuY2VLZXkgfSBmcm9tICcuLi9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvbGlmZWN5Y2xlRW51bSc7XG5pbXBvcnQgeyBnZXRDb21wb3NpdGVLZXkgfSBmcm9tICcuLi9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5JztcblxuZXhwb3J0IGNvbnN0IGluamVjdGFibGVTeW1ib2wyID0gJ2luamVjdGFibGUyJztcblxuLy8gSG9pc3RlZCBhbmQgc2hhcmVkIGFjcm9zcyBldmVyeSBub24tdHJhbnNpZW50IGdldEluamVjdGFibGUyIFx1MjAxNCBzYXZlcyBhXG4vLyBwZXItY2FsbCBsaWZlY3ljbGUgYWxsb2NhdGlvbiwgYW5kIHRoZSBgX2lzVjJEZWZhdWx0TGlmZWN5Y2xlYCB0YWcgbGV0c1xuLy8gcHJpdmF0ZUluamVjdEZvciBza2lwIHRoZSBnZXRJbnN0YW5jZUtleSBjYWxsICsga2V5LWFycmF5IGFsbG9jYXRpb24gd2hlblxuLy8gYSB2MiBpbmplY3RhYmxlIGlzIGluamVjdGVkIHdpdGggbm8gYXJncyAodGhlIGNvbW1vbiBjYXNlIGZvclxuLy8gbm9uLXBhcmFtZXRyaWMgdjIpLiBUaGUgdGFnIGlzIHRoZSAqb25seSogc2lnbmFsIHdlIHRydXN0IHRvIGJ5cGFzc1xuLy8gZ2V0SW5zdGFuY2VLZXkgYmVjYXVzZSB1c2VyLXByb3ZpZGVkIGdldEluc3RhbmNlS2V5IG1heSBsZWdpdGltYXRlbHlcbi8vIHJldHVybiBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc3RvcmVkSW5zdGFuY2VLZXlgIGZvciBlbXB0eSBhcmdzLlxuY29uc3QgdjJEZWZhdWx0TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRW51bS5rZXllZFNpbmdsZXRvbih7XG4gIGdldEluc3RhbmNlS2V5OiAoZGksIC4uLmFyZ3MpID0+IHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiBzdG9yZWRJbnN0YW5jZUtleTtcbiAgICByZXR1cm4gZ2V0Q29tcG9zaXRlS2V5KC4uLmFyZ3MpO1xuICB9LFxufSk7XG5cbnYyRGVmYXVsdExpZmVjeWNsZS5faXNWMkRlZmF1bHRMaWZlY3ljbGUgPSB0cnVlO1xuXG5leHBvcnQgZGVmYXVsdCAoeyBpbnN0YW50aWF0ZSwgdHJhbnNpZW50ID0gZmFsc2UsIC4uLnJlc3QgfSkgPT4gKHtcbiAgYWxpYXNUeXBlOiBpbmplY3RhYmxlU3ltYm9sMixcbiAgaW5zdGFudGlhdGUsXG4gIHRyYW5zaWVudCxcbiAgbGlmZWN5Y2xlOiB0cmFuc2llbnQgPyBsaWZlY3ljbGVFbnVtLnRyYW5zaWVudCA6IHYyRGVmYXVsdExpZmVjeWNsZSxcbiAgLi4ucmVzdCxcbn0pO1xuIiwgIi8vIFRoZSBpbml0aWFsIHRhZyBjYXJyaWVkIGJ5IGV2ZXJ5IGluamVjdGlvbiB0b2tlbiAodjEgYW5kIHYyKSwgcGVybWl0dGluZ1xuLy8gdGFnLWtleWVkIGRlY29yYXRvcnMgdG8gdGFyZ2V0IGFueSB0b2tlbiwgZS5nLlxuLy8gYGluamVjdGlvbkRlY29yYXRvclRva2VuLmZvcihpbmplY3Rpb25Ub2tlblRhZylgLlxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuVGFnID0gJ2luamVjdGlvblRva2VuJztcbiIsICJpbXBvcnQgeyBpbmplY3Rpb25Ub2tlblRhZyB9IGZyb20gJy4vaW5qZWN0aW9uVG9rZW5UYWcnO1xuXG5leHBvcnQgY29uc3QgaW5qZWN0aW9uVG9rZW5TeW1ib2wgPSAnaW5qZWN0aW9uLXRva2VuJztcblxuZXhwb3J0IGNvbnN0IGdldEluamVjdGlvblRva2VuID0gKHtcbiAgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3Rvcnk6IHNwZWNpZmljVG9rZW5GYWN0b3J5ID0gZ2V0U3BlY2lmaWNUb2tlbkJ5SWQsXG5cbiAgdGFyZ2V0LFxuXG4gIHRhZ3MsXG5cbiAgLi4ucmVzdFxufSkgPT4ge1xuICBjb25zdCBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eSA9IG5ldyBNYXAoKTtcblxuICAvLyBUaGUgZmFjdG9yeSBpcyBhc3N1bWVkIHB1cmUgYW5kIGRldGVybWluaXN0aWM6IGEgc3BlY2lmaWVyIGFsd2F5cyBtYXBzXG4gIC8vIHRvIHRoZSBzYW1lIHRva2VuLCBzbyBzaW5nbGUtc3BlY2lmaWVyIGNhbGxzIGFyZSBtZW1vaXplZCBieSBzcGVjaWZpZXJcbiAgLy8gdG8gc2tpcCBjb25zdHJ1Y3RpbmcgYSB0aHJvd2F3YXkgY2FuZGlkYXRlIG9uIHJlcGVhdCBgLmZvcigpYCBjYWxscy5cbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllciA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZW5lcmFsVG9rZW4gPSBPYmplY3QuYXNzaWduKHRhcmdldCA/PyB7fSwge1xuICAgIC4uLnJlc3QsXG5cbiAgICB0YWdzOiBbaW5qZWN0aW9uVG9rZW5UYWcsIC4uLih0YWdzID8/IFtdKV0sXG5cbiAgICBhbGlhc1R5cGU6IGluamVjdGlvblRva2VuU3ltYm9sLFxuXG4gICAgZm9yOiAoLi4uc3BlY2lmaWVycykgPT4ge1xuICAgICAgY29uc3QgbWVtb2l6ZWRUb2tlbiA9XG4gICAgICAgIHNwZWNpZmllcnMubGVuZ3RoID09PSAxXG4gICAgICAgICAgPyBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLmdldChzcGVjaWZpZXJzWzBdKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobWVtb2l6ZWRUb2tlbikge1xuICAgICAgICByZXR1cm4gbWVtb2l6ZWRUb2tlbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3BlY2lmaWNUb2tlbkNhbmRpZGF0ZSA9IHNwZWNpZmljVG9rZW5GYWN0b3J5KC4uLnNwZWNpZmllcnMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5nZXQoXG4gICAgICAgIHNwZWNpZmljVG9rZW5DYW5kaWRhdGUuc3BlY2lhbGl0eSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChleGlzdGluZ1NwZWNpZmljVG9rZW4pIHtcbiAgICAgICAgaWYgKHNwZWNpZmllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgZXhpc3RpbmdTcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGlzdGluZ1NwZWNpZmljVG9rZW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlO1xuXG4gICAgICBzcGVjaWZpY1Rva2VuLmlkID0gYCR7Z2VuZXJhbFRva2VuLmlkfS8ke3NwZWNpZmljVG9rZW4uaWR9YDtcbiAgICAgIHNwZWNpZmljVG9rZW4uc3BlY2lmaWNUb2tlbk9mID0gZ2VuZXJhbFRva2VuO1xuICAgICAgc3BlY2lmaWNUb2tlbi5tYXhDYWNoZVNpemUgPSBnZW5lcmFsVG9rZW4ubWF4Q2FjaGVTaXplO1xuICAgICAgc3BlY2lmaWNUb2tlbi50YWdzID0gZ2VuZXJhbFRva2VuLnRhZ3M7XG5cbiAgICAgIHNwZWNpZmljVG9rZW5zQnlTcGVjaWFsaXR5LnNldChzcGVjaWZpY1Rva2VuLnNwZWNpYWxpdHksIHNwZWNpZmljVG9rZW4pO1xuXG4gICAgICBpZiAoc3BlY2lmaWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgc3BlY2lmaWNUb2tlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzcGVjaWZpY1Rva2VuO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBnZW5lcmFsVG9rZW47XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbiA9ICguLi5hcmdzKSA9PlxuICBnZXRJbmplY3Rpb25Ub2tlbiguLi5hcmdzKTtcblxuY29uc3QgZ2V0U3BlY2lmaWNUb2tlbkJ5SWQgPSBpZCA9PiBnZXRJbmplY3Rpb25Ub2tlbih7IGlkLCBzcGVjaWFsaXR5OiBpZCB9KTtcbiIsICJpbXBvcnQgeyBpbmplY3Rpb25Ub2tlblRhZyB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2luamVjdGlvblRva2VuVGFnJztcblxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuU3ltYm9sMiA9ICdpbmplY3Rpb24tdG9rZW4yJztcblxuY29uc3QgY2FyZGluYWxpdGllcyA9IFsnb25lJywgJ3plcm8tb3Itb25lJywgJ3plcm8tb3ItbWFueScsICdvbmUtb3ItbWFueSddO1xuXG5jb25zdCBidWlsZFRva2VuID0gKHtcbiAgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnksXG4gIHRhcmdldCxcbiAgdGFncyxcbiAgLi4ucmVzdFxufSkgPT4ge1xuICAvLyBBIHNwZWNpZmljIHRva2VuIG1heSBkZWNsYXJlIGl0cyBvd24gY2FyZGluYWxpdHkgXHUyMDE0IGl0cyBmYW1pbHkncyBnZW5lcmFsXG4gIC8vIHRva2VuIG9mdGVuIGhhcyBhIGRpZmZlcmVudCBvbmUgXHUyMDE0IGFuZCBpbmhlcml0cyB3aGVuIGl0IGRvZXMgbm90LCB3aGljaFxuICAvLyBpcyB3aHkgb25seSBnZW5lcmFsIHRva2VucyBhcmUgcmVxdWlyZWQgdG8gZGVjbGFyZS5cbiAgaWYgKHJlc3QuY2FyZGluYWxpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChyZXN0LnNwZWNpYWxpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gY3JlYXRlIGluamVjdGlvbiB0b2tlbiBcIiR7cmVzdC5pZH1cIiB3aXRob3V0IGNhcmRpbmFsaXR5LmAsXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmICghY2FyZGluYWxpdGllcy5pbmNsdWRlcyhyZXN0LmNhcmRpbmFsaXR5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUcmllZCB0byBjcmVhdGUgaW5qZWN0aW9uIHRva2VuIFwiJHtyZXN0LmlkfVwiIHdpdGggdW5rbm93biBjYXJkaW5hbGl0eSBcIiR7cmVzdC5jYXJkaW5hbGl0eX1cIi5gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eSA9IG5ldyBNYXAoKTtcblxuICAvLyBUaGUgZmFjdG9yeSBpcyBhc3N1bWVkIHB1cmUgYW5kIGRldGVybWluaXN0aWM6IGEgc3BlY2lmaWVyIGFsd2F5cyBtYXBzXG4gIC8vIHRvIHRoZSBzYW1lIHRva2VuLCBzbyBzaW5nbGUtc3BlY2lmaWVyIGNhbGxzIGFyZSBtZW1vaXplZCBieSBzcGVjaWZpZXJcbiAgLy8gdG8gc2tpcCBjb25zdHJ1Y3RpbmcgYSB0aHJvd2F3YXkgY2FuZGlkYXRlIG9uIHJlcGVhdCBgLmZvcigpYCBjYWxscy5cbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllciA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZW5lcmFsVG9rZW4gPSBPYmplY3QuYXNzaWduKHRhcmdldCA/PyB7fSwge1xuICAgIC4uLnJlc3QsXG5cbiAgICB0YWdzOiBbaW5qZWN0aW9uVG9rZW5UYWcsIC4uLih0YWdzID8/IFtdKV0sXG5cbiAgICBhbGlhc1R5cGU6IGluamVjdGlvblRva2VuU3ltYm9sMixcblxuICAgIC8vIE5vIGZhY3RvcnkgbWVhbnMgbm8gYC5mb3IoKWAgYXQgYWxsLCBtYXRjaGluZyB0aGUgdHlwZTogYSB0b2tlbiBpc24ndFxuICAgIC8vIHJlcXVpcmVkIHRvIGJlIHBhcnQgb2YgYSBmYW1pbHkuIEEgZmFjdG9yeSBhbHNvIG1ha2VzIHRoZSB0b2tlblxuICAgIC8vIGFic3RyYWN0OiBpdCdzIG9ubHkgZXZlciB1c2VmdWwgcmVzb2x2ZWQgdmlhIGEgcmVhbCBgLmZvcigpYCwgc28gaXRcbiAgICAvLyBjYW5ub3QgYmUgaW5qZWN0ZWQvcmVnaXN0ZXJlZCBkaXJlY3RseSBcdTIwMTQgc2VlIGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvclxuICAgIC8vIGFuZCByZWdpc3Rlci5qcydzIGBpbmplY3Rpb25Ub2tlbj8uYWJzdHJhY3RgIGNoZWNrLlxuICAgIC4uLihzcGVjaWZpY0luamVjdGlvblRva2VuRmFjdG9yeSAmJiB7XG4gICAgICBhYnN0cmFjdDogdHJ1ZSxcblxuICAgICAgZm9yOiAoLi4uc3BlY2lmaWVycykgPT4ge1xuICAgICAgICBjb25zdCBtZW1vaXplZFRva2VuID1cbiAgICAgICAgICBzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgPyBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLmdldChzcGVjaWZpZXJzWzBdKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG1lbW9pemVkVG9rZW4pIHtcbiAgICAgICAgICByZXR1cm4gbWVtb2l6ZWRUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW5DYW5kaWRhdGUgPSBzcGVjaWZpY0luamVjdGlvblRva2VuRmFjdG9yeShcbiAgICAgICAgICAuLi5zcGVjaWZpZXJzLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWNUb2tlbiA9IHNwZWNpZmljVG9rZW5zQnlTcGVjaWFsaXR5LmdldChcbiAgICAgICAgICBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlLnNwZWNpYWxpdHksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGV4aXN0aW5nU3BlY2lmaWNUb2tlbikge1xuICAgICAgICAgIGlmIChzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgZXhpc3RpbmdTcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdTcGVjaWZpY1Rva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BlY2lmaWNUb2tlbiA9IHNwZWNpZmljVG9rZW5DYW5kaWRhdGU7XG5cbiAgICAgICAgc3BlY2lmaWNUb2tlbi5pZCA9IGAke2dlbmVyYWxUb2tlbi5pZH0vJHtzcGVjaWZpY1Rva2VuLmlkfWA7XG4gICAgICAgIHNwZWNpZmljVG9rZW4uc3BlY2lmaWNUb2tlbk9mID0gZ2VuZXJhbFRva2VuO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLm1heENhY2hlU2l6ZSA9IGdlbmVyYWxUb2tlbi5tYXhDYWNoZVNpemU7XG4gICAgICAgIHNwZWNpZmljVG9rZW4udGFncyA9IGdlbmVyYWxUb2tlbi50YWdzO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLmNhcmRpbmFsaXR5ID1cbiAgICAgICAgICBzcGVjaWZpY1Rva2VuLmNhcmRpbmFsaXR5ID8/IGdlbmVyYWxUb2tlbi5jYXJkaW5hbGl0eTtcblxuICAgICAgICBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5zZXQoc3BlY2lmaWNUb2tlbi5zcGVjaWFsaXR5LCBzcGVjaWZpY1Rva2VuKTtcblxuICAgICAgICBpZiAoc3BlY2lmaWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLnNldChzcGVjaWZpZXJzWzBdLCBzcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzcGVjaWZpY1Rva2VuO1xuICAgICAgfSxcbiAgICB9KSxcbiAgfSk7XG5cbiAgcmV0dXJuIGdlbmVyYWxUb2tlbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbmplY3Rpb25Ub2tlbjIgPSAoLi4uYXJncykgPT4ge1xuICAvLyBBIHNpbmdsZSwgbm9uLWN1cnJpZWQgY2FsbDogb3B0aW9ucyBnaXZlbiBkaXJlY3RseSwgZmFjdG9yeSBjdXJyaWVkIGFzXG4gIC8vIGl0cyBvd24gdHJhaWxpbmcgY2FsbCBcdTIwMTQgZ2V0SW5qZWN0aW9uVG9rZW4yKG9wdGlvbnMpKGZhY3RvcnkpLCBvclxuICAvLyBnZXRJbmplY3Rpb25Ub2tlbjIob3B0aW9ucykoKSBmb3IgYSBjb25jcmV0ZSB0b2tlbiB3aXRoIG5vIGAuZm9yKClgIGF0XG4gIC8vIGFsbC4gUGFzc2luZyBhIGZhY3RvcnkgYWxzbyBtYWtlcyB0aGUgdG9rZW4gYWJzdHJhY3QgXHUyMDE0IHNlZSBidWlsZFRva2VuLlxuICAvLyBUaGUgZXhwbGljaXQtU0YgZXNjYXBlIGhhdGNoIChnZXRJbmplY3Rpb25Ub2tlbjI8RiwgTUYsIFNGPihvcHRpb25zKSlcbiAgLy8gdXNlcyB0aGlzIGV4YWN0IHNhbWUgc2hhcGUsIGZhY3RvcnkganVzdCBvcHRpb25hbCBvbiB0aGUgdHJhaWxpbmcgY2FsbFxuICAvLyBpbnN0ZWFkIG9mIHJlcXVpcmVkIFx1MjAxNCBub3RoaW5nIGRpc3Rpbmd1aXNoZXMgdGhlbSBhdCBydW50aW1lLCBzaW5jZSBTRlxuICAvLyBiZWluZyBzcGVsbGVkIG91dCBleHBsaWNpdGx5IHZzIGluZmVycmVkIGZyb20gdGhlIGZhY3RvcnkgdmFsdWUgaXNcbiAgLy8gZXJhc2VkIGJ5IHRoZSB0aW1lIHRoaXMgY29kZSBydW5zLlxuICAvL1xuICAvLyBBIGBzcGVjaWFsaXR5YCBpbiBvcHRpb25zIGJ1aWxkcyBhIHNwZWNpZmljIHRva2VuIGRpcmVjdGx5IFx1MjAxNCB0aGlzIGlzIGhvd1xuICAvLyBnZXRTcGVjaWZpY0luamVjdGlvblRva2VuMiB1c2VkIHRvIGJlIGl0cyBvd24gZnVuY3Rpb247IGZvbGRlZCBpbiBoZXJlXG4gIC8vIHNpbmNlIGJ1aWxkVG9rZW4gYWxyZWFkeSB0aHJlYWRzIGBzcGVjaWFsaXR5YCB0aHJvdWdoIHZpYSBgLi4ucmVzdGBcbiAgLy8gcmVnYXJkbGVzcyBvZiB3aGljaCBjcmVhdG9yIGlzIGNhbGxlZC4gVW5saWtlIHRoZSBvbGRcbiAgLy8gZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbjIsIHRoaXMgYWxzbyBhY2NlcHRzIGEgZmFjdG9yeSwgc28gYSBzcGVjaWZpY1xuICAvLyB0b2tlbiBjYW4gaXRzZWxmIGJlIGEgZmFtaWx5IHJvb3QgZm9yIG5lc3RlZCBzcGVjaWZpY2l0eSBcdTIwMTQgc2VlIHRoZVxuICAvLyBjb21tZW50IG9uIGJ1aWxkVG9rZW4gZm9yIHdoeSB0aGF0IG1ha2VzIGl0IGFic3RyYWN0IHRvby5cbiAgaWYgKGFyZ3MubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRyaWVkIHRvIGNyZWF0ZSBpbmplY3Rpb24gdG9rZW4ke1xuICAgICAgICBhcmdzWzBdPy5pZCA/IGAgXCIke2FyZ3NbMF0uaWR9XCJgIDogJydcbiAgICAgIH0gd2l0aCAke1xuICAgICAgICBhcmdzLmxlbmd0aFxuICAgICAgfSBhcmd1bWVudHM7IGdldEluamVjdGlvblRva2VuMiB0YWtlcyBleGFjdGx5IG9uZSAob3B0aW9ucykuYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgW29wdGlvbnNdID0gYXJncztcblxuICByZXR1cm4gc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkgPT5cbiAgICBidWlsZFRva2VuKHsgLi4ub3B0aW9ucywgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkgfSk7XG59O1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuIH0gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0SW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4yL2dldEluamVjdGlvblRva2VuMic7XG5cbi8vIE1hY2hpbmVyeSB0b2tlbnMgY2Fycnkgbm8gdGFnczogdGFnIGRpc3BhdGNoIHJlYWRzIHRoZSB0YXJnZXQncyB0b2tlblxuLy8gY2hhaW4sIHNvIGEgZGVjb3JhdG9yIHJlZ2lzdGVyZWQgdW5kZXIgZS5nLlxuLy8gYGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbi5mb3IoJ2luamVjdGlvblRva2VuJylgIHdvdWxkIG90aGVyd2lzZSBiZVxuLy8gZm91bmQgdmlhIGl0cyBvd24gcmVnaXN0cmF0aW9uIHRva2VuIGR1cmluZyBpdHMgb3duIGluc3RhbnRpYXRpb24gXHUyMDE0XG4vLyBpbmZpbml0ZSByZWN1cnNpb24uIGAuZm9yKClgIGNoaWxkcmVuIGNvcHkgdGhlIGdlbmVyYWwgdG9rZW4ncyB0YWdzIGF0XG4vLyBjcmVhdGlvbiwgc28gdGhlIGV4ZW1wdGlvbiBwcm9wYWdhdGVzIHRvIHRoZW0uIChTYW1lIHJvbGUgdGhlIHJlbW92ZWRcbi8vIGBkZWNvcmFibGU6IGZhbHNlYCBmbGFnIGhhZC4pXG5jb25zdCB1bnRhZ2dlZCA9IHRva2VuID0+IHtcbiAgdG9rZW4udGFncyA9IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRva2VuO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4gPSB1bnRhZ2dlZChcbiAgZ2V0SW5qZWN0aW9uVG9rZW4oe1xuICAgIGlkOiAncmVnaXN0cmF0aW9uLWNhbGxiYWNrLXRva2VuJyxcbiAgfSksXG4pO1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuKHtcbiAgICBpZDogJ2RlcmVnaXN0cmF0aW9uLWNhbGxiYWNrLXRva2VuJyxcbiAgfSksXG4pO1xuXG5leHBvcnQgY29uc3QgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdpbnN0YW50aWF0ZS1kZWNvcmF0b3ItdG9rZW4nLFxuICAgIGNhcmRpbmFsaXR5OiAnemVyby1vci1tYW55JyxcbiAgfSkodGFyZ2V0ID0+IGdldEluamVjdGlvblRva2VuMih7IGlkOiB0YXJnZXQuaWQsIHNwZWNpYWxpdHk6IHRhcmdldCB9KSgpKSxcbik7XG5cbmV4cG9ydCBjb25zdCBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnaW5qZWN0aW9uLWRlY29yYXRvci10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdpbnN0YW5jZS1wdXJnZS1jYWxsYmFjay10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdyZWdpc3RyYXRpb24tZGVjb3JhdG9yLXRva2VuJyxcbiAgICBjYXJkaW5hbGl0eTogJ3plcm8tb3ItbWFueScsXG4gIH0pKHRhcmdldCA9PiBnZXRJbmplY3Rpb25Ub2tlbjIoeyBpZDogdGFyZ2V0LmlkLCBzcGVjaWFsaXR5OiB0YXJnZXQgfSkoKSksXG4pO1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnZGVyZWdpc3RyYXRpb24tZGVjb3JhdG9yLXRva2VuJyxcbiAgICBjYXJkaW5hbGl0eTogJ3plcm8tb3ItbWFueScsXG4gIH0pKHRhcmdldCA9PiBnZXRJbmplY3Rpb25Ub2tlbjIoeyBpZDogdGFyZ2V0LmlkLCBzcGVjaWFsaXR5OiB0YXJnZXQgfSkoKSksXG4pO1xuXG5leHBvcnQgY29uc3QgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAncHJlLWluamVjdC1jYWxsYmFjay10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcbiIsICJjb25zdCBpc09iamVjdEtleSA9IGtleSA9PlxuICAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYga2V5ICE9PSBudWxsKSB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nO1xuXG5jb25zdCBtYWtlTm9kZSA9ICgpID0+ICh7XG4gIGxheWVyOiBuZXcgTWFwKCksXG4gIHdlYWtMYXllcjogbmV3IFdlYWtNYXAoKSxcbiAgY2hpbGRyZW46IG5ldyBNYXAoKSxcbiAgd2Vha0NoaWxkcmVuOiBuZXcgV2Vha01hcCgpLFxuICBoYXNXZWFrRW50cmllczogZmFsc2UsXG59KTtcblxuZXhwb3J0IGNsYXNzIENvbXBvc2l0ZU1hcCB7XG4gICNpbnRlcm5hbE1hcCA9IG1ha2VOb2RlKCk7XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlcyA9IFtdKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaW5pdGlhbFZhbHVlcykge1xuICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgI2xheWVyRm9yKG1hcEVudHJ5LCBrZXkpIHtcbiAgICByZXR1cm4gaXNPYmplY3RLZXkoa2V5KSA/IG1hcEVudHJ5LndlYWtMYXllciA6IG1hcEVudHJ5LmxheWVyO1xuICB9XG5cbiAgI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBrZXkpIHtcbiAgICByZXR1cm4gaXNPYmplY3RLZXkoa2V5KSA/IG1hcEVudHJ5LndlYWtDaGlsZHJlbiA6IG1hcEVudHJ5LmNoaWxkcmVuO1xuICB9XG5cbiAgI3NldChtYXBFbnRyeSwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IGtleVswXTtcbiAgICAgIHRoaXMuI2xheWVyRm9yKG1hcEVudHJ5LCBmaXJzdCkuc2V0KGZpcnN0LCB2YWx1ZSk7XG4gICAgICBpZiAoaXNPYmplY3RLZXkoZmlyc3QpKSBtYXBFbnRyeS5oYXNXZWFrRW50cmllcyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBrZXk7XG4gICAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCk7XG4gICAgICBsZXQgbmV4dE1hcEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGZpcnN0KTtcblxuICAgICAgaWYgKCFuZXh0TWFwRW50cnkpIHtcbiAgICAgICAgbmV4dE1hcEVudHJ5ID0gbWFrZU5vZGUoKTtcbiAgICAgICAgY2hpbGRNYXAuc2V0KGZpcnN0LCBuZXh0TWFwRW50cnkpO1xuICAgICAgICBpZiAoaXNPYmplY3RLZXkoZmlyc3QpKSBtYXBFbnRyeS5oYXNXZWFrRW50cmllcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuI3NldChuZXh0TWFwRW50cnksIHJlc3QsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBrZXkgdG8gYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignS2V5cyBtdXN0IGJlIGF0IGxlYXN0IGxlbmd0aCAxJyk7XG4gICAgfVxuXG4gICAgdGhpcy4jc2V0KHRoaXMuI2ludGVybmFsTWFwLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gICNnZXQobWFwRW50cnksIGtleSkge1xuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy4jbGF5ZXJGb3IobWFwRW50cnksIGtleVswXSkuZ2V0KGtleVswXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBrZXk7XG4gICAgICBjb25zdCBuZXh0TWFwRW50cnkgPSB0aGlzLiNjaGlsZHJlbkZvcihtYXBFbnRyeSwgZmlyc3QpLmdldChmaXJzdCk7XG5cbiAgICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLiNnZXQobmV4dE1hcEVudHJ5LCByZXN0KTtcbiAgICB9XG4gIH1cblxuICBnZXQoa2V5KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGtleSB0byBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNnZXQodGhpcy4jaW50ZXJuYWxNYXAsIGtleSk7XG4gIH1cblxuICAjaGFzKG1hcEVudHJ5LCBrZXkpIHtcbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuI2xheWVyRm9yKG1hcEVudHJ5LCBrZXlbMF0pLmhhcyhrZXlbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGZpcnN0KS5nZXQoZmlyc3QpO1xuXG4gICAgICBpZiAoIW5leHRNYXBFbnRyeSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLiNoYXMobmV4dE1hcEVudHJ5LCByZXN0KTtcbiAgICB9XG4gIH1cblxuICBoYXMoa2V5KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGtleSB0byBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2hhcyh0aGlzLiNpbnRlcm5hbE1hcCwga2V5KTtcbiAgfVxuXG4gICp2YWx1ZXMoKSB7XG4gICAgZm9yIChjb25zdCBbLCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gICprZXlzKCkge1xuICAgIGZvciAoY29uc3QgW2tleV0gb2YgdGhpcy5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIGtleTtcbiAgICB9XG4gIH1cblxuICAqI2VudHJpZXMobWFwRW50cnksIGtleSkge1xuICAgIGZvciAoY29uc3QgW2xheWVyS2V5LCBsYXllclZhbHVlXSBvZiBtYXBFbnRyeS5sYXllci5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIFtbLi4ua2V5LCBsYXllcktleV0sIGxheWVyVmFsdWVdO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2xheWVyS2V5LCBsYXllck1hcEVudHJ5XSBvZiBtYXBFbnRyeS5jaGlsZHJlbi5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkKiB0aGlzLiNlbnRyaWVzKGxheWVyTWFwRW50cnksIFsuLi5rZXksIGxheWVyS2V5XSk7XG4gICAgfVxuICB9XG5cbiAgKmVudHJpZXMoKSB7XG4gICAgeWllbGQqIHRoaXMuI2VudHJpZXModGhpcy4jaW50ZXJuYWxNYXAsIFtdKTtcbiAgfVxuXG4gICNjYW5QcnVuZShub2RlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICFub2RlLmhhc1dlYWtFbnRyaWVzICYmIG5vZGUubGF5ZXIuc2l6ZSA9PT0gMCAmJiBub2RlLmNoaWxkcmVuLnNpemUgPT09IDBcbiAgICApO1xuICB9XG5cbiAgI2RlbGV0ZShtYXBFbnRyeSwga2V5KSB7XG4gICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwga2V5WzBdKS5kZWxldGUoa2V5WzBdKTtcbiAgICB9XG5cbiAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgIGNvbnN0IGNoaWxkTWFwID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGZpcnN0KTtcbiAgICBjb25zdCBuZXh0TWFwRW50cnkgPSBjaGlsZE1hcC5nZXQoZmlyc3QpO1xuXG4gICAgaWYgKCFuZXh0TWFwRW50cnkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy4jZGVsZXRlKG5leHRNYXBFbnRyeSwgcmVzdCk7XG5cbiAgICBpZiAoZGVsZXRlZCAmJiB0aGlzLiNjYW5QcnVuZShuZXh0TWFwRW50cnkpKSB7XG4gICAgICBjaGlsZE1hcC5kZWxldGUoZmlyc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgZGVsZXRlKGtleSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpIHx8IGtleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlKHRoaXMuI2ludGVybmFsTWFwLCBrZXkpO1xuICB9XG5cbiAgI2ZvckVhY2hJblN1YnRyZWUobWFwRW50cnksIG9uVmFsdWUpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG1hcEVudHJ5LmxheWVyLnZhbHVlcygpKSB7XG4gICAgICBvblZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkRW50cnkgb2YgbWFwRW50cnkuY2hpbGRyZW4udmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuI2ZvckVhY2hJblN1YnRyZWUoY2hpbGRFbnRyeSwgb25WYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgI2RlbGV0ZUJ5UHJlZml4KG1hcEVudHJ5LCBrZXlQcmVmaXgsIG9uVmFsdWUpIHtcbiAgICBpZiAoa2V5UHJlZml4Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5UHJlZml4WzBdO1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwga2V5KTtcbiAgICAgIGNvbnN0IGNoaWxkTWFwID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGtleSk7XG4gICAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAobGF5ZXIuaGFzKGtleSkpIHtcbiAgICAgICAgaWYgKG9uVmFsdWUpIG9uVmFsdWUobGF5ZXIuZ2V0KGtleSkpO1xuICAgICAgICBsYXllci5kZWxldGUoa2V5KTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaWxkRW50cnkgPSBjaGlsZE1hcC5nZXQoa2V5KTtcblxuICAgICAgaWYgKGNoaWxkRW50cnkpIHtcbiAgICAgICAgaWYgKG9uVmFsdWUpIHRoaXMuI2ZvckVhY2hJblN1YnRyZWUoY2hpbGRFbnRyeSwgb25WYWx1ZSk7XG4gICAgICAgIGNoaWxkTWFwLmRlbGV0ZShrZXkpO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IGtleVByZWZpeDtcbiAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCk7XG4gICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGZpcnN0KTtcblxuICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMuI2RlbGV0ZUJ5UHJlZml4KG5leHRNYXBFbnRyeSwgcmVzdCwgb25WYWx1ZSk7XG5cbiAgICBpZiAoZGVsZXRlZCAmJiB0aGlzLiNjYW5QcnVuZShuZXh0TWFwRW50cnkpKSB7XG4gICAgICBjaGlsZE1hcC5kZWxldGUoZmlyc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgZGVsZXRlQnlQcmVmaXgoa2V5UHJlZml4LCBvblZhbHVlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleVByZWZpeCkgfHwga2V5UHJlZml4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNkZWxldGVCeVByZWZpeCh0aGlzLiNpbnRlcm5hbE1hcCwga2V5UHJlZml4LCBvblZhbHVlKTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuI2ludGVybmFsTWFwID0gbWFrZU5vZGUoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IENvbXBvc2l0ZU1hcCB9IGZyb20gJy4vY29tcG9zaXRlLW1hcCc7XG5cbmV4cG9ydCBjbGFzcyBMcnVDb21wb3NpdGVNYXAge1xuICAjaW5uZXIgPSBuZXcgQ29tcG9zaXRlTWFwKCk7XG4gICNtYXhTaXplO1xuICAjc2l6ZSA9IDA7XG4gICNoZWFkID0gbnVsbDtcbiAgI3RhaWwgPSBudWxsO1xuICAjb25FdmljdDtcblxuICBjb25zdHJ1Y3RvcihtYXhTaXplLCB7IG9uRXZpY3QgfSA9IHt9KSB7XG4gICAgdGhpcy4jbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgdGhpcy4jb25FdmljdCA9IG9uRXZpY3Q7XG4gIH1cblxuICAjYWRkVG9IZWFkKG5vZGUpIHtcbiAgICBub2RlLm5leHQgPSB0aGlzLiNoZWFkO1xuICAgIG5vZGUucHJldiA9IG51bGw7XG5cbiAgICBpZiAodGhpcy4jaGVhZCkge1xuICAgICAgdGhpcy4jaGVhZC5wcmV2ID0gbm9kZTtcbiAgICB9XG5cbiAgICB0aGlzLiNoZWFkID0gbm9kZTtcblxuICAgIGlmICghdGhpcy4jdGFpbCkge1xuICAgICAgdGhpcy4jdGFpbCA9IG5vZGU7XG4gICAgfVxuICB9XG5cbiAgI3JlbW92ZU5vZGUobm9kZSkge1xuICAgIGlmIChub2RlLnByZXYpIHtcbiAgICAgIG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNoZWFkID0gbm9kZS5uZXh0O1xuICAgIH1cblxuICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgIG5vZGUubmV4dC5wcmV2ID0gbm9kZS5wcmV2O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiN0YWlsID0gbm9kZS5wcmV2O1xuICAgIH1cblxuICAgIG5vZGUucHJldiA9IG51bGw7XG4gICAgbm9kZS5uZXh0ID0gbnVsbDtcbiAgfVxuXG4gICNwcm9tb3RlTm9kZShub2RlKSB7XG4gICAgaWYgKG5vZGUgPT09IHRoaXMuI2hlYWQpIHJldHVybjtcbiAgICB0aGlzLiNyZW1vdmVOb2RlKG5vZGUpO1xuICAgIHRoaXMuI2FkZFRvSGVhZChub2RlKTtcbiAgfVxuXG4gICNldmljdExydSgpIHtcbiAgICBjb25zdCBscnVOb2RlID0gdGhpcy4jdGFpbDtcbiAgICBjb25zdCBrZXkgPSBscnVOb2RlLmtleTtcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy4jaW5uZXIuZ2V0KGtleSk7XG4gICAgdGhpcy4jcmVtb3ZlTm9kZShscnVOb2RlKTtcbiAgICB0aGlzLiNpbm5lci5kZWxldGUoa2V5KTtcbiAgICB0aGlzLiNzaXplLS07XG5cbiAgICBpZiAodGhpcy4jb25FdmljdCkgdGhpcy4jb25FdmljdCh3cmFwcGVyLnZhbHVlLCBrZXkpO1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLiNpbm5lci5nZXQoa2V5KTtcblxuICAgIGlmICh3cmFwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy4jcHJvbW90ZU5vZGUod3JhcHBlci5scnVOb2RlKTtcblxuICAgIHJldHVybiB3cmFwcGVyLnZhbHVlO1xuICB9XG5cbiAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuI2lubmVyLmdldChrZXkpO1xuXG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy4jcHJvbW90ZU5vZGUoZXhpc3RpbmcubHJ1Tm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbHJ1Tm9kZSA9IHsga2V5LCBwcmV2OiBudWxsLCBuZXh0OiBudWxsIH07XG4gICAgdGhpcy4jaW5uZXIuc2V0KGtleSwgeyB2YWx1ZSwgbHJ1Tm9kZSB9KTtcbiAgICB0aGlzLiNhZGRUb0hlYWQobHJ1Tm9kZSk7XG4gICAgdGhpcy4jc2l6ZSsrO1xuXG4gICAgaWYgKHRoaXMuI3NpemUgPiB0aGlzLiNtYXhTaXplKSB7XG4gICAgICB0aGlzLiNldmljdExydSgpO1xuICAgIH1cbiAgfVxuXG4gIGhhcyhrZXkpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5uZXIuaGFzKGtleSk7XG4gIH1cblxuICAqdmFsdWVzKCkge1xuICAgIGZvciAoY29uc3Qgd3JhcHBlciBvZiB0aGlzLiNpbm5lci52YWx1ZXMoKSkge1xuICAgICAgeWllbGQgd3JhcHBlci52YWx1ZTtcbiAgICB9XG4gIH1cblxuICAqa2V5cygpIHtcbiAgICB5aWVsZCogdGhpcy4jaW5uZXIua2V5cygpO1xuICB9XG5cbiAgKmVudHJpZXMoKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB3cmFwcGVyXSBvZiB0aGlzLiNpbm5lci5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIFtrZXksIHdyYXBwZXIudmFsdWVdO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZUJ5UHJlZml4KGtleVByZWZpeCkge1xuICAgIHJldHVybiB0aGlzLiNpbm5lci5kZWxldGVCeVByZWZpeChrZXlQcmVmaXgsIHdyYXBwZXIgPT4ge1xuICAgICAgdGhpcy4jcmVtb3ZlTm9kZSh3cmFwcGVyLmxydU5vZGUpO1xuICAgICAgdGhpcy4jc2l6ZS0tO1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy4jaW5uZXIuY2xlYXIoKTtcbiAgICB0aGlzLiNoZWFkID0gbnVsbDtcbiAgICB0aGlzLiN0YWlsID0gbnVsbDtcbiAgICB0aGlzLiNzaXplID0gMDtcbiAgfVxufVxuIiwgImV4cG9ydCBkZWZhdWx0ICguLi5mdW5jdGlvbnMpID0+XG4gIHggPT4ge1xuICAgIGxldCB2YWwgPSB4O1xuXG4gICAgZnVuY3Rpb25zLmZvckVhY2goZiA9PiB7XG4gICAgICB2YWwgPSBmKHZhbCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmFsO1xuICB9O1xuIiwgImltcG9ydCB7IG5vblN0b3JlZEluc3RhbmNlS2V5LCBzdG9yZWRJbnN0YW5jZUtleSB9IGZyb20gJy4vbGlmZWN5Y2xlRW51bSc7XG5pbXBvcnQgeyBpc0NvbXBvc2l0ZUtleSB9IGZyb20gJy4uL2dldENvbXBvc2l0ZUtleS9nZXRDb21wb3NpdGVLZXknO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbCB9IGZyb20gJy4uL2dldEluamVjdGFibGUvZ2V0SW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcbmltcG9ydCB7IGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbiB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IENvbXBvc2l0ZU1hcCB9IGZyb20gJy4uL2NvbXBvc2l0ZS1tYXAvY29tcG9zaXRlLW1hcCc7XG5pbXBvcnQgeyBMcnVDb21wb3NpdGVNYXAgfSBmcm9tICcuLi9jb21wb3NpdGUtbWFwL2xydS1jb21wb3NpdGUtbWFwJztcbmltcG9ydCBmbG93IGZyb20gJy4vZmFzdEZsb3cnO1xuXG4vLyBQcmUtYWxsb2NhdGVkIGtleSBmb3Igc2luZ2xldG9uIGluc3RhbmNlIGxvb2t1cCBcdTIwMTQgYXZvaWRzIGFycmF5IGNyZWF0aW9uIHBlciBpbmplY3QoKVxuY29uc3Qgc2luZ2xldG9uQ29tcG9zaXRlS2V5ID0gW3N0b3JlZEluc3RhbmNlS2V5XTtcblxuLy8gRGV0ZWN0cyB0aGUga2V5ZWRTaW5nbGV0b24gc3RvcmFnZSBzaGFwZS4gU2luZ2xldG9ucyAoYW5kIHYyLWRlZmF1bHRcbi8vIGluamVjdGFibGVzIHRoYXQgaGF2ZSBvbmx5IGV2ZXIgYmVlbiBjYWxsZWQgd2l0aG91dCBhcmdzKSBzdG9yZSB0aGVcbi8vIGluc3RhbmNlIGRpcmVjdGx5OyBrZXllZFNpbmdsZXRvbiB3aXRoLWFyZ3Mgc3RvcmFnZSB1c2VzIGEgQ29tcG9zaXRlTWFwLlxuZXhwb3J0IGNvbnN0IGlzQ29tcG9zaXRlU3RvcmFnZSA9IHN0b3JlZCA9PlxuICBzdG9yZWQgaW5zdGFuY2VvZiBDb21wb3NpdGVNYXAgfHwgc3RvcmVkIGluc3RhbmNlb2YgTHJ1Q29tcG9zaXRlTWFwO1xuXG5leHBvcnQgY29uc3QgcHJpdmF0ZUluamVjdEZvciA9XG4gICh7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGluamVjdGFibGVTZXQsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZ2V0RGksXG4gICAgY2hlY2tGb3JOb01hdGNoZXMsXG4gICAgY2hlY2tGb3JUb29NYW55TWF0Y2hlcyxcbiAgICBjaGVja0ZvclNpZGVFZmZlY3RzLFxuICAgIGNoZWNrRm9yQWJzdHJhY3RUb2tlbixcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgICBnZXRTY29wZWRJZCxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSkgPT5cbiAgKHsgd2l0aE1ldGEgfSkgPT5cbiAgKHsgYWxpYXMsIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLCBpbmplY3RpbmdJbmplY3RhYmxlIH0pID0+IHtcbiAgICBjb25zdCBkaSA9IGdldERpKCk7XG5cbiAgICBsZXQgb3JpZ2luYWxJbmplY3RhYmxlO1xuXG4gICAgLy8gRmFzdCBwYXRoOiBhbGlhcyBpcyBpdHNlbGYgYW4gaW5qZWN0YWJsZSAodGhlIGRvbWluYW50IGNhc2UgXHUyMDE0IGV2ZXJ5XG4gICAgLy8gY2FsbCBmcm9tIHByaXZhdGVJbmplY3RNYW55IGxhbmRzIGhlcmUgYmVjYXVzZSBpdCBpdGVyYXRlcyByZXNvbHZlZFxuICAgIC8vIGluamVjdGFibGVzKS4gU2tpcCBnZXRSZWxhdGVkSW5qZWN0YWJsZXMgKHdoaWNoIHdvdWxkIGFsbG9jYXRlIGFcbiAgICAvLyBzaW5nbGUtZWxlbWVudCBbYWxpYXNdIGFycmF5KSwgdGhlIHNpbmdsZS1tYXRjaC9uby1tYXRjaCB2YWxpZGF0b3JzLFxuICAgIC8vIGFuZCB0aGUgYWJzdHJhY3QtdG9rZW4gY2hlY2sgKGluamVjdGFibGVzIGFyZSBuZXZlciBhYnN0cmFjdCkuXG4gICAgY29uc3QgYWxpYXNUeXBlID0gYWxpYXMuYWxpYXNUeXBlO1xuXG4gICAgaWYgKGFsaWFzVHlwZSA9PT0gaW5qZWN0YWJsZVN5bWJvbCB8fCBhbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgICBpZiAoIWluamVjdGFibGVTZXQuaGFzKGFsaWFzKSkge1xuICAgICAgICAvLyBSZXVzZSB0aGUgZXhpc3RpbmcgdGhyb3cgd2l0aCB0aGUgc2FtZSB3b3JkaW5nIGFzIHRoZSB0b2tlbiBwYXRoLlxuICAgICAgICBjaGVja0Zvck5vTWF0Y2hlcyhbXSwgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxJbmplY3RhYmxlID0gYWxpYXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoZWNrRm9yQWJzdHJhY3RUb2tlbihhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG5cbiAgICAgIGNvbnN0IHJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICAgIGNoZWNrRm9yVG9vTWFueU1hdGNoZXMocmVsYXRlZEluamVjdGFibGVzLCBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG4gICAgICBjaGVja0Zvck5vTWF0Y2hlcyhyZWxhdGVkSW5qZWN0YWJsZXMsIGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKTtcblxuICAgICAgb3JpZ2luYWxJbmplY3RhYmxlID0gcmVsYXRlZEluamVjdGFibGVzWzBdO1xuICAgIH1cblxuICAgIGFscmVhZHlJbmplY3RlZC5hZGQob3JpZ2luYWxJbmplY3RhYmxlKTtcblxuICAgIGNvbnN0IGluamVjdGFibGUgPVxuICAgICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLnNpemUgPiAwXG4gICAgICAgID8gb3ZlcnJpZGluZ0luamVjdGFibGVzLmdldChvcmlnaW5hbEluamVjdGFibGUpIHx8IG9yaWdpbmFsSW5qZWN0YWJsZVxuICAgICAgICA6IG9yaWdpbmFsSW5qZWN0YWJsZTtcblxuICAgIGNoZWNrRm9yU2lkZUVmZmVjdHMoaW5qZWN0YWJsZSwgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG5cbiAgICAvLyBCYWNrd2FyZCBjb21wYXQ6IG9sZC1zdHlsZSBzaW5nbGV0b25zIHRvbGVyYXRlZCBgaW5qZWN0KGFsaWFzLCB1bmRlZmluZWQpYC5cbiAgICAvLyBOb3JtYWxpemUgYWxsLXVuZGVmaW5lZCBhcmdzIHRvIFtdIHNvIGZhc3QtcGF0aCBhbmQgc2luZ2xldG9uIGd1YXJkIGJlaGF2ZVxuICAgIC8vIGFzIGlmIG5vIHBhcmFtZXRlciB3YXMgc3VwcGxpZWQuXG4gICAgaWYgKFxuICAgICAgaW5qZWN0YWJsZS5hbGlhc1R5cGUgIT09IGluamVjdGFibGVTeW1ib2wyICYmXG4gICAgICBpbmplY3RhYmxlLmxpZmVjeWNsZS5pZCA9PT0gJ3NpbmdsZXRvbicgJiZcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCA+IDAgJiZcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmV2ZXJ5KHAgPT4gcCA9PT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBGYXN0IHBhdGg6IHNpbmdsZXRvbiBjYWNoZSBoaXQgXHUyMDE0IGF2b2lkIGNyZWF0aW5nIG1pbmltYWxEaSBlbnRpcmVseS5cbiAgICAvLyBUaGUgc3RvcmVkIHZhbHVlIGlzIG9uZSBvZjpcbiAgICAvLyAgIC0gdW5kZWZpbmVkOiBub3RoaW5nIGNhY2hlZCB5ZXRcbiAgICAvLyAgIC0gQ29tcG9zaXRlTWFwIC8gTHJ1Q29tcG9zaXRlTWFwOiBrZXllZFNpbmdsZXRvbiBjYWNoZSwgbG9vayB1cCBieVxuICAgIC8vICAgICBzaW5nbGV0b25Db21wb3NpdGVLZXkgZm9yIGEgbm8tYXJncyBjYWxsXG4gICAgLy8gICAtIGFueSBvdGhlciB2YWx1ZTogaW5zdGFuY2UgZGlyZWN0bHkgKHNpbmdsZXRvbiBsaWZlY3ljbGUsIG9yIHYyXG4gICAgLy8gICAgIGRlZmF1bHQgbGlmZWN5Y2xlIHRoYXQgaGFzIG9ubHkgZXZlciBiZWVuIGNhbGxlZCB3aXRoIG5vIGFyZ3MpXG4gICAgLy9cbiAgICAvLyBXZSBkaXNwYXRjaCBvbiBsaWZlY3ljbGUuaWQgZmlyc3Qgc28gcGxhaW4gc2luZ2xldG9ucyAodGhlIGRvbWluYW50XG4gICAgLy8gY2FzZSkgc2tpcCB0aGUgaW5zdGFuY2VvZiBjaGVja3MgZW50aXJlbHk7IG9ubHkga2V5ZWRTaW5nbGV0b24tc2hhcGVkXG4gICAgLy8gbGlmZWN5Y2xlcyBmYWxsIHRocm91Z2ggdG8gdGhlIHN0cnVjdHVyYWwgY2hlY2suXG4gICAgaWYgKGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgaW5qZWN0YWJsZS5vdmVycmlkZGVuSW5qZWN0YWJsZSB8fCBpbmplY3RhYmxlLFxuICAgICAgKTtcblxuICAgICAgbGV0IGV4aXN0aW5nSW5zdGFuY2U7XG5cbiAgICAgIGlmIChpbmplY3RhYmxlLmxpZmVjeWNsZS5pZCA9PT0gJ3NpbmdsZXRvbicpIHtcbiAgICAgICAgZXhpc3RpbmdJbnN0YW5jZSA9IHN0b3JlZDtcbiAgICAgIH0gZWxzZSBpZiAoaXNDb21wb3NpdGVTdG9yYWdlKHN0b3JlZCkpIHtcbiAgICAgICAgZXhpc3RpbmdJbnN0YW5jZSA9IHN0b3JlZC5nZXQoc2luZ2xldG9uQ29tcG9zaXRlS2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXN0aW5nSW5zdGFuY2UgPSBzdG9yZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgICAgIGlmICghd2l0aE1ldGEpIHtcbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJbnN0YW5jZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5zdGFuY2U6IGV4aXN0aW5nSW5zdGFuY2UsXG4gICAgICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0SW5zdGFuY2UoXG4gICAgICBkaSxcbiAgICAgIGluamVjdGFibGUsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICBnZXROYW1lc3BhY2VkSWQsXG4gICAgICBnZXRTY29wZWRJZCxcbiAgICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgICk7XG5cbiAgICBpZiAoIXdpdGhNZXRhKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgIH07XG4gIH07XG5cbmNvbnN0IGNyZWF0ZU1pbmltYWxEaSA9IChcbiAgZGksXG4gIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gIGdldFNjb3BlZElkLFxuICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4pID0+IHtcbiAgLy8gQ2xvc3VyZS1jYXB0dXJlZCBtZXRob2RzIGFyZSBmaXhlZCB1cC1mcm9udCAoYHNoYXJlZGAgcGx1cyBpbmplY3QqKSxcbiAgLy8gc28gdXNlciBjb2RlIGNhbiBkZXRhY2ggdGhlbSBcdTIwMTQgYGNvbnN0IHsgcmVnaXN0ZXIgfSA9IGRpOyByZWdpc3RlciguLi4pYFxuICAvLyBhbmQgc2ltaWxhciBwYXR0ZXJucyBhcHBlYXIgaW4gdGVzdHMuIEEgY2xhc3Mtd2l0aC1wcm90b3R5cGUgZGlzcGF0Y2hlclxuICAvLyB3b3VsZCBiZSBjaGVhcGVyIHRvIGFsbG9jYXRlIGJ1dCBsb3NlcyB0aGF0IGRldGFjaC1mcmllbmRseSBiZWhhdmlvci5cbiAgY29uc3Qgc2hhcmVkID0ge1xuICAgIHJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIGRpLnJlZ2lzdGVyKHtcbiAgICAgICAgaW5qZWN0YWJsZXMsXG4gICAgICAgIGNvbnRleHQ6IFt7IGluamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkIH1dLFxuICAgICAgICBzb3VyY2U6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGRlcmVnaXN0ZXI6ICguLi5pbmplY3RhYmxlcykgPT4ge1xuICAgICAgZGkuZGVyZWdpc3Rlcih7XG4gICAgICAgIGluamVjdGFibGVzLFxuICAgICAgICBjb250ZXh0OiBbeyBpbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCB9XSxcbiAgICAgICAgc291cmNlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXQgc291cmNlTmFtZXNwYWNlKCkge1xuICAgICAgY29uc3QgbnNJZCA9IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG4gICAgICBjb25zdCBsYXN0Q29sb24gPSBuc0lkID8gbnNJZC5sYXN0SW5kZXhPZignOicpIDogLTE7XG5cbiAgICAgIHJldHVybiBsYXN0Q29sb24gPiAwID8gbnNJZC5zbGljZSgwLCBsYXN0Q29sb24pIDogdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICBoYXNSZWdpc3RyYXRpb25zOiBkaS5oYXNSZWdpc3RyYXRpb25zLFxuICAgIGdldE51bWJlck9mUmVnaXN0cmF0aW9uczogZGkuZ2V0TnVtYmVyT2ZSZWdpc3RyYXRpb25zLFxuICAgIGdldE51bWJlck9mSW5zdGFuY2VzOiBkaS5nZXROdW1iZXJPZkluc3RhbmNlcyxcblxuICAgIHB1cmdlOiAoYWxpYXMsIC4uLmtleVBhcnRzKSA9PlxuICAgICAgZGkuc2NvcGVkUHVyZ2UoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsIGFsaWFzLCAuLi5rZXlQYXJ0cyksXG5cbiAgICByZWdpc3RlcmVkSW5Mb2NhbFNjb3BlOiBhbGlhcyA9PlxuICAgICAgZGkucmVnaXN0ZXJlZEluU2NvcGVPZihpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCwgYWxpYXMpLFxuXG4gICAgcmVnaXN0ZXJlZEluTG9jYWxTY29wZVN1YnRyZWU6IGFsaWFzID0+XG4gICAgICBkaS5yZWdpc3RlcmVkSW5TdWJ0cmVlT2YoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsIGFsaWFzKSxcbiAgfTtcblxuICBpZiAoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQuYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgIC8vIEFuIGltcGVyYXRpdmUgb3ZlcnJpZGUgKGRpLm92ZXJyaWRlIC8gZGkuZWFybHlPdmVycmlkZSkgaW5zdGFudGlhdGVzIGFcbiAgICAvLyBzdGFuZC1pbiBvYmplY3QgdGhhdCB3YXMgbmV2ZXIgcmVnaXN0ZXJlZDsgdGhlIHJlZ2lzdHJhdGlvbiB0cmVlIG9ubHlcbiAgICAvLyBrbm93cyB0aGUgb3JpZ2luYWwsIHNvIHRoZSBzY29wZSB3YWxrIHN0YXJ0cyBmcm9tIGl0LlxuICAgIGNvbnN0IHJlZ2lzdGVyZWRJbmplY3RhYmxlID1cbiAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZDtcblxuICAgIC8vIFYyIG1pbmltYWxEaTogaW5qZWN0L2luamVjdE1hbnkvZXRjIGFyZSBmYWN0b3J5LXJldHVybmluZy4gRWFjaCBtZXRob2RcbiAgICAvLyBpcyBpbmxpbmVkIGRpcmVjdGx5IGFnYWluc3QgYGRpYCAobm8gbWluaW1hbEluamVjdCogaW50ZXJtZWRpYXJ5KSBzb1xuICAgIC8vIHdlIGRvbid0IGFsbG9jYXRlIGZvdXIgZXh0cmEgY2xvc3VyZXMgcGVyIG1pbmltYWxEaSBqdXN0IHRvIGZvcndhcmQuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNoYXJlZCxcblxuICAgICAgLy8gVGhlIGlkZW50aXR5IG9mIHdoYXQgaXMgYmVpbmcgaW5zdGFudGlhdGVkLCBmb3IgaW5zdGFudGlhdGUtY29kZVxuICAgICAgLy8gc2hhcmVkIGFjcm9zcyBpbmplY3RhYmxlcyAoZGVjb3JhdG9ycywgcmV1c2FibGUgZmFjdG9yaWVzKS4gYGlkYCBpcyBhXG4gICAgICAvLyBwbGFpbiByZWFkOyB0aGUgc2NvcGUgcGFpciB3YWxrcyB0aGUgcmVnaXN0cmF0aW9uIHRyZWUgcGVyIHJlYWQsXG4gICAgICAvLyBoZW5jZSBnZXR0ZXJzLlxuICAgICAgaWQ6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmlkLFxuXG4gICAgICBnZXQgc2NvcGVJZHMoKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IGdldFNjb3BlZElkKHJlZ2lzdGVyZWRJbmplY3RhYmxlKTtcblxuICAgICAgICBpZHMucG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIGlkcztcbiAgICAgIH0sXG5cbiAgICAgIGdldCBzY29wZWRJZCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFNjb3BlZElkKHJlZ2lzdGVyZWRJbmplY3RhYmxlKTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdDpcbiAgICAgICAgYWxpYXMgPT5cbiAgICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgICBkaS5pbmplY3Qoe1xuICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogcGFyYW1zLFxuICAgICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgICAgfSksXG5cbiAgICAgIGluamVjdE1hbnk6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KSxcblxuICAgICAgaW5qZWN0TWF5YmU6IGFsaWFzID0+IHtcbiAgICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCk7XG5cbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdFdpdGhNZXRhOlxuICAgICAgICBhbGlhcyA9PlxuICAgICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYW55V2l0aE1ldGE6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYXliZVdpdGhNZXRhOiBhbGlhcyA9PiB7XG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eShhbGlhcywgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQpO1xuXG4gICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFYxIG1pbmltYWxEaTogaW5qZWN0L2luamVjdE1hbnkvZXRjIHJldHVybiBpbnN0YW5jZXMgZGlyZWN0bHkuXG4gIGNvbnN0IG1pbmltYWxJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBkaS5pbmplY3RNYW55KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0V2l0aE1ldGEoe1xuICAgICAgYWxpYXMsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogYXJncyxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIH0pO1xuXG4gIGNvbnN0IG1pbmltYWxJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLnNoYXJlZCxcblxuICAgIGluamVjdDogbWluaW1hbEluamVjdCxcbiAgICBpbmplY3RNYW55OiBtaW5pbWFsSW5qZWN0TWFueSxcbiAgICBpbmplY3RXaXRoTWV0YTogbWluaW1hbEluamVjdFdpdGhNZXRhLFxuICAgIGluamVjdE1hbnlXaXRoTWV0YTogbWluaW1hbEluamVjdE1hbnlXaXRoTWV0YSxcblxuICAgIGluamVjdEZhY3Rvcnk6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgbWluaW1hbEluamVjdChhbGlhcywgLi4ucGFyYW1zKSxcbiAgfTtcbn07XG5cbmNvbnN0IGluc3RhbnRpYXRlID0gKFxuICBkaSxcbiAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gIG1pbmltYWxEaSxcbiAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuKSA9PiB7XG4gIC8vIERlY29yYXRvcnMgYWx3YXlzIGxvb2sgdXAgYWdhaW5zdCB0aGUgb3JpZ2luYWwgaW5qZWN0YWJsZSBzbyB0aGF0IGFuXG4gIC8vIGltcGVyYXRpdmUgb3ZlcnJpZGUgKGRpLm92ZXJyaWRlIC8gZGkuZWFybHlPdmVycmlkZSkgaXMgd3JhcHBlZCBieSBhbnlcbiAgLy8gZGVjb3JhdG9ycyByZWdpc3RlcmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRhcmdldCBcdTIwMTQgY29tcG9zaW5nIGRlY29yYXRvcnNcbiAgLy8gcmVseSBvbiB0aGlzLlxuICBjb25zdCB0YXJnZXQgPVxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQ7XG5cbiAgY29uc3QgZGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzKHtcbiAgICBkZWNvcmF0b3JUb2tlbjogaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICAgIHRhcmdldCxcbiAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgfSk7XG5cbiAgY29uc3QgZGVjb3JhdGVkID1cbiAgICBkZWNvcmF0b3JzLmxlbmd0aCA9PT0gMFxuICAgICAgPyBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5pbnN0YW50aWF0ZVxuICAgICAgOiBmbG93KC4uLmRlY29yYXRvcnMpKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmluc3RhbnRpYXRlKTtcblxuICAvLyBOZXctc3R5bGUgaW5qZWN0YWJsZTI6IGN1cnJpZWQgKGRpKSA9PiAoLi4ucGFyYW1zKSA9PiBpbnN0YW5jZVxuICBpZiAoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQuYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgIHJldHVybiBkZWNvcmF0ZWQobWluaW1hbERpKSguLi5pbnN0YW50aWF0aW9uUGFyYW1ldGVycyk7XG4gIH1cblxuICAvLyBPbGQtc3R5bGU6IChkaSwgLi4ucGFyYW1zKSA9PiBpbnN0YW5jZVxuICByZXR1cm4gZGVjb3JhdGVkKG1pbmltYWxEaSwgLi4uaW5zdGFudGlhdGlvblBhcmFtZXRlcnMpO1xufTtcblxuY29uc3QgZW5zdXJlSW5zdGFuY2VNYXAgPSAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBrZXkpID0+IHtcbiAgbGV0IGluc3RhbmNlTWFwID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChrZXkpO1xuXG4gIGlmICghaW5zdGFuY2VNYXApIHtcbiAgICBpbnN0YW5jZU1hcCA9IG5ldyBDb21wb3NpdGVNYXAoKTtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGtleSwgaW5zdGFuY2VNYXApO1xuICB9XG5cbiAgcmV0dXJuIGluc3RhbmNlTWFwO1xufTtcblxuY29uc3QgZ2V0SW5zdGFuY2UgPSAoXG4gIGRpLFxuICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICBnZXROYW1lc3BhY2VkSWQsXG4gIGdldFNjb3BlZElkLFxuICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuKSA9PiB7XG4gIGNvbnN0IGNhY2hlS2V5ID1cbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5vdmVycmlkZGVuSW5qZWN0YWJsZSB8fFxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkO1xuXG4gIGNvbnN0IGxpZmVjeWNsZUlkID0gaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQubGlmZWN5Y2xlLmlkO1xuXG4gIC8vIFNpbmdsZXRvbjogZmFzdCBwYXRoIGluIHByaXZhdGVJbmplY3RGb3IgYWxyZWFkeSBjaGVja2VkIGNhY2hlIGFuZCBtaXNzZWQuXG4gIC8vIFNraXAgcmVkdW5kYW50IGdldEluc3RhbmNlS2V5ICsgY2FjaGUgY2hlY2sgXHUyMDE0IGdvIHN0cmFpZ2h0IHRvIGluc3RhbnRpYXRpb24uXG4gIGlmIChsaWZlY3ljbGVJZCA9PT0gJ3NpbmdsZXRvbicpIHtcbiAgICBpZiAoaW5zdGFudGlhdGlvblBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IHNpbmdsZXRvbiBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICApfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaWxsZWdhbGx5IHRvIHNpbmdsZXRvbnMsIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzIHdlcmUgcHJvdmlkZWQ6IFwiJHtpbnN0YW50aWF0aW9uUGFyYW1ldGVyc31cIi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtaW5pbWFsRGkgPSBjcmVhdGVNaW5pbWFsRGkoXG4gICAgICBkaSxcbiAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIGdldFNjb3BlZElkLFxuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgICk7XG5cbiAgICBjb25zdCBuZXdJbnN0YW5jZSA9IGluc3RhbnRpYXRlKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIG1pbmltYWxEaSxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgKTtcblxuICAgIC8vIFNpbmdsZXRvbnMgc3RvcmUgdGhlIGluc3RhbmNlIGRpcmVjdGx5IGluIHRoZSBtYXAgXHUyMDE0IG5vIHBlci1pbmplY3RhYmxlXG4gICAgLy8gQ29tcG9zaXRlTWFwIHdyYXBwZXIuIFNhdmVzIH41IG9iamVjdCBhbGxvY2F0aW9ucyBwZXIgZmlyc3QtaW5qZWN0LlxuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5zZXQoY2FjaGVLZXksIG5ld0luc3RhbmNlKTtcblxuICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgfVxuXG4gIC8vIFRyYW5zaWVudDogbmV2ZXIgY2FjaGVkIFx1MjAxNCBza2lwIGtleSByZXNvbHV0aW9uLCBjYWNoZSBjaGVjaywgYW5kIGNhY2hlIHN0b3JlLlxuICBpZiAobGlmZWN5Y2xlSWQgPT09ICd0cmFuc2llbnQnKSB7XG4gICAgY29uc3QgbWluaW1hbERpID0gY3JlYXRlTWluaW1hbERpKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICBnZXRTY29wZWRJZCxcbiAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGluc3RhbnRpYXRlKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIG1pbmltYWxEaSxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFYyLWRlZmF1bHQgKyBuby1hcmdzIGZhc3QgcGF0aDogYmVoYXZlcyBsaWtlIGEgc2luZ2xldG9uLiBTa2lwXG4gIC8vIGdldEluc3RhbmNlS2V5ICsga2V5LWFycmF5IGFsbG9jYXRpb24gKyBDb21wb3NpdGVNYXAgYWxsb2NhdGlvbi4gVGhlXG4gIC8vIGluc3RhbmNlIGlzIHN0b3JlZCBkaXJlY3RseSB1bmRlciBjYWNoZUtleSwgbWF0Y2hpbmcgdGhlIHNpbmdsZXRvblxuICAvLyBzaGFwZS4gSWYgdGhlIHNhbWUgdjIgaW5qZWN0YWJsZSBpcyBsYXRlciBjYWxsZWQgd2l0aCBhcmdzIChyYXJlIG1peGVkXG4gIC8vIHVzYWdlKSwgdGhlIGtleWVkU2luZ2xldG9uIHBhdGggYmVsb3cgbWlncmF0ZXMgdGhlIGV4aXN0aW5nIGluc3RhbmNlXG4gIC8vIGludG8gYSBDb21wb3NpdGVNYXAgdW5kZXIgc2luZ2xldG9uQ29tcG9zaXRlS2V5IGJlZm9yZSBhZGRpbmcgdGhlIG5ld1xuICAvLyBrZXllZCBlbnRyeS5cbiAgaWYgKFxuICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCAmJlxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmxpZmVjeWNsZS5faXNWMkRlZmF1bHRMaWZlY3ljbGVcbiAgKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuZ2V0KGNhY2hlS2V5KTtcblxuICAgIGlmICghaXNDb21wb3NpdGVTdG9yYWdlKGV4aXN0aW5nKSkge1xuICAgICAgY29uc3QgbWluaW1hbERpID0gY3JlYXRlTWluaW1hbERpKFxuICAgICAgICBkaSxcbiAgICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgICAgZ2V0U2NvcGVkSWQsXG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gaW5zdGFudGlhdGUoXG4gICAgICAgIGRpLFxuICAgICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgbWluaW1hbERpLFxuICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgICApO1xuXG4gICAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGNhY2hlS2V5LCBuZXdJbnN0YW5jZSk7XG4gICAgICByZXR1cm4gbmV3SW5zdGFuY2U7XG4gICAgfVxuICAgIC8vIGV4aXN0aW5nIGlzIGEgQ29tcG9zaXRlTWFwIChtaXhlZCB1c2FnZSBwYXRoKSBcdTIwMTQgZmFsbCB0aHJvdWdoLlxuICB9XG5cbiAgLy8ga2V5ZWRTaW5nbGV0b24gLyBjdXN0b20gbGlmZWN5Y2xlOiBmdWxsIGtleSByZXNvbHV0aW9uICsgY2FjaGUgY2hlY2suXG4gIGNvbnN0IG1pbmltYWxEaSA9IGNyZWF0ZU1pbmltYWxEaShcbiAgICBkaSxcbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBnZXRTY29wZWRJZCxcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICk7XG5cbiAgY29uc3QgaW5zdGFuY2VLZXkgPSBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuZ2V0SW5zdGFuY2VLZXkoXG4gICAgbWluaW1hbERpLFxuICAgIC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICApO1xuXG4gIGNvbnN0IGluc3RhbmNlQ29tcG9zaXRlS2V5ID0gaXNDb21wb3NpdGVLZXkoaW5zdGFuY2VLZXkpXG4gICAgPyBpbnN0YW5jZUtleS5rZXlzXG4gICAgOiBbaW5zdGFuY2VLZXldO1xuXG4gIGxldCBleGlzdGluZ01hcCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoY2FjaGVLZXkpO1xuXG4gIC8vIE1peGVkLXVzYWdlIG1pZ3JhdGlvbjogb25seSB2Mi1kZWZhdWx0IGluamVjdGFibGVzIGNhbiBoYXZlIGFycml2ZWRcbiAgLy8gaGVyZSB3aXRoIGFuIGluc3RhbmNlIGluIHRoZSBzbG90IChmcm9tIGEgcHJpb3Igbm8tYXJncyBjYWxsKS4gRm9yXG4gIC8vIGV2ZXJ5IG90aGVyIGtleWVkU2luZ2xldG9uLCB0aGUgc2xvdCBpcyBlaXRoZXIgdW5kZWZpbmVkIG9yIGFcbiAgLy8gQ29tcG9zaXRlTWFwLCBzbyBza2lwIHRoZSBzdHJ1Y3R1cmFsIGNoZWNrLlxuICBpZiAoXG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQubGlmZWN5Y2xlLl9pc1YyRGVmYXVsdExpZmVjeWNsZSAmJlxuICAgIGV4aXN0aW5nTWFwICE9PSB1bmRlZmluZWQgJiZcbiAgICAhaXNDb21wb3NpdGVTdG9yYWdlKGV4aXN0aW5nTWFwKVxuICApIHtcbiAgICBjb25zdCBwcmV2aW91c0luc3RhbmNlID0gZXhpc3RpbmdNYXA7XG4gICAgZXhpc3RpbmdNYXAgPSBuZXcgQ29tcG9zaXRlTWFwKCk7XG4gICAgZXhpc3RpbmdNYXAuc2V0KHNpbmdsZXRvbkNvbXBvc2l0ZUtleSwgcHJldmlvdXNJbnN0YW5jZSk7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLnNldChjYWNoZUtleSwgZXhpc3RpbmdNYXApO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IGV4aXN0aW5nTWFwPy5nZXQoaW5zdGFuY2VDb21wb3NpdGVLZXkpO1xuXG4gIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2U7XG4gIH1cblxuICBjb25zdCBuZXdJbnN0YW5jZSA9IGluc3RhbnRpYXRlKFxuICAgIGRpLFxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIG1pbmltYWxEaSxcbiAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgKTtcblxuICBpZiAoaW5zdGFuY2VDb21wb3NpdGVLZXlbMF0gIT09IG5vblN0b3JlZEluc3RhbmNlS2V5KSB7XG4gICAgZW5zdXJlSW5zdGFuY2VNYXAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBjYWNoZUtleSkuc2V0KFxuICAgICAgaW5zdGFuY2VDb21wb3NpdGVLZXksXG4gICAgICBuZXdJbnN0YW5jZSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5ld0luc3RhbmNlO1xufTtcbiIsICJpbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcbmltcG9ydCB7IGluamVjdGlvbkRlY29yYXRvclRva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG5leHBvcnQgY29uc3Qgd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3IgPVxuICAoeyBkZWNvcmF0b3JDYWNoZSwgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAgdG9CZURlY29yYXRlZCA9PlxuICAoeyBhbGlhcywgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsIGluamVjdGluZ0luamVjdGFibGUgfSkgPT4ge1xuICAgIC8vIFdoZW4gZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uIGlzIG51bGwsIGEgZGVjb3JhdG9yIHdhcyByZWdpc3RlcmVkIG9yXG4gICAgLy8gZGVyZWdpc3RlcmVkIFx1MjAxNCBpbnZhbGlkYXRlIGFsbCBwZXItYWxpYXMgY2FjaGVkIGNvbXBvc2l0aW9ucy5cbiAgICBpZiAoZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uID09PSBudWxsKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSB0cnVlO1xuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcyA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBsZXQgZGVjb3JhdGVkID0gZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcy5nZXQoYWxpYXMpO1xuXG4gICAgaWYgKGRlY29yYXRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgICBkZWNvcmF0b3JUb2tlbjogaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgICAgIHRhcmdldDogYWxpYXMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBib3VuZEluamVjdCA9ICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgdG9CZURlY29yYXRlZCh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGRlY29yYXRlZCA9IGZsb3coLi4uZGVjb3JhdG9ycykoYm91bmRJbmplY3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb3JhdGVkID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcy5zZXQoYWxpYXMsIGRlY29yYXRlZCk7XG4gICAgfVxuXG4gICAgaWYgKGRlY29yYXRlZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRvQmVEZWNvcmF0ZWQoe1xuICAgICAgICBhbGlhcyxcbiAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdGVkKC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzKTtcbiAgfTtcbiIsICJleHBvcnQgY29uc3QgcHJpdmF0ZUluamVjdE1hbnlGb3IgPVxuICAoeyBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsIGdldEluamVjdCwgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwIH0pID0+XG4gICh7IHdpdGhNZXRhIH0pID0+XG4gICh7IGFsaWFzLCBpbnN0YW50aWF0aW9uUGFyYW1ldGVycywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgY29uc3QgaW5qZWN0ID0gZ2V0SW5qZWN0KCk7XG5cbiAgICBjb25zdCByZWxhdGVkSW5qZWN0YWJsZXMgPSBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpO1xuICAgIGNvbnN0IG4gPSByZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoO1xuXG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobik7XG5cbiAgICAvLyBUaGUgYXJnIG9iamVjdCBpcyByZXVzZWQgYWNyb3NzIGl0ZXJhdGlvbnMgXHUyMDE0IHByaXZhdGVJbmplY3RGb3JcbiAgICAvLyBkZXN0cnVjdHVyZXMgaXQgb24gZW50cnkgYW5kIG5ldmVyIHJldGFpbnMgYSByZWZlcmVuY2UsIHNvIG11dGF0aW5nXG4gICAgLy8gLmFsaWFzIGJldHdlZW4gY2FsbHMgaXMgc2FmZS5cbiAgICBjb25zdCBhcmcgPSB7XG4gICAgICBhbGlhczogdW5kZWZpbmVkLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBhbGlhcyxcbiAgICB9O1xuXG4gICAgaWYgKHdpdGhNZXRhKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCBpbmplY3RhYmxlID0gcmVsYXRlZEluamVjdGFibGVzW2ldO1xuICAgICAgICBhcmcuYWxpYXMgPSBpbmplY3RhYmxlO1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGluamVjdChhcmcpO1xuICAgICAgICByZXN1bHRbaV0gPSB7XG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBhcmcuYWxpYXMgPSByZWxhdGVkSW5qZWN0YWJsZXNbaV07XG4gICAgICAgIHJlc3VsdFtpXSA9IGluamVjdChhcmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4iLCAiaW1wb3J0IHsgaW5qZWN0aW9uVG9rZW5TeW1ib2wgfSBmcm9tICcuL2dldEluamVjdGlvblRva2VuJztcbmltcG9ydCB7IGluamVjdGlvblRva2VuU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGlvblRva2VuID0+XG4gIG1heWJlSW5qZWN0aW9uVG9rZW4/LmFsaWFzVHlwZSA9PT0gaW5qZWN0aW9uVG9rZW5TeW1ib2wgfHxcbiAgbWF5YmVJbmplY3Rpb25Ub2tlbj8uYWxpYXNUeXBlID09PSBpbmplY3Rpb25Ub2tlblN5bWJvbDI7XG4iLCAiLy8gVGhlIGlkcyBvZiB0aGUgc2NvcGVzIGFuIGFsaWFzIHdhcyByZWdpc3RlcmVkIHVuZGVyLCBvdXRlcm1vc3QgZmlyc3QgYW5kXG4vLyB0aGUgaW1tZWRpYXRlIG93bmVyIGxhc3QuIEVtcHR5IGZvciBjb250YWluZXItbGV2ZWwgcmVnaXN0cmF0aW9ucywgYW5kIGZvclxuLy8gYW55dGhpbmcgbmV2ZXIgcmVnaXN0ZXJlZCAoaW5qZWN0aW9uIHRva2VucywgdGhlIGNvbnRhaW5lciByb290KS5cbmNvbnN0IGdldFNjb3BlSWRzRm9yID0gaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQgPT4gYWxpYXMgPT4ge1xuICBjb25zdCBpZHMgPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSBhbGlhcztcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5nZXQoY3VycmVudCk7XG5cbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IGNvbnRleHRbY29udGV4dC5sZW5ndGggLSAxXTtcblxuICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcicpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlkcy5wdXNoKHBhcmVudC5pbmplY3RhYmxlLmlkKTtcbiAgICBjdXJyZW50ID0gcGFyZW50LmluamVjdGFibGU7XG4gIH1cblxuICBpZHMucmV2ZXJzZSgpO1xuICByZXR1cm4gaWRzO1xufTtcblxuLy8gVGhlIHNjb3BlIGlkcyBmb2xsb3dlZCBieSB0aGUgYWxpYXMncyBvd24gaWQgXHUyMDE0IHRoZSBzZWdtZW50cyBvZiBpdHNcbi8vIG5hbWVzcGFjZWQgaWQsIHdoaWNoIGlzIHRoZXNlIGpvaW5lZC4gV2Fsa3MgdGhlIHJlZ2lzdHJhdGlvbiB0cmVlIG9uIGV2ZXJ5XG4vLyBjYWxsLCBzbyBjYWxsZXJzIHdhbnRpbmcgaXQgY2hlYXAgc2hvdWxkIGNhY2hlOyB0aGUgYXJyYXkgaXMgZnJlc2ggcGVyIGNhbGxcbi8vIGFuZCB0aGUgY2FsbGVyJ3MgdG8ga2VlcC5cbmV4cG9ydCBjb25zdCBnZXRTY29wZWRJZEZvciA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0ID0+IHtcbiAgY29uc3QgZ2V0U2NvcGVJZHMgPSBnZXRTY29wZUlkc0ZvcihpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCk7XG5cbiAgcmV0dXJuIGFsaWFzID0+IHtcbiAgICBjb25zdCBpZHMgPSBnZXRTY29wZUlkcyhhbGlhcyk7XG5cbiAgICBpZHMucHVzaChhbGlhcy5pZCk7XG5cbiAgICByZXR1cm4gaWRzO1xuICB9O1xufTtcbiIsICJpbXBvcnQgaXNJbmplY3Rpb25Ub2tlbiBmcm9tICcuLi9nZXRJbmplY3Rpb25Ub2tlbi9pc0luamVjdGlvblRva2VuJztcbmltcG9ydCB7IGdldFNjb3BlZElkRm9yIH0gZnJvbSAnLi9nZXRTY29wZWRJZEZvcic7XG5cbi8vIFRoZSBzY29wZWQgaWQgam9pbmVkIHdpdGggJzonLiBBbiBpbmplY3Rpb24gdG9rZW4gaXMgbmV2ZXIgcmVnaXN0ZXJlZCBhbmRcbi8vIHNvIGhhcyBubyBzY29wZXM7IGl0cyBpZCBpcyBwYXJlbnRoZXNpemVkIHRvIHRlbGwgaXQgYXBhcnQgZnJvbSBhblxuLy8gaW5qZWN0YWJsZSdzIHdoZXJlIGl0IHN0YW5kcyBpbiBhcyB0aGUgaW5qZWN0aW5nIHBhcnR5LlxuZXhwb3J0IGNvbnN0IGdldE5hbWVzcGFjZWRJZEZvciA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0ID0+IHtcbiAgY29uc3QgZ2V0U2NvcGVkSWQgPSBnZXRTY29wZWRJZEZvcihpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCk7XG5cbiAgcmV0dXJuIGFsaWFzID0+XG4gICAgaXNJbmplY3Rpb25Ub2tlbihhbGlhcylcbiAgICAgID8gYCgke2FsaWFzLmlkfSlgXG4gICAgICA6IGdldFNjb3BlZElkKGFsaWFzKS5qb2luKCc6Jyk7XG59O1xuIiwgImV4cG9ydCBjb25zdCBpbmplY3RhYmxlQnVuY2hTeW1ib2wgPSAnaW5qZWN0YWJsZS1idW5jaCc7XG5cbmV4cG9ydCBkZWZhdWx0IGJ1bmNoID0+XG4gIE9iamVjdC5hc3NpZ24oYnVuY2gsIHtcbiAgICBhbGlhc1R5cGU6IGluamVjdGFibGVCdW5jaFN5bWJvbCxcbiAgfSk7XG4iLCAiaW1wb3J0IHsgaW5qZWN0YWJsZUJ1bmNoU3ltYm9sIH0gZnJvbSAnLi9nZXRJbmplY3RhYmxlQnVuY2gnO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGFibGVCdW5jaCA9PlxuICBtYXliZUluamVjdGFibGVCdW5jaD8uYWxpYXNUeXBlID09PSBpbmplY3RhYmxlQnVuY2hTeW1ib2w7XG4iLCAiaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbCB9IGZyb20gJy4vZ2V0SW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcblxuZXhwb3J0IGRlZmF1bHQgbWF5YmVJbmplY3RhYmxlID0+XG4gIG1heWJlSW5qZWN0YWJsZT8uYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sIHx8XG4gIG1heWJlSW5qZWN0YWJsZT8uYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMjtcbiIsICJpbXBvcnQgaXNJbmplY3RhYmxlQnVuY2ggZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZUJ1bmNoL2lzSW5qZWN0YWJsZUJ1bmNoJztcbmltcG9ydCBpc0luamVjdGFibGUgZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZS9pc0luamVjdGFibGUnO1xuXG5jb25zdCBjb2xsZWN0RGVlcEJ1bmNoVmFsdWVzID0gKGJ1bmNoLCBvdXQpID0+IHtcbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhidW5jaCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0aGluZyA9IHZhbHVlc1tpXTtcblxuICAgIGlmIChpc0luamVjdGFibGVCdW5jaCh0aGluZykpIHtcbiAgICAgIGNvbGxlY3REZWVwQnVuY2hWYWx1ZXModGhpbmcsIG91dCk7XG4gICAgfSBlbHNlIGlmIChpc0luamVjdGFibGUodGhpbmcpKSB7XG4gICAgICBvdXQucHVzaCh0aGluZyk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RhYmxlcyA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5qZWN0YWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpbmplY3RhYmxlID0gaW5qZWN0YWJsZXNbaV07XG5cbiAgICBpZiAoaXNJbmplY3RhYmxlQnVuY2goaW5qZWN0YWJsZSkpIHtcbiAgICAgIGNvbGxlY3REZWVwQnVuY2hWYWx1ZXMoaW5qZWN0YWJsZSwgcmVzdWx0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goaW5qZWN0YWJsZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAiLy8gVG9rZW4gaGllcmFyY2hpZXMgKHNwZWNpZmljVG9rZW5PZiBjaGFpbnMpIGFyZSBpbW11dGFibGUgXHUyMDE0IGNhY2hlIHBlciB0b2tlbi5cbmNvbnN0IHRva2VuQ2hhaW5DYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5cbmV4cG9ydCBjb25zdCBnZXRSZWxhdGVkVG9rZW5zID0gdG9rZW4gPT4ge1xuICBpZiAodG9rZW4gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBlbXB0eUFycmF5O1xuICB9XG5cbiAgbGV0IGNhY2hlZCA9IHRva2VuQ2hhaW5DYWNoZS5nZXQodG9rZW4pO1xuXG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgY29uc3QgdG9rZW5zID0gW107XG4gIGxldCBjdXJyZW50ID0gdG9rZW47XG5cbiAgd2hpbGUgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHRva2Vucy5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LnNwZWNpZmljVG9rZW5PZjtcbiAgfVxuXG4gIHRva2VuQ2hhaW5DYWNoZS5zZXQodG9rZW4sIHRva2Vucyk7XG5cbiAgcmV0dXJuIHRva2Vucztcbn07XG5cbmV4cG9ydCBjb25zdCBpc1JlbGF0ZWRUb1Rva2VuID0gKHRva2VuLCBhbmNlc3RvcikgPT4ge1xuICBsZXQgY3VycmVudCA9IHRva2VuO1xuXG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IGFuY2VzdG9yKSByZXR1cm4gdHJ1ZTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5zcGVjaWZpY1Rva2VuT2Y7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBlbXB0eUFycmF5ID0gW107XG4iLCAiaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5cbi8vIENhY2hlZCBhcnJheSBwZXIgdG9rZW4gXHUyMDE0IGF2b2lkcyBzcHJlYWRpbmcgU2V0IHRvIEFycmF5IG9uIGV2ZXJ5IGluamVjdCgpIGNhbGwuXG4vLyBJbnZhbGlkYXRlZCBieSBzZXR0aW5nIHRvIG51bGwgd2hlbiB0aGUgU2V0IGlzIG11dGF0ZWQgKHJlZ2lzdGVyL2RlcmVnaXN0ZXIpLlxuY29uc3QgYXJyYXlDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5cbmNvbnN0IEVNUFRZID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbmNvbnN0IGdldENhY2hlZEFycmF5ID0gc2V0ID0+IHtcbiAgbGV0IGFyciA9IGFycmF5Q2FjaGUuZ2V0KHNldCk7XG5cbiAgaWYgKCFhcnIpIHtcbiAgICBhcnIgPSBbLi4uc2V0XTtcbiAgICBhcnJheUNhY2hlLnNldChzZXQsIGFycik7XG4gIH1cblxuICByZXR1cm4gYXJyO1xufTtcblxuZXhwb3J0IGNvbnN0IGludmFsaWRhdGVSZWxhdGVkSW5qZWN0YWJsZXNDYWNoZSA9IHNldCA9PiB7XG4gIGFycmF5Q2FjaGUuZGVsZXRlKHNldCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yID1cbiAgKHsgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLCBpbmplY3RhYmxlU2V0IH0pID0+XG4gIGFsaWFzID0+IHtcbiAgICBpZiAoaXNJbmplY3RhYmxlKGFsaWFzKSkge1xuICAgICAgcmV0dXJuIGluamVjdGFibGVTZXQuaGFzKGFsaWFzKSA/IFthbGlhc10gOiBFTVBUWTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGFsaWFzKTtcblxuICAgIGlmICghc2V0IHx8IHNldC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldENhY2hlZEFycmF5KHNldCk7XG4gIH07XG4iLCAiaW1wb3J0IHsgZ2V0TmFtZXNwYWNlZElkRm9yIH0gZnJvbSAnLi9nZXROYW1lc3BhY2VkSWRGb3InO1xuaW1wb3J0IHtcbiAgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICByZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbn0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHRvRmxhdEluamVjdGFibGVzIGZyb20gJy4vdG9GbGF0SW5qZWN0YWJsZXMnO1xuaW1wb3J0IHsgTHJ1Q29tcG9zaXRlTWFwIH0gZnJvbSAnLi4vY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcCc7XG5pbXBvcnQgeyBnZXRSZWxhdGVkVG9rZW5zLCBpc1JlbGF0ZWRUb1Rva2VuIH0gZnJvbSAnLi9nZXRSZWxhdGVkVG9rZW5zJztcbmltcG9ydCB7IGludmFsaWRhdGVSZWxhdGVkSW5qZWN0YWJsZXNDYWNoZSB9IGZyb20gJy4vZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yJztcbmltcG9ydCBmbG93IGZyb20gJy4vZmFzdEZsb3cnO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJGb3IgPVxuICAoe1xuICAgIHJlZ2lzdGVyU2luZ2xlLFxuICAgIGluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgcmVzb2x2ZUluamVjdGlvblRva2VuT2YsXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgfSkgPT5cbiAgKHsgaW5qZWN0YWJsZXMsIGNvbnRleHQsIHNvdXJjZSB9KSA9PiB7XG4gICAgY29uc3QgZmxhdEluamVjdGFibGVzID0gdG9GbGF0SW5qZWN0YWJsZXMoaW5qZWN0YWJsZXMpO1xuXG4gICAgLy8gUGhhc2UgMDogaW5zdGFudGlhdGlvbi1kZWNvcmF0b3ItdGFnZ2VkIGluamVjdGFibGVzLiBUaGV5IHJlZ2lzdGVyXG4gICAgLy8gICBmaXJzdCBzbyB0aGF0IGFueSBzYW1lLWJhdGNoIG92ZXJyaWRlcyBvZiAocmVnaXN0cmF0aW9uLSlkZWNvcmF0b3JzXG4gICAgLy8gICBhcmUgYWxyZWFkeSBpbiBwbGFjZSBieSB0aGUgdGltZSB0aG9zZSBkZWNvcmF0b3JzIGFyZSBpbnN0YW50aWF0ZWRcbiAgICAvLyAgIGluIHBoYXNlIDIuIFRoZXkgZ28gdGhyb3VnaCB0aGUgcmVnaXN0cmF0aW9uLWRlY29yYXRvciBwaXBlbGluZSBzb1xuICAgIC8vICAgcHJvZHVjdGlvbiBjb2RlIGNhbiBvcHQgdGhlbSBvdXQgdmlhIHRhZy90YXJnZXQta2V5ZWQgZGVjb3JhdG9ycy5cbiAgICAvLyBQaGFzZSAxOiByZWdpc3RyYXRpb24tZGVjb3JhdG9yLXRhZ2dlZCBpbmplY3RhYmxlcy4gVGhleSByZWdpc3RlclxuICAgIC8vICAgZGlyZWN0bHkgdmlhIHJlZ2lzdGVyU2luZ2xlIChubyByZWN1cnNpdmUgZGVjb3JhdGlvbikgdG8gYXZvaWRcbiAgICAvLyAgIGJvb3RzdHJhcCBjaGFvcy5cbiAgICAvLyBQaGFzZSAyOiByZWd1bGFyIGluamVjdGFibGVzIHJlZ2lzdGVyIHRocm91Z2ggdGhlIGRlY29yYXRvciBwaXBlbGluZS5cbiAgICBjb25zdCBwaGFzZTBJbmplY3RhYmxlcyA9IFtdO1xuICAgIGNvbnN0IHJlZ2lzdGVyZWRSZWdpc3RyYXRpb25EZWNvcmF0b3JJbmplY3RhYmxlcyA9IFtdO1xuICAgIGNvbnN0IHBoYXNlMkluamVjdGFibGVzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZsYXRJbmplY3RhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5qZWN0YWJsZSA9IGZsYXRJbmplY3RhYmxlc1tpXTtcblxuICAgICAgLy8gUmVzb2x2ZWQgYmVmb3JlIGFueXRoaW5nIHJlYWRzIHRoZSB0b2tlbjogdGhlIHBoYXNlcyBiZWxvdyBzb3J0IGJ5IGl0LlxuICAgICAgcmVzb2x2ZUluamVjdGlvblRva2VuT2YoaW5qZWN0YWJsZSwgY29udGV4dCk7XG5cbiAgICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlKTtcblxuICAgICAgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0aW9uVG9rZW4sIHJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuKSkge1xuICAgICAgICByZWdpc3RlclNpbmdsZShpbmplY3RhYmxlLCBjb250ZXh0KTtcbiAgICAgICAgcmVnaXN0ZXJlZFJlZ2lzdHJhdGlvbkRlY29yYXRvckluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICB9IGVsc2UgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0aW9uVG9rZW4sIGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbikpIHtcbiAgICAgICAgcGhhc2UwSW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBoYXNlMkluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJhdGNoSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgY29uc3QgcmVnaXN0ZXJlZEluamVjdGFibGVzID0gW107XG5cbiAgICBjb25zdCBmaXJlQ2FsbGJhY2tzRm9yID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgICBjb25zdCBjYWxsYmFja3MgPSBpbmplY3RNYW55KHtcbiAgICAgICAgYWxpYXM6IHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoZSB0b2tlbiBhcyByZXNvbHZlZCBmb3IgdGhpcyByZWdpc3RyYXRpb246IGFuIGBpbmplY3Rpb25Ub2tlbmAgZ2l2ZW5cbiAgICAgIC8vIGFzIGEgZnVuY3Rpb24gaXMgb3BhcXVlIHRvIGEgY2FsbGJhY2sgcmVhZGluZyB0aGUgaW5qZWN0YWJsZSBhbG9uZS5cbiAgICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlKTtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjYWxsYmFja3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2pdKGluamVjdGFibGUsIGluamVjdGlvblRva2VuKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgcmVnaXN0ZXJUaHJvdWdoUGlwZWxpbmUgPSBpbmplY3RhYmxlID0+IHtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgICAgICAgdGFyZ2V0OiBpbmplY3RhYmxlLFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBzb3VyY2UsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUsIGNvbnRleHQpO1xuICAgICAgICByZWdpc3RlcmVkSW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgd2FzUmVnaXN0ZXJlZFRoaXNJbmplY3RhYmxlID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGJvdW5kUmVnaXN0ZXJTaW5nbGUgPSBpbmogPT4ge1xuICAgICAgICByZWdpc3RlclNpbmdsZShpbmosIGNvbnRleHQpO1xuICAgICAgICB3YXNSZWdpc3RlcmVkVGhpc0luamVjdGFibGUgPSB0cnVlO1xuXG4gICAgICAgIGlmICghYmF0Y2hJblByb2dyZXNzKSB7XG4gICAgICAgICAgZmlyZUNhbGxiYWNrc0ZvcihpbmopO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBkZWNvcmF0ZWRSZWdpc3RlciA9IGZsb3coLi4uZGVjb3JhdG9ycykoYm91bmRSZWdpc3RlclNpbmdsZSk7XG5cbiAgICAgIGRlY29yYXRlZFJlZ2lzdGVyKGluamVjdGFibGUpO1xuXG4gICAgICBpZiAod2FzUmVnaXN0ZXJlZFRoaXNJbmplY3RhYmxlKSB7XG4gICAgICAgIHJlZ2lzdGVyZWRJbmplY3RhYmxlcy5wdXNoKGluamVjdGFibGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwaGFzZTBJbmplY3RhYmxlcy5mb3JFYWNoKHJlZ2lzdGVyVGhyb3VnaFBpcGVsaW5lKTtcbiAgICBwaGFzZTJJbmplY3RhYmxlcy5mb3JFYWNoKHJlZ2lzdGVyVGhyb3VnaFBpcGVsaW5lKTtcblxuICAgIGJhdGNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gaW5qZWN0TWFueSh7XG4gICAgICBhbGlhczogcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICB9KTtcblxuICAgIC8vIFNraXAgdGhlIHBlci1pbmplY3RhYmxlIGZvckVhY2ggbG9vcCBlbnRpcmVseSB3aGVuIG5vIHJlZ2lzdHJhdGlvblxuICAgIC8vIGNhbGxiYWNrcyBhcmUgd2lyZWQgdXAgXHUyMDE0IHRoaXMgYXZvaWRzIDMwaysgdHJpdmlhbCBmdW5jdGlvbiBjYWxsc1xuICAgIC8vIGR1cmluZyBhIDMway1pbmplY3RhYmxlIGJvb3RzdHJhcCB3aXRoIG5vIGNhbGxiYWNrcyAodGhlIHBlcmYtdGVzdFxuICAgIC8vIGNhc2UgYW5kIHRoZSBjb21tb24gY2FzZSkuXG4gICAgaWYgKGNhbGxiYWNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJlQmF0Y2hDYWxsYmFja3MgPSBpbmplY3RhYmxlID0+IHtcbiAgICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlKTtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjYWxsYmFja3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2pdKGluamVjdGFibGUsIGluamVjdGlvblRva2VuKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVnaXN0ZXJlZFJlZ2lzdHJhdGlvbkRlY29yYXRvckluamVjdGFibGVzLmZvckVhY2goZmlyZUJhdGNoQ2FsbGJhY2tzKTtcbiAgICByZWdpc3RlcmVkSW5qZWN0YWJsZXMuZm9yRWFjaChmaXJlQmF0Y2hDYWxsYmFja3MpO1xuICB9O1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJTaW5nbGVGb3IgPSAoe1xuICBpbmplY3RhYmxlU2V0LFxuICBpbmplY3RhYmxlSWRTZXQsXG4gIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxuICBjaGlsZHJlbkJ5UGFyZW50TWFwLFxuICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gIHJlc29sdmVJbmplY3Rpb25Ub2tlbk9mLFxuICBnZXRJbmplY3Rpb25Ub2tlbk9mLFxufSkgPT4ge1xuICBjb25zdCBnZXROYW1lc3BhY2VkSWQgPSBnZXROYW1lc3BhY2VkSWRGb3IoaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQpO1xuXG4gIHJldHVybiAoaW5qZWN0YWJsZSwgaW5qZWN0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGluamVjdGFibGVJZCA9IGluamVjdGFibGUuaWQ7XG5cbiAgICBpZiAoIWluamVjdGFibGVJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byByZWdpc3RlciBpbmplY3RhYmxlIHdpdGhvdXQgSUQuJyk7XG4gICAgfVxuXG4gICAgLy8gQSByZWdpc3RyYXRpb24gZGVjb3JhdG9yIG1heSBoYW5kIGluIGFuIGluamVjdGFibGUgdGhlIGJhdGNoIG5ldmVyIHNhdyxcbiAgICAvLyBzbyB0aGUgdG9rZW4gaXMgcmVzb2x2ZWQgaGVyZSB0b287IHJlc29sdmluZyB0d2ljZSBpcyBoYXJtbGVzcy5cbiAgICByZXNvbHZlSW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlLCBpbmplY3Rpb25Db250ZXh0KTtcblxuICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlKTtcblxuICAgIC8vIEJ1aWxkIHJldmVyc2UgaW5kZXg6IGZvciBlYWNoIHBhcmVudCBpbiB0aGUgY29udGV4dCwgcmVjb3JkIHRoaXMgaW5qZWN0YWJsZSBhcyBhIGNoaWxkLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5qZWN0aW9uQ29udGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGFyZW50ID0gaW5qZWN0aW9uQ29udGV4dFtpXS5pbmplY3RhYmxlO1xuICAgICAgbGV0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudE1hcC5nZXQocGFyZW50KTtcblxuICAgICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgICBjaGlsZHJlbiA9IG5ldyBTZXQoKTtcbiAgICAgICAgY2hpbGRyZW5CeVBhcmVudE1hcC5zZXQocGFyZW50LCBjaGlsZHJlbik7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkcmVuLmFkZChpbmplY3RhYmxlKTtcbiAgICB9XG5cbiAgICAvLyBGYXN0IHBhdGg6IGNvbnRhaW5lci1sZXZlbCByZWdpc3RyYXRpb24gKHRoZSBkb21pbmFudCBjYXNlKSB5aWVsZHMgYVxuICAgIC8vIG5hbWVzcGFjZWQgaWQgZXF1YWwgdG8gdGhlIGJhcmUgaWQgXHUyMDE0IHNraXAgdGhlIE1hcCByb3VuZHRyaXAgKyBwYXJlbnRcbiAgICAvLyB3YWxrIGluc2lkZSBnZXROYW1lc3BhY2VkSWQsIGFuZCBza2lwIHJlY29yZGluZyB0aGUgcmVnaXN0cmF0aW9uXG4gICAgLy8gY29udGV4dCBhbHRvZ2V0aGVyIChgZ2V0TmFtZXNwYWNlZElkRm9yYCBhbmQgYGRlcmVnaXN0ZXJgIGJvdGggdHJlYXRcbiAgICAvLyBhIG1pc3NpbmcgZW50cnkgYXMgXCJubyBuZXN0ZWQgY29udGV4dFwiIGFscmVhZHkpLlxuICAgIGNvbnN0IGltbWVkaWF0ZVBhcmVudCA9XG4gICAgICBpbmplY3Rpb25Db250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgPyBpbmplY3Rpb25Db250ZXh0W2luamVjdGlvbkNvbnRleHQubGVuZ3RoIC0gMV1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBpc0NvbnRhaW5lckxldmVsID1cbiAgICAgICFpbW1lZGlhdGVQYXJlbnQgfHwgaW1tZWRpYXRlUGFyZW50LmluamVjdGFibGUuYWxpYXNUeXBlID09PSAnY29udGFpbmVyJztcblxuICAgIGlmICghaXNDb250YWluZXJMZXZlbCkge1xuICAgICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQuc2V0KGluamVjdGFibGUsIGluamVjdGlvbkNvbnRleHQpO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWVzcGFjZWRJZCA9IGlzQ29udGFpbmVyTGV2ZWxcbiAgICAgID8gaW5qZWN0YWJsZUlkXG4gICAgICA6IGdldE5hbWVzcGFjZWRJZChpbmplY3RhYmxlKTtcblxuICAgIGlmIChuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuaGFzKGluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byByZWdpc3RlciBzYW1lIGluamVjdGFibGUgbXVsdGlwbGUgdGltZXM6IFwiJHtuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KFxuICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICl9XCJgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaW5qZWN0YWJsZUlkU2V0LmhhcyhuYW1lc3BhY2VkSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byByZWdpc3RlciBtdWx0aXBsZSBpbmplY3RhYmxlcyBmb3IgSUQgXCIke25hbWVzcGFjZWRJZH1cImAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHVwcGVyQm91bmRlZENhcmRpbmFsaXR5ID1cbiAgICAgIGluamVjdGlvblRva2VuPy5jYXJkaW5hbGl0eSA9PT0gJ29uZScgfHxcbiAgICAgIGluamVjdGlvblRva2VuPy5jYXJkaW5hbGl0eSA9PT0gJ3plcm8tb3Itb25lJ1xuICAgICAgICA/IGluamVjdGlvblRva2VuLmNhcmRpbmFsaXR5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKHVwcGVyQm91bmRlZENhcmRpbmFsaXR5KSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGluamVjdGlvblRva2VuO1xuICAgICAgY29uc3QgcmVnaXN0ZXJlZCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQodG9rZW4pO1xuXG4gICAgICBpZiAocmVnaXN0ZXJlZCkge1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiByZWdpc3RlcmVkKSB7XG4gICAgICAgICAgLy8gRXhhY3QgcmVnaXN0cmF0aW9ucyBvbmx5OiB0aGUgaW5kZXggYWxzbyBob2xkcyBgLmZvcigpYFxuICAgICAgICAgIC8vIGRlc2NlbmRhbnRzIG9mIHRoZSB0b2tlbiwgYW5kIHNwZWNpYWxpemF0aW9uIG11c3Qgbm90IGJlXG4gICAgICAgICAgLy8gb3V0bGF3ZWQgYnkgdGhlIGJhc2UgdG9rZW4ncyBib3VuZC5cbiAgICAgICAgICBpZiAoZ2V0SW5qZWN0aW9uVG9rZW5PZihtZW1iZXIpID09PSB0b2tlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgaW5qZWN0YWJsZSBcIiR7bmFtZXNwYWNlZElkfVwiIHdpdGggaW5qZWN0aW9uIHRva2VuIFwiJHtcbiAgICAgICAgICAgICAgICB0b2tlbi5pZFxuICAgICAgICAgICAgICB9XCIsIGJ1dCBpdHMgY2FyZGluYWxpdHkgXCIke3VwcGVyQm91bmRlZENhcmRpbmFsaXR5fVwiIGFsbG93cyBhdCBtb3N0IG9uZSByZWdpc3RyYXRpb24gYW5kIFwiJHtuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KFxuICAgICAgICAgICAgICAgIG1lbWJlcixcbiAgICAgICAgICAgICAgKX1cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5qZWN0YWJsZUlkU2V0LmFkZChuYW1lc3BhY2VkSWQpO1xuICAgIGluamVjdGFibGVTZXQuYWRkKGluamVjdGFibGUpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5zZXQoaW5qZWN0YWJsZSwgbmFtZXNwYWNlZElkKTtcbiAgICBpZiAoaW5qZWN0aW9uVG9rZW4/LmFic3RyYWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byByZWdpc3RlciBpbmplY3RhYmxlIFwiJHtuYW1lc3BhY2VkSWR9XCIgd2l0aCBpbmplY3Rpb24gdG9rZW4gXCIke2luamVjdGlvblRva2VuLmlkfVwiLCBidXQgaXQgaXMgYWJzdHJhY3QuIFVzZSBcIi5mb3Ioc3BlY2lmaWVyKVwiIGZvciBhIGNvbmNyZXRlIHRva2VuLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1heENhY2hlU2l6ZSA9IGluamVjdGFibGUubWF4Q2FjaGVTaXplID8/IGluamVjdGlvblRva2VuPy5tYXhDYWNoZVNpemU7XG5cbiAgICAvLyBMUlUgaXMgb25seSBtZWFuaW5nZnVsIGZvciBrZXllZCBsaWZlY3ljbGVzIFx1MjAxNCBzaW5nbGV0b25zIGhvbGQgb25lXG4gICAgLy8gaW5zdGFuY2UgYW5kIHdvdWxkIG5ldmVyIG92ZXJmbG93LiBGb3Iga2V5ZWQgbGlmZWN5Y2xlcyB3aXRoIGEgc2l6ZVxuICAgIC8vIGNhcCwgYWxsb2NhdGUgZWFnZXJseSBzbyB0aGUgZXZpY3Rpb24gY2FsbGJhY2sgaXMgd2lyZWQgYmVmb3JlIGFueVxuICAgIC8vIHN0b3JlLiBGb3IgZXZlcnl0aGluZyBlbHNlLCB0aGUgbWFwIGlzIGFsbG9jYXRlZCBsYXppbHkgb24gZmlyc3RcbiAgICAvLyBzdG9yZSAoc2luZ2xldG9ucyBzdG9yZSB0aGUgaW5zdGFuY2UgZGlyZWN0bHk7IGtleWVkU2luZ2xldG9uIHN0b3Jlc1xuICAgIC8vIGEgQ29tcG9zaXRlTWFwIFx1MjAxNCBzZWUgcHJpdmF0ZUluamVjdEZvci5qcykuXG4gICAgaWYgKG1heENhY2hlU2l6ZSA+IDAgJiYgaW5qZWN0YWJsZS5saWZlY3ljbGUuaWQgIT09ICdzaW5nbGV0b24nKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZU1hcCA9IG5ldyBMcnVDb21wb3NpdGVNYXAobWF4Q2FjaGVTaXplLCB7XG4gICAgICAgIG9uRXZpY3Q6IChpbnN0YW5jZSwga2V5QXJyYXkpID0+XG4gICAgICAgICAgZmlyZVB1cmdlQ2FsbGJhY2tzKGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSksXG4gICAgICB9KTtcblxuICAgICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLnNldChpbmplY3RhYmxlLCBpbnN0YW5jZU1hcCk7XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5zID0gZ2V0UmVsYXRlZFRva2VucyhpbmplY3Rpb25Ub2tlbik7XG5cbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykge1xuICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbdF07XG4gICAgICBsZXQgaW5qZWN0YWJsZXNTZXQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KHRva2VuKTtcblxuICAgICAgaWYgKCFpbmplY3RhYmxlc1NldCkge1xuICAgICAgICBpbmplY3RhYmxlc1NldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLnNldCh0b2tlbiwgaW5qZWN0YWJsZXNTZXQpO1xuICAgICAgfVxuXG4gICAgICBpbmplY3RhYmxlc1NldC5hZGQoaW5qZWN0YWJsZSk7XG4gICAgICBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUoaW5qZWN0YWJsZXNTZXQpO1xuICAgIH1cbiAgfTtcbn07XG4iLCAiaW1wb3J0IHsgc3RvcmVkSW5zdGFuY2VLZXkgfSBmcm9tICcuL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgaXNDb21wb3NpdGVTdG9yYWdlIH0gZnJvbSAnLi9wcml2YXRlSW5qZWN0Rm9yJztcblxuY29uc3Qgc2luZ2xldG9uS2V5QXJyYXkgPSBbc3RvcmVkSW5zdGFuY2VLZXldO1xuXG5jb25zdCBrZXlBcnJheVN0YXJ0c1dpdGggPSAoa2V5QXJyYXksIHByZWZpeCkgPT4ge1xuICBpZiAocHJlZml4Lmxlbmd0aCA+IGtleUFycmF5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChrZXlBcnJheVtpXSAhPT0gcHJlZml4W2ldKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5jb25zdCBldmljdCA9IChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGluamVjdGFibGVzSW5TY29wZSwga2V5UGFydHMpID0+IHtcbiAgZm9yIChjb25zdCBpbmplY3RhYmxlIG9mIGluamVjdGFibGVzSW5TY29wZSkge1xuICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG4gICAgaWYgKHN0b3JlZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICghaXNDb21wb3NpdGVTdG9yYWdlKHN0b3JlZCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAga2V5UGFydHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIGtleUFycmF5U3RhcnRzV2l0aChzaW5nbGV0b25LZXlBcnJheSwga2V5UGFydHMpXG4gICAgICApIHtcbiAgICAgICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChrZXlQYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHN0b3JlZC5jbGVhcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZWQuZGVsZXRlQnlQcmVmaXgoa2V5UGFydHMpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gUHVyZ2VzIHRoZSBzdG9yZWQgaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gc2V0IG9mIGluamVjdGFibGVzLiBTaGFyZWQgYnkgdGhlXG4vLyBjb250YWluZXItd2lkZSBwdXJnZSBhbmQgdGhlIHNjb3BlLXJlc3RyaWN0ZWQgb25lLCBzbyB0aGF0IGJvdGggZmlyZVxuLy8gaW5zdGFuY2UtcHVyZ2UgY2FsbGJhY2tzIHRoZSBzYW1lIHdheS5cbmV4cG9ydCBjb25zdCBwdXJnZVN0b3JlZEluc3RhbmNlc0ZvciA9XG4gICh7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pID0+XG4gIChpbmplY3RhYmxlc0luU2NvcGUsIGtleVBhcnRzKSA9PiB7XG4gICAgLy8gTm90aGluZyBjYW4gb2JzZXJ2ZSB0aGlzIHB1cmdlLCBzbyBza2lwIGdhdGhlcmluZyB0aGUgc25hcHNob3QgYW5kIGdvXG4gICAgLy8gc3RyYWlnaHQgdG8gZXZpY3Rpb24gXHUyMDE0IHRoZSBzYW1lIHJ1bGUgdGhlIGluamVjdCB3aXJpbmcgZm9sbG93cywgd2hlcmUgYVxuICAgIC8vIGNvbnRhaW5lciB3aXRoIG5vIGRlY29yYXRvcnMgcGF5cyBmb3Igbm9uZS5cbiAgICBpZiAoIWFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCgpKSB7XG4gICAgICBldmljdChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGluamVjdGFibGVzSW5TY29wZSwga2V5UGFydHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFBoYXNlIDEgXHUyMDE0IEdhdGhlciBzbmFwc2hvdCB0dXBsZXMgd2l0aG91dCBtdXRhdGluZyBjYWNoZXMuIFRoZSBzdG9yZWRcbiAgICAvLyB2YWx1ZSBpcyBkaXNwYXRjaGVkIHN0cnVjdHVyYWxseTogYSBDb21wb3NpdGVNYXAtc2hhcGUgc3RvcmVzIGtleWVkXG4gICAgLy8gZW50cmllczsgYW55dGhpbmcgZWxzZSBpcyBhIGRpcmVjdGx5LXN0b3JlZCBpbnN0YW5jZSAoc2luZ2xldG9uIG9yXG4gICAgLy8gdjItZGVmYXVsdC1uby1hcmdzKS5cbiAgICBjb25zdCB0dXBsZXMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgaW5qZWN0YWJsZSBvZiBpbmplY3RhYmxlc0luU2NvcGUpIHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG4gICAgICBpZiAoc3RvcmVkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoIWlzQ29tcG9zaXRlU3RvcmFnZShzdG9yZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXlQYXJ0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgIWtleUFycmF5U3RhcnRzV2l0aChzaW5nbGV0b25LZXlBcnJheSwga2V5UGFydHMpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHR1cGxlcy5wdXNoKHtcbiAgICAgICAgICBpbmplY3RhYmxlLFxuICAgICAgICAgIGluc3RhbmNlOiBzdG9yZWQsXG4gICAgICAgICAga2V5QXJyYXk6IHNpbmdsZXRvbktleUFycmF5LFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgW2tleUFycmF5LCBpbnN0YW5jZV0gb2Ygc3RvcmVkLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoa2V5UGFydHMubGVuZ3RoID4gMCAmJiAha2V5QXJyYXlTdGFydHNXaXRoKGtleUFycmF5LCBrZXlQYXJ0cykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0dXBsZXMucHVzaCh7IGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQaGFzZSAyIFx1MjAxNCBGaXJlIGNhbGxiYWNrcy4gQ2FjaGVzIHN0YXkgcG9wdWxhdGVkIHNvIHBlZXItY29vcmRpbmF0aW9uXG4gICAgLy8gaW5zaWRlIGEgY2FsbGJhY2sgd29ya3MgKGBkaS5pbmplY3QocGVlcilgIHJldHVybnMgdGhlIGNhY2hlZCBpbnN0YW5jZSkuXG4gICAgZm9yIChjb25zdCB7IGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSB9IG9mIHR1cGxlcykge1xuICAgICAgZmlyZVB1cmdlQ2FsbGJhY2tzKGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSk7XG4gICAgfVxuXG4gICAgLy8gUGhhc2UgMyBcdTIwMTQgRXZpY3QuIFN3ZWVwcyBib3RoIHRoZSBvcmlnaW5hbCBzbmFwc2hvdCBlbnRyaWVzIGFuZCBhbnl0aGluZ1xuICAgIC8vIHJlLXBvcHVsYXRlZCBieSBwaGFzZSAyIGNhbGxiYWNrcy4gQ2FsbGJhY2tzIGRvIE5PVCByZS1maXJlIGhlcmUuXG4gICAgZXZpY3QoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBpbmplY3RhYmxlc0luU2NvcGUsIGtleVBhcnRzKTtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IHB1cmdlSW5zdGFuY2VzRm9yID0gKHtcbiAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxufSkgPT4ge1xuICBjb25zdCBwdXJnZVN0b3JlZEluc3RhbmNlcyA9IHB1cmdlU3RvcmVkSW5zdGFuY2VzRm9yKHtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZmlyZVB1cmdlQ2FsbGJhY2tzLFxuICAgIGFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCxcbiAgfSk7XG5cbiAgcmV0dXJuIChhbGlhcywgLi4ua2V5UGFydHMpID0+XG4gICAgcHVyZ2VTdG9yZWRJbnN0YW5jZXMoXG4gICAgICBhbGlhcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gWy4uLmluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5rZXlzKCldXG4gICAgICAgIDogZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKSxcbiAgICAgIGtleVBhcnRzLFxuICAgICk7XG59O1xuIiwgImltcG9ydCB7XG4gIGRlcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgZGVyZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIHByZUluamVjdENhbGxiYWNrVG9rZW4sXG59IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB0b0ZsYXRJbmplY3RhYmxlcyBmcm9tICcuL3RvRmxhdEluamVjdGFibGVzJztcbmltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0UmVsYXRlZFRva2VucywgaXNSZWxhdGVkVG9Ub2tlbiB9IGZyb20gJy4vZ2V0UmVsYXRlZFRva2Vucyc7XG5pbXBvcnQgeyBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUgfSBmcm9tICcuL2dldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcic7XG5pbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0ZXJGb3IgPVxuICAoe1xuICAgIGluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAvLyBUb2RvOiBnZXQgcmlkIG9mIGZ1bmN0aW9uIHVzYWdlLlxuICAgIGdldERpLFxuICAgIGRlY29yYXRvckNhY2hlLFxuICAgIHN5bmNJbmplY3RXaXJpbmcsXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgICBmb3JnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICB9KSA9PlxuICAoeyBpbmplY3RhYmxlcywgY29udGV4dCwgc291cmNlIH0pID0+IHtcbiAgICAvLyBDb2xsZWN0IGNhbGxiYWNrcyBmaXJzdCAod2hpbGUgYWxsIGluamVjdGFibGVzIGFyZSBzdGlsbCByZWdpc3RlcmVkKVxuICAgIGNvbnN0IGNhbGxiYWNrcyA9IGluamVjdE1hbnkoe1xuICAgICAgYWxpYXM6IGRlcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGZsYXRJbmplY3RhYmxlcyA9IHRvRmxhdEluamVjdGFibGVzKGluamVjdGFibGVzKTtcblxuICAgIC8vIEZpcmUgY2FsbGJhY2tzIGZvciBhbGwgaW5qZWN0YWJsZXMgYmVpbmcgZGVyZWdpc3RlcmVkIChvcmlnaW5hbCBiYXRjaCBzZW1hbnRpY3MpLFxuICAgIC8vIGVhY2ggd2l0aCB0aGUgdG9rZW4gaXQgd2FzIHJlZ2lzdGVyZWQgdW5kZXIuXG4gICAgZmxhdEluamVjdGFibGVzLmZvckVhY2goaW5qZWN0YWJsZSA9PiB7XG4gICAgICBjb25zdCBpbmplY3Rpb25Ub2tlbiA9IGdldEluamVjdGlvblRva2VuT2YoaW5qZWN0YWJsZSk7XG5cbiAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IHtcbiAgICAgICAgY2FsbGJhY2soaW5qZWN0YWJsZSwgaW5qZWN0aW9uVG9rZW4pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBkaSA9IGdldERpKCk7XG5cbiAgICBjb25zdCBkZXJlZ2lzdGVyU2luZ2xlID0gZGVyZWdpc3RlclNpbmdsZUZvcih7XG4gICAgICBpbmplY3RhYmxlU2V0LFxuICAgICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQsXG4gICAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgICBwdXJnZUluc3RhbmNlcyxcbiAgICAgIGluamVjdGFibGVJZFNldCxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAsXG4gICAgICBkaSxcbiAgICAgIGdldEluamVjdGlvblRva2VuT2YsXG4gICAgICBmb3JnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICAgIH0pO1xuXG4gICAgbGV0IGluamVjdFdpcmluZ0NoYW5nZWQgPSBmYWxzZTtcblxuICAgIGZsYXRJbmplY3RhYmxlcy5mb3JFYWNoKGluamVjdGFibGUgPT4ge1xuICAgICAgY29uc3QgaW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbk9mKGluamVjdGFibGUpO1xuXG4gICAgICBpZiAoaXNSZWxhdGVkVG9Ub2tlbihpbmplY3Rpb25Ub2tlbiwgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4pKSB7XG4gICAgICAgIGRlY29yYXRvckNhY2hlLmluamVjdGlvbiA9IG51bGw7XG4gICAgICAgIGluamVjdFdpcmluZ0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZWxhdGVkVG9Ub2tlbihpbmplY3Rpb25Ub2tlbiwgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbikpIHtcbiAgICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0ID0gbnVsbDtcbiAgICAgICAgaW5qZWN0V2lyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiBkZXJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuLFxuICAgICAgICB0YXJnZXQ6IGluamVjdGFibGUsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVjb3JhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVyZWdpc3RlclNpbmdsZShpbmplY3RhYmxlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWNvcmF0ZWREZXJlZ2lzdGVyID0gZmxvdyguLi5kZWNvcmF0b3JzKShkZXJlZ2lzdGVyU2luZ2xlKTtcblxuICAgICAgZGVjb3JhdGVkRGVyZWdpc3RlcihpbmplY3RhYmxlKTtcbiAgICB9KTtcblxuICAgIC8vIFJlY29tcHV0ZWQgZnJvbSB0aGUgcmVnaXN0cmF0aW9uIGluZGV4IGFmdGVyIHRoZSByZW1vdmFscywgc28gYVxuICAgIC8vIGRlcmVnaXN0cmF0aW9uIGRlY29yYXRvciB0aGF0IHByZXZlbnRlZCB0aGUgcmVtb3ZhbCBpcyBoYW5kbGVkIHRvby5cbiAgICBpZiAoaW5qZWN0V2lyaW5nQ2hhbmdlZCkge1xuICAgICAgc3luY0luamVjdFdpcmluZygpO1xuICAgIH1cbiAgfTtcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0ZXJTaW5nbGVGb3IgPVxuICAoe1xuICAgIGluamVjdGFibGVTZXQsXG4gICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQsXG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBwdXJnZUluc3RhbmNlcyxcbiAgICBpbmplY3RhYmxlSWRTZXQsXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAsXG4gICAgZGksXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgICBmb3JnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICB9KSA9PlxuICBpbmplY3RhYmxlID0+IHtcbiAgICBpZiAoaXNJbmplY3Rpb25Ub2tlbihpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gZGVyZWdpc3RlciB1c2luZyBpbmplY3Rpb24gdG9rZW4gXCIke2luamVjdGFibGUuaWR9XCIsIGJ1dCBkZXJlZ2lzdHJhdGlvbiB1c2luZyB0b2tlbiBpcyBpbGxlZ2FsLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghaW5qZWN0YWJsZVNldC5oYXMoaW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGRlcmVnaXN0ZXIgbm9uLXJlZ2lzdGVyZWQgaW5qZWN0YWJsZSBcIiR7aW5qZWN0YWJsZS5pZH1cIi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDYXNjYWRlIGRlcmVnaXN0ZXIgY2hpbGRyZW4gdXNpbmcgdGhlIHJldmVyc2UgaW5kZXggKE8oMSkgbG9va3VwKS5cbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnRNYXAuZ2V0KGluamVjdGFibGUpO1xuXG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQuZGVsZXRlKGNoaWxkKTtcblxuICAgICAgICBpZiAoaW5qZWN0YWJsZVNldC5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgZGkuZGVyZWdpc3Rlcih7XG4gICAgICAgICAgICBpbmplY3RhYmxlczogW2NoaWxkXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAuZGVsZXRlKGluamVjdGFibGUpO1xuICAgIH1cblxuICAgIHB1cmdlSW5zdGFuY2VzKGluamVjdGFibGUpO1xuICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICBjb25zdCBuYW1lc3BhY2VkSWQgPSBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KGluamVjdGFibGUpO1xuICAgIGluamVjdGFibGVJZFNldC5kZWxldGUobmFtZXNwYWNlZElkKTtcbiAgICBpbmplY3RhYmxlU2V0LmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZGVsZXRlKGluamVjdGFibGUpO1xuXG4gICAgY29uc3QgdG9rZW5zID0gZ2V0UmVsYXRlZFRva2VucyhnZXRJbmplY3Rpb25Ub2tlbk9mKGluamVjdGFibGUpKTtcblxuICAgIHRva2Vucy5mb3JFYWNoKHRva2VuID0+IHtcbiAgICAgIGNvbnN0IHRva2VuU2V0ID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldCh0b2tlbik7XG4gICAgICB0b2tlblNldC5kZWxldGUoaW5qZWN0YWJsZSk7XG4gICAgICBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUodG9rZW5TZXQpO1xuICAgIH0pO1xuXG4gICAgLy8gUmVzb2x2ZWQgcGVyIHJlZ2lzdHJhdGlvbiwgc28gYSBsYXRlciByZWdpc3RyYXRpb24sIGluIGFub3RoZXIgc2NvcGUsXG4gICAgLy8gcmVzb2x2ZXMgYWZyZXNoLlxuICAgIGZvcmdldEluamVjdGlvblRva2VuT2YoaW5qZWN0YWJsZSk7XG5cbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuZGVsZXRlKGluamVjdGFibGUpO1xuICB9O1xuIiwgImV4cG9ydCBjb25zdCBvdmVycmlkZUZvciA9XG4gICh7IGdldFJlbGF0ZWRJbmplY3RhYmxlcywgZWFybHlPdmVycmlkZSB9KSA9PlxuICAoYWxpYXMsIGluc3RhbnRpYXRlU3R1YikgPT4ge1xuICAgIGNvbnN0IHJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGFsaWFzLmFsaWFzVHlwZSA9PT0gJ2luamVjdGlvbi10b2tlbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUcmllZCB0byBvdmVycmlkZSBzaW5nbGUgaW1wbGVtZW50YXRpb24gb2YgaW5qZWN0aW9uIHRva2VuIFwiJHthbGlhcy5pZH1cIiwgYnV0IGZvdW5kIG5vIHJlZ2lzdGVyZWQgaW1wbGVtZW50YXRpb25zLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIFwiJHthbGlhcy5pZH1cIiB3aGljaCBpcyBub3QgcmVnaXN0ZXJlZC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBlYXJseU92ZXJyaWRlKGFsaWFzLCBpbnN0YW50aWF0ZVN0dWIpO1xuICB9O1xuXG5leHBvcnQgY29uc3QgdW5vdmVycmlkZUZvciA9XG4gICh7IG92ZXJyaWRpbmdJbmplY3RhYmxlcywgZ2V0UmVsYXRlZEluamVjdGFibGVzLCBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgYWxpYXMgPT4ge1xuICAgIGNvbnN0IFtpbmplY3RhYmxlXSA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICBpZiAoIWluamVjdGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIHVub3ZlcnJpZGUgXCIke2FsaWFzLmlkfVwiLCBidXQgaXQgd2FzIG5vdCByZWdpc3RlcmVkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghb3ZlcnJpZGluZ0luamVjdGFibGVzLmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gdW5vdmVycmlkZSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdCB3YXMgbm90IG92ZXJyaWRkZW4uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JOb01hdGNoZXNGb3IgPVxuICAoeyBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKHJlbGF0ZWRJbmplY3RhYmxlcywgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IG5vbi1yZWdpc3RlcmVkIGluamVjdGFibGUgXCIke1xuICAgICAgICAgIGFsaWFzLmlkXG4gICAgICAgIH1cIiBmcm9tIFwiJHtnZXROYW1lc3BhY2VkSWQoaW5qZWN0aW5nSW5qZWN0YWJsZSl9XCIuYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0ZvclRvb01hbnlNYXRjaGVzRm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gIChyZWxhdGVkSW5qZWN0YWJsZXMsIGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKSA9PiB7XG4gICAgaWYgKHJlbGF0ZWRJbmplY3RhYmxlcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3Qgc2luZ2xlIGluamVjdGFibGUgZm9yIGluamVjdGlvbiB0b2tlbiBcIiR7XG4gICAgICAgICAgYWxpYXMuaWRcbiAgICAgICAgfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiIGJ1dCBmb3VuZCBtdWx0aXBsZSBpbmplY3RhYmxlczogXCIke3JlbGF0ZWRJbmplY3RhYmxlc1xuICAgICAgICAgIC5tYXAoZ2V0TmFtZXNwYWNlZElkKVxuICAgICAgICAgIC5qb2luKCdcIiwgXCInKX1cImAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JTaWRlRWZmZWN0c0ZvciA9XG4gICh7IGdldFNpZGVFZmZlY3RzQXJlUHJldmVudGVkLCBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKGluamVjdGFibGUsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAoZ2V0U2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQoaW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGluamVjdCBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICl9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIgd2hlbiBzaWRlLWVmZmVjdHMgYXJlIHByZXZlbnRlZC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4iLCAiZXhwb3J0IGNvbnN0IGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvciA9XG4gICh7IGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAoYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAoYWxpYXMuYWJzdHJhY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGluamVjdCBpbmplY3Rpb24gdG9rZW4gXCIke2FsaWFzLmlkfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaXQgaXMgYWJzdHJhY3QuIFVzZSBcIi5mb3Ioc3BlY2lmaWVyKVwiIGZvciBhIGNvbmNyZXRlIHRva2VuLmAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gIChhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChhbGlhcy5jYXJkaW5hbGl0eSAhPT0gJ3plcm8tb3Itb25lJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0TWF5YmUgXCIke2FsaWFzLmlkfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaXRzIGNhcmRpbmFsaXR5IGlzIFwiJHtcbiAgICAgICAgICBhbGlhcy5jYXJkaW5hbGl0eVxuICAgICAgICB9XCIgaW5zdGVhZCBvZiBcInplcm8tb3Itb25lXCIuYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImltcG9ydCBpc0luamVjdGFibGUgZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZS9pc0luamVjdGFibGUnO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5cbi8vIERlY2xhcmVkIHNldHMgYXJlIGRlcml2ZWQgb25jZSBwZXIgaW5qZWN0YWJsZTogYSBgY29uc3VtcHRpb25zYCBhcnJheSBpc1xuLy8gZml4ZWQgYXQgY3JlYXRpb24sIGFuZCBpbmplY3RhYmxlIGlkZW50aXR5IG91dGxpdmVzIGFueSBzaW5nbGUgY29udGFpbmVyLlxuY29uc3QgZGVjbGFyZWRTZXRzQnlJbmplY3RhYmxlID0gbmV3IFdlYWtNYXAoKTtcblxuY29uc3QgZ2V0RGVjbGFyZWRTZXQgPSBpbmplY3RhYmxlID0+IHtcbiAgbGV0IGRlY2xhcmVkID0gZGVjbGFyZWRTZXRzQnlJbmplY3RhYmxlLmdldChpbmplY3RhYmxlKTtcblxuICBpZiAoIWRlY2xhcmVkKSB7XG4gICAgZGVjbGFyZWQgPSBuZXcgU2V0KGluamVjdGFibGUuY29uc3VtcHRpb25zID8/IFtdKTtcbiAgICBkZWNsYXJlZFNldHNCeUluamVjdGFibGUuc2V0KGluamVjdGFibGUsIGRlY2xhcmVkKTtcbiAgfVxuXG4gIHJldHVybiBkZWNsYXJlZDtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbkZvciA9XG4gICh7IGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAoeyBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgLy8gT25seSBpbmplY3RhYmxlMiBkZWNsYXJlcyBjb25zdW1wdGlvbnMuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBleGVtcHQgYnlcbiAgICAvLyB0aGlzIG9uZSBjaGVjazogdGhlIGNvbnRhaW5lciByb290LCB2MSBpbmplY3RhYmxlcywgYW5kIHRoZSB0b2tlbiB0aGF0XG4gICAgLy8gc3RhbmRzIGluIGFzIHRoZSBpbmplY3RpbmcgcGFydHkgZm9yIGluamVjdE1hbnkncyBlbGVtZW50IGluamVjdHMuXG4gICAgaWYgKGluamVjdGluZ0luamVjdGFibGUuYWxpYXNUeXBlICE9PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluamVjdGluZyBhbiBpbmplY3RhYmxlIGJ5IHJlZmVyZW5jZSBhbHJlYWR5IGltcGxpZXMgYSBkZXBlbmRlbmN5IG9uXG4gICAgLy8gd2hhdGV2ZXIgcGFja2FnZSBpdCBsaXZlcyBpbiwgc28gb25seSB0b2tlbnMgYXJlIGRlY2xhcmVkLlxuICAgIGlmIChpc0luamVjdGFibGUoYWxpYXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVjbGFyZWQgPSBnZXREZWNsYXJlZFNldChpbmplY3RpbmdJbmplY3RhYmxlKTtcblxuICAgIC8vIERlY2xhcmluZyBhIGdlbmVyYWwgdG9rZW4gY292ZXJzIGV2ZXJ5IGAuZm9yKClgIGRlcml2YXRpdmUgb2YgaXQsIHdoaWNoXG4gICAgLy8gaXMgd2hhdCBtYWtlcyBydW50aW1lIHNwZWNpZmllcnMgZGVjbGFyYWJsZSBhdCBhbGwuIFRoZSB3YWxrIGlzIHVwd2FyZHNcbiAgICAvLyBvbmx5OiBkZWNsYXJpbmcgYSBzcGVjaWZpYyB0b2tlbiBkb2VzIG5vdCBjb3ZlciBpdHMgZ2VuZXJhbCB0b2tlbi5cbiAgICBsZXQgY2FuZGlkYXRlID0gYWxpYXM7XG5cbiAgICB3aGlsZSAoY2FuZGlkYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChkZWNsYXJlZC5oYXMoY2FuZGlkYXRlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5zcGVjaWZpY1Rva2VuT2Y7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRyaWVkIHRvIGluamVjdCBcIiR7YWxpYXMuaWR9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgKX1cIiwgYnV0IGl0IGlzIG5vdCBhIGRlY2xhcmVkIGNvbnN1bXB0aW9uLmAsXG4gICAgKTtcbiAgfTtcbiIsICJpbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcblxuY29uc3QgaXNUb2tlbjIgPSBhbGlhcyA9PiBhbGlhcy5hbGlhc1R5cGUgPT09ICdpbmplY3Rpb24tdG9rZW4yJztcblxuLy8gUmVhZC1vbmx5OiByZWFkcyB0aGUgcmVnaXN0cmF0aW9uIHN0YXRlIGRpcmVjdGx5IGFuZCBob2xkcyBub3RoaW5nIG9mIGl0c1xuLy8gb3duLCBzbyByZWdpc3RlcmluZyBhZnRlciB2YWxpZGF0aW5nIHdvcmtzIGFuZCB2YWxpZGF0aW5nIGFnYWluIHJlZmxlY3RzIGl0LlxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRm9yID1cbiAgKHtcbiAgICBjb250YWluZXJJZCxcbiAgICBpbmplY3RhYmxlU2V0LFxuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICB9KSA9PlxuICAoKSA9PiB7XG4gICAgY29uc3QgdmVyaWZpZWRJZHMgPSBbXTtcbiAgICBjb25zdCB1bnZlcmlmaWVkSWRzID0gW107XG4gICAgY29uc3QgdW52ZXJpZmlhYmxlQ29uc3VtcHRpb25zID0gW107XG4gICAgY29uc3QgdmlvbGF0aW9ucyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBpbmplY3RhYmxlIG9mIGluamVjdGFibGVTZXQpIHtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZWRJZCA9IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG5cbiAgICAgIC8vIE9ubHkgaW5qZWN0YWJsZTIgZGVjbGFyZXMgY29uc3VtcHRpb25zOyB2MSBpbmplY3RhYmxlcyBhcmUgYmV5b25kXG4gICAgICAvLyB3aGF0IHRoaXMgY2FuIGNoZWNrLlxuICAgICAgaWYgKGluamVjdGFibGUuYWxpYXNUeXBlICE9PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgICAgICB1bnZlcmlmaWVkSWRzLnB1c2gobmFtZXNwYWNlZElkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZlcmlmaWVkSWRzLnB1c2gobmFtZXNwYWNlZElkKTtcblxuICAgICAgLy8gQW4gb3ZlcnJpZGRlbiBpbmplY3RhYmxlJ3Mgb3duIGluc3RhbnRpYXRlIG5ldmVyIHJ1bnMsIHNvIGl0c1xuICAgICAgLy8gZGVjbGFyYXRpb25zIHNheSBub3RoaW5nIGFib3V0IHdoYXQgdGhpcyBjb250YWluZXIgbmVlZHMuXG4gICAgICBpZiAob3ZlcnJpZGluZ0luamVjdGFibGVzLmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBjb25zdW1wdGlvbiBvZiBpbmplY3RhYmxlLmNvbnN1bXB0aW9ucyA/PyBbXSkge1xuICAgICAgICBpZiAoIWlzVG9rZW4yKGNvbnN1bXB0aW9uKSkge1xuICAgICAgICAgIC8vIEEgdjEgdG9rZW4gY2FycmllcyBubyBjYXJkaW5hbGl0eSwgc28gdGhlcmUgaXMgbm8gYXJpdHkgdG8gY2hlY2suXG4gICAgICAgICAgdW52ZXJpZmlhYmxlQ29uc3VtcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgaW5qZWN0YWJsZUlkOiBuYW1lc3BhY2VkSWQsXG4gICAgICAgICAgICBjb25zdW1wdGlvbklkOiBjb25zdW1wdGlvbi5pZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBjYXJkaW5hbGl0eSB9ID0gY29uc3VtcHRpb247XG5cbiAgICAgICAgaWYgKGNhcmRpbmFsaXR5ICE9PSAnb25lJyAmJiBjYXJkaW5hbGl0eSAhPT0gJ29uZS1vci1tYW55Jykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGluZGV4IGhvbGRzIGV2ZXJ5IHJlZ2lzdHJhdGlvbiBtYWRlIGFnYWluc3QgdGhlIHRva2VuIG9yIGFueSBvZlxuICAgICAgICAvLyBpdHMgYC5mb3IoKWAgZGVyaXZhdGl2ZXMsIHdoaWNoIGlzIGhvdyBhIGdlbmVyYWwtdG9rZW4gZGVjbGFyYXRpb25cbiAgICAgICAgLy8gaXMgc2F0aXNmaWVkIGJ5IGFuIGltcGxlbWVudGF0aW9uIG9mIG9uZSBvZiBpdHMgc3BlY2lmaWMgdG9rZW5zLlxuICAgICAgICBjb25zdCByZWdpc3RlcmVkID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChjb25zdW1wdGlvbik7XG5cbiAgICAgICAgLy8gT25seSB0aGUgbG93ZXIgYm91bmQgaXMgY2hlY2tlZCBoZXJlOiB0aGUgdXBwZXIgYm91bmQgY2Fubm90IGJlXG4gICAgICAgIC8vIGV4Y2VlZGVkLCBzaW5jZSByZWdpc3RlcmluZyByZWplY3RzIHRoZSBzZWNvbmQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgIGlmIChyZWdpc3RlcmVkID09PSB1bmRlZmluZWQgfHwgcmVnaXN0ZXJlZC5zaXplID09PSAwKSB7XG4gICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYEluamVjdGFibGUgXCIke25hbWVzcGFjZWRJZH1cIiBjb25zdW1lcyBpbmplY3Rpb24gdG9rZW4gXCIke2NvbnN1bXB0aW9uLmlkfVwiIHdpdGggY2FyZGluYWxpdHkgXCIke2NhcmRpbmFsaXR5fVwiLCBidXQgaXQgaGFzIG5vIHJlZ2lzdHJhdGlvbnMuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZpb2xhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gdmFsaWRhdGUgY29udGFpbmVyIFwiJHtjb250YWluZXJJZH1cIiwgYnV0IGZvdW5kIHZpb2xhdGlvbnM6XFxuJHt2aW9sYXRpb25zXG4gICAgICAgICAgLm1hcCh2aW9sYXRpb24gPT4gYCAtICR7dmlvbGF0aW9ufWApXG4gICAgICAgICAgLmpvaW4oJ1xcbicpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNvcnRlZCA9IGlkcyA9PiBbLi4uaWRzXS5zb3J0KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmVyaWZpZWRJbmplY3RhYmxlczoge1xuICAgICAgICBjb3VudDogdmVyaWZpZWRJZHMubGVuZ3RoLFxuICAgICAgICBpZHM6IHNvcnRlZCh2ZXJpZmllZElkcyksXG4gICAgICB9LFxuXG4gICAgICB1bnZlcmlmaWVkSW5qZWN0YWJsZXM6IHtcbiAgICAgICAgY291bnQ6IHVudmVyaWZpZWRJZHMubGVuZ3RoLFxuICAgICAgICBpZHM6IHNvcnRlZCh1bnZlcmlmaWVkSWRzKSxcbiAgICAgIH0sXG5cbiAgICAgIHVudmVyaWZpYWJsZUNvbnN1bXB0aW9ucyxcbiAgICB9O1xuICB9O1xuIiwgImltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5pbXBvcnQgeyBpbmplY3Rpb25Ub2tlblN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3Rpb25Ub2tlbjIvZ2V0SW5qZWN0aW9uVG9rZW4yJztcblxuY29uc3QgdGFyZ2V0SXNWMiA9IGluamVjdGFibGUgPT5cbiAgaW5qZWN0YWJsZS5hbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyIHx8XG4gIGluamVjdGFibGUuYWxpYXNUeXBlID09PSBpbmplY3Rpb25Ub2tlblN5bWJvbDI7XG5cbi8vIHYxLXNoYXBlIHN0dWI6IChkaSwgLi4ucGFyYW1zKSA9PiBpbnN0YW5jZS4gV3JhcHMgZm9yIHYyIHRhcmdldHMuXG5jb25zdCBhc1YxU2hhcGUgPSAoc3R1YiwgaXNWMlRhcmdldCkgPT5cbiAgaXNWMlRhcmdldFxuICAgID8gZGkgPT5cbiAgICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgICBzdHViKGRpLCAuLi5wYXJhbXMpXG4gICAgOiBzdHViO1xuXG4vLyB2Mi1zaGFwZSBzdHViOiAoZGkpID0+ICguLi5wYXJhbXMpID0+IGluc3RhbmNlLiBVbndyYXBzIGZvciB2MSB0YXJnZXRzLlxuY29uc3QgYXNWMlNoYXBlID0gKHN0dWIsIGlzVjJUYXJnZXQpID0+XG4gIGlzVjJUYXJnZXQgPyBzdHViIDogKGRpLCAuLi5wYXJhbXMpID0+IHN0dWIoZGkpKC4uLnBhcmFtcyk7XG5cbmNvbnN0IGVhcmx5T3ZlcnJpZGVJbXBsRm9yID1cbiAgbm9ybWFsaXplID0+XG4gICh7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KSA9PlxuICAoYWxpYXMsIGluc3RhbnRpYXRlU3R1YikgPT4ge1xuICAgIGNvbnN0IHJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIHNpbmdsZSBpbXBsZW1lbnRhdGlvbiBvZiBpbmplY3Rpb24gdG9rZW4gXCIke1xuICAgICAgICAgIGFsaWFzLmlkXG4gICAgICAgIH1cIiwgYnV0IGZvdW5kIG11bHRpcGxlIHJlZ2lzdGVyZWQgaW1wbGVtZW50YXRpb25zOiBcIiR7cmVsYXRlZEluamVjdGFibGVzXG4gICAgICAgICAgLm1hcChnZXROYW1lc3BhY2VkSWQpXG4gICAgICAgICAgLmpvaW4oJ1wiLCBcIicpfVwiLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID09PSAwICYmIGlzSW5qZWN0aW9uVG9rZW4oYWxpYXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBlYXJseS1vdmVycmlkZSBhbiBpbmplY3Rpb24gdG9rZW4gXCIke2FsaWFzLmlkfVwiLCBidXQgdGhhdCBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbEluamVjdGFibGUgPSByZWxhdGVkSW5qZWN0YWJsZXNbMF0gfHwgYWxpYXM7XG5cbiAgICBpZiAoYWxyZWFkeUluamVjdGVkLmhhcyhhbGlhcykgfHwgYWxyZWFkeUluamVjdGVkLmhhcyhvcmlnaW5hbEluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBvdmVycmlkZSBpbmplY3RhYmxlIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgb3JpZ2luYWxJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaXQgd2FzIGFscmVhZHkgaW5qZWN0ZWQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLnNldChvcmlnaW5hbEluamVjdGFibGUsIHtcbiAgICAgIC4uLm9yaWdpbmFsSW5qZWN0YWJsZSxcbiAgICAgIG92ZXJyaWRkZW5JbmplY3RhYmxlOiBvcmlnaW5hbEluamVjdGFibGUsXG4gICAgICBjYXVzZXNTaWRlRWZmZWN0czogZmFsc2UsXG4gICAgICBpbnN0YW50aWF0ZTogbm9ybWFsaXplKGluc3RhbnRpYXRlU3R1YiwgdGFyZ2V0SXNWMihvcmlnaW5hbEluamVjdGFibGUpKSxcbiAgICB9KTtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IGVhcmx5T3ZlcnJpZGVGb3IgPSBlYXJseU92ZXJyaWRlSW1wbEZvcihhc1YxU2hhcGUpO1xuZXhwb3J0IGNvbnN0IGVhcmx5T3ZlcnJpZGUyRm9yID0gZWFybHlPdmVycmlkZUltcGxGb3IoYXNWMlNoYXBlKTtcbiIsICJpbXBvcnQgeyBwcmVJbmplY3RDYWxsYmFja1Rva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG4vLyBOb24td3JhcHBpbmcgZW50cnkgaG9vazogZmlyZXMgZXZlcnkgcHJlLWluamVjdCBjYWxsYmFjayBhcHBsaWNhYmxlIHRvIHRoZVxuLy8gYWxpYXMsIHRoZW4gY2FsbHMgdGhyb3VnaC4gRmlyZXMgYmVmb3JlIGFueSByZXNvbHV0aW9uIG9yIGZhaWx1cmUgY2hlY2ssXG4vLyBzbyBhIGNhbGxiYWNrIGNhbiByZWdpc3RlciBpbXBsZW1lbnRhdGlvbnMgdGhhdCB0aGUgc2FtZSBvcGVyYXRpb24gdGhlblxuLy8gb2JzZXJ2ZXMuIGBraW5kYCBpcyBiYWtlZCBpbiBhdCB3cmFwIHRpbWU6ICdpbmplY3QnIGZvciB0aGUgaW5qZWN0XG4vLyB2YXJpYW50cywgJ2luamVjdE1hbnknIGZvciB0aGUgaW5qZWN0TWFueSB2YXJpYW50cyAod2l0aE1ldGEgdmFyaWFudHNcbi8vIHJlcG9ydCB0aGVpciBiYXNlIGtpbmQpLiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGluamVjdGluZyBwYXJ0eTogdGhlXG4vLyBpbmplY3RhYmxlIHdob3NlIGluc3RhbnRpYXRlIG1hZGUgdGhlIGNhbGwsIG9yIHRoZSBjb250YWluZXIgcm9vdCBmb3Jcbi8vIGluamVjdHMgbWFkZSBkaXJlY3RseSBvbiBgZGlgLlxuZXhwb3J0IGNvbnN0IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3IgPVxuICAoeyBkZWNvcmF0b3JDYWNoZSwgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAga2luZCA9PlxuICB0b0JlQ2FsbGVkID0+XG4gIGFyZ3MgPT4ge1xuICAgIC8vIFdoZW4gZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0IGlzIG51bGwsIGEgY2FsbGJhY2sgd2FzIHJlZ2lzdGVyZWQgb3JcbiAgICAvLyBkZXJlZ2lzdGVyZWQgXHUyMDE0IGludmFsaWRhdGUgYWxsIHBlci1hbGlhcyBjYWNoZWQgY2FsbGJhY2sgbGlzdHMuXG4gICAgaWYgKGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9PT0gbnVsbCkge1xuICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0ID0gdHJ1ZTtcbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdEJ5QWxpYXMgPSBuZXcgTWFwKCk7XG4gICAgfVxuXG4gICAgbGV0IGNhbGxiYWNrcyA9IGRlY29yYXRvckNhY2hlLnByZUluamVjdEJ5QWxpYXMuZ2V0KGFyZ3MuYWxpYXMpO1xuXG4gICAgaWYgKGNhbGxiYWNrcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBhcHBsaWNhYmxlID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgICBkZWNvcmF0b3JUb2tlbjogcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbiAgICAgICAgdGFyZ2V0OiBhcmdzLmFsaWFzLFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBhcmdzLmluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcblxuICAgICAgY2FsbGJhY2tzID0gYXBwbGljYWJsZS5sZW5ndGggPiAwID8gYXBwbGljYWJsZSA6IG51bGw7XG5cbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdEJ5QWxpYXMuc2V0KGFyZ3MuYWxpYXMsIGNhbGxiYWNrcyk7XG4gICAgfVxuXG4gICAgaWYgKGNhbGxiYWNrcyAhPT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBjYWxsYmFja3MpIHtcbiAgICAgICAgY2FsbGJhY2soYXJncy5hbGlhcywga2luZCwgYXJncy5pbmplY3RpbmdJbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9CZUNhbGxlZChhcmdzKTtcbiAgfTtcbiIsICJpbXBvcnQgeyBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbiB9IGZyb20gJy4vdG9rZW5zJztcblxuZXhwb3J0IGNvbnN0IGZpcmVQdXJnZUNhbGxiYWNrc0ZvciA9XG4gICh7IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzIH0pID0+XG4gIChpbmplY3RhYmxlLCBpbnN0YW5jZSwga2V5QXJyYXkpID0+IHtcbiAgICBjb25zdCBwYXlsb2FkID0geyBpbnN0YW5jZSB9O1xuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgZGVjb3JhdG9yVG9rZW46IGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuLFxuICAgICAgdGFyZ2V0OiBpbmplY3RhYmxlLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogaW5qZWN0YWJsZSxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgY2Igb2YgY2FsbGJhY2tzKSB7XG4gICAgICBjYihwYXlsb2FkKSguLi5rZXlBcnJheSk7XG4gICAgfVxuICB9O1xuIiwgImltcG9ydCB7IGdldFJlbGF0ZWRUb2tlbnMgfSBmcm9tICcuL2dldFJlbGF0ZWRUb2tlbnMnO1xuXG4vLyBSZXR1cm5zIGV2ZXJ5IGRlY29yYXRvci9jYWxsYmFjayBpbnN0YW5jZSB0aGF0IGFwcGxpZXMgdG8gYHRhcmdldGAgZm9yIHRoZVxuLy8gZ2l2ZW4gYGRlY29yYXRvclRva2VuYC4gVGhyZWUgbG9va3VwIGRpbWVuc2lvbnMgYXJlIHVuaWZpZWQ6XG4vL1xuLy8gICAxLiBEaXJlY3Q6ICAgZGVjb3JhdG9yVG9rZW4uZm9yKHRhcmdldCkuXG4vLyAgIDIuIENoYWluOiAgICB3YWxrIGBzcGVjaWZpY1Rva2VuT2ZgIGFuY2VzdG9ycyBvZiB0aGUgY29udHJhY3QgdG9rZW4gXHUyMDE0XG4vLyAgICAgICAgICAgICAgICBgdGFyZ2V0LmluamVjdGlvblRva2VuYCBmb3IgaW5qZWN0YWJsZSB0YXJnZXRzLFxuLy8gICAgICAgICAgICAgICAgYHRhcmdldC5zcGVjaWZpY1Rva2VuT2ZgIGZvciB0b2tlbiB0YXJnZXRzIFx1MjAxNCBhbmQgbG9vayB1cFxuLy8gICAgICAgICAgICAgICAgYGRlY29yYXRvclRva2VuLmZvcihhbmNlc3RvcilgIGZvciBlYWNoLiBUaGlzIGlzIHN5bW1ldHJpY1xuLy8gICAgICAgICAgICAgICAgd2l0aCB0aGUgcmVnaXN0cmF0aW9uLXRpbWUgY2hhaW4gaW5kZXhpbmcgaW5cbi8vICAgICAgICAgICAgICAgIGBnZXRSZWxhdGVkVG9rZW5zYDogYSBjb250cmlidXRvciByZWdpc3RlcmVkIHVuZGVyXG4vLyAgICAgICAgICAgICAgICBgc29tZVRva2VuLmZvcihzcGVjaWZpZXIpYCBpcyBhbHJlYWR5IHJldHJpZXZhYmxlIHZpYVxuLy8gICAgICAgICAgICAgICAgYGluamVjdE1hbnkoc29tZVRva2VuKWAsIGFuZCBhIGRlY29yYXRvciB0YXJnZXRpbmcgdGhlXG4vLyAgICAgICAgICAgICAgICBwYXJlbnQgY29udHJhY3Qgc2hvdWxkIGZpcmUgZm9yIHRoZSBjaGlsZCBzcGVjaWFsaXphdGlvbi5cbi8vICAgMy4gVGFnczogICAgIGZvciBldmVyeSB0YWcgb2YgdGhlIHRhcmdldCBhbmQgb2YgZXZlcnkgdG9rZW4gaW4gaXRzXG4vLyAgICAgICAgICAgICAgICBjaGFpbiwgbG9vayB1cCBgZGVjb3JhdG9yVG9rZW4uZm9yKHRhZylgLiBUYWdzIGFyZSBkZWR1cGVkXG4vLyAgICAgICAgICAgICAgICBhY3Jvc3MgdGhlc2Ugc291cmNlczogYC5mb3IoKWAgY2hpbGRyZW4gaW5oZXJpdCB0aGUgZ2VuZXJhbFxuLy8gICAgICAgICAgICAgICAgdG9rZW4ncyB0YWdzLCBzbyB0aGUgc2FtZSB0YWcgdHlwaWNhbGx5IG9jY3VycyBvbiBldmVyeVxuLy8gICAgICAgICAgICAgICAgY2hhaW4gbGV2ZWwuIFRoaXMgbWFrZXMgYSB0YWcgb24gYSB0b2tlbiBmaXJlIGV2ZXJ5d2hlcmVcbi8vICAgICAgICAgICAgICAgIGAuZm9yKHRva2VuKWAgd291bGQuXG4vL1xuLy8gSW5qZWN0YWJsZXMgd2l0aG91dCBhbiBgaW5qZWN0aW9uVG9rZW5gIHNraXAgdGhlIGNoYWluIGRpbWVuc2lvbi5cbi8vXG4vLyBGYXN0IHBhdGg6IGlmIG5vIGluamVjdGFibGUgaXMgcmVnaXN0ZXJlZCB1bmRlciB0aGUgYWJzdHJhY3QgYGRlY29yYXRvclRva2VuYFxuLy8gaXRzZWxmLCBub25lIG9mIHRoZSB0aHJlZSBsb29rdXAgZGltZW5zaW9ucyBjYW4gZXZlciBtYXRjaC4gYHJlZ2lzdGVyLmpzYFxuLy8gaW5kZXhlcyBldmVyeSBzcGVjaWZpYyBkZWNvcmF0b3IgYnkgd2Fsa2luZyBgZ2V0UmVsYXRlZFRva2VucyhpbmplY3Rpb25Ub2tlbilgLFxuLy8gd2hpY2ggdGVybWluYXRlcyBhdCB0aGUgYWJzdHJhY3QgdG9rZW4gXHUyMDE0IHNvIHRoZSBhYnN0cmFjdCBzZXQgaXMgbm9uLWVtcHR5XG4vLyBpZmYgYXQgbGVhc3Qgb25lIGRlY29yYXRvciBvZiB0aGlzIHR5cGUgaXMgcmVnaXN0ZXJlZCBhbnl3aGVyZS5cbmNvbnN0IEVNUFRZID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbmV4cG9ydCBjb25zdCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9yc0ZvciA9XG4gICh7IGluamVjdE1hbnksIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbiwgZ2V0SW5qZWN0aW9uVG9rZW5PZiB9KSA9PlxuICAoeyBkZWNvcmF0b3JUb2tlbiwgdGFyZ2V0LCBpbmplY3RpbmdJbmplY3RhYmxlIH0pID0+IHtcbiAgICBjb25zdCByZWdpc3RlcmVkID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChkZWNvcmF0b3JUb2tlbik7XG5cbiAgICBpZiAoIXJlZ2lzdGVyZWQgfHwgcmVnaXN0ZXJlZC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0ID0gW107XG5cbiAgICAvLyBNb3N0IGRpc3BhdGNoIGtleXMgaGF2ZSBubyByZWdpc3RyYXRpb25zIFx1MjAxNCBjaGVja2luZyB0aGUgcmVnaXN0cmF0aW9uXG4gICAgLy8gaW5kZXggZGlyZWN0bHkgc2tpcHMgdGhlIGluamVjdE1hbnkgbWFjaGluZXJ5IGZvciB0aGVtLiBgLmZvcigpYCBpdHNlbGZcbiAgICAvLyBpcyBjaGVhcCBvbiByZXBlYXQgY2FsbHMgKG1lbW9pemVkIGJ5IHNwZWNpZmllcikuXG4gICAgY29uc3QgZGlzcGF0Y2ggPSBhbGlhcyA9PiB7XG4gICAgICBjb25zdCByZWdpc3RlcmVkRm9yQWxpYXMgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGFsaWFzKTtcblxuICAgICAgaWYgKHJlZ2lzdGVyZWRGb3JBbGlhcyAmJiByZWdpc3RlcmVkRm9yQWxpYXMuc2l6ZSA+IDApIHtcbiAgICAgICAgb3V0LnB1c2goXG4gICAgICAgICAgLi4uaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRpc3BhdGNoKGRlY29yYXRvclRva2VuLmZvcih0YXJnZXQpKTtcblxuICAgIGNvbnN0IGNoYWluID0gZ2V0UmVsYXRlZFRva2VucyhcbiAgICAgIGdldEluamVjdGlvblRva2VuT2YodGFyZ2V0KSA/PyB0YXJnZXQuc3BlY2lmaWNUb2tlbk9mLFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHQgb2YgY2hhaW4pIHtcbiAgICAgIGRpc3BhdGNoKGRlY29yYXRvclRva2VuLmZvcih0KSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0VGFncyA9IHRhcmdldC50YWdzO1xuXG4gICAgaWYgKHRhcmdldFRhZ3MpIHtcbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhcmdldFRhZ3MpIHtcbiAgICAgICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHRhZykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlZHVwIHdpdGhvdXQgYWxsb2NhdGlvbnM6IGAuZm9yKClgIGNoaWxkcmVuIHNoYXJlIHRoZSBnZW5lcmFsIHRva2VuJ3NcbiAgICAvLyB0YWdzIGFycmF5LCBzbyBhIGNoYWluIGNhcnJpZXMgYXQgbW9zdCBvbmUgZGlzdGluY3QgdGFncyBhcnJheSBcdTIwMTQgc2tpcFxuICAgIC8vIHJlcGVhdHMgYnkgcmVmZXJlbmNlLCBhbmQgc2tpcCB0YWdzIGFscmVhZHkgZGlzcGF0Y2hlZCB2aWEgdGFyZ2V0LnRhZ3NcbiAgICAvLyB3aXRoIGluZGV4T2YgKHRoZSBhcnJheXMgYXJlIHRpbnkpLlxuICAgIGxldCBwcm9jZXNzZWRDaGFpblRhZ3MgPSB0YXJnZXRUYWdzO1xuXG4gICAgZm9yIChjb25zdCB0IG9mIGNoYWluKSB7XG4gICAgICBjb25zdCBjaGFpblRhZ3MgPSB0LnRhZ3M7XG5cbiAgICAgIGlmICghY2hhaW5UYWdzIHx8IGNoYWluVGFncyA9PT0gcHJvY2Vzc2VkQ2hhaW5UYWdzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzZWRDaGFpblRhZ3MgPSBjaGFpblRhZ3M7XG5cbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIGNoYWluVGFncykge1xuICAgICAgICBpZiAodGFyZ2V0VGFncyAmJiB0YXJnZXRUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3BhdGNoKGRlY29yYXRvclRva2VuLmZvcih0YWcpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xuICB9O1xuIiwgImltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0U2NvcGVkSWRGb3IgfSBmcm9tICcuL2dldFNjb3BlZElkRm9yJztcblxuLy8gQW4gYGluamVjdGlvblRva2VuYCBtYXkgYmUgZ2l2ZW4gYXMgYSBmdW5jdGlvbiBvZiB0aGUgc2NvcGUgdGhlIGluamVjdGFibGVcbi8vIGVuZHMgdXAgcmVnaXN0ZXJlZCB1bmRlciwgYCh7IHNjb3BlSWRzIH0pID0+IHNvbWVUb2tlbi5mb3IoLi4uKWAsIGZvclxuLy8gdG9rZW5zIGtleWVkIGJ5IHNvbWV0aGluZyBvbmx5IHRoZSByZWdpc3RyYXRpb24ga25vd3MuIEEgdG9rZW4gY29tcG9uZW50IGlzXG4vLyBjYWxsYWJsZSB0b28sIHNvIGEgcmVzb2x2ZXIgaXMgdG9sZCBhcGFydCBieSBub3QgYmVpbmcgYSB0b2tlbiBpdHNlbGYuXG5leHBvcnQgY29uc3QgaXNJbmplY3Rpb25Ub2tlblJlc29sdmVyID0gbWF5YmVSZXNvbHZlciA9PlxuICB0eXBlb2YgbWF5YmVSZXNvbHZlciA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNJbmplY3Rpb25Ub2tlbihtYXliZVJlc29sdmVyKTtcblxuLy8gVGhlIHJlc29sdmVkIHRva2VuIGxpdmVzIHdpdGggdGhlIGNvbnRhaW5lciwgbm90IG9uIHRoZSBpbmplY3RhYmxlOiB0aGUgc2FtZVxuLy8gaW5qZWN0YWJsZSBvYmplY3QgcmVnaXN0ZXJzIGludG8gZGlmZmVyZW50IHNjb3BlcyBpbiBkaWZmZXJlbnQgY29udGFpbmVyc1xuLy8gKGFuZCwgYWZ0ZXIgZGVyZWdpc3RyYXRpb24sIGluIGRpZmZlcmVudCBzY29wZXMgb2YgdGhlIHNhbWUgb25lKSwgYW5kIGVhY2hcbi8vIHJlZ2lzdHJhdGlvbiByZXNvbHZlcyBvbiBpdHMgb3duLlxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuUmVzb2x1dGlvbkZvciA9ICh7XG4gIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxufSkgPT4ge1xuICBjb25zdCBnZXRTY29wZWRJZCA9IGdldFNjb3BlZElkRm9yKGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0KTtcbiAgY29uc3QgcmVzb2x2ZWRUb2tlbkJ5SW5qZWN0YWJsZSA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgY29uc3QgcmVzb2x2ZUluamVjdGlvblRva2VuT2YgPSAoaW5qZWN0YWJsZSwgcmVnaXN0cmF0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVyID0gaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbjtcblxuICAgIGlmICghaXNJbmplY3Rpb25Ub2tlblJlc29sdmVyKHJlc29sdmVyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG93bmVyID0gcmVnaXN0cmF0aW9uQ29udGV4dFtyZWdpc3RyYXRpb25Db250ZXh0Lmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gVGhlIG93bmVyJ3Mgc2NvcGVkIGlkIGlzIGV4YWN0bHkgd2hhdCB0aGUgaW5qZWN0YWJsZSdzIG93biBgZGkuc2NvcGVJZHNgXG4gICAgLy8gd2lsbCByZWFkIGFzIG9uY2UgaW5zdGFudGlhdGVkOiB0aGUgb3duZXIncyBzY29wZXMsIHRoZW4gdGhlIG93bmVyLlxuICAgIGNvbnN0IHNjb3BlSWRzID1cbiAgICAgICFvd25lciB8fCBvd25lci5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcidcbiAgICAgICAgPyBbXVxuICAgICAgICA6IGdldFNjb3BlZElkKG93bmVyLmluamVjdGFibGUpO1xuXG4gICAgY29uc3QgdG9rZW4gPSByZXNvbHZlcih7IHNjb3BlSWRzIH0pO1xuXG4gICAgaWYgKCFpc0luamVjdGlvblRva2VuKHRva2VuKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgaW5qZWN0YWJsZSBcIiR7aW5qZWN0YWJsZS5pZH1cIiwgYnV0IGl0cyBpbmplY3Rpb24gdG9rZW4gcmVzb2x2ZXIgcmV0dXJuZWQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGFuIGluamVjdGlvbiB0b2tlbi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXNvbHZlZFRva2VuQnlJbmplY3RhYmxlLnNldChpbmplY3RhYmxlLCB0b2tlbik7XG4gIH07XG5cbiAgY29uc3QgZ2V0SW5qZWN0aW9uVG9rZW5PZiA9IGFsaWFzT3JJbmplY3RhYmxlID0+IHtcbiAgICBjb25zdCB0b2tlbk9yUmVzb2x2ZXIgPSBhbGlhc09ySW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbjtcblxuICAgIHJldHVybiBpc0luamVjdGlvblRva2VuUmVzb2x2ZXIodG9rZW5PclJlc29sdmVyKVxuICAgICAgPyByZXNvbHZlZFRva2VuQnlJbmplY3RhYmxlLmdldChhbGlhc09ySW5qZWN0YWJsZSlcbiAgICAgIDogdG9rZW5PclJlc29sdmVyO1xuICB9O1xuXG4gIGNvbnN0IGZvcmdldEluamVjdGlvblRva2VuT2YgPSBpbmplY3RhYmxlID0+IHtcbiAgICByZXNvbHZlZFRva2VuQnlJbmplY3RhYmxlLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgfTtcblxuICByZXR1cm4geyByZXNvbHZlSW5qZWN0aW9uVG9rZW5PZiwgZ2V0SW5qZWN0aW9uVG9rZW5PZiwgZm9yZ2V0SW5qZWN0aW9uVG9rZW5PZiB9O1xufTtcbiIsICJpbXBvcnQgeyBwcml2YXRlSW5qZWN0Rm9yIH0gZnJvbSAnLi9wcml2YXRlSW5qZWN0Rm9yJztcbmltcG9ydCB7IHdpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yIH0gZnJvbSAnLi93aXRoSW5qZWN0aW9uRGVjb3JhdG9yc0Zvcic7XG5pbXBvcnQgeyBwcml2YXRlSW5qZWN0TWFueUZvciBhcyBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueUZvciB9IGZyb20gJy4vcHJpdmF0ZUluamVjdE1hbnlGb3InO1xuaW1wb3J0IHsgcmVnaXN0ZXJGb3IsIHJlZ2lzdGVyU2luZ2xlRm9yIH0gZnJvbSAnLi9yZWdpc3Rlcic7XG5pbXBvcnQgeyBwdXJnZUluc3RhbmNlc0ZvciwgcHVyZ2VTdG9yZWRJbnN0YW5jZXNGb3IgfSBmcm9tICcuL3B1cmdlSW5zdGFuY2VzJztcbmltcG9ydCB7IGRlcmVnaXN0ZXJGb3IgfSBmcm9tICcuL2RlcmVnaXN0ZXInO1xuaW1wb3J0IHsgb3ZlcnJpZGVGb3IsIHVub3ZlcnJpZGVGb3IgfSBmcm9tICcuL292ZXJyaWRlJztcbmltcG9ydCB7IGdldE5hbWVzcGFjZWRJZEZvciB9IGZyb20gJy4vZ2V0TmFtZXNwYWNlZElkRm9yJztcbmltcG9ydCB7IGdldFNjb3BlZElkRm9yIH0gZnJvbSAnLi9nZXRTY29wZWRJZEZvcic7XG5pbXBvcnQgeyBjaGVja0Zvck5vTWF0Y2hlc0ZvciB9IGZyb20gJy4vY2hlY2tGb3JOb01hdGNoZXNGb3InO1xuaW1wb3J0IHsgY2hlY2tGb3JUb29NYW55TWF0Y2hlc0ZvciB9IGZyb20gJy4vY2hlY2tGb3JUb29NYW55TWF0Y2hlcyc7XG5pbXBvcnQgeyBjaGVja0ZvclNpZGVFZmZlY3RzRm9yIH0gZnJvbSAnLi9jaGVja0ZvclNpZGVFZmZlY3RzRm9yJztcbmltcG9ydCB7IGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvciB9IGZyb20gJy4vY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yJztcbmltcG9ydCB7IGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eUZvciB9IGZyb20gJy4vY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yJztcbmltcG9ydCB7IGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yIH0gZnJvbSAnLi9jaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbkZvcic7XG5pbXBvcnQgeyB2YWxpZGF0ZUZvciB9IGZyb20gJy4vdmFsaWRhdGUnO1xuaW1wb3J0IHsgZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yIH0gZnJvbSAnLi9nZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3InO1xuaW1wb3J0IHsgZWFybHlPdmVycmlkZUZvciwgZWFybHlPdmVycmlkZTJGb3IgfSBmcm9tICcuL2Vhcmx5LW92ZXJyaWRlJztcbmltcG9ydCB7XG4gIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbixcbiAgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbn0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHsgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvciB9IGZyb20gJy4vd2l0aFByZUluamVjdENhbGxiYWNrc0Zvcic7XG5pbXBvcnQgeyBpc1JlbGF0ZWRUb1Rva2VuIH0gZnJvbSAnLi9nZXRSZWxhdGVkVG9rZW5zJztcbmltcG9ydCB7IGZpcmVQdXJnZUNhbGxiYWNrc0ZvciB9IGZyb20gJy4vZmlyZVB1cmdlQ2FsbGJhY2tzRm9yJztcbmltcG9ydCB7IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yIH0gZnJvbSAnLi9nZXRBcHBsaWNhYmxlRGVjb3JhdG9yc0Zvcic7XG5pbXBvcnQgeyBpbmplY3Rpb25Ub2tlblJlc29sdXRpb25Gb3IgfSBmcm9tICcuL2luamVjdGlvblRva2VuUmVzb2x1dGlvbkZvcic7XG5pbXBvcnQgeyBpc0NvbXBvc2l0ZVN0b3JhZ2UgfSBmcm9tICcuL3ByaXZhdGVJbmplY3RGb3InO1xuXG5leHBvcnQgZGVmYXVsdCBjb250YWluZXJJZCA9PiB7XG4gIGNvbnN0IGluamVjdGFibGVTZXQgPSBuZXcgU2V0KCk7XG5cbiAgY29uc3QgZGVjb3JhdG9yQ2FjaGUgPSB7XG4gICAgaW5qZWN0aW9uOiBudWxsLFxuICAgIGluamVjdGlvbkJ5QWxpYXM6IG5ldyBNYXAoKSxcbiAgICBwcmVJbmplY3Q6IG51bGwsXG4gICAgcHJlSW5qZWN0QnlBbGlhczogbmV3IE1hcCgpLFxuICB9O1xuICBjb25zdCBvdmVycmlkaW5nSW5qZWN0YWJsZXMgPSBuZXcgTWFwKCk7XG4gIGxldCBzaWRlRWZmZWN0c0FyZVByZXZlbnRlZCA9IHRydWU7XG4gIGNvbnN0IGFscmVhZHlJbmplY3RlZCA9IG5ldyBTZXQoKTtcbiAgY29uc3QgaW5qZWN0YWJsZXNXaXRoUGVybWl0dGVkU2lkZUVmZmVjdHMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGluamVjdGFibGVJZFNldCA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwID0gbmV3IE1hcCgpO1xuICBjb25zdCBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudE1hcCA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZXROYW1lc3BhY2VkSWQgPSBnZXROYW1lc3BhY2VkSWRGb3IoaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQpO1xuICBjb25zdCBnZXRTY29wZWRJZCA9IGdldFNjb3BlZElkRm9yKGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0KTtcblxuICBjb25zdCB7IHJlc29sdmVJbmplY3Rpb25Ub2tlbk9mLCBnZXRJbmplY3Rpb25Ub2tlbk9mLCBmb3JnZXRJbmplY3Rpb25Ub2tlbk9mIH0gPVxuICAgIGluamVjdGlvblRva2VuUmVzb2x1dGlvbkZvcih7IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0IH0pO1xuXG4gIGNvbnN0IGdldFJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcih7XG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIGluamVjdGFibGVTZXQsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbnRhaW5lclJvb3RDb250ZXh0SXRlbSA9IHtcbiAgICBpbmplY3RhYmxlOiB7IGlkOiBjb250YWluZXJJZCwgYWxpYXNUeXBlOiAnY29udGFpbmVyJyB9LFxuICB9O1xuXG4gIGNvbnN0IHJvb3RJbmplY3RhYmxlID0gY29udGFpbmVyUm9vdENvbnRleHRJdGVtLmluamVjdGFibGU7XG5cbiAgY29uc3QgY2hlY2tGb3JBYnN0cmFjdFRva2VuID0gY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yKHsgZ2V0TmFtZXNwYWNlZElkIH0pO1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yVW5rbm93bk1ldGEgPVxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yKHtcbiAgICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICAgIC8vIEVsZW1lbnRzIGdvIHRocm91Z2ggdGhlIGVsZW1lbnQgc2xvdCwgbm90IGBwcml2YXRlRGkuaW5qZWN0YDogZW50cnlcbiAgICAgIC8vIHdyYXBwZXJzIChvbmNlLXBlci1vcGVyYXRpb24gaG9va3MpIG11c3Qgbm90IHJlLWZpcmUgcGVyIGVsZW1lbnQsXG4gICAgICAvLyB3aGlsZSBpbmplY3Rpb24gZGVjb3JhdG9ycyBzdGlsbCBhcHBseSBwZXIgZWxlbWVudC5cbiAgICAgIGdldEluamVjdDogKCkgPT4gZWxlbWVudEluamVjdCxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogZmFsc2UsXG4gICAgfSk7XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogdHJ1ZSxcbiAgICB9KTtcblxuICBjb25zdCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yKHtcbiAgICBpbmplY3RNYW55OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgfSk7XG5cbiAgY29uc3QgZ2V0U2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQgPSBpbmplY3RhYmxlID0+XG4gICAgc2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQgJiZcbiAgICBpbmplY3RhYmxlLmNhdXNlc1NpZGVFZmZlY3RzICYmXG4gICAgIWluamVjdGFibGVzV2l0aFBlcm1pdHRlZFNpZGVFZmZlY3RzLmhhcyhpbmplY3RhYmxlKTtcblxuICBjb25zdCBjaGVja0ZvclNpZGVFZmZlY3RzID0gY2hlY2tGb3JTaWRlRWZmZWN0c0Zvcih7XG4gICAgZ2V0U2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBjaGVja0Zvck5vTWF0Y2hlcyA9IGNoZWNrRm9yTm9NYXRjaGVzRm9yKHtcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IGNoZWNrRm9yVG9vTWFueU1hdGNoZXMgPSBjaGVja0ZvclRvb01hbnlNYXRjaGVzRm9yKHtcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSA9IGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eUZvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbiA9IGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yKHtcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIC8vIEVuZm9yY2VtZW50IHdyYXBzIHRoZSBzbG90cyByYXRoZXIgdGhhbiBsaXZpbmcgaW5zaWRlIHRoZSBvcGVyYXRpb25cbiAgLy8gZnVuY3Rpb25zLCBzbyB0aGF0IHRoZSBtYWNoaW5lcnkgXHUyMDE0IGRlY29yYXRvciBhbmQgY2FsbGJhY2sgZGlzcGF0Y2gsIHB1cmdlXG4gIC8vIGNhbGxiYWNrcyBcdTIwMTQgc3RheXMgZXhlbXB0OiBpdCBob2xkcyB0aGUgcmF3IG9wZXJhdGlvbnMgY2FwdHVyZWQgYXRcbiAgLy8gY29uc3RydWN0aW9uIGFuZCBuZXZlciByZWFkcyB0aGVzZSBzbG90cy5cbiAgY29uc3Qgd2l0aENvbnN1bXB0aW9uRW5mb3JjZW1lbnQgPSB0b0JlQ2FsbGVkID0+IGFyZ3MgPT4ge1xuICAgIGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uKGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRvQmVDYWxsZWQoYXJncyk7XG4gIH07XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdFVua25vd25NZXRhID0gcHJpdmF0ZUluamVjdEZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGluamVjdGFibGVTZXQsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZ2V0RGk6ICgpID0+IHByaXZhdGVEaSxcbiAgICBjaGVja0Zvck5vTWF0Y2hlcyxcbiAgICBjaGVja0ZvclRvb01hbnlNYXRjaGVzLFxuICAgIGNoZWNrRm9yU2lkZUVmZmVjdHMsXG4gICAgY2hlY2tGb3JBYnN0cmFjdFRva2VuLFxuICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICAgIGdldFNjb3BlZElkLFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0ID0gbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdFVua25vd25NZXRhKHtcbiAgICB3aXRoTWV0YTogZmFsc2UsXG4gIH0pO1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdFVua25vd25NZXRhKHtcbiAgICAgIHdpdGhNZXRhOiB0cnVlLFxuICAgIH0pO1xuXG4gIGNvbnN0IHdpdGhJbmplY3Rpb25EZWNvcmF0b3JzID0gd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3Ioe1xuICAgIGRlY29yYXRvckNhY2hlLFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICAvLyBJbmplY3Rpb24gZGVjb3JhdG9ycyBhcHBseSBvbmx5IG9uIHRoZSBwZXItaW5qZWN0YWJsZSBpbmplY3QgcGF0aC5cbiAgLy8gaW5qZWN0TWFueSByZXNvbHZlcyByZWxhdGVkIGluamVjdGFibGVzIGFuZCBjYWxscyB0aGUgKGRlY29yYXRlZCkgaW5qZWN0XG4gIC8vIG9uIGVhY2gsIHNvIGRlY29yYXRvcnMgc3RpbGwgZmlyZSBwZXIgZWxlbWVudCBcdTIwMTQgYnV0IHRoZSB0b2tlbi1sZXZlbFxuICAvLyBpbmplY3RNYW55IGlzIG5ldmVyIHdyYXBwZWQuXG4gIGNvbnN0IGRlY29yYXRlZFByaXZhdGVJbmplY3QgPSB3aXRoSW5qZWN0aW9uRGVjb3JhdG9ycyhcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICApO1xuXG4gIGNvbnN0IGRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSA9IHdpdGhJbmplY3Rpb25EZWNvcmF0b3JzKFxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSxcbiAgKTtcblxuICBjb25zdCB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzID0gd2l0aFByZUluamVjdENhbGxiYWNrc0Zvcih7XG4gICAgZGVjb3JhdG9yQ2FjaGUsXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gIH0pO1xuXG4gIGNvbnN0IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3JJbmplY3QgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzKCdpbmplY3QnKTtcblxuICBjb25zdCB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0TWFueSA9XG4gICAgd2l0aFByZUluamVjdENhbGxiYWNrcygnaW5qZWN0TWFueScpO1xuXG4gIGNvbnN0IHByZUluamVjdE5vbkRlY29yYXRlZEluamVjdCA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3JJbmplY3QoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdCxcbiAgKTtcblxuICBjb25zdCBwcmVJbmplY3REZWNvcmF0ZWRJbmplY3QgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0KFxuICAgIGRlY29yYXRlZFByaXZhdGVJbmplY3QsXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0Tm9uRGVjb3JhdGVkSW5qZWN0V2l0aE1ldGEgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0KFxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSxcbiAgKTtcblxuICBjb25zdCBwcmVJbmplY3REZWNvcmF0ZWRJbmplY3RXaXRoTWV0YSA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3JJbmplY3QoXG4gICAgZGVjb3JhdGVkUHJpdmF0ZUluamVjdFdpdGhNZXRhLFxuICApO1xuXG4gIGNvbnN0IHByZUluamVjdEluamVjdE1hbnkgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0TWFueShcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgKTtcblxuICBjb25zdCBwcmVJbmplY3RJbmplY3RNYW55V2l0aE1ldGEgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0TWFueShcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueVdpdGhNZXRhLFxuICApO1xuXG4gIC8vIFRoZSBpbmplY3QgdXNlZCBmb3IgaW5qZWN0TWFueSBlbGVtZW50czogZGVjb3JhdGVkIHBlciBlbGVtZW50IHdoZW5cbiAgLy8gaW5qZWN0aW9uIGRlY29yYXRvcnMgZXhpc3QsIGJ1dCBuZXZlciB3cmFwcGVkIGJ5IGVudHJ5LWxldmVsIGhvb2tzXG4gIC8vIChwcmUtaW5qZWN0IGNhbGxiYWNrcyBmaXJlIG9uY2UgcGVyIG9wZXJhdGlvbiwgbm90IHBlciBlbGVtZW50KS5cbiAgbGV0IGVsZW1lbnRJbmplY3QgPSBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0O1xuXG4gIC8vIFdpcmVzIHRoZSBkZWNvcmF0ZWQgYW5kIHByZS1pbmplY3QtaG9va2VkIHZhcmlhbnRzIGluIG9ubHkgd2hpbGUgYXRcbiAgLy8gbGVhc3Qgb25lIG1hdGNoaW5nIGNvbnRyaWJ1dG9yIGlzIHJlZ2lzdGVyZWQsIHNvIHRoZSBjb21tb24gYmFyZSBjYXNlXG4gIC8vIHBheXMgbm8gd3JhcHBlciBmcmFtZSBhdCBhbGwuIEV2ZXJ5IHJlYWRlciBvZiB0aGUgcHJpdmF0ZURpIHNsb3RzIChhbmRcbiAgLy8gYGVsZW1lbnRJbmplY3RgLCB2aWEgdGhlIGdldEluamVjdCB0aHVuaykgcmVhZHMgdGhlbSBhdCBjYWxsIHRpbWUuXG4gIGNvbnN0IHN5bmNJbmplY3RXaXJpbmcgPSAoKSA9PiB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZERlY29yYXRvcnMgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KFxuICAgICAgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgKTtcblxuICAgIGNvbnN0IGRlY29yYXRvcnNBY3RpdmUgPVxuICAgICAgcmVnaXN0ZXJlZERlY29yYXRvcnMgIT09IHVuZGVmaW5lZCAmJiByZWdpc3RlcmVkRGVjb3JhdG9ycy5zaXplID4gMDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyZWRQcmVJbmplY3RDYWxsYmFja3MgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KFxuICAgICAgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbiAgICApO1xuXG4gICAgY29uc3QgcHJlSW5qZWN0QWN0aXZlID1cbiAgICAgIHJlZ2lzdGVyZWRQcmVJbmplY3RDYWxsYmFja3MgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcmVnaXN0ZXJlZFByZUluamVjdENhbGxiYWNrcy5zaXplID4gMDtcblxuICAgIGVsZW1lbnRJbmplY3QgPSBkZWNvcmF0b3JzQWN0aXZlXG4gICAgICA/IGRlY29yYXRlZFByaXZhdGVJbmplY3RcbiAgICAgIDogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdDtcblxuICAgIHByaXZhdGVEaS5pbmplY3QgPSBwcmVJbmplY3RBY3RpdmVcbiAgICAgID8gZGVjb3JhdG9yc0FjdGl2ZVxuICAgICAgICA/IHByZUluamVjdERlY29yYXRlZEluamVjdFxuICAgICAgICA6IHByZUluamVjdE5vbkRlY29yYXRlZEluamVjdFxuICAgICAgOiBlbGVtZW50SW5qZWN0O1xuXG4gICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhID0gcHJlSW5qZWN0QWN0aXZlXG4gICAgICA/IGRlY29yYXRvcnNBY3RpdmVcbiAgICAgICAgPyBwcmVJbmplY3REZWNvcmF0ZWRJbmplY3RXaXRoTWV0YVxuICAgICAgICA6IHByZUluamVjdE5vbkRlY29yYXRlZEluamVjdFdpdGhNZXRhXG4gICAgICA6IGRlY29yYXRvcnNBY3RpdmVcbiAgICAgID8gZGVjb3JhdGVkUHJpdmF0ZUluamVjdFdpdGhNZXRhXG4gICAgICA6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YTtcblxuICAgIHByaXZhdGVEaS5pbmplY3RNYW55ID0gcHJlSW5qZWN0QWN0aXZlXG4gICAgICA/IHByZUluamVjdEluamVjdE1hbnlcbiAgICAgIDogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnk7XG5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueVdpdGhNZXRhID0gcHJlSW5qZWN0QWN0aXZlXG4gICAgICA/IHByZUluamVjdEluamVjdE1hbnlXaXRoTWV0YVxuICAgICAgOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueVdpdGhNZXRhO1xuXG4gICAgLy8gYGVsZW1lbnRJbmplY3RgIGlzIGRlbGliZXJhdGVseSBsZWZ0IHVud3JhcHBlZDogZW5mb3JjZW1lbnQgaXMgcGVyXG4gICAgLy8gaW5qZWN0IG9wZXJhdGlvbiwgYW5kIGFuIGluamVjdE1hbnkncyBlbGVtZW50cyB3ZXJlIGFscmVhZHkgY292ZXJlZCBieVxuICAgIC8vIHRoZSBjaGVjayBvbiB0aGUgb3BlcmF0aW9uIGl0c2VsZi5cbiAgICBwcml2YXRlRGkuaW5qZWN0ID0gd2l0aENvbnN1bXB0aW9uRW5mb3JjZW1lbnQocHJpdmF0ZURpLmluamVjdCk7XG4gICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhID0gd2l0aENvbnN1bXB0aW9uRW5mb3JjZW1lbnQoXG4gICAgICBwcml2YXRlRGkuaW5qZWN0V2l0aE1ldGEsXG4gICAgKTtcbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueSA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KHByaXZhdGVEaS5pbmplY3RNYW55KTtcbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueVdpdGhNZXRhID0gd2l0aENvbnN1bXB0aW9uRW5mb3JjZW1lbnQoXG4gICAgICBwcml2YXRlRGkuaW5qZWN0TWFueVdpdGhNZXRhLFxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgZmlyZVB1cmdlQ2FsbGJhY2tzID0gZmlyZVB1cmdlQ2FsbGJhY2tzRm9yKHtcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSk7XG5cbiAgY29uc3QgcmF3UmVnaXN0ZXJTaW5nbGUgPSByZWdpc3RlclNpbmdsZUZvcih7XG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICBpbmplY3RhYmxlSWRTZXQsXG4gICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gICAgcmVzb2x2ZUluamVjdGlvblRva2VuT2YsXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgfSk7XG5cbiAgY29uc3QgcmVnaXN0ZXJTaW5nbGUgPSAoaW5qZWN0YWJsZSwgY29udGV4dCkgPT4ge1xuICAgIHJhd1JlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUsIGNvbnRleHQpO1xuXG4gICAgY29uc3QgaW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbk9mKGluamVjdGFibGUpO1xuXG4gICAgbGV0IHdpcmluZ0NoYW5nZWQgPSBmYWxzZTtcblxuICAgIGlmIChpc1JlbGF0ZWRUb1Rva2VuKGluamVjdGlvblRva2VuLCBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbikpIHtcbiAgICAgIGRlY29yYXRvckNhY2hlLmluamVjdGlvbiA9IG51bGw7XG4gICAgICB3aXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNSZWxhdGVkVG9Ub2tlbihpbmplY3Rpb25Ub2tlbiwgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbikpIHtcbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9IG51bGw7XG4gICAgICB3aXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAod2lyaW5nQ2hhbmdlZCkge1xuICAgICAgc3luY0luamVjdFdpcmluZygpO1xuICAgIH1cbiAgfTtcblxuICAvLyBDYWxsYmFja3MgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgc3BlY2lmaWMgdGFyZ2V0IGFsc28gbGFuZCB1bmRlciB0aGVcbiAgLy8gYWJzdHJhY3QgdG9rZW4sIHNvIGFuIGVtcHR5IHNldCBoZXJlIG1lYW5zIG5vIHB1cmdlIGNhbGxiYWNrIGNhbiBhcHBseS5cbiAgY29uc3QgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KFxuICAgICAgaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG4gICAgKTtcblxuICAgIHJldHVybiByZWdpc3RlcmVkICE9PSB1bmRlZmluZWQgJiYgcmVnaXN0ZXJlZC5zaXplID4gMDtcbiAgfTtcblxuICBjb25zdCBwdXJnZUluc3RhbmNlcyA9IHB1cmdlSW5zdGFuY2VzRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pO1xuXG4gIGNvbnN0IHB1cmdlU3RvcmVkSW5zdGFuY2VzID0gcHVyZ2VTdG9yZWRJbnN0YW5jZXNGb3Ioe1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gICAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxuICB9KTtcblxuICBjb25zdCBkZXJlZ2lzdGVyID0gZGVyZWdpc3RlckZvcih7XG4gICAgaW5qZWN0TWFueTogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAvLyBUb2RvOiBnZXQgcmlkIG9mIGZ1bmN0aW9uIHVzYWdlLlxuICAgIGdldERpOiAoKSA9PiBwcml2YXRlRGksXG4gICAgZGVjb3JhdG9yQ2FjaGUsXG4gICAgc3luY0luamVjdFdpcmluZyxcbiAgICBnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICAgIGZvcmdldEluamVjdGlvblRva2VuT2YsXG4gIH0pO1xuXG4gIGNvbnN0IHByaXZhdGVSZWdpc3RlciA9IHJlZ2lzdGVyRm9yKHtcbiAgICByZWdpc3RlclNpbmdsZSxcbiAgICBpbmplY3RNYW55OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgICByZXNvbHZlSW5qZWN0aW9uVG9rZW5PZixcbiAgICBnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICB9KTtcblxuICBjb25zdCBlYXJseU92ZXJyaWRlID0gZWFybHlPdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBlYXJseU92ZXJyaWRlMiA9IGVhcmx5T3ZlcnJpZGUyRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVGb3Ioe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBlYXJseU92ZXJyaWRlLFxuICB9KTtcblxuICBjb25zdCBvdmVycmlkZTIgPSBvdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGVhcmx5T3ZlcnJpZGU6IGVhcmx5T3ZlcnJpZGUyLFxuICB9KTtcblxuICBjb25zdCB1bm92ZXJyaWRlID0gdW5vdmVycmlkZUZvcih7XG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IHB1cmdlQWxsQnV0T3ZlcnJpZGVzID0gKCkgPT4ge1xuICAgIGluamVjdGFibGVTZXQuY2xlYXIoKTtcbiAgICBhbHJlYWR5SW5qZWN0ZWQuY2xlYXIoKTtcbiAgICBpbmplY3RhYmxlSWRTZXQuY2xlYXIoKTtcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5jbGVhcigpO1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5jbGVhcigpO1xuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5jbGVhcigpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5jbGVhcigpO1xuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAuY2xlYXIoKTtcbiAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSBudWxsO1xuICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9IG51bGw7XG4gICAgc3luY0luamVjdFdpcmluZygpO1xuICB9O1xuXG4gIC8vIFRoZSBpbW1lZGlhdGUgcGFyZW50IGlzIHRoZSBsYXN0IHJlZ2lzdHJhdGlvbiBjb250ZXh0IGl0ZW07IGEgbWlzc2luZ1xuICAvLyBlbnRyeSBvciBhIGNvbnRhaW5lci1sZXZlbCBwYXJlbnQgbm9ybWFsaXplcyB0byByb290SW5qZWN0YWJsZSBzbyB0aGF0XG4gIC8vIHNjb3BlIGNvbXBhcmlzb25zIHdvcmsgdW5pZm9ybWx5IGZvciByb290IGFuZCBuZXN0ZWQgc2NvcGVzLlxuICBjb25zdCBnZXRJbW1lZGlhdGVTY29wZU9mID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmdldChpbmplY3RhYmxlKTtcbiAgICBjb25zdCBpbW1lZGlhdGVQYXJlbnQgPSBjb250ZXh0Py5bY29udGV4dC5sZW5ndGggLSAxXT8uaW5qZWN0YWJsZTtcblxuICAgIHJldHVybiAhaW1tZWRpYXRlUGFyZW50IHx8IGltbWVkaWF0ZVBhcmVudC5hbGlhc1R5cGUgPT09ICdjb250YWluZXInXG4gICAgICA/IHJvb3RJbmplY3RhYmxlXG4gICAgICA6IGltbWVkaWF0ZVBhcmVudDtcbiAgfTtcblxuICBjb25zdCBwcml2YXRlRGkgPSB7XG4gICAgLy8gU3dhcHBlZCBieSBzeW5jSW5qZWN0V2lyaW5nOiB0aGUgZGVjb3JhdGVkIHZhcmlhbnRzIGFyZSB3aXJlZFxuICAgIC8vIGluIG9ubHkgd2hpbGUgYXQgbGVhc3Qgb25lIGluamVjdGlvbiBkZWNvcmF0b3IgaXMgcmVnaXN0ZXJlZCwgc28gdGhlXG4gICAgLy8gY29tbW9uIG5vLWRlY29yYXRvciBjYXNlIHBheXMgbm8gd3JhcHBlciBmcmFtZSBhdCBhbGwuXG4gICAgaW5qZWN0OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICAgIGluamVjdFdpdGhNZXRhOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICAgaW5qZWN0TWFueTogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueVdpdGhNZXRhLFxuXG4gICAgaW5qZWN0RmFjdG9yeTpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3QoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICByZWdpc3RlcjogcHJpdmF0ZVJlZ2lzdGVyLFxuICAgIGRlcmVnaXN0ZXIsXG4gICAgb3ZlcnJpZGUsXG4gICAgb3ZlcnJpZGUyLFxuICAgIGVhcmx5T3ZlcnJpZGUsXG4gICAgZWFybHlPdmVycmlkZTIsXG4gICAgdW5vdmVycmlkZSxcblxuICAgIHJlc2V0OiAoKSA9PiB7XG4gICAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuY2xlYXIoKTtcbiAgICB9LFxuXG4gICAgcGVybWl0U2lkZUVmZmVjdHM6IGFsaWFzID0+IHtcbiAgICAgIGlmIChhbGlhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNpZGVFZmZlY3RzQXJlUHJldmVudGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5mb3JFYWNoKGluamVjdGFibGUgPT5cbiAgICAgICAgaW5qZWN0YWJsZXNXaXRoUGVybWl0dGVkU2lkZUVmZmVjdHMuYWRkKGluamVjdGFibGUpLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgcHVyZ2U6IHB1cmdlSW5zdGFuY2VzLFxuXG4gICAgc2NvcGVkUHVyZ2U6IChzY29wZUluamVjdGFibGUsIGFsaWFzLCAuLi5rZXlQYXJ0cykgPT4ge1xuICAgICAgLy8gV2l0aG91dCBhbiBhbGlhcywgdGhlIHNjb3BlJ3Mgb3duIGluc3RhbmNlcyBhbmQgdGhvc2Ugb2Ygd2hhdGV2ZXIgaXRcbiAgICAgIC8vIHJlZ2lzdGVyZWQgZGlyZWN0bHkuXG4gICAgICBpZiAoYWxpYXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnRNYXAuZ2V0KHNjb3BlSW5qZWN0YWJsZSk7XG5cbiAgICAgICAgcHVyZ2VTdG9yZWRJbnN0YW5jZXMoXG4gICAgICAgICAgY2hpbGRyZW4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBbc2NvcGVJbmplY3RhYmxlXVxuICAgICAgICAgICAgOiBbc2NvcGVJbmplY3RhYmxlLCAuLi5jaGlsZHJlbl0sXG4gICAgICAgICAga2V5UGFydHMsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG4gICAgICBjb25zdCBhbGxvd2VkQ2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50TWFwLmdldChzY29wZUluamVjdGFibGUpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluamVjdGFibGUgPSBpbmplY3RhYmxlc1tpXTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5qZWN0YWJsZSAhPT0gc2NvcGVJbmplY3RhYmxlICYmXG4gICAgICAgICAgIWFsbG93ZWRDaGlsZHJlbj8uaGFzKGluamVjdGFibGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUcmllZCB0byBwdXJnZSBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICAgICl9XCIgZnJvbSBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgc2NvcGVJbmplY3RhYmxlLFxuICAgICAgICAgICAgKX1cIiwgYnV0IGl0IGlzIG5vdCB3aXRoaW4gaXRzIHJlZ2lzdHJhdGlvbiBjb250ZXh0IHRyZWUuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1cmdlU3RvcmVkSW5zdGFuY2VzKGluamVjdGFibGVzLCBrZXlQYXJ0cyk7XG4gICAgfSxcblxuICAgIHB1cmdlQWxsQnV0T3ZlcnJpZGVzLFxuICAgIGhhc1JlZ2lzdHJhdGlvbnM6IGFsaWFzID0+ICEhZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5sZW5ndGgsXG4gICAgZ2V0TnVtYmVyT2ZSZWdpc3RyYXRpb25zOiBhbGlhcyA9PiBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpLmxlbmd0aCxcblxuICAgIHJlZ2lzdGVyZWRJblNjb3BlT2Y6IChzY29wZUluamVjdGFibGUsIGFsaWFzKSA9PlxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5zb21lKFxuICAgICAgICBpbmplY3RhYmxlID0+IGdldEltbWVkaWF0ZVNjb3BlT2YoaW5qZWN0YWJsZSkgPT09IHNjb3BlSW5qZWN0YWJsZSxcbiAgICAgICksXG5cbiAgICByZWdpc3RlcmVkSW5TdWJ0cmVlT2Y6IChzY29wZUluamVjdGFibGUsIGFsaWFzKSA9PlxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5zb21lKGluamVjdGFibGUgPT4ge1xuICAgICAgICBsZXQgc2NvcGUgPSBnZXRJbW1lZGlhdGVTY29wZU9mKGluamVjdGFibGUpO1xuXG4gICAgICAgIHdoaWxlIChzY29wZSAhPT0gc2NvcGVJbmplY3RhYmxlICYmIHNjb3BlICE9PSByb290SW5qZWN0YWJsZSkge1xuICAgICAgICAgIHNjb3BlID0gZ2V0SW1tZWRpYXRlU2NvcGVPZihzY29wZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2NvcGUgPT09IHNjb3BlSW5qZWN0YWJsZTtcbiAgICAgIH0pLFxuXG4gICAgZ2V0TnVtYmVyT2ZJbnN0YW5jZXM6ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaW5qZWN0YWJsZSwgc3RvcmVkXSBvZiBpbnN0YW5jZXNCeUluamVjdGFibGVNYXApIHtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlZElkID0gbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcbiAgICAgICAgaWYgKCFuYW1lc3BhY2VkSWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChpc0NvbXBvc2l0ZVN0b3JhZ2Uoc3RvcmVkKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgXyBvZiBzdG9yZWQudmFsdWVzKCkpIGNvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudCA+IDApIHJlc3VsdFtuYW1lc3BhY2VkSWRdID0gY291bnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG5cbiAgLy8gVGhlIHNsb3RzIHN0YXJ0IG91dCBob2xkaW5nIHRoZSBiYXJlIG9wZXJhdGlvbnM7IHdpcmUgdGhlbSBvbmNlIHVwLWZyb250XG4gIC8vIHNvIGVuZm9yY2VtZW50IGFwcGxpZXMgZXZlbiBpbiBhIGNvbnRhaW5lciB3aGVyZSBub3RoaW5nIGlzIHJlZ2lzdGVyZWQuXG4gIHN5bmNJbmplY3RXaXJpbmcoKTtcblxuICBjb25zdCBwdWJsaWNJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdCh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueSh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiByb290SW5qZWN0YWJsZSxcbiAgICB9KTtcblxuICBjb25zdCBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljRGkgPSB7XG4gICAgLi4ucHJpdmF0ZURpLFxuXG4gICAgaW5qZWN0OiBwdWJsaWNJbmplY3QsXG4gICAgaW5qZWN0V2l0aE1ldGE6IHB1YmxpY0luamVjdFdpdGhNZXRhLFxuICAgIGluamVjdE1hbnk6IHB1YmxpY0luamVjdE1hbnksXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEsXG5cbiAgICBpbmplY3QyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdChhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIGluamVjdE1hbnkyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdE1hbnkoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICAvLyBSZXNvbHZlcyBwZXIgY2FsbCBsaWtlIGluamVjdE1hbnksIGJ1dCB1bndyYXBzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb3JcbiAgICAvLyB1bmRlZmluZWQgXHUyMDE0IHRoZSAnemVyby1vci1vbmUnIHVwcGVyIGJvdW5kIGd1YXJhbnRlZXMgYXQgbW9zdCBvbmUuXG4gICAgaW5qZWN0TWF5YmUyOiBhbGlhcyA9PiB7XG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHkoYWxpYXMsIHJvb3RJbmplY3RhYmxlKTtcblxuICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHB1YmxpY0luamVjdE1hbnkoYWxpYXMsIC4uLnBhcmFtcylbMF07XG4gICAgfSxcblxuICAgIGluamVjdFdpdGhNZXRhMjpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3RXaXRoTWV0YShhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIGluamVjdE1hbnlXaXRoTWV0YTI6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgcHVibGljSW5qZWN0TWFueVdpdGhNZXRhKGFsaWFzLCAuLi5wYXJhbXMpLFxuXG4gICAgLy8gaW5qZWN0TWF5YmUyIG92ZXIgdGhlIHdpdGgtbWV0YSBwbGFuZTogdW53cmFwcyB0byB0aGUgc2luZ2xlXG4gICAgLy8gbWV0YS13cmFwcGVkIGluc3RhbmNlIG9yIHVuZGVmaW5lZC5cbiAgICBpbmplY3RNYXliZVdpdGhNZXRhMjogYWxpYXMgPT4ge1xuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCByb290SW5qZWN0YWJsZSk7XG5cbiAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEoYWxpYXMsIC4uLnBhcmFtcylbMF07XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIHByaXZhdGVEaS5yZWdpc3Rlcih7XG4gICAgICAgIGluamVjdGFibGVzLFxuICAgICAgICBjb250ZXh0OiBbY29udGFpbmVyUm9vdENvbnRleHRJdGVtXSxcbiAgICAgICAgc291cmNlOiByb290SW5qZWN0YWJsZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBkZXJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIHByaXZhdGVEaS5kZXJlZ2lzdGVyKHtcbiAgICAgICAgaW5qZWN0YWJsZXMsXG4gICAgICAgIGNvbnRleHQ6IFtjb250YWluZXJSb290Q29udGV4dEl0ZW1dLFxuICAgICAgICBzb3VyY2U6IHJvb3RJbmplY3RhYmxlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGU6IGFsaWFzID0+XG4gICAgICBwcml2YXRlRGkucmVnaXN0ZXJlZEluU2NvcGVPZihyb290SW5qZWN0YWJsZSwgYWxpYXMpLFxuXG4gICAgdmFsaWRhdGU6IHZhbGlkYXRlRm9yKHtcbiAgICAgIGNvbnRhaW5lcklkLFxuICAgICAgaW5qZWN0YWJsZVNldCxcbiAgICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICB9KSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGVTdWJ0cmVlOiBhbGlhcyA9PlxuICAgICAgcHJpdmF0ZURpLnJlZ2lzdGVyZWRJblN1YnRyZWVPZihyb290SW5qZWN0YWJsZSwgYWxpYXMpLFxuICB9O1xuXG4gIHJldHVybiBwdWJsaWNEaTtcbn07XG4iLCAiaW1wb3J0IHsgaWRlbnRpdHksIGNvbnN0YW50IH0gZnJvbSAnbG9kYXNoL2ZwJztcblxuZXhwb3J0IGNvbnN0IGdldFR5cGVkU3BlY2lmaWVyID0gY29uc3RhbnQoaWRlbnRpdHkpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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QUFBQSxRQUNqQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSxZQUFZLElBQUksZ0JBQWdCO0FBQzlCLGdCQUFVLFdBQVc7QUFBQSxRQUNuQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSx3QkFBd0IsV0FDdEIsVUFBVSxvQkFBb0IsZ0JBQWdCLEtBQUs7QUFBQSxJQUVyRCxVQUFVLFlBQVk7QUFBQSxNQUNwQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUVELCtCQUErQixXQUM3QixVQUFVLHNCQUFzQixnQkFBZ0IsS0FBSztBQUFBLEVBQ3pEO0FBRUEsU0FBTztBQUNUOzs7QUNub0JBLGdCQUFtQztBQUU1QixJQUFNLHdCQUFvQixvQkFBUyxrQkFBUTs7O0F6Q3NCM0MsSUFBTSxnQ0FBZ0M7IiwKICAibmFtZXMiOiBbImluc3RhbnRpYXRlIiwgImNoaWxkTWFwIiwgImRlbGV0ZWQiLCAibWluaW1hbERpIiwgIm5ld0luc3RhbmNlIiwgImNhbGxiYWNrcyIsICJFTVBUWSJdCn0K
|