@pepperi-addons/ngx-lib 0.4.2-beta.92 → 0.4.2-beta.94
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/esm2020/list/list.component.mjs +2 -9
- package/fesm2015/pepperi-addons-ngx-lib-list.mjs +1 -8
- package/fesm2015/pepperi-addons-ngx-lib-list.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-list.mjs +1 -8
- package/fesm2020/pepperi-addons-ngx-lib-list.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -390,14 +390,7 @@ export class PepListComponent {
|
|
|
390
390
|
setColumnsWidth(widthToSet, wait = false) {
|
|
391
391
|
this.renderer.setStyle(this.hostElement.nativeElement, 'width', widthToSet);
|
|
392
392
|
// Do this only after UI is change cause the property isTable is Input and can refresh after this thread.
|
|
393
|
-
if (this.virtualScroller) {
|
|
394
|
-
this.renderer.setStyle(this.virtualScroller.contentElementRef.nativeElement, 'width', widthToSet === 'inherit' ? '100%' : widthToSet);
|
|
395
|
-
}
|
|
396
|
-
// Wait for delay to update properties in the last chosen and not this.
|
|
397
|
-
// await new Promise((resolve) => setTimeout(resolve, 0));
|
|
398
393
|
setTimeout(() => {
|
|
399
|
-
this.renderer.setStyle(this.hostElement.nativeElement, 'width', widthToSet);
|
|
400
|
-
// Do this only after UI is change cause the property isTable is Input and can refresh after this thread.
|
|
401
394
|
if (this.virtualScroller) {
|
|
402
395
|
this.renderer.setStyle(this.virtualScroller.contentElementRef.nativeElement, 'width', widthToSet === 'inherit' ? '100%' : widthToSet);
|
|
403
396
|
}
|
|
@@ -1029,7 +1022,7 @@ export class PepListComponent {
|
|
|
1029
1022
|
}
|
|
1030
1023
|
totalCalcColsWidth += uiControlField.calcColumnWidth;
|
|
1031
1024
|
}
|
|
1032
|
-
const widthToSet = (this.tableStartWidth +
|
|
1025
|
+
const widthToSet = (this.tableStartWidth + widthToAdd) + 'px';
|
|
1033
1026
|
console.log(`onListResize -> widthToSet: ${widthToSet} *** widthToAdd: ${widthToAdd}`);
|
|
1034
1027
|
this.setColumnsWidth(widthToSet);
|
|
1035
1028
|
this.checkForChanges = new Date().getTime();
|
|
@@ -1290,4 +1283,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImpor
|
|
|
1290
1283
|
type: ViewChild,
|
|
1291
1284
|
args: ['selectAllCB']
|
|
1292
1285
|
}] } });
|
|
1293
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL2xpc3QvbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL2xpc3QvbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLFNBQVMsR0FNWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBRUgsaUJBQWlCLEVBSWpCLFVBQVUsR0FFYixNQUFNLHlCQUF5QixDQUFDO0FBTWpDLE9BQU8sRUFBRSx3QkFBd0IsRUFBYSxNQUFNLG9CQUFvQixDQUFDO0FBRXpFLE9BQU8sRUFNSCxnQkFBZ0IsRUFHaEIsaUJBQWlCLEdBS3BCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sS0FBSyxLQUFLLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7OztBQVczQyxNQUFNLE9BQU8sZ0JBQWdCO0lBb016QixZQUNZLFdBQXVCLEVBQ3ZCLGFBQStCLEVBQy9CLGNBQWlDLEVBQ2pDLEVBQXFCLEVBQ3JCLFFBQW1CLEVBQ25CLElBQVk7UUFMWixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFDL0IsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBQ2pDLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQWhMZixjQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDZixtQkFBYyxHQUFXLElBQUksQ0FBQztRQUM5Qiw0QkFBdUIsR0FBeUIsT0FBTyxDQUFDO1FBQ3hELHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQiw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFFaEMsYUFB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dkIsS0FBSztnQkFJRixZQUFZO3NCQURmLEtBQUs7Z0JBUUcsUUFBUTtzQkFBaEIsS0FBSztnQkFJRixVQUFVO3NCQURiLEtBQUs7Z0JBY0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBR0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFJRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBWU4sU0FBUztzQkFEUixNQUFNO2dCQUlQLFVBQVU7c0JBRFQsTUFBTTtnQkFJUCxXQUFXO3NCQURWLE1BQU07Z0JBSVAsYUFBYTtzQkFEWixNQUFNO2dCQUlQLG1CQUFtQjtzQkFEbEIsTUFBTTtnQkFJUCxrQkFBa0I7c0JBRGpCLE1BQU07Z0JBSVAsY0FBYztzQkFEYixNQUFNO2dCQU9QLFFBQVE7c0JBRFAsTUFBTTtnQkFJUCxTQUFTO3NCQURSLE1BQU07Z0JBSVAsUUFBUTtzQkFEUCxNQUFNO2dCQUlQLGdCQUFnQjtzQkFEZixNQUFNO2dCQUdzQyxlQUFlO3NCQUEzRCxTQUFTO3VCQUFDLHdCQUF3QjtnQkFDVCxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIE9uSW5pdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgT25EZXN0cm95LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBOZ1pvbmUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICAgIFBlcExheW91dFNlcnZpY2UsXG4gICAgUGVwU2NyZWVuU2l6ZVR5cGUsXG4gICAgUGVwU2Vzc2lvblNlcnZpY2UsXG4gICAgVUlDb250cm9sLFxuICAgIFVJQ29udHJvbEZpZWxkLFxuICAgIEZJRUxEX1RZUEUsXG4gICAgT2JqZWN0c0RhdGFSb3csXG59IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9uZ3gtbGliJztcbmltcG9ydCB7XG4gICAgSVBlcEZvcm1GaWVsZFZhbHVlQ2hhbmdlRXZlbnQsXG4gICAgSVBlcEZvcm1GaWVsZENsaWNrRXZlbnQsXG59IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9uZ3gtbGliL2Zvcm0nO1xuXG5pbXBvcnQgeyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQsIElQYWdlSW5mbyB9IGZyb20gJy4vdmlydHVhbC1zY3JvbGxlcic7XG5cbmltcG9ydCB7XG4gICAgSVBlcExpc3RMb2FkSXRlbXNFdmVudCxcbiAgICBJUGVwTGlzdFNvcnRpbmdDaGFuZ2VFdmVudCxcbiAgICBJUGVwTGlzdEl0ZW1DbGlja0V2ZW50LFxuICAgIFBlcExpc3RTZWxlY3Rpb25UeXBlLFxuICAgIFBlcExpc3RWaWV3VHlwZSxcbiAgICBQZXBTZWxlY3Rpb25EYXRhLFxuICAgIFBlcExpc3RQYWdlclR5cGUsXG4gICAgSVBlcExpc3RMb2FkUGFnZUV2ZW50LFxuICAgIERFRkFVTFRfUEFHRV9TSVpFLFxuICAgIElQZXBMaXN0U3RhcnRJbmRleENoYW5nZUV2ZW50LFxuICAgIFBlcExpc3RDYXJkU2l6ZVR5cGUsXG4gICAgUGVwTGlzdFRhYmxlVmlld1R5cGUsXG4gICAgSVBlcExpc3RTb3J0aW5nRGF0YSxcbn0gZnJvbSAnLi9saXN0Lm1vZGVsJztcbmltcG9ydCB7XG4gICAgSVBlcExpc3RQYWdlckNoYW5nZUV2ZW50LFxuICAgIFBlcExpc3RQYWdlckNvbXBvbmVudCxcbn0gZnJvbSAnLi9saXN0LXBhZ2VyLmNvbXBvbmVudCc7XG5cbmltcG9ydCAqIGFzIHR3ZWVuIGZyb20gJ0B0d2VlbmpzL3R3ZWVuLmpzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdwZXAtbGlzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2xpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2xpc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgICBob3N0OiB7XG4gICAgICAgICcod2luZG93OnJlc2l6ZSknOiAnb25XaW5SZXNpemUoJGV2ZW50KScsXG4gICAgfSxcbiAgICAvLyBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQZXBMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgc3RhdGljIFRPUF9JVEVNU19ERUZBVUxUID0gMTAwO1xuICAgIHN0YXRpYyBUT1BfSVRFTVNfVEFCTEUgPSAxMDA7XG4gICAgc3RhdGljIFRPUF9JVEVNU19USFVNQk5BSUxTID0gMTAwO1xuICAgIHN0YXRpYyBUT1BfSVRFTVNfQVJSQVkgPSAyNTAwO1xuXG4gICAgc3RhdGljIFNFTEVDVEVEX0lURU1TX1NUQVRFX0tFWSA9ICdTZWxlY3RlZEl0ZW1zJztcbiAgICBzdGF0aWMgVU5fU0VMRUNURURfSVRFTVNfU1RBVEVfS0VZID0gJ1VuU2VsZWN0ZWRJdGVtcyc7XG4gICAgc3RhdGljIEFMTF9TRUxFQ1RFRF9TVEFURV9LRVkgPSAnQWxsU2VsZWN0ZWQnO1xuICAgIHN0YXRpYyBTT1JUX0JZX1NUQVRFX0tFWSA9ICdTb3J0QnknO1xuICAgIHN0YXRpYyBBU0NFTkRJTkdfU1RBVEVfS0VZID0gJ0lzQXNjZW5kaW5nJztcblxuICAgIHN0YXRpYyBNSU5JTVVNX0NPTFVNTl9XSURUSCA9IDcyO1xuXG4gICAgQElucHV0KCkgXG4gICAgc2V0IHNvcnRpbmcodmFsdWU6IElQZXBMaXN0U29ydGluZ0RhdGEpIHtcbiAgICAgICAgdGhpcy5zb3J0QnkgPSB2YWx1ZT8uc29ydEJ5IHx8ICcnO1xuICAgICAgICB0aGlzLmlzQXNjID0gdmFsdWU/LnNvcnRCeS5sZW5ndGggPiAwID8gdmFsdWUuaXNBc2MgOiB0cnVlO1xuICAgIH1cbiAgICBnZXQgc29ydGluZygpOiBJUGVwTGlzdFNvcnRpbmdEYXRhIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICAgICAgICBpc0FzYzogdGhpcy5pc0FzY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBcbiAgICBASW5wdXQoKSBjYWNoZVNpemUgPSAtMTtcbiAgICBASW5wdXQoKSBub0RhdGFGb3VuZE1zZzogc3RyaW5nID0gbnVsbDtcbiAgICBASW5wdXQoKSBzZWxlY3Rpb25UeXBlRm9yQWN0aW9uczogUGVwTGlzdFNlbGVjdGlvblR5cGUgPSAnbXVsdGknO1xuICAgIEBJbnB1dCgpIHNob3dDYXJkU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgQElucHV0KCkgaGlkZUFsbFNlbGVjdGlvbkluTXVsdGkgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpIGNhcmRTaXplOiBQZXBMaXN0Q2FyZFNpemVUeXBlID0gJ21kJztcbiAgICBASW5wdXQoKSB0YWJsZVZpZXdUeXBlOiBQZXBMaXN0VGFibGVWaWV3VHlwZSA9ICdyZWd1bGFyJztcbiAgICBcbiAgICBwcml2YXRlIF92aWV3VHlwZTogUGVwTGlzdFZpZXdUeXBlID0gJyc7XG4gICAgQElucHV0KClcbiAgICBzZXQgdmlld1R5cGUodmFsdWU6IFBlcExpc3RWaWV3VHlwZSkge1xuICAgICAgICB0aGlzLl92aWV3VHlwZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmlzVGFibGUgPSB2YWx1ZSA9PT0gJ3RhYmxlJztcbiAgICB9XG4gICAgZ2V0IHZpZXdUeXBlKCk6IFBlcExpc3RWaWV3VHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92aWV3VHlwZTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBmaXJzdEZpZWxkQXNMaW5rID0gZmFsc2U7XG4gICAgQElucHV0KCkgc3VwcG9ydFNvcnRpbmcgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHN1cHBvcnRSZXNpemluZyA9IHRydWU7XG5cbiAgICBwcml2YXRlIF9wYXJlbnRTY3JvbGw6IEVsZW1lbnQgfCBXaW5kb3cgPSBudWxsO1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHBhcmVudFNjcm9sbCh2YWx1ZTogRWxlbWVudCB8IFdpbmRvdykge1xuICAgICAgICB0aGlzLl9wYXJlbnRTY3JvbGwgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IHBhcmVudFNjcm9sbCgpOiBFbGVtZW50IHwgV2luZG93IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudFNjcm9sbDtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBfbG9ja0V2ZW50cyA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGxvY2tFdmVudHModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fbG9ja0V2ZW50cyA9IHZhbHVlO1xuXG4gICAgICAgIGlmICh0aGlzLl9sb2NrRXZlbnRzKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2xvY2stZXZlbnRzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2xvY2stZXZlbnRzJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGxvY2tFdmVudHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NrRXZlbnRzO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIGxvY2tJdGVtSW5uZXJFdmVudHMgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwcmludE1vZGUgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBpc1JlcG9ydCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHplYnJhU3RyaXBlcyA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHRvdGFsc1JvdyA9IFtdO1xuICAgIEBJbnB1dCgpIHBhZ2VyVHlwZTogUGVwTGlzdFBhZ2VyVHlwZSA9ICdzY3JvbGwnO1xuICAgIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSBERUZBVUxUX1BBR0VfU0laRTtcbiAgICBASW5wdXQoKSBwYWdlSW5kZXggPSAwO1xuICAgIC8vIEBJbnB1dCgpIHN0YXJ0SW5kZXggPSAwO1xuXG4gICAgQElucHV0KCkgYnVmZmVyQW1vdW50ID0gMDtcbiAgICBASW5wdXQoKSBzY3JvbGxBbmltYXRpb25UaW1lID0gNTAwO1xuICAgIEBJbnB1dCgpIHNjcm9sbERlYm91bmNlVGltZSA9IDA7XG4gICAgQElucHV0KCkgc2Nyb2xsVGhyb3R0bGluZ1RpbWUgPSAwO1xuXG4gICAgcHJpdmF0ZSBfdXNlQXNXZWJDb21wb25lbnQgPSBmYWxzZTtcbiAgICBASW5wdXQoKVxuICAgIHNldCB1c2VBc1dlYkNvbXBvbmVudCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl91c2VBc1dlYkNvbXBvbmVudCA9IHZhbHVlO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwb3J0RnVuY3Rpb25zT25Ib3N0RWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCB1c2VBc1dlYkNvbXBvbmVudCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZUFzV2ViQ29tcG9uZW50O1xuICAgIH1cblxuICAgIEBPdXRwdXQoKVxuICAgIGl0ZW1DbGljazogRXZlbnRFbWl0dGVyPElQZXBMaXN0SXRlbUNsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGVwTGlzdEl0ZW1DbGlja0V2ZW50PigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgZmllbGRDbGljazogRXZlbnRFbWl0dGVyPElQZXBGb3JtRmllbGRDbGlja0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBlcEZvcm1GaWVsZENsaWNrRXZlbnQ+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPElQZXBGb3JtRmllbGRWYWx1ZUNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBlcEZvcm1GaWVsZFZhbHVlQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBzb3J0aW5nQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SVBlcExpc3RTb3J0aW5nQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGVwTGlzdFNvcnRpbmdDaGFuZ2VFdmVudD4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHNlbGVjdGVkSXRlbXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBzZWxlY3RlZEl0ZW1DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBzZWxlY3RBbGxDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIC8vIEBPdXRwdXQoKVxuICAgIC8vIHNpbmdsZUFjdGlvbkNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgbGlzdExvYWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIGxvYWRJdGVtczogRXZlbnRFbWl0dGVyPElQZXBMaXN0TG9hZEl0ZW1zRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGVwTGlzdExvYWRJdGVtc0V2ZW50PigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgbG9hZFBhZ2U6IEV2ZW50RW1pdHRlcjxJUGVwTGlzdExvYWRQYWdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGVwTGlzdExvYWRQYWdlRXZlbnQ+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBzdGFydEluZGV4Q2hhbmdlOiBFdmVudEVtaXR0ZXI8SVBlcExpc3RTdGFydEluZGV4Q2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGVwTGlzdFN0YXJ0SW5kZXhDaGFuZ2VFdmVudD4oKTtcblxuICAgIEBWaWV3Q2hpbGQoVmlydHVhbFNjcm9sbGVyQ29tcG9uZW50KSBwcml2YXRlIHZpcnR1YWxTY3JvbGxlcjogVmlydHVhbFNjcm9sbGVyQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdEFsbENCJykgc2VsZWN0QWxsQ0I6IGFueTtcblxuICAgIHByaXZhdGUgX2xheW91dDogVUlDb250cm9sID0gbnVsbDtcbiAgICBnZXQgbGF5b3V0KCk6IFVJQ29udHJvbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXlvdXQ7XG4gICAgfVxuXG4gICAgdG90YWxSb3dzID0gLTE7XG4gICAgaXNUYWJsZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgaGFzQ29sdW1uV2lkdGhPZlR5cGVQZXJjZW50YWdlID0gdHJ1ZTtcblxuICAgIHByaXZhdGUgX2l0ZW1zOiBBcnJheTxPYmplY3RzRGF0YVJvdz4gPSBudWxsO1xuICAgIGdldCBpdGVtcygpOiBBcnJheTxPYmplY3RzRGF0YVJvdz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpdGVtc0NvdW50ZXIgPSAwO1xuXG4gICAgY3VycmVudFBhZ2VJdGVtczogQXJyYXk8T2JqZWN0c0RhdGFSb3c+O1xuXG4gICAgU0VQQVJBVE9SID0gJywnO1xuICAgIGlzQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBzZWxlY3RlZEl0ZW1zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICB1blNlbGVjdGVkSXRlbXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gICAgcHJpdmF0ZSBjdXJyZW50VHdlZW46IGFueTtcblxuICAgIHNlbGVjdGVkSXRlbUlkID0gJyc7XG4gICAgaG92ZXJlZEl0ZW1JZCA9ICcnO1xuXG4gICAgcHJpdmF0ZSBjb250YWluZXJXaWR0aCA9IDA7XG4gICAgcHJpdmF0ZSB0YWJsZVNjcm9sbFdpZHRoID0gMDtcblxuICAgIHByaXZhdGUgX2xvYWRpbmdJdGVtc0Zyb21BcGkgPSBmYWxzZTtcbiAgICBnZXQgbG9hZGluZ0l0ZW1zRnJvbUFwaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRpbmdJdGVtc0Zyb21BcGk7XG4gICAgfVxuXG4gICAgc2NyZWVuU2l6ZTogUGVwU2NyZWVuU2l6ZVR5cGU7XG4gICAgZGV2aWNlSGFzTW91c2UgPSBmYWxzZTtcblxuICAgIC8vIEZvciByZXNpemVcbiAgICBwcmVzc2VkQ29sdW1uID0gJyc7XG4gICAgcHJlc3NlZENvbHVtbkluZGV4ID0gLTE7XG4gICAgc3RhcnRYID0gMDtcbiAgICBzdGFydFdpZHRoID0gMDtcbiAgICB0YWJsZVN0YXJ0V2lkdGggPSAwO1xuICAgIFxuICAgIHByaXZhdGUgbGFzdENvbHVtbnNXaWR0aDogQXJyYXk8eyBjb2x1bW5BUElOYW1lOiBzdHJpbmcsIGNhbGNDb2x1bW5XaWR0aDogbnVtYmVyLCBjYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZzogc3RyaW5nLCBjYWxjQ29sdW1uV2lkdGhTdHJpbmc6IHN0cmluZyB9PiA9IFtdO1xuXG4gICAgLy8gRm9yIHNvcnRpbmdcbiAgICBpc0FzYyA9IHRydWU7XG4gICAgc29ydEJ5ID0gJyc7XG4gICAgaXNVc2VyU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBjaGVja0ZvckNoYW5nZXM6IGFueSA9IG51bGw7XG4gICAgY2FsY3VsYXRlZE9iamVjdEhlaWdodCA9ICdhdXRvJztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGhvc3RFbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIGxheW91dFNlcnZpY2U6IFBlcExheW91dFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc2Vzc2lvblNlcnZpY2U6IFBlcFNlc3Npb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZVxuICAgICkge1xuICAgICAgICAvLyB0aGlzLm5hdGl2ZVdpbmRvdyA9IHdpbmRvdztcbiAgICAgICAgdGhpcy5sYXlvdXRTZXJ2aWNlLm9uUmVzaXplJC5zdWJzY3JpYmUoKHNpemU6IFBlcFNjcmVlblNpemVUeXBlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNjcmVlblNpemUgPSBzaXplO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxheW91dFNlcnZpY2Uub25Nb3VzZU92ZXIkLnN1YnNjcmliZSgoZGV2aWNlSGFzTW91c2U6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlSGFzTW91c2UgPSBkZXZpY2VIYXNNb3VzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSAwO1xuICAgICAgICB0aGlzLmRldmljZUhhc01vdXNlID0gdGhpcy5sYXlvdXRTZXJ2aWNlLmdldERldmljZUhhc01vdXNlKCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250YWluZXJXaWR0aCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldENvbnRhaW5lcldpZHRoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgLy8gaWYgKHRoaXMudmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgLy8gICAgIHRoaXMudmFsdWVDaGFuZ2UudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGlmICh0aGlzLmxvYWRJdGVtcykge1xuICAgICAgICAvLyAgICAgdGhpcy5sb2FkSXRlbXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGlmICh0aGlzLmxvYWRQYWdlKSB7XG4gICAgICAgIC8vICAgICB0aGlzLmxvYWRQYWdlLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyBpZiAodGhpcy5zb3J0aW5nQ2hhbmdlKSB7XG4gICAgICAgIC8vICAgICB0aGlzLnNvcnRpbmdDaGFuZ2UudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGlmICh0aGlzLmZpZWxkQ2xpY2spIHtcbiAgICAgICAgLy8gICAgIHRoaXMuZmllbGRDbGljay51bnN1YnNjcmliZSgpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gaWYgKHRoaXMuaXRlbUNsaWNrKSB7XG4gICAgICAgIC8vICAgICB0aGlzLml0ZW1DbGljay51bnN1YnNjcmliZSgpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gaWYgKHRoaXMubGlzdExvYWQpIHtcbiAgICAgICAgLy8gICAgIHRoaXMubGlzdExvYWQudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuc2F2ZVNvcnRpbmdUb1Nlc3Npb24oKTtcbiAgICB9XG5cbiAgICBnZXRDYWNoZWRJdGVtc051bWJlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVTaXplID49IDAgPyB0aGlzLmNhY2hlU2l6ZSA6IFBlcExpc3RDb21wb25lbnQuVE9QX0lURU1TX0FSUkFZO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2Nyb2xsaW5nRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50U2Nyb2xsID8gdGhpcy5wYXJlbnRTY3JvbGwgOiB0aGlzLnZpcnR1YWxTY3JvbGxlcj8uY29udGVudEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsVG9Ub3AoYW5pbWF0ZSA9IHRydWUpIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsaW5nRWxlbWVudCA9IHRoaXMuZ2V0U2Nyb2xsaW5nRWxlbWVudCgpO1xuICAgICAgICBpZiAoc2Nyb2xsaW5nRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gMDtcblxuICAgICAgICAgICAgLy8gdG90YWxseSBkaXNhYmxlIGFuaW1hdGVcbiAgICAgICAgICAgIGlmICghYW5pbWF0ZSB8fCB0aGlzLnNjcm9sbEFuaW1hdGlvblRpbWUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsaW5nRWxlbWVudCBpbnN0YW5jZW9mIFdpbmRvdykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgc2Nyb2xsVG9wKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBhbmltYXRpb25SZXF1ZXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzV2luZG93ID0gc2Nyb2xsaW5nRWxlbWVudCBpbnN0YW5jZW9mIFdpbmRvdztcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U2Nyb2xsVG9wID1cbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsaW5nRWxlbWVudCBpbnN0YW5jZW9mIFdpbmRvd1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB3aW5kb3cucGFnZVlPZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxUb3A7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VHdlZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUd2Vlbi5zdG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFR3ZWVuID0gbmV3IHR3ZWVuLlR3ZWVuKHsgc2Nyb2xsVG9wOiBjdXJyZW50U2Nyb2xsVG9wIH0pXG4gICAgICAgICAgICAgICAgICAgIC50byh7IHNjcm9sbFRvcCB9LCB0aGlzLnNjcm9sbEFuaW1hdGlvblRpbWUpXG4gICAgICAgICAgICAgICAgICAgIC5lYXNpbmcodHdlZW4uRWFzaW5nLlF1YWRyYXRpYy5PdXQpXG4gICAgICAgICAgICAgICAgICAgIC5vblVwZGF0ZSgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGRhdGEuc2Nyb2xsVG9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzV2luZG93KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIGRhdGEuc2Nyb2xsVG9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsaW5nRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Njcm9sbFRvcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc2Nyb2xsVG9wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLm9uU3RvcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShhbmltYXRpb25SZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhbmltYXRlID0gKHRpbWU/KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFR3ZWVuLnVwZGF0ZSh0aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFR3ZWVuLl9vYmplY3Quc2Nyb2xsVG9wICE9PSBzY3JvbGxUb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uUmVxdWVzdCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGFuaW1hdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2VsZWN0aW9uQ2hlY2tCb3hXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA9PT0gJ211bHRpJyA/IDQ0IDogMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENvbnRhaW5lcldpZHRoKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3dIZWlnaHQgPSA0MDsgLy8gdGhlIHRhYmxlIHJvdyBoZWlnaHQgKDIuNXJlbSAqIDE2Zm9udC1zaXplKS5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKFxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnRcbiAgICAgICAgKTtcbiAgICAgICAgLy8gVGhlIGNvbnRhaW5lci1mbHVpZCBjbGFzcyBwYWRkaW5nIGxlZnQgKyByaWdodCArIGJvcmRlclxuICAgICAgICBjb25zdCBjb250YWluZXJGbHVpZFNwYWNpbmcgPVxuICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUucGFkZGluZ0xlZnQsIDEwKSArIHBhcnNlSW50KHN0eWxlLnBhZGRpbmdSaWdodCwgMTApO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudENvbnRhaW5lciA9XG4gICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50ID4gMFxuICAgICAgICAgICAgICAgID8gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudFxuICAgICAgICAgICAgICAgIDogdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGlmIHZlcnRpY2FsIHNjcm9sbCBzaG91bGQgYXBwZWFyLCBpZiBzbyBzZXQgdGhlIHNjcm9sbCB3aWR0aC4gKHRoaXMudG90YWxSb3dzICsgMSkgKyAxIGlzIGZvciB0aGUgaGVhZGVyIHJvdy5cbiAgICAgICAgdGhpcy50YWJsZVNjcm9sbFdpZHRoID0gcGFyZW50Q29udGFpbmVyLmNsaWVudEhlaWdodCA8IHJvd0hlaWdodCAqICh0aGlzLnRvdGFsUm93cyArIDEpXG4gICAgICAgICAgICA/IHRoaXMubGF5b3V0U2VydmljZS5nZXRTY3JvbGxiYXJXaWR0aCgpXG4gICAgICAgICAgICA6IDA7XG5cbiAgICAgICAgLy8gVGhlIHNlbGVjdGlvbkNoZWNrQm94V2lkdGggd2lkdGggKyBjb250YWluZXJGbHVpZFNwYWNpbmcgKyB0aGlzLnRhYmxlU2Nyb2xsV2lkdGguXG4gICAgICAgIGNvbnN0IHJvd0hlYWRlcldpZHRoVG9TdWIgPVxuICAgICAgICAgICAgY29udGFpbmVyRmx1aWRTcGFjaW5nICsgdGhpcy5nZXRTZWxlY3Rpb25DaGVja0JveFdpZHRoKCkgKyB0aGlzLnRhYmxlU2Nyb2xsV2lkdGg7XG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSBwYXJlbnRDb250YWluZXIub2Zmc2V0V2lkdGggLSByb3dIZWFkZXJXaWR0aFRvU3ViO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZVNvcnRpbmdUb1Nlc3Npb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2Uuc2V0T2JqZWN0KFxuICAgICAgICAgICAgUGVwTGlzdENvbXBvbmVudC5TT1JUX0JZX1NUQVRFX0tFWSxcbiAgICAgICAgICAgIHRoaXMuc29ydEJ5XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2Uuc2V0T2JqZWN0KFxuICAgICAgICAgICAgUGVwTGlzdENvbXBvbmVudC5BU0NFTkRJTkdfU1RBVEVfS0VZLFxuICAgICAgICAgICAgdGhpcy5pc0FzY1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VG9wSXRlbXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNUYWJsZVxuICAgICAgICAgICAgPyBQZXBMaXN0Q29tcG9uZW50LlRPUF9JVEVNU19UQUJMRVxuICAgICAgICAgICAgOiBQZXBMaXN0Q29tcG9uZW50LlRPUF9JVEVNU19USFVNQk5BSUxTO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzYWJsZVNjcm9sbChkaXNhYmxlOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChkaXNhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LCAnbG9jay1ldmVudHMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQsICdsb2NrLWV2ZW50cycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVMb2FkaW5nSXRlbXNGcm9wQXBpKGxvYWRpbmdJdGVtc0Zyb21BcGk6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zRnJvbUFwaSA9IGxvYWRpbmdJdGVtc0Zyb21BcGk7XG5cbiAgICAgICAgLy8gdGhpcy5kaXNhYmxlU2Nyb2xsKGxvYWRpbmdJdGVtc0Zyb21BcGkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ3VycmVudFBhZ2VJdGVtcyhzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZUl0ZW1zID0gdGhpcy5pdGVtcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTZWxlY3Rpb25JdGVtcyhcbiAgICAgICAgaXRlbUlkOiBzdHJpbmcsXG4gICAgICAgIHVuaXFJdGVtSWQ6IHN0cmluZyxcbiAgICAgICAgaXNDaGVja2VkOiBib29sZWFuXG4gICAgKTogdm9pZCB7XG4gICAgICAgIC8vIFNldCBzZWxlY3RlZCBpdGVtIGNoZWNrYm94XG4gICAgICAgIGlmICh0aGlzLmlzQWxsU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChpc0NoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuU2VsZWN0ZWRJdGVtcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuc2V0KGl0ZW1JZCwgdW5pcUl0ZW1JZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVuU2VsZWN0ZWRJdGVtcy5zZXQoaXRlbUlkLCB1bmlxSXRlbUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc0NoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuU2VsZWN0ZWRJdGVtcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuc2V0KGl0ZW1JZCwgdW5pcUl0ZW1JZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVuU2VsZWN0ZWRJdGVtcy5zZXQoaXRlbUlkLCB1bmlxSXRlbUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VW5pcUl0ZW1JZChpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGUgPSAnJyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpdGVtSWQgKyB0aGlzLlNFUEFSQVRPUiArIGl0ZW1UeXBlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TGF5b3V0KCk6IHZvaWQge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnRvdGFsUm93cyA9PT0gMCB8fFxuICAgICAgICAgICAgIXRoaXMuX2xheW91dCB8fFxuICAgICAgICAgICAgIXRoaXMuX2xheW91dC5Db250cm9sRmllbGRzIHx8XG4gICAgICAgICAgICB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkcy5sZW5ndGggPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkcy5mb3JFYWNoKChjZikgPT4ge1xuICAgICAgICAgICAgaWYgKGNmLkNvbHVtbldpZHRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY2YuQ29sdW1uV2lkdGggPSAxMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuaXNUYWJsZSAmJlxuICAgICAgICAgICAgICAgIChjZi5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuSW1hZ2UgfHxcbiAgICAgICAgICAgICAgICAgICAgLy8gY2YuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLkluZGljYXRvcnMgfHwgPz8/XG4gICAgICAgICAgICAgICAgICAgIGNmLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5TaWduYXR1cmUgfHxcbiAgICAgICAgICAgICAgICAgICAgY2YuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLk51bWJlckludGVnZXJRdWFudGl0eVNlbGVjdG9yIHx8XG4gICAgICAgICAgICAgICAgICAgIGNmLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5OdW1iZXJSZWFsUXVhbnRpdHlTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBjZi5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVySW50ZWdlckZvck1hdHJpeCB8fFxuICAgICAgICAgICAgICAgICAgICBjZi5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVyUmVhbEZvck1hdHJpeCB8fFxuICAgICAgICAgICAgICAgICAgICBjZi5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuUGFja2FnZSB8fFxuICAgICAgICAgICAgICAgICAgICBjZi5BcGlOYW1lID09PSAnVW5pdHNRdWFudGl0eScgfHxcbiAgICAgICAgICAgICAgICAgICAgY2YuQXBpTmFtZSA9PT0gJ1F1YW50aXR5U2VsZWN0b3InKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2YuTGF5b3V0LlhBbGlnbm1lbnQgPSAzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMuY2RbJ2Rlc3Ryb3llZCddKSB7XG4gICAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgY29udGFpbmVyIHdpZHRoLlxuICAgICAgICBpZiAodGhpcy5jb250YWluZXJXaWR0aCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldENvbnRhaW5lcldpZHRoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0xhc3RDb2x1bW5zV2lkdGhTZXQgPSB0aGlzLnNldExhc3RDb2x1bW5zV2lkdGgoKTtcbiAgICAgICAgICAgIFxuICAgICAgICAvLyBTZXQgdGhlIGxheW91dCBvbmx5IGlmIHRoZSBsYXN0IGNvbHVtbnMgd2lkdGggY291bGRuJ3Qgc2V0LlxuICAgICAgICBpZiAoIWlzTGFzdENvbHVtbnNXaWR0aFNldCkge1xuICAgICAgICAgICAgdGhpcy5jYWxjQ29sdW1uc1dpZHRoKCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuY2hlY2tGb3JDaGFuZ2VzID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRMYXN0Q29sdW1uc1dpZHRoKCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IHRvdGFsQ2FsY0NvbHNXaWR0aCA9IDA7XG4gICAgICAgIGxldCB3aWR0aFRvU2V0ID0gJ2luaGVyaXQnO1xuXG4gICAgICAgIGlmICh0aGlzLmxhc3RDb2x1bW5zV2lkdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyB0aGUgc2FtZSBVSSBjb250cm9sIGZvciB0YWJsZS5cbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RDb2x1bW5zV2lkdGgubGVuZ3RoID09PSB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgdWlDb250cm9sc0FyZVRoZVNhbWUgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX2xheW91dC5Db250cm9sRmllbGRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1aUNvbnRyb2xGaWVsZDogVUlDb250cm9sRmllbGQgPSB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkc1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAodWlDb250cm9sRmllbGQuQXBpTmFtZSAhPT0gdGhpcy5sYXN0Q29sdW1uc1dpZHRoW2luZGV4XS5jb2x1bW5BUElOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xzQXJlVGhlU2FtZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgaWYgKHVpQ29udHJvbHNBcmVUaGVTYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpQ29udHJvbEZpZWxkOiBVSUNvbnRyb2xGaWVsZCA9IHRoaXMuX2xheW91dC5Db250cm9sRmllbGRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aCA9IHRoaXMubGFzdENvbHVtbnNXaWR0aFtpbmRleF0uY2FsY0NvbHVtbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgPSB0aGlzLmxhc3RDb2x1bW5zV2lkdGhbaW5kZXhdLmNhbGNUaXRsZUNvbHVtbldpZHRoU3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoU3RyaW5nID0gdGhpcy5sYXN0Q29sdW1uc1dpZHRoW2luZGV4XS5jYWxjQ29sdW1uV2lkdGhTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbENhbGNDb2xzV2lkdGggKz0gdGhpcy5sYXN0Q29sdW1uc1dpZHRoW2luZGV4XS5jYWxjQ29sdW1uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoVG9TZXQgPSAodG90YWxDYWxjQ29sc1dpZHRoICsgdGhpcy5nZXRTZWxlY3Rpb25DaGVja0JveFdpZHRoKCkpICsgJ3B4J1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgc2V0TGFzdENvbHVtbnNXaWR0aCAtPiB3aWR0aFRvU2V0OiAke3dpZHRoVG9TZXR9ICoqKiB0b3RhbENhbGNDb2xzV2lkdGg6ICR7dG90YWxDYWxjQ29sc1dpZHRofWApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENvbHVtbnNXaWR0aCh3aWR0aFRvU2V0KTtcblxuICAgICAgICAgICAgICAgICAgICByZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Q29sdW1uc1dpZHRoKHdpZHRoVG9TZXQ6IHN0cmluZywgd2FpdCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgICAgd2lkdGhUb1NldFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERvIHRoaXMgb25seSBhZnRlciBVSSBpcyBjaGFuZ2UgY2F1c2UgdGhlIHByb3BlcnR5IGlzVGFibGUgaXMgSW5wdXQgYW5kIGNhbiByZWZyZXNoIGFmdGVyIHRoaXMgdGhyZWFkLlxuICAgICAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsZXIpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsZXIuY29udGVudEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgICAgICAgIHdpZHRoVG9TZXQgPT09ICdpbmhlcml0JyA/ICcxMDAlJyA6IHdpZHRoVG9TZXRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2FpdCBmb3IgZGVsYXkgdG8gdXBkYXRlIHByb3BlcnRpZXMgaW4gdGhlIGxhc3QgY2hvc2VuIGFuZCBub3QgdGhpcy5cbiAgICAgICAgLy8gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMCkpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgICAgICB3aWR0aFRvU2V0XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBEbyB0aGlzIG9ubHkgYWZ0ZXIgVUkgaXMgY2hhbmdlIGNhdXNlIHRoZSBwcm9wZXJ0eSBpc1RhYmxlIGlzIElucHV0IGFuZCBjYW4gcmVmcmVzaCBhZnRlciB0aGlzIHRocmVhZC5cbiAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxlcikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFNjcm9sbGVyLmNvbnRlbnRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICd3aWR0aCcsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoVG9TZXQgPT09ICdpbmhlcml0JyA/ICcxMDAlJyA6IHdpZHRoVG9TZXRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGNDb2x1bW5zV2lkdGgoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpeGVkTXVsdGlwbGUgPSAzLjc4OyAvLyBmb3IgY29udmVydGluZyBlbSB0byBwaXhlbC5cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5fbGF5b3V0LkNvbnRyb2xGaWVsZHMubGVuZ3RoO1xuICAgICAgICBcbiAgICAgICAgLy8gSXMgdGFibGUgQU5EIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjb2x1bW4gb2Ygd2lkdGggdHlwZSBvZiBwZXJjZW50YWdlLlxuICAgICAgICBpZiAodGhpcy5pc1RhYmxlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbGF5b3V0ICYmIHRoaXMuX2xheW91dC5Db250cm9sRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNDb2x1bW5XaWR0aE9mVHlwZVBlcmNlbnRhZ2UgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2YpID0+IGNmLkNvbHVtbldpZHRoVHlwZSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICApLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBjb2x1bW5zIHNpemUgaXMgZml4ZWQgYW5kIHRoZSB0b3RhbCBpcyBzbWFsbCB0aGVuIHRoZSBjb250YWluZXIgY2hhbmdlIGl0IHRvIHBlcmNlbnRhZ2UuXG4gICAgICAgIGlmICghdGhpcy5oYXNDb2x1bW5XaWR0aE9mVHlwZVBlcmNlbnRhZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsRml4ZWRDb2xzV2lkdGggPSB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkcy5tYXAoXG4gICAgICAgICAgICAgICAgKGNmKSA9PiBjZi5Db2x1bW5XaWR0aCAqIGZpeGVkTXVsdGlwbGVcbiAgICAgICAgICAgICkucmVkdWNlKChzdW0sIGN1cnJlbnQpID0+IHN1bSArIGN1cnJlbnQpO1xuXG4gICAgICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPiB0b3RhbEZpeGVkQ29sc1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNDb2x1bW5XaWR0aE9mVHlwZVBlcmNlbnRhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRvdGFsQ2FsY0NvbHNXaWR0aCA9IDA7XG5cbiAgICAgICAgbGV0IHdpZHRoVG9TZXQgPSAnaW5oZXJpdCc7XG5cbiAgICAgICAgLy8gQ2FsYyBieSBwZXJjZW50YWdlXG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbldpZHRoT2ZUeXBlUGVyY2VudGFnZSkge1xuICAgICAgICAgICAgY29uc3QgdG90YWxDb2xzV2lkdGg6IG51bWJlciA9IHRoaXMuX2xheW91dC5Db250cm9sRmllbGRzLm1hcChcbiAgICAgICAgICAgICAgICAoY2YpID0+IGNmLkNvbHVtbldpZHRoXG4gICAgICAgICAgICApLnJlZHVjZSgoc3VtLCBjdXJyZW50KSA9PiBzdW0gKyBjdXJyZW50KTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVpQ29udHJvbEZpZWxkOiBVSUNvbnRyb2xGaWVsZCA9IHRoaXMuX2xheW91dC5Db250cm9sRmllbGRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWxjQ29sdW1uV2lkdGhQZXJjZW50YWdlID0gKDEwMCAvIHRvdGFsQ29sc1dpZHRoKSAqIHVpQ29udHJvbEZpZWxkLkNvbHVtbldpZHRoO1xuXG4gICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoID0gTWF0aC5mbG9vcigodGhpcy5jb250YWluZXJXaWR0aCAqIGNhbGNDb2x1bW5XaWR0aFBlcmNlbnRhZ2UpIC8gMTAwKTtcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZyA9IHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aFN0cmluZyA9ICdjYWxjKDEwMCUgLSAnICsgdG90YWxDYWxjQ29sc1dpZHRoICsgJ3B4KSc7IC8vIEZvciAxMDAlXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgPSB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGhTdHJpbmcgPSB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGggKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbENhbGNDb2xzV2lkdGggKz0gdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1aUNvbnRyb2xGaWVsZDogVUlDb250cm9sRmllbGQgPSB0aGlzLl9sYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgLkNvbnRyb2xGaWVsZHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRGaXhlZFdpZHRoID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuQ29sdW1uV2lkdGggKiBmaXhlZE11bHRpcGxlXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZyA9IHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aFN0cmluZyA9IGN1cnJlbnRGaXhlZFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZyA9IHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aFN0cmluZyA9IGN1cnJlbnRGaXhlZFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0b3RhbENhbGNDb2xzV2lkdGggKz0gY3VycmVudEZpeGVkV2lkdGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdpZHRoVG9TZXQgPSAodG90YWxDYWxjQ29sc1dpZHRoICsgdGhpcy5nZXRTZWxlY3Rpb25DaGVja0JveFdpZHRoKCkpICsgJ3B4J1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coYGNhbGNDb2x1bW5zV2lkdGggLT4gd2lkdGhUb1NldDogJHt3aWR0aFRvU2V0fSAqKiogdG90YWxDYWxjQ29sc1dpZHRoOiAke3RvdGFsQ2FsY0NvbHNXaWR0aH1gKTtcbiAgICAgICAgdGhpcy5zZXRDb2x1bW5zV2lkdGgod2lkdGhUb1NldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjT2JqZWN0SGVpZ2h0KCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnZpcnR1YWxTY3JvbGxlci5nZXRDb250ZW50KCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYGNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoOiAke2NvbnRlbnQuY2hpbGRyZW4ubGVuZ3RofWApO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gdGhpcy52aXJ0dWFsU2Nyb2xsZXIuZ2V0RWxlbWVudFNpemUoY29udGVudC5jaGlsZHJlblswXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlZE9iamVjdEhlaWdodCA9IHJlY3QuaGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYHRoaXMuY2FsY3VsYXRlZE9iamVjdEhlaWdodDogJHt0aGlzLmNhbGN1bGF0ZWRPYmplY3RIZWlnaHR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlU2Nyb2xsKGZhbHNlKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0UmVzaXplRGF0YSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGFydFggPSAwO1xuICAgICAgICB0aGlzLnN0YXJ0V2lkdGggPSAwO1xuICAgICAgICB0aGlzLnRhYmxlU3RhcnRXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMucHJlc3NlZENvbHVtbiA9ICcnO1xuICAgICAgICB0aGlzLnByZXNzZWRDb2x1bW5JbmRleCA9IC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFyZW50KGVsLCBwYXJlbnRTZWxlY3Rvcik6IGFueSB7XG4gICAgICAgIC8vIElmIG5vIHBhcmVudFNlbGVjdG9yIGRlZmluZWQgd2lsbCBidWJibGUgdXAgYWxsIHRoZSB3YXkgdG8gKmRvY3VtZW50KlxuICAgICAgICBpZiAocGFyZW50U2VsZWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGFyZW50U2VsZWN0b3IgPSBkb2N1bWVudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBbXTtcbiAgICAgICAgbGV0IHAgPSBlbC5wYXJlbnROb2RlO1xuXG4gICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgIHAgJiZcbiAgICAgICAgICAgIHAuY2xhc3NOYW1lICE9PSAnJyAmJlxuICAgICAgICAgICAgcC5jbGFzc05hbWUuaW5kZXhPZihwYXJlbnRTZWxlY3RvcikgPT09IC0xICYmXG4gICAgICAgICAgICBwYXJlbnRTZWxlY3RvciAhPT0gZG9jdW1lbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBvID0gcDtcbiAgICAgICAgICAgIHAgPSBvLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAuY2xhc3NOYW1lLmluZGV4T2YocGFyZW50U2VsZWN0b3IpID4gLTEpIHtcbiAgICAgICAgICAgIHBhcmVudC5wdXNoKHApOyAvLyBQdXNoIHRoYXQgcGFyZW50U2VsZWN0b3IgeW91IHdhbnRlZCB0byBzdG9wIGF0XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFuSXRlbXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXRlbXNDb3VudGVyID0gMDtcbiAgICAgICAgdGhpcy5faXRlbXMgPVxuICAgICAgICAgICAgdGhpcy50b3RhbFJvd3MgPiAwID8gQXJyYXk8T2JqZWN0c0RhdGFSb3c+KHRoaXMudG90YWxSb3dzKSA6IFtdO1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlSXRlbXMgPSBbXTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVkT2JqZWN0SGVpZ2h0ID0gJ2F1dG8nO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFZhcmlhYmxlc0Zyb21TZXNzaW9uKGl0ZW1zOiBPYmplY3RzRGF0YVJvd1tdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXNPYmplY3Q6IEFycmF5PGFueT4gPSB0aGlzLnNlc3Npb25TZXJ2aWNlLmdldE9iamVjdDxcbiAgICAgICAgICAgIEFycmF5PGFueT5cbiAgICAgICAgPihQZXBMaXN0Q29tcG9uZW50LlNFTEVDVEVEX0lURU1TX1NUQVRFX0tFWSk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXNGcm9tTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID1cbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNPYmplY3QgJiYgc2VsZWN0ZWRJdGVtc09iamVjdC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBuZXcgTWFwKHNlbGVjdGVkSXRlbXNPYmplY3QpXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zRnJvbU1hcCAhPSBudWxsICYmXG4gICAgICAgICAgICB0eXBlb2Ygc2VsZWN0ZWRJdGVtc0Zyb21NYXAuc2l6ZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNGcm9tTWFwLnNpemUgPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gc2VsZWN0ZWRJdGVtc0Zyb21NYXA7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnJlbW92ZU9iamVjdChcbiAgICAgICAgICAgICAgICBQZXBMaXN0Q29tcG9uZW50LlNFTEVDVEVEX0lURU1TX1NUQVRFX0tFWVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5TZWxlY3RlZEl0ZW1zT2JqZWN0OiBBcnJheTxhbnk+ID0gdGhpcy5zZXNzaW9uU2VydmljZS5nZXRPYmplY3Q8XG4gICAgICAgICAgICBBcnJheTxhbnk+XG4gICAgICAgID4oUGVwTGlzdENvbXBvbmVudC5VTl9TRUxFQ1RFRF9JVEVNU19TVEFURV9LRVkpO1xuICAgICAgICBjb25zdCB1blNlbGVjdGVkSXRlbXNNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4gPVxuICAgICAgICAgICAgdW5TZWxlY3RlZEl0ZW1zT2JqZWN0ICYmIHVuU2VsZWN0ZWRJdGVtc09iamVjdC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBuZXcgTWFwKHVuU2VsZWN0ZWRJdGVtc09iamVjdClcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHVuU2VsZWN0ZWRJdGVtc01hcCAhPSBudWxsICYmXG4gICAgICAgICAgICB0eXBlb2YgdW5TZWxlY3RlZEl0ZW1zTWFwLnNpemUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB1blNlbGVjdGVkSXRlbXNNYXAuc2l6ZSA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnVuU2VsZWN0ZWRJdGVtcyA9IHVuU2VsZWN0ZWRJdGVtc01hcDtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2UucmVtb3ZlT2JqZWN0KFxuICAgICAgICAgICAgICAgIFBlcExpc3RDb21wb25lbnQuVU5fU0VMRUNURURfSVRFTVNfU1RBVEVfS0VZXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51blNlbGVjdGVkSXRlbXMuY2xlYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzQWxsU2VsZWN0ZWQgPSB0aGlzLnNlc3Npb25TZXJ2aWNlLmdldE9iamVjdChcbiAgICAgICAgICAgIFBlcExpc3RDb21wb25lbnQuQUxMX1NFTEVDVEVEX1NUQVRFX0tFWVxuICAgICAgICApO1xuICAgICAgICBpZiAoaXNBbGxTZWxlY3RlZCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSBpc0FsbFNlbGVjdGVkICYmIHRoaXMuZ2V0SXNBbGxTZWxlY3RlZChpdGVtcyk7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnJlbW92ZU9iamVjdChcbiAgICAgICAgICAgICAgICBQZXBMaXN0Q29tcG9uZW50LkFMTF9TRUxFQ1RFRF9TVEFURV9LRVlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvcnRCeSA9IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0T2JqZWN0KFxuICAgICAgICAgICAgUGVwTGlzdENvbXBvbmVudC5TT1JUX0JZX1NUQVRFX0tFWVxuICAgICAgICApO1xuICAgICAgICBpZiAoc29ydEJ5ICYmIHNvcnRCeSAhPT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydEJ5ID0gc29ydEJ5O1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5yZW1vdmVPYmplY3QoXG4gICAgICAgICAgICAgICAgUGVwTGlzdENvbXBvbmVudC5TT1JUX0JZX1NUQVRFX0tFWVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc29ydEJ5ID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0FzYyA9IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0T2JqZWN0KFxuICAgICAgICAgICAgUGVwTGlzdENvbXBvbmVudC5BU0NFTkRJTkdfU1RBVEVfS0VZXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpc0FzYyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmlzQXNjID0gaXNBc2M7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnJlbW92ZU9iamVjdChcbiAgICAgICAgICAgICAgICBQZXBMaXN0Q29tcG9uZW50LkFTQ0VORElOR19TVEFURV9LRVlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzQXNjID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SXNBbGxTZWxlY3RlZChpdGVtczogQXJyYXk8T2JqZWN0c0RhdGFSb3c+KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbXM/LnNpemUgPiAwICYmIGl0ZW1zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShpdGVtICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5oYXMoaXRlbT8uVUlELnRvU3RyaW5nKCkpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TnVtYmVyT2ZTdGFydEl0ZW1zKCk6IG51bWJlciB7XG4gICAgICAgIGxldCBudW1iZXJPZlN0YXJ0SXRlbXMgPSAyMDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnNjcmVlblNpemUgPT09IFBlcFNjcmVlblNpemVUeXBlLlhMIHx8XG4gICAgICAgICAgICB0aGlzLnNjcmVlblNpemUgPT09IFBlcFNjcmVlblNpemVUeXBlLkxHXG4gICAgICAgICkge1xuICAgICAgICAgICAgbnVtYmVyT2ZTdGFydEl0ZW1zID0gdGhpcy5pc1RhYmxlID8gNTAgOiA0MDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNjcmVlblNpemUgPT09IFBlcFNjcmVlblNpemVUeXBlLk1EKSB7XG4gICAgICAgICAgICBudW1iZXJPZlN0YXJ0SXRlbXMgPSB0aGlzLmlzVGFibGUgPyAzMCA6IDIwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2NyZWVuU2l6ZSA9PT0gUGVwU2NyZWVuU2l6ZVR5cGUuU00pIHtcbiAgICAgICAgICAgIG51bWJlck9mU3RhcnRJdGVtcyA9IHRoaXMuaXNUYWJsZSA/IDIwIDogMTA7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zY3JlZW5TaXplID09PSBQZXBTY3JlZW5TaXplVHlwZS5YUykge1xuICAgICAgICAgICAgbnVtYmVyT2ZTdGFydEl0ZW1zID0gdGhpcy5pc1RhYmxlID8gMTUgOiA1O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bWJlck9mU3RhcnRJdGVtcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEl0ZW1DbGlja2VkKFxuICAgICAgICBpdGVtSWQsXG4gICAgICAgIGlzU2VsZWN0YWJsZUZvckFjdGlvbnM6IGJvb2xlYW4sXG4gICAgICAgIGl0ZW1UeXBlOiBzdHJpbmcsXG4gICAgICAgIGlzQ2hlY2tlZDogYm9vbGVhblxuICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCB1bmlxSXRlbUlkID0gdGhpcy5nZXRVbmlxSXRlbUlkKGl0ZW1JZCwgaXRlbVR5cGUpO1xuXG4gICAgICAgIC8vIHNlbGVjdCB0aGUgc2VsZWN0ZWQgaXRlbS5cbiAgICAgICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgLy8gU2V0IHNlbGV0ZWQgaXRlbVxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JZCA9IHVuaXFJdGVtSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1JZCA9PT0gdW5pcUl0ZW1JZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWQgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblR5cGVGb3JBY3Rpb25zID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JZC5sZW5ndGggPT09IDAgPyAwIDogMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvblR5cGVGb3JBY3Rpb25zID09PSAnbXVsdGknKSB7XG4gICAgICAgICAgICBpZiAoaXNTZWxlY3RhYmxlRm9yQWN0aW9ucykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uSXRlbXMoaXRlbUlkLCB1bmlxSXRlbUlkLCBpc0NoZWNrZWQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExpc3QgPSB0aGlzLmlzQWxsU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnVuU2VsZWN0ZWRJdGVtc1xuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRJdGVtcztcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGlzdENvdW50ID0gdGhpcy5pc0FsbFNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy50b3RhbFJvd3MgLSBjdXJyZW50TGlzdC5zaXplXG4gICAgICAgICAgICAgICAgICAgIDogY3VycmVudExpc3Quc2l6ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdChjdXJyZW50TGlzdENvdW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJhaXNlIHNlbGVjdGVkIGl0ZW0gY2hhbmdlIGV2ZW50XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblR5cGVGb3JBY3Rpb25zICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlLmVtaXQoe1xuICAgICAgICAgICAgICAgIGlkOiBpdGVtSWQsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGlzQ2hlY2tlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHBvcnRGdW5jdGlvbnNPbkhvc3RFbGVtZW50KCkge1xuICAgICAgICAvLyBUaGlzIGlzIGZvciB3ZWIgY29tcG9uZW50IHVzYWdlIGZvciB1c2UgdGhvc2UgZnVuY3Rpb25zLlxuICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xlYXIgPSB0aGlzLmNsZWFyLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5pbml0TGlzdERhdGEgPSB0aGlzLmluaXRMaXN0RGF0YS5iaW5kKFxuICAgICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudXBkYXRlSXRlbXMgPSB0aGlzLnVwZGF0ZUl0ZW1zLmJpbmQoXG4gICAgICAgICAgICB0aGlzXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC51cGRhdGVQYWdlID0gdGhpcy51cGRhdGVQYWdlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC51cGRhdGVJdGVtID0gdGhpcy51cGRhdGVJdGVtLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgLy8gRm9yIHJlZnJlc2ggdGhlIFVJIHdoZW4gY2hhbmdlIHRoZSBpcyBzZWxlY3RhYmxlIGZvciBhY3Rpb24gb24gaXRlbS5cbiAgICBnZXRpc0l0ZW1EaXNhYmxlZChpdGVtOiBPYmplY3RzRGF0YVJvdyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmludE1vZGUgfHwgdGhpcy5sb2NrSXRlbUlubmVyRXZlbnRzIHx8IChpdGVtICYmICFpdGVtLklzU2VsZWN0YWJsZUZvckFjdGlvbnMpXG4gICAgfVxuXG4gICAgZ2V0SXNBbGxTZWxlY3RlZEZvckFjdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZXMgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy51blNlbGVjdGVkSXRlbXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJlcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsZXI/LnZpZXdQb3J0SXRlbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zLnNpemUgPT09IHRoaXMudG90YWxSb3dzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IHRoaXMuZ2V0SXNBbGxTZWxlY3RlZCh0aGlzLnZpcnR1YWxTY3JvbGxlci52aWV3UG9ydEl0ZW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcy5zaXplIDwgdGhpcy50b3RhbFJvd3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMudmlydHVhbFNjcm9sbGVyLnZpZXdQb3J0SXRlbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSAmJiB0aGlzLnNlbGVjdGVkSXRlbXMuaGFzKGl0ZW0/LlVJRC50b1N0cmluZygpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgc2V0SXNBbGxTZWxlY3RlZChpc0NoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgPT09ICdtdWx0aScpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsQ0IuY2hlY2tlZCA9IGlzQ2hlY2tlZDtcbiAgICAgICAgICAgIHRoaXMuaXNBbGxTZWxlY3RlZCA9IGlzQ2hlY2tlZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlbGVjdEFsbEl0ZW1zRm9yQWN0aW9ucyhlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gRm9yIG1hdGVyaWFsIGNoZWNrYm94IHx8IHJhZGlvLlxuICAgICAgICBjb25zdCBpc0NoZWNrZWQgPSBlLnNvdXJjZS5jaGVja2VkO1xuXG4gICAgICAgIC8vIEluZGV0ZXJtaW5hdGUgbW9kZVxuICAgICAgICBsZXQgaXNJbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMaXN0ID0gdGhpcy5pc0FsbFNlbGVjdGVkXG4gICAgICAgICAgICA/IHRoaXMudW5TZWxlY3RlZEl0ZW1zXG4gICAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRJdGVtcztcbiAgICAgICAgaWYgKGN1cnJlbnRMaXN0LnNpemUgPiAwKSB7XG4gICAgICAgICAgICBpc0luZGV0ZXJtaW5hdGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5pc0FsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdCgwKTtcbiAgICAgICAgICAgIGUuc291cmNlLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5jbGVhcigpO1xuICAgICAgICB0aGlzLnVuU2VsZWN0ZWRJdGVtcy5jbGVhcigpO1xuXG4gICAgICAgIGlmICghaXNJbmRldGVybWluYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSBpc0NoZWNrZWQ7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEFsbENsaWNrLmVtaXQoaXNDaGVja2VkKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgPT09ICdtdWx0aScpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JZCA9ICcnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkSXRlbXMgPSB0aGlzLml0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtICYmIGl0ZW0uSXNTZWxlY3RhYmxlRm9yQWN0aW9uc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdChmaWx0ZXJlZEl0ZW1zLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbFxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgPT09ICdtdWx0aScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEFsbENsaWNrLmVtaXQoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmFpc2VTdGFydEluZGV4Q2hhbmdlKHN0YXJ0SW5kZXggPSAwKSB7XG4gICAgICAgIC8vIHRoaXMuc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgICAgIHRoaXMuc3RhcnRJbmRleENoYW5nZS5lbWl0KHsgc3RhcnRJbmRleCB9KTtcbiAgICB9XG5cbiAgICBnZXRJc0l0ZW1TZWxlY3RlZChpdGVtOiBPYmplY3RzRGF0YVJvdyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgaXNTZWxlY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZEl0ZW1JZCA9PT0gdGhpcy5nZXRVbmlxSXRlbUlkKGl0ZW0uVUlELCBpdGVtLlR5cGUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgPT09ICdtdWx0aScpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5Jc1NlbGVjdGFibGVGb3JBY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQgPSAodGhpcy5pc0FsbFNlbGVjdGVkICYmICF0aGlzLnVuU2VsZWN0ZWRJdGVtcy5oYXMoaXRlbS5VSUQpKSB8fCB0aGlzLnNlbGVjdGVkSXRlbXMuaGFzKGl0ZW0uVUlEKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNTZWxlY3RlZDtcbiAgICB9XG5cbiAgICBzZWxlY3RJdGVtRm9yQWN0aW9ucyhcbiAgICAgICAgZTogYW55LFxuICAgICAgICBpdGVtSWQ6IHN0cmluZyxcbiAgICAgICAgaXNTZWxlY3RhYmxlRm9yQWN0aW9uczogYm9vbGVhbixcbiAgICAgICAgaXRlbVR5cGUgPSAnJ1xuICAgICk6IHZvaWQge1xuICAgICAgICAvLyBGb3IgbWF0ZXJpYWwgY2hlY2tib3ggfHwgcmFkaW8uXG4gICAgICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGUuc291cmNlLmNoZWNrZWQ7XG4gICAgICAgIHRoaXMuc2V0SXRlbUNsaWNrZWQoXG4gICAgICAgICAgICBpdGVtSWQsXG4gICAgICAgICAgICBpc1NlbGVjdGFibGVGb3JBY3Rpb25zLFxuICAgICAgICAgICAgaXRlbVR5cGUsXG4gICAgICAgICAgICBpc0NoZWNrZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpdGVtQ2xpY2tlZChlOiBhbnksIGl0ZW06IE9iamVjdHNEYXRhUm93KTogdm9pZCB7XG4gICAgICAgIC8vIFNldCBzZWxldGVkIGl0ZW1cbiAgICAgICAgY29uc3QgaXRlbUlkID0gaXRlbT8uVUlELnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGl0ZW1UeXBlID0gaXRlbT8uVHlwZS50b1N0cmluZygpO1xuICAgICAgICBsZXQgaXNDaGVja2VkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5Jc1NlbGVjdGFibGVGb3JBY3Rpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUlkID0gdGhpcy5nZXRVbmlxSXRlbUlkKGl0ZW1JZCwgaXRlbVR5cGUpO1xuICAgICAgICAgICAgaXNDaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVGFibGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblR5cGVGb3JBY3Rpb25zID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SXRlbUNsaWNrZWQoXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1JZCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5Jc1NlbGVjdGFibGVGb3JBY3Rpb25zLFxuICAgICAgICAgICAgICAgICAgICBpdGVtVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgaXNDaGVja2VkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgLy8gSnVzdCBtYXJrIHRoZSByb3cgYXMgaGlnaGxpZ2h0ZWRcbiAgICAgICAgICAgICAgICB0aGlzLnNldEl0ZW1DbGlja2VkKFxuICAgICAgICAgICAgICAgICAgICBpdGVtSWQsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uSXNTZWxlY3RhYmxlRm9yQWN0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLml0ZW1DbGljay5lbWl0KHsgc291cmNlOiBpdGVtLCB2aWV3VHlwZTogdGhpcy52aWV3VHlwZSB9KTtcbiAgICB9XG5cbiAgICBvblRhYmxlUm93TW91c2VFbnRlcihldmVudDogYW55LCBpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGV2aWNlSGFzTW91c2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaXFJdGVtSWQgPSB0aGlzLmdldFVuaXFJdGVtSWQoaXRlbUlkLCBpdGVtVHlwZSk7XG4gICAgICAgIHRoaXMuaG92ZXJlZEl0ZW1JZCA9IHVuaXFJdGVtSWQ7XG4gICAgfVxuXG4gICAgb25UYWJsZVJvd01vdXNlTGVhdmUoZXZlbnQ6IGFueSwgaXRlbUlkOiBzdHJpbmcsIGl0ZW1UeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3ZlcmVkSXRlbUlkID0gJyc7XG4gICAgfVxuXG4gICAgb25DYXJkTW91c2VFbnRlcihldmVudDogYW55LCBpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGV2aWNlSGFzTW91c2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaXFJdGVtSWQgPSB0aGlzLmdldFVuaXFJdGVtSWQoaXRlbUlkLCBpdGVtVHlwZSk7XG4gICAgICAgIHRoaXMuaG92ZXJlZEl0ZW1JZCA9IHVuaXFJdGVtSWQ7XG4gICAgfVxuXG4gICAgb25DYXJkTW91c2VMZWF2ZShldmVudDogYW55LCBpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvdmVyZWRJdGVtSWQgPSAnJztcbiAgICB9XG5cbiAgICAvLyB0cmFja0J5RnVuYyhpbmRleDogbnVtYmVyLCBpdGVtOiBPYmplY3RzRGF0YVJvdyk6IGFueSB7XG4gICAgLy8gICAgIHJldHVybiBpdGVtICYmIGl0ZW0/LlVJRCA/IGl0ZW0/LlVJRCA6IGluZGV4O1xuICAgIC8vICAgICAvLyBsZXQgcmVzOiBzdHJpbmcgPSBcIlwiO1xuXG4gICAgLy8gICAgIC8vIGlmIChpdGVtICYmIGl0ZW0/LlVJRCkge1xuICAgIC8vICAgICAvLyAgICByZXMgPSBpdGVtPy5VSUQgKyBcIl9cIiArIHRoaXMubGlzdFR5cGUgKyBcIl9cIiArICh0aGlzLmlzVGFibGUgPyBcIlRhYmxlXCIgOiBcIlRodW1ibmFpbHNcIik7XG4gICAgLy8gICAgIC8vIH1cbiAgICAvLyAgICAgLy8gZWxzZSB7XG4gICAgLy8gICAgIC8vICAgIHJlcyA9IGluZGV4ICsgXCJfXCIgKyB0aGlzLmxpc3RUeXBlICsgXCJfXCIgKyAodGhpcy5pc1RhYmxlID8gXCJUYWJsZVwiIDogXCJUaHVtYm5haWxzXCIpO1xuICAgIC8vICAgICAvLyB9XG5cbiAgICAvLyAgICAgLy8gcmV0dXJuIHJlcztcbiAgICAvLyB9XG5cbiAgICBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhbkl0ZW1zKCk7XG4gICAgICAgIHRoaXMuX2xheW91dCA9IG51bGw7XG4gICAgfVxuXG4gICAgc2V0U2VsZWN0ZWRJZHMoc2VsZWN0ZWRJZHM6IHN0cmluZ1tdLCBpdGVtcyA9IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuaXNBbGxTZWxlY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZElkcykge1xuICAgICAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzZWxlY3RlZElkIG9mIHNlbGVjdGVkSWRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG1wID0gc2VsZWN0ZWRJZC5zcGxpdCh0aGlzLlNFUEFSQVRPUik7XG5cbiAgICAgICAgICAgICAgICBpZiAodG1wICYmIHRtcC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IHRtcFswXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVR5cGUgPSB0bXAubGVuZ3RoID4gMSA/IHRtcFsxXSA6ICcnO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFVuaXFJdGVtSWQoaXRlbUlkLCBpdGVtVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXNBbGxTZWxlY3RlZCA9IHRoaXMuZ2V0SXNBbGxTZWxlY3RlZChpdGVtcyA/IGl0ZW1zIDogdGhpcy52aXJ0dWFsU2Nyb2xsZXI/LnZpZXdQb3J0SXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25EYXRhSW5TZXNzaW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICBzZXRTZWxlY3Rpb25EYXRhSW5TZXNzaW9uKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zLnNpemUgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnNldE9iamVjdChcbiAgICAgICAgICAgICAgICBQZXBMaXN0Q29tcG9uZW50LlNFTEVDVEVEX0lURU1TX1NUQVRFX0tFWSxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShbLi4udGhpcy5zZWxlY3RlZEl0ZW1zXSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy51blNlbGVjdGVkSXRlbXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2Uuc2V0T2JqZWN0KFxuICAgICAgICAgICAgICAgIFBlcExpc3RDb21wb25lbnQuVU5fU0VMRUNURURfSVRFTVNfU1RBVEVfS0VZLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KFsuLi50aGlzLnVuU2VsZWN0ZWRJdGVtc10pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5zZXRPYmplY3QoXG4gICAgICAgICAgICBQZXBMaXN0Q29tcG9uZW50LkFMTF9TRUxFQ1RFRF9TVEFURV9LRVksXG4gICAgICAgICAgICB0aGlzLmlzQWxsU2VsZWN0ZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpbml0TGlzdERhdGEoXG4gICAgICAgIGxheW91dDogVUlDb250cm9sLFxuICAgICAgICB0b3RhbFJvd3M6IG51bWJlcixcbiAgICAgICAgaXRlbXM6IE9iamVjdHNEYXRhUm93W11cbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0VmFyaWFibGVzRnJvbVNlc3Npb24oaXRlbXMpO1xuICAgICAgICBjb25zdCBjdXJyZW50TGlzdCA9IHRoaXMuaXNBbGxTZWxlY3RlZFxuICAgICAgICAgICAgPyB0aGlzLnVuU2VsZWN0ZWRJdGVtc1xuICAgICAgICAgICAgOiB0aGlzLnNlbGVjdGVkSXRlbXM7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMaXN0Q291bnQgPSB0aGlzLmlzQWxsU2VsZWN0ZWRcbiAgICAgICAgICAgID8gdGhpcy50b3RhbFJvd3MgLSBjdXJyZW50TGlzdC5zaXplXG4gICAgICAgICAgICA6IGN1cnJlbnRMaXN0LnNpemU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KGN1cnJlbnRMaXN0Q291bnQpO1xuXG4gICAgICAgIHRoaXMuX2xheW91dCA9IGxheW91dDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JZCA9ICcnO1xuICAgICAgICB0aGlzLnRvdGFsUm93cyA9IHRvdGFsUm93cztcblxuICAgICAgICB0aGlzLnNjcm9sbFRvVG9wKGZhbHNlKTtcbiAgICAgICAgdGhpcy5jbGVhbkl0ZW1zKCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZVNjcm9sbCh0cnVlKTtcblxuICAgICAgICBpZiAoaXRlbXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2VyVHlwZSA9PT0gJ3BhZ2VzJykge1xuICAgICAgICAgICAgICAgIC8vIElmIHBhZ2UgaW5kZXggb3V0IG9mIGJvdW5kcyAtIGluaXQgdG8gMC5cbiAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJPZlBhZ2VzID0gTWF0aC5jZWlsKHRvdGFsUm93cyAvIHRoaXMucGFnZVNpemUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFnZUluZGV4ID49IG51bWJlck9mUGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGFnZShpdGVtcywge1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZVNjcm9sbChmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mU3RhcnRJdGVtcyA9IHRoaXMuZ2V0TnVtYmVyT2ZTdGFydEl0ZW1zKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21JbmRleDogMCxcbiAgICAgICAgICAgICAgICAgICAgdG9JbmRleDogbnVtYmVyT2ZTdGFydEl0ZW1zLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJdGVtcyhpdGVtcywgZXZlbnQpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxlcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjT2JqZWN0SGVpZ2h0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY09iamVjdEhlaWdodCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pc1RhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RDb2x1bW5zV2lkdGggPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0TGF5b3V0KCk7XG5cbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uTGlzdExvYWQoKTtcbiAgICAgICAgLy8gfSwgMCk7XG4gICAgfVxuXG4gICAgdXBkYXRlSXRlbXMoXG4gICAgICAgIGl0ZW1zOiBPYmplY3RzRGF0YVJvd1tdLFxuICAgICAgICBldmVudDogSVBlcExpc3RMb2FkSXRlbXNFdmVudCA9IG51bGxcbiAgICApOiB2b2lkIHtcbiAgICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBFdmVudCBpc24ndCBzdXBwbGllZC5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFuIGFycmF5XG4gICAgICAgIGlmICh0aGlzLml0ZW1zQ291bnRlciArIGl0ZW1zLmxlbmd0aCA+IHRoaXMuZ2V0Q2FjaGVkSXRlbXNOdW1iZXIoKSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhbkl0ZW1zKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gZXZlbnQuZnJvbUluZGV4ID8/IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLml0ZW1zW2kgKyBzdGFydEluZGV4XSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNbaSArIHN0YXJ0SW5kZXhdID0gaXRlbXNbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtc0NvdW50ZXIgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG9nZ2xlTG9hZGluZ0l0ZW1zRnJvcEFwaShmYWxzZSk7XG4gICAgfVxuXG4gICAgdXBkYXRlUGFnZShpdGVtczogT2JqZWN0c0RhdGFSb3dbXSwgZXZlbnQ6IElQZXBMaXN0TG9hZFBhZ2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIEV2ZW50IGlzbid0IHN1cHBsaWVkLlxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYW4gYXJyYXlcbiAgICAgICAgaWYgKHRoaXMuaXRlbXNDb3VudGVyICsgaXRlbXMubGVuZ3RoID4gdGhpcy5nZXRDYWNoZWRJdGVtc051bWJlcigpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFuSXRlbXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnN0IGxvYWRJbkNodW5rcyA9IHRoaXMuaXRlbXNDb3VudGVyID09PSAwO1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gTWF0aC5taW4oZXZlbnQucGFnZUluZGV4ICogZXZlbnQucGFnZVNpemUsIHRoaXMudG90YWxSb3dzKTtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBNYXRoLm1pbihzdGFydEluZGV4ICsgZXZlbnQucGFnZVNpemUsIHRoaXMudG90YWxSb3dzKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXRlbXNbaSArIHN0YXJ0SW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpICsgc3RhcnRJbmRleF0gPSBpdGVtc1tpXTtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zQ291bnRlciArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50UGFnZUl0ZW1zKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgdGhpcy50b2dnbGVMb2FkaW5nSXRlbXNGcm9wQXBpKGZhbHNlKTtcbiAgICB9XG5cbiAgICB1cGRhdGVJdGVtKGRhdGE6IE9iamVjdHNEYXRhUm93KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pdGVtcy5maW5kSW5kZXgoKGkpID0+IGkgJiYgaT8uVUlEID09PSBkYXRhPy5VSUQpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1Qcm9wZXJ0aWVzKHRoaXMuaXRlbXNbaW5kZXhdLCBkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNjcm9sbFRvSW5kZXgoaW5kZXg6IG51bWJlciwgYWxpZ25Ub0JlZ2lubmluZyA9IHRydWUsIGFkZGl0aW9uYWxPZmZzZXQgPSAwLCBhbmltYXRpb25NaWxsaXNlY29uZHM6IG51bWJlciA9IHVuZGVmaW5lZCwgYW5pbWF0aW9uQ29tcGxldGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsZXI/LnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWduVG9CZWdpbm5pbmcsIGFkZGl0aW9uYWxPZmZzZXQsIGFuaW1hdGlvbk1pbGxpc2Vjb25kcywgYW5pbWF0aW9uQ29tcGxldGVkQ2FsbGJhY2spO1xuICAgIH1cblxuICAgIHVwZGF0ZUl0ZW1Qcm9wZXJ0aWVzKGl0ZW1Ub1VwZGF0ZTogT2JqZWN0c0RhdGFSb3csIGRhdGE6IE9iamVjdHNEYXRhUm93KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oaXRlbVRvVXBkYXRlLCBkYXRhKTtcbiAgICB9XG5cbiAgICBnZXRTZWxlY3RlZEl0ZW1zRGF0YShpc0ZvckVkaXQgPSBmYWxzZSk6IFBlcFNlbGVjdGlvbkRhdGEge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgUGVwU2VsZWN0aW9uRGF0YSgpO1xuXG4gICAgICAgIGxldCBzZWxlY3Rpb25UeXBlID0gMTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICAgICAgY29uc3QgaXRlbVR5cGVzID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1JZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG1wID0gdGhpcy5zZWxlY3RlZEl0ZW1JZC5zcGxpdCh0aGlzLlNFUEFSQVRPUik7XG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaCh0bXBbMF0pO1xuICAgICAgICAgICAgICAgIGl0ZW1UeXBlcy5wdXNoKHRtcFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA9PT0gJ211bHRpJykge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRMaXN0ID0gW107XG5cbiAgICAgICAgICAgIC8vIEZvciBlZGl0IC0gb25seSB0aGUgc2VsZWN0ZWQgaXRlbXMuXG4gICAgICAgICAgICBpZiAoaXNGb3JFZGl0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQWxsU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudExpc3QgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0ZWRJdGVtcy52YWx1ZXMoKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBpZCdzIG9mIHRoZSBpdGVtcyB0aGF0IG5vdCBmb3VuZGVkIGluIHVuU2VsZWN0ZWRJdGVtcy5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLnVuU2VsZWN0ZWRJdGVtcy5oYXMoaXRlbT8uVUlELnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFVuaXFJdGVtSWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy5VSUQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LlR5cGUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgZGVsZXRlIC0gY2FuIGJlIHRoZSB1bnNlbGVjdGVkIHdpdGggc2VsZWN0X2FsbCBmdW5jdGlvbmFsaXR5LlxuICAgICAgICAgICAgICAgIGN1cnJlbnRMaXN0ID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FsbFNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMudW5TZWxlY3RlZEl0ZW1zLnZhbHVlcygpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRJdGVtcy52YWx1ZXMoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uVHlwZSA9IHRoaXMuaXNBbGxTZWxlY3RlZCA/IDAgOiAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdXJyZW50TGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG1wID0gaXRlbS5zcGxpdCh0aGlzLlNFUEFSQVRPUik7XG5cbiAgICAgICAgICAgICAgICBpZiAodG1wLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHRtcFswXSk7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlcy5wdXNoKHRtcFsxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy5zZWxlY3Rpb25UeXBlID0gc2VsZWN0aW9uVHlwZTtcbiAgICAgICAgcmVzLnJvd3MgPSBpdGVtcztcbiAgICAgICAgcmVzLnJvd1R5cGVzID0gaXRlbVR5cGVzO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZ2V0SXNJdGVtRWRpdGFibGUodWlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbXMuZmlsdGVyKCh4KSA9PiB4Py5VSUQudG9TdHJpbmcoKSA9PT0gdWlkKTtcbiAgICAgICAgaWYgKGl0ZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1bMF0uSXNFZGl0YWJsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEl0ZW1EYXRhQnlJRCh1aWQ6IHN0cmluZyk6IE9iamVjdHNEYXRhUm93IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbT8uVUlELnRvU3RyaW5nKCkgPT09IHVpZCk7XG4gICAgfVxuXG4gICAgcmVmcmVzaChyZWZyZXNoQ29tcGxldGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsZXI/LnJlZnJlc2gocmVmcmVzaENvbXBsZXRlZENhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyAgICAgICAgICAgICAgRXZlbnRzIGhhbmRsZXJzLlxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgb25XaW5SZXNpemUoZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gMDtcbiAgICAgICAgdGhpcy5sYXN0Q29sdW1uc1dpZHRoID0gW107XG4gICAgICAgIHRoaXMuc2V0TGF5b3V0KCk7XG4gICAgfVxuXG4gICAgb25MaXN0UmVzaXplU3RhcnQoZXZlbnQsIGNvbHVtbktleTogc3RyaW5nLCBjb2x1bW5JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJlc3NlZENvbHVtbiA9IGNvbHVtbktleTtcbiAgICAgICAgdGhpcy5wcmVzc2VkQ29sdW1uSW5kZXggPSBjb2x1bW5JbmRleDtcbiAgICAgICAgdGhpcy5zdGFydFggPSBldmVudC54O1xuICAgICAgICB0aGlzLnN0YXJ0V2lkdGggPSBldmVudC50YXJnZXQuY2xvc2VzdCgnLmhlYWRlci1jb2x1bW4nKS5vZmZzZXRXaWR0aDtcbiAgICAgICAgdGhpcy50YWJsZVN0YXJ0V2lkdGggPSB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7IC8vIHRoaXMudmlydHVhbFNjcm9sbGVyPy5jb250ZW50RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICBjb25zb2xlLmxvZyhgdGFibGVTdGFydFdpZHRoIC0gJHt0aGlzLnRhYmxlU3RhcnRXaWR0aH1gKTtcbiAgICB9XG5cbiAgICBvbkxpc3RSZXNpemUoZXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gaWYgKHRoaXMucHJlc3NlZENvbHVtbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICh0aGlzLnByZXNzZWRDb2x1bW5JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBsZXQgd2lkdGhUb0FkZCA9IHRoaXMubGF5b3V0U2VydmljZS5pc1J0bCgpID8gdGhpcy5zdGFydFggLSBldmVudC54IDogZXZlbnQueCAtIHRoaXMuc3RhcnRYO1xuXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4gYW5kIHRoZSBjb250YWluZXIgb2YgdGhlIHdob2xlIGNvbHVtbnMuXG4gICAgICAgICAgICBpZiAodGhpcy5zdGFydFdpZHRoICsgd2lkdGhUb0FkZCA+PSBQZXBMaXN0Q29tcG9uZW50Lk1JTklNVU1fQ09MVU1OX1dJRFRIIHx8IHdpZHRoVG9BZGQgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5fbGF5b3V0LkNvbnRyb2xGaWVsZHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbENhbGNDb2xzV2lkdGggPSAwO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1aUNvbnRyb2xGaWVsZDogVUlDb250cm9sRmllbGQgPSB0aGlzLl9sYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5Db250cm9sRmllbGRzW2luZGV4XTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IGxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGMgdGhlIGxhc3QgY29sdW1uIG9ubHkgaW4gcGVyY2VudGFnZSB0eXBlLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uV2lkdGhPZlR5cGVQZXJjZW50YWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsV2lkdGggPSB0aGlzLmxheW91dFNlcnZpY2UuZ2V0U2Nyb2xsYmFyV2lkdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aFRvQWRkICs9IHNjcm9sbFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNUaXRsZUNvbHVtbldpZHRoU3RyaW5nID0gdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoU3RyaW5nID0gJ2NhbGMoMTAwJSAtICcgKyAodG90YWxDYWxjQ29sc1dpZHRoICsgc2Nyb2xsV2lkdGgpICsgJ3B4KSc7IC8vIEZvciAxMDAlXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh1aUNvbnRyb2xGaWVsZC5BcGlOYW1lID09PSB0aGlzLnByZXNzZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMucHJlc3NlZENvbHVtbkluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aCA9IHRoaXMuc3RhcnRXaWR0aCArIHdpZHRoVG9BZGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNUaXRsZUNvbHVtbldpZHRoU3RyaW5nID0gdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoU3RyaW5nID0gdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAodWlDb250cm9sRmllbGQuQXBpTmFtZSA9PT0gdGhpcy5wcmVzc2VkQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHRoaXMucHJlc3NlZENvbHVtbkluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGggPSB0aGlzLnN0YXJ0V2lkdGggKyB3aWR0aFRvQWRkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgPSB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGhTdHJpbmcgPSB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGggKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdG90YWxDYWxjQ29sc1dpZHRoICs9IHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB3aWR0aFRvU2V0ID0gKHRoaXMudGFibGVTdGFydFdpZHRoICsgKHdpZHRoVG9BZGQgKiAyKSkgKyAncHgnO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBvbkxpc3RSZXNpemUgLT4gd2lkdGhUb1NldDogJHt3aWR0aFRvU2V0fSAqKiogd2lkdGhUb0FkZDogJHt3aWR0aFRvQWRkfWApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29sdW1uc1dpZHRoKHdpZHRoVG9TZXQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JDaGFuZ2VzID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTGlzdFJlc2l6ZUVuZChldmVudCk6IHZvaWQge1xuICAgICAgICAvLyBpZiAodGhpcy5wcmVzc2VkQ29sdW1uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHRoaXMucHJlc3NlZENvbHVtbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBldmVudCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UGFyZW50KGV2ZW50LnNyY0VsZW1lbnQsICdyZXNpemUtYm94JykubGVuZ3RoID4gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UmVzaXplRGF0YSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGltZW91dCAwIGZvciBvbkxpc3RTb3J0aW5nQ2hhbmdlIHdpbGwgaGF2ZSB0aGUgcHJlc3NlZENvbHVtbi5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0UmVzaXplRGF0YSgpO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxhc3RDb2x1bW5zV2lkdGggPSBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2V0IHRoZSBsYXN0IGNvbHVtbnMgd2lkdGhcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1aUNvbnRyb2xGaWVsZDogVUlDb250cm9sRmllbGQgPSB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkc1tpbmRleF07XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0Q29sdW1uc1dpZHRoLnB1c2goeyBcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uQVBJTmFtZTogdWlDb250cm9sRmllbGQuQXBpTmFtZSwgXG4gICAgICAgICAgICAgICAgICAgIGNhbGNDb2x1bW5XaWR0aDogdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoLFxuICAgICAgICAgICAgICAgICAgICBjYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZzogdWlDb250cm9sRmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGNhbGNDb2x1bW5XaWR0aFN0cmluZzogdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoU3RyaW5nXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkxpc3RTb3J0aW5nQ2hhbmdlKHNvcnRCeTogc3RyaW5nLCBpc0FzYzogYm9vbGVhbiwgZXZlbnQgPSBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIHRoaXMucHJlc3NlZENvbHVtbi5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICB0aGlzLnByZXNzZWRDb2x1bW5JbmRleCA+PSAwIHx8XG4gICAgICAgICAgICAoZXZlbnQgJiYgdGhpcy5nZXRQYXJlbnQoZXZlbnQuc3JjRWxlbWVudCwgJ3Jlc2l6ZS1ib3gnKS5sZW5ndGggPiAwKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNvcnRCeSAhPT0gc29ydEJ5IHx8IHRoaXMuaXNBc2MgIT09IGlzQXNjKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnRCeSA9IHNvcnRCeTtcbiAgICAgICAgICAgIHRoaXMuaXNBc2MgPSBpc0FzYztcbiAgICAgICAgICAgIHRoaXMuc2F2ZVNvcnRpbmdUb1Nlc3Npb24oKTtcblxuICAgICAgICAgICAgdGhpcy5zb3J0aW5nQ2hhbmdlLmVtaXQoeyBzb3J0QnksIGlzQXNjIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25MaXN0SGVhZGVyTW91c2VFbnRlcihldmVudCk6IHZvaWQge1xuICAgICAgICAvLyB0aGlzLmhlYWRlcklzSW5Gb2N1cyA9IHRydWU7XG4gICAgfVxuXG4gICAgb25MaXN0SGVhZGVyTW91c2VMZWF2ZShldmVudCk6IHZvaWQge1xuICAgICAgICAvLyB0aGlzLmhlYWRlcklzSW5Gb2N1cyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uTGlzdFJlc2l6ZUVuZChldmVudCk7XG4gICAgICAgIHRoaXMuaW5pdFJlc2l6ZURhdGEoKTtcbiAgICB9XG5cbiAgICBvblBhZ2VyQ2hhbmdlKGV2ZW50OiBJUGVwTGlzdFBhZ2VyQ2hhbmdlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYWdlSW5kZXggPSBldmVudC5wYWdlSW5kZXg7XG5cbiAgICAgICAgLy8gU2Nyb2xsIHRvIHRvcC5cbiAgICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBldmVudC5wYWdlSW5kZXggKiBldmVudC5wYWdlU2l6ZTtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBNYXRoLm1pbihcbiAgICAgICAgICAgIHN0YXJ0SW5kZXggKyBldmVudC5wYWdlU2l6ZSxcbiAgICAgICAgICAgIHRoaXMudG90YWxSb3dzXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IHNob3VsZEdldEl0ZW1zRnJvbUFwaSA9IGZhbHNlO1xuICAgICAgICBsZXQgaW5kZXg6IG51bWJlciA9IHN0YXJ0SW5kZXg7XG5cbiAgICAgICAgd2hpbGUgKCFzaG91bGRHZXRJdGVtc0Zyb21BcGkgJiYgaW5kZXggPCBlbmRJbmRleCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLml0ZW1zW2luZGV4XSkge1xuICAgICAgICAgICAgICAgIHNob3VsZEdldEl0ZW1zRnJvbUFwaSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGJ1bGsgZnJvbSBhcGkuXG4gICAgICAgIGlmIChzaG91bGRHZXRJdGVtc0Zyb21BcGkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5sb2FkaW5nSXRlbXNGcm9tQXBpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVMb2FkaW5nSXRlbXNGcm9wQXBpKHRydWUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUGFnZS5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZUluZGV4OiBldmVudC5wYWdlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiBldmVudC5wYWdlU2l6ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFBhZ2VJdGVtcyhzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgICAgICB9LCB0aGlzLnNjcm9sbEFuaW1hdGlvblRpbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25WaXJ0dWFsU2Nyb2xsZXJDaGFuZ2UoZXZlbnQ6IElQYWdlSW5mbyk6IHZvaWQge1xuICAgICAgICB0aGlzLnJhaXNlU3RhcnRJbmRleENoYW5nZShldmVudC5zdGFydEluZGV4KTtcblxuICAgICAgICBpZiAodGhpcy5wYWdlclR5cGUgPT09ICdzY3JvbGwnKSB7XG4gICAgICAgICAgICAvLyBGb3Igb3RoZXIgZXZlbnRzIGRvIG5vdGhpbmcuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50LnN0YXJ0SW5kZXggPT09ICd1bmRlZmluZWQnIHx8IGV2ZW50LnN0YXJ0SW5kZXggPCAwIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50LmVuZEluZGV4ID09PSAndW5kZWZpbmVkJyB8fCBldmVudC5lbmRJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGFkZEF0U3RhcnQgPSBldmVudC5zY3JvbGxEaXJlY3Rpb24gPT09ICdiYWNrd2FyZCc7XG4gICAgICAgICAgICBsZXQgc2hvdWxkR2V0SXRlbXNGcm9tQXBpID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaW5kZXhPZk1pc3NpbmdJdGVtOiBudW1iZXI7XG5cbiAgICAgICAgICAgIGlmIChhZGRBdFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgaW5kZXhPZk1pc3NpbmdJdGVtID0gZXZlbnQuZW5kSW5kZXg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFzaG91bGRHZXRJdGVtc0Zyb21BcGkgJiYgaW5kZXhPZk1pc3NpbmdJdGVtID49IGV2ZW50LnN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLml0ZW1zW2luZGV4T2ZNaXNzaW5nSXRlbV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEdldEl0ZW1zRnJvbUFwaSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZEdldEl0ZW1zRnJvbUFwaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhPZk1pc3NpbmdJdGVtLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZGV4T2ZNaXNzaW5nSXRlbSA9IGV2ZW50LnN0YXJ0SW5kZXg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFzaG91bGRHZXRJdGVtc0Zyb21BcGkgJiYgaW5kZXhPZk1pc3NpbmdJdGVtIDw9IGV2ZW50LmVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pdGVtc1tpbmRleE9mTWlzc2luZ0l0ZW1dKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRHZXRJdGVtc0Zyb21BcGkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRHZXRJdGVtc0Zyb21BcGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4T2ZNaXNzaW5nSXRlbSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgYnVsayBmcm9tIGFwaS5cbiAgICAgICAgICAgIGlmIChzaG91bGRHZXRJdGVtc0Zyb21BcGkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubG9hZGluZ0l0ZW1zRnJvbUFwaSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUxvYWRpbmdJdGVtc0Zyb3BBcGkodHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9wID0gdGhpcy5nZXRUb3BJdGVtcygpIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbUluZGV4ID0gYWRkQXRTdGFydCA/IE1hdGgubWF4KGluZGV4T2ZNaXNzaW5nSXRlbSAtIHRvcCwgMCkgOiBpbmRleE9mTWlzc2luZ0l0ZW07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvSW5kZXggPSBhZGRBdFN0YXJ0ID8gaW5kZXhPZk1pc3NpbmdJdGVtIDogTWF0aC5taW4oaW5kZXhPZk1pc3NpbmdJdGVtICsgdG9wLCB0aGlzLnRvdGFsUm93cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkSXRlbXMuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b0luZGV4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkxpc3RMb2FkKCk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubGlzdExvYWQuZW1pdCgpO1xuICAgICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICAvLyBvbkNoaWxkUmVjdENoYW5nZShldmVudDogYW55KSB7XG4gICAgLy8gICAgIC8vIFNldCB0aGUgY2FsY3VsYXRlZE9iamVjdEhlaWdodCBvbmx5IGlmIGhlJ3Mgbm90IHNldCAodGhpcyBjYXNlIGlzIG9ubHkgZm9yIHRoZSBpbml0aWFsaXplIHdoZW4gdmlydHVhbCBzY3JvbGwgaXMgdW5kZWZpbmVkKS5cbiAgICAvLyAgICAgLy8gdGhlIG90aGVyIGNhc2VzIGlzIGhhbmRsZWQgaW4gY2FsY09iamVjdEhlaWdodCBmdW5jdGlvbi5cbiAgICAvLyAgICAgaWYgKHRoaXMuY2FsY3VsYXRlZE9iamVjdEhlaWdodCA9PT0gJ2F1dG8nKSB7XG4gICAgLy8gICAgICAgICB0aGlzLmNhbGN1bGF0ZWRPYmplY3RIZWlnaHQgPSBldmVudD8uaGVpZ2h0ICsgJ3B4JztcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIG9uVmFsdWVDaGFuZ2VkKHZhbHVlQ2hhbmdlOiBJUGVwRm9ybUZpZWxkVmFsdWVDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlQ2hhbmdlKTtcbiAgICB9XG5cbiAgICBvbkN1c3RvbWl6ZUZpZWxkQ2xpY2soXG4gICAgICAgIGN1c3RvbWl6ZUZpZWxkQ2xpY2tlZERhdGE6IElQZXBGb3JtRmllbGRDbGlja0V2ZW50XG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpZWxkQ2xpY2suZW1pdChjdXN0b21pemVGaWVsZENsaWNrZWREYXRhKTtcbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwidG90YWxSb3dzID09IDBcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9EYXRhRm91bmRNc2c7IHRoZW4gbm9EYXRhTXNnSW5wdXRCbG9jazsgZWxzZSBub0RhdGFNc2dEZWZhdWx0QmxvY2tcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI25vRGF0YU1zZ0lucHV0QmxvY2s+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwZXAtYm9yZGVyLWJvdHRvbVwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0aXRsZS14bCBuby1kYXRhXCI+XG4gICAgICAgICAgICAgICAge3sgbm9EYXRhRm91bmRNc2cgfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI25vRGF0YU1zZ0RlZmF1bHRCbG9jaz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBlcC1ib3JkZXItYm90dG9tXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRpdGxlLXhsIG5vLWRhdGFcIj5cbiAgICAgICAgICAgICAgICB7eyAnTElTVC5OT19EQVRBX0ZPVU5EJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibm8tZGF0YS1zdWdnZXN0aW9uc1wiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJzdWdnZXN0aW9ucy10aXRsZSB0aXRsZS1sZ1wiPlxuICAgICAgICAgICAgICAgIHt7ICdMSVNULk5PX0RBVEFfRk9VTkRfU1VHR0VTVElPTlNfVElUTEUnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cInN1Z2dlc3Rpb25zLWxpc3QgYm9keS1sZ1wiIFtpbm5lckh0bWxdPVwiJ0xJU1QuTk9fREFUQV9GT1VORF9TVUdHRVNUSU9OU19MSVNUJyB8IHRyYW5zbGF0ZVwiPjwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG48L25nLWNvbnRhaW5lcj5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ0b3RhbFJvd3MgPiAwXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlSGVhZGVyXCI+PC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tICh2c0NoaWxkUmVjdENoYW5nZSk9XCJvbkNoaWxkUmVjdENoYW5nZSgkZXZlbnQpXCIgLS0+XG4gICAgPHZpcnR1YWwtc2Nyb2xsZXIgI3Njcm9sbGVyIFtpdGVtc109XCJwYWdlclR5cGUgPT09ICdwYWdlcycgPyBjdXJyZW50UGFnZUl0ZW1zIDogaXRlbXNcIlxuICAgICAgICBbc2Nyb2xsRGVib3VuY2VUaW1lXT1cInNjcm9sbERlYm91bmNlVGltZVwiIFtzY3JvbGxUaHJvdHRsaW5nVGltZV09XCJzY3JvbGxUaHJvdHRsaW5nVGltZVwiXG4gICAgICAgIFtidWZmZXJBbW91bnRdPVwicHJpbnRNb2RlID8gdG90YWxSb3dzIDogYnVmZmVyQW1vdW50XCIgW3BhcmVudFNjcm9sbF09XCJwYXJlbnRTY3JvbGxcIiBbZGlzYWJsZV09XCJsb2FkaW5nSXRlbXNGcm9tQXBpXCJcbiAgICAgICAgY2xhc3M9XCJ2aXJ0dWFsLXNjcm9sbGVyXCIgW25nQ2xhc3NdPVwieyAndGFibGUtYm9keSc6IGlzVGFibGUsICdjYXJkcy1ib2R5JzogIWlzVGFibGUgfVwiXG4gICAgICAgICh2c0NoYW5nZSk9XCJvblZpcnR1YWxTY3JvbGxlckNoYW5nZSgkZXZlbnQpXCIgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNjcm9sbGVyLnZpZXdQb3J0SXRlbXM7IGxldCBpbmRleCA9IGluZGV4OyBsZXQgaXNGaXJzdCA9IGZpcnN0O1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpc3REYXRhOyBjb250ZXh0OiB7aXRlbTogaXRlbSwgaW5kZXg6aW5kZXh9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdmlydHVhbC1zY3JvbGxlcj5cblxuICAgIDxwZXAtbGlzdC1wYWdlciAqbmdJZj1cInBhZ2VyVHlwZSA9PT0gJ3BhZ2VzJ1wiIGNsYXNzPVwiIGxpc3QtcGFnZXJcIiBbZGlzYWJsZWRdPVwibG9hZGluZ0l0ZW1zRnJvbUFwaVwiXG4gICAgICAgIFtsZW5ndGhdPVwidG90YWxSb3dzXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCIgW3BhZ2VJbmRleF09XCJwYWdlSW5kZXhcIiAocGFnZXJDaGFuZ2UpPVwib25QYWdlckNoYW5nZSgkZXZlbnQpXCI+XG4gICAgPC9wZXAtbGlzdC1wYWdlcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZVRvdGFsXCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNsaXN0RGF0YSBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtaW5kZXg9XCJpbmRleFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1RhYmxlXCI+XG4gICAgICAgIDwhLS0gZ2V0SXNJdGVtU2VsZWN0ZWQoaXRlbSkgLT4gaXRlbSB8IGlzSXRlbVNlbGVjdGVkOiBzZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA6IHNlbGVjdGVkSXRlbUlkIDogaXNBbGxTZWxlY3RlZCA6IHNlbGVjdGVkSXRlbXMgOiB1blNlbGVjdGVkSXRlbXMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yb3dcIiAobW91c2VlbnRlcik9XCJvblRhYmxlUm93TW91c2VFbnRlcigkZXZlbnQsIGl0ZW0/LlVJRCwgaXRlbT8uVHlwZSlcIiBcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uVGFibGVSb3dNb3VzZUxlYXZlKCRldmVudCwgaXRlbT8uVUlELCBpdGVtPy5UeXBlKVwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAnY29tcGFjdC12aWV3JzogdGFibGVWaWV3VHlwZSA9PT0gJ2NvbXBhY3QnLFxuICAgICAgICAgICAgICAgIGV2ZW46IHplYnJhU3RyaXBlcyAmJiBpbmRleCAlIDIgIT09IDAsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGdldElzSXRlbVNlbGVjdGVkKGl0ZW0pLFxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBpdGVtPy5VSUQgKyBTRVBBUkFUT1IgKyBpdGVtPy5UeXBlID09PSBzZWxlY3RlZEl0ZW1JZH1cIiBbbmdTdHlsZV09XCJ7IHZpc2liaWxpdHk6ICFsb2FkaW5nSXRlbXNGcm9tQXBpIHx8IGl0ZW0gPyAndmlzaWJsZScgOiAnaGlkZGVuJyB9XCI+XG4gICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJ0YWJsZS1yb3ctZmllbGRzZXRcIiBbbmdTdHlsZV09XCJ7ICdiYWNrZ3JvdW5kLWNvbG9yJzogaXRlbT8uQmFja2dyb3VuZENvbG9yIH1cIj5cbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94ICpuZ0lmPVwic2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgPT0gJ211bHRpJ1wiIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHVsbC1sZWZ0IGZsaXAgcm93LXNlbGVjdGlvblwiIFtuZ0NsYXNzXT1cInsgJ21kJzogdGFibGVWaWV3VHlwZSA9PT0gJ2NvbXBhY3QnIH1cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2V0aXNJdGVtRGlzYWJsZWQoaXRlbSlcIiBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogIWRldmljZUhhc01vdXNlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8uVUlEICsgU0VQQVJBVE9SICsgaXRlbT8uVHlwZSA9PT0gaG92ZXJlZEl0ZW1JZCB8fCBpc0FsbFNlbGVjdGVkIHx8IHNlbGVjdGVkSXRlbXMuc2l6ZSA+IDAgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfVwiIFtjaGVja2VkXT1cImdldElzSXRlbVNlbGVjdGVkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RJdGVtRm9yQWN0aW9ucygkZXZlbnQsIGl0ZW0/LlVJRCwgaXRlbT8uSXNTZWxlY3RhYmxlRm9yQWN0aW9ucywgaXRlbT8uVHlwZSlcIj5cbiAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiAqbmdJZj1cInNlbGVjdGlvblR5cGVGb3JBY3Rpb25zID09ICdzaW5nbGUnXCIgbmFtZT1cInNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHVsbC1sZWZ0IGZsaXAgcm93LXNlbGVjdGlvbiBwZXAtcmFkaW8tYnV0dG9uXCIgW25nQ2xhc3NdPVwieyAnbWQnOiB0YWJsZVZpZXdUeXBlID09PSAnY29tcGFjdCcgfVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnZXRpc0l0ZW1EaXNhYmxlZChpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImdldElzSXRlbVNlbGVjdGVkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RJdGVtRm9yQWN0aW9ucygkZXZlbnQsIGl0ZW0/LlVJRCwgaXRlbT8uSXNTZWxlY3RhYmxlRm9yQWN0aW9ucywgaXRlbT8uVHlwZSlcIj5cbiAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgPHBlcC1mb3JtIFtsYXlvdXRUeXBlXT1cIid0YWJsZSdcIiBbY2hlY2tGb3JDaGFuZ2VzXT1cImNoZWNrRm9yQ2hhbmdlc1wiIFtsYXlvdXRdPVwibGF5b3V0XCJcbiAgICAgICAgICAgICAgICAgICAgW2ZpcnN0RmllbGRBc0xpbmtdPVwiZmlyc3RGaWVsZEFzTGlua1wiIFtkYXRhXT1cIml0ZW1cIiBbY2FuRWRpdE9iamVjdF09XCIhZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbbG9ja0V2ZW50c109XCJsb2NrSXRlbUlubmVyRXZlbnRzIHx8IHByaW50TW9kZVwiIFtpc1JlcG9ydF09XCJpc1JlcG9ydFwiIFtpc0FjdGl2ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbT8uVUlEICsgU0VQQVJBVE9SICsgaXRlbT8uVHlwZSA9PT0gc2VsZWN0ZWRJdGVtSWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy5VSUQgKyBTRVBBUkFUT1IgKyBpdGVtPy5UeXBlID09PSBob3ZlcmVkSXRlbUlkKSAmJiBkZXZpY2VIYXNNb3VzZVxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgKHZhbHVlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudClcIiAoZmllbGRDbGljayk9XCJvbkN1c3RvbWl6ZUZpZWxkQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpdGVtQ2xpY2tlZCgkZXZlbnQsIGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgPC9wZXAtZm9ybT5cbiAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RhYmxlXCI+XG4gICAgICAgIDxkaXYgKG1vdXNlZW50ZXIpPVwib25DYXJkTW91c2VFbnRlcigkZXZlbnQsIGl0ZW0/LlVJRCwgaXRlbT8uVHlwZSlcIlxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25DYXJkTW91c2VMZWF2ZSgkZXZlbnQsIGl0ZW0/LlVJRCwgaXRlbT8uVHlwZSlcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBnZXRJc0l0ZW1TZWxlY3RlZChpdGVtKSxcbiAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGl0ZW0/LlVJRCArIFNFUEFSQVRPUiArIGl0ZW0/LlR5cGUgPT09IHNlbGVjdGVkSXRlbUlkLFxuICAgICAgICAgICAgICAgICAgICAnbGluZS12aWV3Jzogdmlld1R5cGUgPT09ICdsaW5lcycsXG4gICAgICAgICAgICAgICAgICAgICdjYXJkLXZpZXcnOiB2aWV3VHlwZSA9PT0gJ2NhcmRzJyxcbiAgICAgICAgICAgICAgICAgICAgJ3NtYWxsLWNhcmQnOiBjYXJkU2l6ZSA9PT0gJ3NtJ1xuICAgICAgICAgICAgICAgIH1cIiBjbGFzcz1cInB1bGwtbGVmdCBmbGlwXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgaGVpZ2h0OiBjYWxjdWxhdGVkT2JqZWN0SGVpZ2h0LCB2aXNpYmlsaXR5OiAhbG9hZGluZ0l0ZW1zRnJvbUFwaSB8fCBpdGVtID8gJ3Zpc2libGUnIDogJ2hpZGRlbicgfVwiPlxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCAqbmdJZj1cInNob3dDYXJkU2VsZWN0aW9uXCIgY2xhc3M9XCJwdWxsLWxlZnQgZmxpcCBjYXJkLXNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldGlzSXRlbURpc2FibGVkKGl0ZW0pXCIgW2NoZWNrZWRdPVwiZ2V0SXNJdGVtU2VsZWN0ZWQoaXRlbSlcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0SXRlbUZvckFjdGlvbnMoJGV2ZW50LCBpdGVtPy5VSUQsIGl0ZW0/LklzU2VsZWN0YWJsZUZvckFjdGlvbnMsIGl0ZW0/LlR5cGUpXCI+XG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIDxwZXAtZm9ybSBbbGF5b3V0VHlwZV09XCInY2FyZCdcIiBbZmlyc3RGaWVsZEFzTGlua109XCJmaXJzdEZpZWxkQXNMaW5rXCIgW2NoZWNrRm9yQ2hhbmdlc109XCJjaGVja0ZvckNoYW5nZXNcIlxuICAgICAgICAgICAgICAgIFtsYXlvdXRdPVwibGF5b3V0XCIgW2RhdGFdPVwiaXRlbVwiIFtjYW5FZGl0T2JqZWN0XT1cIiFkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2xvY2tFdmVudHNdPVwibG9ja0l0ZW1Jbm5lckV2ZW50cyB8fCBwcmludE1vZGVcIiBbaXNBY3RpdmVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoaXRlbT8uVUlEICsgU0VQQVJBVE9SICsgaXRlbT8uVHlwZSA9PT0gc2VsZWN0ZWRJdGVtSWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LlVJRCArIFNFUEFSQVRPUiArIGl0ZW0/LlR5cGUgPT09IGhvdmVyZWRJdGVtSWQpICYmIGRldmljZUhhc01vdXNlXG4gICAgICAgICAgICAgICAgICAgIFwiICh2YWx1ZUNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlZCgkZXZlbnQpXCIgKGZpZWxkQ2xpY2spPVwib25DdXN0b21pemVGaWVsZENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpdGVtQ2xpY2tlZCgkZXZlbnQsIGl0ZW0pXCI+XG4gICAgICAgICAgICA8L3BlcC1mb3JtPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGFibGVIZWFkZXI+XG4gICAgPGRpdiAqbmdJZj1cImlzVGFibGVcIiBjbGFzcz1cInRhYmxlLWhlYWRlclwiIChtb3VzZXVwKT1cIm9uTGlzdFJlc2l6ZUVuZCgkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwib25MaXN0SGVhZGVyTW91c2VFbnRlcigkZXZlbnQpXCIgKG1vdXNlbGVhdmUpPVwib25MaXN0SGVhZGVyTW91c2VMZWF2ZSgkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlbW92ZSk9XCJvbkxpc3RSZXNpemUoJGV2ZW50KVwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXItcGFkZGluZy10b3BcIj48L2Rpdj5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwidGFibGUtaGVhZGVyLWZpZWxkc2V0XCI+XG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94ICpuZ0lmPVwic2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgIT09ICdub25lJ1wiICNzZWxlY3RBbGxDQiBjbGFzcz1cInB1bGwtbGVmdCBmbGlwIHJvdy1zZWxlY3Rpb25cIiBbbmdDbGFzc109XCJ7ICdtZCc6IHRhYmxlVmlld1R5cGUgPT09ICdjb21wYWN0JyB9XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblR5cGVGb3JBY3Rpb25zID09ICdzaW5nbGUnIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA9PSAnbXVsdGknICYmIGhpZGVBbGxTZWxlY3Rpb25Jbk11bHRpKSA/ICdoaWRkZW4nIDogJ3Zpc2libGUnXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImlzQWxsU2VsZWN0ZWQgPyB1blNlbGVjdGVkSXRlbXMuc2l6ZSA+IDAgJiYgdW5TZWxlY3RlZEl0ZW1zLnNpemUgPCB0b3RhbFJvd3MgOiAoc2VsZWN0ZWRJdGVtcy5zaXplID4gMCAmJiAhZ2V0SXNBbGxTZWxlY3RlZEZvckFjdGlvbnMoKSlcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA9PT0gJ3NpbmdsZSdcIiBbY2hlY2tlZF09XCJnZXRJc0FsbFNlbGVjdGVkRm9yQWN0aW9ucygpXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNlbGVjdEFsbEl0ZW1zRm9yQWN0aW9ucygkZXZlbnQpXCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICA8ZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgbGF5b3V0Py5Db250cm9sRmllbGRzOyBsZXQgaiA9IGluZGV4XCIgY2xhc3M9XCJoZWFkZXItY29sdW1uIHB1bGwtbGVmdCBmbGlwXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogZmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgfVwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcGFjdC12aWV3JzogdGFibGVWaWV3VHlwZSA9PT0gJ2NvbXBhY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdXBwb3J0LXNvcnRpbmcnOiBzdXBwb3J0U29ydGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFzLXNvcnRpbmcnOiBmaWVsZC5BcGlOYW1lID09PSBzb3J0QnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLXJlc2l6aW5nJzogZmllbGQuQXBpTmFtZSA9PT0gcHJlc3NlZENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtZmlyc3QnOiBqID09PSAwICYmIHNlbGVjdGlvblR5cGVGb3JBY3Rpb25zICE9PSAnbXVsdGknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1sYXN0JzogaiA9PT0gbGF5b3V0Py5Db250cm9sRmllbGRzPy5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN1cHBvcnRTb3J0aW5nID8gKG9uTGlzdFNvcnRpbmdDaGFuZ2UoZmllbGQuQXBpTmFtZSwgc29ydEJ5ICE9PSBudWxsICYmIHNvcnRCeSAhPSBmaWVsZC5BcGlOYW1lID8gdHJ1ZSA6ICFpc0FzYywgJGV2ZW50KSkgOiBmYWxzZVwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBpZD1cInt7IGZpZWxkLkFwaU5hbWUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItbGFiZWwgYm9keS1zbSBwdWxsLWxlZnQgZmxpcCB0ZXh0LWFsaWduLXt7IGZpZWxkLkxheW91dC5YQWxpZ25tZW50IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgZmllbGQuVGl0bGUgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQuTWFuZGF0b3J5XCIgY2xhc3M9XCJtYW5kYXRvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGVwLWljb24gbmFtZT1cInN5c3RlbV9tdXN0XCI+PC9wZXAtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLlRpdGxlICE9ICcnID8gZmllbGQuVGl0bGUgOiAnICd9fVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdXBwb3J0UmVzaXppbmdcIiBjbGFzcz1cInJlc2l6ZS1ib3ggcHVsbC1yaWdodCBmbGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25MaXN0UmVzaXplU3RhcnQoJGV2ZW50LCBmaWVsZC5BcGlOYW1lLCBqKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwbGl0dGVyXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdXBwb3J0U29ydGluZ1wiIGNsYXNzPVwic29ydGluZy1ib3ggcHVsbC1sZWZ0IGZsaXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaGFzLXNvcnRpbmcnOiBmaWVsZC5BcGlOYW1lID09PSBzb3J0QnkgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZmllbGQuQXBpTmFtZSAhPT0gc29ydEJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBlcC1pY29uIG5hbWU9XCJhcnJvd19laXRoZXJcIiBjbGFzcz1cImFzY1wiPjwvcGVwLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkLkFwaU5hbWUgPT09IHNvcnRCeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFpc0FzY1wiIFtuZ0NsYXNzXT1cInsgJ3NvcnQtYnknOiBmaWVsZC5BcGlOYW1lID09PSBzb3J0QnkgJiYgaXNBc2MgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0xJU1QuU09SVF9BU0MnIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwZXAtaWNvbiBuYW1lPVwiYXJyb3dfdXBcIiBjbGFzcz1cImFzY1wiPjwvcGVwLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJpc0FzY1wiIFtuZ0NsYXNzXT1cInsgJ3NvcnQtYnknOiBmaWVsZC5BcGlOYW1lID09PSBzb3J0QnkgJiYgIWlzQXNjIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdMSVNULlNPUlRfREVTQycgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBlcC1pY29uIG5hbWU9XCJhcnJvd19kb3duXCIgY2xhc3M9XCJkZXNjXCI+PC9wZXAtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGFibGVUb3RhbD5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNUYWJsZSAmJiB0b3RhbHNSb3c/Lmxlbmd0aCA+IDAgJiYgdG90YWxzUm93Lmxlbmd0aCA8PSBsYXlvdXQ/LkNvbnRyb2xGaWVsZHMubGVuZ3RoXCJcbiAgICAgICAgY2xhc3M9XCJ0YWJsZS10b3RhbFwiPlxuICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJ0YWJsZS1oZWFkZXItZmllbGRzZXRcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGxheW91dD8uQ29udHJvbEZpZWxkczsgbGV0IGogPSBpbmRleFwiIGNsYXNzPVwidG90YWwtY29sdW1uIHB1bGwtbGVmdCBmbGlwXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiBmaWVsZC5jYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZyB9XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG90YWwtbGFiZWwgYm9keS1zbSB0ZXh0LWFsaWduLXt7IGZpZWxkLkxheW91dC5YQWxpZ25tZW50IH19XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRvdGFsc1Jvd1tqXSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19
|
|
1286
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL2xpc3QvbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL2xpc3QvbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLFNBQVMsR0FNWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBRUgsaUJBQWlCLEVBSWpCLFVBQVUsR0FFYixNQUFNLHlCQUF5QixDQUFDO0FBTWpDLE9BQU8sRUFBRSx3QkFBd0IsRUFBYSxNQUFNLG9CQUFvQixDQUFDO0FBRXpFLE9BQU8sRUFNSCxnQkFBZ0IsRUFHaEIsaUJBQWlCLEdBS3BCLE1BQU0sY0FBYyxDQUFDO0FBTXRCLE9BQU8sS0FBSyxLQUFLLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7OztBQVczQyxNQUFNLE9BQU8sZ0JBQWdCO0lBb016QixZQUNZLFdBQXVCLEVBQ3ZCLGFBQStCLEVBQy9CLGNBQWlDLEVBQ2pDLEVBQXFCLEVBQ3JCLFFBQW1CLEVBQ25CLElBQVk7UUFMWixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFDL0IsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBQ2pDLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBQ3JCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQWhMZixjQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDZixtQkFBYyxHQUFXLElBQUksQ0FBQztRQUM5Qiw0QkFBdUIsR0FBeUIsT0FBTyxDQUFDO1FBQ3hELHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQiw0QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFFaEMsYUFB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QUFvQjtzQkFBNUIsS0FBSztnQkFJRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBWU4sU0FBUztzQkFEUixNQUFNO2dCQUlQLFVBQVU7c0JBRFQsTUFBTTtnQkFJUCxXQUFXO3NCQURWLE1BQU07Z0JBSVAsYUFBYTtzQkFEWixNQUFNO2dCQUlQLG1CQUFtQjtzQkFEbEIsTUFBTTtnQkFJUCxrQkFBa0I7c0JBRGpCLE1BQU07Z0JBSVAsY0FBYztzQkFEYixNQUFNO2dCQU9QLFFBQVE7c0JBRFAsTUFBTTtnQkFJUCxTQUFTO3NCQURSLE1BQU07Z0JBSVAsUUFBUTtzQkFEUCxNQUFNO2dCQUlQLGdCQUFnQjtzQkFEZixNQUFNO2dCQUdzQyxlQUFlO3NCQUEzRCxTQUFTO3VCQUFDLHdCQUF3QjtnQkFDVCxXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIE9uSW5pdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgT25EZXN0cm95LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBOZ1pvbmUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICAgIFBlcExheW91dFNlcnZpY2UsXG4gICAgUGVwU2NyZWVuU2l6ZVR5cGUsXG4gICAgUGVwU2Vzc2lvblNlcnZpY2UsXG4gICAgVUlDb250cm9sLFxuICAgIFVJQ29udHJvbEZpZWxkLFxuICAgIEZJRUxEX1RZUEUsXG4gICAgT2JqZWN0c0RhdGFSb3csXG59IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9uZ3gtbGliJztcbmltcG9ydCB7XG4gICAgSVBlcEZvcm1GaWVsZFZhbHVlQ2hhbmdlRXZlbnQsXG4gICAgSVBlcEZvcm1GaWVsZENsaWNrRXZlbnQsXG59IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9uZ3gtbGliL2Zvcm0nO1xuXG5pbXBvcnQgeyBWaXJ0dWFsU2Nyb2xsZXJDb21wb25lbnQsIElQYWdlSW5mbyB9IGZyb20gJy4vdmlydHVhbC1zY3JvbGxlcic7XG5cbmltcG9ydCB7XG4gICAgSVBlcExpc3RMb2FkSXRlbXNFdmVudCxcbiAgICBJUGVwTGlzdFNvcnRpbmdDaGFuZ2VFdmVudCxcbiAgICBJUGVwTGlzdEl0ZW1DbGlja0V2ZW50LFxuICAgIFBlcExpc3RTZWxlY3Rpb25UeXBlLFxuICAgIFBlcExpc3RWaWV3VHlwZSxcbiAgICBQZXBTZWxlY3Rpb25EYXRhLFxuICAgIFBlcExpc3RQYWdlclR5cGUsXG4gICAgSVBlcExpc3RMb2FkUGFnZUV2ZW50LFxuICAgIERFRkFVTFRfUEFHRV9TSVpFLFxuICAgIElQZXBMaXN0U3RhcnRJbmRleENoYW5nZUV2ZW50LFxuICAgIFBlcExpc3RDYXJkU2l6ZVR5cGUsXG4gICAgUGVwTGlzdFRhYmxlVmlld1R5cGUsXG4gICAgSVBlcExpc3RTb3J0aW5nRGF0YSxcbn0gZnJvbSAnLi9saXN0Lm1vZGVsJztcbmltcG9ydCB7XG4gICAgSVBlcExpc3RQYWdlckNoYW5nZUV2ZW50LFxuICAgIFBlcExpc3RQYWdlckNvbXBvbmVudCxcbn0gZnJvbSAnLi9saXN0LXBhZ2VyLmNvbXBvbmVudCc7XG5cbmltcG9ydCAqIGFzIHR3ZWVuIGZyb20gJ0B0d2VlbmpzL3R3ZWVuLmpzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdwZXAtbGlzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2xpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2xpc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgICBob3N0OiB7XG4gICAgICAgICcod2luZG93OnJlc2l6ZSknOiAnb25XaW5SZXNpemUoJGV2ZW50KScsXG4gICAgfSxcbiAgICAvLyBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBQZXBMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gICAgc3RhdGljIFRPUF9JVEVNU19ERUZBVUxUID0gMTAwO1xuICAgIHN0YXRpYyBUT1BfSVRFTVNfVEFCTEUgPSAxMDA7XG4gICAgc3RhdGljIFRPUF9JVEVNU19USFVNQk5BSUxTID0gMTAwO1xuICAgIHN0YXRpYyBUT1BfSVRFTVNfQVJSQVkgPSAyNTAwO1xuXG4gICAgc3RhdGljIFNFTEVDVEVEX0lURU1TX1NUQVRFX0tFWSA9ICdTZWxlY3RlZEl0ZW1zJztcbiAgICBzdGF0aWMgVU5fU0VMRUNURURfSVRFTVNfU1RBVEVfS0VZID0gJ1VuU2VsZWN0ZWRJdGVtcyc7XG4gICAgc3RhdGljIEFMTF9TRUxFQ1RFRF9TVEFURV9LRVkgPSAnQWxsU2VsZWN0ZWQnO1xuICAgIHN0YXRpYyBTT1JUX0JZX1NUQVRFX0tFWSA9ICdTb3J0QnknO1xuICAgIHN0YXRpYyBBU0NFTkRJTkdfU1RBVEVfS0VZID0gJ0lzQXNjZW5kaW5nJztcblxuICAgIHN0YXRpYyBNSU5JTVVNX0NPTFVNTl9XSURUSCA9IDcyO1xuXG4gICAgQElucHV0KCkgXG4gICAgc2V0IHNvcnRpbmcodmFsdWU6IElQZXBMaXN0U29ydGluZ0RhdGEpIHtcbiAgICAgICAgdGhpcy5zb3J0QnkgPSB2YWx1ZT8uc29ydEJ5IHx8ICcnO1xuICAgICAgICB0aGlzLmlzQXNjID0gdmFsdWU/LnNvcnRCeS5sZW5ndGggPiAwID8gdmFsdWUuaXNBc2MgOiB0cnVlO1xuICAgIH1cbiAgICBnZXQgc29ydGluZygpOiBJUGVwTGlzdFNvcnRpbmdEYXRhIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvcnRCeTogdGhpcy5zb3J0QnksXG4gICAgICAgICAgICBpc0FzYzogdGhpcy5pc0FzY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBcbiAgICBASW5wdXQoKSBjYWNoZVNpemUgPSAtMTtcbiAgICBASW5wdXQoKSBub0RhdGFGb3VuZE1zZzogc3RyaW5nID0gbnVsbDtcbiAgICBASW5wdXQoKSBzZWxlY3Rpb25UeXBlRm9yQWN0aW9uczogUGVwTGlzdFNlbGVjdGlvblR5cGUgPSAnbXVsdGknO1xuICAgIEBJbnB1dCgpIHNob3dDYXJkU2VsZWN0aW9uID0gZmFsc2U7XG4gICAgQElucHV0KCkgaGlkZUFsbFNlbGVjdGlvbkluTXVsdGkgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpIGNhcmRTaXplOiBQZXBMaXN0Q2FyZFNpemVUeXBlID0gJ21kJztcbiAgICBASW5wdXQoKSB0YWJsZVZpZXdUeXBlOiBQZXBMaXN0VGFibGVWaWV3VHlwZSA9ICdyZWd1bGFyJztcbiAgICBcbiAgICBwcml2YXRlIF92aWV3VHlwZTogUGVwTGlzdFZpZXdUeXBlID0gJyc7XG4gICAgQElucHV0KClcbiAgICBzZXQgdmlld1R5cGUodmFsdWU6IFBlcExpc3RWaWV3VHlwZSkge1xuICAgICAgICB0aGlzLl92aWV3VHlwZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmlzVGFibGUgPSB2YWx1ZSA9PT0gJ3RhYmxlJztcbiAgICB9XG4gICAgZ2V0IHZpZXdUeXBlKCk6IFBlcExpc3RWaWV3VHlwZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92aWV3VHlwZTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBmaXJzdEZpZWxkQXNMaW5rID0gZmFsc2U7XG4gICAgQElucHV0KCkgc3VwcG9ydFNvcnRpbmcgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHN1cHBvcnRSZXNpemluZyA9IHRydWU7XG5cbiAgICBwcml2YXRlIF9wYXJlbnRTY3JvbGw6IEVsZW1lbnQgfCBXaW5kb3cgPSBudWxsO1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHBhcmVudFNjcm9sbCh2YWx1ZTogRWxlbWVudCB8IFdpbmRvdykge1xuICAgICAgICB0aGlzLl9wYXJlbnRTY3JvbGwgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IHBhcmVudFNjcm9sbCgpOiBFbGVtZW50IHwgV2luZG93IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudFNjcm9sbDtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBfbG9ja0V2ZW50cyA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IGxvY2tFdmVudHModmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fbG9ja0V2ZW50cyA9IHZhbHVlO1xuXG4gICAgICAgIGlmICh0aGlzLl9sb2NrRXZlbnRzKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2xvY2stZXZlbnRzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2xvY2stZXZlbnRzJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGxvY2tFdmVudHMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NrRXZlbnRzO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIGxvY2tJdGVtSW5uZXJFdmVudHMgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwcmludE1vZGUgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBpc1JlcG9ydCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHplYnJhU3RyaXBlcyA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHRvdGFsc1JvdyA9IFtdO1xuICAgIEBJbnB1dCgpIHBhZ2VyVHlwZTogUGVwTGlzdFBhZ2VyVHlwZSA9ICdzY3JvbGwnO1xuICAgIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSBERUZBVUxUX1BBR0VfU0laRTtcbiAgICBASW5wdXQoKSBwYWdlSW5kZXggPSAwO1xuICAgIC8vIEBJbnB1dCgpIHN0YXJ0SW5kZXggPSAwO1xuXG4gICAgQElucHV0KCkgYnVmZmVyQW1vdW50ID0gMDtcbiAgICBASW5wdXQoKSBzY3JvbGxBbmltYXRpb25UaW1lID0gNTAwO1xuICAgIEBJbnB1dCgpIHNjcm9sbERlYm91bmNlVGltZSA9IDA7XG4gICAgQElucHV0KCkgc2Nyb2xsVGhyb3R0bGluZ1RpbWUgPSAwO1xuXG4gICAgcHJpdmF0ZSBfdXNlQXNXZWJDb21wb25lbnQgPSBmYWxzZTtcbiAgICBASW5wdXQoKVxuICAgIHNldCB1c2VBc1dlYkNvbXBvbmVudCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl91c2VBc1dlYkNvbXBvbmVudCA9IHZhbHVlO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwb3J0RnVuY3Rpb25zT25Ib3N0RWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCB1c2VBc1dlYkNvbXBvbmVudCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZUFzV2ViQ29tcG9uZW50O1xuICAgIH1cblxuICAgIEBPdXRwdXQoKVxuICAgIGl0ZW1DbGljazogRXZlbnRFbWl0dGVyPElQZXBMaXN0SXRlbUNsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGVwTGlzdEl0ZW1DbGlja0V2ZW50PigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgZmllbGRDbGljazogRXZlbnRFbWl0dGVyPElQZXBGb3JtRmllbGRDbGlja0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBlcEZvcm1GaWVsZENsaWNrRXZlbnQ+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPElQZXBGb3JtRmllbGRWYWx1ZUNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBlcEZvcm1GaWVsZFZhbHVlQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBzb3J0aW5nQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SVBlcExpc3RTb3J0aW5nQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGVwTGlzdFNvcnRpbmdDaGFuZ2VFdmVudD4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHNlbGVjdGVkSXRlbXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBzZWxlY3RlZEl0ZW1DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBzZWxlY3RBbGxDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIC8vIEBPdXRwdXQoKVxuICAgIC8vIHNpbmdsZUFjdGlvbkNsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgbGlzdExvYWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIGxvYWRJdGVtczogRXZlbnRFbWl0dGVyPElQZXBMaXN0TG9hZEl0ZW1zRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGVwTGlzdExvYWRJdGVtc0V2ZW50PigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgbG9hZFBhZ2U6IEV2ZW50RW1pdHRlcjxJUGVwTGlzdExvYWRQYWdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGVwTGlzdExvYWRQYWdlRXZlbnQ+KCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBzdGFydEluZGV4Q2hhbmdlOiBFdmVudEVtaXR0ZXI8SVBlcExpc3RTdGFydEluZGV4Q2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGVwTGlzdFN0YXJ0SW5kZXhDaGFuZ2VFdmVudD4oKTtcblxuICAgIEBWaWV3Q2hpbGQoVmlydHVhbFNjcm9sbGVyQ29tcG9uZW50KSBwcml2YXRlIHZpcnR1YWxTY3JvbGxlcjogVmlydHVhbFNjcm9sbGVyQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdEFsbENCJykgc2VsZWN0QWxsQ0I6IGFueTtcblxuICAgIHByaXZhdGUgX2xheW91dDogVUlDb250cm9sID0gbnVsbDtcbiAgICBnZXQgbGF5b3V0KCk6IFVJQ29udHJvbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXlvdXQ7XG4gICAgfVxuXG4gICAgdG90YWxSb3dzID0gLTE7XG4gICAgaXNUYWJsZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgaGFzQ29sdW1uV2lkdGhPZlR5cGVQZXJjZW50YWdlID0gdHJ1ZTtcblxuICAgIHByaXZhdGUgX2l0ZW1zOiBBcnJheTxPYmplY3RzRGF0YVJvdz4gPSBudWxsO1xuICAgIGdldCBpdGVtcygpOiBBcnJheTxPYmplY3RzRGF0YVJvdz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpdGVtc0NvdW50ZXIgPSAwO1xuXG4gICAgY3VycmVudFBhZ2VJdGVtczogQXJyYXk8T2JqZWN0c0RhdGFSb3c+O1xuXG4gICAgU0VQQVJBVE9SID0gJywnO1xuICAgIGlzQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBzZWxlY3RlZEl0ZW1zID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICB1blNlbGVjdGVkSXRlbXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gICAgcHJpdmF0ZSBjdXJyZW50VHdlZW46IGFueTtcblxuICAgIHNlbGVjdGVkSXRlbUlkID0gJyc7XG4gICAgaG92ZXJlZEl0ZW1JZCA9ICcnO1xuXG4gICAgcHJpdmF0ZSBjb250YWluZXJXaWR0aCA9IDA7XG4gICAgcHJpdmF0ZSB0YWJsZVNjcm9sbFdpZHRoID0gMDtcblxuICAgIHByaXZhdGUgX2xvYWRpbmdJdGVtc0Zyb21BcGkgPSBmYWxzZTtcbiAgICBnZXQgbG9hZGluZ0l0ZW1zRnJvbUFwaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRpbmdJdGVtc0Zyb21BcGk7XG4gICAgfVxuXG4gICAgc2NyZWVuU2l6ZTogUGVwU2NyZWVuU2l6ZVR5cGU7XG4gICAgZGV2aWNlSGFzTW91c2UgPSBmYWxzZTtcblxuICAgIC8vIEZvciByZXNpemVcbiAgICBwcmVzc2VkQ29sdW1uID0gJyc7XG4gICAgcHJlc3NlZENvbHVtbkluZGV4ID0gLTE7XG4gICAgc3RhcnRYID0gMDtcbiAgICBzdGFydFdpZHRoID0gMDtcbiAgICB0YWJsZVN0YXJ0V2lkdGggPSAwO1xuICAgIFxuICAgIHByaXZhdGUgbGFzdENvbHVtbnNXaWR0aDogQXJyYXk8eyBjb2x1bW5BUElOYW1lOiBzdHJpbmcsIGNhbGNDb2x1bW5XaWR0aDogbnVtYmVyLCBjYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZzogc3RyaW5nLCBjYWxjQ29sdW1uV2lkdGhTdHJpbmc6IHN0cmluZyB9PiA9IFtdO1xuXG4gICAgLy8gRm9yIHNvcnRpbmdcbiAgICBpc0FzYyA9IHRydWU7XG4gICAgc29ydEJ5ID0gJyc7XG4gICAgaXNVc2VyU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBjaGVja0ZvckNoYW5nZXM6IGFueSA9IG51bGw7XG4gICAgY2FsY3VsYXRlZE9iamVjdEhlaWdodCA9ICdhdXRvJztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGhvc3RFbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIGxheW91dFNlcnZpY2U6IFBlcExheW91dFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc2Vzc2lvblNlcnZpY2U6IFBlcFNlc3Npb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZVxuICAgICkge1xuICAgICAgICAvLyB0aGlzLm5hdGl2ZVdpbmRvdyA9IHdpbmRvdztcbiAgICAgICAgdGhpcy5sYXlvdXRTZXJ2aWNlLm9uUmVzaXplJC5zdWJzY3JpYmUoKHNpemU6IFBlcFNjcmVlblNpemVUeXBlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNjcmVlblNpemUgPSBzaXplO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxheW91dFNlcnZpY2Uub25Nb3VzZU92ZXIkLnN1YnNjcmliZSgoZGV2aWNlSGFzTW91c2U6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlSGFzTW91c2UgPSBkZXZpY2VIYXNNb3VzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSAwO1xuICAgICAgICB0aGlzLmRldmljZUhhc01vdXNlID0gdGhpcy5sYXlvdXRTZXJ2aWNlLmdldERldmljZUhhc01vdXNlKCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250YWluZXJXaWR0aCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldENvbnRhaW5lcldpZHRoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgLy8gaWYgKHRoaXMudmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgLy8gICAgIHRoaXMudmFsdWVDaGFuZ2UudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGlmICh0aGlzLmxvYWRJdGVtcykge1xuICAgICAgICAvLyAgICAgdGhpcy5sb2FkSXRlbXMudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGlmICh0aGlzLmxvYWRQYWdlKSB7XG4gICAgICAgIC8vICAgICB0aGlzLmxvYWRQYWdlLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyBpZiAodGhpcy5zb3J0aW5nQ2hhbmdlKSB7XG4gICAgICAgIC8vICAgICB0aGlzLnNvcnRpbmdDaGFuZ2UudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGlmICh0aGlzLmZpZWxkQ2xpY2spIHtcbiAgICAgICAgLy8gICAgIHRoaXMuZmllbGRDbGljay51bnN1YnNjcmliZSgpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gaWYgKHRoaXMuaXRlbUNsaWNrKSB7XG4gICAgICAgIC8vICAgICB0aGlzLml0ZW1DbGljay51bnN1YnNjcmliZSgpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gaWYgKHRoaXMubGlzdExvYWQpIHtcbiAgICAgICAgLy8gICAgIHRoaXMubGlzdExvYWQudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuc2F2ZVNvcnRpbmdUb1Nlc3Npb24oKTtcbiAgICB9XG5cbiAgICBnZXRDYWNoZWRJdGVtc051bWJlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVTaXplID49IDAgPyB0aGlzLmNhY2hlU2l6ZSA6IFBlcExpc3RDb21wb25lbnQuVE9QX0lURU1TX0FSUkFZO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2Nyb2xsaW5nRWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50U2Nyb2xsID8gdGhpcy5wYXJlbnRTY3JvbGwgOiB0aGlzLnZpcnR1YWxTY3JvbGxlcj8uY29udGVudEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsVG9Ub3AoYW5pbWF0ZSA9IHRydWUpIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsaW5nRWxlbWVudCA9IHRoaXMuZ2V0U2Nyb2xsaW5nRWxlbWVudCgpO1xuICAgICAgICBpZiAoc2Nyb2xsaW5nRWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gMDtcblxuICAgICAgICAgICAgLy8gdG90YWxseSBkaXNhYmxlIGFuaW1hdGVcbiAgICAgICAgICAgIGlmICghYW5pbWF0ZSB8fCB0aGlzLnNjcm9sbEFuaW1hdGlvblRpbWUgPT09IDApIHtcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsaW5nRWxlbWVudCBpbnN0YW5jZW9mIFdpbmRvdykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgc2Nyb2xsVG9wKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBhbmltYXRpb25SZXF1ZXN0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzV2luZG93ID0gc2Nyb2xsaW5nRWxlbWVudCBpbnN0YW5jZW9mIFdpbmRvdztcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U2Nyb2xsVG9wID1cbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsaW5nRWxlbWVudCBpbnN0YW5jZW9mIFdpbmRvd1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB3aW5kb3cucGFnZVlPZmZzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgIDogc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxUb3A7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VHdlZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUd2Vlbi5zdG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFR3ZWVuID0gbmV3IHR3ZWVuLlR3ZWVuKHsgc2Nyb2xsVG9wOiBjdXJyZW50U2Nyb2xsVG9wIH0pXG4gICAgICAgICAgICAgICAgICAgIC50byh7IHNjcm9sbFRvcCB9LCB0aGlzLnNjcm9sbEFuaW1hdGlvblRpbWUpXG4gICAgICAgICAgICAgICAgICAgIC5lYXNpbmcodHdlZW4uRWFzaW5nLlF1YWRyYXRpYy5PdXQpXG4gICAgICAgICAgICAgICAgICAgIC5vblVwZGF0ZSgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGRhdGEuc2Nyb2xsVG9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzV2luZG93KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIGRhdGEuc2Nyb2xsVG9wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsaW5nRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Njcm9sbFRvcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc2Nyb2xsVG9wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLm9uU3RvcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShhbmltYXRpb25SZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhbmltYXRlID0gKHRpbWU/KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFR3ZWVuLnVwZGF0ZSh0aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFR3ZWVuLl9vYmplY3Quc2Nyb2xsVG9wICE9PSBzY3JvbGxUb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uUmVxdWVzdCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGFuaW1hdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2VsZWN0aW9uQ2hlY2tCb3hXaWR0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA9PT0gJ211bHRpJyA/IDQ0IDogMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENvbnRhaW5lcldpZHRoKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3dIZWlnaHQgPSA0MDsgLy8gdGhlIHRhYmxlIHJvdyBoZWlnaHQgKDIuNXJlbSAqIDE2Zm9udC1zaXplKS5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKFxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnRcbiAgICAgICAgKTtcbiAgICAgICAgLy8gVGhlIGNvbnRhaW5lci1mbHVpZCBjbGFzcyBwYWRkaW5nIGxlZnQgKyByaWdodCArIGJvcmRlclxuICAgICAgICBjb25zdCBjb250YWluZXJGbHVpZFNwYWNpbmcgPVxuICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUucGFkZGluZ0xlZnQsIDEwKSArIHBhcnNlSW50KHN0eWxlLnBhZGRpbmdSaWdodCwgMTApO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudENvbnRhaW5lciA9XG4gICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50ID4gMFxuICAgICAgICAgICAgICAgID8gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudFxuICAgICAgICAgICAgICAgIDogdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGlmIHZlcnRpY2FsIHNjcm9sbCBzaG91bGQgYXBwZWFyLCBpZiBzbyBzZXQgdGhlIHNjcm9sbCB3aWR0aC4gKHRoaXMudG90YWxSb3dzICsgMSkgKyAxIGlzIGZvciB0aGUgaGVhZGVyIHJvdy5cbiAgICAgICAgdGhpcy50YWJsZVNjcm9sbFdpZHRoID0gcGFyZW50Q29udGFpbmVyLmNsaWVudEhlaWdodCA8IHJvd0hlaWdodCAqICh0aGlzLnRvdGFsUm93cyArIDEpXG4gICAgICAgICAgICA/IHRoaXMubGF5b3V0U2VydmljZS5nZXRTY3JvbGxiYXJXaWR0aCgpXG4gICAgICAgICAgICA6IDA7XG5cbiAgICAgICAgLy8gVGhlIHNlbGVjdGlvbkNoZWNrQm94V2lkdGggd2lkdGggKyBjb250YWluZXJGbHVpZFNwYWNpbmcgKyB0aGlzLnRhYmxlU2Nyb2xsV2lkdGguXG4gICAgICAgIGNvbnN0IHJvd0hlYWRlcldpZHRoVG9TdWIgPVxuICAgICAgICAgICAgY29udGFpbmVyRmx1aWRTcGFjaW5nICsgdGhpcy5nZXRTZWxlY3Rpb25DaGVja0JveFdpZHRoKCkgKyB0aGlzLnRhYmxlU2Nyb2xsV2lkdGg7XG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSBwYXJlbnRDb250YWluZXIub2Zmc2V0V2lkdGggLSByb3dIZWFkZXJXaWR0aFRvU3ViO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZVNvcnRpbmdUb1Nlc3Npb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2Uuc2V0T2JqZWN0KFxuICAgICAgICAgICAgUGVwTGlzdENvbXBvbmVudC5TT1JUX0JZX1NUQVRFX0tFWSxcbiAgICAgICAgICAgIHRoaXMuc29ydEJ5XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2Uuc2V0T2JqZWN0KFxuICAgICAgICAgICAgUGVwTGlzdENvbXBvbmVudC5BU0NFTkRJTkdfU1RBVEVfS0VZLFxuICAgICAgICAgICAgdGhpcy5pc0FzY1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VG9wSXRlbXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNUYWJsZVxuICAgICAgICAgICAgPyBQZXBMaXN0Q29tcG9uZW50LlRPUF9JVEVNU19UQUJMRVxuICAgICAgICAgICAgOiBQZXBMaXN0Q29tcG9uZW50LlRPUF9JVEVNU19USFVNQk5BSUxTO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlzYWJsZVNjcm9sbChkaXNhYmxlOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChkaXNhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LCAnbG9jay1ldmVudHMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQsICdsb2NrLWV2ZW50cycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b2dnbGVMb2FkaW5nSXRlbXNGcm9wQXBpKGxvYWRpbmdJdGVtc0Zyb21BcGk6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zRnJvbUFwaSA9IGxvYWRpbmdJdGVtc0Zyb21BcGk7XG5cbiAgICAgICAgLy8gdGhpcy5kaXNhYmxlU2Nyb2xsKGxvYWRpbmdJdGVtc0Zyb21BcGkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQ3VycmVudFBhZ2VJdGVtcyhzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZUl0ZW1zID0gdGhpcy5pdGVtcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTZWxlY3Rpb25JdGVtcyhcbiAgICAgICAgaXRlbUlkOiBzdHJpbmcsXG4gICAgICAgIHVuaXFJdGVtSWQ6IHN0cmluZyxcbiAgICAgICAgaXNDaGVja2VkOiBib29sZWFuXG4gICAgKTogdm9pZCB7XG4gICAgICAgIC8vIFNldCBzZWxlY3RlZCBpdGVtIGNoZWNrYm94XG4gICAgICAgIGlmICh0aGlzLmlzQWxsU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChpc0NoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuU2VsZWN0ZWRJdGVtcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuc2V0KGl0ZW1JZCwgdW5pcUl0ZW1JZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVuU2VsZWN0ZWRJdGVtcy5zZXQoaXRlbUlkLCB1bmlxSXRlbUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc0NoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuU2VsZWN0ZWRJdGVtcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuc2V0KGl0ZW1JZCwgdW5pcUl0ZW1JZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVuU2VsZWN0ZWRJdGVtcy5zZXQoaXRlbUlkLCB1bmlxSXRlbUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VW5pcUl0ZW1JZChpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGUgPSAnJyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpdGVtSWQgKyB0aGlzLlNFUEFSQVRPUiArIGl0ZW1UeXBlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TGF5b3V0KCk6IHZvaWQge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnRvdGFsUm93cyA9PT0gMCB8fFxuICAgICAgICAgICAgIXRoaXMuX2xheW91dCB8fFxuICAgICAgICAgICAgIXRoaXMuX2xheW91dC5Db250cm9sRmllbGRzIHx8XG4gICAgICAgICAgICB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkcy5sZW5ndGggPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkcy5mb3JFYWNoKChjZikgPT4ge1xuICAgICAgICAgICAgaWYgKGNmLkNvbHVtbldpZHRoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgY2YuQ29sdW1uV2lkdGggPSAxMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuaXNUYWJsZSAmJlxuICAgICAgICAgICAgICAgIChjZi5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuSW1hZ2UgfHxcbiAgICAgICAgICAgICAgICAgICAgLy8gY2YuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLkluZGljYXRvcnMgfHwgPz8/XG4gICAgICAgICAgICAgICAgICAgIGNmLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5TaWduYXR1cmUgfHxcbiAgICAgICAgICAgICAgICAgICAgY2YuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLk51bWJlckludGVnZXJRdWFudGl0eVNlbGVjdG9yIHx8XG4gICAgICAgICAgICAgICAgICAgIGNmLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5OdW1iZXJSZWFsUXVhbnRpdHlTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBjZi5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVySW50ZWdlckZvck1hdHJpeCB8fFxuICAgICAgICAgICAgICAgICAgICBjZi5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVyUmVhbEZvck1hdHJpeCB8fFxuICAgICAgICAgICAgICAgICAgICBjZi5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuUGFja2FnZSB8fFxuICAgICAgICAgICAgICAgICAgICBjZi5BcGlOYW1lID09PSAnVW5pdHNRdWFudGl0eScgfHxcbiAgICAgICAgICAgICAgICAgICAgY2YuQXBpTmFtZSA9PT0gJ1F1YW50aXR5U2VsZWN0b3InKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2YuTGF5b3V0LlhBbGlnbm1lbnQgPSAzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMuY2RbJ2Rlc3Ryb3llZCddKSB7XG4gICAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgY29udGFpbmVyIHdpZHRoLlxuICAgICAgICBpZiAodGhpcy5jb250YWluZXJXaWR0aCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldENvbnRhaW5lcldpZHRoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0xhc3RDb2x1bW5zV2lkdGhTZXQgPSB0aGlzLnNldExhc3RDb2x1bW5zV2lkdGgoKTtcbiAgICAgICAgICAgIFxuICAgICAgICAvLyBTZXQgdGhlIGxheW91dCBvbmx5IGlmIHRoZSBsYXN0IGNvbHVtbnMgd2lkdGggY291bGRuJ3Qgc2V0LlxuICAgICAgICBpZiAoIWlzTGFzdENvbHVtbnNXaWR0aFNldCkge1xuICAgICAgICAgICAgdGhpcy5jYWxjQ29sdW1uc1dpZHRoKCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRoaXMuY2hlY2tGb3JDaGFuZ2VzID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRMYXN0Q29sdW1uc1dpZHRoKCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IHRvdGFsQ2FsY0NvbHNXaWR0aCA9IDA7XG4gICAgICAgIGxldCB3aWR0aFRvU2V0ID0gJ2luaGVyaXQnO1xuXG4gICAgICAgIGlmICh0aGlzLmxhc3RDb2x1bW5zV2lkdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyB0aGUgc2FtZSBVSSBjb250cm9sIGZvciB0YWJsZS5cbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RDb2x1bW5zV2lkdGgubGVuZ3RoID09PSB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBsZXQgdWlDb250cm9sc0FyZVRoZVNhbWUgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX2xheW91dC5Db250cm9sRmllbGRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1aUNvbnRyb2xGaWVsZDogVUlDb250cm9sRmllbGQgPSB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkc1tpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAodWlDb250cm9sRmllbGQuQXBpTmFtZSAhPT0gdGhpcy5sYXN0Q29sdW1uc1dpZHRoW2luZGV4XS5jb2x1bW5BUElOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xzQXJlVGhlU2FtZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgaWYgKHVpQ29udHJvbHNBcmVUaGVTYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpQ29udHJvbEZpZWxkOiBVSUNvbnRyb2xGaWVsZCA9IHRoaXMuX2xheW91dC5Db250cm9sRmllbGRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aCA9IHRoaXMubGFzdENvbHVtbnNXaWR0aFtpbmRleF0uY2FsY0NvbHVtbldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgPSB0aGlzLmxhc3RDb2x1bW5zV2lkdGhbaW5kZXhdLmNhbGNUaXRsZUNvbHVtbldpZHRoU3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoU3RyaW5nID0gdGhpcy5sYXN0Q29sdW1uc1dpZHRoW2luZGV4XS5jYWxjQ29sdW1uV2lkdGhTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbENhbGNDb2xzV2lkdGggKz0gdGhpcy5sYXN0Q29sdW1uc1dpZHRoW2luZGV4XS5jYWxjQ29sdW1uV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoVG9TZXQgPSAodG90YWxDYWxjQ29sc1dpZHRoICsgdGhpcy5nZXRTZWxlY3Rpb25DaGVja0JveFdpZHRoKCkpICsgJ3B4J1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgc2V0TGFzdENvbHVtbnNXaWR0aCAtPiB3aWR0aFRvU2V0OiAke3dpZHRoVG9TZXR9ICoqKiB0b3RhbENhbGNDb2xzV2lkdGg6ICR7dG90YWxDYWxjQ29sc1dpZHRofWApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENvbHVtbnNXaWR0aCh3aWR0aFRvU2V0KTtcblxuICAgICAgICAgICAgICAgICAgICByZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Q29sdW1uc1dpZHRoKHdpZHRoVG9TZXQ6IHN0cmluZywgd2FpdCA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgICAgd2lkdGhUb1NldFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIERvIHRoaXMgb25seSBhZnRlciBVSSBpcyBjaGFuZ2UgY2F1c2UgdGhlIHByb3BlcnR5IGlzVGFibGUgaXMgSW5wdXQgYW5kIGNhbiByZWZyZXNoIGFmdGVyIHRoaXMgdGhyZWFkLlxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxlcikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFNjcm9sbGVyLmNvbnRlbnRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICd3aWR0aCcsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoVG9TZXQgPT09ICdpbmhlcml0JyA/ICcxMDAlJyA6IHdpZHRoVG9TZXRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGNDb2x1bW5zV2lkdGgoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpeGVkTXVsdGlwbGUgPSAzLjc4OyAvLyBmb3IgY29udmVydGluZyBlbSB0byBwaXhlbC5cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5fbGF5b3V0LkNvbnRyb2xGaWVsZHMubGVuZ3RoO1xuICAgICAgICBcbiAgICAgICAgLy8gSXMgdGFibGUgQU5EIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjb2x1bW4gb2Ygd2lkdGggdHlwZSBvZiBwZXJjZW50YWdlLlxuICAgICAgICBpZiAodGhpcy5pc1RhYmxlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fbGF5b3V0ICYmIHRoaXMuX2xheW91dC5Db250cm9sRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNDb2x1bW5XaWR0aE9mVHlwZVBlcmNlbnRhZ2UgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2YpID0+IGNmLkNvbHVtbldpZHRoVHlwZSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICApLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBjb2x1bW5zIHNpemUgaXMgZml4ZWQgYW5kIHRoZSB0b3RhbCBpcyBzbWFsbCB0aGVuIHRoZSBjb250YWluZXIgY2hhbmdlIGl0IHRvIHBlcmNlbnRhZ2UuXG4gICAgICAgIGlmICghdGhpcy5oYXNDb2x1bW5XaWR0aE9mVHlwZVBlcmNlbnRhZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsRml4ZWRDb2xzV2lkdGggPSB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkcy5tYXAoXG4gICAgICAgICAgICAgICAgKGNmKSA9PiBjZi5Db2x1bW5XaWR0aCAqIGZpeGVkTXVsdGlwbGVcbiAgICAgICAgICAgICkucmVkdWNlKChzdW0sIGN1cnJlbnQpID0+IHN1bSArIGN1cnJlbnQpO1xuXG4gICAgICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPiB0b3RhbEZpeGVkQ29sc1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNDb2x1bW5XaWR0aE9mVHlwZVBlcmNlbnRhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRvdGFsQ2FsY0NvbHNXaWR0aCA9IDA7XG5cbiAgICAgICAgbGV0IHdpZHRoVG9TZXQgPSAnaW5oZXJpdCc7XG5cbiAgICAgICAgLy8gQ2FsYyBieSBwZXJjZW50YWdlXG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbldpZHRoT2ZUeXBlUGVyY2VudGFnZSkge1xuICAgICAgICAgICAgY29uc3QgdG90YWxDb2xzV2lkdGg6IG51bWJlciA9IHRoaXMuX2xheW91dC5Db250cm9sRmllbGRzLm1hcChcbiAgICAgICAgICAgICAgICAoY2YpID0+IGNmLkNvbHVtbldpZHRoXG4gICAgICAgICAgICApLnJlZHVjZSgoc3VtLCBjdXJyZW50KSA9PiBzdW0gKyBjdXJyZW50KTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVpQ29udHJvbEZpZWxkOiBVSUNvbnRyb2xGaWVsZCA9IHRoaXMuX2xheW91dC5Db250cm9sRmllbGRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWxjQ29sdW1uV2lkdGhQZXJjZW50YWdlID0gKDEwMCAvIHRvdGFsQ29sc1dpZHRoKSAqIHVpQ29udHJvbEZpZWxkLkNvbHVtbldpZHRoO1xuXG4gICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoID0gTWF0aC5mbG9vcigodGhpcy5jb250YWluZXJXaWR0aCAqIGNhbGNDb2x1bW5XaWR0aFBlcmNlbnRhZ2UpIC8gMTAwKTtcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZyA9IHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aFN0cmluZyA9ICdjYWxjKDEwMCUgLSAnICsgdG90YWxDYWxjQ29sc1dpZHRoICsgJ3B4KSc7IC8vIEZvciAxMDAlXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgPSB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGhTdHJpbmcgPSB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGggKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbENhbGNDb2xzV2lkdGggKz0gdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1aUNvbnRyb2xGaWVsZDogVUlDb250cm9sRmllbGQgPSB0aGlzLl9sYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgLkNvbnRyb2xGaWVsZHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRGaXhlZFdpZHRoID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuQ29sdW1uV2lkdGggKiBmaXhlZE11bHRpcGxlXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZyA9IHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aFN0cmluZyA9IGN1cnJlbnRGaXhlZFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZyA9IHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aFN0cmluZyA9IGN1cnJlbnRGaXhlZFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0b3RhbENhbGNDb2xzV2lkdGggKz0gY3VycmVudEZpeGVkV2lkdGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdpZHRoVG9TZXQgPSAodG90YWxDYWxjQ29sc1dpZHRoICsgdGhpcy5nZXRTZWxlY3Rpb25DaGVja0JveFdpZHRoKCkpICsgJ3B4J1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coYGNhbGNDb2x1bW5zV2lkdGggLT4gd2lkdGhUb1NldDogJHt3aWR0aFRvU2V0fSAqKiogdG90YWxDYWxjQ29sc1dpZHRoOiAke3RvdGFsQ2FsY0NvbHNXaWR0aH1gKTtcbiAgICAgICAgdGhpcy5zZXRDb2x1bW5zV2lkdGgod2lkdGhUb1NldCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjT2JqZWN0SGVpZ2h0KCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnZpcnR1YWxTY3JvbGxlci5nZXRDb250ZW50KCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYGNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoOiAke2NvbnRlbnQuY2hpbGRyZW4ubGVuZ3RofWApO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gdGhpcy52aXJ0dWFsU2Nyb2xsZXIuZ2V0RWxlbWVudFNpemUoY29udGVudC5jaGlsZHJlblswXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlZE9iamVjdEhlaWdodCA9IHJlY3QuaGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYHRoaXMuY2FsY3VsYXRlZE9iamVjdEhlaWdodDogJHt0aGlzLmNhbGN1bGF0ZWRPYmplY3RIZWlnaHR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlU2Nyb2xsKGZhbHNlKTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0UmVzaXplRGF0YSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGFydFggPSAwO1xuICAgICAgICB0aGlzLnN0YXJ0V2lkdGggPSAwO1xuICAgICAgICB0aGlzLnRhYmxlU3RhcnRXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMucHJlc3NlZENvbHVtbiA9ICcnO1xuICAgICAgICB0aGlzLnByZXNzZWRDb2x1bW5JbmRleCA9IC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UGFyZW50KGVsLCBwYXJlbnRTZWxlY3Rvcik6IGFueSB7XG4gICAgICAgIC8vIElmIG5vIHBhcmVudFNlbGVjdG9yIGRlZmluZWQgd2lsbCBidWJibGUgdXAgYWxsIHRoZSB3YXkgdG8gKmRvY3VtZW50KlxuICAgICAgICBpZiAocGFyZW50U2VsZWN0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcGFyZW50U2VsZWN0b3IgPSBkb2N1bWVudDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBbXTtcbiAgICAgICAgbGV0IHAgPSBlbC5wYXJlbnROb2RlO1xuXG4gICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgIHAgJiZcbiAgICAgICAgICAgIHAuY2xhc3NOYW1lICE9PSAnJyAmJlxuICAgICAgICAgICAgcC5jbGFzc05hbWUuaW5kZXhPZihwYXJlbnRTZWxlY3RvcikgPT09IC0xICYmXG4gICAgICAgICAgICBwYXJlbnRTZWxlY3RvciAhPT0gZG9jdW1lbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBvID0gcDtcbiAgICAgICAgICAgIHAgPSBvLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAuY2xhc3NOYW1lLmluZGV4T2YocGFyZW50U2VsZWN0b3IpID4gLTEpIHtcbiAgICAgICAgICAgIHBhcmVudC5wdXNoKHApOyAvLyBQdXNoIHRoYXQgcGFyZW50U2VsZWN0b3IgeW91IHdhbnRlZCB0byBzdG9wIGF0XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFuSXRlbXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXRlbXNDb3VudGVyID0gMDtcbiAgICAgICAgdGhpcy5faXRlbXMgPVxuICAgICAgICAgICAgdGhpcy50b3RhbFJvd3MgPiAwID8gQXJyYXk8T2JqZWN0c0RhdGFSb3c+KHRoaXMudG90YWxSb3dzKSA6IFtdO1xuICAgICAgICB0aGlzLmN1cnJlbnRQYWdlSXRlbXMgPSBbXTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVkT2JqZWN0SGVpZ2h0ID0gJ2F1dG8nO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFZhcmlhYmxlc0Zyb21TZXNzaW9uKGl0ZW1zOiBPYmplY3RzRGF0YVJvd1tdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXNPYmplY3Q6IEFycmF5PGFueT4gPSB0aGlzLnNlc3Npb25TZXJ2aWNlLmdldE9iamVjdDxcbiAgICAgICAgICAgIEFycmF5PGFueT5cbiAgICAgICAgPihQZXBMaXN0Q29tcG9uZW50LlNFTEVDVEVEX0lURU1TX1NUQVRFX0tFWSk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXNGcm9tTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID1cbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNPYmplY3QgJiYgc2VsZWN0ZWRJdGVtc09iamVjdC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBuZXcgTWFwKHNlbGVjdGVkSXRlbXNPYmplY3QpXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zRnJvbU1hcCAhPSBudWxsICYmXG4gICAgICAgICAgICB0eXBlb2Ygc2VsZWN0ZWRJdGVtc0Zyb21NYXAuc2l6ZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXNGcm9tTWFwLnNpemUgPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gc2VsZWN0ZWRJdGVtc0Zyb21NYXA7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnJlbW92ZU9iamVjdChcbiAgICAgICAgICAgICAgICBQZXBMaXN0Q29tcG9uZW50LlNFTEVDVEVEX0lURU1TX1NUQVRFX0tFWVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdW5TZWxlY3RlZEl0ZW1zT2JqZWN0OiBBcnJheTxhbnk+ID0gdGhpcy5zZXNzaW9uU2VydmljZS5nZXRPYmplY3Q8XG4gICAgICAgICAgICBBcnJheTxhbnk+XG4gICAgICAgID4oUGVwTGlzdENvbXBvbmVudC5VTl9TRUxFQ1RFRF9JVEVNU19TVEFURV9LRVkpO1xuICAgICAgICBjb25zdCB1blNlbGVjdGVkSXRlbXNNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4gPVxuICAgICAgICAgICAgdW5TZWxlY3RlZEl0ZW1zT2JqZWN0ICYmIHVuU2VsZWN0ZWRJdGVtc09iamVjdC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBuZXcgTWFwKHVuU2VsZWN0ZWRJdGVtc09iamVjdClcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHVuU2VsZWN0ZWRJdGVtc01hcCAhPSBudWxsICYmXG4gICAgICAgICAgICB0eXBlb2YgdW5TZWxlY3RlZEl0ZW1zTWFwLnNpemUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB1blNlbGVjdGVkSXRlbXNNYXAuc2l6ZSA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnVuU2VsZWN0ZWRJdGVtcyA9IHVuU2VsZWN0ZWRJdGVtc01hcDtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2UucmVtb3ZlT2JqZWN0KFxuICAgICAgICAgICAgICAgIFBlcExpc3RDb21wb25lbnQuVU5fU0VMRUNURURfSVRFTVNfU1RBVEVfS0VZXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51blNlbGVjdGVkSXRlbXMuY2xlYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzQWxsU2VsZWN0ZWQgPSB0aGlzLnNlc3Npb25TZXJ2aWNlLmdldE9iamVjdChcbiAgICAgICAgICAgIFBlcExpc3RDb21wb25lbnQuQUxMX1NFTEVDVEVEX1NUQVRFX0tFWVxuICAgICAgICApO1xuICAgICAgICBpZiAoaXNBbGxTZWxlY3RlZCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSBpc0FsbFNlbGVjdGVkICYmIHRoaXMuZ2V0SXNBbGxTZWxlY3RlZChpdGVtcyk7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnJlbW92ZU9iamVjdChcbiAgICAgICAgICAgICAgICBQZXBMaXN0Q29tcG9uZW50LkFMTF9TRUxFQ1RFRF9TVEFURV9LRVlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvcnRCeSA9IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0T2JqZWN0KFxuICAgICAgICAgICAgUGVwTGlzdENvbXBvbmVudC5TT1JUX0JZX1NUQVRFX0tFWVxuICAgICAgICApO1xuICAgICAgICBpZiAoc29ydEJ5ICYmIHNvcnRCeSAhPT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuc29ydEJ5ID0gc29ydEJ5O1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5yZW1vdmVPYmplY3QoXG4gICAgICAgICAgICAgICAgUGVwTGlzdENvbXBvbmVudC5TT1JUX0JZX1NUQVRFX0tFWVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc29ydEJ5ID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0FzYyA9IHRoaXMuc2Vzc2lvblNlcnZpY2UuZ2V0T2JqZWN0KFxuICAgICAgICAgICAgUGVwTGlzdENvbXBvbmVudC5BU0NFTkRJTkdfU1RBVEVfS0VZXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpc0FzYyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmlzQXNjID0gaXNBc2M7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnJlbW92ZU9iamVjdChcbiAgICAgICAgICAgICAgICBQZXBMaXN0Q29tcG9uZW50LkFTQ0VORElOR19TVEFURV9LRVlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzQXNjID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SXNBbGxTZWxlY3RlZChpdGVtczogQXJyYXk8T2JqZWN0c0RhdGFSb3c+KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbXM/LnNpemUgPiAwICYmIGl0ZW1zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIShpdGVtICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5oYXMoaXRlbT8uVUlELnRvU3RyaW5nKCkpKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TnVtYmVyT2ZTdGFydEl0ZW1zKCk6IG51bWJlciB7XG4gICAgICAgIGxldCBudW1iZXJPZlN0YXJ0SXRlbXMgPSAyMDtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnNjcmVlblNpemUgPT09IFBlcFNjcmVlblNpemVUeXBlLlhMIHx8XG4gICAgICAgICAgICB0aGlzLnNjcmVlblNpemUgPT09IFBlcFNjcmVlblNpemVUeXBlLkxHXG4gICAgICAgICkge1xuICAgICAgICAgICAgbnVtYmVyT2ZTdGFydEl0ZW1zID0gdGhpcy5pc1RhYmxlID8gNTAgOiA0MDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNjcmVlblNpemUgPT09IFBlcFNjcmVlblNpemVUeXBlLk1EKSB7XG4gICAgICAgICAgICBudW1iZXJPZlN0YXJ0SXRlbXMgPSB0aGlzLmlzVGFibGUgPyAzMCA6IDIwO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2NyZWVuU2l6ZSA9PT0gUGVwU2NyZWVuU2l6ZVR5cGUuU00pIHtcbiAgICAgICAgICAgIG51bWJlck9mU3RhcnRJdGVtcyA9IHRoaXMuaXNUYWJsZSA/IDIwIDogMTA7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zY3JlZW5TaXplID09PSBQZXBTY3JlZW5TaXplVHlwZS5YUykge1xuICAgICAgICAgICAgbnVtYmVyT2ZTdGFydEl0ZW1zID0gdGhpcy5pc1RhYmxlID8gMTUgOiA1O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bWJlck9mU3RhcnRJdGVtcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEl0ZW1DbGlja2VkKFxuICAgICAgICBpdGVtSWQsXG4gICAgICAgIGlzU2VsZWN0YWJsZUZvckFjdGlvbnM6IGJvb2xlYW4sXG4gICAgICAgIGl0ZW1UeXBlOiBzdHJpbmcsXG4gICAgICAgIGlzQ2hlY2tlZDogYm9vbGVhblxuICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCB1bmlxSXRlbUlkID0gdGhpcy5nZXRVbmlxSXRlbUlkKGl0ZW1JZCwgaXRlbVR5cGUpO1xuXG4gICAgICAgIC8vIHNlbGVjdCB0aGUgc2VsZWN0ZWQgaXRlbS5cbiAgICAgICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgLy8gU2V0IHNlbGV0ZWQgaXRlbVxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JZCA9IHVuaXFJdGVtSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1JZCA9PT0gdW5pcUl0ZW1JZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWQgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblR5cGVGb3JBY3Rpb25zID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JZC5sZW5ndGggPT09IDAgPyAwIDogMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvblR5cGVGb3JBY3Rpb25zID09PSAnbXVsdGknKSB7XG4gICAgICAgICAgICBpZiAoaXNTZWxlY3RhYmxlRm9yQWN0aW9ucykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uSXRlbXMoaXRlbUlkLCB1bmlxSXRlbUlkLCBpc0NoZWNrZWQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudExpc3QgPSB0aGlzLmlzQWxsU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnVuU2VsZWN0ZWRJdGVtc1xuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRJdGVtcztcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TGlzdENvdW50ID0gdGhpcy5pc0FsbFNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy50b3RhbFJvd3MgLSBjdXJyZW50TGlzdC5zaXplXG4gICAgICAgICAgICAgICAgICAgIDogY3VycmVudExpc3Quc2l6ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdChjdXJyZW50TGlzdENvdW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJhaXNlIHNlbGVjdGVkIGl0ZW0gY2hhbmdlIGV2ZW50XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblR5cGVGb3JBY3Rpb25zICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlLmVtaXQoe1xuICAgICAgICAgICAgICAgIGlkOiBpdGVtSWQsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGlzQ2hlY2tlZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHBvcnRGdW5jdGlvbnNPbkhvc3RFbGVtZW50KCkge1xuICAgICAgICAvLyBUaGlzIGlzIGZvciB3ZWIgY29tcG9uZW50IHVzYWdlIGZvciB1c2UgdGhvc2UgZnVuY3Rpb25zLlxuICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xlYXIgPSB0aGlzLmNsZWFyLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5pbml0TGlzdERhdGEgPSB0aGlzLmluaXRMaXN0RGF0YS5iaW5kKFxuICAgICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudXBkYXRlSXRlbXMgPSB0aGlzLnVwZGF0ZUl0ZW1zLmJpbmQoXG4gICAgICAgICAgICB0aGlzXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC51cGRhdGVQYWdlID0gdGhpcy51cGRhdGVQYWdlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC51cGRhdGVJdGVtID0gdGhpcy51cGRhdGVJdGVtLmJpbmQodGhpcyk7XG4gICAgfVxuXG4gICAgLy8gRm9yIHJlZnJlc2ggdGhlIFVJIHdoZW4gY2hhbmdlIHRoZSBpcyBzZWxlY3RhYmxlIGZvciBhY3Rpb24gb24gaXRlbS5cbiAgICBnZXRpc0l0ZW1EaXNhYmxlZChpdGVtOiBPYmplY3RzRGF0YVJvdyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmludE1vZGUgfHwgdGhpcy5sb2NrSXRlbUlubmVyRXZlbnRzIHx8IChpdGVtICYmICFpdGVtLklzU2VsZWN0YWJsZUZvckFjdGlvbnMpXG4gICAgfVxuXG4gICAgZ2V0SXNBbGxTZWxlY3RlZEZvckFjdGlvbnMoKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZXMgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy51blNlbGVjdGVkSXRlbXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJlcyA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsU2Nyb2xsZXI/LnZpZXdQb3J0SXRlbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zLnNpemUgPT09IHRoaXMudG90YWxSb3dzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IHRoaXMuZ2V0SXNBbGxTZWxlY3RlZCh0aGlzLnZpcnR1YWxTY3JvbGxlci52aWV3UG9ydEl0ZW1zKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcy5zaXplIDwgdGhpcy50b3RhbFJvd3MpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMudmlydHVhbFNjcm9sbGVyLnZpZXdQb3J0SXRlbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSAmJiB0aGlzLnNlbGVjdGVkSXRlbXMuaGFzKGl0ZW0/LlVJRC50b1N0cmluZygpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgc2V0SXNBbGxTZWxlY3RlZChpc0NoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgPT09ICdtdWx0aScpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWxsQ0IuY2hlY2tlZCA9IGlzQ2hlY2tlZDtcbiAgICAgICAgICAgIHRoaXMuaXNBbGxTZWxlY3RlZCA9IGlzQ2hlY2tlZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNlbGVjdEFsbEl0ZW1zRm9yQWN0aW9ucyhlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gRm9yIG1hdGVyaWFsIGNoZWNrYm94IHx8IHJhZGlvLlxuICAgICAgICBjb25zdCBpc0NoZWNrZWQgPSBlLnNvdXJjZS5jaGVja2VkO1xuXG4gICAgICAgIC8vIEluZGV0ZXJtaW5hdGUgbW9kZVxuICAgICAgICBsZXQgaXNJbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMaXN0ID0gdGhpcy5pc0FsbFNlbGVjdGVkXG4gICAgICAgICAgICA/IHRoaXMudW5TZWxlY3RlZEl0ZW1zXG4gICAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRJdGVtcztcbiAgICAgICAgaWYgKGN1cnJlbnRMaXN0LnNpemUgPiAwKSB7XG4gICAgICAgICAgICBpc0luZGV0ZXJtaW5hdGUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5pc0FsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdCgwKTtcbiAgICAgICAgICAgIGUuc291cmNlLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5jbGVhcigpO1xuICAgICAgICB0aGlzLnVuU2VsZWN0ZWRJdGVtcy5jbGVhcigpO1xuXG4gICAgICAgIGlmICghaXNJbmRldGVybWluYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmlzQWxsU2VsZWN0ZWQgPSBpc0NoZWNrZWQ7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEFsbENsaWNrLmVtaXQoaXNDaGVja2VkKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgPT09ICdtdWx0aScpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JZCA9ICcnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkSXRlbXMgPSB0aGlzLml0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtICYmIGl0ZW0uSXNTZWxlY3RhYmxlRm9yQWN0aW9uc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdChmaWx0ZXJlZEl0ZW1zLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbFxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgPT09ICdtdWx0aScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEFsbENsaWNrLmVtaXQoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmFpc2VTdGFydEluZGV4Q2hhbmdlKHN0YXJ0SW5kZXggPSAwKSB7XG4gICAgICAgIC8vIHRoaXMuc3RhcnRJbmRleCA9IHN0YXJ0SW5kZXg7XG4gICAgICAgIHRoaXMuc3RhcnRJbmRleENoYW5nZS5lbWl0KHsgc3RhcnRJbmRleCB9KTtcbiAgICB9XG5cbiAgICBnZXRJc0l0ZW1TZWxlY3RlZChpdGVtOiBPYmplY3RzRGF0YVJvdyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgaXNTZWxlY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA9PT0gJ3NpbmdsZScpIHtcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZEl0ZW1JZCA9PT0gdGhpcy5nZXRVbmlxSXRlbUlkKGl0ZW0uVUlELCBpdGVtLlR5cGUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgPT09ICdtdWx0aScpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5Jc1NlbGVjdGFibGVGb3JBY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQgPSAodGhpcy5pc0FsbFNlbGVjdGVkICYmICF0aGlzLnVuU2VsZWN0ZWRJdGVtcy5oYXMoaXRlbS5VSUQpKSB8fCB0aGlzLnNlbGVjdGVkSXRlbXMuaGFzKGl0ZW0uVUlEKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNTZWxlY3RlZDtcbiAgICB9XG5cbiAgICBzZWxlY3RJdGVtRm9yQWN0aW9ucyhcbiAgICAgICAgZTogYW55LFxuICAgICAgICBpdGVtSWQ6IHN0cmluZyxcbiAgICAgICAgaXNTZWxlY3RhYmxlRm9yQWN0aW9uczogYm9vbGVhbixcbiAgICAgICAgaXRlbVR5cGUgPSAnJ1xuICAgICk6IHZvaWQge1xuICAgICAgICAvLyBGb3IgbWF0ZXJpYWwgY2hlY2tib3ggfHwgcmFkaW8uXG4gICAgICAgIGNvbnN0IGlzQ2hlY2tlZCA9IGUuc291cmNlLmNoZWNrZWQ7XG4gICAgICAgIHRoaXMuc2V0SXRlbUNsaWNrZWQoXG4gICAgICAgICAgICBpdGVtSWQsXG4gICAgICAgICAgICBpc1NlbGVjdGFibGVGb3JBY3Rpb25zLFxuICAgICAgICAgICAgaXRlbVR5cGUsXG4gICAgICAgICAgICBpc0NoZWNrZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpdGVtQ2xpY2tlZChlOiBhbnksIGl0ZW06IE9iamVjdHNEYXRhUm93KTogdm9pZCB7XG4gICAgICAgIC8vIFNldCBzZWxldGVkIGl0ZW1cbiAgICAgICAgY29uc3QgaXRlbUlkID0gaXRlbT8uVUlELnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGl0ZW1UeXBlID0gaXRlbT8uVHlwZS50b1N0cmluZygpO1xuICAgICAgICBsZXQgaXNDaGVja2VkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5Jc1NlbGVjdGFibGVGb3JBY3Rpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUlkID0gdGhpcy5nZXRVbmlxSXRlbUlkKGl0ZW1JZCwgaXRlbVR5cGUpO1xuICAgICAgICAgICAgaXNDaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVGFibGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblR5cGVGb3JBY3Rpb25zID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SXRlbUNsaWNrZWQoXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1JZCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5Jc1NlbGVjdGFibGVGb3JBY3Rpb25zLFxuICAgICAgICAgICAgICAgICAgICBpdGVtVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgaXNDaGVja2VkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgLy8gSnVzdCBtYXJrIHRoZSByb3cgYXMgaGlnaGxpZ2h0ZWRcbiAgICAgICAgICAgICAgICB0aGlzLnNldEl0ZW1DbGlja2VkKFxuICAgICAgICAgICAgICAgICAgICBpdGVtSWQsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uSXNTZWxlY3RhYmxlRm9yQWN0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLml0ZW1DbGljay5lbWl0KHsgc291cmNlOiBpdGVtLCB2aWV3VHlwZTogdGhpcy52aWV3VHlwZSB9KTtcbiAgICB9XG5cbiAgICBvblRhYmxlUm93TW91c2VFbnRlcihldmVudDogYW55LCBpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGV2aWNlSGFzTW91c2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaXFJdGVtSWQgPSB0aGlzLmdldFVuaXFJdGVtSWQoaXRlbUlkLCBpdGVtVHlwZSk7XG4gICAgICAgIHRoaXMuaG92ZXJlZEl0ZW1JZCA9IHVuaXFJdGVtSWQ7XG4gICAgfVxuXG4gICAgb25UYWJsZVJvd01vdXNlTGVhdmUoZXZlbnQ6IGFueSwgaXRlbUlkOiBzdHJpbmcsIGl0ZW1UeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3ZlcmVkSXRlbUlkID0gJyc7XG4gICAgfVxuXG4gICAgb25DYXJkTW91c2VFbnRlcihldmVudDogYW55LCBpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGV2aWNlSGFzTW91c2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaXFJdGVtSWQgPSB0aGlzLmdldFVuaXFJdGVtSWQoaXRlbUlkLCBpdGVtVHlwZSk7XG4gICAgICAgIHRoaXMuaG92ZXJlZEl0ZW1JZCA9IHVuaXFJdGVtSWQ7XG4gICAgfVxuXG4gICAgb25DYXJkTW91c2VMZWF2ZShldmVudDogYW55LCBpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvdmVyZWRJdGVtSWQgPSAnJztcbiAgICB9XG5cbiAgICAvLyB0cmFja0J5RnVuYyhpbmRleDogbnVtYmVyLCBpdGVtOiBPYmplY3RzRGF0YVJvdyk6IGFueSB7XG4gICAgLy8gICAgIHJldHVybiBpdGVtICYmIGl0ZW0/LlVJRCA/IGl0ZW0/LlVJRCA6IGluZGV4O1xuICAgIC8vICAgICAvLyBsZXQgcmVzOiBzdHJpbmcgPSBcIlwiO1xuXG4gICAgLy8gICAgIC8vIGlmIChpdGVtICYmIGl0ZW0/LlVJRCkge1xuICAgIC8vICAgICAvLyAgICByZXMgPSBpdGVtPy5VSUQgKyBcIl9cIiArIHRoaXMubGlzdFR5cGUgKyBcIl9cIiArICh0aGlzLmlzVGFibGUgPyBcIlRhYmxlXCIgOiBcIlRodW1ibmFpbHNcIik7XG4gICAgLy8gICAgIC8vIH1cbiAgICAvLyAgICAgLy8gZWxzZSB7XG4gICAgLy8gICAgIC8vICAgIHJlcyA9IGluZGV4ICsgXCJfXCIgKyB0aGlzLmxpc3RUeXBlICsgXCJfXCIgKyAodGhpcy5pc1RhYmxlID8gXCJUYWJsZVwiIDogXCJUaHVtYm5haWxzXCIpO1xuICAgIC8vICAgICAvLyB9XG5cbiAgICAvLyAgICAgLy8gcmV0dXJuIHJlcztcbiAgICAvLyB9XG5cbiAgICBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhbkl0ZW1zKCk7XG4gICAgICAgIHRoaXMuX2xheW91dCA9IG51bGw7XG4gICAgfVxuXG4gICAgc2V0U2VsZWN0ZWRJZHMoc2VsZWN0ZWRJZHM6IHN0cmluZ1tdLCBpdGVtcyA9IG51bGwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuaXNBbGxTZWxlY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZElkcykge1xuICAgICAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBzZWxlY3RlZElkIG9mIHNlbGVjdGVkSWRzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG1wID0gc2VsZWN0ZWRJZC5zcGxpdCh0aGlzLlNFUEFSQVRPUik7XG5cbiAgICAgICAgICAgICAgICBpZiAodG1wICYmIHRtcC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IHRtcFswXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbVR5cGUgPSB0bXAubGVuZ3RoID4gMSA/IHRtcFsxXSA6ICcnO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5zZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFVuaXFJdGVtSWQoaXRlbUlkLCBpdGVtVHlwZSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaXNBbGxTZWxlY3RlZCA9IHRoaXMuZ2V0SXNBbGxTZWxlY3RlZChpdGVtcyA/IGl0ZW1zIDogdGhpcy52aXJ0dWFsU2Nyb2xsZXI/LnZpZXdQb3J0SXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25EYXRhSW5TZXNzaW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICBzZXRTZWxlY3Rpb25EYXRhSW5TZXNzaW9uKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zLnNpemUgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnNldE9iamVjdChcbiAgICAgICAgICAgICAgICBQZXBMaXN0Q29tcG9uZW50LlNFTEVDVEVEX0lURU1TX1NUQVRFX0tFWSxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShbLi4udGhpcy5zZWxlY3RlZEl0ZW1zXSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy51blNlbGVjdGVkSXRlbXMuc2l6ZSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2Uuc2V0T2JqZWN0KFxuICAgICAgICAgICAgICAgIFBlcExpc3RDb21wb25lbnQuVU5fU0VMRUNURURfSVRFTVNfU1RBVEVfS0VZLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KFsuLi50aGlzLnVuU2VsZWN0ZWRJdGVtc10pXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXNzaW9uU2VydmljZS5zZXRPYmplY3QoXG4gICAgICAgICAgICBQZXBMaXN0Q29tcG9uZW50LkFMTF9TRUxFQ1RFRF9TVEFURV9LRVksXG4gICAgICAgICAgICB0aGlzLmlzQWxsU2VsZWN0ZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpbml0TGlzdERhdGEoXG4gICAgICAgIGxheW91dDogVUlDb250cm9sLFxuICAgICAgICB0b3RhbFJvd3M6IG51bWJlcixcbiAgICAgICAgaXRlbXM6IE9iamVjdHNEYXRhUm93W11cbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbml0VmFyaWFibGVzRnJvbVNlc3Npb24oaXRlbXMpO1xuICAgICAgICBjb25zdCBjdXJyZW50TGlzdCA9IHRoaXMuaXNBbGxTZWxlY3RlZFxuICAgICAgICAgICAgPyB0aGlzLnVuU2VsZWN0ZWRJdGVtc1xuICAgICAgICAgICAgOiB0aGlzLnNlbGVjdGVkSXRlbXM7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMaXN0Q291bnQgPSB0aGlzLmlzQWxsU2VsZWN0ZWRcbiAgICAgICAgICAgID8gdGhpcy50b3RhbFJvd3MgLSBjdXJyZW50TGlzdC5zaXplXG4gICAgICAgICAgICA6IGN1cnJlbnRMaXN0LnNpemU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KGN1cnJlbnRMaXN0Q291bnQpO1xuXG4gICAgICAgIHRoaXMuX2xheW91dCA9IGxheW91dDtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JZCA9ICcnO1xuICAgICAgICB0aGlzLnRvdGFsUm93cyA9IHRvdGFsUm93cztcblxuICAgICAgICB0aGlzLnNjcm9sbFRvVG9wKGZhbHNlKTtcbiAgICAgICAgdGhpcy5jbGVhbkl0ZW1zKCk7XG4gICAgICAgIHRoaXMuZGlzYWJsZVNjcm9sbCh0cnVlKTtcblxuICAgICAgICBpZiAoaXRlbXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2VyVHlwZSA9PT0gJ3BhZ2VzJykge1xuICAgICAgICAgICAgICAgIC8vIElmIHBhZ2UgaW5kZXggb3V0IG9mIGJvdW5kcyAtIGluaXQgdG8gMC5cbiAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJPZlBhZ2VzID0gTWF0aC5jZWlsKHRvdGFsUm93cyAvIHRoaXMucGFnZVNpemUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFnZUluZGV4ID49IG51bWJlck9mUGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGFnZShpdGVtcywge1xuICAgICAgICAgICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMucGFnZUluZGV4LFxuICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZVNjcm9sbChmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mU3RhcnRJdGVtcyA9IHRoaXMuZ2V0TnVtYmVyT2ZTdGFydEl0ZW1zKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21JbmRleDogMCxcbiAgICAgICAgICAgICAgICAgICAgdG9JbmRleDogbnVtYmVyT2ZTdGFydEl0ZW1zLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJdGVtcyhpdGVtcywgZXZlbnQpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxTY3JvbGxlcikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjT2JqZWN0SGVpZ2h0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY09iamVjdEhlaWdodCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5pc1RhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RDb2x1bW5zV2lkdGggPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0TGF5b3V0KCk7XG5cbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uTGlzdExvYWQoKTtcbiAgICAgICAgLy8gfSwgMCk7XG4gICAgfVxuXG4gICAgdXBkYXRlSXRlbXMoXG4gICAgICAgIGl0ZW1zOiBPYmplY3RzRGF0YVJvd1tdLFxuICAgICAgICBldmVudDogSVBlcExpc3RMb2FkSXRlbXNFdmVudCA9IG51bGxcbiAgICApOiB2b2lkIHtcbiAgICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyBFdmVudCBpc24ndCBzdXBwbGllZC5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFuIGFycmF5XG4gICAgICAgIGlmICh0aGlzLml0ZW1zQ291bnRlciArIGl0ZW1zLmxlbmd0aCA+IHRoaXMuZ2V0Q2FjaGVkSXRlbXNOdW1iZXIoKSkge1xuICAgICAgICAgICAgdGhpcy5jbGVhbkl0ZW1zKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gZXZlbnQuZnJvbUluZGV4ID8/IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLml0ZW1zW2kgKyBzdGFydEluZGV4XSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXNbaSArIHN0YXJ0SW5kZXhdID0gaXRlbXNbaV07XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtc0NvdW50ZXIgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG9nZ2xlTG9hZGluZ0l0ZW1zRnJvcEFwaShmYWxzZSk7XG4gICAgfVxuXG4gICAgdXBkYXRlUGFnZShpdGVtczogT2JqZWN0c0RhdGFSb3dbXSwgZXZlbnQ6IElQZXBMaXN0TG9hZFBhZ2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIEV2ZW50IGlzbid0IHN1cHBsaWVkLlxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYW4gYXJyYXlcbiAgICAgICAgaWYgKHRoaXMuaXRlbXNDb3VudGVyICsgaXRlbXMubGVuZ3RoID4gdGhpcy5nZXRDYWNoZWRJdGVtc051bWJlcigpKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFuSXRlbXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnN0IGxvYWRJbkNodW5rcyA9IHRoaXMuaXRlbXNDb3VudGVyID09PSAwO1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gTWF0aC5taW4oZXZlbnQucGFnZUluZGV4ICogZXZlbnQucGFnZVNpemUsIHRoaXMudG90YWxSb3dzKTtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBNYXRoLm1pbihzdGFydEluZGV4ICsgZXZlbnQucGFnZVNpemUsIHRoaXMudG90YWxSb3dzKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXRlbXNbaSArIHN0YXJ0SW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpICsgc3RhcnRJbmRleF0gPSBpdGVtc1tpXTtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zQ291bnRlciArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50UGFnZUl0ZW1zKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgdGhpcy50b2dnbGVMb2FkaW5nSXRlbXNGcm9wQXBpKGZhbHNlKTtcbiAgICB9XG5cbiAgICB1cGRhdGVJdGVtKGRhdGE6IE9iamVjdHNEYXRhUm93KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pdGVtcy5maW5kSW5kZXgoKGkpID0+IGkgJiYgaT8uVUlEID09PSBkYXRhPy5VSUQpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1Qcm9wZXJ0aWVzKHRoaXMuaXRlbXNbaW5kZXhdLCBkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNjcm9sbFRvSW5kZXgoaW5kZXg6IG51bWJlciwgYWxpZ25Ub0JlZ2lubmluZyA9IHRydWUsIGFkZGl0aW9uYWxPZmZzZXQgPSAwLCBhbmltYXRpb25NaWxsaXNlY29uZHM6IG51bWJlciA9IHVuZGVmaW5lZCwgYW5pbWF0aW9uQ29tcGxldGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsZXI/LnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWduVG9CZWdpbm5pbmcsIGFkZGl0aW9uYWxPZmZzZXQsIGFuaW1hdGlvbk1pbGxpc2Vjb25kcywgYW5pbWF0aW9uQ29tcGxldGVkQ2FsbGJhY2spO1xuICAgIH1cblxuICAgIHVwZGF0ZUl0ZW1Qcm9wZXJ0aWVzKGl0ZW1Ub1VwZGF0ZTogT2JqZWN0c0RhdGFSb3csIGRhdGE6IE9iamVjdHNEYXRhUm93KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oaXRlbVRvVXBkYXRlLCBkYXRhKTtcbiAgICB9XG5cbiAgICBnZXRTZWxlY3RlZEl0ZW1zRGF0YShpc0ZvckVkaXQgPSBmYWxzZSk6IFBlcFNlbGVjdGlvbkRhdGEge1xuICAgICAgICBjb25zdCByZXMgPSBuZXcgUGVwU2VsZWN0aW9uRGF0YSgpO1xuXG4gICAgICAgIGxldCBzZWxlY3Rpb25UeXBlID0gMTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBbXTtcbiAgICAgICAgY29uc3QgaXRlbVR5cGVzID0gW107XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1JZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG1wID0gdGhpcy5zZWxlY3RlZEl0ZW1JZC5zcGxpdCh0aGlzLlNFUEFSQVRPUik7XG4gICAgICAgICAgICAgICAgaXRlbXMucHVzaCh0bXBbMF0pO1xuICAgICAgICAgICAgICAgIGl0ZW1UeXBlcy5wdXNoKHRtcFsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA9PT0gJ211bHRpJykge1xuICAgICAgICAgICAgbGV0IGN1cnJlbnRMaXN0ID0gW107XG5cbiAgICAgICAgICAgIC8vIEZvciBlZGl0IC0gb25seSB0aGUgc2VsZWN0ZWQgaXRlbXMuXG4gICAgICAgICAgICBpZiAoaXNGb3JFZGl0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQWxsU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudExpc3QgPSBBcnJheS5mcm9tKHRoaXMuc2VsZWN0ZWRJdGVtcy52YWx1ZXMoKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBpZCdzIG9mIHRoZSBpdGVtcyB0aGF0IG5vdCBmb3VuZGVkIGluIHVuU2VsZWN0ZWRJdGVtcy5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLnVuU2VsZWN0ZWRJdGVtcy5oYXMoaXRlbT8uVUlELnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGlzdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFVuaXFJdGVtSWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy5VSUQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LlR5cGUudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgZGVsZXRlIC0gY2FuIGJlIHRoZSB1bnNlbGVjdGVkIHdpdGggc2VsZWN0X2FsbCBmdW5jdGlvbmFsaXR5LlxuICAgICAgICAgICAgICAgIGN1cnJlbnRMaXN0ID0gQXJyYXkuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FsbFNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMudW5TZWxlY3RlZEl0ZW1zLnZhbHVlcygpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc2VsZWN0ZWRJdGVtcy52YWx1ZXMoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uVHlwZSA9IHRoaXMuaXNBbGxTZWxlY3RlZCA/IDAgOiAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjdXJyZW50TGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG1wID0gaXRlbS5zcGxpdCh0aGlzLlNFUEFSQVRPUik7XG5cbiAgICAgICAgICAgICAgICBpZiAodG1wLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKHRtcFswXSk7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlcy5wdXNoKHRtcFsxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy5zZWxlY3Rpb25UeXBlID0gc2VsZWN0aW9uVHlwZTtcbiAgICAgICAgcmVzLnJvd3MgPSBpdGVtcztcbiAgICAgICAgcmVzLnJvd1R5cGVzID0gaXRlbVR5cGVzO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZ2V0SXNJdGVtRWRpdGFibGUodWlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbXMuZmlsdGVyKCh4KSA9PiB4Py5VSUQudG9TdHJpbmcoKSA9PT0gdWlkKTtcbiAgICAgICAgaWYgKGl0ZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1bMF0uSXNFZGl0YWJsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEl0ZW1EYXRhQnlJRCh1aWQ6IHN0cmluZyk6IE9iamVjdHNEYXRhUm93IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbT8uVUlELnRvU3RyaW5nKCkgPT09IHVpZCk7XG4gICAgfVxuXG4gICAgcmVmcmVzaChyZWZyZXNoQ29tcGxldGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy52aXJ0dWFsU2Nyb2xsZXI/LnJlZnJlc2gocmVmcmVzaENvbXBsZXRlZENhbGxiYWNrKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyAgICAgICAgICAgICAgRXZlbnRzIGhhbmRsZXJzLlxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgb25XaW5SZXNpemUoZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcblxuICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gMDtcbiAgICAgICAgdGhpcy5sYXN0Q29sdW1uc1dpZHRoID0gW107XG4gICAgICAgIHRoaXMuc2V0TGF5b3V0KCk7XG4gICAgfVxuXG4gICAgb25MaXN0UmVzaXplU3RhcnQoZXZlbnQsIGNvbHVtbktleTogc3RyaW5nLCBjb2x1bW5JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJlc3NlZENvbHVtbiA9IGNvbHVtbktleTtcbiAgICAgICAgdGhpcy5wcmVzc2VkQ29sdW1uSW5kZXggPSBjb2x1bW5JbmRleDtcbiAgICAgICAgdGhpcy5zdGFydFggPSBldmVudC54O1xuICAgICAgICB0aGlzLnN0YXJ0V2lkdGggPSBldmVudC50YXJnZXQuY2xvc2VzdCgnLmhlYWRlci1jb2x1bW4nKS5vZmZzZXRXaWR0aDtcbiAgICAgICAgdGhpcy50YWJsZVN0YXJ0V2lkdGggPSB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7IC8vIHRoaXMudmlydHVhbFNjcm9sbGVyPy5jb250ZW50RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICBjb25zb2xlLmxvZyhgdGFibGVTdGFydFdpZHRoIC0gJHt0aGlzLnRhYmxlU3RhcnRXaWR0aH1gKTtcbiAgICB9XG5cbiAgICBvbkxpc3RSZXNpemUoZXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gaWYgKHRoaXMucHJlc3NlZENvbHVtbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICh0aGlzLnByZXNzZWRDb2x1bW5JbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBsZXQgd2lkdGhUb0FkZCA9IHRoaXMubGF5b3V0U2VydmljZS5pc1J0bCgpID8gdGhpcy5zdGFydFggLSBldmVudC54IDogZXZlbnQueCAtIHRoaXMuc3RhcnRYO1xuXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4gYW5kIHRoZSBjb250YWluZXIgb2YgdGhlIHdob2xlIGNvbHVtbnMuXG4gICAgICAgICAgICBpZiAodGhpcy5zdGFydFdpZHRoICsgd2lkdGhUb0FkZCA+PSBQZXBMaXN0Q29tcG9uZW50Lk1JTklNVU1fQ09MVU1OX1dJRFRIIHx8IHdpZHRoVG9BZGQgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5fbGF5b3V0LkNvbnRyb2xGaWVsZHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxldCB0b3RhbENhbGNDb2xzV2lkdGggPSAwO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1aUNvbnRyb2xGaWVsZDogVUlDb250cm9sRmllbGQgPSB0aGlzLl9sYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5Db250cm9sRmllbGRzW2luZGV4XTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IGxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGMgdGhlIGxhc3QgY29sdW1uIG9ubHkgaW4gcGVyY2VudGFnZSB0eXBlLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uV2lkdGhPZlR5cGVQZXJjZW50YWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsV2lkdGggPSB0aGlzLmxheW91dFNlcnZpY2UuZ2V0U2Nyb2xsYmFyV2lkdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aFRvQWRkICs9IHNjcm9sbFdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNUaXRsZUNvbHVtbldpZHRoU3RyaW5nID0gdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoU3RyaW5nID0gJ2NhbGMoMTAwJSAtICcgKyAodG90YWxDYWxjQ29sc1dpZHRoICsgc2Nyb2xsV2lkdGgpICsgJ3B4KSc7IC8vIEZvciAxMDAlXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICh1aUNvbnRyb2xGaWVsZC5BcGlOYW1lID09PSB0aGlzLnByZXNzZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMucHJlc3NlZENvbHVtbkluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aCA9IHRoaXMuc3RhcnRXaWR0aCArIHdpZHRoVG9BZGQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNUaXRsZUNvbHVtbldpZHRoU3RyaW5nID0gdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoU3RyaW5nID0gdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAodWlDb250cm9sRmllbGQuQXBpTmFtZSA9PT0gdGhpcy5wcmVzc2VkQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHRoaXMucHJlc3NlZENvbHVtbkluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGggPSB0aGlzLnN0YXJ0V2lkdGggKyB3aWR0aFRvQWRkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgPSB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGhTdHJpbmcgPSB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGggKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdG90YWxDYWxjQ29sc1dpZHRoICs9IHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCB3aWR0aFRvU2V0ID0gKHRoaXMudGFibGVTdGFydFdpZHRoICsgd2lkdGhUb0FkZCkgKyAncHgnO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBvbkxpc3RSZXNpemUgLT4gd2lkdGhUb1NldDogJHt3aWR0aFRvU2V0fSAqKiogd2lkdGhUb0FkZDogJHt3aWR0aFRvQWRkfWApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29sdW1uc1dpZHRoKHdpZHRoVG9TZXQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JDaGFuZ2VzID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTGlzdFJlc2l6ZUVuZChldmVudCk6IHZvaWQge1xuICAgICAgICAvLyBpZiAodGhpcy5wcmVzc2VkQ29sdW1uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHRoaXMucHJlc3NlZENvbHVtbkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBldmVudCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UGFyZW50KGV2ZW50LnNyY0VsZW1lbnQsICdyZXNpemUtYm94JykubGVuZ3RoID4gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UmVzaXplRGF0YSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGltZW91dCAwIGZvciBvbkxpc3RTb3J0aW5nQ2hhbmdlIHdpbGwgaGF2ZSB0aGUgcHJlc3NlZENvbHVtbi5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0UmVzaXplRGF0YSgpO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxhc3RDb2x1bW5zV2lkdGggPSBbXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2V0IHRoZSBsYXN0IGNvbHVtbnMgd2lkdGhcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1aUNvbnRyb2xGaWVsZDogVUlDb250cm9sRmllbGQgPSB0aGlzLl9sYXlvdXQuQ29udHJvbEZpZWxkc1tpbmRleF07XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0Q29sdW1uc1dpZHRoLnB1c2goeyBcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uQVBJTmFtZTogdWlDb250cm9sRmllbGQuQXBpTmFtZSwgXG4gICAgICAgICAgICAgICAgICAgIGNhbGNDb2x1bW5XaWR0aDogdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoLFxuICAgICAgICAgICAgICAgICAgICBjYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZzogdWlDb250cm9sRmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGNhbGNDb2x1bW5XaWR0aFN0cmluZzogdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoU3RyaW5nXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkxpc3RTb3J0aW5nQ2hhbmdlKHNvcnRCeTogc3RyaW5nLCBpc0FzYzogYm9vbGVhbiwgZXZlbnQgPSBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIHRoaXMucHJlc3NlZENvbHVtbi5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICB0aGlzLnByZXNzZWRDb2x1bW5JbmRleCA+PSAwIHx8XG4gICAgICAgICAgICAoZXZlbnQgJiYgdGhpcy5nZXRQYXJlbnQoZXZlbnQuc3JjRWxlbWVudCwgJ3Jlc2l6ZS1ib3gnKS5sZW5ndGggPiAwKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNvcnRCeSAhPT0gc29ydEJ5IHx8IHRoaXMuaXNBc2MgIT09IGlzQXNjKSB7XG4gICAgICAgICAgICB0aGlzLnNvcnRCeSA9IHNvcnRCeTtcbiAgICAgICAgICAgIHRoaXMuaXNBc2MgPSBpc0FzYztcbiAgICAgICAgICAgIHRoaXMuc2F2ZVNvcnRpbmdUb1Nlc3Npb24oKTtcblxuICAgICAgICAgICAgdGhpcy5zb3J0aW5nQ2hhbmdlLmVtaXQoeyBzb3J0QnksIGlzQXNjIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25MaXN0SGVhZGVyTW91c2VFbnRlcihldmVudCk6IHZvaWQge1xuICAgICAgICAvLyB0aGlzLmhlYWRlcklzSW5Gb2N1cyA9IHRydWU7XG4gICAgfVxuXG4gICAgb25MaXN0SGVhZGVyTW91c2VMZWF2ZShldmVudCk6IHZvaWQge1xuICAgICAgICAvLyB0aGlzLmhlYWRlcklzSW5Gb2N1cyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uTGlzdFJlc2l6ZUVuZChldmVudCk7XG4gICAgICAgIHRoaXMuaW5pdFJlc2l6ZURhdGEoKTtcbiAgICB9XG5cbiAgICBvblBhZ2VyQ2hhbmdlKGV2ZW50OiBJUGVwTGlzdFBhZ2VyQ2hhbmdlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYWdlSW5kZXggPSBldmVudC5wYWdlSW5kZXg7XG5cbiAgICAgICAgLy8gU2Nyb2xsIHRvIHRvcC5cbiAgICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBldmVudC5wYWdlSW5kZXggKiBldmVudC5wYWdlU2l6ZTtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBNYXRoLm1pbihcbiAgICAgICAgICAgIHN0YXJ0SW5kZXggKyBldmVudC5wYWdlU2l6ZSxcbiAgICAgICAgICAgIHRoaXMudG90YWxSb3dzXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IHNob3VsZEdldEl0ZW1zRnJvbUFwaSA9IGZhbHNlO1xuICAgICAgICBsZXQgaW5kZXg6IG51bWJlciA9IHN0YXJ0SW5kZXg7XG5cbiAgICAgICAgd2hpbGUgKCFzaG91bGRHZXRJdGVtc0Zyb21BcGkgJiYgaW5kZXggPCBlbmRJbmRleCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLml0ZW1zW2luZGV4XSkge1xuICAgICAgICAgICAgICAgIHNob3VsZEdldEl0ZW1zRnJvbUFwaSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGJ1bGsgZnJvbSBhcGkuXG4gICAgICAgIGlmIChzaG91bGRHZXRJdGVtc0Zyb21BcGkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5sb2FkaW5nSXRlbXNGcm9tQXBpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVMb2FkaW5nSXRlbXNGcm9wQXBpKHRydWUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkUGFnZS5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZUluZGV4OiBldmVudC5wYWdlSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiBldmVudC5wYWdlU2l6ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ3VycmVudFBhZ2VJdGVtcyhzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgICAgICB9LCB0aGlzLnNjcm9sbEFuaW1hdGlvblRpbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25WaXJ0dWFsU2Nyb2xsZXJDaGFuZ2UoZXZlbnQ6IElQYWdlSW5mbyk6IHZvaWQge1xuICAgICAgICB0aGlzLnJhaXNlU3RhcnRJbmRleENoYW5nZShldmVudC5zdGFydEluZGV4KTtcblxuICAgICAgICBpZiAodGhpcy5wYWdlclR5cGUgPT09ICdzY3JvbGwnKSB7XG4gICAgICAgICAgICAvLyBGb3Igb3RoZXIgZXZlbnRzIGRvIG5vdGhpbmcuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50LnN0YXJ0SW5kZXggPT09ICd1bmRlZmluZWQnIHx8IGV2ZW50LnN0YXJ0SW5kZXggPCAwIHx8XG4gICAgICAgICAgICAgICAgdHlwZW9mIGV2ZW50LmVuZEluZGV4ID09PSAndW5kZWZpbmVkJyB8fCBldmVudC5lbmRJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGFkZEF0U3RhcnQgPSBldmVudC5zY3JvbGxEaXJlY3Rpb24gPT09ICdiYWNrd2FyZCc7XG4gICAgICAgICAgICBsZXQgc2hvdWxkR2V0SXRlbXNGcm9tQXBpID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaW5kZXhPZk1pc3NpbmdJdGVtOiBudW1iZXI7XG5cbiAgICAgICAgICAgIGlmIChhZGRBdFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgaW5kZXhPZk1pc3NpbmdJdGVtID0gZXZlbnQuZW5kSW5kZXg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFzaG91bGRHZXRJdGVtc0Zyb21BcGkgJiYgaW5kZXhPZk1pc3NpbmdJdGVtID49IGV2ZW50LnN0YXJ0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLml0ZW1zW2luZGV4T2ZNaXNzaW5nSXRlbV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEdldEl0ZW1zRnJvbUFwaSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZEdldEl0ZW1zRnJvbUFwaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhPZk1pc3NpbmdJdGVtLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGluZGV4T2ZNaXNzaW5nSXRlbSA9IGV2ZW50LnN0YXJ0SW5kZXg7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFzaG91bGRHZXRJdGVtc0Zyb21BcGkgJiYgaW5kZXhPZk1pc3NpbmdJdGVtIDw9IGV2ZW50LmVuZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pdGVtc1tpbmRleE9mTWlzc2luZ0l0ZW1dKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRHZXRJdGVtc0Zyb21BcGkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRHZXRJdGVtc0Zyb21BcGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4T2ZNaXNzaW5nSXRlbSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgYnVsayBmcm9tIGFwaS5cbiAgICAgICAgICAgIGlmIChzaG91bGRHZXRJdGVtc0Zyb21BcGkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubG9hZGluZ0l0ZW1zRnJvbUFwaSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUxvYWRpbmdJdGVtc0Zyb3BBcGkodHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9wID0gdGhpcy5nZXRUb3BJdGVtcygpIC0gMTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbUluZGV4ID0gYWRkQXRTdGFydCA/IE1hdGgubWF4KGluZGV4T2ZNaXNzaW5nSXRlbSAtIHRvcCwgMCkgOiBpbmRleE9mTWlzc2luZ0l0ZW07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvSW5kZXggPSBhZGRBdFN0YXJ0ID8gaW5kZXhPZk1pc3NpbmdJdGVtIDogTWF0aC5taW4oaW5kZXhPZk1pc3NpbmdJdGVtICsgdG9wLCB0aGlzLnRvdGFsUm93cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkSXRlbXMuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b0luZGV4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkxpc3RMb2FkKCk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubGlzdExvYWQuZW1pdCgpO1xuICAgICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICAvLyBvbkNoaWxkUmVjdENoYW5nZShldmVudDogYW55KSB7XG4gICAgLy8gICAgIC8vIFNldCB0aGUgY2FsY3VsYXRlZE9iamVjdEhlaWdodCBvbmx5IGlmIGhlJ3Mgbm90IHNldCAodGhpcyBjYXNlIGlzIG9ubHkgZm9yIHRoZSBpbml0aWFsaXplIHdoZW4gdmlydHVhbCBzY3JvbGwgaXMgdW5kZWZpbmVkKS5cbiAgICAvLyAgICAgLy8gdGhlIG90aGVyIGNhc2VzIGlzIGhhbmRsZWQgaW4gY2FsY09iamVjdEhlaWdodCBmdW5jdGlvbi5cbiAgICAvLyAgICAgaWYgKHRoaXMuY2FsY3VsYXRlZE9iamVjdEhlaWdodCA9PT0gJ2F1dG8nKSB7XG4gICAgLy8gICAgICAgICB0aGlzLmNhbGN1bGF0ZWRPYmplY3RIZWlnaHQgPSBldmVudD8uaGVpZ2h0ICsgJ3B4JztcbiAgICAvLyAgICAgfVxuICAgIC8vIH1cblxuICAgIG9uVmFsdWVDaGFuZ2VkKHZhbHVlQ2hhbmdlOiBJUGVwRm9ybUZpZWxkVmFsdWVDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlQ2hhbmdlKTtcbiAgICB9XG5cbiAgICBvbkN1c3RvbWl6ZUZpZWxkQ2xpY2soXG4gICAgICAgIGN1c3RvbWl6ZUZpZWxkQ2xpY2tlZERhdGE6IElQZXBGb3JtRmllbGRDbGlja0V2ZW50XG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpZWxkQ2xpY2suZW1pdChjdXN0b21pemVGaWVsZENsaWNrZWREYXRhKTtcbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwidG90YWxSb3dzID09IDBcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9EYXRhRm91bmRNc2c7IHRoZW4gbm9EYXRhTXNnSW5wdXRCbG9jazsgZWxzZSBub0RhdGFNc2dEZWZhdWx0QmxvY2tcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI25vRGF0YU1zZ0lucHV0QmxvY2s+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwZXAtYm9yZGVyLWJvdHRvbVwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0aXRsZS14bCBuby1kYXRhXCI+XG4gICAgICAgICAgICAgICAge3sgbm9EYXRhRm91bmRNc2cgfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctdGVtcGxhdGUgI25vRGF0YU1zZ0RlZmF1bHRCbG9jaz5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBlcC1ib3JkZXItYm90dG9tXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInRpdGxlLXhsIG5vLWRhdGFcIj5cbiAgICAgICAgICAgICAgICB7eyAnTElTVC5OT19EQVRBX0ZPVU5EJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibm8tZGF0YS1zdWdnZXN0aW9uc1wiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJzdWdnZXN0aW9ucy10aXRsZSB0aXRsZS1sZ1wiPlxuICAgICAgICAgICAgICAgIHt7ICdMSVNULk5PX0RBVEFfRk9VTkRfU1VHR0VTVElPTlNfVElUTEUnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cInN1Z2dlc3Rpb25zLWxpc3QgYm9keS1sZ1wiIFtpbm5lckh0bWxdPVwiJ0xJU1QuTk9fREFUQV9GT1VORF9TVUdHRVNUSU9OU19MSVNUJyB8IHRyYW5zbGF0ZVwiPjwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG48L25nLWNvbnRhaW5lcj5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ0b3RhbFJvd3MgPiAwXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlSGVhZGVyXCI+PC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tICh2c0NoaWxkUmVjdENoYW5nZSk9XCJvbkNoaWxkUmVjdENoYW5nZSgkZXZlbnQpXCIgLS0+XG4gICAgPHZpcnR1YWwtc2Nyb2xsZXIgI3Njcm9sbGVyIFtpdGVtc109XCJwYWdlclR5cGUgPT09ICdwYWdlcycgPyBjdXJyZW50UGFnZUl0ZW1zIDogaXRlbXNcIlxuICAgICAgICBbc2Nyb2xsRGVib3VuY2VUaW1lXT1cInNjcm9sbERlYm91bmNlVGltZVwiIFtzY3JvbGxUaHJvdHRsaW5nVGltZV09XCJzY3JvbGxUaHJvdHRsaW5nVGltZVwiXG4gICAgICAgIFtidWZmZXJBbW91bnRdPVwicHJpbnRNb2RlID8gdG90YWxSb3dzIDogYnVmZmVyQW1vdW50XCIgW3BhcmVudFNjcm9sbF09XCJwYXJlbnRTY3JvbGxcIiBbZGlzYWJsZV09XCJsb2FkaW5nSXRlbXNGcm9tQXBpXCJcbiAgICAgICAgY2xhc3M9XCJ2aXJ0dWFsLXNjcm9sbGVyXCIgW25nQ2xhc3NdPVwieyAndGFibGUtYm9keSc6IGlzVGFibGUsICdjYXJkcy1ib2R5JzogIWlzVGFibGUgfVwiXG4gICAgICAgICh2c0NoYW5nZSk9XCJvblZpcnR1YWxTY3JvbGxlckNoYW5nZSgkZXZlbnQpXCIgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNjcm9sbGVyLnZpZXdQb3J0SXRlbXM7IGxldCBpbmRleCA9IGluZGV4OyBsZXQgaXNGaXJzdCA9IGZpcnN0O1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxpc3REYXRhOyBjb250ZXh0OiB7aXRlbTogaXRlbSwgaW5kZXg6aW5kZXh9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdmlydHVhbC1zY3JvbGxlcj5cblxuICAgIDxwZXAtbGlzdC1wYWdlciAqbmdJZj1cInBhZ2VyVHlwZSA9PT0gJ3BhZ2VzJ1wiIGNsYXNzPVwiIGxpc3QtcGFnZXJcIiBbZGlzYWJsZWRdPVwibG9hZGluZ0l0ZW1zRnJvbUFwaVwiXG4gICAgICAgIFtsZW5ndGhdPVwidG90YWxSb3dzXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCIgW3BhZ2VJbmRleF09XCJwYWdlSW5kZXhcIiAocGFnZXJDaGFuZ2UpPVwib25QYWdlckNoYW5nZSgkZXZlbnQpXCI+XG4gICAgPC9wZXAtbGlzdC1wYWdlcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWJsZVRvdGFsXCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNsaXN0RGF0YSBsZXQtaXRlbT1cIml0ZW1cIiBsZXQtaW5kZXg9XCJpbmRleFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1RhYmxlXCI+XG4gICAgICAgIDwhLS0gZ2V0SXNJdGVtU2VsZWN0ZWQoaXRlbSkgLT4gaXRlbSB8IGlzSXRlbVNlbGVjdGVkOiBzZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA6IHNlbGVjdGVkSXRlbUlkIDogaXNBbGxTZWxlY3RlZCA6IHNlbGVjdGVkSXRlbXMgOiB1blNlbGVjdGVkSXRlbXMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yb3dcIiAobW91c2VlbnRlcik9XCJvblRhYmxlUm93TW91c2VFbnRlcigkZXZlbnQsIGl0ZW0/LlVJRCwgaXRlbT8uVHlwZSlcIiBcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uVGFibGVSb3dNb3VzZUxlYXZlKCRldmVudCwgaXRlbT8uVUlELCBpdGVtPy5UeXBlKVwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAnY29tcGFjdC12aWV3JzogdGFibGVWaWV3VHlwZSA9PT0gJ2NvbXBhY3QnLFxuICAgICAgICAgICAgICAgIGV2ZW46IHplYnJhU3RyaXBlcyAmJiBpbmRleCAlIDIgIT09IDAsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGdldElzSXRlbVNlbGVjdGVkKGl0ZW0pLFxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBpdGVtPy5VSUQgKyBTRVBBUkFUT1IgKyBpdGVtPy5UeXBlID09PSBzZWxlY3RlZEl0ZW1JZH1cIiBbbmdTdHlsZV09XCJ7IHZpc2liaWxpdHk6ICFsb2FkaW5nSXRlbXNGcm9tQXBpIHx8IGl0ZW0gPyAndmlzaWJsZScgOiAnaGlkZGVuJyB9XCI+XG4gICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJ0YWJsZS1yb3ctZmllbGRzZXRcIiBbbmdTdHlsZV09XCJ7ICdiYWNrZ3JvdW5kLWNvbG9yJzogaXRlbT8uQmFja2dyb3VuZENvbG9yIH1cIj5cbiAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94ICpuZ0lmPVwic2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgPT0gJ211bHRpJ1wiIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHVsbC1sZWZ0IGZsaXAgcm93LXNlbGVjdGlvblwiIFtuZ0NsYXNzXT1cInsgJ21kJzogdGFibGVWaWV3VHlwZSA9PT0gJ2NvbXBhY3QnIH1cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2V0aXNJdGVtRGlzYWJsZWQoaXRlbSlcIiBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogIWRldmljZUhhc01vdXNlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8uVUlEICsgU0VQQVJBVE9SICsgaXRlbT8uVHlwZSA9PT0gaG92ZXJlZEl0ZW1JZCB8fCBpc0FsbFNlbGVjdGVkIHx8IHNlbGVjdGVkSXRlbXMuc2l6ZSA+IDAgPyAndmlzaWJsZScgOiAnaGlkZGVuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfVwiIFtjaGVja2VkXT1cImdldElzSXRlbVNlbGVjdGVkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RJdGVtRm9yQWN0aW9ucygkZXZlbnQsIGl0ZW0/LlVJRCwgaXRlbT8uSXNTZWxlY3RhYmxlRm9yQWN0aW9ucywgaXRlbT8uVHlwZSlcIj5cbiAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiAqbmdJZj1cInNlbGVjdGlvblR5cGVGb3JBY3Rpb25zID09ICdzaW5nbGUnXCIgbmFtZT1cInNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHVsbC1sZWZ0IGZsaXAgcm93LXNlbGVjdGlvbiBwZXAtcmFkaW8tYnV0dG9uXCIgW25nQ2xhc3NdPVwieyAnbWQnOiB0YWJsZVZpZXdUeXBlID09PSAnY29tcGFjdCcgfVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnZXRpc0l0ZW1EaXNhYmxlZChpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cImdldElzSXRlbVNlbGVjdGVkKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3RJdGVtRm9yQWN0aW9ucygkZXZlbnQsIGl0ZW0/LlVJRCwgaXRlbT8uSXNTZWxlY3RhYmxlRm9yQWN0aW9ucywgaXRlbT8uVHlwZSlcIj5cbiAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgPHBlcC1mb3JtIFtsYXlvdXRUeXBlXT1cIid0YWJsZSdcIiBbY2hlY2tGb3JDaGFuZ2VzXT1cImNoZWNrRm9yQ2hhbmdlc1wiIFtsYXlvdXRdPVwibGF5b3V0XCJcbiAgICAgICAgICAgICAgICAgICAgW2ZpcnN0RmllbGRBc0xpbmtdPVwiZmlyc3RGaWVsZEFzTGlua1wiIFtkYXRhXT1cIml0ZW1cIiBbY2FuRWRpdE9iamVjdF09XCIhZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICBbbG9ja0V2ZW50c109XCJsb2NrSXRlbUlubmVyRXZlbnRzIHx8IHByaW50TW9kZVwiIFtpc1JlcG9ydF09XCJpc1JlcG9ydFwiIFtpc0FjdGl2ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbT8uVUlEICsgU0VQQVJBVE9SICsgaXRlbT8uVHlwZSA9PT0gc2VsZWN0ZWRJdGVtSWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy5VSUQgKyBTRVBBUkFUT1IgKyBpdGVtPy5UeXBlID09PSBob3ZlcmVkSXRlbUlkKSAmJiBkZXZpY2VIYXNNb3VzZVxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgKHZhbHVlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudClcIiAoZmllbGRDbGljayk9XCJvbkN1c3RvbWl6ZUZpZWxkQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpdGVtQ2xpY2tlZCgkZXZlbnQsIGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgPC9wZXAtZm9ybT5cbiAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RhYmxlXCI+XG4gICAgICAgIDxkaXYgKG1vdXNlZW50ZXIpPVwib25DYXJkTW91c2VFbnRlcigkZXZlbnQsIGl0ZW0/LlVJRCwgaXRlbT8uVHlwZSlcIlxuICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25DYXJkTW91c2VMZWF2ZSgkZXZlbnQsIGl0ZW0/LlVJRCwgaXRlbT8uVHlwZSlcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBnZXRJc0l0ZW1TZWxlY3RlZChpdGVtKSxcbiAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGl0ZW0/LlVJRCArIFNFUEFSQVRPUiArIGl0ZW0/LlR5cGUgPT09IHNlbGVjdGVkSXRlbUlkLFxuICAgICAgICAgICAgICAgICAgICAnbGluZS12aWV3Jzogdmlld1R5cGUgPT09ICdsaW5lcycsXG4gICAgICAgICAgICAgICAgICAgICdjYXJkLXZpZXcnOiB2aWV3VHlwZSA9PT0gJ2NhcmRzJyxcbiAgICAgICAgICAgICAgICAgICAgJ3NtYWxsLWNhcmQnOiBjYXJkU2l6ZSA9PT0gJ3NtJ1xuICAgICAgICAgICAgICAgIH1cIiBjbGFzcz1cInB1bGwtbGVmdCBmbGlwXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgaGVpZ2h0OiBjYWxjdWxhdGVkT2JqZWN0SGVpZ2h0LCB2aXNpYmlsaXR5OiAhbG9hZGluZ0l0ZW1zRnJvbUFwaSB8fCBpdGVtID8gJ3Zpc2libGUnIDogJ2hpZGRlbicgfVwiPlxuICAgICAgICAgICAgPG1hdC1jaGVja2JveCAqbmdJZj1cInNob3dDYXJkU2VsZWN0aW9uXCIgY2xhc3M9XCJwdWxsLWxlZnQgZmxpcCBjYXJkLXNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdldGlzSXRlbURpc2FibGVkKGl0ZW0pXCIgW2NoZWNrZWRdPVwiZ2V0SXNJdGVtU2VsZWN0ZWQoaXRlbSlcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2VsZWN0SXRlbUZvckFjdGlvbnMoJGV2ZW50LCBpdGVtPy5VSUQsIGl0ZW0/LklzU2VsZWN0YWJsZUZvckFjdGlvbnMsIGl0ZW0/LlR5cGUpXCI+XG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIDxwZXAtZm9ybSBbbGF5b3V0VHlwZV09XCInY2FyZCdcIiBbZmlyc3RGaWVsZEFzTGlua109XCJmaXJzdEZpZWxkQXNMaW5rXCIgW2NoZWNrRm9yQ2hhbmdlc109XCJjaGVja0ZvckNoYW5nZXNcIlxuICAgICAgICAgICAgICAgIFtsYXlvdXRdPVwibGF5b3V0XCIgW2RhdGFdPVwiaXRlbVwiIFtjYW5FZGl0T2JqZWN0XT1cIiFkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2xvY2tFdmVudHNdPVwibG9ja0l0ZW1Jbm5lckV2ZW50cyB8fCBwcmludE1vZGVcIiBbaXNBY3RpdmVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoaXRlbT8uVUlEICsgU0VQQVJBVE9SICsgaXRlbT8uVHlwZSA9PT0gc2VsZWN0ZWRJdGVtSWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LlVJRCArIFNFUEFSQVRPUiArIGl0ZW0/LlR5cGUgPT09IGhvdmVyZWRJdGVtSWQpICYmIGRldmljZUhhc01vdXNlXG4gICAgICAgICAgICAgICAgICAgIFwiICh2YWx1ZUNoYW5nZSk9XCJvblZhbHVlQ2hhbmdlZCgkZXZlbnQpXCIgKGZpZWxkQ2xpY2spPVwib25DdXN0b21pemVGaWVsZENsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpdGVtQ2xpY2tlZCgkZXZlbnQsIGl0ZW0pXCI+XG4gICAgICAgICAgICA8L3BlcC1mb3JtPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGFibGVIZWFkZXI+XG4gICAgPGRpdiAqbmdJZj1cImlzVGFibGVcIiBjbGFzcz1cInRhYmxlLWhlYWRlclwiIChtb3VzZXVwKT1cIm9uTGlzdFJlc2l6ZUVuZCgkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwib25MaXN0SGVhZGVyTW91c2VFbnRlcigkZXZlbnQpXCIgKG1vdXNlbGVhdmUpPVwib25MaXN0SGVhZGVyTW91c2VMZWF2ZSgkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlbW92ZSk9XCJvbkxpc3RSZXNpemUoJGV2ZW50KVwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXItcGFkZGluZy10b3BcIj48L2Rpdj5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwidGFibGUtaGVhZGVyLWZpZWxkc2V0XCI+XG4gICAgICAgICAgICA8bWF0LWNoZWNrYm94ICpuZ0lmPVwic2VsZWN0aW9uVHlwZUZvckFjdGlvbnMgIT09ICdub25lJ1wiICNzZWxlY3RBbGxDQiBjbGFzcz1cInB1bGwtbGVmdCBmbGlwIHJvdy1zZWxlY3Rpb25cIiBbbmdDbGFzc109XCJ7ICdtZCc6IHRhYmxlVmlld1R5cGUgPT09ICdjb21wYWN0JyB9XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIiBbbmdTdHlsZV09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblR5cGVGb3JBY3Rpb25zID09ICdzaW5nbGUnIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA9PSAnbXVsdGknICYmIGhpZGVBbGxTZWxlY3Rpb25Jbk11bHRpKSA/ICdoaWRkZW4nIDogJ3Zpc2libGUnXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cImlzQWxsU2VsZWN0ZWQgPyB1blNlbGVjdGVkSXRlbXMuc2l6ZSA+IDAgJiYgdW5TZWxlY3RlZEl0ZW1zLnNpemUgPCB0b3RhbFJvd3MgOiAoc2VsZWN0ZWRJdGVtcy5zaXplID4gMCAmJiAhZ2V0SXNBbGxTZWxlY3RlZEZvckFjdGlvbnMoKSlcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBzZWxlY3Rpb25UeXBlRm9yQWN0aW9ucyA9PT0gJ3NpbmdsZSdcIiBbY2hlY2tlZF09XCJnZXRJc0FsbFNlbGVjdGVkRm9yQWN0aW9ucygpXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNlbGVjdEFsbEl0ZW1zRm9yQWN0aW9ucygkZXZlbnQpXCI+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICA8ZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgbGF5b3V0Py5Db250cm9sRmllbGRzOyBsZXQgaiA9IGluZGV4XCIgY2xhc3M9XCJoZWFkZXItY29sdW1uIHB1bGwtbGVmdCBmbGlwXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogZmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgfVwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcGFjdC12aWV3JzogdGFibGVWaWV3VHlwZSA9PT0gJ2NvbXBhY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdXBwb3J0LXNvcnRpbmcnOiBzdXBwb3J0U29ydGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFzLXNvcnRpbmcnOiBmaWVsZC5BcGlOYW1lID09PSBzb3J0QnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLXJlc2l6aW5nJzogZmllbGQuQXBpTmFtZSA9PT0gcHJlc3NlZENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtZmlyc3QnOiBqID09PSAwICYmIHNlbGVjdGlvblR5cGVGb3JBY3Rpb25zICE9PSAnbXVsdGknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1sYXN0JzogaiA9PT0gbGF5b3V0Py5Db250cm9sRmllbGRzPy5sZW5ndGggLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInN1cHBvcnRTb3J0aW5nID8gKG9uTGlzdFNvcnRpbmdDaGFuZ2UoZmllbGQuQXBpTmFtZSwgc29ydEJ5ICE9PSBudWxsICYmIHNvcnRCeSAhPSBmaWVsZC5BcGlOYW1lID8gdHJ1ZSA6ICFpc0FzYywgJGV2ZW50KSkgOiBmYWxzZVwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBpZD1cInt7IGZpZWxkLkFwaU5hbWUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItbGFiZWwgYm9keS1zbSBwdWxsLWxlZnQgZmxpcCB0ZXh0LWFsaWduLXt7IGZpZWxkLkxheW91dC5YQWxpZ25tZW50IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgZmllbGQuVGl0bGUgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmllbGQuTWFuZGF0b3J5XCIgY2xhc3M9XCJtYW5kYXRvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGVwLWljb24gbmFtZT1cInN5c3RlbV9tdXN0XCI+PC9wZXAtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLlRpdGxlICE9ICcnID8gZmllbGQuVGl0bGUgOiAnICd9fVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdXBwb3J0UmVzaXppbmdcIiBjbGFzcz1cInJlc2l6ZS1ib3ggcHVsbC1yaWdodCBmbGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25MaXN0UmVzaXplU3RhcnQoJGV2ZW50LCBmaWVsZC5BcGlOYW1lLCBqKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwbGl0dGVyXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdXBwb3J0U29ydGluZ1wiIGNsYXNzPVwic29ydGluZy1ib3ggcHVsbC1sZWZ0IGZsaXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaGFzLXNvcnRpbmcnOiBmaWVsZC5BcGlOYW1lID09PSBzb3J0QnkgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZmllbGQuQXBpTmFtZSAhPT0gc29ydEJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBlcC1pY29uIG5hbWU9XCJhcnJvd19laXRoZXJcIiBjbGFzcz1cImFzY1wiPjwvcGVwLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkLkFwaU5hbWUgPT09IHNvcnRCeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFpc0FzY1wiIFtuZ0NsYXNzXT1cInsgJ3NvcnQtYnknOiBmaWVsZC5BcGlOYW1lID09PSBzb3J0QnkgJiYgaXNBc2MgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0xJU1QuU09SVF9BU0MnIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwZXAtaWNvbiBuYW1lPVwiYXJyb3dfdXBcIiBjbGFzcz1cImFzY1wiPjwvcGVwLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJpc0FzY1wiIFtuZ0NsYXNzXT1cInsgJ3NvcnQtYnknOiBmaWVsZC5BcGlOYW1lID09PSBzb3J0QnkgJiYgIWlzQXNjIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdMSVNULlNPUlRfREVTQycgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBlcC1pY29uIG5hbWU9XCJhcnJvd19kb3duXCIgY2xhc3M9XCJkZXNjXCI+PC9wZXAtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjdGFibGVUb3RhbD5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNUYWJsZSAmJiB0b3RhbHNSb3c/Lmxlbmd0aCA+IDAgJiYgdG90YWxzUm93Lmxlbmd0aCA8PSBsYXlvdXQ/LkNvbnRyb2xGaWVsZHMubGVuZ3RoXCJcbiAgICAgICAgY2xhc3M9XCJ0YWJsZS10b3RhbFwiPlxuICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJ0YWJsZS1oZWFkZXItZmllbGRzZXRcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpZWxkIG9mIGxheW91dD8uQ29udHJvbEZpZWxkczsgbGV0IGogPSBpbmRleFwiIGNsYXNzPVwidG90YWwtY29sdW1uIHB1bGwtbGVmdCBmbGlwXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiBmaWVsZC5jYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZyB9XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG90YWwtbGFiZWwgYm9keS1zbSB0ZXh0LWFsaWduLXt7IGZpZWxkLkxheW91dC5YQWxpZ25tZW50IH19XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRvdGFsc1Jvd1tqXSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19
|