@decaf-ts/for-typeorm 0.0.9 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/for-typeorm.cjs +368 -42
- package/dist/for-typeorm.esm.cjs +367 -41
- package/lib/TypeORMAdapter.cjs +50 -20
- package/lib/TypeORMAdapter.d.ts +2 -2
- package/lib/decorators.cjs +109 -0
- package/lib/decorators.d.ts +28 -0
- package/lib/esm/TypeORMAdapter.d.ts +2 -2
- package/lib/esm/TypeORMAdapter.js +47 -17
- package/lib/esm/decorators.d.ts +28 -0
- package/lib/esm/decorators.js +103 -0
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/overrides/Column.js +3 -3
- package/lib/esm/overrides/CreateDateColumn.js +3 -3
- package/lib/esm/overrides/ManyToMany.d.ts +13 -0
- package/lib/esm/overrides/ManyToMany.js +45 -0
- package/lib/esm/overrides/ManyToOne.d.ts +13 -0
- package/lib/esm/overrides/ManyToOne.js +45 -0
- package/lib/esm/overrides/OneToMany.d.ts +7 -0
- package/lib/esm/overrides/OneToMany.js +36 -0
- package/lib/esm/overrides/OneToOne.d.ts +11 -0
- package/lib/esm/overrides/OneToOne.js +44 -0
- package/lib/esm/overrides/PrimaryColumn.js +3 -3
- package/lib/esm/overrides/PrimaryGeneratedColumn.js +3 -3
- package/lib/esm/overrides/UpdateDateColumn.js +3 -3
- package/lib/esm/overrides/utils.d.ts +3 -1
- package/lib/esm/overrides/utils.js +56 -12
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/overrides/Column.cjs +3 -3
- package/lib/overrides/CreateDateColumn.cjs +3 -3
- package/lib/overrides/ManyToMany.cjs +48 -0
- package/lib/overrides/ManyToMany.d.ts +13 -0
- package/lib/overrides/ManyToOne.cjs +48 -0
- package/lib/overrides/ManyToOne.d.ts +13 -0
- package/lib/overrides/OneToMany.cjs +39 -0
- package/lib/overrides/OneToMany.d.ts +7 -0
- package/lib/overrides/OneToOne.cjs +47 -0
- package/lib/overrides/OneToOne.d.ts +11 -0
- package/lib/overrides/PrimaryColumn.cjs +3 -3
- package/lib/overrides/PrimaryGeneratedColumn.cjs +3 -3
- package/lib/overrides/UpdateDateColumn.cjs +3 -3
- package/lib/overrides/utils.cjs +57 -12
- package/lib/overrides/utils.d.ts +3 -1
- package/package.json +1 -1
package/dist/for-typeorm.cjs
CHANGED
|
@@ -1198,11 +1198,38 @@
|
|
|
1198
1198
|
return pattern;
|
|
1199
1199
|
}
|
|
1200
1200
|
|
|
1201
|
-
function
|
|
1201
|
+
function extractForRelations(target, property, columns) {
|
|
1202
|
+
let index = 0;
|
|
1203
|
+
const cols = columns.filter((c, i) => {
|
|
1204
|
+
index = i;
|
|
1205
|
+
return c.target === target && c.propertyName === property;
|
|
1206
|
+
});
|
|
1207
|
+
if (!cols.length)
|
|
1208
|
+
return {};
|
|
1209
|
+
columns.splice(index, 1);
|
|
1210
|
+
return Object.entries(cols[0].options).reduce((accum, [key, val]) => {
|
|
1211
|
+
switch (key) {
|
|
1212
|
+
case "nullable":
|
|
1213
|
+
accum[key] = val;
|
|
1214
|
+
break;
|
|
1215
|
+
case decoratorValidation.ValidationKeys.TYPE:
|
|
1216
|
+
// do nothing
|
|
1217
|
+
break;
|
|
1218
|
+
default:
|
|
1219
|
+
throw new core.UnsupportedError(`Unsupported option for a relation: ${key}`);
|
|
1220
|
+
}
|
|
1221
|
+
return accum;
|
|
1222
|
+
}, {});
|
|
1223
|
+
}
|
|
1224
|
+
function aggregateOrNewColumn(target, property, columns, options = {}, mode = "regular", relations) {
|
|
1202
1225
|
const cols = columns.filter((c) => c.target === target && c.propertyName === property);
|
|
1226
|
+
const rels = relations.filter((c) => c.target === target && c.propertyName === property);
|
|
1203
1227
|
if (cols.length > 1)
|
|
1204
|
-
throw new
|
|
1205
|
-
if (
|
|
1228
|
+
throw new dbDecorators.InternalError(`Multiple columns for ${property} found for given target: ${columns.map((c) => c.propertyName).join(", ")}`);
|
|
1229
|
+
if (rels.length > 1)
|
|
1230
|
+
throw new dbDecorators.InternalError(`Multiple relations for ${property} found for given target: ${rels.map((c) => c.propertyName).join(", ")}`);
|
|
1231
|
+
let column;
|
|
1232
|
+
if (cols.length === 0 && !rels.length) {
|
|
1206
1233
|
columns.push({
|
|
1207
1234
|
target: target,
|
|
1208
1235
|
propertyName: property,
|
|
@@ -1211,20 +1238,33 @@
|
|
|
1211
1238
|
});
|
|
1212
1239
|
return;
|
|
1213
1240
|
}
|
|
1214
|
-
|
|
1241
|
+
else if (!rels.length) {
|
|
1242
|
+
column = cols[0];
|
|
1243
|
+
if (mode !== "regular")
|
|
1244
|
+
Object.defineProperty(column, "mode", {
|
|
1245
|
+
value: mode,
|
|
1246
|
+
writable: true,
|
|
1247
|
+
enumerable: true,
|
|
1248
|
+
configurable: true,
|
|
1249
|
+
});
|
|
1250
|
+
}
|
|
1251
|
+
if (rels.length)
|
|
1252
|
+
options = Object.entries(options).reduce((accum, [key, val]) => {
|
|
1253
|
+
switch (key) {
|
|
1254
|
+
case "nullable":
|
|
1255
|
+
accum[key] = val;
|
|
1256
|
+
break;
|
|
1257
|
+
// do nothing
|
|
1258
|
+
}
|
|
1259
|
+
return accum;
|
|
1260
|
+
}, {});
|
|
1261
|
+
column = column || rels[0];
|
|
1215
1262
|
Object.defineProperty(column, "options", {
|
|
1216
1263
|
value: { ...column.options, ...options },
|
|
1217
1264
|
writable: true,
|
|
1218
1265
|
enumerable: true,
|
|
1219
1266
|
configurable: true,
|
|
1220
1267
|
});
|
|
1221
|
-
if (mode !== "regular")
|
|
1222
|
-
Object.defineProperty(column, "mode", {
|
|
1223
|
-
value: mode,
|
|
1224
|
-
writable: true,
|
|
1225
|
-
enumerable: true,
|
|
1226
|
-
configurable: true,
|
|
1227
|
-
});
|
|
1228
1268
|
}
|
|
1229
1269
|
|
|
1230
1270
|
/**
|
|
@@ -1280,8 +1320,8 @@
|
|
|
1280
1320
|
target: object.constructor,
|
|
1281
1321
|
columns: [propertyName],
|
|
1282
1322
|
});
|
|
1283
|
-
const
|
|
1284
|
-
aggregateOrNewColumn(object.constructor, propertyName, columns, options);
|
|
1323
|
+
const metadata = typeorm.getMetadataArgsStorage();
|
|
1324
|
+
aggregateOrNewColumn(object.constructor, propertyName, metadata.columns, options, "regular", metadata.relations);
|
|
1285
1325
|
if (options.generated) {
|
|
1286
1326
|
typeorm.getMetadataArgsStorage().generations.push({
|
|
1287
1327
|
target: object.constructor,
|
|
@@ -1297,15 +1337,15 @@
|
|
|
1297
1337
|
|
|
1298
1338
|
function UpdateDateColumn(options) {
|
|
1299
1339
|
return function (object, propertyName) {
|
|
1300
|
-
const
|
|
1301
|
-
aggregateOrNewColumn(object.constructor, propertyName, columns, {}, "updateDate");
|
|
1340
|
+
const metadata = typeorm.getMetadataArgsStorage();
|
|
1341
|
+
aggregateOrNewColumn(object.constructor, propertyName, metadata.columns, {}, "updateDate", metadata.relations);
|
|
1302
1342
|
};
|
|
1303
1343
|
}
|
|
1304
1344
|
|
|
1305
1345
|
function CreateDateColumn(options) {
|
|
1306
1346
|
return function (object, propertyName) {
|
|
1307
|
-
const
|
|
1308
|
-
aggregateOrNewColumn(object.constructor, propertyName, columns, {}, "createDate");
|
|
1347
|
+
const metadata = typeorm.getMetadataArgsStorage();
|
|
1348
|
+
aggregateOrNewColumn(object.constructor, propertyName, metadata.columns, {}, "createDate", metadata.relations);
|
|
1309
1349
|
};
|
|
1310
1350
|
}
|
|
1311
1351
|
|
|
@@ -1341,6 +1381,165 @@
|
|
|
1341
1381
|
}
|
|
1342
1382
|
}
|
|
1343
1383
|
|
|
1384
|
+
/**
|
|
1385
|
+
* One-to-one relation allows the creation of a direct relation between two entities. Entity1 has only one Entity2.
|
|
1386
|
+
* Entity1 is the owner of the relationship, and stores Entity2 id on its own side.
|
|
1387
|
+
*/
|
|
1388
|
+
function OneToOne(typeFunctionOrTarget, inverseSideOrOptions, options) {
|
|
1389
|
+
// normalize parameters
|
|
1390
|
+
let inverseSideProperty;
|
|
1391
|
+
if (ObjectUtils.isObject(inverseSideOrOptions)) {
|
|
1392
|
+
options = inverseSideOrOptions;
|
|
1393
|
+
}
|
|
1394
|
+
else {
|
|
1395
|
+
inverseSideProperty = inverseSideOrOptions;
|
|
1396
|
+
}
|
|
1397
|
+
return function (object, propertyName) {
|
|
1398
|
+
if (!options)
|
|
1399
|
+
options = {};
|
|
1400
|
+
// now try to determine it its lazy relation
|
|
1401
|
+
let isLazy = options && options.lazy === true ? true : false;
|
|
1402
|
+
if (!isLazy && Reflect && Reflect.getMetadata) {
|
|
1403
|
+
// automatic determination
|
|
1404
|
+
const reflectedType = Reflect.getMetadata("design:type", object, propertyName);
|
|
1405
|
+
if (reflectedType &&
|
|
1406
|
+
typeof reflectedType.name === "string" &&
|
|
1407
|
+
reflectedType.name.toLowerCase() === "promise")
|
|
1408
|
+
isLazy = true;
|
|
1409
|
+
}
|
|
1410
|
+
const meta = typeorm.getMetadataArgsStorage();
|
|
1411
|
+
options = Object.assign(options, extractForRelations(object.constructor, propertyName, meta.columns));
|
|
1412
|
+
meta.relations.push({
|
|
1413
|
+
target: object.constructor,
|
|
1414
|
+
propertyName: propertyName,
|
|
1415
|
+
// propertyType: reflectedType,
|
|
1416
|
+
isLazy: isLazy,
|
|
1417
|
+
relationType: "one-to-one",
|
|
1418
|
+
type: typeFunctionOrTarget,
|
|
1419
|
+
inverseSideProperty: inverseSideProperty,
|
|
1420
|
+
options: options,
|
|
1421
|
+
});
|
|
1422
|
+
};
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
/**
|
|
1426
|
+
* A one-to-many relation allows creating the type of relation where Entity1 can have multiple instances of Entity2,
|
|
1427
|
+
* but Entity2 has only one Entity1. Entity2 is the owner of the relationship, and stores the id of Entity1 on its
|
|
1428
|
+
* side of the relation.
|
|
1429
|
+
*/
|
|
1430
|
+
function OneToMany(typeFunctionOrTarget, inverseSide, options) {
|
|
1431
|
+
return function (object, propertyName) {
|
|
1432
|
+
if (!options)
|
|
1433
|
+
options = {};
|
|
1434
|
+
// Now try to determine if it is a lazy relation.
|
|
1435
|
+
let isLazy = options && options.lazy === true;
|
|
1436
|
+
if (!isLazy && Reflect && Reflect.getMetadata) {
|
|
1437
|
+
// automatic determination
|
|
1438
|
+
const reflectedType = Reflect.getMetadata("design:type", object, propertyName);
|
|
1439
|
+
if (reflectedType &&
|
|
1440
|
+
typeof reflectedType.name === "string" &&
|
|
1441
|
+
reflectedType.name.toLowerCase() === "promise")
|
|
1442
|
+
isLazy = true;
|
|
1443
|
+
}
|
|
1444
|
+
const meta = typeorm.getMetadataArgsStorage();
|
|
1445
|
+
options = Object.assign(options, extractForRelations(object.constructor, propertyName, meta.columns));
|
|
1446
|
+
meta.relations.push({
|
|
1447
|
+
target: object.constructor,
|
|
1448
|
+
propertyName: propertyName,
|
|
1449
|
+
// propertyType: reflectedType,
|
|
1450
|
+
isLazy: isLazy,
|
|
1451
|
+
relationType: "one-to-many",
|
|
1452
|
+
type: typeFunctionOrTarget,
|
|
1453
|
+
inverseSideProperty: inverseSide,
|
|
1454
|
+
options: options,
|
|
1455
|
+
});
|
|
1456
|
+
};
|
|
1457
|
+
}
|
|
1458
|
+
|
|
1459
|
+
/**
|
|
1460
|
+
* A many-to-one relation allows creating the type of relation where Entity1 can have a single instance of Entity2, but
|
|
1461
|
+
* Entity2 can have multiple instances of Entity1. Entity1 is the owner of the relationship, and stores the id of
|
|
1462
|
+
* Entity2 on its side of the relation.
|
|
1463
|
+
*/
|
|
1464
|
+
function ManyToOne(typeFunctionOrTarget, inverseSideOrOptions, options) {
|
|
1465
|
+
// Normalize parameters.
|
|
1466
|
+
let inverseSideProperty;
|
|
1467
|
+
if (ObjectUtils.isObject(inverseSideOrOptions)) {
|
|
1468
|
+
options = inverseSideOrOptions;
|
|
1469
|
+
}
|
|
1470
|
+
else {
|
|
1471
|
+
inverseSideProperty = inverseSideOrOptions;
|
|
1472
|
+
}
|
|
1473
|
+
return function (object, propertyName) {
|
|
1474
|
+
if (!options)
|
|
1475
|
+
options = {};
|
|
1476
|
+
// Now try to determine if it is a lazy relation.
|
|
1477
|
+
let isLazy = options && options.lazy === true;
|
|
1478
|
+
if (!isLazy && Reflect && Reflect.getMetadata) {
|
|
1479
|
+
// automatic determination
|
|
1480
|
+
const reflectedType = Reflect.getMetadata("design:type", object, propertyName);
|
|
1481
|
+
if (reflectedType &&
|
|
1482
|
+
typeof reflectedType.name === "string" &&
|
|
1483
|
+
reflectedType.name.toLowerCase() === "promise")
|
|
1484
|
+
isLazy = true;
|
|
1485
|
+
}
|
|
1486
|
+
const meta = typeorm.getMetadataArgsStorage();
|
|
1487
|
+
options = Object.assign(options, extractForRelations(object.constructor, propertyName, meta.columns));
|
|
1488
|
+
meta.relations.push({
|
|
1489
|
+
target: object.constructor,
|
|
1490
|
+
propertyName: propertyName,
|
|
1491
|
+
// propertyType: reflectedType,
|
|
1492
|
+
relationType: "many-to-one",
|
|
1493
|
+
isLazy: isLazy,
|
|
1494
|
+
type: typeFunctionOrTarget,
|
|
1495
|
+
inverseSideProperty: inverseSideProperty,
|
|
1496
|
+
options: options,
|
|
1497
|
+
});
|
|
1498
|
+
};
|
|
1499
|
+
}
|
|
1500
|
+
|
|
1501
|
+
/**
|
|
1502
|
+
* Many-to-many is a type of relationship when Entity1 can have multiple instances of Entity2, and Entity2 can have
|
|
1503
|
+
* multiple instances of Entity1. To achieve it, this type of relation creates a junction table, where it storage
|
|
1504
|
+
* entity1 and entity2 ids. This is owner side of the relationship.
|
|
1505
|
+
*/
|
|
1506
|
+
function ManyToMany(typeFunctionOrTarget, inverseSideOrOptions, options) {
|
|
1507
|
+
// normalize parameters
|
|
1508
|
+
let inverseSideProperty;
|
|
1509
|
+
if (ObjectUtils.isObject(inverseSideOrOptions)) {
|
|
1510
|
+
options = inverseSideOrOptions;
|
|
1511
|
+
}
|
|
1512
|
+
else {
|
|
1513
|
+
inverseSideProperty = inverseSideOrOptions;
|
|
1514
|
+
}
|
|
1515
|
+
return function (object, propertyName) {
|
|
1516
|
+
if (!options)
|
|
1517
|
+
options = {};
|
|
1518
|
+
// now try to determine it its lazy relation
|
|
1519
|
+
let isLazy = options.lazy === true;
|
|
1520
|
+
if (!isLazy && Reflect && Reflect.getMetadata) {
|
|
1521
|
+
// automatic determination
|
|
1522
|
+
const reflectedType = Reflect.getMetadata("design:type", object, propertyName);
|
|
1523
|
+
if (reflectedType &&
|
|
1524
|
+
typeof reflectedType.name === "string" &&
|
|
1525
|
+
reflectedType.name.toLowerCase() === "promise")
|
|
1526
|
+
isLazy = true;
|
|
1527
|
+
}
|
|
1528
|
+
const meta = typeorm.getMetadataArgsStorage();
|
|
1529
|
+
options = Object.assign(options, extractForRelations(object.constructor, propertyName, meta.columns));
|
|
1530
|
+
meta.relations.push({
|
|
1531
|
+
target: object.constructor,
|
|
1532
|
+
propertyName: propertyName,
|
|
1533
|
+
// propertyType: reflectedType,
|
|
1534
|
+
relationType: "many-to-many",
|
|
1535
|
+
isLazy: isLazy,
|
|
1536
|
+
type: typeFunctionOrTarget,
|
|
1537
|
+
inverseSideProperty: inverseSideProperty,
|
|
1538
|
+
options: options,
|
|
1539
|
+
});
|
|
1540
|
+
};
|
|
1541
|
+
}
|
|
1542
|
+
|
|
1344
1543
|
/**
|
|
1345
1544
|
* Column decorator is used to mark a specific class property as a table column.
|
|
1346
1545
|
* Only properties decorated with this decorator will be persisted to the database when entity be saved.
|
|
@@ -1378,8 +1577,8 @@
|
|
|
1378
1577
|
}
|
|
1379
1578
|
// explicitly set a primary and generated to column options
|
|
1380
1579
|
options.primary = true;
|
|
1381
|
-
const
|
|
1382
|
-
aggregateOrNewColumn(object.constructor, propertyName, columns, options);
|
|
1580
|
+
const metadata = typeorm.getMetadataArgsStorage();
|
|
1581
|
+
aggregateOrNewColumn(object.constructor, propertyName, metadata.columns, options, "regular", metadata.relations);
|
|
1383
1582
|
// register generated metadata args
|
|
1384
1583
|
typeorm.getMetadataArgsStorage().generations.push({
|
|
1385
1584
|
target: object.constructor,
|
|
@@ -1426,8 +1625,8 @@
|
|
|
1426
1625
|
throw new typeorm.PrimaryColumnCannotBeNullableError(object, propertyName);
|
|
1427
1626
|
// explicitly set a primary to column options
|
|
1428
1627
|
options.primary = true;
|
|
1429
|
-
const
|
|
1430
|
-
aggregateOrNewColumn(object.constructor, propertyName, columns, options);
|
|
1628
|
+
const metadata = typeorm.getMetadataArgsStorage();
|
|
1629
|
+
aggregateOrNewColumn(object.constructor, propertyName, metadata.columns, options, "regular", metadata.relations);
|
|
1431
1630
|
if (options.generated) {
|
|
1432
1631
|
typeorm.getMetadataArgsStorage().generations.push({
|
|
1433
1632
|
target: object.constructor,
|
|
@@ -1464,7 +1663,109 @@
|
|
|
1464
1663
|
};
|
|
1465
1664
|
}
|
|
1466
1665
|
|
|
1467
|
-
|
|
1666
|
+
const ObjectKeySplitter = ".";
|
|
1667
|
+
const BaseKey = "decaf";
|
|
1668
|
+
function getValueBySplitter(obj, path, splitter = ObjectKeySplitter) {
|
|
1669
|
+
const keys = path.split(splitter);
|
|
1670
|
+
let current = obj;
|
|
1671
|
+
for (const key of keys) {
|
|
1672
|
+
if (current === null ||
|
|
1673
|
+
current === undefined ||
|
|
1674
|
+
!Object.prototype.hasOwnProperty.call(current, key))
|
|
1675
|
+
return undefined;
|
|
1676
|
+
current = current[key];
|
|
1677
|
+
}
|
|
1678
|
+
return current;
|
|
1679
|
+
}
|
|
1680
|
+
function setValueBySplitter(obj, path, value, splitter = ObjectKeySplitter) {
|
|
1681
|
+
const keys = path.split(splitter);
|
|
1682
|
+
let current = obj;
|
|
1683
|
+
for (const key of keys) {
|
|
1684
|
+
if (!(key in current)) {
|
|
1685
|
+
current[key] = {};
|
|
1686
|
+
}
|
|
1687
|
+
current = current[key];
|
|
1688
|
+
}
|
|
1689
|
+
current[keys[keys.length - 1]] = value;
|
|
1690
|
+
}
|
|
1691
|
+
class Metadata {
|
|
1692
|
+
static { this._metadata = {}; }
|
|
1693
|
+
static { this.splitter = ObjectKeySplitter; }
|
|
1694
|
+
static { this.baseKey = BaseKey; }
|
|
1695
|
+
static { this.mirror = true; }
|
|
1696
|
+
constructor() { }
|
|
1697
|
+
static getProperties(model) {
|
|
1698
|
+
const meta = this.get(model);
|
|
1699
|
+
if (!meta)
|
|
1700
|
+
return undefined;
|
|
1701
|
+
return Object.keys(meta.properties);
|
|
1702
|
+
}
|
|
1703
|
+
static pk(model) {
|
|
1704
|
+
const meta = this.get(model);
|
|
1705
|
+
if (!meta)
|
|
1706
|
+
return undefined;
|
|
1707
|
+
return Object.keys(meta.pk)[0];
|
|
1708
|
+
}
|
|
1709
|
+
static type(model, prop) {
|
|
1710
|
+
return this.types(model, prop)[0];
|
|
1711
|
+
}
|
|
1712
|
+
static types(model, prop) {
|
|
1713
|
+
let designType = this.get(model, `properties.${prop}`);
|
|
1714
|
+
if (!designType)
|
|
1715
|
+
throw new Error(`Property ${prop} not found in ${model.name}`);
|
|
1716
|
+
designType = [designType];
|
|
1717
|
+
const symbol = Symbol.for(model.toString());
|
|
1718
|
+
if (this._metadata[symbol]) {
|
|
1719
|
+
const meta = this._metadata[symbol];
|
|
1720
|
+
if (meta.validation) {
|
|
1721
|
+
const validation = meta.validation;
|
|
1722
|
+
if (validation[decoratorValidation.ValidationKeys.TYPE])
|
|
1723
|
+
designType = designType.concat(validation[decoratorValidation.ValidationKeys.TYPE]);
|
|
1724
|
+
}
|
|
1725
|
+
}
|
|
1726
|
+
return designType.filter(Boolean);
|
|
1727
|
+
}
|
|
1728
|
+
static get(model, key) {
|
|
1729
|
+
const symbol = Symbol.for(model.toString());
|
|
1730
|
+
if (!this._metadata[symbol])
|
|
1731
|
+
return undefined;
|
|
1732
|
+
if (!key)
|
|
1733
|
+
return this._metadata[symbol];
|
|
1734
|
+
return getValueBySplitter(this._metadata[symbol], key, this.splitter);
|
|
1735
|
+
}
|
|
1736
|
+
static set(model, key, value) {
|
|
1737
|
+
const symbol = Symbol.for(model.toString());
|
|
1738
|
+
if (!this._metadata[symbol])
|
|
1739
|
+
this._metadata[symbol] = {};
|
|
1740
|
+
if (this.mirror &&
|
|
1741
|
+
!Object.prototype.hasOwnProperty.call(model, this.baseKey)) {
|
|
1742
|
+
Object.defineProperty(model, this.baseKey, {
|
|
1743
|
+
enumerable: false,
|
|
1744
|
+
configurable: false,
|
|
1745
|
+
writable: false,
|
|
1746
|
+
value: this._metadata[symbol],
|
|
1747
|
+
});
|
|
1748
|
+
}
|
|
1749
|
+
setValueBySplitter(this._metadata[symbol], key, value, this.splitter);
|
|
1750
|
+
}
|
|
1751
|
+
}
|
|
1752
|
+
function assign(key, value) {
|
|
1753
|
+
return function assign(model,
|
|
1754
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1755
|
+
prop,
|
|
1756
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1757
|
+
descriptor) {
|
|
1758
|
+
Metadata.set(model, key, value);
|
|
1759
|
+
};
|
|
1760
|
+
}
|
|
1761
|
+
function property() {
|
|
1762
|
+
return function property(model, prop) {
|
|
1763
|
+
const designType = Reflect.getOwnMetadata(decoratorValidation.ModelKeys.TYPE, model, prop);
|
|
1764
|
+
return assign(`property.${prop}`, designType)(model, prop);
|
|
1765
|
+
};
|
|
1766
|
+
}
|
|
1767
|
+
|
|
1768
|
+
async function createdByOnTypeORMCreateUpdate(context, data, key, model) {
|
|
1468
1769
|
try {
|
|
1469
1770
|
const user = context.get("user");
|
|
1470
1771
|
model[key] = user;
|
|
@@ -2245,6 +2546,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
|
|
|
2245
2546
|
}
|
|
2246
2547
|
}
|
|
2247
2548
|
static decoration() {
|
|
2549
|
+
super.decoration();
|
|
2248
2550
|
// @table() => @Entity()
|
|
2249
2551
|
const tableKey = core.Adapter.key(core.PersistenceKeys.TABLE);
|
|
2250
2552
|
decoratorValidation.Decoration.flavouredAs(TypeORMFlavour)
|
|
@@ -2254,12 +2556,13 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
|
|
|
2254
2556
|
// @pk() => @PrimaryGeneratedColumn() | @PrimaryColumn()
|
|
2255
2557
|
const pkKey = core.Repository.key(dbDecorators.DBKeys.ID);
|
|
2256
2558
|
function pkDec(options) {
|
|
2257
|
-
const decorators = [
|
|
2258
|
-
decoratorValidation.required(),
|
|
2259
|
-
dbDecorators.readonly(),
|
|
2260
|
-
decoratorValidation.propMetadata(pkKey, options),
|
|
2261
|
-
];
|
|
2262
2559
|
return function pkDec(original, prop) {
|
|
2560
|
+
const decorators = [
|
|
2561
|
+
decoratorValidation.required(),
|
|
2562
|
+
dbDecorators.readonly(),
|
|
2563
|
+
decoratorValidation.propMetadata(pkKey, options),
|
|
2564
|
+
assign(`pk.${prop}`, options),
|
|
2565
|
+
];
|
|
2263
2566
|
let type = options.type || reflection.Reflection.getTypeFromDecorator(original, prop);
|
|
2264
2567
|
if (!type)
|
|
2265
2568
|
throw new dbDecorators.InternalError(`Missing type information for property ${prop} of ${original.name}`);
|
|
@@ -2297,6 +2600,10 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
|
|
|
2297
2600
|
decorator: pkDec,
|
|
2298
2601
|
})
|
|
2299
2602
|
.apply();
|
|
2603
|
+
decoratorValidation.Decoration.flavouredAs(TypeORMFlavour)
|
|
2604
|
+
.for(decoratorValidation.ModelKeys.ATTRIBUTE)
|
|
2605
|
+
.extend(property())
|
|
2606
|
+
.apply();
|
|
2300
2607
|
// @column("columnName") => @Column({name: "columnName"})
|
|
2301
2608
|
const columnKey = core.Adapter.key(core.PersistenceKeys.COLUMN);
|
|
2302
2609
|
decoratorValidation.Decoration.flavouredAs(TypeORMFlavour)
|
|
@@ -2304,10 +2611,14 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
|
|
|
2304
2611
|
.extend({
|
|
2305
2612
|
decorator: function columm(name) {
|
|
2306
2613
|
return function column(obj, prop) {
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2614
|
+
const opts = {};
|
|
2615
|
+
if (name)
|
|
2616
|
+
opts.name = name;
|
|
2617
|
+
const pk = Metadata.get(obj, "pk");
|
|
2618
|
+
if (pk !== prop) {
|
|
2619
|
+
opts.nullable = true;
|
|
2620
|
+
}
|
|
2621
|
+
return Column(opts)(obj, prop);
|
|
2311
2622
|
};
|
|
2312
2623
|
},
|
|
2313
2624
|
transform: (args) => {
|
|
@@ -2401,7 +2712,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
|
|
|
2401
2712
|
String.name,
|
|
2402
2713
|
Number.name,
|
|
2403
2714
|
BigInt.name,
|
|
2404
|
-
]), decoratorValidation.propMetadata(oneToOneKey, metadata),
|
|
2715
|
+
]), decoratorValidation.propMetadata(oneToOneKey, metadata), OneToOne(() => {
|
|
2405
2716
|
if (!clazz.name)
|
|
2406
2717
|
clazz = clazz();
|
|
2407
2718
|
if (!clazz[decoratorValidation.ModelKeys.ANCHOR])
|
|
@@ -2434,7 +2745,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
|
|
|
2434
2745
|
nullable: true,
|
|
2435
2746
|
eager: populate,
|
|
2436
2747
|
};
|
|
2437
|
-
return
|
|
2748
|
+
return OneToMany(() => {
|
|
2438
2749
|
if (!clazz.name)
|
|
2439
2750
|
clazz = clazz();
|
|
2440
2751
|
if (!clazz[decoratorValidation.ModelKeys.ANCHOR])
|
|
@@ -2448,10 +2759,12 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
|
|
|
2448
2759
|
const decs = reflection.Reflection.getPropertyDecorators(core.Repository.key(core.PersistenceKeys.MANY_TO_ONE), m, k, true);
|
|
2449
2760
|
if (!decs || !decs.decorators || !decs.decorators.length)
|
|
2450
2761
|
return false;
|
|
2451
|
-
const
|
|
2452
|
-
|
|
2453
|
-
|
|
2454
|
-
|
|
2762
|
+
const dec = decs.decorators[0];
|
|
2763
|
+
const clazz = typeof dec.props.class === "function" &&
|
|
2764
|
+
!dec.props.class.name
|
|
2765
|
+
? dec.props.class()
|
|
2766
|
+
: dec.props.class;
|
|
2767
|
+
return clazz.name === obj.constructor.name;
|
|
2455
2768
|
});
|
|
2456
2769
|
if (!crossRelationKey)
|
|
2457
2770
|
throw new dbDecorators.InternalError(`Cross relation not found. Did you use @manyToOne on the ${clazz.name}?`);
|
|
@@ -2485,7 +2798,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
|
|
|
2485
2798
|
Number.name,
|
|
2486
2799
|
BigInt.name,
|
|
2487
2800
|
]), decoratorValidation.propMetadata(manyToOneKey, metadata), function ManyToOneWrapper(obj, prop) {
|
|
2488
|
-
return
|
|
2801
|
+
return ManyToOne(() => {
|
|
2489
2802
|
if (!clazz.name)
|
|
2490
2803
|
clazz = clazz();
|
|
2491
2804
|
if (!clazz[decoratorValidation.ModelKeys.ANCHOR])
|
|
@@ -2532,7 +2845,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
|
|
|
2532
2845
|
nullable: true,
|
|
2533
2846
|
eager: populate,
|
|
2534
2847
|
};
|
|
2535
|
-
return reflection.apply(decoratorValidation.prop(core.PersistenceKeys.RELATIONS), decoratorValidation.list(clazz), decoratorValidation.propMetadata(manyToManyKey, metadata),
|
|
2848
|
+
return reflection.apply(decoratorValidation.prop(core.PersistenceKeys.RELATIONS), decoratorValidation.list(clazz), decoratorValidation.propMetadata(manyToManyKey, metadata), ManyToMany(() => {
|
|
2536
2849
|
if (!clazz.name)
|
|
2537
2850
|
clazz = clazz();
|
|
2538
2851
|
if (!clazz[decoratorValidation.ModelKeys.ANCHOR])
|
|
@@ -2547,6 +2860,18 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
|
|
|
2547
2860
|
},
|
|
2548
2861
|
})
|
|
2549
2862
|
.apply();
|
|
2863
|
+
const createdByKey = core.Repository.key(core.PersistenceKeys.CREATED_BY);
|
|
2864
|
+
const updatedByKey = core.Repository.key(core.PersistenceKeys.UPDATED_BY);
|
|
2865
|
+
decoratorValidation.Decoration.flavouredAs(TypeORMFlavour)
|
|
2866
|
+
.for(createdByKey)
|
|
2867
|
+
.define(dbDecorators.onCreate(createdByOnTypeORMCreateUpdate, {}), decoratorValidation.required(), decoratorValidation.propMetadata(createdByKey, {})
|
|
2868
|
+
// assign(`pk.${prop}`, options)
|
|
2869
|
+
)
|
|
2870
|
+
.apply();
|
|
2871
|
+
decoratorValidation.Decoration.flavouredAs(TypeORMFlavour)
|
|
2872
|
+
.for(updatedByKey)
|
|
2873
|
+
.define(dbDecorators.onCreateUpdate(createdByOnTypeORMCreateUpdate, {}), decoratorValidation.required(), decoratorValidation.propMetadata(updatedByKey, {}))
|
|
2874
|
+
.apply();
|
|
2550
2875
|
}
|
|
2551
2876
|
}
|
|
2552
2877
|
tslib.__decorate([
|
|
@@ -2579,6 +2904,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
|
|
|
2579
2904
|
tslib.__metadata("design:paramtypes", [Object]),
|
|
2580
2905
|
tslib.__metadata("design:returntype", Promise)
|
|
2581
2906
|
], TypeORMAdapter.prototype, "index", null);
|
|
2907
|
+
core.Adapter.setCurrent(TypeORMFlavour);
|
|
2582
2908
|
|
|
2583
2909
|
TypeORMAdapter.decoration();
|
|
2584
2910
|
/**
|
|
@@ -2592,7 +2918,7 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
|
|
|
2592
2918
|
* @const VERSION
|
|
2593
2919
|
* @memberOf module:for-typeorm
|
|
2594
2920
|
*/
|
|
2595
|
-
const VERSION = "0.0.
|
|
2921
|
+
const VERSION = "0.0.11";
|
|
2596
2922
|
|
|
2597
2923
|
exports.IndexError = IndexError;
|
|
2598
2924
|
exports.TypeORMAdapter = TypeORMAdapter;
|
|
@@ -2608,10 +2934,10 @@ AFTER INSERT OR UPDATE OR DELETE ON ${tableName}
|
|
|
2608
2934
|
exports.TypeORMStatement = TypeORMStatement;
|
|
2609
2935
|
exports.VERSION = VERSION;
|
|
2610
2936
|
exports.convertJsRegexToPostgres = convertJsRegexToPostgres;
|
|
2611
|
-
exports.
|
|
2937
|
+
exports.createdByOnTypeORMCreateUpdate = createdByOnTypeORMCreateUpdate;
|
|
2612
2938
|
exports.generateIndexes = generateIndexes;
|
|
2613
2939
|
exports.reservedAttributes = reservedAttributes;
|
|
2614
2940
|
exports.translateOperators = translateOperators;
|
|
2615
2941
|
|
|
2616
2942
|
}));
|
|
2617
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLXR5cGVvcm0uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2Vycm9ycy50cyIsIi4uL3NyYy90eXBlcy50cyIsIi4uL3NyYy9xdWVyeS9jb25zdGFudHMudHMiLCIuLi9zcmMvcXVlcnkvUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3F1ZXJ5L3RyYW5zbGF0ZS50cyIsIi4uL3NyYy9xdWVyeS9TdGF0ZW1lbnQudHMiLCIuLi9zcmMvc2VxdWVuY2VzL1NlcXVlbmNlLnRzIiwiLi4vc3JjL2luZGV4ZXMvZ2VuZXJhdG9yLnRzIiwiLi4vc3JjL1R5cGVPUk1SZXBvc2l0b3J5LnRzIiwiLi4vc3JjL1R5cGVPUk1FdmVudFN1YnNjcmliZXIudHMiLCIuLi9zcmMvVHlwZU9STURpc3BhdGNoLnRzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy91dGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9VcGRhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9DcmVhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9PYmplY3RVdGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvUHJpbWFyeUdlbmVyYXRlZENvbHVtbi50cyIsIi4uL3NyYy9vdmVycmlkZXMvUHJpbWFyeUNvbHVtbi50cyIsIi4uL3NyYy9vdmVycmlkZXMvRW50aXR5LnRzIiwiLi4vc3JjL1R5cGVPUk1BZGFwdGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBpZGVudGlmeSByZXNlcnZlZCBhdHRyaWJ1dGVzIGZvciBTUUwgY29udGV4dHMuXG4gKiBAc3VtbWFyeSBNYXRjaGVzIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGNvbmZsaWN0IHdpdGggU1FMIHJlc2VydmVkIGtleXdvcmRzIHRvIHByZXZlbnQgaW52YWxpZCBzY2hlbWEgb3IgcXVlcnkgZ2VuZXJhdGlvbi5cbiAqIEBjb25zdCByZXNlcnZlZEF0dHJpYnV0ZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2VydmVkQXR0cmlidXRlcyA9XG4gIC9eKHNlbGVjdHxmcm9tfHdoZXJlfGFuZHxvcnxpbnNlcnR8dXBkYXRlfGRlbGV0ZXxkcm9wfGNyZWF0ZXx0YWJsZXxpbmRleHxwcmltYXJ5fGtleXxmb3JlaWdufHJlZmVyZW5jZXN8Y29uc3RyYWludHx1bmlxdWV8Y2hlY2t8ZGVmYXVsdHxudWxsfG5vdHxhc3xvcmRlcnxieXxncm91cHxoYXZpbmd8bGltaXR8b2Zmc2V0fGpvaW58aW5uZXJ8b3V0ZXJ8bGVmdHxyaWdodHxmdWxsfG9ufHVzaW5nfHZhbHVlc3xyZXR1cm5pbmd8c2V0fGludG98Y2FzZXx3aGVufHRoZW58ZWxzZXxlbmR8Y2FzdHxjb2FsZXNjZXxleGlzdHN8YW55fGFsbHxzb21lfGlufGJldHdlZW58bGlrZXxpbGlrZXxzaW1pbGFyfHRvfGlzfHRydWV8ZmFsc2V8YXNjfGRlc2N8ZGlzdGluY3R8dW5pb258aW50ZXJzZWN0fGV4Y2VwdHxuYXR1cmFsfGxhdGVyYWx8d2luZG93fG92ZXJ8cGFydGl0aW9ufHJhbmdlfHJvd3N8dW5ib3VuZGVkfHByZWNlZGluZ3xmb2xsb3dpbmd8Y3VycmVudHxyb3d8d2l0aHxyZWN1cnNpdmV8bWF0ZXJpYWxpemVkfHZpZXd8ZnVuY3Rpb258dHJpZ2dlcnxwcm9jZWR1cmV8bGFuZ3VhZ2V8cmV0dXJuc3xyZXR1cm58ZGVjbGFyZXxiZWdpbnxjb21taXR8cm9sbGJhY2t8c2F2ZXBvaW50fHRyYW5zYWN0aW9ufHRlbXBvcmFyeXx0ZW1wfGlmfGxvb3B8d2hpbGV8Zm9yfGNvbnRpbnVlfGV4aXR8cmFpc2V8ZXhjZXB0aW9ufG5vdGljZXxpbmZvfGxvZ3xkZWJ1Z3xhc3NlcnR8ZXhlY3V0ZXxwZXJmb3JtfGdldHxkaWFnbm9zdGljc3xjYWxsfGRvfGFsaWFzfGNvbW1lbnR8dmFjdXVtfGFuYWx5emV8ZXhwbGFpbnxjb3B5fGdyYW50fHJldm9rZXxwcml2aWxlZ2VzfHB1YmxpY3x1c2FnZXxzY2hlbWF8c2VxdWVuY2V8b3duZWR8b3duZXJ8dGFibGVzcGFjZXxzdG9yYWdlfGluaGVyaXRzfHR5cGV8b3BlcmF0b3J8Y29sbGF0ZXxjb2xsYXRpb258Y2FzY2FkZXxyZXN0cmljdHxhZGR8YWx0ZXJ8Y29sdW1ufHJlbmFtZXx0b3xlbmFibGV8ZGlzYWJsZXxmb3JjZXxub3xpbnN0ZWFkfG9mfGJlZm9yZXxhZnRlcnxlYWNofHN0YXRlbWVudHxyb3d8ZXhlY3V0ZXxhbHNvfG9ubHl8ZXhjbHVkZXxudWxsc3xvdGhlcnN8b3JkaW5hbGl0eXx0aWVzfG5vdGhpbmd8Y2FjaGV8Y3ljbGV8aW5jcmVtZW50fG1pbnZhbHVlfG1heHZhbHVlfHN0YXJ0fHJlc3RhcnR8Ynl8Y2FsbGVkfHJldHVybnN8bGFuZ3VhZ2V8aW1tdXRhYmxlfHN0YWJsZXx2b2xhdGlsZXxzdHJpY3R8c2VjdXJpdHl8ZGVmaW5lcnxpbnZva2VyfGNvc3R8cm93c3xzdXBwb3J0fGhhbmRsZXJ8aW5saW5lfHZhbGlkYXRvcnxvcHRpb25zfHN0b3JhZ2V8aW5oZXJpdGFuY2V8b2lkc3x3aXRob3V0fGRhdGF8ZGljdGlvbmFyeXxlbmNvZGluZ3xsY19jb2xsYXRlfGxjX2N0eXBlfGNvbm5lY3Rpb258bGltaXR8cGFzc3dvcmR8dmFsaWR8dW50aWx8c3VwZXJ1c2VyfG5vc3VwZXJ1c2VyfGNyZWF0ZWRifG5vY3JlYXRlZGJ8Y3JlYXRlcm9sZXxub2NyZWF0ZXJvbGV8aW5oZXJpdHxub2luaGVyaXR8bG9naW58bm9sb2dpbnxyZXBsaWNhdGlvbnxub3JlcGxpY2F0aW9ufGJ5cGFzc3Jsc3xub2J5cGFzc3Jsc3xlbmNyeXB0ZWR8dW5lbmNyeXB0ZWR8bmV3fG9sZHxzZXNzaW9uX3VzZXJ8Y3VycmVudF91c2VyfGN1cnJlbnRfcm9sZXxjdXJyZW50X3NjaGVtYXxjdXJyZW50X2NhdGFsb2d8Y3VycmVudF9kYXRlfGN1cnJlbnRfdGltZXxjdXJyZW50X3RpbWVzdGFtcHxsb2NhbHRpbWV8bG9jYWx0aW1lc3RhbXB8Y3VycmVudF9kYXRhYmFzZXxpbmV0fGNpZHJ8bWFjYWRkcnxtYWNhZGRyOHxiaXR8dmFyYml0fHRzdmVjdG9yfHRzcXVlcnl8dXVpZHx4bWx8anNvbnxqc29uYnxpbnR8aW50ZWdlcnxzbWFsbGludHxiaWdpbnR8ZGVjaW1hbHxudW1lcmljfHJlYWx8ZG91YmxlfHByZWNpc2lvbnxmbG9hdHxib29sZWFufGJvb2x8Y2hhcnxjaGFyYWN0ZXJ8dmFyY2hhcnx0ZXh0fGJ5dGVhfGRhdGV8dGltZXx0aW1lc3RhbXB8aW50ZXJ2YWx8cG9pbnR8bGluZXxsc2VnfGJveHxwYXRofHBvbHlnb258Y2lyY2xlfG1vbmV5fHZvaWQpJC9pO1xuXG5leHBvcnQgY29uc3QgVHlwZU9STUZsYXZvdXIgPSBcInR5cGUtb3JtXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNoYXBlIG9mIHRoZSBUeXBlT1JNS2V5cyBjb25zdGFudC5cbiAqIEBzdW1tYXJ5IERlc2NyaWJlcyB0aGUga2V5cyBhbmQgdGhlaXIgbWVhbmluZ3MgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHR5cGVkZWYgVHlwZU9STUtleXNEZWZcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTRVBBUkFUT1IgU2VwYXJhdG9yIHVzZWQgdG8gam9pbiB0YWJsZSBhbmQgY29sdW1uIGlkZW50aWZpZXJzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IElEIERlZmF1bHQgcHJpbWFyeSBrZXkgZmllbGQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBWRVJTSU9OIFZlcnNpb24gZmllbGQgdXNlZCBmb3Igb3B0aW1pc3RpYyBsb2NraW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IERFTEVURUQgU29mdC1kZWxldGUgdGltZXN0YW1wIGZpZWxkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRBQkxFIERhdGFiYXNlIHRhYmxlIGlkZW50aWZpZXIga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNDSEVNQSBEYXRhYmFzZSBzY2hlbWEgaWRlbnRpZmllciBrZXkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU0VRVUVOQ0UgRGF0YWJhc2Ugc2VxdWVuY2UgbmFtZSBrZXkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSU5ERVggSW5kZXggaWRlbnRpZmllciBrZXkuXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtleSBjb25zdGFudHMgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHN1bW1hcnkgQ29sbGVjdGlvbiBvZiBzdHJpbmcgY29uc3RhbnRzIHRoYXQgaWRlbnRpZnkgY29tbW9uIGRhdGFiYXNlIHByb3BlcnRpZXMgYW5kIGFkYXB0ZXItc3BlY2lmaWMga2V5cy5cbiAqIEBjb25zdCBUeXBlT1JNS2V5c1xuICogQHR5cGUge1R5cGVPUk1LZXlzRGVmfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STUtleXMgPSB7XG4gIFNFUEFSQVRPUjogXCIuXCIsXG4gIElEOiBcImlkXCIsXG4gIFZFUlNJT046IFwidmVyc2lvblwiLFxuICBERUxFVEVEOiBcImRlbGV0ZWRfYXRcIixcbiAgVEFCTEU6IFwidGFibGVfbmFtZVwiLFxuICBTQ0hFTUE6IFwic2NoZW1hX25hbWVcIixcbiAgU0VRVUVOQ0U6IFwic2VxdWVuY2VfbmFtZVwiLFxuICBJTkRFWDogXCJpbmRleFwiLFxufTtcbiIsImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFcnJvciB0aHJvd24gd2hlbiB0aGVyZSBpcyBhbiBpc3N1ZSB3aXRoIFR5cGVPUk0gaW5kZXhlcy5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW4gZXJyb3IgcmVsYXRlZCB0byBpbmRleCBnZW5lcmF0aW9uIG9yIGhhbmRsaW5nIHdpdGhpbiB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyBUaGUgZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3QuXG4gKiBAY2xhc3NcbiAqIEBjYXRlZ29yeSBFcnJvcnNcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIG9mIHVzaW5nIEluZGV4RXJyb3JcbiAqIHRyeSB7XG4gKiAgIC8vIFNvbWUgY29kZSB0aGF0IG1pZ2h0IHRocm93IGFuIGluZGV4IGVycm9yXG4gKiAgIHRocm93IG5ldyBJbmRleEVycm9yKFwiSW5kZXggbm90IGZvdW5kXCIpO1xuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSW5kZXhFcnJvcikge1xuICogICAgIGNvbnNvbGUuZXJyb3IoXCJJbmRleCBlcnJvciBvY2N1cnJlZDpcIiwgZXJyb3IubWVzc2FnZSk7XG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGNsYXNzIEluZGV4RXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoSW5kZXhFcnJvci5uYW1lLCBtc2csIDQwNCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFJlcG9zaXRvcnlGbGFncyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTUUwgb3BlcmF0b3JzIGF2YWlsYWJsZSBmb3IgYnVpbGRpbmcgVHlwZU9STSBxdWVyaWVzLlxuICogQHN1bW1hcnkgRW51bWVyYXRpb24gb2YgY29tbW9uIFNRTCBvcGVyYXRvcnMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoaW4gVHlwZU9STSBxdWVyeSBjb25zdHJ1Y3Rpb24gYW5kIHRyYW5zbGF0aW9uIGxheWVycy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBlbnVtIFNRTE9wZXJhdG9yIHtcbiAgRVFVQUwgPSBcIj1cIixcbiAgTk9UX0VRVUFMID0gXCI8PlwiLFxuICBMRVNTX1RIQU4gPSBcIjxcIixcbiAgTEVTU19USEFOX09SX0VRVUFMID0gXCI8PVwiLFxuICBHUkVBVEVSX1RIQU4gPSBcIj5cIixcbiAgR1JFQVRFUl9USEFOX09SX0VRVUFMID0gXCI+PVwiLFxuICBJTiA9IFwiSU5cIixcbiAgTk9UX0lOID0gXCJOT1QgSU5cIixcbiAgTElLRSA9IFwiTElLRVwiLFxuICBJTElLRSA9IFwiSUxJS0VcIixcbiAgQkVUV0VFTiA9IFwiQkVUV0VFTlwiLFxuICBJU19OVUxMID0gXCJJUyBOVUxMXCIsXG4gIElTX05PVF9OVUxMID0gXCJJUyBOT1QgTlVMTFwiLFxuICBFWElTVFMgPSBcIkVYSVNUU1wiLFxuICBOT1RfRVhJU1RTID0gXCJOT1QgRVhJU1RTXCIsXG4gIEFOWSA9IFwiQU5ZXCIsXG4gIEFMTCA9IFwiQUxMXCIsXG4gIFNPTUUgPSBcIlNPTUVcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUXVlcnkgY29udGFpbmVyIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgZWl0aGVyIGEgcmF3IFNRTCBzdHJpbmcgb3IgYSBUeXBlT1JNIFNlbGVjdFF1ZXJ5QnVpbGRlciBhbG9uZyB3aXRoIG9wdGlvbmFsIGJvdW5kIHZhbHVlcyB0byBiZSBleGVjdXRlZCBieSB0aGUgYWRhcHRlci5cbiAqIEB0ZW1wbGF0ZSBNIFRoZSBNb2RlbCB0eXBlIGZvciB3aGljaCB0aGUgU2VsZWN0UXVlcnlCdWlsZGVyIGlzIHBhcmFtZXRlcml6ZWQuXG4gKiBAdGVtcGxhdGUgVCBUaGUgdW5kZXJseWluZyBxdWVyeSB0eXBlLCBlaXRoZXIgYSBzdHJpbmcgb3IgYSBTZWxlY3RRdWVyeUJ1aWxkZXI8TT4uXG4gKiBAaW50ZXJmYWNlIFR5cGVPUk1RdWVyeVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVPUk1RdWVyeTxcbiAgTSBleHRlbmRzIE1vZGVsID0gTW9kZWwsXG4gIFQgZXh0ZW5kcyBzdHJpbmcgfCBTZWxlY3RRdWVyeUJ1aWxkZXI8TT4gPSBzdHJpbmcsXG4+IHtcbiAgcXVlcnk6IFQ7XG4gIHZhbHVlcz86IGFueVtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIGZsYWdzIGZvciBUeXBlT1JNIG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBFeHRlbmRlZCByZXBvc2l0b3J5IGZsYWdzIGluY2x1ZGluZyBjb25uZWN0aW9uL3VzZXIgY29udGV4dCB0aGF0IGNhbiBiZSBsZXZlcmFnZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBpbnRlcmZhY2UgVHlwZU9STUZsYWdzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZU9STUZsYWdzIGV4dGVuZHMgUmVwb3NpdG9yeUZsYWdzIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVc2VyIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZvciBQb3N0Z3JlcyBkYXRhYmFzZSBjb25uZWN0aW9uc1xuICAgKi9cbiAgdXNlcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGVjaWZpY2F0aW9uIGZvciBhIHRhYmxlIGNyZWF0aW9uL2NoYW5nZSBzdGF0ZW1lbnQgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHN1bW1hcnkgRXh0ZW5kcyBhIFR5cGVPUk1RdWVyeSB3aXRoIHRhYmxlIG1ldGFkYXRhIHN1Y2ggYXMgcHJpbWFyeSBrZXkgZmxhZywgY29uc3RyYWludHMsIGFuZCBmb3JlaWduIGtleXMuXG4gKiBAdHlwZWRlZiBUeXBlT1JNVGFibGVTcGVjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHByaW1hcnlLZXkgSW5kaWNhdGVzIGlmIHRoZSB0YXJnZXQgY29sdW1uIGlzIHBhcnQgb2YgdGhlIHByaW1hcnkga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gY29uc3RyYWludHMgQSBsaXN0IG9mIHJhdyBTUUwgY29uc3RyYWludHMgdG8gYXBwbHkgdG8gdGhlIHRhYmxlL2NvbHVtbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGZvcmVpZ25LZXlzIEEgbGlzdCBvZiBmb3JlaWduIGtleSBjb25zdHJhaW50IGRlZmluaXRpb25zLlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgdHlwZSBUeXBlT1JNVGFibGVTcGVjID0gVHlwZU9STVF1ZXJ5ICYge1xuICBwcmltYXJ5S2V5OiBib29sZWFuO1xuICBjb25zdHJhaW50czogc3RyaW5nW107XG4gIGZvcmVpZ25LZXlzOiBzdHJpbmdbXTtcbn07XG4iLCJpbXBvcnQgeyBTUUxPcGVyYXRvciB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHF1ZXJ5IGxpbWl0IGZvciBUeXBlT1JNLWJhY2tlZCBxdWVyaWVzLlxuICogQHN1bW1hcnkgTWF4aW11bSBudW1iZXIgb2YgcmVjb3JkcyB0byByZXR1cm4gaW4gYSBzaW5nbGUgcGFnZSB3aGVuIHBhZ2luYXRpbmcgcmVzdWx0cy5cbiAqIEBjb25zdCBUeXBlT1JNUXVlcnlMaW1pdFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STVF1ZXJ5TGltaXQgPSAyNTA7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hcHBpbmcgb2Ygb3BlcmF0b3IgbmFtZXMgdG8gU1FMIG9wZXJhdG9ycy5cbiAqIEBzdW1tYXJ5IENvbnN0YW50cyBmb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgdXNlZCB3aGVuIHRyYW5zbGF0aW5nIGhpZ2gtbGV2ZWwgZmlsdGVycyBpbnRvIFNRTCB2aWEgVHlwZU9STS5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc3RncmVTUUxPcGVyYXRvclR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFUVVBTCBFcXVhbGl0eSBvcGVyYXRvciAoPSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBESUZGRVJFTlQgSW5lcXVhbGl0eSBvcGVyYXRvciAoPD4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHR0VSIEdyZWF0ZXIgdGhhbiBvcGVyYXRvciAoPilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBCSUdHRVJfRVEgR3JlYXRlciB0aGFuIG9yIGVxdWFsIG9wZXJhdG9yICg+PSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTTUFMTEVSIExlc3MgdGhhbiBvcGVyYXRvciAoPClcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTTUFMTEVSX0VRIExlc3MgdGhhbiBvciBlcXVhbCBvcGVyYXRvciAoPD0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTk9UIE5lZ2F0aW9uIG9wZXJhdG9yIChOT1QpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSU4gSW4gYXJyYXkgb3BlcmF0b3IgKElOKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFR0VYUCBSZWd1bGFyIGV4cHJlc3Npb24gb3BlcmF0b3IgKH4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSVJFR0VYUCBDYXNlLWluc2Vuc2l0aXZlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvcGVyYXRvciAofiopXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTElLRSBQYXR0ZXJuIG1hdGNoaW5nIG9wZXJhdG9yIChMSUtFKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElMSUtFIENhc2UtaW5zZW5zaXRpdmUgcGF0dGVybiBtYXRjaGluZyBvcGVyYXRvciAoSUxJS0UpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQkVUV0VFTiBSYW5nZSBvcGVyYXRvciAoQkVUV0VFTilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJU19OVUxMIE5VTEwgY2hlY2sgb3BlcmF0b3IgKElTIE5VTEwpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSVNfTk9UX05VTEwgTk9UIE5VTEwgY2hlY2sgb3BlcmF0b3IgKElTIE5PVCBOVUxMKVxuICogQGNvbnN0IFR5cGVPUk1PcGVyYXRvclxuICogQHR5cGUge1Bvc3RncmVTUUxPcGVyYXRvclR5cGV9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlT1JNT3BlcmF0b3I6IFJlY29yZDxzdHJpbmcsIFNRTE9wZXJhdG9yIHwgc3RyaW5nPiA9IHtcbiAgRVFVQUw6IFNRTE9wZXJhdG9yLkVRVUFMLFxuICBESUZGRVJFTlQ6IFNRTE9wZXJhdG9yLk5PVF9FUVVBTCxcbiAgQklHR0VSOiBTUUxPcGVyYXRvci5HUkVBVEVSX1RIQU4sXG4gIEJJR0dFUl9FUTogU1FMT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMLFxuICBTTUFMTEVSOiBTUUxPcGVyYXRvci5MRVNTX1RIQU4sXG4gIFNNQUxMRVJfRVE6IFNRTE9wZXJhdG9yLkxFU1NfVEhBTl9PUl9FUVVBTCxcbiAgQkVUV0VFTjogU1FMT3BlcmF0b3IuQkVUV0VFTixcbiAgTk9UOiBcIk5PVFwiLFxuICBJTjogU1FMT3BlcmF0b3IuSU4sXG4gIElTX05VTEw6IFNRTE9wZXJhdG9yLklTX05VTEwsXG4gIElTX05PVF9OVUxMOiBTUUxPcGVyYXRvci5JU19OT1RfTlVMTCxcbiAgUkVHRVhQOiBcIn5cIixcbiAgSVJFR0VYUDogXCJ+KlwiLFxuICBMSUtFOiBTUUxPcGVyYXRvci5MSUtFLFxuICBJTElLRTogU1FMT3BlcmF0b3IuSUxJS0UsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIGxvZ2ljYWwgb3BlcmF0b3IgbmFtZXMgdG8gU1FMIG9wZXJhdG9ycy5cbiAqIEBzdW1tYXJ5IENvbnN0YW50cyBmb3IgbG9naWNhbCBvcGVyYXRvcnMgdXNlZCB3aGVuIGJ1aWxkaW5nIFdIRVJFIGNsYXVzZSBncm91cHMgaW4gVHlwZU9STSBxdWVyaWVzLlxuICogQHR5cGVkZWYge09iamVjdH0gUG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQU5EIExvZ2ljYWwgQU5EIG9wZXJhdG9yIChBTkQpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gT1IgTG9naWNhbCBPUiBvcGVyYXRvciAoT1IpXG4gKiBAY29uc3QgVHlwZU9STUdyb3VwT3BlcmF0b3JcbiAqIEB0eXBlIHtQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvclR5cGV9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlT1JNR3JvdXBPcGVyYXRvcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgQU5EOiBcIkFORFwiLFxuICBPUjogXCJPUlwiLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lhbCBjb25zdGFudCB2YWx1ZXMgdXNlZCBpbiBxdWVyaWVzLlxuICogQHN1bW1hcnkgU3RyaW5nIGNvbnN0YW50cyByZXByZXNlbnRpbmcgc3BlY2lhbCB2YWx1ZXMgdXNlZCB3aGlsZSBjb21wb3NpbmcgU1FMIHdpdGggVHlwZU9STS5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc3RncmVTUUxDb25zdFR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBOVUxMIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBudWxsIHZhbHVlLlxuICogQGNvbnN0IFR5cGVPUk1Db25zdFxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STUNvbnN0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBOVUxMOiBcIk5VTExcIixcbn07XG4iLCJpbXBvcnQgeyBQYWdpbmF0b3IsIFBhZ2luZ0Vycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCwgTW9kZWxLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCB7IEZpbmRNYW55T3B0aW9ucywgUmVwb3NpdG9yeSBhcyBSZXBvIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhZ2luYXRvciBmb3IgVHlwZU9STSBxdWVyeSByZXN1bHRzLlxuICogQHN1bW1hcnkgSW1wbGVtZW50cyBwYWdpbmF0aW9uIGZvciBUeXBlT1JNLWJ1aWx0IHF1ZXJpZXMgdXNpbmcgdGFrZS9za2lwIGZvciBlZmZpY2llbnQgbmF2aWdhdGlvbiB0aHJvdWdoIHJlc3VsdCBzZXRzLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHF1ZXJ5IFRoZSBxdWVyeSBjb250YWluZXIgdG8gcGFnaW5hdGUuXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBUaGUgcGFnZSBzaXplLlxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gY2xhenogVGhlIG1vZGVsIGNvbnN0cnVjdG9yLlxuICogQGNsYXNzIFR5cGVPUk1QYWdpbmF0b3JcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIG9mIHVzaW5nIFR5cGVPUk1QYWdpbmF0b3JcbiAqIGNvbnN0IHBhZ2luYXRvciA9IG5ldyBUeXBlT1JNUGFnaW5hdG9yKGFkYXB0ZXIsIHsgcXVlcnk6IHFiIH0sIDEwLCBVc2VyKTtcbiAqIGNvbnN0IHBhZ2UxID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UoMSk7XG4gKiBjb25zdCBwYWdlMiA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKDIpO1xuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STVBhZ2luYXRvcjxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgUGFnaW5hdG9yPFxuICBNLFxuICBSLFxuICBUeXBlT1JNUXVlcnlcbj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlc1xuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMgYmFzZWQgb24gdGhlIHJlY29yZCBjb3VudCBhbmQgcGFnZSBzaXplXG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHRvdGFsIG51bWJlciBvZiBwYWdlc1xuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IHRvdGFsKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdGFsUGFnZXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHRvdGFsIHJlY29yZCBjb3VudFxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3JkcyBtYXRjaGluZyB0aGUgcXVlcnlcbiAgICogQHJldHVybiB7bnVtYmVyfSBUaGUgdG90YWwgcmVjb3JkIGNvdW50XG4gICAqL1xuICBvdmVycmlkZSBnZXQgY291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcmVjb3JkQ291bnQ7XG4gIH1cblxuICBwcml2YXRlIF9fcmVwbz86IFJlcG88YW55PjtcblxuICBwcm90ZWN0ZWQgZ2V0IHJlcG8oKSB7XG4gICAgaWYgKCF0aGlzLl9fcmVwbykge1xuICAgICAgdGhpcy5fX3JlcG8gPSAodGhpcy5hZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyKS5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkoXG4gICAgICAgIHRoaXMuY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5jbGF6el1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9fcmVwbztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBUeXBlT1JNUGFnaW5hdG9yIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIHBhZ2luYXRvciBmb3IgVHlwZU9STSBxdWVyeSByZXN1bHRzLlxuICAgKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gICAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSBxdWVyeSBUaGUgVHlwZU9STSBxdWVyeSBjb250YWluZXIgdG8gcGFnaW5hdGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIFRoZSBwYWdlIHNpemUuXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGFkYXB0ZXI6IFR5cGVPUk1BZGFwdGVyLFxuICAgIHF1ZXJ5OiBUeXBlT1JNUXVlcnksXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNPlxuICApIHtcbiAgICBzdXBlcihhZGFwdGVyLCBxdWVyeSwgc2l6ZSwgY2xhenopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyBhIHF1ZXJ5IGZvciBwYWdpbmF0aW9uXG4gICAqIEBzdW1tYXJ5IE1vZGlmaWVzIHRoZSByYXcgcXVlcnkgdG8gaW5jbHVkZSBwYWdpbmF0aW9uIHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHJhd1N0YXRlbWVudCAtIFRoZSBvcmlnaW5hbCBQb3N0Z3JlU1FMIHF1ZXJ5XG4gICAqIEByZXR1cm4ge1R5cGVPUk1RdWVyeX0gVGhlIHByZXBhcmVkIHF1ZXJ5IHdpdGggcGFnaW5hdGlvbiBwYXJhbWV0ZXJzXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJlcGFyZShyYXdTdGF0ZW1lbnQ6IFR5cGVPUk1RdWVyeSk6IFR5cGVPUk1RdWVyeSB7XG4gICAgY29uc3QgcXVlcnk6IFR5cGVPUk1RdWVyeSA9IHsgLi4ucmF3U3RhdGVtZW50IH07XG4gICAgcmV0dXJuIHF1ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBzcGVjaWZpYyBwYWdlIG9mIHJlc3VsdHMuXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIHRoZSBxdWVyeSB3aXRoIHBhZ2luYXRpb24gYW5kIHByb2Nlc3NlcyB0aGUgcmVzdWx0cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwYWdlPTFdIFRoZSBwYWdlIG51bWJlciB0byByZXRyaWV2ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxSW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBhcnJheSBvZiByZXN1bHRzLlxuICAgKiBAdGhyb3dzIHtQYWdpbmdFcnJvcn0gSWYgdHJ5aW5nIHRvIGFjY2VzcyBhbiBpbnZhbGlkIHBhZ2Ugb3IgaWYgbm8gY2xhc3MgaXMgZGVmaW5lZC5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgUGFnaW5hdG9yIGFzIFR5cGVPUk1QYWdpbmF0b3JcbiAgICogICBwYXJ0aWNpcGFudCBBZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgREIgYXMgRGF0YWJhc2VcbiAgICpcbiAgICogICBDbGllbnQtPj5QYWdpbmF0b3I6IHBhZ2UocGFnZU51bWJlcilcbiAgICogICBOb3RlIG92ZXIgUGFnaW5hdG9yOiBQcmVwYXJlIG9wdGlvbnMgKHNraXAvdGFrZSlcbiAgICpcbiAgICogICBhbHQgRmlyc3QgdGltZSBvciBuZWVkIGNvdW50XG4gICAqICAgICBQYWdpbmF0b3ItPj5BZGFwdGVyOiBHZXQgY291bnRcbiAgICogICAgIEFkYXB0ZXItPj5EQjogRXhlY3V0ZSBDT1VOVFxuICAgKiAgICAgREItLT4+QWRhcHRlcjogY291bnRcbiAgICogICAgIEFkYXB0ZXItLT4+UGFnaW5hdG9yOiBjb3VudFxuICAgKiAgICAgUGFnaW5hdG9yLT4+UGFnaW5hdG9yOiBDYWxjdWxhdGUgdG90YWwgcGFnZXNcbiAgICogICBlbmRcbiAgICpcbiAgICogICBQYWdpbmF0b3ItPj5BZGFwdGVyOiBFeGVjdXRlIHF1ZXJ5XG4gICAqICAgQWRhcHRlci0+PkRCOiBmaW5kQW5kQ291bnQob3B0aW9ucylcbiAgICogICBEQi0tPj5BZGFwdGVyOiByb3dzLCBjb3VudFxuICAgKiAgIEFkYXB0ZXItLT4+UGFnaW5hdG9yOiByb3dzLCBjb3VudFxuICAgKlxuICAgKiAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogTWFwIHJvd3MgdG8gbW9kZWxzXG4gICAqICAgUGFnaW5hdG9yLS0+PkNsaWVudDogcmVzdWx0c1xuICAgKi9cblxuICBhc3luYyBwYWdlKHBhZ2U6IG51bWJlciA9IDEpOiBQcm9taXNlPFJbXT4ge1xuICAgIGNvbnN0IHN0YXRlbWVudCA9IHsgLi4udGhpcy5zdGF0ZW1lbnQgfTtcblxuICAgIC8vIEdldCB0b3RhbCBjb3VudCBpZiBub3QgYWxyZWFkeSBjYWxjdWxhdGVkXG4gICAgaWYgKCF0aGlzLl9yZWNvcmRDb3VudCB8fCAhdGhpcy5fdG90YWxQYWdlcykge1xuICAgICAgdGhpcy5fdG90YWxQYWdlcyA9IHRoaXMuX3JlY29yZENvdW50ID0gMDtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRzOiBGaW5kTWFueU9wdGlvbnM8TT4gPSBPYmplY3QuYXNzaWduKHN0YXRlbWVudCwge1xuICAgICAgc2tpcDogKHRoaXMuY3VycmVudCB8fCAwKSAqIHRoaXMuc2l6ZSxcbiAgICAgIHRha2U6IHRoaXMuc2l6ZSxcbiAgICB9KTtcblxuICAgIC8vIHRoaXMudmFsaWRhdGVQYWdlKHBhZ2UpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXBvLmZpbmRBbmRDb3VudChvcHRzKTtcblxuICAgIHRoaXMuX3JlY29yZENvdW50ID0gcmVzdWx0WzFdO1xuICAgIHRoaXMuX3RvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy5fcmVjb3JkQ291bnQgLyB0aGlzLnNpemUpO1xuXG4gICAgaWYgKCF0aGlzLmNsYXp6KSB0aHJvdyBuZXcgUGFnaW5nRXJyb3IoXCJObyBzdGF0ZW1lbnQgdGFyZ2V0IGRlZmluZWRcIik7XG5cbiAgICBjb25zdCBwa0RlZiA9IGZpbmRQcmltYXJ5S2V5KG5ldyB0aGlzLmNsYXp6KCkpO1xuICAgIGNvbnN0IHJvd3MgPSByZXN1bHRbMF0gfHwgW107XG5cbiAgICBjb25zdCByZXN1bHRzID1cbiAgICAgIC8vIHN0YXRlbWVudC5jb2x1bW5zICYmIHN0YXRlbWVudC5jb2x1bW5zLmxlbmd0aFxuICAgICAgLy8gICA/IHJvd3MgLy8gaGFzIGNvbHVtbnMgbWVhbnMgaXQncyBub3QgZnVsbCBtb2RlbFxuICAgICAgcm93cy5tYXAoKHJvdzogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHJvdywgdGhpcy5jbGF6eiwgcGtEZWYuaWQsIHJvd1twa0RlZi5pZF0pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLl9jdXJyZW50UGFnZSA9IHBhZ2U7XG4gICAgcmV0dXJuIHJlc3VsdHMgYXMgdW5rbm93biBhcyBSW107XG4gIH1cbn1cbiIsImltcG9ydCB7IEdyb3VwT3BlcmF0b3IsIE9wZXJhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUeXBlT1JNR3JvdXBPcGVyYXRvciwgVHlwZU9STU9wZXJhdG9yIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBRdWVyeUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBTUUxPcGVyYXRvciB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUcmFuc2xhdGVzIGNvcmUgb3BlcmF0b3JzIHRvIFR5cGVPUk0gU1FMIG9wZXJhdG9ycy5cbiAqIEBzdW1tYXJ5IENvbnZlcnRzIERlY2FmLnRzIGNvcmUgb3BlcmF0b3JzIHRvIHRoZWlyIGVxdWl2YWxlbnQgU1FMIG9wZXJhdG9ycyB1c2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAcGFyYW0ge0dyb3VwT3BlcmF0b3IgfCBPcGVyYXRvcn0gb3BlcmF0b3IgVGhlIGNvcmUgb3BlcmF0b3IgdG8gdHJhbnNsYXRlLlxuICogQHJldHVybiB7U1FMT3BlcmF0b3IgfCBzdHJpbmd9IFRoZSBlcXVpdmFsZW50IFNRTCBvcGVyYXRvci5cbiAqIEB0aHJvd3Mge1F1ZXJ5RXJyb3J9IElmIG5vIHRyYW5zbGF0aW9uIGV4aXN0cyBmb3IgdGhlIGdpdmVuIG9wZXJhdG9yLlxuICogQGZ1bmN0aW9uIHRyYW5zbGF0ZU9wZXJhdG9yc1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgdHJhbnNsYXRlT3BlcmF0b3JzXG4gKiAgIHBhcnRpY2lwYW50IFBvc3RncmVTUUxPcGVyYXRvclxuICogICBwYXJ0aWNpcGFudCBQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvclxuICpcbiAqICAgQ2FsbGVyLT4+dHJhbnNsYXRlT3BlcmF0b3JzOiBvcGVyYXRvclxuICpcbiAqICAgdHJhbnNsYXRlT3BlcmF0b3JzLT4+UG9zdGdyZVNRTE9wZXJhdG9yOiBDaGVjayBmb3IgbWF0Y2hcbiAqICAgYWx0IEZvdW5kIGluIFBvc3RncmVTUUxPcGVyYXRvclxuICogICAgIFBvc3RncmVTUUxPcGVyYXRvci0tPj50cmFuc2xhdGVPcGVyYXRvcnM6IFJldHVybiBtYXRjaGluZyBvcGVyYXRvclxuICogICAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0tPj5DYWxsZXI6IFJldHVybiBTUUxPcGVyYXRvclxuICogICBlbHNlIE5vdCBmb3VuZFxuICogICAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0+PlBvc3RncmVTUUxHcm91cE9wZXJhdG9yOiBDaGVjayBmb3IgbWF0Y2hcbiAqICAgICBhbHQgRm91bmQgaW4gUG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JcbiAqICAgICAgIFBvc3RncmVTUUxHcm91cE9wZXJhdG9yLS0+PnRyYW5zbGF0ZU9wZXJhdG9yczogUmV0dXJuIG1hdGNoaW5nIG9wZXJhdG9yXG4gKiAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBSZXR1cm4gc3RyaW5nXG4gKiAgICAgZWxzZSBOb3QgZm91bmRcbiAqICAgICAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0tPj5DYWxsZXI6IFRocm93IFF1ZXJ5RXJyb3JcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVPcGVyYXRvcnMoXG4gIG9wZXJhdG9yOiBHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3Jcbik6IFNRTE9wZXJhdG9yIHwgc3RyaW5nIHtcbiAgZm9yIChjb25zdCBvcGVyYXRvcnMgb2YgW1R5cGVPUk1PcGVyYXRvciwgVHlwZU9STUdyb3VwT3BlcmF0b3JdKSB7XG4gICAgY29uc3QgZWwgPSBPYmplY3Qua2V5cyhvcGVyYXRvcnMpLmZpbmQoKGspID0+IGsgPT09IG9wZXJhdG9yKTtcbiAgICBpZiAoZWwpIHJldHVybiBvcGVyYXRvcnNbZWxdO1xuICB9XG4gIHRocm93IG5ldyBRdWVyeUVycm9yKFxuICAgIGBDb3VsZCBub3QgZmluZCBhZGFwdGVyIHRyYW5zbGF0aW9uIGZvciBvcGVyYXRvciAke29wZXJhdG9yfWBcbiAgKTtcbn1cbiIsImltcG9ydCB7XG4gIENvbmRpdGlvbixcbiAgR3JvdXBPcGVyYXRvcixcbiAgT3BlcmF0b3IsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQYWdpbmF0b3IsXG4gIFJlcG9zaXRvcnksXG4gIFN0YXRlbWVudCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgdHJhbnNsYXRlT3BlcmF0b3JzIH0gZnJvbSBcIi4vdHJhbnNsYXRlXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnlMaW1pdCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgVHlwZU9STVBhZ2luYXRvciB9IGZyb20gXCIuL1BhZ2luYXRvclwiO1xuaW1wb3J0IHsgZmluZFByaW1hcnlLZXksIEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCB7IEZpbmRNYW55T3B0aW9ucywgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IEZpbmRPcHRpb25zV2hlcmUgfSBmcm9tIFwidHlwZW9ybS9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNXaGVyZVwiO1xuaW1wb3J0IHsgRmluZE9wdGlvbnNPcmRlciB9IGZyb20gXCJ0eXBlb3JtL2ZpbmQtb3B0aW9ucy9GaW5kT3B0aW9uc09yZGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YXRlbWVudCBidWlsZGVyIGZvciBUeXBlT1JNLWJhY2tlZCBxdWVyaWVzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBmbHVlbnQgaW50ZXJmYWNlIGZvciBidWlsZGluZyBTUUwgcXVlcmllcyB2aWEgVHlwZU9STSdzIFNlbGVjdFF1ZXJ5QnVpbGRlciB3aXRoIHR5cGUgc2FmZXR5IGFuZCBEZWNhZi50cyBhYnN0cmFjdGlvbnMuXG4gKiBAdGVtcGxhdGUgTSBUaGUgbW9kZWwgdHlwZSB0aGF0IGV4dGVuZHMgTW9kZWwuXG4gKiBAdGVtcGxhdGUgUiBUaGUgcmVzdWx0IHR5cGUgcmV0dXJuZWQgZnJvbSBleGVjdXRpb24uXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAY2xhc3MgVHlwZU9STVN0YXRlbWVudFxuICogQGV4YW1wbGVcbiAqIC8vIEV4YW1wbGUgdXNpbmcgVHlwZU9STVN0YXRlbWVudFxuICogY29uc3Qgc3RhdGVtZW50ID0gbmV3IFR5cGVPUk1TdGF0ZW1lbnQ8VXNlciwgVXNlcltdPihhZGFwdGVyKTtcbiAqIGNvbnN0IHVzZXJzID0gYXdhaXQgc3RhdGVtZW50XG4gKiAgIC5mcm9tKFVzZXIpXG4gKiAgIC53aGVyZShDb25kaXRpb24uYXR0cmlidXRlPFVzZXI+KCdhZ2UnKS5ndCgxOCkpXG4gKiAgIC5vcmRlckJ5KCdsYXN0TmFtZScsICdhc2MnKVxuICogICAubGltaXQoMTApXG4gKiAgIC5leGVjdXRlKCk7XG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNU3RhdGVtZW50PE0gZXh0ZW5kcyBNb2RlbCwgUj4gZXh0ZW5kcyBTdGF0ZW1lbnQ8XG4gIFR5cGVPUk1RdWVyeTxNPixcbiAgTSxcbiAgUlxuPiB7XG4gIHByb3RlY3RlZCBvdmVycmlkZSBhZGFwdGVyITogVHlwZU9STUFkYXB0ZXI7XG5cbiAgY29uc3RydWN0b3IoYWRhcHRlcjogVHlwZU9STUFkYXB0ZXIpIHtcbiAgICBzdXBlcihhZGFwdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGRzIGEgVHlwZU9STSBTZWxlY3RRdWVyeUJ1aWxkZXIgZnJvbSB0aGUgc3RhdGVtZW50LlxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgc3RhdGVtZW50J3MgY29uZGl0aW9ucywgc2VsZWN0b3JzLCBhbmQgb3B0aW9ucyBpbnRvIGEgVHlwZU9STS1iYWNrZWQgcXVlcnkgb2JqZWN0LlxuICAgKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IFRoZSBidWlsdCBUeXBlT1JNIHF1ZXJ5IGNvbnRhaW5lci5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIGFyZSBpbnZhbGlkIHF1ZXJ5IGNvbmRpdGlvbnMuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAgICogICBwYXJ0aWNpcGFudCBwYXJzZUNvbmRpdGlvblxuICAgKlxuICAgKiAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogYnVpbGQoKVxuICAgKiAgIE5vdGUgb3ZlciBTdGF0ZW1lbnQ6IEluaXRpYWxpemUgcXVlcnlcbiAgICogICBTdGF0ZW1lbnQtPj5SZXBvc2l0b3J5OiBHZXQgdGFibGUgbmFtZVxuICAgKiAgIFJlcG9zaXRvcnktLT4+U3RhdGVtZW50OiBSZXR1cm4gdGFibGUgbmFtZVxuICAgKiAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGJhc2UgcXVlcnlcbiAgICpcbiAgICogICBhbHQgSGFzIHNlbGVjdFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBjb2x1bW5zIHRvIHF1ZXJ5XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyB3aGVyZUNvbmRpdGlvblxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBDcmVhdGUgY29tYmluZWQgY29uZGl0aW9uIHdpdGggdGFibGVcbiAgICogICAgIFN0YXRlbWVudC0+PnBhcnNlQ29uZGl0aW9uOiBQYXJzZSBjb25kaXRpb25cbiAgICogICAgIHBhcnNlQ29uZGl0aW9uLS0+PlN0YXRlbWVudDogUmV0dXJuIHBhcnNlZCBjb25kaXRpb25zXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBjb25kaXRpb25zIHRvIHF1ZXJ5XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyBvcmRlckJ5U2VsZWN0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQWRkIG9yZGVyQnkgdG8gcXVlcnlcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIGxpbWl0U2VsZWN0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogU2V0IGxpbWl0XG4gICAqICAgZWxzZVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBVc2UgZGVmYXVsdCBsaW1pdFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgb2Zmc2V0U2VsZWN0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogU2V0IG9mZnNldFxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIFN0YXRlbWVudC0tPj5TdGF0ZW1lbnQ6IFJldHVybiBxdWVyeVxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkKCk6IFR5cGVPUk1RdWVyeTxNPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuYnVpbGQpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUodGhpcy5mcm9tU2VsZWN0b3IpO1xuICAgIGNvbnN0IG0gPSBuZXcgdGhpcy5mcm9tU2VsZWN0b3IoKTtcblxuICAgIGNvbnN0IHE6IFR5cGVPUk1RdWVyeTxNLCBTZWxlY3RRdWVyeUJ1aWxkZXI8TT4+ID0ge1xuICAgICAgcXVlcnk6IHRoaXMuYWRhcHRlci5kYXRhU291cmNlXG4gICAgICAgIC5nZXRSZXBvc2l0b3J5KFxuICAgICAgICAgIHRoaXMuZnJvbVNlbGVjdG9yW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuZnJvbVNlbGVjdG9yXVxuICAgICAgICApXG4gICAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIodGFibGVOYW1lKSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8TT4sXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNlbGVjdFNlbGVjdG9yKVxuICAgICAgcS5xdWVyeSA9IHEucXVlcnkuc2VsZWN0KFxuICAgICAgICB0aGlzLnNlbGVjdFNlbGVjdG9yLm1hcCgocykgPT4gYCR7dGFibGVOYW1lfS4ke3MgYXMgc3RyaW5nfWApXG4gICAgICApO1xuICAgIGVsc2UgcS5xdWVyeSA9IHEucXVlcnkuc2VsZWN0KCk7XG4gICAgLy9cbiAgICAvLyBxLnF1ZXJ5ID0gKHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLmZyb20oXG4gICAgLy8gICB0aGlzLmZyb21TZWxlY3RvcltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmZyb21TZWxlY3Rvcl0sXG4gICAgLy8gICB0YWJsZU5hbWVcbiAgICAvLyApO1xuXG4gICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pXG4gICAgICBxLnF1ZXJ5ID0gdGhpcy5wYXJzZUNvbmRpdGlvbihcbiAgICAgICAgdGhpcy53aGVyZUNvbmRpdGlvbixcbiAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICBxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+XG4gICAgICApLnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+O1xuXG4gICAgbGV0IG9yZGVyQnlBcmdzOiBbc3RyaW5nLCBcIkRFU0NcIiB8IFwiQVNDXCJdO1xuICAgIGlmICghdGhpcy5vcmRlckJ5U2VsZWN0b3IpXG4gICAgICBvcmRlckJ5QXJncyA9IFtcbiAgICAgICAgYCR7dGFibGVOYW1lfS4ke2ZpbmRQcmltYXJ5S2V5KG0pLmlkIGFzIHN0cmluZ31gLFxuICAgICAgICBPcmRlckRpcmVjdGlvbi5BU0MudG9VcHBlckNhc2UoKSBhcyBcIkFTQ1wiLFxuICAgICAgXTtcbiAgICBlbHNlXG4gICAgICBvcmRlckJ5QXJncyA9IFtcbiAgICAgICAgYCR7dGFibGVOYW1lfS4ke3RoaXMub3JkZXJCeVNlbGVjdG9yWzBdIGFzIHN0cmluZ31gLFxuICAgICAgICB0aGlzLm9yZGVyQnlTZWxlY3RvclsxXS50b1VwcGVyQ2FzZSgpIGFzIFwiREVTQ1wiIHwgXCJBU0NcIixcbiAgICAgIF07XG5cbiAgICBxLnF1ZXJ5ID0gKHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLm9yZGVyQnkoLi4ub3JkZXJCeUFyZ3MpO1xuICAgIGlmICh0aGlzLmxpbWl0U2VsZWN0b3IpIHtcbiAgICAgIHEucXVlcnkgPSAocS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikubGltaXQodGhpcy5saW1pdFNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgTm8gbGltaXQgc2VsZWN0b3IgZGVmaW5lZC4gVXNpbmcgZGVmYXVsdCBsaW1pdCBvZiAke1R5cGVPUk1RdWVyeUxpbWl0fWBcbiAgICAgICk7XG4gICAgICBxLnF1ZXJ5ID0gKHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLmxpbWl0KFR5cGVPUk1RdWVyeUxpbWl0KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgb2Zmc2V0XG4gICAgaWYgKHRoaXMub2Zmc2V0U2VsZWN0b3IpXG4gICAgICBxLnF1ZXJ5ID0gKHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLnNraXAodGhpcy5vZmZzZXRTZWxlY3Rvcik7XG5cbiAgICByZXR1cm4gcSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBwYWdpbmF0b3IgZm9yIHRoZSBzdGF0ZW1lbnQuXG4gICAqIEBzdW1tYXJ5IEJ1aWxkcyB0aGUgcXVlcnkgYW5kIHJldHVybnMgYSBUeXBlT1JNUGFnaW5hdG9yIGZvciBwYWdpbmF0ZWQgcmVzdWx0cy5cbiAgICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBUaGUgcGFnZSBzaXplLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFBhZ2luYXRvcjxNLCBSLCBUeXBlT1JNUXVlcnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBwYWdpbmF0b3IuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZXJlJ3MgYW4gZXJyb3IgYnVpbGRpbmcgdGhlIHF1ZXJ5LlxuICAgKi9cbiAgYXN5bmMgcGFnaW5hdGU8Uj4oc2l6ZTogbnVtYmVyKTogUHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgVHlwZU9STVF1ZXJ5Pj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBxdWVyeTogVHlwZU9STVF1ZXJ5ID0gdGhpcy5idWlsZCgpO1xuICAgICAgY29uc3QgdHJhbnNmb3JtZWRRdWVyeTogRmluZE1hbnlPcHRpb25zPE0+ID0ge307XG4gICAgICBjb25zdCBhID0gcXVlcnkucXVlcnkgYXMgdW5rbm93biBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8TT47XG4gICAgICBpZiAodGhpcy53aGVyZUNvbmRpdGlvbilcbiAgICAgICAgdHJhbnNmb3JtZWRRdWVyeS53aGVyZSA9IHRoaXMucGFyc2VDb25kaXRpb25Gb3JQYWdpbmF0aW9uKFxuICAgICAgICAgIHRoaXMud2hlcmVDb25kaXRpb24sXG4gICAgICAgICAgUmVwb3NpdG9yeS50YWJsZSh0aGlzLmZyb21TZWxlY3RvcilcbiAgICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMub3JkZXJCeVNlbGVjdG9yKVxuICAgICAgICB0cmFuc2Zvcm1lZFF1ZXJ5Lm9yZGVyID0ge1xuICAgICAgICAgIFt0aGlzLm9yZGVyQnlTZWxlY3RvclswXV06IHRoaXMub3JkZXJCeVNlbGVjdG9yWzFdLnRvU3RyaW5nKCksXG4gICAgICAgIH0gYXMgYW55O1xuXG4gICAgICByZXR1cm4gbmV3IFR5cGVPUk1QYWdpbmF0b3IoXG4gICAgICAgIHRoaXMuYWRhcHRlciBhcyBhbnksXG4gICAgICAgIHRyYW5zZm9ybWVkUXVlcnkgYXMgYW55LFxuICAgICAgICBzaXplLFxuICAgICAgICB0aGlzLmZyb21TZWxlY3RvclxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGEgcmVjb3JkLlxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIHJhdyByZXN1bHQgcm93IHRvIGEgbW9kZWwgaW5zdGFuY2UgdXNpbmcgdGhlIGFkYXB0ZXIuXG4gICAqIEBwYXJhbSB7YW55fSByIFRoZSByYXcgcmVjb3JkLlxuICAgKiBAcGFyYW0ge2tleW9mIE19IHBrQXR0ciBUaGUgcHJpbWFyeSBrZXkgYXR0cmlidXRlIG9mIHRoZSBtb2RlbC5cbiAgICogQHBhcmFtIHtcIk51bWJlclwiIHwgXCJCaWdJbnRcIiB8IHVuZGVmaW5lZH0gc2VxdWVuY2VUeXBlIFRoZSB0eXBlIG9mIHRoZSBzZXF1ZW5jZS5cbiAgICogQHJldHVybiB7YW55fSBUaGUgcHJvY2Vzc2VkIHJlY29yZC5cbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1JlY29yZChyOiBhbnksIHBrQXR0cjoga2V5b2YgTSkge1xuICAgIGlmICh0eXBlb2Ygcltwa0F0dHJdICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmZyb21TZWxlY3RvciwgcGtBdHRyLCByW3BrQXR0cl0pO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgVHlwZU9STSBxdWVyeSBidWlsZGVyLlxuICAgKiBAc3VtbWFyeSBTZW5kcyB0aGUgYnVpbHQgU2VsZWN0UXVlcnlCdWlsZGVyIHRvIHRoZSBkYXRhYmFzZSB2aWEgVHlwZU9STSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cy5cbiAgICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlLlxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcmF3SW5wdXQgVGhlIHF1ZXJ5IGNvbnRhaW5lciB0byBleGVjdXRlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0cy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogVHlwZU9STVF1ZXJ5PE0+KTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmF3KTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgRXhlY3V0aW5nIHJhdyBxdWVyeTogJHsocmF3SW5wdXQucXVlcnkgYXMgdW5rbm93biBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8TT4pLmdldFNxbCgpfWBcbiAgICApO1xuICAgIHJldHVybiAoYXdhaXQgKFxuICAgICAgcmF3SW5wdXQucXVlcnkgYXMgdW5rbm93biBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8TT5cbiAgICApLmdldE1hbnkoKSkgYXMgUjtcbiAgfVxuXG4gIHByb3RlY3RlZCBwYXJzZUNvbmRpdGlvbkZvclBhZ2luYXRpb24oXG4gICAgY29uZGl0aW9uOiBDb25kaXRpb248TT4sXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgY291bnRlciA9IDAsXG4gICAgY29uZGl0aW9uYWxPcD86IEdyb3VwT3BlcmF0b3IgfCBPcGVyYXRvclxuICApOiBGaW5kT3B0aW9uc1doZXJlPE0+W10gfCBGaW5kT3B0aW9uc1doZXJlPE0+IHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29uZGl0aW9uIGludG8gUG9zdGdyZVNRTCBjb25kaXRpb25zXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIGEgQ29uZGl0aW9uIG9iamVjdCBpbnRvIFBvc3RncmVTUUwgY29uZGl0aW9uIHN0cnVjdHVyZXNcbiAgICogQHBhcmFtIHtDb25kaXRpb248TT59IGNvbmRpdGlvbiAtIFRoZSBjb25kaXRpb24gdG8gcGFyc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0YWJsZU5hbWVdIC0gdGhlIHBvc2l0aW9uYWwgaW5kZXggb2YgdGhlIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IFRoZSBQb3N0Z3Jlc1NRTCBjb25kaXRpb25cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgU3RhdGVtZW50XG4gICAqICAgcGFydGljaXBhbnQgdHJhbnNsYXRlT3BlcmF0b3JzXG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VDb25kaXRpb25cbiAgICpcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbilcbiAgICpcbiAgICogICBOb3RlIG92ZXIgU3RhdGVtZW50OiBFeHRyYWN0IGNvbmRpdGlvbiBwYXJ0c1xuICAgKlxuICAgKiAgIGFsdCBTaW1wbGUgY29tcGFyaXNvbiBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+dHJhbnNsYXRlT3BlcmF0b3JzOiB0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpXG4gICAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+U3RhdGVtZW50OiBSZXR1cm4gUG9zdGdyZVNRTCBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBDcmVhdGUgY29uZGl0aW9uIHdpdGggY29sdW1uLCBvcGVyYXRvciwgYW5kIHZhbHVlXG4gICAqICAgZWxzZSBOT1Qgb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oYXR0cjEpXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBOT1QgdG8gY29uZGl0aW9uc1xuICAgKiAgIGVsc2UgQU5EL09SIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGF0dHIxKVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihjb21wYXJpc29uKVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBDb21iaW5lIGNvbmRpdGlvbnMgd2l0aCBBTkQvT1JcbiAgICogICBlbmRcbiAgICpcbiAgICogICBTdGF0ZW1lbnQtLT4+U3RhdGVtZW50OiBSZXR1cm4gY29uZGl0aW9ucyBhcnJheVxuICAgKi9cbiAgcHJvdGVjdGVkIHBhcnNlQ29uZGl0aW9uKFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICBjb3VudGVyID0gMCxcbiAgICBjb25kaXRpb25hbE9wPzogR3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yXG4gICk6IFR5cGVPUk1RdWVyeTxNPiB7XG4gICAgY29uc3QgeyBhdHRyMSwgb3BlcmF0b3IsIGNvbXBhcmlzb24gfSA9IGNvbmRpdGlvbiBhcyB1bmtub3duIGFzIHtcbiAgICAgIGF0dHIxOiBzdHJpbmcgfCBDb25kaXRpb248TT47XG4gICAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yO1xuICAgICAgY29tcGFyaXNvbjogYW55O1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBwYXJzZSgpOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgICAgY29uc3Qgc3FsT3BlcmF0b3IgPSB0cmFuc2xhdGVPcGVyYXRvcnMob3BlcmF0b3IpO1xuICAgICAgY29uc3QgYXR0clJlZiA9IGAke2F0dHIxfSR7Y291bnRlcn1gO1xuICAgICAgY29uc3QgcXVlcnlTdHIgPSBgJHt0YWJsZU5hbWV9LiR7YXR0cjF9ICR7c3FsT3BlcmF0b3J9IDoke2F0dHJSZWZ9YDtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHtcbiAgICAgICAgW2F0dHJSZWZdOiBjb21wYXJpc29uLFxuICAgICAgfTtcbiAgICAgIHN3aXRjaCAoY29uZGl0aW9uYWxPcCkge1xuICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuQU5EOlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeTogcWIuYW5kV2hlcmUocXVlcnlTdHIsIHZhbHVlcykgYXMgYW55LFxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgR3JvdXBPcGVyYXRvci5PUjpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVlcnk6IHFiLm9yV2hlcmUocXVlcnlTdHIsIHZhbHVlcykgYXMgYW55LFxuICAgICAgICAgIH07XG4gICAgICAgIGNhc2UgT3BlcmF0b3IuTk9UOlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVCBvcGVyYXRvciBub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxYi53aGVyZShxdWVyeVN0ciwgdmFsdWVzKSBhcyBhbnksXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBbR3JvdXBPcGVyYXRvci5BTkQsIEdyb3VwT3BlcmF0b3IuT1IsIE9wZXJhdG9yLk5PVF0uaW5kZXhPZihcbiAgICAgICAgb3BlcmF0b3IgYXMgR3JvdXBPcGVyYXRvclxuICAgICAgKSA9PT0gLTFcbiAgICApIHtcbiAgICAgIHJldHVybiBwYXJzZSgpO1xuICAgIH1cbiAgICAvLyBGb3IgTk9UIG9wZXJhdG9yXG4gICAgZWxzZSBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLk5PVCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTk9UIG9wZXJhdG9yIG5vdCBpbXBsZW1lbnRlZFwiKTtcbiAgICB9XG4gICAgLy8gRm9yIEFORC9PUiBvcGVyYXRvcnNcbiAgICBlbHNlIHtcbiAgICAgIHFiID0gdGhpcy5wYXJzZUNvbmRpdGlvbihhdHRyMSBhcyBDb25kaXRpb248TT4sIHRhYmxlTmFtZSwgcWIsICsrY291bnRlcilcbiAgICAgICAgLnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+O1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIGNvbXBhcmlzb24sXG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcWIsXG4gICAgICAgICsrY291bnRlcixcbiAgICAgICAgb3BlcmF0b3JcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBOb3RGb3VuZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFNlcXVlbmNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuLi9UeXBlT1JNQWRhcHRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIGRhdGFiYXNlIHNlcXVlbmNlIGZvciBUeXBlT1JNLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgZm9yIHtAbGluayBTZXF1ZW5jZX1zLCBkZWxlZ2F0aW5nIHRvIHRoZSB7QGxpbmsgVHlwZU9STUFkYXB0ZXJ9IHRvIGZldGNoIGFuZCBpbmNyZW1lbnQgdmFsdWVzIHdoaWxlIGhhbmRsaW5nIHR5cGUgcGFyc2luZyBhbmQgZXJyb3IgdHJhbnNsYXRpb24uXG4gKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyBUaGUgc2VxdWVuY2UgY29uZmlndXJhdGlvbiBvcHRpb25zIChuYW1lLCB0eXBlLCBzdGFydFdpdGgsIGluY3JlbWVudEJ5LCBldGMuKS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlciB1c2VkIHRvIGV4ZWN1dGUgc2VxdWVuY2Ugb3BlcmF0aW9ucy5cbiAqIEBjbGFzcyBUeXBlT1JNU2VxdWVuY2VcbiAqIEBpbXBsZW1lbnRzIFNlcXVlbmNlXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGFuZCB1c2UgYSBUeXBlT1JNLWJhY2tlZCBzZXF1ZW5jZVxuICogY29uc3Qgc2VxID0gbmV3IFR5cGVPUk1TZXF1ZW5jZSh7IG5hbWU6IFwidXNlcl9pZF9zZXFcIiwgdHlwZTogXCJOdW1iZXJcIiwgc3RhcnRXaXRoOiAxLCBpbmNyZW1lbnRCeTogMSB9LCBhZGFwdGVyKTtcbiAqIGNvbnN0IG5leHRJZCA9IGF3YWl0IHNlcS5uZXh0KCk7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgU2VxIGFzIFR5cGVPUk1TZXF1ZW5jZVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gKiAgIEFwcC0+PlNlcTogbmV4dCgpXG4gKiAgIFNlcS0+PlNlcTogY3VycmVudCgpXG4gKiAgIFNlcS0+PkFkYXB0ZXI6IHJhdyhTRUxFQ1QgY3VycmVudF92YWx1ZSAuLi4pXG4gKiAgIEFkYXB0ZXItPj5EQjogUXVlcnkgY3VycmVudCB2YWx1ZVxuICogICBEQi0tPj5BZGFwdGVyOiBjdXJyZW50X3ZhbHVlXG4gKiAgIEFkYXB0ZXItLT4+U2VxOiB2YWx1ZVxuICogICBTZXEtPj5TZXE6IGluY3JlbWVudChjdXJyZW50KVxuICogICBTZXEtPj5BZGFwdGVyOiByYXcobmV4dHZhbChuYW1lKSlcbiAqICAgQWRhcHRlci0+PkRCOiBuZXh0dmFsKClcbiAqICAgREItLT4+QWRhcHRlcjogbmV4dCB2YWx1ZVxuICogICBBZGFwdGVyLS0+PlNlcTogdmFsdWVcbiAqICAgU2VxLS0+PkFwcDogcGFyc2VkIG5leHQgdmFsdWVcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1TZXF1ZW5jZSBleHRlbmRzIFNlcXVlbmNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogU2VxdWVuY2VPcHRpb25zLFxuICAgIHByb3RlY3RlZCBhZGFwdGVyOiBUeXBlT1JNQWRhcHRlclxuICApIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBhc3luYyBjdXJyZW50KCk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50PiB7XG4gICAgY29uc3QgeyBuYW1lIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNlcTogYW55ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyh7XG4gICAgICAgIHF1ZXJ5OiBgU0VMRUNUIGN1cnJlbnRfdmFsdWUgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuc2VxdWVuY2VzIFdIRVJFIHNlcXVlbmNlX25hbWUgPSAkMWAsXG4gICAgICAgIHZhbHVlczogW25hbWVdLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJzZShzZXEuY3VycmVudF92YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXIpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMuYWRhcHRlci5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBQYXJzZXMgdGhlIHtAbGluayBTZXF1ZW5jZX0gdmFsdWVcbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHByaXZhdGUgcGFyc2UodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCk6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCB7XG4gICAgcmV0dXJuIFNlcXVlbmNlLnBhcnNlVmFsdWUodGhpcy5vcHRpb25zLnR5cGUsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3VtbWFyeSBpbmNyZW1lbnRzIHRoZSBzZXF1ZW5jZVxuICAgKiBAZGVzY3JpcHRpb24gU2VxdWVuY2Ugc3BlY2lmaWMgaW1wbGVtZW50YXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnR9IGN1cnJlbnRcbiAgICogQHBhcmFtIGNvdW50XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5jcmVtZW50KFxuICAgIGN1cnJlbnQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICBjb3VudD86IG51bWJlclxuICApOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IHsgdHlwZSwgaW5jcmVtZW50QnksIG5hbWUsIHN0YXJ0V2l0aCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGlmICh0eXBlICE9PSBcIk51bWJlclwiICYmIHR5cGUgIT09IFwiQmlnSW50XCIpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYENhbm5vdCBpbmNyZW1lbnQgc2VxdWVuY2Ugb2YgdHlwZSAke3R5cGV9IHdpdGggJHtjb3VudH1gXG4gICAgICApO1xuICAgIGxldCBuZXh0OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG4gICAgdHJ5IHtcbiAgICAgIG5leHQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmF3KHtcbiAgICAgICAgcXVlcnk6IGBTRUxFQ1QgbmV4dHZhbCgkMSk7YCxcbiAgICAgICAgdmFsdWVzOiBbbmFtZV0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBpZiAoIShlIGluc3RhbmNlb2YgTm90Rm91bmRFcnJvcikpIHRocm93IGU7XG4gICAgICBuZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyh7XG4gICAgICAgIHF1ZXJ5OiBgQ1JFQVRFIFNFUVVFTkNFIElGIE5PVCBFWElTVFMgJDEgU1RBUlQgV0lUSCAkMiBJTkNSRU1FTlQgQlkgJDMgTk8gQ1lDTEU7YCxcbiAgICAgICAgdmFsdWVzOiBbbmFtZSwgc3RhcnRXaXRoLCBpbmNyZW1lbnRCeV0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dCBhcyBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIHRoZSBuZXh0IHZhbHVlIGluIHRoIHNlcXVlbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBjYWxscyB7QGxpbmsgU2VxdWVuY2UjcGFyc2V9IG9uIHRoZSBjdXJyZW50IHZhbHVlXG4gICAqIGZvbGxvd2VkIGJ5IHtAbGluayBTZXF1ZW5jZSNpbmNyZW1lbnR9XG4gICAqXG4gICAqL1xuICBhc3luYyBuZXh0KCk6IFByb21pc2U8bnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50PiB7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IHRoaXMuY3VycmVudCgpO1xuICAgIHJldHVybiB0aGlzLmluY3JlbWVudChjdXJyZW50KTtcbiAgfVxuXG4gIGFzeW5jIHJhbmdlKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPChudW1iZXIgfCBzdHJpbmcgfCBiaWdpbnQpW10+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gKGF3YWl0IHRoaXMuY3VycmVudCgpKSBhcyBudW1iZXI7XG4gICAgY29uc3QgaW5jcmVtZW50QnkgPSB0aGlzLnBhcnNlKHRoaXMub3B0aW9ucy5pbmNyZW1lbnRCeSkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IG5leHQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCA9IGF3YWl0IHRoaXMuaW5jcmVtZW50KFxuICAgICAgY3VycmVudCxcbiAgICAgICh0aGlzLnBhcnNlKGNvdW50KSBhcyBudW1iZXIpICogaW5jcmVtZW50QnlcbiAgICApO1xuICAgIGNvbnN0IHJhbmdlOiAobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdID0gW107XG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMTsgaSA8PSBjb3VudDsgaSsrKSB7XG4gICAgICByYW5nZS5wdXNoKGN1cnJlbnQgKyBpbmNyZW1lbnRCeSAqICh0aGlzLnBhcnNlKGkpIGFzIG51bWJlcikpO1xuICAgIH1cbiAgICBpZiAocmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gIT09IG5leHQpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk1pc2NhbGN1bGF0aW9uIG9mIHJhbmdlXCIpO1xuICAgIHJldHVybiByYW5nZTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSW5kZXhNZXRhZGF0YSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUmVwb3NpdG9yeSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBUeXBlT1JNS2V5cyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERlZmF1bHRTZXBhcmF0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFR5cGVPUk1RdWVyeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBuYW1lIGZvciBhIENvdWNoREIgaW5kZXhcbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzdGFuZGFyZGl6ZWQgbmFtZSBmb3IgYSBDb3VjaERCIGluZGV4IGJ5IGNvbWJpbmluZyBuYW1lIHBhcnRzLCBjb21wb3NpdGlvbnMsIGFuZCBkaXJlY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWUgLSBBcnJheSBvZiBuYW1lIHBhcnRzIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7T3JkZXJEaXJlY3Rpb259IFtkaXJlY3Rpb25dIC0gT3B0aW9uYWwgc29ydCBkaXJlY3Rpb24gZm9yIHRoZSBpbmRleFxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2NvbXBvc2l0aW9uc10gLSBPcHRpb25hbCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdG8gaW5jbHVkZSBpbiB0aGUgaW5kZXggbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9RGVmYXVsdFNlcGFyYXRvcl0gLSBUaGUgc2VwYXJhdG9yIHRvIHVzZSBiZXR3ZWVuIHBhcnRzIG9mIHRoZSBpbmRleCBuYW1lXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBnZW5lcmF0ZWQgaW5kZXggbmFtZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItY291Y2hkYlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUluZGV4TmFtZShcbiAgbmFtZTogc3RyaW5nW10sXG4gIGRpcmVjdGlvbj86IE9yZGVyRGlyZWN0aW9uLFxuICBjb21wb3NpdGlvbnM/OiBzdHJpbmdbXSxcbiAgc2VwYXJhdG9yID0gRGVmYXVsdFNlcGFyYXRvclxuKSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmFtZS5tYXAoKG4pID0+IChuID09PSBUeXBlT1JNS2V5cy5UQUJMRSA/IFwidGFibGVcIiA6IG4pKSxcbiAgICAuLi4oY29tcG9zaXRpb25zIHx8IFtdKSxcbiAgICAuLi4oZGlyZWN0aW9uID8gW2RpcmVjdGlvbl0gOiBbXSksXG4gICAgVHlwZU9STUtleXMuSU5ERVgsXG4gIF0uam9pbihzZXBhcmF0b3IpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgQ291Y2hEQiBpbmRleCBjb25maWd1cmF0aW9ucyBmb3IgbW9kZWxzXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc2V0IG9mIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnMgYmFzZWQgb24gdGhlIG1ldGFkYXRhIG9mIHRoZSBwcm92aWRlZCBtb2RlbHNcbiAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsXG4gKiBAcGFyYW0gbW9kZWxzIC0gQXJyYXkgb2YgbW9kZWwgY29uc3RydWN0b3JzIHRvIGdlbmVyYXRlIGluZGV4ZXMgZm9yXG4gKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IEFycmF5IG9mIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnNcbiAqIEBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4ZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IGdlbmVyYXRlSW5kZXhlc1xuICogICBwYXJ0aWNpcGFudCBnZW5lcmF0ZUluZGV4TmFtZVxuICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gKlxuICogICBDYWxsZXItPj5nZW5lcmF0ZUluZGV4ZXM6IG1vZGVsc1xuICpcbiAqICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIGJhc2UgdGFibGUgaW5kZXhcbiAqICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleE5hbWU6IFtDb3VjaERCS2V5cy5UQUJMRV1cbiAqICAgZ2VuZXJhdGVJbmRleE5hbWUtLT4+Z2VuZXJhdGVJbmRleGVzOiB0YWJsZU5hbWVcbiAqICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleGVzOiBDcmVhdGUgdGFibGUgaW5kZXggY29uZmlnXG4gKlxuICogICBsb29wIEZvciBlYWNoIG1vZGVsXG4gKiAgICAgZ2VuZXJhdGVJbmRleGVzLT4+UmVwb3NpdG9yeTogR2V0IGluZGV4ZXMgbWV0YWRhdGFcbiAqICAgICBSZXBvc2l0b3J5LS0+PmdlbmVyYXRlSW5kZXhlczogaW5kZXggbWV0YWRhdGFcbiAqXG4gKiAgICAgbG9vcCBGb3IgZWFjaCBpbmRleCBpbiBtZXRhZGF0YVxuICogICAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogRXh0cmFjdCBpbmRleCBwcm9wZXJ0aWVzXG4gKiAgICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5SZXBvc2l0b3J5OiBHZXQgdGFibGUgbmFtZVxuICogICAgICAgUmVwb3NpdG9yeS0tPj5nZW5lcmF0ZUluZGV4ZXM6IHRhYmxlTmFtZVxuICpcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IERlZmluZSBuZXN0ZWQgZ2VuZXJhdGUgZnVuY3Rpb25cbiAqXG4gKiAgICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5nZW5lcmF0ZUluZGV4ZXM6IENhbGwgZ2VuZXJhdGUoKSBmb3IgZGVmYXVsdCBvcmRlclxuICogICAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIGluZGV4IG5hbWUgYW5kIGNvbmZpZ1xuICpcbiAqICAgICAgIGFsdCBIYXMgZGlyZWN0aW9uc1xuICogICAgICAgICBsb29wIEZvciBlYWNoIGRpcmVjdGlvblxuICogICAgICAgICAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhlczogQ2FsbCBnZW5lcmF0ZShkaXJlY3Rpb24pXG4gKiAgICAgICAgICAgTm90ZSBvdmVyIGdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIG9yZGVyZWQgaW5kZXggY29uZmlnXG4gKiAgICAgICAgIGVuZFxuICogICAgICAgZW5kXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICpcbiAqICAgZ2VuZXJhdGVJbmRleGVzLS0+PkNhbGxlcjogQXJyYXkgb2YgaW5kZXggY29uZmlndXJhdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlSW5kZXhlczxNIGV4dGVuZHMgTW9kZWw+KFxuICBtb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbik6IFR5cGVPUk1RdWVyeVtdIHtcbiAgY29uc3QgdGFibGVOYW1lID0gZ2VuZXJhdGVJbmRleE5hbWUoW1R5cGVPUk1LZXlzLlRBQkxFXSk7XG4gIGNvbnN0IGluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVPUk1RdWVyeT4gPSB7fTtcbiAgaW5kZXhlc1t0YWJsZU5hbWVdID0ge1xuICAgIHF1ZXJ5OiBgYCxcbiAgICB2YWx1ZXM6IFtdLFxuICB9O1xuXG4gIG1vZGVscy5mb3JFYWNoKChtKSA9PiB7XG4gICAgY29uc3QgaW5kOiBSZWNvcmQ8c3RyaW5nLCBJbmRleE1ldGFkYXRhPiA9IFJlcG9zaXRvcnkuaW5kZXhlcyhtKTtcbiAgICBPYmplY3QuZW50cmllcyhpbmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgY29uc3QgayA9IE9iamVjdC5rZXlzKHZhbHVlKVswXTtcblxuICAgICAgbGV0IHsgY29tcG9zaXRpb25zIH0gPSAodmFsdWUgYXMgYW55KVtrXTtcbiAgICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUobSk7XG4gICAgICBjb21wb3NpdGlvbnMgPSBjb21wb3NpdGlvbnMgfHwgW107XG5cbiAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlKCkge1xuICAgICAgICBjb25zdCBuYW1lID0gW2tleSwgLi4uKGNvbXBvc2l0aW9ucyBhcyBbXSksIFBlcnNpc3RlbmNlS2V5cy5JTkRFWF0uam9pbihcbiAgICAgICAgICBEZWZhdWx0U2VwYXJhdG9yXG4gICAgICAgICk7XG5cbiAgICAgICAgaW5kZXhlc1tuYW1lXSA9IHtcbiAgICAgICAgICBxdWVyeTogYENSRUFURSBJTkRFWCAkMSBPTiAkMiAoJDMpO2AsXG4gICAgICAgICAgdmFsdWVzOiBbbmFtZSwgdGFibGVOYW1lLCBrZXldLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBnZW5lcmF0ZSgpO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIE9iamVjdC52YWx1ZXMoaW5kZXhlcyk7XG59XG4iLCJpbXBvcnQge1xuICB0eXBlIENvbnN0cnVjdG9yLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5LCB1c2VzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBDb250ZXh0LFxuICBlbmZvcmNlREJEZWNvcmF0b3JzLFxuICBPcGVyYXRpb25LZXlzLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVHlwZU9STUZsYWdzLCBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi9UeXBlT1JNQWRhcHRlclwiO1xuaW1wb3J0IHsgVHlwZU9STUZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiBiYWNrZWQgYnkgVHlwZU9STS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIENSVUQgb3BlcmF0aW9ucyBmb3IgYSBnaXZlbiBNb2RlbCB1c2luZyB0aGUge0BsaW5rIFR5cGVPUk1BZGFwdGVyfSwgaW5jbHVkaW5nIGJ1bGsgb3BlcmF0aW9ucyBhbmQgcXVlcnkgYnVpbGRlciBhY2Nlc3Mgd2hpbGUgcHJlc2VydmluZyBEZWNhZi50cyByZXBvc2l0b3J5IHNlbWFudGljcy5cbiAqIEB0ZW1wbGF0ZSBNIFR5cGUgZXh0ZW5kaW5nIE1vZGVsIHRoYXQgdGhpcyByZXBvc2l0b3J5IHdpbGwgbWFuYWdlLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgYWRhcHRlciB1c2VkIHRvIGV4ZWN1dGUgcGVyc2lzdGVuY2Ugb3BlcmF0aW9ucy5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIFRoZSBNb2RlbCBjb25zdHJ1Y3RvciBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXBvc2l0b3J5LlxuICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgZm9yd2FyZGVkIHRvIHRoZSBiYXNlIFJlcG9zaXRvcnkuXG4gKiBAY2xhc3MgVHlwZU9STVJlcG9zaXRvcnlcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGluZyBhIHJlcG9zaXRvcnlcbiAqIGNvbnN0IHJlcG8gPSBuZXcgVHlwZU9STVJlcG9zaXRvcnk8VXNlcj4oYWRhcHRlciwgVXNlcik7XG4gKiBjb25zdCBjcmVhdGVkID0gYXdhaXQgcmVwby5jcmVhdGUobmV3IFVzZXIoeyBuYW1lOiBcIkFsaWNlXCIgfSkpO1xuICogY29uc3QgcmVhZCA9IGF3YWl0IHJlcG8ucmVhZChjcmVhdGVkLmlkKTtcbiAqXG4gKiAvLyBCdWxrIGNyZWF0ZVxuICogYXdhaXQgcmVwby5jcmVhdGVBbGwoW25ldyBVc2VyKHsgbmFtZTogXCJBXCIgfSksIG5ldyBVc2VyKHsgbmFtZTogXCJCXCIgfSldKTtcbiAqXG4gKiAvLyBVc2luZyB0aGUgcXVlcnkgYnVpbGRlclxuICogY29uc3QgcWIgPSByZXBvLnF1ZXJ5QnVpbGRlcigpO1xuICogY29uc3Qgcm93cyA9IGF3YWl0IHFiLndoZXJlKFwibmFtZSA9IDpuYW1lXCIsIHsgbmFtZTogXCJBbGljZVwiIH0pLmdldE1hbnkoKTtcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEFwcFxuICogICBwYXJ0aWNpcGFudCBSZXBvIGFzIFR5cGVPUk1SZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgREIgYXMgVHlwZU9STS9EYXRhU291cmNlXG4gKlxuICogICBBcHAtPj5SZXBvOiBjcmVhdGUobW9kZWwpXG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBwcmVwYXJlKG1vZGVsLCBwaylcbiAqICAgQWRhcHRlci0tPj5SZXBvOiB7IHJlY29yZCwgaWQsIHRyYW5zaWVudCB9XG4gKiAgIFJlcG8tPj5BZGFwdGVyOiBjcmVhdGUodGFibGUsIGlkLCBtb2RlbCwgLi4uYXJncylcbiAqICAgQWRhcHRlci0+PkRCOiBJTlNFUlQgLi4uXG4gKiAgIERCLS0+PkFkYXB0ZXI6IHJvd1xuICogICBBZGFwdGVyLS0+PlJlcG86IHJvd1xuICogICBSZXBvLT4+QWRhcHRlcjogcmV2ZXJ0KHJvdywgY2xhenosIHBrLCBpZClcbiAqICAgQWRhcHRlci0tPj5SZXBvOiBtb2RlbFxuICogICBSZXBvLS0+PkFwcDogbW9kZWxcbiAqL1xuQHVzZXMoVHlwZU9STUZsYXZvdXIpXG5leHBvcnQgY2xhc3MgVHlwZU9STVJlcG9zaXRvcnk8TSBleHRlbmRzIE1vZGVsPiBleHRlbmRzIFJlcG9zaXRvcnk8XG4gIE0sXG4gIFR5cGVPUk1RdWVyeTxNLCBhbnk+LFxuICBUeXBlT1JNQWRhcHRlcixcbiAgVHlwZU9STUZsYWdzLFxuICBDb250ZXh0PFR5cGVPUk1GbGFncz5cbj4ge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBUeXBlT1JNQWRhcHRlciwgbW9kZWw6IENvbnN0cnVjdG9yPE0+LCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIHN1cGVyKGFkYXB0ZXIsIG1vZGVsLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIFR5cGVPUk0gcXVlcnkgYnVpbGRlciBmb3IgdGhlIHJlcG9zaXRvcnkgZW50aXR5LlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgU2VsZWN0UXVlcnlCdWlsZGVyIGJvdW5kIHRvIHRoaXMgcmVwb3NpdG9yeSdzIGVudGl0eSBmb3IgYWR2YW5jZWQgcXVlcnlpbmcuXG4gICAqIEByZXR1cm4ge2ltcG9ydChcInR5cGVvcm1cIikuU2VsZWN0UXVlcnlCdWlsZGVyPGFueT59IEEgVHlwZU9STSBTZWxlY3RRdWVyeUJ1aWxkZXIgaW5zdGFuY2UuXG4gICAqL1xuICBxdWVyeUJ1aWxkZXIoKSB7XG4gICAgY29uc3QgcmVwbyA9IHRoaXMuYWRhcHRlci5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkoXG4gICAgICB0aGlzLmNsYXNzW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuY2xhc3NdXG4gICAgKTtcbiAgICByZXR1cm4gcmVwby5jcmVhdGVRdWVyeUJ1aWxkZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhbmQgcGVyc2lzdHMgYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIG1vZGVsLCBkZWxlZ2F0ZXMgaW5zZXJ0aW9uIHRvIHRoZSBhZGFwdGVyLCBhbmQgcmVoeWRyYXRlcyB0aGUgcGVyc2lzdGVkIHN0YXRlIGJhY2sgaW50byBhIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIFRoZSBtb2RlbCB0byBjcmVhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBjcmVhdGVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZCxcbiAgICAgIG1vZGVsIGFzIGFueSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGxldCBjOiBDb250ZXh0PFR5cGVPUk1GbGFncz4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGFyZ3MubGVuZ3RoKSBjID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdIGFzIENvbnRleHQ8VHlwZU9STUZsYWdzPjtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihcbiAgICAgIHJlY29yZCxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICB0aGlzLnBrLFxuICAgICAgaWQsXG4gICAgICBjICYmIGMuZ2V0KFwicmVidWlsZFdpdGhUcmFuc2llbnRcIikgPyB0cmFuc2llbnQgOiB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIG1vZGVsIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElELlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBkYXRhYmFzZSB1c2luZyBpdHMgcHJpbWFyeSBrZXkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxiaWdpbnR9IGlkIC0gVGhlIHByaW1hcnkga2V5IG9mIHRoZSBtb2RlbCB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSByZXRyaWV2ZWQgbW9kZWwgaW5zdGFuY2UuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkKFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQgYXMgc3RyaW5nLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmdcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhbmQgcGVyc2lzdHMgYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMgdGhlIG1vZGVsLCBkZWxlZ2F0ZXMgdXBkYXRlIHRvIHRoZSBhZGFwdGVyLCBhbmQgcmVoeWRyYXRlcyB0aGUgcGVyc2lzdGVkIHN0YXRlIGJhY2sgaW50byBhIE1vZGVsIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge019IG1vZGVsIFRoZSBtb2RlbCB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSB1cGRhdGVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZCxcbiAgICAgIG1vZGVsLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4ocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCwgdHJhbnNpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIG1vZGVsIGZyb20gdGhlIGRhdGFiYXNlIGJ5IElELlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgaXRzIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IFRoZSBkZWxldGVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGUoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGlkIGFzIHN0cmluZyxcbiAgICAgIHRoaXMucGsgYXMgc3RyaW5nLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4obSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBWYWxpZGF0ZXMgYW5kIHByZXBhcmVzIG1vZGVscyBmb3IgYnVsayBjcmVhdGlvbi5cbiAgICogQHN1bW1hcnkgQXBwbGllcyBkZWNvcmF0b3ItYmFzZWQgdmFsaWRhdGlvbnMgYW5kIHJldHVybnMgdHJhbnNmb3JtZWQgbW9kZWxzIHdpdGggY29udGV4dCBhcmdzIGZvciBjcmVhdGVBbGwuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgVGhlIG1vZGVscyB0byBiZSBjcmVhdGVkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFtNW10sIC4uLmFueVtdXT59IFRoZSBwcmVwYXJlZCBtb2RlbHMgYW5kIGZvcndhcmRlZCBhcmdzIHR1cGxlLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbFByZWZpeChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pIHtcbiAgICBjb25zdCBjb250ZXh0QXJncyA9IGF3YWl0IENvbnRleHQuYXJncyhcbiAgICAgIE9wZXJhdGlvbktleXMuQ1JFQVRFLFxuICAgICAgdGhpcy5jbGFzcyxcbiAgICAgIGFyZ3MsXG4gICAgICB0aGlzLmFkYXB0ZXIsXG4gICAgICB0aGlzLl9vdmVycmlkZXMgfHwge31cbiAgICApO1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuXG4gICAgbW9kZWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtb2RlbHMubWFwKGFzeW5jIChtKSA9PiB7XG4gICAgICAgIG0gPSBuZXcgdGhpcy5jbGFzcyhtKTtcbiAgICAgICAgYXdhaXQgZW5mb3JjZURCRGVjb3JhdG9ycyhcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGNvbnRleHRBcmdzLmNvbnRleHQsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgICAgICBPcGVyYXRpb25LZXlzLk9OXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtO1xuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IGVycm9ycyA9IG1vZGVsc1xuICAgICAgLm1hcCgobSkgPT5cbiAgICAgICAgbS5oYXNFcnJvcnMoXG4gICAgICAgICAgLi4uKGNvbnRleHRBcmdzLmNvbnRleHQuZ2V0KFwiaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzXCIpIHx8IFtdKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAucmVkdWNlKChhY2N1bTogc3RyaW5nIHwgdW5kZWZpbmVkLCBlLCBpKSA9PiB7XG4gICAgICAgIGlmIChlKVxuICAgICAgICAgIGFjY3VtID1cbiAgICAgICAgICAgIHR5cGVvZiBhY2N1bSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICA/IGFjY3VtICsgYFxcbiAtICR7aX06ICR7ZS50b1N0cmluZygpfWBcbiAgICAgICAgICAgICAgOiBgIC0gJHtpfTogJHtlLnRvU3RyaW5nKCl9YDtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwgdW5kZWZpbmVkKTtcbiAgICBpZiAoZXJyb3JzKSB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGVycm9ycyk7XG4gICAgcmV0dXJuIFttb2RlbHMsIC4uLmNvbnRleHRBcmdzLmFyZ3NdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBQcmVwYXJlcywgcGVyc2lzdHMsIGFuZCByZWh5ZHJhdGVzIGEgYmF0Y2ggb2YgbW9kZWxzLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIFRoZSBtb2RlbHMgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBjcmVhdGVkIG1vZGVscy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChtb2RlbHM6IE1bXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGlmICghbW9kZWxzLmxlbmd0aCkgcmV0dXJuIG1vZGVscztcbiAgICBjb25zdCBwcmVwYXJlZCA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCBpZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAuaWQpO1xuICAgIGxldCByZWNvcmRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLnJlY29yZCk7XG4gICAgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5jcmVhdGVBbGwoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGlkcyBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICAgICAgbW9kZWxzLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZHNbaV0gYXMgc3RyaW5nIHwgbnVtYmVyKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIG11bHRpcGxlIG1vZGVscyBieSB0aGVpciBwcmltYXJ5IGtleXMuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhIGxpc3Qgb2YgbW9kZWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3ZpZGVkIGtleXMuXG4gICAqIEBwYXJhbSB7KHN0cmluZ1tdfG51bWJlcltdKX0ga2V5cyBUaGUgcHJpbWFyeSBrZXlzIHRvIHJlYWQuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHJldHJpZXZlZCBtb2RlbHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWRBbGwoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGtleXMsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgocjogUmVjb3JkPHN0cmluZywgYW55PiwgaTogbnVtYmVyKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgbW9kZWxzIGF0IG9uY2UuXG4gICAqIEBzdW1tYXJ5IFBlcnNpc3RzIGEgYmF0Y2ggb2YgbW9kZWwgdXBkYXRlcyBhbmQgcmV0dXJucyB0aGVpciByZWh5ZHJhdGVkIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyBUaGUgbW9kZWxzIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgdXBkYXRlZCBtb2RlbHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZWNvcmRzID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgdGhpcy5waykpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICByZWNvcmRzLm1hcCgocikgPT4gci5pZCksXG4gICAgICBtb2RlbHMsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB1cGRhdGVkLm1hcCgodTogUmVjb3JkPHN0cmluZywgYW55PiwgaTogbnVtYmVyKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydCh1LCB0aGlzLmNsYXNzLCB0aGlzLnBrLCByZWNvcmRzW2ldLmlkKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgbXVsdGlwbGUgbW9kZWxzIGF0IG9uY2UuXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBsaXN0IG9mIG1vZGVscyBieSB0aGVpciBwcmltYXJ5IGtleXMgYW5kIHJldHVybnMgdGhlaXIgbGFzdCBwZXJzaXN0ZWQgc3RhdGVzLlxuICAgKiBAcGFyYW0geyhzdHJpbmdbXXxudW1iZXJbXSl9IGtleXMgVGhlIHByaW1hcnkga2V5cyB0byBkZWxldGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIGRlbGV0ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlQWxsKFxuICAgIGtleXM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmRlbGV0ZUFsbChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAga2V5cyxcbiAgICAgIHRoaXMucGsgYXMgc3RyaW5nLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdHMubWFwKChyOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBpOiBudW1iZXIpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGtleXNbaV0pXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgRW50aXR5U3Vic2NyaWJlckludGVyZmFjZSxcbiAgRXZlbnRTdWJzY3JpYmVyLFxuICBJbnNlcnRFdmVudCxcbiAgUmVtb3ZlRXZlbnQsXG4gIFVwZGF0ZUV2ZW50LFxufSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgRXZlbnRJZHMsIFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlT1JNIGV2ZW50IHN1YnNjcmliZXIgdGhhdCBmb3J3YXJkcyBlbnRpdHkgbGlmZWN5Y2xlIGV2ZW50cyB0byB0aGUgYWRhcHRlci5cbiAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGluc2VydCwgdXBkYXRlLCBhbmQgcmVtb3ZlIGV2ZW50cyBlbWl0dGVkIGJ5IFR5cGVPUk0gYW5kIG5vdGlmaWVzIHRoZSBEZWNhZi50cyBhZGFwdGVyIHNvIHRoYXQgb2JzZXJ2ZXJzIGNhbiBiZSB1cGRhdGVkIGFjY29yZGluZ2x5LlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyIHVzZWQgdG8gcHJvcGFnYXRlIGV2ZW50cyBhbmQgbG9vayB1cCBtZXRhZGF0YS5cbiAqIEBjbGFzc1xuICogQGV4YW1wbGVcbiAqIC8vIFJlZ2lzdGVyaW5nIHRoZSBzdWJzY3JpYmVyIHdoZW4gY3JlYXRpbmcgYSBEYXRhU291cmNlXG4gKiAvLyBkYXRhU291cmNlT3B0aW9ucy5zdWJzY3JpYmVycyA9IFtuZXcgVHlwZU9STUV2ZW50U3Vic2NyaWJlcihhZGFwdGVyKV07XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBUeXBlT1JNXG4gKiAgIHBhcnRpY2lwYW50IFN1YnNjcmliZXIgYXMgVHlwZU9STUV2ZW50U3Vic2NyaWJlclxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IE9ic2VydmVyc1xuICpcbiAqICAgVHlwZU9STS0+PlN1YnNjcmliZXI6IGFmdGVySW5zZXJ0KGVudGl0eSlcbiAqICAgU3Vic2NyaWJlci0+PkFkYXB0ZXI6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgQ1JFQVRFLCBbaWRdKVxuICogICBBZGFwdGVyLT4+T2JzZXJ2ZXJzOiBub3RpZnkodGFibGUsIENSRUFURSwgW2lkXSlcbiAqXG4gKiAgIFR5cGVPUk0tPj5TdWJzY3JpYmVyOiBhZnRlclVwZGF0ZShldmVudClcbiAqICAgU3Vic2NyaWJlci0+PkFkYXB0ZXI6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgVVBEQVRFLCBbaWRdKVxuICogICBBZGFwdGVyLT4+T2JzZXJ2ZXJzOiBub3RpZnkodGFibGUsIFVQREFURSwgW2lkXSlcbiAqXG4gKiAgIFR5cGVPUk0tPj5TdWJzY3JpYmVyOiBhZnRlclJlbW92ZShldmVudClcbiAqICAgU3Vic2NyaWJlci0+PkFkYXB0ZXI6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgREVMRVRFLCBbaWRdKVxuICogICBBZGFwdGVyLT4+T2JzZXJ2ZXJzOiBub3RpZnkodGFibGUsIERFTEVURSwgW2lkXSlcbiAqL1xuQEV2ZW50U3Vic2NyaWJlcigpXG5leHBvcnQgY2xhc3MgVHlwZU9STUV2ZW50U3Vic2NyaWJlciBpbXBsZW1lbnRzIEVudGl0eVN1YnNjcmliZXJJbnRlcmZhY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFuZGxlcjogKFxuICAgICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgICBpZHM6IEV2ZW50SWRzXG4gICAgKSA9PiB2b2lkXG4gICkge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcG9zdC1pbnNlcnQgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBjcmVhdGUgb3BlcmF0aW9uIGZvciB0aGUgaW5zZXJ0ZWQgZW50aXR5LlxuICAgKiBAcGFyYW0ge0luc2VydEV2ZW50PGFueT59IGV2ZW50IFRoZSBUeXBlT1JNIGluc2VydCBldmVudC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fHZvaWR9IEEgcHJvbWlzZSB3aGVuIGFzeW5jIG9yIHZvaWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgYWZ0ZXJJbnNlcnQoZXZlbnQ6IEluc2VydEV2ZW50PGFueT4pOiBQcm9taXNlPGFueT4gfCB2b2lkIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9IE1vZGVsLmdldChldmVudC5lbnRpdHkuY29uc3RydWN0b3IubmFtZSk7XG4gICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcmVnaXN0ZXJlZCBtb2RlbCBmb3VuZCBmb3IgJHtldmVudC5lbnRpdHkuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUoY29uc3RydWN0b3IpO1xuXG4gICAgdGhpcy5oYW5kbGVyKHRhYmxlTmFtZSwgT3BlcmF0aW9uS2V5cy5DUkVBVEUsIFtldmVudC5lbnRpdHlJZCBhcyBhbnldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBwb3N0LXJlbW92ZSBldmVudHMuXG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIG9ic2VydmVycyBhYm91dCBhIGRlbGV0ZSBvcGVyYXRpb24gZm9yIHRoZSByZW1vdmVkIGVudGl0eS5cbiAgICogQHBhcmFtIHtSZW1vdmVFdmVudDxhbnk+fSBldmVudCBUaGUgVHlwZU9STSByZW1vdmUgZXZlbnQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pnx2b2lkfSBBIHByb21pc2Ugd2hlbiBhc3luYyBvciB2b2lkIG90aGVyd2lzZS5cbiAgICovXG4gIGFmdGVyUmVtb3ZlKGV2ZW50OiBSZW1vdmVFdmVudDxhbnk+KTogUHJvbWlzZTxhbnk+IHwgdm9pZCB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKGNvbnN0cnVjdG9yKTtcblxuICAgIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuREVMRVRFLCBbZXZlbnQuZW50aXR5SWQgYXMgYW55XSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcG9zdC11cGRhdGUgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYW4gdXBkYXRlIG9wZXJhdGlvbiBmb3IgdGhlIG1vZGlmaWVkIGVudGl0eS5cbiAgICogQHBhcmFtIHtVcGRhdGVFdmVudDxhbnk+fSBldmVudCBUaGUgVHlwZU9STSB1cGRhdGUgZXZlbnQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pnx2b2lkfSBBIHByb21pc2Ugd2hlbiBhc3luYyBvciB2b2lkIG90aGVyd2lzZS5cbiAgICovXG4gIGFmdGVyVXBkYXRlKGV2ZW50OiBVcGRhdGVFdmVudDxhbnk+KTogUHJvbWlzZTxhbnk+IHwgdm9pZCB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZXZlbnQuZGF0YWJhc2VFbnRpdHkuY29uc3RydWN0b3IubmFtZSk7XG4gICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcmVnaXN0ZXJlZCBtb2RlbCBmb3VuZCBmb3IgJHtldmVudC5kYXRhYmFzZUVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjb25zdHJ1Y3Rvcik7XG5cbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyKHRhYmxlTmFtZSwgT3BlcmF0aW9uS2V5cy5VUERBVEUsIFtcbiAgICAgIChldmVudC5lbnRpdHkgYXMgYW55KVtcImlkXCJdIGFzIGFueSxcbiAgICBdKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGlzcGF0Y2gsIEV2ZW50SWRzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RhdGEtc291cmNlL0RhdGFTb3VyY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBUeXBlT1JNRXZlbnRTdWJzY3JpYmVyIH0gZnJvbSBcIi4vVHlwZU9STUV2ZW50U3Vic2NyaWJlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEaXNwYXRjaGVyIGZvciBUeXBlT1JNLWRyaXZlbiBjaGFuZ2UgZXZlbnRzLlxuICogQHN1bW1hcnkgU3Vic2NyaWJlcyBhIFR5cGVPUk0gRGF0YVNvdXJjZSB3aXRoIGEgY3VzdG9tIEVudGl0eVN1YnNjcmliZXIgdG8gbm90aWZ5IG9ic2VydmVycyB3aGVuIHJlY29yZHMgYXJlIGNyZWF0ZWQsIHVwZGF0ZWQsIG9yIGRlbGV0ZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gW3RpbWVvdXQ9NTAwMF0gVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGluaXRpYWxpemF0aW9uIHJldHJpZXMuXG4gKiBAY2xhc3MgVHlwZU9STURpc3BhdGNoXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgZGlzcGF0Y2hlciBmb3IgYSBUeXBlT1JNIERhdGFTb3VyY2VcbiAqIGNvbnN0IGRpc3BhdGNoID0gbmV3IFR5cGVPUk1EaXNwYXRjaCgpO1xuICogYXdhaXQgZGlzcGF0Y2gub2JzZXJ2ZShhZGFwdGVyLCBhZGFwdGVyLmRhdGFTb3VyY2Uub3B0aW9ucyk7XG4gKlxuICogLy8gVGhlIGRpc3BhdGNoZXIgcmVnaXN0ZXJzIGEgVHlwZU9STUV2ZW50U3Vic2NyaWJlciBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzIHdoZW4gZW50aXRpZXMgY2hhbmdlLlxuICogQG1lcm1haWRcbiAqIGNsYXNzRGlhZ3JhbVxuICogICBjbGFzcyBEaXNwYXRjaCB7XG4gKiAgICAgK2luaXRpYWxpemUoKVxuICogICAgICt1cGRhdGVPYnNlcnZlcnMoKVxuICogICB9XG4gKiAgIGNsYXNzIFR5cGVPUk1EaXNwYXRjaCB7XG4gKiAgICAgLW9ic2VydmVyTGFzdFVwZGF0ZT86IHN0cmluZ1xuICogICAgIC1hdHRlbXB0Q291bnRlcjogbnVtYmVyXG4gKiAgICAgLXRpbWVvdXQ6IG51bWJlclxuICogICAgICtjb25zdHJ1Y3Rvcih0aW1lb3V0KVxuICogICAgICNub3RpZmljYXRpb25IYW5kbGVyKClcbiAqICAgICAjaW5pdGlhbGl6ZSgpXG4gKiAgIH1cbiAqICAgRGlzcGF0Y2ggPHwtLSBUeXBlT1JNRGlzcGF0Y2hcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1EaXNwYXRjaCBleHRlbmRzIERpc3BhdGNoPERhdGFTb3VyY2VPcHRpb25zPiB7XG4gIHByaXZhdGUgb2JzZXJ2ZXJMYXN0VXBkYXRlPzogc3RyaW5nO1xuICBwcml2YXRlIGF0dGVtcHRDb3VudGVyOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdGltZW91dCA9IDUwMDApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgVHlwZU9STSBub3RpZmljYXRpb24gZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBIYW5kbGVzIGNoYW5nZSBub3RpZmljYXRpb25zICh0cmFuc2xhdGVkIGZyb20gVHlwZU9STSBldmVudHMpIGFuZCBub3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgcmVjb3JkIGNoYW5nZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZSBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIFRoZSBub3RpZmljYXRpb24gcGF5bG9hZC5cbiAgICogQHBhcmFtIHtFdmVudElkc30gaWRzIFRoZSBub3RpZmljYXRpb24gcGF5bG9hZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbm90aWZpY2F0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIFBvc3RncmVTUUxEaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTG9nZ2VyXG4gICAqICAgcGFydGljaXBhbnQgTyBhcyBPYnNlcnZlcnNcbiAgICogICBOb3RlIG92ZXIgRDogUmVjZWl2ZSBub3RpZmljYXRpb24gZnJvbSBQb3N0Z3JlU1FMXG4gICAqICAgRC0+PkQ6IFBhcnNlIG5vdGlmaWNhdGlvbiBwYXlsb2FkXG4gICAqICAgRC0+PkQ6IEV4dHJhY3QgdGFibGUsIG9wZXJhdGlvbiwgYW5kIGlkc1xuICAgKiAgIEQtPj5POiB1cGRhdGVPYnNlcnZlcnModGFibGUsIG9wZXJhdGlvbiwgaWRzKVxuICAgKiAgIEQtPj5EOiBVcGRhdGUgb2JzZXJ2ZXJMYXN0VXBkYXRlXG4gICAqICAgRC0+Pkw6IExvZyBzdWNjZXNzZnVsIGRpc3BhdGNoXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgbm90aWZpY2F0aW9uSGFuZGxlcihcbiAgICB0YWJsZTogc3RyaW5nLFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBpZHM6IEV2ZW50SWRzXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLm5vdGlmaWNhdGlvbkhhbmRsZXIpO1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3RpZnkgb2JzZXJ2ZXJzXG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyh0YWJsZSwgb3BlcmF0aW9uLCBpZHMpO1xuICAgICAgdGhpcy5vYnNlcnZlckxhc3RVcGRhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBsb2cudmVyYm9zZShgT2JzZXJ2ZXIgcmVmcmVzaCBkaXNwYXRjaGVkIGJ5ICR7b3BlcmF0aW9ufSBmb3IgJHt0YWJsZX1gKTtcbiAgICAgIGxvZy5kZWJ1ZyhgcGtzOiAke2lkc31gKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzIG5vdGlmaWNhdGlvbjogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGRpc3BhdGNoZXIgYW5kIHN1YnNjcmliZXMgdG8gVHlwZU9STSBub3RpZmljYXRpb25zLlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgdGhlIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgb24gdGhlIERhdGFTb3VyY2UgYW5kIGxvZ3MgdGhlIHN1YnNjcmlwdGlvbiBsaWZlY3ljbGUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHN1YnNjcmlwdGlvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBUeXBlT1JNRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBTIGFzIHN1YnNjcmliZVRvVHlwZU9STVxuICAgKiAgIHBhcnRpY2lwYW50IERTIGFzIFR5cGVPUk0gRGF0YVNvdXJjZVxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTG9nZ2VyXG4gICAqICAgRC0+PlM6IENhbGwgc3Vic2NyaWJlVG9UeXBlT1JNXG4gICAqICAgUy0+PlM6IENoZWNrIGFkYXB0ZXIgYW5kIG5hdGl2ZVxuICAgKiAgIGFsdCBObyBhZGFwdGVyIG9yIG5hdGl2ZVxuICAgKiAgICAgUy0tPj5TOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUy0+PkRTOiBpbml0aWFsaXplKClcbiAgICogICBTLT4+RFM6IHN1YnNjcmliZXJzLnB1c2goVHlwZU9STUV2ZW50U3Vic2NyaWJlcilcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgRFMtLT4+UzogU3Vic2NyaXB0aW9uIGVzdGFibGlzaGVkXG4gICAqICAgICBTLS0+PkQ6IFByb21pc2UgcmVzb2x2ZXNcbiAgICogICAgIEQtPj5MOiBMb2cgc3VjY2Vzc2Z1bCBzdWJzY3JpcHRpb25cbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBEUy0tPj5TOiBFcnJvclxuICAgKiAgICAgUy0tPj5EOiBQcm9taXNlIHJlamVjdHNcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGFzeW5jIGZ1bmN0aW9uIHN1YnNjcmliZVRvVHlwZU9STSh0aGlzOiBUeXBlT1JNRGlzcGF0Y2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyIHx8ICF0aGlzLm5hdGl2ZSkge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlci9uYXRpdmUgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXI7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghYWRhcHRlci5kYXRhU291cmNlLmlzSW5pdGlhbGl6ZWQpXG4gICAgICAgICAgYXdhaXQgYWRhcHRlci5kYXRhU291cmNlLmluaXRpYWxpemUoKTtcblxuICAgICAgICBhZGFwdGVyLmRhdGFTb3VyY2Uuc3Vic2NyaWJlcnMucHVzaChcbiAgICAgICAgICBuZXcgVHlwZU9STUV2ZW50U3Vic2NyaWJlcih0aGlzLm5vdGlmaWNhdGlvbkhhbmRsZXIuYmluZCh0aGlzKSlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3Vic2NyaWJlVG9UeXBlT1JNXG4gICAgICAuY2FsbCh0aGlzKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdWJzY3JpYmVkIHRvIFR5cGVPUk0gbm90aWZpY2F0aW9uc2ApO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIHN1YnNjcmliZSB0byBUeXBlT1JNIG5vdGlmaWNhdGlvbnM6ICR7ZX1gXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnVwIG1ldGhvZCB0byByZWxlYXNlIHJlc291cmNlcyB3aGVuIHRoZSBkaXNwYXRjaGVyIGlzIG5vIGxvbmdlciBuZWVkZWRcbiAgICovXG4gIHB1YmxpYyBjbGVhbnVwKCk6IHZvaWQge1xuICAgIC8vIGlmICh0aGlzLmFkYXB0ZXIpIHtcbiAgICAvL1xuICAgIC8vICAgY29uc3QgYWRhcHRlciA9IHRoaXMuYWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlcjtcbiAgICAvLyAgIGF3YWl0IGFkYXB0ZXIuZGF0YVNvdXJjZS5kZXN0cm95KCk7XG4gICAgLy8gfVxuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIEphdmFTY3JpcHQgUmVnRXhwIHBhdHRlcm4gdG8gYSBQb3N0Z3JlU1FMIFBPU0lYIHBhdHRlcm4gc3RyaW5nLlxuICogQHN1bW1hcnkgQWNjZXB0cyBlaXRoZXIgYSBSZWdFeHAgb2JqZWN0IG9yIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uICgvcGF0dGVybi9mbGFncykgYW5kIHJldHVybnMgdGhlIHJhdyBwYXR0ZXJuIGNvbXBhdGlibGUgd2l0aCBQb3N0Z3JlU1FMJ3MgfiBhbmQgfiogb3BlcmF0b3JzLlxuICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBqc1JlZ2V4IEphdmFTY3JpcHQgUmVnRXhwIG9iamVjdCBvciBwYXR0ZXJuIHN0cmluZy5cbiAqIEByZXR1cm4ge3N0cmluZ30gUG9zdGdyZVNRTC1jb21wYXRpYmxlIHJlZ2V4IHBhdHRlcm4gc3RyaW5nLlxuICogQGZ1bmN0aW9uIGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgVXRpbHMgYXMgY29udmVydEpzUmVnZXhUb1Bvc3RncmVzXG4gKiAgIEFwcC0+PlV0aWxzOiBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXMoUmVnRXhwKFwiZm9vLipcIixcImlcIikpXG4gKiAgIFV0aWxzLT4+VXRpbHM6IFBhcnNlIHN0cmluZyBvciB1c2UgUmVnRXhwLnNvdXJjZVxuICogICBVdGlscy0tPj5BcHA6IFwiZm9vLipcIlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEpzUmVnZXhUb1Bvc3RncmVzKGpzUmVnZXg6IFJlZ0V4cCB8IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJ4cCA9IG5ldyBSZWdFeHAoL15cXC8oLispXFwvKFxcdyspJC9nKTtcbiAgaWYgKHR5cGVvZiBqc1JlZ2V4ID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbWF0Y2ggPSByeHAuZXhlYyhqc1JlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IFssIHBdID0gbWF0Y2g7XG4gICAgICBqc1JlZ2V4ID0gcDtcbiAgICB9XG4gIH1cbiAgY29uc3QgcmVnZXggPSB0eXBlb2YganNSZWdleCA9PT0gXCJzdHJpbmdcIiA/IG5ldyBSZWdFeHAoanNSZWdleCkgOiBqc1JlZ2V4O1xuXG4gIGNvbnN0IHBhdHRlcm4gPSByZWdleC5zb3VyY2U7XG5cbiAgcmV0dXJuIHBhdHRlcm47XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5NZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0NvbHVtbk1ldGFkYXRhQXJnc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eTogc3RyaW5nLFxuICBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YUFyZ3NbXSxcbiAgb3B0aW9uczogYW55ID0ge30sXG4gIG1vZGU6IHN0cmluZyA9IFwicmVndWxhclwiXG4pIHtcbiAgY29uc3QgY29scyA9IGNvbHVtbnMuZmlsdGVyKFxuICAgIChjOiBDb2x1bW5NZXRhZGF0YUFyZ3MpID0+XG4gICAgICBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eVxuICApO1xuXG4gIGlmIChjb2xzLmxlbmd0aCA+IDEpXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE11bHRpcGxlIGNvbHVtbnMgZm9yICR7cHJvcGVydHl9IGZvdW5kIGZvciBnaXZlbiB0YXJnZXQ6ICR7Y29sdW1ucy5tYXAoKGMpID0+IGMucHJvcGVydHlOYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICk7XG5cbiAgaWYgKGNvbHMubGVuZ3RoID09PSAwKSB7XG4gICAgY29sdW1ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eSxcbiAgICAgIG1vZGU6IG1vZGUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgQ29sdW1uTWV0YWRhdGFBcmdzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb2x1bW4gPSBjb2xzWzBdO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29sdW1uLCBcIm9wdGlvbnNcIiwge1xuICAgIHZhbHVlOiB7IC4uLmNvbHVtbi5vcHRpb25zLCAuLi5vcHRpb25zIH0sXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xuXG4gIGlmIChtb2RlICE9PSBcInJlZ3VsYXJcIilcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29sdW1uLCBcIm1vZGVcIiwge1xuICAgICAgdmFsdWU6IG1vZGUsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEdlbmVyYXRlZE1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvR2VuZXJhdGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsXG4gIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQge1xuICBTaW1wbGVDb2x1bW5UeXBlLFxuICBTcGF0aWFsQ29sdW1uVHlwZSxcbiAgV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIFdpdGhQcmVjaXNpb25Db2x1bW5UeXBlLFxuICBXaXRoV2lkdGhDb2x1bW5UeXBlLFxufSBmcm9tIFwidHlwZW9ybS9kcml2ZXIvdHlwZXMvQ29sdW1uVHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uQ29tbW9uT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbkNvbW1vbk9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU3BhdGlhbENvbHVtbk9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9TcGF0aWFsQ29sdW1uT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5XaXRoTGVuZ3RoT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbldpdGhMZW5ndGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbldpdGhXaWR0aE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5XaXRoV2lkdGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uTnVtZXJpY09wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uRW51bU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbnVtT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5Ic3RvcmVPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uSHN0b3JlT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5FbWJlZGRlZE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbWJlZGRlZE9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgRW1iZWRkZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0VtYmVkZGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi4gT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXNcbiAqIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4ob3B0aW9uczogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBTaW1wbGVDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFNwYXRpYWxDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIFNwYXRpYWxDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uV2l0aExlbmd0aE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBXaXRoV2lkdGhDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbldpdGhXaWR0aE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBXaXRoUHJlY2lzaW9uQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5OdW1lcmljT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFwiZW51bVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkVudW1PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJzaW1wbGUtZW51bVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkVudW1PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJzZXRcIixcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5FbnVtT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbi8vIEB0cy1leHBlY3QtZXJyb3Igc29tZSB0eXBlb3JtIHRoaW5nXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBcImhzdG9yZVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkhzdG9yZU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICpcbiAqIFByb3BlcnR5IGluIGVudGl0eSBjYW4gYmUgbWFya2VkIGFzIEVtYmVkZGVkLCBhbmQgb24gcGVyc2lzdCBhbGwgY29sdW1ucyBmcm9tIHRoZSBlbWJlZGRlZCBhcmUgbWFwcGVkIHRvIHRoZVxuICogc2luZ2xlIHRhYmxlIG9mIHRoZSBlbnRpdHkgd2hlcmUgRW1iZWRkZWQgaXMgdXNlZC4gQW5kIG9uIGh5ZHJhdGlvbiBhbGwgY29sdW1ucyB3aGljaCBzdXBwb3NlZCB0byBiZSBpbiB0aGVcbiAqIGVtYmVkZGVkIHdpbGwgYmUgbWFwcGVkIHRvIGl0IGZyb20gdGhlIHNpbmdsZSB0YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICB0eXBlOiAodHlwZT86IGFueSkgPT4gRnVuY3Rpb24sXG4gIG9wdGlvbnM/OiBDb2x1bW5FbWJlZGRlZE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlT3JPcHRpb25zPzogLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICB8ICgodHlwZT86IGFueSkgPT4gRnVuY3Rpb24pXG4gICAgfCBDb2x1bW5UeXBlXG4gICAgfCAoQ29sdW1uT3B0aW9ucyAmIENvbHVtbkVtYmVkZGVkT3B0aW9ucyksXG4gIG9wdGlvbnM/OiBDb2x1bW5PcHRpb25zICYgQ29sdW1uRW1iZWRkZWRPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBvYmplY3QsIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBsZXQgdHlwZTogQ29sdW1uVHlwZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdHlwZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIlxuICAgICkge1xuICAgICAgdHlwZSA9IDxDb2x1bW5UeXBlPnR5cGVPck9wdGlvbnM7XG4gICAgfSBlbHNlIGlmICh0eXBlT3JPcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gPENvbHVtbk9wdGlvbnM+dHlwZU9yT3B0aW9ucztcbiAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zLnR5cGU7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIENvbHVtbk9wdGlvbnM7XG5cbiAgICAvLyBpZiB0eXBlIGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5IHRoZW4gdHJ5IHRvIGd1ZXNzIGl0XG4gICAgY29uc3QgcmVmbGVjdE1ldGFkYXRhVHlwZSA9XG4gICAgICBSZWZsZWN0ICYmIChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGFcbiAgICAgICAgPyAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgb2JqZWN0LCBwcm9wZXJ0eU5hbWUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICghdHlwZSAmJiByZWZsZWN0TWV0YWRhdGFUeXBlKVxuICAgICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgICAgdHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGU7XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyB0eXBlIGluIGNvbHVtbiBvcHRpb25zIHRoZW4gc2V0IHR5cGUgZnJvbSBmaXJzdCBmdW5jdGlvbiBhcmd1bWVudCwgb3IgZ3Vlc3NlZCBvbmVcbiAgICBpZiAoIW9wdGlvbnMudHlwZSAmJiB0eXBlKSBvcHRpb25zLnR5cGUgPSB0eXBlO1xuXG4gICAgLy8gc3BlY2lmeSBIU1RPUkUgdHlwZSBpZiBjb2x1bW4gaXMgSFNUT1JFXG4gICAgaWYgKG9wdGlvbnMudHlwZSA9PT0gXCJoc3RvcmVcIiAmJiAhb3B0aW9ucy5oc3RvcmVUeXBlKVxuICAgICAgb3B0aW9ucy5oc3RvcmVUeXBlID0gcmVmbGVjdE1ldGFkYXRhVHlwZSA9PT0gT2JqZWN0ID8gXCJvYmplY3RcIiA6IFwic3RyaW5nXCI7XG5cbiAgICBpZiAodHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gcmVnaXN0ZXIgYW4gZW1iZWRkZWRcbiAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5lbWJlZGRlZHMucHVzaCh7XG4gICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgaXNBcnJheTogcmVmbGVjdE1ldGFkYXRhVHlwZSA9PT0gQXJyYXkgfHwgb3B0aW9ucy5hcnJheSA9PT0gdHJ1ZSxcbiAgICAgICAgcHJlZml4OiBvcHRpb25zLnByZWZpeCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5wcmVmaXggOiB1bmRlZmluZWQsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICAgICAgdHlwZTogdHlwZU9yT3B0aW9ucyBhcyAodHlwZT86IGFueSkgPT4gRnVuY3Rpb24sXG4gICAgICB9IGFzIEVtYmVkZGVkTWV0YWRhdGFBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVnaXN0ZXIgYSByZWd1bGFyIGNvbHVtblxuXG4gICAgICAvLyBpZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGEgdHlwZSB0aGVuIHdlIG5lZWQgdG8gZ2l2ZSBlcnJvciB0byB1c2VyIHRoYXQgdHlwZSBpcyByZXF1aXJlZFxuICAgICAgaWYgKCFvcHRpb25zLnR5cGUpXG4gICAgICAgIHRocm93IG5ldyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgICAvLyBjcmVhdGUgdW5pcXVlXG4gICAgICBpZiAob3B0aW9ucy51bmlxdWUgPT09IHRydWUpXG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS51bmlxdWVzLnB1c2goe1xuICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgIGNvbHVtbnM6IFtwcm9wZXJ0eU5hbWVdLFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgY29sdW1ucyA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5jb2x1bW5zO1xuICAgICAgYWdncmVnYXRlT3JOZXdDb2x1bW4ob2JqZWN0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eU5hbWUsIGNvbHVtbnMsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZWQpIHtcbiAgICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICAgIHN0cmF0ZWd5OlxuICAgICAgICAgICAgdHlwZW9mIG9wdGlvbnMuZ2VuZXJhdGVkID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgID8gb3B0aW9ucy5nZW5lcmF0ZWRcbiAgICAgICAgICAgICAgOiBcImluY3JlbWVudFwiLFxuICAgICAgICB9IGFzIEdlbmVyYXRlZE1ldGFkYXRhQXJncyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuIiwiaW1wb3J0IHsgQ29sdW1uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBVcGRhdGVEYXRlQ29sdW1uKG9wdGlvbnM/OiBDb2x1bW5PcHRpb25zKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuY29sdW1ucztcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgXCJ1cGRhdGVEYXRlXCJcbiAgICApO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgQ29sdW1uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVEYXRlQ29sdW1uKG9wdGlvbnM/OiBDb2x1bW5PcHRpb25zKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIGNvbnN0IGNvbHVtbnMgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuY29sdW1ucztcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgXCJjcmVhdGVEYXRlXCJcbiAgICApO1xuICB9O1xufVxuIiwiZXhwb3J0IGNsYXNzIE9iamVjdFV0aWxzIHtcbiAgLyoqXG4gICAqIENoZWNrcyBpZiBnaXZlbiB2YWx1ZSBpcyBhbiBvYmplY3QuXG4gICAqIFdlIGNhbm5vdCB1c2UgaW5zdGFuY2VvZiBiZWNhdXNlIGl0IGhhcyBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgb24gZGlmZmVyZW50IGNvbnRleHRzLlxuICAgKiBBbmQgd2UgZG9uJ3Qgc2ltcGx5IHVzZSB0eXBlb2YgYmVjYXVzZSB0eXBlb2YgbnVsbCA9PT0gXCJvYmplY3RcIi5cbiAgICovXG4gIHN0YXRpYyBpc09iamVjdCh2YWw6IGFueSk6IHZhbCBpcyBvYmplY3Qge1xuICAgIHJldHVybiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZ2l2ZW4gdmFsdWUgaXMgYW4gb2JqZWN0LlxuICAgKiBXZSBjYW5ub3QgdXNlIGluc3RhbmNlb2YgYmVjYXVzZSBpdCBoYXMgcHJvYmxlbXMgd2hlbiBydW5uaW5nIG9uIGRpZmZlcmVudCBjb250ZXh0cy5cbiAgICogQW5kIHdlIGRvbid0IHNpbXBseSB1c2UgdHlwZW9mIGJlY2F1c2UgdHlwZW9mIG51bGwgPT09IFwib2JqZWN0XCIuXG4gICAqL1xuICBzdGF0aWMgaXNPYmplY3RXaXRoTmFtZSh2YWw6IGFueSk6IHZhbCBpcyBvYmplY3QgJiB7IG5hbWU6IHN0cmluZyB9IHtcbiAgICByZXR1cm4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgJiYgdmFsW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICovXG4gIHN0YXRpYyBhc3NpZ248VCwgVT4odGFyZ2V0OiBULCBzb3VyY2U6IFUpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYVxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAqIEBwYXJhbSBzb3VyY2UxIFRoZSBmaXJzdCBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gc291cmNlMiBUaGUgc2Vjb25kIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqL1xuICBzdGF0aWMgYXNzaWduPFQsIFUsIFY+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogVik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZTEgVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSBzb3VyY2UyIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHNvdXJjZTMgVGhlIHRoaXJkIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqL1xuICBzdGF0aWMgYXNzaWduPFQsIFUsIFYsIFc+KFxuICAgIHRhcmdldDogVCxcbiAgICBzb3VyY2UxOiBVLFxuICAgIHNvdXJjZTI6IFYsXG4gICAgc291cmNlMzogV1xuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYVxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAqIEBwYXJhbSBzb3VyY2VzIE9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzXG4gICAqL1xuICBzdGF0aWMgYXNzaWduKHRhcmdldDogb2JqZWN0LCAuLi5zb3VyY2VzOiBhbnlbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2UpKSB7XG4gICAgICAgICh0YXJnZXQgYXMgYW55KVtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9cbiAgLy8gLyoqXG4gIC8vICAqIENvbnZlcnRzIE1peGVkTGlzdDxUPiB0byBzdHJpY3RseSBhbiBhcnJheSBvZiBpdHMgVCBpdGVtcy5cbiAgLy8gICovXG4gIC8vIHN0YXRpYyBtaXhlZExpc3RUb0FycmF5PFQ+KGxpc3Q6IE1peGVkTGlzdDxUPik6IFRbXSB7XG4gIC8vICAgaWYgKGxpc3QgIT09IG51bGwgJiYgdHlwZW9mIGxpc3QgPT09IFwib2JqZWN0XCIpIHtcbiAgLy8gICAgIHJldHVybiBPYmplY3Qua2V5cyhsaXN0KS5tYXAoXG4gIC8vICAgICAgIChrZXkpID0+IChsaXN0IGFzIHsgW2tleTogc3RyaW5nXTogVCB9KVtrZXldXG4gIC8vICAgICApO1xuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICByZXR1cm4gbGlzdDtcbiAgLy8gICB9XG4gIC8vIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9uc1wiO1xuaW1wb3J0IHsgQ29sdW1uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0dlbmVyYXRlZE1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgT2JqZWN0VXRpbHMgfSBmcm9tIFwiLi9PYmplY3RVdGlsc1wiO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKCk6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBvcHRpb25zOiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneTogXCJpbmNyZW1lbnRcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcInV1aWRcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcInJvd2lkXCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3k6IFwiaWRlbnRpdHlcIixcbiAgb3B0aW9ucz86IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogVGhpcyBjb2x1bW4gY3JlYXRlcyBhbiBpbnRlZ2VyIFBSSU1BUlkgQ09MVU1OIHdpdGggZ2VuZXJhdGVkIHNldCB0byB0cnVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3lPck9wdGlvbnM/OlxuICAgIHwgXCJpbmNyZW1lbnRcIlxuICAgIHwgXCJ1dWlkXCJcbiAgICB8IFwicm93aWRcIlxuICAgIHwgXCJpZGVudGl0eVwiXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9ucyxcbiAgbWF5YmVPcHRpb25zPzpcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtblVVSURPcHRpb25zXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gIGNvbnN0IG9wdGlvbnM6IENvbHVtbk9wdGlvbnMgPSB7fTtcbiAgbGV0IHN0cmF0ZWd5OiBcImluY3JlbWVudFwiIHwgXCJ1dWlkXCIgfCBcInJvd2lkXCIgfCBcImlkZW50aXR5XCI7XG4gIGlmIChzdHJhdGVneU9yT3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygc3RyYXRlZ3lPck9wdGlvbnMgPT09IFwic3RyaW5nXCIpXG4gICAgICBzdHJhdGVneSA9IHN0cmF0ZWd5T3JPcHRpb25zIGFzXG4gICAgICAgIHwgXCJpbmNyZW1lbnRcIlxuICAgICAgICB8IFwidXVpZFwiXG4gICAgICAgIHwgXCJyb3dpZFwiXG4gICAgICAgIHwgXCJpZGVudGl0eVwiO1xuXG4gICAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KHN0cmF0ZWd5T3JPcHRpb25zKSkge1xuICAgICAgc3RyYXRlZ3kgPSBcImluY3JlbWVudFwiO1xuICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBzdHJhdGVneU9yT3B0aW9ucyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIjtcbiAgfVxuICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QobWF5YmVPcHRpb25zKSkgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBtYXliZU9wdGlvbnMpO1xuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gaWYgY29sdW1uIHR5cGUgaXMgbm90IGV4cGxpY2l0bHkgc2V0IHRoZW4gZGV0ZXJtaW5lIGl0IGJhc2VkIG9uIGdlbmVyYXRpb24gc3RyYXRlZ3lcbiAgICBpZiAoIW9wdGlvbnMudHlwZSkge1xuICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImluY3JlbWVudFwiIHx8IHN0cmF0ZWd5ID09PSBcImlkZW50aXR5XCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gTnVtYmVyO1xuICAgICAgfSBlbHNlIGlmIChzdHJhdGVneSA9PT0gXCJ1dWlkXCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gXCJ1dWlkXCI7XG4gICAgICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09PSBcInJvd2lkXCIpIHtcbiAgICAgICAgb3B0aW9ucy50eXBlID0gXCJpbnRcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBleHBsaWNpdGx5IHNldCBhIHByaW1hcnkgYW5kIGdlbmVyYXRlZCB0byBjb2x1bW4gb3B0aW9uc1xuICAgIG9wdGlvbnMucHJpbWFyeSA9IHRydWU7XG5cbiAgICBjb25zdCBjb2x1bW5zID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmNvbHVtbnM7XG4gICAgYWdncmVnYXRlT3JOZXdDb2x1bW4ob2JqZWN0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eU5hbWUsIGNvbHVtbnMsIG9wdGlvbnMpO1xuICAgIC8vIHJlZ2lzdGVyIGdlbmVyYXRlZCBtZXRhZGF0YSBhcmdzXG4gICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIHN0cmF0ZWd5OiBzdHJhdGVneSxcbiAgICB9IGFzIEdlbmVyYXRlZE1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsXG4gIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsXG4gIFByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3IsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgdHlwZSB7IEdlbmVyYXRlZE1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvR2VuZXJhdGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogRGVzY3JpYmVzIGFsbCBwcmltYXJ5IGtleSBjb2x1bW4ncyBvcHRpb25zLlxuICogSWYgc3BlY2lmaWVkLCB0aGUgbnVsbGFibGUgZmllbGQgbXVzdCBiZSBzZXQgdG8gZmFsc2UuXG4gKi9cbmV4cG9ydCB0eXBlIFByaW1hcnlDb2x1bW5PcHRpb25zID0gQ29sdW1uT3B0aW9ucyAmIHsgbnVsbGFibGU/OiBmYWxzZSB9O1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogUHJpbWFyeSBjb2x1bW5zIGFsc28gY3JlYXRlcyBhIFBSSU1BUlkgS0VZIGZvciB0aGlzIGNvbHVtbiBpbiBhIGRiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUNvbHVtbihcbiAgb3B0aW9ucz86IFByaW1hcnlDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFByaW1hcnkgY29sdW1ucyBhbHNvIGNyZWF0ZXMgYSBQUklNQVJZIEtFWSBmb3IgdGhpcyBjb2x1bW4gaW4gYSBkYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlDb2x1bW4oXG4gIHR5cGU/OiBDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogUHJpbWFyeUNvbHVtbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICogUHJpbWFyeSBjb2x1bW5zIGFsc28gY3JlYXRlcyBhIFBSSU1BUlkgS0VZIGZvciB0aGlzIGNvbHVtbiBpbiBhIGRiLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUNvbHVtbihcbiAgdHlwZU9yT3B0aW9ucz86IENvbHVtblR5cGUgfCBQcmltYXJ5Q29sdW1uT3B0aW9ucyxcbiAgb3B0aW9ucz86IFByaW1hcnlDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBsZXQgdHlwZTogQ29sdW1uVHlwZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdHlwZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZU9yT3B0aW9ucyA9PT0gU3RyaW5nIHx8XG4gICAgICB0eXBlT3JPcHRpb25zID09PSBCb29sZWFuIHx8XG4gICAgICB0eXBlT3JPcHRpb25zID09PSBOdW1iZXJcbiAgICApIHtcbiAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zIGFzIENvbHVtblR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCA8UHJpbWFyeUNvbHVtbk9wdGlvbnM+dHlwZU9yT3B0aW9ucyk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIFByaW1hcnlDb2x1bW5PcHRpb25zO1xuXG4gICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgIGNvbnN0IHJlZmxlY3RNZXRhZGF0YVR5cGUgPVxuICAgICAgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhXG4gICAgICAgID8gKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG9iamVjdCwgcHJvcGVydHlOYW1lKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXR5cGUgJiYgcmVmbGVjdE1ldGFkYXRhVHlwZSkgdHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGU7XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyB0eXBlIGluIGNvbHVtbiBvcHRpb25zIHRoZW4gc2V0IHR5cGUgZnJvbSBmaXJzdCBmdW5jdGlvbiBhcmd1bWVudCwgb3IgZ3Vlc3NlZCBvbmVcbiAgICBpZiAoIW9wdGlvbnMudHlwZSAmJiB0eXBlKSBvcHRpb25zLnR5cGUgPSB0eXBlO1xuXG4gICAgLy8gaWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHR5cGUgdGhlbiB3ZSBuZWVkIHRvIGdpdmUgZXJyb3IgdG8gdXNlciB0aGF0IHR5cGUgaXMgcmVxdWlyZWRcbiAgICBpZiAoIW9wdGlvbnMudHlwZSkgdGhyb3cgbmV3IENvbHVtblR5cGVVbmRlZmluZWRFcnJvcihvYmplY3QsIHByb3BlcnR5TmFtZSk7XG5cbiAgICAvLyBjaGVjayBpZiBjb2x1bW4gaXMgbm90IG51bGxhYmxlLCBiZWNhdXNlIHdlIGNhbm5vdCBhbGxvdyBhIHByaW1hcnkga2V5IHRvIGJlIG51bGxhYmxlXG4gICAgaWYgKG9wdGlvbnMubnVsbGFibGUpXG4gICAgICB0aHJvdyBuZXcgUHJpbWFyeUNvbHVtbkNhbm5vdEJlTnVsbGFibGVFcnJvcihvYmplY3QsIHByb3BlcnR5TmFtZSk7XG5cbiAgICAvLyBleHBsaWNpdGx5IHNldCBhIHByaW1hcnkgdG8gY29sdW1uIG9wdGlvbnNcbiAgICBvcHRpb25zLnByaW1hcnkgPSB0cnVlO1xuXG4gICAgY29uc3QgY29sdW1ucyA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5jb2x1bW5zO1xuICAgIGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBjb2x1bW5zLCBvcHRpb25zKTtcblxuICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZCkge1xuICAgICAgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLmdlbmVyYXRpb25zLnB1c2goe1xuICAgICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIHN0cmF0ZWd5OlxuICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmdlbmVyYXRlZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBvcHRpb25zLmdlbmVyYXRlZFxuICAgICAgICAgICAgOiBcImluY3JlbWVudFwiLFxuICAgICAgfSBhcyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MpO1xuICAgIH1cbiAgfTtcbn1cbiIsImltcG9ydCB7IEVudGl0eU9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHR5cGUgeyBUYWJsZU1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvVGFibGVNZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcblxuLyoqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYW4gZW50aXR5ICh0YWJsZSBvciBkb2N1bWVudCBkZXBlbmQgb24gZGF0YWJhc2UgdHlwZSkuXG4gKiBEYXRhYmFzZSBzY2hlbWEgd2lsbCBiZSBjcmVhdGVkIGZvciBhbGwgY2xhc3NlcyBkZWNvcmF0ZWQgd2l0aCBpdCwgYW5kIFJlcG9zaXRvcnkgY2FuIGJlIHJldHJpZXZlZCBhbmQgdXNlZCBmb3IgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHkob3B0aW9ucz86IEVudGl0eU9wdGlvbnMpOiBDbGFzc0RlY29yYXRvcjtcblxuLyoqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYW4gZW50aXR5ICh0YWJsZSBvciBkb2N1bWVudCBkZXBlbmQgb24gZGF0YWJhc2UgdHlwZSkuXG4gKiBEYXRhYmFzZSBzY2hlbWEgd2lsbCBiZSBjcmVhdGVkIGZvciBhbGwgY2xhc3NlcyBkZWNvcmF0ZWQgd2l0aCBpdCwgYW5kIFJlcG9zaXRvcnkgY2FuIGJlIHJldHJpZXZlZCBhbmQgdXNlZCBmb3IgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHkobmFtZT86IHN0cmluZywgb3B0aW9ucz86IEVudGl0eU9wdGlvbnMpOiBDbGFzc0RlY29yYXRvcjtcblxuLyoqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYW4gZW50aXR5ICh0YWJsZSBvciBkb2N1bWVudCBkZXBlbmQgb24gZGF0YWJhc2UgdHlwZSkuXG4gKiBEYXRhYmFzZSBzY2hlbWEgd2lsbCBiZSBjcmVhdGVkIGZvciBhbGwgY2xhc3NlcyBkZWNvcmF0ZWQgd2l0aCBpdCwgYW5kIFJlcG9zaXRvcnkgY2FuIGJlIHJldHJpZXZlZCBhbmQgdXNlZCBmb3IgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFbnRpdHkoXG4gIG5hbWVPck9wdGlvbnM/OiBzdHJpbmcgfCBFbnRpdHlPcHRpb25zLFxuICBtYXliZU9wdGlvbnM/OiBFbnRpdHlPcHRpb25zXG4pOiBDbGFzc0RlY29yYXRvciB7XG4gIGNvbnN0IG9wdGlvbnMgPVxuICAgIChPYmplY3RVdGlscy5pc09iamVjdChuYW1lT3JPcHRpb25zKVxuICAgICAgPyAobmFtZU9yT3B0aW9ucyBhcyBFbnRpdHlPcHRpb25zKVxuICAgICAgOiBtYXliZU9wdGlvbnMpIHx8IHt9O1xuICBjb25zdCBuYW1lID0gdHlwZW9mIG5hbWVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgPyBuYW1lT3JPcHRpb25zIDogb3B0aW9ucy5uYW1lO1xuXG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgY29uc3QgdGFibGVzID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpLnRhYmxlcztcbiAgICB0YWJsZXMucHVzaCh7XG4gICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICB0eXBlOiBcInJlZ3VsYXJcIixcbiAgICAgIG9yZGVyQnk6IG9wdGlvbnMub3JkZXJCeSA/IG9wdGlvbnMub3JkZXJCeSA6IHVuZGVmaW5lZCxcbiAgICAgIGVuZ2luZTogb3B0aW9ucy5lbmdpbmUgPyBvcHRpb25zLmVuZ2luZSA6IHVuZGVmaW5lZCxcbiAgICAgIGRhdGFiYXNlOiBvcHRpb25zLmRhdGFiYXNlID8gb3B0aW9ucy5kYXRhYmFzZSA6IHVuZGVmaW5lZCxcbiAgICAgIHNjaGVtYTogb3B0aW9ucy5zY2hlbWEgPyBvcHRpb25zLnNjaGVtYSA6IHVuZGVmaW5lZCxcbiAgICAgIHN5bmNocm9uaXplOiBvcHRpb25zLnN5bmNocm9uaXplLFxuICAgICAgd2l0aG91dFJvd2lkOiBvcHRpb25zLndpdGhvdXRSb3dpZCxcbiAgICAgIGNvbW1lbnQ6IG9wdGlvbnMuY29tbWVudCA/IG9wdGlvbnMuY29tbWVudCA6IHVuZGVmaW5lZCxcbiAgICB9IGFzIFRhYmxlTWV0YWRhdGFBcmdzKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7XG4gIEFkYXB0ZXIsXG4gIENhc2NhZGUsXG4gIENhc2NhZGVNZXRhZGF0YSxcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBmaW5hbCxcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgUmVwb3NpdG9yeSxcbiAgU2VxdWVuY2UsXG4gIHNlcXVlbmNlTmFtZUZvck1vZGVsLFxuICB0eXBlIFNlcXVlbmNlT3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyByZXNlcnZlZEF0dHJpYnV0ZXMsIFR5cGVPUk1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIENvbnRleHQsXG4gIERCS2V5cyxcbiAgREVGQVVMVF9FUlJPUl9NRVNTQUdFUyBhcyBEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgT3BlcmF0aW9uS2V5cyxcbiAgcmVhZG9ubHksXG4gIFVwZGF0ZVZhbGlkYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7XG4gIHR5cGUgQ29uc3RydWN0b3IsXG4gIGRhdGUsXG4gIERlY29yYXRpb24sXG4gIERFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIGxpc3QsXG4gIE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMsXG4gIE1heFZhbGlkYXRvck9wdGlvbnMsXG4gIE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnMsXG4gIE1pblZhbGlkYXRvck9wdGlvbnMsXG4gIE1vZGVsLFxuICBNb2RlbEtleXMsXG4gIFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zLFxuICBwcm9wLFxuICBwcm9wTWV0YWRhdGEsXG4gIHJlcXVpcmVkLFxuICB0eXBlLFxuICBUeXBlTWV0YWRhdGEsXG4gIFZhbGlkYXRpb24sXG4gIFZhbGlkYXRpb25LZXlzLFxuICBWYWxpZGF0b3JPcHRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJbmRleEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBUeXBlT1JNU3RhdGVtZW50IH0gZnJvbSBcIi4vcXVlcnlcIjtcbmltcG9ydCB7IFR5cGVPUk1TZXF1ZW5jZSB9IGZyb20gXCIuL3NlcXVlbmNlc1wiO1xuaW1wb3J0IHsgZ2VuZXJhdGVJbmRleGVzIH0gZnJvbSBcIi4vaW5kZXhlc1wiO1xuaW1wb3J0IHsgVHlwZU9STUZsYWdzLCBUeXBlT1JNUXVlcnksIFR5cGVPUk1UYWJsZVNwZWMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgYXBwbHksIFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFR5cGVPUk1SZXBvc2l0b3J5IH0gZnJvbSBcIi4vVHlwZU9STVJlcG9zaXRvcnlcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IFR5cGVPUk1EaXNwYXRjaCB9IGZyb20gXCIuL1R5cGVPUk1EaXNwYXRjaFwiO1xuaW1wb3J0IHsgY29udmVydEpzUmVnZXhUb1Bvc3RncmVzIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIERhdGFTb3VyY2UsXG4gIEZpbmRPbmVPcHRpb25zLFxuICBJbixcbiAgSW5zZXJ0UmVzdWx0LFxuICBSZWxhdGlvbk9wdGlvbnMsXG4gIE9uZVRvT25lLFxuICBKb2luQ29sdW1uLFxuICBNYW55VG9NYW55LFxuICBTZWxlY3RRdWVyeUJ1aWxkZXIsXG4gIFZlcnNpb25Db2x1bW4sXG4gIE9uZVRvTWFueSxcbiAgTWFueVRvT25lLFxuICBKb2luVGFibGUsXG4gIENvbHVtblR5cGUsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RhdGEtc291cmNlL0RhdGFTb3VyY2VPcHRpb25zXCI7XG5pbXBvcnQgeyBDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvQ29sdW1uXCI7XG5pbXBvcnQgeyBVcGRhdGVEYXRlQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL1VwZGF0ZURhdGVDb2x1bW5cIjtcbmltcG9ydCB7IENyZWF0ZURhdGVDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvQ3JlYXRlRGF0ZUNvbHVtblwiO1xuaW1wb3J0IHsgUHJpbWFyeUdlbmVyYXRlZENvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9QcmltYXJ5R2VuZXJhdGVkQ29sdW1uXCI7XG5pbXBvcnQgeyBQcmltYXJ5Q29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL1ByaW1hcnlDb2x1bW5cIjtcbmltcG9ydCB7IEVudGl0eSB9IGZyb20gXCIuL292ZXJyaWRlcy9FbnRpdHlcIjtcbmltcG9ydCB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5UeXBlIH0gZnJvbSBcInR5cGVvcm0vZHJpdmVyL3R5cGVzL0NvbHVtblR5cGVzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPblBvc3RncmVzQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBUeXBlT1JNUmVwb3NpdG9yeTxNPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxUeXBlT1JNRmxhZ3M+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1c2VyID0gY29udGV4dC5nZXQoXCJ1c2VyXCIpO1xuICAgIG1vZGVsW2tleV0gPSB1c2VyIGFzIE1bdHlwZW9mIGtleV07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBcIk5vIFVzZXIgZm91bmQgaW4gY29udGV4dC4gUGxlYXNlIHByb3ZpZGUgYSB1c2VyIGluIHRoZSBjb250ZXh0XCJcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFkYXB0ZXIgZm9yIFR5cGVPUk0tYmFja2VkIHBlcnNpc3RlbmNlIG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBJbXBsZW1lbnRzIHRoZSBEZWNhZi50cyBBZGFwdGVyIG92ZXIgYSBUeXBlT1JNIERhdGFTb3VyY2UsIHByb3ZpZGluZyBDUlVEIG9wZXJhdGlvbnMsIHF1ZXJ5L3N0YXRlbWVudCBmYWN0b3JpZXMsIHNlcXVlbmNlIG1hbmFnZW1lbnQsIGVycm9yIHBhcnNpbmcsIGFuZCBkZWNvcmF0aW9uIGhlbHBlcnMuXG4gKiBAdGVtcGxhdGUgWSBUaGUgbmF0aXZlIGNvbmZpZ3VyYXRpb24gdHlwZSAoVHlwZU9STSBEYXRhU291cmNlT3B0aW9ucykuXG4gKiBAdGVtcGxhdGUgRiBUaGUgcmVwb3NpdG9yeSBmbGFncyB0eXBlLlxuICogQHRlbXBsYXRlIEMgVGhlIGNvbnRleHQgdHlwZS5cbiAqIEBwYXJhbSB7RGF0YVNvdXJjZU9wdGlvbnN9IHNjb3BlIFRoZSBEYXRhU291cmNlIG9wdGlvbnMgZm9yIHRoZSBhZGFwdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgVGhlIGZsYXZvdXIgb2YgdGhlIGFkYXB0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFkYXB0ZXIuXG4gKiBAY2xhc3MgVHlwZU9STUFkYXB0ZXJcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IFR5cGVPUk1BZGFwdGVyKHsgdHlwZTogJ3Bvc3RncmVzJywgLyogLi4uICpcXC8gfSk7XG4gKiBhd2FpdCBhZGFwdGVyLmluaXRpYWxpemUoKTtcbiAqIGNvbnN0IHJlcG8gPSBuZXcgKGFkYXB0ZXIucmVwb3NpdG9yeTxVc2VyPigpKShhZGFwdGVyLCBVc2VyKTtcbiAqIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCByZXBvLmNyZWF0ZShuZXcgVXNlcih7IG5hbWU6ICdBbGljZScgfSkpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IEFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXJcbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBUeXBlT1JNUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBEUyBhcyBUeXBlT1JNIERhdGFTb3VyY2VcbiAqXG4gKiAgIEFwcC0+PkFkYXB0ZXI6IG5ldyBUeXBlT1JNQWRhcHRlcihvcHRzKVxuICogICBBZGFwdGVyLT4+RFM6IGluaXRpYWxpemUoKVxuICogICBBcHAtPj5BZGFwdGVyOiByZXBvc2l0b3J5KClcbiAqICAgQWRhcHRlci0tPj5BcHA6IFR5cGVPUk1SZXBvc2l0b3J5XG4gKiAgIEFwcC0+PlJlcG86IGNyZWF0ZShtb2RlbClcbiAqICAgUmVwby0+PkFkYXB0ZXI6IHByZXBhcmUvY3JlYXRlL3JldmVydFxuICogICBBZGFwdGVyLS0+PlJlcG86IE1vZGVsXG4gKiAgIFJlcG8tLT4+QXBwOiBNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPFxuICBEYXRhU291cmNlT3B0aW9ucyxcbiAgVHlwZU9STVF1ZXJ5LFxuICBUeXBlT1JNRmxhZ3MsXG4gIENvbnRleHQ8VHlwZU9STUZsYWdzPlxuPiB7XG4gIHByaXZhdGUgX2RhdGFTb3VyY2U/OiBEYXRhU291cmNlO1xuXG4gIGdldCBkYXRhU291cmNlKCk6IERhdGFTb3VyY2Uge1xuICAgIGlmICghdGhpcy5fZGF0YVNvdXJjZSkge1xuICAgICAgY29uc3QgbW9kZWxzID0gQWRhcHRlci5tb2RlbHModGhpcy5mbGF2b3VyKTtcbiAgICAgIHRoaXMuX2RhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm5hdGl2ZSwge1xuICAgICAgICAgIGVudGl0aWVzOiBtb2RlbHMubWFwKChjKSA9PiBjW01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNdKSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlO1xuICB9XG4gIC8vIHByb3RlY3RlZCBkYXRhU291XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRGF0YVNvdXJjZU9wdGlvbnMsIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIob3B0aW9ucywgVHlwZU9STUZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8VHlwZU9STUZsYWdzPlxuICApOiBQcm9taXNlPFR5cGVPUk1GbGFncz4ge1xuICAgIGNvbnN0IGYgPSBhd2FpdCBzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBmbGFncyk7XG4gICAgY29uc3QgbmV3T2JqOiBhbnkgPSB7XG4gICAgICB1c2VyOiAoYXdhaXQgVHlwZU9STUFkYXB0ZXIuZ2V0Q3VycmVudFVzZXIodGhpcy5kYXRhU291cmNlKSkgYXMgc3RyaW5nLFxuICAgIH07XG4gICAgY29uc3QgbSA9IG5ldyBtb2RlbCgpO1xuXG4gICAgY29uc3QgZXhjZXB0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAob3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLkNSRUFURSkge1xuICAgICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShtKS5pZDtcbiAgICAgIGV4Y2VwdGlvbnMucHVzaChwayBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIG9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5DUkVBVEUgfHxcbiAgICAgIG9wZXJhdGlvbiA9PT0gT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICApIHtcbiAgICAgIGNvbnN0IGRlY3MgPSBPYmplY3Qua2V5cyhtKS5yZWR1Y2UoKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBrZXkpID0+IHtcbiAgICAgICAgY29uc3QgZGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICAgIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1QsXG4gICAgICAgICAgbSxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBkZWMgPSBkZWNzLmRlY29yYXRvcnMuZmluZChcbiAgICAgICAgICAoZGVjOiBhbnkpID0+XG4gICAgICAgICAgICBkZWMua2V5ID09PSBEQktleXMuVElNRVNUQU1QICYmXG4gICAgICAgICAgICBkZWMucHJvcHMub3BlcmF0aW9uLmluZGV4T2Yob3BlcmF0aW9uKSAhPT0gLTFcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlYykge1xuICAgICAgICAgIGFjY3VtW2tleV0gPSBkZWMucHJvcHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSwge30pO1xuXG4gICAgICBleGNlcHRpb25zLnB1c2goLi4uT2JqZWN0LmtleXMoZGVjcykpO1xuICAgIH1cblxuICAgIG5ld09iai5pZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXMgPSAoXG4gICAgICBmLmlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllcyA/IGYuaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzIDogW11cbiAgICApLmNvbmNhdCguLi5leGNlcHRpb25zKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihmLCBuZXdPYmopIGFzIFR5cGVPUk1GbGFncztcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIHByb3RlY3RlZCBvdmVycmlkZSBEaXNwYXRjaCgpOiBUeXBlT1JNRGlzcGF0Y2gge1xuICAgIHJldHVybiBuZXcgVHlwZU9STURpc3BhdGNoKCk7XG4gIH1cblxuICBAZmluYWwoKVxuICBvdmVycmlkZSByZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbD4oKTogQ29uc3RydWN0b3I8VHlwZU9STVJlcG9zaXRvcnk8TT4+IHtcbiAgICByZXR1cm4gVHlwZU9STVJlcG9zaXRvcnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgUG9zdGdyZXMgc3RhdGVtZW50IGZvciBxdWVyeWluZ1xuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgUG9zdGdyZXNTdGF0ZW1lbnQgaW5zdGFuY2UgZm9yIGJ1aWxkaW5nIHF1ZXJpZXNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcmV0dXJuIHtUeXBlT1JNU3RhdGVtZW50PE0sIGFueT59IEEgbmV3IFBvc3RncmVzU3RhdGVtZW50IGluc3RhbmNlXG4gICAqL1xuICBAZmluYWwoKVxuICBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPigpOiBUeXBlT1JNU3RhdGVtZW50PE0sIGFueT4ge1xuICAgIHJldHVybiBuZXcgVHlwZU9STVN0YXRlbWVudCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBQb3N0Z3JlU1FMIHNlcXVlbmNlXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBQb3N0Z3JlU1FMU2VxdWVuY2UgaW5zdGFuY2UgZm9yIG1hbmFnaW5nIHNlcXVlbmNlc1xuICAgKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHJldHVybiB7UHJvbWlzZTxTZXF1ZW5jZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgbmV3IFNlcXVlbmNlIGluc3RhbmNlXG4gICAqL1xuICBAZmluYWwoKVxuICBhc3luYyBTZXF1ZW5jZShvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpOiBQcm9taXNlPFNlcXVlbmNlPiB7XG4gICAgcmV0dXJuIG5ldyBUeXBlT1JNU2VxdWVuY2Uob3B0aW9ucywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBhZGFwdGVyIGJ5IGNyZWF0aW5nIGluZGV4ZXMgZm9yIGFsbCBtYW5hZ2VkIG1vZGVsc1xuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBuZWNlc3NhcnkgZGF0YWJhc2UgaW5kZXhlcyBmb3IgYWxsIG1vZGVscyBtYW5hZ2VkIGJ5IHRoaXMgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRzID0gdGhpcy5kYXRhU291cmNlO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkcy5pbml0aWFsaXplKCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5pbml0aWFsaXplKTtcbiAgICBsb2cudmVyYm9zZShgJHt0aGlzLmZsYXZvdXJ9IGFkYXB0ZXIgaW5pdGlhbGl6ZWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBpbmRleGVzIGZvciB0aGUgZ2l2ZW4gbW9kZWxzXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gY3JlYXRlIGRhdGFiYXNlIGluZGV4ZXMgZm9yIHRoZSBzcGVjaWZpZWQgbW9kZWxzXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHBhcmFtIHsuLi5Db25zdHJ1Y3RvcjxNPn0gbW9kZWxzIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9ycyB0byBjcmVhdGUgaW5kZXhlcyBmb3JcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgaW5kZXhlcyBhcmUgY3JlYXRlZFxuICAgKi9cbiAgQGZpbmFsKClcbiAgcHJvdGVjdGVkIGFzeW5jIGluZGV4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgLi4ubW9kZWxzOiBDb25zdHJ1Y3RvcjxNPltdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluZGV4ZXM6IFR5cGVPUk1RdWVyeVtdID0gZ2VuZXJhdGVJbmRleGVzKG1vZGVscyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KFwiQkVHSU5cIik7XG5cbiAgICAgIGZvciAoY29uc3QgaW5kZXggb2YgaW5kZXhlcykge1xuICAgICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2UucXVlcnkoaW5kZXgucXVlcnksIGluZGV4LnZhbHVlcyk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5xdWVyeShcIkNPTU1JVFwiKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2UucXVlcnkoXCJST0xMQkFDS1wiKTtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IFNRTCBxdWVyeSBhZ2FpbnN0IHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGV4ZWN1dGUgcmF3IFNRTCBxdWVyaWVzXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJlc3VsdCB0eXBlXG4gICAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSBxIC0gVGhlIHF1ZXJ5IHRvIGV4ZWN1dGVcbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmF3PFI+KHE6IFR5cGVPUk1RdWVyeSk6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJhdyk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5kYXRhU291cmNlLmlzSW5pdGlhbGl6ZWQpIGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5pbml0aWFsaXplKCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBxdWVyeSwgdmFsdWVzIH0gPSBxO1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgZXhlY3V0aW5nIHF1ZXJ5OiAkeyhxdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5nZXRTcWwoKX1gXG4gICAgICApO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmRhdGFTb3VyY2UucXVlcnkocXVlcnksIHZhbHVlcyk7XG4gICAgICByZXR1cm4gcmVzcG9uc2UgYXMgUjtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIHBrOiBrZXlvZiBNLFxuICAgIGNoaWxkID0gZmFsc2VcbiAgKToge1xuICAgIHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBpZDogc3RyaW5nO1xuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIH0ge1xuICAgIGNvbnN0IHByZXBhcmVkID0gc3VwZXIucHJlcGFyZShtb2RlbCwgcGspO1xuXG4gICAgcHJlcGFyZWQucmVjb3JkID0gT2JqZWN0LmVudHJpZXMocHJlcGFyZWQucmVjb3JkKS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAoa2V5ID09PSBQZXJzaXN0ZW5jZUtleXMuTUVUQURBVEEgfHwgdGhpcy5pc1Jlc2VydmVkKGtleSkpXG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKHZhbHVlLmdldFRpbWUoKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoTW9kZWwuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMucHJlcGFyZSh2YWx1ZSwgZmluZFByaW1hcnlLZXkodmFsdWUpLmlkLCB0cnVlKS5yZWNvcmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgdmFsdWUgPSBgJHt2YWx1ZX1gO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvL2RvIG5vdGhpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFjY3VtW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgfSxcbiAgICAgIHt9XG4gICAgKTtcbiAgICBjb25zdCBjb25zdHI6IENvbnN0cnVjdG9yPGFueT4gfCB1bmRlZmluZWQgPSBNb2RlbC5nZXQoXG4gICAgICBtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lXG4gICAgKTtcbiAgICBpZiAoIWNvbnN0cilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfSBub3QgZm91bmQgaW4gcmVnaXN0cnlgXG4gICAgICApO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNoaWxkXG4gICAgICA/IG5ldyAoY29uc3RyIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY29uc3RyXSgpXG4gICAgICA6IG5ldyBjb25zdHIoKTtcbiAgICBpZiAoY2hpbGQpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBcImNvbnN0cnVjdG9yXCIsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiAoY29uc3RyIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY29uc3RyXSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgT2JqZWN0LmVudHJpZXMocHJlcGFyZWQucmVjb3JkKS5mb3JFYWNoKFxuICAgICAgKFtrZXksIHZhbF0pID0+IChyZXN1bHRba2V5IGFzIGtleW9mIHR5cGVvZiByZXN1bHRdID0gdmFsKVxuICAgICk7XG4gICAgcHJlcGFyZWQucmVjb3JkID0gcmVzdWx0O1xuICAgIHJldHVybiBwcmVwYXJlZDtcbiAgfVxuXG4gIG92ZXJyaWRlIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogc3RyaW5nIHwgQ29uc3RydWN0b3I8TT4sXG4gICAgcGs6IGtleW9mIE0sXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICB0cmFuc2llbnQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IE0ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJldmVydCk7XG4gICAgaWYgKHRyYW5zaWVudCkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGByZS1hZGRpbmcgdHJhbnNpZW50IHByb3BlcnRpZXM6ICR7T2JqZWN0LmtleXModHJhbnNpZW50KS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRyYW5zaWVudCkuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIG9iailcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBUcmFuc2llbnQgcHJvcGVydHkgJHtrZXl9IGFscmVhZHkgZXhpc3RzIG9uIG1vZGVsICR7dHlwZW9mIGNsYXp6ID09PSBcInN0cmluZ1wiID8gY2xhenogOiBjbGF6ei5uYW1lfS4gc2hvdWxkIGJlIGltcG9zc2libGVgXG4gICAgICAgICAgKTtcbiAgICAgICAgKG9iaiBhcyBNKVtrZXkgYXMga2V5b2YgTV0gPSB2YWw7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IChjbGF6eiBhcyBDb25zdHJ1Y3RvcjxNPikob2JqKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyByZWNvcmQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gY3JlYXRlIGEgbmV3IHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIG1vZGVsIHRvIGNyZWF0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICByZXR1cm4gYXdhaXQgcmVwby5zYXZlKG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIHJlYWQgYSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrIC0gcHJpbWFyeSBrZXkgY29sdW1cbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJlYWQgcmVjb3JkXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgcGs6IHN0cmluZ1xuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICBjb25zdCBxOiBGaW5kT25lT3B0aW9ucyA9IHtcbiAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICBbcGtdOiBpZCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICByZXN1bHQgPSAoYXdhaXQgcmVwby5maW5kT25lKHEpKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkOiAke2lkfSBub3QgZm91bmQgaW4gdGFibGUgJHt0eXBlb2YgdGFibGVOYW1lID09PSBcInN0cmluZ1wiID8gdGFibGVOYW1lIDogUmVwb3NpdG9yeS50YWJsZSh0YWJsZU5hbWUpfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIHJlY29yZCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byB1cGRhdGUgYSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSBtb2RlbCB0byB1cGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIHJldHVybiByZXBvLnNhdmUobW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSByZWNvcmQgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBkZWxldGUgYSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIElEIG9mIHRoZSByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBrIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgY29uc3QgbW9kZWwgPSBhd2FpdCB0aGlzLnJlYWQodGFibGVOYW1lLCBpZCwgcGspO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgcmVwby5kZWxldGUoaWQpO1xuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIGNvbnN0IHJlc3VsdDogSW5zZXJ0UmVzdWx0ID0gYXdhaXQgcmVwby5pbnNlcnQobW9kZWwpO1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEFsbChcbiAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICByZXN1bHQuaWRlbnRpZmllcnMubWFwKChpZCkgPT4gaWQuaWQpLFxuICAgICAgICBcImlkXCJcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW10sXG4gICAgcGs6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoIWlkLmxlbmd0aCkgcmV0dXJuIFtdO1xuXG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICByZXR1cm4gcmVwby5maW5kQnkoeyBbcGtdOiBJbihpZCkgfSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5bXSxcbiAgICBwazogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChjb25zdCBtIG9mIG1vZGVsKSB7XG4gICAgICByZXN1bHQucHVzaChhd2FpdCB0aGlzLnVwZGF0ZSh0YWJsZU5hbWUsIG1bcGtdLCBtLCAuLi5hcmdzKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgaWYgKCFpZHMubGVuZ3RoKSByZXR1cm4gW107XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICBjb25zdCBtb2RlbHMgPSBhd2FpdCB0aGlzLnJlYWRBbGwodGFibGVOYW1lLCBpZHMsIHBrKTtcbiAgICAgIGF3YWl0IHJlcG8uZGVsZXRlKGlkcyk7XG4gICAgICByZXR1cm4gbW9kZWxzO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhbiBlcnJvciBhbmQgY29udmVydHMgaXQgdG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdmFyaW91cyBlcnJvciB0eXBlcyB0byBhcHByb3ByaWF0ZSBCYXNlRXJyb3Igc3VidHlwZXNcbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3IgYXMgYSBCYXNlRXJyb3JcbiAgICovXG4gIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICByZXR1cm4gVHlwZU9STUFkYXB0ZXIucGFyc2VFcnJvcihlcnIsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbiBhdHRyaWJ1dGUgaXMgcmVzZXJ2ZWRcbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyByZXNlcnZlZCBpbiBQb3N0Z3JlU1FMXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyIC0gVGhlIGF0dHJpYnV0ZSBuYW1lIHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgaXNSZXNlcnZlZChhdHRyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFhdHRyLm1hdGNoKHJlc2VydmVkQXR0cmlidXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN0YXRpYyBtZXRob2QgdG8gcGFyc2UgYW4gZXJyb3IgYW5kIGNvbnZlcnQgaXQgdG8gYSBCYXNlRXJyb3JcbiAgICogQHN1bW1hcnkgQ29udmVydHMgdmFyaW91cyBlcnJvciB0eXBlcyB0byBhcHByb3ByaWF0ZSBCYXNlRXJyb3Igc3VidHlwZXMgYmFzZWQgb24gUG9zdGdyZVNRTCBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXNcbiAgICogQHBhcmFtIHtFcnJvcnxzdHJpbmd9IGVyciAtIFRoZSBlcnJvciB0byBwYXJzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlYXNvbl0gLSBPcHRpb25hbCByZWFzb24gZm9yIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIHtCYXNlRXJyb3J9IFRoZSBwYXJzZWQgZXJyb3IgYXMgYSBCYXNlRXJyb3JcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VFcnJvclxuICAgKiAgIHBhcnRpY2lwYW50IEVycm9yVHlwZXNcbiAgICpcbiAgICogICBDYWxsZXItPj5wYXJzZUVycm9yOiBlcnIsIHJlYXNvblxuICAgKiAgIE5vdGUgb3ZlciBwYXJzZUVycm9yOiBDaGVjayBpZiBlcnIgaXMgYWxyZWFkeSBhIEJhc2VFcnJvclxuICAgKiAgIGFsdCBlcnIgaXMgQmFzZUVycm9yXG4gICAqICAgICBwYXJzZUVycm9yLS0+PkNhbGxlcjogcmV0dXJuIGVyclxuICAgKiAgIGVsc2UgZXJyIGlzIHN0cmluZ1xuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IEV4dHJhY3QgY29kZSBmcm9tIHN0cmluZ1xuICAgKiAgICAgYWx0IGNvZGUgbWF0Y2hlcyBcImR1cGxpY2F0ZSBrZXl8YWxyZWFkeSBleGlzdHNcIlxuICAgKiAgICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IENvbmZsaWN0RXJyb3IoY29kZSlcbiAgICogICAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICAgIGVsc2UgY29kZSBtYXRjaGVzIFwiZG9lcyBub3QgZXhpc3R8bm90IGZvdW5kXCJcbiAgICogICAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBOb3RGb3VuZEVycm9yKGNvZGUpXG4gICAqICAgICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBOb3RGb3VuZEVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIGVyciBoYXMgY29kZSBwcm9wZXJ0eVxuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IEV4dHJhY3QgY29kZSBhbmQgcmVhc29uXG4gICAqICAgZWxzZVxuICAgKiAgICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IFVzZSBlcnIubWVzc2FnZSBhcyBjb2RlXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IFN3aXRjaCBvbiBQb3N0Z3JlU1FMIGVycm9yIGNvZGVcbiAgICogICBhbHQgY29kZSBpcyAyMzUwNSAodW5pcXVlX3Zpb2xhdGlvbilcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyAyMzUwMyAoZm9yZWlnbl9rZXlfdmlvbGF0aW9uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25mbGljdEVycm9yKHJlYXNvbilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgZWxzZSBjb2RlIGlzIDQyUDAxICh1bmRlZmluZWRfdGFibGUpXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDI3MDMgKHVuZGVmaW5lZF9jb2x1bW4pXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDJQMDcgKGR1cGxpY2F0ZV90YWJsZSlcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyA0MlAxNiAoaW52YWxpZF90YWJsZV9kZWZpbml0aW9uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBJbmRleEVycm9yKGVycilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBJbmRleEVycm9yXG4gICAqICAgZWxzZSBjb2RlIG1hdGNoZXMgXCJFQ09OTlJFRlVTRURcIlxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbm5lY3Rpb25FcnJvclxuICAgKiAgIGVsc2VcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBwYXJzZUVycm9yKGVycjogRXJyb3IgfCBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IEJhc2VFcnJvciB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEJhc2VFcnJvcikgcmV0dXJuIGVyciBhcyBhbnk7XG4gICAgY29uc3QgY29kZTogc3RyaW5nID0gdHlwZW9mIGVyciA9PT0gXCJzdHJpbmdcIiA/IGVyciA6IGVyci5tZXNzYWdlO1xuXG4gICAgaWYgKGNvZGUubWF0Y2goL2R1cGxpY2F0ZSBrZXl8YWxyZWFkeSBleGlzdHMvZykpXG4gICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IoY29kZSk7XG4gICAgaWYgKGNvZGUubWF0Y2goL2RvZXMgbm90IGV4aXN0fG5vdCBmb3VuZC9nKSkgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKGNvZGUpO1xuXG4gICAgLy8gUG9zdGdyZVNRTCBlcnJvciBjb2RlczogaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy9jdXJyZW50L2VycmNvZGVzLWFwcGVuZGl4Lmh0bWxcbiAgICBzd2l0Y2ggKGNvZGUudG9TdHJpbmcoKSkge1xuICAgICAgLy8gSW50ZWdyaXR5IGNvbnN0cmFpbnQgdmlvbGF0aW9uc1xuICAgICAgY2FzZSBcIjIzNTA1XCI6IC8vIHVuaXF1ZV92aW9sYXRpb25cbiAgICAgIGNhc2UgXCIyMzUwM1wiOiAvLyBmb3JlaWduX2tleV92aW9sYXRpb25cbiAgICAgIGNhc2UgXCI0MlAwN1wiOiAvLyBkdXBsaWNhdGVfdGFibGVcbiAgICAgICAgcmV0dXJuIG5ldyBDb25mbGljdEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuXG4gICAgICAvLyBPYmplY3Qgbm90IGZvdW5kIGVycm9yc1xuICAgICAgY2FzZSBcIjQyUDAxXCI6IC8vIHVuZGVmaW5lZF90YWJsZVxuICAgICAgY2FzZSBcIjQyNzAzXCI6IC8vIHVuZGVmaW5lZF9jb2x1bW5cbiAgICAgICAgcmV0dXJuIG5ldyBOb3RGb3VuZEVycm9yKHJlYXNvbiBhcyBzdHJpbmcpO1xuXG4gICAgICAvLyBJbnZhbGlkIG9iamVjdCBkZWZpbml0aW9uXG4gICAgICBjYXNlIFwiNDJQMTZcIjogLy8gaW52YWxpZF90YWJsZV9kZWZpbml0aW9uXG4gICAgICAgIHJldHVybiBuZXcgSW5kZXhFcnJvcihlcnIpO1xuXG4gICAgICAvLyBDb25uZWN0aW9uIGVycm9yc1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGNvZGUudG9TdHJpbmcoKS5tYXRjaCgvRUNPTk5SRUZVU0VEL2cpKVxuICAgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbkVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJuYWxFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjb25uZWN0KGNvbmZpZzogRGF0YVNvdXJjZU9wdGlvbnMpOiBQcm9taXNlPERhdGFTb3VyY2U+IHtcbiAgICBjb25zdCBjb24gPSBuZXcgRGF0YVNvdXJjZShjb25maWcpO1xuICAgIGlmICghY29uLmlzSW5pdGlhbGl6ZWQpIGF3YWl0IGNvbi5pbml0aWFsaXplKCk7XG4gICAgcmV0dXJuIGNvbjtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVEYXRhYmFzZShcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIGRiTmFtZTogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuY3JlYXRlRGF0YWJhc2UpO1xuICAgIGxvZy52ZXJib3NlKGBDcmVhdGluZyBkYXRhYmFzZSAke2RiTmFtZX1gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgQ1JFQVRFIERBVEFCQVNFICR7ZGJOYW1lfWApO1xuICAgICAgbG9nLmluZm8oYENyZWF0ZWQgZGF0YWJhc2UgJHtkYk5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVOb3RpZnlGdW5jdGlvbihcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIHVzZXI6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzLmNyZWF0ZU5vdGlmeUZ1bmN0aW9uKTtcbiAgICBsb2cudmVyYm9zZShgQ3JlYXRpbmcgbm90aWZ5IGZ1bmN0aW9uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBub3RpZnlfdGFibGVfY2hhbmdlcygpXG5SRVRVUk5TIHRyaWdnZXIgQVMgJCRcbkJFR0lOXG4gICAgUEVSRk9STSBwZ19ub3RpZnkoXG4gICAgICAgICd0YWJsZV9jaGFuZ2VzJyxcbiAgICAgICAganNvbl9idWlsZF9vYmplY3QoXG4gICAgICAgICAgICAndGFibGUnLCBUR19UQUJMRV9OQU1FLFxuICAgICAgICAgICAgJ2FjdGlvbicsIFRHX09QLFxuICAgICAgICAgICAgJ2RhdGEnLCByb3dfdG9fanNvbihORVcpLFxuICAgICAgICAgICAgJ29sZF9kYXRhJywgcm93X3RvX2pzb24oT0xEKVxuICAgICAgICApOjp0ZXh0XG4gICAgKTtcbiAgICBSRVRVUk4gTkVXO1xuRU5EO1xuJCQgTEFOR1VBR0UgcGxwZ3NxbCBTRUNVUklUWSBERUZJTkVSXG47YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBBTFRFUiBGVU5DVElPTiBub3RpZnlfdGFibGVfY2hhbmdlcygpIE9XTkVSIFRPICR7dXNlcn07YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYFxuICAgICAgICAgICAgR1JBTlQgRVhFQ1VURSBPTiBGVU5DVElPTiBub3RpZnlfdGFibGVfY2hhbmdlcygpIFRPIHB1YmxpYztcbiAgICAgICAgYCk7XG4gICAgICBsb2cuaW5mbyhgQ3JlYXRlZCBub3RpZnkgZnVuY3Rpb25gKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGRlbGV0ZURhdGFiYXNlKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgZGJOYW1lOiBzdHJpbmcsXG4gICAgdXNlcj86IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHVzZXIpIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYERST1AgT1dORUQgQlkgJHt1c2VyfSBDQVNDQURFO2ApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgRFJPUCBEQVRBQkFTRSAke2RiTmFtZX1gKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZVVzZXIoXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBkYk5hbWU6IHN0cmluZyxcbiAgICB1c2VyOiBzdHJpbmcsXG4gICAgcGFzc3dvcmQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgQ1JFQVRFIFVTRVIgJHt1c2VyfSBXSVRIIFBBU1NXT1JEICcke3Bhc3N3b3JkfSdgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYEdSQU5UIENPTk5FQ1QgT04gREFUQUJBU0UgJHtkYk5hbWV9IFRPICR7dXNlcn1gKTtcblxuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgR1JBTlQgVVNBR0UgT04gU0NIRU1BIHB1YmxpYyBUTyAke3VzZXJ9YCk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBHUkFOVCBDUkVBVEUgT04gU0NIRU1BIHB1YmxpYyBUTyAke3VzZXJ9YCk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFRBQkxFUyBJTiBTQ0hFTUEgcHVibGljIFRPICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBTRVFVRU5DRVMgSU4gU0NIRU1BIHB1YmxpYyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgRlVOQ1RJT05TIElOIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIElOIFNDSEVNQSBwdWJsaWMgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gVEFCTEVTIFRPICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgcHVibGljIEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIFNFUVVFTkNFUyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGRlbGV0ZVVzZXIoXG4gICAgY2xpZW50OiBEYXRhU291cmNlLFxuICAgIHVzZXI6IHN0cmluZyxcbiAgICBhZG1pbjogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFJFQVNTSUdOIE9XTkVEIEJZICR7dXNlcn0gVE8gJHthZG1pbn1gKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYFJFVk9LRSBBTEwgT04gQUxMIFRBQkxFUyBJTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYFJFVk9LRSBBTEwgT04gU0NIRU1BIHB1YmxpYyBGUk9NICR7dXNlcn1gKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYFJFVk9LRSBBTEwgUFJJVklMRUdFUyBPTiBBTEwgU0VRVUVOQ0VTIElOIFNDSEVNQSBwdWJsaWMgRlJPTSAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYFJFVk9LRSBBTEwgUFJJVklMRUdFUyBPTiBBTEwgRlVOQ1RJT05TIElOIFNDSEVNQSBwdWJsaWMgRlJPTSAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBGT1IgUk9MRSAke2FkbWlufSBJTiBTQ0hFTUEgcHVibGljIFJFVk9LRSBBTEwgT04gVEFCTEVTIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgRk9SIFJPTEUgJHthZG1pbn0gSU4gU0NIRU1BIHB1YmxpYyBSRVZPS0UgQUxMIE9OIFNFUVVFTkNFUyBGUk9NICR7dXNlcn07YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBGT1IgUk9MRSAke2FkbWlufSBJTiBTQ0hFTUEgcHVibGljIFJFVk9LRSBBTEwgT04gRlVOQ1RJT05TIEZST00gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYERST1AgT1dORUQgQlkgJHt1c2VyfSBDQVNDQURFYCk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoYERST1AgVVNFUiBJRiBFWElTVFMgXCIke3VzZXJ9XCJgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VUeXBlVG9Qb3N0Z3JlcyhcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaXNQazogYm9vbGVhbixcbiAgICBpc0ZrID0gZmFsc2VcbiAgKSB7XG4gICAgc3dpdGNoICh0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgcmV0dXJuIGlzUGsgPyBcIlRFWFQgUFJJTUFSWSBLRVlcIiA6IGlzRmsgPyBcIlRFWFRcIiA6IFwiVkFSQ0hBUlwiO1xuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICByZXR1cm4gaXNQayA/IFwiU0VSSUFMIFBSSU1BUlkgS0VZXCIgOiBcIklOVEVHRVJcIjtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBcIkJPT0xFQU5cIjtcbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIHJldHVybiBcIlRJTUVTVEFNUFwiO1xuICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICByZXR1cm4gaXNQayA/IFwiQklHSU5UIFBSSU1BUlkgS0VZXCIgOiBcIkJJR0lOVFwiO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBtID0gTW9kZWwuZ2V0KHR5cGUpO1xuICAgICAgICBpZiAobSkge1xuICAgICAgICAgIGNvbnN0IG1tID0gbmV3IG0oKTtcbiAgICAgICAgICBjb25zdCB0eXBlID0gUmVmbGVjdGlvbi5nZXRUeXBlRnJvbURlY29yYXRvcihcbiAgICAgICAgICAgIG1tLFxuICAgICAgICAgICAgZmluZFByaW1hcnlLZXkobW0pLmlkXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbW9kZWw6IG0sXG4gICAgICAgICAgICBwa1R5cGU6IHR5cGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZTogJHt0eXBlfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlVmFsaWRhdGlvblRvUG9zdGdyZXMoXG4gICAgcHJvcDogc3RyaW5nLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBpc1BrOiBib29sZWFuLFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFZhbGlkYXRvck9wdGlvbnNcbiAgKSB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuUkVRVUlSRUQ6XG4gICAgICAgIHJldHVybiBcIk5PVCBOVUxMXCI7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEg6XG4gICAgICAgIGlmIChpc1BrIHx8ICFvcHRpb25zIHx8IHR5cGUudG9Mb3dlckNhc2UoKSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgKCR7KG9wdGlvbnMgYXMgTWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSF19KWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEg6XG4gICAgICAgIHJldHVybiBgQ09OU1RSQUlOVCAke3Byb3B9X21pbl9sZW5ndGhfY2hlY2sgQ0hFQ0sgKExFTkdUSCgke3Byb3B9KSA+PSAkeyhvcHRpb25zIGFzIE1pbkxlbmd0aFZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEhdfSlgO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5QQVRURVJOOlxuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5VUkw6XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLkVNQUlMOlxuICAgICAgICByZXR1cm4gYENPTlNUUkFJTlQgJHtwcm9wfV9wYXR0ZXJuX2NoZWNrIENIRUNLICgke3Byb3B9IH4gJyR7Y29udmVydEpzUmVnZXhUb1Bvc3RncmVzKChvcHRpb25zIGFzIFBhdHRlcm5WYWxpZGF0b3JPcHRpb25zKVtWYWxpZGF0aW9uS2V5cy5QQVRURVJOXSBhcyBzdHJpbmcpfScpYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuVFlQRTpcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuREFURTpcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLk1JTjpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fJHtrZXl9X2NoZWNrIENIRUNLICgke3Byb3B9ID49ICR7KG9wdGlvbnMgYXMgTWluVmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuTUlOXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuTUFYOlxuICAgICAgICByZXR1cm4gYENPTlNUUkFJTlQgJHtwcm9wfV8ke2tleX1fY2hlY2sgQ0hFQ0sgKCR7cHJvcH0gPD0gJHsob3B0aW9ucyBhcyBNYXhWYWxpZGF0b3JPcHRpb25zKVtWYWxpZGF0aW9uS2V5cy5NQVhdfSlgO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5QQVNTV09SRDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBVbnN1cHBvcnRlZCB0eXBlOiAke2tleX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZVJlbGF0aW9uc1RvUG9zdGdyZXMoXG4gICAgcHJvcDogc3RyaW5nLFxuICAgIGNsYXp6OiBDb25zdHJ1Y3RvcjxNb2RlbD4sXG4gICAgcGs6IHN0cmluZyxcbiAgICBrZXk6IFBlcnNpc3RlbmNlS2V5cyxcbiAgICBvcHRpb25zOiBSZWxhdGlvbnNNZXRhZGF0YVxuICApIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKGNsYXp6KTtcbiAgICBjb25zdCB7IGNhc2NhZGUgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgY2FzY2FkZVN0ciA9IGAke2Nhc2NhZGUudXBkYXRlID8gXCIgT04gVVBEQVRFIENBU0NBREVcIiA6IFwiXCJ9JHtjYXNjYWRlLmRlbGV0ZSA/IFwiIE9OIERFTEVURSBDQVNDQURFXCIgOiBcIlwifWA7XG4gICAgc3dpdGNoIChgcmVsYXRpb25zJHtrZXl9YCkge1xuICAgICAgY2FzZSBQZXJzaXN0ZW5jZUtleXMuT05FX1RPX09ORTpcbiAgICAgICAgcmV0dXJuIGBGT1JFSUdOIEtFWSAoJHtwcm9wfSkgUkVGRVJFTkNFUyAke3RhYmxlTmFtZX0oJHtwa30pJHtjYXNjYWRlU3RyfWA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAke2tleX1gKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlVGFibGU8TSBleHRlbmRzIE1vZGVsPihcbiAgICBjbGllbnQ6IERhdGFTb3VyY2UsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgVHlwZU9STVRhYmxlU3BlYz4+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFR5cGVPUk1UYWJsZVNwZWM+ID0ge307XG4gICAgY29uc3QgbSA9IG5ldyBtb2RlbCh7fSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShtb2RlbCk7XG4gICAgY29uc3QgeyBpZCB9ID0gZmluZFByaW1hcnlLZXkobSk7XG5cbiAgICBsZXQgaXNQazogYm9vbGVhbiwgY29sdW1uOiBzdHJpbmc7XG4gICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG0pIGFzIChrZXlvZiBNKVtdO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiAodGhpcyBhcyBhbnkpW3Byb3BdID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAgICAgcHJvcC50b1N0cmluZygpLnN0YXJ0c1dpdGgoXCJfXCIpIHx8XG4gICAgICAgIHByb3AgPT09IFwiY29uc3RydWN0b3JcIlxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpc1BrID0gcHJvcCA9PT0gaWQ7XG4gICAgICBjb2x1bW4gPSBSZXBvc2l0b3J5LmNvbHVtbihtLCBwcm9wLnRvU3RyaW5nKCkpO1xuXG4gICAgICBjb25zdCBhbGxEZWNzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1QsXG4gICAgICAgIG0sXG4gICAgICAgIHByb3AudG9TdHJpbmcoKSxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRlY29yYXRvckRhdGEgPSBhbGxEZWNzLmRlY29yYXRvcnMucmVkdWNlKFxuICAgICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIGVsKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBrZXksIHByb3BzIH0gPSBlbDtcbiAgICAgICAgICBpZiAoa2V5ID09PSBNb2RlbEtleXMuVFlQRSAmJiAhYWNjdW1bVmFsaWRhdGlvbktleXMuVFlQRV0pIHtcbiAgICAgICAgICAgIGFjY3VtW1ZhbGlkYXRpb25LZXlzLlRZUEVdID0ge1xuICAgICAgICAgICAgICBjdXN0b21UeXBlczogW3Byb3BzLm5hbWUgYXMgc3RyaW5nXSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5UWVBFLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJkZWZpbmVzIHRoZSBhY2NlcHRlZCB0eXBlcyBmb3IgdGhlIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGtleSAhPT0gVmFsaWRhdGlvbktleXMuVFlQRSkge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZy4gd2UgY2FuIG9ubHkgc3VwcG9ydCBiYXNpcyBjdHlwZXMgYXQgdGhpcyB0aW1lXG4gICAgICAgICAgICBhY2N1bVtrZXldID0gcHJvcHM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgICAgfSxcbiAgICAgICAge31cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRiRGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBSZXBvc2l0b3J5LmtleShcInJlbGF0aW9uc1wiKSxcbiAgICAgICAgbSxcbiAgICAgICAgcHJvcC50b1N0cmluZygpLFxuICAgICAgICB0cnVlLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgICBjb25zdCBxdWVyeTogc3RyaW5nW10gPSBbXTtcbiAgICAgIGNvbnN0IGNvbnN0cmFpbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgZm9yZWlnbktleXM6IHN0cmluZ1tdID0gW107XG4gICAgICBsZXQgdHlwZURhdGE6IFR5cGVNZXRhZGF0YSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgIGxldCBjaGlsZENsYXNzOiBDb25zdHJ1Y3RvcjxNb2RlbD4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICBsZXQgY2hpbGRQazogYW55O1xuXG4gICAgICBpZiAoT2JqZWN0LmtleXMoZGVjb3JhdG9yRGF0YSkubGVuZ3RoKSB7XG4gICAgICAgIHR5cGVEYXRhID0gZGVjb3JhdG9yRGF0YVtWYWxpZGF0aW9uS2V5cy5UWVBFXSBhcyBUeXBlTWV0YWRhdGE7XG5cbiAgICAgICAgaWYgKCF0eXBlRGF0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB0eXBlIGluZm9ybWF0aW9uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFyc2VkVHlwZTpcbiAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgIHwgeyBtb2RlbDogQ29uc3RydWN0b3I8TW9kZWw+IHwgc3RyaW5nOyBwa1R5cGU/OiBzdHJpbmcgfSA9XG4gICAgICAgICAgdGhpcy5wYXJzZVR5cGVUb1Bvc3RncmVzKFxuICAgICAgICAgICAgdHlwZW9mICh0eXBlRGF0YS5jdXN0b21UeXBlcyBhcyBhbnlbXSlbMF0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICA/ICh0eXBlRGF0YS5jdXN0b21UeXBlcyBhcyBhbnkpWzBdKClcbiAgICAgICAgICAgICAgOiAodHlwZURhdGEuY3VzdG9tVHlwZXMgYXMgYW55KVswXSxcbiAgICAgICAgICAgIGlzUGtcbiAgICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHBhcnNlZFR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBwYXJzZWRUeXBlID0geyBtb2RlbDogcGFyc2VkVHlwZSB9O1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlU3RyOlxuICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgfCB7IG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbD4gfCBzdHJpbmc7IHBrVHlwZT86IHN0cmluZyB9ID1cbiAgICAgICAgICBwYXJzZWRUeXBlLm1vZGVsIGFzXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCB7IG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbD4gfCBzdHJpbmc7IHBrVHlwZT86IHN0cmluZyB9O1xuXG4gICAgICAgIGlmICh0eXBlb2YgdHlwZVN0ciAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHR5cGVTdHIpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0eXBlU3RyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBjb250aW51ZTtcbiAgICAgICAgICAvLyBjb25zdCByZXM6IFJlY29yZDxzdHJpbmcsIFBvc3RncmVzVGFibGVTcGVjPiA9IGF3YWl0IHRoaXMuY3JlYXRlVGFibGUocG9vbCwgdHlwZVN0cik7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNoaWxkQ2xhc3MgPSBwYXJzZWRUeXBlLm1vZGVsIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICAgICAgICAgIGNvbnN0IG0gPSBuZXcgY2hpbGRDbGFzcygpO1xuICAgICAgICAgICAgY2hpbGRQayA9IGZpbmRQcmltYXJ5S2V5KG0pO1xuICAgICAgICAgICAgdHlwZVN0ciA9IHRoaXMucGFyc2VUeXBlVG9Qb3N0Z3JlcyhcbiAgICAgICAgICAgICAgcGFyc2VkVHlwZS5wa1R5cGUgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY3JlYXRlVGFibGUoY2xpZW50LCBjaGlsZENsYXNzKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgQ29uZmxpY3RFcnJvcikpIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRwID0gQXJyYXkuaXNBcnJheSh0eXBlRGF0YS5jdXN0b21UeXBlcylcbiAgICAgICAgICA/IHR5cGVEYXRhLmN1c3RvbVR5cGVzWzBdXG4gICAgICAgICAgOiB0eXBlRGF0YS5jdXN0b21UeXBlcztcbiAgICAgICAgdHAgPSB0eXBlb2YgdHAgPT09IFwiZnVuY3Rpb25cIiAmJiAhdHAubmFtZSA/IHRwKCkgOiB0cDtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvblN0ciA9IHRoaXMucGFyc2VWYWxpZGF0aW9uVG9Qb3N0Z3JlcyhcbiAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgdHAgYXMgYW55LFxuICAgICAgICAgIGlzUGssXG4gICAgICAgICAgVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSCxcbiAgICAgICAgICAoZGVjb3JhdG9yRGF0YVtcbiAgICAgICAgICAgIFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhcbiAgICAgICAgICBdIGFzIE1heExlbmd0aFZhbGlkYXRvck9wdGlvbnMpIHx8IHtcbiAgICAgICAgICAgIFtWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXTogMjU1LFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBxID0gYCR7Y29sdW1ufSAke3R5cGVTdHJ9JHt2YWxpZGF0aW9uU3RyfWA7XG5cbiAgICAgICAgaWYgKGlzUGspIHtcbiAgICAgICAgICBxdWVyeS51bnNoaWZ0KHEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHF1ZXJ5LnB1c2gocSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHByb3BzXSBvZiBPYmplY3QuZW50cmllcyhkZWNvcmF0b3JEYXRhKS5maWx0ZXIoXG4gICAgICAgICAgKFtrXSkgPT5cbiAgICAgICAgICAgICFbVmFsaWRhdGlvbktleXMuVFlQRSwgVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSF0uaW5jbHVkZXMoayBhcyBhbnkpXG4gICAgICAgICkpIHtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gdGhpcy5wYXJzZVZhbGlkYXRpb25Ub1Bvc3RncmVzKFxuICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICAgICAgdHAgYXMgYW55LFxuICAgICAgICAgICAgaXNQayxcbiAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgIHByb3BzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmFsaWRhdGlvbi5zdGFydHNXaXRoKFwiQ09OU1RSQUlOVFwiKSkge1xuICAgICAgICAgICAgY29uc3RyYWludHMucHVzaCh2YWxpZGF0aW9uKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgcXVlcnkucHVzaCh2YWxpZGF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVE9ETyBpZ25vcmUgZm9yIG5vdy4gdGhpcyBsZWF2ZXMgZm9yZWlnbiBrZXlzIG91dFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnN0YW50LWJpbmFyeS1leHByZXNzaW9uXG4gICAgICBpZiAoZmFsc2UgfHwgKGRiRGVjcyAmJiBkYkRlY3MuZGVjb3JhdG9ycy5sZW5ndGgpKSB7XG4gICAgICAgIGlmICghdHlwZURhdGEpIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB0eXBlIGluZm9ybWF0aW9uYCk7XG4gICAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRiRGVjcy5kZWNvcmF0b3JzKSB7XG4gICAgICAgICAgY29uc3QgeyBrZXksIHByb3BzIH0gPSBkZWNvcmF0b3I7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRoaXMucGFyc2VSZWxhdGlvbnNUb1Bvc3RncmVzKFxuICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICAgICAgY2hpbGRDbGFzcyBhcyBDb25zdHJ1Y3RvcjxNb2RlbD4sXG4gICAgICAgICAgICBjaGlsZFBrLmlkLFxuICAgICAgICAgICAga2V5IGFzIFBlcnNpc3RlbmNlS2V5cyxcbiAgICAgICAgICAgIHByb3BzIGFzIHVua25vd24gYXMgUmVsYXRpb25zTWV0YWRhdGFcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh2YWxpZGF0aW9uLnN0YXJ0c1dpdGgoXCJGT1JFSUdOXCIpKSB7XG4gICAgICAgICAgICBmb3JlaWduS2V5cy5wdXNoKHZhbGlkYXRpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgVW5zdXBwb3J0ZWQgcmVsYXRpb246ICR7a2V5fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXN1bHRbcHJvcC50b1N0cmluZygpXSA9IHtcbiAgICAgICAgcXVlcnk6IHF1ZXJ5LmpvaW4oXCIgXCIpLFxuICAgICAgICB2YWx1ZXM6IFtdLFxuICAgICAgICBwcmltYXJ5S2V5OiBpc1BrLFxuICAgICAgICBjb25zdHJhaW50czogY29uc3RyYWludHMsXG4gICAgICAgIGZvcmVpZ25LZXlzOiBmb3JlaWduS2V5cyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhyZXN1bHQpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gdmFsdWVzLm1hcCgocikgPT4gci5xdWVyeSkuam9pbihcIixcXG5cIik7XG4gICAgY29uc3QgY29uc3RyYWludHMgPSB2YWx1ZXNcbiAgICAgIC5maWx0ZXIoKGMpID0+ICEhYy5jb25zdHJhaW50cy5sZW5ndGgpXG4gICAgICAubWFwKChyKSA9PiByLmNvbnN0cmFpbnRzKVxuICAgICAgLmpvaW4oXCIsXFxuXCIpO1xuICAgIGNvbnN0IGZvcmVpZ25LZXlzID0gdmFsdWVzXG4gICAgICAuZmlsdGVyKChjKSA9PiAhIWMuZm9yZWlnbktleXMubGVuZ3RoKVxuICAgICAgLm1hcCgocikgPT4gci5mb3JlaWduS2V5cylcbiAgICAgIC5qb2luKFwiLFxcblwiKTtcbiAgICBjb25zdCB2YWxzID0gW3F1ZXJ5LCBjb25zdHJhaW50c107XG4gICAgaWYgKGZvcmVpZ25LZXlzKSB7XG4gICAgICB2YWxzLnB1c2goZm9yZWlnbktleXMpO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IGBDUkVBVEUgVEFCTEUgJHt0YWJsZU5hbWV9ICgke3ZhbHMuZmlsdGVyKCh2KSA9PiAhIXYpLmpvaW4oXCIsXFxuXCIpfSlgO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkocXVlcnlTdHJpbmcpO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQ1JFQVRFIFRSSUdHRVIgbm90aWZ5X2NoYW5nZXNfJHt0YWJsZU5hbWV9XG5BRlRFUiBJTlNFUlQgT1IgVVBEQVRFIE9SIERFTEVURSBPTiAke3RhYmxlTmFtZX1cbiAgICBGT1IgRUFDSCBST1dcbiAgICBFWEVDVVRFIEZVTkNUSU9OIG5vdGlmeV90YWJsZV9jaGFuZ2VzKCk7YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0Q3VycmVudFVzZXIoY2xpZW50OiBEYXRhU291cmNlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IGBTRUxFQ1QgQ1VSUkVOVF9VU0VSO2A7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5xdWVyeShxdWVyeVN0cmluZyk7XG4gICAgICByZXR1cm4gcmVzdWx0WzBdLmN1cnJlbnRfdXNlcjtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGRlY29yYXRpb24oKSB7XG4gICAgLy8gQHRhYmxlKCkgPT4gQEVudGl0eSgpXG4gICAgY29uc3QgdGFibGVLZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuVEFCTEUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHRhYmxlS2V5KVxuICAgICAgLmV4dGVuZCgob3JpZ2luYWw6IGFueSkgPT5cbiAgICAgICAgRW50aXR5KCkob3JpZ2luYWxbTW9kZWxLZXlzLkFOQ0hPUl0gfHwgb3JpZ2luYWwpXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBwaygpID0+IEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKCkgfCBAUHJpbWFyeUNvbHVtbigpXG4gICAgY29uc3QgcGtLZXkgPSBSZXBvc2l0b3J5LmtleShEQktleXMuSUQpO1xuXG4gICAgZnVuY3Rpb24gcGtEZWMob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKSB7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzOiBhbnlbXSA9IFtcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcmVhZG9ubHkoKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKHBrS2V5LCBvcHRpb25zKSxcbiAgICAgIF07XG4gICAgICByZXR1cm4gZnVuY3Rpb24gcGtEZWMob3JpZ2luYWw6IGFueSwgcHJvcDogYW55KSB7XG4gICAgICAgIGxldCB0eXBlID1cbiAgICAgICAgICBvcHRpb25zLnR5cGUgfHwgUmVmbGVjdGlvbi5nZXRUeXBlRnJvbURlY29yYXRvcihvcmlnaW5hbCwgcHJvcCk7XG4gICAgICAgIGlmICghdHlwZSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBNaXNzaW5nIHR5cGUgaW5mb3JtYXRpb24gZm9yIHByb3BlcnR5ICR7cHJvcH0gb2YgJHtvcmlnaW5hbC5uYW1lfWBcbiAgICAgICAgICApO1xuICAgICAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZWQpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gb3B0aW9ucy5uYW1lIHx8IHNlcXVlbmNlTmFtZUZvck1vZGVsKG9yaWdpbmFsLCBcInBrXCIpO1xuICAgICAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgICAgIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oe1xuICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXRjaCAodHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgIHR5cGUgPSBcIm51bWVyaWNcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgIHR5cGUgPSBcInZhcmNoYXJcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgICAgICAgIHR5cGUgPSBcImJpZ2ludFwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBVbnN1cHBvcnRlZCB0eXBlOiAke3R5cGV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgICAgIFByaW1hcnlDb2x1bW4oe1xuICAgICAgICAgICAgICB0eXBlOiB0eXBlIGFzIENvbHVtblR5cGUsXG4gICAgICAgICAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHkoLi4uZGVjb3JhdG9ycykob3JpZ2luYWwsIHByb3ApO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihwa0tleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IHBrRGVjLFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQGNvbHVtbihcImNvbHVtbk5hbWVcIikgPT4gQENvbHVtbih7bmFtZTogXCJjb2x1bW5OYW1lXCJ9KVxuICAgIGNvbnN0IGNvbHVtbktleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKGNvbHVtbktleSlcbiAgICAgIC5leHRlbmQoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNvbHVtbShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gY29sdW1uKG9iajogYW55LCBwcm9wOiBhbnkpIHtcbiAgICAgICAgICAgIHJldHVybiBDb2x1bW4oe1xuICAgICAgICAgICAgICBuYW1lOiBuYW1lIHx8IHByb3AsXG4gICAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSkob2JqLCBwcm9wKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06IChhcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBhcmdzWzFdO1xuICAgICAgICAgIHJldHVybiBbY29sdW1uTmFtZV07XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAdW5pcXVlID0+IEBDb2x1bW4oe3VuaXF1ZTogdHJ1ZX0pXG4gICAgY29uc3QgdW5pcXVlS2V5ID0gQWRhcHRlci5rZXkoUGVyc2lzdGVuY2VLZXlzLlVOSVFVRSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IodW5pcXVlS2V5KVxuICAgICAgLmRlZmluZShwcm9wTWV0YWRhdGEodW5pcXVlS2V5LCB7fSkpXG4gICAgICAuZXh0ZW5kKENvbHVtbih7IHVuaXF1ZTogdHJ1ZSB9KSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHJlcXVpcmVkID0+IEBDb2x1bW4oeyBudWxsYWJsZTogZmFsc2UgfSlcbiAgICBjb25zdCByZXF1aXJlZEtleSA9IFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihyZXF1aXJlZEtleSlcbiAgICAgIC5leHRlbmQoQ29sdW1uKHsgbnVsbGFibGU6IGZhbHNlIH0pKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAdmVyc2lvbiA9PiBAVmVyc2lvbkNvbHVtbigpXG4gICAgY29uc3QgdmVyc2lvbktleSA9IFJlcG9zaXRvcnkua2V5KERCS2V5cy5WRVJTSU9OKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih2ZXJzaW9uS2V5KVxuICAgICAgLmRlZmluZSh0eXBlKE51bWJlci5uYW1lKSwgVmVyc2lvbkNvbHVtbigpKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBmdW5jdGlvbiBWYWxpZGF0aW9uVXBkYXRlS2V5KGtleTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gVXBkYXRlVmFsaWRhdGlvbktleXMuUkVGTEVDVCArIGtleTtcbiAgICB9XG5cbiAgICAvLyBAdGltZXN0YW1wKG9wKSA9PiBAQ3JlYXRlRGF0ZUNvbHVtbigpIHx8IEBVcGRhdGVEYXRlQ29sdW1uKClcbiAgICBjb25zdCB0aW1lc3RhbXBLZXkgPSBWYWxpZGF0aW9uVXBkYXRlS2V5KERCS2V5cy5USU1FU1RBTVApO1xuXG4gICAgZnVuY3Rpb24gdHMob3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzW10sIGZvcm1hdDogc3RyaW5nKSB7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzOiBhbnlbXSA9IFtcbiAgICAgICAgZGF0ZShmb3JtYXQsIERCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLkRBVEUpLFxuICAgICAgICByZXF1aXJlZChEQl9ERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRJTUVTVEFNUC5SRVFVSVJFRCksXG4gICAgICAgIHByb3BNZXRhZGF0YShWYWxpZGF0aW9uLmtleShEQktleXMuVElNRVNUQU1QKSwge1xuICAgICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICAgIGZvcm1hdDogZm9ybWF0LFxuICAgICAgICB9KSxcbiAgICAgIF07XG4gICAgICBpZiAob3BlcmF0aW9uLmluZGV4T2YoT3BlcmF0aW9uS2V5cy5VUERBVEUpICE9PSAtMSlcbiAgICAgICAgZGVjb3JhdG9ycy5wdXNoKFxuICAgICAgICAgIHByb3BNZXRhZGF0YSh0aW1lc3RhbXBLZXksIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IERCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLklOVkFMSUQsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIGVsc2UgZGVjb3JhdG9ycy5wdXNoKHJlYWRvbmx5KCkpO1xuICAgICAgcmV0dXJuIGFwcGx5KC4uLmRlY29yYXRvcnMpO1xuICAgIH1cblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHRpbWVzdGFtcEtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IHRzLFxuICAgICAgfSlcbiAgICAgIC5leHRlbmQoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIHRpbWVzdGFtcCguLi5vcHM6IE9wZXJhdGlvbktleXNbXSkge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiB0aW1lc3RhbXAob2JqOiBhbnksIHByb3A6IGFueSkge1xuICAgICAgICAgICAgaWYgKG9wcy5pbmRleE9mKE9wZXJhdGlvbktleXMuVVBEQVRFKSAhPT0gLTEpXG4gICAgICAgICAgICAgIHJldHVybiBVcGRhdGVEYXRlQ29sdW1uKCkob2JqLCBwcm9wKTtcbiAgICAgICAgICAgIHJldHVybiBDcmVhdGVEYXRlQ29sdW1uKCkob2JqLCBwcm9wKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06IChhcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIHJldHVybiBhcmdzWzBdO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQG9uZVRvT25lKGNsYXp6KSA9PiBAT25lVG9PbmUoKCkgPT4gY2xhenopXG4gICAgY29uc3Qgb25lVG9PbmVLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX09ORSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3Iob25lVG9PbmVLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBvbmVUb09uZShcbiAgICAgICAgICBjbGF6ejogQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSxcbiAgICAgICAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgICAgICAgcG9wdWxhdGU6IGJvb2xlYW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICAgICAgY2xhc3M6IChjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IGNsYXp6KSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3Qgb3JtTWV0YTogUmVsYXRpb25PcHRpb25zID0ge1xuICAgICAgICAgICAgY2FzY2FkZTpcbiAgICAgICAgICAgICAgY2FzY2FkZS51cGRhdGUgPT09IENhc2NhZGUuQ0FTQ0FERSB8fFxuICAgICAgICAgICAgICBjYXNjYWRlLmRlbGV0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFLFxuICAgICAgICAgICAgb25EZWxldGU6IGNhc2NhZGUuZGVsZXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG9uVXBkYXRlOiBjYXNjYWRlLnVwZGF0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVhZ2VyOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICAgICAgICB0eXBlKFtcbiAgICAgICAgICAgICAgKHR5cGVvZiBjbGF6eiA9PT0gXCJmdW5jdGlvblwiICYmICFjbGF6ei5uYW1lXG4gICAgICAgICAgICAgICAgPyBjbGF6elxuICAgICAgICAgICAgICAgIDogY2xhenoubmFtZSkgYXMgYW55LFxuICAgICAgICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBwcm9wTWV0YWRhdGEob25lVG9PbmVLZXksIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIE9uZVRvT25lKFxuICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el0pXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbCBNb2RlbCBub3QgZm91bmQgaW4gY29uc3RydWN0b3JcIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAobW9kZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkobmV3IChjbGF6eiBhcyBDb25zdHJ1Y3Rvcjxhbnk+KSgpKS5pZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWxbcGtdO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvcm1NZXRhXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgSm9pbkNvbHVtbigpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBvbmVUb01hbnkoY2xhenopID0+IEBPbmVUb01hbnkoKCkgPT4gY2xhenopXG4gICAgY29uc3Qgb25lVG9NYW55S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19NQU5ZKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihvbmVUb01hbnlLZXkpXG4gICAgICAuZGVmaW5lKHtcbiAgICAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBvbmVUb01hbnkoXG4gICAgICAgICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PiksXG4gICAgICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgICAgIHBvcHVsYXRlOiBib29sZWFuXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNsYXNzOiAoY2xhenoubmFtZSA/IGNsYXp6Lm5hbWUgOiBjbGF6eikgYXMgc3RyaW5nLFxuICAgICAgICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICAgICAgICBsaXN0KGNsYXp6KSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShvbmVUb01hbnlLZXksIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIE9uZVRvTWFueVdyYXBwZXIob2JqOiBhbnksIHByb3A6IGFueSk6IGFueSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9ybU1ldGE6IFJlbGF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICAgICAgY2FzY2FkZS51cGRhdGUgPT09IENhc2NhZGUuQ0FTQ0FERSB8fFxuICAgICAgICAgICAgICAgICAgY2FzY2FkZS5kZWxldGUgPT09IENhc2NhZGUuQ0FTQ0FERSxcbiAgICAgICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgICAgIG9uVXBkYXRlOiBjYXNjYWRlLnVwZGF0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICByZXR1cm4gT25lVG9NYW55KFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el0pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWwgTW9kZWwgbm90IGZvdW5kIGluIGNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAobW9kZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBtID0gbmV3IChjbGF6eiBhcyBDb25zdHJ1Y3Rvcjxhbnk+KSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgY3Jvc3NSZWxhdGlvbktleSA9IE9iamVjdC5rZXlzKG0pLmZpbmQoKGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX09ORSksXG4gICAgICAgICAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgICAgICAgICBrLFxuICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWNzIHx8ICFkZWNzLmRlY29yYXRvcnMgfHwgIWRlY3MuZGVjb3JhdG9ycy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNpZ25UeXBlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgICAgICAgICBNb2RlbEtleXMuVFlQRSxcbiAgICAgICAgICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICAgICAgICAgIGtcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXNpZ25UeXBlKVxuICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYE5vIFR5cGUgRGVmaW5pdGlvbiBmb3VuZCBmb3IgJHtrfSBpbiAke20uY29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2lnblR5cGUubmFtZSA9PT0gb2JqLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3Jvc3NSZWxhdGlvbktleSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgYENyb3NzIHJlbGF0aW9uIG5vdCBmb3VuZC4gRGlkIHlvdSB1c2UgQG1hbnlUb09uZSBvbiB0aGUgJHtjbGF6ei5uYW1lfT9gXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWxbY3Jvc3NSZWxhdGlvbktleV07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvcm1NZXRhXG4gICAgICAgICAgICAgICkob2JqLCBwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQG1hbnlUb09uZShjbGF6eikgPT4gQE1hbnlUb09uZSgoKSA9PiBjbGF6eilcbiAgICBjb25zdCBtYW55VG9PbmVLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19PTkUpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG1hbnlUb09uZUtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1hbnlUb09uZShcbiAgICAgICAgICBjbGF6ejogQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSxcbiAgICAgICAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgICAgICAgcG9wdWxhdGU6IGJvb2xlYW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICAgICAgY2xhc3M6IChjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IGNsYXp6KSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3Qgb3JtTWV0YTogUmVsYXRpb25PcHRpb25zID0ge1xuICAgICAgICAgICAgY2FzY2FkZTpcbiAgICAgICAgICAgICAgY2FzY2FkZS51cGRhdGUgPT09IENhc2NhZGUuQ0FTQ0FERSB8fFxuICAgICAgICAgICAgICBjYXNjYWRlLmRlbGV0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFLFxuICAgICAgICAgICAgb25EZWxldGU6IGNhc2NhZGUuZGVsZXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG9uVXBkYXRlOiBjYXNjYWRlLnVwZGF0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVhZ2VyOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICAgICAgICB0eXBlKFtcbiAgICAgICAgICAgICAgKHR5cGVvZiBjbGF6eiA9PT0gXCJmdW5jdGlvblwiICYmICFjbGF6ei5uYW1lXG4gICAgICAgICAgICAgICAgPyBjbGF6elxuICAgICAgICAgICAgICAgIDogY2xhenoubmFtZSkgYXMgYW55LFxuICAgICAgICAgICAgICBTdHJpbmcubmFtZSxcbiAgICAgICAgICAgICAgTnVtYmVyLm5hbWUsXG4gICAgICAgICAgICAgIEJpZ0ludC5uYW1lLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBwcm9wTWV0YWRhdGEobWFueVRvT25lS2V5LCBtZXRhZGF0YSksXG4gICAgICAgICAgICBmdW5jdGlvbiBNYW55VG9PbmVXcmFwcGVyKG9iajogYW55LCBwcm9wOiBhbnkpOiBhbnkge1xuICAgICAgICAgICAgICByZXR1cm4gTWFueVRvT25lKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el0pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWwgTW9kZWwgbm90IGZvdW5kIGluIGNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAobW9kZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBtID0gbmV3IChjbGF6eiBhcyBDb25zdHJ1Y3Rvcjxhbnk+KSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgY3Jvc3NSZWxhdGlvbktleSA9IE9iamVjdC5rZXlzKG0pLmZpbmQoKGspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjcyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fTUFOWSksXG4gICAgICAgICAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgICAgICAgICBrLFxuICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWNzIHx8ICFkZWNzLmRlY29yYXRvcnMgfHwgIWRlY3MuZGVjb3JhdG9ycy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0RGVjID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0aW9uLmtleShWYWxpZGF0aW9uS2V5cy5MSVNUKSxcbiAgICAgICAgICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICAgICAgICAgIGtcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0RGVjKVxuICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYE5vIFR5cGUgRGVmaW5pdGlvbiBmb3VuZCBmb3IgJHtrfSBpbiAke20uY29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGxpc3REZWMuY2xhenpbMF0oKS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZSA9PT0gb2JqLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmICghY3Jvc3NSZWxhdGlvbktleSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgYENyb3NzIHJlbGF0aW9uIG5vdCBmb3VuZC4gRGlkIHlvdSB1c2UgQG1hbnlUb09uZSBvbiB0aGUgJHtjbGF6ei5uYW1lfT9gXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWxbY3Jvc3NSZWxhdGlvbktleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApKG9iaiwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEBtYW55VG9NYW55KGNsYXp6KSA9PiBATWFueVRvTWFueSgoKSA9PiBjbGF6eilcbiAgICBjb25zdCBtYW55VG9NYW55S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk1BTllfVE9fTUFOWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IobWFueVRvTWFueUtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1hbnlUb01hbnkoXG4gICAgICAgICAgY2xheno6IENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PiksXG4gICAgICAgICAgY2FzY2FkZTogQ2FzY2FkZU1ldGFkYXRhLFxuICAgICAgICAgIHBvcHVsYXRlOiBib29sZWFuXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZWxhdGlvbnNNZXRhZGF0YSA9IHtcbiAgICAgICAgICAgIGNsYXNzOiBjbGF6ei5uYW1lLFxuICAgICAgICAgICAgY2FzY2FkZTogY2FzY2FkZSxcbiAgICAgICAgICAgIHBvcHVsYXRlOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IG9ybU1ldGE6IFJlbGF0aW9uT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNhc2NhZGU6XG4gICAgICAgICAgICAgIGNhc2NhZGUudXBkYXRlID09PSBDYXNjYWRlLkNBU0NBREUgfHxcbiAgICAgICAgICAgICAgY2FzY2FkZS5kZWxldGUgPT09IENhc2NhZGUuQ0FTQ0FERSxcbiAgICAgICAgICAgIG9uRGVsZXRlOiBjYXNjYWRlLmRlbGV0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICBvblVwZGF0ZTogY2FzY2FkZS51cGRhdGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICBlYWdlcjogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgICBwcm9wKFBlcnNpc3RlbmNlS2V5cy5SRUxBVElPTlMpLFxuICAgICAgICAgICAgbGlzdChjbGF6eiksXG4gICAgICAgICAgICBwcm9wTWV0YWRhdGEobWFueVRvTWFueUtleSwgbWV0YWRhdGEpLFxuICAgICAgICAgICAgTWFueVRvTWFueShcbiAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgIGlmICghY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWwgTW9kZWwgbm90IGZvdW5kIGluIGNvbnN0cnVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKG1vZGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG5ldyAoY2xhenogYXMgQ29uc3RydWN0b3I8YW55PikoKSkuaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsW3BrXTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgb3JtTWV0YVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIEpvaW5UYWJsZSgpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi9UeXBlT1JNQWRhcHRlclwiO1xuXG5UeXBlT1JNQWRhcHRlci5kZWNvcmF0aW9uKCk7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2luZGV4ZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3F1ZXJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1R5cGVPUk1BZGFwdGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHlwZU9STURpc3BhdGNoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9UeXBlT1JNUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGVPUk0gaW50ZWdyYXRpb24gZm9yIERlY2FmLnRzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIFR5cGVPUk0tYmFja2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEZWNhZi50cyBkYXRhIGFjY2VzcyBhYnN0cmFjdGlvbnMsIGluY2x1ZGluZyB0aGUgYWRhcHRlciwgcmVwb3NpdG9yeSwgc3RhdGVtZW50IGJ1aWxkZXIsIHBhZ2luYXRpb24gdXRpbGl0aWVzLCBpbmRleCBoZWxwZXJzLCBhbmQgdHlwZSBkZWZpbml0aW9ucy4gS2V5IGV4cG9ydHMgaW5jbHVkZSB7QGxpbmsgVHlwZU9STUFkYXB0ZXJ9LCB7QGxpbmsgVHlwZU9STVJlcG9zaXRvcnl9LCB7QGxpbmsgVHlwZU9STVN0YXRlbWVudH0sIHtAbGluayBUeXBlT1JNUGFnaW5hdG9yfSwgYW5kIGluZGV4IGdlbmVyYXRpb24gdXRpbGl0aWVzLlxuICogQG1vZHVsZSBmb3ItdHlwZW9ybVxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb24uXG4gKiBAc3VtbWFyeSBUaGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIGZvci10eXBlb3JtIHBhY2thZ2UuXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJCYXNlRXJyb3IiLCJTUUxPcGVyYXRvciIsIlBhZ2luYXRvciIsIk1vZGVsS2V5cyIsIlBhZ2luZ0Vycm9yIiwiZmluZFByaW1hcnlLZXkiLCJRdWVyeUVycm9yIiwiU3RhdGVtZW50IiwiUmVwb3NpdG9yeSIsIk9yZGVyRGlyZWN0aW9uIiwiSW50ZXJuYWxFcnJvciIsIkdyb3VwT3BlcmF0b3IiLCJPcGVyYXRvciIsIlNlcXVlbmNlIiwiTm90Rm91bmRFcnJvciIsIkRlZmF1bHRTZXBhcmF0b3IiLCJQZXJzaXN0ZW5jZUtleXMiLCJUeXBlT1JNUmVwb3NpdG9yeSIsIkNvbnRleHQiLCJPcGVyYXRpb25LZXlzIiwiZW5mb3JjZURCRGVjb3JhdG9ycyIsIlZhbGlkYXRpb25FcnJvciIsIl9fZGVjb3JhdGUiLCJ1c2VzIiwiTW9kZWwiLCJFdmVudFN1YnNjcmliZXIiLCJEaXNwYXRjaCIsImdldE1ldGFkYXRhQXJnc1N0b3JhZ2UiLCJDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IiLCJQcmltYXJ5Q29sdW1uQ2Fubm90QmVOdWxsYWJsZUVycm9yIiwiQWRhcHRlciIsIkRhdGFTb3VyY2UiLCJSZWZsZWN0aW9uIiwiVmFsaWRhdGlvbktleXMiLCJEQktleXMiLCJJbiIsIkNvbmZsaWN0RXJyb3IiLCJDb25uZWN0aW9uRXJyb3IiLCJMb2dnaW5nIiwiREVGQVVMVF9FUlJPUl9NRVNTQUdFUyIsIkRlY29yYXRpb24iLCJyZXF1aXJlZCIsInJlYWRvbmx5IiwicHJvcE1ldGFkYXRhIiwic2VxdWVuY2VOYW1lRm9yTW9kZWwiLCJhcHBseSIsIlZhbGlkYXRpb24iLCJ0eXBlIiwiVmVyc2lvbkNvbHVtbiIsIlVwZGF0ZVZhbGlkYXRpb25LZXlzIiwiZGF0ZSIsIkRCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMiLCJDYXNjYWRlIiwicHJvcCIsIk9uZVRvT25lIiwiSm9pbkNvbHVtbiIsImxpc3QiLCJPbmVUb01hbnkiLCJNYW55VG9PbmUiLCJNYW55VG9NYW55IiwiSm9pblRhYmxlIiwiZmluYWwiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7OztJQUtHO0FBQ0ksVUFBTSxrQkFBa0IsR0FDN0I7QUFFSyxVQUFNLGNBQWMsR0FBRztJQUU5Qjs7Ozs7Ozs7Ozs7OztJQWFHO0lBQ0g7Ozs7OztJQU1HO0FBQ0ksVUFBTSxXQUFXLEdBQUc7SUFDekIsSUFBQSxTQUFTLEVBQUUsR0FBRztJQUNkLElBQUEsRUFBRSxFQUFFLElBQUk7SUFDUixJQUFBLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLElBQUEsT0FBTyxFQUFFLFlBQVk7SUFDckIsSUFBQSxLQUFLLEVBQUUsWUFBWTtJQUNuQixJQUFBLE1BQU0sRUFBRSxhQUFhO0lBQ3JCLElBQUEsUUFBUSxFQUFFLGVBQWU7SUFDekIsSUFBQSxLQUFLLEVBQUUsT0FBTzs7O0lDdENoQjs7Ozs7Ozs7Ozs7Ozs7OztJQWdCRztJQUNHLE1BQU8sVUFBVyxTQUFRQSxzQkFBUyxDQUFBO0lBQ3ZDLElBQUEsV0FBQSxDQUFZLEdBQW1CLEVBQUE7WUFDN0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUNsQztJQUNEOztJQ25CRDs7Ozs7SUFLRztBQUNTQztJQUFaLENBQUEsVUFBWSxXQUFXLEVBQUE7SUFDckIsSUFBQSxXQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsR0FBVztJQUNYLElBQUEsV0FBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLElBQWdCO0lBQ2hCLElBQUEsV0FBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLEdBQWU7SUFDZixJQUFBLFdBQUEsQ0FBQSxvQkFBQSxDQUFBLEdBQUEsSUFBeUI7SUFDekIsSUFBQSxXQUFBLENBQUEsY0FB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
|
|
2943
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLXR5cGVvcm0uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2Vycm9ycy50cyIsIi4uL3NyYy90eXBlcy50cyIsIi4uL3NyYy9xdWVyeS9jb25zdGFudHMudHMiLCIuLi9zcmMvcXVlcnkvUGFnaW5hdG9yLnRzIiwiLi4vc3JjL3F1ZXJ5L3RyYW5zbGF0ZS50cyIsIi4uL3NyYy9xdWVyeS9TdGF0ZW1lbnQudHMiLCIuLi9zcmMvc2VxdWVuY2VzL1NlcXVlbmNlLnRzIiwiLi4vc3JjL2luZGV4ZXMvZ2VuZXJhdG9yLnRzIiwiLi4vc3JjL1R5cGVPUk1SZXBvc2l0b3J5LnRzIiwiLi4vc3JjL1R5cGVPUk1FdmVudFN1YnNjcmliZXIudHMiLCIuLi9zcmMvVHlwZU9STURpc3BhdGNoLnRzIiwiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy91dGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9VcGRhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9DcmVhdGVEYXRlQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9PYmplY3RVdGlscy50cyIsIi4uL3NyYy9vdmVycmlkZXMvT25lVG9PbmUudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL09uZVRvTWFueS50cyIsIi4uL3NyYy9vdmVycmlkZXMvTWFueVRvT25lLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9NYW55VG9NYW55LnRzIiwiLi4vc3JjL292ZXJyaWRlcy9QcmltYXJ5R2VuZXJhdGVkQ29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9QcmltYXJ5Q29sdW1uLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9FbnRpdHkudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9UeXBlT1JNQWRhcHRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gdG8gaWRlbnRpZnkgcmVzZXJ2ZWQgYXR0cmlidXRlcyBmb3IgU1FMIGNvbnRleHRzLlxuICogQHN1bW1hcnkgTWF0Y2hlcyBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBjb25mbGljdCB3aXRoIFNRTCByZXNlcnZlZCBrZXl3b3JkcyB0byBwcmV2ZW50IGludmFsaWQgc2NoZW1hIG9yIHF1ZXJ5IGdlbmVyYXRpb24uXG4gKiBAY29uc3QgcmVzZXJ2ZWRBdHRyaWJ1dGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCByZXNlcnZlZEF0dHJpYnV0ZXMgPVxuICAvXihzZWxlY3R8ZnJvbXx3aGVyZXxhbmR8b3J8aW5zZXJ0fHVwZGF0ZXxkZWxldGV8ZHJvcHxjcmVhdGV8dGFibGV8aW5kZXh8cHJpbWFyeXxrZXl8Zm9yZWlnbnxyZWZlcmVuY2VzfGNvbnN0cmFpbnR8dW5pcXVlfGNoZWNrfGRlZmF1bHR8bnVsbHxub3R8YXN8b3JkZXJ8Ynl8Z3JvdXB8aGF2aW5nfGxpbWl0fG9mZnNldHxqb2lufGlubmVyfG91dGVyfGxlZnR8cmlnaHR8ZnVsbHxvbnx1c2luZ3x2YWx1ZXN8cmV0dXJuaW5nfHNldHxpbnRvfGNhc2V8d2hlbnx0aGVufGVsc2V8ZW5kfGNhc3R8Y29hbGVzY2V8ZXhpc3RzfGFueXxhbGx8c29tZXxpbnxiZXR3ZWVufGxpa2V8aWxpa2V8c2ltaWxhcnx0b3xpc3x0cnVlfGZhbHNlfGFzY3xkZXNjfGRpc3RpbmN0fHVuaW9ufGludGVyc2VjdHxleGNlcHR8bmF0dXJhbHxsYXRlcmFsfHdpbmRvd3xvdmVyfHBhcnRpdGlvbnxyYW5nZXxyb3dzfHVuYm91bmRlZHxwcmVjZWRpbmd8Zm9sbG93aW5nfGN1cnJlbnR8cm93fHdpdGh8cmVjdXJzaXZlfG1hdGVyaWFsaXplZHx2aWV3fGZ1bmN0aW9ufHRyaWdnZXJ8cHJvY2VkdXJlfGxhbmd1YWdlfHJldHVybnN8cmV0dXJufGRlY2xhcmV8YmVnaW58Y29tbWl0fHJvbGxiYWNrfHNhdmVwb2ludHx0cmFuc2FjdGlvbnx0ZW1wb3Jhcnl8dGVtcHxpZnxsb29wfHdoaWxlfGZvcnxjb250aW51ZXxleGl0fHJhaXNlfGV4Y2VwdGlvbnxub3RpY2V8aW5mb3xsb2d8ZGVidWd8YXNzZXJ0fGV4ZWN1dGV8cGVyZm9ybXxnZXR8ZGlhZ25vc3RpY3N8Y2FsbHxkb3xhbGlhc3xjb21tZW50fHZhY3V1bXxhbmFseXplfGV4cGxhaW58Y29weXxncmFudHxyZXZva2V8cHJpdmlsZWdlc3xwdWJsaWN8dXNhZ2V8c2NoZW1hfHNlcXVlbmNlfG93bmVkfG93bmVyfHRhYmxlc3BhY2V8c3RvcmFnZXxpbmhlcml0c3x0eXBlfG9wZXJhdG9yfGNvbGxhdGV8Y29sbGF0aW9ufGNhc2NhZGV8cmVzdHJpY3R8YWRkfGFsdGVyfGNvbHVtbnxyZW5hbWV8dG98ZW5hYmxlfGRpc2FibGV8Zm9yY2V8bm98aW5zdGVhZHxvZnxiZWZvcmV8YWZ0ZXJ8ZWFjaHxzdGF0ZW1lbnR8cm93fGV4ZWN1dGV8YWxzb3xvbmx5fGV4Y2x1ZGV8bnVsbHN8b3RoZXJzfG9yZGluYWxpdHl8dGllc3xub3RoaW5nfGNhY2hlfGN5Y2xlfGluY3JlbWVudHxtaW52YWx1ZXxtYXh2YWx1ZXxzdGFydHxyZXN0YXJ0fGJ5fGNhbGxlZHxyZXR1cm5zfGxhbmd1YWdlfGltbXV0YWJsZXxzdGFibGV8dm9sYXRpbGV8c3RyaWN0fHNlY3VyaXR5fGRlZmluZXJ8aW52b2tlcnxjb3N0fHJvd3N8c3VwcG9ydHxoYW5kbGVyfGlubGluZXx2YWxpZGF0b3J8b3B0aW9uc3xzdG9yYWdlfGluaGVyaXRhbmNlfG9pZHN8d2l0aG91dHxkYXRhfGRpY3Rpb25hcnl8ZW5jb2Rpbmd8bGNfY29sbGF0ZXxsY19jdHlwZXxjb25uZWN0aW9ufGxpbWl0fHBhc3N3b3JkfHZhbGlkfHVudGlsfHN1cGVydXNlcnxub3N1cGVydXNlcnxjcmVhdGVkYnxub2NyZWF0ZWRifGNyZWF0ZXJvbGV8bm9jcmVhdGVyb2xlfGluaGVyaXR8bm9pbmhlcml0fGxvZ2lufG5vbG9naW58cmVwbGljYXRpb258bm9yZXBsaWNhdGlvbnxieXBhc3NybHN8bm9ieXBhc3NybHN8ZW5jcnlwdGVkfHVuZW5jcnlwdGVkfG5ld3xvbGR8c2Vzc2lvbl91c2VyfGN1cnJlbnRfdXNlcnxjdXJyZW50X3JvbGV8Y3VycmVudF9zY2hlbWF8Y3VycmVudF9jYXRhbG9nfGN1cnJlbnRfZGF0ZXxjdXJyZW50X3RpbWV8Y3VycmVudF90aW1lc3RhbXB8bG9jYWx0aW1lfGxvY2FsdGltZXN0YW1wfGN1cnJlbnRfZGF0YWJhc2V8aW5ldHxjaWRyfG1hY2FkZHJ8bWFjYWRkcjh8Yml0fHZhcmJpdHx0c3ZlY3Rvcnx0c3F1ZXJ5fHV1aWR8eG1sfGpzb258anNvbmJ8aW50fGludGVnZXJ8c21hbGxpbnR8YmlnaW50fGRlY2ltYWx8bnVtZXJpY3xyZWFsfGRvdWJsZXxwcmVjaXNpb258ZmxvYXR8Ym9vbGVhbnxib29sfGNoYXJ8Y2hhcmFjdGVyfHZhcmNoYXJ8dGV4dHxieXRlYXxkYXRlfHRpbWV8dGltZXN0YW1wfGludGVydmFsfHBvaW50fGxpbmV8bHNlZ3xib3h8cGF0aHxwb2x5Z29ufGNpcmNsZXxtb25leXx2b2lkKSQvaTtcblxuZXhwb3J0IGNvbnN0IFR5cGVPUk1GbGF2b3VyID0gXCJ0eXBlLW9ybVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTaGFwZSBvZiB0aGUgVHlwZU9STUtleXMgY29uc3RhbnQuXG4gKiBAc3VtbWFyeSBEZXNjcmliZXMgdGhlIGtleXMgYW5kIHRoZWlyIG1lYW5pbmdzIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEB0eXBlZGVmIFR5cGVPUk1LZXlzRGVmXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU0VQQVJBVE9SIFNlcGFyYXRvciB1c2VkIHRvIGpvaW4gdGFibGUgYW5kIGNvbHVtbiBpZGVudGlmaWVycy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJRCBEZWZhdWx0IHByaW1hcnkga2V5IGZpZWxkIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVkVSU0lPTiBWZXJzaW9uIGZpZWxkIHVzZWQgZm9yIG9wdGltaXN0aWMgbG9ja2luZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBERUxFVEVEIFNvZnQtZGVsZXRlIHRpbWVzdGFtcCBmaWVsZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUQUJMRSBEYXRhYmFzZSB0YWJsZSBpZGVudGlmaWVyIGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTQ0hFTUEgRGF0YWJhc2Ugc2NoZW1hIGlkZW50aWZpZXIga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNFUVVFTkNFIERhdGFiYXNlIHNlcXVlbmNlIG5hbWUga2V5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOREVYIEluZGV4IGlkZW50aWZpZXIga2V5LlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXkgY29uc3RhbnRzIHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBzdW1tYXJ5IENvbGxlY3Rpb24gb2Ygc3RyaW5nIGNvbnN0YW50cyB0aGF0IGlkZW50aWZ5IGNvbW1vbiBkYXRhYmFzZSBwcm9wZXJ0aWVzIGFuZCBhZGFwdGVyLXNwZWNpZmljIGtleXMuXG4gKiBAY29uc3QgVHlwZU9STUtleXNcbiAqIEB0eXBlIHtUeXBlT1JNS2V5c0RlZn1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1LZXlzID0ge1xuICBTRVBBUkFUT1I6IFwiLlwiLFxuICBJRDogXCJpZFwiLFxuICBWRVJTSU9OOiBcInZlcnNpb25cIixcbiAgREVMRVRFRDogXCJkZWxldGVkX2F0XCIsXG4gIFRBQkxFOiBcInRhYmxlX25hbWVcIixcbiAgU0NIRU1BOiBcInNjaGVtYV9uYW1lXCIsXG4gIFNFUVVFTkNFOiBcInNlcXVlbmNlX25hbWVcIixcbiAgSU5ERVg6IFwiaW5kZXhcIixcbn07XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCBUeXBlT1JNIGluZGV4ZXMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFuIGVycm9yIHJlbGF0ZWQgdG8gaW5kZXggZ2VuZXJhdGlvbiBvciBoYW5kbGluZyB3aXRoaW4gdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgVGhlIGVycm9yIG1lc3NhZ2Ugb3IgRXJyb3Igb2JqZWN0LlxuICogQGNsYXNzXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiB1c2luZyBJbmRleEVycm9yXG4gKiB0cnkge1xuICogICAvLyBTb21lIGNvZGUgdGhhdCBtaWdodCB0aHJvdyBhbiBpbmRleCBlcnJvclxuICogICB0aHJvdyBuZXcgSW5kZXhFcnJvcihcIkluZGV4IG5vdCBmb3VuZFwiKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEluZGV4RXJyb3IpIHtcbiAqICAgICBjb25zb2xlLmVycm9yKFwiSW5kZXggZXJyb3Igb2NjdXJyZWQ6XCIsIGVycm9yLm1lc3NhZ2UpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBJbmRleEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKEluZGV4RXJyb3IubmFtZSwgbXNnLCA0MDQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBSZXBvc2l0b3J5RmxhZ3MgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU1FMIG9wZXJhdG9ycyBhdmFpbGFibGUgZm9yIGJ1aWxkaW5nIFR5cGVPUk0gcXVlcmllcy5cbiAqIEBzdW1tYXJ5IEVudW1lcmF0aW9uIG9mIGNvbW1vbiBTUUwgb3BlcmF0b3JzIGludGVuZGVkIGZvciB1c2Ugd2l0aGluIFR5cGVPUk0gcXVlcnkgY29uc3RydWN0aW9uIGFuZCB0cmFuc2xhdGlvbiBsYXllcnMuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgZW51bSBTUUxPcGVyYXRvciB7XG4gIEVRVUFMID0gXCI9XCIsXG4gIE5PVF9FUVVBTCA9IFwiPD5cIixcbiAgTEVTU19USEFOID0gXCI8XCIsXG4gIExFU1NfVEhBTl9PUl9FUVVBTCA9IFwiPD1cIixcbiAgR1JFQVRFUl9USEFOID0gXCI+XCIsXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTCA9IFwiPj1cIixcbiAgSU4gPSBcIklOXCIsXG4gIE5PVF9JTiA9IFwiTk9UIElOXCIsXG4gIExJS0UgPSBcIkxJS0VcIixcbiAgSUxJS0UgPSBcIklMSUtFXCIsXG4gIEJFVFdFRU4gPSBcIkJFVFdFRU5cIixcbiAgSVNfTlVMTCA9IFwiSVMgTlVMTFwiLFxuICBJU19OT1RfTlVMTCA9IFwiSVMgTk9UIE5VTExcIixcbiAgRVhJU1RTID0gXCJFWElTVFNcIixcbiAgTk9UX0VYSVNUUyA9IFwiTk9UIEVYSVNUU1wiLFxuICBBTlkgPSBcIkFOWVwiLFxuICBBTEwgPSBcIkFMTFwiLFxuICBTT01FID0gXCJTT01FXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFF1ZXJ5IGNvbnRhaW5lciB1c2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGVpdGhlciBhIHJhdyBTUUwgc3RyaW5nIG9yIGEgVHlwZU9STSBTZWxlY3RRdWVyeUJ1aWxkZXIgYWxvbmcgd2l0aCBvcHRpb25hbCBib3VuZCB2YWx1ZXMgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGFkYXB0ZXIuXG4gKiBAdGVtcGxhdGUgTSBUaGUgTW9kZWwgdHlwZSBmb3Igd2hpY2ggdGhlIFNlbGVjdFF1ZXJ5QnVpbGRlciBpcyBwYXJhbWV0ZXJpemVkLlxuICogQHRlbXBsYXRlIFQgVGhlIHVuZGVybHlpbmcgcXVlcnkgdHlwZSwgZWl0aGVyIGEgc3RyaW5nIG9yIGEgU2VsZWN0UXVlcnlCdWlsZGVyPE0+LlxuICogQGludGVyZmFjZSBUeXBlT1JNUXVlcnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeXBlT1JNUXVlcnk8XG4gIE0gZXh0ZW5kcyBNb2RlbCA9IE1vZGVsLFxuICBUIGV4dGVuZHMgc3RyaW5nIHwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+ID0gc3RyaW5nLFxuPiB7XG4gIHF1ZXJ5OiBUO1xuICB2YWx1ZXM/OiBhbnlbXTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBmbGFncyBmb3IgVHlwZU9STSBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgRXh0ZW5kZWQgcmVwb3NpdG9yeSBmbGFncyBpbmNsdWRpbmcgY29ubmVjdGlvbi91c2VyIGNvbnRleHQgdGhhdCBjYW4gYmUgbGV2ZXJhZ2VkIGJ5IHRoZSBUeXBlT1JNIGFkYXB0ZXIuXG4gKiBAaW50ZXJmYWNlIFR5cGVPUk1GbGFnc1xuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVPUk1GbGFncyBleHRlbmRzIFJlcG9zaXRvcnlGbGFncyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXNlciBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmb3IgUG9zdGdyZXMgZGF0YWJhc2UgY29ubmVjdGlvbnNcbiAgICovXG4gIHVzZXI6IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3BlY2lmaWNhdGlvbiBmb3IgYSB0YWJsZSBjcmVhdGlvbi9jaGFuZ2Ugc3RhdGVtZW50IHVzZWQgYnkgdGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBzdW1tYXJ5IEV4dGVuZHMgYSBUeXBlT1JNUXVlcnkgd2l0aCB0YWJsZSBtZXRhZGF0YSBzdWNoIGFzIHByaW1hcnkga2V5IGZsYWcsIGNvbnN0cmFpbnRzLCBhbmQgZm9yZWlnbiBrZXlzLlxuICogQHR5cGVkZWYgVHlwZU9STVRhYmxlU3BlY1xuICogQHByb3BlcnR5IHtib29sZWFufSBwcmltYXJ5S2V5IEluZGljYXRlcyBpZiB0aGUgdGFyZ2V0IGNvbHVtbiBpcyBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGNvbnN0cmFpbnRzIEEgbGlzdCBvZiByYXcgU1FMIGNvbnN0cmFpbnRzIHRvIGFwcGx5IHRvIHRoZSB0YWJsZS9jb2x1bW4uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmb3JlaWduS2V5cyBBIGxpc3Qgb2YgZm9yZWlnbiBrZXkgY29uc3RyYWludCBkZWZpbml0aW9ucy5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IHR5cGUgVHlwZU9STVRhYmxlU3BlYyA9IFR5cGVPUk1RdWVyeSAmIHtcbiAgcHJpbWFyeUtleTogYm9vbGVhbjtcbiAgY29uc3RyYWludHM6IHN0cmluZ1tdO1xuICBmb3JlaWduS2V5czogc3RyaW5nW107XG59O1xuIiwiaW1wb3J0IHsgU1FMT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBxdWVyeSBsaW1pdCBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IE1heGltdW0gbnVtYmVyIG9mIHJlY29yZHMgdG8gcmV0dXJuIGluIGEgc2luZ2xlIHBhZ2Ugd2hlbiBwYWdpbmF0aW5nIHJlc3VsdHMuXG4gKiBAY29uc3QgVHlwZU9STVF1ZXJ5TGltaXRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1RdWVyeUxpbWl0ID0gMjUwO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIG9wZXJhdG9yIG5hbWVzIHRvIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb25zdGFudHMgZm9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIHVzZWQgd2hlbiB0cmFuc2xhdGluZyBoaWdoLWxldmVsIGZpbHRlcnMgaW50byBTUUwgdmlhIFR5cGVPUk0uXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3N0Z3JlU1FMT3BlcmF0b3JUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRVFVQUwgRXF1YWxpdHkgb3BlcmF0b3IgKD0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRElGRkVSRU5UIEluZXF1YWxpdHkgb3BlcmF0b3IgKDw+KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJJR0dFUiBHcmVhdGVyIHRoYW4gb3BlcmF0b3IgKD4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQklHR0VSX0VRIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCBvcGVyYXRvciAoPj0pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU01BTExFUiBMZXNzIHRoYW4gb3BlcmF0b3IgKDwpXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU01BTExFUl9FUSBMZXNzIHRoYW4gb3IgZXF1YWwgb3BlcmF0b3IgKDw9KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5PVCBOZWdhdGlvbiBvcGVyYXRvciAoTk9UKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElOIEluIGFycmF5IG9wZXJhdG9yIChJTilcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUdFWFAgUmVndWxhciBleHByZXNzaW9uIG9wZXJhdG9yICh+KVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElSRUdFWFAgQ2FzZS1pbnNlbnNpdGl2ZSByZWd1bGFyIGV4cHJlc3Npb24gb3BlcmF0b3IgKH4qKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IExJS0UgUGF0dGVybiBtYXRjaGluZyBvcGVyYXRvciAoTElLRSlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTElLRSBDYXNlLWluc2Vuc2l0aXZlIHBhdHRlcm4gbWF0Y2hpbmcgb3BlcmF0b3IgKElMSUtFKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJFVFdFRU4gUmFuZ2Ugb3BlcmF0b3IgKEJFVFdFRU4pXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSVNfTlVMTCBOVUxMIGNoZWNrIG9wZXJhdG9yIChJUyBOVUxMKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IElTX05PVF9OVUxMIE5PVCBOVUxMIGNoZWNrIG9wZXJhdG9yIChJUyBOT1QgTlVMTClcbiAqIEBjb25zdCBUeXBlT1JNT3BlcmF0b3JcbiAqIEB0eXBlIHtQb3N0Z3JlU1FMT3BlcmF0b3JUeXBlfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STU9wZXJhdG9yOiBSZWNvcmQ8c3RyaW5nLCBTUUxPcGVyYXRvciB8IHN0cmluZz4gPSB7XG4gIEVRVUFMOiBTUUxPcGVyYXRvci5FUVVBTCxcbiAgRElGRkVSRU5UOiBTUUxPcGVyYXRvci5OT1RfRVFVQUwsXG4gIEJJR0dFUjogU1FMT3BlcmF0b3IuR1JFQVRFUl9USEFOLFxuICBCSUdHRVJfRVE6IFNRTE9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTCxcbiAgU01BTExFUjogU1FMT3BlcmF0b3IuTEVTU19USEFOLFxuICBTTUFMTEVSX0VROiBTUUxPcGVyYXRvci5MRVNTX1RIQU5fT1JfRVFVQUwsXG4gIEJFVFdFRU46IFNRTE9wZXJhdG9yLkJFVFdFRU4sXG4gIE5PVDogXCJOT1RcIixcbiAgSU46IFNRTE9wZXJhdG9yLklOLFxuICBJU19OVUxMOiBTUUxPcGVyYXRvci5JU19OVUxMLFxuICBJU19OT1RfTlVMTDogU1FMT3BlcmF0b3IuSVNfTk9UX05VTEwsXG4gIFJFR0VYUDogXCJ+XCIsXG4gIElSRUdFWFA6IFwifipcIixcbiAgTElLRTogU1FMT3BlcmF0b3IuTElLRSxcbiAgSUxJS0U6IFNRTE9wZXJhdG9yLklMSUtFLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBvZiBsb2dpY2FsIG9wZXJhdG9yIG5hbWVzIHRvIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb25zdGFudHMgZm9yIGxvZ2ljYWwgb3BlcmF0b3JzIHVzZWQgd2hlbiBidWlsZGluZyBXSEVSRSBjbGF1c2UgZ3JvdXBzIGluIFR5cGVPUk0gcXVlcmllcy5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IFBvc3RncmVTUUxHcm91cE9wZXJhdG9yVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFORCBMb2dpY2FsIEFORCBvcGVyYXRvciAoQU5EKVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE9SIExvZ2ljYWwgT1Igb3BlcmF0b3IgKE9SKVxuICogQGNvbnN0IFR5cGVPUk1Hcm91cE9wZXJhdG9yXG4gKiBAdHlwZSB7UG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JUeXBlfVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItdHlwZW9ybVxuICovXG5leHBvcnQgY29uc3QgVHlwZU9STUdyb3VwT3BlcmF0b3I6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIEFORDogXCJBTkRcIixcbiAgT1I6IFwiT1JcIixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNwZWNpYWwgY29uc3RhbnQgdmFsdWVzIHVzZWQgaW4gcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFN0cmluZyBjb25zdGFudHMgcmVwcmVzZW50aW5nIHNwZWNpYWwgdmFsdWVzIHVzZWQgd2hpbGUgY29tcG9zaW5nIFNRTCB3aXRoIFR5cGVPUk0uXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQb3N0Z3JlU1FMQ29uc3RUeXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVMTCBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbnVsbCB2YWx1ZS5cbiAqIEBjb25zdCBUeXBlT1JNQ29uc3RcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGNvbnN0IFR5cGVPUk1Db25zdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgTlVMTDogXCJOVUxMXCIsXG59O1xuIiwiaW1wb3J0IHsgUGFnaW5hdG9yLCBQYWdpbmdFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBGaW5kTWFueU9wdGlvbnMsIFJlcG9zaXRvcnkgYXMgUmVwbyB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBmaW5kUHJpbWFyeUtleSB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYWdpbmF0b3IgZm9yIFR5cGVPUk0gcXVlcnkgcmVzdWx0cy5cbiAqIEBzdW1tYXJ5IEltcGxlbWVudHMgcGFnaW5hdGlvbiBmb3IgVHlwZU9STS1idWlsdCBxdWVyaWVzIHVzaW5nIHRha2Uvc2tpcCBmb3IgZWZmaWNpZW50IG5hdmlnYXRpb24gdGhyb3VnaCByZXN1bHQgc2V0cy5cbiAqIEB0ZW1wbGF0ZSBNIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbC5cbiAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlci5cbiAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSBxdWVyeSBUaGUgcXVlcnkgY29udGFpbmVyIHRvIHBhZ2luYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IGNsYXp6IFRoZSBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBjbGFzcyBUeXBlT1JNUGFnaW5hdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gRXhhbXBsZSBvZiB1c2luZyBUeXBlT1JNUGFnaW5hdG9yXG4gKiBjb25zdCBwYWdpbmF0b3IgPSBuZXcgVHlwZU9STVBhZ2luYXRvcihhZGFwdGVyLCB7IHF1ZXJ5OiBxYiB9LCAxMCwgVXNlcik7XG4gKiBjb25zdCBwYWdlMSA9IGF3YWl0IHBhZ2luYXRvci5wYWdlKDEpO1xuICogY29uc3QgcGFnZTIgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSgyKTtcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGVPUk1QYWdpbmF0b3I8TSBleHRlbmRzIE1vZGVsLCBSPiBleHRlbmRzIFBhZ2luYXRvcjxcbiAgTSxcbiAgUixcbiAgVHlwZU9STVF1ZXJ5XG4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGJhc2VkIG9uIHRoZSByZWNvcmQgY291bnQgYW5kIHBhZ2Ugc2l6ZVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXNcbiAgICovXG4gIG92ZXJyaWRlIGdldCB0b3RhbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90b3RhbFBhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSB0b3RhbCByZWNvcmQgY291bnRcbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHJlY29yZHMgbWF0Y2hpbmcgdGhlIHF1ZXJ5XG4gICAqIEByZXR1cm4ge251bWJlcn0gVGhlIHRvdGFsIHJlY29yZCBjb3VudFxuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0IGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZENvdW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfX3JlcG8/OiBSZXBvPGFueT47XG5cbiAgcHJvdGVjdGVkIGdldCByZXBvKCkge1xuICAgIGlmICghdGhpcy5fX3JlcG8pIHtcbiAgICAgIHRoaXMuX19yZXBvID0gKHRoaXMuYWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlcikuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFxuICAgICAgICB0aGlzLmNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIHRoaXMuY2xhenpdXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX3JlcG87XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgVHlwZU9STVBhZ2luYXRvciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBwYWdpbmF0b3IgZm9yIFR5cGVPUk0gcXVlcnkgcmVzdWx0cy5cbiAgICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge1R5cGVPUk1RdWVyeX0gcXVlcnkgVGhlIFR5cGVPUk0gcXVlcnkgY29udGFpbmVyIHRvIHBhZ2luYXRlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBUaGUgcGFnZSBzaXplLlxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBjbGF6eiBUaGUgbW9kZWwgY29uc3RydWN0b3IuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBhZGFwdGVyOiBUeXBlT1JNQWRhcHRlcixcbiAgICBxdWVyeTogVHlwZU9STVF1ZXJ5LFxuICAgIHNpemU6IG51bWJlcixcbiAgICBjbGF6ejogQ29uc3RydWN0b3I8TT5cbiAgKSB7XG4gICAgc3VwZXIoYWRhcHRlciwgcXVlcnksIHNpemUsIGNsYXp6KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJlcGFyZXMgYSBxdWVyeSBmb3IgcGFnaW5hdGlvblxuICAgKiBAc3VtbWFyeSBNb2RpZmllcyB0aGUgcmF3IHF1ZXJ5IHRvIGluY2x1ZGUgcGFnaW5hdGlvbiBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7VHlwZU9STVF1ZXJ5fSByYXdTdGF0ZW1lbnQgLSBUaGUgb3JpZ2luYWwgUG9zdGdyZVNRTCBxdWVyeVxuICAgKiBAcmV0dXJuIHtUeXBlT1JNUXVlcnl9IFRoZSBwcmVwYXJlZCBxdWVyeSB3aXRoIHBhZ2luYXRpb24gcGFyYW1ldGVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIHByZXBhcmUocmF3U3RhdGVtZW50OiBUeXBlT1JNUXVlcnkpOiBUeXBlT1JNUXVlcnkge1xuICAgIGNvbnN0IHF1ZXJ5OiBUeXBlT1JNUXVlcnkgPSB7IC4uLnJhd1N0YXRlbWVudCB9O1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgc3BlY2lmaWMgcGFnZSBvZiByZXN1bHRzLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcXVlcnkgd2l0aCBwYWdpbmF0aW9uIGFuZCBwcm9jZXNzZXMgdGhlIHJlc3VsdHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFnZT0xXSBUaGUgcGFnZSBudW1iZXIgdG8gcmV0cmlldmUuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UltdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmVzdWx0cy5cbiAgICogQHRocm93cyB7UGFnaW5nRXJyb3J9IElmIHRyeWluZyB0byBhY2Nlc3MgYW4gaW52YWxpZCBwYWdlIG9yIGlmIG5vIGNsYXNzIGlzIGRlZmluZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IFBhZ2luYXRvciBhcyBUeXBlT1JNUGFnaW5hdG9yXG4gICAqICAgcGFydGljaXBhbnQgQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IERCIGFzIERhdGFiYXNlXG4gICAqXG4gICAqICAgQ2xpZW50LT4+UGFnaW5hdG9yOiBwYWdlKHBhZ2VOdW1iZXIpXG4gICAqICAgTm90ZSBvdmVyIFBhZ2luYXRvcjogUHJlcGFyZSBvcHRpb25zIChza2lwL3Rha2UpXG4gICAqXG4gICAqICAgYWx0IEZpcnN0IHRpbWUgb3IgbmVlZCBjb3VudFxuICAgKiAgICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogR2V0IGNvdW50XG4gICAqICAgICBBZGFwdGVyLT4+REI6IEV4ZWN1dGUgQ09VTlRcbiAgICogICAgIERCLS0+PkFkYXB0ZXI6IGNvdW50XG4gICAqICAgICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogY291bnRcbiAgICogICAgIFBhZ2luYXRvci0+PlBhZ2luYXRvcjogQ2FsY3VsYXRlIHRvdGFsIHBhZ2VzXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgUGFnaW5hdG9yLT4+QWRhcHRlcjogRXhlY3V0ZSBxdWVyeVxuICAgKiAgIEFkYXB0ZXItPj5EQjogZmluZEFuZENvdW50KG9wdGlvbnMpXG4gICAqICAgREItLT4+QWRhcHRlcjogcm93cywgY291bnRcbiAgICogICBBZGFwdGVyLS0+PlBhZ2luYXRvcjogcm93cywgY291bnRcbiAgICpcbiAgICogICBQYWdpbmF0b3ItPj5QYWdpbmF0b3I6IE1hcCByb3dzIHRvIG1vZGVsc1xuICAgKiAgIFBhZ2luYXRvci0tPj5DbGllbnQ6IHJlc3VsdHNcbiAgICovXG5cbiAgYXN5bmMgcGFnZShwYWdlOiBudW1iZXIgPSAxKTogUHJvbWlzZTxSW10+IHtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSB7IC4uLnRoaXMuc3RhdGVtZW50IH07XG5cbiAgICAvLyBHZXQgdG90YWwgY291bnQgaWYgbm90IGFscmVhZHkgY2FsY3VsYXRlZFxuICAgIGlmICghdGhpcy5fcmVjb3JkQ291bnQgfHwgIXRoaXMuX3RvdGFsUGFnZXMpIHtcbiAgICAgIHRoaXMuX3RvdGFsUGFnZXMgPSB0aGlzLl9yZWNvcmRDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0czogRmluZE1hbnlPcHRpb25zPE0+ID0gT2JqZWN0LmFzc2lnbihzdGF0ZW1lbnQsIHtcbiAgICAgIHNraXA6ICh0aGlzLmN1cnJlbnQgfHwgMCkgKiB0aGlzLnNpemUsXG4gICAgICB0YWtlOiB0aGlzLnNpemUsXG4gICAgfSk7XG5cbiAgICAvLyB0aGlzLnZhbGlkYXRlUGFnZShwYWdlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVwby5maW5kQW5kQ291bnQob3B0cyk7XG5cbiAgICB0aGlzLl9yZWNvcmRDb3VudCA9IHJlc3VsdFsxXTtcbiAgICB0aGlzLl90b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuX3JlY29yZENvdW50IC8gdGhpcy5zaXplKTtcblxuICAgIGlmICghdGhpcy5jbGF6eikgdGhyb3cgbmV3IFBhZ2luZ0Vycm9yKFwiTm8gc3RhdGVtZW50IHRhcmdldCBkZWZpbmVkXCIpO1xuXG4gICAgY29uc3QgcGtEZWYgPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy5jbGF6eigpKTtcbiAgICBjb25zdCByb3dzID0gcmVzdWx0WzBdIHx8IFtdO1xuXG4gICAgY29uc3QgcmVzdWx0cyA9XG4gICAgICAvLyBzdGF0ZW1lbnQuY29sdW1ucyAmJiBzdGF0ZW1lbnQuY29sdW1ucy5sZW5ndGhcbiAgICAgIC8vICAgPyByb3dzIC8vIGhhcyBjb2x1bW5zIG1lYW5zIGl0J3Mgbm90IGZ1bGwgbW9kZWxcbiAgICAgIHJvd3MubWFwKChyb3c6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyb3csIHRoaXMuY2xhenosIHBrRGVmLmlkLCByb3dbcGtEZWYuaWRdKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5fY3VycmVudFBhZ2UgPSBwYWdlO1xuICAgIHJldHVybiByZXN1bHRzIGFzIHVua25vd24gYXMgUltdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBHcm91cE9wZXJhdG9yLCBPcGVyYXRvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUdyb3VwT3BlcmF0b3IsIFR5cGVPUk1PcGVyYXRvciB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgUXVlcnlFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgU1FMT3BlcmF0b3IgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRlcyBjb3JlIG9wZXJhdG9ycyB0byBUeXBlT1JNIFNRTCBvcGVyYXRvcnMuXG4gKiBAc3VtbWFyeSBDb252ZXJ0cyBEZWNhZi50cyBjb3JlIG9wZXJhdG9ycyB0byB0aGVpciBlcXVpdmFsZW50IFNRTCBvcGVyYXRvcnMgdXNlZCBieSB0aGUgVHlwZU9STSBhZGFwdGVyLlxuICogQHBhcmFtIHtHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3J9IG9wZXJhdG9yIFRoZSBjb3JlIG9wZXJhdG9yIHRvIHRyYW5zbGF0ZS5cbiAqIEByZXR1cm4ge1NRTE9wZXJhdG9yIHwgc3RyaW5nfSBUaGUgZXF1aXZhbGVudCBTUUwgb3BlcmF0b3IuXG4gKiBAdGhyb3dzIHtRdWVyeUVycm9yfSBJZiBubyB0cmFuc2xhdGlvbiBleGlzdHMgZm9yIHRoZSBnaXZlbiBvcGVyYXRvci5cbiAqIEBmdW5jdGlvbiB0cmFuc2xhdGVPcGVyYXRvcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICogICBwYXJ0aWNpcGFudCBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgcGFydGljaXBhbnQgUG9zdGdyZVNRTEdyb3VwT3BlcmF0b3JcbiAqXG4gKiAgIENhbGxlci0+PnRyYW5zbGF0ZU9wZXJhdG9yczogb3BlcmF0b3JcbiAqXG4gKiAgIHRyYW5zbGF0ZU9wZXJhdG9ycy0+PlBvc3RncmVTUUxPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgIGFsdCBGb3VuZCBpbiBQb3N0Z3JlU1FMT3BlcmF0b3JcbiAqICAgICBQb3N0Z3JlU1FMT3BlcmF0b3ItLT4+dHJhbnNsYXRlT3BlcmF0b3JzOiBSZXR1cm4gbWF0Y2hpbmcgb3BlcmF0b3JcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBSZXR1cm4gU1FMT3BlcmF0b3JcbiAqICAgZWxzZSBOb3QgZm91bmRcbiAqICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtPj5Qb3N0Z3JlU1FMR3JvdXBPcGVyYXRvcjogQ2hlY2sgZm9yIG1hdGNoXG4gKiAgICAgYWx0IEZvdW5kIGluIFBvc3RncmVTUUxHcm91cE9wZXJhdG9yXG4gKiAgICAgICBQb3N0Z3JlU1FMR3JvdXBPcGVyYXRvci0tPj50cmFuc2xhdGVPcGVyYXRvcnM6IFJldHVybiBtYXRjaGluZyBvcGVyYXRvclxuICogICAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PkNhbGxlcjogUmV0dXJuIHN0cmluZ1xuICogICAgIGVsc2UgTm90IGZvdW5kXG4gKiAgICAgICB0cmFuc2xhdGVPcGVyYXRvcnMtLT4+Q2FsbGVyOiBUaHJvdyBRdWVyeUVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlT3BlcmF0b3JzKFxuICBvcGVyYXRvcjogR3JvdXBPcGVyYXRvciB8IE9wZXJhdG9yXG4pOiBTUUxPcGVyYXRvciB8IHN0cmluZyB7XG4gIGZvciAoY29uc3Qgb3BlcmF0b3JzIG9mIFtUeXBlT1JNT3BlcmF0b3IsIFR5cGVPUk1Hcm91cE9wZXJhdG9yXSkge1xuICAgIGNvbnN0IGVsID0gT2JqZWN0LmtleXMob3BlcmF0b3JzKS5maW5kKChrKSA9PiBrID09PSBvcGVyYXRvcik7XG4gICAgaWYgKGVsKSByZXR1cm4gb3BlcmF0b3JzW2VsXTtcbiAgfVxuICB0aHJvdyBuZXcgUXVlcnlFcnJvcihcbiAgICBgQ291bGQgbm90IGZpbmQgYWRhcHRlciB0cmFuc2xhdGlvbiBmb3Igb3BlcmF0b3IgJHtvcGVyYXRvcn1gXG4gICk7XG59XG4iLCJpbXBvcnQge1xuICBDb25kaXRpb24sXG4gIEdyb3VwT3BlcmF0b3IsXG4gIE9wZXJhdG9yLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGFnaW5hdG9yLFxuICBSZXBvc2l0b3J5LFxuICBTdGF0ZW1lbnQsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IHRyYW5zbGF0ZU9wZXJhdG9ycyB9IGZyb20gXCIuL3RyYW5zbGF0ZVwiO1xuaW1wb3J0IHsgVHlwZU9STVF1ZXJ5TGltaXQgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IFR5cGVPUk1QYWdpbmF0b3IgfSBmcm9tIFwiLi9QYWdpbmF0b3JcIjtcbmltcG9ydCB7IGZpbmRQcmltYXJ5S2V5LCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4uL1R5cGVPUk1BZGFwdGVyXCI7XG5pbXBvcnQgeyBGaW5kTWFueU9wdGlvbnMsIFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBGaW5kT3B0aW9uc1doZXJlIH0gZnJvbSBcInR5cGVvcm0vZmluZC1vcHRpb25zL0ZpbmRPcHRpb25zV2hlcmVcIjtcbmltcG9ydCB7IEZpbmRPcHRpb25zT3JkZXIgfSBmcm9tIFwidHlwZW9ybS9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNPcmRlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGF0ZW1lbnQgYnVpbGRlciBmb3IgVHlwZU9STS1iYWNrZWQgcXVlcmllcy5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgZmx1ZW50IGludGVyZmFjZSBmb3IgYnVpbGRpbmcgU1FMIHF1ZXJpZXMgdmlhIFR5cGVPUk0ncyBTZWxlY3RRdWVyeUJ1aWxkZXIgd2l0aCB0eXBlIHNhZmV0eSBhbmQgRGVjYWYudHMgYWJzdHJhY3Rpb25zLlxuICogQHRlbXBsYXRlIE0gVGhlIG1vZGVsIHR5cGUgdGhhdCBleHRlbmRzIE1vZGVsLlxuICogQHRlbXBsYXRlIFIgVGhlIHJlc3VsdCB0eXBlIHJldHVybmVkIGZyb20gZXhlY3V0aW9uLlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyLlxuICogQGNsYXNzIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIEBleGFtcGxlXG4gKiAvLyBFeGFtcGxlIHVzaW5nIFR5cGVPUk1TdGF0ZW1lbnRcbiAqIGNvbnN0IHN0YXRlbWVudCA9IG5ldyBUeXBlT1JNU3RhdGVtZW50PFVzZXIsIFVzZXJbXT4oYWRhcHRlcik7XG4gKiBjb25zdCB1c2VycyA9IGF3YWl0IHN0YXRlbWVudFxuICogICAuZnJvbShVc2VyKVxuICogICAud2hlcmUoQ29uZGl0aW9uLmF0dHJpYnV0ZTxVc2VyPignYWdlJykuZ3QoMTgpKVxuICogICAub3JkZXJCeSgnbGFzdE5hbWUnLCAnYXNjJylcbiAqICAgLmxpbWl0KDEwKVxuICogICAuZXhlY3V0ZSgpO1xuICovXG5leHBvcnQgY2xhc3MgVHlwZU9STVN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWwsIFI+IGV4dGVuZHMgU3RhdGVtZW50PFxuICBUeXBlT1JNUXVlcnk8TT4sXG4gIE0sXG4gIFJcbj4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYWRhcHRlciE6IFR5cGVPUk1BZGFwdGVyO1xuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IFR5cGVPUk1BZGFwdGVyKSB7XG4gICAgc3VwZXIoYWRhcHRlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkcyBhIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGZyb20gdGhlIHN0YXRlbWVudC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgdGhlIHN0YXRlbWVudCdzIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgYW5kIG9wdGlvbnMgaW50byBhIFR5cGVPUk0tYmFja2VkIHF1ZXJ5IG9iamVjdC5cbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgYnVpbHQgVHlwZU9STSBxdWVyeSBjb250YWluZXIuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSBhcmUgaW52YWxpZCBxdWVyeSBjb25kaXRpb25zLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBTdGF0ZW1lbnRcbiAgICogICBwYXJ0aWNpcGFudCBSZXBvc2l0b3J5XG4gICAqICAgcGFydGljaXBhbnQgcGFyc2VDb25kaXRpb25cbiAgICpcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IGJ1aWxkKClcbiAgICogICBOb3RlIG92ZXIgU3RhdGVtZW50OiBJbml0aWFsaXplIHF1ZXJ5XG4gICAqICAgU3RhdGVtZW50LT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAgICogICBSZXBvc2l0b3J5LS0+PlN0YXRlbWVudDogUmV0dXJuIHRhYmxlIG5hbWVcbiAgICogICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IENyZWF0ZSBiYXNlIHF1ZXJ5XG4gICAqXG4gICAqICAgYWx0IEhhcyBzZWxlY3RTZWxlY3RvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29sdW1ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgd2hlcmVDb25kaXRpb25cbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbWJpbmVkIGNvbmRpdGlvbiB3aXRoIHRhYmxlXG4gICAqICAgICBTdGF0ZW1lbnQtPj5wYXJzZUNvbmRpdGlvbjogUGFyc2UgY29uZGl0aW9uXG4gICAqICAgICBwYXJzZUNvbmRpdGlvbi0tPj5TdGF0ZW1lbnQ6IFJldHVybiBwYXJzZWQgY29uZGl0aW9uc1xuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgY29uZGl0aW9ucyB0byBxdWVyeVxuICAgKiAgIGVuZFxuICAgKlxuICAgKiAgIGFsdCBIYXMgb3JkZXJCeVNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IEFkZCBvcmRlckJ5IHRvIHF1ZXJ5XG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgYWx0IEhhcyBsaW1pdFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBsaW1pdFxuICAgKiAgIGVsc2VcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogVXNlIGRlZmF1bHQgbGltaXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBhbHQgSGFzIG9mZnNldFNlbGVjdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IFNldCBvZmZzZXRcbiAgICogICBlbmRcbiAgICpcbiAgICogICBTdGF0ZW1lbnQtLT4+U3RhdGVtZW50OiBSZXR1cm4gcXVlcnlcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZCgpOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKHRoaXMuZnJvbVNlbGVjdG9yKTtcbiAgICBjb25zdCBtID0gbmV3IHRoaXMuZnJvbVNlbGVjdG9yKCk7XG5cbiAgICBjb25zdCBxOiBUeXBlT1JNUXVlcnk8TSwgU2VsZWN0UXVlcnlCdWlsZGVyPE0+PiA9IHtcbiAgICAgIHF1ZXJ5OiB0aGlzLmFkYXB0ZXIuZGF0YVNvdXJjZVxuICAgICAgICAuZ2V0UmVwb3NpdG9yeShcbiAgICAgICAgICB0aGlzLmZyb21TZWxlY3RvcltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmZyb21TZWxlY3Rvcl1cbiAgICAgICAgKVxuICAgICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKHRhYmxlTmFtZSkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+LFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5zZWxlY3RTZWxlY3RvcilcbiAgICAgIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdChcbiAgICAgICAgdGhpcy5zZWxlY3RTZWxlY3Rvci5tYXAoKHMpID0+IGAke3RhYmxlTmFtZX0uJHtzIGFzIHN0cmluZ31gKVxuICAgICAgKTtcbiAgICBlbHNlIHEucXVlcnkgPSBxLnF1ZXJ5LnNlbGVjdCgpO1xuICAgIC8vXG4gICAgLy8gcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5mcm9tKFxuICAgIC8vICAgdGhpcy5mcm9tU2VsZWN0b3JbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgdGhpcy5mcm9tU2VsZWN0b3JdLFxuICAgIC8vICAgdGFibGVOYW1lXG4gICAgLy8gKTtcblxuICAgIGlmICh0aGlzLndoZXJlQ29uZGl0aW9uKVxuICAgICAgcS5xdWVyeSA9IHRoaXMucGFyc2VDb25kaXRpb24oXG4gICAgICAgIHRoaXMud2hlcmVDb25kaXRpb24sXG4gICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgcS5xdWVyeSBhcyBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PlxuICAgICAgKS5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcblxuICAgIGxldCBvcmRlckJ5QXJnczogW3N0cmluZywgXCJERVNDXCIgfCBcIkFTQ1wiXTtcbiAgICBpZiAoIXRoaXMub3JkZXJCeVNlbGVjdG9yKVxuICAgICAgb3JkZXJCeUFyZ3MgPSBbXG4gICAgICAgIGAke3RhYmxlTmFtZX0uJHtmaW5kUHJpbWFyeUtleShtKS5pZCBhcyBzdHJpbmd9YCxcbiAgICAgICAgT3JkZXJEaXJlY3Rpb24uQVNDLnRvVXBwZXJDYXNlKCkgYXMgXCJBU0NcIixcbiAgICAgIF07XG4gICAgZWxzZVxuICAgICAgb3JkZXJCeUFyZ3MgPSBbXG4gICAgICAgIGAke3RhYmxlTmFtZX0uJHt0aGlzLm9yZGVyQnlTZWxlY3RvclswXSBhcyBzdHJpbmd9YCxcbiAgICAgICAgdGhpcy5vcmRlckJ5U2VsZWN0b3JbMV0udG9VcHBlckNhc2UoKSBhcyBcIkRFU0NcIiB8IFwiQVNDXCIsXG4gICAgICBdO1xuXG4gICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5vcmRlckJ5KC4uLm9yZGVyQnlBcmdzKTtcbiAgICBpZiAodGhpcy5saW1pdFNlbGVjdG9yKSB7XG4gICAgICBxLnF1ZXJ5ID0gKHEucXVlcnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLmxpbWl0KHRoaXMubGltaXRTZWxlY3Rvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYE5vIGxpbWl0IHNlbGVjdG9yIGRlZmluZWQuIFVzaW5nIGRlZmF1bHQgbGltaXQgb2YgJHtUeXBlT1JNUXVlcnlMaW1pdH1gXG4gICAgICApO1xuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5saW1pdChUeXBlT1JNUXVlcnlMaW1pdCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG9mZnNldFxuICAgIGlmICh0aGlzLm9mZnNldFNlbGVjdG9yKVxuICAgICAgcS5xdWVyeSA9IChxLnF1ZXJ5IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KS5za2lwKHRoaXMub2Zmc2V0U2VsZWN0b3IpO1xuXG4gICAgcmV0dXJuIHEgYXMgYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgcGFnaW5hdG9yIGZvciB0aGUgc3RhdGVtZW50LlxuICAgKiBAc3VtbWFyeSBCdWlsZHMgdGhlIHF1ZXJ5IGFuZCByZXR1cm5zIGEgVHlwZU9STVBhZ2luYXRvciBmb3IgcGFnaW5hdGVkIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgVGhlIHBhZ2Ugc2l6ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxQYWdpbmF0b3I8TSwgUiwgVHlwZU9STVF1ZXJ5Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgcGFnaW5hdG9yLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGVyZSdzIGFuIGVycm9yIGJ1aWxkaW5nIHRoZSBxdWVyeS5cbiAgICovXG4gIGFzeW5jIHBhZ2luYXRlPFI+KHNpemU6IG51bWJlcik6IFByb21pc2U8UGFnaW5hdG9yPE0sIFIsIFR5cGVPUk1RdWVyeT4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnk6IFR5cGVPUk1RdWVyeSA9IHRoaXMuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUXVlcnk6IEZpbmRNYW55T3B0aW9uczxNPiA9IHt9O1xuICAgICAgY29uc3QgYSA9IHF1ZXJ5LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+O1xuICAgICAgaWYgKHRoaXMud2hlcmVDb25kaXRpb24pXG4gICAgICAgIHRyYW5zZm9ybWVkUXVlcnkud2hlcmUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uRm9yUGFnaW5hdGlvbihcbiAgICAgICAgICB0aGlzLndoZXJlQ29uZGl0aW9uLFxuICAgICAgICAgIFJlcG9zaXRvcnkudGFibGUodGhpcy5mcm9tU2VsZWN0b3IpXG4gICAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLm9yZGVyQnlTZWxlY3RvcilcbiAgICAgICAgdHJhbnNmb3JtZWRRdWVyeS5vcmRlciA9IHtcbiAgICAgICAgICBbdGhpcy5vcmRlckJ5U2VsZWN0b3JbMF1dOiB0aGlzLm9yZGVyQnlTZWxlY3RvclsxXS50b1N0cmluZygpLFxuICAgICAgICB9IGFzIGFueTtcblxuICAgICAgcmV0dXJuIG5ldyBUeXBlT1JNUGFnaW5hdG9yKFxuICAgICAgICB0aGlzLmFkYXB0ZXIgYXMgYW55LFxuICAgICAgICB0cmFuc2Zvcm1lZFF1ZXJ5IGFzIGFueSxcbiAgICAgICAgc2l6ZSxcbiAgICAgICAgdGhpcy5mcm9tU2VsZWN0b3JcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBhIHJlY29yZC5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSByYXcgcmVzdWx0IHJvdyB0byBhIG1vZGVsIGluc3RhbmNlIHVzaW5nIHRoZSBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge2FueX0gciBUaGUgcmF3IHJlY29yZC5cbiAgICogQHBhcmFtIHtrZXlvZiBNfSBwa0F0dHIgVGhlIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBvZiB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSB7XCJOdW1iZXJcIiB8IFwiQmlnSW50XCIgfCB1bmRlZmluZWR9IHNlcXVlbmNlVHlwZSBUaGUgdHlwZSBvZiB0aGUgc2VxdWVuY2UuXG4gICAqIEByZXR1cm4ge2FueX0gVGhlIHByb2Nlc3NlZCByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NSZWNvcmQocjogYW55LCBwa0F0dHI6IGtleW9mIE0pIHtcbiAgICBpZiAodHlwZW9mIHJbcGtBdHRyXSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5mcm9tU2VsZWN0b3IsIHBrQXR0ciwgcltwa0F0dHJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgcmF3IFR5cGVPUk0gcXVlcnkgYnVpbGRlci5cbiAgICogQHN1bW1hcnkgU2VuZHMgdGhlIGJ1aWx0IFNlbGVjdFF1ZXJ5QnVpbGRlciB0byB0aGUgZGF0YWJhc2UgdmlhIFR5cGVPUk0gYW5kIHJldHVybnMgdGhlIHJlc3VsdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIFRoZSByZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHJhd0lucHV0IFRoZSBxdWVyeSBjb250YWluZXIgdG8gZXhlY3V0ZS5cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IFR5cGVPUk1RdWVyeTxNPik6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnJhdyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYEV4ZWN1dGluZyByYXcgcXVlcnk6ICR7KHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+KS5nZXRTcWwoKX1gXG4gICAgKTtcbiAgICByZXR1cm4gKGF3YWl0IChcbiAgICAgIHJhd0lucHV0LnF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPE0+XG4gICAgKS5nZXRNYW55KCkpIGFzIFI7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFyc2VDb25kaXRpb25Gb3JQYWdpbmF0aW9uKFxuICAgIGNvbmRpdGlvbjogQ29uZGl0aW9uPE0+LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGNvdW50ZXIgPSAwLFxuICAgIGNvbmRpdGlvbmFsT3A/OiBHcm91cE9wZXJhdG9yIHwgT3BlcmF0b3JcbiAgKTogRmluZE9wdGlvbnNXaGVyZTxNPltdIHwgRmluZE9wdGlvbnNXaGVyZTxNPiB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBhIGNvbmRpdGlvbiBpbnRvIFBvc3RncmVTUUwgY29uZGl0aW9uc1xuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBhIENvbmRpdGlvbiBvYmplY3QgaW50byBQb3N0Z3JlU1FMIGNvbmRpdGlvbiBzdHJ1Y3R1cmVzXG4gICAqIEBwYXJhbSB7Q29uZGl0aW9uPE0+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFibGVOYW1lXSAtIHRoZSBwb3NpdGlvbmFsIGluZGV4IG9mIHRoZSBhcmd1bWVudHNcbiAgICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBUaGUgUG9zdGdyZXNTUUwgY29uZGl0aW9uXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFN0YXRlbWVudFxuICAgKiAgIHBhcnRpY2lwYW50IHRyYW5zbGF0ZU9wZXJhdG9yc1xuICAgKiAgIHBhcnRpY2lwYW50IHBhcnNlQ29uZGl0aW9uXG4gICAqXG4gICAqICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihjb25kaXRpb24pXG4gICAqXG4gICAqICAgTm90ZSBvdmVyIFN0YXRlbWVudDogRXh0cmFjdCBjb25kaXRpb24gcGFydHNcbiAgICpcbiAgICogICBhbHQgU2ltcGxlIGNvbXBhcmlzb24gb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PnRyYW5zbGF0ZU9wZXJhdG9yczogdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKVxuICAgKiAgICAgdHJhbnNsYXRlT3BlcmF0b3JzLS0+PlN0YXRlbWVudDogUmV0dXJuIFBvc3RncmVTUUwgb3BlcmF0b3JcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ3JlYXRlIGNvbmRpdGlvbiB3aXRoIGNvbHVtbiwgb3BlcmF0b3IsIGFuZCB2YWx1ZVxuICAgKiAgIGVsc2UgTk9UIG9wZXJhdG9yXG4gICAqICAgICBTdGF0ZW1lbnQtPj5TdGF0ZW1lbnQ6IHBhcnNlQ29uZGl0aW9uKGF0dHIxKVxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBBZGQgTk9UIHRvIGNvbmRpdGlvbnNcbiAgICogICBlbHNlIEFORC9PUiBvcGVyYXRvclxuICAgKiAgICAgU3RhdGVtZW50LT4+U3RhdGVtZW50OiBwYXJzZUNvbmRpdGlvbihhdHRyMSlcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogcGFyc2VDb25kaXRpb24oY29tcGFyaXNvbilcbiAgICogICAgIFN0YXRlbWVudC0+PlN0YXRlbWVudDogQ29tYmluZSBjb25kaXRpb25zIHdpdGggQU5EL09SXG4gICAqICAgZW5kXG4gICAqXG4gICAqICAgU3RhdGVtZW50LS0+PlN0YXRlbWVudDogUmV0dXJuIGNvbmRpdGlvbnMgYXJyYXlcbiAgICovXG4gIHByb3RlY3RlZCBwYXJzZUNvbmRpdGlvbihcbiAgICBjb25kaXRpb246IENvbmRpdGlvbjxNPixcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgY291bnRlciA9IDAsXG4gICAgY29uZGl0aW9uYWxPcD86IEdyb3VwT3BlcmF0b3IgfCBPcGVyYXRvclxuICApOiBUeXBlT1JNUXVlcnk8TT4ge1xuICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICBhdHRyMTogc3RyaW5nIHwgQ29uZGl0aW9uPE0+O1xuICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yIHwgR3JvdXBPcGVyYXRvcjtcbiAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcGFyc2UoKTogVHlwZU9STVF1ZXJ5PE0+IHtcbiAgICAgIGNvbnN0IHNxbE9wZXJhdG9yID0gdHJhbnNsYXRlT3BlcmF0b3JzKG9wZXJhdG9yKTtcbiAgICAgIGNvbnN0IGF0dHJSZWYgPSBgJHthdHRyMX0ke2NvdW50ZXJ9YDtcbiAgICAgIGNvbnN0IHF1ZXJ5U3RyID0gYCR7dGFibGVOYW1lfS4ke2F0dHIxfSAke3NxbE9wZXJhdG9yfSA6JHthdHRyUmVmfWA7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgIFthdHRyUmVmXTogY29tcGFyaXNvbixcbiAgICAgIH07XG4gICAgICBzd2l0Y2ggKGNvbmRpdGlvbmFsT3ApIHtcbiAgICAgICAgY2FzZSBHcm91cE9wZXJhdG9yLkFORDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVlcnk6IHFiLmFuZFdoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIEdyb3VwT3BlcmF0b3IuT1I6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxYi5vcldoZXJlKHF1ZXJ5U3RyLCB2YWx1ZXMpIGFzIGFueSxcbiAgICAgICAgICB9O1xuICAgICAgICBjYXNlIE9wZXJhdG9yLk5PVDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1Qgb3BlcmF0b3Igbm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdWVyeTogcWIud2hlcmUocXVlcnlTdHIsIHZhbHVlcykgYXMgYW55LFxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgIG9wZXJhdG9yIGFzIEdyb3VwT3BlcmF0b3JcbiAgICAgICkgPT09IC0xXG4gICAgKSB7XG4gICAgICByZXR1cm4gcGFyc2UoKTtcbiAgICB9XG4gICAgLy8gRm9yIE5PVCBvcGVyYXRvclxuICAgIGVsc2UgaWYgKG9wZXJhdG9yID09PSBPcGVyYXRvci5OT1QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVCBvcGVyYXRvciBub3QgaW1wbGVtZW50ZWRcIik7XG4gICAgfVxuICAgIC8vIEZvciBBTkQvT1Igb3BlcmF0b3JzXG4gICAgZWxzZSB7XG4gICAgICBxYiA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uPE0+LCB0YWJsZU5hbWUsIHFiLCArK2NvdW50ZXIpXG4gICAgICAgIC5xdWVyeSBhcyB1bmtub3duIGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxNPjtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICBjb21wYXJpc29uLFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHFiLFxuICAgICAgICArK2NvdW50ZXIsXG4gICAgICAgIG9wZXJhdG9yXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgTm90Rm91bmRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU2VxdWVuY2VPcHRpb25zIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBTZXF1ZW5jZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi4vVHlwZU9STUFkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBkYXRhYmFzZSBzZXF1ZW5jZSBmb3IgVHlwZU9STS5cbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IGZvciB7QGxpbmsgU2VxdWVuY2V9cywgZGVsZWdhdGluZyB0byB0aGUge0BsaW5rIFR5cGVPUk1BZGFwdGVyfSB0byBmZXRjaCBhbmQgaW5jcmVtZW50IHZhbHVlcyB3aGlsZSBoYW5kbGluZyB0eXBlIHBhcnNpbmcgYW5kIGVycm9yIHRyYW5zbGF0aW9uLlxuICogQHBhcmFtIHtTZXF1ZW5jZU9wdGlvbnN9IG9wdGlvbnMgVGhlIHNlcXVlbmNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAobmFtZSwgdHlwZSwgc3RhcnRXaXRoLCBpbmNyZW1lbnRCeSwgZXRjLikuXG4gKiBAcGFyYW0ge1R5cGVPUk1BZGFwdGVyfSBhZGFwdGVyIFRoZSBUeXBlT1JNIGFkYXB0ZXIgdXNlZCB0byBleGVjdXRlIHNlcXVlbmNlIG9wZXJhdGlvbnMuXG4gKiBAY2xhc3MgVHlwZU9STVNlcXVlbmNlXG4gKiBAaW1wbGVtZW50cyBTZXF1ZW5jZVxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhbmQgdXNlIGEgVHlwZU9STS1iYWNrZWQgc2VxdWVuY2VcbiAqIGNvbnN0IHNlcSA9IG5ldyBUeXBlT1JNU2VxdWVuY2UoeyBuYW1lOiBcInVzZXJfaWRfc2VxXCIsIHR5cGU6IFwiTnVtYmVyXCIsIHN0YXJ0V2l0aDogMSwgaW5jcmVtZW50Qnk6IDEgfSwgYWRhcHRlcik7XG4gKiBjb25zdCBuZXh0SWQgPSBhd2FpdCBzZXEubmV4dCgpO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFNlcSBhcyBUeXBlT1JNU2VxdWVuY2VcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBEQiBhcyBEYXRhYmFzZVxuICogICBBcHAtPj5TZXE6IG5leHQoKVxuICogICBTZXEtPj5TZXE6IGN1cnJlbnQoKVxuICogICBTZXEtPj5BZGFwdGVyOiByYXcoU0VMRUNUIGN1cnJlbnRfdmFsdWUgLi4uKVxuICogICBBZGFwdGVyLT4+REI6IFF1ZXJ5IGN1cnJlbnQgdmFsdWVcbiAqICAgREItLT4+QWRhcHRlcjogY3VycmVudF92YWx1ZVxuICogICBBZGFwdGVyLS0+PlNlcTogdmFsdWVcbiAqICAgU2VxLT4+U2VxOiBpbmNyZW1lbnQoY3VycmVudClcbiAqICAgU2VxLT4+QWRhcHRlcjogcmF3KG5leHR2YWwobmFtZSkpXG4gKiAgIEFkYXB0ZXItPj5EQjogbmV4dHZhbCgpXG4gKiAgIERCLS0+PkFkYXB0ZXI6IG5leHQgdmFsdWVcbiAqICAgQWRhcHRlci0tPj5TZXE6IHZhbHVlXG4gKiAgIFNlcS0tPj5BcHA6IHBhcnNlZCBuZXh0IHZhbHVlXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNU2VxdWVuY2UgZXh0ZW5kcyBTZXF1ZW5jZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyxcbiAgICBwcm90ZWN0ZWQgYWRhcHRlcjogVHlwZU9STUFkYXB0ZXJcbiAgKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgYXN5bmMgY3VycmVudCgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXE6IGFueSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYFNFTEVDVCBjdXJyZW50X3ZhbHVlIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnNlcXVlbmNlcyBXSEVSRSBzZXF1ZW5jZV9uYW1lID0gJDFgLFxuICAgICAgICB2YWx1ZXM6IFtuYW1lXSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2Uoc2VxLmN1cnJlbnRfdmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLmFkYXB0ZXIucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUGFyc2VzIHRoZSB7QGxpbmsgU2VxdWVuY2V9IHZhbHVlXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIHBhcnNlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQge1xuICAgIHJldHVybiBTZXF1ZW5jZS5wYXJzZVZhbHVlKHRoaXMub3B0aW9ucy50eXBlLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgaW5jcmVtZW50cyB0aGUgc2VxdWVuY2VcbiAgICogQGRlc2NyaXB0aW9uIFNlcXVlbmNlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50fSBjdXJyZW50XG4gICAqIEBwYXJhbSBjb3VudFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluY3JlbWVudChcbiAgICBjdXJyZW50OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQsXG4gICAgY291bnQ/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+IHtcbiAgICBjb25zdCB7IHR5cGUsIGluY3JlbWVudEJ5LCBuYW1lLCBzdGFydFdpdGggfSA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAodHlwZSAhPT0gXCJOdW1iZXJcIiAmJiB0eXBlICE9PSBcIkJpZ0ludFwiKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgaW5jcmVtZW50IHNlcXVlbmNlIG9mIHR5cGUgJHt0eXBlfSB3aXRoICR7Y291bnR9YFxuICAgICAgKTtcbiAgICBsZXQgbmV4dDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICAgIHRyeSB7XG4gICAgICBuZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJhdyh7XG4gICAgICAgIHF1ZXJ5OiBgU0VMRUNUIG5leHR2YWwoJDEpO2AsXG4gICAgICAgIHZhbHVlczogW25hbWVdLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIE5vdEZvdW5kRXJyb3IpKSB0aHJvdyBlO1xuICAgICAgbmV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5yYXcoe1xuICAgICAgICBxdWVyeTogYENSRUFURSBTRVFVRU5DRSBJRiBOT1QgRVhJU1RTICQxIFNUQVJUIFdJVEggJDIgSU5DUkVNRU5UIEJZICQzIE5PIENZQ0xFO2AsXG4gICAgICAgIHZhbHVlczogW25hbWUsIHN0YXJ0V2l0aCwgaW5jcmVtZW50QnldLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQgYXMgc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyB0aGUgbmV4dCB2YWx1ZSBpbiB0aCBzZXF1ZW5jZVxuICAgKiBAZGVzY3JpcHRpb24gY2FsbHMge0BsaW5rIFNlcXVlbmNlI3BhcnNlfSBvbiB0aGUgY3VycmVudCB2YWx1ZVxuICAgKiBmb2xsb3dlZCBieSB7QGxpbmsgU2VxdWVuY2UjaW5jcmVtZW50fVxuICAgKlxuICAgKi9cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPG51bWJlciB8IHN0cmluZyB8IGJpZ2ludD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCB0aGlzLmN1cnJlbnQoKTtcbiAgICByZXR1cm4gdGhpcy5pbmNyZW1lbnQoY3VycmVudCk7XG4gIH1cblxuICBhc3luYyByYW5nZShjb3VudDogbnVtYmVyKTogUHJvbWlzZTwobnVtYmVyIHwgc3RyaW5nIHwgYmlnaW50KVtdPiB7XG4gICAgY29uc3QgY3VycmVudCA9IChhd2FpdCB0aGlzLmN1cnJlbnQoKSkgYXMgbnVtYmVyO1xuICAgIGNvbnN0IGluY3JlbWVudEJ5ID0gdGhpcy5wYXJzZSh0aGlzLm9wdGlvbnMuaW5jcmVtZW50QnkpIGFzIG51bWJlcjtcbiAgICBjb25zdCBuZXh0OiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQgPSBhd2FpdCB0aGlzLmluY3JlbWVudChcbiAgICAgIGN1cnJlbnQsXG4gICAgICAodGhpcy5wYXJzZShjb3VudCkgYXMgbnVtYmVyKSAqIGluY3JlbWVudEJ5XG4gICAgKTtcbiAgICBjb25zdCByYW5nZTogKG51bWJlciB8IHN0cmluZyB8IGJpZ2ludClbXSA9IFtdO1xuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gY291bnQ7IGkrKykge1xuICAgICAgcmFuZ2UucHVzaChjdXJyZW50ICsgaW5jcmVtZW50QnkgKiAodGhpcy5wYXJzZShpKSBhcyBudW1iZXIpKTtcbiAgICB9XG4gICAgaWYgKHJhbmdlW3JhbmdlLmxlbmd0aCAtIDFdICE9PSBuZXh0KVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNaXNjYWxjdWxhdGlvbiBvZiByYW5nZVwiKTtcbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluZGV4TWV0YWRhdGEsXG4gIE9yZGVyRGlyZWN0aW9uLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlcG9zaXRvcnksXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVHlwZU9STUtleXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBEZWZhdWx0U2VwYXJhdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNUXVlcnkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgbmFtZSBmb3IgYSBDb3VjaERCIGluZGV4XG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIG5hbWUgZm9yIGEgQ291Y2hEQiBpbmRleCBieSBjb21iaW5pbmcgbmFtZSBwYXJ0cywgY29tcG9zaXRpb25zLCBhbmQgZGlyZWN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lIC0gQXJyYXkgb2YgbmFtZSBwYXJ0cyBmb3IgdGhlIGluZGV4XG4gKiBAcGFyYW0ge09yZGVyRGlyZWN0aW9ufSBbZGlyZWN0aW9uXSAtIE9wdGlvbmFsIHNvcnQgZGlyZWN0aW9uIGZvciB0aGUgaW5kZXhcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtjb21wb3NpdGlvbnNdIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRvIGluY2x1ZGUgaW4gdGhlIGluZGV4IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc2VwYXJhdG9yPURlZmF1bHRTZXBhcmF0b3JdIC0gVGhlIHNlcGFyYXRvciB0byB1c2UgYmV0d2VlbiBwYXJ0cyBvZiB0aGUgaW5kZXggbmFtZVxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZ2VuZXJhdGVkIGluZGV4IG5hbWVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLWNvdWNoZGJcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVJbmRleE5hbWUoXG4gIG5hbWU6IHN0cmluZ1tdLFxuICBkaXJlY3Rpb24/OiBPcmRlckRpcmVjdGlvbixcbiAgY29tcG9zaXRpb25zPzogc3RyaW5nW10sXG4gIHNlcGFyYXRvciA9IERlZmF1bHRTZXBhcmF0b3Jcbikge1xuICByZXR1cm4gW1xuICAgIC4uLm5hbWUubWFwKChuKSA9PiAobiA9PT0gVHlwZU9STUtleXMuVEFCTEUgPyBcInRhYmxlXCIgOiBuKSksXG4gICAgLi4uKGNvbXBvc2l0aW9ucyB8fCBbXSksXG4gICAgLi4uKGRpcmVjdGlvbiA/IFtkaXJlY3Rpb25dIDogW10pLFxuICAgIFR5cGVPUk1LZXlzLklOREVYLFxuICBdLmpvaW4oc2VwYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIENvdWNoREIgaW5kZXggY29uZmlndXJhdGlvbnMgZm9yIG1vZGVsc1xuICogQHN1bW1hcnkgQ3JlYXRlcyBhIHNldCBvZiBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zIGJhc2VkIG9uIHRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvdmlkZWQgbW9kZWxzXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIHRoYXQgZXh0ZW5kcyBNb2RlbFxuICogQHBhcmFtIG1vZGVscyAtIEFycmF5IG9mIG1vZGVsIGNvbnN0cnVjdG9ycyB0byBnZW5lcmF0ZSBpbmRleGVzIGZvclxuICogQHJldHVybiB7VHlwZU9STVF1ZXJ5fSBBcnJheSBvZiBDb3VjaERCIGluZGV4IGNvbmZpZ3VyYXRpb25zXG4gKiBAZnVuY3Rpb24gZ2VuZXJhdGVJbmRleGVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1jb3VjaGRiXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZW5lcmF0ZUluZGV4ZXNcbiAqICAgcGFydGljaXBhbnQgZ2VuZXJhdGVJbmRleE5hbWVcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICpcbiAqICAgQ2FsbGVyLT4+Z2VuZXJhdGVJbmRleGVzOiBtb2RlbHNcbiAqXG4gKiAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBiYXNlIHRhYmxlIGluZGV4XG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhOYW1lOiBbQ291Y2hEQktleXMuVEFCTEVdXG4gKiAgIGdlbmVyYXRlSW5kZXhOYW1lLS0+PmdlbmVyYXRlSW5kZXhlczogdGFibGVOYW1lXG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0+PmdlbmVyYXRlSW5kZXhlczogQ3JlYXRlIHRhYmxlIGluZGV4IGNvbmZpZ1xuICpcbiAqICAgbG9vcCBGb3IgZWFjaCBtb2RlbFxuICogICAgIGdlbmVyYXRlSW5kZXhlcy0+PlJlcG9zaXRvcnk6IEdldCBpbmRleGVzIG1ldGFkYXRhXG4gKiAgICAgUmVwb3NpdG9yeS0tPj5nZW5lcmF0ZUluZGV4ZXM6IGluZGV4IG1ldGFkYXRhXG4gKlxuICogICAgIGxvb3AgRm9yIGVhY2ggaW5kZXggaW4gbWV0YWRhdGFcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IEV4dHJhY3QgaW5kZXggcHJvcGVydGllc1xuICogICAgICAgZ2VuZXJhdGVJbmRleGVzLT4+UmVwb3NpdG9yeTogR2V0IHRhYmxlIG5hbWVcbiAqICAgICAgIFJlcG9zaXRvcnktLT4+Z2VuZXJhdGVJbmRleGVzOiB0YWJsZU5hbWVcbiAqXG4gKiAgICAgICBOb3RlIG92ZXIgZ2VuZXJhdGVJbmRleGVzOiBEZWZpbmUgbmVzdGVkIGdlbmVyYXRlIGZ1bmN0aW9uXG4gKlxuICogICAgICAgZ2VuZXJhdGVJbmRleGVzLT4+Z2VuZXJhdGVJbmRleGVzOiBDYWxsIGdlbmVyYXRlKCkgZm9yIGRlZmF1bHQgb3JkZXJcbiAqICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBpbmRleCBuYW1lIGFuZCBjb25maWdcbiAqXG4gKiAgICAgICBhbHQgSGFzIGRpcmVjdGlvbnNcbiAqICAgICAgICAgbG9vcCBGb3IgZWFjaCBkaXJlY3Rpb25cbiAqICAgICAgICAgICBnZW5lcmF0ZUluZGV4ZXMtPj5nZW5lcmF0ZUluZGV4ZXM6IENhbGwgZ2VuZXJhdGUoZGlyZWN0aW9uKVxuICogICAgICAgICAgIE5vdGUgb3ZlciBnZW5lcmF0ZUluZGV4ZXM6IENyZWF0ZSBvcmRlcmVkIGluZGV4IGNvbmZpZ1xuICogICAgICAgICBlbmRcbiAqICAgICAgIGVuZFxuICogICAgIGVuZFxuICogICBlbmRcbiAqXG4gKiAgIGdlbmVyYXRlSW5kZXhlcy0tPj5DYWxsZXI6IEFycmF5IG9mIGluZGV4IGNvbmZpZ3VyYXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUluZGV4ZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWxzOiBDb25zdHJ1Y3RvcjxNPltdXG4pOiBUeXBlT1JNUXVlcnlbXSB7XG4gIGNvbnN0IHRhYmxlTmFtZSA9IGdlbmVyYXRlSW5kZXhOYW1lKFtUeXBlT1JNS2V5cy5UQUJMRV0pO1xuICBjb25zdCBpbmRleGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlT1JNUXVlcnk+ID0ge307XG4gIGluZGV4ZXNbdGFibGVOYW1lXSA9IHtcbiAgICBxdWVyeTogYGAsXG4gICAgdmFsdWVzOiBbXSxcbiAgfTtcblxuICBtb2RlbHMuZm9yRWFjaCgobSkgPT4ge1xuICAgIGNvbnN0IGluZDogUmVjb3JkPHN0cmluZywgSW5kZXhNZXRhZGF0YT4gPSBSZXBvc2l0b3J5LmluZGV4ZXMobSk7XG4gICAgT2JqZWN0LmVudHJpZXMoaW5kKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IGsgPSBPYmplY3Qua2V5cyh2YWx1ZSlbMF07XG5cbiAgICAgIGxldCB7IGNvbXBvc2l0aW9ucyB9ID0gKHZhbHVlIGFzIGFueSlba107XG4gICAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG0pO1xuICAgICAgY29tcG9zaXRpb25zID0gY29tcG9zaXRpb25zIHx8IFtdO1xuXG4gICAgICBmdW5jdGlvbiBnZW5lcmF0ZSgpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtrZXksIC4uLihjb21wb3NpdGlvbnMgYXMgW10pLCBQZXJzaXN0ZW5jZUtleXMuSU5ERVhdLmpvaW4oXG4gICAgICAgICAgRGVmYXVsdFNlcGFyYXRvclxuICAgICAgICApO1xuXG4gICAgICAgIGluZGV4ZXNbbmFtZV0gPSB7XG4gICAgICAgICAgcXVlcnk6IGBDUkVBVEUgSU5ERVggJDEgT04gJDIgKCQzKTtgLFxuICAgICAgICAgIHZhbHVlczogW25hbWUsIHRhYmxlTmFtZSwga2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZ2VuZXJhdGUoKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGluZGV4ZXMpO1xufVxuIiwiaW1wb3J0IHtcbiAgdHlwZSBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSwgdXNlcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgZW5mb3JjZURCRGVjb3JhdG9ycyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1BZGFwdGVyIH0gZnJvbSBcIi4vVHlwZU9STUFkYXB0ZXJcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gYmFja2VkIGJ5IFR5cGVPUk0uXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBDUlVEIG9wZXJhdGlvbnMgZm9yIGEgZ2l2ZW4gTW9kZWwgdXNpbmcgdGhlIHtAbGluayBUeXBlT1JNQWRhcHRlcn0sIGluY2x1ZGluZyBidWxrIG9wZXJhdGlvbnMgYW5kIHF1ZXJ5IGJ1aWxkZXIgYWNjZXNzIHdoaWxlIHByZXNlcnZpbmcgRGVjYWYudHMgcmVwb3NpdG9yeSBzZW1hbnRpY3MuXG4gKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbCB0aGF0IHRoaXMgcmVwb3NpdG9yeSB3aWxsIG1hbmFnZS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIGFkYXB0ZXIgdXNlZCB0byBleGVjdXRlIHBlcnNpc3RlbmNlIG9wZXJhdGlvbnMuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBtb2RlbCBUaGUgTW9kZWwgY29uc3RydWN0b3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVwb3NpdG9yeS5cbiAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIGZvcndhcmRlZCB0byB0aGUgYmFzZSBSZXBvc2l0b3J5LlxuICogQGNsYXNzIFR5cGVPUk1SZXBvc2l0b3J5XG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRpbmcgYSByZXBvc2l0b3J5XG4gKiBjb25zdCByZXBvID0gbmV3IFR5cGVPUk1SZXBvc2l0b3J5PFVzZXI+KGFkYXB0ZXIsIFVzZXIpO1xuICogY29uc3QgY3JlYXRlZCA9IGF3YWl0IHJlcG8uY3JlYXRlKG5ldyBVc2VyKHsgbmFtZTogXCJBbGljZVwiIH0pKTtcbiAqIGNvbnN0IHJlYWQgPSBhd2FpdCByZXBvLnJlYWQoY3JlYXRlZC5pZCk7XG4gKlxuICogLy8gQnVsayBjcmVhdGVcbiAqIGF3YWl0IHJlcG8uY3JlYXRlQWxsKFtuZXcgVXNlcih7IG5hbWU6IFwiQVwiIH0pLCBuZXcgVXNlcih7IG5hbWU6IFwiQlwiIH0pXSk7XG4gKlxuICogLy8gVXNpbmcgdGhlIHF1ZXJ5IGJ1aWxkZXJcbiAqIGNvbnN0IHFiID0gcmVwby5xdWVyeUJ1aWxkZXIoKTtcbiAqIGNvbnN0IHJvd3MgPSBhd2FpdCBxYi53aGVyZShcIm5hbWUgPSA6bmFtZVwiLCB7IG5hbWU6IFwiQWxpY2VcIiB9KS5nZXRNYW55KCk7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgUmVwbyBhcyBUeXBlT1JNUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IERCIGFzIFR5cGVPUk0vRGF0YVNvdXJjZVxuICpcbiAqICAgQXBwLT4+UmVwbzogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvLT4+QWRhcHRlcjogcHJlcGFyZShtb2RlbCwgcGspXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogeyByZWNvcmQsIGlkLCB0cmFuc2llbnQgfVxuICogICBSZXBvLT4+QWRhcHRlcjogY3JlYXRlKHRhYmxlLCBpZCwgbW9kZWwsIC4uLmFyZ3MpXG4gKiAgIEFkYXB0ZXItPj5EQjogSU5TRVJUIC4uLlxuICogICBEQi0tPj5BZGFwdGVyOiByb3dcbiAqICAgQWRhcHRlci0tPj5SZXBvOiByb3dcbiAqICAgUmVwby0+PkFkYXB0ZXI6IHJldmVydChyb3csIGNsYXp6LCBwaywgaWQpXG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogbW9kZWxcbiAqICAgUmVwby0tPj5BcHA6IG1vZGVsXG4gKi9cbkB1c2VzKFR5cGVPUk1GbGF2b3VyKVxuZXhwb3J0IGNsYXNzIFR5cGVPUk1SZXBvc2l0b3J5PE0gZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBSZXBvc2l0b3J5PFxuICBNLFxuICBUeXBlT1JNUXVlcnk8TSwgYW55PixcbiAgVHlwZU9STUFkYXB0ZXIsXG4gIFR5cGVPUk1GbGFncyxcbiAgQ29udGV4dDxUeXBlT1JNRmxhZ3M+XG4+IHtcbiAgY29uc3RydWN0b3IoYWRhcHRlcjogVHlwZU9STUFkYXB0ZXIsIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPiwgLi4uYXJnczogYW55W10pIHtcbiAgICBzdXBlcihhZGFwdGVyLCBtb2RlbCwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBUeXBlT1JNIHF1ZXJ5IGJ1aWxkZXIgZm9yIHRoZSByZXBvc2l0b3J5IGVudGl0eS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIFNlbGVjdFF1ZXJ5QnVpbGRlciBib3VuZCB0byB0aGlzIHJlcG9zaXRvcnkncyBlbnRpdHkgZm9yIGFkdmFuY2VkIHF1ZXJ5aW5nLlxuICAgKiBAcmV0dXJuIHtpbXBvcnQoXCJ0eXBlb3JtXCIpLlNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+fSBBIFR5cGVPUk0gU2VsZWN0UXVlcnlCdWlsZGVyIGluc3RhbmNlLlxuICAgKi9cbiAgcXVlcnlCdWlsZGVyKCkge1xuICAgIGNvbnN0IHJlcG8gPSB0aGlzLmFkYXB0ZXIuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFxuICAgICAgdGhpcy5jbGFzc1tNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiB0aGlzLmNsYXNzXVxuICAgICk7XG4gICAgcmV0dXJuIHJlcG8uY3JlYXRlUXVlcnlCdWlsZGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW5kIHBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCwgZGVsZWdhdGVzIGluc2VydGlvbiB0byB0aGUgYWRhcHRlciwgYW5kIHJlaHlkcmF0ZXMgdGhlIHBlcnNpc3RlZCBzdGF0ZSBiYWNrIGludG8gYSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCBUaGUgbW9kZWwgdG8gY3JlYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgY3JlYXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQsXG4gICAgICBtb2RlbCBhcyBhbnksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBsZXQgYzogQ29udGV4dDxUeXBlT1JNRmxhZ3M+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGlmIChhcmdzLmxlbmd0aCkgYyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXSBhcyBDb250ZXh0PFR5cGVPUk1GbGFncz47XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQ8TT4oXG4gICAgICByZWNvcmQsXG4gICAgICB0aGlzLmNsYXNzLFxuICAgICAgdGhpcy5wayxcbiAgICAgIGlkLFxuICAgICAgYyAmJiBjLmdldChcInJlYnVpbGRXaXRoVHJhbnNpZW50XCIpID8gdHJhbnNpZW50IDogdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgZGF0YWJhc2UgdXNpbmcgaXRzIHByaW1hcnkga2V5LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBwcmltYXJ5IGtleSBvZiB0aGUgbW9kZWwgdG8gcmVhZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgcmV0cmlldmVkIG1vZGVsIGluc3RhbmNlLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZChcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGlkIGFzIHN0cmluZyxcbiAgICAgIHRoaXMucGsgYXMgc3RyaW5nXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydDxNPihtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYW5kIHBlcnNpc3RzIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFByZXBhcmVzIHRoZSBtb2RlbCwgZGVsZWdhdGVzIHVwZGF0ZSB0byB0aGUgYWRhcHRlciwgYW5kIHJlaHlkcmF0ZXMgdGhlIHBlcnNpc3RlZCBzdGF0ZSBiYWNrIGludG8gYSBNb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCBUaGUgbW9kZWwgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgdXBkYXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShtb2RlbDogTSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgbGV0IHsgcmVjb3JkLCBpZCwgdHJhbnNpZW50IH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZShcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgaWQsXG4gICAgICBtb2RlbCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KHJlY29yZCwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQsIHRyYW5zaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBtb2RlbCBmcm9tIHRoZSBkYXRhYmFzZSBieSBJRC5cbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIG1vZGVsIGluc3RhbmNlIGZyb20gdGhlIGRhdGFiYXNlIHVzaW5nIGl0cyBwcmltYXJ5IGtleS5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgb2YgdGhlIG1vZGVsIHRvIGRlbGV0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE0+fSBUaGUgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZS5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZCBhcyBzdHJpbmcsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmFkYXB0ZXIucmV2ZXJ0PE0+KG0sIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVmFsaWRhdGVzIGFuZCBwcmVwYXJlcyBtb2RlbHMgZm9yIGJ1bGsgY3JlYXRpb24uXG4gICAqIEBzdW1tYXJ5IEFwcGxpZXMgZGVjb3JhdG9yLWJhc2VkIHZhbGlkYXRpb25zIGFuZCByZXR1cm5zIHRyYW5zZm9ybWVkIG1vZGVscyB3aXRoIGNvbnRleHQgYXJncyBmb3IgY3JlYXRlQWxsLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIFRoZSBtb2RlbHMgdG8gYmUgY3JlYXRlZC5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxbTVtdLCAuLi5hbnlbXV0+fSBUaGUgcHJlcGFyZWQgbW9kZWxzIGFuZCBmb3J3YXJkZWQgYXJncyB0dXBsZS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGxQcmVmaXgobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgY29udGV4dEFyZ3MgPSBhd2FpdCBDb250ZXh0LmFyZ3MoXG4gICAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICAgIHRoaXMuY2xhc3MsXG4gICAgICBhcmdzLFxuICAgICAgdGhpcy5hZGFwdGVyLFxuICAgICAgdGhpcy5fb3ZlcnJpZGVzIHx8IHt9XG4gICAgKTtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcblxuICAgIG1vZGVscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbW9kZWxzLm1hcChhc3luYyAobSkgPT4ge1xuICAgICAgICBtID0gbmV3IHRoaXMuY2xhc3MobSk7XG4gICAgICAgIGF3YWl0IGVuZm9yY2VEQkRlY29yYXRvcnMoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBjb250ZXh0QXJncy5jb250ZXh0LFxuICAgICAgICAgIG0sXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgICAgICAgT3BlcmF0aW9uS2V5cy5PTlxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBlcnJvcnMgPSBtb2RlbHNcbiAgICAgIC5tYXAoKG0pID0+XG4gICAgICAgIG0uaGFzRXJyb3JzKFxuICAgICAgICAgIC4uLihjb250ZXh0QXJncy5jb250ZXh0LmdldChcImlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllc1wiKSB8fCBbXSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZyB8IHVuZGVmaW5lZCwgZSwgaSkgPT4ge1xuICAgICAgICBpZiAoZSlcbiAgICAgICAgICBhY2N1bSA9XG4gICAgICAgICAgICB0eXBlb2YgYWNjdW0gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBhY2N1bSArIGBcXG4gLSAke2l9OiAke2UudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIDogYCAtICR7aX06ICR7ZS50b1N0cmluZygpfWA7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIHVuZGVmaW5lZCk7XG4gICAgaWYgKGVycm9ycykgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihlcnJvcnMpO1xuICAgIHJldHVybiBbbW9kZWxzLCAuLi5jb250ZXh0QXJncy5hcmdzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBtb2RlbHMgYXQgb25jZS5cbiAgICogQHN1bW1hcnkgUHJlcGFyZXMsIHBlcnNpc3RzLCBhbmQgcmVoeWRyYXRlcyBhIGJhdGNoIG9mIG1vZGVscy5cbiAgICogQHBhcmFtIHtNW119IG1vZGVscyBUaGUgbW9kZWxzIHRvIGNyZWF0ZS5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMvY29udGV4dC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBUaGUgY3JlYXRlZCBtb2RlbHMuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIG1vZGVscyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZWNvcmRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywgaWRzW2ldIGFzIHN0cmluZyB8IG51bWJlcilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWFkcyBtdWx0aXBsZSBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYSBsaXN0IG9mIG1vZGVscyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm92aWRlZCBrZXlzLlxuICAgKiBAcGFyYW0geyhzdHJpbmdbXXxudW1iZXJbXSl9IGtleXMgVGhlIHByaW1hcnkga2V5cyB0byByZWFkLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSByZXRyaWV2ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkQWxsKFxuICAgICAgKHRoaXMuY2xhc3MgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SXSBhcyBhbnksXG4gICAgICBrZXlzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHI6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBQZXJzaXN0cyBhIGJhdGNoIG9mIG1vZGVsIHVwZGF0ZXMgYW5kIHJldHVybnMgdGhlaXIgcmVoeWRyYXRlZCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgVGhlIG1vZGVscyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzL2NvbnRleHQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gVGhlIHVwZGF0ZWQgbW9kZWxzLlxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgICh0aGlzLmNsYXNzIGFzIGFueSlbTW9kZWxLZXlzLkFOQ0hPUl0gYXMgYW55LFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgbW9kZWxzLFxuICAgICAgdGhpcy5wayBhcyBzdHJpbmcsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlZC5tYXAoKHU6IFJlY29yZDxzdHJpbmcsIGFueT4sIGk6IG51bWJlcikgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIG11bHRpcGxlIG1vZGVscyBhdCBvbmNlLlxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgbGlzdCBvZiBtb2RlbHMgYnkgdGhlaXIgcHJpbWFyeSBrZXlzIGFuZCByZXR1cm5zIHRoZWlyIGxhc3QgcGVyc2lzdGVkIHN0YXRlcy5cbiAgICogQHBhcmFtIHsoc3RyaW5nW118bnVtYmVyW10pfSBrZXlzIFRoZSBwcmltYXJ5IGtleXMgdG8gZGVsZXRlLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cy9jb250ZXh0LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IFRoZSBkZWxldGVkIG1vZGVscy5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICBrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwoXG4gICAgICAodGhpcy5jbGFzcyBhcyBhbnkpW01vZGVsS2V5cy5BTkNIT1JdIGFzIGFueSxcbiAgICAgIGtleXMsXG4gICAgICB0aGlzLnBrIGFzIHN0cmluZyxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgocjogUmVjb3JkPHN0cmluZywgYW55PiwgaTogbnVtYmVyKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEVudGl0eVN1YnNjcmliZXJJbnRlcmZhY2UsXG4gIEV2ZW50U3Vic2NyaWJlcixcbiAgSW5zZXJ0RXZlbnQsXG4gIFJlbW92ZUV2ZW50LFxuICBVcGRhdGVFdmVudCxcbn0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IEV2ZW50SWRzLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZU9STSBldmVudCBzdWJzY3JpYmVyIHRoYXQgZm9yd2FyZHMgZW50aXR5IGxpZmVjeWNsZSBldmVudHMgdG8gdGhlIGFkYXB0ZXIuXG4gKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBpbnNlcnQsIHVwZGF0ZSwgYW5kIHJlbW92ZSBldmVudHMgZW1pdHRlZCBieSBUeXBlT1JNIGFuZCBub3RpZmllcyB0aGUgRGVjYWYudHMgYWRhcHRlciBzbyB0aGF0IG9ic2VydmVycyBjYW4gYmUgdXBkYXRlZCBhY2NvcmRpbmdseS5cbiAqIEBwYXJhbSB7VHlwZU9STUFkYXB0ZXJ9IGFkYXB0ZXIgVGhlIFR5cGVPUk0gYWRhcHRlciB1c2VkIHRvIHByb3BhZ2F0ZSBldmVudHMgYW5kIGxvb2sgdXAgbWV0YWRhdGEuXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiAvLyBSZWdpc3RlcmluZyB0aGUgc3Vic2NyaWJlciB3aGVuIGNyZWF0aW5nIGEgRGF0YVNvdXJjZVxuICogLy8gZGF0YVNvdXJjZU9wdGlvbnMuc3Vic2NyaWJlcnMgPSBbbmV3IFR5cGVPUk1FdmVudFN1YnNjcmliZXIoYWRhcHRlcildO1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgVHlwZU9STVxuICogICBwYXJ0aWNpcGFudCBTdWJzY3JpYmVyIGFzIFR5cGVPUk1FdmVudFN1YnNjcmliZXJcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBPYnNlcnZlcnNcbiAqXG4gKiAgIFR5cGVPUk0tPj5TdWJzY3JpYmVyOiBhZnRlckluc2VydChlbnRpdHkpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIENSRUFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBDUkVBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJVcGRhdGUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIFVQREFURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBVUERBVEUsIFtpZF0pXG4gKlxuICogICBUeXBlT1JNLT4+U3Vic2NyaWJlcjogYWZ0ZXJSZW1vdmUoZXZlbnQpXG4gKiAgIFN1YnNjcmliZXItPj5BZGFwdGVyOiB1cGRhdGVPYnNlcnZlcnModGFibGUsIERFTEVURSwgW2lkXSlcbiAqICAgQWRhcHRlci0+Pk9ic2VydmVyczogbm90aWZ5KHRhYmxlLCBERUxFVEUsIFtpZF0pXG4gKi9cbkBFdmVudFN1YnNjcmliZXIoKVxuZXhwb3J0IGNsYXNzIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgaW1wbGVtZW50cyBFbnRpdHlTdWJzY3JpYmVySW50ZXJmYWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhbmRsZXI6IChcbiAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgICAgaWRzOiBFdmVudElkc1xuICAgICkgPT4gdm9pZFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtaW5zZXJ0IGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGEgY3JlYXRlIG9wZXJhdGlvbiBmb3IgdGhlIGluc2VydGVkIGVudGl0eS5cbiAgICogQHBhcmFtIHtJbnNlcnRFdmVudDxhbnk+fSBldmVudCBUaGUgVHlwZU9STSBpbnNlcnQgZXZlbnQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pnx2b2lkfSBBIHByb21pc2Ugd2hlbiBhc3luYyBvciB2b2lkIG90aGVyd2lzZS5cbiAgICovXG4gIGFmdGVySW5zZXJ0KGV2ZW50OiBJbnNlcnRFdmVudDxhbnk+KTogUHJvbWlzZTxhbnk+IHwgdm9pZCB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKGNvbnN0cnVjdG9yKTtcblxuICAgIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuQ1JFQVRFLCBbZXZlbnQuZW50aXR5SWQgYXMgYW55XSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcG9zdC1yZW1vdmUgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBkZWxldGUgb3BlcmF0aW9uIGZvciB0aGUgcmVtb3ZlZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7UmVtb3ZlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gcmVtb3ZlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclJlbW92ZShldmVudDogUmVtb3ZlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICBpZiAoIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBObyByZWdpc3RlcmVkIG1vZGVsIGZvdW5kIGZvciAke2V2ZW50LmVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjb25zdHJ1Y3Rvcik7XG5cbiAgICB0aGlzLmhhbmRsZXIodGFibGVOYW1lLCBPcGVyYXRpb25LZXlzLkRFTEVURSwgW2V2ZW50LmVudGl0eUlkIGFzIGFueV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHBvc3QtdXBkYXRlIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgTm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGFuIHVwZGF0ZSBvcGVyYXRpb24gZm9yIHRoZSBtb2RpZmllZCBlbnRpdHkuXG4gICAqIEBwYXJhbSB7VXBkYXRlRXZlbnQ8YW55Pn0gZXZlbnQgVGhlIFR5cGVPUk0gdXBkYXRlIGV2ZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGFueT58dm9pZH0gQSBwcm9taXNlIHdoZW4gYXN5bmMgb3Igdm9pZCBvdGhlcndpc2UuXG4gICAqL1xuICBhZnRlclVwZGF0ZShldmVudDogVXBkYXRlRXZlbnQ8YW55Pik6IFByb21pc2U8YW55PiB8IHZvaWQge1xuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gTW9kZWwuZ2V0KGV2ZW50LmRhdGFiYXNlRW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZGF0YWJhc2VFbnRpdHkuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUoY29uc3RydWN0b3IpO1xuXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuVVBEQVRFLCBbXG4gICAgICAoZXZlbnQuZW50aXR5IGFzIGFueSlbXCJpZFwiXSBhcyBhbnksXG4gICAgXSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpc3BhdGNoLCBFdmVudElkcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRGF0YVNvdXJjZU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kYXRhLXNvdXJjZS9EYXRhU291cmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi9UeXBlT1JNQWRhcHRlclwiO1xuaW1wb3J0IHsgVHlwZU9STUV2ZW50U3Vic2NyaWJlciB9IGZyb20gXCIuL1R5cGVPUk1FdmVudFN1YnNjcmliZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlzcGF0Y2hlciBmb3IgVHlwZU9STS1kcml2ZW4gY2hhbmdlIGV2ZW50cy5cbiAqIEBzdW1tYXJ5IFN1YnNjcmliZXMgYSBUeXBlT1JNIERhdGFTb3VyY2Ugd2l0aCBhIGN1c3RvbSBFbnRpdHlTdWJzY3JpYmVyIHRvIG5vdGlmeSBvYnNlcnZlcnMgd2hlbiByZWNvcmRzIGFyZSBjcmVhdGVkLCB1cGRhdGVkLCBvciBkZWxldGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0PTUwMDBdIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbml0aWFsaXphdGlvbiByZXRyaWVzLlxuICogQGNsYXNzIFR5cGVPUk1EaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIGRpc3BhdGNoZXIgZm9yIGEgVHlwZU9STSBEYXRhU291cmNlXG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBUeXBlT1JNRGlzcGF0Y2goKTtcbiAqIGF3YWl0IGRpc3BhdGNoLm9ic2VydmUoYWRhcHRlciwgYWRhcHRlci5kYXRhU291cmNlLm9wdGlvbnMpO1xuICpcbiAqIC8vIFRoZSBkaXNwYXRjaGVyIHJlZ2lzdGVycyBhIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgYW5kIG5vdGlmaWVzIG9ic2VydmVycyB3aGVuIGVudGl0aWVzIGNoYW5nZS5cbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgRGlzcGF0Y2gge1xuICogICAgICtpbml0aWFsaXplKClcbiAqICAgICArdXBkYXRlT2JzZXJ2ZXJzKClcbiAqICAgfVxuICogICBjbGFzcyBUeXBlT1JNRGlzcGF0Y2gge1xuICogICAgIC1vYnNlcnZlckxhc3RVcGRhdGU/OiBzdHJpbmdcbiAqICAgICAtYXR0ZW1wdENvdW50ZXI6IG51bWJlclxuICogICAgIC10aW1lb3V0OiBudW1iZXJcbiAqICAgICArY29uc3RydWN0b3IodGltZW91dClcbiAqICAgICAjbm90aWZpY2F0aW9uSGFuZGxlcigpXG4gKiAgICAgI2luaXRpYWxpemUoKVxuICogICB9XG4gKiAgIERpc3BhdGNoIDx8LS0gVHlwZU9STURpc3BhdGNoXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNRGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxEYXRhU291cmNlT3B0aW9ucz4ge1xuICBwcml2YXRlIG9ic2VydmVyTGFzdFVwZGF0ZT86IHN0cmluZztcbiAgcHJpdmF0ZSBhdHRlbXB0Q291bnRlcjogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRpbWVvdXQgPSA1MDAwKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIFR5cGVPUk0gbm90aWZpY2F0aW9uIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgSGFuZGxlcyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyAodHJhbnNsYXRlZCBmcm9tIFR5cGVPUk0gZXZlbnRzKSBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IHJlY29yZCBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgVGhlIG5vdGlmaWNhdGlvbiBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkcyBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG5vdGlmaWNhdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBQb3N0Z3JlU1FMRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExvZ2dlclxuICAgKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JzZXJ2ZXJzXG4gICAqICAgTm90ZSBvdmVyIEQ6IFJlY2VpdmUgbm90aWZpY2F0aW9uIGZyb20gUG9zdGdyZVNRTFxuICAgKiAgIEQtPj5EOiBQYXJzZSBub3RpZmljYXRpb24gcGF5bG9hZFxuICAgKiAgIEQtPj5EOiBFeHRyYWN0IHRhYmxlLCBvcGVyYXRpb24sIGFuZCBpZHNcbiAgICogICBELT4+TzogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBvcGVyYXRpb24sIGlkcylcbiAgICogICBELT4+RDogVXBkYXRlIG9ic2VydmVyTGFzdFVwZGF0ZVxuICAgKiAgIEQtPj5MOiBMb2cgc3VjY2Vzc2Z1bCBkaXNwYXRjaFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgaWRzOiBFdmVudElkc1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ub3RpZmljYXRpb25IYW5kbGVyKTtcbiAgICB0cnkge1xuICAgICAgLy8gTm90aWZ5IG9ic2VydmVyc1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGUsIG9wZXJhdGlvbiwgaWRzKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXJMYXN0VXBkYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbG9nLnZlcmJvc2UoYE9ic2VydmVyIHJlZnJlc2ggZGlzcGF0Y2hlZCBieSAke29wZXJhdGlvbn0gZm9yICR7dGFibGV9YCk7XG4gICAgICBsb2cuZGVidWcoYHBrczogJHtpZHN9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyBub3RpZmljYXRpb246ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBkaXNwYXRjaGVyIGFuZCBzdWJzY3JpYmVzIHRvIFR5cGVPUk0gbm90aWZpY2F0aW9ucy5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBUeXBlT1JNRXZlbnRTdWJzY3JpYmVyIG9uIHRoZSBEYXRhU291cmNlIGFuZCBsb2dzIHRoZSBzdWJzY3JpcHRpb24gbGlmZWN5Y2xlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzdWJzY3JpcHRpb24gaXMgZXN0YWJsaXNoZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgVHlwZU9STURpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgUyBhcyBzdWJzY3JpYmVUb1R5cGVPUk1cbiAgICogICBwYXJ0aWNpcGFudCBEUyBhcyBUeXBlT1JNIERhdGFTb3VyY2VcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExvZ2dlclxuICAgKiAgIEQtPj5TOiBDYWxsIHN1YnNjcmliZVRvVHlwZU9STVxuICAgKiAgIFMtPj5TOiBDaGVjayBhZGFwdGVyIGFuZCBuYXRpdmVcbiAgICogICBhbHQgTm8gYWRhcHRlciBvciBuYXRpdmVcbiAgICogICAgIFMtLT4+UzogdGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFMtPj5EUzogaW5pdGlhbGl6ZSgpXG4gICAqICAgUy0+PkRTOiBzdWJzY3JpYmVycy5wdXNoKFR5cGVPUk1FdmVudFN1YnNjcmliZXIpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIERTLS0+PlM6IFN1YnNjcmlwdGlvbiBlc3RhYmxpc2hlZFxuICAgKiAgICAgUy0tPj5EOiBQcm9taXNlIHJlc29sdmVzXG4gICAqICAgICBELT4+TDogTG9nIHN1Y2Nlc3NmdWwgc3Vic2NyaXB0aW9uXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgRFMtLT4+UzogRXJyb3JcbiAgICogICAgIFMtLT4+RDogUHJvbWlzZSByZWplY3RzXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3luYyBmdW5jdGlvbiBzdWJzY3JpYmVUb1R5cGVPUk0odGhpczogVHlwZU9STURpc3BhdGNoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlciB8fCAhdGhpcy5uYXRpdmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIvbmF0aXZlIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWFkYXB0ZXIuZGF0YVNvdXJjZS5pc0luaXRpYWxpemVkKVxuICAgICAgICAgIGF3YWl0IGFkYXB0ZXIuZGF0YVNvdXJjZS5pbml0aWFsaXplKCk7XG5cbiAgICAgICAgYWRhcHRlci5kYXRhU291cmNlLnN1YnNjcmliZXJzLnB1c2goXG4gICAgICAgICAgbmV3IFR5cGVPUk1FdmVudFN1YnNjcmliZXIodGhpcy5ub3RpZmljYXRpb25IYW5kbGVyLmJpbmQodGhpcykpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1YnNjcmliZVRvVHlwZU9STVxuICAgICAgLmNhbGwodGhpcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3Vic2NyaWJlZCB0byBUeXBlT1JNIG5vdGlmaWNhdGlvbnNgKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBzdWJzY3JpYmUgdG8gVHlwZU9STSBub3RpZmljYXRpb25zOiAke2V9YFxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW51cCBtZXRob2QgdG8gcmVsZWFzZSByZXNvdXJjZXMgd2hlbiB0aGUgZGlzcGF0Y2hlciBpcyBubyBsb25nZXIgbmVlZGVkXG4gICAqL1xuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICAvLyBpZiAodGhpcy5hZGFwdGVyKSB7XG4gICAgLy9cbiAgICAvLyAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXI7XG4gICAgLy8gICBhd2FpdCBhZGFwdGVyLmRhdGFTb3VyY2UuZGVzdHJveSgpO1xuICAgIC8vIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBKYXZhU2NyaXB0IFJlZ0V4cCBwYXR0ZXJuIHRvIGEgUG9zdGdyZVNRTCBQT1NJWCBwYXR0ZXJuIHN0cmluZy5cbiAqIEBzdW1tYXJ5IEFjY2VwdHMgZWl0aGVyIGEgUmVnRXhwIG9iamVjdCBvciBhIHN0cmluZyByZXByZXNlbnRhdGlvbiAoL3BhdHRlcm4vZmxhZ3MpIGFuZCByZXR1cm5zIHRoZSByYXcgcGF0dGVybiBjb21wYXRpYmxlIHdpdGggUG9zdGdyZVNRTCdzIH4gYW5kIH4qIG9wZXJhdG9ycy5cbiAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30ganNSZWdleCBKYXZhU2NyaXB0IFJlZ0V4cCBvYmplY3Qgb3IgcGF0dGVybiBzdHJpbmcuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFBvc3RncmVTUUwtY29tcGF0aWJsZSByZWdleCBwYXR0ZXJuIHN0cmluZy5cbiAqIEBmdW5jdGlvbiBjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQXBwXG4gKiAgIHBhcnRpY2lwYW50IFV0aWxzIGFzIGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlc1xuICogICBBcHAtPj5VdGlsczogY29udmVydEpzUmVnZXhUb1Bvc3RncmVzKFJlZ0V4cChcImZvby4qXCIsXCJpXCIpKVxuICogICBVdGlscy0+PlV0aWxzOiBQYXJzZSBzdHJpbmcgb3IgdXNlIFJlZ0V4cC5zb3VyY2VcbiAqICAgVXRpbHMtLT4+QXBwOiBcImZvby4qXCJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLXR5cGVvcm1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3Jlcyhqc1JlZ2V4OiBSZWdFeHAgfCBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByeHAgPSBuZXcgUmVnRXhwKC9eXFwvKC4rKVxcLyhcXHcrKSQvZyk7XG4gIGlmICh0eXBlb2YganNSZWdleCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG1hdGNoID0gcnhwLmV4ZWMoanNSZWdleCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBjb25zdCBbLCBwXSA9IG1hdGNoO1xuICAgICAganNSZWdleCA9IHA7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlZ2V4ID0gdHlwZW9mIGpzUmVnZXggPT09IFwic3RyaW5nXCIgPyBuZXcgUmVnRXhwKGpzUmVnZXgpIDoganNSZWdleDtcblxuICBjb25zdCBwYXR0ZXJuID0gcmVnZXguc291cmNlO1xuXG4gIHJldHVybiBwYXR0ZXJuO1xufVxuIiwiaW1wb3J0IHsgQ29sdW1uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9Db2x1bW5NZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Rm9yUmVsYXRpb25zKFxuICB0YXJnZXQ6IGFueSxcbiAgcHJvcGVydHk6IHN0cmluZyxcbiAgY29sdW1uczogQ29sdW1uTWV0YWRhdGFBcmdzW11cbikge1xuICBsZXQgaW5kZXg6IG51bWJlciA9IDA7XG4gIGNvbnN0IGNvbHMgPSBjb2x1bW5zLmZpbHRlcigoYzogQ29sdW1uTWV0YWRhdGFBcmdzLCBpKSA9PiB7XG4gICAgaW5kZXggPSBpO1xuICAgIHJldHVybiBjLnRhcmdldCA9PT0gdGFyZ2V0ICYmIGMucHJvcGVydHlOYW1lID09PSBwcm9wZXJ0eTtcbiAgfSk7XG4gIGlmICghY29scy5sZW5ndGgpIHJldHVybiB7fTtcbiAgY29sdW1ucy5zcGxpY2UoaW5kZXgsIDEpO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29sc1swXS5vcHRpb25zKS5yZWR1Y2UoXG4gICAgKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICBhY2N1bVtrZXldID0gdmFsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlRZUEU6XG4gICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIG9wdGlvbiBmb3IgYSByZWxhdGlvbjogJHtrZXl9YFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSxcbiAgICB7fVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gIHRhcmdldDogYW55LFxuICBwcm9wZXJ0eTogc3RyaW5nLFxuICBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YUFyZ3NbXSxcbiAgb3B0aW9uczogYW55ID0ge30sXG4gIG1vZGU6IHN0cmluZyA9IFwicmVndWxhclwiLFxuICByZWxhdGlvbnM6IFJlbGF0aW9uTWV0YWRhdGFBcmdzW11cbikge1xuICBjb25zdCBjb2xzID0gY29sdW1ucy5maWx0ZXIoXG4gICAgKGM6IENvbHVtbk1ldGFkYXRhQXJncykgPT5cbiAgICAgIGMudGFyZ2V0ID09PSB0YXJnZXQgJiYgYy5wcm9wZXJ0eU5hbWUgPT09IHByb3BlcnR5XG4gICk7XG5cbiAgY29uc3QgcmVscyA9IHJlbGF0aW9ucy5maWx0ZXIoXG4gICAgKGM6IFJlbGF0aW9uTWV0YWRhdGFBcmdzKSA9PlxuICAgICAgYy50YXJnZXQgPT09IHRhcmdldCAmJiBjLnByb3BlcnR5TmFtZSA9PT0gcHJvcGVydHlcbiAgKTtcblxuICBpZiAoY29scy5sZW5ndGggPiAxKVxuICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgYE11bHRpcGxlIGNvbHVtbnMgZm9yICR7cHJvcGVydHl9IGZvdW5kIGZvciBnaXZlbiB0YXJnZXQ6ICR7Y29sdW1ucy5tYXAoKGMpID0+IGMucHJvcGVydHlOYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICk7XG4gIGlmIChyZWxzLmxlbmd0aCA+IDEpXG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgTXVsdGlwbGUgcmVsYXRpb25zIGZvciAke3Byb3BlcnR5fSBmb3VuZCBmb3IgZ2l2ZW4gdGFyZ2V0OiAke3JlbHMubWFwKChjKSA9PiBjLnByb3BlcnR5TmFtZSkuam9pbihcIiwgXCIpfWBcbiAgICApO1xuICBsZXQgY29sdW1uOiBDb2x1bW5NZXRhZGF0YUFyZ3MgfCBSZWxhdGlvbk1ldGFkYXRhQXJncyB8IHVuZGVmaW5lZDtcblxuICBpZiAoY29scy5sZW5ndGggPT09IDAgJiYgIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eSxcbiAgICAgIG1vZGU6IG1vZGUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgQ29sdW1uTWV0YWRhdGFBcmdzKTtcbiAgICByZXR1cm47XG4gIH0gZWxzZSBpZiAoIXJlbHMubGVuZ3RoKSB7XG4gICAgY29sdW1uID0gY29sc1swXTtcbiAgICBpZiAobW9kZSAhPT0gXCJyZWd1bGFyXCIpXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29sdW1uLCBcIm1vZGVcIiwge1xuICAgICAgICB2YWx1ZTogbW9kZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICB9XG5cbiAgaWYgKHJlbHMubGVuZ3RoKVxuICAgIG9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKS5yZWR1Y2UoXG4gICAgICAoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgICAgICAgIGFjY3VtW2tleV0gPSB2YWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuXG4gIGNvbHVtbiA9IGNvbHVtbiB8fCByZWxzWzBdO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb2x1bW4sIFwib3B0aW9uc1wiLCB7XG4gICAgdmFsdWU6IHsgLi4uY29sdW1uLm9wdGlvbnMsIC4uLm9wdGlvbnMgfSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEdlbmVyYXRlZE1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvR2VuZXJhdGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQge1xuICBDb2x1bW5PcHRpb25zLFxuICBDb2x1bW5UeXBlLFxuICBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3IsXG4gIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UsXG59IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQge1xuICBTaW1wbGVDb2x1bW5UeXBlLFxuICBTcGF0aWFsQ29sdW1uVHlwZSxcbiAgV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIFdpdGhQcmVjaXNpb25Db2x1bW5UeXBlLFxuICBXaXRoV2lkdGhDb2x1bW5UeXBlLFxufSBmcm9tIFwidHlwZW9ybS9kcml2ZXIvdHlwZXMvQ29sdW1uVHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uQ29tbW9uT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbkNvbW1vbk9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgU3BhdGlhbENvbHVtbk9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9TcGF0aWFsQ29sdW1uT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5XaXRoTGVuZ3RoT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL0NvbHVtbldpdGhMZW5ndGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbldpdGhXaWR0aE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5XaXRoV2lkdGhPcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IENvbHVtbk51bWVyaWNPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uTnVtZXJpY09wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uRW51bU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbnVtT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5Ic3RvcmVPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGVjb3JhdG9yL29wdGlvbnMvQ29sdW1uSHN0b3JlT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5FbWJlZGRlZE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9Db2x1bW5FbWJlZGRlZE9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgRW1iZWRkZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0VtYmVkZGVkTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBhZ2dyZWdhdGVPck5ld0NvbHVtbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi4gT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXNcbiAqIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4ob3B0aW9uczogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBTaW1wbGVDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFNwYXRpYWxDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIFNwYXRpYWxDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogV2l0aExlbmd0aENvbHVtblR5cGUsXG4gIG9wdGlvbnM/OiBDb2x1bW5Db21tb25PcHRpb25zICYgQ29sdW1uV2l0aExlbmd0aE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBXaXRoV2lkdGhDb2x1bW5UeXBlLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbldpdGhXaWR0aE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBXaXRoUHJlY2lzaW9uQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5OdW1lcmljT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDb2x1bW4oXG4gIHR5cGU6IFwiZW51bVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkVudW1PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJzaW1wbGUtZW51bVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkVudW1PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgdHlwZTogXCJzZXRcIixcbiAgb3B0aW9ucz86IENvbHVtbkNvbW1vbk9wdGlvbnMgJiBDb2x1bW5FbnVtT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKi9cbi8vIEB0cy1leHBlY3QtZXJyb3Igc29tZSB0eXBlb3JtIHRoaW5nXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlOiBcImhzdG9yZVwiLFxuICBvcHRpb25zPzogQ29sdW1uQ29tbW9uT3B0aW9ucyAmIENvbHVtbkhzdG9yZU9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICpcbiAqIFByb3BlcnR5IGluIGVudGl0eSBjYW4gYmUgbWFya2VkIGFzIEVtYmVkZGVkLCBhbmQgb24gcGVyc2lzdCBhbGwgY29sdW1ucyBmcm9tIHRoZSBlbWJlZGRlZCBhcmUgbWFwcGVkIHRvIHRoZVxuICogc2luZ2xlIHRhYmxlIG9mIHRoZSBlbnRpdHkgd2hlcmUgRW1iZWRkZWQgaXMgdXNlZC4gQW5kIG9uIGh5ZHJhdGlvbiBhbGwgY29sdW1ucyB3aGljaCBzdXBwb3NlZCB0byBiZSBpbiB0aGVcbiAqIGVtYmVkZGVkIHdpbGwgYmUgbWFwcGVkIHRvIGl0IGZyb20gdGhlIHNpbmdsZSB0YWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENvbHVtbihcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICB0eXBlOiAodHlwZT86IGFueSkgPT4gRnVuY3Rpb24sXG4gIG9wdGlvbnM/OiBDb2x1bW5FbWJlZGRlZE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKiBPbmx5IHByb3BlcnRpZXMgZGVjb3JhdGVkIHdpdGggdGhpcyBkZWNvcmF0b3Igd2lsbCBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGFiYXNlIHdoZW4gZW50aXR5IGJlIHNhdmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQ29sdW1uKFxuICB0eXBlT3JPcHRpb25zPzogLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICB8ICgodHlwZT86IGFueSkgPT4gRnVuY3Rpb24pXG4gICAgfCBDb2x1bW5UeXBlXG4gICAgfCAoQ29sdW1uT3B0aW9ucyAmIENvbHVtbkVtYmVkZGVkT3B0aW9ucyksXG4gIG9wdGlvbnM/OiBDb2x1bW5PcHRpb25zICYgQ29sdW1uRW1iZWRkZWRPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBvYmplY3QsIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgICBsZXQgdHlwZTogQ29sdW1uVHlwZSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdHlwZU9yT3B0aW9ucyA9PT0gXCJzdHJpbmdcIiB8fFxuICAgICAgdHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIlxuICAgICkge1xuICAgICAgdHlwZSA9IDxDb2x1bW5UeXBlPnR5cGVPck9wdGlvbnM7XG4gICAgfSBlbHNlIGlmICh0eXBlT3JPcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0gPENvbHVtbk9wdGlvbnM+dHlwZU9yT3B0aW9ucztcbiAgICAgIHR5cGUgPSB0eXBlT3JPcHRpb25zLnR5cGU7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIENvbHVtbk9wdGlvbnM7XG5cbiAgICAvLyBpZiB0eXBlIGlzIG5vdCBnaXZlbiBleHBsaWNpdGx5IHRoZW4gdHJ5IHRvIGd1ZXNzIGl0XG4gICAgY29uc3QgcmVmbGVjdE1ldGFkYXRhVHlwZSA9XG4gICAgICBSZWZsZWN0ICYmIChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGFcbiAgICAgICAgPyAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgb2JqZWN0LCBwcm9wZXJ0eU5hbWUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGlmICghdHlwZSAmJiByZWZsZWN0TWV0YWRhdGFUeXBlKVxuICAgICAgLy8gaWYgdHlwZSBpcyBub3QgZ2l2ZW4gZXhwbGljaXRseSB0aGVuIHRyeSB0byBndWVzcyBpdFxuICAgICAgdHlwZSA9IHJlZmxlY3RNZXRhZGF0YVR5cGU7XG5cbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBubyB0eXBlIGluIGNvbHVtbiBvcHRpb25zIHRoZW4gc2V0IHR5cGUgZnJvbSBmaXJzdCBmdW5jdGlvbiBhcmd1bWVudCwgb3IgZ3Vlc3NlZCBvbmVcbiAgICBpZiAoIW9wdGlvbnMudHlwZSAmJiB0eXBlKSBvcHRpb25zLnR5cGUgPSB0eXBlO1xuXG4gICAgLy8gc3BlY2lmeSBIU1RPUkUgdHlwZSBpZiBjb2x1bW4gaXMgSFNUT1JFXG4gICAgaWYgKG9wdGlvbnMudHlwZSA9PT0gXCJoc3RvcmVcIiAmJiAhb3B0aW9ucy5oc3RvcmVUeXBlKVxuICAgICAgb3B0aW9ucy5oc3RvcmVUeXBlID0gcmVmbGVjdE1ldGFkYXRhVHlwZSA9PT0gT2JqZWN0ID8gXCJvYmplY3RcIiA6IFwic3RyaW5nXCI7XG5cbiAgICBpZiAodHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gcmVnaXN0ZXIgYW4gZW1iZWRkZWRcbiAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5lbWJlZGRlZHMucHVzaCh7XG4gICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgICAgaXNBcnJheTogcmVmbGVjdE1ldGFkYXRhVHlwZSA9PT0gQXJyYXkgfHwgb3B0aW9ucy5hcnJheSA9PT0gdHJ1ZSxcbiAgICAgICAgcHJlZml4OiBvcHRpb25zLnByZWZpeCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5wcmVmaXggOiB1bmRlZmluZWQsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICAgICAgdHlwZTogdHlwZU9yT3B0aW9ucyBhcyAodHlwZT86IGFueSkgPT4gRnVuY3Rpb24sXG4gICAgICB9IGFzIEVtYmVkZGVkTWV0YWRhdGFBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcmVnaXN0ZXIgYSByZWd1bGFyIGNvbHVtblxuXG4gICAgICAvLyBpZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGEgdHlwZSB0aGVuIHdlIG5lZWQgdG8gZ2l2ZSBlcnJvciB0byB1c2VyIHRoYXQgdHlwZSBpcyByZXF1aXJlZFxuICAgICAgaWYgKCFvcHRpb25zLnR5cGUpXG4gICAgICAgIHRocm93IG5ldyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgICAvLyBjcmVhdGUgdW5pcXVlXG4gICAgICBpZiAob3B0aW9ucy51bmlxdWUgPT09IHRydWUpXG4gICAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS51bmlxdWVzLnB1c2goe1xuICAgICAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgIGNvbHVtbnM6IFtwcm9wZXJ0eU5hbWVdLFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICAgIFwicmVndWxhclwiLFxuICAgICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICAgICk7XG5cbiAgICAgIGlmIChvcHRpb25zLmdlbmVyYXRlZCkge1xuICAgICAgICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCkuZ2VuZXJhdGlvbnMucHVzaCh7XG4gICAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgc3RyYXRlZ3k6XG4gICAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5nZW5lcmF0ZWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgPyBvcHRpb25zLmdlbmVyYXRlZFxuICAgICAgICAgICAgICA6IFwiaW5jcmVtZW50XCIsXG4gICAgICAgIH0gYXMgR2VuZXJhdGVkTWV0YWRhdGFBcmdzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIFVwZGF0ZURhdGVDb2x1bW4ob3B0aW9ucz86IENvbHVtbk9wdGlvbnMpOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gICAgICBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICBtZXRhZGF0YS5jb2x1bW5zLFxuICAgICAgb3B0aW9ucyB8fCB7fSxcbiAgICAgIFwidXBkYXRlRGF0ZVwiLFxuICAgICAgbWV0YWRhdGEucmVsYXRpb25zXG4gICAgKTtcbiAgfTtcbn1cbiIsImltcG9ydCB7IENvbHVtbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRGF0ZUNvbHVtbihvcHRpb25zPzogQ29sdW1uT3B0aW9ucyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3Q6IGFueSwgcHJvcGVydHlOYW1lOiBhbnkpIHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBhZ2dyZWdhdGVPck5ld0NvbHVtbihcbiAgICAgIG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIG1ldGFkYXRhLmNvbHVtbnMsXG4gICAgICBvcHRpb25zIHx8IHt9LFxuICAgICAgXCJjcmVhdGVEYXRlXCIsXG4gICAgICBtZXRhZGF0YS5yZWxhdGlvbnNcbiAgICApO1xuICB9O1xufVxuIiwiZXhwb3J0IGNsYXNzIE9iamVjdFV0aWxzIHtcbiAgLyoqXG4gICAqIENoZWNrcyBpZiBnaXZlbiB2YWx1ZSBpcyBhbiBvYmplY3QuXG4gICAqIFdlIGNhbm5vdCB1c2UgaW5zdGFuY2VvZiBiZWNhdXNlIGl0IGhhcyBwcm9ibGVtcyB3aGVuIHJ1bm5pbmcgb24gZGlmZmVyZW50IGNvbnRleHRzLlxuICAgKiBBbmQgd2UgZG9uJ3Qgc2ltcGx5IHVzZSB0eXBlb2YgYmVjYXVzZSB0eXBlb2YgbnVsbCA9PT0gXCJvYmplY3RcIi5cbiAgICovXG4gIHN0YXRpYyBpc09iamVjdCh2YWw6IGFueSk6IHZhbCBpcyBvYmplY3Qge1xuICAgIHJldHVybiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgZ2l2ZW4gdmFsdWUgaXMgYW4gb2JqZWN0LlxuICAgKiBXZSBjYW5ub3QgdXNlIGluc3RhbmNlb2YgYmVjYXVzZSBpdCBoYXMgcHJvYmxlbXMgd2hlbiBydW5uaW5nIG9uIGRpZmZlcmVudCBjb250ZXh0cy5cbiAgICogQW5kIHdlIGRvbid0IHNpbXBseSB1c2UgdHlwZW9mIGJlY2F1c2UgdHlwZW9mIG51bGwgPT09IFwib2JqZWN0XCIuXG4gICAqL1xuICBzdGF0aWMgaXNPYmplY3RXaXRoTmFtZSh2YWw6IGFueSk6IHZhbCBpcyBvYmplY3QgJiB7IG5hbWU6IHN0cmluZyB9IHtcbiAgICByZXR1cm4gdmFsICE9PSBudWxsICYmIHR5cGVvZiB2YWwgPT09IFwib2JqZWN0XCIgJiYgdmFsW1wibmFtZVwiXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICovXG4gIHN0YXRpYyBhc3NpZ248VCwgVT4odGFyZ2V0OiBULCBzb3VyY2U6IFUpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYVxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAqIEBwYXJhbSBzb3VyY2UxIFRoZSBmaXJzdCBzb3VyY2Ugb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gc291cmNlMiBUaGUgc2Vjb25kIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqL1xuICBzdGF0aWMgYXNzaWduPFQsIFUsIFY+KHRhcmdldDogVCwgc291cmNlMTogVSwgc291cmNlMjogVik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBvYmplY3QgdG8gY29weSB0by5cbiAgICogQHBhcmFtIHNvdXJjZTEgVGhlIGZpcnN0IHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSBzb3VyY2UyIFRoZSBzZWNvbmQgc291cmNlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHNvdXJjZTMgVGhlIHRoaXJkIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXG4gICAqL1xuICBzdGF0aWMgYXNzaWduPFQsIFUsIFYsIFc+KFxuICAgIHRhcmdldDogVCxcbiAgICBzb3VyY2UxOiBVLFxuICAgIHNvdXJjZTI6IFYsXG4gICAgc291cmNlMzogV1xuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gb25lIG9yIG1vcmUgc291cmNlIG9iamVjdHMgdG8gYVxuICAgKiB0YXJnZXQgb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGNvcHkgdG8uXG4gICAqIEBwYXJhbSBzb3VyY2VzIE9uZSBvciBtb3JlIHNvdXJjZSBvYmplY3RzIGZyb20gd2hpY2ggdG8gY29weSBwcm9wZXJ0aWVzXG4gICAqL1xuICBzdGF0aWMgYXNzaWduKHRhcmdldDogb2JqZWN0LCAuLi5zb3VyY2VzOiBhbnlbXSk6IHZvaWQge1xuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2UpKSB7XG4gICAgICAgICh0YXJnZXQgYXMgYW55KVtwcm9wXSA9IHNvdXJjZVtwcm9wXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy9cbiAgLy8gLyoqXG4gIC8vICAqIENvbnZlcnRzIE1peGVkTGlzdDxUPiB0byBzdHJpY3RseSBhbiBhcnJheSBvZiBpdHMgVCBpdGVtcy5cbiAgLy8gICovXG4gIC8vIHN0YXRpYyBtaXhlZExpc3RUb0FycmF5PFQ+KGxpc3Q6IE1peGVkTGlzdDxUPik6IFRbXSB7XG4gIC8vICAgaWYgKGxpc3QgIT09IG51bGwgJiYgdHlwZW9mIGxpc3QgPT09IFwib2JqZWN0XCIpIHtcbiAgLy8gICAgIHJldHVybiBPYmplY3Qua2V5cyhsaXN0KS5tYXAoXG4gIC8vICAgICAgIChrZXkpID0+IChsaXN0IGFzIHsgW2tleTogc3RyaW5nXTogVCB9KVtrZXldXG4gIC8vICAgICApO1xuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICByZXR1cm4gbGlzdDtcbiAgLy8gICB9XG4gIC8vIH1cbn1cbiIsImltcG9ydCB7IFJlbGF0aW9uT3B0aW9ucywgZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSwgT2JqZWN0VHlwZSB9IGZyb20gXCJ0eXBlb3JtXCI7XG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gXCIuL09iamVjdFV0aWxzXCI7XG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhQXJncyB9IGZyb20gXCJ0eXBlb3JtL21ldGFkYXRhLWFyZ3MvUmVsYXRpb25NZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uLCBleHRyYWN0Rm9yUmVsYXRpb25zIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBPbmUtdG8tb25lIHJlbGF0aW9uIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgYSBkaXJlY3QgcmVsYXRpb24gYmV0d2VlbiB0d28gZW50aXRpZXMuIEVudGl0eTEgaGFzIG9ubHkgb25lIEVudGl0eTIuXG4gKiBFbnRpdHkxIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIEVudGl0eTIgaWQgb24gaXRzIG93biBzaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT25lVG9PbmU8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBPbmUtdG8tb25lIHJlbGF0aW9uIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgYSBkaXJlY3QgcmVsYXRpb24gYmV0d2VlbiB0d28gZW50aXRpZXMuIEVudGl0eTEgaGFzIG9ubHkgb25lIEVudGl0eTIuXG4gKiBFbnRpdHkxIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIEVudGl0eTIgaWQgb24gaXRzIG93biBzaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT25lVG9PbmU8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZT86IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBPbmUtdG8tb25lIHJlbGF0aW9uIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgYSBkaXJlY3QgcmVsYXRpb24gYmV0d2VlbiB0d28gZW50aXRpZXMuIEVudGl0eTEgaGFzIG9ubHkgb25lIEVudGl0eTIuXG4gKiBFbnRpdHkxIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIEVudGl0eTIgaWQgb24gaXRzIG93biBzaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT25lVG9PbmU8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZU9yT3B0aW9ucz86IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpIHwgUmVsYXRpb25PcHRpb25zLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gIGxldCBpbnZlcnNlU2lkZVByb3BlcnR5OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KTtcbiAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KGludmVyc2VTaWRlT3JPcHRpb25zKSkge1xuICAgIG9wdGlvbnMgPSA8UmVsYXRpb25PcHRpb25zPmludmVyc2VTaWRlT3JPcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGludmVyc2VTaWRlUHJvcGVydHkgPSBpbnZlcnNlU2lkZU9yT3B0aW9ucyBhcyBhbnk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIFJlbGF0aW9uT3B0aW9ucztcblxuICAgIC8vIG5vdyB0cnkgdG8gZGV0ZXJtaW5lIGl0IGl0cyBsYXp5IHJlbGF0aW9uXG4gICAgbGV0IGlzTGF6eSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5sYXp5ID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlO1xuICAgIGlmICghaXNMYXp5ICYmIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YSkge1xuICAgICAgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgIGNvbnN0IHJlZmxlY3RlZFR5cGUgPSAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICByZWZsZWN0ZWRUeXBlICYmXG4gICAgICAgIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiXG4gICAgICApXG4gICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBleHRyYWN0Rm9yUmVsYXRpb25zKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBtZXRhLmNvbHVtbnMpXG4gICAgKTtcbiAgICBtZXRhLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJvbmUtdG8tb25lXCIsXG4gICAgICB0eXBlOiB0eXBlRnVuY3Rpb25PclRhcmdldCxcbiAgICAgIGludmVyc2VTaWRlUHJvcGVydHk6IGludmVyc2VTaWRlUHJvcGVydHksXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgUmVsYXRpb25NZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgUmVsYXRpb25PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCBPYmplY3RUeXBlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEZvclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG4vKipcbiAqIEEgb25lLXRvLW1hbnkgcmVsYXRpb24gYWxsb3dzIGNyZWF0aW5nIHRoZSB0eXBlIG9mIHJlbGF0aW9uIHdoZXJlIEVudGl0eTEgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTIsXG4gKiBidXQgRW50aXR5MiBoYXMgb25seSBvbmUgRW50aXR5MS4gRW50aXR5MiBpcyB0aGUgb3duZXIgb2YgdGhlIHJlbGF0aW9uc2hpcCwgYW5kIHN0b3JlcyB0aGUgaWQgb2YgRW50aXR5MSBvbiBpdHNcbiAqIHNpZGUgb2YgdGhlIHJlbGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gT25lVG9NYW55PFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgaW52ZXJzZVNpZGU6IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge30gYXMgUmVsYXRpb25PcHRpb25zO1xuXG4gICAgLy8gTm93IHRyeSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgYSBsYXp5IHJlbGF0aW9uLlxuICAgIGxldCBpc0xhenkgPSBvcHRpb25zICYmIG9wdGlvbnMubGF6eSA9PT0gdHJ1ZTtcbiAgICBpZiAoIWlzTGF6eSAmJiBSZWZsZWN0ICYmIChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEpIHtcbiAgICAgIC8vIGF1dG9tYXRpYyBkZXRlcm1pbmF0aW9uXG4gICAgICBjb25zdCByZWZsZWN0ZWRUeXBlID0gKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YShcbiAgICAgICAgXCJkZXNpZ246dHlwZVwiLFxuICAgICAgICBvYmplY3QsXG4gICAgICAgIHByb3BlcnR5TmFtZVxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgcmVmbGVjdGVkVHlwZSAmJlxuICAgICAgICB0eXBlb2YgcmVmbGVjdGVkVHlwZS5uYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgIHJlZmxlY3RlZFR5cGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInByb21pc2VcIlxuICAgICAgKVxuICAgICAgICBpc0xhenkgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBvcHRpb25zLFxuICAgICAgZXh0cmFjdEZvclJlbGF0aW9ucyhvYmplY3QuY29uc3RydWN0b3IsIHByb3BlcnR5TmFtZSwgbWV0YS5jb2x1bW5zKVxuICAgICk7XG4gICAgbWV0YS5yZWxhdGlvbnMucHVzaCh7XG4gICAgICB0YXJnZXQ6IG9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgLy8gcHJvcGVydHlUeXBlOiByZWZsZWN0ZWRUeXBlLFxuICAgICAgaXNMYXp5OiBpc0xhenksXG4gICAgICByZWxhdGlvblR5cGU6IFwib25lLXRvLW1hbnlcIixcbiAgICAgIHR5cGU6IHR5cGVGdW5jdGlvbk9yVGFyZ2V0LFxuICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eTogaW52ZXJzZVNpZGUsXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgUmVsYXRpb25NZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgUmVsYXRpb25PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCBPYmplY3RUeXBlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEZvclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG4vKipcbiAqIEEgbWFueS10by1vbmUgcmVsYXRpb24gYWxsb3dzIGNyZWF0aW5nIHRoZSB0eXBlIG9mIHJlbGF0aW9uIHdoZXJlIEVudGl0eTEgY2FuIGhhdmUgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgRW50aXR5MiwgYnV0XG4gKiBFbnRpdHkyIGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkxLiBFbnRpdHkxIGlzIHRoZSBvd25lciBvZiB0aGUgcmVsYXRpb25zaGlwLCBhbmQgc3RvcmVzIHRoZSBpZCBvZlxuICogRW50aXR5MiBvbiBpdHMgc2lkZSBvZiB0aGUgcmVsYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYW55VG9PbmU8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBBIG1hbnktdG8tb25lIHJlbGF0aW9uIGFsbG93cyBjcmVhdGluZyB0aGUgdHlwZSBvZiByZWxhdGlvbiB3aGVyZSBFbnRpdHkxIGNhbiBoYXZlIGEgc2luZ2xlIGluc3RhbmNlIG9mIEVudGl0eTIsIGJ1dFxuICogRW50aXR5MiBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MS4gRW50aXR5MSBpcyB0aGUgb3duZXIgb2YgdGhlIHJlbGF0aW9uc2hpcCwgYW5kIHN0b3JlcyB0aGUgaWQgb2ZcbiAqIEVudGl0eTIgb24gaXRzIHNpZGUgb2YgdGhlIHJlbGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFueVRvT25lPFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgaW52ZXJzZVNpZGU/OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KSxcbiAgb3B0aW9ucz86IFJlbGF0aW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQSBtYW55LXRvLW9uZSByZWxhdGlvbiBhbGxvd3MgY3JlYXRpbmcgdGhlIHR5cGUgb2YgcmVsYXRpb24gd2hlcmUgRW50aXR5MSBjYW4gaGF2ZSBhIHNpbmdsZSBpbnN0YW5jZSBvZiBFbnRpdHkyLCBidXRcbiAqIEVudGl0eTIgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIEVudGl0eTEgaXMgdGhlIG93bmVyIG9mIHRoZSByZWxhdGlvbnNoaXAsIGFuZCBzdG9yZXMgdGhlIGlkIG9mXG4gKiBFbnRpdHkyIG9uIGl0cyBzaWRlIG9mIHRoZSByZWxhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hbnlUb09uZTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlT3JPcHRpb25zPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSkgfCBSZWxhdGlvbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgLy8gTm9ybWFsaXplIHBhcmFtZXRlcnMuXG4gIGxldCBpbnZlcnNlU2lkZVByb3BlcnR5OiBzdHJpbmcgfCAoKG9iamVjdDogVCkgPT4gYW55KTtcbiAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KGludmVyc2VTaWRlT3JPcHRpb25zKSkge1xuICAgIG9wdGlvbnMgPSA8UmVsYXRpb25PcHRpb25zPmludmVyc2VTaWRlT3JPcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGludmVyc2VTaWRlUHJvcGVydHkgPSBpbnZlcnNlU2lkZU9yT3B0aW9ucyBhcyBhbnk7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9IGFzIFJlbGF0aW9uT3B0aW9ucztcblxuICAgIC8vIE5vdyB0cnkgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGEgbGF6eSByZWxhdGlvbi5cbiAgICBsZXQgaXNMYXp5ID0gb3B0aW9ucyAmJiBvcHRpb25zLmxhenkgPT09IHRydWU7XG4gICAgaWYgKCFpc0xhenkgJiYgUmVmbGVjdCAmJiAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKSB7XG4gICAgICAvLyBhdXRvbWF0aWMgZGV0ZXJtaW5hdGlvblxuICAgICAgY29uc3QgcmVmbGVjdGVkVHlwZSA9IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eU5hbWVcbiAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIHJlZmxlY3RlZFR5cGUgJiZcbiAgICAgICAgdHlwZW9mIHJlZmxlY3RlZFR5cGUubmFtZSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICByZWZsZWN0ZWRUeXBlLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwcm9taXNlXCJcbiAgICAgIClcbiAgICAgICAgaXNMYXp5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgb3B0aW9ucyxcbiAgICAgIGV4dHJhY3RGb3JSZWxhdGlvbnMob2JqZWN0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eU5hbWUsIG1ldGEuY29sdW1ucylcbiAgICApO1xuICAgIG1ldGEucmVsYXRpb25zLnB1c2goe1xuICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHByb3BlcnR5TmFtZSxcbiAgICAgIC8vIHByb3BlcnR5VHlwZTogcmVmbGVjdGVkVHlwZSxcbiAgICAgIHJlbGF0aW9uVHlwZTogXCJtYW55LXRvLW9uZVwiLFxuICAgICAgaXNMYXp5OiBpc0xhenksXG4gICAgICB0eXBlOiB0eXBlRnVuY3Rpb25PclRhcmdldCxcbiAgICAgIGludmVyc2VTaWRlUHJvcGVydHk6IGludmVyc2VTaWRlUHJvcGVydHksXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH0gYXMgUmVsYXRpb25NZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHsgUmVsYXRpb25PcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLCBPYmplY3RUeXBlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcbmltcG9ydCB7IFJlbGF0aW9uTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9SZWxhdGlvbk1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgZXh0cmFjdEZvclJlbGF0aW9ucyB9IGZyb20gXCIuL3V0aWxzXCI7XG4vKipcbiAqIE1hbnktdG8tbWFueSBpcyBhIHR5cGUgb2YgcmVsYXRpb25zaGlwIHdoZW4gRW50aXR5MSBjYW4gaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MiwgYW5kIEVudGl0eTIgY2FuIGhhdmVcbiAqIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkxLiBUbyBhY2hpZXZlIGl0LCB0aGlzIHR5cGUgb2YgcmVsYXRpb24gY3JlYXRlcyBhIGp1bmN0aW9uIHRhYmxlLCB3aGVyZSBpdCBzdG9yYWdlXG4gKiBlbnRpdHkxIGFuZCBlbnRpdHkyIGlkcy4gVGhpcyBpcyBvd25lciBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBNYW55VG9NYW55PFQ+KFxuICB0eXBlRnVuY3Rpb25PclRhcmdldDogc3RyaW5nIHwgKCh0eXBlPzogYW55KSA9PiBPYmplY3RUeXBlPFQ+KSxcbiAgb3B0aW9ucz86IFJlbGF0aW9uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogTWFueS10by1tYW55IGlzIGEgdHlwZSBvZiByZWxhdGlvbnNoaXAgd2hlbiBFbnRpdHkxIGNhbiBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBvZiBFbnRpdHkyLCBhbmQgRW50aXR5MiBjYW4gaGF2ZVxuICogbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTEuIFRvIGFjaGlldmUgaXQsIHRoaXMgdHlwZSBvZiByZWxhdGlvbiBjcmVhdGVzIGEganVuY3Rpb24gdGFibGUsIHdoZXJlIGl0IHN0b3JhZ2VcbiAqIGVudGl0eTEgYW5kIGVudGl0eTIgaWRzLiBUaGlzIGlzIG93bmVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1hbnlUb01hbnk8VD4oXG4gIHR5cGVGdW5jdGlvbk9yVGFyZ2V0OiBzdHJpbmcgfCAoKHR5cGU/OiBhbnkpID0+IE9iamVjdFR5cGU8VD4pLFxuICBpbnZlcnNlU2lkZT86IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpLFxuICBvcHRpb25zPzogUmVsYXRpb25PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBNYW55LXRvLW1hbnkgaXMgYSB0eXBlIG9mIHJlbGF0aW9uc2hpcCB3aGVuIEVudGl0eTEgY2FuIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVudGl0eTIsIGFuZCBFbnRpdHkyIGNhbiBoYXZlXG4gKiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgRW50aXR5MS4gVG8gYWNoaWV2ZSBpdCwgdGhpcyB0eXBlIG9mIHJlbGF0aW9uIGNyZWF0ZXMgYSBqdW5jdGlvbiB0YWJsZSwgd2hlcmUgaXQgc3RvcmFnZVxuICogZW50aXR5MSBhbmQgZW50aXR5MiBpZHMuIFRoaXMgaXMgb3duZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gTWFueVRvTWFueTxUPihcbiAgdHlwZUZ1bmN0aW9uT3JUYXJnZXQ6IHN0cmluZyB8ICgodHlwZT86IGFueSkgPT4gT2JqZWN0VHlwZTxUPiksXG4gIGludmVyc2VTaWRlT3JPcHRpb25zPzogc3RyaW5nIHwgKChvYmplY3Q6IFQpID0+IGFueSkgfCBSZWxhdGlvbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBSZWxhdGlvbk9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgLy8gbm9ybWFsaXplIHBhcmFtZXRlcnNcbiAgbGV0IGludmVyc2VTaWRlUHJvcGVydHk6IHN0cmluZyB8ICgob2JqZWN0OiBUKSA9PiBhbnkpO1xuICBpZiAoT2JqZWN0VXRpbHMuaXNPYmplY3QoaW52ZXJzZVNpZGVPck9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucyA9IDxSZWxhdGlvbk9wdGlvbnM+aW52ZXJzZVNpZGVPck9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgaW52ZXJzZVNpZGVQcm9wZXJ0eSA9IGludmVyc2VTaWRlT3JPcHRpb25zIGFzIGFueTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0OiBhbnksIHByb3BlcnR5TmFtZTogYW55KSB7XG4gICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge30gYXMgUmVsYXRpb25PcHRpb25zO1xuXG4gICAgLy8gbm93IHRyeSB0byBkZXRlcm1pbmUgaXQgaXRzIGxhenkgcmVsYXRpb25cbiAgICBsZXQgaXNMYXp5ID0gb3B0aW9ucy5sYXp5ID09PSB0cnVlO1xuICAgIGlmICghaXNMYXp5ICYmIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YSkge1xuICAgICAgLy8gYXV0b21hdGljIGRldGVybWluYXRpb25cbiAgICAgIGNvbnN0IHJlZmxlY3RlZFR5cGUgPSAoUmVmbGVjdCBhcyBhbnkpLmdldE1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcHJvcGVydHlOYW1lXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICByZWZsZWN0ZWRUeXBlICYmXG4gICAgICAgIHR5cGVvZiByZWZsZWN0ZWRUeXBlLm5hbWUgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgcmVmbGVjdGVkVHlwZS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwicHJvbWlzZVwiXG4gICAgICApXG4gICAgICAgIGlzTGF6eSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKTtcbiAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBleHRyYWN0Rm9yUmVsYXRpb25zKG9iamVjdC5jb25zdHJ1Y3RvciwgcHJvcGVydHlOYW1lLCBtZXRhLmNvbHVtbnMpXG4gICAgKTtcbiAgICBtZXRhLnJlbGF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICAvLyBwcm9wZXJ0eVR5cGU6IHJlZmxlY3RlZFR5cGUsXG4gICAgICByZWxhdGlvblR5cGU6IFwibWFueS10by1tYW55XCIsXG4gICAgICBpc0xhenk6IGlzTGF6eSxcbiAgICAgIHR5cGU6IHR5cGVGdW5jdGlvbk9yVGFyZ2V0LFxuICAgICAgaW52ZXJzZVNpZGVQcm9wZXJ0eTogaW52ZXJzZVNpZGVQcm9wZXJ0eSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfSBhcyBSZWxhdGlvbk1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5OdW1lcmljT3B0aW9uc1wiO1xuaW1wb3J0IHR5cGUgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kZWNvcmF0b3Ivb3B0aW9ucy9QcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcIjtcbmltcG9ydCB0eXBlIHsgUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9ucyB9IGZyb20gXCJ0eXBlb3JtL2RlY29yYXRvci9vcHRpb25zL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnNcIjtcbmltcG9ydCB7IENvbHVtbk9wdGlvbnMsIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UgfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgR2VuZXJhdGVkTWV0YWRhdGFBcmdzIH0gZnJvbSBcInR5cGVvcm0vbWV0YWRhdGEtYXJncy9HZW5lcmF0ZWRNZXRhZGF0YUFyZ3NcIjtcbmltcG9ydCB7IGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSBcIi4vT2JqZWN0VXRpbHNcIjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgb3B0aW9uczogUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gUHJpbWFyeUdlbmVyYXRlZENvbHVtbihcbiAgc3RyYXRlZ3k6IFwiaW5jcmVtZW50XCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneTogXCJ1dWlkXCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbik6IFByb3BlcnR5RGVjb3JhdG9yO1xuXG4vKipcbiAqIENvbHVtbiBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGEgc3BlY2lmaWMgY2xhc3MgcHJvcGVydHkgYXMgYSB0YWJsZSBjb2x1bW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKFxuICBzdHJhdGVneTogXCJyb3dpZFwiLFxuICBvcHRpb25zPzogUHJpbWFyeUdlbmVyYXRlZENvbHVtblVVSURPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5OiBcImlkZW50aXR5XCIsXG4gIG9wdGlvbnM/OiBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uSWRlbnRpdHlPcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFRoaXMgY29sdW1uIGNyZWF0ZXMgYW4gaW50ZWdlciBQUklNQVJZIENPTFVNTiB3aXRoIGdlbmVyYXRlZCBzZXQgdG8gdHJ1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oXG4gIHN0cmF0ZWd5T3JPcHRpb25zPzpcbiAgICB8IFwiaW5jcmVtZW50XCJcbiAgICB8IFwidXVpZFwiXG4gICAgfCBcInJvd2lkXCJcbiAgICB8IFwiaWRlbnRpdHlcIlxuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbk51bWVyaWNPcHRpb25zXG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uVVVJRE9wdGlvbnNcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5JZGVudGl0eU9wdGlvbnMsXG4gIG1heWJlT3B0aW9ucz86XG4gICAgfCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uTnVtZXJpY09wdGlvbnNcbiAgICB8IFByaW1hcnlHZW5lcmF0ZWRDb2x1bW5VVUlET3B0aW9uc1xuICAgIHwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbklkZW50aXR5T3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICAvLyBub3JtYWxpemUgcGFyYW1ldGVyc1xuICBjb25zdCBvcHRpb25zOiBDb2x1bW5PcHRpb25zID0ge307XG4gIGxldCBzdHJhdGVneTogXCJpbmNyZW1lbnRcIiB8IFwidXVpZFwiIHwgXCJyb3dpZFwiIHwgXCJpZGVudGl0eVwiO1xuICBpZiAoc3RyYXRlZ3lPck9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIHN0cmF0ZWd5T3JPcHRpb25zID09PSBcInN0cmluZ1wiKVxuICAgICAgc3RyYXRlZ3kgPSBzdHJhdGVneU9yT3B0aW9ucyBhc1xuICAgICAgICB8IFwiaW5jcmVtZW50XCJcbiAgICAgICAgfCBcInV1aWRcIlxuICAgICAgICB8IFwicm93aWRcIlxuICAgICAgICB8IFwiaWRlbnRpdHlcIjtcblxuICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChzdHJhdGVneU9yT3B0aW9ucykpIHtcbiAgICAgIHN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIjtcbiAgICAgIE9iamVjdC5hc3NpZ24ob3B0aW9ucywgc3RyYXRlZ3lPck9wdGlvbnMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdHJhdGVneSA9IFwiaW5jcmVtZW50XCI7XG4gIH1cbiAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KG1heWJlT3B0aW9ucykpIE9iamVjdC5hc3NpZ24ob3B0aW9ucywgbWF5YmVPcHRpb25zKTtcblxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIC8vIGlmIGNvbHVtbiB0eXBlIGlzIG5vdCBleHBsaWNpdGx5IHNldCB0aGVuIGRldGVybWluZSBpdCBiYXNlZCBvbiBnZW5lcmF0aW9uIHN0cmF0ZWd5XG4gICAgaWYgKCFvcHRpb25zLnR5cGUpIHtcbiAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJpbmNyZW1lbnRcIiB8fCBzdHJhdGVneSA9PT0gXCJpZGVudGl0eVwiKSB7XG4gICAgICAgIG9wdGlvbnMudHlwZSA9IE51bWJlcjtcbiAgICAgIH0gZWxzZSBpZiAoc3RyYXRlZ3kgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIG9wdGlvbnMudHlwZSA9IFwidXVpZFwiO1xuICAgICAgfSBlbHNlIGlmIChzdHJhdGVneSA9PT0gXCJyb3dpZFwiKSB7XG4gICAgICAgIG9wdGlvbnMudHlwZSA9IFwiaW50XCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXhwbGljaXRseSBzZXQgYSBwcmltYXJ5IGFuZCBnZW5lcmF0ZWQgdG8gY29sdW1uIG9wdGlvbnNcbiAgICBvcHRpb25zLnByaW1hcnkgPSB0cnVlO1xuXG4gICAgY29uc3QgbWV0YWRhdGEgPSBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlKCk7XG4gICAgYWdncmVnYXRlT3JOZXdDb2x1bW4oXG4gICAgICBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICBtZXRhZGF0YS5jb2x1bW5zLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIFwicmVndWxhclwiLFxuICAgICAgbWV0YWRhdGEucmVsYXRpb25zXG4gICAgKTtcbiAgICAvLyByZWdpc3RlciBnZW5lcmF0ZWQgbWV0YWRhdGEgYXJnc1xuICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5nZW5lcmF0aW9ucy5wdXNoKHtcbiAgICAgIHRhcmdldDogb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lOiBwcm9wZXJ0eU5hbWUsXG4gICAgICBzdHJhdGVneTogc3RyYXRlZ3ksXG4gICAgfSBhcyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgQ29sdW1uT3B0aW9ucyxcbiAgQ29sdW1uVHlwZSxcbiAgQ29sdW1uVHlwZVVuZGVmaW5lZEVycm9yLFxuICBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlLFxuICBQcmltYXJ5Q29sdW1uQ2Fubm90QmVOdWxsYWJsZUVycm9yLFxufSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZWRNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL0dlbmVyYXRlZE1ldGFkYXRhQXJnc1wiO1xuaW1wb3J0IHsgYWdncmVnYXRlT3JOZXdDb2x1bW4gfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERlc2NyaWJlcyBhbGwgcHJpbWFyeSBrZXkgY29sdW1uJ3Mgb3B0aW9ucy5cbiAqIElmIHNwZWNpZmllZCwgdGhlIG51bGxhYmxlIGZpZWxkIG11c3QgYmUgc2V0IHRvIGZhbHNlLlxuICovXG5leHBvcnQgdHlwZSBQcmltYXJ5Q29sdW1uT3B0aW9ucyA9IENvbHVtbk9wdGlvbnMgJiB7IG51bGxhYmxlPzogZmFsc2UgfTtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFByaW1hcnkgY29sdW1ucyBhbHNvIGNyZWF0ZXMgYSBQUklNQVJZIEtFWSBmb3IgdGhpcyBjb2x1bW4gaW4gYSBkYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlDb2x1bW4oXG4gIG9wdGlvbnM/OiBQcmltYXJ5Q29sdW1uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3I7XG5cbi8qKlxuICogQ29sdW1uIGRlY29yYXRvciBpcyB1c2VkIHRvIG1hcmsgYSBzcGVjaWZpYyBjbGFzcyBwcm9wZXJ0eSBhcyBhIHRhYmxlIGNvbHVtbi5cbiAqIE9ubHkgcHJvcGVydGllcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YWJhc2Ugd2hlbiBlbnRpdHkgYmUgc2F2ZWQuXG4gKiBQcmltYXJ5IGNvbHVtbnMgYWxzbyBjcmVhdGVzIGEgUFJJTUFSWSBLRVkgZm9yIHRoaXMgY29sdW1uIGluIGEgZGIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBQcmltYXJ5Q29sdW1uKFxuICB0eXBlPzogQ29sdW1uVHlwZSxcbiAgb3B0aW9ucz86IFByaW1hcnlDb2x1bW5PcHRpb25zXG4pOiBQcm9wZXJ0eURlY29yYXRvcjtcblxuLyoqXG4gKiBDb2x1bW4gZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBhIHNwZWNpZmljIGNsYXNzIHByb3BlcnR5IGFzIGEgdGFibGUgY29sdW1uLlxuICogT25seSBwcm9wZXJ0aWVzIGRlY29yYXRlZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhYmFzZSB3aGVuIGVudGl0eSBiZSBzYXZlZC5cbiAqIFByaW1hcnkgY29sdW1ucyBhbHNvIGNyZWF0ZXMgYSBQUklNQVJZIEtFWSBmb3IgdGhpcyBjb2x1bW4gaW4gYSBkYi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFByaW1hcnlDb2x1bW4oXG4gIHR5cGVPck9wdGlvbnM/OiBDb2x1bW5UeXBlIHwgUHJpbWFyeUNvbHVtbk9wdGlvbnMsXG4gIG9wdGlvbnM/OiBQcmltYXJ5Q29sdW1uT3B0aW9uc1xuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdDogYW55LCBwcm9wZXJ0eU5hbWU6IGFueSkge1xuICAgIC8vIG5vcm1hbGl6ZSBwYXJhbWV0ZXJzXG4gICAgbGV0IHR5cGU6IENvbHVtblR5cGUgfCB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHR5cGVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgIHR5cGVPck9wdGlvbnMgPT09IFN0cmluZyB8fFxuICAgICAgdHlwZU9yT3B0aW9ucyA9PT0gQm9vbGVhbiB8fFxuICAgICAgdHlwZU9yT3B0aW9ucyA9PT0gTnVtYmVyXG4gICAgKSB7XG4gICAgICB0eXBlID0gdHlwZU9yT3B0aW9ucyBhcyBDb2x1bW5UeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgPFByaW1hcnlDb2x1bW5PcHRpb25zPnR5cGVPck9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fSBhcyBQcmltYXJ5Q29sdW1uT3B0aW9ucztcblxuICAgIC8vIGlmIHR5cGUgaXMgbm90IGdpdmVuIGV4cGxpY2l0bHkgdGhlbiB0cnkgdG8gZ3Vlc3MgaXRcbiAgICBjb25zdCByZWZsZWN0TWV0YWRhdGFUeXBlID1cbiAgICAgIFJlZmxlY3QgJiYgKFJlZmxlY3QgYXMgYW55KS5nZXRNZXRhZGF0YVxuICAgICAgICA/IChSZWZsZWN0IGFzIGFueSkuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBvYmplY3QsIHByb3BlcnR5TmFtZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKCF0eXBlICYmIHJlZmxlY3RNZXRhZGF0YVR5cGUpIHR5cGUgPSByZWZsZWN0TWV0YWRhdGFUeXBlO1xuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgbm8gdHlwZSBpbiBjb2x1bW4gb3B0aW9ucyB0aGVuIHNldCB0eXBlIGZyb20gZmlyc3QgZnVuY3Rpb24gYXJndW1lbnQsIG9yIGd1ZXNzZWQgb25lXG4gICAgaWYgKCFvcHRpb25zLnR5cGUgJiYgdHlwZSkgb3B0aW9ucy50eXBlID0gdHlwZTtcblxuICAgIC8vIGlmIHdlIHN0aWxsIGRvbid0IGhhdmUgYSB0eXBlIHRoZW4gd2UgbmVlZCB0byBnaXZlIGVycm9yIHRvIHVzZXIgdGhhdCB0eXBlIGlzIHJlcXVpcmVkXG4gICAgaWYgKCFvcHRpb25zLnR5cGUpIHRocm93IG5ldyBDb2x1bW5UeXBlVW5kZWZpbmVkRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgLy8gY2hlY2sgaWYgY29sdW1uIGlzIG5vdCBudWxsYWJsZSwgYmVjYXVzZSB3ZSBjYW5ub3QgYWxsb3cgYSBwcmltYXJ5IGtleSB0byBiZSBudWxsYWJsZVxuICAgIGlmIChvcHRpb25zLm51bGxhYmxlKVxuICAgICAgdGhyb3cgbmV3IFByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3Iob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXG4gICAgLy8gZXhwbGljaXRseSBzZXQgYSBwcmltYXJ5IHRvIGNvbHVtbiBvcHRpb25zXG4gICAgb3B0aW9ucy5wcmltYXJ5ID0gdHJ1ZTtcblxuICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSgpO1xuICAgIGFnZ3JlZ2F0ZU9yTmV3Q29sdW1uKFxuICAgICAgb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgbWV0YWRhdGEuY29sdW1ucyxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBcInJlZ3VsYXJcIixcbiAgICAgIG1ldGFkYXRhLnJlbGF0aW9uc1xuICAgICk7XG5cbiAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZWQpIHtcbiAgICAgIGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS5nZW5lcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgdGFyZ2V0OiBvYmplY3QuY29uc3RydWN0b3IsXG4gICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLFxuICAgICAgICBzdHJhdGVneTpcbiAgICAgICAgICB0eXBlb2Ygb3B0aW9ucy5nZW5lcmF0ZWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8gb3B0aW9ucy5nZW5lcmF0ZWRcbiAgICAgICAgICAgIDogXCJpbmNyZW1lbnRcIixcbiAgICAgIH0gYXMgR2VuZXJhdGVkTWV0YWRhdGFBcmdzKTtcbiAgICB9XG4gIH07XG59XG4iLCJpbXBvcnQgeyBFbnRpdHlPcHRpb25zLCBnZXRNZXRhZGF0YUFyZ3NTdG9yYWdlIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB0eXBlIHsgVGFibGVNZXRhZGF0YUFyZ3MgfSBmcm9tIFwidHlwZW9ybS9tZXRhZGF0YS1hcmdzL1RhYmxlTWV0YWRhdGFBcmdzXCI7XG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gXCIuL09iamVjdFV0aWxzXCI7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KG9wdGlvbnM/OiBFbnRpdHlPcHRpb25zKTogQ2xhc3NEZWNvcmF0b3I7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM/OiBFbnRpdHlPcHRpb25zKTogQ2xhc3NEZWNvcmF0b3I7XG5cbi8qKlxuICogVGhpcyBkZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIGNsYXNzZXMgdGhhdCB3aWxsIGJlIGFuIGVudGl0eSAodGFibGUgb3IgZG9jdW1lbnQgZGVwZW5kIG9uIGRhdGFiYXNlIHR5cGUpLlxuICogRGF0YWJhc2Ugc2NoZW1hIHdpbGwgYmUgY3JlYXRlZCBmb3IgYWxsIGNsYXNzZXMgZGVjb3JhdGVkIHdpdGggaXQsIGFuZCBSZXBvc2l0b3J5IGNhbiBiZSByZXRyaWV2ZWQgYW5kIHVzZWQgZm9yIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KFxuICBuYW1lT3JPcHRpb25zPzogc3RyaW5nIHwgRW50aXR5T3B0aW9ucyxcbiAgbWF5YmVPcHRpb25zPzogRW50aXR5T3B0aW9uc1xuKTogQ2xhc3NEZWNvcmF0b3Ige1xuICBjb25zdCBvcHRpb25zID1cbiAgICAoT2JqZWN0VXRpbHMuaXNPYmplY3QobmFtZU9yT3B0aW9ucylcbiAgICAgID8gKG5hbWVPck9wdGlvbnMgYXMgRW50aXR5T3B0aW9ucylcbiAgICAgIDogbWF5YmVPcHRpb25zKSB8fCB7fTtcbiAgY29uc3QgbmFtZSA9IHR5cGVvZiBuYW1lT3JPcHRpb25zID09PSBcInN0cmluZ1wiID8gbmFtZU9yT3B0aW9ucyA6IG9wdGlvbnMubmFtZTtcblxuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGNvbnN0IHRhYmxlcyA9IGdldE1ldGFkYXRhQXJnc1N0b3JhZ2UoKS50YWJsZXM7XG4gICAgdGFibGVzLnB1c2goe1xuICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdHlwZTogXCJyZWd1bGFyXCIsXG4gICAgICBvcmRlckJ5OiBvcHRpb25zLm9yZGVyQnkgPyBvcHRpb25zLm9yZGVyQnkgOiB1bmRlZmluZWQsXG4gICAgICBlbmdpbmU6IG9wdGlvbnMuZW5naW5lID8gb3B0aW9ucy5lbmdpbmUgOiB1bmRlZmluZWQsXG4gICAgICBkYXRhYmFzZTogb3B0aW9ucy5kYXRhYmFzZSA/IG9wdGlvbnMuZGF0YWJhc2UgOiB1bmRlZmluZWQsXG4gICAgICBzY2hlbWE6IG9wdGlvbnMuc2NoZW1hID8gb3B0aW9ucy5zY2hlbWEgOiB1bmRlZmluZWQsXG4gICAgICBzeW5jaHJvbml6ZTogb3B0aW9ucy5zeW5jaHJvbml6ZSxcbiAgICAgIHdpdGhvdXRSb3dpZDogb3B0aW9ucy53aXRob3V0Um93aWQsXG4gICAgICBjb21tZW50OiBvcHRpb25zLmNvbW1lbnQgPyBvcHRpb25zLmNvbW1lbnQgOiB1bmRlZmluZWQsXG4gICAgfSBhcyBUYWJsZU1ldGFkYXRhQXJncyk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgTW9kZWxLZXlzLFxuICBWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5leHBvcnQgY29uc3QgT2JqZWN0S2V5U3BsaXR0ZXIgPSBcIi5cIjtcbmV4cG9ydCBjb25zdCBCYXNlS2V5ID0gXCJkZWNhZlwiO1xuXG5mdW5jdGlvbiBnZXRWYWx1ZUJ5U3BsaXR0ZXIoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGF0aDogc3RyaW5nLFxuICBzcGxpdHRlcjogc3RyaW5nID0gT2JqZWN0S2V5U3BsaXR0ZXJcbik6IGFueSB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KHNwbGl0dGVyKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmIChcbiAgICAgIGN1cnJlbnQgPT09IG51bGwgfHxcbiAgICAgIGN1cnJlbnQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpXG4gICAgKVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlQnlTcGxpdHRlcihcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4gIHNwbGl0dGVyID0gT2JqZWN0S2V5U3BsaXR0ZXJcbik6IHZvaWQge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChzcGxpdHRlcik7XG4gIGxldCBjdXJyZW50OiBSZWNvcmQ8YW55LCBhbnk+ID0gb2JqO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBpZiAoIShrZXkgaW4gY3VycmVudCkpIHtcbiAgICAgIGN1cnJlbnRba2V5XSA9IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xuICB9XG5cbiAgY3VycmVudFtrZXlzW2tleXMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XG59XG5cbmV4cG9ydCB0eXBlIE1vZGVsTWV0YWRhdGEgPSB7XG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHZhbGlkYXRpb24/OiBSZWNvcmQ8c3RyaW5nLCBhbnlbXT47XG4gIHJlbGF0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGdlbmVyYXRlZD86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHBrOiBzdHJpbmc7XG4gIGZrcz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGluZGV4ZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufTtcblxuZXhwb3J0IGNsYXNzIE1ldGFkYXRhIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX21ldGFkYXRhOiBSZWNvcmQ8c3ltYm9sLCBNb2RlbE1ldGFkYXRhPiA9IHt9O1xuXG4gIHN0YXRpYyBzcGxpdHRlciA9IE9iamVjdEtleVNwbGl0dGVyO1xuICBzdGF0aWMgYmFzZUtleSA9IEJhc2VLZXk7XG4gIHN0YXRpYyBtaXJyb3I6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIHN0YXRpYyBnZXRQcm9wZXJ0aWVzKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+KSB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMuZ2V0KG1vZGVsKTtcbiAgICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEucHJvcGVydGllcyk7XG4gIH1cblxuICBzdGF0aWMgcGsobW9kZWw6IENvbnN0cnVjdG9yPGFueT4pIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5nZXQobW9kZWwpO1xuICAgIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobWV0YS5waylbMF07XG4gIH1cblxuICBzdGF0aWMgdHlwZShtb2RlbDogQ29uc3RydWN0b3I8YW55PiwgcHJvcDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZXMobW9kZWwsIHByb3ApWzBdO1xuICB9XG5cbiAgc3RhdGljIHR5cGVzKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBwcm9wOiBzdHJpbmcpIHtcbiAgICBsZXQgZGVzaWduVHlwZTogYW55ID0gdGhpcy5nZXQobW9kZWwsIGBwcm9wZXJ0aWVzLiR7cHJvcH1gKTtcbiAgICBpZiAoIWRlc2lnblR5cGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5ICR7cHJvcH0gbm90IGZvdW5kIGluICR7bW9kZWwubmFtZX1gKTtcbiAgICBkZXNpZ25UeXBlID0gW2Rlc2lnblR5cGVdO1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IobW9kZWwudG9TdHJpbmcoKSk7XG4gICAgaWYgKHRoaXMuX21ldGFkYXRhW3N5bWJvbF0pIHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdO1xuICAgICAgaWYgKG1ldGEudmFsaWRhdGlvbikge1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gbWV0YS52YWxpZGF0aW9uO1xuICAgICAgICBpZiAodmFsaWRhdGlvbltWYWxpZGF0aW9uS2V5cy5UWVBFXSlcbiAgICAgICAgICBkZXNpZ25UeXBlID0gZGVzaWduVHlwZS5jb25jYXQodmFsaWRhdGlvbltWYWxpZGF0aW9uS2V5cy5UWVBFXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXNpZ25UeXBlLmZpbHRlcihCb29sZWFuKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQobW9kZWw6IENvbnN0cnVjdG9yPGFueT4pOiBNb2RlbE1ldGFkYXRhIHwgdW5kZWZpbmVkO1xuICBzdGF0aWMgZ2V0KG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBrZXk6IHN0cmluZyk6IGFueTtcbiAgc3RhdGljIGdldChtb2RlbDogQ29uc3RydWN0b3I8YW55Piwga2V5Pzogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihtb2RlbC50b1N0cmluZygpKTtcbiAgICBpZiAoIXRoaXMuX21ldGFkYXRhW3N5bWJvbF0pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKCFrZXkpIHJldHVybiB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdO1xuICAgIHJldHVybiBnZXRWYWx1ZUJ5U3BsaXR0ZXIodGhpcy5fbWV0YWRhdGFbc3ltYm9sXSwga2V5LCB0aGlzLnNwbGl0dGVyKTtcbiAgfVxuXG4gIHN0YXRpYyBzZXQobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihtb2RlbC50b1N0cmluZygpKTtcbiAgICBpZiAoIXRoaXMuX21ldGFkYXRhW3N5bWJvbF0pIHRoaXMuX21ldGFkYXRhW3N5bWJvbF0gPSB7fSBhcyBhbnk7XG4gICAgaWYgKFxuICAgICAgdGhpcy5taXJyb3IgJiZcbiAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIHRoaXMuYmFzZUtleSlcbiAgICApIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwgdGhpcy5iYXNlS2V5LCB7XG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiB0aGlzLl9tZXRhZGF0YVtzeW1ib2xdLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHNldFZhbHVlQnlTcGxpdHRlcih0aGlzLl9tZXRhZGF0YVtzeW1ib2xdLCBrZXksIHZhbHVlLCB0aGlzLnNwbGl0dGVyKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHJldHVybiBmdW5jdGlvbiBhc3NpZ24oXG4gICAgbW9kZWw6IG9iamVjdCxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHJvcD86IGFueSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZGVzY3JpcHRvcj86IFByb3BlcnR5RGVzY3JpcHRvclxuICApIHtcbiAgICBNZXRhZGF0YS5zZXQobW9kZWwgYXMgYW55LCBrZXksIHZhbHVlKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5KCkge1xuICByZXR1cm4gZnVuY3Rpb24gcHJvcGVydHkobW9kZWw6IG9iamVjdCwgcHJvcDogYW55KSB7XG4gICAgY29uc3QgZGVzaWduVHlwZSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoTW9kZWxLZXlzLlRZUEUsIG1vZGVsLCBwcm9wKTtcbiAgICByZXR1cm4gYXNzaWduKGBwcm9wZXJ0eS4ke3Byb3B9YCwgZGVzaWduVHlwZSkobW9kZWwsIHByb3ApO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgQWRhcHRlcixcbiAgQ2FzY2FkZSxcbiAgQ2FzY2FkZU1ldGFkYXRhLFxuICBDb25uZWN0aW9uRXJyb3IsXG4gIGZpbmFsLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxuICBSZXBvc2l0b3J5LFxuICBTZXF1ZW5jZSxcbiAgc2VxdWVuY2VOYW1lRm9yTW9kZWwsXG4gIHR5cGUgU2VxdWVuY2VPcHRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IHJlc2VydmVkQXR0cmlidXRlcywgVHlwZU9STUZsYXZvdXIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEJhc2VFcnJvcixcbiAgQ29uZmxpY3RFcnJvcixcbiAgQ29udGV4dCxcbiAgREJLZXlzLFxuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTIGFzIERCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgb25DcmVhdGVVcGRhdGUsXG4gIE9wZXJhdGlvbktleXMsXG4gIHJlYWRvbmx5LFxuICBVcGRhdGVWYWxpZGF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbnN0cnVjdG9yLFxuICBkYXRlLFxuICBEZWNvcmF0aW9uLFxuICBERUZBVUxUX0VSUk9SX01FU1NBR0VTLFxuICBsaXN0LFxuICBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNYXhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5MZW5ndGhWYWxpZGF0b3JPcHRpb25zLFxuICBNaW5WYWxpZGF0b3JPcHRpb25zLFxuICBNb2RlbCxcbiAgTW9kZWxLZXlzLFxuICBQYXR0ZXJuVmFsaWRhdG9yT3B0aW9ucyxcbiAgcHJvcCxcbiAgcHJvcE1ldGFkYXRhLFxuICByZXF1aXJlZCxcbiAgdHlwZSxcbiAgVHlwZU1ldGFkYXRhLFxuICBWYWxpZGF0aW9uLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdG9yT3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSW5kZXhFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgVHlwZU9STVN0YXRlbWVudCB9IGZyb20gXCIuL3F1ZXJ5XCI7XG5pbXBvcnQgeyBUeXBlT1JNU2VxdWVuY2UgfSBmcm9tIFwiLi9zZXF1ZW5jZXNcIjtcbmltcG9ydCB7IGdlbmVyYXRlSW5kZXhlcyB9IGZyb20gXCIuL2luZGV4ZXNcIjtcbmltcG9ydCB7IFR5cGVPUk1GbGFncywgVHlwZU9STVF1ZXJ5LCBUeXBlT1JNVGFibGVTcGVjIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGFwcGx5LCBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBUeXBlT1JNUmVwb3NpdG9yeSB9IGZyb20gXCIuL1R5cGVPUk1SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBUeXBlT1JNRGlzcGF0Y2ggfSBmcm9tIFwiLi9UeXBlT1JNRGlzcGF0Y2hcIjtcbmltcG9ydCB7IGNvbnZlcnRKc1JlZ2V4VG9Qb3N0Z3JlcyB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1xuICBEYXRhU291cmNlLFxuICBGaW5kT25lT3B0aW9ucyxcbiAgSW4sXG4gIEluc2VydFJlc3VsdCxcbiAgUmVsYXRpb25PcHRpb25zLFxuICBKb2luQ29sdW1uLFxuICBTZWxlY3RRdWVyeUJ1aWxkZXIsXG4gIFZlcnNpb25Db2x1bW4sXG4gIEpvaW5UYWJsZSxcbiAgQ29sdW1uVHlwZSxcbiAgQ29sdW1uT3B0aW9ucyxcbn0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB7IERhdGFTb3VyY2VPcHRpb25zIH0gZnJvbSBcInR5cGVvcm0vZGF0YS1zb3VyY2UvRGF0YVNvdXJjZU9wdGlvbnNcIjtcbmltcG9ydCB7IENvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9Db2x1bW5cIjtcbmltcG9ydCB7IFVwZGF0ZURhdGVDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvVXBkYXRlRGF0ZUNvbHVtblwiO1xuaW1wb3J0IHsgQ3JlYXRlRGF0ZUNvbHVtbiB9IGZyb20gXCIuL292ZXJyaWRlcy9DcmVhdGVEYXRlQ29sdW1uXCI7XG5pbXBvcnQgeyBPbmVUb09uZSB9IGZyb20gXCIuL292ZXJyaWRlcy9PbmVUb09uZVwiO1xuaW1wb3J0IHsgT25lVG9NYW55IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL09uZVRvTWFueVwiO1xuaW1wb3J0IHsgTWFueVRvT25lIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL01hbnlUb09uZVwiO1xuaW1wb3J0IHsgTWFueVRvTWFueSB9IGZyb20gXCIuL292ZXJyaWRlcy9NYW55VG9NYW55XCI7XG5pbXBvcnQgeyBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uIH0gZnJvbSBcIi4vb3ZlcnJpZGVzL1ByaW1hcnlHZW5lcmF0ZWRDb2x1bW5cIjtcbmltcG9ydCB7IFByaW1hcnlDb2x1bW4gfSBmcm9tIFwiLi9vdmVycmlkZXMvUHJpbWFyeUNvbHVtblwiO1xuaW1wb3J0IHsgRW50aXR5IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL0VudGl0eVwiO1xuaW1wb3J0IHsgYXNzaWduLCBNZXRhZGF0YSwgcHJvcGVydHkgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVkQnlPblR5cGVPUk1DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFR5cGVPUk1SZXBvc2l0b3J5PE0+LFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxUeXBlT1JNRmxhZ3M+LFxuICBkYXRhOiBhbnksXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHVzZXIgPSBjb250ZXh0LmdldChcInVzZXJcIik7XG4gICAgbW9kZWxba2V5XSA9IHVzZXIgYXMgTVt0eXBlb2Yga2V5XTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIFwiTm8gVXNlciBmb3VuZCBpbiBjb250ZXh0LiBQbGVhc2UgcHJvdmlkZSBhIHVzZXIgaW4gdGhlIGNvbnRleHRcIlxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgVHlwZU9STS1iYWNrZWQgcGVyc2lzdGVuY2Ugb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IEltcGxlbWVudHMgdGhlIERlY2FmLnRzIEFkYXB0ZXIgb3ZlciBhIFR5cGVPUk0gRGF0YVNvdXJjZSwgcHJvdmlkaW5nIENSVUQgb3BlcmF0aW9ucywgcXVlcnkvc3RhdGVtZW50IGZhY3Rvcmllcywgc2VxdWVuY2UgbWFuYWdlbWVudCwgZXJyb3IgcGFyc2luZywgYW5kIGRlY29yYXRpb24gaGVscGVycy5cbiAqIEB0ZW1wbGF0ZSBZIFRoZSBuYXRpdmUgY29uZmlndXJhdGlvbiB0eXBlIChUeXBlT1JNIERhdGFTb3VyY2VPcHRpb25zKS5cbiAqIEB0ZW1wbGF0ZSBGIFRoZSByZXBvc2l0b3J5IGZsYWdzIHR5cGUuXG4gKiBAdGVtcGxhdGUgQyBUaGUgY29udGV4dCB0eXBlLlxuICogQHBhcmFtIHtEYXRhU291cmNlT3B0aW9uc30gc2NvcGUgVGhlIERhdGFTb3VyY2Ugb3B0aW9ucyBmb3IgdGhlIGFkYXB0ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciBUaGUgZmxhdm91ciBvZiB0aGUgYWRhcHRlci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlci5cbiAqIEBjbGFzcyBUeXBlT1JNQWRhcHRlclxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgVHlwZU9STUFkYXB0ZXIoeyB0eXBlOiAncG9zdGdyZXMnLCAvKiAuLi4gKlxcLyB9KTtcbiAqIGF3YWl0IGFkYXB0ZXIuaW5pdGlhbGl6ZSgpO1xuICogY29uc3QgcmVwbyA9IG5ldyAoYWRhcHRlci5yZXBvc2l0b3J5PFVzZXI+KCkpKGFkYXB0ZXIsIFVzZXIpO1xuICogY29uc3QgY3JlYXRlZCA9IGF3YWl0IHJlcG8uY3JlYXRlKG5ldyBVc2VyKHsgbmFtZTogJ0FsaWNlJyB9KSk7XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBBcHBcbiAqICAgcGFydGljaXBhbnQgQWRhcHRlciBhcyBUeXBlT1JNQWRhcHRlclxuICogICBwYXJ0aWNpcGFudCBSZXBvIGFzIFR5cGVPUk1SZXBvc2l0b3J5XG4gKiAgIHBhcnRpY2lwYW50IERTIGFzIFR5cGVPUk0gRGF0YVNvdXJjZVxuICpcbiAqICAgQXBwLT4+QWRhcHRlcjogbmV3IFR5cGVPUk1BZGFwdGVyKG9wdHMpXG4gKiAgIEFkYXB0ZXItPj5EUzogaW5pdGlhbGl6ZSgpXG4gKiAgIEFwcC0+PkFkYXB0ZXI6IHJlcG9zaXRvcnkoKVxuICogICBBZGFwdGVyLS0+PkFwcDogVHlwZU9STVJlcG9zaXRvcnlcbiAqICAgQXBwLT4+UmVwbzogY3JlYXRlKG1vZGVsKVxuICogICBSZXBvLT4+QWRhcHRlcjogcHJlcGFyZS9jcmVhdGUvcmV2ZXJ0XG4gKiAgIEFkYXB0ZXItLT4+UmVwbzogTW9kZWxcbiAqICAgUmVwby0tPj5BcHA6IE1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNQWRhcHRlciBleHRlbmRzIEFkYXB0ZXI8XG4gIERhdGFTb3VyY2VPcHRpb25zLFxuICBUeXBlT1JNUXVlcnksXG4gIFR5cGVPUk1GbGFncyxcbiAgQ29udGV4dDxUeXBlT1JNRmxhZ3M+XG4+IHtcbiAgcHJpdmF0ZSBfZGF0YVNvdXJjZT86IERhdGFTb3VyY2U7XG5cbiAgZ2V0IGRhdGFTb3VyY2UoKTogRGF0YVNvdXJjZSB7XG4gICAgaWYgKCF0aGlzLl9kYXRhU291cmNlKSB7XG4gICAgICBjb25zdCBtb2RlbHMgPSBBZGFwdGVyLm1vZGVscyh0aGlzLmZsYXZvdXIpO1xuICAgICAgdGhpcy5fZGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlKFxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMubmF0aXZlLCB7XG4gICAgICAgICAgZW50aXRpZXM6IG1vZGVscy5tYXAoKGMpID0+IGNbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY10pLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XG4gIH1cbiAgLy8gcHJvdGVjdGVkIGRhdGFTb3VcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEYXRhU291cmNlT3B0aW9ucywgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihvcHRpb25zLCBUeXBlT1JNRmxhdm91ciwgYWxpYXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzLFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICBmbGFnczogUGFydGlhbDxUeXBlT1JNRmxhZ3M+XG4gICk6IFByb21pc2U8VHlwZU9STUZsYWdzPiB7XG4gICAgY29uc3QgZiA9IGF3YWl0IHN1cGVyLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIGZsYWdzKTtcbiAgICBjb25zdCBuZXdPYmo6IGFueSA9IHtcbiAgICAgIHVzZXI6IChhd2FpdCBUeXBlT1JNQWRhcHRlci5nZXRDdXJyZW50VXNlcih0aGlzLmRhdGFTb3VyY2UpKSBhcyBzdHJpbmcsXG4gICAgfTtcbiAgICBjb25zdCBtID0gbmV3IG1vZGVsKCk7XG5cbiAgICBjb25zdCBleGNlcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChvcGVyYXRpb24gPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFKSB7XG4gICAgICBjb25zdCBwayA9IGZpbmRQcmltYXJ5S2V5KG0pLmlkO1xuICAgICAgZXhjZXB0aW9ucy5wdXNoKHBrIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgb3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLkNSRUFURSB8fFxuICAgICAgb3BlcmF0aW9uID09PSBPcGVyYXRpb25LZXlzLlVQREFURVxuICAgICkge1xuICAgICAgY29uc3QgZGVjcyA9IE9iamVjdC5rZXlzKG0pLnJlZHVjZSgoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIGtleSkgPT4ge1xuICAgICAgICBjb25zdCBkZWNzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgICAgICBtLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGRlYyA9IGRlY3MuZGVjb3JhdG9ycy5maW5kKFxuICAgICAgICAgIChkZWM6IGFueSkgPT5cbiAgICAgICAgICAgIGRlYy5rZXkgPT09IERCS2V5cy5USU1FU1RBTVAgJiZcbiAgICAgICAgICAgIGRlYy5wcm9wcy5vcGVyYXRpb24uaW5kZXhPZihvcGVyYXRpb24pICE9PSAtMVxuICAgICAgICApO1xuICAgICAgICBpZiAoZGVjKSB7XG4gICAgICAgICAgYWNjdW1ba2V5XSA9IGRlYy5wcm9wcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGV4Y2VwdGlvbnMucHVzaCguLi5PYmplY3Qua2V5cyhkZWNzKSk7XG4gICAgfVxuXG4gICAgbmV3T2JqLmlnbm9yZWRWYWxpZGF0aW9uUHJvcGVydGllcyA9IChcbiAgICAgIGYuaWdub3JlZFZhbGlkYXRpb25Qcm9wZXJ0aWVzID8gZi5pZ25vcmVkVmFsaWRhdGlvblByb3BlcnRpZXMgOiBbXVxuICAgICkuY29uY2F0KC4uLmV4Y2VwdGlvbnMpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGYsIG5ld09iaikgYXMgVHlwZU9STUZsYWdzO1xuICB9XG5cbiAgQGZpbmFsKClcbiAgcHJvdGVjdGVkIG92ZXJyaWRlIERpc3BhdGNoKCk6IFR5cGVPUk1EaXNwYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBUeXBlT1JNRGlzcGF0Y2goKTtcbiAgfVxuXG4gIEBmaW5hbCgpXG4gIG92ZXJyaWRlIHJlcG9zaXRvcnk8TSBleHRlbmRzIE1vZGVsPigpOiBDb25zdHJ1Y3RvcjxUeXBlT1JNUmVwb3NpdG9yeTxNPj4ge1xuICAgIHJldHVybiBUeXBlT1JNUmVwb3NpdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBQb3N0Z3JlcyBzdGF0ZW1lbnQgZm9yIHF1ZXJ5aW5nXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBQb3N0Z3Jlc1N0YXRlbWVudCBpbnN0YW5jZSBmb3IgYnVpbGRpbmcgcXVlcmllc1xuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEByZXR1cm4ge1R5cGVPUk1TdGF0ZW1lbnQ8TSwgYW55Pn0gQSBuZXcgUG9zdGdyZXNTdGF0ZW1lbnQgaW5zdGFuY2VcbiAgICovXG4gIEBmaW5hbCgpXG4gIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KCk6IFR5cGVPUk1TdGF0ZW1lbnQ8TSwgYW55PiB7XG4gICAgcmV0dXJuIG5ldyBUeXBlT1JNU3RhdGVtZW50KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IFBvc3RncmVTUUwgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgRmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIGEgbmV3IFBvc3RncmVTUUxTZXF1ZW5jZSBpbnN0YW5jZSBmb3IgbWFuYWdpbmcgc2VxdWVuY2VzXG4gICAqIEBwYXJhbSB7U2VxdWVuY2VPcHRpb25zfSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNlcXVlbmNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBuZXcgU2VxdWVuY2UgaW5zdGFuY2VcbiAgICovXG4gIEBmaW5hbCgpXG4gIGFzeW5jIFNlcXVlbmNlKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyk6IFByb21pc2U8U2VxdWVuY2U+IHtcbiAgICByZXR1cm4gbmV3IFR5cGVPUk1TZXF1ZW5jZShvcHRpb25zLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGFkYXB0ZXIgYnkgY3JlYXRpbmcgaW5kZXhlcyBmb3IgYWxsIG1hbmFnZWQgbW9kZWxzXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgdGhlIG5lY2Vzc2FyeSBkYXRhYmFzZSBpbmRleGVzIGZvciBhbGwgbW9kZWxzIG1hbmFnZWQgYnkgdGhpcyBhZGFwdGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZHMgPSB0aGlzLmRhdGFTb3VyY2U7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGRzLmluaXRpYWxpemUoKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmluaXRpYWxpemUpO1xuICAgIGxvZy52ZXJib3NlKGAke3RoaXMuZmxhdm91cn0gYWRhcHRlciBpbml0aWFsaXplZGApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGluZGV4ZXMgZm9yIHRoZSBnaXZlbiBtb2RlbHNcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBjcmVhdGUgZGF0YWJhc2UgaW5kZXhlcyBmb3IgdGhlIHNwZWNpZmllZCBtb2RlbHNcbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAcGFyYW0gey4uLkNvbnN0cnVjdG9yPE0+fSBtb2RlbHMgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JzIHRvIGNyZWF0ZSBpbmRleGVzIGZvclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBpbmRleGVzIGFyZSBjcmVhdGVkXG4gICAqL1xuICBAZmluYWwoKVxuICBwcm90ZWN0ZWQgYXN5bmMgaW5kZXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICAuLi5tb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXhlczogVHlwZU9STVF1ZXJ5W10gPSBnZW5lcmF0ZUluZGV4ZXMobW9kZWxzKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2UucXVlcnkoXCJCRUdJTlwiKTtcblxuICAgICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5xdWVyeShpbmRleC5xdWVyeSwgaW5kZXgudmFsdWVzKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlLnF1ZXJ5KFwiQ09NTUlUXCIpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5xdWVyeShcIlJPTExCQUNLXCIpO1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgU1FMIHF1ZXJ5IGFnYWluc3QgdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZXhlY3V0ZSByYXcgU1FMIHF1ZXJpZXNcbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmVzdWx0IHR5cGVcbiAgICogQHBhcmFtIHtUeXBlT1JNUXVlcnl9IHEgLSBUaGUgcXVlcnkgdG8gZXhlY3V0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0XG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocTogVHlwZU9STVF1ZXJ5KTogUHJvbWlzZTxSPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmF3KTtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UuaXNJbml0aWFsaXplZCkgYXdhaXQgdGhpcy5kYXRhU291cmNlLmluaXRpYWxpemUoKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHF1ZXJ5LCB2YWx1ZXMgfSA9IHE7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBleGVjdXRpbmcgcXVlcnk6ICR7KHF1ZXJ5IGFzIHVua25vd24gYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLmdldFNxbCgpfWBcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZS5xdWVyeShxdWVyeSwgdmFsdWVzKTtcbiAgICAgIHJldHVybiByZXNwb25zZSBhcyBSO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBwcmVwYXJlPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgcGs6IGtleW9mIE0sXG4gICAgY2hpbGQgPSBmYWxzZVxuICApOiB7XG4gICAgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHJhbnNpZW50PzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfSB7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBzdXBlci5wcmVwYXJlKG1vZGVsLCBwayk7XG5cbiAgICBwcmVwYXJlZC5yZWNvcmQgPSBPYmplY3QuZW50cmllcyhwcmVwYXJlZC5yZWNvcmQpLnJlZHVjZShcbiAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IFBlcnNpc3RlbmNlS2V5cy5NRVRBREFUQSB8fCB0aGlzLmlzUmVzZXJ2ZWQoa2V5KSlcbiAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUuZ2V0VGltZSgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChNb2RlbC5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gdGhpcy5wcmVwYXJlKHZhbHVlLCBmaW5kUHJpbWFyeUtleSh2YWx1ZSkuaWQsIHRydWUpLnJlY29yZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICB2YWx1ZSA9IGAke3ZhbHVlfWA7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vZG8gbm90aGluZztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYWNjdW1ba2V5XSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICAgIGNvbnN0IGNvbnN0cjogQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZCA9IE1vZGVsLmdldChcbiAgICAgIG1vZGVsLmNvbnN0cnVjdG9yLm5hbWVcbiAgICApO1xuICAgIGlmICghY29uc3RyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBNb2RlbCAke21vZGVsLmNvbnN0cnVjdG9yLm5hbWV9IG5vdCBmb3VuZCBpbiByZWdpc3RyeWBcbiAgICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gY2hpbGRcbiAgICAgID8gbmV3IChjb25zdHIgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjb25zdHJdKClcbiAgICAgIDogbmV3IGNvbnN0cigpO1xuICAgIGlmIChjaGlsZClcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIFwiY29uc3RydWN0b3JcIiwge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IChjb25zdHIgYXMgYW55KVtNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjb25zdHJdLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICBPYmplY3QuZW50cmllcyhwcmVwYXJlZC5yZWNvcmQpLmZvckVhY2goXG4gICAgICAoW2tleSwgdmFsXSkgPT4gKHJlc3VsdFtrZXkgYXMga2V5b2YgdHlwZW9mIHJlc3VsdF0gPSB2YWwpXG4gICAgKTtcbiAgICBwcmVwYXJlZC5yZWNvcmQgPSByZXN1bHQ7XG4gICAgcmV0dXJuIHByZXBhcmVkO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmV2ZXJ0PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNsYXp6OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPixcbiAgICBwazoga2V5b2YgTSxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIHRyYW5zaWVudD86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogTSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucmV2ZXJ0KTtcbiAgICBpZiAodHJhbnNpZW50KSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYHJlLWFkZGluZyB0cmFuc2llbnQgcHJvcGVydGllczogJHtPYmplY3Qua2V5cyh0cmFuc2llbnQpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgT2JqZWN0LmVudHJpZXModHJhbnNpZW50KS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqKVxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYFRyYW5zaWVudCBwcm9wZXJ0eSAke2tleX0gYWxyZWFkeSBleGlzdHMgb24gbW9kZWwgJHt0eXBlb2YgY2xhenogPT09IFwic3RyaW5nXCIgPyBjbGF6eiA6IGNsYXp6Lm5hbWV9LiBzaG91bGQgYmUgaW1wb3NzaWJsZWBcbiAgICAgICAgICApO1xuICAgICAgICAob2JqIGFzIE0pW2tleSBhcyBrZXlvZiBNXSA9IHZhbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPE0+KShvYmopO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHJlY29yZCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBjcmVhdGUgYSBuZXcgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGVcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBpZCAtIFRoZSBJRCBvZiB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY3JlYXRlZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIHJldHVybiBhd2FpdCByZXBvLnNhdmUobW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlYWRzIGEgcmVjb3JkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gcmVhZCBhIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGsgLSBwcmltYXJ5IGtleSBjb2x1bVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVhZCByZWNvcmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBwazogc3RyaW5nXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIGNvbnN0IHE6IEZpbmRPbmVPcHRpb25zID0ge1xuICAgICAgICB3aGVyZToge1xuICAgICAgICAgIFtwa106IGlkLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIHJlc3VsdCA9IChhd2FpdCByZXBvLmZpbmRPbmUocSkpIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgICBpZiAoIXJlc3VsdClcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQ6ICR7aWR9IG5vdCBmb3VuZCBpbiB0YWJsZSAke3R5cGVvZiB0YWJsZU5hbWUgPT09IFwic3RyaW5nXCIgPyB0YWJsZU5hbWUgOiBSZXBvc2l0b3J5LnRhYmxlKHRhYmxlTmFtZSl9YFxuICAgICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgcmVjb3JkIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIHVwZGF0ZSBhIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGsgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgcmV0dXJuIHJlcG8uc2F2ZShtb2RlbCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlbGV0ZSBhIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgSUQgb2YgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGsgLSBBZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBkZWxldGVkIHJlY29yZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZGVsZXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgcGs6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgbTogQ29uc3RydWN0b3I8TW9kZWw+ID0gdGFibGVOYW1lIGFzIHVua25vd24gYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXBvID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkobSk7XG4gICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IHRoaXMucmVhZCh0YWJsZU5hbWUsIGlkLCBwayk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZXBvLmRlbGV0ZShpZCk7XG4gICAgICByZXR1cm4gbW9kZWw7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IG06IENvbnN0cnVjdG9yPE1vZGVsPiA9IHRhYmxlTmFtZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwbyA9IHRoaXMuZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KG0pO1xuICAgICAgY29uc3QgcmVzdWx0OiBJbnNlcnRSZXN1bHQgPSBhd2FpdCByZXBvLmluc2VydChtb2RlbCk7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkQWxsKFxuICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgIHJlc3VsdC5pZGVudGlmaWVycy5tYXAoKGlkKSA9PiBpZC5pZCksXG4gICAgICAgIFwiaWRcIlxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZEFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXSxcbiAgICBwazogc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGlmICghaWQubGVuZ3RoKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIHJldHVybiByZXBvLmZpbmRCeSh7IFtwa106IEluKGlkKSB9KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PltdLFxuICAgIHBrOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG0gb2YgbW9kZWwpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGF3YWl0IHRoaXMudXBkYXRlKHRhYmxlTmFtZSwgbVtwa10sIG0sIC4uLmFyZ3MpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW10sXG4gICAgcGs6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBpZiAoIWlkcy5sZW5ndGgpIHJldHVybiBbXTtcbiAgICBjb25zdCBtOiBDb25zdHJ1Y3RvcjxNb2RlbD4gPSB0YWJsZU5hbWUgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxNb2RlbD47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG8gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShtKTtcbiAgICAgIGNvbnN0IG1vZGVscyA9IGF3YWl0IHRoaXMucmVhZEFsbCh0YWJsZU5hbWUsIGlkcywgcGspO1xuICAgICAgYXdhaXQgcmVwby5kZWxldGUoaWRzKTtcbiAgICAgIHJldHVybiBtb2RlbHM7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuIGVycm9yIGFuZCBjb252ZXJ0cyBpdCB0byBhIEJhc2VFcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB2YXJpb3VzIGVycm9yIHR5cGVzIHRvIGFwcHJvcHJpYXRlIEJhc2VFcnJvciBzdWJ0eXBlc1xuICAgKiBAcGFyYW0ge0Vycm9yfHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIHBhcnNlZCBlcnJvciBhcyBhIEJhc2VFcnJvclxuICAgKi9cbiAgcGFyc2VFcnJvcihlcnI6IEVycm9yIHwgc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICAgIHJldHVybiBUeXBlT1JNQWRhcHRlci5wYXJzZUVycm9yKGVyciwgcmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGFuIGF0dHJpYnV0ZSBpcyByZXNlcnZlZFxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGFuIGF0dHJpYnV0ZSBuYW1lIGlzIHJlc2VydmVkIGluIFBvc3RncmVTUUxcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHIgLSBUaGUgYXR0cmlidXRlIG5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlc2VydmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBpc1Jlc2VydmVkKGF0dHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWF0dHIubWF0Y2gocmVzZXJ2ZWRBdHRyaWJ1dGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIG1ldGhvZCB0byBwYXJzZSBhbiBlcnJvciBhbmQgY29udmVydCBpdCB0byBhIEJhc2VFcnJvclxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB2YXJpb3VzIGVycm9yIHR5cGVzIHRvIGFwcHJvcHJpYXRlIEJhc2VFcnJvciBzdWJ0eXBlcyBiYXNlZCBvbiBQb3N0Z3JlU1FMIGVycm9yIGNvZGVzIGFuZCBtZXNzYWdlc1xuICAgKiBAcGFyYW0ge0Vycm9yfHN0cmluZ30gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVhc29uXSAtIE9wdGlvbmFsIHJlYXNvbiBmb3IgdGhlIGVycm9yXG4gICAqIEByZXR1cm4ge0Jhc2VFcnJvcn0gVGhlIHBhcnNlZCBlcnJvciBhcyBhIEJhc2VFcnJvclxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBwYXJzZUVycm9yXG4gICAqICAgcGFydGljaXBhbnQgRXJyb3JUeXBlc1xuICAgKlxuICAgKiAgIENhbGxlci0+PnBhcnNlRXJyb3I6IGVyciwgcmVhc29uXG4gICAqICAgTm90ZSBvdmVyIHBhcnNlRXJyb3I6IENoZWNrIGlmIGVyciBpcyBhbHJlYWR5IGEgQmFzZUVycm9yXG4gICAqICAgYWx0IGVyciBpcyBCYXNlRXJyb3JcbiAgICogICAgIHBhcnNlRXJyb3ItLT4+Q2FsbGVyOiByZXR1cm4gZXJyXG4gICAqICAgZWxzZSBlcnIgaXMgc3RyaW5nXG4gICAqICAgICBOb3RlIG92ZXIgcGFyc2VFcnJvcjogRXh0cmFjdCBjb2RlIGZyb20gc3RyaW5nXG4gICAqICAgICBhbHQgY29kZSBtYXRjaGVzIFwiZHVwbGljYXRlIGtleXxhbHJlYWR5IGV4aXN0c1wiXG4gICAqICAgICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgQ29uZmxpY3RFcnJvcihjb2RlKVxuICAgKiAgICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29uZmxpY3RFcnJvclxuICAgKiAgICAgZWxzZSBjb2RlIG1hdGNoZXMgXCJkb2VzIG5vdCBleGlzdHxub3QgZm91bmRcIlxuICAgKiAgICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IE5vdEZvdW5kRXJyb3IoY29kZSlcbiAgICogICAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IE5vdEZvdW5kRXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVsc2UgZXJyIGhhcyBjb2RlIHByb3BlcnR5XG4gICAqICAgICBOb3RlIG92ZXIgcGFyc2VFcnJvcjogRXh0cmFjdCBjb2RlIGFuZCByZWFzb25cbiAgICogICBlbHNlXG4gICAqICAgICBOb3RlIG92ZXIgcGFyc2VFcnJvcjogVXNlIGVyci5tZXNzYWdlIGFzIGNvZGVcbiAgICogICBlbmRcbiAgICpcbiAgICogICBOb3RlIG92ZXIgcGFyc2VFcnJvcjogU3dpdGNoIG9uIFBvc3RncmVTUUwgZXJyb3IgY29kZVxuICAgKiAgIGFsdCBjb2RlIGlzIDIzNTA1ICh1bmlxdWVfdmlvbGF0aW9uKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25mbGljdEVycm9yKHJlYXNvbilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgZWxzZSBjb2RlIGlzIDIzNTAzIChmb3JlaWduX2tleV92aW9sYXRpb24pXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IENvbmZsaWN0RXJyb3IocmVhc29uKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IENvbmZsaWN0RXJyb3JcbiAgICogICBlbHNlIGNvZGUgaXMgNDJQMDEgKHVuZGVmaW5lZF90YWJsZSlcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgTm90Rm91bmRFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogTm90Rm91bmRFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyA0MjcwMyAodW5kZWZpbmVkX2NvbHVtbilcbiAgICogICAgIHBhcnNlRXJyb3ItPj5FcnJvclR5cGVzOiBuZXcgTm90Rm91bmRFcnJvcihyZWFzb24pXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogTm90Rm91bmRFcnJvclxuICAgKiAgIGVsc2UgY29kZSBpcyA0MlAwNyAoZHVwbGljYXRlX3RhYmxlKVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBDb25mbGljdEVycm9yKHJlYXNvbilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBDb25mbGljdEVycm9yXG4gICAqICAgZWxzZSBjb2RlIGlzIDQyUDE2IChpbnZhbGlkX3RhYmxlX2RlZmluaXRpb24pXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IEluZGV4RXJyb3IoZXJyKVxuICAgKiAgICAgRXJyb3JUeXBlcy0tPj5DYWxsZXI6IEluZGV4RXJyb3JcbiAgICogICBlbHNlIGNvZGUgbWF0Y2hlcyBcIkVDT05OUkVGVVNFRFwiXG4gICAqICAgICBwYXJzZUVycm9yLT4+RXJyb3JUeXBlczogbmV3IENvbm5lY3Rpb25FcnJvcihlcnIpXG4gICAqICAgICBFcnJvclR5cGVzLS0+PkNhbGxlcjogQ29ubmVjdGlvbkVycm9yXG4gICAqICAgZWxzZVxuICAgKiAgICAgcGFyc2VFcnJvci0+PkVycm9yVHlwZXM6IG5ldyBJbnRlcm5hbEVycm9yKGVycilcbiAgICogICAgIEVycm9yVHlwZXMtLT4+Q2FsbGVyOiBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIHBhcnNlRXJyb3IoZXJyOiBFcnJvciB8IHN0cmluZywgcmVhc29uPzogc3RyaW5nKTogQmFzZUVycm9yIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgQmFzZUVycm9yKSByZXR1cm4gZXJyIGFzIGFueTtcbiAgICBjb25zdCBjb2RlOiBzdHJpbmcgPSB0eXBlb2YgZXJyID09PSBcInN0cmluZ1wiID8gZXJyIDogZXJyLm1lc3NhZ2U7XG5cbiAgICBpZiAoY29kZS5tYXRjaCgvZHVwbGljYXRlIGtleXxhbHJlYWR5IGV4aXN0cy9nKSlcbiAgICAgIHJldHVybiBuZXcgQ29uZmxpY3RFcnJvcihjb2RlKTtcbiAgICBpZiAoY29kZS5tYXRjaCgvZG9lcyBub3QgZXhpc3R8bm90IGZvdW5kL2cpKSByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IoY29kZSk7XG5cbiAgICAvLyBQb3N0Z3JlU1FMIGVycm9yIGNvZGVzOiBodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzL2N1cnJlbnQvZXJyY29kZXMtYXBwZW5kaXguaHRtbFxuICAgIHN3aXRjaCAoY29kZS50b1N0cmluZygpKSB7XG4gICAgICAvLyBJbnRlZ3JpdHkgY29uc3RyYWludCB2aW9sYXRpb25zXG4gICAgICBjYXNlIFwiMjM1MDVcIjogLy8gdW5pcXVlX3Zpb2xhdGlvblxuICAgICAgY2FzZSBcIjIzNTAzXCI6IC8vIGZvcmVpZ25fa2V5X3Zpb2xhdGlvblxuICAgICAgY2FzZSBcIjQyUDA3XCI6IC8vIGR1cGxpY2F0ZV90YWJsZVxuICAgICAgICByZXR1cm4gbmV3IENvbmZsaWN0RXJyb3IocmVhc29uIGFzIHN0cmluZyk7XG5cbiAgICAgIC8vIE9iamVjdCBub3QgZm91bmQgZXJyb3JzXG4gICAgICBjYXNlIFwiNDJQMDFcIjogLy8gdW5kZWZpbmVkX3RhYmxlXG4gICAgICBjYXNlIFwiNDI3MDNcIjogLy8gdW5kZWZpbmVkX2NvbHVtblxuICAgICAgICByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IocmVhc29uIGFzIHN0cmluZyk7XG5cbiAgICAgIC8vIEludmFsaWQgb2JqZWN0IGRlZmluaXRpb25cbiAgICAgIGNhc2UgXCI0MlAxNlwiOiAvLyBpbnZhbGlkX3RhYmxlX2RlZmluaXRpb25cbiAgICAgICAgcmV0dXJuIG5ldyBJbmRleEVycm9yKGVycik7XG5cbiAgICAgIC8vIENvbm5lY3Rpb24gZXJyb3JzXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoY29kZS50b1N0cmluZygpLm1hdGNoKC9FQ09OTlJFRlVTRUQvZykpXG4gICAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uRXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKGVycik7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNvbm5lY3QoY29uZmlnOiBEYXRhU291cmNlT3B0aW9ucyk6IFByb21pc2U8RGF0YVNvdXJjZT4ge1xuICAgIGNvbnN0IGNvbiA9IG5ldyBEYXRhU291cmNlKGNvbmZpZyk7XG4gICAgaWYgKCFjb24uaXNJbml0aWFsaXplZCkgYXdhaXQgY29uLmluaXRpYWxpemUoKTtcbiAgICByZXR1cm4gY29uO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZURhdGFiYXNlKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgZGJOYW1lOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcy5jcmVhdGVEYXRhYmFzZSk7XG4gICAgbG9nLnZlcmJvc2UoYENyZWF0aW5nIGRhdGFiYXNlICR7ZGJOYW1lfWApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBDUkVBVEUgREFUQUJBU0UgJHtkYk5hbWV9YCk7XG4gICAgICBsb2cuaW5mbyhgQ3JlYXRlZCBkYXRhYmFzZSAke2RiTmFtZX1gKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZU5vdGlmeUZ1bmN0aW9uKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgdXNlcjogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKHRoaXMuY3JlYXRlTm90aWZ5RnVuY3Rpb24pO1xuICAgIGxvZy52ZXJib3NlKGBDcmVhdGluZyBub3RpZnkgZnVuY3Rpb25gKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYENSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIG5vdGlmeV90YWJsZV9jaGFuZ2VzKClcblJFVFVSTlMgdHJpZ2dlciBBUyAkJFxuQkVHSU5cbiAgICBQRVJGT1JNIHBnX25vdGlmeShcbiAgICAgICAgJ3RhYmxlX2NoYW5nZXMnLFxuICAgICAgICBqc29uX2J1aWxkX29iamVjdChcbiAgICAgICAgICAgICd0YWJsZScsIFRHX1RBQkxFX05BTUUsXG4gICAgICAgICAgICAnYWN0aW9uJywgVEdfT1AsXG4gICAgICAgICAgICAnZGF0YScsIHJvd190b19qc29uKE5FVyksXG4gICAgICAgICAgICAnb2xkX2RhdGEnLCByb3dfdG9fanNvbihPTEQpXG4gICAgICAgICk6OnRleHRcbiAgICApO1xuICAgIFJFVFVSTiBORVc7XG5FTkQ7XG4kJCBMQU5HVUFHRSBwbHBnc3FsIFNFQ1VSSVRZIERFRklORVJcbjtgXG4gICAgICApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEFMVEVSIEZVTkNUSU9OIG5vdGlmeV90YWJsZV9jaGFuZ2VzKCkgT1dORVIgVE8gJHt1c2VyfTtgXG4gICAgICApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgXG4gICAgICAgICAgICBHUkFOVCBFWEVDVVRFIE9OIEZVTkNUSU9OIG5vdGlmeV90YWJsZV9jaGFuZ2VzKCkgVE8gcHVibGljO1xuICAgICAgICBgKTtcbiAgICAgIGxvZy5pbmZvKGBDcmVhdGVkIG5vdGlmeSBmdW5jdGlvbmApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZGVsZXRlRGF0YWJhc2UoXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBkYk5hbWU6IHN0cmluZyxcbiAgICB1c2VyPzogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAodXNlcikgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgRFJPUCBPV05FRCBCWSAke3VzZXJ9IENBU0NBREU7YCk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBEUk9QIERBVEFCQVNFICR7ZGJOYW1lfWApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlVXNlcihcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIGRiTmFtZTogc3RyaW5nLFxuICAgIHVzZXI6IHN0cmluZyxcbiAgICBwYXNzd29yZDogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBDUkVBVEUgVVNFUiAke3VzZXJ9IFdJVEggUEFTU1dPUkQgJyR7cGFzc3dvcmR9J2ApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShgR1JBTlQgQ09OTkVDVCBPTiBEQVRBQkFTRSAke2RiTmFtZX0gVE8gJHt1c2VyfWApO1xuXG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KGBHUkFOVCBVU0FHRSBPTiBTQ0hFTUEgcHVibGljIFRPICR7dXNlcn1gKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoYEdSQU5UIENSRUFURSBPTiBTQ0hFTUEgcHVibGljIFRPICR7dXNlcn1gKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgVEFCTEVTIElOIFNDSEVNQSBwdWJsaWMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFNFUVVFTkNFUyBJTiBTQ0hFTUEgcHVibGljIFRPICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5xdWVyeShcbiAgICAgICAgYEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBGVU5DVElPTlMgSU4gU0NIRU1BIHB1YmxpYyBUTyAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGRhdGFTb3VyY2UucXVlcnkoXG4gICAgICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgSU4gU0NIRU1BIHB1YmxpYyBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBUQUJMRVMgVE8gJHt1c2VyfWBcbiAgICAgICk7XG4gICAgICBhd2FpdCBkYXRhU291cmNlLnF1ZXJ5KFxuICAgICAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIElOIFNDSEVNQSBwdWJsaWMgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gU0VRVUVOQ0VTIFRPICR7dXNlcn1gXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZGVsZXRlVXNlcihcbiAgICBjbGllbnQ6IERhdGFTb3VyY2UsXG4gICAgdXNlcjogc3RyaW5nLFxuICAgIGFkbWluOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgUkVBU1NJR04gT1dORUQgQlkgJHt1c2VyfSBUTyAke2FkbWlufWApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgUkVWT0tFIEFMTCBPTiBBTEwgVEFCTEVTIElOIFNDSEVNQSBwdWJsaWMgRlJPTSAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgUkVWT0tFIEFMTCBPTiBTQ0hFTUEgcHVibGljIEZST00gJHt1c2VyfWApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgUkVWT0tFIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBTRVFVRU5DRVMgSU4gU0NIRU1BIHB1YmxpYyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgUkVWT0tFIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBGVU5DVElPTlMgSU4gU0NIRU1BIHB1YmxpYyBGUk9NICR7dXNlcn1gXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIEZPUiBST0xFICR7YWRtaW59IElOIFNDSEVNQSBwdWJsaWMgUkVWT0tFIEFMTCBPTiBUQUJMRVMgRlJPTSAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShcbiAgICAgICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBGT1IgUk9MRSAke2FkbWlufSBJTiBTQ0hFTUEgcHVibGljIFJFVk9LRSBBTEwgT04gU0VRVUVOQ0VTIEZST00gJHt1c2VyfTtgXG4gICAgICApO1xuICAgICAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgICAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIEZPUiBST0xFICR7YWRtaW59IElOIFNDSEVNQSBwdWJsaWMgUkVWT0tFIEFMTCBPTiBGVU5DVElPTlMgRlJPTSAke3VzZXJ9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgRFJPUCBPV05FRCBCWSAke3VzZXJ9IENBU0NBREVgKTtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShgRFJPUCBVU0VSIElGIEVYSVNUUyBcIiR7dXNlcn1cImApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZVR5cGVUb1Bvc3RncmVzKFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBpc1BrOiBib29sZWFuLFxuICAgIGlzRmsgPSBmYWxzZVxuICApIHtcbiAgICBzd2l0Y2ggKHR5cGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICByZXR1cm4gaXNQayA/IFwiVEVYVCBQUklNQVJZIEtFWVwiIDogaXNGayA/IFwiVEVYVFwiIDogXCJWQVJDSEFSXCI7XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgIHJldHVybiBpc1BrID8gXCJTRVJJQUwgUFJJTUFSWSBLRVlcIiA6IFwiSU5URUdFUlwiO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIFwiQk9PTEVBTlwiO1xuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgICAgcmV0dXJuIFwiVElNRVNUQU1QXCI7XG4gICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgIHJldHVybiBpc1BrID8gXCJCSUdJTlQgUFJJTUFSWSBLRVlcIiA6IFwiQklHSU5UXCI7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IG0gPSBNb2RlbC5nZXQodHlwZSk7XG4gICAgICAgIGlmIChtKSB7XG4gICAgICAgICAgY29uc3QgbW0gPSBuZXcgbSgpO1xuICAgICAgICAgIGNvbnN0IHR5cGUgPSBSZWZsZWN0aW9uLmdldFR5cGVGcm9tRGVjb3JhdG9yKFxuICAgICAgICAgICAgbW0sXG4gICAgICAgICAgICBmaW5kUHJpbWFyeUtleShtbSkuaWRcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb2RlbDogbSxcbiAgICAgICAgICAgIHBrVHlwZTogdHlwZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBVbnN1cHBvcnRlZCB0eXBlOiAke3R5cGV9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VWYWxpZGF0aW9uVG9Qb3N0Z3JlcyhcbiAgICBwcm9wOiBzdHJpbmcsXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGlzUGs6IGJvb2xlYW4sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgb3B0aW9uczogVmFsaWRhdG9yT3B0aW9uc1xuICApIHtcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRDpcbiAgICAgICAgcmV0dXJuIFwiTk9UIE5VTExcIjtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSDpcbiAgICAgICAgaWYgKGlzUGsgfHwgIW9wdGlvbnMgfHwgdHlwZS50b0xvd2VyQ2FzZSgpICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAoJHsob3B0aW9ucyBhcyBNYXhMZW5ndGhWYWxpZGF0b3JPcHRpb25zKVtWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXX0pYDtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSDpcbiAgICAgICAgcmV0dXJuIGBDT05TVFJBSU5UICR7cHJvcH1fbWluX2xlbmd0aF9jaGVjayBDSEVDSyAoTEVOR1RIKCR7cHJvcH0pID49ICR7KG9wdGlvbnMgYXMgTWluTGVuZ3RoVmFsaWRhdG9yT3B0aW9ucylbVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSF19KWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlBBVFRFUk46XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlVSTDpcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuRU1BSUw6XG4gICAgICAgIHJldHVybiBgQ09OU1RSQUlOVCAke3Byb3B9X3BhdHRlcm5fY2hlY2sgQ0hFQ0sgKCR7cHJvcH0gfiAnJHtjb252ZXJ0SnNSZWdleFRvUG9zdGdyZXMoKG9wdGlvbnMgYXMgUGF0dGVyblZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLlBBVFRFUk5dIGFzIHN0cmluZyl9JylgO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5UWVBFOlxuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5EQVRFOlxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIGNhc2UgVmFsaWRhdGlvbktleXMuTUlOOlxuICAgICAgICByZXR1cm4gYENPTlNUUkFJTlQgJHtwcm9wfV8ke2tleX1fY2hlY2sgQ0hFQ0sgKCR7cHJvcH0gPj0gJHsob3B0aW9ucyBhcyBNaW5WYWxpZGF0b3JPcHRpb25zKVtWYWxpZGF0aW9uS2V5cy5NSU5dfSlgO1xuICAgICAgY2FzZSBWYWxpZGF0aW9uS2V5cy5NQVg6XG4gICAgICAgIHJldHVybiBgQ09OU1RSQUlOVCAke3Byb3B9XyR7a2V5fV9jaGVjayBDSEVDSyAoJHtwcm9wfSA8PSAkeyhvcHRpb25zIGFzIE1heFZhbGlkYXRvck9wdGlvbnMpW1ZhbGlkYXRpb25LZXlzLk1BWF19KWA7XG4gICAgICBjYXNlIFZhbGlkYXRpb25LZXlzLlBBU1NXT1JEOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7a2V5fWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlUmVsYXRpb25zVG9Qb3N0Z3JlcyhcbiAgICBwcm9wOiBzdHJpbmcsXG4gICAgY2xheno6IENvbnN0cnVjdG9yPE1vZGVsPixcbiAgICBwazogc3RyaW5nLFxuICAgIGtleTogUGVyc2lzdGVuY2VLZXlzLFxuICAgIG9wdGlvbnM6IFJlbGF0aW9uc01ldGFkYXRhXG4gICkge1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUoY2xhenopO1xuICAgIGNvbnN0IHsgY2FzY2FkZSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjYXNjYWRlU3RyID0gYCR7Y2FzY2FkZS51cGRhdGUgPyBcIiBPTiBVUERBVEUgQ0FTQ0FERVwiIDogXCJcIn0ke2Nhc2NhZGUuZGVsZXRlID8gXCIgT04gREVMRVRFIENBU0NBREVcIiA6IFwiXCJ9YDtcbiAgICBzd2l0Y2ggKGByZWxhdGlvbnMke2tleX1gKSB7XG4gICAgICBjYXNlIFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fT05FOlxuICAgICAgICByZXR1cm4gYEZPUkVJR04gS0VZICgke3Byb3B9KSBSRUZFUkVOQ0VTICR7dGFibGVOYW1lfSgke3BrfSkke2Nhc2NhZGVTdHJ9YDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBVbnN1cHBvcnRlZCBvcGVyYXRpb246ICR7a2V5fWApO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVUYWJsZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIGNsaWVudDogRGF0YVNvdXJjZSxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBUeXBlT1JNVGFibGVTcGVjPj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgVHlwZU9STVRhYmxlU3BlYz4gPSB7fTtcbiAgICBjb25zdCBtID0gbmV3IG1vZGVsKHt9KTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKG1vZGVsKTtcbiAgICBjb25zdCB7IGlkIH0gPSBmaW5kUHJpbWFyeUtleShtKTtcblxuICAgIGxldCBpc1BrOiBib29sZWFuLCBjb2x1bW46IHN0cmluZztcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobSkgYXMgKGtleW9mIE0pW107XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BlcnRpZXMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mICh0aGlzIGFzIGFueSlbcHJvcF0gPT09IFwiZnVuY3Rpb25cIiB8fFxuICAgICAgICBwcm9wLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChcIl9cIikgfHxcbiAgICAgICAgcHJvcCA9PT0gXCJjb25zdHJ1Y3RvclwiXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlzUGsgPSBwcm9wID09PSBpZDtcbiAgICAgIGNvbHVtbiA9IFJlcG9zaXRvcnkuY29sdW1uKG0sIHByb3AudG9TdHJpbmcoKSk7XG5cbiAgICAgIGNvbnN0IGFsbERlY3MgPSBSZWZsZWN0aW9uLmdldFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgICAgbSxcbiAgICAgICAgcHJvcC50b1N0cmluZygpLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZGVjb3JhdG9yRGF0YSA9IGFsbERlY3MuZGVjb3JhdG9ycy5yZWR1Y2UoXG4gICAgICAgIChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgZWwpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGtleSwgcHJvcHMgfSA9IGVsO1xuICAgICAgICAgIGlmIChrZXkgPT09IE1vZGVsS2V5cy5UWVBFICYmICFhY2N1bVtWYWxpZGF0aW9uS2V5cy5UWVBFXSkge1xuICAgICAgICAgICAgYWNjdW1bVmFsaWRhdGlvbktleXMuVFlQRV0gPSB7XG4gICAgICAgICAgICAgIGN1c3RvbVR5cGVzOiBbcHJvcHMubmFtZSBhcyBzdHJpbmddLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBERUZBVUxUX0VSUk9SX01FU1NBR0VTLlRZUEUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcImRlZmluZXMgdGhlIGFjY2VwdGVkIHR5cGVzIGZvciB0aGUgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9PSBWYWxpZGF0aW9uS2V5cy5UWVBFKSB7XG4gICAgICAgICAgICAvLyBkbyBub3RoaW5nLiB3ZSBjYW4gb25seSBzdXBwb3J0IGJhc2lzIGN0eXBlcyBhdCB0aGlzIHRpbWVcbiAgICAgICAgICAgIGFjY3VtW2tleV0gPSBwcm9wcztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZGJEZWNzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgIFJlcG9zaXRvcnkua2V5KFwicmVsYXRpb25zXCIpLFxuICAgICAgICBtLFxuICAgICAgICBwcm9wLnRvU3RyaW5nKCksXG4gICAgICAgIHRydWUsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHF1ZXJ5OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgY29uc3QgY29uc3RyYWludHM6IHN0cmluZ1tdID0gW107XG4gICAgICBjb25zdCBmb3JlaWduS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICAgIGxldCB0eXBlRGF0YTogVHlwZU1ldGFkYXRhIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgbGV0IGNoaWxkQ2xhc3M6IENvbnN0cnVjdG9yPE1vZGVsPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAgIGxldCBjaGlsZFBrOiBhbnk7XG5cbiAgICAgIGlmIChPYmplY3Qua2V5cyhkZWNvcmF0b3JEYXRhKS5sZW5ndGgpIHtcbiAgICAgICAgdHlwZURhdGEgPSBkZWNvcmF0b3JEYXRhW1ZhbGlkYXRpb25LZXlzLlRZUEVdIGFzIFR5cGVNZXRhZGF0YTtcblxuICAgICAgICBpZiAoIXR5cGVEYXRhKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHR5cGUgaW5mb3JtYXRpb25gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXJzZWRUeXBlOlxuICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgfCB7IG1vZGVsOiBDb25zdHJ1Y3RvcjxNb2RlbD4gfCBzdHJpbmc7IHBrVHlwZT86IHN0cmluZyB9ID1cbiAgICAgICAgICB0aGlzLnBhcnNlVHlwZVRvUG9zdGdyZXMoXG4gICAgICAgICAgICB0eXBlb2YgKHR5cGVEYXRhLmN1c3RvbVR5cGVzIGFzIGFueVtdKVswXSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgID8gKHR5cGVEYXRhLmN1c3RvbVR5cGVzIGFzIGFueSlbMF0oKVxuICAgICAgICAgICAgICA6ICh0eXBlRGF0YS5jdXN0b21UeXBlcyBhcyBhbnkpWzBdLFxuICAgICAgICAgICAgaXNQa1xuICAgICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlb2YgcGFyc2VkVHlwZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHBhcnNlZFR5cGUgPSB7IG1vZGVsOiBwYXJzZWRUeXBlIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHR5cGVTdHI6XG4gICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICB8IHsgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPiB8IHN0cmluZzsgcGtUeXBlPzogc3RyaW5nIH0gPVxuICAgICAgICAgIHBhcnNlZFR5cGUubW9kZWwgYXNcbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8IHsgbW9kZWw6IENvbnN0cnVjdG9yPE1vZGVsPiB8IHN0cmluZzsgcGtUeXBlPzogc3RyaW5nIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3RyICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZVN0cikpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHR5cGVTdHIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGNvbnRpbnVlO1xuICAgICAgICAgIC8vIGNvbnN0IHJlczogUmVjb3JkPHN0cmluZywgUG9zdGdyZXNUYWJsZVNwZWM+ID0gYXdhaXQgdGhpcy5jcmVhdGVUYWJsZShwb29sLCB0eXBlU3RyKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2hpbGRDbGFzcyA9IHBhcnNlZFR5cGUubW9kZWwgYXMgQ29uc3RydWN0b3I8TW9kZWw+O1xuICAgICAgICAgICAgY29uc3QgbSA9IG5ldyBjaGlsZENsYXNzKCk7XG4gICAgICAgICAgICBjaGlsZFBrID0gZmluZFByaW1hcnlLZXkobSk7XG4gICAgICAgICAgICB0eXBlU3RyID0gdGhpcy5wYXJzZVR5cGVUb1Bvc3RncmVzKFxuICAgICAgICAgICAgICBwYXJzZWRUeXBlLnBrVHlwZSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVUYWJsZShjbGllbnQsIGNoaWxkQ2xhc3MpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBDb25mbGljdEVycm9yKSkgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHAgPSBBcnJheS5pc0FycmF5KHR5cGVEYXRhLmN1c3RvbVR5cGVzKVxuICAgICAgICAgID8gdHlwZURhdGEuY3VzdG9tVHlwZXNbMF1cbiAgICAgICAgICA6IHR5cGVEYXRhLmN1c3RvbVR5cGVzO1xuICAgICAgICB0cCA9IHR5cGVvZiB0cCA9PT0gXCJmdW5jdGlvblwiICYmICF0cC5uYW1lID8gdHAoKSA6IHRwO1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uU3RyID0gdGhpcy5wYXJzZVZhbGlkYXRpb25Ub1Bvc3RncmVzKFxuICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICB0cCBhcyBhbnksXG4gICAgICAgICAgaXNQayxcbiAgICAgICAgICBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RILFxuICAgICAgICAgIChkZWNvcmF0b3JEYXRhW1xuICAgICAgICAgICAgVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSFxuICAgICAgICAgIF0gYXMgTWF4TGVuZ3RoVmFsaWRhdG9yT3B0aW9ucykgfHwge1xuICAgICAgICAgICAgW1ZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEhdOiAyNTUsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHEgPSBgJHtjb2x1bW59ICR7dHlwZVN0cn0ke3ZhbGlkYXRpb25TdHJ9YDtcblxuICAgICAgICBpZiAoaXNQaykge1xuICAgICAgICAgIHF1ZXJ5LnVuc2hpZnQocSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcXVlcnkucHVzaChxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgcHJvcHNdIG9mIE9iamVjdC5lbnRyaWVzKGRlY29yYXRvckRhdGEpLmZpbHRlcihcbiAgICAgICAgICAoW2tdKSA9PlxuICAgICAgICAgICAgIVtWYWxpZGF0aW9uS2V5cy5UWVBFLCBWYWxpZGF0aW9uS2V5cy5NQVhfTEVOR1RIXS5pbmNsdWRlcyhrIGFzIGFueSlcbiAgICAgICAgKSkge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnBhcnNlVmFsaWRhdGlvblRvUG9zdGdyZXMoXG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgICB0cCBhcyBhbnksXG4gICAgICAgICAgICBpc1BrLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgcHJvcHNcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh2YWxpZGF0aW9uLnN0YXJ0c1dpdGgoXCJDT05TVFJBSU5UXCIpKSB7XG4gICAgICAgICAgICBjb25zdHJhaW50cy5wdXNoKHZhbGlkYXRpb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICBxdWVyeS5wdXNoKHZhbGlkYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUT0RPIGlnbm9yZSBmb3Igbm93LiB0aGlzIGxlYXZlcyBmb3JlaWduIGtleXMgb3V0XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtYmluYXJ5LWV4cHJlc3Npb25cbiAgICAgIGlmIChmYWxzZSB8fCAoZGJEZWNzICYmIGRiRGVjcy5kZWNvcmF0b3JzLmxlbmd0aCkpIHtcbiAgICAgICAgaWYgKCF0eXBlRGF0YSkgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHR5cGUgaW5mb3JtYXRpb25gKTtcbiAgICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGJEZWNzLmRlY29yYXRvcnMpIHtcbiAgICAgICAgICBjb25zdCB7IGtleSwgcHJvcHMgfSA9IGRlY29yYXRvcjtcbiAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gdGhpcy5wYXJzZVJlbGF0aW9uc1RvUG9zdGdyZXMoXG4gICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgICBjaGlsZENsYXNzIGFzIENvbnN0cnVjdG9yPE1vZGVsPixcbiAgICAgICAgICAgIGNoaWxkUGsuaWQsXG4gICAgICAgICAgICBrZXkgYXMgUGVyc2lzdGVuY2VLZXlzLFxuICAgICAgICAgICAgcHJvcHMgYXMgdW5rbm93biBhcyBSZWxhdGlvbnNNZXRhZGF0YVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHZhbGlkYXRpb24uc3RhcnRzV2l0aChcIkZPUkVJR05cIikpIHtcbiAgICAgICAgICAgIGZvcmVpZ25LZXlzLnB1c2godmFsaWRhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBVbnN1cHBvcnRlZCByZWxhdGlvbjogJHtrZXl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdFtwcm9wLnRvU3RyaW5nKCldID0ge1xuICAgICAgICBxdWVyeTogcXVlcnkuam9pbihcIiBcIiksXG4gICAgICAgIHZhbHVlczogW10sXG4gICAgICAgIHByaW1hcnlLZXk6IGlzUGssXG4gICAgICAgIGNvbnN0cmFpbnRzOiBjb25zdHJhaW50cyxcbiAgICAgICAgZm9yZWlnbktleXM6IGZvcmVpZ25LZXlzLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKHJlc3VsdCk7XG4gICAgY29uc3QgcXVlcnkgPSB2YWx1ZXMubWFwKChyKSA9PiByLnF1ZXJ5KS5qb2luKFwiLFxcblwiKTtcbiAgICBjb25zdCBjb25zdHJhaW50cyA9IHZhbHVlc1xuICAgICAgLmZpbHRlcigoYykgPT4gISFjLmNvbnN0cmFpbnRzLmxlbmd0aClcbiAgICAgIC5tYXAoKHIpID0+IHIuY29uc3RyYWludHMpXG4gICAgICAuam9pbihcIixcXG5cIik7XG4gICAgY29uc3QgZm9yZWlnbktleXMgPSB2YWx1ZXNcbiAgICAgIC5maWx0ZXIoKGMpID0+ICEhYy5mb3JlaWduS2V5cy5sZW5ndGgpXG4gICAgICAubWFwKChyKSA9PiByLmZvcmVpZ25LZXlzKVxuICAgICAgLmpvaW4oXCIsXFxuXCIpO1xuICAgIGNvbnN0IHZhbHMgPSBbcXVlcnksIGNvbnN0cmFpbnRzXTtcbiAgICBpZiAoZm9yZWlnbktleXMpIHtcbiAgICAgIHZhbHMucHVzaChmb3JlaWduS2V5cyk7XG4gICAgfVxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gYENSRUFURSBUQUJMRSAke3RhYmxlTmFtZX0gKCR7dmFscy5maWx0ZXIoKHYpID0+ICEhdikuam9pbihcIixcXG5cIil9KWA7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNsaWVudC5xdWVyeShxdWVyeVN0cmluZyk7XG4gICAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICAgIGBDUkVBVEUgVFJJR0dFUiBub3RpZnlfY2hhbmdlc18ke3RhYmxlTmFtZX1cbkFGVEVSIElOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIE9OICR7dGFibGVOYW1lfVxuICAgIEZPUiBFQUNIIFJPV1xuICAgIEVYRUNVVEUgRlVOQ1RJT04gbm90aWZ5X3RhYmxlX2NoYW5nZXMoKTtgXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRDdXJyZW50VXNlcihjbGllbnQ6IERhdGFTb3VyY2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gYFNFTEVDVCBDVVJSRU5UX1VTRVI7YDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnF1ZXJ5KHF1ZXJ5U3RyaW5nKTtcbiAgICAgIHJldHVybiByZXN1bHRbMF0uY3VycmVudF91c2VyO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZGVjb3JhdGlvbigpIHtcbiAgICBzdXBlci5kZWNvcmF0aW9uKCk7XG5cbiAgICAvLyBAdGFibGUoKSA9PiBARW50aXR5KClcbiAgICBjb25zdCB0YWJsZUtleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5UQUJMRSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IodGFibGVLZXkpXG4gICAgICAuZXh0ZW5kKChvcmlnaW5hbDogYW55KSA9PlxuICAgICAgICBFbnRpdHkoKShvcmlnaW5hbFtNb2RlbEtleXMuQU5DSE9SXSB8fCBvcmlnaW5hbClcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQHBrKCkgPT4gQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKSB8IEBQcmltYXJ5Q29sdW1uKClcbiAgICBjb25zdCBwa0tleSA9IFJlcG9zaXRvcnkua2V5KERCS2V5cy5JRCk7XG5cbiAgICBmdW5jdGlvbiBwa0RlYyhvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBwa0RlYyhvcmlnaW5hbDogYW55LCBwcm9wOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZGVjb3JhdG9yczogYW55W10gPSBbXG4gICAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgICByZWFkb25seSgpLFxuICAgICAgICAgIHByb3BNZXRhZGF0YShwa0tleSwgb3B0aW9ucyksXG4gICAgICAgICAgYXNzaWduKGBway4ke3Byb3B9YCwgb3B0aW9ucyksXG4gICAgICAgIF07XG4gICAgICAgIGxldCB0eXBlID1cbiAgICAgICAgICBvcHRpb25zLnR5cGUgfHwgUmVmbGVjdGlvbi5nZXRUeXBlRnJvbURlY29yYXRvcihvcmlnaW5hbCwgcHJvcCk7XG4gICAgICAgIGlmICghdHlwZSlcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBNaXNzaW5nIHR5cGUgaW5mb3JtYXRpb24gZm9yIHByb3BlcnR5ICR7cHJvcH0gb2YgJHtvcmlnaW5hbC5uYW1lfWBcbiAgICAgICAgICApO1xuICAgICAgICBpZiAob3B0aW9ucy5nZW5lcmF0ZWQpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gb3B0aW9ucy5uYW1lIHx8IHNlcXVlbmNlTmFtZUZvck1vZGVsKG9yaWdpbmFsLCBcInBrXCIpO1xuICAgICAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgICAgIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oe1xuICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3aXRjaCAodHlwZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgIHR5cGUgPSBcIm51bWVyaWNcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgIHR5cGUgPSBcInZhcmNoYXJcIjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgICAgICAgIHR5cGUgPSBcImJpZ2ludFwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBVbnN1cHBvcnRlZCB0eXBlOiAke3R5cGV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgICAgIFByaW1hcnlDb2x1bW4oe1xuICAgICAgICAgICAgICB0eXBlOiB0eXBlIGFzIENvbHVtblR5cGUsXG4gICAgICAgICAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHkoLi4uZGVjb3JhdG9ycykob3JpZ2luYWwsIHByb3ApO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihwa0tleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IHBrRGVjLFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IoTW9kZWxLZXlzLkFUVFJJQlVURSlcbiAgICAgIC5leHRlbmQocHJvcGVydHkoKSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQGNvbHVtbihcImNvbHVtbk5hbWVcIikgPT4gQENvbHVtbih7bmFtZTogXCJjb2x1bW5OYW1lXCJ9KVxuICAgIGNvbnN0IGNvbHVtbktleSA9IEFkYXB0ZXIua2V5KFBlcnNpc3RlbmNlS2V5cy5DT0xVTU4pO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKGNvbHVtbktleSlcbiAgICAgIC5leHRlbmQoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNvbHVtbShuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gY29sdW1uKG9iajogYW55LCBwcm9wOiBhbnkpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHM6IENvbHVtbk9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIGlmIChuYW1lKSBvcHRzLm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgY29uc3QgcGsgPSBNZXRhZGF0YS5nZXQob2JqLCBcInBrXCIpO1xuICAgICAgICAgICAgaWYgKHBrICE9PSBwcm9wKSB7XG4gICAgICAgICAgICAgIG9wdHMubnVsbGFibGUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIENvbHVtbihvcHRzKShvYmosIHByb3ApO1xuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybTogKGFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGFyZ3NbMV07XG4gICAgICAgICAgcmV0dXJuIFtjb2x1bW5OYW1lXTtcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEB1bmlxdWUgPT4gQENvbHVtbih7dW5pcXVlOiB0cnVlfSlcbiAgICBjb25zdCB1bmlxdWVLZXkgPSBBZGFwdGVyLmtleShQZXJzaXN0ZW5jZUtleXMuVU5JUVVFKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcih1bmlxdWVLZXkpXG4gICAgICAuZGVmaW5lKHByb3BNZXRhZGF0YSh1bmlxdWVLZXksIHt9KSlcbiAgICAgIC5leHRlbmQoQ29sdW1uKHsgdW5pcXVlOiB0cnVlIH0pKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAcmVxdWlyZWQgPT4gQENvbHVtbih7IG51bGxhYmxlOiBmYWxzZSB9KVxuICAgIGNvbnN0IHJlcXVpcmVkS2V5ID0gVmFsaWRhdGlvbi5rZXkoVmFsaWRhdGlvbktleXMuUkVRVUlSRUQpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHJlcXVpcmVkS2V5KVxuICAgICAgLmV4dGVuZChDb2x1bW4oeyBudWxsYWJsZTogZmFsc2UgfSkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIC8vIEB2ZXJzaW9uID0+IEBWZXJzaW9uQ29sdW1uKClcbiAgICBjb25zdCB2ZXJzaW9uS2V5ID0gUmVwb3NpdG9yeS5rZXkoREJLZXlzLlZFUlNJT04pO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHZlcnNpb25LZXkpXG4gICAgICAuZGVmaW5lKHR5cGUoTnVtYmVyLm5hbWUpLCBWZXJzaW9uQ29sdW1uKCkpXG4gICAgICAuYXBwbHkoKTtcblxuICAgIGZ1bmN0aW9uIFZhbGlkYXRpb25VcGRhdGVLZXkoa2V5OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBVcGRhdGVWYWxpZGF0aW9uS2V5cy5SRUZMRUNUICsga2V5O1xuICAgIH1cblxuICAgIC8vIEB0aW1lc3RhbXAob3ApID0+IEBDcmVhdGVEYXRlQ29sdW1uKCkgfHwgQFVwZGF0ZURhdGVDb2x1bW4oKVxuICAgIGNvbnN0IHRpbWVzdGFtcEtleSA9IFZhbGlkYXRpb25VcGRhdGVLZXkoREJLZXlzLlRJTUVTVEFNUCk7XG5cbiAgICBmdW5jdGlvbiB0cyhvcGVyYXRpb246IE9wZXJhdGlvbktleXNbXSwgZm9ybWF0OiBzdHJpbmcpIHtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnM6IGFueVtdID0gW1xuICAgICAgICBkYXRlKGZvcm1hdCwgREJfREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuREFURSksXG4gICAgICAgIHJlcXVpcmVkKERCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMuVElNRVNUQU1QLlJFUVVJUkVEKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKFZhbGlkYXRpb24ua2V5KERCS2V5cy5USU1FU1RBTVApLCB7XG4gICAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb24sXG4gICAgICAgICAgZm9ybWF0OiBmb3JtYXQsXG4gICAgICAgIH0pLFxuICAgICAgXTtcbiAgICAgIGlmIChvcGVyYXRpb24uaW5kZXhPZihPcGVyYXRpb25LZXlzLlVQREFURSkgIT09IC0xKVxuICAgICAgICBkZWNvcmF0b3JzLnB1c2goXG4gICAgICAgICAgcHJvcE1ldGFkYXRhKHRpbWVzdGFtcEtleSwge1xuICAgICAgICAgICAgbWVzc2FnZTogREJfREVGQVVMVF9FUlJPUl9NRVNTQUdFUy5USU1FU1RBTVAuSU5WQUxJRCxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgZWxzZSBkZWNvcmF0b3JzLnB1c2gocmVhZG9ubHkoKSk7XG4gICAgICByZXR1cm4gYXBwbHkoLi4uZGVjb3JhdG9ycyk7XG4gICAgfVxuXG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IodGltZXN0YW1wS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogdHMsXG4gICAgICB9KVxuICAgICAgLmV4dGVuZCh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gdGltZXN0YW1wKC4uLm9wczogT3BlcmF0aW9uS2V5c1tdKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHRpbWVzdGFtcChvYmo6IGFueSwgcHJvcDogYW55KSB7XG4gICAgICAgICAgICBpZiAob3BzLmluZGV4T2YoT3BlcmF0aW9uS2V5cy5VUERBVEUpICE9PSAtMSlcbiAgICAgICAgICAgICAgcmV0dXJuIFVwZGF0ZURhdGVDb2x1bW4oKShvYmosIHByb3ApO1xuICAgICAgICAgICAgcmV0dXJuIENyZWF0ZURhdGVDb2x1bW4oKShvYmosIHByb3ApO1xuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybTogKGFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGFyZ3NbMF07XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAb25lVG9PbmUoY2xhenopID0+IEBPbmVUb09uZSgoKSA9PiBjbGF6eilcbiAgICBjb25zdCBvbmVUb09uZUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5PTkVfVE9fT05FKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihvbmVUb09uZUtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG9uZVRvT25lKFxuICAgICAgICAgIGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pLFxuICAgICAgICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICAgICAgICBwb3B1bGF0ZTogYm9vbGVhblxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjbGFzczogKGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogY2xhenopIGFzIHN0cmluZyxcbiAgICAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICBjYXNjYWRlLnVwZGF0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFIHx8XG4gICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgb25VcGRhdGU6IGNhc2NhZGUudXBkYXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIHR5cGUoW1xuICAgICAgICAgICAgICAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWVcbiAgICAgICAgICAgICAgICA/IGNsYXp6XG4gICAgICAgICAgICAgICAgOiBjbGF6ei5uYW1lKSBhcyBhbnksXG4gICAgICAgICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShvbmVUb09uZUtleSwgbWV0YWRhdGEpLFxuICAgICAgICAgICAgT25lVG9PbmUoXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsIE1vZGVsIG5vdCBmb3VuZCBpbiBjb25zdHJ1Y3RvclwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGsgPSBmaW5kUHJpbWFyeUtleShuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCkpLmlkO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtwa107XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBKb2luQ29sdW1uKClcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQG9uZVRvTWFueShjbGF6eikgPT4gQE9uZVRvTWFueSgoKSA9PiBjbGF6eilcbiAgICBjb25zdCBvbmVUb01hbnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuT05FX1RPX01BTlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKG9uZVRvTWFueUtleSlcbiAgICAgIC5kZWZpbmUoe1xuICAgICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG9uZVRvTWFueShcbiAgICAgICAgICBjbGF6ejogQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSxcbiAgICAgICAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgICAgICAgcG9wdWxhdGU6IGJvb2xlYW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICAgICAgY2xhc3M6IChjbGF6ei5uYW1lID8gY2xhenoubmFtZSA6IGNsYXp6KSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIGxpc3QoY2xhenopLFxuICAgICAgICAgICAgcHJvcE1ldGFkYXRhKG9uZVRvTWFueUtleSwgbWV0YWRhdGEpLFxuICAgICAgICAgICAgZnVuY3Rpb24gT25lVG9NYW55V3JhcHBlcihvYmo6IGFueSwgcHJvcDogYW55KTogYW55IHtcbiAgICAgICAgICAgICAgY29uc3Qgb3JtTWV0YTogUmVsYXRpb25PcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIGNhc2NhZGU6XG4gICAgICAgICAgICAgICAgICBjYXNjYWRlLnVwZGF0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFIHx8XG4gICAgICAgICAgICAgICAgICBjYXNjYWRlLmRlbGV0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFLFxuICAgICAgICAgICAgICAgIG9uRGVsZXRlOiBjYXNjYWRlLmRlbGV0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICAgICAgb25VcGRhdGU6IGNhc2NhZGUudXBkYXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlYWdlcjogcG9wdWxhdGUsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHJldHVybiBPbmVUb01hbnkoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbCBNb2RlbCBub3QgZm91bmQgaW4gY29uc3RydWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjcm9zc1JlbGF0aW9uS2V5ID0gT2JqZWN0LmtleXMobSkuZmluZCgoaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgICAgICAgICAgICAgICAgUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk1BTllfVE9fT05FKSxcbiAgICAgICAgICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICAgICAgICAgIGssXG4gICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlY3MgfHwgIWRlY3MuZGVjb3JhdG9ycyB8fCAhZGVjcy5kZWNvcmF0b3JzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlYyA9IGRlY3MuZGVjb3JhdG9yc1swXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhenogPVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBkZWMucHJvcHMuY2xhc3MgPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICFkZWMucHJvcHMuY2xhc3MubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBkZWMucHJvcHMuY2xhc3MoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBkZWMucHJvcHMuY2xhc3M7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGF6ei5uYW1lID09PSBvYmouY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjcm9zc1JlbGF0aW9uS2V5KVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBgQ3Jvc3MgcmVsYXRpb24gbm90IGZvdW5kLiBEaWQgeW91IHVzZSBAbWFueVRvT25lIG9uIHRoZSAke2NsYXp6Lm5hbWV9P2BcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtjcm9zc1JlbGF0aW9uS2V5XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9ybU1ldGFcbiAgICAgICAgICAgICAgKShvYmosIHByb3ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICAvLyBAbWFueVRvT25lKGNsYXp6KSA9PiBATWFueVRvT25lKCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG1hbnlUb09uZUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5NQU5ZX1RPX09ORSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhUeXBlT1JNRmxhdm91cilcbiAgICAgIC5mb3IobWFueVRvT25lS2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWFueVRvT25lKFxuICAgICAgICAgIGNsYXp6OiBDb25zdHJ1Y3Rvcjxhbnk+IHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pLFxuICAgICAgICAgIGNhc2NhZGU6IENhc2NhZGVNZXRhZGF0YSxcbiAgICAgICAgICBwb3B1bGF0ZTogYm9vbGVhblxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUmVsYXRpb25zTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBjbGFzczogKGNsYXp6Lm5hbWUgPyBjbGF6ei5uYW1lIDogY2xhenopIGFzIHN0cmluZyxcbiAgICAgICAgICAgIGNhc2NhZGU6IGNhc2NhZGUsXG4gICAgICAgICAgICBwb3B1bGF0ZTogcG9wdWxhdGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBvcm1NZXRhOiBSZWxhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBjYXNjYWRlOlxuICAgICAgICAgICAgICBjYXNjYWRlLnVwZGF0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFIHx8XG4gICAgICAgICAgICAgIGNhc2NhZGUuZGVsZXRlID09PSBDYXNjYWRlLkNBU0NBREUsXG4gICAgICAgICAgICBvbkRlbGV0ZTogY2FzY2FkZS5kZWxldGUgPyBcIkNBU0NBREVcIiA6IFwiREVGQVVMVFwiLFxuICAgICAgICAgICAgb25VcGRhdGU6IGNhc2NhZGUudXBkYXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZWFnZXI6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KFxuICAgICAgICAgICAgcHJvcChQZXJzaXN0ZW5jZUtleXMuUkVMQVRJT05TKSxcbiAgICAgICAgICAgIHR5cGUoW1xuICAgICAgICAgICAgICAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWVcbiAgICAgICAgICAgICAgICA/IGNsYXp6XG4gICAgICAgICAgICAgICAgOiBjbGF6ei5uYW1lKSBhcyBhbnksXG4gICAgICAgICAgICAgIFN0cmluZy5uYW1lLFxuICAgICAgICAgICAgICBOdW1iZXIubmFtZSxcbiAgICAgICAgICAgICAgQmlnSW50Lm5hbWUsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShtYW55VG9PbmVLZXksIG1ldGFkYXRhKSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIE1hbnlUb09uZVdyYXBwZXIob2JqOiBhbnksIHByb3A6IGFueSk6IGFueSB7XG4gICAgICAgICAgICAgIHJldHVybiBNYW55VG9PbmUoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbCBNb2RlbCBub3QgZm91bmQgaW4gY29uc3RydWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6W01vZGVsS2V5cy5BTkNIT1IgYXMga2V5b2YgdHlwZW9mIGNsYXp6XTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIChtb2RlbDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNsYXp6Lm5hbWUpIGNsYXp6ID0gKGNsYXp6IGFzIGFueSkoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSBuZXcgKGNsYXp6IGFzIENvbnN0cnVjdG9yPGFueT4pKCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjcm9zc1JlbGF0aW9uS2V5ID0gT2JqZWN0LmtleXMobSkuZmluZCgoaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgICAgICAgICAgICAgICAgUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLk9ORV9UT19NQU5ZKSxcbiAgICAgICAgICAgICAgICAgICAgICBtLFxuICAgICAgICAgICAgICAgICAgICAgIGssXG4gICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlY3MgfHwgIWRlY3MuZGVjb3JhdG9ycyB8fCAhZGVjcy5kZWNvcmF0b3JzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3REZWMgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb24ua2V5KFZhbGlkYXRpb25LZXlzLkxJU1QpLFxuICAgICAgICAgICAgICAgICAgICAgIG0sXG4gICAgICAgICAgICAgICAgICAgICAga1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxpc3REZWMpXG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgTm8gVHlwZSBEZWZpbml0aW9uIGZvdW5kIGZvciAke2t9IGluICR7bS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gbGlzdERlYy5jbGF6elswXSgpLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lID09PSBvYmouY29uc3RydWN0b3IubmFtZTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjcm9zc1JlbGF0aW9uS2V5KVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBgQ3Jvc3MgcmVsYXRpb24gbm90IGZvdW5kLiBEaWQgeW91IHVzZSBAbWFueVRvT25lIG9uIHRoZSAke2NsYXp6Lm5hbWV9P2BcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RlbFtjcm9zc1JlbGF0aW9uS2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICkob2JqLCBwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgLy8gQG1hbnlUb01hbnkoY2xhenopID0+IEBNYW55VG9NYW55KCgpID0+IGNsYXp6KVxuICAgIGNvbnN0IG1hbnlUb01hbnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuTUFOWV9UT19NQU5ZKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihtYW55VG9NYW55S2V5KVxuICAgICAgLmRlZmluZSh7XG4gICAgICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWFueVRvTWFueShcbiAgICAgICAgICBjbGF6ejogQ29uc3RydWN0b3I8YW55PiB8ICgoKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+KSxcbiAgICAgICAgICBjYXNjYWRlOiBDYXNjYWRlTWV0YWRhdGEsXG4gICAgICAgICAgcG9wdWxhdGU6IGJvb2xlYW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFJlbGF0aW9uc01ldGFkYXRhID0ge1xuICAgICAgICAgICAgY2xhc3M6IGNsYXp6Lm5hbWUsXG4gICAgICAgICAgICBjYXNjYWRlOiBjYXNjYWRlLFxuICAgICAgICAgICAgcG9wdWxhdGU6IHBvcHVsYXRlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3Qgb3JtTWV0YTogUmVsYXRpb25PcHRpb25zID0ge1xuICAgICAgICAgICAgY2FzY2FkZTpcbiAgICAgICAgICAgICAgY2FzY2FkZS51cGRhdGUgPT09IENhc2NhZGUuQ0FTQ0FERSB8fFxuICAgICAgICAgICAgICBjYXNjYWRlLmRlbGV0ZSA9PT0gQ2FzY2FkZS5DQVNDQURFLFxuICAgICAgICAgICAgb25EZWxldGU6IGNhc2NhZGUuZGVsZXRlID8gXCJDQVNDQURFXCIgOiBcIkRFRkFVTFRcIixcbiAgICAgICAgICAgIG9uVXBkYXRlOiBjYXNjYWRlLnVwZGF0ZSA/IFwiQ0FTQ0FERVwiIDogXCJERUZBVUxUXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGVhZ2VyOiBwb3B1bGF0ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiBhcHBseShcbiAgICAgICAgICAgIHByb3AoUGVyc2lzdGVuY2VLZXlzLlJFTEFUSU9OUyksXG4gICAgICAgICAgICBsaXN0KGNsYXp6KSxcbiAgICAgICAgICAgIHByb3BNZXRhZGF0YShtYW55VG9NYW55S2V5LCBtZXRhZGF0YSksXG4gICAgICAgICAgICBNYW55VG9NYW55KFxuICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGF6ei5uYW1lKSBjbGF6eiA9IChjbGF6eiBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjbGF6eltNb2RlbEtleXMuQU5DSE9SIGFzIGtleW9mIHR5cGVvZiBjbGF6el0pXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbCBNb2RlbCBub3QgZm91bmQgaW4gY29uc3RydWN0b3JcIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhenpbTW9kZWxLZXlzLkFOQ0hPUiBhcyBrZXlvZiB0eXBlb2YgY2xhenpdO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAobW9kZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY2xhenoubmFtZSkgY2xhenogPSAoY2xhenogYXMgYW55KSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBrID0gZmluZFByaW1hcnlLZXkobmV3IChjbGF6eiBhcyBDb25zdHJ1Y3Rvcjxhbnk+KSgpKS5pZDtcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZWxbcGtdO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBvcm1NZXRhXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgSm9pblRhYmxlKClcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5hcHBseSgpO1xuXG4gICAgY29uc3QgY3JlYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuICAgIGNvbnN0IHVwZGF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFR5cGVPUk1GbGF2b3VyKVxuICAgICAgLmZvcihjcmVhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZShjcmVhdGVkQnlPblR5cGVPUk1DcmVhdGVVcGRhdGUsIHt9KSxcbiAgICAgICAgcmVxdWlyZWQoKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGNyZWF0ZWRCeUtleSwge30pXG4gICAgICAgIC8vIGFzc2lnbihgcGsuJHtwcm9wfWAsIG9wdGlvbnMpXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoVHlwZU9STUZsYXZvdXIpXG4gICAgICAuZm9yKHVwZGF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlVXBkYXRlKGNyZWF0ZWRCeU9uVHlwZU9STUNyZWF0ZVVwZGF0ZSwge30pLFxuICAgICAgICByZXF1aXJlZCgpLFxuICAgICAgICBwcm9wTWV0YWRhdGEodXBkYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICB9XG59XG5cbkFkYXB0ZXIuc2V0Q3VycmVudChUeXBlT1JNRmxhdm91cik7XG4iLCJpbXBvcnQgeyBUeXBlT1JNQWRhcHRlciB9IGZyb20gXCIuL1R5cGVPUk1BZGFwdGVyXCI7XG5cblR5cGVPUk1BZGFwdGVyLmRlY29yYXRpb24oKTtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW5kZXhlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcXVlcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NlcXVlbmNlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vVHlwZU9STUFkYXB0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXJyb3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9UeXBlT1JNRGlzcGF0Y2hcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1R5cGVPUk1SZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZU9STSBpbnRlZ3JhdGlvbiBmb3IgRGVjYWYudHMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyB0aGUgVHlwZU9STS1iYWNrZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIERlY2FmLnRzIGRhdGEgYWNjZXNzIGFic3RyYWN0aW9ucywgaW5jbHVkaW5nIHRoZSBhZGFwdGVyLCByZXBvc2l0b3J5LCBzdGF0ZW1lbnQgYnVpbGRlciwgcGFnaW5hdGlvbiB1dGlsaXRpZXMsIGluZGV4IGhlbHBlcnMsIGFuZCB0eXBlIGRlZmluaXRpb25zLiBLZXkgZXhwb3J0cyBpbmNsdWRlIHtAbGluayBUeXBlT1JNQWRhcHRlcn0sIHtAbGluayBUeXBlT1JNUmVwb3NpdG9yeX0sIHtAbGluayBUeXBlT1JNU3RhdGVtZW50fSwge0BsaW5rIFR5cGVPUk1QYWdpbmF0b3J9LCBhbmQgaW5kZXggZ2VuZXJhdGlvbiB1dGlsaXRpZXMuXG4gKiBAbW9kdWxlIGZvci10eXBlb3JtXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvbi5cbiAqIEBzdW1tYXJ5IFRoZSB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgZm9yLXR5cGVvcm0gcGFja2FnZS5cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci10eXBlb3JtXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkJhc2VFcnJvciIsIlNRTE9wZXJhdG9yIiwiUGFnaW5hdG9yIiwiTW9kZWxLZXlzIiwiUGFnaW5nRXJyb3IiLCJmaW5kUHJpbWFyeUtleSIsIlF1ZXJ5RXJyb3IiLCJTdGF0ZW1lbnQiLCJSZXBvc2l0b3J5IiwiT3JkZXJEaXJlY3Rpb24iLCJJbnRlcm5hbEVycm9yIiwiR3JvdXBPcGVyYXRvciIsIk9wZXJhdG9yIiwiU2VxdWVuY2UiLCJOb3RGb3VuZEVycm9yIiwiRGVmYXVsdFNlcGFyYXRvciIsIlBlcnNpc3RlbmNlS2V5cyIsIlR5cGVPUk1SZXBvc2l0b3J5IiwiQ29udGV4dCIsIk9wZXJhdGlvbktleXMiLCJlbmZvcmNlREJEZWNvcmF0b3JzIiwiVmFsaWRhdGlvbkVycm9yIiwiX19kZWNvcmF0ZSIsInVzZXMiLCJNb2RlbCIsIkV2ZW50U3Vic2NyaWJlciIsIkRpc3BhdGNoIiwiVmFsaWRhdGlvbktleXMiLCJVbnN1cHBvcnRlZEVycm9yIiwiZ2V0TWV0YWRhdGFBcmdzU3RvcmFnZSIsIkNvbHVtblR5cGVVbmRlZmluZWRFcnJvciIsIlByaW1hcnlDb2x1bW5DYW5ub3RCZU51bGxhYmxlRXJyb3IiLCJBZGFwdGVyIiwiRGF0YVNvdXJjZSIsIlJlZmxlY3Rpb24iLCJEQktleXMiLCJJbiIsIkNvbmZsaWN0RXJyb3IiLCJDb25uZWN0aW9uRXJyb3IiLCJMb2dnaW5nIiwiREVGQVVMVF9FUlJPUl9NRVNTQUdFUyIsIkRlY29yYXRpb24iLCJyZXF1aXJlZCIsInJlYWRvbmx5IiwicHJvcE1ldGFkYXRhIiwic2VxdWVuY2VOYW1lRm9yTW9kZWwiLCJhcHBseSIsIlZhbGlkYXRpb24iLCJ0eXBlIiwiVmVyc2lvbkNvbHVtbiIsIlVwZGF0ZVZhbGlkYXRpb25LZXlzIiwiZGF0ZSIsIkRCX0RFRkFVTFRfRVJST1JfTUVTU0FHRVMiLCJDYXNjYWRlIiwicHJvcCIsIkpvaW5Db2x1bW4iLCJsaXN0IiwiSm9pblRhYmxlIiwib25DcmVhdGUiLCJvbkNyZWF0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
|