@rentman/rm-core 2.0.13 → 2.0.14
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/changelog.md +3 -0
- package/dist/rm-core.js +11 -11
- package/dist/rm-core.min.js +1 -1
- package/package.json +1 -1
package/dist/rm-core.js
CHANGED
|
@@ -2331,7 +2331,7 @@ var ItemHandlerBase_ItemHandlerBase = /** @class */ (function () {
|
|
|
2331
2331
|
return this
|
|
2332
2332
|
.fetchItemEntries(rootColumn.itemType, itemIds, new ItemEntryOptions_ItemEntryOptions({ columns: columnIds }))
|
|
2333
2333
|
.then(function () {
|
|
2334
|
-
return _this.resolveDerivedValues(itemEntries, childColumns);
|
|
2334
|
+
return _this.resolveDerivedValues(itemEntries, childColumns, changesDelta);
|
|
2335
2335
|
}, this.errorHandler.reject);
|
|
2336
2336
|
};
|
|
2337
2337
|
ItemHandlerBase.prototype.resolveDerivedValues = function (itemEntries, columns, changesDelta) {
|
|
@@ -2363,12 +2363,14 @@ var ItemHandlerBase_ItemHandlerBase = /** @class */ (function () {
|
|
|
2363
2363
|
}
|
|
2364
2364
|
return this.transaction.getChangesFromItemChanges(this.itemChanges[itemEntry.id])[column.path];
|
|
2365
2365
|
}
|
|
2366
|
-
// todo[cache]
|
|
2367
|
-
//
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
|
|
2366
|
+
// todo[cache] validate if this also works for deeper levels
|
|
2367
|
+
// We could also call getDerivedValue and update that function to accept a ChangesDelta which has precedence over 'fields'
|
|
2368
|
+
var parentItemId = this.getItemIdByColumn(itemEntry, column.parent, changesDelta);
|
|
2369
|
+
var parentItemEntry = this.transaction.getLocalItemEntryByItemId(column.parent.itemType, parentItemId);
|
|
2370
|
+
if (changesDelta !== undefined && changesDelta.updated[parentItemEntry.id] !== undefined) {
|
|
2371
|
+
return changesDelta.updated[parentItemEntry.id].changes.fields[column.id];
|
|
2372
|
+
}
|
|
2373
|
+
return this.transaction.getChangesFromItemChanges(this.itemChanges[parentItemEntry.id])[column.id];
|
|
2372
2374
|
};
|
|
2373
2375
|
ItemHandlerBase.prototype.expandColumnsWithCollectionColumns = function (itemType, requestColumns) {
|
|
2374
2376
|
var requestColumnExpansion = this.requestColumnExpansionFactory.construct();
|
|
@@ -8943,8 +8945,6 @@ var TemplateCache_TemplateCache = /** @class */ (function () {
|
|
|
8943
8945
|
if (templateColumns === void 0) { templateColumns = {}; }
|
|
8944
8946
|
if (entryParentOrParentItemType === void 0) { entryParentOrParentItemType = null; }
|
|
8945
8947
|
var hasTemplateOptions = hasProperties(templateOptions);
|
|
8946
|
-
// todo[cache] We always need to fetch columns of the main ItemType
|
|
8947
|
-
// const columnItemType = getFirstProperty(templateColumns); // it's possible to add columns to linked items
|
|
8948
8948
|
var requestColumnExpansion = this.requestColumnExpansionFactory.construct();
|
|
8949
8949
|
if (templateColumns[itemType] !== undefined) {
|
|
8950
8950
|
requestColumnExpansion.expandWithRequestColumns(itemType, templateColumns[itemType]);
|
|
@@ -9561,7 +9561,7 @@ var ChangesProcessorFactory_ChangesProcessorFactory = /** @class */ (function ()
|
|
|
9561
9561
|
|
|
9562
9562
|
var core_RmCore = /** @class */ (function () {
|
|
9563
9563
|
function RmCore(_apiRequestService, authInterface, errorHandler, exceptionHandler, promiseLibrary, linkTreeService) {
|
|
9564
|
-
this.version = '2.0.
|
|
9564
|
+
this.version = '2.0.14';
|
|
9565
9565
|
this.noop = noop;
|
|
9566
9566
|
// Create variables for each service in order to get a TypeScript error when a dependency hasn't been
|
|
9567
9567
|
// initialized yet.
|
|
@@ -9773,4 +9773,4 @@ function identity(value) {
|
|
|
9773
9773
|
/***/ })
|
|
9774
9774
|
/******/ ]);
|
|
9775
9775
|
});
|
|
9776
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SbUNvcmUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1JtQ29yZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9SbUNvcmUvZXh0ZXJuYWwgXCJtb21lbnRcIiIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9VdGlsLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0FwaUZvcm1hdHRlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9BcGlSZXF1ZXN0U2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9BcGlSZXNwb25zZVByb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9DaGFuZ2VzQ29tcGlsYXRpb24udHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ2hhbmdlc1Byb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL0l0ZW1FbnRyeU9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9JdGVtUmVzb3VyY2VPcHRpb25zLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvSXRlbUVudHJ5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvSXRlbVJlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvVmlld1Jlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvRWRpdFJlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvQ29sbGVjdGlvbkVudHJ5T3B0aW9ucy50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL0NvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9Db2xsZWN0aW9uRW50cnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9Db2xsZWN0aW9uUmVzb3VyY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9Db2xsZWN0aW9uVmlld1Jlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvQ29sbGVjdGlvbkVkaXRSZXNvdXJjZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL1RlbXBsYXRlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvUmVtb3RlVmlld1Jlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvTG9jYWxWaWV3UmVzb3VyY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9pbmRleC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvdHlwZXMvSXRlbVR5cGVzQ29sbGVjdGlvbi50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvdHlwZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvSXRlbUhhbmRsZXJCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uSXRlbUhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvQWJzdHJhY3RDYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2xsZWN0aW9uTWF0Y2hlckJhc2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sbGVjdGlvbk1hdGNoZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkV2ZW50SGFuZGxlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbGxlY3Rpb25DYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uRXhwYW5zaW9uLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbHVtbkhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NvbnN0YW50cy50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2x1bW5JbmZvLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbHVtblNldC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2x1bW5TdWJzZXRDYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2x1bW5VdGlsLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NyZWF0ZVJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvUXVlcnlQYXJzZXJCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1F1ZXJ5Q29sdW1uRXh0cmFjdG9yLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL0NvbGxlY3Rpb25IYW5kbGVyQmFzZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS9zZXJ2ZXIvU2VydmVyQ29sbGVjdGlvbkhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvc2VydmVyL1NlcnZlckl0ZW1IYW5kbGVyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL3NlcnZlci9TZXJ2ZXJDYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9JdGVtQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvSXRlbUVudHJ5U2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9LZXlTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0xvY2tTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL01vZHVsZUNoYW5nZXNDb21waWxhdGlvbi50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9RdWVyeU1hdGNoZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvUXVlcnlQYXJzZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvUXVlcnlTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1JlcXVlc3RDb2x1bW5FeHBhbnNpb24udHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvU29ja2V0TWVzc2FnZUhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9DaGFuZ2VzRGVsdGFCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NoYW5nZXNEZWx0YS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9JbnRlcm5hbENoYW5nZXNEZWx0YS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9SZXF1ZXN0QnVmZmVyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1JlcXVlc3RCdWZmZXJNYW5hZ2VyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2luZGV4LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1RlbXBsYXRlQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9BcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9DaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sbGVjdGlvbkNhY2hlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbGxlY3Rpb25FbnRyeUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Db2xsZWN0aW9uTWF0Y2hlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Db2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sdW1uRXhwYW5zaW9uRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbHVtbkluZm9GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sdW1uU2V0RmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbHVtblN1YnNldENhY2hlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NyZWF0ZVJlcXVlc3RGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvSXRlbUNhY2hlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0l0ZW1FbnRyeUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9JdGVtUmVzb3VyY2VGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvUXVlcnlNYXRjaGVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL1F1ZXJ5UGFyc2VyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL1JlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvVGVtcGxhdGVGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NoYW5nZXNQcm9jZXNzb3JGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NvcmUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVB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S0FBSztJQUM5QixPQUFPLEtBQUssQ0FBQztBQUNkLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JWc0I7QUFDSztBQUNIO0FBRUM7QUFDRTtBQUNKIiwiZmlsZSI6InJtLWNvcmUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJtb21lbnRcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wibW9tZW50XCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlJtQ29yZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcIm1vbWVudFwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiUm1Db3JlXCJdID0gZmFjdG9yeShyb290W1wibW9tZW50XCJdKTtcbn0pKHdpbmRvdywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMF9fKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDEpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18wX187IiwiZXhwb3J0IGZ1bmN0aW9uIGluc3RhbnRpYXRlT3B0aW9ucyAoXG5cdG9wdGlvbnM6IHtba2V5OiBzdHJpbmddOiBhbnl9LFxuXHR2YWx1ZXM6IG9iamVjdCxcbik6IHZvaWQge1xuXHRmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZXMpIHtcblx0XHRpZiAoIShrZXkgaW4gb3B0aW9ucykpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGlmICh2YWx1ZXNba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRvcHRpb25zW2tleV0gPSB2YWx1ZXNba2V5XTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd01lcmdlIChcblx0b2JqZWN0LFxuXHRkZWZhdWx0cyxcbikge1xuXHRpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gZGVmYXVsdHM7XG5cdH1cblxuXHRjb25zdCByZXN1bHQgPSB7fTtcblxuXHRmb3IgKGNvbnN0IGtleSBpbiBkZWZhdWx0cykge1xuXHRcdHJlc3VsdFtrZXldID0gb2JqZWN0W2tleV0gPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRkZWZhdWx0c1trZXldIDogb2JqZWN0W2tleV07XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUHJvcGVydGllcyAob2JqZWN0KSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0Zm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaXJzdFByb3BlcnR5IChvYmplY3QpIHtcblx0aWYgKHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcblx0XHRyZXR1cm4ga2V5O1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbkFycmF5IChcblx0bmVlZGxlLFxuXHRoYXlzdGFjayxcbikge1xuXHRmb3IgKGNvbnN0IGhheSBvZiBoYXlzdGFjaykge1xuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0aWYgKG5lZWRsZSA9PSBoYXkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckFycmF5PFQ+IChcblx0c291cmNlOiBUW10sXG5cdGNhbGxiYWNrOiAoZWxlbTogVCkgPT4gYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWx0ZXJlZDogVFtdID0gW107XG5cblx0Zm9yIChjb25zdCBzcmMgb2Ygc291cmNlKSB7XG5cdFx0aWYgKGNhbGxiYWNrKHNyYykpIHtcblx0XHRcdGZpbHRlcmVkLnB1c2goc3JjKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoZmlsdGVyZWQubGVuZ3RoID09PSBzb3VyY2UubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0ZW1wdHlBcnJheShzb3VyY2UpO1xuXG5cdGZvciAoY29uc3QgZmlsdGVyIG9mIGZpbHRlcmVkKSB7XG5cdFx0c291cmNlLnB1c2goZmlsdGVyKTtcblx0fVxuXG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlBcnJheSAoYXJyYXkpOiB2b2lkIHtcblx0YXJyYXkuc3BsaWNlKDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aEV4aXN0cyAoXG5cdHNvdXJjZSxcblx0cGF0aCxcbikge1xuXHRpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRmb3IgKGNvbnN0IHAgb2YgcGF0aCkge1xuXHRcdGlmICh0eXBlb2Ygc291cmNlW3BdID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHNvdXJjZSA9IHNvdXJjZVtwXTtcblx0fVxuXG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGF0aDxUPiAoXG5cdG9iamVjdDogYW55LFxuXHRwYXRoOiBBcnJheTxudW1iZXIgfCBzdHJpbmc+LFxuXHRkZWZhdWx0czogYW55W10sXG4pOiBUIHtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBwYXRoW2ldO1xuXG5cdFx0aWYgKG9iamVjdFt2YWx1ZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0b2JqZWN0W3ZhbHVlXSA9IGRlZmF1bHRzW2ldO1xuXHRcdH1cblxuXHRcdG9iamVjdCA9IG9iamVjdFt2YWx1ZV07XG5cdH1cblxuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aCAoXG5cdG9iamVjdDoge30sXG5cdHBhdGg6IEFycmF5PG51bWJlciB8IHN0cmluZz4sXG5cdGNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuKTogYW55IHtcblx0aWYgKG9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGZvciAoY29uc3QgcCBvZiBwYXRoKSB7XG5cdFx0b2JqZWN0ID0gb2JqZWN0W3BdOyAvLyB3b24ndCBhbHRlciB0aGUgY2FsbGVyJ3MgdmFyXG5cblx0XHRpZiAob2JqZWN0ID09PSB1bmRlZmluZWQgJiYgIWNyZWF0ZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vLyBUYWtlbiBmcm9tIEFuZ3VsYXJKUywgYWRkZWQgY29tbWVudHMgdG8gaWdub3JlIFR5cGVTY3JpcHQgZXJyb3JzXG5mdW5jdGlvbiBiYXNlRXh0ZW5kIChcblx0ZHN0LFxuXHRvYmpzLFxuXHRkZWVwLFxuKSB7XG5cdGZvciAobGV0IGkgPSAwLCBpaSA9IG9ianMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuXHRcdGNvbnN0IG9iaiA9IG9ianNbaV07XG5cblx0XHRpZiAoIWlzT2JqZWN0KG9iaikgJiYgIWlzRnVuY3Rpb24ob2JqKSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG5cblx0XHRmb3IgKGxldCBqID0gMCwgamogPSBrZXlzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcblx0XHRcdGNvbnN0IGtleSA9IGtleXNbal07XG5cdFx0XHRjb25zdCBzcmMgPSBvYmpba2V5XTtcblxuXHRcdFx0aWYgKGRlZXAgJiYgaXNPYmplY3Qoc3JjKSkge1xuXHRcdFx0XHRpZiAoaXNEYXRlKHNyYykpIHtcblx0XHRcdFx0XHRkc3Rba2V5XSA9IG5ldyBEYXRlKHNyYy52YWx1ZU9mKCkpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzUmVnRXhwKHNyYykpIHtcblx0XHRcdFx0XHRkc3Rba2V5XSA9IG5ldyBSZWdFeHAoc3JjKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzcmMubm9kZU5hbWUpIHtcblx0XHRcdFx0XHRkc3Rba2V5XSA9IHNyYy5jbG9uZU5vZGUodHJ1ZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNFbGVtZW50KHNyYykpIHtcblx0XHRcdFx0XHRkc3Rba2V5XSA9IHNyYy5jbG9uZSgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmICghaXNPYmplY3QoZHN0W2tleV0pKSB7XG5cdFx0XHRcdFx0XHRkc3Rba2V5XSA9IGlzQXJyYXkoc3JjKSA/IFtdIDoge307XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YmFzZUV4dGVuZChcblx0XHRcdFx0XHRcdGRzdFtrZXldLFxuXHRcdFx0XHRcdFx0W3NyY10sXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRzdFtrZXldID0gc3JjO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBkc3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQgKFxuXHRkc3QsXG5cdC4uLmFyZ3Ncbikge1xuXHRyZXR1cm4gYmFzZUV4dGVuZChcblx0XHRkc3QsXG5cdFx0YXJncyxcblx0XHRmYWxzZSxcblx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlIChcblx0ZHN0LFxuXHQuLi5hcmdzXG4pIHtcblx0cmV0dXJuIGJhc2VFeHRlbmQoXG5cdFx0ZHN0LFxuXHRcdGFyZ3MsXG5cdFx0dHJ1ZSxcblx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0ICh2YWx1ZSkge1xuXHQvLyBodHRwOi8vanNwZXJmLmNvbS9pc29iamVjdDRcblx0cmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0JsYW5rT2JqZWN0ICh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nICh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyICh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZSAodmFsdWUpIHtcblx0cmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5cbmV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb248VD4gKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBUIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVnRXhwICh2YWx1ZSkge1xuXHRyZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuICh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnQgKG5vZGUpIHtcblx0cmV0dXJuICEhKG5vZGUgJiZcblx0XHQoXG5cdFx0XHRub2RlLm5vZGVOYW1lICAvLyBXZSBhcmUgYSBkaXJlY3QgZWxlbWVudC5cblx0XHRcdHx8IChub2RlLnByb3AgJiYgbm9kZS5hdHRyICYmIG5vZGUuZmluZClcblx0XHQpXG5cdCk7ICAvLyBXZSBoYXZlIGFuIG9uIGFuZCBmaW5kIG1ldGhvZCBwYXJ0IG9mIGpRdWVyeSBBUEkuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dpbmRvdyAob2JqKSB7XG5cdHJldHVybiBvYmogJiYgb2JqLndpbmRvdyA9PT0gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZpbmVkICh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyAoXG5cdG8xLFxuXHRvMixcbikge1xuXHRpZiAobzEgPT09IG8yKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpZiAobzEgPT09IG51bGwgfHwgbzIgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG5cdGlmIChvMSAhPT0gbzEgJiYgbzIgIT09IG8yKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gLy8gTmFOID09PSBOYU5cblxuXHRjb25zdCB0MSA9IHR5cGVvZiBvMTtcblx0Y29uc3QgdDIgPSB0eXBlb2YgbzI7XG5cblx0bGV0IGxlbmd0aDtcblx0bGV0IGtleTtcblx0bGV0IGtleVNldDtcblxuXHRpZiAodDEgPT09IHQyICYmIHQxID09PSAnb2JqZWN0Jykge1xuXHRcdGlmIChpc0FycmF5KG8xKSkge1xuXHRcdFx0aWYgKCFpc0FycmF5KG8yKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGxlbmd0aCA9IG8xLmxlbmd0aDtcblxuXHRcdFx0aWYgKG8xLmxlbmd0aCA9PT0gbzIubGVuZ3RoKSB7XG5cdFx0XHRcdGZvciAoa2V5ID0gMDsga2V5IDwgbGVuZ3RoOyBrZXkrKykge1xuXHRcdFx0XHRcdGlmICghZXF1YWxzKFxuXHRcdFx0XHRcdFx0bzFba2V5XSxcblx0XHRcdFx0XHRcdG8yW2tleV0sXG5cdFx0XHRcdFx0KSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNEYXRlKG8xKSkge1xuXHRcdFx0aWYgKCFpc0RhdGUobzIpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNpbXBsZUNvbXBhcmUoXG5cdFx0XHRcdG8xLmdldFRpbWUoKSxcblx0XHRcdFx0bzIuZ2V0VGltZSgpLFxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGlzUmVnRXhwKG8xKSkge1xuXHRcdFx0aWYgKCFpc1JlZ0V4cChvMikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbzEudG9TdHJpbmcoKSA9PT0gbzIudG9TdHJpbmcoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGlzV2luZG93KG8xKSB8fCBpc1dpbmRvdyhvMikgfHwgaXNBcnJheShvMikgfHwgaXNEYXRlKG8yKSB8fCBpc1JlZ0V4cChvMikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRrZXlTZXQgPSBjcmVhdGVNYXAoKTtcblx0XHRcdGZvciAoa2V5IGluIG8xKSB7XG5cdFx0XHRcdGlmIChpc0Z1bmN0aW9uKG8xW2tleV0pKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIWVxdWFscyhcblx0XHRcdFx0XHRvMVtrZXldLFxuXHRcdFx0XHRcdG8yW2tleV0sXG5cdFx0XHRcdCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXlTZXRba2V5XSA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoa2V5IGluIG8yKSB7XG5cdFx0XHRcdGlmICghKGtleSBpbiBrZXlTZXQpICYmIGlzRGVmaW5lZChvMltrZXldKSAmJiAhaXNGdW5jdGlvbihvMltrZXldKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1hcCAoKSB7XG5cdHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG5mdW5jdGlvbiBzaW1wbGVDb21wYXJlIChcblx0YSxcblx0Yixcbikge1xuXHRyZXR1cm4gYSA9PT0gYiB8fCAoYSAhPT0gYSAmJiBiICE9PSBiKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZE9iamVjdE1heERlcHRoIChtYXhEZXB0aCkge1xuXHRyZXR1cm4gaXNOdW1iZXIobWF4RGVwdGgpICYmIG1heERlcHRoID4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkgKFxuXHRzb3VyY2UsXG5cdGRlc3RpbmF0aW9uPyxcblx0bWF4RGVwdGg/LFxuKSB7XG5cdGNvbnN0IHN0YWNrU291cmNlID0gW107XG5cdGNvbnN0IHN0YWNrRGVzdCA9IFtdO1xuXG5cdG1heERlcHRoID0gaXNWYWxpZE9iamVjdE1heERlcHRoKG1heERlcHRoKSA/IG1heERlcHRoIDogTmFOO1xuXG5cdGlmIChkZXN0aW5hdGlvbikge1xuXHRcdGlmIChzb3VyY2UgPT09IGRlc3RpbmF0aW9uKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgY29weSEgU291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgaWRlbnRpY2FsLicpO1xuXHRcdH1cblxuXHRcdC8vIEVtcHR5IHRoZSBkZXN0aW5hdGlvbiBvYmplY3Rcblx0XHRpZiAoaXNBcnJheShkZXN0aW5hdGlvbikpIHtcblx0XHRcdGRlc3RpbmF0aW9uLmxlbmd0aCA9IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoY29uc3Qga2V5IGluIGRlc3RpbmF0aW9uKSB7XG5cdFx0XHRcdGRlbGV0ZSBkZXN0aW5hdGlvbltrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRzdGFja1NvdXJjZS5wdXNoKHNvdXJjZSk7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHN0YWNrRGVzdC5wdXNoKGRlc3RpbmF0aW9uKTtcblxuXHRcdHJldHVybiBjb3B5UmVjdXJzZShcblx0XHRcdHNvdXJjZSxcblx0XHRcdGRlc3RpbmF0aW9uLFxuXHRcdFx0bWF4RGVwdGgsXG5cdFx0KTtcblx0fVxuXG5cdHJldHVybiBjb3B5RWxlbWVudChcblx0XHRzb3VyY2UsXG5cdFx0bWF4RGVwdGgsXG5cdCk7XG5cblx0ZnVuY3Rpb24gY29weVJlY3Vyc2UgKFxuXHRcdF9zb3VyY2UsXG5cdFx0X2Rlc3RpbmF0aW9uLFxuXHRcdF9tYXhEZXB0aCxcblx0KSB7XG5cdFx0X21heERlcHRoLS07XG5cblx0XHRpZiAoX21heERlcHRoIDwgMCkge1xuXHRcdFx0cmV0dXJuICcuLi4nO1xuXHRcdH1cblxuXHRcdGlmIChpc0FycmF5KF9zb3VyY2UpKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMCwgaWkgPSBfc291cmNlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcblx0XHRcdFx0X2Rlc3RpbmF0aW9uLnB1c2goY29weUVsZW1lbnQoXG5cdFx0XHRcdFx0X3NvdXJjZVtpXSxcblx0XHRcdFx0XHRfbWF4RGVwdGgsXG5cdFx0XHRcdCkpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNCbGFua09iamVjdChfc291cmNlKSkge1xuXHRcdFx0Ly8gY3JlYXRlTWFwKCkgZmFzdCBwYXRoIC0tLSBTYWZlIHRvIGF2b2lkIGhhc093blByb3BlcnR5IGNoZWNrIGJlY2F1c2UgcHJvdG90eXBlIGNoYWluIGlzIGVtcHR5XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBfc291cmNlKSB7XG5cdFx0XHRcdF9kZXN0aW5hdGlvbltrZXldID0gY29weUVsZW1lbnQoXG5cdFx0XHRcdFx0X3NvdXJjZVtrZXldLFxuXHRcdFx0XHRcdF9tYXhEZXB0aCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKF9zb3VyY2UgJiYgdHlwZW9mIF9zb3VyY2UuaGFzT3duUHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdC8vIFNsb3cgcGF0aCwgd2hpY2ggbXVzdCByZWx5IG9uIGhhc093blByb3BlcnR5XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBfc291cmNlKSB7XG5cdFx0XHRcdGlmIChfc291cmNlLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdFx0XHRfZGVzdGluYXRpb25ba2V5XSA9IGNvcHlFbGVtZW50KFxuXHRcdFx0XHRcdFx0X3NvdXJjZVtrZXldLFxuXHRcdFx0XHRcdFx0X21heERlcHRoLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gU2xvd2VzdCBwYXRoIC0tLSBoYXNPd25Qcm9wZXJ0eSBjYW4ndCBiZSBjYWxsZWQgYXMgYSBtZXRob2Rcblx0XHRcdGZvciAoY29uc3Qga2V5IGluIF9zb3VyY2UpIHtcblx0XHRcdFx0aWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcblx0XHRcdFx0XHRfc291cmNlLFxuXHRcdFx0XHRcdGtleSxcblx0XHRcdFx0KSkge1xuXHRcdFx0XHRcdF9kZXN0aW5hdGlvbltrZXldID0gY29weUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRfc291cmNlW2tleV0sXG5cdFx0XHRcdFx0XHRfbWF4RGVwdGgsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBfZGVzdGluYXRpb247XG5cdH1cblxuXHRmdW5jdGlvbiBjb3B5RWxlbWVudCAoXG5cdFx0X3NvdXJjZSxcblx0XHRfbWF4RGVwdGggPSA1LFxuXHQpIHtcblx0XHQvLyBTaW1wbGUgdmFsdWVzXG5cdFx0aWYgKCFpc09iamVjdChfc291cmNlKSkge1xuXHRcdFx0cmV0dXJuIF9zb3VyY2U7XG5cdFx0fVxuXG5cdFx0Ly8gQWxyZWFkeSBjb3BpZWQgdmFsdWVzXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGNvbnN0IGluZGV4ID0gc3RhY2tTb3VyY2UuaW5kZXhPZihfc291cmNlKTtcblxuXHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdHJldHVybiBzdGFja0Rlc3RbaW5kZXhdO1xuXHRcdH1cblxuXHRcdGlmIChpc1dpbmRvdyhfc291cmNlKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGNvcHkhIE1ha2luZyBjb3BpZXMgb2YgV2luZG93IGluc3RhbmNlcyBpcyBub3Qgc3VwcG9ydGVkLicpO1xuXHRcdH1cblxuXHRcdGxldCBuZWVkc1JlY3Vyc2UgPSBmYWxzZTtcblx0XHRsZXQgX2Rlc3RpbmF0aW9uID0gY29weVR5cGUoX3NvdXJjZSk7XG5cblx0XHRpZiAoX2Rlc3RpbmF0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdF9kZXN0aW5hdGlvbiA9IGlzQXJyYXkoX3NvdXJjZSkgPyBbXSA6IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKF9zb3VyY2UpKTtcblx0XHRcdG5lZWRzUmVjdXJzZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHN0YWNrU291cmNlLnB1c2goX3NvdXJjZSk7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHN0YWNrRGVzdC5wdXNoKF9kZXN0aW5hdGlvbik7XG5cblx0XHRyZXR1cm4gbmVlZHNSZWN1cnNlXG5cdFx0XHQ/IGNvcHlSZWN1cnNlKFxuXHRcdFx0XHRfc291cmNlLFxuXHRcdFx0XHRfZGVzdGluYXRpb24sXG5cdFx0XHRcdF9tYXhEZXB0aCxcblx0XHRcdClcblx0XHRcdDogX2Rlc3RpbmF0aW9uO1xuXHR9XG5cblx0ZnVuY3Rpb24gY29weVR5cGUgKF9zb3VyY2UpIHtcblx0XHRzd2l0Y2ggKHRvU3RyaW5nLmNhbGwoX3NvdXJjZSkpIHtcblx0XHRcdGNhc2UgJ1tvYmplY3QgSW50OEFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IEludDE2QXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgSW50MzJBcnJheV0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBGbG9hdDMyQXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgRmxvYXQ2NEFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IFVpbnQ4QXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgVWludDE2QXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgVWludDMyQXJyYXldJzpcblx0XHRcdFx0cmV0dXJuIG5ldyBfc291cmNlLmNvbnN0cnVjdG9yKFxuXHRcdFx0XHRcdGNvcHlFbGVtZW50KF9zb3VyY2UuYnVmZmVyKSxcblx0XHRcdFx0XHRfc291cmNlLmJ5dGVPZmZzZXQsXG5cdFx0XHRcdFx0X3NvdXJjZS5sZW5ndGgsXG5cdFx0XHRcdCk7XG5cblx0XHRcdGNhc2UgJ1tvYmplY3QgQXJyYXlCdWZmZXJdJzpcblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUxMFxuXHRcdFx0XHRpZiAoIV9zb3VyY2Uuc2xpY2UpIHtcblx0XHRcdFx0XHQvLyBJZiB3ZSdyZSBpbiB0aGlzIGNhc2Ugd2Uga25vdyB0aGUgZW52aXJvbm1lbnQgc3VwcG9ydHMgQXJyYXlCdWZmZXJcblx0XHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuXHRcdFx0XHRcdGNvbnN0IGNvcGllZCA9IG5ldyBBcnJheUJ1ZmZlcihfc291cmNlLmJ5dGVMZW5ndGgpO1xuXHRcdFx0XHRcdG5ldyBVaW50OEFycmF5KGNvcGllZCkuc2V0KG5ldyBVaW50OEFycmF5KF9zb3VyY2UpKTtcblx0XHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlICovXG5cdFx0XHRcdFx0cmV0dXJuIGNvcGllZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gX3NvdXJjZS5zbGljZSgwKTtcblxuXHRcdFx0Y2FzZSAnW29iamVjdCBCb29sZWFuXSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IE51bWJlcl0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBTdHJpbmddJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgRGF0ZV0nOlxuXHRcdFx0XHRyZXR1cm4gbmV3IF9zb3VyY2UuY29uc3RydWN0b3IoX3NvdXJjZS52YWx1ZU9mKCkpO1xuXG5cdFx0XHRjYXNlICdbb2JqZWN0IFJlZ0V4cF0nOlxuXHRcdFx0XHRjb25zdCByZSA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0X3NvdXJjZS5fc291cmNlLFxuXHRcdFx0XHRcdF9zb3VyY2UudG9TdHJpbmcoKVxuXHRcdFx0XHRcdFx0Lm1hdGNoKC9bXi9dKiQvKVswXSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRyZS5sYXN0SW5kZXggPSBfc291cmNlLmxhc3RJbmRleDtcblxuXHRcdFx0XHRyZXR1cm4gcmU7XG5cblx0XHRcdGNhc2UgJ1tvYmplY3QgQmxvYl0nOlxuXHRcdFx0XHRyZXR1cm4gbmV3IF9zb3VyY2UuY29uc3RydWN0b3IoXG5cdFx0XHRcdFx0W19zb3VyY2VdLFxuXHRcdFx0XHRcdHt0eXBlOiBfc291cmNlLnR5cGV9LFxuXHRcdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChpc0Z1bmN0aW9uKF9zb3VyY2UuY2xvbmVOb2RlKSkge1xuXHRcdFx0cmV0dXJuIF9zb3VyY2UuY2xvbmVOb2RlKHRydWUpO1xuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IENvbHVtbkluZm8gfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEZpZWxkTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgY29weSwgZXF1YWxzIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIEFwaUZvcm1hdHRlciB7XG5cblx0TU9NRU5UX0lOVkFMSUQgPSAnSW52YWxpZCBkYXRlJztcblx0U0VSVkVSX0RBVEVUSU1FX0ZPUk1BVCA9ICdZWVlZLU1NLUREW1RdSEg6bW06c3NaJztcblx0U0VSVkVSX1RJTUVfRk9STUFUID0gJ0hIOm1tOnNzJztcblx0U0VSVkVSX0RBVEVfRk9STUFUID0gJ1lZWVktTU0tREQnO1xuXG5cdGNvbnN0cnVjdG9yICgpIHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIGlmIGEgY29sdW1uIHR5cGUgaXMgYW4gJ2V4cGVuc2l2ZScgdHlwZSwgbWVhbmluZyB0aGF0IHRoZSBhY3Rpb24gdG8gZm9ybWF0IHRoZSBmaWVsZCB0YWtlcyBzaWduaWZpY2FudCBDUFUgdGltZVxuXHQgKlxuXHQgKiAtLS0tXG5cdCAqIEByZW1hcmtzXG5cdCAqIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIE1vbWVudCBvYmplY3RzXG5cdCAqL1xuXHRwdWJsaWMgaXNFeHBlbnNpdmVGb3JtYXQgKGNvbHVtblR5cGU6IHN0cmluZykge1xuXHRcdHN3aXRjaCAoY29sdW1uVHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogT3ZlcndyaXRlcyB0aGUgdmFsdWVzIGluICdjaGFuZ2VzJyBpZiB0aGUgdmFsdWVzIGluICdpbml0aWFsJyBhbmQgJ2NoYW5nZXMnIGFyZSB0aGUgc2FtZSAobGVhdmluZyB1c2VyIGNoYW5nZXMgaW50YWN0KVxuXHQgKi9cblx0cHVibGljIG1lcmdlQ29weUZpZWxkczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGluaXRpYWw6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y2hhbmdlczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRuZXdJbml0aWFsOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW4ucGF0aDtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRuZXdJbml0aWFsW2NvbHVtblBhdGhdICE9PSB1bmRlZmluZWRcblx0XHRcdFx0JiYgKFxuXHRcdFx0XHRcdGNvbHVtblBhdGggPT09ICdpZCcgfHxcblx0XHRcdFx0XHRjaGFuZ2VzW2NvbHVtblBhdGhdID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0XHR0aGlzLmNvbXBhcmVGaWVsZHMoXG5cdFx0XHRcdFx0XHRjb2x1bW4uYXBpQ29sdW1uLnR5cGUsXG5cdFx0XHRcdFx0XHRjaGFuZ2VzW2NvbHVtblBhdGhdLFxuXHRcdFx0XHRcdFx0aW5pdGlhbFtjb2x1bW5QYXRoXSxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjaGFuZ2VzW2NvbHVtblBhdGhdID0gdGhpcy5jbG9uZShcblx0XHRcdFx0XHRjb2x1bW4uYXBpQ29sdW1uLnR5cGUsXG5cdFx0XHRcdFx0bmV3SW5pdGlhbFtjb2x1bW5QYXRoXSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2hhbmdlcztcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aW5pdGlhbDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRtb2RpZmllZDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQ6IHtbY29sdW1uSWQ6IHN0cmluZ106IGFueX0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtbklkID0gY29sdW1uLmlkO1xuXHRcdFx0Y29uc3QgYXBpQ29sdW1uID0gY29sdW1uLmFwaUNvbHVtbjtcblx0XHRcdGNvbnN0IGNvbHVtblR5cGUgPSBhcGlDb2x1bW4udHlwZTtcblxuXHRcdFx0aWYgKGFwaUNvbHVtbi5yZWFkT25seSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCF0aGlzLmNvbXBhcmVGaWVsZHMoXG5cdFx0XHRcdGNvbHVtblR5cGUsXG5cdFx0XHRcdGluaXRpYWxbY29sdW1uSWRdLFxuXHRcdFx0XHRtb2RpZmllZFtjb2x1bW5JZF0sXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJlc3VsdFtjb2x1bW5JZF0gPSB0aGlzLmZvcm1hdFJlcXVlc3RWYWx1ZShcblx0XHRcdFx0XHRjb2x1bW5UeXBlLFxuXHRcdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlcXVlc3RMb2NhbDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQ6IHtbY29sdW1uSWQ6IHN0cmluZ106IGFueX0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtbklkID0gY29sdW1uLmlkO1xuXHRcdFx0Y29uc3QgYXBpQ29sdW1uID0gY29sdW1uLmFwaUNvbHVtbjtcblxuXHRcdFx0aWYgKGFwaUNvbHVtbi5yZWFkT25seSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0cmVzdWx0W2NvbHVtbklkXSA9IHRoaXMuZm9ybWF0UmVxdWVzdFZhbHVlKFxuXHRcdFx0XHRhcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBoYXNDaGFuZ2VzIChcblx0XHRpbml0aWFsOiBGaWVsZE1hcCxcblx0XHRtb2RpZmllZDogRmllbGRNYXAsXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxhbnk+Pixcblx0KTogYm9vbGVhbiB7XG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cdFx0XHRjb25zdCBhcGlDb2x1bW4gPSBjb2x1bW4uYXBpQ29sdW1uO1xuXG5cdFx0XHQvLyBQYXJlbnQgY29sdW1ucyBhcmVuJ3Qgd3JpdGFibGUgY3VycmVudGx5IGJlY2F1c2Ugd2UgdXNlIExpbmtUbyByZXF1ZXN0c1xuXHRcdFx0Ly8gYnV0IGluIHRoZSBjb3JlIHRoZXkncmUgYWxyZWFkeSB0cmVhdGVkIGFzIG5vcm1hbCBmaWVsZHNcblx0XHRcdGlmIChcblx0XHRcdFx0YXBpQ29sdW1uLnR5cGUgIT09ICdsaW5rJ1xuXHRcdFx0XHQmJiBhcGlDb2x1bW4udHlwZSAhPT0gJ3BhcmVudHR5cGUnXG5cdFx0XHRcdCYmIGFwaUNvbHVtbi50eXBlICE9PSAncGFyZW50aWQnXG5cdFx0XHRcdCYmIGFwaUNvbHVtbi5yZWFkT25seVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5pc0V4cGVuc2l2ZUZvcm1hdChjb2x1bW4uYXBpQ29sdW1uLnR5cGUpKSB7XG5cdFx0XHRcdGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuXHRcdFx0XHRcdG1vZGlmaWVkLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIElmIHRoZSBtb21lbnQgZ2V0dGVyIGhhc24ndCBiZWVuIHRyaWdnZXJlZCBvciBvdmVyd3JpdHRlbiB5ZXQsIHdlIGNhbiBhc3N1bWUgdGhlcmUgYXJlIG5vIGNoYW5nZXNcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGRlc2MgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdCYmIGRlc2MudmFsdWUgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdCYmIGRlc2MuZ2V0ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhdGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0XHRcdGFwaUNvbHVtbi50eXBlLFxuXHRcdFx0XHRcdGluaXRpYWxbY29sdW1uSWRdLFxuXHRcdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aW5pdGlhbDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRtb2RpZmllZDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQ6IG9iamVjdFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5JZCA9IGNvbHVtbi5pZDtcblx0XHRcdGNvbnN0IGFwaUNvbHVtbiA9IGNvbHVtbi5hcGlDb2x1bW47XG5cblx0XHRcdGlmIChhcGlDb2x1bW4ucmVhZE9ubHkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghdGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0XHRhcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0aW5pdGlhbFtjb2x1bW5JZF0sXG5cdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdCkpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0b2xkVmFsdWU6IGluaXRpYWxbY29sdW1uSWRdLFxuXHRcdFx0XHRcdFx0bmV3VmFsdWU6IG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdFx0XHRcdGNvbHVtbjogY29sdW1uLmFwaUNvbHVtbixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgY29weUZpZWxkczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHNvdXJjZTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRkZXN0aW5hdGlvbjogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5QYXRoID0gY29sdW1uLnBhdGg7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0IXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShjb2x1bW5QYXRoKVxuXHRcdFx0XHR8fCAoXG5cdFx0XHRcdFx0Ly8gcHJldmVudCB0cmlnZ2VyaW5nIGdldHRlciBmb3IgZXhwZW5zaXZlIGZvcm1hdHNcblx0XHRcdFx0XHQhdGhpcy5pc0V4cGVuc2l2ZUZvcm1hdChjb2x1bW4uYXBpQ29sdW1uLnR5cGUpXG5cdFx0XHRcdFx0JiYgc291cmNlW2NvbHVtblBhdGhdID09PSB1bmRlZmluZWRcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5QYXRoXSA9IHRoaXMuY2xvbmUoXG5cdFx0XHRcdGNvbHVtbi5hcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0c291cmNlW2NvbHVtblBhdGhdLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVzdGluYXRpb247XG5cdH1cblxuXHRwdWJsaWMgc2hhbGxvd0NvcHlGaWVsZHMgKFxuXHRcdHNoYWxsb3dTb3VyY2U6IEZpZWxkTWFwLFxuXHRcdGRlZXBTb3VyY2U6IEZpZWxkTWFwLFxuXHRcdGRlc3RpbmF0aW9uOiBGaWVsZE1hcCxcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcCB7XG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbi5wYXRoO1xuXG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5QYXRoXSA9IHNoYWxsb3dTb3VyY2VbY29sdW1uUGF0aF0gIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHNoYWxsb3dTb3VyY2VbY29sdW1uUGF0aF0gOlxuXHRcdFx0XHR0aGlzLmNsb25lKFxuXHRcdFx0XHRcdGNvbHVtbi5hcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0XHRkZWVwU291cmNlW2NvbHVtblBhdGhdLFxuXHRcdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZXN0aW5hdGlvbjtcblx0fVxuXG5cdHB1YmxpYyBzZXREZWZhdWx0VmFsdWVzIChcblx0XHRkZXN0aW5hdGlvbjogRmllbGRNYXAsXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxhbnk+Pixcblx0KTogRmllbGRNYXAge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbi5pZF0gPSB0aGlzLmdldERlZmF1bHRWYWx1ZShjb2x1bW4uYXBpQ29sdW1uLnR5cGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZXN0aW5hdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ29tcGFyZXMgdGhlIGdpdmVuIGZpZWxkcywgcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZmllbGRzIGFyZSBlcXVhbFxuXHQgKi9cblx0cHVibGljIGNvbXBhcmVGaWVsZHMgKFxuXHRcdGNvbHVtblR5cGU6IHN0cmluZyxcblx0XHRmaXJzdD86IGFueSxcblx0XHRzZWNvbmQ/OiBhbnksXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gc2Vjb25kID09PSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0aWYgKHNlY29uZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChjb2x1bW5UeXBlKSB7XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ3RpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb21wYXJlTW9tZW50T2JqZWN0cyhcblx0XHRcdFx0XHRmaXJzdCxcblx0XHRcdFx0XHRzZWNvbmQsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbXBhcmVEdXJhdGlvbnMoXG5cdFx0XHRcdFx0Zmlyc3QsXG5cdFx0XHRcdFx0c2Vjb25kLFxuXHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSAnaWQnOiAvLyBpZCB0eXBlc1xuXHRcdFx0Y2FzZSAnaXRlbSc6XG5cdFx0XHRjYXNlICdsaW5rJzpcblx0XHRcdGNhc2UgJ2NoaWxkJzpcblx0XHRcdGNhc2UgJ3NpYmxpbmcnOlxuXHRcdFx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdFx0XHRyZXR1cm4gZmlyc3QgPT0gc2Vjb25kOyAvLyB1c2Ugbm9uLXN0cmljdCBjb21wYXJpc29uXG5cdFx0XHRjYXNlICdjdXJyZW50Jzpcblx0XHRcdGNhc2UgJ2RpbWVuc2lvbic6XG5cdFx0XHRjYXNlICdkaXN0YW5jZSc6XG5cdFx0XHRjYXNlICdkb3VibGUnOiAvLyBmbG9hdGluZyBwb2ludCB0eXBlc1xuXHRcdFx0Y2FzZSAnZmlsZXNpemUnOlxuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdGNhc2UgJ3Bvd2VyJzpcblx0XHRcdGNhc2UgJ3F1YW50aXR5Jzpcblx0XHRcdGNhc2UgJ3ZvbHVtZSc6XG5cdFx0XHRjYXNlICd3ZWlnaHQnOlxuXHRcdFx0Y2FzZSAnY29vcmRpbmF0ZSc6XG5cdFx0XHRjYXNlICdwcmljZSc6XG5cdFx0XHRjYXNlICdwZXJjZW50YWdlJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29tcGFyZUZsb2F0cyhcblx0XHRcdFx0XHRmaXJzdCxcblx0XHRcdFx0XHRzZWNvbmQsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICdpbnQnOiAvLyBpbnRlZ2VyIHR5cGVzXG5cdFx0XHRjYXNlICdib29sJzogLy8gYm9vbGVhbiB0eXBlc1xuXHRcdFx0Y2FzZSAnZW51bSc6XG5cdFx0XHRjYXNlICdlbWFpbCc6IC8vIHN0cmluZyB0eXBlc1xuXHRcdFx0Y2FzZSAncGhvbmUnOlxuXHRcdFx0Y2FzZSAndXJsJzpcblx0XHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0Y2FzZSAnbG9uZ3RleHQnOlxuXHRcdFx0Y2FzZSAnY29sb3InOlxuXHRcdFx0Y2FzZSAnb3JkZXInOlxuXHRcdFx0XHRyZXR1cm4gZmlyc3QgPT09IHNlY29uZDtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBlcXVhbHMoXG5cdFx0XHRcdFx0Zmlyc3QsXG5cdFx0XHRcdFx0c2Vjb25kLFxuXHRcdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjb21wYXJlRmxvYXRzIChcblx0XHRhOiBudW1iZXIsXG5cdFx0YjogbnVtYmVyLFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBhYnNBID0gTWF0aC5hYnMoYSk7XG5cdFx0Y29uc3QgYWJzQiA9IE1hdGguYWJzKGIpO1xuXHRcdGNvbnN0IGRpZmYgPSBNYXRoLmFicyhhIC0gYik7XG5cblx0XHRjb25zdCBFUFNJTE9OID0gMS4xOWUtMDc7XG5cblx0XHQvLyBzaG9ydGN1dCwgaGFuZGxlcyBpbmZpbml0aWVzXG5cdFx0aWYgKGEgPT09IGIpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoYSA9PT0gMCB8fCBiID09PSAwIHx8IGRpZmYgPCBOdW1iZXIuTUlOX1ZBTFVFKSB7XG5cdFx0XHQvLyBhIG9yIGIgaXMgemVybyBvciBib3RoIGFyZSBleHRyZW1lbHkgY2xvc2UgdG8gaXRcblx0XHRcdC8vIHJlbGF0aXZlIGVycm9yIGlzIGxlc3MgbWVhbmluZ2Z1bCBoZXJlXG5cdFx0XHRyZXR1cm4gZGlmZiA8IChFUFNJTE9OICogTnVtYmVyLk1JTl9WQUxVRSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHVzZSByZWxhdGl2ZSBlcnJvclxuXHRcdFx0cmV0dXJuIGRpZmYgLyBNYXRoLm1pbihcblx0XHRcdFx0KGFic0EgKyBhYnNCKSxcblx0XHRcdFx0TnVtYmVyLk1BWF9WQUxVRSxcblx0XHRcdCkgPCBFUFNJTE9OO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjb21wYXJlTW9tZW50T2JqZWN0cyAoXG5cdFx0Zmlyc3Q6IG1vbWVudC5Nb21lbnQsXG5cdFx0c2Vjb25kOiBtb21lbnQuTW9tZW50LFxuXHQpOiBib29sZWFuIHtcblx0XHRpZiAoIWZpcnN0LmlzVmFsaWQoKSkge1xuXHRcdFx0cmV0dXJuICFzZWNvbmQuaXNWYWxpZCgpO1xuXHRcdH1cblxuXHRcdGlmICghc2Vjb25kLmlzVmFsaWQoKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gLy8gZmlyc3QgSVMgdmFsaWRcblxuXHRcdHJldHVybiBmaXJzdC5pc1NhbWUoc2Vjb25kKTtcblx0fVxuXG5cdHB1YmxpYyBjb21wYXJlRHVyYXRpb25zIChcblx0XHRmaXJzdDogbW9tZW50LkR1cmF0aW9uLFxuXHRcdHNlY29uZDogbW9tZW50LkR1cmF0aW9uLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZmlyc3QuYXNNaWxsaXNlY29uZHMoKSA9PT0gc2Vjb25kLmFzTWlsbGlzZWNvbmRzKCk7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVzcG9uc2VWYWx1ZSAoXG5cdFx0Y29sdW1uVHlwZTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdCkge1xuXHRcdHN3aXRjaCAoY29sdW1uVHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlc3BvbnNlRGF0ZSh2YWx1ZSk7XG5cdFx0XHRjYXNlICdjb2xvcic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlc3BvbnNlQ29sb3IodmFsdWUpO1xuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRSZXNwb25zZUR1cmF0aW9uKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2pzb24nOlxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJycgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlO1xuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSAwID8gbnVsbCA6IHZhbHVlO1xuXHRcdFx0Y2FzZSAnZmlsZXNpemUnOlxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgLyAxMDAwMDAwO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0VmFsdWUgKFxuXHRcdGNvbHVtblR5cGU6IHN0cmluZyxcblx0XHR2YWx1ZTogYW55LFxuXHQpIHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0UmVxdWVzdERhdGVUaW1lKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRSZXF1ZXN0RGF0ZSh2YWx1ZSk7XG5cdFx0XHRjYXNlICdjb2xvcic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlcXVlc3RDb2xvcih2YWx1ZSk7XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlcXVlc3REdXJhdGlvbih2YWx1ZSk7XG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IDAgPyBudWxsIDogdmFsdWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlc3BvbnNlRGF0ZSAodmFsdWU6IG51bGwgfCBhbnkpOiBtb21lbnQuTW9tZW50IHtcblx0XHRyZXR1cm4gdmFsdWUgPT09IG51bGwgPyBtb21lbnQuaW52YWxpZCgpIDogbW9tZW50KHZhbHVlKTtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXNwb25zZUR1cmF0aW9uICh2YWx1ZTogbnVsbCB8IG51bWJlcik6IG1vbWVudC5EdXJhdGlvbiB7XG5cdFx0cmV0dXJuIG1vbWVudC5kdXJhdGlvbihcblx0XHRcdHZhbHVlID09PSBudWxsID8gMCA6IHZhbHVlLFxuXHRcdFx0J3NlY29uZHMnLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVzcG9uc2VDb2xvciAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHZhbHVlLmNoYXJBdCgwKSA9PT0gJyMnID8gdmFsdWUgOiAnIycgKyB2YWx1ZTtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0RGF0ZVRpbWUgKHZhbHVlOiBtb21lbnQuTW9tZW50KTogc3RyaW5nIHwgbnVsbCB7XG5cdFx0cmV0dXJuIHZhbHVlLmlzVmFsaWQoKSA/IHZhbHVlLmZvcm1hdCh0aGlzLlNFUlZFUl9EQVRFVElNRV9GT1JNQVQpIDogbnVsbDtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0RGF0ZSAodmFsdWU6IG1vbWVudC5Nb21lbnQpOiBzdHJpbmcgfCBudWxsIHtcblx0XHRyZXR1cm4gdmFsdWUuaXNWYWxpZCgpID8gdmFsdWUuZm9ybWF0KHRoaXMuU0VSVkVSX0RBVEVfRk9STUFUKSA6IG51bGw7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVxdWVzdER1cmF0aW9uICh2YWx1ZTogbW9tZW50LkR1cmF0aW9uKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdmFsdWUuYXNTZWNvbmRzKCk7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVxdWVzdENvbG9yICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdmFsdWUuY2hhckF0KDApID09PSAnIycgPyB2YWx1ZS5zdWJzdHJpbmcoMSkgOiB2YWx1ZTtcblx0fVxuXG5cdHB1YmxpYyBnZXREZWZhdWx0VmFsdWUgKGNvbHVtblR5cGU6IHN0cmluZyk6IGFueSB7XG5cdFx0c3dpdGNoIChjb2x1bW5UeXBlKSB7XG5cdFx0XHRjYXNlICdpbnQnOlxuXHRcdFx0Y2FzZSAnZG91YmxlJzpcblx0XHRcdGNhc2UgJ3BlcmNlbnRhZ2UnOlxuXHRcdFx0Y2FzZSAncHJpY2UnOlxuXHRcdFx0Y2FzZSAnb3JkZXInOlxuXHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdGNhc2UgJ2l0ZW0nOlxuXHRcdFx0Y2FzZSAnbGluayc6XG5cdFx0XHRjYXNlICdjaGlsZCc6XG5cdFx0XHRjYXNlICdzaWJsaW5nJzpcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRjYXNlICdib29sJzpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0Y2FzZSAnZW51bSc6XG5cdFx0XHRcdHJldHVybiAnMCc7XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ3RpbWUnOlxuXHRcdFx0XHRyZXR1cm4gbW9tZW50LmludmFsaWQoKTtcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIG1vbWVudC5kdXJhdGlvbigpO1xuXHRcdFx0Y2FzZSAndGV4dCc6XG5cdFx0XHRjYXNlICdsb25ndGV4dCc6XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdGNhc2UgJ2NvbG9yJzpcblx0XHRcdFx0cmV0dXJuICcjMDAwMDAwJztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdC8vIFx0XHRcdFx0XHRlbWFpbFxuXHRcdFx0Ly8gXHRcdFx0XHRcdHVybFxuXHRcdFx0Ly8gXHRcdFx0XHRcdGh0bWxcblx0XHRcdC8vIFx0XHRcdFx0XHRqc29uXG5cdFx0XHQvLyBcdFx0XHRcdFx0ZGF0YVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBpc0RlZmF1bHRWYWx1ZSAoXG5cdFx0Y29sdW1uVHlwZTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmNvbXBhcmVGaWVsZHMoXG5cdFx0XHRjb2x1bW5UeXBlLFxuXHRcdFx0dmFsdWUsXG5cdFx0XHR0aGlzLmdldERlZmF1bHRWYWx1ZShjb2x1bW5UeXBlKSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNsb25lIChcblx0XHRjb2x1bW5UeXBlOiBzdHJpbmcsXG5cdFx0dmFsdWU6IGFueSxcblx0KTogYW55IHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY2xvbmVEdXJhdGlvbih2YWx1ZSk7XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdFx0cmV0dXJuIG1vbWVudCh2YWx1ZSk7XG5cdFx0XHRjYXNlICdqc29uJzpcblx0XHRcdFx0cmV0dXJuIGNvcHkodmFsdWUpO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBnZXRDbG9uZUZ1bmN0aW9uIChjb2x1bW5UeXBlOiBzdHJpbmcpIHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY2xvbmVEdXJhdGlvbjtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jbG9uZURhdGU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5pZGVudGl0eTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVEdXJhdGlvbiAoZHVyYXRpb246IG1vbWVudC5EdXJhdGlvbikge1xuXHRcdHJldHVybiBtb21lbnQuZHVyYXRpb24oZHVyYXRpb24pO1xuXHR9XG5cblx0cHVibGljIGNsb25lRGF0ZSAoZGF0ZTogbW9tZW50Lk1vbWVudCk6IG1vbWVudC5Nb21lbnQge1xuXHRcdHJldHVybiBkYXRlLmNsb25lKCk7XG5cdH1cblxuXHRwdWJsaWMgaWRlbnRpdHk8VD4gKGlucHV0OiBUKTogVCB7XG5cdFx0cmV0dXJuIGlucHV0O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge1xuXHRBcGlSZXF1ZXN0Q29sdW1uTWFwLCBBcGlSZXF1ZXN0SXRlbU1hcCwgQXBpUmVxdWVzdExpbWl0LCBJdGVtSWQsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlXG59IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIEFwaVJlcXVlc3RTZXJ2aWNlIHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2VJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBhcGlSZXNwb25zZVByb2Nlc3NvckZhY3Rvcnk6IEFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeVxuXHQpIHtcblxuXHR9XG5cblx0dGVtcGxhdGUgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgcGFyYW1zOiBhbnkpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHRoaXMuZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZS50ZW1wbGF0ZShpdGVtVHlwZSwgcGFyYW1zKSk7XG5cdH1cblxuXHRjcmVhdGUgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgaXRlbUlkOiBJdGVtSWQsIHZhbHVlczogYW55LCBwYXJlbnRUeXBlPzogSXRlbVR5cGUsIHBhcmVudElkPzogSXRlbUlkKTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UuY3JlYXRlKGl0ZW1UeXBlLCBpdGVtSWQsIHZhbHVlcywgcGFyZW50VHlwZSwgcGFyZW50SWQpKTtcblx0fVxuXG5cdGRlbGV0ZSAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBpdGVtSWRzOiBJdGVtSWRbXSk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLmRlbGV0ZShpdGVtVHlwZSwgaXRlbUlkcykpO1xuXHR9XG5cblx0dXBkYXRlSXRlbXMgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgaXRlbXM6IEFwaVJlcXVlc3RJdGVtTWFwLCBjb2x1bW5zOiBhbnkpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHRoaXMuZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZS51cGRhdGVJdGVtcyhpdGVtVHlwZSwgaXRlbXMsIGNvbHVtbnMpKTtcblx0fVxuXG5cdHJlcXVlc3RTa2VsZXRvbiAocGFyYW1zOiBhbnksIHJlcXVlc3RDYW5jZWxlcj86IFByb21pc2VJbnRlcmZhY2U8YW55Pik6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLnJlcXVlc3RTa2VsZXRvbihwYXJhbXMsIHJlcXVlc3RDYW5jZWxlcikpO1xuXHR9XG5cblx0bW92ZUl0ZW1zIChwYXJlbnRUeXBlOiBJdGVtVHlwZSwgcGFyZW50SWQ6IEl0ZW1JZCwgaXRlbXM6IHtbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1JZFtdfSk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLm1vdmVJdGVtcyhwYXJlbnRUeXBlLCBwYXJlbnRJZCwgaXRlbXMpKTtcblx0fVxuXG5cdGNvbHVtbnMgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgY29sdW1uczogQXBpUmVxdWVzdENvbHVtbk1hcCwgcGFyYW1zPzogYW55KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UuY29sdW1ucyhpdGVtVHlwZSwgY29sdW1ucywgcGFyYW1zKSk7XG5cdH1cblxuXHRxdWVyeSAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBxdWVyeTogYW55LCBjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwLCBsaW1pdD86IEFwaVJlcXVlc3RMaW1pdCk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLnF1ZXJ5KGl0ZW1UeXBlLCBxdWVyeSwgY29sdW1ucywgbGltaXQpKTtcblx0fVxuXG5cdHByb2Nlc3NSZXNwb25zZSAocmVxdWVzdDogYW55KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiByZXF1ZXN0LnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHRoaXMuYXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5LmNvbnN0cnVjdChyZXNwb25zZSkpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEZpZWxkTWFwLCBJdGVtSWQsIEl0ZW1UeXBlLCBJdGVtVHlwZU1hcCwgUmVzcG9uc2VDb2x1bW4gfSBmcm9tICcuLi90eXBlcyc7XG5cbi8vIHRvZG9bY2FjaGVdIGV4dGVuZCBiYXNlIGNsYXNzIHBlciByZXF1ZXN0IChkZWxldGUgaGFzIGRpZmZlcmVudCBzdHJ1Y3R1cmUpXG5leHBvcnQgY2xhc3MgQXBpUmVzcG9uc2VQcm9jZXNzb3Ige1xuXG5cdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGU7XG5cblx0Y29sdW1uczogSXRlbVR5cGVNYXA8UmVzcG9uc2VDb2x1bW5bXT47XG5cdGxpbmtzOiBJdGVtVHlwZU1hcDxJdGVtSWRbXT47XG5cdGNhY2hlYWJsZTogYm9vbGVhbjtcblx0bWFwOiBhbnk7XG5cblx0aXRlbXM6IGFueTtcblxuXHRjb2x1bW5JbmRleE1hcDoge1xuXHRcdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFx0W2NvbHVtbklkOiBzdHJpbmddOiBudW1iZXJcblx0XHR9XG5cdH0gPSB7fTtcblxuXHRjb2x1bW5NYXA6IGFueSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIHJlc3BvbnNlOiBhbnksXG5cdCkge1xuXHRcdHRoaXMuY29sdW1ucyA9IHJlc3BvbnNlLmNvbHVtbnM7XG5cdFx0dGhpcy5pdGVtcyA9IHJlc3BvbnNlLml0ZW1zO1xuXHRcdHRoaXMubGlua3MgPSByZXNwb25zZS5saW5rcztcblx0XHR0aGlzLmNhY2hlYWJsZSA9IHJlc3BvbnNlLmNhY2hlYWJsZTtcblx0XHR0aGlzLm1hcCA9IHJlc3BvbnNlLm1hcDtcblx0XHR0aGlzLml0ZW1UeXBlID0gcmVzcG9uc2UuaXRlbVR5cGU7XG5cblx0XHR0aGlzLmNyZWF0ZUNvbHVtbk1hcHMoKTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlQ29sdW1uTWFwcyAoKSB7XG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiB0aGlzLmNvbHVtbnMpIHtcblx0XHRcdHRoaXMuY29sdW1uSW5kZXhNYXBbaXRlbVR5cGVdID0ge307XG5cdFx0XHR0aGlzLmNvbHVtbk1hcFtpdGVtVHlwZV0gPSB7fTtcblxuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbnNbaXRlbVR5cGVdLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpdGVtVHlwZV1baV07XG5cblx0XHRcdFx0dGhpcy5jb2x1bW5JbmRleE1hcFtpdGVtVHlwZV1bY29sdW1uLmlkXSA9IGk7XG5cdFx0XHRcdHRoaXMuY29sdW1uTWFwW2l0ZW1UeXBlXVtjb2x1bW4uaWRdID0gY29sdW1uO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmZXRjaENvbHVtbk9iamVjdCAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogUmVzcG9uc2VDb2x1bW4ge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtbk1hcFtpdGVtVHlwZV07XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hWYWx1ZSAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdCkge1xuXHRcdGlmICh0aGlzLml0ZW1zW2l0ZW1UeXBlXVtpdGVtSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5NYXBbaXRlbVR5cGVdW2NvbHVtbklkXTtcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuY29sdW1uSW5kZXhNYXBbaXRlbVR5cGVdW2NvbHVtbklkXTtcblxuXHRcdHJldHVybiB0aGlzLmFwaUZvcm1hdHRlci5mb3JtYXRSZXNwb25zZVZhbHVlKFxuXHRcdFx0Y29sdW1uLnR5cGUsXG5cdFx0XHR0aGlzLml0ZW1zW2l0ZW1UeXBlXVtpdGVtSWRdLmRhdGFbaW5kZXhdLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hDb2x1bW5BcnJheSAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogUmVzcG9uc2VDb2x1bW5bXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBSZXNwb25zZUNvbHVtbltdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGFwaUNvbHVtbiBvZiB0aGlzLmNvbHVtbnNbaXRlbVR5cGVdKSB7XG5cdFx0XHRyZXN1bHQucHVzaChhcGlDb2x1bW4pO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hEZXJpdmVkT2JqZWN0IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0cm9vdENvbHVtbnM6IFJlc3BvbnNlQ29sdW1uW10sXG5cdCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2Ygcm9vdENvbHVtbnMpIHtcblx0XHRcdHRoaXMuZmV0Y2hEZXJpdmVkVmFsdWVzKFxuXHRcdFx0XHR0aGlzLmZldGNoVmFsdWUoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdGNvbHVtbi5pZCxcblx0XHRcdFx0KSxcblx0XHRcdFx0Y29sdW1uLFxuXHRcdFx0XHRyZXN1bHQsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hEZXJpdmVkVmFsdWVzIChcblx0XHR2YWx1ZTogYW55LFxuXHRcdGNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdFx0ZGVzdGluYXRpb246IGFueSxcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBjaGlsZENvbHVtbiBvZiBjb2x1bW4uY2hpbGRyZW4pIHtcblx0XHRcdGxldCBjaGlsZFZhbHVlO1xuXG5cdFx0XHRpZiAodmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0Y2hpbGRWYWx1ZSA9IG51bGw7XG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NoaWxkQ29sdW1uLnBhdGhdID0gdGhpcy5hcGlGb3JtYXR0ZXIuZ2V0RGVmYXVsdFZhbHVlKGNoaWxkQ29sdW1uLmFwaUNvbHVtbi50eXBlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNoaWxkVmFsdWUgPSB0aGlzLmZldGNoVmFsdWUoXG5cdFx0XHRcdFx0Y29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdGNoaWxkQ29sdW1uLmlkLFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRkZXN0aW5hdGlvbltjaGlsZENvbHVtbi5wYXRoXSA9IGNoaWxkVmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjaGlsZENvbHVtbi5pc0xlYWYpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmV0Y2hEZXJpdmVkVmFsdWVzKFxuXHRcdFx0XHRjaGlsZFZhbHVlLFxuXHRcdFx0XHRjaGlsZENvbHVtbixcblx0XHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmZXRjaE9iamVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBzdHJpbmcgfCBJdGVtSWQsXG5cdFx0aW5jbHVkZUxpbmtzOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4gfCB1bmRlZmluZWQge1xuXHRcdGlmICh0aGlzLml0ZW1zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXG5cdFx0aWYgKGl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBkYXRhID0gdGhpcy5pdGVtc1tpdGVtVHlwZV1baXRlbUlkXS5kYXRhO1xuXHRcdGNvbnN0IHJlc3VsdDogYW55ID0ge307XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1uc1tpdGVtVHlwZV1baV07XG5cblx0XHRcdGlmICh0aGlzLmFwaUZvcm1hdHRlci5pc0V4cGVuc2l2ZUZvcm1hdChjb2x1bW4udHlwZSkpIHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KFxuXHRcdFx0XHRcdHJlc3VsdCxcblx0XHRcdFx0XHRjb2x1bW4uaWQsXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDpcblx0XHRcdFx0XHRcdFx0dmFsdWUgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSByZXN1bHRbY29sdW1uLmlkXTtcblxuXHRcdFx0XHRcdFx0XHRcdHJlc3VsdFtjb2x1bW4uaWRdID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHJlc3VsdFtjb2x1bW4uaWRdO1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRbY29sdW1uLmlkXSA9IHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlc3BvbnNlVmFsdWUoXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uLnR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YVtpXSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdFtjb2x1bW4uaWRdID0gdGhpcy5hcGlGb3JtYXR0ZXIuZm9ybWF0UmVzcG9uc2VWYWx1ZShcblx0XHRcdFx0XHRjb2x1bW4udHlwZSxcblx0XHRcdFx0XHRkYXRhW2ldLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChpbmNsdWRlTGlua3MpIHtcblx0XHRcdGNvbnN0IGxpbmtzID0gdGhpcy5pdGVtc1tpdGVtVHlwZV1baXRlbUlkXS5saW5rcztcblx0XHRcdHJlc3VsdC5fX2xpbmtzID0ge307XG5cblx0XHRcdGZvciAoY29uc3QgbGlua1R5cGUgaW4gbGlua3MpIHtcblx0XHRcdFx0cmVzdWx0Ll9fbGlua3NbbGlua1R5cGVdID1cblx0XHRcdFx0XHR0aGlzLmZldGNoT2JqZWN0QXJyYXkoXG5cdFx0XHRcdFx0XHRsaW5rVHlwZSxcblx0XHRcdFx0XHRcdGluY2x1ZGVMaW5rcyxcblx0XHRcdFx0XHRcdGxpbmtzW2xpbmtUeXBlXSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hPYmplY3RBcnJheTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aW5jbHVkZUxpbmtzPzogYm9vbGVhbixcblx0XHRpZEFycmF5PzogSXRlbUlkW10gfCBudWxsLFxuXHQpOiBBcnJheTxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgcmVzdWx0OiBhbnlbXSA9IFtdO1xuXG5cdFx0aWYgKGlkQXJyYXkgPT09IG51bGwpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIHRoaXMuaXRlbXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKHRoaXMuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdGluY2x1ZGVMaW5rcyxcblx0XHRcdFx0KSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0aWYgKGlkQXJyYXkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWRBcnJheSA9IHRoaXMubGlua3NbaXRlbVR5cGVdO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGlkQXJyYXkpIHtcblx0XHRcdHJlc3VsdC5wdXNoKHRoaXMuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdGluY2x1ZGVMaW5rcyxcblx0XHRcdCkpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hDb2x1bW5zT2JqZWN0ICgpOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBSZXNwb25zZUNvbHVtbn0ge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtbk1hcDtcblx0fVxufVxuIiwiaW1wb3J0IHsgSXRlbUVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEVudHJ5UGFyZW50LCBJdGVtRW50cnlNYXAsIEl0ZW1NYXAsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBJbnRlcm5hbENyZWF0ZURlbHRhIH0gZnJvbSAnLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5cbmltcG9ydCB7IGNyZWF0ZVBhdGggfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdHlwZSBDcmVhdGVDb21waWxhdGlvbiA9IHtcblx0W3BhcmVudFR5cGU6IHN0cmluZ106IHtcblx0XHRbcGFyZW50SWQ6IG51bWJlcl06IEl0ZW1NYXA8SW50ZXJuYWxDcmVhdGVEZWx0YT5cblx0fVxufTtcblxuZXhwb3J0IHR5cGUgRGVsZXRlQ29tcGlsYXRpb24gPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlPj5cbn07XG5cbmV4cG9ydCB0eXBlIFVwZGF0ZUNvbXBpbGF0aW9uID0gSXRlbUVudHJ5TWFwPEl0ZW1UeXBlPjtcblxuZXhwb3J0IHR5cGUgTW92ZUNvbXBpbGF0aW9uID0ge1xuXHRbcGFyZW50VHlwZTogc3RyaW5nXToge1xuXHRcdFtwYXJlbnRJZDogbnVtYmVyXTogSXRlbUVudHJ5W11cblx0fVxufTtcblxuZXhwb3J0IGNsYXNzIENoYW5nZXNDb21waWxhdGlvbiB7XG5cblx0Y29tcGlsYXRpb246IHtcblx0XHRjcmVhdGU6IENyZWF0ZUNvbXBpbGF0aW9uLFxuXHRcdGRlbGV0ZTogRGVsZXRlQ29tcGlsYXRpb24sXG5cdFx0dXBkYXRlOiBVcGRhdGVDb21waWxhdGlvbixcblx0XHRtb3ZlOiBNb3ZlQ29tcGlsYXRpb25cblx0fSA9IHtcblx0XHRjcmVhdGU6IHt9LFxuXHRcdGRlbGV0ZToge30sXG5cdFx0dXBkYXRlOiB7fSxcblx0XHRtb3ZlOiB7fSxcblx0fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0dGhpcy5wcm9jZXNzRGVsdGEoKTtcblx0fVxuXG5cdHByaXZhdGUgcHJvY2Vzc0RlbHRhICgpOiB2b2lkIHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLnRyYW5zYWN0aW9uLmdldERlbHRhKCk7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGNoYW5nZXNEZWx0YS5kZWxldGVkKSB7XG5cdFx0XHRjb25zdCBlbnRyaWVzVG9CZURlbGV0ZWQgPSBjaGFuZ2VzRGVsdGEuZGVsZXRlZFtpdGVtVHlwZV07XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGVudHJpZXNUb0JlRGVsZXRlZCkge1xuXHRcdFx0XHRpZiAoaXRlbUVudHJ5LmlzTG9jYWwoKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5hZGREZWxldGVFbnRyeShcblx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBjaGFuZ2VzRGVsdGEuY3JlYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBjaGFuZ2VzRGVsdGEuY3JlYXRlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdHRoaXMuYWRkQ3JlYXRlRW50cnkodHVwbGUpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gY2hhbmdlc0RlbHRhLnVwZGF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHR0aGlzLmFkZFVwZGF0ZUVudHJ5KHR1cGxlLmVudHJ5KTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGNoYW5nZXNEZWx0YS5tb3ZlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBjaGFuZ2VzRGVsdGEubW92ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHR0aGlzLmFkZE1vdmVFbnRyeShcblx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdHR1cGxlLnRvLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldERlZmF1bHRQYXJlbnQgKCk6IEVudHJ5UGFyZW50IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aXRlbVR5cGU6ICdWb2lkJyxcblx0XHRcdGl0ZW1JZDogMCxcblx0XHR9O1xuXHR9XG5cblx0cHJpdmF0ZSBhZGRNb3ZlRW50cnkgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5LFxuXHRcdG5ld1BhcmVudDogRW50cnlQYXJlbnQsXG5cdCk6IHZvaWQge1xuXHRcdGNyZWF0ZVBhdGg8SXRlbUVudHJ5W10+KFxuXHRcdFx0dGhpcy5jb21waWxhdGlvbi5tb3ZlLFxuXHRcdFx0W1xuXHRcdFx0XHRuZXdQYXJlbnQuaXRlbVR5cGUsXG5cdFx0XHRcdG5ld1BhcmVudC5pdGVtSWQsXG5cdFx0XHRdLFxuXHRcdFx0W1xuXHRcdFx0XHR7fSxcblx0XHRcdFx0W10sXG5cdFx0XHRdLFxuXHRcdClcblx0XHRcdC5wdXNoKGl0ZW1FbnRyeSk7XG5cdH1cblxuXHRwcml2YXRlIGFkZERlbGV0ZUVudHJ5IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZT4sXG5cdCk6IHZvaWQge1xuXHRcdGNyZWF0ZVBhdGg8SXRlbUVudHJ5W10+KFxuXHRcdFx0dGhpcy5jb21waWxhdGlvbi5kZWxldGUsXG5cdFx0XHRbXG5cdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdFtdLFxuXHRcdFx0XSxcblx0XHQpXG5cdFx0XHQucHVzaChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYWRkVXBkYXRlRW50cnkgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlPik6IHZvaWQge1xuXHRcdGNyZWF0ZVBhdGgoXG5cdFx0XHR0aGlzLmNvbXBpbGF0aW9uLnVwZGF0ZSxcblx0XHRcdFtcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0e30sXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdF0sXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYWRkQ3JlYXRlRW50cnkgKGNyZWF0ZURlbHRhOiBJbnRlcm5hbENyZWF0ZURlbHRhKTogdm9pZCB7XG5cdFx0bGV0IHBhcmVudCA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0UGFyZW50KGNyZWF0ZURlbHRhLmVudHJ5KTtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHBhcmVudCA9IHRoaXMuZ2V0RGVmYXVsdFBhcmVudCgpO1xuXHRcdH1cblxuXHRcdGNyZWF0ZVBhdGgoXG5cdFx0XHR0aGlzLmNvbXBpbGF0aW9uLmNyZWF0ZSxcblx0XHRcdFtcblx0XHRcdFx0cGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0XHRwYXJlbnQuaXRlbUlkLFxuXHRcdFx0XHRjcmVhdGVEZWx0YS5lbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0Y3JlYXRlRGVsdGEuZW50cnkuaXRlbUlkLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0e30sXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0Y3JlYXRlRGVsdGEsXG5cdFx0XHRdLFxuXHRcdCk7XG5cdH1cblxufVxuIiwiaW1wb3J0IHtcblx0QXBpUmVxdWVzdFNlcnZpY2UsXG5cdENoYW5nZXNDb21waWxhdGlvbixcblx0Q29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0Q29sdW1uSW5mbyxcblx0RGVsZXRlQ29tcGlsYXRpb24sXG5cdGhhc1Byb3BlcnRpZXMsXG5cdEl0ZW1FbnRyeVNlcnZpY2UsXG5cdE1vdmVDb21waWxhdGlvbixcblx0U2VydmVyQ2FjaGUsXG5cdFVwZGF0ZUNvbXBpbGF0aW9uLFxufSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7XG5cdENoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENyZWF0ZVJlcXVlc3RGYWN0b3J5LFxuXHRSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcbn0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdE1vdmVJdGVtcyxcblx0QXBpUmVzcG9uc2UsXG5cdENyZWF0ZVJlcXVlc3RFbnRyeSxcblx0RmllbGRNYXAsXG5cdEl0ZW1JZCxcblx0SXRlbUlkQ29udmVyc2lvbk1hcCxcblx0SXRlbVR5cGUsXG5cdFByb21pc2VJbnRlcmZhY2UsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuXG5pbXBvcnQgeyBnZXRQYXRoLCBpbkFycmF5IH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IHR5cGUgT25BZnRlckNyZWF0ZUNhbGxiYWNrID0gKGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXApID0+IHZvaWQ7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBFeGVjdXRlcyB0aGUgY2hhbmdlcyBmcm9tIGEgc3BlY2lmaWMge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgdHJhbnNhY3Rpb259IGFuZCByZXR1cm5zIGEge0BsaW5rIENoYW5nZXNEZWx0YSBDaGFuZ2VzRGVsdGF9XG4gKi9cbmV4cG9ydCBjbGFzcyBDaGFuZ2VzUHJvY2Vzc29yIHtcblxuXHRwcml2YXRlIGl0ZW1JZENvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAgPSB7fTtcblx0cHJpdmF0ZSBzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGUgPSB0aGlzLnRyYW5zYWN0aW9uLmdldFNlcnZlckNhY2hlKCk7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRwcml2YXRlIGNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk6IENoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY3JlYXRlUmVxdWVzdEZhY3Rvcnk6IENyZWF0ZVJlcXVlc3RGYWN0b3J5LFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdHByaXZhdGUgYnJlYWtVcEJ5UGFyZW50PzogYm9vbGVhbixcblx0XHRwcml2YXRlIG9uQWZ0ZXJDcmVhdGVDYWxsYmFjaz86IE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0KSB7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEV4ZWN1dGVzIHRoZSByZXF1ZXN0cyBpbiB0aGUgb3JkZXIgb2Y6XG5cdCAqIDEuIGNyZWF0ZVxuXHQgKiAyLiBtb3ZlXG5cdCAqIDMuIGRlbGV0ZVxuXHQgKiA0LiB1cGRhdGVcblx0ICovXG5cdHB1YmxpYyBleGVjdXRlICgpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1JZENvbnZlcnNpb25NYXA+IHtcblx0XHRjb25zdCBjaGFuZ2VzQ29tcGlsYXRpb24gPSB0aGlzLmNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbixcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29tcGlsYXRpb24gPSBjaGFuZ2VzQ29tcGlsYXRpb24uY29tcGlsYXRpb247XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmV4ZWN1dGVDcmVhdGVSZXF1ZXN0cyhjaGFuZ2VzQ29tcGlsYXRpb24pXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gdGhpcy5leGVjdXRlTW92ZVJlcXVlc3RzKGNvbXBpbGF0aW9uLm1vdmUpLFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gdGhpcy5leGVjdXRlVXBkYXRlUmVxdWVzdHMoY29tcGlsYXRpb24udXBkYXRlKSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHRoaXMuZXhlY3V0ZURlbGV0ZVJlcXVlc3RzKGNvbXBpbGF0aW9uLmRlbGV0ZSksXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB0aGlzLml0ZW1JZENvbnZlcnNpb25NYXAsXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGJ1aWxkTW92ZVJlcXVlc3QgKGNvbXBpbGF0aW9uRW50cmllczogSXRlbUVudHJ5W10pOiBBcGlSZXF1ZXN0TW92ZUl0ZW1zIHtcblx0XHRjb25zdCByZXN1bHQ6IEFwaVJlcXVlc3RNb3ZlSXRlbXMgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGNvbXBpbGF0aW9uRW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbVR5cGUgPSBpdGVtRW50cnkuaXRlbVR5cGU7XG5cblx0XHRcdGlmIChyZXN1bHRbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVzdWx0W2l0ZW1UeXBlXSA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHRbaXRlbVR5cGVdLnB1c2goaXRlbUVudHJ5Lml0ZW1JZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0TWFwVmFsdWUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRtYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAgPSB0aGlzLml0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IEl0ZW1JZCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKG1hcCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGlmIChtYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hcFtpdGVtVHlwZV1baXRlbUlkXTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZUNyZWF0ZVJlcXVlc3RzIChcblx0XHRjaGFuZ2VzQ29tcGlsYXRpb246IENoYW5nZXNDb21waWxhdGlvbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxhbnlbXT4ge1xuXHRcdGNvbnN0IHJlcXVlc3RzID0gdGhpcy5jcmVhdGVSZXF1ZXN0RmFjdG9yeVxuXHRcdFx0LmNvbnN0cnVjdChcblx0XHRcdFx0Y2hhbmdlc0NvbXBpbGF0aW9uLmNvbXBpbGF0aW9uLmNyZWF0ZSxcblx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbixcblx0XHRcdFx0dGhpcy5icmVha1VwQnlQYXJlbnQsXG5cdFx0XHQpXG5cdFx0XHQucnVuKCk7XG5cblx0XHRjb25zdCByZXNwb25zZXM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8YW55Pj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgcmVxdWVzdCBvZiByZXF1ZXN0cykge1xuXHRcdFx0cmVzcG9uc2VzLnB1c2goXG5cdFx0XHRcdHRoaXNcblx0XHRcdFx0XHQuZXhlY3V0ZUNyZWF0ZVJlcXVlc3QocmVxdWVzdClcblx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdHJlc3VsdCA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLm9uQWZ0ZXJDcmVhdGVDYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5vbkFmdGVyQ3JlYXRlQ2FsbGJhY2sodGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChyZXNwb25zZXMpO1xuXHR9XG5cblx0Ly8gdG9kb1tjYWNoZV0gdGVzdCBjcmVhdGUgcmVxdWVzdHNcblx0cHJpdmF0ZSBleGVjdXRlQ3JlYXRlUmVxdWVzdCAoXG5cdFx0cmVxdWVzdFJlc291cmNlOiBDcmVhdGVSZXF1ZXN0RW50cnk8YW55Pixcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UucmVxdWVzdFNrZWxldG9uKHJlcXVlc3RSZXNvdXJjZS5yZXF1ZXN0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRcdFx0XHRjb25zdCByZXNwb25zZU1hcCA9IHJlc3BvbnNlLm1hcDtcblx0XHRcdFx0XHRjb25zdCByZXNwb25zZUNvbHVtbnMgPSByZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKTtcblx0XHRcdFx0XHRjb25zdCBpdGVtRW50cmllcyA9IHJlcXVlc3RSZXNvdXJjZS5pdGVtcztcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gaXRlbUVudHJpZXMpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0UmVzb3VyY2UucmVxdWVzdC5jb2x1bW5zW2l0ZW1UeXBlXSxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbUVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGl0ZW1FbnRyaWVzW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdJdGVtSWQgPSB0aGlzLmdldE1hcFZhbHVlKFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdHBhcnNlSW50KFxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0XHRcdFx0MTAsXG5cdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZU1hcCxcblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRpZiAobmV3SXRlbUlkID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdFx0XHRcdFx0XHQnQ3JlYXRlIGZhaWxlZCEnLFxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIHdlJ3JlIHN1cmUgdGhlIGVudHJ5IGV4aXN0cywgYmVjYXVzZSBvdGhlcndpc2UgeW91IGNvdWxkbid0IHNhdmUgaXQgaW4gdGhlIGZpcnN0IHBsYWNlXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGxvY2FsSXRlbUVudHJ5ID0gdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHRcdCkhO1xuXG5cdFx0XHRcdFx0XHRcdGxvY2FsSXRlbUVudHJ5Lml0ZW1JZCA9IG5ld0l0ZW1JZDtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2xvY2FsSXRlbUVudHJ5LmlkXSA9IHRoaXMuc2VydmVyQ2FjaGUuaXRlbUhhbmRsZXIuY29weVRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyhcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2xvY2FsSXRlbUVudHJ5LmlkXSxcblx0XHRcdFx0XHRcdFx0XHRsb2NhbEl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLmVudHJpZXMuYWRkKGxvY2FsSXRlbUVudHJ5KTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXJCeUl0ZW1JZChcblx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHROdW1iZXIoaXRlbUlkKSxcblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLnByb2Nlc3NBcGlSZXNwb25zZShcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdE51bWJlcihuZXdJdGVtSWQpLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLFxuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbkV4cGFuc2lvbixcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBleHRlbmQgY29udmVyc2lvbiBtYXBcblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIHJlc3BvbnNlTWFwKSB7XG5cdFx0XHRcdFx0XHRpZiAodGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gcmVzcG9uc2VNYXBbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcFtpdGVtVHlwZV1baXRlbUlkXSA9IHJlc3BvbnNlTWFwW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzID0gdGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLnRvQXJyYXkoKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgY29sbGVjdGlvbkVudHJ5IG9mIGNvbGxlY3Rpb25FbnRyaWVzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBwYXJlbnQgPSBjb2xsZWN0aW9uRW50cnkucGFyZW50O1xuXG5cdFx0XHRcdFx0XHRpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld1BhcmVudElkID0gdGhpcy5nZXRNYXBWYWx1ZShcblx0XHRcdFx0XHRcdFx0XHRwYXJlbnQuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0cGFyZW50Lml0ZW1JZCxcblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRpZiAobmV3UGFyZW50SWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdHBhcmVudC5pdGVtSWQgPSBuZXdQYXJlbnRJZDtcblxuXHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShcblx0XHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y29uc3QgdXBkYXRlZENvbHVtbnM6IHtbY29sdW1uSWQ6IHN0cmluZ106IENvbHVtbkluZm88YW55Pn0gPVxuXHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuZ2V0VXBkYXRlZEl0ZW1Db2x1bW5zKHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcCk7XG5cblx0XHRcdFx0XHRcdGlmICghaGFzUHJvcGVydGllcyh1cGRhdGVkQ29sdW1ucykpIHtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh1cGRhdGVkQ29sdW1ucy5pZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIub25JdGVtRW50cmllc0NyZWF0ZWQoXG5cdFx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcFtjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnNlcnZlckNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGV4ZWN1dGVVcGRhdGVSZXF1ZXN0cyAoXG5cdFx0Y29tcGlsYXRpb246IFVwZGF0ZUNvbXBpbGF0aW9uLFxuXHQpIHtcblx0XHRjb25zdCByZXF1ZXN0czogQXJyYXk8UHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGNvbXBpbGF0aW9uKSB7XG5cdFx0XHRyZXF1ZXN0cy5wdXNoKFxuXHRcdFx0XHR0aGlzLmV4ZWN1dGVVcGRhdGVSZXF1ZXN0KFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGNvbXBpbGF0aW9uW2l0ZW1UeXBlXSxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHJlcXVlc3RzKTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZVVwZGF0ZVJlcXVlc3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiB7W2l0ZW1JZDogbnVtYmVyXTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT59LFxuXHQpIHtcblx0XHRjb25zdCByZXF1ZXN0OiB7W2l0ZW1UeXBlOiBzdHJpbmddOiB7W2l0ZW1JZDogbnVtYmVyXTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPn19ID0ge307XG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbnMgPSB0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gdmVyaWZ5IGlmIHdlIHNob3VsZCBjYWxsIGdldENvbGxlY3Rpb25NYXRjaGVyIG9uIFNlcnZlckNhY2hlIG9yIFRyYW5zYWN0aW9uQ2FjaGVcblx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuZ2V0Q29sbGVjdGlvbk1hdGNoZXIoKTtcblxuXHRcdHJlcXVlc3RbaXRlbVR5cGVdID0ge307XG5cblx0XHQvLyB3ZSBuZWVkIHRvIGRvIHRoZSBmb3JtYXRSZXF1ZXN0IGNhbGwgaGVyZSAoZmllbGRzIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkKVxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBpdGVtRW50cmllc1tpdGVtSWRdO1xuXHRcdFx0Y29uc3QgaXRlbVJlcXVlc3Q6IGFueSA9IHJlcXVlc3RbaXRlbVR5cGVdW2l0ZW1JZF0gPSB7fTtcblx0XHRcdGNvbnN0IHBhcmFtZXRlcnMgPSBnZXRQYXRoKFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLnRhYlJlcXVlc3RQYXJhbWV0ZXJzLFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRdLFxuXHRcdFx0KTtcblxuXHRcdFx0aXRlbVJlcXVlc3QudmFsdWVzID0gdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5mb3JtYXRSZXF1ZXN0KGl0ZW1FbnRyeSk7XG5cblx0XHRcdGlmIChwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aXRlbVJlcXVlc3QucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG5cdFx0XHR9XG5cblx0XHRcdHJlcXVlc3RDb2x1bW5zLmV4cGFuZChpdGVtRW50cnkuY29sdW1ucyk7XG5cblx0XHRcdC8vIHRvZG9bY2FjaGVdIHRlc3Rcblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyLmV4cGFuZChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0uY2hhbmdlcyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sbGVjdGlvbnNXaXRoRml0dGluZ0l0ZW1zID0gY29sbGVjdGlvbk1hdGNoZXIuZ2V0Q29sbGVjdGlvbnNXaXRoRml0dGluZ0l0ZW1zKCk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb24gb2YgY29sbGVjdGlvbnNXaXRoRml0dGluZ0l0ZW1zKSB7XG5cdFx0XHRyZXF1ZXN0Q29sdW1ucy5leHBhbmQoY29sbGVjdGlvbi5jb2x1bW5zKTtcblx0XHR9XG5cblx0XHRjb25zdCBhcGlSZXF1ZXN0Q29sdW1ucyA9IHJlcXVlc3RDb2x1bW5zLmdldCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdC51cGRhdGVJdGVtcyhcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHJlcXVlc3QsXG5cdFx0XHRcdGFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHRoaXMuc2VydmVyQ2FjaGUucHJvY2Vzc1Jlc3BvbnNlKFxuXHRcdFx0XHRcdHJlc3BvbnNlLFxuXHRcdFx0XHRcdGFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdCksXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGV4ZWN1dGVEZWxldGVSZXF1ZXN0cyAoXG5cdFx0Y29tcGlsYXRpb246IERlbGV0ZUNvbXBpbGF0aW9uLFxuXHQpIHtcblx0XHRjb25zdCByZXF1ZXN0czogQXJyYXk8UHJvbWlzZUludGVyZmFjZTx2b2lkPj4gPSBbXTtcblxuXHRcdC8vIGNsZWFyaW5nIG5vdCBuZWNlc3Nhcnlcblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGNvbXBpbGF0aW9uKSB7XG5cdFx0XHRyZXF1ZXN0cy5wdXNoKFxuXHRcdFx0XHR0aGlzLmV4ZWN1dGVEZWxldGVSZXF1ZXN0KFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGNvbXBpbGF0aW9uW2l0ZW1UeXBlXSxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHJlcXVlc3RzKTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZURlbGV0ZVJlcXVlc3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdCkge1xuXHRcdHJldHVybiB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHQuZGVsZXRlKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUVudHJpZXMubWFwKFxuXHRcdFx0XHRcdGVudHJ5ID0+IGVudHJ5Lml0ZW1JZCxcblx0XHRcdFx0KSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdEludGVybmFsRGVsdGEoKTtcblxuXHRcdFx0XHRcdGNvbnN0IHJlc3BvbnNlSWRBcnJheSA9IHJlc3BvbnNlLml0ZW1zO1xuXHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyaWVzVG9CZURlbGV0ZWQ6IEl0ZW1FbnRyeVtdID0gW107XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHQhaW5BcnJheShcblx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlSWRBcnJheSxcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0XHRcdFx0XHQnRGVsZXRlIGZhaWxlZCEnLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aXRlbUVudHJpZXNUb0JlRGVsZXRlZC5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1zRGVsZXRlZChpdGVtRW50cmllc1RvQmVEZWxldGVkKTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnNlcnZlckNhY2hlLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGV4ZWN1dGVNb3ZlUmVxdWVzdHMgKFxuXHRcdGNvbXBpbGF0aW9uOiBNb3ZlQ29tcGlsYXRpb24sXG5cdCkge1xuXHRcdGNvbnN0IHJlcXVlc3RzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPHZvaWQ+PiA9IFtdO1xuXG5cdFx0Y29uc3QgZXhlY3V0ZU1vdmVSZXF1ZXN0ID0gKFxuXHRcdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0XHRwYXJlbnRJZDogSXRlbUlkLFxuXHRcdCkgPT4ge1xuXHRcdFx0Ly8gb25seSB0aGUgcGFyZW50IGlkIGNvdWxkIGhhdmUgYmVlbiB1cGRhdGVkXG5cdFx0XHRjb25zdCBjb21waWxhdGlvbkVudHJpZXMgPSBjb21waWxhdGlvbltwYXJlbnRUeXBlXVtwYXJlbnRJZF07XG5cdFx0XHRjb25zdCBuZXdQYXJlbnRJZCA9IHRoaXMuZ2V0TWFwVmFsdWUoXG5cdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdHBhcmVudElkLFxuXHRcdFx0KTtcblxuXHRcdFx0cmVxdWVzdHMucHVzaChcblx0XHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0XHRcdC5tb3ZlSXRlbXMoXG5cdFx0XHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdFx0bmV3UGFyZW50SWQgIT09IHVuZGVmaW5lZCA/IG5ld1BhcmVudElkIDogcGFyZW50SWQsXG5cdFx0XHRcdFx0XHR0aGlzLmJ1aWxkTW92ZVJlcXVlc3QoY29tcGlsYXRpb25FbnRyaWVzKSxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3RJbnRlcm5hbERlbHRhKCk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gdG9kb1tjYWNoZV0gd2h5IGRvbid0IHdlIHVzZSB0aGUgcmVzcG9uc2UgP1xuXHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBjb21waWxhdGlvbkVudHJpZXMpIHtcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1FbnRyeVNlcnZpY2UuZ2V0TGlua0ZpZWxkc0J5UGFyZW50KFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aXRlbVR5cGU6IHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aXRlbUlkOiBuZXdQYXJlbnRJZCAhPT0gdW5kZWZpbmVkID8gbmV3UGFyZW50SWQgOiBwYXJlbnRJZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRnJvbVBhcmVudChcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fTtcblxuXHRcdGZvciAoY29uc3QgcGFyZW50VHlwZSBpbiBjb21waWxhdGlvbikge1xuXHRcdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb21waWxhdGlvbltwYXJlbnRUeXBlXSkge1xuXHRcdFx0XHRleGVjdXRlTW92ZVJlcXVlc3QoXG5cdFx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0XHQrcGFyZW50SWQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHJlcXVlc3RzKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgaW5zdGFudGlhdGVPcHRpb25zIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1uTWFwLCBBcGlSZXF1ZXN0Q29sdW1ucywgRW50cnlQYXJlbnROdWxsIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBJdGVtRW50cnlPcHRpb25zSW50ZXJmYWNlID0gUGFydGlhbDxJdGVtRW50cnlPcHRpb25zPjtcblxuZXhwb3J0IGNsYXNzIEl0ZW1FbnRyeU9wdGlvbnMge1xuXHRwdWJsaWMgY29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMgPSB0cnVlO1xuXHRwdWJsaWMgcGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsO1xuXHRwdWJsaWMgdGVtcGxhdGVPcHRpb25zOiBhbnkgPSB7fTsgLy8gVE9ET1xuXHRwdWJsaWMgdGVtcGxhdGVDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwID0ge307XG5cblx0Y29uc3RydWN0b3IgKHZhbHVlczogSXRlbUVudHJ5T3B0aW9uc0ludGVyZmFjZSkge1xuXHRcdGluc3RhbnRpYXRlT3B0aW9ucyhcblx0XHRcdHRoaXMsXG5cdFx0XHR2YWx1ZXMsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgaW5zdGFudGlhdGVPcHRpb25zIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgeyBPbkNoYW5nZUZ1bmN0aW9uIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgSXRlbVJlc291cmNlIH0gZnJvbSAnLi9JdGVtUmVzb3VyY2UnO1xuXG5leHBvcnQgdHlwZSBJdGVtUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZVR5cGUgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8YW55PiA9IEl0ZW1SZXNvdXJjZTxhbnk+PiA9IFBhcnRpYWw8SXRlbVJlc291cmNlT3B0aW9uczxJdGVtUmVzb3VyY2VUeXBlPj47XG5cbmV4cG9ydCBjbGFzcyBJdGVtUmVzb3VyY2VPcHRpb25zPEl0ZW1SZXNvdXJjZVR5cGUgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8YW55PiA9IEl0ZW1SZXNvdXJjZTxhbnk+PiB7XG5cdHB1YmxpYyBlZGl0OiBib29sZWFuID0gZmFsc2U7XG5cdHB1YmxpYyByZW1vdGU6IGJvb2xlYW4gPSBmYWxzZTtcblx0cHVibGljIG9uQ2hhbmdlOiBPbkNoYW5nZUZ1bmN0aW9uPEl0ZW1SZXNvdXJjZVR5cGU+ID0gbm9vcDtcblxuXHRjb25zdHJ1Y3RvciAodmFsdWVzOiBJdGVtUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZVR5cGU+KSB7XG5cdFx0aW5zdGFudGlhdGVPcHRpb25zKHRoaXMsIHZhbHVlcyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtblNldCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5RmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtSWQsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5sZXQgY3VycmVudElkID0gMDtcblxuZXhwb3J0IGNsYXNzIEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4ge1xuXG5cdHB1YmxpYyBpZDogbnVtYmVyID0gKytjdXJyZW50SWQ7XG5cdHB1YmxpYyByZWxvYWRRdWV1ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBmYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHB1YmxpYyBpdGVtSWQ6IEl0ZW1JZCxcblx0XHRwdWJsaWMgY29sdW1uczogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4sXG5cdCkge1xuXHR9XG5cblx0cHVibGljIHF1ZXVlUmVsb2FkICgpOiB0aGlzIHtcblx0XHR0aGlzLnJlbG9hZFF1ZXVlZCA9IHRydWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBpc0xvY2FsICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5mYWN0b3J5LmtleVNlcnZpY2UuaXNMb2NhbElkKHRoaXMuaXRlbUlkKTtcblx0fVxuXG5cdHB1YmxpYyBpc0xvY2thYmxlICgpOiBib29sZWFuIHtcblx0XHRpZiAodGhpcy5pc0xvY2FsKCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKHRoaXMuaXRlbVR5cGUpIHtcblx0XHRcdGNhc2UgJ1Byb2plY3QnOlxuXHRcdFx0Y2FzZSAnTWF0ZXJpYWFsJzpcblx0XHRcdGNhc2UgJ0NvbnRhY3QnOlxuXHRcdFx0Y2FzZSAnTWVkZXdlcmtlcic6XG5cdFx0XHRjYXNlICdWb2VydHVpZyc6XG5cdFx0XHRjYXNlICdUZW1wbGF0ZSc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyB0b0pTT04gKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpZDogdGhpcy5pZCxcblx0XHRcdGNvbHVtbnM6IHRoaXMuY29sdW1ucyxcblx0XHR9O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVQYXRoLCBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBJdGVtUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSwgSXRlbVJlc291cmNlT3B0aW9ucyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBFbnRyeVBhcmVudE51bGwsIEZpZWxkTWFwLCBJdGVtVHlwZSwgUmVzcG9uc2VDb2x1bW4gfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblxuXHRwdWJsaWMgY29sdW1uczoge1tjb2x1bW5JZDogc3RyaW5nXTogUmVzcG9uc2VDb2x1bW59O1xuXHRwdWJsaWMgZmllbGRzOiBSZWFkb25seTxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+Pjtcblx0cHVibGljIGluaXRpYWw6IFJlYWRvbmx5PEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIHJlYWRvbmx5IGZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0cHVibGljIHJlYWRvbmx5IGVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRwdWJsaWMgcmVhZG9ubHkgb3B0aW9uczogSXRlbVJlc291cmNlT3B0aW9uczxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4sXG5cdFx0cHJvdGVjdGVkIHJlYWRvbmx5IF9pc05ldzogYm9vbGVhbixcblx0XHRwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHRoaXMuY29sdW1ucyA9IGVudHJ5LmNvbHVtbnMucmVzcG9uc2VbZW50cnkuY29sdW1ucy5pdGVtVHlwZV07XG5cdFx0dGhpcy5pbml0aWFsID0gdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0uaW5pdGlhbDtcblxuXHRcdHRoaXMub25Db25zdHJ1Y3QoKTtcblx0fVxuXG5cdC8vIFVzZWQgZm9yIHJlc291cmNlIGNsZWFyaW5nIHRlc3RzXG5cdHB1YmxpYyBvbkNvbnN0cnVjdCAoKTogdm9pZCB7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBGZXRjaGVzIHRoZSBJdGVtUmVzb3VyY2UncyBwYXJlbnQgd2l0aCB0aGUgY3VycmVudCBmaWVsZHNcblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLVxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIFVzZSB0aGlzIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgcGFyZW50IGFmdGVyIGFuIGl0ZW0gaGFzIGJlZW4gZGVsZXRlZFxuXHQgKi9cblx0cHVibGljIGdldFBhcmVudCAoXG5cdFx0ZnJvbUluaXRpYWw/OiBib29sZWFuLFxuXHQpOiBFbnRyeVBhcmVudE51bGwge1xuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChcblx0XHRcdHRoaXMuZW50cnksXG5cdFx0XHRmcm9tSW5pdGlhbCxcblx0XHRcdHRoaXMuZmllbGRzLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlcHJlY2F0ZWRcblx0ICogVXNlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhIHRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhfSBpbnN0ZWFkXG5cdCAqL1xuXHRwdWJsaWMgY2FsbE9uQ2hhbmdlIChwcmV2aW91czogRmllbGRNYXA8SXRlbVR5cGVUeXBlPik6IHZvaWQge1xuXHRcdGNvbnN0IHJlc291cmNlcyA9IHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbVJlc291cmNlc1t0aGlzLmVudHJ5LmlkXTtcblxuXHRcdGlmIChyZXNvdXJjZXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Zm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRyZXNvdXJjZS5vcHRpb25zLm9uQ2hhbmdlKFxuXHRcdFx0XHRcdFx0cmVzb3VyY2UsXG5cdFx0XHRcdFx0XHRwcmV2aW91cyxcblx0XHRcdFx0XHRcdGNvbHVtbklkID0+IHRoaXMuY29tcGFyZUl0ZW1GaWVsZChcblx0XHRcdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0dGhpcy5mYWN0b3J5LmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVhc2lseSBjaGVjayBpZiBhIGZpZWxkIGlzIGNoYW5nZWQuXG5cdCAqIFdpbGwgcmV0dXJuIGBmYWxzZWAgaWYgdGhlIGZpZWxkIGlzIGNoYW5nZWRcblx0ICpcblx0ICogQGV4YW1wbGVcblx0ICogb25DaGFuZ2U6IChcblx0ICogICAgIGl0ZW1SZXNvdXJjZSxcblx0ICogICAgIHByZXZpb3VzLFxuXHQgKiAgICAgY29tcGFyZUl0ZW1GaWVsZFxuXHQgKiApIHtcblx0ICogICAgIGlmICghY29tcGFyZUl0ZW1GaWVsZCgnY29sdW1uSWQnKSkge1xuXHQgKiAgICAgICAgIHByb2Nlc3NJdGVtKGl0ZW1SZXNvdXJjZSk7XG5cdCAqICAgICB9XG5cdCAqIH1cblx0ICovXG5cdHB1YmxpYyBjb21wYXJlSXRlbUZpZWxkIChcblx0XHRjb2x1bW5JZDoga2V5b2YgRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRwcmV2aW91czogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zW2NvbHVtbklkXTtcblxuXHRcdGlmIChjb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGNvbHVtbiBpbiBJdGVtUmVzb3VyY2UuY29tcGFyZUl0ZW1GaWVsZCcpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmZhY3RvcnkuYXBpRm9ybWF0dGVyLmNvbXBhcmVGaWVsZHMoXG5cdFx0XHRjb2x1bW4udHlwZSxcblx0XHRcdHRoaXMuZmllbGRzW2NvbHVtbklkXSxcblx0XHRcdHByZXZpb3VzW2NvbHVtbklkXSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGhhc0NoYW5nZXMgKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQudHJhbnNhY3Rpb25cblx0XHRcdC5pdGVtSGFuZGxlclxuXHRcdFx0LmRldGVjdEVudHJ5Q2hhbmdlcyh0aGlzLmVudHJ5LmlkKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRUcmFuc2FjdGlvblBhcmFtZXRlcnMgKFxuXHRcdHBhcmFtZXRlcnM6IGFueSxcblx0KTogdm9pZCB7XG5cdFx0Y3JlYXRlUGF0aChcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24udGFiUmVxdWVzdFBhcmFtZXRlcnMsXG5cdFx0XHRbXG5cdFx0XHRcdHRoaXMuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdHRoaXMuZW50cnkuaXRlbUlkLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0e30sXG5cdFx0XHRcdHBhcmFtZXRlcnMsXG5cdFx0XHRdLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqICdpc05ldycgbWVhbnMgdGhhdCB0aGUge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IGlzIGEgbG9jYWwgaXRlbSBhbmQgdGhhdCB0aGlzIHJlc291cmNlIHdhcyBjcmVhdGVkIHdoZW4gdGhlIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSB3YXMgZmlyc3QgY3JlYXRlZFxuXHQgKi9cblx0cHVibGljIGlzTmV3ICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5faXNOZXc7XG5cdH1cblxuXHRwdWJsaWMgaXNMb2NhbCAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZW50cnkuaXNMb2NhbCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZW1vdmVzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlfSBmcm9tIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSBUcmFuc2FjdGlvbkNhY2hlfSwgc28gdGhhdCB0aGUgT25DaGFuZ2UgY2FsbGJhY2sgd29uJ3QgYmUgY2FsbGVkIGFueW1vcmUuXG5cdCAqXG5cdCAqIFdhcm5pbmc6XG5cdCAqIFRoaXMgZG9lc24ndCByZXZlcnQgYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgaXRlbSwgaW4gb3JkZXIgdG8gcmV2ZXJ0IHRoZSBjaGFuZ2VzIHlvdSBzaG91bGQgdXNlIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmNsZWFySXRlbUVudHJ5IFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIuY2xlYXJJdGVtRW50cnl9XG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJSZXNvdXJjZSAoKTogdm9pZCB7XG5cdFx0dGhpcy50cmFuc2FjdGlvbi5jbGVhckl0ZW1SZXNvdXJjZSh0aGlzKTtcblx0fVxuXG5cdHB1YmxpYyB0b0pTT04gKCkge1xuXHRcdGNvbnN0IGNvbHVtbklkczogc3RyaW5nW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gdGhpcy5jb2x1bW5zKSB7XG5cdFx0XHRjb2x1bW5JZHMucHVzaChjb2x1bW5JZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbHVtbnM6IGNvbHVtbklkcyxcblx0XHRcdGZpZWxkczogdGhpcy5maWVsZHMsXG5cdFx0XHRlbnRyeTogdGhpcy5lbnRyeSxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uUGF0aCwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHBhdGggY291bGRuJ3QgYmUgdHJhdmVyc2VkXG5cdCAqXG5cdCAqIEBwYXJhbSBjb2x1bW5QYXRoIENhbiBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgY29sdW1uSWRzIChbJ2NvbHVtbicsICdjb2x1bW4yJ10pIG9yIGEgY29uZmlnIGNvbHVtbiBzdHJpbmcgKCdjb2x1bW4+Y29sdW1uMicpXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RGVyaXZlZFZhbHVlPFQgZXh0ZW5kcyBhbnkgPSBhbnk+IChjb2x1bW5QYXRoOiBzdHJpbmdbXSB8IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmdldERlcml2ZWRWYWx1ZShcblx0XHRcdHRoaXMuZW50cnksXG5cdFx0XHRjb2x1bW5QYXRoLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFRyYXZlcnNlcyB0aGUgY29sdW1uIHBhdGggYW5kIHJldHVybnMgdGhlIGZpZWxkcyBvZiB0aGUgZGVyaXZlZCBpdGVtLCByZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgaXRlbSBpc24ndCBmb3VuZFxuXHQgKlxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBBc3N1bWVzIHRoZSBkZXJpdmVkIGl0ZW0ncyB2YWx1ZXMgYXJlIGFscmVhZHkgY2FjaGVkXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RGVyaXZlZFZhbHVlcyAoXG5cdFx0Y29sdW1uUGF0aDogc3RyaW5nW10sXG5cdCk6IFJlYWRvbmx5PEZpZWxkTWFwPiB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZ2V0RGVyaXZlZFZhbHVlcyhcblx0XHRcdHRoaXMuZW50cnksXG5cdFx0XHRjb2x1bW5QYXRoLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgSXRlbVJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZSwgSXRlbVJlc291cmNlT3B0aW9ucyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBGaWVsZE1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+XG5cdGV4dGVuZHMgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4ge1xuXG5cdGZpZWxkczogUmVhZG9ubHk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj47XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yIChcblx0XHRmYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdGVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtUmVzb3VyY2VPcHRpb25zPFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pixcblx0XHRpc05ldzogYm9vbGVhbixcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRmYWN0b3J5LFxuXHRcdFx0ZW50cnksXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0aXNOZXcsXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXG5cdFx0dGhpcy5maWVsZHMgPSB0cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0uY2hhbmdlcztcblx0fVxufVxuIiwiaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBJdGVtUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSwgSXRlbVJlc291cmNlLCBJdGVtUmVzb3VyY2VPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEZpZWxkTWFwLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT5cblx0ZXh0ZW5kcyBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPiB7XG5cblx0cHJvdGVjdGVkIGxvY2FsQ29waWVzOiBBcnJheTxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdHB1YmxpYyBmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT47XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdGZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1SZXNvdXJjZU9wdGlvbnMsXG5cdFx0aXNOZXc6IGJvb2xlYW4sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0ZmFjdG9yeSxcblx0XHRcdGVudHJ5LFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdGlzTmV3LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblxuXHRcdHRoaXMuZmllbGRzID0gdHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbZW50cnkuaWRdLmNoYW5nZXM7XG5cdH1cblxuXHRwdWJsaWMgaXNOZXcgKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9pc05ldztcblx0fVxuXG5cdHB1YmxpYyBjb3B5RmllbGRzIChkZXN0aW5hdGlvbjogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiA9IHt9KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5lbnRyeTtcblxuXHRcdHRoaXMuZmFjdG9yeS5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdHRoaXMuZmllbGRzLFxuXHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gZGVzdGluYXRpb247XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFVwZGF0ZXMgdGhlIGZpZWxkcyBvZiB0aGUgaXRlbSBhbmQgY2FsbHMgb25DaGFuZ2UsIHdoZW4gdXBkYXRpbmcgbWFueSBmaWVsZHMgb2YgbWFueSBpdGVtcyBpdCdzIGJldHRlciB0byBjcmVhdGUgYSB7QGxpbmsgQ2hhbmdlc0RlbHRhIENoYW5nZXNEZWx0YX0geW91cnNlbGYgc28gYWxsIGNoYW5nZXMgY2FuIGJlIGFwcGxpZWQgYXQgb25jZVxuXHQgKi9cblx0cHVibGljIHNldEZpZWxkcyAoXG5cdFx0dmFsdWVzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHRoaXM+IHtcblx0XHRjb25zdCBjb2x1bW5zID0gdGhpcy5jb2x1bW5zO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiB2YWx1ZXMpIHtcblx0XHRcdGNvbnN0IGNvbHVtbiA9IGNvbHVtbnNbY29sdW1uSWRdO1xuXG5cdFx0XHRpZiAoY29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHRcdCdzZXRGaWVsZHM6IG5vIGNvbHVtbiBmb3VuZCBmb3InLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMudHJhbnNhY3Rpb24uY3JlYXRlQ2hhbmdlc0RlbHRhKCk7XG5cblx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0dmFsdWVzLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0LmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB0aGlzLFxuXHRcdFx0XHR0aGlzLmZhY3RvcnkuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvLyB0b2RvW2NhY2hlXSBTaG91bGQgeW91IHN0aWxsIGJlIGFibGUgdG8gZG8gdGhpcyA/IEV2ZXJ5dGhpbmcgc2hvdWxkIGhhcHBlbiBpbiBhIHRyYW5zYWN0aW9uXG5cdC8vIHB1YmxpYyBzYXZlIChwYXJhbWV0ZXJzPzogYW55KTogUHJvbWlzZUludGVyZmFjZTx0aGlzPiB7XG5cdC8vIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmZhY3Rvcnk7XG5cdC8vIGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZW50cnk7XG5cdC8vIGNvbnN0IHBhcmFtZXRlck1hcCA9IHt9O1xuXHQvL1xuXHQvLyBpZiAocGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG5cdC8vIFx0Y3JlYXRlUGF0aChcblx0Ly8gXHRcdHBhcmFtZXRlck1hcCxcblx0Ly8gXHRcdFtcblx0Ly8gXHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHQvLyBcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHQvLyBcdFx0XSxcblx0Ly8gXHRcdFtcblx0Ly8gXHRcdFx0e30sXG5cdC8vIFx0XHRcdHBhcmFtZXRlcnMsXG5cdC8vIFx0XHRdLFxuXHQvLyBcdCk7XG5cdC8vIH1cblx0Ly9cblx0Ly8gcmV0dXJuIChcblx0Ly8gXHRpdGVtRW50cnkuaXNMb2NrYWJsZSgpID9cblx0Ly8gXHRcdGZhY3RvcnkubG9ja1NlcnZpY2UuZmV0Y2hMb2NrKGl0ZW1FbnRyeSkgOlxuXHQvLyBcdFx0ZmFjdG9yeS5wcm9taXNlU2VydmljZS53aGVuKClcblx0Ly8gKS50aGVuKFxuXHQvLyBcdCgpID0+IHtcblx0Ly8gXHRcdC8vIGFkZFRvQ29sbGVjdGlvbnMgaXMgY2FsbGVkIGluIGNoYW5nZXNQcm9jZXNzb3Jcblx0Ly8gXHRcdHJldHVybiB0aGlzLmNoYW5nZXNQcm9jZXNzb3IuZXhlY3V0ZShcblx0Ly8gXHRcdFx0W2l0ZW1FbnRyeV0sXG5cdC8vIFx0XHRcdFtdLFxuXHQvLyBcdFx0XHRwYXJhbWV0ZXJNYXAsXG5cdC8vIFx0XHQpO1xuXHQvLyBcdH0sXG5cdC8vIFx0ZmFjdG9yeS5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHQvLyApXG5cdC8vIFx0LnRoZW4oXG5cdC8vIFx0XHQoKSA9PiB7XG5cdC8vIFx0XHRcdHJldHVybiB0aGlzO1xuXHQvLyBcdFx0fSxcblx0Ly8gXHRcdGZhY3RvcnkuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0Ly8gXHQpO1xuXHQvLyB9XG59XG4iLCJpbXBvcnQgeyBpbnN0YW50aWF0ZU9wdGlvbnMgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBBcGlSZXF1ZXN0Q29sdW1ucywgQXBpUmVxdWVzdExpbWl0LCBFbnRyeVBhcmVudE51bGwgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25FbnRyeU9wdGlvbnNJbnRlcmZhY2UgPSBQYXJ0aWFsPENvbGxlY3Rpb25FbnRyeU9wdGlvbnM+O1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyB7XG5cdGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zID0gW107XG5cdHF1ZXJ5OiBBcGlRdWVyeSB8IG51bGwgPSBudWxsO1xuXHRxdWVyeVBhcmFtczogYW55ID0ge307IC8vIFRPRE9cblx0cXVlcnlDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyA9IFtdO1xuXHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCA9IG51bGw7XG5cdGRlZmVyUmVxdWVzdDogYm9vbGVhbiA9IGZhbHNlO1xuXHRsaW1pdDogQXBpUmVxdWVzdExpbWl0IHwgbnVsbCA9IG51bGw7XG5cdGVudHJ5S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuXHRjb25zdHJ1Y3RvciAodmFsdWVzOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zSW50ZXJmYWNlKSB7XG5cdFx0aW5zdGFudGlhdGVPcHRpb25zKFxuXHRcdFx0dGhpcyxcblx0XHRcdHZhbHVlcyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBpbnN0YW50aWF0ZU9wdGlvbnMgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgQ29sbGVjdGlvblJlc291cmNlLCBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDb252ZXJzaW9uTWFwLCBJdGVtVHlwZSwgT25DaGFuZ2VGdW5jdGlvbiB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc291cmNlQ2FsbGJhY2s8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0gKFxuXHRpdGVtUmVzb3VyY2VzOiBBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4sXG5cdGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25SZXNvdXJjZU9uQWRkQ2FsbGJhY2s8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0gKFxuXHRpdGVtUmVzb3VyY2VzOiBBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4sXG5cdGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdGlzSW5pdGlhbENhbGw6IGJvb2xlYW4sXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25SZXNvdXJjZUluaXRpYWxDYWxsYmFjazxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSAoXG5cdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIE9uSXRlbXNDcmVhdGVkQ2FsbGJhY2sgPSAoY29udmVyc2lvbk1hcDogQ29udmVyc2lvbk1hcCkgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSBQYXJ0aWFsPENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnM8SXRlbVR5cGVUeXBlPj47XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiB7XG5cdGVkaXRJdGVtczogYm9vbGVhbiA9IGZhbHNlO1xuXHRyZW1vdGVJdGVtczogYm9vbGVhbiA9IGZhbHNlO1xuXHRlZGl0Q29sbGVjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXHRlbmFibGVTYXZlOiBib29sZWFuID0gdHJ1ZTtcblx0Y2FsbE9uQWRkV2l0aEluaXRpYWxJdGVtczogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBAZGVwcmVjYXRlZFxuXHQgKiBZb3Ugc2hvdWxkIHVzZSBpdGVtUmVzb3VyY2Uub25DaGFuZ2UgYW5kIGNvbXBhcmUgcHJldmlvdXMuaWQgd2l0aCBmaWVsZHMuaWRcblx0ICovXG5cdG9uSXRlbXNDcmVhdGVkOiBPbkl0ZW1zQ3JlYXRlZENhbGxiYWNrID0gbm9vcDtcblx0b25DaGFuZ2U6IE9uQ2hhbmdlRnVuY3Rpb24gPSBub29wO1xuXHRvbkFkZDogQ29sbGVjdGlvblJlc291cmNlT25BZGRDYWxsYmFjazxJdGVtVHlwZVR5cGU+ID0gbm9vcDtcblx0b25SZW1vdmU6IENvbGxlY3Rpb25SZXNvdXJjZUNhbGxiYWNrPEl0ZW1UeXBlVHlwZT4gPSBub29wO1xuXHRvbkFkZEluaXRpYWw6IENvbGxlY3Rpb25SZXNvdXJjZUluaXRpYWxDYWxsYmFjazxJdGVtVHlwZVR5cGU+ID0gbm9vcDtcblx0b25SZW1vdmVJbml0aWFsOiBDb2xsZWN0aW9uUmVzb3VyY2VJbml0aWFsQ2FsbGJhY2s8SXRlbVR5cGVUeXBlPiA9IG5vb3A7XG5cdHJlc291cmNlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblx0Y3VzdG9tOiBhbnkgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yICh2YWx1ZXM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPikge1xuXHRcdGluc3RhbnRpYXRlT3B0aW9ucyhcblx0XHRcdHRoaXMsXG5cdFx0XHR2YWx1ZXMsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5U2VydmljZSwgQ29sdW1uRXhwYW5zaW9uLCBDb2x1bW5JbmZvLCBDb2x1bW5TZXQsIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvbHVtblNldEZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRBcGlRdWVyeSxcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdENvbGxlY3Rpb25RdWVyeSxcblx0RW50cnlQYXJlbnROdWxsLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1UeXBlLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxuXHRRdWVyeUNhbGxiYWNrLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmxldCBjdXJyZW50SWQgPSAwO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiB7XG5cblx0cHVibGljIGlkOiBudW1iZXIgPSBjdXJyZW50SWQrKztcblx0cHVibGljIHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbDtcblx0cHVibGljIHF1ZXJ5OiBDb2xsZWN0aW9uUXVlcnk7XG5cdHB1YmxpYyBjb2x1bW5zOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPjtcblx0cHVibGljIHJlbG9hZFF1ZXVlZDogYm9vbGVhbiA9IGZhbHNlO1xuXHRwdWJsaWMgcHJvbWlzZTogUHJvbWlzZUludGVyZmFjZTx0aGlzPjtcblxuXHQvLyBwcml2YXRlIHRlbXBsYXRlQ29sdW1uczogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4gfCBudWxsID0gbnVsbDtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHVibGljIGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cHVibGljIG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCkge1xuXHRcdHRoaXMucGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG5cdFx0dGhpcy5xdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShvcHRpb25zKTtcblx0XHR0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0U3R1Yihcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgaXNMb2NhbCAoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMua2V5U2VydmljZS5pc0xvY2FsSWQocGFyZW50Lml0ZW1JZCk7XG5cdH1cblxuXHRwdWJsaWMgbWF0Y2hQYXJlbnQgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gPT0gdG8gY29tcGFyZSBpdGVtSWRzXG5cdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRyZXR1cm4gcGFyZW50Lml0ZW1UeXBlID09PSBpdGVtVHlwZSAmJiBwYXJlbnQuaXRlbUlkID09IGl0ZW1JZDtcblx0fVxuXG5cdHB1YmxpYyBleHRlbmRRdWVyeSAoY2FsbGJhY2s/OiBRdWVyeUNhbGxiYWNrKTogQXBpUXVlcnkge1xuXHRcdGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cblx0XHRpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucXVlcnk7XG5cdFx0fVxuXG5cdFx0b3B0aW9ucy5xdWVyeVBhcmFtcyA9IGNhbGxiYWNrKG9wdGlvbnMucXVlcnlQYXJhbXMpO1xuXG5cdFx0cmV0dXJuIHRoaXMucXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkob3B0aW9ucyk7XG5cdH1cblxuXHRwdWJsaWMgcXVldWVSZWxvYWQgKCk6IHZvaWQge1xuXHRcdHRoaXMucmVsb2FkUXVldWVkID0gdHJ1ZTtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRDb2x1bW5zIChjb2x1bW5FeHBhbnNpb246IENvbHVtbkV4cGFuc2lvbjxJdGVtVHlwZVR5cGU+KTogdm9pZCB7XG5cdFx0Y29uc3QgZXhwYW5zaW9uUmVzdWx0ID0gY29sdW1uRXhwYW5zaW9uLnJ1bih0aGlzLmNvbHVtbnMpO1xuXG5cdFx0aWYgKGV4cGFuc2lvblJlc3VsdCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuY29sdW1ucyA9IGV4cGFuc2lvblJlc3VsdC5tZXJnZWQ7XG5cdFx0Ly8gdGhpcy50ZW1wbGF0ZUNvbHVtbnMgPSBudWxsO1xuXHRcdHRoaXMub3B0aW9ucy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLnJlcXVlc3Q7XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kUmVxdWVzdENvbHVtbnMgKHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyk6IHZvaWQge1xuXHRcdHRoaXMuY29sdW1ucy5leHBhbmRSZXF1ZXN0Q29sdW1ucyhyZXF1ZXN0Q29sdW1ucyk7XG5cdFx0dGhpcy5vcHRpb25zLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMucmVxdWVzdDtcblx0fVxuXG5cdHB1YmxpYyBnZXRVcGRhdGVkSXRlbUNvbHVtbnMgKFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IHtbY29sdW1uSWQ6IHN0cmluZ106IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPn0ge1xuXHRcdGNvbnN0IGl0ZW1Db2x1bW5zID0gdGhpcy5jb2x1bW5zLml0ZW07XG5cdFx0Y29uc3QgcmVzdWx0OiB7W2NvbHVtbklkOiBzdHJpbmddOiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT59ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBpdGVtQ29sdW1ucykge1xuXHRcdFx0aWYgKGNvbnZlcnNpb25NYXBbY29sdW1uLmFwaUNvbHVtbi5pdGVtVHlwZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXN1bHRbY29sdW1uLmlkXSA9IGNvbHVtbjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Ly8gdG9kb1tjYWNoZV1cblx0Ly8gZ2V0QWRkZWRJdGVtcyAocmV0dXJuSXRlbUlkczogdHJ1ZSk6IEl0ZW1JZFtdO1xuXHQvLyBnZXRBZGRlZEl0ZW1zIChyZXR1cm5JdGVtSWRzPzogYm9vbGVhbik6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pjtcblx0Ly8gZ2V0QWRkZWRJdGVtcyAocmV0dXJuSXRlbUlkczogYm9vbGVhbiA9IGZhbHNlKSB7XG5cdC8vIFx0Y29uc3QgaW5pdGlhbCA9IHRoaXMuaW5pdGlhbDtcblx0Ly8gXHRjb25zdCBtb2RpZmllZCA9IHRoaXMuaXRlbXM7XG5cdC8vIFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPiB8IEl0ZW1JZD4gPSBbXTtcblx0Ly9cblx0Ly8gXHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBtb2RpZmllZCkge1xuXHQvLyBcdFx0aWYgKGluaXRpYWwuaW5kZXhPZihpdGVtRW50cnkpID09PSAtMSkge1xuXHQvLyBcdFx0XHRyZXN1bHQucHVzaChyZXR1cm5JdGVtSWRzID8gaXRlbUVudHJ5Lml0ZW1JZCA6IGl0ZW1FbnRyeSk7XG5cdC8vIFx0XHR9XG5cdC8vIFx0fVxuXHQvL1xuXHQvLyBcdHJldHVybiByZXN1bHQ7XG5cdC8vIH1cblx0Ly9cblx0Ly8gZ2V0UmVtb3ZlZEl0ZW1zIChyZXR1cm5JdGVtSWRzOiB0cnVlKTogSXRlbUlkW107XG5cdC8vIGdldFJlbW92ZWRJdGVtcyAocmV0dXJuSXRlbUlkcz86IGJvb2xlYW4pOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj47XG5cdC8vIGdldFJlbW92ZWRJdGVtcyAocmV0dXJuSXRlbUlkczogYm9vbGVhbiA9IGZhbHNlKSB7XG5cdC8vIFx0Y29uc3QgaW5pdGlhbCA9IHRoaXMuaW5pdGlhbDtcblx0Ly8gXHRjb25zdCBtb2RpZmllZCA9IHRoaXMuaXRlbXM7XG5cdC8vIFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPiB8IEl0ZW1JZD4gPSBbXTtcblx0Ly9cblx0Ly8gXHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpbml0aWFsKSB7XG5cdC8vIFx0XHRpZiAobW9kaWZpZWQuaW5kZXhPZihpdGVtRW50cnkpID09PSAtMSkge1xuXHQvLyBcdFx0XHRyZXN1bHQucHVzaChyZXR1cm5JdGVtSWRzID8gaXRlbUVudHJ5Lml0ZW1JZCA6IGl0ZW1FbnRyeSk7XG5cdC8vIFx0XHR9XG5cdC8vIFx0fVxuXHQvL1xuXHQvLyBcdHJldHVybiByZXN1bHQ7XG5cdC8vIH1cblx0Ly9cblx0Ly8gZ2V0VXBkYXRlZEl0ZW1zICgpOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHQvLyBcdGNvbnN0IG1vZGlmaWVkID0gdGhpcy5pdGVtcztcblx0Ly8gXHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHQvL1xuXHQvLyBcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIG1vZGlmaWVkKSB7XG5cdC8vIFx0XHRpZiAoIWl0ZW1FbnRyeS5pc0xvY2FsKCkgJiYgaXRlbUVudHJ5Lmhhc0NoYW5nZXMoKSkge1xuXHQvLyBcdFx0XHRyZXN1bHQucHVzaChpdGVtRW50cnkpO1xuXHQvLyBcdFx0fVxuXHQvLyBcdH1cblx0Ly9cblx0Ly8gXHRyZXR1cm4gcmVzdWx0O1xuXHQvLyB9XG5cblx0Ly8gdG9kb1tjYWNoZV0gVGhpcyBpcyB1c2VkIGluIHRoZSBmcm9udGVuZCBpbiB0aGUgcGxhbm5lciwgYnV0IEkgdGhpbmsgd2Ugc2hvdWxkIGZpeCB0aGF0IGluIHRoZSBmcm9udGVuZCBzb21lIG90aGVyIHdheVxuXHQvLyBwdWJsaWMgb25BZGRJbml0aWFsIChpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+KTogdm9pZCB7XG5cdC8vIFx0Zm9yIChjb25zdCByZXNvdXJjZSBvZiB0aGlzLnJlc291cmNlcykge1xuXHQvLyBcdFx0dHJ5IHtcblx0Ly8gXHRcdFx0cmVzb3VyY2Uub3B0aW9ucy5vbkFkZEluaXRpYWwoXG5cdC8vIFx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdC8vIFx0XHRcdFx0dGhpcyxcblx0Ly8gXHRcdFx0KTtcblx0Ly8gXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdC8vIFx0XHRcdHRoaXMuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdC8vIFx0XHR9XG5cdC8vIFx0fVxuXHQvLyB9XG5cdC8vXG5cdC8vIHB1YmxpYyBvblJlbW92ZUluaXRpYWwgKGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4pOiB2b2lkIHtcblx0Ly8gXHRmb3IgKGNvbnN0IHJlc291cmNlIG9mIHRoaXMucmVzb3VyY2VzKSB7XG5cdC8vIFx0XHR0cnkge1xuXHQvLyBcdFx0XHRyZXNvdXJjZS5vcHRpb25zLm9uUmVtb3ZlSW5pdGlhbChcblx0Ly8gXHRcdFx0XHRpdGVtRW50cmllcyxcblx0Ly8gXHRcdFx0XHR0aGlzLFxuXHQvLyBcdFx0XHQpO1xuXHQvLyBcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0Ly8gXHRcdFx0dGhpcy5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0Ly8gXHRcdH1cblx0Ly8gXHR9XG5cdC8vIH1cbn1cbiIsImltcG9ydCB7IGZpbHRlckFycmF5IH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLCBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZSwgTG9jYWxWaWV3UmVzb3VyY2UgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0RmllbGRNYXAsXG5cdEl0ZW1JZCxcblx0SXRlbVJlc291cmNlSXRlbUlkTWFwLFxuXHRJdGVtVHlwZSxcblx0T25DaGFuZ2VGdW5jdGlvbixcblx0UHJvbWlzZUludGVyZmFjZSxcblx0UXVlcnlDYWxsYmFjayxcblx0UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55LCBUIGV4dGVuZHMgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4gPSBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cblx0cHVibGljIGl0ZW1zOiBUW107XG5cdHB1YmxpYyBjb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwO1xuXHRwcm90ZWN0ZWQgaXRlbUlkTWFwOiBJdGVtUmVzb3VyY2VJdGVtSWRNYXA8VD4gPSB7fTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IG9uQ2hhbmdlOiBPbkNoYW5nZUZ1bmN0aW9uO1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIGZhY3Rvcnk6IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0cHVibGljIGVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRwdWJsaWMgb3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGU+LFxuXHRcdHB1YmxpYyB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0dGhpcy5pdGVtcyA9IFtdO1xuXHRcdHRoaXMuaXRlbUlkTWFwID0ge307XG5cdFx0dGhpcy5jb2x1bW5zID0gZW50cnkuY29sdW1ucy5yZXNwb25zZTtcblxuXHRcdC8vIHRoaXMgYWxsb3dzIHVzIHRvIHVwZGF0ZSB0aGUgb25DaGFuZ2UgZnVuY3Rpb24gaW4gdGhlIG9wdGlvbnNcblx0XHR0aGlzLm9uQ2hhbmdlID0gKFxuXHRcdFx0aXRlbVJlc291cmNlOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0XHRcdHByZXZpb3VzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdFx0X2NvbXBhcmVGaWVsZCxcblx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0KSA9PiB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFpdGVtUmVzb3VyY2UuY29tcGFyZUl0ZW1GaWVsZChcblx0XHRcdFx0XHQnaWQnLFxuXHRcdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gdG9kb1tjYWNoZV0gY2hlY2sgaWYgcHJldmlvdXMuaWQgbWF0Y2hlcyB3aXRoIElEcyBpbiB0aGUgbWFwXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1JZE1hcFtwcmV2aW91cy5pZF07XG5cdFx0XHRcdHRoaXMuaXRlbUlkTWFwW2l0ZW1SZXNvdXJjZS5lbnRyeS5pdGVtSWRdID0gaXRlbVJlc291cmNlIGFzIFQ7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMub3B0aW9ucy5vbkNoYW5nZShcblx0XHRcdFx0aXRlbVJlc291cmNlLFxuXHRcdFx0XHRwcmV2aW91cyxcblx0XHRcdFx0Y29sdW1uSWQgPT4gaXRlbVJlc291cmNlLmNvbXBhcmVJdGVtRmllbGQoXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHRcdCksXG5cdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHQpO1xuXHRcdH07XG5cblx0XHR0aGlzLmFkZEl0ZW1SZXNvdXJjZXMoXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmNvbGxlY3Rpb25DaGFuZ2VzW3RoaXMuZW50cnkuaWRdLFxuXHRcdFx0dHJ1ZSxcblx0XHQpO1xuXG5cdFx0dGhpcy5vbkNvbnN0cnVjdCgpO1xuXHR9XG5cblx0Ly8gVXNlZCBmb3IgcmVzb3VyY2UgY2xlYXJpbmcgdGVzdHNcblx0cHVibGljIG9uQ29uc3RydWN0ICgpOiB2b2lkIHtcblxuXHR9XG5cblx0cHVibGljIGdldElkQXJyYXkgKCk6IEl0ZW1JZFtdIHtcblx0XHRyZXR1cm4gdGhpcy5pdGVtcy5tYXAoXG5cdFx0XHRpdGVtUmVzb3VyY2UgPT4gaXRlbVJlc291cmNlLmVudHJ5Lml0ZW1JZCxcblx0XHQpO1xuXHR9XG5cblx0Ly8gdG9kb1t0eXBlXSBJdGVtcyBjYW4gYmUgdW5kZWZpbmVkLCBidXQgdGhpcyBnaXZlcyBhIGxvdCBvZiBlcnJvcnMgZnJvbnRlbmRcblx0cHVibGljIGdldEl0ZW1CeUlkIChpdGVtSWQ6IG51bWJlcik6IFQge1xuXHRcdHJldHVybiB0aGlzLml0ZW1JZE1hcFtpdGVtSWRdO1xuXHR9XG5cblx0cHVibGljIGFkZEl0ZW1SZXNvdXJjZXMgKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0aXNJbml0aWFsQ2FsbDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBUW10geyAvLyBzaG91bGQgYmUgZmFzdFxuXHRcdGlmIChpdGVtRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRjb25zdCBsb2NhbEl0ZW1FbnRyaWVzID0gdGhpcy5pdGVtcy5tYXAoXG5cdFx0XHRpdGVtUmVzb3VyY2UgPT4gaXRlbVJlc291cmNlLmVudHJ5LFxuXHRcdCk7XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBsb29rIGluIGl0ZW1JZE1hcCA/IHdlIG9ubHkgd2FudCB0byBhZGQgcmVzb3VyY2VzIGlmIHRoZXJlIGlzIG5vbmUgeWV0XG5cdFx0aXRlbUVudHJpZXMgPSBpdGVtRW50cmllcy5maWx0ZXIoXG5cdFx0XHRpdGVtRW50cnkgPT4gbG9jYWxJdGVtRW50cmllcy5pbmRleE9mKGl0ZW1FbnRyeSkgPT09IC0xLFxuXHRcdCk7XG5cblx0XHRjb25zdCBpdGVtUmVzb3VyY2VzID0gdGhpcy50cmFuc2FjdGlvbi5jcmVhdGVJdGVtUmVzb3VyY2VzKFxuXHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHR7XG5cdFx0XHRcdHJlbW90ZTogdGhpcy5vcHRpb25zLnJlbW90ZUl0ZW1zLFxuXHRcdFx0XHRlZGl0OiB0aGlzLm9wdGlvbnMuZWRpdEl0ZW1zLFxuXHRcdFx0XHRvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSxcblx0XHRcdH0sXG5cdFx0KSBhcyBUW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtUmVzb3VyY2VzKSB7XG5cdFx0XHRjb25zdCBpdGVtSWQgPSBpdGVtUmVzb3VyY2UuZW50cnkuaXRlbUlkO1xuXG5cdFx0XHRpZiAodGhpcy5pdGVtSWRNYXBbaXRlbUlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignQWRkZWQgYSByZXNvdXJjZSBvZiBhbiBlbnRyeSB0aGF0IHdhcyBhbHJlYWR5IGluIHRoZSBjb2xsZWN0aW9uICEnKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5pdGVtcy5wdXNoKGl0ZW1SZXNvdXJjZSk7XG5cdFx0XHR0aGlzLml0ZW1JZE1hcFtpdGVtSWRdID0gaXRlbVJlc291cmNlO1xuXHRcdH1cblxuXHRcdGlmICghaXNJbml0aWFsQ2FsbCB8fCB0aGlzLm9wdGlvbnMuY2FsbE9uQWRkV2l0aEluaXRpYWxJdGVtcykge1xuXHRcdFx0dGhpcy5jYWxsT25BZGQoXG5cdFx0XHRcdGl0ZW1SZXNvdXJjZXMsXG5cdFx0XHRcdGlzSW5pdGlhbENhbGwsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBpdGVtUmVzb3VyY2VzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZXN9IHRoYXQgd2hlcmUgcmVtb3ZlZCBmcm9tIHRoZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlIGNvbGxlY3Rpb259LlxuXHQgKiBGaWx0ZXJzIG9uIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlfS57QGxpbmsgSXRlbUVudHJ5IGVudHJ5fSA9PT0ge0BsaW5rIEl0ZW1FbnRyeSBlbnRyeX1cblx0ICovXG5cdHB1YmxpYyByZW1vdmVJdGVtUmVzb3VyY2VzIChpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+KTogVFtdIHtcblx0XHRjb25zdCByZXN1bHQ6IFRbXSA9IFtdO1xuXG5cdFx0ZmlsdGVyQXJyYXkoXG5cdFx0XHR0aGlzLml0ZW1zLFxuXHRcdFx0aXRlbVJlc291cmNlID0+IHtcblx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdFx0XHRpZiAoaXRlbVJlc291cmNlLmVudHJ5ID09PSBpdGVtRW50cnkpIHtcblx0XHRcdFx0XHRcdGl0ZW1SZXNvdXJjZS5jbGVhclJlc291cmNlKCk7XG5cdFx0XHRcdFx0XHRyZXN1bHQucHVzaChpdGVtUmVzb3VyY2UpO1xuXHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuaXRlbUlkTWFwW2l0ZW1FbnRyeS5pdGVtSWRdO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGNhbGxPbkFkZCAoXG5cdFx0aXRlbVJlc291cmNlczogVFtdLFxuXHRcdGlzSW5pdGlhbENhbGw6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogdm9pZCB7XG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMub3B0aW9ucy5vbkFkZChcblx0XHRcdFx0aXRlbVJlc291cmNlcyxcblx0XHRcdFx0dGhpcyxcblx0XHRcdFx0aXNJbml0aWFsQ2FsbCxcblx0XHRcdCk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMuZmFjdG9yeS5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgY2FsbE9uUmVtb3ZlIChpdGVtUmVzb3VyY2VzOiBUW10pOiB2b2lkIHtcblx0XHR0cnkge1xuXHRcdFx0dGhpcy5vcHRpb25zLm9uUmVtb3ZlKFxuXHRcdFx0XHRpdGVtUmVzb3VyY2VzLFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5mYWN0b3J5LmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmb3JFYWNoIChjYWxsYmFjazogKGl0ZW1SZXNvdXJjZTogVCkgPT4gdm9pZCk6IHZvaWQge1xuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZXMgPSB0aGlzLml0ZW1zO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbVJlc291cmNlcykge1xuXHRcdFx0Y2FsbGJhY2soaXRlbVJlc291cmNlKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZmlsdGVyIChjYWxsYmFjazogKGl0ZW1SZXNvdXJjZTogVCkgPT4gYm9vbGVhbik6IFRbXSB7XG5cdFx0Y29uc3QgaXRlbVJlc291cmNlcyA9IHRoaXMuaXRlbXM7XG5cdFx0Y29uc3QgcmVzdWx0OiBUW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1SZXNvdXJjZXMpIHtcblx0XHRcdGlmIChjYWxsYmFjayhpdGVtUmVzb3VyY2UpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1SZXNvdXJjZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBmaXJzdCAoY2FsbGJhY2s6IChpdGVtUmVzb3VyY2U6IFQpID0+IGJvb2xlYW4pOiBUIHwgbnVsbCB7XG5cdFx0Y29uc3QgaXRlbVJlc291cmNlcyA9IHRoaXMuaXRlbXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtUmVzb3VyY2VzKSB7XG5cdFx0XHRpZiAoY2FsbGJhY2soaXRlbVJlc291cmNlKSkge1xuXHRcdFx0XHRyZXR1cm4gaXRlbVJlc291cmNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0cHVibGljIHNvbWUgKGNhbGxiYWNrOiAoaXRlbVJlc291cmNlOiBUKSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZmlyc3QoY2FsbGJhY2spICE9PSBudWxsO1xuXHR9XG5cblx0cHVibGljIGdyb3VwQnkgKGFyZ3VtZW50OiBzdHJpbmcgfCAoKGl0ZW1SZXNvdXJjZTogVCkgPT4gc3RyaW5nIHwgbnVsbCkpOiB7W2tleTogc3RyaW5nXTogVFtdfSB7XG5cdFx0Y29uc3QgaXRlbXNSZXNvdXJjZXMgPSB0aGlzLml0ZW1zO1xuXHRcdGNvbnN0IHJlc3VsdDoge1trZXk6IHN0cmluZ106IFRbXX0gPSB7fTtcblxuXHRcdGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRpZiAodGhpcy5lbnRyeS5jb2x1bW5zLnJlc3BvbnNlW3RoaXMuZW50cnkuaXRlbVR5cGVdW2FyZ3VtZW50XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVHJ5aW5nIHRvIGdyb3VwIG9uIGEgY29sdW1uIG5vdCByZXF1ZXN0ZWQgYnkgdGhpcyBjb2xsZWN0aW9uISAoY29sdW1uICcke2FyZ3VtZW50fScpYCk7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1zUmVzb3VyY2VzKSB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gaXRlbVJlc291cmNlLmZpZWxkc1thcmd1bWVudF07XG5cblx0XHRcdFx0aWYgKHJlc3VsdFt2YWx1ZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJlc3VsdFt2YWx1ZV0gPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlc3VsdFt2YWx1ZV0ucHVzaChpdGVtUmVzb3VyY2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1zUmVzb3VyY2VzKSB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gYXJndW1lbnQoaXRlbVJlc291cmNlKTtcblxuXHRcdFx0XHRpZiAodmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChyZXN1bHRbdmFsdWVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbdmFsdWVdID0gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHRbdmFsdWVdLnB1c2goaXRlbVJlc291cmNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIG1hcDxVPiAoYXJndW1lbnQ6IHN0cmluZyB8ICgoaXRlbVJlc291cmNlOiBUKSA9PiBVKSk6IFVbXSB7XG5cdFx0Y29uc3QgaXRlbVJlc291cmNlcyA9IHRoaXMuaXRlbXM7XG5cdFx0Y29uc3QgbGVuZ3RoID0gaXRlbVJlc291cmNlcy5sZW5ndGg7XG5cdFx0Y29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGxlbmd0aCk7XG5cblx0XHRpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuXHRcdFx0XHRyZXN1bHRbaV0gPSBpdGVtUmVzb3VyY2VzW2ldLmZpZWxkc1thcmd1bWVudF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBhcmd1bWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuXHRcdFx0XHRyZXN1bHRbaV0gPSBhcmd1bWVudChpdGVtUmVzb3VyY2VzW2ldKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIHJlZHVjZTxVPiAoXG5cdFx0Y2FsbGJhY2s6IChcblx0XHRcdGl0ZW1SZXNvdXJjZTogVCxcblx0XHRcdHZhbHVlOiBVLFxuXHRcdCkgPT4gVSxcblx0XHR2YWx1ZTogVSxcblx0KTogVSB7XG5cdFx0Y29uc3QgaXRlbVJlc291cmNlcyA9IHRoaXMuaXRlbXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtUmVzb3VyY2VzKSB7XG5cdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKFxuXHRcdFx0XHRpdGVtUmVzb3VyY2UsXG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgbmV3IGl0ZW1zIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGNvbGxlY3Rpb25cblx0ICpcblx0ICogQHJlbWFya3Ncblx0ICogLSBVc2VkIHRvIHJldHVybiB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZXN9LCBidXQgeW91IHNob3VsZCB0aGUge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZS5vbkFkZCBvbkFkZCkgaW5zdGVhZFxuXHQgKi9cblx0cHVibGljIGV4dGVuZCAoXG5cdFx0cXVlcnlDYWxsYmFjazogUXVlcnlDYWxsYmFjayxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQudHJhbnNhY3Rpb25cblx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmV4dGVuZENvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0dGhpcy5lbnRyeSxcblx0XHRcdFx0cXVlcnlDYWxsYmFjayxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgdGhlIHJlZmVyZW5jZSB0byB0aGUge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZSBDb2xsZWN0aW9uUmVzb3VyY2V9IGZyb20gdGhlIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJ5fVxuXHQgKlxuXHQgKiBAcmVtYXJrc1xuXHQgKiAtIERvZXNuJ3QgcmV2ZXJ0IGNoYW5nZXMgb24gdGhlIGl0ZW1zIHRoZW1zZWx2ZXNcblx0ICovXG5cdHB1YmxpYyBjbGVhclJlc291cmNlIChjbGVhckl0ZW1zOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuXHRcdGlmIChjbGVhckl0ZW1zKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiB0aGlzLml0ZW1zKSB7XG5cdFx0XHRcdGl0ZW1SZXNvdXJjZS5jbGVhclJlc291cmNlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy50cmFuc2FjdGlvbi5jbGVhckNvbGxlY3Rpb25SZXNvdXJjZSh0aGlzKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25FbnRyeSxcblx0Q29sbGVjdGlvblJlc291cmNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLFxuXHRJdGVtUmVzb3VyY2UsXG5cdExvY2FsVmlld1Jlc291cmNlLFxufSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55LCBUIGV4dGVuZHMgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4gPSBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PlxuXHRleHRlbmRzIENvbGxlY3Rpb25SZXNvdXJjZSA8SXRlbVR5cGVUeXBlLCBUPiB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdGNvbGxlY3Rpb25SZXNvdXJjZUZhY3Rvcnk6IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zPEl0ZW1UeXBlVHlwZT4sXG5cdFx0dHJhbnNhY3Rpb25DYWNoZTogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdHRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFSZXN1bHQgfSBmcm9tICcuLi9jbGFzc2VzL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uRW50cnksXG5cdENvbGxlY3Rpb25SZXNvdXJjZSxcblx0Q29sbGVjdGlvblJlc291cmNlT3B0aW9ucyxcblx0SXRlbUVudHJ5LFxuXHRJdGVtUmVzb3VyY2UsXG5cdExvY2FsVmlld1Jlc291cmNlLFxufSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55LCBUIGV4dGVuZHMgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4gPSBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PlxuXHRleHRlbmRzIENvbGxlY3Rpb25SZXNvdXJjZSA8SXRlbVR5cGVUeXBlLCBUPiB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdGZhY3Rvcnk6IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zPEl0ZW1UeXBlVHlwZT4sXG5cdFx0dHJhbnNhY3Rpb25DYWNoZTogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRmYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdHRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVwcmVjYXRlZFxuXHQgKiBVc2Uge0BsaW5rIENoYW5nZXNEZWx0YS5zZXRJdGVtTW92ZWQgQ2hhbmdlc0RlbHRhLnNldEl0ZW1Nb3ZlZH1cblx0ICovXG5cdHB1YmxpYyBtb3ZlSXRlbXMgKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0ZGVzdGluYXRpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlU2F2ZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdjb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlOiBDYW5ub3QgbW92ZSBpdGVtczogc2F2aW5nIGVuYWJsZWQnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LnRyYW5zYWN0aW9uXG5cdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5tb3ZlSXRlbXMoXG5cdFx0XHRcdHRoaXMuZW50cnksXG5cdFx0XHRcdGRlc3RpbmF0aW9uUmVzb3VyY2UuZW50cnksXG5cdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyByZW1vdmVJdGVtcyAoXG5cdFx0aWRBcnJheTogSXRlbUlkW10sXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuZmFjdG9yeS5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdGNvbnN0IHJlbW92ZWRJdGVtRW50cmllczogSXRlbUVudHJ5W10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIHRoaXMuaXRlbXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGl0ZW1SZXNvdXJjZS5lbnRyeTtcblxuXHRcdFx0aWYgKGlkQXJyYXkuaW5kZXhPZihpdGVtRW50cnkuaXRlbUlkKSA9PT0gLTEpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHJlbW92ZWRJdGVtRW50cmllcy5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0fVxuXG5cdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1zRGVsZXRlZChyZW1vdmVkSXRlbUVudHJpZXMpO1xuXG5cdFx0dGhpcy50cmFuc2FjdGlvbi5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXHR9XG5cblx0cHVibGljIHJlbW92ZUl0ZW0gKFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5yZW1vdmVJdGVtcyhcblx0XHRcdFtpdGVtSWRdLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgYWRkSXRlbXMgKFxuXHRcdHZhbHVlc0FycmF5OiBBcnJheTxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+Pixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHQvLyB3aWxsIGNyZWF0ZSBhbmQgYXBwbHkgYSBDaGFuZ2VzRGVsdGFcblx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlclxuXHRcdFx0LmNyZWF0ZUl0ZW1zKFxuXHRcdFx0XHR0aGlzLmVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHR2YWx1ZXNBcnJheSxcblx0XHRcdFx0dGhpcy5lbnRyeS5wYXJlbnQsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGFkZEl0ZW0gKFxuXHRcdHZhbHVlczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRyZXR1cm4gdGhpcy5hZGRJdGVtcyhcblx0XHRcdFt2YWx1ZXNdLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtblNldCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgVGVtcGxhdGVGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5NYXAsIEFwaVJlc3BvbnNlLCBGaWVsZE1hcCwgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4ge1xuXHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT47XG5cdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcDtcblx0Y29sdW1uczogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT47IC8vIFRPRE86IHJlbmFtZSB0byBjb2x1bW5TZXRcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0ZmFjdG9yeTogVGVtcGxhdGVGYWN0b3J5LFxuXHRcdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHB1YmxpYyByZXNwb25zZTogQXBpUmVzcG9uc2UsXG5cdFx0YWRkaXRpb25hbFJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwLFxuXHRcdGFkZGl0aW9uYWxSZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCkge1xuXHRcdHRoaXMuZmllbGRzID0gcmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlc3BvbnNlLmxpbmtzW2l0ZW1UeXBlXVswXSxcblx0XHQpITtcblxuXHRcdGNvbnN0IHJlc3BvbnNlQ29sdW1ucyA9IHJlc3BvbnNlLmZldGNoQ29sdW1uc09iamVjdCgpO1xuXG5cdFx0dGhpcy5yZXNwb25zZUNvbHVtbnMgPSBmYWN0b3J5LmNvbHVtblV0aWwubWVyZ2VSZXNwb25zZUNvbHVtbnMoXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRhZGRpdGlvbmFsUmVzcG9uc2VDb2x1bW5zLFxuXHRcdCkubWVyZ2VkO1xuXG5cdFx0Ly8gV2UgaGF2ZSB0byByZWNvbnN0cnVjdCB0aGUgcmVxdWVzdENvbHVtbnMgb25seSBmcm9tIHRoZSB0ZW1wbGF0ZSdzIHJlc3BvbnNlLCB3ZSBuZWVkIHRvIHRyZWF0IHRoZSBhZGRpdGlvbmFsIHJlcXVlc3QgY29sdW1ucyBhcyBhY3R1YWwgcmVxdWVzdCBjb2x1bW5zXG5cdFx0dGhpcy5jb2x1bW5zID0gZmFjdG9yeS5jb2x1bW5TZXRGYWN0b3J5LmNvbnN0cnVjdEZyb21SZXNwb25zZShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdCk7XG5cblx0XHR0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnNcblx0XHRcdC5leHBhbmQoXG5cdFx0XHRcdGFkZGl0aW9uYWxSZXF1ZXN0Q29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRhZGRpdGlvbmFsUmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0Lm1lcmdlZDtcblx0fVxufVxuIiwiaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBJdGVtUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSwgSXRlbVJlc291cmNlT3B0aW9ucywgVmlld1Jlc291cmNlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PlxuXHRleHRlbmRzIFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0ZmFjdG9yeTogSXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbVJlc291cmNlT3B0aW9uczxSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4sXG5cdFx0aXNOZXc6IGJvb2xlYW4sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0ZmFjdG9yeSxcblx0XHRcdGVudHJ5LFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdGlzTmV3LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblxuXHRcdHRoaXMuZmllbGRzID0gdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0uaW5pdGlhbDtcblx0fVxufVxuIiwiaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBJdGVtUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSwgSXRlbVJlc291cmNlT3B0aW9ucywgVmlld1Jlc291cmNlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+XG5cdGV4dGVuZHMgVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4ge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRmYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdGVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtUmVzb3VyY2VPcHRpb25zLFxuXHRcdGlzTmV3OiBib29sZWFuLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGZhY3RvcnksXG5cdFx0XHRlbnRyeSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRpc05ldyxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cblx0XHR0aGlzLmZpZWxkcyA9IHRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5jaGFuZ2VzO1xuXHR9XG59XG4iLCIvLyBzaG91bGQgYmUgb3JkZXJlZCBieSBkZXBlbmRlbmN5IVxuZXhwb3J0ICogZnJvbSAnLi9JdGVtRW50cnlPcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vSXRlbVJlc291cmNlT3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1FbnRyeSc7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1SZXNvdXJjZSc7XG5leHBvcnQgKiBmcm9tICcuL1ZpZXdSZXNvdXJjZSc7XG5leHBvcnQgKiBmcm9tICcuL0VkaXRSZXNvdXJjZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25FbnRyeU9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbkVudHJ5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvblJlc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvblZpZXdSZXNvdXJjZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25FZGl0UmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9UZW1wbGF0ZSc7XG5leHBvcnQgKiBmcm9tICcuL1JlbW90ZVZpZXdSZXNvdXJjZSc7XG5leHBvcnQgKiBmcm9tICcuL0xvY2FsVmlld1Jlc291cmNlJztcbiIsImltcG9ydCB7IEFwaVJlc3BvbnNlUHJvY2Vzc29yLCBDb2xsZWN0aW9uTWF0Y2hlciwgQ29sdW1uU2V0LCBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uRW50cnksXG5cdENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdENvbGxlY3Rpb25FbnRyeU9wdGlvbnNJbnRlcmZhY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZSxcblx0Q29sbGVjdGlvblJlc291cmNlT3B0aW9ucyxcblx0Q29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZSxcblx0SXRlbUVudHJ5LFxuXHRJdGVtRW50cnlPcHRpb25zSW50ZXJmYWNlLFxuXHRJdGVtUmVzb3VyY2UsXG5cdEl0ZW1SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2UsXG59IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCB0eXBlIEVudHJ5UGFyZW50ID0ge2l0ZW1UeXBlOiBzdHJpbmcsIGl0ZW1JZDogbnVtYmVyfTtcblxuZXhwb3J0IHR5cGUgRW50cnlQYXJlbnROdWxsID0gRW50cnlQYXJlbnQgfCBudWxsO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogVXNlZCBmb3IgZmllbGRzIHRoYXQgYmVsb25nIHRvIGEgc3BlY2lmaWMgaXRlbVR5cGVcbiAqL1xuZXhwb3J0IHR5cGUgRmllbGRNYXA8X0l0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiA9IHtcblx0W2tleTogc3RyaW5nXTogYW55XG59O1xuXG5leHBvcnQgdHlwZSBJdGVtT3B0aW9uc0ludGVyZmFjZTxJdGVtUmVzb3VyY2VUeXBlIGV4dGVuZHMgSXRlbVJlc291cmNlPGFueT4gPSBJdGVtUmVzb3VyY2U+ID1cblx0SXRlbUVudHJ5T3B0aW9uc0ludGVyZmFjZVxuXHQmIEl0ZW1SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVJlc291cmNlVHlwZT47XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiA9XG5cdENvbGxlY3Rpb25FbnRyeU9wdGlvbnNJbnRlcmZhY2Vcblx0JiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkRlZmluaXRpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZTtcblx0b3B0aW9uczoge2VudHJ5OiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLCByZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGU+fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaW5rQ29sbGVjdGlvbkRlZmluaXRpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+XG5cdGV4dGVuZHMgQ29sbGVjdGlvbkRlZmluaXRpb248SXRlbVR5cGVUeXBlPiB7XG5cdGxpbmtGaWVsZDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBPbkNoYW5nZUZ1bmN0aW9uPEl0ZW1SZXNvdXJjZVR5cGUgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8YW55PiA9IEl0ZW1SZXNvdXJjZTxhbnk+PiA9IChcblx0aXRlbVJlc291cmNlOiBJdGVtUmVzb3VyY2VUeXBlLFxuXHRwcmV2aW91czogRmllbGRNYXA8SXRlbVJlc291cmNlVHlwZVsnZW50cnknXVsnaXRlbVR5cGUnXT4sXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyAnZmFsc2UnIGlmIHRoZSBmaWVsZCBjaGFuZ2VkXG5cdCAqL1xuXHRjb21wYXJlRmllbGQ6IChmaWVsZDoga2V5b2YgRmllbGRNYXA8SXRlbVJlc291cmNlVHlwZVsnZW50cnknXVsnaXRlbVR5cGUnXT4pID0+IGJvb2xlYW4sXG5cdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4sXG4pID0+IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBlbnVtIFN0YXRlS2V5VHlwZSB7XG5cdE5ldyA9ICduZXcnLFxuXHREdXBsaWNhdGUgPSAnZHVwbGljYXRlJ1xufVxuXG5leHBvcnQgdHlwZSBTdGF0ZUtleSA9IHt0eXBlOiBTdGF0ZUtleVR5cGUsIHRlbXBsYXRlPzogc3RyaW5nLCBpdGVtSWQ/OiBudW1iZXJ9O1xuXG5leHBvcnQgdHlwZSBTb2NrZXRNZXNzYWdlVHlwZSA9ICdldmVudCcgfCAnbm90aWZpY2F0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBTb2NrZXRNZXNzYWdlIHtcblx0aGVhZGVyOiB7XG5cdFx0ZG9tYWluOiBzdHJpbmcsXG5cdFx0YWNjb3VudDogc3RyaW5nLFxuXHRcdHNlbmRlcjoge1xuXHRcdFx0ZGlzcGxheW5hbWU6IHN0cmluZyxcblx0XHRcdGl0ZW1UeXBlOiAnTWVkZXdlcmtlcicsXG5cdFx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRcdGF1dGhvcml6ZWQ6IGJvb2xlYW4sXG5cdFx0XHRzZXNzaW9uOiBzdHJpbmdcblx0XHR9LFxuXHRcdG1lc3NhZ2VJZDoge1xuXHRcdFx0SWQ6IHN0cmluZyxcblx0XHRcdHNlcXVlbmNlOiBudW1iZXIsXG5cdFx0XHRiYXRjaDogbnVtYmVyLFxuXHRcdFx0cmVxdWVzdDogbnVtYmVyXG5cdFx0fSxcblx0XHRzZW50OiBzdHJpbmcsXG5cdFx0Zm9yY2VFdmFsdWF0ZTogYm9vbGVhblxuXHR9O1xuXHRib2R5OiBhbnk7XG5cdG1lc3NhZ2VUeXBlOiBTb2NrZXRNZXNzYWdlVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb2NrZXRNZXNzYWdlQ3JlYXRlXG5cdGV4dGVuZHMgU29ja2V0TWVzc2FnZSB7XG5cblx0Ym9keToge1xuXHRcdGV2ZW50VHlwZTogJ2NyZWF0ZScsXG5cdFx0Y29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtczoge1xuXHRcdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0XHRcdFtpdGVtSWQ6IG51bWJlcl06IHtcblx0XHRcdFx0XHRwYXJlbnQ6IG51bGwgfCBFbnRyeVBhcmVudCxcblx0XHRcdFx0XHR2YWx1ZXM6IEZpZWxkTWFwXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ja2V0TWVzc2FnZVVwZGF0ZVxuXHRleHRlbmRzIFNvY2tldE1lc3NhZ2Uge1xuXG5cdGJvZHk6IHtcblx0XHRldmVudFR5cGU6ICd1cGRhdGUnLFxuXHRcdGNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXBcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbXM6IHtcblx0XHRcdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFx0XHRbaXRlbUlkOiBudW1iZXJdOiB7XG5cdFx0XHRcdFx0cGFyZW50OiBudWxsIHwgRW50cnlQYXJlbnQsXG5cdFx0XHRcdFx0dmFsdWVzOiBGaWVsZE1hcFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvY2tldE1lc3NhZ2VMaW5rVG9cblx0ZXh0ZW5kcyBTb2NrZXRNZXNzYWdlIHtcblxuXHRib2R5OiB7XG5cdFx0ZXZlbnRUeXBlOiAnbGlua3RvJyxcblx0XHRjb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1zOiB7XG5cdFx0XHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRcdFx0W2l0ZW1JZDogbnVtYmVyXToge1xuXHRcdFx0XHRcdHBhcmVudDogbnVsbCB8IEVudHJ5UGFyZW50LFxuXHRcdFx0XHRcdHZhbHVlczogRmllbGRNYXBcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb2NrZXRNZXNzYWdlRGVsZXRlXG5cdGV4dGVuZHMgU29ja2V0TWVzc2FnZSB7XG5cblx0Ym9keToge1xuXHRcdGV2ZW50VHlwZTogJ2RlbGV0ZScsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1zOiBJdGVtSWRbXVxuXHR9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uQ2hhbmdlc1Jlc29sdmVTb2NrZXRNZXNzYWdlXG5cdGV4dGVuZHMgU29ja2V0TWVzc2FnZSB7XG5cdGJvZHk6IHtcblx0XHRpdGVtVHlwZTogJ0Z1bmN0aW9uQ2hhbmdlc1Jlc29sdmUnLFxuXHRcdFtrZXk6IHN0cmluZ106IGFueVxuXHR9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJdGVtIHJlc291cmNlXG5cbmV4cG9ydCB0eXBlIEl0ZW1SZXNvdXJjZUl0ZW1JZE1hcDxUIGV4dGVuZHMgSXRlbVJlc291cmNlPGFueT4gPSBJdGVtUmVzb3VyY2U8YW55Pj4gPSB7XG5cdFtpdGVtSWQ6IG51bWJlcl06IFRcbn07XG5cbmV4cG9ydCB0eXBlIEl0ZW1SZXNvdXJjZXNJdGVtVHlwZU1hcDxUIGV4dGVuZHMgSXRlbVJlc291cmNlPGFueT4gPSBJdGVtUmVzb3VyY2U8YW55Pj4gPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXTogVFtdXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJdGVtIEVudHJ5XG5cbmV4cG9ydCB0eXBlIEl0ZW1JZCA9IG51bWJlcjtcblxuZXhwb3J0IHR5cGUgSXRlbVR5cGUgPSBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIEl0ZW1NYXA8VD4gPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFtpdGVtSWQ6IHN0cmluZ106IFRcblx0fVxufTtcblxuZXhwb3J0IHR5cGUgSXRlbUVudHJ5TWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IEl0ZW1NYXA8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+O1xuXG5leHBvcnQgdHlwZSBJdGVtRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdFtwYXJlbnRJZDogbnVtYmVyXTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+O1xufTtcblxuZXhwb3J0IHR5cGUgQ29udmVyc2lvbk1hcCA9IHtcblx0W2l0ZW1JZDogbnVtYmVyXTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgSXRlbUlkQ29udmVyc2lvbk1hcCA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiBDb252ZXJzaW9uTWFwXG59O1xuXG5leHBvcnQgdHlwZSBDcmVhdGVSZXF1ZXN0UGFyYW1ldGVyTWFwPFQgPSBhbnk+ID0gSXRlbU1hcDxUPjtcblxuZXhwb3J0IHR5cGUgSXRlbUVycm9yID0ge21lc3NhZ2U6IHN0cmluZ307XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbGxlY3Rpb24gRW50cnlcblxuZXhwb3J0IHR5cGUgUXVlcnlQYXJhbXMgPSBhbnk7IC8vIFRPRE9cblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblF1ZXJ5ID0ge29iamVjdDogb2JqZWN0LCBzdHJpbmc6IHN0cmluZ307XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5Q2FsbGJhY2sgPSAocXVlcnlQYXJhbXM6IFF1ZXJ5UGFyYW1zKSA9PiBRdWVyeVBhcmFtcztcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0ge1xuXHRbcGFyZW50SWQ6IG51bWJlcl06IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+XG59O1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxUIGV4dGVuZHMgQ29sbGVjdGlvblJlc291cmNlPGFueT4gPSBDb2xsZWN0aW9uUmVzb3VyY2U8YW55Pj4gPSB7XG5cdFtwYXJlbnRJZDogbnVtYmVyXTogVFxufTtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IHtcblx0Zml0dGluZzogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRub3RmaXR0aW5nOiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdG1heWJlOiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj5cbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5kZWRDb2xsZWN0aW9uTWF0Y2hSZXN1bHQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+XG5cdGV4dGVuZHMgQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZT4ge1xuXHRjb2xsZWN0aW9uOiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcm91cGVkRXh0ZW5kZWRDb2xsZWN0aW9uTWF0Y2hSZXN1bHQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IHtcblx0W2NvbGxlY3Rpb25JZDogbnVtYmVyXTogRXh0ZW5kZWRDb2xsZWN0aW9uTWF0Y2hSZXN1bHQ8SXRlbVR5cGVUeXBlPjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29sdW1uc1xuXG5leHBvcnQgdHlwZSBSZXNwb25zZUNvbHVtbiA9IGFueTsgLy8gVE9ET1xuXG5leHBvcnQgdHlwZSBSZXNwb25zZUNvbHVtbk1hcCA9IHtcblx0W2NvbHVtbklkOiBzdHJpbmddOiBSZXNwb25zZUNvbHVtblxufTtcblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiBSZXNwb25zZUNvbHVtbk1hcFxufTtcblxuZXhwb3J0IHR5cGUgQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiA9IHtcblx0bWVyZ2VkOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPixcblx0ZGlmZmVyZW5jZTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT5cbn07XG5cbmV4cG9ydCB0eXBlIFJvb3RDb2x1bW5NYXAgPSB7W2NvbHVtbklkOiBzdHJpbmddOiB7YXBpQ29sdW1uOiBSZXNwb25zZUNvbHVtbiwgY2hpbGRyZW46IFJvb3RDb2x1bW5NYXB9fTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQXBpIHJlZmVyZW5jZVxuXG5leHBvcnQgdHlwZSBBcGlSZXNwb25zZSA9IEFwaVJlc3BvbnNlUHJvY2Vzc29yOyAvLyBUT0RPXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFwaSB0ZW1wbGF0ZSByZXNwb25zZVxuZXhwb3J0IHR5cGUgVGVtcGxhdGVJdGVtUmVzb3VyY2VNYXA8VCBleHRlbmRzIEl0ZW1SZXNvdXJjZTxhbnk+PiA9IHtcblx0bWFpbjogVDtcblx0bGlua2VkOiBJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXBcbn07XG5cbmV4cG9ydCB0eXBlIEl0ZW1UeXBlTWFwPFQgPSBhbnk+ID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IFQ7XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBcGkgcmVxdWVzdFxuXG5leHBvcnQgdHlwZSBBcGlRdWVyeSA9IGFueTsgLy8gVE9ET1xuXG5leHBvcnQgdHlwZSBBcGlSZXF1ZXN0SXRlbVZhbHVlcyA9IHtcblx0dmFsdWVzPzogYW55LFxuXHRsaW5rcz86IHtcblx0XHRbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1JZFtdXG5cdH1cbn07XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RJdGVtTWFwID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRbaXRlbUlkOiBudW1iZXJdOiBBcGlSZXF1ZXN0SXRlbVZhbHVlc1xuXHR9O1xufTtcblxuZXhwb3J0IHR5cGUgQXBpUmVxdWVzdENvbHVtbiA9IHN0cmluZyB8IHtbY29sdW1uSWQ6IHN0cmluZ106IEFwaVJlcXVlc3RDb2x1bW5bXX07XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RDb2x1bW5zID0gQXBpUmVxdWVzdENvbHVtbltdIHwgdHJ1ZTtcblxuZXhwb3J0IHR5cGUgQXBpUmVxdWVzdENvbHVtbk1hcCA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiBBcGlSZXF1ZXN0Q29sdW1uc1xufTtcblxuZXhwb3J0IHR5cGUgQXBpUmVxdWVzdExpbWl0ID0ge1xuXHRmaWVsZDogc3RyaW5nLFxuXHRsaW1pdDogbnVtYmVyLFxuXHRvZmZzZXQ/OiBudW1iZXIsXG5cdG9yZGVyPzogJ2Rlc2MnIHwgJ2FzYydcbn07XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RNb3ZlSXRlbXMgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXTogSXRlbUlkW11cbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENyZWF0ZSByZXF1ZXN0XG5cbmV4cG9ydCB0eXBlIENyZWF0ZVJlcXVlc3RFbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdHJlcXVlc3Q6IHtcblx0XHRyZXF1ZXN0VHlwZTogJ2NyZWF0ZScsXG5cdFx0aXRlbVR5cGU/OiBJdGVtVHlwZVR5cGUsXG5cdFx0cGFyZW50VHlwZT86IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkPzoge1tpdGVtSWQ6IHN0cmluZ106IEl0ZW1JZH0sXG5cdFx0aXRlbXM6IEFwaVJlcXVlc3RJdGVtTWFwLFxuXHRcdGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5NYXBcblx0fSxcblx0Y29sdW1uczogUmVxdWVzdENvbHVtbkV4cGFuc2lvbixcblx0aXRlbXM6IEl0ZW1FbnRyeU1hcDxJdGVtVHlwZVR5cGU+LFxuXHRjb2xsZWN0aW9uczogQ29sbGVjdGlvbk1hdGNoZXJcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBlbnVtIEFwaUxpbmtUcmVlVHlwZSB7XG5cdElURU1UQUJMRSA9ICdpdGVtdGFibGUnLFxuXHRESVJFQ1QgPSAnZGlyZWN0J1xufVxuXG5leHBvcnQgdHlwZSBBcGlMaW5rVHJlZUVudHJ5ID0ge1xuXHR0eXBlOiBBcGlMaW5rVHJlZVR5cGUuSVRFTVRBQkxFXG59IHwge1xuXHR0eXBlOiBBcGlMaW5rVHJlZVR5cGUuRElSRUNULFxuXHRmaWVsZDogc3RyaW5nXG59O1xuXG5leHBvcnQgdHlwZSBBcGlMaW5rVHJlZSA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0W2NoaWxkVHlwZTogc3RyaW5nXTogQXBpTGlua1RyZWVFbnRyeVxuXHR9XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQ2FsbGJhY2sgdG8gZGV0ZXJtaW5lIGlmIGFuIGl0ZW0gc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBjcmVhdGUgZGVsdGEsIHJldHVybiBgZmFsc2VgIHRvIGV4Y2x1ZGUgdGhlIGl0ZW1cbiAqL1xuZXhwb3J0IHR5cGUgRmlsdGVySXRlbUVudHJ5Q2FsbGJhY2sgPSA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuKSA9PiBib29sZWFuO1xuXG5leHBvcnQgdHlwZSBNb2RpZnlGaWVsZHNDYWxsYmFjayA9IDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdGl0ZW1JZENvbnZlcnNpb25NYXA/OiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuKSA9PiB2b2lkO1xuIiwiZXhwb3J0ICogZnJvbSAnLi9JdGVtVHlwZXNDb2xsZWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vUHJvbWlzZUludGVyZmFjZSc7XG4iLCJpbXBvcnQgeyBJdGVtQ2FjaGVGYWN0b3J5LCBJdGVtRW50cnlGYWN0b3J5LCBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1FbnRyeU9wdGlvbnMgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEFwaVJlcXVlc3RDb2x1bW5zLCBGaWVsZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaUZvcm1hdHRlciB9IGZyb20gJy4uL0FwaUZvcm1hdHRlcic7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEgfSBmcm9tICcuLi9DaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhQmFzZSwgQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhIH0gZnJvbSAnLi4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQgeyBDb2x1bW5JbmZvIH0gZnJvbSAnLi4vQ29sdW1uSW5mbyc7XG5pbXBvcnQgeyBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vQ29sdW1uVXRpbCc7XG5pbXBvcnQgeyBJdGVtQ2FjaGUgfSBmcm9tICcuLi9JdGVtQ2FjaGUnO1xuaW1wb3J0IHsgaGFzUHJvcGVydGllcyB9IGZyb20gJy4uL1V0aWwnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzIH0gZnJvbSAnLi9zZXJ2ZXIvU2VydmVySXRlbUhhbmRsZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkl0ZW1IYW5kbGVyJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEl0ZW1IYW5kbGVyQmFzZSB7XG5cblx0cHVibGljIHJlYWRvbmx5IGVudHJpZXM6IEl0ZW1DYWNoZTtcblx0cHVibGljIGFic3RyYWN0IGl0ZW1DaGFuZ2VzOiBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzIHwgVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzO1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJvdGVjdGVkIGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdHByb3RlY3RlZCBpdGVtRW50cnlGYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJvdGVjdGVkIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByb3RlY3RlZCByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0aXRlbUNhY2hlRmFjdG9yeTogSXRlbUNhY2hlRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCkge1xuXHRcdHRoaXMuZW50cmllcyA9IGl0ZW1DYWNoZUZhY3RvcnkuY29uc3RydWN0KHRoaXMudHJhbnNhY3Rpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDb3BpZXMgdGhlIHBhc3NlZCBJdGVtRW50cnlDaGFuZ2VzIGludG8gYSBmb3JtYXQgdGhlIGltcGxlbWVudGluZyBJdGVtSGFuZGxlciBjYW4gcHV0IGluIGhpcyBJdGVtQ2hhbmdlc1xuXHQgKiBAcGFyYW0gaXRlbUVudHJ5Q2hhbmdlc1xuXHQgKiBAcGFyYW0gZW50cnlcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBjb3B5VHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzIChcblx0XHRpdGVtRW50cnlDaGFuZ2VzOiBUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMsXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeSxcblx0KTtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIEl0ZW1FbnRyaWVzIGZvciB0aGUgZ2l2ZW4gcXVlcnksIGRvZXMgbm90IGxvb2sgaW4gdGhlIGNhY2hlLCBzaW5jZSB3ZSBkb24ndCBrbm93IHdoaWNoIEl0ZW1JZHMgYmVsb25nIHRvIHRoZSBxdWVyeSAhXG5cdCAqXG5cdCAqIHRvZG86IFdlIGNvdWxkIHN0b3JlIGNvbGxlY3Rpb25zIGJ5IHRoZWlyIHF1ZXJ5IHN0cmluZywgYW5kIHRoZW4gc2VlIGlmIHRoZSBxdWVyeSBpcyBhbHJlYWR5IGNhY2hlZFxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGZldGNoSXRlbUVudHJpZXNCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0ZW50cnlPcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSBJdGVtRW50cmllcyBmb3IgdGhlIGdpdmVuIEl0ZW1JZHNcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBmZXRjaEl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGFuIEl0ZW1FbnRyeSB3aXRoIHRoZSBnaXZlbiBpdGVtSWRcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBmZXRjaEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBQcm9jZXNzZXMgdGhlIHBhc3NlZCB7QGxpbmsgQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhIHVwZGF0ZSBkZWx0YX0gb24gdGhlIHRyYW5zYWN0aW9uLCBpZiB0aGVyZSBhcmUgbm8ge0BsaW5rIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIuaXRlbUNoYW5nZXMgaXRlbUNoYW5nZXN9IHRoZSBuZXcgdmFsdWVzIHdpbGwgbm90IGJlIHByb2Nlc3NlZFxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IHByb2Nlc3NJdGVtRW50cnlDaGFuZ2VzIChcblx0XHRpdGVtRW50cnlDaGFuZ2VzVHVwbGU6IENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YSxcblx0KTogdm9pZDtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFRyYXZlcnNlcyB0aGUgY29sdW1uIHBhdGggYW5kIHJldHVybnMgdGhlIGZpZWxkcyBvZiB0aGUgZGVyaXZlZCBpdGVtLCByZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgaXRlbSBpc24ndCBmb3VuZFxuXHQgKlxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBBc3N1bWVzIHRoZSBkZXJpdmVkIGl0ZW0ncyB2YWx1ZXMgYXJlIGFscmVhZHkgY2FjaGVkXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RGVyaXZlZFZhbHVlcyAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnksXG5cdFx0Y29sdW1uUGF0aDogc3RyaW5nW10sXG5cdCk6IFJlYWRvbmx5PEZpZWxkTWFwPiB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IGRlcml2ZWRJdGVtRW50cnk6IEl0ZW1FbnRyeSB8IHVuZGVmaW5lZCA9IGl0ZW1FbnRyeTtcblx0XHRsZXQgZmllbGRzID0gdGhpcy50cmFuc2FjdGlvbi5nZXRDaGFuZ2VzRnJvbUl0ZW1DaGFuZ2VzKHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIG9mIGNvbHVtblBhdGgpIHtcblx0XHRcdGNvbnN0IGNvbHVtbiA9IGRlcml2ZWRJdGVtRW50cnkuY29sdW1ucy5yZXNwb25zZVtkZXJpdmVkSXRlbUVudHJ5Lml0ZW1UeXBlXVtjb2x1bW5JZF07XG5cblx0XHRcdGlmIChjb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAnJHtjb2x1bW5JZH0nIG5vdCBmb3VuZCBvbiBlbnRyeSBpbiBJdGVtUmVzb3VyY2UuZ2V0RGVyaXZlZFZhbHVlYCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjb2x1bW4uaXRlbVR5cGUgPT09IG51bGwpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gJyR7Y29sdW1uSWR9JyBkb2Vzbid0IGhhdmUgY2hpbGRyZW4gaW4gSXRlbVJlc291cmNlLmdldERlcml2ZWRWYWx1ZWApO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBpdGVtSWQgPSBmaWVsZHNbY29sdW1uSWRdO1xuXG5cdFx0XHRpZiAoaXRlbUlkID09PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cblx0XHRcdGRlcml2ZWRJdGVtRW50cnkgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsSXRlbUVudHJ5QnlJdGVtSWQoXG5cdFx0XHRcdGNvbHVtbi5pdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGRlcml2ZWRJdGVtRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYERlcml2ZWQgaXRlbUVudHJ5ICR7Y29sdW1uLml0ZW1UeXBlfToke2l0ZW1JZH0gY291bGRuJ3QgYmUgZm91bmRgKTtcblx0XHRcdH1cblxuXHRcdFx0ZmllbGRzID0gdGhpcy50cmFuc2FjdGlvbi5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0XHRkZXJpdmVkSXRlbUVudHJ5LmlkLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZpZWxkcztcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtblBhdGgsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBwYXRoIGNvdWxkbid0IGJlIHRyYXZlcnNlZFxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlbUVudHJ5IFRoZSByb290IGVudHJ5IHRvIHN0YXJ0IHRoZSBwYXRoIGZyb21cblx0ICogQHBhcmFtIGNvbHVtblBhdGggQ2FuIGVpdGhlciBiZSBhbiBhcnJheSBvZiBjb2x1bW5JZHMgKFsnY29sdW1uJywgJ2NvbHVtbjInXSkgb3IgYSBjb25maWcgY29sdW1uIHN0cmluZyAoJ2NvbHVtbj5jb2x1bW4yJylcblx0ICovXG5cdHB1YmxpYyBnZXREZXJpdmVkVmFsdWU8VCBleHRlbmRzIGFueSA9IGFueT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5LFxuXHRcdGNvbHVtblBhdGg6IHN0cmluZ1tdIHwgc3RyaW5nLFxuXHQpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodHlwZW9mIGNvbHVtblBhdGggPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRjb2x1bW5QYXRoID0gdGhpcy5jb2x1bW5VdGlsLnBhcnNlQ29uZmlnQ29sdW1uKGNvbHVtblBhdGgpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZpZWxkcyA9IHRoaXMuZ2V0RGVyaXZlZFZhbHVlcyhcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdGNvbHVtblBhdGguc2xpY2UoXG5cdFx0XHRcdDAsXG5cdFx0XHRcdC0xLFxuXHRcdFx0KSxcblx0XHQpO1xuXG5cdFx0aWYgKGZpZWxkcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBmaWVsZHNbY29sdW1uUGF0aFtjb2x1bW5QYXRoLmxlbmd0aCAtIDFdXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2xlYXJzIHRoZSBlbnRyeSBmcm9tIHRoaXMgdHJhbnNhY3Rpb24sIHJlbW92aW5nIGl0IGZyb20gdGhlIHtAbGluayBJdGVtQ2FjaGUgSXRlbUNhY2hlfSBhbmQgcmVtb3ZpbmcgYWxsIGNoYW5nZXNcblx0ICovXG5cdHB1YmxpYyBjbGVhckl0ZW1FbnRyeSAoZW50cnk6IEl0ZW1FbnRyeSk6IHZvaWQge1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcihlbnRyeSk7XG5cdFx0ZGVsZXRlIHRoaXMuaXRlbUNoYW5nZXNbZW50cnkuaWRdO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZWN1cnNpdmVseSBmZXRjaGVzIGRlcml2ZWQgdmFsdWVzIGFzIHNlcGFyYXRlIHJlcXVlc3RzLCBpbnN0ZWFkIG9mIGFzIGNvbHVtbnMgb2YgYSBwcmltYXJ5IGl0ZW1cblx0ICogQ2FuIGJlIHVzZWQgd2hlbiBkZXJpdmVkIHZhbHVlcyBvZiBhIGxvY2FsIGl0ZW0gaGF2ZSB0byBiZSBmZXRjaGVkLCBzaW5jZSBhIGxvY2FsIGl0ZW0gY2FuJ3QgYmUgdXNlZCBhcyByb290IGl0ZW0gb2YgYSBxdWVyeVxuXHQgKi9cblx0cHVibGljIGZldGNoRGVyaXZlZFZhbHVlc0J5Q29sdW1uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRyb290Q29sdW1uOiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y2hhbmdlc0RlbHRhPzogQ2hhbmdlc0RlbHRhQmFzZSxcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkIHwgQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0Y29uc3QgY2hpbGRDb2x1bW5zID0gcm9vdENvbHVtbi5jaGlsZHJlbjtcblxuXHRcdGlmIChjaGlsZENvbHVtbnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZmlyc3RDaGlsZCA9IGNoaWxkQ29sdW1uc1swXTtcblxuXHRcdGlmIChjaGlsZENvbHVtbnMubGVuZ3RoID09PSAxICYmIGZpcnN0Q2hpbGQuYXBpQ29sdW1uLnR5cGUgPT09ICdpZCcpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgWW91IHNob3VsZCB1c2UgZmllbGRzW2NvbHVtbklkXSBpbnN0ZWFkIG9mIGRlcml2ZWRbJ2NvbHVtbklkPmlkJ10gdG8gZ2V0IHRoZSBpZCBvZiBhIGRlcml2ZWQgaXRlbWApO1xuXHRcdH1cblxuXHRcdGNvbnN0IGl0ZW1JZE1hcDoge1tpdGVtSWQ6IHN0cmluZ106IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pn0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBpdGVtSWQgPSB0aGlzLmdldEl0ZW1JZEJ5Q29sdW1uKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdHJvb3RDb2x1bW4sXG5cdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChpdGVtSWQgPT09IG51bGwpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpdGVtSWRNYXBbaXRlbUlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGl0ZW1JZE1hcFtpdGVtSWRdID0gW107XG5cdFx0XHR9XG5cblx0XHRcdGl0ZW1JZE1hcFtpdGVtSWRdLnB1c2goaXRlbUVudHJ5KTtcblx0XHR9XG5cblx0XHRpZiAoIWhhc1Byb3BlcnRpZXMoaXRlbUlkTWFwKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGl0ZW1JZHM6IEl0ZW1JZFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBpdGVtSWRNYXApIHtcblx0XHRcdGl0ZW1JZHMucHVzaCgraXRlbUlkKTtcblx0XHR9XG5cblx0XHRjb25zdCBjb2x1bW5JZHM6IHN0cmluZ1tdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjaGlsZENvbHVtbnMpIHtcblx0XHRcdGNvbHVtbklkcy5wdXNoKGNvbHVtbi5pZCk7XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gY2hlY2sgaWYgd2UgaGF2ZSB0aGVzZSB2YWx1ZXMgY2FjaGVkIGFscmVhZHlcblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hJdGVtRW50cmllcyhcblx0XHRcdFx0cm9vdENvbHVtbi5pdGVtVHlwZSEsXG5cdFx0XHRcdGl0ZW1JZHMsXG5cdFx0XHRcdG5ldyBJdGVtRW50cnlPcHRpb25zKHtjb2x1bW5zOiBjb2x1bW5JZHN9KSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMucmVzb2x2ZURlcml2ZWRWYWx1ZXMoXG5cdFx0XHRcdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdFx0XHRcdGNoaWxkQ29sdW1ucyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlc29sdmVEZXJpdmVkVmFsdWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGNoYW5nZXNEZWx0YT86IENoYW5nZXNEZWx0YUJhc2UsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0Y29uc3QgcHJvbWlzZXM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8YW55Pj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdHRoaXMuZmV0Y2hEZXJpdmVkVmFsdWVzQnlDb2x1bW4oXG5cdFx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHRcdFx0Y29sdW1uLFxuXHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHByb21pc2VzKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IGl0ZW1FbnRyaWVzLFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSBmcm9tIHRoZSBwYXNzZWQge0BsaW5rIENoYW5nZXNEZWx0YUl0ZW1DcmVhdGVEZWx0YSBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGF9IGFuZCBzdG9yZXMgaXQgaW4gdGhpcyB0cmFuc2FjdGlvbidzIHtAbGluayBJdGVtQ2FjaGUgSXRlbUNhY2hlfVxuXHQgKi9cblx0cHJvdGVjdGVkIGNyZWF0ZUl0ZW1FbnRyeSAoXG5cdFx0Y3JlYXRlVHVwbGU6IENoYW5nZXNEZWx0YUl0ZW1DcmVhdGVEZWx0YSxcblx0KTogSXRlbUVudHJ5IHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLml0ZW1FbnRyeUZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0Y3JlYXRlVHVwbGUuaXRlbUlkLFxuXHRcdFx0Y3JlYXRlVHVwbGUuY29sdW1ucyxcblx0XHQpO1xuXG5cdFx0dGhpcy5lbnRyaWVzLmFkZChpdGVtRW50cnkpO1xuXG5cdFx0cmV0dXJuIGl0ZW1FbnRyeTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGNvbHVtbiwgd2lsbCBsb29rIGludG8gdGhlIGN1cnJlbnQgZGVsdGEgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVhZCBpdGVtQ2hhbmdlc1xuXHQgKi9cblx0cHJvdGVjdGVkIGdldEl0ZW1JZEJ5Q29sdW1uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW46IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPixcblx0XHRjaGFuZ2VzRGVsdGE/OiBDaGFuZ2VzRGVsdGFCYXNlLFxuXHQpOiBJdGVtSWQge1xuXHRcdGlmIChjb2x1bW4ubGV2ZWwgPT09IDApIHtcblx0XHRcdGlmIChjaGFuZ2VzRGVsdGEgIT09IHVuZGVmaW5lZCAmJiBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnkuaWRdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGNoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeS5pZF0uY2hhbmdlcy5maWVsZHNbY29sdW1uLnBhdGhdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5nZXRDaGFuZ2VzRnJvbUl0ZW1DaGFuZ2VzKHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSlbY29sdW1uLnBhdGhdO1xuXHRcdH1cblxuXHRcdC8vIHRvZG9bY2FjaGVdIGNoZWNrIGlmIHRoZSB2YWx1ZSBvZiB0aGUgZGVyaXZlZCBpdGVtIGlzIHVwZGF0ZWQgaW4gdGhpcyBkZWx0YSA/XG5cdFx0Ly8gaWYgKGNoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeS5pZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIFx0cmV0dXJuIGNoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeS5pZF0uY2hhbmdlcy5kZXJpdmVkW2NvbHVtbi5wYXRoXTtcblx0XHQvLyB9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBkZXJpdmVkIHZhbHVlcyBjb3VsZCBhbHNvIGJlIGNoYW5nZWQgaW4gdGhpcyBkZWx0YSwgc2hvdWxkbid0IHdlIGdldCB0aGUgZGVyaXZlZCBpdGVtRW50cnkgYW5kIGNhbGwgZ2V0SXRlbUlkQnlDb2x1bW4gP1xuXHRcdHJldHVybiB0aGlzLmdldERlcml2ZWRWYWx1ZShcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdGNvbHVtbi5wYXRoLFxuXHRcdCkhO1xuXHR9XG5cblx0cHJvdGVjdGVkIGV4cGFuZENvbHVtbnNXaXRoQ29sbGVjdGlvbkNvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1ucz86IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBBcGlSZXF1ZXN0Q29sdW1ucyB7XG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbkV4cGFuc2lvbiA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRpZiAocmVxdWVzdENvbHVtbnMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWRkQ29sbGVjdGlvbkNvbHVtbnMgPSAodHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUpID0+IHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzID0gdHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5nZXRCeUl0ZW1UeXBlKGl0ZW1UeXBlKTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY29sbGVjdGlvbkVudHJpZXMpIHtcblx0XHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMucXVlcnlDb2x1bW5zLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIHRvZG9bY2FjaGVdIHdlIGNhbiByZW1vdmUgdGhpcyB3aGVuIHdlIHJlZmFjdG9yIHRoZSBmZXRjaGluZyBvZiByZXF1aXJlZCBjb2xsZXRpb24gY29sdW1ucyBBRlRFUiB0aGUgbWF0Y2hpbmdcblx0XHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMuY29sdW1ucyxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3QgYWRkVHJhbnNhY3Rpb25DaGlsZHJlbkNvbGxlY3Rpb25Db2x1bW5zID0gKGNoaWxkcmVuOiBBYnN0cmFjdENhY2hlW10pID0+IHtcblx0XHRcdGZvciAoY29uc3QgdHJhbnNhY3Rpb24gb2YgY2hpbGRyZW4pIHtcblx0XHRcdFx0YWRkQ29sbGVjdGlvbkNvbHVtbnModHJhbnNhY3Rpb24pO1xuXHRcdFx0XHRhZGRUcmFuc2FjdGlvbkNoaWxkcmVuQ29sbGVjdGlvbkNvbHVtbnModHJhbnNhY3Rpb24uY2hpbGRyZW4pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCB0cmFuc2FjdGlvbkNoYWluID0gdGhpcy50cmFuc2FjdGlvbi5nZXRUcmFuc2FjdGlvbkNoYWluKCk7XG5cblx0XHRmb3IgKGNvbnN0IHRyYW5zYWN0aW9uIG9mIHRyYW5zYWN0aW9uQ2hhaW4pIHtcblx0XHRcdGFkZENvbGxlY3Rpb25Db2x1bW5zKHRyYW5zYWN0aW9uKTtcblx0XHR9XG5cblx0XHRhZGRUcmFuc2FjdGlvbkNoaWxkcmVuQ29sbGVjdGlvbkNvbHVtbnModGhpcy50cmFuc2FjdGlvbi5jaGlsZHJlbik7XG5cblx0XHRyZXR1cm4gcmVxdWVzdENvbHVtbkV4cGFuc2lvbi5nZXQoKVtpdGVtVHlwZV07XG5cdH1cbn1cbiIsImltcG9ydCB7XG5cdENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENvbHVtblNldEZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0SXRlbUNhY2hlRmFjdG9yeSxcblx0SXRlbUVudHJ5RmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1FbnRyeU9wdGlvbnMsIEl0ZW1SZXNvdXJjZSwgVGVtcGxhdGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpUXVlcnksXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRDb2x1bW5FeHBhbnNpb25SZXN1bHQsXG5cdEVudHJ5UGFyZW50TnVsbCxcblx0RmllbGRNYXAsXG5cdEZpbHRlckl0ZW1FbnRyeUNhbGxiYWNrLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1UeXBlLFxuXHRJdGVtVHlwZU1hcCxcblx0TW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdFByb21pc2VJbnRlcmZhY2UsXG5cdFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSwgQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhIH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUJhc2UsIENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YSwgQ2hhbmdlc0RlbHRhUmVzdWx0IH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQge1xuXHRBcGlGb3JtYXR0ZXIsXG5cdENvbHVtbkhhbmRsZXIsXG5cdENvbHVtbkluZm8sXG5cdENvbHVtblNldCxcblx0Q29sdW1uU3Vic2V0Q2FjaGUsXG5cdENvbHVtblV0aWwsXG5cdGhhc1Byb3BlcnRpZXMsXG5cdEl0ZW1FbnRyeVNlcnZpY2UsXG5cdEtleVNlcnZpY2UsXG5cdFNlcnZlckNhY2hlLFxufSBmcm9tICcuLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBUZW1wbGF0ZUNhY2hlIH0gZnJvbSAnLi4vLi4vVGVtcGxhdGVDYWNoZSc7XG5pbXBvcnQgeyBJdGVtSGFuZGxlckJhc2UgfSBmcm9tICcuLi9JdGVtSGFuZGxlckJhc2UnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4vVHJhbnNhY3Rpb25DYWNoZSc7XG5cbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdGluaXRpYWw6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdGNoYW5nZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT5cbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJbiBhIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9ufSBvbmx5IGxvY2FsIGl0ZW1zIGNhbiBiZSBzdG9yZWQsIHNvIGFsbCBlbnRyaWVzIGluIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmVudHJpZXMgdGhpcy5lbnRyaWVzfSBhcmUgbG9jYWxcbiAqIElmIGEgbm9uLWxvY2FsIGVudHJ5IGlzIHJlcXVlc3RlZCBpdCBzaG91bGQgYmUgcGFzc2VkIG9uIHRvIHRoZSB7QGxpbmsgU2VydmVySXRlbUhhbmRsZXIgU2VydmVySXRlbUhhbmRsZXJ9IHdoaWNoIHdpbGwgZmV0Y2hDb2xsZWN0aW9uRW50cnkgdGhlIGVudHJ5IGZyb20gdGhlIHNlcnZlclxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25JdGVtSGFuZGxlclxuXHRleHRlbmRzIEl0ZW1IYW5kbGVyQmFzZSB7XG5cblx0Ly8gdG9kb1tjYWNoZV0gc2hvdWxkIHRoaXMgYmUge1tpdGVtVHlwZTogc3RyaW5nXToge1tpdGVtRW50cnlJZDogbnVtYmVyXTogSXRlbUVudHJ5fX0gZm9yIHF1aWNrIGxvb2t1cCA/XG5cdHB1YmxpYyBkZWxldGVkSXRlbXM6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPiA9IHt9O1xuXG5cdHB1YmxpYyBpdGVtQ2hhbmdlczoge1xuXHRcdFtpdGVtRW50cnlJZDogbnVtYmVyXTogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzXG5cdH0gPSB7fTtcblxuXHRwdWJsaWMgaXRlbVJlc291cmNlczoge1xuXHRcdFtpdGVtRW50cnlJZDogbnVtYmVyXTogSXRlbVJlc291cmNlW11cblx0fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgdGVtcGxhdGVDYWNoZTogVGVtcGxhdGVDYWNoZSxcblx0XHRwcml2YXRlIGNvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5IYW5kbGVyOiBDb2x1bW5IYW5kbGVyLFxuXHRcdHByaXZhdGUgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbHVtblN1YnNldENhY2hlRmFjdG9yeTogQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0YXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0aXRlbUVudHJ5RmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeSxcblx0XHRpdGVtQ2FjaGVGYWN0b3J5OiBJdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0XHRwcm9taXNlU2VydmljZSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY29weVRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyAoXG5cdFx0aXRlbUVudHJ5Q2hhbmdlczogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzLFxuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdCk6IFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGluaXRpYWw6IHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRcdGl0ZW1FbnRyeUNoYW5nZXMuaW5pdGlhbCxcblx0XHRcdFx0e30sXG5cdFx0XHRcdGVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdCksXG5cdFx0XHRjaGFuZ2VzOiB0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRpdGVtRW50cnlDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRlbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpLFxuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlSXRlbUVudHJ5IChcblx0XHRjcmVhdGVUdXBsZTogQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhLFxuXHQpOiBJdGVtRW50cnkge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHN1cGVyLmNyZWF0ZUl0ZW1FbnRyeShjcmVhdGVUdXBsZSk7XG5cdFx0Y29uc3QgZGVmYXVsdExvY2FsQ2hhbmdlcyA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRMb2NhbERlZmF1bHRWYWx1ZXMoKTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gZGVmYXVsdExvY2FsQ2hhbmdlcykge1xuXHRcdFx0Y3JlYXRlVHVwbGUuZmllbGRzW2NvbHVtbklkXSA9IGRlZmF1bHRMb2NhbENoYW5nZXNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0Y3JlYXRlVHVwbGUuZmllbGRzLFxuXHRcdFx0e30sXG5cdFx0XHRjcmVhdGVUdXBsZS5jb2x1bW5zLm1haW4sXG5cdFx0KTtcblxuXHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9IHtcblx0XHRcdGluaXRpYWw6IGNyZWF0ZVR1cGxlLmZpZWxkcyxcblx0XHRcdGNoYW5nZXM6IGNoYW5nZXMsXG5cdFx0fTtcblxuXHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXS5pbml0aWFsLmlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0uY2hhbmdlcy5pZCA9IGl0ZW1FbnRyeS5pdGVtSWQ7XG5cblx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIHRoZSBsb2NhbCB7QGxpbmsgRmllbGRNYXAgY2hhbmdlc30gb2YgdGhlIHtAbGluayBJdGVtRW50cnkgZW50cnl9IG9uIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSB0cmFuc2FjdGlvbn0gaW4gYSBmb3JtYXR0ZWQgd2F5IHRoZSBBUEkgYWNjZXB0c1xuXHQgKi9cblx0cHVibGljIGZvcm1hdFJlcXVlc3Q8SXRlbUVudHJ5VHlwZSBleHRlbmRzIEl0ZW1FbnRyeT4gKFxuXHRcdGVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHQpOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPiB7XG5cdFx0Y29uc3QgbWFpbkNvbHVtbnMgPSBlbnRyeS5jb2x1bW5zLm1haW47XG5cblx0XHRpZiAoZW50cnkuaXNMb2NhbCgpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuZm9ybWF0UmVxdWVzdExvY2FsKFxuXHRcdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5jaGFuZ2VzLFxuXHRcdFx0XHRtYWluQ29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlcXVlc3QoXG5cdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5pbml0aWFsLFxuXHRcdFx0dGhpcy5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0uY2hhbmdlcyxcblx0XHRcdG1haW5Db2x1bW5zLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSBuZXcge0BsaW5rIFRlbXBsYXRlIHRlbXBsYXRlfSBhbmQgY3JlYXRlcyBuZXcge0BsaW5rIEl0ZW1FbnRyeSBpdGVtRW50cmllc30gd2l0aCB0aGUgcGFzc2VkIHZhbHVlc1xuXHQgKi9cblx0cHVibGljIGNyZWF0ZUl0ZW1zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHR2YWx1ZXNBcnJheTogQXJyYXk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4sXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0Y29uc3QgcHJvbWlzZXM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0Y29uc3QgdGVtcGxhdGVDb2x1bW5zID0ge1xuXHRcdFx0W2l0ZW1UeXBlXTogdGhpcy5leHBhbmRDb2x1bW5zV2l0aENvbGxlY3Rpb25Db2x1bW5zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdCksXG5cdFx0fTtcblxuXHRcdGZvciAoY29uc3QgdmFsdWVzIG9mIHZhbHVlc0FycmF5KSB7XG5cdFx0XHRjb25zdCBpdGVtSWQgPSB0aGlzLmtleVNlcnZpY2UuZ2V0TG9jYWxJZCgpO1xuXG5cdFx0XHRwcm9taXNlcy5wdXNoKFxuXHRcdFx0XHR0aGlzLnRlbXBsYXRlQ2FjaGVcblx0XHRcdFx0XHQuZmV0Y2hUZW1wbGF0ZShcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0e30sXG5cdFx0XHRcdFx0XHR0ZW1wbGF0ZUNvbHVtbnMsXG5cdFx0XHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0KHRlbXBsYXRlOiBUZW1wbGF0ZTxJdGVtVHlwZVR5cGU+KSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMucmVzb2x2ZUxvY2FsKFxuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHRcdFx0cGFyZW50LFxuXHRcdFx0XHRcdFx0XHRcdHRlbXBsYXRlLFxuXHRcdFx0XHRcdFx0XHRcdCgpID0+IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0KFxuXHRcdFx0XHRcdFx0XHRcdFx0X2l0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0XHRcdFx0XHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChfaXRlbVR5cGUgIT09IGl0ZW1UeXBlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiB2YWx1ZXMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IHZhbHVlc1tjb2x1bW5JZF07XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Vcblx0XHRcdC5hbGwocHJvbWlzZXMpXG5cdFx0XHQudGhlbigoKSA9PiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSkpO1xuXHR9XG5cblx0cHVibGljIGNsZWFySXRlbUVudHJ5IChlbnRyeTogSXRlbUVudHJ5KTogdm9pZCB7XG5cdFx0c3VwZXIuY2xlYXJJdGVtRW50cnkoZW50cnkpO1xuXG5cdFx0ZGVsZXRlIHRoaXMuaXRlbVJlc291cmNlc1tlbnRyeS5pZF07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFN0b3JlcyBhbSB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZX0gb24gdGhlIHRyYW5zYWN0aW9uLCB1c2VkIHRvIGNhbGwge0BsaW5rIEl0ZW1SZXNvdXJjZS5vcHRpb25zLm9uQ2hhbmdlIHRoZSBvbkNoYW5nZSBjYWxsYmFja31cblx0ICovXG5cdHB1YmxpYyBhZGRSZXNvdXJjZSAocmVzb3VyY2U6IEl0ZW1SZXNvdXJjZSk6IHZvaWQge1xuXHRcdGxldCByZXNvdXJjZUFycmF5ID0gdGhpcy5pdGVtUmVzb3VyY2VzW3Jlc291cmNlLmVudHJ5LmlkXTtcblxuXHRcdGlmIChyZXNvdXJjZUFycmF5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlc291cmNlQXJyYXkgPSB0aGlzLml0ZW1SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdID0gW107XG5cdFx0fVxuXG5cdFx0cmVzb3VyY2VBcnJheS5wdXNoKHJlc291cmNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVtb3ZlcyBhIHJlc291cmNlIGZyb20gdGhlIHRyYW5zYWN0aW9uLCBwcmV2ZW50aW5nIHRoZSB7QGxpbmsgSXRlbVJlc291cmNlLm9wdGlvbnMub25DaGFuZ2UgdGhlIG9uQ2hhbmdlIGNhbGxiYWNrfSBmcm9tIGJlaW5nIGNhbGxlZC5cblx0ICogWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgcmVzb3VyY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZFxuXHQgKi9cblx0cHVibGljIGNsZWFyUmVzb3VyY2UgKHJlc291cmNlOiBJdGVtUmVzb3VyY2UpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZXMgPSB0aGlzLml0ZW1SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdO1xuXG5cdFx0Ly8gSXQgY2FuIGJlIHRoYXQgYW4gaXRlbSB3YXMgYWxyZWFkeSBtYXJrZWQgZm9yIGRlbGV0aW9uLCBhbmQgYWxsIHJlc291cmNlcyBhcmUgYWxyZWFkeSBkZWxldGVkXG5cdFx0aWYgKHJlc291cmNlcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW5kZXggPSByZXNvdXJjZXMuaW5kZXhPZihyZXNvdXJjZSk7XG5cblx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHRyZXNvdXJjZXMuc3BsaWNlKFxuXHRcdFx0XHRpbmRleCxcblx0XHRcdFx0MSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlc291cmNlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBkZXRlY3RDaGFuZ2VzICgpOiBib29sZWFuIHtcblx0XHQvLyBpZiBhbiBlbnRyeSBpcyBpbiB0aGlzIHRyYW5zYWN0aW9uJ3MgY2FjaGUgaXQncyBhIGxvY2FsIG9uZSwgd2hpY2ggY291bnRzIGFzIGEgY2hhbmdlXG5cdFx0Zm9yIChjb25zdCBfaXRlbUVudHJ5SWQgaW4gdGhpcy5lbnRyaWVzLmVudHJpZXNCeUVudHJ5SWQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gdGhpcy5pdGVtQ2hhbmdlcykge1xuXHRcdFx0Y29uc3QgaGFzQ2hhbmdlcyA9IHRoaXMuZGV0ZWN0RW50cnlDaGFuZ2VzKE51bWJlcihpdGVtRW50cnlJZCkpO1xuXG5cdFx0XHRpZiAoaGFzQ2hhbmdlcykge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENoZWNrcyBpZiB0aGUgdHJhbnNhY3Rpb24gaGFzIGNoYW5nZXMgZm9yIHRoZSBwYXNzZWQge0BsaW5rIEl0ZW1FbnRyeS5pZCBJdGVtRW50cnlJZH1cblx0ICpcblx0ICogLS0tLS1cblx0ICogQHJlbWFya3Ncblx0ICogQ29tcGFyZXMgZXZlcnkgZmllbGQgKG9mIHRoZSBlbnRyeSkgaW4ge0BsaW5rIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIuaXRlbUNoYW5nZXMgaXRlbUNoYW5nZXN9IHdpdGggdGhlIGluaXRpYWwgZmllbGRzLCBiZWNhdXNlIGZpZWxkcyBhcmUgY29waWVkIG92ZXIgd2hlbiBjcmVhdGluZyBhIHJlc291cmNlIGhhdmluZyBzb21ldGhpbmcgaW4gaXRlbUNoYW5nZXMgZG9lc24ndCBhY3R1YWxseSBtZWFuIHRoYXQgdGhlcmUgYXJlIGNoYW5nZXMgKGp1c3QgdGhhdCBhIHJlc291cmNlIGhhcyBiZWVuIG1hZGUpXG5cdCAqL1xuXHRwdWJsaWMgZGV0ZWN0RW50cnlDaGFuZ2VzIChpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCkhO1xuXHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeUlkXTtcblxuXHRcdHJldHVybiB0aGlzLmFwaUZvcm1hdHRlci5oYXNDaGFuZ2VzKFxuXHRcdFx0Y2hhbmdlcy5pbml0aWFsLFxuXHRcdFx0Y2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBQcm9jZXNzZXMgb24gYSBjYWNoZWQgZW50cnksIGlmIHRoZXJlIGFyZSBubyB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5pdGVtQ2hhbmdlcyBpdGVtQ2hhbmdlc30gdGhlIG5ldyB2YWx1ZXMgd2lsbCBub3QgYmUgcHJvY2Vzc2VkLCB1bmxlc3MgZm9yY2VPdmVyd3JpdGUgaXMgc2V0XG5cdCAqXG5cdCAqIEBwYXJhbSBpdGVtRW50cnlDaGFuZ2VzVHVwbGUgVGhlIGNoYW5nZXMgdHVwbGVcblx0ICogQHBhcmFtIGZvcmNlT3ZlcndyaXRlIEluc3RlYWQgb2YgY2FsbGluZyB7QGxpbmsgQXBpRm9ybWF0dGVyLm1lcmdlQ29weUZpZWxkcyBtZXJnZUNvcHlGaWVsZHN9LCB7QGxpbmsgQXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMgY29weUZpZWxkc30gd2lsbCBiZSB1c2VkIChiZWNhdXNlIEFQSSB2YWx1ZXMgYXJlIGFsd2F5cyByaWdodClcblx0ICogQHBhcmFtIHVwZGF0ZUluaXRpYWwgU2hvdWxkIGJlIGB0cnVlYCBpZiBjYWxsZWQgYnkgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudFxuXHQgKiBAcGFyYW0gaXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSBJbmRpY2F0ZXMgdGhhdCB0aGUgY2hhbmdlIGlzIGRvbmUgYnkgYSBkaWZmZXJlbnQgdXNlclxuXHQgKlxuXHQgKiBAcmV0dXJuc1xuXHQgKiBUaGUgcHJldmlvdXMgY2hhbmdlcyB7QGxpbmsgRmllbGRNYXAgRmllbGRNYXB9XG5cdCAqL1xuXHRwdWJsaWMgcHJvY2Vzc0l0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRpdGVtRW50cnlDaGFuZ2VzVHVwbGU6IENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YTxJdGVtVHlwZVR5cGU+LFxuXHRcdGZvcmNlT3ZlcndyaXRlOiBib29sZWFuID0gZmFsc2UsXG5cdFx0dXBkYXRlSW5pdGlhbDogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB8IG51bGwge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGl0ZW1FbnRyeUNoYW5nZXNUdXBsZS5lbnRyeTtcblx0XHRjb25zdCBjaGFuZ2VzID0gaXRlbUVudHJ5Q2hhbmdlc1R1cGxlLmNoYW5nZXM7XG5cblx0XHQvLyBJZiB3ZSBkb24ndCBoYXZlIHRoZXNlIGl0ZW1zIGNhY2hlZCAgd2UgZG9uJ3QgbmVlZCB0byBtZXJnZS9jb3B5IGFueXRoaW5nXG5cdFx0aWYgKHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlcy5leHBhbmRlZENvbHVtbnMgIT09IG51bGwpIHtcblx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zID0gY2hhbmdlcy5leHBhbmRlZENvbHVtbnMubWVyZ2VkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGxvY2FsQ2hhbmdlcyA9IHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdGNvbnN0IHByZXZpb3VzID0gdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0e30sXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNVcGRhdGVkRmllbGRzID0gdGhpcy5hcGlGb3JtYXR0ZXIuaGFzQ2hhbmdlcyhcblx0XHRcdGNoYW5nZXMuZmllbGRzLFxuXHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHRpZiAoZm9yY2VPdmVyd3JpdGUpIHtcblx0XHRcdHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRcdGNoYW5nZXMuZmllbGRzLFxuXHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuYXBpRm9ybWF0dGVyLm1lcmdlQ29weUZpZWxkcyhcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmluaXRpYWwsXG5cdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0XHRjaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHVwZGF0ZUluaXRpYWwpIHtcblx0XHRcdHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRcdGNoYW5nZXMuZmllbGRzLFxuXHRcdFx0XHRsb2NhbENoYW5nZXMuaW5pdGlhbCxcblx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKGNoYW5nZXMuZmllbGRzLmRpc3BsYXluYW1lID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IG5ld0Rpc3BsYXlOYW1lID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldERpc3BsYXlOYW1lKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKG5ld0Rpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMuZGlzcGxheW5hbWUgPSBuZXdEaXNwbGF5TmFtZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaGFzVXBkYXRlZEZpZWxkcykge1xuXHRcdFx0Y29uc3QgcmVzb3VyY2VzID0gdGhpcy5pdGVtUmVzb3VyY2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRcdGlmIChyZXNvdXJjZXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRyZXNvdXJjZS5vcHRpb25zLm9uQ2hhbmdlKFxuXHRcdFx0XHRcdFx0XHRyZXNvdXJjZSxcblx0XHRcdFx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHRcdFx0XHRcdGNvbHVtbklkID0+IHJlc291cmNlLmNvbXBhcmVJdGVtRmllbGQoXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBwcmV2aW91cztcblx0fVxuXG5cdHB1YmxpYyBjbG9uZUl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwID0ge30sXG5cdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2s/OiBNb2RpZnlGaWVsZHNDYWxsYmFjayxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHQvLyB0aGUgdGhlIGl0ZW1zIG1pZ2h0IHJlZmVyZW5jZSBlYWNoIG90aGVyLCBzbyB1cGRhdGUgdGhlIGNvbnZlcnNpb24gbWFwIGZpcnN0XG5cdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLmJhdGNoRXhwYW5kQ29udmVyc2lvbk1hcChcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdHRoaXMuY2xvbmVJdGVtRW50cnkoXG5cdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRzb3VyY2VFbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0bmV3RmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+ID0ge30sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9LFxuXHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrPzogTW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdCk6IEl0ZW1JZCB7XG5cdFx0Y29uc3Qgc291cmNlRW50cnlDaGFuZ2VzVHVwbGUgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsSXRlbUVudHJ5Q2hhbmdlc1R1cGxlKFxuXHRcdFx0c291cmNlRW50cnkuaWQsXG5cdFx0KTtcblxuXHRcdGNvbnN0IG5ld0l0ZW1JZCA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5leHBhbmRDb252ZXJzaW9uTWFwKFxuXHRcdFx0c291cmNlRW50cnksXG5cdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdCk7XG5cblx0XHRjb25zdCBzb3VyY2VQYXJlbnQgPSB0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChzb3VyY2VFbnRyeSk7XG5cdFx0bGV0IG5ld1BhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbDtcblxuXHRcdGlmIChzb3VyY2VQYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdGNvbnN0IG5ld1BhcmVudElkID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldENvbnZlcnNpb25WYWx1ZShcblx0XHRcdFx0c291cmNlUGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0XHRzb3VyY2VQYXJlbnQuaXRlbUlkLFxuXHRcdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdFx0KTtcblxuXHRcdFx0bmV3UGFyZW50ID0ge1xuXHRcdFx0XHRpdGVtVHlwZTogc291cmNlUGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQ6IG5ld1BhcmVudElkIHx8IHNvdXJjZVBhcmVudC5pdGVtSWQsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IHNvdXJjZUZpZWxkcyA9IHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRzb3VyY2VFbnRyeUNoYW5nZXNUdXBsZS5jaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHR7fSxcblx0XHRcdHNvdXJjZUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0Y29uc3QgdXBkYXRlZEl0ZW1WYWx1ZXMgPSB0aGlzLnVwZGF0ZUl0ZW1WYWx1ZXMoXG5cdFx0XHRzb3VyY2VGaWVsZHMsXG5cdFx0XHRuZXdQYXJlbnQsXG5cdFx0XHRzb3VyY2VFbnRyeS5jb2x1bW5zLml0ZW0sXG5cdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHVwZGF0ZWRJdGVtVmFsdWVzKSB7XG5cdFx0XHRzb3VyY2VGaWVsZHNbY29sdW1uSWRdID0gdXBkYXRlZEl0ZW1WYWx1ZXNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gbmV3RmllbGRzKSB7XG5cdFx0XHRzb3VyY2VGaWVsZHNbY29sdW1uSWRdID0gbmV3RmllbGRzW2NvbHVtbklkXTtcblx0XHR9XG5cblx0XHRpZiAobW9kaWZ5RmllbGRzQ2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2soXG5cdFx0XHRcdHNvdXJjZUVudHJ5LFxuXHRcdFx0XHRzb3VyY2VGaWVsZHMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZChcblx0XHRcdG5ld0l0ZW1JZCxcblx0XHRcdHNvdXJjZUZpZWxkcyxcblx0XHRcdHNvdXJjZUVudHJ5LmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJldHVybiBuZXdJdGVtSWQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cmllc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRlbnRyeU9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHQuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaEl0ZW1FbnRyaWVzQnlRdWVyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRlbnRyeU9wdGlvbnMsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKCF0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKGl0ZW1JZCkpIHtcblx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHRcdC5pdGVtSGFuZGxlclxuXHRcdFx0XHQuZmV0Y2hJdGVtRW50cnkoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2FjaGVkRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChjYWNoZWRFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAodGhpcy50cmFuc2FjdGlvbi5wYXJlbnQgaW5zdGFuY2VvZiBTZXJ2ZXJDYWNoZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KFxuXHRcdFx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZS5jcmVhdGVVbmZvdW5kTG9jYWxJdGVtRXJyb3IoaXRlbVR5cGUpLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXaGVuIGV4cGFuZGluZyBpdGVtcyB3aXRoIG5ldyBkYXRhICh3aGljaCBhcmVuJ3QgdGVjaG5pY2FsbHkgY2hhbmdlcykgaXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHRoZSBpdGVtIGxpdmVzIG9uXG5cdFx0XHQvLyBXZSBkbyB0aGUgc2FtZSAoYnV0IGZhc3RlcikgYnkgc2tpcHBpbmcgc3RyYWlnaHQgdG8gdGhlIHNlcnZlciBjYWNoZSBmb3IgcmVtb3RlIGl0ZW1zXG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5wYXJlbnQuaXRlbUhhbmRsZXIuZmV0Y2hJdGVtRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdG9wdGlvbnMuY29sdW1ucyA9IHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhDb2xsZWN0aW9uQ29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGUgPSB0aGlzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeS5jb25zdHJ1Y3Qob3B0aW9ucy5jb2x1bW5zKTtcblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hMb2NhbEl0ZW1FbnRyeURhdGEoXG5cdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUsXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0aXRlbUVudHJ5ID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHRcdFx0LmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSlcblx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHQoKSA9PiBpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSB0ZW1wbGF0ZSBhbmQgY3JlYXRlcyBhIG5ldyB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0sIHdpbGwgZXJyb3IgaWYgdGhlIEl0ZW1FbnRyeSB3aXRoIHRoZSBnaXZlbiBJdGVtSWQgYWxyZWFkeSBleGlzdHNcblx0ICovXG5cdHB1YmxpYyBmZXRjaE5ld0l0ZW1FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRpZiAoXG5cdFx0XHR0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0KSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KFxuXHRcdFx0XHR0aGlzLml0ZW1FbnRyeVNlcnZpY2UuY3JlYXRlRXhpc3RpbmdMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnRlbXBsYXRlQ2FjaGVcblx0XHRcdC5mZXRjaFRlbXBsYXRlKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRvcHRpb25zLnRlbXBsYXRlT3B0aW9ucyxcblx0XHRcdFx0b3B0aW9ucy50ZW1wbGF0ZUNvbHVtbnMsXG5cdFx0XHRcdG9wdGlvbnMucGFyZW50LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHRlbXBsYXRlID0+IHtcblx0XHRcdFx0XHQvLyBJdCBjb3VsZCBiZSB0aGF0IGZvciB3aGF0ZXZlciByZWFzb24gJ2ZldGNoTmV3SXRlbScgaXMgY2FsbGVkIGEgc2Vjb25kIHRpbWUgd2hpbGUgbG9hZGluZ1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHQpICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5yZWplY3QoXG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZS5jcmVhdGVFeGlzdGluZ0xvY2FsSXRlbUVycm9yKGl0ZW1UeXBlKSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0XHRcdFx0dGhpcy5yZXNvbHZlTG9jYWwoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdG9wdGlvbnMucGFyZW50LFxuXHRcdFx0XHRcdFx0dGVtcGxhdGUsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRjb25zdCByZW1vdGVJdGVtSWRzOiBJdGVtSWRbXSA9IFtdO1xuXHRcdGNvbnN0IGxvY2FsSXRlbUlkczogSXRlbUlkW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGl0ZW1JZHMpIHtcblx0XHRcdGlmICh0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKGl0ZW1JZCkpIHtcblx0XHRcdFx0bG9jYWxJdGVtSWRzLnB1c2goaXRlbUlkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW90ZUl0ZW1JZHMucHVzaChpdGVtSWQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlXG5cdFx0XHQuYWxsKHtcblx0XHRcdFx0cmVtb3RlOiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdFx0XHQuaXRlbUhhbmRsZXJcblx0XHRcdFx0XHQuZmV0Y2hJdGVtRW50cmllcyhcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0cmVtb3RlSXRlbUlkcyxcblx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0bG9jYWw6IHRoaXMuZmV0Y2hMb2NhbEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGxvY2FsSXRlbUlkcyxcblx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHQpLFxuXHRcdFx0fSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXN1bHQgPT4ge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQucmVtb3RlLmNvbmNhdChyZXN1bHQubG9jYWwpO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8vIHRvZG9bY2FjaGVdIG1vdmUgdG8gVHJhbnNhY3Rpb25DYWNoZSA/XG5cdHB1YmxpYyBmZXRjaFRpdGxlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgdGl0bGVGaWVsZCA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRUaXRsZUZpZWxkKGl0ZW1UeXBlKTtcblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hJdGVtRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdG5ldyBJdGVtRW50cnlPcHRpb25zKHtcblx0XHRcdFx0XHRjb2x1bW5zOiBbdGl0bGVGaWVsZF0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGl0ZW1FbnRyeSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pZCxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRyZXR1cm4gY2hhbmdlc1t0aXRsZUZpZWxkXTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyByZXNvbHZlTG9jYWxJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtblN1YnNldENhY2hlOiBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRpZiAoY29sdW1uU3Vic2V0Q2FjaGUucnVuKGl0ZW1FbnRyeS5jb2x1bW5zKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihpdGVtRW50cnkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbHVtbkRpZmZlcmVuY2UgPSB0aGlzLmdldENvbHVtbkRpZmZlcmVuY2UoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRvcHRpb25zLmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLmNvbHVtbkhhbmRsZXJcblx0XHRcdC5mZXRjaChcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRjb2x1bW5EaWZmZXJlbmNlLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZXhwYW5kTG9jYWxJdGVtRW50cmllcyhcblx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdFtpdGVtRW50cnldLFxuXHRcdFx0XHRcdFx0Y29sdW1uRGlmZmVyZW5jZSxcblx0XHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gaXRlbUVudHJ5LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUxvY2FsRW50cmllcyAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0bG9jYWxQYXJlbnRJZDogSXRlbUlkLFxuXHRcdHRlbXBsYXRlOiBUZW1wbGF0ZTxJdGVtVHlwZT4sXG5cdFx0aXRlbUlkQ29udmVyc2lvbjogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0XHRmaWx0ZXJJdGVtRW50cnlDYWxsYmFjazogRmlsdGVySXRlbUVudHJ5Q2FsbGJhY2sgPSAoKSA9PiB0cnVlLFxuXHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrPzogTW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGFwaVJlc3BvbnNlID0gdGVtcGxhdGUucmVzcG9uc2U7XG5cdFx0Y29uc3QgY29sdW1uU2V0TWFwOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBDb2x1bW5TZXQ8SXRlbVR5cGU+fSA9IHt9O1xuXG5cdFx0Y29uc3QgY3JlYXRlRW50cmllcyA9IChcblx0XHRcdF9wYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRcdF9sb2NhbFBhcmVudElkOiBJdGVtSWQsXG5cdFx0XHRhcGlQYXJlbnRJZDogSXRlbUlkLFxuXHRcdCkgPT4ge1xuXHRcdFx0Y29uc3QgcGFyZW50ID0ge1xuXHRcdFx0XHRpdGVtVHlwZTogX3BhcmVudFR5cGUsXG5cdFx0XHRcdGl0ZW1JZDogX2xvY2FsUGFyZW50SWQsXG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBsaW5rcyA9IGFwaVJlc3BvbnNlLml0ZW1zW19wYXJlbnRUeXBlXVthcGlQYXJlbnRJZF0ubGlua3M7XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gbGlua3MpIHtcblx0XHRcdFx0aWYgKCFsaW5rcy5oYXNPd25Qcm9wZXJ0eShpdGVtVHlwZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjb2x1bW5TZXRNYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb2x1bW5TZXRNYXBbaXRlbVR5cGVdID0gdGhpcy5jb2x1bW5TZXRGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdHRlbXBsYXRlLnJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yIChjb25zdCBhcGlJdGVtSWQgb2YgbGlua3NbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0Y29uc3QgZmllbGRzID0gYXBpUmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGFwaUl0ZW1JZCxcblx0XHRcdFx0XHQpITtcblxuXHRcdFx0XHRcdGlmICghZmlsdGVySXRlbUVudHJ5Q2FsbGJhY2soXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0XHQpKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBsb2NhbEl0ZW1JZCA9IGl0ZW1JZENvbnZlcnNpb25baXRlbVR5cGVdW2FwaUl0ZW1JZF07XG5cblx0XHRcdFx0XHRjb25zdCB1cGRhdGVkSXRlbVZhbHVlcyA9IHRoaXMudXBkYXRlSXRlbVZhbHVlcyhcblx0XHRcdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0XHRcdHBhcmVudCxcblx0XHRcdFx0XHRcdGNvbHVtblNldE1hcFtpdGVtVHlwZV0uaXRlbSxcblx0XHRcdFx0XHRcdGl0ZW1JZENvbnZlcnNpb24sXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gdXBkYXRlZEl0ZW1WYWx1ZXMpIHtcblx0XHRcdFx0XHRcdGZpZWxkc1tjb2x1bW5JZF0gPSB1cGRhdGVkSXRlbVZhbHVlc1tjb2x1bW5JZF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG1vZGlmeUZpZWxkc0NhbGxiYWNrICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrKFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWRDb252ZXJzaW9uLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0b2RvW2NhY2hlXSB0ZXN0IHBhcmVudEZpZWxkcywgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBjb2x1bW5zIGZvciBpdFxuXHRcdFx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZChcblx0XHRcdFx0XHRcdGxvY2FsSXRlbUlkLFxuXHRcdFx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRcdFx0Y29sdW1uU2V0TWFwW2l0ZW1UeXBlXSxcblx0XHRcdFx0XHRcdHBhcmVudCxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y3JlYXRlRW50cmllcyhcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0bG9jYWxJdGVtSWQsXG5cdFx0XHRcdFx0XHRhcGlJdGVtSWQsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjcmVhdGVFbnRyaWVzKFxuXHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdGxvY2FsUGFyZW50SWQsXG5cdFx0XHRhcGlSZXNwb25zZS5saW5rc1twYXJlbnRUeXBlXVswXSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGV4cGFuZExvY2FsSXRlbUVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YUJhc2UsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0aWYgKGl0ZW1FbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihpdGVtRW50cmllcyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBleHBhbnNpb25SZXN1bHQgPSBjb2x1bW5FeHBhbnNpb24ucnVuKGl0ZW1FbnRyeS5jb2x1bW5zKTtcblxuXHRcdFx0aWYgKGV4cGFuc2lvblJlc3VsdCA9PT0gbnVsbCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5leHBhbmRMb2NhbEl0ZW1FbnRyeShcblx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdGV4cGFuc2lvblJlc3VsdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVzb2x2ZURlcml2ZWRWYWx1ZXMoXG5cdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdGNvbHVtbkV4cGFuc2lvbi5hZ2dyZWdhdGVSb290Q29sdW1ucygpLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgdXBkYXRlSXRlbVZhbHVlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdFx0aXRlbUNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgcmVzdWx0ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBpdGVtQ29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cdFx0XHRjb25zdCBhcGlDb2x1bW4gPSBjb2x1bW4uYXBpQ29sdW1uO1xuXG5cdFx0XHQvLyBUT0RPOiB3ZSBjYW4gcmVjb25zaWRlciB0aGlzIG9uY2UgYWxsIGNvbHVtbnMgYXJlIHJlc3BlY3RlZCBmb3IgbG9jYWwgaXRlbXMgW1JNNC0xMDM3OF1cblx0XHRcdGxldCBuZXdWYWx1ZTtcblxuXHRcdFx0aWYgKGFwaUNvbHVtbi50eXBlID09PSAnbGluaycgJiYgY2hhbmdlc1tjb2x1bW5JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0bmV3VmFsdWUgPSBwYXJlbnQuaXRlbUlkO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRuZXdWYWx1ZSA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRDb252ZXJzaW9uVmFsdWUoXG5cdFx0XHRcdFx0YXBpQ29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRcdGNoYW5nZXNbY29sdW1uSWRdLFxuXHRcdFx0XHRcdGNvbnZlcnNpb25NYXAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChuZXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJlc3VsdFtjb2x1bW5JZF0gPSBuZXdWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSBkYXRhIGZvciB0aGUgcGFzc2VkIEl0ZW1UeXBlL0l0ZW1JZC9jb2x1bW5zLCBpcyBhYmxlIHRvIGZldGNoQ29sbGVjdGlvbkVudHJ5IG5vbi1sb2NhbCBkZXJpdmVkIHZhbHVlcy5cblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBBc3N1bWVzIHRoZSB0aGUgSXRlbUVudHJ5IHdpdGggdGhlIGdpdmVuIEl0ZW1UeXBlLUl0ZW1JZCBpcyBhbHJlYWR5IGNhY2hlZFxuXHQgKi9cblx0cHVibGljIGZldGNoTG9jYWxJdGVtRW50cnlEYXRhPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRjb2x1bW5TdWJzZXRDYWNoZTogQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpIHtcblx0XHRjb25zdCBjYWNoZWRFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHQpO1xuXG5cdFx0aWYgKGNhY2hlZEVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5yZWplY3QoXG5cdFx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZS5jcmVhdGVVbmZvdW5kTG9jYWxJdGVtRXJyb3IoaXRlbVR5cGUpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNvbHZlTG9jYWxJdGVtRW50cnkoXG5cdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRjYWNoZWRFbnRyeSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoTG9jYWxJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRvcHRpb25zLmNvbHVtbnMgPSB0aGlzLmV4cGFuZENvbHVtbnNXaXRoQ29sbGVjdGlvbkNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMuY29sdW1ucyxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG9wdGlvbnMuY29sdW1ucyk7XG5cdFx0Y29uc3QgcHJvbWlzZXM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8YW55Pj4gPSBbXTtcblxuXHRcdGNvbnN0IGl0ZW1JZHNPblBhcmVudFRyYW5zYWN0aW9uOiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgaXRlbUlkcykge1xuXHRcdFx0Y29uc3QgY2FjaGVkRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGNhY2hlZEVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYgKHRoaXMudHJhbnNhY3Rpb24ucGFyZW50IGluc3RhbmNlb2YgU2VydmVyQ2FjaGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KFxuXHRcdFx0XHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLmNyZWF0ZVVuZm91bmRMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdoZW4gZXhwYW5kaW5nIGl0ZW1zIHdpdGggbmV3IGRhdGEgKHdoaWNoIGFyZW4ndCB0ZWNobmljYWxseSBjaGFuZ2VzKSBpdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgdHJhbnNhY3Rpb24gdGhlIGl0ZW0gbGl2ZXMgb25cblx0XHRcdFx0Ly8gV2UgZG8gdGhlIHNhbWUgKGJ1dCBmYXN0ZXIpIGJ5IHNraXBwaW5nIHN0cmFpZ2h0IHRvIHRoZSBzZXJ2ZXIgY2FjaGUgZm9yIHJlbW90ZSBpdGVtc1xuXHRcdFx0XHRpdGVtSWRzT25QYXJlbnRUcmFuc2FjdGlvbi5wdXNoKGl0ZW1JZCk7XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdHRoaXMuZmV0Y2hMb2NhbEl0ZW1FbnRyeURhdGEoXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZSxcblx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAoaXRlbUlkc09uUGFyZW50VHJhbnNhY3Rpb24ubGVuZ3RoID4gMCkge1xuXHRcdFx0aWYgKHRoaXMudHJhbnNhY3Rpb24ucGFyZW50IGluc3RhbmNlb2YgU2VydmVyQ2FjaGUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdUcmllZCBsb29raW5nIGZvciBsb2NhbCBlbnRyaWVzIG9uIHRoZSBzZXJ2ZXJDYWNoZScpO1xuXHRcdFx0fVxuXG5cdFx0XHRwcm9taXNlcy5wdXNoKFxuXHRcdFx0XHQodGhpcy50cmFuc2FjdGlvbi5wYXJlbnQgYXMgVHJhbnNhY3Rpb25DYWNoZSkuaXRlbUhhbmRsZXIuZmV0Y2hMb2NhbEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZHNPblBhcmVudFRyYW5zYWN0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlXG5cdFx0XHQuYWxsKHByb21pc2VzKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHRcdFx0LmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSlcblx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHQoKSA9PiBpdGVtSWRzLm1hcChcblx0XHRcdFx0XHRcdFx0XHRpdGVtSWQgPT4gdGhpcy50cmFuc2FjdGlvbi5nZXRMb2NhbEl0ZW1FbnRyeUJ5SXRlbUlkKFxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHRcdFx0KSEsXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGdldENvbHVtbkRpZmZlcmVuY2UgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4sXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBBcGlSZXF1ZXN0Q29sdW1ucyB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1uVXRpbC5tZXJnZVJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMucmVxdWVzdCxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdCkuZGlmZmVyZW5jZTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZUxvY2FsPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0XHR0ZW1wbGF0ZTogVGVtcGxhdGU8SXRlbVR5cGVUeXBlPixcblx0XHRmaWx0ZXJJdGVtRW50cnlDYWxsYmFjazogRmlsdGVySXRlbUVudHJ5Q2FsbGJhY2sgPSAoKSA9PiB0cnVlLFxuXHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrPzogTW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGl0ZW1JZENvbnZlcnNpb24gPSB0aGlzLml0ZW1FbnRyeVNlcnZpY2UuY3JlYXRlTG9jYWxDb252ZXJzaW9uTWFwKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0XHR0cnVlLFxuXHRcdFx0dGVtcGxhdGUucmVzcG9uc2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvcGllZEZpZWxkcyA9IHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHR0ZW1wbGF0ZS5maWVsZHMsXG5cdFx0XHR7fSxcblx0XHRcdHRlbXBsYXRlLmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0Y29uc3QgdXBkYXRlZEl0ZW1WYWx1ZXMgPSB0aGlzLnVwZGF0ZUl0ZW1WYWx1ZXMoXG5cdFx0XHRjb3BpZWRGaWVsZHMsXG5cdFx0XHRwYXJlbnQsXG5cdFx0XHR0ZW1wbGF0ZS5jb2x1bW5zLml0ZW0sXG5cdFx0XHRpdGVtSWRDb252ZXJzaW9uLFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHVwZGF0ZWRJdGVtVmFsdWVzKSB7XG5cdFx0XHRjb3BpZWRGaWVsZHNbY29sdW1uSWRdID0gdXBkYXRlZEl0ZW1WYWx1ZXNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdGlmIChtb2RpZnlGaWVsZHNDYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtb2RpZnlGaWVsZHNDYWxsYmFjayhcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGNvcGllZEZpZWxkcyxcblx0XHRcdFx0aXRlbUlkQ29udmVyc2lvbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHRcdFx0aXRlbUlkLFxuXHRcdFx0Y29waWVkRmllbGRzLFxuXHRcdFx0dGVtcGxhdGUuY29sdW1ucyxcblx0XHRcdHBhcmVudCxcblx0XHQpO1xuXG5cdFx0dGhpcy5jcmVhdGVMb2NhbEVudHJpZXMoXG5cdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHRcdHRlbXBsYXRlLFxuXHRcdFx0aXRlbUlkQ29udmVyc2lvbixcblx0XHRcdGZpbHRlckl0ZW1FbnRyeUNhbGxiYWNrLFxuXHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZXhwYW5kTG9jYWxJdGVtRW50cnk8SXRlbUVudHJ5VHlwZSBleHRlbmRzIEl0ZW1FbnRyeT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhQmFzZSxcblx0XHRlbnRyeTogSXRlbUVudHJ5VHlwZSxcblx0XHRjb2x1bW5FeHBhbnNpb25SZXN1bHQ6IENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPixcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgbWFpbkNvbHVtbnMgPSBjb2x1bW5FeHBhbnNpb25SZXN1bHQuZGlmZmVyZW5jZS5tYWluO1xuXG5cdFx0ZW50cnkuY29sdW1ucyA9IGNvbHVtbkV4cGFuc2lvblJlc3VsdC5tZXJnZWQ7XG5cblx0XHRpZiAobWFpbkNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsdWVzID0gdGhpcy5nZXRMb2NhbFZhbHVlcyhcblx0XHRcdGVudHJ5LFxuXHRcdFx0bWFpbkNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdGlmICghaGFzUHJvcGVydGllcyh2YWx1ZXMpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0ZW50cnksXG5cdFx0XHR2YWx1ZXMsXG5cdFx0XHRjb2x1bW5FeHBhbnNpb25SZXN1bHQsXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0TG9jYWxWYWx1ZXM8SXRlbUVudHJ5VHlwZSBleHRlbmRzIEl0ZW1FbnRyeT4gKFxuXHRcdGVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88SXRlbUVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPiB7XG5cdFx0Y29uc3QgcGFyZW50ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoZW50cnkpO1xuXHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXModGhpcy5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0pO1xuXHRcdGNvbnN0IHJlc3VsdDogRmllbGRNYXA8SXRlbUVudHJ5VHlwZVsnaXRlbVR5cGUnXT4gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtbklkID0gY29sdW1uLmlkO1xuXG5cdFx0XHQvLyBwYXJlbnQgY29sdW1ucyBtaWdodCBhbHNvIGJlIGluY2x1ZGVkIGluIHRoZSBkaWZmZXJlbmNlXG5cdFx0XHRpZiAoY2hhbmdlc1tjb2x1bW5JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY29sdW1uVHlwZSA9IGNvbHVtbi5hcGlDb2x1bW4udHlwZTtcblxuXHRcdFx0cmVzdWx0W2NvbHVtbklkXSA9IGNvbHVtblR5cGUgPT09ICdsaW5rJyAmJiBwYXJlbnQgIT09IG51bGwgP1xuXHRcdFx0XHRwYXJlbnQuaXRlbUlkIDpcblx0XHRcdFx0dGhpcy5hcGlGb3JtYXR0ZXIuZ2V0RGVmYXVsdFZhbHVlKGNvbHVtblR5cGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cbiIsImltcG9ydCB7IFJtQ29yZSB9IGZyb20gJy4uLy4uL2NvcmUnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0Q29sbGVjdGlvbkVudHJ5RmFjdG9yeSxcblx0Q29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRDb2x1bW5TZXRGYWN0b3J5LFxuXHRDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdEl0ZW1DYWNoZUZhY3RvcnksXG5cdEl0ZW1FbnRyeUZhY3RvcnksXG5cdEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi4vLi4vZmFjdG9yaWVzL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuaW1wb3J0IHtcblx0QXV0aEludGVyZmFjZSxcblx0RXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRQcm9taXNlTGlicmFyeUludGVyZmFjZSxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0xpbmtUcmVlU2VydmljZUludGVyZmFjZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIEl0ZW1FbnRyeSB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBFbnRyeVBhcmVudE51bGwsIEZpZWxkTWFwLCBJdGVtSWRDb252ZXJzaW9uTWFwLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaUZvcm1hdHRlciB9IGZyb20gJy4uL0FwaUZvcm1hdHRlcic7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0U2VydmljZSB9IGZyb20gJy4uL0FwaVJlcXVlc3RTZXJ2aWNlJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSB9IGZyb20gJy4uL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFSZXN1bHQgfSBmcm9tICcuLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayB9IGZyb20gJy4uL0NoYW5nZXNQcm9jZXNzb3InO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkNhY2hlIH0gZnJvbSAnLi4vQ29sbGVjdGlvbkNhY2hlJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UgfSBmcm9tICcuLi9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlJztcbmltcG9ydCB7IENvbHVtbkNhY2hlIH0gZnJvbSAnLi4vQ29sdW1uQ2FjaGUnO1xuaW1wb3J0IHsgQ29sdW1uSGFuZGxlciB9IGZyb20gJy4uL0NvbHVtbkhhbmRsZXInO1xuaW1wb3J0IHsgQ29sdW1uSW5mbyB9IGZyb20gJy4uL0NvbHVtbkluZm8nO1xuaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4uL0NvbHVtblV0aWwnO1xuaW1wb3J0IHsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBJdGVtQ2FjaGUgfSBmcm9tICcuLi9JdGVtQ2FjaGUnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4uL0l0ZW1FbnRyeVNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uL0tleVNlcnZpY2UnO1xuaW1wb3J0IHsgTG9ja1NlcnZpY2UgfSBmcm9tICcuLi9Mb2NrU2VydmljZSc7XG5pbXBvcnQgeyBRdWVyeVNlcnZpY2UgfSBmcm9tICcuLi9RdWVyeVNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdEJ1ZmZlck1hbmFnZXIgfSBmcm9tICcuLi9SZXF1ZXN0QnVmZmVyTWFuYWdlcic7XG5pbXBvcnQgeyBUZW1wbGF0ZUNhY2hlIH0gZnJvbSAnLi4vVGVtcGxhdGVDYWNoZSc7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vc2VydmVyL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyIH0gZnJvbSAnLi9zZXJ2ZXIvU2VydmVyQ29sbGVjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgU2VydmVySXRlbUVudHJ5Q2hhbmdlcywgU2VydmVySXRlbUhhbmRsZXIgfSBmcm9tICcuL3NlcnZlci9TZXJ2ZXJJdGVtSGFuZGxlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzLCBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkl0ZW1IYW5kbGVyJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2FjaGUge1xuXG5cdHB1YmxpYyBjaGlsZHJlbjogVHJhbnNhY3Rpb25DYWNoZVtdID0gW107XG5cblx0cHVibGljIHJlYWRvbmx5IGl0ZW1IYW5kbGVyOiBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyIHwgU2VydmVySXRlbUhhbmRsZXI7XG5cdHB1YmxpYyByZWFkb25seSBjb2xsZWN0aW9uSGFuZGxlcjogVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlciB8IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyO1xuXG5cdHB1YmxpYyBwYXJlbnQ6IEFic3RyYWN0Q2FjaGUgfCBudWxsO1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0cHVibGljIGNvcmU6IFJtQ29yZSxcblx0XHRwcm90ZWN0ZWQgY29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlLFxuXHRcdHByb3RlY3RlZCByZXF1ZXN0QnVmZmVyTWFuYWdlcjogUmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0cHJvdGVjdGVkIHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgYXV0aEludGVyZmFjZTogQXV0aEludGVyZmFjZSxcblx0XHRwcm90ZWN0ZWQgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgbG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5OiBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCB0ZW1wbGF0ZUNhY2hlOiBUZW1wbGF0ZUNhY2hlLFxuXHRcdHByb3RlY3RlZCBpdGVtQ2FjaGVGYWN0b3J5OiBJdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcm90ZWN0ZWQgZXhjZXB0aW9uSGFuZGxlcjogRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0XHRwcm90ZWN0ZWQgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByb3RlY3RlZCBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJvdGVjdGVkIGNvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0cHJvdGVjdGVkIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIGNvbHVtblN1YnNldENhY2hlRmFjdG9yeTogQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByb3RlY3RlZCBpdGVtRW50cnlGYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uRW50cnlGYWN0b3J5OiBDb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgcXVlcnlQYXJzZXJGYWN0b3J5OiBRdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwcm90ZWN0ZWQgbGlua1RyZWVTZXJ2aWNlOiBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUNoaWxkIChpZD86IHN0cmluZyk6IFRyYW5zYWN0aW9uQ2FjaGUge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uQ2FjaGUoXG5cdFx0XHR0aGlzLmNvcmUsXG5cdFx0XHR0aGlzLmNvbHVtbkNhY2hlLFxuXHRcdFx0dGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0aGlzLmF1dGhJbnRlcmZhY2UsXG5cdFx0XHR0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0XHR0aGlzLmxvY2tTZXJ2aWNlLFxuXHRcdFx0dGhpcy5tb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdFx0dGhpcy5pdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdFx0dGhpcy50ZW1wbGF0ZUNhY2hlLFxuXHRcdFx0dGhpcy5pdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdFx0dGhpcy5lcnJvckhhbmRsZXIsXG5cdFx0XHR0aGlzLmV4Y2VwdGlvbkhhbmRsZXIsXG5cdFx0XHR0aGlzLnByb21pc2VTZXJ2aWNlLFxuXHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uSGFuZGxlcixcblx0XHRcdHRoaXMuY29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsLFxuXHRcdFx0dGhpcy5pdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5rZXlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0aGlzLnF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5hcGlGb3JtYXR0ZXIsXG5cdFx0XHR0aGlzLmxpbmtUcmVlU2VydmljZSxcblx0XHRcdHRoaXMsXG5cdFx0XHRpZCxcblx0XHQpO1xuXG5cdFx0dGhpcy5jaGlsZHJlbi5wdXNoKHRyYW5zYWN0aW9uKTtcblxuXHRcdHJldHVybiB0cmFuc2FjdGlvbjtcblx0fVxuXG5cdHB1YmxpYyBvbkNoaWxkRGVzdHJveSAoY2FjaGU6IFRyYW5zYWN0aW9uQ2FjaGUpOiB2b2lkIHtcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZihjYWNoZSk7XG5cblx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHR0aGlzLmNoaWxkcmVuLnNwbGljZShcblx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdDEsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyB0aGlzIHRyYW5zYWN0aW9uIGFuZCBhbGwgcGFyZW50c1xuXHQgKi9cblx0cHVibGljIGdldFRyYW5zYWN0aW9uQ2hhaW4gKCk6IEFic3RyYWN0Q2FjaGVbXSB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25zOiBBYnN0cmFjdENhY2hlW10gPSBbXTtcblx0XHRsZXQgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUgPSB0aGlzO1xuXG5cdFx0ZG8ge1xuXHRcdFx0dHJhbnNhY3Rpb25zLnB1c2godHJhbnNhY3Rpb24pO1xuXG5cdFx0XHQvLyBAdHMtaWdub3JlIHdoaWxlIGxvb3Agd2lsbCBicmVha1xuXHRcdFx0dHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbi5wYXJlbnQ7XG5cdFx0fSB3aGlsZSAodHJhbnNhY3Rpb24gIT09IG51bGwpO1xuXG5cdFx0cmV0dXJuIHRyYW5zYWN0aW9ucztcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyB0aGUge0BsaW5rIFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIuZW50cmllcyBDb2xsZWN0aW9uQ2FjaGV9IG9mIHRoZSB0cmFuc2FjdGlvblxuXHQgKi9cblx0cHVibGljIGdldEN1cnJlbnRDb2xsZWN0aW9uRW50cnlDYWNoZSAoKTogQ29sbGVjdGlvbkNhY2hlIHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5lbnRyaWVzIEl0ZW1DYWNoZX0gb2YgdGhlIHRyYW5zYWN0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VycmVudEl0ZW1FbnRyeUNhY2hlICgpOiBJdGVtQ2FjaGUge1xuXHRcdHJldHVybiB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXM7XG5cdH1cblxuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0U2VydmVyQ2FjaGUgKCk6IFNlcnZlckNhY2hlO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRMb2NhbEl0ZW1FbnRyeSAoaXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSk6IEl0ZW1FbnRyeSB8IHVuZGVmaW5lZDtcblxuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUVudHJ5WydpdGVtSWQnXSxcblx0KTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRMb2NhbENvbGxlY3Rpb25FbnRyeSAoY29sbGVjdGlvbkVudHJ5SWQ6IENvbGxlY3Rpb25FbnRyeVsnaWQnXSk6IENvbGxlY3Rpb25FbnRyeSB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEFwcGxpZXMgY2hhbmdlcyBmcm9tIGEgY2hpbGQgdHJhbnNhY3Rpb24gdG8gYSBwYXJlbnRcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBhcHBseUNoYW5nZXNGcm9tQ2hpbGQgKFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGJyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0b25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1JZENvbnZlcnNpb25NYXA+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2FsbGVkIGJ5IGEgcGFyZW50IHRyYW5zYWN0aW9uLCBwcm9wYWdhdGVzIGNoYW5nZXMgZG93bndhcmRzIHRvIGFsbCBjaGlsZCBjYWNoZXNcblx0ICpcblx0ICogQHJlbWFya3Ncblx0ICogLSBTaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSBjb3JlXG5cdCAqXG5cdCAqIHRvZG9bY2FjaGVdIFNob3VsZCB3ZSByZWZldGNoIGRlcml2ZWQgdmFsdWVzIGp1c3QgbGlrZSBpbiBhcHBseUNoYW5nZXNEZWx0YSA/XG5cdCAqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgKFxuXHRcdGludGVybmFsQ2hhbmdlc0RlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZTogYm9vbGVhbixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuLFxuXHQpOiB2b2lkO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRQYXJlbnQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGZyb21Jbml0aWFsPzogYm9vbGVhbixcblx0XHRwcm92aWRlZEZpZWxkcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEVudHJ5UGFyZW50TnVsbDtcblxuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseSAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0XHRjb3B5RmllbGRzPzogYm9vbGVhbixcblx0KTogRmllbGRNYXA7XG5cblx0cHVibGljIGFic3RyYWN0IGdldExvY2FsSXRlbUVudHJ5Q2hhbmdlc1R1cGxlIChpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddKTtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEJlY2F1c2UgdGhlIGBpdGVtQ2hhbmdlc2Agb2JqZWN0IGRpZmZlcnMgYmV0d2VlbiB0aGUge0BsaW5rIFNlcnZlckl0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzIFNlcnZlckl0ZW1IYW5kbGVyfSBhbmQgdGhlIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXJ9IHdlIG5lZWQgYSBmdW5jdGlvbiB0byBub3JtYWxpc2UgdGhvc2UgdmFsdWVzXG5cdCAqXG5cdCAqIEByZW1hcmtzXG5cdCAqIC0gU2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUgY29yZVxuXHQgKlxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRDaGFuZ2VzRnJvbUl0ZW1DaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiAoXG5cdFx0Y2hhbmdlc09iamVjdDogU2VydmVySXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGU+IHwgVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT47XG5cblx0cHVibGljIGFic3RyYWN0IGFwcGx5Q2hhbmdlc0RlbHRhIChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+O1xuXG5cdHByb3RlY3RlZCBnZXRQYXJlbnRGcm9tRmllbGRzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEVudHJ5UGFyZW50TnVsbCB7XG5cdFx0aWYgKGZpZWxkcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAoaXRlbUVudHJ5LmNvbHVtbnMubGluayAhPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aXRlbVR5cGU6IGl0ZW1FbnRyeS5jb2x1bW5zLmxpbmsuYXBpQ29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQ6IGZpZWxkc1tpdGVtRW50cnkuY29sdW1ucy5saW5rLmlkXSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW5zID0gaXRlbUVudHJ5LmNvbHVtbnMucmVzcG9uc2VbaXRlbUVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdGlmIChcblx0XHRcdHJlc3BvbnNlQ29sdW1ucy5pdGVtdHlwZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHQmJiByZXNwb25zZUNvbHVtbnMuaXRlbSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRpdGVtVHlwZTogZmllbGRzLml0ZW10eXBlLFxuXHRcdFx0XHRpdGVtSWQ6IGZpZWxkcy5pdGVtLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2FsbGVkIGJ5IGFwcGx5Q2hhbmdlc0RlbHRhIGZyb20gU2VydmVyQ2FjaGUgYW5kIFRyYW5zYWN0aW9uQ2FjaGUuIEFwcGxpZXMgY3JlYXRlcywgdXBkYXRlcyBhbmQgbW92ZXMsIGRvZXNuJ3QgYXBwbHkgZGVsZXRlc1xuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHJvdGVjdGVkIF9hcHBseUNoYW5nZXNEZWx0YSAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdCk6IHtcblx0XHRyZXN1bHQ6IENoYW5nZXNEZWx0YVJlc3VsdCxcblx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEsXG5cdFx0cm9sbGJhY2tGdW5jdGlvbnM6IEFycmF5PChjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSkgPT4gdm9pZD4sXG5cdH0ge1xuXHRcdC8vIFdlIGhhdmUgdG8gY29udmVydCB0aGUgQ2hhbmdlc0RlbHRhIHRvIGFuIEludGVybmFsQ2hhbmdlc0RlbHRhIGluIG9yZGVyIHRvIHBhc3MgaXQgdG8gdGhlIENvbGxlY3Rpb25NYXRjaGVyIGFuZCBjaGlsZCBUcmFuc2FjdGlvbnNcblx0XHRjb25zdCBpbnRlcm5hbENoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3RJbnRlcm5hbERlbHRhKCk7XG5cblx0XHRjb25zdCBjcmVhdGVkRW50cmllczogQ2hhbmdlc0RlbHRhUmVzdWx0WydjcmVhdGVkJ10gPSBbXTtcblx0XHRjb25zdCByb2xsYmFja0Z1bmN0aW9uczogQXJyYXk8KGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhKSA9PiB2b2lkPiA9IFtdO1xuXG5cdFx0Ly8gV2Ugb25seSBjcmVhdGUgbmV3IGVudHJpZXMgb24gdGhlIGRpcmVjdCB0cmFuc2FjdGlvbiwgbm90IG9uIHRoZSBjaGlsZHJlblxuXHRcdGZvciAoY29uc3QgdHVwbGUgb2YgY2hhbmdlc0RlbHRhLmNyZWF0ZWQpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuaXRlbUhhbmRsZXIuY3JlYXRlSXRlbUVudHJ5KHR1cGxlKTtcblxuXHRcdFx0Y3JlYXRlZEVudHJpZXMucHVzaChpdGVtRW50cnkpO1xuXG5cdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHR0aGlzLmdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXModGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdKSxcblx0XHRcdCk7XG5cblx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLnB1c2goXG5cdFx0XHRcdHJvbGxiYWNrRGVsdGEgPT4gcm9sbGJhY2tEZWx0YS5zZXRJdGVtRGVsZXRlZChpdGVtRW50cnkpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGNoYW5nZXNEZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGNoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0Y29uc3QgcHJldmlvdXMgPSB0aGlzLml0ZW1IYW5kbGVyLnByb2Nlc3NJdGVtRW50cnlDaGFuZ2VzKFxuXHRcdFx0XHR0dXBsZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdCk7XG5cblx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0dHVwbGUuY2hhbmdlcy5maWVsZHMsXG5cdFx0XHRcdHR1cGxlLmNoYW5nZXMuZXhwYW5kZWRDb2x1bW5zLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKHByZXZpb3VzICE9PSBudWxsKSB7XG5cdFx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0cm9sbGJhY2tEZWx0YSA9PiByb2xsYmFja0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdFx0XHRwcmV2aW91cyxcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodHVwbGUuY2hhbmdlcy5wYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbU1vdmVkKFxuXHRcdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHRcdHR1cGxlLmNoYW5nZXMucGFyZW50LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXaGVuIHJvbGxpbmcgYmFjayBhIGRlbHRhIHdlIGNhbGwgYHNldEl0ZW1VcGRhdGVkYCB0byByZXN0b3JlIGRlbGV0aW9uc1xuXHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIgaW5zdGFuY2VvZiBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyKSB7XG5cdFx0XHRcdGNvbnN0IGRlbGV0ZWRFbnRyaWVzID0gdGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbdHVwbGUuZW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0XHRcdGlmIChkZWxldGVkRW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGRlbGV0ZWRFbnRyaWVzLmluZGV4T2YodHVwbGUuZW50cnkpO1xuXG5cdFx0XHRcdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0XHRcdFx0ZGVsZXRlZEVudHJpZXMuc3BsaWNlKFxuXHRcdFx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdFx0XHQxLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVzdWx0OiB7XG5cdFx0XHRcdGNyZWF0ZWQ6IGNyZWF0ZWRFbnRyaWVzLFxuXHRcdFx0XHRyb2xsYmFjazogKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHJvbGxiYWNrRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGZuIG9mIHJvbGxiYWNrRnVuY3Rpb25zKSB7XG5cdFx0XHRcdFx0XHRmbihyb2xsYmFja0RlbHRhKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hcHBseUNoYW5nZXNEZWx0YShyb2xsYmFja0RlbHRhKTtcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEVuc3VyZXMgdGhhdCBmb3IgYWxsIHVwZGF0ZWQgaXRlbXMgaW4gdGhlIGRlbHRhIHRoZSByZXF1aXJlZCBkZXJpdmVkIHZhbHVlcyBhcmUgcHJlc2VudFxuXHQgKi9cblx0cHJvdGVjdGVkIGZldGNoVXBkYXRlZERlcml2ZWRWYWx1ZXNGcm9tRGVsdGEgKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeVtdW10+IHtcblx0XHRjb25zdCBkZXJpdmVkUHJvbWlzZXM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5W10+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBjaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cdFx0XHRjb25zdCBjaGFuZ2VkUm9vdENvbHVtbnM6IENvbHVtbkluZm9bXSA9IFtdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiB0dXBsZS5lbnRyeS5jb2x1bW5zLnJvb3QpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHR1cGxlLmNoYW5nZXMuZmllbGRzLmhhc093blByb3BlcnR5KGNvbHVtbi5pZClcblx0XHRcdFx0XHQmJiB0dXBsZS5jaGFuZ2VzLmZpZWxkc1tjb2x1bW4uaWRdICE9PSB0aGlzLmdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXModGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1t0dXBsZS5lbnRyeS5pZF0pW2NvbHVtbi5pZF1cblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y2hhbmdlZFJvb3RDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2hhbmdlZFJvb3RDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0ZGVyaXZlZFByb21pc2VzLnB1c2goXG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIucmVzb2x2ZURlcml2ZWRWYWx1ZXMoXG5cdFx0XHRcdFx0W3R1cGxlLmVudHJ5XSxcblx0XHRcdFx0XHRjaGFuZ2VkUm9vdENvbHVtbnMsXG5cdFx0XHRcdFx0Ly8gV2UgcGFzcyB0aGUgZGVsdGEgc28gdGhlIG5ldyByb290Q29sdW1uJ3MgdmFsdWVzIGFyZSByZWFkXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGUgbmV3IGRlcml2ZWQgdmFsdWVzIGV4aXN0IGJlZm9yZSBjYWxsaW5nIG9uQ2hhbmdlLCBzaW5jZSB0aGUgb25DaGFuZ2UgZnVuY3Rpb24gbWlnaHQgdXNlIHRoZSBuZXcgdmFsdWVzXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKGRlcml2ZWRQcm9taXNlcyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFic3RyYWN0Q2FjaGUsIEZpZWxkTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uLyc7XG5pbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzLyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJbnRlcm5hbENoYW5nZXNEZWx0YSB9IGZyb20gJy4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uTWF0Y2hlck1hdGNoZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBJdGVtVHlwZT4gPSB7XG5cdFtpdGVtSWQ6IG51bWJlcl06IHtcblx0XHRpdGVtOiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRpc01hdGNoOiBib29sZWFuIHwgJ21heWJlJ1xuXHR9XG59O1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbk1hdGNoZXJCYXNlIHtcblxuXHRwcm90ZWN0ZWQgbWFwOiB7XG5cdFx0W2NvbGxlY3Rpb25FbnRyeUlkOiBudW1iZXJdOiB7XG5cdFx0XHRjb2xsZWN0aW9uOiBDb2xsZWN0aW9uRW50cnlcblx0XHRcdG1hdGNoZXM6IENvbGxlY3Rpb25NYXRjaGVyTWF0Y2hlc1xuXHRcdH1cblx0fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdFx0cHJpdmF0ZSBnZXRDb2xsZWN0aW9uRW50cmllczogKGl0ZW1UeXBlOiBJdGVtVHlwZSkgPT4gQ29sbGVjdGlvbkVudHJ5W10sXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGV4cGFuZDxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbUVudHJ5VHlwZVsnaXRlbVR5cGUnXT4sXG5cdCk6IHRoaXMge1xuXHRcdGNvbnN0IHF1ZXJ5TWF0Y2hlciA9IHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRmaWVsZHMsXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChpdGVtRW50cnkpLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fZXhwYW5kKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0+IHF1ZXJ5TWF0Y2hlci5tYXRjaFF1ZXJ5KGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5vYmplY3QpLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgcHJvY2Vzc0RlbHRhIChpbnRlcm5hbENoYW5nZXNEZWx0YTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEpOiB0aGlzIHtcblx0XHQvLyB3ZSBkbyBkZWxldGluZyBmaXJzdCBiZWNhdXNlIGl0J3MgdGhlIGxlYXN0IGV4cGVuc2l2ZSBvcGVyYXRpb25cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblx0XHRcdGNvbnN0IGVudHJpZXNUb0JlRGVsZXRlZCA9IGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBlbnRyaWVzVG9CZURlbGV0ZWQpIHtcblx0XHRcdFx0dGhpcy5fZXhwYW5kKFxuXHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHQvLyBDb2xsZWN0aW9ucyBjYW4gbmV2ZXIgY29udGFpbiBkZWxldGVkIGl0ZW1zIHRvIHRoZXkncmUgYWx3YXlzIG5vdCBmaXR0aW5nXG5cdFx0XHRcdFx0KCkgPT4gZmFsc2UsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5jcmVhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGludGVybmFsQ2hhbmdlc0RlbHRhLmNyZWF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHRjb25zdCBxdWVyeU1hdGNoZXIgPSB0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHR0dXBsZS5lbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0dHVwbGUuZmllbGRzLFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudCh0dXBsZS5lbnRyeSksXG5cdFx0XHQpO1xuXG5cdFx0XHR0aGlzLl9leHBhbmQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gcXVlcnlNYXRjaGVyLm1hdGNoUXVlcnkoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWQpIHtcblx0XHRcdGNvbnN0IG1vdmVkID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHR0aGlzLl9leHBhbmQoXG5cdFx0XHRcdG1vdmVkLmVudHJ5LFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gY29sbGVjdGlvbkVudHJ5Lm1hdGNoUGFyZW50KFxuXHRcdFx0XHRcdG1vdmVkLnRvLml0ZW1UeXBlLFxuXHRcdFx0XHRcdG1vdmVkLnRvLml0ZW1JZCxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHRjb25zdCBjaGFuZ2VzID0ge307XG5cdFx0XHRjb25zdCBjYWNoZWRDaGFuZ2VzID0gdGhpcy50cmFuc2FjdGlvbi5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0XHROdW1iZXIoaXRlbUVudHJ5SWQpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IGNvcHlDaGFuZ2UgPSAoXG5cdFx0XHRcdGZpZWxkczogRmllbGRNYXAsXG5cdFx0XHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdFx0XHQpID0+IHtcblx0XHRcdFx0Y29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG5cdFx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmIChkZXNjICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzLFxuXHRcdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0XHRkZXNjLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y2hhbmdlc1tjb2x1bW5JZF0gPSBmaWVsZHNbY29sdW1uSWRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIGNhY2hlZENoYW5nZXMpIHtcblx0XHRcdFx0Y29weUNoYW5nZShcblx0XHRcdFx0XHRjYWNoZWRDaGFuZ2VzLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHR1cGxlLmNoYW5nZXMuZmllbGRzKSB7XG5cdFx0XHRcdGNvcHlDaGFuZ2UoXG5cdFx0XHRcdFx0dHVwbGUuY2hhbmdlcy5maWVsZHMsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHF1ZXJ5TWF0Y2hlciA9IHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdHR1cGxlLmVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRjaGFuZ2VzLFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudCh0dXBsZS5lbnRyeSksXG5cdFx0XHQpO1xuXG5cdFx0XHR0aGlzLl9leHBhbmQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gcXVlcnlNYXRjaGVyLm1hdGNoUXVlcnkoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHJvdGVjdGVkIGhhc0ZpdHRpbmdJdGVtcyAobWF0Y2hlczogQ29sbGVjdGlvbk1hdGNoZXJNYXRjaGVzKSB7XG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gbWF0Y2hlcykge1xuXHRcdFx0aWYgKG1hdGNoZXNbaXRlbUlkXS5pc01hdGNoID09PSB0cnVlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHByb3RlY3RlZCBfZXhwYW5kIChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHRtYXRjaEZ1bmN0aW9uOiAoY29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnkpID0+IGJvb2xlYW4gfCAnbWF5YmUnLFxuXHQpOiB0aGlzIHtcblx0XHRjb25zdCBtYXAgPSB0aGlzLm1hcDtcblx0XHRjb25zdCBpdGVtSWQgPSBpdGVtRW50cnkuaXRlbUlkO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJpZXMgPSB0aGlzLmdldENvbGxlY3Rpb25FbnRyaWVzKGl0ZW1FbnRyeS5pdGVtVHlwZSk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25FbnRyeSBvZiBjb2xsZWN0aW9uRW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5SWQgPSBjb2xsZWN0aW9uRW50cnkuaWQ7XG5cdFx0XHRsZXQgbWF0Y2hlcztcblxuXHRcdFx0aWYgKG1hcFtjb2xsZWN0aW9uRW50cnlJZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRtYXBbY29sbGVjdGlvbkVudHJ5SWRdID0ge1xuXHRcdFx0XHRcdGNvbGxlY3Rpb246IGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0XHRtYXRjaGVzOiB7fSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0bWF0Y2hlcyA9IG1hcFtjb2xsZWN0aW9uRW50cnlJZF0ubWF0Y2hlcztcblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV0gV2UgY291bGQgb3B0aW1pc2Ugc29tZSB0aGluZ3MgaGVyZSBieSBjaGVja2luZyBpZiB0cmFuc2FjdGlvbi5jb2xsZWN0aW9uQ2hhbmdlcyBhbHJlYWR5IGNvbnRhaW5zIGl0ZW1FbnRyeSwgaWYgdGhhdCdzIHRoZSBjYXNlIHdlIGRvbid0IGhhdmUgdG8gbWF0Y2ggYXQgYWxsXG5cdFx0XHQvLyBDdXJyZW50bHkgYWxyZWFkeSBleGlzdGluZyBlbnRyaWVzIGFyZSBmaWx0ZXJlZCBpbiBhZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMgKGNoYW5nZXMuaW5kZXhPZihpdGVtRW50cnkpICE9PSAtMSlcblx0XHRcdGlmIChtYXRjaGVzW2l0ZW1JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bWF0Y2hlc1tpdGVtSWRdID0ge1xuXHRcdFx0XHRpdGVtOiBpdGVtRW50cnksXG5cdFx0XHRcdGlzTWF0Y2g6IG1hdGNoRnVuY3Rpb24oY29sbGVjdGlvbkVudHJ5KSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vY2FjaGUvQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlckJhc2UgfSBmcm9tICcuL0NvbGxlY3Rpb25NYXRjaGVyQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTWF0Y2hlclxuXHRleHRlbmRzIENvbGxlY3Rpb25NYXRjaGVyQmFzZSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0dHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdFx0Z2V0Q29sbGVjdGlvbkVudHJpZXM6IChpdGVtVHlwZTogSXRlbVR5cGUpID0+IENvbGxlY3Rpb25FbnRyeVtdLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdHF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdGdldENvbGxlY3Rpb25FbnRyaWVzLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbnNXaXRoRml0dGluZ0l0ZW1zICgpOiBDb2xsZWN0aW9uRW50cnlbXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBDb2xsZWN0aW9uRW50cnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uSWQgaW4gdGhpcy5tYXApIHtcblx0XHRcdGNvbnN0IG1hcEVudHJ5ID0gdGhpcy5tYXBbY29sbGVjdGlvbklkXTtcblxuXHRcdFx0aWYgKHRoaXMuaGFzRml0dGluZ0l0ZW1zKG1hcEVudHJ5Lm1hdGNoZXMpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKG1hcEVudHJ5LmNvbGxlY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbk1hdGNoZXIgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlck1hdGNoZXMgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlckJhc2UnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vQWJzdHJhY3RDYWNoZSc7XG5cbmV4cG9ydCB0eXBlIEdyb3VwZWRDb2xsZWN0aW9uTWF0Y2hlclJlc3VsdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdGZpdHRpbmc6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0bm90Rml0dGluZzogSXRlbUlkW10sXG5cdG1heWJlOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj5cbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBQcm9jZXNzZXMgYSBkZWx0YSBhbmQgYWRkcyB0aGUgaXRlbXMgdG8gdGhlIHJpZ2h0IGNvbGxlY3Rpb25zLCB0aGlzIGlzIHRoZSBPTkxZIGNsYXNzIHRoYXQgc2hvdWxkIGNoYW5nZSBjb2xsZWN0aW9uIGl0ZW1zXG4gKlxuICogLS0tLS0tXG4gKlxuICogQHJlbWFya1xuICogVGhlIENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IgaXMgYWxsb3dlZCB0byBkaXJlY3RseSBhY2Nlc3MvbW9kaWZ5IHRoZSB0cmFuc2FjdGlvbiBiZWNhdXNlIGl0J3MgT05MWSBjYWxsZWQgZnJvbSBhcHBseUNoYW5nZXNGcm9tUGFyZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yXG5cdGV4dGVuZHMgQ29sbGVjdGlvbk1hdGNoZXIge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHRcdGdldENvbGxlY3Rpb25FbnRyaWVzOiAoaXRlbVR5cGU6IEl0ZW1UeXBlKSA9PiBDb2xsZWN0aW9uRW50cnlbXSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHRnZXRDb2xsZWN0aW9uRW50cmllcyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zIChcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvbklkIGluIHRoaXMubWFwKSB7XG5cdFx0XHRjb25zdCBtYXBFbnRyeSA9IHRoaXMubWFwW2NvbGxlY3Rpb25JZF07XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBtYXBFbnRyeS5jb2xsZWN0aW9uO1xuXHRcdFx0Y29uc3QgZ3JvdXBlZEl0ZW1FbnRyaWVzID0gdGhpcy5ncm91cEl0ZW1FbnRyaWVzKG1hcEVudHJ5Lm1hdGNoZXMpO1xuXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLnJlbW92ZUl0ZW1FbnRyaWVzRnJvbUNvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdGdyb3VwZWRJdGVtRW50cmllcy5ub3RGaXR0aW5nLFxuXHRcdFx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlLFxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5hZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0Z3JvdXBlZEl0ZW1FbnRyaWVzLmZpdHRpbmcsXG5cdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoZ3JvdXBlZEl0ZW1FbnRyaWVzLm1heWJlLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0XHRcdC5xdWVyeShcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5vYmplY3QsXG5cdFx0XHRcdFx0XHR7W2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV06IFsnaWQnXX0sXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyBXZSBub3cgZXhhY3RseSBrbm93IHdoaWNoIG9mIHRoZSBtYXliZSBpdGVtcyBmaXRcblxuXHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmFkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0Z3JvdXBlZEl0ZW1FbnRyaWVzLm1heWJlLmZpbHRlcihcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSA9PiByZXNwb25zZS5saW5rc1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdLmluZGV4T2YoaXRlbUVudHJ5Lml0ZW1JZCkgPiAtMSxcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBncm91cEl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bWF0Y2hlczogQ29sbGVjdGlvbk1hdGNoZXJNYXRjaGVzPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEdyb3VwZWRDb2xsZWN0aW9uTWF0Y2hlclJlc3VsdDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBmaXR0aW5nOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0XHRjb25zdCBub3RGaXR0aW5nOiBJdGVtSWRbXSA9IFtdO1xuXHRcdGNvbnN0IG1heWJlOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIG1hdGNoZXMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gbWF0Y2hlc1tpdGVtSWRdO1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gbWF0Y2guaXRlbTtcblx0XHRcdGNvbnN0IGlzTWF0Y2ggPSBtYXRjaC5pc01hdGNoO1xuXG5cdFx0XHRpZiAoaXNNYXRjaCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRmaXR0aW5nLnB1c2goaXRlbUVudHJ5KTtcblx0XHRcdH0gZWxzZSBpZiAoaXNNYXRjaCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0bm90Rml0dGluZy5wdXNoKGl0ZW1FbnRyeS5pdGVtSWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWF5YmUucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRmaXR0aW5nOiBmaXR0aW5nLFxuXHRcdFx0bm90Rml0dGluZzogbm90Rml0dGluZyxcblx0XHRcdG1heWJlOiBtYXliZSxcblx0XHR9O1xuXHR9XG5cbn1cbiIsImltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1JZENvbnZlcnNpb25NYXAsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uID0gJ2Fsd2F5cycgfCAnb25DbG9zZScgfCAnc2tpcE9uQ2xvc2UnO1xuXG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlID0ge1xuXHRvbkJlZm9yZVNhdmU6ICh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSkgPT4gYW55LFxuXHRvblNhdmVTdWNjZXNzOiAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KSA9PiBhbnlcbn07XG5cbnR5cGUgQ2FsbGJhY2tNYXA8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+ID0ge1xuXHRba2V5OiBzdHJpbmddOiB7XG5cdFx0Y2FsbGJhY2s6IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGVbVF0sXG5cdFx0Y29uZGl0aW9uOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb25cblx0fVxufTtcblxuY29uc3QgREVGQVVMVF9QUklPUklUWSA9IDEwMDtcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uRXZlbnRIYW5kbGVyIHtcblx0cHJpdmF0ZSBjYWxsYmFja3M6IHtcblx0XHRbVCBpbiBrZXlvZiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlXTogQXJyYXk8W1xuXHRcdFx0bnVtYmVyLFxuXHRcdFx0Q2FsbGJhY2tNYXA8VD5cblx0XHRdPlxuXHR9ID0ge1xuXHRcdG9uQmVmb3JlU2F2ZTogW10sXG5cdFx0b25TYXZlU3VjY2VzczogW10sXG5cdH07XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlckNhbGxiYWNrPFQgZXh0ZW5kcyBrZXlvZiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlPiAoXG5cdFx0dHlwZTogVCxcblx0XHRrZXk6IHN0cmluZyxcblx0XHRjYWxsYmFjazogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZVtUXSxcblx0XHRjb25kaXRpb246IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja0NvbmRpdGlvbiA9ICdhbHdheXMnLFxuXHRcdHByaW9yaXR5OiBudW1iZXIgPSBERUZBVUxUX1BSSU9SSVRZLFxuXHQpOiAoKSA9PiB2b2lkIHtcblx0XHR0aGlzLmdldFByaW9yaXR5TGV2ZWwoXG5cdFx0XHR0eXBlLFxuXHRcdFx0cHJpb3JpdHksXG5cdFx0KVtrZXldID0ge1xuXHRcdFx0Y2FsbGJhY2ssXG5cdFx0XHRjb25kaXRpb24sXG5cdFx0fTtcblxuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRkZWxldGUgdGhpcy5nZXRQcmlvcml0eUxldmVsKFxuXHRcdFx0XHR0eXBlLFxuXHRcdFx0XHRwcmlvcml0eSxcblx0XHRcdClba2V5XTtcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGV4ZWN1dGVDYWxsYmFja3M8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+IChcblx0XHR0eXBlOiBULFxuXHRcdGV4ZWN1dGU6IChjYWxsYmFjazogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZVtUXSkgPT4gYW55LFxuXHRcdGNsb3NlVGFiOiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPGFueT4ge1xuXHRcdGNvbnN0IHByaW9yaXR5TGV2ZWxzID0gdGhpcy5jYWxsYmFja3NbdHlwZV07XG5cdFx0Y29uc3QgY29uZGl0aW9uOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24gPSBjbG9zZVRhYiA/ICdvbkNsb3NlJyA6ICdza2lwT25DbG9zZSc7XG5cblx0XHRsZXQgY2hhaW4gPSB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblxuXHRcdGZvciAoY29uc3QgcHJpb3JpdHlMZXZlbCBvZiBwcmlvcml0eUxldmVscykge1xuXHRcdFx0Y2hhaW4gPSBjaGFpbi50aGVuKFxuXHRcdFx0XHR0aGlzLmV4ZWN1dGVDYWxsYmFja3NQcmlvcml0eUxldmVsKFxuXHRcdFx0XHRcdHByaW9yaXR5TGV2ZWxbMV0gYXMgQ2FsbGJhY2tNYXA8VD4sXG5cdFx0XHRcdFx0Y29uZGl0aW9uLFxuXHRcdFx0XHRcdGV4ZWN1dGUsXG5cdFx0XHRcdCksXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNoYWluO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRQcmlvcml0eUxldmVsPFQgZXh0ZW5kcyBrZXlvZiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlPiAoXG5cdFx0dHlwZTogVCxcblx0XHRkZXN0aW5hdGlvblByaW9yaXR5OiBudW1iZXIsXG5cdCk6IENhbGxiYWNrTWFwPFQ+IHtcblx0XHRjb25zdCBwcmlvcml0eUxldmVscyA9IHRoaXMuY2FsbGJhY2tzW3R5cGVdO1xuXHRcdGxldCBuZXdQcmlvcml0eUxldmVsO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcmlvcml0eUxldmVscy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgcHJpb3JpdHlMZXZlbCA9IHByaW9yaXR5TGV2ZWxzW2ldO1xuXG5cdFx0XHRpZiAocHJpb3JpdHlMZXZlbFswXSA8IGRlc3RpbmF0aW9uUHJpb3JpdHkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwcmlvcml0eUxldmVsWzBdID09PSBkZXN0aW5hdGlvblByaW9yaXR5KSB7XG5cdFx0XHRcdHJldHVybiBwcmlvcml0eUxldmVsWzFdIGFzIENhbGxiYWNrTWFwPFQ+O1xuXHRcdFx0fVxuXG5cdFx0XHRuZXdQcmlvcml0eUxldmVsID0ge307XG5cblx0XHRcdHByaW9yaXR5TGV2ZWxzLnNwbGljZShcblx0XHRcdFx0aSxcblx0XHRcdFx0MCxcblx0XHRcdFx0W1xuXHRcdFx0XHRcdGRlc3RpbmF0aW9uUHJpb3JpdHksXG5cdFx0XHRcdFx0bmV3UHJpb3JpdHlMZXZlbCxcblx0XHRcdFx0XSxcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybiBuZXdQcmlvcml0eUxldmVsO1xuXHRcdH1cblxuXHRcdG5ld1ByaW9yaXR5TGV2ZWwgPSB7fTtcblxuXHRcdHByaW9yaXR5TGV2ZWxzLnB1c2goW1xuXHRcdFx0ZGVzdGluYXRpb25Qcmlvcml0eSxcblx0XHRcdG5ld1ByaW9yaXR5TGV2ZWwsXG5cdFx0XSk7XG5cblx0XHRyZXR1cm4gbmV3UHJpb3JpdHlMZXZlbDtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZUNhbGxiYWNrc1ByaW9yaXR5TGV2ZWw8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+IChcblx0XHRjYWxsYmFja3M6IENhbGxiYWNrTWFwPFQ+LFxuXHRcdGNvbmRpdGlvbjogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uLFxuXHRcdGV4ZWN1dGU6IChjYWxsYmFjazogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZVtUXSkgPT4gYW55LFxuXHQpOiAoKSA9PiBQcm9taXNlSW50ZXJmYWNlPGFueT4ge1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRjb25zdCByZXN1bHQ6IHtba2V5OiBzdHJpbmddOiBhbnl9ID0ge307XG5cblx0XHRcdGZvciAoY29uc3Qga2V5IGluIGNhbGxiYWNrcykge1xuXHRcdFx0XHRjb25zdCBjYWxsYmFja0VudHJ5ID0gY2FsbGJhY2tzW2tleV07XG5cblx0XHRcdFx0aWYgKGNhbGxiYWNrRW50cnkuY29uZGl0aW9uICE9PSBjb25kaXRpb24gJiYgY2FsbGJhY2tFbnRyeS5jb25kaXRpb24gIT09ICdhbHdheXMnKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHJlc3VsdFtrZXldID0gZXhlY3V0ZShjYWxsYmFja0VudHJ5LmNhbGxiYWNrKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHR0aGlzLmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChyZXN1bHQpO1xuXHRcdH07XG5cdH1cbn1cbiIsImltcG9ydCB7IG5vb3AsIFJtQ29yZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0Q29sbGVjdGlvbkVudHJ5RmFjdG9yeSxcblx0Q29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRDb2x1bW5TZXRGYWN0b3J5LFxuXHRDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdEl0ZW1DYWNoZUZhY3RvcnksXG5cdEl0ZW1FbnRyeUZhY3RvcnksXG5cdEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuaW1wb3J0IHtcblx0QXV0aEludGVyZmFjZSxcblx0RXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRQcm9taXNlTGlicmFyeUludGVyZmFjZSxcbn0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL0xpbmtUcmVlU2VydmljZUludGVyZmFjZSc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uRWRpdFJlc291cmNlLFxuXHRDb2xsZWN0aW9uRW50cnksXG5cdENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdENvbGxlY3Rpb25SZXNvdXJjZSxcblx0Q29sbGVjdGlvblJlc291cmNlT3B0aW9ucyxcblx0Q29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZSxcblx0Q29sbGVjdGlvblZpZXdSZXNvdXJjZSxcblx0RWRpdFJlc291cmNlLFxuXHRJdGVtRW50cnksXG5cdEl0ZW1FbnRyeU9wdGlvbnMsXG5cdEl0ZW1SZXNvdXJjZSxcblx0TG9jYWxWaWV3UmVzb3VyY2UsXG5cdFJlbW90ZVZpZXdSZXNvdXJjZSxcbn0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaUxpbmtUcmVlVHlwZSxcblx0QXBpUXVlcnksXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRDb2xsZWN0aW9uRGVmaW5pdGlvbixcblx0Q29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXAsXG5cdENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcCxcblx0Q29udmVyc2lvbk1hcCxcblx0Q3JlYXRlUmVxdWVzdFBhcmFtZXRlck1hcCxcblx0RW50cnlQYXJlbnROdWxsLFxuXHRGaWVsZE1hcCxcblx0SXRlbUlkLFxuXHRJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0SXRlbVJlc291cmNlc0l0ZW1UeXBlTWFwLFxuXHRJdGVtVHlwZSxcblx0SXRlbVR5cGVNYXAsXG5cdExpbmtDb2xsZWN0aW9uRGVmaW5pdGlvbixcblx0UHJvbWlzZUludGVyZmFjZSxcblx0U3RhdGVLZXlUeXBlLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhUmVzdWx0IH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vQ29sbGVjdGlvbkVudHJ5U2VydmljZSc7XG5pbXBvcnQgeyBDb2x1bW5IYW5kbGVyIH0gZnJvbSAnLi4vLi4vQ29sdW1uSGFuZGxlcic7XG5pbXBvcnQgeyBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vLi4vQ29sdW1uVXRpbCc7XG5pbXBvcnQge1xuXHRBcGlGb3JtYXR0ZXIsXG5cdEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRDb2x1bW5DYWNoZSxcblx0aGFzUHJvcGVydGllcyxcblx0TG9ja1NlcnZpY2UsXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCxcblx0T25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHRSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0VHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uLFxuXHRUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlLFxuXHRUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyLFxuXHRUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMsXG5cdFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIsXG59IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IEludGVybmFsQ2hhbmdlc0RlbHRhIH0gZnJvbSAnLi4vLi4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL0l0ZW1FbnRyeVNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uLy4uL0tleVNlcnZpY2UnO1xuaW1wb3J0IHsgUXVlcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vUXVlcnlTZXJ2aWNlJztcbmltcG9ydCB7IFRlbXBsYXRlQ2FjaGUgfSBmcm9tICcuLi8uLi9UZW1wbGF0ZUNhY2hlJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuLi9BYnN0cmFjdENhY2hlJztcbmltcG9ydCB7IENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi4vc2VydmVyL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkV2ZW50SGFuZGxlcic7XG5cbnR5cGUgRWRpdFJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0ge21haW46IEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+LCBsaW5rZWQ6IEl0ZW1SZXNvdXJjZXNJdGVtVHlwZU1hcH07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgVHJhbnNhY3Rpb25DYWNoZX0gaXMgcmVzcG9uc2libGUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgbmV3bHkgY3JlYXRlZCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfVxuICogYW5kIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJpZXN9LCBhbmQgdGhlIGNoYW5nZXMgb2YgZXhpc3RpbmcgSXRlbUVudHJpZXMgYW5kIENvbGxlY3Rpb25FbnRyaWVzLlxuICpcbiAqIFRoZSBUcmFuc2FjdGlvbkNhY2hlIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30sIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IGFuZCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbidzIGNoYW5nZXMgb24gdGhpcyBJdGVtRW50cnlcbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQ2FjaGVcblx0ZXh0ZW5kcyBBYnN0cmFjdENhY2hlIHtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFN0b3JlcyB0aGUgJ3Jvb3QnIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSwgdGhpcyB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gY2FuIGJlIHVzZWQgYXMgcmVxdWVzdCBwYXJlbnQgdG8gc3RvcmUgdGhlIHdob2xlIHRyYW5zYWN0aW9uIGF0IG9uY2Vcblx0ICovXG5cdHB1YmxpYyByb290SXRlbTogSXRlbUVudHJ5PGFueT4gfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBTdG9yZXMgYWRkaXRpb25hbCByZXF1ZXN0IHBhcmFtZXRlcnMgZm9yIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIHN0b3JlZCB0byB0aGUgc2VydmVyXG5cdCAqL1xuXHRwdWJsaWMgdGFiUmVxdWVzdFBhcmFtZXRlcnMgPSB7fTtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIElzIHRydWUgd2hpbGUgdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9uQ2FjaGV9IGlzIGFwcGx5aW5nIGNoYW5nZXMgdG8gdGhlIHBhcmVudCAoY2FuIGVpdGhlciBiZSB0aHJvdWdoIGEgbWVyZ2Ugb3IgYW4gQXBpIHNhdmUpXG5cdCAqL1xuXHRwdWJsaWMgaXNTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIElzIHRydWUgd2hlbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBoYXM6XG5cdCAqIC0gTmV3bHkgY3JlYXRlZCBpdGVtc1xuXHQgKiAtIFJlbW92ZWQgaXRlbXMgKGZyb20gY29sbGVjdGlvbnMpXG5cdCAqIC0gQ2hhbmdlcyBvbiBleGlzdGluZyBpdGVtc1xuXHQgKi9cblx0cHVibGljIGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFRoZSB0cmFuc2FjdGlvbidzIHBhcmVudFxuXHQgKi9cblx0cHVibGljIHJlYWRvbmx5IHBhcmVudDogQWJzdHJhY3RDYWNoZTtcblxuXHRwdWJsaWMgcmVhZG9ubHkgaXRlbUhhbmRsZXI6IFRyYW5zYWN0aW9uSXRlbUhhbmRsZXI7XG5cdHB1YmxpYyByZWFkb25seSBjb2xsZWN0aW9uSGFuZGxlcjogVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlcjtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGV2ZW50SGFuZGxlcjogVHJhbnNhY3Rpb25FdmVudEhhbmRsZXI7XG5cblx0cHJpdmF0ZSBjaGFuZ2VzSW50ZXJ2YWw6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRjb3JlOiBSbUNvcmUsXG5cdFx0Y29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlLFxuXHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0bG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlLFxuXHRcdG1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeTogQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHRlbXBsYXRlQ2FjaGU6IFRlbXBsYXRlQ2FjaGUsXG5cdFx0aXRlbUNhY2hlRmFjdG9yeTogSXRlbUNhY2hlRmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0Y29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdGl0ZW1FbnRyeUZhY3Rvcnk6IEl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0aXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdGNvbGxlY3Rpb25FbnRyeUZhY3Rvcnk6IENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0XHRhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRsaW5rVHJlZVNlcnZpY2U6IExpbmtUcmVlU2VydmljZUludGVyZmFjZSxcblx0XHRwYXJlbnQ6IEFic3RyYWN0Q2FjaGUsXG5cdFx0LyoqXG5cdFx0ICogQGRlc2NyaXB0aW9uXG5cdFx0ICogRm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuXHRcdCAqL1xuXHRcdHB1YmxpYyBpZD86IHN0cmluZyxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRjb3JlLFxuXHRcdFx0Y29sdW1uQ2FjaGUsXG5cdFx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0cXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdGF1dGhJbnRlcmZhY2UsXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0bG9ja1NlcnZpY2UsXG5cdFx0XHRtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRcdGl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0ZW1wbGF0ZUNhY2hlLFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRpdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5U2VydmljZSxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGxpbmtUcmVlU2VydmljZSxcblx0XHQpO1xuXG5cdFx0dGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cblx0XHR0aGlzLml0ZW1IYW5kbGVyID0gbmV3IFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIoXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0ZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdHRlbXBsYXRlQ2FjaGUsXG5cdFx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y29sdW1uSGFuZGxlcixcblx0XHRcdGNvbHVtblNldEZhY3RvcnksXG5cdFx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdHByb21pc2VTZXJ2aWNlLFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0XHRpdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHR0aGlzLFxuXHRcdCk7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb25IYW5kbGVyID0gbmV3IFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIoXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0Y29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0Y29sdW1uSGFuZGxlcixcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0dGhpcyxcblx0XHQpO1xuXG5cdFx0dGhpcy5ldmVudEhhbmRsZXIgPSBuZXcgVHJhbnNhY3Rpb25FdmVudEhhbmRsZXIoXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBkZXN0cm95ICgpOiB2b2lkIHtcblx0XHR0aGlzLnBhcmVudC5vbkNoaWxkRGVzdHJveSh0aGlzKTtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVDaGFuZ2VzRGVsdGEgKCk6IENoYW5nZXNEZWx0YSB7XG5cdFx0cmV0dXJuIHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogTWVyZ2VzIHRoZSBwYXNzZWQgY2hhbmdlcyBmcm9tIHRoZSBwYXJlbnQgVHJhbnNhY3Rpb24gaW50byB0aGlzIFRyYW5zYWN0aW9uJ3Mgb3duIGNoYW5nZXMgYW5kIHRoZW4gcHJvcGFnYXRlc1xuXHQgKiB0aGVtIHRvIGFsbCBjaGlsZCBUcmFuc2FjdGlvbnMsIHRoaXMgYXNzdW1lcyB0aGF0IGFuIGFjdGlvbiBpcyBhbHJlYWR5IGhhbmRsZWQgaW4gYSBwYXJlbnQsIHNvIGl0IGRvZXMndCBoYW5kbGUgY3JlYXRlZCBlbnRyaWVzXG5cdCAqIGFuZCByZW1vdmVzIGVudHJpZXMgdGhhdCB3ZXJlIGluIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtcyBkZWxldGVkSXRlbXN9IHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgZGVsZXRlZFxuXHQgKlxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS1cblx0ICpcblx0ICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50fSBhbmQge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGF9IGlzIHRoYXQgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudCBhc3N1bWVzXG5cdCAqIHRoZSBjaGFuZ2UgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQsIGFuZCBhcHBseUNoYW5nZXNEZWx0YSB3aWxsIHByb2Nlc3MgdGhlIGNoYW5nZXMgb25jZSB5b3Ugc2F2ZSB0aGUgdHJhbnNhY3Rpb25cblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqIFVzZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBhcHBseUNoYW5nZXNEZWx0YX0gaWYgeW91IHdhbnQgdG8gYXBwbHkgY2hhbmdlcyBmcm9tIG91dHNpZGUgdGhlIGNvcmVcblx0ICpcblx0ICogQHBhcmFtIGludGVybmFsQ2hhbmdlc0RlbHRhIENoYW5nZXMgdG8gYmUgYXBwbGllZFxuXHQgKiBAcGFyYW0gaXNDYWxsZWRBZnRlckFwaVNhdmUgSWYgJ2lzQ2FsbGVkQWZ0ZXJBcGlTYXZlJyBpcyB0cnVlIGxvY2FsIGNoYW5nZXMgd2lsbCBhbHdheXMgYmUgb3ZlcndyaXR0ZW4gKGluc3RlYWQgb2Ygb25seSB3aGVuIHRoZXJlIGFyZSBubyBjaGFuZ2VzKVxuXHQgKi9cblx0cHVibGljIGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgKFxuXHRcdGludGVybmFsQ2hhbmdlc0RlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogdm9pZCB7XG5cdFx0Ly8gV2UgZG9uJ3QgbmVlZCB0byBwcm9jZXNzIGNyZWF0ZWQgaXRlbXMsIGJlc2lkZXMgY2hlY2tpbmcgaWYgdGhleSBmaXQgaW4gY29sbGVjdGlvbnNcblx0XHQvLyBjcmVhdGluZyBlbnRyaWVzIGlzIGFscmVhZHkgZG9uZSBieSBgYXBwbHlDaGFuZ2VzRGVsdGFgIG9uIGEgcGFyZW50IHRyYW5zYWN0aW9uXG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIucHJvY2Vzc0l0ZW1FbnRyeUNoYW5nZXMoXG5cdFx0XHRcdHR1cGxlLFxuXHRcdFx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXIoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSGFuZGxlci5pdGVtUmVzb3VyY2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1FbnRyeS5pdGVtVHlwZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXS5pbmRleE9mKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHRcdFx0XHQvLyBpZiBhbiBpdGVtIGlzIGRlbGV0ZWQgb24gYW5vdGhlciBjYWNoZSB3ZSBzaG91bGRuJ3QgYXR0ZW1wdCBhbm90aGVyIHJlcXVlc3QsIHNvIHdlIHJlbW92ZSBpdCBmcm9tIHRoZSB0by1iZS1kZWxldGVkIGFycmF5XG5cdFx0XHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtRW50cnkuaXRlbVR5cGVdLnNwbGljZShcblx0XHRcdFx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdFx0XHRcdDEsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25NYXRjaGVyID0gbmV3IENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IoXG5cdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHQpO1xuXG5cdFx0Y29sbGVjdGlvbk1hdGNoZXJcblx0XHRcdC5wcm9jZXNzRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHQucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoaXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSk7XG5cblx0XHQvLyB0b2RvW2NhY2hlXSB3ZSBjb3VsZCBhcHBseSB0aGUgY2hhbmdlcyB0byBjaGlsZHJlbiB3aGlsZSB0aGUgcHJvbWlzZSBpcyBydW5uaW5nXG5cdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KGludGVybmFsQ2hhbmdlc0RlbHRhKTtcblx0XHR9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBkbyB3ZSB3YW50IHRoaXM/IE1heWJlIGFmdGVyIG1lcmdpbmcgdGhlIHNlcnZlciBjaGFuZ2VzIHRoZXJlJ3Mgbm8gY2hhbmdlcyBhbnltb3JlXG5cdFx0dGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7XG5cdFx0dGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEFwcGxpZXMgY2hhbmdlcyB0byB0aGlzIHRyYW5zYWN0aW9uIGFuZCBpdHMgY2hpbGRyZW5cblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqXG5cdCAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4ge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRnJvbVBhcmVudH0gYW5kIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhfSBpcyB0aGF0IGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgYXNzdW1lc1xuXHQgKiB0aGUgY2hhbmdlIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLCBhbmQgYXBwbHlDaGFuZ2VzRGVsdGEgd2lsbCBwcm9jZXNzIHRoZSBjaGFuZ2VzIGl0c2VsZiAocmVzdWx0IHZzIGNhdXNlKVxuXHQgKlxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS1cblx0ICpcblx0ICogRGlmZmVycyBmcm9tIHtAbGluayBTZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBTZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNEZWx0YX0gaW4gdGhlIGhhbmRsaW5nIG9mIGRlbGV0ZWQgZW50cmllcyBhbmQgdGhlIGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgY2FsbFxuXHQgKi9cblx0cHVibGljIGFwcGx5Q2hhbmdlc0RlbHRhIChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzRGVsdGEuY3JlYXRlZC5sZW5ndGggPT09IDBcblx0XHRcdCYmICFoYXNQcm9wZXJ0aWVzKGNoYW5nZXNEZWx0YS51cGRhdGVkKVxuXHRcdFx0JiYgIWhhc1Byb3BlcnRpZXMoY2hhbmdlc0RlbHRhLmRlbGV0ZWQpXG5cdFx0KSB7XG5cdFx0XHQvLyBlbXB0eSBkZWx0YSwgbm8gbmVlZCB0byBkbyBhbnl0aGluZ1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKHtcblx0XHRcdFx0Y3JlYXRlZDogW10sXG5cdFx0XHRcdHJvbGxiYWNrOiBub29wLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaFVwZGF0ZWREZXJpdmVkVmFsdWVzRnJvbURlbHRhKGNoYW5nZXNEZWx0YSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qge3Jlc3VsdCwgaW50ZXJuYWxDaGFuZ2VzRGVsdGEsIHJvbGxiYWNrRnVuY3Rpb25zfSA9IHN1cGVyLl9hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBjaGFuZ2VzRGVsdGEuZGVsZXRlZCkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBjaGFuZ2VzRGVsdGEuZGVsZXRlZFtpdGVtVHlwZV0pIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmNsZWFyKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRcdFx0Y29uc3Qgb2xkQ2hhbmdlcyA9IHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdFx0XHRcdFx0XHRkZWxldGUgY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5LmlkXTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuaXRlbUhhbmRsZXIuaXRlbVJlc291cmNlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtRW50cnkuaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtRW50cnkuaXRlbVR5cGVdID0gW107XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB0b2RvW2NhY2hlXSBjaGVjayBpZiBpdCdzIGFscmVhZHkgaW4gdGhlIGFycmF5ID9cblx0XHRcdFx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbURlbGV0ZWQoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRcdFx0XHRyb2xsYmFja0Z1bmN0aW9ucy5wdXNoKFxuXHRcdFx0XHRcdFx0XHRcdHJvbGxiYWNrRGVsdGEgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0cm9sbGJhY2tEZWx0YS5zZXRJdGVtVXBkYXRlZChcblx0XHRcdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvbGRDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXIgPSBuZXcgQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcihcblx0XHRcdFx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRcdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUgPT4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5nZXRBbGxDb2xsZWN0aW9uc0J5SXRlbVR5cGUoaXRlbVR5cGUpLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRjb2xsZWN0aW9uTWF0Y2hlclxuXHRcdFx0XHRcdFx0LnByb2Nlc3NEZWx0YShpbnRlcm5hbENoYW5nZXNEZWx0YSlcblx0XHRcdFx0XHRcdC5yZW1vdmVGcm9tQW5kQWRkVG9Db2xsZWN0aW9ucygpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRcdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KGludGVybmFsQ2hhbmdlc0RlbHRhKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0b2RvW2NhY2hlXSBkbyB3ZSB3YW50IHRoaXM/IE1heWJlIGFmdGVyIG1lcmdpbmcgdGhlIHNlcnZlciBjaGFuZ2VzIHRoZXJlJ3Mgbm8gY2hhbmdlcyBhbnltb3JlLCBjb3VsZCBiZSBhIHBlcmZvcm1hbmNlIHRoaW5neVxuXHRcdFx0XHRcdHRoaXMuaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXHRcdFx0XHRcdHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U2VydmVyQ2FjaGUgKCk6IFNlcnZlckNhY2hlIHtcblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0U2VydmVyQ2FjaGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyB0aGUgZW50cnkncyBwYXJlbnQgZnJvbSB0aGUgY2xvc2VzdCB0cmFuc2FjdGlvblxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlbUVudHJ5IFRoZSBlbnRyeSB0byBnZXQgdGhlIHBhcmVudCBmcm9tXG5cdCAqIEBwYXJhbSBmcm9tSW5pdGlhbCBJZiBgdHJ1ZWAgdGhlIHBhcmVudCB2YWx1ZXMgd2lsbCBiZSByZWFkIGZyb20ge0BsaW5rIFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcy5pbml0aWFsIGluaXRpYWx9IChVc2VmdWwgZm9yIHdoZW4geW91J3ZlIG1vdmVkIGFuIGVudHJ5KVxuXHQgKiBAcGFyYW0gcHJvdmlkZWRGaWVsZHMgVXNlIHRoZSBwcm92aWRlZCBmaWVsZHMgaW5zdGVhZCBvZiB0aGUgY2FjaGVkIGZpZWxkcywgdXNlZCBieSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlLmdldFBhcmVudCBDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0UGFyZW50fVxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIFVzZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlLmdldFBhcmVudCBDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0UGFyZW50fSBpbnN0ZWFkIG9mIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudCBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudH0gaWYgeW91J3JlIGdldHRpbmcgdGhlIHBhcmVudCBpbiB0aGUgb25SZW1vdmUgY2FsbGJhY2tcblx0ICovXG5cdC8vIHRvZG9bY2FjaGVdIHJlbmFtZSB0byBnZXRJdGVtUGFyZW50IG9yIGdldFBhcmVudE9iamVjdD9cblx0cHVibGljIGdldFBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZnJvbUluaXRpYWw6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRwcm92aWRlZEZpZWxkcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEVudHJ5UGFyZW50TnVsbCB7XG5cdFx0bGV0IGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB8IHVuZGVmaW5lZDtcblxuXHRcdGlmIChwcm92aWRlZEZpZWxkcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRmaWVsZHMgPSBwcm92aWRlZEZpZWxkcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgY2hhbmdlc1R1cGxlID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRpZiAoY2hhbmdlc1R1cGxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0ZmllbGRzID0gY2hhbmdlc1R1cGxlW2Zyb21Jbml0aWFsID8gJ2luaXRpYWwnIDogJ2NoYW5nZXMnXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZmllbGRzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50RnJvbUZpZWxkcyhcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRmaWVsZHMsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBwYXJlbnQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LmdldFBhcmVudChcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdGZyb21Jbml0aWFsLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFRyYXZlcnNlcyB0aGUgdHJhbnNhY3Rpb24gY2hhaW4gYW5kIHJldHVybnMgdGhlIGNoYW5nZXMgb2YgdGhlIGl0ZW0gb24gdGhlIGZpcnN0IHRyYW5zYWN0aW9uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb3B5RmllbGRzIElmIHNldCwgd2lsbCBjYWxsIHtAbGluayBBcGlGb3JtYXR0ZXIuY29weUZpZWxkcyBBcGlGb3JtYXR0ZXIuY29weUZpZWxkc30sIG90aGVyd2lzZSBqdXN0IHJldHVybnMgdGhlIG9iamVjdFxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdFx0Y29weUZpZWxkczogYm9vbGVhbiA9IHRydWUsXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF07XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzICE9PSB1bmRlZmluZWRcblx0XHRcdCYmIGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRpZiAoIWNvcHlGaWVsZHMpIHtcblx0XHRcdFx0cmV0dXJuIGNoYW5nZXMuY2hhbmdlcztcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRcdGNoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0e30sXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnBhcmVudC5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0aXRlbUVudHJ5SWQsXG5cdFx0XHRjb3B5RmllbGRzLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgdGhlIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlfSBmcm9tIHRoZSB0cmFuc2FjdGlvbiwgcHJldmVudGluZyB0aGUge0BsaW5rIEl0ZW1SZXNvdXJjZS5vcHRpb25zLm9uQ2hhbmdlIHRoZSBvbkNoYW5nZSBjYWxsYmFja30gZnJvbSBiZWluZyBjYWxsZWQuXG5cdCAqIFlvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIHJlc291cmNlIGlzIG5vIGxvbmdlciBuZWVkZWRcblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBEb2VzIG5vdCByZW1vdmUgY2hhbmdlc1xuXHQgKi9cblx0cHVibGljIGNsZWFySXRlbVJlc291cmNlIChyZXNvdXJjZTogSXRlbVJlc291cmNlKTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXIuY2xlYXJSZXNvdXJjZShyZXNvdXJjZSk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgQ29sbGVjdGlvblJlc291cmNlfSBmcm9tIHRoZSB0cmFuc2FjdGlvbiwgcHJldmVudGluZyB0aGUge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZS5vcHRpb25zLm9uQWRkIG9uQWRkfSBhbmQge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZS5vcHRpb25zLm9uUmVtb3ZlIG9uUmVtb3ZlfSBjYWxsYmFja3MgZnJvbSBiZWluZyBjYWxsZWQuXG5cdCAqIFlvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIHJlc291cmNlIGlzIG5vIGxvbmdlciBuZWVkZWRcblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBEb2VzIG5vdCByZW1vdmUgY2hhbmdlc1xuXHQgKi9cblx0cHVibGljIGNsZWFyQ29sbGVjdGlvblJlc291cmNlIChyZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlKTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuY2xlYXJSZXNvdXJjZShyZXNvdXJjZSk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLnJvb3RJdGVtIHJvb3RJdGVtfSBpcyB1c2VzIGxvY2tzXG5cdCAqL1xuXHRwdWJsaWMgaXNMb2NrYWJsZSAoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMucm9vdEl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJvb3RJdGVtLmlzTG9ja2FibGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRGlzYWJsZXMgdGhlIHRyYW5zYWN0aW9uJ3MgY2hhbmdlcyB3YXRjaGVyLCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXV0b21hdGljYWxseSBkZXRlY3QgY2hhbmdlcyBvbiBpdGVtc1xuXHQgKi9cblx0cHVibGljIGRpc2FibGVDaGFuZ2VzV2F0Y2hlciAoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuY2hhbmdlc0ludGVydmFsID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLmNoYW5nZXNJbnRlcnZhbCk7XG5cdFx0dGhpcy5jaGFuZ2VzSW50ZXJ2YWwgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBFbmFibGVzIHRoZSB0cmFuc2FjdGlvbidzIGNoYW5nZXMgd2F0Y2hlciwgdGhlIHRyYW5zYWN0aW9uIHdpbGwgbm93IGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGNoYW5nZXMgb24gaXRlbXNcblx0ICovXG5cdHB1YmxpYyBlbmFibGVDaGFuZ2VzV2F0Y2hlciAoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuY2hhbmdlc0ludGVydmFsICE9PSBudWxsKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdCdDaGFuZ2VzIHdhdGNoZXIgYWxyZWFkeSBydW5uaW5nIScsXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5kaXNhYmxlQ2hhbmdlc1dhdGNoZXIoKTtcblx0XHR9XG5cblx0XHR0aGlzLmNoYW5nZXNJbnRlcnZhbCA9IHdpbmRvdy5zZXRJbnRlcnZhbChcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0aWYgKCF0aGlzLmRldGVjdENoYW5nZXMoKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZGlzYWJsZUNoYW5nZXNXYXRjaGVyKCk7XG5cblx0XHRcdFx0aWYgKHRoaXMuaXNMb2NrYWJsZSgpKSB7XG5cdFx0XHRcdFx0dGhpcy5sb2NrU2VydmljZS5mZXRjaExvY2sodGhpcy5yb290SXRlbSEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0MzAwMCxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBTYXZlcyB0aGUgdHJhbnNhY3Rpb24sIHRoaXMgaGFzIGEgZGlmZmVyZW50IGVmZmVjdCBkZXBlbmRpbmcgb24gdGhlIHRyYW5zYWN0aW9uJ3MgcGFyZW50LlxuXHQgKlxuXHQgKiAtIElmIHRoZSBwYXJlbnQgaXMgYW5vdGhlciB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSBUcmFuc2FjdGlvbkNhY2hlfSBpdCB3aWxsIG1lcmdlIHRoZSBjaGFuZ2VzIG9mIHRoZSBjaGlsZCB0cmFuc2FjdGlvbiBpbiB0aGUgdGhlIHBhcmVudCB0cmFuc2FjdGlvblxuXHQgKiAtIElmIHRoZSBwYXJlbnQgaXMgdGhlIHtAbGluayBTZXJ2ZXJDYWNoZSBTZXJ2ZXJDYWNoZX0gaXQgd2lsbCBzYXZlIHRoZSBjaGFuZ2VzIHRvIHRoZSBBUGlcblx0ICovXG5cdHB1YmxpYyBzYXZlIChcblx0XHRjbG9zZVRhYiA9IGZhbHNlLFxuXHRcdHBhcmFtZXRlcnM6IENyZWF0ZVJlcXVlc3RQYXJhbWV0ZXJNYXAgPSB7fSxcblx0XHRicmVha1VwQnlQYXJlbnQ/OiBib29sZWFuLFxuXHRcdG9uQWZ0ZXJDcmVhdGVDYWxsYmFjaz86IE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuaXNTYXZpbmcpIHtcblx0XHRcdHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5yZWplY3QoKTtcblx0XHR9XG5cblx0XHR0aGlzLmlzU2F2aW5nID0gdHJ1ZTtcblxuXHRcdHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuXHRcdHRoaXMuZGlzYWJsZUNoYW5nZXNXYXRjaGVyKCk7XG5cblx0XHRsZXQgaXRlbUlkQ29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcDtcblxuXHRcdHJldHVybiAoXG5cdFx0XHR0aGlzLmlzTG9ja2FibGUoKVxuXHRcdFx0XHQ/IHRoaXMubG9ja1NlcnZpY2UuZmV0Y2hMb2NrKHRoaXMucm9vdEl0ZW0hKVxuXHRcdFx0XHQ6IHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpXG5cdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5ldmVudEhhbmRsZXIuZXhlY3V0ZUNhbGxiYWNrcyhcblx0XHRcdFx0XHRcdCdvbkJlZm9yZVNhdmUnLFxuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgPT4gY2FsbGJhY2sodGhpcyksXG5cdFx0XHRcdFx0XHRjbG9zZVRhYixcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMudGFiUmVxdWVzdFBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdFx0XHQuLi50aGlzLnRhYlJlcXVlc3RQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0Li4ucGFyYW1ldGVycyxcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMucGFyZW50LmFwcGx5Q2hhbmdlc0Zyb21DaGlsZChcblx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRicmVha1VwQnlQYXJlbnQsXG5cdFx0XHRcdFx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRfaXRlbUlkQ29udmVyc2lvbk1hcCA9PiB7XG5cdFx0XHRcdFx0aXRlbUlkQ29udmVyc2lvbk1hcCA9IF9pdGVtSWRDb252ZXJzaW9uTWFwO1xuXG5cdFx0XHRcdFx0dGhpcy50YWJSZXF1ZXN0UGFyYW1ldGVycyA9IHt9O1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuaXNMb2NrYWJsZSgpKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmxvY2tTZXJ2aWNlLmNsZWFyTG9jayh0aGlzLnJvb3RJdGVtISk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5ldmVudEhhbmRsZXIuZXhlY3V0ZUNhbGxiYWNrcyhcblx0XHRcdFx0XHRcdCdvblNhdmVTdWNjZXNzJyxcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0+IGNhbGxiYWNrKFxuXHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdGNsb3NlVGFiLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKCFjbG9zZVRhYikge1xuXHRcdFx0XHRcdFx0dGhpcy5lbmFibGVDaGFuZ2VzV2F0Y2hlcigpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRcdHJldHVybiBpdGVtSWRDb252ZXJzaW9uTWFwO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQuY2F0Y2goXG5cdFx0XHRcdGVycm9yID0+IHtcblx0XHRcdFx0XHR0aGlzLmlzU2F2aW5nID0gZmFsc2U7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KGVycm9yKTtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZGV0ZWN0Q2hhbmdlcyAoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuaGFzQ2hhbmdlcykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuZGV0ZWN0Q2hhbmdlcygpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5oYXNDaGFuZ2VzID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgYW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IHRocm91Z2ggYW4ge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2V9IGZyb20gdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9uQ2FjaGV9IHdoaWNoIG1lYW5zIHRoYXQgY2hhbmdlcyBvbiB0aGlzIGVudHJ5IHdpbGwgbm8gbG9uZ2VyIGJlIHRyYWNrZWQuXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJJdGVtIChpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxhbnk+KTogdm9pZCB7XG5cdFx0dGhpcy5jbGVhckl0ZW1FbnRyeShpdGVtUmVzb3VyY2UuZW50cnkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZW1vdmVzIGFuIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSBmcm9tIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSBUcmFuc2FjdGlvbkNhY2hlfSB3aGljaCBtZWFucyB0aGF0IGNoYW5nZXMgb24gdGhpcyBlbnRyeSB3aWxsIG5vIGxvbmdlciBiZSB0cmFja2VkLlxuXHQgKi9cblx0cHVibGljIGNsZWFySXRlbUVudHJ5IChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXIuY2xlYXJJdGVtRW50cnkoaXRlbUVudHJ5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVtb3ZlcyBhIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJ5fSB0aHJvdWdoIGEge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZSBDb2xsZWN0aW9uUmVzb3VyY2V9IGZyb20gdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9uQ2FjaGV9IHdoaWNoIG1lYW5zIHRoYXQgY2hhbmdlcyBvbiB0aGlzIGNvbGxlY3Rpb24gd2lsbCBubyBsb25nZXIgYmUgdHJhY2tlZC5cblx0ICovXG5cdHB1YmxpYyBjbGVhckNvbGxlY3Rpb24gKGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPGFueT4pOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jbGVhckVudHJ5KGNvbGxlY3Rpb25SZXNvdXJjZS5lbnRyeSk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEFkZHMgYSBjYWxsYmFjayB0aGF0IHdpbGwgZmlyZSBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIHNhdmVkLCByZWplY3RpbmcgdGhpcyBjYWxsYmFjayB3aWxsIHByZXZlbnQgdGhlIHRyYW5zYWN0aW9uIGZyb20gc2F2aW5nXG5cdCAqL1xuXHRwdWJsaWMgb25CZWZvcmVTYXZlIChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRjYWxsYmFjazogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZVsnb25CZWZvcmVTYXZlJ10sXG5cdFx0Y29uZGl0aW9uPzogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uLFxuXHRcdHByaW9yaXR5PzogbnVtYmVyLFxuXHQpOiAoKSA9PiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5ldmVudEhhbmRsZXIucmVnaXN0ZXJDYWxsYmFjayhcblx0XHRcdCdvbkJlZm9yZVNhdmUnLFxuXHRcdFx0a2V5LFxuXHRcdFx0Y2FsbGJhY2ssXG5cdFx0XHRjb25kaXRpb24sXG5cdFx0XHRwcmlvcml0eSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBZGRzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGZpcmUgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgc2F2ZWQgc3VjY2Vzc2Z1bGx5XG5cdCAqL1xuXHRwdWJsaWMgb25TYXZlU3VjY2VzcyAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0Y2FsbGJhY2s6IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGVbJ29uU2F2ZVN1Y2Nlc3MnXSxcblx0XHRjb25kaXRpb24/OiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24sXG5cdFx0cHJpb3JpdHk/OiBudW1iZXIsXG5cdCk6ICgpID0+IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLmV2ZW50SGFuZGxlci5yZWdpc3RlckNhbGxiYWNrKFxuXHRcdFx0J29uU2F2ZVN1Y2Nlc3MnLFxuXHRcdFx0a2V5LFxuXHRcdFx0Y2FsbGJhY2ssXG5cdFx0XHRjb25kaXRpb24sXG5cdFx0XHRwcmlvcml0eSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIGEge0BsaW5rIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25SZXN1bHR9IGZvciB0aGUgdHJhbnNhY3Rpb25cblx0ICovXG5cdHB1YmxpYyBnZXRNb2R1bGVDaGFuZ2VzICgpOiBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25SZXN1bHQge1xuXHRcdGlmICh0aGlzLnJvb3RJdGVtID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignTm8gcm9vdCBpdGVtIGZvciB0cmFuc2FjdGlvbiBjYWNoZSAnICsgdGhpcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeVxuXHRcdFx0LmNvbnN0cnVjdCh0aGlzKVxuXHRcdFx0LnByb2Nlc3MoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVXBkYXRlcyB0aGUgcGFzc2VkIG1hcCB3aXRoIHRoZSBuZXcge0BsaW5rIENvbnZlcnNpb25NYXAgQ2NvbnZlcnNpb25NYXB9IHZhbHVlc1xuXHQgKi9cblx0cHVibGljIHVwZGF0ZUl0ZW1JZE1hcCAoXG5cdFx0Y29sbGVjdGlvbk1hcDoge1tpdGVtSWQ6IG51bWJlcl06IGFueX0sXG5cdFx0Y29udmVyc2lvbk1hcDogQ29udmVyc2lvbk1hcCxcblx0KTogdm9pZCB7XG5cdFx0aWYgKGNvbnZlcnNpb25NYXAgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3Qgb2xkSWQgaW4gY29udmVyc2lvbk1hcCkge1xuXHRcdFx0Y29uc3QgbmV3SWQgPSBjb252ZXJzaW9uTWFwW29sZElkXTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25NYXBbb2xkSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbGxlY3Rpb25NYXBbbmV3SWRdID0gY29sbGVjdGlvbk1hcFtvbGRJZF07XG5cdFx0XHRkZWxldGUgY29sbGVjdGlvbk1hcFtvbGRJZF07XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNsb25lQ29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWUsIGVkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjbG9uZUNvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWUsIGVkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjbG9uZUNvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlfSxcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjbG9uZUNvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWV9LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNsb25lQ29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjbG9uZUNvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2xvbmVzIHRoZSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gYW5kIGFsbCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSBpbiBpdCwgYW5kIHNldHMgdGhlIHBhcmVudCBvZiB0aGUgbmV3IGVudHJpZXMuXG5cdCAqIFJldHVybnMgYSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlIENvbGxlY3Rpb25SZXNvdXJjZX0gb2YgdGhlIG5ld2x5IGNsb25lZCB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX1cblx0ICovXG5cdHB1YmxpYyBjbG9uZUNvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KSB7XG5cdFx0Y29uc3QgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsIHx8IHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCByZXF1aXJlZCBmb3IgY2xvbmVDb2xsZWN0aW9uJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlKFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jbG9uZUNvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0Y29sbGVjdGlvblJlc291cmNlLmVudHJ5LFxuXHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdGNvbnZlcnNpb25NYXAsXG5cdFx0XHQpLFxuXHRcdFx0b3B0aW9ucyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNsb25lSXRlbTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1SZXNvdXJjZTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjbG9uZUl0ZW08SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjbG9uZUl0ZW08SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2xvbmVzIHRoZSB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gYW5kIHJldHVybnMgYSB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZX0gb2YgdGhlIG5ld2x5IGNsb25lZCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX1cblx0ICovXG5cdHB1YmxpYyBjbG9uZUl0ZW08SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHQpIHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHR0aGlzLml0ZW1IYW5kbGVyLmNsb25lSXRlbUVudHJ5KFxuXHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0aXRlbVJlc291cmNlLmVudHJ5LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGFSZXN1bHQgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGNoYW5nZXNEZWx0YVJlc3VsdC5jcmVhdGVkWzBdO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlSXRlbVJlc291cmNlKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldEFsbExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRBbGxMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge3JlbW90ZUl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRBbGxMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0QWxsTGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0QWxsTGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRBbGxMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRBbGxMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpIHtcblx0XHRyZXR1cm4gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LnF1ZXJ5KFxuXHRcdFx0XHRsaW5rVHlwZSxcblx0XHRcdFx0e30sXG5cdFx0XHRcdHtbbGlua1R5cGVdOiBbJ2lkJ119LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRMaW5rQ29sbGVjdGlvbnMoXG5cdFx0XHRcdFx0XHRsaW5rVHlwZSxcblx0XHRcdFx0XHRcdHJlc3BvbnNlLmxpbmtzW2xpbmtUeXBlXSxcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldExpbmtDb2xsZWN0aW9uc0Zyb21EZWY8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGRlZmluaXRpb246IExpbmtDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZmV0Y2hMaW5rZWRDb2xsZWN0aW9uRW50cmllcyhcblx0XHRcdFx0bGlua1R5cGUsXG5cdFx0XHRcdGxpbmtJZEFycmF5LFxuXHRcdFx0XHRkZWZpbml0aW9uLml0ZW1UeXBlLFxuXHRcdFx0XHRkZWZpbml0aW9uLm9wdGlvbnMuZW50cnksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlcyhcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyaWVzLFxuXHRcdFx0XHRcdFx0ZGVmaW5pdGlvbi5vcHRpb25zLnJlc291cmNlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGxpbmtJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0TGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGxpbmtJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0TGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGxpbmtJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0TGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGxpbmtJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+Pj47XG5cblx0cHVibGljIGdldExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRsaW5rSWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpIHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmZldGNoTGlua2VkQ29sbGVjdGlvbkVudHJpZXMoXG5cdFx0XHRcdGxpbmtUeXBlLFxuXHRcdFx0XHRsaW5rSWRBcnJheSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdChjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPikgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXMoXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cmllcyxcblx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uRnJvbURlZjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGRlZmluaXRpb246IENvbGxlY3Rpb25EZWZpbml0aW9uPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmZldGNoQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRkZWZpbml0aW9uLml0ZW1UeXBlLFxuXHRcdFx0XHRkZWZpbml0aW9uLm9wdGlvbnMuZW50cnksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0ZW50cnkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZShcblx0XHRcdFx0XHRcdGVudHJ5LFxuXHRcdFx0XHRcdFx0ZGVmaW5pdGlvbi5vcHRpb25zLnJlc291cmNlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0Q29sbGVjdGlvbjogdHJ1ZSwgZWRpdEl0ZW1zOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlLCByZW1vdGVJdGVtczogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHVibGljIGdldENvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHVibGljIGdldENvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCkge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZmV0Y2hDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRlbnRyeSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlKFxuXHRcdFx0XHRcdFx0ZW50cnksXG5cdFx0XHRcdFx0XHRuZXcgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldENvbGxlY3Rpb25EZWY8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IENvbGxlY3Rpb25EZWZpbml0aW9uPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpdGVtVHlwZTogaXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdGVudHJ5OiBuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSwgLy8gd2UgbmVlZCB0aGUgZGVmYXVsdCBjb2x1bW4gdmFsdWVcblx0XHRcdFx0cmVzb3VyY2U6IG5ldyBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0fSxcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGdldExpbmtDb2xsZWN0aW9uc0RlZjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0bGlua0ZpZWxkOiBzdHJpbmcsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogTGlua0NvbGxlY3Rpb25EZWZpbml0aW9uPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpdGVtVHlwZTogaXRlbVR5cGUsXG5cdFx0XHRsaW5rRmllbGQ6IGxpbmtGaWVsZCxcblx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0ZW50cnk6IG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKG9wdGlvbnMpLCAvLyB3ZSBuZWVkIHRoZSBkZWZhdWx0IGNvbHVtbiB2YWx1ZVxuXHRcdFx0XHRyZXNvdXJjZTogbmV3IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHR9LFxuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgZ2V0SXRlbUJ5U3RhdGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHN0YXRlS2V5OiBJdGVtSWQgfCBzdHJpbmcsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldEl0ZW1CeVN0YXRlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRzdGF0ZUtleTogSXRlbUlkIHwgc3RyaW5nLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldEl0ZW1CeVN0YXRlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRzdGF0ZUtleTogSXRlbUlkIHwgc3RyaW5nLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8TG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFVzZSBnZXRJdGVtQnlJZC9nZXROZXdSZXNvdXJjZVdpdGhJZFxuXHQgKlxuXHQgKiBAcmVtYXJrc1xuXHQgKiBzdGF0ZUtleSBjYW4gYmUgYSBrZXl3b3JkIG9yIGEgbG9jYWwgaWQgKGluIGNhc2Ugb2YgYSByZWZyZXNoKVxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1CeVN0YXRlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRzdGF0ZUtleTogSXRlbUlkIHwgc3RyaW5nLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlID0ge30sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KSB7XG5cdFx0Y29uc3QgcGFyc2VkU3RhdGVLZXkgPSB0aGlzLmtleVNlcnZpY2UucGFyc2VTdGF0ZUtleShzdGF0ZUtleSBhcyBzdHJpbmcpO1xuXG5cdFx0aWYgKHBhcnNlZFN0YXRlS2V5ID09PSBudWxsKSB7XG5cdFx0XHRjb25zdCBpdGVtSWQgPSBzdGF0ZUtleSBhcyBJdGVtSWQ7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0IXRoaXMua2V5U2VydmljZS5pc0xvY2FsSWQoaXRlbUlkKVxuXHRcdFx0XHR8fCB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXNcblx0XHRcdFx0XHQuY29udGFpbnMoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0SXRlbUJ5SWQoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0aXNSb290LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocGFyc2VkU3RhdGVLZXkudHlwZSA9PT0gU3RhdGVLZXlUeXBlLkR1cGxpY2F0ZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0RHVwbGljYXRlQnlJZChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHBhcnNlZFN0YXRlS2V5Lml0ZW1JZCBhcyBJdGVtSWQsXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRpc1Jvb3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmdldE5ld1Jlc291cmNlKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRpc1Jvb3QsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXREdXBsaWNhdGVCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRkdXBsaWNhdGVJZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHJldHVybkxpbmtzOiB0cnVlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldER1cGxpY2F0ZUJ5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGR1cGxpY2F0ZUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0cmV0dXJuTGlua3M/OiBib29sZWFuLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXREdXBsaWNhdGVCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRkdXBsaWNhdGVJZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlID0ge30sXG5cdFx0cmV0dXJuTGlua3M/OiBib29sZWFuLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPiB8IEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKG9wdGlvbnMudGVtcGxhdGVPcHRpb25zID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9wdGlvbnMudGVtcGxhdGVPcHRpb25zID0ge307XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMudGVtcGxhdGVPcHRpb25zLml0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0b3B0aW9ucy50ZW1wbGF0ZU9wdGlvbnMuaXRlbSA9IGR1cGxpY2F0ZUlkO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmdldE5ld1Jlc291cmNlV2l0aElkKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHR0aGlzLmtleVNlcnZpY2UuZ2V0TG9jYWxEdXBsaWNhdGVJZCgpLFxuXHRcdFx0b3B0aW9ucyBhcyBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0XHRcdHJldHVybkxpbmtzLFxuXHRcdFx0aXNSb290LFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TmV3UmVzb3VyY2VXaXRoSWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHJldHVybkxpbmtzOiB0cnVlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldE5ld1Jlc291cmNlV2l0aElkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRyZXR1cm5MaW5rcz86IGJvb2xlYW4sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldE5ld1Jlc291cmNlV2l0aElkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRyZXR1cm5MaW5rczogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPiB8IEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cblx0XHRvcHRpb25zLmVkaXQgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaE5ld0l0ZW1FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0bmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0ZGVsdGFSZXN1bHQgPT4ge1xuXHRcdFx0XHRcdGxldCBtYWluRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGNvbnN0IGxpbmtlZEVudHJpZXNNYXA6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPiA9IHt9O1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgZGVsdGFSZXN1bHQuY3JlYXRlZCkge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUgPT09IGl0ZW1UeXBlXG5cdFx0XHRcdFx0XHRcdCYmIGl0ZW1FbnRyeS5pdGVtSWQgPT09IGl0ZW1JZFxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdG1haW5FbnRyeSA9IGl0ZW1FbnRyeTtcblxuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGxpbmtlZEVudHJpZXNNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGxpbmtlZEVudHJpZXNNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXSA9IFtdO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsaW5rZWRFbnRyaWVzTWFwW2l0ZW1FbnRyeS5pdGVtVHlwZV0ucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChtYWluRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdUaGUgSXRlbUVudHJ5IHdpdGggdGhlIHJlcXVlc3RlZCBJdGVtSWQgd2FzIG5vdCBpbiB0aGUgdGVtcGxhdGUgcmVzcG9uc2UnKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBtYWluID0gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPihcblx0XHRcdFx0XHRcdG1haW5FbnRyeSxcblx0XHRcdFx0XHRcdG9wdGlvbnMgYXMgSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0XHRcdFx0XHRpc1Jvb3QsXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAoIXJldHVybkxpbmtzKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbWFpbjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBsaW5rZWQgPSB0aGlzLnByb2Nlc3NMaW5rZWRJdGVtcyhcblx0XHRcdFx0XHRcdGxpbmtlZEVudHJpZXNNYXAsXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0bWFpbjogbWFpbixcblx0XHRcdFx0XHRcdGxpbmtlZDogbGlua2VkLFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TmV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHJldHVybkxpbmtzOiB0cnVlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldE5ld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRyZXR1cm5MaW5rcz86IGJvb2xlYW4sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGEgbmV3IEl0ZW1FbnRyeSBhbmQgcmVzb3VyY2Vcblx0ICovXG5cdHB1YmxpYyBnZXROZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgPSB7fSxcblx0XHRyZXR1cm5MaW5rcz86IGJvb2xlYW4sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2VMaW5rczxJdGVtVHlwZVR5cGU+IHwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXROZXdSZXNvdXJjZVdpdGhJZChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0dGhpcy5rZXlTZXJ2aWNlLmdldExvY2FsSWQoKSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRyZXR1cm5MaW5rcyxcblx0XHRcdGlzUm9vdCxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldEl0ZW1zQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge2VkaXQ6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHVibGljIGdldEl0ZW1zQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8UmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwdWJsaWMgZ2V0SXRlbXNCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8TG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBtdWx0aXBsZSBpdGVtcyB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgY2hhbmdlcyBvZiB0aGUgY3VycmVudCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSB0cmFuc2FjdGlvbn1cblx0ICovXG5cdHB1YmxpYyBnZXRJdGVtc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSA9IHt9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGNvbnN0IGVudHJ5T3B0aW9ucyA9IG5ldyBJdGVtRW50cnlPcHRpb25zKG9wdGlvbnMpO1xuXG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaEl0ZW1FbnRyaWVzQnlRdWVyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRlbnRyeU9wdGlvbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2VzKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0SXRlbXNCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHB1YmxpYyBnZXRJdGVtc0J5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZHM6IEl0ZW1JZFtdLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8UmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwdWJsaWMgZ2V0SXRlbXNCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIG11bHRpcGxlIGl0ZW1zIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBjaGFuZ2VzIG9mIHRoZSBjdXJyZW50IHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIHRyYW5zYWN0aW9ufVxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1zQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgPSB7fSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+IHtcblxuXHRcdHJldHVybiB0aGlzLml0ZW1IYW5kbGVyXG5cdFx0XHQuZmV0Y2hJdGVtRW50cmllcyhcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZHMsXG5cdFx0XHRcdG5ldyBJdGVtRW50cnlPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdChpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlSXRlbVJlc291cmNlcyhcblx0XHRcdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldEl0ZW1CeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0SXRlbUJ5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldEl0ZW1CeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgaXRlbSB3aXRoIHRoZSBjaGFuZ2VzIG9mIHRoZSBjdXJyZW50IHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIHRyYW5zYWN0aW9ufVxuXHQgKlxuXHQgKiBAcGFyYW0gaXNSb290IFNldHMgdGhlIGl0ZW0gYXMgdGhlIHJvb3QgaXRlbSBvZiB0aGUgdHJhbnNhY3Rpb25cblx0ICovXG5cdHB1YmxpYyBnZXRJdGVtQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgPSB7fSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaEl0ZW1FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0bmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2UoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdFx0aXNSb290LFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIHRpdGxlIG9mIGFuIGl0ZW0sIGRvZXMgbm90IGNyZWF0ZSBhbiB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZX1cblx0ICovXG5cdHB1YmxpYyBmZXRjaFRpdGxlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXIuZmV0Y2hUaXRsZShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0aGUgcGFzc2VkIGNoaWxkIFRyYW5zYWN0aW9uIGludG8gdGhpcyB0cmFuc2FjdGlvbiBhbmQgdGhlbiBwcm9wYWdhdGVzIHRoZW0gdG8gdGhlIG90aGVyIGNoaWxkIHRyYW5zYWN0aW9uc1xuXHQgKi9cblx0cHVibGljIGFwcGx5Q2hhbmdlc0Zyb21DaGlsZCAoXG5cdFx0Y2hpbGRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRfYnJlYWtVcEJ5UGFyZW50PzogYm9vbGVhbixcblx0XHRfb25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1JZENvbnZlcnNpb25NYXA+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGludGVybmFsQ2hhbmdlc0RlbHRhID0gY2hpbGRUcmFuc2FjdGlvbi5nZXREZWx0YSgpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5tb3ZlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS5tb3ZlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdC8vIEJpdCBvZiBhIGhhY2ssIGJ1dCB3aGVuIG1lcmdpbmcgdHJhbnNhY3Rpb25zIHdlIHdhbnQgdG8gaGFuZGxlIG1vdmVzIGFzIHVwZGF0ZXNcblx0XHRcdC8vIFdlIG9ubHkgd2FudCB0aGUgbW92ZXMgaW4gdGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRvIGRvIGEgbGlua1RvIHJlcXVlc3Qgd2hlbiBzYXZpbmcgdG8gdGhlIEFQSVxuXHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0dHVwbGUudG8sXG5cdFx0XHQpO1xuXG5cdFx0XHRkZWxldGUgaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWRbaXRlbUVudHJ5SWRdO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF0gPSB0aGlzLml0ZW1IYW5kbGVyLmNvcHlUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMoXG5cdFx0XHRcdFx0Y2hpbGRUcmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF0sXG5cdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLnByb2Nlc3NJdGVtRW50cnlDaGFuZ2VzKFxuXHRcdFx0XHRcdHR1cGxlLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5jcmVhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGludGVybmFsQ2hhbmdlc0RlbHRhLmNyZWF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuYWRkKHR1cGxlLmVudHJ5KTtcblx0XHRcdGNoaWxkVHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhcih0dXBsZS5lbnRyeSk7XG5cblx0XHRcdGNvbnN0IGxvY2FsQ2hhbmdlcyA9IHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbdHVwbGUuZW50cnkuaWRdID0gdGhpcy5pdGVtSGFuZGxlci5jb3B5VHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzKFxuXHRcdFx0XHRjaGlsZFRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeUlkXSxcblx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCBuZXdEaXNwbGF5TmFtZSA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXREaXNwbGF5TmFtZShcblx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKG5ld0Rpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMuZGlzcGxheW5hbWUgPSBuZXdEaXNwbGF5TmFtZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMucm9vdEl0ZW0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBsaW5rTm9kZSA9IGxpbmtUcmVlW3RoaXMucm9vdEl0ZW0uaXRlbVR5cGVdW3R1cGxlLmVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdFx0XHRpZiAobGlua05vZGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChsaW5rTm9kZS50eXBlID09PSBBcGlMaW5rVHJlZVR5cGUuSVRFTVRBQkxFKSB7XG5cdFx0XHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcy5pdGVtdHlwZSA9IHRoaXMucm9vdEl0ZW0uaXRlbVR5cGU7XG5cdFx0XHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcy5pdGVtID0gdGhpcy5yb290SXRlbS5pdGVtSWQ7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChsaW5rTm9kZS50eXBlID09PSBBcGlMaW5rVHJlZVR5cGUuRElSRUNUKSB7XG5cdFx0XHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlc1tsaW5rTm9kZS5maWVsZF0gPSB0aGlzLnJvb3RJdGVtLml0ZW1JZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblx0XHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtVHlwZV0gPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaW50ZXJuYWxDaGFuZ2VzRGVsdGEuZGVsZXRlZFtpdGVtVHlwZV0pIHtcblx0XHRcdFx0Ly8gaWYgYW4gaXRlbUVudHJ5IHdhcyBhIGxvY2FsIGVudHJ5IG9uIGEgY2hpbGQgdHJhbnNhY3Rpb24sIGl0J3MgaW1wb3NzaWJsZSB0aGF0IGl0IGlzIG9uIHRoaXMgdHJhbnNhY3Rpb25cblx0XHRcdFx0aWYgKGl0ZW1FbnRyeS5pc0xvY2FsKCkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhcihpdGVtRW50cnkpO1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtVHlwZV0ucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuaGFzQ2hhbmdlcyA9IHRydWU7XG5cblx0XHRyZXR1cm4gdGhpcy5leHBhbmRJdGVtc0Zyb21EZWx0YShpbnRlcm5hbENoYW5nZXNEZWx0YSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXIgPSBuZXcgQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcihcblx0XHRcdFx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRcdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUgPT4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5nZXRBbGxDb2xsZWN0aW9uc0J5SXRlbVR5cGUoaXRlbVR5cGUpLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRjb2xsZWN0aW9uTWF0Y2hlclxuXHRcdFx0XHRcdFx0LnByb2Nlc3NEZWx0YShpbnRlcm5hbENoYW5nZXNEZWx0YSlcblx0XHRcdFx0XHRcdC5yZW1vdmVGcm9tQW5kQWRkVG9Db2xsZWN0aW9ucygpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRcdFx0XHRpZiAoY2hpbGQgPT09IGNoaWxkVHJhbnNhY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNoaWxkLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBpbnRlcm5hbENoYW5nZXNEZWx0YS5pdGVtSWRDb252ZXJzaW9uTWFwO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBhbHJlYWR5IGNhY2hlZCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gYW5kIHRoZSBjaGFuZ2VzIG9mIHRoaXMgc3BlY2lmaWMgdHJhbnNhY3Rpb24gZm9yIHRoYXQgZW50cnlcblx0ICovXG5cdHB1YmxpYyBnZXRMb2NhbEl0ZW1FbnRyeUNoYW5nZXNUdXBsZSAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0KToge1xuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0Y2hhbmdlczogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzXG5cdH0ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZ2V0TG9jYWxJdGVtRW50cnkoaXRlbUVudHJ5SWQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFRyaWVkIHRvIGdldCBhIGxvY2FsIEl0ZW1FbnRyeSB3aXRoIGVudHJ5SWQgJyR7aXRlbUVudHJ5SWR9JyBidXQgY291bGRuJ3QgZmluZCBpdGApO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRlbnRyeTogaXRlbUVudHJ5LFxuXHRcdFx0Y2hhbmdlczogdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF0sXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBJdGVtRW50cnkgZnJvbSB0aGUgY2FjaGUsIGRvZXNuJ3QgZG8gYSBBUEkgcmVxdWVzdCwgdXNlZCBmb3Igc2F2aW5nXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdCk6IEl0ZW1FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmdldEJ5RW50cnlJZChpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBpdGVtRW50cnk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBJdGVtRW50cnkgZnJvbSB0aGUgY2FjaGUgYnkgSXRlbUlkXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUVudHJ5WydpdGVtSWQnXSxcblx0KTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGl0ZW1FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgYW4gQ29sbGVjdGlvbkVudHJ5IGZyb20gdGhlIGNhY2hlLCBkb2Vzbid0IGRvIGEgQVBJIHJlcXVlc3QsIHVzZWQgZm9yIHNhdmluZ1xuXHQgKi9cblx0cHVibGljIGdldExvY2FsQ29sbGVjdGlvbkVudHJ5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogQ29sbGVjdGlvbkVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlFbnRyeUlkKGNvbGxlY3Rpb25FbnRyeUlkKTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0TG9jYWxDb2xsZWN0aW9uRW50cnkoY29sbGVjdGlvbkVudHJ5SWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSB7QGxpbmsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgSW50ZXJuYWxDaGFuZ2VzRGVsdGF9IG9mIHRoZSBUcmFuc2FjdGlvbkNhY2hlLCB0aGlzIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IHRoZSBlbmQgcmVzdWx0IChpbml0aWFsIGlzIGNvbXBhcmVkIHRvIGNoYW5nZXMpLCBzbyBjaGFuZ2luZyBzb21ldGhpbmcgYW5kIHJldmVydGluZyBpdFxuXHQgKiB3b24ndCBiZSBpbmNsdWRlZFxuXHQgKi9cblx0cHVibGljIGdldERlbHRhICgpOiBJbnRlcm5hbENoYW5nZXNEZWx0YSB7XG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdEludGVybmFsRGVsdGEoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlcykge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSB0aGlzLmdldExvY2FsSXRlbUVudHJ5Q2hhbmdlc1R1cGxlKE51bWJlcihpdGVtRW50cnlJZCkpO1xuXG5cdFx0XHQvLyBBbiBpdGVtIGNhbiBiZSB1c2VkIGJ5IGEgMm5kKyBsZXZlbCBjaGlsZCBUcmFuc2FjdGlvbkNhY2hlLCBpdCB3aWxsIGJlIGxvY2FsIHRoYW4gYnV0IGl0IHNob3VsZCBvbmx5IGNvdW50IGFzIGEgY3JlYXRlXG5cdFx0XHQvLyBvbiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBhY3R1YWxseSBjcmVhdGVkIHRoZSBlbnRyeVxuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY29udGFpbnMoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0dHVwbGUuZW50cnkuaXRlbUlkLFxuXHRcdFx0XHQpXG5cdFx0XHRcdCYmIHR1cGxlLmVudHJ5LmlzTG9jYWwoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZChcblx0XHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG5ld1BhcmVudCA9IHRoaXMuZ2V0UGFyZW50KFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChuZXdQYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdFx0Y29uc3Qgb2xkUGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IXRoaXMuaXRlbUVudHJ5U2VydmljZS5tYXRjaFBhcmVudChcblx0XHRcdFx0XHRcdG9sZFBhcmVudCxcblx0XHRcdFx0XHRcdG5ld1BhcmVudCxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtTW92ZWQoXG5cdFx0XHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0XHRcdG5ld1BhcmVudCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChcblx0XHRcdFx0Ly8gaGFzQ2hhbmdlcyBvbmx5IHRha2VzIHdyaXRhYmxlIGNvbHVtbnMgaW50byBhY2NvdW50IGJ5IGRlZmF1bHQsIHNvIGp1c3QgbW92aW5nIHNvbWV0aGluZyBkb2Vzbid0IGNvdW50IGFzIGFuIHVwZGF0ZVxuXHRcdFx0XHQhdGhpcy5hcGlGb3JtYXR0ZXIuaGFzQ2hhbmdlcyhcblx0XHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmluaXRpYWwsXG5cdFx0XHRcdFx0dHVwbGUuY2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0XHRcdHR1cGxlLmVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gdGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXMpIHtcblx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtc0RlbGV0ZWQodGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbVR5cGVdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY2hhbmdlc0RlbHRhO1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2U8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+ICYge2VkaXQ6IHRydWV9LFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdFx0aXNOZXc/OiBib29sZWFuLFxuXHQpOiBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPjtcblxuXHRwdWJsaWMgY3JlYXRlSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZTxSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4gJiB7cmVtb3RlOiB0cnVlfSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHRcdGlzTmV3PzogYm9vbGVhbixcblx0KTogUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT47XG5cblx0cHVibGljIGNyZWF0ZUl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2U8TG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0XHRpc05ldz86IGJvb2xlYW4sXG5cdCk6IExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT47XG5cblx0Ly8gdG9kb1tjYWNoZV0gbW92ZSB0byBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyXG5cdHB1YmxpYyBjcmVhdGVJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdGlzUm9vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGlzTmV3PzogYm9vbGVhbixcblx0KSB7XG5cdFx0aWYgKGlzUm9vdCkge1xuXHRcdFx0dGhpcy5yb290SXRlbSA9IGl0ZW1FbnRyeTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9IHtcblx0XHRcdFx0aW5pdGlhbDogdGhpcy5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KGl0ZW1FbnRyeS5pZCksXG5cdFx0XHRcdGNoYW5nZXM6IHRoaXMuZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShpdGVtRW50cnkuaWQpLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRjb25zdCByZXNvdXJjZSA9IHRoaXMuaXRlbVJlc291cmNlRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0dGhpcyxcblx0XHRcdGlzTmV3LFxuXHRcdCk7XG5cblx0XHR0aGlzLml0ZW1IYW5kbGVyLmFkZFJlc291cmNlKHJlc291cmNlKTtcblxuXHRcdHJldHVybiByZXNvdXJjZTtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVJdGVtUmVzb3VyY2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0KTogQXJyYXk8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjcmVhdGVJdGVtUmVzb3VyY2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtyZW1vdGU6IHRydWV9LFxuXHQpOiBBcnJheTxSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNyZWF0ZUl0ZW1SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHQpOiBBcnJheTxMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY3JlYXRlSXRlbVJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdCk6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgY29uc3RydWN0b3IgPSB0aGlzLml0ZW1SZXNvdXJjZUZhY3RvcnkuZ2V0Q29uc3RydWN0b3I8SXRlbVR5cGVUeXBlPihcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHR0aGlzLFxuXHRcdCk7XG5cblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPSB7XG5cdFx0XHRcdFx0aW5pdGlhbDogdGhpcy5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LmlkLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGNoYW5nZXM6IHRoaXMuZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pZCxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVzb3VyY2UgPSBjb25zdHJ1Y3RvcihpdGVtRW50cnkpO1xuXG5cdFx0XHRyZXN1bHQucHVzaChyZXNvdXJjZSk7XG5cdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmFkZFJlc291cmNlKHJlc291cmNlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIHByb2Nlc3NMaW5rZWRJdGVtczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtlZEVudHJpZXM6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0KTogSXRlbVJlc291cmNlc0l0ZW1UeXBlTWFwPEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgcHJvY2Vzc0xpbmtlZEl0ZW1zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua2VkRW50cmllczogSXRlbVR5cGVNYXA8SXRlbUVudHJ5W10+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdCk6IEl0ZW1SZXNvdXJjZXNJdGVtVHlwZU1hcDxSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIHByb2Nlc3NMaW5rZWRJdGVtczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtlZEVudHJpZXM6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0KTogSXRlbVJlc291cmNlc0l0ZW1UeXBlTWFwPExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBwcm9jZXNzTGlua2VkSXRlbXMgKFxuXHRcdGxpbmtlZEVudHJpZXM6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0KSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXAgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gbGlua2VkRW50cmllcykge1xuXHRcdFx0cmVzdWx0W2l0ZW1UeXBlXSA9IHRoaXMuY3JlYXRlSXRlbVJlc291cmNlcyhcblx0XHRcdFx0bGlua2VkRW50cmllc1tpdGVtVHlwZV0sXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWUsIGVkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0cmVzb3VyY2VPcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWV9LFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0cmVzb3VyY2VPcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cblx0XHRpZiAodGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5LmlkXSA9IFtdO1xuXG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdCgpID0+IFtjb2xsZWN0aW9uRW50cnldLFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgdHJhbnNhY3Rpb25zOiBBYnN0cmFjdENhY2hlW10gPSB0aGlzLmdldFRyYW5zYWN0aW9uQ2hhaW4oKTtcblxuXHRcdFx0Zm9yIChjb25zdCB0cmFuc2FjdGlvbiBvZiB0cmFuc2FjdGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgaXRlbUVudHJpZXMgPSB0cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5lbnRyaWVzLmdldEJ5SXRlbVR5cGUoY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlKTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0XHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkuaWQsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y29sbGVjdGlvbk1hdGNoZXIuZXhwYW5kKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0Y2hhbmdlcyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyLnJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzb3VyY2UgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0cmVzb3VyY2VPcHRpb25zLFxuXHRcdFx0dGhpcyxcblx0XHQpO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uSGFuZGxlci5hZGRSZXNvdXJjZShyZXNvdXJjZSk7XG5cblx0XHRyZXR1cm4gcmVzb3VyY2U7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGNoYW5nZXNPYmplY3Q6IFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGU+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gY2hhbmdlc09iamVjdC5jaGFuZ2VzO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJpZXM6IENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cmVzb3VyY2VPcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge3JlbW90ZUl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWV9LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRjb25zdCByZXN1bHQ6IHtbcGFyZW50SWQ6IHN0cmluZ106IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb2xsZWN0aW9uRW50cmllcykge1xuXHRcdFx0cmVzdWx0W3BhcmVudElkXSA9IHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cmllc1twYXJlbnRJZF0sXG5cdFx0XHRcdHJlc291cmNlT3B0aW9ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBhbGwgcmVxdWlyZWQgY29sdW1ucyB0byBtYXRjaC9maXQgaW4gY29sbGVjdGlvbnNcblx0ICovXG5cdHByaXZhdGUgZXhwYW5kSXRlbXNGcm9tRGVsdGEgKGRlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5W11bXT4ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyaWVzUGVySXRlbVR5cGVNYXA6IHtbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1FbnRyeVtdfSA9IHt9O1xuXHRcdGNvbnN0IGNvbHVtbnNQZXJJdGVtVHlwZU1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogQXBpUmVxdWVzdENvbHVtbnN9ID0ge307XG5cblx0XHRjb25zdCBhZGRFbnRyeSA9XG5cdFx0XHRpdGVtRW50cnkgPT4ge1xuXHRcdFx0XHRpZiAoaXRlbUVudHJpZXNQZXJJdGVtVHlwZU1hcFtpdGVtRW50cnkuaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpdGVtRW50cmllc1Blckl0ZW1UeXBlTWFwW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGl0ZW1FbnRyaWVzUGVySXRlbVR5cGVNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBkZWx0YS5jcmVhdGVkKSB7XG5cdFx0XHRhZGRFbnRyeShkZWx0YS5jcmVhdGVkW2l0ZW1FbnRyeUlkXS5lbnRyeSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBkZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRhZGRFbnRyeShkZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXS5lbnRyeSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpdGVtRW50cmllc1Blckl0ZW1UeXBlTWFwKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY29sbGVjdGlvbkVudHJpZXMpIHtcblx0XHRcdFx0Y29sdW1uRXhwYW5zaW9uLmV4cGFuZChjb2xsZWN0aW9uRW50cnkuY29sdW1ucyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbHVtbnNQZXJJdGVtVHlwZU1hcFtpdGVtVHlwZV0gPSBjb2x1bW5FeHBhbnNpb24uZ2V0KClbaXRlbVR5cGVdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeVtdPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY29sdW1uc1Blckl0ZW1UeXBlTWFwKSB7XG5cdFx0XHRwcm9taXNlcy5wdXNoKFxuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmV4cGFuZExvY2FsSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0ZGVsdGEsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUVudHJpZXNQZXJJdGVtVHlwZU1hcFtpdGVtVHlwZV0sXG5cdFx0XHRcdFx0Y29sdW1uc1Blckl0ZW1UeXBlTWFwW2l0ZW1UeXBlXSxcblx0XHRcdFx0XHR0aGlzLmNvbHVtbkNhY2hlXG5cdFx0XHRcdFx0XHQucmV0cmlldmUoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRjb2x1bW5zUGVySXRlbVR5cGVNYXBbaXRlbVR5cGVdLFxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LmNhY2hlZCxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHByb21pc2VzKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgUXVlcnlNYXRjaGVyRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIENvbGxlY3Rpb25SZXNvdXJjZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hSZXN1bHQsIENvbGxlY3Rpb25RdWVyeSwgRW50cnlQYXJlbnROdWxsLCBGaWVsZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuL2NhY2hlL0Fic3RyYWN0Q2FjaGUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5cbmVudW0gQ09OU1RBTlRTIHtcblx0TUFZQkUgPSAnbWF5YmUnXG59XG5cbnR5cGUgQ29sbGVjdGlvbkVudHJ5TWFwID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRbY29sbGVjdGlvbkVudHJ5SWQ6IG51bWJlcl06IENvbGxlY3Rpb25FbnRyeTxhbnk+XG5cdH1cbn07XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uQ2FjaGUge1xuXHRwcml2YXRlIGVudHJpZXM6IENvbGxlY3Rpb25FbnRyeU1hcCA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0cHJpdmF0ZSB0cmFuc2FjdGlvbjogQWJzdHJhY3RDYWNoZSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgZ2V0QnlFbnRyeUlkIChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogQ29sbGVjdGlvbkVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIHRoaXMuZW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXVtjb2xsZWN0aW9uRW50cnlJZF07XG5cblx0XHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb250YWlucyAoY29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZW50cmllc1tjb2xsZWN0aW9uRW50cnkuaWRdICE9PSB1bmRlZmluZWQ7XG5cdH1cblxuXHRzb21lIChjYWxsYmFjazogKGVudHJ5OiBDb2xsZWN0aW9uRW50cnk8YW55PikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRpZiAoY2FsbGJhY2soZW50cmllc1tpdGVtVHlwZV1bZW50cnlJZF0pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRmb3JFYWNoIChjYWxsYmFjazogKGVudHJ5OiBDb2xsZWN0aW9uRW50cnk8YW55PikgPT4gdm9pZCk6IHZvaWQge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRjYWxsYmFjayhlbnRyaWVzW2l0ZW1UeXBlXVtlbnRyeUlkXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LypcdGZpbHRlciAoY2FsbGJhY2s6IChlbnRyeTogQ29sbGVjdGlvbkVudHJ5KSA9PiBib29sZWFuKTogdm9pZCB7XG5cdCBjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXHQgY29uc3QgZmlsdGVyZWRFbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlNYXAgID0ge307XG5cblx0IGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHQgZmlsdGVyZWRFbnRyaWVzW2l0ZW1UeXBlXSA9IHt9O1xuXG5cdCBmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0IGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGVudHJpZXNbaXRlbVR5cGVdW2VudHJ5SWRdO1xuXG5cdCBpZiAoY2FsbGJhY2soY29sbGVjdGlvbkVudHJ5KSlcblx0IGZpbHRlcmVkRW50cmllc1tpdGVtVHlwZV1bZW50cnlJZF0gPSBjb2xsZWN0aW9uRW50cnk7XG5cdCB9XG5cdCB9XG5cblx0IHRoaXMuZW50cmllcyA9IGZpbHRlcmVkRW50cmllcztcblx0IH1cblx0ICovXG5cdHRvQXJyYXkgKCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxDb2xsZWN0aW9uRW50cnk8YW55Pj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGVudHJpZXNbaXRlbVR5cGVdW2VudHJ5SWRdKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0YWRkPFQgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk8YW55Pj4gKGNvbGxlY3Rpb25FbnRyeTogVCk6IFQge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGU7XG5cblx0XHRpZiAoZW50cmllc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZW50cmllc1tpdGVtVHlwZV0gPSB7fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZW50cmllc1tpdGVtVHlwZV1bY29sbGVjdGlvbkVudHJ5LmlkXSA9IGNvbGxlY3Rpb25FbnRyeTtcblx0fVxuXG5cdGNsZWFyIChjb2xsZWN0aW9uRW50cnk/OiBDb2xsZWN0aW9uRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5lbnRyaWVzID0ge307XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5jb250YWlucyhjb2xsZWN0aW9uRW50cnkpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlbGV0ZSB0aGlzLmVudHJpZXNbY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlXVtjb2xsZWN0aW9uRW50cnkuaWRdO1xuXHR9XG5cblx0Z2V0QnlJdGVtVHlwZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0cmVzdWx0LnB1c2goZW50cmllc1tlbnRyeUlkXSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdG1hdGNoUGFyZW50IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxhbnk+LFxuXHRcdGl0ZW1UeXBlOiBzdHJpbmcsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCkge1xuXHRcdGNvbnN0IHBhcmVudCA9IGNvbGxlY3Rpb25FbnRyeS5wYXJlbnQ7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gPT0gdG8gY29tcGFyZSBpdGVtSWRzXG5cdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRyZXR1cm4gcGFyZW50Lml0ZW1UeXBlID09PSBpdGVtVHlwZSAmJiBwYXJlbnQuaXRlbUlkID09IGl0ZW1JZDtcblx0fVxuXG5cdC8vIFRPRE86IHRoaW5rIG9mIGJldHRlciBuYW1lXG5cdGdldEJ5UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWQ6IEl0ZW1JZCxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpOiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPiB8IG51bGwge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGlmICh0aGlzLm1hdGNoUGFyZW50KFxuXHRcdFx0XHRlbnRyaWVzW2VudHJ5SWRdLFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRwYXJlbnRJZCxcblx0XHRcdCkpIHtcblx0XHRcdFx0cmV0dXJuIGVudHJpZXNbZW50cnlJZF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRnZXRDb2xsZWN0aW9uc0J5UGFyZW50IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZDogSXRlbUlkLFxuXHQpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PGFueT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBlbnRyaWVzW2l0ZW1UeXBlXVtlbnRyeUlkXTtcblxuXHRcdFx0XHRpZiAodGhpcy5tYXRjaFBhcmVudChcblx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0XHRwYXJlbnRJZCxcblx0XHRcdFx0KSkge1xuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJpZXN9IHdoaWNoIGNvbnRhaW4gdGhlIGl0ZW0gd2l0aCB0aGUgcGFzc2VkIEl0ZW1UeXBlL0l0ZW1JZFxuXHQgKi9cblx0Z2V0QnlDb250YWluaW5nSXRlbTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBlbnRyaWVzW2VudHJ5SWRdO1xuXHRcdFx0Y29uc3QgaXRlbXMgPSB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cblx0XHRcdGlmIChpdGVtcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGl0ZW1zLnNvbWUoXG5cdFx0XHRcdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRcdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5Lml0ZW1JZCA9PSBpdGVtSWQsXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENoZWNrcyBpZiB0aGUgcGFzc2VkIGZpZWxkcyB3b3VsZCBmaXQgaW4gdGhlIGNvbGxlY3Rpb25zIHVzaW5nIHRoZSB7QGxpbmsgUXVlcnlNYXRjaGVyIFF1ZXJ5TWF0Y2hlcn1cblx0ICovXG5cdGdldEJ5Rml0dGluZ0l0ZW08SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGZpZWxkczogRmllbGRNYXAsXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZT4gPSB7XG5cdFx0XHRmaXR0aW5nOiBbXSxcblx0XHRcdG5vdGZpdHRpbmc6IFtdLFxuXHRcdFx0bWF5YmU6IFtdLFxuXHRcdH07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdC8vIGNvbnNvbGUudGltZSgnZ2V0QnlGaXR0aW5nSXRlbScpO1xuXG5cdFx0Y29uc3QgcXVlcnlNYXRjaGVyID0gdGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0ZmllbGRzLFxuXHRcdFx0cGFyZW50LFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tlbnRyeUlkXTtcblx0XHRcdGNvbnN0IG1hdGNoUmVzdWx0ID0gcXVlcnlNYXRjaGVyLm1hdGNoUXVlcnkoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCk7XG5cblx0XHRcdC8vIHRvZG9bY2FjaGVdOiBtYXliZT9cblx0XHRcdGlmIChtYXRjaFJlc3VsdCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRyZXN1bHQuZml0dGluZy5wdXNoKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHR9IGVsc2UgaWYgKG1hdGNoUmVzdWx0ID09PSBDT05TVEFOVFMuTUFZQkUpIHtcblx0XHRcdFx0cmVzdWx0Lm1heWJlLnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdC5ub3RmaXR0aW5nLnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBjb25zb2xlLnRpbWVFbmQoJ2dldEJ5Rml0dGluZ0l0ZW0nKTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQ29sbGVjdGlvblF1ZXJ5LFxuXHQpOiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPiB8IG51bGwge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGVudHJpZXNbZW50cnlJZF07XG5cblx0XHRcdGlmIChjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nID09PSBxdWVyeS5zdHJpbmcpIHtcblx0XHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGdldEJ5S2V5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRlbnRyeUtleTogc3RyaW5nLFxuXHQpOiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBlbnRyaWVzW2VudHJ5SWRdO1xuXG5cdFx0XHRpZiAoY29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMuZW50cnlLZXkgPT09IGVudHJ5S2V5KSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8vIHRvZG9bY2FjaGVdIHJlbW92ZSB0aGlzLCB5b3Ugc2hvdWxkIGdldCBhIG5ldyByZXNvdXJjZS4uLlxuXHQvKipcblx0ICogQGRlcHJlY2F0ZWRcblx0ICovXG5cdHB1YmxpYyBnZXRSZXNvdXJjZUJ5S2V5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRyZXNvdXJjZUtleTogc3RyaW5nLFxuXHQpOiBBcnJheTxDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkIHx8ICEodGhpcy50cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uQ2FjaGUpKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRjb25zdCByZXNvdXJjZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmNvbGxlY3Rpb25SZXNvdXJjZXNbZW50cnlJZF07XG5cblx0XHRcdGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG5cdFx0XHRcdGlmIChyZXNvdXJjZS5vcHRpb25zLnJlc291cmNlS2V5ID09PSByZXNvdXJjZUtleSkge1xuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKHJlc291cmNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cbiIsImltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQgeyBRdWVyeVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFF1ZXJ5UGFyc2VyRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlPcHRpb25zLCBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2UsIENvbGxlY3Rpb25RdWVyeSwgRW50cnlQYXJlbnROdWxsLCBJdGVtSWQsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkVudHJ5U2VydmljZSB7XG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHF1ZXJ5UGFyc2VyRmFjdG9yeTogUXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgcXVlcnlTZXJ2aWNlOiBRdWVyeVNlcnZpY2UsXG5cdCkge1xuXG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlVW5mb3VuZExvY2FsQ29sbGVjdGlvbkVycm9yIChpdGVtVHlwZTogSXRlbVR5cGUpOiB7bWVzc2FnZTogc3RyaW5nfSB7XG5cdFx0cmV0dXJuIHttZXNzYWdlOiBgQSBsb2NhbCBjb2xsZWN0aW9uIG9mIHR5cGUgJHtpdGVtVHlwZX0gY291bGQgbm90IGJlIGZvdW5kYH07XG5cdH1cblxuXHQvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSBjb2x1bW5zIHByb3BlcnR5LCBpdCB3aWxsIGJlIHJlcGxhY2VkIGluIHdoZW4gY29sdW1ucyBhcmUgZXhwYW5kZWRcblx0Y2xvbmVPcHRpb25zIChcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsLFxuXHQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKTsgLy8gZG9lcyBhIHNoYWxsb3cgY29weVxuXG5cdFx0cmVzdWx0LnF1ZXJ5UGFyYW1zID0gdGhpcy5jbG9uZVF1ZXJ5UGFyYW1zKG9wdGlvbnMucXVlcnlQYXJhbXMpO1xuXHRcdHJlc3VsdC5wYXJlbnQgPSBwYXJlbnQ7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJvY2Vzc09wdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+KTogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyB7XG5cdFx0cmV0dXJuIG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKG9wdGlvbnMpO1xuXHR9XG5cblx0Y2xvbmVRdWVyeVBhcmFtczxUIGV4dGVuZHMgb2JqZWN0PiAocGFyYW1ldGVyczogVCk6IFQge1xuXHRcdGNvbnN0IHJlc3VsdDogYW55ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGtleSBpbiBwYXJhbWV0ZXJzKSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IHBhcmFtZXRlcnNba2V5XTtcblx0XHRcdGxldCBjbG9uZTtcblxuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRcdGNsb25lID0gdmFsdWUuc2xpY2UoKTtcblx0XHRcdH0vLyB3ZSdyZSBvbmx5IHVzaW5nIHByaW1pdGl2ZSBhcnJheXNcblx0XHRcdGVsc2UgaWYgKG1vbWVudC5pc01vbWVudCh2YWx1ZSkpIHtcblx0XHRcdFx0Y2xvbmUgPSB2YWx1ZS5jbG9uZSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xvbmUgPSB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0cmVzdWx0W2tleV0gPSBjbG9uZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Y3JlYXRlUXVlcnkgKG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMpOiBDb2xsZWN0aW9uUXVlcnkge1xuXHRcdGNvbnN0IHBhcmVudCA9IG9wdGlvbnMucGFyZW50O1xuXG5cdFx0bGV0IHF1ZXJ5O1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cXVlcnkgPSBvcHRpb25zLnF1ZXJ5O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBsaW5rZWRUb1F1ZXJ5ID0ge1xuXHRcdFx0XHRsaW5rZWRUbzogcGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0XHRxdWVyeToge2lkOiAnJnBhcmVudElkJ30sXG5cdFx0XHR9O1xuXHRcdFx0b3B0aW9ucy5xdWVyeVBhcmFtcy5wYXJlbnRJZCA9IHBhcmVudC5pdGVtSWQ7XG5cblx0XHRcdHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeSA9PT0gbnVsbCA/XG5cdFx0XHRcdGxpbmtlZFRvUXVlcnkgOlxuXHRcdFx0XHR0aGlzLnF1ZXJ5U2VydmljZS5hZGRBbmRDb25kaXRpb24oXG5cdFx0XHRcdFx0b3B0aW9ucy5xdWVyeSxcblx0XHRcdFx0XHRsaW5rZWRUb1F1ZXJ5LFxuXHRcdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBhcnNlZFF1ZXJ5ID0gdGhpcy5xdWVyeVBhcnNlckZhY3Rvcnlcblx0XHRcdC5jb25zdHJ1Y3QoXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRvcHRpb25zLnF1ZXJ5UGFyYW1zLFxuXHRcdFx0KVxuXHRcdFx0LnBhcnNlKCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b2JqZWN0OiBwYXJzZWRRdWVyeVswXSxcblx0XHRcdHN0cmluZzogcGFyc2VkUXVlcnlbMV0sXG5cdFx0fTtcblx0fVxuXG5cdGdldElkQXJyYXkgKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8YW55Pj4sXG5cdFx0YWNjdW11bGF0b3I6IEl0ZW1JZFtdID0gW10sXG5cdCk6IEl0ZW1JZFtdIHtcblx0XHRpZiAoYWNjdW11bGF0b3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YWNjdW11bGF0b3IgPSBbXTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0YWNjdW11bGF0b3IucHVzaChpdGVtRW50cnkuaXRlbUlkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjdW11bGF0b3I7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZpbHRlcnMgYW4gYXJyYXkgb2Yge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gYWNjb3JkaW5nIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cblx0ICogRG9lcyBhbiBpbi1wbGFjZSByZXBsYWNlbWVudCBvZiB0aGUgaXRlbXMgaW4gdGhlIGFycmF5IHRoYXQgZG8gbWF0Y2ggdGhlIGNvbmRpdGlvbiAoa2VlcGluZyB0aGUgYXJyYXkgcmVmZXJlbmNlKVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSB0aGF0IGZhaWxlZCB0aGUgY29uZGl0aW9uXG5cdCAqL1xuXHRmaWx0ZXJBcnJheTxUIGV4dGVuZHMgSXRlbUVudHJ5PGFueT4gPSBJdGVtRW50cnk8YW55Pj4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBUW10sXG5cdFx0Y2FsbGJhY2s6IChpdGVtRW50cnk6IFQpID0+IGJvb2xlYW4sXG5cdCk6IFRbXSB7XG5cdFx0Y29uc3QgZmlsdGVyZWRFbnRyaWVzOiBUW10gPSBbXTtcblx0XHRjb25zdCByZW1vdmVkRW50cmllczogVFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0KGNhbGxiYWNrKGl0ZW1FbnRyeSkgPyBmaWx0ZXJlZEVudHJpZXMgOiByZW1vdmVkRW50cmllcykucHVzaChpdGVtRW50cnkpO1xuXHRcdH1cblxuXHRcdGlmIChyZW1vdmVkRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiByZW1vdmVkRW50cmllcztcblx0XHR9XG5cblx0XHRpdGVtRW50cmllcy5sZW5ndGggPSBmaWx0ZXJlZEVudHJpZXMubGVuZ3RoO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtRW50cmllcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aXRlbUVudHJpZXNbaV0gPSBmaWx0ZXJlZEVudHJpZXNbaV07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlbW92ZWRFbnRyaWVzO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLCBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlLCBJdGVtUmVzb3VyY2UgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2Uge1xuXG5cdHByb2Nlc3NPcHRpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+XG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnM8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zKG9wdGlvbnMpO1xuXHR9XG5cblx0Z2V0SWRBcnJheSAoaXRlbVJlc291cmNlczogQXJyYXk8SXRlbVJlc291cmNlPGFueT4+KTogSXRlbUlkW10ge1xuXHRcdGNvbnN0IHJlc3VsdDogSXRlbUlkW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1SZXNvdXJjZXMpXG5cdFx0XHRyZXN1bHQucHVzaChpdGVtUmVzb3VyY2UuZW50cnkuaXRlbUlkKTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxufVxuIiwiaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbiwgQXBpUmVxdWVzdENvbHVtbnMsIEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbiwgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtbkNhY2hlIHtcblx0Y2FjaGU6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgPSB7fTtcblx0YWxsQ29sdW1uczoge1tpdGVtVHlwZTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHQpIHtcblx0fVxuXG5cdHNldENvbHVtbiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlc3BvbnNlQ29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0KTogUmVzcG9uc2VDb2x1bW4ge1xuXHRcdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRcdGlmIChjYWNoZVtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y2FjaGVbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0Y29uc3QgZW50cnkgPSBjYWNoZVtpdGVtVHlwZV07XG5cdFx0Y29uc3QgY29sdW1uSWQgPSByZXNwb25zZUNvbHVtbi5pZDtcblxuXHRcdGlmIChlbnRyeVtjb2x1bW5JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZW50cnlbY29sdW1uSWRdID0gcmVzcG9uc2VDb2x1bW47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudHJ5W2NvbHVtbklkXTtcblx0fVxuXG5cdHNldENvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIHtcblx0XHRjb25zdCByZXN1bHQ6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgcmVzcG9uc2VUeXBlIGluIHJlc3BvbnNlQ29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1ucyA9IHJlc3BvbnNlQ29sdW1uc1tyZXNwb25zZVR5cGVdO1xuXG5cdFx0XHRyZXN1bHRbcmVzcG9uc2VUeXBlXSA9IHt9O1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIGNvbHVtbnMpIHtcblx0XHRcdFx0cmVzdWx0W3Jlc3BvbnNlVHlwZV1bY29sdW1uSWRdID0gdGhpcy5zZXRDb2x1bW4oXG5cdFx0XHRcdFx0cmVzcG9uc2VUeXBlLFxuXHRcdFx0XHRcdGNvbHVtbnNbY29sdW1uSWRdLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0dGhpcy5hbGxDb2x1bW5zW2l0ZW1UeXBlXSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHJldHJpZXZlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiB7Y2FjaGVkOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLCBtaXNzaW5nOiBBcGlSZXF1ZXN0Q29sdW1uc30ge1xuXHRcdGlmIChyZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0aWYgKHRoaXMuY29udGFpbnNBbGwoaXRlbVR5cGUpKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0Y2FjaGVkOiB0aGlzLmdldENvbHVtbnMoaXRlbVR5cGUpLFxuXHRcdFx0XHRcdG1pc3Npbmc6IFtdLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRjYWNoZWQ6IHt9LFxuXHRcdFx0XHRtaXNzaW5nOiB0cnVlLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRjb25zdCByZXNwb25zZUFjY3VtdWxhdG9yID0ge307XG5cdFx0Y29uc3QgcmVxdWVzdEFjY3VtdWxhdG9yOiBSZXNwb25zZUNvbHVtbltdID0gW107XG5cblx0XHR0aGlzLnJldHJpZXZlQ29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHRyZXF1ZXN0QWNjdW11bGF0b3IsXG5cdFx0XHRyZXNwb25zZUFjY3VtdWxhdG9yLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0Y2FjaGVkOiByZXNwb25zZUFjY3VtdWxhdG9yLFxuXHRcdFx0bWlzc2luZzogcmVxdWVzdEFjY3VtdWxhdG9yLFxuXHRcdH07XG5cdH1cblxuXHRjb250YWluc0FsbCAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuYWxsQ29sdW1uc1tpdGVtVHlwZV0gPT09IHRydWU7XG5cdH1cblxuXHRnZXRDb2x1bW5zIChpdGVtVHlwZTogSXRlbVR5cGUpOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIHtcblx0XHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cblx0XHRyZXR1cm4ge1tpdGVtVHlwZV06IGNhY2hlW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkID8gW10gOiBjYWNoZVtpdGVtVHlwZV19O1xuXHR9XG5cblx0cHJpdmF0ZSByZXRyaWV2ZUNvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdHJlcXVlc3RBY2N1bXVsYXRvcjogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdHJlc3BvbnNlQWNjdW11bGF0b3I6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IHZvaWQge1xuXHRcdC8vIGFsd2F5cyByZXRyaWV2ZSB0aGUgaWQgY29sdW1uXG5cdFx0dGhpcy5yZXRyaWV2ZUNvbHVtbihcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0J2lkJyxcblx0XHRcdHJlcXVlc3RBY2N1bXVsYXRvcixcblx0XHRcdHJlc3BvbnNlQWNjdW11bGF0b3IsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgcmVxdWVzdENvbHVtbiBvZiByZXF1ZXN0Q29sdW1ucykge1xuXHRcdFx0dGhpcy5yZXRyaWV2ZUNvbHVtbihcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW4sXG5cdFx0XHRcdHJlcXVlc3RBY2N1bXVsYXRvcixcblx0XHRcdFx0cmVzcG9uc2VBY2N1bXVsYXRvcixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSByZXRyaWV2ZUNvbHVtbiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW46IEFwaVJlcXVlc3RDb2x1bW4sXG5cdFx0cmVxdWVzdEFjY3VtdWxhdG9yOiBSZXNwb25zZUNvbHVtbltdLFxuXHRcdHJlc3BvbnNlQWNjdW11bGF0b3I6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1uVXRpbC5wYXJzZVJlcXVlc3RDb2x1bW4ocmVxdWVzdENvbHVtbik7XG5cdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW4gPSB0aGlzLmdldENvbHVtbihcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0Y29sdW1uLmlkLFxuXHRcdCk7XG5cblx0XHRpZiAocmVzcG9uc2VDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVxdWVzdEFjY3VtdWxhdG9yLnB1c2gocmVxdWVzdENvbHVtbik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHJlc3BvbnNlQWNjdW11bGF0b3JbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlc3BvbnNlQWNjdW11bGF0b3JbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0cmVzcG9uc2VBY2N1bXVsYXRvcltpdGVtVHlwZV1bY29sdW1uLmlkXSA9IHJlc3BvbnNlQ29sdW1uO1xuXG5cdFx0aWYgKGNvbHVtbi5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBtaXNzaW5nRGVyaXZlZDogUmVzcG9uc2VDb2x1bW5bXSA9IFtdO1xuXG5cdFx0dGhpcy5yZXRyaWV2ZUNvbHVtbnMoXG5cdFx0XHRyZXNwb25zZUNvbHVtbi5pdGVtVHlwZSxcblx0XHRcdGNvbHVtbi5jaGlsZHJlbixcblx0XHRcdG1pc3NpbmdEZXJpdmVkLFxuXHRcdFx0cmVzcG9uc2VBY2N1bXVsYXRvcixcblx0XHQpO1xuXG5cdFx0aWYgKG1pc3NpbmdEZXJpdmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHJlcXVlc3RBY2N1bXVsYXRvci5wdXNoKHtbY29sdW1uLmlkXTogbWlzc2luZ0Rlcml2ZWR9KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0Q29sdW1uIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0Y29sdW1uSWQ6IHN0cmluZyxcblx0KTogUmVzcG9uc2VDb2x1bW4gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZVtpdGVtVHlwZV07XG5cblx0XHRpZiAoY2FjaGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHJldHVybiBjYWNoZVtjb2x1bW5JZF07XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtbkluZm8sIENvbHVtblNldCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uSW5mb0ZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdENvbHVtbixcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdENvbHVtbkV4cGFuc2lvblJlc3VsdCxcblx0SXRlbVR5cGUsXG5cdFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFJvb3RDb2x1bW5NYXAsXG59IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgZ2V0Rmlyc3RQcm9wZXJ0eSB9IGZyb20gJy4vVXRpbCc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIENvbHVtbkV4cGFuc2lvbiBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSB0aGF0IGhhdmUgdGhlIHNhbWUge0BsaW5rIENvbHVtblNldCBDb2x1bW5TZXR9IChtYXRjaGVkIG9uIHtAbGluayBDb2x1bW5TZXQuaWQgQ29sdW1uU2V0LmlkfSkgd2lsbCBhbGwgZ2V0IHRoZSBzYW1lIG5ldyBleHBhbmRlZCBDb2x1bW5TZXRcbiAqL1xuZXhwb3J0IGNsYXNzIENvbHVtbkV4cGFuc2lvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4ge1xuXG5cdGV4cGFuc2lvbk1hcDoge1tjb2x1bW5TZXRJZDogc3RyaW5nXTogQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1UeXBlVHlwZT4gfCBudWxsfSA9IHt9O1xuXHRleHBhbnNpb25NYXBTaXplOiBudW1iZXIgPSAwO1xuXHRyZXF1ZXN0Q29sdW1uc1RydWU6IGJvb2xlYW47XG5cdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW107XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uSW5mb0ZhY3Rvcnk6IENvbHVtbkluZm9GYWN0b3J5LFxuXHRcdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRwdWJsaWMgcmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpIHtcblx0XHRpZiAocmVxdWVzdENvbHVtbnMgPT09IHRydWUpIHtcblx0XHRcdC8vIHJlcXVlc3RDb2x1bW5zIHNob3VsZCBhbHdheXMgYmUgYW4gYXJyYXksIHdoZW4gaXQgaXMgdHJ1ZSBkZXJpdmVkIGNvbHVtbiBpbmZvcm1hdGlvbiB3aWxsIGJlIGxvc3Rcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbnNUcnVlID0gdHJ1ZTtcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbnMgPSBbXTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiByZXNwb25zZUNvbHVtbnNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdHRoaXMucmVxdWVzdENvbHVtbnMucHVzaChjb2x1bW5JZCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbnNUcnVlID0gZmFsc2U7XG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5zID0gcmVxdWVzdENvbHVtbnM7XG5cdFx0fVxuXHR9XG5cblx0cnVuIChjb2x1bW5TZXQ6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+KTogQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1UeXBlVHlwZT4gfCBudWxsIHtcblx0XHRjb25zdCBleHBhbnNpb25NYXAgPSB0aGlzLmV4cGFuc2lvbk1hcDtcblx0XHRjb25zdCBjb2x1bW5TZXRJZCA9IGNvbHVtblNldC5pZDtcblxuXHRcdGlmIChleHBhbnNpb25NYXBbY29sdW1uU2V0SWRdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBleHBhbnNpb25NYXBbY29sdW1uU2V0SWRdO1xuXHRcdH1cblxuXHRcdHRoaXMuZXhwYW5zaW9uTWFwU2l6ZSsrO1xuXG5cdFx0cmV0dXJuIGV4cGFuc2lvbk1hcFtjb2x1bW5TZXRJZF0gPSBjb2x1bW5TZXQuaXNTdXBlcnNldE9mKHRoaXMucmVxdWVzdENvbHVtbnMpID9cblx0XHRcdG51bGwgOlxuXHRcdFx0Y29sdW1uU2V0LmV4cGFuZChcblx0XHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uc1RydWUsXG5cdFx0XHRcdHRoaXMucmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0KTtcblx0fVxuXG5cdGFnZ3JlZ2F0ZVJvb3RDb2x1bW5zICgpOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBleHBhbnNpb25NYXAgPSB0aGlzLmV4cGFuc2lvbk1hcDtcblxuXHRcdGlmICh0aGlzLmV4cGFuc2lvbk1hcFNpemUgPT09IDEpIHtcblx0XHRcdGNvbnN0IGV4cGFuc2lvblJlc3VsdCA9IGV4cGFuc2lvbk1hcFtnZXRGaXJzdFByb3BlcnR5KGV4cGFuc2lvbk1hcCkgYXMgc3RyaW5nXTtcblxuXHRcdFx0cmV0dXJuIGV4cGFuc2lvblJlc3VsdCAhPT0gbnVsbCA/IGV4cGFuc2lvblJlc3VsdC5kaWZmZXJlbmNlLnJvb3QgOiBbXTtcblx0XHR9XG5cblx0XHRjb25zdCByb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtblNldElkIGluIGV4cGFuc2lvbk1hcCkge1xuXHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gZXhwYW5zaW9uTWFwW2NvbHVtblNldElkXTtcblxuXHRcdFx0aWYgKGNvbHVtbkV4cGFuc2lvbiA9PT0gbnVsbCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5leHBhbmRSb290Q29sdW1uTWFwKFxuXHRcdFx0XHRjb2x1bW5FeHBhbnNpb24uZGlmZmVyZW5jZS5yb290LFxuXHRcdFx0XHRyb290Q29sdW1uTWFwLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5JbmZvRmFjdG9yeS5jb25zdHJ1Y3RGcm9tUm9vdE1hcChyb290Q29sdW1uTWFwKTtcblx0fVxuXG5cdHByaXZhdGUgZXhwYW5kUm9vdENvbHVtbk1hcCAoXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+Pixcblx0XHRkZXN0aW5hdGlvbjogUm9vdENvbHVtbk1hcCxcblx0KSB7XG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cblx0XHRcdGlmIChkZXN0aW5hdGlvbltjb2x1bW5JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JZF0gPSB7XG5cdFx0XHRcdFx0YXBpQ29sdW1uOiBjb2x1bW4uYXBpQ29sdW1uLFxuXHRcdFx0XHRcdGNoaWxkcmVuOiB7fSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5leHBhbmRSb290Q29sdW1uTWFwKFxuXHRcdFx0XHRjb2x1bW4uY2hpbGRyZW4sXG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbklkXS5jaGlsZHJlbixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlSZXF1ZXN0U2VydmljZSwgQ29sdW1uQ2FjaGUsIENvbHVtblV0aWwgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSwgUmVzcG9uc2VDb2x1bW4sIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5IYW5kbGVyIHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBjYWNoZTogQ29sdW1uQ2FjaGUsXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHQpIHtcblx0fVxuXG5cdHNldENvbHVtbiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlc3BvbnNlQ29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0KTogUmVzcG9uc2VDb2x1bW4ge1xuXHRcdHJldHVybiB0aGlzLmNhY2hlLnNldENvbHVtbihcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW4sXG5cdFx0KTtcblx0fVxuXG5cdHNldENvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIHtcblx0XHRyZXR1cm4gdGhpcy5jYWNoZS5zZXRDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXHR9XG5cblx0ZmV0Y2hJdGVtVHlwZVRyYW5zbGF0aW9ucyAoaXRlbVR5cGVzOiBJdGVtVHlwZVtdKTogUHJvbWlzZUludGVyZmFjZTx7W2l0ZW1UeXBlOiBzdHJpbmddOiBzdHJpbmd9PiB7XG5cdFx0Y29uc3QgcHJvbWlzZXM6IHtbaXRlbVR5cGU6IHN0cmluZ106IFByb21pc2VJbnRlcmZhY2U8UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcD59ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIG9mIGl0ZW1UeXBlcykge1xuXHRcdFx0cHJvbWlzZXNbaXRlbVR5cGVdID0gdGhpcy5mZXRjaChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFsnaWQnXSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHByb21pc2VzKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRjb25zdCByZXN1bHQ6IHtbaXRlbVR5cGU6IHN0cmluZ106IHN0cmluZ30gPSB7fTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gcmVzcG9uc2UpIHtcblx0XHRcdFx0XHRcdHJlc3VsdFtpdGVtVHlwZV0gPSByZXNwb25zZVtpdGVtVHlwZV1baXRlbVR5cGVdLmlkLm5hbWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHJlcXVlc3QgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRwYXJhbXMgPSB7ZmlsdGVyOiBmYWxzZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcD4ge1xuXHRcdHJldHVybiB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLmNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHtbaXRlbVR5cGVdOiBjb2x1bW5zfSxcblx0XHRcdHBhcmFtcyxcblx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0Y29sdW1uUmVzb3VyY2UgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNhY2hlLnNldENvbHVtbnMoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGNvbHVtbnMsXG5cdFx0XHRcdFx0XHRjb2x1bW5SZXNvdXJjZS5mZXRjaENvbHVtbnNPYmplY3QoKSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0ZmV0Y2ggKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cGFyYW1zPzogYW55LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXA+IHtcblx0XHRjb25zdCBjb2x1bW5SZXNvdXJjZSA9IHRoaXMuY2FjaGUucmV0cmlldmUoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRpZiAoY29sdW1uUmVzb3VyY2UubWlzc2luZyAhPT0gdHJ1ZSAmJiBjb2x1bW5SZXNvdXJjZS5taXNzaW5nLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihjb2x1bW5SZXNvdXJjZS5jYWNoZWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlcXVlc3QoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGNvbHVtblJlc291cmNlLm1pc3NpbmcsXG5cdFx0XHRwYXJhbXMsXG5cdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY29sdW1uVXRpbC5tZXJnZVJlc3BvbnNlQ29sdW1ucyhcblx0XHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHRcdGNvbHVtblJlc291cmNlLmNhY2hlZCxcblx0XHRcdFx0XHQpLm1lcmdlZDtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHRmZXRjaEFsbCAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogUHJvbWlzZUludGVyZmFjZTxSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwPiB7XG5cdFx0aWYgKHRoaXMuY2FjaGUuY29udGFpbnNBbGwoaXRlbVR5cGUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKHRoaXMuY2FjaGUuZ2V0Q29sdW1ucyhpdGVtVHlwZSkpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlcXVlc3QoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHRydWUsXG5cdFx0KTtcblx0fVxufVxuIiwiZXhwb3J0IGNvbnN0IEFMTF9QRVJNSVNTSU9OUyA9ICc3JztcblxuZXhwb3J0IGNvbnN0IENPTFVNTl9TRVBFUkFUT1IgPSAnPic7XG5leHBvcnQgY29uc3QgUkVOREVSX0FTX1NFUEVSQVRPUiA9ICc6JztcblxuZXhwb3J0IGNvbnN0IE5FV19QUkVGSVg6IHN0cmluZyA9ICctMSc7XG5leHBvcnQgY29uc3QgRFVQTElDQVRFX1BSRUZJWDogc3RyaW5nID0gJy0yJztcblxuZXhwb3J0IGNvbnN0IE5FV19LRVlXT1JEOiBzdHJpbmcgPSAnbmV3LSc7XG5leHBvcnQgY29uc3QgRFVQTElDQVRFX0tFWVdPUkQ6IHN0cmluZyA9ICdkdXAtJztcbiIsImltcG9ydCB7IENPTFVNTl9TRVBFUkFUT1IgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4ge1xuXHRpZDogc3RyaW5nO1xuXHRsZXZlbDogbnVtYmVyO1xuXHRwYXRoOiBzdHJpbmc7XG5cdHRhaWxQYXRoOiBzdHJpbmc7XG5cdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUgfCBudWxsID0gbnVsbDtcblx0Y2hpbGRyZW46IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0aXNMZWFmOiBib29sZWFuID0gdHJ1ZTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cmVhZG9ubHkgYXBpQ29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0XHRyZWFkb25seSBwYXJlbnQ6IENvbHVtbkluZm88SXRlbVR5cGU+IHwgbnVsbCA9IG51bGxcblx0KSB7XG5cdFx0Y29uc3QgY29sdW1uSWQgPSBhcGlDb2x1bW4uaWQ7XG5cblx0XHR0aGlzLmlkID0gY29sdW1uSWQ7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHR0aGlzLmxldmVsID0gMDtcblx0XHRcdHRoaXMucGF0aCA9IGNvbHVtbklkO1xuXHRcdFx0dGhpcy50YWlsUGF0aCA9ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmxldmVsID0gcGFyZW50LmxldmVsICsgMTtcblx0XHRcdHRoaXMucGF0aCA9IHBhcmVudC5wYXRoICsgQ09MVU1OX1NFUEVSQVRPUiArIGNvbHVtbklkO1xuXHRcdFx0dGhpcy50YWlsUGF0aCA9IHBhcmVudC5sZXZlbCA9PT0gMCA/XG5cdFx0XHRcdGNvbHVtbklkIDpcblx0XHRcdFx0cGFyZW50LnRhaWxQYXRoICsgQ09MVU1OX1NFUEVSQVRPUiArIGNvbHVtbklkO1xuXHRcdH1cblx0fVxuXG5cdHNldENoaWxkcmVuIChpdGVtVHlwZTogSXRlbVR5cGVUeXBlLCBjaGlsZHJlbjogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+Pik6IHRoaXMge1xuXHRcdHRoaXMuaXRlbVR5cGUgPSBpdGVtVHlwZTtcblx0XHR0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG5cdFx0dGhpcy5pc0xlYWYgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5JbmZvLCBDb2x1bW5VdGlsLCBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvbHVtblNldEZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbnMsIENvbHVtbkV4cGFuc2lvblJlc3VsdCwgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNvbnN0IGVtcHR5T2JqZWN0ID0ge307XG5sZXQgY3VycmVudElkID0gMDtcblxuZXhwb3J0IGNsYXNzIENvbHVtblNldDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4ge1xuXHRpZCA9ICsrY3VycmVudElkO1xuXG5cdHJlcXVlc3Q6IEFwaVJlcXVlc3RDb2x1bW5zO1xuXHRyZXF1ZXN0Q29sdW1uc1RydWU6IGJvb2xlYW47XG5cdHJlc3BvbnNlOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwID0gZW1wdHlPYmplY3Q7XG5cblx0bGluazogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+IHwgbnVsbCA9IG51bGw7XG5cdG1haW46IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0ZGVyaXZlZDogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRyb290OiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGxlYWY6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0Zm9ybWF0dGVkOiB7bWFpbjogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiwgZGVyaXZlZDogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+Pn0gPSB7XG5cdFx0bWFpbjogW10sXG5cdFx0ZGVyaXZlZDogW10sXG5cdH07XG5cdGZpbHRlcmVkOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGN1c3RvbTogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRzZWFyY2hhYmxlOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGl0ZW06IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0bm90SXRlbTogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJpdmF0ZSBjb2x1bW5TZXRGYWN0b3J5OiBDb2x1bW5TZXRGYWN0b3J5LFxuXHRcdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBncm91cENvbHVtbkluZm8gKGNvbHVtbkluZm86IENvbHVtbkluZm8pOiB2b2lkIHtcblx0XHRjb25zdCBjb2x1bW5VdGlsID0gdGhpcy5jb2x1bW5VdGlsO1xuXHRcdGNvbnN0IHJlc3BvbnNlQ29sdW1uID0gY29sdW1uSW5mby5hcGlDb2x1bW47XG5cdFx0Y29uc3QgaXNEZXJpdmVkID0gY29sdW1uSW5mby5wYXJlbnQgIT09IG51bGw7XG5cblx0XHRpZiAoaXNEZXJpdmVkKSB7XG5cdFx0XHR0aGlzLmRlcml2ZWQucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5tYWluLnB1c2goY29sdW1uSW5mbyk7XG5cblx0XHRcdGlmIChyZXNwb25zZUNvbHVtbi50eXBlID09PSAnbGluaycpIHtcblx0XHRcdFx0dGhpcy5saW5rID0gY29sdW1uSW5mbztcblx0XHRcdH1cblxuXHRcdFx0Ly8gd2UgY291bGQgcG9zc2libHkgYWRkIGRlcml2ZWQgY29sdW1ucyB0byAnbm90SXRlbSdcblx0XHRcdHRoaXNbY29sdW1uVXRpbC5pc0l0ZW1Db2x1bW4ocmVzcG9uc2VDb2x1bW4pID8gJ2l0ZW0nIDogJ25vdEl0ZW0nXS5wdXNoKGNvbHVtbkluZm8pO1xuXG5cdFx0XHRpZiAoIWNvbHVtbkluZm8uaXNMZWFmKSB7XG5cdFx0XHRcdHRoaXMucm9vdC5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5VdGlsLmlzRm9ybWF0dGVkQ29sdW1uKHJlc3BvbnNlQ29sdW1uKSkge1xuXHRcdFx0dGhpcy5mb3JtYXR0ZWRbaXNEZXJpdmVkID8gJ2Rlcml2ZWQnIDogJ21haW4nXS5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5VdGlsLmlzRmlsdGVyZWRDb2x1bW4ocmVzcG9uc2VDb2x1bW4pKSB7XG5cdFx0XHR0aGlzLmZpbHRlcmVkLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtblV0aWwuaXNTZWFyY2hhYmxlQ29sdW1uKHJlc3BvbnNlQ29sdW1uKSkge1xuXHRcdFx0dGhpcy5zZWFyY2hhYmxlLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtblV0aWwuaXNDdXN0b21Db2x1bW4ocmVzcG9uc2VDb2x1bW4pKSB7XG5cdFx0XHR0aGlzLmN1c3RvbS5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5JbmZvLmlzTGVhZikge1xuXHRcdFx0dGhpcy5sZWFmLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXHR9XG5cblx0dG9KU09OICgpIHtcblx0XHRjb25zdCBwYXJzZUNvbHVtbnMgPSAoY29sdW1uczogQ29sdW1uSW5mb1tdKSA9PiBjb2x1bW5zLm1hcChcblx0XHRcdGMgPT4gYy5pZCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bWFpbjogcGFyc2VDb2x1bW5zKHRoaXMubWFpbiksXG5cdFx0XHRkZXJpdmVkOiBwYXJzZUNvbHVtbnModGhpcy5kZXJpdmVkKSxcblx0XHR9O1xuXHR9XG5cblx0ZXhwYW5kUmVxdWVzdENvbHVtbnMgKGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zKTogdm9pZCB7XG5cdFx0Y29uc3QgbWVyZ2VkUmVxdWVzdENvbHVtbnMgPSB0aGlzLmNvbHVtblV0aWwubWVyZ2VSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdHRoaXMucmVxdWVzdCxcblx0XHRcdGNvbHVtbnMsXG5cdFx0KS5tZXJnZWQ7XG5cblx0XHR0aGlzLnJlcXVlc3QgPSBtZXJnZWRSZXF1ZXN0Q29sdW1ucztcblx0XHR0aGlzLnJlcXVlc3RDb2x1bW5zVHJ1ZSA9IG1lcmdlZFJlcXVlc3RDb2x1bW5zID09PSB0cnVlO1xuXHR9XG5cblx0aXNTdXBlcnNldE9mIChjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyk6IGJvb2xlYW4ge1xuXHRcdGlmIChjb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0Q29sdW1uc1RydWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sdW1uVXRpbCA9IHRoaXMuY29sdW1uVXRpbDtcblx0XHRjb25zdCByZXF1ZXN0Q29sdW1ucyA9IHRoaXMucmVxdWVzdDtcblxuXHRcdGlmIChyZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuICFjb2x1bW5VdGlsLmNvbnRhaW5zRGVyaXZlZENvbHVtbnMoY29sdW1ucyk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0aWYgKCFjb2x1bW5VdGlsLmNvbnRhaW5zQ29sdW1uKFxuXHRcdFx0XHRjb2x1bW4sXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRwcml2YXRlIGdldE1lcmdlZENvbHVtblNldCAoXG5cdFx0bWVyZ2VkUmVxdWVzdENvbHVtbnM6IFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdCxcblx0XHRtZXJnZWRSZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0cmVxdWVzdENvbHVtbnNUcnVlOiBib29sZWFuLFxuXHQpOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5jb2x1bW5TZXRGYWN0b3J5LmNvbnN0cnVjdDxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdG1lcmdlZFJlcXVlc3RDb2x1bW5zLm1lcmdlZCxcblx0XHRcdG1lcmdlZFJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmVzdWx0LnJlcXVlc3RDb2x1bW5zVHJ1ZSA9IHRoaXMucmVxdWVzdENvbHVtbnNUcnVlIHx8IHJlcXVlc3RDb2x1bW5zVHJ1ZTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRtZXJnZVJlcXVlc3RDb2x1bW5zIChyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMpOiBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtblV0aWwubWVyZ2VSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdHRoaXMucmVxdWVzdCxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdCk7XG5cdH1cblxuXHRtZXJnZVJlc3BvbnNlQ29sdW1ucyAocmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwKTogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1uVXRpbC5tZXJnZVJlc3BvbnNlQ29sdW1ucyhcblx0XHRcdHRoaXMucmVzcG9uc2UsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0KS5tZXJnZWQ7XG5cdH1cblxuXHRtZXJnZSAoY29sdW1uU2V0OiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPik6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRNZXJnZWRDb2x1bW5TZXQoXG5cdFx0XHR0aGlzLm1lcmdlUmVxdWVzdENvbHVtbnMoY29sdW1uU2V0LnJlcXVlc3QpLFxuXHRcdFx0dGhpcy5tZXJnZVJlc3BvbnNlQ29sdW1ucyhjb2x1bW5TZXQucmVzcG9uc2UpLFxuXHRcdFx0Y29sdW1uU2V0LnJlcXVlc3RDb2x1bW5zVHJ1ZSxcblx0XHQpO1xuXHR9XG5cblx0ZXhwYW5kIChcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cmVxdWVzdENvbHVtbnNUcnVlOiBib29sZWFuLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IG1lcmdlZFJlcXVlc3RDb2x1bW5zID0gdGhpcy5tZXJnZVJlcXVlc3RDb2x1bW5zKHJlcXVlc3RDb2x1bW5zKTtcblx0XHRjb25zdCBtZXJnZWRSZXNwb25zZUNvbHVtbnMgPSB0aGlzLm1lcmdlUmVzcG9uc2VDb2x1bW5zKHJlc3BvbnNlQ29sdW1ucyk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVyZ2VkOiB0aGlzLmdldE1lcmdlZENvbHVtblNldChcblx0XHRcdFx0bWVyZ2VkUmVxdWVzdENvbHVtbnMsXG5cdFx0XHRcdG1lcmdlZFJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0cmVxdWVzdENvbHVtbnNUcnVlLFxuXHRcdFx0KSxcblx0XHRcdGRpZmZlcmVuY2U6IHRoaXMuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlPihcblx0XHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdFx0bWVyZ2VkUmVxdWVzdENvbHVtbnMuZGlmZmVyZW5jZSxcblx0XHRcdFx0bWVyZ2VkUmVzcG9uc2VDb2x1bW5zLCAvLyB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gbG9vayB1cCB0aGUgcGFyZW50IG9mIGRlcml2ZWQgY29sdW1uc1xuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdClcblx0XHR9O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5TZXQgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiB7XG5cdHByaXZhdGUgY2FjaGU6IHtbY29sdW1uU2V0SWQ6IG51bWJlcl06IGJvb2xlYW59ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHB1YmxpYyByZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnNcblx0KSB7XG5cblx0fVxuXG5cdHJ1biAoY29sdW1uU2V0OiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblx0XHRjb25zdCBjb2x1bW5TZXRJZCA9IGNvbHVtblNldC5pZDtcblxuXHRcdGlmIChjYWNoZVtjb2x1bW5TZXRJZF0gIT09IHVuZGVmaW5lZClcblx0XHRcdHJldHVybiBjYWNoZVtjb2x1bW5TZXRJZF07XG5cblx0XHRyZXR1cm4gY2FjaGVbY29sdW1uU2V0SWRdID0gY29sdW1uU2V0LmlzU3VwZXJzZXRPZih0aGlzLnJlcXVlc3RDb2x1bW5zKTtcblx0fVxufVxuIiwiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IENPTFVNTl9TRVBFUkFUT1IsIFJFTkRFUl9BU19TRVBFUkFUT1IgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9MaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UnO1xuaW1wb3J0IHtcblx0QXBpTGlua1RyZWVUeXBlLFxuXHRBcGlSZXF1ZXN0Q29sdW1uLFxuXHRBcGlSZXF1ZXN0Q29sdW1ucyxcblx0SXRlbVR5cGUsXG5cdFJlc3BvbnNlQ29sdW1uLFxuXHRSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRSZXNwb25zZUNvbHVtbk1hcCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBleHRlbmQsIGlzRGVmaW5lZCB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdDxUIGV4dGVuZHMgQXBpUmVxdWVzdENvbHVtbnMgPSBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0VSBleHRlbmRzIEFwaVJlcXVlc3RDb2x1bW5zID0gQXBpUmVxdWVzdENvbHVtbnM+ID0ge21lcmdlZDogVCwgZGlmZmVyZW5jZTogVX07XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5VdGlsIHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBsaW5rVHJlZVNlcnZpY2U6IExpbmtUcmVlU2VydmljZUludGVyZmFjZSxcblx0KSB7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENoZWNrcyB0aGUge0BsaW5rIEFwaUxpbmtUcmVlIExpbmtUcmVlfSBhbmQgcmV0dXJucyB0aGUgbGluayBjb2x1bW5JZHMgZm9yIHRoZSBnaXZlbiBJdGVtVHlwZVxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIC0gRm9yIHtAbGluayBBcGlMaW5rVHJlZVR5cGUuRElSRUNUIGRpcmVjdCBsaW5rc30gaXQgd2lsbCBiZSBhIGNvbHVtbklkXG5cdCAqIC0gRm9yIHtAbGluayBBcGlMaW5rVHJlZVR5cGUuSVRFTVRBQkxFIGl0ZW10YWJsZSBsaW5rc30gaXQgd2lsbCBiZSAnaXRlbXR5cGUnIGFuZCAnaXRlbSdcblx0ICovXG5cdHB1YmxpYyBnZXRDb2x1bW5zRnJvbUxpbmsgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0KTogQXBpUmVxdWVzdENvbHVtbltdIHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnRUeXBlXVtpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdHN3aXRjaCAobGlua1RyZWVFbnRyeS50eXBlKSB7XG5cdFx0XHRjYXNlIEFwaUxpbmtUcmVlVHlwZS5ESVJFQ1Q6XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGxpbmtUcmVlRW50cnkuZmllbGQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgQXBpTGlua1RyZWVUeXBlLklURU1UQUJMRTpcblx0XHRcdFx0cmVzdWx0LnB1c2goJ2l0ZW10eXBlJyk7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKCdpdGVtJyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRDb2x1bW5QYXRoIChcblx0XHRjb2x1bW5zOiBSZXNwb25zZUNvbHVtbltdLFxuXHRcdHJlbmRlckFzOiBudWxsIHwgc3RyaW5nLFxuXHQpIHtcblx0XHRsZXQgc2VwYXJhdG9yID0gJyc7XG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0cmVzdWx0ICs9IHNlcGFyYXRvciArIGNvbHVtbi5pZDtcblx0XHRcdHNlcGFyYXRvciA9IENPTFVNTl9TRVBFUkFUT1I7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbmRlckFzICE9PSBudWxsKSB7XG5cdFx0XHRyZXN1bHQgKz0gUkVOREVSX0FTX1NFUEVSQVRPUiArIHJlbmRlckFzO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXREYXRlRm9ybWF0T3B0aW9ucyAoY29sdW1uVHlwZT86ICdkYXRldGltZScpIHtcblx0XHRjb25zdCBub3cgPSBtb21lbnQoKTtcblxuXHRcdGNvbnN0IGZvcm1hdHMgPSB7XG5cdFx0XHQnSi1NLVknOiBub3cuZm9ybWF0KCdERC1NTS1ZWVlZJyksXG5cdFx0XHQnSi1NJzogbm93LmZvcm1hdCgnREQtTU0nKSxcblx0XHRcdCdqK0YrWSc6IG5vdy5mb3JtYXQoJ0QgTU1NIFlZWVknKSxcblx0XHRcdCdEK2orRitZJzogbm93LmZvcm1hdCgnZGRkZCBEIE1NTSBZWVlZJyksXG5cdFx0XHQnRic6IG5vdy5mb3JtYXQoJ01NTScpLFxuXHRcdFx0J2YnOiBub3cuZm9ybWF0KCdNTU1NJyksXG5cdFx0XHQnRCc6IG5vdy5mb3JtYXQoJ2RkZGQnKSxcblx0XHRcdCdkJzogbm93LmZvcm1hdCgnZGRkJyksXG5cdFx0fTtcblxuXHRcdGlmIChjb2x1bW5UeXBlID09PSAnZGF0ZXRpbWUnKSB7XG5cdFx0XHRleHRlbmQoXG5cdFx0XHRcdGZvcm1hdHMsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQnSi1NLVkrSDppJzogbm93LmZvcm1hdCgnREQtTU0tWVlZWSBISDptbScpLFxuXHRcdFx0XHRcdCdKLU0rSDppJzogbm93LmZvcm1hdCgnREQtTU0gSEg6bW0nKSxcblx0XHRcdFx0XHQnaitGK1krSDppJzogbm93LmZvcm1hdCgnREQgTU1NTSBZIEhIOm1tJyksXG5cdFx0XHRcdFx0J0QraitGK1krSDppJzogbm93LmZvcm1hdCgnZGRkZCBERCBNTU0gWSBISDptbScpLFxuXHRcdFx0XHRcdCdIOmknOiBub3cuZm9ybWF0KCdISDptbScpLFxuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm9ybWF0cztcblx0fVxuXG5cdGlzU3RyaW5nQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZW1haWwnOlxuXHRcdFx0Y2FzZSAncGhvbmUnOlxuXHRcdFx0Y2FzZSAndXJsJzpcblx0XHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0Y2FzZSAnbG9uZ3RleHQnOlxuXHRcdFx0Y2FzZSAndGV4dHJlcGxhY2UnOlxuXHRcdFx0XHQvLyBjYXNlICdodG1sJzogLy8gVE9ETzogc29ydCBvbiBmaWx0ZXJlZCB2YWx1ZVxuXHRcdFx0XHQvLyBjYXNlICdlbnVtJzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aXNGbG9hdENvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RvdWJsZSc6IC8vIGZsb2F0aW5nIHBvaW50IHR5cGVzXG5cdFx0XHRjYXNlICd2b2x1bWUnOlxuXHRcdFx0Y2FzZSAnd2VpZ2h0Jzpcblx0XHRcdGNhc2UgJ2Rpc3RhbmNlJzpcblx0XHRcdGNhc2UgJ2RpbWVuc2lvbic6XG5cdFx0XHRjYXNlICdwb3dlcic6XG5cdFx0XHRjYXNlICdjdXJyZW50Jzpcblx0XHRcdGNhc2UgJ3ByaWNlJzpcblx0XHRcdGNhc2UgJ3BlcmNlbnRhZ2UnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc0ludENvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2ludCc6IC8vIGludGVnZXIgdHlwZXNcblx0XHRcdGNhc2UgJ251bWJlcic6XG5cdFx0XHRjYXNlICdxdWFudGl0eSc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzTnVtYmVyQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuaXNGbG9hdENvbHVtbihjb2x1bW4pIHx8IHRoaXMuaXNJbnRDb2x1bW4oY29sdW1uKTtcblx0fVxuXG5cdGlzQ3VzdG9tQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGNvbHVtbi5maWVsZHR5cGUgPT09ICdjdXN0b21maWVsZCc7XG5cdH1cblxuXHRpc0l0ZW1Db2x1bW4gKFxuXHRcdGNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdFx0aW5jbHVkZUlkID0gdHJ1ZSxcblx0KTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnaWQnOlxuXHRcdFx0XHRyZXR1cm4gaW5jbHVkZUlkO1xuXHRcdFx0Y2FzZSAnaXRlbSc6XG5cdFx0XHRjYXNlICdjaGlsZCc6XG5cdFx0XHRjYXNlICdzaWJsaW5nJzpcblx0XHRcdGNhc2UgJ2xpbmsnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc0RhdGVDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aXNSZW5kZXJlZENvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc0ZpbHRlcmVkQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0Ly8gdWdseSBoYWNrIDotKFxuXHRcdGlmIChjb2x1bW4uaWQgPT09ICdzdGFmZmVsJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtbi5nZW5lcmF0b3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAncHJpY2UnOlxuXHRcdFx0Y2FzZSAnYm9vbCc6XG5cdFx0XHRjYXNlICdlbnVtJzpcblx0XHRcdGNhc2UgJ2NvdW50cnknOlxuXHRcdFx0Y2FzZSAndm9sdW1lJzpcblx0XHRcdGNhc2UgJ3dlaWdodCc6XG5cdFx0XHRjYXNlICdkaXN0YW5jZSc6XG5cdFx0XHRjYXNlICdkaW1lbnNpb24nOlxuXHRcdFx0Y2FzZSAncXVhbnRpdHknOlxuXHRcdFx0Y2FzZSAnZW1haWwnOlxuXHRcdFx0Y2FzZSAndXJsJzpcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAndGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRjYXNlICdodG1sJzpcblx0XHRcdGNhc2UgJ3RleHRyZXBsYWNlJzpcblx0XHRcdGNhc2UgJ2xvbmd0ZXh0Jzpcblx0XHRcdGNhc2UgJ3BlcmNlbnRhZ2UnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc0Zvcm1hdHRlZENvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAndGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRjYXNlICdjb2xvcic6XG5cdFx0XHRjYXNlICdqc29uJzpcblx0XHRcdGNhc2UgJ251bWJlcic6XG5cdFx0XHRjYXNlICdmaWxlc2l6ZSc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzU2VsZWN0YWJsZUNvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2Jsb2InOlxuXHRcdFx0Y2FzZSAnY29vcmRpbmF0ZSc6XG5cdFx0XHRjYXNlICdmb3JjZXVwZGF0ZSc6XG5cdFx0XHRjYXNlICdpZCc6XG5cdFx0XHRjYXNlICdqc29uJzpcblx0XHRcdGNhc2UgJ29yZGVyJzpcblx0XHRcdGNhc2UgJ3BhcmVudGlkJzpcblx0XHRcdGNhc2UgJ3BhcmVudHR5cGUnOlxuXHRcdFx0Y2FzZSAncGFzc3dvcmQnOlxuXHRcdFx0Y2FzZSAndG9rZW4nOlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRoYXNMb2NhdGlvblByb3BlcnR5IChcblx0XHRjb2x1bW46IFJlc3BvbnNlQ29sdW1uLFxuXHRcdGxvY2F0aW9uOiBudW1iZXIsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG5cdFx0cmV0dXJuIChsb2NhdGlvbiAmIGNvbHVtbi5sb2NhdGlvbikgIT09IDA7XG5cdH1cblxuXHRpc0VkaXRhYmxlQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0aWYgKGNvbHVtbi5yZWFkT25seSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpc1NlYXJjaGFibGVDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdlbWFpbCc6XG5cdFx0XHRjYXNlICdwaG9uZSc6XG5cdFx0XHRjYXNlICd0ZXh0Jzpcblx0XHRcdGNhc2UgJ2xvbmd0ZXh0Jzpcblx0XHRcdGNhc2UgJ2h0bWwnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRnZXREZWZhdWx0V2VpZ2h0IChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogbnVtYmVyIHtcblx0XHQvLyBcdFx0XHRjb25zb2xlLmxvZygnZ2V0RGVmYXVsdFdlaWdodCcsIGNvbHVtbik7XG5cblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdkb3VibGUnOlxuXHRcdFx0Y2FzZSAncHJpY2UnOlxuXHRcdFx0Y2FzZSAnYm9vbCc6XG5cdFx0XHRjYXNlICdpbnQnOlxuXHRcdFx0Y2FzZSAncGVyY2VudGFnZSc6XG5cdFx0XHRjYXNlICdjb2xvcic6XG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0Y2FzZSAncG93ZXInOlxuXHRcdFx0Y2FzZSAnY3VycmVudCc6XG5cdFx0XHRcdHJldHVybiAwLjU7XG5cblx0XHRcdGNhc2UgJ3VybCc6XG5cdFx0XHRjYXNlICdlbnVtJzpcblx0XHRcdGNhc2UgJ2VtYWlsJzpcblx0XHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0Y2FzZSAnaXRlbSc6XG5cdFx0XHRjYXNlICdsaW5rJzpcblx0XHRcdFx0cmV0dXJuIDEuNTtcblxuXHRcdFx0Y2FzZSAnbG9uZ3RleHQnOlxuXHRcdFx0Y2FzZSAnaHRtbCc6XG5cdFx0XHRjYXNlICd0ZXh0cmVwbGFjZSc6XG5cdFx0XHRcdHJldHVybiAyO1xuXG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ3RpbWUnOlxuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdH1cblx0fVxuXG5cdGdldENvbXBhcmF0b3JzIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uICYge3R5cGU6ICdkaW1lbnNpb24nIHwgJ3dlaWdodCcgfCAncHJpY2UnfSk6IFsnPScsICc+JywgJzwnXTtcblx0Z2V0Q29tcGFyYXRvcnMgKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4gJiB7dHlwZTogJ2RhdGUnIHwgJ2RhdGV0aW1lJyB8ICd0aW1lJyB8ICdkdXJhdGlvbid9KTogWyc+JywgJzwnXTtcblx0Z2V0Q29tcGFyYXRvcnMgKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBbJz0nLCAnIT0nXTtcblx0Z2V0Q29tcGFyYXRvcnMgKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdkaW1lbnNpb24nOlxuXHRcdFx0Y2FzZSAnd2VpZ2h0Jzpcblx0XHRcdGNhc2UgJ3ByaWNlJzpcblx0XHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0XHQnPScsXG5cdFx0XHRcdFx0Jz4nLFxuXHRcdFx0XHRcdCc8Jyxcblx0XHRcdFx0XTtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAndGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiBbXG5cdFx0XHRcdFx0Jz4nLFxuXHRcdFx0XHRcdCc8Jyxcblx0XHRcdFx0XTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBbXG5cdFx0XHRcdFx0Jz0nLFxuXHRcdFx0XHRcdCchPScsXG5cdFx0XHRcdF07XG5cdFx0fVxuXHR9XG5cblx0Y29udGFpbnNDb2x1bW4gKFxuXHRcdHJlcXVlc3RDb2x1bW46IEFwaVJlcXVlc3RDb2x1bW4sXG5cdFx0ZGVzdGluYXRpb246IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5wYXJzZVJlcXVlc3RDb2x1bW4ocmVxdWVzdENvbHVtbik7XG5cdFx0Y29uc3QgY29sdW1uSW5kZXggPSB0aGlzLmZpbmRSZXF1ZXN0Q29sdW1uKFxuXHRcdFx0Y29sdW1uLmlkLFxuXHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0KTtcblxuXHRcdGlmIChjb2x1bW5JbmRleCA9PT0gLTEpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBkZXN0aW5hdGlvbltjb2x1bW5JbmRleF0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjaGlsZENvbHVtbiBvZiBjb2x1bW4uY2hpbGRyZW4pIHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGlmICghdGhpcy5jb250YWluc0NvbHVtbihcblx0XHRcdFx0Y2hpbGRDb2x1bW4sXG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbkluZGV4XVtjb2x1bW4uaWRdLFxuXHRcdFx0KSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRjb250YWluc0Rlcml2ZWRDb2x1bW5zIChyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdKTogYm9vbGVhbiB7XG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgcmVxdWVzdENvbHVtbnMpIHtcblx0XHRcdGlmICh0aGlzLnBhcnNlUmVxdWVzdENvbHVtbihjb2x1bW4pLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmVzcG9uc2VDb2x1bW5zQXZhaWxhYmxlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0XHRyZXNwb25zZUNvbHVtbk1hcDogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogYm9vbGVhbiB7XG5cdFx0Zm9yIChjb25zdCByZXF1ZXN0Q29sdW1uIG9mIHJlcXVlc3RDb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBwYXJzZWRDb2x1bW4gPSB0aGlzLnBhcnNlUmVxdWVzdENvbHVtbihyZXF1ZXN0Q29sdW1uKTtcblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gcGFyc2VkQ29sdW1uLmNoaWxkcmVuO1xuXHRcdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW5zID0gcmVzcG9uc2VDb2x1bW5NYXBbaXRlbVR5cGVdO1xuXHRcdFx0bGV0IHJlc3BvbnNlQ29sdW1uO1xuXG5cdFx0XHRpZiAocmVzcG9uc2VDb2x1bW5zID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXNwb25zZUNvbHVtbiA9IHJlc3BvbnNlQ29sdW1uc1twYXJzZWRDb2x1bW4uaWRdO1xuXG5cdFx0XHRpZiAocmVzcG9uc2VDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChcblx0XHRcdFx0Y2hpbGRyZW4ubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHQhdGhpcy5yZXNwb25zZUNvbHVtbnNBdmFpbGFibGUoXG5cdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdFx0Y2hpbGRyZW4sXG5cdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5NYXAsXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRjb3B5UmVxdWVzdENvbHVtbnMgKGNvbHVtbnM6IHRydWUpOiB0cnVlO1xuXHRjb3B5UmVxdWVzdENvbHVtbnMgKGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSk6IEFwaVJlcXVlc3RDb2x1bW5bXTtcblx0Y29weVJlcXVlc3RDb2x1bW5zIChjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyk6IEFwaVJlcXVlc3RDb2x1bW5zIHtcblx0XHRpZiAoY29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzdWx0OiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdHJlc3VsdC5wdXNoKHRoaXMuY29weVJlcXVlc3RDb2x1bW4oY29sdW1uKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGNvcHlSZXF1ZXN0Q29sdW1uIChyZXF1ZXN0Q29sdW1uOiBBcGlSZXF1ZXN0Q29sdW1uKTogQXBpUmVxdWVzdENvbHVtbiB7XG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5wYXJzZVJlcXVlc3RDb2x1bW4ocmVxdWVzdENvbHVtbik7XG5cblx0XHRpZiAoY29sdW1uLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIGNvbHVtbi5pZDtcblx0XHR9XG5cblx0XHRjb25zdCBjaGlsZHJlbjogQXBpUmVxdWVzdENvbHVtbltdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNoaWxkQ29sdW1uIG9mIGNvbHVtbi5jaGlsZHJlbikge1xuXHRcdFx0Y2hpbGRyZW4ucHVzaCh0aGlzLmNvcHlSZXF1ZXN0Q29sdW1uKGNoaWxkQ29sdW1uKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtbY29sdW1uLmlkXTogY2hpbGRyZW59O1xuXHR9XG5cblx0bWVyZ2VSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0Zmlyc3Q6IHRydWUsXG5cdFx0c2Vjb25kOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0PHRydWUsIFtdPjtcblx0bWVyZ2VSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0Zmlyc3Q6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0XHRzZWNvbmQ6IHRydWUsXG5cdCk6IFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdDx0cnVlLCB0cnVlPjtcblx0bWVyZ2VSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0Zmlyc3Q6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0XHRzZWNvbmQ6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KTpcblx0XHRSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQ8QXBpUmVxdWVzdENvbHVtbltdLCBBcGlSZXF1ZXN0Q29sdW1uW10+O1xuXHRtZXJnZVJlcXVlc3RDb2x1bW5zIChcblx0XHRmaXJzdDogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0c2Vjb25kOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogTWVyZ2VzIHRoZSBwYXNzZWQgY29sdW1ucyBhbmQgcmV0dXJucyB0aGUgbWVyZ2VkIHNldCBhbmQgdGhlIGRpZmZlcmVuY2UuXG5cdCAqXG5cdCAqIEByZXR1cm5zXG5cdCAqIC0gTWVyZ2VkOiBUaGUgbWVyZ2VkIHNldCBvZiBjb2x1bW5zXG5cdCAqIC0gRGlmZmVyZW5jZTogQ29sdW1ucyB0aGF0IGFyZSBpbiBzZWNvbmQsIGJ1dCBub3QgaW4gZmlyc3Rcblx0ICovXG5cdG1lcmdlUmVxdWVzdENvbHVtbnMgKFxuXHRcdGZpcnN0OiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRzZWNvbmQ6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQge1xuXHRcdGlmIChmaXJzdCA9PT0gdHJ1ZSkgLy8gPT09IG9wZXJhdG9yIG5lZWRlZCBoZXJlXG5cdFx0e1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bWVyZ2VkOiB0cnVlLFxuXHRcdFx0XHRkaWZmZXJlbmNlOiBbXSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHNlY29uZCA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bWVyZ2VkOiB0cnVlLFxuXHRcdFx0XHRkaWZmZXJlbmNlOiB0cnVlLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRjb25zdCBtZXJnZWQgPSB0aGlzLmNvcHlSZXF1ZXN0Q29sdW1ucyhmaXJzdCk7XG5cdFx0Y29uc3QgZGlmZmVyZW5jZTogQXBpUmVxdWVzdENvbHVtbltdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBzZWNvbmQpIHtcblx0XHRcdGNvbnN0IGFkZGVkQ29sdW1uID0gdGhpcy5tZXJnZVJlcXVlc3RDb2x1bW4oXG5cdFx0XHRcdGNvbHVtbixcblx0XHRcdFx0bWVyZ2VkLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGFkZGVkQ29sdW1uICE9PSBudWxsKSB7XG5cdFx0XHRcdGRpZmZlcmVuY2UucHVzaChhZGRlZENvbHVtbik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lcmdlZDogbWVyZ2VkLFxuXHRcdFx0ZGlmZmVyZW5jZTogZGlmZmVyZW5jZSxcblx0XHR9O1xuXHR9XG5cblx0bWVyZ2VSZXF1ZXN0Q29sdW1uIChcblx0XHRyZXF1ZXN0Q29sdW1uOiBBcGlSZXF1ZXN0Q29sdW1uLFxuXHRcdGRlc3RpbmF0aW9uOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdCkge1xuXHRcdGNvbnN0IGNvbHVtbiA9IHRoaXMucGFyc2VSZXF1ZXN0Q29sdW1uKHJlcXVlc3RDb2x1bW4pO1xuXHRcdGNvbnN0IGNvbHVtbkluZGV4ID0gdGhpcy5maW5kUmVxdWVzdENvbHVtbihcblx0XHRcdGNvbHVtbi5pZCxcblx0XHRcdGRlc3RpbmF0aW9uLFxuXHRcdCk7XG5cblx0XHRpZiAoY29sdW1uSW5kZXggPT09IC0xKSB7XG5cdFx0XHRkZXN0aW5hdGlvbi5wdXNoKHJlcXVlc3RDb2x1bW4pO1xuXHRcdFx0cmV0dXJuIHJlcXVlc3RDb2x1bW47XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtbi5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgZGVzdGluYXRpb25bY29sdW1uSW5kZXhdID09PSAnc3RyaW5nJykge1xuXHRcdFx0ZGVzdGluYXRpb25bY29sdW1uSW5kZXhdID0ge1xuXHRcdFx0XHRbY29sdW1uLmlkXTogW10sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IGFkZGVkQ29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMgPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY2hpbGRDb2x1bW4gb2YgY29sdW1uLmNoaWxkcmVuKSB7XG5cdFx0XHRjb25zdCBhZGRlZENvbHVtbiA9IHRoaXMubWVyZ2VSZXF1ZXN0Q29sdW1uKFxuXHRcdFx0XHRjaGlsZENvbHVtbixcblx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JbmRleF1bY29sdW1uLmlkXSxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChhZGRlZENvbHVtbiAhPT0gbnVsbCkge1xuXHRcdFx0XHRhZGRlZENvbHVtbnMucHVzaChhZGRlZENvbHVtbik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGFkZGVkQ29sdW1ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdHJldHVybiB7W2NvbHVtbi5pZF06IGFkZGVkQ29sdW1uc307XG5cdH1cblxuXHRnZXRSZXF1ZXN0Q29sdW1uSWQgKHJlcXVlc3RDb2x1bW46IEFwaVJlcXVlc3RDb2x1bW4pOiBzdHJpbmcge1xuXHRcdGlmICh0eXBlb2YgcmVxdWVzdENvbHVtbiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiByZXF1ZXN0Q29sdW1uO1xuXHRcdH1cblxuXHRcdGxldCBjb2x1bW5JZDtcblxuXHRcdGZvciAoY29sdW1uSWQgaW4gcmVxdWVzdENvbHVtbikge1xuXHRcdH1cblxuXHRcdHJldHVybiBjb2x1bW5JZCBhcyBzdHJpbmc7XG5cdH1cblxuXHRwYXJzZVJlcXVlc3RDb2x1bW4gKHJlcXVlc3RDb2x1bW46IEFwaVJlcXVlc3RDb2x1bW4pOiB7aWQ6IHN0cmluZywgY2hpbGRyZW46IEFwaVJlcXVlc3RDb2x1bW5bXX0ge1xuXHRcdGlmICh0eXBlb2YgcmVxdWVzdENvbHVtbiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGlkOiByZXF1ZXN0Q29sdW1uLFxuXHRcdFx0XHRjaGlsZHJlbjogW10sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGxldCBjb2x1bW5JZDtcblxuXHRcdGZvciAoY29sdW1uSWQgaW4gcmVxdWVzdENvbHVtbikge1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRpZDogY29sdW1uSWQgYXMgc3RyaW5nLFxuXHRcdFx0Y2hpbGRyZW46IHJlcXVlc3RDb2x1bW5bY29sdW1uSWQgYXMgc3RyaW5nXSxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBNZXJnZXMgdHdvIHNldHMgb2Yge0BsaW5rIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcHN9LlxuXHQgKlxuXHQgKiBAcmV0dXJuc1xuXHQgKiAtIE1lcmdlZDogVGhlIG1lcmdlZCBzZXQgb2YgY29sdW1uc1xuXHQgKiAtIERpZmZlcmVuY2U6IENvbHVtbnMgdGhhdCBhcmUgaW4gc2Vjb25kLCBidXQgbm90IGluIGZpcnN0XG5cdCAqL1xuXHRtZXJnZVJlc3BvbnNlQ29sdW1ucyAoXG5cdFx0Zmlyc3Q6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0c2Vjb25kOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiB7bWVyZ2VkOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLCBkaWZmZXJlbmNlOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwfSB7XG5cdFx0Y29uc3QgbWVyZ2VkOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwID0ge307XG5cdFx0Y29uc3QgZGlmZmVyZW5jZTogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBmaXJzdCkge1xuXHRcdFx0aWYgKHNlY29uZFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRtZXJnZWRbaXRlbVR5cGVdID0gZmlyc3RbaXRlbVR5cGVdO1xuXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBtZXJnZVJlc3VsdCA9IHRoaXMubWVyZ2VSZXNwb25zZUNvbHVtbk1hcChcblx0XHRcdFx0Zmlyc3RbaXRlbVR5cGVdLFxuXHRcdFx0XHRzZWNvbmRbaXRlbVR5cGVdLFxuXHRcdFx0KTtcblxuXHRcdFx0bWVyZ2VkW2l0ZW1UeXBlXSA9IG1lcmdlUmVzdWx0Lm1lcmdlZDtcblx0XHRcdGRpZmZlcmVuY2VbaXRlbVR5cGVdID0gbWVyZ2VSZXN1bHQuZGlmZmVyZW5jZTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIHNlY29uZCkge1xuXHRcdFx0aWYgKGZpcnN0W2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG1lcmdlZFtpdGVtVHlwZV0gPSBzZWNvbmRbaXRlbVR5cGVdO1xuXHRcdFx0XHRkaWZmZXJlbmNlW2l0ZW1UeXBlXSA9IHNlY29uZFtpdGVtVHlwZV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lcmdlZDogbWVyZ2VkLFxuXHRcdFx0ZGlmZmVyZW5jZTogZGlmZmVyZW5jZSxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBNZXJnZXMgdHdvIHNldHMgb2Yge0BsaW5rIFJlc3BvbnNlQ29sdW1uTWFwIHJlc3BvbnNlIGNvbHVtbnN9LlxuXHQgKlxuXHQgKiBAcmV0dXJuc1xuXHQgKiAtIE1lcmdlZDogVGhlIG1lcmdlZCBzZXQgb2YgY29sdW1uc1xuXHQgKiAtIERpZmZlcmVuY2U6IENvbHVtbnMgdGhhdCBhcmUgaW4gc2Vjb25kLCBidXQgbm90IGluIGZpcnN0XG5cdCAqL1xuXHRtZXJnZVJlc3BvbnNlQ29sdW1uTWFwIChcblx0XHRmaXJzdDogUmVzcG9uc2VDb2x1bW5NYXAsXG5cdFx0c2Vjb25kOiBSZXNwb25zZUNvbHVtbk1hcCxcblx0KToge21lcmdlZDogUmVzcG9uc2VDb2x1bW5NYXAsIGRpZmZlcmVuY2U6IFJlc3BvbnNlQ29sdW1uTWFwfSB7XG5cdFx0Y29uc3QgbWVyZ2VkOiBSZXNwb25zZUNvbHVtbk1hcCA9IHt9O1xuXHRcdGNvbnN0IGRpZmZlcmVuY2U6IFJlc3BvbnNlQ29sdW1uTWFwID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIGZpcnN0KSB7XG5cdFx0XHRtZXJnZWRbY29sdW1uSWRdID0gZmlyc3RbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gc2Vjb25kKSB7XG5cdFx0XHRpZiAoaXNEZWZpbmVkKGZpcnN0W2NvbHVtbklkXSkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdG1lcmdlZFtjb2x1bW5JZF0gPSBzZWNvbmRbY29sdW1uSWRdO1xuXHRcdFx0ZGlmZmVyZW5jZVtjb2x1bW5JZF0gPSBzZWNvbmRbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRtZXJnZWQ6IG1lcmdlZCxcblx0XHRcdGRpZmZlcmVuY2U6IGRpZmZlcmVuY2UsXG5cdFx0fTtcblx0fVxuXG5cdGlzTG9jYWxDb2x1bW5JZCAoY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBjb2x1bW5JZC5zdWJzdHJpbmcoXG5cdFx0XHQwLFxuXHRcdFx0Mixcblx0XHQpID09PSAnX18nO1xuXHR9XG5cblx0cHJvY2Vzc0NvbmZpZ0NvbHVtbnMgKGNvbmZpZ0NvbHVtbnM6IHN0cmluZ1tdKTogQXBpUmVxdWVzdENvbHVtbltdIHtcblx0XHRjb25zdCByZXF1ZXN0OiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbmZpZ0NvbHVtbnMpIHtcblx0XHRcdGlmICh0aGlzLmlzTG9jYWxDb2x1bW5JZChjb2x1bW4pKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnByb2Nlc3NDb25maWdDb2x1bW4oXG5cdFx0XHRcdHRoaXMucGFyc2VDb25maWdDb2x1bW4oY29sdW1uKSxcblx0XHRcdFx0cmVxdWVzdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlcXVlc3Q7XG5cdH1cblxuXHRwYXJzZUNvbmZpZ0NvbHVtbiAoY29uZmlnQ29sdW1uOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIGNvbmZpZ0NvbHVtbi5zcGxpdChSRU5ERVJfQVNfU0VQRVJBVE9SKVswXS5zcGxpdChDT0xVTU5fU0VQRVJBVE9SKTtcblx0fVxuXG5cdHByb2Nlc3NDb25maWdDb2x1bW4gKFxuXHRcdHBhcnNlZENvbmZpZ0NvbHVtbjogc3RyaW5nW10sXG5cdFx0ZGVzdGluYXRpb246IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KSB7XG5cdFx0Y29uc3QgY29sdW1uSWQgPSBwYXJzZWRDb25maWdDb2x1bW5bMF07XG5cdFx0Y29uc3QgaXNMZWFmID0gcGFyc2VkQ29uZmlnQ29sdW1uLmxlbmd0aCA9PT0gMTtcblx0XHRsZXQgY29sdW1uSW5kZXggPSB0aGlzLmZpbmRSZXF1ZXN0Q29sdW1uKFxuXHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRkZXN0aW5hdGlvbixcblx0XHQpO1xuXG5cdFx0aWYgKGlzTGVhZikge1xuXHRcdFx0aWYgKGNvbHVtbkluZGV4ID09PSAtMSkge1xuXHRcdFx0XHRkZXN0aW5hdGlvbi5wdXNoKGNvbHVtbklkKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5JbmRleCA9PT0gLTEpIHtcblx0XHRcdGNvbHVtbkluZGV4ID0gZGVzdGluYXRpb24ucHVzaCh7W2NvbHVtbklkXTogW119KSAtIDE7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgZGVzdGluYXRpb25bY29sdW1uSW5kZXhdID09PSAnc3RyaW5nJykge1xuXHRcdFx0ZGVzdGluYXRpb25bY29sdW1uSW5kZXhdID0ge1tjb2x1bW5JZF06IFtdfTtcblx0XHR9XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0dGhpcy5wcm9jZXNzQ29uZmlnQ29sdW1uKFxuXHRcdFx0cGFyc2VkQ29uZmlnQ29sdW1uLnNsaWNlKDEpLFxuXHRcdFx0ZGVzdGluYXRpb25bY29sdW1uSW5kZXhdW2NvbHVtbklkXSxcblx0XHQpO1xuXHR9XG5cblx0ZmluZFJlcXVlc3RDb2x1bW4gKFxuXHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KTogbnVtYmVyIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHJlcXVlc3RDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBjb2x1bW4gPSByZXF1ZXN0Q29sdW1uc1tpXTtcblxuXHRcdFx0aWYgKHRoaXMuZ2V0UmVxdWVzdENvbHVtbklkKGNvbHVtbikgPT09IGNvbHVtbklkKSB7XG5cdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAtMTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpRm9ybWF0dGVyLCBDcmVhdGVDb21waWxhdGlvbiwgS2V5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ3JlYXRlUmVxdWVzdEVudHJ5LCBJdGVtSWQsIEl0ZW1NYXAsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBJbnRlcm5hbENyZWF0ZURlbHRhIH0gZnJvbSAnLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5cbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVxdWVzdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4ge1xuXG5cdHJlcXVlc3RzOiBBcnJheTxDcmVhdGVSZXF1ZXN0RW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb21waWxhdGlvbjogQ3JlYXRlQ29tcGlsYXRpb24sXG5cdFx0cHJpdmF0ZSB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRwcml2YXRlIGJyZWFrdXBCeVBhcmVudCA9IGZhbHNlLFxuXHQpIHtcblx0fVxuXG5cdGZpbmFsaXplUmVxdWVzdCAocmVxdWVzdFJlc291cmNlOiBDcmVhdGVSZXF1ZXN0RW50cnk8SXRlbVR5cGVUeXBlPikge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzID0gcmVxdWVzdFJlc291cmNlLmNvbGxlY3Rpb25zLmdldENvbGxlY3Rpb25zV2l0aEZpdHRpbmdJdGVtcygpO1xuXHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHJlcXVlc3RSZXNvdXJjZS5jb2x1bW5zO1xuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY29sbGVjdGlvbkVudHJpZXMpIHtcblx0XHRcdGNvbHVtbkV4cGFuc2lvbi5leHBhbmQoY29sbGVjdGlvbkVudHJ5LmNvbHVtbnMpO1xuXHRcdH1cblxuXHRcdHJlcXVlc3RSZXNvdXJjZS5yZXF1ZXN0LmNvbHVtbnMgPSBjb2x1bW5FeHBhbnNpb24uZ2V0KCk7XG5cblx0XHRyZXR1cm4gcmVxdWVzdFJlc291cmNlO1xuXHR9XG5cblx0c2V0UmVxdWVzdFBhcmVudCAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cmVxdWVzdEVudHJ5OiBDcmVhdGVSZXF1ZXN0RW50cnk8SXRlbVR5cGVUeXBlPixcblx0KSB7XG5cdFx0Y29uc3QgcmVxdWVzdCA9IHJlcXVlc3RFbnRyeS5yZXF1ZXN0O1xuXG5cdFx0aWYgKHBhcmVudFR5cGUgPT09ICdWb2lkJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJlcXVlc3QucGFyZW50VHlwZSA9IHBhcmVudFR5cGU7XG5cdFx0cmVxdWVzdC5wYXJlbnRJZCA9IHt9O1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRwdWJsaWMgcnVuICgpIHtcblx0XHRjb25zdCBjb21waWxhdGlvbiA9IHRoaXMuY29tcGlsYXRpb247XG5cblx0XHRpZiAodGhpcy5icmVha3VwQnlQYXJlbnQpIHtcblx0XHRcdGZvciAoY29uc3QgcGFyZW50VHlwZSBpbiBjb21waWxhdGlvbikge1xuXHRcdFx0XHRjb25zdCBwYXJlbnRNYXAgPSBjb21waWxhdGlvbltwYXJlbnRUeXBlXTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IHBhcmVudElkIGluIHBhcmVudE1hcCkge1xuXHRcdFx0XHRcdGlmICh0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKHBhcmVudElkKSkge1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgcmVxdWVzdFJlc291cmNlID0gdGhpcy5pbml0aWFsaXplUmVxdWVzdCgpO1xuXG5cdFx0XHRcdFx0dGhpcy5leHRlbmRSZXF1ZXN0KFxuXHRcdFx0XHRcdFx0cGFyZW50TWFwW3BhcmVudElkXSxcblx0XHRcdFx0XHRcdHRoaXMuc2V0UmVxdWVzdFBhcmVudChcblx0XHRcdFx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0XHRcdFx0cmVxdWVzdFJlc291cmNlLFxuXHRcdFx0XHRcdFx0KSA/ICtwYXJlbnRJZCA6IG51bGwsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0UmVzb3VyY2UsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdHRoaXMucmVxdWVzdHMucHVzaCh0aGlzLmZpbmFsaXplUmVxdWVzdChyZXF1ZXN0UmVzb3VyY2UpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGNvbnN0IHBhcmVudFR5cGUgaW4gY29tcGlsYXRpb24pIHtcblx0XHRcdFx0Y29uc3QgcGFyZW50TWFwID0gY29tcGlsYXRpb25bcGFyZW50VHlwZV07XG5cdFx0XHRcdGNvbnN0IHJlcXVlc3RSZXNvdXJjZSA9IHRoaXMuaW5pdGlhbGl6ZVJlcXVlc3QoKTtcblx0XHRcdFx0Y29uc3QgaGFzUGFyZW50ID0gdGhpcy5zZXRSZXF1ZXN0UGFyZW50KFxuXHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0cmVxdWVzdFJlc291cmNlLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGxldCB2YWxpZFJlcXVlc3QgPSBmYWxzZTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IHBhcmVudElkIGluIHBhcmVudE1hcCkge1xuXHRcdFx0XHRcdGlmICh0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKHBhcmVudElkKSkge1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5leHRlbmRSZXF1ZXN0KFxuXHRcdFx0XHRcdFx0cGFyZW50TWFwW3BhcmVudElkXSxcblx0XHRcdFx0XHRcdGhhc1BhcmVudCA/ICtwYXJlbnRJZCA6IG51bGwsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0UmVzb3VyY2UsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdHZhbGlkUmVxdWVzdCA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodmFsaWRSZXF1ZXN0KSB7XG5cdFx0XHRcdFx0dGhpcy5yZXF1ZXN0cy5wdXNoKHRoaXMuZmluYWxpemVSZXF1ZXN0KHJlcXVlc3RSZXNvdXJjZSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdHM7XG5cdH1cblxuXHRpbml0aWFsaXplUmVxdWVzdCAoKTogQ3JlYXRlUmVxdWVzdEVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB7XG5cdFx0XHRyZXF1ZXN0OiB7XG5cdFx0XHRcdHJlcXVlc3RUeXBlOiAnY3JlYXRlJyxcblx0XHRcdFx0aXRlbXM6IHt9LFxuXHRcdFx0XHRjb2x1bW5zOiB7fSxcblx0XHRcdH0sXG5cdFx0XHRjb2x1bW5zOiB0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdCgpLFxuXHRcdFx0aXRlbXM6IHt9LFxuXHRcdFx0Y29sbGVjdGlvbnM6IHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuZ2V0Q29sbGVjdGlvbk1hdGNoZXIoKSxcblx0XHR9O1xuXHR9XG5cblx0cHJpdmF0ZSBleHRlbmRSZXF1ZXN0IChcblx0XHRpdGVtVmFsdWVzOiBJdGVtTWFwPEludGVybmFsQ3JlYXRlRGVsdGE+LFxuXHRcdHJlcXVlc3RQYXJlbnRJZDogSXRlbUlkIHwgbnVsbCxcblx0XHRkZXN0aW5hdGlvbjogQ3JlYXRlUmVxdWVzdEVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdCkge1xuXHRcdGNvbnN0IHJlcXVlc3QgPSBkZXN0aW5hdGlvbi5yZXF1ZXN0O1xuXHRcdGNvbnN0IGl0ZW1FbnRyeU1hcCA9IGRlc3RpbmF0aW9uLml0ZW1zO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpdGVtVmFsdWVzKSB7XG5cdFx0XHRpZiAocmVxdWVzdC5pdGVtVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJlcXVlc3QuaXRlbVR5cGUgPSBpdGVtVHlwZSBhcyBJdGVtVHlwZVR5cGU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpdGVtRW50cnlNYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aXRlbUVudHJ5TWFwW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdFx0XHRyZXF1ZXN0Lml0ZW1zW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBpdGVtVmFsdWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRjb25zdCBpbnRlcm5hbENyZWF0ZURlbHRhOiBJbnRlcm5hbENyZWF0ZURlbHRhID0gaXRlbVZhbHVlc1tpdGVtVHlwZV1baXRlbUlkXTtcblx0XHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gaW50ZXJuYWxDcmVhdGVEZWx0YS5lbnRyeTtcblxuXHRcdFx0XHRjb25zdCBjaGlsZEVudHJpZXMgPSBnZXRQYXRoKFxuXHRcdFx0XHRcdHRoaXMuY29tcGlsYXRpb24sXG5cdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IGl0ZW1SZXF1ZXN0OiBhbnkgPSByZXF1ZXN0Lml0ZW1zW2l0ZW1UeXBlXVtpdGVtRW50cnkuaXRlbUlkXSA9IHt9O1xuXHRcdFx0XHRjb25zdCBwYXJhbWV0ZXJzID0gZ2V0UGF0aChcblx0XHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLnRhYlJlcXVlc3RQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1JZCxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmIChyZXF1ZXN0UGFyZW50SWQgIT09IG51bGwpIHtcblx0XHRcdFx0XHQocmVxdWVzdC5wYXJlbnRJZCBhcyB7W2l0ZW1JZDogc3RyaW5nXTogSXRlbUlkfSlbaXRlbUVudHJ5Lml0ZW1JZF0gPSByZXF1ZXN0UGFyZW50SWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZXN0aW5hdGlvbi5jb2x1bW5zLmV4cGFuZChpdGVtRW50cnkuY29sdW1ucyk7XG5cblx0XHRcdFx0Ly8gdG9kb1tjYWNoZV0gbmVlZCB0aGlzID9cblx0XHRcdFx0Ly8gZGVzdGluYXRpb24uY29sbGVjdGlvbnMuZXhwYW5kKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0aXRlbUVudHJ5TWFwW2l0ZW1UeXBlXVtpdGVtSWRdID0gaXRlbUVudHJ5O1xuXG5cdFx0XHRcdGl0ZW1SZXF1ZXN0LnZhbHVlcyA9IHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlcXVlc3RMb2NhbChcblx0XHRcdFx0XHRpbnRlcm5hbENyZWF0ZURlbHRhLmZpZWxkcyxcblx0XHRcdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGl0ZW1SZXF1ZXN0LnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuXG5cdFx0XHRcdGlmIChjaGlsZEVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgbGlua3M6IHtbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1JZFtdfSA9IGl0ZW1SZXF1ZXN0LmxpbmtzID0ge307XG5cblx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZFR5cGUgaW4gY2hpbGRFbnRyaWVzKSB7XG5cdFx0XHRcdFx0bGlua3NbY2hpbGRUeXBlXSA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZElkIGluIGNoaWxkRW50cmllc1tjaGlsZFR5cGVdKSB7XG5cdFx0XHRcdFx0XHRsaW5rc1tjaGlsZFR5cGVdLnB1c2gocGFyc2VJbnQoXG5cdFx0XHRcdFx0XHRcdGNoaWxkSWQsXG5cdFx0XHRcdFx0XHRcdDEwLFxuXHRcdFx0XHRcdFx0KSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5leHRlbmRSZXF1ZXN0KFxuXHRcdFx0XHRcdGNoaWxkRW50cmllcyxcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdGRlc3RpbmF0aW9uLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpUXVlcnksIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0Rmlyc3RQcm9wZXJ0eSB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBlbnVtIE9QRVJBVE9SUyB7XG5cdE9SID0gJ09SJyxcblx0QU5EID0gJ0FORCdcbn1cblxuZXhwb3J0IHR5cGUgT1BFUkFUT1JTX1RZUEUgPSAnT1InIHwgJ0FORCcgfCAnb3InIHwgJ2FuZCcgfCBPUEVSQVRPUlM7XG5cbmV4cG9ydCBlbnVtIENPTVBBUkFUT1JTIHtcblx0RVFVQUxTID0gJz0nLFxuXHROT1RfRVFVQUxTID0gJyE9Jyxcblx0TEVTU19USEFOID0gJzwnLFxuXHRNT1JFX1RIQU4gPSAnPicsXG5cdExFU1NfT1JfRVFVQUxfVEhBTiA9ICc8PScsXG5cdEVRVUFMX09SX01PUkVfVEhBTiA9ICc+PScsXG5cdElOID0gJ0lOJ1xufVxuXG5leHBvcnQgdHlwZSBDT01QQVJBVE9SU19UWVBFID0gJz0nIHwgJyE9JyB8ICc8JyB8ICc+JyB8ICc8PScgfCAnPj0nIHwgJ0lOJyB8IENPTVBBUkFUT1JTO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXVlcnlQYXJzZXJCYXNlPFJldHVyblR5cGUgZXh0ZW5kcyBhbnk+IHtcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdHByb3RlY3RlZCBxdWVyeTogQXBpUXVlcnksXG5cdCkge1xuXHR9XG5cblx0cHVibGljIHBhcnNlIChxdWVyeTogQXBpUXVlcnkgPSB0aGlzLnF1ZXJ5KTogUmV0dXJuVHlwZSB7XG5cdFx0aWYgKHF1ZXJ5LmxpbmtlZFRvICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlTGlua2VkVG9RdWVyeShcblx0XHRcdFx0cXVlcnkubGlua2VkVG8sXG5cdFx0XHRcdHF1ZXJ5LnF1ZXJ5LFxuXHRcdFx0XHRxdWVyeS5yZXZlcnNlLFxuXHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5jdXN0b20gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2VDdXN0b21RdWVyeShcblx0XHRcdFx0cXVlcnkuY3VzdG9tLFxuXHRcdFx0XHRxdWVyeS5wYXJhbWV0ZXJzLFxuXHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5zZWFyY2ggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2VTZWFyY2hRdWVyeShcblx0XHRcdFx0cXVlcnkuc2VhcmNoLFxuXHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5jb25kaXRpb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlQ29tcGxleFF1ZXJ5KFxuXHRcdFx0XHRxdWVyeS5jb25kaXRpb25zLFxuXHRcdFx0XHRxdWVyeS5vcGVyYXRvcixcblx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkuaXRlbVR5cGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2VTdWJGaWVsZFF1ZXJ5KFxuXHRcdFx0XHRxdWVyeS5rZXksXG5cdFx0XHRcdHF1ZXJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRxdWVyeS5maWVsZCxcblx0XHRcdFx0cXVlcnkucXVlcnksXG5cdFx0XHRcdHF1ZXJ5Lm5vdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5LmtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAodHlwZW9mIHF1ZXJ5LnF1ZXJ5ID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5wYXJzZVN1YlF1ZXJ5KFxuXHRcdFx0XHRcdHF1ZXJ5LmtleSxcblx0XHRcdFx0XHRxdWVyeS5xdWVyeSxcblx0XHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLnBhcnNlU2ltcGxlUXVlcnkoXG5cdFx0XHRcdHF1ZXJ5LmtleSxcblx0XHRcdFx0cXVlcnkudmFsdWUsXG5cdFx0XHRcdHF1ZXJ5LmNvbXBhcmF0b3IsXG5cdFx0XHRcdHF1ZXJ5Lm5vdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qga2V5ID0gZ2V0Rmlyc3RQcm9wZXJ0eShxdWVyeSk7XG5cblx0XHRpZiAoa2V5ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZUVtcHR5UXVlcnkoKTtcblx0XHR9XG5cblx0XHRjb25zdCB2YWx1ZSA9IHF1ZXJ5W2tleV07XG5cblx0XHQvLyB0eXBlb2YgbnVsbCBpcyBhbiBvYmplY3QgOnRoaW5raW5nOlxuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlU3ViUXVlcnkoXG5cdFx0XHRcdGtleSxcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJzZVNpbXBsZVF1ZXJ5KFxuXHRcdFx0a2V5LFxuXHRcdFx0dmFsdWUsXG5cdFx0XHRxdWVyeS5jb21wYXJhdG9yLFxuXHRcdFx0cXVlcnkubm90LFxuXHRcdCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VFbXB0eVF1ZXJ5ICgpOiBSZXR1cm5UeXBlO1xuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZVN1YlF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRzdWJRdWVyeTogb2JqZWN0LFxuXHRcdG5vdDogYm9vbGVhbixcblx0KTogUmV0dXJuVHlwZTtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VTdWJGaWVsZFF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0ZmllbGQ6IHN0cmluZyxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0bm90OiBib29sZWFuLFxuXHQpOiBSZXR1cm5UeXBlO1xuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZVNlYXJjaFF1ZXJ5IChcblx0XHR2YWx1ZTogYW55LFxuXHRcdG5vdDogYm9vbGVhbixcblx0KTogUmV0dXJuVHlwZTtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VDdXN0b21RdWVyeSAoXG5cdFx0Y3VzdG9tOiBzdHJpbmcsXG5cdFx0cGFyYW1ldGVyczogYW55LFxuXHRcdG5vdDogYm9vbGVhbixcblx0KTogUmV0dXJuVHlwZTtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VTaW1wbGVRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0dmFsdWU6IGFueSxcblx0XHRjb21wYXJhdG9yOiBDT01QQVJBVE9SU19UWVBFLFxuXHRcdG5vdD86IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlTGlua2VkVG9RdWVyeSAoXG5cdFx0bGlua2VkVG86IGFueSxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0cmV2ZXJzZTogYm9vbGVhbixcblx0XHRub3Q6IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlQ29tcGxleFF1ZXJ5IChcblx0XHRjb25kaXRpb25zOiBhbnlbXSxcblx0XHRvcGVyYXRvcjogT1BFUkFUT1JTX1RZUEUsXG5cdFx0bm90OiBib29sZWFuLFxuXHQpOiBSZXR1cm5UeXBlO1xufVxuIiwiaW1wb3J0IHsgQXBpUXVlcnksIEFwaVJlcXVlc3RDb2x1bW4sIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4vQ29sdW1uVXRpbCc7XG5pbXBvcnQgeyBDT01QQVJBVE9SU19UWVBFIH0gZnJvbSAnLi9RdWVyeVBhcnNlcic7XG5pbXBvcnQgeyBPUEVSQVRPUlNfVFlQRSwgUXVlcnlQYXJzZXJCYXNlIH0gZnJvbSAnLi9RdWVyeVBhcnNlckJhc2UnO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlDb2x1bW5FeHRyYWN0b3Jcblx0ZXh0ZW5kcyBRdWVyeVBhcnNlckJhc2U8QXBpUmVxdWVzdENvbHVtbltdPiB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwcml2YXRlIGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdCkge1xuXHRcdHN1cGVyKHF1ZXJ5KTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUVtcHR5UXVlcnkgKCkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZVN1YlF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRzdWJRdWVyeTogb2JqZWN0LFxuXHRcdF9ub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KSB7XG5cdFx0cmV0dXJuIFt7W2tleV06IHRoaXMucGFyc2Uoc3ViUXVlcnkpfV07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTdWJGaWVsZFF1ZXJ5IChcblx0XHRfa2V5OiBzdHJpbmcsXG5cdFx0X2l0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRfZmllbGQ6IHN0cmluZyxcblx0XHRfcXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdF9ub3Q6IGJvb2xlYW4sXG5cdCkge1xuXHRcdHJldHVybiBbXTtcblx0XHQvLyB0b2RvW2NhY2hlXSBXZSBzaG91bGQgZXhwYW5kIHRoZSByZXF1ZXN0Q29sdW1ucyB3aXRoIHtbaXRlbVR5cGVdOiB0aGlzLnBhcnNlKHF1ZXJ5KX0gYnV0IGN1cnJlbnRseSBjb2xsZWN0aW9ucyBvbmx5IGFsbG93IGZldGNoaW5nIGRpcmVjdCBjb2x1bW5zXG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTZWFyY2hRdWVyeSAoXG5cdFx0X3ZhbHVlOiBhbnksXG5cdFx0X25vdDogYm9vbGVhbixcblx0KSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlQ3VzdG9tUXVlcnkgKFxuXHRcdF9jdXN0b206IHN0cmluZyxcblx0XHRfcGFyYW1ldGVyczogYW55LFxuXHRcdF9ub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU2ltcGxlUXVlcnkgKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdF92YWx1ZTogYW55LFxuXHRcdF9jb21wYXJhdG9yPzogQ09NUEFSQVRPUlNfVFlQRSxcblx0XHRfbm90PzogYm9vbGVhbixcblx0KSB7XG5cdFx0cmV0dXJuIFtrZXldO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlTGlua2VkVG9RdWVyeSAoXG5cdFx0bGlua2VkVG86IGFueSxcblx0XHRfcXVlcnk6IEFwaVF1ZXJ5ID0ge30gYXMgQXBpUXVlcnksXG5cdFx0X3JldmVyc2U6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRfbm90OiBib29sZWFuID0gZmFsc2UsXG5cdCkge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtblV0aWwuZ2V0Q29sdW1uc0Zyb21MaW5rKFxuXHRcdFx0bGlua2VkVG8sXG5cdFx0XHR0aGlzLml0ZW1UeXBlLFxuXHRcdCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VDb21wbGV4UXVlcnkgKFxuXHRcdGNvbmRpdGlvbnM6IGFueVtdLFxuXHRcdF9vcGVyYXRvcj86IE9QRVJBVE9SU19UWVBFLFxuXHRcdF9ub3Q/OiBib29sZWFuLFxuXHQpIHtcblx0XHRyZXR1cm4gdGhpcy5wYXJzZUNvbmRpdGlvbnMoY29uZGl0aW9ucyk7XG5cdH1cblxuXHRwcml2YXRlIHBhcnNlQ29uZGl0aW9ucyAoY29uZGl0aW9uczogYW55W10pIHtcblx0XHRyZXR1cm4gY29uZGl0aW9ucy5yZWR1Y2UoXG5cdFx0XHQoXG5cdFx0XHRcdGFjY3VtdWxhdG9yLFxuXHRcdFx0XHRjb25kaXRpb24sXG5cdFx0XHQpID0+IGFjY3VtdWxhdG9yLmNvbmNhdChcblx0XHRcdFx0dGhpcy5wYXJzZShjb25kaXRpb24pLFxuXHRcdFx0KSxcblx0XHRcdFtdLFxuXHRcdCk7XG5cdH1cblxufVxuIiwiaW1wb3J0IHsgQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSwgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgfSBmcm9tICcuLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBDb2xsZWN0aW9uRW50cnlPcHRpb25zLCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpUXVlcnksXG5cdEFwaVJlcXVlc3RDb2x1bW4sXG5cdENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcCxcblx0SXRlbUlkLFxuXHRJdGVtVHlwZSxcblx0UHJvbWlzZUludGVyZmFjZSxcblx0UXVlcnlDYWxsYmFjayxcbn0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkNhY2hlIH0gZnJvbSAnLi4vQ29sbGVjdGlvbkNhY2hlJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UgfSBmcm9tICcuLi9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25NYXRjaGVyIH0gZnJvbSAnLi4vQ29sbGVjdGlvbk1hdGNoZXInO1xuaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4uL0NvbHVtblV0aWwnO1xuaW1wb3J0IHsgUXVlcnlDb2x1bW5FeHRyYWN0b3IgfSBmcm9tICcuLi9RdWVyeUNvbHVtbkV4dHJhY3Rvcic7XG5pbXBvcnQgeyBpbkFycmF5IH0gZnJvbSAnLi4vVXRpbCc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi9BYnN0cmFjdENhY2hlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25IYW5kbGVyQmFzZSB7XG5cblx0cHVibGljIGVudHJpZXM6IENvbGxlY3Rpb25DYWNoZTtcblxuXHRwdWJsaWMgY29sbGVjdGlvbkNoYW5nZXM6IHtcblx0XHRbY29sbGVjdGlvbkVudHJ5SWQ6IG51bWJlcl06IEl0ZW1FbnRyeVtdXG5cdH0gPSB7fTtcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByb3RlY3RlZCByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeTogQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCkge1xuXHRcdHRoaXMuZW50cmllcyA9IGNvbGxlY3Rpb25DYWNoZUZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJ5fSBhbmQgc3RvcmVzIGl0IGluIHRoaXMgdHJhbnNhY3Rpb24ncyB7QGxpbmsgQ29sbGVjdGlvbkNhY2hlIENvbGxlY3Rpb25DYWNoZX1cblx0ICovXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLnRyYW5zYWN0aW9uLmNvcmUuY29sbGVjdGlvbkVudHJ5RmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0KTtcblxuXHRcdHRoaXMuZW50cmllcy5hZGQoY29sbGVjdGlvbkVudHJ5KTtcblxuXHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENyZWF0ZXMgYSB7QGxpbmsgQ29sbGVjdGlvbk1hdGNoZXIgQ29sbGVjdGlvbk1hdGNoZXJ9IHdpdGggdGhlIHRyYW5zYWN0aW9uJ3MgY29sbGVjdGlvbnNcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRDb2xsZWN0aW9uTWF0Y2hlciAoKTogQ29sbGVjdGlvbk1hdGNoZXI7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGEge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9IHdpdGggdGhlIGdpdmVuIG9wdGlvbnNcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBmZXRjaENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGNvbGxlY3Rpb25zIGxpbmtlZCB0byB0aGUgcGFzc2VkIHBhcmVudHNcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBmZXRjaExpbmtlZENvbGxlY3Rpb25FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWRBcnJheTogSXRlbUlkW10gfCAoKCkgPT4gSXRlbUlkW10pLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+PjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEV4cGFuZHMgdGhlIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9ucyB3aXRoIHRoZSBwYXNzZWQgY29sdW1uc1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGV4cGFuZENvbGxlY3Rpb25FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRjb2xsZWN0aW9uczogQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXAsXG5cdFx0bmV3Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEV4dGVuZHMgdGhlIGNvbGxlY3Rpb25zJyB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5LnF1ZXJ5UGFyYW1zIHF1ZXJ5UGFyYW1zfSBhbmQge0BsaW5rIENvbGxlY3Rpb25FbnRyeS5xdWVyeSBxdWVyaWVzfSBhbmQgZmV0Y2hlcyB0aGUge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gd2l0aCB0aGUgbmV3IHF1ZXJpZXNcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBleHRlbmRDb2xsZWN0aW9uRW50cmllczxUIGV4dGVuZHMgQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0XHRxdWVyeUNhbGxiYWNrOiBRdWVyeUNhbGxiYWNrLFxuXHRcdGNvbGxlY3Rpb25zOiBULFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQWRkcyB0aGUgcGFzc2VkIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IHRvIHRoZSBjb2xsZWN0aW9uJ3MgY2hhbmdlcyBvbiB0aGUgdHJhbnNhY3Rpb24sXG5cdCAqIHdpbGwgc2tpcCB0aGUgSXRlbUVudHJ5IGlmIHRoZSBgc2tpcEVudHJ5RmlsdGVyRm5gIGNhbGxiYWNrIHJldHVybnMgYHRydWVgXG5cdCAqL1xuXHRwcm90ZWN0ZWQgX2FkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlczxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHRcdHNraXBFbnRyeUZpbHRlckZuOiAodGVtRW50cnk6IEl0ZW1FbnRyeSkgPT4gYm9vbGVhbixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuLFxuXHQpOiB2b2lkIHtcblx0XHRpZiAoaXRlbUVudHJpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5LmlkXTtcblxuXHRcdGlmIChjaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBhZGRlZEl0ZW1FbnRyaWVzOiBJdGVtRW50cnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0Y2hhbmdlcy5pbmRleE9mKGl0ZW1FbnRyeSkgIT09IC0xXG5cdFx0XHRcdHx8IHNraXBFbnRyeUZpbHRlckZuKGl0ZW1FbnRyeSlcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y2hhbmdlcy5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHRhZGRlZEl0ZW1FbnRyaWVzLnB1c2goaXRlbUVudHJ5KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5oYW5kbGVBZGRlZEl0ZW1FbnRyaWVzQ2FsbGJhY2soXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRhZGRlZEl0ZW1FbnRyaWVzLFxuXHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IGhhbmRsZUFkZGVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGFkZGVkRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuLFxuXHQpOiB2b2lkO1xuXG5cdHB1YmxpYyByZW1vdmVJdGVtRW50cmllc0Zyb21Db2xsZWN0aW9uQ2hhbmdlcyAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnksXG5cdFx0aWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHQpIHtcblx0XHRpZiAoaWRBcnJheS5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaWRdO1xuXG5cdFx0aWYgKGNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlbW92ZWRJdGVtRW50cmllcyA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5maWx0ZXJBcnJheShcblx0XHRcdGNoYW5nZXMsXG5cdFx0XHRpdGVtRW50cnkgPT4gIWluQXJyYXkoXG5cdFx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRcdGlkQXJyYXksXG5cdFx0XHQpLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5oYW5kbGVSZW1vdmVkSXRlbUVudHJpZXNDYWxsYmFjayhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdHJlbW92ZWRJdGVtRW50cmllcyxcblx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0KTtcblx0fVxuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBoYW5kbGVSZW1vdmVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdHJlbW92ZWRJdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuLFxuXHQpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRXhwYW5kcyB0aGUgb3B0aW9uJ3Mge0BsaW5rIENvbGxlY3Rpb25FbnRyeU9wdGlvbnMuY29sdW1ucyBjb2x1bW5zfSB3aXRoIHRoZSBjb2x1bW5zIHJlcXVpcmVkIGZvciB0aGUge0BsaW5rIENvbGxlY3Rpb25NYXRjaGVyIENvbGxlY3Rpb25NYXRjaGVyfSB0byBmdW5jdGlvbi5cblx0ICogRGF0YSBmZXRjaGVkIGZvciBhIHBhcmVudCB0cmFuc2FjdGlvbiBtaWdodCBhbHNvIGZpdCBpbiBhIGNoaWxkIHRyYW5zYWN0aW9uLCBzbyB0aG9zZSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucy5xdWVyeUNvbHVtbnMgcXVlcnlDb2x1bW5zfSBzaG91bGQgYWxzbyBiZSB0YWtlbiBpbnRvIGFjY291bnRcblx0ICovXG5cdHByb3RlY3RlZCBleHBhbmRDb2x1bW5zV2l0aFF1ZXJ5Q29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb2x1bW5FeHRyYWN0b3IgPSBuZXcgUXVlcnlDb2x1bW5FeHRyYWN0b3IoXG5cdFx0XHR0aGlzLmNvbHVtblV0aWwsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHF1ZXJ5LFxuXHRcdCk7XG5cblx0XHRvcHRpb25zLnF1ZXJ5Q29sdW1ucyA9IGNvbHVtbkV4dHJhY3Rvci5wYXJzZSgpO1xuXG5cdFx0Ly8gYWxyZWFkeSBoYXZlIGFsbCBjb2x1bW5zLCBzbyBjYW4ndCBleHBhbmQgdGhlbVxuXHRcdGlmIChvcHRpb25zLmNvbHVtbnMgPT09IHRydWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLnF1ZXJ5Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0b3B0aW9ucy5jb2x1bW5zID0gcmVxdWVzdENvbHVtbkV4cGFuc2lvbi5nZXQoKVtpdGVtVHlwZV07XG5cdH1cbn1cbiIsImltcG9ydCB7XG5cdENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Q29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcbn0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRBcGlSZXF1ZXN0U2VydmljZSxcblx0QXBpUmVzcG9uc2VQcm9jZXNzb3IsXG5cdENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdENvbGxlY3Rpb25NYXRjaGVyLFxuXHRDb2xsZWN0aW9uUXVlcnksXG5cdENvbHVtblN1YnNldENhY2hlLFxuXHRDb2x1bW5VdGlsLFxuXHRpc0Z1bmN0aW9uLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxufSBmcm9tICcuLi8uLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIEl0ZW1FbnRyeSB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRBcGlSZXF1ZXN0Q29sdW1uLFxuXHRDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcCxcblx0Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXAsXG5cdEl0ZW1JZCxcblx0SXRlbVR5cGUsXG5cdFF1ZXJ5Q2FsbGJhY2ssXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsIFF1ZXJ5U2VydmljZSB9IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IFJlcXVlc3RCdWZmZXJNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vUmVxdWVzdEJ1ZmZlck1hbmFnZXInO1xuXG5pbXBvcnQgeyBoYXNQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vVXRpbCc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uSGFuZGxlckJhc2UgfSBmcm9tICcuLi9Db2xsZWN0aW9uSGFuZGxlckJhc2UnO1xuaW1wb3J0IHsgU2VydmVyQ2FjaGUgfSBmcm9tICcuL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IFNlcnZlckl0ZW1IYW5kbGVyIH0gZnJvbSAnLi9TZXJ2ZXJJdGVtSGFuZGxlcic7XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJDb2xsZWN0aW9uSGFuZGxlclxuXHRleHRlbmRzIENvbGxlY3Rpb25IYW5kbGVyQmFzZSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5OiBDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSByZXF1ZXN0QnVmZmVyTWFuYWdlcjogUmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uRXhwYW5zaW9uRmFjdG9yeTogQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgaXRlbUhhbmRsZXI6IFNlcnZlckl0ZW1IYW5kbGVyLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcXVlcnlTZXJ2aWNlOiBRdWVyeVNlcnZpY2UsXG5cdFx0Y29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IFNlcnZlckNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uTWF0Y2hlciAoKTogQ29sbGVjdGlvbk1hdGNoZXIge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLFxuXHRcdFx0aXRlbVR5cGUgPT4gdGhpcy5lbnRyaWVzLmdldEJ5SXRlbVR5cGUoaXRlbVR5cGUpLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShvcHRpb25zKTtcblxuXHRcdHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRwYXJzZWRRdWVyeS5vYmplY3QsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0PEl0ZW1UeXBlVHlwZT4ob3B0aW9ucy5jb2x1bW5zKTtcblxuXHRcdHJldHVybiB0aGlzLmZldGNoQ29sbGVjdGlvbkRhdGEoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdHBhcnNlZFF1ZXJ5LFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hMaW5rZWRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkQXJyYXk6IEl0ZW1JZFtdIHwgKCgpID0+IEl0ZW1JZFtdKSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IHByb21pc2VzOiB7W3BhcmVudElkOiBzdHJpbmddOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeT59ID0ge307XG5cblx0XHRpZiAoaXNGdW5jdGlvbjwoKSA9PiBJdGVtSWRbXT4ocGFyZW50SWRBcnJheSkpIHtcblx0XHRcdHBhcmVudElkQXJyYXkgPSBwYXJlbnRJZEFycmF5KCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBvZiBwYXJlbnRJZEFycmF5KSB7XG5cdFx0XHRjb25zdCBuZXdPcHRpb25zID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNsb25lT3B0aW9ucyhcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGl0ZW1UeXBlOiBwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZDogcGFyZW50SWQsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkobmV3T3B0aW9ucyk7XG5cblx0XHRcdHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRuZXdPcHRpb25zLFxuXHRcdFx0XHRwYXJzZWRRdWVyeS5vYmplY3QsXG5cdFx0XHQpO1xuXG5cdFx0XHQvLyB0b2RvW2NhY2hlXSBzaG91bGQgdGhpcyBiZSBpbiBhIGxvb3A/IGV4cGFuZENvbHVtbnNXaXRoUXVlcnlDb2x1bW5zIGNhbiBjaGFuZ2UgdGhlIGNvbHVtbnNcblx0XHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG5ld09wdGlvbnMuY29sdW1ucyk7XG5cblx0XHRcdHByb21pc2VzW3BhcmVudElkXSA9IHRoaXMuZmV0Y2hDb2xsZWN0aW9uRGF0YShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHRuZXdPcHRpb25zLFxuXHRcdFx0XHRwYXJzZWRRdWVyeSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHByb21pc2VzKTtcblx0fVxuXG5cdHB1YmxpYyBleHRlbmRDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRxdWVyeUNhbGxiYWNrOiBRdWVyeUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVR5cGU+IHtcblx0XHRjb25zdCBleHRlbmRlZFF1ZXJ5ID0gY29sbGVjdGlvbkVudHJ5LmV4dGVuZFF1ZXJ5KHF1ZXJ5Q2FsbGJhY2spLm9iamVjdDtcblx0XHRjb25zdCBmdWxsUXVlcnkgPSB0aGlzLnF1ZXJ5U2VydmljZS5hZGRBbmRDb25kaXRpb24oXG5cdFx0XHRleHRlbmRlZFF1ZXJ5LFxuXHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuY3JlYXRlTm90SW4oXG5cdFx0XHRcdHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5LmlkXS5tYXAoXG5cdFx0XHRcdFx0aXRlbUVudHJ5ID0+IGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRcdCksXG5cdFx0XHQpLFxuXHRcdCk7XG5cblx0XHR0aGlzLmV4cGFuZENvbHVtbnNXaXRoUXVlcnlDb2x1bW5zKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMsXG5cdFx0XHRleHRlbmRlZFF1ZXJ5LFxuXHRcdCk7XG5cblx0XHRsZXQgcHJvbWlzZTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5saW1pdCAhPT0gbnVsbCkge1xuXHRcdFx0cHJvbWlzZSA9IHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UucmVxdWVzdFNrZWxldG9uKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cmVxdWVzdFR5cGU6ICdxdWVyeScsXG5cdFx0XHRcdFx0aXRlbVR5cGU6IGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRjb2x1bW5zOiB7W2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV06IGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmNvbHVtbnN9LFxuXHRcdFx0XHRcdHF1ZXJ5OiBleHRlbmRlZFF1ZXJ5LFxuXHRcdFx0XHRcdGxpbWl0OiBjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5saW1pdCxcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlRdWVyeShcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRmdWxsUXVlcnksXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmNvbHVtbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbGxlY3Rpb25FbnRyeS5wcm9taXNlID0gcHJvbWlzZTtcblxuXHRcdHByb21pc2UudGhlbihcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0ZGVsZXRlIGNvbGxlY3Rpb25FbnRyeS5wcm9taXNlO1xuXHRcdFx0fSxcblx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHByb21pc2UudGhlbihcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHRcdH0sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0Y29sbGVjdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRcdG5ld1JlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA+IHtcblx0XHRpZiAobmV3UmVxdWVzdENvbHVtbnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKGNvbGxlY3Rpb25zKTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Ly8gVE9ETzogZmlsdGVyIGxvY2FsIGl0ZW1zP1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb2xsZWN0aW9ucykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gY29sbGVjdGlvbnNbcGFyZW50SWRdLmVudHJ5O1xuXG5cdFx0XHRwYXJlbnRJZEFycmF5LnB1c2goY29sbGVjdGlvbkVudHJ5LnBhcmVudCEuaXRlbUlkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlclxuXHRcdFx0LmZldGNoTGlua2VkSXRlbUVudHJpZXNEYXRhKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRwYXJlbnRJZEFycmF5LFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bmV3UmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdG5ld1JlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCksXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgcGFyZW50SWQgb2YgcGFyZW50SWRBcnJheSkge1xuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbnNbcGFyZW50SWRdLmVudHJ5LmV4cGFuZENvbHVtbnMoY29sdW1uRXhwYW5zaW9uKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbnM7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGV4dGVuZENvbGxlY3Rpb25FbnRyaWVzPFQgZXh0ZW5kcyBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcD4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdHF1ZXJ5Q2FsbGJhY2s6IFF1ZXJ5Q2FsbGJhY2ssXG5cdFx0Y29sbGVjdGlvbnM6IFQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdGlmICghaGFzUHJvcGVydGllcyhjb2xsZWN0aW9ucykpIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSA9IFtdO1xuXHRcdGxldCBpdGVtSWRBcnJheTogSXRlbUlkW10gPSBbXTtcblxuXHRcdG9wdGlvbnMucXVlcnlQYXJhbXMgPSBxdWVyeUNhbGxiYWNrKG9wdGlvbnMucXVlcnlQYXJhbXMpO1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb2xsZWN0aW9ucykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gY29sbGVjdGlvbnNbcGFyZW50SWRdLmVudHJ5O1xuXG5cdFx0XHRjb2xsZWN0aW9uRW50cnkuZXh0ZW5kUXVlcnkocXVlcnlDYWxsYmFjayk7XG5cdFx0XHRwYXJlbnRJZEFycmF5LnB1c2goY29sbGVjdGlvbkVudHJ5LnBhcmVudCEuaXRlbUlkKTtcblx0XHRcdGl0ZW1JZEFycmF5ID0gaXRlbUlkQXJyYXkuY29uY2F0KFxuXHRcdFx0XHR0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeS5pZF1cblx0XHRcdFx0XHQubWFwKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5ID0+IGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaExpbmtlZEl0ZW1FbnRyaWVzRGF0YShcblx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0cGFyZW50SWRBcnJheSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLmFkZEFuZENvbmRpdGlvbihcblx0XHRcdFx0XHR0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkob3B0aW9ucykub2JqZWN0LFxuXHRcdFx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLmNyZWF0ZU5vdEluKGl0ZW1JZEFycmF5KSxcblx0XHRcdFx0KSxcblx0XHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBhZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXM8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdHN1cGVyLl9hZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdC8vIExvY2FsIEl0ZW1FbnRyaWVzIGRvbid0IGJlbG9uZyBpbiByZW1vdGUgY29sbGVjdGlvbiBjaGFuZ2VzXG5cdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5LmlzTG9jYWwoKSxcblx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRXhwYW5kcyB0aGUgY29sdW1ucyBvZiB0aGUgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb25cblx0ICovXG5cdHB1YmxpYyBleHBhbmRDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRuZXdDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnlUeXBlPiB7XG5cdFx0Y29uc3Qge21lcmdlZCwgZGlmZmVyZW5jZX0gPSBjb2xsZWN0aW9uRW50cnkuY29sdW1ucy5tZXJnZVJlcXVlc3RDb2x1bW5zKG5ld0NvbHVtbnMpO1xuXG5cdFx0aWYgKGRpZmZlcmVuY2UgIT09IHRydWUgJiYgZGlmZmVyZW5jZS5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oY29sbGVjdGlvbkVudHJ5KTtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZTtcblxuXHRcdGxldCBwcm9taXNlO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmxpbWl0ICE9PSBudWxsKSB7XG5cdFx0XHRwcm9taXNlID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZS5yZXF1ZXN0U2tlbGV0b24oXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRyZXF1ZXN0VHlwZTogJ3F1ZXJ5Jyxcblx0XHRcdFx0XHRpdGVtVHlwZTogaXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29sdW1uczogbWVyZ2VkLFxuXHRcdFx0XHRcdHF1ZXJ5OiBjb2xsZWN0aW9uRW50cnkucXVlcnkub2JqZWN0LFxuXHRcdFx0XHRcdGxpbWl0OiBjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5saW1pdCwgLy8gdG9kb1tjYWNoZV0gYWN0dWFsbHkgaW1wbGVtZW50IGxpbWl0ID8gQ3VycmVudGx5IGRvZW5zJ3QgcmVhbGx5IHdvcmtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlRdWVyeShcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCxcblx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nLFxuXHRcdFx0XHRdLFxuXHRcdFx0XHRtZXJnZWQsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9taXNlXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdG1lcmdlZCxcblx0XHRcdFx0XHRcdHJlc3BvbnNlLmZldGNoQ29sdW1uc09iamVjdCgpLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuZXhwYW5kQ29sdW1ucyhjb2x1bW5FeHBhbnNpb24pO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGNvbHVtbkV4cGFuc2lvbjtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByb3RlY3RlZCBoYW5kbGVBZGRlZEl0ZW1FbnRyaWVzQ2FsbGJhY2s8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdF9jb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0YWRkZWRFbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiB2b2lkIHtcblx0XHRpZiAoYWRkZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIHRvZG9bY2FjaGVdIE9ubHkgdXNlZCBpbiB0aGUgZnJvbnRlbmQgcGxhbm5lclxuXHRcdC8vIGNvbGxlY3Rpb25FbnRyeS5vbkFkZEluaXRpYWwoYWRkZWRFbnRyaWVzKTtcblx0fVxuXG5cdHByb3RlY3RlZCBoYW5kbGVSZW1vdmVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0X2NvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRyZW1vdmVkSXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IHZvaWQge1xuXHRcdGlmIChyZW1vdmVkSXRlbUVudHJpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gT25seSB1c2VkIGluIHRoZSBmcm9udGVuZCBwbGFubmVyXG5cdFx0Ly8gY29sbGVjdGlvbkVudHJ5Lm9uUmVtb3ZlSW5pdGlhbChyZW1vdmVkSXRlbUVudHJpZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSBkYXRhIGZvciB0aGUgcGFzc2VkIEl0ZW1UeXBlL29wdGlvbnMsIHdpbGwgZG8gbm90aGluZyBpZiB0aGUgcmVxdWVzdGVkIENvbGxlY3Rpb25FbnRyeS9jb2x1bW5zIGFyZSBhbHJlYWR5IGNhY2hlZC5cblx0ICogV2lsbCBjcmVhdGUgYSBuZXcge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9IGlmIHRoZSBDb2xsZWN0aW9uRW50cnkgZGlkbid0IGV4aXN0IHlldFxuXHQgKi9cblx0cHJpdmF0ZSBmZXRjaENvbGxlY3Rpb25EYXRhPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRjb2x1bW5TdWJzZXRDYWNoZTogQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdGNvbGxlY3Rpb25RdWVyeTogQ29sbGVjdGlvblF1ZXJ5LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0bGV0IGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMuZW50cmllcy5nZXRCeVF1ZXJ5KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRjb2xsZWN0aW9uUXVlcnksXG5cdFx0KTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IG51bGwgJiYgY29sdW1uU3Vic2V0Q2FjaGUucnVuKGNvbGxlY3Rpb25FbnRyeS5jb2x1bW5zKSkge1xuXHRcdFx0Ly8gVGhlcmUgYWxyZWFkeSBpcyBhbiBlbnRyeSBhbmQgaXQgY29udGFpbnMgdGhlIGNvbHVtbnMgd2UgbmVlZCwgc28gd2UgY2FuIHNhZmVseSByZXR1cm4gaXRcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oY29sbGVjdGlvbkVudHJ5KTtcblx0XHR9XG5cblx0XHRsZXQgcHJvbWlzZTtcblxuXHRcdGlmIChvcHRpb25zLmxpbWl0ICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCByZXF1ZXN0Q29sdW1ucyA9IHtbaXRlbVR5cGVdOiBvcHRpb25zLmNvbHVtbnN9O1xuXG5cdFx0XHRsZXQgcmVzcG9uc2U6IEFwaVJlc3BvbnNlUHJvY2Vzc29yO1xuXG5cdFx0XHRwcm9taXNlID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0XHQucmVxdWVzdFNrZWxldG9uKFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJlcXVlc3RUeXBlOiAncXVlcnknLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGU6IGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0Y29sdW1uczogcmVxdWVzdENvbHVtbnMsXG5cdFx0XHRcdFx0XHRxdWVyeTogb3B0aW9ucy5xdWVyeSxcblx0XHRcdFx0XHRcdGxpbWl0OiBvcHRpb25zLmxpbWl0LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdClcblx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0X3Jlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gX3Jlc3BvbnNlO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5wcm9jZXNzUmVzcG9uc2UoXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlLFxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0KVxuXHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHQoKSA9PiByZXNwb25zZSxcblx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyXG5cdFx0XHRcdC5mZXRjaEJ5UXVlcnkoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0Y29sbGVjdGlvblF1ZXJ5Lm9iamVjdCxcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25RdWVyeS5zdHJpbmcsXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZS5yZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvbWlzZVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgcmUtY2hlY2sgaWYgYW4gZW50cnkgaXMgbm90IGNyZWF0ZWQgaW4gdGhlIG1lYW50aW1lXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldEJ5UXVlcnkoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25RdWVyeSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0gdGhpcy5jcmVhdGVDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LmNvbHVtbnMgPSB0aGlzLnRyYW5zYWN0aW9uLmNvcmUuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3RGcm9tUmVzcG9uc2UoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZS5yZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCksXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuZXhwYW5kQ29sdW1ucyhjb2x1bW5FeHBhbnNpb24pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQge1xuXHRDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdEl0ZW1DYWNoZUZhY3RvcnksXG5cdEl0ZW1FbnRyeUZhY3RvcnksXG5cdFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1FbnRyeU9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEFwaVJlcXVlc3RDb2x1bW5zLCBGaWVsZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSwgQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhIH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YSB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHtcblx0QXBpRm9ybWF0dGVyLFxuXHRBcGlSZXNwb25zZVByb2Nlc3Nvcixcblx0Q29sdW1uRXhwYW5zaW9uLFxuXHRDb2x1bW5TZXQsXG5cdENvbHVtblN1YnNldENhY2hlLFxuXHRDb2x1bW5VdGlsLFxuXHRRdWVyeVNlcnZpY2UsXG5cdFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRSZXF1ZXN0QnVmZmVyUmVzcG9uc2UsXG5cdFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyxcbn0gZnJvbSAnLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgSXRlbUhhbmRsZXJCYXNlIH0gZnJvbSAnLi4vSXRlbUhhbmRsZXJCYXNlJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi9TZXJ2ZXJDYWNoZSc7XG5cbmV4cG9ydCB0eXBlIFNlcnZlckl0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0gRmllbGRNYXA8SXRlbVR5cGVUeXBlPjtcblxuZXhwb3J0IGNsYXNzIFNlcnZlckl0ZW1IYW5kbGVyXG5cdGV4dGVuZHMgSXRlbUhhbmRsZXJCYXNlIHtcblxuXHRwdWJsaWMgaXRlbUNoYW5nZXM6IHtcblx0XHRbaXRlbUVudHJ5SWQ6IG51bWJlcl06IFNlcnZlckl0ZW1FbnRyeUNoYW5nZXNcblx0fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRwcml2YXRlIHF1ZXJ5UGFyc2VyRmFjdG9yeTogUXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgcXVlcnlTZXJ2aWNlOiBRdWVyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0Y29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRpdGVtRW50cnlGYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByb3RlY3RlZCB0cmFuc2FjdGlvbjogU2VydmVyQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0XHRwcm9taXNlU2VydmljZSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlSXRlbUVudHJ5IChcblx0XHRjcmVhdGVUdXBsZTogQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhLFxuXHQpOiBJdGVtRW50cnkge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHN1cGVyLmNyZWF0ZUl0ZW1FbnRyeShjcmVhdGVUdXBsZSk7XG5cblx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPSBjcmVhdGVUdXBsZS5maWVsZHM7XG5cblx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBQcm9jZXNzZXMgdXBkYXRlcyBvbiBhIGNhY2hlZCBlbnRyeVxuXHQgKi9cblx0cHVibGljIHByb2Nlc3NJdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiAoXG5cdFx0aXRlbUVudHJ5Q2hhbmdlc1R1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGE8SXRlbVR5cGVUeXBlPixcblx0XHRfZm9yY2VPdmVyd3JpdGU/OiBib29sZWFuLFxuXHRcdF91cGRhdGVJbml0aWFsPzogYm9vbGVhbixcblx0XHRfaXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZT86IGJvb2xlYW4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGl0ZW1FbnRyeUNoYW5nZXNUdXBsZS5lbnRyeTtcblx0XHRjb25zdCBjaGFuZ2VzID0gaXRlbUVudHJ5Q2hhbmdlc1R1cGxlLmNoYW5nZXM7XG5cblx0XHRpZiAodGhpcy5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9IHt9O1xuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VzLmV4cGFuZGVkQ29sdW1ucyAhPT0gbnVsbCkge1xuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMgPSBjaGFuZ2VzLmV4cGFuZGVkQ29sdW1ucy5tZXJnZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcHJldmlvdXMgPSB0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0dGhpcy5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdLFxuXHRcdFx0e30sXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHR0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0Y2hhbmdlcy5maWVsZHMsXG5cdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0sXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHQvLyB0b2RvW2NhY2hlXSB0ZXN0XG5cdFx0aWYgKGNoYW5nZXMuZmllbGRzLmlkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQgPSBjaGFuZ2VzLmZpZWxkcy5pZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJldmlvdXM7XG5cdH1cblxuXHRwdWJsaWMgY29weVRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyAoXG5cdFx0aXRlbUVudHJ5Q2hhbmdlczogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzLFxuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdCk6IFNlcnZlckl0ZW1FbnRyeUNoYW5nZXMge1xuXHRcdHJldHVybiB0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0aXRlbUVudHJ5Q2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0e30sXG5cdFx0XHRlbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdG9wdGlvbnMuY29sdW1ucyA9IHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhDb2xsZWN0aW9uQ29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoSXRlbUVudHJ5RGF0YShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0dGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG9wdGlvbnMuY29sdW1ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEl0ZW1FbnRyaWVzQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGVudHJ5T3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRlbnRyeU9wdGlvbnMuY29sdW1ucyA9IHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhDb2xsZWN0aW9uQ29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0ZW50cnlPcHRpb25zLmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyXG5cdFx0XHQuZmV0Y2hCeVF1ZXJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGhpcy5xdWVyeVBhcnNlckZhY3Rvcnlcblx0XHRcdFx0XHQuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuYWRkUGFyZW50Q29uZGl0aW9uKFxuXHRcdFx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0XHRcdFx0ZW50cnlPcHRpb25zLnBhcmVudCxcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC5wYXJzZSgpLFxuXHRcdFx0XHRlbnRyeU9wdGlvbnMuY29sdW1ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJpZXM6IEl0ZW1FbnRyeVtdID0gW107XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiByZXNwb25zZS5saW5rc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0aXRlbUVudHJpZXMucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBpdGVtRW50cmllcztcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdG9wdGlvbnMuY29sdW1ucyA9IHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhDb2xsZWN0aW9uQ29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb2x1bW5TdWJzZXRDYWNoZSA9IHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChvcHRpb25zLmNvbHVtbnMpO1xuXHRcdGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPHZvaWQ+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgaXRlbUlkcykge1xuXHRcdFx0cHJvbWlzZXMucHVzaChcblx0XHRcdFx0dGhpcy5mZXRjaEl0ZW1FbnRyeURhdGEoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZVxuXHRcdFx0LmFsbChwcm9taXNlcylcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJpZXM6IEl0ZW1FbnRyeVtdID0gW107XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiBpdGVtSWRzKSB7XG5cdFx0XHRcdFx0XHRpdGVtRW50cmllcy5wdXNoKFxuXHRcdFx0XHRcdFx0XHR0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdFx0KSEsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBpdGVtRW50cmllcztcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgZGF0YSBmb3IgdGhlIEl0ZW1FbnRyaWVzIGxpbmtlZCB0byB0aGUgcGFyZW50IEl0ZW1zXG5cdCAqXG5cdCAqIEBwYXJhbSBjb2x1bW5zIHNob3VsZCBjb250YWluIGEgZGVyaXZlZCBjb2x1bW4gdGhhdCByZWZlcnMgdG8gdGhlIHBhcmVudFxuXHQgKi9cblx0cHVibGljIGZldGNoTGlua2VkSXRlbUVudHJpZXNEYXRhIChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdHJldHVybiBxdWVyeSA9PT0gbnVsbCA/XG5cdFx0XHR0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlJZHMoXG5cdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdHBhcmVudElkQXJyYXksXG5cdFx0XHRcdGNvbHVtbnMsXG5cdFx0XHQpIDpcblx0XHRcdHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXIuZmV0Y2hCeVF1ZXJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGhpcy5xdWVyeVBhcnNlckZhY3Rvcnlcblx0XHRcdFx0XHQuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuYWRkQW5kQ29uZGl0aW9uKFxuXHRcdFx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxpbmtlZFRvOiBwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdFx0XHRcdHF1ZXJ5OiB7aWQ6IHBhcmVudElkQXJyYXl9LFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0LnBhcnNlKCksXG5cdFx0XHRcdC8vIHNob3VsZCBjb250YWluIGEgZGVyaXZlZCBjb2x1bW4gdGhhdCByZWZlcnMgdG8gdGhlIHBhcmVudFxuXHRcdFx0XHRjb2x1bW5zLFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2VuZXJhbCB3YXkgdG8gcHJvY2VzcyBhbiBBUEkgcmVzcG9uc2UuXG5cdCAqIFdpbGwgY2FsbCB7QGxpbmsgQ2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkIHNldEl0ZW1DcmVhdGVkfSBpZiBhbiBlbnRyeSBkb2Vzbid0IGV4aXN0IHlldCwgYW5kIG90aGVyd2lzZSB7QGxpbmsgQ2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkIHNldEl0ZW1VcGRhdGVkfSBpZiBpdCBkb2VzLlxuXHQgKi9cblx0cHVibGljIHByb2Nlc3NBcGlSZXNwb25zZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdHJlc3BvbnNlOiBBcGlSZXNwb25zZVByb2Nlc3Nvcixcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdGNvbHVtblNldDogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29sdW1uRXhwYW5zaW9uOiBDb2x1bW5FeHBhbnNpb248SXRlbVR5cGVUeXBlPixcblx0KTogdm9pZCB7XG5cdFx0Ly8gV2Ugc2hvdWxkIHJlLWNoZWNrIGlmIGFuIGVudHJ5IGlzIG5vdCBjcmVhdGVkIGluIHRoZSBtZWFudGltZVxuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHQpO1xuXG5cdFx0Y29uc3QgZmllbGRzID0gcmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHQpO1xuXG5cdFx0aWYgKGZpZWxkcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZpZWxkcyBub3QgZm91bmQgaW4gcmVzcG9uc2UgZm9yICR7aXRlbVR5cGV9OiR7aXRlbUlkfWApO1xuXHRcdH1cblxuXHRcdGlmIChpdGVtRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0Y29sdW1uRXhwYW5zaW9uLnJ1bihpdGVtRW50cnkuY29sdW1ucyksXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgZGF0YSBmb3IgdGhlIHBhc3NlZCBJdGVtVHlwZS9JdGVtSWQvY29sdW1ucywgd2lsbCBkbyBub3RoaW5nIGlmIHRoZSByZXF1ZXN0ZWQgSXRlbUVudHJ5L2NvbHVtbnMgYXJlIGFscmVhZHkgY2FjaGVkLlxuXHQgKiBXaWxsIGNyZWF0ZSBhIG5ldyB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gaWYgdGhlIEl0ZW1FbnRyeSBkaWRuJ3QgZXhpc3QgeWV0XG5cdCAqL1xuXHRwcml2YXRlIGZldGNoSXRlbUVudHJ5RGF0YTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0Y29sdW1uU3Vic2V0Q2FjaGU6IENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkICYmIGNvbHVtblN1YnNldENhY2hlLnJ1bihpdGVtRW50cnkuY29sdW1ucykpIHtcblx0XHRcdC8vIFRoZXJlIGFscmVhZHkgaXMgYW4gZW50cnkgYW5kIGl0IGNvbnRhaW5zIHRoZSBjb2x1bW5zIHdlIG5lZWQsIHNvIHdlIGNhbiBzYWZlbHkgcmV0dXJuIGl0XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXJcblx0XHRcdC5mZXRjaEJ5SWQoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLnJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgbm9vcCwgUm1Db3JlIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRDb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRDb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENvbHVtblNldEZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0SXRlbUNhY2hlRmFjdG9yeSxcblx0SXRlbUVudHJ5RmFjdG9yeSxcblx0SXRlbVJlc291cmNlRmFjdG9yeSxcblx0TW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0UXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0UXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcbn0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQgeyBDaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcy9DaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSc7XG5pbXBvcnQge1xuXHRBdXRoSW50ZXJmYWNlLFxuXHRFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxufSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExpbmtUcmVlU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgSXRlbUVudHJ5IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaUxpbmtUcmVlVHlwZSxcblx0QXBpUmVxdWVzdENvbHVtbk1hcCxcblx0RW50cnlQYXJlbnQsXG5cdEVudHJ5UGFyZW50TnVsbCxcblx0RmllbGRNYXAsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1UeXBlLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBBcGlGb3JtYXR0ZXIgfSBmcm9tICcuLi8uLi9BcGlGb3JtYXR0ZXInO1xuaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9BcGlSZXF1ZXN0U2VydmljZSc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvciB9IGZyb20gJy4uLy4uL0FwaVJlc3BvbnNlUHJvY2Vzc29yJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFSZXN1bHQgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayB9IGZyb20gJy4uLy4uL0NoYW5nZXNQcm9jZXNzb3InO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL0NvbGxlY3Rpb25FbnRyeVNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sdW1uQ2FjaGUgfSBmcm9tICcuLi8uLi9Db2x1bW5DYWNoZSc7XG5pbXBvcnQgeyBDb2x1bW5IYW5kbGVyIH0gZnJvbSAnLi4vLi4vQ29sdW1uSGFuZGxlcic7XG5pbXBvcnQgeyBDb2x1bW5TZXQgfSBmcm9tICcuLi8uLi9Db2x1bW5TZXQnO1xuaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4uLy4uL0NvbHVtblV0aWwnO1xuaW1wb3J0IHsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi8uLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBJdGVtRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vSXRlbUVudHJ5U2VydmljZSc7XG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vS2V5U2VydmljZSc7XG5pbXBvcnQgeyBMb2NrU2VydmljZSB9IGZyb20gJy4uLy4uL0xvY2tTZXJ2aWNlJztcbmltcG9ydCB7IFF1ZXJ5U2VydmljZSB9IGZyb20gJy4uLy4uL1F1ZXJ5U2VydmljZSc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4uLy4uL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcbmltcG9ydCB7IFRlbXBsYXRlQ2FjaGUgfSBmcm9tICcuLi8uLi9UZW1wbGF0ZUNhY2hlJztcbmltcG9ydCB7IGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuLi8uLi9VdGlsJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuLi9BYnN0cmFjdENhY2hlJztcbmltcG9ydCB7IENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyIH0gZnJvbSAnLi9TZXJ2ZXJDb2xsZWN0aW9uSGFuZGxlcic7XG5pbXBvcnQgeyBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzLCBTZXJ2ZXJJdGVtSGFuZGxlciB9IGZyb20gJy4vU2VydmVySXRlbUhhbmRsZXInO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIHtAbGluayBTZXJ2ZXJDYWNoZSBTZXJ2ZXJDYWNoZX0gaXMgcmVzcG9uc2libGUgZm9yIGtlZXBpbmcgdHJhY2sgb2Yge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gYW5kIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJpZXN9XG4gKiB3aGljaCBhcmUgc2F2ZWQgb24gdGhlIHNlcnZlci5cbiAqXG4gKiBJdCdzIGJhc2ljYWxseSBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhYmFzZVxuICovXG5leHBvcnQgY2xhc3MgU2VydmVyQ2FjaGVcblx0ZXh0ZW5kcyBBYnN0cmFjdENhY2hlIHtcblxuXHRwdWJsaWMgcmVhZG9ubHkgaXRlbUhhbmRsZXI6IFNlcnZlckl0ZW1IYW5kbGVyO1xuXHRwdWJsaWMgcmVhZG9ubHkgY29sbGVjdGlvbkhhbmRsZXI6IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyO1xuXG5cdHB1YmxpYyBwYXJlbnQ6IG51bGwgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5OiBDaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSxcblx0XHRjb3JlOiBSbUNvcmUsXG5cdFx0Y29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlLFxuXHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0bG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlLFxuXHRcdG1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeTogQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHRlbXBsYXRlQ2FjaGU6IFRlbXBsYXRlQ2FjaGUsXG5cdFx0aXRlbUNhY2hlRmFjdG9yeTogSXRlbUNhY2hlRmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0Y29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdGl0ZW1FbnRyeUZhY3Rvcnk6IEl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0aXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdGNvbGxlY3Rpb25FbnRyeUZhY3Rvcnk6IENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0XHRsaW5rVHJlZVNlcnZpY2U6IExpbmtUcmVlU2VydmljZUludGVyZmFjZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRjb3JlLFxuXHRcdFx0Y29sdW1uQ2FjaGUsXG5cdFx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0cXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdGF1dGhJbnRlcmZhY2UsXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0bG9ja1NlcnZpY2UsXG5cdFx0XHRtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRcdGl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0ZW1wbGF0ZUNhY2hlLFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRpdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5U2VydmljZSxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGxpbmtUcmVlU2VydmljZSxcblx0XHQpO1xuXG5cdFx0dGhpcy5pdGVtSGFuZGxlciA9IG5ldyBTZXJ2ZXJJdGVtSGFuZGxlcihcblx0XHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0cXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdFx0cXVlcnlTZXJ2aWNlLFxuXHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0aXRlbUVudHJ5RmFjdG9yeSxcblx0XHRcdGl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMsXG5cdFx0KTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbkhhbmRsZXIgPSBuZXcgU2VydmVyQ29sbGVjdGlvbkhhbmRsZXIoXG5cdFx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRjb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHR0aGlzLml0ZW1IYW5kbGVyLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRxdWVyeVNlcnZpY2UsXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0dGhpcyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldFNlcnZlckNhY2hlICgpOiBTZXJ2ZXJDYWNoZSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgcHJvY2Vzc1Jlc3BvbnNlIChcblx0XHRyZXNwb25zZTogQXBpUmVzcG9uc2VQcm9jZXNzb3IsXG5cdFx0cmVxdWVzdENvbHVtbk1hcDogQXBpUmVxdWVzdENvbHVtbk1hcCxcblx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNvcmUuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0XHRjb25zdCByZXNwb25zZUNvbHVtbnNPYmplY3QgPSByZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gcmVzcG9uc2UuaXRlbXMpIHtcblx0XHRcdGxldCBjb2x1bW5TZXQ6IENvbHVtblNldDtcblxuXHRcdFx0aWYgKGl0ZW1UeXBlID09PSByZXNwb25zZS5pdGVtVHlwZSkge1xuXHRcdFx0XHRjb2x1bW5TZXQgPSB0aGlzLmNvcmUuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0cmVxdWVzdENvbHVtbk1hcFtpdGVtVHlwZV0sXG5cdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zT2JqZWN0LFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29sdW1uU2V0ID0gdGhpcy5jb3JlLmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0RnJvbVJlc3BvbnNlKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1uc09iamVjdCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5jb3JlLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0Y29sdW1uU2V0LnJlcXVlc3RDb2x1bW5zVHJ1ZVxuXHRcdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHRcdDogY29sdW1uU2V0LnJlcXVlc3QsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uc09iamVjdCxcblx0XHRcdCk7XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbUlkU3RyaW5nIGluIHJlc3BvbnNlLml0ZW1zW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLnByb2Nlc3NBcGlSZXNwb25zZShcblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0TnVtYmVyKGl0ZW1JZFN0cmluZyksXG5cdFx0XHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0XHRcdGNvbHVtbkV4cGFuc2lvbixcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hcHBseUNoYW5nZXNEZWx0YShcblx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdGlzQ2FsbGVkQWZ0ZXJBcGlTYXZlLFxuXHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBcHBsaWVzIHRoZSBjaGFuZ2VzIG9mIHRoZSBjaGFuZ2VzRGVsdGEgY3JlYXRlZCBieSB0aGUgQVBJIGNhbGwgKHtAbGluayBDaGFuZ2VzUHJvY2Vzc29yIENoYW5nZXNQcm9jZXNzb3J9L3tAbGluayBTb2NrZXRNZXNzYWdlSGFuZGxlciBTb2NrZXRNZXNzYWdlSGFuZGxlcn0sIG9yIG1hbnVhbGx5IHRocm91Z2ggYSBtb2R1bGUgZnVuY3Rpb24pIG9uIGFsbCBjYWNoZXNcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNGcm9tUGFyZW50IChcblx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEsXG5cdFx0aXNDYWxsZWRBZnRlckFwaVNhdmU6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0dGhpcy5pdGVtSGFuZGxlci5wcm9jZXNzSXRlbUVudHJ5Q2hhbmdlcyhcblx0XHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF0sXG5cdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEuZGVsZXRlZCkge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaW50ZXJuYWxDaGFuZ2VzRGVsdGEuZGVsZXRlZFtpdGVtVHlwZV0pIHtcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmNsZWFyKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdHRoaXMsXG5cdFx0XHRpdGVtVHlwZSA9PiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlJdGVtVHlwZShpdGVtVHlwZSksXG5cdFx0KTtcblxuXHRcdGNvbGxlY3Rpb25NYXRjaGVyXG5cdFx0XHQucHJvY2Vzc0RlbHRhKGludGVybmFsQ2hhbmdlc0RlbHRhKVxuXHRcdFx0LnJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zKGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUpO1xuXG5cdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KFxuXHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRcdFx0aXNDYWxsZWRBZnRlckFwaVNhdmUsXG5cdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyB0aGUgZmllbGRzIHJlcXVpcmVkIHRvIHNldCB0aGUgcGFyZW50XG5cdCAqL1xuXHRwdWJsaWMgZ2V0TGlua0ZpZWxkc0J5UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudCxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnQuaXRlbVR5cGVdW2l0ZW1UeXBlIGFzIHN0cmluZ107XG5cdFx0Y29uc3QgcmVzdWx0OiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+ID0ge307XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vbiBleGlzdGluZyBsaW5rIGJldHdlZW4gJyR7cGFyZW50Lml0ZW1UeXBlfSctPicke2l0ZW1UeXBlfSdgKTtcblx0XHR9XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeS50eXBlID09PSBBcGlMaW5rVHJlZVR5cGUuRElSRUNUKSB7XG5cdFx0XHRyZXN1bHRbbGlua1RyZWVFbnRyeS5maWVsZF0gPSBwYXJlbnQuaXRlbUlkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQuaXRlbXR5cGUgPSBwYXJlbnQuaXRlbVR5cGU7XG5cdFx0XHRyZXN1bHQuaXRlbSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyB0aGUgZW50cnkncyBwYXJlbnRcblx0ICpcblx0ICogQHBhcmFtIGl0ZW1FbnRyeSBUaGUgZW50cnkgdG8gZ2V0IHRoZSBwYXJlbnQgZnJvbVxuXHQgKiBAcGFyYW0gX2Zyb21Jbml0aWFsIFVudXNlZCBwYXJhbWV0ZXIsIHRoZXJlIGZvciBhbGlnbm1lbnQgd2l0aCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnQgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnRdXG5cdCAqIEBwYXJhbSBfcHJvdmlkZWRGaWVsZHMgVW51c2VkIHBhcmFtZXRlciwgdGhlcmUgZm9yIGFsaWdubWVudCB3aXRoIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudCBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudF1cblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBVc2Uge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZS5nZXRQYXJlbnQgQ29sbGVjdGlvblJlc291cmNlLmdldFBhcmVudH0gaW5zdGVhZCBvZiB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnQgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnR9IGlmIHlvdSdyZSBnZXR0aW5nIHRoZSBwYXJlbnQgaW4gdGhlIG9uUmVtb3ZlIGNhbGxiYWNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRfZnJvbUluaXRpYWw/OiBib29sZWFuLFxuXHRcdF9wcm92aWRlZEZpZWxkcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEVudHJ5UGFyZW50TnVsbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UGFyZW50RnJvbUZpZWxkcyhcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdFx0Y29weUZpZWxkczogYm9vbGVhbiA9IHRydWUsXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF07XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzICE9PSB1bmRlZmluZWRcblx0XHRcdCYmIGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRpZiAoIWNvcHlGaWVsZHMpIHtcblx0XHRcdFx0cmV0dXJuIGNoYW5nZXM7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRjaGFuZ2VzLFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKGl0ZW1FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vIGxvY2FsIGVudHJ5IGZvdW5kYCk7XG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IEVycm9yKGBObyBsb2NhbCBmaWVsZHMgZm91bmQgZm9yIEl0ZW1FbnRyeSB3aXRoIEl0ZW1UeXBlICcke2l0ZW1FbnRyeS5pdGVtVHlwZX0nYCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE9ubHkgdGFrZXMgdGhlIGxvY2FsIGNoYW5nZXMgaW50byBhY2NvdW50LCB1c2VkIGZvciBzYXZpbmdcblx0ICovXG5cdHB1YmxpYyBnZXRMb2NhbEl0ZW1FbnRyeUNoYW5nZXNUdXBsZSAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0KToge1xuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0Y2hhbmdlczogU2VydmVySXRlbUVudHJ5Q2hhbmdlc1xuXHR9IHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKTtcblxuXHRcdGlmIChpdGVtRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byBnZXQgYSBsb2NhbCBJdGVtRW50cnkgd2l0aCBlbnRyeUlkICcke2l0ZW1FbnRyeUlkfScgYnV0IGNvdWxkbid0IGZpbmQgaXRgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0ZW50cnk6IGl0ZW1FbnRyeSxcblx0XHRcdGNoYW5nZXM6IHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdLFxuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbkNoYW5nZXNSZWN1cnNpdmVseSAoY29sbGVjdGlvbkVudHJ5SWQ6IENvbGxlY3Rpb25FbnRyeVsnaWQnXSk6IEl0ZW1FbnRyeVtdIHtcblx0XHRjb25zdCBlbnRyeSA9IHRoaXMuZ2V0TG9jYWxDb2xsZWN0aW9uRW50cnkoY29sbGVjdGlvbkVudHJ5SWQpO1xuXHRcdGxldCBjaGFuZ2VzID0gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnlJZF07XG5cblx0XHRpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKGNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjaGFuZ2VzID0gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnlJZF0gPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNoYW5nZXMuc2xpY2UoKTtcblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ05vIGxvY2FsIGNvbGxlY3Rpb24gaXRlbXMgZm91bmQnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogSW52YWxpZGF0ZXMgdGhlIGNvbXBsZXRlIHNlcnZlciBjYWNoZSwgYWxsIGl0ZW1zIHdpbGwgYmUgcmUtZmV0Y2hlZCB3aGVuZXZlciB0aGV5IGFyZSByZXF1ZXN0ZWRcblx0ICovXG5cdHB1YmxpYyBpbnZhbGlkYXRlQ2FjaGUgKCk6IHZvaWQge1xuXHRcdC8vIHRoZSBpdGVtSGFuZGxlciBjYWNoZSBvbmx5IGNvbnRhaW5zIHJlbW90ZSBlbnRyaWVzXG5cdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmZvckVhY2goXG5cdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5LnF1ZXVlUmVsb2FkKCksXG5cdFx0KTtcblxuXHRcdC8vIHF1ZXVlUmVsb2FkIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciBlYWNoIGluZGl2aWR1YWwgaXRlbVxuXHRcdHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5mb3JFYWNoKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0+IGNvbGxlY3Rpb25FbnRyeS5xdWV1ZVJlbG9hZCgpLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0aGUgcGFzc2VkIGNoYW5nZXMgZnJvbSB0aGUgY2hpbGQgVHJhbnNhY3Rpb24gaW50byB0aGlzIFRyYW5zYWN0aW9uJ3Mgb3duIGNoYW5nZXMgYW5kIHRoZW4gcHJvcGFnYXRlc1xuXHQgKiB0aGVtIHRvIGFsbCBjaGlsZCBUcmFuc2FjdGlvbnNcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNGcm9tQ2hpbGQgKFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGJyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0b25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1JZENvbnZlcnNpb25NYXA+IHtcblxuXHRcdC8vIHRvZG9bY2FjaGVdIHNob3VsZG4ndCB0aGlzIGRvIGV2ZXJ5dGhpbmcgZnJvbSBUcmFuc2FjdGlvbkNhY2hlLnNhdmUgP1xuXG5cdFx0cmV0dXJuIHRoaXMuY2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnlcblx0XHRcdC5jb25zdHJ1Y3QoXG5cdFx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0XHRicmVha1VwQnlQYXJlbnQsXG5cdFx0XHRcdG9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0XHRcdClcblx0XHRcdC5leGVjdXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEFwcGxpZXMgY2hhbmdlcyB0byB0aGlzIHRyYW5zYWN0aW9uIGFuZCBpdHMgY2hpbGRyZW5cblx0ICogRGlmZmVycyBmcm9tIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGF9IGluIHRoZSBoYW5kbGluZyBvZiBkZWxldGVkIGVudHJpZXMgYW5kIHRoZSBhcHBseUNoYW5nZXNGcm9tUGFyZW50IGNhbGxcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNEZWx0YSAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0aXNDYWxsZWRBZnRlckFwaVNhdmU6IGJvb2xlYW4gPSB0cnVlLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzRGVsdGEuY3JlYXRlZC5sZW5ndGggPT09IDBcblx0XHRcdCYmICFoYXNQcm9wZXJ0aWVzKGNoYW5nZXNEZWx0YS51cGRhdGVkKVxuXHRcdFx0JiYgIWhhc1Byb3BlcnRpZXMoY2hhbmdlc0RlbHRhLmRlbGV0ZWQpXG5cdFx0KSB7XG5cdFx0XHQvLyBlbXB0eSBkZWx0YSwgbm8gbmVlZCB0byBkbyBhbnl0aGluZ1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKHtcblx0XHRcdFx0Y3JlYXRlZDogW10sXG5cdFx0XHRcdHJvbGxiYWNrOiBub29wLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaFVwZGF0ZWREZXJpdmVkVmFsdWVzRnJvbURlbHRhKGNoYW5nZXNEZWx0YSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qge3Jlc3VsdCwgaW50ZXJuYWxDaGFuZ2VzRGVsdGEsIHJvbGxiYWNrRnVuY3Rpb25zfSA9IHN1cGVyLl9hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBjaGFuZ2VzRGVsdGEuZGVsZXRlZCkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgY2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhcihpdGVtRW50cnkpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvbGRDaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnkuaWRdO1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRcdFx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLnNldEl0ZW1EZWxldGVkKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRcdFx0cm9sbGJhY2tGdW5jdGlvbnMucHVzaChcblx0XHRcdFx0XHRcdFx0XHRyb2xsYmFja0RlbHRhID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHJvbGxiYWNrRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2xkQ2hhbmdlcyxcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0XHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdFx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSA9PiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlJdGVtVHlwZShpdGVtVHlwZSksXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyXG5cdFx0XHRcdFx0XHQucHJvY2Vzc0RlbHRhKGludGVybmFsQ2hhbmdlc0RlbHRhKVxuXHRcdFx0XHRcdFx0LnJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zKGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRcdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KFxuXHRcdFx0XHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdFx0aXNDYWxsZWRBZnRlckFwaVNhdmUsXG5cdFx0XHRcdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldExvY2FsSXRlbUVudHJ5IChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHQpOiBJdGVtRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5nZXRCeUVudHJ5SWQoaXRlbUVudHJ5SWQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUVudHJ5WydpdGVtSWQnXSxcblx0KTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGl0ZW1FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldExvY2FsQ29sbGVjdGlvbkVudHJ5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogQ29sbGVjdGlvbkVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlFbnRyeUlkKGNvbGxlY3Rpb25FbnRyeUlkKTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRjaGFuZ2VzT2JqZWN0OiBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBjaGFuZ2VzT2JqZWN0O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uUXVlcnksIEl0ZW1FbnRyeU1hcCwgSXRlbUVudHJ5UGFyZW50SWRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi9jYWNoZS9BYnN0cmFjdENhY2hlJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi9jYWNoZS9zZXJ2ZXIvU2VydmVyQ2FjaGUnO1xuXG5leHBvcnQgY2xhc3MgSXRlbUNhY2hlIHtcblxuXHRwcml2YXRlIGVudHJpZXM6IEl0ZW1FbnRyeU1hcDxhbnk+ID0ge307XG5cblx0cHVibGljIGVudHJpZXNCeUVudHJ5SWQ6IHtcblx0XHRbaXRlbUVudHJ5SWQ6IG51bWJlcl06IEl0ZW1FbnRyeVxuXHR9ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBnZXRCeUVudHJ5SWQgKGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10pOiBJdGVtRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmVudHJpZXNCeUVudHJ5SWRbaXRlbUVudHJ5SWRdO1xuXHR9XG5cblx0c29tZSAoY2FsbGJhY2s6IChpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZT4pID0+IGJvb2xlYW4pIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBlbnRyaWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRpZiAoY2FsbGJhY2soZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGdldEJ5SXRlbVR5cGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChpdGVtVHlwZTogSXRlbVR5cGVUeXBlKSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0cmVzdWx0LnB1c2goZW50cmllc1tpdGVtSWRdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Z2V0QnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IENvbGxlY3Rpb25RdWVyeSxcblx0KSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gZW50cmllc1tpdGVtSWRdO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdHRoaXMubWF0Y2hRdWVyeShcblx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRMb2NhbEJ5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBDb2xsZWN0aW9uUXVlcnksXG5cdCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGVudHJpZXNbaXRlbUlkXTtcblxuXHRcdFx0aWYgKCFpdGVtRW50cnkuaXNMb2NhbCgpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5tYXRjaFF1ZXJ5KFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0KSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRCeVBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0KSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gZW50cmllc1tpdGVtSWRdO1xuXHRcdFx0Y29uc3QgcGFyZW50ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoaXRlbUVudHJ5KTtcblxuXHRcdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRcdGlmIChwYXJlbnQuaXRlbVR5cGUgPT09IHBhcmVudFR5cGUgJiYgcGFyZW50Lml0ZW1JZCA9PSBwYXJlbnRJZCkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRiYXRjaEdldExvY2FsQnlQYXJlbnQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZHM6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0YWRkaXRpb25hbFF1ZXJ5OiBhbnksXG5cdCk6IEl0ZW1FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogSXRlbUVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPiA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBvZiBwYXJlbnRJZHMpIHtcblx0XHRcdHJlc3VsdFtwYXJlbnRJZF0gPSBbXTtcblx0XHR9XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGVudHJpZXNbaXRlbUlkXTtcblx0XHRcdGNvbnN0IHBhcmVudCA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0UGFyZW50KGl0ZW1FbnRyeSk7XG5cblx0XHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwYXJlbnQuaXRlbVR5cGUgIT09IHBhcmVudFR5cGUgfHwgcmVzdWx0W3BhcmVudC5pdGVtSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXRlbUVudHJ5LmlzTG9jYWwoKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFkZGl0aW9uYWxRdWVyeSA9PT0gbnVsbCB8fCB0aGlzLm1hdGNoUXVlcnkoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0YWRkaXRpb25hbFF1ZXJ5LFxuXHRcdFx0KSkge1xuXHRcdFx0XHRyZXN1bHRbcGFyZW50Lml0ZW1JZF0ucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRmb3JFYWNoIChjYWxsYmFjazogKGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlPikgPT4gdm9pZCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGNhbGxiYWNrKGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qXHRmaWx0ZXIgKGNhbGxiYWNrOiAoaXRlbUVudHJ5OiBJdGVtRW50cnkpID0+IGJvb2xlYW4pOiB2b2lkIHtcblx0IGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdCBjb25zdCBmaWx0ZXJlZEVudHJpZXM6IEl0ZW1FbnRyeU1hcCA9IHt9O1xuXG5cdCBmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0IGZpbHRlcmVkRW50cmllc1tpdGVtVHlwZV0gPSB7fTtcblxuXHQgZm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0IGNvbnN0IGl0ZW1FbnRyeSA9IGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0IGlmIChjYWxsYmFjayhpdGVtRW50cnkpKVxuXHQgZmlsdGVyZWRFbnRyaWVzW2l0ZW1UeXBlXVtpdGVtSWRdID0gaXRlbUVudHJ5O1xuXHQgfVxuXHQgfVxuXG5cdCB0aGlzLmVudHJpZXMgPSBmaWx0ZXJlZEVudHJpZXM7XG5cdCB9XG5cdCAqL1xuXHR0b0FycmF5ICgpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGFkZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4pOiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblx0XHRjb25zdCBpdGVtVHlwZSA9IGl0ZW1FbnRyeS5pdGVtVHlwZTtcblxuXHRcdGlmIChlbnRyaWVzW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRlbnRyaWVzW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdHRoaXMuZW50cmllc0J5RW50cnlJZFtpdGVtRW50cnkuaWRdID0gaXRlbUVudHJ5O1xuXG5cdFx0cmV0dXJuIGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1FbnRyeS5pdGVtSWRdID0gaXRlbUVudHJ5O1xuXHR9XG5cblx0Z2V0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IHN0cmluZyB8IEl0ZW1JZCxcblx0KTogdW5kZWZpbmVkIHwgSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLmVudHJpZXNbaXRlbVR5cGVdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLmVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdH1cblxuXHQvLyBzaG91bGQgYmUgZmFzdFxuXHRjb250YWlucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogc3RyaW5nIHwgSXRlbUlkLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXSAhPT0gdW5kZWZpbmVkO1xuXHR9XG5cblx0dXBkYXRlSXRlbUlkPFQgZXh0ZW5kcyBJdGVtRW50cnk8YW55Pj4gKFxuXHRcdGl0ZW1FbnRyeTogVCxcblx0XHRvbGRJdGVtSWQ6IHN0cmluZyB8IEl0ZW1JZCxcblx0KTogVCB7XG5cdFx0Y29uc3QgZW50cnlNYXAgPSB0aGlzLmVudHJpZXNbaXRlbUVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdGRlbGV0ZSBlbnRyeU1hcFtvbGRJdGVtSWRdO1xuXHRcdHJldHVybiBlbnRyeU1hcFtpdGVtRW50cnkuaXRlbUlkXSA9IGl0ZW1FbnRyeTtcblx0fVxuXG5cdGNsZWFyIChpdGVtRW50cnk/OiBJdGVtRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGlmIChpdGVtRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5lbnRyaWVzID0ge307XG5cdFx0XHR0aGlzLmVudHJpZXNCeUVudHJ5SWQgPSB7fTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuY2xlYXJCeUl0ZW1JZChcblx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0KTtcblx0fVxuXG5cdGNsZWFyQnlJdGVtSWQgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0ZGVsZXRlIHRoaXMuZW50cmllc0J5RW50cnlJZFtlbnRyaWVzW2l0ZW1JZF0uaWRdO1xuXG5cdFx0cmV0dXJuIGRlbGV0ZSBlbnRyaWVzW2l0ZW1JZF07XG5cdH1cblxuXHRtYXRjaFF1ZXJ5IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+LFxuXHRcdHF1ZXJ5OiBDb2xsZWN0aW9uUXVlcnksXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHR1cGxlID0gdGhpcy50cmFuc2FjdGlvbi5nZXRMb2NhbEl0ZW1FbnRyeUNoYW5nZXNUdXBsZShpdGVtRW50cnkuaWQpO1xuXG5cdFx0cmV0dXJuIHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeVxuXHRcdFx0LmNvbnN0cnVjdChcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHQodGhpcy50cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFNlcnZlckNhY2hlKVxuXHRcdFx0XHRcdD8gdHVwbGUuY2hhbmdlc1xuXHRcdFx0XHRcdDogdHVwbGUuY2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChpdGVtRW50cnkpLFxuXHRcdFx0KVxuXHRcdFx0Lm1hdGNoUXVlcnkocXVlcnkub2JqZWN0KSA9PT0gdHJ1ZTsgLy8gVE9ETzogbWF5YmU/XG5cdH1cbn1cbiIsImltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBTExfUEVSTUlTU0lPTlMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQXV0aEludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9MaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtRW50cnlPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaUxpbmtUcmVlVHlwZSxcblx0QXBpUmVzcG9uc2UsXG5cdEVudHJ5UGFyZW50LFxuXHRFbnRyeVBhcmVudE51bGwsXG5cdEZpZWxkTWFwLFxuXHRJdGVtRXJyb3IsXG5cdEl0ZW1JZCxcblx0SXRlbUlkQ29udmVyc2lvbk1hcCxcblx0SXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdEl0ZW1UeXBlLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBJdGVtRW50cnlTZXJ2aWNlIHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcml2YXRlIGxpbmtUcmVlU2VydmljZTogTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIG1hdGNoUGFyZW50IChcblx0XHRvbGRQYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0XHRuZXdQYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKG9sZFBhcmVudCA9PT0gbnVsbCAmJiBuZXdQYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdChvbGRQYXJlbnQgPT09IG51bGwgJiYgbmV3UGFyZW50ICE9PSBudWxsKVxuXHRcdFx0fHwgKG9sZFBhcmVudCAhPT0gbnVsbCAmJiBuZXdQYXJlbnQgPT09IG51bGwpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gdGhleSBjYW4ndCBiZSBudWxsIGFueW1vcmUgaGVyZSByaWdodCA/XG5cdFx0cmV0dXJuIChcblx0XHRcdG9sZFBhcmVudCEuaXRlbVR5cGUgPT09IG5ld1BhcmVudCEuaXRlbVR5cGVcblx0XHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0XHQmJiBvbGRQYXJlbnQhLml0ZW1JZCA9PSBuZXdQYXJlbnQhLml0ZW1JZFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgdGhlIGZpZWxkcyByZXF1aXJlZCB0byBzZXQgdGhlIHBhcmVudFxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIE9wcG9zaXRlIG9mIHtAbGluayBJdGVtRW50cnlTZXJ2aWNlLmdldFBhcmVudEJ5RmllbGRzIEl0ZW1FbnRyeVNlcnZpY2UuZ2V0UGFyZW50QnlGaWVsZHN9XG5cdCAqL1xuXHRwdWJsaWMgZ2V0TGlua0ZpZWxkc0J5UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudCxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnQuaXRlbVR5cGVdW2l0ZW1UeXBlIGFzIHN0cmluZ107XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vbiBleGlzdGluZyBsaW5rIGJldHdlZW4gJyR7cGFyZW50Lml0ZW1UeXBlfSctPicke2l0ZW1UeXBlfSdgKTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHQ6IFBhcnRpYWw8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4gPSB7fTtcblxuXHRcdGlmIChsaW5rVHJlZUVudHJ5LnR5cGUgPT09IEFwaUxpbmtUcmVlVHlwZS5ESVJFQ1QpIHtcblx0XHRcdHJlc3VsdFtsaW5rVHJlZUVudHJ5LmZpZWxkXSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdC5pdGVtdHlwZSA9IHBhcmVudC5pdGVtVHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtID0gcGFyZW50Lml0ZW1JZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIGFuIHtAbGluayBFbnRyeVBhcmVudCBFbnRyeVBhcmVudH0gb2JqZWN0IGZyb20gdGhlIGZpZWxkc1xuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIE9wcG9zaXRlIG9mIHtAbGluayBJdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudCBJdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudH1cblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnRCeUZpZWxkczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnRUeXBlXVtpdGVtRW50cnkuaXRlbVR5cGUgYXMgc3RyaW5nXTtcblxuXHRcdGlmIChsaW5rVHJlZUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgTm9uIGV4aXN0aW5nIGxpbmsgYmV0d2VlbiAnJHtwYXJlbnRUeXBlfSctPicke2l0ZW1FbnRyeS5pdGVtVHlwZX0nYCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzdWx0OiBFbnRyeVBhcmVudCA9IHt9IGFzIEVudHJ5UGFyZW50O1xuXG5cdFx0aWYgKGxpbmtUcmVlRW50cnkudHlwZSA9PT0gQXBpTGlua1RyZWVUeXBlLkRJUkVDVCkge1xuXHRcdFx0cmVzdWx0Lml0ZW1UeXBlID0gcGFyZW50VHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtSWQgPSBmaWVsZHNbbGlua1RyZWVFbnRyeS5maWVsZF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHRvZG9bY2FjaGVdIHdlIGFscmVhZHkga25vdyB0aGUgcGFyZW50VHlwZT9cblx0XHRcdHJlc3VsdC5pdGVtVHlwZSA9IGZpZWxkcy5pdGVtdHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtSWQgPSBmaWVsZHMuaXRlbTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGdldERpc3BsYXlOYW1lPEl0ZW1FbnRyeVR5cGUgZXh0ZW5kcyBJdGVtRW50cnk+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeVR5cGUsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPixcblx0KTogc3RyaW5nIHtcblxuXHRcdHN3aXRjaCAoaXRlbUVudHJ5Lml0ZW1UeXBlKSB7XG5cdFx0XHRjYXNlICdDb250YWN0Jzpcblx0XHRcdFx0cmV0dXJuIGZpZWxkcy50eXBlID09PSAnYmVkcmlqZidcblx0XHRcdFx0XHQ/IGZpZWxkcy5iZWRyaWpmXG5cdFx0XHRcdFx0OiB0aGlzLmdldEZ1bGxOYW1lKFxuXHRcdFx0XHRcdFx0ZmllbGRzLnZvb3JuYWFtLFxuXHRcdFx0XHRcdFx0ZmllbGRzLnR1c3NlbnZvZWdzZWwsXG5cdFx0XHRcdFx0XHRmaWVsZHMubmFhbSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSAnTWVkZXdlcmtlcic6XG5cdFx0XHRjYXNlICdQZXJzb24nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRGdWxsTmFtZShcblx0XHRcdFx0XHRmaWVsZHMudm9vcm5hYW0sXG5cdFx0XHRcdFx0ZmllbGRzLnR1c3NlbnZvZWdzZWwsXG5cdFx0XHRcdFx0ZmllbGRzLmFjaHRlcm5hYW0sXG5cdFx0XHRcdCk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmllbGRzW3RoaXMuZ2V0VGl0bGVGaWVsZChpdGVtRW50cnkuaXRlbVR5cGUpXTtcblx0XHR9XG5cdH1cblxuXHRwcm9jZXNzT3B0aW9ucyAob3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UpOiBJdGVtRW50cnlPcHRpb25zIHtcblx0XHRyZXR1cm4gbmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyk7XG5cdH1cblxuXHQvLyB0b2RvOiB0cmFuc2xhdGVcblx0Y3JlYXRlVW5mb3VuZFJlbW90ZUl0ZW1FcnJvciAoKTogSXRlbUVycm9yIHtcblx0XHRyZXR1cm4ge21lc3NhZ2U6ICdUaGUgcmVxdWVzdGVkIGl0ZW0gY291bGQgbm90IGJlIGZvdW5kIC8geW91ciBjdXJyZW50IHBlcm1pc3Npb25zIGFyZSBub3Qgc3VmZmljaWVudCd9O1xuXHR9XG5cblx0Y3JlYXRlVW5mb3VuZExvY2FsSXRlbUVycm9yIChpdGVtVHlwZTogSXRlbVR5cGUpOiBJdGVtRXJyb3Ige1xuXHRcdHJldHVybiB7bWVzc2FnZTogYEEgbG9jYWwgaXRlbSBvZiB0eXBlICR7aXRlbVR5cGV9IGNvdWxkIG5vdCBiZSBmb3VuZGB9O1xuXHR9XG5cblx0Y3JlYXRlRXhpc3RpbmdMb2NhbEl0ZW1FcnJvciAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogSXRlbUVycm9yIHtcblx0XHRyZXR1cm4ge21lc3NhZ2U6IGBBIGxvY2FsIGl0ZW0gb2YgdHlwZSAke2l0ZW1UeXBlfSBub3QgYmUgY3JlYXRlZCwgdGhlIElEIGlzIGFscmVhZHkgaW4gdXNlYH07XG5cdH1cblxuXHRjcmVhdGVMb2NhbENvbnZlcnNpb25NYXAgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRkb0V4dGVuZDogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZSxcblx0KTogSXRlbUlkQ29udmVyc2lvbk1hcCB7XG5cdFx0Y29uc3QgYXBpSXRlbUlkID0gYXBpUmVzcG9uc2UubGlua3NbaXRlbVR5cGVdWzBdO1xuXHRcdGNvbnN0IHJlc3VsdDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9O1xuXG5cdFx0cmVzdWx0W2l0ZW1UeXBlXSA9IHt9O1xuXHRcdHJlc3VsdFtpdGVtVHlwZV1bYXBpSXRlbUlkXSA9IGl0ZW1JZDtcblxuXHRcdGlmIChkb0V4dGVuZCkge1xuXHRcdFx0dGhpcy5leHBhbmRMb2NhbENvbnZlcnNpb25NYXAoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRhcGlJdGVtSWQsXG5cdFx0XHRcdGFwaVJlc3BvbnNlLFxuXHRcdFx0XHRyZXN1bHQsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRleHBhbmRMb2NhbENvbnZlcnNpb25NYXAgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdFx0YXBpUmVzcG9uc2U6IEFwaVJlc3BvbnNlLFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGxpbmtzID0gYXBpUmVzcG9uc2UuaXRlbXNbcGFyZW50VHlwZV1bcGFyZW50SWRdLmxpbmtzO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBsaW5rcykge1xuXHRcdFx0Y29uc3QgaWRBcnJheSA9IGxpbmtzW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKGNvbnZlcnNpb25NYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udmVyc2lvbk1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBhcGlJdGVtSWQgb2YgaWRBcnJheSkge1xuXHRcdFx0XHRjb252ZXJzaW9uTWFwW2l0ZW1UeXBlXVthcGlJdGVtSWRdID0gdGhpcy5rZXlTZXJ2aWNlLmdldExvY2FsSWQoKTtcblxuXHRcdFx0XHR0aGlzLmV4cGFuZExvY2FsQ29udmVyc2lvbk1hcChcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRhcGlJdGVtSWQsXG5cdFx0XHRcdFx0YXBpUmVzcG9uc2UsXG5cdFx0XHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRleHBhbmRDb252ZXJzaW9uTWFwIChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdFx0bmV3SXRlbUlkPzogSXRlbUlkLFxuXHQpOiBJdGVtSWQge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gaXRlbUVudHJ5Lml0ZW1UeXBlO1xuXHRcdGNvbnN0IGl0ZW1JZCA9IGl0ZW1FbnRyeS5pdGVtSWQ7XG5cblx0XHRsZXQgY29udmVyc2lvbk1hcEVudHJ5O1xuXG5cdFx0aWYgKGNvbnZlcnNpb25NYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnZlcnNpb25NYXBbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0Y29udmVyc2lvbk1hcEVudHJ5ID0gY29udmVyc2lvbk1hcFtpdGVtVHlwZV07XG5cblx0XHRpZiAoY29udmVyc2lvbk1hcEVudHJ5W2l0ZW1JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGNvbnZlcnNpb25NYXBFbnRyeVtpdGVtSWRdO1xuXHRcdH1cblxuXHRcdGlmIChuZXdJdGVtSWQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bmV3SXRlbUlkID0gdGhpcy5rZXlTZXJ2aWNlLmdldExvY2FsSWQoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29udmVyc2lvbk1hcEVudHJ5W2l0ZW1JZF0gPSBuZXdJdGVtSWQ7XG5cdH1cblxuXHRiYXRjaEV4cGFuZENvbnZlcnNpb25NYXAgKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8YW55Pj4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogSXRlbUlkQ29udmVyc2lvbk1hcCB7XG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdHRoaXMuZXhwYW5kQ29udmVyc2lvbk1hcChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29udmVyc2lvbk1hcDtcblx0fVxuXG5cdGdldENvbnZlcnNpb25WYWx1ZSAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogSXRlbUlkIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAobWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdH1cblxuXHRnZXRGdWxsTmFtZSAoXG5cdFx0Zmlyc3ROYW1lOiBzdHJpbmcgPSAnJyxcblx0XHRpbmZpeDogc3RyaW5nID0gJycsXG5cdFx0bGFzdE5hbWU6IHN0cmluZyA9ICcnLFxuXHQpOiBzdHJpbmcge1xuXHRcdHJldHVybiBmaXJzdE5hbWVcblx0XHRcdC50cmltKClcblx0XHRcdC5jb25jYXQoXG5cdFx0XHRcdCcgJyxcblx0XHRcdFx0aW5maXgsXG5cdFx0XHQpXG5cdFx0XHQudHJpbSgpXG5cdFx0XHQuY29uY2F0KFxuXHRcdFx0XHQnICcsXG5cdFx0XHRcdGxhc3ROYW1lLFxuXHRcdFx0KVxuXHRcdFx0LnRyaW0oKTtcblx0fVxuXG5cdGdldFRpdGxlRmllbGQgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IHN0cmluZyB7XG5cdFx0c3dpdGNoIChpdGVtVHlwZSkge1xuXHRcdFx0Y2FzZSAnRXhlbXBsYWFyJzpcblx0XHRcdFx0cmV0dXJuICdzZXJpZW51bW1lcic7XG5cdFx0XHRjYXNlICdGYWN0dXVyJzpcblx0XHRcdFx0cmV0dXJuICdudW1tZXInO1xuXHRcdFx0Y2FzZSAnRmlsZXMnOlxuXHRcdFx0XHRyZXR1cm4gJ2ZyaWVuZGx5bmFtZSc7XG5cdFx0XHRjYXNlICdGdW5jdGllJzpcblx0XHRcdGNhc2UgJ1N0YW5kYWFyZGZ1bmN0aWUnOlxuXHRcdFx0XHRyZXR1cm4gJ25hYW1pbnRlcm4nO1xuXHRcdFx0Y2FzZSAnVm9vcnJhYWRtdXRhdGllJzpcblx0XHRcdFx0cmV0dXJuICdvbXNjaHJpanZpbmcnO1xuXHRcdFx0Y2FzZSAnQmFyY29kZSc6XG5cdFx0XHRcdHJldHVybiAnY29kZSc7XG5cdFx0XHRjYXNlICdCZXRhYWxtaWRkZWwnOlxuXHRcdFx0Y2FzZSAnQmV0YWxpbmdzY29uZGl0aWUnOlxuXHRcdFx0Y2FzZSAnQnJpZWZwYXBpZXInOlxuXHRcdFx0Y2FzZSAnVGF4Q2xhc3MnOlxuXHRcdFx0Y2FzZSAnVGF4U2NoZW1hJzpcblx0XHRcdGNhc2UgJ0NvbmRpdGlvbic6XG5cdFx0XHRjYXNlICdGYWN0dXVybW9tZW50Jzpcblx0XHRcdGNhc2UgJ0Z1bmN0aWVncm9lcCc6XG5cdFx0XHRjYXNlICdHcm9vdGJvZWsnOlxuXHRcdFx0Y2FzZSAnSW5odXVyJzpcblx0XHRcdGNhc2UgJ0luaHV1cmdyb2VwJzpcblx0XHRcdGNhc2UgJ0luaHV1cm1hdGVyaWFhbCc6XG5cdFx0XHRjYXNlICdNYXRlcmlhYWwnOlxuXHRcdFx0Y2FzZSAnTWF0ZXJpYWFsQ2F0Jzpcblx0XHRcdGNhc2UgJ01lZGV3ZXJrZXJ0YXJpZWYnOlxuXHRcdFx0Y2FzZSAnTm90aXRpZSc6XG5cdFx0XHRjYXNlICdQbGFubmluZ21hdGVyaWFhbCc6XG5cdFx0XHRjYXNlICdQcm9qZWN0Jzpcblx0XHRcdGNhc2UgJ1N0YWZmZWxncm9lcCc6XG5cdFx0XHRjYXNlICdTdWJwcm9qZWN0Jzpcblx0XHRcdGNhc2UgJ1RhYWsnOlxuXHRcdFx0Y2FzZSAnVGFnJzpcblx0XHRcdGNhc2UgJ1RlbXBsYXRlJzpcblx0XHRcdGNhc2UgJ1RpamQnOlxuXHRcdFx0Y2FzZSAnVGl0ZWwnOlxuXHRcdFx0Y2FzZSAnVHlwZSc6XG5cdFx0XHRjYXNlICdWb2VydHVpZyc6XG5cdFx0XHRcdHJldHVybiAnbmFhbSc7XG5cdFx0XHQvLyBjYXNlICdDb250YWN0Jzpcblx0XHRcdC8vIGNhc2UgJ01lZGV3ZXJrZXInOlxuXHRcdFx0Ly8gY2FzZSAnUGVyc29uJzpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdC8vIG9ubHkgdXNlIGRpc3BsYXluYW1lIGZvciBpdGVtcyB0aGF0IGRvbnQndCBoYXZlIGEgc2ltcGxlLCB3cml0YWJsZSBuYW1lIGZpZWxkXG5cdFx0XHRcdC8vIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIGZvciB0ZW1wbGF0ZWQgaXRlbXNcblx0XHRcdFx0cmV0dXJuICdkaXNwbGF5bmFtZSc7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETzogd2UgY2FuIHJlbW92ZSB0aGVzZSBvbmNlIGFsbCBjb2x1bW5zIGFyZSByZXNwZWN0ZWQgZm9yIGxvY2FsIGl0ZW1zIFtSTTQtMTAzNzhdXG5cdHB1YmxpYyBnZXRMb2NhbERlZmF1bHRWYWx1ZXMgKCk6IEZpZWxkTWFwIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cGVybWlzc2lvbnM6IEFMTF9QRVJNSVNTSU9OUyxcblx0XHRcdGNyZWF0b3I6IHRoaXMuYXV0aEludGVyZmFjZS5nZXRVc2VySWQoKSxcblx0XHRcdGNyZWF0ZWQ6IG1vbWVudCgpLFxuXHRcdH07XG5cdH1cbn1cbiIsImltcG9ydCB7IERVUExJQ0FURV9LRVlXT1JELCBEVVBMSUNBVEVfUFJFRklYLCBORVdfS0VZV09SRCwgTkVXX1BSRUZJWCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJdGVtSWQsIFN0YXRlS2V5LCBTdGF0ZUtleVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBLZXlTZXJ2aWNlIHtcblx0c2VwYXJhdG9yOiBzdHJpbmcgPSAnOic7XG5cblx0Y29uc3RydWN0b3IgKCkge31cblxuXHRnZXRTaW5nbGVLZXkgKGl0ZW1UeXBlOiBzdHJpbmcsIGl0ZW1JZDogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gaXRlbVR5cGUgKyB0aGlzLnNlcGFyYXRvciArIGl0ZW1JZDtcblx0fVxuXG5cdGdldENzc0tleSAoLi4uYXJncyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGFyZ3Muam9pbignXycpO1xuXHR9XG5cblx0cGFyc2VTdGF0ZUtleSAoc3RhdGVLZXk6IHN0cmluZyk6IFN0YXRlS2V5IHwgbnVsbCB7XG5cdFx0c3RhdGVLZXkgPSBzdGF0ZUtleS50b1N0cmluZygpO1xuXG5cdFx0aWYgKHN0YXRlS2V5LnN1YnN0cmluZygwLCBORVdfS0VZV09SRC5sZW5ndGgpID09PSBORVdfS0VZV09SRClcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHR5cGU6IFN0YXRlS2V5VHlwZS5OZXcsXG5cdFx0XHRcdHRlbXBsYXRlOiBzdGF0ZUtleS5zdWJzdHJpbmcoTkVXX0tFWVdPUkQubGVuZ3RoKSAvLyBUT0RPOiB0aGlzIGlzIGN1cnJlbnRseSBub3QgYmVpbmcgdXNlZCwgcmVldmFsdWF0ZVxuXHRcdFx0fTtcblxuXHRcdGlmIChzdGF0ZUtleS5zdWJzdHJpbmcoMCwgRFVQTElDQVRFX0tFWVdPUkQubGVuZ3RoKSA9PT0gRFVQTElDQVRFX0tFWVdPUkQpXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0eXBlOiBTdGF0ZUtleVR5cGUuRHVwbGljYXRlLFxuXHRcdFx0XHRpdGVtSWQ6ICtzdGF0ZUtleS5zdWJzdHJpbmcoRFVQTElDQVRFX0tFWVdPUkQubGVuZ3RoKVxuXHRcdFx0fTtcblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Z2V0RHVwbGljYXRlU3RhdGVLZXkgKGl0ZW1JZDogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gRFVQTElDQVRFX0tFWVdPUkQgKyBpdGVtSWQ7XG5cdH1cblxuXHRnZXROZXdTdGF0ZUtleSAodGVtcGxhdGVUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBORVdfS0VZV09SRCArIHRlbXBsYXRlVHlwZTtcblx0fVxuXG5cdGdldExvY2FsSWQgKCk6IEl0ZW1JZCB7XG5cdFx0cmV0dXJuICsoTkVXX1BSRUZJWCArIHRoaXMuZ2V0UmFuZG9tU3RyaW5nKCkpO1xuXHR9XG5cblx0Z2V0TG9jYWxEdXBsaWNhdGVJZCAoKTogSXRlbUlkIHtcblx0XHRyZXR1cm4gKyhEVVBMSUNBVEVfUFJFRklYICsgdGhpcy5nZXRSYW5kb21TdHJpbmcoKSk7XG5cdH1cblxuXHRnZXRSYW5kb21TdHJpbmcgKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuICgnJyArIE1hdGgucmFuZG9tKCkpLnNwbGl0KCcuJylbMV0uc3Vic3RyKDAsIDgpO1xuXHR9XG5cblx0Ly8gbm90ZTogdGhlIGNoYW5nZXMgY29tcGlsZXIgdXNlcyB0aGlzXG5cdC8vIG1pZ2h0IGJlIGNhbGxlZCB3aXRoIHVuZGVmaW5lZCAoaXRlbUhhbmRsZXIuY3JlYXRlUmVxdWVzdClcblx0aXNMb2NhbElkIChpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiAodGhpcy5pc05ld0lkKGl0ZW1JZCkgfHwgdGhpcy5pc0R1cGxpY2F0ZUlkKGl0ZW1JZCkpO1xuXHR9XG5cblx0aXNOZXdJZCAoaXRlbUlkOiBJdGVtSWQgfCBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gaXRlbUlkID09PSBORVdfS0VZV09SRCB8fCAoJycgKyBpdGVtSWQpLnN1YnN0cmluZygwLCBORVdfUFJFRklYLmxlbmd0aCkgPT09IE5FV19QUkVGSVg7XG5cdH1cblxuXHRpc0R1cGxpY2F0ZUlkIChpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBpdGVtSWQgPT09IERVUExJQ0FURV9LRVlXT1JEIHx8ICgnJyArIGl0ZW1JZCkuc3Vic3RyaW5nKDAsIERVUExJQ0FURV9QUkVGSVgubGVuZ3RoKSA9PT0gRFVQTElDQVRFX1BSRUZJWDtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2UsIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtSWQsIEl0ZW1NYXAsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IGNyZWF0ZVBhdGggfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdHlwZSBMb2NrVG9rZW4gPSB7aXNGb3JlaWduOiBmYWxzZSwgaWQ6IG51bWJlciwgdG9rZW46IHN0cmluZ30gfCB7aXNGb3JlaWduOiB0cnVlLCBtZXNzYWdlOiBzdHJpbmd9O1xuXG5leHBvcnQgY2xhc3MgTG9ja1NlcnZpY2Uge1xuXG5cdHByaXZhdGUgbG9ja0l0ZW1zOiBJdGVtTWFwPExvY2tUb2tlbj4gPSB7fTtcblx0cHJpdmF0ZSBwcm9taXNlczogSXRlbU1hcDxQcm9taXNlSW50ZXJmYWNlPExvY2tUb2tlbj4+ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIGdldExvY2tzICgpOiBMb2NrU2VydmljZVsnbG9ja0l0ZW1zJ10ge1xuXHRcdHJldHVybiB0aGlzLmxvY2tJdGVtcztcblx0fVxuXG5cdHB1YmxpYyBoYXNMb2NrIChsb2NrVG9rZW5JZDogSXRlbUlkKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbG9ja0l0ZW1zID0gdGhpcy5sb2NrSXRlbXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGxvY2tJdGVtcykge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gbG9ja0l0ZW1zW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRjb25zdCBsb2NrSXRlbSA9IGxvY2tJdGVtc1tpdGVtVHlwZV1baXRlbUlkXTtcblxuXHRcdFx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdFx0XHRpZiAoIWxvY2tJdGVtLmlzRm9yZWlnbiAmJiBsb2NrSXRlbS5pZCA9PSBsb2NrVG9rZW5JZCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gc2hvdWxkIGJlIGZhc3QgKHdhdGNoZWQpXG5cdHB1YmxpYyBpc0xvY2tlZCAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGxvY2tJdGVtID0gdGhpcy5nZXRWYWx1ZShcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMubG9ja0l0ZW1zLFxuXHRcdCk7XG5cblx0XHRpZiAobG9ja0l0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBsb2NrSXRlbS5pc0ZvcmVpZ247XG5cdH1cblxuXHRwdWJsaWMgZ2V0TWVzc2FnZSAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IHVuZGVmaW5lZCB8IHN0cmluZyB7XG5cdFx0Y29uc3QgbG9ja0l0ZW0gPSB0aGlzLmdldFZhbHVlKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0dGhpcy5sb2NrSXRlbXMsXG5cdFx0KTtcblxuXHRcdGlmIChsb2NrSXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGlmICghbG9ja0l0ZW0uaXNGb3JlaWduKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBsb2NrSXRlbS5tZXNzYWdlO1xuXHR9XG5cblx0Ly8gZG9lcyBub3QgcmVqZWN0IHdoZW4gYSBmb3JlaWduIGxvY2sgaXMgZW5jb3VudGVyZWRcblx0Ly8gaXMgYWxzbyB1c2VkIGJ5IGRlbGV0ZUxvY2tcblx0cHVibGljIGZldGNoQ2FjaGVkTG9jayAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IFByb21pc2VJbnRlcmZhY2U8dW5kZWZpbmVkIHwgTG9ja1Rva2VuPiB7XG5cdFx0Y29uc3QgbG9jayA9IHRoaXMuZ2V0VmFsdWUoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHR0aGlzLmxvY2tJdGVtcyxcblx0XHQpO1xuXG5cdFx0aWYgKGxvY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihsb2NrKTtcblx0XHR9XG5cblx0XHRjb25zdCBwcm9taXNlID0gdGhpcy5nZXRWYWx1ZShcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMucHJvbWlzZXMsXG5cdFx0KTtcblxuXHRcdGlmIChwcm9taXNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBwcm9taXNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaExvY2sgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4pOiBQcm9taXNlSW50ZXJmYWNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IGVycm9ySGFuZGxlciA9IHRoaXMuZXJyb3JIYW5kbGVyO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmV0Y2hDYWNoZWRMb2NrKGl0ZW1FbnRyeSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRsb2NrSXRlbSA9PiB7XG5cdFx0XHRcdFx0aWYgKGxvY2tJdGVtICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBsb2NrSXRlbTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0TG9jayhpdGVtRW50cnkpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGxvY2tJdGVtID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gbG9ja0l0ZW0uaXNGb3JlaWduID9cblx0XHRcdFx0XHRcdGVycm9ySGFuZGxlci5yZWplY3QobG9ja0l0ZW0ubWVzc2FnZSkgOlxuXHRcdFx0XHRcdFx0bG9ja0l0ZW0udG9rZW47XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlcXVlc3RMb2NrIChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogUHJvbWlzZUludGVyZmFjZTxMb2NrVG9rZW4+IHtcblx0XHRjb25zdCB7aXRlbVR5cGUsIGl0ZW1JZH0gPSBpdGVtRW50cnk7XG5cblx0XHRjb25zdCBwcm9taXNlID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LmNyZWF0ZShcblx0XHRcdFx0J0xvY2t0b2tlbicsXG5cdFx0XHRcdHRoaXMua2V5U2VydmljZS5nZXRMb2NhbElkKCksXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpdGVtdHlwZTogaXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbTogaXRlbUlkLFxuXHRcdFx0XHR9LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5wcm9taXNlc1tpdGVtVHlwZV1baXRlbUlkXTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnNldFZhbHVlKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdFx0XHRcdCdMb2NrdG9rZW4nLFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZS5saW5rcy5Mb2NrdG9rZW5bMF0sXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0dGhpcy5sb2NrSXRlbXMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0ZXJyb3IgPT4ge1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnByb21pc2VzW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXG5cdFx0XHRcdFx0aWYgKGVycm9yLmNvZGUgPT09IDMwMSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0VmFsdWUoXG5cdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlzRm9yZWlnbjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR0aGlzLmxvY2tJdGVtcyxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0VmFsdWUoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRwcm9taXNlLFxuXHRcdFx0dGhpcy5wcm9taXNlcyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGRlbGV0ZUxvY2sgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4pOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5mZXRjaENhY2hlZExvY2soaXRlbUVudHJ5KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGNhY2hlZExvY2sgPT4ge1xuXHRcdFx0XHRcdC8vIHVuZGVmaW5lZDogbm90IHJlcXVlc3RlZCB5ZXRcblx0XHRcdFx0XHRpZiAoY2FjaGVkTG9jayA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGNhY2hlZExvY2suaXNGb3JlaWduKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmNsZWFyTG9jayhpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdFx0XHRcdC5kZWxldGUoXG5cdFx0XHRcdFx0XHRcdCdMb2NrdG9rZW4nLFxuXHRcdFx0XHRcdFx0XHRbY2FjaGVkTG9jay5pZF0sXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY2xlYXJMb2NrKGl0ZW1FbnRyeSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY2xlYXJMb2NrIChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbG9ja0l0ZW1zID0gdGhpcy5sb2NrSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdGlmIChsb2NrSXRlbXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWxldGUgbG9ja0l0ZW1zW2l0ZW1FbnRyeS5pdGVtSWRdO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRWYWx1ZTxUPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pixcblx0XHRtYXA6IEl0ZW1NYXA8VD4sXG5cdCk6IHVuZGVmaW5lZCB8IFQge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gaXRlbUVudHJ5Lml0ZW1UeXBlO1xuXG5cdFx0aWYgKG1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwW2l0ZW1UeXBlXVtpdGVtRW50cnkuaXRlbUlkXTtcblx0fVxuXG5cdHByaXZhdGUgc2V0VmFsdWU8VD4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4sXG5cdFx0dmFsdWU6IFQsXG5cdFx0bWFwOiBJdGVtTWFwPFQ+LFxuXHQpOiBUIHtcblx0XHRyZXR1cm4gY3JlYXRlUGF0aChcblx0XHRcdG1hcCxcblx0XHRcdFtcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0e30sXG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0XSxcblx0XHQpO1xuXHR9XG5cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0SXRlbU1hcCwgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuaW1wb3J0IHsgaGFzUHJvcGVydGllcyB9IGZyb20gJy4vVXRpbCc7XG5cbmNvbnN0IEVNUFRZX0VOVFJZID0ge307XG5cbmV4cG9ydCB0eXBlIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCA9IHtcblx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRpdGVtSWQ6IEl0ZW1JZCxcblx0aXRlbXM6IEFwaVJlcXVlc3RJdGVtTWFwXG59O1xuXG5leHBvcnQgY2xhc3MgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uIHtcblxuXHRwdWJsaWMgcGFyZW50TWFwOiBhbnkgPSB7fTtcblx0cHVibGljIGRlc3RpbmF0aW9uOiBBcGlSZXF1ZXN0SXRlbU1hcCA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0fVxuXG5cdHByb2Nlc3MgKCk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCB7XG5cdFx0aWYgKHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdBIFRyYW5zYWN0aW9uQ2FjaGUgcm9vdEl0ZW0gaXMgcmVxdWlyZWQgZm9yIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbicpO1xuXHRcdH1cblxuXHRcdHRoaXMucGFyZW50TWFwID0gdGhpcy5jcmVhdGVQYXJlbnRNYXAoKTtcblxuXHRcdHRoaXMucHJvY2Vzc0l0ZW1zKFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5yb290SXRlbS5pdGVtVHlwZSxcblx0XHRcdFt0aGlzLnRyYW5zYWN0aW9uLnJvb3RJdGVtXSxcblx0XHRcdHt9LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0aXRlbVR5cGU6IHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0uaXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQ6IHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0uaXRlbUlkLFxuXHRcdFx0aXRlbXM6IHRoaXMuZGVzdGluYXRpb24sXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlUGFyZW50TWFwICgpIHtcblx0XHRjb25zdCByZXN1bHQ6IHtcblx0XHRcdFtwYXJlbnRUeXBlOiBzdHJpbmddOiB7XG5cdFx0XHRcdFtwYXJlbnRJZDogbnVtYmVyXToge1xuXHRcdFx0XHRcdFtpdGVtVHlwZTogc3RyaW5nXTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlPj5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gPSB7fTtcblxuXHRcdC8vIHRvZG86IGFsc28gaW5jbHVkZSBwYXJlbnQncyBlbnRyaWVzID8gcHJvYmFibHkgbm90Li4uXG5cdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5lbnRyaWVzLmZvckVhY2goXG5cdFx0XHRpdGVtRW50cnkgPT4ge1xuXHRcdFx0XHRjb25zdCBpdGVtVHlwZSA9IGl0ZW1FbnRyeS5pdGVtVHlwZTtcblx0XHRcdFx0Y29uc3QgcGFyZW50ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHQvLyB3ZSBkb24ndCBjYXJlIGZvciBpdGVtcyB0aGF0IGFyZSBub3QgbGlua2VkIHRvIHRoZSByb290IGl0ZW1cblx0XHRcdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHBhcmVudFR5cGUgPSBwYXJlbnQuaXRlbVR5cGU7XG5cdFx0XHRcdGNvbnN0IHBhcmVudElkID0gcGFyZW50Lml0ZW1JZDtcblxuXHRcdFx0XHRpZiAocmVzdWx0W3BhcmVudFR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV0gPSB7fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdID0ge307XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0W3BhcmVudFR5cGVdW3BhcmVudElkXVtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJlc3VsdFtwYXJlbnRUeXBlXVtwYXJlbnRJZF1baXRlbVR5cGVdID0gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdW2l0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzSXRlbXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0bGlua0FjY3VtdWxhdG9yOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBJdGVtSWRbXX0sXG5cdCkge1xuXHRcdGlmICh0aGlzLmRlc3RpbmF0aW9uW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmRlc3RpbmF0aW9uW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdGlmIChsaW5rQWNjdW11bGF0b3JbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGxpbmtBY2N1bXVsYXRvcltpdGVtVHlwZV0gPSBbXTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblxuXHRcdFx0Ly8gZWFjaCBpdGVtIG9ubHkgaGFzIGEgc2luZ2xlIHBhcmVudCwgc28gd2UgY2FuIHNhZmVseSBkbyB0aGlzXG5cdFx0XHRpZiAodGhpcy5kZXN0aW5hdGlvbltpdGVtVHlwZV1baXRlbUlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsaW5rQWNjdW11bGF0b3JbaXRlbVR5cGVdLnB1c2goaXRlbUlkKTtcblxuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbltpdGVtVHlwZV1baXRlbUlkXSA9IHRoaXMucHJvY2Vzc0l0ZW0oaXRlbUVudHJ5KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NJdGVtPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0KToge3ZhbHVlcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sIGxpbmtzPzoge1tpdGVtVHlwZTogc3RyaW5nXTogSXRlbUlkW119fSB7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBpdGVtRW50cnkuaXRlbVR5cGU7XG5cdFx0Y29uc3QgaXRlbUlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblx0XHRjb25zdCBjaGlsZEl0ZW1zID0gdGhpcy5nZXRJdGVtc0J5UGFyZW50KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNoaWxkQ29sbGVjdGlvbnMgPSB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0Q29sbGVjdGlvbnNCeVBhcmVudChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmZvcm1hdFJlcXVlc3QoaXRlbUVudHJ5KTtcblx0XHRjb25zdCBsaW5rcyA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjaGlsZFR5cGUgaW4gY2hpbGRJdGVtcykge1xuXHRcdFx0dGhpcy5wcm9jZXNzSXRlbXMoXG5cdFx0XHRcdGNoaWxkVHlwZSxcblx0XHRcdFx0Y2hpbGRJdGVtc1tjaGlsZFR5cGVdLFxuXHRcdFx0XHRsaW5rcyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY2hpbGRDb2xsZWN0aW9ucykge1xuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLnF1ZXJ5ICE9PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnByb2Nlc3NJdGVtcyhcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHQvLyB0b2RvW2NhY2hlXSBVc2UgZ2V0Q29sbGVjdGlvbkNoYW5nZXNSZWN1cnNpdmVseVxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeS5pZF0sXG5cdFx0XHRcdGxpbmtzLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBoYXNWYWx1ZXMgPSBoYXNQcm9wZXJ0aWVzKHZhbHVlcyk7XG5cdFx0Y29uc3QgaGFzTGlua3MgPSBoYXNQcm9wZXJ0aWVzKGxpbmtzKTtcblxuXHRcdGlmIChoYXNWYWx1ZXMgJiYgaGFzTGlua3MpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHZhbHVlczogdmFsdWVzLFxuXHRcdFx0XHRsaW5rczogbGlua3MsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNWYWx1ZXMpIHtcblx0XHRcdHJldHVybiB7dmFsdWVzOiB2YWx1ZXN9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNMaW5rcykge1xuXHRcdFx0cmV0dXJuIHtsaW5rczogbGlua3N9O1xuXHRcdH1cblxuXHRcdHJldHVybiBFTVBUWV9FTlRSWTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0SXRlbXNCeVBhcmVudCAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWQ6IEl0ZW1JZCxcblx0KSB7XG5cdFx0Y29uc3QgbWFwRW50cnkgPSB0aGlzLnBhcmVudE1hcFtwYXJlbnRUeXBlXTtcblxuXHRcdGlmIChtYXBFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXG5cdFx0aWYgKG1hcEVudHJ5W3BhcmVudElkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hcEVudHJ5W3BhcmVudElkXTtcblx0fVxufVxuIiwiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IEFwaUZvcm1hdHRlciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBoYXNQcm9wZXJ0aWVzLCBpbkFycmF5IH0gZnJvbSAnLi9VdGlsJztcblxuY29uc3QgTUFZQkUgPSAnbWF5YmUnO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlNYXRjaGVyIHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRwdWJsaWMgZmllbGRzOiBGaWVsZE1hcCxcblx0XHRwdWJsaWMgcGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsLFxuXHQpIHtcblxuXHR9XG5cblx0cHJpdmF0ZSBjb21wYXJlVmFsdWVzIChcblx0XHR2YWx1ZTogYW55LFxuXHRcdHF1ZXJ5VmFsdWU6IGFueSxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKG1vbWVudC5pc01vbWVudChxdWVyeVZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmNvbXBhcmVNb21lbnRPYmplY3RzKFxuXHRcdFx0XHRxdWVyeVZhbHVlLFxuXHRcdFx0XHR2YWx1ZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1vbWVudC5pc0R1cmF0aW9uKHF1ZXJ5VmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuY29tcGFyZUR1cmF0aW9ucyhcblx0XHRcdFx0cXVlcnlWYWx1ZSxcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0cmV0dXJuIHF1ZXJ5VmFsdWUgPT0gdmFsdWU7XG5cdH1cblxuXHRtYXRjaFF1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0aWYgKHF1ZXJ5LnNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5LmN1c3RvbSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0Ly8gbGlua2VkVG8gYWxzbyBjb250YWlucyAucXVlcnlcblx0XHRpZiAocXVlcnkubGlua2VkVG8gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubWF0Y2hMaW5rZWRUb1F1ZXJ5KHF1ZXJ5KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkucXVlcnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIE1BWUJFO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5jb25kaXRpb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLm1hdGNoQ29tcGxleFF1ZXJ5KHF1ZXJ5KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkua2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLm1hdGNoU2ltcGxlUXVlcnkoXG5cdFx0XHRcdHRoaXMuZmllbGRzW3F1ZXJ5LmtleV0sXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAoIWhhc1Byb3BlcnRpZXMocXVlcnkpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5TWF0Y2hlcjogVW5zdXBwb3J0ZWQgcXVlcnkhIFBhcnNlZD8nKTtcblx0fVxuXG5cdHByaXZhdGUgbWF0Y2hMaW5rZWRUb1F1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0aWYgKHF1ZXJ5LnJldmVyc2UpIHtcblx0XHRcdHJldHVybiBNQVlCRTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblx0XHRsZXQgbWF0Y2g7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRtYXRjaCA9IGZhbHNlO1xuXHRcdH0gZWxzZSBpZiAocXVlcnkubGlua2VkVG8gIT09IHBhcmVudC5pdGVtVHlwZSkge1xuXHRcdFx0bWF0Y2ggPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2ggPSB0aGlzLm1hdGNoU2ltcGxlUXVlcnkoXG5cdFx0XHRcdHBhcmVudC5pdGVtSWQsXG5cdFx0XHRcdHF1ZXJ5LnF1ZXJ5LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAobWF0Y2ggPT09IE1BWUJFKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICFtYXRjaCA6ICEhbWF0Y2g7XG5cdH1cblxuXHRwcml2YXRlIG1hdGNoQ29tcGxleFF1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0Y29uc3QgY29uZGl0aW9ucyA9IHF1ZXJ5LmNvbmRpdGlvbnM7XG5cblx0XHRsZXQgcmVzdWx0O1xuXHRcdGxldCB0ZXJtaW5hbDtcblxuXHRcdHN3aXRjaCAocXVlcnkub3BlcmF0b3IpIHtcblx0XHRcdGNhc2UgJ0FORCc6XG5cdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cdFx0XHRcdHRlcm1pbmFsID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnT1InOlxuXHRcdFx0XHRyZXN1bHQgPSBmYWxzZTtcblx0XHRcdFx0dGVybWluYWwgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcigncXVlcnlNYXRjaGVyOiBVbnN1cHBvcnRlZCBvcGVyYXRvcicpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gdGhpcy5tYXRjaFF1ZXJ5KGNvbmRpdGlvbik7XG5cblx0XHRcdGlmIChtYXRjaCA9PT0gdGVybWluYWwpIHtcblx0XHRcdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICF0ZXJtaW5hbCA6IHRlcm1pbmFsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWF0Y2ggPT09IE1BWUJFKSB7XG5cdFx0XHRcdHJlc3VsdCA9IE1BWUJFO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyZXN1bHQgPT09IE1BWUJFKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICFyZXN1bHQgOiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIG1hdGNoU2ltcGxlUXVlcnkgKFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHQpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0Y29uc3Qga2V5ID0gcXVlcnkua2V5O1xuXHRcdGxldCBxdWVyeVZhbHVlID0gcXVlcnkudmFsdWU7XG5cblx0XHRpZiAoIWhhc1Byb3BlcnRpZXMocXVlcnkpKSAvLyBDb3VsZCBiZSBsaW5rZWRUbyBhbiBlbXB0eSBvYmplY3Rcblx0XHR7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHQnUmVxdWlyZWQgZmllbGQnLFxuXHRcdFx0XHRrZXksXG5cdFx0XHRcdCdub3QgZm91bmQgZm9yJyxcblx0XHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybiBNQVlCRTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnlWYWx1ZSA9PT0gJ05PVycpIHtcblx0XHRcdHF1ZXJ5VmFsdWUgPSBtb21lbnQoKTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKHF1ZXJ5LmNvbXBhcmF0b3IpIHtcblx0XHRcdGNhc2UgJz0nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb21wYXJlVmFsdWVzKFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHF1ZXJ5VmFsdWUsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICchPSc6XG5cdFx0XHRcdHJldHVybiAhdGhpcy5jb21wYXJlVmFsdWVzKFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHF1ZXJ5VmFsdWUsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICc8Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlIDwgcXVlcnlWYWx1ZTtcblx0XHRcdGNhc2UgJzw9Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlIDw9IHF1ZXJ5VmFsdWU7XG5cdFx0XHRjYXNlICc+Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID4gcXVlcnlWYWx1ZTtcblx0XHRcdGNhc2UgJz49Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID49IHF1ZXJ5VmFsdWU7XG5cdFx0XHRjYXNlICdJTic6XG5cdFx0XHRcdC8vIE9ubHkgSU4gc3VwcG9ydHMgTk9ULCBhbGwgb3RoZXIgY29tcGFyYXRvcnMgYXJlIGZsaXBwZWQgaW4gdGhlIFF1ZXJ5UGFyc2VyXG5cdFx0XHRcdGNvbnN0IHJlcyA9IGluQXJyYXkoXG5cdFx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdFx0cXVlcnlWYWx1ZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRyZXR1cm4gcXVlcnkubm90ID8gIXJlcyA6IHJlcztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcigncXVlcnlNYXRjaGVyOiBVbnN1cHBvcnRlZCBjb21wYXJhdG9yOiAnICsgcXVlcnkuY29tcGFyYXRvciArICcgaW4gcXVlcnkgJyArIHF1ZXJ5KTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ09NUEFSQVRPUlMsIE9QRVJBVE9SUywgT1BFUkFUT1JTX1RZUEUsIFF1ZXJ5UGFyc2VyQmFzZSB9IGZyb20gJy4vUXVlcnlQYXJzZXJCYXNlJztcblxuZXhwb3J0IGVudW0gQ09OU1RBTlRTIHtcblx0T0JKID0gMCxcblx0U1RSID0gMSxcblx0U0VQID0gJzonXG59XG5cbmNvbnN0IFZBTElEX0NPTVBBUkFUT1JTID0gT2JqZWN0LmtleXMoQ09NUEFSQVRPUlMpXG5cdC5tYXAoXG5cdFx0a2V5ID0+IENPTVBBUkFUT1JTW2tleV0sXG5cdCk7XG5cbmV4cG9ydCB0eXBlIENPTVBBUkFUT1JTX1RZUEUgPSAnPScgfCAnIT0nIHwgJzwnIHwgJz4nIHwgJzw9JyB8ICc+PScgfCAnSU4nIHwgQ09NUEFSQVRPUlM7XG5cbmNvbnN0IE9QUE9TSVRFX0NPTVBBUkFUT1JfTUFQOiB7IFtrZXkgaW4gQ09NUEFSQVRPUlNdOiBDT01QQVJBVE9SUyB9ID0ge1xuXHRbQ09NUEFSQVRPUlMuRVFVQUxTXTogQ09NUEFSQVRPUlMuTk9UX0VRVUFMUyxcblx0W0NPTVBBUkFUT1JTLk5PVF9FUVVBTFNdOiBDT01QQVJBVE9SUy5FUVVBTFMsXG5cdFtDT01QQVJBVE9SUy5NT1JFX1RIQU5dOiBDT01QQVJBVE9SUy5MRVNTX09SX0VRVUFMX1RIQU4sXG5cdFtDT01QQVJBVE9SUy5MRVNTX1RIQU5dOiBDT01QQVJBVE9SUy5FUVVBTF9PUl9NT1JFX1RIQU4sXG5cdFtDT01QQVJBVE9SUy5MRVNTX09SX0VRVUFMX1RIQU5dOiBDT01QQVJBVE9SUy5NT1JFX1RIQU4sXG5cdFtDT01QQVJBVE9SUy5FUVVBTF9PUl9NT1JFX1RIQU5dOiBDT01QQVJBVE9SUy5MRVNTX1RIQU4sXG5cdC8vIEluIHVzZXMgJ25vdDogdHJ1ZScgaW5zdGVhZCBvZiByZXZlcnNpbmcgdGhlIHF1ZXJ5XG5cdFtDT01QQVJBVE9SUy5JTl06IENPTVBBUkFUT1JTLklOLFxufTtcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5UGFyc2VyXG5cdGV4dGVuZHMgUXVlcnlQYXJzZXJCYXNlPFtvYmplY3QsIHN0cmluZ10+IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdHByaXZhdGUgcGFyYW1ldGVyczogb2JqZWN0LFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdHF1ZXJ5LFxuXHRcdCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VFbXB0eVF1ZXJ5ICgpIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e30sXG5cdFx0XHQne30nLFxuXHRcdF0gYXMgW29iamVjdCwgc3RyaW5nXTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZVN1YlF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRzdWJRdWVyeTogb2JqZWN0LFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMucGFyc2Uoc3ViUXVlcnkpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHRxdWVyeTogcGFyc2VkUXVlcnlbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdG5vdCxcblx0XHRcdH0sXG5cdFx0XHQnWycgKyAnc3ViJyArIENPTlNUQU5UUy5TRVAgKyBrZXkgKyBDT05TVEFOVFMuU0VQICsgcGFyc2VkUXVlcnlbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTdWJGaWVsZFF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyA9ICcnLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSA9ICcnLFxuXHRcdGZpZWxkOiBzdHJpbmcgPSAnJyxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdGNvbnN0IHBhcnNlZFF1ZXJ5ID0gdGhpcy5wYXJzZShxdWVyeSk7XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRrZXksXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRmaWVsZCxcblx0XHRcdFx0cXVlcnk6IHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuXHRcdFx0J1snICsgJ3N1YkZpZWxkJyArIENPTlNUQU5UUy5TRVAgKyBrZXkgKyBDT05TVEFOVFMuU0VQICsgaXRlbVR5cGUgKyBDT05TVEFOVFMuU0VQICsgZmllbGQgKyBDT05TVEFOVFMuU0VQICsgcGFyc2VkUXVlcnlbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTZWFyY2hRdWVyeSAoXG5cdFx0dmFsdWU6IGFueSxcblx0XHRub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0dmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlKHZhbHVlKTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdHNlYXJjaDogdmFsdWVbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdG5vdCxcblx0XHRcdH0sXG5cdFx0XHQnWycgKyAnc2VhcmNoJyArIENPTlNUQU5UUy5TRVAgKyB2YWx1ZVtDT05TVEFOVFMuU1RSXSArIENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXScsXG5cdFx0XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUN1c3RvbVF1ZXJ5IChcblx0XHRjdXN0b206IHN0cmluZyxcblx0XHRwYXJhbWV0ZXJzOiBhbnksXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdGlmIChwYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjdXN0b20sXG5cdFx0XHRcdFx0bm90LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnWycgKyBjdXN0b20gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdFx0XTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJzZWRQYXJhbWV0ZXJzID0gdGhpcy5wYXJzZUN1c3RvbVBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRjdXN0b20sXG5cdFx0XHRcdHBhcmFtZXRlcnM6IHBhcnNlZFBhcmFtZXRlcnNbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdG5vdCxcblx0XHRcdH0sXG5cdFx0XHQnWycgKyBjdXN0b20gKyBDT05TVEFOVFMuU0VQICsgcGFyc2VkUGFyYW1ldGVyc1tDT05TVEFOVFMuU1RSXSArIENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXScsXG5cdFx0XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUN1c3RvbVBhcmFtZXRlcnMgKHBhcmFtZXRlcnM6IGFueSk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKVxuXHRcdFx0LnNvcnQoKTtcblxuXHRcdGNvbnN0IHF1ZXJ5OiBBcGlRdWVyeSA9IHt9IGFzIEFwaVF1ZXJ5O1xuXHRcdGxldCBzdHJpbmcgPSAnJztcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qga2V5ID0ga2V5c1tpXTtcblx0XHRcdGNvbnN0IHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZShwYXJhbWV0ZXJzW2tleV0pO1xuXG5cdFx0XHRxdWVyeVtrZXldID0gdmFsdWVbQ09OU1RBTlRTLk9CSl07XG5cblx0XHRcdGlmIChpID4gMCkge1xuXHRcdFx0XHRzdHJpbmcgKz0gQ09OU1RBTlRTLlNFUDtcblx0XHRcdH1cblxuXHRcdFx0c3RyaW5nICs9IHZhbHVlW0NPTlNUQU5UUy5TVFJdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbXG5cdFx0XHRxdWVyeSxcblx0XHRcdHN0cmluZyxcblx0XHRdO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU2ltcGxlUXVlcnkgKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0Y29tcGFyYXRvcj86IENPTVBBUkFUT1JTX1RZUEUsXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZSh2YWx1ZSk7XG5cblx0XHRpZiAoY29tcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb21wYXJhdG9yID0gQXJyYXkuaXNBcnJheSh2YWx1ZVtDT05TVEFOVFMuT0JKXSkgPyBDT01QQVJBVE9SUy5JTiA6IENPTVBBUkFUT1JTLkVRVUFMUztcblx0XHR9XG5cblx0XHRpZiAoVkFMSURfQ09NUEFSQVRPUlMuaW5kZXhPZihjb21wYXJhdG9yKSA9PT0gLTEpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21wYXJhdG9yICcke2NvbXBhcmF0b3J9JywgaXQgbWlnaHQgYmUgdGhhdCB0aGUgYmFja2VuZCBzdXBwb3J0cyBpdCBidXQgdGhlIGZyb250ZW5kIGRvZXNuJ3QgIWApO1xuXHRcdH1cblxuXHRcdGlmIChub3QpIHtcblx0XHRcdGNvbXBhcmF0b3IgPSBPUFBPU0lURV9DT01QQVJBVE9SX01BUFtjb21wYXJhdG9yXTtcblx0XHR9XG5cblx0XHQvLyBBbGwgb3RoZXIgY29tcGFyYXRvcnMgY2FuIGJlIGludmVydGVkXG5cdFx0Y29uc3QgaXNOb3RJbiA9IGNvbXBhcmF0b3IgPT09IENPTVBBUkFUT1JTLklOICYmIG5vdDtcblxuXHRcdGNvbnN0IHJlc3VsdDogW29iamVjdCwgc3RyaW5nXSA9IFtcblx0XHRcdHtcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdGNvbXBhcmF0b3IsXG5cdFx0XHRcdG5vdDogaXNOb3RJbixcblx0XHRcdH0sXG5cdFx0XHQnWycgKyBjb21wYXJhdG9yICsgQ09OU1RBTlRTLlNFUCArIGtleSArIENPTlNUQU5UUy5TRVAgKyB2YWx1ZVtDT05TVEFOVFMuU1RSXSArICddJyxcblx0XHRdO1xuXG5cdFx0aWYgKGlzTm90SW4pIHtcblx0XHRcdHJlc3VsdFsxXSA9IHJlc3VsdFsxXS5zbGljZShcblx0XHRcdFx0MCxcblx0XHRcdFx0LTEsXG5cdFx0XHQpO1xuXHRcdFx0cmVzdWx0WzFdICs9IENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXSc7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUxpbmtlZFRvUXVlcnkgKFxuXHRcdGxpbmtlZFRvOiBhbnksXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5ID0ge30gYXMgQXBpUXVlcnksXG5cdFx0cmV2ZXJzZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMucGFyc2UocXVlcnkpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0bGlua2VkVG86IGxpbmtlZFRvLFxuXHRcdFx0XHRxdWVyeTogcGFyc2VkUXVlcnlbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdHJldmVyc2U6IHJldmVyc2UsXG5cdFx0XHRcdG5vdDogbm90LFxuXHRcdFx0fSxcblx0XHRcdCdbJyArICdsaW5rZWRUbycgKyBDT05TVEFOVFMuU0VQICsgbGlua2VkVG8gKyBDT05TVEFOVFMuU0VQICsgcGFyc2VkUXVlcnlbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgcmV2ZXJzZSArIENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXScsXG5cdFx0XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUNvbXBsZXhRdWVyeSAoXG5cdFx0Y29uZGl0aW9uczogYW55W10sXG5cdFx0b3BlcmF0b3I6IE9QRVJBVE9SU19UWVBFID0gT1BFUkFUT1JTLkFORCxcblx0XHRub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0b3BlcmF0b3IgPSBvcGVyYXRvci50b1VwcGVyQ2FzZSgpIGFzIE9QRVJBVE9SUztcblxuXHRcdGNvbnN0IHBhcnNlZENvbmRpdGlvbnMgPSB0aGlzLnBhcnNlQ29uZGl0aW9ucyhjb25kaXRpb25zKTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGNvbmRpdGlvbnM6IHBhcnNlZENvbmRpdGlvbnNbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdG9wZXJhdG9yLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgb3BlcmF0b3IgKyBwYXJzZWRDb25kaXRpb25zW0NPTlNUQU5UUy5TVFJdICsgQ09OU1RBTlRTLlNFUCArIG5vdCArICddJyxcblx0XHRdO1xuXHR9XG5cblx0cHJpdmF0ZSBwYXJzZUNvbmRpdGlvbnMgKGNvbmRpdGlvbnM6IGFueVtdKTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0bGV0IHBhcnNlZENvbmRpdGlvbnM6IEFycmF5PFtvYmplY3QsIHN0cmluZ10+ID0gW107XG5cdFx0Y29uc3QgcXVlcnk6IG9iamVjdFtdID0gW107XG5cdFx0bGV0IHN0cmluZyA9ICcnO1xuXG5cdFx0Zm9yIChjb25zdCBjb25kaXRpb24gb2YgY29uZGl0aW9ucykge1xuXHRcdFx0cGFyc2VkQ29uZGl0aW9ucy5wdXNoKHRoaXMucGFyc2UoY29uZGl0aW9uKSk7XG5cdFx0fVxuXG5cdFx0cGFyc2VkQ29uZGl0aW9ucyA9IHBhcnNlZENvbmRpdGlvbnMuc29ydCgoXG5cdFx0XHRhLFxuXHRcdFx0Yixcblx0XHQpID0+IHRoaXMuY29tcGFyZVBhcnNlZFF1ZXJpZXMoXG5cdFx0XHRhLFxuXHRcdFx0Yixcblx0XHQpKTtcblxuXHRcdGZvciAoY29uc3QgcGFyc2VkQ29uZGl0aW9uIG9mIHBhcnNlZENvbmRpdGlvbnMpIHtcblx0XHRcdHF1ZXJ5LnB1c2gocGFyc2VkQ29uZGl0aW9uW0NPTlNUQU5UUy5PQkpdKTtcblx0XHRcdHN0cmluZyArPSBwYXJzZWRDb25kaXRpb25bQ09OU1RBTlRTLlNUUl07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHF1ZXJ5LFxuXHRcdFx0c3RyaW5nLFxuXHRcdF07XG5cdH1cblxuXHRwcml2YXRlIGZvcm1hdFZhbHVlPFQ+ICh2YWx1ZTogVCk6IFtULCBzdHJpbmddIHtcblx0XHRsZXQgcHJvY2Vzc2VkVmFsdWU7XG5cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5jaGFyQXQoMCkgPT09ICcmJykge1xuXHRcdFx0Y29uc3Qga2V5ID0gdmFsdWUuc3Vic3RyaW5nKDEpO1xuXG5cdFx0XHR2YWx1ZSA9IHRoaXMucGFyYW1ldGVyc1trZXldO1xuXG5cdFx0XHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5UGFyc2VyOiBVbmRlZmluZWQgdGVtcGxhdGUgcGFyYW1ldGVyIFxcJycgKyBrZXkgKyAnXFwnJyk7XG5cdFx0XHR9XG5cblx0XHRcdHByb2Nlc3NlZFZhbHVlID0gdGhpcy5wcm9jZXNzVmFsdWUodmFsdWUpO1xuXG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRwcm9jZXNzZWRWYWx1ZSxcblx0XHRcdFx0a2V5ICsgJz4nICsgdmFsdWUsXG5cdFx0XHRdO1xuXHRcdH1cblxuXHRcdHByb2Nlc3NlZFZhbHVlID0gdGhpcy5wcm9jZXNzVmFsdWUodmFsdWUpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHByb2Nlc3NlZFZhbHVlLFxuXHRcdFx0JycgKyBwcm9jZXNzZWRWYWx1ZSxcblx0XHRdO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzVmFsdWU8VD4gKHZhbHVlOiBUW10pOiBUW107XG5cdHByaXZhdGUgcHJvY2Vzc1ZhbHVlICh2YWx1ZTogbW9tZW50Lk1vbWVudCk6IG1vbWVudC5Nb21lbnQ7XG5cdHByaXZhdGUgcHJvY2Vzc1ZhbHVlICh2YWx1ZTogbW9tZW50LkR1cmF0aW9uKTogbW9tZW50LkR1cmF0aW9uO1xuXHRwcml2YXRlIHByb2Nlc3NWYWx1ZTxUPiAodmFsdWU6IFQpOiBUO1xuXHRwcml2YXRlIHByb2Nlc3NWYWx1ZTxUPiAodmFsdWU6IFQgfCBUW10gfCBtb21lbnQuTW9tZW50IHwgbW9tZW50LkR1cmF0aW9uKSB7XG5cdFx0Ly8gYWxnb3JpdGhtIGlzIG5vdCBpbXBvcnRhbnQsIGFzIGxvbmcgYXMgYWxsIGFycmF5cyBhcmUgc29ydGVkIHRoZSBzYW1lIHdheVxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIHZhbHVlXG5cdFx0XHRcdC5zbGljZSgpXG5cdFx0XHRcdC5zb3J0KCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1vbWVudC5pc01vbWVudCh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiBtb21lbnQodmFsdWUpO1xuXHRcdH1cblxuXHRcdGlmIChtb21lbnQuaXNEdXJhdGlvbih2YWx1ZSkpIHtcblx0XHRcdHJldHVybiBtb21lbnQuZHVyYXRpb24odmFsdWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXG5cdHByaXZhdGUgY29tcGFyZVBhcnNlZFF1ZXJpZXMgKFxuXHRcdGE6IFtvYmplY3QsIHN0cmluZ10sXG5cdFx0YjogW29iamVjdCwgc3RyaW5nXSxcblx0KSB7XG5cdFx0aWYgKGFbQ09OU1RBTlRTLlNUUl0gPT09IGJbQ09OU1RBTlRTLlNUUl0pIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHJldHVybiBhW0NPTlNUQU5UUy5TVFJdID4gYltDT05TVEFOVFMuU1RSXSA/IDEgOiAtMTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpUXVlcnksIEVudHJ5UGFyZW50TnVsbCwgSXRlbUlkIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ09NUEFSQVRPUlMsIE9QRVJBVE9SUyB9IGZyb20gJy4vUXVlcnlQYXJzZXJCYXNlJztcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5U2VydmljZSB7XG5cdGNvbnN0cnVjdG9yICgpIHtcblx0fVxuXG5cdGFkZEFuZENvbmRpdGlvbiAoXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGNvbmRpdGlvbjogQXBpUXVlcnksXG5cdCk6IEFwaVF1ZXJ5IHtcblx0XHRpZiAocXVlcnkuY29uZGl0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHF1ZXJ5Lm9wZXJhdG9yID09PSBPUEVSQVRPUlMuT1IpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGNvbmRpdGlvbnM6IFtcblx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0XHRjb25kaXRpb24sXG5cdFx0XHRcdF0sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgYW4gJ2FuZCcgY29uZGl0aW9uXG5cdFx0cmV0dXJuIHtjb25kaXRpb25zOiBxdWVyeS5jb25kaXRpb25zLmNvbmNhdChjb25kaXRpb24pfTtcblx0fVxuXG5cdGFkZE9yQ29uZGl0aW9uIChcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0Y29uZGl0aW9uOiBBcGlRdWVyeSxcblx0KTogQXBpUXVlcnkge1xuXHRcdGlmIChxdWVyeS5vcGVyYXRvciA9PT0gT1BFUkFUT1JTLk9SKSB7XG5cdFx0XHRyZXR1cm4ge2NvbmRpdGlvbnM6IHF1ZXJ5LmNvbmRpdGlvbnMuY29uY2F0KGNvbmRpdGlvbil9O1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgYW4gJ2FuZCcgY29uZGl0aW9uXG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbmRpdGlvbnM6IFtcblx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdGNvbmRpdGlvbixcblx0XHRcdF0sXG5cdFx0XHRvcGVyYXRvcjogT1BFUkFUT1JTLk9SLFxuXHRcdH07XG5cdH1cblxuXHRhZGRQYXJlbnRDb25kaXRpb24gKFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0KTogQXBpUXVlcnkge1xuXHRcdGxldCBsaW5rZWRUb1F1ZXJ5O1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHF1ZXJ5O1xuXHRcdH1cblxuXHRcdGxpbmtlZFRvUXVlcnkgPSB7XG5cdFx0XHRsaW5rZWRUbzogcGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0cXVlcnk6IHBhcmVudC5pdGVtSWQsXG5cdFx0fTtcblxuXHRcdHJldHVybiBxdWVyeSA9PT0gbnVsbCA/IGxpbmtlZFRvUXVlcnkgOiB0aGlzLmFkZEFuZENvbmRpdGlvbihcblx0XHRcdHF1ZXJ5LFxuXHRcdFx0bGlua2VkVG9RdWVyeSxcblx0XHQpO1xuXHR9XG5cblx0Y3JlYXRlTm90SW4gKGlkQXJyYXk6IEl0ZW1JZFtdKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbXBhcmF0b3I6IENPTVBBUkFUT1JTLklOLFxuXHRcdFx0a2V5OiAnaWQnLFxuXHRcdFx0dmFsdWU6IGlkQXJyYXksXG5cdFx0XHRub3Q6IHRydWVcblx0XHR9O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5TZXQsIENvbHVtblV0aWwgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxudHlwZSBSZXF1ZXN0Q29sdW1uTWFwID0ge1tpdGVtVHlwZTogc3RyaW5nXTogQXBpUmVxdWVzdENvbHVtbnN9O1xuXG5leHBvcnQgY2xhc3MgUmVxdWVzdENvbHVtbkV4cGFuc2lvbiB7XG5cdHByaXZhdGUgY29sdW1uczogUmVxdWVzdENvbHVtbk1hcCA9IHt9O1xuXHRwcml2YXRlIGNvbHVtblNldElkTWFwOiB7W2NvbHVtblNldElkOiBudW1iZXJdOiBib29sZWFufSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucztcblxuXHRcdGlmIChjb2x1bW5zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb2x1bW5zW2l0ZW1UeXBlXSA9IFtdO1xuXHRcdH1cblxuXHRcdGNvbHVtbnNbaXRlbVR5cGVdID0gdGhpcy5jb2x1bW5VdGlsXG5cdFx0XHQubWVyZ2VSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdFx0Y29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0Lm1lcmdlZDtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmQ8VCBleHRlbmRzIENvbHVtblNldDxJdGVtVHlwZT4+IChjb2x1bW5TZXQ6IFQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5jb2x1bW5TZXRJZE1hcFtjb2x1bW5TZXQuaWRdKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucztcblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbHVtblNldC5pdGVtVHlwZTtcblxuXHRcdGlmIChjb2x1bW5zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb2x1bW5zW2l0ZW1UeXBlXSA9IFtdO1xuXHRcdH1cblxuXHRcdGNvbHVtbnNbaXRlbVR5cGVdID0gdGhpcy5jb2x1bW5VdGlsXG5cdFx0XHQubWVyZ2VSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdFx0Y29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdGNvbHVtblNldC5yZXF1ZXN0LFxuXHRcdFx0KVxuXHRcdFx0Lm1lcmdlZDtcblxuXHRcdHRoaXMuY29sdW1uU2V0SWRNYXBbY29sdW1uU2V0LmlkXSA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgZ2V0ICgpOiBSZXF1ZXN0Q29sdW1uTWFwIHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5zO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSwgVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcy9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uTWF0Y2hSZXN1bHQsXG5cdEZpZWxkTWFwLFxuXHRGdW5jdGlvbkNoYW5nZXNSZXNvbHZlU29ja2V0TWVzc2FnZSxcblx0SXRlbUlkLFxuXHRJdGVtVHlwZSxcblx0UHJvbWlzZUludGVyZmFjZSxcblx0UmVzcG9uc2VDb2x1bW4sXG5cdFNvY2tldE1lc3NhZ2UsXG5cdFNvY2tldE1lc3NhZ2VDcmVhdGUsXG5cdFNvY2tldE1lc3NhZ2VEZWxldGUsXG5cdFNvY2tldE1lc3NhZ2VMaW5rVG8sXG5cdFNvY2tldE1lc3NhZ2VVcGRhdGUsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YVJlc3VsdCB9IGZyb20gJy4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4vUmVxdWVzdEJ1ZmZlck1hbmFnZXInO1xuXG5leHBvcnQgdHlwZSBTb2NrZXRDb2xsZWN0aW9uTWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IHtbaXRlbUlkOiBudW1iZXJdOiBDb2xsZWN0aW9uTWF0Y2hSZXN1bHQ8SXRlbVR5cGVUeXBlPn07XG5cbmV4cG9ydCBjbGFzcyBTb2NrZXRNZXNzYWdlSGFuZGxlciB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcmVxdWVzdEJ1ZmZlck1hbmFnZXI6IFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdHByaXZhdGUgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRwcml2YXRlIGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSB0cmFuc2FjdGlvbkNhY2hlRmFjdG9yeTogVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIG9uTWVzc2FnZVJlY2VpdmVkIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlKTogYW55IHtcblx0XHRzd2l0Y2ggKG1lc3NhZ2UuYm9keS5ldmVudFR5cGUpIHtcblx0XHRcdGNhc2UgJ3VwZGF0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZVVwZGF0ZShtZXNzYWdlKTtcblx0XHRcdGNhc2UgJ2NyZWF0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZUNyZWF0ZShtZXNzYWdlKTtcblx0XHRcdGNhc2UgJ2RlbGV0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZURlbGV0ZShtZXNzYWdlKTtcblx0XHRcdGNhc2UgJ2xpbmtUbyc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZUxpbmtNb3ZlKG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZm9ybWF0TWVzc2FnZVZhbHVlcyAoXG5cdFx0dmFsdWVzOiBhbnksXG5cdFx0Y29sdW1uczogUmVzcG9uc2VDb2x1bW5bXSxcblx0KTogRmllbGRNYXAge1xuXHRcdGNvbnN0IHJlc3VsdDogRmllbGRNYXAgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gY29sdW1ucykge1xuXHRcdFx0cmVzdWx0W2NvbHVtbklkXSA9IHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlc3BvbnNlVmFsdWUoXG5cdFx0XHRcdGNvbHVtbnNbY29sdW1uSWRdLnR5cGUsXG5cdFx0XHRcdHZhbHVlc1tjb2x1bW5JZF0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxlY3Rpb25NYXA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1zOiB7W2l0ZW1JZDogbnVtYmVyXTogYW55fSxcblx0XHRjb2x1bW5zOiBSZXNwb25zZUNvbHVtbltdLFxuXHQpOiBTb2NrZXRDb2xsZWN0aW9uTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IHNlcnZlckNhY2hlID0gdGhpcy50cmFuc2FjdGlvbkNhY2hlRmFjdG9yeS5nZXRTZXJ2ZXJDYWNoZSgpO1xuXHRcdGNvbnN0IHJlc3VsdDogU29ja2V0Q29sbGVjdGlvbk1hcDxJdGVtVHlwZVR5cGU+ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBpdGVtcykge1xuXHRcdFx0Y29uc3QgaXRlbSA9IGl0ZW1zW2l0ZW1JZF07XG5cdFx0XHRjb25zdCBwYXJlbnQgPSBpdGVtLnBhcmVudCAhPT0gbnVsbCA/IGl0ZW0ucGFyZW50IDoge307XG5cdFx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLmZvcm1hdE1lc3NhZ2VWYWx1ZXMoXG5cdFx0XHRcdGl0ZW0udmFsdWVzLFxuXHRcdFx0XHRjb2x1bW5zLFxuXHRcdFx0KTtcblxuXHRcdFx0cmVzdWx0W2l0ZW1JZF0gPSBzZXJ2ZXJDYWNoZS5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLmdldEJ5Rml0dGluZ0l0ZW0oXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHR2YWx1ZXMsXG5cdFx0XHRcdHBhcmVudCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0UmVxdWVzdENvbHVtbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGNvbGxlY3Rpb25NYXA6IFNvY2tldENvbGxlY3Rpb25NYXA8SXRlbVR5cGVUeXBlPixcblx0KSB7XG5cdFx0Y29uc3Qgc2VydmVyQ2FjaGUgPSB0aGlzLnRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LmdldFNlcnZlckNhY2hlKCk7XG5cdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGNvbGxlY3Rpb25NYXApIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25zID0gY29sbGVjdGlvbk1hcFtpdGVtSWRdO1xuXHRcdFx0Y29uc3QgZml0dGluZ0NvbGxlY3Rpb25zID0gY29sbGVjdGlvbnMuZml0dGluZztcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0KTtcblxuXHRcdFx0Zm9yIChjb25zdCBmaXR0aW5nQ29sbGVjdGlvbiBvZiBmaXR0aW5nQ29sbGVjdGlvbnMpIHtcblx0XHRcdFx0Y29sdW1uRXhwYW5zaW9uLmV4cGFuZChmaXR0aW5nQ29sbGVjdGlvbi5jb2x1bW5zKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbHVtbkV4cGFuc2lvbi5leHBhbmQoaXRlbUVudHJ5LmNvbHVtbnMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjb2x1bW5FeHBhbnNpb24uZ2V0KCk7XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NNZXNzYWdlPFQgZXh0ZW5kcyBTb2NrZXRNZXNzYWdlWydib2R5J10+IChcblx0XHRib2R5OiBULFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRjb25zdCBzZXJ2ZXJDYWNoZSA9IHRoaXMudHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkuZ2V0U2VydmVyQ2FjaGUoKTtcblx0XHRjb25zdCBpdGVtVHlwZSA9IGJvZHkuaXRlbVR5cGU7XG5cdFx0Y29uc3QgcmVxdWVzdElkczogSXRlbUlkW10gPSBbXTtcblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25NYXAgPSB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25NYXAoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGJvZHkuaXRlbXNbaXRlbVR5cGVdLFxuXHRcdFx0Ym9keS5jb2x1bW5zW2l0ZW1UeXBlXSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbnMgPSB0aGlzLmdldFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRjb2xsZWN0aW9uTWFwLFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZFN0cmluZyBpbiBjb2xsZWN0aW9uTWFwKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZFN0cmluZyxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IGl0ZW1JZCA9ICtpdGVtSWRTdHJpbmc7XG5cblx0XHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXF1ZXN0SWRzLnB1c2goaXRlbUlkKTtcblxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25NYXBbaXRlbUlkXS5maXR0aW5nLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0cmVxdWVzdElkcy5wdXNoKGl0ZW1JZCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlcXVlc3RJZHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdC5xdWVyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6ICdpZCcsXG5cdFx0XHRcdFx0Y29tcGFyYXRvcjogJ0lOJyxcblx0XHRcdFx0XHR2YWx1ZTogcmVxdWVzdElkcyxcblx0XHRcdFx0fSxcblx0XHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBzZXJ2ZXJDYWNoZS5wcm9jZXNzUmVzcG9uc2UoXG5cdFx0XHRcdFx0XHRyZXNwb25zZSxcblx0XHRcdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NGdW5jdGlvbkNoYW5nZXNSZXNvbHZlPFQgZXh0ZW5kcyBTb2NrZXRNZXNzYWdlWydib2R5J10+IChcblx0XHRib2R5OiBULFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENoYW5nZXNEZWx0YVJlc3VsdD4ge1xuXHRcdGNvbnN0IHNlcnZlckNhY2hlID0gdGhpcy50cmFuc2FjdGlvbkNhY2hlRmFjdG9yeS5nZXRTZXJ2ZXJDYWNoZSgpO1xuXHRcdGNvbnN0IGl0ZW1zID0gYm9keS5pdGVtcy5GdW5jdGlvbkNoYW5nZXNSZXNvbHZlO1xuXHRcdGNvbnN0IHJlcXVlc3RJZHM6IEl0ZW1JZFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBpdGVtcykge1xuXHRcdFx0Y29uc3QgZnVuY3Rpb25JZCA9IGl0ZW1zW2l0ZW1JZF0ucGFyZW50Lml0ZW1JZDtcblx0XHRcdGNvbnN0IGZ1bmN0aW9uRW50cnkgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0J0Z1bmN0aWUnLFxuXHRcdFx0XHRmdW5jdGlvbklkLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRmdW5jdGlvbkVudHJ5ID09PSB1bmRlZmluZWRcblx0XHRcdFx0fHwgZnVuY3Rpb25FbnRyeS5jb2x1bW5zLnJlc3BvbnNlLkZ1bmN0aWUubmV3Y2hhbmdlcyA9PT0gdW5kZWZpbmVkXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHJlcXVlc3RJZHMucHVzaChmdW5jdGlvbklkKTtcblx0XHR9XG5cblx0XHRpZiAocmVxdWVzdElkcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlclxuXHRcdFx0LmZldGNoQnlJZHMoXG5cdFx0XHRcdCdGdW5jdGllJyxcblx0XHRcdFx0cmVxdWVzdElkcyxcblx0XHRcdFx0WyduZXdjaGFuZ2VzJ10sXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0YnVmZmVyUmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdC8vIHRvZG9bY2FjaGVdIGlzbid0IHRoaXMgYWxyZWFkeSBoYW5kbGVkIGluIHRoZSBSZXF1ZXN0QnVmZmVyID9cblx0XHRcdFx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2VJZHMgPSBidWZmZXJSZXNwb25zZS5yZXNwb25zZS5saW5rcy5GdW5jdGllO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgcmVzcG9uc2VJZHMpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRcdFx0XHQnRnVuY3RpZScsXG5cdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdCkhO1xuXG5cdFx0XHRcdFx0XHRjb25zdCBwcmV2aW91cyA9IHNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRcdFx0XHRcdGNvbnN0IHJlc3BvbnNlVmFsdWVzID0gYnVmZmVyUmVzcG9uc2UucmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdFx0XHRcdCdGdW5jdGllJyxcblx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VWYWx1ZXMgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZVZhbHVlcy5uZXdjaGFuZ2VzID09PSBwcmV2aW91cy5uZXdjaGFuZ2VzXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtVXBkYXRlZChcblx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHR7bmV3Y2hhbmdlczogcmVzcG9uc2VWYWx1ZXMubmV3Y2hhbmdlc30sXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBzZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNEZWx0YShcblx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQuY2F0Y2goXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLm5vdGlmeUVycm9yLFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgaXNGdW5jdGlvbkNoYW5nZXNSZXNvbHZlTWVzc2FnZSAobWVzc2FnZTogU29ja2V0TWVzc2FnZSk6IG1lc3NhZ2UgaXMgRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZVNvY2tldE1lc3NhZ2Uge1xuXHRcdHJldHVybiBtZXNzYWdlLmJvZHkuaXRlbVR5cGUgPT09ICdGdW5jdGlvbkNoYW5nZXNSZXNvbHZlJztcblx0fVxuXG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlIChtZXNzYWdlOiBGdW5jdGlvbkNoYW5nZXNSZXNvbHZlU29ja2V0TWVzc2FnZSk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD47XG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlQ3JlYXRlKTogUHJvbWlzZUludGVyZmFjZTxudWxsPjtcblx0cHJpdmF0ZSBoYW5kbGVDcmVhdGUgKG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2UpOiBhbnkge1xuXHRcdGNvbnN0IGJvZHkgPSBtZXNzYWdlLmJvZHk7XG5cblx0XHRpZiAodGhpcy5pc0Z1bmN0aW9uQ2hhbmdlc1Jlc29sdmVNZXNzYWdlKG1lc3NhZ2UpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZShib2R5KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LnByb2Nlc3NNZXNzYWdlKGJvZHkpXG5cdFx0XHQuY2F0Y2godGhpcy5lcnJvckhhbmRsZXIubm90aWZ5RXJyb3IpO1xuXHR9XG5cblx0cHJpdmF0ZSBoYW5kbGVVcGRhdGUgKG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2VVcGRhdGUpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LnByb2Nlc3NNZXNzYWdlKG1lc3NhZ2UuYm9keSlcblx0XHRcdC5jYXRjaCh0aGlzLmVycm9ySGFuZGxlci5ub3RpZnlFcnJvcik7XG5cdH1cblxuXHRwcml2YXRlIGhhbmRsZURlbGV0ZSAobWVzc2FnZTogU29ja2V0TWVzc2FnZURlbGV0ZSk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3RJbnRlcm5hbERlbHRhKCk7XG5cdFx0Y29uc3Qgc2VydmVyQ2FjaGUgPSB0aGlzLnRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LmdldFNlcnZlckNhY2hlKCk7XG5cdFx0Y29uc3QgYm9keSA9IG1lc3NhZ2UuYm9keTtcblx0XHRjb25zdCBlbnRyaWVzVG9CZURlbGV0ZWQ6IEl0ZW1FbnRyeVtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiBib2R5Lml0ZW1zKSB7XG5cdFx0XHRjb25zdCBjYWNoZWRFbnRyeSA9IHNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRib2R5Lml0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoY2FjaGVkRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0ZW50cmllc1RvQmVEZWxldGVkLnB1c2goY2FjaGVkRW50cnkpO1xuXHRcdH1cblxuXHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtc0RlbGV0ZWQoZW50cmllc1RvQmVEZWxldGVkKTtcblxuXHRcdHNlcnZlckNhY2hlLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQoXG5cdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRmYWxzZSxcblx0XHRcdHRydWUsXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0fVxuXG5cdHByaXZhdGUgaGFuZGxlTGlua01vdmUgKG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2VMaW5rVG8pOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzTWVzc2FnZShtZXNzYWdlLmJvZHkpXG5cdFx0XHQuY2F0Y2godGhpcy5lcnJvckhhbmRsZXIubm90aWZ5RXJyb3IpO1xuXHR9XG5cblx0LypcdGhhbmRsZUxpbmtNb3ZlIChtZXNzYWdlKSB7XG5cdCBwcm9jZXNzTWVzc2FnZShcblx0IG1lc3NhZ2UsXG5cdCBmdW5jdGlvbiAoY29sbGVjdGlvbiwgaXRlbUVudHJpZXMpIHtcblx0IC8vIGZpdHMgaW4gdGhpcyBjb2xsZWN0aW9uLCB0b2RvOiBnZXQgdGhlIG9sZCBjb2xsZWN0aW9uIGl0IGJlbG9uZ2VkIHRvXG5cdCBjb2xsZWN0aW9uLm1vdmVJdGVtcyhpdGVtRW50cmllcywgbnVsbCwgdHJ1ZSk7XG5cdCB9LFxuXHQgZnVuY3Rpb24gKGNvbGxlY3Rpb24sIGl0ZW1FbnRyaWVzKSB7XG5cdCAvLyBtYXliZSBmaXRzXG5cdCAvLyB0b2RvOiBhbHNvIHJlbW92ZSB0aGVtIGZyb20gdGhlIG9sZCBjb2xsZWN0aW9uXG5cdCBjb2xsZWN0aW9uLmV4dGVuZChhbmd1bGFyLmlkZW50aXR5LCBmYWxzZSwgZmFsc2UpO1xuXHQgfSxcblx0IGZ1bmN0aW9uIChjb2xsZWN0aW9uLCBpZHMpIHtcblx0IC8vIG5vdCBmaXR0aW5nIGluIHRoaXMgY29sbGVjdGlvbiwgcmVtb3ZlIGl0ID9cblx0IGNvbGxlY3Rpb24ucmVtb3ZlSXRlbXMoaWRzLCBudWxsLCBtZXNzYWdlKTtcblx0IH1cblx0ICk7XG5cdCB9XG5cdCAqL1xufVxuIiwiaW1wb3J0IHtcblx0Q29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0Q29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxufSBmcm9tICcuLi8uLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcy9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRDaGFuZ2VzRGVsdGEsXG5cdENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdENvbGxlY3Rpb25RdWVyeSxcblx0Q29sbGVjdGlvblJlc291cmNlLFxuXHRDb2x1bW5TdWJzZXRDYWNoZSxcblx0Q29sdW1uVXRpbCxcblx0Q29udmVyc2lvbk1hcCxcblx0RW50cnlQYXJlbnQsXG5cdEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdGlzRnVuY3Rpb24sXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdFByb21pc2VJbnRlcmZhY2UsXG59IGZyb20gJy4uLy4uLy4uL2luZGV4JztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgSXRlbUVudHJ5IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW4sXG5cdENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcCxcblx0SXRlbUlkLFxuXHRJdGVtVHlwZSxcblx0UXVlcnlDYWxsYmFjayxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0Q29sbGVjdGlvbk1hdGNoZXIsXG5cdENvbHVtbkhhbmRsZXIsXG5cdEtleVNlcnZpY2UsXG5cdFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIsXG59IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IENvbGxlY3Rpb25IYW5kbGVyQmFzZSB9IGZyb20gJy4uL0NvbGxlY3Rpb25IYW5kbGVyQmFzZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXJcblx0ZXh0ZW5kcyBDb2xsZWN0aW9uSGFuZGxlckJhc2Uge1xuXG5cdHB1YmxpYyBjb2xsZWN0aW9uUmVzb3VyY2VzOiB7XG5cdFx0W2NvbGxlY3Rpb25FbnRyeUlkOiBudW1iZXJdOiBDb2xsZWN0aW9uUmVzb3VyY2VbXVxuXHR9ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByaXZhdGUgY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5OiBDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIGl0ZW1IYW5kbGVyOiBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcml2YXRlIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwcml2YXRlIGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblxuXHR9XG5cblx0cHVibGljIGdldEFsbENvbGxlY3Rpb25zQnlJdGVtVHlwZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdCk6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJpZXM6IENvbGxlY3Rpb25FbnRyeVtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25FbnRyeUlkIGluIHRoaXMuY29sbGVjdGlvbkNoYW5nZXMpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0TG9jYWxDb2xsZWN0aW9uRW50cnkoTnVtYmVyKGNvbGxlY3Rpb25FbnRyeUlkKSk7XG5cblx0XHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IHVuZGVmaW5lZCAmJiBjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUgPT09IGl0ZW1UeXBlKSB7XG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyaWVzLnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJpZXM7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPiB7XG5cdFx0aWYgKCF0aGlzLmlzTG9jYWwob3B0aW9ucykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0XHQuY3JlYXRlQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN1cGVyLmNyZWF0ZUNvbGxlY3Rpb25FbnRyeShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDYWxscyB0aGUge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMub25JdGVtc0NyZWF0ZWQgb25JdGVtc0NyZWF0ZWR9IGNhbGxiYWNrIHdoZW5ldmVyIGEgY3JlYXRlIHJlcXVlc3QgaXMgZG9uZSBvbiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSB0aGF0IGZpdCBpbiB0aGUgY29sbGVjdGlvblxuXHQgKiBDYW4gYmUgdXNlZCB0byB1cGRhdGUgbWFwcyB0aGF0IHVzZSB7QGxpbmsgSXRlbUVudHJ5Lml0ZW1JZCBJdGVtRW50cnkuaXRlbUlkfVxuXHQgKlxuXHQgKiBAZGVwcmVjYXRlZFxuXHQgKiBZb3Ugc2hvdWxkIHVzZSBpdGVtUmVzb3VyY2Uub25DaGFuZ2UgYW5kIGNvbXBhcmUgcHJldmlvdXMuaWQgd2l0aCBmaWVsZHMuaWRcblx0ICovXG5cdHB1YmxpYyBvbkl0ZW1FbnRyaWVzQ3JlYXRlZCAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnksXG5cdFx0Y29udmVyc2lvbk1hcDogQ29udmVyc2lvbk1hcCxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VzID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cblx0XHRpZiAocmVzb3VyY2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmVzb3VyY2Uub3B0aW9ucy5vbkl0ZW1zQ3JlYXRlZChjb252ZXJzaW9uTWFwKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHRoaXMuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNsZWFyRW50cnkgKGVudHJ5OiBDb2xsZWN0aW9uRW50cnkpOiB2b2lkIHtcblx0XHR0aGlzLmVudHJpZXMuY2xlYXIoZW50cnkpO1xuXG5cdFx0ZGVsZXRlIHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tlbnRyeS5pZF07XG5cdFx0ZGVsZXRlIHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbZW50cnkuaWRdO1xuXHR9XG5cblx0cHVibGljIGFkZFJlc291cmNlIChyZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlKTogdm9pZCB7XG5cdFx0bGV0IHJlc291cmNlQXJyYXkgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdO1xuXG5cdFx0aWYgKHJlc291cmNlQXJyYXkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVzb3VyY2VBcnJheSA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tyZXNvdXJjZS5lbnRyeS5pZF0gPSBbXTtcblx0XHR9XG5cblx0XHRyZXNvdXJjZUFycmF5LnB1c2gocmVzb3VyY2UpO1xuXHR9XG5cblx0cHVibGljIGNsZWFyUmVzb3VyY2UgKHJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2UpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZXMgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdO1xuXHRcdGNvbnN0IGluZGV4ID0gcmVzb3VyY2VzLmluZGV4T2YocmVzb3VyY2UpO1xuXG5cdFx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdFx0cmVzb3VyY2VzLnNwbGljZShcblx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdDEsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChyZXNvdXJjZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRkZWxldGUgdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW3Jlc291cmNlLmVudHJ5LmlkXTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFVwZGF0ZXMgdGhlIHBhcmVudHMgb2YgdGhlIHBhc3NlZCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSwgcmV0dXJucyBgdm9pZGAgYmVjYXVzZSB5b3Ugc2hvdWxkIHVzZSB0aGUge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMub25BZGQgb25BZGR9IGFuZCB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucy5vblJlbW92ZSBvblJlbW92ZX0gY2FsbGJhY2tzXG5cdCAqL1xuXHRwdWJsaWMgbW92ZUl0ZW1zPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRzb3VyY2VDb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0ZGVzdGluYXRpb25Db2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IHZvaWQge1xuXHRcdGlmIChzb3VyY2VDb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUgIT09IGRlc3RpbmF0aW9uQ29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2NvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2U6IENhbm5vdCBtb3ZlIGl0ZW1zOiBpdGVtVHlwZSBtaXNtYXRjaCcpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdC8vIHRvZG9bY2FjaGVdIHBhcmVudCBudWxsID9cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1Nb3ZlZChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRkZXN0aW5hdGlvbkNvbGxlY3Rpb25FbnRyeS5wYXJlbnQhLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHR0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdH1cblxuXHRwdWJsaWMgZXh0ZW5kQ29sbGVjdGlvbkVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0cXVlcnlDYWxsYmFjazogUXVlcnlDYWxsYmFjayxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnlUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC50cmFuc2FjdGlvblxuXHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmV4dGVuZENvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0XHRxdWVyeUNhbGxiYWNrLFxuXHRcdFx0KTtcblx0fVxuXG5cdC8vIHRvZG9bY2FjaGVdIFdoYXQgaXMgY2xvbmluZyBhIGNvbGxlY3Rpb24gc3VwcG9zZWQgdG8gZG8gP1xuXHRwdWJsaWMgY2xvbmVDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdHNvdXJjZUVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnQsXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9LFxuXHQpOiBDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4ge1xuXHRcdGNvbnN0IHNvdXJjZUl0ZW1FbnRyaWVzID0gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlc1tzb3VyY2VFbnRyeS5pZF07XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25FbnRyeShcblx0XHRcdHNvdXJjZUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNsb25lT3B0aW9ucyhcblx0XHRcdFx0c291cmNlRW50cnkub3B0aW9ucyxcblx0XHRcdFx0cGFyZW50LFxuXHRcdFx0KSxcblx0XHQpO1xuXG5cdFx0aWYgKHNvdXJjZUVudHJ5LnBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3Qgc291cmNlUGFyZW50ID0gc291cmNlRW50cnkucGFyZW50O1xuXG5cdFx0XHRpZiAoY29udmVyc2lvbk1hcFtzb3VyY2VQYXJlbnQuaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udmVyc2lvbk1hcFtzb3VyY2VQYXJlbnQuaXRlbVR5cGVdID0ge307XG5cdFx0XHR9XG5cblx0XHRcdGNvbnZlcnNpb25NYXBbc291cmNlUGFyZW50Lml0ZW1UeXBlXVtzb3VyY2VQYXJlbnQuaXRlbUlkXSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0fVxuXG5cdFx0dGhpcy5pdGVtSGFuZGxlci5jbG9uZUl0ZW1FbnRyaWVzKFxuXHRcdFx0c291cmNlSXRlbUVudHJpZXMsXG5cdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHR9XG5cblx0cHVibGljIGdldENvbGxlY3Rpb25NYXRjaGVyICgpOiBDb2xsZWN0aW9uTWF0Y2hlciB7XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24sXG5cdFx0XHRpdGVtVHlwZSA9PiB0aGlzLmdldEFsbENvbGxlY3Rpb25zQnlJdGVtVHlwZShpdGVtVHlwZSksXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGlmICghdGhpcy5pc0xvY2FsKG9wdGlvbnMpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdFx0LmZldGNoQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG9wdGlvbnMuY29sdW1ucyk7XG5cdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkob3B0aW9ucyk7XG5cblx0XHR0aGlzLmV4cGFuZENvbHVtbnNXaXRoUXVlcnlDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0cGFyc2VkUXVlcnkub2JqZWN0LFxuXHRcdCk7XG5cblx0XHRsZXQgY29sbGVjdGlvbkVudHJ5O1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaENvbGxlY3Rpb25EYXRhKFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZSxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0cGFyc2VkUXVlcnksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0X2NvbGxlY3Rpb25FbnRyeSA9PiB7XG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0gX2NvbGxlY3Rpb25FbnRyeTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiBjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hMaW5rZWRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkQXJyYXk6IEl0ZW1JZFtdIHwgKCgpID0+IEl0ZW1JZFtdKSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGlmIChpc0Z1bmN0aW9uPCgpID0+IEl0ZW1JZFtdPihwYXJlbnRJZEFycmF5KSkge1xuXHRcdFx0cGFyZW50SWRBcnJheSA9IHBhcmVudElkQXJyYXkoKTtcblx0XHR9XG5cblx0XHRjb25zdCByZW1vdGVQYXJlbnRJZHM6IEl0ZW1JZFtdID0gW107XG5cdFx0Y29uc3QgbG9jYWxQYXJlbnRJZHM6IEl0ZW1JZFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiBwYXJlbnRJZEFycmF5KSB7XG5cdFx0XHRpZiAodGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChpdGVtSWQpKSB7XG5cdFx0XHRcdGxvY2FsUGFyZW50SWRzLnB1c2goaXRlbUlkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW90ZVBhcmVudElkcy5wdXNoKGl0ZW1JZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Vcblx0XHRcdC5hbGwoe1xuXHRcdFx0XHRyZW1vdGU6IHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0XHRcdC5mZXRjaExpbmtlZENvbGxlY3Rpb25FbnRyaWVzKFxuXHRcdFx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0XHRcdHJlbW90ZVBhcmVudElkcyxcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRsb2NhbDogdGhpcy5mZXRjaExpbmtlZExvY2FsQ29sbGVjdGlvbkVudHJpZXMoXG5cdFx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0XHRsb2NhbFBhcmVudElkcyxcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHQpLFxuXHRcdFx0fSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXN1bHQgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHQuLi5yZXN1bHQucmVtb3RlLFxuXHRcdFx0XHRcdFx0Li4ucmVzdWx0LmxvY2FsLFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGV4cGFuZENvbGxlY3Rpb25FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRjb2xsZWN0aW9uczogQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXAsXG5cdFx0bmV3Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPiB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5leHBhbmRDb2xsZWN0aW9uRW50cmllcyhcblx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGNvbGxlY3Rpb25zLFxuXHRcdFx0XHRuZXdDb2x1bW5zLFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBleHRlbmRDb2xsZWN0aW9uRW50cmllczxUIGV4dGVuZHMgQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0XHRxdWVyeUNhbGxiYWNrOiBRdWVyeUNhbGxiYWNrLFxuXHRcdGNvbGxlY3Rpb25zOiBULFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmV4dGVuZENvbGxlY3Rpb25FbnRyaWVzKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0cXVlcnlDYWxsYmFjayxcblx0XHRcdFx0Y29sbGVjdGlvbnMsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGFkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlczxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogdm9pZCB7XG5cdFx0c3VwZXIuX2FkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0KCkgPT4gZmFsc2UsXG5cdFx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgaXNMb2NhbCAob3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHBhcmVudCA9IG9wdGlvbnMucGFyZW50O1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKHBhcmVudC5pdGVtSWQpO1xuXHR9XG5cblx0cHVibGljIGV4cGFuZENvbGxlY3Rpb25FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdG5ld0NvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVR5cGU+IHtcblx0XHRjb25zdCB7ZGlmZmVyZW5jZX0gPSBjb2xsZWN0aW9uRW50cnkuY29sdW1ucy5tZXJnZVJlcXVlc3RDb2x1bW5zKG5ld0NvbHVtbnMpO1xuXG5cdFx0aWYgKGRpZmZlcmVuY2UgIT09IHRydWUgJiYgZGlmZmVyZW5jZS5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oY29sbGVjdGlvbkVudHJ5KTtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZTtcblxuXHRcdHJldHVybiB0aGlzLmNvbHVtbkhhbmRsZXJcblx0XHRcdC5mZXRjaChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGRpZmZlcmVuY2UsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlclxuXHRcdFx0XHRcdFx0LmV4cGFuZExvY2FsSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5LmlkXSxcblx0XHRcdFx0XHRcdFx0ZGlmZmVyZW5jZSxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSB0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRkaWZmZXJlbmNlLFxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LmV4cGFuZENvbHVtbnMoY29sdW1uRXhwYW5zaW9uKTtcblxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFdoZW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gYXJlIGFkZGVkIHRvIHRoZSBjaGFuZ2VzIG9mIGEge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9IGFsbCB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlIENvbGxlY3Rpb25SZXNvdXJjZXN9XG5cdCAqIHNob3VsZCBnZXQgbmV3IHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30gZm9yIHRoZSBuZXdseSBhZGRlZCBlbnRyaWVzXG5cdCAqL1xuXHRwcm90ZWN0ZWQgaGFuZGxlQWRkZWRJdGVtRW50cmllc0NhbGxiYWNrPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0YWRkZWRFbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2VzID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cblx0XHQvLyBXaGVuIHRoZXJlIGFyZSBubyBDb2xsZWN0aW9uUmVzb3VyY2VzIHdlIGRvbid0IGhhdmUgdG8gbWFrZSBJdGVtUmVzb3VyY2VzXG5cdFx0aWYgKFxuXHRcdFx0YWRkZWRFbnRyaWVzLmxlbmd0aCA9PT0gMFxuXHRcdFx0fHwgY29sbGVjdGlvblJlc291cmNlcyA9PT0gdW5kZWZpbmVkXG5cdFx0XHR8fCBjb2xsZWN0aW9uUmVzb3VyY2VzLmxlbmd0aCA9PT0gMFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvblJlc291cmNlIG9mIGNvbGxlY3Rpb25SZXNvdXJjZXMpIHtcblx0XHRcdGNvbGxlY3Rpb25SZXNvdXJjZS5hZGRJdGVtUmVzb3VyY2VzKGFkZGVkRW50cmllcyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBXaGVuIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IGFyZSByZW1vdmVkIGZyb20gdGhlIGNoYW5nZXMgb2YgYSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gdGhlIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30gb2YgdGhlIEl0ZW1FbnRyaWVzIHNob3VsZCBiZSByZW1vdmVkIGZyb20gYWxsIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgQ29sbGVjdGlvblJlc291cmNlc31cblx0ICovXG5cdHByb3RlY3RlZCBoYW5kbGVSZW1vdmVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdHJlbW92ZWRJdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29sbGVjdGlvblJlc291cmNlcyA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tjb2xsZWN0aW9uRW50cnkuaWRdO1xuXG5cdFx0aWYgKFxuXHRcdFx0cmVtb3ZlZEl0ZW1FbnRyaWVzLmxlbmd0aCA9PT0gMFxuXHRcdFx0fHwgY29sbGVjdGlvblJlc291cmNlcyA9PT0gdW5kZWZpbmVkXG5cdFx0XHR8fCBjb2xsZWN0aW9uUmVzb3VyY2VzLmxlbmd0aCA9PT0gMFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvblJlc291cmNlIG9mIGNvbGxlY3Rpb25SZXNvdXJjZXMpIHtcblx0XHRcdGNvbnN0IHJlbW92ZWRSZXNvdXJjZXMgPSBjb2xsZWN0aW9uUmVzb3VyY2UucmVtb3ZlSXRlbVJlc291cmNlcyhyZW1vdmVkSXRlbUVudHJpZXMpO1xuXG5cdFx0XHRjb2xsZWN0aW9uUmVzb3VyY2UuY2FsbE9uUmVtb3ZlKHJlbW92ZWRSZXNvdXJjZXMpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZmV0Y2hDb2xsZWN0aW9uRGF0YTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0Y29sdW1uU3Vic2V0Q2FjaGU6IENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0XHRjb2xsZWN0aW9uUXVlcnk6IENvbGxlY3Rpb25RdWVyeSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMuZW50cmllcy5nZXRCeVF1ZXJ5KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRjb2xsZWN0aW9uUXVlcnksXG5cdFx0KTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IG51bGwpIHtcblx0XHRcdC8vIFRoZXJlIGFscmVhZHkgaXMgYW4gZW50cnkgYW5kIGl0IGNvbnRhaW5zIHRoZSBjb2x1bW5zIHdlIG5lZWQsIHNvIHdlIGNhbiBzYWZlbHkgcmV0dXJuIGl0XG5cblx0XHRcdGlmIChjb2x1bW5TdWJzZXRDYWNoZS5ydW4oY29sbGVjdGlvbkVudHJ5LmNvbHVtbnMpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuZXhwYW5kQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUucmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oXG5cdFx0XHR0aGlzLmNyZWF0ZUNvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHQpLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cmllc30gb2Ygd2hpY2ggdGhlIHBhcmVudHMgYXJlIGxvY2FsXG5cdCAqL1xuXHRwcml2YXRlIGZldGNoTGlua2VkTG9jYWxDb2xsZWN0aW9uRW50cmllcyAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCkge1xuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0XHRjb25zdCBjb2x1bW5TdWJzZXRDYWNoZSA9IHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChvcHRpb25zLmNvbHVtbnMpO1xuXHRcdGNvbnN0IHByb21pc2VzOiB7W3BhcmVudElkOiBzdHJpbmddOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeT59ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IHBhcmVudElkIG9mIHBhcmVudElkQXJyYXkpIHtcblx0XHRcdGNvbnN0IG5ld09wdGlvbnMgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY2xvbmVPcHRpb25zKFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aXRlbVR5cGU6IHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkOiBwYXJlbnRJZCxcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IHBhcnNlZFF1ZXJ5ID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KG5ld09wdGlvbnMpO1xuXG5cdFx0XHR0aGlzLmV4cGFuZENvbHVtbnNXaXRoUXVlcnlDb2x1bW5zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0bmV3T3B0aW9ucyxcblx0XHRcdFx0cGFyc2VkUXVlcnkub2JqZWN0LFxuXHRcdFx0KTtcblxuXHRcdFx0cHJvbWlzZXNbcGFyZW50SWRdID0gdGhpcy5mZXRjaENvbGxlY3Rpb25EYXRhKFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZSxcblx0XHRcdFx0bmV3T3B0aW9ucyxcblx0XHRcdFx0cGFyc2VkUXVlcnksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlXG5cdFx0XHQuYWxsKHByb21pc2VzKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwID0+IHtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdFx0XHQuYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKVxuXHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdCgpID0+IGNvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwLFxuXHRcdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ29sdW1uRXhwYW5zaW9uUmVzdWx0LCBFbnRyeVBhcmVudE51bGwsIEZpZWxkTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEl0ZW1FbnRyeVNlcnZpY2UgfSBmcm9tICcuL0l0ZW1FbnRyeVNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBDaGFuZ2VzRGVsdGFSZXN1bHQgPSB7XG5cdHJvbGxiYWNrOiAoKSA9PiB2b2lkLFxuXHRjcmVhdGVkOiBJdGVtRW50cnlbXVxuXHQvLyB0b2RvW2NhY2hlXSBvdGhlciBzdGF0dXNlc1xufTtcblxuLyoqXG4gKiBAcmVtYXJrXG4gKiBXZSBleHBsaWNpdGx5IGtlZXAgdHJhY2sgb2YgdGhlIG5ldyBwYXJlbnQsIHNvIHdlIGNhbiBzZXQgYW4gaXRlbSB0byBtb3ZlZCBpZiBpdCBpc24ndCBudWxsIChOZWVkZWQgZm9yIGxpbmtUbyByZXF1ZXN0KVxuICovXG5leHBvcnQgdHlwZSBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0ge1xuXHRlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdGNoYW5nZXM6IHtcblx0XHRleHBhbmRlZENvbHVtbnM6IENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtVHlwZVR5cGU+IHwgbnVsbCxcblx0XHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdH1cbn07XG5cbmV4cG9ydCB0eXBlIENoYW5nZXNEZWx0YUl0ZW1EZWxldGVEZWx0YSA9IEl0ZW1FbnRyeVtdO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2hhbmdlc0RlbHRhQmFzZSB7XG5cblx0cHVibGljIHVwZGF0ZWQ6IHtcblx0XHRbaXRlbUVudHJ5SWQ6IG51bWJlcl06IENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YVxuXHR9ID0ge307XG5cblx0cHVibGljIGRlbGV0ZWQ6IHtcblx0XHRbaXRlbVR5cGU6IHN0cmluZ106IENoYW5nZXNEZWx0YUl0ZW1EZWxldGVEZWx0YVxuXHR9ID0ge307XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0KSB7XG5cblx0fVxuXG5cdHB1YmxpYyBzZXRJdGVtVXBkYXRlZDxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeVR5cGUsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPixcblx0XHRjb2x1bW5FeHBhbnNpb25SZXN1bHQ6IENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPiB8IG51bGwgPSBudWxsLFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbCxcblx0KTogdm9pZCB7XG5cdFx0aWYgKHRoaXMudXBkYXRlZFtlbnRyeS5pZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy51cGRhdGVkW2VudHJ5LmlkXSA9IHtcblx0XHRcdFx0ZW50cnk6IGVudHJ5LFxuXHRcdFx0XHRjaGFuZ2VzOiB7XG5cdFx0XHRcdFx0ZmllbGRzOiB7fSxcblx0XHRcdFx0XHRleHBhbmRlZENvbHVtbnM6IG51bGwsXG5cdFx0XHRcdFx0cGFyZW50OiBwYXJlbnQsXG5cdFx0XHRcdH0sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoYW5nZXNFbnRyeSA9IHRoaXMudXBkYXRlZFtlbnRyeS5pZF07XG5cblx0XHRpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBwYXJlbnRGaWVsZHMgPSB0aGlzLml0ZW1FbnRyeVNlcnZpY2UuZ2V0TGlua0ZpZWxkc0J5UGFyZW50KFxuXHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdGVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0KTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBwYXJlbnRGaWVsZHMpIHtcblx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IHBhcmVudEZpZWxkc1tjb2x1bW5JZF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBmaWVsZCBpbiBmaWVsZHMpIHtcblx0XHRcdGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuXHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdGZpZWxkLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGRlc2MgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRcdFx0Y2hhbmdlc0VudHJ5LmNoYW5nZXMuZmllbGRzLFxuXHRcdFx0XHRcdGZpZWxkLFxuXHRcdFx0XHRcdGRlc2MsXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjaGFuZ2VzRW50cnkuY2hhbmdlcy5maWVsZHNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoY29sdW1uRXhwYW5zaW9uUmVzdWx0ICE9PSBudWxsKSB7XG5cdFx0XHRjaGFuZ2VzRW50cnkuY2hhbmdlcy5leHBhbmRlZENvbHVtbnMgPSBjb2x1bW5FeHBhbnNpb25SZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldEl0ZW1EZWxldGVkIChcblx0XHRkZWxldGVkOiBJdGVtRW50cnksXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMuc2V0SXRlbXNEZWxldGVkKFxuXHRcdFx0W2RlbGV0ZWRdLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0SXRlbXNEZWxldGVkIChcblx0XHRkZWxldGVkOiBJdGVtRW50cnlbXSxcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgZGVsZXRlZCkge1xuXHRcdFx0aWYgKHRoaXMuZGVsZXRlZFtpdGVtRW50cnkuaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5kZWxldGVkW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV06IGRvIHdlIHJlYWxseSBoYXZlIHRvIGNoZWNrIHRoaXMgPyBkZWxldGluZyBtdWx0aXBsZSB0aW1lcyBkb2Vzbid0IG1hdHRlclxuXHRcdFx0Ly8gdG9kb1tjYWNoZV06IHRoaXMgY291bGQgYWxzbyBiZSBhIG1hcCBvZiBlbnRyeUlkIC0+IGl0ZW1FbnRyeVxuXHRcdFx0aWYgKHRoaXMuZGVsZXRlZFtpdGVtRW50cnkuaXRlbVR5cGVdLmluZGV4T2YoaXRlbUVudHJ5KSA+IC0xKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmRlbGV0ZWRbaXRlbUVudHJ5Lml0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnQsIEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFCYXNlIH0gZnJvbSAnLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IENvbHVtblNldCB9IGZyb20gJy4vQ29sdW1uU2V0JztcbmltcG9ydCB7IEl0ZW1FbnRyeVNlcnZpY2UgfSBmcm9tICcuL0l0ZW1FbnRyeVNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0ge1xuXHRpdGVtSWQ6IEl0ZW1JZCxcblx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRjb2x1bW5zOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDaGFuZ2VzRGVsdGEgdXNlZCB0byBhcHBseSBjaGFuZ2VzIGZyb20gb3V0c2lkZSBvZiB0aGUgY29yZSB0byBhIHRyYW5zYWN0aW9uXG4gKlxuICogLS0tLS0tLS0tLVxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4ge0BsaW5rIEludGVybmFsQ2hhbmdlc0RlbHRhIEludGVybmFsQ2hhbmdlc0RlbHRhfSBhbmQge0BsaW5rIENoYW5nZXNEZWx0YSBDaGFuZ2VzRGVsdGF9IGlzIHRoYXQgdGhlIENoYW5nZXNEZWx0YVxuICogYXNzdW1lcyAnY3JlYXRlZCcgdmFsdWVzIGhhdmUgbm8gaXRlbUVudHJpZXMgeWV0LlxuICpcbiAqIFVzZSB0aGlzIHdoZW4gY2FsbGluZyB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBhcHBseUNoYW5nZXNEZWx0YX1cbiAqL1xuZXhwb3J0IGNsYXNzIENoYW5nZXNEZWx0YVxuXHRleHRlbmRzIENoYW5nZXNEZWx0YUJhc2Uge1xuXG5cdHB1YmxpYyBjcmVhdGVkOiBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGFbXSA9IFtdO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogV2lsbCBjcmVhdGUgYW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IHdoZW4gdGhlIGRlbHRhIGlzIGFwcGxpZWRcblx0ICogRG9lcyBub3QgYWx3YXlzIG1lYW4gdGhlIGl0ZW0gaXMgbG9jYWwsIGp1c3QgdGhhdCBpdCBpc24ndCBjYWNoZWQgeWV0XG5cdCAqXG5cdCAqIC0tLS0tLVxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIFdoZW4gdGhlIGBwYXJlbnRgIHByb3BlcnR5IGlzIHBhc3NlZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBwcm9wZXIgZmllbGRzIHRvIG1hdGNoIHRoZSBwYXJlbnQsIHRoaXMgYXNzdW1lcyB0aGUgcmVxdWlyZWQgcGFyZW50IGNvbHVtbnMgYXJlIGluIHRoZSBwYXNzZWQgY29sdW1uc1xuXHQgKiBZb3UgY2FuIGVhc2lseSBnZXQgdGhlIHJlcXVpcmVkIGNvbHVtbnMgYnkgYWxzbyBwYXNzaW5nIHRoZSBgcGFyZW50YCB0byB0aGUge0BsaW5rIFRlbXBsYXRlQ2FjaGUuZmV0Y2hUZW1wbGF0ZSB0ZW1wbGF0ZSBmZXRjaENvbGxlY3Rpb25FbnRyeX0gY2FsbFxuXHQgKi9cblx0cHVibGljIHNldEl0ZW1DcmVhdGVkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+LFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbCxcblx0KTogdm9pZCB7XG5cdFx0bGV0IHBhcmVudEZpZWxkczogUGFydGlhbDxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PiA9IHt9O1xuXG5cdFx0aWYgKHBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0cGFyZW50RmllbGRzID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudChcblx0XHRcdFx0cGFyZW50LFxuXHRcdFx0XHRjb2x1bW5zLml0ZW1UeXBlLFxuXHRcdFx0KTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBwYXJlbnRGaWVsZHMpIHtcblx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IHBhcmVudEZpZWxkc1tjb2x1bW5JZF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGVmYXVsdFZhbHVlcyA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRMb2NhbERlZmF1bHRWYWx1ZXMoKTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gZGVmYXVsdFZhbHVlcykge1xuXHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IGRlZmF1bHRWYWx1ZXNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdHRoaXMuY3JlYXRlZC5wdXNoKHtcblx0XHRcdGl0ZW1JZDogaXRlbUlkLFxuXHRcdFx0ZmllbGRzOiBmaWVsZHMsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBhc3NpZ24gdGhlIHByb3BlciBwYXJlbnQgZmllbGRzLCB3aWxsIGNhbGwge0BsaW5rIENoYW5nZXNEZWx0YUJhc2Uuc2V0SXRlbVVwZGF0ZWQgc2V0SXRlbVVwZGF0ZWR9IGludGVybmFsbHlcblx0ICovXG5cdHB1YmxpYyBzZXRJdGVtTW92ZWQgKFxuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0dG86IEVudHJ5UGFyZW50LFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0ZW50cnksXG5cdFx0XHR7fSxcblx0XHRcdG51bGwsXG5cdFx0XHR0byxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnQsIEZpZWxkTWFwLCBJdGVtSWRDb252ZXJzaW9uTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUJhc2UgfSBmcm9tICcuL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4vSXRlbUVudHJ5U2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIEludGVybmFsQ3JlYXRlRGVsdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0ge1xuXHRlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDaGFuZ2VzRGVsdGEgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb3JlXG4gKlxuICogLS0tLS0tLS0tLVxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4ge0BsaW5rIEludGVybmFsQ2hhbmdlc0RlbHRhIEludGVybmFsQ2hhbmdlc0RlbHRhfSBhbmQge0BsaW5rIENoYW5nZXNEZWx0YSBDaGFuZ2VzRGVsdGF9IGlzIHRoYXQgdGhlIEludGVybmFsQ2hhbmdlc0RlbHRhXG4gKiBhc3N1bWVzICdjcmVhdGVkJyBlbnRyaWVzIGFyZSBhbHJlYWR5IGV4aXN0aW5nLCBzbyBpdCBoYXMgYSBkaWZmZXJlbnQgZm9ybWF0LlxuICpcbiAqIFVzZSB0aGlzIHdoZW4gY2FsbGluZyB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50IGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnR9IGFuZCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tQ2hpbGQgYXBwbHlDaGFuZ2VzRnJvbUNoaWxkfVxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxDaGFuZ2VzRGVsdGFcblx0ZXh0ZW5kcyBDaGFuZ2VzRGVsdGFCYXNlIHtcblxuXHRwdWJsaWMgY3JlYXRlZDoge1xuXHRcdFtpdGVtRW50cnlJZDogc3RyaW5nXTogSW50ZXJuYWxDcmVhdGVEZWx0YVxuXHR9ID0ge307XG5cblx0cHVibGljIG1vdmVkOiB7XG5cdFx0W2l0ZW1FbnRyeUlkOiBudW1iZXJdOiB7XG5cdFx0XHRlbnRyeTogSXRlbUVudHJ5LFxuXHRcdFx0dG86IEVudHJ5UGFyZW50XG5cdFx0fVxuXHR9ID0ge307XG5cblx0cHVibGljIGl0ZW1JZENvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAgPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0aXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0SXRlbUNyZWF0ZWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5jcmVhdGVkW2l0ZW1FbnRyeS5pZF0gPSB7XG5cdFx0XHRlbnRyeTogaXRlbUVudHJ5LFxuXHRcdFx0ZmllbGRzOiBmaWVsZHMsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmVtYXJrXG5cdCAqIFBhcmVudCBmaWVsZHMgYXJlIG5vbi13cml0YWJsZSBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgbW92ZWQgZW50cmllcyBhbm90aGVyIHdheSAodG8gZG8gYSBsaW5rVG8gcmVxdWVzdClcblx0ICovXG5cdHB1YmxpYyBzZXRJdGVtTW92ZWQgKFxuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0dG86IEVudHJ5UGFyZW50LFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLm1vdmVkW2VudHJ5LmlkXSA9IHtcblx0XHRcdGVudHJ5OiBlbnRyeSxcblx0XHRcdHRvOiB0byxcblx0XHR9O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBEZWZlcnJlZCwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi9BcGlSZXF1ZXN0U2VydmljZSc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvciB9IGZyb20gJy4vQXBpUmVzcG9uc2VQcm9jZXNzb3InO1xuaW1wb3J0IHsgU2VydmVyQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3NlcnZlci9TZXJ2ZXJDYWNoZSc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uIH0gZnJvbSAnLi9SZXF1ZXN0Q29sdW1uRXhwYW5zaW9uJztcblxuZXhwb3J0IHR5cGUgUmVxdWVzdEJ1ZmZlclJlc3BvbnNlID0gQXBpUmVzcG9uc2VQcm9jZXNzb3I7XG5cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0QnVmZmVyIHtcblxuXHRwcml2YXRlIGRlZmVycmVkOiBEZWZlcnJlZDxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+ID0gdGhpcy5wcm9taXNlTGlicmFyeS5kZWZlcigpO1xuXHRwcml2YXRlIHJlcXVlc3RDb2x1bW5FeHBhbnNpb246IFJlcXVlc3RDb2x1bW5FeHBhbnNpb24gPSB0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRwcml2YXRlIHNpbmdsZUl0ZW1JZHM6IEl0ZW1JZFtdID0gW107XG5cdHByaXZhdGUgcXVlcmllczoge1txdWVyeVN0cmluZzogc3RyaW5nXTogQXBpUXVlcnl9ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcHJvbWlzZUxpYnJhcnk6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgc2VydmVyQ2FjaGU6IFNlcnZlckNhY2hlLFxuXHRcdHByaXZhdGUgaXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIGNvbnRhaW5zSWQgKFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5zaW5nbGVJdGVtSWRzLmluZGV4T2YoaXRlbUlkKSAhPT0gLTE7XG5cdH1cblxuXHRwdWJsaWMgY29udGFpbnNRdWVyeSAoXG5cdFx0cXVlcnlTdHJpbmc6IHN0cmluZyxcblx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMucXVlcmllc1txdWVyeVN0cmluZ10gIT09IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBhZGRTaW5nbGVJdGVtIChcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVxdWVzdEJ1ZmZlclJlc3BvbnNlPiB7XG5cdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0aWYgKHRoaXMuc2luZ2xlSXRlbUlkcy5pbmRleE9mKGl0ZW1JZCkgPT09IC0xKSB7XG5cdFx0XHR0aGlzLnNpbmdsZUl0ZW1JZHMucHVzaChpdGVtSWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmdldFByb21pc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBhZGRRdWVyeSAoXG5cdFx0cXVlcnk6IFtvYmplY3QsIHN0cmluZ10sXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHR0aGlzLml0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0KTtcblxuXHRcdGlmICh0aGlzLnF1ZXJpZXNbcXVlcnlbMV1dID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMucXVlcmllc1txdWVyeVsxXV0gPSBxdWVyeVswXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgZmx1c2ggKCk6IFByb21pc2VJbnRlcmZhY2U8UmVxdWVzdEJ1ZmZlclJlc3BvbnNlPiB7XG5cdFx0Y29uc3QgY29uZGl0aW9uczogYW55W10gPSBbXTtcblxuXHRcdGlmICh0aGlzLnNpbmdsZUl0ZW1JZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uZGl0aW9ucy5wdXNoKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5OiAnaWQnLFxuXHRcdFx0XHRcdGNvbXBhcmF0b3I6ICdJTicsXG5cdFx0XHRcdFx0dmFsdWU6IHRoaXMuc2luZ2xlSXRlbUlkcyxcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBxdWVyeVN0cmluZyBpbiB0aGlzLnF1ZXJpZXMpIHtcblx0XHRcdGNvbmRpdGlvbnMucHVzaCh0aGlzLnF1ZXJpZXNbcXVlcnlTdHJpbmddKTtcblx0XHR9XG5cblx0XHRpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVHJpZWQgdG8gZmx1c2ggYSBSZXF1ZXN0QnVmZmVyIHdpdGhvdXQgc2luZ2xlSXRlbXMgb3IgcXVlcmllcycpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlcXVlc3RDb2x1bW5zID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmdldCgpO1xuXG5cdFx0bGV0IHJlc3BvbnNlOiBBcGlSZXNwb25zZVByb2Nlc3NvcjtcblxuXHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdC5xdWVyeShcblx0XHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbmRpdGlvbnM6IGNvbmRpdGlvbnMsXG5cdFx0XHRcdFx0b3BlcmF0b3I6ICdPUicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdF9yZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0cmVzcG9uc2UgPSBfcmVzcG9uc2U7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXJ2ZXJDYWNoZS5wcm9jZXNzUmVzcG9uc2UoXG5cdFx0XHRcdFx0XHRyZXNwb25zZSxcblx0XHRcdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvciA9PiB0aGlzLmRlZmVycmVkLnJlamVjdChlcnJvciksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gdGhpcy5kZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKSxcblx0XHRcdFx0ZXJyb3IgPT4gdGhpcy5kZWZlcnJlZC5yZWplY3QoZXJyb3IpLFxuXHRcdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLmdldFByb21pc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRQcm9taXNlICgpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdHJldHVybiB0aGlzLmRlZmVycmVkLnByb21pc2U7XG5cdH1cbn1cbiIsImltcG9ydCB7IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtSWQsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuL0FwaVJlcXVlc3RTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlUHJvY2Vzc29yIH0gZnJvbSAnLi9BcGlSZXNwb25zZVByb2Nlc3Nvcic7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IEtleVNlcnZpY2UgfSBmcm9tICcuL0tleVNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdEJ1ZmZlciwgUmVxdWVzdEJ1ZmZlclJlc3BvbnNlIH0gZnJvbSAnLi9SZXF1ZXN0QnVmZmVyJztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL1V0aWwnO1xuXG5jb25zdCBCVUZGRVJfRkxVU0hfVElNRU9VVF9NUzogbnVtYmVyID0gMTUwO1xuXG5leHBvcnQgY2xhc3MgUmVxdWVzdEJ1ZmZlck1hbmFnZXIge1xuXG5cdHByaXZhdGUgcGVuZGluZ0J1ZmZlck1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogUmVxdWVzdEJ1ZmZlcn0gPSB7fTtcblx0cHJpdmF0ZSBwZW5kaW5nVHJ1ZUJ1ZmZlck1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogUmVxdWVzdEJ1ZmZlcn0gPSB7fTtcblxuXHRwcml2YXRlIHBlbmRpbmdRdWVyeUJ1ZmZlck1hcDoge1tpdGVtVHlwZTogc3RyaW5nXToge1txdWVyeVN0cmluZzogc3RyaW5nXTogUmVxdWVzdEJ1ZmZlcn19ID0ge307XG5cdHByaXZhdGUgcGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiB7W2xvY2FsSXRlbUlkOiBzdHJpbmddOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPn19ID0ge307XG5cblx0cHJpdmF0ZSBzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGU7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcHJvbWlzZUxpYnJhcnk6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIHNldFNlcnZlckNhY2hlIChzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGUpOiB2b2lkIHtcblx0XHR0aGlzLnNlcnZlckNhY2hlID0gc2VydmVyQ2FjaGU7XG5cdH1cblxuXHRwdWJsaWMgY29udGFpbnNJZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpOiBib29sZWFuIHtcblx0XHRpZiAoZ2V0UGF0aChcblx0XHRcdHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwLFxuXHRcdFx0W1xuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XSxcblx0XHQpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5wZW5kaW5nQnVmZmVyTWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGVuZGluZ0J1ZmZlck1hcFtpdGVtVHlwZV0uY29udGFpbnNJZChpdGVtSWQpO1xuXHR9XG5cblx0cHVibGljIGNvbnRhaW5zUXVlcnkgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZ2V0UGF0aChcblx0XHRcdHRoaXMucGVuZGluZ1F1ZXJ5QnVmZmVyTWFwLFxuXHRcdFx0W1xuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cXVlcnlTdHJpbmcsXG5cdFx0XHRdLFxuXHRcdCkgIT09IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEJ5SWRzIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGl0ZW1JZHMpIHtcblx0XHRcdHRoaXMuZmV0Y2hCeUlkKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGVuZGluZ0J1ZmZlck1hcFtpdGVtVHlwZV0uZ2V0UHJvbWlzZSgpO1xuXHR9XG5cblx0cHVibGljIGZldGNoQnlJZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHRpZiAodGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChpdGVtSWQpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbG9jYWwgSXRlbUlkIGluIFJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlJZCwgZm9yIGxvY2FsIEl0ZW1JZHMgeW91IHNob3VsZCB1c2UgUmVxdWVzdEJ1ZmZlck1hbmFnZXIuZmV0Y2hCeUxvY2FsSWQnKTtcblx0XHR9XG5cblx0XHRsZXQgYnVmZmVyO1xuXG5cdFx0aWYgKHJlcXVlc3RDb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRidWZmZXIgPSB0aGlzLnBlbmRpbmdUcnVlQnVmZmVyTWFwW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGJ1ZmZlciA9IHRoaXMuY29uc3RydWN0QnVmZmVyKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdHRoaXMucGVuZGluZ1RydWVCdWZmZXJNYXAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zb2xlLmxvZyhgRXhpc3RpbmcgJ2NvbHVtbnM6IHRydWUnIFJlcXVlc3RCdWZmZXIgJHtpdGVtVHlwZX0gYXQgJHtwZXJmb3JtYW5jZS5ub3coKX0gYnkgaWRgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YnVmZmVyID0gdGhpcy5wZW5kaW5nQnVmZmVyTWFwW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGJ1ZmZlciA9IHRoaXMuY29uc3RydWN0QnVmZmVyKGl0ZW1UeXBlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKGBFeGlzdGluZyBSZXF1ZXN0QnVmZmVyICR7aXRlbVR5cGV9IGF0ICR7cGVyZm9ybWFuY2Uubm93KCl9IGJ5IGlkYCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YnVmZmVyLmFkZFNpbmdsZUl0ZW0oXG5cdFx0XHRpdGVtSWQsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlci5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hCeVF1ZXJ5IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cXVlcnk6IFtvYmplY3QsIHN0cmluZ10sIC8vIHF1ZXJ5UGFyc2VyIHJlc3VsdFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHRsZXQgYnVmZmVyID0gdGhpcy5wZW5kaW5nQnVmZmVyTWFwW2l0ZW1UeXBlXTtcblxuXHRcdGlmIChidWZmZXIgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YnVmZmVyID0gdGhpcy5jb25zdHJ1Y3RCdWZmZXIoaXRlbVR5cGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmxvZyhgRXhpc3RpbmcgUmVxdWVzdEJ1ZmZlciAke2l0ZW1UeXBlfSBhdCAke3BlcmZvcm1hbmNlLm5vdygpfSB3aXRoIHF1ZXJ5YCk7XG5cdFx0fVxuXG5cdFx0YnVmZmVyLmFkZFF1ZXJ5KFxuXHRcdFx0cXVlcnksXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlci5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hCeUxvY2FsSWQgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyA9ICduby1pZCcsXG5cdFx0dGVtcGxhdGVPcHRpb25zPzogYW55LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWRcblx0XHRcdHx8IHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwW2l0ZW1UeXBlXVtpdGVtSWRdID09PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdFRlbXBsYXRlQnVmZmVyKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHR0ZW1wbGF0ZU9wdGlvbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnBlbmRpbmdUZW1wbGF0ZUJ1ZmZlck1hcFtpdGVtVHlwZV1baXRlbUlkXTtcblx0fVxuXG5cdC8vIHByaXZhdGUgY29uc3RydWN0UXVlcnlCdWZmZXIgKFxuXHQvLyBcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0Ly8gXHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHQvLyApOiBSZXF1ZXN0QnVmZmVyIHtcblx0Ly8gXHRpZiAodGhpcy5wZW5kaW5nUXVlcnlCdWZmZXJNYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0Ly8gXHRcdHRoaXMucGVuZGluZ1F1ZXJ5QnVmZmVyTWFwW2l0ZW1UeXBlXSA9IHt9O1xuXHQvLyBcdH1cblx0Ly9cblx0Ly8gXHRjb25zdCBidWZmZXIgPSB0aGlzLnBlbmRpbmdRdWVyeUJ1ZmZlck1hcFtpdGVtVHlwZV1bcXVlcnlTdHJpbmddID0gbmV3IFJlcXVlc3RCdWZmZXIoXG5cdC8vIFx0XHR0aGlzLnByb21pc2VMaWJyYXJ5LFxuXHQvLyBcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0Ly8gXHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdC8vIFx0XHR0aGlzLnNlcnZlckNhY2hlLFxuXHQvLyBcdFx0aXRlbVR5cGUsXG5cdC8vIFx0KTtcblx0Ly9cblx0Ly8gXHRjb25zb2xlLmxvZyhgQ3JlYXRpbmcgUmVxdWVzdEJ1ZmZlciAke2l0ZW1UeXBlfSBhdCAke3BlcmZvcm1hbmNlLm5vdygpfWApO1xuXHQvL1xuXHQvLyBcdHdpbmRvdy5zZXRUaW1lb3V0KFxuXHQvLyBcdFx0KCkgPT4ge1xuXHQvLyBcdFx0XHRidWZmZXIuZmx1c2goKTtcblx0Ly9cblx0Ly8gXHRcdFx0Y29uc29sZS5sb2coYFJlbW92aW5nIFJlcXVlc3RCdWZmZXIgJHtpdGVtVHlwZX0gYXQgJHtwZXJmb3JtYW5jZS5ub3coKX1gKTtcblx0Ly9cblx0Ly8gXHRcdFx0ZGVsZXRlIHRoaXMucGVuZGluZ1F1ZXJ5QnVmZmVyTWFwW2l0ZW1UeXBlXVtxdWVyeVN0cmluZ107XG5cdC8vIFx0XHR9LFxuXHQvLyBcdFx0QlVGRkVSX0ZMVVNIX1RJTUVPVVRfTVMsXG5cdC8vIFx0KTtcblx0Ly9cblx0Ly8gXHRyZXR1cm4gYnVmZmVyO1xuXHQvLyB9XG5cblx0cHJpdmF0ZSBjb25zdHJ1Y3RCdWZmZXIgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRtYXAgPSB0aGlzLnBlbmRpbmdCdWZmZXJNYXAsXG5cdCk6IFJlcXVlc3RCdWZmZXIge1xuXHRcdGNvbnN0IGJ1ZmZlciA9IG1hcFtpdGVtVHlwZV0gPSBuZXcgUmVxdWVzdEJ1ZmZlcihcblx0XHRcdHRoaXMucHJvbWlzZUxpYnJhcnksXG5cdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuc2VydmVyQ2FjaGUsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHQpO1xuXG5cdFx0d2luZG93LnNldFRpbWVvdXQoXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdGJ1ZmZlci5mbHVzaCgpO1xuXG5cdFx0XHRcdGRlbGV0ZSBtYXBbaXRlbVR5cGVdO1xuXHRcdFx0fSxcblx0XHRcdEJVRkZFUl9GTFVTSF9USU1FT1VUX01TLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gYnVmZmVyO1xuXHR9XG5cblx0cHJpdmF0ZSBjb25zdHJ1Y3RUZW1wbGF0ZUJ1ZmZlciAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkIHwgc3RyaW5nLFxuXHRcdHRlbXBsYXRlT3B0aW9ucz86IGFueSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdGlmICh0aGlzLnBlbmRpbmdUZW1wbGF0ZUJ1ZmZlck1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwW2l0ZW1UeXBlXVtpdGVtSWRdID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LnRlbXBsYXRlKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGVtcGxhdGVPcHRpb25zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0XHRcdFx0XHRyZXR1cm4gcmVzcG9uc2U7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KCk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vQXBpRm9ybWF0dGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlSZXNwb25zZVByb2Nlc3Nvcic7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNDb21waWxhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNQcm9jZXNzb3InO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uQ2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbk1hdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uQ2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5FeHBhbnNpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uSW5mbyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtblNldCc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtblN1YnNldENhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL0NyZWF0ZVJlcXVlc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtQ2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtRW50cnlTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vS2V5U2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uRXZlbnRIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vTG9ja1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9RdWVyeU1hdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9RdWVyeVBhcnNlcic7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5U2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL1JlcXVlc3RDb2x1bW5FeHBhbnNpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9Tb2NrZXRNZXNzYWdlSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS9BYnN0cmFjdENhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckl0ZW1IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNvbGxlY3Rpb25IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uSXRlbUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25FdmVudEhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzRGVsdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5leHBvcnQgKiBmcm9tICcuL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vUmVxdWVzdEJ1ZmZlcic7XG4iLCJpbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSwgVGVtcGxhdGVGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEVudHJ5UGFyZW50TnVsbCwgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENvbHVtbkhhbmRsZXIgfSBmcm9tICcuL0NvbHVtbkhhbmRsZXInO1xuaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4vQ29sdW1uVXRpbCc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4vUmVxdWVzdEJ1ZmZlck1hbmFnZXInO1xuaW1wb3J0IHsgaGFzUHJvcGVydGllcyB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUNhY2hlIHtcblxuXHRwdWJsaWMgdGVtcGxhdGVzOiB7XG5cdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiBUZW1wbGF0ZTxhbnk+XG5cdH0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdEJ1ZmZlckZhY3Rvcnk6IFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdHByaXZhdGUgY29sdW1uSGFuZGxlcjogQ29sdW1uSGFuZGxlcixcblx0XHRwcml2YXRlIHRlbXBsYXRlRmFjdG9yeTogVGVtcGxhdGVGYWN0b3J5LFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdCkge1xuXG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSB7QGxpbmsgVGVtcGxhdGUgdGVtcGxhdGV9LCB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5jcmVhdGVJdGVtcyBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmNyZWF0ZUl0ZW1zfSBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciB0aGlzXG5cdCAqXG5cdCAqIEBwYXJhbSBpdGVtVHlwZSBUaGUge0BsaW5rIEl0ZW1UeXBlIEl0ZW1UeXBlfSBvZiB0aGUgdGVtcGxhdGUgaXRlbVxuXHQgKiBAcGFyYW0gaXRlbUlkIFVzZWQgZm9yIGNhY2hpbmcsIG11bHRpcGxlIGNvbmN1cnJlbnQgdGVtcGxhdGUgY2FsbHMgZm9yIHRoZSBzYW1lIGl0ZW1JZCB3aWxsIHJldHVybiB0aGUgc2FtZSB0ZW1wbGF0ZVxuXHQgKiBAcGFyYW0gdGVtcGxhdGVPcHRpb25zXG5cdCAqIEBwYXJhbSB0ZW1wbGF0ZUNvbHVtbnMgQWRkaXRpb25hbCBjb2x1bW5zIHRvIGJlIGZldGNoZWQsIHdpbGwgYmUgc3RvcmVkIGluIHRoZSB0ZW1wbGF0ZSAtIHdhcm5pbmcgLSB0aGUgVGVtcGxhdGUgd29uJ3QgaGF2ZSB2YWx1ZXMgZm9yIHRob3NlIGNvbHVtbnNcblx0ICogQHBhcmFtIGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZSBBbiBvcHRpb25hbCB7QGxpbmsgRW50cnlQYXJlbnROdWxsIGVudHJ5IHBhcmVudH0gb3Ige0BsaW5rIEl0ZW1UeXBlIHBhcmVudCBpdGVtVHlwZX0sIGlmIHRoZSBwYXJlbnQgaXMgcGFzc2VkIHRoZSB0ZW1wbGF0ZUNvbHVtbnMgd2lsbCBiZSBleHBhbmRlZCB3aXRoIHRoZSBwcm9wZXIgbGluayBjb2x1bW5zIChUaHJvdWdoIHtAbGluayBDb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGluayBDb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGlua30pXG5cdCAqXG5cdCAqIEBleGFtcGxlXG5cdCAqIGBgYFxuXHQgKiAgY29uc3QgcGFyZW50OiBFbnRyeVBhcmVudCA9IHtcblx0ICogICAgICBpdGVtVHlwZTogJ0Z1bmN0aWUnLFxuXHQgKiAgICAgIGl0ZW1JZDogMTAsXG5cdCAqICB9O1xuXHQgKlxuXHQgKiAgcmV0dXJuIGNvcmUudGVtcGxhdGVDYWNoZVxuXHQgKiAgICAgIC5mZXRjaFRlbXBsYXRlKFxuXHQgKiAgICAgICAgICAnUGxhbm5pbmdwZXJzb25lZWwnLFxuXHQgKiAgICAgICAgICB1bmRlZmluZWQsXG5cdCAqICAgICAgICAgIHt9LFxuXHQgKiAgICAgICAgICB7fSxcblx0ICogICAgICAgICAgcGFyZW50LFxuXHQgKiAgICAgIClcblx0ICogICAgICAudGhlbihcblx0ICogICAgICAgICAgKHRlbXBsYXRlOiBUZW1wbGF0ZTwnUGxhbm5pbmdwZXJzb25lZWwnPikgPT4ge1xuXHQgKiAgICAgICAgICAgICAgY29uc3QgY2hhbmdlc0RlbHRhID0gdHJhbnNhY3Rpb24uY3JlYXRlQ2hhbmdlc0RlbHRhKCk7XG5cdCAqXG5cdCAqICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBzZWxlY3RlZEl0ZW1zKSB7XG5cdCAqICAgICAgICAgICAgICAgICAgY2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBjb3JlLmtleVNlcnZpY2UuZ2V0TG9jYWxJZCgpLFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5maWVsZHMsXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLmNvbHVtbnMsXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCxcblx0ICogICAgICAgICAgICAgICAgICApO1xuXHQgKiAgICAgICAgICAgICAgfVxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgdHJhbnNhY3Rpb24uYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0ICogICAgICAgICAgKTtcblx0ICogIGBgYFxuXHQgKi9cblx0cHVibGljIGZldGNoVGVtcGxhdGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZD86IEl0ZW1JZCxcblx0XHR0ZW1wbGF0ZU9wdGlvbnM6IGFueSA9IHt9LFxuXHRcdHRlbXBsYXRlQ29sdW1uczogYW55ID0ge30sXG5cdFx0ZW50cnlQYXJlbnRPclBhcmVudEl0ZW1UeXBlOiBFbnRyeVBhcmVudE51bGwgfCBJdGVtVHlwZSA9IG51bGwsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8VGVtcGxhdGU8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGhhc1RlbXBsYXRlT3B0aW9ucyA9IGhhc1Byb3BlcnRpZXModGVtcGxhdGVPcHRpb25zKTtcblx0XHQvLyB0b2RvW2NhY2hlXSBXZSBhbHdheXMgbmVlZCB0byBmZXRjaCBjb2x1bW5zIG9mIHRoZSBtYWluIEl0ZW1UeXBlXG5cdFx0Ly8gY29uc3QgY29sdW1uSXRlbVR5cGUgPSBnZXRGaXJzdFByb3BlcnR5KHRlbXBsYXRlQ29sdW1ucyk7IC8vIGl0J3MgcG9zc2libGUgdG8gYWRkIGNvbHVtbnMgdG8gbGlua2VkIGl0ZW1zXG5cblx0XHRjb25zdCByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdGlmICh0ZW1wbGF0ZUNvbHVtbnNbaXRlbVR5cGVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGVtcGxhdGVDb2x1bW5zW2l0ZW1UeXBlXSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdFtcblx0XHRcdFx0e2NyZWF0b3I6IFsnZGlzcGxheW5hbWUnXX0sXG5cdFx0XHRcdCdjcmVhdGVkJyxcblx0XHRcdFx0J3Blcm1pc3Npb25zJyxcblx0XHRcdF0sXG5cdFx0KTtcblxuXHRcdGlmIChlbnRyeVBhcmVudE9yUGFyZW50SXRlbVR5cGUgIT09IG51bGwpIHtcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGhpcy5jb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGluayhcblx0XHRcdFx0XHQodHlwZW9mIGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZSA9PT0gJ3N0cmluZycpXG5cdFx0XHRcdFx0XHQ/IGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZVxuXHRcdFx0XHRcdFx0OiBlbnRyeVBhcmVudE9yUGFyZW50SXRlbVR5cGUuaXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0gPSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmdldCgpW2l0ZW1UeXBlXTtcblxuXHRcdGlmICghaGFzVGVtcGxhdGVPcHRpb25zKSB7XG5cdFx0XHRjb25zdCBjYWNoZWRUZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVzW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjYWNoZWRUZW1wbGF0ZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCYmIChcblx0XHRcdFx0XHRpdGVtVHlwZSA9PT0gbnVsbFxuXHRcdFx0XHRcdHx8IHRoaXMuY29sdW1uVXRpbC5yZXNwb25zZUNvbHVtbnNBdmFpbGFibGUoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHRjYWNoZWRUZW1wbGF0ZS5yZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihjYWNoZWRUZW1wbGF0ZSBhcyBUZW1wbGF0ZTxJdGVtVHlwZVR5cGU+KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZVxuXHRcdFx0LmFsbChcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLnJlcXVlc3RCdWZmZXJGYWN0b3J5LmZldGNoQnlMb2NhbElkKFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHR0ZW1wbGF0ZU9wdGlvbnMsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRhZGRpdGlvbmFsQ29sdW1uczogdGVtcGxhdGVDb2x1bW5zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHQ/IHt9XG5cdFx0XHRcdFx0XHQ6IHRoaXMuY29sdW1uSGFuZGxlci5mZXRjaChcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc29sdmVkID0+IHtcblx0XHRcdFx0XHRjb25zdCB0ZW1wbGF0ZVJlc3BvbnNlID0gcmVzb2x2ZWQudGVtcGxhdGU7XG5cblx0XHRcdFx0XHRjb25zdCB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0dGVtcGxhdGVSZXNwb25zZSxcblx0XHRcdFx0XHRcdHRlbXBsYXRlQ29sdW1ucyxcblx0XHRcdFx0XHRcdHJlc29sdmVkLmFkZGl0aW9uYWxDb2x1bW5zLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAoIWhhc1RlbXBsYXRlT3B0aW9ucyAmJiB0ZW1wbGF0ZVJlc3BvbnNlLmNhY2hlYWJsZSkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZW1wbGF0ZXNbaXRlbVR5cGVdID0gdGVtcGxhdGU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRlbXBsYXRlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIEFwaVJlc3BvbnNlUHJvY2Vzc29yIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5cbmV4cG9ydCBjbGFzcyBBcGlSZXNwb25zZVByb2Nlc3NvckZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAocHJpdmF0ZSBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcikge1xuXG5cdH1cblxuXHRjb25zdHJ1Y3QgKHJlc3BvbnNlOiBhbnkpOiBBcGlSZXNwb25zZVByb2Nlc3NvciB7XG5cdFx0cmV0dXJuIG5ldyBBcGlSZXNwb25zZVByb2Nlc3Nvcih0aGlzLmFwaUZvcm1hdHRlciwgcmVzcG9uc2UpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDaGFuZ2VzQ29tcGlsYXRpb24gfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKCkge1xuXHR9XG5cblx0Y29uc3RydWN0IChcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogQ2hhbmdlc0NvbXBpbGF0aW9uIHtcblx0XHRyZXR1cm4gbmV3IENoYW5nZXNDb21waWxhdGlvbihcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25DYWNoZUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCk6IENvbGxlY3Rpb25DYWNoZSB7XG5cdFx0cmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2FjaGUoXG5cdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cdFxufVxuIiwiaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5U2VydmljZSwgS2V5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBDb2xsZWN0aW9uRW50cnlPcHRpb25zLCBDb2xsZWN0aW9uRW50cnlPcHRpb25zSW50ZXJmYWNlIH0gZnJvbSAnLi4vbW9kZWxzLyc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzLyc7XG5pbXBvcnQgeyBDb2x1bW5TZXRGYWN0b3J5IH0gZnJvbSAnLi9Db2x1bW5TZXRGYWN0b3J5JztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25FbnRyeUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2x1bW5TZXRGYWN0b3J5OiBDb2x1bW5TZXRGYWN0b3J5LFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0KSB7XG5cdH1cblxuXHRjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnNJbnRlcmZhY2UsXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5jb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0dGhpcy5rZXlTZXJ2aWNlLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlciwgU2VydmVyQ2FjaGUsIFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3QgKFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlIHwgU2VydmVyQ2FjaGUsXG5cdFx0Z2V0Q29sbGVjdGlvbkVudHJpZXM6IDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4oaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSkgPT4gQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHQpOiBDb2xsZWN0aW9uTWF0Y2hlciB7XG5cdFx0cmV0dXJuIG5ldyBDb2xsZWN0aW9uTWF0Y2hlcihcblx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0Z2V0Q29sbGVjdGlvbkVudHJpZXMsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBJdGVtUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25FZGl0UmVzb3VyY2UsXG5cdENvbGxlY3Rpb25FbnRyeSxcblx0Q29sbGVjdGlvblJlc291cmNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlLFxuXHRDb2xsZWN0aW9uVmlld1Jlc291cmNlLFxuXHRFZGl0UmVzb3VyY2UsXG5cdEl0ZW1SZXNvdXJjZSxcblx0TG9jYWxWaWV3UmVzb3VyY2UsXG5cdFJlbW90ZVZpZXdSZXNvdXJjZSxcbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4vQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHVibGljIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHB1YmxpYyBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHB1YmxpYyBpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHB1YmxpYyBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHB1YmxpYyBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHVibGljIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlfSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWV9LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSwgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBvcHRpb25zSW5zdGFuY2UgPSBuZXcgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucyhvcHRpb25zKTtcblxuXHRcdGlmIChvcHRpb25zSW5zdGFuY2UuZWRpdENvbGxlY3Rpb24pIHtcblx0XHRcdHJldHVybiBuZXcgQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdG9wdGlvbnNJbnN0YW5jZSxcblx0XHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0dGhpcyxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdG9wdGlvbnNJbnN0YW5jZSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtbkV4cGFuc2lvbiB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uSW5mb0ZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbnMsIEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtbkluZm9GYWN0b3J5OiBDb2x1bW5JbmZvRmFjdG9yeSxcblx0KSB7XG5cblx0fVxuXG5cdGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogQ29sdW1uRXhwYW5zaW9uPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgQ29sdW1uRXhwYW5zaW9uKFxuXHRcdFx0dGhpcy5jb2x1bW5JbmZvRmFjdG9yeSxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uSW5mbyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uLCBSb290Q29sdW1uTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uSW5mb0ZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoKSB7fVxuXG5cdGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGFwaUNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdFx0cGFyZW50OiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4gfCBudWxsXG5cdCk6IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBDb2x1bW5JbmZvKGFwaUNvbHVtbiwgcGFyZW50KTtcblx0fVxuXG5cdGNvbnN0cnVjdEZyb21Sb290TWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cm9vdENvbHVtbk1hcDogUm9vdENvbHVtbk1hcCxcblx0XHRwYXJlbnQ6IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPiB8IG51bGwgPSBudWxsXG5cdCkge1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiByb290Q29sdW1uTWFwKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5NYXBFbnRyeSA9IHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdO1xuXHRcdFx0Y29uc3QgY29sdW1uSW5mbyA9IHRoaXMuY29uc3RydWN0PEl0ZW1UeXBlVHlwZT4oY29sdW1uTWFwRW50cnkuYXBpQ29sdW1uLCBwYXJlbnQpO1xuXHRcdFx0Y29uc3QgY2hpbGRDb2x1bW5zID0gdGhpcy5jb25zdHJ1Y3RGcm9tUm9vdE1hcDxJdGVtVHlwZVR5cGU+KGNvbHVtbk1hcEVudHJ5LmNoaWxkcmVuLCBjb2x1bW5JbmZvKTtcblxuXHRcdFx0aWYgKGNoaWxkQ29sdW1ucy5sZW5ndGggPiAwKVxuXHRcdFx0XHRjb2x1bW5JbmZvLnNldENoaWxkcmVuKGNvbHVtbkluZm8uYXBpQ29sdW1uLml0ZW1UeXBlLCBjaGlsZENvbHVtbnMpO1xuXG5cdFx0XHRyZXN1bHQucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5IYW5kbGVyLCBDb2x1bW5JbmZvLCBDb2x1bW5TZXQsIENvbHVtblV0aWwsIGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvbHVtbkluZm9GYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW4sXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRJdGVtVHlwZSxcblx0SXRlbVR5cGVNYXAsXG5cdFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFJvb3RDb2x1bW5NYXAsXG59IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtblNldEZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5IYW5kbGVyOiBDb2x1bW5IYW5kbGVyLFxuXHRcdHByaXZhdGUgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwcml2YXRlIGNvbHVtbkluZm9GYWN0b3J5OiBDb2x1bW5JbmZvRmFjdG9yeSxcblx0KSB7XG5cdH1cblxuXHRjb25zdHJ1Y3RTdHViPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBjb2x1bW5TZXQgPSBuZXcgQ29sdW1uU2V0KFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsLFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdCk7XG5cblx0XHRjb2x1bW5TZXQucmVxdWVzdCA9IHJlcXVlc3RDb2x1bW5zO1xuXHRcdGNvbHVtblNldC5yZXF1ZXN0Q29sdW1uc1RydWUgPSByZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZTtcblxuXHRcdHJldHVybiBjb2x1bW5TZXQ7XG5cdH1cblxuXHRwdWJsaWMgcmVzb2x2ZVN0dWI8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2x1bW5TZXQ6IENvbHVtblNldCxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbiA9IHRydWUsXG5cdFx0aW5jbHVkZUlkQ29sdW1uOiBib29sZWFuID0gdHJ1ZSxcblx0KTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBjb2x1bW5TZXQucmVxdWVzdENvbHVtbnNUcnVlID9cblx0XHRcdHRoaXMucHJvY2Vzc1Jlc3BvbnNlQ29sdW1ucyhcblx0XHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdGVuYWJsZUNhY2hpbmcsXG5cdFx0XHQpIDpcblx0XHRcdHRoaXMucHJvY2Vzc1JlcXVlc3RDb2x1bW5zKFxuXHRcdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdFx0aW5jbHVkZUlkQ29sdW1uLFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZz86IGJvb2xlYW4sXG5cdFx0aW5jbHVkZUlkQ29sdW1uPzogYm9vbGVhbixcblx0KTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLnJlc29sdmVTdHViKFxuXHRcdFx0dGhpcy5jb25zdHJ1Y3RTdHViKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdGluY2x1ZGVJZENvbHVtbixcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdEZyb21SZXNwb25zZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbiA9IHRydWUsXG5cdCk6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBjb2x1bW5TZXQgPSBuZXcgQ29sdW1uU2V0KFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsLFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdCk7XG5cblx0XHRjb2x1bW5TZXQucmVxdWVzdENvbHVtbnNUcnVlID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzUmVzcG9uc2VDb2x1bW5zIChcblx0XHRjb2x1bW5TZXQ6IENvbHVtblNldCxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbixcblx0KTogQ29sdW1uU2V0IHtcblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbHVtblNldC5pdGVtVHlwZTtcblx0XHRjb25zdCByb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwID0ge307XG5cdFx0Y29uc3QgcHJvY2Vzc2VkSXRlbVR5cGVNYXA6IEl0ZW1UeXBlTWFwPGJvb2xlYW4+ID0ge307XG5cblx0XHRjb2x1bW5TZXQucmVzcG9uc2UgPSByZXNwb25zZUNvbHVtbnM7XG5cblx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXBGcm9tUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRyb290Q29sdW1uTWFwLFxuXHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdHByb2Nlc3NlZEl0ZW1UeXBlTWFwLFxuXHRcdCk7XG5cblx0XHR0aGlzLnByb2Nlc3NDb2x1bW5JbmZvKFxuXHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0dGhpcy5jb2x1bW5JbmZvRmFjdG9yeS5jb25zdHJ1Y3RGcm9tUm9vdE1hcChyb290Q29sdW1uTWFwKSxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdCk7XG5cblx0XHRjb2x1bW5TZXQucmVxdWVzdCA9IHRoaXMuY29uc3RydWN0UmVxdWVzdENvbHVtbnNGcm9tUm9vdENvbHVtbk1hcChyb290Q29sdW1uTWFwKTtcblxuXHRcdHJldHVybiBjb2x1bW5TZXQ7XG5cdH1cblxuXHRwcml2YXRlIGNvbnN0cnVjdFJlcXVlc3RDb2x1bW5zRnJvbVJvb3RDb2x1bW5NYXAgKFxuXHRcdHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAsXG5cdCk6IEFwaVJlcXVlc3RDb2x1bW5bXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gcm9vdENvbHVtbk1hcCkge1xuXHRcdFx0Y29uc3QgZW50cnkgPSByb290Q29sdW1uTWFwW2NvbHVtbklkXTtcblxuXHRcdFx0aWYgKGhhc1Byb3BlcnRpZXMoZW50cnkuY2hpbGRyZW4pKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKHtcblx0XHRcdFx0XHRbY29sdW1uSWRdOiB0aGlzLmNvbnN0cnVjdFJlcXVlc3RDb2x1bW5zRnJvbVJvb3RDb2x1bW5NYXAoZW50cnkuY2hpbGRyZW4pLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGNvbHVtbklkKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBleHBhbmRSb290Q29sdW1uTWFwRnJvbVJlc3BvbnNlQ29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRyb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwLFxuXHRcdGVuYWJsZUNhY2hpbmc6IGJvb2xlYW4sXG5cdFx0cHJvY2Vzc2VkSXRlbVR5cGVNYXA6IEl0ZW1UeXBlTWFwPGJvb2xlYW4+LFxuXHQpIHtcblx0XHRpZiAocHJvY2Vzc2VkSXRlbVR5cGVNYXBbaXRlbVR5cGVdID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cHJvY2Vzc2VkSXRlbVR5cGVNYXBbaXRlbVR5cGVdID0gdHJ1ZTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gcmVzcG9uc2VDb2x1bW5zW2l0ZW1UeXBlXSkge1xuXHRcdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW4gPSByZXNwb25zZUNvbHVtbnNbaXRlbVR5cGVdW2NvbHVtbklkXTtcblxuXHRcdFx0aWYgKHJlc3BvbnNlQ29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChlbmFibGVDYWNoaW5nKSB7XG5cdFx0XHRcdHRoaXMuY29sdW1uSGFuZGxlci5zZXRDb2x1bW4oXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW4sXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyb290Q29sdW1uTWFwW2NvbHVtbklkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdID0ge1xuXHRcdFx0XHRcdGFwaUNvbHVtbjogcmVzcG9uc2VDb2x1bW4sXG5cdFx0XHRcdFx0Y2hpbGRyZW46IHt9LFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCF0aGlzLmNvbHVtblV0aWwuaXNJdGVtQ29sdW1uKFxuXHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1uLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gcmVzcG9uc2VDb2x1bW5zW3Jlc3BvbnNlQ29sdW1uLml0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjaGlsZHJlbiA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdHx8ICFoYXNQcm9wZXJ0aWVzKGNoaWxkcmVuKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXBGcm9tUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbi5pdGVtVHlwZSxcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRyb290Q29sdW1uTWFwW2NvbHVtbklkXS5jaGlsZHJlbixcblx0XHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdFx0cHJvY2Vzc2VkSXRlbVR5cGVNYXAsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8vIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHJlcXVlc3Rjb2x1bW5zIGRvZXMgKm5vdCogZXF1YWwgJ3RydWUnLCBhbmQgbWlnaHQgY29udGFpbiBkZXJpdmVkIGNvbHVtbnNcblx0cHJpdmF0ZSBwcm9jZXNzUmVxdWVzdENvbHVtbnMgKFxuXHRcdGNvbHVtblNldDogQ29sdW1uU2V0LFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRlbmFibGVDYWNoaW5nOiBib29sZWFuLFxuXHRcdGluY2x1ZGVJZENvbHVtbjogYm9vbGVhbixcblx0KTogQ29sdW1uU2V0IHtcblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbHVtblNldC5pdGVtVHlwZTtcblx0XHRjb25zdCByb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwID0ge307XG5cblx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXAoXG5cdFx0XHRjb2x1bW5TZXQucmVxdWVzdCBhcyBBcGlSZXF1ZXN0Q29sdW1uW10sIC8vIHdlIGNhbiBhc3N1bWUgcmVxdWVzdENvbHVtbnMgaXMgYW4gYXJyYXkgaGVyZVxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRyb290Q29sdW1uTWFwLFxuXHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHQpO1xuXG5cdFx0aWYgKGluY2x1ZGVJZENvbHVtbikge1xuXHRcdFx0dGhpcy5leHBhbmRSb290Q29sdW1uTWFwKFxuXHRcdFx0XHRbJ2lkJ10sXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdHJvb3RDb2x1bW5NYXAsXG5cdFx0XHRcdGVuYWJsZUNhY2hpbmcsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbHVtblNldC5yZXNwb25zZSA9IHt9O1xuXG5cdFx0dGhpcy5wcm9jZXNzQ29sdW1uSW5mbyhcblx0XHRcdGNvbHVtblNldCxcblx0XHRcdHRoaXMuY29sdW1uSW5mb0ZhY3RvcnkuY29uc3RydWN0RnJvbVJvb3RNYXAocm9vdENvbHVtbk1hcCksXG5cdFx0XHRpdGVtVHlwZSxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGNvbHVtblNldDtcblx0fVxuXG5cdHByaXZhdGUgcHJvY2Vzc0NvbHVtbkluZm8gKFxuXHRcdGNvbHVtblNldDogQ29sdW1uU2V0LFxuXHRcdGNvbHVtbkluZm9PYmplY3RzOiBDb2x1bW5JbmZvW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCByZXNwb25zZSA9IGNvbHVtblNldC5yZXNwb25zZTtcblxuXHRcdGlmIChyZXNwb25zZVtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVzcG9uc2VbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JbmZvIG9mIGNvbHVtbkluZm9PYmplY3RzKSB7XG5cdFx0XHRyZXNwb25zZVtpdGVtVHlwZV1bY29sdW1uSW5mby5pZF0gPSBjb2x1bW5JbmZvLmFwaUNvbHVtbjtcblx0XHRcdGNvbHVtblNldC5ncm91cENvbHVtbkluZm8oY29sdW1uSW5mbyk7XG5cblx0XHRcdGlmICghY29sdW1uSW5mby5pc0xlYWYpIHtcblx0XHRcdFx0dGhpcy5wcm9jZXNzQ29sdW1uSW5mbyhcblx0XHRcdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHRcdFx0Y29sdW1uSW5mby5jaGlsZHJlbixcblx0XHRcdFx0XHRjb2x1bW5JbmZvLml0ZW1UeXBlLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZXhwYW5kUm9vdENvbHVtbk1hcCAoXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbixcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCByZXF1ZXN0Q29sdW1uIG9mIHJlcXVlc3RDb2x1bW5zKSB7XG5cdFx0XHRjb25zdCB7aWQ6IGNvbHVtbklkLCBjaGlsZHJlbn0gPSB0aGlzLmNvbHVtblV0aWwucGFyc2VSZXF1ZXN0Q29sdW1uKHJlcXVlc3RDb2x1bW4pO1xuXG5cdFx0XHRsZXQgcmVzcG9uc2VDb2x1bW47XG5cblx0XHRcdGlmIChyZXNwb25zZUNvbHVtbnNbaXRlbVR5cGVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW4gPSByZXNwb25zZUNvbHVtbnNbaXRlbVR5cGVdW2NvbHVtbklkXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJlc3BvbnNlQ29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHRcdCdObyBhcGkgY29sdW1uIGZvciByZXF1ZXN0IGNvbHVtbicsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0J2ZvciBpdGVtVHlwZScsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChlbmFibGVDYWNoaW5nKSB7XG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uID0gdGhpcy5jb2x1bW5IYW5kbGVyLnNldENvbHVtbihcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbixcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cm9vdENvbHVtbk1hcFtjb2x1bW5JZF0gPSB7XG5cdFx0XHRcdFx0YXBpQ29sdW1uOiByZXNwb25zZUNvbHVtbixcblx0XHRcdFx0XHRjaGlsZHJlbjoge30sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZXhwYW5kUm9vdENvbHVtbk1hcChcblx0XHRcdFx0Y2hpbGRyZW4sXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdLmNoaWxkcmVuLFxuXHRcdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtblN1YnNldENhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoKSB7fVxuXG5cdGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyk6IENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPihyZXF1ZXN0Q29sdW1ucyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciwgQ3JlYXRlQ29tcGlsYXRpb24sIENyZWF0ZVJlcXVlc3QsIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZXF1ZXN0RmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHQpIHtcblxuXHR9XG5cblx0Y29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29tcGlsYXRpb246IENyZWF0ZUNvbXBpbGF0aW9uLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGJyZWFrdXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdCk6IENyZWF0ZVJlcXVlc3Q8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBDcmVhdGVSZXF1ZXN0KFxuXHRcdFx0dGhpcy5hcGlGb3JtYXR0ZXIsXG5cdFx0XHR0aGlzLmtleVNlcnZpY2UsXG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y29tcGlsYXRpb24sXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdGJyZWFrdXBCeVBhcmVudCxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL0Fic3RyYWN0Q2FjaGUnO1xuaW1wb3J0IHsgUXVlcnlNYXRjaGVyRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5cbmV4cG9ydCBjbGFzcyBJdGVtQ2FjaGVGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3QgKFxuXHRcdHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpOiBJdGVtQ2FjaGUge1xuXHRcdHJldHVybiBuZXcgSXRlbUNhY2hlKFxuXHRcdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblx0fVxuXHRcbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciwgQ29sdW1uU2V0LCBJdGVtRW50cnlTZXJ2aWNlLCBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5TZXRGYWN0b3J5LCBJdGVtUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEF1dGhJbnRlcmZhY2UsIEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIEl0ZW1FbnRyeUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgYXV0aEludGVyZmFjZTogQXV0aEludGVyZmFjZSxcblx0XHRwdWJsaWMgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHVibGljIGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHVibGljIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0cHVibGljIGl0ZW1SZXNvdXJjZUZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0cHVibGljIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHVibGljIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0Y29sdW1uSW5mbzogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IEl0ZW1FbnRyeShcblx0XHRcdHRoaXMsXG5cdFx0XHRjb2x1bW5JbmZvLml0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdFx0Y29sdW1uSW5mbyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIENvbHVtblV0aWwsIExvY2tTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExpbmtUcmVlU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcbmltcG9ydCB7XG5cdEVkaXRSZXNvdXJjZSxcblx0SXRlbUVudHJ5LFxuXHRJdGVtUmVzb3VyY2UsXG5cdEl0ZW1SZXNvdXJjZU9wdGlvbnMsXG5cdExvY2FsVmlld1Jlc291cmNlLFxuXHRSZW1vdGVWaWV3UmVzb3VyY2UsXG59IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtT3B0aW9uc0ludGVyZmFjZSwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFJlc291cmNlQ29uc3RydWN0b3I8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUsIFQgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4gPSAoaXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPikgPT4gVDtcblxuZXhwb3J0IGNsYXNzIEl0ZW1SZXNvdXJjZUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIGxvY2tTZXJ2aWNlOiBMb2NrU2VydmljZSxcblx0XHRwdWJsaWMgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHVibGljIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcjogRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0XHRwdWJsaWMgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwdWJsaWMgbGlua1RyZWVTZXJ2aWNlOiBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGdldENvbnN0cnVjdG9yPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IFJlc291cmNlQ29uc3RydWN0b3I8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldENvbnN0cnVjdG9yPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7cmVtb3RlOiB0cnVlfSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogUmVzb3VyY2VDb25zdHJ1Y3RvcjxJdGVtVHlwZVR5cGUsIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0Q29uc3RydWN0b3I8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogUmVzb3VyY2VDb25zdHJ1Y3RvcjxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXRDb25zdHJ1Y3RvcjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBSZXNvdXJjZUNvbnN0cnVjdG9yPEl0ZW1UeXBlVHlwZSwgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBvcHRpb25zSW5zdGFuY2UgPSBuZXcgSXRlbVJlc291cmNlT3B0aW9ucyhvcHRpb25zKTtcblxuXHRcdHJldHVybiAoXG5cdFx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdCkgPT4ge1xuXHRcdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0V2l0aE9wdGlvbnM8SXRlbVR5cGVUeXBlPihcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRvcHRpb25zSW5zdGFuY2UsXG5cdFx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0KTtcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0aXNOZXc/OiBib29sZWFuLFxuXHQpOiBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPjtcblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtyZW1vdGU6IHRydWV9LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGlzTmV3PzogYm9vbGVhbixcblx0KTogTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPjtcblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRpc05ldz86IGJvb2xlYW4sXG5cdCk6IFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGlzTmV3PzogYm9vbGVhbixcblx0KTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdFdpdGhPcHRpb25zKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0bmV3IEl0ZW1SZXNvdXJjZU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdGlzTmV3LFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGNvbnN0cnVjdFdpdGhPcHRpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtUmVzb3VyY2VPcHRpb25zLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGlzTmV3OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+IHtcblx0XHRpZiAob3B0aW9ucy5lZGl0KSB7XG5cdFx0XHRyZXR1cm4gbmV3IEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdGlzTmV3LFxuXHRcdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMucmVtb3RlKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdGlzTmV3LFxuXHRcdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRpc05ldyxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7XG5cdEFwaUZvcm1hdHRlcixcblx0QXBpUmVxdWVzdFNlcnZpY2UsXG5cdENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdENvbHVtbkNhY2hlLFxuXHRDb2x1bW5IYW5kbGVyLFxuXHRDb2x1bW5VdGlsLFxuXHRJdGVtRW50cnlTZXJ2aWNlLFxuXHRLZXlTZXJ2aWNlLFxuXHRMb2NrU2VydmljZSxcblx0UXVlcnlTZXJ2aWNlLFxufSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS9zZXJ2ZXIvU2VydmVyQ2FjaGUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4uL2NsYXNzZXMvUmVxdWVzdEJ1ZmZlck1hbmFnZXInO1xuaW1wb3J0IHsgVGVtcGxhdGVDYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvVGVtcGxhdGVDYWNoZSc7XG5pbXBvcnQgeyBSbUNvcmUgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0Q29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Q29sdW1uU2V0RmFjdG9yeSxcblx0Q29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRJdGVtQ2FjaGVGYWN0b3J5LFxuXHRJdGVtRW50cnlGYWN0b3J5LFxuXHRJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRRdWVyeVBhcnNlckZhY3RvcnksXG5cdFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxufSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHtcblx0QXV0aEludGVyZmFjZSxcblx0RXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRQcm9taXNlTGlicmFyeUludGVyZmFjZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0xpbmtUcmVlU2VydmljZUludGVyZmFjZSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5IH0gZnJvbSAnLi9DaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkNhY2hlRmFjdG9yeSB7XG5cblx0cHJpdmF0ZSByZWFkb25seSBzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGU7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29yZTogUm1Db3JlLFxuXHRcdHByaXZhdGUgY29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlLFxuXHRcdHByaXZhdGUgcmVxdWVzdEJ1ZmZlck1hbmFnZXI6IFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcml2YXRlIGF1dGhJbnRlcmZhY2U6IEF1dGhJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzRGVsdGFGYWN0b3J5OiBDaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdHByaXZhdGUgY2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnk6IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5LFxuXHRcdHByaXZhdGUgbG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlLFxuXHRcdHByaXZhdGUgbW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTogTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25SZXNvdXJjZUZhY3Rvcnk6IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHByaXZhdGUgdGVtcGxhdGVDYWNoZTogVGVtcGxhdGVDYWNoZSxcblx0XHRwcml2YXRlIGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uSGFuZGxlcjogQ29sdW1uSGFuZGxlcixcblx0XHRwcml2YXRlIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJpdmF0ZSBpdGVtRW50cnlGYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdHByaXZhdGUgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uRW50cnlGYWN0b3J5OiBDb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeTogQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgcXVlcnlQYXJzZXJGYWN0b3J5OiBRdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0cHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0XHRwcml2YXRlIGxpbmtUcmVlU2VydmljZTogTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlLFxuXHQpIHtcblx0XHR0aGlzLnNlcnZlckNhY2hlID0gbmV3IFNlcnZlckNhY2hlKFxuXHRcdFx0dGhpcy5jaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSxcblx0XHRcdHRoaXMuY29yZSxcblx0XHRcdHRoaXMuY29sdW1uQ2FjaGUsXG5cdFx0XHR0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdHRoaXMuYXV0aEludGVyZmFjZSxcblx0XHRcdHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdHRoaXMubG9ja1NlcnZpY2UsXG5cdFx0XHR0aGlzLm1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0aGlzLml0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0aGlzLnRlbXBsYXRlQ2FjaGUsXG5cdFx0XHR0aGlzLml0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHR0aGlzLmVycm9ySGFuZGxlcixcblx0XHRcdHRoaXMuZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdHRoaXMucHJvbWlzZVNlcnZpY2UsXG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlcixcblx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHR0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbHVtbkhhbmRsZXIsXG5cdFx0XHR0aGlzLmNvbHVtblNldEZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uVXRpbCxcblx0XHRcdHRoaXMuaXRlbUVudHJ5RmFjdG9yeSxcblx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZSxcblx0XHRcdHRoaXMua2V5U2VydmljZSxcblx0XHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5RmFjdG9yeSxcblx0XHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdHRoaXMuY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dGhpcy5xdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0XHR0aGlzLnF1ZXJ5U2VydmljZSxcblx0XHRcdHRoaXMubGlua1RyZWVTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogVG9kb1tjYWNoZV0gU3RvcmUgYSBtYXAgb2YgYWxsIHRyYW5zYWN0aW9ucyBieSB0cmFuc2FjdGlvbiBpZCA/XG5cdCAqL1xuXHRwdWJsaWMgZ2V0QnlJZCAoaWQ6IHN0cmluZyk6IFRyYW5zYWN0aW9uQ2FjaGUgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGZpbmRDaGlsZCA9IChjaGlsZHJlbjogVHJhbnNhY3Rpb25DYWNoZVtdKSA9PiB7XG5cdFx0XHRmb3IgKGNvbnN0IHRyYW5zYWN0aW9uIG9mIGNoaWxkcmVuKSB7XG5cdFx0XHRcdGlmICh0cmFuc2FjdGlvbi5pZCA9PT0gaWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJhbnNhY3Rpb247XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBjaGlsZFJlc3VsdCA9IGZpbmRDaGlsZCh0cmFuc2FjdGlvbi5jaGlsZHJlbik7XG5cblx0XHRcdFx0aWYgKGNoaWxkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gY2hpbGRSZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9O1xuXG5cdFx0cmV0dXJuIGZpbmRDaGlsZCh0aGlzLnNlcnZlckNhY2hlLmNoaWxkcmVuKTtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3QgKGlkPzogc3RyaW5nKTogVHJhbnNhY3Rpb25DYWNoZSB7XG5cdFx0cmV0dXJuIHRoaXMuc2VydmVyQ2FjaGUuY3JlYXRlQ2hpbGQoaWQpO1xuXHR9XG5cblx0LypAaW50ZXJuYWwqL1xuXHRwdWJsaWMgZ2V0U2VydmVyQ2FjaGUgKCk6IFNlcnZlckNhY2hlIHtcblx0XHRyZXR1cm4gdGhpcy5zZXJ2ZXJDYWNoZTtcblx0fVxufVxuIiwiaW1wb3J0IHsgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZXhwb3J0IGNsYXNzIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbiB7XG5cdFx0cmV0dXJuIG5ldyBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb24odHJhbnNhY3Rpb24pO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIFF1ZXJ5TWF0Y2hlciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnROdWxsLCBGaWVsZE1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeU1hdGNoZXJGYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXJcblx0KSB7XG5cblx0fVxuXG5cdGNvbnN0cnVjdCAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBmaWVsZHM6IEZpZWxkTWFwLCBwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCk6IFF1ZXJ5TWF0Y2hlciB7XG5cdFx0cmV0dXJuIG5ldyBRdWVyeU1hdGNoZXIoXG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlcixcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0ZmllbGRzLFxuXHRcdFx0cGFyZW50XG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgUXVlcnlQYXJzZXIgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVF1ZXJ5IH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlQYXJzZXJGYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKCkge1xuXHR9XG5cblx0Y29uc3RydWN0IChxdWVyeTogQXBpUXVlcnksIHBhcmFtZXRlcnM/OiBhbnkpOiBRdWVyeVBhcnNlciB7XG5cdFx0cmV0dXJuIG5ldyBRdWVyeVBhcnNlcihxdWVyeSwgcGFyYW1ldGVycyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtblV0aWwsIFJlcXVlc3RDb2x1bW5FeHBhbnNpb24gfSBmcm9tICcuLi9jbGFzc2VzJztcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uVXRpbDogQ29sdW1uVXRpbFxuXHQpIHtcblx0fVxuXG5cdGNvbnN0cnVjdCAoKTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbiB7XG5cdFx0cmV0dXJuIG5ldyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uKFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uU2V0RmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1uTWFwLCBBcGlSZXNwb25zZSwgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHVibGljIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHVibGljIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdCkge1xuXHR9XG5cblx0Y29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRyZXNwb25zZTogQXBpUmVzcG9uc2UsXG5cdFx0YWRkaXRpb25hbFJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwLFxuXHRcdGFkZGl0aW9uYWxSZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IFRlbXBsYXRlPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgVGVtcGxhdGU8SXRlbVR5cGVUeXBlPihcblx0XHRcdHRoaXMsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlc3BvbnNlLFxuXHRcdFx0YWRkaXRpb25hbFJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0YWRkaXRpb25hbFJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi9jbGFzc2VzL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBJbnRlcm5hbENoYW5nZXNEZWx0YSB9IGZyb20gJy4uL2NsYXNzZXMvSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlc0RlbHRhRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0KSB7XG5cblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3QgKCk6IENoYW5nZXNEZWx0YSB7XG5cdFx0cmV0dXJuIG5ldyBDaGFuZ2VzRGVsdGEoXG5cdFx0XHR0aGlzLml0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0KTtcblx0fVxuXG5cdC8qQGludGVybmFsKi9cblx0cHVibGljIGNvbnN0cnVjdEludGVybmFsRGVsdGEgKCk6IEludGVybmFsQ2hhbmdlc0RlbHRhIHtcblx0XHRyZXR1cm4gbmV3IEludGVybmFsQ2hhbmdlc0RlbHRhKFxuXHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxufVxuIiwiaW1wb3J0IHtcblx0QXBpUmVxdWVzdFNlcnZpY2UsXG5cdENoYW5nZXNQcm9jZXNzb3IsXG5cdENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdEl0ZW1FbnRyeVNlcnZpY2UsXG5cdE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcbn0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkgfSBmcm9tICcuL0NoYW5nZXNDb21waWxhdGlvbkZhY3RvcnknO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4vQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQgeyBDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi9Db2x1bW5FeHBhbnNpb25GYWN0b3J5JztcbmltcG9ydCB7IENyZWF0ZVJlcXVlc3RGYWN0b3J5IH0gZnJvbSAnLi9DcmVhdGVSZXF1ZXN0RmFjdG9yeSc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4vUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnknO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uRXhwYW5zaW9uRmFjdG9yeTogQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNyZWF0ZVJlcXVlc3RGYWN0b3J5OiBDcmVhdGVSZXF1ZXN0RmFjdG9yeSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdCkge1xuXG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0IChcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRicmVha1VwQnlQYXJlbnQ/OiBib29sZWFuLFxuXHRcdG9uQWZ0ZXJDcmVhdGVDYWxsYmFjaz86IE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0KTogQ2hhbmdlc1Byb2Nlc3NvciB7XG5cdFx0cmV0dXJuIG5ldyBDaGFuZ2VzUHJvY2Vzc29yKFxuXHRcdFx0dGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHRoaXMuY2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuY3JlYXRlUmVxdWVzdEZhY3RvcnksXG5cdFx0XHR0aGlzLmVycm9ySGFuZGxlcixcblx0XHRcdHRoaXMucHJvbWlzZVNlcnZpY2UsXG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHRicmVha1VwQnlQYXJlbnQsXG5cdFx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0KTtcblx0fVxufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9BcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25FbnRyeUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uTWF0Y2hlckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtbkluZm9GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uU2V0RmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtblN1YnNldENhY2hlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NyZWF0ZVJlcXVlc3RGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vSXRlbUNhY2hlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1FbnRyeUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtUmVzb3VyY2VGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vUXVlcnlNYXRjaGVyRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5UGFyc2VyRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL1JlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vVGVtcGxhdGVGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNQcm9jZXNzb3JGYWN0b3J5JztcbiIsImltcG9ydCB7XG5cdEFwaUZvcm1hdHRlcixcblx0QXBpUmVxdWVzdFNlcnZpY2UsXG5cdENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UsXG5cdENvbHVtbkNhY2hlLFxuXHRDb2x1bW5IYW5kbGVyLFxuXHRDb2x1bW5VdGlsLFxuXHRJdGVtRW50cnlTZXJ2aWNlLFxuXHRLZXlTZXJ2aWNlLFxuXHRMb2NrU2VydmljZSxcblx0UXVlcnlTZXJ2aWNlLFxuXHRTb2NrZXRNZXNzYWdlSGFuZGxlcixcbn0gZnJvbSAnLi9jbGFzc2VzJztcbmltcG9ydCB7IFJlcXVlc3RCdWZmZXJNYW5hZ2VyIH0gZnJvbSAnLi9jbGFzc2VzL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcbmltcG9ydCB7IFRlbXBsYXRlQ2FjaGUgfSBmcm9tICcuL2NsYXNzZXMvVGVtcGxhdGVDYWNoZSc7XG5pbXBvcnQge1xuXHRBcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnksXG5cdENoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0Q29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Q29sdW1uSW5mb0ZhY3RvcnksXG5cdENvbHVtblNldEZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0Q3JlYXRlUmVxdWVzdEZhY3RvcnksXG5cdEl0ZW1DYWNoZUZhY3RvcnksXG5cdEl0ZW1FbnRyeUZhY3RvcnksXG5cdEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFRlbXBsYXRlRmFjdG9yeSxcblx0VHJhbnNhY3Rpb25DYWNoZUZhY3RvcnksXG59IGZyb20gJy4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuL2ZhY3Rvcmllcy9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5IH0gZnJvbSAnLi9mYWN0b3JpZXMvQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnknO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdFNlcnZpY2VJbnRlcmZhY2UsXG5cdEF1dGhJbnRlcmZhY2UsXG5cdEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0RXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0UHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIFJtQ29yZSB7XG5cdHZlcnNpb246IHN0cmluZyA9ICcyLjAuMTMnO1xuXHRub29wID0gbm9vcDtcblxuXHRhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcjtcblx0YXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlO1xuXHRhcGlSZXNwb25zZVByb2Nlc3NvckZhY3Rvcnk6IEFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeTtcblx0Y2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTogQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTtcblx0Y2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnk6IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5O1xuXHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5O1xuXHRjb2xsZWN0aW9uRW50cnlGYWN0b3J5OiBDb2xsZWN0aW9uRW50cnlGYWN0b3J5O1xuXHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlO1xuXHRjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeTtcblx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeTogQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeTtcblx0Y29sbGVjdGlvblJlc291cmNlU2VydmljZTogQ29sbGVjdGlvblJlc291cmNlU2VydmljZTtcblx0Y29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlO1xuXHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5O1xuXHRjb2x1bW5IYW5kbGVyOiBDb2x1bW5IYW5kbGVyO1xuXHRjb2x1bW5JbmZvRmFjdG9yeTogQ29sdW1uSW5mb0ZhY3Rvcnk7XG5cdGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3Rvcnk7XG5cdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeTogQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5O1xuXHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsO1xuXHRjcmVhdGVSZXF1ZXN0RmFjdG9yeTogQ3JlYXRlUmVxdWVzdEZhY3Rvcnk7XG5cdGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3Rvcnk7XG5cdGl0ZW1FbnRyeUZhY3Rvcnk6IEl0ZW1FbnRyeUZhY3Rvcnk7XG5cdGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2U7XG5cdGl0ZW1SZXNvdXJjZUZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3Rvcnk7XG5cdGtleVNlcnZpY2U6IEtleVNlcnZpY2U7XG5cdHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5OiBUcmFuc2FjdGlvbkNhY2hlRmFjdG9yeTtcblx0bG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlO1xuXHRtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5O1xuXHRxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5O1xuXHRxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeTtcblx0cXVlcnlTZXJ2aWNlOiBRdWVyeVNlcnZpY2U7XG5cdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTtcblx0c29ja2V0TWVzc2FnZUhhbmRsZXI6IFNvY2tldE1lc3NhZ2VIYW5kbGVyO1xuXHR0ZW1wbGF0ZUZhY3Rvcnk6IFRlbXBsYXRlRmFjdG9yeTtcblx0Y2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeTtcblx0dGVtcGxhdGVDYWNoZTogVGVtcGxhdGVDYWNoZTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0X2FwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZUludGVyZmFjZSxcblx0XHRhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJvbWlzZUxpYnJhcnk6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGxpbmtUcmVlU2VydmljZTogTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlLFxuXHQpIHtcblx0XHQvLyBDcmVhdGUgdmFyaWFibGVzIGZvciBlYWNoIHNlcnZpY2UgaW4gb3JkZXIgdG8gZ2V0IGEgVHlwZVNjcmlwdCBlcnJvciB3aGVuIGEgZGVwZW5kZW5jeSBoYXNuJ3QgYmVlblxuXHRcdC8vIGluaXRpYWxpemVkIHlldC5cblx0XHRjb25zdCBrZXlTZXJ2aWNlID0gbmV3IEtleVNlcnZpY2UoKTtcblxuXHRcdGNvbnN0IGl0ZW1FbnRyeVNlcnZpY2UgPSBuZXcgSXRlbUVudHJ5U2VydmljZShcblx0XHRcdGF1dGhJbnRlcmZhY2UsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0bGlua1RyZWVTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjaGFuZ2VzRGVsdGFGYWN0b3J5ID0gbmV3IENoYW5nZXNEZWx0YUZhY3RvcnkoXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBhcGlGb3JtYXR0ZXIgPSBuZXcgQXBpRm9ybWF0dGVyKCk7XG5cblx0XHRjb25zdCBhcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkgPSBuZXcgQXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5KGFwaUZvcm1hdHRlcik7XG5cdFx0Y29uc3QgYXBpUmVxdWVzdFNlcnZpY2UgPSBuZXcgQXBpUmVxdWVzdFNlcnZpY2UoXG5cdFx0XHRfYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRhcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnksXG5cdFx0KTtcblxuXHRcdGNvbnN0IHF1ZXJ5TWF0Y2hlckZhY3RvcnkgPSBuZXcgUXVlcnlNYXRjaGVyRmFjdG9yeShhcGlGb3JtYXR0ZXIpO1xuXHRcdGNvbnN0IHF1ZXJ5UGFyc2VyRmFjdG9yeSA9IG5ldyBRdWVyeVBhcnNlckZhY3RvcnkoKTtcblx0XHRjb25zdCBxdWVyeVNlcnZpY2UgPSBuZXcgUXVlcnlTZXJ2aWNlKCk7XG5cblx0XHRjb25zdCBjb2x1bW5VdGlsID0gbmV3IENvbHVtblV0aWwoXG5cdFx0XHRsaW5rVHJlZVNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbHVtbkNhY2hlID0gbmV3IENvbHVtbkNhY2hlKGNvbHVtblV0aWwpO1xuXHRcdGNvbnN0IGNvbHVtbkhhbmRsZXIgPSBuZXcgQ29sdW1uSGFuZGxlcihcblx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRjb2x1bW5DYWNoZSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0KTtcblx0XHRjb25zdCBjb2x1bW5JbmZvRmFjdG9yeSA9IG5ldyBDb2x1bW5JbmZvRmFjdG9yeSgpO1xuXHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbkZhY3RvcnkgPSBuZXcgQ29sdW1uRXhwYW5zaW9uRmFjdG9yeShjb2x1bW5JbmZvRmFjdG9yeSk7XG5cblx0XHRjb25zdCBjb2x1bW5TZXRGYWN0b3J5ID0gbmV3IENvbHVtblNldEZhY3RvcnkoXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdGNvbHVtbkluZm9GYWN0b3J5LFxuXHRcdCk7XG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5ID0gbmV3IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSgpO1xuXG5cdFx0Y29uc3QgbG9ja1NlcnZpY2UgPSBuZXcgTG9ja1NlcnZpY2UoXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHQpO1xuXHRcdGNvbnN0IHRlbXBsYXRlRmFjdG9yeSA9IG5ldyBUZW1wbGF0ZUZhY3RvcnkoXG5cdFx0XHRjb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHQpO1xuXHRcdGNvbnN0IGl0ZW1DYWNoZUZhY3RvcnkgPSBuZXcgSXRlbUNhY2hlRmFjdG9yeShxdWVyeU1hdGNoZXJGYWN0b3J5KTtcblx0XHRjb25zdCBpdGVtUmVzb3VyY2VGYWN0b3J5ID0gbmV3IEl0ZW1SZXNvdXJjZUZhY3RvcnkoXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRsb2NrU2VydmljZSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0ZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRsaW5rVHJlZVNlcnZpY2UsXG5cdFx0KTtcblx0XHRjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5ID0gbmV3IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0aXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHRcdGNoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0KTtcblx0XHRjb25zdCBpdGVtRW50cnlGYWN0b3J5ID0gbmV3IEl0ZW1FbnRyeUZhY3RvcnkoXG5cdFx0XHRhdXRoSW50ZXJmYWNlLFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGV4Y2VwdGlvbkhhbmRsZXIsXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0aXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5U2VydmljZSA9IG5ldyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlKFxuXHRcdFx0cXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdFx0cXVlcnlTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlID0gbmV3IENvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UoKTtcblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeUZhY3RvcnkgPSBuZXcgQ29sbGVjdGlvbkVudHJ5RmFjdG9yeShcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRjb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkNhY2hlRmFjdG9yeSA9IG5ldyBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5KFxuXHRcdFx0cXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5ID0gbmV3IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeShxdWVyeU1hdGNoZXJGYWN0b3J5KTtcblxuXHRcdGNvbnN0IHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5ID0gbmV3IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5KGNvbHVtblV0aWwpO1xuXG5cdFx0Y29uc3QgY3JlYXRlUmVxdWVzdEZhY3RvcnkgPSBuZXcgQ3JlYXRlUmVxdWVzdEZhY3RvcnkoXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkgPSBuZXcgQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSgpO1xuXG5cdFx0Y29uc3QgY2hhbmdlc1Byb2Nlc3NvckZhY3RvcnkgPSBuZXcgQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnkoXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0YXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0Y29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNyZWF0ZVJlcXVlc3RGYWN0b3J5LFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5ID0gbmV3IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkoKTtcblxuXHRcdGNvbnN0IHJlcXVlc3RCdWZmZXJNYW5hZ2VyID0gbmV3IFJlcXVlc3RCdWZmZXJNYW5hZ2VyKFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHQpO1xuXG5cdFx0Y29uc3QgdGVtcGxhdGVDYWNoZSA9IG5ldyBUZW1wbGF0ZUNhY2hlKFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0dGVtcGxhdGVGYWN0b3J5LFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0KTtcblxuXHRcdGNvbnN0IHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5KFxuXHRcdFx0dGhpcyxcblx0XHRcdGNvbHVtbkNhY2hlLFxuXHRcdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHRhdXRoSW50ZXJmYWNlLFxuXHRcdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdGNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5LFxuXHRcdFx0bG9ja1NlcnZpY2UsXG5cdFx0XHRtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRcdGl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0ZW1wbGF0ZUNhY2hlLFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRpdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5U2VydmljZSxcblx0XHRcdGxpbmtUcmVlU2VydmljZSxcblx0XHQpO1xuXG5cdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXIuc2V0U2VydmVyQ2FjaGUoXG5cdFx0XHR0cmFuc2FjdGlvbkNhY2hlRmFjdG9yeS5nZXRTZXJ2ZXJDYWNoZSgpLFxuXHRcdCk7XG5cblx0XHRjb25zdCBzb2NrZXRNZXNzYWdlSGFuZGxlciA9IG5ldyBTb2NrZXRNZXNzYWdlSGFuZGxlcihcblx0XHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHR0aGlzLmFwaUZvcm1hdHRlciA9IGFwaUZvcm1hdHRlcjtcblx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlID0gYXBpUmVxdWVzdFNlcnZpY2U7XG5cdFx0dGhpcy5hcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkgPSBhcGlSZXNwb25zZVByb2Nlc3NvckZhY3Rvcnk7XG5cdFx0dGhpcy5jaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5ID0gY2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTtcblx0XHR0aGlzLmNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5ID0gY2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uQ2FjaGVGYWN0b3J5ID0gY29sbGVjdGlvbkNhY2hlRmFjdG9yeTtcblx0XHR0aGlzLmNvbGxlY3Rpb25FbnRyeUZhY3RvcnkgPSBjb2xsZWN0aW9uRW50cnlGYWN0b3J5O1xuXHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZSA9IGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U7XG5cdFx0dGhpcy5jb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnkgPSBjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5ID0gY29sbGVjdGlvblJlc291cmNlRmFjdG9yeTtcblx0XHR0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UgPSBjb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlO1xuXHRcdHRoaXMuY29sdW1uQ2FjaGUgPSBjb2x1bW5DYWNoZTtcblx0XHR0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkgPSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5O1xuXHRcdHRoaXMuY29sdW1uSGFuZGxlciA9IGNvbHVtbkhhbmRsZXI7XG5cdFx0dGhpcy5jb2x1bW5JbmZvRmFjdG9yeSA9IGNvbHVtbkluZm9GYWN0b3J5O1xuXHRcdHRoaXMuY29sdW1uU2V0RmFjdG9yeSA9IGNvbHVtblNldEZhY3Rvcnk7XG5cdFx0dGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkgPSBjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk7XG5cdFx0dGhpcy5jb2x1bW5VdGlsID0gY29sdW1uVXRpbDtcblx0XHR0aGlzLmNyZWF0ZVJlcXVlc3RGYWN0b3J5ID0gY3JlYXRlUmVxdWVzdEZhY3Rvcnk7XG5cdFx0dGhpcy5pdGVtQ2FjaGVGYWN0b3J5ID0gaXRlbUNhY2hlRmFjdG9yeTtcblx0XHR0aGlzLml0ZW1FbnRyeUZhY3RvcnkgPSBpdGVtRW50cnlGYWN0b3J5O1xuXHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZSA9IGl0ZW1FbnRyeVNlcnZpY2U7XG5cdFx0dGhpcy5pdGVtUmVzb3VyY2VGYWN0b3J5ID0gaXRlbVJlc291cmNlRmFjdG9yeTtcblx0XHR0aGlzLmtleVNlcnZpY2UgPSBrZXlTZXJ2aWNlO1xuXHRcdHRoaXMudHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkgPSB0cmFuc2FjdGlvbkNhY2hlRmFjdG9yeTtcblx0XHR0aGlzLmxvY2tTZXJ2aWNlID0gbG9ja1NlcnZpY2U7XG5cdFx0dGhpcy5tb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5ID0gbW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTtcblx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnkgPSBxdWVyeU1hdGNoZXJGYWN0b3J5O1xuXHRcdHRoaXMucXVlcnlQYXJzZXJGYWN0b3J5ID0gcXVlcnlQYXJzZXJGYWN0b3J5O1xuXHRcdHRoaXMucXVlcnlTZXJ2aWNlID0gcXVlcnlTZXJ2aWNlO1xuXHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgPSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTtcblx0XHR0aGlzLnNvY2tldE1lc3NhZ2VIYW5kbGVyID0gc29ja2V0TWVzc2FnZUhhbmRsZXI7XG5cdFx0dGhpcy50ZW1wbGF0ZUZhY3RvcnkgPSB0ZW1wbGF0ZUZhY3Rvcnk7XG5cdFx0dGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5ID0gY2hhbmdlc0RlbHRhRmFjdG9yeTtcblx0XHR0aGlzLnRlbXBsYXRlQ2FjaGUgPSB0ZW1wbGF0ZUNhY2hlO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub29wICgpIHtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5ICh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWU7XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL2NvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vY2xhc3Nlcyc7XG5leHBvcnQgKiBmcm9tICcuL2ZhY3Rvcmllcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdLCJzb3VyY2VSb290IjoiIn0=
|
|
9776
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SbUNvcmUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1JtQ29yZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9SbUNvcmUvZXh0ZXJuYWwgXCJtb21lbnRcIiIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9VdGlsLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0FwaUZvcm1hdHRlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9BcGlSZXF1ZXN0U2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9BcGlSZXNwb25zZVByb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9DaGFuZ2VzQ29tcGlsYXRpb24udHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ2hhbmdlc1Byb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL0l0ZW1FbnRyeU9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9JdGVtUmVzb3VyY2VPcHRpb25zLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvSXRlbUVudHJ5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvSXRlbVJlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvVmlld1Jlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvRWRpdFJlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvQ29sbGVjdGlvbkVudHJ5T3B0aW9ucy50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL0NvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9Db2xsZWN0aW9uRW50cnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9Db2xsZWN0aW9uUmVzb3VyY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9Db2xsZWN0aW9uVmlld1Jlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvQ29sbGVjdGlvbkVkaXRSZXNvdXJjZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL1RlbXBsYXRlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvUmVtb3RlVmlld1Jlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvTG9jYWxWaWV3UmVzb3VyY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9pbmRleC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvdHlwZXMvSXRlbVR5cGVzQ29sbGVjdGlvbi50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvdHlwZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvSXRlbUhhbmRsZXJCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uSXRlbUhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvQWJzdHJhY3RDYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2xsZWN0aW9uTWF0Y2hlckJhc2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sbGVjdGlvbk1hdGNoZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkV2ZW50SGFuZGxlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbGxlY3Rpb25DYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uRXhwYW5zaW9uLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbHVtbkhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NvbnN0YW50cy50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2x1bW5JbmZvLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbHVtblNldC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2x1bW5TdWJzZXRDYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2x1bW5VdGlsLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NyZWF0ZVJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvUXVlcnlQYXJzZXJCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1F1ZXJ5Q29sdW1uRXh0cmFjdG9yLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL0NvbGxlY3Rpb25IYW5kbGVyQmFzZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS9zZXJ2ZXIvU2VydmVyQ29sbGVjdGlvbkhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvc2VydmVyL1NlcnZlckl0ZW1IYW5kbGVyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL3NlcnZlci9TZXJ2ZXJDYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9JdGVtQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvSXRlbUVudHJ5U2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9LZXlTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0xvY2tTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL01vZHVsZUNoYW5nZXNDb21waWxhdGlvbi50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9RdWVyeU1hdGNoZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvUXVlcnlQYXJzZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvUXVlcnlTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1JlcXVlc3RDb2x1bW5FeHBhbnNpb24udHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvU29ja2V0TWVzc2FnZUhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9DaGFuZ2VzRGVsdGFCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NoYW5nZXNEZWx0YS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9JbnRlcm5hbENoYW5nZXNEZWx0YS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9SZXF1ZXN0QnVmZmVyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1JlcXVlc3RCdWZmZXJNYW5hZ2VyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2luZGV4LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1RlbXBsYXRlQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9BcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9DaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sbGVjdGlvbkNhY2hlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbGxlY3Rpb25FbnRyeUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Db2xsZWN0aW9uTWF0Y2hlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Db2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sdW1uRXhwYW5zaW9uRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbHVtbkluZm9GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sdW1uU2V0RmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbHVtblN1YnNldENhY2hlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NyZWF0ZVJlcXVlc3RGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvSXRlbUNhY2hlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0l0ZW1FbnRyeUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9JdGVtUmVzb3VyY2VGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvUXVlcnlNYXRjaGVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL1F1ZXJ5UGFyc2VyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL1JlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvVGVtcGxhdGVGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NoYW5nZXNQcm9jZXNzb3JGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NvcmUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVB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QUFJLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7UUFDL0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyw2QkFBNkIsQ0FBQztRQUNuRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7UUFDakQsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7UUFDdkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBQy9DLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQ3BDLENBQUM7SUFDRixhQUFDO0FBQUQsQ0FBQzs7QUFFSyxTQUFVLElBQUk7QUFDcEIsQ0FBQztBQUVLLFNBQVUsUUFBUSxDQUFFLEtBQUs7SUFDOUIsT0FBTyxLQUFLLENBQUM7QUFDZCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyVnNCO0FBQ0s7QUFDSDtBQUVDO0FBQ0U7QUFDSiIsImZpbGUiOiJybS1jb3JlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwibW9tZW50XCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcIm1vbWVudFwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJSbUNvcmVcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJtb21lbnRcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlJtQ29yZVwiXSA9IGZhY3Rvcnkocm9vdFtcIm1vbWVudFwiXSk7XG59KSh3aW5kb3csIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzBfXykge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMF9fOyIsImV4cG9ydCBmdW5jdGlvbiBpbnN0YW50aWF0ZU9wdGlvbnMgKFxuXHRvcHRpb25zOiB7W2tleTogc3RyaW5nXTogYW55fSxcblx0dmFsdWVzOiBvYmplY3QsXG4pOiB2b2lkIHtcblx0Zm9yIChjb25zdCBrZXkgaW4gdmFsdWVzKSB7XG5cdFx0aWYgKCEoa2V5IGluIG9wdGlvbnMpKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRpZiAodmFsdWVzW2tleV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0b3B0aW9uc1trZXldID0gdmFsdWVzW2tleV07XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYWxsb3dNZXJnZSAoXG5cdG9iamVjdCxcblx0ZGVmYXVsdHMsXG4pIHtcblx0aWYgKG9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGRlZmF1bHRzO1xuXHR9XG5cblx0Y29uc3QgcmVzdWx0ID0ge307XG5cblx0Zm9yIChjb25zdCBrZXkgaW4gZGVmYXVsdHMpIHtcblx0XHRyZXN1bHRba2V5XSA9IG9iamVjdFtrZXldID09PSB1bmRlZmluZWQgP1xuXHRcdFx0ZGVmYXVsdHNba2V5XSA6IG9iamVjdFtrZXldO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1Byb3BlcnRpZXMgKG9iamVjdCkge1xuXHQvLyBAdHMtaWdub3JlXG5cdGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rmlyc3RQcm9wZXJ0eSAob2JqZWN0KSB7XG5cdGlmICh0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0Jykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Zm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG5cdFx0cmV0dXJuIGtleTtcblx0fVxuXG5cdHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5BcnJheSAoXG5cdG5lZWRsZSxcblx0aGF5c3RhY2ssXG4pIHtcblx0Zm9yIChjb25zdCBoYXkgb2YgaGF5c3RhY2spIHtcblx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdGlmIChuZWVkbGUgPT0gaGF5KSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJBcnJheTxUPiAoXG5cdHNvdXJjZTogVFtdLFxuXHRjYWxsYmFjazogKGVsZW06IFQpID0+IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcblx0Y29uc3QgZmlsdGVyZWQ6IFRbXSA9IFtdO1xuXG5cdGZvciAoY29uc3Qgc3JjIG9mIHNvdXJjZSkge1xuXHRcdGlmIChjYWxsYmFjayhzcmMpKSB7XG5cdFx0XHRmaWx0ZXJlZC5wdXNoKHNyYyk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gc291cmNlLmxlbmd0aCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGVtcHR5QXJyYXkoc291cmNlKTtcblxuXHRmb3IgKGNvbnN0IGZpbHRlciBvZiBmaWx0ZXJlZCkge1xuXHRcdHNvdXJjZS5wdXNoKGZpbHRlcik7XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5QXJyYXkgKGFycmF5KTogdm9pZCB7XG5cdGFycmF5LnNwbGljZSgwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhFeGlzdHMgKFxuXHRzb3VyY2UsXG5cdHBhdGgsXG4pIHtcblx0aWYgKHR5cGVvZiBzb3VyY2UgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Zm9yIChjb25zdCBwIG9mIHBhdGgpIHtcblx0XHRpZiAodHlwZW9mIHNvdXJjZVtwXSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRzb3VyY2UgPSBzb3VyY2VbcF07XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhdGg8VD4gKFxuXHRvYmplY3Q6IGFueSxcblx0cGF0aDogQXJyYXk8bnVtYmVyIHwgc3RyaW5nPixcblx0ZGVmYXVsdHM6IGFueVtdLFxuKTogVCB7XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuXHRcdGNvbnN0IHZhbHVlID0gcGF0aFtpXTtcblxuXHRcdGlmIChvYmplY3RbdmFsdWVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9iamVjdFt2YWx1ZV0gPSBkZWZhdWx0c1tpXTtcblx0XHR9XG5cblx0XHRvYmplY3QgPSBvYmplY3RbdmFsdWVdO1xuXHR9XG5cblx0cmV0dXJuIG9iamVjdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhdGggKFxuXHRvYmplY3Q6IHt9LFxuXHRwYXRoOiBBcnJheTxudW1iZXIgfCBzdHJpbmc+LFxuXHRjcmVhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbik6IGFueSB7XG5cdGlmIChvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRmb3IgKGNvbnN0IHAgb2YgcGF0aCkge1xuXHRcdG9iamVjdCA9IG9iamVjdFtwXTsgLy8gd29uJ3QgYWx0ZXIgdGhlIGNhbGxlcidzIHZhclxuXG5cdFx0aWYgKG9iamVjdCA9PT0gdW5kZWZpbmVkICYmICFjcmVhdGUpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG9iamVjdDtcbn1cblxuLy8gVGFrZW4gZnJvbSBBbmd1bGFySlMsIGFkZGVkIGNvbW1lbnRzIHRvIGlnbm9yZSBUeXBlU2NyaXB0IGVycm9yc1xuZnVuY3Rpb24gYmFzZUV4dGVuZCAoXG5cdGRzdCxcblx0b2Jqcyxcblx0ZGVlcCxcbikge1xuXHRmb3IgKGxldCBpID0gMCwgaWkgPSBvYmpzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcblx0XHRjb25zdCBvYmogPSBvYmpzW2ldO1xuXG5cdFx0aWYgKCFpc09iamVjdChvYmopICYmICFpc0Z1bmN0aW9uKG9iaikpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuXG5cdFx0Zm9yIChsZXQgaiA9IDAsIGpqID0ga2V5cy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG5cdFx0XHRjb25zdCBrZXkgPSBrZXlzW2pdO1xuXHRcdFx0Y29uc3Qgc3JjID0gb2JqW2tleV07XG5cblx0XHRcdGlmIChkZWVwICYmIGlzT2JqZWN0KHNyYykpIHtcblx0XHRcdFx0aWYgKGlzRGF0ZShzcmMpKSB7XG5cdFx0XHRcdFx0ZHN0W2tleV0gPSBuZXcgRGF0ZShzcmMudmFsdWVPZigpKTtcblx0XHRcdFx0fSBlbHNlIGlmIChpc1JlZ0V4cChzcmMpKSB7XG5cdFx0XHRcdFx0ZHN0W2tleV0gPSBuZXcgUmVnRXhwKHNyYyk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoc3JjLm5vZGVOYW1lKSB7XG5cdFx0XHRcdFx0ZHN0W2tleV0gPSBzcmMuY2xvbmVOb2RlKHRydWUpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzRWxlbWVudChzcmMpKSB7XG5cdFx0XHRcdFx0ZHN0W2tleV0gPSBzcmMuY2xvbmUoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpZiAoIWlzT2JqZWN0KGRzdFtrZXldKSkge1xuXHRcdFx0XHRcdFx0ZHN0W2tleV0gPSBpc0FycmF5KHNyYykgPyBbXSA6IHt9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJhc2VFeHRlbmQoXG5cdFx0XHRcdFx0XHRkc3Rba2V5XSxcblx0XHRcdFx0XHRcdFtzcmNdLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkc3Rba2V5XSA9IHNyYztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZHN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kIChcblx0ZHN0LFxuXHQuLi5hcmdzXG4pIHtcblx0cmV0dXJuIGJhc2VFeHRlbmQoXG5cdFx0ZHN0LFxuXHRcdGFyZ3MsXG5cdFx0ZmFsc2UsXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZSAoXG5cdGRzdCxcblx0Li4uYXJnc1xuKSB7XG5cdHJldHVybiBiYXNlRXh0ZW5kKFxuXHRcdGRzdCxcblx0XHRhcmdzLFxuXHRcdHRydWUsXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdCAodmFsdWUpIHtcblx0Ly8gaHR0cDovL2pzcGVyZi5jb20vaXNvYmplY3Q0XG5cdHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCbGFua09iamVjdCAodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIU9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyAodmFsdWUpIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlciAodmFsdWUpIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUgKHZhbHVlKSB7XG5cdHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuXG5leHBvcnQgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Z1bmN0aW9uPFQ+ICh2YWx1ZTogYW55KTogdmFsdWUgaXMgVCB7XG5cdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZ0V4cCAodmFsdWUpIHtcblx0cmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbiAodmFsdWUpIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50IChub2RlKSB7XG5cdHJldHVybiAhIShub2RlICYmXG5cdFx0KFxuXHRcdFx0bm9kZS5ub2RlTmFtZSAgLy8gV2UgYXJlIGEgZGlyZWN0IGVsZW1lbnQuXG5cdFx0XHR8fCAobm9kZS5wcm9wICYmIG5vZGUuYXR0ciAmJiBub2RlLmZpbmQpXG5cdFx0KVxuXHQpOyAgLy8gV2UgaGF2ZSBhbiBvbiBhbmQgZmluZCBtZXRob2QgcGFydCBvZiBqUXVlcnkgQVBJLlxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXaW5kb3cgKG9iaikge1xuXHRyZXR1cm4gb2JqICYmIG9iai53aW5kb3cgPT09IG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGVmaW5lZCAodmFsdWUpIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHMgKFxuXHRvMSxcblx0bzIsXG4pIHtcblx0aWYgKG8xID09PSBvMikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aWYgKG8xID09PSBudWxsIHx8IG8yID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuXHRpZiAobzEgIT09IG8xICYmIG8yICE9PSBvMikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IC8vIE5hTiA9PT0gTmFOXG5cblx0Y29uc3QgdDEgPSB0eXBlb2YgbzE7XG5cdGNvbnN0IHQyID0gdHlwZW9mIG8yO1xuXG5cdGxldCBsZW5ndGg7XG5cdGxldCBrZXk7XG5cdGxldCBrZXlTZXQ7XG5cblx0aWYgKHQxID09PSB0MiAmJiB0MSA9PT0gJ29iamVjdCcpIHtcblx0XHRpZiAoaXNBcnJheShvMSkpIHtcblx0XHRcdGlmICghaXNBcnJheShvMikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRsZW5ndGggPSBvMS5sZW5ndGg7XG5cblx0XHRcdGlmIChvMS5sZW5ndGggPT09IG8yLmxlbmd0aCkge1xuXHRcdFx0XHRmb3IgKGtleSA9IDA7IGtleSA8IGxlbmd0aDsga2V5KyspIHtcblx0XHRcdFx0XHRpZiAoIWVxdWFscyhcblx0XHRcdFx0XHRcdG8xW2tleV0sXG5cdFx0XHRcdFx0XHRvMltrZXldLFxuXHRcdFx0XHRcdCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGlzRGF0ZShvMSkpIHtcblx0XHRcdGlmICghaXNEYXRlKG8yKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzaW1wbGVDb21wYXJlKFxuXHRcdFx0XHRvMS5nZXRUaW1lKCksXG5cdFx0XHRcdG8yLmdldFRpbWUoKSxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChpc1JlZ0V4cChvMSkpIHtcblx0XHRcdGlmICghaXNSZWdFeHAobzIpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG8xLnRvU3RyaW5nKCkgPT09IG8yLnRvU3RyaW5nKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChpc1dpbmRvdyhvMSkgfHwgaXNXaW5kb3cobzIpIHx8IGlzQXJyYXkobzIpIHx8IGlzRGF0ZShvMikgfHwgaXNSZWdFeHAobzIpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0a2V5U2V0ID0gY3JlYXRlTWFwKCk7XG5cdFx0XHRmb3IgKGtleSBpbiBvMSkge1xuXHRcdFx0XHRpZiAoaXNGdW5jdGlvbihvMVtrZXldKSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCFlcXVhbHMoXG5cdFx0XHRcdFx0bzFba2V5XSxcblx0XHRcdFx0XHRvMltrZXldLFxuXHRcdFx0XHQpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5U2V0W2tleV0gPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGtleSBpbiBvMikge1xuXHRcdFx0XHRpZiAoIShrZXkgaW4ga2V5U2V0KSAmJiBpc0RlZmluZWQobzJba2V5XSkgJiYgIWlzRnVuY3Rpb24obzJba2V5XSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVNYXAgKCkge1xuXHRyZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuZnVuY3Rpb24gc2ltcGxlQ29tcGFyZSAoXG5cdGEsXG5cdGIsXG4pIHtcblx0cmV0dXJuIGEgPT09IGIgfHwgKGEgIT09IGEgJiYgYiAhPT0gYik7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRPYmplY3RNYXhEZXB0aCAobWF4RGVwdGgpIHtcblx0cmV0dXJuIGlzTnVtYmVyKG1heERlcHRoKSAmJiBtYXhEZXB0aCA+IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3B5IChcblx0c291cmNlLFxuXHRkZXN0aW5hdGlvbj8sXG5cdG1heERlcHRoPyxcbikge1xuXHRjb25zdCBzdGFja1NvdXJjZSA9IFtdO1xuXHRjb25zdCBzdGFja0Rlc3QgPSBbXTtcblxuXHRtYXhEZXB0aCA9IGlzVmFsaWRPYmplY3RNYXhEZXB0aChtYXhEZXB0aCkgPyBtYXhEZXB0aCA6IE5hTjtcblxuXHRpZiAoZGVzdGluYXRpb24pIHtcblx0XHRpZiAoc291cmNlID09PSBkZXN0aW5hdGlvbikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGNvcHkhIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGlkZW50aWNhbC4nKTtcblx0XHR9XG5cblx0XHQvLyBFbXB0eSB0aGUgZGVzdGluYXRpb24gb2JqZWN0XG5cdFx0aWYgKGlzQXJyYXkoZGVzdGluYXRpb24pKSB7XG5cdFx0XHRkZXN0aW5hdGlvbi5sZW5ndGggPSAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBkZXN0aW5hdGlvbikge1xuXHRcdFx0XHRkZWxldGUgZGVzdGluYXRpb25ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0c3RhY2tTb3VyY2UucHVzaChzb3VyY2UpO1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRzdGFja0Rlc3QucHVzaChkZXN0aW5hdGlvbik7XG5cblx0XHRyZXR1cm4gY29weVJlY3Vyc2UoXG5cdFx0XHRzb3VyY2UsXG5cdFx0XHRkZXN0aW5hdGlvbixcblx0XHRcdG1heERlcHRoLFxuXHRcdCk7XG5cdH1cblxuXHRyZXR1cm4gY29weUVsZW1lbnQoXG5cdFx0c291cmNlLFxuXHRcdG1heERlcHRoLFxuXHQpO1xuXG5cdGZ1bmN0aW9uIGNvcHlSZWN1cnNlIChcblx0XHRfc291cmNlLFxuXHRcdF9kZXN0aW5hdGlvbixcblx0XHRfbWF4RGVwdGgsXG5cdCkge1xuXHRcdF9tYXhEZXB0aC0tO1xuXG5cdFx0aWYgKF9tYXhEZXB0aCA8IDApIHtcblx0XHRcdHJldHVybiAnLi4uJztcblx0XHR9XG5cblx0XHRpZiAoaXNBcnJheShfc291cmNlKSkge1xuXHRcdFx0Zm9yIChsZXQgaSA9IDAsIGlpID0gX3NvdXJjZS5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG5cdFx0XHRcdF9kZXN0aW5hdGlvbi5wdXNoKGNvcHlFbGVtZW50KFxuXHRcdFx0XHRcdF9zb3VyY2VbaV0sXG5cdFx0XHRcdFx0X21heERlcHRoLFxuXHRcdFx0XHQpKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGlzQmxhbmtPYmplY3QoX3NvdXJjZSkpIHtcblx0XHRcdC8vIGNyZWF0ZU1hcCgpIGZhc3QgcGF0aCAtLS0gU2FmZSB0byBhdm9pZCBoYXNPd25Qcm9wZXJ0eSBjaGVjayBiZWNhdXNlIHByb3RvdHlwZSBjaGFpbiBpcyBlbXB0eVxuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gX3NvdXJjZSkge1xuXHRcdFx0XHRfZGVzdGluYXRpb25ba2V5XSA9IGNvcHlFbGVtZW50KFxuXHRcdFx0XHRcdF9zb3VyY2Vba2V5XSxcblx0XHRcdFx0XHRfbWF4RGVwdGgsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChfc291cmNlICYmIHR5cGVvZiBfc291cmNlLmhhc093blByb3BlcnR5ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHQvLyBTbG93IHBhdGgsIHdoaWNoIG11c3QgcmVseSBvbiBoYXNPd25Qcm9wZXJ0eVxuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gX3NvdXJjZSkge1xuXHRcdFx0XHRpZiAoX3NvdXJjZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRcdFx0X2Rlc3RpbmF0aW9uW2tleV0gPSBjb3B5RWxlbWVudChcblx0XHRcdFx0XHRcdF9zb3VyY2Vba2V5XSxcblx0XHRcdFx0XHRcdF9tYXhEZXB0aCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFNsb3dlc3QgcGF0aCAtLS0gaGFzT3duUHJvcGVydHkgY2FuJ3QgYmUgY2FsbGVkIGFzIGEgbWV0aG9kXG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBfc291cmNlKSB7XG5cdFx0XHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoXG5cdFx0XHRcdFx0X3NvdXJjZSxcblx0XHRcdFx0XHRrZXksXG5cdFx0XHRcdCkpIHtcblx0XHRcdFx0XHRfZGVzdGluYXRpb25ba2V5XSA9IGNvcHlFbGVtZW50KFxuXHRcdFx0XHRcdFx0X3NvdXJjZVtrZXldLFxuXHRcdFx0XHRcdFx0X21heERlcHRoLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gX2Rlc3RpbmF0aW9uO1xuXHR9XG5cblx0ZnVuY3Rpb24gY29weUVsZW1lbnQgKFxuXHRcdF9zb3VyY2UsXG5cdFx0X21heERlcHRoID0gNSxcblx0KSB7XG5cdFx0Ly8gU2ltcGxlIHZhbHVlc1xuXHRcdGlmICghaXNPYmplY3QoX3NvdXJjZSkpIHtcblx0XHRcdHJldHVybiBfc291cmNlO1xuXHRcdH1cblxuXHRcdC8vIEFscmVhZHkgY29waWVkIHZhbHVlc1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRjb25zdCBpbmRleCA9IHN0YWNrU291cmNlLmluZGV4T2YoX3NvdXJjZSk7XG5cblx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHRyZXR1cm4gc3RhY2tEZXN0W2luZGV4XTtcblx0XHR9XG5cblx0XHRpZiAoaXNXaW5kb3coX3NvdXJjZSkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBjb3B5ISBNYWtpbmcgY29waWVzIG9mIFdpbmRvdyBpbnN0YW5jZXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcblx0XHR9XG5cblx0XHRsZXQgbmVlZHNSZWN1cnNlID0gZmFsc2U7XG5cdFx0bGV0IF9kZXN0aW5hdGlvbiA9IGNvcHlUeXBlKF9zb3VyY2UpO1xuXG5cdFx0aWYgKF9kZXN0aW5hdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRfZGVzdGluYXRpb24gPSBpc0FycmF5KF9zb3VyY2UpID8gW10gOiBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihfc291cmNlKSk7XG5cdFx0XHRuZWVkc1JlY3Vyc2UgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRzdGFja1NvdXJjZS5wdXNoKF9zb3VyY2UpO1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRzdGFja0Rlc3QucHVzaChfZGVzdGluYXRpb24pO1xuXG5cdFx0cmV0dXJuIG5lZWRzUmVjdXJzZVxuXHRcdFx0PyBjb3B5UmVjdXJzZShcblx0XHRcdFx0X3NvdXJjZSxcblx0XHRcdFx0X2Rlc3RpbmF0aW9uLFxuXHRcdFx0XHRfbWF4RGVwdGgsXG5cdFx0XHQpXG5cdFx0XHQ6IF9kZXN0aW5hdGlvbjtcblx0fVxuXG5cdGZ1bmN0aW9uIGNvcHlUeXBlIChfc291cmNlKSB7XG5cdFx0c3dpdGNoICh0b1N0cmluZy5jYWxsKF9zb3VyY2UpKSB7XG5cdFx0XHRjYXNlICdbb2JqZWN0IEludDhBcnJheV0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBJbnQxNkFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IEludDMyQXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgRmxvYXQzMkFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBVaW50OEFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IFVpbnQxNkFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IFVpbnQzMkFycmF5XSc6XG5cdFx0XHRcdHJldHVybiBuZXcgX3NvdXJjZS5jb25zdHJ1Y3Rvcihcblx0XHRcdFx0XHRjb3B5RWxlbWVudChfc291cmNlLmJ1ZmZlciksXG5cdFx0XHRcdFx0X3NvdXJjZS5ieXRlT2Zmc2V0LFxuXHRcdFx0XHRcdF9zb3VyY2UubGVuZ3RoLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRjYXNlICdbb2JqZWN0IEFycmF5QnVmZmVyXSc6XG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFMTBcblx0XHRcdFx0aWYgKCFfc291cmNlLnNsaWNlKSB7XG5cdFx0XHRcdFx0Ly8gSWYgd2UncmUgaW4gdGhpcyBjYXNlIHdlIGtub3cgdGhlIGVudmlyb25tZW50IHN1cHBvcnRzIEFycmF5QnVmZmVyXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cblx0XHRcdFx0XHRjb25zdCBjb3BpZWQgPSBuZXcgQXJyYXlCdWZmZXIoX3NvdXJjZS5ieXRlTGVuZ3RoKTtcblx0XHRcdFx0XHRuZXcgVWludDhBcnJheShjb3BpZWQpLnNldChuZXcgVWludDhBcnJheShfc291cmNlKSk7XG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSAqL1xuXHRcdFx0XHRcdHJldHVybiBjb3BpZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIF9zb3VyY2Uuc2xpY2UoMCk7XG5cblx0XHRcdGNhc2UgJ1tvYmplY3QgQm9vbGVhbl0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBOdW1iZXJdJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgU3RyaW5nXSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IERhdGVdJzpcblx0XHRcdFx0cmV0dXJuIG5ldyBfc291cmNlLmNvbnN0cnVjdG9yKF9zb3VyY2UudmFsdWVPZigpKTtcblxuXHRcdFx0Y2FzZSAnW29iamVjdCBSZWdFeHBdJzpcblx0XHRcdFx0Y29uc3QgcmUgPSBuZXcgUmVnRXhwKFxuXHRcdFx0XHRcdF9zb3VyY2UuX3NvdXJjZSxcblx0XHRcdFx0XHRfc291cmNlLnRvU3RyaW5nKClcblx0XHRcdFx0XHRcdC5tYXRjaCgvW14vXSokLylbMF0sXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0cmUubGFzdEluZGV4ID0gX3NvdXJjZS5sYXN0SW5kZXg7XG5cblx0XHRcdFx0cmV0dXJuIHJlO1xuXG5cdFx0XHRjYXNlICdbb2JqZWN0IEJsb2JdJzpcblx0XHRcdFx0cmV0dXJuIG5ldyBfc291cmNlLmNvbnN0cnVjdG9yKFxuXHRcdFx0XHRcdFtfc291cmNlXSxcblx0XHRcdFx0XHR7dHlwZTogX3NvdXJjZS50eXBlfSxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAoaXNGdW5jdGlvbihfc291cmNlLmNsb25lTm9kZSkpIHtcblx0XHRcdHJldHVybiBfc291cmNlLmNsb25lTm9kZSh0cnVlKTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQgeyBDb2x1bW5JbmZvIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBGaWVsZE1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IGNvcHksIGVxdWFscyB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBBcGlGb3JtYXR0ZXIge1xuXG5cdE1PTUVOVF9JTlZBTElEID0gJ0ludmFsaWQgZGF0ZSc7XG5cdFNFUlZFUl9EQVRFVElNRV9GT1JNQVQgPSAnWVlZWS1NTS1ERFtUXUhIOm1tOnNzWic7XG5cdFNFUlZFUl9USU1FX0ZPUk1BVCA9ICdISDptbTpzcyc7XG5cdFNFUlZFUl9EQVRFX0ZPUk1BVCA9ICdZWVlZLU1NLUREJztcblxuXHRjb25zdHJ1Y3RvciAoKSB7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyBpZiBhIGNvbHVtbiB0eXBlIGlzIGFuICdleHBlbnNpdmUnIHR5cGUsIG1lYW5pbmcgdGhhdCB0aGUgYWN0aW9uIHRvIGZvcm1hdCB0aGUgZmllbGQgdGFrZXMgc2lnbmlmaWNhbnQgQ1BVIHRpbWVcblx0ICpcblx0ICogLS0tLVxuXHQgKiBAcmVtYXJrc1xuXHQgKiBDdXJyZW50bHkgb25seSB1c2VkIGZvciBNb21lbnQgb2JqZWN0c1xuXHQgKi9cblx0cHVibGljIGlzRXhwZW5zaXZlRm9ybWF0IChjb2x1bW5UeXBlOiBzdHJpbmcpIHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIHZhbHVlcyBpbiAnY2hhbmdlcycgaWYgdGhlIHZhbHVlcyBpbiAnaW5pdGlhbCcgYW5kICdjaGFuZ2VzJyBhcmUgdGhlIHNhbWUgKGxlYXZpbmcgdXNlciBjaGFuZ2VzIGludGFjdClcblx0ICovXG5cdHB1YmxpYyBtZXJnZUNvcHlGaWVsZHM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpbml0aWFsOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNoYW5nZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0bmV3SW5pdGlhbDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5QYXRoID0gY29sdW1uLnBhdGg7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0bmV3SW5pdGlhbFtjb2x1bW5QYXRoXSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCYmIChcblx0XHRcdFx0XHRjb2x1bW5QYXRoID09PSAnaWQnIHx8XG5cdFx0XHRcdFx0Y2hhbmdlc1tjb2x1bW5QYXRoXSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdFx0dGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0XHRcdFx0Y29sdW1uLmFwaUNvbHVtbi50eXBlLFxuXHRcdFx0XHRcdFx0Y2hhbmdlc1tjb2x1bW5QYXRoXSxcblx0XHRcdFx0XHRcdGluaXRpYWxbY29sdW1uUGF0aF0sXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y2hhbmdlc1tjb2x1bW5QYXRoXSA9IHRoaXMuY2xvbmUoXG5cdFx0XHRcdFx0Y29sdW1uLmFwaUNvbHVtbi50eXBlLFxuXHRcdFx0XHRcdG5ld0luaXRpYWxbY29sdW1uUGF0aF0sXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNoYW5nZXM7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVxdWVzdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGluaXRpYWw6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0bW9kaWZpZWQ6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxhbnk+Pixcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgcmVzdWx0OiB7W2NvbHVtbklkOiBzdHJpbmddOiBhbnl9ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5JZCA9IGNvbHVtbi5pZDtcblx0XHRcdGNvbnN0IGFwaUNvbHVtbiA9IGNvbHVtbi5hcGlDb2x1bW47XG5cdFx0XHRjb25zdCBjb2x1bW5UeXBlID0gYXBpQ29sdW1uLnR5cGU7XG5cblx0XHRcdGlmIChhcGlDb2x1bW4ucmVhZE9ubHkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghdGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0XHRjb2x1bW5UeXBlLFxuXHRcdFx0XHRpbml0aWFsW2NvbHVtbklkXSxcblx0XHRcdFx0bW9kaWZpZWRbY29sdW1uSWRdLFxuXHRcdFx0KSkge1xuXHRcdFx0XHRyZXN1bHRbY29sdW1uSWRdID0gdGhpcy5mb3JtYXRSZXF1ZXN0VmFsdWUoXG5cdFx0XHRcdFx0Y29sdW1uVHlwZSxcblx0XHRcdFx0XHRtb2RpZmllZFtjb2x1bW5JZF0sXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0TG9jYWw8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxhbnk+Pixcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgcmVzdWx0OiB7W2NvbHVtbklkOiBzdHJpbmddOiBhbnl9ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5JZCA9IGNvbHVtbi5pZDtcblx0XHRcdGNvbnN0IGFwaUNvbHVtbiA9IGNvbHVtbi5hcGlDb2x1bW47XG5cblx0XHRcdGlmIChhcGlDb2x1bW4ucmVhZE9ubHkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdFtjb2x1bW5JZF0gPSB0aGlzLmZvcm1hdFJlcXVlc3RWYWx1ZShcblx0XHRcdFx0YXBpQ29sdW1uLnR5cGUsXG5cdFx0XHRcdGZpZWxkc1tjb2x1bW5JZF0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgaGFzQ2hhbmdlcyAoXG5cdFx0aW5pdGlhbDogRmllbGRNYXAsXG5cdFx0bW9kaWZpZWQ6IEZpZWxkTWFwLFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88YW55Pj4sXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtbklkID0gY29sdW1uLmlkO1xuXHRcdFx0Y29uc3QgYXBpQ29sdW1uID0gY29sdW1uLmFwaUNvbHVtbjtcblxuXHRcdFx0Ly8gUGFyZW50IGNvbHVtbnMgYXJlbid0IHdyaXRhYmxlIGN1cnJlbnRseSBiZWNhdXNlIHdlIHVzZSBMaW5rVG8gcmVxdWVzdHNcblx0XHRcdC8vIGJ1dCBpbiB0aGUgY29yZSB0aGV5J3JlIGFscmVhZHkgdHJlYXRlZCBhcyBub3JtYWwgZmllbGRzXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGFwaUNvbHVtbi50eXBlICE9PSAnbGluaydcblx0XHRcdFx0JiYgYXBpQ29sdW1uLnR5cGUgIT09ICdwYXJlbnR0eXBlJ1xuXHRcdFx0XHQmJiBhcGlDb2x1bW4udHlwZSAhPT0gJ3BhcmVudGlkJ1xuXHRcdFx0XHQmJiBhcGlDb2x1bW4ucmVhZE9ubHlcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuaXNFeHBlbnNpdmVGb3JtYXQoY29sdW1uLmFwaUNvbHVtbi50eXBlKSkge1xuXHRcdFx0XHRjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcblx0XHRcdFx0XHRtb2RpZmllZCxcblx0XHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHQvLyBJZiB0aGUgbW9tZW50IGdldHRlciBoYXNuJ3QgYmVlbiB0cmlnZ2VyZWQgb3Igb3ZlcndyaXR0ZW4geWV0LCB3ZSBjYW4gYXNzdW1lIHRoZXJlIGFyZSBubyBjaGFuZ2VzXG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRkZXNjICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQmJiBkZXNjLnZhbHVlID09PSB1bmRlZmluZWRcblx0XHRcdFx0XHQmJiBkZXNjLmdldCAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChcblx0XHRcdFx0IXRoaXMuY29tcGFyZUZpZWxkcyhcblx0XHRcdFx0XHRhcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0XHRpbml0aWFsW2NvbHVtbklkXSxcblx0XHRcdFx0XHRtb2RpZmllZFtjb2x1bW5JZF0sXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGluaXRpYWw6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0bW9kaWZpZWQ6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxhbnk+Pixcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgcmVzdWx0OiBvYmplY3RbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cdFx0XHRjb25zdCBhcGlDb2x1bW4gPSBjb2x1bW4uYXBpQ29sdW1uO1xuXG5cdFx0XHRpZiAoYXBpQ29sdW1uLnJlYWRPbmx5KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXRoaXMuY29tcGFyZUZpZWxkcyhcblx0XHRcdFx0YXBpQ29sdW1uLnR5cGUsXG5cdFx0XHRcdGluaXRpYWxbY29sdW1uSWRdLFxuXHRcdFx0XHRtb2RpZmllZFtjb2x1bW5JZF0sXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG9sZFZhbHVlOiBpbml0aWFsW2NvbHVtbklkXSxcblx0XHRcdFx0XHRcdG5ld1ZhbHVlOiBtb2RpZmllZFtjb2x1bW5JZF0sXG5cdFx0XHRcdFx0XHRjb2x1bW46IGNvbHVtbi5hcGlDb2x1bW4sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGNvcHlGaWVsZHM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRzb3VyY2U6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZGVzdGluYXRpb246IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxhbnk+Pixcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uUGF0aCA9IGNvbHVtbi5wYXRoO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFzb3VyY2UuaGFzT3duUHJvcGVydHkoY29sdW1uUGF0aClcblx0XHRcdFx0fHwgKFxuXHRcdFx0XHRcdC8vIHByZXZlbnQgdHJpZ2dlcmluZyBnZXR0ZXIgZm9yIGV4cGVuc2l2ZSBmb3JtYXRzXG5cdFx0XHRcdFx0IXRoaXMuaXNFeHBlbnNpdmVGb3JtYXQoY29sdW1uLmFwaUNvbHVtbi50eXBlKVxuXHRcdFx0XHRcdCYmIHNvdXJjZVtjb2x1bW5QYXRoXSA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0ZGVzdGluYXRpb25bY29sdW1uUGF0aF0gPSB0aGlzLmNsb25lKFxuXHRcdFx0XHRjb2x1bW4uYXBpQ29sdW1uLnR5cGUsXG5cdFx0XHRcdHNvdXJjZVtjb2x1bW5QYXRoXSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlc3RpbmF0aW9uO1xuXHR9XG5cblx0cHVibGljIHNoYWxsb3dDb3B5RmllbGRzIChcblx0XHRzaGFsbG93U291cmNlOiBGaWVsZE1hcCxcblx0XHRkZWVwU291cmNlOiBGaWVsZE1hcCxcblx0XHRkZXN0aW5hdGlvbjogRmllbGRNYXAsXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxhbnk+Pixcblx0KTogRmllbGRNYXAge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW4ucGF0aDtcblxuXHRcdFx0ZGVzdGluYXRpb25bY29sdW1uUGF0aF0gPSBzaGFsbG93U291cmNlW2NvbHVtblBhdGhdICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRzaGFsbG93U291cmNlW2NvbHVtblBhdGhdIDpcblx0XHRcdFx0dGhpcy5jbG9uZShcblx0XHRcdFx0XHRjb2x1bW4uYXBpQ29sdW1uLnR5cGUsXG5cdFx0XHRcdFx0ZGVlcFNvdXJjZVtjb2x1bW5QYXRoXSxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVzdGluYXRpb247XG5cdH1cblxuXHRwdWJsaWMgc2V0RGVmYXVsdFZhbHVlcyAoXG5cdFx0ZGVzdGluYXRpb246IEZpZWxkTWFwLFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88YW55Pj4sXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW4uaWRdID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoY29sdW1uLmFwaUNvbHVtbi50eXBlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVzdGluYXRpb247XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENvbXBhcmVzIHRoZSBnaXZlbiBmaWVsZHMsIHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGZpZWxkcyBhcmUgZXF1YWxcblx0ICovXG5cdHB1YmxpYyBjb21wYXJlRmllbGRzIChcblx0XHRjb2x1bW5UeXBlOiBzdHJpbmcsXG5cdFx0Zmlyc3Q/OiBhbnksXG5cdFx0c2Vjb25kPzogYW55LFxuXHQpOiBib29sZWFuIHtcblx0XHRpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHNlY29uZCA9PT0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGlmIChzZWNvbmQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAoY29sdW1uVHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICd0aW1lJzpcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29tcGFyZU1vbWVudE9iamVjdHMoXG5cdFx0XHRcdFx0Zmlyc3QsXG5cdFx0XHRcdFx0c2Vjb25kLFxuXHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb21wYXJlRHVyYXRpb25zKFxuXHRcdFx0XHRcdGZpcnN0LFxuXHRcdFx0XHRcdHNlY29uZCxcblx0XHRcdFx0KTtcblx0XHRcdGNhc2UgJ2lkJzogLy8gaWQgdHlwZXNcblx0XHRcdGNhc2UgJ2l0ZW0nOlxuXHRcdFx0Y2FzZSAnbGluayc6XG5cdFx0XHRjYXNlICdjaGlsZCc6XG5cdFx0XHRjYXNlICdzaWJsaW5nJzpcblx0XHRcdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRcdFx0cmV0dXJuIGZpcnN0ID09IHNlY29uZDsgLy8gdXNlIG5vbi1zdHJpY3QgY29tcGFyaXNvblxuXHRcdFx0Y2FzZSAnY3VycmVudCc6XG5cdFx0XHRjYXNlICdkaW1lbnNpb24nOlxuXHRcdFx0Y2FzZSAnZGlzdGFuY2UnOlxuXHRcdFx0Y2FzZSAnZG91YmxlJzogLy8gZmxvYXRpbmcgcG9pbnQgdHlwZXNcblx0XHRcdGNhc2UgJ2ZpbGVzaXplJzpcblx0XHRcdGNhc2UgJ251bWJlcic6XG5cdFx0XHRjYXNlICdwb3dlcic6XG5cdFx0XHRjYXNlICdxdWFudGl0eSc6XG5cdFx0XHRjYXNlICd2b2x1bWUnOlxuXHRcdFx0Y2FzZSAnd2VpZ2h0Jzpcblx0XHRcdGNhc2UgJ2Nvb3JkaW5hdGUnOlxuXHRcdFx0Y2FzZSAncHJpY2UnOlxuXHRcdFx0Y2FzZSAncGVyY2VudGFnZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbXBhcmVGbG9hdHMoXG5cdFx0XHRcdFx0Zmlyc3QsXG5cdFx0XHRcdFx0c2Vjb25kLFxuXHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSAnaW50JzogLy8gaW50ZWdlciB0eXBlc1xuXHRcdFx0Y2FzZSAnYm9vbCc6IC8vIGJvb2xlYW4gdHlwZXNcblx0XHRcdGNhc2UgJ2VudW0nOlxuXHRcdFx0Y2FzZSAnZW1haWwnOiAvLyBzdHJpbmcgdHlwZXNcblx0XHRcdGNhc2UgJ3Bob25lJzpcblx0XHRcdGNhc2UgJ3VybCc6XG5cdFx0XHRjYXNlICd0ZXh0Jzpcblx0XHRcdGNhc2UgJ2xvbmd0ZXh0Jzpcblx0XHRcdGNhc2UgJ2NvbG9yJzpcblx0XHRcdGNhc2UgJ29yZGVyJzpcblx0XHRcdFx0cmV0dXJuIGZpcnN0ID09PSBzZWNvbmQ7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZXF1YWxzKFxuXHRcdFx0XHRcdGZpcnN0LFxuXHRcdFx0XHRcdHNlY29uZCxcblx0XHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgY29tcGFyZUZsb2F0cyAoXG5cdFx0YTogbnVtYmVyLFxuXHRcdGI6IG51bWJlcixcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgYWJzQSA9IE1hdGguYWJzKGEpO1xuXHRcdGNvbnN0IGFic0IgPSBNYXRoLmFicyhiKTtcblx0XHRjb25zdCBkaWZmID0gTWF0aC5hYnMoYSAtIGIpO1xuXG5cdFx0Y29uc3QgRVBTSUxPTiA9IDEuMTllLTA3O1xuXG5cdFx0Ly8gc2hvcnRjdXQsIGhhbmRsZXMgaW5maW5pdGllc1xuXHRcdGlmIChhID09PSBiKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGVsc2UgaWYgKGEgPT09IDAgfHwgYiA9PT0gMCB8fCBkaWZmIDwgTnVtYmVyLk1JTl9WQUxVRSkge1xuXHRcdFx0Ly8gYSBvciBiIGlzIHplcm8gb3IgYm90aCBhcmUgZXh0cmVtZWx5IGNsb3NlIHRvIGl0XG5cdFx0XHQvLyByZWxhdGl2ZSBlcnJvciBpcyBsZXNzIG1lYW5pbmdmdWwgaGVyZVxuXHRcdFx0cmV0dXJuIGRpZmYgPCAoRVBTSUxPTiAqIE51bWJlci5NSU5fVkFMVUUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyB1c2UgcmVsYXRpdmUgZXJyb3Jcblx0XHRcdHJldHVybiBkaWZmIC8gTWF0aC5taW4oXG5cdFx0XHRcdChhYnNBICsgYWJzQiksXG5cdFx0XHRcdE51bWJlci5NQVhfVkFMVUUsXG5cdFx0XHQpIDwgRVBTSUxPTjtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgY29tcGFyZU1vbWVudE9iamVjdHMgKFxuXHRcdGZpcnN0OiBtb21lbnQuTW9tZW50LFxuXHRcdHNlY29uZDogbW9tZW50Lk1vbWVudCxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKCFmaXJzdC5pc1ZhbGlkKCkpIHtcblx0XHRcdHJldHVybiAhc2Vjb25kLmlzVmFsaWQoKTtcblx0XHR9XG5cblx0XHRpZiAoIXNlY29uZC5pc1ZhbGlkKCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IC8vIGZpcnN0IElTIHZhbGlkXG5cblx0XHRyZXR1cm4gZmlyc3QuaXNTYW1lKHNlY29uZCk7XG5cdH1cblxuXHRwdWJsaWMgY29tcGFyZUR1cmF0aW9ucyAoXG5cdFx0Zmlyc3Q6IG1vbWVudC5EdXJhdGlvbixcblx0XHRzZWNvbmQ6IG1vbWVudC5EdXJhdGlvbixcblx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGZpcnN0LmFzTWlsbGlzZWNvbmRzKCkgPT09IHNlY29uZC5hc01pbGxpc2Vjb25kcygpO1xuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlc3BvbnNlVmFsdWUgKFxuXHRcdGNvbHVtblR5cGU6IHN0cmluZyxcblx0XHR2YWx1ZTogYW55LFxuXHQpIHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRSZXNwb25zZURhdGUodmFsdWUpO1xuXHRcdFx0Y2FzZSAnY29sb3InOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRSZXNwb25zZUNvbG9yKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0UmVzcG9uc2VEdXJhdGlvbih2YWx1ZSk7XG5cdFx0XHRjYXNlICdqc29uJzpcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUgIT09ICcnID8gSlNPTi5wYXJzZSh2YWx1ZSkgOiB2YWx1ZTtcblx0XHRcdGNhc2UgJ251bWJlcic6XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gMCA/IG51bGwgOiB2YWx1ZTtcblx0XHRcdGNhc2UgJ2ZpbGVzaXplJzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlIC8gMTAwMDAwMDtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVxdWVzdFZhbHVlIChcblx0XHRjb2x1bW5UeXBlOiBzdHJpbmcsXG5cdFx0dmFsdWU6IGFueSxcblx0KSB7XG5cdFx0c3dpdGNoIChjb2x1bW5UeXBlKSB7XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlcXVlc3REYXRlVGltZSh2YWx1ZSk7XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0UmVxdWVzdERhdGUodmFsdWUpO1xuXHRcdFx0Y2FzZSAnY29sb3InOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRSZXF1ZXN0Q29sb3IodmFsdWUpO1xuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRSZXF1ZXN0RHVyYXRpb24odmFsdWUpO1xuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSAwID8gbnVsbCA6IHZhbHVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXNwb25zZURhdGUgKHZhbHVlOiBudWxsIHwgYW55KTogbW9tZW50Lk1vbWVudCB7XG5cdFx0cmV0dXJuIHZhbHVlID09PSBudWxsID8gbW9tZW50LmludmFsaWQoKSA6IG1vbWVudCh2YWx1ZSk7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVzcG9uc2VEdXJhdGlvbiAodmFsdWU6IG51bGwgfCBudW1iZXIpOiBtb21lbnQuRHVyYXRpb24ge1xuXHRcdHJldHVybiBtb21lbnQuZHVyYXRpb24oXG5cdFx0XHR2YWx1ZSA9PT0gbnVsbCA/IDAgOiB2YWx1ZSxcblx0XHRcdCdzZWNvbmRzJyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlc3BvbnNlQ29sb3IgKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiB2YWx1ZS5jaGFyQXQoMCkgPT09ICcjJyA/IHZhbHVlIDogJyMnICsgdmFsdWU7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVxdWVzdERhdGVUaW1lICh2YWx1ZTogbW9tZW50Lk1vbWVudCk6IHN0cmluZyB8IG51bGwge1xuXHRcdHJldHVybiB2YWx1ZS5pc1ZhbGlkKCkgPyB2YWx1ZS5mb3JtYXQodGhpcy5TRVJWRVJfREFURVRJTUVfRk9STUFUKSA6IG51bGw7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVxdWVzdERhdGUgKHZhbHVlOiBtb21lbnQuTW9tZW50KTogc3RyaW5nIHwgbnVsbCB7XG5cdFx0cmV0dXJuIHZhbHVlLmlzVmFsaWQoKSA/IHZhbHVlLmZvcm1hdCh0aGlzLlNFUlZFUl9EQVRFX0ZPUk1BVCkgOiBudWxsO1xuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlcXVlc3REdXJhdGlvbiAodmFsdWU6IG1vbWVudC5EdXJhdGlvbik6IG51bWJlciB7XG5cdFx0cmV0dXJuIHZhbHVlLmFzU2Vjb25kcygpO1xuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlcXVlc3RDb2xvciAodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHZhbHVlLmNoYXJBdCgwKSA9PT0gJyMnID8gdmFsdWUuc3Vic3RyaW5nKDEpIDogdmFsdWU7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RGVmYXVsdFZhbHVlIChjb2x1bW5UeXBlOiBzdHJpbmcpOiBhbnkge1xuXHRcdHN3aXRjaCAoY29sdW1uVHlwZSkge1xuXHRcdFx0Y2FzZSAnaW50Jzpcblx0XHRcdGNhc2UgJ2RvdWJsZSc6XG5cdFx0XHRjYXNlICdwZXJjZW50YWdlJzpcblx0XHRcdGNhc2UgJ3ByaWNlJzpcblx0XHRcdGNhc2UgJ29yZGVyJzpcblx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHRjYXNlICdpdGVtJzpcblx0XHRcdGNhc2UgJ2xpbmsnOlxuXHRcdFx0Y2FzZSAnY2hpbGQnOlxuXHRcdFx0Y2FzZSAnc2libGluZyc6XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0Y2FzZSAnYm9vbCc6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdGNhc2UgJ2VudW0nOlxuXHRcdFx0XHRyZXR1cm4gJzAnO1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICd0aW1lJzpcblx0XHRcdFx0cmV0dXJuIG1vbWVudC5pbnZhbGlkKCk7XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiBtb21lbnQuZHVyYXRpb24oKTtcblx0XHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0Y2FzZSAnbG9uZ3RleHQnOlxuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHRjYXNlICdjb2xvcic6XG5cdFx0XHRcdHJldHVybiAnIzAwMDAwMCc7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHQvLyBcdFx0XHRcdFx0ZW1haWxcblx0XHRcdC8vIFx0XHRcdFx0XHR1cmxcblx0XHRcdC8vIFx0XHRcdFx0XHRodG1sXG5cdFx0XHQvLyBcdFx0XHRcdFx0anNvblxuXHRcdFx0Ly8gXHRcdFx0XHRcdGRhdGFcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgaXNEZWZhdWx0VmFsdWUgKFxuXHRcdGNvbHVtblR5cGU6IHN0cmluZyxcblx0XHR2YWx1ZTogYW55LFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0Y29sdW1uVHlwZSxcblx0XHRcdHZhbHVlLFxuXHRcdFx0dGhpcy5nZXREZWZhdWx0VmFsdWUoY29sdW1uVHlwZSksXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBjbG9uZSAoXG5cdFx0Y29sdW1uVHlwZTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdCk6IGFueSB7XG5cdFx0c3dpdGNoIChjb2x1bW5UeXBlKSB7XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNsb25lRHVyYXRpb24odmFsdWUpO1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRcdHJldHVybiBtb21lbnQodmFsdWUpO1xuXHRcdFx0Y2FzZSAnanNvbic6XG5cdFx0XHRcdHJldHVybiBjb3B5KHZhbHVlKTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q2xvbmVGdW5jdGlvbiAoY29sdW1uVHlwZTogc3RyaW5nKSB7XG5cdFx0c3dpdGNoIChjb2x1bW5UeXBlKSB7XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNsb25lRHVyYXRpb247XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY2xvbmVEYXRlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuaWRlbnRpdHk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNsb25lRHVyYXRpb24gKGR1cmF0aW9uOiBtb21lbnQuRHVyYXRpb24pIHtcblx0XHRyZXR1cm4gbW9tZW50LmR1cmF0aW9uKGR1cmF0aW9uKTtcblx0fVxuXG5cdHB1YmxpYyBjbG9uZURhdGUgKGRhdGU6IG1vbWVudC5Nb21lbnQpOiBtb21lbnQuTW9tZW50IHtcblx0XHRyZXR1cm4gZGF0ZS5jbG9uZSgpO1xuXHR9XG5cblx0cHVibGljIGlkZW50aXR5PFQ+IChpbnB1dDogVCk6IFQge1xuXHRcdHJldHVybiBpbnB1dDtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpUmVzcG9uc2VQcm9jZXNzb3IgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0U2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdENvbHVtbk1hcCwgQXBpUmVxdWVzdEl0ZW1NYXAsIEFwaVJlcXVlc3RMaW1pdCwgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZVxufSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBBcGlSZXF1ZXN0U2VydmljZSB7XG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlSW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgYXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5OiBBcGlSZXNwb25zZVByb2Nlc3NvckZhY3Rvcnlcblx0KSB7XG5cblx0fVxuXG5cdHRlbXBsYXRlIChpdGVtVHlwZTogSXRlbVR5cGUsIHBhcmFtczogYW55KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UudGVtcGxhdGUoaXRlbVR5cGUsIHBhcmFtcykpO1xuXHR9XG5cblx0Y3JlYXRlIChpdGVtVHlwZTogSXRlbVR5cGUsIGl0ZW1JZDogSXRlbUlkLCB2YWx1ZXM6IGFueSwgcGFyZW50VHlwZT86IEl0ZW1UeXBlLCBwYXJlbnRJZD86IEl0ZW1JZCk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLmNyZWF0ZShpdGVtVHlwZSwgaXRlbUlkLCB2YWx1ZXMsIHBhcmVudFR5cGUsIHBhcmVudElkKSk7XG5cdH1cblxuXHRkZWxldGUgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgaXRlbUlkczogSXRlbUlkW10pOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHRoaXMuZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZS5kZWxldGUoaXRlbVR5cGUsIGl0ZW1JZHMpKTtcblx0fVxuXG5cdHVwZGF0ZUl0ZW1zIChpdGVtVHlwZTogSXRlbVR5cGUsIGl0ZW1zOiBBcGlSZXF1ZXN0SXRlbU1hcCwgY29sdW1uczogYW55KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UudXBkYXRlSXRlbXMoaXRlbVR5cGUsIGl0ZW1zLCBjb2x1bW5zKSk7XG5cdH1cblxuXHRyZXF1ZXN0U2tlbGV0b24gKHBhcmFtczogYW55LCByZXF1ZXN0Q2FuY2VsZXI/OiBQcm9taXNlSW50ZXJmYWNlPGFueT4pOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHRoaXMuZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZS5yZXF1ZXN0U2tlbGV0b24ocGFyYW1zLCByZXF1ZXN0Q2FuY2VsZXIpKTtcblx0fVxuXG5cdG1vdmVJdGVtcyAocGFyZW50VHlwZTogSXRlbVR5cGUsIHBhcmVudElkOiBJdGVtSWQsIGl0ZW1zOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBJdGVtSWRbXX0pOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHRoaXMuZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZS5tb3ZlSXRlbXMocGFyZW50VHlwZSwgcGFyZW50SWQsIGl0ZW1zKSk7XG5cdH1cblxuXHRjb2x1bW5zIChpdGVtVHlwZTogSXRlbVR5cGUsIGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5NYXAsIHBhcmFtcz86IGFueSk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLmNvbHVtbnMoaXRlbVR5cGUsIGNvbHVtbnMsIHBhcmFtcykpO1xuXHR9XG5cblx0cXVlcnkgKGl0ZW1UeXBlOiBJdGVtVHlwZSwgcXVlcnk6IGFueSwgY29sdW1uczogQXBpUmVxdWVzdENvbHVtbk1hcCwgbGltaXQ/OiBBcGlSZXF1ZXN0TGltaXQpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHRoaXMuZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZS5xdWVyeShpdGVtVHlwZSwgcXVlcnksIGNvbHVtbnMsIGxpbWl0KSk7XG5cdH1cblxuXHRwcm9jZXNzUmVzcG9uc2UgKHJlcXVlc3Q6IGFueSk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gcmVxdWVzdC50aGVuKChyZXNwb25zZTogYW55KSA9PiB0aGlzLmFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeS5jb25zdHJ1Y3QocmVzcG9uc2UpKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpRm9ybWF0dGVyIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBGaWVsZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSwgSXRlbVR5cGVNYXAsIFJlc3BvbnNlQ29sdW1uIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vLyB0b2RvW2NhY2hlXSBleHRlbmQgYmFzZSBjbGFzcyBwZXIgcmVxdWVzdCAoZGVsZXRlIGhhcyBkaWZmZXJlbnQgc3RydWN0dXJlKVxuZXhwb3J0IGNsYXNzIEFwaVJlc3BvbnNlUHJvY2Vzc29yIHtcblxuXHRwdWJsaWMgaXRlbVR5cGU6IEl0ZW1UeXBlO1xuXG5cdGNvbHVtbnM6IEl0ZW1UeXBlTWFwPFJlc3BvbnNlQ29sdW1uW10+O1xuXHRsaW5rczogSXRlbVR5cGVNYXA8SXRlbUlkW10+O1xuXHRjYWNoZWFibGU6IGJvb2xlYW47XG5cdG1hcDogYW55O1xuXG5cdGl0ZW1zOiBhbnk7XG5cblx0Y29sdW1uSW5kZXhNYXA6IHtcblx0XHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRcdFtjb2x1bW5JZDogc3RyaW5nXTogbnVtYmVyXG5cdFx0fVxuXHR9ID0ge307XG5cblx0Y29sdW1uTWFwOiBhbnkgPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHVibGljIGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdHB1YmxpYyByZXNwb25zZTogYW55LFxuXHQpIHtcblx0XHR0aGlzLmNvbHVtbnMgPSByZXNwb25zZS5jb2x1bW5zO1xuXHRcdHRoaXMuaXRlbXMgPSByZXNwb25zZS5pdGVtcztcblx0XHR0aGlzLmxpbmtzID0gcmVzcG9uc2UubGlua3M7XG5cdFx0dGhpcy5jYWNoZWFibGUgPSByZXNwb25zZS5jYWNoZWFibGU7XG5cdFx0dGhpcy5tYXAgPSByZXNwb25zZS5tYXA7XG5cdFx0dGhpcy5pdGVtVHlwZSA9IHJlc3BvbnNlLml0ZW1UeXBlO1xuXG5cdFx0dGhpcy5jcmVhdGVDb2x1bW5NYXBzKCk7XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZUNvbHVtbk1hcHMgKCkge1xuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gdGhpcy5jb2x1bW5zKSB7XG5cdFx0XHR0aGlzLmNvbHVtbkluZGV4TWFwW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdFx0dGhpcy5jb2x1bW5NYXBbaXRlbVR5cGVdID0ge307XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5zW2l0ZW1UeXBlXS5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnNbaXRlbVR5cGVdW2ldO1xuXG5cdFx0XHRcdHRoaXMuY29sdW1uSW5kZXhNYXBbaXRlbVR5cGVdW2NvbHVtbi5pZF0gPSBpO1xuXHRcdFx0XHR0aGlzLmNvbHVtbk1hcFtpdGVtVHlwZV1bY29sdW1uLmlkXSA9IGNvbHVtbjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hDb2x1bW5PYmplY3QgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IFJlc3BvbnNlQ29sdW1uIHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5NYXBbaXRlbVR5cGVdO1xuXHR9XG5cblx0cHVibGljIGZldGNoVmFsdWUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRjb2x1bW5JZDogc3RyaW5nLFxuXHQpIHtcblx0XHRpZiAodGhpcy5pdGVtc1tpdGVtVHlwZV1baXRlbUlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1uTWFwW2l0ZW1UeXBlXVtjb2x1bW5JZF07XG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLmNvbHVtbkluZGV4TWFwW2l0ZW1UeXBlXVtjb2x1bW5JZF07XG5cblx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuZm9ybWF0UmVzcG9uc2VWYWx1ZShcblx0XHRcdGNvbHVtbi50eXBlLFxuXHRcdFx0dGhpcy5pdGVtc1tpdGVtVHlwZV1baXRlbUlkXS5kYXRhW2luZGV4XSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoQ29sdW1uQXJyYXkgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IFJlc3BvbnNlQ29sdW1uW10ge1xuXHRcdGNvbnN0IHJlc3VsdDogUmVzcG9uc2VDb2x1bW5bXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBhcGlDb2x1bW4gb2YgdGhpcy5jb2x1bW5zW2l0ZW1UeXBlXSkge1xuXHRcdFx0cmVzdWx0LnB1c2goYXBpQ29sdW1uKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGZldGNoRGVyaXZlZE9iamVjdCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdHJvb3RDb2x1bW5zOiBSZXNwb25zZUNvbHVtbltdLFxuXHQpIHtcblx0XHRjb25zdCByZXN1bHQgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIHJvb3RDb2x1bW5zKSB7XG5cdFx0XHR0aGlzLmZldGNoRGVyaXZlZFZhbHVlcyhcblx0XHRcdFx0dGhpcy5mZXRjaFZhbHVlKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRjb2x1bW4uaWQsXG5cdFx0XHRcdCksXG5cdFx0XHRcdGNvbHVtbixcblx0XHRcdFx0cmVzdWx0LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGZldGNoRGVyaXZlZFZhbHVlcyAoXG5cdFx0dmFsdWU6IGFueSxcblx0XHRjb2x1bW46IFJlc3BvbnNlQ29sdW1uLFxuXHRcdGRlc3RpbmF0aW9uOiBhbnksXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgY2hpbGRDb2x1bW4gb2YgY29sdW1uLmNoaWxkcmVuKSB7XG5cdFx0XHRsZXQgY2hpbGRWYWx1ZTtcblxuXHRcdFx0aWYgKHZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdGNoaWxkVmFsdWUgPSBudWxsO1xuXHRcdFx0XHRkZXN0aW5hdGlvbltjaGlsZENvbHVtbi5wYXRoXSA9IHRoaXMuYXBpRm9ybWF0dGVyLmdldERlZmF1bHRWYWx1ZShjaGlsZENvbHVtbi5hcGlDb2x1bW4udHlwZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjaGlsZFZhbHVlID0gdGhpcy5mZXRjaFZhbHVlKFxuXHRcdFx0XHRcdGNvbHVtbi5pdGVtVHlwZSxcblx0XHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0XHRjaGlsZENvbHVtbi5pZCxcblx0XHRcdFx0KTtcblx0XHRcdFx0ZGVzdGluYXRpb25bY2hpbGRDb2x1bW4ucGF0aF0gPSBjaGlsZFZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2hpbGRDb2x1bW4uaXNMZWFmKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmZldGNoRGVyaXZlZFZhbHVlcyhcblx0XHRcdFx0Y2hpbGRWYWx1ZSxcblx0XHRcdFx0Y2hpbGRDb2x1bW4sXG5cdFx0XHRcdGRlc3RpbmF0aW9uLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hPYmplY3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogc3RyaW5nIHwgSXRlbUlkLFxuXHRcdGluY2x1ZGVMaW5rczogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAodGhpcy5pdGVtc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtID0gdGhpcy5pdGVtc1tpdGVtVHlwZV1baXRlbUlkXTtcblxuXHRcdGlmIChpdGVtID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGF0YSA9IHRoaXMuaXRlbXNbaXRlbVR5cGVdW2l0ZW1JZF0uZGF0YTtcblx0XHRjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnNbaXRlbVR5cGVdW2ldO1xuXG5cdFx0XHRpZiAodGhpcy5hcGlGb3JtYXR0ZXIuaXNFeHBlbnNpdmVGb3JtYXQoY29sdW1uLnR5cGUpKSB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcblx0XHRcdFx0XHRyZXN1bHQsXG5cdFx0XHRcdFx0Y29sdW1uLmlkLFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRzZXQ6XG5cdFx0XHRcdFx0XHRcdHZhbHVlID0+IHtcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgcmVzdWx0W2NvbHVtbi5pZF07XG5cblx0XHRcdFx0XHRcdFx0XHRyZXN1bHRbY29sdW1uLmlkXSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSByZXN1bHRbY29sdW1uLmlkXTtcblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0W2NvbHVtbi5pZF0gPSB0aGlzLmFwaUZvcm1hdHRlci5mb3JtYXRSZXNwb25zZVZhbHVlKFxuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbi50eXBlLFxuXHRcdFx0XHRcdFx0XHRcdGRhdGFbaV0sXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXN1bHRbY29sdW1uLmlkXSA9IHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlc3BvbnNlVmFsdWUoXG5cdFx0XHRcdFx0Y29sdW1uLnR5cGUsXG5cdFx0XHRcdFx0ZGF0YVtpXSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaW5jbHVkZUxpbmtzKSB7XG5cdFx0XHRjb25zdCBsaW5rcyA9IHRoaXMuaXRlbXNbaXRlbVR5cGVdW2l0ZW1JZF0ubGlua3M7XG5cdFx0XHRyZXN1bHQuX19saW5rcyA9IHt9O1xuXG5cdFx0XHRmb3IgKGNvbnN0IGxpbmtUeXBlIGluIGxpbmtzKSB7XG5cdFx0XHRcdHJlc3VsdC5fX2xpbmtzW2xpbmtUeXBlXSA9XG5cdFx0XHRcdFx0dGhpcy5mZXRjaE9iamVjdEFycmF5KFxuXHRcdFx0XHRcdFx0bGlua1R5cGUsXG5cdFx0XHRcdFx0XHRpbmNsdWRlTGlua3MsXG5cdFx0XHRcdFx0XHRsaW5rc1tsaW5rVHlwZV0sXG5cdFx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGZldGNoT2JqZWN0QXJyYXk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGluY2x1ZGVMaW5rcz86IGJvb2xlYW4sXG5cdFx0aWRBcnJheT86IEl0ZW1JZFtdIHwgbnVsbCxcblx0KTogQXJyYXk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IHJlc3VsdDogYW55W10gPSBbXTtcblxuXHRcdGlmIChpZEFycmF5ID09PSBudWxsKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiB0aGlzLml0ZW1zW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaCh0aGlzLmZldGNoT2JqZWN0KFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRpbmNsdWRlTGlua3MsXG5cdFx0XHRcdCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGlmIChpZEFycmF5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGlkQXJyYXkgPSB0aGlzLmxpbmtzW2l0ZW1UeXBlXTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiBpZEFycmF5KSB7XG5cdFx0XHRyZXN1bHQucHVzaCh0aGlzLmZldGNoT2JqZWN0KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRpbmNsdWRlTGlua3MsXG5cdFx0XHQpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGZldGNoQ29sdW1uc09iamVjdCAoKToge1tpdGVtVHlwZTogc3RyaW5nXTogUmVzcG9uc2VDb2x1bW59IHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5NYXA7XG5cdH1cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBFbnRyeVBhcmVudCwgSXRlbUVudHJ5TWFwLCBJdGVtTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgSW50ZXJuYWxDcmVhdGVEZWx0YSB9IGZyb20gJy4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuXG5pbXBvcnQgeyBjcmVhdGVQYXRoIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IHR5cGUgQ3JlYXRlQ29tcGlsYXRpb24gPSB7XG5cdFtwYXJlbnRUeXBlOiBzdHJpbmddOiB7XG5cdFx0W3BhcmVudElkOiBudW1iZXJdOiBJdGVtTWFwPEludGVybmFsQ3JlYXRlRGVsdGE+XG5cdH1cbn07XG5cbmV4cG9ydCB0eXBlIERlbGV0ZUNvbXBpbGF0aW9uID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZT4+XG59O1xuXG5leHBvcnQgdHlwZSBVcGRhdGVDb21waWxhdGlvbiA9IEl0ZW1FbnRyeU1hcDxJdGVtVHlwZT47XG5cbmV4cG9ydCB0eXBlIE1vdmVDb21waWxhdGlvbiA9IHtcblx0W3BhcmVudFR5cGU6IHN0cmluZ106IHtcblx0XHRbcGFyZW50SWQ6IG51bWJlcl06IEl0ZW1FbnRyeVtdXG5cdH1cbn07XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VzQ29tcGlsYXRpb24ge1xuXG5cdGNvbXBpbGF0aW9uOiB7XG5cdFx0Y3JlYXRlOiBDcmVhdGVDb21waWxhdGlvbixcblx0XHRkZWxldGU6IERlbGV0ZUNvbXBpbGF0aW9uLFxuXHRcdHVwZGF0ZTogVXBkYXRlQ29tcGlsYXRpb24sXG5cdFx0bW92ZTogTW92ZUNvbXBpbGF0aW9uXG5cdH0gPSB7XG5cdFx0Y3JlYXRlOiB7fSxcblx0XHRkZWxldGU6IHt9LFxuXHRcdHVwZGF0ZToge30sXG5cdFx0bW92ZToge30sXG5cdH07XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHRoaXMucHJvY2Vzc0RlbHRhKCk7XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NEZWx0YSAoKTogdm9pZCB7XG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy50cmFuc2FjdGlvbi5nZXREZWx0YSgpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBjaGFuZ2VzRGVsdGEuZGVsZXRlZCkge1xuXHRcdFx0Y29uc3QgZW50cmllc1RvQmVEZWxldGVkID0gY2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBlbnRyaWVzVG9CZURlbGV0ZWQpIHtcblx0XHRcdFx0aWYgKGl0ZW1FbnRyeS5pc0xvY2FsKCkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYWRkRGVsZXRlRW50cnkoXG5cdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gY2hhbmdlc0RlbHRhLmNyZWF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gY2hhbmdlc0RlbHRhLmNyZWF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHR0aGlzLmFkZENyZWF0ZUVudHJ5KHR1cGxlKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGNoYW5nZXNEZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGNoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0dGhpcy5hZGRVcGRhdGVFbnRyeSh0dXBsZS5lbnRyeSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBjaGFuZ2VzRGVsdGEubW92ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gY2hhbmdlc0RlbHRhLm1vdmVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0dGhpcy5hZGRNb3ZlRW50cnkoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHR0dXBsZS50byxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXREZWZhdWx0UGFyZW50ICgpOiBFbnRyeVBhcmVudCB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGl0ZW1UeXBlOiAnVm9pZCcsXG5cdFx0XHRpdGVtSWQ6IDAsXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgYWRkTW92ZUVudHJ5IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHRuZXdQYXJlbnQ6IEVudHJ5UGFyZW50LFxuXHQpOiB2b2lkIHtcblx0XHRjcmVhdGVQYXRoPEl0ZW1FbnRyeVtdPihcblx0XHRcdHRoaXMuY29tcGlsYXRpb24ubW92ZSxcblx0XHRcdFtcblx0XHRcdFx0bmV3UGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0XHRuZXdQYXJlbnQuaXRlbUlkLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0e30sXG5cdFx0XHRcdFtdLFxuXHRcdFx0XSxcblx0XHQpXG5cdFx0XHQucHVzaChpdGVtRW50cnkpO1xuXHR9XG5cblx0cHJpdmF0ZSBhZGREZWxldGVFbnRyeSAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGU+LFxuXHQpOiB2b2lkIHtcblx0XHRjcmVhdGVQYXRoPEl0ZW1FbnRyeVtdPihcblx0XHRcdHRoaXMuY29tcGlsYXRpb24uZGVsZXRlLFxuXHRcdFx0W1xuXHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRdLFxuXHRcdFx0W1xuXHRcdFx0XHRbXSxcblx0XHRcdF0sXG5cdFx0KVxuXHRcdFx0LnB1c2goXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFkZFVwZGF0ZUVudHJ5IChpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZT4pOiB2b2lkIHtcblx0XHRjcmVhdGVQYXRoKFxuXHRcdFx0dGhpcy5jb21waWxhdGlvbi51cGRhdGUsXG5cdFx0XHRbXG5cdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1JZCxcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRdLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFkZENyZWF0ZUVudHJ5IChjcmVhdGVEZWx0YTogSW50ZXJuYWxDcmVhdGVEZWx0YSk6IHZvaWQge1xuXHRcdGxldCBwYXJlbnQgPSB0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChjcmVhdGVEZWx0YS5lbnRyeSk7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRwYXJlbnQgPSB0aGlzLmdldERlZmF1bHRQYXJlbnQoKTtcblx0XHR9XG5cblx0XHRjcmVhdGVQYXRoKFxuXHRcdFx0dGhpcy5jb21waWxhdGlvbi5jcmVhdGUsXG5cdFx0XHRbXG5cdFx0XHRcdHBhcmVudC5pdGVtVHlwZSxcblx0XHRcdFx0cGFyZW50Lml0ZW1JZCxcblx0XHRcdFx0Y3JlYXRlRGVsdGEuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdGNyZWF0ZURlbHRhLmVudHJ5Lml0ZW1JZCxcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0e30sXG5cdFx0XHRcdGNyZWF0ZURlbHRhLFxuXHRcdFx0XSxcblx0XHQpO1xuXHR9XG5cbn1cbiIsImltcG9ydCB7XG5cdEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRDaGFuZ2VzQ29tcGlsYXRpb24sXG5cdENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdENvbHVtbkluZm8sXG5cdERlbGV0ZUNvbXBpbGF0aW9uLFxuXHRoYXNQcm9wZXJ0aWVzLFxuXHRJdGVtRW50cnlTZXJ2aWNlLFxuXHRNb3ZlQ29tcGlsYXRpb24sXG5cdFNlcnZlckNhY2hlLFxuXHRVcGRhdGVDb21waWxhdGlvbixcbn0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQge1xuXHRDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRDcmVhdGVSZXF1ZXN0RmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RNb3ZlSXRlbXMsXG5cdEFwaVJlc3BvbnNlLFxuXHRDcmVhdGVSZXF1ZXN0RW50cnksXG5cdEZpZWxkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1UeXBlLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuaW1wb3J0IHsgZ2V0UGF0aCwgaW5BcnJheSB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCB0eXBlIE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayA9IChjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwKSA9PiB2b2lkO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRXhlY3V0ZXMgdGhlIGNoYW5nZXMgZnJvbSBhIHNwZWNpZmljIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIHRyYW5zYWN0aW9ufSBhbmQgcmV0dXJucyBhIHtAbGluayBDaGFuZ2VzRGVsdGEgQ2hhbmdlc0RlbHRhfVxuICovXG5leHBvcnQgY2xhc3MgQ2hhbmdlc1Byb2Nlc3NvciB7XG5cblx0cHJpdmF0ZSBpdGVtSWRDb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwID0ge307XG5cdHByaXZhdGUgc2VydmVyQ2FjaGU6IFNlcnZlckNhY2hlID0gdGhpcy50cmFuc2FjdGlvbi5nZXRTZXJ2ZXJDYWNoZSgpO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uRXhwYW5zaW9uRmFjdG9yeTogQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNyZWF0ZVJlcXVlc3RGYWN0b3J5OiBDcmVhdGVSZXF1ZXN0RmFjdG9yeSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRwcml2YXRlIGJyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0cHJpdmF0ZSBvbkFmdGVyQ3JlYXRlQ2FsbGJhY2s/OiBPbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdCkge1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBFeGVjdXRlcyB0aGUgcmVxdWVzdHMgaW4gdGhlIG9yZGVyIG9mOlxuXHQgKiAxLiBjcmVhdGVcblx0ICogMi4gbW92ZVxuXHQgKiAzLiBkZWxldGVcblx0ICogNC4gdXBkYXRlXG5cdCAqL1xuXHRwdWJsaWMgZXhlY3V0ZSAoKTogUHJvbWlzZUludGVyZmFjZTxJdGVtSWRDb252ZXJzaW9uTWFwPiB7XG5cdFx0Y29uc3QgY2hhbmdlc0NvbXBpbGF0aW9uID0gdGhpcy5jaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24sXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbXBpbGF0aW9uID0gY2hhbmdlc0NvbXBpbGF0aW9uLmNvbXBpbGF0aW9uO1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5leGVjdXRlQ3JlYXRlUmVxdWVzdHMoY2hhbmdlc0NvbXBpbGF0aW9uKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHRoaXMuZXhlY3V0ZU1vdmVSZXF1ZXN0cyhjb21waWxhdGlvbi5tb3ZlKSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHRoaXMuZXhlY3V0ZVVwZGF0ZVJlcXVlc3RzKGNvbXBpbGF0aW9uLnVwZGF0ZSksXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB0aGlzLmV4ZWN1dGVEZWxldGVSZXF1ZXN0cyhjb21waWxhdGlvbi5kZWxldGUpLFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gdGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBidWlsZE1vdmVSZXF1ZXN0IChjb21waWxhdGlvbkVudHJpZXM6IEl0ZW1FbnRyeVtdKTogQXBpUmVxdWVzdE1vdmVJdGVtcyB7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcGlSZXF1ZXN0TW92ZUl0ZW1zID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBjb21waWxhdGlvbkVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1UeXBlID0gaXRlbUVudHJ5Lml0ZW1UeXBlO1xuXG5cdFx0XHRpZiAocmVzdWx0W2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJlc3VsdFtpdGVtVHlwZV0gPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0cmVzdWx0W2l0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeS5pdGVtSWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIGdldE1hcFZhbHVlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0bWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwID0gdGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiBJdGVtSWQgfCB1bmRlZmluZWQge1xuXHRcdGlmIChtYXAgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAobWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdH1cblxuXHRwcml2YXRlIGV4ZWN1dGVDcmVhdGVSZXF1ZXN0cyAoXG5cdFx0Y2hhbmdlc0NvbXBpbGF0aW9uOiBDaGFuZ2VzQ29tcGlsYXRpb24sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8YW55W10+IHtcblx0XHRjb25zdCByZXF1ZXN0cyA9IHRoaXMuY3JlYXRlUmVxdWVzdEZhY3Rvcnlcblx0XHRcdC5jb25zdHJ1Y3QoXG5cdFx0XHRcdGNoYW5nZXNDb21waWxhdGlvbi5jb21waWxhdGlvbi5jcmVhdGUsXG5cdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24sXG5cdFx0XHRcdHRoaXMuYnJlYWtVcEJ5UGFyZW50LFxuXHRcdFx0KVxuXHRcdFx0LnJ1bigpO1xuXG5cdFx0Y29uc3QgcmVzcG9uc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPGFueT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgcmVxdWVzdHMpIHtcblx0XHRcdHJlc3BvbnNlcy5wdXNoKFxuXHRcdFx0XHR0aGlzXG5cdFx0XHRcdFx0LmV4ZWN1dGVDcmVhdGVSZXF1ZXN0KHJlcXVlc3QpXG5cdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRyZXN1bHQgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5vbkFmdGVyQ3JlYXRlQ2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMub25BZnRlckNyZWF0ZUNhbGxiYWNrKHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcCk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocmVzcG9uc2VzKTtcblx0fVxuXG5cdC8vIHRvZG9bY2FjaGVdIHRlc3QgY3JlYXRlIHJlcXVlc3RzXG5cdHByaXZhdGUgZXhlY3V0ZUNyZWF0ZVJlcXVlc3QgKFxuXHRcdHJlcXVlc3RSZXNvdXJjZTogQ3JlYXRlUmVxdWVzdEVudHJ5PGFueT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLnJlcXVlc3RTa2VsZXRvbihyZXF1ZXN0UmVzb3VyY2UucmVxdWVzdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2VNYXAgPSByZXNwb25zZS5tYXA7XG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW5zID0gcmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCk7XG5cdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJpZXMgPSByZXF1ZXN0UmVzb3VyY2UuaXRlbXM7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSB0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0cmVxdWVzdFJlc291cmNlLnJlcXVlc3QuY29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGl0ZW1FbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBpdGVtRW50cnkgPSBpdGVtRW50cmllc1tpdGVtVHlwZV1baXRlbUlkXTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3SXRlbUlkID0gdGhpcy5nZXRNYXBWYWx1ZShcblx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRwYXJzZUludChcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdFx0XHRcdDEwLFxuXHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VNYXAsXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKG5ld0l0ZW1JZCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHRcdFx0XHRcdFx0J0NyZWF0ZSBmYWlsZWQhJyxcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB3ZSdyZSBzdXJlIHRoZSBlbnRyeSBleGlzdHMsIGJlY2F1c2Ugb3RoZXJ3aXNlIHlvdSBjb3VsZG4ndCBzYXZlIGl0IGluIHRoZSBmaXJzdCBwbGFjZVxuXHRcdFx0XHRcdFx0XHRjb25zdCBsb2NhbEl0ZW1FbnRyeSA9IHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZW50cmllcy5nZXQoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0XHQpITtcblxuXHRcdFx0XHRcdFx0XHRsb2NhbEl0ZW1FbnRyeS5pdGVtSWQgPSBuZXdJdGVtSWQ7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5zZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tsb2NhbEl0ZW1FbnRyeS5pZF0gPSB0aGlzLnNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLmNvcHlUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMoXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tsb2NhbEl0ZW1FbnRyeS5pZF0sXG5cdFx0XHRcdFx0XHRcdFx0bG9jYWxJdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5zZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmFkZChsb2NhbEl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5lbnRyaWVzLmNsZWFyQnlJdGVtSWQoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0TnVtYmVyKGl0ZW1JZCksXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5zZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5wcm9jZXNzQXBpUmVzcG9uc2UoXG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHROdW1iZXIobmV3SXRlbUlkKSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnkuY29sdW1ucyxcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW5FeHBhbnNpb24sXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gZXh0ZW5kIGNvbnZlcnNpb24gbWFwXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiByZXNwb25zZU1hcCkge1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1JZENvbnZlcnNpb25NYXBbaXRlbVR5cGVdID0ge307XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIHJlc3BvbnNlTWFwW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1JZENvbnZlcnNpb25NYXBbaXRlbVR5cGVdW2l0ZW1JZF0gPSByZXNwb25zZU1hcFtpdGVtVHlwZV1baXRlbUlkXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy50b0FycmF5KCk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25FbnRyeSBvZiBjb2xsZWN0aW9uRW50cmllcykge1xuXHRcdFx0XHRcdFx0Y29uc3QgcGFyZW50ID0gY29sbGVjdGlvbkVudHJ5LnBhcmVudDtcblxuXHRcdFx0XHRcdFx0aWYgKHBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdQYXJlbnRJZCA9IHRoaXMuZ2V0TWFwVmFsdWUoXG5cdFx0XHRcdFx0XHRcdFx0cGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdHBhcmVudC5pdGVtSWQsXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKG5ld1BhcmVudElkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRwYXJlbnQuaXRlbUlkID0gbmV3UGFyZW50SWQ7XG5cblx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkoXG5cdFx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkub3B0aW9ucyxcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IHVwZGF0ZWRDb2x1bW5zOiB7W2NvbHVtbklkOiBzdHJpbmddOiBDb2x1bW5JbmZvPGFueT59ID1cblx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LmdldFVwZGF0ZWRJdGVtQ29sdW1ucyh0aGlzLml0ZW1JZENvbnZlcnNpb25NYXApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIWhhc1Byb3BlcnRpZXModXBkYXRlZENvbHVtbnMpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAodXBkYXRlZENvbHVtbnMuaWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLm9uSXRlbUVudHJpZXNDcmVhdGVkKFxuXHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1JZENvbnZlcnNpb25NYXBbY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlXSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlVXBkYXRlUmVxdWVzdHMgKFxuXHRcdGNvbXBpbGF0aW9uOiBVcGRhdGVDb21waWxhdGlvbixcblx0KSB7XG5cdFx0Y29uc3QgcmVxdWVzdHM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2U+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBjb21waWxhdGlvbikge1xuXHRcdFx0cmVxdWVzdHMucHVzaChcblx0XHRcdFx0dGhpcy5leGVjdXRlVXBkYXRlUmVxdWVzdChcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRjb21waWxhdGlvbltpdGVtVHlwZV0sXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChyZXF1ZXN0cyk7XG5cdH1cblxuXHRwcml2YXRlIGV4ZWN1dGVVcGRhdGVSZXF1ZXN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtRW50cmllczoge1tpdGVtSWQ6IG51bWJlcl06IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+fSxcblx0KSB7XG5cdFx0Y29uc3QgcmVxdWVzdDoge1tpdGVtVHlwZTogc3RyaW5nXToge1tpdGVtSWQ6IG51bWJlcl06IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT59fSA9IHt9O1xuXHRcdGNvbnN0IHJlcXVlc3RDb2x1bW5zID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdC8vIHRvZG9bY2FjaGVdIHZlcmlmeSBpZiB3ZSBzaG91bGQgY2FsbCBnZXRDb2xsZWN0aW9uTWF0Y2hlciBvbiBTZXJ2ZXJDYWNoZSBvciBUcmFuc2FjdGlvbkNhY2hlXG5cdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXIgPSB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmdldENvbGxlY3Rpb25NYXRjaGVyKCk7XG5cblx0XHRyZXF1ZXN0W2l0ZW1UeXBlXSA9IHt9O1xuXG5cdFx0Ly8gd2UgbmVlZCB0byBkbyB0aGUgZm9ybWF0UmVxdWVzdCBjYWxsIGhlcmUgKGZpZWxkcyBtaWdodCBoYXZlIGJlZW4gdXBkYXRlZClcblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBpdGVtRW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gaXRlbUVudHJpZXNbaXRlbUlkXTtcblx0XHRcdGNvbnN0IGl0ZW1SZXF1ZXN0OiBhbnkgPSByZXF1ZXN0W2l0ZW1UeXBlXVtpdGVtSWRdID0ge307XG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJzID0gZ2V0UGF0aChcblx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi50YWJSZXF1ZXN0UGFyYW1ldGVycyxcblx0XHRcdFx0W1xuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XSxcblx0XHRcdCk7XG5cblx0XHRcdGl0ZW1SZXF1ZXN0LnZhbHVlcyA9IHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZm9ybWF0UmVxdWVzdChpdGVtRW50cnkpO1xuXG5cdFx0XHRpZiAocGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGl0ZW1SZXF1ZXN0LnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucy5leHBhbmQoaXRlbUVudHJ5LmNvbHVtbnMpO1xuXG5cdFx0XHQvLyB0b2RvW2NhY2hlXSB0ZXN0XG5cdFx0XHRjb2xsZWN0aW9uTWF0Y2hlci5leHBhbmQoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdLmNoYW5nZXMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25zV2l0aEZpdHRpbmdJdGVtcyA9IGNvbGxlY3Rpb25NYXRjaGVyLmdldENvbGxlY3Rpb25zV2l0aEZpdHRpbmdJdGVtcygpO1xuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uIG9mIGNvbGxlY3Rpb25zV2l0aEZpdHRpbmdJdGVtcykge1xuXHRcdFx0cmVxdWVzdENvbHVtbnMuZXhwYW5kKGNvbGxlY3Rpb24uY29sdW1ucyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYXBpUmVxdWVzdENvbHVtbnMgPSByZXF1ZXN0Q29sdW1ucy5nZXQoKTtcblxuXHRcdHJldHVybiB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHQudXBkYXRlSXRlbXMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRyZXF1ZXN0LFxuXHRcdFx0XHRhcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB0aGlzLnNlcnZlckNhY2hlLnByb2Nlc3NSZXNwb25zZShcblx0XHRcdFx0XHRyZXNwb25zZSxcblx0XHRcdFx0XHRhcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHQpLFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlRGVsZXRlUmVxdWVzdHMgKFxuXHRcdGNvbXBpbGF0aW9uOiBEZWxldGVDb21waWxhdGlvbixcblx0KSB7XG5cdFx0Y29uc3QgcmVxdWVzdHM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8dm9pZD4+ID0gW107XG5cblx0XHQvLyBjbGVhcmluZyBub3QgbmVjZXNzYXJ5XG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBjb21waWxhdGlvbikge1xuXHRcdFx0cmVxdWVzdHMucHVzaChcblx0XHRcdFx0dGhpcy5leGVjdXRlRGVsZXRlUmVxdWVzdChcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRjb21waWxhdGlvbltpdGVtVHlwZV0sXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChyZXF1ZXN0cyk7XG5cdH1cblxuXHRwcml2YXRlIGV4ZWN1dGVEZWxldGVSZXF1ZXN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHQpIHtcblx0XHRyZXR1cm4gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LmRlbGV0ZShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1FbnRyaWVzLm1hcChcblx0XHRcdFx0XHRlbnRyeSA9PiBlbnRyeS5pdGVtSWQsXG5cdFx0XHRcdCksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3RJbnRlcm5hbERlbHRhKCk7XG5cblx0XHRcdFx0XHRjb25zdCByZXNwb25zZUlkQXJyYXkgPSByZXNwb25zZS5pdGVtcztcblx0XHRcdFx0XHRjb25zdCBpdGVtRW50cmllc1RvQmVEZWxldGVkOiBJdGVtRW50cnlbXSA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0IWluQXJyYXkoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1JZCxcblx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZUlkQXJyYXksXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdFx0XHRcdFx0J0RlbGV0ZSBmYWlsZWQhJyxcblx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGl0ZW1FbnRyaWVzVG9CZURlbGV0ZWQucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtc0RlbGV0ZWQoaXRlbUVudHJpZXNUb0JlRGVsZXRlZCk7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50KFxuXHRcdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlTW92ZVJlcXVlc3RzIChcblx0XHRjb21waWxhdGlvbjogTW92ZUNvbXBpbGF0aW9uLFxuXHQpIHtcblx0XHRjb25zdCByZXF1ZXN0czogQXJyYXk8UHJvbWlzZUludGVyZmFjZTx2b2lkPj4gPSBbXTtcblxuXHRcdGNvbnN0IGV4ZWN1dGVNb3ZlUmVxdWVzdCA9IChcblx0XHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdFx0cGFyZW50SWQ6IEl0ZW1JZCxcblx0XHQpID0+IHtcblx0XHRcdC8vIG9ubHkgdGhlIHBhcmVudCBpZCBjb3VsZCBoYXZlIGJlZW4gdXBkYXRlZFxuXHRcdFx0Y29uc3QgY29tcGlsYXRpb25FbnRyaWVzID0gY29tcGlsYXRpb25bcGFyZW50VHlwZV1bcGFyZW50SWRdO1xuXHRcdFx0Y29uc3QgbmV3UGFyZW50SWQgPSB0aGlzLmdldE1hcFZhbHVlKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRwYXJlbnRJZCxcblx0XHRcdCk7XG5cblx0XHRcdHJlcXVlc3RzLnB1c2goXG5cdFx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdFx0XHQubW92ZUl0ZW1zKFxuXHRcdFx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0XHRcdG5ld1BhcmVudElkICE9PSB1bmRlZmluZWQgPyBuZXdQYXJlbnRJZCA6IHBhcmVudElkLFxuXHRcdFx0XHRcdFx0dGhpcy5idWlsZE1vdmVSZXF1ZXN0KGNvbXBpbGF0aW9uRW50cmllcyksXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0SW50ZXJuYWxEZWx0YSgpO1xuXG5cdFx0XHRcdFx0XHRcdC8vIHRvZG9bY2FjaGVdIHdoeSBkb24ndCB3ZSB1c2UgdGhlIHJlc3BvbnNlID9cblx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgY29tcGlsYXRpb25FbnRyaWVzKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudChcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1UeXBlOiBwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1JZDogbmV3UGFyZW50SWQgIT09IHVuZGVmaW5lZCA/IG5ld1BhcmVudElkIDogcGFyZW50SWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnNlcnZlckNhY2hlLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQoXG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH07XG5cblx0XHRmb3IgKGNvbnN0IHBhcmVudFR5cGUgaW4gY29tcGlsYXRpb24pIHtcblx0XHRcdGZvciAoY29uc3QgcGFyZW50SWQgaW4gY29tcGlsYXRpb25bcGFyZW50VHlwZV0pIHtcblx0XHRcdFx0ZXhlY3V0ZU1vdmVSZXF1ZXN0KFxuXHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0K3BhcmVudElkLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChyZXF1ZXN0cyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IGluc3RhbnRpYXRlT3B0aW9ucyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbk1hcCwgQXBpUmVxdWVzdENvbHVtbnMsIEVudHJ5UGFyZW50TnVsbCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgSXRlbUVudHJ5T3B0aW9uc0ludGVyZmFjZSA9IFBhcnRpYWw8SXRlbUVudHJ5T3B0aW9ucz47XG5cbmV4cG9ydCBjbGFzcyBJdGVtRW50cnlPcHRpb25zIHtcblx0cHVibGljIGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zID0gdHJ1ZTtcblx0cHVibGljIHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbDtcblx0cHVibGljIHRlbXBsYXRlT3B0aW9uczogYW55ID0ge307IC8vIFRPRE9cblx0cHVibGljIHRlbXBsYXRlQ29sdW1uczogQXBpUmVxdWVzdENvbHVtbk1hcCA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yICh2YWx1ZXM6IEl0ZW1FbnRyeU9wdGlvbnNJbnRlcmZhY2UpIHtcblx0XHRpbnN0YW50aWF0ZU9wdGlvbnMoXG5cdFx0XHR0aGlzLFxuXHRcdFx0dmFsdWVzLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IGluc3RhbnRpYXRlT3B0aW9ucyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgT25DaGFuZ2VGdW5jdGlvbiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEl0ZW1SZXNvdXJjZSB9IGZyb20gJy4vSXRlbVJlc291cmNlJztcblxuZXhwb3J0IHR5cGUgSXRlbVJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtUmVzb3VyY2VUeXBlIGV4dGVuZHMgSXRlbVJlc291cmNlPGFueT4gPSBJdGVtUmVzb3VyY2U8YW55Pj4gPSBQYXJ0aWFsPEl0ZW1SZXNvdXJjZU9wdGlvbnM8SXRlbVJlc291cmNlVHlwZT4+O1xuXG5leHBvcnQgY2xhc3MgSXRlbVJlc291cmNlT3B0aW9uczxJdGVtUmVzb3VyY2VUeXBlIGV4dGVuZHMgSXRlbVJlc291cmNlPGFueT4gPSBJdGVtUmVzb3VyY2U8YW55Pj4ge1xuXHRwdWJsaWMgZWRpdDogYm9vbGVhbiA9IGZhbHNlO1xuXHRwdWJsaWMgcmVtb3RlOiBib29sZWFuID0gZmFsc2U7XG5cdHB1YmxpYyBvbkNoYW5nZTogT25DaGFuZ2VGdW5jdGlvbjxJdGVtUmVzb3VyY2VUeXBlPiA9IG5vb3A7XG5cblx0Y29uc3RydWN0b3IgKHZhbHVlczogSXRlbVJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtUmVzb3VyY2VUeXBlPikge1xuXHRcdGluc3RhbnRpYXRlT3B0aW9ucyh0aGlzLCB2YWx1ZXMpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5TZXQgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxubGV0IGN1cnJlbnRJZCA9IDA7XG5cbmV4cG9ydCBjbGFzcyBJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblxuXHRwdWJsaWMgaWQ6IG51bWJlciA9ICsrY3VycmVudElkO1xuXHRwdWJsaWMgcmVsb2FkUXVldWVkOiBib29sZWFuID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgZmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeSxcblx0XHRwdWJsaWMgaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRwdWJsaWMgaXRlbUlkOiBJdGVtSWQsXG5cdFx0cHVibGljIGNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+LFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBxdWV1ZVJlbG9hZCAoKTogdGhpcyB7XG5cdFx0dGhpcy5yZWxvYWRRdWV1ZWQgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgaXNMb2NhbCAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZmFjdG9yeS5rZXlTZXJ2aWNlLmlzTG9jYWxJZCh0aGlzLml0ZW1JZCk7XG5cdH1cblxuXHRwdWJsaWMgaXNMb2NrYWJsZSAoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuaXNMb2NhbCgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c3dpdGNoICh0aGlzLml0ZW1UeXBlKSB7XG5cdFx0XHRjYXNlICdQcm9qZWN0Jzpcblx0XHRcdGNhc2UgJ01hdGVyaWFhbCc6XG5cdFx0XHRjYXNlICdDb250YWN0Jzpcblx0XHRcdGNhc2UgJ01lZGV3ZXJrZXInOlxuXHRcdFx0Y2FzZSAnVm9lcnR1aWcnOlxuXHRcdFx0Y2FzZSAnVGVtcGxhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgdG9KU09OICgpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aWQ6IHRoaXMuaWQsXG5cdFx0XHRjb2x1bW5zOiB0aGlzLmNvbHVtbnMsXG5cdFx0fTtcblx0fVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlUGF0aCwgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgSXRlbVJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZU9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnROdWxsLCBGaWVsZE1hcCwgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiB7XG5cblx0cHVibGljIGNvbHVtbnM6IHtbY29sdW1uSWQ6IHN0cmluZ106IFJlc3BvbnNlQ29sdW1ufTtcblx0cHVibGljIGZpZWxkczogUmVhZG9ubHk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj47XG5cdHB1YmxpYyBpbml0aWFsOiBSZWFkb25seTxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PjtcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdHByb3RlY3RlZCByZWFkb25seSBmYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHB1YmxpYyByZWFkb25seSBlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0cHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IEl0ZW1SZXNvdXJjZU9wdGlvbnM8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+LFxuXHRcdHByb3RlY3RlZCByZWFkb25seSBfaXNOZXc6IGJvb2xlYW4sXG5cdFx0cHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHR0aGlzLmNvbHVtbnMgPSBlbnRyeS5jb2x1bW5zLnJlc3BvbnNlW2VudHJ5LmNvbHVtbnMuaXRlbVR5cGVdO1xuXHRcdHRoaXMuaW5pdGlhbCA9IHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbZW50cnkuaWRdLmluaXRpYWw7XG5cblx0XHR0aGlzLm9uQ29uc3RydWN0KCk7XG5cdH1cblxuXHQvLyBVc2VkIGZvciByZXNvdXJjZSBjbGVhcmluZyB0ZXN0c1xuXHRwdWJsaWMgb25Db25zdHJ1Y3QgKCk6IHZvaWQge1xuXG5cdH1cblxuXHQvKipcblx0ICogRmV0Y2hlcyB0aGUgSXRlbVJlc291cmNlJ3MgcGFyZW50IHdpdGggdGhlIGN1cnJlbnQgZmllbGRzXG5cdCAqXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS1cblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBVc2UgdGhpcyBpZiB5b3UgbmVlZCB0byBnZXQgdGhlIHBhcmVudCBhZnRlciBhbiBpdGVtIGhhcyBiZWVuIGRlbGV0ZWRcblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnQgKFxuXHRcdGZyb21Jbml0aWFsPzogYm9vbGVhbixcblx0KTogRW50cnlQYXJlbnROdWxsIHtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoXG5cdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0ZnJvbUluaXRpYWwsXG5cdFx0XHR0aGlzLmZpZWxkcyxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFVzZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSB0cmFuc2FjdGlvbi5hcHBseUNoYW5nZXNEZWx0YX0gaW5zdGVhZFxuXHQgKi9cblx0cHVibGljIGNhbGxPbkNoYW5nZSAocHJldmlvdXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4pOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZXMgPSB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLml0ZW1SZXNvdXJjZXNbdGhpcy5lbnRyeS5pZF07XG5cblx0XHRpZiAocmVzb3VyY2VzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0cmVzb3VyY2Uub3B0aW9ucy5vbkNoYW5nZShcblx0XHRcdFx0XHRcdHJlc291cmNlLFxuXHRcdFx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHRcdFx0XHRjb2x1bW5JZCA9PiB0aGlzLmNvbXBhcmVJdGVtRmllbGQoXG5cdFx0XHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHRcdFx0XHRwcmV2aW91cyxcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdHRoaXMuZmFjdG9yeS5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVXRpbGl0eSBmdW5jdGlvbiB0byBlYXNpbHkgY2hlY2sgaWYgYSBmaWVsZCBpcyBjaGFuZ2VkLlxuXHQgKiBXaWxsIHJldHVybiBgZmFsc2VgIGlmIHRoZSBmaWVsZCBpcyBjaGFuZ2VkXG5cdCAqXG5cdCAqIEBleGFtcGxlXG5cdCAqIG9uQ2hhbmdlOiAoXG5cdCAqICAgICBpdGVtUmVzb3VyY2UsXG5cdCAqICAgICBwcmV2aW91cyxcblx0ICogICAgIGNvbXBhcmVJdGVtRmllbGRcblx0ICogKSB7XG5cdCAqICAgICBpZiAoIWNvbXBhcmVJdGVtRmllbGQoJ2NvbHVtbklkJykpIHtcblx0ICogICAgICAgICBwcm9jZXNzSXRlbShpdGVtUmVzb3VyY2UpO1xuXHQgKiAgICAgfVxuXHQgKiB9XG5cdCAqL1xuXHRwdWJsaWMgY29tcGFyZUl0ZW1GaWVsZCAoXG5cdFx0Y29sdW1uSWQ6IGtleW9mIEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cHJldmlvdXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1uc1tjb2x1bW5JZF07XG5cblx0XHRpZiAoY29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignTWlzc2luZyBjb2x1bW4gaW4gSXRlbVJlc291cmNlLmNvbXBhcmVJdGVtRmllbGQnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5mYWN0b3J5LmFwaUZvcm1hdHRlci5jb21wYXJlRmllbGRzKFxuXHRcdFx0Y29sdW1uLnR5cGUsXG5cdFx0XHR0aGlzLmZpZWxkc1tjb2x1bW5JZF0sXG5cdFx0XHRwcmV2aW91c1tjb2x1bW5JZF0sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBoYXNDaGFuZ2VzICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LnRyYW5zYWN0aW9uXG5cdFx0XHQuaXRlbUhhbmRsZXJcblx0XHRcdC5kZXRlY3RFbnRyeUNoYW5nZXModGhpcy5lbnRyeS5pZCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0VHJhbnNhY3Rpb25QYXJhbWV0ZXJzIChcblx0XHRwYXJhbWV0ZXJzOiBhbnksXG5cdCk6IHZvaWQge1xuXHRcdGNyZWF0ZVBhdGgoXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLnRhYlJlcXVlc3RQYXJhbWV0ZXJzLFxuXHRcdFx0W1xuXHRcdFx0XHR0aGlzLmVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHR0aGlzLmVudHJ5Lml0ZW1JZCxcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRwYXJhbWV0ZXJzLFxuXHRcdFx0XSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiAnaXNOZXcnIG1lYW5zIHRoYXQgdGhlIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSBpcyBhIGxvY2FsIGl0ZW0gYW5kIHRoYXQgdGhpcyByZXNvdXJjZSB3YXMgY3JlYXRlZCB3aGVuIHRoZSB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gd2FzIGZpcnN0IGNyZWF0ZWRcblx0ICovXG5cdHB1YmxpYyBpc05ldyAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzTmV3O1xuXHR9XG5cblx0cHVibGljIGlzTG9jYWwgKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmVudHJ5LmlzTG9jYWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVtb3ZlcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZX0gZnJvbSB0aGUge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgVHJhbnNhY3Rpb25DYWNoZX0sIHNvIHRoYXQgdGhlIE9uQ2hhbmdlIGNhbGxiYWNrIHdvbid0IGJlIGNhbGxlZCBhbnltb3JlLlxuXHQgKlxuXHQgKiBXYXJuaW5nOlxuXHQgKiBUaGlzIGRvZXNuJ3QgcmV2ZXJ0IGFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGl0ZW0sIGluIG9yZGVyIHRvIHJldmVydCB0aGUgY2hhbmdlcyB5b3Ugc2hvdWxkIHVzZSB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5jbGVhckl0ZW1FbnRyeSBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmNsZWFySXRlbUVudHJ5fVxuXHQgKi9cblx0cHVibGljIGNsZWFyUmVzb3VyY2UgKCk6IHZvaWQge1xuXHRcdHRoaXMudHJhbnNhY3Rpb24uY2xlYXJJdGVtUmVzb3VyY2UodGhpcyk7XG5cdH1cblxuXHRwdWJsaWMgdG9KU09OICgpIHtcblx0XHRjb25zdCBjb2x1bW5JZHM6IHN0cmluZ1tdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHRoaXMuY29sdW1ucykge1xuXHRcdFx0Y29sdW1uSWRzLnB1c2goY29sdW1uSWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5JZHMsXG5cdFx0XHRmaWVsZHM6IHRoaXMuZmllbGRzLFxuXHRcdFx0ZW50cnk6IHRoaXMuZW50cnksXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtblBhdGgsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBwYXRoIGNvdWxkbid0IGJlIHRyYXZlcnNlZFxuXHQgKlxuXHQgKiBAcGFyYW0gY29sdW1uUGF0aCBDYW4gZWl0aGVyIGJlIGFuIGFycmF5IG9mIGNvbHVtbklkcyAoWydjb2x1bW4nLCAnY29sdW1uMiddKSBvciBhIGNvbmZpZyBjb2x1bW4gc3RyaW5nICgnY29sdW1uPmNvbHVtbjInKVxuXHQgKi9cblx0cHVibGljIGdldERlcml2ZWRWYWx1ZTxUIGV4dGVuZHMgYW55ID0gYW55PiAoY29sdW1uUGF0aDogc3RyaW5nW10gfCBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5nZXREZXJpdmVkVmFsdWUoXG5cdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0Y29sdW1uUGF0aCxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBUcmF2ZXJzZXMgdGhlIGNvbHVtbiBwYXRoIGFuZCByZXR1cm5zIHRoZSBmaWVsZHMgb2YgdGhlIGRlcml2ZWQgaXRlbSwgcmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGl0ZW0gaXNuJ3QgZm91bmRcblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogQXNzdW1lcyB0aGUgZGVyaXZlZCBpdGVtJ3MgdmFsdWVzIGFyZSBhbHJlYWR5IGNhY2hlZFxuXHQgKi9cblx0cHVibGljIGdldERlcml2ZWRWYWx1ZXMgKFxuXHRcdGNvbHVtblBhdGg6IHN0cmluZ1tdLFxuXHQpOiBSZWFkb25seTxGaWVsZE1hcD4gfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmdldERlcml2ZWRWYWx1ZXMoXG5cdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0Y29sdW1uUGF0aCxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEl0ZW1SZXNvdXJjZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtUmVzb3VyY2UsIEl0ZW1SZXNvdXJjZU9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRmllbGRNYXAsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PlxuXHRleHRlbmRzIEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+IHtcblxuXHRmaWVsZHM6IFJlYWRvbmx5PEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0ZmFjdG9yeTogSXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbVJlc291cmNlT3B0aW9uczxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4sXG5cdFx0aXNOZXc6IGJvb2xlYW4sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0ZmFjdG9yeSxcblx0XHRcdGVudHJ5LFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdGlzTmV3LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblxuXHRcdHRoaXMuZmllbGRzID0gdHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbZW50cnkuaWRdLmNoYW5nZXM7XG5cdH1cbn1cbiIsImltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgSXRlbVJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZSwgSXRlbVJlc291cmNlT3B0aW9ucyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBGaWVsZE1hcCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+XG5cdGV4dGVuZHMgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4ge1xuXG5cdHByb3RlY3RlZCBsb2NhbENvcGllczogQXJyYXk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRwdWJsaWMgZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRmYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdGVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtUmVzb3VyY2VPcHRpb25zLFxuXHRcdGlzTmV3OiBib29sZWFuLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGZhY3RvcnksXG5cdFx0XHRlbnRyeSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRpc05ldyxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cblx0XHR0aGlzLmZpZWxkcyA9IHRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5jaGFuZ2VzO1xuXHR9XG5cblx0cHVibGljIGlzTmV3ICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5faXNOZXc7XG5cdH1cblxuXHRwdWJsaWMgY29weUZpZWxkcyAoZGVzdGluYXRpb246IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4gPSB7fSk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZW50cnk7XG5cblx0XHR0aGlzLmZhY3RvcnkuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHR0aGlzLmZpZWxkcyxcblx0XHRcdGRlc3RpbmF0aW9uLFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGRlc3RpbmF0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBVcGRhdGVzIHRoZSBmaWVsZHMgb2YgdGhlIGl0ZW0gYW5kIGNhbGxzIG9uQ2hhbmdlLCB3aGVuIHVwZGF0aW5nIG1hbnkgZmllbGRzIG9mIG1hbnkgaXRlbXMgaXQncyBiZXR0ZXIgdG8gY3JlYXRlIGEge0BsaW5rIENoYW5nZXNEZWx0YSBDaGFuZ2VzRGVsdGF9IHlvdXJzZWxmIHNvIGFsbCBjaGFuZ2VzIGNhbiBiZSBhcHBsaWVkIGF0IG9uY2Vcblx0ICovXG5cdHB1YmxpYyBzZXRGaWVsZHMgKFxuXHRcdHZhbHVlczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTx0aGlzPiB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucztcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gdmFsdWVzKSB7XG5cdFx0XHRjb25zdCBjb2x1bW4gPSBjb2x1bW5zW2NvbHVtbklkXTtcblxuXHRcdFx0aWYgKGNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0XHQnc2V0RmllbGRzOiBubyBjb2x1bW4gZm91bmQgZm9yJyxcblx0XHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLnRyYW5zYWN0aW9uLmNyZWF0ZUNoYW5nZXNEZWx0YSgpO1xuXG5cdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0dGhpcy5lbnRyeSxcblx0XHRcdHZhbHVlcyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdC5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gdGhpcyxcblx0XHRcdFx0dGhpcy5mYWN0b3J5LmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0Ly8gdG9kb1tjYWNoZV0gU2hvdWxkIHlvdSBzdGlsbCBiZSBhYmxlIHRvIGRvIHRoaXMgPyBFdmVyeXRoaW5nIHNob3VsZCBoYXBwZW4gaW4gYSB0cmFuc2FjdGlvblxuXHQvLyBwdWJsaWMgc2F2ZSAocGFyYW1ldGVycz86IGFueSk6IFByb21pc2VJbnRlcmZhY2U8dGhpcz4ge1xuXHQvLyBjb25zdCBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5O1xuXHQvLyBjb25zdCBpdGVtRW50cnkgPSB0aGlzLmVudHJ5O1xuXHQvLyBjb25zdCBwYXJhbWV0ZXJNYXAgPSB7fTtcblx0Ly9cblx0Ly8gaWYgKHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCkge1xuXHQvLyBcdGNyZWF0ZVBhdGgoXG5cdC8vIFx0XHRwYXJhbWV0ZXJNYXAsXG5cdC8vIFx0XHRbXG5cdC8vIFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0Ly8gXHRcdFx0aXRlbUVudHJ5Lml0ZW1JZCxcblx0Ly8gXHRcdF0sXG5cdC8vIFx0XHRbXG5cdC8vIFx0XHRcdHt9LFxuXHQvLyBcdFx0XHRwYXJhbWV0ZXJzLFxuXHQvLyBcdFx0XSxcblx0Ly8gXHQpO1xuXHQvLyB9XG5cdC8vXG5cdC8vIHJldHVybiAoXG5cdC8vIFx0aXRlbUVudHJ5LmlzTG9ja2FibGUoKSA/XG5cdC8vIFx0XHRmYWN0b3J5LmxvY2tTZXJ2aWNlLmZldGNoTG9jayhpdGVtRW50cnkpIDpcblx0Ly8gXHRcdGZhY3RvcnkucHJvbWlzZVNlcnZpY2Uud2hlbigpXG5cdC8vICkudGhlbihcblx0Ly8gXHQoKSA9PiB7XG5cdC8vIFx0XHQvLyBhZGRUb0NvbGxlY3Rpb25zIGlzIGNhbGxlZCBpbiBjaGFuZ2VzUHJvY2Vzc29yXG5cdC8vIFx0XHRyZXR1cm4gdGhpcy5jaGFuZ2VzUHJvY2Vzc29yLmV4ZWN1dGUoXG5cdC8vIFx0XHRcdFtpdGVtRW50cnldLFxuXHQvLyBcdFx0XHRbXSxcblx0Ly8gXHRcdFx0cGFyYW1ldGVyTWFwLFxuXHQvLyBcdFx0KTtcblx0Ly8gXHR9LFxuXHQvLyBcdGZhY3RvcnkuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0Ly8gKVxuXHQvLyBcdC50aGVuKFxuXHQvLyBcdFx0KCkgPT4ge1xuXHQvLyBcdFx0XHRyZXR1cm4gdGhpcztcblx0Ly8gXHRcdH0sXG5cdC8vIFx0XHRmYWN0b3J5LmVycm9ySGFuZGxlci5yZWplY3QsXG5cdC8vIFx0KTtcblx0Ly8gfVxufVxuIiwiaW1wb3J0IHsgaW5zdGFudGlhdGVPcHRpb25zIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlRdWVyeSwgQXBpUmVxdWVzdENvbHVtbnMsIEFwaVJlcXVlc3RMaW1pdCwgRW50cnlQYXJlbnROdWxsIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uRW50cnlPcHRpb25zSW50ZXJmYWNlID0gUGFydGlhbDxDb2xsZWN0aW9uRW50cnlPcHRpb25zPjtcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25FbnRyeU9wdGlvbnMge1xuXHRjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyA9IFtdO1xuXHRxdWVyeTogQXBpUXVlcnkgfCBudWxsID0gbnVsbDtcblx0cXVlcnlQYXJhbXM6IGFueSA9IHt9OyAvLyBUT0RPXG5cdHF1ZXJ5Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMgPSBbXTtcblx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsO1xuXHRkZWZlclJlcXVlc3Q6IGJvb2xlYW4gPSBmYWxzZTtcblx0bGltaXQ6IEFwaVJlcXVlc3RMaW1pdCB8IG51bGwgPSBudWxsO1xuXHRlbnRyeUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cblx0Y29uc3RydWN0b3IgKHZhbHVlczogQ29sbGVjdGlvbkVudHJ5T3B0aW9uc0ludGVyZmFjZSkge1xuXHRcdGluc3RhbnRpYXRlT3B0aW9ucyhcblx0XHRcdHRoaXMsXG5cdFx0XHR2YWx1ZXMsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgaW5zdGFudGlhdGVPcHRpb25zIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIENvbGxlY3Rpb25SZXNvdXJjZSwgSXRlbUVudHJ5LCBJdGVtUmVzb3VyY2UgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ29udmVyc2lvbk1hcCwgSXRlbVR5cGUsIE9uQ2hhbmdlRnVuY3Rpb24gfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25SZXNvdXJjZUNhbGxiYWNrPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IChcblx0aXRlbVJlc291cmNlczogQXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+LFxuXHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb3VyY2VPbkFkZENhbGxiYWNrPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IChcblx0aXRlbVJlc291cmNlczogQXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+LFxuXHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRpc0luaXRpYWxDYWxsOiBib29sZWFuLFxuKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb3VyY2VJbml0aWFsQ2FsbGJhY2s8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0gKFxuXHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBPbkl0ZW1zQ3JlYXRlZENhbGxiYWNrID0gKGNvbnZlcnNpb25NYXA6IENvbnZlcnNpb25NYXApID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0gUGFydGlhbDxDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zPEl0ZW1UeXBlVHlwZT4+O1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4ge1xuXHRlZGl0SXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcblx0cmVtb3RlSXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcblx0ZWRpdENvbGxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcblx0ZW5hYmxlU2F2ZTogYm9vbGVhbiA9IHRydWU7XG5cdGNhbGxPbkFkZFdpdGhJbml0aWFsSXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHQvKipcblx0ICogQGRlcHJlY2F0ZWRcblx0ICogWW91IHNob3VsZCB1c2UgaXRlbVJlc291cmNlLm9uQ2hhbmdlIGFuZCBjb21wYXJlIHByZXZpb3VzLmlkIHdpdGggZmllbGRzLmlkXG5cdCAqL1xuXHRvbkl0ZW1zQ3JlYXRlZDogT25JdGVtc0NyZWF0ZWRDYWxsYmFjayA9IG5vb3A7XG5cdG9uQ2hhbmdlOiBPbkNoYW5nZUZ1bmN0aW9uID0gbm9vcDtcblx0b25BZGQ6IENvbGxlY3Rpb25SZXNvdXJjZU9uQWRkQ2FsbGJhY2s8SXRlbVR5cGVUeXBlPiA9IG5vb3A7XG5cdG9uUmVtb3ZlOiBDb2xsZWN0aW9uUmVzb3VyY2VDYWxsYmFjazxJdGVtVHlwZVR5cGU+ID0gbm9vcDtcblx0b25BZGRJbml0aWFsOiBDb2xsZWN0aW9uUmVzb3VyY2VJbml0aWFsQ2FsbGJhY2s8SXRlbVR5cGVUeXBlPiA9IG5vb3A7XG5cdG9uUmVtb3ZlSW5pdGlhbDogQ29sbGVjdGlvblJlc291cmNlSW5pdGlhbENhbGxiYWNrPEl0ZW1UeXBlVHlwZT4gPSBub29wO1xuXHRyZXNvdXJjZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cdGN1c3RvbTogYW55ID0gbnVsbDtcblxuXHRjb25zdHJ1Y3RvciAodmFsdWVzOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4pIHtcblx0XHRpbnN0YW50aWF0ZU9wdGlvbnMoXG5cdFx0XHR0aGlzLFxuXHRcdFx0dmFsdWVzLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsIENvbHVtbkV4cGFuc2lvbiwgQ29sdW1uSW5mbywgQ29sdW1uU2V0LCBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5TZXRGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpUXVlcnksXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRDb2xsZWN0aW9uUXVlcnksXG5cdEVudHJ5UGFyZW50TnVsbCxcblx0SXRlbUlkLFxuXHRJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRJdGVtVHlwZSxcblx0UHJvbWlzZUludGVyZmFjZSxcblx0UXVlcnlDYWxsYmFjayxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5sZXQgY3VycmVudElkID0gMDtcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4ge1xuXG5cdHB1YmxpYyBpZDogbnVtYmVyID0gY3VycmVudElkKys7XG5cdHB1YmxpYyBwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCA9IG51bGw7XG5cdHB1YmxpYyBxdWVyeTogQ29sbGVjdGlvblF1ZXJ5O1xuXHRwdWJsaWMgY29sdW1uczogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT47XG5cdHB1YmxpYyByZWxvYWRRdWV1ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblx0cHVibGljIHByb21pc2U6IFByb21pc2VJbnRlcmZhY2U8dGhpcz47XG5cblx0Ly8gcHJpdmF0ZSB0ZW1wbGF0ZUNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+IHwgbnVsbCA9IG51bGw7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHB1YmxpYyBvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpIHtcblx0XHR0aGlzLnBhcmVudCA9IG9wdGlvbnMucGFyZW50O1xuXHRcdHRoaXMucXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkob3B0aW9ucyk7XG5cdFx0dGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5TZXRGYWN0b3J5LmNvbnN0cnVjdFN0dWIoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMuY29sdW1ucyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGlzTG9jYWwgKCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKHBhcmVudC5pdGVtSWQpO1xuXHR9XG5cblx0cHVibGljIG1hdGNoUGFyZW50IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vID09IHRvIGNvbXBhcmUgaXRlbUlkc1xuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0cmV0dXJuIHBhcmVudC5pdGVtVHlwZSA9PT0gaXRlbVR5cGUgJiYgcGFyZW50Lml0ZW1JZCA9PSBpdGVtSWQ7XG5cdH1cblxuXHRwdWJsaWMgZXh0ZW5kUXVlcnkgKGNhbGxiYWNrPzogUXVlcnlDYWxsYmFjayk6IEFwaVF1ZXJ5IHtcblx0XHRjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG5cdFx0aWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnF1ZXJ5O1xuXHRcdH1cblxuXHRcdG9wdGlvbnMucXVlcnlQYXJhbXMgPSBjYWxsYmFjayhvcHRpb25zLnF1ZXJ5UGFyYW1zKTtcblxuXHRcdHJldHVybiB0aGlzLnF1ZXJ5ID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KG9wdGlvbnMpO1xuXHR9XG5cblx0cHVibGljIHF1ZXVlUmVsb2FkICgpOiB2b2lkIHtcblx0XHR0aGlzLnJlbG9hZFF1ZXVlZCA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kQ29sdW1ucyAoY29sdW1uRXhwYW5zaW9uOiBDb2x1bW5FeHBhbnNpb248SXRlbVR5cGVUeXBlPik6IHZvaWQge1xuXHRcdGNvbnN0IGV4cGFuc2lvblJlc3VsdCA9IGNvbHVtbkV4cGFuc2lvbi5ydW4odGhpcy5jb2x1bW5zKTtcblxuXHRcdGlmIChleHBhbnNpb25SZXN1bHQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmNvbHVtbnMgPSBleHBhbnNpb25SZXN1bHQubWVyZ2VkO1xuXHRcdC8vIHRoaXMudGVtcGxhdGVDb2x1bW5zID0gbnVsbDtcblx0XHR0aGlzLm9wdGlvbnMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5yZXF1ZXN0O1xuXHR9XG5cblx0cHVibGljIGV4cGFuZFJlcXVlc3RDb2x1bW5zIChyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMpOiB2b2lkIHtcblx0XHR0aGlzLmNvbHVtbnMuZXhwYW5kUmVxdWVzdENvbHVtbnMocmVxdWVzdENvbHVtbnMpO1xuXHRcdHRoaXMub3B0aW9ucy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLnJlcXVlc3Q7XG5cdH1cblxuXHRwdWJsaWMgZ2V0VXBkYXRlZEl0ZW1Db2x1bW5zIChcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiB7W2NvbHVtbklkOiBzdHJpbmddOiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT59IHtcblx0XHRjb25zdCBpdGVtQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5pdGVtO1xuXHRcdGNvbnN0IHJlc3VsdDoge1tjb2x1bW5JZDogc3RyaW5nXTogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgaXRlbUNvbHVtbnMpIHtcblx0XHRcdGlmIChjb252ZXJzaW9uTWFwW2NvbHVtbi5hcGlDb2x1bW4uaXRlbVR5cGVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVzdWx0W2NvbHVtbi5pZF0gPSBjb2x1bW47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8vIHRvZG9bY2FjaGVdXG5cdC8vIGdldEFkZGVkSXRlbXMgKHJldHVybkl0ZW1JZHM6IHRydWUpOiBJdGVtSWRbXTtcblx0Ly8gZ2V0QWRkZWRJdGVtcyAocmV0dXJuSXRlbUlkcz86IGJvb2xlYW4pOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj47XG5cdC8vIGdldEFkZGVkSXRlbXMgKHJldHVybkl0ZW1JZHM6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHQvLyBcdGNvbnN0IGluaXRpYWwgPSB0aGlzLmluaXRpYWw7XG5cdC8vIFx0Y29uc3QgbW9kaWZpZWQgPSB0aGlzLml0ZW1zO1xuXHQvLyBcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4gfCBJdGVtSWQ+ID0gW107XG5cdC8vXG5cdC8vIFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgbW9kaWZpZWQpIHtcblx0Ly8gXHRcdGlmIChpbml0aWFsLmluZGV4T2YoaXRlbUVudHJ5KSA9PT0gLTEpIHtcblx0Ly8gXHRcdFx0cmVzdWx0LnB1c2gocmV0dXJuSXRlbUlkcyA/IGl0ZW1FbnRyeS5pdGVtSWQgOiBpdGVtRW50cnkpO1xuXHQvLyBcdFx0fVxuXHQvLyBcdH1cblx0Ly9cblx0Ly8gXHRyZXR1cm4gcmVzdWx0O1xuXHQvLyB9XG5cdC8vXG5cdC8vIGdldFJlbW92ZWRJdGVtcyAocmV0dXJuSXRlbUlkczogdHJ1ZSk6IEl0ZW1JZFtdO1xuXHQvLyBnZXRSZW1vdmVkSXRlbXMgKHJldHVybkl0ZW1JZHM/OiBib29sZWFuKTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+O1xuXHQvLyBnZXRSZW1vdmVkSXRlbXMgKHJldHVybkl0ZW1JZHM6IGJvb2xlYW4gPSBmYWxzZSkge1xuXHQvLyBcdGNvbnN0IGluaXRpYWwgPSB0aGlzLmluaXRpYWw7XG5cdC8vIFx0Y29uc3QgbW9kaWZpZWQgPSB0aGlzLml0ZW1zO1xuXHQvLyBcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4gfCBJdGVtSWQ+ID0gW107XG5cdC8vXG5cdC8vIFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaW5pdGlhbCkge1xuXHQvLyBcdFx0aWYgKG1vZGlmaWVkLmluZGV4T2YoaXRlbUVudHJ5KSA9PT0gLTEpIHtcblx0Ly8gXHRcdFx0cmVzdWx0LnB1c2gocmV0dXJuSXRlbUlkcyA/IGl0ZW1FbnRyeS5pdGVtSWQgOiBpdGVtRW50cnkpO1xuXHQvLyBcdFx0fVxuXHQvLyBcdH1cblx0Ly9cblx0Ly8gXHRyZXR1cm4gcmVzdWx0O1xuXHQvLyB9XG5cdC8vXG5cdC8vIGdldFVwZGF0ZWRJdGVtcyAoKTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0Ly8gXHRjb25zdCBtb2RpZmllZCA9IHRoaXMuaXRlbXM7XG5cdC8vIFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0Ly9cblx0Ly8gXHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBtb2RpZmllZCkge1xuXHQvLyBcdFx0aWYgKCFpdGVtRW50cnkuaXNMb2NhbCgpICYmIGl0ZW1FbnRyeS5oYXNDaGFuZ2VzKCkpIHtcblx0Ly8gXHRcdFx0cmVzdWx0LnB1c2goaXRlbUVudHJ5KTtcblx0Ly8gXHRcdH1cblx0Ly8gXHR9XG5cdC8vXG5cdC8vIFx0cmV0dXJuIHJlc3VsdDtcblx0Ly8gfVxuXG5cdC8vIHRvZG9bY2FjaGVdIFRoaXMgaXMgdXNlZCBpbiB0aGUgZnJvbnRlbmQgaW4gdGhlIHBsYW5uZXIsIGJ1dCBJIHRoaW5rIHdlIHNob3VsZCBmaXggdGhhdCBpbiB0aGUgZnJvbnRlbmQgc29tZSBvdGhlciB3YXlcblx0Ly8gcHVibGljIG9uQWRkSW5pdGlhbCAoaXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pik6IHZvaWQge1xuXHQvLyBcdGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgdGhpcy5yZXNvdXJjZXMpIHtcblx0Ly8gXHRcdHRyeSB7XG5cdC8vIFx0XHRcdHJlc291cmNlLm9wdGlvbnMub25BZGRJbml0aWFsKFxuXHQvLyBcdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHQvLyBcdFx0XHRcdHRoaXMsXG5cdC8vIFx0XHRcdCk7XG5cdC8vIFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHQvLyBcdFx0XHR0aGlzLmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHQvLyBcdFx0fVxuXHQvLyBcdH1cblx0Ly8gfVxuXHQvL1xuXHQvLyBwdWJsaWMgb25SZW1vdmVJbml0aWFsIChpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+KTogdm9pZCB7XG5cdC8vIFx0Zm9yIChjb25zdCByZXNvdXJjZSBvZiB0aGlzLnJlc291cmNlcykge1xuXHQvLyBcdFx0dHJ5IHtcblx0Ly8gXHRcdFx0cmVzb3VyY2Uub3B0aW9ucy5vblJlbW92ZUluaXRpYWwoXG5cdC8vIFx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdC8vIFx0XHRcdFx0dGhpcyxcblx0Ly8gXHRcdFx0KTtcblx0Ly8gXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdC8vIFx0XHRcdHRoaXMuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdC8vIFx0XHR9XG5cdC8vIFx0fVxuXHQvLyB9XG59XG4iLCJpbXBvcnQgeyBmaWx0ZXJBcnJheSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucywgSXRlbUVudHJ5LCBJdGVtUmVzb3VyY2UsIExvY2FsVmlld1Jlc291cmNlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEZpZWxkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1SZXNvdXJjZUl0ZW1JZE1hcCxcblx0SXRlbVR5cGUsXG5cdE9uQ2hhbmdlRnVuY3Rpb24sXG5cdFByb21pc2VJbnRlcmZhY2UsXG5cdFF1ZXJ5Q2FsbGJhY2ssXG5cdFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG59IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueSwgVCBleHRlbmRzIEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+ID0gTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXG5cdHB1YmxpYyBpdGVtczogVFtdO1xuXHRwdWJsaWMgY29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcDtcblx0cHJvdGVjdGVkIGl0ZW1JZE1hcDogSXRlbVJlc291cmNlSXRlbUlkTWFwPFQ+ID0ge307XG5cblx0cHJpdmF0ZSByZWFkb25seSBvbkNoYW5nZTogT25DaGFuZ2VGdW5jdGlvbjtcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdHByb3RlY3RlZCBmYWN0b3J5OiBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHB1YmxpYyBlbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0cHVibGljIG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnM8SXRlbVR5cGVUeXBlPixcblx0XHRwdWJsaWMgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHRoaXMuaXRlbXMgPSBbXTtcblx0XHR0aGlzLml0ZW1JZE1hcCA9IHt9O1xuXHRcdHRoaXMuY29sdW1ucyA9IGVudHJ5LmNvbHVtbnMucmVzcG9uc2U7XG5cblx0XHQvLyB0aGlzIGFsbG93cyB1cyB0byB1cGRhdGUgdGhlIG9uQ2hhbmdlIGZ1bmN0aW9uIGluIHRoZSBvcHRpb25zXG5cdFx0dGhpcy5vbkNoYW5nZSA9IChcblx0XHRcdGl0ZW1SZXNvdXJjZTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0XHRwcmV2aW91czogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRcdF9jb21wYXJlRmllbGQsXG5cdFx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlLFxuXHRcdCkgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQhaXRlbVJlc291cmNlLmNvbXBhcmVJdGVtRmllbGQoXG5cdFx0XHRcdFx0J2lkJyxcblx0XHRcdFx0XHRwcmV2aW91cyxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIHRvZG9bY2FjaGVdIGNoZWNrIGlmIHByZXZpb3VzLmlkIG1hdGNoZXMgd2l0aCBJRHMgaW4gdGhlIG1hcFxuXHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSWRNYXBbcHJldmlvdXMuaWRdO1xuXHRcdFx0XHR0aGlzLml0ZW1JZE1hcFtpdGVtUmVzb3VyY2UuZW50cnkuaXRlbUlkXSA9IGl0ZW1SZXNvdXJjZSBhcyBUO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm9wdGlvbnMub25DaGFuZ2UoXG5cdFx0XHRcdGl0ZW1SZXNvdXJjZSxcblx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHRcdGNvbHVtbklkID0+IGl0ZW1SZXNvdXJjZS5jb21wYXJlSXRlbUZpZWxkKFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlLFxuXHRcdFx0KTtcblx0XHR9O1xuXG5cdFx0dGhpcy5hZGRJdGVtUmVzb3VyY2VzKFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uQ2hhbmdlc1t0aGlzLmVudHJ5LmlkXSxcblx0XHRcdHRydWUsXG5cdFx0KTtcblxuXHRcdHRoaXMub25Db25zdHJ1Y3QoKTtcblx0fVxuXG5cdC8vIFVzZWQgZm9yIHJlc291cmNlIGNsZWFyaW5nIHRlc3RzXG5cdHB1YmxpYyBvbkNvbnN0cnVjdCAoKTogdm9pZCB7XG5cblx0fVxuXG5cdHB1YmxpYyBnZXRJZEFycmF5ICgpOiBJdGVtSWRbXSB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbXMubWFwKFxuXHRcdFx0aXRlbVJlc291cmNlID0+IGl0ZW1SZXNvdXJjZS5lbnRyeS5pdGVtSWQsXG5cdFx0KTtcblx0fVxuXG5cdC8vIHRvZG9bdHlwZV0gSXRlbXMgY2FuIGJlIHVuZGVmaW5lZCwgYnV0IHRoaXMgZ2l2ZXMgYSBsb3Qgb2YgZXJyb3JzIGZyb250ZW5kXG5cdHB1YmxpYyBnZXRJdGVtQnlJZCAoaXRlbUlkOiBudW1iZXIpOiBUIHtcblx0XHRyZXR1cm4gdGhpcy5pdGVtSWRNYXBbaXRlbUlkXTtcblx0fVxuXG5cdHB1YmxpYyBhZGRJdGVtUmVzb3VyY2VzIChcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGlzSW5pdGlhbENhbGw6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogVFtdIHsgLy8gc2hvdWxkIGJlIGZhc3Rcblx0XHRpZiAoaXRlbUVudHJpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Y29uc3QgbG9jYWxJdGVtRW50cmllcyA9IHRoaXMuaXRlbXMubWFwKFxuXHRcdFx0aXRlbVJlc291cmNlID0+IGl0ZW1SZXNvdXJjZS5lbnRyeSxcblx0XHQpO1xuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gbG9vayBpbiBpdGVtSWRNYXAgPyB3ZSBvbmx5IHdhbnQgdG8gYWRkIHJlc291cmNlcyBpZiB0aGVyZSBpcyBub25lIHlldFxuXHRcdGl0ZW1FbnRyaWVzID0gaXRlbUVudHJpZXMuZmlsdGVyKFxuXHRcdFx0aXRlbUVudHJ5ID0+IGxvY2FsSXRlbUVudHJpZXMuaW5kZXhPZihpdGVtRW50cnkpID09PSAtMSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgaXRlbVJlc291cmNlcyA9IHRoaXMudHJhbnNhY3Rpb24uY3JlYXRlSXRlbVJlc291cmNlcyhcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0e1xuXHRcdFx0XHRyZW1vdGU6IHRoaXMub3B0aW9ucy5yZW1vdGVJdGVtcyxcblx0XHRcdFx0ZWRpdDogdGhpcy5vcHRpb25zLmVkaXRJdGVtcyxcblx0XHRcdFx0b25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsXG5cdFx0XHR9LFxuXHRcdCkgYXMgVFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbVJlc291cmNlcykge1xuXHRcdFx0Y29uc3QgaXRlbUlkID0gaXRlbVJlc291cmNlLmVudHJ5Lml0ZW1JZDtcblxuXHRcdFx0aWYgKHRoaXMuaXRlbUlkTWFwW2l0ZW1JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0FkZGVkIGEgcmVzb3VyY2Ugb2YgYW4gZW50cnkgdGhhdCB3YXMgYWxyZWFkeSBpbiB0aGUgY29sbGVjdGlvbiAhJyk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuaXRlbXMucHVzaChpdGVtUmVzb3VyY2UpO1xuXHRcdFx0dGhpcy5pdGVtSWRNYXBbaXRlbUlkXSA9IGl0ZW1SZXNvdXJjZTtcblx0XHR9XG5cblx0XHRpZiAoIWlzSW5pdGlhbENhbGwgfHwgdGhpcy5vcHRpb25zLmNhbGxPbkFkZFdpdGhJbml0aWFsSXRlbXMpIHtcblx0XHRcdHRoaXMuY2FsbE9uQWRkKFxuXHRcdFx0XHRpdGVtUmVzb3VyY2VzLFxuXHRcdFx0XHRpc0luaXRpYWxDYWxsLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gaXRlbVJlc291cmNlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyB0aGUge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2VzfSB0aGF0IHdoZXJlIHJlbW92ZWQgZnJvbSB0aGUge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZSBjb2xsZWN0aW9ufS5cblx0ICogRmlsdGVycyBvbiB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZX0ue0BsaW5rIEl0ZW1FbnRyeSBlbnRyeX0gPT09IHtAbGluayBJdGVtRW50cnkgZW50cnl9XG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlSXRlbVJlc291cmNlcyAoaXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pik6IFRbXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBUW10gPSBbXTtcblxuXHRcdGZpbHRlckFycmF5KFxuXHRcdFx0dGhpcy5pdGVtcyxcblx0XHRcdGl0ZW1SZXNvdXJjZSA9PiB7XG5cdFx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRcdFx0aWYgKGl0ZW1SZXNvdXJjZS5lbnRyeSA9PT0gaXRlbUVudHJ5KSB7XG5cdFx0XHRcdFx0XHRpdGVtUmVzb3VyY2UuY2xlYXJSZXNvdXJjZSgpO1xuXHRcdFx0XHRcdFx0cmVzdWx0LnB1c2goaXRlbVJlc291cmNlKTtcblx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1JZE1hcFtpdGVtRW50cnkuaXRlbUlkXTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBjYWxsT25BZGQgKFxuXHRcdGl0ZW1SZXNvdXJjZXM6IFRbXSxcblx0XHRpc0luaXRpYWxDYWxsOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdHRyeSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMub25BZGQoXG5cdFx0XHRcdGl0ZW1SZXNvdXJjZXMsXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdGlzSW5pdGlhbENhbGwsXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmZhY3RvcnkuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNhbGxPblJlbW92ZSAoaXRlbVJlc291cmNlczogVFtdKTogdm9pZCB7XG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMub3B0aW9ucy5vblJlbW92ZShcblx0XHRcdFx0aXRlbVJlc291cmNlcyxcblx0XHRcdFx0dGhpcyxcblx0XHRcdCk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMuZmFjdG9yeS5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZm9yRWFjaCAoY2FsbGJhY2s6IChpdGVtUmVzb3VyY2U6IFQpID0+IHZvaWQpOiB2b2lkIHtcblx0XHRjb25zdCBpdGVtUmVzb3VyY2VzID0gdGhpcy5pdGVtcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1SZXNvdXJjZXMpIHtcblx0XHRcdGNhbGxiYWNrKGl0ZW1SZXNvdXJjZSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZpbHRlciAoY2FsbGJhY2s6IChpdGVtUmVzb3VyY2U6IFQpID0+IGJvb2xlYW4pOiBUW10ge1xuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZXMgPSB0aGlzLml0ZW1zO1xuXHRcdGNvbnN0IHJlc3VsdDogVFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtUmVzb3VyY2VzKSB7XG5cdFx0XHRpZiAoY2FsbGJhY2soaXRlbVJlc291cmNlKSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChpdGVtUmVzb3VyY2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZmlyc3QgKGNhbGxiYWNrOiAoaXRlbVJlc291cmNlOiBUKSA9PiBib29sZWFuKTogVCB8IG51bGwge1xuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZXMgPSB0aGlzLml0ZW1zO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbVJlc291cmNlcykge1xuXHRcdFx0aWYgKGNhbGxiYWNrKGl0ZW1SZXNvdXJjZSkpIHtcblx0XHRcdFx0cmV0dXJuIGl0ZW1SZXNvdXJjZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHB1YmxpYyBzb21lIChjYWxsYmFjazogKGl0ZW1SZXNvdXJjZTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmZpcnN0KGNhbGxiYWNrKSAhPT0gbnVsbDtcblx0fVxuXG5cdHB1YmxpYyBncm91cEJ5IChhcmd1bWVudDogc3RyaW5nIHwgKChpdGVtUmVzb3VyY2U6IFQpID0+IHN0cmluZyB8IG51bGwpKToge1trZXk6IHN0cmluZ106IFRbXX0ge1xuXHRcdGNvbnN0IGl0ZW1zUmVzb3VyY2VzID0gdGhpcy5pdGVtcztcblx0XHRjb25zdCByZXN1bHQ6IHtba2V5OiBzdHJpbmddOiBUW119ID0ge307XG5cblx0XHRpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0aWYgKHRoaXMuZW50cnkuY29sdW1ucy5yZXNwb25zZVt0aGlzLmVudHJ5Lml0ZW1UeXBlXVthcmd1bWVudF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFRyeWluZyB0byBncm91cCBvbiBhIGNvbHVtbiBub3QgcmVxdWVzdGVkIGJ5IHRoaXMgY29sbGVjdGlvbiEgKGNvbHVtbiAnJHthcmd1bWVudH0nKWApO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtc1Jlc291cmNlcykge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGl0ZW1SZXNvdXJjZS5maWVsZHNbYXJndW1lbnRdO1xuXG5cdFx0XHRcdGlmIChyZXN1bHRbdmFsdWVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbdmFsdWVdID0gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHRbdmFsdWVdLnB1c2goaXRlbVJlc291cmNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtc1Jlc291cmNlcykge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGFyZ3VtZW50KGl0ZW1SZXNvdXJjZSk7XG5cblx0XHRcdFx0aWYgKHZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0W3ZhbHVlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmVzdWx0W3ZhbHVlXSA9IFtdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0W3ZhbHVlXS5wdXNoKGl0ZW1SZXNvdXJjZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBtYXA8VT4gKGFyZ3VtZW50OiBzdHJpbmcgfCAoKGl0ZW1SZXNvdXJjZTogVCkgPT4gVSkpOiBVW10ge1xuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZXMgPSB0aGlzLml0ZW1zO1xuXHRcdGNvbnN0IGxlbmd0aCA9IGl0ZW1SZXNvdXJjZXMubGVuZ3RoO1xuXHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGgpO1xuXG5cdFx0aWYgKHR5cGVvZiBhcmd1bWVudCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gaXRlbVJlc291cmNlc1tpXS5maWVsZHNbYXJndW1lbnRdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gYXJndW1lbnQoaXRlbVJlc291cmNlc1tpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyByZWR1Y2U8VT4gKFxuXHRcdGNhbGxiYWNrOiAoXG5cdFx0XHRpdGVtUmVzb3VyY2U6IFQsXG5cdFx0XHR2YWx1ZTogVSxcblx0XHQpID0+IFUsXG5cdFx0dmFsdWU6IFUsXG5cdCk6IFUge1xuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZXMgPSB0aGlzLml0ZW1zO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbVJlc291cmNlcykge1xuXHRcdFx0dmFsdWUgPSBjYWxsYmFjayhcblx0XHRcdFx0aXRlbVJlc291cmNlLFxuXHRcdFx0XHR2YWx1ZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIG5ldyBpdGVtcyBhbmQgYWRkcyB0aGVtIHRvIHRoZSBjb2xsZWN0aW9uXG5cdCAqXG5cdCAqIEByZW1hcmtzXG5cdCAqIC0gVXNlZCB0byByZXR1cm4ge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2VzfSwgYnV0IHlvdSBzaG91bGQgdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2Uub25BZGQgb25BZGQpIGluc3RlYWRcblx0ICovXG5cdHB1YmxpYyBleHRlbmQgKFxuXHRcdHF1ZXJ5Q2FsbGJhY2s6IFF1ZXJ5Q2FsbGJhY2ssXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LnRyYW5zYWN0aW9uXG5cdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5leHRlbmRDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdHRoaXMuZW50cnksXG5cdFx0XHRcdHF1ZXJ5Q2FsbGJhY2ssXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZW1vdmVzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgQ29sbGVjdGlvblJlc291cmNlfSBmcm9tIHRoZSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX1cblx0ICpcblx0ICogQHJlbWFya3Ncblx0ICogLSBEb2Vzbid0IHJldmVydCBjaGFuZ2VzIG9uIHRoZSBpdGVtcyB0aGVtc2VsdmVzXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJSZXNvdXJjZSAoY2xlYXJJdGVtczogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcblx0XHRpZiAoY2xlYXJJdGVtcykge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgdGhpcy5pdGVtcykge1xuXHRcdFx0XHRpdGVtUmVzb3VyY2UuY2xlYXJSZXNvdXJjZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMudHJhbnNhY3Rpb24uY2xlYXJDb2xsZWN0aW9uUmVzb3VyY2UodGhpcyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uRW50cnksXG5cdENvbGxlY3Rpb25SZXNvdXJjZSxcblx0Q29sbGVjdGlvblJlc291cmNlT3B0aW9ucyxcblx0SXRlbVJlc291cmNlLFxuXHRMb2NhbFZpZXdSZXNvdXJjZSxcbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueSwgVCBleHRlbmRzIEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+ID0gTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj5cblx0ZXh0ZW5kcyBDb2xsZWN0aW9uUmVzb3VyY2UgPEl0ZW1UeXBlVHlwZSwgVD4ge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5OiBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGU+LFxuXHRcdHRyYW5zYWN0aW9uQ2FjaGU6IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHR0cmFuc2FjdGlvbkNhY2hlLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhUmVzdWx0IH0gZnJvbSAnLi4vY2xhc3Nlcy9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkVudHJ5LFxuXHRDb2xsZWN0aW9uUmVzb3VyY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsXG5cdEl0ZW1FbnRyeSxcblx0SXRlbVJlc291cmNlLFxuXHRMb2NhbFZpZXdSZXNvdXJjZSxcbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEZpZWxkTWFwLCBJdGVtSWQsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueSwgVCBleHRlbmRzIEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+ID0gTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj5cblx0ZXh0ZW5kcyBDb2xsZWN0aW9uUmVzb3VyY2UgPEl0ZW1UeXBlVHlwZSwgVD4ge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRmYWN0b3J5OiBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGU+LFxuXHRcdHRyYW5zYWN0aW9uQ2FjaGU6IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0ZmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHR0cmFuc2FjdGlvbkNhY2hlLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlcHJlY2F0ZWRcblx0ICogVXNlIHtAbGluayBDaGFuZ2VzRGVsdGEuc2V0SXRlbU1vdmVkIENoYW5nZXNEZWx0YS5zZXRJdGVtTW92ZWR9XG5cdCAqL1xuXHRwdWJsaWMgbW92ZUl0ZW1zIChcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGRlc3RpbmF0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5vcHRpb25zLmVuYWJsZVNhdmUpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignY29sbGVjdGlvblJlc291cmNlU2VydmljZTogQ2Fubm90IG1vdmUgaXRlbXM6IHNhdmluZyBlbmFibGVkJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC50cmFuc2FjdGlvblxuXHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQubW92ZUl0ZW1zKFxuXHRcdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0XHRkZXN0aW5hdGlvblJlc291cmNlLmVudHJ5LFxuXHRcdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgcmVtb3ZlSXRlbXMgKFxuXHRcdGlkQXJyYXk6IEl0ZW1JZFtdLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmZhY3RvcnkuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0XHRjb25zdCByZW1vdmVkSXRlbUVudHJpZXM6IEl0ZW1FbnRyeVtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiB0aGlzLml0ZW1zKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBpdGVtUmVzb3VyY2UuZW50cnk7XG5cblx0XHRcdGlmIChpZEFycmF5LmluZGV4T2YoaXRlbUVudHJ5Lml0ZW1JZCkgPT09IC0xKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZW1vdmVkSXRlbUVudHJpZXMucHVzaChpdGVtRW50cnkpO1xuXHRcdH1cblxuXHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtc0RlbGV0ZWQocmVtb3ZlZEl0ZW1FbnRyaWVzKTtcblxuXHRcdHRoaXMudHJhbnNhY3Rpb24uYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0fVxuXG5cdHB1YmxpYyByZW1vdmVJdGVtIChcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMucmVtb3ZlSXRlbXMoXG5cdFx0XHRbaXRlbUlkXSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGFkZEl0ZW1zIChcblx0XHR2YWx1ZXNBcnJheTogQXJyYXk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0Ly8gd2lsbCBjcmVhdGUgYW5kIGFwcGx5IGEgQ2hhbmdlc0RlbHRhXG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXJcblx0XHRcdC5jcmVhdGVJdGVtcyhcblx0XHRcdFx0dGhpcy5lbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0dmFsdWVzQXJyYXksXG5cdFx0XHRcdHRoaXMuZW50cnkucGFyZW50LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBhZGRJdGVtIChcblx0XHR2YWx1ZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0cmV0dXJuIHRoaXMuYWRkSXRlbXMoXG5cdFx0XHRbdmFsdWVzXSxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5TZXQgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRlbXBsYXRlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1uTWFwLCBBcGlSZXNwb25zZSwgRmllbGRNYXAsIEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+O1xuXHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXA7XG5cdGNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+OyAvLyBUT0RPOiByZW5hbWUgdG8gY29sdW1uU2V0XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdGZhY3Rvcnk6IFRlbXBsYXRlRmFjdG9yeSxcblx0XHRwdWJsaWMgaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRwdWJsaWMgcmVzcG9uc2U6IEFwaVJlc3BvbnNlLFxuXHRcdGFkZGl0aW9uYWxSZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbk1hcCxcblx0XHRhZGRpdGlvbmFsUmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpIHtcblx0XHR0aGlzLmZpZWxkcyA9IHJlc3BvbnNlLmZldGNoT2JqZWN0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXNwb25zZS5saW5rc1tpdGVtVHlwZV1bMF0sXG5cdFx0KSE7XG5cblx0XHRjb25zdCByZXNwb25zZUNvbHVtbnMgPSByZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKTtcblxuXHRcdHRoaXMucmVzcG9uc2VDb2x1bW5zID0gZmFjdG9yeS5jb2x1bW5VdGlsLm1lcmdlUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0YWRkaXRpb25hbFJlc3BvbnNlQ29sdW1ucyxcblx0XHQpLm1lcmdlZDtcblxuXHRcdC8vIFdlIGhhdmUgdG8gcmVjb25zdHJ1Y3QgdGhlIHJlcXVlc3RDb2x1bW5zIG9ubHkgZnJvbSB0aGUgdGVtcGxhdGUncyByZXNwb25zZSwgd2UgbmVlZCB0byB0cmVhdCB0aGUgYWRkaXRpb25hbCByZXF1ZXN0IGNvbHVtbnMgYXMgYWN0dWFsIHJlcXVlc3QgY29sdW1uc1xuXHRcdHRoaXMuY29sdW1ucyA9IGZhY3RvcnkuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3RGcm9tUmVzcG9uc2UoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXG5cdFx0dGhpcy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zXG5cdFx0XHQuZXhwYW5kKFxuXHRcdFx0XHRhZGRpdGlvbmFsUmVxdWVzdENvbHVtbnNbaXRlbVR5cGVdLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0YWRkaXRpb25hbFJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdClcblx0XHRcdC5tZXJnZWQ7XG5cdH1cbn1cbiIsImltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgSXRlbVJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZU9wdGlvbnMsIFZpZXdSZXNvdXJjZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT5cblx0ZXh0ZW5kcyBWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPiB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdGZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1SZXNvdXJjZU9wdGlvbnM8UmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGlzTmV3OiBib29sZWFuLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGZhY3RvcnksXG5cdFx0XHRlbnRyeSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRpc05ldyxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cblx0XHR0aGlzLmZpZWxkcyA9IHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbZW50cnkuaWRdLmluaXRpYWw7XG5cdH1cbn1cbiIsImltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgSXRlbVJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZU9wdGlvbnMsIFZpZXdSZXNvdXJjZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PlxuXHRleHRlbmRzIFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0ZmFjdG9yeTogSXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbVJlc291cmNlT3B0aW9ucyxcblx0XHRpc05ldzogYm9vbGVhbixcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRmYWN0b3J5LFxuXHRcdFx0ZW50cnksXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0aXNOZXcsXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXG5cdFx0dGhpcy5maWVsZHMgPSB0cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0uY2hhbmdlcztcblx0fVxufVxuIiwiLy8gc2hvdWxkIGJlIG9yZGVyZWQgYnkgZGVwZW5kZW5jeSFcbmV4cG9ydCAqIGZyb20gJy4vSXRlbUVudHJ5T3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1SZXNvdXJjZU9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtRW50cnknO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtUmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9WaWV3UmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FZGl0UmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uRW50cnlPcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25FbnRyeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25SZXNvdXJjZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25WaWV3UmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uRWRpdFJlc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vVGVtcGxhdGUnO1xuZXhwb3J0ICogZnJvbSAnLi9SZW1vdGVWaWV3UmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Mb2NhbFZpZXdSZXNvdXJjZSc7XG4iLCJpbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvciwgQ29sbGVjdGlvbk1hdGNoZXIsIENvbHVtblNldCwgUmVxdWVzdENvbHVtbkV4cGFuc2lvbiB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkVudHJ5LFxuXHRDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRDb2xsZWN0aW9uRW50cnlPcHRpb25zSW50ZXJmYWNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2UsXG5cdEl0ZW1FbnRyeSxcblx0SXRlbUVudHJ5T3B0aW9uc0ludGVyZmFjZSxcblx0SXRlbVJlc291cmNlLFxuXHRJdGVtUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlLFxufSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgdHlwZSBFbnRyeVBhcmVudCA9IHtpdGVtVHlwZTogc3RyaW5nLCBpdGVtSWQ6IG51bWJlcn07XG5cbmV4cG9ydCB0eXBlIEVudHJ5UGFyZW50TnVsbCA9IEVudHJ5UGFyZW50IHwgbnVsbDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFVzZWQgZm9yIGZpZWxkcyB0aGF0IGJlbG9uZyB0byBhIHNwZWNpZmljIGl0ZW1UeXBlXG4gKi9cbmV4cG9ydCB0eXBlIEZpZWxkTWFwPF9JdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdFtrZXk6IHN0cmluZ106IGFueVxufTtcblxuZXhwb3J0IHR5cGUgSXRlbU9wdGlvbnNJbnRlcmZhY2U8SXRlbVJlc291cmNlVHlwZSBleHRlbmRzIEl0ZW1SZXNvdXJjZTxhbnk+ID0gSXRlbVJlc291cmNlPiA9XG5cdEl0ZW1FbnRyeU9wdGlvbnNJbnRlcmZhY2Vcblx0JiBJdGVtUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZVR5cGU+O1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPVxuXHRDb2xsZWN0aW9uRW50cnlPcHRpb25zSW50ZXJmYWNlXG5cdCYgQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3Rpb25EZWZpbml0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiB7XG5cdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGU7XG5cdG9wdGlvbnM6IHtlbnRyeTogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucywgcmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnM8SXRlbVR5cGVUeXBlPn07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0NvbGxlY3Rpb25EZWZpbml0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PlxuXHRleHRlbmRzIENvbGxlY3Rpb25EZWZpbml0aW9uPEl0ZW1UeXBlVHlwZT4ge1xuXHRsaW5rRmllbGQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgT25DaGFuZ2VGdW5jdGlvbjxJdGVtUmVzb3VyY2VUeXBlIGV4dGVuZHMgSXRlbVJlc291cmNlPGFueT4gPSBJdGVtUmVzb3VyY2U8YW55Pj4gPSAoXG5cdGl0ZW1SZXNvdXJjZTogSXRlbVJlc291cmNlVHlwZSxcblx0cHJldmlvdXM6IEZpZWxkTWFwPEl0ZW1SZXNvdXJjZVR5cGVbJ2VudHJ5J11bJ2l0ZW1UeXBlJ10+LFxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgJ2ZhbHNlJyBpZiB0aGUgZmllbGQgY2hhbmdlZFxuXHQgKi9cblx0Y29tcGFyZUZpZWxkOiAoZmllbGQ6IGtleW9mIEZpZWxkTWFwPEl0ZW1SZXNvdXJjZVR5cGVbJ2VudHJ5J11bJ2l0ZW1UeXBlJ10+KSA9PiBib29sZWFuLFxuXHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuLFxuKSA9PiB2b2lkO1xuXG5leHBvcnQgY29uc3QgZW51bSBTdGF0ZUtleVR5cGUge1xuXHROZXcgPSAnbmV3Jyxcblx0RHVwbGljYXRlID0gJ2R1cGxpY2F0ZSdcbn1cblxuZXhwb3J0IHR5cGUgU3RhdGVLZXkgPSB7dHlwZTogU3RhdGVLZXlUeXBlLCB0ZW1wbGF0ZT86IHN0cmluZywgaXRlbUlkPzogbnVtYmVyfTtcblxuZXhwb3J0IHR5cGUgU29ja2V0TWVzc2FnZVR5cGUgPSAnZXZlbnQnIHwgJ25vdGlmaWNhdGlvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ja2V0TWVzc2FnZSB7XG5cdGhlYWRlcjoge1xuXHRcdGRvbWFpbjogc3RyaW5nLFxuXHRcdGFjY291bnQ6IHN0cmluZyxcblx0XHRzZW5kZXI6IHtcblx0XHRcdGRpc3BsYXluYW1lOiBzdHJpbmcsXG5cdFx0XHRpdGVtVHlwZTogJ01lZGV3ZXJrZXInLFxuXHRcdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0XHRhdXRob3JpemVkOiBib29sZWFuLFxuXHRcdFx0c2Vzc2lvbjogc3RyaW5nXG5cdFx0fSxcblx0XHRtZXNzYWdlSWQ6IHtcblx0XHRcdElkOiBzdHJpbmcsXG5cdFx0XHRzZXF1ZW5jZTogbnVtYmVyLFxuXHRcdFx0YmF0Y2g6IG51bWJlcixcblx0XHRcdHJlcXVlc3Q6IG51bWJlclxuXHRcdH0sXG5cdFx0c2VudDogc3RyaW5nLFxuXHRcdGZvcmNlRXZhbHVhdGU6IGJvb2xlYW5cblx0fTtcblx0Ym9keTogYW55O1xuXHRtZXNzYWdlVHlwZTogU29ja2V0TWVzc2FnZVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ja2V0TWVzc2FnZUNyZWF0ZVxuXHRleHRlbmRzIFNvY2tldE1lc3NhZ2Uge1xuXG5cdGJvZHk6IHtcblx0XHRldmVudFR5cGU6ICdjcmVhdGUnLFxuXHRcdGNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXBcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbXM6IHtcblx0XHRcdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFx0XHRbaXRlbUlkOiBudW1iZXJdOiB7XG5cdFx0XHRcdFx0cGFyZW50OiBudWxsIHwgRW50cnlQYXJlbnQsXG5cdFx0XHRcdFx0dmFsdWVzOiBGaWVsZE1hcFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvY2tldE1lc3NhZ2VVcGRhdGVcblx0ZXh0ZW5kcyBTb2NrZXRNZXNzYWdlIHtcblxuXHRib2R5OiB7XG5cdFx0ZXZlbnRUeXBlOiAndXBkYXRlJyxcblx0XHRjb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1zOiB7XG5cdFx0XHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRcdFx0W2l0ZW1JZDogbnVtYmVyXToge1xuXHRcdFx0XHRcdHBhcmVudDogbnVsbCB8IEVudHJ5UGFyZW50LFxuXHRcdFx0XHRcdHZhbHVlczogRmllbGRNYXBcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb2NrZXRNZXNzYWdlTGlua1RvXG5cdGV4dGVuZHMgU29ja2V0TWVzc2FnZSB7XG5cblx0Ym9keToge1xuXHRcdGV2ZW50VHlwZTogJ2xpbmt0bycsXG5cdFx0Y29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtczoge1xuXHRcdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0XHRcdFtpdGVtSWQ6IG51bWJlcl06IHtcblx0XHRcdFx0XHRwYXJlbnQ6IG51bGwgfCBFbnRyeVBhcmVudCxcblx0XHRcdFx0XHR2YWx1ZXM6IEZpZWxkTWFwXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ja2V0TWVzc2FnZURlbGV0ZVxuXHRleHRlbmRzIFNvY2tldE1lc3NhZ2Uge1xuXG5cdGJvZHk6IHtcblx0XHRldmVudFR5cGU6ICdkZWxldGUnLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtczogSXRlbUlkW11cblx0fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbkNoYW5nZXNSZXNvbHZlU29ja2V0TWVzc2FnZVxuXHRleHRlbmRzIFNvY2tldE1lc3NhZ2Uge1xuXHRib2R5OiB7XG5cdFx0aXRlbVR5cGU6ICdGdW5jdGlvbkNoYW5nZXNSZXNvbHZlJyxcblx0XHRba2V5OiBzdHJpbmddOiBhbnlcblx0fTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSXRlbSByZXNvdXJjZVxuXG5leHBvcnQgdHlwZSBJdGVtUmVzb3VyY2VJdGVtSWRNYXA8VCBleHRlbmRzIEl0ZW1SZXNvdXJjZTxhbnk+ID0gSXRlbVJlc291cmNlPGFueT4+ID0ge1xuXHRbaXRlbUlkOiBudW1iZXJdOiBUXG59O1xuXG5leHBvcnQgdHlwZSBJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXA8VCBleHRlbmRzIEl0ZW1SZXNvdXJjZTxhbnk+ID0gSXRlbVJlc291cmNlPGFueT4+ID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IFRbXVxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSXRlbSBFbnRyeVxuXG5leHBvcnQgdHlwZSBJdGVtSWQgPSBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIEl0ZW1UeXBlID0gc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBJdGVtTWFwPFQ+ID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRbaXRlbUlkOiBzdHJpbmddOiBUXG5cdH1cbn07XG5cbmV4cG9ydCB0eXBlIEl0ZW1FbnRyeU1hcDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSBJdGVtTWFwPEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PjtcblxuZXhwb3J0IHR5cGUgSXRlbUVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0ge1xuXHRbcGFyZW50SWQ6IG51bWJlcl06IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pjtcbn07XG5cbmV4cG9ydCB0eXBlIENvbnZlcnNpb25NYXAgPSB7XG5cdFtpdGVtSWQ6IG51bWJlcl06IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEl0ZW1JZENvbnZlcnNpb25NYXAgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXTogQ29udmVyc2lvbk1hcFxufTtcblxuZXhwb3J0IHR5cGUgQ3JlYXRlUmVxdWVzdFBhcmFtZXRlck1hcDxUID0gYW55PiA9IEl0ZW1NYXA8VD47XG5cbmV4cG9ydCB0eXBlIEl0ZW1FcnJvciA9IHttZXNzYWdlOiBzdHJpbmd9O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb2xsZWN0aW9uIEVudHJ5XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5UGFyYW1zID0gYW55OyAvLyBUT0RPXG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25RdWVyeSA9IHtvYmplY3Q6IG9iamVjdCwgc3RyaW5nOiBzdHJpbmd9O1xuXG5leHBvcnQgdHlwZSBRdWVyeUNhbGxiYWNrID0gKHF1ZXJ5UGFyYW1zOiBRdWVyeVBhcmFtcykgPT4gUXVlcnlQYXJhbXM7XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IHtcblx0W3BhcmVudElkOiBudW1iZXJdOiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPlxufTtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8VCBleHRlbmRzIENvbGxlY3Rpb25SZXNvdXJjZTxhbnk+ID0gQ29sbGVjdGlvblJlc291cmNlPGFueT4+ID0ge1xuXHRbcGFyZW50SWQ6IG51bWJlcl06IFRcbn07XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25NYXRjaFJlc3VsdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdGZpdHRpbmc6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0bm90Zml0dGluZzogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRtYXliZTogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVuZGVkQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPlxuXHRleHRlbmRzIENvbGxlY3Rpb25NYXRjaFJlc3VsdDxJdGVtVHlwZVR5cGU+IHtcblx0Y29sbGVjdGlvbjogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBlZEV4dGVuZGVkQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiB7XG5cdFtjb2xsZWN0aW9uSWQ6IG51bWJlcl06IEV4dGVuZGVkQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZT47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbHVtbnNcblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VDb2x1bW4gPSBhbnk7IC8vIFRPRE9cblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VDb2x1bW5NYXAgPSB7XG5cdFtjb2x1bW5JZDogc3RyaW5nXTogUmVzcG9uc2VDb2x1bW5cbn07XG5cbmV4cG9ydCB0eXBlIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXTogUmVzcG9uc2VDb2x1bW5NYXBcbn07XG5cbmV4cG9ydCB0eXBlIENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdG1lcmdlZDogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4sXG5cdGRpZmZlcmVuY2U6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+XG59O1xuXG5leHBvcnQgdHlwZSBSb290Q29sdW1uTWFwID0ge1tjb2x1bW5JZDogc3RyaW5nXToge2FwaUNvbHVtbjogUmVzcG9uc2VDb2x1bW4sIGNoaWxkcmVuOiBSb290Q29sdW1uTWFwfX07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFwaSByZWZlcmVuY2VcblxuZXhwb3J0IHR5cGUgQXBpUmVzcG9uc2UgPSBBcGlSZXNwb25zZVByb2Nlc3NvcjsgLy8gVE9ET1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBcGkgdGVtcGxhdGUgcmVzcG9uc2VcbmV4cG9ydCB0eXBlIFRlbXBsYXRlSXRlbVJlc291cmNlTWFwPFQgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8YW55Pj4gPSB7XG5cdG1haW46IFQ7XG5cdGxpbmtlZDogSXRlbVJlc291cmNlc0l0ZW1UeXBlTWFwXG59O1xuXG5leHBvcnQgdHlwZSBJdGVtVHlwZU1hcDxUID0gYW55PiA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiBUO1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQXBpIHJlcXVlc3RcblxuZXhwb3J0IHR5cGUgQXBpUXVlcnkgPSBhbnk7IC8vIFRPRE9cblxuZXhwb3J0IHR5cGUgQXBpUmVxdWVzdEl0ZW1WYWx1ZXMgPSB7XG5cdHZhbHVlcz86IGFueSxcblx0bGlua3M/OiB7XG5cdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiBJdGVtSWRbXVxuXHR9XG59O1xuXG5leHBvcnQgdHlwZSBBcGlSZXF1ZXN0SXRlbU1hcCA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0W2l0ZW1JZDogbnVtYmVyXTogQXBpUmVxdWVzdEl0ZW1WYWx1ZXNcblx0fTtcbn07XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RDb2x1bW4gPSBzdHJpbmcgfCB7W2NvbHVtbklkOiBzdHJpbmddOiBBcGlSZXF1ZXN0Q29sdW1uW119O1xuXG5leHBvcnQgdHlwZSBBcGlSZXF1ZXN0Q29sdW1ucyA9IEFwaVJlcXVlc3RDb2x1bW5bXSB8IHRydWU7XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RDb2x1bW5NYXAgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXTogQXBpUmVxdWVzdENvbHVtbnNcbn07XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RMaW1pdCA9IHtcblx0ZmllbGQ6IHN0cmluZyxcblx0bGltaXQ6IG51bWJlcixcblx0b2Zmc2V0PzogbnVtYmVyLFxuXHRvcmRlcj86ICdkZXNjJyB8ICdhc2MnXG59O1xuXG5leHBvcnQgdHlwZSBBcGlSZXF1ZXN0TW92ZUl0ZW1zID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1JZFtdXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDcmVhdGUgcmVxdWVzdFxuXG5leHBvcnQgdHlwZSBDcmVhdGVSZXF1ZXN0RW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0ge1xuXHRyZXF1ZXN0OiB7XG5cdFx0cmVxdWVzdFR5cGU6ICdjcmVhdGUnLFxuXHRcdGl0ZW1UeXBlPzogSXRlbVR5cGVUeXBlLFxuXHRcdHBhcmVudFR5cGU/OiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZD86IHtbaXRlbUlkOiBzdHJpbmddOiBJdGVtSWR9LFxuXHRcdGl0ZW1zOiBBcGlSZXF1ZXN0SXRlbU1hcCxcblx0XHRjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwXG5cdH0sXG5cdGNvbHVtbnM6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb24sXG5cdGl0ZW1zOiBJdGVtRW50cnlNYXA8SXRlbVR5cGVUeXBlPixcblx0Y29sbGVjdGlvbnM6IENvbGxlY3Rpb25NYXRjaGVyXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgZW51bSBBcGlMaW5rVHJlZVR5cGUge1xuXHRJVEVNVEFCTEUgPSAnaXRlbXRhYmxlJyxcblx0RElSRUNUID0gJ2RpcmVjdCdcbn1cblxuZXhwb3J0IHR5cGUgQXBpTGlua1RyZWVFbnRyeSA9IHtcblx0dHlwZTogQXBpTGlua1RyZWVUeXBlLklURU1UQUJMRVxufSB8IHtcblx0dHlwZTogQXBpTGlua1RyZWVUeXBlLkRJUkVDVCxcblx0ZmllbGQ6IHN0cmluZ1xufTtcblxuZXhwb3J0IHR5cGUgQXBpTGlua1RyZWUgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFtjaGlsZFR5cGU6IHN0cmluZ106IEFwaUxpbmtUcmVlRW50cnlcblx0fVxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENhbGxiYWNrIHRvIGRldGVybWluZSBpZiBhbiBpdGVtIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgY3JlYXRlIGRlbHRhLCByZXR1cm4gYGZhbHNlYCB0byBleGNsdWRlIHRoZSBpdGVtXG4gKi9cbmV4cG9ydCB0eXBlIEZpbHRlckl0ZW1FbnRyeUNhbGxiYWNrID0gPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcbikgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTW9kaWZ5RmllbGRzQ2FsbGJhY2sgPSA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRpdGVtSWRDb252ZXJzaW9uTWFwPzogSXRlbUlkQ29udmVyc2lvbk1hcCxcbikgPT4gdm9pZDtcbiIsImV4cG9ydCAqIGZyb20gJy4vSXRlbVR5cGVzQ29sbGVjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL1Byb21pc2VJbnRlcmZhY2UnO1xuIiwiaW1wb3J0IHsgSXRlbUNhY2hlRmFjdG9yeSwgSXRlbUVudHJ5RmFjdG9yeSwgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgfSBmcm9tICcuLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtRW50cnlPcHRpb25zIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBBcGlSZXF1ZXN0Q29sdW1ucywgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBBcGlGb3JtYXR0ZXIgfSBmcm9tICcuLi9BcGlGb3JtYXR0ZXInO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhIH0gZnJvbSAnLi4vQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUJhc2UsIENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YSB9IGZyb20gJy4uL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgQ29sdW1uSW5mbyB9IGZyb20gJy4uL0NvbHVtbkluZm8nO1xuaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4uL0NvbHVtblV0aWwnO1xuaW1wb3J0IHsgSXRlbUNhY2hlIH0gZnJvbSAnLi4vSXRlbUNhY2hlJztcbmltcG9ydCB7IGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuLi9VdGlsJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuL0Fic3RyYWN0Q2FjaGUnO1xuaW1wb3J0IHsgU2VydmVySXRlbUVudHJ5Q2hhbmdlcyB9IGZyb20gJy4vc2VydmVyL1NlcnZlckl0ZW1IYW5kbGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyB9IGZyb20gJy4vdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25JdGVtSGFuZGxlcic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJdGVtSGFuZGxlckJhc2Uge1xuXG5cdHB1YmxpYyByZWFkb25seSBlbnRyaWVzOiBJdGVtQ2FjaGU7XG5cdHB1YmxpYyBhYnN0cmFjdCBpdGVtQ2hhbmdlczogU2VydmVySXRlbUVudHJ5Q2hhbmdlcyB8IFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcztcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdHByb3RlY3RlZCBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByb3RlY3RlZCBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwcm90ZWN0ZWQgaXRlbUVudHJ5RmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByb3RlY3RlZCBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcm90ZWN0ZWQgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpIHtcblx0XHR0aGlzLmVudHJpZXMgPSBpdGVtQ2FjaGVGYWN0b3J5LmNvbnN0cnVjdCh0aGlzLnRyYW5zYWN0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ29waWVzIHRoZSBwYXNzZWQgSXRlbUVudHJ5Q2hhbmdlcyBpbnRvIGEgZm9ybWF0IHRoZSBpbXBsZW1lbnRpbmcgSXRlbUhhbmRsZXIgY2FuIHB1dCBpbiBoaXMgSXRlbUNoYW5nZXNcblx0ICogQHBhcmFtIGl0ZW1FbnRyeUNoYW5nZXNcblx0ICogQHBhcmFtIGVudHJ5XG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgY29weVRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyAoXG5cdFx0aXRlbUVudHJ5Q2hhbmdlczogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzLFxuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdCk7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSBJdGVtRW50cmllcyBmb3IgdGhlIGdpdmVuIHF1ZXJ5LCBkb2VzIG5vdCBsb29rIGluIHRoZSBjYWNoZSwgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGljaCBJdGVtSWRzIGJlbG9uZyB0byB0aGUgcXVlcnkgIVxuXHQgKlxuXHQgKiB0b2RvOiBXZSBjb3VsZCBzdG9yZSBjb2xsZWN0aW9ucyBieSB0aGVpciBxdWVyeSBzdHJpbmcsIGFuZCB0aGVuIHNlZSBpZiB0aGUgcXVlcnkgaXMgYWxyZWFkeSBjYWNoZWRcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBmZXRjaEl0ZW1FbnRyaWVzQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGVudHJ5T3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgSXRlbUVudHJpZXMgZm9yIHRoZSBnaXZlbiBJdGVtSWRzXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZmV0Y2hJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBhbiBJdGVtRW50cnkgd2l0aCB0aGUgZ2l2ZW4gaXRlbUlkXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZmV0Y2hJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUHJvY2Vzc2VzIHRoZSBwYXNzZWQge0BsaW5rIENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YSB1cGRhdGUgZGVsdGF9IG9uIHRoZSB0cmFuc2FjdGlvbiwgaWYgdGhlcmUgYXJlIG5vIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzIGl0ZW1DaGFuZ2VzfSB0aGUgbmV3IHZhbHVlcyB3aWxsIG5vdCBiZSBwcm9jZXNzZWRcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBwcm9jZXNzSXRlbUVudHJ5Q2hhbmdlcyAoXG5cdFx0aXRlbUVudHJ5Q2hhbmdlc1R1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGEsXG5cdCk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBUcmF2ZXJzZXMgdGhlIGNvbHVtbiBwYXRoIGFuZCByZXR1cm5zIHRoZSBmaWVsZHMgb2YgdGhlIGRlcml2ZWQgaXRlbSwgcmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGl0ZW0gaXNuJ3QgZm91bmRcblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogQXNzdW1lcyB0aGUgZGVyaXZlZCBpdGVtJ3MgdmFsdWVzIGFyZSBhbHJlYWR5IGNhY2hlZFxuXHQgKi9cblx0cHVibGljIGdldERlcml2ZWRWYWx1ZXMgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5LFxuXHRcdGNvbHVtblBhdGg6IHN0cmluZ1tdLFxuXHQpOiBSZWFkb25seTxGaWVsZE1hcD4gfCB1bmRlZmluZWQge1xuXHRcdGxldCBkZXJpdmVkSXRlbUVudHJ5OiBJdGVtRW50cnkgfCB1bmRlZmluZWQgPSBpdGVtRW50cnk7XG5cdFx0bGV0IGZpZWxkcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyh0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0pO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBvZiBjb2x1bW5QYXRoKSB7XG5cdFx0XHRjb25zdCBjb2x1bW4gPSBkZXJpdmVkSXRlbUVudHJ5LmNvbHVtbnMucmVzcG9uc2VbZGVyaXZlZEl0ZW1FbnRyeS5pdGVtVHlwZV1bY29sdW1uSWRdO1xuXG5cdFx0XHRpZiAoY29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gJyR7Y29sdW1uSWR9JyBub3QgZm91bmQgb24gZW50cnkgaW4gSXRlbVJlc291cmNlLmdldERlcml2ZWRWYWx1ZWApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY29sdW1uLml0ZW1UeXBlID09PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ29sdW1uICcke2NvbHVtbklkfScgZG9lc24ndCBoYXZlIGNoaWxkcmVuIGluIEl0ZW1SZXNvdXJjZS5nZXREZXJpdmVkVmFsdWVgKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaXRlbUlkID0gZmllbGRzW2NvbHVtbklkXTtcblxuXHRcdFx0aWYgKGl0ZW1JZCA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRkZXJpdmVkSXRlbUVudHJ5ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRMb2NhbEl0ZW1FbnRyeUJ5SXRlbUlkKFxuXHRcdFx0XHRjb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChkZXJpdmVkSXRlbUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBEZXJpdmVkIGl0ZW1FbnRyeSAke2NvbHVtbi5pdGVtVHlwZX06JHtpdGVtSWR9IGNvdWxkbid0IGJlIGZvdW5kYCk7XG5cdFx0XHR9XG5cblx0XHRcdGZpZWxkcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0ZGVyaXZlZEl0ZW1FbnRyeS5pZCxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmaWVsZHM7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW5QYXRoLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgcGF0aCBjb3VsZG4ndCBiZSB0cmF2ZXJzZWRcblx0ICpcblx0ICogQHBhcmFtIGl0ZW1FbnRyeSBUaGUgcm9vdCBlbnRyeSB0byBzdGFydCB0aGUgcGF0aCBmcm9tXG5cdCAqIEBwYXJhbSBjb2x1bW5QYXRoIENhbiBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgY29sdW1uSWRzIChbJ2NvbHVtbicsICdjb2x1bW4yJ10pIG9yIGEgY29uZmlnIGNvbHVtbiBzdHJpbmcgKCdjb2x1bW4+Y29sdW1uMicpXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RGVyaXZlZFZhbHVlPFQgZXh0ZW5kcyBhbnkgPSBhbnk+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHRjb2x1bW5QYXRoOiBzdHJpbmdbXSB8IHN0cmluZyxcblx0KTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHR5cGVvZiBjb2x1bW5QYXRoID09PSAnc3RyaW5nJykge1xuXHRcdFx0Y29sdW1uUGF0aCA9IHRoaXMuY29sdW1uVXRpbC5wYXJzZUNvbmZpZ0NvbHVtbihjb2x1bW5QYXRoKTtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZHMgPSB0aGlzLmdldERlcml2ZWRWYWx1ZXMoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRjb2x1bW5QYXRoLnNsaWNlKFxuXHRcdFx0XHQwLFxuXHRcdFx0XHQtMSxcblx0XHRcdCksXG5cdFx0KTtcblxuXHRcdGlmIChmaWVsZHMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmllbGRzW2NvbHVtblBhdGhbY29sdW1uUGF0aC5sZW5ndGggLSAxXV07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENsZWFycyB0aGUgZW50cnkgZnJvbSB0aGlzIHRyYW5zYWN0aW9uLCByZW1vdmluZyBpdCBmcm9tIHRoZSB7QGxpbmsgSXRlbUNhY2hlIEl0ZW1DYWNoZX0gYW5kIHJlbW92aW5nIGFsbCBjaGFuZ2VzXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJJdGVtRW50cnkgKGVudHJ5OiBJdGVtRW50cnkpOiB2b2lkIHtcblx0XHR0aGlzLmVudHJpZXMuY2xlYXIoZW50cnkpO1xuXHRcdGRlbGV0ZSB0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVjdXJzaXZlbHkgZmV0Y2hlcyBkZXJpdmVkIHZhbHVlcyBhcyBzZXBhcmF0ZSByZXF1ZXN0cywgaW5zdGVhZCBvZiBhcyBjb2x1bW5zIG9mIGEgcHJpbWFyeSBpdGVtXG5cdCAqIENhbiBiZSB1c2VkIHdoZW4gZGVyaXZlZCB2YWx1ZXMgb2YgYSBsb2NhbCBpdGVtIGhhdmUgdG8gYmUgZmV0Y2hlZCwgc2luY2UgYSBsb2NhbCBpdGVtIGNhbid0IGJlIHVzZWQgYXMgcm9vdCBpdGVtIG9mIGEgcXVlcnlcblx0ICovXG5cdHB1YmxpYyBmZXRjaERlcml2ZWRWYWx1ZXNCeUNvbHVtbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0cm9vdENvbHVtbjogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+LFxuXHRcdGNoYW5nZXNEZWx0YT86IENoYW5nZXNEZWx0YUJhc2UsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZCB8IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGNvbnN0IGNoaWxkQ29sdW1ucyA9IHJvb3RDb2x1bW4uY2hpbGRyZW47XG5cblx0XHRpZiAoY2hpbGRDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZpcnN0Q2hpbGQgPSBjaGlsZENvbHVtbnNbMF07XG5cblx0XHRpZiAoY2hpbGRDb2x1bW5zLmxlbmd0aCA9PT0gMSAmJiBmaXJzdENoaWxkLmFwaUNvbHVtbi50eXBlID09PSAnaWQnKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFlvdSBzaG91bGQgdXNlIGZpZWxkc1tjb2x1bW5JZF0gaW5zdGVhZCBvZiBkZXJpdmVkWydjb2x1bW5JZD5pZCddIHRvIGdldCB0aGUgaWQgb2YgYSBkZXJpdmVkIGl0ZW1gKTtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtSWRNYXA6IHtbaXRlbUlkOiBzdHJpbmddOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj59ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUlkID0gdGhpcy5nZXRJdGVtSWRCeUNvbHVtbihcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRyb290Q29sdW1uLFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoaXRlbUlkID09PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXRlbUlkTWFwW2l0ZW1JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpdGVtSWRNYXBbaXRlbUlkXSA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHRpdGVtSWRNYXBbaXRlbUlkXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0fVxuXG5cdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKGl0ZW1JZE1hcCkpIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtSWRzOiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbUlkTWFwKSB7XG5cdFx0XHRpdGVtSWRzLnB1c2goK2l0ZW1JZCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sdW1uSWRzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY2hpbGRDb2x1bW5zKSB7XG5cdFx0XHRjb2x1bW5JZHMucHVzaChjb2x1bW4uaWQpO1xuXHRcdH1cblxuXHRcdC8vIHRvZG9bY2FjaGVdIGNoZWNrIGlmIHdlIGhhdmUgdGhlc2UgdmFsdWVzIGNhY2hlZCBhbHJlYWR5XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoSXRlbUVudHJpZXMoXG5cdFx0XHRcdHJvb3RDb2x1bW4uaXRlbVR5cGUhLFxuXHRcdFx0XHRpdGVtSWRzLFxuXHRcdFx0XHRuZXcgSXRlbUVudHJ5T3B0aW9ucyh7Y29sdW1uczogY29sdW1uSWRzfSksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLnJlc29sdmVEZXJpdmVkVmFsdWVzKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHRcdFx0XHRjaGlsZENvbHVtbnMsXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyByZXNvbHZlRGVyaXZlZFZhbHVlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+Pixcblx0XHRjaGFuZ2VzRGVsdGE/OiBDaGFuZ2VzRGVsdGFCYXNlLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPGFueT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRwcm9taXNlcy5wdXNoKFxuXHRcdFx0XHR0aGlzLmZldGNoRGVyaXZlZFZhbHVlc0J5Q29sdW1uKFxuXHRcdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0XHRcdGNvbHVtbixcblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChwcm9taXNlcylcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiBpdGVtRW50cmllcyxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gZnJvbSB0aGUgcGFzc2VkIHtAbGluayBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEgQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhfSBhbmQgc3RvcmVzIGl0IGluIHRoaXMgdHJhbnNhY3Rpb24ncyB7QGxpbmsgSXRlbUNhY2hlIEl0ZW1DYWNoZX1cblx0ICovXG5cdHByb3RlY3RlZCBjcmVhdGVJdGVtRW50cnkgKFxuXHRcdGNyZWF0ZVR1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEsXG5cdCk6IEl0ZW1FbnRyeSB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5pdGVtRW50cnlGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGNyZWF0ZVR1cGxlLml0ZW1JZCxcblx0XHRcdGNyZWF0ZVR1cGxlLmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHRoaXMuZW50cmllcy5hZGQoaXRlbUVudHJ5KTtcblxuXHRcdHJldHVybiBpdGVtRW50cnk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4sIHdpbGwgbG9vayBpbnRvIHRoZSBjdXJyZW50IGRlbHRhIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgaXRlbUNoYW5nZXNcblx0ICovXG5cdHByb3RlY3RlZCBnZXRJdGVtSWRCeUNvbHVtbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29sdW1uOiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y2hhbmdlc0RlbHRhPzogQ2hhbmdlc0RlbHRhQmFzZSxcblx0KTogSXRlbUlkIHtcblx0XHRpZiAoY29sdW1uLmxldmVsID09PSAwKSB7XG5cdFx0XHRpZiAoY2hhbmdlc0RlbHRhICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5LmlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnkuaWRdLmNoYW5nZXMuZmllbGRzW2NvbHVtbi5wYXRoXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb24uZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyh0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0pW2NvbHVtbi5wYXRoXTtcblx0XHR9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSB2YWxpZGF0ZSBpZiB0aGlzIGFsc28gd29ya3MgZm9yIGRlZXBlciBsZXZlbHNcblx0XHQvLyBXZSBjb3VsZCBhbHNvIGNhbGwgZ2V0RGVyaXZlZFZhbHVlIGFuZCB1cGRhdGUgdGhhdCBmdW5jdGlvbiB0byBhY2NlcHQgYSBDaGFuZ2VzRGVsdGEgd2hpY2ggaGFzIHByZWNlZGVuY2Ugb3ZlciAnZmllbGRzJ1xuXG5cdFx0Y29uc3QgcGFyZW50SXRlbUlkID0gdGhpcy5nZXRJdGVtSWRCeUNvbHVtbihcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdGNvbHVtbi5wYXJlbnQhLFxuXHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdCk7XG5cblx0XHRjb25zdCBwYXJlbnRJdGVtRW50cnkgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsSXRlbUVudHJ5QnlJdGVtSWQoXG5cdFx0XHRjb2x1bW4ucGFyZW50IS5pdGVtVHlwZSEsXG5cdFx0XHRwYXJlbnRJdGVtSWQsXG5cdFx0KSE7XG5cblx0XHRpZiAoY2hhbmdlc0RlbHRhICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlc0RlbHRhLnVwZGF0ZWRbcGFyZW50SXRlbUVudHJ5LmlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gY2hhbmdlc0RlbHRhLnVwZGF0ZWRbcGFyZW50SXRlbUVudHJ5LmlkXS5jaGFuZ2VzLmZpZWxkc1tjb2x1bW4uaWRdO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXModGhpcy5pdGVtQ2hhbmdlc1twYXJlbnRJdGVtRW50cnkuaWRdKVtjb2x1bW4uaWRdO1xuXHR9XG5cblx0cHJvdGVjdGVkIGV4cGFuZENvbHVtbnNXaXRoQ29sbGVjdGlvbkNvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1ucz86IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBBcGlSZXF1ZXN0Q29sdW1ucyB7XG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbkV4cGFuc2lvbiA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRpZiAocmVxdWVzdENvbHVtbnMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWRkQ29sbGVjdGlvbkNvbHVtbnMgPSAodHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUpID0+IHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzID0gdHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5nZXRCeUl0ZW1UeXBlKGl0ZW1UeXBlKTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY29sbGVjdGlvbkVudHJpZXMpIHtcblx0XHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMucXVlcnlDb2x1bW5zLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIHRvZG9bY2FjaGVdIHdlIGNhbiByZW1vdmUgdGhpcyB3aGVuIHdlIHJlZmFjdG9yIHRoZSBmZXRjaGluZyBvZiByZXF1aXJlZCBjb2xsZXRpb24gY29sdW1ucyBBRlRFUiB0aGUgbWF0Y2hpbmdcblx0XHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMuY29sdW1ucyxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3QgYWRkVHJhbnNhY3Rpb25DaGlsZHJlbkNvbGxlY3Rpb25Db2x1bW5zID0gKGNoaWxkcmVuOiBBYnN0cmFjdENhY2hlW10pID0+IHtcblx0XHRcdGZvciAoY29uc3QgdHJhbnNhY3Rpb24gb2YgY2hpbGRyZW4pIHtcblx0XHRcdFx0YWRkQ29sbGVjdGlvbkNvbHVtbnModHJhbnNhY3Rpb24pO1xuXHRcdFx0XHRhZGRUcmFuc2FjdGlvbkNoaWxkcmVuQ29sbGVjdGlvbkNvbHVtbnModHJhbnNhY3Rpb24uY2hpbGRyZW4pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCB0cmFuc2FjdGlvbkNoYWluID0gdGhpcy50cmFuc2FjdGlvbi5nZXRUcmFuc2FjdGlvbkNoYWluKCk7XG5cblx0XHRmb3IgKGNvbnN0IHRyYW5zYWN0aW9uIG9mIHRyYW5zYWN0aW9uQ2hhaW4pIHtcblx0XHRcdGFkZENvbGxlY3Rpb25Db2x1bW5zKHRyYW5zYWN0aW9uKTtcblx0XHR9XG5cblx0XHRhZGRUcmFuc2FjdGlvbkNoaWxkcmVuQ29sbGVjdGlvbkNvbHVtbnModGhpcy50cmFuc2FjdGlvbi5jaGlsZHJlbik7XG5cblx0XHRyZXR1cm4gcmVxdWVzdENvbHVtbkV4cGFuc2lvbi5nZXQoKVtpdGVtVHlwZV07XG5cdH1cbn1cbiIsImltcG9ydCB7XG5cdENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENvbHVtblNldEZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0SXRlbUNhY2hlRmFjdG9yeSxcblx0SXRlbUVudHJ5RmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1FbnRyeU9wdGlvbnMsIEl0ZW1SZXNvdXJjZSwgVGVtcGxhdGUgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpUXVlcnksXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRDb2x1bW5FeHBhbnNpb25SZXN1bHQsXG5cdEVudHJ5UGFyZW50TnVsbCxcblx0RmllbGRNYXAsXG5cdEZpbHRlckl0ZW1FbnRyeUNhbGxiYWNrLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1UeXBlLFxuXHRJdGVtVHlwZU1hcCxcblx0TW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdFByb21pc2VJbnRlcmZhY2UsXG5cdFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSwgQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhIH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUJhc2UsIENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YSwgQ2hhbmdlc0RlbHRhUmVzdWx0IH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQge1xuXHRBcGlGb3JtYXR0ZXIsXG5cdENvbHVtbkhhbmRsZXIsXG5cdENvbHVtbkluZm8sXG5cdENvbHVtblNldCxcblx0Q29sdW1uU3Vic2V0Q2FjaGUsXG5cdENvbHVtblV0aWwsXG5cdGhhc1Byb3BlcnRpZXMsXG5cdEl0ZW1FbnRyeVNlcnZpY2UsXG5cdEtleVNlcnZpY2UsXG5cdFNlcnZlckNhY2hlLFxufSBmcm9tICcuLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBUZW1wbGF0ZUNhY2hlIH0gZnJvbSAnLi4vLi4vVGVtcGxhdGVDYWNoZSc7XG5pbXBvcnQgeyBJdGVtSGFuZGxlckJhc2UgfSBmcm9tICcuLi9JdGVtSGFuZGxlckJhc2UnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4vVHJhbnNhY3Rpb25DYWNoZSc7XG5cbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdGluaXRpYWw6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdGNoYW5nZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT5cbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJbiBhIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9ufSBvbmx5IGxvY2FsIGl0ZW1zIGNhbiBiZSBzdG9yZWQsIHNvIGFsbCBlbnRyaWVzIGluIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmVudHJpZXMgdGhpcy5lbnRyaWVzfSBhcmUgbG9jYWxcbiAqIElmIGEgbm9uLWxvY2FsIGVudHJ5IGlzIHJlcXVlc3RlZCBpdCBzaG91bGQgYmUgcGFzc2VkIG9uIHRvIHRoZSB7QGxpbmsgU2VydmVySXRlbUhhbmRsZXIgU2VydmVySXRlbUhhbmRsZXJ9IHdoaWNoIHdpbGwgZmV0Y2hDb2xsZWN0aW9uRW50cnkgdGhlIGVudHJ5IGZyb20gdGhlIHNlcnZlclxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25JdGVtSGFuZGxlclxuXHRleHRlbmRzIEl0ZW1IYW5kbGVyQmFzZSB7XG5cblx0Ly8gdG9kb1tjYWNoZV0gc2hvdWxkIHRoaXMgYmUge1tpdGVtVHlwZTogc3RyaW5nXToge1tpdGVtRW50cnlJZDogbnVtYmVyXTogSXRlbUVudHJ5fX0gZm9yIHF1aWNrIGxvb2t1cCA/XG5cdHB1YmxpYyBkZWxldGVkSXRlbXM6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPiA9IHt9O1xuXG5cdHB1YmxpYyBpdGVtQ2hhbmdlczoge1xuXHRcdFtpdGVtRW50cnlJZDogbnVtYmVyXTogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzXG5cdH0gPSB7fTtcblxuXHRwdWJsaWMgaXRlbVJlc291cmNlczoge1xuXHRcdFtpdGVtRW50cnlJZDogbnVtYmVyXTogSXRlbVJlc291cmNlW11cblx0fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgdGVtcGxhdGVDYWNoZTogVGVtcGxhdGVDYWNoZSxcblx0XHRwcml2YXRlIGNvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5IYW5kbGVyOiBDb2x1bW5IYW5kbGVyLFxuXHRcdHByaXZhdGUgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbHVtblN1YnNldENhY2hlRmFjdG9yeTogQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0YXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0aXRlbUVudHJ5RmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeSxcblx0XHRpdGVtQ2FjaGVGYWN0b3J5OiBJdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0XHRwcm9taXNlU2VydmljZSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY29weVRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyAoXG5cdFx0aXRlbUVudHJ5Q2hhbmdlczogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzLFxuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdCk6IFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGluaXRpYWw6IHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRcdGl0ZW1FbnRyeUNoYW5nZXMuaW5pdGlhbCxcblx0XHRcdFx0e30sXG5cdFx0XHRcdGVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdCksXG5cdFx0XHRjaGFuZ2VzOiB0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRpdGVtRW50cnlDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRlbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpLFxuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlSXRlbUVudHJ5IChcblx0XHRjcmVhdGVUdXBsZTogQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhLFxuXHQpOiBJdGVtRW50cnkge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHN1cGVyLmNyZWF0ZUl0ZW1FbnRyeShjcmVhdGVUdXBsZSk7XG5cdFx0Y29uc3QgZGVmYXVsdExvY2FsQ2hhbmdlcyA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRMb2NhbERlZmF1bHRWYWx1ZXMoKTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gZGVmYXVsdExvY2FsQ2hhbmdlcykge1xuXHRcdFx0Y3JlYXRlVHVwbGUuZmllbGRzW2NvbHVtbklkXSA9IGRlZmF1bHRMb2NhbENoYW5nZXNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0Y3JlYXRlVHVwbGUuZmllbGRzLFxuXHRcdFx0e30sXG5cdFx0XHRjcmVhdGVUdXBsZS5jb2x1bW5zLm1haW4sXG5cdFx0KTtcblxuXHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9IHtcblx0XHRcdGluaXRpYWw6IGNyZWF0ZVR1cGxlLmZpZWxkcyxcblx0XHRcdGNoYW5nZXM6IGNoYW5nZXMsXG5cdFx0fTtcblxuXHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXS5pbml0aWFsLmlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0uY2hhbmdlcy5pZCA9IGl0ZW1FbnRyeS5pdGVtSWQ7XG5cblx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIHRoZSBsb2NhbCB7QGxpbmsgRmllbGRNYXAgY2hhbmdlc30gb2YgdGhlIHtAbGluayBJdGVtRW50cnkgZW50cnl9IG9uIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSB0cmFuc2FjdGlvbn0gaW4gYSBmb3JtYXR0ZWQgd2F5IHRoZSBBUEkgYWNjZXB0c1xuXHQgKi9cblx0cHVibGljIGZvcm1hdFJlcXVlc3Q8SXRlbUVudHJ5VHlwZSBleHRlbmRzIEl0ZW1FbnRyeT4gKFxuXHRcdGVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHQpOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPiB7XG5cdFx0Y29uc3QgbWFpbkNvbHVtbnMgPSBlbnRyeS5jb2x1bW5zLm1haW47XG5cblx0XHRpZiAoZW50cnkuaXNMb2NhbCgpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuZm9ybWF0UmVxdWVzdExvY2FsKFxuXHRcdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5jaGFuZ2VzLFxuXHRcdFx0XHRtYWluQ29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlcXVlc3QoXG5cdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5pbml0aWFsLFxuXHRcdFx0dGhpcy5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0uY2hhbmdlcyxcblx0XHRcdG1haW5Db2x1bW5zLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSBuZXcge0BsaW5rIFRlbXBsYXRlIHRlbXBsYXRlfSBhbmQgY3JlYXRlcyBuZXcge0BsaW5rIEl0ZW1FbnRyeSBpdGVtRW50cmllc30gd2l0aCB0aGUgcGFzc2VkIHZhbHVlc1xuXHQgKi9cblx0cHVibGljIGNyZWF0ZUl0ZW1zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHR2YWx1ZXNBcnJheTogQXJyYXk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4sXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0Y29uc3QgcHJvbWlzZXM6IGFueVtdID0gW107XG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0Y29uc3QgdGVtcGxhdGVDb2x1bW5zID0ge1xuXHRcdFx0W2l0ZW1UeXBlXTogdGhpcy5leHBhbmRDb2x1bW5zV2l0aENvbGxlY3Rpb25Db2x1bW5zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdCksXG5cdFx0fTtcblxuXHRcdGZvciAoY29uc3QgdmFsdWVzIG9mIHZhbHVlc0FycmF5KSB7XG5cdFx0XHRjb25zdCBpdGVtSWQgPSB0aGlzLmtleVNlcnZpY2UuZ2V0TG9jYWxJZCgpO1xuXG5cdFx0XHRwcm9taXNlcy5wdXNoKFxuXHRcdFx0XHR0aGlzLnRlbXBsYXRlQ2FjaGVcblx0XHRcdFx0XHQuZmV0Y2hUZW1wbGF0ZShcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0e30sXG5cdFx0XHRcdFx0XHR0ZW1wbGF0ZUNvbHVtbnMsXG5cdFx0XHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0KHRlbXBsYXRlOiBUZW1wbGF0ZTxJdGVtVHlwZVR5cGU+KSA9PiB7XG5cdFx0XHRcdFx0XHRcdHRoaXMucmVzb2x2ZUxvY2FsKFxuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHRcdFx0cGFyZW50LFxuXHRcdFx0XHRcdFx0XHRcdHRlbXBsYXRlLFxuXHRcdFx0XHRcdFx0XHRcdCgpID0+IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0KFxuXHRcdFx0XHRcdFx0XHRcdFx0X2l0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0XHRcdFx0XHQpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChfaXRlbVR5cGUgIT09IGl0ZW1UeXBlKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiB2YWx1ZXMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IHZhbHVlc1tjb2x1bW5JZF07XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Vcblx0XHRcdC5hbGwocHJvbWlzZXMpXG5cdFx0XHQudGhlbigoKSA9PiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSkpO1xuXHR9XG5cblx0cHVibGljIGNsZWFySXRlbUVudHJ5IChlbnRyeTogSXRlbUVudHJ5KTogdm9pZCB7XG5cdFx0c3VwZXIuY2xlYXJJdGVtRW50cnkoZW50cnkpO1xuXG5cdFx0ZGVsZXRlIHRoaXMuaXRlbVJlc291cmNlc1tlbnRyeS5pZF07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFN0b3JlcyBhbSB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZX0gb24gdGhlIHRyYW5zYWN0aW9uLCB1c2VkIHRvIGNhbGwge0BsaW5rIEl0ZW1SZXNvdXJjZS5vcHRpb25zLm9uQ2hhbmdlIHRoZSBvbkNoYW5nZSBjYWxsYmFja31cblx0ICovXG5cdHB1YmxpYyBhZGRSZXNvdXJjZSAocmVzb3VyY2U6IEl0ZW1SZXNvdXJjZSk6IHZvaWQge1xuXHRcdGxldCByZXNvdXJjZUFycmF5ID0gdGhpcy5pdGVtUmVzb3VyY2VzW3Jlc291cmNlLmVudHJ5LmlkXTtcblxuXHRcdGlmIChyZXNvdXJjZUFycmF5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlc291cmNlQXJyYXkgPSB0aGlzLml0ZW1SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdID0gW107XG5cdFx0fVxuXG5cdFx0cmVzb3VyY2VBcnJheS5wdXNoKHJlc291cmNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVtb3ZlcyBhIHJlc291cmNlIGZyb20gdGhlIHRyYW5zYWN0aW9uLCBwcmV2ZW50aW5nIHRoZSB7QGxpbmsgSXRlbVJlc291cmNlLm9wdGlvbnMub25DaGFuZ2UgdGhlIG9uQ2hhbmdlIGNhbGxiYWNrfSBmcm9tIGJlaW5nIGNhbGxlZC5cblx0ICogWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgcmVzb3VyY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZFxuXHQgKi9cblx0cHVibGljIGNsZWFyUmVzb3VyY2UgKHJlc291cmNlOiBJdGVtUmVzb3VyY2UpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZXMgPSB0aGlzLml0ZW1SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdO1xuXG5cdFx0Ly8gSXQgY2FuIGJlIHRoYXQgYW4gaXRlbSB3YXMgYWxyZWFkeSBtYXJrZWQgZm9yIGRlbGV0aW9uLCBhbmQgYWxsIHJlc291cmNlcyBhcmUgYWxyZWFkeSBkZWxldGVkXG5cdFx0aWYgKHJlc291cmNlcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgaW5kZXggPSByZXNvdXJjZXMuaW5kZXhPZihyZXNvdXJjZSk7XG5cblx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHRyZXNvdXJjZXMuc3BsaWNlKFxuXHRcdFx0XHRpbmRleCxcblx0XHRcdFx0MSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlc291cmNlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBkZXRlY3RDaGFuZ2VzICgpOiBib29sZWFuIHtcblx0XHQvLyBpZiBhbiBlbnRyeSBpcyBpbiB0aGlzIHRyYW5zYWN0aW9uJ3MgY2FjaGUgaXQncyBhIGxvY2FsIG9uZSwgd2hpY2ggY291bnRzIGFzIGEgY2hhbmdlXG5cdFx0Zm9yIChjb25zdCBfaXRlbUVudHJ5SWQgaW4gdGhpcy5lbnRyaWVzLmVudHJpZXNCeUVudHJ5SWQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gdGhpcy5pdGVtQ2hhbmdlcykge1xuXHRcdFx0Y29uc3QgaGFzQ2hhbmdlcyA9IHRoaXMuZGV0ZWN0RW50cnlDaGFuZ2VzKE51bWJlcihpdGVtRW50cnlJZCkpO1xuXG5cdFx0XHRpZiAoaGFzQ2hhbmdlcykge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENoZWNrcyBpZiB0aGUgdHJhbnNhY3Rpb24gaGFzIGNoYW5nZXMgZm9yIHRoZSBwYXNzZWQge0BsaW5rIEl0ZW1FbnRyeS5pZCBJdGVtRW50cnlJZH1cblx0ICpcblx0ICogLS0tLS1cblx0ICogQHJlbWFya3Ncblx0ICogQ29tcGFyZXMgZXZlcnkgZmllbGQgKG9mIHRoZSBlbnRyeSkgaW4ge0BsaW5rIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIuaXRlbUNoYW5nZXMgaXRlbUNoYW5nZXN9IHdpdGggdGhlIGluaXRpYWwgZmllbGRzLCBiZWNhdXNlIGZpZWxkcyBhcmUgY29waWVkIG92ZXIgd2hlbiBjcmVhdGluZyBhIHJlc291cmNlIGhhdmluZyBzb21ldGhpbmcgaW4gaXRlbUNoYW5nZXMgZG9lc24ndCBhY3R1YWxseSBtZWFuIHRoYXQgdGhlcmUgYXJlIGNoYW5nZXMgKGp1c3QgdGhhdCBhIHJlc291cmNlIGhhcyBiZWVuIG1hZGUpXG5cdCAqL1xuXHRwdWJsaWMgZGV0ZWN0RW50cnlDaGFuZ2VzIChpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCkhO1xuXHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeUlkXTtcblxuXHRcdHJldHVybiB0aGlzLmFwaUZvcm1hdHRlci5oYXNDaGFuZ2VzKFxuXHRcdFx0Y2hhbmdlcy5pbml0aWFsLFxuXHRcdFx0Y2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBQcm9jZXNzZXMgb24gYSBjYWNoZWQgZW50cnksIGlmIHRoZXJlIGFyZSBubyB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5pdGVtQ2hhbmdlcyBpdGVtQ2hhbmdlc30gdGhlIG5ldyB2YWx1ZXMgd2lsbCBub3QgYmUgcHJvY2Vzc2VkLCB1bmxlc3MgZm9yY2VPdmVyd3JpdGUgaXMgc2V0XG5cdCAqXG5cdCAqIEBwYXJhbSBpdGVtRW50cnlDaGFuZ2VzVHVwbGUgVGhlIGNoYW5nZXMgdHVwbGVcblx0ICogQHBhcmFtIGZvcmNlT3ZlcndyaXRlIEluc3RlYWQgb2YgY2FsbGluZyB7QGxpbmsgQXBpRm9ybWF0dGVyLm1lcmdlQ29weUZpZWxkcyBtZXJnZUNvcHlGaWVsZHN9LCB7QGxpbmsgQXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMgY29weUZpZWxkc30gd2lsbCBiZSB1c2VkIChiZWNhdXNlIEFQSSB2YWx1ZXMgYXJlIGFsd2F5cyByaWdodClcblx0ICogQHBhcmFtIHVwZGF0ZUluaXRpYWwgU2hvdWxkIGJlIGB0cnVlYCBpZiBjYWxsZWQgYnkgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudFxuXHQgKiBAcGFyYW0gaXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSBJbmRpY2F0ZXMgdGhhdCB0aGUgY2hhbmdlIGlzIGRvbmUgYnkgYSBkaWZmZXJlbnQgdXNlclxuXHQgKlxuXHQgKiBAcmV0dXJuc1xuXHQgKiBUaGUgcHJldmlvdXMgY2hhbmdlcyB7QGxpbmsgRmllbGRNYXAgRmllbGRNYXB9XG5cdCAqL1xuXHRwdWJsaWMgcHJvY2Vzc0l0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRpdGVtRW50cnlDaGFuZ2VzVHVwbGU6IENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YTxJdGVtVHlwZVR5cGU+LFxuXHRcdGZvcmNlT3ZlcndyaXRlOiBib29sZWFuID0gZmFsc2UsXG5cdFx0dXBkYXRlSW5pdGlhbDogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB8IG51bGwge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGl0ZW1FbnRyeUNoYW5nZXNUdXBsZS5lbnRyeTtcblx0XHRjb25zdCBjaGFuZ2VzID0gaXRlbUVudHJ5Q2hhbmdlc1R1cGxlLmNoYW5nZXM7XG5cblx0XHQvLyBJZiB3ZSBkb24ndCBoYXZlIHRoZXNlIGl0ZW1zIGNhY2hlZCAgd2UgZG9uJ3QgbmVlZCB0byBtZXJnZS9jb3B5IGFueXRoaW5nXG5cdFx0aWYgKHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlcy5leHBhbmRlZENvbHVtbnMgIT09IG51bGwpIHtcblx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zID0gY2hhbmdlcy5leHBhbmRlZENvbHVtbnMubWVyZ2VkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGxvY2FsQ2hhbmdlcyA9IHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdGNvbnN0IHByZXZpb3VzID0gdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0e30sXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHRjb25zdCBoYXNVcGRhdGVkRmllbGRzID0gdGhpcy5hcGlGb3JtYXR0ZXIuaGFzQ2hhbmdlcyhcblx0XHRcdGNoYW5nZXMuZmllbGRzLFxuXHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHRpZiAoZm9yY2VPdmVyd3JpdGUpIHtcblx0XHRcdHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRcdGNoYW5nZXMuZmllbGRzLFxuXHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuYXBpRm9ybWF0dGVyLm1lcmdlQ29weUZpZWxkcyhcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmluaXRpYWwsXG5cdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0XHRjaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHVwZGF0ZUluaXRpYWwpIHtcblx0XHRcdHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRcdGNoYW5nZXMuZmllbGRzLFxuXHRcdFx0XHRsb2NhbENoYW5nZXMuaW5pdGlhbCxcblx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKGNoYW5nZXMuZmllbGRzLmRpc3BsYXluYW1lID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IG5ld0Rpc3BsYXlOYW1lID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldERpc3BsYXlOYW1lKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKG5ld0Rpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMuZGlzcGxheW5hbWUgPSBuZXdEaXNwbGF5TmFtZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoaGFzVXBkYXRlZEZpZWxkcykge1xuXHRcdFx0Y29uc3QgcmVzb3VyY2VzID0gdGhpcy5pdGVtUmVzb3VyY2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRcdGlmIChyZXNvdXJjZXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRyZXNvdXJjZS5vcHRpb25zLm9uQ2hhbmdlKFxuXHRcdFx0XHRcdFx0XHRyZXNvdXJjZSxcblx0XHRcdFx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHRcdFx0XHRcdGNvbHVtbklkID0+IHJlc291cmNlLmNvbXBhcmVJdGVtRmllbGQoXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBwcmV2aW91cztcblx0fVxuXG5cdHB1YmxpYyBjbG9uZUl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwID0ge30sXG5cdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2s/OiBNb2RpZnlGaWVsZHNDYWxsYmFjayxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHQvLyB0aGUgdGhlIGl0ZW1zIG1pZ2h0IHJlZmVyZW5jZSBlYWNoIG90aGVyLCBzbyB1cGRhdGUgdGhlIGNvbnZlcnNpb24gbWFwIGZpcnN0XG5cdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLmJhdGNoRXhwYW5kQ29udmVyc2lvbk1hcChcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdHRoaXMuY2xvbmVJdGVtRW50cnkoXG5cdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRzb3VyY2VFbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0bmV3RmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+ID0ge30sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9LFxuXHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrPzogTW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdCk6IEl0ZW1JZCB7XG5cdFx0Y29uc3Qgc291cmNlRW50cnlDaGFuZ2VzVHVwbGUgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsSXRlbUVudHJ5Q2hhbmdlc1R1cGxlKFxuXHRcdFx0c291cmNlRW50cnkuaWQsXG5cdFx0KTtcblxuXHRcdGNvbnN0IG5ld0l0ZW1JZCA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5leHBhbmRDb252ZXJzaW9uTWFwKFxuXHRcdFx0c291cmNlRW50cnksXG5cdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdCk7XG5cblx0XHRjb25zdCBzb3VyY2VQYXJlbnQgPSB0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChzb3VyY2VFbnRyeSk7XG5cdFx0bGV0IG5ld1BhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbDtcblxuXHRcdGlmIChzb3VyY2VQYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdGNvbnN0IG5ld1BhcmVudElkID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldENvbnZlcnNpb25WYWx1ZShcblx0XHRcdFx0c291cmNlUGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0XHRzb3VyY2VQYXJlbnQuaXRlbUlkLFxuXHRcdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdFx0KTtcblxuXHRcdFx0bmV3UGFyZW50ID0ge1xuXHRcdFx0XHRpdGVtVHlwZTogc291cmNlUGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQ6IG5ld1BhcmVudElkIHx8IHNvdXJjZVBhcmVudC5pdGVtSWQsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IHNvdXJjZUZpZWxkcyA9IHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRzb3VyY2VFbnRyeUNoYW5nZXNUdXBsZS5jaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHR7fSxcblx0XHRcdHNvdXJjZUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0Y29uc3QgdXBkYXRlZEl0ZW1WYWx1ZXMgPSB0aGlzLnVwZGF0ZUl0ZW1WYWx1ZXMoXG5cdFx0XHRzb3VyY2VGaWVsZHMsXG5cdFx0XHRuZXdQYXJlbnQsXG5cdFx0XHRzb3VyY2VFbnRyeS5jb2x1bW5zLml0ZW0sXG5cdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHVwZGF0ZWRJdGVtVmFsdWVzKSB7XG5cdFx0XHRzb3VyY2VGaWVsZHNbY29sdW1uSWRdID0gdXBkYXRlZEl0ZW1WYWx1ZXNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gbmV3RmllbGRzKSB7XG5cdFx0XHRzb3VyY2VGaWVsZHNbY29sdW1uSWRdID0gbmV3RmllbGRzW2NvbHVtbklkXTtcblx0XHR9XG5cblx0XHRpZiAobW9kaWZ5RmllbGRzQ2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2soXG5cdFx0XHRcdHNvdXJjZUVudHJ5LFxuXHRcdFx0XHRzb3VyY2VGaWVsZHMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZChcblx0XHRcdG5ld0l0ZW1JZCxcblx0XHRcdHNvdXJjZUZpZWxkcyxcblx0XHRcdHNvdXJjZUVudHJ5LmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJldHVybiBuZXdJdGVtSWQ7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cmllc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRlbnRyeU9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHQuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaEl0ZW1FbnRyaWVzQnlRdWVyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRlbnRyeU9wdGlvbnMsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKCF0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKGl0ZW1JZCkpIHtcblx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHRcdC5pdGVtSGFuZGxlclxuXHRcdFx0XHQuZmV0Y2hJdGVtRW50cnkoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2FjaGVkRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChjYWNoZWRFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAodGhpcy50cmFuc2FjdGlvbi5wYXJlbnQgaW5zdGFuY2VvZiBTZXJ2ZXJDYWNoZSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KFxuXHRcdFx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZS5jcmVhdGVVbmZvdW5kTG9jYWxJdGVtRXJyb3IoaXRlbVR5cGUpLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXaGVuIGV4cGFuZGluZyBpdGVtcyB3aXRoIG5ldyBkYXRhICh3aGljaCBhcmVuJ3QgdGVjaG5pY2FsbHkgY2hhbmdlcykgaXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHRoZSBpdGVtIGxpdmVzIG9uXG5cdFx0XHQvLyBXZSBkbyB0aGUgc2FtZSAoYnV0IGZhc3RlcikgYnkgc2tpcHBpbmcgc3RyYWlnaHQgdG8gdGhlIHNlcnZlciBjYWNoZSBmb3IgcmVtb3RlIGl0ZW1zXG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5wYXJlbnQuaXRlbUhhbmRsZXIuZmV0Y2hJdGVtRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdG9wdGlvbnMuY29sdW1ucyA9IHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhDb2xsZWN0aW9uQ29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGUgPSB0aGlzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeS5jb25zdHJ1Y3Qob3B0aW9ucy5jb2x1bW5zKTtcblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hMb2NhbEl0ZW1FbnRyeURhdGEoXG5cdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUsXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0aXRlbUVudHJ5ID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHRcdFx0LmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSlcblx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHQoKSA9PiBpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSB0ZW1wbGF0ZSBhbmQgY3JlYXRlcyBhIG5ldyB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0sIHdpbGwgZXJyb3IgaWYgdGhlIEl0ZW1FbnRyeSB3aXRoIHRoZSBnaXZlbiBJdGVtSWQgYWxyZWFkeSBleGlzdHNcblx0ICovXG5cdHB1YmxpYyBmZXRjaE5ld0l0ZW1FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRpZiAoXG5cdFx0XHR0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0KSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KFxuXHRcdFx0XHR0aGlzLml0ZW1FbnRyeVNlcnZpY2UuY3JlYXRlRXhpc3RpbmdMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnRlbXBsYXRlQ2FjaGVcblx0XHRcdC5mZXRjaFRlbXBsYXRlKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRvcHRpb25zLnRlbXBsYXRlT3B0aW9ucyxcblx0XHRcdFx0b3B0aW9ucy50ZW1wbGF0ZUNvbHVtbnMsXG5cdFx0XHRcdG9wdGlvbnMucGFyZW50LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHRlbXBsYXRlID0+IHtcblx0XHRcdFx0XHQvLyBJdCBjb3VsZCBiZSB0aGF0IGZvciB3aGF0ZXZlciByZWFzb24gJ2ZldGNoTmV3SXRlbScgaXMgY2FsbGVkIGEgc2Vjb25kIHRpbWUgd2hpbGUgbG9hZGluZ1xuXHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHQpICE9PSB1bmRlZmluZWRcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5yZWplY3QoXG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZS5jcmVhdGVFeGlzdGluZ0xvY2FsSXRlbUVycm9yKGl0ZW1UeXBlKSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0XHRcdFx0dGhpcy5yZXNvbHZlTG9jYWwoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdG9wdGlvbnMucGFyZW50LFxuXHRcdFx0XHRcdFx0dGVtcGxhdGUsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRjb25zdCByZW1vdGVJdGVtSWRzOiBJdGVtSWRbXSA9IFtdO1xuXHRcdGNvbnN0IGxvY2FsSXRlbUlkczogSXRlbUlkW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGl0ZW1JZHMpIHtcblx0XHRcdGlmICh0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKGl0ZW1JZCkpIHtcblx0XHRcdFx0bG9jYWxJdGVtSWRzLnB1c2goaXRlbUlkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW90ZUl0ZW1JZHMucHVzaChpdGVtSWQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlXG5cdFx0XHQuYWxsKHtcblx0XHRcdFx0cmVtb3RlOiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdFx0XHQuaXRlbUhhbmRsZXJcblx0XHRcdFx0XHQuZmV0Y2hJdGVtRW50cmllcyhcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0cmVtb3RlSXRlbUlkcyxcblx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0bG9jYWw6IHRoaXMuZmV0Y2hMb2NhbEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGxvY2FsSXRlbUlkcyxcblx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHQpLFxuXHRcdFx0fSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXN1bHQgPT4ge1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHQucmVtb3RlLmNvbmNhdChyZXN1bHQubG9jYWwpO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8vIHRvZG9bY2FjaGVdIG1vdmUgdG8gVHJhbnNhY3Rpb25DYWNoZSA/XG5cdHB1YmxpYyBmZXRjaFRpdGxlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8c3RyaW5nPiB7XG5cdFx0Y29uc3QgdGl0bGVGaWVsZCA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRUaXRsZUZpZWxkKGl0ZW1UeXBlKTtcblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hJdGVtRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdG5ldyBJdGVtRW50cnlPcHRpb25zKHtcblx0XHRcdFx0XHRjb2x1bW5zOiBbdGl0bGVGaWVsZF0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGl0ZW1FbnRyeSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pZCxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRyZXR1cm4gY2hhbmdlc1t0aXRsZUZpZWxkXTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyByZXNvbHZlTG9jYWxJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtblN1YnNldENhY2hlOiBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRpZiAoY29sdW1uU3Vic2V0Q2FjaGUucnVuKGl0ZW1FbnRyeS5jb2x1bW5zKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihpdGVtRW50cnkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbHVtbkRpZmZlcmVuY2UgPSB0aGlzLmdldENvbHVtbkRpZmZlcmVuY2UoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRvcHRpb25zLmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLmNvbHVtbkhhbmRsZXJcblx0XHRcdC5mZXRjaChcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRjb2x1bW5EaWZmZXJlbmNlLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZXhwYW5kTG9jYWxJdGVtRW50cmllcyhcblx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdFtpdGVtRW50cnldLFxuXHRcdFx0XHRcdFx0Y29sdW1uRGlmZmVyZW5jZSxcblx0XHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gaXRlbUVudHJ5LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUxvY2FsRW50cmllcyAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0bG9jYWxQYXJlbnRJZDogSXRlbUlkLFxuXHRcdHRlbXBsYXRlOiBUZW1wbGF0ZTxJdGVtVHlwZT4sXG5cdFx0aXRlbUlkQ29udmVyc2lvbjogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0XHRmaWx0ZXJJdGVtRW50cnlDYWxsYmFjazogRmlsdGVySXRlbUVudHJ5Q2FsbGJhY2sgPSAoKSA9PiB0cnVlLFxuXHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrPzogTW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGFwaVJlc3BvbnNlID0gdGVtcGxhdGUucmVzcG9uc2U7XG5cdFx0Y29uc3QgY29sdW1uU2V0TWFwOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBDb2x1bW5TZXQ8SXRlbVR5cGU+fSA9IHt9O1xuXG5cdFx0Y29uc3QgY3JlYXRlRW50cmllcyA9IChcblx0XHRcdF9wYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRcdF9sb2NhbFBhcmVudElkOiBJdGVtSWQsXG5cdFx0XHRhcGlQYXJlbnRJZDogSXRlbUlkLFxuXHRcdCkgPT4ge1xuXHRcdFx0Y29uc3QgcGFyZW50ID0ge1xuXHRcdFx0XHRpdGVtVHlwZTogX3BhcmVudFR5cGUsXG5cdFx0XHRcdGl0ZW1JZDogX2xvY2FsUGFyZW50SWQsXG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBsaW5rcyA9IGFwaVJlc3BvbnNlLml0ZW1zW19wYXJlbnRUeXBlXVthcGlQYXJlbnRJZF0ubGlua3M7XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gbGlua3MpIHtcblx0XHRcdFx0aWYgKCFsaW5rcy5oYXNPd25Qcm9wZXJ0eShpdGVtVHlwZSkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjb2x1bW5TZXRNYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb2x1bW5TZXRNYXBbaXRlbVR5cGVdID0gdGhpcy5jb2x1bW5TZXRGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdHRlbXBsYXRlLnJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yIChjb25zdCBhcGlJdGVtSWQgb2YgbGlua3NbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0Y29uc3QgZmllbGRzID0gYXBpUmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGFwaUl0ZW1JZCxcblx0XHRcdFx0XHQpITtcblxuXHRcdFx0XHRcdGlmICghZmlsdGVySXRlbUVudHJ5Q2FsbGJhY2soXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0XHQpKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBsb2NhbEl0ZW1JZCA9IGl0ZW1JZENvbnZlcnNpb25baXRlbVR5cGVdW2FwaUl0ZW1JZF07XG5cblx0XHRcdFx0XHRjb25zdCB1cGRhdGVkSXRlbVZhbHVlcyA9IHRoaXMudXBkYXRlSXRlbVZhbHVlcyhcblx0XHRcdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0XHRcdHBhcmVudCxcblx0XHRcdFx0XHRcdGNvbHVtblNldE1hcFtpdGVtVHlwZV0uaXRlbSxcblx0XHRcdFx0XHRcdGl0ZW1JZENvbnZlcnNpb24sXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gdXBkYXRlZEl0ZW1WYWx1ZXMpIHtcblx0XHRcdFx0XHRcdGZpZWxkc1tjb2x1bW5JZF0gPSB1cGRhdGVkSXRlbVZhbHVlc1tjb2x1bW5JZF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG1vZGlmeUZpZWxkc0NhbGxiYWNrICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrKFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWRDb252ZXJzaW9uLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0b2RvW2NhY2hlXSB0ZXN0IHBhcmVudEZpZWxkcywgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBjb2x1bW5zIGZvciBpdFxuXHRcdFx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZChcblx0XHRcdFx0XHRcdGxvY2FsSXRlbUlkLFxuXHRcdFx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRcdFx0Y29sdW1uU2V0TWFwW2l0ZW1UeXBlXSxcblx0XHRcdFx0XHRcdHBhcmVudCxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y3JlYXRlRW50cmllcyhcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0bG9jYWxJdGVtSWQsXG5cdFx0XHRcdFx0XHRhcGlJdGVtSWQsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjcmVhdGVFbnRyaWVzKFxuXHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdGxvY2FsUGFyZW50SWQsXG5cdFx0XHRhcGlSZXNwb25zZS5saW5rc1twYXJlbnRUeXBlXVswXSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGV4cGFuZExvY2FsSXRlbUVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YUJhc2UsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0aWYgKGl0ZW1FbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihpdGVtRW50cmllcyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBleHBhbnNpb25SZXN1bHQgPSBjb2x1bW5FeHBhbnNpb24ucnVuKGl0ZW1FbnRyeS5jb2x1bW5zKTtcblxuXHRcdFx0aWYgKGV4cGFuc2lvblJlc3VsdCA9PT0gbnVsbCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5leHBhbmRMb2NhbEl0ZW1FbnRyeShcblx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdGV4cGFuc2lvblJlc3VsdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVzb2x2ZURlcml2ZWRWYWx1ZXMoXG5cdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdGNvbHVtbkV4cGFuc2lvbi5hZ2dyZWdhdGVSb290Q29sdW1ucygpLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgdXBkYXRlSXRlbVZhbHVlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdFx0aXRlbUNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgcmVzdWx0ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBpdGVtQ29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cdFx0XHRjb25zdCBhcGlDb2x1bW4gPSBjb2x1bW4uYXBpQ29sdW1uO1xuXG5cdFx0XHQvLyBUT0RPOiB3ZSBjYW4gcmVjb25zaWRlciB0aGlzIG9uY2UgYWxsIGNvbHVtbnMgYXJlIHJlc3BlY3RlZCBmb3IgbG9jYWwgaXRlbXMgW1JNNC0xMDM3OF1cblx0XHRcdGxldCBuZXdWYWx1ZTtcblxuXHRcdFx0aWYgKGFwaUNvbHVtbi50eXBlID09PSAnbGluaycgJiYgY2hhbmdlc1tjb2x1bW5JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0bmV3VmFsdWUgPSBwYXJlbnQuaXRlbUlkO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRuZXdWYWx1ZSA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRDb252ZXJzaW9uVmFsdWUoXG5cdFx0XHRcdFx0YXBpQ29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRcdGNoYW5nZXNbY29sdW1uSWRdLFxuXHRcdFx0XHRcdGNvbnZlcnNpb25NYXAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChuZXdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJlc3VsdFtjb2x1bW5JZF0gPSBuZXdWYWx1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSBkYXRhIGZvciB0aGUgcGFzc2VkIEl0ZW1UeXBlL0l0ZW1JZC9jb2x1bW5zLCBpcyBhYmxlIHRvIGZldGNoQ29sbGVjdGlvbkVudHJ5IG5vbi1sb2NhbCBkZXJpdmVkIHZhbHVlcy5cblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBBc3N1bWVzIHRoZSB0aGUgSXRlbUVudHJ5IHdpdGggdGhlIGdpdmVuIEl0ZW1UeXBlLUl0ZW1JZCBpcyBhbHJlYWR5IGNhY2hlZFxuXHQgKi9cblx0cHVibGljIGZldGNoTG9jYWxJdGVtRW50cnlEYXRhPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRjb2x1bW5TdWJzZXRDYWNoZTogQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpIHtcblx0XHRjb25zdCBjYWNoZWRFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHQpO1xuXG5cdFx0aWYgKGNhY2hlZEVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5yZWplY3QoXG5cdFx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZS5jcmVhdGVVbmZvdW5kTG9jYWxJdGVtRXJyb3IoaXRlbVR5cGUpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNvbHZlTG9jYWxJdGVtRW50cnkoXG5cdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRjYWNoZWRFbnRyeSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoTG9jYWxJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRvcHRpb25zLmNvbHVtbnMgPSB0aGlzLmV4cGFuZENvbHVtbnNXaXRoQ29sbGVjdGlvbkNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMuY29sdW1ucyxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG9wdGlvbnMuY29sdW1ucyk7XG5cdFx0Y29uc3QgcHJvbWlzZXM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8YW55Pj4gPSBbXTtcblxuXHRcdGNvbnN0IGl0ZW1JZHNPblBhcmVudFRyYW5zYWN0aW9uOiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgaXRlbUlkcykge1xuXHRcdFx0Y29uc3QgY2FjaGVkRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGNhY2hlZEVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYgKHRoaXMudHJhbnNhY3Rpb24ucGFyZW50IGluc3RhbmNlb2YgU2VydmVyQ2FjaGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KFxuXHRcdFx0XHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLmNyZWF0ZVVuZm91bmRMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdoZW4gZXhwYW5kaW5nIGl0ZW1zIHdpdGggbmV3IGRhdGEgKHdoaWNoIGFyZW4ndCB0ZWNobmljYWxseSBjaGFuZ2VzKSBpdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgdHJhbnNhY3Rpb24gdGhlIGl0ZW0gbGl2ZXMgb25cblx0XHRcdFx0Ly8gV2UgZG8gdGhlIHNhbWUgKGJ1dCBmYXN0ZXIpIGJ5IHNraXBwaW5nIHN0cmFpZ2h0IHRvIHRoZSBzZXJ2ZXIgY2FjaGUgZm9yIHJlbW90ZSBpdGVtc1xuXHRcdFx0XHRpdGVtSWRzT25QYXJlbnRUcmFuc2FjdGlvbi5wdXNoKGl0ZW1JZCk7XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdHRoaXMuZmV0Y2hMb2NhbEl0ZW1FbnRyeURhdGEoXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZSxcblx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAoaXRlbUlkc09uUGFyZW50VHJhbnNhY3Rpb24ubGVuZ3RoID4gMCkge1xuXHRcdFx0aWYgKHRoaXMudHJhbnNhY3Rpb24ucGFyZW50IGluc3RhbmNlb2YgU2VydmVyQ2FjaGUpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdUcmllZCBsb29raW5nIGZvciBsb2NhbCBlbnRyaWVzIG9uIHRoZSBzZXJ2ZXJDYWNoZScpO1xuXHRcdFx0fVxuXG5cdFx0XHRwcm9taXNlcy5wdXNoKFxuXHRcdFx0XHQodGhpcy50cmFuc2FjdGlvbi5wYXJlbnQgYXMgVHJhbnNhY3Rpb25DYWNoZSkuaXRlbUhhbmRsZXIuZmV0Y2hMb2NhbEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZHNPblBhcmVudFRyYW5zYWN0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlXG5cdFx0XHQuYWxsKHByb21pc2VzKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHRcdFx0LmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSlcblx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHQoKSA9PiBpdGVtSWRzLm1hcChcblx0XHRcdFx0XHRcdFx0XHRpdGVtSWQgPT4gdGhpcy50cmFuc2FjdGlvbi5nZXRMb2NhbEl0ZW1FbnRyeUJ5SXRlbUlkKFxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHRcdFx0KSEsXG5cdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGdldENvbHVtbkRpZmZlcmVuY2UgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4sXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBBcGlSZXF1ZXN0Q29sdW1ucyB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1uVXRpbC5tZXJnZVJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMucmVxdWVzdCxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdCkuZGlmZmVyZW5jZTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZUxvY2FsPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0XHR0ZW1wbGF0ZTogVGVtcGxhdGU8SXRlbVR5cGVUeXBlPixcblx0XHRmaWx0ZXJJdGVtRW50cnlDYWxsYmFjazogRmlsdGVySXRlbUVudHJ5Q2FsbGJhY2sgPSAoKSA9PiB0cnVlLFxuXHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrPzogTW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGl0ZW1JZENvbnZlcnNpb24gPSB0aGlzLml0ZW1FbnRyeVNlcnZpY2UuY3JlYXRlTG9jYWxDb252ZXJzaW9uTWFwKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0XHR0cnVlLFxuXHRcdFx0dGVtcGxhdGUucmVzcG9uc2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvcGllZEZpZWxkcyA9IHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHR0ZW1wbGF0ZS5maWVsZHMsXG5cdFx0XHR7fSxcblx0XHRcdHRlbXBsYXRlLmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0Y29uc3QgdXBkYXRlZEl0ZW1WYWx1ZXMgPSB0aGlzLnVwZGF0ZUl0ZW1WYWx1ZXMoXG5cdFx0XHRjb3BpZWRGaWVsZHMsXG5cdFx0XHRwYXJlbnQsXG5cdFx0XHR0ZW1wbGF0ZS5jb2x1bW5zLml0ZW0sXG5cdFx0XHRpdGVtSWRDb252ZXJzaW9uLFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHVwZGF0ZWRJdGVtVmFsdWVzKSB7XG5cdFx0XHRjb3BpZWRGaWVsZHNbY29sdW1uSWRdID0gdXBkYXRlZEl0ZW1WYWx1ZXNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdGlmIChtb2RpZnlGaWVsZHNDYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtb2RpZnlGaWVsZHNDYWxsYmFjayhcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGNvcGllZEZpZWxkcyxcblx0XHRcdFx0aXRlbUlkQ29udmVyc2lvbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHRcdFx0aXRlbUlkLFxuXHRcdFx0Y29waWVkRmllbGRzLFxuXHRcdFx0dGVtcGxhdGUuY29sdW1ucyxcblx0XHRcdHBhcmVudCxcblx0XHQpO1xuXG5cdFx0dGhpcy5jcmVhdGVMb2NhbEVudHJpZXMoXG5cdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHRcdHRlbXBsYXRlLFxuXHRcdFx0aXRlbUlkQ29udmVyc2lvbixcblx0XHRcdGZpbHRlckl0ZW1FbnRyeUNhbGxiYWNrLFxuXHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZXhwYW5kTG9jYWxJdGVtRW50cnk8SXRlbUVudHJ5VHlwZSBleHRlbmRzIEl0ZW1FbnRyeT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhQmFzZSxcblx0XHRlbnRyeTogSXRlbUVudHJ5VHlwZSxcblx0XHRjb2x1bW5FeHBhbnNpb25SZXN1bHQ6IENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPixcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgbWFpbkNvbHVtbnMgPSBjb2x1bW5FeHBhbnNpb25SZXN1bHQuZGlmZmVyZW5jZS5tYWluO1xuXG5cdFx0ZW50cnkuY29sdW1ucyA9IGNvbHVtbkV4cGFuc2lvblJlc3VsdC5tZXJnZWQ7XG5cblx0XHRpZiAobWFpbkNvbHVtbnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsdWVzID0gdGhpcy5nZXRMb2NhbFZhbHVlcyhcblx0XHRcdGVudHJ5LFxuXHRcdFx0bWFpbkNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdGlmICghaGFzUHJvcGVydGllcyh2YWx1ZXMpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0ZW50cnksXG5cdFx0XHR2YWx1ZXMsXG5cdFx0XHRjb2x1bW5FeHBhbnNpb25SZXN1bHQsXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0TG9jYWxWYWx1ZXM8SXRlbUVudHJ5VHlwZSBleHRlbmRzIEl0ZW1FbnRyeT4gKFxuXHRcdGVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88SXRlbUVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPiB7XG5cdFx0Y29uc3QgcGFyZW50ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoZW50cnkpO1xuXHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXModGhpcy5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0pO1xuXHRcdGNvbnN0IHJlc3VsdDogRmllbGRNYXA8SXRlbUVudHJ5VHlwZVsnaXRlbVR5cGUnXT4gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtbklkID0gY29sdW1uLmlkO1xuXG5cdFx0XHQvLyBwYXJlbnQgY29sdW1ucyBtaWdodCBhbHNvIGJlIGluY2x1ZGVkIGluIHRoZSBkaWZmZXJlbmNlXG5cdFx0XHRpZiAoY2hhbmdlc1tjb2x1bW5JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY29sdW1uVHlwZSA9IGNvbHVtbi5hcGlDb2x1bW4udHlwZTtcblxuXHRcdFx0cmVzdWx0W2NvbHVtbklkXSA9IGNvbHVtblR5cGUgPT09ICdsaW5rJyAmJiBwYXJlbnQgIT09IG51bGwgP1xuXHRcdFx0XHRwYXJlbnQuaXRlbUlkIDpcblx0XHRcdFx0dGhpcy5hcGlGb3JtYXR0ZXIuZ2V0RGVmYXVsdFZhbHVlKGNvbHVtblR5cGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cbiIsImltcG9ydCB7IFJtQ29yZSB9IGZyb20gJy4uLy4uL2NvcmUnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0Q29sbGVjdGlvbkVudHJ5RmFjdG9yeSxcblx0Q29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRDb2x1bW5TZXRGYWN0b3J5LFxuXHRDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdEl0ZW1DYWNoZUZhY3RvcnksXG5cdEl0ZW1FbnRyeUZhY3RvcnksXG5cdEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi4vLi4vZmFjdG9yaWVzL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuaW1wb3J0IHtcblx0QXV0aEludGVyZmFjZSxcblx0RXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRQcm9taXNlTGlicmFyeUludGVyZmFjZSxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0xpbmtUcmVlU2VydmljZUludGVyZmFjZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIEl0ZW1FbnRyeSB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBFbnRyeVBhcmVudE51bGwsIEZpZWxkTWFwLCBJdGVtSWRDb252ZXJzaW9uTWFwLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaUZvcm1hdHRlciB9IGZyb20gJy4uL0FwaUZvcm1hdHRlcic7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0U2VydmljZSB9IGZyb20gJy4uL0FwaVJlcXVlc3RTZXJ2aWNlJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSB9IGZyb20gJy4uL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFSZXN1bHQgfSBmcm9tICcuLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayB9IGZyb20gJy4uL0NoYW5nZXNQcm9jZXNzb3InO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkNhY2hlIH0gZnJvbSAnLi4vQ29sbGVjdGlvbkNhY2hlJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UgfSBmcm9tICcuLi9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlJztcbmltcG9ydCB7IENvbHVtbkNhY2hlIH0gZnJvbSAnLi4vQ29sdW1uQ2FjaGUnO1xuaW1wb3J0IHsgQ29sdW1uSGFuZGxlciB9IGZyb20gJy4uL0NvbHVtbkhhbmRsZXInO1xuaW1wb3J0IHsgQ29sdW1uSW5mbyB9IGZyb20gJy4uL0NvbHVtbkluZm8nO1xuaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4uL0NvbHVtblV0aWwnO1xuaW1wb3J0IHsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBJdGVtQ2FjaGUgfSBmcm9tICcuLi9JdGVtQ2FjaGUnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4uL0l0ZW1FbnRyeVNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uL0tleVNlcnZpY2UnO1xuaW1wb3J0IHsgTG9ja1NlcnZpY2UgfSBmcm9tICcuLi9Mb2NrU2VydmljZSc7XG5pbXBvcnQgeyBRdWVyeVNlcnZpY2UgfSBmcm9tICcuLi9RdWVyeVNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdEJ1ZmZlck1hbmFnZXIgfSBmcm9tICcuLi9SZXF1ZXN0QnVmZmVyTWFuYWdlcic7XG5pbXBvcnQgeyBUZW1wbGF0ZUNhY2hlIH0gZnJvbSAnLi4vVGVtcGxhdGVDYWNoZSc7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vc2VydmVyL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyIH0gZnJvbSAnLi9zZXJ2ZXIvU2VydmVyQ29sbGVjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgU2VydmVySXRlbUVudHJ5Q2hhbmdlcywgU2VydmVySXRlbUhhbmRsZXIgfSBmcm9tICcuL3NlcnZlci9TZXJ2ZXJJdGVtSGFuZGxlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzLCBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkl0ZW1IYW5kbGVyJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2FjaGUge1xuXG5cdHB1YmxpYyBjaGlsZHJlbjogVHJhbnNhY3Rpb25DYWNoZVtdID0gW107XG5cblx0cHVibGljIHJlYWRvbmx5IGl0ZW1IYW5kbGVyOiBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyIHwgU2VydmVySXRlbUhhbmRsZXI7XG5cdHB1YmxpYyByZWFkb25seSBjb2xsZWN0aW9uSGFuZGxlcjogVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlciB8IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyO1xuXG5cdHB1YmxpYyBwYXJlbnQ6IEFic3RyYWN0Q2FjaGUgfCBudWxsO1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0cHVibGljIGNvcmU6IFJtQ29yZSxcblx0XHRwcm90ZWN0ZWQgY29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlLFxuXHRcdHByb3RlY3RlZCByZXF1ZXN0QnVmZmVyTWFuYWdlcjogUmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0cHJvdGVjdGVkIHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgYXV0aEludGVyZmFjZTogQXV0aEludGVyZmFjZSxcblx0XHRwcm90ZWN0ZWQgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgbG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5OiBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCB0ZW1wbGF0ZUNhY2hlOiBUZW1wbGF0ZUNhY2hlLFxuXHRcdHByb3RlY3RlZCBpdGVtQ2FjaGVGYWN0b3J5OiBJdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcm90ZWN0ZWQgZXhjZXB0aW9uSGFuZGxlcjogRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0XHRwcm90ZWN0ZWQgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByb3RlY3RlZCBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJvdGVjdGVkIGNvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0cHJvdGVjdGVkIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIGNvbHVtblN1YnNldENhY2hlRmFjdG9yeTogQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByb3RlY3RlZCBpdGVtRW50cnlGYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uRW50cnlGYWN0b3J5OiBDb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgcXVlcnlQYXJzZXJGYWN0b3J5OiBRdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwcm90ZWN0ZWQgbGlua1RyZWVTZXJ2aWNlOiBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUNoaWxkIChpZD86IHN0cmluZyk6IFRyYW5zYWN0aW9uQ2FjaGUge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uQ2FjaGUoXG5cdFx0XHR0aGlzLmNvcmUsXG5cdFx0XHR0aGlzLmNvbHVtbkNhY2hlLFxuXHRcdFx0dGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0aGlzLmF1dGhJbnRlcmZhY2UsXG5cdFx0XHR0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0XHR0aGlzLmxvY2tTZXJ2aWNlLFxuXHRcdFx0dGhpcy5tb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdFx0dGhpcy5pdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdFx0dGhpcy50ZW1wbGF0ZUNhY2hlLFxuXHRcdFx0dGhpcy5pdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdFx0dGhpcy5lcnJvckhhbmRsZXIsXG5cdFx0XHR0aGlzLmV4Y2VwdGlvbkhhbmRsZXIsXG5cdFx0XHR0aGlzLnByb21pc2VTZXJ2aWNlLFxuXHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uSGFuZGxlcixcblx0XHRcdHRoaXMuY29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsLFxuXHRcdFx0dGhpcy5pdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5rZXlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0aGlzLnF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5hcGlGb3JtYXR0ZXIsXG5cdFx0XHR0aGlzLmxpbmtUcmVlU2VydmljZSxcblx0XHRcdHRoaXMsXG5cdFx0XHRpZCxcblx0XHQpO1xuXG5cdFx0dGhpcy5jaGlsZHJlbi5wdXNoKHRyYW5zYWN0aW9uKTtcblxuXHRcdHJldHVybiB0cmFuc2FjdGlvbjtcblx0fVxuXG5cdHB1YmxpYyBvbkNoaWxkRGVzdHJveSAoY2FjaGU6IFRyYW5zYWN0aW9uQ2FjaGUpOiB2b2lkIHtcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZihjYWNoZSk7XG5cblx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHR0aGlzLmNoaWxkcmVuLnNwbGljZShcblx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdDEsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyB0aGlzIHRyYW5zYWN0aW9uIGFuZCBhbGwgcGFyZW50c1xuXHQgKi9cblx0cHVibGljIGdldFRyYW5zYWN0aW9uQ2hhaW4gKCk6IEFic3RyYWN0Q2FjaGVbXSB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25zOiBBYnN0cmFjdENhY2hlW10gPSBbXTtcblx0XHRsZXQgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUgPSB0aGlzO1xuXG5cdFx0ZG8ge1xuXHRcdFx0dHJhbnNhY3Rpb25zLnB1c2godHJhbnNhY3Rpb24pO1xuXG5cdFx0XHQvLyBAdHMtaWdub3JlIHdoaWxlIGxvb3Agd2lsbCBicmVha1xuXHRcdFx0dHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbi5wYXJlbnQ7XG5cdFx0fSB3aGlsZSAodHJhbnNhY3Rpb24gIT09IG51bGwpO1xuXG5cdFx0cmV0dXJuIHRyYW5zYWN0aW9ucztcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyB0aGUge0BsaW5rIFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIuZW50cmllcyBDb2xsZWN0aW9uQ2FjaGV9IG9mIHRoZSB0cmFuc2FjdGlvblxuXHQgKi9cblx0cHVibGljIGdldEN1cnJlbnRDb2xsZWN0aW9uRW50cnlDYWNoZSAoKTogQ29sbGVjdGlvbkNhY2hlIHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5lbnRyaWVzIEl0ZW1DYWNoZX0gb2YgdGhlIHRyYW5zYWN0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VycmVudEl0ZW1FbnRyeUNhY2hlICgpOiBJdGVtQ2FjaGUge1xuXHRcdHJldHVybiB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXM7XG5cdH1cblxuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0U2VydmVyQ2FjaGUgKCk6IFNlcnZlckNhY2hlO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRMb2NhbEl0ZW1FbnRyeSAoaXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSk6IEl0ZW1FbnRyeSB8IHVuZGVmaW5lZDtcblxuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUVudHJ5WydpdGVtSWQnXSxcblx0KTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRMb2NhbENvbGxlY3Rpb25FbnRyeSAoY29sbGVjdGlvbkVudHJ5SWQ6IENvbGxlY3Rpb25FbnRyeVsnaWQnXSk6IENvbGxlY3Rpb25FbnRyeSB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEFwcGxpZXMgY2hhbmdlcyBmcm9tIGEgY2hpbGQgdHJhbnNhY3Rpb24gdG8gYSBwYXJlbnRcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBhcHBseUNoYW5nZXNGcm9tQ2hpbGQgKFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGJyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0b25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1JZENvbnZlcnNpb25NYXA+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2FsbGVkIGJ5IGEgcGFyZW50IHRyYW5zYWN0aW9uLCBwcm9wYWdhdGVzIGNoYW5nZXMgZG93bndhcmRzIHRvIGFsbCBjaGlsZCBjYWNoZXNcblx0ICpcblx0ICogQHJlbWFya3Ncblx0ICogLSBTaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSBjb3JlXG5cdCAqXG5cdCAqIHRvZG9bY2FjaGVdIFNob3VsZCB3ZSByZWZldGNoIGRlcml2ZWQgdmFsdWVzIGp1c3QgbGlrZSBpbiBhcHBseUNoYW5nZXNEZWx0YSA/XG5cdCAqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgKFxuXHRcdGludGVybmFsQ2hhbmdlc0RlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZTogYm9vbGVhbixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuLFxuXHQpOiB2b2lkO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRQYXJlbnQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGZyb21Jbml0aWFsPzogYm9vbGVhbixcblx0XHRwcm92aWRlZEZpZWxkcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEVudHJ5UGFyZW50TnVsbDtcblxuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseSAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0XHRjb3B5RmllbGRzPzogYm9vbGVhbixcblx0KTogRmllbGRNYXA7XG5cblx0cHVibGljIGFic3RyYWN0IGdldExvY2FsSXRlbUVudHJ5Q2hhbmdlc1R1cGxlIChpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddKTtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEJlY2F1c2UgdGhlIGBpdGVtQ2hhbmdlc2Agb2JqZWN0IGRpZmZlcnMgYmV0d2VlbiB0aGUge0BsaW5rIFNlcnZlckl0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzIFNlcnZlckl0ZW1IYW5kbGVyfSBhbmQgdGhlIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXJ9IHdlIG5lZWQgYSBmdW5jdGlvbiB0byBub3JtYWxpc2UgdGhvc2UgdmFsdWVzXG5cdCAqXG5cdCAqIEByZW1hcmtzXG5cdCAqIC0gU2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUgY29yZVxuXHQgKlxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRDaGFuZ2VzRnJvbUl0ZW1DaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiAoXG5cdFx0Y2hhbmdlc09iamVjdDogU2VydmVySXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGU+IHwgVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT47XG5cblx0cHVibGljIGFic3RyYWN0IGFwcGx5Q2hhbmdlc0RlbHRhIChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+O1xuXG5cdHByb3RlY3RlZCBnZXRQYXJlbnRGcm9tRmllbGRzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEVudHJ5UGFyZW50TnVsbCB7XG5cdFx0aWYgKGZpZWxkcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAoaXRlbUVudHJ5LmNvbHVtbnMubGluayAhPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aXRlbVR5cGU6IGl0ZW1FbnRyeS5jb2x1bW5zLmxpbmsuYXBpQ29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQ6IGZpZWxkc1tpdGVtRW50cnkuY29sdW1ucy5saW5rLmlkXSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW5zID0gaXRlbUVudHJ5LmNvbHVtbnMucmVzcG9uc2VbaXRlbUVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdGlmIChcblx0XHRcdHJlc3BvbnNlQ29sdW1ucy5pdGVtdHlwZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHQmJiByZXNwb25zZUNvbHVtbnMuaXRlbSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRpdGVtVHlwZTogZmllbGRzLml0ZW10eXBlLFxuXHRcdFx0XHRpdGVtSWQ6IGZpZWxkcy5pdGVtLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2FsbGVkIGJ5IGFwcGx5Q2hhbmdlc0RlbHRhIGZyb20gU2VydmVyQ2FjaGUgYW5kIFRyYW5zYWN0aW9uQ2FjaGUuIEFwcGxpZXMgY3JlYXRlcywgdXBkYXRlcyBhbmQgbW92ZXMsIGRvZXNuJ3QgYXBwbHkgZGVsZXRlc1xuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHJvdGVjdGVkIF9hcHBseUNoYW5nZXNEZWx0YSAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdCk6IHtcblx0XHRyZXN1bHQ6IENoYW5nZXNEZWx0YVJlc3VsdCxcblx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEsXG5cdFx0cm9sbGJhY2tGdW5jdGlvbnM6IEFycmF5PChjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSkgPT4gdm9pZD4sXG5cdH0ge1xuXHRcdC8vIFdlIGhhdmUgdG8gY29udmVydCB0aGUgQ2hhbmdlc0RlbHRhIHRvIGFuIEludGVybmFsQ2hhbmdlc0RlbHRhIGluIG9yZGVyIHRvIHBhc3MgaXQgdG8gdGhlIENvbGxlY3Rpb25NYXRjaGVyIGFuZCBjaGlsZCBUcmFuc2FjdGlvbnNcblx0XHRjb25zdCBpbnRlcm5hbENoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3RJbnRlcm5hbERlbHRhKCk7XG5cblx0XHRjb25zdCBjcmVhdGVkRW50cmllczogQ2hhbmdlc0RlbHRhUmVzdWx0WydjcmVhdGVkJ10gPSBbXTtcblx0XHRjb25zdCByb2xsYmFja0Z1bmN0aW9uczogQXJyYXk8KGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhKSA9PiB2b2lkPiA9IFtdO1xuXG5cdFx0Ly8gV2Ugb25seSBjcmVhdGUgbmV3IGVudHJpZXMgb24gdGhlIGRpcmVjdCB0cmFuc2FjdGlvbiwgbm90IG9uIHRoZSBjaGlsZHJlblxuXHRcdGZvciAoY29uc3QgdHVwbGUgb2YgY2hhbmdlc0RlbHRhLmNyZWF0ZWQpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuaXRlbUhhbmRsZXIuY3JlYXRlSXRlbUVudHJ5KHR1cGxlKTtcblxuXHRcdFx0Y3JlYXRlZEVudHJpZXMucHVzaChpdGVtRW50cnkpO1xuXG5cdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHR0aGlzLmdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXModGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdKSxcblx0XHRcdCk7XG5cblx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLnB1c2goXG5cdFx0XHRcdHJvbGxiYWNrRGVsdGEgPT4gcm9sbGJhY2tEZWx0YS5zZXRJdGVtRGVsZXRlZChpdGVtRW50cnkpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGNoYW5nZXNEZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGNoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0Y29uc3QgcHJldmlvdXMgPSB0aGlzLml0ZW1IYW5kbGVyLnByb2Nlc3NJdGVtRW50cnlDaGFuZ2VzKFxuXHRcdFx0XHR0dXBsZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdCk7XG5cblx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0dHVwbGUuY2hhbmdlcy5maWVsZHMsXG5cdFx0XHRcdHR1cGxlLmNoYW5nZXMuZXhwYW5kZWRDb2x1bW5zLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKHByZXZpb3VzICE9PSBudWxsKSB7XG5cdFx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0cm9sbGJhY2tEZWx0YSA9PiByb2xsYmFja0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdFx0XHRwcmV2aW91cyxcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodHVwbGUuY2hhbmdlcy5wYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbU1vdmVkKFxuXHRcdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHRcdHR1cGxlLmNoYW5nZXMucGFyZW50LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXaGVuIHJvbGxpbmcgYmFjayBhIGRlbHRhIHdlIGNhbGwgYHNldEl0ZW1VcGRhdGVkYCB0byByZXN0b3JlIGRlbGV0aW9uc1xuXHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIgaW5zdGFuY2VvZiBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyKSB7XG5cdFx0XHRcdGNvbnN0IGRlbGV0ZWRFbnRyaWVzID0gdGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbdHVwbGUuZW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0XHRcdGlmIChkZWxldGVkRW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGRlbGV0ZWRFbnRyaWVzLmluZGV4T2YodHVwbGUuZW50cnkpO1xuXG5cdFx0XHRcdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0XHRcdFx0ZGVsZXRlZEVudHJpZXMuc3BsaWNlKFxuXHRcdFx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdFx0XHQxLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVzdWx0OiB7XG5cdFx0XHRcdGNyZWF0ZWQ6IGNyZWF0ZWRFbnRyaWVzLFxuXHRcdFx0XHRyb2xsYmFjazogKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHJvbGxiYWNrRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGZuIG9mIHJvbGxiYWNrRnVuY3Rpb25zKSB7XG5cdFx0XHRcdFx0XHRmbihyb2xsYmFja0RlbHRhKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hcHBseUNoYW5nZXNEZWx0YShyb2xsYmFja0RlbHRhKTtcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEVuc3VyZXMgdGhhdCBmb3IgYWxsIHVwZGF0ZWQgaXRlbXMgaW4gdGhlIGRlbHRhIHRoZSByZXF1aXJlZCBkZXJpdmVkIHZhbHVlcyBhcmUgcHJlc2VudFxuXHQgKi9cblx0cHJvdGVjdGVkIGZldGNoVXBkYXRlZERlcml2ZWRWYWx1ZXNGcm9tRGVsdGEgKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeVtdW10+IHtcblx0XHRjb25zdCBkZXJpdmVkUHJvbWlzZXM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5W10+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBjaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cdFx0XHRjb25zdCBjaGFuZ2VkUm9vdENvbHVtbnM6IENvbHVtbkluZm9bXSA9IFtdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiB0dXBsZS5lbnRyeS5jb2x1bW5zLnJvb3QpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHR1cGxlLmNoYW5nZXMuZmllbGRzLmhhc093blByb3BlcnR5KGNvbHVtbi5pZClcblx0XHRcdFx0XHQmJiB0dXBsZS5jaGFuZ2VzLmZpZWxkc1tjb2x1bW4uaWRdICE9PSB0aGlzLmdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXModGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1t0dXBsZS5lbnRyeS5pZF0pW2NvbHVtbi5pZF1cblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y2hhbmdlZFJvb3RDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2hhbmdlZFJvb3RDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0ZGVyaXZlZFByb21pc2VzLnB1c2goXG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIucmVzb2x2ZURlcml2ZWRWYWx1ZXMoXG5cdFx0XHRcdFx0W3R1cGxlLmVudHJ5XSxcblx0XHRcdFx0XHRjaGFuZ2VkUm9vdENvbHVtbnMsXG5cdFx0XHRcdFx0Ly8gV2UgcGFzcyB0aGUgZGVsdGEgc28gdGhlIG5ldyByb290Q29sdW1uJ3MgdmFsdWVzIGFyZSByZWFkXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGUgbmV3IGRlcml2ZWQgdmFsdWVzIGV4aXN0IGJlZm9yZSBjYWxsaW5nIG9uQ2hhbmdlLCBzaW5jZSB0aGUgb25DaGFuZ2UgZnVuY3Rpb24gbWlnaHQgdXNlIHRoZSBuZXcgdmFsdWVzXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKGRlcml2ZWRQcm9taXNlcyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFic3RyYWN0Q2FjaGUsIEZpZWxkTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uLyc7XG5pbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzLyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJbnRlcm5hbENoYW5nZXNEZWx0YSB9IGZyb20gJy4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uTWF0Y2hlck1hdGNoZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBJdGVtVHlwZT4gPSB7XG5cdFtpdGVtSWQ6IG51bWJlcl06IHtcblx0XHRpdGVtOiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRpc01hdGNoOiBib29sZWFuIHwgJ21heWJlJ1xuXHR9XG59O1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbk1hdGNoZXJCYXNlIHtcblxuXHRwcm90ZWN0ZWQgbWFwOiB7XG5cdFx0W2NvbGxlY3Rpb25FbnRyeUlkOiBudW1iZXJdOiB7XG5cdFx0XHRjb2xsZWN0aW9uOiBDb2xsZWN0aW9uRW50cnlcblx0XHRcdG1hdGNoZXM6IENvbGxlY3Rpb25NYXRjaGVyTWF0Y2hlc1xuXHRcdH1cblx0fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdFx0cHJpdmF0ZSBnZXRDb2xsZWN0aW9uRW50cmllczogKGl0ZW1UeXBlOiBJdGVtVHlwZSkgPT4gQ29sbGVjdGlvbkVudHJ5W10sXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGV4cGFuZDxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbUVudHJ5VHlwZVsnaXRlbVR5cGUnXT4sXG5cdCk6IHRoaXMge1xuXHRcdGNvbnN0IHF1ZXJ5TWF0Y2hlciA9IHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRmaWVsZHMsXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChpdGVtRW50cnkpLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fZXhwYW5kKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0+IHF1ZXJ5TWF0Y2hlci5tYXRjaFF1ZXJ5KGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5vYmplY3QpLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgcHJvY2Vzc0RlbHRhIChpbnRlcm5hbENoYW5nZXNEZWx0YTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEpOiB0aGlzIHtcblx0XHQvLyB3ZSBkbyBkZWxldGluZyBmaXJzdCBiZWNhdXNlIGl0J3MgdGhlIGxlYXN0IGV4cGVuc2l2ZSBvcGVyYXRpb25cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblx0XHRcdGNvbnN0IGVudHJpZXNUb0JlRGVsZXRlZCA9IGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBlbnRyaWVzVG9CZURlbGV0ZWQpIHtcblx0XHRcdFx0dGhpcy5fZXhwYW5kKFxuXHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHQvLyBDb2xsZWN0aW9ucyBjYW4gbmV2ZXIgY29udGFpbiBkZWxldGVkIGl0ZW1zIHRvIHRoZXkncmUgYWx3YXlzIG5vdCBmaXR0aW5nXG5cdFx0XHRcdFx0KCkgPT4gZmFsc2UsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5jcmVhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGludGVybmFsQ2hhbmdlc0RlbHRhLmNyZWF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHRjb25zdCBxdWVyeU1hdGNoZXIgPSB0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHR0dXBsZS5lbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0dHVwbGUuZmllbGRzLFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudCh0dXBsZS5lbnRyeSksXG5cdFx0XHQpO1xuXG5cdFx0XHR0aGlzLl9leHBhbmQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gcXVlcnlNYXRjaGVyLm1hdGNoUXVlcnkoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWQpIHtcblx0XHRcdGNvbnN0IG1vdmVkID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHR0aGlzLl9leHBhbmQoXG5cdFx0XHRcdG1vdmVkLmVudHJ5LFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gY29sbGVjdGlvbkVudHJ5Lm1hdGNoUGFyZW50KFxuXHRcdFx0XHRcdG1vdmVkLnRvLml0ZW1UeXBlLFxuXHRcdFx0XHRcdG1vdmVkLnRvLml0ZW1JZCxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHRjb25zdCBjaGFuZ2VzID0ge307XG5cdFx0XHRjb25zdCBjYWNoZWRDaGFuZ2VzID0gdGhpcy50cmFuc2FjdGlvbi5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0XHROdW1iZXIoaXRlbUVudHJ5SWQpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IGNvcHlDaGFuZ2UgPSAoXG5cdFx0XHRcdGZpZWxkczogRmllbGRNYXAsXG5cdFx0XHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdFx0XHQpID0+IHtcblx0XHRcdFx0Y29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG5cdFx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmIChkZXNjICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzLFxuXHRcdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0XHRkZXNjLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y2hhbmdlc1tjb2x1bW5JZF0gPSBmaWVsZHNbY29sdW1uSWRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIGNhY2hlZENoYW5nZXMpIHtcblx0XHRcdFx0Y29weUNoYW5nZShcblx0XHRcdFx0XHRjYWNoZWRDaGFuZ2VzLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHR1cGxlLmNoYW5nZXMuZmllbGRzKSB7XG5cdFx0XHRcdGNvcHlDaGFuZ2UoXG5cdFx0XHRcdFx0dHVwbGUuY2hhbmdlcy5maWVsZHMsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHF1ZXJ5TWF0Y2hlciA9IHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdHR1cGxlLmVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRjaGFuZ2VzLFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudCh0dXBsZS5lbnRyeSksXG5cdFx0XHQpO1xuXG5cdFx0XHR0aGlzLl9leHBhbmQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gcXVlcnlNYXRjaGVyLm1hdGNoUXVlcnkoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHJvdGVjdGVkIGhhc0ZpdHRpbmdJdGVtcyAobWF0Y2hlczogQ29sbGVjdGlvbk1hdGNoZXJNYXRjaGVzKSB7XG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gbWF0Y2hlcykge1xuXHRcdFx0aWYgKG1hdGNoZXNbaXRlbUlkXS5pc01hdGNoID09PSB0cnVlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHByb3RlY3RlZCBfZXhwYW5kIChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHRtYXRjaEZ1bmN0aW9uOiAoY29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnkpID0+IGJvb2xlYW4gfCAnbWF5YmUnLFxuXHQpOiB0aGlzIHtcblx0XHRjb25zdCBtYXAgPSB0aGlzLm1hcDtcblx0XHRjb25zdCBpdGVtSWQgPSBpdGVtRW50cnkuaXRlbUlkO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJpZXMgPSB0aGlzLmdldENvbGxlY3Rpb25FbnRyaWVzKGl0ZW1FbnRyeS5pdGVtVHlwZSk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25FbnRyeSBvZiBjb2xsZWN0aW9uRW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5SWQgPSBjb2xsZWN0aW9uRW50cnkuaWQ7XG5cdFx0XHRsZXQgbWF0Y2hlcztcblxuXHRcdFx0aWYgKG1hcFtjb2xsZWN0aW9uRW50cnlJZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRtYXBbY29sbGVjdGlvbkVudHJ5SWRdID0ge1xuXHRcdFx0XHRcdGNvbGxlY3Rpb246IGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0XHRtYXRjaGVzOiB7fSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0bWF0Y2hlcyA9IG1hcFtjb2xsZWN0aW9uRW50cnlJZF0ubWF0Y2hlcztcblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV0gV2UgY291bGQgb3B0aW1pc2Ugc29tZSB0aGluZ3MgaGVyZSBieSBjaGVja2luZyBpZiB0cmFuc2FjdGlvbi5jb2xsZWN0aW9uQ2hhbmdlcyBhbHJlYWR5IGNvbnRhaW5zIGl0ZW1FbnRyeSwgaWYgdGhhdCdzIHRoZSBjYXNlIHdlIGRvbid0IGhhdmUgdG8gbWF0Y2ggYXQgYWxsXG5cdFx0XHQvLyBDdXJyZW50bHkgYWxyZWFkeSBleGlzdGluZyBlbnRyaWVzIGFyZSBmaWx0ZXJlZCBpbiBhZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMgKGNoYW5nZXMuaW5kZXhPZihpdGVtRW50cnkpICE9PSAtMSlcblx0XHRcdGlmIChtYXRjaGVzW2l0ZW1JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bWF0Y2hlc1tpdGVtSWRdID0ge1xuXHRcdFx0XHRpdGVtOiBpdGVtRW50cnksXG5cdFx0XHRcdGlzTWF0Y2g6IG1hdGNoRnVuY3Rpb24oY29sbGVjdGlvbkVudHJ5KSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vY2FjaGUvQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlckJhc2UgfSBmcm9tICcuL0NvbGxlY3Rpb25NYXRjaGVyQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTWF0Y2hlclxuXHRleHRlbmRzIENvbGxlY3Rpb25NYXRjaGVyQmFzZSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0dHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdFx0Z2V0Q29sbGVjdGlvbkVudHJpZXM6IChpdGVtVHlwZTogSXRlbVR5cGUpID0+IENvbGxlY3Rpb25FbnRyeVtdLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdHF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdGdldENvbGxlY3Rpb25FbnRyaWVzLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbnNXaXRoRml0dGluZ0l0ZW1zICgpOiBDb2xsZWN0aW9uRW50cnlbXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBDb2xsZWN0aW9uRW50cnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uSWQgaW4gdGhpcy5tYXApIHtcblx0XHRcdGNvbnN0IG1hcEVudHJ5ID0gdGhpcy5tYXBbY29sbGVjdGlvbklkXTtcblxuXHRcdFx0aWYgKHRoaXMuaGFzRml0dGluZ0l0ZW1zKG1hcEVudHJ5Lm1hdGNoZXMpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKG1hcEVudHJ5LmNvbGxlY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbk1hdGNoZXIgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlck1hdGNoZXMgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlckJhc2UnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vQWJzdHJhY3RDYWNoZSc7XG5cbmV4cG9ydCB0eXBlIEdyb3VwZWRDb2xsZWN0aW9uTWF0Y2hlclJlc3VsdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdGZpdHRpbmc6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0bm90Rml0dGluZzogSXRlbUlkW10sXG5cdG1heWJlOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj5cbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBQcm9jZXNzZXMgYSBkZWx0YSBhbmQgYWRkcyB0aGUgaXRlbXMgdG8gdGhlIHJpZ2h0IGNvbGxlY3Rpb25zLCB0aGlzIGlzIHRoZSBPTkxZIGNsYXNzIHRoYXQgc2hvdWxkIGNoYW5nZSBjb2xsZWN0aW9uIGl0ZW1zXG4gKlxuICogLS0tLS0tXG4gKlxuICogQHJlbWFya1xuICogVGhlIENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IgaXMgYWxsb3dlZCB0byBkaXJlY3RseSBhY2Nlc3MvbW9kaWZ5IHRoZSB0cmFuc2FjdGlvbiBiZWNhdXNlIGl0J3MgT05MWSBjYWxsZWQgZnJvbSBhcHBseUNoYW5nZXNGcm9tUGFyZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yXG5cdGV4dGVuZHMgQ29sbGVjdGlvbk1hdGNoZXIge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHRcdGdldENvbGxlY3Rpb25FbnRyaWVzOiAoaXRlbVR5cGU6IEl0ZW1UeXBlKSA9PiBDb2xsZWN0aW9uRW50cnlbXSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHRnZXRDb2xsZWN0aW9uRW50cmllcyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zIChcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvbklkIGluIHRoaXMubWFwKSB7XG5cdFx0XHRjb25zdCBtYXBFbnRyeSA9IHRoaXMubWFwW2NvbGxlY3Rpb25JZF07XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBtYXBFbnRyeS5jb2xsZWN0aW9uO1xuXHRcdFx0Y29uc3QgZ3JvdXBlZEl0ZW1FbnRyaWVzID0gdGhpcy5ncm91cEl0ZW1FbnRyaWVzKG1hcEVudHJ5Lm1hdGNoZXMpO1xuXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLnJlbW92ZUl0ZW1FbnRyaWVzRnJvbUNvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdGdyb3VwZWRJdGVtRW50cmllcy5ub3RGaXR0aW5nLFxuXHRcdFx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlLFxuXHRcdFx0KTtcblxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5hZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0Z3JvdXBlZEl0ZW1FbnRyaWVzLmZpdHRpbmcsXG5cdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoZ3JvdXBlZEl0ZW1FbnRyaWVzLm1heWJlLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0XHRcdC5xdWVyeShcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5vYmplY3QsXG5cdFx0XHRcdFx0XHR7W2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV06IFsnaWQnXX0sXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdFx0XHQvLyBXZSBub3cgZXhhY3RseSBrbm93IHdoaWNoIG9mIHRoZSBtYXliZSBpdGVtcyBmaXRcblxuXHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmFkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0Z3JvdXBlZEl0ZW1FbnRyaWVzLm1heWJlLmZpbHRlcihcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSA9PiByZXNwb25zZS5saW5rc1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdLmluZGV4T2YoaXRlbUVudHJ5Lml0ZW1JZCkgPiAtMSxcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBncm91cEl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bWF0Y2hlczogQ29sbGVjdGlvbk1hdGNoZXJNYXRjaGVzPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEdyb3VwZWRDb2xsZWN0aW9uTWF0Y2hlclJlc3VsdDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBmaXR0aW5nOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0XHRjb25zdCBub3RGaXR0aW5nOiBJdGVtSWRbXSA9IFtdO1xuXHRcdGNvbnN0IG1heWJlOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIG1hdGNoZXMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gbWF0Y2hlc1tpdGVtSWRdO1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gbWF0Y2guaXRlbTtcblx0XHRcdGNvbnN0IGlzTWF0Y2ggPSBtYXRjaC5pc01hdGNoO1xuXG5cdFx0XHRpZiAoaXNNYXRjaCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRmaXR0aW5nLnB1c2goaXRlbUVudHJ5KTtcblx0XHRcdH0gZWxzZSBpZiAoaXNNYXRjaCA9PT0gZmFsc2UpIHtcblx0XHRcdFx0bm90Rml0dGluZy5wdXNoKGl0ZW1FbnRyeS5pdGVtSWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWF5YmUucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRmaXR0aW5nOiBmaXR0aW5nLFxuXHRcdFx0bm90Rml0dGluZzogbm90Rml0dGluZyxcblx0XHRcdG1heWJlOiBtYXliZSxcblx0XHR9O1xuXHR9XG5cbn1cbiIsImltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1JZENvbnZlcnNpb25NYXAsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uID0gJ2Fsd2F5cycgfCAnb25DbG9zZScgfCAnc2tpcE9uQ2xvc2UnO1xuXG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlID0ge1xuXHRvbkJlZm9yZVNhdmU6ICh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSkgPT4gYW55LFxuXHRvblNhdmVTdWNjZXNzOiAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KSA9PiBhbnlcbn07XG5cbnR5cGUgQ2FsbGJhY2tNYXA8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+ID0ge1xuXHRba2V5OiBzdHJpbmddOiB7XG5cdFx0Y2FsbGJhY2s6IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGVbVF0sXG5cdFx0Y29uZGl0aW9uOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb25cblx0fVxufTtcblxuY29uc3QgREVGQVVMVF9QUklPUklUWSA9IDEwMDtcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uRXZlbnRIYW5kbGVyIHtcblx0cHJpdmF0ZSBjYWxsYmFja3M6IHtcblx0XHRbVCBpbiBrZXlvZiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlXTogQXJyYXk8W1xuXHRcdFx0bnVtYmVyLFxuXHRcdFx0Q2FsbGJhY2tNYXA8VD5cblx0XHRdPlxuXHR9ID0ge1xuXHRcdG9uQmVmb3JlU2F2ZTogW10sXG5cdFx0b25TYXZlU3VjY2VzczogW10sXG5cdH07XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyByZWdpc3RlckNhbGxiYWNrPFQgZXh0ZW5kcyBrZXlvZiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlPiAoXG5cdFx0dHlwZTogVCxcblx0XHRrZXk6IHN0cmluZyxcblx0XHRjYWxsYmFjazogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZVtUXSxcblx0XHRjb25kaXRpb246IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja0NvbmRpdGlvbiA9ICdhbHdheXMnLFxuXHRcdHByaW9yaXR5OiBudW1iZXIgPSBERUZBVUxUX1BSSU9SSVRZLFxuXHQpOiAoKSA9PiB2b2lkIHtcblx0XHR0aGlzLmdldFByaW9yaXR5TGV2ZWwoXG5cdFx0XHR0eXBlLFxuXHRcdFx0cHJpb3JpdHksXG5cdFx0KVtrZXldID0ge1xuXHRcdFx0Y2FsbGJhY2ssXG5cdFx0XHRjb25kaXRpb24sXG5cdFx0fTtcblxuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRkZWxldGUgdGhpcy5nZXRQcmlvcml0eUxldmVsKFxuXHRcdFx0XHR0eXBlLFxuXHRcdFx0XHRwcmlvcml0eSxcblx0XHRcdClba2V5XTtcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGV4ZWN1dGVDYWxsYmFja3M8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+IChcblx0XHR0eXBlOiBULFxuXHRcdGV4ZWN1dGU6IChjYWxsYmFjazogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZVtUXSkgPT4gYW55LFxuXHRcdGNsb3NlVGFiOiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPGFueT4ge1xuXHRcdGNvbnN0IHByaW9yaXR5TGV2ZWxzID0gdGhpcy5jYWxsYmFja3NbdHlwZV07XG5cdFx0Y29uc3QgY29uZGl0aW9uOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24gPSBjbG9zZVRhYiA/ICdvbkNsb3NlJyA6ICdza2lwT25DbG9zZSc7XG5cblx0XHRsZXQgY2hhaW4gPSB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblxuXHRcdGZvciAoY29uc3QgcHJpb3JpdHlMZXZlbCBvZiBwcmlvcml0eUxldmVscykge1xuXHRcdFx0Y2hhaW4gPSBjaGFpbi50aGVuKFxuXHRcdFx0XHR0aGlzLmV4ZWN1dGVDYWxsYmFja3NQcmlvcml0eUxldmVsKFxuXHRcdFx0XHRcdHByaW9yaXR5TGV2ZWxbMV0gYXMgQ2FsbGJhY2tNYXA8VD4sXG5cdFx0XHRcdFx0Y29uZGl0aW9uLFxuXHRcdFx0XHRcdGV4ZWN1dGUsXG5cdFx0XHRcdCksXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNoYWluO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRQcmlvcml0eUxldmVsPFQgZXh0ZW5kcyBrZXlvZiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlPiAoXG5cdFx0dHlwZTogVCxcblx0XHRkZXN0aW5hdGlvblByaW9yaXR5OiBudW1iZXIsXG5cdCk6IENhbGxiYWNrTWFwPFQ+IHtcblx0XHRjb25zdCBwcmlvcml0eUxldmVscyA9IHRoaXMuY2FsbGJhY2tzW3R5cGVdO1xuXHRcdGxldCBuZXdQcmlvcml0eUxldmVsO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcmlvcml0eUxldmVscy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgcHJpb3JpdHlMZXZlbCA9IHByaW9yaXR5TGV2ZWxzW2ldO1xuXG5cdFx0XHRpZiAocHJpb3JpdHlMZXZlbFswXSA8IGRlc3RpbmF0aW9uUHJpb3JpdHkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwcmlvcml0eUxldmVsWzBdID09PSBkZXN0aW5hdGlvblByaW9yaXR5KSB7XG5cdFx0XHRcdHJldHVybiBwcmlvcml0eUxldmVsWzFdIGFzIENhbGxiYWNrTWFwPFQ+O1xuXHRcdFx0fVxuXG5cdFx0XHRuZXdQcmlvcml0eUxldmVsID0ge307XG5cblx0XHRcdHByaW9yaXR5TGV2ZWxzLnNwbGljZShcblx0XHRcdFx0aSxcblx0XHRcdFx0MCxcblx0XHRcdFx0W1xuXHRcdFx0XHRcdGRlc3RpbmF0aW9uUHJpb3JpdHksXG5cdFx0XHRcdFx0bmV3UHJpb3JpdHlMZXZlbCxcblx0XHRcdFx0XSxcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybiBuZXdQcmlvcml0eUxldmVsO1xuXHRcdH1cblxuXHRcdG5ld1ByaW9yaXR5TGV2ZWwgPSB7fTtcblxuXHRcdHByaW9yaXR5TGV2ZWxzLnB1c2goW1xuXHRcdFx0ZGVzdGluYXRpb25Qcmlvcml0eSxcblx0XHRcdG5ld1ByaW9yaXR5TGV2ZWwsXG5cdFx0XSk7XG5cblx0XHRyZXR1cm4gbmV3UHJpb3JpdHlMZXZlbDtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZUNhbGxiYWNrc1ByaW9yaXR5TGV2ZWw8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+IChcblx0XHRjYWxsYmFja3M6IENhbGxiYWNrTWFwPFQ+LFxuXHRcdGNvbmRpdGlvbjogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uLFxuXHRcdGV4ZWN1dGU6IChjYWxsYmFjazogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZVtUXSkgPT4gYW55LFxuXHQpOiAoKSA9PiBQcm9taXNlSW50ZXJmYWNlPGFueT4ge1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRjb25zdCByZXN1bHQ6IHtba2V5OiBzdHJpbmddOiBhbnl9ID0ge307XG5cblx0XHRcdGZvciAoY29uc3Qga2V5IGluIGNhbGxiYWNrcykge1xuXHRcdFx0XHRjb25zdCBjYWxsYmFja0VudHJ5ID0gY2FsbGJhY2tzW2tleV07XG5cblx0XHRcdFx0aWYgKGNhbGxiYWNrRW50cnkuY29uZGl0aW9uICE9PSBjb25kaXRpb24gJiYgY2FsbGJhY2tFbnRyeS5jb25kaXRpb24gIT09ICdhbHdheXMnKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHJlc3VsdFtrZXldID0gZXhlY3V0ZShjYWxsYmFja0VudHJ5LmNhbGxiYWNrKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHR0aGlzLmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChyZXN1bHQpO1xuXHRcdH07XG5cdH1cbn1cbiIsImltcG9ydCB7IG5vb3AsIFJtQ29yZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0Q29sbGVjdGlvbkVudHJ5RmFjdG9yeSxcblx0Q29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRDb2x1bW5TZXRGYWN0b3J5LFxuXHRDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdEl0ZW1DYWNoZUZhY3RvcnksXG5cdEl0ZW1FbnRyeUZhY3RvcnksXG5cdEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuaW1wb3J0IHtcblx0QXV0aEludGVyZmFjZSxcblx0RXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRQcm9taXNlTGlicmFyeUludGVyZmFjZSxcbn0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL0xpbmtUcmVlU2VydmljZUludGVyZmFjZSc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uRWRpdFJlc291cmNlLFxuXHRDb2xsZWN0aW9uRW50cnksXG5cdENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdENvbGxlY3Rpb25SZXNvdXJjZSxcblx0Q29sbGVjdGlvblJlc291cmNlT3B0aW9ucyxcblx0Q29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZSxcblx0Q29sbGVjdGlvblZpZXdSZXNvdXJjZSxcblx0RWRpdFJlc291cmNlLFxuXHRJdGVtRW50cnksXG5cdEl0ZW1FbnRyeU9wdGlvbnMsXG5cdEl0ZW1SZXNvdXJjZSxcblx0TG9jYWxWaWV3UmVzb3VyY2UsXG5cdFJlbW90ZVZpZXdSZXNvdXJjZSxcbn0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaUxpbmtUcmVlVHlwZSxcblx0QXBpUXVlcnksXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRDb2xsZWN0aW9uRGVmaW5pdGlvbixcblx0Q29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXAsXG5cdENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcCxcblx0Q29udmVyc2lvbk1hcCxcblx0Q3JlYXRlUmVxdWVzdFBhcmFtZXRlck1hcCxcblx0RW50cnlQYXJlbnROdWxsLFxuXHRGaWVsZE1hcCxcblx0SXRlbUlkLFxuXHRJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0SXRlbVJlc291cmNlc0l0ZW1UeXBlTWFwLFxuXHRJdGVtVHlwZSxcblx0SXRlbVR5cGVNYXAsXG5cdExpbmtDb2xsZWN0aW9uRGVmaW5pdGlvbixcblx0UHJvbWlzZUludGVyZmFjZSxcblx0U3RhdGVLZXlUeXBlLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhUmVzdWx0IH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vQ29sbGVjdGlvbkVudHJ5U2VydmljZSc7XG5pbXBvcnQgeyBDb2x1bW5IYW5kbGVyIH0gZnJvbSAnLi4vLi4vQ29sdW1uSGFuZGxlcic7XG5pbXBvcnQgeyBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vLi4vQ29sdW1uVXRpbCc7XG5pbXBvcnQge1xuXHRBcGlGb3JtYXR0ZXIsXG5cdEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRDb2x1bW5DYWNoZSxcblx0aGFzUHJvcGVydGllcyxcblx0TG9ja1NlcnZpY2UsXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCxcblx0T25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHRSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0VHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uLFxuXHRUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlLFxuXHRUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyLFxuXHRUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMsXG5cdFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIsXG59IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IEludGVybmFsQ2hhbmdlc0RlbHRhIH0gZnJvbSAnLi4vLi4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL0l0ZW1FbnRyeVNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uLy4uL0tleVNlcnZpY2UnO1xuaW1wb3J0IHsgUXVlcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vUXVlcnlTZXJ2aWNlJztcbmltcG9ydCB7IFRlbXBsYXRlQ2FjaGUgfSBmcm9tICcuLi8uLi9UZW1wbGF0ZUNhY2hlJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuLi9BYnN0cmFjdENhY2hlJztcbmltcG9ydCB7IENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi4vc2VydmVyL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkV2ZW50SGFuZGxlcic7XG5cbnR5cGUgRWRpdFJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0ge21haW46IEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+LCBsaW5rZWQ6IEl0ZW1SZXNvdXJjZXNJdGVtVHlwZU1hcH07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgVHJhbnNhY3Rpb25DYWNoZX0gaXMgcmVzcG9uc2libGUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgbmV3bHkgY3JlYXRlZCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfVxuICogYW5kIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJpZXN9LCBhbmQgdGhlIGNoYW5nZXMgb2YgZXhpc3RpbmcgSXRlbUVudHJpZXMgYW5kIENvbGxlY3Rpb25FbnRyaWVzLlxuICpcbiAqIFRoZSBUcmFuc2FjdGlvbkNhY2hlIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30sIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IGFuZCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbidzIGNoYW5nZXMgb24gdGhpcyBJdGVtRW50cnlcbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQ2FjaGVcblx0ZXh0ZW5kcyBBYnN0cmFjdENhY2hlIHtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFN0b3JlcyB0aGUgJ3Jvb3QnIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSwgdGhpcyB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gY2FuIGJlIHVzZWQgYXMgcmVxdWVzdCBwYXJlbnQgdG8gc3RvcmUgdGhlIHdob2xlIHRyYW5zYWN0aW9uIGF0IG9uY2Vcblx0ICovXG5cdHB1YmxpYyByb290SXRlbTogSXRlbUVudHJ5PGFueT4gfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBTdG9yZXMgYWRkaXRpb25hbCByZXF1ZXN0IHBhcmFtZXRlcnMgZm9yIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIHN0b3JlZCB0byB0aGUgc2VydmVyXG5cdCAqL1xuXHRwdWJsaWMgdGFiUmVxdWVzdFBhcmFtZXRlcnMgPSB7fTtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIElzIHRydWUgd2hpbGUgdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9uQ2FjaGV9IGlzIGFwcGx5aW5nIGNoYW5nZXMgdG8gdGhlIHBhcmVudCAoY2FuIGVpdGhlciBiZSB0aHJvdWdoIGEgbWVyZ2Ugb3IgYW4gQXBpIHNhdmUpXG5cdCAqL1xuXHRwdWJsaWMgaXNTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIElzIHRydWUgd2hlbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBoYXM6XG5cdCAqIC0gTmV3bHkgY3JlYXRlZCBpdGVtc1xuXHQgKiAtIFJlbW92ZWQgaXRlbXMgKGZyb20gY29sbGVjdGlvbnMpXG5cdCAqIC0gQ2hhbmdlcyBvbiBleGlzdGluZyBpdGVtc1xuXHQgKi9cblx0cHVibGljIGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFRoZSB0cmFuc2FjdGlvbidzIHBhcmVudFxuXHQgKi9cblx0cHVibGljIHJlYWRvbmx5IHBhcmVudDogQWJzdHJhY3RDYWNoZTtcblxuXHRwdWJsaWMgcmVhZG9ubHkgaXRlbUhhbmRsZXI6IFRyYW5zYWN0aW9uSXRlbUhhbmRsZXI7XG5cdHB1YmxpYyByZWFkb25seSBjb2xsZWN0aW9uSGFuZGxlcjogVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlcjtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGV2ZW50SGFuZGxlcjogVHJhbnNhY3Rpb25FdmVudEhhbmRsZXI7XG5cblx0cHJpdmF0ZSBjaGFuZ2VzSW50ZXJ2YWw6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRjb3JlOiBSbUNvcmUsXG5cdFx0Y29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlLFxuXHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0bG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlLFxuXHRcdG1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeTogQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHRlbXBsYXRlQ2FjaGU6IFRlbXBsYXRlQ2FjaGUsXG5cdFx0aXRlbUNhY2hlRmFjdG9yeTogSXRlbUNhY2hlRmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0Y29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdGl0ZW1FbnRyeUZhY3Rvcnk6IEl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0aXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdGNvbGxlY3Rpb25FbnRyeUZhY3Rvcnk6IENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0XHRhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRsaW5rVHJlZVNlcnZpY2U6IExpbmtUcmVlU2VydmljZUludGVyZmFjZSxcblx0XHRwYXJlbnQ6IEFic3RyYWN0Q2FjaGUsXG5cdFx0LyoqXG5cdFx0ICogQGRlc2NyaXB0aW9uXG5cdFx0ICogRm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuXHRcdCAqL1xuXHRcdHB1YmxpYyBpZD86IHN0cmluZyxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRjb3JlLFxuXHRcdFx0Y29sdW1uQ2FjaGUsXG5cdFx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0cXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdGF1dGhJbnRlcmZhY2UsXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0bG9ja1NlcnZpY2UsXG5cdFx0XHRtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRcdGl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0ZW1wbGF0ZUNhY2hlLFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRpdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5U2VydmljZSxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGxpbmtUcmVlU2VydmljZSxcblx0XHQpO1xuXG5cdFx0dGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cblx0XHR0aGlzLml0ZW1IYW5kbGVyID0gbmV3IFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIoXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0ZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdHRlbXBsYXRlQ2FjaGUsXG5cdFx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y29sdW1uSGFuZGxlcixcblx0XHRcdGNvbHVtblNldEZhY3RvcnksXG5cdFx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdHByb21pc2VTZXJ2aWNlLFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0XHRpdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHR0aGlzLFxuXHRcdCk7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb25IYW5kbGVyID0gbmV3IFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIoXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0Y29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0Y29sdW1uSGFuZGxlcixcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0dGhpcyxcblx0XHQpO1xuXG5cdFx0dGhpcy5ldmVudEhhbmRsZXIgPSBuZXcgVHJhbnNhY3Rpb25FdmVudEhhbmRsZXIoXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBkZXN0cm95ICgpOiB2b2lkIHtcblx0XHR0aGlzLnBhcmVudC5vbkNoaWxkRGVzdHJveSh0aGlzKTtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVDaGFuZ2VzRGVsdGEgKCk6IENoYW5nZXNEZWx0YSB7XG5cdFx0cmV0dXJuIHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogTWVyZ2VzIHRoZSBwYXNzZWQgY2hhbmdlcyBmcm9tIHRoZSBwYXJlbnQgVHJhbnNhY3Rpb24gaW50byB0aGlzIFRyYW5zYWN0aW9uJ3Mgb3duIGNoYW5nZXMgYW5kIHRoZW4gcHJvcGFnYXRlc1xuXHQgKiB0aGVtIHRvIGFsbCBjaGlsZCBUcmFuc2FjdGlvbnMsIHRoaXMgYXNzdW1lcyB0aGF0IGFuIGFjdGlvbiBpcyBhbHJlYWR5IGhhbmRsZWQgaW4gYSBwYXJlbnQsIHNvIGl0IGRvZXMndCBoYW5kbGUgY3JlYXRlZCBlbnRyaWVzXG5cdCAqIGFuZCByZW1vdmVzIGVudHJpZXMgdGhhdCB3ZXJlIGluIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtcyBkZWxldGVkSXRlbXN9IHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgZGVsZXRlZFxuXHQgKlxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS1cblx0ICpcblx0ICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50fSBhbmQge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGF9IGlzIHRoYXQgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudCBhc3N1bWVzXG5cdCAqIHRoZSBjaGFuZ2UgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQsIGFuZCBhcHBseUNoYW5nZXNEZWx0YSB3aWxsIHByb2Nlc3MgdGhlIGNoYW5nZXMgb25jZSB5b3Ugc2F2ZSB0aGUgdHJhbnNhY3Rpb25cblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqIFVzZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBhcHBseUNoYW5nZXNEZWx0YX0gaWYgeW91IHdhbnQgdG8gYXBwbHkgY2hhbmdlcyBmcm9tIG91dHNpZGUgdGhlIGNvcmVcblx0ICpcblx0ICogQHBhcmFtIGludGVybmFsQ2hhbmdlc0RlbHRhIENoYW5nZXMgdG8gYmUgYXBwbGllZFxuXHQgKiBAcGFyYW0gaXNDYWxsZWRBZnRlckFwaVNhdmUgSWYgJ2lzQ2FsbGVkQWZ0ZXJBcGlTYXZlJyBpcyB0cnVlIGxvY2FsIGNoYW5nZXMgd2lsbCBhbHdheXMgYmUgb3ZlcndyaXR0ZW4gKGluc3RlYWQgb2Ygb25seSB3aGVuIHRoZXJlIGFyZSBubyBjaGFuZ2VzKVxuXHQgKi9cblx0cHVibGljIGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgKFxuXHRcdGludGVybmFsQ2hhbmdlc0RlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogdm9pZCB7XG5cdFx0Ly8gV2UgZG9uJ3QgbmVlZCB0byBwcm9jZXNzIGNyZWF0ZWQgaXRlbXMsIGJlc2lkZXMgY2hlY2tpbmcgaWYgdGhleSBmaXQgaW4gY29sbGVjdGlvbnNcblx0XHQvLyBjcmVhdGluZyBlbnRyaWVzIGlzIGFscmVhZHkgZG9uZSBieSBgYXBwbHlDaGFuZ2VzRGVsdGFgIG9uIGEgcGFyZW50IHRyYW5zYWN0aW9uXG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIucHJvY2Vzc0l0ZW1FbnRyeUNoYW5nZXMoXG5cdFx0XHRcdHR1cGxlLFxuXHRcdFx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXIoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSGFuZGxlci5pdGVtUmVzb3VyY2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1FbnRyeS5pdGVtVHlwZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXS5pbmRleE9mKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHRcdFx0XHQvLyBpZiBhbiBpdGVtIGlzIGRlbGV0ZWQgb24gYW5vdGhlciBjYWNoZSB3ZSBzaG91bGRuJ3QgYXR0ZW1wdCBhbm90aGVyIHJlcXVlc3QsIHNvIHdlIHJlbW92ZSBpdCBmcm9tIHRoZSB0by1iZS1kZWxldGVkIGFycmF5XG5cdFx0XHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtRW50cnkuaXRlbVR5cGVdLnNwbGljZShcblx0XHRcdFx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdFx0XHRcdDEsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25NYXRjaGVyID0gbmV3IENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IoXG5cdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHQpO1xuXG5cdFx0Y29sbGVjdGlvbk1hdGNoZXJcblx0XHRcdC5wcm9jZXNzRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHQucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoaXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSk7XG5cblx0XHQvLyB0b2RvW2NhY2hlXSB3ZSBjb3VsZCBhcHBseSB0aGUgY2hhbmdlcyB0byBjaGlsZHJlbiB3aGlsZSB0aGUgcHJvbWlzZSBpcyBydW5uaW5nXG5cdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KGludGVybmFsQ2hhbmdlc0RlbHRhKTtcblx0XHR9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBkbyB3ZSB3YW50IHRoaXM/IE1heWJlIGFmdGVyIG1lcmdpbmcgdGhlIHNlcnZlciBjaGFuZ2VzIHRoZXJlJ3Mgbm8gY2hhbmdlcyBhbnltb3JlXG5cdFx0dGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7XG5cdFx0dGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEFwcGxpZXMgY2hhbmdlcyB0byB0aGlzIHRyYW5zYWN0aW9uIGFuZCBpdHMgY2hpbGRyZW5cblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqXG5cdCAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4ge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRnJvbVBhcmVudH0gYW5kIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhfSBpcyB0aGF0IGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgYXNzdW1lc1xuXHQgKiB0aGUgY2hhbmdlIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLCBhbmQgYXBwbHlDaGFuZ2VzRGVsdGEgd2lsbCBwcm9jZXNzIHRoZSBjaGFuZ2VzIGl0c2VsZiAocmVzdWx0IHZzIGNhdXNlKVxuXHQgKlxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS1cblx0ICpcblx0ICogRGlmZmVycyBmcm9tIHtAbGluayBTZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBTZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNEZWx0YX0gaW4gdGhlIGhhbmRsaW5nIG9mIGRlbGV0ZWQgZW50cmllcyBhbmQgdGhlIGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgY2FsbFxuXHQgKi9cblx0cHVibGljIGFwcGx5Q2hhbmdlc0RlbHRhIChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzRGVsdGEuY3JlYXRlZC5sZW5ndGggPT09IDBcblx0XHRcdCYmICFoYXNQcm9wZXJ0aWVzKGNoYW5nZXNEZWx0YS51cGRhdGVkKVxuXHRcdFx0JiYgIWhhc1Byb3BlcnRpZXMoY2hhbmdlc0RlbHRhLmRlbGV0ZWQpXG5cdFx0KSB7XG5cdFx0XHQvLyBlbXB0eSBkZWx0YSwgbm8gbmVlZCB0byBkbyBhbnl0aGluZ1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKHtcblx0XHRcdFx0Y3JlYXRlZDogW10sXG5cdFx0XHRcdHJvbGxiYWNrOiBub29wLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaFVwZGF0ZWREZXJpdmVkVmFsdWVzRnJvbURlbHRhKGNoYW5nZXNEZWx0YSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qge3Jlc3VsdCwgaW50ZXJuYWxDaGFuZ2VzRGVsdGEsIHJvbGxiYWNrRnVuY3Rpb25zfSA9IHN1cGVyLl9hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBjaGFuZ2VzRGVsdGEuZGVsZXRlZCkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBjaGFuZ2VzRGVsdGEuZGVsZXRlZFtpdGVtVHlwZV0pIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmNsZWFyKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRcdFx0Y29uc3Qgb2xkQ2hhbmdlcyA9IHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdFx0XHRcdFx0XHRkZWxldGUgY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5LmlkXTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuaXRlbUhhbmRsZXIuaXRlbVJlc291cmNlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtRW50cnkuaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtRW50cnkuaXRlbVR5cGVdID0gW107XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB0b2RvW2NhY2hlXSBjaGVjayBpZiBpdCdzIGFscmVhZHkgaW4gdGhlIGFycmF5ID9cblx0XHRcdFx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbURlbGV0ZWQoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRcdFx0XHRyb2xsYmFja0Z1bmN0aW9ucy5wdXNoKFxuXHRcdFx0XHRcdFx0XHRcdHJvbGxiYWNrRGVsdGEgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0cm9sbGJhY2tEZWx0YS5zZXRJdGVtVXBkYXRlZChcblx0XHRcdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRvbGRDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXIgPSBuZXcgQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcihcblx0XHRcdFx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRcdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUgPT4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5nZXRBbGxDb2xsZWN0aW9uc0J5SXRlbVR5cGUoaXRlbVR5cGUpLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRjb2xsZWN0aW9uTWF0Y2hlclxuXHRcdFx0XHRcdFx0LnByb2Nlc3NEZWx0YShpbnRlcm5hbENoYW5nZXNEZWx0YSlcblx0XHRcdFx0XHRcdC5yZW1vdmVGcm9tQW5kQWRkVG9Db2xsZWN0aW9ucygpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRcdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KGludGVybmFsQ2hhbmdlc0RlbHRhKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0b2RvW2NhY2hlXSBkbyB3ZSB3YW50IHRoaXM/IE1heWJlIGFmdGVyIG1lcmdpbmcgdGhlIHNlcnZlciBjaGFuZ2VzIHRoZXJlJ3Mgbm8gY2hhbmdlcyBhbnltb3JlLCBjb3VsZCBiZSBhIHBlcmZvcm1hbmNlIHRoaW5neVxuXHRcdFx0XHRcdHRoaXMuaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXHRcdFx0XHRcdHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U2VydmVyQ2FjaGUgKCk6IFNlcnZlckNhY2hlIHtcblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0U2VydmVyQ2FjaGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyB0aGUgZW50cnkncyBwYXJlbnQgZnJvbSB0aGUgY2xvc2VzdCB0cmFuc2FjdGlvblxuXHQgKlxuXHQgKiBAcGFyYW0gaXRlbUVudHJ5IFRoZSBlbnRyeSB0byBnZXQgdGhlIHBhcmVudCBmcm9tXG5cdCAqIEBwYXJhbSBmcm9tSW5pdGlhbCBJZiBgdHJ1ZWAgdGhlIHBhcmVudCB2YWx1ZXMgd2lsbCBiZSByZWFkIGZyb20ge0BsaW5rIFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcy5pbml0aWFsIGluaXRpYWx9IChVc2VmdWwgZm9yIHdoZW4geW91J3ZlIG1vdmVkIGFuIGVudHJ5KVxuXHQgKiBAcGFyYW0gcHJvdmlkZWRGaWVsZHMgVXNlIHRoZSBwcm92aWRlZCBmaWVsZHMgaW5zdGVhZCBvZiB0aGUgY2FjaGVkIGZpZWxkcywgdXNlZCBieSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlLmdldFBhcmVudCBDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0UGFyZW50fVxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIFVzZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlLmdldFBhcmVudCBDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0UGFyZW50fSBpbnN0ZWFkIG9mIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudCBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudH0gaWYgeW91J3JlIGdldHRpbmcgdGhlIHBhcmVudCBpbiB0aGUgb25SZW1vdmUgY2FsbGJhY2tcblx0ICovXG5cdC8vIHRvZG9bY2FjaGVdIHJlbmFtZSB0byBnZXRJdGVtUGFyZW50IG9yIGdldFBhcmVudE9iamVjdD9cblx0cHVibGljIGdldFBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZnJvbUluaXRpYWw6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRwcm92aWRlZEZpZWxkcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEVudHJ5UGFyZW50TnVsbCB7XG5cdFx0bGV0IGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB8IHVuZGVmaW5lZDtcblxuXHRcdGlmIChwcm92aWRlZEZpZWxkcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRmaWVsZHMgPSBwcm92aWRlZEZpZWxkcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgY2hhbmdlc1R1cGxlID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRpZiAoY2hhbmdlc1R1cGxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0ZmllbGRzID0gY2hhbmdlc1R1cGxlW2Zyb21Jbml0aWFsID8gJ2luaXRpYWwnIDogJ2NoYW5nZXMnXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZmllbGRzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50RnJvbUZpZWxkcyhcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRmaWVsZHMsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBwYXJlbnQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LmdldFBhcmVudChcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdGZyb21Jbml0aWFsLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFRyYXZlcnNlcyB0aGUgdHJhbnNhY3Rpb24gY2hhaW4gYW5kIHJldHVybnMgdGhlIGNoYW5nZXMgb2YgdGhlIGl0ZW0gb24gdGhlIGZpcnN0IHRyYW5zYWN0aW9uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb3B5RmllbGRzIElmIHNldCwgd2lsbCBjYWxsIHtAbGluayBBcGlGb3JtYXR0ZXIuY29weUZpZWxkcyBBcGlGb3JtYXR0ZXIuY29weUZpZWxkc30sIG90aGVyd2lzZSBqdXN0IHJldHVybnMgdGhlIG9iamVjdFxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdFx0Y29weUZpZWxkczogYm9vbGVhbiA9IHRydWUsXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF07XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzICE9PSB1bmRlZmluZWRcblx0XHRcdCYmIGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRpZiAoIWNvcHlGaWVsZHMpIHtcblx0XHRcdFx0cmV0dXJuIGNoYW5nZXMuY2hhbmdlcztcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRcdGNoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0e30sXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnBhcmVudC5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0aXRlbUVudHJ5SWQsXG5cdFx0XHRjb3B5RmllbGRzLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgdGhlIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlfSBmcm9tIHRoZSB0cmFuc2FjdGlvbiwgcHJldmVudGluZyB0aGUge0BsaW5rIEl0ZW1SZXNvdXJjZS5vcHRpb25zLm9uQ2hhbmdlIHRoZSBvbkNoYW5nZSBjYWxsYmFja30gZnJvbSBiZWluZyBjYWxsZWQuXG5cdCAqIFlvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIHJlc291cmNlIGlzIG5vIGxvbmdlciBuZWVkZWRcblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBEb2VzIG5vdCByZW1vdmUgY2hhbmdlc1xuXHQgKi9cblx0cHVibGljIGNsZWFySXRlbVJlc291cmNlIChyZXNvdXJjZTogSXRlbVJlc291cmNlKTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXIuY2xlYXJSZXNvdXJjZShyZXNvdXJjZSk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgQ29sbGVjdGlvblJlc291cmNlfSBmcm9tIHRoZSB0cmFuc2FjdGlvbiwgcHJldmVudGluZyB0aGUge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZS5vcHRpb25zLm9uQWRkIG9uQWRkfSBhbmQge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZS5vcHRpb25zLm9uUmVtb3ZlIG9uUmVtb3ZlfSBjYWxsYmFja3MgZnJvbSBiZWluZyBjYWxsZWQuXG5cdCAqIFlvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIHJlc291cmNlIGlzIG5vIGxvbmdlciBuZWVkZWRcblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBEb2VzIG5vdCByZW1vdmUgY2hhbmdlc1xuXHQgKi9cblx0cHVibGljIGNsZWFyQ29sbGVjdGlvblJlc291cmNlIChyZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlKTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuY2xlYXJSZXNvdXJjZShyZXNvdXJjZSk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLnJvb3RJdGVtIHJvb3RJdGVtfSBpcyB1c2VzIGxvY2tzXG5cdCAqL1xuXHRwdWJsaWMgaXNMb2NrYWJsZSAoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMucm9vdEl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJvb3RJdGVtLmlzTG9ja2FibGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRGlzYWJsZXMgdGhlIHRyYW5zYWN0aW9uJ3MgY2hhbmdlcyB3YXRjaGVyLCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXV0b21hdGljYWxseSBkZXRlY3QgY2hhbmdlcyBvbiBpdGVtc1xuXHQgKi9cblx0cHVibGljIGRpc2FibGVDaGFuZ2VzV2F0Y2hlciAoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuY2hhbmdlc0ludGVydmFsID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLmNoYW5nZXNJbnRlcnZhbCk7XG5cdFx0dGhpcy5jaGFuZ2VzSW50ZXJ2YWwgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBFbmFibGVzIHRoZSB0cmFuc2FjdGlvbidzIGNoYW5nZXMgd2F0Y2hlciwgdGhlIHRyYW5zYWN0aW9uIHdpbGwgbm93IGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGNoYW5nZXMgb24gaXRlbXNcblx0ICovXG5cdHB1YmxpYyBlbmFibGVDaGFuZ2VzV2F0Y2hlciAoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuY2hhbmdlc0ludGVydmFsICE9PSBudWxsKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdCdDaGFuZ2VzIHdhdGNoZXIgYWxyZWFkeSBydW5uaW5nIScsXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5kaXNhYmxlQ2hhbmdlc1dhdGNoZXIoKTtcblx0XHR9XG5cblx0XHR0aGlzLmNoYW5nZXNJbnRlcnZhbCA9IHdpbmRvdy5zZXRJbnRlcnZhbChcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0aWYgKCF0aGlzLmRldGVjdENoYW5nZXMoKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZGlzYWJsZUNoYW5nZXNXYXRjaGVyKCk7XG5cblx0XHRcdFx0aWYgKHRoaXMuaXNMb2NrYWJsZSgpKSB7XG5cdFx0XHRcdFx0dGhpcy5sb2NrU2VydmljZS5mZXRjaExvY2sodGhpcy5yb290SXRlbSEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0MzAwMCxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBTYXZlcyB0aGUgdHJhbnNhY3Rpb24sIHRoaXMgaGFzIGEgZGlmZmVyZW50IGVmZmVjdCBkZXBlbmRpbmcgb24gdGhlIHRyYW5zYWN0aW9uJ3MgcGFyZW50LlxuXHQgKlxuXHQgKiAtIElmIHRoZSBwYXJlbnQgaXMgYW5vdGhlciB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSBUcmFuc2FjdGlvbkNhY2hlfSBpdCB3aWxsIG1lcmdlIHRoZSBjaGFuZ2VzIG9mIHRoZSBjaGlsZCB0cmFuc2FjdGlvbiBpbiB0aGUgdGhlIHBhcmVudCB0cmFuc2FjdGlvblxuXHQgKiAtIElmIHRoZSBwYXJlbnQgaXMgdGhlIHtAbGluayBTZXJ2ZXJDYWNoZSBTZXJ2ZXJDYWNoZX0gaXQgd2lsbCBzYXZlIHRoZSBjaGFuZ2VzIHRvIHRoZSBBUGlcblx0ICovXG5cdHB1YmxpYyBzYXZlIChcblx0XHRjbG9zZVRhYiA9IGZhbHNlLFxuXHRcdHBhcmFtZXRlcnM6IENyZWF0ZVJlcXVlc3RQYXJhbWV0ZXJNYXAgPSB7fSxcblx0XHRicmVha1VwQnlQYXJlbnQ/OiBib29sZWFuLFxuXHRcdG9uQWZ0ZXJDcmVhdGVDYWxsYmFjaz86IE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuaXNTYXZpbmcpIHtcblx0XHRcdHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5yZWplY3QoKTtcblx0XHR9XG5cblx0XHR0aGlzLmlzU2F2aW5nID0gdHJ1ZTtcblxuXHRcdHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuXHRcdHRoaXMuZGlzYWJsZUNoYW5nZXNXYXRjaGVyKCk7XG5cblx0XHRsZXQgaXRlbUlkQ29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcDtcblxuXHRcdHJldHVybiAoXG5cdFx0XHR0aGlzLmlzTG9ja2FibGUoKVxuXHRcdFx0XHQ/IHRoaXMubG9ja1NlcnZpY2UuZmV0Y2hMb2NrKHRoaXMucm9vdEl0ZW0hKVxuXHRcdFx0XHQ6IHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpXG5cdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5ldmVudEhhbmRsZXIuZXhlY3V0ZUNhbGxiYWNrcyhcblx0XHRcdFx0XHRcdCdvbkJlZm9yZVNhdmUnLFxuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgPT4gY2FsbGJhY2sodGhpcyksXG5cdFx0XHRcdFx0XHRjbG9zZVRhYixcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMudGFiUmVxdWVzdFBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdFx0XHQuLi50aGlzLnRhYlJlcXVlc3RQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0Li4ucGFyYW1ldGVycyxcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMucGFyZW50LmFwcGx5Q2hhbmdlc0Zyb21DaGlsZChcblx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRicmVha1VwQnlQYXJlbnQsXG5cdFx0XHRcdFx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRfaXRlbUlkQ29udmVyc2lvbk1hcCA9PiB7XG5cdFx0XHRcdFx0aXRlbUlkQ29udmVyc2lvbk1hcCA9IF9pdGVtSWRDb252ZXJzaW9uTWFwO1xuXG5cdFx0XHRcdFx0dGhpcy50YWJSZXF1ZXN0UGFyYW1ldGVycyA9IHt9O1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuaXNMb2NrYWJsZSgpKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmxvY2tTZXJ2aWNlLmNsZWFyTG9jayh0aGlzLnJvb3RJdGVtISk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5ldmVudEhhbmRsZXIuZXhlY3V0ZUNhbGxiYWNrcyhcblx0XHRcdFx0XHRcdCdvblNhdmVTdWNjZXNzJyxcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0+IGNhbGxiYWNrKFxuXHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdGNsb3NlVGFiLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKCFjbG9zZVRhYikge1xuXHRcdFx0XHRcdFx0dGhpcy5lbmFibGVDaGFuZ2VzV2F0Y2hlcigpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRcdHJldHVybiBpdGVtSWRDb252ZXJzaW9uTWFwO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQuY2F0Y2goXG5cdFx0XHRcdGVycm9yID0+IHtcblx0XHRcdFx0XHR0aGlzLmlzU2F2aW5nID0gZmFsc2U7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KGVycm9yKTtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZGV0ZWN0Q2hhbmdlcyAoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuaGFzQ2hhbmdlcykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuZGV0ZWN0Q2hhbmdlcygpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5oYXNDaGFuZ2VzID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgYW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IHRocm91Z2ggYW4ge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2V9IGZyb20gdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9uQ2FjaGV9IHdoaWNoIG1lYW5zIHRoYXQgY2hhbmdlcyBvbiB0aGlzIGVudHJ5IHdpbGwgbm8gbG9uZ2VyIGJlIHRyYWNrZWQuXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJJdGVtIChpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxhbnk+KTogdm9pZCB7XG5cdFx0dGhpcy5jbGVhckl0ZW1FbnRyeShpdGVtUmVzb3VyY2UuZW50cnkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZW1vdmVzIGFuIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSBmcm9tIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSBUcmFuc2FjdGlvbkNhY2hlfSB3aGljaCBtZWFucyB0aGF0IGNoYW5nZXMgb24gdGhpcyBlbnRyeSB3aWxsIG5vIGxvbmdlciBiZSB0cmFja2VkLlxuXHQgKi9cblx0cHVibGljIGNsZWFySXRlbUVudHJ5IChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXIuY2xlYXJJdGVtRW50cnkoaXRlbUVudHJ5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVtb3ZlcyBhIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJ5fSB0aHJvdWdoIGEge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZSBDb2xsZWN0aW9uUmVzb3VyY2V9IGZyb20gdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9uQ2FjaGV9IHdoaWNoIG1lYW5zIHRoYXQgY2hhbmdlcyBvbiB0aGlzIGNvbGxlY3Rpb24gd2lsbCBubyBsb25nZXIgYmUgdHJhY2tlZC5cblx0ICovXG5cdHB1YmxpYyBjbGVhckNvbGxlY3Rpb24gKGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPGFueT4pOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jbGVhckVudHJ5KGNvbGxlY3Rpb25SZXNvdXJjZS5lbnRyeSk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEFkZHMgYSBjYWxsYmFjayB0aGF0IHdpbGwgZmlyZSBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIHNhdmVkLCByZWplY3RpbmcgdGhpcyBjYWxsYmFjayB3aWxsIHByZXZlbnQgdGhlIHRyYW5zYWN0aW9uIGZyb20gc2F2aW5nXG5cdCAqL1xuXHRwdWJsaWMgb25CZWZvcmVTYXZlIChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRjYWxsYmFjazogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZVsnb25CZWZvcmVTYXZlJ10sXG5cdFx0Y29uZGl0aW9uPzogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uLFxuXHRcdHByaW9yaXR5PzogbnVtYmVyLFxuXHQpOiAoKSA9PiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5ldmVudEhhbmRsZXIucmVnaXN0ZXJDYWxsYmFjayhcblx0XHRcdCdvbkJlZm9yZVNhdmUnLFxuXHRcdFx0a2V5LFxuXHRcdFx0Y2FsbGJhY2ssXG5cdFx0XHRjb25kaXRpb24sXG5cdFx0XHRwcmlvcml0eSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBZGRzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGZpcmUgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgc2F2ZWQgc3VjY2Vzc2Z1bGx5XG5cdCAqL1xuXHRwdWJsaWMgb25TYXZlU3VjY2VzcyAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0Y2FsbGJhY2s6IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGVbJ29uU2F2ZVN1Y2Nlc3MnXSxcblx0XHRjb25kaXRpb24/OiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24sXG5cdFx0cHJpb3JpdHk/OiBudW1iZXIsXG5cdCk6ICgpID0+IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLmV2ZW50SGFuZGxlci5yZWdpc3RlckNhbGxiYWNrKFxuXHRcdFx0J29uU2F2ZVN1Y2Nlc3MnLFxuXHRcdFx0a2V5LFxuXHRcdFx0Y2FsbGJhY2ssXG5cdFx0XHRjb25kaXRpb24sXG5cdFx0XHRwcmlvcml0eSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIGEge0BsaW5rIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25SZXN1bHR9IGZvciB0aGUgdHJhbnNhY3Rpb25cblx0ICovXG5cdHB1YmxpYyBnZXRNb2R1bGVDaGFuZ2VzICgpOiBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25SZXN1bHQge1xuXHRcdGlmICh0aGlzLnJvb3RJdGVtID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignTm8gcm9vdCBpdGVtIGZvciB0cmFuc2FjdGlvbiBjYWNoZSAnICsgdGhpcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeVxuXHRcdFx0LmNvbnN0cnVjdCh0aGlzKVxuXHRcdFx0LnByb2Nlc3MoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVXBkYXRlcyB0aGUgcGFzc2VkIG1hcCB3aXRoIHRoZSBuZXcge0BsaW5rIENvbnZlcnNpb25NYXAgQ2NvbnZlcnNpb25NYXB9IHZhbHVlc1xuXHQgKi9cblx0cHVibGljIHVwZGF0ZUl0ZW1JZE1hcCAoXG5cdFx0Y29sbGVjdGlvbk1hcDoge1tpdGVtSWQ6IG51bWJlcl06IGFueX0sXG5cdFx0Y29udmVyc2lvbk1hcDogQ29udmVyc2lvbk1hcCxcblx0KTogdm9pZCB7XG5cdFx0aWYgKGNvbnZlcnNpb25NYXAgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3Qgb2xkSWQgaW4gY29udmVyc2lvbk1hcCkge1xuXHRcdFx0Y29uc3QgbmV3SWQgPSBjb252ZXJzaW9uTWFwW29sZElkXTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25NYXBbb2xkSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbGxlY3Rpb25NYXBbbmV3SWRdID0gY29sbGVjdGlvbk1hcFtvbGRJZF07XG5cdFx0XHRkZWxldGUgY29sbGVjdGlvbk1hcFtvbGRJZF07XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNsb25lQ29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWUsIGVkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjbG9uZUNvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWUsIGVkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjbG9uZUNvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlfSxcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjbG9uZUNvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWV9LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNsb25lQ29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjbG9uZUNvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2xvbmVzIHRoZSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gYW5kIGFsbCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSBpbiBpdCwgYW5kIHNldHMgdGhlIHBhcmVudCBvZiB0aGUgbmV3IGVudHJpZXMuXG5cdCAqIFJldHVybnMgYSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlIENvbGxlY3Rpb25SZXNvdXJjZX0gb2YgdGhlIG5ld2x5IGNsb25lZCB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX1cblx0ICovXG5cdHB1YmxpYyBjbG9uZUNvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KSB7XG5cdFx0Y29uc3QgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsIHx8IHBhcmVudCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1BhcmVudCByZXF1aXJlZCBmb3IgY2xvbmVDb2xsZWN0aW9uJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlKFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jbG9uZUNvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0Y29sbGVjdGlvblJlc291cmNlLmVudHJ5LFxuXHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdGNvbnZlcnNpb25NYXAsXG5cdFx0XHQpLFxuXHRcdFx0b3B0aW9ucyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNsb25lSXRlbTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1SZXNvdXJjZTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjbG9uZUl0ZW08SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjbG9uZUl0ZW08SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2xvbmVzIHRoZSB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gYW5kIHJldHVybnMgYSB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZX0gb2YgdGhlIG5ld2x5IGNsb25lZCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX1cblx0ICovXG5cdHB1YmxpYyBjbG9uZUl0ZW08SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHQpIHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHR0aGlzLml0ZW1IYW5kbGVyLmNsb25lSXRlbUVudHJ5KFxuXHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0aXRlbVJlc291cmNlLmVudHJ5LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGFSZXN1bHQgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGNoYW5nZXNEZWx0YVJlc3VsdC5jcmVhdGVkWzBdO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlSXRlbVJlc291cmNlKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldEFsbExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRBbGxMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge3JlbW90ZUl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRBbGxMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0QWxsTGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0QWxsTGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRBbGxMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRBbGxMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpIHtcblx0XHRyZXR1cm4gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LnF1ZXJ5KFxuXHRcdFx0XHRsaW5rVHlwZSxcblx0XHRcdFx0e30sXG5cdFx0XHRcdHtbbGlua1R5cGVdOiBbJ2lkJ119LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRMaW5rQ29sbGVjdGlvbnMoXG5cdFx0XHRcdFx0XHRsaW5rVHlwZSxcblx0XHRcdFx0XHRcdHJlc3BvbnNlLmxpbmtzW2xpbmtUeXBlXSxcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldExpbmtDb2xsZWN0aW9uc0Zyb21EZWY8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGRlZmluaXRpb246IExpbmtDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZmV0Y2hMaW5rZWRDb2xsZWN0aW9uRW50cmllcyhcblx0XHRcdFx0bGlua1R5cGUsXG5cdFx0XHRcdGxpbmtJZEFycmF5LFxuXHRcdFx0XHRkZWZpbml0aW9uLml0ZW1UeXBlLFxuXHRcdFx0XHRkZWZpbml0aW9uLm9wdGlvbnMuZW50cnksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlcyhcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyaWVzLFxuXHRcdFx0XHRcdFx0ZGVmaW5pdGlvbi5vcHRpb25zLnJlc291cmNlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGxpbmtJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0TGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGxpbmtJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0TGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGxpbmtJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0TGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGxpbmtJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+Pj47XG5cblx0cHVibGljIGdldExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRsaW5rSWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpIHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmZldGNoTGlua2VkQ29sbGVjdGlvbkVudHJpZXMoXG5cdFx0XHRcdGxpbmtUeXBlLFxuXHRcdFx0XHRsaW5rSWRBcnJheSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdChjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPikgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXMoXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cmllcyxcblx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uRnJvbURlZjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGRlZmluaXRpb246IENvbGxlY3Rpb25EZWZpbml0aW9uPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmZldGNoQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRkZWZpbml0aW9uLml0ZW1UeXBlLFxuXHRcdFx0XHRkZWZpbml0aW9uLm9wdGlvbnMuZW50cnksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0ZW50cnkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZShcblx0XHRcdFx0XHRcdGVudHJ5LFxuXHRcdFx0XHRcdFx0ZGVmaW5pdGlvbi5vcHRpb25zLnJlc291cmNlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0Q29sbGVjdGlvbjogdHJ1ZSwgZWRpdEl0ZW1zOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlLCByZW1vdGVJdGVtczogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHVibGljIGdldENvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHVibGljIGdldENvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCkge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZmV0Y2hDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRlbnRyeSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlKFxuXHRcdFx0XHRcdFx0ZW50cnksXG5cdFx0XHRcdFx0XHRuZXcgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldENvbGxlY3Rpb25EZWY8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IENvbGxlY3Rpb25EZWZpbml0aW9uPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpdGVtVHlwZTogaXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdGVudHJ5OiBuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSwgLy8gd2UgbmVlZCB0aGUgZGVmYXVsdCBjb2x1bW4gdmFsdWVcblx0XHRcdFx0cmVzb3VyY2U6IG5ldyBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0fSxcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGdldExpbmtDb2xsZWN0aW9uc0RlZjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0bGlua0ZpZWxkOiBzdHJpbmcsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogTGlua0NvbGxlY3Rpb25EZWZpbml0aW9uPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpdGVtVHlwZTogaXRlbVR5cGUsXG5cdFx0XHRsaW5rRmllbGQ6IGxpbmtGaWVsZCxcblx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0ZW50cnk6IG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKG9wdGlvbnMpLCAvLyB3ZSBuZWVkIHRoZSBkZWZhdWx0IGNvbHVtbiB2YWx1ZVxuXHRcdFx0XHRyZXNvdXJjZTogbmV3IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHR9LFxuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgZ2V0SXRlbUJ5U3RhdGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHN0YXRlS2V5OiBJdGVtSWQgfCBzdHJpbmcsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldEl0ZW1CeVN0YXRlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRzdGF0ZUtleTogSXRlbUlkIHwgc3RyaW5nLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldEl0ZW1CeVN0YXRlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRzdGF0ZUtleTogSXRlbUlkIHwgc3RyaW5nLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8TG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFVzZSBnZXRJdGVtQnlJZC9nZXROZXdSZXNvdXJjZVdpdGhJZFxuXHQgKlxuXHQgKiBAcmVtYXJrc1xuXHQgKiBzdGF0ZUtleSBjYW4gYmUgYSBrZXl3b3JkIG9yIGEgbG9jYWwgaWQgKGluIGNhc2Ugb2YgYSByZWZyZXNoKVxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1CeVN0YXRlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRzdGF0ZUtleTogSXRlbUlkIHwgc3RyaW5nLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlID0ge30sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KSB7XG5cdFx0Y29uc3QgcGFyc2VkU3RhdGVLZXkgPSB0aGlzLmtleVNlcnZpY2UucGFyc2VTdGF0ZUtleShzdGF0ZUtleSBhcyBzdHJpbmcpO1xuXG5cdFx0aWYgKHBhcnNlZFN0YXRlS2V5ID09PSBudWxsKSB7XG5cdFx0XHRjb25zdCBpdGVtSWQgPSBzdGF0ZUtleSBhcyBJdGVtSWQ7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0IXRoaXMua2V5U2VydmljZS5pc0xvY2FsSWQoaXRlbUlkKVxuXHRcdFx0XHR8fCB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXNcblx0XHRcdFx0XHQuY29udGFpbnMoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0SXRlbUJ5SWQoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0aXNSb290LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocGFyc2VkU3RhdGVLZXkudHlwZSA9PT0gU3RhdGVLZXlUeXBlLkR1cGxpY2F0ZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0RHVwbGljYXRlQnlJZChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHBhcnNlZFN0YXRlS2V5Lml0ZW1JZCBhcyBJdGVtSWQsXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRpc1Jvb3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmdldE5ld1Jlc291cmNlKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHRpc1Jvb3QsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXREdXBsaWNhdGVCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRkdXBsaWNhdGVJZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHJldHVybkxpbmtzOiB0cnVlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldER1cGxpY2F0ZUJ5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGR1cGxpY2F0ZUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0cmV0dXJuTGlua3M/OiBib29sZWFuLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXREdXBsaWNhdGVCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRkdXBsaWNhdGVJZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlID0ge30sXG5cdFx0cmV0dXJuTGlua3M/OiBib29sZWFuLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPiB8IEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKG9wdGlvbnMudGVtcGxhdGVPcHRpb25zID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9wdGlvbnMudGVtcGxhdGVPcHRpb25zID0ge307XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMudGVtcGxhdGVPcHRpb25zLml0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0b3B0aW9ucy50ZW1wbGF0ZU9wdGlvbnMuaXRlbSA9IGR1cGxpY2F0ZUlkO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmdldE5ld1Jlc291cmNlV2l0aElkKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHR0aGlzLmtleVNlcnZpY2UuZ2V0TG9jYWxEdXBsaWNhdGVJZCgpLFxuXHRcdFx0b3B0aW9ucyBhcyBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0XHRcdHJldHVybkxpbmtzLFxuXHRcdFx0aXNSb290LFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TmV3UmVzb3VyY2VXaXRoSWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHJldHVybkxpbmtzOiB0cnVlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldE5ld1Jlc291cmNlV2l0aElkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRyZXR1cm5MaW5rcz86IGJvb2xlYW4sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldE5ld1Jlc291cmNlV2l0aElkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRyZXR1cm5MaW5rczogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPiB8IEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cblx0XHRvcHRpb25zLmVkaXQgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaE5ld0l0ZW1FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0bmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0ZGVsdGFSZXN1bHQgPT4ge1xuXHRcdFx0XHRcdGxldCBtYWluRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+IHwgdW5kZWZpbmVkO1xuXHRcdFx0XHRcdGNvbnN0IGxpbmtlZEVudHJpZXNNYXA6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPiA9IHt9O1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgZGVsdGFSZXN1bHQuY3JlYXRlZCkge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUgPT09IGl0ZW1UeXBlXG5cdFx0XHRcdFx0XHRcdCYmIGl0ZW1FbnRyeS5pdGVtSWQgPT09IGl0ZW1JZFxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdG1haW5FbnRyeSA9IGl0ZW1FbnRyeTtcblxuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKGxpbmtlZEVudHJpZXNNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGxpbmtlZEVudHJpZXNNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXSA9IFtdO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRsaW5rZWRFbnRyaWVzTWFwW2l0ZW1FbnRyeS5pdGVtVHlwZV0ucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChtYWluRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdUaGUgSXRlbUVudHJ5IHdpdGggdGhlIHJlcXVlc3RlZCBJdGVtSWQgd2FzIG5vdCBpbiB0aGUgdGVtcGxhdGUgcmVzcG9uc2UnKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBtYWluID0gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPihcblx0XHRcdFx0XHRcdG1haW5FbnRyeSxcblx0XHRcdFx0XHRcdG9wdGlvbnMgYXMgSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0XHRcdFx0XHRpc1Jvb3QsXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAoIXJldHVybkxpbmtzKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbWFpbjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBsaW5rZWQgPSB0aGlzLnByb2Nlc3NMaW5rZWRJdGVtcyhcblx0XHRcdFx0XHRcdGxpbmtlZEVudHJpZXNNYXAsXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0bWFpbjogbWFpbixcblx0XHRcdFx0XHRcdGxpbmtlZDogbGlua2VkLFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TmV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHJldHVybkxpbmtzOiB0cnVlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldE5ld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRyZXR1cm5MaW5rcz86IGJvb2xlYW4sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGEgbmV3IEl0ZW1FbnRyeSBhbmQgcmVzb3VyY2Vcblx0ICovXG5cdHB1YmxpYyBnZXROZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgPSB7fSxcblx0XHRyZXR1cm5MaW5rcz86IGJvb2xlYW4sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2VMaW5rczxJdGVtVHlwZVR5cGU+IHwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXROZXdSZXNvdXJjZVdpdGhJZChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0dGhpcy5rZXlTZXJ2aWNlLmdldExvY2FsSWQoKSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRyZXR1cm5MaW5rcyxcblx0XHRcdGlzUm9vdCxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldEl0ZW1zQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge2VkaXQ6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHVibGljIGdldEl0ZW1zQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8UmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwdWJsaWMgZ2V0SXRlbXNCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8TG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBtdWx0aXBsZSBpdGVtcyB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgY2hhbmdlcyBvZiB0aGUgY3VycmVudCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSB0cmFuc2FjdGlvbn1cblx0ICovXG5cdHB1YmxpYyBnZXRJdGVtc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSA9IHt9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGNvbnN0IGVudHJ5T3B0aW9ucyA9IG5ldyBJdGVtRW50cnlPcHRpb25zKG9wdGlvbnMpO1xuXG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaEl0ZW1FbnRyaWVzQnlRdWVyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRlbnRyeU9wdGlvbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2VzKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0SXRlbXNCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHB1YmxpYyBnZXRJdGVtc0J5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZHM6IEl0ZW1JZFtdLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8UmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwdWJsaWMgZ2V0SXRlbXNCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIG11bHRpcGxlIGl0ZW1zIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBjaGFuZ2VzIG9mIHRoZSBjdXJyZW50IHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIHRyYW5zYWN0aW9ufVxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1zQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgPSB7fSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+IHtcblxuXHRcdHJldHVybiB0aGlzLml0ZW1IYW5kbGVyXG5cdFx0XHQuZmV0Y2hJdGVtRW50cmllcyhcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZHMsXG5cdFx0XHRcdG5ldyBJdGVtRW50cnlPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdChpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlSXRlbVJlc291cmNlcyhcblx0XHRcdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldEl0ZW1CeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0SXRlbUJ5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldEl0ZW1CeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgaXRlbSB3aXRoIHRoZSBjaGFuZ2VzIG9mIHRoZSBjdXJyZW50IHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIHRyYW5zYWN0aW9ufVxuXHQgKlxuXHQgKiBAcGFyYW0gaXNSb290IFNldHMgdGhlIGl0ZW0gYXMgdGhlIHJvb3QgaXRlbSBvZiB0aGUgdHJhbnNhY3Rpb25cblx0ICovXG5cdHB1YmxpYyBnZXRJdGVtQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgPSB7fSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaEl0ZW1FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0bmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2UoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdFx0aXNSb290LFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIHRpdGxlIG9mIGFuIGl0ZW0sIGRvZXMgbm90IGNyZWF0ZSBhbiB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZX1cblx0ICovXG5cdHB1YmxpYyBmZXRjaFRpdGxlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8c3RyaW5nPiB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXIuZmV0Y2hUaXRsZShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0aGUgcGFzc2VkIGNoaWxkIFRyYW5zYWN0aW9uIGludG8gdGhpcyB0cmFuc2FjdGlvbiBhbmQgdGhlbiBwcm9wYWdhdGVzIHRoZW0gdG8gdGhlIG90aGVyIGNoaWxkIHRyYW5zYWN0aW9uc1xuXHQgKi9cblx0cHVibGljIGFwcGx5Q2hhbmdlc0Zyb21DaGlsZCAoXG5cdFx0Y2hpbGRUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRfYnJlYWtVcEJ5UGFyZW50PzogYm9vbGVhbixcblx0XHRfb25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1JZENvbnZlcnNpb25NYXA+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGludGVybmFsQ2hhbmdlc0RlbHRhID0gY2hpbGRUcmFuc2FjdGlvbi5nZXREZWx0YSgpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5tb3ZlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS5tb3ZlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdC8vIEJpdCBvZiBhIGhhY2ssIGJ1dCB3aGVuIG1lcmdpbmcgdHJhbnNhY3Rpb25zIHdlIHdhbnQgdG8gaGFuZGxlIG1vdmVzIGFzIHVwZGF0ZXNcblx0XHRcdC8vIFdlIG9ubHkgd2FudCB0aGUgbW92ZXMgaW4gdGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRvIGRvIGEgbGlua1RvIHJlcXVlc3Qgd2hlbiBzYXZpbmcgdG8gdGhlIEFQSVxuXHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0dHVwbGUudG8sXG5cdFx0XHQpO1xuXG5cdFx0XHRkZWxldGUgaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWRbaXRlbUVudHJ5SWRdO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF0gPSB0aGlzLml0ZW1IYW5kbGVyLmNvcHlUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMoXG5cdFx0XHRcdFx0Y2hpbGRUcmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF0sXG5cdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLnByb2Nlc3NJdGVtRW50cnlDaGFuZ2VzKFxuXHRcdFx0XHRcdHR1cGxlLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5jcmVhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGludGVybmFsQ2hhbmdlc0RlbHRhLmNyZWF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuYWRkKHR1cGxlLmVudHJ5KTtcblx0XHRcdGNoaWxkVHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhcih0dXBsZS5lbnRyeSk7XG5cblx0XHRcdGNvbnN0IGxvY2FsQ2hhbmdlcyA9IHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbdHVwbGUuZW50cnkuaWRdID0gdGhpcy5pdGVtSGFuZGxlci5jb3B5VHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzKFxuXHRcdFx0XHRjaGlsZFRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeUlkXSxcblx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCBuZXdEaXNwbGF5TmFtZSA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXREaXNwbGF5TmFtZShcblx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKG5ld0Rpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMuZGlzcGxheW5hbWUgPSBuZXdEaXNwbGF5TmFtZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMucm9vdEl0ZW0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBsaW5rTm9kZSA9IGxpbmtUcmVlW3RoaXMucm9vdEl0ZW0uaXRlbVR5cGVdW3R1cGxlLmVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdFx0XHRpZiAobGlua05vZGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChsaW5rTm9kZS50eXBlID09PSBBcGlMaW5rVHJlZVR5cGUuSVRFTVRBQkxFKSB7XG5cdFx0XHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcy5pdGVtdHlwZSA9IHRoaXMucm9vdEl0ZW0uaXRlbVR5cGU7XG5cdFx0XHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcy5pdGVtID0gdGhpcy5yb290SXRlbS5pdGVtSWQ7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChsaW5rTm9kZS50eXBlID09PSBBcGlMaW5rVHJlZVR5cGUuRElSRUNUKSB7XG5cdFx0XHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlc1tsaW5rTm9kZS5maWVsZF0gPSB0aGlzLnJvb3RJdGVtLml0ZW1JZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblx0XHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtVHlwZV0gPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaW50ZXJuYWxDaGFuZ2VzRGVsdGEuZGVsZXRlZFtpdGVtVHlwZV0pIHtcblx0XHRcdFx0Ly8gaWYgYW4gaXRlbUVudHJ5IHdhcyBhIGxvY2FsIGVudHJ5IG9uIGEgY2hpbGQgdHJhbnNhY3Rpb24sIGl0J3MgaW1wb3NzaWJsZSB0aGF0IGl0IGlzIG9uIHRoaXMgdHJhbnNhY3Rpb25cblx0XHRcdFx0aWYgKGl0ZW1FbnRyeS5pc0xvY2FsKCkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhcihpdGVtRW50cnkpO1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtVHlwZV0ucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuaGFzQ2hhbmdlcyA9IHRydWU7XG5cblx0XHRyZXR1cm4gdGhpcy5leHBhbmRJdGVtc0Zyb21EZWx0YShpbnRlcm5hbENoYW5nZXNEZWx0YSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXIgPSBuZXcgQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcihcblx0XHRcdFx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRcdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUgPT4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5nZXRBbGxDb2xsZWN0aW9uc0J5SXRlbVR5cGUoaXRlbVR5cGUpLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRjb2xsZWN0aW9uTWF0Y2hlclxuXHRcdFx0XHRcdFx0LnByb2Nlc3NEZWx0YShpbnRlcm5hbENoYW5nZXNEZWx0YSlcblx0XHRcdFx0XHRcdC5yZW1vdmVGcm9tQW5kQWRkVG9Db2xsZWN0aW9ucygpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRcdFx0XHRpZiAoY2hpbGQgPT09IGNoaWxkVHJhbnNhY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNoaWxkLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBpbnRlcm5hbENoYW5nZXNEZWx0YS5pdGVtSWRDb252ZXJzaW9uTWFwO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBhbHJlYWR5IGNhY2hlZCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gYW5kIHRoZSBjaGFuZ2VzIG9mIHRoaXMgc3BlY2lmaWMgdHJhbnNhY3Rpb24gZm9yIHRoYXQgZW50cnlcblx0ICovXG5cdHB1YmxpYyBnZXRMb2NhbEl0ZW1FbnRyeUNoYW5nZXNUdXBsZSAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0KToge1xuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0Y2hhbmdlczogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzXG5cdH0ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZ2V0TG9jYWxJdGVtRW50cnkoaXRlbUVudHJ5SWQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFRyaWVkIHRvIGdldCBhIGxvY2FsIEl0ZW1FbnRyeSB3aXRoIGVudHJ5SWQgJyR7aXRlbUVudHJ5SWR9JyBidXQgY291bGRuJ3QgZmluZCBpdGApO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRlbnRyeTogaXRlbUVudHJ5LFxuXHRcdFx0Y2hhbmdlczogdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF0sXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBJdGVtRW50cnkgZnJvbSB0aGUgY2FjaGUsIGRvZXNuJ3QgZG8gYSBBUEkgcmVxdWVzdCwgdXNlZCBmb3Igc2F2aW5nXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdCk6IEl0ZW1FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmdldEJ5RW50cnlJZChpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBpdGVtRW50cnk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBJdGVtRW50cnkgZnJvbSB0aGUgY2FjaGUgYnkgSXRlbUlkXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUVudHJ5WydpdGVtSWQnXSxcblx0KTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGl0ZW1FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgYW4gQ29sbGVjdGlvbkVudHJ5IGZyb20gdGhlIGNhY2hlLCBkb2Vzbid0IGRvIGEgQVBJIHJlcXVlc3QsIHVzZWQgZm9yIHNhdmluZ1xuXHQgKi9cblx0cHVibGljIGdldExvY2FsQ29sbGVjdGlvbkVudHJ5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogQ29sbGVjdGlvbkVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlFbnRyeUlkKGNvbGxlY3Rpb25FbnRyeUlkKTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0TG9jYWxDb2xsZWN0aW9uRW50cnkoY29sbGVjdGlvbkVudHJ5SWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSB7QGxpbmsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgSW50ZXJuYWxDaGFuZ2VzRGVsdGF9IG9mIHRoZSBUcmFuc2FjdGlvbkNhY2hlLCB0aGlzIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IHRoZSBlbmQgcmVzdWx0IChpbml0aWFsIGlzIGNvbXBhcmVkIHRvIGNoYW5nZXMpLCBzbyBjaGFuZ2luZyBzb21ldGhpbmcgYW5kIHJldmVydGluZyBpdFxuXHQgKiB3b24ndCBiZSBpbmNsdWRlZFxuXHQgKi9cblx0cHVibGljIGdldERlbHRhICgpOiBJbnRlcm5hbENoYW5nZXNEZWx0YSB7XG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdEludGVybmFsRGVsdGEoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlcykge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSB0aGlzLmdldExvY2FsSXRlbUVudHJ5Q2hhbmdlc1R1cGxlKE51bWJlcihpdGVtRW50cnlJZCkpO1xuXG5cdFx0XHQvLyBBbiBpdGVtIGNhbiBiZSB1c2VkIGJ5IGEgMm5kKyBsZXZlbCBjaGlsZCBUcmFuc2FjdGlvbkNhY2hlLCBpdCB3aWxsIGJlIGxvY2FsIHRoYW4gYnV0IGl0IHNob3VsZCBvbmx5IGNvdW50IGFzIGEgY3JlYXRlXG5cdFx0XHQvLyBvbiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBhY3R1YWxseSBjcmVhdGVkIHRoZSBlbnRyeVxuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY29udGFpbnMoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0dHVwbGUuZW50cnkuaXRlbUlkLFxuXHRcdFx0XHQpXG5cdFx0XHRcdCYmIHR1cGxlLmVudHJ5LmlzTG9jYWwoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZChcblx0XHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG5ld1BhcmVudCA9IHRoaXMuZ2V0UGFyZW50KFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChuZXdQYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdFx0Y29uc3Qgb2xkUGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IXRoaXMuaXRlbUVudHJ5U2VydmljZS5tYXRjaFBhcmVudChcblx0XHRcdFx0XHRcdG9sZFBhcmVudCxcblx0XHRcdFx0XHRcdG5ld1BhcmVudCxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtTW92ZWQoXG5cdFx0XHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0XHRcdG5ld1BhcmVudCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChcblx0XHRcdFx0Ly8gaGFzQ2hhbmdlcyBvbmx5IHRha2VzIHdyaXRhYmxlIGNvbHVtbnMgaW50byBhY2NvdW50IGJ5IGRlZmF1bHQsIHNvIGp1c3QgbW92aW5nIHNvbWV0aGluZyBkb2Vzbid0IGNvdW50IGFzIGFuIHVwZGF0ZVxuXHRcdFx0XHQhdGhpcy5hcGlGb3JtYXR0ZXIuaGFzQ2hhbmdlcyhcblx0XHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmluaXRpYWwsXG5cdFx0XHRcdFx0dHVwbGUuY2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0XHRcdHR1cGxlLmVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gdGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXMpIHtcblx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtc0RlbGV0ZWQodGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbVR5cGVdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY2hhbmdlc0RlbHRhO1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2U8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+ICYge2VkaXQ6IHRydWV9LFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdFx0aXNOZXc/OiBib29sZWFuLFxuXHQpOiBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPjtcblxuXHRwdWJsaWMgY3JlYXRlSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZTxSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4gJiB7cmVtb3RlOiB0cnVlfSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHRcdGlzTmV3PzogYm9vbGVhbixcblx0KTogUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT47XG5cblx0cHVibGljIGNyZWF0ZUl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2U8TG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0XHRpc05ldz86IGJvb2xlYW4sXG5cdCk6IExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT47XG5cblx0Ly8gdG9kb1tjYWNoZV0gbW92ZSB0byBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyXG5cdHB1YmxpYyBjcmVhdGVJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdGlzUm9vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGlzTmV3PzogYm9vbGVhbixcblx0KSB7XG5cdFx0aWYgKGlzUm9vdCkge1xuXHRcdFx0dGhpcy5yb290SXRlbSA9IGl0ZW1FbnRyeTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9IHtcblx0XHRcdFx0aW5pdGlhbDogdGhpcy5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KGl0ZW1FbnRyeS5pZCksXG5cdFx0XHRcdGNoYW5nZXM6IHRoaXMuZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShpdGVtRW50cnkuaWQpLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRjb25zdCByZXNvdXJjZSA9IHRoaXMuaXRlbVJlc291cmNlRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0dGhpcyxcblx0XHRcdGlzTmV3LFxuXHRcdCk7XG5cblx0XHR0aGlzLml0ZW1IYW5kbGVyLmFkZFJlc291cmNlKHJlc291cmNlKTtcblxuXHRcdHJldHVybiByZXNvdXJjZTtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVJdGVtUmVzb3VyY2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0KTogQXJyYXk8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjcmVhdGVJdGVtUmVzb3VyY2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtyZW1vdGU6IHRydWV9LFxuXHQpOiBBcnJheTxSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNyZWF0ZUl0ZW1SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHQpOiBBcnJheTxMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY3JlYXRlSXRlbVJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdCk6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgY29uc3RydWN0b3IgPSB0aGlzLml0ZW1SZXNvdXJjZUZhY3RvcnkuZ2V0Q29uc3RydWN0b3I8SXRlbVR5cGVUeXBlPihcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHR0aGlzLFxuXHRcdCk7XG5cblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPSB7XG5cdFx0XHRcdFx0aW5pdGlhbDogdGhpcy5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LmlkLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGNoYW5nZXM6IHRoaXMuZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pZCxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVzb3VyY2UgPSBjb25zdHJ1Y3RvcihpdGVtRW50cnkpO1xuXG5cdFx0XHRyZXN1bHQucHVzaChyZXNvdXJjZSk7XG5cdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmFkZFJlc291cmNlKHJlc291cmNlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIHByb2Nlc3NMaW5rZWRJdGVtczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtlZEVudHJpZXM6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0KTogSXRlbVJlc291cmNlc0l0ZW1UeXBlTWFwPEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgcHJvY2Vzc0xpbmtlZEl0ZW1zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua2VkRW50cmllczogSXRlbVR5cGVNYXA8SXRlbUVudHJ5W10+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdCk6IEl0ZW1SZXNvdXJjZXNJdGVtVHlwZU1hcDxSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIHByb2Nlc3NMaW5rZWRJdGVtczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtlZEVudHJpZXM6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0KTogSXRlbVJlc291cmNlc0l0ZW1UeXBlTWFwPExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBwcm9jZXNzTGlua2VkSXRlbXMgKFxuXHRcdGxpbmtlZEVudHJpZXM6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0KSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXAgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gbGlua2VkRW50cmllcykge1xuXHRcdFx0cmVzdWx0W2l0ZW1UeXBlXSA9IHRoaXMuY3JlYXRlSXRlbVJlc291cmNlcyhcblx0XHRcdFx0bGlua2VkRW50cmllc1tpdGVtVHlwZV0sXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWUsIGVkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0cmVzb3VyY2VPcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWV9LFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0cmVzb3VyY2VPcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cblx0XHRpZiAodGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5LmlkXSA9IFtdO1xuXG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdCgpID0+IFtjb2xsZWN0aW9uRW50cnldLFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgdHJhbnNhY3Rpb25zOiBBYnN0cmFjdENhY2hlW10gPSB0aGlzLmdldFRyYW5zYWN0aW9uQ2hhaW4oKTtcblxuXHRcdFx0Zm9yIChjb25zdCB0cmFuc2FjdGlvbiBvZiB0cmFuc2FjdGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgaXRlbUVudHJpZXMgPSB0cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5lbnRyaWVzLmdldEJ5SXRlbVR5cGUoY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlKTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0XHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkuaWQsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y29sbGVjdGlvbk1hdGNoZXIuZXhwYW5kKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0Y2hhbmdlcyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyLnJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzb3VyY2UgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0cmVzb3VyY2VPcHRpb25zLFxuXHRcdFx0dGhpcyxcblx0XHQpO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uSGFuZGxlci5hZGRSZXNvdXJjZShyZXNvdXJjZSk7XG5cblx0XHRyZXR1cm4gcmVzb3VyY2U7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGNoYW5nZXNPYmplY3Q6IFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGU+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gY2hhbmdlc09iamVjdC5jaGFuZ2VzO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJpZXM6IENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cmVzb3VyY2VPcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge3JlbW90ZUl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWV9LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRjb25zdCByZXN1bHQ6IHtbcGFyZW50SWQ6IHN0cmluZ106IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb2xsZWN0aW9uRW50cmllcykge1xuXHRcdFx0cmVzdWx0W3BhcmVudElkXSA9IHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cmllc1twYXJlbnRJZF0sXG5cdFx0XHRcdHJlc291cmNlT3B0aW9ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBhbGwgcmVxdWlyZWQgY29sdW1ucyB0byBtYXRjaC9maXQgaW4gY29sbGVjdGlvbnNcblx0ICovXG5cdHByaXZhdGUgZXhwYW5kSXRlbXNGcm9tRGVsdGEgKGRlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5W11bXT4ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyaWVzUGVySXRlbVR5cGVNYXA6IHtbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1FbnRyeVtdfSA9IHt9O1xuXHRcdGNvbnN0IGNvbHVtbnNQZXJJdGVtVHlwZU1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogQXBpUmVxdWVzdENvbHVtbnN9ID0ge307XG5cblx0XHRjb25zdCBhZGRFbnRyeSA9XG5cdFx0XHRpdGVtRW50cnkgPT4ge1xuXHRcdFx0XHRpZiAoaXRlbUVudHJpZXNQZXJJdGVtVHlwZU1hcFtpdGVtRW50cnkuaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpdGVtRW50cmllc1Blckl0ZW1UeXBlTWFwW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGl0ZW1FbnRyaWVzUGVySXRlbVR5cGVNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBkZWx0YS5jcmVhdGVkKSB7XG5cdFx0XHRhZGRFbnRyeShkZWx0YS5jcmVhdGVkW2l0ZW1FbnRyeUlkXS5lbnRyeSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBkZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRhZGRFbnRyeShkZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXS5lbnRyeSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpdGVtRW50cmllc1Blckl0ZW1UeXBlTWFwKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY29sbGVjdGlvbkVudHJpZXMpIHtcblx0XHRcdFx0Y29sdW1uRXhwYW5zaW9uLmV4cGFuZChjb2xsZWN0aW9uRW50cnkuY29sdW1ucyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbHVtbnNQZXJJdGVtVHlwZU1hcFtpdGVtVHlwZV0gPSBjb2x1bW5FeHBhbnNpb24uZ2V0KClbaXRlbVR5cGVdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeVtdPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY29sdW1uc1Blckl0ZW1UeXBlTWFwKSB7XG5cdFx0XHRwcm9taXNlcy5wdXNoKFxuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmV4cGFuZExvY2FsSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0ZGVsdGEsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUVudHJpZXNQZXJJdGVtVHlwZU1hcFtpdGVtVHlwZV0sXG5cdFx0XHRcdFx0Y29sdW1uc1Blckl0ZW1UeXBlTWFwW2l0ZW1UeXBlXSxcblx0XHRcdFx0XHR0aGlzLmNvbHVtbkNhY2hlXG5cdFx0XHRcdFx0XHQucmV0cmlldmUoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRjb2x1bW5zUGVySXRlbVR5cGVNYXBbaXRlbVR5cGVdLFxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LmNhY2hlZCxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHByb21pc2VzKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgUXVlcnlNYXRjaGVyRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIENvbGxlY3Rpb25SZXNvdXJjZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hSZXN1bHQsIENvbGxlY3Rpb25RdWVyeSwgRW50cnlQYXJlbnROdWxsLCBGaWVsZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuL2NhY2hlL0Fic3RyYWN0Q2FjaGUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5cbmVudW0gQ09OU1RBTlRTIHtcblx0TUFZQkUgPSAnbWF5YmUnXG59XG5cbnR5cGUgQ29sbGVjdGlvbkVudHJ5TWFwID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRbY29sbGVjdGlvbkVudHJ5SWQ6IG51bWJlcl06IENvbGxlY3Rpb25FbnRyeTxhbnk+XG5cdH1cbn07XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uQ2FjaGUge1xuXHRwcml2YXRlIGVudHJpZXM6IENvbGxlY3Rpb25FbnRyeU1hcCA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0cHJpdmF0ZSB0cmFuc2FjdGlvbjogQWJzdHJhY3RDYWNoZSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgZ2V0QnlFbnRyeUlkIChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogQ29sbGVjdGlvbkVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIHRoaXMuZW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXVtjb2xsZWN0aW9uRW50cnlJZF07XG5cblx0XHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRjb250YWlucyAoY29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZW50cmllc1tjb2xsZWN0aW9uRW50cnkuaWRdICE9PSB1bmRlZmluZWQ7XG5cdH1cblxuXHRzb21lIChjYWxsYmFjazogKGVudHJ5OiBDb2xsZWN0aW9uRW50cnk8YW55PikgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRpZiAoY2FsbGJhY2soZW50cmllc1tpdGVtVHlwZV1bZW50cnlJZF0pKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRmb3JFYWNoIChjYWxsYmFjazogKGVudHJ5OiBDb2xsZWN0aW9uRW50cnk8YW55PikgPT4gdm9pZCk6IHZvaWQge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRjYWxsYmFjayhlbnRyaWVzW2l0ZW1UeXBlXVtlbnRyeUlkXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LypcdGZpbHRlciAoY2FsbGJhY2s6IChlbnRyeTogQ29sbGVjdGlvbkVudHJ5KSA9PiBib29sZWFuKTogdm9pZCB7XG5cdCBjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXHQgY29uc3QgZmlsdGVyZWRFbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlNYXAgID0ge307XG5cblx0IGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHQgZmlsdGVyZWRFbnRyaWVzW2l0ZW1UeXBlXSA9IHt9O1xuXG5cdCBmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0IGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGVudHJpZXNbaXRlbVR5cGVdW2VudHJ5SWRdO1xuXG5cdCBpZiAoY2FsbGJhY2soY29sbGVjdGlvbkVudHJ5KSlcblx0IGZpbHRlcmVkRW50cmllc1tpdGVtVHlwZV1bZW50cnlJZF0gPSBjb2xsZWN0aW9uRW50cnk7XG5cdCB9XG5cdCB9XG5cblx0IHRoaXMuZW50cmllcyA9IGZpbHRlcmVkRW50cmllcztcblx0IH1cblx0ICovXG5cdHRvQXJyYXkgKCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxDb2xsZWN0aW9uRW50cnk8YW55Pj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGVudHJpZXNbaXRlbVR5cGVdW2VudHJ5SWRdKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0YWRkPFQgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk8YW55Pj4gKGNvbGxlY3Rpb25FbnRyeTogVCk6IFQge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGU7XG5cblx0XHRpZiAoZW50cmllc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZW50cmllc1tpdGVtVHlwZV0gPSB7fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZW50cmllc1tpdGVtVHlwZV1bY29sbGVjdGlvbkVudHJ5LmlkXSA9IGNvbGxlY3Rpb25FbnRyeTtcblx0fVxuXG5cdGNsZWFyIChjb2xsZWN0aW9uRW50cnk/OiBDb2xsZWN0aW9uRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5lbnRyaWVzID0ge307XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5jb250YWlucyhjb2xsZWN0aW9uRW50cnkpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlbGV0ZSB0aGlzLmVudHJpZXNbY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlXVtjb2xsZWN0aW9uRW50cnkuaWRdO1xuXHR9XG5cblx0Z2V0QnlJdGVtVHlwZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0cmVzdWx0LnB1c2goZW50cmllc1tlbnRyeUlkXSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdG1hdGNoUGFyZW50IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxhbnk+LFxuXHRcdGl0ZW1UeXBlOiBzdHJpbmcsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCkge1xuXHRcdGNvbnN0IHBhcmVudCA9IGNvbGxlY3Rpb25FbnRyeS5wYXJlbnQ7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gPT0gdG8gY29tcGFyZSBpdGVtSWRzXG5cdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRyZXR1cm4gcGFyZW50Lml0ZW1UeXBlID09PSBpdGVtVHlwZSAmJiBwYXJlbnQuaXRlbUlkID09IGl0ZW1JZDtcblx0fVxuXG5cdC8vIFRPRE86IHRoaW5rIG9mIGJldHRlciBuYW1lXG5cdGdldEJ5UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWQ6IEl0ZW1JZCxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpOiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPiB8IG51bGwge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGlmICh0aGlzLm1hdGNoUGFyZW50KFxuXHRcdFx0XHRlbnRyaWVzW2VudHJ5SWRdLFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRwYXJlbnRJZCxcblx0XHRcdCkpIHtcblx0XHRcdFx0cmV0dXJuIGVudHJpZXNbZW50cnlJZF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRnZXRDb2xsZWN0aW9uc0J5UGFyZW50IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZDogSXRlbUlkLFxuXHQpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PGFueT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBlbnRyaWVzW2l0ZW1UeXBlXVtlbnRyeUlkXTtcblxuXHRcdFx0XHRpZiAodGhpcy5tYXRjaFBhcmVudChcblx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0XHRwYXJlbnRJZCxcblx0XHRcdFx0KSkge1xuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJpZXN9IHdoaWNoIGNvbnRhaW4gdGhlIGl0ZW0gd2l0aCB0aGUgcGFzc2VkIEl0ZW1UeXBlL0l0ZW1JZFxuXHQgKi9cblx0Z2V0QnlDb250YWluaW5nSXRlbTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBlbnRyaWVzW2VudHJ5SWRdO1xuXHRcdFx0Y29uc3QgaXRlbXMgPSB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cblx0XHRcdGlmIChpdGVtcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGl0ZW1zLnNvbWUoXG5cdFx0XHRcdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRcdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5Lml0ZW1JZCA9PSBpdGVtSWQsXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENoZWNrcyBpZiB0aGUgcGFzc2VkIGZpZWxkcyB3b3VsZCBmaXQgaW4gdGhlIGNvbGxlY3Rpb25zIHVzaW5nIHRoZSB7QGxpbmsgUXVlcnlNYXRjaGVyIFF1ZXJ5TWF0Y2hlcn1cblx0ICovXG5cdGdldEJ5Rml0dGluZ0l0ZW08SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGZpZWxkczogRmllbGRNYXAsXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZT4gPSB7XG5cdFx0XHRmaXR0aW5nOiBbXSxcblx0XHRcdG5vdGZpdHRpbmc6IFtdLFxuXHRcdFx0bWF5YmU6IFtdLFxuXHRcdH07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdC8vIGNvbnNvbGUudGltZSgnZ2V0QnlGaXR0aW5nSXRlbScpO1xuXG5cdFx0Y29uc3QgcXVlcnlNYXRjaGVyID0gdGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0ZmllbGRzLFxuXHRcdFx0cGFyZW50LFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tlbnRyeUlkXTtcblx0XHRcdGNvbnN0IG1hdGNoUmVzdWx0ID0gcXVlcnlNYXRjaGVyLm1hdGNoUXVlcnkoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCk7XG5cblx0XHRcdC8vIHRvZG9bY2FjaGVdOiBtYXliZT9cblx0XHRcdGlmIChtYXRjaFJlc3VsdCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRyZXN1bHQuZml0dGluZy5wdXNoKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHR9IGVsc2UgaWYgKG1hdGNoUmVzdWx0ID09PSBDT05TVEFOVFMuTUFZQkUpIHtcblx0XHRcdFx0cmVzdWx0Lm1heWJlLnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdC5ub3RmaXR0aW5nLnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBjb25zb2xlLnRpbWVFbmQoJ2dldEJ5Rml0dGluZ0l0ZW0nKTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQ29sbGVjdGlvblF1ZXJ5LFxuXHQpOiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPiB8IG51bGwge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGVudHJpZXNbZW50cnlJZF07XG5cblx0XHRcdGlmIChjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nID09PSBxdWVyeS5zdHJpbmcpIHtcblx0XHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGdldEJ5S2V5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRlbnRyeUtleTogc3RyaW5nLFxuXHQpOiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBlbnRyaWVzW2VudHJ5SWRdO1xuXG5cdFx0XHRpZiAoY29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMuZW50cnlLZXkgPT09IGVudHJ5S2V5KSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8vIHRvZG9bY2FjaGVdIHJlbW92ZSB0aGlzLCB5b3Ugc2hvdWxkIGdldCBhIG5ldyByZXNvdXJjZS4uLlxuXHQvKipcblx0ICogQGRlcHJlY2F0ZWRcblx0ICovXG5cdHB1YmxpYyBnZXRSZXNvdXJjZUJ5S2V5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRyZXNvdXJjZUtleTogc3RyaW5nLFxuXHQpOiBBcnJheTxDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkIHx8ICEodGhpcy50cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uQ2FjaGUpKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRjb25zdCByZXNvdXJjZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmNvbGxlY3Rpb25SZXNvdXJjZXNbZW50cnlJZF07XG5cblx0XHRcdGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG5cdFx0XHRcdGlmIChyZXNvdXJjZS5vcHRpb25zLnJlc291cmNlS2V5ID09PSByZXNvdXJjZUtleSkge1xuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKHJlc291cmNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cbiIsImltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQgeyBRdWVyeVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFF1ZXJ5UGFyc2VyRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlPcHRpb25zLCBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2UsIENvbGxlY3Rpb25RdWVyeSwgRW50cnlQYXJlbnROdWxsLCBJdGVtSWQsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkVudHJ5U2VydmljZSB7XG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHF1ZXJ5UGFyc2VyRmFjdG9yeTogUXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgcXVlcnlTZXJ2aWNlOiBRdWVyeVNlcnZpY2UsXG5cdCkge1xuXG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlVW5mb3VuZExvY2FsQ29sbGVjdGlvbkVycm9yIChpdGVtVHlwZTogSXRlbVR5cGUpOiB7bWVzc2FnZTogc3RyaW5nfSB7XG5cdFx0cmV0dXJuIHttZXNzYWdlOiBgQSBsb2NhbCBjb2xsZWN0aW9uIG9mIHR5cGUgJHtpdGVtVHlwZX0gY291bGQgbm90IGJlIGZvdW5kYH07XG5cdH1cblxuXHQvLyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSBjb2x1bW5zIHByb3BlcnR5LCBpdCB3aWxsIGJlIHJlcGxhY2VkIGluIHdoZW4gY29sdW1ucyBhcmUgZXhwYW5kZWRcblx0Y2xvbmVPcHRpb25zIChcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsLFxuXHQpIHtcblx0XHRjb25zdCByZXN1bHQgPSBuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKTsgLy8gZG9lcyBhIHNoYWxsb3cgY29weVxuXG5cdFx0cmVzdWx0LnF1ZXJ5UGFyYW1zID0gdGhpcy5jbG9uZVF1ZXJ5UGFyYW1zKG9wdGlvbnMucXVlcnlQYXJhbXMpO1xuXHRcdHJlc3VsdC5wYXJlbnQgPSBwYXJlbnQ7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJvY2Vzc09wdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+KTogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyB7XG5cdFx0cmV0dXJuIG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKG9wdGlvbnMpO1xuXHR9XG5cblx0Y2xvbmVRdWVyeVBhcmFtczxUIGV4dGVuZHMgb2JqZWN0PiAocGFyYW1ldGVyczogVCk6IFQge1xuXHRcdGNvbnN0IHJlc3VsdDogYW55ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGtleSBpbiBwYXJhbWV0ZXJzKSB7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IHBhcmFtZXRlcnNba2V5XTtcblx0XHRcdGxldCBjbG9uZTtcblxuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRcdGNsb25lID0gdmFsdWUuc2xpY2UoKTtcblx0XHRcdH0vLyB3ZSdyZSBvbmx5IHVzaW5nIHByaW1pdGl2ZSBhcnJheXNcblx0XHRcdGVsc2UgaWYgKG1vbWVudC5pc01vbWVudCh2YWx1ZSkpIHtcblx0XHRcdFx0Y2xvbmUgPSB2YWx1ZS5jbG9uZSgpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xvbmUgPSB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0cmVzdWx0W2tleV0gPSBjbG9uZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Y3JlYXRlUXVlcnkgKG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMpOiBDb2xsZWN0aW9uUXVlcnkge1xuXHRcdGNvbnN0IHBhcmVudCA9IG9wdGlvbnMucGFyZW50O1xuXG5cdFx0bGV0IHF1ZXJ5O1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cXVlcnkgPSBvcHRpb25zLnF1ZXJ5O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBsaW5rZWRUb1F1ZXJ5ID0ge1xuXHRcdFx0XHRsaW5rZWRUbzogcGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0XHRxdWVyeToge2lkOiAnJnBhcmVudElkJ30sXG5cdFx0XHR9O1xuXHRcdFx0b3B0aW9ucy5xdWVyeVBhcmFtcy5wYXJlbnRJZCA9IHBhcmVudC5pdGVtSWQ7XG5cblx0XHRcdHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeSA9PT0gbnVsbCA/XG5cdFx0XHRcdGxpbmtlZFRvUXVlcnkgOlxuXHRcdFx0XHR0aGlzLnF1ZXJ5U2VydmljZS5hZGRBbmRDb25kaXRpb24oXG5cdFx0XHRcdFx0b3B0aW9ucy5xdWVyeSxcblx0XHRcdFx0XHRsaW5rZWRUb1F1ZXJ5LFxuXHRcdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBhcnNlZFF1ZXJ5ID0gdGhpcy5xdWVyeVBhcnNlckZhY3Rvcnlcblx0XHRcdC5jb25zdHJ1Y3QoXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRvcHRpb25zLnF1ZXJ5UGFyYW1zLFxuXHRcdFx0KVxuXHRcdFx0LnBhcnNlKCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b2JqZWN0OiBwYXJzZWRRdWVyeVswXSxcblx0XHRcdHN0cmluZzogcGFyc2VkUXVlcnlbMV0sXG5cdFx0fTtcblx0fVxuXG5cdGdldElkQXJyYXkgKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8YW55Pj4sXG5cdFx0YWNjdW11bGF0b3I6IEl0ZW1JZFtdID0gW10sXG5cdCk6IEl0ZW1JZFtdIHtcblx0XHRpZiAoYWNjdW11bGF0b3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YWNjdW11bGF0b3IgPSBbXTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0YWNjdW11bGF0b3IucHVzaChpdGVtRW50cnkuaXRlbUlkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjdW11bGF0b3I7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZpbHRlcnMgYW4gYXJyYXkgb2Yge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gYWNjb3JkaW5nIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cblx0ICogRG9lcyBhbiBpbi1wbGFjZSByZXBsYWNlbWVudCBvZiB0aGUgaXRlbXMgaW4gdGhlIGFycmF5IHRoYXQgZG8gbWF0Y2ggdGhlIGNvbmRpdGlvbiAoa2VlcGluZyB0aGUgYXJyYXkgcmVmZXJlbmNlKVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSB0aGF0IGZhaWxlZCB0aGUgY29uZGl0aW9uXG5cdCAqL1xuXHRmaWx0ZXJBcnJheTxUIGV4dGVuZHMgSXRlbUVudHJ5PGFueT4gPSBJdGVtRW50cnk8YW55Pj4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBUW10sXG5cdFx0Y2FsbGJhY2s6IChpdGVtRW50cnk6IFQpID0+IGJvb2xlYW4sXG5cdCk6IFRbXSB7XG5cdFx0Y29uc3QgZmlsdGVyZWRFbnRyaWVzOiBUW10gPSBbXTtcblx0XHRjb25zdCByZW1vdmVkRW50cmllczogVFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0KGNhbGxiYWNrKGl0ZW1FbnRyeSkgPyBmaWx0ZXJlZEVudHJpZXMgOiByZW1vdmVkRW50cmllcykucHVzaChpdGVtRW50cnkpO1xuXHRcdH1cblxuXHRcdGlmIChyZW1vdmVkRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiByZW1vdmVkRW50cmllcztcblx0XHR9XG5cblx0XHRpdGVtRW50cmllcy5sZW5ndGggPSBmaWx0ZXJlZEVudHJpZXMubGVuZ3RoO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtRW50cmllcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0aXRlbUVudHJpZXNbaV0gPSBmaWx0ZXJlZEVudHJpZXNbaV07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlbW92ZWRFbnRyaWVzO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLCBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlLCBJdGVtUmVzb3VyY2UgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2Uge1xuXG5cdHByb2Nlc3NPcHRpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+XG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnM8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zKG9wdGlvbnMpO1xuXHR9XG5cblx0Z2V0SWRBcnJheSAoaXRlbVJlc291cmNlczogQXJyYXk8SXRlbVJlc291cmNlPGFueT4+KTogSXRlbUlkW10ge1xuXHRcdGNvbnN0IHJlc3VsdDogSXRlbUlkW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1SZXNvdXJjZXMpXG5cdFx0XHRyZXN1bHQucHVzaChpdGVtUmVzb3VyY2UuZW50cnkuaXRlbUlkKTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxufVxuIiwiaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbiwgQXBpUmVxdWVzdENvbHVtbnMsIEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbiwgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtbkNhY2hlIHtcblx0Y2FjaGU6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgPSB7fTtcblx0YWxsQ29sdW1uczoge1tpdGVtVHlwZTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHQpIHtcblx0fVxuXG5cdHNldENvbHVtbiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlc3BvbnNlQ29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0KTogUmVzcG9uc2VDb2x1bW4ge1xuXHRcdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRcdGlmIChjYWNoZVtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y2FjaGVbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0Y29uc3QgZW50cnkgPSBjYWNoZVtpdGVtVHlwZV07XG5cdFx0Y29uc3QgY29sdW1uSWQgPSByZXNwb25zZUNvbHVtbi5pZDtcblxuXHRcdGlmIChlbnRyeVtjb2x1bW5JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZW50cnlbY29sdW1uSWRdID0gcmVzcG9uc2VDb2x1bW47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudHJ5W2NvbHVtbklkXTtcblx0fVxuXG5cdHNldENvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIHtcblx0XHRjb25zdCByZXN1bHQ6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgcmVzcG9uc2VUeXBlIGluIHJlc3BvbnNlQ29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1ucyA9IHJlc3BvbnNlQ29sdW1uc1tyZXNwb25zZVR5cGVdO1xuXG5cdFx0XHRyZXN1bHRbcmVzcG9uc2VUeXBlXSA9IHt9O1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIGNvbHVtbnMpIHtcblx0XHRcdFx0cmVzdWx0W3Jlc3BvbnNlVHlwZV1bY29sdW1uSWRdID0gdGhpcy5zZXRDb2x1bW4oXG5cdFx0XHRcdFx0cmVzcG9uc2VUeXBlLFxuXHRcdFx0XHRcdGNvbHVtbnNbY29sdW1uSWRdLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0dGhpcy5hbGxDb2x1bW5zW2l0ZW1UeXBlXSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHJldHJpZXZlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiB7Y2FjaGVkOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLCBtaXNzaW5nOiBBcGlSZXF1ZXN0Q29sdW1uc30ge1xuXHRcdGlmIChyZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0aWYgKHRoaXMuY29udGFpbnNBbGwoaXRlbVR5cGUpKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0Y2FjaGVkOiB0aGlzLmdldENvbHVtbnMoaXRlbVR5cGUpLFxuXHRcdFx0XHRcdG1pc3Npbmc6IFtdLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRjYWNoZWQ6IHt9LFxuXHRcdFx0XHRtaXNzaW5nOiB0cnVlLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRjb25zdCByZXNwb25zZUFjY3VtdWxhdG9yID0ge307XG5cdFx0Y29uc3QgcmVxdWVzdEFjY3VtdWxhdG9yOiBSZXNwb25zZUNvbHVtbltdID0gW107XG5cblx0XHR0aGlzLnJldHJpZXZlQ29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHRyZXF1ZXN0QWNjdW11bGF0b3IsXG5cdFx0XHRyZXNwb25zZUFjY3VtdWxhdG9yLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0Y2FjaGVkOiByZXNwb25zZUFjY3VtdWxhdG9yLFxuXHRcdFx0bWlzc2luZzogcmVxdWVzdEFjY3VtdWxhdG9yLFxuXHRcdH07XG5cdH1cblxuXHRjb250YWluc0FsbCAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuYWxsQ29sdW1uc1tpdGVtVHlwZV0gPT09IHRydWU7XG5cdH1cblxuXHRnZXRDb2x1bW5zIChpdGVtVHlwZTogSXRlbVR5cGUpOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIHtcblx0XHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cblx0XHRyZXR1cm4ge1tpdGVtVHlwZV06IGNhY2hlW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkID8gW10gOiBjYWNoZVtpdGVtVHlwZV19O1xuXHR9XG5cblx0cHJpdmF0ZSByZXRyaWV2ZUNvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdHJlcXVlc3RBY2N1bXVsYXRvcjogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdHJlc3BvbnNlQWNjdW11bGF0b3I6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IHZvaWQge1xuXHRcdC8vIGFsd2F5cyByZXRyaWV2ZSB0aGUgaWQgY29sdW1uXG5cdFx0dGhpcy5yZXRyaWV2ZUNvbHVtbihcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0J2lkJyxcblx0XHRcdHJlcXVlc3RBY2N1bXVsYXRvcixcblx0XHRcdHJlc3BvbnNlQWNjdW11bGF0b3IsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgcmVxdWVzdENvbHVtbiBvZiByZXF1ZXN0Q29sdW1ucykge1xuXHRcdFx0dGhpcy5yZXRyaWV2ZUNvbHVtbihcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW4sXG5cdFx0XHRcdHJlcXVlc3RBY2N1bXVsYXRvcixcblx0XHRcdFx0cmVzcG9uc2VBY2N1bXVsYXRvcixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSByZXRyaWV2ZUNvbHVtbiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW46IEFwaVJlcXVlc3RDb2x1bW4sXG5cdFx0cmVxdWVzdEFjY3VtdWxhdG9yOiBSZXNwb25zZUNvbHVtbltdLFxuXHRcdHJlc3BvbnNlQWNjdW11bGF0b3I6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1uVXRpbC5wYXJzZVJlcXVlc3RDb2x1bW4ocmVxdWVzdENvbHVtbik7XG5cdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW4gPSB0aGlzLmdldENvbHVtbihcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0Y29sdW1uLmlkLFxuXHRcdCk7XG5cblx0XHRpZiAocmVzcG9uc2VDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVxdWVzdEFjY3VtdWxhdG9yLnB1c2gocmVxdWVzdENvbHVtbik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHJlc3BvbnNlQWNjdW11bGF0b3JbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlc3BvbnNlQWNjdW11bGF0b3JbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0cmVzcG9uc2VBY2N1bXVsYXRvcltpdGVtVHlwZV1bY29sdW1uLmlkXSA9IHJlc3BvbnNlQ29sdW1uO1xuXG5cdFx0aWYgKGNvbHVtbi5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBtaXNzaW5nRGVyaXZlZDogUmVzcG9uc2VDb2x1bW5bXSA9IFtdO1xuXG5cdFx0dGhpcy5yZXRyaWV2ZUNvbHVtbnMoXG5cdFx0XHRyZXNwb25zZUNvbHVtbi5pdGVtVHlwZSxcblx0XHRcdGNvbHVtbi5jaGlsZHJlbixcblx0XHRcdG1pc3NpbmdEZXJpdmVkLFxuXHRcdFx0cmVzcG9uc2VBY2N1bXVsYXRvcixcblx0XHQpO1xuXG5cdFx0aWYgKG1pc3NpbmdEZXJpdmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHJlcXVlc3RBY2N1bXVsYXRvci5wdXNoKHtbY29sdW1uLmlkXTogbWlzc2luZ0Rlcml2ZWR9KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0Q29sdW1uIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0Y29sdW1uSWQ6IHN0cmluZyxcblx0KTogUmVzcG9uc2VDb2x1bW4gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZVtpdGVtVHlwZV07XG5cblx0XHRpZiAoY2FjaGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHJldHVybiBjYWNoZVtjb2x1bW5JZF07XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtbkluZm8sIENvbHVtblNldCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uSW5mb0ZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdENvbHVtbixcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdENvbHVtbkV4cGFuc2lvblJlc3VsdCxcblx0SXRlbVR5cGUsXG5cdFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFJvb3RDb2x1bW5NYXAsXG59IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgZ2V0Rmlyc3RQcm9wZXJ0eSB9IGZyb20gJy4vVXRpbCc7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBIENvbHVtbkV4cGFuc2lvbiBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSB0aGF0IGhhdmUgdGhlIHNhbWUge0BsaW5rIENvbHVtblNldCBDb2x1bW5TZXR9IChtYXRjaGVkIG9uIHtAbGluayBDb2x1bW5TZXQuaWQgQ29sdW1uU2V0LmlkfSkgd2lsbCBhbGwgZ2V0IHRoZSBzYW1lIG5ldyBleHBhbmRlZCBDb2x1bW5TZXRcbiAqL1xuZXhwb3J0IGNsYXNzIENvbHVtbkV4cGFuc2lvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4ge1xuXG5cdGV4cGFuc2lvbk1hcDoge1tjb2x1bW5TZXRJZDogc3RyaW5nXTogQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1UeXBlVHlwZT4gfCBudWxsfSA9IHt9O1xuXHRleHBhbnNpb25NYXBTaXplOiBudW1iZXIgPSAwO1xuXHRyZXF1ZXN0Q29sdW1uc1RydWU6IGJvb2xlYW47XG5cdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW107XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uSW5mb0ZhY3Rvcnk6IENvbHVtbkluZm9GYWN0b3J5LFxuXHRcdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRwdWJsaWMgcmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpIHtcblx0XHRpZiAocmVxdWVzdENvbHVtbnMgPT09IHRydWUpIHtcblx0XHRcdC8vIHJlcXVlc3RDb2x1bW5zIHNob3VsZCBhbHdheXMgYmUgYW4gYXJyYXksIHdoZW4gaXQgaXMgdHJ1ZSBkZXJpdmVkIGNvbHVtbiBpbmZvcm1hdGlvbiB3aWxsIGJlIGxvc3Rcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbnNUcnVlID0gdHJ1ZTtcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbnMgPSBbXTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiByZXNwb25zZUNvbHVtbnNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdHRoaXMucmVxdWVzdENvbHVtbnMucHVzaChjb2x1bW5JZCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbnNUcnVlID0gZmFsc2U7XG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5zID0gcmVxdWVzdENvbHVtbnM7XG5cdFx0fVxuXHR9XG5cblx0cnVuIChjb2x1bW5TZXQ6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+KTogQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1UeXBlVHlwZT4gfCBudWxsIHtcblx0XHRjb25zdCBleHBhbnNpb25NYXAgPSB0aGlzLmV4cGFuc2lvbk1hcDtcblx0XHRjb25zdCBjb2x1bW5TZXRJZCA9IGNvbHVtblNldC5pZDtcblxuXHRcdGlmIChleHBhbnNpb25NYXBbY29sdW1uU2V0SWRdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBleHBhbnNpb25NYXBbY29sdW1uU2V0SWRdO1xuXHRcdH1cblxuXHRcdHRoaXMuZXhwYW5zaW9uTWFwU2l6ZSsrO1xuXG5cdFx0cmV0dXJuIGV4cGFuc2lvbk1hcFtjb2x1bW5TZXRJZF0gPSBjb2x1bW5TZXQuaXNTdXBlcnNldE9mKHRoaXMucmVxdWVzdENvbHVtbnMpID9cblx0XHRcdG51bGwgOlxuXHRcdFx0Y29sdW1uU2V0LmV4cGFuZChcblx0XHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uc1RydWUsXG5cdFx0XHRcdHRoaXMucmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0KTtcblx0fVxuXG5cdGFnZ3JlZ2F0ZVJvb3RDb2x1bW5zICgpOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBleHBhbnNpb25NYXAgPSB0aGlzLmV4cGFuc2lvbk1hcDtcblxuXHRcdGlmICh0aGlzLmV4cGFuc2lvbk1hcFNpemUgPT09IDEpIHtcblx0XHRcdGNvbnN0IGV4cGFuc2lvblJlc3VsdCA9IGV4cGFuc2lvbk1hcFtnZXRGaXJzdFByb3BlcnR5KGV4cGFuc2lvbk1hcCkgYXMgc3RyaW5nXTtcblxuXHRcdFx0cmV0dXJuIGV4cGFuc2lvblJlc3VsdCAhPT0gbnVsbCA/IGV4cGFuc2lvblJlc3VsdC5kaWZmZXJlbmNlLnJvb3QgOiBbXTtcblx0XHR9XG5cblx0XHRjb25zdCByb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtblNldElkIGluIGV4cGFuc2lvbk1hcCkge1xuXHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gZXhwYW5zaW9uTWFwW2NvbHVtblNldElkXTtcblxuXHRcdFx0aWYgKGNvbHVtbkV4cGFuc2lvbiA9PT0gbnVsbCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5leHBhbmRSb290Q29sdW1uTWFwKFxuXHRcdFx0XHRjb2x1bW5FeHBhbnNpb24uZGlmZmVyZW5jZS5yb290LFxuXHRcdFx0XHRyb290Q29sdW1uTWFwLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5JbmZvRmFjdG9yeS5jb25zdHJ1Y3RGcm9tUm9vdE1hcChyb290Q29sdW1uTWFwKTtcblx0fVxuXG5cdHByaXZhdGUgZXhwYW5kUm9vdENvbHVtbk1hcCAoXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+Pixcblx0XHRkZXN0aW5hdGlvbjogUm9vdENvbHVtbk1hcCxcblx0KSB7XG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cblx0XHRcdGlmIChkZXN0aW5hdGlvbltjb2x1bW5JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JZF0gPSB7XG5cdFx0XHRcdFx0YXBpQ29sdW1uOiBjb2x1bW4uYXBpQ29sdW1uLFxuXHRcdFx0XHRcdGNoaWxkcmVuOiB7fSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5leHBhbmRSb290Q29sdW1uTWFwKFxuXHRcdFx0XHRjb2x1bW4uY2hpbGRyZW4sXG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbklkXS5jaGlsZHJlbixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlSZXF1ZXN0U2VydmljZSwgQ29sdW1uQ2FjaGUsIENvbHVtblV0aWwgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSwgUmVzcG9uc2VDb2x1bW4sIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5IYW5kbGVyIHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBjYWNoZTogQ29sdW1uQ2FjaGUsXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHQpIHtcblx0fVxuXG5cdHNldENvbHVtbiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlc3BvbnNlQ29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0KTogUmVzcG9uc2VDb2x1bW4ge1xuXHRcdHJldHVybiB0aGlzLmNhY2hlLnNldENvbHVtbihcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW4sXG5cdFx0KTtcblx0fVxuXG5cdHNldENvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIHtcblx0XHRyZXR1cm4gdGhpcy5jYWNoZS5zZXRDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXHR9XG5cblx0ZmV0Y2hJdGVtVHlwZVRyYW5zbGF0aW9ucyAoaXRlbVR5cGVzOiBJdGVtVHlwZVtdKTogUHJvbWlzZUludGVyZmFjZTx7W2l0ZW1UeXBlOiBzdHJpbmddOiBzdHJpbmd9PiB7XG5cdFx0Y29uc3QgcHJvbWlzZXM6IHtbaXRlbVR5cGU6IHN0cmluZ106IFByb21pc2VJbnRlcmZhY2U8UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcD59ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIG9mIGl0ZW1UeXBlcykge1xuXHRcdFx0cHJvbWlzZXNbaXRlbVR5cGVdID0gdGhpcy5mZXRjaChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFsnaWQnXSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHByb21pc2VzKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRjb25zdCByZXN1bHQ6IHtbaXRlbVR5cGU6IHN0cmluZ106IHN0cmluZ30gPSB7fTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gcmVzcG9uc2UpIHtcblx0XHRcdFx0XHRcdHJlc3VsdFtpdGVtVHlwZV0gPSByZXNwb25zZVtpdGVtVHlwZV1baXRlbVR5cGVdLmlkLm5hbWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHJlcXVlc3QgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRwYXJhbXMgPSB7ZmlsdGVyOiBmYWxzZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcD4ge1xuXHRcdHJldHVybiB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLmNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHtbaXRlbVR5cGVdOiBjb2x1bW5zfSxcblx0XHRcdHBhcmFtcyxcblx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0Y29sdW1uUmVzb3VyY2UgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNhY2hlLnNldENvbHVtbnMoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGNvbHVtbnMsXG5cdFx0XHRcdFx0XHRjb2x1bW5SZXNvdXJjZS5mZXRjaENvbHVtbnNPYmplY3QoKSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0ZmV0Y2ggKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cGFyYW1zPzogYW55LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXA+IHtcblx0XHRjb25zdCBjb2x1bW5SZXNvdXJjZSA9IHRoaXMuY2FjaGUucmV0cmlldmUoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRpZiAoY29sdW1uUmVzb3VyY2UubWlzc2luZyAhPT0gdHJ1ZSAmJiBjb2x1bW5SZXNvdXJjZS5taXNzaW5nLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihjb2x1bW5SZXNvdXJjZS5jYWNoZWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlcXVlc3QoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGNvbHVtblJlc291cmNlLm1pc3NpbmcsXG5cdFx0XHRwYXJhbXMsXG5cdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY29sdW1uVXRpbC5tZXJnZVJlc3BvbnNlQ29sdW1ucyhcblx0XHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHRcdGNvbHVtblJlc291cmNlLmNhY2hlZCxcblx0XHRcdFx0XHQpLm1lcmdlZDtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHRmZXRjaEFsbCAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogUHJvbWlzZUludGVyZmFjZTxSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwPiB7XG5cdFx0aWYgKHRoaXMuY2FjaGUuY29udGFpbnNBbGwoaXRlbVR5cGUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKHRoaXMuY2FjaGUuZ2V0Q29sdW1ucyhpdGVtVHlwZSkpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlcXVlc3QoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHRydWUsXG5cdFx0KTtcblx0fVxufVxuIiwiZXhwb3J0IGNvbnN0IEFMTF9QRVJNSVNTSU9OUyA9ICc3JztcblxuZXhwb3J0IGNvbnN0IENPTFVNTl9TRVBFUkFUT1IgPSAnPic7XG5leHBvcnQgY29uc3QgUkVOREVSX0FTX1NFUEVSQVRPUiA9ICc6JztcblxuZXhwb3J0IGNvbnN0IE5FV19QUkVGSVg6IHN0cmluZyA9ICctMSc7XG5leHBvcnQgY29uc3QgRFVQTElDQVRFX1BSRUZJWDogc3RyaW5nID0gJy0yJztcblxuZXhwb3J0IGNvbnN0IE5FV19LRVlXT1JEOiBzdHJpbmcgPSAnbmV3LSc7XG5leHBvcnQgY29uc3QgRFVQTElDQVRFX0tFWVdPUkQ6IHN0cmluZyA9ICdkdXAtJztcbiIsImltcG9ydCB7IENPTFVNTl9TRVBFUkFUT1IgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4ge1xuXHRpZDogc3RyaW5nO1xuXHRsZXZlbDogbnVtYmVyO1xuXHRwYXRoOiBzdHJpbmc7XG5cdHRhaWxQYXRoOiBzdHJpbmc7XG5cdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUgfCBudWxsID0gbnVsbDtcblx0Y2hpbGRyZW46IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0aXNMZWFmOiBib29sZWFuID0gdHJ1ZTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cmVhZG9ubHkgYXBpQ29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0XHRyZWFkb25seSBwYXJlbnQ6IENvbHVtbkluZm88SXRlbVR5cGU+IHwgbnVsbCA9IG51bGxcblx0KSB7XG5cdFx0Y29uc3QgY29sdW1uSWQgPSBhcGlDb2x1bW4uaWQ7XG5cblx0XHR0aGlzLmlkID0gY29sdW1uSWQ7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHR0aGlzLmxldmVsID0gMDtcblx0XHRcdHRoaXMucGF0aCA9IGNvbHVtbklkO1xuXHRcdFx0dGhpcy50YWlsUGF0aCA9ICcnO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmxldmVsID0gcGFyZW50LmxldmVsICsgMTtcblx0XHRcdHRoaXMucGF0aCA9IHBhcmVudC5wYXRoICsgQ09MVU1OX1NFUEVSQVRPUiArIGNvbHVtbklkO1xuXHRcdFx0dGhpcy50YWlsUGF0aCA9IHBhcmVudC5sZXZlbCA9PT0gMCA/XG5cdFx0XHRcdGNvbHVtbklkIDpcblx0XHRcdFx0cGFyZW50LnRhaWxQYXRoICsgQ09MVU1OX1NFUEVSQVRPUiArIGNvbHVtbklkO1xuXHRcdH1cblx0fVxuXG5cdHNldENoaWxkcmVuIChpdGVtVHlwZTogSXRlbVR5cGVUeXBlLCBjaGlsZHJlbjogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+Pik6IHRoaXMge1xuXHRcdHRoaXMuaXRlbVR5cGUgPSBpdGVtVHlwZTtcblx0XHR0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47XG5cdFx0dGhpcy5pc0xlYWYgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5JbmZvLCBDb2x1bW5VdGlsLCBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvbHVtblNldEZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbnMsIENvbHVtbkV4cGFuc2lvblJlc3VsdCwgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmNvbnN0IGVtcHR5T2JqZWN0ID0ge307XG5sZXQgY3VycmVudElkID0gMDtcblxuZXhwb3J0IGNsYXNzIENvbHVtblNldDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4ge1xuXHRpZCA9ICsrY3VycmVudElkO1xuXG5cdHJlcXVlc3Q6IEFwaVJlcXVlc3RDb2x1bW5zO1xuXHRyZXF1ZXN0Q29sdW1uc1RydWU6IGJvb2xlYW47XG5cdHJlc3BvbnNlOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwID0gZW1wdHlPYmplY3Q7XG5cblx0bGluazogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+IHwgbnVsbCA9IG51bGw7XG5cdG1haW46IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0ZGVyaXZlZDogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRyb290OiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGxlYWY6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0Zm9ybWF0dGVkOiB7bWFpbjogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiwgZGVyaXZlZDogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+Pn0gPSB7XG5cdFx0bWFpbjogW10sXG5cdFx0ZGVyaXZlZDogW10sXG5cdH07XG5cdGZpbHRlcmVkOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGN1c3RvbTogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRzZWFyY2hhYmxlOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGl0ZW06IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0bm90SXRlbTogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJpdmF0ZSBjb2x1bW5TZXRGYWN0b3J5OiBDb2x1bW5TZXRGYWN0b3J5LFxuXHRcdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBncm91cENvbHVtbkluZm8gKGNvbHVtbkluZm86IENvbHVtbkluZm8pOiB2b2lkIHtcblx0XHRjb25zdCBjb2x1bW5VdGlsID0gdGhpcy5jb2x1bW5VdGlsO1xuXHRcdGNvbnN0IHJlc3BvbnNlQ29sdW1uID0gY29sdW1uSW5mby5hcGlDb2x1bW47XG5cdFx0Y29uc3QgaXNEZXJpdmVkID0gY29sdW1uSW5mby5wYXJlbnQgIT09IG51bGw7XG5cblx0XHRpZiAoaXNEZXJpdmVkKSB7XG5cdFx0XHR0aGlzLmRlcml2ZWQucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5tYWluLnB1c2goY29sdW1uSW5mbyk7XG5cblx0XHRcdGlmIChyZXNwb25zZUNvbHVtbi50eXBlID09PSAnbGluaycpIHtcblx0XHRcdFx0dGhpcy5saW5rID0gY29sdW1uSW5mbztcblx0XHRcdH1cblxuXHRcdFx0Ly8gd2UgY291bGQgcG9zc2libHkgYWRkIGRlcml2ZWQgY29sdW1ucyB0byAnbm90SXRlbSdcblx0XHRcdHRoaXNbY29sdW1uVXRpbC5pc0l0ZW1Db2x1bW4ocmVzcG9uc2VDb2x1bW4pID8gJ2l0ZW0nIDogJ25vdEl0ZW0nXS5wdXNoKGNvbHVtbkluZm8pO1xuXG5cdFx0XHRpZiAoIWNvbHVtbkluZm8uaXNMZWFmKSB7XG5cdFx0XHRcdHRoaXMucm9vdC5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5VdGlsLmlzRm9ybWF0dGVkQ29sdW1uKHJlc3BvbnNlQ29sdW1uKSkge1xuXHRcdFx0dGhpcy5mb3JtYXR0ZWRbaXNEZXJpdmVkID8gJ2Rlcml2ZWQnIDogJ21haW4nXS5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5VdGlsLmlzRmlsdGVyZWRDb2x1bW4ocmVzcG9uc2VDb2x1bW4pKSB7XG5cdFx0XHR0aGlzLmZpbHRlcmVkLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtblV0aWwuaXNTZWFyY2hhYmxlQ29sdW1uKHJlc3BvbnNlQ29sdW1uKSkge1xuXHRcdFx0dGhpcy5zZWFyY2hhYmxlLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtblV0aWwuaXNDdXN0b21Db2x1bW4ocmVzcG9uc2VDb2x1bW4pKSB7XG5cdFx0XHR0aGlzLmN1c3RvbS5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5JbmZvLmlzTGVhZikge1xuXHRcdFx0dGhpcy5sZWFmLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXHR9XG5cblx0dG9KU09OICgpIHtcblx0XHRjb25zdCBwYXJzZUNvbHVtbnMgPSAoY29sdW1uczogQ29sdW1uSW5mb1tdKSA9PiBjb2x1bW5zLm1hcChcblx0XHRcdGMgPT4gYy5pZCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bWFpbjogcGFyc2VDb2x1bW5zKHRoaXMubWFpbiksXG5cdFx0XHRkZXJpdmVkOiBwYXJzZUNvbHVtbnModGhpcy5kZXJpdmVkKSxcblx0XHR9O1xuXHR9XG5cblx0ZXhwYW5kUmVxdWVzdENvbHVtbnMgKGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zKTogdm9pZCB7XG5cdFx0Y29uc3QgbWVyZ2VkUmVxdWVzdENvbHVtbnMgPSB0aGlzLmNvbHVtblV0aWwubWVyZ2VSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdHRoaXMucmVxdWVzdCxcblx0XHRcdGNvbHVtbnMsXG5cdFx0KS5tZXJnZWQ7XG5cblx0XHR0aGlzLnJlcXVlc3QgPSBtZXJnZWRSZXF1ZXN0Q29sdW1ucztcblx0XHR0aGlzLnJlcXVlc3RDb2x1bW5zVHJ1ZSA9IG1lcmdlZFJlcXVlc3RDb2x1bW5zID09PSB0cnVlO1xuXHR9XG5cblx0aXNTdXBlcnNldE9mIChjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyk6IGJvb2xlYW4ge1xuXHRcdGlmIChjb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0Q29sdW1uc1RydWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sdW1uVXRpbCA9IHRoaXMuY29sdW1uVXRpbDtcblx0XHRjb25zdCByZXF1ZXN0Q29sdW1ucyA9IHRoaXMucmVxdWVzdDtcblxuXHRcdGlmIChyZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuICFjb2x1bW5VdGlsLmNvbnRhaW5zRGVyaXZlZENvbHVtbnMoY29sdW1ucyk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0aWYgKCFjb2x1bW5VdGlsLmNvbnRhaW5zQ29sdW1uKFxuXHRcdFx0XHRjb2x1bW4sXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRwcml2YXRlIGdldE1lcmdlZENvbHVtblNldCAoXG5cdFx0bWVyZ2VkUmVxdWVzdENvbHVtbnM6IFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdCxcblx0XHRtZXJnZWRSZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0cmVxdWVzdENvbHVtbnNUcnVlOiBib29sZWFuLFxuXHQpOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5jb2x1bW5TZXRGYWN0b3J5LmNvbnN0cnVjdDxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdG1lcmdlZFJlcXVlc3RDb2x1bW5zLm1lcmdlZCxcblx0XHRcdG1lcmdlZFJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmVzdWx0LnJlcXVlc3RDb2x1bW5zVHJ1ZSA9IHRoaXMucmVxdWVzdENvbHVtbnNUcnVlIHx8IHJlcXVlc3RDb2x1bW5zVHJ1ZTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRtZXJnZVJlcXVlc3RDb2x1bW5zIChyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMpOiBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtblV0aWwubWVyZ2VSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdHRoaXMucmVxdWVzdCxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdCk7XG5cdH1cblxuXHRtZXJnZVJlc3BvbnNlQ29sdW1ucyAocmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwKTogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1uVXRpbC5tZXJnZVJlc3BvbnNlQ29sdW1ucyhcblx0XHRcdHRoaXMucmVzcG9uc2UsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0KS5tZXJnZWQ7XG5cdH1cblxuXHRtZXJnZSAoY29sdW1uU2V0OiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPik6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gdGhpcy5nZXRNZXJnZWRDb2x1bW5TZXQoXG5cdFx0XHR0aGlzLm1lcmdlUmVxdWVzdENvbHVtbnMoY29sdW1uU2V0LnJlcXVlc3QpLFxuXHRcdFx0dGhpcy5tZXJnZVJlc3BvbnNlQ29sdW1ucyhjb2x1bW5TZXQucmVzcG9uc2UpLFxuXHRcdFx0Y29sdW1uU2V0LnJlcXVlc3RDb2x1bW5zVHJ1ZSxcblx0XHQpO1xuXHR9XG5cblx0ZXhwYW5kIChcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cmVxdWVzdENvbHVtbnNUcnVlOiBib29sZWFuLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IG1lcmdlZFJlcXVlc3RDb2x1bW5zID0gdGhpcy5tZXJnZVJlcXVlc3RDb2x1bW5zKHJlcXVlc3RDb2x1bW5zKTtcblx0XHRjb25zdCBtZXJnZWRSZXNwb25zZUNvbHVtbnMgPSB0aGlzLm1lcmdlUmVzcG9uc2VDb2x1bW5zKHJlc3BvbnNlQ29sdW1ucyk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVyZ2VkOiB0aGlzLmdldE1lcmdlZENvbHVtblNldChcblx0XHRcdFx0bWVyZ2VkUmVxdWVzdENvbHVtbnMsXG5cdFx0XHRcdG1lcmdlZFJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0cmVxdWVzdENvbHVtbnNUcnVlLFxuXHRcdFx0KSxcblx0XHRcdGRpZmZlcmVuY2U6IHRoaXMuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlPihcblx0XHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdFx0bWVyZ2VkUmVxdWVzdENvbHVtbnMuZGlmZmVyZW5jZSxcblx0XHRcdFx0bWVyZ2VkUmVzcG9uc2VDb2x1bW5zLCAvLyB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gbG9vayB1cCB0aGUgcGFyZW50IG9mIGRlcml2ZWQgY29sdW1uc1xuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0ZmFsc2Vcblx0XHRcdClcblx0XHR9O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5TZXQgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiB7XG5cdHByaXZhdGUgY2FjaGU6IHtbY29sdW1uU2V0SWQ6IG51bWJlcl06IGJvb2xlYW59ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHB1YmxpYyByZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnNcblx0KSB7XG5cblx0fVxuXG5cdHJ1biAoY29sdW1uU2V0OiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblx0XHRjb25zdCBjb2x1bW5TZXRJZCA9IGNvbHVtblNldC5pZDtcblxuXHRcdGlmIChjYWNoZVtjb2x1bW5TZXRJZF0gIT09IHVuZGVmaW5lZClcblx0XHRcdHJldHVybiBjYWNoZVtjb2x1bW5TZXRJZF07XG5cblx0XHRyZXR1cm4gY2FjaGVbY29sdW1uU2V0SWRdID0gY29sdW1uU2V0LmlzU3VwZXJzZXRPZih0aGlzLnJlcXVlc3RDb2x1bW5zKTtcblx0fVxufVxuIiwiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IENPTFVNTl9TRVBFUkFUT1IsIFJFTkRFUl9BU19TRVBFUkFUT1IgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9MaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UnO1xuaW1wb3J0IHtcblx0QXBpTGlua1RyZWVUeXBlLFxuXHRBcGlSZXF1ZXN0Q29sdW1uLFxuXHRBcGlSZXF1ZXN0Q29sdW1ucyxcblx0SXRlbVR5cGUsXG5cdFJlc3BvbnNlQ29sdW1uLFxuXHRSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRSZXNwb25zZUNvbHVtbk1hcCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBleHRlbmQsIGlzRGVmaW5lZCB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdDxUIGV4dGVuZHMgQXBpUmVxdWVzdENvbHVtbnMgPSBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0VSBleHRlbmRzIEFwaVJlcXVlc3RDb2x1bW5zID0gQXBpUmVxdWVzdENvbHVtbnM+ID0ge21lcmdlZDogVCwgZGlmZmVyZW5jZTogVX07XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5VdGlsIHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBsaW5rVHJlZVNlcnZpY2U6IExpbmtUcmVlU2VydmljZUludGVyZmFjZSxcblx0KSB7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENoZWNrcyB0aGUge0BsaW5rIEFwaUxpbmtUcmVlIExpbmtUcmVlfSBhbmQgcmV0dXJucyB0aGUgbGluayBjb2x1bW5JZHMgZm9yIHRoZSBnaXZlbiBJdGVtVHlwZVxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIC0gRm9yIHtAbGluayBBcGlMaW5rVHJlZVR5cGUuRElSRUNUIGRpcmVjdCBsaW5rc30gaXQgd2lsbCBiZSBhIGNvbHVtbklkXG5cdCAqIC0gRm9yIHtAbGluayBBcGlMaW5rVHJlZVR5cGUuSVRFTVRBQkxFIGl0ZW10YWJsZSBsaW5rc30gaXQgd2lsbCBiZSAnaXRlbXR5cGUnIGFuZCAnaXRlbSdcblx0ICovXG5cdHB1YmxpYyBnZXRDb2x1bW5zRnJvbUxpbmsgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0KTogQXBpUmVxdWVzdENvbHVtbltdIHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnRUeXBlXVtpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdHN3aXRjaCAobGlua1RyZWVFbnRyeS50eXBlKSB7XG5cdFx0XHRjYXNlIEFwaUxpbmtUcmVlVHlwZS5ESVJFQ1Q6XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGxpbmtUcmVlRW50cnkuZmllbGQpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgQXBpTGlua1RyZWVUeXBlLklURU1UQUJMRTpcblx0XHRcdFx0cmVzdWx0LnB1c2goJ2l0ZW10eXBlJyk7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKCdpdGVtJyk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRDb2x1bW5QYXRoIChcblx0XHRjb2x1bW5zOiBSZXNwb25zZUNvbHVtbltdLFxuXHRcdHJlbmRlckFzOiBudWxsIHwgc3RyaW5nLFxuXHQpIHtcblx0XHRsZXQgc2VwYXJhdG9yID0gJyc7XG5cdFx0bGV0IHJlc3VsdCA9ICcnO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0cmVzdWx0ICs9IHNlcGFyYXRvciArIGNvbHVtbi5pZDtcblx0XHRcdHNlcGFyYXRvciA9IENPTFVNTl9TRVBFUkFUT1I7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbmRlckFzICE9PSBudWxsKSB7XG5cdFx0XHRyZXN1bHQgKz0gUkVOREVSX0FTX1NFUEVSQVRPUiArIHJlbmRlckFzO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXREYXRlRm9ybWF0T3B0aW9ucyAoY29sdW1uVHlwZT86ICdkYXRldGltZScpIHtcblx0XHRjb25zdCBub3cgPSBtb21lbnQoKTtcblxuXHRcdGNvbnN0IGZvcm1hdHMgPSB7XG5cdFx0XHQnSi1NLVknOiBub3cuZm9ybWF0KCdERC1NTS1ZWVlZJyksXG5cdFx0XHQnSi1NJzogbm93LmZvcm1hdCgnREQtTU0nKSxcblx0XHRcdCdqK0YrWSc6IG5vdy5mb3JtYXQoJ0QgTU1NIFlZWVknKSxcblx0XHRcdCdEK2orRitZJzogbm93LmZvcm1hdCgnZGRkZCBEIE1NTSBZWVlZJyksXG5cdFx0XHQnRic6IG5vdy5mb3JtYXQoJ01NTScpLFxuXHRcdFx0J2YnOiBub3cuZm9ybWF0KCdNTU1NJyksXG5cdFx0XHQnRCc6IG5vdy5mb3JtYXQoJ2RkZGQnKSxcblx0XHRcdCdkJzogbm93LmZvcm1hdCgnZGRkJyksXG5cdFx0fTtcblxuXHRcdGlmIChjb2x1bW5UeXBlID09PSAnZGF0ZXRpbWUnKSB7XG5cdFx0XHRleHRlbmQoXG5cdFx0XHRcdGZvcm1hdHMsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHQnSi1NLVkrSDppJzogbm93LmZvcm1hdCgnREQtTU0tWVlZWSBISDptbScpLFxuXHRcdFx0XHRcdCdKLU0rSDppJzogbm93LmZvcm1hdCgnREQtTU0gSEg6bW0nKSxcblx0XHRcdFx0XHQnaitGK1krSDppJzogbm93LmZvcm1hdCgnREQgTU1NTSBZIEhIOm1tJyksXG5cdFx0XHRcdFx0J0QraitGK1krSDppJzogbm93LmZvcm1hdCgnZGRkZCBERCBNTU0gWSBISDptbScpLFxuXHRcdFx0XHRcdCdIOmknOiBub3cuZm9ybWF0KCdISDptbScpLFxuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZm9ybWF0cztcblx0fVxuXG5cdGlzU3RyaW5nQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZW1haWwnOlxuXHRcdFx0Y2FzZSAncGhvbmUnOlxuXHRcdFx0Y2FzZSAndXJsJzpcblx0XHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0Y2FzZSAnbG9uZ3RleHQnOlxuXHRcdFx0Y2FzZSAndGV4dHJlcGxhY2UnOlxuXHRcdFx0XHQvLyBjYXNlICdodG1sJzogLy8gVE9ETzogc29ydCBvbiBmaWx0ZXJlZCB2YWx1ZVxuXHRcdFx0XHQvLyBjYXNlICdlbnVtJzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aXNGbG9hdENvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RvdWJsZSc6IC8vIGZsb2F0aW5nIHBvaW50IHR5cGVzXG5cdFx0XHRjYXNlICd2b2x1bWUnOlxuXHRcdFx0Y2FzZSAnd2VpZ2h0Jzpcblx0XHRcdGNhc2UgJ2Rpc3RhbmNlJzpcblx0XHRcdGNhc2UgJ2RpbWVuc2lvbic6XG5cdFx0XHRjYXNlICdwb3dlcic6XG5cdFx0XHRjYXNlICdjdXJyZW50Jzpcblx0XHRcdGNhc2UgJ3ByaWNlJzpcblx0XHRcdGNhc2UgJ3BlcmNlbnRhZ2UnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc0ludENvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2ludCc6IC8vIGludGVnZXIgdHlwZXNcblx0XHRcdGNhc2UgJ251bWJlcic6XG5cdFx0XHRjYXNlICdxdWFudGl0eSc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzTnVtYmVyQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuaXNGbG9hdENvbHVtbihjb2x1bW4pIHx8IHRoaXMuaXNJbnRDb2x1bW4oY29sdW1uKTtcblx0fVxuXG5cdGlzQ3VzdG9tQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGNvbHVtbi5maWVsZHR5cGUgPT09ICdjdXN0b21maWVsZCc7XG5cdH1cblxuXHRpc0l0ZW1Db2x1bW4gKFxuXHRcdGNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdFx0aW5jbHVkZUlkID0gdHJ1ZSxcblx0KTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnaWQnOlxuXHRcdFx0XHRyZXR1cm4gaW5jbHVkZUlkO1xuXHRcdFx0Y2FzZSAnaXRlbSc6XG5cdFx0XHRjYXNlICdjaGlsZCc6XG5cdFx0XHRjYXNlICdzaWJsaW5nJzpcblx0XHRcdGNhc2UgJ2xpbmsnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc0RhdGVDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aXNSZW5kZXJlZENvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc0ZpbHRlcmVkQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0Ly8gdWdseSBoYWNrIDotKFxuXHRcdGlmIChjb2x1bW4uaWQgPT09ICdzdGFmZmVsJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtbi5nZW5lcmF0b3IgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAncHJpY2UnOlxuXHRcdFx0Y2FzZSAnYm9vbCc6XG5cdFx0XHRjYXNlICdlbnVtJzpcblx0XHRcdGNhc2UgJ2NvdW50cnknOlxuXHRcdFx0Y2FzZSAndm9sdW1lJzpcblx0XHRcdGNhc2UgJ3dlaWdodCc6XG5cdFx0XHRjYXNlICdkaXN0YW5jZSc6XG5cdFx0XHRjYXNlICdkaW1lbnNpb24nOlxuXHRcdFx0Y2FzZSAncXVhbnRpdHknOlxuXHRcdFx0Y2FzZSAnZW1haWwnOlxuXHRcdFx0Y2FzZSAndXJsJzpcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAndGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRjYXNlICdodG1sJzpcblx0XHRcdGNhc2UgJ3RleHRyZXBsYWNlJzpcblx0XHRcdGNhc2UgJ2xvbmd0ZXh0Jzpcblx0XHRcdGNhc2UgJ3BlcmNlbnRhZ2UnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc0Zvcm1hdHRlZENvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAndGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRjYXNlICdjb2xvcic6XG5cdFx0XHRjYXNlICdqc29uJzpcblx0XHRcdGNhc2UgJ251bWJlcic6XG5cdFx0XHRjYXNlICdmaWxlc2l6ZSc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzU2VsZWN0YWJsZUNvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2Jsb2InOlxuXHRcdFx0Y2FzZSAnY29vcmRpbmF0ZSc6XG5cdFx0XHRjYXNlICdmb3JjZXVwZGF0ZSc6XG5cdFx0XHRjYXNlICdpZCc6XG5cdFx0XHRjYXNlICdqc29uJzpcblx0XHRcdGNhc2UgJ29yZGVyJzpcblx0XHRcdGNhc2UgJ3BhcmVudGlkJzpcblx0XHRcdGNhc2UgJ3BhcmVudHR5cGUnOlxuXHRcdFx0Y2FzZSAncGFzc3dvcmQnOlxuXHRcdFx0Y2FzZSAndG9rZW4nOlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRoYXNMb2NhdGlvblByb3BlcnR5IChcblx0XHRjb2x1bW46IFJlc3BvbnNlQ29sdW1uLFxuXHRcdGxvY2F0aW9uOiBudW1iZXIsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1iaXR3aXNlXG5cdFx0cmV0dXJuIChsb2NhdGlvbiAmIGNvbHVtbi5sb2NhdGlvbikgIT09IDA7XG5cdH1cblxuXHRpc0VkaXRhYmxlQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0aWYgKGNvbHVtbi5yZWFkT25seSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpc1NlYXJjaGFibGVDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdlbWFpbCc6XG5cdFx0XHRjYXNlICdwaG9uZSc6XG5cdFx0XHRjYXNlICd0ZXh0Jzpcblx0XHRcdGNhc2UgJ2xvbmd0ZXh0Jzpcblx0XHRcdGNhc2UgJ2h0bWwnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRnZXREZWZhdWx0V2VpZ2h0IChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogbnVtYmVyIHtcblx0XHQvLyBcdFx0XHRjb25zb2xlLmxvZygnZ2V0RGVmYXVsdFdlaWdodCcsIGNvbHVtbik7XG5cblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdkb3VibGUnOlxuXHRcdFx0Y2FzZSAncHJpY2UnOlxuXHRcdFx0Y2FzZSAnYm9vbCc6XG5cdFx0XHRjYXNlICdpbnQnOlxuXHRcdFx0Y2FzZSAncGVyY2VudGFnZSc6XG5cdFx0XHRjYXNlICdjb2xvcic6XG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0Y2FzZSAncG93ZXInOlxuXHRcdFx0Y2FzZSAnY3VycmVudCc6XG5cdFx0XHRcdHJldHVybiAwLjU7XG5cblx0XHRcdGNhc2UgJ3VybCc6XG5cdFx0XHRjYXNlICdlbnVtJzpcblx0XHRcdGNhc2UgJ2VtYWlsJzpcblx0XHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0Y2FzZSAnaXRlbSc6XG5cdFx0XHRjYXNlICdsaW5rJzpcblx0XHRcdFx0cmV0dXJuIDEuNTtcblxuXHRcdFx0Y2FzZSAnbG9uZ3RleHQnOlxuXHRcdFx0Y2FzZSAnaHRtbCc6XG5cdFx0XHRjYXNlICd0ZXh0cmVwbGFjZSc6XG5cdFx0XHRcdHJldHVybiAyO1xuXG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ3RpbWUnOlxuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdH1cblx0fVxuXG5cdGdldENvbXBhcmF0b3JzIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uICYge3R5cGU6ICdkaW1lbnNpb24nIHwgJ3dlaWdodCcgfCAncHJpY2UnfSk6IFsnPScsICc+JywgJzwnXTtcblx0Z2V0Q29tcGFyYXRvcnMgKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4gJiB7dHlwZTogJ2RhdGUnIHwgJ2RhdGV0aW1lJyB8ICd0aW1lJyB8ICdkdXJhdGlvbid9KTogWyc+JywgJzwnXTtcblx0Z2V0Q29tcGFyYXRvcnMgKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBbJz0nLCAnIT0nXTtcblx0Z2V0Q29tcGFyYXRvcnMgKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdkaW1lbnNpb24nOlxuXHRcdFx0Y2FzZSAnd2VpZ2h0Jzpcblx0XHRcdGNhc2UgJ3ByaWNlJzpcblx0XHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0XHQnPScsXG5cdFx0XHRcdFx0Jz4nLFxuXHRcdFx0XHRcdCc8Jyxcblx0XHRcdFx0XTtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAndGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiBbXG5cdFx0XHRcdFx0Jz4nLFxuXHRcdFx0XHRcdCc8Jyxcblx0XHRcdFx0XTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBbXG5cdFx0XHRcdFx0Jz0nLFxuXHRcdFx0XHRcdCchPScsXG5cdFx0XHRcdF07XG5cdFx0fVxuXHR9XG5cblx0Y29udGFpbnNDb2x1bW4gKFxuXHRcdHJlcXVlc3RDb2x1bW46IEFwaVJlcXVlc3RDb2x1bW4sXG5cdFx0ZGVzdGluYXRpb246IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5wYXJzZVJlcXVlc3RDb2x1bW4ocmVxdWVzdENvbHVtbik7XG5cdFx0Y29uc3QgY29sdW1uSW5kZXggPSB0aGlzLmZpbmRSZXF1ZXN0Q29sdW1uKFxuXHRcdFx0Y29sdW1uLmlkLFxuXHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0KTtcblxuXHRcdGlmIChjb2x1bW5JbmRleCA9PT0gLTEpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBkZXN0aW5hdGlvbltjb2x1bW5JbmRleF0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjaGlsZENvbHVtbiBvZiBjb2x1bW4uY2hpbGRyZW4pIHtcblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdGlmICghdGhpcy5jb250YWluc0NvbHVtbihcblx0XHRcdFx0Y2hpbGRDb2x1bW4sXG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbkluZGV4XVtjb2x1bW4uaWRdLFxuXHRcdFx0KSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRjb250YWluc0Rlcml2ZWRDb2x1bW5zIChyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdKTogYm9vbGVhbiB7XG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgcmVxdWVzdENvbHVtbnMpIHtcblx0XHRcdGlmICh0aGlzLnBhcnNlUmVxdWVzdENvbHVtbihjb2x1bW4pLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmVzcG9uc2VDb2x1bW5zQXZhaWxhYmxlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0XHRyZXNwb25zZUNvbHVtbk1hcDogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogYm9vbGVhbiB7XG5cdFx0Zm9yIChjb25zdCByZXF1ZXN0Q29sdW1uIG9mIHJlcXVlc3RDb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBwYXJzZWRDb2x1bW4gPSB0aGlzLnBhcnNlUmVxdWVzdENvbHVtbihyZXF1ZXN0Q29sdW1uKTtcblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gcGFyc2VkQ29sdW1uLmNoaWxkcmVuO1xuXHRcdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW5zID0gcmVzcG9uc2VDb2x1bW5NYXBbaXRlbVR5cGVdO1xuXHRcdFx0bGV0IHJlc3BvbnNlQ29sdW1uO1xuXG5cdFx0XHRpZiAocmVzcG9uc2VDb2x1bW5zID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXNwb25zZUNvbHVtbiA9IHJlc3BvbnNlQ29sdW1uc1twYXJzZWRDb2x1bW4uaWRdO1xuXG5cdFx0XHRpZiAocmVzcG9uc2VDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChcblx0XHRcdFx0Y2hpbGRyZW4ubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHQhdGhpcy5yZXNwb25zZUNvbHVtbnNBdmFpbGFibGUoXG5cdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdFx0Y2hpbGRyZW4sXG5cdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5NYXAsXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRjb3B5UmVxdWVzdENvbHVtbnMgKGNvbHVtbnM6IHRydWUpOiB0cnVlO1xuXHRjb3B5UmVxdWVzdENvbHVtbnMgKGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSk6IEFwaVJlcXVlc3RDb2x1bW5bXTtcblx0Y29weVJlcXVlc3RDb2x1bW5zIChjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyk6IEFwaVJlcXVlc3RDb2x1bW5zIHtcblx0XHRpZiAoY29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzdWx0OiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdHJlc3VsdC5wdXNoKHRoaXMuY29weVJlcXVlc3RDb2x1bW4oY29sdW1uKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGNvcHlSZXF1ZXN0Q29sdW1uIChyZXF1ZXN0Q29sdW1uOiBBcGlSZXF1ZXN0Q29sdW1uKTogQXBpUmVxdWVzdENvbHVtbiB7XG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5wYXJzZVJlcXVlc3RDb2x1bW4ocmVxdWVzdENvbHVtbik7XG5cblx0XHRpZiAoY29sdW1uLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIGNvbHVtbi5pZDtcblx0XHR9XG5cblx0XHRjb25zdCBjaGlsZHJlbjogQXBpUmVxdWVzdENvbHVtbltdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNoaWxkQ29sdW1uIG9mIGNvbHVtbi5jaGlsZHJlbikge1xuXHRcdFx0Y2hpbGRyZW4ucHVzaCh0aGlzLmNvcHlSZXF1ZXN0Q29sdW1uKGNoaWxkQ29sdW1uKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtbY29sdW1uLmlkXTogY2hpbGRyZW59O1xuXHR9XG5cblx0bWVyZ2VSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0Zmlyc3Q6IHRydWUsXG5cdFx0c2Vjb25kOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0PHRydWUsIFtdPjtcblx0bWVyZ2VSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0Zmlyc3Q6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0XHRzZWNvbmQ6IHRydWUsXG5cdCk6IFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdDx0cnVlLCB0cnVlPjtcblx0bWVyZ2VSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0Zmlyc3Q6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0XHRzZWNvbmQ6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KTpcblx0XHRSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQ8QXBpUmVxdWVzdENvbHVtbltdLCBBcGlSZXF1ZXN0Q29sdW1uW10+O1xuXHRtZXJnZVJlcXVlc3RDb2x1bW5zIChcblx0XHRmaXJzdDogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0c2Vjb25kOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogTWVyZ2VzIHRoZSBwYXNzZWQgY29sdW1ucyBhbmQgcmV0dXJucyB0aGUgbWVyZ2VkIHNldCBhbmQgdGhlIGRpZmZlcmVuY2UuXG5cdCAqXG5cdCAqIEByZXR1cm5zXG5cdCAqIC0gTWVyZ2VkOiBUaGUgbWVyZ2VkIHNldCBvZiBjb2x1bW5zXG5cdCAqIC0gRGlmZmVyZW5jZTogQ29sdW1ucyB0aGF0IGFyZSBpbiBzZWNvbmQsIGJ1dCBub3QgaW4gZmlyc3Rcblx0ICovXG5cdG1lcmdlUmVxdWVzdENvbHVtbnMgKFxuXHRcdGZpcnN0OiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRzZWNvbmQ6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQge1xuXHRcdGlmIChmaXJzdCA9PT0gdHJ1ZSkgLy8gPT09IG9wZXJhdG9yIG5lZWRlZCBoZXJlXG5cdFx0e1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bWVyZ2VkOiB0cnVlLFxuXHRcdFx0XHRkaWZmZXJlbmNlOiBbXSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHNlY29uZCA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bWVyZ2VkOiB0cnVlLFxuXHRcdFx0XHRkaWZmZXJlbmNlOiB0cnVlLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRjb25zdCBtZXJnZWQgPSB0aGlzLmNvcHlSZXF1ZXN0Q29sdW1ucyhmaXJzdCk7XG5cdFx0Y29uc3QgZGlmZmVyZW5jZTogQXBpUmVxdWVzdENvbHVtbltdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBzZWNvbmQpIHtcblx0XHRcdGNvbnN0IGFkZGVkQ29sdW1uID0gdGhpcy5tZXJnZVJlcXVlc3RDb2x1bW4oXG5cdFx0XHRcdGNvbHVtbixcblx0XHRcdFx0bWVyZ2VkLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGFkZGVkQ29sdW1uICE9PSBudWxsKSB7XG5cdFx0XHRcdGRpZmZlcmVuY2UucHVzaChhZGRlZENvbHVtbik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lcmdlZDogbWVyZ2VkLFxuXHRcdFx0ZGlmZmVyZW5jZTogZGlmZmVyZW5jZSxcblx0XHR9O1xuXHR9XG5cblx0bWVyZ2VSZXF1ZXN0Q29sdW1uIChcblx0XHRyZXF1ZXN0Q29sdW1uOiBBcGlSZXF1ZXN0Q29sdW1uLFxuXHRcdGRlc3RpbmF0aW9uOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdCkge1xuXHRcdGNvbnN0IGNvbHVtbiA9IHRoaXMucGFyc2VSZXF1ZXN0Q29sdW1uKHJlcXVlc3RDb2x1bW4pO1xuXHRcdGNvbnN0IGNvbHVtbkluZGV4ID0gdGhpcy5maW5kUmVxdWVzdENvbHVtbihcblx0XHRcdGNvbHVtbi5pZCxcblx0XHRcdGRlc3RpbmF0aW9uLFxuXHRcdCk7XG5cblx0XHRpZiAoY29sdW1uSW5kZXggPT09IC0xKSB7XG5cdFx0XHRkZXN0aW5hdGlvbi5wdXNoKHJlcXVlc3RDb2x1bW4pO1xuXHRcdFx0cmV0dXJuIHJlcXVlc3RDb2x1bW47XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtbi5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgZGVzdGluYXRpb25bY29sdW1uSW5kZXhdID09PSAnc3RyaW5nJykge1xuXHRcdFx0ZGVzdGluYXRpb25bY29sdW1uSW5kZXhdID0ge1xuXHRcdFx0XHRbY29sdW1uLmlkXTogW10sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IGFkZGVkQ29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMgPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY2hpbGRDb2x1bW4gb2YgY29sdW1uLmNoaWxkcmVuKSB7XG5cdFx0XHRjb25zdCBhZGRlZENvbHVtbiA9IHRoaXMubWVyZ2VSZXF1ZXN0Q29sdW1uKFxuXHRcdFx0XHRjaGlsZENvbHVtbixcblx0XHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JbmRleF1bY29sdW1uLmlkXSxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChhZGRlZENvbHVtbiAhPT0gbnVsbCkge1xuXHRcdFx0XHRhZGRlZENvbHVtbnMucHVzaChhZGRlZENvbHVtbik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGFkZGVkQ29sdW1ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdHJldHVybiB7W2NvbHVtbi5pZF06IGFkZGVkQ29sdW1uc307XG5cdH1cblxuXHRnZXRSZXF1ZXN0Q29sdW1uSWQgKHJlcXVlc3RDb2x1bW46IEFwaVJlcXVlc3RDb2x1bW4pOiBzdHJpbmcge1xuXHRcdGlmICh0eXBlb2YgcmVxdWVzdENvbHVtbiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiByZXF1ZXN0Q29sdW1uO1xuXHRcdH1cblxuXHRcdGxldCBjb2x1bW5JZDtcblxuXHRcdGZvciAoY29sdW1uSWQgaW4gcmVxdWVzdENvbHVtbikge1xuXHRcdH1cblxuXHRcdHJldHVybiBjb2x1bW5JZCBhcyBzdHJpbmc7XG5cdH1cblxuXHRwYXJzZVJlcXVlc3RDb2x1bW4gKHJlcXVlc3RDb2x1bW46IEFwaVJlcXVlc3RDb2x1bW4pOiB7aWQ6IHN0cmluZywgY2hpbGRyZW46IEFwaVJlcXVlc3RDb2x1bW5bXX0ge1xuXHRcdGlmICh0eXBlb2YgcmVxdWVzdENvbHVtbiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGlkOiByZXF1ZXN0Q29sdW1uLFxuXHRcdFx0XHRjaGlsZHJlbjogW10sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGxldCBjb2x1bW5JZDtcblxuXHRcdGZvciAoY29sdW1uSWQgaW4gcmVxdWVzdENvbHVtbikge1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRpZDogY29sdW1uSWQgYXMgc3RyaW5nLFxuXHRcdFx0Y2hpbGRyZW46IHJlcXVlc3RDb2x1bW5bY29sdW1uSWQgYXMgc3RyaW5nXSxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBNZXJnZXMgdHdvIHNldHMgb2Yge0BsaW5rIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcHN9LlxuXHQgKlxuXHQgKiBAcmV0dXJuc1xuXHQgKiAtIE1lcmdlZDogVGhlIG1lcmdlZCBzZXQgb2YgY29sdW1uc1xuXHQgKiAtIERpZmZlcmVuY2U6IENvbHVtbnMgdGhhdCBhcmUgaW4gc2Vjb25kLCBidXQgbm90IGluIGZpcnN0XG5cdCAqL1xuXHRtZXJnZVJlc3BvbnNlQ29sdW1ucyAoXG5cdFx0Zmlyc3Q6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0c2Vjb25kOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiB7bWVyZ2VkOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLCBkaWZmZXJlbmNlOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwfSB7XG5cdFx0Y29uc3QgbWVyZ2VkOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwID0ge307XG5cdFx0Y29uc3QgZGlmZmVyZW5jZTogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBmaXJzdCkge1xuXHRcdFx0aWYgKHNlY29uZFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRtZXJnZWRbaXRlbVR5cGVdID0gZmlyc3RbaXRlbVR5cGVdO1xuXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBtZXJnZVJlc3VsdCA9IHRoaXMubWVyZ2VSZXNwb25zZUNvbHVtbk1hcChcblx0XHRcdFx0Zmlyc3RbaXRlbVR5cGVdLFxuXHRcdFx0XHRzZWNvbmRbaXRlbVR5cGVdLFxuXHRcdFx0KTtcblxuXHRcdFx0bWVyZ2VkW2l0ZW1UeXBlXSA9IG1lcmdlUmVzdWx0Lm1lcmdlZDtcblx0XHRcdGRpZmZlcmVuY2VbaXRlbVR5cGVdID0gbWVyZ2VSZXN1bHQuZGlmZmVyZW5jZTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIHNlY29uZCkge1xuXHRcdFx0aWYgKGZpcnN0W2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG1lcmdlZFtpdGVtVHlwZV0gPSBzZWNvbmRbaXRlbVR5cGVdO1xuXHRcdFx0XHRkaWZmZXJlbmNlW2l0ZW1UeXBlXSA9IHNlY29uZFtpdGVtVHlwZV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lcmdlZDogbWVyZ2VkLFxuXHRcdFx0ZGlmZmVyZW5jZTogZGlmZmVyZW5jZSxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBNZXJnZXMgdHdvIHNldHMgb2Yge0BsaW5rIFJlc3BvbnNlQ29sdW1uTWFwIHJlc3BvbnNlIGNvbHVtbnN9LlxuXHQgKlxuXHQgKiBAcmV0dXJuc1xuXHQgKiAtIE1lcmdlZDogVGhlIG1lcmdlZCBzZXQgb2YgY29sdW1uc1xuXHQgKiAtIERpZmZlcmVuY2U6IENvbHVtbnMgdGhhdCBhcmUgaW4gc2Vjb25kLCBidXQgbm90IGluIGZpcnN0XG5cdCAqL1xuXHRtZXJnZVJlc3BvbnNlQ29sdW1uTWFwIChcblx0XHRmaXJzdDogUmVzcG9uc2VDb2x1bW5NYXAsXG5cdFx0c2Vjb25kOiBSZXNwb25zZUNvbHVtbk1hcCxcblx0KToge21lcmdlZDogUmVzcG9uc2VDb2x1bW5NYXAsIGRpZmZlcmVuY2U6IFJlc3BvbnNlQ29sdW1uTWFwfSB7XG5cdFx0Y29uc3QgbWVyZ2VkOiBSZXNwb25zZUNvbHVtbk1hcCA9IHt9O1xuXHRcdGNvbnN0IGRpZmZlcmVuY2U6IFJlc3BvbnNlQ29sdW1uTWFwID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIGZpcnN0KSB7XG5cdFx0XHRtZXJnZWRbY29sdW1uSWRdID0gZmlyc3RbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gc2Vjb25kKSB7XG5cdFx0XHRpZiAoaXNEZWZpbmVkKGZpcnN0W2NvbHVtbklkXSkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdG1lcmdlZFtjb2x1bW5JZF0gPSBzZWNvbmRbY29sdW1uSWRdO1xuXHRcdFx0ZGlmZmVyZW5jZVtjb2x1bW5JZF0gPSBzZWNvbmRbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRtZXJnZWQ6IG1lcmdlZCxcblx0XHRcdGRpZmZlcmVuY2U6IGRpZmZlcmVuY2UsXG5cdFx0fTtcblx0fVxuXG5cdGlzTG9jYWxDb2x1bW5JZCAoY29sdW1uSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBjb2x1bW5JZC5zdWJzdHJpbmcoXG5cdFx0XHQwLFxuXHRcdFx0Mixcblx0XHQpID09PSAnX18nO1xuXHR9XG5cblx0cHJvY2Vzc0NvbmZpZ0NvbHVtbnMgKGNvbmZpZ0NvbHVtbnM6IHN0cmluZ1tdKTogQXBpUmVxdWVzdENvbHVtbltdIHtcblx0XHRjb25zdCByZXF1ZXN0OiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbmZpZ0NvbHVtbnMpIHtcblx0XHRcdGlmICh0aGlzLmlzTG9jYWxDb2x1bW5JZChjb2x1bW4pKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnByb2Nlc3NDb25maWdDb2x1bW4oXG5cdFx0XHRcdHRoaXMucGFyc2VDb25maWdDb2x1bW4oY29sdW1uKSxcblx0XHRcdFx0cmVxdWVzdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlcXVlc3Q7XG5cdH1cblxuXHRwYXJzZUNvbmZpZ0NvbHVtbiAoY29uZmlnQ29sdW1uOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIGNvbmZpZ0NvbHVtbi5zcGxpdChSRU5ERVJfQVNfU0VQRVJBVE9SKVswXS5zcGxpdChDT0xVTU5fU0VQRVJBVE9SKTtcblx0fVxuXG5cdHByb2Nlc3NDb25maWdDb2x1bW4gKFxuXHRcdHBhcnNlZENvbmZpZ0NvbHVtbjogc3RyaW5nW10sXG5cdFx0ZGVzdGluYXRpb246IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KSB7XG5cdFx0Y29uc3QgY29sdW1uSWQgPSBwYXJzZWRDb25maWdDb2x1bW5bMF07XG5cdFx0Y29uc3QgaXNMZWFmID0gcGFyc2VkQ29uZmlnQ29sdW1uLmxlbmd0aCA9PT0gMTtcblx0XHRsZXQgY29sdW1uSW5kZXggPSB0aGlzLmZpbmRSZXF1ZXN0Q29sdW1uKFxuXHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRkZXN0aW5hdGlvbixcblx0XHQpO1xuXG5cdFx0aWYgKGlzTGVhZikge1xuXHRcdFx0aWYgKGNvbHVtbkluZGV4ID09PSAtMSkge1xuXHRcdFx0XHRkZXN0aW5hdGlvbi5wdXNoKGNvbHVtbklkKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5JbmRleCA9PT0gLTEpIHtcblx0XHRcdGNvbHVtbkluZGV4ID0gZGVzdGluYXRpb24ucHVzaCh7W2NvbHVtbklkXTogW119KSAtIDE7XG5cdFx0fSBlbHNlIGlmICh0eXBlb2YgZGVzdGluYXRpb25bY29sdW1uSW5kZXhdID09PSAnc3RyaW5nJykge1xuXHRcdFx0ZGVzdGluYXRpb25bY29sdW1uSW5kZXhdID0ge1tjb2x1bW5JZF06IFtdfTtcblx0XHR9XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0dGhpcy5wcm9jZXNzQ29uZmlnQ29sdW1uKFxuXHRcdFx0cGFyc2VkQ29uZmlnQ29sdW1uLnNsaWNlKDEpLFxuXHRcdFx0ZGVzdGluYXRpb25bY29sdW1uSW5kZXhdW2NvbHVtbklkXSxcblx0XHQpO1xuXHR9XG5cblx0ZmluZFJlcXVlc3RDb2x1bW4gKFxuXHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KTogbnVtYmVyIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHJlcXVlc3RDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBjb2x1bW4gPSByZXF1ZXN0Q29sdW1uc1tpXTtcblxuXHRcdFx0aWYgKHRoaXMuZ2V0UmVxdWVzdENvbHVtbklkKGNvbHVtbikgPT09IGNvbHVtbklkKSB7XG5cdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAtMTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpRm9ybWF0dGVyLCBDcmVhdGVDb21waWxhdGlvbiwgS2V5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ3JlYXRlUmVxdWVzdEVudHJ5LCBJdGVtSWQsIEl0ZW1NYXAsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBJbnRlcm5hbENyZWF0ZURlbHRhIH0gZnJvbSAnLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5cbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVxdWVzdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4ge1xuXG5cdHJlcXVlc3RzOiBBcnJheTxDcmVhdGVSZXF1ZXN0RW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb21waWxhdGlvbjogQ3JlYXRlQ29tcGlsYXRpb24sXG5cdFx0cHJpdmF0ZSB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRwcml2YXRlIGJyZWFrdXBCeVBhcmVudCA9IGZhbHNlLFxuXHQpIHtcblx0fVxuXG5cdGZpbmFsaXplUmVxdWVzdCAocmVxdWVzdFJlc291cmNlOiBDcmVhdGVSZXF1ZXN0RW50cnk8SXRlbVR5cGVUeXBlPikge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzID0gcmVxdWVzdFJlc291cmNlLmNvbGxlY3Rpb25zLmdldENvbGxlY3Rpb25zV2l0aEZpdHRpbmdJdGVtcygpO1xuXHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHJlcXVlc3RSZXNvdXJjZS5jb2x1bW5zO1xuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY29sbGVjdGlvbkVudHJpZXMpIHtcblx0XHRcdGNvbHVtbkV4cGFuc2lvbi5leHBhbmQoY29sbGVjdGlvbkVudHJ5LmNvbHVtbnMpO1xuXHRcdH1cblxuXHRcdHJlcXVlc3RSZXNvdXJjZS5yZXF1ZXN0LmNvbHVtbnMgPSBjb2x1bW5FeHBhbnNpb24uZ2V0KCk7XG5cblx0XHRyZXR1cm4gcmVxdWVzdFJlc291cmNlO1xuXHR9XG5cblx0c2V0UmVxdWVzdFBhcmVudCAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cmVxdWVzdEVudHJ5OiBDcmVhdGVSZXF1ZXN0RW50cnk8SXRlbVR5cGVUeXBlPixcblx0KSB7XG5cdFx0Y29uc3QgcmVxdWVzdCA9IHJlcXVlc3RFbnRyeS5yZXF1ZXN0O1xuXG5cdFx0aWYgKHBhcmVudFR5cGUgPT09ICdWb2lkJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJlcXVlc3QucGFyZW50VHlwZSA9IHBhcmVudFR5cGU7XG5cdFx0cmVxdWVzdC5wYXJlbnRJZCA9IHt9O1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRwdWJsaWMgcnVuICgpIHtcblx0XHRjb25zdCBjb21waWxhdGlvbiA9IHRoaXMuY29tcGlsYXRpb247XG5cblx0XHRpZiAodGhpcy5icmVha3VwQnlQYXJlbnQpIHtcblx0XHRcdGZvciAoY29uc3QgcGFyZW50VHlwZSBpbiBjb21waWxhdGlvbikge1xuXHRcdFx0XHRjb25zdCBwYXJlbnRNYXAgPSBjb21waWxhdGlvbltwYXJlbnRUeXBlXTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IHBhcmVudElkIGluIHBhcmVudE1hcCkge1xuXHRcdFx0XHRcdGlmICh0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKHBhcmVudElkKSkge1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgcmVxdWVzdFJlc291cmNlID0gdGhpcy5pbml0aWFsaXplUmVxdWVzdCgpO1xuXG5cdFx0XHRcdFx0dGhpcy5leHRlbmRSZXF1ZXN0KFxuXHRcdFx0XHRcdFx0cGFyZW50TWFwW3BhcmVudElkXSxcblx0XHRcdFx0XHRcdHRoaXMuc2V0UmVxdWVzdFBhcmVudChcblx0XHRcdFx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0XHRcdFx0cmVxdWVzdFJlc291cmNlLFxuXHRcdFx0XHRcdFx0KSA/ICtwYXJlbnRJZCA6IG51bGwsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0UmVzb3VyY2UsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdHRoaXMucmVxdWVzdHMucHVzaCh0aGlzLmZpbmFsaXplUmVxdWVzdChyZXF1ZXN0UmVzb3VyY2UpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKGNvbnN0IHBhcmVudFR5cGUgaW4gY29tcGlsYXRpb24pIHtcblx0XHRcdFx0Y29uc3QgcGFyZW50TWFwID0gY29tcGlsYXRpb25bcGFyZW50VHlwZV07XG5cdFx0XHRcdGNvbnN0IHJlcXVlc3RSZXNvdXJjZSA9IHRoaXMuaW5pdGlhbGl6ZVJlcXVlc3QoKTtcblx0XHRcdFx0Y29uc3QgaGFzUGFyZW50ID0gdGhpcy5zZXRSZXF1ZXN0UGFyZW50KFxuXHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0cmVxdWVzdFJlc291cmNlLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGxldCB2YWxpZFJlcXVlc3QgPSBmYWxzZTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IHBhcmVudElkIGluIHBhcmVudE1hcCkge1xuXHRcdFx0XHRcdGlmICh0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKHBhcmVudElkKSkge1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5leHRlbmRSZXF1ZXN0KFxuXHRcdFx0XHRcdFx0cGFyZW50TWFwW3BhcmVudElkXSxcblx0XHRcdFx0XHRcdGhhc1BhcmVudCA/ICtwYXJlbnRJZCA6IG51bGwsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0UmVzb3VyY2UsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdHZhbGlkUmVxdWVzdCA9IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAodmFsaWRSZXF1ZXN0KSB7XG5cdFx0XHRcdFx0dGhpcy5yZXF1ZXN0cy5wdXNoKHRoaXMuZmluYWxpemVSZXF1ZXN0KHJlcXVlc3RSZXNvdXJjZSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdHM7XG5cdH1cblxuXHRpbml0aWFsaXplUmVxdWVzdCAoKTogQ3JlYXRlUmVxdWVzdEVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB7XG5cdFx0XHRyZXF1ZXN0OiB7XG5cdFx0XHRcdHJlcXVlc3RUeXBlOiAnY3JlYXRlJyxcblx0XHRcdFx0aXRlbXM6IHt9LFxuXHRcdFx0XHRjb2x1bW5zOiB7fSxcblx0XHRcdH0sXG5cdFx0XHRjb2x1bW5zOiB0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdCgpLFxuXHRcdFx0aXRlbXM6IHt9LFxuXHRcdFx0Y29sbGVjdGlvbnM6IHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuZ2V0Q29sbGVjdGlvbk1hdGNoZXIoKSxcblx0XHR9O1xuXHR9XG5cblx0cHJpdmF0ZSBleHRlbmRSZXF1ZXN0IChcblx0XHRpdGVtVmFsdWVzOiBJdGVtTWFwPEludGVybmFsQ3JlYXRlRGVsdGE+LFxuXHRcdHJlcXVlc3RQYXJlbnRJZDogSXRlbUlkIHwgbnVsbCxcblx0XHRkZXN0aW5hdGlvbjogQ3JlYXRlUmVxdWVzdEVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdCkge1xuXHRcdGNvbnN0IHJlcXVlc3QgPSBkZXN0aW5hdGlvbi5yZXF1ZXN0O1xuXHRcdGNvbnN0IGl0ZW1FbnRyeU1hcCA9IGRlc3RpbmF0aW9uLml0ZW1zO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpdGVtVmFsdWVzKSB7XG5cdFx0XHRpZiAocmVxdWVzdC5pdGVtVHlwZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJlcXVlc3QuaXRlbVR5cGUgPSBpdGVtVHlwZSBhcyBJdGVtVHlwZVR5cGU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpdGVtRW50cnlNYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aXRlbUVudHJ5TWFwW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdFx0XHRyZXF1ZXN0Lml0ZW1zW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBpdGVtVmFsdWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRjb25zdCBpbnRlcm5hbENyZWF0ZURlbHRhOiBJbnRlcm5hbENyZWF0ZURlbHRhID0gaXRlbVZhbHVlc1tpdGVtVHlwZV1baXRlbUlkXTtcblx0XHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gaW50ZXJuYWxDcmVhdGVEZWx0YS5lbnRyeTtcblxuXHRcdFx0XHRjb25zdCBjaGlsZEVudHJpZXMgPSBnZXRQYXRoKFxuXHRcdFx0XHRcdHRoaXMuY29tcGlsYXRpb24sXG5cdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGNvbnN0IGl0ZW1SZXF1ZXN0OiBhbnkgPSByZXF1ZXN0Lml0ZW1zW2l0ZW1UeXBlXVtpdGVtRW50cnkuaXRlbUlkXSA9IHt9O1xuXHRcdFx0XHRjb25zdCBwYXJhbWV0ZXJzID0gZ2V0UGF0aChcblx0XHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLnRhYlJlcXVlc3RQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1JZCxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmIChyZXF1ZXN0UGFyZW50SWQgIT09IG51bGwpIHtcblx0XHRcdFx0XHQocmVxdWVzdC5wYXJlbnRJZCBhcyB7W2l0ZW1JZDogc3RyaW5nXTogSXRlbUlkfSlbaXRlbUVudHJ5Lml0ZW1JZF0gPSByZXF1ZXN0UGFyZW50SWQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZXN0aW5hdGlvbi5jb2x1bW5zLmV4cGFuZChpdGVtRW50cnkuY29sdW1ucyk7XG5cblx0XHRcdFx0Ly8gdG9kb1tjYWNoZV0gbmVlZCB0aGlzID9cblx0XHRcdFx0Ly8gZGVzdGluYXRpb24uY29sbGVjdGlvbnMuZXhwYW5kKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0aXRlbUVudHJ5TWFwW2l0ZW1UeXBlXVtpdGVtSWRdID0gaXRlbUVudHJ5O1xuXG5cdFx0XHRcdGl0ZW1SZXF1ZXN0LnZhbHVlcyA9IHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlcXVlc3RMb2NhbChcblx0XHRcdFx0XHRpbnRlcm5hbENyZWF0ZURlbHRhLmZpZWxkcyxcblx0XHRcdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGl0ZW1SZXF1ZXN0LnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuXG5cdFx0XHRcdGlmIChjaGlsZEVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgbGlua3M6IHtbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1JZFtdfSA9IGl0ZW1SZXF1ZXN0LmxpbmtzID0ge307XG5cblx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZFR5cGUgaW4gY2hpbGRFbnRyaWVzKSB7XG5cdFx0XHRcdFx0bGlua3NbY2hpbGRUeXBlXSA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZElkIGluIGNoaWxkRW50cmllc1tjaGlsZFR5cGVdKSB7XG5cdFx0XHRcdFx0XHRsaW5rc1tjaGlsZFR5cGVdLnB1c2gocGFyc2VJbnQoXG5cdFx0XHRcdFx0XHRcdGNoaWxkSWQsXG5cdFx0XHRcdFx0XHRcdDEwLFxuXHRcdFx0XHRcdFx0KSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5leHRlbmRSZXF1ZXN0KFxuXHRcdFx0XHRcdGNoaWxkRW50cmllcyxcblx0XHRcdFx0XHRudWxsLFxuXHRcdFx0XHRcdGRlc3RpbmF0aW9uLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpUXVlcnksIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0Rmlyc3RQcm9wZXJ0eSB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBlbnVtIE9QRVJBVE9SUyB7XG5cdE9SID0gJ09SJyxcblx0QU5EID0gJ0FORCdcbn1cblxuZXhwb3J0IHR5cGUgT1BFUkFUT1JTX1RZUEUgPSAnT1InIHwgJ0FORCcgfCAnb3InIHwgJ2FuZCcgfCBPUEVSQVRPUlM7XG5cbmV4cG9ydCBlbnVtIENPTVBBUkFUT1JTIHtcblx0RVFVQUxTID0gJz0nLFxuXHROT1RfRVFVQUxTID0gJyE9Jyxcblx0TEVTU19USEFOID0gJzwnLFxuXHRNT1JFX1RIQU4gPSAnPicsXG5cdExFU1NfT1JfRVFVQUxfVEhBTiA9ICc8PScsXG5cdEVRVUFMX09SX01PUkVfVEhBTiA9ICc+PScsXG5cdElOID0gJ0lOJ1xufVxuXG5leHBvcnQgdHlwZSBDT01QQVJBVE9SU19UWVBFID0gJz0nIHwgJyE9JyB8ICc8JyB8ICc+JyB8ICc8PScgfCAnPj0nIHwgJ0lOJyB8IENPTVBBUkFUT1JTO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUXVlcnlQYXJzZXJCYXNlPFJldHVyblR5cGUgZXh0ZW5kcyBhbnk+IHtcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdHByb3RlY3RlZCBxdWVyeTogQXBpUXVlcnksXG5cdCkge1xuXHR9XG5cblx0cHVibGljIHBhcnNlIChxdWVyeTogQXBpUXVlcnkgPSB0aGlzLnF1ZXJ5KTogUmV0dXJuVHlwZSB7XG5cdFx0aWYgKHF1ZXJ5LmxpbmtlZFRvICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlTGlua2VkVG9RdWVyeShcblx0XHRcdFx0cXVlcnkubGlua2VkVG8sXG5cdFx0XHRcdHF1ZXJ5LnF1ZXJ5LFxuXHRcdFx0XHRxdWVyeS5yZXZlcnNlLFxuXHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5jdXN0b20gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2VDdXN0b21RdWVyeShcblx0XHRcdFx0cXVlcnkuY3VzdG9tLFxuXHRcdFx0XHRxdWVyeS5wYXJhbWV0ZXJzLFxuXHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5zZWFyY2ggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2VTZWFyY2hRdWVyeShcblx0XHRcdFx0cXVlcnkuc2VhcmNoLFxuXHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5jb25kaXRpb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlQ29tcGxleFF1ZXJ5KFxuXHRcdFx0XHRxdWVyeS5jb25kaXRpb25zLFxuXHRcdFx0XHRxdWVyeS5vcGVyYXRvcixcblx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkuaXRlbVR5cGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2VTdWJGaWVsZFF1ZXJ5KFxuXHRcdFx0XHRxdWVyeS5rZXksXG5cdFx0XHRcdHF1ZXJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRxdWVyeS5maWVsZCxcblx0XHRcdFx0cXVlcnkucXVlcnksXG5cdFx0XHRcdHF1ZXJ5Lm5vdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5LmtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAodHlwZW9mIHF1ZXJ5LnF1ZXJ5ID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5wYXJzZVN1YlF1ZXJ5KFxuXHRcdFx0XHRcdHF1ZXJ5LmtleSxcblx0XHRcdFx0XHRxdWVyeS5xdWVyeSxcblx0XHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLnBhcnNlU2ltcGxlUXVlcnkoXG5cdFx0XHRcdHF1ZXJ5LmtleSxcblx0XHRcdFx0cXVlcnkudmFsdWUsXG5cdFx0XHRcdHF1ZXJ5LmNvbXBhcmF0b3IsXG5cdFx0XHRcdHF1ZXJ5Lm5vdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qga2V5ID0gZ2V0Rmlyc3RQcm9wZXJ0eShxdWVyeSk7XG5cblx0XHRpZiAoa2V5ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZUVtcHR5UXVlcnkoKTtcblx0XHR9XG5cblx0XHRjb25zdCB2YWx1ZSA9IHF1ZXJ5W2tleV07XG5cblx0XHQvLyB0eXBlb2YgbnVsbCBpcyBhbiBvYmplY3QgOnRoaW5raW5nOlxuXHRcdGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlU3ViUXVlcnkoXG5cdFx0XHRcdGtleSxcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJzZVNpbXBsZVF1ZXJ5KFxuXHRcdFx0a2V5LFxuXHRcdFx0dmFsdWUsXG5cdFx0XHRxdWVyeS5jb21wYXJhdG9yLFxuXHRcdFx0cXVlcnkubm90LFxuXHRcdCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VFbXB0eVF1ZXJ5ICgpOiBSZXR1cm5UeXBlO1xuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZVN1YlF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRzdWJRdWVyeTogb2JqZWN0LFxuXHRcdG5vdDogYm9vbGVhbixcblx0KTogUmV0dXJuVHlwZTtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VTdWJGaWVsZFF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0ZmllbGQ6IHN0cmluZyxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0bm90OiBib29sZWFuLFxuXHQpOiBSZXR1cm5UeXBlO1xuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZVNlYXJjaFF1ZXJ5IChcblx0XHR2YWx1ZTogYW55LFxuXHRcdG5vdDogYm9vbGVhbixcblx0KTogUmV0dXJuVHlwZTtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VDdXN0b21RdWVyeSAoXG5cdFx0Y3VzdG9tOiBzdHJpbmcsXG5cdFx0cGFyYW1ldGVyczogYW55LFxuXHRcdG5vdDogYm9vbGVhbixcblx0KTogUmV0dXJuVHlwZTtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VTaW1wbGVRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0dmFsdWU6IGFueSxcblx0XHRjb21wYXJhdG9yOiBDT01QQVJBVE9SU19UWVBFLFxuXHRcdG5vdD86IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlTGlua2VkVG9RdWVyeSAoXG5cdFx0bGlua2VkVG86IGFueSxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0cmV2ZXJzZTogYm9vbGVhbixcblx0XHRub3Q6IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlQ29tcGxleFF1ZXJ5IChcblx0XHRjb25kaXRpb25zOiBhbnlbXSxcblx0XHRvcGVyYXRvcjogT1BFUkFUT1JTX1RZUEUsXG5cdFx0bm90OiBib29sZWFuLFxuXHQpOiBSZXR1cm5UeXBlO1xufVxuIiwiaW1wb3J0IHsgQXBpUXVlcnksIEFwaVJlcXVlc3RDb2x1bW4sIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4vQ29sdW1uVXRpbCc7XG5pbXBvcnQgeyBDT01QQVJBVE9SU19UWVBFIH0gZnJvbSAnLi9RdWVyeVBhcnNlcic7XG5pbXBvcnQgeyBPUEVSQVRPUlNfVFlQRSwgUXVlcnlQYXJzZXJCYXNlIH0gZnJvbSAnLi9RdWVyeVBhcnNlckJhc2UnO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlDb2x1bW5FeHRyYWN0b3Jcblx0ZXh0ZW5kcyBRdWVyeVBhcnNlckJhc2U8QXBpUmVxdWVzdENvbHVtbltdPiB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwcml2YXRlIGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdCkge1xuXHRcdHN1cGVyKHF1ZXJ5KTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUVtcHR5UXVlcnkgKCkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZVN1YlF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRzdWJRdWVyeTogb2JqZWN0LFxuXHRcdF9ub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KSB7XG5cdFx0cmV0dXJuIFt7W2tleV06IHRoaXMucGFyc2Uoc3ViUXVlcnkpfV07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTdWJGaWVsZFF1ZXJ5IChcblx0XHRfa2V5OiBzdHJpbmcsXG5cdFx0X2l0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRfZmllbGQ6IHN0cmluZyxcblx0XHRfcXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdF9ub3Q6IGJvb2xlYW4sXG5cdCkge1xuXHRcdHJldHVybiBbXTtcblx0XHQvLyB0b2RvW2NhY2hlXSBXZSBzaG91bGQgZXhwYW5kIHRoZSByZXF1ZXN0Q29sdW1ucyB3aXRoIHtbaXRlbVR5cGVdOiB0aGlzLnBhcnNlKHF1ZXJ5KX0gYnV0IGN1cnJlbnRseSBjb2xsZWN0aW9ucyBvbmx5IGFsbG93IGZldGNoaW5nIGRpcmVjdCBjb2x1bW5zXG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTZWFyY2hRdWVyeSAoXG5cdFx0X3ZhbHVlOiBhbnksXG5cdFx0X25vdDogYm9vbGVhbixcblx0KSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlQ3VzdG9tUXVlcnkgKFxuXHRcdF9jdXN0b206IHN0cmluZyxcblx0XHRfcGFyYW1ldGVyczogYW55LFxuXHRcdF9ub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU2ltcGxlUXVlcnkgKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdF92YWx1ZTogYW55LFxuXHRcdF9jb21wYXJhdG9yPzogQ09NUEFSQVRPUlNfVFlQRSxcblx0XHRfbm90PzogYm9vbGVhbixcblx0KSB7XG5cdFx0cmV0dXJuIFtrZXldO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlTGlua2VkVG9RdWVyeSAoXG5cdFx0bGlua2VkVG86IGFueSxcblx0XHRfcXVlcnk6IEFwaVF1ZXJ5ID0ge30gYXMgQXBpUXVlcnksXG5cdFx0X3JldmVyc2U6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRfbm90OiBib29sZWFuID0gZmFsc2UsXG5cdCkge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtblV0aWwuZ2V0Q29sdW1uc0Zyb21MaW5rKFxuXHRcdFx0bGlua2VkVG8sXG5cdFx0XHR0aGlzLml0ZW1UeXBlLFxuXHRcdCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VDb21wbGV4UXVlcnkgKFxuXHRcdGNvbmRpdGlvbnM6IGFueVtdLFxuXHRcdF9vcGVyYXRvcj86IE9QRVJBVE9SU19UWVBFLFxuXHRcdF9ub3Q/OiBib29sZWFuLFxuXHQpIHtcblx0XHRyZXR1cm4gdGhpcy5wYXJzZUNvbmRpdGlvbnMoY29uZGl0aW9ucyk7XG5cdH1cblxuXHRwcml2YXRlIHBhcnNlQ29uZGl0aW9ucyAoY29uZGl0aW9uczogYW55W10pIHtcblx0XHRyZXR1cm4gY29uZGl0aW9ucy5yZWR1Y2UoXG5cdFx0XHQoXG5cdFx0XHRcdGFjY3VtdWxhdG9yLFxuXHRcdFx0XHRjb25kaXRpb24sXG5cdFx0XHQpID0+IGFjY3VtdWxhdG9yLmNvbmNhdChcblx0XHRcdFx0dGhpcy5wYXJzZShjb25kaXRpb24pLFxuXHRcdFx0KSxcblx0XHRcdFtdLFxuXHRcdCk7XG5cdH1cblxufVxuIiwiaW1wb3J0IHsgQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSwgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgfSBmcm9tICcuLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBDb2xsZWN0aW9uRW50cnlPcHRpb25zLCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpUXVlcnksXG5cdEFwaVJlcXVlc3RDb2x1bW4sXG5cdENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcCxcblx0SXRlbUlkLFxuXHRJdGVtVHlwZSxcblx0UHJvbWlzZUludGVyZmFjZSxcblx0UXVlcnlDYWxsYmFjayxcbn0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkNhY2hlIH0gZnJvbSAnLi4vQ29sbGVjdGlvbkNhY2hlJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UgfSBmcm9tICcuLi9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25NYXRjaGVyIH0gZnJvbSAnLi4vQ29sbGVjdGlvbk1hdGNoZXInO1xuaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4uL0NvbHVtblV0aWwnO1xuaW1wb3J0IHsgUXVlcnlDb2x1bW5FeHRyYWN0b3IgfSBmcm9tICcuLi9RdWVyeUNvbHVtbkV4dHJhY3Rvcic7XG5pbXBvcnQgeyBpbkFycmF5IH0gZnJvbSAnLi4vVXRpbCc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi9BYnN0cmFjdENhY2hlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25IYW5kbGVyQmFzZSB7XG5cblx0cHVibGljIGVudHJpZXM6IENvbGxlY3Rpb25DYWNoZTtcblxuXHRwdWJsaWMgY29sbGVjdGlvbkNoYW5nZXM6IHtcblx0XHRbY29sbGVjdGlvbkVudHJ5SWQ6IG51bWJlcl06IEl0ZW1FbnRyeVtdXG5cdH0gPSB7fTtcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByb3RlY3RlZCByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeTogQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCkge1xuXHRcdHRoaXMuZW50cmllcyA9IGNvbGxlY3Rpb25DYWNoZUZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJ5fSBhbmQgc3RvcmVzIGl0IGluIHRoaXMgdHJhbnNhY3Rpb24ncyB7QGxpbmsgQ29sbGVjdGlvbkNhY2hlIENvbGxlY3Rpb25DYWNoZX1cblx0ICovXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLnRyYW5zYWN0aW9uLmNvcmUuY29sbGVjdGlvbkVudHJ5RmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0KTtcblxuXHRcdHRoaXMuZW50cmllcy5hZGQoY29sbGVjdGlvbkVudHJ5KTtcblxuXHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENyZWF0ZXMgYSB7QGxpbmsgQ29sbGVjdGlvbk1hdGNoZXIgQ29sbGVjdGlvbk1hdGNoZXJ9IHdpdGggdGhlIHRyYW5zYWN0aW9uJ3MgY29sbGVjdGlvbnNcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRDb2xsZWN0aW9uTWF0Y2hlciAoKTogQ29sbGVjdGlvbk1hdGNoZXI7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGEge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9IHdpdGggdGhlIGdpdmVuIG9wdGlvbnNcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBmZXRjaENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGNvbGxlY3Rpb25zIGxpbmtlZCB0byB0aGUgcGFzc2VkIHBhcmVudHNcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBmZXRjaExpbmtlZENvbGxlY3Rpb25FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWRBcnJheTogSXRlbUlkW10gfCAoKCkgPT4gSXRlbUlkW10pLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+PjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEV4cGFuZHMgdGhlIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9ucyB3aXRoIHRoZSBwYXNzZWQgY29sdW1uc1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGV4cGFuZENvbGxlY3Rpb25FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRjb2xsZWN0aW9uczogQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXAsXG5cdFx0bmV3Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEV4dGVuZHMgdGhlIGNvbGxlY3Rpb25zJyB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5LnF1ZXJ5UGFyYW1zIHF1ZXJ5UGFyYW1zfSBhbmQge0BsaW5rIENvbGxlY3Rpb25FbnRyeS5xdWVyeSBxdWVyaWVzfSBhbmQgZmV0Y2hlcyB0aGUge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gd2l0aCB0aGUgbmV3IHF1ZXJpZXNcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBleHRlbmRDb2xsZWN0aW9uRW50cmllczxUIGV4dGVuZHMgQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0XHRxdWVyeUNhbGxiYWNrOiBRdWVyeUNhbGxiYWNrLFxuXHRcdGNvbGxlY3Rpb25zOiBULFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQWRkcyB0aGUgcGFzc2VkIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IHRvIHRoZSBjb2xsZWN0aW9uJ3MgY2hhbmdlcyBvbiB0aGUgdHJhbnNhY3Rpb24sXG5cdCAqIHdpbGwgc2tpcCB0aGUgSXRlbUVudHJ5IGlmIHRoZSBgc2tpcEVudHJ5RmlsdGVyRm5gIGNhbGxiYWNrIHJldHVybnMgYHRydWVgXG5cdCAqL1xuXHRwcm90ZWN0ZWQgX2FkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlczxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHRcdHNraXBFbnRyeUZpbHRlckZuOiAodGVtRW50cnk6IEl0ZW1FbnRyeSkgPT4gYm9vbGVhbixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuLFxuXHQpOiB2b2lkIHtcblx0XHRpZiAoaXRlbUVudHJpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5LmlkXTtcblxuXHRcdGlmIChjaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBhZGRlZEl0ZW1FbnRyaWVzOiBJdGVtRW50cnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGlmIChcblx0XHRcdFx0Y2hhbmdlcy5pbmRleE9mKGl0ZW1FbnRyeSkgIT09IC0xXG5cdFx0XHRcdHx8IHNraXBFbnRyeUZpbHRlckZuKGl0ZW1FbnRyeSlcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y2hhbmdlcy5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHRhZGRlZEl0ZW1FbnRyaWVzLnB1c2goaXRlbUVudHJ5KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5oYW5kbGVBZGRlZEl0ZW1FbnRyaWVzQ2FsbGJhY2soXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRhZGRlZEl0ZW1FbnRyaWVzLFxuXHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IGhhbmRsZUFkZGVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGFkZGVkRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuLFxuXHQpOiB2b2lkO1xuXG5cdHB1YmxpYyByZW1vdmVJdGVtRW50cmllc0Zyb21Db2xsZWN0aW9uQ2hhbmdlcyAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnksXG5cdFx0aWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHQpIHtcblx0XHRpZiAoaWRBcnJheS5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaWRdO1xuXG5cdFx0aWYgKGNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlbW92ZWRJdGVtRW50cmllcyA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5maWx0ZXJBcnJheShcblx0XHRcdGNoYW5nZXMsXG5cdFx0XHRpdGVtRW50cnkgPT4gIWluQXJyYXkoXG5cdFx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRcdGlkQXJyYXksXG5cdFx0XHQpLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5oYW5kbGVSZW1vdmVkSXRlbUVudHJpZXNDYWxsYmFjayhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdHJlbW92ZWRJdGVtRW50cmllcyxcblx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0KTtcblx0fVxuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBoYW5kbGVSZW1vdmVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdHJlbW92ZWRJdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuLFxuXHQpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRXhwYW5kcyB0aGUgb3B0aW9uJ3Mge0BsaW5rIENvbGxlY3Rpb25FbnRyeU9wdGlvbnMuY29sdW1ucyBjb2x1bW5zfSB3aXRoIHRoZSBjb2x1bW5zIHJlcXVpcmVkIGZvciB0aGUge0BsaW5rIENvbGxlY3Rpb25NYXRjaGVyIENvbGxlY3Rpb25NYXRjaGVyfSB0byBmdW5jdGlvbi5cblx0ICogRGF0YSBmZXRjaGVkIGZvciBhIHBhcmVudCB0cmFuc2FjdGlvbiBtaWdodCBhbHNvIGZpdCBpbiBhIGNoaWxkIHRyYW5zYWN0aW9uLCBzbyB0aG9zZSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucy5xdWVyeUNvbHVtbnMgcXVlcnlDb2x1bW5zfSBzaG91bGQgYWxzbyBiZSB0YWtlbiBpbnRvIGFjY291bnRcblx0ICovXG5cdHByb3RlY3RlZCBleHBhbmRDb2x1bW5zV2l0aFF1ZXJ5Q29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb2x1bW5FeHRyYWN0b3IgPSBuZXcgUXVlcnlDb2x1bW5FeHRyYWN0b3IoXG5cdFx0XHR0aGlzLmNvbHVtblV0aWwsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHF1ZXJ5LFxuXHRcdCk7XG5cblx0XHRvcHRpb25zLnF1ZXJ5Q29sdW1ucyA9IGNvbHVtbkV4dHJhY3Rvci5wYXJzZSgpO1xuXG5cdFx0Ly8gYWxyZWFkeSBoYXZlIGFsbCBjb2x1bW5zLCBzbyBjYW4ndCBleHBhbmQgdGhlbVxuXHRcdGlmIChvcHRpb25zLmNvbHVtbnMgPT09IHRydWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLnF1ZXJ5Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0b3B0aW9ucy5jb2x1bW5zID0gcmVxdWVzdENvbHVtbkV4cGFuc2lvbi5nZXQoKVtpdGVtVHlwZV07XG5cdH1cbn1cbiIsImltcG9ydCB7XG5cdENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Q29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcbn0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRBcGlSZXF1ZXN0U2VydmljZSxcblx0QXBpUmVzcG9uc2VQcm9jZXNzb3IsXG5cdENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdENvbGxlY3Rpb25NYXRjaGVyLFxuXHRDb2xsZWN0aW9uUXVlcnksXG5cdENvbHVtblN1YnNldENhY2hlLFxuXHRDb2x1bW5VdGlsLFxuXHRpc0Z1bmN0aW9uLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxufSBmcm9tICcuLi8uLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIEl0ZW1FbnRyeSB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRBcGlSZXF1ZXN0Q29sdW1uLFxuXHRDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcCxcblx0Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXAsXG5cdEl0ZW1JZCxcblx0SXRlbVR5cGUsXG5cdFF1ZXJ5Q2FsbGJhY2ssXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsIFF1ZXJ5U2VydmljZSB9IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IFJlcXVlc3RCdWZmZXJNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vUmVxdWVzdEJ1ZmZlck1hbmFnZXInO1xuXG5pbXBvcnQgeyBoYXNQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vVXRpbCc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uSGFuZGxlckJhc2UgfSBmcm9tICcuLi9Db2xsZWN0aW9uSGFuZGxlckJhc2UnO1xuaW1wb3J0IHsgU2VydmVyQ2FjaGUgfSBmcm9tICcuL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IFNlcnZlckl0ZW1IYW5kbGVyIH0gZnJvbSAnLi9TZXJ2ZXJJdGVtSGFuZGxlcic7XG5cbmV4cG9ydCBjbGFzcyBTZXJ2ZXJDb2xsZWN0aW9uSGFuZGxlclxuXHRleHRlbmRzIENvbGxlY3Rpb25IYW5kbGVyQmFzZSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5OiBDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSByZXF1ZXN0QnVmZmVyTWFuYWdlcjogUmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uRXhwYW5zaW9uRmFjdG9yeTogQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgaXRlbUhhbmRsZXI6IFNlcnZlckl0ZW1IYW5kbGVyLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcXVlcnlTZXJ2aWNlOiBRdWVyeVNlcnZpY2UsXG5cdFx0Y29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IFNlcnZlckNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uTWF0Y2hlciAoKTogQ29sbGVjdGlvbk1hdGNoZXIge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLFxuXHRcdFx0aXRlbVR5cGUgPT4gdGhpcy5lbnRyaWVzLmdldEJ5SXRlbVR5cGUoaXRlbVR5cGUpLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShvcHRpb25zKTtcblxuXHRcdHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRwYXJzZWRRdWVyeS5vYmplY3QsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0PEl0ZW1UeXBlVHlwZT4ob3B0aW9ucy5jb2x1bW5zKTtcblxuXHRcdHJldHVybiB0aGlzLmZldGNoQ29sbGVjdGlvbkRhdGEoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdHBhcnNlZFF1ZXJ5LFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hMaW5rZWRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkQXJyYXk6IEl0ZW1JZFtdIHwgKCgpID0+IEl0ZW1JZFtdKSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IHByb21pc2VzOiB7W3BhcmVudElkOiBzdHJpbmddOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeT59ID0ge307XG5cblx0XHRpZiAoaXNGdW5jdGlvbjwoKSA9PiBJdGVtSWRbXT4ocGFyZW50SWRBcnJheSkpIHtcblx0XHRcdHBhcmVudElkQXJyYXkgPSBwYXJlbnRJZEFycmF5KCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBvZiBwYXJlbnRJZEFycmF5KSB7XG5cdFx0XHRjb25zdCBuZXdPcHRpb25zID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNsb25lT3B0aW9ucyhcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGl0ZW1UeXBlOiBwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZDogcGFyZW50SWQsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkobmV3T3B0aW9ucyk7XG5cblx0XHRcdHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRuZXdPcHRpb25zLFxuXHRcdFx0XHRwYXJzZWRRdWVyeS5vYmplY3QsXG5cdFx0XHQpO1xuXG5cdFx0XHQvLyB0b2RvW2NhY2hlXSBzaG91bGQgdGhpcyBiZSBpbiBhIGxvb3A/IGV4cGFuZENvbHVtbnNXaXRoUXVlcnlDb2x1bW5zIGNhbiBjaGFuZ2UgdGhlIGNvbHVtbnNcblx0XHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG5ld09wdGlvbnMuY29sdW1ucyk7XG5cblx0XHRcdHByb21pc2VzW3BhcmVudElkXSA9IHRoaXMuZmV0Y2hDb2xsZWN0aW9uRGF0YShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHRuZXdPcHRpb25zLFxuXHRcdFx0XHRwYXJzZWRRdWVyeSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHByb21pc2VzKTtcblx0fVxuXG5cdHB1YmxpYyBleHRlbmRDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRxdWVyeUNhbGxiYWNrOiBRdWVyeUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVR5cGU+IHtcblx0XHRjb25zdCBleHRlbmRlZFF1ZXJ5ID0gY29sbGVjdGlvbkVudHJ5LmV4dGVuZFF1ZXJ5KHF1ZXJ5Q2FsbGJhY2spLm9iamVjdDtcblx0XHRjb25zdCBmdWxsUXVlcnkgPSB0aGlzLnF1ZXJ5U2VydmljZS5hZGRBbmRDb25kaXRpb24oXG5cdFx0XHRleHRlbmRlZFF1ZXJ5LFxuXHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuY3JlYXRlTm90SW4oXG5cdFx0XHRcdHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5LmlkXS5tYXAoXG5cdFx0XHRcdFx0aXRlbUVudHJ5ID0+IGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRcdCksXG5cdFx0XHQpLFxuXHRcdCk7XG5cblx0XHR0aGlzLmV4cGFuZENvbHVtbnNXaXRoUXVlcnlDb2x1bW5zKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMsXG5cdFx0XHRleHRlbmRlZFF1ZXJ5LFxuXHRcdCk7XG5cblx0XHRsZXQgcHJvbWlzZTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5saW1pdCAhPT0gbnVsbCkge1xuXHRcdFx0cHJvbWlzZSA9IHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UucmVxdWVzdFNrZWxldG9uKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cmVxdWVzdFR5cGU6ICdxdWVyeScsXG5cdFx0XHRcdFx0aXRlbVR5cGU6IGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRjb2x1bW5zOiB7W2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV06IGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmNvbHVtbnN9LFxuXHRcdFx0XHRcdHF1ZXJ5OiBleHRlbmRlZFF1ZXJ5LFxuXHRcdFx0XHRcdGxpbWl0OiBjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5saW1pdCxcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlRdWVyeShcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRmdWxsUXVlcnksXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmNvbHVtbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbGxlY3Rpb25FbnRyeS5wcm9taXNlID0gcHJvbWlzZTtcblxuXHRcdHByb21pc2UudGhlbihcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0ZGVsZXRlIGNvbGxlY3Rpb25FbnRyeS5wcm9taXNlO1xuXHRcdFx0fSxcblx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHByb21pc2UudGhlbihcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHRcdH0sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0Y29sbGVjdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRcdG5ld1JlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA+IHtcblx0XHRpZiAobmV3UmVxdWVzdENvbHVtbnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKGNvbGxlY3Rpb25zKTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Ly8gVE9ETzogZmlsdGVyIGxvY2FsIGl0ZW1zP1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb2xsZWN0aW9ucykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gY29sbGVjdGlvbnNbcGFyZW50SWRdLmVudHJ5O1xuXG5cdFx0XHRwYXJlbnRJZEFycmF5LnB1c2goY29sbGVjdGlvbkVudHJ5LnBhcmVudCEuaXRlbUlkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlclxuXHRcdFx0LmZldGNoTGlua2VkSXRlbUVudHJpZXNEYXRhKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRwYXJlbnRJZEFycmF5LFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0bnVsbCxcblx0XHRcdFx0bmV3UmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdG5ld1JlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCksXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgcGFyZW50SWQgb2YgcGFyZW50SWRBcnJheSkge1xuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbnNbcGFyZW50SWRdLmVudHJ5LmV4cGFuZENvbHVtbnMoY29sdW1uRXhwYW5zaW9uKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbnM7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGV4dGVuZENvbGxlY3Rpb25FbnRyaWVzPFQgZXh0ZW5kcyBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcD4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdHF1ZXJ5Q2FsbGJhY2s6IFF1ZXJ5Q2FsbGJhY2ssXG5cdFx0Y29sbGVjdGlvbnM6IFQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdGlmICghaGFzUHJvcGVydGllcyhjb2xsZWN0aW9ucykpIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSA9IFtdO1xuXHRcdGxldCBpdGVtSWRBcnJheTogSXRlbUlkW10gPSBbXTtcblxuXHRcdG9wdGlvbnMucXVlcnlQYXJhbXMgPSBxdWVyeUNhbGxiYWNrKG9wdGlvbnMucXVlcnlQYXJhbXMpO1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb2xsZWN0aW9ucykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gY29sbGVjdGlvbnNbcGFyZW50SWRdLmVudHJ5O1xuXG5cdFx0XHRjb2xsZWN0aW9uRW50cnkuZXh0ZW5kUXVlcnkocXVlcnlDYWxsYmFjayk7XG5cdFx0XHRwYXJlbnRJZEFycmF5LnB1c2goY29sbGVjdGlvbkVudHJ5LnBhcmVudCEuaXRlbUlkKTtcblx0XHRcdGl0ZW1JZEFycmF5ID0gaXRlbUlkQXJyYXkuY29uY2F0KFxuXHRcdFx0XHR0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeS5pZF1cblx0XHRcdFx0XHQubWFwKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5ID0+IGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaExpbmtlZEl0ZW1FbnRyaWVzRGF0YShcblx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0cGFyZW50SWRBcnJheSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLmFkZEFuZENvbmRpdGlvbihcblx0XHRcdFx0XHR0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkob3B0aW9ucykub2JqZWN0LFxuXHRcdFx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLmNyZWF0ZU5vdEluKGl0ZW1JZEFycmF5KSxcblx0XHRcdFx0KSxcblx0XHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBhZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXM8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdHN1cGVyLl9hZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdC8vIExvY2FsIEl0ZW1FbnRyaWVzIGRvbid0IGJlbG9uZyBpbiByZW1vdGUgY29sbGVjdGlvbiBjaGFuZ2VzXG5cdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5LmlzTG9jYWwoKSxcblx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRXhwYW5kcyB0aGUgY29sdW1ucyBvZiB0aGUgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb25cblx0ICovXG5cdHB1YmxpYyBleHBhbmRDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRuZXdDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnlUeXBlPiB7XG5cdFx0Y29uc3Qge21lcmdlZCwgZGlmZmVyZW5jZX0gPSBjb2xsZWN0aW9uRW50cnkuY29sdW1ucy5tZXJnZVJlcXVlc3RDb2x1bW5zKG5ld0NvbHVtbnMpO1xuXG5cdFx0aWYgKGRpZmZlcmVuY2UgIT09IHRydWUgJiYgZGlmZmVyZW5jZS5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oY29sbGVjdGlvbkVudHJ5KTtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZTtcblxuXHRcdGxldCBwcm9taXNlO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmxpbWl0ICE9PSBudWxsKSB7XG5cdFx0XHRwcm9taXNlID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZS5yZXF1ZXN0U2tlbGV0b24oXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRyZXF1ZXN0VHlwZTogJ3F1ZXJ5Jyxcblx0XHRcdFx0XHRpdGVtVHlwZTogaXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29sdW1uczogbWVyZ2VkLFxuXHRcdFx0XHRcdHF1ZXJ5OiBjb2xsZWN0aW9uRW50cnkucXVlcnkub2JqZWN0LFxuXHRcdFx0XHRcdGxpbWl0OiBjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5saW1pdCwgLy8gdG9kb1tjYWNoZV0gYWN0dWFsbHkgaW1wbGVtZW50IGxpbWl0ID8gQ3VycmVudGx5IGRvZW5zJ3QgcmVhbGx5IHdvcmtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlRdWVyeShcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCxcblx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nLFxuXHRcdFx0XHRdLFxuXHRcdFx0XHRtZXJnZWQsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9taXNlXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdG1lcmdlZCxcblx0XHRcdFx0XHRcdHJlc3BvbnNlLmZldGNoQ29sdW1uc09iamVjdCgpLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuZXhwYW5kQ29sdW1ucyhjb2x1bW5FeHBhbnNpb24pO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGNvbHVtbkV4cGFuc2lvbjtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByb3RlY3RlZCBoYW5kbGVBZGRlZEl0ZW1FbnRyaWVzQ2FsbGJhY2s8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdF9jb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0YWRkZWRFbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiB2b2lkIHtcblx0XHRpZiAoYWRkZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIHRvZG9bY2FjaGVdIE9ubHkgdXNlZCBpbiB0aGUgZnJvbnRlbmQgcGxhbm5lclxuXHRcdC8vIGNvbGxlY3Rpb25FbnRyeS5vbkFkZEluaXRpYWwoYWRkZWRFbnRyaWVzKTtcblx0fVxuXG5cdHByb3RlY3RlZCBoYW5kbGVSZW1vdmVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0X2NvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRyZW1vdmVkSXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IHZvaWQge1xuXHRcdGlmIChyZW1vdmVkSXRlbUVudHJpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gT25seSB1c2VkIGluIHRoZSBmcm9udGVuZCBwbGFubmVyXG5cdFx0Ly8gY29sbGVjdGlvbkVudHJ5Lm9uUmVtb3ZlSW5pdGlhbChyZW1vdmVkSXRlbUVudHJpZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSBkYXRhIGZvciB0aGUgcGFzc2VkIEl0ZW1UeXBlL29wdGlvbnMsIHdpbGwgZG8gbm90aGluZyBpZiB0aGUgcmVxdWVzdGVkIENvbGxlY3Rpb25FbnRyeS9jb2x1bW5zIGFyZSBhbHJlYWR5IGNhY2hlZC5cblx0ICogV2lsbCBjcmVhdGUgYSBuZXcge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9IGlmIHRoZSBDb2xsZWN0aW9uRW50cnkgZGlkbid0IGV4aXN0IHlldFxuXHQgKi9cblx0cHJpdmF0ZSBmZXRjaENvbGxlY3Rpb25EYXRhPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRjb2x1bW5TdWJzZXRDYWNoZTogQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdGNvbGxlY3Rpb25RdWVyeTogQ29sbGVjdGlvblF1ZXJ5LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0bGV0IGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMuZW50cmllcy5nZXRCeVF1ZXJ5KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRjb2xsZWN0aW9uUXVlcnksXG5cdFx0KTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IG51bGwgJiYgY29sdW1uU3Vic2V0Q2FjaGUucnVuKGNvbGxlY3Rpb25FbnRyeS5jb2x1bW5zKSkge1xuXHRcdFx0Ly8gVGhlcmUgYWxyZWFkeSBpcyBhbiBlbnRyeSBhbmQgaXQgY29udGFpbnMgdGhlIGNvbHVtbnMgd2UgbmVlZCwgc28gd2UgY2FuIHNhZmVseSByZXR1cm4gaXRcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oY29sbGVjdGlvbkVudHJ5KTtcblx0XHR9XG5cblx0XHRsZXQgcHJvbWlzZTtcblxuXHRcdGlmIChvcHRpb25zLmxpbWl0ICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCByZXF1ZXN0Q29sdW1ucyA9IHtbaXRlbVR5cGVdOiBvcHRpb25zLmNvbHVtbnN9O1xuXG5cdFx0XHRsZXQgcmVzcG9uc2U6IEFwaVJlc3BvbnNlUHJvY2Vzc29yO1xuXG5cdFx0XHRwcm9taXNlID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0XHQucmVxdWVzdFNrZWxldG9uKFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHJlcXVlc3RUeXBlOiAncXVlcnknLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGU6IGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0Y29sdW1uczogcmVxdWVzdENvbHVtbnMsXG5cdFx0XHRcdFx0XHRxdWVyeTogb3B0aW9ucy5xdWVyeSxcblx0XHRcdFx0XHRcdGxpbWl0OiBvcHRpb25zLmxpbWl0LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdClcblx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0X3Jlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gX3Jlc3BvbnNlO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5wcm9jZXNzUmVzcG9uc2UoXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlLFxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0KVxuXHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHQoKSA9PiByZXNwb25zZSxcblx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyXG5cdFx0XHRcdC5mZXRjaEJ5UXVlcnkoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0Y29sbGVjdGlvblF1ZXJ5Lm9iamVjdCxcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25RdWVyeS5zdHJpbmcsXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZS5yZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvbWlzZVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgcmUtY2hlY2sgaWYgYW4gZW50cnkgaXMgbm90IGNyZWF0ZWQgaW4gdGhlIG1lYW50aW1lXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldEJ5UXVlcnkoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25RdWVyeSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0gdGhpcy5jcmVhdGVDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LmNvbHVtbnMgPSB0aGlzLnRyYW5zYWN0aW9uLmNvcmUuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3RGcm9tUmVzcG9uc2UoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZS5yZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCksXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuZXhwYW5kQ29sdW1ucyhjb2x1bW5FeHBhbnNpb24pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQge1xuXHRDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdEl0ZW1DYWNoZUZhY3RvcnksXG5cdEl0ZW1FbnRyeUZhY3RvcnksXG5cdFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1FbnRyeU9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEFwaVJlcXVlc3RDb2x1bW5zLCBGaWVsZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSwgQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhIH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YSB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHtcblx0QXBpRm9ybWF0dGVyLFxuXHRBcGlSZXNwb25zZVByb2Nlc3Nvcixcblx0Q29sdW1uRXhwYW5zaW9uLFxuXHRDb2x1bW5TZXQsXG5cdENvbHVtblN1YnNldENhY2hlLFxuXHRDb2x1bW5VdGlsLFxuXHRRdWVyeVNlcnZpY2UsXG5cdFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRSZXF1ZXN0QnVmZmVyUmVzcG9uc2UsXG5cdFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyxcbn0gZnJvbSAnLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgSXRlbUhhbmRsZXJCYXNlIH0gZnJvbSAnLi4vSXRlbUhhbmRsZXJCYXNlJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi9TZXJ2ZXJDYWNoZSc7XG5cbmV4cG9ydCB0eXBlIFNlcnZlckl0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0gRmllbGRNYXA8SXRlbVR5cGVUeXBlPjtcblxuZXhwb3J0IGNsYXNzIFNlcnZlckl0ZW1IYW5kbGVyXG5cdGV4dGVuZHMgSXRlbUhhbmRsZXJCYXNlIHtcblxuXHRwdWJsaWMgaXRlbUNoYW5nZXM6IHtcblx0XHRbaXRlbUVudHJ5SWQ6IG51bWJlcl06IFNlcnZlckl0ZW1FbnRyeUNoYW5nZXNcblx0fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRwcml2YXRlIHF1ZXJ5UGFyc2VyRmFjdG9yeTogUXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgcXVlcnlTZXJ2aWNlOiBRdWVyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0Y29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRpdGVtRW50cnlGYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByb3RlY3RlZCB0cmFuc2FjdGlvbjogU2VydmVyQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0XHRwcm9taXNlU2VydmljZSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlSXRlbUVudHJ5IChcblx0XHRjcmVhdGVUdXBsZTogQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhLFxuXHQpOiBJdGVtRW50cnkge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHN1cGVyLmNyZWF0ZUl0ZW1FbnRyeShjcmVhdGVUdXBsZSk7XG5cblx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPSBjcmVhdGVUdXBsZS5maWVsZHM7XG5cblx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBQcm9jZXNzZXMgdXBkYXRlcyBvbiBhIGNhY2hlZCBlbnRyeVxuXHQgKi9cblx0cHVibGljIHByb2Nlc3NJdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiAoXG5cdFx0aXRlbUVudHJ5Q2hhbmdlc1R1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGE8SXRlbVR5cGVUeXBlPixcblx0XHRfZm9yY2VPdmVyd3JpdGU/OiBib29sZWFuLFxuXHRcdF91cGRhdGVJbml0aWFsPzogYm9vbGVhbixcblx0XHRfaXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZT86IGJvb2xlYW4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGl0ZW1FbnRyeUNoYW5nZXNUdXBsZS5lbnRyeTtcblx0XHRjb25zdCBjaGFuZ2VzID0gaXRlbUVudHJ5Q2hhbmdlc1R1cGxlLmNoYW5nZXM7XG5cblx0XHRpZiAodGhpcy5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9IHt9O1xuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VzLmV4cGFuZGVkQ29sdW1ucyAhPT0gbnVsbCkge1xuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMgPSBjaGFuZ2VzLmV4cGFuZGVkQ29sdW1ucy5tZXJnZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcHJldmlvdXMgPSB0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0dGhpcy5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdLFxuXHRcdFx0e30sXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHR0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0Y2hhbmdlcy5maWVsZHMsXG5cdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0sXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHQvLyB0b2RvW2NhY2hlXSB0ZXN0XG5cdFx0aWYgKGNoYW5nZXMuZmllbGRzLmlkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQgPSBjaGFuZ2VzLmZpZWxkcy5pZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJldmlvdXM7XG5cdH1cblxuXHRwdWJsaWMgY29weVRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyAoXG5cdFx0aXRlbUVudHJ5Q2hhbmdlczogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzLFxuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdCk6IFNlcnZlckl0ZW1FbnRyeUNoYW5nZXMge1xuXHRcdHJldHVybiB0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0aXRlbUVudHJ5Q2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0e30sXG5cdFx0XHRlbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdG9wdGlvbnMuY29sdW1ucyA9IHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhDb2xsZWN0aW9uQ29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoSXRlbUVudHJ5RGF0YShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0dGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG9wdGlvbnMuY29sdW1ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEl0ZW1FbnRyaWVzQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGVudHJ5T3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRlbnRyeU9wdGlvbnMuY29sdW1ucyA9IHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhDb2xsZWN0aW9uQ29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0ZW50cnlPcHRpb25zLmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyXG5cdFx0XHQuZmV0Y2hCeVF1ZXJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGhpcy5xdWVyeVBhcnNlckZhY3Rvcnlcblx0XHRcdFx0XHQuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuYWRkUGFyZW50Q29uZGl0aW9uKFxuXHRcdFx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0XHRcdFx0ZW50cnlPcHRpb25zLnBhcmVudCxcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC5wYXJzZSgpLFxuXHRcdFx0XHRlbnRyeU9wdGlvbnMuY29sdW1ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJpZXM6IEl0ZW1FbnRyeVtdID0gW107XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiByZXNwb25zZS5saW5rc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0aXRlbUVudHJpZXMucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBpdGVtRW50cmllcztcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdG9wdGlvbnMuY29sdW1ucyA9IHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhDb2xsZWN0aW9uQ29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb2x1bW5TdWJzZXRDYWNoZSA9IHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChvcHRpb25zLmNvbHVtbnMpO1xuXHRcdGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPHZvaWQ+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgaXRlbUlkcykge1xuXHRcdFx0cHJvbWlzZXMucHVzaChcblx0XHRcdFx0dGhpcy5mZXRjaEl0ZW1FbnRyeURhdGEoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZVxuXHRcdFx0LmFsbChwcm9taXNlcylcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJpZXM6IEl0ZW1FbnRyeVtdID0gW107XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiBpdGVtSWRzKSB7XG5cdFx0XHRcdFx0XHRpdGVtRW50cmllcy5wdXNoKFxuXHRcdFx0XHRcdFx0XHR0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdFx0KSEsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBpdGVtRW50cmllcztcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgZGF0YSBmb3IgdGhlIEl0ZW1FbnRyaWVzIGxpbmtlZCB0byB0aGUgcGFyZW50IEl0ZW1zXG5cdCAqXG5cdCAqIEBwYXJhbSBjb2x1bW5zIHNob3VsZCBjb250YWluIGEgZGVyaXZlZCBjb2x1bW4gdGhhdCByZWZlcnMgdG8gdGhlIHBhcmVudFxuXHQgKi9cblx0cHVibGljIGZldGNoTGlua2VkSXRlbUVudHJpZXNEYXRhIChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdHJldHVybiBxdWVyeSA9PT0gbnVsbCA/XG5cdFx0XHR0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlJZHMoXG5cdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdHBhcmVudElkQXJyYXksXG5cdFx0XHRcdGNvbHVtbnMsXG5cdFx0XHQpIDpcblx0XHRcdHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXIuZmV0Y2hCeVF1ZXJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGhpcy5xdWVyeVBhcnNlckZhY3Rvcnlcblx0XHRcdFx0XHQuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuYWRkQW5kQ29uZGl0aW9uKFxuXHRcdFx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGxpbmtlZFRvOiBwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdFx0XHRcdHF1ZXJ5OiB7aWQ6IHBhcmVudElkQXJyYXl9LFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0LnBhcnNlKCksXG5cdFx0XHRcdC8vIHNob3VsZCBjb250YWluIGEgZGVyaXZlZCBjb2x1bW4gdGhhdCByZWZlcnMgdG8gdGhlIHBhcmVudFxuXHRcdFx0XHRjb2x1bW5zLFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2VuZXJhbCB3YXkgdG8gcHJvY2VzcyBhbiBBUEkgcmVzcG9uc2UuXG5cdCAqIFdpbGwgY2FsbCB7QGxpbmsgQ2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkIHNldEl0ZW1DcmVhdGVkfSBpZiBhbiBlbnRyeSBkb2Vzbid0IGV4aXN0IHlldCwgYW5kIG90aGVyd2lzZSB7QGxpbmsgQ2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkIHNldEl0ZW1VcGRhdGVkfSBpZiBpdCBkb2VzLlxuXHQgKi9cblx0cHVibGljIHByb2Nlc3NBcGlSZXNwb25zZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdHJlc3BvbnNlOiBBcGlSZXNwb25zZVByb2Nlc3Nvcixcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdGNvbHVtblNldDogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29sdW1uRXhwYW5zaW9uOiBDb2x1bW5FeHBhbnNpb248SXRlbVR5cGVUeXBlPixcblx0KTogdm9pZCB7XG5cdFx0Ly8gV2Ugc2hvdWxkIHJlLWNoZWNrIGlmIGFuIGVudHJ5IGlzIG5vdCBjcmVhdGVkIGluIHRoZSBtZWFudGltZVxuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHQpO1xuXG5cdFx0Y29uc3QgZmllbGRzID0gcmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHQpO1xuXG5cdFx0aWYgKGZpZWxkcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEZpZWxkcyBub3QgZm91bmQgaW4gcmVzcG9uc2UgZm9yICR7aXRlbVR5cGV9OiR7aXRlbUlkfWApO1xuXHRcdH1cblxuXHRcdGlmIChpdGVtRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0Y29sdW1uRXhwYW5zaW9uLnJ1bihpdGVtRW50cnkuY29sdW1ucyksXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgZGF0YSBmb3IgdGhlIHBhc3NlZCBJdGVtVHlwZS9JdGVtSWQvY29sdW1ucywgd2lsbCBkbyBub3RoaW5nIGlmIHRoZSByZXF1ZXN0ZWQgSXRlbUVudHJ5L2NvbHVtbnMgYXJlIGFscmVhZHkgY2FjaGVkLlxuXHQgKiBXaWxsIGNyZWF0ZSBhIG5ldyB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gaWYgdGhlIEl0ZW1FbnRyeSBkaWRuJ3QgZXhpc3QgeWV0XG5cdCAqL1xuXHRwcml2YXRlIGZldGNoSXRlbUVudHJ5RGF0YTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0Y29sdW1uU3Vic2V0Q2FjaGU6IENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkICYmIGNvbHVtblN1YnNldENhY2hlLnJ1bihpdGVtRW50cnkuY29sdW1ucykpIHtcblx0XHRcdC8vIFRoZXJlIGFscmVhZHkgaXMgYW4gZW50cnkgYW5kIGl0IGNvbnRhaW5zIHRoZSBjb2x1bW5zIHdlIG5lZWQsIHNvIHdlIGNhbiBzYWZlbHkgcmV0dXJuIGl0XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXJcblx0XHRcdC5mZXRjaEJ5SWQoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLnJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgbm9vcCwgUm1Db3JlIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRDb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRDb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENvbHVtblNldEZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0SXRlbUNhY2hlRmFjdG9yeSxcblx0SXRlbUVudHJ5RmFjdG9yeSxcblx0SXRlbVJlc291cmNlRmFjdG9yeSxcblx0TW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0UXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0UXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcbn0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQgeyBDaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcy9DaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSc7XG5pbXBvcnQge1xuXHRBdXRoSW50ZXJmYWNlLFxuXHRFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxufSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExpbmtUcmVlU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgSXRlbUVudHJ5IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaUxpbmtUcmVlVHlwZSxcblx0QXBpUmVxdWVzdENvbHVtbk1hcCxcblx0RW50cnlQYXJlbnQsXG5cdEVudHJ5UGFyZW50TnVsbCxcblx0RmllbGRNYXAsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1UeXBlLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBBcGlGb3JtYXR0ZXIgfSBmcm9tICcuLi8uLi9BcGlGb3JtYXR0ZXInO1xuaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9BcGlSZXF1ZXN0U2VydmljZSc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvciB9IGZyb20gJy4uLy4uL0FwaVJlc3BvbnNlUHJvY2Vzc29yJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFSZXN1bHQgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayB9IGZyb20gJy4uLy4uL0NoYW5nZXNQcm9jZXNzb3InO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL0NvbGxlY3Rpb25FbnRyeVNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sdW1uQ2FjaGUgfSBmcm9tICcuLi8uLi9Db2x1bW5DYWNoZSc7XG5pbXBvcnQgeyBDb2x1bW5IYW5kbGVyIH0gZnJvbSAnLi4vLi4vQ29sdW1uSGFuZGxlcic7XG5pbXBvcnQgeyBDb2x1bW5TZXQgfSBmcm9tICcuLi8uLi9Db2x1bW5TZXQnO1xuaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4uLy4uL0NvbHVtblV0aWwnO1xuaW1wb3J0IHsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi8uLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBJdGVtRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vSXRlbUVudHJ5U2VydmljZSc7XG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vS2V5U2VydmljZSc7XG5pbXBvcnQgeyBMb2NrU2VydmljZSB9IGZyb20gJy4uLy4uL0xvY2tTZXJ2aWNlJztcbmltcG9ydCB7IFF1ZXJ5U2VydmljZSB9IGZyb20gJy4uLy4uL1F1ZXJ5U2VydmljZSc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4uLy4uL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcbmltcG9ydCB7IFRlbXBsYXRlQ2FjaGUgfSBmcm9tICcuLi8uLi9UZW1wbGF0ZUNhY2hlJztcbmltcG9ydCB7IGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuLi8uLi9VdGlsJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuLi9BYnN0cmFjdENhY2hlJztcbmltcG9ydCB7IENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyIH0gZnJvbSAnLi9TZXJ2ZXJDb2xsZWN0aW9uSGFuZGxlcic7XG5pbXBvcnQgeyBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzLCBTZXJ2ZXJJdGVtSGFuZGxlciB9IGZyb20gJy4vU2VydmVySXRlbUhhbmRsZXInO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIHtAbGluayBTZXJ2ZXJDYWNoZSBTZXJ2ZXJDYWNoZX0gaXMgcmVzcG9uc2libGUgZm9yIGtlZXBpbmcgdHJhY2sgb2Yge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gYW5kIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJpZXN9XG4gKiB3aGljaCBhcmUgc2F2ZWQgb24gdGhlIHNlcnZlci5cbiAqXG4gKiBJdCdzIGJhc2ljYWxseSBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhYmFzZVxuICovXG5leHBvcnQgY2xhc3MgU2VydmVyQ2FjaGVcblx0ZXh0ZW5kcyBBYnN0cmFjdENhY2hlIHtcblxuXHRwdWJsaWMgcmVhZG9ubHkgaXRlbUhhbmRsZXI6IFNlcnZlckl0ZW1IYW5kbGVyO1xuXHRwdWJsaWMgcmVhZG9ubHkgY29sbGVjdGlvbkhhbmRsZXI6IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyO1xuXG5cdHB1YmxpYyBwYXJlbnQ6IG51bGwgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5OiBDaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSxcblx0XHRjb3JlOiBSbUNvcmUsXG5cdFx0Y29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlLFxuXHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0bG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlLFxuXHRcdG1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeTogQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHRlbXBsYXRlQ2FjaGU6IFRlbXBsYXRlQ2FjaGUsXG5cdFx0aXRlbUNhY2hlRmFjdG9yeTogSXRlbUNhY2hlRmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0Y29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdGl0ZW1FbnRyeUZhY3Rvcnk6IEl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0aXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdGNvbGxlY3Rpb25FbnRyeUZhY3Rvcnk6IENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0XHRsaW5rVHJlZVNlcnZpY2U6IExpbmtUcmVlU2VydmljZUludGVyZmFjZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRjb3JlLFxuXHRcdFx0Y29sdW1uQ2FjaGUsXG5cdFx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0cXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdGF1dGhJbnRlcmZhY2UsXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0bG9ja1NlcnZpY2UsXG5cdFx0XHRtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRcdGl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0ZW1wbGF0ZUNhY2hlLFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRpdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5U2VydmljZSxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGxpbmtUcmVlU2VydmljZSxcblx0XHQpO1xuXG5cdFx0dGhpcy5pdGVtSGFuZGxlciA9IG5ldyBTZXJ2ZXJJdGVtSGFuZGxlcihcblx0XHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0cXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdFx0cXVlcnlTZXJ2aWNlLFxuXHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0aXRlbUVudHJ5RmFjdG9yeSxcblx0XHRcdGl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMsXG5cdFx0KTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbkhhbmRsZXIgPSBuZXcgU2VydmVyQ29sbGVjdGlvbkhhbmRsZXIoXG5cdFx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRjb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHR0aGlzLml0ZW1IYW5kbGVyLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRxdWVyeVNlcnZpY2UsXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0dGhpcyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldFNlcnZlckNhY2hlICgpOiBTZXJ2ZXJDYWNoZSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgcHJvY2Vzc1Jlc3BvbnNlIChcblx0XHRyZXNwb25zZTogQXBpUmVzcG9uc2VQcm9jZXNzb3IsXG5cdFx0cmVxdWVzdENvbHVtbk1hcDogQXBpUmVxdWVzdENvbHVtbk1hcCxcblx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNvcmUuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0XHRjb25zdCByZXNwb25zZUNvbHVtbnNPYmplY3QgPSByZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gcmVzcG9uc2UuaXRlbXMpIHtcblx0XHRcdGxldCBjb2x1bW5TZXQ6IENvbHVtblNldDtcblxuXHRcdFx0aWYgKGl0ZW1UeXBlID09PSByZXNwb25zZS5pdGVtVHlwZSkge1xuXHRcdFx0XHRjb2x1bW5TZXQgPSB0aGlzLmNvcmUuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0cmVxdWVzdENvbHVtbk1hcFtpdGVtVHlwZV0sXG5cdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zT2JqZWN0LFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29sdW1uU2V0ID0gdGhpcy5jb3JlLmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0RnJvbVJlc3BvbnNlKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1uc09iamVjdCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5jb3JlLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0Y29sdW1uU2V0LnJlcXVlc3RDb2x1bW5zVHJ1ZVxuXHRcdFx0XHRcdD8gdHJ1ZVxuXHRcdFx0XHRcdDogY29sdW1uU2V0LnJlcXVlc3QsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uc09iamVjdCxcblx0XHRcdCk7XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbUlkU3RyaW5nIGluIHJlc3BvbnNlLml0ZW1zW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLnByb2Nlc3NBcGlSZXNwb25zZShcblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0TnVtYmVyKGl0ZW1JZFN0cmluZyksXG5cdFx0XHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0XHRcdGNvbHVtbkV4cGFuc2lvbixcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hcHBseUNoYW5nZXNEZWx0YShcblx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdGlzQ2FsbGVkQWZ0ZXJBcGlTYXZlLFxuXHRcdFx0aXNDYWxsZWRBZnRlclNvY2tldFVwZGF0ZSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBcHBsaWVzIHRoZSBjaGFuZ2VzIG9mIHRoZSBjaGFuZ2VzRGVsdGEgY3JlYXRlZCBieSB0aGUgQVBJIGNhbGwgKHtAbGluayBDaGFuZ2VzUHJvY2Vzc29yIENoYW5nZXNQcm9jZXNzb3J9L3tAbGluayBTb2NrZXRNZXNzYWdlSGFuZGxlciBTb2NrZXRNZXNzYWdlSGFuZGxlcn0sIG9yIG1hbnVhbGx5IHRocm91Z2ggYSBtb2R1bGUgZnVuY3Rpb24pIG9uIGFsbCBjYWNoZXNcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNGcm9tUGFyZW50IChcblx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEsXG5cdFx0aXNDYWxsZWRBZnRlckFwaVNhdmU6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0dGhpcy5pdGVtSGFuZGxlci5wcm9jZXNzSXRlbUVudHJ5Q2hhbmdlcyhcblx0XHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF0sXG5cdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEuZGVsZXRlZCkge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaW50ZXJuYWxDaGFuZ2VzRGVsdGEuZGVsZXRlZFtpdGVtVHlwZV0pIHtcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmNsZWFyKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdHRoaXMsXG5cdFx0XHRpdGVtVHlwZSA9PiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlJdGVtVHlwZShpdGVtVHlwZSksXG5cdFx0KTtcblxuXHRcdGNvbGxlY3Rpb25NYXRjaGVyXG5cdFx0XHQucHJvY2Vzc0RlbHRhKGludGVybmFsQ2hhbmdlc0RlbHRhKVxuXHRcdFx0LnJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zKGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUpO1xuXG5cdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KFxuXHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRcdFx0aXNDYWxsZWRBZnRlckFwaVNhdmUsXG5cdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyB0aGUgZmllbGRzIHJlcXVpcmVkIHRvIHNldCB0aGUgcGFyZW50XG5cdCAqL1xuXHRwdWJsaWMgZ2V0TGlua0ZpZWxkc0J5UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudCxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnQuaXRlbVR5cGVdW2l0ZW1UeXBlIGFzIHN0cmluZ107XG5cdFx0Y29uc3QgcmVzdWx0OiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+ID0ge307XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vbiBleGlzdGluZyBsaW5rIGJldHdlZW4gJyR7cGFyZW50Lml0ZW1UeXBlfSctPicke2l0ZW1UeXBlfSdgKTtcblx0XHR9XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeS50eXBlID09PSBBcGlMaW5rVHJlZVR5cGUuRElSRUNUKSB7XG5cdFx0XHRyZXN1bHRbbGlua1RyZWVFbnRyeS5maWVsZF0gPSBwYXJlbnQuaXRlbUlkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQuaXRlbXR5cGUgPSBwYXJlbnQuaXRlbVR5cGU7XG5cdFx0XHRyZXN1bHQuaXRlbSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyB0aGUgZW50cnkncyBwYXJlbnRcblx0ICpcblx0ICogQHBhcmFtIGl0ZW1FbnRyeSBUaGUgZW50cnkgdG8gZ2V0IHRoZSBwYXJlbnQgZnJvbVxuXHQgKiBAcGFyYW0gX2Zyb21Jbml0aWFsIFVudXNlZCBwYXJhbWV0ZXIsIHRoZXJlIGZvciBhbGlnbm1lbnQgd2l0aCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnQgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnRdXG5cdCAqIEBwYXJhbSBfcHJvdmlkZWRGaWVsZHMgVW51c2VkIHBhcmFtZXRlciwgdGhlcmUgZm9yIGFsaWdubWVudCB3aXRoIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudCBUcmFuc2FjdGlvbkNhY2hlLmdldFBhcmVudF1cblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBVc2Uge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZS5nZXRQYXJlbnQgQ29sbGVjdGlvblJlc291cmNlLmdldFBhcmVudH0gaW5zdGVhZCBvZiB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnQgVHJhbnNhY3Rpb25DYWNoZS5nZXRQYXJlbnR9IGlmIHlvdSdyZSBnZXR0aW5nIHRoZSBwYXJlbnQgaW4gdGhlIG9uUmVtb3ZlIGNhbGxiYWNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRfZnJvbUluaXRpYWw/OiBib29sZWFuLFxuXHRcdF9wcm92aWRlZEZpZWxkcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEVudHJ5UGFyZW50TnVsbCB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UGFyZW50RnJvbUZpZWxkcyhcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdFx0Y29weUZpZWxkczogYm9vbGVhbiA9IHRydWUsXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF07XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzICE9PSB1bmRlZmluZWRcblx0XHRcdCYmIGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRpZiAoIWNvcHlGaWVsZHMpIHtcblx0XHRcdFx0cmV0dXJuIGNoYW5nZXM7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRjaGFuZ2VzLFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKGl0ZW1FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vIGxvY2FsIGVudHJ5IGZvdW5kYCk7XG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IEVycm9yKGBObyBsb2NhbCBmaWVsZHMgZm91bmQgZm9yIEl0ZW1FbnRyeSB3aXRoIEl0ZW1UeXBlICcke2l0ZW1FbnRyeS5pdGVtVHlwZX0nYCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE9ubHkgdGFrZXMgdGhlIGxvY2FsIGNoYW5nZXMgaW50byBhY2NvdW50LCB1c2VkIGZvciBzYXZpbmdcblx0ICovXG5cdHB1YmxpYyBnZXRMb2NhbEl0ZW1FbnRyeUNoYW5nZXNUdXBsZSAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0KToge1xuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0Y2hhbmdlczogU2VydmVySXRlbUVudHJ5Q2hhbmdlc1xuXHR9IHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKTtcblxuXHRcdGlmIChpdGVtRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byBnZXQgYSBsb2NhbCBJdGVtRW50cnkgd2l0aCBlbnRyeUlkICcke2l0ZW1FbnRyeUlkfScgYnV0IGNvdWxkbid0IGZpbmQgaXRgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0ZW50cnk6IGl0ZW1FbnRyeSxcblx0XHRcdGNoYW5nZXM6IHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdLFxuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbkNoYW5nZXNSZWN1cnNpdmVseSAoY29sbGVjdGlvbkVudHJ5SWQ6IENvbGxlY3Rpb25FbnRyeVsnaWQnXSk6IEl0ZW1FbnRyeVtdIHtcblx0XHRjb25zdCBlbnRyeSA9IHRoaXMuZ2V0TG9jYWxDb2xsZWN0aW9uRW50cnkoY29sbGVjdGlvbkVudHJ5SWQpO1xuXHRcdGxldCBjaGFuZ2VzID0gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnlJZF07XG5cblx0XHRpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKGNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjaGFuZ2VzID0gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnlJZF0gPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNoYW5nZXMuc2xpY2UoKTtcblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ05vIGxvY2FsIGNvbGxlY3Rpb24gaXRlbXMgZm91bmQnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogSW52YWxpZGF0ZXMgdGhlIGNvbXBsZXRlIHNlcnZlciBjYWNoZSwgYWxsIGl0ZW1zIHdpbGwgYmUgcmUtZmV0Y2hlZCB3aGVuZXZlciB0aGV5IGFyZSByZXF1ZXN0ZWRcblx0ICovXG5cdHB1YmxpYyBpbnZhbGlkYXRlQ2FjaGUgKCk6IHZvaWQge1xuXHRcdC8vIHRoZSBpdGVtSGFuZGxlciBjYWNoZSBvbmx5IGNvbnRhaW5zIHJlbW90ZSBlbnRyaWVzXG5cdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmZvckVhY2goXG5cdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5LnF1ZXVlUmVsb2FkKCksXG5cdFx0KTtcblxuXHRcdC8vIHF1ZXVlUmVsb2FkIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciBlYWNoIGluZGl2aWR1YWwgaXRlbVxuXHRcdHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5mb3JFYWNoKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0+IGNvbGxlY3Rpb25FbnRyeS5xdWV1ZVJlbG9hZCgpLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0aGUgcGFzc2VkIGNoYW5nZXMgZnJvbSB0aGUgY2hpbGQgVHJhbnNhY3Rpb24gaW50byB0aGlzIFRyYW5zYWN0aW9uJ3Mgb3duIGNoYW5nZXMgYW5kIHRoZW4gcHJvcGFnYXRlc1xuXHQgKiB0aGVtIHRvIGFsbCBjaGlsZCBUcmFuc2FjdGlvbnNcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNGcm9tQ2hpbGQgKFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGJyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0b25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1JZENvbnZlcnNpb25NYXA+IHtcblxuXHRcdC8vIHRvZG9bY2FjaGVdIHNob3VsZG4ndCB0aGlzIGRvIGV2ZXJ5dGhpbmcgZnJvbSBUcmFuc2FjdGlvbkNhY2hlLnNhdmUgP1xuXG5cdFx0cmV0dXJuIHRoaXMuY2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnlcblx0XHRcdC5jb25zdHJ1Y3QoXG5cdFx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0XHRicmVha1VwQnlQYXJlbnQsXG5cdFx0XHRcdG9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0XHRcdClcblx0XHRcdC5leGVjdXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEFwcGxpZXMgY2hhbmdlcyB0byB0aGlzIHRyYW5zYWN0aW9uIGFuZCBpdHMgY2hpbGRyZW5cblx0ICogRGlmZmVycyBmcm9tIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGF9IGluIHRoZSBoYW5kbGluZyBvZiBkZWxldGVkIGVudHJpZXMgYW5kIHRoZSBhcHBseUNoYW5nZXNGcm9tUGFyZW50IGNhbGxcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNEZWx0YSAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0aXNDYWxsZWRBZnRlckFwaVNhdmU6IGJvb2xlYW4gPSB0cnVlLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzRGVsdGEuY3JlYXRlZC5sZW5ndGggPT09IDBcblx0XHRcdCYmICFoYXNQcm9wZXJ0aWVzKGNoYW5nZXNEZWx0YS51cGRhdGVkKVxuXHRcdFx0JiYgIWhhc1Byb3BlcnRpZXMoY2hhbmdlc0RlbHRhLmRlbGV0ZWQpXG5cdFx0KSB7XG5cdFx0XHQvLyBlbXB0eSBkZWx0YSwgbm8gbmVlZCB0byBkbyBhbnl0aGluZ1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKHtcblx0XHRcdFx0Y3JlYXRlZDogW10sXG5cdFx0XHRcdHJvbGxiYWNrOiBub29wLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaFVwZGF0ZWREZXJpdmVkVmFsdWVzRnJvbURlbHRhKGNoYW5nZXNEZWx0YSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qge3Jlc3VsdCwgaW50ZXJuYWxDaGFuZ2VzRGVsdGEsIHJvbGxiYWNrRnVuY3Rpb25zfSA9IHN1cGVyLl9hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBjaGFuZ2VzRGVsdGEuZGVsZXRlZCkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgY2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhcihpdGVtRW50cnkpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvbGRDaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnkuaWRdO1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRcdFx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLnNldEl0ZW1EZWxldGVkKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRcdFx0cm9sbGJhY2tGdW5jdGlvbnMucHVzaChcblx0XHRcdFx0XHRcdFx0XHRyb2xsYmFja0RlbHRhID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHJvbGxiYWNrRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2xkQ2hhbmdlcyxcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0XHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdFx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSA9PiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlJdGVtVHlwZShpdGVtVHlwZSksXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyXG5cdFx0XHRcdFx0XHQucHJvY2Vzc0RlbHRhKGludGVybmFsQ2hhbmdlc0RlbHRhKVxuXHRcdFx0XHRcdFx0LnJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zKGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRcdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KFxuXHRcdFx0XHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdFx0aXNDYWxsZWRBZnRlckFwaVNhdmUsXG5cdFx0XHRcdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGUsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldExvY2FsSXRlbUVudHJ5IChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHQpOiBJdGVtRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5nZXRCeUVudHJ5SWQoaXRlbUVudHJ5SWQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUVudHJ5WydpdGVtSWQnXSxcblx0KTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGl0ZW1FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldExvY2FsQ29sbGVjdGlvbkVudHJ5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogQ29sbGVjdGlvbkVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlFbnRyeUlkKGNvbGxlY3Rpb25FbnRyeUlkKTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRjaGFuZ2VzT2JqZWN0OiBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBjaGFuZ2VzT2JqZWN0O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uUXVlcnksIEl0ZW1FbnRyeU1hcCwgSXRlbUVudHJ5UGFyZW50SWRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi9jYWNoZS9BYnN0cmFjdENhY2hlJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi9jYWNoZS9zZXJ2ZXIvU2VydmVyQ2FjaGUnO1xuXG5leHBvcnQgY2xhc3MgSXRlbUNhY2hlIHtcblxuXHRwcml2YXRlIGVudHJpZXM6IEl0ZW1FbnRyeU1hcDxhbnk+ID0ge307XG5cblx0cHVibGljIGVudHJpZXNCeUVudHJ5SWQ6IHtcblx0XHRbaXRlbUVudHJ5SWQ6IG51bWJlcl06IEl0ZW1FbnRyeVxuXHR9ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBnZXRCeUVudHJ5SWQgKGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10pOiBJdGVtRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmVudHJpZXNCeUVudHJ5SWRbaXRlbUVudHJ5SWRdO1xuXHR9XG5cblx0c29tZSAoY2FsbGJhY2s6IChpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZT4pID0+IGJvb2xlYW4pIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBlbnRyaWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRpZiAoY2FsbGJhY2soZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGdldEJ5SXRlbVR5cGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChpdGVtVHlwZTogSXRlbVR5cGVUeXBlKSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0cmVzdWx0LnB1c2goZW50cmllc1tpdGVtSWRdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Z2V0QnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IENvbGxlY3Rpb25RdWVyeSxcblx0KSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gZW50cmllc1tpdGVtSWRdO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdHRoaXMubWF0Y2hRdWVyeShcblx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRMb2NhbEJ5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBDb2xsZWN0aW9uUXVlcnksXG5cdCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGVudHJpZXNbaXRlbUlkXTtcblxuXHRcdFx0aWYgKCFpdGVtRW50cnkuaXNMb2NhbCgpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5tYXRjaFF1ZXJ5KFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0KSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRCeVBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0KSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gZW50cmllc1tpdGVtSWRdO1xuXHRcdFx0Y29uc3QgcGFyZW50ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoaXRlbUVudHJ5KTtcblxuXHRcdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRcdGlmIChwYXJlbnQuaXRlbVR5cGUgPT09IHBhcmVudFR5cGUgJiYgcGFyZW50Lml0ZW1JZCA9PSBwYXJlbnRJZCkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRiYXRjaEdldExvY2FsQnlQYXJlbnQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZHM6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0YWRkaXRpb25hbFF1ZXJ5OiBhbnksXG5cdCk6IEl0ZW1FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogSXRlbUVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPiA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBvZiBwYXJlbnRJZHMpIHtcblx0XHRcdHJlc3VsdFtwYXJlbnRJZF0gPSBbXTtcblx0XHR9XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGVudHJpZXNbaXRlbUlkXTtcblx0XHRcdGNvbnN0IHBhcmVudCA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0UGFyZW50KGl0ZW1FbnRyeSk7XG5cblx0XHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwYXJlbnQuaXRlbVR5cGUgIT09IHBhcmVudFR5cGUgfHwgcmVzdWx0W3BhcmVudC5pdGVtSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXRlbUVudHJ5LmlzTG9jYWwoKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFkZGl0aW9uYWxRdWVyeSA9PT0gbnVsbCB8fCB0aGlzLm1hdGNoUXVlcnkoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0YWRkaXRpb25hbFF1ZXJ5LFxuXHRcdFx0KSkge1xuXHRcdFx0XHRyZXN1bHRbcGFyZW50Lml0ZW1JZF0ucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRmb3JFYWNoIChjYWxsYmFjazogKGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlPikgPT4gdm9pZCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGNhbGxiYWNrKGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qXHRmaWx0ZXIgKGNhbGxiYWNrOiAoaXRlbUVudHJ5OiBJdGVtRW50cnkpID0+IGJvb2xlYW4pOiB2b2lkIHtcblx0IGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdCBjb25zdCBmaWx0ZXJlZEVudHJpZXM6IEl0ZW1FbnRyeU1hcCA9IHt9O1xuXG5cdCBmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0IGZpbHRlcmVkRW50cmllc1tpdGVtVHlwZV0gPSB7fTtcblxuXHQgZm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0IGNvbnN0IGl0ZW1FbnRyeSA9IGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0IGlmIChjYWxsYmFjayhpdGVtRW50cnkpKVxuXHQgZmlsdGVyZWRFbnRyaWVzW2l0ZW1UeXBlXVtpdGVtSWRdID0gaXRlbUVudHJ5O1xuXHQgfVxuXHQgfVxuXG5cdCB0aGlzLmVudHJpZXMgPSBmaWx0ZXJlZEVudHJpZXM7XG5cdCB9XG5cdCAqL1xuXHR0b0FycmF5ICgpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGFkZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4pOiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblx0XHRjb25zdCBpdGVtVHlwZSA9IGl0ZW1FbnRyeS5pdGVtVHlwZTtcblxuXHRcdGlmIChlbnRyaWVzW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRlbnRyaWVzW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdHRoaXMuZW50cmllc0J5RW50cnlJZFtpdGVtRW50cnkuaWRdID0gaXRlbUVudHJ5O1xuXG5cdFx0cmV0dXJuIGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1FbnRyeS5pdGVtSWRdID0gaXRlbUVudHJ5O1xuXHR9XG5cblx0Z2V0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IHN0cmluZyB8IEl0ZW1JZCxcblx0KTogdW5kZWZpbmVkIHwgSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLmVudHJpZXNbaXRlbVR5cGVdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLmVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdH1cblxuXHQvLyBzaG91bGQgYmUgZmFzdFxuXHRjb250YWlucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogc3RyaW5nIHwgSXRlbUlkLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXSAhPT0gdW5kZWZpbmVkO1xuXHR9XG5cblx0dXBkYXRlSXRlbUlkPFQgZXh0ZW5kcyBJdGVtRW50cnk8YW55Pj4gKFxuXHRcdGl0ZW1FbnRyeTogVCxcblx0XHRvbGRJdGVtSWQ6IHN0cmluZyB8IEl0ZW1JZCxcblx0KTogVCB7XG5cdFx0Y29uc3QgZW50cnlNYXAgPSB0aGlzLmVudHJpZXNbaXRlbUVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdGRlbGV0ZSBlbnRyeU1hcFtvbGRJdGVtSWRdO1xuXHRcdHJldHVybiBlbnRyeU1hcFtpdGVtRW50cnkuaXRlbUlkXSA9IGl0ZW1FbnRyeTtcblx0fVxuXG5cdGNsZWFyIChpdGVtRW50cnk/OiBJdGVtRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGlmIChpdGVtRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5lbnRyaWVzID0ge307XG5cdFx0XHR0aGlzLmVudHJpZXNCeUVudHJ5SWQgPSB7fTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuY2xlYXJCeUl0ZW1JZChcblx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0KTtcblx0fVxuXG5cdGNsZWFyQnlJdGVtSWQgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0ZGVsZXRlIHRoaXMuZW50cmllc0J5RW50cnlJZFtlbnRyaWVzW2l0ZW1JZF0uaWRdO1xuXG5cdFx0cmV0dXJuIGRlbGV0ZSBlbnRyaWVzW2l0ZW1JZF07XG5cdH1cblxuXHRtYXRjaFF1ZXJ5IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+LFxuXHRcdHF1ZXJ5OiBDb2xsZWN0aW9uUXVlcnksXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHR1cGxlID0gdGhpcy50cmFuc2FjdGlvbi5nZXRMb2NhbEl0ZW1FbnRyeUNoYW5nZXNUdXBsZShpdGVtRW50cnkuaWQpO1xuXG5cdFx0cmV0dXJuIHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeVxuXHRcdFx0LmNvbnN0cnVjdChcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHQodGhpcy50cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFNlcnZlckNhY2hlKVxuXHRcdFx0XHRcdD8gdHVwbGUuY2hhbmdlc1xuXHRcdFx0XHRcdDogdHVwbGUuY2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChpdGVtRW50cnkpLFxuXHRcdFx0KVxuXHRcdFx0Lm1hdGNoUXVlcnkocXVlcnkub2JqZWN0KSA9PT0gdHJ1ZTsgLy8gVE9ETzogbWF5YmU/XG5cdH1cbn1cbiIsImltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBTExfUEVSTUlTU0lPTlMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQXV0aEludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9MaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtRW50cnlPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaUxpbmtUcmVlVHlwZSxcblx0QXBpUmVzcG9uc2UsXG5cdEVudHJ5UGFyZW50LFxuXHRFbnRyeVBhcmVudE51bGwsXG5cdEZpZWxkTWFwLFxuXHRJdGVtRXJyb3IsXG5cdEl0ZW1JZCxcblx0SXRlbUlkQ29udmVyc2lvbk1hcCxcblx0SXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdEl0ZW1UeXBlLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBJdGVtRW50cnlTZXJ2aWNlIHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcml2YXRlIGxpbmtUcmVlU2VydmljZTogTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIG1hdGNoUGFyZW50IChcblx0XHRvbGRQYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0XHRuZXdQYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKG9sZFBhcmVudCA9PT0gbnVsbCAmJiBuZXdQYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdChvbGRQYXJlbnQgPT09IG51bGwgJiYgbmV3UGFyZW50ICE9PSBudWxsKVxuXHRcdFx0fHwgKG9sZFBhcmVudCAhPT0gbnVsbCAmJiBuZXdQYXJlbnQgPT09IG51bGwpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gdGhleSBjYW4ndCBiZSBudWxsIGFueW1vcmUgaGVyZSByaWdodCA/XG5cdFx0cmV0dXJuIChcblx0XHRcdG9sZFBhcmVudCEuaXRlbVR5cGUgPT09IG5ld1BhcmVudCEuaXRlbVR5cGVcblx0XHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0XHQmJiBvbGRQYXJlbnQhLml0ZW1JZCA9PSBuZXdQYXJlbnQhLml0ZW1JZFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgdGhlIGZpZWxkcyByZXF1aXJlZCB0byBzZXQgdGhlIHBhcmVudFxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIE9wcG9zaXRlIG9mIHtAbGluayBJdGVtRW50cnlTZXJ2aWNlLmdldFBhcmVudEJ5RmllbGRzIEl0ZW1FbnRyeVNlcnZpY2UuZ2V0UGFyZW50QnlGaWVsZHN9XG5cdCAqL1xuXHRwdWJsaWMgZ2V0TGlua0ZpZWxkc0J5UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudCxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnQuaXRlbVR5cGVdW2l0ZW1UeXBlIGFzIHN0cmluZ107XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vbiBleGlzdGluZyBsaW5rIGJldHdlZW4gJyR7cGFyZW50Lml0ZW1UeXBlfSctPicke2l0ZW1UeXBlfSdgKTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHQ6IFBhcnRpYWw8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4gPSB7fTtcblxuXHRcdGlmIChsaW5rVHJlZUVudHJ5LnR5cGUgPT09IEFwaUxpbmtUcmVlVHlwZS5ESVJFQ1QpIHtcblx0XHRcdHJlc3VsdFtsaW5rVHJlZUVudHJ5LmZpZWxkXSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdC5pdGVtdHlwZSA9IHBhcmVudC5pdGVtVHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtID0gcGFyZW50Lml0ZW1JZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIGFuIHtAbGluayBFbnRyeVBhcmVudCBFbnRyeVBhcmVudH0gb2JqZWN0IGZyb20gdGhlIGZpZWxkc1xuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIE9wcG9zaXRlIG9mIHtAbGluayBJdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudCBJdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudH1cblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnRCeUZpZWxkczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnRUeXBlXVtpdGVtRW50cnkuaXRlbVR5cGUgYXMgc3RyaW5nXTtcblxuXHRcdGlmIChsaW5rVHJlZUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgTm9uIGV4aXN0aW5nIGxpbmsgYmV0d2VlbiAnJHtwYXJlbnRUeXBlfSctPicke2l0ZW1FbnRyeS5pdGVtVHlwZX0nYCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzdWx0OiBFbnRyeVBhcmVudCA9IHt9IGFzIEVudHJ5UGFyZW50O1xuXG5cdFx0aWYgKGxpbmtUcmVlRW50cnkudHlwZSA9PT0gQXBpTGlua1RyZWVUeXBlLkRJUkVDVCkge1xuXHRcdFx0cmVzdWx0Lml0ZW1UeXBlID0gcGFyZW50VHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtSWQgPSBmaWVsZHNbbGlua1RyZWVFbnRyeS5maWVsZF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHRvZG9bY2FjaGVdIHdlIGFscmVhZHkga25vdyB0aGUgcGFyZW50VHlwZT9cblx0XHRcdHJlc3VsdC5pdGVtVHlwZSA9IGZpZWxkcy5pdGVtdHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtSWQgPSBmaWVsZHMuaXRlbTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGdldERpc3BsYXlOYW1lPEl0ZW1FbnRyeVR5cGUgZXh0ZW5kcyBJdGVtRW50cnk+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeVR5cGUsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPixcblx0KTogc3RyaW5nIHtcblxuXHRcdHN3aXRjaCAoaXRlbUVudHJ5Lml0ZW1UeXBlKSB7XG5cdFx0XHRjYXNlICdDb250YWN0Jzpcblx0XHRcdFx0cmV0dXJuIGZpZWxkcy50eXBlID09PSAnYmVkcmlqZidcblx0XHRcdFx0XHQ/IGZpZWxkcy5iZWRyaWpmXG5cdFx0XHRcdFx0OiB0aGlzLmdldEZ1bGxOYW1lKFxuXHRcdFx0XHRcdFx0ZmllbGRzLnZvb3JuYWFtLFxuXHRcdFx0XHRcdFx0ZmllbGRzLnR1c3NlbnZvZWdzZWwsXG5cdFx0XHRcdFx0XHRmaWVsZHMubmFhbSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSAnTWVkZXdlcmtlcic6XG5cdFx0XHRjYXNlICdQZXJzb24nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRGdWxsTmFtZShcblx0XHRcdFx0XHRmaWVsZHMudm9vcm5hYW0sXG5cdFx0XHRcdFx0ZmllbGRzLnR1c3NlbnZvZWdzZWwsXG5cdFx0XHRcdFx0ZmllbGRzLmFjaHRlcm5hYW0sXG5cdFx0XHRcdCk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmllbGRzW3RoaXMuZ2V0VGl0bGVGaWVsZChpdGVtRW50cnkuaXRlbVR5cGUpXTtcblx0XHR9XG5cdH1cblxuXHRwcm9jZXNzT3B0aW9ucyAob3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UpOiBJdGVtRW50cnlPcHRpb25zIHtcblx0XHRyZXR1cm4gbmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyk7XG5cdH1cblxuXHQvLyB0b2RvOiB0cmFuc2xhdGVcblx0Y3JlYXRlVW5mb3VuZFJlbW90ZUl0ZW1FcnJvciAoKTogSXRlbUVycm9yIHtcblx0XHRyZXR1cm4ge21lc3NhZ2U6ICdUaGUgcmVxdWVzdGVkIGl0ZW0gY291bGQgbm90IGJlIGZvdW5kIC8geW91ciBjdXJyZW50IHBlcm1pc3Npb25zIGFyZSBub3Qgc3VmZmljaWVudCd9O1xuXHR9XG5cblx0Y3JlYXRlVW5mb3VuZExvY2FsSXRlbUVycm9yIChpdGVtVHlwZTogSXRlbVR5cGUpOiBJdGVtRXJyb3Ige1xuXHRcdHJldHVybiB7bWVzc2FnZTogYEEgbG9jYWwgaXRlbSBvZiB0eXBlICR7aXRlbVR5cGV9IGNvdWxkIG5vdCBiZSBmb3VuZGB9O1xuXHR9XG5cblx0Y3JlYXRlRXhpc3RpbmdMb2NhbEl0ZW1FcnJvciAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogSXRlbUVycm9yIHtcblx0XHRyZXR1cm4ge21lc3NhZ2U6IGBBIGxvY2FsIGl0ZW0gb2YgdHlwZSAke2l0ZW1UeXBlfSBub3QgYmUgY3JlYXRlZCwgdGhlIElEIGlzIGFscmVhZHkgaW4gdXNlYH07XG5cdH1cblxuXHRjcmVhdGVMb2NhbENvbnZlcnNpb25NYXAgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRkb0V4dGVuZDogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZSxcblx0KTogSXRlbUlkQ29udmVyc2lvbk1hcCB7XG5cdFx0Y29uc3QgYXBpSXRlbUlkID0gYXBpUmVzcG9uc2UubGlua3NbaXRlbVR5cGVdWzBdO1xuXHRcdGNvbnN0IHJlc3VsdDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9O1xuXG5cdFx0cmVzdWx0W2l0ZW1UeXBlXSA9IHt9O1xuXHRcdHJlc3VsdFtpdGVtVHlwZV1bYXBpSXRlbUlkXSA9IGl0ZW1JZDtcblxuXHRcdGlmIChkb0V4dGVuZCkge1xuXHRcdFx0dGhpcy5leHBhbmRMb2NhbENvbnZlcnNpb25NYXAoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRhcGlJdGVtSWQsXG5cdFx0XHRcdGFwaVJlc3BvbnNlLFxuXHRcdFx0XHRyZXN1bHQsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRleHBhbmRMb2NhbENvbnZlcnNpb25NYXAgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdFx0YXBpUmVzcG9uc2U6IEFwaVJlc3BvbnNlLFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGxpbmtzID0gYXBpUmVzcG9uc2UuaXRlbXNbcGFyZW50VHlwZV1bcGFyZW50SWRdLmxpbmtzO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBsaW5rcykge1xuXHRcdFx0Y29uc3QgaWRBcnJheSA9IGxpbmtzW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKGNvbnZlcnNpb25NYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udmVyc2lvbk1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBhcGlJdGVtSWQgb2YgaWRBcnJheSkge1xuXHRcdFx0XHRjb252ZXJzaW9uTWFwW2l0ZW1UeXBlXVthcGlJdGVtSWRdID0gdGhpcy5rZXlTZXJ2aWNlLmdldExvY2FsSWQoKTtcblxuXHRcdFx0XHR0aGlzLmV4cGFuZExvY2FsQ29udmVyc2lvbk1hcChcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRhcGlJdGVtSWQsXG5cdFx0XHRcdFx0YXBpUmVzcG9uc2UsXG5cdFx0XHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRleHBhbmRDb252ZXJzaW9uTWFwIChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdFx0bmV3SXRlbUlkPzogSXRlbUlkLFxuXHQpOiBJdGVtSWQge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gaXRlbUVudHJ5Lml0ZW1UeXBlO1xuXHRcdGNvbnN0IGl0ZW1JZCA9IGl0ZW1FbnRyeS5pdGVtSWQ7XG5cblx0XHRsZXQgY29udmVyc2lvbk1hcEVudHJ5O1xuXG5cdFx0aWYgKGNvbnZlcnNpb25NYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnZlcnNpb25NYXBbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0Y29udmVyc2lvbk1hcEVudHJ5ID0gY29udmVyc2lvbk1hcFtpdGVtVHlwZV07XG5cblx0XHRpZiAoY29udmVyc2lvbk1hcEVudHJ5W2l0ZW1JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGNvbnZlcnNpb25NYXBFbnRyeVtpdGVtSWRdO1xuXHRcdH1cblxuXHRcdGlmIChuZXdJdGVtSWQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bmV3SXRlbUlkID0gdGhpcy5rZXlTZXJ2aWNlLmdldExvY2FsSWQoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29udmVyc2lvbk1hcEVudHJ5W2l0ZW1JZF0gPSBuZXdJdGVtSWQ7XG5cdH1cblxuXHRiYXRjaEV4cGFuZENvbnZlcnNpb25NYXAgKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8YW55Pj4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogSXRlbUlkQ29udmVyc2lvbk1hcCB7XG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdHRoaXMuZXhwYW5kQ29udmVyc2lvbk1hcChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29udmVyc2lvbk1hcDtcblx0fVxuXG5cdGdldENvbnZlcnNpb25WYWx1ZSAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogSXRlbUlkIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAobWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdH1cblxuXHRnZXRGdWxsTmFtZSAoXG5cdFx0Zmlyc3ROYW1lOiBzdHJpbmcgPSAnJyxcblx0XHRpbmZpeDogc3RyaW5nID0gJycsXG5cdFx0bGFzdE5hbWU6IHN0cmluZyA9ICcnLFxuXHQpOiBzdHJpbmcge1xuXHRcdHJldHVybiBmaXJzdE5hbWVcblx0XHRcdC50cmltKClcblx0XHRcdC5jb25jYXQoXG5cdFx0XHRcdCcgJyxcblx0XHRcdFx0aW5maXgsXG5cdFx0XHQpXG5cdFx0XHQudHJpbSgpXG5cdFx0XHQuY29uY2F0KFxuXHRcdFx0XHQnICcsXG5cdFx0XHRcdGxhc3ROYW1lLFxuXHRcdFx0KVxuXHRcdFx0LnRyaW0oKTtcblx0fVxuXG5cdGdldFRpdGxlRmllbGQgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IHN0cmluZyB7XG5cdFx0c3dpdGNoIChpdGVtVHlwZSkge1xuXHRcdFx0Y2FzZSAnRXhlbXBsYWFyJzpcblx0XHRcdFx0cmV0dXJuICdzZXJpZW51bW1lcic7XG5cdFx0XHRjYXNlICdGYWN0dXVyJzpcblx0XHRcdFx0cmV0dXJuICdudW1tZXInO1xuXHRcdFx0Y2FzZSAnRmlsZXMnOlxuXHRcdFx0XHRyZXR1cm4gJ2ZyaWVuZGx5bmFtZSc7XG5cdFx0XHRjYXNlICdGdW5jdGllJzpcblx0XHRcdGNhc2UgJ1N0YW5kYWFyZGZ1bmN0aWUnOlxuXHRcdFx0XHRyZXR1cm4gJ25hYW1pbnRlcm4nO1xuXHRcdFx0Y2FzZSAnVm9vcnJhYWRtdXRhdGllJzpcblx0XHRcdFx0cmV0dXJuICdvbXNjaHJpanZpbmcnO1xuXHRcdFx0Y2FzZSAnQmFyY29kZSc6XG5cdFx0XHRcdHJldHVybiAnY29kZSc7XG5cdFx0XHRjYXNlICdCZXRhYWxtaWRkZWwnOlxuXHRcdFx0Y2FzZSAnQmV0YWxpbmdzY29uZGl0aWUnOlxuXHRcdFx0Y2FzZSAnQnJpZWZwYXBpZXInOlxuXHRcdFx0Y2FzZSAnVGF4Q2xhc3MnOlxuXHRcdFx0Y2FzZSAnVGF4U2NoZW1hJzpcblx0XHRcdGNhc2UgJ0NvbmRpdGlvbic6XG5cdFx0XHRjYXNlICdGYWN0dXVybW9tZW50Jzpcblx0XHRcdGNhc2UgJ0Z1bmN0aWVncm9lcCc6XG5cdFx0XHRjYXNlICdHcm9vdGJvZWsnOlxuXHRcdFx0Y2FzZSAnSW5odXVyJzpcblx0XHRcdGNhc2UgJ0luaHV1cmdyb2VwJzpcblx0XHRcdGNhc2UgJ0luaHV1cm1hdGVyaWFhbCc6XG5cdFx0XHRjYXNlICdNYXRlcmlhYWwnOlxuXHRcdFx0Y2FzZSAnTWF0ZXJpYWFsQ2F0Jzpcblx0XHRcdGNhc2UgJ01lZGV3ZXJrZXJ0YXJpZWYnOlxuXHRcdFx0Y2FzZSAnTm90aXRpZSc6XG5cdFx0XHRjYXNlICdQbGFubmluZ21hdGVyaWFhbCc6XG5cdFx0XHRjYXNlICdQcm9qZWN0Jzpcblx0XHRcdGNhc2UgJ1N0YWZmZWxncm9lcCc6XG5cdFx0XHRjYXNlICdTdWJwcm9qZWN0Jzpcblx0XHRcdGNhc2UgJ1RhYWsnOlxuXHRcdFx0Y2FzZSAnVGFnJzpcblx0XHRcdGNhc2UgJ1RlbXBsYXRlJzpcblx0XHRcdGNhc2UgJ1RpamQnOlxuXHRcdFx0Y2FzZSAnVGl0ZWwnOlxuXHRcdFx0Y2FzZSAnVHlwZSc6XG5cdFx0XHRjYXNlICdWb2VydHVpZyc6XG5cdFx0XHRcdHJldHVybiAnbmFhbSc7XG5cdFx0XHQvLyBjYXNlICdDb250YWN0Jzpcblx0XHRcdC8vIGNhc2UgJ01lZGV3ZXJrZXInOlxuXHRcdFx0Ly8gY2FzZSAnUGVyc29uJzpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdC8vIG9ubHkgdXNlIGRpc3BsYXluYW1lIGZvciBpdGVtcyB0aGF0IGRvbnQndCBoYXZlIGEgc2ltcGxlLCB3cml0YWJsZSBuYW1lIGZpZWxkXG5cdFx0XHRcdC8vIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIGZvciB0ZW1wbGF0ZWQgaXRlbXNcblx0XHRcdFx0cmV0dXJuICdkaXNwbGF5bmFtZSc7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETzogd2UgY2FuIHJlbW92ZSB0aGVzZSBvbmNlIGFsbCBjb2x1bW5zIGFyZSByZXNwZWN0ZWQgZm9yIGxvY2FsIGl0ZW1zIFtSTTQtMTAzNzhdXG5cdHB1YmxpYyBnZXRMb2NhbERlZmF1bHRWYWx1ZXMgKCk6IEZpZWxkTWFwIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cGVybWlzc2lvbnM6IEFMTF9QRVJNSVNTSU9OUyxcblx0XHRcdGNyZWF0b3I6IHRoaXMuYXV0aEludGVyZmFjZS5nZXRVc2VySWQoKSxcblx0XHRcdGNyZWF0ZWQ6IG1vbWVudCgpLFxuXHRcdH07XG5cdH1cbn1cbiIsImltcG9ydCB7IERVUExJQ0FURV9LRVlXT1JELCBEVVBMSUNBVEVfUFJFRklYLCBORVdfS0VZV09SRCwgTkVXX1BSRUZJWCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJdGVtSWQsIFN0YXRlS2V5LCBTdGF0ZUtleVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBLZXlTZXJ2aWNlIHtcblx0c2VwYXJhdG9yOiBzdHJpbmcgPSAnOic7XG5cblx0Y29uc3RydWN0b3IgKCkge31cblxuXHRnZXRTaW5nbGVLZXkgKGl0ZW1UeXBlOiBzdHJpbmcsIGl0ZW1JZDogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gaXRlbVR5cGUgKyB0aGlzLnNlcGFyYXRvciArIGl0ZW1JZDtcblx0fVxuXG5cdGdldENzc0tleSAoLi4uYXJncyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGFyZ3Muam9pbignXycpO1xuXHR9XG5cblx0cGFyc2VTdGF0ZUtleSAoc3RhdGVLZXk6IHN0cmluZyk6IFN0YXRlS2V5IHwgbnVsbCB7XG5cdFx0c3RhdGVLZXkgPSBzdGF0ZUtleS50b1N0cmluZygpO1xuXG5cdFx0aWYgKHN0YXRlS2V5LnN1YnN0cmluZygwLCBORVdfS0VZV09SRC5sZW5ndGgpID09PSBORVdfS0VZV09SRClcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHR5cGU6IFN0YXRlS2V5VHlwZS5OZXcsXG5cdFx0XHRcdHRlbXBsYXRlOiBzdGF0ZUtleS5zdWJzdHJpbmcoTkVXX0tFWVdPUkQubGVuZ3RoKSAvLyBUT0RPOiB0aGlzIGlzIGN1cnJlbnRseSBub3QgYmVpbmcgdXNlZCwgcmVldmFsdWF0ZVxuXHRcdFx0fTtcblxuXHRcdGlmIChzdGF0ZUtleS5zdWJzdHJpbmcoMCwgRFVQTElDQVRFX0tFWVdPUkQubGVuZ3RoKSA9PT0gRFVQTElDQVRFX0tFWVdPUkQpXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0eXBlOiBTdGF0ZUtleVR5cGUuRHVwbGljYXRlLFxuXHRcdFx0XHRpdGVtSWQ6ICtzdGF0ZUtleS5zdWJzdHJpbmcoRFVQTElDQVRFX0tFWVdPUkQubGVuZ3RoKVxuXHRcdFx0fTtcblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Z2V0RHVwbGljYXRlU3RhdGVLZXkgKGl0ZW1JZDogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gRFVQTElDQVRFX0tFWVdPUkQgKyBpdGVtSWQ7XG5cdH1cblxuXHRnZXROZXdTdGF0ZUtleSAodGVtcGxhdGVUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBORVdfS0VZV09SRCArIHRlbXBsYXRlVHlwZTtcblx0fVxuXG5cdGdldExvY2FsSWQgKCk6IEl0ZW1JZCB7XG5cdFx0cmV0dXJuICsoTkVXX1BSRUZJWCArIHRoaXMuZ2V0UmFuZG9tU3RyaW5nKCkpO1xuXHR9XG5cblx0Z2V0TG9jYWxEdXBsaWNhdGVJZCAoKTogSXRlbUlkIHtcblx0XHRyZXR1cm4gKyhEVVBMSUNBVEVfUFJFRklYICsgdGhpcy5nZXRSYW5kb21TdHJpbmcoKSk7XG5cdH1cblxuXHRnZXRSYW5kb21TdHJpbmcgKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuICgnJyArIE1hdGgucmFuZG9tKCkpLnNwbGl0KCcuJylbMV0uc3Vic3RyKDAsIDgpO1xuXHR9XG5cblx0Ly8gbm90ZTogdGhlIGNoYW5nZXMgY29tcGlsZXIgdXNlcyB0aGlzXG5cdC8vIG1pZ2h0IGJlIGNhbGxlZCB3aXRoIHVuZGVmaW5lZCAoaXRlbUhhbmRsZXIuY3JlYXRlUmVxdWVzdClcblx0aXNMb2NhbElkIChpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiAodGhpcy5pc05ld0lkKGl0ZW1JZCkgfHwgdGhpcy5pc0R1cGxpY2F0ZUlkKGl0ZW1JZCkpO1xuXHR9XG5cblx0aXNOZXdJZCAoaXRlbUlkOiBJdGVtSWQgfCBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gaXRlbUlkID09PSBORVdfS0VZV09SRCB8fCAoJycgKyBpdGVtSWQpLnN1YnN0cmluZygwLCBORVdfUFJFRklYLmxlbmd0aCkgPT09IE5FV19QUkVGSVg7XG5cdH1cblxuXHRpc0R1cGxpY2F0ZUlkIChpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBpdGVtSWQgPT09IERVUExJQ0FURV9LRVlXT1JEIHx8ICgnJyArIGl0ZW1JZCkuc3Vic3RyaW5nKDAsIERVUExJQ0FURV9QUkVGSVgubGVuZ3RoKSA9PT0gRFVQTElDQVRFX1BSRUZJWDtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2UsIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtSWQsIEl0ZW1NYXAsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IGNyZWF0ZVBhdGggfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdHlwZSBMb2NrVG9rZW4gPSB7aXNGb3JlaWduOiBmYWxzZSwgaWQ6IG51bWJlciwgdG9rZW46IHN0cmluZ30gfCB7aXNGb3JlaWduOiB0cnVlLCBtZXNzYWdlOiBzdHJpbmd9O1xuXG5leHBvcnQgY2xhc3MgTG9ja1NlcnZpY2Uge1xuXG5cdHByaXZhdGUgbG9ja0l0ZW1zOiBJdGVtTWFwPExvY2tUb2tlbj4gPSB7fTtcblx0cHJpdmF0ZSBwcm9taXNlczogSXRlbU1hcDxQcm9taXNlSW50ZXJmYWNlPExvY2tUb2tlbj4+ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIGdldExvY2tzICgpOiBMb2NrU2VydmljZVsnbG9ja0l0ZW1zJ10ge1xuXHRcdHJldHVybiB0aGlzLmxvY2tJdGVtcztcblx0fVxuXG5cdHB1YmxpYyBoYXNMb2NrIChsb2NrVG9rZW5JZDogSXRlbUlkKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbG9ja0l0ZW1zID0gdGhpcy5sb2NrSXRlbXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGxvY2tJdGVtcykge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gbG9ja0l0ZW1zW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRjb25zdCBsb2NrSXRlbSA9IGxvY2tJdGVtc1tpdGVtVHlwZV1baXRlbUlkXTtcblxuXHRcdFx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdFx0XHRpZiAoIWxvY2tJdGVtLmlzRm9yZWlnbiAmJiBsb2NrSXRlbS5pZCA9PSBsb2NrVG9rZW5JZCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gc2hvdWxkIGJlIGZhc3QgKHdhdGNoZWQpXG5cdHB1YmxpYyBpc0xvY2tlZCAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGxvY2tJdGVtID0gdGhpcy5nZXRWYWx1ZShcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMubG9ja0l0ZW1zLFxuXHRcdCk7XG5cblx0XHRpZiAobG9ja0l0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBsb2NrSXRlbS5pc0ZvcmVpZ247XG5cdH1cblxuXHRwdWJsaWMgZ2V0TWVzc2FnZSAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IHVuZGVmaW5lZCB8IHN0cmluZyB7XG5cdFx0Y29uc3QgbG9ja0l0ZW0gPSB0aGlzLmdldFZhbHVlKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0dGhpcy5sb2NrSXRlbXMsXG5cdFx0KTtcblxuXHRcdGlmIChsb2NrSXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGlmICghbG9ja0l0ZW0uaXNGb3JlaWduKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBsb2NrSXRlbS5tZXNzYWdlO1xuXHR9XG5cblx0Ly8gZG9lcyBub3QgcmVqZWN0IHdoZW4gYSBmb3JlaWduIGxvY2sgaXMgZW5jb3VudGVyZWRcblx0Ly8gaXMgYWxzbyB1c2VkIGJ5IGRlbGV0ZUxvY2tcblx0cHVibGljIGZldGNoQ2FjaGVkTG9jayAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IFByb21pc2VJbnRlcmZhY2U8dW5kZWZpbmVkIHwgTG9ja1Rva2VuPiB7XG5cdFx0Y29uc3QgbG9jayA9IHRoaXMuZ2V0VmFsdWUoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHR0aGlzLmxvY2tJdGVtcyxcblx0XHQpO1xuXG5cdFx0aWYgKGxvY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihsb2NrKTtcblx0XHR9XG5cblx0XHRjb25zdCBwcm9taXNlID0gdGhpcy5nZXRWYWx1ZShcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMucHJvbWlzZXMsXG5cdFx0KTtcblxuXHRcdGlmIChwcm9taXNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBwcm9taXNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaExvY2sgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4pOiBQcm9taXNlSW50ZXJmYWNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IGVycm9ySGFuZGxlciA9IHRoaXMuZXJyb3JIYW5kbGVyO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmV0Y2hDYWNoZWRMb2NrKGl0ZW1FbnRyeSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRsb2NrSXRlbSA9PiB7XG5cdFx0XHRcdFx0aWYgKGxvY2tJdGVtICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBsb2NrSXRlbTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0TG9jayhpdGVtRW50cnkpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGxvY2tJdGVtID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gbG9ja0l0ZW0uaXNGb3JlaWduID9cblx0XHRcdFx0XHRcdGVycm9ySGFuZGxlci5yZWplY3QobG9ja0l0ZW0ubWVzc2FnZSkgOlxuXHRcdFx0XHRcdFx0bG9ja0l0ZW0udG9rZW47XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlcXVlc3RMb2NrIChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogUHJvbWlzZUludGVyZmFjZTxMb2NrVG9rZW4+IHtcblx0XHRjb25zdCB7aXRlbVR5cGUsIGl0ZW1JZH0gPSBpdGVtRW50cnk7XG5cblx0XHRjb25zdCBwcm9taXNlID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LmNyZWF0ZShcblx0XHRcdFx0J0xvY2t0b2tlbicsXG5cdFx0XHRcdHRoaXMua2V5U2VydmljZS5nZXRMb2NhbElkKCksXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpdGVtdHlwZTogaXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbTogaXRlbUlkLFxuXHRcdFx0XHR9LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5wcm9taXNlc1tpdGVtVHlwZV1baXRlbUlkXTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnNldFZhbHVlKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdFx0XHRcdCdMb2NrdG9rZW4nLFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZS5saW5rcy5Mb2NrdG9rZW5bMF0sXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0dGhpcy5sb2NrSXRlbXMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0ZXJyb3IgPT4ge1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnByb21pc2VzW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXG5cdFx0XHRcdFx0aWYgKGVycm9yLmNvZGUgPT09IDMwMSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0VmFsdWUoXG5cdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlzRm9yZWlnbjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR0aGlzLmxvY2tJdGVtcyxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0VmFsdWUoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRwcm9taXNlLFxuXHRcdFx0dGhpcy5wcm9taXNlcyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGRlbGV0ZUxvY2sgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4pOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5mZXRjaENhY2hlZExvY2soaXRlbUVudHJ5KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGNhY2hlZExvY2sgPT4ge1xuXHRcdFx0XHRcdC8vIHVuZGVmaW5lZDogbm90IHJlcXVlc3RlZCB5ZXRcblx0XHRcdFx0XHRpZiAoY2FjaGVkTG9jayA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGNhY2hlZExvY2suaXNGb3JlaWduKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmNsZWFyTG9jayhpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdFx0XHRcdC5kZWxldGUoXG5cdFx0XHRcdFx0XHRcdCdMb2NrdG9rZW4nLFxuXHRcdFx0XHRcdFx0XHRbY2FjaGVkTG9jay5pZF0sXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY2xlYXJMb2NrKGl0ZW1FbnRyeSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY2xlYXJMb2NrIChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbG9ja0l0ZW1zID0gdGhpcy5sb2NrSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdGlmIChsb2NrSXRlbXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWxldGUgbG9ja0l0ZW1zW2l0ZW1FbnRyeS5pdGVtSWRdO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRWYWx1ZTxUPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pixcblx0XHRtYXA6IEl0ZW1NYXA8VD4sXG5cdCk6IHVuZGVmaW5lZCB8IFQge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gaXRlbUVudHJ5Lml0ZW1UeXBlO1xuXG5cdFx0aWYgKG1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwW2l0ZW1UeXBlXVtpdGVtRW50cnkuaXRlbUlkXTtcblx0fVxuXG5cdHByaXZhdGUgc2V0VmFsdWU8VD4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4sXG5cdFx0dmFsdWU6IFQsXG5cdFx0bWFwOiBJdGVtTWFwPFQ+LFxuXHQpOiBUIHtcblx0XHRyZXR1cm4gY3JlYXRlUGF0aChcblx0XHRcdG1hcCxcblx0XHRcdFtcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0e30sXG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0XSxcblx0XHQpO1xuXHR9XG5cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0SXRlbU1hcCwgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuaW1wb3J0IHsgaGFzUHJvcGVydGllcyB9IGZyb20gJy4vVXRpbCc7XG5cbmNvbnN0IEVNUFRZX0VOVFJZID0ge307XG5cbmV4cG9ydCB0eXBlIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCA9IHtcblx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRpdGVtSWQ6IEl0ZW1JZCxcblx0aXRlbXM6IEFwaVJlcXVlc3RJdGVtTWFwXG59O1xuXG5leHBvcnQgY2xhc3MgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uIHtcblxuXHRwdWJsaWMgcGFyZW50TWFwOiBhbnkgPSB7fTtcblx0cHVibGljIGRlc3RpbmF0aW9uOiBBcGlSZXF1ZXN0SXRlbU1hcCA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0fVxuXG5cdHByb2Nlc3MgKCk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCB7XG5cdFx0aWYgKHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdBIFRyYW5zYWN0aW9uQ2FjaGUgcm9vdEl0ZW0gaXMgcmVxdWlyZWQgZm9yIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbicpO1xuXHRcdH1cblxuXHRcdHRoaXMucGFyZW50TWFwID0gdGhpcy5jcmVhdGVQYXJlbnRNYXAoKTtcblxuXHRcdHRoaXMucHJvY2Vzc0l0ZW1zKFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5yb290SXRlbS5pdGVtVHlwZSxcblx0XHRcdFt0aGlzLnRyYW5zYWN0aW9uLnJvb3RJdGVtXSxcblx0XHRcdHt9LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0aXRlbVR5cGU6IHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0uaXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQ6IHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0uaXRlbUlkLFxuXHRcdFx0aXRlbXM6IHRoaXMuZGVzdGluYXRpb24sXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlUGFyZW50TWFwICgpIHtcblx0XHRjb25zdCByZXN1bHQ6IHtcblx0XHRcdFtwYXJlbnRUeXBlOiBzdHJpbmddOiB7XG5cdFx0XHRcdFtwYXJlbnRJZDogbnVtYmVyXToge1xuXHRcdFx0XHRcdFtpdGVtVHlwZTogc3RyaW5nXTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlPj5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gPSB7fTtcblxuXHRcdC8vIHRvZG86IGFsc28gaW5jbHVkZSBwYXJlbnQncyBlbnRyaWVzID8gcHJvYmFibHkgbm90Li4uXG5cdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5lbnRyaWVzLmZvckVhY2goXG5cdFx0XHRpdGVtRW50cnkgPT4ge1xuXHRcdFx0XHRjb25zdCBpdGVtVHlwZSA9IGl0ZW1FbnRyeS5pdGVtVHlwZTtcblx0XHRcdFx0Y29uc3QgcGFyZW50ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHQvLyB3ZSBkb24ndCBjYXJlIGZvciBpdGVtcyB0aGF0IGFyZSBub3QgbGlua2VkIHRvIHRoZSByb290IGl0ZW1cblx0XHRcdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHBhcmVudFR5cGUgPSBwYXJlbnQuaXRlbVR5cGU7XG5cdFx0XHRcdGNvbnN0IHBhcmVudElkID0gcGFyZW50Lml0ZW1JZDtcblxuXHRcdFx0XHRpZiAocmVzdWx0W3BhcmVudFR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV0gPSB7fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdID0ge307XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0W3BhcmVudFR5cGVdW3BhcmVudElkXVtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJlc3VsdFtwYXJlbnRUeXBlXVtwYXJlbnRJZF1baXRlbVR5cGVdID0gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdW2l0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzSXRlbXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0bGlua0FjY3VtdWxhdG9yOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBJdGVtSWRbXX0sXG5cdCkge1xuXHRcdGlmICh0aGlzLmRlc3RpbmF0aW9uW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmRlc3RpbmF0aW9uW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdGlmIChsaW5rQWNjdW11bGF0b3JbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGxpbmtBY2N1bXVsYXRvcltpdGVtVHlwZV0gPSBbXTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblxuXHRcdFx0Ly8gZWFjaCBpdGVtIG9ubHkgaGFzIGEgc2luZ2xlIHBhcmVudCwgc28gd2UgY2FuIHNhZmVseSBkbyB0aGlzXG5cdFx0XHRpZiAodGhpcy5kZXN0aW5hdGlvbltpdGVtVHlwZV1baXRlbUlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsaW5rQWNjdW11bGF0b3JbaXRlbVR5cGVdLnB1c2goaXRlbUlkKTtcblxuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbltpdGVtVHlwZV1baXRlbUlkXSA9IHRoaXMucHJvY2Vzc0l0ZW0oaXRlbUVudHJ5KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NJdGVtPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0KToge3ZhbHVlcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sIGxpbmtzPzoge1tpdGVtVHlwZTogc3RyaW5nXTogSXRlbUlkW119fSB7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBpdGVtRW50cnkuaXRlbVR5cGU7XG5cdFx0Y29uc3QgaXRlbUlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblx0XHRjb25zdCBjaGlsZEl0ZW1zID0gdGhpcy5nZXRJdGVtc0J5UGFyZW50KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNoaWxkQ29sbGVjdGlvbnMgPSB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0Q29sbGVjdGlvbnNCeVBhcmVudChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmZvcm1hdFJlcXVlc3QoaXRlbUVudHJ5KTtcblx0XHRjb25zdCBsaW5rcyA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjaGlsZFR5cGUgaW4gY2hpbGRJdGVtcykge1xuXHRcdFx0dGhpcy5wcm9jZXNzSXRlbXMoXG5cdFx0XHRcdGNoaWxkVHlwZSxcblx0XHRcdFx0Y2hpbGRJdGVtc1tjaGlsZFR5cGVdLFxuXHRcdFx0XHRsaW5rcyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY2hpbGRDb2xsZWN0aW9ucykge1xuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLnF1ZXJ5ICE9PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnByb2Nlc3NJdGVtcyhcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHQvLyB0b2RvW2NhY2hlXSBVc2UgZ2V0Q29sbGVjdGlvbkNoYW5nZXNSZWN1cnNpdmVseVxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeS5pZF0sXG5cdFx0XHRcdGxpbmtzLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBoYXNWYWx1ZXMgPSBoYXNQcm9wZXJ0aWVzKHZhbHVlcyk7XG5cdFx0Y29uc3QgaGFzTGlua3MgPSBoYXNQcm9wZXJ0aWVzKGxpbmtzKTtcblxuXHRcdGlmIChoYXNWYWx1ZXMgJiYgaGFzTGlua3MpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHZhbHVlczogdmFsdWVzLFxuXHRcdFx0XHRsaW5rczogbGlua3MsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNWYWx1ZXMpIHtcblx0XHRcdHJldHVybiB7dmFsdWVzOiB2YWx1ZXN9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNMaW5rcykge1xuXHRcdFx0cmV0dXJuIHtsaW5rczogbGlua3N9O1xuXHRcdH1cblxuXHRcdHJldHVybiBFTVBUWV9FTlRSWTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0SXRlbXNCeVBhcmVudCAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWQ6IEl0ZW1JZCxcblx0KSB7XG5cdFx0Y29uc3QgbWFwRW50cnkgPSB0aGlzLnBhcmVudE1hcFtwYXJlbnRUeXBlXTtcblxuXHRcdGlmIChtYXBFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXG5cdFx0aWYgKG1hcEVudHJ5W3BhcmVudElkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hcEVudHJ5W3BhcmVudElkXTtcblx0fVxufVxuIiwiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IEFwaUZvcm1hdHRlciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBoYXNQcm9wZXJ0aWVzLCBpbkFycmF5IH0gZnJvbSAnLi9VdGlsJztcblxuY29uc3QgTUFZQkUgPSAnbWF5YmUnO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlNYXRjaGVyIHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRwdWJsaWMgZmllbGRzOiBGaWVsZE1hcCxcblx0XHRwdWJsaWMgcGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsLFxuXHQpIHtcblxuXHR9XG5cblx0cHJpdmF0ZSBjb21wYXJlVmFsdWVzIChcblx0XHR2YWx1ZTogYW55LFxuXHRcdHF1ZXJ5VmFsdWU6IGFueSxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKG1vbWVudC5pc01vbWVudChxdWVyeVZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmNvbXBhcmVNb21lbnRPYmplY3RzKFxuXHRcdFx0XHRxdWVyeVZhbHVlLFxuXHRcdFx0XHR2YWx1ZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1vbWVudC5pc0R1cmF0aW9uKHF1ZXJ5VmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuY29tcGFyZUR1cmF0aW9ucyhcblx0XHRcdFx0cXVlcnlWYWx1ZSxcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0cmV0dXJuIHF1ZXJ5VmFsdWUgPT0gdmFsdWU7XG5cdH1cblxuXHRtYXRjaFF1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0aWYgKHF1ZXJ5LnNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5LmN1c3RvbSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0Ly8gbGlua2VkVG8gYWxzbyBjb250YWlucyAucXVlcnlcblx0XHRpZiAocXVlcnkubGlua2VkVG8gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubWF0Y2hMaW5rZWRUb1F1ZXJ5KHF1ZXJ5KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkucXVlcnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIE1BWUJFO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5jb25kaXRpb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLm1hdGNoQ29tcGxleFF1ZXJ5KHF1ZXJ5KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkua2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLm1hdGNoU2ltcGxlUXVlcnkoXG5cdFx0XHRcdHRoaXMuZmllbGRzW3F1ZXJ5LmtleV0sXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAoIWhhc1Byb3BlcnRpZXMocXVlcnkpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5TWF0Y2hlcjogVW5zdXBwb3J0ZWQgcXVlcnkhIFBhcnNlZD8nKTtcblx0fVxuXG5cdHByaXZhdGUgbWF0Y2hMaW5rZWRUb1F1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0aWYgKHF1ZXJ5LnJldmVyc2UpIHtcblx0XHRcdHJldHVybiBNQVlCRTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblx0XHRsZXQgbWF0Y2g7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRtYXRjaCA9IGZhbHNlO1xuXHRcdH0gZWxzZSBpZiAocXVlcnkubGlua2VkVG8gIT09IHBhcmVudC5pdGVtVHlwZSkge1xuXHRcdFx0bWF0Y2ggPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2ggPSB0aGlzLm1hdGNoU2ltcGxlUXVlcnkoXG5cdFx0XHRcdHBhcmVudC5pdGVtSWQsXG5cdFx0XHRcdHF1ZXJ5LnF1ZXJ5LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAobWF0Y2ggPT09IE1BWUJFKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICFtYXRjaCA6ICEhbWF0Y2g7XG5cdH1cblxuXHRwcml2YXRlIG1hdGNoQ29tcGxleFF1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0Y29uc3QgY29uZGl0aW9ucyA9IHF1ZXJ5LmNvbmRpdGlvbnM7XG5cblx0XHRsZXQgcmVzdWx0O1xuXHRcdGxldCB0ZXJtaW5hbDtcblxuXHRcdHN3aXRjaCAocXVlcnkub3BlcmF0b3IpIHtcblx0XHRcdGNhc2UgJ0FORCc6XG5cdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cdFx0XHRcdHRlcm1pbmFsID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnT1InOlxuXHRcdFx0XHRyZXN1bHQgPSBmYWxzZTtcblx0XHRcdFx0dGVybWluYWwgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcigncXVlcnlNYXRjaGVyOiBVbnN1cHBvcnRlZCBvcGVyYXRvcicpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gdGhpcy5tYXRjaFF1ZXJ5KGNvbmRpdGlvbik7XG5cblx0XHRcdGlmIChtYXRjaCA9PT0gdGVybWluYWwpIHtcblx0XHRcdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICF0ZXJtaW5hbCA6IHRlcm1pbmFsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWF0Y2ggPT09IE1BWUJFKSB7XG5cdFx0XHRcdHJlc3VsdCA9IE1BWUJFO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyZXN1bHQgPT09IE1BWUJFKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICFyZXN1bHQgOiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIG1hdGNoU2ltcGxlUXVlcnkgKFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHQpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0Y29uc3Qga2V5ID0gcXVlcnkua2V5O1xuXHRcdGxldCBxdWVyeVZhbHVlID0gcXVlcnkudmFsdWU7XG5cblx0XHRpZiAoIWhhc1Byb3BlcnRpZXMocXVlcnkpKSAvLyBDb3VsZCBiZSBsaW5rZWRUbyBhbiBlbXB0eSBvYmplY3Rcblx0XHR7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHQnUmVxdWlyZWQgZmllbGQnLFxuXHRcdFx0XHRrZXksXG5cdFx0XHRcdCdub3QgZm91bmQgZm9yJyxcblx0XHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybiBNQVlCRTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnlWYWx1ZSA9PT0gJ05PVycpIHtcblx0XHRcdHF1ZXJ5VmFsdWUgPSBtb21lbnQoKTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKHF1ZXJ5LmNvbXBhcmF0b3IpIHtcblx0XHRcdGNhc2UgJz0nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb21wYXJlVmFsdWVzKFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHF1ZXJ5VmFsdWUsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICchPSc6XG5cdFx0XHRcdHJldHVybiAhdGhpcy5jb21wYXJlVmFsdWVzKFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHF1ZXJ5VmFsdWUsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICc8Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlIDwgcXVlcnlWYWx1ZTtcblx0XHRcdGNhc2UgJzw9Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlIDw9IHF1ZXJ5VmFsdWU7XG5cdFx0XHRjYXNlICc+Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID4gcXVlcnlWYWx1ZTtcblx0XHRcdGNhc2UgJz49Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID49IHF1ZXJ5VmFsdWU7XG5cdFx0XHRjYXNlICdJTic6XG5cdFx0XHRcdC8vIE9ubHkgSU4gc3VwcG9ydHMgTk9ULCBhbGwgb3RoZXIgY29tcGFyYXRvcnMgYXJlIGZsaXBwZWQgaW4gdGhlIFF1ZXJ5UGFyc2VyXG5cdFx0XHRcdGNvbnN0IHJlcyA9IGluQXJyYXkoXG5cdFx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdFx0cXVlcnlWYWx1ZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRyZXR1cm4gcXVlcnkubm90ID8gIXJlcyA6IHJlcztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcigncXVlcnlNYXRjaGVyOiBVbnN1cHBvcnRlZCBjb21wYXJhdG9yOiAnICsgcXVlcnkuY29tcGFyYXRvciArICcgaW4gcXVlcnkgJyArIHF1ZXJ5KTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ09NUEFSQVRPUlMsIE9QRVJBVE9SUywgT1BFUkFUT1JTX1RZUEUsIFF1ZXJ5UGFyc2VyQmFzZSB9IGZyb20gJy4vUXVlcnlQYXJzZXJCYXNlJztcblxuZXhwb3J0IGVudW0gQ09OU1RBTlRTIHtcblx0T0JKID0gMCxcblx0U1RSID0gMSxcblx0U0VQID0gJzonXG59XG5cbmNvbnN0IFZBTElEX0NPTVBBUkFUT1JTID0gT2JqZWN0LmtleXMoQ09NUEFSQVRPUlMpXG5cdC5tYXAoXG5cdFx0a2V5ID0+IENPTVBBUkFUT1JTW2tleV0sXG5cdCk7XG5cbmV4cG9ydCB0eXBlIENPTVBBUkFUT1JTX1RZUEUgPSAnPScgfCAnIT0nIHwgJzwnIHwgJz4nIHwgJzw9JyB8ICc+PScgfCAnSU4nIHwgQ09NUEFSQVRPUlM7XG5cbmNvbnN0IE9QUE9TSVRFX0NPTVBBUkFUT1JfTUFQOiB7IFtrZXkgaW4gQ09NUEFSQVRPUlNdOiBDT01QQVJBVE9SUyB9ID0ge1xuXHRbQ09NUEFSQVRPUlMuRVFVQUxTXTogQ09NUEFSQVRPUlMuTk9UX0VRVUFMUyxcblx0W0NPTVBBUkFUT1JTLk5PVF9FUVVBTFNdOiBDT01QQVJBVE9SUy5FUVVBTFMsXG5cdFtDT01QQVJBVE9SUy5NT1JFX1RIQU5dOiBDT01QQVJBVE9SUy5MRVNTX09SX0VRVUFMX1RIQU4sXG5cdFtDT01QQVJBVE9SUy5MRVNTX1RIQU5dOiBDT01QQVJBVE9SUy5FUVVBTF9PUl9NT1JFX1RIQU4sXG5cdFtDT01QQVJBVE9SUy5MRVNTX09SX0VRVUFMX1RIQU5dOiBDT01QQVJBVE9SUy5NT1JFX1RIQU4sXG5cdFtDT01QQVJBVE9SUy5FUVVBTF9PUl9NT1JFX1RIQU5dOiBDT01QQVJBVE9SUy5MRVNTX1RIQU4sXG5cdC8vIEluIHVzZXMgJ25vdDogdHJ1ZScgaW5zdGVhZCBvZiByZXZlcnNpbmcgdGhlIHF1ZXJ5XG5cdFtDT01QQVJBVE9SUy5JTl06IENPTVBBUkFUT1JTLklOLFxufTtcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5UGFyc2VyXG5cdGV4dGVuZHMgUXVlcnlQYXJzZXJCYXNlPFtvYmplY3QsIHN0cmluZ10+IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdHByaXZhdGUgcGFyYW1ldGVyczogb2JqZWN0LFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdHF1ZXJ5LFxuXHRcdCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VFbXB0eVF1ZXJ5ICgpIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e30sXG5cdFx0XHQne30nLFxuXHRcdF0gYXMgW29iamVjdCwgc3RyaW5nXTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZVN1YlF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRzdWJRdWVyeTogb2JqZWN0LFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMucGFyc2Uoc3ViUXVlcnkpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHRxdWVyeTogcGFyc2VkUXVlcnlbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdG5vdCxcblx0XHRcdH0sXG5cdFx0XHQnWycgKyAnc3ViJyArIENPTlNUQU5UUy5TRVAgKyBrZXkgKyBDT05TVEFOVFMuU0VQICsgcGFyc2VkUXVlcnlbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTdWJGaWVsZFF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyA9ICcnLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSA9ICcnLFxuXHRcdGZpZWxkOiBzdHJpbmcgPSAnJyxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdGNvbnN0IHBhcnNlZFF1ZXJ5ID0gdGhpcy5wYXJzZShxdWVyeSk7XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRrZXksXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRmaWVsZCxcblx0XHRcdFx0cXVlcnk6IHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuXHRcdFx0J1snICsgJ3N1YkZpZWxkJyArIENPTlNUQU5UUy5TRVAgKyBrZXkgKyBDT05TVEFOVFMuU0VQICsgaXRlbVR5cGUgKyBDT05TVEFOVFMuU0VQICsgZmllbGQgKyBDT05TVEFOVFMuU0VQICsgcGFyc2VkUXVlcnlbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTZWFyY2hRdWVyeSAoXG5cdFx0dmFsdWU6IGFueSxcblx0XHRub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0dmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlKHZhbHVlKTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdHNlYXJjaDogdmFsdWVbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdG5vdCxcblx0XHRcdH0sXG5cdFx0XHQnWycgKyAnc2VhcmNoJyArIENPTlNUQU5UUy5TRVAgKyB2YWx1ZVtDT05TVEFOVFMuU1RSXSArIENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXScsXG5cdFx0XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUN1c3RvbVF1ZXJ5IChcblx0XHRjdXN0b206IHN0cmluZyxcblx0XHRwYXJhbWV0ZXJzOiBhbnksXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdGlmIChwYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjdXN0b20sXG5cdFx0XHRcdFx0bm90LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnWycgKyBjdXN0b20gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdFx0XTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJzZWRQYXJhbWV0ZXJzID0gdGhpcy5wYXJzZUN1c3RvbVBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRjdXN0b20sXG5cdFx0XHRcdHBhcmFtZXRlcnM6IHBhcnNlZFBhcmFtZXRlcnNbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdG5vdCxcblx0XHRcdH0sXG5cdFx0XHQnWycgKyBjdXN0b20gKyBDT05TVEFOVFMuU0VQICsgcGFyc2VkUGFyYW1ldGVyc1tDT05TVEFOVFMuU1RSXSArIENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXScsXG5cdFx0XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUN1c3RvbVBhcmFtZXRlcnMgKHBhcmFtZXRlcnM6IGFueSk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKVxuXHRcdFx0LnNvcnQoKTtcblxuXHRcdGNvbnN0IHF1ZXJ5OiBBcGlRdWVyeSA9IHt9IGFzIEFwaVF1ZXJ5O1xuXHRcdGxldCBzdHJpbmcgPSAnJztcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qga2V5ID0ga2V5c1tpXTtcblx0XHRcdGNvbnN0IHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZShwYXJhbWV0ZXJzW2tleV0pO1xuXG5cdFx0XHRxdWVyeVtrZXldID0gdmFsdWVbQ09OU1RBTlRTLk9CSl07XG5cblx0XHRcdGlmIChpID4gMCkge1xuXHRcdFx0XHRzdHJpbmcgKz0gQ09OU1RBTlRTLlNFUDtcblx0XHRcdH1cblxuXHRcdFx0c3RyaW5nICs9IHZhbHVlW0NPTlNUQU5UUy5TVFJdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbXG5cdFx0XHRxdWVyeSxcblx0XHRcdHN0cmluZyxcblx0XHRdO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU2ltcGxlUXVlcnkgKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0Y29tcGFyYXRvcj86IENPTVBBUkFUT1JTX1RZUEUsXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZSh2YWx1ZSk7XG5cblx0XHRpZiAoY29tcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb21wYXJhdG9yID0gQXJyYXkuaXNBcnJheSh2YWx1ZVtDT05TVEFOVFMuT0JKXSkgPyBDT01QQVJBVE9SUy5JTiA6IENPTVBBUkFUT1JTLkVRVUFMUztcblx0XHR9XG5cblx0XHRpZiAoVkFMSURfQ09NUEFSQVRPUlMuaW5kZXhPZihjb21wYXJhdG9yKSA9PT0gLTEpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21wYXJhdG9yICcke2NvbXBhcmF0b3J9JywgaXQgbWlnaHQgYmUgdGhhdCB0aGUgYmFja2VuZCBzdXBwb3J0cyBpdCBidXQgdGhlIGZyb250ZW5kIGRvZXNuJ3QgIWApO1xuXHRcdH1cblxuXHRcdGlmIChub3QpIHtcblx0XHRcdGNvbXBhcmF0b3IgPSBPUFBPU0lURV9DT01QQVJBVE9SX01BUFtjb21wYXJhdG9yXTtcblx0XHR9XG5cblx0XHQvLyBBbGwgb3RoZXIgY29tcGFyYXRvcnMgY2FuIGJlIGludmVydGVkXG5cdFx0Y29uc3QgaXNOb3RJbiA9IGNvbXBhcmF0b3IgPT09IENPTVBBUkFUT1JTLklOICYmIG5vdDtcblxuXHRcdGNvbnN0IHJlc3VsdDogW29iamVjdCwgc3RyaW5nXSA9IFtcblx0XHRcdHtcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdGNvbXBhcmF0b3IsXG5cdFx0XHRcdG5vdDogaXNOb3RJbixcblx0XHRcdH0sXG5cdFx0XHQnWycgKyBjb21wYXJhdG9yICsgQ09OU1RBTlRTLlNFUCArIGtleSArIENPTlNUQU5UUy5TRVAgKyB2YWx1ZVtDT05TVEFOVFMuU1RSXSArICddJyxcblx0XHRdO1xuXG5cdFx0aWYgKGlzTm90SW4pIHtcblx0XHRcdHJlc3VsdFsxXSA9IHJlc3VsdFsxXS5zbGljZShcblx0XHRcdFx0MCxcblx0XHRcdFx0LTEsXG5cdFx0XHQpO1xuXHRcdFx0cmVzdWx0WzFdICs9IENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXSc7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUxpbmtlZFRvUXVlcnkgKFxuXHRcdGxpbmtlZFRvOiBhbnksXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5ID0ge30gYXMgQXBpUXVlcnksXG5cdFx0cmV2ZXJzZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMucGFyc2UocXVlcnkpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0bGlua2VkVG86IGxpbmtlZFRvLFxuXHRcdFx0XHRxdWVyeTogcGFyc2VkUXVlcnlbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdHJldmVyc2U6IHJldmVyc2UsXG5cdFx0XHRcdG5vdDogbm90LFxuXHRcdFx0fSxcblx0XHRcdCdbJyArICdsaW5rZWRUbycgKyBDT05TVEFOVFMuU0VQICsgbGlua2VkVG8gKyBDT05TVEFOVFMuU0VQICsgcGFyc2VkUXVlcnlbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgcmV2ZXJzZSArIENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXScsXG5cdFx0XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUNvbXBsZXhRdWVyeSAoXG5cdFx0Y29uZGl0aW9uczogYW55W10sXG5cdFx0b3BlcmF0b3I6IE9QRVJBVE9SU19UWVBFID0gT1BFUkFUT1JTLkFORCxcblx0XHRub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0b3BlcmF0b3IgPSBvcGVyYXRvci50b1VwcGVyQ2FzZSgpIGFzIE9QRVJBVE9SUztcblxuXHRcdGNvbnN0IHBhcnNlZENvbmRpdGlvbnMgPSB0aGlzLnBhcnNlQ29uZGl0aW9ucyhjb25kaXRpb25zKTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGNvbmRpdGlvbnM6IHBhcnNlZENvbmRpdGlvbnNbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdG9wZXJhdG9yLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgb3BlcmF0b3IgKyBwYXJzZWRDb25kaXRpb25zW0NPTlNUQU5UUy5TVFJdICsgQ09OU1RBTlRTLlNFUCArIG5vdCArICddJyxcblx0XHRdO1xuXHR9XG5cblx0cHJpdmF0ZSBwYXJzZUNvbmRpdGlvbnMgKGNvbmRpdGlvbnM6IGFueVtdKTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0bGV0IHBhcnNlZENvbmRpdGlvbnM6IEFycmF5PFtvYmplY3QsIHN0cmluZ10+ID0gW107XG5cdFx0Y29uc3QgcXVlcnk6IG9iamVjdFtdID0gW107XG5cdFx0bGV0IHN0cmluZyA9ICcnO1xuXG5cdFx0Zm9yIChjb25zdCBjb25kaXRpb24gb2YgY29uZGl0aW9ucykge1xuXHRcdFx0cGFyc2VkQ29uZGl0aW9ucy5wdXNoKHRoaXMucGFyc2UoY29uZGl0aW9uKSk7XG5cdFx0fVxuXG5cdFx0cGFyc2VkQ29uZGl0aW9ucyA9IHBhcnNlZENvbmRpdGlvbnMuc29ydCgoXG5cdFx0XHRhLFxuXHRcdFx0Yixcblx0XHQpID0+IHRoaXMuY29tcGFyZVBhcnNlZFF1ZXJpZXMoXG5cdFx0XHRhLFxuXHRcdFx0Yixcblx0XHQpKTtcblxuXHRcdGZvciAoY29uc3QgcGFyc2VkQ29uZGl0aW9uIG9mIHBhcnNlZENvbmRpdGlvbnMpIHtcblx0XHRcdHF1ZXJ5LnB1c2gocGFyc2VkQ29uZGl0aW9uW0NPTlNUQU5UUy5PQkpdKTtcblx0XHRcdHN0cmluZyArPSBwYXJzZWRDb25kaXRpb25bQ09OU1RBTlRTLlNUUl07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHF1ZXJ5LFxuXHRcdFx0c3RyaW5nLFxuXHRcdF07XG5cdH1cblxuXHRwcml2YXRlIGZvcm1hdFZhbHVlPFQ+ICh2YWx1ZTogVCk6IFtULCBzdHJpbmddIHtcblx0XHRsZXQgcHJvY2Vzc2VkVmFsdWU7XG5cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5jaGFyQXQoMCkgPT09ICcmJykge1xuXHRcdFx0Y29uc3Qga2V5ID0gdmFsdWUuc3Vic3RyaW5nKDEpO1xuXG5cdFx0XHR2YWx1ZSA9IHRoaXMucGFyYW1ldGVyc1trZXldO1xuXG5cdFx0XHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5UGFyc2VyOiBVbmRlZmluZWQgdGVtcGxhdGUgcGFyYW1ldGVyIFxcJycgKyBrZXkgKyAnXFwnJyk7XG5cdFx0XHR9XG5cblx0XHRcdHByb2Nlc3NlZFZhbHVlID0gdGhpcy5wcm9jZXNzVmFsdWUodmFsdWUpO1xuXG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRwcm9jZXNzZWRWYWx1ZSxcblx0XHRcdFx0a2V5ICsgJz4nICsgdmFsdWUsXG5cdFx0XHRdO1xuXHRcdH1cblxuXHRcdHByb2Nlc3NlZFZhbHVlID0gdGhpcy5wcm9jZXNzVmFsdWUodmFsdWUpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHByb2Nlc3NlZFZhbHVlLFxuXHRcdFx0JycgKyBwcm9jZXNzZWRWYWx1ZSxcblx0XHRdO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzVmFsdWU8VD4gKHZhbHVlOiBUW10pOiBUW107XG5cdHByaXZhdGUgcHJvY2Vzc1ZhbHVlICh2YWx1ZTogbW9tZW50Lk1vbWVudCk6IG1vbWVudC5Nb21lbnQ7XG5cdHByaXZhdGUgcHJvY2Vzc1ZhbHVlICh2YWx1ZTogbW9tZW50LkR1cmF0aW9uKTogbW9tZW50LkR1cmF0aW9uO1xuXHRwcml2YXRlIHByb2Nlc3NWYWx1ZTxUPiAodmFsdWU6IFQpOiBUO1xuXHRwcml2YXRlIHByb2Nlc3NWYWx1ZTxUPiAodmFsdWU6IFQgfCBUW10gfCBtb21lbnQuTW9tZW50IHwgbW9tZW50LkR1cmF0aW9uKSB7XG5cdFx0Ly8gYWxnb3JpdGhtIGlzIG5vdCBpbXBvcnRhbnQsIGFzIGxvbmcgYXMgYWxsIGFycmF5cyBhcmUgc29ydGVkIHRoZSBzYW1lIHdheVxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIHZhbHVlXG5cdFx0XHRcdC5zbGljZSgpXG5cdFx0XHRcdC5zb3J0KCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1vbWVudC5pc01vbWVudCh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiBtb21lbnQodmFsdWUpO1xuXHRcdH1cblxuXHRcdGlmIChtb21lbnQuaXNEdXJhdGlvbih2YWx1ZSkpIHtcblx0XHRcdHJldHVybiBtb21lbnQuZHVyYXRpb24odmFsdWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXG5cdHByaXZhdGUgY29tcGFyZVBhcnNlZFF1ZXJpZXMgKFxuXHRcdGE6IFtvYmplY3QsIHN0cmluZ10sXG5cdFx0YjogW29iamVjdCwgc3RyaW5nXSxcblx0KSB7XG5cdFx0aWYgKGFbQ09OU1RBTlRTLlNUUl0gPT09IGJbQ09OU1RBTlRTLlNUUl0pIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHJldHVybiBhW0NPTlNUQU5UUy5TVFJdID4gYltDT05TVEFOVFMuU1RSXSA/IDEgOiAtMTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpUXVlcnksIEVudHJ5UGFyZW50TnVsbCwgSXRlbUlkIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ09NUEFSQVRPUlMsIE9QRVJBVE9SUyB9IGZyb20gJy4vUXVlcnlQYXJzZXJCYXNlJztcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5U2VydmljZSB7XG5cdGNvbnN0cnVjdG9yICgpIHtcblx0fVxuXG5cdGFkZEFuZENvbmRpdGlvbiAoXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGNvbmRpdGlvbjogQXBpUXVlcnksXG5cdCk6IEFwaVF1ZXJ5IHtcblx0XHRpZiAocXVlcnkuY29uZGl0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHF1ZXJ5Lm9wZXJhdG9yID09PSBPUEVSQVRPUlMuT1IpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGNvbmRpdGlvbnM6IFtcblx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0XHRjb25kaXRpb24sXG5cdFx0XHRcdF0sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgYW4gJ2FuZCcgY29uZGl0aW9uXG5cdFx0cmV0dXJuIHtjb25kaXRpb25zOiBxdWVyeS5jb25kaXRpb25zLmNvbmNhdChjb25kaXRpb24pfTtcblx0fVxuXG5cdGFkZE9yQ29uZGl0aW9uIChcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0Y29uZGl0aW9uOiBBcGlRdWVyeSxcblx0KTogQXBpUXVlcnkge1xuXHRcdGlmIChxdWVyeS5vcGVyYXRvciA9PT0gT1BFUkFUT1JTLk9SKSB7XG5cdFx0XHRyZXR1cm4ge2NvbmRpdGlvbnM6IHF1ZXJ5LmNvbmRpdGlvbnMuY29uY2F0KGNvbmRpdGlvbil9O1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgYW4gJ2FuZCcgY29uZGl0aW9uXG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbmRpdGlvbnM6IFtcblx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdGNvbmRpdGlvbixcblx0XHRcdF0sXG5cdFx0XHRvcGVyYXRvcjogT1BFUkFUT1JTLk9SLFxuXHRcdH07XG5cdH1cblxuXHRhZGRQYXJlbnRDb25kaXRpb24gKFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0KTogQXBpUXVlcnkge1xuXHRcdGxldCBsaW5rZWRUb1F1ZXJ5O1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHF1ZXJ5O1xuXHRcdH1cblxuXHRcdGxpbmtlZFRvUXVlcnkgPSB7XG5cdFx0XHRsaW5rZWRUbzogcGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0cXVlcnk6IHBhcmVudC5pdGVtSWQsXG5cdFx0fTtcblxuXHRcdHJldHVybiBxdWVyeSA9PT0gbnVsbCA/IGxpbmtlZFRvUXVlcnkgOiB0aGlzLmFkZEFuZENvbmRpdGlvbihcblx0XHRcdHF1ZXJ5LFxuXHRcdFx0bGlua2VkVG9RdWVyeSxcblx0XHQpO1xuXHR9XG5cblx0Y3JlYXRlTm90SW4gKGlkQXJyYXk6IEl0ZW1JZFtdKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbXBhcmF0b3I6IENPTVBBUkFUT1JTLklOLFxuXHRcdFx0a2V5OiAnaWQnLFxuXHRcdFx0dmFsdWU6IGlkQXJyYXksXG5cdFx0XHRub3Q6IHRydWVcblx0XHR9O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5TZXQsIENvbHVtblV0aWwgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxudHlwZSBSZXF1ZXN0Q29sdW1uTWFwID0ge1tpdGVtVHlwZTogc3RyaW5nXTogQXBpUmVxdWVzdENvbHVtbnN9O1xuXG5leHBvcnQgY2xhc3MgUmVxdWVzdENvbHVtbkV4cGFuc2lvbiB7XG5cdHByaXZhdGUgY29sdW1uczogUmVxdWVzdENvbHVtbk1hcCA9IHt9O1xuXHRwcml2YXRlIGNvbHVtblNldElkTWFwOiB7W2NvbHVtblNldElkOiBudW1iZXJdOiBib29sZWFufSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucztcblxuXHRcdGlmIChjb2x1bW5zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb2x1bW5zW2l0ZW1UeXBlXSA9IFtdO1xuXHRcdH1cblxuXHRcdGNvbHVtbnNbaXRlbVR5cGVdID0gdGhpcy5jb2x1bW5VdGlsXG5cdFx0XHQubWVyZ2VSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdFx0Y29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0Lm1lcmdlZDtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmQ8VCBleHRlbmRzIENvbHVtblNldDxJdGVtVHlwZT4+IChjb2x1bW5TZXQ6IFQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5jb2x1bW5TZXRJZE1hcFtjb2x1bW5TZXQuaWRdKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucztcblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbHVtblNldC5pdGVtVHlwZTtcblxuXHRcdGlmIChjb2x1bW5zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb2x1bW5zW2l0ZW1UeXBlXSA9IFtdO1xuXHRcdH1cblxuXHRcdGNvbHVtbnNbaXRlbVR5cGVdID0gdGhpcy5jb2x1bW5VdGlsXG5cdFx0XHQubWVyZ2VSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdFx0Y29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdGNvbHVtblNldC5yZXF1ZXN0LFxuXHRcdFx0KVxuXHRcdFx0Lm1lcmdlZDtcblxuXHRcdHRoaXMuY29sdW1uU2V0SWRNYXBbY29sdW1uU2V0LmlkXSA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgZ2V0ICgpOiBSZXF1ZXN0Q29sdW1uTWFwIHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5zO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSwgVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcy9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uTWF0Y2hSZXN1bHQsXG5cdEZpZWxkTWFwLFxuXHRGdW5jdGlvbkNoYW5nZXNSZXNvbHZlU29ja2V0TWVzc2FnZSxcblx0SXRlbUlkLFxuXHRJdGVtVHlwZSxcblx0UHJvbWlzZUludGVyZmFjZSxcblx0UmVzcG9uc2VDb2x1bW4sXG5cdFNvY2tldE1lc3NhZ2UsXG5cdFNvY2tldE1lc3NhZ2VDcmVhdGUsXG5cdFNvY2tldE1lc3NhZ2VEZWxldGUsXG5cdFNvY2tldE1lc3NhZ2VMaW5rVG8sXG5cdFNvY2tldE1lc3NhZ2VVcGRhdGUsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YVJlc3VsdCB9IGZyb20gJy4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4vUmVxdWVzdEJ1ZmZlck1hbmFnZXInO1xuXG5leHBvcnQgdHlwZSBTb2NrZXRDb2xsZWN0aW9uTWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IHtbaXRlbUlkOiBudW1iZXJdOiBDb2xsZWN0aW9uTWF0Y2hSZXN1bHQ8SXRlbVR5cGVUeXBlPn07XG5cbmV4cG9ydCBjbGFzcyBTb2NrZXRNZXNzYWdlSGFuZGxlciB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcmVxdWVzdEJ1ZmZlck1hbmFnZXI6IFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdHByaXZhdGUgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRwcml2YXRlIGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSB0cmFuc2FjdGlvbkNhY2hlRmFjdG9yeTogVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIG9uTWVzc2FnZVJlY2VpdmVkIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlKTogYW55IHtcblx0XHRzd2l0Y2ggKG1lc3NhZ2UuYm9keS5ldmVudFR5cGUpIHtcblx0XHRcdGNhc2UgJ3VwZGF0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZVVwZGF0ZShtZXNzYWdlKTtcblx0XHRcdGNhc2UgJ2NyZWF0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZUNyZWF0ZShtZXNzYWdlKTtcblx0XHRcdGNhc2UgJ2RlbGV0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZURlbGV0ZShtZXNzYWdlKTtcblx0XHRcdGNhc2UgJ2xpbmtUbyc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZUxpbmtNb3ZlKG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZm9ybWF0TWVzc2FnZVZhbHVlcyAoXG5cdFx0dmFsdWVzOiBhbnksXG5cdFx0Y29sdW1uczogUmVzcG9uc2VDb2x1bW5bXSxcblx0KTogRmllbGRNYXAge1xuXHRcdGNvbnN0IHJlc3VsdDogRmllbGRNYXAgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gY29sdW1ucykge1xuXHRcdFx0cmVzdWx0W2NvbHVtbklkXSA9IHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlc3BvbnNlVmFsdWUoXG5cdFx0XHRcdGNvbHVtbnNbY29sdW1uSWRdLnR5cGUsXG5cdFx0XHRcdHZhbHVlc1tjb2x1bW5JZF0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxlY3Rpb25NYXA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1zOiB7W2l0ZW1JZDogbnVtYmVyXTogYW55fSxcblx0XHRjb2x1bW5zOiBSZXNwb25zZUNvbHVtbltdLFxuXHQpOiBTb2NrZXRDb2xsZWN0aW9uTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IHNlcnZlckNhY2hlID0gdGhpcy50cmFuc2FjdGlvbkNhY2hlRmFjdG9yeS5nZXRTZXJ2ZXJDYWNoZSgpO1xuXHRcdGNvbnN0IHJlc3VsdDogU29ja2V0Q29sbGVjdGlvbk1hcDxJdGVtVHlwZVR5cGU+ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBpdGVtcykge1xuXHRcdFx0Y29uc3QgaXRlbSA9IGl0ZW1zW2l0ZW1JZF07XG5cdFx0XHRjb25zdCBwYXJlbnQgPSBpdGVtLnBhcmVudCAhPT0gbnVsbCA/IGl0ZW0ucGFyZW50IDoge307XG5cdFx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLmZvcm1hdE1lc3NhZ2VWYWx1ZXMoXG5cdFx0XHRcdGl0ZW0udmFsdWVzLFxuXHRcdFx0XHRjb2x1bW5zLFxuXHRcdFx0KTtcblxuXHRcdFx0cmVzdWx0W2l0ZW1JZF0gPSBzZXJ2ZXJDYWNoZS5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLmdldEJ5Rml0dGluZ0l0ZW0oXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHR2YWx1ZXMsXG5cdFx0XHRcdHBhcmVudCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0UmVxdWVzdENvbHVtbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGNvbGxlY3Rpb25NYXA6IFNvY2tldENvbGxlY3Rpb25NYXA8SXRlbVR5cGVUeXBlPixcblx0KSB7XG5cdFx0Y29uc3Qgc2VydmVyQ2FjaGUgPSB0aGlzLnRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LmdldFNlcnZlckNhY2hlKCk7XG5cdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGNvbGxlY3Rpb25NYXApIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25zID0gY29sbGVjdGlvbk1hcFtpdGVtSWRdO1xuXHRcdFx0Y29uc3QgZml0dGluZ0NvbGxlY3Rpb25zID0gY29sbGVjdGlvbnMuZml0dGluZztcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0KTtcblxuXHRcdFx0Zm9yIChjb25zdCBmaXR0aW5nQ29sbGVjdGlvbiBvZiBmaXR0aW5nQ29sbGVjdGlvbnMpIHtcblx0XHRcdFx0Y29sdW1uRXhwYW5zaW9uLmV4cGFuZChmaXR0aW5nQ29sbGVjdGlvbi5jb2x1bW5zKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbHVtbkV4cGFuc2lvbi5leHBhbmQoaXRlbUVudHJ5LmNvbHVtbnMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjb2x1bW5FeHBhbnNpb24uZ2V0KCk7XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NNZXNzYWdlPFQgZXh0ZW5kcyBTb2NrZXRNZXNzYWdlWydib2R5J10+IChcblx0XHRib2R5OiBULFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRjb25zdCBzZXJ2ZXJDYWNoZSA9IHRoaXMudHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkuZ2V0U2VydmVyQ2FjaGUoKTtcblx0XHRjb25zdCBpdGVtVHlwZSA9IGJvZHkuaXRlbVR5cGU7XG5cdFx0Y29uc3QgcmVxdWVzdElkczogSXRlbUlkW10gPSBbXTtcblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25NYXAgPSB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25NYXAoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGJvZHkuaXRlbXNbaXRlbVR5cGVdLFxuXHRcdFx0Ym9keS5jb2x1bW5zW2l0ZW1UeXBlXSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbnMgPSB0aGlzLmdldFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRjb2xsZWN0aW9uTWFwLFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZFN0cmluZyBpbiBjb2xsZWN0aW9uTWFwKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZFN0cmluZyxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IGl0ZW1JZCA9ICtpdGVtSWRTdHJpbmc7XG5cblx0XHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXF1ZXN0SWRzLnB1c2goaXRlbUlkKTtcblxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25NYXBbaXRlbUlkXS5maXR0aW5nLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0cmVxdWVzdElkcy5wdXNoKGl0ZW1JZCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlcXVlc3RJZHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdC5xdWVyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6ICdpZCcsXG5cdFx0XHRcdFx0Y29tcGFyYXRvcjogJ0lOJyxcblx0XHRcdFx0XHR2YWx1ZTogcmVxdWVzdElkcyxcblx0XHRcdFx0fSxcblx0XHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBzZXJ2ZXJDYWNoZS5wcm9jZXNzUmVzcG9uc2UoXG5cdFx0XHRcdFx0XHRyZXNwb25zZSxcblx0XHRcdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NGdW5jdGlvbkNoYW5nZXNSZXNvbHZlPFQgZXh0ZW5kcyBTb2NrZXRNZXNzYWdlWydib2R5J10+IChcblx0XHRib2R5OiBULFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENoYW5nZXNEZWx0YVJlc3VsdD4ge1xuXHRcdGNvbnN0IHNlcnZlckNhY2hlID0gdGhpcy50cmFuc2FjdGlvbkNhY2hlRmFjdG9yeS5nZXRTZXJ2ZXJDYWNoZSgpO1xuXHRcdGNvbnN0IGl0ZW1zID0gYm9keS5pdGVtcy5GdW5jdGlvbkNoYW5nZXNSZXNvbHZlO1xuXHRcdGNvbnN0IHJlcXVlc3RJZHM6IEl0ZW1JZFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBpdGVtcykge1xuXHRcdFx0Y29uc3QgZnVuY3Rpb25JZCA9IGl0ZW1zW2l0ZW1JZF0ucGFyZW50Lml0ZW1JZDtcblx0XHRcdGNvbnN0IGZ1bmN0aW9uRW50cnkgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0J0Z1bmN0aWUnLFxuXHRcdFx0XHRmdW5jdGlvbklkLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRmdW5jdGlvbkVudHJ5ID09PSB1bmRlZmluZWRcblx0XHRcdFx0fHwgZnVuY3Rpb25FbnRyeS5jb2x1bW5zLnJlc3BvbnNlLkZ1bmN0aWUubmV3Y2hhbmdlcyA9PT0gdW5kZWZpbmVkXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHJlcXVlc3RJZHMucHVzaChmdW5jdGlvbklkKTtcblx0XHR9XG5cblx0XHRpZiAocmVxdWVzdElkcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlclxuXHRcdFx0LmZldGNoQnlJZHMoXG5cdFx0XHRcdCdGdW5jdGllJyxcblx0XHRcdFx0cmVxdWVzdElkcyxcblx0XHRcdFx0WyduZXdjaGFuZ2VzJ10sXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0YnVmZmVyUmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdC8vIHRvZG9bY2FjaGVdIGlzbid0IHRoaXMgYWxyZWFkeSBoYW5kbGVkIGluIHRoZSBSZXF1ZXN0QnVmZmVyID9cblx0XHRcdFx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2VJZHMgPSBidWZmZXJSZXNwb25zZS5yZXNwb25zZS5saW5rcy5GdW5jdGllO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgcmVzcG9uc2VJZHMpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRcdFx0XHQnRnVuY3RpZScsXG5cdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdCkhO1xuXG5cdFx0XHRcdFx0XHRjb25zdCBwcmV2aW91cyA9IHNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRcdFx0XHRcdGNvbnN0IHJlc3BvbnNlVmFsdWVzID0gYnVmZmVyUmVzcG9uc2UucmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdFx0XHRcdCdGdW5jdGllJyxcblx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VWYWx1ZXMgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZVZhbHVlcy5uZXdjaGFuZ2VzID09PSBwcmV2aW91cy5uZXdjaGFuZ2VzXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtVXBkYXRlZChcblx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHR7bmV3Y2hhbmdlczogcmVzcG9uc2VWYWx1ZXMubmV3Y2hhbmdlc30sXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBzZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNEZWx0YShcblx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQuY2F0Y2goXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLm5vdGlmeUVycm9yLFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgaXNGdW5jdGlvbkNoYW5nZXNSZXNvbHZlTWVzc2FnZSAobWVzc2FnZTogU29ja2V0TWVzc2FnZSk6IG1lc3NhZ2UgaXMgRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZVNvY2tldE1lc3NhZ2Uge1xuXHRcdHJldHVybiBtZXNzYWdlLmJvZHkuaXRlbVR5cGUgPT09ICdGdW5jdGlvbkNoYW5nZXNSZXNvbHZlJztcblx0fVxuXG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlIChtZXNzYWdlOiBGdW5jdGlvbkNoYW5nZXNSZXNvbHZlU29ja2V0TWVzc2FnZSk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD47XG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlQ3JlYXRlKTogUHJvbWlzZUludGVyZmFjZTxudWxsPjtcblx0cHJpdmF0ZSBoYW5kbGVDcmVhdGUgKG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2UpOiBhbnkge1xuXHRcdGNvbnN0IGJvZHkgPSBtZXNzYWdlLmJvZHk7XG5cblx0XHRpZiAodGhpcy5pc0Z1bmN0aW9uQ2hhbmdlc1Jlc29sdmVNZXNzYWdlKG1lc3NhZ2UpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZShib2R5KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LnByb2Nlc3NNZXNzYWdlKGJvZHkpXG5cdFx0XHQuY2F0Y2godGhpcy5lcnJvckhhbmRsZXIubm90aWZ5RXJyb3IpO1xuXHR9XG5cblx0cHJpdmF0ZSBoYW5kbGVVcGRhdGUgKG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2VVcGRhdGUpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LnByb2Nlc3NNZXNzYWdlKG1lc3NhZ2UuYm9keSlcblx0XHRcdC5jYXRjaCh0aGlzLmVycm9ySGFuZGxlci5ub3RpZnlFcnJvcik7XG5cdH1cblxuXHRwcml2YXRlIGhhbmRsZURlbGV0ZSAobWVzc2FnZTogU29ja2V0TWVzc2FnZURlbGV0ZSk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3RJbnRlcm5hbERlbHRhKCk7XG5cdFx0Y29uc3Qgc2VydmVyQ2FjaGUgPSB0aGlzLnRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LmdldFNlcnZlckNhY2hlKCk7XG5cdFx0Y29uc3QgYm9keSA9IG1lc3NhZ2UuYm9keTtcblx0XHRjb25zdCBlbnRyaWVzVG9CZURlbGV0ZWQ6IEl0ZW1FbnRyeVtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiBib2R5Lml0ZW1zKSB7XG5cdFx0XHRjb25zdCBjYWNoZWRFbnRyeSA9IHNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRib2R5Lml0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoY2FjaGVkRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0ZW50cmllc1RvQmVEZWxldGVkLnB1c2goY2FjaGVkRW50cnkpO1xuXHRcdH1cblxuXHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtc0RlbGV0ZWQoZW50cmllc1RvQmVEZWxldGVkKTtcblxuXHRcdHNlcnZlckNhY2hlLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQoXG5cdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRmYWxzZSxcblx0XHRcdHRydWUsXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0fVxuXG5cdHByaXZhdGUgaGFuZGxlTGlua01vdmUgKG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2VMaW5rVG8pOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzTWVzc2FnZShtZXNzYWdlLmJvZHkpXG5cdFx0XHQuY2F0Y2godGhpcy5lcnJvckhhbmRsZXIubm90aWZ5RXJyb3IpO1xuXHR9XG5cblx0LypcdGhhbmRsZUxpbmtNb3ZlIChtZXNzYWdlKSB7XG5cdCBwcm9jZXNzTWVzc2FnZShcblx0IG1lc3NhZ2UsXG5cdCBmdW5jdGlvbiAoY29sbGVjdGlvbiwgaXRlbUVudHJpZXMpIHtcblx0IC8vIGZpdHMgaW4gdGhpcyBjb2xsZWN0aW9uLCB0b2RvOiBnZXQgdGhlIG9sZCBjb2xsZWN0aW9uIGl0IGJlbG9uZ2VkIHRvXG5cdCBjb2xsZWN0aW9uLm1vdmVJdGVtcyhpdGVtRW50cmllcywgbnVsbCwgdHJ1ZSk7XG5cdCB9LFxuXHQgZnVuY3Rpb24gKGNvbGxlY3Rpb24sIGl0ZW1FbnRyaWVzKSB7XG5cdCAvLyBtYXliZSBmaXRzXG5cdCAvLyB0b2RvOiBhbHNvIHJlbW92ZSB0aGVtIGZyb20gdGhlIG9sZCBjb2xsZWN0aW9uXG5cdCBjb2xsZWN0aW9uLmV4dGVuZChhbmd1bGFyLmlkZW50aXR5LCBmYWxzZSwgZmFsc2UpO1xuXHQgfSxcblx0IGZ1bmN0aW9uIChjb2xsZWN0aW9uLCBpZHMpIHtcblx0IC8vIG5vdCBmaXR0aW5nIGluIHRoaXMgY29sbGVjdGlvbiwgcmVtb3ZlIGl0ID9cblx0IGNvbGxlY3Rpb24ucmVtb3ZlSXRlbXMoaWRzLCBudWxsLCBtZXNzYWdlKTtcblx0IH1cblx0ICk7XG5cdCB9XG5cdCAqL1xufVxuIiwiaW1wb3J0IHtcblx0Q29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0Q29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxufSBmcm9tICcuLi8uLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcy9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRDaGFuZ2VzRGVsdGEsXG5cdENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdENvbGxlY3Rpb25RdWVyeSxcblx0Q29sbGVjdGlvblJlc291cmNlLFxuXHRDb2x1bW5TdWJzZXRDYWNoZSxcblx0Q29sdW1uVXRpbCxcblx0Q29udmVyc2lvbk1hcCxcblx0RW50cnlQYXJlbnQsXG5cdEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdGlzRnVuY3Rpb24sXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdFByb21pc2VJbnRlcmZhY2UsXG59IGZyb20gJy4uLy4uLy4uL2luZGV4JztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgSXRlbUVudHJ5IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW4sXG5cdENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcCxcblx0SXRlbUlkLFxuXHRJdGVtVHlwZSxcblx0UXVlcnlDYWxsYmFjayxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0Q29sbGVjdGlvbk1hdGNoZXIsXG5cdENvbHVtbkhhbmRsZXIsXG5cdEtleVNlcnZpY2UsXG5cdFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIsXG59IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IENvbGxlY3Rpb25IYW5kbGVyQmFzZSB9IGZyb20gJy4uL0NvbGxlY3Rpb25IYW5kbGVyQmFzZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXJcblx0ZXh0ZW5kcyBDb2xsZWN0aW9uSGFuZGxlckJhc2Uge1xuXG5cdHB1YmxpYyBjb2xsZWN0aW9uUmVzb3VyY2VzOiB7XG5cdFx0W2NvbGxlY3Rpb25FbnRyeUlkOiBudW1iZXJdOiBDb2xsZWN0aW9uUmVzb3VyY2VbXVxuXHR9ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByaXZhdGUgY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5OiBDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIGl0ZW1IYW5kbGVyOiBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcml2YXRlIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwcml2YXRlIGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblxuXHR9XG5cblx0cHVibGljIGdldEFsbENvbGxlY3Rpb25zQnlJdGVtVHlwZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdCk6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJpZXM6IENvbGxlY3Rpb25FbnRyeVtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25FbnRyeUlkIGluIHRoaXMuY29sbGVjdGlvbkNoYW5nZXMpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0TG9jYWxDb2xsZWN0aW9uRW50cnkoTnVtYmVyKGNvbGxlY3Rpb25FbnRyeUlkKSk7XG5cblx0XHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IHVuZGVmaW5lZCAmJiBjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUgPT09IGl0ZW1UeXBlKSB7XG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyaWVzLnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJpZXM7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPiB7XG5cdFx0aWYgKCF0aGlzLmlzTG9jYWwob3B0aW9ucykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0XHQuY3JlYXRlQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN1cGVyLmNyZWF0ZUNvbGxlY3Rpb25FbnRyeShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDYWxscyB0aGUge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMub25JdGVtc0NyZWF0ZWQgb25JdGVtc0NyZWF0ZWR9IGNhbGxiYWNrIHdoZW5ldmVyIGEgY3JlYXRlIHJlcXVlc3QgaXMgZG9uZSBvbiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSB0aGF0IGZpdCBpbiB0aGUgY29sbGVjdGlvblxuXHQgKiBDYW4gYmUgdXNlZCB0byB1cGRhdGUgbWFwcyB0aGF0IHVzZSB7QGxpbmsgSXRlbUVudHJ5Lml0ZW1JZCBJdGVtRW50cnkuaXRlbUlkfVxuXHQgKlxuXHQgKiBAZGVwcmVjYXRlZFxuXHQgKiBZb3Ugc2hvdWxkIHVzZSBpdGVtUmVzb3VyY2Uub25DaGFuZ2UgYW5kIGNvbXBhcmUgcHJldmlvdXMuaWQgd2l0aCBmaWVsZHMuaWRcblx0ICovXG5cdHB1YmxpYyBvbkl0ZW1FbnRyaWVzQ3JlYXRlZCAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnksXG5cdFx0Y29udmVyc2lvbk1hcDogQ29udmVyc2lvbk1hcCxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VzID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cblx0XHRpZiAocmVzb3VyY2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0cmVzb3VyY2Uub3B0aW9ucy5vbkl0ZW1zQ3JlYXRlZChjb252ZXJzaW9uTWFwKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHRoaXMuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNsZWFyRW50cnkgKGVudHJ5OiBDb2xsZWN0aW9uRW50cnkpOiB2b2lkIHtcblx0XHR0aGlzLmVudHJpZXMuY2xlYXIoZW50cnkpO1xuXG5cdFx0ZGVsZXRlIHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tlbnRyeS5pZF07XG5cdFx0ZGVsZXRlIHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbZW50cnkuaWRdO1xuXHR9XG5cblx0cHVibGljIGFkZFJlc291cmNlIChyZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlKTogdm9pZCB7XG5cdFx0bGV0IHJlc291cmNlQXJyYXkgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdO1xuXG5cdFx0aWYgKHJlc291cmNlQXJyYXkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVzb3VyY2VBcnJheSA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tyZXNvdXJjZS5lbnRyeS5pZF0gPSBbXTtcblx0XHR9XG5cblx0XHRyZXNvdXJjZUFycmF5LnB1c2gocmVzb3VyY2UpO1xuXHR9XG5cblx0cHVibGljIGNsZWFyUmVzb3VyY2UgKHJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2UpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZXMgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdO1xuXHRcdGNvbnN0IGluZGV4ID0gcmVzb3VyY2VzLmluZGV4T2YocmVzb3VyY2UpO1xuXG5cdFx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdFx0cmVzb3VyY2VzLnNwbGljZShcblx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdDEsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChyZXNvdXJjZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRkZWxldGUgdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW3Jlc291cmNlLmVudHJ5LmlkXTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFVwZGF0ZXMgdGhlIHBhcmVudHMgb2YgdGhlIHBhc3NlZCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSwgcmV0dXJucyBgdm9pZGAgYmVjYXVzZSB5b3Ugc2hvdWxkIHVzZSB0aGUge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMub25BZGQgb25BZGR9IGFuZCB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucy5vblJlbW92ZSBvblJlbW92ZX0gY2FsbGJhY2tzXG5cdCAqL1xuXHRwdWJsaWMgbW92ZUl0ZW1zPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRzb3VyY2VDb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0ZGVzdGluYXRpb25Db2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IHZvaWQge1xuXHRcdGlmIChzb3VyY2VDb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUgIT09IGRlc3RpbmF0aW9uQ29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2NvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2U6IENhbm5vdCBtb3ZlIGl0ZW1zOiBpdGVtVHlwZSBtaXNtYXRjaCcpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdC8vIHRvZG9bY2FjaGVdIHBhcmVudCBudWxsID9cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1Nb3ZlZChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRkZXN0aW5hdGlvbkNvbGxlY3Rpb25FbnRyeS5wYXJlbnQhLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHR0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdH1cblxuXHRwdWJsaWMgZXh0ZW5kQ29sbGVjdGlvbkVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0cXVlcnlDYWxsYmFjazogUXVlcnlDYWxsYmFjayxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnlUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC50cmFuc2FjdGlvblxuXHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmV4dGVuZENvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0XHRxdWVyeUNhbGxiYWNrLFxuXHRcdFx0KTtcblx0fVxuXG5cdC8vIHRvZG9bY2FjaGVdIFdoYXQgaXMgY2xvbmluZyBhIGNvbGxlY3Rpb24gc3VwcG9zZWQgdG8gZG8gP1xuXHRwdWJsaWMgY2xvbmVDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdHNvdXJjZUVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnQsXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9LFxuXHQpOiBDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4ge1xuXHRcdGNvbnN0IHNvdXJjZUl0ZW1FbnRyaWVzID0gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlc1tzb3VyY2VFbnRyeS5pZF07XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25FbnRyeShcblx0XHRcdHNvdXJjZUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNsb25lT3B0aW9ucyhcblx0XHRcdFx0c291cmNlRW50cnkub3B0aW9ucyxcblx0XHRcdFx0cGFyZW50LFxuXHRcdFx0KSxcblx0XHQpO1xuXG5cdFx0aWYgKHNvdXJjZUVudHJ5LnBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3Qgc291cmNlUGFyZW50ID0gc291cmNlRW50cnkucGFyZW50O1xuXG5cdFx0XHRpZiAoY29udmVyc2lvbk1hcFtzb3VyY2VQYXJlbnQuaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udmVyc2lvbk1hcFtzb3VyY2VQYXJlbnQuaXRlbVR5cGVdID0ge307XG5cdFx0XHR9XG5cblx0XHRcdGNvbnZlcnNpb25NYXBbc291cmNlUGFyZW50Lml0ZW1UeXBlXVtzb3VyY2VQYXJlbnQuaXRlbUlkXSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0fVxuXG5cdFx0dGhpcy5pdGVtSGFuZGxlci5jbG9uZUl0ZW1FbnRyaWVzKFxuXHRcdFx0c291cmNlSXRlbUVudHJpZXMsXG5cdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHR9XG5cblx0cHVibGljIGdldENvbGxlY3Rpb25NYXRjaGVyICgpOiBDb2xsZWN0aW9uTWF0Y2hlciB7XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24sXG5cdFx0XHRpdGVtVHlwZSA9PiB0aGlzLmdldEFsbENvbGxlY3Rpb25zQnlJdGVtVHlwZShpdGVtVHlwZSksXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGlmICghdGhpcy5pc0xvY2FsKG9wdGlvbnMpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdFx0LmZldGNoQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG9wdGlvbnMuY29sdW1ucyk7XG5cdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkob3B0aW9ucyk7XG5cblx0XHR0aGlzLmV4cGFuZENvbHVtbnNXaXRoUXVlcnlDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0cGFyc2VkUXVlcnkub2JqZWN0LFxuXHRcdCk7XG5cblx0XHRsZXQgY29sbGVjdGlvbkVudHJ5O1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaENvbGxlY3Rpb25EYXRhKFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZSxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0cGFyc2VkUXVlcnksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0X2NvbGxlY3Rpb25FbnRyeSA9PiB7XG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0gX2NvbGxlY3Rpb25FbnRyeTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiBjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hMaW5rZWRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkQXJyYXk6IEl0ZW1JZFtdIHwgKCgpID0+IEl0ZW1JZFtdKSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGlmIChpc0Z1bmN0aW9uPCgpID0+IEl0ZW1JZFtdPihwYXJlbnRJZEFycmF5KSkge1xuXHRcdFx0cGFyZW50SWRBcnJheSA9IHBhcmVudElkQXJyYXkoKTtcblx0XHR9XG5cblx0XHRjb25zdCByZW1vdGVQYXJlbnRJZHM6IEl0ZW1JZFtdID0gW107XG5cdFx0Y29uc3QgbG9jYWxQYXJlbnRJZHM6IEl0ZW1JZFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiBwYXJlbnRJZEFycmF5KSB7XG5cdFx0XHRpZiAodGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChpdGVtSWQpKSB7XG5cdFx0XHRcdGxvY2FsUGFyZW50SWRzLnB1c2goaXRlbUlkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlbW90ZVBhcmVudElkcy5wdXNoKGl0ZW1JZCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Vcblx0XHRcdC5hbGwoe1xuXHRcdFx0XHRyZW1vdGU6IHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0XHRcdC5mZXRjaExpbmtlZENvbGxlY3Rpb25FbnRyaWVzKFxuXHRcdFx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0XHRcdHJlbW90ZVBhcmVudElkcyxcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRsb2NhbDogdGhpcy5mZXRjaExpbmtlZExvY2FsQ29sbGVjdGlvbkVudHJpZXMoXG5cdFx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0XHRsb2NhbFBhcmVudElkcyxcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHQpLFxuXHRcdFx0fSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXN1bHQgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHQuLi5yZXN1bHQucmVtb3RlLFxuXHRcdFx0XHRcdFx0Li4ucmVzdWx0LmxvY2FsLFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGV4cGFuZENvbGxlY3Rpb25FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRjb2xsZWN0aW9uczogQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXAsXG5cdFx0bmV3Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPiB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5leHBhbmRDb2xsZWN0aW9uRW50cmllcyhcblx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGNvbGxlY3Rpb25zLFxuXHRcdFx0XHRuZXdDb2x1bW5zLFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBleHRlbmRDb2xsZWN0aW9uRW50cmllczxUIGV4dGVuZHMgQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0XHRxdWVyeUNhbGxiYWNrOiBRdWVyeUNhbGxiYWNrLFxuXHRcdGNvbGxlY3Rpb25zOiBULFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmV4dGVuZENvbGxlY3Rpb25FbnRyaWVzKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0cXVlcnlDYWxsYmFjayxcblx0XHRcdFx0Y29sbGVjdGlvbnMsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGFkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlczxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHRcdGlzQ2FsbGVkQWZ0ZXJTb2NrZXRVcGRhdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogdm9pZCB7XG5cdFx0c3VwZXIuX2FkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0KCkgPT4gZmFsc2UsXG5cdFx0XHRpc0NhbGxlZEFmdGVyU29ja2V0VXBkYXRlLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgaXNMb2NhbCAob3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHBhcmVudCA9IG9wdGlvbnMucGFyZW50O1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKHBhcmVudC5pdGVtSWQpO1xuXHR9XG5cblx0cHVibGljIGV4cGFuZENvbGxlY3Rpb25FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdG5ld0NvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVR5cGU+IHtcblx0XHRjb25zdCB7ZGlmZmVyZW5jZX0gPSBjb2xsZWN0aW9uRW50cnkuY29sdW1ucy5tZXJnZVJlcXVlc3RDb2x1bW5zKG5ld0NvbHVtbnMpO1xuXG5cdFx0aWYgKGRpZmZlcmVuY2UgIT09IHRydWUgJiYgZGlmZmVyZW5jZS5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oY29sbGVjdGlvbkVudHJ5KTtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZTtcblxuXHRcdHJldHVybiB0aGlzLmNvbHVtbkhhbmRsZXJcblx0XHRcdC5mZXRjaChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGRpZmZlcmVuY2UsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlclxuXHRcdFx0XHRcdFx0LmV4cGFuZExvY2FsSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5LmlkXSxcblx0XHRcdFx0XHRcdFx0ZGlmZmVyZW5jZSxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSB0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRkaWZmZXJlbmNlLFxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LmV4cGFuZENvbHVtbnMoY29sdW1uRXhwYW5zaW9uKTtcblxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFdoZW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gYXJlIGFkZGVkIHRvIHRoZSBjaGFuZ2VzIG9mIGEge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9IGFsbCB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlIENvbGxlY3Rpb25SZXNvdXJjZXN9XG5cdCAqIHNob3VsZCBnZXQgbmV3IHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30gZm9yIHRoZSBuZXdseSBhZGRlZCBlbnRyaWVzXG5cdCAqL1xuXHRwcm90ZWN0ZWQgaGFuZGxlQWRkZWRJdGVtRW50cmllc0NhbGxiYWNrPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0YWRkZWRFbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2VzID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cblx0XHQvLyBXaGVuIHRoZXJlIGFyZSBubyBDb2xsZWN0aW9uUmVzb3VyY2VzIHdlIGRvbid0IGhhdmUgdG8gbWFrZSBJdGVtUmVzb3VyY2VzXG5cdFx0aWYgKFxuXHRcdFx0YWRkZWRFbnRyaWVzLmxlbmd0aCA9PT0gMFxuXHRcdFx0fHwgY29sbGVjdGlvblJlc291cmNlcyA9PT0gdW5kZWZpbmVkXG5cdFx0XHR8fCBjb2xsZWN0aW9uUmVzb3VyY2VzLmxlbmd0aCA9PT0gMFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvblJlc291cmNlIG9mIGNvbGxlY3Rpb25SZXNvdXJjZXMpIHtcblx0XHRcdGNvbGxlY3Rpb25SZXNvdXJjZS5hZGRJdGVtUmVzb3VyY2VzKGFkZGVkRW50cmllcyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBXaGVuIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IGFyZSByZW1vdmVkIGZyb20gdGhlIGNoYW5nZXMgb2YgYSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gdGhlIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30gb2YgdGhlIEl0ZW1FbnRyaWVzIHNob3VsZCBiZSByZW1vdmVkIGZyb20gYWxsIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgQ29sbGVjdGlvblJlc291cmNlc31cblx0ICovXG5cdHByb3RlY3RlZCBoYW5kbGVSZW1vdmVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdHJlbW92ZWRJdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29sbGVjdGlvblJlc291cmNlcyA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tjb2xsZWN0aW9uRW50cnkuaWRdO1xuXG5cdFx0aWYgKFxuXHRcdFx0cmVtb3ZlZEl0ZW1FbnRyaWVzLmxlbmd0aCA9PT0gMFxuXHRcdFx0fHwgY29sbGVjdGlvblJlc291cmNlcyA9PT0gdW5kZWZpbmVkXG5cdFx0XHR8fCBjb2xsZWN0aW9uUmVzb3VyY2VzLmxlbmd0aCA9PT0gMFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvblJlc291cmNlIG9mIGNvbGxlY3Rpb25SZXNvdXJjZXMpIHtcblx0XHRcdGNvbnN0IHJlbW92ZWRSZXNvdXJjZXMgPSBjb2xsZWN0aW9uUmVzb3VyY2UucmVtb3ZlSXRlbVJlc291cmNlcyhyZW1vdmVkSXRlbUVudHJpZXMpO1xuXG5cdFx0XHRjb2xsZWN0aW9uUmVzb3VyY2UuY2FsbE9uUmVtb3ZlKHJlbW92ZWRSZXNvdXJjZXMpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZmV0Y2hDb2xsZWN0aW9uRGF0YTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0Y29sdW1uU3Vic2V0Q2FjaGU6IENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0XHRjb2xsZWN0aW9uUXVlcnk6IENvbGxlY3Rpb25RdWVyeSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMuZW50cmllcy5nZXRCeVF1ZXJ5KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRjb2xsZWN0aW9uUXVlcnksXG5cdFx0KTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IG51bGwpIHtcblx0XHRcdC8vIFRoZXJlIGFscmVhZHkgaXMgYW4gZW50cnkgYW5kIGl0IGNvbnRhaW5zIHRoZSBjb2x1bW5zIHdlIG5lZWQsIHNvIHdlIGNhbiBzYWZlbHkgcmV0dXJuIGl0XG5cblx0XHRcdGlmIChjb2x1bW5TdWJzZXRDYWNoZS5ydW4oY29sbGVjdGlvbkVudHJ5LmNvbHVtbnMpKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuZXhwYW5kQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUucmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oXG5cdFx0XHR0aGlzLmNyZWF0ZUNvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHQpLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cmllc30gb2Ygd2hpY2ggdGhlIHBhcmVudHMgYXJlIGxvY2FsXG5cdCAqL1xuXHRwcml2YXRlIGZldGNoTGlua2VkTG9jYWxDb2xsZWN0aW9uRW50cmllcyAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCkge1xuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0XHRjb25zdCBjb2x1bW5TdWJzZXRDYWNoZSA9IHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChvcHRpb25zLmNvbHVtbnMpO1xuXHRcdGNvbnN0IHByb21pc2VzOiB7W3BhcmVudElkOiBzdHJpbmddOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeT59ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IHBhcmVudElkIG9mIHBhcmVudElkQXJyYXkpIHtcblx0XHRcdGNvbnN0IG5ld09wdGlvbnMgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY2xvbmVPcHRpb25zKFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aXRlbVR5cGU6IHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkOiBwYXJlbnRJZCxcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IHBhcnNlZFF1ZXJ5ID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KG5ld09wdGlvbnMpO1xuXG5cdFx0XHR0aGlzLmV4cGFuZENvbHVtbnNXaXRoUXVlcnlDb2x1bW5zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0bmV3T3B0aW9ucyxcblx0XHRcdFx0cGFyc2VkUXVlcnkub2JqZWN0LFxuXHRcdFx0KTtcblxuXHRcdFx0cHJvbWlzZXNbcGFyZW50SWRdID0gdGhpcy5mZXRjaENvbGxlY3Rpb25EYXRhKFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZSxcblx0XHRcdFx0bmV3T3B0aW9ucyxcblx0XHRcdFx0cGFyc2VkUXVlcnksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlXG5cdFx0XHQuYWxsKHByb21pc2VzKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwID0+IHtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdFx0XHQuYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKVxuXHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdCgpID0+IGNvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwLFxuXHRcdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ29sdW1uRXhwYW5zaW9uUmVzdWx0LCBFbnRyeVBhcmVudE51bGwsIEZpZWxkTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEl0ZW1FbnRyeVNlcnZpY2UgfSBmcm9tICcuL0l0ZW1FbnRyeVNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBDaGFuZ2VzRGVsdGFSZXN1bHQgPSB7XG5cdHJvbGxiYWNrOiAoKSA9PiB2b2lkLFxuXHRjcmVhdGVkOiBJdGVtRW50cnlbXVxuXHQvLyB0b2RvW2NhY2hlXSBvdGhlciBzdGF0dXNlc1xufTtcblxuLyoqXG4gKiBAcmVtYXJrXG4gKiBXZSBleHBsaWNpdGx5IGtlZXAgdHJhY2sgb2YgdGhlIG5ldyBwYXJlbnQsIHNvIHdlIGNhbiBzZXQgYW4gaXRlbSB0byBtb3ZlZCBpZiBpdCBpc24ndCBudWxsIChOZWVkZWQgZm9yIGxpbmtUbyByZXF1ZXN0KVxuICovXG5leHBvcnQgdHlwZSBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0ge1xuXHRlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdGNoYW5nZXM6IHtcblx0XHRleHBhbmRlZENvbHVtbnM6IENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtVHlwZVR5cGU+IHwgbnVsbCxcblx0XHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdH1cbn07XG5cbmV4cG9ydCB0eXBlIENoYW5nZXNEZWx0YUl0ZW1EZWxldGVEZWx0YSA9IEl0ZW1FbnRyeVtdO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2hhbmdlc0RlbHRhQmFzZSB7XG5cblx0cHVibGljIHVwZGF0ZWQ6IHtcblx0XHRbaXRlbUVudHJ5SWQ6IG51bWJlcl06IENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YVxuXHR9ID0ge307XG5cblx0cHVibGljIGRlbGV0ZWQ6IHtcblx0XHRbaXRlbVR5cGU6IHN0cmluZ106IENoYW5nZXNEZWx0YUl0ZW1EZWxldGVEZWx0YVxuXHR9ID0ge307XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0KSB7XG5cblx0fVxuXG5cdHB1YmxpYyBzZXRJdGVtVXBkYXRlZDxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeVR5cGUsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPixcblx0XHRjb2x1bW5FeHBhbnNpb25SZXN1bHQ6IENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPiB8IG51bGwgPSBudWxsLFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbCxcblx0KTogdm9pZCB7XG5cdFx0aWYgKHRoaXMudXBkYXRlZFtlbnRyeS5pZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy51cGRhdGVkW2VudHJ5LmlkXSA9IHtcblx0XHRcdFx0ZW50cnk6IGVudHJ5LFxuXHRcdFx0XHRjaGFuZ2VzOiB7XG5cdFx0XHRcdFx0ZmllbGRzOiB7fSxcblx0XHRcdFx0XHRleHBhbmRlZENvbHVtbnM6IG51bGwsXG5cdFx0XHRcdFx0cGFyZW50OiBwYXJlbnQsXG5cdFx0XHRcdH0sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoYW5nZXNFbnRyeSA9IHRoaXMudXBkYXRlZFtlbnRyeS5pZF07XG5cblx0XHRpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBwYXJlbnRGaWVsZHMgPSB0aGlzLml0ZW1FbnRyeVNlcnZpY2UuZ2V0TGlua0ZpZWxkc0J5UGFyZW50KFxuXHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdGVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0KTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBwYXJlbnRGaWVsZHMpIHtcblx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IHBhcmVudEZpZWxkc1tjb2x1bW5JZF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBmaWVsZCBpbiBmaWVsZHMpIHtcblx0XHRcdGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuXHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdGZpZWxkLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGRlc2MgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRcdFx0Y2hhbmdlc0VudHJ5LmNoYW5nZXMuZmllbGRzLFxuXHRcdFx0XHRcdGZpZWxkLFxuXHRcdFx0XHRcdGRlc2MsXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjaGFuZ2VzRW50cnkuY2hhbmdlcy5maWVsZHNbZmllbGRdID0gZmllbGRzW2ZpZWxkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoY29sdW1uRXhwYW5zaW9uUmVzdWx0ICE9PSBudWxsKSB7XG5cdFx0XHRjaGFuZ2VzRW50cnkuY2hhbmdlcy5leHBhbmRlZENvbHVtbnMgPSBjb2x1bW5FeHBhbnNpb25SZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldEl0ZW1EZWxldGVkIChcblx0XHRkZWxldGVkOiBJdGVtRW50cnksXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMuc2V0SXRlbXNEZWxldGVkKFxuXHRcdFx0W2RlbGV0ZWRdLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0SXRlbXNEZWxldGVkIChcblx0XHRkZWxldGVkOiBJdGVtRW50cnlbXSxcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgZGVsZXRlZCkge1xuXHRcdFx0aWYgKHRoaXMuZGVsZXRlZFtpdGVtRW50cnkuaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5kZWxldGVkW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV06IGRvIHdlIHJlYWxseSBoYXZlIHRvIGNoZWNrIHRoaXMgPyBkZWxldGluZyBtdWx0aXBsZSB0aW1lcyBkb2Vzbid0IG1hdHRlclxuXHRcdFx0Ly8gdG9kb1tjYWNoZV06IHRoaXMgY291bGQgYWxzbyBiZSBhIG1hcCBvZiBlbnRyeUlkIC0+IGl0ZW1FbnRyeVxuXHRcdFx0aWYgKHRoaXMuZGVsZXRlZFtpdGVtRW50cnkuaXRlbVR5cGVdLmluZGV4T2YoaXRlbUVudHJ5KSA+IC0xKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmRlbGV0ZWRbaXRlbUVudHJ5Lml0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnQsIEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFCYXNlIH0gZnJvbSAnLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IENvbHVtblNldCB9IGZyb20gJy4vQ29sdW1uU2V0JztcbmltcG9ydCB7IEl0ZW1FbnRyeVNlcnZpY2UgfSBmcm9tICcuL0l0ZW1FbnRyeVNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0ge1xuXHRpdGVtSWQ6IEl0ZW1JZCxcblx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRjb2x1bW5zOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDaGFuZ2VzRGVsdGEgdXNlZCB0byBhcHBseSBjaGFuZ2VzIGZyb20gb3V0c2lkZSBvZiB0aGUgY29yZSB0byBhIHRyYW5zYWN0aW9uXG4gKlxuICogLS0tLS0tLS0tLVxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4ge0BsaW5rIEludGVybmFsQ2hhbmdlc0RlbHRhIEludGVybmFsQ2hhbmdlc0RlbHRhfSBhbmQge0BsaW5rIENoYW5nZXNEZWx0YSBDaGFuZ2VzRGVsdGF9IGlzIHRoYXQgdGhlIENoYW5nZXNEZWx0YVxuICogYXNzdW1lcyAnY3JlYXRlZCcgdmFsdWVzIGhhdmUgbm8gaXRlbUVudHJpZXMgeWV0LlxuICpcbiAqIFVzZSB0aGlzIHdoZW4gY2FsbGluZyB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBhcHBseUNoYW5nZXNEZWx0YX1cbiAqL1xuZXhwb3J0IGNsYXNzIENoYW5nZXNEZWx0YVxuXHRleHRlbmRzIENoYW5nZXNEZWx0YUJhc2Uge1xuXG5cdHB1YmxpYyBjcmVhdGVkOiBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGFbXSA9IFtdO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogV2lsbCBjcmVhdGUgYW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IHdoZW4gdGhlIGRlbHRhIGlzIGFwcGxpZWRcblx0ICogRG9lcyBub3QgYWx3YXlzIG1lYW4gdGhlIGl0ZW0gaXMgbG9jYWwsIGp1c3QgdGhhdCBpdCBpc24ndCBjYWNoZWQgeWV0XG5cdCAqXG5cdCAqIC0tLS0tLVxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIFdoZW4gdGhlIGBwYXJlbnRgIHByb3BlcnR5IGlzIHBhc3NlZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBwcm9wZXIgZmllbGRzIHRvIG1hdGNoIHRoZSBwYXJlbnQsIHRoaXMgYXNzdW1lcyB0aGUgcmVxdWlyZWQgcGFyZW50IGNvbHVtbnMgYXJlIGluIHRoZSBwYXNzZWQgY29sdW1uc1xuXHQgKiBZb3UgY2FuIGVhc2lseSBnZXQgdGhlIHJlcXVpcmVkIGNvbHVtbnMgYnkgYWxzbyBwYXNzaW5nIHRoZSBgcGFyZW50YCB0byB0aGUge0BsaW5rIFRlbXBsYXRlQ2FjaGUuZmV0Y2hUZW1wbGF0ZSB0ZW1wbGF0ZSBmZXRjaENvbGxlY3Rpb25FbnRyeX0gY2FsbFxuXHQgKi9cblx0cHVibGljIHNldEl0ZW1DcmVhdGVkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+LFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbCxcblx0KTogdm9pZCB7XG5cdFx0bGV0IHBhcmVudEZpZWxkczogUGFydGlhbDxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PiA9IHt9O1xuXG5cdFx0aWYgKHBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0cGFyZW50RmllbGRzID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudChcblx0XHRcdFx0cGFyZW50LFxuXHRcdFx0XHRjb2x1bW5zLml0ZW1UeXBlLFxuXHRcdFx0KTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBwYXJlbnRGaWVsZHMpIHtcblx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IHBhcmVudEZpZWxkc1tjb2x1bW5JZF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGVmYXVsdFZhbHVlcyA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRMb2NhbERlZmF1bHRWYWx1ZXMoKTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gZGVmYXVsdFZhbHVlcykge1xuXHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IGRlZmF1bHRWYWx1ZXNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdHRoaXMuY3JlYXRlZC5wdXNoKHtcblx0XHRcdGl0ZW1JZDogaXRlbUlkLFxuXHRcdFx0ZmllbGRzOiBmaWVsZHMsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBhc3NpZ24gdGhlIHByb3BlciBwYXJlbnQgZmllbGRzLCB3aWxsIGNhbGwge0BsaW5rIENoYW5nZXNEZWx0YUJhc2Uuc2V0SXRlbVVwZGF0ZWQgc2V0SXRlbVVwZGF0ZWR9IGludGVybmFsbHlcblx0ICovXG5cdHB1YmxpYyBzZXRJdGVtTW92ZWQgKFxuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0dG86IEVudHJ5UGFyZW50LFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0ZW50cnksXG5cdFx0XHR7fSxcblx0XHRcdG51bGwsXG5cdFx0XHR0byxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnQsIEZpZWxkTWFwLCBJdGVtSWRDb252ZXJzaW9uTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUJhc2UgfSBmcm9tICcuL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4vSXRlbUVudHJ5U2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIEludGVybmFsQ3JlYXRlRGVsdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0ge1xuXHRlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDaGFuZ2VzRGVsdGEgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb3JlXG4gKlxuICogLS0tLS0tLS0tLVxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4ge0BsaW5rIEludGVybmFsQ2hhbmdlc0RlbHRhIEludGVybmFsQ2hhbmdlc0RlbHRhfSBhbmQge0BsaW5rIENoYW5nZXNEZWx0YSBDaGFuZ2VzRGVsdGF9IGlzIHRoYXQgdGhlIEludGVybmFsQ2hhbmdlc0RlbHRhXG4gKiBhc3N1bWVzICdjcmVhdGVkJyBlbnRyaWVzIGFyZSBhbHJlYWR5IGV4aXN0aW5nLCBzbyBpdCBoYXMgYSBkaWZmZXJlbnQgZm9ybWF0LlxuICpcbiAqIFVzZSB0aGlzIHdoZW4gY2FsbGluZyB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50IGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnR9IGFuZCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tQ2hpbGQgYXBwbHlDaGFuZ2VzRnJvbUNoaWxkfVxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxDaGFuZ2VzRGVsdGFcblx0ZXh0ZW5kcyBDaGFuZ2VzRGVsdGFCYXNlIHtcblxuXHRwdWJsaWMgY3JlYXRlZDoge1xuXHRcdFtpdGVtRW50cnlJZDogc3RyaW5nXTogSW50ZXJuYWxDcmVhdGVEZWx0YVxuXHR9ID0ge307XG5cblx0cHVibGljIG1vdmVkOiB7XG5cdFx0W2l0ZW1FbnRyeUlkOiBudW1iZXJdOiB7XG5cdFx0XHRlbnRyeTogSXRlbUVudHJ5LFxuXHRcdFx0dG86IEVudHJ5UGFyZW50XG5cdFx0fVxuXHR9ID0ge307XG5cblx0cHVibGljIGl0ZW1JZENvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAgPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0aXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0SXRlbUNyZWF0ZWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5jcmVhdGVkW2l0ZW1FbnRyeS5pZF0gPSB7XG5cdFx0XHRlbnRyeTogaXRlbUVudHJ5LFxuXHRcdFx0ZmllbGRzOiBmaWVsZHMsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmVtYXJrXG5cdCAqIFBhcmVudCBmaWVsZHMgYXJlIG5vbi13cml0YWJsZSBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgbW92ZWQgZW50cmllcyBhbm90aGVyIHdheSAodG8gZG8gYSBsaW5rVG8gcmVxdWVzdClcblx0ICovXG5cdHB1YmxpYyBzZXRJdGVtTW92ZWQgKFxuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0dG86IEVudHJ5UGFyZW50LFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLm1vdmVkW2VudHJ5LmlkXSA9IHtcblx0XHRcdGVudHJ5OiBlbnRyeSxcblx0XHRcdHRvOiB0byxcblx0XHR9O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBEZWZlcnJlZCwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi9BcGlSZXF1ZXN0U2VydmljZSc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvciB9IGZyb20gJy4vQXBpUmVzcG9uc2VQcm9jZXNzb3InO1xuaW1wb3J0IHsgU2VydmVyQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3NlcnZlci9TZXJ2ZXJDYWNoZSc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uIH0gZnJvbSAnLi9SZXF1ZXN0Q29sdW1uRXhwYW5zaW9uJztcblxuZXhwb3J0IHR5cGUgUmVxdWVzdEJ1ZmZlclJlc3BvbnNlID0gQXBpUmVzcG9uc2VQcm9jZXNzb3I7XG5cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0QnVmZmVyIHtcblxuXHRwcml2YXRlIGRlZmVycmVkOiBEZWZlcnJlZDxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+ID0gdGhpcy5wcm9taXNlTGlicmFyeS5kZWZlcigpO1xuXHRwcml2YXRlIHJlcXVlc3RDb2x1bW5FeHBhbnNpb246IFJlcXVlc3RDb2x1bW5FeHBhbnNpb24gPSB0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRwcml2YXRlIHNpbmdsZUl0ZW1JZHM6IEl0ZW1JZFtdID0gW107XG5cdHByaXZhdGUgcXVlcmllczoge1txdWVyeVN0cmluZzogc3RyaW5nXTogQXBpUXVlcnl9ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcHJvbWlzZUxpYnJhcnk6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgc2VydmVyQ2FjaGU6IFNlcnZlckNhY2hlLFxuXHRcdHByaXZhdGUgaXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIGNvbnRhaW5zSWQgKFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5zaW5nbGVJdGVtSWRzLmluZGV4T2YoaXRlbUlkKSAhPT0gLTE7XG5cdH1cblxuXHRwdWJsaWMgY29udGFpbnNRdWVyeSAoXG5cdFx0cXVlcnlTdHJpbmc6IHN0cmluZyxcblx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMucXVlcmllc1txdWVyeVN0cmluZ10gIT09IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBhZGRTaW5nbGVJdGVtIChcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVxdWVzdEJ1ZmZlclJlc3BvbnNlPiB7XG5cdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0aWYgKHRoaXMuc2luZ2xlSXRlbUlkcy5pbmRleE9mKGl0ZW1JZCkgPT09IC0xKSB7XG5cdFx0XHR0aGlzLnNpbmdsZUl0ZW1JZHMucHVzaChpdGVtSWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmdldFByb21pc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBhZGRRdWVyeSAoXG5cdFx0cXVlcnk6IFtvYmplY3QsIHN0cmluZ10sXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHR0aGlzLml0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0KTtcblxuXHRcdGlmICh0aGlzLnF1ZXJpZXNbcXVlcnlbMV1dID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMucXVlcmllc1txdWVyeVsxXV0gPSBxdWVyeVswXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgZmx1c2ggKCk6IFByb21pc2VJbnRlcmZhY2U8UmVxdWVzdEJ1ZmZlclJlc3BvbnNlPiB7XG5cdFx0Y29uc3QgY29uZGl0aW9uczogYW55W10gPSBbXTtcblxuXHRcdGlmICh0aGlzLnNpbmdsZUl0ZW1JZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uZGl0aW9ucy5wdXNoKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5OiAnaWQnLFxuXHRcdFx0XHRcdGNvbXBhcmF0b3I6ICdJTicsXG5cdFx0XHRcdFx0dmFsdWU6IHRoaXMuc2luZ2xlSXRlbUlkcyxcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBxdWVyeVN0cmluZyBpbiB0aGlzLnF1ZXJpZXMpIHtcblx0XHRcdGNvbmRpdGlvbnMucHVzaCh0aGlzLnF1ZXJpZXNbcXVlcnlTdHJpbmddKTtcblx0XHR9XG5cblx0XHRpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVHJpZWQgdG8gZmx1c2ggYSBSZXF1ZXN0QnVmZmVyIHdpdGhvdXQgc2luZ2xlSXRlbXMgb3IgcXVlcmllcycpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlcXVlc3RDb2x1bW5zID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmdldCgpO1xuXG5cdFx0bGV0IHJlc3BvbnNlOiBBcGlSZXNwb25zZVByb2Nlc3NvcjtcblxuXHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdC5xdWVyeShcblx0XHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbmRpdGlvbnM6IGNvbmRpdGlvbnMsXG5cdFx0XHRcdFx0b3BlcmF0b3I6ICdPUicsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdF9yZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0cmVzcG9uc2UgPSBfcmVzcG9uc2U7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXJ2ZXJDYWNoZS5wcm9jZXNzUmVzcG9uc2UoXG5cdFx0XHRcdFx0XHRyZXNwb25zZSxcblx0XHRcdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvciA9PiB0aGlzLmRlZmVycmVkLnJlamVjdChlcnJvciksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gdGhpcy5kZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKSxcblx0XHRcdFx0ZXJyb3IgPT4gdGhpcy5kZWZlcnJlZC5yZWplY3QoZXJyb3IpLFxuXHRcdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLmdldFByb21pc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRQcm9taXNlICgpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdHJldHVybiB0aGlzLmRlZmVycmVkLnByb21pc2U7XG5cdH1cbn1cbiIsImltcG9ydCB7IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtSWQsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuL0FwaVJlcXVlc3RTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlUHJvY2Vzc29yIH0gZnJvbSAnLi9BcGlSZXNwb25zZVByb2Nlc3Nvcic7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IEtleVNlcnZpY2UgfSBmcm9tICcuL0tleVNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdEJ1ZmZlciwgUmVxdWVzdEJ1ZmZlclJlc3BvbnNlIH0gZnJvbSAnLi9SZXF1ZXN0QnVmZmVyJztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL1V0aWwnO1xuXG5jb25zdCBCVUZGRVJfRkxVU0hfVElNRU9VVF9NUzogbnVtYmVyID0gMTUwO1xuXG5leHBvcnQgY2xhc3MgUmVxdWVzdEJ1ZmZlck1hbmFnZXIge1xuXG5cdHByaXZhdGUgcGVuZGluZ0J1ZmZlck1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogUmVxdWVzdEJ1ZmZlcn0gPSB7fTtcblx0cHJpdmF0ZSBwZW5kaW5nVHJ1ZUJ1ZmZlck1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogUmVxdWVzdEJ1ZmZlcn0gPSB7fTtcblxuXHRwcml2YXRlIHBlbmRpbmdRdWVyeUJ1ZmZlck1hcDoge1tpdGVtVHlwZTogc3RyaW5nXToge1txdWVyeVN0cmluZzogc3RyaW5nXTogUmVxdWVzdEJ1ZmZlcn19ID0ge307XG5cdHByaXZhdGUgcGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiB7W2xvY2FsSXRlbUlkOiBzdHJpbmddOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPn19ID0ge307XG5cblx0cHJpdmF0ZSBzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGU7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcHJvbWlzZUxpYnJhcnk6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIHNldFNlcnZlckNhY2hlIChzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGUpOiB2b2lkIHtcblx0XHR0aGlzLnNlcnZlckNhY2hlID0gc2VydmVyQ2FjaGU7XG5cdH1cblxuXHRwdWJsaWMgY29udGFpbnNJZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpOiBib29sZWFuIHtcblx0XHRpZiAoZ2V0UGF0aChcblx0XHRcdHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwLFxuXHRcdFx0W1xuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XSxcblx0XHQpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5wZW5kaW5nQnVmZmVyTWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGVuZGluZ0J1ZmZlck1hcFtpdGVtVHlwZV0uY29udGFpbnNJZChpdGVtSWQpO1xuXHR9XG5cblx0cHVibGljIGNvbnRhaW5zUXVlcnkgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZ2V0UGF0aChcblx0XHRcdHRoaXMucGVuZGluZ1F1ZXJ5QnVmZmVyTWFwLFxuXHRcdFx0W1xuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cXVlcnlTdHJpbmcsXG5cdFx0XHRdLFxuXHRcdCkgIT09IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEJ5SWRzIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGl0ZW1JZHMpIHtcblx0XHRcdHRoaXMuZmV0Y2hCeUlkKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGVuZGluZ0J1ZmZlck1hcFtpdGVtVHlwZV0uZ2V0UHJvbWlzZSgpO1xuXHR9XG5cblx0cHVibGljIGZldGNoQnlJZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHRpZiAodGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChpdGVtSWQpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbG9jYWwgSXRlbUlkIGluIFJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlJZCwgZm9yIGxvY2FsIEl0ZW1JZHMgeW91IHNob3VsZCB1c2UgUmVxdWVzdEJ1ZmZlck1hbmFnZXIuZmV0Y2hCeUxvY2FsSWQnKTtcblx0XHR9XG5cblx0XHRsZXQgYnVmZmVyO1xuXG5cdFx0aWYgKHJlcXVlc3RDb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRidWZmZXIgPSB0aGlzLnBlbmRpbmdUcnVlQnVmZmVyTWFwW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGJ1ZmZlciA9IHRoaXMuY29uc3RydWN0QnVmZmVyKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdHRoaXMucGVuZGluZ1RydWVCdWZmZXJNYXAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zb2xlLmxvZyhgRXhpc3RpbmcgJ2NvbHVtbnM6IHRydWUnIFJlcXVlc3RCdWZmZXIgJHtpdGVtVHlwZX0gYXQgJHtwZXJmb3JtYW5jZS5ub3coKX0gYnkgaWRgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YnVmZmVyID0gdGhpcy5wZW5kaW5nQnVmZmVyTWFwW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGJ1ZmZlciA9IHRoaXMuY29uc3RydWN0QnVmZmVyKGl0ZW1UeXBlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKGBFeGlzdGluZyBSZXF1ZXN0QnVmZmVyICR7aXRlbVR5cGV9IGF0ICR7cGVyZm9ybWFuY2Uubm93KCl9IGJ5IGlkYCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YnVmZmVyLmFkZFNpbmdsZUl0ZW0oXG5cdFx0XHRpdGVtSWQsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlci5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hCeVF1ZXJ5IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cXVlcnk6IFtvYmplY3QsIHN0cmluZ10sIC8vIHF1ZXJ5UGFyc2VyIHJlc3VsdFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHRsZXQgYnVmZmVyID0gdGhpcy5wZW5kaW5nQnVmZmVyTWFwW2l0ZW1UeXBlXTtcblxuXHRcdGlmIChidWZmZXIgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YnVmZmVyID0gdGhpcy5jb25zdHJ1Y3RCdWZmZXIoaXRlbVR5cGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmxvZyhgRXhpc3RpbmcgUmVxdWVzdEJ1ZmZlciAke2l0ZW1UeXBlfSBhdCAke3BlcmZvcm1hbmNlLm5vdygpfSB3aXRoIHF1ZXJ5YCk7XG5cdFx0fVxuXG5cdFx0YnVmZmVyLmFkZFF1ZXJ5KFxuXHRcdFx0cXVlcnksXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlci5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hCeUxvY2FsSWQgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyA9ICduby1pZCcsXG5cdFx0dGVtcGxhdGVPcHRpb25zPzogYW55LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWRcblx0XHRcdHx8IHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwW2l0ZW1UeXBlXVtpdGVtSWRdID09PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdFRlbXBsYXRlQnVmZmVyKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHR0ZW1wbGF0ZU9wdGlvbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnBlbmRpbmdUZW1wbGF0ZUJ1ZmZlck1hcFtpdGVtVHlwZV1baXRlbUlkXTtcblx0fVxuXG5cdC8vIHByaXZhdGUgY29uc3RydWN0UXVlcnlCdWZmZXIgKFxuXHQvLyBcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0Ly8gXHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHQvLyApOiBSZXF1ZXN0QnVmZmVyIHtcblx0Ly8gXHRpZiAodGhpcy5wZW5kaW5nUXVlcnlCdWZmZXJNYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0Ly8gXHRcdHRoaXMucGVuZGluZ1F1ZXJ5QnVmZmVyTWFwW2l0ZW1UeXBlXSA9IHt9O1xuXHQvLyBcdH1cblx0Ly9cblx0Ly8gXHRjb25zdCBidWZmZXIgPSB0aGlzLnBlbmRpbmdRdWVyeUJ1ZmZlck1hcFtpdGVtVHlwZV1bcXVlcnlTdHJpbmddID0gbmV3IFJlcXVlc3RCdWZmZXIoXG5cdC8vIFx0XHR0aGlzLnByb21pc2VMaWJyYXJ5LFxuXHQvLyBcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0Ly8gXHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdC8vIFx0XHR0aGlzLnNlcnZlckNhY2hlLFxuXHQvLyBcdFx0aXRlbVR5cGUsXG5cdC8vIFx0KTtcblx0Ly9cblx0Ly8gXHRjb25zb2xlLmxvZyhgQ3JlYXRpbmcgUmVxdWVzdEJ1ZmZlciAke2l0ZW1UeXBlfSBhdCAke3BlcmZvcm1hbmNlLm5vdygpfWApO1xuXHQvL1xuXHQvLyBcdHdpbmRvdy5zZXRUaW1lb3V0KFxuXHQvLyBcdFx0KCkgPT4ge1xuXHQvLyBcdFx0XHRidWZmZXIuZmx1c2goKTtcblx0Ly9cblx0Ly8gXHRcdFx0Y29uc29sZS5sb2coYFJlbW92aW5nIFJlcXVlc3RCdWZmZXIgJHtpdGVtVHlwZX0gYXQgJHtwZXJmb3JtYW5jZS5ub3coKX1gKTtcblx0Ly9cblx0Ly8gXHRcdFx0ZGVsZXRlIHRoaXMucGVuZGluZ1F1ZXJ5QnVmZmVyTWFwW2l0ZW1UeXBlXVtxdWVyeVN0cmluZ107XG5cdC8vIFx0XHR9LFxuXHQvLyBcdFx0QlVGRkVSX0ZMVVNIX1RJTUVPVVRfTVMsXG5cdC8vIFx0KTtcblx0Ly9cblx0Ly8gXHRyZXR1cm4gYnVmZmVyO1xuXHQvLyB9XG5cblx0cHJpdmF0ZSBjb25zdHJ1Y3RCdWZmZXIgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRtYXAgPSB0aGlzLnBlbmRpbmdCdWZmZXJNYXAsXG5cdCk6IFJlcXVlc3RCdWZmZXIge1xuXHRcdGNvbnN0IGJ1ZmZlciA9IG1hcFtpdGVtVHlwZV0gPSBuZXcgUmVxdWVzdEJ1ZmZlcihcblx0XHRcdHRoaXMucHJvbWlzZUxpYnJhcnksXG5cdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuc2VydmVyQ2FjaGUsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHQpO1xuXG5cdFx0d2luZG93LnNldFRpbWVvdXQoXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdGJ1ZmZlci5mbHVzaCgpO1xuXG5cdFx0XHRcdGRlbGV0ZSBtYXBbaXRlbVR5cGVdO1xuXHRcdFx0fSxcblx0XHRcdEJVRkZFUl9GTFVTSF9USU1FT1VUX01TLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gYnVmZmVyO1xuXHR9XG5cblx0cHJpdmF0ZSBjb25zdHJ1Y3RUZW1wbGF0ZUJ1ZmZlciAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkIHwgc3RyaW5nLFxuXHRcdHRlbXBsYXRlT3B0aW9ucz86IGFueSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdGlmICh0aGlzLnBlbmRpbmdUZW1wbGF0ZUJ1ZmZlck1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwW2l0ZW1UeXBlXVtpdGVtSWRdID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LnRlbXBsYXRlKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGVtcGxhdGVPcHRpb25zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0XHRcdFx0XHRyZXR1cm4gcmVzcG9uc2U7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KCk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vQXBpRm9ybWF0dGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlSZXNwb25zZVByb2Nlc3Nvcic7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNDb21waWxhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNQcm9jZXNzb3InO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uQ2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbk1hdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uQ2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5FeHBhbnNpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uSW5mbyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtblNldCc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtblN1YnNldENhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL0NyZWF0ZVJlcXVlc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtQ2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtRW50cnlTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vS2V5U2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uRXZlbnRIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vTG9ja1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9RdWVyeU1hdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9RdWVyeVBhcnNlcic7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5U2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL1JlcXVlc3RDb2x1bW5FeHBhbnNpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9Tb2NrZXRNZXNzYWdlSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS9BYnN0cmFjdENhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckl0ZW1IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNvbGxlY3Rpb25IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uSXRlbUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25FdmVudEhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzRGVsdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5leHBvcnQgKiBmcm9tICcuL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vUmVxdWVzdEJ1ZmZlcic7XG4iLCJpbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSwgVGVtcGxhdGVGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEVudHJ5UGFyZW50TnVsbCwgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENvbHVtbkhhbmRsZXIgfSBmcm9tICcuL0NvbHVtbkhhbmRsZXInO1xuaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4vQ29sdW1uVXRpbCc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4vUmVxdWVzdEJ1ZmZlck1hbmFnZXInO1xuaW1wb3J0IHsgaGFzUHJvcGVydGllcyB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUNhY2hlIHtcblxuXHRwdWJsaWMgdGVtcGxhdGVzOiB7XG5cdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiBUZW1wbGF0ZTxhbnk+XG5cdH0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdEJ1ZmZlckZhY3Rvcnk6IFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdHByaXZhdGUgY29sdW1uSGFuZGxlcjogQ29sdW1uSGFuZGxlcixcblx0XHRwcml2YXRlIHRlbXBsYXRlRmFjdG9yeTogVGVtcGxhdGVGYWN0b3J5LFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdCkge1xuXG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSB7QGxpbmsgVGVtcGxhdGUgdGVtcGxhdGV9LCB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5jcmVhdGVJdGVtcyBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmNyZWF0ZUl0ZW1zfSBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciB0aGlzXG5cdCAqXG5cdCAqIEBwYXJhbSBpdGVtVHlwZSBUaGUge0BsaW5rIEl0ZW1UeXBlIEl0ZW1UeXBlfSBvZiB0aGUgdGVtcGxhdGUgaXRlbVxuXHQgKiBAcGFyYW0gaXRlbUlkIFVzZWQgZm9yIGNhY2hpbmcsIG11bHRpcGxlIGNvbmN1cnJlbnQgdGVtcGxhdGUgY2FsbHMgZm9yIHRoZSBzYW1lIGl0ZW1JZCB3aWxsIHJldHVybiB0aGUgc2FtZSB0ZW1wbGF0ZVxuXHQgKiBAcGFyYW0gdGVtcGxhdGVPcHRpb25zXG5cdCAqIEBwYXJhbSB0ZW1wbGF0ZUNvbHVtbnMgQWRkaXRpb25hbCBjb2x1bW5zIHRvIGJlIGZldGNoZWQsIHdpbGwgYmUgc3RvcmVkIGluIHRoZSB0ZW1wbGF0ZSAtIHdhcm5pbmcgLSB0aGUgVGVtcGxhdGUgd29uJ3QgaGF2ZSB2YWx1ZXMgZm9yIHRob3NlIGNvbHVtbnNcblx0ICogQHBhcmFtIGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZSBBbiBvcHRpb25hbCB7QGxpbmsgRW50cnlQYXJlbnROdWxsIGVudHJ5IHBhcmVudH0gb3Ige0BsaW5rIEl0ZW1UeXBlIHBhcmVudCBpdGVtVHlwZX0sIGlmIHRoZSBwYXJlbnQgaXMgcGFzc2VkIHRoZSB0ZW1wbGF0ZUNvbHVtbnMgd2lsbCBiZSBleHBhbmRlZCB3aXRoIHRoZSBwcm9wZXIgbGluayBjb2x1bW5zIChUaHJvdWdoIHtAbGluayBDb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGluayBDb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGlua30pXG5cdCAqXG5cdCAqIEBleGFtcGxlXG5cdCAqIGBgYFxuXHQgKiAgY29uc3QgcGFyZW50OiBFbnRyeVBhcmVudCA9IHtcblx0ICogICAgICBpdGVtVHlwZTogJ0Z1bmN0aWUnLFxuXHQgKiAgICAgIGl0ZW1JZDogMTAsXG5cdCAqICB9O1xuXHQgKlxuXHQgKiAgcmV0dXJuIGNvcmUudGVtcGxhdGVDYWNoZVxuXHQgKiAgICAgIC5mZXRjaFRlbXBsYXRlKFxuXHQgKiAgICAgICAgICAnUGxhbm5pbmdwZXJzb25lZWwnLFxuXHQgKiAgICAgICAgICB1bmRlZmluZWQsXG5cdCAqICAgICAgICAgIHt9LFxuXHQgKiAgICAgICAgICB7fSxcblx0ICogICAgICAgICAgcGFyZW50LFxuXHQgKiAgICAgIClcblx0ICogICAgICAudGhlbihcblx0ICogICAgICAgICAgKHRlbXBsYXRlOiBUZW1wbGF0ZTwnUGxhbm5pbmdwZXJzb25lZWwnPikgPT4ge1xuXHQgKiAgICAgICAgICAgICAgY29uc3QgY2hhbmdlc0RlbHRhID0gdHJhbnNhY3Rpb24uY3JlYXRlQ2hhbmdlc0RlbHRhKCk7XG5cdCAqXG5cdCAqICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBzZWxlY3RlZEl0ZW1zKSB7XG5cdCAqICAgICAgICAgICAgICAgICAgY2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBjb3JlLmtleVNlcnZpY2UuZ2V0TG9jYWxJZCgpLFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5maWVsZHMsXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLmNvbHVtbnMsXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCxcblx0ICogICAgICAgICAgICAgICAgICApO1xuXHQgKiAgICAgICAgICAgICAgfVxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgdHJhbnNhY3Rpb24uYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0ICogICAgICAgICAgKTtcblx0ICogIGBgYFxuXHQgKi9cblx0cHVibGljIGZldGNoVGVtcGxhdGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZD86IEl0ZW1JZCxcblx0XHR0ZW1wbGF0ZU9wdGlvbnM6IGFueSA9IHt9LFxuXHRcdHRlbXBsYXRlQ29sdW1uczogYW55ID0ge30sXG5cdFx0ZW50cnlQYXJlbnRPclBhcmVudEl0ZW1UeXBlOiBFbnRyeVBhcmVudE51bGwgfCBJdGVtVHlwZSA9IG51bGwsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8VGVtcGxhdGU8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGhhc1RlbXBsYXRlT3B0aW9ucyA9IGhhc1Byb3BlcnRpZXModGVtcGxhdGVPcHRpb25zKTtcblx0XHRjb25zdCByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdGlmICh0ZW1wbGF0ZUNvbHVtbnNbaXRlbVR5cGVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGVtcGxhdGVDb2x1bW5zW2l0ZW1UeXBlXSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdFtcblx0XHRcdFx0e2NyZWF0b3I6IFsnZGlzcGxheW5hbWUnXX0sXG5cdFx0XHRcdCdjcmVhdGVkJyxcblx0XHRcdFx0J3Blcm1pc3Npb25zJyxcblx0XHRcdF0sXG5cdFx0KTtcblxuXHRcdGlmIChlbnRyeVBhcmVudE9yUGFyZW50SXRlbVR5cGUgIT09IG51bGwpIHtcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGhpcy5jb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGluayhcblx0XHRcdFx0XHQodHlwZW9mIGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZSA9PT0gJ3N0cmluZycpXG5cdFx0XHRcdFx0XHQ/IGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZVxuXHRcdFx0XHRcdFx0OiBlbnRyeVBhcmVudE9yUGFyZW50SXRlbVR5cGUuaXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0gPSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmdldCgpW2l0ZW1UeXBlXTtcblxuXHRcdGlmICghaGFzVGVtcGxhdGVPcHRpb25zKSB7XG5cdFx0XHRjb25zdCBjYWNoZWRUZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVzW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjYWNoZWRUZW1wbGF0ZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCYmIChcblx0XHRcdFx0XHRpdGVtVHlwZSA9PT0gbnVsbFxuXHRcdFx0XHRcdHx8IHRoaXMuY29sdW1uVXRpbC5yZXNwb25zZUNvbHVtbnNBdmFpbGFibGUoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHRjYWNoZWRUZW1wbGF0ZS5yZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihjYWNoZWRUZW1wbGF0ZSBhcyBUZW1wbGF0ZTxJdGVtVHlwZVR5cGU+KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZVxuXHRcdFx0LmFsbChcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLnJlcXVlc3RCdWZmZXJGYWN0b3J5LmZldGNoQnlMb2NhbElkKFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHR0ZW1wbGF0ZU9wdGlvbnMsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRhZGRpdGlvbmFsQ29sdW1uczogdGVtcGxhdGVDb2x1bW5zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHQ/IHt9XG5cdFx0XHRcdFx0XHQ6IHRoaXMuY29sdW1uSGFuZGxlci5mZXRjaChcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc29sdmVkID0+IHtcblx0XHRcdFx0XHRjb25zdCB0ZW1wbGF0ZVJlc3BvbnNlID0gcmVzb2x2ZWQudGVtcGxhdGU7XG5cblx0XHRcdFx0XHRjb25zdCB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0dGVtcGxhdGVSZXNwb25zZSxcblx0XHRcdFx0XHRcdHRlbXBsYXRlQ29sdW1ucyxcblx0XHRcdFx0XHRcdHJlc29sdmVkLmFkZGl0aW9uYWxDb2x1bW5zLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAoIWhhc1RlbXBsYXRlT3B0aW9ucyAmJiB0ZW1wbGF0ZVJlc3BvbnNlLmNhY2hlYWJsZSkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZW1wbGF0ZXNbaXRlbVR5cGVdID0gdGVtcGxhdGU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRlbXBsYXRlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIEFwaVJlc3BvbnNlUHJvY2Vzc29yIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5cbmV4cG9ydCBjbGFzcyBBcGlSZXNwb25zZVByb2Nlc3NvckZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAocHJpdmF0ZSBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcikge1xuXG5cdH1cblxuXHRjb25zdHJ1Y3QgKHJlc3BvbnNlOiBhbnkpOiBBcGlSZXNwb25zZVByb2Nlc3NvciB7XG5cdFx0cmV0dXJuIG5ldyBBcGlSZXNwb25zZVByb2Nlc3Nvcih0aGlzLmFwaUZvcm1hdHRlciwgcmVzcG9uc2UpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDaGFuZ2VzQ29tcGlsYXRpb24gfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKCkge1xuXHR9XG5cblx0Y29uc3RydWN0IChcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogQ2hhbmdlc0NvbXBpbGF0aW9uIHtcblx0XHRyZXR1cm4gbmV3IENoYW5nZXNDb21waWxhdGlvbihcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25DYWNoZUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCk6IENvbGxlY3Rpb25DYWNoZSB7XG5cdFx0cmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2FjaGUoXG5cdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cdFxufVxuIiwiaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5U2VydmljZSwgS2V5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBDb2xsZWN0aW9uRW50cnlPcHRpb25zLCBDb2xsZWN0aW9uRW50cnlPcHRpb25zSW50ZXJmYWNlIH0gZnJvbSAnLi4vbW9kZWxzLyc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzLyc7XG5pbXBvcnQgeyBDb2x1bW5TZXRGYWN0b3J5IH0gZnJvbSAnLi9Db2x1bW5TZXRGYWN0b3J5JztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25FbnRyeUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2x1bW5TZXRGYWN0b3J5OiBDb2x1bW5TZXRGYWN0b3J5LFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0KSB7XG5cdH1cblxuXHRjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnNJbnRlcmZhY2UsXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5jb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0dGhpcy5rZXlTZXJ2aWNlLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlciwgU2VydmVyQ2FjaGUsIFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3QgKFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlIHwgU2VydmVyQ2FjaGUsXG5cdFx0Z2V0Q29sbGVjdGlvbkVudHJpZXM6IDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4oaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSkgPT4gQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHQpOiBDb2xsZWN0aW9uTWF0Y2hlciB7XG5cdFx0cmV0dXJuIG5ldyBDb2xsZWN0aW9uTWF0Y2hlcihcblx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0Z2V0Q29sbGVjdGlvbkVudHJpZXMsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBJdGVtUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25FZGl0UmVzb3VyY2UsXG5cdENvbGxlY3Rpb25FbnRyeSxcblx0Q29sbGVjdGlvblJlc291cmNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlLFxuXHRDb2xsZWN0aW9uVmlld1Jlc291cmNlLFxuXHRFZGl0UmVzb3VyY2UsXG5cdEl0ZW1SZXNvdXJjZSxcblx0TG9jYWxWaWV3UmVzb3VyY2UsXG5cdFJlbW90ZVZpZXdSZXNvdXJjZSxcbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4vQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHVibGljIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHB1YmxpYyBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHB1YmxpYyBpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHB1YmxpYyBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHB1YmxpYyBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHVibGljIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlfSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWV9LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSwgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBvcHRpb25zSW5zdGFuY2UgPSBuZXcgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucyhvcHRpb25zKTtcblxuXHRcdGlmIChvcHRpb25zSW5zdGFuY2UuZWRpdENvbGxlY3Rpb24pIHtcblx0XHRcdHJldHVybiBuZXcgQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdG9wdGlvbnNJbnN0YW5jZSxcblx0XHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0dGhpcyxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdG9wdGlvbnNJbnN0YW5jZSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtbkV4cGFuc2lvbiB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uSW5mb0ZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbnMsIEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtbkluZm9GYWN0b3J5OiBDb2x1bW5JbmZvRmFjdG9yeSxcblx0KSB7XG5cblx0fVxuXG5cdGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogQ29sdW1uRXhwYW5zaW9uPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgQ29sdW1uRXhwYW5zaW9uKFxuXHRcdFx0dGhpcy5jb2x1bW5JbmZvRmFjdG9yeSxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uSW5mbyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uLCBSb290Q29sdW1uTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uSW5mb0ZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoKSB7fVxuXG5cdGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGFwaUNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdFx0cGFyZW50OiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4gfCBudWxsXG5cdCk6IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBDb2x1bW5JbmZvKGFwaUNvbHVtbiwgcGFyZW50KTtcblx0fVxuXG5cdGNvbnN0cnVjdEZyb21Sb290TWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cm9vdENvbHVtbk1hcDogUm9vdENvbHVtbk1hcCxcblx0XHRwYXJlbnQ6IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPiB8IG51bGwgPSBudWxsXG5cdCkge1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiByb290Q29sdW1uTWFwKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5NYXBFbnRyeSA9IHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdO1xuXHRcdFx0Y29uc3QgY29sdW1uSW5mbyA9IHRoaXMuY29uc3RydWN0PEl0ZW1UeXBlVHlwZT4oY29sdW1uTWFwRW50cnkuYXBpQ29sdW1uLCBwYXJlbnQpO1xuXHRcdFx0Y29uc3QgY2hpbGRDb2x1bW5zID0gdGhpcy5jb25zdHJ1Y3RGcm9tUm9vdE1hcDxJdGVtVHlwZVR5cGU+KGNvbHVtbk1hcEVudHJ5LmNoaWxkcmVuLCBjb2x1bW5JbmZvKTtcblxuXHRcdFx0aWYgKGNoaWxkQ29sdW1ucy5sZW5ndGggPiAwKVxuXHRcdFx0XHRjb2x1bW5JbmZvLnNldENoaWxkcmVuKGNvbHVtbkluZm8uYXBpQ29sdW1uLml0ZW1UeXBlLCBjaGlsZENvbHVtbnMpO1xuXG5cdFx0XHRyZXN1bHQucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5IYW5kbGVyLCBDb2x1bW5JbmZvLCBDb2x1bW5TZXQsIENvbHVtblV0aWwsIGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvbHVtbkluZm9GYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW4sXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRJdGVtVHlwZSxcblx0SXRlbVR5cGVNYXAsXG5cdFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFJvb3RDb2x1bW5NYXAsXG59IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtblNldEZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5IYW5kbGVyOiBDb2x1bW5IYW5kbGVyLFxuXHRcdHByaXZhdGUgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwcml2YXRlIGNvbHVtbkluZm9GYWN0b3J5OiBDb2x1bW5JbmZvRmFjdG9yeSxcblx0KSB7XG5cdH1cblxuXHRjb25zdHJ1Y3RTdHViPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBjb2x1bW5TZXQgPSBuZXcgQ29sdW1uU2V0KFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsLFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdCk7XG5cblx0XHRjb2x1bW5TZXQucmVxdWVzdCA9IHJlcXVlc3RDb2x1bW5zO1xuXHRcdGNvbHVtblNldC5yZXF1ZXN0Q29sdW1uc1RydWUgPSByZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZTtcblxuXHRcdHJldHVybiBjb2x1bW5TZXQ7XG5cdH1cblxuXHRwdWJsaWMgcmVzb2x2ZVN0dWI8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2x1bW5TZXQ6IENvbHVtblNldCxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbiA9IHRydWUsXG5cdFx0aW5jbHVkZUlkQ29sdW1uOiBib29sZWFuID0gdHJ1ZSxcblx0KTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBjb2x1bW5TZXQucmVxdWVzdENvbHVtbnNUcnVlID9cblx0XHRcdHRoaXMucHJvY2Vzc1Jlc3BvbnNlQ29sdW1ucyhcblx0XHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdGVuYWJsZUNhY2hpbmcsXG5cdFx0XHQpIDpcblx0XHRcdHRoaXMucHJvY2Vzc1JlcXVlc3RDb2x1bW5zKFxuXHRcdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdFx0aW5jbHVkZUlkQ29sdW1uLFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZz86IGJvb2xlYW4sXG5cdFx0aW5jbHVkZUlkQ29sdW1uPzogYm9vbGVhbixcblx0KTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLnJlc29sdmVTdHViKFxuXHRcdFx0dGhpcy5jb25zdHJ1Y3RTdHViKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdGluY2x1ZGVJZENvbHVtbixcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdEZyb21SZXNwb25zZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbiA9IHRydWUsXG5cdCk6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBjb2x1bW5TZXQgPSBuZXcgQ29sdW1uU2V0KFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsLFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdCk7XG5cblx0XHRjb2x1bW5TZXQucmVxdWVzdENvbHVtbnNUcnVlID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzUmVzcG9uc2VDb2x1bW5zIChcblx0XHRjb2x1bW5TZXQ6IENvbHVtblNldCxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbixcblx0KTogQ29sdW1uU2V0IHtcblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbHVtblNldC5pdGVtVHlwZTtcblx0XHRjb25zdCByb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwID0ge307XG5cdFx0Y29uc3QgcHJvY2Vzc2VkSXRlbVR5cGVNYXA6IEl0ZW1UeXBlTWFwPGJvb2xlYW4+ID0ge307XG5cblx0XHRjb2x1bW5TZXQucmVzcG9uc2UgPSByZXNwb25zZUNvbHVtbnM7XG5cblx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXBGcm9tUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRyb290Q29sdW1uTWFwLFxuXHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdHByb2Nlc3NlZEl0ZW1UeXBlTWFwLFxuXHRcdCk7XG5cblx0XHR0aGlzLnByb2Nlc3NDb2x1bW5JbmZvKFxuXHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0dGhpcy5jb2x1bW5JbmZvRmFjdG9yeS5jb25zdHJ1Y3RGcm9tUm9vdE1hcChyb290Q29sdW1uTWFwKSxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdCk7XG5cblx0XHRjb2x1bW5TZXQucmVxdWVzdCA9IHRoaXMuY29uc3RydWN0UmVxdWVzdENvbHVtbnNGcm9tUm9vdENvbHVtbk1hcChyb290Q29sdW1uTWFwKTtcblxuXHRcdHJldHVybiBjb2x1bW5TZXQ7XG5cdH1cblxuXHRwcml2YXRlIGNvbnN0cnVjdFJlcXVlc3RDb2x1bW5zRnJvbVJvb3RDb2x1bW5NYXAgKFxuXHRcdHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAsXG5cdCk6IEFwaVJlcXVlc3RDb2x1bW5bXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gcm9vdENvbHVtbk1hcCkge1xuXHRcdFx0Y29uc3QgZW50cnkgPSByb290Q29sdW1uTWFwW2NvbHVtbklkXTtcblxuXHRcdFx0aWYgKGhhc1Byb3BlcnRpZXMoZW50cnkuY2hpbGRyZW4pKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKHtcblx0XHRcdFx0XHRbY29sdW1uSWRdOiB0aGlzLmNvbnN0cnVjdFJlcXVlc3RDb2x1bW5zRnJvbVJvb3RDb2x1bW5NYXAoZW50cnkuY2hpbGRyZW4pLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGNvbHVtbklkKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBleHBhbmRSb290Q29sdW1uTWFwRnJvbVJlc3BvbnNlQ29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRyb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwLFxuXHRcdGVuYWJsZUNhY2hpbmc6IGJvb2xlYW4sXG5cdFx0cHJvY2Vzc2VkSXRlbVR5cGVNYXA6IEl0ZW1UeXBlTWFwPGJvb2xlYW4+LFxuXHQpIHtcblx0XHRpZiAocHJvY2Vzc2VkSXRlbVR5cGVNYXBbaXRlbVR5cGVdID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cHJvY2Vzc2VkSXRlbVR5cGVNYXBbaXRlbVR5cGVdID0gdHJ1ZTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gcmVzcG9uc2VDb2x1bW5zW2l0ZW1UeXBlXSkge1xuXHRcdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW4gPSByZXNwb25zZUNvbHVtbnNbaXRlbVR5cGVdW2NvbHVtbklkXTtcblxuXHRcdFx0aWYgKHJlc3BvbnNlQ29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChlbmFibGVDYWNoaW5nKSB7XG5cdFx0XHRcdHRoaXMuY29sdW1uSGFuZGxlci5zZXRDb2x1bW4oXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW4sXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyb290Q29sdW1uTWFwW2NvbHVtbklkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdID0ge1xuXHRcdFx0XHRcdGFwaUNvbHVtbjogcmVzcG9uc2VDb2x1bW4sXG5cdFx0XHRcdFx0Y2hpbGRyZW46IHt9LFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCF0aGlzLmNvbHVtblV0aWwuaXNJdGVtQ29sdW1uKFxuXHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1uLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gcmVzcG9uc2VDb2x1bW5zW3Jlc3BvbnNlQ29sdW1uLml0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjaGlsZHJlbiA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdHx8ICFoYXNQcm9wZXJ0aWVzKGNoaWxkcmVuKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXBGcm9tUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbi5pdGVtVHlwZSxcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRyb290Q29sdW1uTWFwW2NvbHVtbklkXS5jaGlsZHJlbixcblx0XHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdFx0cHJvY2Vzc2VkSXRlbVR5cGVNYXAsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8vIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHJlcXVlc3Rjb2x1bW5zIGRvZXMgKm5vdCogZXF1YWwgJ3RydWUnLCBhbmQgbWlnaHQgY29udGFpbiBkZXJpdmVkIGNvbHVtbnNcblx0cHJpdmF0ZSBwcm9jZXNzUmVxdWVzdENvbHVtbnMgKFxuXHRcdGNvbHVtblNldDogQ29sdW1uU2V0LFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRlbmFibGVDYWNoaW5nOiBib29sZWFuLFxuXHRcdGluY2x1ZGVJZENvbHVtbjogYm9vbGVhbixcblx0KTogQ29sdW1uU2V0IHtcblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbHVtblNldC5pdGVtVHlwZTtcblx0XHRjb25zdCByb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwID0ge307XG5cblx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXAoXG5cdFx0XHRjb2x1bW5TZXQucmVxdWVzdCBhcyBBcGlSZXF1ZXN0Q29sdW1uW10sIC8vIHdlIGNhbiBhc3N1bWUgcmVxdWVzdENvbHVtbnMgaXMgYW4gYXJyYXkgaGVyZVxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRyb290Q29sdW1uTWFwLFxuXHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHQpO1xuXG5cdFx0aWYgKGluY2x1ZGVJZENvbHVtbikge1xuXHRcdFx0dGhpcy5leHBhbmRSb290Q29sdW1uTWFwKFxuXHRcdFx0XHRbJ2lkJ10sXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdHJvb3RDb2x1bW5NYXAsXG5cdFx0XHRcdGVuYWJsZUNhY2hpbmcsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbHVtblNldC5yZXNwb25zZSA9IHt9O1xuXG5cdFx0dGhpcy5wcm9jZXNzQ29sdW1uSW5mbyhcblx0XHRcdGNvbHVtblNldCxcblx0XHRcdHRoaXMuY29sdW1uSW5mb0ZhY3RvcnkuY29uc3RydWN0RnJvbVJvb3RNYXAocm9vdENvbHVtbk1hcCksXG5cdFx0XHRpdGVtVHlwZSxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGNvbHVtblNldDtcblx0fVxuXG5cdHByaXZhdGUgcHJvY2Vzc0NvbHVtbkluZm8gKFxuXHRcdGNvbHVtblNldDogQ29sdW1uU2V0LFxuXHRcdGNvbHVtbkluZm9PYmplY3RzOiBDb2x1bW5JbmZvW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCByZXNwb25zZSA9IGNvbHVtblNldC5yZXNwb25zZTtcblxuXHRcdGlmIChyZXNwb25zZVtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVzcG9uc2VbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JbmZvIG9mIGNvbHVtbkluZm9PYmplY3RzKSB7XG5cdFx0XHRyZXNwb25zZVtpdGVtVHlwZV1bY29sdW1uSW5mby5pZF0gPSBjb2x1bW5JbmZvLmFwaUNvbHVtbjtcblx0XHRcdGNvbHVtblNldC5ncm91cENvbHVtbkluZm8oY29sdW1uSW5mbyk7XG5cblx0XHRcdGlmICghY29sdW1uSW5mby5pc0xlYWYpIHtcblx0XHRcdFx0dGhpcy5wcm9jZXNzQ29sdW1uSW5mbyhcblx0XHRcdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHRcdFx0Y29sdW1uSW5mby5jaGlsZHJlbixcblx0XHRcdFx0XHRjb2x1bW5JbmZvLml0ZW1UeXBlLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZXhwYW5kUm9vdENvbHVtbk1hcCAoXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbixcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCByZXF1ZXN0Q29sdW1uIG9mIHJlcXVlc3RDb2x1bW5zKSB7XG5cdFx0XHRjb25zdCB7aWQ6IGNvbHVtbklkLCBjaGlsZHJlbn0gPSB0aGlzLmNvbHVtblV0aWwucGFyc2VSZXF1ZXN0Q29sdW1uKHJlcXVlc3RDb2x1bW4pO1xuXG5cdFx0XHRsZXQgcmVzcG9uc2VDb2x1bW47XG5cblx0XHRcdGlmIChyZXNwb25zZUNvbHVtbnNbaXRlbVR5cGVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW4gPSByZXNwb25zZUNvbHVtbnNbaXRlbVR5cGVdW2NvbHVtbklkXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJlc3BvbnNlQ29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHRcdCdObyBhcGkgY29sdW1uIGZvciByZXF1ZXN0IGNvbHVtbicsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0J2ZvciBpdGVtVHlwZScsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChlbmFibGVDYWNoaW5nKSB7XG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uID0gdGhpcy5jb2x1bW5IYW5kbGVyLnNldENvbHVtbihcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbixcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cm9vdENvbHVtbk1hcFtjb2x1bW5JZF0gPSB7XG5cdFx0XHRcdFx0YXBpQ29sdW1uOiByZXNwb25zZUNvbHVtbixcblx0XHRcdFx0XHRjaGlsZHJlbjoge30sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZXhwYW5kUm9vdENvbHVtbk1hcChcblx0XHRcdFx0Y2hpbGRyZW4sXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdLmNoaWxkcmVuLFxuXHRcdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtblN1YnNldENhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoKSB7fVxuXG5cdGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyk6IENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPihyZXF1ZXN0Q29sdW1ucyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciwgQ3JlYXRlQ29tcGlsYXRpb24sIENyZWF0ZVJlcXVlc3QsIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZXF1ZXN0RmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHQpIHtcblxuXHR9XG5cblx0Y29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29tcGlsYXRpb246IENyZWF0ZUNvbXBpbGF0aW9uLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGJyZWFrdXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdCk6IENyZWF0ZVJlcXVlc3Q8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBDcmVhdGVSZXF1ZXN0KFxuXHRcdFx0dGhpcy5hcGlGb3JtYXR0ZXIsXG5cdFx0XHR0aGlzLmtleVNlcnZpY2UsXG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y29tcGlsYXRpb24sXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdGJyZWFrdXBCeVBhcmVudCxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL0Fic3RyYWN0Q2FjaGUnO1xuaW1wb3J0IHsgUXVlcnlNYXRjaGVyRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5cbmV4cG9ydCBjbGFzcyBJdGVtQ2FjaGVGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3QgKFxuXHRcdHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpOiBJdGVtQ2FjaGUge1xuXHRcdHJldHVybiBuZXcgSXRlbUNhY2hlKFxuXHRcdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblx0fVxuXHRcbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciwgQ29sdW1uU2V0LCBJdGVtRW50cnlTZXJ2aWNlLCBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5TZXRGYWN0b3J5LCBJdGVtUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEF1dGhJbnRlcmZhY2UsIEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIEl0ZW1FbnRyeUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgYXV0aEludGVyZmFjZTogQXV0aEludGVyZmFjZSxcblx0XHRwdWJsaWMgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHVibGljIGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHVibGljIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0cHVibGljIGl0ZW1SZXNvdXJjZUZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0cHVibGljIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHVibGljIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0Y29sdW1uSW5mbzogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IEl0ZW1FbnRyeShcblx0XHRcdHRoaXMsXG5cdFx0XHRjb2x1bW5JbmZvLml0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdFx0Y29sdW1uSW5mbyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIENvbHVtblV0aWwsIExvY2tTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExpbmtUcmVlU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcbmltcG9ydCB7XG5cdEVkaXRSZXNvdXJjZSxcblx0SXRlbUVudHJ5LFxuXHRJdGVtUmVzb3VyY2UsXG5cdEl0ZW1SZXNvdXJjZU9wdGlvbnMsXG5cdExvY2FsVmlld1Jlc291cmNlLFxuXHRSZW1vdGVWaWV3UmVzb3VyY2UsXG59IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtT3B0aW9uc0ludGVyZmFjZSwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFJlc291cmNlQ29uc3RydWN0b3I8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUsIFQgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4gPSAoaXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPikgPT4gVDtcblxuZXhwb3J0IGNsYXNzIEl0ZW1SZXNvdXJjZUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIGxvY2tTZXJ2aWNlOiBMb2NrU2VydmljZSxcblx0XHRwdWJsaWMgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHVibGljIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcjogRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0XHRwdWJsaWMgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwdWJsaWMgbGlua1RyZWVTZXJ2aWNlOiBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGdldENvbnN0cnVjdG9yPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IFJlc291cmNlQ29uc3RydWN0b3I8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldENvbnN0cnVjdG9yPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7cmVtb3RlOiB0cnVlfSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogUmVzb3VyY2VDb25zdHJ1Y3RvcjxJdGVtVHlwZVR5cGUsIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0Q29uc3RydWN0b3I8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogUmVzb3VyY2VDb25zdHJ1Y3RvcjxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXRDb25zdHJ1Y3RvcjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBSZXNvdXJjZUNvbnN0cnVjdG9yPEl0ZW1UeXBlVHlwZSwgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBvcHRpb25zSW5zdGFuY2UgPSBuZXcgSXRlbVJlc291cmNlT3B0aW9ucyhvcHRpb25zKTtcblxuXHRcdHJldHVybiAoXG5cdFx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdCkgPT4ge1xuXHRcdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0V2l0aE9wdGlvbnM8SXRlbVR5cGVUeXBlPihcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRvcHRpb25zSW5zdGFuY2UsXG5cdFx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0KTtcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0aXNOZXc/OiBib29sZWFuLFxuXHQpOiBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPjtcblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtyZW1vdGU6IHRydWV9LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGlzTmV3PzogYm9vbGVhbixcblx0KTogTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPjtcblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRpc05ldz86IGJvb2xlYW4sXG5cdCk6IFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGlzTmV3PzogYm9vbGVhbixcblx0KTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdFdpdGhPcHRpb25zKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0bmV3IEl0ZW1SZXNvdXJjZU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdGlzTmV3LFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGNvbnN0cnVjdFdpdGhPcHRpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtUmVzb3VyY2VPcHRpb25zLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGlzTmV3OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+IHtcblx0XHRpZiAob3B0aW9ucy5lZGl0KSB7XG5cdFx0XHRyZXR1cm4gbmV3IEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdGlzTmV3LFxuXHRcdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMucmVtb3RlKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdGlzTmV3LFxuXHRcdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRpc05ldyxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7XG5cdEFwaUZvcm1hdHRlcixcblx0QXBpUmVxdWVzdFNlcnZpY2UsXG5cdENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdENvbHVtbkNhY2hlLFxuXHRDb2x1bW5IYW5kbGVyLFxuXHRDb2x1bW5VdGlsLFxuXHRJdGVtRW50cnlTZXJ2aWNlLFxuXHRLZXlTZXJ2aWNlLFxuXHRMb2NrU2VydmljZSxcblx0UXVlcnlTZXJ2aWNlLFxufSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS9zZXJ2ZXIvU2VydmVyQ2FjaGUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4uL2NsYXNzZXMvUmVxdWVzdEJ1ZmZlck1hbmFnZXInO1xuaW1wb3J0IHsgVGVtcGxhdGVDYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvVGVtcGxhdGVDYWNoZSc7XG5pbXBvcnQgeyBSbUNvcmUgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0Q29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Q29sdW1uU2V0RmFjdG9yeSxcblx0Q29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRJdGVtQ2FjaGVGYWN0b3J5LFxuXHRJdGVtRW50cnlGYWN0b3J5LFxuXHRJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRRdWVyeVBhcnNlckZhY3RvcnksXG5cdFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxufSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHtcblx0QXV0aEludGVyZmFjZSxcblx0RXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRQcm9taXNlTGlicmFyeUludGVyZmFjZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0xpbmtUcmVlU2VydmljZUludGVyZmFjZSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5IH0gZnJvbSAnLi9DaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkNhY2hlRmFjdG9yeSB7XG5cblx0cHJpdmF0ZSByZWFkb25seSBzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGU7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29yZTogUm1Db3JlLFxuXHRcdHByaXZhdGUgY29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlLFxuXHRcdHByaXZhdGUgcmVxdWVzdEJ1ZmZlck1hbmFnZXI6IFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcml2YXRlIGF1dGhJbnRlcmZhY2U6IEF1dGhJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzRGVsdGFGYWN0b3J5OiBDaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdHByaXZhdGUgY2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnk6IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5LFxuXHRcdHByaXZhdGUgbG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlLFxuXHRcdHByaXZhdGUgbW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTogTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25SZXNvdXJjZUZhY3Rvcnk6IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHByaXZhdGUgdGVtcGxhdGVDYWNoZTogVGVtcGxhdGVDYWNoZSxcblx0XHRwcml2YXRlIGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uSGFuZGxlcjogQ29sdW1uSGFuZGxlcixcblx0XHRwcml2YXRlIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJpdmF0ZSBpdGVtRW50cnlGYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdHByaXZhdGUgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uRW50cnlGYWN0b3J5OiBDb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeTogQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgcXVlcnlQYXJzZXJGYWN0b3J5OiBRdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0cHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0XHRwcml2YXRlIGxpbmtUcmVlU2VydmljZTogTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlLFxuXHQpIHtcblx0XHR0aGlzLnNlcnZlckNhY2hlID0gbmV3IFNlcnZlckNhY2hlKFxuXHRcdFx0dGhpcy5jaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSxcblx0XHRcdHRoaXMuY29yZSxcblx0XHRcdHRoaXMuY29sdW1uQ2FjaGUsXG5cdFx0XHR0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdHRoaXMuYXV0aEludGVyZmFjZSxcblx0XHRcdHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdHRoaXMubG9ja1NlcnZpY2UsXG5cdFx0XHR0aGlzLm1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0aGlzLml0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0aGlzLnRlbXBsYXRlQ2FjaGUsXG5cdFx0XHR0aGlzLml0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHR0aGlzLmVycm9ySGFuZGxlcixcblx0XHRcdHRoaXMuZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdHRoaXMucHJvbWlzZVNlcnZpY2UsXG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlcixcblx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHR0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbHVtbkhhbmRsZXIsXG5cdFx0XHR0aGlzLmNvbHVtblNldEZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uVXRpbCxcblx0XHRcdHRoaXMuaXRlbUVudHJ5RmFjdG9yeSxcblx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZSxcblx0XHRcdHRoaXMua2V5U2VydmljZSxcblx0XHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5RmFjdG9yeSxcblx0XHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdHRoaXMuY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dGhpcy5xdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0XHR0aGlzLnF1ZXJ5U2VydmljZSxcblx0XHRcdHRoaXMubGlua1RyZWVTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogVG9kb1tjYWNoZV0gU3RvcmUgYSBtYXAgb2YgYWxsIHRyYW5zYWN0aW9ucyBieSB0cmFuc2FjdGlvbiBpZCA/XG5cdCAqL1xuXHRwdWJsaWMgZ2V0QnlJZCAoaWQ6IHN0cmluZyk6IFRyYW5zYWN0aW9uQ2FjaGUgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGZpbmRDaGlsZCA9IChjaGlsZHJlbjogVHJhbnNhY3Rpb25DYWNoZVtdKSA9PiB7XG5cdFx0XHRmb3IgKGNvbnN0IHRyYW5zYWN0aW9uIG9mIGNoaWxkcmVuKSB7XG5cdFx0XHRcdGlmICh0cmFuc2FjdGlvbi5pZCA9PT0gaWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJhbnNhY3Rpb247XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBjaGlsZFJlc3VsdCA9IGZpbmRDaGlsZCh0cmFuc2FjdGlvbi5jaGlsZHJlbik7XG5cblx0XHRcdFx0aWYgKGNoaWxkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gY2hpbGRSZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9O1xuXG5cdFx0cmV0dXJuIGZpbmRDaGlsZCh0aGlzLnNlcnZlckNhY2hlLmNoaWxkcmVuKTtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3QgKGlkPzogc3RyaW5nKTogVHJhbnNhY3Rpb25DYWNoZSB7XG5cdFx0cmV0dXJuIHRoaXMuc2VydmVyQ2FjaGUuY3JlYXRlQ2hpbGQoaWQpO1xuXHR9XG5cblx0LypAaW50ZXJuYWwqL1xuXHRwdWJsaWMgZ2V0U2VydmVyQ2FjaGUgKCk6IFNlcnZlckNhY2hlIHtcblx0XHRyZXR1cm4gdGhpcy5zZXJ2ZXJDYWNoZTtcblx0fVxufVxuIiwiaW1wb3J0IHsgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZXhwb3J0IGNsYXNzIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbiB7XG5cdFx0cmV0dXJuIG5ldyBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb24odHJhbnNhY3Rpb24pO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIFF1ZXJ5TWF0Y2hlciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnROdWxsLCBGaWVsZE1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeU1hdGNoZXJGYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXJcblx0KSB7XG5cblx0fVxuXG5cdGNvbnN0cnVjdCAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBmaWVsZHM6IEZpZWxkTWFwLCBwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCk6IFF1ZXJ5TWF0Y2hlciB7XG5cdFx0cmV0dXJuIG5ldyBRdWVyeU1hdGNoZXIoXG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlcixcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0ZmllbGRzLFxuXHRcdFx0cGFyZW50XG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgUXVlcnlQYXJzZXIgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVF1ZXJ5IH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlQYXJzZXJGYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKCkge1xuXHR9XG5cblx0Y29uc3RydWN0IChxdWVyeTogQXBpUXVlcnksIHBhcmFtZXRlcnM/OiBhbnkpOiBRdWVyeVBhcnNlciB7XG5cdFx0cmV0dXJuIG5ldyBRdWVyeVBhcnNlcihxdWVyeSwgcGFyYW1ldGVycyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtblV0aWwsIFJlcXVlc3RDb2x1bW5FeHBhbnNpb24gfSBmcm9tICcuLi9jbGFzc2VzJztcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uVXRpbDogQ29sdW1uVXRpbFxuXHQpIHtcblx0fVxuXG5cdGNvbnN0cnVjdCAoKTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbiB7XG5cdFx0cmV0dXJuIG5ldyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uKFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uU2V0RmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1uTWFwLCBBcGlSZXNwb25zZSwgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHVibGljIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHVibGljIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdCkge1xuXHR9XG5cblx0Y29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRyZXNwb25zZTogQXBpUmVzcG9uc2UsXG5cdFx0YWRkaXRpb25hbFJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwLFxuXHRcdGFkZGl0aW9uYWxSZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IFRlbXBsYXRlPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgVGVtcGxhdGU8SXRlbVR5cGVUeXBlPihcblx0XHRcdHRoaXMsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlc3BvbnNlLFxuXHRcdFx0YWRkaXRpb25hbFJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0YWRkaXRpb25hbFJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi9jbGFzc2VzL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBJbnRlcm5hbENoYW5nZXNEZWx0YSB9IGZyb20gJy4uL2NsYXNzZXMvSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlc0RlbHRhRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0KSB7XG5cblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3QgKCk6IENoYW5nZXNEZWx0YSB7XG5cdFx0cmV0dXJuIG5ldyBDaGFuZ2VzRGVsdGEoXG5cdFx0XHR0aGlzLml0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0KTtcblx0fVxuXG5cdC8qQGludGVybmFsKi9cblx0cHVibGljIGNvbnN0cnVjdEludGVybmFsRGVsdGEgKCk6IEludGVybmFsQ2hhbmdlc0RlbHRhIHtcblx0XHRyZXR1cm4gbmV3IEludGVybmFsQ2hhbmdlc0RlbHRhKFxuXHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxufVxuIiwiaW1wb3J0IHtcblx0QXBpUmVxdWVzdFNlcnZpY2UsXG5cdENoYW5nZXNQcm9jZXNzb3IsXG5cdENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdEl0ZW1FbnRyeVNlcnZpY2UsXG5cdE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcbn0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkgfSBmcm9tICcuL0NoYW5nZXNDb21waWxhdGlvbkZhY3RvcnknO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4vQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQgeyBDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi9Db2x1bW5FeHBhbnNpb25GYWN0b3J5JztcbmltcG9ydCB7IENyZWF0ZVJlcXVlc3RGYWN0b3J5IH0gZnJvbSAnLi9DcmVhdGVSZXF1ZXN0RmFjdG9yeSc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4vUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnknO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uRXhwYW5zaW9uRmFjdG9yeTogQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNyZWF0ZVJlcXVlc3RGYWN0b3J5OiBDcmVhdGVSZXF1ZXN0RmFjdG9yeSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdCkge1xuXG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0IChcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRicmVha1VwQnlQYXJlbnQ/OiBib29sZWFuLFxuXHRcdG9uQWZ0ZXJDcmVhdGVDYWxsYmFjaz86IE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0KTogQ2hhbmdlc1Byb2Nlc3NvciB7XG5cdFx0cmV0dXJuIG5ldyBDaGFuZ2VzUHJvY2Vzc29yKFxuXHRcdFx0dGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHRoaXMuY2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuY3JlYXRlUmVxdWVzdEZhY3RvcnksXG5cdFx0XHR0aGlzLmVycm9ySGFuZGxlcixcblx0XHRcdHRoaXMucHJvbWlzZVNlcnZpY2UsXG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHRicmVha1VwQnlQYXJlbnQsXG5cdFx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0KTtcblx0fVxufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9BcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25FbnRyeUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uTWF0Y2hlckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtbkluZm9GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uU2V0RmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtblN1YnNldENhY2hlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NyZWF0ZVJlcXVlc3RGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vSXRlbUNhY2hlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1FbnRyeUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtUmVzb3VyY2VGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vUXVlcnlNYXRjaGVyRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5UGFyc2VyRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL1JlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vVGVtcGxhdGVGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNQcm9jZXNzb3JGYWN0b3J5JztcbiIsImltcG9ydCB7XG5cdEFwaUZvcm1hdHRlcixcblx0QXBpUmVxdWVzdFNlcnZpY2UsXG5cdENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UsXG5cdENvbHVtbkNhY2hlLFxuXHRDb2x1bW5IYW5kbGVyLFxuXHRDb2x1bW5VdGlsLFxuXHRJdGVtRW50cnlTZXJ2aWNlLFxuXHRLZXlTZXJ2aWNlLFxuXHRMb2NrU2VydmljZSxcblx0UXVlcnlTZXJ2aWNlLFxuXHRTb2NrZXRNZXNzYWdlSGFuZGxlcixcbn0gZnJvbSAnLi9jbGFzc2VzJztcbmltcG9ydCB7IFJlcXVlc3RCdWZmZXJNYW5hZ2VyIH0gZnJvbSAnLi9jbGFzc2VzL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcbmltcG9ydCB7IFRlbXBsYXRlQ2FjaGUgfSBmcm9tICcuL2NsYXNzZXMvVGVtcGxhdGVDYWNoZSc7XG5pbXBvcnQge1xuXHRBcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnksXG5cdENoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0Q29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Q29sdW1uSW5mb0ZhY3RvcnksXG5cdENvbHVtblNldEZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0Q3JlYXRlUmVxdWVzdEZhY3RvcnksXG5cdEl0ZW1DYWNoZUZhY3RvcnksXG5cdEl0ZW1FbnRyeUZhY3RvcnksXG5cdEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFRlbXBsYXRlRmFjdG9yeSxcblx0VHJhbnNhY3Rpb25DYWNoZUZhY3RvcnksXG59IGZyb20gJy4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuL2ZhY3Rvcmllcy9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5IH0gZnJvbSAnLi9mYWN0b3JpZXMvQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnknO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdFNlcnZpY2VJbnRlcmZhY2UsXG5cdEF1dGhJbnRlcmZhY2UsXG5cdEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0RXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0UHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIFJtQ29yZSB7XG5cdHZlcnNpb246IHN0cmluZyA9ICcyLjAuMTQnO1xuXHRub29wID0gbm9vcDtcblxuXHRhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcjtcblx0YXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlO1xuXHRhcGlSZXNwb25zZVByb2Nlc3NvckZhY3Rvcnk6IEFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeTtcblx0Y2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTogQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTtcblx0Y2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnk6IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5O1xuXHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5O1xuXHRjb2xsZWN0aW9uRW50cnlGYWN0b3J5OiBDb2xsZWN0aW9uRW50cnlGYWN0b3J5O1xuXHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlO1xuXHRjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeTtcblx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeTogQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeTtcblx0Y29sbGVjdGlvblJlc291cmNlU2VydmljZTogQ29sbGVjdGlvblJlc291cmNlU2VydmljZTtcblx0Y29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlO1xuXHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5O1xuXHRjb2x1bW5IYW5kbGVyOiBDb2x1bW5IYW5kbGVyO1xuXHRjb2x1bW5JbmZvRmFjdG9yeTogQ29sdW1uSW5mb0ZhY3Rvcnk7XG5cdGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3Rvcnk7XG5cdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeTogQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5O1xuXHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsO1xuXHRjcmVhdGVSZXF1ZXN0RmFjdG9yeTogQ3JlYXRlUmVxdWVzdEZhY3Rvcnk7XG5cdGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3Rvcnk7XG5cdGl0ZW1FbnRyeUZhY3Rvcnk6IEl0ZW1FbnRyeUZhY3Rvcnk7XG5cdGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2U7XG5cdGl0ZW1SZXNvdXJjZUZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3Rvcnk7XG5cdGtleVNlcnZpY2U6IEtleVNlcnZpY2U7XG5cdHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5OiBUcmFuc2FjdGlvbkNhY2hlRmFjdG9yeTtcblx0bG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlO1xuXHRtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5O1xuXHRxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5O1xuXHRxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeTtcblx0cXVlcnlTZXJ2aWNlOiBRdWVyeVNlcnZpY2U7XG5cdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTtcblx0c29ja2V0TWVzc2FnZUhhbmRsZXI6IFNvY2tldE1lc3NhZ2VIYW5kbGVyO1xuXHR0ZW1wbGF0ZUZhY3Rvcnk6IFRlbXBsYXRlRmFjdG9yeTtcblx0Y2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeTtcblx0dGVtcGxhdGVDYWNoZTogVGVtcGxhdGVDYWNoZTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0X2FwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZUludGVyZmFjZSxcblx0XHRhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJvbWlzZUxpYnJhcnk6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGxpbmtUcmVlU2VydmljZTogTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlLFxuXHQpIHtcblx0XHQvLyBDcmVhdGUgdmFyaWFibGVzIGZvciBlYWNoIHNlcnZpY2UgaW4gb3JkZXIgdG8gZ2V0IGEgVHlwZVNjcmlwdCBlcnJvciB3aGVuIGEgZGVwZW5kZW5jeSBoYXNuJ3QgYmVlblxuXHRcdC8vIGluaXRpYWxpemVkIHlldC5cblx0XHRjb25zdCBrZXlTZXJ2aWNlID0gbmV3IEtleVNlcnZpY2UoKTtcblxuXHRcdGNvbnN0IGl0ZW1FbnRyeVNlcnZpY2UgPSBuZXcgSXRlbUVudHJ5U2VydmljZShcblx0XHRcdGF1dGhJbnRlcmZhY2UsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0bGlua1RyZWVTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjaGFuZ2VzRGVsdGFGYWN0b3J5ID0gbmV3IENoYW5nZXNEZWx0YUZhY3RvcnkoXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBhcGlGb3JtYXR0ZXIgPSBuZXcgQXBpRm9ybWF0dGVyKCk7XG5cblx0XHRjb25zdCBhcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkgPSBuZXcgQXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5KGFwaUZvcm1hdHRlcik7XG5cdFx0Y29uc3QgYXBpUmVxdWVzdFNlcnZpY2UgPSBuZXcgQXBpUmVxdWVzdFNlcnZpY2UoXG5cdFx0XHRfYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRhcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnksXG5cdFx0KTtcblxuXHRcdGNvbnN0IHF1ZXJ5TWF0Y2hlckZhY3RvcnkgPSBuZXcgUXVlcnlNYXRjaGVyRmFjdG9yeShhcGlGb3JtYXR0ZXIpO1xuXHRcdGNvbnN0IHF1ZXJ5UGFyc2VyRmFjdG9yeSA9IG5ldyBRdWVyeVBhcnNlckZhY3RvcnkoKTtcblx0XHRjb25zdCBxdWVyeVNlcnZpY2UgPSBuZXcgUXVlcnlTZXJ2aWNlKCk7XG5cblx0XHRjb25zdCBjb2x1bW5VdGlsID0gbmV3IENvbHVtblV0aWwoXG5cdFx0XHRsaW5rVHJlZVNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbHVtbkNhY2hlID0gbmV3IENvbHVtbkNhY2hlKGNvbHVtblV0aWwpO1xuXHRcdGNvbnN0IGNvbHVtbkhhbmRsZXIgPSBuZXcgQ29sdW1uSGFuZGxlcihcblx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRjb2x1bW5DYWNoZSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0KTtcblx0XHRjb25zdCBjb2x1bW5JbmZvRmFjdG9yeSA9IG5ldyBDb2x1bW5JbmZvRmFjdG9yeSgpO1xuXHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbkZhY3RvcnkgPSBuZXcgQ29sdW1uRXhwYW5zaW9uRmFjdG9yeShjb2x1bW5JbmZvRmFjdG9yeSk7XG5cblx0XHRjb25zdCBjb2x1bW5TZXRGYWN0b3J5ID0gbmV3IENvbHVtblNldEZhY3RvcnkoXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdGNvbHVtbkluZm9GYWN0b3J5LFxuXHRcdCk7XG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5ID0gbmV3IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSgpO1xuXG5cdFx0Y29uc3QgbG9ja1NlcnZpY2UgPSBuZXcgTG9ja1NlcnZpY2UoXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHQpO1xuXHRcdGNvbnN0IHRlbXBsYXRlRmFjdG9yeSA9IG5ldyBUZW1wbGF0ZUZhY3RvcnkoXG5cdFx0XHRjb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHQpO1xuXHRcdGNvbnN0IGl0ZW1DYWNoZUZhY3RvcnkgPSBuZXcgSXRlbUNhY2hlRmFjdG9yeShxdWVyeU1hdGNoZXJGYWN0b3J5KTtcblx0XHRjb25zdCBpdGVtUmVzb3VyY2VGYWN0b3J5ID0gbmV3IEl0ZW1SZXNvdXJjZUZhY3RvcnkoXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRsb2NrU2VydmljZSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0ZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRsaW5rVHJlZVNlcnZpY2UsXG5cdFx0KTtcblx0XHRjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5ID0gbmV3IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0aXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHRcdGNoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0KTtcblx0XHRjb25zdCBpdGVtRW50cnlGYWN0b3J5ID0gbmV3IEl0ZW1FbnRyeUZhY3RvcnkoXG5cdFx0XHRhdXRoSW50ZXJmYWNlLFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGV4Y2VwdGlvbkhhbmRsZXIsXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0aXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5U2VydmljZSA9IG5ldyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlKFxuXHRcdFx0cXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdFx0cXVlcnlTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlID0gbmV3IENvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UoKTtcblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeUZhY3RvcnkgPSBuZXcgQ29sbGVjdGlvbkVudHJ5RmFjdG9yeShcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRjb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkNhY2hlRmFjdG9yeSA9IG5ldyBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5KFxuXHRcdFx0cXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5ID0gbmV3IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeShxdWVyeU1hdGNoZXJGYWN0b3J5KTtcblxuXHRcdGNvbnN0IHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5ID0gbmV3IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5KGNvbHVtblV0aWwpO1xuXG5cdFx0Y29uc3QgY3JlYXRlUmVxdWVzdEZhY3RvcnkgPSBuZXcgQ3JlYXRlUmVxdWVzdEZhY3RvcnkoXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkgPSBuZXcgQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSgpO1xuXG5cdFx0Y29uc3QgY2hhbmdlc1Byb2Nlc3NvckZhY3RvcnkgPSBuZXcgQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnkoXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0YXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0Y29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNyZWF0ZVJlcXVlc3RGYWN0b3J5LFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5ID0gbmV3IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkoKTtcblxuXHRcdGNvbnN0IHJlcXVlc3RCdWZmZXJNYW5hZ2VyID0gbmV3IFJlcXVlc3RCdWZmZXJNYW5hZ2VyKFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHQpO1xuXG5cdFx0Y29uc3QgdGVtcGxhdGVDYWNoZSA9IG5ldyBUZW1wbGF0ZUNhY2hlKFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0dGVtcGxhdGVGYWN0b3J5LFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0KTtcblxuXHRcdGNvbnN0IHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5KFxuXHRcdFx0dGhpcyxcblx0XHRcdGNvbHVtbkNhY2hlLFxuXHRcdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHRhdXRoSW50ZXJmYWNlLFxuXHRcdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdGNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5LFxuXHRcdFx0bG9ja1NlcnZpY2UsXG5cdFx0XHRtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRcdGl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0ZW1wbGF0ZUNhY2hlLFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRpdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5U2VydmljZSxcblx0XHRcdGxpbmtUcmVlU2VydmljZSxcblx0XHQpO1xuXG5cdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXIuc2V0U2VydmVyQ2FjaGUoXG5cdFx0XHR0cmFuc2FjdGlvbkNhY2hlRmFjdG9yeS5nZXRTZXJ2ZXJDYWNoZSgpLFxuXHRcdCk7XG5cblx0XHRjb25zdCBzb2NrZXRNZXNzYWdlSGFuZGxlciA9IG5ldyBTb2NrZXRNZXNzYWdlSGFuZGxlcihcblx0XHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHR0aGlzLmFwaUZvcm1hdHRlciA9IGFwaUZvcm1hdHRlcjtcblx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlID0gYXBpUmVxdWVzdFNlcnZpY2U7XG5cdFx0dGhpcy5hcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkgPSBhcGlSZXNwb25zZVByb2Nlc3NvckZhY3Rvcnk7XG5cdFx0dGhpcy5jaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5ID0gY2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTtcblx0XHR0aGlzLmNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5ID0gY2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uQ2FjaGVGYWN0b3J5ID0gY29sbGVjdGlvbkNhY2hlRmFjdG9yeTtcblx0XHR0aGlzLmNvbGxlY3Rpb25FbnRyeUZhY3RvcnkgPSBjb2xsZWN0aW9uRW50cnlGYWN0b3J5O1xuXHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZSA9IGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U7XG5cdFx0dGhpcy5jb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnkgPSBjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5ID0gY29sbGVjdGlvblJlc291cmNlRmFjdG9yeTtcblx0XHR0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UgPSBjb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlO1xuXHRcdHRoaXMuY29sdW1uQ2FjaGUgPSBjb2x1bW5DYWNoZTtcblx0XHR0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkgPSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5O1xuXHRcdHRoaXMuY29sdW1uSGFuZGxlciA9IGNvbHVtbkhhbmRsZXI7XG5cdFx0dGhpcy5jb2x1bW5JbmZvRmFjdG9yeSA9IGNvbHVtbkluZm9GYWN0b3J5O1xuXHRcdHRoaXMuY29sdW1uU2V0RmFjdG9yeSA9IGNvbHVtblNldEZhY3Rvcnk7XG5cdFx0dGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkgPSBjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk7XG5cdFx0dGhpcy5jb2x1bW5VdGlsID0gY29sdW1uVXRpbDtcblx0XHR0aGlzLmNyZWF0ZVJlcXVlc3RGYWN0b3J5ID0gY3JlYXRlUmVxdWVzdEZhY3Rvcnk7XG5cdFx0dGhpcy5pdGVtQ2FjaGVGYWN0b3J5ID0gaXRlbUNhY2hlRmFjdG9yeTtcblx0XHR0aGlzLml0ZW1FbnRyeUZhY3RvcnkgPSBpdGVtRW50cnlGYWN0b3J5O1xuXHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZSA9IGl0ZW1FbnRyeVNlcnZpY2U7XG5cdFx0dGhpcy5pdGVtUmVzb3VyY2VGYWN0b3J5ID0gaXRlbVJlc291cmNlRmFjdG9yeTtcblx0XHR0aGlzLmtleVNlcnZpY2UgPSBrZXlTZXJ2aWNlO1xuXHRcdHRoaXMudHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkgPSB0cmFuc2FjdGlvbkNhY2hlRmFjdG9yeTtcblx0XHR0aGlzLmxvY2tTZXJ2aWNlID0gbG9ja1NlcnZpY2U7XG5cdFx0dGhpcy5tb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5ID0gbW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTtcblx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnkgPSBxdWVyeU1hdGNoZXJGYWN0b3J5O1xuXHRcdHRoaXMucXVlcnlQYXJzZXJGYWN0b3J5ID0gcXVlcnlQYXJzZXJGYWN0b3J5O1xuXHRcdHRoaXMucXVlcnlTZXJ2aWNlID0gcXVlcnlTZXJ2aWNlO1xuXHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgPSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTtcblx0XHR0aGlzLnNvY2tldE1lc3NhZ2VIYW5kbGVyID0gc29ja2V0TWVzc2FnZUhhbmRsZXI7XG5cdFx0dGhpcy50ZW1wbGF0ZUZhY3RvcnkgPSB0ZW1wbGF0ZUZhY3Rvcnk7XG5cdFx0dGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5ID0gY2hhbmdlc0RlbHRhRmFjdG9yeTtcblx0XHR0aGlzLnRlbXBsYXRlQ2FjaGUgPSB0ZW1wbGF0ZUNhY2hlO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub29wICgpIHtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5ICh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWU7XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL2NvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vY2xhc3Nlcyc7XG5leHBvcnQgKiBmcm9tICcuL2ZhY3Rvcmllcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdLCJzb3VyY2VSb290IjoiIn0=
|