@microsoft/windows-admin-center-sdk 2.523.1 → 2.538.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js +88 -41
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.js.map +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js +1 -1
- package/angular/bundles/microsoft-windows-admin-center-sdk-angular.umd.min.js.map +1 -1
- package/angular/esm2015/src/controls/data-table/data-table.component.js +6 -2
- package/angular/esm2015/src/controls/dialog/dialog.component.js +11 -11
- package/angular/esm2015/src/controls/dialog/extension-dialog/extension-dialog.component.js +7 -7
- package/angular/esm2015/src/controls/header/header.component.js +52 -14
- package/angular/esm2015/src/controls/layout/layout-config.js +1 -2
- package/angular/esm2015/src/controls/query-editor/query-editor.component.js +4 -4
- package/angular/esm2015/src/controls/snap-in-extension/snap-in-extension.component.js +1 -1
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js +75 -34
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.js.map +1 -1
- package/angular/src/controls/header/header.component.d.ts +14 -1
- package/angular/src/controls/query-editor/query-editor.component.d.ts +1 -1
- package/core/data/active-directory/active-directory.js +2 -2
- package/core/data/active-directory/active-directory.js.map +1 -1
- package/core/data/powershell.d.ts +2 -2
- package/core/data/powershell.js +2 -2
- package/core/data/powershell.js.map +1 -1
- package/core/notification/notification-manager.d.ts +18 -0
- package/core/notification/notification-manager.js +55 -10
- package/core/notification/notification-manager.js.map +1 -1
- package/core/notification/notification-message.d.ts +41 -0
- package/core/notification/notification-message.js +3 -0
- package/core/notification/notification-message.js.map +1 -0
- package/core/notification/notification.d.ts +10 -1
- package/core/notification/notification.js +30 -33
- package/core/notification/notification.js.map +1 -1
- package/core/notification/powershell-notification.d.ts +15 -15
- package/core/notification/powershell-notification.js +19 -8
- package/core/notification/powershell-notification.js.map +1 -1
- package/core/notification/socket-signalr.d.ts +8 -14
- package/core/notification/socket-signalr.js +18 -19
- package/core/notification/socket-signalr.js.map +1 -1
- package/core/notification/work-item-manager.d.ts +4 -0
- package/core/notification/work-item-manager.js +76 -20
- package/core/notification/work-item-manager.js.map +1 -1
- package/e2e/assets/strings/cs-CZ/strings.json +1 -1
- package/e2e/assets/strings/de-DE/strings.json +1 -1
- package/e2e/assets/strings/es-ES/strings.json +1 -1
- package/e2e/assets/strings/fr-FR/strings.json +1 -1
- package/e2e/assets/strings/hu-HU/strings.json +1 -1
- package/e2e/assets/strings/id-ID/strings.json +1 -1
- package/e2e/assets/strings/it-IT/strings.json +1 -1
- package/e2e/assets/strings/ja-JP/strings.json +1 -1
- package/e2e/assets/strings/ko-KR/strings.json +1 -1
- package/e2e/assets/strings/nl-NL/strings.json +1 -1
- package/e2e/assets/strings/pl-PL/strings.json +1 -1
- package/e2e/assets/strings/pt-BR/strings.json +1 -1
- package/e2e/assets/strings/pt-PT/strings.json +1 -1
- package/e2e/assets/strings/ru-RU/strings.json +1 -1
- package/e2e/assets/strings/strings.json +1 -1
- package/e2e/assets/strings/sv-SE/strings.json +1 -1
- package/e2e/assets/strings/tr-TR/strings.json +1 -1
- package/e2e/assets/strings/zh-CN/strings.json +1 -1
- package/e2e/assets/strings/zh-TW/strings.json +1 -1
- package/package.json +3 -6
- package/styles/css/main-v2.css +1 -1
- package/tools/test-runner/index.js +12 -2
- package/tools/test-runner/index.js.map +1 -1
- package/tools/wac-cli/templates/internal/package.json +0 -4
- package/tools/wac-cli/templates/library/angular.json +0 -3
- package/tools/wac-cli/templates/library/tsconfig.lib.json +1 -1
- package/tools/wac-cli/templates/wac-template/angular.json +0 -3
- package/tools/wac-cli/templates/wac-template/package.json +0 -4
- package/tools/wac-cli/templates/wac-template/tsconfig.base.json +23 -24
|
@@ -4822,6 +4822,7 @@ export class DataTableComponent extends CoreBaseComponent {
|
|
|
4822
4822
|
});
|
|
4823
4823
|
}
|
|
4824
4824
|
onElementFocusing(event) {
|
|
4825
|
+
var _a;
|
|
4825
4826
|
if (event.targetZone === this.contentElement.nativeElement) {
|
|
4826
4827
|
if (!this.contentAreaHasFocus) {
|
|
4827
4828
|
event.preventDefaultFocusBehavior();
|
|
@@ -4834,7 +4835,10 @@ export class DataTableComponent extends CoreBaseComponent {
|
|
|
4834
4835
|
else if (event.targetElement && event.targetElement.hasAttribute('data-sme-last-focusable-shadow-element')
|
|
4835
4836
|
&& event.targetElement === this.lastFocusableShadowElement.nativeElement) {
|
|
4836
4837
|
event.preventDefaultFocusBehavior();
|
|
4837
|
-
|
|
4838
|
+
// The third condition is added to fix keyboard focus being trapped in the data table
|
|
4839
|
+
// when the last focusable element doesn't meet the first 2 conditions (ex: the last focusable element is a link).
|
|
4840
|
+
if (event.sourceZone === this.contentElement.nativeElement || event.sourceZone === this.headerElement.nativeElement ||
|
|
4841
|
+
((_a = (event.targetElement.attributes.getNamedItem('tabindex'))) === null || _a === void 0 ? void 0 : _a.value) >= '0') {
|
|
4838
4842
|
const nextFocusableElement = Dom.getNextZoneElement(event.targetElement);
|
|
4839
4843
|
if (!nextFocusableElement) {
|
|
4840
4844
|
event.targetElement.focus();
|
|
@@ -5570,4 +5574,4 @@ export class TreeTableComponent extends DataTableComponent {
|
|
|
5570
5574
|
templateUrl: './data-table.component.html'
|
|
5571
5575
|
}]
|
|
5572
5576
|
}], function () { return [{ type: i0.Injector }]; }, null); })();
|
|
5573
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBR0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFDeEcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDBFQUEwRSxDQUFDO0FBQ2pHLE9BQU8sRUFBd0IsT0FBTyxFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDcEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUMxRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdkYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3RFLE9BQU8sRUFBVSxtQkFBbUIsRUFBRSxNQUFN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QUFrQjtRQUFsQiwyQ0FBa0I7UUE0QjlDLGVBQTJEO1FBQTNELDBFQUEyRCx3Q0FBQSx3Q0FBQSwwQ0FBQSxzQ0FBQSw2RkFBQSxvQ0FBQTtRQU16RCxlQUF1RztRQUF2Ryx3RkFBdUc7UUFHcEcsZUFBNEI7UUFBNUIsaURBQTRCO1FBUTNCLGVBQTBDO1FBQTFDLG1GQUEwQztRQUFDLG1DQUF5QjtRQUV0QyxlQUErQjtRQUEvQix3REFBK0I7UUFpRlAsZUFBd0Q7UUFBeEQscUVBQXdEO1FBQzlHLDhFQUFxQztRQUNQLGVBQW9DO1FBQXBDLDZEQUFvQztRQTRKaEUsZUFBeUM7UUFBekMsOERBQXlDO1FBSTlDLGVBQThFO1FBQTlFLCtGQUE4RTs7dUZEMjdIdEUsa0JBQWtCO2NBSjlCLFNBQVM7ZUFBQztnQkFDUCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixXQUFXLEVBQUUsNkJBQTZCO2FBQzdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyVmlld0NoZWNrZWQsXHJcbiAgICBBZnRlclZpZXdJbml0LFxyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBDb250ZW50Q2hpbGQsXHJcbiAgICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5qZWN0b3IsXHJcbiAgICBJbnB1dCxcclxuICAgIE5nWm9uZSxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE91dHB1dCxcclxuICAgIFF1ZXJ5TGlzdCxcclxuICAgIFRlbXBsYXRlUmVmLFxyXG4gICAgVmlld0NoaWxkLFxyXG4gICAgVmlld0NoaWxkcmVuXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERlYm91bmNlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9iYXNlL2RlY29yYXRvcnMvZGVib3VuY2UuZGVjb3JhdG9ycyc7XHJcbmltcG9ydCB7IFlpZWxkIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9iYXNlL2RlY29yYXRvcnMveWllbGQuZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgRWxlbWVudEZvY3VzaW5nRXZlbnQsIEtleUNvZGUgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RhdGEvYWNjZXNzaWJpbGl0eS1tYW5hZ2VyJztcclxuaW1wb3J0IHsgQ29yZUVudmlyb25tZW50IH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2NvcmUtZW52aXJvbm1lbnQnO1xyXG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGlhZ25vc3RpY3MvbG9nLWxldmVsJztcclxuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGlhZ25vc3RpY3MvbG9nZ2luZyc7XHJcbmltcG9ydCB7IERvbSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZG9tL2RvbSc7XHJcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb3JlQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNtZUluamVjdCB9IGZyb20gJy4uL2NvbW1vbi9kZWNvcmF0b3JzL2luamVjdGlvbi5kZWNvcmF0b3JzJztcclxuaW1wb3J0IHsgTGF5b3V0LCBTTUVfTEFZT1VUX1BST1ZJREVSIH0gZnJvbSAnLi4vY29tbW9uL2xheW91dCc7XHJcbmltcG9ydCB7IEZvcm1GaWVsZENvbnRhaW5lciB9IGZyb20gJy4uL2Zvcm0vZm9ybS1maWVsZC9mb3JtLWZpZWxkLWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IFNlYXJjaEZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vZm9ybS1maWVsZC9zZWFyY2gvc2VhcmNoLWZvcm0tZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUXVlcnlEYXRhLCBRdWVyeURhdGFJdGVtLCBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLCBRdWVyeURhdGFPcGVyYW5kIH0gZnJvbSAnLi4vcXVlcnktZWRpdG9yL3F1ZXJ5LWVkaXRvci1jb250cmFjdCc7XHJcbmltcG9ydCB7IERhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWFjY2Vzc2liaWxpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW4uY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICAgIERhdGFUYWJsZUN1c3RvbVNvcnRFdmVudCxcclxuICAgIERhdGFUYWJsZURhdGFJdGVtLFxyXG4gICAgRGF0YVRhYmxlTGF6eUxvYWRFdmVudCxcclxuICAgIERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZSxcclxuICAgIERhdGFUYWJsZVJlbmRlcmVkSXRlbSxcclxuICAgIERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUsXHJcbiAgICBEYXRhVGFibGVTb3J0TW9kZSxcclxuICAgIEVkaXRhYmxlRGF0YUNoYW5nZVNldCxcclxuICAgIEVkaXRhYmxlRGF0YUl0ZW0sXHJcbiAgICBOb2RlTmF2aWdhdGluZ1Rhc2ssXHJcbiAgICBUcmVlTm9kZURhdGFJdGVtXHJcbn0gZnJvbSAnLi9kYXRhLXRhYmxlLWNvbnRyYWN0JztcclxuaW1wb3J0IHsgRGF0YVRhYmxlUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIgfSBmcm9tICcuL2RhdGEtdGFibGUtcmVzcG9uc2l2ZS13aW5kb3ctbWFuYWdlcic7XHJcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQeENvbnZlcnRlciB9IGZyb20gJy4vaGVscGVycy9weC1jb252ZXJ0ZXInO1xyXG5cclxuLyoqXHJcbiAqIERhdGEgdGFibGUgY29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWRhdGEtdGFibGUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVDb21wb25lbnQgZXh0ZW5kcyBDb3JlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95IHtcclxuICAgIHByaXZhdGUgc3RhdGljIHNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbiA9ICdtdWx0aXBsZSc7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBtaW5Db2x1bW5XaWR0aCA9IDUwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcHhDb252ZXJ0ZXIgPSBuZXcgUHhDb252ZXJ0ZXIoKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnRGF0YVRhYmxlQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzQ29tcG9uZW50SW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgZWRpdGFibGVEYXRhQ2hhbmdlU2V0OiBFZGl0YWJsZURhdGFDaGFuZ2VTZXQgPSB7XHJcbiAgICAgICAgYWRkZWRJdGVtczogW10sXHJcbiAgICAgICAgdXBkYXRlZEl0ZW1zOiBbXSxcclxuICAgICAgICBkZWxldGVkSXRlbXM6IFtdXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgZGVmYXVsdFNjcm9sbFBpeGVscyA9IDkwO1xyXG4gICAgcHJpdmF0ZSBkZWZhdWx0U2Nyb2xsUGVyY2VudGFnZSA9IDAuNDtcclxuICAgIHByaXZhdGUgbWF4QWN0dWFsU2Nyb2xsRGF0YUVsZW1lbnRIZWlnaHQgPSA1MDAwMDA7XHJcbiAgICBwcml2YXRlIGZpbHRlckRlYm91bmNlVGltZW91dCA9IDMwMDtcclxuICAgIHByaXZhdGUga2V5Ym9hcmROYXZpZ2F0aW9uRGVib3VuY2VUaW1lb3V0ID0gMTAwO1xyXG4gICAgcHJpdmF0ZSBzY3JvbGxDaGVja0ludGVydmFsRHVyYXRpb24gPSAzMDA7XHJcbiAgICBwcml2YXRlIHNjcm9sbENoZWNrSW50ZXJ2YWw7XHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgYnVmZmVyUm93UmF0ZSA9IDE7XHJcbiAgICBwcml2YXRlIGV2ZW50VW5yZWdpc3RyYXRlckhhbmRsZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBzb3J0Q29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ7XHJcbiAgICBwcml2YXRlIHByZXZpb3VzU29ydENvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50O1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEl0ZW1zOiBEYXRhVGFibGVEYXRhSXRlbVtdO1xyXG4gICAgcHJpdmF0ZSBhY3R1YWxJdGVtczogRGF0YVRhYmxlRGF0YUl0ZW1bXTtcclxuICAgIHByaXZhdGUgY2FsY3VsYXRlZFNjcm9sbGJhcldpZHRoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGN1cnJlbnRIYXNWZXJ0aWNhbE92ZXJmbG93OiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBmaWx0ZXJEZWJvdW5jZVRpbWVyO1xyXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzU2VsZWN0ZWRSb3dUaW1lcjtcclxuICAgIHByaXZhdGUgb2xkRmlsdGVyS2V5d29yZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBmaWx0ZXJLZXl3b3JkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGludGVybmFsR2xvYmFsRmlsdGVyOiBhbnk7XHJcbiAgICBwcml2YXRlIHNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgaXNTY3JvbGxpbmc6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGlzU2Nyb2xsaW5nRXZlbnRIYW5kbGVyU2V0dXA6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRpc3BsYXlJdGVtc1RvcDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFJlbmRlcmVkSXRlbXM6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdID0gW107XHJcbiAgICBwcml2YXRlIGludGVybmFsU2VsZWN0aW9uOiBEYXRhVGFibGVEYXRhSXRlbVtdID0gW107XHJcbiAgICBwcml2YXRlIGhhc0xvbmdMaXN0OiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50U3RhcnRJbmRleE9mSXRlbUluVmlld1BvcnQgPSAtMTtcclxuICAgIHByaXZhdGUgZGF0YVNjcm9sbFRvcDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50UmVuZGVyZWRJdGVtSW5WaWV3UG9ydDogRGF0YVRhYmxlUmVuZGVyZWRJdGVtO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEdyb3VwQ29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ7XHJcbiAgICBwcml2YXRlIGludGVybmFsR3JvdXBTb3J0TW9kZSA9IERhdGFUYWJsZVNvcnRNb2RlLk5vbmU7XHJcbiAgICBwcml2YXRlIGludGVybmFsU2VsZWN0aW9uTW9kZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBzaGFkb3dUcmVlOiBhbnk7IC8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBtYWludGFpbiB0aGUgdHJlZSB0byBoZWxwIGRvIHRoZSBcInNhbWUgbGV2ZWwgb25seVwiIHNvcnQuXHJcbiAgICBwcml2YXRlIGFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICBwcml2YXRlIHByZXZpb3VzQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggPSAtMTtcclxuICAgIHByaXZhdGUgYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCA9IC0xO1xyXG4gICAgcHJpdmF0ZSBob3ZlcmVkUmVuZGVyZWRJdGVtSW5kZXggPSAtMTtcclxuICAgIHByaXZhdGUgcmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSByZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0ID0gMDtcclxuICAgIHByaXZhdGUgY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gLTE7XHJcbiAgICBwcml2YXRlIHVucmVnaXN0ZXJPbkVsZW1lbnRGb2N1c2luZ0V2ZW50SGFuZGxlcjogKCkgPT4gdm9pZDtcclxuICAgIHByaXZhdGUgY29udGVudEFyZWFIYXNGb2N1cyA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBlZGl0YWJsZU5ld1Jvd0hhc0ZvY3VzID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGNhbmNlbExhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Rm9jdXNPbmNlID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGxheW91dENoYW5nZVN1YnNjcmliZXI7XHJcbiAgICBwcml2YXRlIGdsb2JhbEZpbHRlclN1YnNjcmliZXI7XHJcbiAgICBwcml2YXRlIGdyb3VwS2V5czogeyBba2V5OiBzdHJpbmddOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXSB9ID0ge307XHJcbiAgICBwcml2YXRlIGludGVybmFsQ29sdW1uczogUXVlcnlMaXN0PERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudD47XHJcbiAgICBwcml2YXRlIHRyZWVUb2dnbGVTdGF0dXM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgICBwcml2YXRlIHNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gLTE7XHJcbiAgICBwcml2YXRlIGludGVybmFsUXVlcnlFZGl0b3I6IFF1ZXJ5RGF0YTtcclxuICAgIHByaXZhdGUgYWN0dWFsQ29sdW1uUHJvY2Vzc2VkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIHRyeVRvRm9jdXNFbXB0eU1lc3NhZ2VDb3VudCA9IDM7XHJcbiAgICBwcml2YXRlIGFjY2VzaWJpbGl0eU1hbmFnZXIgPSBDb3JlRW52aXJvbm1lbnQuYWNjZXNzaWJpbGl0eU1hbmFnZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFRhYmxlQXJpYUxhYmVsbGVkQnk6IHN0cmluZztcclxuICAgIHB1YmxpYyBpbnRlcm5hbFRhYmxlQXJpYUxhYmVsOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIHNjcm9sbERhdGFTdHlsZVRvcDogc3RyaW5nO1xyXG4gICAgcHVibGljIHNjcm9sbEFib3ZlRGF0YVN0eWxlVG9wOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBkYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlciA9IG5ldyBEYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlcigpO1xyXG4gICAgcHVibGljIERhdGFUYWJsZVJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyOiBEYXRhVGFibGVSZXNwb25zaXZlV2luZG93TWFuYWdlcjtcclxuICAgIHB1YmxpYyBjb2x1bW5Tb3J0U2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdyZXNpemVySW5kaWNhdG9yJylcclxuICAgIHByaXZhdGUgcmVzaXplckluZGljYXRvcjogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdoZWFkZXInKVxyXG4gICAgcHJpdmF0ZSBoZWFkZXJFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlclRhYmxlJylcclxuICAgIHByaXZhdGUgaGVhZGVyVGFibGVFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRlbnQnKVxyXG4gICAgcHJpdmF0ZSBjb250ZW50RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gICAgcHJpdmF0ZSBzY3JvbGxDb250YWluZXJFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3RlbXBSb3cnKVxyXG4gICAgcHJpdmF0ZSB0ZW1wUm93RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxCb2R5JywgeyBzdGF0aWM6IHRydWUgfSlcclxuICAgIHByaXZhdGUgc2Nyb2xsQm9keUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsQWJvdmVEYXRhJylcclxuICAgIHByaXZhdGUgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxEYXRhJylcclxuICAgIHByaXZhdGUgc2Nyb2xsRGF0YUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnZW1wdHlNZXNzYWdlJylcclxuICAgIHByaXZhdGUgZW1wdHlNZXNzYWdlRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdsYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudCcpXHJcbiAgICBwcml2YXRlIGxhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGQoJ2dyb3VwJylcclxuICAgIHB1YmxpYyBncm91cEhlYWRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdjaGFuZ2VzZXRVcGRhdGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvbkNoYW5nZXNldFVwZGF0ZWQoKTogRXZlbnRFbWl0dGVyPEVkaXRhYmxlRGF0YUNoYW5nZVNldD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZXNldFVwZGF0ZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZXNldFVwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEVkaXRhYmxlRGF0YUNoYW5nZVNldD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGVtaXRzIHRoZSBldmVudCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2luZyBpcyBoYXBwZW5pbmcuXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlRGF0YUl0ZW0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBlbWl0cyB0cnVlIHdoZW4gdGFibGUgaXMgcmVuZGVyZWQgd2l0aCBtaW4taGVpZ2h0IG9uIHBob25lIGRvd25cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBpc1RhYmxlUmVuZGVyZWRXaXRoTWluSGVpZ2h0UGhvbmVEb3duOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ3Jvd0RibGNsaWNrJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvblJvd0RibGNsaWNrKCk6IEV2ZW50RW1pdHRlcjx7IGRhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dEYmxjbGljaztcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgcm93RGJsY2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAnZ3JvdXBUb2dnbGVDbGljaycgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25Hcm91cFRvZ2dsZUNsaWNrZWQoKTogRXZlbnRFbWl0dGVyPHsgZ3JvdXBEYXRhOiBEYXRhVGFibGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBUb2dnbGVDbGljaztcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ3JvdXBUb2dnbGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBncm91cERhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ2VkaXRhYmxlUm93QWRkZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uTmV3RWRpdGFibGVSb3dBZGRlZCgpOiBFdmVudEVtaXR0ZXI8eyBkYXRhOiBhbnksIG92ZXJyaWRlTmV3RGF0YUhhbmRsZXI6IChkYXRhOiBhbnkpID0+IHZvaWQgfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRhYmxlUm93QWRkZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGVkaXRhYmxlUm93QWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZGF0YTogYW55LCBvdmVycmlkZU5ld0RhdGFIYW5kbGVyOiAoZGF0YTogYW55KSA9PiB2b2lkIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGNvbHVtbnMgcmVuZGVyZWQgb24gdGhlIFVJLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogUXVlcnlMaXN0PERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsQ29sdW1ucztcclxuICAgIH1cclxuXHJcbiAgICBAQ29udGVudENoaWxkcmVuKERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudClcclxuICAgIHB1YmxpYyBzZXQgY29sdW1ucyh2YWx1ZTogUXVlcnlMaXN0PERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudD4pIHtcclxuICAgICAgICB0aGlzLmludGVybmFsQ29sdW1ucyA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBAVmlld0NoaWxkcmVuKERhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50KVxyXG4gICAgcHJpdmF0ZSBkYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudHM6IFF1ZXJ5TGlzdDxEYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudD47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGFjdHVhbCBjb2x1bW5zIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGFibGUuXHJcbiAgICAgKiBJbiBncm91cGluZyBkYXRhIHRhYmxlIHNjZW5hcmlvLCB0aGUgYWN0dWFsIGNvbHVtbnMgZG9lc24ndCBjb250YWluIHRoZSBncm91cGluZyBjb2x1bW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3R1YWxDb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnRbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgaXRlbSByZW5kZXJlZCBvbiB0aGUgVUkgKGluY2x1ZGluZyB0aGUgaXRlbXMgaW4gYW5kIG91dHNpZGUgb2YgdmlldyBwb3J0KS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCByZW5kZXJlZEl0ZW1zKCk6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFJlbmRlcmVkSXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCByZW5kZXJlZEl0ZW1zKHZhbHVlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXSkge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxSZW5kZXJlZEl0ZW1zID0gdmFsdWUgfHwgW107XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zQ2hhbmdlLmVtaXQoKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1yb3djb3VudCcsIHZhbHVlLmxlbmd0aCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZpbHRlcmVkSXRlbXM6IERhdGFUYWJsZURhdGFJdGVtW10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyByZW5kZXJlZCBpdGVtcyBhcmUgY2hhbmdlZC5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgcmVuZGVyZWRJdGVtc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgYmFja2dyb3VuZCBidXN5IHRhc2tzLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGlzQnVzeTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgcmlnaHQgY2xpY2sgc2VsZWN0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZW5hYmxlUmlnaHRDbGlja1NlbGVjdCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBtZXNzYWdlIHNob3dpbmcgd2hlbiB0aGUgZGF0YSBpcyBsb2FkaW5nLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxvYWRpbmdNZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIG1lc3NhZ2Ugc2hvd2luZyB3aGVuIHRoZSBkYXRhIGxvYWRpbmcgaXMgZmluaXNoZWQgYnV0IHRoZSBkYXRhIGlzIGVtcHR5IG9yIG5vIGRhdGEgZ290IHJlbmRlcmVkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIG5vUmVjb3JkTWVzc2FnZTogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZWRpdGFibGU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBleHBhbmQgdHJlZSBub2RlIG9uIHJvb3Qgbm9kZSBjaGVja2VkLiBUaGlzIHBhcmFtZXRlciBjYW4gb25seSBiZSB1c2VkIGZvciB0cmVlIHRhYmxlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGV4cGFuZFRyZWVOb2RlT25DaGVja2VkID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIGFsbCBlZGl0YWJsZSByb3dzIGluIGFuIGVkaXRhYmxlIHRhYmxlIHNob3VsZCBiZSB2aXNpYmxlIChyZWdhcmRsZXNzIG9mIGhvdmVyL3NlbGVjdGVkIHN0YXRlKS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBpc0FsbEVkaXRhYmxlUm93c1Zpc2libGU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEl0IGluZGljYXRlcyB0aGF0IGEgc2Nyb2xsYmFyIGNhbiBiZSB1c2VkIHdoZW4gdGhlIGV4cGVjdGVkIG51bWJlciBvZiBjb2x1bW5zIGlzIGh1Z2VcclxuICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNjcm9sbGFibGVIb3Jpem9udGFsID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhhdCBhIGRhdGEgbGF6eSBsb2FkaW5nIG5lZWRzIHRvIGhhcHBlbiBhbmQgcmVxdWlyZSB0aGUgY29uc3VtZXIgdG8gcHJvdmlkZSBkYXRhIGZvciB0aGUgbGF6eSBsb2FkaW5nIHBhcnQuXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGxhenlMb2FkaW5nRGF0YTogRXZlbnRFbWl0dGVyPERhdGFUYWJsZUxhenlMb2FkRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVMYXp5TG9hZEV2ZW50PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgdHJpZ2dlcnMgd2hlbiBhIHRyZWUgbm9kZSBpcyBleHBhbmRlZC5cclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAnbm9kZUV4cGFuZGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvbk5vZGVFeHBhbmQoKTogRXZlbnRFbWl0dGVyPHsgbm9kZTogVHJlZU5vZGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZUV4cGFuZGVkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBub2RlRXhwYW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbm9kZTogVHJlZU5vZGVEYXRhSXRlbSB9PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgdHJpZ2dlcnMgd2hlbiBhIHRyZWUgbm9kZSBpcyBjb2xsYXBzZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ25vZGVDb2xsYXBzZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uTm9kZUNvbGxhcHNlZCgpOiBFdmVudEVtaXR0ZXI8eyBub2RlOiBUcmVlTm9kZURhdGFJdGVtIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub2RlQ29sbGFwc2VkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBub2RlQ29sbGFwc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx7IG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHRyaWdnZXJzIHdoZW4gYSB0cmVlIG5vZGUgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ25vZGVTZWxlY3RlZCcgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25Ob2RlU2VsZWN0KCk6IEV2ZW50RW1pdHRlcjx7IG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0gfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVTZWxlY3RlZDtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgbm9kZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgZGF0YSBpcyBsb2FkZWQgaW4gbGF6eSBsb2FkaW5nIHdheS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBsYXp5TG9hZDogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHJlbWVtYmVyIHRoZSB0cmVlIHRvZ2dsZSBzdGF0dXMuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgcmVtZW1iZXJUcmVlTm9kZVRvZ2dsZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHJlbWVtYmVyIHRoZSBzZWxlY3Rpb24gdGhlbiBhZnRlciB0aGUgd2hvbGUgZGF0YSBzb3VyY2UgaXMgcmVmcmVzaGVkIHRoZSBzZWxlY3Rpb24gd2lsbCBzdGlsbCBiZSB0aGVyZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyByZW1lbWJlclNlbGVjdGlvbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxseSB0aGUgZW50ZXIga2V5IG9uIGEgcm93IHJlZGlyZWN0cyB0byB0aGUgZG91YmxlIGNsaWNrIGJlaGF2aW9yIG9mIHRoZSByb3cuXHJcbiAgICAgKiBJZiB0aGlzIGZsYWcgaXMgdHJ1ZSwgdGhlbiBkYXRhIHRhYmxlIHdvdWxkIGRvIG5vdGhpbmcgZm9yIGVudGVyIGtleSBvbiBhIHJvdy5cclxuICAgICAqIFRoZW4geW91IG5lZWQgdG8gaW1wbGVtZW50IHRoZSBlbnRlciBrZXkgYWN0aW9uIGJ5IHlvdXIgc2VsZi5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBwcmV2ZW50RW50ZXJLZXlGb3JEZWZhdWx0QWN0aW9uOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgcG9pbnRzIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhbiB1bmlxdWUgaWRlbnRpdHkgc3RyaW5nIGZvciBhbnkgZGF0YSBpdGVtLlxyXG4gICAgICogU29tZSBzY2VuYXJpb3MgbGlrZSB0cmVlIHRhYmxlIHdvdWxkIG5lZWQgdGhpcyBmdW5jdGlvbiB0byByZW1lbWJlciB0b2dnbGUgc3RhdHVzIGZvciBhbnkgdHJlZSBub2RlIGJ5IHRoZSBpZGVudGl0eS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXRJdGVtSWRlbnRpdHlGdW5jdGlvbjogKGRhdGE6IGFueSkgPT4gc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnkgZGVmYXVsdCBuYXR1cmFsIHNvcnQgaXMgdHVybmVkIG9uLlxyXG4gICAgICogQnV0IGZvciBwZXJmb3JtYW5jZSBjb25jZXJuLCB5b3UgbWF5IHdhbnQgdG8gZGlzYWJsZSBuYXR1cmFsIHNvcnQgYW5kIGp1c3QgZG8gdmVyeSBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb24uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGlzYWJsZU5hdHVyYWxTb3J0ID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEb24ndCBlbmFibGUgZGVmYXVsdCB0b29sdGlwcyBhbGwgb3ZlciBXQUMgYnkgZGVmYXVsdC5cclxuICAgICAqIFRPRE86IEludmVzdGlnYXRlIGVhY2ggY2FzZSBvZiBkYXRhIHRhYmxlIHVzYWdlIGFuZCBzZWUgaWYgY2FuIHVwZGF0ZSBhcyBuZWVkZWQgdG8gYWxsb3cgdGhpcyB0byBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuXHJcbiAgICAgKiBFbmFibGluZyBieSBkZWZhdWx0IHByZS1HQSBpcyByaXNreSBhbmQgbWF5IGludHJvZHVjZSByZWdyZXNzaW9ucyB0aG91Z2guXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZW5hYmxlRGVmYXVsdFRvb2x0aXBzID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGl0ZW1zIHJlbmRlcmVkIGFib3ZlIHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXJlZEl0ZW1zQWJvdmVWaWV3UG9ydDogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGl0ZW1zIHJlbmRlcmVkIGluIGFuZCBiZWxvdyB0aGUgdmlldyBwb3J0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVuZGVyZWRJdGVtc0luQW5kQmVsb3dWaWV3UG9ydDogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0YWJsZSBpcyBzY3JvbGxlZCBkb3duLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNTY3JvbGxlZERvd246IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0YWJsZSBzaG91bGQgaGFuZGxlIHNjcm9sbGluZyBmb3IgY29udGVudC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNob3VsZFNjcm9sbDogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBsYXN0IGZvY3VzYWJsZSBzaGFkb3cgZWxlbWVudCBzaG91bGQgYmUgdXNlZC5cclxuICAgICAqIE5vcm1hbGx5IHdoZW4gdGhlIGRhdGEgdGFibGUgaXMgdGhlIGxhc3QgZm9jdXNhYmxlIGVsZW1lbnQsXHJcbiAgICAgKiB0aGUgbGFzdCBmb2N1c2FibGUgZWxlbWVudCBuZWVkIHRvIGJlIHVzZWQgdG8gaGFuZGxlIGZvY3VzIG1vdmVtZW50LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvdWxkVXNlTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnQ6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBzY3JvbGwgdG8gc2VsZWN0aW9uIGFmdGVyIHNvcnRpbmcuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvdWxkU2Nyb2xsVG9TZWxlY3Rpb25BZnRlclNvcnRpbmc6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIGFuZCBzZXRzIHRoZSBnbG9iYWwgZmlsdGVyIHZhbHVlIGh0bWwgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgZ2xvYmFsRmlsdGVyKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxHbG9iYWxGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBnbG9iYWxGaWx0ZXIoZ2xvYmFsRmlsdGVyOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBldmVudEhhbmRsZXIgPSAoZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5maWx0ZXJEZWJvdW5jZVRpbWVyKTtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJEZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dChcclxuICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBkb1NlYXJjaChnbG9iYWxGaWx0ZXJbJ3ZhbHVlJ10pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRGVib3VuY2VUaW1lb3V0KTtcclxuICAgICAgICB9KS5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICBjb25zdCBkb1NlYXJjaCA9IChrZXl3b3JkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJLZXl3b3JkID0ga2V5d29yZDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyS2V5d29yZCAhPT0gdGhpcy5vbGRGaWx0ZXJLZXl3b3JkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlci5lbWl0KHRoaXMuZmlsdGVyS2V5d29yZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5vbGRGaWx0ZXJLZXl3b3JkID0gdGhpcy5maWx0ZXJLZXl3b3JkO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxHbG9iYWxGaWx0ZXIgPSBnbG9iYWxGaWx0ZXI7XHJcbiAgICAgICAgaWYgKGdsb2JhbEZpbHRlcikge1xyXG4gICAgICAgICAgICBpZiAoZ2xvYmFsRmlsdGVyIGluc3RhbmNlb2YgU2VhcmNoRm9ybUZpZWxkQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlclN1YnNjcmliZXIgPSBnbG9iYWxGaWx0ZXIuc2VhcmNoLnN1YnNjcmliZShrZXl3b3JkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIuc2VhcmNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9TZWFyY2goa2V5d29yZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5zZWFyY2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgZXZlbnRIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIGV2ZW50SGFuZGxlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudFVucmVnaXN0cmF0ZXJIYW5kbGVycy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBldmVudEhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXN0ZScsIGV2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgYW5kIHNldHMgdGhlIENhc2UgU2Vuc2l0aXZlIGZsYWcgZm9yIGZpbHRlcmluZy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBjYXNlU2Vuc2l0aXZlRmlsdGVyOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgdGFibGUgc2hvdWxkIGJlIHJlbmRlcmVkIGFzIGEgdHJlZSBkYXRhIHRhYmxlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3dBc1RyZWU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGRhdGEgc3RydWN0dXJlIGZvciB0aGUgbmV3IGl0ZW1cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBlZGl0YWJsZU5ld0RhdGFJdGVtOiBEYXRhVGFibGVEYXRhSXRlbTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIGFuZCBzZXRzIHRoZSBkYXRhIHNvdXJjZSBvZiB0aGUgZGF0YSB0YWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgaXRlbXMoKTogRGF0YVRhYmxlRGF0YUl0ZW1bXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgPyB0aGlzLmludGVybmFsSXRlbXMubWFwKGl0ZW0gPT4gaXRlbS5jb250ZW50KSA6IHRoaXMuaW50ZXJuYWxJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGl0ZW1zKHZhbHVlOiBEYXRhVGFibGVEYXRhSXRlbVtdKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlbWVtYmVyU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0RnJvbVJvdygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hY3R1YWxJdGVtcyA9IHZhbHVlO1xyXG5cclxuICAgICAgICBsZXQgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IG5lZWQgdG8gcmVmYWN0b3IgdG8gcmVkdWNlIHRoZSBuZXN0ZWQgaWYgYmxvY2tzLlxyXG4gICAgICAgIGlmICh0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25JZGVudGl0eVRvUmVtZW1iZXI6IHN0cmluZztcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGlvbikgJiYgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIucHVzaCh0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKGl0ZW0uZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5wdXNoKHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oaXRlbSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuc2VsZWN0aW9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyID0gdGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbih0aGlzLnNlbGVjdGlvbi5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JZGVudGl0eVRvUmVtZW1iZXIgPSB0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKHRoaXMuc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEl0ZW1zID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMgPSB2YWx1ZS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxFZGl0YWJsZURhdGFJdGVtPntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IE1zZnRTbWUubmV3R3VpZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBpdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQWxlcnRzOiB7fVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbWVtYmVyU2VsZWN0aW9uICYmIHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzVG9Qcm9jZXNzID0gdGhpcy5pdGVtcy5zbGljZSgwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGVzVG9Qcm9jZXNzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IG5vZGVzVG9Qcm9jZXNzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5zcGxpY2UoMCwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLmluZGV4T2YodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihjdXJyZW50Tm9kZS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oY3VycmVudE5vZGUsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmNoaWxkcmVuLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wYXJlbnQgPSBjdXJyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIuaW5kZXhPZih0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKGl0ZW0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JZGVudGl0eVRvUmVtZW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2Rlc1RvUHJvY2VzcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGVzVG9Qcm9jZXNzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IG5vZGVzVG9Qcm9jZXNzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5zcGxpY2UoMCwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihjdXJyZW50Tm9kZS5kYXRhKSA9PT0gc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGN1cnJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBmb3VuZCBpbiB0aGUgcmVmcmVzaCBpdGVtcywgdGhlbiBpdCBtZWFucyB0aGUgc2VsZWN0aW9uIGlzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5jaGlsZHJlbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9Qcm9jZXNzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihpdGVtKSA9PT0gc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGZvdW5kIGluIHRoZSByZWZyZXNoIGl0ZW1zLCB0aGVuIGl0IG1lYW5zIHRoZSBzZWxlY3Rpb24gaXMgbm90IGNoYW5nZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbkl0ZW1Ub1JlbWVtYmVyOiBEYXRhVGFibGVEYXRhSXRlbTtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlcjogRGF0YVRhYmxlRGF0YUl0ZW1bXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGlvbikgJiYgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5wdXNoKGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh0aGlzLnNlbGVjdGlvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXIgPSB0aGlzLnNlbGVjdGlvbi5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXIgPSB0aGlzLnNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxJdGVtcyA9IHZhbHVlLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPEVkaXRhYmxlRGF0YUl0ZW0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogTXNmdFNtZS5uZXdHdWlkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25BbGVydHM6IHt9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2Rlc1RvUHJvY2VzcyA9IHRoaXMuaW50ZXJuYWxJdGVtcy5zbGljZSgwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGVzVG9Qcm9jZXNzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IG5vZGVzVG9Qcm9jZXNzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5zcGxpY2UoMCwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5pbmRleE9mKGN1cnJlbnROb2RlLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGN1cnJlbnROb2RlLCB0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmNoaWxkcmVuLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wYXJlbnQgPSBjdXJyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0aW9uSXRlbXNUb1JlbWVtYmVyLmluZGV4T2YoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JdGVtVG9SZW1lbWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzVG9Qcm9jZXNzID0gdGhpcy5pdGVtcy5zbGljZSgwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobm9kZXNUb1Byb2Nlc3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Byb2Nlc3NbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9Qcm9jZXNzLnNwbGljZSgwLCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5kYXRhID09PSBzZWxlY3Rpb25JdGVtVG9SZW1lbWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBmb3VuZCBpbiB0aGUgcmVmcmVzaCBpdGVtcywgdGhlbiBpdCBtZWFucyB0aGUgc2VsZWN0aW9uIGlzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGN1cnJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZm91bmQgaW4gdGhlIHJlZnJlc2ggaXRlbXMsIHRoZW4gaXQgbWVhbnMgdGhlIHNlbGVjdGlvbiBpcyBub3QgY2hhbmdlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXRFZGl0YWJsZURhdGFDaGFuZ2VzZXQoKTtcclxuXHJcbiAgICAgICAgaWYgKGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBleHBvc2VzIHRoZSBlbnVtIHR5cGUgdGhlbiBpbiB0ZW1wbGF0ZSB3ZSBjYW4gZGlyZWN0bHkgcmVmZXIgdG8gdGhlIGVudW0gdmFsdWUgbmFtZSBpbnN0ZWFkIG9mIGVudW0gdmFsdWUgbnVtYmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc29ydE1vZGVFbnVtOiBhbnkgPSBEYXRhVGFibGVTb3J0TW9kZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGV4cG9zZXMgdGhlIGVudW0gdHlwZSB0aGVuIGluIHRlbXBsYXRlIHdlIGNhbiBkaXJlY3RseSByZWZlciB0byB0aGUgZW51bSB2YWx1ZSBuYW1lIGluc3RlYWQgb2YgZW51bSB2YWx1ZSBudW1iZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXJlZEl0ZW1UeXBlRW51bTogYW55ID0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgYW5kIHNldHMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZGF0YSBzb3VyY2UuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGlvbigpOiBEYXRhVGFibGVEYXRhSXRlbSB8IERhdGFUYWJsZURhdGFJdGVtW10ge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgPyB0aGlzLmludGVybmFsU2VsZWN0aW9uLm1hcChpdGVtID0+IGl0ZW0uY29udGVudCkgOiB0aGlzLmludGVybmFsU2VsZWN0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lZGl0YWJsZSA/IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25bMF0uY29udGVudCA6IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25bMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNlbGVjdGlvbihzZWxlY3Rpb246IERhdGFUYWJsZURhdGFJdGVtIHwgRGF0YVRhYmxlRGF0YUl0ZW1bXSkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbnRlbnQgPSBzZWxlY3Rpb24ubWFwKHMgPT4gcy5jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSB0aGlzLmludGVybmFsSXRlbXMuZmlsdGVyKGl0ZW0gPT4gc2VsZWN0aW9uQ29udGVudC5pbmRleE9mKGl0ZW0uY29udGVudCkgIT09IC0xKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSBzZWxlY3Rpb24gfHwgW107XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmxpbmtQYXJlbnRDaGlsZHJlblNlbGVjdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24ubWFwKHNlbGVjdGlvbkl0ZW0gPT4gc2VsZWN0aW9uSXRlbS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsU2VsZWN0aW9uID0gdGhpcy5pbnRlcm5hbEl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uY29udGVudCA9PT0gc2VsZWN0aW9uKVswXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSBhY3R1YWxTZWxlY3Rpb24gPyBbYWN0dWFsU2VsZWN0aW9uXSA6IFtdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IHNlbGVjdGlvbiA/IFtzZWxlY3Rpb25dIDogW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhCeVNlbGVjdGlvbigpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoc2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCBzZWxlY3Rpb25Nb2RlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25Nb2RlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzZWxlY3Rpb25Nb2RlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uTW9kZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYSB0ZW1wIGNvZGUgdG8gc29sdmUgdGhlIHByb2JsZW0gdGhhdDpcclxuICAgICAgICAvLyB3aGVuIHRoZSBkYXRhIHRhYmxlIGlzIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlIGFuZCBhbiBpbml0aWFsIGFycmF5IHZhbHVlIGlzIGFzc2lnbmVkIHRvIHRoZSBzZWxlY3Rpb24gcHJvcGVydHksXHJcbiAgICAgICAgLy8gYXQgdGhhdCBtb21lbnQgdGhlIHNlbGVjdGlvbk1vZGUgcHJvcGVydHkgaXMgbm90IHNldCB0byBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSB2YWx1ZSwgeWV0LlxyXG4gICAgICAgIC8vIFNvIHdlIHRyZWF0IHRoZSBpbml0aWFsIGFycmF5IHZhbHVlIGFzIGEgbWVtYmVyIG9mIHRoZSBzZWxlY3Rpb24gYXJyYXkgaW5zdGVhZCBvZiB0aGUgc2VsZWN0aW9uIGFycmF5LlxyXG4gICAgICAgIC8vIFNvIHdlIHVzZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gZml4IHRoaXMgcHJvYmxlbS5cclxuICAgICAgICAvLyBUT0RPOiBsb25nIHRlcm0gd2lzZSwgd2UgbmVlZCB0byB1c2Ugc2VwZXJhdGVkIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIG1haW50YWluIHRoZSBzZWxlY3Rpb25zIG9mIHNlbGVjdGlvblxyXG4gICAgICAgIC8vIHNlbGVjdGlvbiBhbmQgbXVsdGlwbGUgc2VsZWN0aW9uLlxyXG4gICAgICAgIC8vIFRoaXMgY2hhbmdlIHdpbGwgaGFwcGVuIGluIHRoZSBjb21pbmcgcmVsZWFzZS5cclxuICAgICAgICBpZiAodmFsdWUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5pbnRlcm5hbFNlbGVjdGlvbikgJiYgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmludGVybmFsU2VsZWN0aW9uWzBdKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25bMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkZWZhdWx0U29ydENvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50O1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGVmYXVsdFNvcnRNb2RlOiBEYXRhVGFibGVTb3J0TW9kZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGVtaXRzIHRoZSBldmVudCB3aGVuIGZpbHRlcmluZyBpcyBoYXBwZW5pbmcuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHRyaWdnZXJzIHdoZW4gYSB0cmVlIG5vZGUgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ2ZpbHRlcicgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25GaWx0ZXIoKTogRXZlbnRFbWl0dGVyPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcjtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgZG9DdXN0b21Tb3J0OiBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ3VzdG9tU29ydEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ3VzdG9tU29ydEV2ZW50PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZW1pdHMgdGhlIGV2ZW50IHdoZW4gYSByb3cgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ3Jvd1NlbGVjdGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvblJvd1NlbGVjdCgpOiBFdmVudEVtaXR0ZXI8eyBkYXRhOiBEYXRhVGFibGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0ZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIHJvd1NlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGRhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBlbWl0cyB0aGUgZXZlbnQgd2hlbiBhIHJvdyBpcyB1bnNlbGVjdGVkIGFuZCBubyByb3cgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ3Jvd1Vuc2VsZWN0ZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uUm93VW5zZWxlY3QoKTogRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd1Vuc2VsZWN0ZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIHJvd1Vuc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgb3Igc2V0cyB0aGUgZ3JvdXAgY29sdW1uLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCBncm91cENvbHVtbigpOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsR3JvdXBDb2x1bW47XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGdyb3VwQ29sdW1uKHZhbHVlOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbEdyb3VwQ29sdW1uICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVybmFsR3JvdXBDb2x1bW4gPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29sdW1uc09yZGVyICYmIHRoaXMuY29sdW1uc09yZGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnNNYWluKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIG9yIHNldHMgdGhlIGdyb3VwIHNvcnQgbW9kZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgZ3JvdXBTb3J0TW9kZSgpOiBEYXRhVGFibGVTb3J0TW9kZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxHcm91cFNvcnRNb2RlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBncm91cFNvcnRNb2RlKHZhbHVlOiBEYXRhVGFibGVTb3J0TW9kZSkge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxHcm91cFNvcnRNb2RlID0gdmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKGZhbHNlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZ3JvdXAgdG9nZ2xlIHNob3VsZCBiZSB1c2VkIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgZ3JvdXAuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdXNlR3JvdXBUb2dnbGU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBzaG93IHRoZSBoZWFkZXIuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvd0hlYWRlciA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIFwiYXJpYS1sYWJlbGxlZGJ5XCIgdmFsdWUgZm9yIHRoZSB0YWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgdGFibGVBcmlhTGFiZWxsZWRCeSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsVGFibGVBcmlhTGFiZWxsZWRCeTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdGFibGVBcmlhTGFiZWxsZWRCeSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlQXJpYUxhYmVsbGVkQnkgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUFyaWFBdHRyaWJ1dGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIFwiYXJpYS1sYWJlbFwiIHZhbHVlIGZvciB0aGUgdGFibGUuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IHRhYmxlQXJpYUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxUYWJsZUFyaWFMYWJlbDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdGFibGVBcmlhTGFiZWwodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxUYWJsZUFyaWFMYWJlbCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQXJpYUF0dHJpYnV0ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyBzaG91bGQgdGhlIGRhdGEgdGFibGUgaGFzIHRoZSBncmlkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3dHcmlkID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHNob3cgdGhlIFwiYWxsIGl0ZW1cIiBjaGVja2JveC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzaG93QWxsSXRlbUNoZWNrYm94ID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIGNoZWNrIHRoZSBpdGVtIGFuZCB1bmNoZWNrIG90aGVyIGl0ZW1zIHdoZW4gdGhlIGN1cnJlbnQgaXRlbSBpcyBjaGVja2VkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlbGVjdEFuZENoZWNrID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgcm93IGhlaWdodCBmb3IgZWFjaCBpdGVtLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHJvd0hlaWdodCA9IDMwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gbGluayB0aGUgc2VsZWN0aW9ucyBvZiBwYXJlbnQgbm9kZXMgYW5kIGNoaWxkIG5vZGVzLlxyXG4gICAgICogSXQgb25seSBhcHBseSB0byB0cmVlIHRhYmxlIHNjZW5hcmlvLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxpbmtQYXJlbnRDaGlsZHJlblNlbGVjdGlvbnMgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc2VsZWN0IHRoZSBpdGVtIHdoZW4gbmF2aWdhdGluZyB3aXRoIHRoZSBrZXlib2FyZCAoZS5nLiBhcnJvdyBrZXlzLCBob21lLCBlbmQsIHBhZ2UgdXAsIHBhZ2UgZG93bilcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZWxlY3RJdGVtV2hlbk5hdmlnYXRpbmdXaXRoS2V5Ym9hcmQgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc2hvdyB0aGUgbGVmdCBtYXJnaW4gaW4gZWFjaCByb3cuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvd0xlZnRNYXJnaW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgdGFibGUgaXMgc2Nyb2xsYWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzY3JvbGxhYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHRhYmxlJ3MgVUkgdmlydHVhbGl6YXRpb24gc2hvdWxkIGJlIGRpc2FibGVkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGRpc2FibGVVSVZpcnR1YWxpemF0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0YWJsZSBpdGVtcyBhcmUgc2VsZWN0YWJsZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlbGVjdGFibGUgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVkaXRhYmxlIGRhdGEgdGFibGUgYWxsb3cgYXV0b21hdGljYWxseSBhZGRpbmcgbmV3IHJvd3NcclxuICAgICAqIFNldHRpbmcgdGhpcyB0byBmYWxzZSB0aGVuIGhhdmUgdG8gY3JlYXRlIG5ldyBsaW5lIG91dHNpZGUgb2YgdGhlIGRhdGF0YWJsZSBjb250cm9sXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZWRpdGFibGVBdXRvTmV3Um93ID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgZGVmYXVsdCBzdGF0dXMgb2YgdGhlIGdyb3VwIHRvZ2dsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkZWZhdWx0R3JvdXBUb2dnbGVFeHBhbmRlZCA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBhdXRvUm93SGVpZ2h0ID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBjb2x1bW5zT3JkZXI6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgZ3JvdXBUb2dnbGVTdGF0dXM6IHsgW2dyb3VwOiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcclxuICAgIHB1YmxpYyBub2RlTmF2aWdhdGluZ1Rhc2s6IE5vZGVOYXZpZ2F0aW5nVGFzaztcclxuICAgIHB1YmxpYyBpc0NvbHVtbldpZHRoQ2FsY3VsYXRlZCA9IGZhbHNlO1xyXG5cclxuICAgIEBTbWVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpXHJcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZjtcclxuXHJcbiAgICBAU21lSW5qZWN0KE5nWm9uZSlcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmU7XHJcblxyXG4gICAgQFNtZUluamVjdChTTUVfTEFZT1VUX1BST1ZJREVSLCB0cnVlKVxyXG4gICAgcHJpdmF0ZSBsYXlvdXQ6IExheW91dDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVkaXRhYmxlRGF0YUNoYW5nZVNldCgpOiBFZGl0YWJsZURhdGFDaGFuZ2VTZXQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRhYmxlID8gdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWZyZXNoRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVySXRlbXModHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZXNldFNjcm9sbCgpOiB2b2lkIHtcclxuICAgICAgICAvLyBTZXQgdGhlIHNjcm9sbFRvcChkaXN0YW5jZSBmcm9tIHRoZSBlbGVtZW50J3MgdG9wIHRvIGl0cyB0b3Btb3N0IHZpc2libGUgY29udGVudClcclxuICAgICAgICAvLyBvZiBTY3JvbGwgY29udGFpbmVyIHRvIDAuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuXHJcbiAgICAgICAgLy8gTm8gbmVlZCB0byByZXNldCAndGhpcy5jdXJyZW50U3RhcnRJbmRleE9mSXRlbUluVmlld1BvcnQnIHRvIDAsIGFzIGl0IHdpbGwgYXV0b21hdGljYWxseSBnZXRcclxuICAgICAgICAvLyBhZGp1c3RlZCB0byAwIGluICdjYWxjdWxhdGVJdGVtSW5WaWV3UG9ydCgpJy5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlVUlWaXJ0dWFsaXphdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24gPSBkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmlkO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3RyZWVncmlkJyk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdncmlkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICd0YWJsZScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuRGF0YVRhYmxlUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIgPSBuZXcgRGF0YVRhYmxlUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIodGhpcy5sYXlvdXQpO1xyXG4gICAgICAgICAgICAvLyBvbiBwYXJlbnQgbGF5b3V0IGNoYW5nZXMsIHJlLWVtaXQgdGhlIGxheW91dCBjaGFuZ2UgdG8gb3VyIGV2ZW50XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0LmxheW91dENoYW5nZWQuc3Vic2NyaWJlKCgoKSA9PiB0aGlzLm9uTGF5b3V0Q2hhbmdlZCgpKSkpO1xyXG4gICAgICAgICAgICAvLyBvbiB3aW5kb3cgYnJlYWsgcG9pbnQgY2hhbmdlcywgZW1pdCB0aGUgZXZlbnQgYWJvdXQgY3JpdGljYWwgY2xhc3NlcyBhbmQgc3R5bGluZyB1cGRhdGVzIHNpZ25hbC5cclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXQud2luZG93QnJlYWtwb2ludENoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHRoaXMub25XaW5kb3dCcmVha3BvaW50Q2hhbmdlZCgpKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRlZmVycmVkT25MYXlvdXRDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICogQXMgdGhlIHVzZXIgc2Nyb2xscyBvbiB0aGUgeCBheGlzIG9mIHRoZSBib2R5IG9mIHRoZSB0YWJsZSwgd2VcclxuICAgICAgICAgICAgICogbmVlZCB0byBtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIGNvbHVtbiBoZWFkZXJzIG9mIHRoZSB0YWJsZSBpbnRvXHJcbiAgICAgICAgICAgICAqIHZpZXcuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBmcm9tRXZlbnQodGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdzY3JvbGwnKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckVsZW1lbnQubmF0aXZlRWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ21hcmdpbi1sZWZ0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7LXRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnR9cHhgKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFNvcnRDb2x1bW4gJiYgdGhpcy5kZWZhdWx0U29ydE1vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5zb3J0Q29sdW1uID0gdGhpcy5kZWZhdWx0U29ydENvbHVtbjtcclxuICAgICAgICAgICAgdGhpcy5zb3J0Q29sdW1uLnNvcnRNb2RlID0gdGhpcy5kZWZhdWx0U29ydE1vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4QnlTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYWNjZXNpYmlsaXR5TWFuYWdlcikge1xyXG4gICAgICAgICAgICB0aGlzLnVucmVnaXN0ZXJPbkVsZW1lbnRGb2N1c2luZ0V2ZW50SGFuZGxlciA9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjY2VzaWJpbGl0eU1hbmFnZXIucmVnaXN0ZXJFbGVtZW50Rm9jdXNpbmdFdmVudCh0aGlzLm9uRWxlbWVudEZvY3VzaW5nLmJpbmQodGhpcykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVBcmlhQXR0cmlidXRlcygpO1xyXG5cclxuICAgICAgICAvLyBUT0RPOiBsb29rIGludG8gaW1wcm92ZW1lbnRzLCBhZGRpbmcgc2V0VGltZW91dCBoZXJlIG1ha2VzIHRoZSBjb21wb25lbnQgbGlmZSBjeWNsZSBoYXJkIHRvIG1hbmFnZVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0RWxlbWVudCA9IERvbS5nZXROZXh0Rm9jdXNhYmxlRWxlbWVudEluVHJhcCh0aGlzLnNjcm9sbERhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB0aGlzLnNob3VsZFVzZUxhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50ID0gIW5leHRFbGVtZW50O1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ29sdW1uRG9tV2lkdGhzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uSGVhZGVyVGFibGVQcmVzc2VkKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5VcEFycm93OlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkRvd25BcnJvdzpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9IZWFkT2ZSZW5kZXJlZEl0ZW1zKCk7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudCA9IDxIVE1MRWxlbWVudD5ldmVudC50YXJnZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBEb20uZ2V0TmV4dFpvbmVFbGVtZW50KGN1cnJlbnRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Db250ZW50VGFibGVLZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIub25Db250ZW50VGFibGVLZXlVcChldmVudCwgdGhpcy5jb250ZW50RWxlbWVudCwgdGhpcy5lZGl0YWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcmJpdHJhcnlTY3JvbGwoc2Nyb2xsVG9wOiBudW1iZXIsIGlzSW5jcmVtZW50PzogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChpc0luY3JlbWVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcclxuICAgICAgICB9IGVsc2UgaWYgKCFpc0luY3JlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICBpZiAoZGlmZiA+IHNjcm9sbFRvcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wICs9IHNjcm9sbFRvcDtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaWZmIDw9IHNjcm9sbFRvcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZGlmZiA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCAtIHNjcm9sbFRvcDtcclxuICAgICAgICAgICAgaWYgKGRpZmYgPiBzY3JvbGxUb3ApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCAtPSBzY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlmZiA8PSBzY3JvbGxUb3ApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVJdGVtSW5WaWV3UG9ydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbnRlbnRUYWJsZVByZXNzZWQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSAhPT0gS2V5Q29kZS5DdHJsICYmIGV2ZW50LmtleUNvZGUgIT09IEtleUNvZGUuU2hpZnQpIHtcclxuICAgICAgICAgICAgQ29yZUVudmlyb25tZW50LmFjY2Vzc2liaWxpdHlNYW5hZ2VyLmNoYW5nZUFjY2Vzc2liaWxpdHlNb2RlKHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IDxIVE1MRWxlbWVudD5ldmVudC50YXJnZXQ7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFJvdyA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKHRhcmdldEVsZW1lbnQsIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1yb3cnKSk7XHJcbiAgICAgICAgLy8gY3RybEtleSBmb3Igc2luZ2xlIHNlbGVjdGlvbiBtb2RlIHdvcmtzIGZpbmVcclxuICAgICAgICAvLyBjdHJsS2V5IGZvciBtdWx0aXBsZSBzZWxlY3Rpb24gd2lsbCBiZSByZWdhcmRlZCBhcyBzZWxlY3QgYWxsIHJvd3MgdGhhdFxyXG4gICAgICAgIC8vIHdpbGwgYmUgaGFuZGxlZCBub3QgaGVyZS5cclxuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSAmJiAhZXZlbnQuY3RybEtleSkge1xyXG4gICAgICAgICAgICBjb25zdCBzaG91bGRSZXR1cm4gPSB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyXHJcbiAgICAgICAgICAgICAgICAuZWRpdGFibGVEYXRhVGFibGVPbkNvbnRlbnRUYWJsZVByZXNzZWRIYW5kbGVyKGV2ZW50LCB0YXJnZXRFbGVtZW50LCBjdXJyZW50Um93LCB0aGlzLmxhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50KTtcclxuICAgICAgICAgICAgaWYgKHNob3VsZFJldHVybikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZS5DdHJsIHx8IGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuU2hpZnQpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSBmYWxzZTtcclxuICAgICAgICBsZXQgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudFJlbmRlcmVkSXRlbSA9IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCldO1xyXG5cclxuICAgICAgICB0aGlzLnByZXZpb3VzQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgIC8vIEZvciBub3cgYXNzdW1pbmcgdHJlZSB0YWJsZSBmaXJzdCBmb2N1cyBvbiByb3cgYW5kIHRoZW5cclxuICAgICAgICAvLyB0aGUgdXNlciBoYXMgdG8gaGl0IGVudGVyL3NwYWNlIHRvIHNlbGVjdCB0aGlzIGZvY3VzZWQgaXRlbVxyXG4gICAgICAgIC8vIEZvciBvdGhlciB0eXBlIG9mIHRhYmxlIHdpbGwgZmlyc3Qgc2VsZWN0IGFuZCB0aGVuIGF1dG9tYXRpY2FsbHkgZm9jdXMgYnkgZGVmYXVsdFxyXG4gICAgICAgIGNvbnN0IHNlbGVjdEFuZEZvY3VzID0gIXRoaXMuc2hvd0FzVHJlZTtcclxuXHJcbiAgICAgICAgLy8gT25seSB0aGUgc2Nyb2xsaW5nIHJlbGF0ZWQgbmF2aWdhdGlvbiBrZXlib2FyZCBvcGVyYXRpb25zIG5lZWQgZGVib3VuY2luZy5cclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkE6XHJcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzZWxlY3QgYWxsIGhhbmRsZXJcclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGFsc28gaGFuZGxlIHdoZW4gZWRpdGFibGUgZGF0YXRhYmxlIGFuZCB0aGUgZm9jdXMgaXMgaW4gc21lLWZvcm0tZmllbGRcclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUgJiYgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5pc1NtZUZvcm1GaWVsZCh0YXJnZXRFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFldmVudC5hbHRLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkhvbWU6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9IZWFkT2ZSZW5kZXJlZEl0ZW1zKHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlVwQXJyb3c6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSAmJiBldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjcm9sbCB1cFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFyYml0cmFyeVNjcm9sbCh0aGlzLmRlZmF1bHRTY3JvbGxQaXhlbHMsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpID4gMCB8fCB0aGlzLmdldEFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgoKSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9QcmV2aW91c1JlbmRlcmVkSXRlbShzZWxlY3RBbmRGb2N1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEhhbmRsZU11bHRpcGxlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gPEhUTUxFbGVtZW50PmV2ZW50LnRhcmdldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzRWxlbWVudCA9IERvbS5nZXRQcmV2aW91c1pvbmVFbGVtZW50KGN1cnJlbnRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkRvd25BcnJvdzpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5ICYmIGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2Nyb2xsIGRvd25cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcmJpdHJhcnlTY3JvbGwodGhpcy5kZWZhdWx0U2Nyb2xsUGl4ZWxzLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2l0aCBzaGlmdEtleSBtZWFucyBuZWVkcyBzZWxlY3Rpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9OZXh0UmVuZGVyZWRJdGVtKGV2ZW50LnNoaWZ0S2V5ID8gdHJ1ZSA6IHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuUGFnZVVwOlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvUHJldmlvdXNQYWdlT2ZSZW5kZXJlZEl0ZW1zKHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlBhZ2VEb3duOlxyXG4gICAgICAgICAgICAgICAgaWYgKCg8SFRNTEVsZW1lbnQ+ZXZlbnQuc3JjRWxlbWVudCkuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtcm93JykpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb05leHRQYWdlT2ZSZW5kZXJlZEl0ZW1zKHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRW5kOlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvRW5kT2ZSZW5kZXJlZEl0ZW1zKHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlNwYWNlOlxyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRW50ZXI6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRFbnRlclNwYWNlKGN1cnJlbnRSZW5kZXJlZEl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0QW5kRm9jdXMsIGV2ZW50LCB0YXJnZXRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuTGVmdEFycm93OlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ29udGVudFRhYmxlUHJlc3NlZExlZnRBcnJvdyhjdXJyZW50UmVuZGVyZWRJdGVtLCB0YXJnZXRFbGVtZW50LCBjdXJyZW50Um93KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuUmlnaHRBcnJvdzpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRSaWdodEFycm93KGN1cnJlbnRSZW5kZXJlZEl0ZW0sIHRhcmdldEVsZW1lbnQsIGN1cnJlbnRSb3cpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBGb3IgdGhlIHRyZWUgdGFibGUgbm93IHdlIGZpcnN0IGZvY3VzIGFuZCB0aGVuIHVzZSB0aGUgcmlnaHQgYXJyb3cga2V5IG9yIGVudGVyIG9yIHNwYWNlIHRvIHNlbGVjdFxyXG4gICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB0aGUgbG9naWMgYmVmb3JlIGhlcmUgb25seSBkaWQgYW4gYXJyb3cgdXAvZG93biBrZXksIHdlIG5lZWQgdGhlIHNlbGVjdGlvbiBoYXBwZW5pbmcgYXMgd2VsbFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25Db250ZW50VGFibGVQcmVzc2VkU2hvd0FzVHJlZUhlbHBlcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGV2ZW50LCB0aGlzLnJlbmRlcmVkSXRlbXNbdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleF0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuVXBBcnJvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleC0tO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLkRvd25BcnJvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleCA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dChcclxuICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkRlYm91bmNlVGltZW91dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Db250ZW50VGFibGVQcmVzc2VkU2hvd0FzVHJlZUhlbHBlcigpIHtcclxuICAgICAgICAvLyBJZiB0cmVlIHRhYmxlIGFuZCB0aGUgY3VycmVudCBmb2N1c2VkIGVsZW1lbnQgaW5kZXggaXMgZGlmZmVyZW50IGZyb20gdGhlIHNlbGVjdGVkIG9uZVxyXG4gICAgICAgIC8vIFdpbGwgc2VsZWN0IHRoZSByb3cgYmFzZWQgb24gZm9jdXNlZCBlbGVtZW50XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCAhPT0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIGtleWJvYXJkIHByZXNzIGV2ZW50IGZvciBlbnRlciBhbmQgc3BhY2VcclxuICAgICAqIFRvIHRyaWdnZXIgdGhpcyBmdW5jdGlvbiwgZWl0aGVyIGZvY3VzIG9uIHRhYmxlIHJvdyBvciB0YWJsZSByb3cgY2VsbCB0ZW1wbGF0ZSBhbmRcclxuICAgICAqIGNsaWNrIHRoZSAnZW50ZXInIG9yICdzcGFjZScgYnV0dG9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uQ29udGVudFRhYmxlUHJlc3NlZEVudGVyU3BhY2UoY3VycmVudFJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCBzZWxlY3RBbmRGb2N1czogYm9vbGVhbixcclxuICAgICAgICBldmVudDogS2V5Ym9hcmRFdmVudCwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICAvLyBpZiBmYWxzZSwgZm9jdXNlZCBvbiB0YWJsZSByb3cgY2VsbCB0ZW1wbGF0ZVxyXG4gICAgICAgIC8vIGlmIHRydWUsIGZvY3VzZWQgb24gdGFibGUgcm93IGl0ZW0gY29tcG9uZW50XHJcbiAgICAgICAgbGV0IGZvY3VzZWRPblJvd0NvbXBvbmVudCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0YXJnZXRFbGVtZW50ICYmIHRhcmdldEVsZW1lbnQuY2xhc3NMaXN0ICYmIHRhcmdldEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtcm93JykpIHtcclxuICAgICAgICAgICAgZm9jdXNlZE9uUm93Q29tcG9uZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmtleUNvZGUpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuU3BhY2UpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHNwYWNlIG9uIGEgZGF0YSB0YWJsZSBpcyB0byBtb3ZlIHRvIHRoZSBuZXh0IHBhZ2VcclxuICAgICAgICAgICAgICAgIC8vIE91ciBkYXRhIHRhYmxlIGJlaGF2ZXMgZXhhY3RseSB0aGUgc2FtZSBhcyB3aW5kb3dzIDEwIGZpbGUgZXhwbG9yZXJcclxuICAgICAgICAgICAgICAgIC8vIE9uIHNwYWNlL2VudGVyIHdpbGwgYm90aCBzZWxlY3QgdGhlIGN1cnJlbnQgcm93LlxyXG4gICAgICAgICAgICAgICAgLy8gU28gYWx3YXlzIGRlY2xpbmUgZGVmYXVsdCBmdW5jdGlvbiBmb3Igc3BhY2Uga2V5Ym9hcmQgZXZlbnQgYXMgbG9uZyBhcyBmb2N1cyBpcyBvbiB0aGUgcm93IGJlY2F1c2VcclxuICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBuZWVkIHRoZSBtb3ZlIHRvIHRoZSBuZXh0IHBhZ2UgYmVoYXZpb3JcclxuICAgICAgICAgICAgICAgIGlmIChmb2N1c2VkT25Sb3dDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBJZiBLZXlDb2RlIGlzIEVudGVyLCBqdXN0IHJlbWFpbiB0aGUgY3VycmVudCB2YWx1ZSBvZiBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uXHJcbiAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZGlzYWJsZSB0aGUgZW50ZXIga2V5IGRlZmF1bHQgZnVuY3Rpb25cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRTaG93QXNUcmVlSGVscGVyKCk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5vbkl0ZW1DaGVja0JveENsaWNrZWQoY3VycmVudFJlbmRlcmVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBzZWxlY3QgYSByb3cuIG5vdCBleHBhbmQvY29sbGFwc2UgaXRcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZXZlbnRFbnRlcktleUZvckRlZmF1bHRBY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kb3VibGVDbGlja1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZ2dpbmcubG9nKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IExvZ0xldmVsLkRlYnVnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTm8gZXZlbnQgaGFuZGxlciBiaW5kIHRvIFwiZG91YmxlQ2xpY2tSb3dcIiBldmVudC4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdEYXRhVGFibGVDb21wb25lbnQub25Db250ZW50VGFibGVQcmVzc2VkJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0QW5kRm9jdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG91YmxlQ2xpY2tSb3cobnVsbCwgY3VycmVudFJlbmRlcmVkSXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdyh0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmtleUNvZGUgJiYgZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZS5FbnRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQ29udGVudFRhYmxlUHJlc3NlZFJpZ2h0QXJyb3coY3VycmVudFJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCwgY3VycmVudFJvdzogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ29udGVudFRhYmxlUHJlc3NlZFNob3dBc1RyZWVIZWxwZXIoKTtcclxuICAgICAgICAgICAgY3VycmVudFJlbmRlcmVkSXRlbSA9IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VycmVudFJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tjdXJyZW50UmVuZGVyZWRJdGVtLmRhdGFdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrR3JvdXBUb2dnbGUoY3VycmVudFJlbmRlcmVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCArIDE7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSXRlbSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCArIDE7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVHJlZVRhYmxlUGFyZW50Tm9kZShjdXJyZW50UmVuZGVyZWRJdGVtKSkge1xyXG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRSZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGlja1RyZWVUb2dnbGUobnVsbCwgY3VycmVudFJlbmRlcmVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb05leHRSZW5kZXJlZEl0ZW0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBuZXh0RWxlbWVudCA9IERvbS5nZXROZXh0Rm9jdXNhYmxlRWxlbWVudCh0YXJnZXRFbGVtZW50KTtcclxuICAgICAgICAgICAgbGV0IHJvd0Zvck5leHRFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IobmV4dEVsZW1lbnQsIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1yb3cnKSk7XHJcbiAgICAgICAgICAgIGxldCBjZWxsRm9yTmV4dEVsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihuZXh0RWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXRkJykpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNlbGxGb3JOZXh0RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1uSW5kZXhXaXRoRm9jdXNlZEVsZW1lbnQgPSAtMTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBjZWxsRm9yTmV4dEVsZW1lbnQgJiYgaSA8IGNlbGxGb3JOZXh0RWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGxGb3JOZXh0RWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuW2ldID09PSBjZWxsRm9yTmV4dEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgcmVtYWluIGZvY3VzIG9uIHRoZSBmaXJzdCBjaGVja2JveCB3aGVuIGl0IGlzIGVkaXRhYmxlIG1vZGUuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwICYmICF0aGlzLmVkaXRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzRGF0YVRhYmxlQ2hlY2tCb3hIVE1MRWxlbWVudChuZXh0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0RWxlbWVudCBpcyB0aGUgY2hlY2tib3ggaW4gZmlyc3QgY29sdW1uLCBtb3ZlIG9uIHRoZSBuZXh0IGNhbmRpZGF0ZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbGVtZW50ID0gRG9tLmdldE5leHRGb2N1c2FibGVFbGVtZW50KG5leHRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0Zvck5leHRFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxGb3JOZXh0RWxlbWVudCA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS10ZCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCAhPT0gLTFcclxuICAgICAgICAgICAgICAgICYmIGN1cnJlbnRSb3cgPT09IHJvd0Zvck5leHRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBuZXh0RWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Db250ZW50VGFibGVQcmVzc2VkTGVmdEFycm93KGN1cnJlbnRSZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQsIGN1cnJlbnRSb3c6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRTaG93QXNUcmVlSGVscGVyKCk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1cnJlbnRSZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tjdXJyZW50UmVuZGVyZWRJdGVtLmRhdGFdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrR3JvdXBUb2dnbGUoY3VycmVudFJlbmRlcmVkSXRlbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleChpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBJdGVtKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVHJlZVRhYmxlUGFyZW50Tm9kZShjdXJyZW50UmVuZGVyZWRJdGVtKSkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrVHJlZVRvZ2dsZShldmVudCwgY3VycmVudFJlbmRlcmVkSXRlbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4XS5ub2RlLnBhcmVudDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUgPT09IHBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcHJldmlvdXNFbGVtZW50ID0gRG9tLmdldFByZXZpb3VzRm9jdXNhYmxlRWxlbWVudCh0YXJnZXRFbGVtZW50KTtcclxuICAgICAgICAgICAgY29uc3Qgcm93Rm9yUHJldmlvdXNFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IoXHJcbiAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQsIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1yb3cnKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGxGb3JQcmV2aW91c0VsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihcclxuICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXRkJykpO1xyXG4gICAgICAgICAgICBpZiAoY2VsbEZvclByZXZpb3VzRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1uSW5kZXhXaXRoRm9jdXNlZEVsZW1lbnQgPSAtMTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBjZWxsRm9yUHJldmlvdXNFbGVtZW50ICYmIGkgPCBjZWxsRm9yUHJldmlvdXNFbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbEZvclByZXZpb3VzRWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuW2ldID09PSBjZWxsRm9yUHJldmlvdXNFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwICYmIHByZXZpb3VzRWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwcmV2aW91c0VsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1jaGVja2JveCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXNFbGVtZW50IGlzIHRoZSBjaGVja2JveCBpcyBpbiB0aGUgZmlyc3QgY29sdW1uLCB0aGVuIHNraXAgaXQsIGRpcmVjdGx5IGdvIHRvIHRoZSByb3cuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQgPSByb3dGb3JQcmV2aW91c0VsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnQgPT09IGN1cnJlbnRSb3cgfHwgcm93Rm9yUHJldmlvdXNFbGVtZW50ICE9PSBjdXJyZW50Um93KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyb3dGb3JQcmV2aW91c0VsZW1lbnQgPT09IGN1cnJlbnRSb3cpIHtcclxuICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1RyZWVUYWJsZVBhcmVudE5vZGUodHJlZU5vZGVJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJlZU5vZGVJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuVHJlZU5vZGUgJiYgIXRyZWVOb2RlSXRlbS5ub2RlLmlzTGVhZjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Db250ZW50SXRlbUZvY3VzZWQoZXZlbnQ6IEZvY3VzRXZlbnQsIHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZW50QXJlYUhhc0ZvY3VzID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0YWJsZURhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+cmVuZGVyZWRJdGVtLmRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdGFibGVOZXdSb3dIYXNGb2N1cyA9IGVkaXRhYmxlRGF0YUl0ZW0uaXNOZXdSb3c7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZEVsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihcclxuICAgICAgICAgICAgICAgIDxIVE1MRWxlbWVudD5kb2N1bWVudC5hY3RpdmVFbGVtZW50LCBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtdGQnKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyRWxlbWVudCA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKHRkRWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKTtcclxuICAgICAgICAgICAgaWYgKHRyRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGRFbGVtZW50cyA9IHRyRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLXRkJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRkRWxlbWVudHNbaV0gPT09IHRkRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmZvY3VzSW5UYWJsZUNlbGwoZXZlbnQpO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29udGVudEl0ZW1CbHVycmVkKGV2ZW50LCByZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGVudEFyZWFIYXNGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZWRpdGFibGVOZXdSb3dIYXNGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5mb2N1c091dFRhYmxlQ2VsbChldmVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZWRpdGFibGVOZXdSb3dIYXNGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSZW5kZXJlZEl0ZW1Sb3dGb2N1c091dChyZW5kZXJlZEl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZUVkaXRhYmxlRGF0YVJvdyhkYXRhOiBhbnkpIHtcclxuICAgICAgICBsZXQgZGF0YUV4aXN0c0luSW50ZXJuYWxJdGVtcyA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnRlcm5hbEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT50aGlzLmludGVybmFsSXRlbXNbaV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmNvbnRlbnQgPT09IGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGRhdGFFeGlzdHNJbkludGVybmFsSXRlbXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kSW5BZGRlZEl0ZW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LmFkZGVkSXRlbXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuYWRkZWRJdGVtc1tqXSA9PT0gaXRlbS5jb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LmFkZGVkSXRlbXMuc3BsaWNlKGosIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluQWRkZWRJdGVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQudXBkYXRlZEl0ZW1zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LnVwZGF0ZWRJdGVtc1tqXSA9PT0gaXRlbS5jb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LnVwZGF0ZWRJdGVtcy5zcGxpY2UoaiwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kSW5BZGRlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuZGVsZXRlZEl0ZW1zLnB1c2goaXRlbS5jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxJdGVtcy5zcGxpY2UoaSwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyh0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSb3cgbm90IHlldCBhZGRlZCB0byBpbnRlcm5hbEl0ZW1zLCBqdXN0IHJlZnJlc2hcclxuICAgICAgICBpZiAoIWRhdGFFeGlzdHNJbkludGVybmFsSXRlbXMpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyh0cnVlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRGb2N1c2VkKGV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jYW5jZWxMYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudEZvY3VzT25jZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNhbmNlbExhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Rm9jdXNPbmNlID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXRlTkdDbGFzc0ZvclJlbmRlcmVkSXRlbShyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHJlbmRlcmVkSXRlbS5pbmRleCA9PT0gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpLFxyXG4gICAgICAgICAgICAnc21lLXRhYmxlLWdyb3VwLWl0ZW0nOiByZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEl0ZW0sXHJcbiAgICAgICAgICAgICdzbWUtdGFibGUtZ3JvdXAtaGVhZGVyJzogcmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIsXHJcbiAgICAgICAgICAgICdzbWUtY2hlY2tlZCc6IHRoaXMuaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3VsZEFsbEl0ZW1DaGVja0JveENoZWNrZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuc2VsZWN0aW9uICYmIHRoaXMuc2VsZWN0aW9uLmxlbmd0aCA+IDAgJiYgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoID09PSB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJlZU5vZGVEYXRhSXRlbSA9IDxUcmVlTm9kZURhdGFJdGVtPnRoaXMuZmlsdGVyZWRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRyZWVOb2RlRGF0YUl0ZW0gfHwgIXRyZWVOb2RlRGF0YUl0ZW0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0SG92ZXJlZFJlbmRlcmVkSXRlbShyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaG92ZXJlZFJlbmRlcmVkSXRlbUluZGV4ID0gcmVuZGVyZWRJdGVtLmluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1bnNldEhvdmVyZWRSZW5kZXJlZEl0ZW0ocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5ob3ZlcmVkUmVuZGVyZWRJdGVtSW5kZXggPT09IHJlbmRlcmVkSXRlbS5pbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLmhvdmVyZWRSZW5kZXJlZEl0ZW1JbmRleCA9IC0xO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldElzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCgpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgaXNGb2N1c2luZ091dEZyb21MYXN0Rm9ybUZpZWxkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdkYXRhLXNtZS1sYXN0LWZvY3VzYWJsZS1zaGFkb3ctZWxlbWVudCcpKSB7XHJcbiAgICAgICAgICAgIGlzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpc0ZvY3VzaW5nT3V0RnJvbUxhc3RGb3JtRmllbGQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVSZW5kZXJlZEl0ZW1Sb3dGb2N1c091dChyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkaXRhYmxlRGF0YUl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT5yZW5kZXJlZEl0ZW0uZGF0YTtcclxuICAgICAgICAgICAgaWYgKGVkaXRhYmxlRGF0YUl0ZW0uaXNOZXdSb3cpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzaG91bGRBZGROZXdSb3cgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzaG91bGQgaGFuZGxlIGlmIGFueSBmb3JtIGZpZWxkIGlzIGRpcnR5IHRoZW4gdmFsaWRhdGVcclxuICAgICAgICAgICAgICAgIGxldCBhdExlYXN0T25lRmllbGREaXJ0eSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudHMuZm9yRWFjaChsb2FkZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1GaWVsZENvbnRhaW5lciA9IDxGb3JtRmllbGRDb250YWluZXI+bG9hZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZXIucmVuZGVyZWRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlckRhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+bG9hZGVyLnJlbmRlcmVkSXRlbS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVyRGF0YUl0ZW0uaXNOZXdSb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtRmllbGRDb250YWluZXIuaXNEaXJ0eSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRMZWFzdE9uZUZpZWxkRGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIGFsc28gaGFuZGxlIHdoZW4gZm9jdXNpbmcgb3V0IGZyb20gdGhlIGxhc3QgZm9ybSBmaWVsZCBpbiB0aGUgcm93XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc0ZvY3VzaW5nT3V0RnJvbUxhc3RGb3JtRmllbGQgPSB0aGlzLmdldElzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhdExlYXN0T25lRmllbGREaXJ0eSB8fCBpc0ZvY3VzaW5nT3V0RnJvbUxhc3RGb3JtRmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRBZGROZXdSb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVRhYmxlVGVtcGxhdGVMb2FkZXJDb21wb25lbnRzLmZvckVhY2gobG9hZGVyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybUZpZWxkQ29udGFpbmVyID0gPEZvcm1GaWVsZENvbnRhaW5lcj5sb2FkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZXIucmVuZGVyZWRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZXJEYXRhSXRlbSA9IDxFZGl0YWJsZURhdGFJdGVtPmxvYWRlci5yZW5kZXJlZEl0ZW0uZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZXJEYXRhSXRlbS5pc05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm9ybUZpZWxkQ29udGFpbmVyLmNoZWNrVmFsaWRhdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZE5ld1JvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRBZGROZXdSb3cgJiYgdGhpcy5lZGl0YWJsZUF1dG9OZXdSb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RGF0YUl0ZW0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnQpKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdmVycmlkZU5ld0RhdGFIYW5kbGVyID0gZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFJdGVtID0gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVSb3dBZGRlZC5lbWl0KHsgZGF0YTogbmV3RGF0YUl0ZW0sIG92ZXJyaWRlTmV3RGF0YUhhbmRsZXI6IG92ZXJyaWRlTmV3RGF0YUhhbmRsZXIgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRJdGVtLmRhdGEuY29udGVudCA9IG5ld0RhdGFJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkSXRlbS5kYXRhLmlzTmV3Um93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEl0ZW1zLnB1c2gocmVuZGVyZWRJdGVtLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LmFkZGVkSXRlbXMucHVzaChuZXdEYXRhSXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VzZXRVcGRhdGVkLmVtaXQodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsSXRlbXMucHVzaChuZXdEYXRhSXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoRGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG91bGRTaG93RWRpdFJvdyhyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQWxsRWRpdGFibGVSb3dzVmlzaWJsZSkgeyByZXR1cm4gdHJ1ZTsgfVxyXG5cclxuICAgICAgICBjb25zdCBlZGl0YWJsZURhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+cmVuZGVyZWRJdGVtLmRhdGE7XHJcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkSXRlbS5pbmRleCA9PT0gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXHJcbiAgICAgICAgICAgIHx8IHRoaXMuaGFzVmFsaWRhdGlvbkVycm9yKHJlbmRlcmVkSXRlbSlcclxuICAgICAgICAgICAgfHwgcmVuZGVyZWRJdGVtLmluZGV4ID09PSB0aGlzLmhvdmVyZWRSZW5kZXJlZEl0ZW1JbmRleFxyXG4gICAgICAgICAgICB8fCBlZGl0YWJsZURhdGFJdGVtLmlzTmV3Um93O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSB0ZXh0IHRoYXQgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXJpYS1sYWJlbCBmb3IgY29sdW1uIHNvcnQgb3JkZXIgKGlmIHNvcnRhYmxlKS5cclxuICAgICAqIFRoaXMgbGFiZWwgaXMgdXRpbGl6ZWQgYnkgc2NyZWVuIHJlYWRlcnMgZm9yIGFjY2Vzc2liaWxpdHkuXHJcbiAgICAgKiBJZiB0aGUgY3VycmVudCBzb3J0IG9yZGVyIGlzIEFzY2VuZGluZywgdGhlIGxhYmVsIHdpbGwgaW5kaWNhdGUgYSBidXR0b24gaWNvbiBpcyBwcmVzZW50IHRvIERlc2NlbmQgb3JkZXIuXHJcbiAgICAgKiBJZiB0aGUgY3VycmVudCBzb3J0IG9yZGVyIGlzIERlc2NlbmRpbmcsIHRoZSBsYWJlbCB3aWxsIGluZGljYXRlIGEgYnV0dG9uIGljb24gaXMgcHJlc2VudCB0byBBc2NlbmQgb3JkZXIuXHJcbiAgICAgKiBJZiB0aGUgY3VycmVudCBzb3J0IG9yZGVyIGlzIE5vbmUsIHRoZSBsYWJlbCBpcyBudWxsLCBhbmQgdGhlIHNjcmVlbiByZWFkZXIgd2lsbCBub3QgcmVhZCBhbnl0aGluZy5cclxuICAgICAqIEBwYXJhbSBjb2x1bW4gdGhlIHRhYmxlIGNvbHVtblxyXG4gICAgICogQHJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBhcmlhLWxhYmVsIG9uIHRoZSBzb3J0IGljb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNvcnRMYWJlbChjb2x1bW46IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCk6IHN0cmluZyB7XHJcbiAgICAgICAgc3dpdGNoIChjb2x1bW4uc29ydE1vZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5BcmlhLkxhYmVsLmRlc2NlbmRTb3J0T3JkZXJCdXR0b247XHJcbiAgICAgICAgICAgIGNhc2UgRGF0YVRhYmxlU29ydE1vZGUuRGVzY2VuZDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLkFyaWEuTGFiZWwuYXNjZW5kU29ydE9yZGVyQnV0dG9uO1xyXG4gICAgICAgICAgICBjYXNlIERhdGFUYWJsZVNvcnRNb2RlLk5vbmU6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbXBsZW1lbnRzIHRoZSBBZnRlclZpZXdJbml0IGludGVyZmFjZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZVNjcm9sbGJhcldpZHRoKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNjcm9sbEhhbmRsZXIgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzU2Nyb2xsZWREb3duID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID4gMDtcclxuICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTY3JvbGxlZERvd24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxhenlMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGF6eSBsb2FkaW5nIGlzIGVuYWJsZWQsIHJlZHVjZSB0aGUgZnJlcWVuY3kgb2YgaGFuZGxpbmcgc2Nyb2xsaW5nXHJcbiAgICAgICAgICAgICAgICAvLyBlc3BlY2lhbGx5IGRvaW5nIHRoZSBkYXRhIGxhenkgbG9hZGluZ1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGluZ0V2ZW50SGFuZGxlclNldHVwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuc2Nyb2xsQ2hlY2tJbnRlcnZhbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1Njcm9sbGluZ0V2ZW50SGFuZGxlclNldHVwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2Nyb2xsaW5nRXZlbnRIYW5kbGVyU2V0dXAgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ2hlY2tJbnRlcnZhbCA9IHNldEludGVydmFsKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1Njcm9sbGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDaGVja0ludGVydmFsRHVyYXRpb24pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgICAgdGhpcy5ldmVudFVucmVnaXN0cmF0ZXJIYW5kbGVycy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVVJKCk7XHJcbiAgICAgICAgdGhpcy5jaGVja0ltbWVkaWF0ZVZhbGlkYXRpb24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBAWWllbGQoKVxyXG4gICAgcHJpdmF0ZSBjaGVja0ltbWVkaWF0ZVZhbGlkYXRpb24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudHMuZm9yRWFjaChsb2FkZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybUZpZWxkQ29udGFpbmVyID0gPEZvcm1GaWVsZENvbnRhaW5lcj5sb2FkZXI7XHJcbiAgICAgICAgICAgICAgICBpZiAobG9hZGVyLnJlbmRlcmVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZENvbnRhaW5lci5pbW1lZGlhdGVWYWxpZGF0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGltcGxlbWVudHMgdGhlIE9uRGVzdHJveSBpbnRlcmZhY2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY3JvbGxDaGVja0ludGVydmFsKTtcclxuICAgICAgICB0aGlzLmV2ZW50VW5yZWdpc3RyYXRlckhhbmRsZXJzLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0oKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudW5yZWdpc3Rlck9uRWxlbWVudEZvY3VzaW5nRXZlbnRIYW5kbGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5yZWdpc3Rlck9uRWxlbWVudEZvY3VzaW5nRXZlbnRIYW5kbGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmxheW91dENoYW5nZVN1YnNjcmliZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRDaGFuZ2VTdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlclN1YnNjcmliZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJTdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW1wbGVtZW50cyB0aGUgQWZ0ZXJWaWV3Q2hlY2tlZCBpbnRlcmZhY2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdDaGVja2VkKCk7XHJcbiAgICAgICAgdGhpcy5hbGlnbkNvbnRlbnQoKTtcclxuICAgICAgICB0aGlzLmFsaWduU2Nyb2xsQmFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGdpdmVuIGRhdGEgdGFibGUgaXRlbS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNlbGVjdEl0ZW0oZXZlbnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50LCBpdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBsZXQgbXVsdGlwbGVTZWxlY3RNb2RlID0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk5vcm1hbDtcclxuICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgICAgIG11bHRpcGxlU2VsZWN0TW9kZSA9IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5QaWNrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVTZWxlY3RNb2RlID0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLlNlcXVlbnRpYWw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lZGl0YWJsZSAmJiAoPEhUTUxFbGVtZW50PmV2ZW50LnNyY0VsZW1lbnQpLnRhZ05hbWUgPT09ICdJTlBVVCcpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KGl0ZW0gPyBpdGVtLmluZGV4IDogLTEpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgIT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudCAmJiBldmVudC50YXJnZXRbJ3R5cGUnXSA9PT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSAhPT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGl0ZW0ubm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlU2VsZWN0ZWQuZW1pdCh7IG5vZGU6IGl0ZW0ubm9kZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RBbmRDaGVjaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpcGxlU2VsZWN0TW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk5vcm1hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChjdXJyZW50SXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oY3VycmVudEl0ZW0sIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihpdGVtLm5vZGUsIHRydWUsIGZhbHNlLCAhdGhpcy5saW5rUGFyZW50Q2hpbGRyZW5TZWxlY3Rpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVTZWxlY3RlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtdWx0aXBsZVNlbGVjdE1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5QaWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihpdGVtLm5vZGUsICFpdGVtLm5vZGUuc2VsZWN0ZWQsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG11bHRpcGxlU2VsZWN0TW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLlNlcXVlbnRpYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc21lLXVzZXItc2VsZWN0LW5vbmUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmNsZWFyVGV4dFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ICE9PSAtMSAmJiB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gaXRlbS5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pbmRleCA8IHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpdGVtLmluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhlZCBhIGJ1ZyB0aGF0IHRyZWUgdGFibGUgbXVsdGlwbGUgc2VsZWN0aW9uIHdpbGwgbG9zdCBmb2N1c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RQYXJlbnQ6IFRyZWVOb2RlRGF0YUl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLnR5cGUgIT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24odGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUsIHRydWUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQYXJlbnQgPSB0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGVuZCArIDE7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbih0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZSwgZmFsc2UsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdEFuZENoZWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGVTZWxlY3RNb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuUGljaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25JdGVtQ2hlY2tCb3hDbGlja2VkKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGVTZWxlY3RNb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuU2VxdWVudGlhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc21lLXVzZXItc2VsZWN0LW5vbmUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5jbGVhclRleHRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggIT09IC0xICYmIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gaXRlbS5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaW5kZXggPCB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGl0ZW0uaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSAhPT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25JdGVtQ2hlY2tCb3hDbGlja2VkKHRoaXMucmVuZGVyZWRJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtpdGVtLmRhdGFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGl0ZW0uZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5lZGl0YWJsZSA/IGl0ZW0uZGF0YS5jb250ZW50IDogaXRlbS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoeyBkYXRhOiB0aGlzLmVkaXRhYmxlID8gaXRlbS5kYXRhLmNvbnRlbnQgOiBpdGVtLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQgJiYgIURvbS5pc0ZvY3VzYWJsZSg8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGZ1bmN0aW9uIHRvIGZvY3VzIG9uIGVtcHR5IG1lc3NhZ2Ugd2hlbiB0aGUgZGF0YSB0YWJsZSBpcyBlbXB0eVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZW1wdHlNZXNzYWdlRWxlbWVudCAmJiB0aGlzLmVtcHR5TWVzc2FnZUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICBpdGVtLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbEJvZHlFbGVtZW50ICYmIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudCAmJiB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJlc2V0VHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZUNvdW50KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZWZlcnJlZFRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQERlYm91bmNlKClcclxuICAgIHByaXZhdGUgZGVmZXJyZWRUcnlUb0ZvY3VzRW1wdHlNZXNzYWdlKCkge1xyXG4gICAgICAgIHRoaXMudHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZUNvdW50LS07XHJcbiAgICAgICAgdGhpcy50cnlUb0ZvY3VzRW1wdHlNZXNzYWdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNldFRyeVRvRm9jdXNFbXB0eU1lc3NhZ2VDb3VudCgpIHtcclxuICAgICAgICB0aGlzLnRyeVRvRm9jdXNFbXB0eU1lc3NhZ2VDb3VudCA9IDM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCByZXR1cm5zIHRoZSBubyByZWNvcmRzIG1lc3NhZ2Ugd2hlbiB0aGUgZGF0YSB0YWJsZSBpcyBlbXB0eS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE5vUmVjb3Jkc01lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub1JlY29yZE1lc3NhZ2UgfHwgdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5Ob1JlY29yZHNGb3VuZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGRldGVybWluZXMgd2hldGhlciB0bywgb3Igbm90IHRvIHNob3cgdGhlIE5vLVJlY29yZHMgTWVzc2FnZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNob3dOb1JlY29yZHNNZXNzYWdlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5sYXp5TG9hZCkgfHwgIXRoaXMuaXNDb2x1bW5XaWR0aENhbGN1bGF0ZWQgfHxcclxuICAgICAgICAgICAgKHRoaXMubGF6eUxvYWQgJiYgdGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBiZWhhdmlvciB0aGF0IHdoZW4gYSBncm91cCB0b2dnbGUgaXMgY2xpY2tlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsaWNrR3JvdXBUb2dnbGUoaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWU/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpdGVtLmluZGV4KTtcclxuICAgICAgICB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2l0ZW0uZGF0YV0gPSB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWUgIT09IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICAgIHRvZ2dsZVN0YXR1c092ZXJyaWRkZW5WYWx1ZSA6ICF0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2l0ZW0uZGF0YV07XHJcbiAgICAgICAgdGhpcy5ncm91cFRvZ2dsZUNsaWNrLmVtaXQoaXRlbS5kYXRhKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbkRvbVdpZHRocygpO1xyXG4gICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUgYmVoYXZpb3IgdGhhdCB3aGVuIGEgdHJlZSBub2RlIHRvZ2dsZSBpcyBjbGlja2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xpY2tUcmVlVG9nZ2xlKGV2ZW50OiBFdmVudCwgaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWU/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtLm5vZGUuZXhwYW5kZWQgPSB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWUgIT09IHVuZGVmaW5lZCA/IHRvZ2dsZVN0YXR1c092ZXJyaWRkZW5WYWx1ZSA6ICFpdGVtLm5vZGUuZXhwYW5kZWQ7XHJcbiAgICAgICAgaWYgKGl0ZW0ubm9kZS5leHBhbmRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGVFeHBhbmRlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZUNvbGxhcHNlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLmdldFRyZWVOb2RlRGF0YUlkZW50aXR5KGl0ZW0ubm9kZSk7XHJcbiAgICAgICAgdGhpcy50cmVlVG9nZ2xlU3RhdHVzW2lkZW50aXR5XSA9IGl0ZW0ubm9kZS5leHBhbmRlZDtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBleHBhbmRzIGFsbCB0aGUgZ3JvdXBzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXhwYW5kQWxsR3JvdXAoKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBpbiB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzLmhhc093blByb3BlcnR5KGdyb3VwKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tncm91cF0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgY29sbGFwc2VzIGFsbCB0aGUgZ3JvdXBzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sbGFzZUFsbEdyb3VwKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgaW4gdGhpcy5ncm91cFRvZ2dsZVN0YXR1cykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cFRvZ2dsZVN0YXR1cy5oYXNPd25Qcm9wZXJ0eShncm91cCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXNbZ3JvdXBdID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCByZXR1cm5zIHRoZSBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGdpdmVuIGNvbHVtbiBpcyB0aGUgZmlyc3QgZGF0YSBjb2x1bW4uXHJcbiAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIHVzZWQgdG8gYWRkIHNvbWUgY3VzdG9tIGNzcyBmb3IgdGhlIGZpcnN0IGRhdGEgY29sdW1uIHdoZW4gZ3JvdXBpbmcgaXMgZW5hYmxlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGZpcnN0RGF0YUNvbHVtbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmZvckVhY2goY3VycmVudENvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50Q29sdW1uICE9PSB0aGlzLmdyb3VwQ29sdW1uICYmICFmaXJzdERhdGFDb2x1bW4gJiYgIWN1cnJlbnRDb2x1bW4uaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdERhdGFDb2x1bW4gPSBjdXJyZW50Q29sdW1uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjb2x1bW4gPT09IGZpcnN0RGF0YUNvbHVtbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBpZCBpZiB0aGUgY29sdW1uIGlzIHRoZSBmaXJzdCBhbmQgcmVuZGVyZWQgaXRlbSBoYXMgYSB2YWxpZCBpbmRleCwgb3RoZXJ3aXNlIHJldHVybiBudWxsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGaXJzdENvbHVtbklkKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50LCByZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0ZpcnN0RGF0YUNvbHVtbihjb2x1bW4pIHx8XHJcbiAgICAgICAgICAgICEocmVuZGVyZWRJdGVtICYmIE51bWJlci5pc0ludGVnZXIocmVuZGVyZWRJdGVtLmluZGV4KSAmJiByZW5kZXJlZEl0ZW0uaW5kZXggPj0gMCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5pZEJhZy5maXJzdERhdGFDb2x1bW4gKyByZW5kZXJlZEl0ZW0uaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29sdW1uUmVzaXppbmcoZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlc2l6ZXJJbmRpY2F0b3IubmF0aXZlRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7XHJcbiAgICAgICAgdGhpcy5yZXNpemVySW5kaWNhdG9yLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc21lLWxheW91dC1ub25lJyk7XHJcbiAgICAgICAgdGhpcy5yZXNpemVySW5kaWNhdG9yLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IGV2ZW50LnggKyAncHgnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbHVtblJlc2l6ZWQoY29sdW1uSW5kZXg6IG51bWJlciwgZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlc2l6ZXJJbmRpY2F0b3IubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzbWUtbGF5b3V0LW5vbmUnKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29sdW1uSGVhZGVyRWxlbWVudHMgPSB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbWUtdGFibGUtY29sdW1uLWhlYWRlcicpO1xyXG4gICAgICAgIGNvbnN0IG5ld0NvbHVtbldpZHRoczogbnVtYmVyW10gPSBbXTtcclxuICAgICAgICBsZXQgdG90YWxXaWR0aCA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5IZWFkZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBuZXdDb2x1bW5XaWR0aHMucHVzaChjb2x1bW5IZWFkZXJFbGVtZW50c1tpXS5vZmZzZXRXaWR0aCk7XHJcbiAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBUaGUgcmVzaXplciBpcyBhdCB0aGUgcmlnaHQgYm9yZGVyIG9mIHRoZSBjdXJyZW50IGNvbHVtbi5cclxuICAgICAgICAvLyBXaGVuIHRoZSByZXNpemluZyBoYXBwZW5zLCBpdCBtZWFucyByZXNpemluZyB0aGUgY3VycmVudCBjb2x1bW4gd2l0aCBkZWx0YSBhbW91bnRcclxuICAgICAgICAvLyBhbmQgcmVzaXppbmcgdGhlIG5leHQgY29sdW1uIHdpdGggLWRlbHRhIGFtb3VudC5cclxuICAgICAgICBjb25zdCBjdXJyZW50Q29sdW1uSGVhZGVyRWxlbWVudCA9IGNvbHVtbkhlYWRlckVsZW1lbnRzW2NvbHVtbkluZGV4XTtcclxuICAgICAgICBsZXQgbmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uID0gY3VycmVudENvbHVtbkhlYWRlckVsZW1lbnQub2Zmc2V0V2lkdGggKyBldmVudC54O1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgbmV4dENvbHVtbkhlYWRlciBpcyBoaWRkZW4sIHRoYXQgbWVhbnMgaXQncyBhIGdyb3VwIGNvbHVtbiBoZWFkZXIgd2hpY2ggc2hvdWxkIGJlIGhpZGRlbi5cclxuICAgICAgICAvLyBBIGhpZGRlbiBncm91cCBoZWFkZXIncyB3aWR0aCBzaG91bGQgbm90IGJlIGNvdW50ZWQuXHJcbiAgICAgICAgLy8gVGhlbiBzZXQgdGhlIG5leHRDb2x1bW5JbmRleCB0byB0aGUgbmV4dCBuZXh0IGNvbHVtbidzIGluZGV4LlxyXG4gICAgICAgIGNvbnN0IG5leHRDb2x1bW5JbmRleCA9IGNvbHVtbkluZGV4ICsgKGNvbHVtbkhlYWRlckVsZW1lbnRzW2NvbHVtbkluZGV4ICsgMV0uaGFzQXR0cmlidXRlKCdoaWRkZW4nKSA/IDIgOiAxKTtcclxuICAgICAgICBjb25zdCBuZXh0Q29sdW1uSGVhZGVyRWxlbWVudCA9IGNvbHVtbkhlYWRlckVsZW1lbnRzW25leHRDb2x1bW5JbmRleF07XHJcbiAgICAgICAgbGV0IG5ld1dpZHRoRm9yTmV4dENvbHVtbiA9IG5leHRDb2x1bW5IZWFkZXJFbGVtZW50Lm9mZnNldFdpZHRoIC0gZXZlbnQueDtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbiBpcyBsZXNzIHRoZW4gbWluQ29sdW1uV2lkdGgsIGl0IG1lYW5zIHRoZSB1c2VyIGlzIHRyeWluZyB0byBkcmFnIHRoZSByZXNpemVyIHRvIHZlcnkgbGVmdFxyXG4gICAgICAgIC8vIHRvIG1ha2UgdGhlIG5leHQgY29sdW1uIHZlcnkgd2lkZS5cclxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdHJ5IHRvIG1ha2Ugc3VyZSB0aGUgbmV4dCBjb2x1bW4gY2FuIGJlIHJlc2l6ZWQgdG8gYXMgd2lkZSBhcyB0aGUgdXNlciB3YW50cy5cclxuICAgICAgICAvLyBUaGUgbGVmdCBzaWRlIGNvbHVtbnMgb2YgdGhlIG5leHQgY29sdW1uIHdpbGwgYmUgc2hydW5rIGJhc2VkIG9uIHRoZWlyIG93biBvcmlnaW5hbCBwZXJjZW50YWdlIHdpZHRoLlxyXG4gICAgICAgIGlmIChuZXdXaWR0aEZvckN1cnJlbnRDb2x1bW4gPCBEYXRhVGFibGVDb21wb25lbnQubWluQ29sdW1uV2lkdGgpIHtcclxuICAgICAgICAgICAgbGV0IGNvbnN1bWVkV2lkdGhSaWdodFNpZGVDb2x1bW5zID0gMDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG5leHRDb2x1bW5JbmRleCArIDE7IGkgPCBjb2x1bW5IZWFkZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3VtZWRXaWR0aFJpZ2h0U2lkZUNvbHVtbnMgKz0gY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMgPSB0b3RhbFdpZHRoIC0gY29uc3VtZWRXaWR0aFJpZ2h0U2lkZUNvbHVtbnMgLSBuZXh0Q29sdW1uSGVhZGVyRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMgPSB0b3RhbFdpZHRoIC0gY29uc3VtZWRXaWR0aFJpZ2h0U2lkZUNvbHVtbnMgLSBuZXdXaWR0aEZvck5leHRDb2x1bW47XHJcblxyXG4gICAgICAgICAgICBsZXQgYWN0dWFsV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBjb2x1bW5JbmRleDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb2x1bW5XaWR0aCA9IE1hdGgubWF4KFxyXG4gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoRm9yTGVmdFNpZGVDb2x1bW5zICogKGNvbHVtbkhlYWRlckVsZW1lbnRzW2ldLm9mZnNldFdpZHRoIC8gb3JpZ2luYWxXaWR0aEZvckxlZnRTaWRlQ29sdW1ucyksXHJcbiAgICAgICAgICAgICAgICAgICAgRGF0YVRhYmxlQ29tcG9uZW50Lm1pbkNvbHVtbldpZHRoKTtcclxuICAgICAgICAgICAgICAgIG5ld0NvbHVtbldpZHRoc1tpXSA9IG5ld0NvbHVtbldpZHRoO1xyXG4gICAgICAgICAgICAgICAgYWN0dWFsV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMgKz0gbmV3Q29sdW1uV2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uID0gbmV3Q29sdW1uV2lkdGhzW2NvbHVtbkluZGV4XTtcclxuICAgICAgICAgICAgbmV3V2lkdGhGb3JOZXh0Q29sdW1uID0gdG90YWxXaWR0aCAtIGNvbnN1bWVkV2lkdGhSaWdodFNpZGVDb2x1bW5zIC0gYWN0dWFsV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB0aGUgbmV3V2lkdGhGb3JOZXh0Q29sdW1uIGlzIGxlc3MgdGhlbiBtaW5Db2x1bW5XaWR0aCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIGRyYWcgdGhlIHJlc2l6ZXIgdG8gdmVyeSByaWdodFxyXG4gICAgICAgIC8vIHRvIG1ha2UgdGhlIGN1cnJlbnQgY29sdW1uIHZlcnkgd2lkZS5cclxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdHJ5IHRvIG1ha2Ugc3VyZSB0aGUgY3VycmVudCBjb2x1bW4gY2FuIGJlIHJlc2l6ZWQgdG8gYXMgd2lkZSBhcyB0aGUgdXNlciB3YW50cy5cclxuICAgICAgICAvLyBUaGUgcmlnaHQgc2lkZSBjb2x1bW5zIG9mIHRoZSBjdXJyZW50IGNvbHVtbiB3aWxsIGJlIHNocnVuayBiYXNlZCBvbiB0aGVpciBvd24gb3JpZ2luYWwgcGVyY2VudGFnZSB3aWR0aC5cclxuICAgICAgICBpZiAobmV3V2lkdGhGb3JOZXh0Q29sdW1uIDwgRGF0YVRhYmxlQ29tcG9uZW50Lm1pbkNvbHVtbldpZHRoKSB7XHJcbiAgICAgICAgICAgIGxldCBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zID0gMDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gY29sdW1uSW5kZXggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN1bWVkV2lkdGhMZWZ0U2lkZUNvbHVtbnMgKz0gY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zID0gdG90YWxXaWR0aCAtIGNvbnN1bWVkV2lkdGhMZWZ0U2lkZUNvbHVtbnMgLSBjdXJyZW50Q29sdW1uSGVhZGVyRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zID0gdG90YWxXaWR0aCAtIGNvbnN1bWVkV2lkdGhMZWZ0U2lkZUNvbHVtbnMgLSBuZXdXaWR0aEZvckN1cnJlbnRDb2x1bW47XHJcblxyXG4gICAgICAgICAgICBsZXQgYWN0dWFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zID0gMDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG5leHRDb2x1bW5JbmRleDsgaSA8IGNvbHVtbkhlYWRlckVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb2x1bW5XaWR0aCA9IE1hdGgubWF4KFxyXG4gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyAqIChjb2x1bW5IZWFkZXJFbGVtZW50c1tpXS5vZmZzZXRXaWR0aCAvIG9yaWdpbmFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zKSxcclxuICAgICAgICAgICAgICAgICAgICBEYXRhVGFibGVDb21wb25lbnQubWluQ29sdW1uV2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgbmV3Q29sdW1uV2lkdGhzW2ldID0gbmV3Q29sdW1uV2lkdGg7XHJcbiAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aEZvclJpZ2h0U2lkZUNvbHVtbnMgKz0gbmV3Q29sdW1uV2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uID0gdG90YWxXaWR0aCAtIGNvbnN1bWVkV2lkdGhMZWZ0U2lkZUNvbHVtbnMgLSBhY3R1YWxXaWR0aEZvclJpZ2h0U2lkZUNvbHVtbnM7XHJcbiAgICAgICAgICAgIG5ld1dpZHRoRm9yTmV4dENvbHVtbiA9IG5ld0NvbHVtbldpZHRoc1tuZXh0Q29sdW1uSW5kZXhdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbmV3Q29sdW1uV2lkdGhzW2NvbHVtbkluZGV4XSA9IG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbjtcclxuICAgICAgICBuZXdDb2x1bW5XaWR0aHNbbmV4dENvbHVtbkluZGV4XSA9IG5ld1dpZHRoRm9yTmV4dENvbHVtbjtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlcyB0aGUgY29sdW1uIHdpZHRocyBiYXNlZCBvbiB0aGUgY2FsY3VsYXRpb24gcmVzdWx0cy5cclxuICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgIGNvbHVtbi53aWR0aCA9IG5ld0NvbHVtbldpZHRoc1tpbmRleF0gKyAncHgnO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbHVtbiBwZXJjZW50YWdlcyBiYXNlZCBvbiB0aGUgbmV3IGNvbHVtbiB3aWR0aHMuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbHVtbi53aWR0aFBlcmNlbnRhZ2UgPSBjb2x1bW5IZWFkZXJFbGVtZW50c1tpbmRleF0ub2Zmc2V0V2lkdGggLyB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbkRvbVdpZHRocygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUgY29sdW1uIGNsaWNraW5nLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xpY2tDb2x1bW4oY29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjb2x1bW5Tb3J0U2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uc29ydGFibGUgJiYgY29sdW1uLnNvcnRhYmxlICE9PSAnZmFsc2UnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gY29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uc29ydE1vZGUgPT09IERhdGFUYWJsZVNvcnRNb2RlLk5vbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zb3J0TW9kZSA9IERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uc29ydE1vZGUgPT09IERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNvcnRNb2RlID0gRGF0YVRhYmxlU29ydE1vZGUuRGVzY2VuZDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNvcnRNb2RlID0gRGF0YVRhYmxlU29ydE1vZGUuQXNjZW5kO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c1NvcnRDb2x1bW4gPSB0aGlzLnNvcnRDb2x1bW47XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0Q29sdW1uID0gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvcnRJdGVtcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZFNjcm9sbFRvU2VsZWN0aW9uQWZ0ZXJTb3J0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoZmFsc2UsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5oZWFkZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGhbZmllbGQ9XCInICsgY29sdW1uLmZpZWxkICsgJ1wiXScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RyJykuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjAwIGlzIGEgdmVyeSB0cmlja3kgbnVtYmVyIGhlcmUuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBudW1iZXIgaXMgdG9vIHNtYWxsLCBpdCB3b24ndCB0cmlnZ2VyIHRoZSBuYXJyYXRvci5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyB0b28gYmlnLCB0aGUgbmFycmF0b3Igd291bGQgZmlyc3RseSByZWFkIHRoZSBjb250ZW50IG9mIFRSIHBhcnRpYWxseSB0aGVuIHRoZSBjb250ZW50IG9mIHRoZSBUSC5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc29ydE1vZGUgPSBEYXRhVGFibGVTb3J0TW9kZS5Ob25lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb2x1bW5Tb3J0U2V0dGluZ3NbaXRlbS5oZWFkZXJdID0gdGhpcy5nZXRBcmlhU29ydEF0dHJpYnV0ZVZhbHVlKGl0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNvbHVtblNvcnRTZXR0aW5ncyA9IGNvbHVtblNvcnRTZXR0aW5ncztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIHJvdyBkb3VibGUgY2xpY2tpbmcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkb3VibGVDbGlja1JvdyhldmVudDogTW91c2VFdmVudCwgaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNsaWNrVHJlZVRvZ2dsZShldmVudCwgaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0SXRlbShldmVudCwgaXRlbSk7XHJcbiAgICAgICAgdGhpcy5yb3dEYmxjbGljay5lbWl0KHsgZGF0YTogaXRlbS5kYXRhIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgc2Nyb2xscyB0aGUgc2VsZWN0ZWQgaXRlbSBpbnRvIHRoZSB2aWV3IGFuZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcodHJ5VG9Nb3ZlVG9DZW50ZXI/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGlvbkRhdGEgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRGF0YSA9IHRoaXMuc2VsZWN0aW9uLmRhdGE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRhdGEgPSB0aGlzLnNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRhdGEgPSB0aGlzLnNlbGVjdGlvblswXS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRhdGEgPSB0aGlzLnNlbGVjdGlvblswXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbkRhdGEpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS5kYXRhID09PSBzZWxlY3Rpb25EYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyeVRvTW92ZVRvQ2VudGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsRGF0YUVsZW1lbnQgPSB0aGlzLnNjcm9sbERhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1FbGVtZW50ID0gc2Nyb2xsRGF0YUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNtZS10YWJsZS1yb3cuc21lLXRhYmxlLXJvdy1zZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRlbUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1Ub3AgPSBzZWxlY3RlZEl0ZW1FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNjcm9sbERhdGFFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcCA9IHNlbGVjdGVkSXRlbVRvcCArIHNjcm9sbERhdGFFbGVtZW50Lm9mZnNldFRvcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8gMjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIGNsaWNraW5nIGJlaGF2aW9yIG9mIGNoZWNrYm94LlxyXG4gICAgICogTXVsdGlwbGUgc2VsZWN0aW9uIGJlaGF2aW9yIGlzIGhhcHBlbmluZyBoZXJlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25JdGVtQ2hlY2tCb3hDbGlja2VkKGl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgaXNGcm9tS2V5Ym9hcmQ/OiBib29sZWFuKSB7XHJcbiAgICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgdW5jaGVja2VkLCBuZWVkIHRvIHNldCBhY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCB0byAtMSB0aGVuIHRoaXMgaXRlbSB3b24ndCBiZSBoaWdobGlnaHRlZCBpbiB0aGUgVUkuXHJcbiAgICAgICAgaWYgKGl0ZW0udHlwZSAhPT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLlRyZWVOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGl0ZW0ubm9kZSwgIWl0ZW0ubm9kZS5zZWxlY3RlZCwgZmFsc2UsICF0aGlzLmxpbmtQYXJlbnRDaGlsZHJlblNlbGVjdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0ubm9kZS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZVNlbGVjdGVkLmVtaXQoeyBub2RlOiBpdGVtLm5vZGUgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNGcm9tS2V5Ym9hcmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgtMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSAmJiAhdGhpcy5lZGl0YWJsZSAmJiB0aGlzLmV4cGFuZFRyZWVOb2RlT25DaGVja2VkICYmIGl0ZW0uaGFzQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWNrVHJlZVRvZ2dsZShudWxsLCBpdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5pbmRleE9mKGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5wdXNoKGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHsgZGF0YTogaXRlbS5kYXRhIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dVbnNlbGVjdGVkLmVtaXQoeyBkYXRhOiBpdGVtLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zyb21LZXlib2FyZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KC0xKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbXMgPSB0aGlzLmZpbHRlcmVkSXRlbXMuZmlsdGVyKGN1cnJlbnRJdGVtID0+XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGN1cnJlbnRJdGVtLCB0aGlzLmdyb3VwQ29sdW1uLmZpZWxkKSA9PT0gaXRlbS5kYXRhKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihncm91cEl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1Vuc2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGdyb3VwSXRlbXNbaV0gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ucHVzaChncm91cEl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHsgZGF0YTogZ3JvdXBJdGVtc1tpXSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghc2VsZWN0ZWQgJiYgIWlzRnJvbUtleWJvYXJkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KC0xKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTmVlZCB0byByZWNyZWF0ZSB0aGUgXCJpbnRlcm5hbFNlbGVjdGlvblwiIGFycmF5IG90aGVyd2lzZSB0aGUgY2hhbmdlIGRldGVjdG9yIHdvbid0IGRldGVjdCB0aGUgY2hhbmdlXHJcbiAgICAgICAgLy8gc2luY2UgdGhlIGFycmF5J3Mgb3duIHJlZmVyZW5jZSBpcyBub3QgY2hhbmdlZC5cclxuICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5zbGljZSgwLCB0aGlzLmludGVybmFsU2VsZWN0aW9uLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5pbnRlcm5hbFNlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBcImNoZWNrIGFsbFwiIGNoZWNrYm94IGJlaGF2aW9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25BbGxJdGVtQ2hlY2tCb3hDbGlja2VkKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmludGVybmFsU2VsZWN0aW9uLmxlbmd0aCAhPT0gdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dVbnNlbGVjdGVkLmVtaXQoeyBkYXRhOiBpdGVtIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkU2VsZWN0ID0gIXRoaXMuc2hvdWxkQWxsSXRlbUNoZWNrQm94Q2hlY2tlZCgpO1xyXG4gICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihpdGVtLCBzaG91bGRTZWxlY3QpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLmludGVybmFsU2VsZWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gaXRlbSBpcyBzZWxlY3RlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzSXRlbVNlbGVjdGVkKGl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICghdGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgIT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gaXRlbS5kYXRhICYmIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihpdGVtLmRhdGEpICE9PSAtMTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbXMgPSB0aGlzLmZpbHRlcmVkSXRlbXMuZmlsdGVyKGN1cnJlbnRJdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoY3VycmVudEl0ZW0sIHRoaXMuZ3JvdXBDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpID09PSBpdGVtLmRhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGl0ZW0uZGF0YSA9PT0gdW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChncm91cEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5pbmRleE9mKGdyb3VwSXRlbXNbaV0pID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBpdGVtLm5vZGUgJiYgaXRlbS5ub2RlLnNlbGVjdGVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBpdGVtLmRhdGEgJiYgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5tYXAoY3VycmVudEl0ZW0gPT4gY3VycmVudEl0ZW0uZGF0YSkuaW5kZXhPZihpdGVtLmRhdGEpICE9PSAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgYSBncm91cCB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIGV4cGFuZGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNHcm91cEV4cGFuZGVkKGdyb3VwOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tncm91cF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIGFuZCBzZXRzIHRoZSB2aXJ0dWFsIGNvdW50LlxyXG4gICAgICogSXQgb25seSB3b3JrcyB3aGVuIFwibGF6eUxvYWRcIiBpcyB0cnVlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCB2aXJ0dWFsQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCB8fCB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHZpcnR1YWxDb3VudCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID49IDApIHtcclxuICAgICAgICAgICAgdGhpcy5pdGVtcyA9IEFycmF5KHZhbHVlKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zW2ldID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHJlc29sdmVzIHRoZSBvYmplY3QgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGF0aCB3aXRoIG11bHRpcGxlIGxldmVscyBvZiBwcm9wZXJ0aWVzLlxyXG4gICAgICogQW4gZXhhbXBsZSBvZiBwYXRoIGlzIFwibG9jYXRpb24uemlwQ29kZVwiLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzb2x2ZU9iamVjdFBhdGgob2JqOiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgaWYgKG9iaiAmJiBwYXRoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhdGhTZWdtZW50czogc3RyaW5nW10gPSBwYXRoLnNwbGl0KCcuJyk7XHJcbiAgICAgICAgICAgIGlmIChwYXRoU2VnbWVudHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqW3BhdGhdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY3VycmVudE9iaiA9IG9iajtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoU2VnbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRPYmogPSBjdXJyZW50T2JqW3BhdGhTZWdtZW50c1tpXV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudE9iaiA9PT0gdW5kZWZpbmVkIHx8IGN1cnJlbnRPYmogPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudE9iajtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgcmV0dXJucyB0aGUgYWN0aXZlIHJlbmRlcmVkIGl0ZW0gaW5kZXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoaW5wdXQ6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggPSBpbnB1dCA+PSAwID8gaW5wdXQgOiAtMTtcclxuICAgICAgICB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgcmV0dXJucyB0aGUgYWN0aXZlIGZvY3VzZWQgaXRlbSBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID4gLTEgPyB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggOiB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgoaW5kZXg6IG51bWJlciwgZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRvIGhlYWQgb2YgdGhlIHdob2xlIHJlbmRlcmVkIGl0ZW0gbGlzdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vdmVUb0hlYWRPZlJlbmRlcmVkSXRlbXMoZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RPckZvY3VzUm93QnlJbmRleCgwLCBkb1NlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0byBwcmV2aW91cyBwYWdlIG9mIHRoZSByZW5kZXJlZCBpdGVtIGxpc3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtb3ZlVG9QcmV2aW91c1BhZ2VPZlJlbmRlcmVkSXRlbXMoZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBkb1NlbGVjdGlvbiA/IHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSA6IHRoaXMuZ2V0QWN0aXZlRm9jdXNlZEl0ZW1JbmRleCgpO1xyXG4gICAgICAgIGxldCBuZXdJbmRleCA9IDA7XHJcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgbmV3SW5kZXggPSBpbmRleCAtIE1hdGgucm91bmQodGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgobmV3SW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRvIHByZXZpb3VzIGl0ZW0gaW4gdGhlIHJlbmRlcmVkIGl0ZW0gbGlzdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vdmVUb1ByZXZpb3VzUmVuZGVyZWRJdGVtKGRvU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZG9TZWxlY3Rpb24gPyB0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCkgOiB0aGlzLmdldEFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgoKTtcclxuXHJcbiAgICAgICAgbGV0IG5ld0luZGV4ID0gMDtcclxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICBuZXdJbmRleCA9IGluZGV4IC0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgobmV3SW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRvIG5leHQgaXRlbSBpbiB0aGUgcmVuZGVyZWQgaXRlbSBsaXN0LlxyXG4gICAgICogQHBhcmFtIGRvU2VsZWN0aW9uIGlmIHRydWUgd2lsbCBkbyBzZWxlY3Rpb24gYW5kIGZvY3VzLCBvdGhlcndpc2UgZm9jdXMgb25seVxyXG4gICAgICovXHJcblxyXG4gICAgcHVibGljIG1vdmVUb05leHRSZW5kZXJlZEl0ZW0oZG9TZWxlY3Rpb24gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBkb1NlbGVjdGlvbiA/IHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSA6IHRoaXMuZ2V0QWN0aXZlRm9jdXNlZEl0ZW1JbmRleCgpO1xyXG5cclxuICAgICAgICBsZXQgbmV3SW5kZXggPSAwO1xyXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXggKyAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RPckZvY3VzUm93QnlJbmRleChuZXdJbmRleCwgZG9TZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdG8gbmV4dCBwYWdlIG9mIHRoZSByZW5kZXJlZCBpdGVtIGxpc3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtb3ZlVG9OZXh0UGFnZU9mUmVuZGVyZWRJdGVtcyhkb1NlbGVjdGlvbjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGRvU2VsZWN0aW9uID8gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpIDogdGhpcy5nZXRBY3RpdmVGb2N1c2VkSXRlbUluZGV4KCk7XHJcbiAgICAgICAgbGV0IG5ld0luZGV4ID0gMDtcclxuICAgICAgICBuZXdJbmRleCA9IGluZGV4ICsgTWF0aC5yb3VuZCh0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdE9yRm9jdXNSb3dCeUluZGV4KG5ld0luZGV4LCBkb1NlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0byBlbmQgb2YgdGhlIHdob2xlIHJlbmRlcmVkIGxpc3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtb3ZlVG9FbmRPZlJlbmRlcmVkSXRlbXMoZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RPckZvY3VzUm93QnlJbmRleCh0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gMSwgZG9TZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0aXZhdGUgdGhlIHJlbmRlcmVkIGl0ZW0gYnkgY29uZGl0aW9uLlxyXG4gICAgICogQWN0aXZhdGUgZG9lc24ndCBtZWFuIHNlbGVjdC4gSXQganVzdCBpbmRpY2F0ZXMgd2hpY2ggaXRlbSBpcyBhY3RpdmUgdG8gcmVjZWl2ZWQgbW9yZSBvcGVyYXRpb25zIGVzcGVjaWFsbHkga2V5Ym9hcmQgb3BlcmF0aW9ucy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdGl2YXRlUmVuZGVyZWRJdGVtQnlDb25kaXRpb24oY29uZGl0aW9uOiAoaXRlbTogRGF0YVRhYmxlRGF0YUl0ZW0pID0+IGJvb2xlYW4sIGRvU2VsZWN0aW9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbih0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KHRoaXMucmVuZGVyZWRJdGVtc1tpXS5pbmRleCwgZG9TZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3RpdmF0ZSB0aGUgcmVuZGVyZWQgaXRlbSBieSBpbmRleC5cclxuICAgICAqIEFjdGl2YXRlIGRvZXNuJ3QgbWVhbiBzZWxlY3QuIEl0IGp1c3QgaW5kaWNhdGVzIHdoaWNoIGl0ZW0gaXMgYWN0aXZlIHRvIHJlY2VpdmVkIG1vcmUgb3BlcmF0aW9ucyBlc3BlY2lhbGx5IGtleWJvYXJkIG9wZXJhdGlvbnMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGluZGV4OiBudW1iZXIsIGRvU2VsZWN0aW9uOiBib29sZWFuLCBkb0ZvY3VzOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcclxuICAgICAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID4gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgaW5kZXggPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkb1NlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KGluZGV4KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggPSBpbmRleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkSXRlbXMgJiYgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlICE9PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uXHJcbiAgICAgICAgICAgICYmIHRoaXMuc2VsZWN0SXRlbVdoZW5OYXZpZ2F0aW5nV2l0aEtleWJvYXJkICYmIGRvU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShudWxsLCB0aGlzLnJlbmRlcmVkSXRlbXNbaW5kZXhdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCB0b3RhbFNjcm9sbGFibGVTcGFjZSA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgdG90YWxTY3JvbGxhYmxlSXRlbUxlbmd0aCA9IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJlZEl0ZW1TdGFydEluZGV4ID0gdG90YWxTY3JvbGxhYmxlSXRlbUxlbmd0aCAqIHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wIC8gdG90YWxTY3JvbGxhYmxlU3BhY2VcclxuICAgICAgICAgICAgKyB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQ7XHJcblxyXG4gICAgICAgIGxldCBuZXdSZW5kZXJJdGVtU3RhcnRJbmRleCA9IC0xO1xyXG4gICAgICAgIGlmIChpbmRleCA+PSBNYXRoLmZsb29yKGN1cnJlbnRSZW5kZXJlZEl0ZW1TdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0IC0gMSkpIHtcclxuICAgICAgICAgICAgbmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggPSBpbmRleCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCArIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW5kZXggPD0gY3VycmVudFJlbmRlcmVkSXRlbVN0YXJ0SW5kZXgpIHtcclxuICAgICAgICAgICAgbmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggPSBpbmRleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIG5ld1JlbmRlckl0ZW1TdGFydEluZGV4ID49IDAsIGl0IG1lYW5zIHdoZW4gdGhlIHJlbmRlcmVkIGl0ZW0gaXMgYWN0aXZhdGVkLCBpdCB0cmlnZ2VycyBzY3JvbGxpbmcgaW4gdGhlIGxpc3QuXHJcbiAgICAgICAgaWYgKG5ld1JlbmRlckl0ZW1TdGFydEluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgLy8gRmlndXJlIG91dCB3aGF0J3MgdGhlIG5ldyBzY3JvbGx0b3AgYmFzZWQgb24gbmV3IHJlbmRlcmVkSXRlbVN0YXJ0SW5kZXguXHJcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IE1hdGguZmxvb3IodG90YWxTY3JvbGxhYmxlU3BhY2UgKiAobmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggLyB0b3RhbFNjcm9sbGFibGVJdGVtTGVuZ3RoKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5oYXNMb25nTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgaXQncyBhIGxvbmcgbGlzdCwgd2hpY2ggbWVhbnMgb25lIHBpeGVsIG9mIHNjcm9sbGJhciBtb3ZlbWVudCBjYXVzZXMgbW9yZSB0aGFuIG9uZSBzY3JlZW4gb2YgdGhlIGxpc3Qgc2Nyb2xsaW5nLFxyXG4gICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCB0aGUgdHJ1bmNhdGVkIHJlbmRlcmVkIGl0ZW0gc3RhcnQgaW5kZXguXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0cnVuY2F0ZWRTdGFydEluZGV4ID0gTWF0aC5mbG9vcihzY3JvbGxUb3AgLyB0b3RhbFNjcm9sbGFibGVTcGFjZSAqIHRvdGFsU2Nyb2xsYWJsZUl0ZW1MZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBhY3R1YWwgcG9zaXRpb24gb2YgdGhlIGFjdGl2YXRlZCByZW5kZXJlZCBpdGVtIGxpc3QgY2FuIGJlIG1vcmUgdGhhbiBvbmUgc2NyZWVuIGJlbG93LFxyXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgbmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggYW5kIHRydW5jYXRlZFN0YXJ0SW5kZXguXHJcbiAgICAgICAgICAgICAgICAvLyBUaGVuIGxhdGVyIHdoZW4gd2UgcmVuZGVyIHRoZSBkYXRhIHRhYmxlIGl0ZW1zIGluIHRoZSB2aWV3IHBvcnQsIHdlIHdpbGwgdXNlIHRoZSBvZmZzZXQgdG8gYWRqdXN0XHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgaXRlbSBsaXN0IHRvIG1ha2Ugc3VyZSB0aGUgYWN0dWFsIGFjdGl2YXRlZCByZW5kZXJlZCBpdGVtIGNhbiBzaG93IHVwIGluIHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQgPSBuZXdSZW5kZXJJdGVtU3RhcnRJbmRleCAtIHRydW5jYXRlZFN0YXJ0SW5kZXg7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggKyB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQgKyB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnRcclxuICAgICAgICAgICAgICAgICAgICA+IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFNldCB0aGUgc2Nyb2xsdG9wIGFuZCByZS1jYWxjdWF0ZSB0aGUgdmlldyBwb3J0LlxyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZG9Gb2N1cykge1xyXG4gICAgICAgICAgICBpZiAoZG9TZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNSb3dCeUluZGV4KGluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRyeVRvRm9jdXNSb3dCeUluZGV4KGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdyhpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFyaWFFeHBhbmRlZEF0dHJpYnV0ZVZhbHVlKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICBjb25zdCBpc0dyb3VwRXhwYW5kZWQgPSB0aGlzLmlzR3JvdXBFeHBhbmRlZChyZW5kZXJlZEl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChpc0dyb3VwRXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNHcm91cEV4cGFuZGVkLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLlRyZWVOb2RlICYmICFyZW5kZXJlZEl0ZW0ubm9kZS5pc0xlYWYpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gKCEhKHJlbmRlcmVkSXRlbS5ub2RlICYmIHJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkKSkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFkZGl0aW9uYWxTY3JlZW5SZWNvcmRlckNvbnRlbnQocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuICAgICAgICBzd2l0Y2ggKHJlbmRlcmVkSXRlbS50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5UcmVlTm9kZTpcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1Yk5vZGVDb3VudCA9IHJlbmRlcmVkSXRlbS5ub2RlLmNoaWxkcmVuID8gcmVuZGVyZWRJdGVtLm5vZGUuY2hpbGRyZW4ubGVuZ3RoIDogMDtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN1Yk5vZGVDb3VudCA9PT0gMSA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5vbmVTdWJOb2RlSW5UcmVlTm9kZVxyXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLm5TdWJOb2Rlc0luVHJlZU5vZGUuZm9ybWF0KHN1Yk5vZGVDb3VudCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyOlxyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBJdGVtQ291bnQgPSB0aGlzLmdyb3VwS2V5c1tyZW5kZXJlZEl0ZW0uZGF0YV0ubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZ3JvdXBJdGVtQ291bnQgPT09IDEgPyB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwub25lSXRlbUluR3JvdXBcclxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5uSXRlbXNJbkdyb3VwLmZvcm1hdChncm91cEl0ZW1Db3VudCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRWRpdGFibGVEYXRhQ2hhbmdlZChyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgZmllbGQ6IHN0cmluZykge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0YWJsZURhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+cmVuZGVyZWRJdGVtLmRhdGE7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWVkaXRhYmxlRGF0YUl0ZW0uaXNOZXdSb3cgJiYgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuYWRkZWRJdGVtcy5pbmRleE9mKGVkaXRhYmxlRGF0YUl0ZW0uY29udGVudCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkSXRlbUluZGV4ID0gdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQudXBkYXRlZEl0ZW1zLmluZGV4T2YoZWRpdGFibGVEYXRhSXRlbS5jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkSXRlbUluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LnVwZGF0ZWRJdGVtcy5zcGxpY2UodXBkYXRlZEl0ZW1JbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsaWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBlZGl0YWJsZURhdGFJdGVtLnZhbGlkYXRpb25BbGVydHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzW3Byb3BlcnR5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBlZGl0YWJsZURhdGFJdGVtLnZhbGlkYXRpb25BbGVydHNbcHJvcGVydHldLnZhbGlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldC51cGRhdGVkSXRlbXMucHVzaChlZGl0YWJsZURhdGFJdGVtLmNvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VzZXRVcGRhdGVkLmVtaXQodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlc2V0RWRpdGFibGVEYXRhQ2hhbmdlc2V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0ID0ge1xyXG4gICAgICAgICAgICBhZGRlZEl0ZW1zOiBbXSxcclxuICAgICAgICAgICAgdXBkYXRlZEl0ZW1zOiBbXSxcclxuICAgICAgICAgICAgZGVsZXRlZEl0ZW1zOiBbXVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VzZXRVcGRhdGVkLmVtaXQodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblZhbGlkYXRpb25BbGVydEhhbmRsZXIocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sIGZpZWxkOiBzdHJpbmcsIGFsZXJ0OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBlZGl0YWJsZURhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+cmVuZGVyZWRJdGVtLmRhdGE7XHJcbiAgICAgICAgZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzW2ZpZWxkXSA9IGFsZXJ0O1xyXG5cclxuICAgICAgICByZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdC5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uZmllbGQgJiYgZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzW2NvbHVtbi5maWVsZF0gJiYgIWNvbHVtbi5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgIHJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4uaGVhZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0OiBlZGl0YWJsZURhdGFJdGVtLnZhbGlkYXRpb25BbGVydHNbY29sdW1uLmZpZWxkXVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBoYXMgdmFsaWRhdGlvbiBlcnJvciBpZiB0aGVyZSBhcmUgYW55IHZhbGlkYXRpb24gYWxlcnRzXHJcbiAgICBwdWJsaWMgaGFzVmFsaWRhdGlvbkVycm9yKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0Lmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJvbGVBdHRyaWJ1dGVGb3JUcmVlVGFibGVSb3cocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldFJvbGVBdHRyaWJ1dGVGb3JUcmVlVGFibGVSb3cocmVuZGVyZWRJdGVtLCB0aGlzLnNob3dIZWFkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSb2xlQXR0cmlidXRlRm9yVGFibGVSb3dDZWxsKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRSb2xlQXR0cmlidXRlRm9yVGFibGVSb3dDZWxsKHJlbmRlcmVkSXRlbSwgdGhpcy5zaG93SGVhZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QXJpYVNvcnRBdHRyaWJ1dGVWYWx1ZShjb2x1bW46IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0QXJpYVNvcnRBdHRyaWJ1dGVWYWx1ZShjb2x1bW4pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhclNlbGVjdGlvbihrZWVwSGlnaGxpZ2h0RnJvbVJvdz86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gW107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFrZWVwSGlnaGxpZ2h0RnJvbVJvdykge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodEZyb21Sb3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQERlYm91bmNlKClcclxuICAgIHB1YmxpYyBjaGVja0lzVGFibGVSZW5kZXJlZE9uUGhvbmVEb3duV2l0aE1pbkhlaWdodChzaG91bGRFbWl0PzogYm9vbGVhbiwgZm9yY2VMYXlvdXQ/OiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuRGF0YVRhYmxlUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXJcclxuICAgICAgICAgICAgLmNoZWNrSXNUYWJsZVJlbmRlcmVkT25QaG9uZURvd25XaXRoTWluSGVpZ2h0KHRoaXMuaGVhZGVyVGFibGVFbGVtZW50LCB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRW1pdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUYWJsZVJlbmRlcmVkV2l0aE1pbkhlaWdodFBob25lRG93bi5lbWl0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChmb3JjZUxheW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25MYXlvdXRDaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvdWxkRW1pdCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzVGFibGVSZW5kZXJlZFdpdGhNaW5IZWlnaHRQaG9uZURvd24uZW1pdChmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZm9yY2VMYXlvdXQpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkxheW91dENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlSGlnaGxpZ2h0RnJvbVJvdygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KC0xKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmF2aWdhdGVCeVBhdGgocGF0aFNlY3Rpb25zOiBzdHJpbmdbXSxcclxuICAgICAgICBnZXROb2RlTGFiZWxIYW5kbGVyOiAobm9kZTogVHJlZU5vZGVEYXRhSXRlbSkgPT4gc3RyaW5nLFxyXG4gICAgICAgIG9uVGFza0ZpbmlzaGVkSGFuZGxlcj86IChmb3VuZDogYm9vbGVhbikgPT4gdm9pZCxcclxuICAgICAgICBpc05vZGVMb2FkaW5nSGFuZGxlcj86IChub2RlOiBUcmVlTm9kZURhdGFJdGVtKSA9PiBib29sZWFuLFxyXG4gICAgICAgIHRpbWVvdXQgPSA1MDAwLFxyXG4gICAgICAgIG9ubHlUcmlnZ2VyU2VsZWN0aW9uRm9yTGFzdE5vZGU/OiBib29sZWFuLCBtYXRjaEZpcnN0QUZldz86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sgJiYgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suaXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm9kZSBuYXZpZ2F0aW9uIGlzIGluIHByb2dyZXNzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sgPSB7XHJcbiAgICAgICAgICAgIHBhdGhTZWN0aW9uczogcGF0aFNlY3Rpb25zLFxyXG4gICAgICAgICAgICBpc1J1bm5pbmc6IHRydWUsXHJcbiAgICAgICAgICAgIGN1cnJlbnRQYXRoU2VjdGlvbkluZGV4OiAwLFxyXG4gICAgICAgICAgICBjdXJyZW50UmVuZGVyZWRJdGVtSW5kZXg6IDAsXHJcbiAgICAgICAgICAgIG9uVGFza0ZpbmlzaGVkOiBvblRhc2tGaW5pc2hlZEhhbmRsZXIsXHJcbiAgICAgICAgICAgIGN1cnJlbnRQYXRoU2VjdGlvblN0YXJ0VGltZTogbmV3IERhdGUoKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuaGFuZGxlUGF0aE5hdmlnYXRpb24oXHJcbiAgICAgICAgICAgIGdldE5vZGVMYWJlbEhhbmRsZXIsXHJcbiAgICAgICAgICAgIGlzTm9kZUxvYWRpbmdIYW5kbGVyLFxyXG4gICAgICAgICAgICB0aW1lb3V0LFxyXG4gICAgICAgICAgICBvbmx5VHJpZ2dlclNlbGVjdGlvbkZvckxhc3ROb2RlLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBtYXRjaEZpcnN0QUZldyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFsbEl0ZW1DaGVja0JveEFyaWFMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNob3VsZEFsbEl0ZW1DaGVja0JveENoZWNrZWQoKSA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC51bnNlbGVjdEFsbEl0ZW1zXHJcbiAgICAgICAgICAgIDogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLnNlbGVjdEFsbEl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRJbml0aWFsSG9zdENsYXNzZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpLmNvbmNhdChbXHJcbiAgICAgICAgICAgICdzbWUtZGF0YS10YWJsZSdcclxuICAgICAgICBdKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVBhdGhOYXZpZ2F0aW9uKGdldE5vZGVMYWJlbEhhbmRsZXI6IChub2RlOiBUcmVlTm9kZURhdGFJdGVtKSA9PiBzdHJpbmcsXHJcbiAgICAgICAgaXNOb2RlTG9hZGluZ0hhbmRsZXI/OiAobm9kZTogVHJlZU5vZGVEYXRhSXRlbSkgPT4gYm9vbGVhbixcclxuICAgICAgICB0aW1lb3V0PzogbnVtYmVyLCBvbmx5VHJpZ2dlclNlbGVjdGlvbkZvckxhc3ROb2RlPzogYm9vbGVhbixcclxuICAgICAgICBsYXN0Rm91bmROb2RlPzogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCBtYXRjaEZpcnN0QUZldz86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2hvdWxkQ29udGludWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGxldCBmb3VuZE5vZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGxldCBuZWFyTWF0Y2hOb2RlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4IDwgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sucGF0aFNlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UmVuZGVyZWRJdGVtSW5kZXg7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQ29udGludWUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBnZXROb2RlTGFiZWxIYW5kbGVyKHRoaXMucmVuZGVyZWRJdGVtc1tpXS5ub2RlKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwgPT09XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5wYXRoU2VjdGlvbnNbdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uSW5kZXhdLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUuZXhwYW5kZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25JbmRleCA8IHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLnBhdGhTZWN0aW9ucy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlja1RyZWVUb2dnbGUoZXZlbnQsIHRoaXMucmVuZGVyZWRJdGVtc1tpXSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE5vZGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb25seVRyaWdnZXJTZWxlY3Rpb25Gb3JMYXN0Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RGb3VuZE5vZGUgPSB0aGlzLnJlbmRlcmVkSXRlbXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4ID09PSB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5wYXRoU2VjdGlvbnMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmlzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbiAhPT0gdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG51bGwsIHRoaXMucmVuZGVyZWRJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLm9uVGFza0ZpbmlzaGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLm9uVGFza0ZpbmlzaGVkKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRDb250aW51ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOb2RlTG9hZGluZ0hhbmRsZXIgfHwgIWlzTm9kZUxvYWRpbmdIYW5kbGVyKHRoaXMucmVuZGVyZWRJdGVtc1tpXS5ub2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFJlbmRlcmVkSXRlbUluZGV4ID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uU3RhcnRUaW1lID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmVhck1hdGNoTm9kZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLnBhdGhTZWN0aW9uc1t0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25JbmRleF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYWJlbC5pbmRleE9mKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLnBhdGhTZWN0aW9uc1tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uSW5kZXhdLnRvTG9jYWxlTG93ZXJDYXNlKCkpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVhck1hdGNoTm9kZSA9IHRoaXMucmVuZGVyZWRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRSZW5kZXJlZEl0ZW1JbmRleCA+IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMucmVuZGVyZWRJdGVtc1tpXS5kZXB0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UmVuZGVyZWRJdGVtSW5kZXggLSAxXS5kZXB0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENvbnRpbnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kTm9kZSAmJiBub3cuZ2V0VGltZSgpIC0gdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uU3RhcnRUaW1lLmdldFRpbWUoKSA+IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suaXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5vblRhc2tGaW5pc2hlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sub25UYXNrRmluaXNoZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lYXJNYXRjaE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0obnVsbCwgbmVhck1hdGNoTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxTZWxlY3RlZEl0ZW1JbnRvVmlldyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdEZvdW5kTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShudWxsLCBsYXN0Rm91bmROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFNlbGVjdGVkSXRlbUludG9WaWV3KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQYXRoTmF2aWdhdGlvbihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5vZGVMYWJlbEhhbmRsZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05vZGVMb2FkaW5nSGFuZGxlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5VHJpZ2dlclNlbGVjdGlvbkZvckxhc3ROb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEZvdW5kTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoRmlyc3RBRmV3KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIDIwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplVUkoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50ZW1wUm93RWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzb3J0SXRlbXMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtcyAmJiB0aGlzLnNvcnRDb2x1bW4pIHtcclxuICAgICAgICAgICAgY29uc3QgY29tcGFyZUZ1bmN0aW9uID0gdGhpcy5zb3J0Q29sdW1uLnNvcnRhYmxlID09PSAnY3VzdG9tJyA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvcnRDb2x1bW4uY29tcGFyZUZ1bmN0aW9uLmJpbmQodGhpcykgOiB0aGlzLmRlZmF1bHRTb3J0Q29tcGFyZUZ1bmN0aW9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNvcnREaXJlY3Rpb24gPSB0aGlzLnNvcnRDb2x1bW4uc29ydE1vZGUgPT09IERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZCA/IDEgOiAtMTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5ncm91cENvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVkaXRhYmxlTmV3Um93UmVuZGVyZWRJdGVtID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVkaXRhYmxlICYmIHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXMubGFzdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlZEl0ZW0uZGF0YS5pc05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZU5ld1Jvd1JlbmRlcmVkSXRlbSA9IHJlbmRlcmVkSXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnNwbGljZSh0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gMSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBzaG91bGRGYWxsQmFja1RvRGVmYXVsdFNvcnQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxhenlMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbHJlYWR5TG9hZGVkQWxsRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVuZGVyZWRJdGVtc1tpXSB8fCAhdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5TG9hZGVkQWxsRGF0YSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvcnRDb2x1bW4gPT09IHRoaXMucHJldmlvdXNTb3J0Q29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSB0aGlzLnJlbmRlcmVkSXRlbXMucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbHJlYWR5TG9hZGVkQWxsRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc1tpXSA9IHsgaW5kZXg6IGksIGRhdGE6IHVuZGVmaW5lZCwgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Ob3JtYWwgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEZhbGxCYWNrVG9EZWZhdWx0U29ydCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5kb0N1c3RvbVNvcnQuZW1pdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBzb3J0RGlyZWN0aW9uLCBmaWVsZDogdGhpcy5zb3J0Q29sdW1uLmZpZWxkLCBmYWxsQmFja1RvRGVmYXVsdFNvcnQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkRmFsbEJhY2tUb0RlZmF1bHRTb3J0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRmFsbEJhY2tUb0RlZmF1bHRTb3J0IHx8IHRoaXMuZG9DdXN0b21Tb3J0Lm9ic2VydmVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IHRoaXMucmVuZGVyZWRJdGVtcy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gKiBjb21wYXJlRnVuY3Rpb24oYS5kYXRhLCBiLmRhdGEsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IHRoaXMucmVuZGVyZWRJdGVtcy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gKiBjb21wYXJlRnVuY3Rpb24oYS5kYXRhLmNvbnRlbnQsIGIuZGF0YS5jb250ZW50LCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgaW4gXCJlbHNlXCIgYmxvY2sgaGFuZGxlcyB0aGUgc29ydCBpbiB0aGUgdHJlZSBub2Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQgc29ydHMgdGhlIHRyZWUgbm9kZXMgb25seSBpbiBpdHMgb3duIHRyZWUgbGV2ZWwuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgbm9kZXMgaGF2ZSBzdWIgbm9kZXMgYW5kIG90aGVyIG5vZGVzIGRvbid0IGhhdmUgc3ViIG5vZGVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgcHV0IHRoZSBub2RlcyB3aXRoIHN1YiBub2RlcyBpbiBmcm9udCBvZiB0aGUgbm9kZXMgd2l0aG91dCBzdWIgbm9kZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gW3RoaXMuc2hhZG93VHJlZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2goY3VycmVudE5vZGUuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5zcGxpY2Uoc3RhY2subGVuZ3RoIC0gMSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBjdXJyZW50Tm9kZS5jaGlsZHJlbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgY29tcGFyZSByZXN1bHQgYWJvdXQgMSBvciAtMSBpcyByZXZlcnNlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSBpZiBhIGlzIGdyZWF0ZXIgdGhhbiBiLCAxIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiAtMS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIGJlY2F1c2UgdGhvc2Ugbm9kZXMgYXJlIHdlbnQgdGhvdWdoIGluIHRoZSBzdGFjayB3aXRoIGlzIEZJRk8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhlIG9yZGVyIGlzIHJldmVyc2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvcnRDb2x1bW4gPT09IHRoaXMuYWN0dWFsQ29sdW1uc1swXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5kYXRhLmhhc0NoaWxkcmVuICYmICFiLmRhdGEuaGFzQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhLmRhdGEuaGFzQ2hpbGRyZW4gJiYgYi5kYXRhLmhhc0NoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGEuZGF0YS5kYXRhLCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiVmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGIuZGF0YS5kYXRhLCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGJWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBiVmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtc29ydERpcmVjdGlvbiAqIGNvbXBhcmVGdW5jdGlvbihhLmRhdGEuZGF0YSwgYi5kYXRhLmRhdGEsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlZGl0YWJsZU5ld1Jvd1JlbmRlcmVkSXRlbSAmJiB0aGlzLmVkaXRhYmxlQXV0b05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcy5wdXNoKGVkaXRhYmxlTmV3Um93UmVuZGVyZWRJdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBoYW5kbGVzIHRoZSBzb3J0aW5nIHdoZW4gZ3JvdXBpbmcgaXMgZW5hYmxlZC5cclxuICAgICAgICAgICAgICAgIC8vIEl0IHNvcnRzIHRoZSBncm91cCBpdGVtcyBpbiBlYWNoIG9mIHRoZSBncm91cC5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFJlbmRlcmVkSXRlbXM6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdID0gW107XHJcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBlZFJlbmRlcmVkSXRlbXM6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwZWRSZW5kZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVuZGVyZWRJdGVtcyA9IGdyb3VwZWRSZW5kZXJlZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29ydERpcmVjdGlvbiAqIGNvbXBhcmVGdW5jdGlvbihhLmRhdGEsIGIuZGF0YSwgdGhpcy5zb3J0Q29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbmRlcmVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRSZW5kZXJlZEl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRSZW5kZXJlZEl0ZW1zLnB1c2godGhpcy5yZW5kZXJlZEl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbmRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVuZGVyZWRJdGVtcy5wdXNoKHRoaXMucmVuZGVyZWRJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwZWRSZW5kZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbmRlcmVkSXRlbXMgPSBncm91cGVkUmVuZGVyZWRJdGVtcy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3J0RGlyZWN0aW9uICogY29tcGFyZUZ1bmN0aW9uKGEuZGF0YSwgYi5kYXRhLCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZW5kZXJlZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZFJlbmRlcmVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IHNvcnRlZFJlbmRlcmVkSXRlbXM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhCeVNlbGVjdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlZmF1bHRTb3J0Q29tcGFyZUZ1bmN0aW9uKGE6IERhdGFUYWJsZURhdGFJdGVtLCBiOiBEYXRhVGFibGVEYXRhSXRlbSwgZmllbGQ6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XHJcblxyXG4gICAgICAgIGlmICghYSAmJiAhYikge1xyXG4gICAgICAgICAgICByZXN1bHQgPSAwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWEgJiYgYikge1xyXG4gICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoYSAmJiAhYikge1xyXG4gICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgYVZhbHVlID0gdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChhLCBmaWVsZCk7XHJcbiAgICAgICAgICAgIGxldCBiVmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGIsIGZpZWxkKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFUeXBlID0gdHlwZW9mIGFWYWx1ZTtcclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICAgICAgYVZhbHVlID0gYVZhbHVlID09PSAwID8gYVZhbHVlIDogKGFWYWx1ZSB8fCBOdW1iZXIuTUlOX1ZBTFVFKTtcclxuICAgICAgICAgICAgICAgIGJWYWx1ZSA9IGJWYWx1ZSA9PT0gMCA/IGJWYWx1ZSA6IChiVmFsdWUgfHwgTnVtYmVyLk1JTl9WQUxVRSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFWYWx1ZSA+IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFWYWx1ZSA8IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYVZhbHVlID0gYVZhbHVlICYmIGFWYWx1ZS50b1N0cmluZyAmJiBhVmFsdWUudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpIHx8ICcnO1xyXG4gICAgICAgICAgICAgICAgYlZhbHVlID0gYlZhbHVlICYmIGFWYWx1ZS50b1N0cmluZyAmJiBiVmFsdWUudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpIHx8ICcnO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHdlIGRvIG5hdHVyYWwgc29ydCBoZXJlLlxyXG4gICAgICAgICAgICAgICAgLy8gQmFzZWQgb24gc2ltcGxlIHN0cmluZyBjb21wYXJpc29uLCBcImExMDBcIixcImEyMFwiLFwiYTNcIiB3aWxsIGJlIHNvcnRlZCBhcyBcImExMDBcIixcImEyMFwiLFwiYTNcIi5cclxuICAgICAgICAgICAgICAgIC8vIEJ1dCBiYXNlZCBvbiBuYXR1cmFsIHNvcnQsIHRoZXkgd2lsbCBiZSBzb3J0ZWQgYXMgXCJhM1wiLFwiYTIwXCIsXCJhMTAwXCIuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZU5hdHVyYWxTb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNOdW1iZXIgPSAodGV4dDogc3RyaW5nKSA9PiB0ZXh0ID49ICcwJyAmJiB0ZXh0IDw9ICc5JztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCAxLCBmaWd1cmUgb3V0IHRoZSBjb21tb24gcGFydCBvZiAyIHN0cmluZ3MuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBhVmFsdWUubGVuZ3RoICYmIGluZGV4IDwgYlZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVZhbHVlW2luZGV4XSAhPT0gYlZhbHVlW2luZGV4XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgMiwgaWYgdGhlIHJlc3QgcGFydCBvZiBlYWNoIHN0cmluZyBzdGFydHMgd2l0aCBhIG51bWJlciwgcGFyc2UgdGhlIHJlc3QgcGFydCBpbnRvIGZsb2F0LlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlRmxvYXQgZnVuY3Rpb24gaXMgdmVyeSBkdXJhYmxlLCBpdCBjYW4gcGFyc2UgXCIxLjVhYmNcIiBhcyBcIjEuNVwiIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgdGhhdCB0aGUgcmVzdCBwYXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHN0cmluZyBpcyBtaXhlZCB3aXRoIG51bWJlcnMgYW5kIGxldHRlcnMuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3QgcGFydCBvZiBlYWNoIHN0cmluZyBkb2Vzbid0IHN0YXJ0IHdpdGggYSBudW1iZXIsIHRoZW4gZG9uJ3QgZG8gbmF0dXJhbCBzb3J0LCBqdXN0IGRvIG5vcm1hbCBzdHJpbmcgc29ydC5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOdW1iZXIoYVZhbHVlW2luZGV4XSkgJiYgaXNOdW1iZXIoYlZhbHVlW2luZGV4XSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYU51bWJlciA9IHBhcnNlRmxvYXQoYVZhbHVlLnN1YnN0cihpbmRleCwgYVZhbHVlLmxlbmd0aCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiTnVtYmVyID0gcGFyc2VGbG9hdChiVmFsdWUuc3Vic3RyKGluZGV4LCBiVmFsdWUubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhTnVtYmVyID4gYk51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhTnVtYmVyIDwgYk51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVZhbHVlID4gYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFWYWx1ZSA8IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhVmFsdWUgPiBiVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFWYWx1ZSA8IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhc1ZlcnRpY2FsT3ZlcmZsb3coKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgPiB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhbGlnblNjcm9sbEJhcigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBoYXNWZXJ0aWNhbE92ZXJmbG93ID0gdGhpcy5oYXNWZXJ0aWNhbE92ZXJmbG93KCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVNjcm9sbGJhcldpZHRoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChoYXNWZXJ0aWNhbE92ZXJmbG93ICE9PSB0aGlzLmN1cnJlbnRIYXNWZXJ0aWNhbE92ZXJmbG93ICYmIHRoaXMuaGVhZGVyVGFibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChoYXNWZXJ0aWNhbE92ZXJmbG93KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gJ2NhbGMoMTAwJSAtICcgKyB0aGlzLmNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aCArICdweCknO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnJpZ2h0ID0gdGhpcy5jYWxjdWxhdGVkU2Nyb2xsYmFyV2lkdGggKyAncHgnO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5yaWdodCA9ICcwcHgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VycmVudEhhc1ZlcnRpY2FsT3ZlcmZsb3cgPSBoYXNWZXJ0aWNhbE92ZXJmbG93O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlU2Nyb2xsYmFyV2lkdGgoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoc2Nyb2xsRGl2KTtcclxuICAgICAgICBzY3JvbGxEaXYuY2xhc3NOYW1lID0gJ3NtZS1sYXlvdXQtYWJzb2x1dGUgc21lLXBvc2l0aW9uLXN0cmV0Y2ggc21lLWFycmFuZ2Utb3ZlcmZsb3ctc2Nyb2xsJztcclxuICAgICAgICBzY3JvbGxEaXYuc3R5bGUudG9wID0gJy05OTk5cHgnO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gc2Nyb2xsRGl2Lm9mZnNldFdpZHRoIC0gc2Nyb2xsRGl2LmNsaWVudFdpZHRoO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnJlbW92ZUNoaWxkKHNjcm9sbERpdik7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVkU2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxiYXJXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KHByZXZlbnRTY3JvbGxpbmc/OiBib29sZWFuLCBmb3JjZVVwZGF0ZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkICYmIHRoaXMucmVuZGVyZWRJdGVtcykge1xyXG4gICAgICAgICAgICAvLyBTY3JvbGwgY29udGFpbmVyIGlzIHRoZSBkaXYgdG8gcmVuZGVyIHRoZSB2aWV3IHBvcnQgb2YgdGhlIGRhdGEgdGFibGUgYW5kIHRvIHByb3ZpZGUgdGhlIHNjcm9sbCBiYXIuXHJcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZXMgaG93IG1hbnkgaXRlbXMgY2FuIGJlIHJlbmRlcmVkIGluIHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCA9IHRoaXMuc2Nyb2xsYWJsZVxyXG4gICAgICAgICAgICAgICAgPyBNYXRoLm1pbih0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoLCBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCAvIHRoaXMucm93SGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgOiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0U2Nyb2xsUGl4ZWxzID0gdGhpcy5kZWZhdWx0U2Nyb2xsUGVyY2VudGFnZSAqIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U2Nyb2xsUGl4ZWxzID0gTWF0aC5mbG9vcihkZWZhdWx0U2Nyb2xsUGl4ZWxzIC8gdGhpcy5yb3dIZWlnaHQpICogdGhpcy5yb3dIZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gMDtcclxuICAgICAgICAgICAgbGV0IGlzQXRMYXN0U2NyZWVuID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVuZGVyZWRJdGVtU3RhcnQgPSAwO1xyXG4gICAgICAgICAgICBsZXQgcmVuZGVyZWRJdGVtRW5kID0gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlVUlWaXJ0dWFsaXphdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzTG9uZ0xpc3QgJiYgcHJldmVudFNjcm9sbGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNjcm9sbFRvcCA9IChzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodCAtIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMuY3VycmVudFN0YXJ0SW5kZXhPZkl0ZW1JblZpZXdQb3J0IC8gKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSB0aGlzLmN1cnJlbnRTdGFydEluZGV4T2ZJdGVtSW5WaWV3UG9ydDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5kYXRhU2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGVzIHRoZSB3aGljaCBpdGVtIGlzIHRoZSBzdGFydGluZyBpdGVtIGluIHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGlkZWEgaGVyZSBpcyB0byBjYWxjdWxhdGUgdGhlIHBlcmNlbnRhZ2Ugb2YgaG93IGZhciB0aGUgc2Nyb2xsYmFyIG1vdmVkLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkaXN0YW5jZSB0aGUgc2Nyb2xsYmFyIGNhbiBtb3ZlIGlzIHRoZSB0b3RhbCBoZWlnaHQgb2YgdGhlIHNjcm9sbGJhciBtaW51cyB0aGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydC5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5mbG9vcih0aGlzLmRhdGFTY3JvbGxUb3ApICE9PSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFTY3JvbGxUb3AgPSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY3VyYXRlU3RhcnRJbmRleCA9ICh0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0KSAqIHRoaXMuZGF0YVNjcm9sbFRvcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvIChzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodCAtIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5mbG9vcihhY2N1cmF0ZVN0YXJ0SW5kZXggKyB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0ID4gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBdExhc3RTY3JlZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGFydEluZGV4T2ZJdGVtSW5WaWV3UG9ydCA9IHN0YXJ0SW5kZXg7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgc2hvcnQgYW5kIG5vIG5lZWQgdG8gaGF2ZSBzY3JvbGwgYmFyLCBqdXN0IHNpbXBseSBzZXQgdGhlIHN0YXJ0IGluZGV4IHRvIDAuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxIZWlnaHQgPD0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZW5kZXJlZEl0ZW1TdGFydCA9IHN0YXJ0SW5kZXggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgKiB0aGlzLmJ1ZmZlclJvd1JhdGU7XHJcbiAgICAgICAgICAgICAgICByZW5kZXJlZEl0ZW1FbmQgPSBNYXRoLmNlaWwoc3RhcnRJbmRleCArIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0ICogdGhpcy5idWZmZXJSb3dSYXRlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHNob3VsZExhenlMb2FkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5sYXp5TG9hZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBsb2dpYyBjYWxjdWxhdGVzIHdoaWNoIHBhcnQgb2YgZGF0YSBzaG91bGQgYmUgbG9hZGVkIHdpdGggdGhlIGxhenkgbG9hZGluZyBldmVudC5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGxhenlMb2FkU3RhcnQgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHJlbmRlcmVkSXRlbVN0YXJ0KSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgYWN0dWFsTGF6eUxvYWRTdGFydCA9IGxhenlMb2FkU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXp5TG9hZExlbmd0aCA9IE1hdGgubWluKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsIHJlbmRlcmVkSXRlbUVuZCkgLSBsYXp5TG9hZFN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgbGV0IGFjdHVhbExhenlMb2FkTGVuZ3RoID0gbGF6eUxvYWRMZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGxhenlMb2FkU3RhcnQ7IGkgPCBsYXp5TG9hZFN0YXJ0ICsgbGF6eUxvYWRMZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlckl0ZW1GbGFnID0gKCF0aGlzLnJlbmRlcmVkSXRlbXNbaV0gfHwgIXRoaXMucmVuZGVyZWRJdGVtc1tpXS5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZExhenlMb2FkICYmIHJlbmRlckl0ZW1GbGFnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZExhenlMb2FkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsTGF6eUxvYWRTdGFydCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRMYXp5TG9hZCAmJiAhcmVuZGVySXRlbUZsYWcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbExhenlMb2FkTGVuZ3RoID0gaSArIDEgLSBhY3R1YWxMYXp5TG9hZFN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhY3R1YWxMYXp5TG9hZExlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZExhenlMb2FkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZExhenlMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvcnRPcmRlciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydENvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc29ydENvbHVtbi5zb3J0TW9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydE9yZGVyID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRGF0YVRhYmxlU29ydE1vZGUuRGVzY2VuZDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0T3JkZXIgPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydE9yZGVyID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF6eUxvYWRFdmVudCA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGFjdHVhbExhenlMb2FkU3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDogYWN0dWFsTGF6eUxvYWRMZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaExvYWRpbmdEYXRhOiAoaXRlbXMsIGFsbEl0ZW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNbYWN0dWFsTGF6eUxvYWRTdGFydCArIGldID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGFjdHVhbExhenlMb2FkU3RhcnQgKyBpLCBkYXRhOiBpdGVtc1tpXSwgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Ob3JtYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVJdGVtSW5WaWV3UG9ydCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBzZXQgaW50ZXJuYWwgaXRlbXMgc28gdGhhdCB3ZSBjYW4gc2VsZWN0IGFsbCwgYW5kIHNvIHdlIGNhbiBkbyBmaWx0ZXJpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMgPSBhbGxJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NGaWx0ZXIoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIHJlZnJlc2ggdG8gbWFrZSB0aGUgY2hhbmdlcyByZWZsZWN0IG9uIFVJLCB3aWxsIG5vdCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgYWZ0ZXIgZmlyc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkLCB0aGUgc2hvdWxkTGF6eUxvYWQgd2lsbCBiZSBzZXQgdG8gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRPcmRlcjogc29ydE9yZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0RmllbGQ6IHRoaXMuc29ydENvbHVtbiA/IHRoaXMuc29ydENvbHVtbi5maWVsZCA6IHRoaXMuYWN0dWFsQ29sdW1ucyA/IHRoaXMuYWN0dWFsQ29sdW1uc1swXS5maWVsZCA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmdEYXRhLmVtaXQobGF6eUxvYWRFdmVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxMYXp5TG9hZExlbmd0aCA+PSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgKiB0aGlzLmJ1ZmZlclJvd1JhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0J1c3kgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFzaG91bGRMYXp5TG9hZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgZGlzcGxheWluZyBsaXN0IGl0ZW0gaW4gdGhlIHZpZXcgcG9ydCBpcyBtb3ZpbmcgZHVlIHRvIHNjcm9sbCBiYXIgaXMgbW92aW5nLFxyXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHRvcCBvZiB0aGUgc2Nyb2xsIGRhdGEgZWxlbWVudC5cclxuICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBpdGVtIG9mIHRoZSBzY3JvbGwgZGF0YSBlbGVtZW50IHdvbid0IGFsd2F5cyBhbGlnaCB0byB0aGUgdG9wIG9mIHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgICAgICAvLyBTbyBoZXJlIHdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBpdGVtLlxyXG4gICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wICUgdGhpcy5yb3dIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gTm90ZTogd2hlbiB0aGUgZGlzcGxheSBpdGVtIGxpc3QgaXMgZXZlbiBsb25nZXIgdGhhbiB0aGUgc2Nyb2xsIGNvbnRhaW5lciBoZWlnaHQgKiByb3cgaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgLy8gaXQgbWVhbnMgd2hlbiB3ZSBtb3ZlIDEgcGl4ZWwgb2YgdGhlIHNjcm9sbCBiYXIsIHRoZSBkYXRhIHRhYmxlIHdpbGwgbW92ZSBieSBhdCBsZWFzdCBvbmUgaXRlbS5cclxuICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2Ugd29uJ3QgbmVlZCB0byBoYW5kbGUgb2Zmc2V0IHNpbmNlIHdlIGRvbid0IGhhdmUgYSBjaGFuY2UgdG8gc2hvdyBcImhhbGYgZGF0YSB0YWJsZSBpdGVtXCJcclxuICAgICAgICAgICAgICAgIC8vIGF0IHRoZSB0b3AgYm9yZGVyIG9mIHRoZSBzY3JvbGwgY29udGFpbmVyIGJ5IG1vdmluZyB0aGUgc2Nyb2xsIGJhciB2ZXJ5IGxpdHRsZS5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoID4gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQgKiB0aGlzLnJvd0hlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVVSVZpcnR1YWxpemF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5SXRlbXNUb3AgPSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcCAtIG9mZnNldDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtSW5kZXggPSB0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRlbUluZGV4ID4gc3RhcnRJbmRleCArIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCAtIDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2VsZWN0ZWRJdGVtSW5kZXggPCBzdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUl0ZW1zVG9wID0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKHNlbGVjdGVkSXRlbUluZGV4IC0gc3RhcnRJbmRleCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCArIDEpICogdGhpcy5yb3dIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBzY3JvbGwgYmFyIGlzIG1vdmVkIHRvIHZlcnkgYm90dG9tLCB3ZSBqdXN0IHNpbXBseSBhbGlnbiB0aGUgZGlzcGxheWVkIGRhdGEgdGFibGUgaXRlbXMncyBib3R0b21cclxuICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgYm90dG9tIG9mIHRoZSBjb250YWluZXIgdG8gbWFrZSBzdXJlIHRoZSBsYXN0IGRhdGEgdGFibGUgaXRlbSBjYW4gYmUgZGlzcGxheWVkIGNvbXBsZXRlbHkuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3aGVuIHRoZSBsaXN0IGlzIHN1cGVyIGxvbmcgKHJlZmVyIHRvIGhvdyB3ZSBjYWxjdWxhdGUgdGhlIHRvcCBvZmZzZXQgb2YgdGhlIHN1cGVyIGxvbmcgbGlzdCksXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlbSBtYXkgbm90IGJlIHJlbmRlcmVkIGNvbXBsZXRlbHkuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggPiBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCAqIHRoaXMucm93SGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wID49XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQgLSB0aGlzLnJvd0hlaWdodCAvIDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNBdExhc3RTY3JlZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5SXRlbXNUb3AgPSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNYXRoLmNlaWwodGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0KSAqIHRoaXMucm93SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxEYXRhU3R5bGVUb3AgPSB0aGlzLmRpc3BsYXlJdGVtc1RvcCArICdweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlVXBkYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudEhlaWdodCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsQWJvdmVEYXRhRWxlbWVudChNYXRoLnJvdW5kKHN0YXJ0SW5kZXggLSByZW5kZXJlZEl0ZW1TdGFydCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICgoIXRoaXMuY3VycmVudFJlbmRlcmVkSXRlbUluVmlld1BvcnQgfHwgIXRoaXMucmVuZGVyZWRJdGVtc1tzdGFydEluZGV4XVxyXG4gICAgICAgICAgICAgICAgICAgIHx8ICh0aGlzLnJlbmRlcmVkSXRlbXNbc3RhcnRJbmRleF0uZGF0YSAhPT0gdGhpcy5jdXJyZW50UmVuZGVyZWRJdGVtSW5WaWV3UG9ydC5kYXRhKSlcclxuICAgICAgICAgICAgICAgICAgICB8fCBmb3JjZVVwZGF0ZSB8fCB0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBkaXNwbGF5IGRhdGEgYWJvdmUgdGhlIHZpZXcgcG9ydCBhbmQgZGlzcGxheSBkYXRhIGluIGFuZCBiZWxvdyB0aGUgdmlldyBwb3J0LlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHdoZW4gd2UgcHVzaCBuZXcgaXRlbSBpbnRvIHRoZSBhcnJheXMsIHdlIGNyZWF0ZSBhIG5ldyBvYmplY3QgdG8gd3JhcCB0aGUgZGlzcGxheSBpdGVtLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugd2Ugd2FudCB0byBmb3JjZSB0aGUgbmdGb3IgdG8gcmUtcmVuZGVyIGFsbCB0aGUgaXRlbXMgaW5zdGVhZCBvZiBvbmx5IHJlLXJlbmRlciB0aGUgdXBkYXRlZCBvbmVzLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgbmdGb3Igd2lsbCB0cnkgdG8gYWRqdXN0IERPTSBvcmRlciBvZiB0aG9zZSBpdGVtcyB3aGljaCBtZXNzZXMgdXAgdGhlIHNjcm9sbCBiYXIgcG9zaXRpb24uXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zQWJvdmVWaWV3UG9ydCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc0luQW5kQmVsb3dWaWV3UG9ydCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdWxkU2Nyb2xsID0gdGhpcy5zY3JvbGxhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIChzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodCA+IHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0aGlzLmVkaXRhYmxlIHx8IHRoaXMuYXV0b1Jvd0hlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkU2Nyb2xsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSByZW5kZXJlZEl0ZW1TdGFydDsgaSA8IHN0YXJ0SW5kZXg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBNYXRoLnJvdW5kKGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgc3RhcnRJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UmVuZGVyZWRJdGVtID0gdGhpcy5yZW5kZXJlZEl0ZW1zW2luZGV4XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zQWJvdmVWaWV3UG9ydC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGN1cnJlbnRSZW5kZXJlZEl0ZW0udHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc2hvd0FzVHJlZSA/IGN1cnJlbnRSZW5kZXJlZEl0ZW0ubm9kZS5kYXRhIDogY3VycmVudFJlbmRlcmVkSXRlbS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGN1cnJlbnRSZW5kZXJlZEl0ZW0uZGVwdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDaGlsZHJlbjogY3VycmVudFJlbmRlcmVkSXRlbS5oYXNDaGlsZHJlbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IGN1cnJlbnRSZW5kZXJlZEl0ZW0ubm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSW5TZXQ6IGN1cnJlbnRSZW5kZXJlZEl0ZW0ucG9zaXRpb25JblNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpemU6IGN1cnJlbnRSZW5kZXJlZEl0ZW0uc2V0U2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQ6IGN1cnJlbnRSZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNBYm92ZVZpZXdQb3J0LnB1c2goeyBkYXRhOiB7IHBsYWNlaG9sZGVyOiB0cnVlIH0sIHR5cGU6IG51bGwsIGluZGV4OiBudWxsIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IHJlbmRlcmVkSXRlbUVuZDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5yb3VuZChpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UmVuZGVyZWRJdGVtID0gdGhpcy5yZW5kZXJlZEl0ZW1zW2luZGV4XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc0luQW5kQmVsb3dWaWV3UG9ydC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBjdXJyZW50UmVuZGVyZWRJdGVtLnR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zaG93QXNUcmVlID8gY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLmRhdGEgOiBjdXJyZW50UmVuZGVyZWRJdGVtLmRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGN1cnJlbnRSZW5kZXJlZEl0ZW0uZGVwdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2hpbGRyZW46IGN1cnJlbnRSZW5kZXJlZEl0ZW0uaGFzQ2hpbGRyZW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkluU2V0OiBjdXJyZW50UmVuZGVyZWRJdGVtLnBvc2l0aW9uSW5TZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZTogY3VycmVudFJlbmRlcmVkSXRlbS5zZXRTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQ6IGN1cnJlbnRSZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zY3JvbGxhYmxlICYmIHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggPiB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc0luQW5kQmVsb3dWaWV3UG9ydC5wdXNoKHsgZGF0YTogeyBwbGFjZWhvbGRlcjogdHJ1ZSB9LCB0eXBlOiBudWxsLCBpbmRleDogbnVsbCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFJlbmRlcmVkSXRlbUluVmlld1BvcnQgPSB0aGlzLnJlbmRlcmVkSXRlbXNbc3RhcnRJbmRleF07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2Nyb2xsaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQnVzeSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc1tpXS5pbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRBcmVhSGFzRm9jdXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5pc1NtZUZvcm1GaWVsZCg8SFRNTEVsZW1lbnQ+ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QganVtcCBmcm9tIGVkaXRhYmxlIGZvcm0gZmllbGRzIHRvd2FyZHMgdGhlIHJvdyB3aGVuIHJlLWNhbGN1bGF0aW5nIGl0ZW1zXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHJlc2V0IHZhbGlkYXRpb24gZXJyb3JzIG9uIHdpbmRvdyByZXNpemluZ1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ICE9PSB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdyh0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc0ZpbHRlcigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QgPSB0aGlzLmludGVybmFsUXVlcnlFZGl0b3I7XHJcbiAgICAgICAgY29uc3QgaGFzVmFsaWRRdWVyeUVkaXRvciA9ICh2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QgJiYgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzICYmXHJcbiAgICAgICAgICAgIHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50cy5sZW5ndGgpO1xyXG4gICAgICAgIGlmICh0aGlzLmludGVybmFsSXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2xvYmFsRmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nbG9iYWxGaWx0ZXIgaW5zdGFuY2VvZiBTZWFyY2hGb3JtRmllbGRDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWFyY2hGb3JtRmllbGQgPSA8U2VhcmNoRm9ybUZpZWxkQ29tcG9uZW50PnRoaXMuZ2xvYmFsRmlsdGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyS2V5d29yZCA9IHNlYXJjaEZvcm1GaWVsZC52YWx1ZSAmJiBzZWFyY2hGb3JtRmllbGQudmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyS2V5d29yZCA9IHRoaXMuZ2xvYmFsRmlsdGVyWyd2YWx1ZSddID8gdGhpcy5nbG9iYWxGaWx0ZXJbJ3ZhbHVlJ10udG9Mb2NhbGVMb3dlckNhc2UoKS50cmltKCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbHRlcktleXdvcmQgJiYgIWhhc1ZhbGlkUXVlcnlFZGl0b3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IHRoaXMuaW50ZXJuYWxJdGVtcy5tYXAoaXRlbSA9PiBpdGVtKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmludGVybmFsSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZpcnN0IGZpbHRlciBieSB0aGUgbWFzdGVyIHZpZXcgZmlsdGVycyBpZiBhcHBsaWNhYmxlXHJcbiAgICAgICAgICAgICAgICAvLyBUaGVuIGZpbHRlciBieSB0aGUgY29sdW1uIGZpbHRlcnNcclxuICAgICAgICAgICAgICAgIC8vIE5vdGUgZmlsdGVyIGluc2lkZSB0aGUgY29sdW1uIGZpbHRlcnMgYXJlIGludGVyc2VjdGlvbnNcclxuICAgICAgICAgICAgICAgIC8vIENvbHVtbiBmaWx0ZXJzIG11bHRpcGxlIGNvbWJvYm94IHdpbGwgYmUgdW5pb25cclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmludGVybmFsSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pbnRlcm5hbEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIERvIHRoZSBkYXRhdGFibGUgb3JpZ2luYWwgZmlsdGVycyBvbmx5IGlmIHVzZWQgaW4gbWFzdGVyIHZpZXcuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQW5kIGhhcyB2YWxpZCBmaWx0ZXJLZXl3b3JkXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyS2V5d29yZCAmJiB0aGlzLmZpbHRlcktleXdvcmQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kICYmIGNvbHVtbi5zZWFyY2hhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChpdGVtLCAodGhpcy5lZGl0YWJsZSA/ICdjb250ZW50LicgOiAnJykgKyBjb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5maWx0ZXJPdmVycmlkaW5nRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29sdW1uLmZpbHRlck92ZXJyaWRpbmdGdW5jdGlvbih2YWx1ZSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhc2VTZW5zaXRpdmVGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50b1N0cmluZygpLmluZGV4T2YodGhpcy5maWx0ZXJLZXl3b3JkKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmlsdGVyS2V5d29yZCBpcyBlbXB0eVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvciB0aGlzIGRhdGF0YWJsZSBpcyBub3QgdXNlZCBpbiBtYXN0ZXIgdmlld1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGZvdW5kIGJ5IGRhdGF0YWJsZSBvcmlnaW5hbCBmaWx0ZXIoZnJvbSBtYXN0ZXIgdmlldylcclxuICAgICAgICAgICAgICAgICAgICAvLyBvciBpZiBvcmlnaW5hbCBmaWx0ZXIgaXMgZW1wdHkobm90IGluIG1hc3RlciB2aWV3KVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVmFsaWRRdWVyeUVkaXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyIGJ5IHF1ZXJ5IGVkaXRvciBpZiBhcHBsaWVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRoaXMucXVlcnlFZGl0b3JGaWx0ZXJNYWluKHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdCwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgc2F0aXNmeSBib3RoIG9yaWdpbmFsIGZpbHRlcnMgYW5kIHRoZSBxdWVyeSBlZGl0b3IgZmlsdGVyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVBcmlhQXR0cmlidXRlcygpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlQXJpYUxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdGhpcy50YWJsZUFyaWFMYWJlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMudGFibGVBcmlhTGFiZWxsZWRCeSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JywgdGhpcy50YWJsZUFyaWFMYWJlbGxlZEJ5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSB8fCB0aGlzLnNlbGVjdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgICAgICAgICdhcmlhLW11bHRpc2VsZWN0YWJsZScsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVRyZWVOb2RlKG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0sIGRlcHRoOiBudW1iZXIsIHBhcmVudFNoYWRvd1RyZWVOb2RlOiBhbnksIHBvc2l0aW9uSW5TZXQ6IG51bWJlciwgc2V0U2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJUcmVlTm9kZVRvZ2dsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMuZ2V0VHJlZU5vZGVEYXRhSWRlbnRpdHkobm9kZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRyZWVUb2dnbGVTdGF0dXMuaGFzT3duUHJvcGVydHkoaWRlbnRpdHkpKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gdGhpcy50cmVlVG9nZ2xlU3RhdHVzW2lkZW50aXR5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBub2RlLmNhbkV4cGFuZCB8fCBub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMDtcclxuICAgICAgICBub2RlLmlzTGVhZiA9ICFoYXNDaGlsZHJlbjtcclxuXHJcbiAgICAgICAgY29uc3QgcmVuZGVyZWRJdGVtID0ge1xyXG4gICAgICAgICAgICBkYXRhOiBub2RlLmRhdGEsXHJcbiAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuVHJlZU5vZGUsXHJcbiAgICAgICAgICAgIGRlcHRoOiBkZXB0aCxcclxuICAgICAgICAgICAgaGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLFxyXG4gICAgICAgICAgICBub2RlOiBub2RlLFxyXG4gICAgICAgICAgICBpbmRleDogdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgICAgcG9zaXRpb25JblNldDogcG9zaXRpb25JblNldCxcclxuICAgICAgICAgICAgc2V0U2l6ZTogc2V0U2l6ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2gocmVuZGVyZWRJdGVtKTtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudFNoYWRvd1RyZWVOb2RlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiByZW5kZXJlZEl0ZW0sXHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFpbnRhaW4gYSBzaGFkb3cgdHJlZSB0byBoYW5kbGUgdGhlIFwic2FtZSBsZXZlbCBvbmx5XCIgc29ydGluZy5cclxuICAgICAgICBwYXJlbnRTaGFkb3dUcmVlTm9kZS5jaGlsZHJlbi5wdXNoKGN1cnJlbnRTaGFkb3dUcmVlTm9kZSk7XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCAmJiBub2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIGxldCBjdXJyZW50UG9zaXRpb25JblNldCA9IDE7XHJcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZShjaGlsZCwgZGVwdGggKyAxLCBjdXJyZW50U2hhZG93VHJlZU5vZGUsIGN1cnJlbnRQb3NpdGlvbkluU2V0LCBub2RlLmNoaWxkcmVuLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25JblNldCsrO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVJlbmRlckl0ZW1zKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmdyb3VwQ29sdW1uICYmIHRoaXMuZ3JvdXBDb2x1bW4uZmllbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5ncm91cEtleXMgPSB7fTtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBzOiB7IGdyb3VwOiBEYXRhVGFibGVEYXRhSXRlbSwgaXRlbXM6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdIH1bXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBTb3J0TW9kZSAhPT0gRGF0YVRhYmxlU29ydE1vZGUuTm9uZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcGFyZUZ1bmN0aW9uID0gdGhpcy5ncm91cENvbHVtbi5zb3J0YWJsZSA9PT0gJ2N1c3RvbScgP1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBDb2x1bW4uY29tcGFyZUZ1bmN0aW9uLmJpbmQodGhpcykgOiB0aGlzLmRlZmF1bHRTb3J0Q29tcGFyZUZ1bmN0aW9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3J0RGlyZWN0aW9uID0gdGhpcy5ncm91cFNvcnRNb2RlID09PSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQgPyAxIDogLTE7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gKiBjb21wYXJlRnVuY3Rpb24oYSwgYiwgdGhpcy5ncm91cENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwRGF0YSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoaXRlbSwgdGhpcy5ncm91cENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdyb3VwS2V5c1tncm91cERhdGFdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzLnB1c2goeyBncm91cDogZ3JvdXBEYXRhLCBpdGVtczogZ3JvdXBJdGVtcyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cEtleXNbZ3JvdXBEYXRhXSA9IGdyb3VwSXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2dyb3VwRGF0YV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2dyb3VwRGF0YV0gPSB0aGlzLmRlZmF1bHRHcm91cFRvZ2dsZUV4cGFuZGVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwS2V5c1tncm91cERhdGFdLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZ3JvdXBzW2ldLmdyb3VwLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25JblNldDogaSArIDEsXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZTogZ3JvdXBzLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tncm91cHNbaV0uZ3JvdXBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRQb3NpdGlvbkluU2V0ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICBncm91cHNbaV0uaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBJdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkluU2V0OiBjdXJyZW50UG9zaXRpb25JblNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpemU6IGdyb3Vwc1tpXS5pdGVtcy5sZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbkluU2V0Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5zaGFkb3dUcmVlID0geyBkYXRhOiBudWxsLCBjaGlsZHJlbjogW10gfTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UG9zaXRpb25JblNldCA9IDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZShub2RlLCAwLCB0aGlzLnNoYWRvd1RyZWUsIGN1cnJlbnRQb3NpdGlvbkluU2V0LCB0aGlzLml0ZW1zLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uSW5TZXQrKztcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlckl0ZW0gPSA8RGF0YVRhYmxlUmVuZGVyZWRJdGVtPntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4KyssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuZmlsdGVyZWRJdGVtc1tpXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Ob3JtYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQ6IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2gocmVuZGVySXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgrKyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Ob3JtYWxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbmRlckl0ZW1zKHByZXZlbnRTY3JvbGxpbmc/OiBib29sZWFuLCBmb3JjZVVwZGF0ZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9ICF0aGlzLml0ZW1zO1xyXG5cclxuICAgICAgICB0aGlzLnByb2Nlc3NGaWx0ZXIoKTtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlUmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlcyBob3cgaGlnaCB0aGUgc2Nyb2xsIGRhdGEgZGl2IHNob3VsZCBiZS5cclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zICYmICF0aGlzLmRpc2FibGVVSVZpcnR1YWxpemF0aW9uKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoICogdGhpcy5yb3dIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgaGVpZ2h0IGlzIHRvbyBtdWNoLCB3ZSBuZWVkIHRvIGxpbWl0ZWQgdGhlIGhlaWdodCBvdGhlcndpc2UgTWljcm9zb2Z0IEVkZ2Ugd2lsbCBjcmFzaC5cclxuICAgICAgICAgICAgLy8gSXQncyBvayBpZiB0aGUgc2Nyb2xsIGRhdGEgZGl2IGhlaWdodCBkb2Vzbid0IGVxdWFsIHRvIHRoZSBhY3R1YWwgdG90YWwgZGF0YSB0YWJsZSBoZWlnaHRcclxuICAgICAgICAgICAgLy8gYmVjYXVzZSBhbnl3YXkgd2UgdXNlIHRoZSByYXRpbyBvZiBzY3JvbGwgZGF0YSBkaXYgaGVpZ2h0IHRvIGFjdHVhbCB0b3RhbCBsaXN0IGl0ZW0gaGVpZ2h0XHJcbiAgICAgICAgICAgIC8vIHRvIGNhbGN1bGF0ZSB0aGUgc2Nyb2xsaW5nIHBvc2l0aW9uIG9mIHRoZSBhY3R1YWwgZGF0YS5cclxuICAgICAgICAgICAgdGhpcy5oYXNMb25nTGlzdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0ID4gdGhpcy5tYXhBY3R1YWxTY3JvbGxEYXRhRWxlbWVudEhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBmaW5kIGEgaGVpZ2h0IG5lYXIgdGhlIG1heEFjdHVhbFNjcm9sbERhdGFFbGVtZW50SGVpZ2h0IHdoaWNoIGNhbiBiZSBkaXZpZGVkIGV4YWN0bHkgYnkgdGhlIHJvdyBoZWlnaHQuXHJcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2hlbiB3ZSBjYWxjdWF0ZSB0aGUgc2Nyb2xsaW5nIHBvc2l0aW9uIG9mIHRoZSBhY3R1YWwgZGF0YSxcclxuICAgICAgICAgICAgICAgIC8vIHRoZSBmbG9hdGluZyBwYXJ0IG9mIHRoZSBoZWlnaHQgd2lsbCBpbXBhY3QgdGhlIGFjY3VyYWN5IG9mIHRoZSBjYWxjdWxhdGlvbiByZXN1bHQuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0xvbmdMaXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGguZmxvb3IodGhpcy5tYXhBY3R1YWxTY3JvbGxEYXRhRWxlbWVudEhlaWdodCAvIHRoaXMucm93SGVpZ2h0KSAqIHRoaXMucm93SGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zb3J0SXRlbXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUgJiYgdGhpcy5lZGl0YWJsZUF1dG9OZXdSb3cpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVuZGVySXRlbUZvck5ld0RhdGFJdGVtID0gPERhdGFUYWJsZVJlbmRlcmVkSXRlbT57XHJcbiAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgIGRhdGE6IDxFZGl0YWJsZURhdGFJdGVtPntcclxuICAgICAgICAgICAgICAgICAgICBpZDogTXNmdFNtZS5uZXdHdWlkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkFsZXJ0czoge30sXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmVkaXRhYmxlTmV3RGF0YUl0ZW0gfHwge30pKSxcclxuICAgICAgICAgICAgICAgICAgICBpc05ld1JvdzogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuTm9ybWFsLFxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDogW11cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcy5wdXNoKHJlbmRlckl0ZW1Gb3JOZXdEYXRhSXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KHByZXZlbnRTY3JvbGxpbmcsIGZvcmNlVXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVNjcm9sbEFib3ZlRGF0YUVsZW1lbnQocmVuZGVyZWRJdGVtQWJvdmVWaWV3UG9ydExlbmd0aD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbEFib3ZlRGF0YUVsZW1lbnQgPSB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gT25seSBkaXNwbGF5IHRoZSBzY3JvbGwgYWJvdmUgZGF0YSBlbGVtZW50IHdoZW4gaXQncyBoZWlnaHQgaXMgYXZhaWxhYmxlLlxyXG4gICAgICAgIC8vIEl0cyBoZWlnaHQgbWF5IG5vdCBiZSByZWFkeSB3aGVuIHRoZSBkYXRhIHRhYmxlIGlzIHJlbmRlcmVkIGZpcnN0IHRpbWUgYW5kIHRoZSBzY3JvbGwgdG9wIGlzIDAuXHJcbiAgICAgICAgaWYgKCF0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQgJiYgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0ID0gc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVuZGVyZWRJdGVtQWJvdmVWaWV3UG9ydExlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQgPSB0aGlzLnJvd0hlaWdodCAqIHJlbmRlcmVkSXRlbUFib3ZlVmlld1BvcnRMZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQWJvdmVEYXRhU3R5bGVUb3AgPSB0aGlzLmRpc3BsYXlJdGVtc1RvcCAtIHRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudEhlaWdodCArICdweCc7XHJcbiAgICAgICAgICAgIHNjcm9sbEFib3ZlRGF0YUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzY3JvbGxBYm92ZURhdGFFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uTGF5b3V0Q2hhbmdlZFJlc3BvbnNpdmVXaW5kb3coKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5EYXRhVGFibGVSZXNwb25zaXZlV2luZG93TWFuYWdlci51cGRhdGVWaWV3UG9ydFdpZHRoRHluYW1pY2FsbHlPblBob25lRG93bihcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxCb2R5RWxlbWVudCwgdGhpcy5yZW5kZXJlciwgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50LCB0aGlzLmhlYWRlclRhYmxlRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLkRhdGFUYWJsZVJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyLmNoZWNrSXNUYWJsZVJlbmRlcmVkT25QaG9uZURvd25XaXRoTWluSGVpZ2h0KFxyXG4gICAgICAgICAgICB0aGlzLmhlYWRlclRhYmxlRWxlbWVudCwgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50KSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzVGFibGVSZW5kZXJlZFdpdGhNaW5IZWlnaHRQaG9uZURvd24uZW1pdCh0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmlzVGFibGVSZW5kZXJlZFdpdGhNaW5IZWlnaHRQaG9uZURvd24uZW1pdChmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2l2ZSB0aGUgYWNjZXNzIG9mIHRoaXMgZnVuY3Rpb24gb24gc3BlY2lhbCBzaXR1YXRpb24gd2hlcmUgZGlhbG9nIGNvbnRhaW5zIGRhdGEtdGFibGVcclxuICAgICAqL1xyXG4gICAgQERlYm91bmNlKClcclxuICAgIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25XaW5kb3dCcmVha3BvaW50Q2hhbmdlZCgpO1xyXG4gICAgICAgIHRoaXMuZGVmZXJyZWRPbkxheW91dENoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBvbiB3aW5kb3cgYnJlYWtwb2ludCBjaGFuZ2VkIGhhbmRsZXIuXHJcbiAgICAgKiBBZGRpbmcgeWllbGQgZm9yIGNvbXBvbmVudCB0byBnZXQgRWxlbWVudFJlZiBhZnRlciBpbml0aWFsaXphdGlvbi5cclxuICAgICAqL1xyXG4gICAgQFlpZWxkKClcclxuICAgIHByaXZhdGUgb25XaW5kb3dCcmVha3BvaW50Q2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2Nyb2xsQm9keUVsZW1lbnQgfHwgIXRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudCB8fCAhdGhpcy5oZWFkZXJUYWJsZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vbkxheW91dENoYW5nZWRSZXNwb25zaXZlV2luZG93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgQFlpZWxkKClcclxuICAgIHByaXZhdGUgb25MYXlvdXRDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHpvb21TY2FsZUggPSAod2luZG93LnNjcmVlbi53aWR0aCAtIHdpbmRvdy5pbm5lcldpZHRoKSAvIHdpbmRvdy5zY3JlZW4ud2lkdGg7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRXaWR0aCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGNvbnN0IGFkanVzdGVkV2lkdGggPSBNYXRoLm1heChjdXJyZW50V2lkdGggKyB6b29tU2NhbGVIICogY3VycmVudFdpZHRoLCBjdXJyZW50V2lkdGgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hY3R1YWxDb2x1bW5Qcm9jZXNzZWQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudCA9IHRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KGZhbHNlLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbGFibGVIb3Jpem9udGFsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBcyB0aGUgdXNlciB6b29tcyBpbiBhbmQgb3V0LCB3ZSBuZWVkIHRvIGVuYWJsZSBob3Jpem9udGFsIHNjcm9sbGluZyBpbiB0aGVcclxuICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5lciBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICAvLyBUbyBhY2NvbW1vZGF0ZSBkaXNwbGF5IG9mIGJpZ2dlciB6b29tZWQgaW4gdGV4dCwgd2UgYWxzbyBhZGp1c3QgdGhlIHdpZHRoIG9mIHRoZVxyXG4gICAgICAgICAgICAgICAgLy8gaW5uZXIgdGFibGUgY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBUaGlzIHRlY2huaXF1ZSB3aWxsIG5vdCB3b3JrIGZvciBNb3ppbGxhLCB3aG9zZSB2YWx1ZSBvZiB3aW5kb3cuaW5uZXJXaWR0aCBhbmQgd2luZG93LnNjcmVlbi53aWR0aCByZW1haW5zXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICBjb25zdGFudFxyXG4gICAgICAgICAgICAgICAgLy8gTk9URTogTm90IHdpbmRvdyByZXNwb25zaXZlIGRlc2lnblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ292ZXJmbG93LXgnLCBgYXV0b2ApO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICd3aWR0aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgYCR7YWRqdXN0ZWRXaWR0aH1weGApO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyxcclxuICAgICAgICAgICAgICAgICAgICBgJHthZGp1c3RlZFdpZHRofXB4YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxXaWR0aCA9IHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBXZSBzdG9yZSB0aGUgb3JpZ2luYWwgcmF0aW9zIG9mIHRoZSBjb2x1bW4gd2lkdGhzIGFzIHBlcmNlbnRhZ2VzIG9mIHRoZSBvZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1uc1xyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoY29sdW1uID0+ICFjb2x1bW4ud2lkdGguZW5kc1dpdGgoJyUnKSAmJiAhY29sdW1uLndpZHRoUGVyY2VudGFnZSlcclxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xXaWR0aCA9IERhdGFUYWJsZUNvbXBvbmVudC5weENvbnZlcnRlci5jb252ZXJ0VG9QeChjb2x1bW4ud2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IGdldCByYXRpb3MgZm9yIHVuaXRzIHRoYXQgd2UgY2FuIHN1Y2Nlc3NmdWxseSBjb252ZXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xXaWR0aCAmJiAhaXNOYU4oY29sV2lkdGgpICYmIG9yaWdpbmFsV2lkdGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ud2lkdGhQZXJjZW50YWdlID0gY29sV2lkdGggLyBvcmlnaW5hbFdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBUaGUgdGVtcGxhdGUgYXBwbGllcyB0aGUgd2lkdGggcmF0aW8gb2YgZWFjaCBjb2x1bW4gb24gdGhlIHdpZHRoIG9mIHRoZSBjb250YWluZXJcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4ud2lkdGhQZXJjZW50YWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLndpZHRoID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKiBjb2x1bW4ud2lkdGhQZXJjZW50YWdlICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBXaGVuIGxheW91dCBpcyBjaGFuZ2VkLCB0aGUgXCJkaXNwbGF5IGFib3ZlIHZpZXcgcG9ydFwiIGl0ZW0gbGlzdCBkYXRhIHNvdXJjZSBpcyB1cGRhdGVkXHJcbiAgICAgICAgICAgIC8vIGJ1dCB0aGUgaHRtbCBpcyBub3QgdXBkYXRlZCB5ZXQuIFNvIHRoZSBVSSBvZiB0aGUgXCJkaXNwbGF5IGFib3ZlIHZpZXcgcG9ydFwiIGlzIG5vdCBnb29kLlxyXG4gICAgICAgICAgICAvLyBTbyBoaWRlIHRoZSBVSSBmb3Igbm93IGFuZCBhZGp1c3QgaXQgaW4gc2V0VGltZW91dC5cclxuICAgICAgICAgICAgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0ID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsQWJvdmVEYXRhRWxlbWVudCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ29sdW1uRG9tV2lkdGhzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwcml2YXRlIGRlZmVycmVkT25MYXlvdXRDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25MYXlvdXRDaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihub2RlOiBUcmVlTm9kZURhdGFJdGVtLCBzZWxlY3RlZDogYm9vbGVhbiwgc2tpcEV2ZW50PzogYm9vbGVhbiwgc2tpcExpbmtTZWxlY3Rpb24/OiBib29sZWFuLFxyXG4gICAgICAgIGl0ZW1zVG9TZWxlY3Q/OiBUcmVlTm9kZURhdGFJdGVtW10pOiB2b2lkIHtcclxuICAgICAgICBpZiAoaXRlbXNUb1NlbGVjdCkge1xyXG4gICAgICAgICAgICBzZWxlY3RlZCA9IGl0ZW1zVG9TZWxlY3QuaW5kZXhPZihub2RlLmRhdGEpICE9PSAtMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgIT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24gfHxcclxuICAgICAgICAgICAgKHNraXBMaW5rU2VsZWN0aW9uIHx8ICFub2RlLmNoaWxkcmVuIHx8ICFub2RlLmNoaWxkcmVuLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmludGVybmFsU2VsZWN0aW9uLmluZGV4T2Yobm9kZSk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ucHVzaChub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXBFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoeyBkYXRhOiBub2RlLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uc3BsaWNlKHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihub2RlKSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dVbnNlbGVjdGVkLmVtaXQoeyBkYXRhOiBub2RlLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBub2RlLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgaWYgKCFza2lwTGlua1NlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2hvdWxkU2VsZWN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnROb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW5baV0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFNlbGVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUuc2VsZWN0ZWQgPSBzaG91bGRTZWxlY3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCghc2tpcExpbmtTZWxlY3Rpb24gfHwgaXRlbXNUb1NlbGVjdCkgJiYgbm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkTm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZE5vZGUucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGNoaWxkTm9kZSwgc2VsZWN0ZWQsIHNraXBFdmVudCwgc2tpcExpbmtTZWxlY3Rpb24sIGl0ZW1zVG9TZWxlY3QpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhbGlnbkNvbnRlbnQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVhZGVyVGFibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRyeSB0byBmb2N1cyBvbiByb3cgZnVuY3Rpb247IGlmIHRoZXJlIGFyZSBubyByZWNvcmRzLCB0aGUgbm8gcmVjb3JkcyBtZXNzYWdlIGlzIHNlbGVjdGVkXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggT25seSBwYXNzIGluIGluZGV4IGlmIG5lZWRzIGZvY3VzIG9ubHlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzU2VsZWN0ZWRSb3coaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVuZGVyZWRJdGVtcyB8fCAhdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93VGltZXIpO1xyXG4gICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgbGV0IHJvdzogSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZChpbmRleCkgJiYgaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgcm93ID0gdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoYC5zbWUtdGFibGUtcm93LnNtZS10YWJsZS1yb3ctZGF0YVtkYXRhLXJlbmRlcmVkLWl0ZW0taW5kZXg9XCIke2luZGV4fVwiXWApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKE1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQocm93KSkge1xyXG4gICAgICAgICAgICAgICAgcm93ID0gdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zbWUtdGFibGUtcm93LnNtZS10YWJsZS1yb3ctZGF0YS5zbWUtdGFibGUtcm93LWFjdGl2ZScpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lclRvcCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBjb250YWluZXJCb3R0b20gPSBOdW1iZXIuTUFYX1ZBTFVFO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJDbGllbnRSZWN0ID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKVswXTtcclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lckNsaWVudFJlY3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lclRvcCA9IGNvbnRhaW5lckNsaWVudFJlY3QudG9wO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyQm90dG9tID0gY29udGFpbmVyQ2xpZW50UmVjdC5ib3R0b207XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBpc1Jvd0luVmlld1BvcnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHJvdykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJvd1RvcCA9IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3dDbGllbnRSZWN0ID0gcm93LmdldENsaWVudFJlY3RzKClbMF07XHJcbiAgICAgICAgICAgICAgICBpZiAocm93Q2xpZW50UmVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd1RvcCA9IHJvd0NsaWVudFJlY3QudG9wO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlzUm93SW5WaWV3UG9ydCA9IHJvd1RvcCA+PSBjb250YWluZXJUb3AgJiYgcm93VG9wIDwgY29udGFpbmVyQm90dG9tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyb3cgJiYgIWlzUm93SW5WaWV3UG9ydCAmJiBpbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgcm93IGlzIG5vdCBpbiB2aWV3cG9ydCwganVzdCBmb2N1cyB0aGUgZmlyc3QgdmlzaWJsZSByb3cgaW4gdGhlIHZpZXdwb3J0LlxyXG4gICAgICAgICAgICAgICAgLy8gVGhlbiBkYXRhIHRhYmxlIHdpbGwgc3RpbGwgYmUgYWJsZSB0byByZWNlaXZlIGtleWJvYXJkIGV2ZW50LlxyXG4gICAgICAgICAgICAgICAgY29uc3QgYmFja3VwUm93cyA9IHRoaXMuc2Nyb2xsRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLXJvdy5zbWUtdGFibGUtcm93LWRhdGEnKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFja3VwUm93cy5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dDbGllbnRSZWN0ID0gYmFja3VwUm93c1tpXS5nZXRDbGllbnRSZWN0cygpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3dDbGllbnRSZWN0LnRvcCA+IGNvbnRhaW5lclRvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBiYWNrdXBSb3dzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA+PSAwICYmICF0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IDxIVE1MRWxlbWVudD5yb3cucXVlcnlTZWxlY3RvckFsbCgnLnNtZS10YWJsZS10ZCcpW3RoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50XTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50ID0gRG9tLmdldEZpcnN0Rm9jdXNhYmxlRGVzY2VuZGVudChjZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWRpdGFibGUgZGF0YSB0YWJsZSwgYmVjYXVzZSBvZiB0aGUgZGVzaWduXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIGZvY3VzIG9uIHRoZSByb3cgZmlyc3RcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNhYmxlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByb3cuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkVsZW1lbnRGb2N1c2luZyhldmVudDogRWxlbWVudEZvY3VzaW5nRXZlbnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Wm9uZSA9PT0gdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jb250ZW50QXJlYUhhc0ZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdEZvY3VzQmVoYXZpb3IoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0RXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldEVsZW1lbnQgJiYgZXZlbnQudGFyZ2V0RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc21lLWxhc3QtZm9jdXNhYmxlLXNoYWRvdy1lbGVtZW50JylcclxuICAgICAgICAgICAgJiYgZXZlbnQudGFyZ2V0RWxlbWVudCA9PT0gdGhpcy5sYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0Rm9jdXNCZWhhdmlvcigpO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlWm9uZSA9PT0gdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50IHx8IGV2ZW50LnNvdXJjZVpvbmUgPT09IHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Rm9jdXNhYmxlRWxlbWVudCA9IERvbS5nZXROZXh0Wm9uZUVsZW1lbnQoZXZlbnQudGFyZ2V0RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5leHRGb2N1c2FibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQudGFyZ2V0RWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRGb2N1c09uY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdEV2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsVGFyZ2V0Wm9uZSA9IERvbS5nZXRBbmNlc3RvclpvbmUobmV4dEZvY3VzYWJsZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIENvcmVFbnZpcm9ubWVudC5hY2Nlc3NpYmlsaXR5TWFuYWdlci5wcm9jZXNzRWxlbWVudEZvY3VzaW5nKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5uYXRpdmVFdmVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEZvY3VzYWJsZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldFpvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFRhcmdldFpvbmUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHRFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgodGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc0NvbHVtbnMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzQWN0dWFsQ29sdW1ucygpO1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnNNYWluKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzQ29sdW1uc01haW4oKSB7XHJcbiAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1jb2xjb3VudCcsXHJcbiAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5sZW5ndGggKyAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uID8gMSA6IDApKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbkRvbVdpZHRocygpO1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1uUHJvY2Vzc2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NBY3R1YWxDb2x1bW5zKCkge1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucyA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcclxuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goc291cmNlQ29sdW1uID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VDb2x1bW4gIT09IHRoaXMuZ3JvdXBDb2x1bW4gJiYgIXNvdXJjZUNvbHVtbi5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMucHVzaChzb3VyY2VDb2x1bW4pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHByb2Nlc3NDb2x1bW5zQnlPcmRlcihvcmRlcjogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29sdW1uc09yZGVyID0gb3JkZXI7XHJcbiAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zID0gW107XHJcbiAgICAgICAgaWYgKHRoaXMuY29sdW1ucykge1xyXG4gICAgICAgICAgICBvcmRlci5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvbHVtbiA9IHRoaXMuY29sdW1ucy5maW5kKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5maWVsZCA9PT0gZmllbGQ7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGlmIChzb3VyY2VDb2x1bW4gJiYgc291cmNlQ29sdW1uICE9PSB0aGlzLmdyb3VwQ29sdW1uICYmICFzb3VyY2VDb2x1bW4uaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLnB1c2goc291cmNlQ29sdW1uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcmRlciAmJiBvcmRlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnNNYWluKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ29sdW1ucygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIGZpbHRlcmVkIGl0ZW1zIChpZiBhbnkpIHdpdGhpbiB0aGUgZGF0YVRhYmxlLlxyXG4gICAgICogQHJldHVybnMgbnVtYmVyIG9mIGRhdGFUYWJsZSBmaWx0ZXJlZCBpdGVtcywgemVybyBpZiBub25lLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0TnVtYmVyT2ZGaWx0ZXJlZEl0ZW1zKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRJdGVtcyA/IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSB0b29sdGlwIGhhbmRsZXIgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgZGF0YSB0YWJsZSBjb2x1bW4uXHJcbiAgICAgKiBAcGFyYW0gY29sdW1uICAgICAgICBDb2x1bW4gZm9yIHRvb2x0aXAgaGFuZGxlclxyXG4gICAgICogQHBhcmFtIHJlbmRlcmVkSXRlbSAgRGF0YSBpdGVtIGZvciB0aGUgcm93XHJcbiAgICAgKiBAcmV0dXJucyAgICAgICAgICAgICBUb29sdGlwIHN0cmluZyBpZiBleGlzdHMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb2x1bW5Ub29sdGlwVGV4dChjb2x1bW46IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCwgcmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmICghIWNvbHVtbi5nZXRUb29sdGlwSGFuZGxlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gY29sdW1uLmdldFRvb2x0aXBIYW5kbGVyKHJlbmRlcmVkSXRlbS5kYXRhLCBjb2x1bW4uZmllbGQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5lbmFibGVEZWZhdWx0VG9vbHRpcHMgJiYgIU1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQoY29sdW1uLmZpZWxkKSlcclxuICAgICAgICAgICAgICAgICAgICA/IGNvbHVtbi5nZXREZWZhdWx0VG9vbHRpcEhhbmRsZXIocmVuZGVyZWRJdGVtLmRhdGEsIGNvbHVtbi5maWVsZCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBhZGRlZCBmcm9tIHVwZ3JhZGluZyBkYXRhIHRhYmxlIHRvIHN1cHBvcnQgZWRpdGFibGUgZGF0YSB0YWJsZVxyXG4gICAgICogVGhlIGlkZWEgaXMgdG8gdXNlIHRoZSBkYXRhIHRhYmxlJ3MgaGVhZGVyIHdpZHRoIHRvIGJlIGFwcGxpZWQgb24gdGhlIGRhdGEgdGFibGUgYm9keSBjb2x1bW5zLlxyXG4gICAgICogV2hlbiBub3Qgc2hvd2luZyBoZWFkZXJzLCBuZWVkIHRvIHVzZSB0aGUgaGVhZGVyJ3Mgd2lkdGggdG8gYmUgYXBwbGllZCB0byB0ZCBhcyB3ZWxsLlxyXG4gICAgICovXHJcbiAgICBAWWllbGQoKVxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDb2x1bW5Eb21XaWR0aHMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdGhFbGVtZW50cyA9IHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbWUtdGFibGUtY2FwdGlvbi5zbWUtdGFibGUtY29sdW1uLWhlYWRlcicpO1xyXG4gICAgICAgIGlmICh0aEVsZW1lbnRzICYmIHRoRWxlbWVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYWN0dWFsQ29sdW1ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zW2ldLmRvbVdpZHRoID0gdGhFbGVtZW50c1tpXS5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldElzQ29sdW1uV2lkdGhDYWxjdWxhdGVkKHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiBnaXZlcyBvbmUgbW9yZSB0aWNrIHNvIHRoYXQgdGhlIGxvYWRpbmcgd2hlZWwgY2FuIHN0YW5kIG9uZSBtb3JlIGh0bWwgcmVuZGVyaW5nIGxpZmUgY3ljbGVcclxuICAgICAqIFRoaXMgZml4ZXMgYSBidWcgcmVsYXRlZCB0byBkYXRhIHRhYmxlIG9uIGxvYWQgbWlzLWFsaWduZWRcclxuICAgICAqIEBwYXJhbSBpbnB1dCBib29sZWFuXHJcbiAgICAgKi9cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwcml2YXRlIHNldElzQ29sdW1uV2lkdGhDYWxjdWxhdGVkKGlucHV0OiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5pc0NvbHVtbldpZHRoQ2FsY3VsYXRlZCA9IGlucHV0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhCeVNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS5ub2RlID09PSB0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGF0YS5jb250ZW50ID09PSB0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS5kYXRhID09PSB0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VHJlZU5vZGVEYXRhSWRlbnRpdHkobm9kZTogVHJlZU5vZGVEYXRhSXRlbSk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihjdXJyZW50Tm9kZS5kYXRhKSArICdcXFxcJyArIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2VsZWN0QWxsKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5yZW5kZXJlZEl0ZW1zLnNsaWNlKCkubWFwKGl0ZW0gPT4gaXRlbS5kYXRhKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHsgZGF0YTogaXRlbS5kYXRhIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhcHBseVF1ZXJ5RWRpdG9yKHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdDogUXVlcnlEYXRhKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFF1ZXJ5RWRpdG9yID0gdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0O1xyXG4gICAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHF1ZXJ5RWRpdG9yRmlsdGVyTWFpbih2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3Q6IFF1ZXJ5RGF0YSwgaXRlbTogRGF0YVRhYmxlRGF0YUl0ZW0pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5RWRpdG9ySXRlbSA9IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50c1tpXTtcclxuICAgICAgICAgICAgaWYgKGZvdW5kICYmIHRoaXMuYWN0dWFsQ29sdW1ucykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBxdWVyeUVkaXRvckl0ZW0uY29sdW1uLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5hY3R1YWxDb2x1bW5zLmZpbHRlcigoY29sKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbC5maWVsZCA9PT0gZmllbGQ7XHJcbiAgICAgICAgICAgICAgICB9KVswXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGl0ZW0sIGNvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmZpbHRlck92ZXJyaWRpbmdGdW5jdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb2x1bW4uZmlsdGVyT3ZlcnJpZGluZ0Z1bmN0aW9uKHZhbHVlLCBpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2FzZVNlbnNpdGl2ZUZpbHRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b1N0cmluZygpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0RmxvYXRWYWwgPSBwYXJzZUZsb2F0KHF1ZXJ5RWRpdG9ySXRlbS52YWx1ZS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbEZsb2F0VmFsID0gcGFyc2VGbG9hdCh2YWx1ZS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0U3RyaW5nVmFsID0gcXVlcnlFZGl0b3JJdGVtLnZhbHVlLnZhbHVlLnRvU3RyaW5nKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsU3RyaW5nVmFsID0gdmFsdWUudG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnlFZGl0b3JJdGVtICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocXVlcnlFZGl0b3JJdGVtLnZhbHVlLnR5cGUgPT09IFF1ZXJ5RGF0YUl0ZW1WYWx1ZVR5cGUuU2luZ2xlRHJvcGRvd25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBxdWVyeUVkaXRvckl0ZW0udmFsdWUudHlwZSA9PT0gUXVlcnlEYXRhSXRlbVZhbHVlVHlwZS5UZXh0SW5wdXQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHF1ZXJ5RWRpdG9ySXRlbS5vcGVyYW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBRdWVyeURhdGFPcGVyYW5kLkVxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLnF1ZXJ5RWRpdG9yRXF1YWxJc0NvbnRhaW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxTdHJpbmdWYWwuaW5kZXhPZih0YXJnZXRTdHJpbmdWYWwpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBmaWx0ZXIgc3RyaW5nIGlzIGVtcHR5IHRoZW4gdHJlYXQgYXMgJ0VxdWFsSXNDb250YWluJyB0byByZWZyZXNoIGRhdGEgdGFibGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxTdHJpbmdWYWwgIT09IHRhcmdldFN0cmluZ1ZhbCAmJiAhTXNmdFNtZS5pc0VtcHR5KHRhcmdldFN0cmluZ1ZhbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUXVlcnlEYXRhT3BlcmFuZC5HdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0YXJnZXRGbG9hdFZhbCB8fCB0YXJnZXRGbG9hdFZhbCA9PT0gMCkgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhY3R1YWxGbG9hdFZhbCB8fCBhY3R1YWxGbG9hdFZhbCA9PT0gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhcmdldEZsb2F0VmFsIDw9IGFjdHVhbEZsb2F0VmFsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBRdWVyeURhdGFPcGVyYW5kLkx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRhcmdldEZsb2F0VmFsIHx8IHRhcmdldEZsb2F0VmFsID09PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGFjdHVhbEZsb2F0VmFsIHx8IGFjdHVhbEZsb2F0VmFsID09PSAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodGFyZ2V0RmxvYXRWYWwgPj0gYWN0dWFsRmxvYXRWYWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFF1ZXJ5RGF0YU9wZXJhbmQuTnE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGFjdHVhbFN0cmluZ1ZhbCAhPT0gdGFyZ2V0U3RyaW5nVmFsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGVxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxTdHJpbmdWYWwuaW5kZXhPZih0YXJnZXRTdHJpbmdWYWwpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdWVyeUVkaXRvckl0ZW0udmFsdWUudHlwZSA9PT0gUXVlcnlEYXRhSXRlbVZhbHVlVHlwZS5NdWx0aVNlbGVjdERyb3Bkb3duKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRoaXMucXVlcnlFZGl0b3JGaWx0ZXJCeU11bHRpcGxlU2VsZWN0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QsIHF1ZXJ5RWRpdG9ySXRlbSwgYWN0dWFsU3RyaW5nVmFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxdWVyeUVkaXRvckl0ZW0udmFsdWUudHlwZSA9PT0gUXVlcnlEYXRhSXRlbVZhbHVlVHlwZS5UaW1lc3BhbkRyb3Bkb3duKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRoaXMucXVlcnlFZGl0b3JGaWx0ZXJCeVRpbWVzcGFuRHJvcGRvd24oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdCwgcXVlcnlFZGl0b3JJdGVtLCBhY3R1YWxTdHJpbmdWYWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZvdW5kO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcXVlcnlFZGl0b3JGaWx0ZXJCeVRpbWVzcGFuRHJvcGRvd24oXHJcbiAgICAgICAgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0OiBRdWVyeURhdGEsIHF1ZXJ5RWRpdG9ySXRlbTogUXVlcnlEYXRhSXRlbSwgYWN0dWFsU3RyaW5nVmFsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IHF1ZXJ5RWRpdG9ySXRlbS5jb2x1bW4udmFsdWU7XHJcbiAgICAgICAgbGV0IHJlcyA9IGZhbHNlO1xyXG4gICAgICAgIGxvb3AxOlxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHNbaV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0udmFsdWUudHlwZSA9PT0gUXVlcnlEYXRhSXRlbVZhbHVlVHlwZS5UaW1lc3BhbkRyb3Bkb3duICYmIGl0ZW0uY29sdW1uICYmIGl0ZW0uY29sdW1uLnZhbHVlID09PSBmaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUudmFsdWUgJiYgaXRlbS52YWx1ZS52YWx1ZS5zdGFydCAmJiBpdGVtLnZhbHVlLnZhbHVlLmVuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gaXRlbS52YWx1ZS52YWx1ZS5zdGFydC5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gaXRlbS52YWx1ZS52YWx1ZS5lbmQuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbCA9IG5ldyBEYXRlKGFjdHVhbFN0cmluZ1ZhbCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA8PSBhY3R1YWwgJiYgYWN0dWFsIDw9IGVuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHF1ZXJ5RWRpdG9yRmlsdGVyQnlNdWx0aXBsZVNlbGVjdGlvbihcclxuICAgICAgICB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3Q6IFF1ZXJ5RGF0YSwgcXVlcnlFZGl0b3JJdGVtOiBRdWVyeURhdGFJdGVtLCBhY3R1YWxTdHJpbmdWYWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cclxuICAgICAgICBjb25zdCBmaWVsZCA9IHF1ZXJ5RWRpdG9ySXRlbS5jb2x1bW4udmFsdWU7XHJcbiAgICAgICAgbGV0IHJlcyA9IGZhbHNlO1xyXG4gICAgICAgIGxvb3AxOlxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHNbaV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtICYmIGl0ZW0udmFsdWUudHlwZSA9PT0gUXVlcnlEYXRhSXRlbVZhbHVlVHlwZS5NdWx0aVNlbGVjdERyb3Bkb3duICYmIGl0ZW0uY29sdW1uICYmIGl0ZW0uY29sdW1uLnZhbHVlID09PSBmaWVsZCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpdGVtLnZhbHVlLnZhbHVlLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0U3RyaW5nVmFsID0gaXRlbS52YWx1ZS52YWx1ZVtqXS50b1N0cmluZygpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbFN0cmluZ1ZhbCA9PT0gdGFyZ2V0U3RyaW5nVmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxvb3AxO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgaWRCYWcgdXNlZCBieSB0aGlzIGNvbXBvbmVudCB0byBzdG9yZSB1bmlxdWUgZWxlbWVudCBpZHMuXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBjcmVhdGVJZEJhZygpOiBNc2Z0U21lLlN0cmluZ01hcDxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBmaXJzdERhdGFDb2x1bW46ICcnLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiB0aGUgdHJlZSBncmlkIGFjY2Vzc2liaWxpdHkgZG9jdW1lbnRhdGlvbnM6IGh0dHBzOi8vd2lraS5tb3ppbGxhLm9yZy9BY2Nlc3NpYmlsaXR5L1RyZWVHcmlkXHJcbiAqL1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS10cmVlLXRhYmxlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVHJlZVRhYmxlQ29tcG9uZW50IGV4dGVuZHMgRGF0YVRhYmxlQ29tcG9uZW50IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnVHJlZVRhYmxlQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICAgICAgdGhpcy5zaG93QXNUcmVlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZ2V0SW5pdGlhbEhvc3RDbGFzc2VzKCkge1xyXG4gICAgICAgIHJldHVybiBzdXBlci5nZXRJbml0aWFsSG9zdENsYXNzZXMoKS5jb25jYXQoW1xyXG4gICAgICAgICAgICAnc21lLXRyZWUtdGFibGUnXHJcbiAgICAgICAgXSk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiByb2xlPVwicHJlc2VudGF0aW9uXCIgY2xhc3M9XCJzbWUtdGFibGUtaGVhZGVyIHNtZS1mb2N1cy16b25lIHNtZS1kYXRhLXRhYmxlLXRyYW5zaXRpb25cIiAjaGVhZGVyXHJcbiAgW2NsYXNzLnNtZS1zaGFkb3ctc2Nyb2xsZWQtY29udGVudF09XCJpc1Njcm9sbGVkRG93blwiIFtjbGFzcy5zbWUtdGFibGUtbXVsdGktc2VsZWN0XT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnXCJcclxuICBbY2xhc3Muc21lLXRhYmxlLXNlbGVjdGFibGVdPVwic2VsZWN0YWJsZVwiIFtjbGFzcy5zbWUtdGFibGUtaW5kZW50ZWRdPVwic2hvd0xlZnRNYXJnaW5cIlxyXG4gIFtjbGFzcy5zbWUtdGFibGUtc2VsZWN0LWFsbC1lbmFibGVkXT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnICYmIHNob3dBbGxJdGVtQ2hlY2tib3hcIj5cclxuICA8IS0tIEFjY29yZGluZyB0byB0aGUgYWNjZXNzaWJpbGl0eSB0ZWFtLCBkYXRhLXRhYmxlIGhlYWRlcnMgc2hvdWxkIGJlIGFjY2Vzc2libGUgYnkga2V5Ym9hcmRcclxuICBhbmQgdGhlIHJlc2l6ZXIgc2hvdWxkIGFsc28gYmUgYWNjZXNzZWQgYnkga2V5Ym9hcmQuLS0+XHJcbiAgPGRpdiAjaGVhZGVyVGFibGUgY2xhc3M9XCJzbWUtdGFibGUgc21lLXRhYmxlLXZpcnR1YWxpemVkIHNtZS10YWJsZS1hdXRvLXdpZHRoLXBob25lLWRvd25cIiByb2xlPVwicm93Z3JvdXBcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtcm93IHNtZS1hcnJhbmdlLXN0YWNrLWggc21lLXBvc2l0aW9uLWZsZXgtYXV0b1wiIHJvbGU9XCJyb3dcIlxyXG4gICAgICAoa2V5ZG93bik9XCJvbkhlYWRlclRhYmxlUHJlc3NlZCgkZXZlbnQpXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2FwdGlvblwiIFthdHRyLnJvbGVdPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZSc/J2NvbHVtbmhlYWRlcic6J3ByZXNlbnRhdGlvbidcIlxyXG4gICAgICAgIGRhdGEtdXRhLWlkPVwiY2hlY2tib3hDb2x1bW5cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNoZWNrYm94IHNtZS10YWJsZS1oZWFkZXItY2hlY2tib3hcIlxyXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJyAmJiBzaG93QWxsSXRlbUNoZWNrYm94ICYmIHNob3dIZWFkZXJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICA8aW5wdXQgc21lLWxpbnQtZGlzYWJsZS1zZWxmIHR5cGU9XCJjaGVja2JveFwiIFthdHRyLmFyaWEtbGFiZWxdPVwiZ2V0QWxsSXRlbUNoZWNrQm94QXJpYUxhYmVsKClcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJzaG91bGRBbGxJdGVtQ2hlY2tCb3hDaGVja2VkKClcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNoZWNrZWRdPVwic2hvdWxkQWxsSXRlbUNoZWNrQm94Q2hlY2tlZCgpPyd0cnVlJzonZmFsc2UnXCIgKGNoYW5nZSk9XCJvbkFsbEl0ZW1DaGVja0JveENsaWNrZWQoKVwiIC8+XHJcbiAgICAgICAgICA8bGFiZWwgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgYWN0dWFsQ29sdW1uczsgbGV0IGNvbEluZGV4ID0gaW5kZXhcIiBbYXR0ci5maWVsZF09XCJjb2x1bW4uZmllbGRcIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOiBjb2x1bW4ud2lkdGh9XCJcclxuICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jYXB0aW9uIHNtZS10YWJsZS1jb2x1bW4taGVhZGVyIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG8ge3tjb2x1bW4uc3R5bGVDbGFzc319XCJcclxuICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCIgW2F0dHIuZGF0YS11dGEtaWRdPVwiY29sdW1uLnV0YUlkXCIgW2F0dHIuY29sdW1uLWluZGV4XT1cImNvbEluZGV4XCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImNvbHVtbi5zb3J0YWJsZSAmJiBjb2x1bW4uc29ydGFibGUhPSdmYWxzZScgJiYgc2hvd0hlYWRlclwiXHJcbiAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1oZWFkZXItY2VsbCBzbWUtZm9jdXMtem9uZVwiIChjbGljayk9XCJjbGlja0NvbHVtbihjb2x1bW4pXCIgcm9sZT1cImNvbHVtbmhlYWRlclwiXHJcbiAgICAgICAgICBbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIHRhYmluZGV4PVwiMFwiIFthdHRyLmFyaWEtc29ydF09XCJjb2x1bW5Tb3J0U2V0dGluZ3NbY29sdW1uLmhlYWRlcl1cIj5cclxuICAgICAgICAgIDxzcGFuPnt7Y29sdW1uLmhlYWRlcn19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtaWNvbiBzbWUtbWFyZ2luLWxlZnQteHhzXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJjb2x1bW4uc29ydGFibGUgPyBnZXRTb3J0TGFiZWwoY29sdW1uKSA6IG51bGxcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1pY29uLXVwJzpjb2x1bW4uc29ydE1vZGU9PT1zb3J0TW9kZUVudW0uQXNjZW5kLCdzbWUtaWNvbi1kb3duJzpjb2x1bW4uc29ydE1vZGU9PT1zb3J0TW9kZUVudW0uRGVzY2VuZH1cIj48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiEoY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5zb3J0YWJsZSE9J2ZhbHNlJykgJiYgc2hvd0hlYWRlclwiIGNsYXNzPVwic21lLXRhYmxlLWhlYWRlci1jZWxsXCJcclxuICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIiBbdGl0bGVdPVwiY29sdW1uLmhlYWRlclwiPlxyXG4gICAgICAgICAgPHNwYW4+e3tjb2x1bW4uaGVhZGVyfX08L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS1pY29uIHNtZS1tYXJnaW4tbGVmdC14eHNcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbHVtbi5zb3J0YWJsZSA/IGdldFNvcnRMYWJlbChjb2x1bW4pIDogbnVsbFwiXHJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWljb24tdXAnOmNvbHVtbi5zb3J0TW9kZT09PXNvcnRNb2RlRW51bS5Bc2NlbmQsJ3NtZS1pY29uLWRvd24nOmNvbHVtbi5zb3J0TW9kZT09PXNvcnRNb2RlRW51bS5EZXNjZW5kfVwiPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dIZWFkZXJcIiBjbGFzcz1cInNtZS10YWJsZS1oZWFkZXItY2VsbFwiIHJvbGU9XCJjb2x1bW5oZWFkZXJcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8c21lLXJlc2l6ZXIgdGFiaW5kZXg9XCIwXCIgKm5nSWY9XCJjb2xJbmRleCE9PWFjdHVhbENvbHVtbnMubGVuZ3RoLTEgJiYgc2hvd0hlYWRlclwiXHJcbiAgICAgICAgICByZXNpemVySG9zdFNlbGVjdG9yPVwiZGl2LnNtZS10YWJsZS1oZWFkZXJcIiAocmVzaXplZCk9XCJvbkNvbHVtblJlc2l6ZWQoY29sSW5kZXgsICRldmVudClcIlxyXG4gICAgICAgICAgW3Zpc2libGVUb1NjcmVlblJlYWRlcl09XCJ0cnVlXCIgW3Nob3dSZXNpemVyQ292ZXJdPVwiZmFsc2VcIiBvcmllbnRhdGlvbj1cImxlZnRcIlxyXG4gICAgICAgICAgKHJlc2l6aW5nKT1cIm9uQ29sdW1uUmVzaXppbmcoJGV2ZW50KVwiIGNsYXNzPVwic21lLWZvY3VzLXpvbmVcIj48L3NtZS1yZXNpemVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cInNtZS1mb2N1cy16b25lIHNtZS10YWJsZS1jb250YWluZXIgc21lLWRhdGEtdGFibGUtdHJhbnNpdGlvblwiICNjb250ZW50IHJvbGU9XCJwcmVzZW50YXRpb25cIlxyXG4gIFtjbGFzcy5zbWUtdGFibGUtbXVsdGktc2VsZWN0XT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnXCIgW2NsYXNzLnNtZS10YWJsZS1zZWxlY3RhYmxlXT1cInNlbGVjdGFibGVcIlxyXG4gIFtjbGFzcy5zbWUtbWFyZ2luLXRvcC1ub25lXT1cIiFzaG93SGVhZGVyXCIgW2NsYXNzLnNtZS10YWJsZS1pbmRlbnRlZF09XCJzaG93TGVmdE1hcmdpblwiXHJcbiAgW2NsYXNzLnNtZS10YWJsZS1ncmlkLWxpbmVzXT1cInNob3dHcmlkXCJcclxuICBbY2xhc3Muc21lLXRhYmxlLXNlbGVjdC1hbGwtZW5hYmxlZF09XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJyAmJiBzaG93QWxsSXRlbUNoZWNrYm94XCJcclxuICBbY2xhc3Muc21lLXRhYmxlLWVkaXRhYmxlXT1cImVkaXRhYmxlXCI+XHJcbiAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1zY3JvbGwtY29udGFpbmVyIHNtZS1sYXlvdXQtYWJzb2x1dGUgc21lLXBvc2l0aW9uLWluc2V0LW5vbmVcIlxyXG4gICAgW25nQ2xhc3NdPVwieydzbWUtbGF5b3V0LWFic29sdXRlIHNtZS1wb3NpdGlvbi1pbnNldC1ub25lJzogc2Nyb2xsYWJsZSwgJ3NtZS1zY3JvbGxhYmxlJzogc2hvdWxkU2Nyb2xsfVwiXHJcbiAgICAjc2Nyb2xsQ29udGFpbmVyIHJvbGU9XCJyb3dncm91cFwiPlxyXG4gICAgPGRpdiByb2xlPVwicm93XCIgY2xhc3M9XCJzbWUtdGFibGUtcm93IHNtZS10YWJsZS1yb3ctcGxhY2Vob2xkZXJcIiAjZW1wdHlNZXNzYWdlIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgICpuZ0lmPVwic2hvd05vUmVjb3Jkc01lc3NhZ2UoKVwiIGRhdGEtdXRhLWlkPVwiZW1wdHktdGFibGUtbWVzc2FnZVwiPlxyXG4gICAgICA8c21lLWxvYWRpbmctd2hlZWwgKm5nSWY9XCJpc0xvYWRpbmcgfHwgIWlzQ29sdW1uV2lkdGhDYWxjdWxhdGVkXCIgW21lc3NhZ2VdPVwibG9hZGluZ01lc3NhZ2VcIj5cclxuICAgICAgPC9zbWUtbG9hZGluZy13aGVlbD5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jZWxsIHNtZS10YWJsZS1jZWxsLXBsYWNlaG9sZGVyXCI+Jm5ic3A7PC9kaXY+XHJcbiAgICAgIDxkaXYgcm9sZT1cImNlbGxcIiBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCI+e3tnZXROb1JlY29yZHNNZXNzYWdlKCl9fTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21lLWxheW91dC1yZWxhdGl2ZSBzbWUtcG9zaXRpb24tc3RyZXRjaC1oIHNtZS1hcnJhbmdlLW92ZXJmbG93LWhpZGVcIiAjc2Nyb2xsQm9keSByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUgc21lLXRhYmxlLXNjcm9sbGFibGUgc21lLXRhYmxlLXZpcnR1YWxpemVkXCIgI3Njcm9sbEFib3ZlRGF0YVxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInt0b3A6IHNjcm9sbEFib3ZlRGF0YVN0eWxlVG9wfVwiIFthdHRyLmFyaWEtaGlkZGVuXT1cInRydWVcIiBzbWUtbGludC1kaXNhYmxlPlxyXG4gICAgICAgIDwhLS0gQWJvdmUgdmlldyBwb3J0IC0tPlxyXG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJlbmRlcmVkSXRlbSBvZiByZW5kZXJlZEl0ZW1zQWJvdmVWaWV3UG9ydDsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxyXG4gICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtcm93IHNtZS10YWJsZS1yb3ctZGF0YSBzbWUtdGFibGUtcm93LXNlbGVjdGFibGVcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1yb3ctYWN0aXZlXT1cInJlbmRlcmVkSXRlbS5pbmRleCA9PT0gZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLXJvdy1zZWxlY3RlZF09XCJyZW5kZXJlZEl0ZW0uaW5kZXggPT09IGdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCkgfHwgaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLWdyb3VwLWl0ZW1dPVwicmVuZGVyZWRJdGVtLnR5cGUgPT09IHJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSXRlbVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLWdyb3VwLWhlYWRlcl09XCJyZW5kZXJlZEl0ZW0udHlwZSA9PT0gcmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXJcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS1jaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtYXJyYW5nZS1zdGFjay1oXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtdGQgc21lLXBvc2l0aW9uLWZsZXgtYXV0b1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFzaG93QXNUcmVlXCIgY2xhc3M9XCJzbWUtdGFibGUtY2hlY2tib3hcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgYWN0dWFsQ29sdW1uczsgbGV0IGNvbEluZGV4PWluZGV4XCJcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS10YWJsZS1jb2x1bW4tZmlyc3QnOiBpc0ZpcnN0RGF0YUNvbHVtbihjb2x1bW4pLCAnc21lLXRhYmxlLWdyb3VwLWhlYWRlci1jZWxsJzogcmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlcn1cIlxyXG4gICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnd2lkdGgnOmNvbHVtbi5kb21XaWR0aCsncHgnfVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtdGQgc21lLXBvc2l0aW9uLWZsZXgtYXV0byB7e2NvbHVtbi5zdHlsZUNsYXNzfX1cIlxyXG4gICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImlzVHJlZVRhYmxlUGFyZW50Tm9kZShyZW5kZXJlZEl0ZW0pID8gLTEgOiAwXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS1zY3JlZW4tcmVhZGVyIHNtZS1zY3JlZW4tcmVhZGVyLWRpc2FibGUtY29weVwiICpuZ0lmPVwiaXNGaXJzdERhdGFDb2x1bW4oY29sdW1uKVwiPlxyXG4gICAgICAgICAgICAgICAge3tnZXRBZGRpdGlvbmFsU2NyZWVuUmVjb3JkZXJDb250ZW50KHJlbmRlcmVkSXRlbSl9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyICYmIGNvbEluZGV4PT09MFwiIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrR3JvdXBUb2dnbGUocmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ1c2VHcm91cFRvZ2dsZVwiIGNsYXNzPVwic21lLWljb24gc21lLWljb24tc2l6ZS14eHMgc21lLW1hcmdpbi1yaWdodC14eHNcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1pY29uLWNoZXZyb25Eb3duJzppc0dyb3VwRXhwYW5kZWQocmVuZGVyZWRJdGVtLmRhdGEpLCAnc21lLWljb24tY2hldnJvblJpZ2h0JzohaXNHcm91cEV4cGFuZGVkKHJlbmRlcmVkSXRlbS5kYXRhKX1cIj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e3JlbmRlcmVkSXRlbS5kYXRhfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGhpcy5ncm91cEhlYWRlclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIgW3RlbXBsYXRlXT1cInRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiIFtkYXRhXT1cInJlbmRlcmVkSXRlbS5kYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5UcmVlTm9kZSAmJiAhcmVuZGVyZWRJdGVtLm5vZGUuaXNCdXN5ICYmIGNvbEluZGV4PT09MFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsXCIgW25nU3R5bGVdPVwieydwYWRkaW5nLWxlZnQnOihyZW5kZXJlZEl0ZW0uZGVwdGgqMTYrNCkrJ3B4J31cIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtZXhwYW5kYWJsZSc6IHJlbmRlcmVkSXRlbS5oYXNDaGlsZHJlbiAmJiAhcmVuZGVyZWRJdGVtLm5vZGUuaXNMZWFmfVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtaWNvbiBzbWUtaWNvbi1zaXplLXh4c1wiIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkPyd0cnVlJzonZmFsc2UnXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrVHJlZVRvZ2dsZSgkZXZlbnQsIHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1pY29uLWNoZXZyb25Eb3duJzpyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCwgJ3NtZS1pY29uLWNoZXZyb25SaWdodCc6IXJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkfVwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQgPyB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwuY29sbGFwc2UgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwuZXhwYW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsLXBsYWNlaG9sZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLlRyZWVOb2RlICYmIHJlbmRlcmVkSXRlbS5ub2RlLmlzQnVzeSAmJiBjb2xJbmRleD09PTBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbFwiIFtuZ1N0eWxlXT1cInsncGFkZGluZy1sZWZ0JzoocmVuZGVyZWRJdGVtLmRlcHRoKjE2KzQpKydweCd9XCI+XHJcbiAgICAgICAgICAgICAgICA8c21lLWxvYWRpbmctd2hlZWwgc2l6ZT1cImV4dHJhLXNtYWxsXCIgW2lubGluZV09XCJ0cnVlXCIgW2lzQmFja2dyb3VuZFRyYW5zcGFyZW50XT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgIDwvc21lLWxvYWRpbmctd2hlZWw+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsLXBsYWNlaG9sZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0FzVHJlZSAmJiBzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJyAmJiByZW5kZXJlZEl0ZW0udHlwZT09cmVuZGVyZWRJdGVtVHlwZUVudW0uVHJlZU5vZGUgJiYgY29sSW5kZXg9PTBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbCBzbWUtdGFibGUtY2hlY2tib3gtY29udGFpbmVyXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jaGVja2JveFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtjaGVja2VkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25JdGVtQ2hlY2tCb3hDbGlja2VkKHJlbmRlcmVkSXRlbSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWVkaXRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbHVtbi5ib2R5VGVtcGxhdGUgJiYgcmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiIFtjbGFzcy5zbWUtdGFibGUtY2VsbC1mdWxsLWhlaWdodF09XCJhdXRvUm93SGVpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7cmVuZGVyZWRJdGVtLmRhdGE/cmVzb2x2ZU9iamVjdFBhdGgocmVuZGVyZWRJdGVtLmRhdGEsY29sdW1uLmZpZWxkKTonLid9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyICYmIHJlbmRlcmVkSXRlbS5kYXRhICYmIGNvbHVtbi5ib2R5VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLWNlbGwtZnVsbC1oZWlnaHRdPVwiYXV0b1Jvd0hlaWdodFwiIFtjbGFzcy5zbWUtdGFibGUtY2VsbC1oZWlnaHQtYXV0b109XCJhdXRvUm93SGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyICpuZ0lmPVwiIXJlbmRlcmVkSXRlbS5kYXRhLnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sdW1uLmJvZHlUZW1wbGF0ZVwiIFtkYXRhXT1cInJlbmRlcmVkSXRlbS5kYXRhXCIgW3Jvd0luZGV4XT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlIHNtZS10YWJsZS1zY3JvbGxhYmxlXCIgI3Njcm9sbERhdGEgW2NsYXNzLnNtZS10YWJsZS12aXJ0dWFsaXplZF09XCIhZGlzYWJsZVVJVmlydHVhbGl6YXRpb25cIlxyXG4gICAgICAgIFtuZ1N0eWxlXT1cInt0b3A6IHNjcm9sbERhdGFTdHlsZVRvcH1cIiBzbWUtbGludC1kaXNhYmxlIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByZW5kZXJlZEl0ZW0gb2YgcmVuZGVyZWRJdGVtc0luQW5kQmVsb3dWaWV3UG9ydDsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIlxyXG4gICAgICAgICAgKGtleWRvd24pPVwib25Db250ZW50VGFibGVQcmVzc2VkKCRldmVudClcIiAoa2V5dXApPVwib25Db250ZW50VGFibGVLZXlVcCgkZXZlbnQpXCJcclxuICAgICAgICAgIChjb250ZXh0bWVudSk9XCJlbmFibGVSaWdodENsaWNrU2VsZWN0ID8gc2VsZWN0SXRlbSgkZXZlbnQsIHJlbmRlcmVkSXRlbSkgOiB0cnVlXCJcclxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RJdGVtKCRldmVudCwgcmVuZGVyZWRJdGVtKVwiIGNsYXNzPVwic21lLXRhYmxlLXJvdyBzbWUtdGFibGUtcm93LWRhdGEgc21lLXRhYmxlLXJvdy1zZWxlY3RhYmxlXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtcm93LWFjdGl2ZV09XCJyZW5kZXJlZEl0ZW0uaW5kZXggPT09IGdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KClcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1yb3ctc2VsZWN0ZWRdPVwicmVuZGVyZWRJdGVtLmluZGV4ID09PSBnZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpIHx8IGlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1ncm91cC1pdGVtXT1cInJlbmRlcmVkSXRlbS50eXBlID09PSByZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEl0ZW1cIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1ncm91cC1oZWFkZXJdPVwicmVuZGVyZWRJdGVtLnR5cGUgPT09IHJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCIgW2NsYXNzLnNtZS10YWJsZS1yb3ctZWRpdGFibGVdPVwiZWRpdGFibGVcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS1oYXMtdmFsaWRhdGlvbi1lcnJvcl09XCJoYXNWYWxpZGF0aW9uRXJyb3IocmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLWRhdGEtdGFibGUtcm93LW5ldy1pdGVtXT1cInJlbmRlcmVkSXRlbT8uZGF0YT8uaXNOZXdSb3dcIlxyXG4gICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwicmVuZGVyZWRJdGVtLmluZGV4ID49IDAgPyAwIDogdW5kZWZpbmVkXCIgKGRibGNsaWNrKT1cImRvdWJsZUNsaWNrUm93KCRldmVudCxyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgIChmb2N1cyk9XCJvbkNvbnRlbnRJdGVtRm9jdXNlZCgkZXZlbnQsIHJlbmRlcmVkSXRlbSlcIiAoZm9jdXNpbik9XCJvbkNvbnRlbnRJdGVtRm9jdXNlZCgkZXZlbnQsIHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uQ29udGVudEl0ZW1CbHVycmVkKCRldmVudCwgcmVuZGVyZWRJdGVtKVwiIFthdHRyLmRhdGEtcmVuZGVyZWQtaXRlbS1pbmRleF09XCJyZW5kZXJlZEl0ZW0uaW5kZXhcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJyZW5kZXJlZEl0ZW0uaW5kZXgrMlwiIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKT8ndHJ1ZSc6J2ZhbHNlJ1wiXHJcbiAgICAgICAgICAobW91c2VlbnRlcik9XCJzZXRIb3ZlcmVkUmVuZGVyZWRJdGVtKHJlbmRlcmVkSXRlbSlcIiAobW91c2VsZWF2ZSk9XCJ1bnNldEhvdmVyZWRSZW5kZXJlZEl0ZW0ocmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICByb2xlPVwicm93XCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJnZXRBcmlhRXhwYW5kZWRBdHRyaWJ1dGVWYWx1ZShyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtbGV2ZWxdPVwic2hvd0FzVHJlZSAmJiByZW5kZXJlZEl0ZW0uZGVwdGggPyAocmVuZGVyZWRJdGVtLmRlcHRoKzEpOnVuZGVmaW5lZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS1hcnJhbmdlLXN0YWNrLWhcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtdGQgc21lLXBvc2l0aW9uLWZsZXgtYXV0b1wiXHJcbiAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJyA/IGdldFJvbGVBdHRyaWJ1dGVGb3JUYWJsZVJvd0NlbGwocmVuZGVyZWRJdGVtKSA6ICdwcmVzZW50YXRpb24nXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFzaG93QXNUcmVlXCIgY2xhc3M9XCJzbWUtdGFibGUtY2VsbCBzbWUtdGFibGUtY2hlY2tib3gtY29udGFpbmVyXCIgcm9sZT1cInByZXNlbnRhdGlvblwiXHJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLWNlbGwtZnVsbC1oZWlnaHRdPVwiYXV0b1Jvd0hlaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jaGVja2JveFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFthdHRyLmFyaWEtY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pPyd0cnVlJzonZmFsc2UnXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiaWRCYWcuZmlyc3REYXRhQ29sdW1uICsgcmVuZGVyZWRJdGVtLmluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCIgKGNoYW5nZSk9XCJvbkl0ZW1DaGVja0JveENsaWNrZWQocmVuZGVyZWRJdGVtKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGFjdHVhbENvbHVtbnM7IGxldCBjb2xJbmRleD1pbmRleFwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtdGFibGUtY29sdW1uLWZpcnN0JzogaXNGaXJzdERhdGFDb2x1bW4oY29sdW1uKSwgJ3NtZS10YWJsZS1ncm91cC1oZWFkZXItY2VsbCc6IHJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXJ9XCJcclxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J3dpZHRoJzpjb2x1bW4uZG9tV2lkdGgrJ3B4J31cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLXRkIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG8ge3tjb2x1bW4uc3R5bGVDbGFzc319XCJcclxuICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cImdldFJvbGVBdHRyaWJ1dGVGb3JUYWJsZVJvd0NlbGwocmVuZGVyZWRJdGVtKVwiIFthdHRyLmFyaWEtcm93aW5kZXhdPVwicmVuZGVyZWRJdGVtLmluZGV4KzJcIlxyXG4gICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImlzVHJlZVRhYmxlUGFyZW50Tm9kZShyZW5kZXJlZEl0ZW0pID8gLTEgOiAwXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS1zY3JlZW4tcmVhZGVyIHNtZS1zY3JlZW4tcmVhZGVyLWRpc2FibGUtY29weVwiICpuZ0lmPVwiaXNGaXJzdERhdGFDb2x1bW4oY29sdW1uKVwiPlxyXG4gICAgICAgICAgICAgICAge3tnZXRBZGRpdGlvbmFsU2NyZWVuUmVjb3JkZXJDb250ZW50KHJlbmRlcmVkSXRlbSl9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyICYmIGNvbEluZGV4PT09MFwiIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrR3JvdXBUb2dnbGUocmVuZGVyZWRJdGVtKVwiIFtpZF09XCJnZXRGaXJzdENvbHVtbklkKGNvbHVtbiwgcmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ1c2VHcm91cFRvZ2dsZVwiIGNsYXNzPVwic21lLWljb24gc21lLWljb24tc2l6ZS14eHMgc21lLW1hcmdpbi1yaWdodC14eHNcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1pY29uLWNoZXZyb25Eb3duJzppc0dyb3VwRXhwYW5kZWQocmVuZGVyZWRJdGVtLmRhdGEpLCAnc21lLWljb24tY2hldnJvblJpZ2h0JzohaXNHcm91cEV4cGFuZGVkKHJlbmRlcmVkSXRlbS5kYXRhKX1cIj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIXRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e3JlbmRlcmVkSXRlbS5kYXRhfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGhpcy5ncm91cEhlYWRlclRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIgW3RlbXBsYXRlXT1cInRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiIFtkYXRhXT1cInJlbmRlcmVkSXRlbS5kYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5UcmVlTm9kZSAmJiAhcmVuZGVyZWRJdGVtLm5vZGUuaXNCdXN5ICYmIGNvbEluZGV4PT09MFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsXCIgW25nU3R5bGVdPVwieydwYWRkaW5nLWxlZnQnOihyZW5kZXJlZEl0ZW0uZGVwdGgqMTYrNCkrJ3B4J31cIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtZXhwYW5kYWJsZSc6IHJlbmRlcmVkSXRlbS5oYXNDaGlsZHJlbiAmJiAhcmVuZGVyZWRJdGVtLm5vZGUuaXNMZWFmfVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtaWNvbiBzbWUtaWNvbi1zaXplLXh4c1wiIHJvbGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkPyd0cnVlJzonZmFsc2UnXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrVHJlZVRvZ2dsZSgkZXZlbnQsIHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1pY29uLWNoZXZyb25Eb3duJzpyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCwgJ3NtZS1pY29uLWNoZXZyb25SaWdodCc6IXJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkfVwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQgPyB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwuY29sbGFwc2UgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwuZXhwYW5kXCI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsLXBsYWNlaG9sZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLlRyZWVOb2RlICYmIHJlbmRlcmVkSXRlbS5ub2RlLmlzQnVzeSAmJiBjb2xJbmRleD09PTBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbFwiIFtuZ1N0eWxlXT1cInsncGFkZGluZy1sZWZ0JzoocmVuZGVyZWRJdGVtLmRlcHRoKjE2KzQpKydweCd9XCI+XHJcbiAgICAgICAgICAgICAgICA8c21lLWxvYWRpbmctd2hlZWwgc2l6ZT1cImV4dHJhLXNtYWxsXCIgW2lubGluZV09XCJ0cnVlXCIgW2lzQmFja2dyb3VuZFRyYW5zcGFyZW50XT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgIDwvc21lLWxvYWRpbmctd2hlZWw+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS10YWJsZS1leHBhbmRlci1jZWxsLXBsYWNlaG9sZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0FzVHJlZSAmJiBzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJyAmJiByZW5kZXJlZEl0ZW0udHlwZT09cmVuZGVyZWRJdGVtVHlwZUVudW0uVHJlZU5vZGUgJiYgY29sSW5kZXg9PTBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbCBzbWUtdGFibGUtY2hlY2tib3gtY29udGFpbmVyXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jaGVja2JveFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFthdHRyLmFyaWEtY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pPyd0cnVlJzonZmFsc2UnXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiaWRCYWcuZmlyc3REYXRhQ29sdW1uICsgcmVuZGVyZWRJdGVtLmluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCIgKGNoYW5nZSk9XCJvbkl0ZW1DaGVja0JveENsaWNrZWQocmVuZGVyZWRJdGVtKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZWRpdGFibGVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhY29sdW1uLmJvZHlUZW1wbGF0ZSAmJiByZW5kZXJlZEl0ZW0udHlwZSE9cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCIgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWZ1bGwtaGVpZ2h0XT1cImF1dG9Sb3dIZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICBbaWRdPVwiZ2V0Rmlyc3RDb2x1bW5JZChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZ2V0Q29sdW1uVG9vbHRpcFRleHQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7cmVuZGVyZWRJdGVtLmRhdGE/cmVzb2x2ZU9iamVjdFBhdGgocmVuZGVyZWRJdGVtLmRhdGEsY29sdW1uLmZpZWxkKTonLid9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiByZW5kZXJlZEl0ZW0uZGF0YSAmJiBjb2x1bW4uYm9keVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiIFtjbGFzcy5zbWUtdGFibGUtY2VsbC1oZWlnaHQtYXV0b109XCJhdXRvUm93SGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWZ1bGwtaGVpZ2h0XT1cImF1dG9Sb3dIZWlnaHRcIiBbaWRdPVwiZ2V0Rmlyc3RDb2x1bW5JZChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZ2V0Q29sdW1uVG9vbHRpcFRleHQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIgKm5nSWY9XCIhcmVuZGVyZWRJdGVtLmRhdGEucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJjb2x1bW4uYm9keVRlbXBsYXRlXCIgW2RhdGFdPVwicmVuZGVyZWRJdGVtLmRhdGFcIiBbcm93SW5kZXhdPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgPC9zbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGFibGUgJiYgIWNvbHVtbi5ib2R5RWRpdFRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlICYmIHJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIlxyXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZ2V0Q29sdW1uVG9vbHRpcFRleHQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7cmVuZGVyZWRJdGVtLmRhdGE/cmVzb2x2ZU9iamVjdFBhdGgocmVuZGVyZWRJdGVtLmRhdGEuY29udGVudCxjb2x1bW4uZmllbGQpOicuJ319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyICYmIHJlbmRlcmVkSXRlbS5kYXRhICYmIGNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiXHJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJnZXRDb2x1bW5Ub29sdGlwVGV4dChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlciAqbmdJZj1cIiFyZW5kZXJlZEl0ZW0uZGF0YS5wbGFjZWhvbGRlclwiIFtyZW5kZXJlZEl0ZW1dPVwicmVuZGVyZWRJdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sdW1uLmJvZHlSZWFkVGVtcGxhdGVcIiBbZGF0YV09XCJyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50XCIgW3Jvd0luZGV4XT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRhYmxlICYmIGNvbHVtbi5ib2R5RWRpdFRlbXBsYXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNob3VsZFNob3dFZGl0Um93KHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2x1bW4uYm9keVJlYWRUZW1wbGF0ZSAmJiByZW5kZXJlZEl0ZW0udHlwZSE9cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJnZXRDb2x1bW5Ub29sdGlwVGV4dChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e3JlbmRlcmVkSXRlbS5kYXRhP3Jlc29sdmVPYmplY3RQYXRoKHJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnQsY29sdW1uLmZpZWxkKTonLid9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZSE9cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXIgJiYgcmVuZGVyZWRJdGVtLmRhdGEgJiYgY29sdW1uLmJvZHlSZWFkVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJnZXRDb2x1bW5Ub29sdGlwVGV4dChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyICpuZ0lmPVwiIXJlbmRlcmVkSXRlbS5kYXRhLnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJjb2x1bW4uYm9keVJlYWRUZW1wbGF0ZVwiIFtkYXRhXT1cInJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnRcIiBbcm93SW5kZXhdPVwicm93SW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG91bGRTaG93RWRpdFJvdyhyZW5kZXJlZEl0ZW0pXCIgY2xhc3M9XCJzbWUtdGFibGUtY2VsbCBzbWUtdGFibGUtZWRpdC1jb250YWluZXJcIlxyXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZ2V0Q29sdW1uVG9vbHRpcFRleHQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIgKm5nSWY9XCIhcmVuZGVyZWRJdGVtLmRhdGEucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0ZW1wbGF0ZV09XCJjb2x1bW4uYm9keUVkaXRUZW1wbGF0ZVwiIFtmaWVsZF09XCJjb2x1bW4uZmllbGRcIiBbZGF0YV09XCJyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50XCJcclxuICAgICAgICAgICAgICAgICAgICBbcm93SW5kZXhdPVwicm93SW5kZXhcIiBbcmVuZGVyZWRJdGVtXT1cInJlbmRlcmVkSXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHZhbGlkYXRpb25BbGVydCk9XCJvblZhbGlkYXRpb25BbGVydEhhbmRsZXIocmVuZGVyZWRJdGVtLCBjb2x1bW4uZmllbGQsICRldmVudC5hbGVydClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChkYXRhQ2hhbmdlZCk9XCJvbkVkaXRhYmxlRGF0YUNoYW5nZWQoJGV2ZW50LnJlbmRlcmVkSXRlbSwkZXZlbnQuZmllbGQpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaGFzVmFsaWRhdGlvbkVycm9yKHJlbmRlcmVkSXRlbSlcIiBjbGFzcz1cInNtZS10YWJsZS1yb3ctdmFsaWRhdGlvblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLXRkIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG9cIlxyXG4gICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZScgPyBnZXRSb2xlQXR0cmlidXRlRm9yVGFibGVSb3dDZWxsKHJlbmRlcmVkSXRlbSkgOiAncHJlc2VudGF0aW9uJ1wiXHJcbiAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZSc/JzAnOid1bmRlZmluZWQnXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdmFsaWRhdGlvblJlc3VsdEl0ZW0gb2YgcmVuZGVyZWRJdGVtLnZhbGlkYXRpb25SZXN1bHRcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtZS12YWxpZGF0aW9uLWFsZXJ0IFthbGVydF09XCJ2YWxpZGF0aW9uUmVzdWx0SXRlbS5hbGVydFwiPjwvc21lLXZhbGlkYXRpb24tYWxlcnQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLXJvd1wiICN0ZW1wUm93PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS10ZFwiIHRhYmluZGV4PVwiMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIj4mbmJzcDs8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cInNob3VsZFVzZUxhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50XCIgI2xhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50IGNsYXNzPVwic21lLWZvY3VzLXpvbmVcIlxyXG4gICAgICBkYXRhLXNtZS1sYXN0LWZvY3VzYWJsZS1zaGFkb3ctZWxlbWVudCAoZm9jdXMpPVwib25MYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudEZvY3VzZWQoJGV2ZW50KVwiIHRhYmluZGV4PVwiMFwiPjwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJzbWUtbGF5b3V0LWFic29sdXRlIHNtZS1wb3NpdGlvbi1pbnNldC1ub25lXCJcclxuICAgICpuZ0lmPVwiaXNCdXN5IHx8ICh0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzayAmJiB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5pc1J1bm5pbmcpXCI+XHJcbiAgICA8c21lLWxvYWRpbmctd2hlZWwgW2lzQmFja2dyb3VuZFRyYW5zcGFyZW50XT1cInRydWVcIj48L3NtZS1sb2FkaW5nLXdoZWVsPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiAjcmVzaXplckluZGljYXRvclxyXG4gIGNsYXNzPVwic21lLXdpZHRoLXh4cyBzbWUtbGF5b3V0LWFic29sdXRlIHNtZS1wb3NpdGlvbi1zdHJldGNoLXYgc21lLWJhY2tncm91bmQtY29sb3ItYmFzZS04MCBzbWUtbGF5ZXItZmx5b3V0IHNtZS1sYXlvdXQtbm9uZVwiPlxyXG48L2Rpdj5cclxuIl19
|
|
5577
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBR0gsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFDTCxNQUFNLEVBR04sTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFDeEcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDBFQUEwRSxDQUFDO0FBQ2pHLE9BQU8sRUFBd0IsT0FBTyxFQUFFLE1BQU0scUVBQXFFLENBQUM7QUFDcEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnRUFBZ0UsQ0FBQztBQUMxRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdkYsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3RFLE9BQU8sRUFBVSxtQkFBbUIsRUFBRSxNQUFN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R007UUFDUixpQkFBTTtRQUNOLCtCQUVNOztRQTFUSixpRUFBb0QsNERBQUEsd0NBQUEsMENBQUEsNkZBQUE7UUFRakIsZUFBc0U7UUFBdEUsMEZBQXNFO1FBR2hHLGVBQXFFO1FBQXJFLG9HQUFxRTtRQU9sRCxlQUFrQjtRQUFsQiwyQ0FBa0I7UUE0QjlDLGVBQTJEO1FBQTNELDBFQUEyRCx3Q0FBQSx3Q0FBQSwwQ0FBQSxzQ0FBQSw2RkFBQSxvQ0FBQTtRQU16RCxlQUF1RztRQUF2Ryx3RkFBdUc7UUFHcEcsZUFBNEI7UUFBNUIsaURBQTRCO1FBUTNCLGVBQTBDO1FBQTFDLG1GQUEwQztRQUFDLG1DQUF5QjtRQUV0QyxlQUErQjtRQUEvQix3REFBK0I7UUFpRlAsZUFBd0Q7UUFBeEQscUVBQXdEO1FBQzlHLDhFQUFxQztRQUNQLGVBQW9DO1FBQXBDLDZEQUFvQztRQTRKaEUsZUFBeUM7UUFBekMsOERBQXlDO1FBSTlDLGVBQThFO1FBQTlFLCtGQUE4RTs7dUZEODdIdEUsa0JBQWtCO2NBSjlCLFNBQVM7ZUFBQztnQkFDUCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixXQUFXLEVBQUUsNkJBQTZCO2FBQzdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIEFmdGVyVmlld0NoZWNrZWQsXHJcbiAgICBBZnRlclZpZXdJbml0LFxyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBDb250ZW50Q2hpbGQsXHJcbiAgICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5qZWN0b3IsXHJcbiAgICBJbnB1dCxcclxuICAgIE5nWm9uZSxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE91dHB1dCxcclxuICAgIFF1ZXJ5TGlzdCxcclxuICAgIFRlbXBsYXRlUmVmLFxyXG4gICAgVmlld0NoaWxkLFxyXG4gICAgVmlld0NoaWxkcmVuXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERlYm91bmNlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9iYXNlL2RlY29yYXRvcnMvZGVib3VuY2UuZGVjb3JhdG9ycyc7XHJcbmltcG9ydCB7IFlpZWxkIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9iYXNlL2RlY29yYXRvcnMveWllbGQuZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgRWxlbWVudEZvY3VzaW5nRXZlbnQsIEtleUNvZGUgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RhdGEvYWNjZXNzaWJpbGl0eS1tYW5hZ2VyJztcclxuaW1wb3J0IHsgQ29yZUVudmlyb25tZW50IH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2NvcmUtZW52aXJvbm1lbnQnO1xyXG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGlhZ25vc3RpY3MvbG9nLWxldmVsJztcclxuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGlhZ25vc3RpY3MvbG9nZ2luZyc7XHJcbmltcG9ydCB7IERvbSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZG9tL2RvbSc7XHJcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb3JlQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFNtZUluamVjdCB9IGZyb20gJy4uL2NvbW1vbi9kZWNvcmF0b3JzL2luamVjdGlvbi5kZWNvcmF0b3JzJztcclxuaW1wb3J0IHsgTGF5b3V0LCBTTUVfTEFZT1VUX1BST1ZJREVSIH0gZnJvbSAnLi4vY29tbW9uL2xheW91dCc7XHJcbmltcG9ydCB7IEZvcm1GaWVsZENvbnRhaW5lciB9IGZyb20gJy4uL2Zvcm0vZm9ybS1maWVsZC9mb3JtLWZpZWxkLWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IFNlYXJjaEZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vZm9ybS1maWVsZC9zZWFyY2gvc2VhcmNoLWZvcm0tZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUXVlcnlEYXRhLCBRdWVyeURhdGFJdGVtLCBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLCBRdWVyeURhdGFPcGVyYW5kIH0gZnJvbSAnLi4vcXVlcnktZWRpdG9yL3F1ZXJ5LWVkaXRvci1jb250cmFjdCc7XHJcbmltcG9ydCB7IERhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyIH0gZnJvbSAnLi9kYXRhLXRhYmxlLWFjY2Vzc2liaWxpdHktbWFuYWdlcic7XHJcbmltcG9ydCB7IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4vZGF0YS10YWJsZS1jb2x1bW4uY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICAgIERhdGFUYWJsZUN1c3RvbVNvcnRFdmVudCxcclxuICAgIERhdGFUYWJsZURhdGFJdGVtLFxyXG4gICAgRGF0YVRhYmxlTGF6eUxvYWRFdmVudCxcclxuICAgIERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZSxcclxuICAgIERhdGFUYWJsZVJlbmRlcmVkSXRlbSxcclxuICAgIERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUsXHJcbiAgICBEYXRhVGFibGVTb3J0TW9kZSxcclxuICAgIEVkaXRhYmxlRGF0YUNoYW5nZVNldCxcclxuICAgIEVkaXRhYmxlRGF0YUl0ZW0sXHJcbiAgICBOb2RlTmF2aWdhdGluZ1Rhc2ssXHJcbiAgICBUcmVlTm9kZURhdGFJdGVtXHJcbn0gZnJvbSAnLi9kYXRhLXRhYmxlLWNvbnRyYWN0JztcclxuaW1wb3J0IHsgRGF0YVRhYmxlUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIgfSBmcm9tICcuL2RhdGEtdGFibGUtcmVzcG9uc2l2ZS13aW5kb3ctbWFuYWdlcic7XHJcbmltcG9ydCB7IERhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQeENvbnZlcnRlciB9IGZyb20gJy4vaGVscGVycy9weC1jb252ZXJ0ZXInO1xyXG5cclxuLyoqXHJcbiAqIERhdGEgdGFibGUgY29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWRhdGEtdGFibGUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVDb21wb25lbnQgZXh0ZW5kcyBDb3JlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgT25EZXN0cm95IHtcclxuICAgIHByaXZhdGUgc3RhdGljIHNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbiA9ICdtdWx0aXBsZSc7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBtaW5Db2x1bW5XaWR0aCA9IDUwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgcHhDb252ZXJ0ZXIgPSBuZXcgUHhDb252ZXJ0ZXIoKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnRGF0YVRhYmxlQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzQ29tcG9uZW50SW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgZWRpdGFibGVEYXRhQ2hhbmdlU2V0OiBFZGl0YWJsZURhdGFDaGFuZ2VTZXQgPSB7XHJcbiAgICAgICAgYWRkZWRJdGVtczogW10sXHJcbiAgICAgICAgdXBkYXRlZEl0ZW1zOiBbXSxcclxuICAgICAgICBkZWxldGVkSXRlbXM6IFtdXHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgZGVmYXVsdFNjcm9sbFBpeGVscyA9IDkwO1xyXG4gICAgcHJpdmF0ZSBkZWZhdWx0U2Nyb2xsUGVyY2VudGFnZSA9IDAuNDtcclxuICAgIHByaXZhdGUgbWF4QWN0dWFsU2Nyb2xsRGF0YUVsZW1lbnRIZWlnaHQgPSA1MDAwMDA7XHJcbiAgICBwcml2YXRlIGZpbHRlckRlYm91bmNlVGltZW91dCA9IDMwMDtcclxuICAgIHByaXZhdGUga2V5Ym9hcmROYXZpZ2F0aW9uRGVib3VuY2VUaW1lb3V0ID0gMTAwO1xyXG4gICAgcHJpdmF0ZSBzY3JvbGxDaGVja0ludGVydmFsRHVyYXRpb24gPSAzMDA7XHJcbiAgICBwcml2YXRlIHNjcm9sbENoZWNrSW50ZXJ2YWw7XHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgYnVmZmVyUm93UmF0ZSA9IDE7XHJcbiAgICBwcml2YXRlIGV2ZW50VW5yZWdpc3RyYXRlckhhbmRsZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBzb3J0Q29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ7XHJcbiAgICBwcml2YXRlIHByZXZpb3VzU29ydENvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50O1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEl0ZW1zOiBEYXRhVGFibGVEYXRhSXRlbVtdO1xyXG4gICAgcHJpdmF0ZSBhY3R1YWxJdGVtczogRGF0YVRhYmxlRGF0YUl0ZW1bXTtcclxuICAgIHByaXZhdGUgY2FsY3VsYXRlZFNjcm9sbGJhcldpZHRoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGN1cnJlbnRIYXNWZXJ0aWNhbE92ZXJmbG93OiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBmaWx0ZXJEZWJvdW5jZVRpbWVyO1xyXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzU2VsZWN0ZWRSb3dUaW1lcjtcclxuICAgIHByaXZhdGUgb2xkRmlsdGVyS2V5d29yZDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBmaWx0ZXJLZXl3b3JkOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGludGVybmFsR2xvYmFsRmlsdGVyOiBhbnk7XHJcbiAgICBwcml2YXRlIHNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgaXNTY3JvbGxpbmc6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGlzU2Nyb2xsaW5nRXZlbnRIYW5kbGVyU2V0dXA6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIGRpc3BsYXlJdGVtc1RvcDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFJlbmRlcmVkSXRlbXM6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdID0gW107XHJcbiAgICBwcml2YXRlIGludGVybmFsU2VsZWN0aW9uOiBEYXRhVGFibGVEYXRhSXRlbVtdID0gW107XHJcbiAgICBwcml2YXRlIGhhc0xvbmdMaXN0OiBib29sZWFuO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50U3RhcnRJbmRleE9mSXRlbUluVmlld1BvcnQgPSAtMTtcclxuICAgIHByaXZhdGUgZGF0YVNjcm9sbFRvcDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50UmVuZGVyZWRJdGVtSW5WaWV3UG9ydDogRGF0YVRhYmxlUmVuZGVyZWRJdGVtO1xyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbEdyb3VwQ29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ7XHJcbiAgICBwcml2YXRlIGludGVybmFsR3JvdXBTb3J0TW9kZSA9IERhdGFUYWJsZVNvcnRNb2RlLk5vbmU7XHJcbiAgICBwcml2YXRlIGludGVybmFsU2VsZWN0aW9uTW9kZTogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBzaGFkb3dUcmVlOiBhbnk7IC8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBtYWludGFpbiB0aGUgdHJlZSB0byBoZWxwIGRvIHRoZSBcInNhbWUgbGV2ZWwgb25seVwiIHNvcnQuXHJcbiAgICBwcml2YXRlIGFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ID0gLTE7XHJcbiAgICBwcml2YXRlIHByZXZpb3VzQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggPSAtMTtcclxuICAgIHByaXZhdGUgYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCA9IC0xO1xyXG4gICAgcHJpdmF0ZSBob3ZlcmVkUmVuZGVyZWRJdGVtSW5kZXggPSAtMTtcclxuICAgIHByaXZhdGUgcmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSByZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0ID0gMDtcclxuICAgIHByaXZhdGUgY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gLTE7XHJcbiAgICBwcml2YXRlIHVucmVnaXN0ZXJPbkVsZW1lbnRGb2N1c2luZ0V2ZW50SGFuZGxlcjogKCkgPT4gdm9pZDtcclxuICAgIHByaXZhdGUgY29udGVudEFyZWFIYXNGb2N1cyA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBlZGl0YWJsZU5ld1Jvd0hhc0ZvY3VzID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGNhbmNlbExhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Rm9jdXNPbmNlID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGxheW91dENoYW5nZVN1YnNjcmliZXI7XHJcbiAgICBwcml2YXRlIGdsb2JhbEZpbHRlclN1YnNjcmliZXI7XHJcbiAgICBwcml2YXRlIGdyb3VwS2V5czogeyBba2V5OiBzdHJpbmddOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXSB9ID0ge307XHJcbiAgICBwcml2YXRlIGludGVybmFsQ29sdW1uczogUXVlcnlMaXN0PERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudD47XHJcbiAgICBwcml2YXRlIHRyZWVUb2dnbGVTdGF0dXM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XHJcbiAgICBwcml2YXRlIHNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gLTE7XHJcbiAgICBwcml2YXRlIGludGVybmFsUXVlcnlFZGl0b3I6IFF1ZXJ5RGF0YTtcclxuICAgIHByaXZhdGUgYWN0dWFsQ29sdW1uUHJvY2Vzc2VkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIHRyeVRvRm9jdXNFbXB0eU1lc3NhZ2VDb3VudCA9IDM7XHJcbiAgICBwcml2YXRlIGFjY2VzaWJpbGl0eU1hbmFnZXIgPSBDb3JlRW52aXJvbm1lbnQuYWNjZXNzaWJpbGl0eU1hbmFnZXI7XHJcblxyXG4gICAgcHJpdmF0ZSBpbnRlcm5hbFRhYmxlQXJpYUxhYmVsbGVkQnk6IHN0cmluZztcclxuICAgIHB1YmxpYyBpbnRlcm5hbFRhYmxlQXJpYUxhYmVsOiBzdHJpbmc7XHJcblxyXG4gICAgcHVibGljIHNjcm9sbERhdGFTdHlsZVRvcDogc3RyaW5nO1xyXG4gICAgcHVibGljIHNjcm9sbEFib3ZlRGF0YVN0eWxlVG9wOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHB1YmxpYyBkYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlciA9IG5ldyBEYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlcigpO1xyXG4gICAgcHVibGljIERhdGFUYWJsZVJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyOiBEYXRhVGFibGVSZXNwb25zaXZlV2luZG93TWFuYWdlcjtcclxuICAgIHB1YmxpYyBjb2x1bW5Tb3J0U2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdyZXNpemVySW5kaWNhdG9yJylcclxuICAgIHByaXZhdGUgcmVzaXplckluZGljYXRvcjogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdoZWFkZXInKVxyXG4gICAgcHJpdmF0ZSBoZWFkZXJFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2hlYWRlclRhYmxlJylcclxuICAgIHByaXZhdGUgaGVhZGVyVGFibGVFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRlbnQnKVxyXG4gICAgcHJpdmF0ZSBjb250ZW50RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gICAgcHJpdmF0ZSBzY3JvbGxDb250YWluZXJFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ3RlbXBSb3cnKVxyXG4gICAgcHJpdmF0ZSB0ZW1wUm93RWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxCb2R5JywgeyBzdGF0aWM6IHRydWUgfSlcclxuICAgIHByaXZhdGUgc2Nyb2xsQm9keUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsQWJvdmVEYXRhJylcclxuICAgIHByaXZhdGUgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdzY3JvbGxEYXRhJylcclxuICAgIHByaXZhdGUgc2Nyb2xsRGF0YUVsZW1lbnQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnZW1wdHlNZXNzYWdlJylcclxuICAgIHByaXZhdGUgZW1wdHlNZXNzYWdlRWxlbWVudDogRWxlbWVudFJlZjtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdsYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudCcpXHJcbiAgICBwcml2YXRlIGxhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGQoJ2dyb3VwJylcclxuICAgIHB1YmxpYyBncm91cEhlYWRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgc2luY2UgOS8yNS8yMDE5LiBQbGVhc2UgdXNlICdjaGFuZ2VzZXRVcGRhdGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvbkNoYW5nZXNldFVwZGF0ZWQoKTogRXZlbnRFbWl0dGVyPEVkaXRhYmxlRGF0YUNoYW5nZVNldD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5nZXNldFVwZGF0ZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZXNldFVwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEVkaXRhYmxlRGF0YUNoYW5nZVNldD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGVtaXRzIHRoZSBldmVudCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2luZyBpcyBoYXBwZW5pbmcuXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlRGF0YUl0ZW0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBlbWl0cyB0cnVlIHdoZW4gdGFibGUgaXMgcmVuZGVyZWQgd2l0aCBtaW4taGVpZ2h0IG9uIHBob25lIGRvd25cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBpc1RhYmxlUmVuZGVyZWRXaXRoTWluSGVpZ2h0UGhvbmVEb3duOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ3Jvd0RibGNsaWNrJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvblJvd0RibGNsaWNrKCk6IEV2ZW50RW1pdHRlcjx7IGRhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3dEYmxjbGljaztcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgcm93RGJsY2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAnZ3JvdXBUb2dnbGVDbGljaycgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25Hcm91cFRvZ2dsZUNsaWNrZWQoKTogRXZlbnRFbWl0dGVyPHsgZ3JvdXBEYXRhOiBEYXRhVGFibGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBUb2dnbGVDbGljaztcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ3JvdXBUb2dnbGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyBncm91cERhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ2VkaXRhYmxlUm93QWRkZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uTmV3RWRpdGFibGVSb3dBZGRlZCgpOiBFdmVudEVtaXR0ZXI8eyBkYXRhOiBhbnksIG92ZXJyaWRlTmV3RGF0YUhhbmRsZXI6IChkYXRhOiBhbnkpID0+IHZvaWQgfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRhYmxlUm93QWRkZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGVkaXRhYmxlUm93QWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZGF0YTogYW55LCBvdmVycmlkZU5ld0RhdGFIYW5kbGVyOiAoZGF0YTogYW55KSA9PiB2b2lkIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGNvbHVtbnMgcmVuZGVyZWQgb24gdGhlIFVJLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGNvbHVtbnMoKTogUXVlcnlMaXN0PERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsQ29sdW1ucztcclxuICAgIH1cclxuXHJcbiAgICBAQ29udGVudENoaWxkcmVuKERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudClcclxuICAgIHB1YmxpYyBzZXQgY29sdW1ucyh2YWx1ZTogUXVlcnlMaXN0PERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudD4pIHtcclxuICAgICAgICB0aGlzLmludGVybmFsQ29sdW1ucyA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBAVmlld0NoaWxkcmVuKERhdGFUYWJsZVRlbXBsYXRlTG9hZGVyQ29tcG9uZW50KVxyXG4gICAgcHJpdmF0ZSBkYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudHM6IFF1ZXJ5TGlzdDxEYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudD47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGFjdHVhbCBjb2x1bW5zIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgdGFibGUuXHJcbiAgICAgKiBJbiBncm91cGluZyBkYXRhIHRhYmxlIHNjZW5hcmlvLCB0aGUgYWN0dWFsIGNvbHVtbnMgZG9lc24ndCBjb250YWluIHRoZSBncm91cGluZyBjb2x1bW4uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhY3R1YWxDb2x1bW5zOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnRbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgaXRlbSByZW5kZXJlZCBvbiB0aGUgVUkgKGluY2x1ZGluZyB0aGUgaXRlbXMgaW4gYW5kIG91dHNpZGUgb2YgdmlldyBwb3J0KS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCByZW5kZXJlZEl0ZW1zKCk6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFJlbmRlcmVkSXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCByZW5kZXJlZEl0ZW1zKHZhbHVlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW1bXSkge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxSZW5kZXJlZEl0ZW1zID0gdmFsdWUgfHwgW107XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zQ2hhbmdlLmVtaXQoKTtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1yb3djb3VudCcsIHZhbHVlLmxlbmd0aCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZpbHRlcmVkSXRlbXM6IERhdGFUYWJsZURhdGFJdGVtW10gPSBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyByZW5kZXJlZCBpdGVtcyBhcmUgY2hhbmdlZC5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgcmVuZGVyZWRJdGVtc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgYmFja2dyb3VuZCBidXN5IHRhc2tzLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGlzQnVzeTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgcmlnaHQgY2xpY2sgc2VsZWN0XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZW5hYmxlUmlnaHRDbGlja1NlbGVjdCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHRoZSBtZXNzYWdlIHNob3dpbmcgd2hlbiB0aGUgZGF0YSBpcyBsb2FkaW5nLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxvYWRpbmdNZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIG1lc3NhZ2Ugc2hvd2luZyB3aGVuIHRoZSBkYXRhIGxvYWRpbmcgaXMgZmluaXNoZWQgYnV0IHRoZSBkYXRhIGlzIGVtcHR5IG9yIG5vIGRhdGEgZ290IHJlbmRlcmVkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIG5vUmVjb3JkTWVzc2FnZTogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZWRpdGFibGU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBleHBhbmQgdHJlZSBub2RlIG9uIHJvb3Qgbm9kZSBjaGVja2VkLiBUaGlzIHBhcmFtZXRlciBjYW4gb25seSBiZSB1c2VkIGZvciB0cmVlIHRhYmxlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGV4cGFuZFRyZWVOb2RlT25DaGVja2VkID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIGFsbCBlZGl0YWJsZSByb3dzIGluIGFuIGVkaXRhYmxlIHRhYmxlIHNob3VsZCBiZSB2aXNpYmxlIChyZWdhcmRsZXNzIG9mIGhvdmVyL3NlbGVjdGVkIHN0YXRlKS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBpc0FsbEVkaXRhYmxlUm93c1Zpc2libGU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEl0IGluZGljYXRlcyB0aGF0IGEgc2Nyb2xsYmFyIGNhbiBiZSB1c2VkIHdoZW4gdGhlIGV4cGVjdGVkIG51bWJlciBvZiBjb2x1bW5zIGlzIGh1Z2VcclxuICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNjcm9sbGFibGVIb3Jpem9udGFsID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhhdCBhIGRhdGEgbGF6eSBsb2FkaW5nIG5lZWRzIHRvIGhhcHBlbiBhbmQgcmVxdWlyZSB0aGUgY29uc3VtZXIgdG8gcHJvdmlkZSBkYXRhIGZvciB0aGUgbGF6eSBsb2FkaW5nIHBhcnQuXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGxhenlMb2FkaW5nRGF0YTogRXZlbnRFbWl0dGVyPERhdGFUYWJsZUxhenlMb2FkRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRhVGFibGVMYXp5TG9hZEV2ZW50PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgdHJpZ2dlcnMgd2hlbiBhIHRyZWUgbm9kZSBpcyBleHBhbmRlZC5cclxuICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDkvMjUvMjAxOS4gUGxlYXNlIHVzZSAnbm9kZUV4cGFuZGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvbk5vZGVFeHBhbmQoKTogRXZlbnRFbWl0dGVyPHsgbm9kZTogVHJlZU5vZGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubm9kZUV4cGFuZGVkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBub2RlRXhwYW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgbm9kZTogVHJlZU5vZGVEYXRhSXRlbSB9PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgdHJpZ2dlcnMgd2hlbiBhIHRyZWUgbm9kZSBpcyBjb2xsYXBzZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ25vZGVDb2xsYXBzZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uTm9kZUNvbGxhcHNlZCgpOiBFdmVudEVtaXR0ZXI8eyBub2RlOiBUcmVlTm9kZURhdGFJdGVtIH0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub2RlQ29sbGFwc2VkO1xyXG4gICAgfVxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBub2RlQ29sbGFwc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx7IG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHRyaWdnZXJzIHdoZW4gYSB0cmVlIG5vZGUgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ25vZGVTZWxlY3RlZCcgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25Ob2RlU2VsZWN0KCk6IEV2ZW50RW1pdHRlcjx7IG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0gfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVTZWxlY3RlZDtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgbm9kZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgZGF0YSBpcyBsb2FkZWQgaW4gbGF6eSBsb2FkaW5nIHdheS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBsYXp5TG9hZDogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHJlbWVtYmVyIHRoZSB0cmVlIHRvZ2dsZSBzdGF0dXMuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgcmVtZW1iZXJUcmVlTm9kZVRvZ2dsZTogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHJlbWVtYmVyIHRoZSBzZWxlY3Rpb24gdGhlbiBhZnRlciB0aGUgd2hvbGUgZGF0YSBzb3VyY2UgaXMgcmVmcmVzaGVkIHRoZSBzZWxlY3Rpb24gd2lsbCBzdGlsbCBiZSB0aGVyZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyByZW1lbWJlclNlbGVjdGlvbiA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBOb3JtYWxseSB0aGUgZW50ZXIga2V5IG9uIGEgcm93IHJlZGlyZWN0cyB0byB0aGUgZG91YmxlIGNsaWNrIGJlaGF2aW9yIG9mIHRoZSByb3cuXHJcbiAgICAgKiBJZiB0aGlzIGZsYWcgaXMgdHJ1ZSwgdGhlbiBkYXRhIHRhYmxlIHdvdWxkIGRvIG5vdGhpbmcgZm9yIGVudGVyIGtleSBvbiBhIHJvdy5cclxuICAgICAqIFRoZW4geW91IG5lZWQgdG8gaW1wbGVtZW50IHRoZSBlbnRlciBrZXkgYWN0aW9uIGJ5IHlvdXIgc2VsZi5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBwcmV2ZW50RW50ZXJLZXlGb3JEZWZhdWx0QWN0aW9uOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgcG9pbnRzIHRvIHRoZSBleHRlcm5hbCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhbiB1bmlxdWUgaWRlbnRpdHkgc3RyaW5nIGZvciBhbnkgZGF0YSBpdGVtLlxyXG4gICAgICogU29tZSBzY2VuYXJpb3MgbGlrZSB0cmVlIHRhYmxlIHdvdWxkIG5lZWQgdGhpcyBmdW5jdGlvbiB0byByZW1lbWJlciB0b2dnbGUgc3RhdHVzIGZvciBhbnkgdHJlZSBub2RlIGJ5IHRoZSBpZGVudGl0eS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXRJdGVtSWRlbnRpdHlGdW5jdGlvbjogKGRhdGE6IGFueSkgPT4gc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnkgZGVmYXVsdCBuYXR1cmFsIHNvcnQgaXMgdHVybmVkIG9uLlxyXG4gICAgICogQnV0IGZvciBwZXJmb3JtYW5jZSBjb25jZXJuLCB5b3UgbWF5IHdhbnQgdG8gZGlzYWJsZSBuYXR1cmFsIHNvcnQgYW5kIGp1c3QgZG8gdmVyeSBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb24uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGlzYWJsZU5hdHVyYWxTb3J0ID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEb24ndCBlbmFibGUgZGVmYXVsdCB0b29sdGlwcyBhbGwgb3ZlciBXQUMgYnkgZGVmYXVsdC5cclxuICAgICAqIFRPRE86IEludmVzdGlnYXRlIGVhY2ggY2FzZSBvZiBkYXRhIHRhYmxlIHVzYWdlIGFuZCBzZWUgaWYgY2FuIHVwZGF0ZSBhcyBuZWVkZWQgdG8gYWxsb3cgdGhpcyB0byBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuXHJcbiAgICAgKiBFbmFibGluZyBieSBkZWZhdWx0IHByZS1HQSBpcyByaXNreSBhbmQgbWF5IGludHJvZHVjZSByZWdyZXNzaW9ucyB0aG91Z2guXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZW5hYmxlRGVmYXVsdFRvb2x0aXBzID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGl0ZW1zIHJlbmRlcmVkIGFib3ZlIHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXJlZEl0ZW1zQWJvdmVWaWV3UG9ydDogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGl0ZW1zIHJlbmRlcmVkIGluIGFuZCBiZWxvdyB0aGUgdmlldyBwb3J0LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVuZGVyZWRJdGVtc0luQW5kQmVsb3dWaWV3UG9ydDogRGF0YVRhYmxlUmVuZGVyZWRJdGVtW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0YWJsZSBpcyBzY3JvbGxlZCBkb3duLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNTY3JvbGxlZERvd246IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0YWJsZSBzaG91bGQgaGFuZGxlIHNjcm9sbGluZyBmb3IgY29udGVudC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNob3VsZFNjcm9sbDogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBsYXN0IGZvY3VzYWJsZSBzaGFkb3cgZWxlbWVudCBzaG91bGQgYmUgdXNlZC5cclxuICAgICAqIE5vcm1hbGx5IHdoZW4gdGhlIGRhdGEgdGFibGUgaXMgdGhlIGxhc3QgZm9jdXNhYmxlIGVsZW1lbnQsXHJcbiAgICAgKiB0aGUgbGFzdCBmb2N1c2FibGUgZWxlbWVudCBuZWVkIHRvIGJlIHVzZWQgdG8gaGFuZGxlIGZvY3VzIG1vdmVtZW50LlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2hvdWxkVXNlTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnQ6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBzY3JvbGwgdG8gc2VsZWN0aW9uIGFmdGVyIHNvcnRpbmcuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvdWxkU2Nyb2xsVG9TZWxlY3Rpb25BZnRlclNvcnRpbmc6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIGFuZCBzZXRzIHRoZSBnbG9iYWwgZmlsdGVyIHZhbHVlIGh0bWwgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgZ2xvYmFsRmlsdGVyKCk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxHbG9iYWxGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBnbG9iYWxGaWx0ZXIoZ2xvYmFsRmlsdGVyOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBldmVudEhhbmRsZXIgPSAoZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5maWx0ZXJEZWJvdW5jZVRpbWVyKTtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJEZWJvdW5jZVRpbWVyID0gc2V0VGltZW91dChcclxuICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBkb1NlYXJjaChnbG9iYWxGaWx0ZXJbJ3ZhbHVlJ10pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRGVib3VuY2VUaW1lb3V0KTtcclxuICAgICAgICB9KS5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICBjb25zdCBkb1NlYXJjaCA9IChrZXl3b3JkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJLZXl3b3JkID0ga2V5d29yZDtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyS2V5d29yZCAhPT0gdGhpcy5vbGRGaWx0ZXJLZXl3b3JkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlci5lbWl0KHRoaXMuZmlsdGVyS2V5d29yZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5vbGRGaWx0ZXJLZXl3b3JkID0gdGhpcy5maWx0ZXJLZXl3b3JkO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxHbG9iYWxGaWx0ZXIgPSBnbG9iYWxGaWx0ZXI7XHJcbiAgICAgICAgaWYgKGdsb2JhbEZpbHRlcikge1xyXG4gICAgICAgICAgICBpZiAoZ2xvYmFsRmlsdGVyIGluc3RhbmNlb2YgU2VhcmNoRm9ybUZpZWxkQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlclN1YnNjcmliZXIgPSBnbG9iYWxGaWx0ZXIuc2VhcmNoLnN1YnNjcmliZShrZXl3b3JkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIuc2VhcmNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9TZWFyY2goa2V5d29yZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5zZWFyY2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgZXZlbnRIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIGV2ZW50SGFuZGxlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudFVucmVnaXN0cmF0ZXJIYW5kbGVycy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBldmVudEhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXN0ZScsIGV2ZW50SGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgYW5kIHNldHMgdGhlIENhc2UgU2Vuc2l0aXZlIGZsYWcgZm9yIGZpbHRlcmluZy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBjYXNlU2Vuc2l0aXZlRmlsdGVyOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgdGFibGUgc2hvdWxkIGJlIHJlbmRlcmVkIGFzIGEgdHJlZSBkYXRhIHRhYmxlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3dBc1RyZWU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIGRhdGEgc3RydWN0dXJlIGZvciB0aGUgbmV3IGl0ZW1cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBlZGl0YWJsZU5ld0RhdGFJdGVtOiBEYXRhVGFibGVEYXRhSXRlbTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIGFuZCBzZXRzIHRoZSBkYXRhIHNvdXJjZSBvZiB0aGUgZGF0YSB0YWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgaXRlbXMoKTogRGF0YVRhYmxlRGF0YUl0ZW1bXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgPyB0aGlzLmludGVybmFsSXRlbXMubWFwKGl0ZW0gPT4gaXRlbS5jb250ZW50KSA6IHRoaXMuaW50ZXJuYWxJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGl0ZW1zKHZhbHVlOiBEYXRhVGFibGVEYXRhSXRlbVtdKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlbWVtYmVyU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlSGlnaGxpZ2h0RnJvbVJvdygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hY3R1YWxJdGVtcyA9IHZhbHVlO1xyXG5cclxuICAgICAgICBsZXQgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IG5lZWQgdG8gcmVmYWN0b3IgdG8gcmVkdWNlIHRoZSBuZXN0ZWQgaWYgYmxvY2tzLlxyXG4gICAgICAgIGlmICh0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3Rpb25JZGVudGl0eVRvUmVtZW1iZXI6IHN0cmluZztcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGlvbikgJiYgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIucHVzaCh0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKGl0ZW0uZGF0YSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5wdXNoKHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oaXRlbSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuc2VsZWN0aW9uKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyID0gdGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbih0aGlzLnNlbGVjdGlvbi5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JZGVudGl0eVRvUmVtZW1iZXIgPSB0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKHRoaXMuc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEl0ZW1zID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMgPSB2YWx1ZS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxFZGl0YWJsZURhdGFJdGVtPntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IE1zZnRTbWUubmV3R3VpZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBpdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uQWxlcnRzOiB7fVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbWVtYmVyU2VsZWN0aW9uICYmIHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzVG9Qcm9jZXNzID0gdGhpcy5pdGVtcy5zbGljZSgwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGVzVG9Qcm9jZXNzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IG5vZGVzVG9Qcm9jZXNzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5zcGxpY2UoMCwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLmluZGV4T2YodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihjdXJyZW50Tm9kZS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oY3VycmVudE5vZGUsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb25JZGVudGl0aWVzVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmNoaWxkcmVuLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wYXJlbnQgPSBjdXJyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIuaW5kZXhPZih0aGlzLmdldEl0ZW1JZGVudGl0eUZ1bmN0aW9uKGl0ZW0pKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbklkZW50aXRpZXNUb1JlbWVtYmVyLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uSWRlbnRpdGllc1RvUmVtZW1iZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JZGVudGl0eVRvUmVtZW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2Rlc1RvUHJvY2VzcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGVzVG9Qcm9jZXNzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IG5vZGVzVG9Qcm9jZXNzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5zcGxpY2UoMCwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihjdXJyZW50Tm9kZS5kYXRhKSA9PT0gc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGN1cnJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBmb3VuZCBpbiB0aGUgcmVmcmVzaCBpdGVtcywgdGhlbiBpdCBtZWFucyB0aGUgc2VsZWN0aW9uIGlzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnROb2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZS5jaGlsZHJlbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9Qcm9jZXNzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbihpdGVtKSA9PT0gc2VsZWN0aW9uSWRlbnRpdHlUb1JlbWVtYmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIGZvdW5kIGluIHRoZSByZWZyZXNoIGl0ZW1zLCB0aGVuIGl0IG1lYW5zIHRoZSBzZWxlY3Rpb24gaXMgbm90IGNoYW5nZWQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGlvbkNoYW5nZWRBZnRlclJlZnJlc2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbkl0ZW1Ub1JlbWVtYmVyOiBEYXRhVGFibGVEYXRhSXRlbTtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlcjogRGF0YVRhYmxlRGF0YUl0ZW1bXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGlvbikgJiYgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlciA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5wdXNoKGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh0aGlzLnNlbGVjdGlvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXIgPSB0aGlzLnNlbGVjdGlvbi5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXIgPSB0aGlzLnNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxJdGVtcyA9IHZhbHVlLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gPEVkaXRhYmxlRGF0YUl0ZW0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogTXNmdFNtZS5uZXdHdWlkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25BbGVydHM6IHt9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2Rlc1RvUHJvY2VzcyA9IHRoaXMuaW50ZXJuYWxJdGVtcy5zbGljZSgwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGVzVG9Qcm9jZXNzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Tm9kZSA9IG5vZGVzVG9Qcm9jZXNzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5zcGxpY2UoMCwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5pbmRleE9mKGN1cnJlbnROb2RlLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGN1cnJlbnROb2RlLCB0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGlvbkl0ZW1zVG9SZW1lbWJlci5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlLmNoaWxkcmVuLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wYXJlbnQgPSBjdXJyZW50Tm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gc2VsZWN0aW9uSXRlbXNUb1JlbWVtYmVyLmluZGV4T2YoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb25JdGVtc1RvUmVtZW1iZXIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JdGVtVG9SZW1lbWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzVG9Qcm9jZXNzID0gdGhpcy5pdGVtcy5zbGljZSgwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobm9kZXNUb1Byb2Nlc3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnROb2RlID0gbm9kZXNUb1Byb2Nlc3NbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzVG9Qcm9jZXNzLnNwbGljZSgwLCAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5kYXRhID09PSBzZWxlY3Rpb25JdGVtVG9SZW1lbWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyBmb3VuZCBpbiB0aGUgcmVmcmVzaCBpdGVtcywgdGhlbiBpdCBtZWFucyB0aGUgc2VsZWN0aW9uIGlzIG5vdCBjaGFuZ2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3Rpb25DaGFuZ2VkQWZ0ZXJSZWZyZXNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGN1cnJlbnROb2RlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlc1RvUHJvY2Vzcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gc2VsZWN0aW9uSXRlbVRvUmVtZW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gaXMgZm91bmQgaW4gdGhlIHJlZnJlc2ggaXRlbXMsIHRoZW4gaXQgbWVhbnMgdGhlIHNlbGVjdGlvbiBpcyBub3QgY2hhbmdlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXRFZGl0YWJsZURhdGFDaGFuZ2VzZXQoKTtcclxuXHJcbiAgICAgICAgaWYgKGlzU2VsZWN0aW9uQ2hhbmdlZEFmdGVyUmVmcmVzaGluZykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGl0ZW1zQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBleHBvc2VzIHRoZSBlbnVtIHR5cGUgdGhlbiBpbiB0ZW1wbGF0ZSB3ZSBjYW4gZGlyZWN0bHkgcmVmZXIgdG8gdGhlIGVudW0gdmFsdWUgbmFtZSBpbnN0ZWFkIG9mIGVudW0gdmFsdWUgbnVtYmVyLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc29ydE1vZGVFbnVtOiBhbnkgPSBEYXRhVGFibGVTb3J0TW9kZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGV4cG9zZXMgdGhlIGVudW0gdHlwZSB0aGVuIGluIHRlbXBsYXRlIHdlIGNhbiBkaXJlY3RseSByZWZlciB0byB0aGUgZW51bSB2YWx1ZSBuYW1lIGluc3RlYWQgb2YgZW51bSB2YWx1ZSBudW1iZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW5kZXJlZEl0ZW1UeXBlRW51bTogYW55ID0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgYW5kIHNldHMgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZGF0YSBzb3VyY2UuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGlvbigpOiBEYXRhVGFibGVEYXRhSXRlbSB8IERhdGFUYWJsZURhdGFJdGVtW10ge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgPyB0aGlzLmludGVybmFsU2VsZWN0aW9uLm1hcChpdGVtID0+IGl0ZW0uY29udGVudCkgOiB0aGlzLmludGVybmFsU2VsZWN0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lZGl0YWJsZSA/IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25bMF0uY29udGVudCA6IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25bMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNlbGVjdGlvbihzZWxlY3Rpb246IERhdGFUYWJsZURhdGFJdGVtIHwgRGF0YVRhYmxlRGF0YUl0ZW1bXSkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkNvbnRlbnQgPSBzZWxlY3Rpb24ubWFwKHMgPT4gcy5jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSB0aGlzLmludGVybmFsSXRlbXMuZmlsdGVyKGl0ZW0gPT4gc2VsZWN0aW9uQ29udGVudC5pbmRleE9mKGl0ZW0uY29udGVudCkgIT09IC0xKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSBzZWxlY3Rpb24gfHwgW107XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmxpbmtQYXJlbnRDaGlsZHJlblNlbGVjdGlvbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24ubWFwKHNlbGVjdGlvbkl0ZW0gPT4gc2VsZWN0aW9uSXRlbS5kYXRhKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsU2VsZWN0aW9uID0gdGhpcy5pbnRlcm5hbEl0ZW1zLmZpbHRlcihpdGVtID0+IGl0ZW0uY29udGVudCA9PT0gc2VsZWN0aW9uKVswXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24gPSBhY3R1YWxTZWxlY3Rpb24gPyBbYWN0dWFsU2VsZWN0aW9uXSA6IFtdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IHNlbGVjdGlvbiA/IFtzZWxlY3Rpb25dIDogW107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhCeVNlbGVjdGlvbigpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoc2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCBzZWxlY3Rpb25Nb2RlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25Nb2RlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBzZWxlY3Rpb25Nb2RlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uTW9kZSA9IHZhbHVlO1xyXG5cclxuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYSB0ZW1wIGNvZGUgdG8gc29sdmUgdGhlIHByb2JsZW0gdGhhdDpcclxuICAgICAgICAvLyB3aGVuIHRoZSBkYXRhIHRhYmxlIGlzIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlIGFuZCBhbiBpbml0aWFsIGFycmF5IHZhbHVlIGlzIGFzc2lnbmVkIHRvIHRoZSBzZWxlY3Rpb24gcHJvcGVydHksXHJcbiAgICAgICAgLy8gYXQgdGhhdCBtb21lbnQgdGhlIHNlbGVjdGlvbk1vZGUgcHJvcGVydHkgaXMgbm90IHNldCB0byBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZSB2YWx1ZSwgeWV0LlxyXG4gICAgICAgIC8vIFNvIHdlIHRyZWF0IHRoZSBpbml0aWFsIGFycmF5IHZhbHVlIGFzIGEgbWVtYmVyIG9mIHRoZSBzZWxlY3Rpb24gYXJyYXkgaW5zdGVhZCBvZiB0aGUgc2VsZWN0aW9uIGFycmF5LlxyXG4gICAgICAgIC8vIFNvIHdlIHVzZSB0aGUgZm9sbG93aW5nIGNvZGUgdG8gZml4IHRoaXMgcHJvYmxlbS5cclxuICAgICAgICAvLyBUT0RPOiBsb25nIHRlcm0gd2lzZSwgd2UgbmVlZCB0byB1c2Ugc2VwZXJhdGVkIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIG1haW50YWluIHRoZSBzZWxlY3Rpb25zIG9mIHNlbGVjdGlvblxyXG4gICAgICAgIC8vIHNlbGVjdGlvbiBhbmQgbXVsdGlwbGUgc2VsZWN0aW9uLlxyXG4gICAgICAgIC8vIFRoaXMgY2hhbmdlIHdpbGwgaGFwcGVuIGluIHRoZSBjb21pbmcgcmVsZWFzZS5cclxuICAgICAgICBpZiAodmFsdWUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5pbnRlcm5hbFNlbGVjdGlvbikgJiYgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5sZW5ndGggPT09IDEgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmludGVybmFsU2VsZWN0aW9uWzBdKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbiA9IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb25bMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkZWZhdWx0U29ydENvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50O1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGVmYXVsdFNvcnRNb2RlOiBEYXRhVGFibGVTb3J0TW9kZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGVtaXRzIHRoZSBldmVudCB3aGVuIGZpbHRlcmluZyBpcyBoYXBwZW5pbmcuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHRyaWdnZXJzIHdoZW4gYSB0cmVlIG5vZGUgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ2ZpbHRlcicgaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIHB1YmxpYyBnZXQgb25GaWx0ZXIoKTogRXZlbnRFbWl0dGVyPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcjtcclxuICAgIH1cclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgZG9DdXN0b21Tb3J0OiBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ3VzdG9tU29ydEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0YVRhYmxlQ3VzdG9tU29ydEV2ZW50PigpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgZW1pdHMgdGhlIGV2ZW50IHdoZW4gYSByb3cgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ3Jvd1NlbGVjdGVkJyBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIGdldCBvblJvd1NlbGVjdCgpOiBFdmVudEVtaXR0ZXI8eyBkYXRhOiBEYXRhVGFibGVEYXRhSXRlbSB9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucm93U2VsZWN0ZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIHJvd1NlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGRhdGE6IERhdGFUYWJsZURhdGFJdGVtIH0+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBlbWl0cyB0aGUgZXZlbnQgd2hlbiBhIHJvdyBpcyB1bnNlbGVjdGVkIGFuZCBubyByb3cgaXMgc2VsZWN0ZWQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSA5LzI1LzIwMTkuIFBsZWFzZSB1c2UgJ3Jvd1Vuc2VsZWN0ZWQnIGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZ2V0IG9uUm93VW5zZWxlY3QoKTogRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJvd1Vuc2VsZWN0ZWQ7XHJcbiAgICB9XHJcbiAgICBAT3V0cHV0KCkgcHVibGljIHJvd1Vuc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZGF0YTogRGF0YVRhYmxlRGF0YUl0ZW0gfT4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGdldHMgb3Igc2V0cyB0aGUgZ3JvdXAgY29sdW1uLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCBncm91cENvbHVtbigpOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsR3JvdXBDb2x1bW47XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IGdyb3VwQ29sdW1uKHZhbHVlOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5pbnRlcm5hbEdyb3VwQ29sdW1uICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmludGVybmFsR3JvdXBDb2x1bW4gPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29sdW1uc09yZGVyICYmIHRoaXMuY29sdW1uc09yZGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnNNYWluKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIG9yIHNldHMgdGhlIGdyb3VwIHNvcnQgbW9kZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgZ3JvdXBTb3J0TW9kZSgpOiBEYXRhVGFibGVTb3J0TW9kZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxHcm91cFNvcnRNb2RlO1xyXG4gICAgfVxyXG4gICAgcHVibGljIHNldCBncm91cFNvcnRNb2RlKHZhbHVlOiBEYXRhVGFibGVTb3J0TW9kZSkge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxHcm91cFNvcnRNb2RlID0gdmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wb25lbnRJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlckl0ZW1zKGZhbHNlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZ3JvdXAgdG9nZ2xlIHNob3VsZCBiZSB1c2VkIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgZ3JvdXAuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgdXNlR3JvdXBUb2dnbGU6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0byBzaG93IHRoZSBoZWFkZXIuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvd0hlYWRlciA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIFwiYXJpYS1sYWJlbGxlZGJ5XCIgdmFsdWUgZm9yIHRoZSB0YWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBnZXQgdGFibGVBcmlhTGFiZWxsZWRCeSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsVGFibGVBcmlhTGFiZWxsZWRCeTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdGFibGVBcmlhTGFiZWxsZWRCeSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbFRhYmxlQXJpYUxhYmVsbGVkQnkgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUFyaWFBdHRyaWJ1dGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgdGhlIFwiYXJpYS1sYWJlbFwiIHZhbHVlIGZvciB0aGUgdGFibGUuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZ2V0IHRhYmxlQXJpYUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxUYWJsZUFyaWFMYWJlbDtcclxuICAgIH1cclxuICAgIHB1YmxpYyBzZXQgdGFibGVBcmlhTGFiZWwodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxUYWJsZUFyaWFMYWJlbCA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQXJpYUF0dHJpYnV0ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyBzaG91bGQgdGhlIGRhdGEgdGFibGUgaGFzIHRoZSBncmlkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNob3dHcmlkID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIHNob3cgdGhlIFwiYWxsIGl0ZW1cIiBjaGVja2JveC5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzaG93QWxsSXRlbUNoZWNrYm94ID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRvIGNoZWNrIHRoZSBpdGVtIGFuZCB1bmNoZWNrIG90aGVyIGl0ZW1zIHdoZW4gdGhlIGN1cnJlbnQgaXRlbSBpcyBjaGVja2VkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlbGVjdEFuZENoZWNrID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgcm93IGhlaWdodCBmb3IgZWFjaCBpdGVtLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHJvd0hlaWdodCA9IDMwO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gbGluayB0aGUgc2VsZWN0aW9ucyBvZiBwYXJlbnQgbm9kZXMgYW5kIGNoaWxkIG5vZGVzLlxyXG4gICAgICogSXQgb25seSBhcHBseSB0byB0cmVlIHRhYmxlIHNjZW5hcmlvLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGxpbmtQYXJlbnRDaGlsZHJlblNlbGVjdGlvbnMgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc2VsZWN0IHRoZSBpdGVtIHdoZW4gbmF2aWdhdGluZyB3aXRoIHRoZSBrZXlib2FyZCAoZS5nLiBhcnJvdyBrZXlzLCBob21lLCBlbmQsIHBhZ2UgdXAsIHBhZ2UgZG93bilcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzZWxlY3RJdGVtV2hlbk5hdmlnYXRpbmdXaXRoS2V5Ym9hcmQgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc2hvdyB0aGUgbGVmdCBtYXJnaW4gaW4gZWFjaCByb3cuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2hvd0xlZnRNYXJnaW4gPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhdGEgdGFibGUgaXMgc2Nyb2xsYWJsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBzY3JvbGxhYmxlID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXRhIHRhYmxlJ3MgVUkgdmlydHVhbGl6YXRpb24gc2hvdWxkIGJlIGRpc2FibGVkLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGRpc2FibGVVSVZpcnR1YWxpemF0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZGF0YSB0YWJsZSBpdGVtcyBhcmUgc2VsZWN0YWJsZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlbGVjdGFibGUgPSB0cnVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVkaXRhYmxlIGRhdGEgdGFibGUgYWxsb3cgYXV0b21hdGljYWxseSBhZGRpbmcgbmV3IHJvd3NcclxuICAgICAqIFNldHRpbmcgdGhpcyB0byBmYWxzZSB0aGVuIGhhdmUgdG8gY3JlYXRlIG5ldyBsaW5lIG91dHNpZGUgb2YgdGhlIGRhdGF0YWJsZSBjb250cm9sXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZWRpdGFibGVBdXRvTmV3Um93ID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGluZGljYXRlcyB0aGUgZGVmYXVsdCBzdGF0dXMgb2YgdGhlIGdyb3VwIHRvZ2dsZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBkZWZhdWx0R3JvdXBUb2dnbGVFeHBhbmRlZCA9IHRydWU7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBhdXRvUm93SGVpZ2h0ID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBjb2x1bW5zT3JkZXI6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgZ3JvdXBUb2dnbGVTdGF0dXM6IHsgW2dyb3VwOiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcclxuICAgIHB1YmxpYyBub2RlTmF2aWdhdGluZ1Rhc2s6IE5vZGVOYXZpZ2F0aW5nVGFzaztcclxuICAgIHB1YmxpYyBpc0NvbHVtbldpZHRoQ2FsY3VsYXRlZCA9IGZhbHNlO1xyXG5cclxuICAgIEBTbWVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpXHJcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZjtcclxuXHJcbiAgICBAU21lSW5qZWN0KE5nWm9uZSlcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmU7XHJcblxyXG4gICAgQFNtZUluamVjdChTTUVfTEFZT1VUX1BST1ZJREVSLCB0cnVlKVxyXG4gICAgcHJpdmF0ZSBsYXlvdXQ6IExheW91dDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEVkaXRhYmxlRGF0YUNoYW5nZVNldCgpOiBFZGl0YWJsZURhdGFDaGFuZ2VTZXQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRhYmxlID8gdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZWZyZXNoRGF0YSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVySXRlbXModHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZXNldFNjcm9sbCgpOiB2b2lkIHtcclxuICAgICAgICAvLyBTZXQgdGhlIHNjcm9sbFRvcChkaXN0YW5jZSBmcm9tIHRoZSBlbGVtZW50J3MgdG9wIHRvIGl0cyB0b3Btb3N0IHZpc2libGUgY29udGVudClcclxuICAgICAgICAvLyBvZiBTY3JvbGwgY29udGFpbmVyIHRvIDAuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuXHJcbiAgICAgICAgLy8gTm8gbmVlZCB0byByZXNldCAndGhpcy5jdXJyZW50U3RhcnRJbmRleE9mSXRlbUluVmlld1BvcnQnIHRvIDAsIGFzIGl0IHdpbGwgYXV0b21hdGljYWxseSBnZXRcclxuICAgICAgICAvLyBhZGp1c3RlZCB0byAwIGluICdjYWxjdWxhdGVJdGVtSW5WaWV3UG9ydCgpJy5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlVUlWaXJ0dWFsaXphdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24gPSBkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmlkO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3RyZWVncmlkJyk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdncmlkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICd0YWJsZScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuRGF0YVRhYmxlUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIgPSBuZXcgRGF0YVRhYmxlUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXIodGhpcy5sYXlvdXQpO1xyXG4gICAgICAgICAgICAvLyBvbiBwYXJlbnQgbGF5b3V0IGNoYW5nZXMsIHJlLWVtaXQgdGhlIGxheW91dCBjaGFuZ2UgdG8gb3VyIGV2ZW50XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0LmxheW91dENoYW5nZWQuc3Vic2NyaWJlKCgoKSA9PiB0aGlzLm9uTGF5b3V0Q2hhbmdlZCgpKSkpO1xyXG4gICAgICAgICAgICAvLyBvbiB3aW5kb3cgYnJlYWsgcG9pbnQgY2hhbmdlcywgZW1pdCB0aGUgZXZlbnQgYWJvdXQgY3JpdGljYWwgY2xhc3NlcyBhbmQgc3R5bGluZyB1cGRhdGVzIHNpZ25hbC5cclxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXQud2luZG93QnJlYWtwb2ludENoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHRoaXMub25XaW5kb3dCcmVha3BvaW50Q2hhbmdlZCgpKSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRlZmVycmVkT25MYXlvdXRDaGFuZ2VkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICogQXMgdGhlIHVzZXIgc2Nyb2xscyBvbiB0aGUgeCBheGlzIG9mIHRoZSBib2R5IG9mIHRoZSB0YWJsZSwgd2VcclxuICAgICAgICAgICAgICogbmVlZCB0byBtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIGNvbHVtbiBoZWFkZXJzIG9mIHRoZSB0YWJsZSBpbnRvXHJcbiAgICAgICAgICAgICAqIHZpZXcuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBmcm9tRXZlbnQodGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdzY3JvbGwnKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckVsZW1lbnQubmF0aXZlRWxlbWVudCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ21hcmdpbi1sZWZ0JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7LXRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnR9cHhgKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFNvcnRDb2x1bW4gJiYgdGhpcy5kZWZhdWx0U29ydE1vZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5zb3J0Q29sdW1uID0gdGhpcy5kZWZhdWx0U29ydENvbHVtbjtcclxuICAgICAgICAgICAgdGhpcy5zb3J0Q29sdW1uLnNvcnRNb2RlID0gdGhpcy5kZWZhdWx0U29ydE1vZGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4QnlTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYWNjZXNpYmlsaXR5TWFuYWdlcikge1xyXG4gICAgICAgICAgICB0aGlzLnVucmVnaXN0ZXJPbkVsZW1lbnRGb2N1c2luZ0V2ZW50SGFuZGxlciA9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjY2VzaWJpbGl0eU1hbmFnZXIucmVnaXN0ZXJFbGVtZW50Rm9jdXNpbmdFdmVudCh0aGlzLm9uRWxlbWVudEZvY3VzaW5nLmJpbmQodGhpcykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVBcmlhQXR0cmlidXRlcygpO1xyXG5cclxuICAgICAgICAvLyBUT0RPOiBsb29rIGludG8gaW1wcm92ZW1lbnRzLCBhZGRpbmcgc2V0VGltZW91dCBoZXJlIG1ha2VzIHRoZSBjb21wb25lbnQgbGlmZSBjeWNsZSBoYXJkIHRvIG1hbmFnZVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXh0RWxlbWVudCA9IERvbS5nZXROZXh0Rm9jdXNhYmxlRWxlbWVudEluVHJhcCh0aGlzLnNjcm9sbERhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB0aGlzLnNob3VsZFVzZUxhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50ID0gIW5leHRFbGVtZW50O1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ29sdW1uRG9tV2lkdGhzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uSGVhZGVyVGFibGVQcmVzc2VkKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgS2V5Q29kZS5VcEFycm93OlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkRvd25BcnJvdzpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9IZWFkT2ZSZW5kZXJlZEl0ZW1zKCk7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudCA9IDxIVE1MRWxlbWVudD5ldmVudC50YXJnZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV4dEVsZW1lbnQgPSBEb20uZ2V0TmV4dFpvbmVFbGVtZW50KGN1cnJlbnRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Db250ZW50VGFibGVLZXlVcChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIub25Db250ZW50VGFibGVLZXlVcChldmVudCwgdGhpcy5jb250ZW50RWxlbWVudCwgdGhpcy5lZGl0YWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhcmJpdHJhcnlTY3JvbGwoc2Nyb2xsVG9wOiBudW1iZXIsIGlzSW5jcmVtZW50PzogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChpc0luY3JlbWVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcclxuICAgICAgICB9IGVsc2UgaWYgKCFpc0luY3JlbWVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBkaWZmID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICBpZiAoZGlmZiA+IHNjcm9sbFRvcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wICs9IHNjcm9sbFRvcDtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkaWZmIDw9IHNjcm9sbFRvcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZGlmZiA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCAtIHNjcm9sbFRvcDtcclxuICAgICAgICAgICAgaWYgKGRpZmYgPiBzY3JvbGxUb3ApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCAtPSBzY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlmZiA8PSBzY3JvbGxUb3ApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVJdGVtSW5WaWV3UG9ydCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbnRlbnRUYWJsZVByZXNzZWQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSAhPT0gS2V5Q29kZS5DdHJsICYmIGV2ZW50LmtleUNvZGUgIT09IEtleUNvZGUuU2hpZnQpIHtcclxuICAgICAgICAgICAgQ29yZUVudmlyb25tZW50LmFjY2Vzc2liaWxpdHlNYW5hZ2VyLmNoYW5nZUFjY2Vzc2liaWxpdHlNb2RlKHRydWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IDxIVE1MRWxlbWVudD5ldmVudC50YXJnZXQ7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFJvdyA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKHRhcmdldEVsZW1lbnQsIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1yb3cnKSk7XHJcbiAgICAgICAgLy8gY3RybEtleSBmb3Igc2luZ2xlIHNlbGVjdGlvbiBtb2RlIHdvcmtzIGZpbmVcclxuICAgICAgICAvLyBjdHJsS2V5IGZvciBtdWx0aXBsZSBzZWxlY3Rpb24gd2lsbCBiZSByZWdhcmRlZCBhcyBzZWxlY3QgYWxsIHJvd3MgdGhhdFxyXG4gICAgICAgIC8vIHdpbGwgYmUgaGFuZGxlZCBub3QgaGVyZS5cclxuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSAmJiAhZXZlbnQuY3RybEtleSkge1xyXG4gICAgICAgICAgICBjb25zdCBzaG91bGRSZXR1cm4gPSB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyXHJcbiAgICAgICAgICAgICAgICAuZWRpdGFibGVEYXRhVGFibGVPbkNvbnRlbnRUYWJsZVByZXNzZWRIYW5kbGVyKGV2ZW50LCB0YXJnZXRFbGVtZW50LCBjdXJyZW50Um93LCB0aGlzLmxhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50KTtcclxuICAgICAgICAgICAgaWYgKHNob3VsZFJldHVybikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZS5DdHJsIHx8IGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuU2hpZnQpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSBmYWxzZTtcclxuICAgICAgICBsZXQgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudFJlbmRlcmVkSXRlbSA9IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCldO1xyXG5cclxuICAgICAgICB0aGlzLnByZXZpb3VzQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgIC8vIEZvciBub3cgYXNzdW1pbmcgdHJlZSB0YWJsZSBmaXJzdCBmb2N1cyBvbiByb3cgYW5kIHRoZW5cclxuICAgICAgICAvLyB0aGUgdXNlciBoYXMgdG8gaGl0IGVudGVyL3NwYWNlIHRvIHNlbGVjdCB0aGlzIGZvY3VzZWQgaXRlbVxyXG4gICAgICAgIC8vIEZvciBvdGhlciB0eXBlIG9mIHRhYmxlIHdpbGwgZmlyc3Qgc2VsZWN0IGFuZCB0aGVuIGF1dG9tYXRpY2FsbHkgZm9jdXMgYnkgZGVmYXVsdFxyXG4gICAgICAgIGNvbnN0IHNlbGVjdEFuZEZvY3VzID0gIXRoaXMuc2hvd0FzVHJlZTtcclxuXHJcbiAgICAgICAgLy8gT25seSB0aGUgc2Nyb2xsaW5nIHJlbGF0ZWQgbmF2aWdhdGlvbiBrZXlib2FyZCBvcGVyYXRpb25zIG5lZWQgZGVib3VuY2luZy5cclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkE6XHJcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzZWxlY3QgYWxsIGhhbmRsZXJcclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGFsc28gaGFuZGxlIHdoZW4gZWRpdGFibGUgZGF0YXRhYmxlIGFuZCB0aGUgZm9jdXMgaXMgaW4gc21lLWZvcm0tZmllbGRcclxuICAgICAgICAgICAgICAgIGlmIChldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUgJiYgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5pc1NtZUZvcm1GaWVsZCh0YXJnZXRFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFldmVudC5hbHRLZXkgJiYgIWV2ZW50LnNoaWZ0S2V5XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkhvbWU6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9IZWFkT2ZSZW5kZXJlZEl0ZW1zKHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlVwQXJyb3c6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uS2V5Ym9hcmREZWJvdW5jaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSAmJiBldmVudC5jdHJsS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjcm9sbCB1cFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFyYml0cmFyeVNjcm9sbCh0aGlzLmRlZmF1bHRTY3JvbGxQaXhlbHMsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpID4gMCB8fCB0aGlzLmdldEFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgoKSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9QcmV2aW91c1JlbmRlcmVkSXRlbShzZWxlY3RBbmRGb2N1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEhhbmRsZU11bHRpcGxlU2VsZWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50ID0gPEhUTUxFbGVtZW50PmV2ZW50LnRhcmdldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzRWxlbWVudCA9IERvbS5nZXRQcmV2aW91c1pvbmVFbGVtZW50KGN1cnJlbnRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLkRvd25BcnJvdzpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5ICYmIGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2Nyb2xsIGRvd25cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcmJpdHJhcnlTY3JvbGwodGhpcy5kZWZhdWx0U2Nyb2xsUGl4ZWxzLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2l0aCBzaGlmdEtleSBtZWFucyBuZWVkcyBzZWxlY3Rpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlVG9OZXh0UmVuZGVyZWRJdGVtKGV2ZW50LnNoaWZ0S2V5ID8gdHJ1ZSA6IHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuUGFnZVVwOlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvUHJldmlvdXNQYWdlT2ZSZW5kZXJlZEl0ZW1zKHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlBhZ2VEb3duOlxyXG4gICAgICAgICAgICAgICAgaWYgKCg8SFRNTEVsZW1lbnQ+ZXZlbnQuc3JjRWxlbWVudCkuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtcm93JykpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb05leHRQYWdlT2ZSZW5kZXJlZEl0ZW1zKHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRW5kOlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvRW5kT2ZSZW5kZXJlZEl0ZW1zKHNlbGVjdEFuZEZvY3VzKTtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRIYW5kbGVNdWx0aXBsZVNlbGVjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBLZXlDb2RlLlNwYWNlOlxyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuRW50ZXI6XHJcbiAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRFbnRlclNwYWNlKGN1cnJlbnRSZW5kZXJlZEl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0QW5kRm9jdXMsIGV2ZW50LCB0YXJnZXRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuTGVmdEFycm93OlxyXG4gICAgICAgICAgICAgICAgc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ29udGVudFRhYmxlUHJlc3NlZExlZnRBcnJvdyhjdXJyZW50UmVuZGVyZWRJdGVtLCB0YXJnZXRFbGVtZW50LCBjdXJyZW50Um93KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIEtleUNvZGUuUmlnaHRBcnJvdzpcclxuICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRSaWdodEFycm93KGN1cnJlbnRSZW5kZXJlZEl0ZW0sIHRhcmdldEVsZW1lbnQsIGN1cnJlbnRSb3cpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvdWxkSGFuZGxlTXVsdGlwbGVTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBGb3IgdGhlIHRyZWUgdGFibGUgbm93IHdlIGZpcnN0IGZvY3VzIGFuZCB0aGVuIHVzZSB0aGUgcmlnaHQgYXJyb3cga2V5IG9yIGVudGVyIG9yIHNwYWNlIHRvIHNlbGVjdFxyXG4gICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB0aGUgbG9naWMgYmVmb3JlIGhlcmUgb25seSBkaWQgYW4gYXJyb3cgdXAvZG93biBrZXksIHdlIG5lZWQgdGhlIHNlbGVjdGlvbiBoYXBwZW5pbmcgYXMgd2VsbFxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25Db250ZW50VGFibGVQcmVzc2VkU2hvd0FzVHJlZUhlbHBlcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGV2ZW50LCB0aGlzLnJlbmRlcmVkSXRlbXNbdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleF0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuVXBBcnJvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleC0tO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXlDb2RlID09PSBLZXlDb2RlLkRvd25BcnJvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleCA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dChcclxuICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25LZXlib2FyZERlYm91bmNpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkRlYm91bmNlVGltZW91dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Db250ZW50VGFibGVQcmVzc2VkU2hvd0FzVHJlZUhlbHBlcigpIHtcclxuICAgICAgICAvLyBJZiB0cmVlIHRhYmxlIGFuZCB0aGUgY3VycmVudCBmb2N1c2VkIGVsZW1lbnQgaW5kZXggaXMgZGlmZmVyZW50IGZyb20gdGhlIHNlbGVjdGVkIG9uZVxyXG4gICAgICAgIC8vIFdpbGwgc2VsZWN0IHRoZSByb3cgYmFzZWQgb24gZm9jdXNlZCBlbGVtZW50XHJcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCAhPT0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KHRoaXMuYWN0aXZlRm9jdXNlZEl0ZW1JbmRleCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIGtleWJvYXJkIHByZXNzIGV2ZW50IGZvciBlbnRlciBhbmQgc3BhY2VcclxuICAgICAqIFRvIHRyaWdnZXIgdGhpcyBmdW5jdGlvbiwgZWl0aGVyIGZvY3VzIG9uIHRhYmxlIHJvdyBvciB0YWJsZSByb3cgY2VsbCB0ZW1wbGF0ZSBhbmRcclxuICAgICAqIGNsaWNrIHRoZSAnZW50ZXInIG9yICdzcGFjZScgYnV0dG9uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uQ29udGVudFRhYmxlUHJlc3NlZEVudGVyU3BhY2UoY3VycmVudFJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCBzZWxlY3RBbmRGb2N1czogYm9vbGVhbixcclxuICAgICAgICBldmVudDogS2V5Ym9hcmRFdmVudCwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgICAgICAvLyBpZiBmYWxzZSwgZm9jdXNlZCBvbiB0YWJsZSByb3cgY2VsbCB0ZW1wbGF0ZVxyXG4gICAgICAgIC8vIGlmIHRydWUsIGZvY3VzZWQgb24gdGFibGUgcm93IGl0ZW0gY29tcG9uZW50XHJcbiAgICAgICAgbGV0IGZvY3VzZWRPblJvd0NvbXBvbmVudCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0YXJnZXRFbGVtZW50ICYmIHRhcmdldEVsZW1lbnQuY2xhc3NMaXN0ICYmIHRhcmdldEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtcm93JykpIHtcclxuICAgICAgICAgICAgZm9jdXNlZE9uUm93Q29tcG9uZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmtleUNvZGUpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgPT09IEtleUNvZGUuU3BhY2UpIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHNwYWNlIG9uIGEgZGF0YSB0YWJsZSBpcyB0byBtb3ZlIHRvIHRoZSBuZXh0IHBhZ2VcclxuICAgICAgICAgICAgICAgIC8vIE91ciBkYXRhIHRhYmxlIGJlaGF2ZXMgZXhhY3RseSB0aGUgc2FtZSBhcyB3aW5kb3dzIDEwIGZpbGUgZXhwbG9yZXJcclxuICAgICAgICAgICAgICAgIC8vIE9uIHNwYWNlL2VudGVyIHdpbGwgYm90aCBzZWxlY3QgdGhlIGN1cnJlbnQgcm93LlxyXG4gICAgICAgICAgICAgICAgLy8gU28gYWx3YXlzIGRlY2xpbmUgZGVmYXVsdCBmdW5jdGlvbiBmb3Igc3BhY2Uga2V5Ym9hcmQgZXZlbnQgYXMgbG9uZyBhcyBmb2N1cyBpcyBvbiB0aGUgcm93IGJlY2F1c2VcclxuICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBuZWVkIHRoZSBtb3ZlIHRvIHRoZSBuZXh0IHBhZ2UgYmVoYXZpb3JcclxuICAgICAgICAgICAgICAgIGlmIChmb2N1c2VkT25Sb3dDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBJZiBLZXlDb2RlIGlzIEVudGVyLCBqdXN0IHJlbWFpbiB0aGUgY3VycmVudCB2YWx1ZSBvZiBzaG91bGRQcmV2ZW50RGVmYXVsdEtleWJvYXJkQWN0aW9uXHJcbiAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZGlzYWJsZSB0aGUgZW50ZXIga2V5IGRlZmF1bHQgZnVuY3Rpb25cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRTaG93QXNUcmVlSGVscGVyKCk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5vbkl0ZW1DaGVja0JveENsaWNrZWQoY3VycmVudFJlbmRlcmVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBzZWxlY3QgYSByb3cuIG5vdCBleHBhbmQvY29sbGFwc2UgaXRcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZXZlbnRFbnRlcktleUZvckRlZmF1bHRBY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5kb3VibGVDbGlja1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIExvZ2dpbmcubG9nKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IExvZ0xldmVsLkRlYnVnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTm8gZXZlbnQgaGFuZGxlciBiaW5kIHRvIFwiZG91YmxlQ2xpY2tSb3dcIiBldmVudC4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdEYXRhVGFibGVDb21wb25lbnQub25Db250ZW50VGFibGVQcmVzc2VkJ1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubmF2aWdhdGlvbktleWJvYXJkRGVib3VuY2luZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0QW5kRm9jdXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG91YmxlQ2xpY2tSb3cobnVsbCwgY3VycmVudFJlbmRlcmVkSXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdyh0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmtleUNvZGUgJiYgZXZlbnQua2V5Q29kZSA9PT0gS2V5Q29kZS5FbnRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZFByZXZlbnREZWZhdWx0S2V5Ym9hcmRBY3Rpb24gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc2hvdWxkUHJldmVudERlZmF1bHRLZXlib2FyZEFjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQ29udGVudFRhYmxlUHJlc3NlZFJpZ2h0QXJyb3coY3VycmVudFJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0YXJnZXRFbGVtZW50OiBIVE1MRWxlbWVudCwgY3VycmVudFJvdzogYW55KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLm9uQ29udGVudFRhYmxlUHJlc3NlZFNob3dBc1RyZWVIZWxwZXIoKTtcclxuICAgICAgICAgICAgY3VycmVudFJlbmRlcmVkSXRlbSA9IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VycmVudFJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tjdXJyZW50UmVuZGVyZWRJdGVtLmRhdGFdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrR3JvdXBUb2dnbGUoY3VycmVudFJlbmRlcmVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCArIDE7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSXRlbSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCArIDE7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVHJlZVRhYmxlUGFyZW50Tm9kZShjdXJyZW50UmVuZGVyZWRJdGVtKSkge1xyXG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRSZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGlja1RyZWVUb2dnbGUobnVsbCwgY3VycmVudFJlbmRlcmVkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmVUb05leHRSZW5kZXJlZEl0ZW0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBuZXh0RWxlbWVudCA9IERvbS5nZXROZXh0Rm9jdXNhYmxlRWxlbWVudCh0YXJnZXRFbGVtZW50KTtcclxuICAgICAgICAgICAgbGV0IHJvd0Zvck5leHRFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IobmV4dEVsZW1lbnQsIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1yb3cnKSk7XHJcbiAgICAgICAgICAgIGxldCBjZWxsRm9yTmV4dEVsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihuZXh0RWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXRkJykpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNlbGxGb3JOZXh0RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1uSW5kZXhXaXRoRm9jdXNlZEVsZW1lbnQgPSAtMTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBjZWxsRm9yTmV4dEVsZW1lbnQgJiYgaSA8IGNlbGxGb3JOZXh0RWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGxGb3JOZXh0RWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuW2ldID09PSBjZWxsRm9yTmV4dEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgcmVtYWluIGZvY3VzIG9uIHRoZSBmaXJzdCBjaGVja2JveCB3aGVuIGl0IGlzIGVkaXRhYmxlIG1vZGUuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwICYmICF0aGlzLmVkaXRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzRGF0YVRhYmxlQ2hlY2tCb3hIVE1MRWxlbWVudChuZXh0RWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuZXh0RWxlbWVudCBpcyB0aGUgY2hlY2tib3ggaW4gZmlyc3QgY29sdW1uLCBtb3ZlIG9uIHRoZSBuZXh0IGNhbmRpZGF0ZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbGVtZW50ID0gRG9tLmdldE5leHRGb2N1c2FibGVFbGVtZW50KG5leHRFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0Zvck5leHRFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxGb3JOZXh0RWxlbWVudCA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS10ZCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCAhPT0gLTFcclxuICAgICAgICAgICAgICAgICYmIGN1cnJlbnRSb3cgPT09IHJvd0Zvck5leHRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBuZXh0RWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Db250ZW50VGFibGVQcmVzc2VkTGVmdEFycm93KGN1cnJlbnRSZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgdGFyZ2V0RWxlbWVudDogSFRNTEVsZW1lbnQsIGN1cnJlbnRSb3c6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkNvbnRlbnRUYWJsZVByZXNzZWRTaG93QXNUcmVlSGVscGVyKCk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRSZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXNbdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1cnJlbnRSZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tjdXJyZW50UmVuZGVyZWRJdGVtLmRhdGFdKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrR3JvdXBUb2dnbGUoY3VycmVudFJlbmRlcmVkSXRlbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlUmVuZGVyZWRJdGVtQnlJbmRleChpLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBJdGVtKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzVHJlZVRhYmxlUGFyZW50Tm9kZShjdXJyZW50UmVuZGVyZWRJdGVtKSkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsaWNrVHJlZVRvZ2dsZShldmVudCwgY3VycmVudFJlbmRlcmVkSXRlbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4XS5ub2RlLnBhcmVudDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUgPT09IHBhcmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcHJldmlvdXNFbGVtZW50ID0gRG9tLmdldFByZXZpb3VzRm9jdXNhYmxlRWxlbWVudCh0YXJnZXRFbGVtZW50KTtcclxuICAgICAgICAgICAgY29uc3Qgcm93Rm9yUHJldmlvdXNFbGVtZW50ID0gRG9tLmdldFNwZWNpZmljQW5jZXN0b3IoXHJcbiAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQsIGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1yb3cnKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNlbGxGb3JQcmV2aW91c0VsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihcclxuICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXRkJykpO1xyXG4gICAgICAgICAgICBpZiAoY2VsbEZvclByZXZpb3VzRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29sdW1uSW5kZXhXaXRoRm9jdXNlZEVsZW1lbnQgPSAtMTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBjZWxsRm9yUHJldmlvdXNFbGVtZW50ICYmIGkgPCBjZWxsRm9yUHJldmlvdXNFbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbEZvclByZXZpb3VzRWxlbWVudC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuW2ldID09PSBjZWxsRm9yUHJldmlvdXNFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwICYmIHByZXZpb3VzRWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwcmV2aW91c0VsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ3NtZS10YWJsZS1jaGVja2JveCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXNFbGVtZW50IGlzIHRoZSBjaGVja2JveCBpcyBpbiB0aGUgZmlyc3QgY29sdW1uLCB0aGVuIHNraXAgaXQsIGRpcmVjdGx5IGdvIHRvIHRoZSByb3cuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0VsZW1lbnQgPSByb3dGb3JQcmV2aW91c0VsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0VsZW1lbnQgPT09IGN1cnJlbnRSb3cgfHwgcm93Rm9yUHJldmlvdXNFbGVtZW50ICE9PSBjdXJyZW50Um93KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyb3dGb3JQcmV2aW91c0VsZW1lbnQgPT09IGN1cnJlbnRSb3cpIHtcclxuICAgICAgICAgICAgICAgIHByZXZpb3VzRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBpc1RyZWVUYWJsZVBhcmVudE5vZGUodHJlZU5vZGVJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHJlZU5vZGVJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuVHJlZU5vZGUgJiYgIXRyZWVOb2RlSXRlbS5ub2RlLmlzTGVhZjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25Db250ZW50SXRlbUZvY3VzZWQoZXZlbnQ6IEZvY3VzRXZlbnQsIHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250ZW50QXJlYUhhc0ZvY3VzID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0YWJsZURhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+cmVuZGVyZWRJdGVtLmRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuZWRpdGFibGVOZXdSb3dIYXNGb2N1cyA9IGVkaXRhYmxlRGF0YUl0ZW0uaXNOZXdSb3c7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZEVsZW1lbnQgPSBEb20uZ2V0U3BlY2lmaWNBbmNlc3RvcihcclxuICAgICAgICAgICAgICAgIDxIVE1MRWxlbWVudD5kb2N1bWVudC5hY3RpdmVFbGVtZW50LCBlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbWUtdGFibGUtdGQnKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRyRWxlbWVudCA9IERvbS5nZXRTcGVjaWZpY0FuY2VzdG9yKHRkRWxlbWVudCwgZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnc21lLXRhYmxlLXJvdycpKTtcclxuICAgICAgICAgICAgaWYgKHRyRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGRFbGVtZW50cyA9IHRyRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLXRkJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRkRWxlbWVudHNbaV0gPT09IHRkRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmZvY3VzSW5UYWJsZUNlbGwoZXZlbnQpO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29udGVudEl0ZW1CbHVycmVkKGV2ZW50LCByZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGVudEFyZWFIYXNGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZWRpdGFibGVOZXdSb3dIYXNGb2N1cyA9IGZhbHNlO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5mb2N1c091dFRhYmxlQ2VsbChldmVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZWRpdGFibGVOZXdSb3dIYXNGb2N1cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSZW5kZXJlZEl0ZW1Sb3dGb2N1c091dChyZW5kZXJlZEl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRlbGV0ZUVkaXRhYmxlRGF0YVJvdyhkYXRhOiBhbnkpIHtcclxuICAgICAgICBsZXQgZGF0YUV4aXN0c0luSW50ZXJuYWxJdGVtcyA9IGZhbHNlO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnRlcm5hbEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT50aGlzLmludGVybmFsSXRlbXNbaV07XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmNvbnRlbnQgPT09IGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGRhdGFFeGlzdHNJbkludGVybmFsSXRlbXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kSW5BZGRlZEl0ZW1zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LmFkZGVkSXRlbXMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuYWRkZWRJdGVtc1tqXSA9PT0gaXRlbS5jb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LmFkZGVkSXRlbXMuc3BsaWNlKGosIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluQWRkZWRJdGVtcyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQudXBkYXRlZEl0ZW1zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LnVwZGF0ZWRJdGVtc1tqXSA9PT0gaXRlbS5jb250ZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LnVwZGF0ZWRJdGVtcy5zcGxpY2UoaiwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kSW5BZGRlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuZGVsZXRlZEl0ZW1zLnB1c2goaXRlbS5jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxJdGVtcy5zcGxpY2UoaSwgMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyh0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSb3cgbm90IHlldCBhZGRlZCB0byBpbnRlcm5hbEl0ZW1zLCBqdXN0IHJlZnJlc2hcclxuICAgICAgICBpZiAoIWRhdGFFeGlzdHNJbkludGVybmFsSXRlbXMpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyh0cnVlLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRGb2N1c2VkKGV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jYW5jZWxMYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudEZvY3VzT25jZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmNhbmNlbExhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Rm9jdXNPbmNlID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdlbmVyYXRlTkdDbGFzc0ZvclJlbmRlcmVkSXRlbShyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHJlbmRlcmVkSXRlbS5pbmRleCA9PT0gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpLFxyXG4gICAgICAgICAgICAnc21lLXRhYmxlLWdyb3VwLWl0ZW0nOiByZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEl0ZW0sXHJcbiAgICAgICAgICAgICdzbWUtdGFibGUtZ3JvdXAtaGVhZGVyJzogcmVuZGVyZWRJdGVtLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIsXHJcbiAgICAgICAgICAgICdzbWUtY2hlY2tlZCc6IHRoaXMuaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNob3VsZEFsbEl0ZW1DaGVja0JveENoZWNrZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuc2VsZWN0aW9uICYmIHRoaXMuc2VsZWN0aW9uLmxlbmd0aCA+IDAgJiYgdGhpcy5zZWxlY3Rpb24ubGVuZ3RoID09PSB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJlZU5vZGVEYXRhSXRlbSA9IDxUcmVlTm9kZURhdGFJdGVtPnRoaXMuZmlsdGVyZWRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRyZWVOb2RlRGF0YUl0ZW0gfHwgIXRyZWVOb2RlRGF0YUl0ZW0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0SG92ZXJlZFJlbmRlcmVkSXRlbShyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaG92ZXJlZFJlbmRlcmVkSXRlbUluZGV4ID0gcmVuZGVyZWRJdGVtLmluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1bnNldEhvdmVyZWRSZW5kZXJlZEl0ZW0ocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5ob3ZlcmVkUmVuZGVyZWRJdGVtSW5kZXggPT09IHJlbmRlcmVkSXRlbS5pbmRleCkge1xyXG4gICAgICAgICAgICB0aGlzLmhvdmVyZWRSZW5kZXJlZEl0ZW1JbmRleCA9IC0xO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldElzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCgpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgaXNGb2N1c2luZ091dEZyb21MYXN0Rm9ybUZpZWxkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdkYXRhLXNtZS1sYXN0LWZvY3VzYWJsZS1zaGFkb3ctZWxlbWVudCcpKSB7XHJcbiAgICAgICAgICAgIGlzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpc0ZvY3VzaW5nT3V0RnJvbUxhc3RGb3JtRmllbGQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVSZW5kZXJlZEl0ZW1Sb3dGb2N1c091dChyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVkaXRhYmxlRGF0YUl0ZW0gPSA8RWRpdGFibGVEYXRhSXRlbT5yZW5kZXJlZEl0ZW0uZGF0YTtcclxuICAgICAgICAgICAgaWYgKGVkaXRhYmxlRGF0YUl0ZW0uaXNOZXdSb3cpIHtcclxuICAgICAgICAgICAgICAgIGxldCBzaG91bGRBZGROZXdSb3cgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBzaG91bGQgaGFuZGxlIGlmIGFueSBmb3JtIGZpZWxkIGlzIGRpcnR5IHRoZW4gdmFsaWRhdGVcclxuICAgICAgICAgICAgICAgIGxldCBhdExlYXN0T25lRmllbGREaXJ0eSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudHMuZm9yRWFjaChsb2FkZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1GaWVsZENvbnRhaW5lciA9IDxGb3JtRmllbGRDb250YWluZXI+bG9hZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZXIucmVuZGVyZWRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRlckRhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+bG9hZGVyLnJlbmRlcmVkSXRlbS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVyRGF0YUl0ZW0uaXNOZXdSb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtRmllbGRDb250YWluZXIuaXNEaXJ0eSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRMZWFzdE9uZUZpZWxkRGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gc2hvdWxkIGFsc28gaGFuZGxlIHdoZW4gZm9jdXNpbmcgb3V0IGZyb20gdGhlIGxhc3QgZm9ybSBmaWVsZCBpbiB0aGUgcm93XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc0ZvY3VzaW5nT3V0RnJvbUxhc3RGb3JtRmllbGQgPSB0aGlzLmdldElzRm9jdXNpbmdPdXRGcm9tTGFzdEZvcm1GaWVsZCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhdExlYXN0T25lRmllbGREaXJ0eSB8fCBpc0ZvY3VzaW5nT3V0RnJvbUxhc3RGb3JtRmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG91bGRBZGROZXdSb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVRhYmxlVGVtcGxhdGVMb2FkZXJDb21wb25lbnRzLmZvckVhY2gobG9hZGVyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybUZpZWxkQ29udGFpbmVyID0gPEZvcm1GaWVsZENvbnRhaW5lcj5sb2FkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZXIucmVuZGVyZWRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkZXJEYXRhSXRlbSA9IDxFZGl0YWJsZURhdGFJdGVtPmxvYWRlci5yZW5kZXJlZEl0ZW0uZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZXJEYXRhSXRlbS5pc05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm9ybUZpZWxkQ29udGFpbmVyLmNoZWNrVmFsaWRhdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFkZE5ld1JvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRBZGROZXdSb3cgJiYgdGhpcy5lZGl0YWJsZUF1dG9OZXdSb3cpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RGF0YUl0ZW0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnQpKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdmVycmlkZU5ld0RhdGFIYW5kbGVyID0gZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFJdGVtID0gZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVSb3dBZGRlZC5lbWl0KHsgZGF0YTogbmV3RGF0YUl0ZW0sIG92ZXJyaWRlTmV3RGF0YUhhbmRsZXI6IG92ZXJyaWRlTmV3RGF0YUhhbmRsZXIgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRJdGVtLmRhdGEuY29udGVudCA9IG5ld0RhdGFJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkSXRlbS5kYXRhLmlzTmV3Um93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbEl0ZW1zLnB1c2gocmVuZGVyZWRJdGVtLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LmFkZGVkSXRlbXMucHVzaChuZXdEYXRhSXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VzZXRVcGRhdGVkLmVtaXQodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsSXRlbXMucHVzaChuZXdEYXRhSXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoRGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG91bGRTaG93RWRpdFJvdyhyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQWxsRWRpdGFibGVSb3dzVmlzaWJsZSkgeyByZXR1cm4gdHJ1ZTsgfVxyXG5cclxuICAgICAgICBjb25zdCBlZGl0YWJsZURhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+cmVuZGVyZWRJdGVtLmRhdGE7XHJcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkSXRlbS5pbmRleCA9PT0gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXHJcbiAgICAgICAgICAgIHx8IHRoaXMuaGFzVmFsaWRhdGlvbkVycm9yKHJlbmRlcmVkSXRlbSlcclxuICAgICAgICAgICAgfHwgcmVuZGVyZWRJdGVtLmluZGV4ID09PSB0aGlzLmhvdmVyZWRSZW5kZXJlZEl0ZW1JbmRleFxyXG4gICAgICAgICAgICB8fCBlZGl0YWJsZURhdGFJdGVtLmlzTmV3Um93O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSB0ZXh0IHRoYXQgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXJpYS1sYWJlbCBmb3IgY29sdW1uIHNvcnQgb3JkZXIgKGlmIHNvcnRhYmxlKS5cclxuICAgICAqIFRoaXMgbGFiZWwgaXMgdXRpbGl6ZWQgYnkgc2NyZWVuIHJlYWRlcnMgZm9yIGFjY2Vzc2liaWxpdHkuXHJcbiAgICAgKiBJZiB0aGUgY3VycmVudCBzb3J0IG9yZGVyIGlzIEFzY2VuZGluZywgdGhlIGxhYmVsIHdpbGwgaW5kaWNhdGUgYSBidXR0b24gaWNvbiBpcyBwcmVzZW50IHRvIERlc2NlbmQgb3JkZXIuXHJcbiAgICAgKiBJZiB0aGUgY3VycmVudCBzb3J0IG9yZGVyIGlzIERlc2NlbmRpbmcsIHRoZSBsYWJlbCB3aWxsIGluZGljYXRlIGEgYnV0dG9uIGljb24gaXMgcHJlc2VudCB0byBBc2NlbmQgb3JkZXIuXHJcbiAgICAgKiBJZiB0aGUgY3VycmVudCBzb3J0IG9yZGVyIGlzIE5vbmUsIHRoZSBsYWJlbCBpcyBudWxsLCBhbmQgdGhlIHNjcmVlbiByZWFkZXIgd2lsbCBub3QgcmVhZCBhbnl0aGluZy5cclxuICAgICAqIEBwYXJhbSBjb2x1bW4gdGhlIHRhYmxlIGNvbHVtblxyXG4gICAgICogQHJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBhcmlhLWxhYmVsIG9uIHRoZSBzb3J0IGljb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNvcnRMYWJlbChjb2x1bW46IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCk6IHN0cmluZyB7XHJcbiAgICAgICAgc3dpdGNoIChjb2x1bW4uc29ydE1vZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5BcmlhLkxhYmVsLmRlc2NlbmRTb3J0T3JkZXJCdXR0b247XHJcbiAgICAgICAgICAgIGNhc2UgRGF0YVRhYmxlU29ydE1vZGUuRGVzY2VuZDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLkFyaWEuTGFiZWwuYXNjZW5kU29ydE9yZGVyQnV0dG9uO1xyXG4gICAgICAgICAgICBjYXNlIERhdGFUYWJsZVNvcnRNb2RlLk5vbmU6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbXBsZW1lbnRzIHRoZSBBZnRlclZpZXdJbml0IGludGVyZmFjZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZVNjcm9sbGJhcldpZHRoKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNjcm9sbEhhbmRsZXIgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzU2Nyb2xsZWREb3duID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID4gMDtcclxuICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTY3JvbGxlZERvd24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxhenlMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGF6eSBsb2FkaW5nIGlzIGVuYWJsZWQsIHJlZHVjZSB0aGUgZnJlcWVuY3kgb2YgaGFuZGxpbmcgc2Nyb2xsaW5nXHJcbiAgICAgICAgICAgICAgICAvLyBlc3BlY2lhbGx5IGRvaW5nIHRoZSBkYXRhIGxhenkgbG9hZGluZ1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1Njcm9sbGluZ0V2ZW50SGFuZGxlclNldHVwID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuc2Nyb2xsQ2hlY2tJbnRlcnZhbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1Njcm9sbGluZ0V2ZW50SGFuZGxlclNldHVwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2Nyb2xsaW5nRXZlbnRIYW5kbGVyU2V0dXAgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ2hlY2tJbnRlcnZhbCA9IHNldEludGVydmFsKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1Njcm9sbGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDaGVja0ludGVydmFsRHVyYXRpb24pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgICAgdGhpcy5ldmVudFVucmVnaXN0cmF0ZXJIYW5kbGVycy5wdXNoKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVVJKCk7XHJcbiAgICAgICAgdGhpcy5jaGVja0ltbWVkaWF0ZVZhbGlkYXRpb24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBAWWllbGQoKVxyXG4gICAgcHJpdmF0ZSBjaGVja0ltbWVkaWF0ZVZhbGlkYXRpb24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVUZW1wbGF0ZUxvYWRlckNvbXBvbmVudHMuZm9yRWFjaChsb2FkZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybUZpZWxkQ29udGFpbmVyID0gPEZvcm1GaWVsZENvbnRhaW5lcj5sb2FkZXI7XHJcbiAgICAgICAgICAgICAgICBpZiAobG9hZGVyLnJlbmRlcmVkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1GaWVsZENvbnRhaW5lci5pbW1lZGlhdGVWYWxpZGF0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGltcGxlbWVudHMgdGhlIE9uRGVzdHJveSBpbnRlcmZhY2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5zY3JvbGxDaGVja0ludGVydmFsKTtcclxuICAgICAgICB0aGlzLmV2ZW50VW5yZWdpc3RyYXRlckhhbmRsZXJzLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0oKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudW5yZWdpc3Rlck9uRWxlbWVudEZvY3VzaW5nRXZlbnRIYW5kbGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5yZWdpc3Rlck9uRWxlbWVudEZvY3VzaW5nRXZlbnRIYW5kbGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmxheW91dENoYW5nZVN1YnNjcmliZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRDaGFuZ2VTdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmdsb2JhbEZpbHRlclN1YnNjcmliZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJTdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW1wbGVtZW50cyB0aGUgQWZ0ZXJWaWV3Q2hlY2tlZCBpbnRlcmZhY2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdDaGVja2VkKCk7XHJcbiAgICAgICAgdGhpcy5hbGlnbkNvbnRlbnQoKTtcclxuICAgICAgICB0aGlzLmFsaWduU2Nyb2xsQmFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBzZWxlY3Rpb24gb2YgdGhlIGdpdmVuIGRhdGEgdGFibGUgaXRlbS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNlbGVjdEl0ZW0oZXZlbnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50LCBpdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBsZXQgbXVsdGlwbGVTZWxlY3RNb2RlID0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk5vcm1hbDtcclxuICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcclxuICAgICAgICAgICAgICAgIG11bHRpcGxlU2VsZWN0TW9kZSA9IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5QaWNrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVTZWxlY3RNb2RlID0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLlNlcXVlbnRpYWw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lZGl0YWJsZSAmJiAoPEhUTUxFbGVtZW50PmV2ZW50LnNyY0VsZW1lbnQpLnRhZ05hbWUgPT09ICdJTlBVVCcpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KGl0ZW0gPyBpdGVtLmluZGV4IDogLTEpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgIT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChldmVudCAmJiBldmVudC50YXJnZXRbJ3R5cGUnXSA9PT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSAhPT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGl0ZW0ubm9kZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlU2VsZWN0ZWQuZW1pdCh7IG5vZGU6IGl0ZW0ubm9kZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RBbmRDaGVjaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpcGxlU2VsZWN0TW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLk5vcm1hbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaChjdXJyZW50SXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24oY3VycmVudEl0ZW0sIGZhbHNlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihpdGVtLm5vZGUsIHRydWUsIGZhbHNlLCAhdGhpcy5saW5rUGFyZW50Q2hpbGRyZW5TZWxlY3Rpb25zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVTZWxlY3RlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtdWx0aXBsZVNlbGVjdE1vZGUgPT09IERhdGFUYWJsZU11bHRpcGxlU2VsZWN0TW9kZS5QaWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihpdGVtLm5vZGUsICFpdGVtLm5vZGUuc2VsZWN0ZWQsIGZhbHNlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG11bHRpcGxlU2VsZWN0TW9kZSA9PT0gRGF0YVRhYmxlTXVsdGlwbGVTZWxlY3RNb2RlLlNlcXVlbnRpYWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc21lLXVzZXItc2VsZWN0LW5vbmUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmNsZWFyVGV4dFNlbGVjdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ICE9PSAtMSAmJiB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5zaGlmdE11bHRpcGxlU2VsZWN0U3RhcnRJbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gaXRlbS5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5pbmRleCA8IHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpdGVtLmluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXhlZCBhIGJ1ZyB0aGF0IHRyZWUgdGFibGUgbXVsdGlwbGUgc2VsZWN0aW9uIHdpbGwgbG9zdCBmb2N1c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24odHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RQYXJlbnQ6IFRyZWVOb2RlRGF0YUl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLnR5cGUgIT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJlZU5vZGVTZWxlY3Rpb24odGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUsIHRydWUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQYXJlbnQgPSB0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGVuZCArIDE7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbih0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZSwgZmFsc2UsIHRydWUsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdEFuZENoZWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGVTZWxlY3RNb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuUGljaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25JdGVtQ2hlY2tCb3hDbGlja2VkKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXVsdGlwbGVTZWxlY3RNb2RlID09PSBEYXRhVGFibGVNdWx0aXBsZVNlbGVjdE1vZGUuU2VxdWVudGlhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc21lLXVzZXItc2VsZWN0LW5vbmUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5jbGVhclRleHRTZWxlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXZpb3VzQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggIT09IC0xICYmIHRoaXMuc2hpZnRNdWx0aXBsZVNlbGVjdFN0YXJ0SW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5wcmV2aW91c0FjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW5kID0gaXRlbS5pbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaW5kZXggPCB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGl0ZW0uaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0udHlwZSAhPT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25JdGVtQ2hlY2tCb3hDbGlja2VkKHRoaXMucmVuZGVyZWRJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtpdGVtLmRhdGFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TXVsdGlwbGVTZWxlY3RTdGFydEluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGl0ZW0uZGF0YSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gdGhpcy5lZGl0YWJsZSA/IGl0ZW0uZGF0YS5jb250ZW50IDogaXRlbS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoeyBkYXRhOiB0aGlzLmVkaXRhYmxlID8gaXRlbS5kYXRhLmNvbnRlbnQgOiBpdGVtLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQgJiYgIURvbS5pc0ZvY3VzYWJsZSg8SFRNTEVsZW1lbnQ+ZXZlbnQudGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGZ1bmN0aW9uIHRvIGZvY3VzIG9uIGVtcHR5IG1lc3NhZ2Ugd2hlbiB0aGUgZGF0YSB0YWJsZSBpcyBlbXB0eVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZW1wdHlNZXNzYWdlRWxlbWVudCAmJiB0aGlzLmVtcHR5TWVzc2FnZUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICBpdGVtLmZvY3VzKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbEJvZHlFbGVtZW50ICYmIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudCAmJiB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbEJvZHlFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJlc2V0VHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZUNvdW50KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZWZlcnJlZFRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQERlYm91bmNlKClcclxuICAgIHByaXZhdGUgZGVmZXJyZWRUcnlUb0ZvY3VzRW1wdHlNZXNzYWdlKCkge1xyXG4gICAgICAgIHRoaXMudHJ5VG9Gb2N1c0VtcHR5TWVzc2FnZUNvdW50LS07XHJcbiAgICAgICAgdGhpcy50cnlUb0ZvY3VzRW1wdHlNZXNzYWdlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNldFRyeVRvRm9jdXNFbXB0eU1lc3NhZ2VDb3VudCgpIHtcclxuICAgICAgICB0aGlzLnRyeVRvRm9jdXNFbXB0eU1lc3NhZ2VDb3VudCA9IDM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCByZXR1cm5zIHRoZSBubyByZWNvcmRzIG1lc3NhZ2Ugd2hlbiB0aGUgZGF0YSB0YWJsZSBpcyBlbXB0eS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE5vUmVjb3Jkc01lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ub1JlY29yZE1lc3NhZ2UgfHwgdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5Ob1JlY29yZHNGb3VuZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGRldGVybWluZXMgd2hldGhlciB0bywgb3Igbm90IHRvIHNob3cgdGhlIE5vLVJlY29yZHMgTWVzc2FnZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNob3dOb1JlY29yZHNNZXNzYWdlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5sYXp5TG9hZCkgfHwgIXRoaXMuaXNDb2x1bW5XaWR0aENhbGN1bGF0ZWQgfHxcclxuICAgICAgICAgICAgKHRoaXMubGF6eUxvYWQgJiYgdGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBiZWhhdmlvciB0aGF0IHdoZW4gYSBncm91cCB0b2dnbGUgaXMgY2xpY2tlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsaWNrR3JvdXBUb2dnbGUoaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWU/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpdGVtLmluZGV4KTtcclxuICAgICAgICB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2l0ZW0uZGF0YV0gPSB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWUgIT09IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICAgIHRvZ2dsZVN0YXR1c092ZXJyaWRkZW5WYWx1ZSA6ICF0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2l0ZW0uZGF0YV07XHJcbiAgICAgICAgdGhpcy5ncm91cFRvZ2dsZUNsaWNrLmVtaXQoaXRlbS5kYXRhKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbkRvbVdpZHRocygpO1xyXG4gICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUgYmVoYXZpb3IgdGhhdCB3aGVuIGEgdHJlZSBub2RlIHRvZ2dsZSBpcyBjbGlja2VkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xpY2tUcmVlVG9nZ2xlKGV2ZW50OiBFdmVudCwgaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWU/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtLm5vZGUuZXhwYW5kZWQgPSB0b2dnbGVTdGF0dXNPdmVycmlkZGVuVmFsdWUgIT09IHVuZGVmaW5lZCA/IHRvZ2dsZVN0YXR1c092ZXJyaWRkZW5WYWx1ZSA6ICFpdGVtLm5vZGUuZXhwYW5kZWQ7XHJcbiAgICAgICAgaWYgKGl0ZW0ubm9kZS5leHBhbmRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vZGVFeHBhbmRlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubm9kZUNvbGxhcHNlZC5lbWl0KHsgbm9kZTogaXRlbS5ub2RlIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLmdldFRyZWVOb2RlRGF0YUlkZW50aXR5KGl0ZW0ubm9kZSk7XHJcbiAgICAgICAgdGhpcy50cmVlVG9nZ2xlU3RhdHVzW2lkZW50aXR5XSA9IGl0ZW0ubm9kZS5leHBhbmRlZDtcclxuXHJcbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBleHBhbmRzIGFsbCB0aGUgZ3JvdXBzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXhwYW5kQWxsR3JvdXAoKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBpbiB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzLmhhc093blByb3BlcnR5KGdyb3VwKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tncm91cF0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgY29sbGFwc2VzIGFsbCB0aGUgZ3JvdXBzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sbGFzZUFsbEdyb3VwKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgaW4gdGhpcy5ncm91cFRvZ2dsZVN0YXR1cykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cFRvZ2dsZVN0YXR1cy5oYXNPd25Qcm9wZXJ0eShncm91cCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBUb2dnbGVTdGF0dXNbZ3JvdXBdID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW5kZXJJdGVtcyhmYWxzZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCByZXR1cm5zIHRoZSBib29sZWFuIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGdpdmVuIGNvbHVtbiBpcyB0aGUgZmlyc3QgZGF0YSBjb2x1bW4uXHJcbiAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgY2FuIGJlIHVzZWQgdG8gYWRkIHNvbWUgY3VzdG9tIGNzcyBmb3IgdGhlIGZpcnN0IGRhdGEgY29sdW1uIHdoZW4gZ3JvdXBpbmcgaXMgZW5hYmxlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGZpcnN0RGF0YUNvbHVtbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmZvckVhY2goY3VycmVudENvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50Q29sdW1uICE9PSB0aGlzLmdyb3VwQ29sdW1uICYmICFmaXJzdERhdGFDb2x1bW4gJiYgIWN1cnJlbnRDb2x1bW4uaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICBmaXJzdERhdGFDb2x1bW4gPSBjdXJyZW50Q29sdW1uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjb2x1bW4gPT09IGZpcnN0RGF0YUNvbHVtbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBpZCBpZiB0aGUgY29sdW1uIGlzIHRoZSBmaXJzdCBhbmQgcmVuZGVyZWQgaXRlbSBoYXMgYSB2YWxpZCBpbmRleCwgb3RoZXJ3aXNlIHJldHVybiBudWxsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRGaXJzdENvbHVtbklkKGNvbHVtbjogRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50LCByZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0ZpcnN0RGF0YUNvbHVtbihjb2x1bW4pIHx8XHJcbiAgICAgICAgICAgICEocmVuZGVyZWRJdGVtICYmIE51bWJlci5pc0ludGVnZXIocmVuZGVyZWRJdGVtLmluZGV4KSAmJiByZW5kZXJlZEl0ZW0uaW5kZXggPj0gMCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5pZEJhZy5maXJzdERhdGFDb2x1bW4gKyByZW5kZXJlZEl0ZW0uaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uQ29sdW1uUmVzaXppbmcoZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlc2l6ZXJJbmRpY2F0b3IubmF0aXZlRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAuNSc7XHJcbiAgICAgICAgdGhpcy5yZXNpemVySW5kaWNhdG9yLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc21lLWxheW91dC1ub25lJyk7XHJcbiAgICAgICAgdGhpcy5yZXNpemVySW5kaWNhdG9yLm5hdGl2ZUVsZW1lbnQuc3R5bGUubGVmdCA9IGV2ZW50LnggKyAncHgnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvbkNvbHVtblJlc2l6ZWQoY29sdW1uSW5kZXg6IG51bWJlciwgZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlc2l6ZXJJbmRpY2F0b3IubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzbWUtbGF5b3V0LW5vbmUnKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29sdW1uSGVhZGVyRWxlbWVudHMgPSB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zbWUtdGFibGUtY29sdW1uLWhlYWRlcicpO1xyXG4gICAgICAgIGNvbnN0IG5ld0NvbHVtbldpZHRoczogbnVtYmVyW10gPSBbXTtcclxuICAgICAgICBsZXQgdG90YWxXaWR0aCA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5IZWFkZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBuZXdDb2x1bW5XaWR0aHMucHVzaChjb2x1bW5IZWFkZXJFbGVtZW50c1tpXS5vZmZzZXRXaWR0aCk7XHJcbiAgICAgICAgICAgIHRvdGFsV2lkdGggKz0gY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBUaGUgcmVzaXplciBpcyBhdCB0aGUgcmlnaHQgYm9yZGVyIG9mIHRoZSBjdXJyZW50IGNvbHVtbi5cclxuICAgICAgICAvLyBXaGVuIHRoZSByZXNpemluZyBoYXBwZW5zLCBpdCBtZWFucyByZXNpemluZyB0aGUgY3VycmVudCBjb2x1bW4gd2l0aCBkZWx0YSBhbW91bnRcclxuICAgICAgICAvLyBhbmQgcmVzaXppbmcgdGhlIG5leHQgY29sdW1uIHdpdGggLWRlbHRhIGFtb3VudC5cclxuICAgICAgICBjb25zdCBjdXJyZW50Q29sdW1uSGVhZGVyRWxlbWVudCA9IGNvbHVtbkhlYWRlckVsZW1lbnRzW2NvbHVtbkluZGV4XTtcclxuICAgICAgICBsZXQgbmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uID0gY3VycmVudENvbHVtbkhlYWRlckVsZW1lbnQub2Zmc2V0V2lkdGggKyBldmVudC54O1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgbmV4dENvbHVtbkhlYWRlciBpcyBoaWRkZW4sIHRoYXQgbWVhbnMgaXQncyBhIGdyb3VwIGNvbHVtbiBoZWFkZXIgd2hpY2ggc2hvdWxkIGJlIGhpZGRlbi5cclxuICAgICAgICAvLyBBIGhpZGRlbiBncm91cCBoZWFkZXIncyB3aWR0aCBzaG91bGQgbm90IGJlIGNvdW50ZWQuXHJcbiAgICAgICAgLy8gVGhlbiBzZXQgdGhlIG5leHRDb2x1bW5JbmRleCB0byB0aGUgbmV4dCBuZXh0IGNvbHVtbidzIGluZGV4LlxyXG4gICAgICAgIGNvbnN0IG5leHRDb2x1bW5JbmRleCA9IGNvbHVtbkluZGV4ICsgKGNvbHVtbkhlYWRlckVsZW1lbnRzW2NvbHVtbkluZGV4ICsgMV0uaGFzQXR0cmlidXRlKCdoaWRkZW4nKSA/IDIgOiAxKTtcclxuICAgICAgICBjb25zdCBuZXh0Q29sdW1uSGVhZGVyRWxlbWVudCA9IGNvbHVtbkhlYWRlckVsZW1lbnRzW25leHRDb2x1bW5JbmRleF07XHJcbiAgICAgICAgbGV0IG5ld1dpZHRoRm9yTmV4dENvbHVtbiA9IG5leHRDb2x1bW5IZWFkZXJFbGVtZW50Lm9mZnNldFdpZHRoIC0gZXZlbnQueDtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbiBpcyBsZXNzIHRoZW4gbWluQ29sdW1uV2lkdGgsIGl0IG1lYW5zIHRoZSB1c2VyIGlzIHRyeWluZyB0byBkcmFnIHRoZSByZXNpemVyIHRvIHZlcnkgbGVmdFxyXG4gICAgICAgIC8vIHRvIG1ha2UgdGhlIG5leHQgY29sdW1uIHZlcnkgd2lkZS5cclxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdHJ5IHRvIG1ha2Ugc3VyZSB0aGUgbmV4dCBjb2x1bW4gY2FuIGJlIHJlc2l6ZWQgdG8gYXMgd2lkZSBhcyB0aGUgdXNlciB3YW50cy5cclxuICAgICAgICAvLyBUaGUgbGVmdCBzaWRlIGNvbHVtbnMgb2YgdGhlIG5leHQgY29sdW1uIHdpbGwgYmUgc2hydW5rIGJhc2VkIG9uIHRoZWlyIG93biBvcmlnaW5hbCBwZXJjZW50YWdlIHdpZHRoLlxyXG4gICAgICAgIGlmIChuZXdXaWR0aEZvckN1cnJlbnRDb2x1bW4gPCBEYXRhVGFibGVDb21wb25lbnQubWluQ29sdW1uV2lkdGgpIHtcclxuICAgICAgICAgICAgbGV0IGNvbnN1bWVkV2lkdGhSaWdodFNpZGVDb2x1bW5zID0gMDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG5leHRDb2x1bW5JbmRleCArIDE7IGkgPCBjb2x1bW5IZWFkZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3VtZWRXaWR0aFJpZ2h0U2lkZUNvbHVtbnMgKz0gY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMgPSB0b3RhbFdpZHRoIC0gY29uc3VtZWRXaWR0aFJpZ2h0U2lkZUNvbHVtbnMgLSBuZXh0Q29sdW1uSGVhZGVyRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMgPSB0b3RhbFdpZHRoIC0gY29uc3VtZWRXaWR0aFJpZ2h0U2lkZUNvbHVtbnMgLSBuZXdXaWR0aEZvck5leHRDb2x1bW47XHJcblxyXG4gICAgICAgICAgICBsZXQgYWN0dWFsV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMgPSAwO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBjb2x1bW5JbmRleDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb2x1bW5XaWR0aCA9IE1hdGgubWF4KFxyXG4gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoRm9yTGVmdFNpZGVDb2x1bW5zICogKGNvbHVtbkhlYWRlckVsZW1lbnRzW2ldLm9mZnNldFdpZHRoIC8gb3JpZ2luYWxXaWR0aEZvckxlZnRTaWRlQ29sdW1ucyksXHJcbiAgICAgICAgICAgICAgICAgICAgRGF0YVRhYmxlQ29tcG9uZW50Lm1pbkNvbHVtbldpZHRoKTtcclxuICAgICAgICAgICAgICAgIG5ld0NvbHVtbldpZHRoc1tpXSA9IG5ld0NvbHVtbldpZHRoO1xyXG4gICAgICAgICAgICAgICAgYWN0dWFsV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnMgKz0gbmV3Q29sdW1uV2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uID0gbmV3Q29sdW1uV2lkdGhzW2NvbHVtbkluZGV4XTtcclxuICAgICAgICAgICAgbmV3V2lkdGhGb3JOZXh0Q29sdW1uID0gdG90YWxXaWR0aCAtIGNvbnN1bWVkV2lkdGhSaWdodFNpZGVDb2x1bW5zIC0gYWN0dWFsV2lkdGhGb3JMZWZ0U2lkZUNvbHVtbnM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJZiB0aGUgbmV3V2lkdGhGb3JOZXh0Q29sdW1uIGlzIGxlc3MgdGhlbiBtaW5Db2x1bW5XaWR0aCwgaXQgbWVhbnMgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIGRyYWcgdGhlIHJlc2l6ZXIgdG8gdmVyeSByaWdodFxyXG4gICAgICAgIC8vIHRvIG1ha2UgdGhlIGN1cnJlbnQgY29sdW1uIHZlcnkgd2lkZS5cclxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIHdpbGwgdHJ5IHRvIG1ha2Ugc3VyZSB0aGUgY3VycmVudCBjb2x1bW4gY2FuIGJlIHJlc2l6ZWQgdG8gYXMgd2lkZSBhcyB0aGUgdXNlciB3YW50cy5cclxuICAgICAgICAvLyBUaGUgcmlnaHQgc2lkZSBjb2x1bW5zIG9mIHRoZSBjdXJyZW50IGNvbHVtbiB3aWxsIGJlIHNocnVuayBiYXNlZCBvbiB0aGVpciBvd24gb3JpZ2luYWwgcGVyY2VudGFnZSB3aWR0aC5cclxuICAgICAgICBpZiAobmV3V2lkdGhGb3JOZXh0Q29sdW1uIDwgRGF0YVRhYmxlQ29tcG9uZW50Lm1pbkNvbHVtbldpZHRoKSB7XHJcbiAgICAgICAgICAgIGxldCBjb25zdW1lZFdpZHRoTGVmdFNpZGVDb2x1bW5zID0gMDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gY29sdW1uSW5kZXggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN1bWVkV2lkdGhMZWZ0U2lkZUNvbHVtbnMgKz0gY29sdW1uSGVhZGVyRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zID0gdG90YWxXaWR0aCAtIGNvbnN1bWVkV2lkdGhMZWZ0U2lkZUNvbHVtbnMgLSBjdXJyZW50Q29sdW1uSGVhZGVyRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgY29uc3QgYXZhaWxhYmxlV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zID0gdG90YWxXaWR0aCAtIGNvbnN1bWVkV2lkdGhMZWZ0U2lkZUNvbHVtbnMgLSBuZXdXaWR0aEZvckN1cnJlbnRDb2x1bW47XHJcblxyXG4gICAgICAgICAgICBsZXQgYWN0dWFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zID0gMDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG5leHRDb2x1bW5JbmRleDsgaSA8IGNvbHVtbkhlYWRlckVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb2x1bW5XaWR0aCA9IE1hdGgubWF4KFxyXG4gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVdpZHRoRm9yUmlnaHRTaWRlQ29sdW1ucyAqIChjb2x1bW5IZWFkZXJFbGVtZW50c1tpXS5vZmZzZXRXaWR0aCAvIG9yaWdpbmFsV2lkdGhGb3JSaWdodFNpZGVDb2x1bW5zKSxcclxuICAgICAgICAgICAgICAgICAgICBEYXRhVGFibGVDb21wb25lbnQubWluQ29sdW1uV2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgbmV3Q29sdW1uV2lkdGhzW2ldID0gbmV3Q29sdW1uV2lkdGg7XHJcbiAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aEZvclJpZ2h0U2lkZUNvbHVtbnMgKz0gbmV3Q29sdW1uV2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV3V2lkdGhGb3JDdXJyZW50Q29sdW1uID0gdG90YWxXaWR0aCAtIGNvbnN1bWVkV2lkdGhMZWZ0U2lkZUNvbHVtbnMgLSBhY3R1YWxXaWR0aEZvclJpZ2h0U2lkZUNvbHVtbnM7XHJcbiAgICAgICAgICAgIG5ld1dpZHRoRm9yTmV4dENvbHVtbiA9IG5ld0NvbHVtbldpZHRoc1tuZXh0Q29sdW1uSW5kZXhdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbmV3Q29sdW1uV2lkdGhzW2NvbHVtbkluZGV4XSA9IG5ld1dpZHRoRm9yQ3VycmVudENvbHVtbjtcclxuICAgICAgICBuZXdDb2x1bW5XaWR0aHNbbmV4dENvbHVtbkluZGV4XSA9IG5ld1dpZHRoRm9yTmV4dENvbHVtbjtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlcyB0aGUgY29sdW1uIHdpZHRocyBiYXNlZCBvbiB0aGUgY2FsY3VsYXRpb24gcmVzdWx0cy5cclxuICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgIGNvbHVtbi53aWR0aCA9IG5ld0NvbHVtbldpZHRoc1tpbmRleF0gKyAncHgnO1xyXG4gICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbHVtbiBwZXJjZW50YWdlcyBiYXNlZCBvbiB0aGUgbmV3IGNvbHVtbiB3aWR0aHMuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbHVtbi53aWR0aFBlcmNlbnRhZ2UgPSBjb2x1bW5IZWFkZXJFbGVtZW50c1tpbmRleF0ub2Zmc2V0V2lkdGggLyB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgICAgIGluZGV4Kys7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUNvbHVtbkRvbVdpZHRocygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaGFuZGxlcyB0aGUgY29sdW1uIGNsaWNraW5nLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xpY2tDb2x1bW4oY29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjb2x1bW5Tb3J0U2V0dGluZ3MgPSB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uc29ydGFibGUgJiYgY29sdW1uLnNvcnRhYmxlICE9PSAnZmFsc2UnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gY29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uc29ydE1vZGUgPT09IERhdGFUYWJsZVNvcnRNb2RlLk5vbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zb3J0TW9kZSA9IERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uc29ydE1vZGUgPT09IERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNvcnRNb2RlID0gRGF0YVRhYmxlU29ydE1vZGUuRGVzY2VuZDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNvcnRNb2RlID0gRGF0YVRhYmxlU29ydE1vZGUuQXNjZW5kO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c1NvcnRDb2x1bW4gPSB0aGlzLnNvcnRDb2x1bW47XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0Q29sdW1uID0gaXRlbTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNvcnRJdGVtcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZFNjcm9sbFRvU2VsZWN0aW9uQWZ0ZXJTb3J0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoZmFsc2UsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5oZWFkZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGhbZmllbGQ9XCInICsgY29sdW1uLmZpZWxkICsgJ1wiXScpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RyJykuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjAwIGlzIGEgdmVyeSB0cmlja3kgbnVtYmVyIGhlcmUuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBudW1iZXIgaXMgdG9vIHNtYWxsLCBpdCB3b24ndCB0cmlnZ2VyIHRoZSBuYXJyYXRvci5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgaXQncyB0b28gYmlnLCB0aGUgbmFycmF0b3Igd291bGQgZmlyc3RseSByZWFkIHRoZSBjb250ZW50IG9mIFRSIHBhcnRpYWxseSB0aGVuIHRoZSBjb250ZW50IG9mIHRoZSBUSC5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc29ydE1vZGUgPSBEYXRhVGFibGVTb3J0TW9kZS5Ob25lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb2x1bW5Tb3J0U2V0dGluZ3NbaXRlbS5oZWFkZXJdID0gdGhpcy5nZXRBcmlhU29ydEF0dHJpYnV0ZVZhbHVlKGl0ZW0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNvbHVtblNvcnRTZXR0aW5ncyA9IGNvbHVtblNvcnRTZXR0aW5ncztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIHJvdyBkb3VibGUgY2xpY2tpbmcuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkb3VibGVDbGlja1JvdyhldmVudDogTW91c2VFdmVudCwgaXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNsaWNrVHJlZVRvZ2dsZShldmVudCwgaXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0SXRlbShldmVudCwgaXRlbSk7XHJcbiAgICAgICAgdGhpcy5yb3dEYmxjbGljay5lbWl0KHsgZGF0YTogaXRlbS5kYXRhIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgc2Nyb2xscyB0aGUgc2VsZWN0ZWQgaXRlbSBpbnRvIHRoZSB2aWV3IGFuZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcodHJ5VG9Nb3ZlVG9DZW50ZXI/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGlvbkRhdGEgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRGF0YSA9IHRoaXMuc2VsZWN0aW9uLmRhdGE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRhdGEgPSB0aGlzLnNlbGVjdGlvbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRhdGEgPSB0aGlzLnNlbGVjdGlvblswXS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkRhdGEgPSB0aGlzLnNlbGVjdGlvblswXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbkRhdGEpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXS5kYXRhID09PSBzZWxlY3Rpb25EYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyeVRvTW92ZVRvQ2VudGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsRGF0YUVsZW1lbnQgPSB0aGlzLnNjcm9sbERhdGFFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1FbGVtZW50ID0gc2Nyb2xsRGF0YUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNtZS10YWJsZS1yb3cuc21lLXRhYmxlLXJvdy1zZWxlY3RlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRlbUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW1Ub3AgPSBzZWxlY3RlZEl0ZW1FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNjcm9sbERhdGFFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcCA9IHNlbGVjdGVkSXRlbVRvcCArIHNjcm9sbERhdGFFbGVtZW50Lm9mZnNldFRvcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0IC8gMjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IGhhbmRsZXMgdGhlIGNsaWNraW5nIGJlaGF2aW9yIG9mIGNoZWNrYm94LlxyXG4gICAgICogTXVsdGlwbGUgc2VsZWN0aW9uIGJlaGF2aW9yIGlzIGhhcHBlbmluZyBoZXJlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25JdGVtQ2hlY2tCb3hDbGlja2VkKGl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgaXNGcm9tS2V5Ym9hcmQ/OiBib29sZWFuKSB7XHJcbiAgICAgICAgLy8gSWYgdGhlIGl0ZW0gaXMgdW5jaGVja2VkLCBuZWVkIHRvIHNldCBhY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCB0byAtMSB0aGVuIHRoaXMgaXRlbSB3b24ndCBiZSBoaWdobGlnaHRlZCBpbiB0aGUgVUkuXHJcbiAgICAgICAgaWYgKGl0ZW0udHlwZSAhPT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLlRyZWVOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGl0ZW0ubm9kZSwgIWl0ZW0ubm9kZS5zZWxlY3RlZCwgZmFsc2UsICF0aGlzLmxpbmtQYXJlbnRDaGlsZHJlblNlbGVjdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0ubm9kZS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZVNlbGVjdGVkLmVtaXQoeyBub2RlOiBpdGVtLm5vZGUgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNGcm9tS2V5Ym9hcmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgtMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSAmJiAhdGhpcy5lZGl0YWJsZSAmJiB0aGlzLmV4cGFuZFRyZWVOb2RlT25DaGVja2VkICYmIGl0ZW0uaGFzQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWNrVHJlZVRvZ2dsZShudWxsLCBpdGVtLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5pbmRleE9mKGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5wdXNoKGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHsgZGF0YTogaXRlbS5kYXRhIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dVbnNlbGVjdGVkLmVtaXQoeyBkYXRhOiBpdGVtLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zyb21LZXlib2FyZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KC0xKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuaXNJdGVtU2VsZWN0ZWQoaXRlbSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbXMgPSB0aGlzLmZpbHRlcmVkSXRlbXMuZmlsdGVyKGN1cnJlbnRJdGVtID0+XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGN1cnJlbnRJdGVtLCB0aGlzLmdyb3VwQ29sdW1uLmZpZWxkKSA9PT0gaXRlbS5kYXRhKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihncm91cEl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1Vuc2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGdyb3VwSXRlbXNbaV0gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ucHVzaChncm91cEl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dTZWxlY3RlZC5lbWl0KHsgZGF0YTogZ3JvdXBJdGVtc1tpXSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghc2VsZWN0ZWQgJiYgIWlzRnJvbUtleWJvYXJkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KC0xKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gTmVlZCB0byByZWNyZWF0ZSB0aGUgXCJpbnRlcm5hbFNlbGVjdGlvblwiIGFycmF5IG90aGVyd2lzZSB0aGUgY2hhbmdlIGRldGVjdG9yIHdvbid0IGRldGVjdCB0aGUgY2hhbmdlXHJcbiAgICAgICAgLy8gc2luY2UgdGhlIGFycmF5J3Mgb3duIHJlZmVyZW5jZSBpcyBub3QgY2hhbmdlZC5cclxuICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5zbGljZSgwLCB0aGlzLmludGVybmFsU2VsZWN0aW9uLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5pbnRlcm5hbFNlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBoYW5kbGVzIHRoZSBcImNoZWNrIGFsbFwiIGNoZWNrYm94IGJlaGF2aW9yLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25BbGxJdGVtQ2hlY2tCb3hDbGlja2VkKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmludGVybmFsU2VsZWN0aW9uLmxlbmd0aCAhPT0gdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGwoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dVbnNlbGVjdGVkLmVtaXQoeyBkYXRhOiBpdGVtIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkU2VsZWN0ID0gIXRoaXMuc2hvdWxkQWxsSXRlbUNoZWNrQm94Q2hlY2tlZCgpO1xyXG4gICAgICAgICAgICB0aGlzLmludGVybmFsU2VsZWN0aW9uID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihpdGVtLCBzaG91bGRTZWxlY3QpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh0aGlzLmludGVybmFsU2VsZWN0aW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gaXRlbSBpcyBzZWxlY3RlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzSXRlbVNlbGVjdGVkKGl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICghdGhpcy5zaG93QXNUcmVlKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgIT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gaXRlbS5kYXRhICYmIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihpdGVtLmRhdGEpICE9PSAtMTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbXMgPSB0aGlzLmZpbHRlcmVkSXRlbXMuZmlsdGVyKGN1cnJlbnRJdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoY3VycmVudEl0ZW0sIHRoaXMuZ3JvdXBDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpID09PSBpdGVtLmRhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGl0ZW0uZGF0YSA9PT0gdW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChncm91cEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5pbmRleE9mKGdyb3VwSXRlbXNbaV0pID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBpdGVtLm5vZGUgJiYgaXRlbS5ub2RlLnNlbGVjdGVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBpdGVtLmRhdGEgJiYgdGhpcy5pbnRlcm5hbFNlbGVjdGlvbi5tYXAoY3VycmVudEl0ZW0gPT4gY3VycmVudEl0ZW0uZGF0YSkuaW5kZXhPZihpdGVtLmRhdGEpICE9PSAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgaW5kaWNhdGVzIHdoZXRoZXIgYSBncm91cCB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIGV4cGFuZGVkLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNHcm91cEV4cGFuZGVkKGdyb3VwOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tncm91cF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdCBnZXRzIGFuZCBzZXRzIHRoZSB2aXJ0dWFsIGNvdW50LlxyXG4gICAgICogSXQgb25seSB3b3JrcyB3aGVuIFwibGF6eUxvYWRcIiBpcyB0cnVlLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGdldCB2aXJ0dWFsQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCB8fCB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgc2V0IHZpcnR1YWxDb3VudCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID49IDApIHtcclxuICAgICAgICAgICAgdGhpcy5pdGVtcyA9IEFycmF5KHZhbHVlKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zW2ldID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJJdGVtcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEl0IHJlc29sdmVzIHRoZSBvYmplY3QgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGF0aCB3aXRoIG11bHRpcGxlIGxldmVscyBvZiBwcm9wZXJ0aWVzLlxyXG4gICAgICogQW4gZXhhbXBsZSBvZiBwYXRoIGlzIFwibG9jYXRpb24uemlwQ29kZVwiLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVzb2x2ZU9iamVjdFBhdGgob2JqOiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XHJcbiAgICAgICAgaWYgKG9iaiAmJiBwYXRoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhdGhTZWdtZW50czogc3RyaW5nW10gPSBwYXRoLnNwbGl0KCcuJyk7XHJcbiAgICAgICAgICAgIGlmIChwYXRoU2VnbWVudHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqW3BhdGhdO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY3VycmVudE9iaiA9IG9iajtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoU2VnbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRPYmogPSBjdXJyZW50T2JqW3BhdGhTZWdtZW50c1tpXV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudE9iaiA9PT0gdW5kZWZpbmVkIHx8IGN1cnJlbnRPYmogPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY3VycmVudE9iajtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgcmV0dXJucyB0aGUgYWN0aXZlIHJlbmRlcmVkIGl0ZW0gaW5kZXguXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoaW5wdXQ6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXggPSBpbnB1dCA+PSAwID8gaW5wdXQgOiAtMTtcclxuICAgICAgICB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggPSB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSXQgcmV0dXJucyB0aGUgYWN0aXZlIGZvY3VzZWQgaXRlbSBpbmRleC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID4gLTEgPyB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggOiB0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgoaW5kZXg6IG51bWJlciwgZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVJlbmRlcmVkSXRlbUJ5SW5kZXgoaW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRvIGhlYWQgb2YgdGhlIHdob2xlIHJlbmRlcmVkIGl0ZW0gbGlzdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vdmVUb0hlYWRPZlJlbmRlcmVkSXRlbXMoZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RPckZvY3VzUm93QnlJbmRleCgwLCBkb1NlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0byBwcmV2aW91cyBwYWdlIG9mIHRoZSByZW5kZXJlZCBpdGVtIGxpc3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtb3ZlVG9QcmV2aW91c1BhZ2VPZlJlbmRlcmVkSXRlbXMoZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBkb1NlbGVjdGlvbiA/IHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSA6IHRoaXMuZ2V0QWN0aXZlRm9jdXNlZEl0ZW1JbmRleCgpO1xyXG4gICAgICAgIGxldCBuZXdJbmRleCA9IDA7XHJcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgbmV3SW5kZXggPSBpbmRleCAtIE1hdGgucm91bmQodGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgobmV3SW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRvIHByZXZpb3VzIGl0ZW0gaW4gdGhlIHJlbmRlcmVkIGl0ZW0gbGlzdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vdmVUb1ByZXZpb3VzUmVuZGVyZWRJdGVtKGRvU2VsZWN0aW9uOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gZG9TZWxlY3Rpb24gPyB0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCkgOiB0aGlzLmdldEFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgoKTtcclxuXHJcbiAgICAgICAgbGV0IG5ld0luZGV4ID0gMDtcclxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICBuZXdJbmRleCA9IGluZGV4IC0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0T3JGb2N1c1Jvd0J5SW5kZXgobmV3SW5kZXgsIGRvU2VsZWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vdmVzIHRvIG5leHQgaXRlbSBpbiB0aGUgcmVuZGVyZWQgaXRlbSBsaXN0LlxyXG4gICAgICogQHBhcmFtIGRvU2VsZWN0aW9uIGlmIHRydWUgd2lsbCBkbyBzZWxlY3Rpb24gYW5kIGZvY3VzLCBvdGhlcndpc2UgZm9jdXMgb25seVxyXG4gICAgICovXHJcblxyXG4gICAgcHVibGljIG1vdmVUb05leHRSZW5kZXJlZEl0ZW0oZG9TZWxlY3Rpb24gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBkb1NlbGVjdGlvbiA/IHRoaXMuZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSA6IHRoaXMuZ2V0QWN0aXZlRm9jdXNlZEl0ZW1JbmRleCgpO1xyXG5cclxuICAgICAgICBsZXQgbmV3SW5kZXggPSAwO1xyXG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XHJcbiAgICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXggKyAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RPckZvY3VzUm93QnlJbmRleChuZXdJbmRleCwgZG9TZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdG8gbmV4dCBwYWdlIG9mIHRoZSByZW5kZXJlZCBpdGVtIGxpc3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtb3ZlVG9OZXh0UGFnZU9mUmVuZGVyZWRJdGVtcyhkb1NlbGVjdGlvbjogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGRvU2VsZWN0aW9uID8gdGhpcy5nZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpIDogdGhpcy5nZXRBY3RpdmVGb2N1c2VkSXRlbUluZGV4KCk7XHJcbiAgICAgICAgbGV0IG5ld0luZGV4ID0gMDtcclxuICAgICAgICBuZXdJbmRleCA9IGluZGV4ICsgTWF0aC5yb3VuZCh0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdE9yRm9jdXNSb3dCeUluZGV4KG5ld0luZGV4LCBkb1NlbGVjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0byBlbmQgb2YgdGhlIHdob2xlIHJlbmRlcmVkIGxpc3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtb3ZlVG9FbmRPZlJlbmRlcmVkSXRlbXMoZG9TZWxlY3Rpb246IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RPckZvY3VzUm93QnlJbmRleCh0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gMSwgZG9TZWxlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWN0aXZhdGUgdGhlIHJlbmRlcmVkIGl0ZW0gYnkgY29uZGl0aW9uLlxyXG4gICAgICogQWN0aXZhdGUgZG9lc24ndCBtZWFuIHNlbGVjdC4gSXQganVzdCBpbmRpY2F0ZXMgd2hpY2ggaXRlbSBpcyBhY3RpdmUgdG8gcmVjZWl2ZWQgbW9yZSBvcGVyYXRpb25zIGVzcGVjaWFsbHkga2V5Ym9hcmQgb3BlcmF0aW9ucy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFjdGl2YXRlUmVuZGVyZWRJdGVtQnlDb25kaXRpb24oY29uZGl0aW9uOiAoaXRlbTogRGF0YVRhYmxlRGF0YUl0ZW0pID0+IGJvb2xlYW4sIGRvU2VsZWN0aW9uOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbih0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGF0YSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KHRoaXMucmVuZGVyZWRJdGVtc1tpXS5pbmRleCwgZG9TZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY3RpdmF0ZSB0aGUgcmVuZGVyZWQgaXRlbSBieSBpbmRleC5cclxuICAgICAqIEFjdGl2YXRlIGRvZXNuJ3QgbWVhbiBzZWxlY3QuIEl0IGp1c3QgaW5kaWNhdGVzIHdoaWNoIGl0ZW0gaXMgYWN0aXZlIHRvIHJlY2VpdmVkIG1vcmUgb3BlcmF0aW9ucyBlc3BlY2lhbGx5IGtleWJvYXJkIG9wZXJhdGlvbnMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGluZGV4OiBudW1iZXIsIGRvU2VsZWN0aW9uOiBib29sZWFuLCBkb0ZvY3VzOiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChpbmRleCA8IDApIHtcclxuICAgICAgICAgICAgaW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGluZGV4ID4gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgICAgaW5kZXggPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkb1NlbGVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KGluZGV4KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXggPSBpbmRleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkSXRlbXMgJiYgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgJiYgdGhpcy5zZWxlY3Rpb25Nb2RlICE9PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uXHJcbiAgICAgICAgICAgICYmIHRoaXMuc2VsZWN0SXRlbVdoZW5OYXZpZ2F0aW5nV2l0aEtleWJvYXJkICYmIGRvU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShudWxsLCB0aGlzLnJlbmRlcmVkSXRlbXNbaW5kZXhdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCB0b3RhbFNjcm9sbGFibGVTcGFjZSA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgY29uc3QgdG90YWxTY3JvbGxhYmxlSXRlbUxlbmd0aCA9IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZW5kZXJlZEl0ZW1TdGFydEluZGV4ID0gdG90YWxTY3JvbGxhYmxlSXRlbUxlbmd0aCAqIHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wIC8gdG90YWxTY3JvbGxhYmxlU3BhY2VcclxuICAgICAgICAgICAgKyB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQ7XHJcblxyXG4gICAgICAgIGxldCBuZXdSZW5kZXJJdGVtU3RhcnRJbmRleCA9IC0xO1xyXG4gICAgICAgIGlmIChpbmRleCA+PSBNYXRoLmZsb29yKGN1cnJlbnRSZW5kZXJlZEl0ZW1TdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0IC0gMSkpIHtcclxuICAgICAgICAgICAgbmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggPSBpbmRleCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCArIDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW5kZXggPD0gY3VycmVudFJlbmRlcmVkSXRlbVN0YXJ0SW5kZXgpIHtcclxuICAgICAgICAgICAgbmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggPSBpbmRleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIG5ld1JlbmRlckl0ZW1TdGFydEluZGV4ID49IDAsIGl0IG1lYW5zIHdoZW4gdGhlIHJlbmRlcmVkIGl0ZW0gaXMgYWN0aXZhdGVkLCBpdCB0cmlnZ2VycyBzY3JvbGxpbmcgaW4gdGhlIGxpc3QuXHJcbiAgICAgICAgaWYgKG5ld1JlbmRlckl0ZW1TdGFydEluZGV4ID49IDApIHtcclxuICAgICAgICAgICAgLy8gRmlndXJlIG91dCB3aGF0J3MgdGhlIG5ldyBzY3JvbGx0b3AgYmFzZWQgb24gbmV3IHJlbmRlcmVkSXRlbVN0YXJ0SW5kZXguXHJcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IE1hdGguZmxvb3IodG90YWxTY3JvbGxhYmxlU3BhY2UgKiAobmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggLyB0b3RhbFNjcm9sbGFibGVJdGVtTGVuZ3RoKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5oYXNMb25nTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgaXQncyBhIGxvbmcgbGlzdCwgd2hpY2ggbWVhbnMgb25lIHBpeGVsIG9mIHNjcm9sbGJhciBtb3ZlbWVudCBjYXVzZXMgbW9yZSB0aGFuIG9uZSBzY3JlZW4gb2YgdGhlIGxpc3Qgc2Nyb2xsaW5nLFxyXG4gICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCB0aGUgdHJ1bmNhdGVkIHJlbmRlcmVkIGl0ZW0gc3RhcnQgaW5kZXguXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0cnVuY2F0ZWRTdGFydEluZGV4ID0gTWF0aC5mbG9vcihzY3JvbGxUb3AgLyB0b3RhbFNjcm9sbGFibGVTcGFjZSAqIHRvdGFsU2Nyb2xsYWJsZUl0ZW1MZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBhY3R1YWwgcG9zaXRpb24gb2YgdGhlIGFjdGl2YXRlZCByZW5kZXJlZCBpdGVtIGxpc3QgY2FuIGJlIG1vcmUgdGhhbiBvbmUgc2NyZWVuIGJlbG93LFxyXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBvZmZzZXQgYmV0d2VlbiB0aGUgbmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggYW5kIHRydW5jYXRlZFN0YXJ0SW5kZXguXHJcbiAgICAgICAgICAgICAgICAvLyBUaGVuIGxhdGVyIHdoZW4gd2UgcmVuZGVyIHRoZSBkYXRhIHRhYmxlIGl0ZW1zIGluIHRoZSB2aWV3IHBvcnQsIHdlIHdpbGwgdXNlIHRoZSBvZmZzZXQgdG8gYWRqdXN0XHJcbiAgICAgICAgICAgICAgICAvLyB0aGUgaXRlbSBsaXN0IHRvIG1ha2Ugc3VyZSB0aGUgYWN0dWFsIGFjdGl2YXRlZCByZW5kZXJlZCBpdGVtIGNhbiBzaG93IHVwIGluIHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQgPSBuZXdSZW5kZXJJdGVtU3RhcnRJbmRleCAtIHRydW5jYXRlZFN0YXJ0SW5kZXg7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV3UmVuZGVySXRlbVN0YXJ0SW5kZXggKyB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQgKyB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnRcclxuICAgICAgICAgICAgICAgICAgICA+IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1TdGFydEluZGV4T2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtU3RhcnRJbmRleE9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFNldCB0aGUgc2Nyb2xsdG9wIGFuZCByZS1jYWxjdWF0ZSB0aGUgdmlldyBwb3J0LlxyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlSXRlbUluVmlld1BvcnQoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZG9Gb2N1cykge1xyXG4gICAgICAgICAgICBpZiAoZG9TZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNSb3dCeUluZGV4KGluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRyeVRvRm9jdXNSb3dCeUluZGV4KGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdyhpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFyaWFFeHBhbmRlZEF0dHJpYnV0ZVZhbHVlKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJlZEl0ZW0udHlwZSA9PT0gRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Hcm91cEhlYWRlcikge1xyXG4gICAgICAgICAgICBjb25zdCBpc0dyb3VwRXhwYW5kZWQgPSB0aGlzLmlzR3JvdXBFeHBhbmRlZChyZW5kZXJlZEl0ZW0uZGF0YSk7XHJcbiAgICAgICAgICAgIGlmIChpc0dyb3VwRXhwYW5kZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNHcm91cEV4cGFuZGVkLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHJlbmRlcmVkSXRlbS50eXBlID09PSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLlRyZWVOb2RlICYmICFyZW5kZXJlZEl0ZW0ubm9kZS5pc0xlYWYpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gKCEhKHJlbmRlcmVkSXRlbS5ub2RlICYmIHJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkKSkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFkZGl0aW9uYWxTY3JlZW5SZWNvcmRlckNvbnRlbnQocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCByZXN1bHQ6IHN0cmluZztcclxuICAgICAgICBzd2l0Y2ggKHJlbmRlcmVkSXRlbS50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5UcmVlTm9kZTpcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1Yk5vZGVDb3VudCA9IHJlbmRlcmVkSXRlbS5ub2RlLmNoaWxkcmVuID8gcmVuZGVyZWRJdGVtLm5vZGUuY2hpbGRyZW4ubGVuZ3RoIDogMDtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN1Yk5vZGVDb3VudCA9PT0gMSA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5vbmVTdWJOb2RlSW5UcmVlTm9kZVxyXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLm5TdWJOb2Rlc0luVHJlZU5vZGUuZm9ybWF0KHN1Yk5vZGVDb3VudCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBEYXRhVGFibGVSZW5kZXJlZEl0ZW1UeXBlLkdyb3VwSGVhZGVyOlxyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBJdGVtQ291bnQgPSB0aGlzLmdyb3VwS2V5c1tyZW5kZXJlZEl0ZW0uZGF0YV0ubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZ3JvdXBJdGVtQ291bnQgPT09IDEgPyB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRGF0YVRhYmxlLmFyaWEubGFiZWwub25lSXRlbUluR3JvdXBcclxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC5uSXRlbXNJbkdyb3VwLmZvcm1hdChncm91cEl0ZW1Db3VudCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRWRpdGFibGVEYXRhQ2hhbmdlZChyZW5kZXJlZEl0ZW06IERhdGFUYWJsZVJlbmRlcmVkSXRlbSwgZmllbGQ6IHN0cmluZykge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBlZGl0YWJsZURhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+cmVuZGVyZWRJdGVtLmRhdGE7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWVkaXRhYmxlRGF0YUl0ZW0uaXNOZXdSb3cgJiYgdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQuYWRkZWRJdGVtcy5pbmRleE9mKGVkaXRhYmxlRGF0YUl0ZW0uY29udGVudCkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1cGRhdGVkSXRlbUluZGV4ID0gdGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQudXBkYXRlZEl0ZW1zLmluZGV4T2YoZWRpdGFibGVEYXRhSXRlbS5jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkSXRlbUluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0LnVwZGF0ZWRJdGVtcy5zcGxpY2UodXBkYXRlZEl0ZW1JbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsaWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBlZGl0YWJsZURhdGFJdGVtLnZhbGlkYXRpb25BbGVydHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzW3Byb3BlcnR5XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBlZGl0YWJsZURhdGFJdGVtLnZhbGlkYXRpb25BbGVydHNbcHJvcGVydHldLnZhbGlkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRhYmxlRGF0YUNoYW5nZVNldC51cGRhdGVkSXRlbXMucHVzaChlZGl0YWJsZURhdGFJdGVtLmNvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VzZXRVcGRhdGVkLmVtaXQodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlc2V0RWRpdGFibGVEYXRhQ2hhbmdlc2V0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZWRpdGFibGVEYXRhQ2hhbmdlU2V0ID0ge1xyXG4gICAgICAgICAgICBhZGRlZEl0ZW1zOiBbXSxcclxuICAgICAgICAgICAgdXBkYXRlZEl0ZW1zOiBbXSxcclxuICAgICAgICAgICAgZGVsZXRlZEl0ZW1zOiBbXVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VzZXRVcGRhdGVkLmVtaXQodGhpcy5lZGl0YWJsZURhdGFDaGFuZ2VTZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvblZhbGlkYXRpb25BbGVydEhhbmRsZXIocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0sIGZpZWxkOiBzdHJpbmcsIGFsZXJ0OiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBlZGl0YWJsZURhdGFJdGVtID0gPEVkaXRhYmxlRGF0YUl0ZW0+cmVuZGVyZWRJdGVtLmRhdGE7XHJcbiAgICAgICAgZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzW2ZpZWxkXSA9IGFsZXJ0O1xyXG5cclxuICAgICAgICByZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdC5sZW5ndGggPSAwO1xyXG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uZmllbGQgJiYgZWRpdGFibGVEYXRhSXRlbS52YWxpZGF0aW9uQWxlcnRzW2NvbHVtbi5maWVsZF0gJiYgIWNvbHVtbi5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgIHJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0LnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4uaGVhZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0OiBlZGl0YWJsZURhdGFJdGVtLnZhbGlkYXRpb25BbGVydHNbY29sdW1uLmZpZWxkXVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBoYXMgdmFsaWRhdGlvbiBlcnJvciBpZiB0aGVyZSBhcmUgYW55IHZhbGlkYXRpb24gYWxlcnRzXHJcbiAgICBwdWJsaWMgaGFzVmFsaWRhdGlvbkVycm9yKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0Lmxlbmd0aCA+IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJvbGVBdHRyaWJ1dGVGb3JUcmVlVGFibGVSb3cocmVuZGVyZWRJdGVtOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0pOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFUYWJsZUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldFJvbGVBdHRyaWJ1dGVGb3JUcmVlVGFibGVSb3cocmVuZGVyZWRJdGVtLCB0aGlzLnNob3dIZWFkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRSb2xlQXR0cmlidXRlRm9yVGFibGVSb3dDZWxsKHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRSb2xlQXR0cmlidXRlRm9yVGFibGVSb3dDZWxsKHJlbmRlcmVkSXRlbSwgdGhpcy5zaG93SGVhZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0QXJpYVNvcnRBdHRyaWJ1dGVWYWx1ZShjb2x1bW46IERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVRhYmxlQWNjZXNzaWJpbGl0eU1hbmFnZXIuZ2V0QXJpYVNvcnRBdHRyaWJ1dGVWYWx1ZShjb2x1bW4pO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhclNlbGVjdGlvbihrZWVwSGlnaGxpZ2h0RnJvbVJvdz86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSBEYXRhVGFibGVDb21wb25lbnQuc2VsZWN0aW9uTW9kZU11bHRpcGxlT3B0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gW107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFrZWVwSGlnaGxpZ2h0RnJvbVJvdykge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUhpZ2hsaWdodEZyb21Sb3coKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQERlYm91bmNlKClcclxuICAgIHB1YmxpYyBjaGVja0lzVGFibGVSZW5kZXJlZE9uUGhvbmVEb3duV2l0aE1pbkhlaWdodChzaG91bGRFbWl0PzogYm9vbGVhbiwgZm9yY2VMYXlvdXQ/OiBib29sZWFuKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuRGF0YVRhYmxlUmVzcG9uc2l2ZVdpbmRvd01hbmFnZXJcclxuICAgICAgICAgICAgLmNoZWNrSXNUYWJsZVJlbmRlcmVkT25QaG9uZURvd25XaXRoTWluSGVpZ2h0KHRoaXMuaGVhZGVyVGFibGVFbGVtZW50LCB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRW1pdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUYWJsZVJlbmRlcmVkV2l0aE1pbkhlaWdodFBob25lRG93bi5lbWl0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChmb3JjZUxheW91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25MYXlvdXRDaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvdWxkRW1pdCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzVGFibGVSZW5kZXJlZFdpdGhNaW5IZWlnaHRQaG9uZURvd24uZW1pdChmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZm9yY2VMYXlvdXQpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkxheW91dENoYW5nZWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVtb3ZlSGlnaGxpZ2h0RnJvbVJvdygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KC0xKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmF2aWdhdGVCeVBhdGgocGF0aFNlY3Rpb25zOiBzdHJpbmdbXSxcclxuICAgICAgICBnZXROb2RlTGFiZWxIYW5kbGVyOiAobm9kZTogVHJlZU5vZGVEYXRhSXRlbSkgPT4gc3RyaW5nLFxyXG4gICAgICAgIG9uVGFza0ZpbmlzaGVkSGFuZGxlcj86IChmb3VuZDogYm9vbGVhbikgPT4gdm9pZCxcclxuICAgICAgICBpc05vZGVMb2FkaW5nSGFuZGxlcj86IChub2RlOiBUcmVlTm9kZURhdGFJdGVtKSA9PiBib29sZWFuLFxyXG4gICAgICAgIHRpbWVvdXQgPSA1MDAwLFxyXG4gICAgICAgIG9ubHlUcmlnZ2VyU2VsZWN0aW9uRm9yTGFzdE5vZGU/OiBib29sZWFuLCBtYXRjaEZpcnN0QUZldz86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sgJiYgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suaXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm9kZSBuYXZpZ2F0aW9uIGlzIGluIHByb2dyZXNzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sgPSB7XHJcbiAgICAgICAgICAgIHBhdGhTZWN0aW9uczogcGF0aFNlY3Rpb25zLFxyXG4gICAgICAgICAgICBpc1J1bm5pbmc6IHRydWUsXHJcbiAgICAgICAgICAgIGN1cnJlbnRQYXRoU2VjdGlvbkluZGV4OiAwLFxyXG4gICAgICAgICAgICBjdXJyZW50UmVuZGVyZWRJdGVtSW5kZXg6IDAsXHJcbiAgICAgICAgICAgIG9uVGFza0ZpbmlzaGVkOiBvblRhc2tGaW5pc2hlZEhhbmRsZXIsXHJcbiAgICAgICAgICAgIGN1cnJlbnRQYXRoU2VjdGlvblN0YXJ0VGltZTogbmV3IERhdGUoKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuaGFuZGxlUGF0aE5hdmlnYXRpb24oXHJcbiAgICAgICAgICAgIGdldE5vZGVMYWJlbEhhbmRsZXIsXHJcbiAgICAgICAgICAgIGlzTm9kZUxvYWRpbmdIYW5kbGVyLFxyXG4gICAgICAgICAgICB0aW1lb3V0LFxyXG4gICAgICAgICAgICBvbmx5VHJpZ2dlclNlbGVjdGlvbkZvckxhc3ROb2RlLFxyXG4gICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICBtYXRjaEZpcnN0QUZldyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEFsbEl0ZW1DaGVja0JveEFyaWFMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNob3VsZEFsbEl0ZW1DaGVja0JveENoZWNrZWQoKSA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5EYXRhVGFibGUuYXJpYS5sYWJlbC51bnNlbGVjdEFsbEl0ZW1zXHJcbiAgICAgICAgICAgIDogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLnNlbGVjdEFsbEl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRJbml0aWFsSG9zdENsYXNzZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluaXRpYWxIb3N0Q2xhc3NlcygpLmNvbmNhdChbXHJcbiAgICAgICAgICAgICdzbWUtZGF0YS10YWJsZSdcclxuICAgICAgICBdKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVBhdGhOYXZpZ2F0aW9uKGdldE5vZGVMYWJlbEhhbmRsZXI6IChub2RlOiBUcmVlTm9kZURhdGFJdGVtKSA9PiBzdHJpbmcsXHJcbiAgICAgICAgaXNOb2RlTG9hZGluZ0hhbmRsZXI/OiAobm9kZTogVHJlZU5vZGVEYXRhSXRlbSkgPT4gYm9vbGVhbixcclxuICAgICAgICB0aW1lb3V0PzogbnVtYmVyLCBvbmx5VHJpZ2dlclNlbGVjdGlvbkZvckxhc3ROb2RlPzogYm9vbGVhbixcclxuICAgICAgICBsYXN0Rm91bmROb2RlPzogRGF0YVRhYmxlUmVuZGVyZWRJdGVtLCBtYXRjaEZpcnN0QUZldz86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2hvdWxkQ29udGludWUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGxldCBmb3VuZE5vZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGxldCBuZWFyTWF0Y2hOb2RlOiBEYXRhVGFibGVSZW5kZXJlZEl0ZW0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4IDwgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sucGF0aFNlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UmVuZGVyZWRJdGVtSW5kZXg7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQ29udGludWUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBnZXROb2RlTGFiZWxIYW5kbGVyKHRoaXMucmVuZGVyZWRJdGVtc1tpXS5ub2RlKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwgPT09XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5wYXRoU2VjdGlvbnNbdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uSW5kZXhdLnRvTG9jYWxlTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUuZXhwYW5kZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25JbmRleCA8IHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLnBhdGhTZWN0aW9ucy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlja1RyZWVUb2dnbGUoZXZlbnQsIHRoaXMucmVuZGVyZWRJdGVtc1tpXSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE5vZGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb25seVRyaWdnZXJTZWxlY3Rpb25Gb3JMYXN0Tm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KGksIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RGb3VuZE5vZGUgPSB0aGlzLnJlbmRlcmVkSXRlbXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4ID09PSB0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5wYXRoU2VjdGlvbnMubGVuZ3RoIC0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmlzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbiAhPT0gdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLm5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKG51bGwsIHRoaXMucmVuZGVyZWRJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsU2VsZWN0ZWRJdGVtSW50b1ZpZXcodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLm9uVGFza0ZpbmlzaGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLm9uVGFza0ZpbmlzaGVkKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRDb250aW51ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOb2RlTG9hZGluZ0hhbmRsZXIgfHwgIWlzTm9kZUxvYWRpbmdIYW5kbGVyKHRoaXMucmVuZGVyZWRJdGVtc1tpXS5ub2RlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRQYXRoU2VjdGlvbkluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFJlbmRlcmVkSXRlbUluZGV4ID0gaSArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uU3RhcnRUaW1lID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmVhck1hdGNoTm9kZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLnBhdGhTZWN0aW9uc1t0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UGF0aFNlY3Rpb25JbmRleF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYWJlbC5pbmRleE9mKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLnBhdGhTZWN0aW9uc1tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uSW5kZXhdLnRvTG9jYWxlTG93ZXJDYXNlKCkpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVhck1hdGNoTm9kZSA9IHRoaXMucmVuZGVyZWRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZU5hdmlnYXRpbmdUYXNrLmN1cnJlbnRSZW5kZXJlZEl0ZW1JbmRleCA+IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMucmVuZGVyZWRJdGVtc1tpXS5kZXB0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09IHRoaXMucmVuZGVyZWRJdGVtc1t0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5jdXJyZW50UmVuZGVyZWRJdGVtSW5kZXggLSAxXS5kZXB0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZENvbnRpbnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kTm9kZSAmJiBub3cuZ2V0VGltZSgpIC0gdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suY3VycmVudFBhdGhTZWN0aW9uU3RhcnRUaW1lLmdldFRpbWUoKSA+IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suaXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGVOYXZpZ2F0aW5nVGFzay5vblRhc2tGaW5pc2hlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sub25UYXNrRmluaXNoZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lYXJNYXRjaE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0obnVsbCwgbmVhck1hdGNoTm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxTZWxlY3RlZEl0ZW1JbnRvVmlldyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGFzdEZvdW5kTm9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShudWxsLCBsYXN0Rm91bmROb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFNlbGVjdGVkSXRlbUludG9WaWV3KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVQYXRoTmF2aWdhdGlvbihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5vZGVMYWJlbEhhbmRsZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05vZGVMb2FkaW5nSGFuZGxlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5VHJpZ2dlclNlbGVjdGlvbkZvckxhc3ROb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEZvdW5kTm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoRmlyc3RBRmV3KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIDIwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplVUkoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy50ZW1wUm93RWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29tcG9uZW50SW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVySXRlbXMoZmFsc2UsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzb3J0SXRlbXMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtcyAmJiB0aGlzLnNvcnRDb2x1bW4pIHtcclxuICAgICAgICAgICAgY29uc3QgY29tcGFyZUZ1bmN0aW9uID0gdGhpcy5zb3J0Q29sdW1uLnNvcnRhYmxlID09PSAnY3VzdG9tJyA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNvcnRDb2x1bW4uY29tcGFyZUZ1bmN0aW9uLmJpbmQodGhpcykgOiB0aGlzLmRlZmF1bHRTb3J0Q29tcGFyZUZ1bmN0aW9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNvcnREaXJlY3Rpb24gPSB0aGlzLnNvcnRDb2x1bW4uc29ydE1vZGUgPT09IERhdGFUYWJsZVNvcnRNb2RlLkFzY2VuZCA/IDEgOiAtMTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5ncm91cENvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVkaXRhYmxlTmV3Um93UmVuZGVyZWRJdGVtID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVkaXRhYmxlICYmIHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlZEl0ZW0gPSB0aGlzLnJlbmRlcmVkSXRlbXMubGFzdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlZEl0ZW0uZGF0YS5pc05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZU5ld1Jvd1JlbmRlcmVkSXRlbSA9IHJlbmRlcmVkSXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnNwbGljZSh0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gMSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBzaG91bGRGYWxsQmFja1RvRGVmYXVsdFNvcnQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxhenlMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbHJlYWR5TG9hZGVkQWxsRGF0YSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVuZGVyZWRJdGVtc1tpXSB8fCAhdGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5TG9hZGVkQWxsRGF0YSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvcnRDb2x1bW4gPT09IHRoaXMucHJldmlvdXNTb3J0Q29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSB0aGlzLnJlbmRlcmVkSXRlbXMucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbHJlYWR5TG9hZGVkQWxsRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc1tpXSA9IHsgaW5kZXg6IGksIGRhdGE6IHVuZGVmaW5lZCwgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Ob3JtYWwgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEZhbGxCYWNrVG9EZWZhdWx0U29ydCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5kb0N1c3RvbVNvcnQuZW1pdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBzb3J0RGlyZWN0aW9uLCBmaWVsZDogdGhpcy5zb3J0Q29sdW1uLmZpZWxkLCBmYWxsQmFja1RvRGVmYXVsdFNvcnQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkRmFsbEJhY2tUb0RlZmF1bHRTb3J0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRmFsbEJhY2tUb0RlZmF1bHRTb3J0IHx8IHRoaXMuZG9DdXN0b21Tb3J0Lm9ic2VydmVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZWRpdGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IHRoaXMucmVuZGVyZWRJdGVtcy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gKiBjb21wYXJlRnVuY3Rpb24oYS5kYXRhLCBiLmRhdGEsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IHRoaXMucmVuZGVyZWRJdGVtcy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gKiBjb21wYXJlRnVuY3Rpb24oYS5kYXRhLmNvbnRlbnQsIGIuZGF0YS5jb250ZW50LCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgaW4gXCJlbHNlXCIgYmxvY2sgaGFuZGxlcyB0aGUgc29ydCBpbiB0aGUgdHJlZSBub2Rlcy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQgc29ydHMgdGhlIHRyZWUgbm9kZXMgb25seSBpbiBpdHMgb3duIHRyZWUgbGV2ZWwuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgbm9kZXMgaGF2ZSBzdWIgbm9kZXMgYW5kIG90aGVyIG5vZGVzIGRvbid0IGhhdmUgc3ViIG5vZGVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgcHV0IHRoZSBub2RlcyB3aXRoIHN1YiBub2RlcyBpbiBmcm9udCBvZiB0aGUgbm9kZXMgd2l0aG91dCBzdWIgbm9kZXMuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gW3RoaXMuc2hhZG93VHJlZV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGUgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Tm9kZS5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2goY3VycmVudE5vZGUuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5zcGxpY2Uoc3RhY2subGVuZ3RoIC0gMSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBjdXJyZW50Tm9kZS5jaGlsZHJlbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgY29tcGFyZSByZXN1bHQgYWJvdXQgMSBvciAtMSBpcyByZXZlcnNlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSBpZiBhIGlzIGdyZWF0ZXIgdGhhbiBiLCAxIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZCBvZiAtMS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIGJlY2F1c2UgdGhvc2Ugbm9kZXMgYXJlIHdlbnQgdGhvdWdoIGluIHRoZSBzdGFjayB3aXRoIGlzIEZJRk8sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhlIG9yZGVyIGlzIHJldmVyc2VkLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvcnRDb2x1bW4gPT09IHRoaXMuYWN0dWFsQ29sdW1uc1swXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5kYXRhLmhhc0NoaWxkcmVuICYmICFiLmRhdGEuaGFzQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhLmRhdGEuaGFzQ2hpbGRyZW4gJiYgYi5kYXRhLmhhc0NoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGEuZGF0YS5kYXRhLCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiVmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGIuZGF0YS5kYXRhLCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGJWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBiVmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtc29ydERpcmVjdGlvbiAqIGNvbXBhcmVGdW5jdGlvbihhLmRhdGEuZGF0YSwgYi5kYXRhLmRhdGEsIHRoaXMuc29ydENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChlZGl0YWJsZU5ld1Jvd1JlbmRlcmVkSXRlbSAmJiB0aGlzLmVkaXRhYmxlQXV0b05ld1Jvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcy5wdXNoKGVkaXRhYmxlTmV3Um93UmVuZGVyZWRJdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBoYW5kbGVzIHRoZSBzb3J0aW5nIHdoZW4gZ3JvdXBpbmcgaXMgZW5hYmxlZC5cclxuICAgICAgICAgICAgICAgIC8vIEl0IHNvcnRzIHRoZSBncm91cCBpdGVtcyBpbiBlYWNoIG9mIHRoZSBncm91cC5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFJlbmRlcmVkSXRlbXM6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdID0gW107XHJcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBlZFJlbmRlcmVkSXRlbXM6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLnR5cGUgPT09IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwZWRSZW5kZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVuZGVyZWRJdGVtcyA9IGdyb3VwZWRSZW5kZXJlZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29ydERpcmVjdGlvbiAqIGNvbXBhcmVGdW5jdGlvbihhLmRhdGEsIGIuZGF0YSwgdGhpcy5zb3J0Q29sdW1uLmZpZWxkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbmRlcmVkSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRSZW5kZXJlZEl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWRSZW5kZXJlZEl0ZW1zLnB1c2godGhpcy5yZW5kZXJlZEl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbmRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVuZGVyZWRJdGVtcy5wdXNoKHRoaXMucmVuZGVyZWRJdGVtc1tpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwZWRSZW5kZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlbmRlcmVkSXRlbXMgPSBncm91cGVkUmVuZGVyZWRJdGVtcy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3J0RGlyZWN0aW9uICogY29tcGFyZUZ1bmN0aW9uKGEuZGF0YSwgYi5kYXRhLCB0aGlzLnNvcnRDb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZW5kZXJlZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZFJlbmRlcmVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IHNvcnRlZFJlbmRlcmVkSXRlbXM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlUmVuZGVyZWRJdGVtSW5kZXhCeVNlbGVjdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlZmF1bHRTb3J0Q29tcGFyZUZ1bmN0aW9uKGE6IERhdGFUYWJsZURhdGFJdGVtLCBiOiBEYXRhVGFibGVEYXRhSXRlbSwgZmllbGQ6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XHJcblxyXG4gICAgICAgIGlmICghYSAmJiAhYikge1xyXG4gICAgICAgICAgICByZXN1bHQgPSAwO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoIWEgJiYgYikge1xyXG4gICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoYSAmJiAhYikge1xyXG4gICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgYVZhbHVlID0gdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChhLCBmaWVsZCk7XHJcbiAgICAgICAgICAgIGxldCBiVmFsdWUgPSB0aGlzLnJlc29sdmVPYmplY3RQYXRoKGIsIGZpZWxkKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGFUeXBlID0gdHlwZW9mIGFWYWx1ZTtcclxuICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgICAgICAgICAgYVZhbHVlID0gYVZhbHVlID09PSAwID8gYVZhbHVlIDogKGFWYWx1ZSB8fCBOdW1iZXIuTUlOX1ZBTFVFKTtcclxuICAgICAgICAgICAgICAgIGJWYWx1ZSA9IGJWYWx1ZSA9PT0gMCA/IGJWYWx1ZSA6IChiVmFsdWUgfHwgTnVtYmVyLk1JTl9WQUxVRSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGFWYWx1ZSA+IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFWYWx1ZSA8IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYVZhbHVlID0gYVZhbHVlICYmIGFWYWx1ZS50b1N0cmluZyAmJiBhVmFsdWUudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpIHx8ICcnO1xyXG4gICAgICAgICAgICAgICAgYlZhbHVlID0gYlZhbHVlICYmIGFWYWx1ZS50b1N0cmluZyAmJiBiVmFsdWUudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpIHx8ICcnO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHdlIGRvIG5hdHVyYWwgc29ydCBoZXJlLlxyXG4gICAgICAgICAgICAgICAgLy8gQmFzZWQgb24gc2ltcGxlIHN0cmluZyBjb21wYXJpc29uLCBcImExMDBcIixcImEyMFwiLFwiYTNcIiB3aWxsIGJlIHNvcnRlZCBhcyBcImExMDBcIixcImEyMFwiLFwiYTNcIi5cclxuICAgICAgICAgICAgICAgIC8vIEJ1dCBiYXNlZCBvbiBuYXR1cmFsIHNvcnQsIHRoZXkgd2lsbCBiZSBzb3J0ZWQgYXMgXCJhM1wiLFwiYTIwXCIsXCJhMTAwXCIuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZU5hdHVyYWxTb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNOdW1iZXIgPSAodGV4dDogc3RyaW5nKSA9PiB0ZXh0ID49ICcwJyAmJiB0ZXh0IDw9ICc5JztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCAxLCBmaWd1cmUgb3V0IHRoZSBjb21tb24gcGFydCBvZiAyIHN0cmluZ3MuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBhVmFsdWUubGVuZ3RoICYmIGluZGV4IDwgYlZhbHVlLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVZhbHVlW2luZGV4XSAhPT0gYlZhbHVlW2luZGV4XSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgMiwgaWYgdGhlIHJlc3QgcGFydCBvZiBlYWNoIHN0cmluZyBzdGFydHMgd2l0aCBhIG51bWJlciwgcGFyc2UgdGhlIHJlc3QgcGFydCBpbnRvIGZsb2F0LlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlRmxvYXQgZnVuY3Rpb24gaXMgdmVyeSBkdXJhYmxlLCBpdCBjYW4gcGFyc2UgXCIxLjVhYmNcIiBhcyBcIjEuNVwiIHNvIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgdGhhdCB0aGUgcmVzdCBwYXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHN0cmluZyBpcyBtaXhlZCB3aXRoIG51bWJlcnMgYW5kIGxldHRlcnMuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3QgcGFydCBvZiBlYWNoIHN0cmluZyBkb2Vzbid0IHN0YXJ0IHdpdGggYSBudW1iZXIsIHRoZW4gZG9uJ3QgZG8gbmF0dXJhbCBzb3J0LCBqdXN0IGRvIG5vcm1hbCBzdHJpbmcgc29ydC5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNOdW1iZXIoYVZhbHVlW2luZGV4XSkgJiYgaXNOdW1iZXIoYlZhbHVlW2luZGV4XSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYU51bWJlciA9IHBhcnNlRmxvYXQoYVZhbHVlLnN1YnN0cihpbmRleCwgYVZhbHVlLmxlbmd0aCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiTnVtYmVyID0gcGFyc2VGbG9hdChiVmFsdWUuc3Vic3RyKGluZGV4LCBiVmFsdWUubGVuZ3RoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhTnVtYmVyID4gYk51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhTnVtYmVyIDwgYk51bWJlcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVZhbHVlID4gYlZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFWYWx1ZSA8IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhVmFsdWUgPiBiVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFWYWx1ZSA8IGJWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhc1ZlcnRpY2FsT3ZlcmZsb3coKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQgPiB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhbGlnblNjcm9sbEJhcigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBoYXNWZXJ0aWNhbE92ZXJmbG93ID0gdGhpcy5oYXNWZXJ0aWNhbE92ZXJmbG93KCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVNjcm9sbGJhcldpZHRoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChoYXNWZXJ0aWNhbE92ZXJmbG93ICE9PSB0aGlzLmN1cnJlbnRIYXNWZXJ0aWNhbE92ZXJmbG93ICYmIHRoaXMuaGVhZGVyVGFibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChoYXNWZXJ0aWNhbE92ZXJmbG93KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gJ2NhbGMoMTAwJSAtICcgKyB0aGlzLmNhbGN1bGF0ZWRTY3JvbGxiYXJXaWR0aCArICdweCknO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnJpZ2h0ID0gdGhpcy5jYWxjdWxhdGVkU2Nyb2xsYmFyV2lkdGggKyAncHgnO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5yaWdodCA9ICcwcHgnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VycmVudEhhc1ZlcnRpY2FsT3ZlcmZsb3cgPSBoYXNWZXJ0aWNhbE92ZXJmbG93O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlU2Nyb2xsYmFyV2lkdGgoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoc2Nyb2xsRGl2KTtcclxuICAgICAgICBzY3JvbGxEaXYuY2xhc3NOYW1lID0gJ3NtZS1sYXlvdXQtYWJzb2x1dGUgc21lLXBvc2l0aW9uLXN0cmV0Y2ggc21lLWFycmFuZ2Utb3ZlcmZsb3ctc2Nyb2xsJztcclxuICAgICAgICBzY3JvbGxEaXYuc3R5bGUudG9wID0gJy05OTk5cHgnO1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gc2Nyb2xsRGl2Lm9mZnNldFdpZHRoIC0gc2Nyb2xsRGl2LmNsaWVudFdpZHRoO1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50LnJlbW92ZUNoaWxkKHNjcm9sbERpdik7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVkU2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxiYXJXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KHByZXZlbnRTY3JvbGxpbmc/OiBib29sZWFuLCBmb3JjZVVwZGF0ZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkICYmIHRoaXMucmVuZGVyZWRJdGVtcykge1xyXG4gICAgICAgICAgICAvLyBTY3JvbGwgY29udGFpbmVyIGlzIHRoZSBkaXYgdG8gcmVuZGVyIHRoZSB2aWV3IHBvcnQgb2YgdGhlIGRhdGEgdGFibGUgYW5kIHRvIHByb3ZpZGUgdGhlIHNjcm9sbCBiYXIuXHJcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lckVsZW1lbnQgPSB0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZXMgaG93IG1hbnkgaXRlbXMgY2FuIGJlIHJlbmRlcmVkIGluIHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCA9IHRoaXMuc2Nyb2xsYWJsZVxyXG4gICAgICAgICAgICAgICAgPyBNYXRoLm1pbih0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoLCBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCAvIHRoaXMucm93SGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgOiB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0U2Nyb2xsUGl4ZWxzID0gdGhpcy5kZWZhdWx0U2Nyb2xsUGVyY2VudGFnZSAqIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U2Nyb2xsUGl4ZWxzID0gTWF0aC5mbG9vcihkZWZhdWx0U2Nyb2xsUGl4ZWxzIC8gdGhpcy5yb3dIZWlnaHQpICogdGhpcy5yb3dIZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gMDtcclxuICAgICAgICAgICAgbGV0IGlzQXRMYXN0U2NyZWVuID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVuZGVyZWRJdGVtU3RhcnQgPSAwO1xyXG4gICAgICAgICAgICBsZXQgcmVuZGVyZWRJdGVtRW5kID0gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aDtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlVUlWaXJ0dWFsaXphdGlvbikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzTG9uZ0xpc3QgJiYgcHJldmVudFNjcm9sbGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNjcm9sbFRvcCA9IChzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodCAtIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMuY3VycmVudFN0YXJ0SW5kZXhPZkl0ZW1JblZpZXdQb3J0IC8gKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSB0aGlzLmN1cnJlbnRTdGFydEluZGV4T2ZJdGVtSW5WaWV3UG9ydDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5kYXRhU2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGVzIHRoZSB3aGljaCBpdGVtIGlzIHRoZSBzdGFydGluZyBpdGVtIGluIHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGlkZWEgaGVyZSBpcyB0byBjYWxjdWxhdGUgdGhlIHBlcmNlbnRhZ2Ugb2YgaG93IGZhciB0aGUgc2Nyb2xsYmFyIG1vdmVkLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkaXN0YW5jZSB0aGUgc2Nyb2xsYmFyIGNhbiBtb3ZlIGlzIHRoZSB0b3RhbCBoZWlnaHQgb2YgdGhlIHNjcm9sbGJhciBtaW51cyB0aGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydC5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5mbG9vcih0aGlzLmRhdGFTY3JvbGxUb3ApICE9PSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFTY3JvbGxUb3AgPSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY3VyYXRlU3RhcnRJbmRleCA9ICh0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoIC0gdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0KSAqIHRoaXMuZGF0YVNjcm9sbFRvcFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvIChzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodCAtIHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gTWF0aC5mbG9vcihhY2N1cmF0ZVN0YXJ0SW5kZXggKyB0aGlzLnJlbmRlcmVkSXRlbVN0YXJ0SW5kZXhPZmZzZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0ID4gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNBdExhc3RTY3JlZW4gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGFydEluZGV4T2ZJdGVtSW5WaWV3UG9ydCA9IHN0YXJ0SW5kZXg7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxpc3QgaXMgc2hvcnQgYW5kIG5vIG5lZWQgdG8gaGF2ZSBzY3JvbGwgYmFyLCBqdXN0IHNpbXBseSBzZXQgdGhlIHN0YXJ0IGluZGV4IHRvIDAuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxIZWlnaHQgPD0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZW5kZXJlZEl0ZW1TdGFydCA9IHN0YXJ0SW5kZXggLSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgKiB0aGlzLmJ1ZmZlclJvd1JhdGU7XHJcbiAgICAgICAgICAgICAgICByZW5kZXJlZEl0ZW1FbmQgPSBNYXRoLmNlaWwoc3RhcnRJbmRleCArIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0ICogdGhpcy5idWZmZXJSb3dSYXRlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHNob3VsZExhenlMb2FkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5sYXp5TG9hZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBsb2dpYyBjYWxjdWxhdGVzIHdoaWNoIHBhcnQgb2YgZGF0YSBzaG91bGQgYmUgbG9hZGVkIHdpdGggdGhlIGxhenkgbG9hZGluZyBldmVudC5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGxhenlMb2FkU3RhcnQgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHJlbmRlcmVkSXRlbVN0YXJ0KSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgYWN0dWFsTGF6eUxvYWRTdGFydCA9IGxhenlMb2FkU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXp5TG9hZExlbmd0aCA9IE1hdGgubWluKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsIHJlbmRlcmVkSXRlbUVuZCkgLSBsYXp5TG9hZFN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgbGV0IGFjdHVhbExhenlMb2FkTGVuZ3RoID0gbGF6eUxvYWRMZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGxhenlMb2FkU3RhcnQ7IGkgPCBsYXp5TG9hZFN0YXJ0ICsgbGF6eUxvYWRMZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlckl0ZW1GbGFnID0gKCF0aGlzLnJlbmRlcmVkSXRlbXNbaV0gfHwgIXRoaXMucmVuZGVyZWRJdGVtc1tpXS5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZExhenlMb2FkICYmIHJlbmRlckl0ZW1GbGFnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZExhenlMb2FkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsTGF6eUxvYWRTdGFydCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRMYXp5TG9hZCAmJiAhcmVuZGVySXRlbUZsYWcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbExhenlMb2FkTGVuZ3RoID0gaSArIDEgLSBhY3R1YWxMYXp5TG9hZFN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhY3R1YWxMYXp5TG9hZExlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3VsZExhenlMb2FkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZExhenlMb2FkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvcnRPcmRlciA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydENvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc29ydENvbHVtbi5zb3J0TW9kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydE9yZGVyID0gMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRGF0YVRhYmxlU29ydE1vZGUuRGVzY2VuZDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0T3JkZXIgPSAtMTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydE9yZGVyID0gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGF6eUxvYWRFdmVudCA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGFjdHVhbExhenlMb2FkU3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDogYWN0dWFsTGF6eUxvYWRMZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaExvYWRpbmdEYXRhOiAoaXRlbXMsIGFsbEl0ZW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbXMgJiYgaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNbYWN0dWFsTGF6eUxvYWRTdGFydCArIGldID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGFjdHVhbExhenlMb2FkU3RhcnQgKyBpLCBkYXRhOiBpdGVtc1tpXSwgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Ob3JtYWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVJdGVtSW5WaWV3UG9ydCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBzZXQgaW50ZXJuYWwgaXRlbXMgc28gdGhhdCB3ZSBjYW4gc2VsZWN0IGFsbCwgYW5kIHNvIHdlIGNhbiBkbyBmaWx0ZXJpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsSXRlbXMgPSBhbGxJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NGaWx0ZXIoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yY2UgdGhlIHJlZnJlc2ggdG8gbWFrZSB0aGUgY2hhbmdlcyByZWZsZWN0IG9uIFVJLCB3aWxsIG5vdCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgYWZ0ZXIgZmlyc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkLCB0aGUgc2hvdWxkTGF6eUxvYWQgd2lsbCBiZSBzZXQgdG8gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRPcmRlcjogc29ydE9yZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0RmllbGQ6IHRoaXMuc29ydENvbHVtbiA/IHRoaXMuc29ydENvbHVtbi5maWVsZCA6IHRoaXMuYWN0dWFsQ29sdW1ucyA/IHRoaXMuYWN0dWFsQ29sdW1uc1swXS5maWVsZCA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF6eUxvYWRpbmdEYXRhLmVtaXQobGF6eUxvYWRFdmVudCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxMYXp5TG9hZExlbmd0aCA+PSB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQgKiB0aGlzLmJ1ZmZlclJvd1JhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0J1c3kgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFzaG91bGRMYXp5TG9hZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgZGlzcGxheWluZyBsaXN0IGl0ZW0gaW4gdGhlIHZpZXcgcG9ydCBpcyBtb3ZpbmcgZHVlIHRvIHNjcm9sbCBiYXIgaXMgbW92aW5nLFxyXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHRvcCBvZiB0aGUgc2Nyb2xsIGRhdGEgZWxlbWVudC5cclxuICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBpdGVtIG9mIHRoZSBzY3JvbGwgZGF0YSBlbGVtZW50IHdvbid0IGFsd2F5cyBhbGlnaCB0byB0aGUgdG9wIG9mIHRoZSB2aWV3IHBvcnQuXHJcbiAgICAgICAgICAgICAgICAvLyBTbyBoZXJlIHdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBpdGVtLlxyXG4gICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wICUgdGhpcy5yb3dIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gTm90ZTogd2hlbiB0aGUgZGlzcGxheSBpdGVtIGxpc3QgaXMgZXZlbiBsb25nZXIgdGhhbiB0aGUgc2Nyb2xsIGNvbnRhaW5lciBoZWlnaHQgKiByb3cgaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgLy8gaXQgbWVhbnMgd2hlbiB3ZSBtb3ZlIDEgcGl4ZWwgb2YgdGhlIHNjcm9sbCBiYXIsIHRoZSBkYXRhIHRhYmxlIHdpbGwgbW92ZSBieSBhdCBsZWFzdCBvbmUgaXRlbS5cclxuICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2Ugd29uJ3QgbmVlZCB0byBoYW5kbGUgb2Zmc2V0IHNpbmNlIHdlIGRvbid0IGhhdmUgYSBjaGFuY2UgdG8gc2hvdyBcImhhbGYgZGF0YSB0YWJsZSBpdGVtXCJcclxuICAgICAgICAgICAgICAgIC8vIGF0IHRoZSB0b3AgYm9yZGVyIG9mIHRoZSBzY3JvbGwgY29udGFpbmVyIGJ5IG1vdmluZyB0aGUgc2Nyb2xsIGJhciB2ZXJ5IGxpdHRsZS5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoID4gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQgKiB0aGlzLnJvd0hlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVVSVZpcnR1YWxpemF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5SXRlbXNUb3AgPSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbFRvcCAtIG9mZnNldDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtSW5kZXggPSB0aGlzLmdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRlbUluZGV4ID4gc3RhcnRJbmRleCArIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCAtIDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2VsZWN0ZWRJdGVtSW5kZXggPCBzdGFydEluZGV4ICsgdGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUl0ZW1zVG9wID0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5zY3JvbGxUb3BcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKHNlbGVjdGVkSXRlbUluZGV4IC0gc3RhcnRJbmRleCAtIHRoaXMucmVuZGVyZWRJdGVtTGVuZ3RoSW5WaWV3UG9ydCArIDEpICogdGhpcy5yb3dIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBzY3JvbGwgYmFyIGlzIG1vdmVkIHRvIHZlcnkgYm90dG9tLCB3ZSBqdXN0IHNpbXBseSBhbGlnbiB0aGUgZGlzcGxheWVkIGRhdGEgdGFibGUgaXRlbXMncyBib3R0b21cclxuICAgICAgICAgICAgICAgICAgICAvLyB0byB0aGUgYm90dG9tIG9mIHRoZSBjb250YWluZXIgdG8gbWFrZSBzdXJlIHRoZSBsYXN0IGRhdGEgdGFibGUgaXRlbSBjYW4gYmUgZGlzcGxheWVkIGNvbXBsZXRlbHkuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3aGVuIHRoZSBsaXN0IGlzIHN1cGVyIGxvbmcgKHJlZmVyIHRvIGhvdyB3ZSBjYWxjdWxhdGUgdGhlIHRvcCBvZmZzZXQgb2YgdGhlIHN1cGVyIGxvbmcgbGlzdCksXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxhc3QgaXRlbSBtYXkgbm90IGJlIHJlbmRlcmVkIGNvbXBsZXRlbHkuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggPiBzY3JvbGxDb250YWluZXJFbGVtZW50Lm9mZnNldEhlaWdodCAqIHRoaXMucm93SGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsVG9wID49XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lckVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQgLSB0aGlzLnJvd0hlaWdodCAvIDJcclxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNBdExhc3RTY3JlZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5SXRlbXNUb3AgPSBzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBNYXRoLmNlaWwodGhpcy5yZW5kZXJlZEl0ZW1MZW5ndGhJblZpZXdQb3J0KSAqIHRoaXMucm93SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxEYXRhU3R5bGVUb3AgPSB0aGlzLmRpc3BsYXlJdGVtc1RvcCArICdweCc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlVXBkYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudEhlaWdodCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsQWJvdmVEYXRhRWxlbWVudChNYXRoLnJvdW5kKHN0YXJ0SW5kZXggLSByZW5kZXJlZEl0ZW1TdGFydCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICgoIXRoaXMuY3VycmVudFJlbmRlcmVkSXRlbUluVmlld1BvcnQgfHwgIXRoaXMucmVuZGVyZWRJdGVtc1tzdGFydEluZGV4XVxyXG4gICAgICAgICAgICAgICAgICAgIHx8ICh0aGlzLnJlbmRlcmVkSXRlbXNbc3RhcnRJbmRleF0uZGF0YSAhPT0gdGhpcy5jdXJyZW50UmVuZGVyZWRJdGVtSW5WaWV3UG9ydC5kYXRhKSlcclxuICAgICAgICAgICAgICAgICAgICB8fCBmb3JjZVVwZGF0ZSB8fCB0aGlzLnNob3dBc1RyZWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBkaXNwbGF5IGRhdGEgYWJvdmUgdGhlIHZpZXcgcG9ydCBhbmQgZGlzcGxheSBkYXRhIGluIGFuZCBiZWxvdyB0aGUgdmlldyBwb3J0LlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHdoZW4gd2UgcHVzaCBuZXcgaXRlbSBpbnRvIHRoZSBhcnJheXMsIHdlIGNyZWF0ZSBhIG5ldyBvYmplY3QgdG8gd3JhcCB0aGUgZGlzcGxheSBpdGVtLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugd2Ugd2FudCB0byBmb3JjZSB0aGUgbmdGb3IgdG8gcmUtcmVuZGVyIGFsbCB0aGUgaXRlbXMgaW5zdGVhZCBvZiBvbmx5IHJlLXJlbmRlciB0aGUgdXBkYXRlZCBvbmVzLlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgbmdGb3Igd2lsbCB0cnkgdG8gYWRqdXN0IERPTSBvcmRlciBvZiB0aG9zZSBpdGVtcyB3aGljaCBtZXNzZXMgdXAgdGhlIHNjcm9sbCBiYXIgcG9zaXRpb24uXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zQWJvdmVWaWV3UG9ydCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc0luQW5kQmVsb3dWaWV3UG9ydCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdWxkU2Nyb2xsID0gdGhpcy5zY3JvbGxhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIChzY3JvbGxDb250YWluZXJFbGVtZW50LnNjcm9sbEhlaWdodCA+IHNjcm9sbENvbnRhaW5lckVsZW1lbnQub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0aGlzLmVkaXRhYmxlIHx8IHRoaXMuYXV0b1Jvd0hlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkU2Nyb2xsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSByZW5kZXJlZEl0ZW1TdGFydDsgaSA8IHN0YXJ0SW5kZXg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBNYXRoLnJvdW5kKGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgc3RhcnRJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UmVuZGVyZWRJdGVtID0gdGhpcy5yZW5kZXJlZEl0ZW1zW2luZGV4XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zQWJvdmVWaWV3UG9ydC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGN1cnJlbnRSZW5kZXJlZEl0ZW0udHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc2hvd0FzVHJlZSA/IGN1cnJlbnRSZW5kZXJlZEl0ZW0ubm9kZS5kYXRhIDogY3VycmVudFJlbmRlcmVkSXRlbS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGN1cnJlbnRSZW5kZXJlZEl0ZW0uZGVwdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDaGlsZHJlbjogY3VycmVudFJlbmRlcmVkSXRlbS5oYXNDaGlsZHJlbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGU6IGN1cnJlbnRSZW5kZXJlZEl0ZW0ubm9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSW5TZXQ6IGN1cnJlbnRSZW5kZXJlZEl0ZW0ucG9zaXRpb25JblNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpemU6IGN1cnJlbnRSZW5kZXJlZEl0ZW0uc2V0U2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQ6IGN1cnJlbnRSZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXNBYm92ZVZpZXdQb3J0LnB1c2goeyBkYXRhOiB7IHBsYWNlaG9sZGVyOiB0cnVlIH0sIHR5cGU6IG51bGwsIGluZGV4OiBudWxsIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IHJlbmRlcmVkSXRlbUVuZDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gTWF0aC5yb3VuZChpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UmVuZGVyZWRJdGVtID0gdGhpcy5yZW5kZXJlZEl0ZW1zW2luZGV4XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc0luQW5kQmVsb3dWaWV3UG9ydC5wdXNoKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBjdXJyZW50UmVuZGVyZWRJdGVtLnR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zaG93QXNUcmVlID8gY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLmRhdGEgOiBjdXJyZW50UmVuZGVyZWRJdGVtLmRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGN1cnJlbnRSZW5kZXJlZEl0ZW0uZGVwdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2hpbGRyZW46IGN1cnJlbnRSZW5kZXJlZEl0ZW0uaGFzQ2hpbGRyZW4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogY3VycmVudFJlbmRlcmVkSXRlbS5ub2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkluU2V0OiBjdXJyZW50UmVuZGVyZWRJdGVtLnBvc2l0aW9uSW5TZXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZTogY3VycmVudFJlbmRlcmVkSXRlbS5zZXRTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQ6IGN1cnJlbnRSZW5kZXJlZEl0ZW0udmFsaWRhdGlvblJlc3VsdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zY3JvbGxhYmxlICYmIHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGggPiB0aGlzLnJlbmRlcmVkSXRlbUxlbmd0aEluVmlld1BvcnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc0luQW5kQmVsb3dWaWV3UG9ydC5wdXNoKHsgZGF0YTogeyBwbGFjZWhvbGRlcjogdHJ1ZSB9LCB0eXBlOiBudWxsLCBpbmRleDogbnVsbCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFJlbmRlcmVkSXRlbUluVmlld1BvcnQgPSB0aGlzLnJlbmRlcmVkSXRlbXNbc3RhcnRJbmRleF07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2Nyb2xsaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQnVzeSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZWRJdGVtc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtc1tpXS5pbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRBcmVhSGFzRm9jdXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhVGFibGVBY2Nlc3NpYmlsaXR5TWFuYWdlci5pc1NtZUZvcm1GaWVsZCg8SFRNTEVsZW1lbnQ+ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QganVtcCBmcm9tIGVkaXRhYmxlIGZvcm0gZmllbGRzIHRvd2FyZHMgdGhlIHJvdyB3aGVuIHJlLWNhbGN1bGF0aW5nIGl0ZW1zXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHJlc2V0IHZhbGlkYXRpb24gZXJyb3JzIG9uIHdpbmRvdyByZXNpemluZ1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4ICE9PSB0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdyh0aGlzLmFjdGl2ZUZvY3VzZWRJdGVtSW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNTZWxlY3RlZFJvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc0ZpbHRlcigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QgPSB0aGlzLmludGVybmFsUXVlcnlFZGl0b3I7XHJcbiAgICAgICAgY29uc3QgaGFzVmFsaWRRdWVyeUVkaXRvciA9ICh2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QgJiYgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzICYmXHJcbiAgICAgICAgICAgIHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50cy5sZW5ndGgpO1xyXG4gICAgICAgIGlmICh0aGlzLmludGVybmFsSXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2xvYmFsRmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nbG9iYWxGaWx0ZXIgaW5zdGFuY2VvZiBTZWFyY2hGb3JtRmllbGRDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWFyY2hGb3JtRmllbGQgPSA8U2VhcmNoRm9ybUZpZWxkQ29tcG9uZW50PnRoaXMuZ2xvYmFsRmlsdGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyS2V5d29yZCA9IHNlYXJjaEZvcm1GaWVsZC52YWx1ZSAmJiBzZWFyY2hGb3JtRmllbGQudmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyS2V5d29yZCA9IHRoaXMuZ2xvYmFsRmlsdGVyWyd2YWx1ZSddID8gdGhpcy5nbG9iYWxGaWx0ZXJbJ3ZhbHVlJ10udG9Mb2NhbGVMb3dlckNhc2UoKS50cmltKCkgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbHRlcktleXdvcmQgJiYgIWhhc1ZhbGlkUXVlcnlFZGl0b3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IHRoaXMuaW50ZXJuYWxJdGVtcy5tYXAoaXRlbSA9PiBpdGVtKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmludGVybmFsSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIEZpcnN0IGZpbHRlciBieSB0aGUgbWFzdGVyIHZpZXcgZmlsdGVycyBpZiBhcHBsaWNhYmxlXHJcbiAgICAgICAgICAgICAgICAvLyBUaGVuIGZpbHRlciBieSB0aGUgY29sdW1uIGZpbHRlcnNcclxuICAgICAgICAgICAgICAgIC8vIE5vdGUgZmlsdGVyIGluc2lkZSB0aGUgY29sdW1uIGZpbHRlcnMgYXJlIGludGVyc2VjdGlvbnNcclxuICAgICAgICAgICAgICAgIC8vIENvbHVtbiBmaWx0ZXJzIG11bHRpcGxlIGNvbWJvYm94IHdpbGwgYmUgdW5pb25cclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmludGVybmFsSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5pbnRlcm5hbEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIERvIHRoZSBkYXRhdGFibGUgb3JpZ2luYWwgZmlsdGVycyBvbmx5IGlmIHVzZWQgaW4gbWFzdGVyIHZpZXcuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQW5kIGhhcyB2YWxpZCBmaWx0ZXJLZXl3b3JkXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyS2V5d29yZCAmJiB0aGlzLmZpbHRlcktleXdvcmQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kICYmIGNvbHVtbi5zZWFyY2hhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChpdGVtLCAodGhpcy5lZGl0YWJsZSA/ICdjb250ZW50LicgOiAnJykgKyBjb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5maWx0ZXJPdmVycmlkaW5nRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29sdW1uLmZpbHRlck92ZXJyaWRpbmdGdW5jdGlvbih2YWx1ZSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhc2VTZW5zaXRpdmVGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50b1N0cmluZygpLmluZGV4T2YodGhpcy5maWx0ZXJLZXl3b3JkKSAhPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmlsdGVyS2V5d29yZCBpcyBlbXB0eVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBvciB0aGlzIGRhdGF0YWJsZSBpcyBub3QgdXNlZCBpbiBtYXN0ZXIgdmlld1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGZvdW5kIGJ5IGRhdGF0YWJsZSBvcmlnaW5hbCBmaWx0ZXIoZnJvbSBtYXN0ZXIgdmlldylcclxuICAgICAgICAgICAgICAgICAgICAvLyBvciBpZiBvcmlnaW5hbCBmaWx0ZXIgaXMgZW1wdHkobm90IGluIG1hc3RlciB2aWV3KVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzVmFsaWRRdWVyeUVkaXRvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyIGJ5IHF1ZXJ5IGVkaXRvciBpZiBhcHBsaWVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRoaXMucXVlcnlFZGl0b3JGaWx0ZXJNYWluKHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdCwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgc2F0aXNmeSBib3RoIG9yaWdpbmFsIGZpbHRlcnMgYW5kIHRoZSBxdWVyeSBlZGl0b3IgZmlsdGVyc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVBcmlhQXR0cmlidXRlcygpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0NvbXBvbmVudEluaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlQXJpYUxhYmVsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhvc3RFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdGhpcy50YWJsZUFyaWFMYWJlbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMudGFibGVBcmlhTGFiZWxsZWRCeSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JywgdGhpcy50YWJsZUFyaWFMYWJlbGxlZEJ5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSB8fCB0aGlzLnNlbGVjdGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZShcclxuICAgICAgICAgICAgICAgICdhcmlhLW11bHRpc2VsZWN0YWJsZScsXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdtdWx0aXBsZScpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVRyZWVOb2RlKG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0sIGRlcHRoOiBudW1iZXIsIHBhcmVudFNoYWRvd1RyZWVOb2RlOiBhbnksIHBvc2l0aW9uSW5TZXQ6IG51bWJlciwgc2V0U2l6ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVtZW1iZXJUcmVlTm9kZVRvZ2dsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMuZ2V0VHJlZU5vZGVEYXRhSWRlbnRpdHkobm9kZSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRyZWVUb2dnbGVTdGF0dXMuaGFzT3duUHJvcGVydHkoaWRlbnRpdHkpKSB7XHJcbiAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gdGhpcy50cmVlVG9nZ2xlU3RhdHVzW2lkZW50aXR5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaGFzQ2hpbGRyZW4gPSBub2RlLmNhbkV4cGFuZCB8fCBub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMDtcclxuICAgICAgICBub2RlLmlzTGVhZiA9ICFoYXNDaGlsZHJlbjtcclxuXHJcbiAgICAgICAgY29uc3QgcmVuZGVyZWRJdGVtID0ge1xyXG4gICAgICAgICAgICBkYXRhOiBub2RlLmRhdGEsXHJcbiAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuVHJlZU5vZGUsXHJcbiAgICAgICAgICAgIGRlcHRoOiBkZXB0aCxcclxuICAgICAgICAgICAgaGFzQ2hpbGRyZW46IGhhc0NoaWxkcmVuLFxyXG4gICAgICAgICAgICBub2RlOiBub2RlLFxyXG4gICAgICAgICAgICBpbmRleDogdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgICAgcG9zaXRpb25JblNldDogcG9zaXRpb25JblNldCxcclxuICAgICAgICAgICAgc2V0U2l6ZTogc2V0U2l6ZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2gocmVuZGVyZWRJdGVtKTtcclxuXHJcbiAgICAgICAgY29uc3QgY3VycmVudFNoYWRvd1RyZWVOb2RlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiByZW5kZXJlZEl0ZW0sXHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFpbnRhaW4gYSBzaGFkb3cgdHJlZSB0byBoYW5kbGUgdGhlIFwic2FtZSBsZXZlbCBvbmx5XCIgc29ydGluZy5cclxuICAgICAgICBwYXJlbnRTaGFkb3dUcmVlTm9kZS5jaGlsZHJlbi5wdXNoKGN1cnJlbnRTaGFkb3dUcmVlTm9kZSk7XHJcblxyXG4gICAgICAgIGlmIChyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZCAmJiBub2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgIGxldCBjdXJyZW50UG9zaXRpb25JblNldCA9IDE7XHJcbiAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZShjaGlsZCwgZGVwdGggKyAxLCBjdXJyZW50U2hhZG93VHJlZU5vZGUsIGN1cnJlbnRQb3NpdGlvbkluU2V0LCBub2RlLmNoaWxkcmVuLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb25JblNldCsrO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZVJlbmRlckl0ZW1zKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmdyb3VwQ29sdW1uICYmIHRoaXMuZ3JvdXBDb2x1bW4uZmllbGQpIHtcclxuICAgICAgICAgICAgdGhpcy5ncm91cEtleXMgPSB7fTtcclxuICAgICAgICAgICAgY29uc3QgZ3JvdXBzOiB7IGdyb3VwOiBEYXRhVGFibGVEYXRhSXRlbSwgaXRlbXM6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVtdIH1bXSA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBTb3J0TW9kZSAhPT0gRGF0YVRhYmxlU29ydE1vZGUuTm9uZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcGFyZUZ1bmN0aW9uID0gdGhpcy5ncm91cENvbHVtbi5zb3J0YWJsZSA9PT0gJ2N1c3RvbScgP1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBDb2x1bW4uY29tcGFyZUZ1bmN0aW9uLmJpbmQodGhpcykgOiB0aGlzLmRlZmF1bHRTb3J0Q29tcGFyZUZ1bmN0aW9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3J0RGlyZWN0aW9uID0gdGhpcy5ncm91cFNvcnRNb2RlID09PSBEYXRhVGFibGVTb3J0TW9kZS5Bc2NlbmQgPyAxIDogLTE7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvcnREaXJlY3Rpb24gKiBjb21wYXJlRnVuY3Rpb24oYSwgYiwgdGhpcy5ncm91cENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcmVkSXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwRGF0YSA9IHRoaXMucmVzb2x2ZU9iamVjdFBhdGgoaXRlbSwgdGhpcy5ncm91cENvbHVtbi5maWVsZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdyb3VwS2V5c1tncm91cERhdGFdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzLnB1c2goeyBncm91cDogZ3JvdXBEYXRhLCBpdGVtczogZ3JvdXBJdGVtcyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cEtleXNbZ3JvdXBEYXRhXSA9IGdyb3VwSXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2dyb3VwRGF0YV0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwVG9nZ2xlU3RhdHVzW2dyb3VwRGF0YV0gPSB0aGlzLmRlZmF1bHRHcm91cFRvZ2dsZUV4cGFuZGVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwS2V5c1tncm91cERhdGFdLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZ3JvdXBzW2ldLmdyb3VwLFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBIZWFkZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25JblNldDogaSArIDEsXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZTogZ3JvdXBzLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5ncm91cFRvZ2dsZVN0YXR1c1tncm91cHNbaV0uZ3JvdXBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRQb3NpdGlvbkluU2V0ID0gMTtcclxuICAgICAgICAgICAgICAgICAgICBncm91cHNbaV0uaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuR3JvdXBJdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkluU2V0OiBjdXJyZW50UG9zaXRpb25JblNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpemU6IGdyb3Vwc1tpXS5pdGVtcy5sZW5ndGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbkluU2V0Kys7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5zaGFkb3dUcmVlID0geyBkYXRhOiBudWxsLCBjaGlsZHJlbjogW10gfTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UG9zaXRpb25JblNldCA9IDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2gobm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmVlTm9kZShub2RlLCAwLCB0aGlzLnNoYWRvd1RyZWUsIGN1cnJlbnRQb3NpdGlvbkluU2V0LCB0aGlzLml0ZW1zLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uSW5TZXQrKztcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlckl0ZW0gPSA8RGF0YVRhYmxlUmVuZGVyZWRJdGVtPntcclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4KyssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuZmlsdGVyZWRJdGVtc1tpXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Ob3JtYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQ6IFtdXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLnB1c2gocmVuZGVySXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zID0gdGhpcy5maWx0ZXJlZEl0ZW1zLm1hcChpdGVtID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgrKyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtVHlwZS5Ob3JtYWxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbmRlckl0ZW1zKHByZXZlbnRTY3JvbGxpbmc/OiBib29sZWFuLCBmb3JjZVVwZGF0ZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9ICF0aGlzLml0ZW1zO1xyXG5cclxuICAgICAgICB0aGlzLnByb2Nlc3NGaWx0ZXIoKTtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlUmVuZGVySXRlbXMoKTtcclxuXHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlcyBob3cgaGlnaCB0aGUgc2Nyb2xsIGRhdGEgZGl2IHNob3VsZCBiZS5cclxuICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zICYmICF0aGlzLmRpc2FibGVVSVZpcnR1YWxpemF0aW9uKSB7XHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSB0aGlzLnJlbmRlcmVkSXRlbXMubGVuZ3RoICogdGhpcy5yb3dIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB0aGUgaGVpZ2h0IGlzIHRvbyBtdWNoLCB3ZSBuZWVkIHRvIGxpbWl0ZWQgdGhlIGhlaWdodCBvdGhlcndpc2UgTWljcm9zb2Z0IEVkZ2Ugd2lsbCBjcmFzaC5cclxuICAgICAgICAgICAgLy8gSXQncyBvayBpZiB0aGUgc2Nyb2xsIGRhdGEgZGl2IGhlaWdodCBkb2Vzbid0IGVxdWFsIHRvIHRoZSBhY3R1YWwgdG90YWwgZGF0YSB0YWJsZSBoZWlnaHRcclxuICAgICAgICAgICAgLy8gYmVjYXVzZSBhbnl3YXkgd2UgdXNlIHRoZSByYXRpbyBvZiBzY3JvbGwgZGF0YSBkaXYgaGVpZ2h0IHRvIGFjdHVhbCB0b3RhbCBsaXN0IGl0ZW0gaGVpZ2h0XHJcbiAgICAgICAgICAgIC8vIHRvIGNhbGN1bGF0ZSB0aGUgc2Nyb2xsaW5nIHBvc2l0aW9uIG9mIHRoZSBhY3R1YWwgZGF0YS5cclxuICAgICAgICAgICAgdGhpcy5oYXNMb25nTGlzdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoaGVpZ2h0ID4gdGhpcy5tYXhBY3R1YWxTY3JvbGxEYXRhRWxlbWVudEhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBmaW5kIGEgaGVpZ2h0IG5lYXIgdGhlIG1heEFjdHVhbFNjcm9sbERhdGFFbGVtZW50SGVpZ2h0IHdoaWNoIGNhbiBiZSBkaXZpZGVkIGV4YWN0bHkgYnkgdGhlIHJvdyBoZWlnaHQuXHJcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2hlbiB3ZSBjYWxjdWF0ZSB0aGUgc2Nyb2xsaW5nIHBvc2l0aW9uIG9mIHRoZSBhY3R1YWwgZGF0YSxcclxuICAgICAgICAgICAgICAgIC8vIHRoZSBmbG9hdGluZyBwYXJ0IG9mIHRoZSBoZWlnaHQgd2lsbCBpbXBhY3QgdGhlIGFjY3VyYWN5IG9mIHRoZSBjYWxjdWxhdGlvbiByZXN1bHQuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0xvbmdMaXN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGguZmxvb3IodGhpcy5tYXhBY3R1YWxTY3JvbGxEYXRhRWxlbWVudEhlaWdodCAvIHRoaXMucm93SGVpZ2h0KSAqIHRoaXMucm93SGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zb3J0SXRlbXMoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdGFibGUgJiYgdGhpcy5lZGl0YWJsZUF1dG9OZXdSb3cpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVuZGVySXRlbUZvck5ld0RhdGFJdGVtID0gPERhdGFUYWJsZVJlbmRlcmVkSXRlbT57XHJcbiAgICAgICAgICAgICAgICBpbmRleDogdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgIGRhdGE6IDxFZGl0YWJsZURhdGFJdGVtPntcclxuICAgICAgICAgICAgICAgICAgICBpZDogTXNmdFNtZS5uZXdHdWlkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkFsZXJ0czoge30sXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmVkaXRhYmxlTmV3RGF0YUl0ZW0gfHwge30pKSxcclxuICAgICAgICAgICAgICAgICAgICBpc05ld1JvdzogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IERhdGFUYWJsZVJlbmRlcmVkSXRlbVR5cGUuTm9ybWFsLFxyXG4gICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDogW11cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRJdGVtcy5wdXNoKHJlbmRlckl0ZW1Gb3JOZXdEYXRhSXRlbSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KHByZXZlbnRTY3JvbGxpbmcsIGZvcmNlVXBkYXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVNjcm9sbEFib3ZlRGF0YUVsZW1lbnQocmVuZGVyZWRJdGVtQWJvdmVWaWV3UG9ydExlbmd0aD86IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNjcm9sbEFib3ZlRGF0YUVsZW1lbnQgPSB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gT25seSBkaXNwbGF5IHRoZSBzY3JvbGwgYWJvdmUgZGF0YSBlbGVtZW50IHdoZW4gaXQncyBoZWlnaHQgaXMgYXZhaWxhYmxlLlxyXG4gICAgICAgIC8vIEl0cyBoZWlnaHQgbWF5IG5vdCBiZSByZWFkeSB3aGVuIHRoZSBkYXRhIHRhYmxlIGlzIHJlbmRlcmVkIGZpcnN0IHRpbWUgYW5kIHRoZSBzY3JvbGwgdG9wIGlzIDAuXHJcbiAgICAgICAgaWYgKCF0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQgJiYgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0ID0gc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVuZGVyZWRJdGVtQWJvdmVWaWV3UG9ydExlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFib3ZlRGF0YUVsZW1lbnRIZWlnaHQgPSB0aGlzLnJvd0hlaWdodCAqIHJlbmRlcmVkSXRlbUFib3ZlVmlld1BvcnRMZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQWJvdmVEYXRhU3R5bGVUb3AgPSB0aGlzLmRpc3BsYXlJdGVtc1RvcCAtIHRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudEhlaWdodCArICdweCc7XHJcbiAgICAgICAgICAgIHNjcm9sbEFib3ZlRGF0YUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzY3JvbGxBYm92ZURhdGFFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uTGF5b3V0Q2hhbmdlZFJlc3BvbnNpdmVXaW5kb3coKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5EYXRhVGFibGVSZXNwb25zaXZlV2luZG93TWFuYWdlci51cGRhdGVWaWV3UG9ydFdpZHRoRHluYW1pY2FsbHlPblBob25lRG93bihcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxCb2R5RWxlbWVudCwgdGhpcy5yZW5kZXJlciwgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50LCB0aGlzLmhlYWRlclRhYmxlRWxlbWVudCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLkRhdGFUYWJsZVJlc3BvbnNpdmVXaW5kb3dNYW5hZ2VyLmNoZWNrSXNUYWJsZVJlbmRlcmVkT25QaG9uZURvd25XaXRoTWluSGVpZ2h0KFxyXG4gICAgICAgICAgICB0aGlzLmhlYWRlclRhYmxlRWxlbWVudCwgdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50KSkge1xyXG4gICAgICAgICAgICB0aGlzLmlzVGFibGVSZW5kZXJlZFdpdGhNaW5IZWlnaHRQaG9uZURvd24uZW1pdCh0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmlzVGFibGVSZW5kZXJlZFdpdGhNaW5IZWlnaHRQaG9uZURvd24uZW1pdChmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2l2ZSB0aGUgYWNjZXNzIG9mIHRoaXMgZnVuY3Rpb24gb24gc3BlY2lhbCBzaXR1YXRpb24gd2hlcmUgZGlhbG9nIGNvbnRhaW5zIGRhdGEtdGFibGVcclxuICAgICAqL1xyXG4gICAgQERlYm91bmNlKClcclxuICAgIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25XaW5kb3dCcmVha3BvaW50Q2hhbmdlZCgpO1xyXG4gICAgICAgIHRoaXMuZGVmZXJyZWRPbkxheW91dENoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBvbiB3aW5kb3cgYnJlYWtwb2ludCBjaGFuZ2VkIGhhbmRsZXIuXHJcbiAgICAgKiBBZGRpbmcgeWllbGQgZm9yIGNvbXBvbmVudCB0byBnZXQgRWxlbWVudFJlZiBhZnRlciBpbml0aWFsaXphdGlvbi5cclxuICAgICAqL1xyXG4gICAgQFlpZWxkKClcclxuICAgIHByaXZhdGUgb25XaW5kb3dCcmVha3BvaW50Q2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc2Nyb2xsQm9keUVsZW1lbnQgfHwgIXRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudCB8fCAhdGhpcy5oZWFkZXJUYWJsZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vbkxheW91dENoYW5nZWRSZXNwb25zaXZlV2luZG93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgQFlpZWxkKClcclxuICAgIHByaXZhdGUgb25MYXlvdXRDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHpvb21TY2FsZUggPSAod2luZG93LnNjcmVlbi53aWR0aCAtIHdpbmRvdy5pbm5lcldpZHRoKSAvIHdpbmRvdy5zY3JlZW4ud2lkdGg7XHJcblxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRXaWR0aCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgICAgIGNvbnN0IGFkanVzdGVkV2lkdGggPSBNYXRoLm1heChjdXJyZW50V2lkdGggKyB6b29tU2NhbGVIICogY3VycmVudFdpZHRoLCBjdXJyZW50V2lkdGgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5hY3R1YWxDb2x1bW5Qcm9jZXNzZWQpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudCA9IHRoaXMuc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUl0ZW1JblZpZXdQb3J0KGZhbHNlLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNjcm9sbGFibGVIb3Jpem9udGFsKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBcyB0aGUgdXNlciB6b29tcyBpbiBhbmQgb3V0LCB3ZSBuZWVkIHRvIGVuYWJsZSBob3Jpem9udGFsIHNjcm9sbGluZyBpbiB0aGVcclxuICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5lciBlbGVtZW50XHJcbiAgICAgICAgICAgICAgICAvLyBUbyBhY2NvbW1vZGF0ZSBkaXNwbGF5IG9mIGJpZ2dlciB6b29tZWQgaW4gdGV4dCwgd2UgYWxzbyBhZGp1c3QgdGhlIHdpZHRoIG9mIHRoZVxyXG4gICAgICAgICAgICAgICAgLy8gaW5uZXIgdGFibGUgY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBUaGlzIHRlY2huaXF1ZSB3aWxsIG5vdCB3b3JrIGZvciBNb3ppbGxhLCB3aG9zZSB2YWx1ZSBvZiB3aW5kb3cuaW5uZXJXaWR0aCBhbmQgd2luZG93LnNjcmVlbi53aWR0aCByZW1haW5zXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICBjb25zdGFudFxyXG4gICAgICAgICAgICAgICAgLy8gTk9URTogTm90IHdpbmRvdyByZXNwb25zaXZlIGRlc2lnblxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNjcm9sbENvbnRhaW5lckVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ292ZXJmbG93LXgnLCBgYXV0b2ApO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxCb2R5RWxlbWVudC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICd3aWR0aCcsXHJcbiAgICAgICAgICAgICAgICAgICAgYCR7YWRqdXN0ZWRXaWR0aH1weGApO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyxcclxuICAgICAgICAgICAgICAgICAgICBgJHthZGp1c3RlZFdpZHRofXB4YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxXaWR0aCA9IHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBXZSBzdG9yZSB0aGUgb3JpZ2luYWwgcmF0aW9zIG9mIHRoZSBjb2x1bW4gd2lkdGhzIGFzIHBlcmNlbnRhZ2VzIG9mIHRoZSBvZmZzZXRXaWR0aDtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1uc1xyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoY29sdW1uID0+ICFjb2x1bW4ud2lkdGguZW5kc1dpdGgoJyUnKSAmJiAhY29sdW1uLndpZHRoUGVyY2VudGFnZSlcclxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xXaWR0aCA9IERhdGFUYWJsZUNvbXBvbmVudC5weENvbnZlcnRlci5jb252ZXJ0VG9QeChjb2x1bW4ud2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IGdldCByYXRpb3MgZm9yIHVuaXRzIHRoYXQgd2UgY2FuIHN1Y2Nlc3NmdWxseSBjb252ZXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xXaWR0aCAmJiAhaXNOYU4oY29sV2lkdGgpICYmIG9yaWdpbmFsV2lkdGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ud2lkdGhQZXJjZW50YWdlID0gY29sV2lkdGggLyBvcmlnaW5hbFdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBUaGUgdGVtcGxhdGUgYXBwbGllcyB0aGUgd2lkdGggcmF0aW8gb2YgZWFjaCBjb2x1bW4gb24gdGhlIHdpZHRoIG9mIHRoZSBjb250YWluZXJcclxuICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4ud2lkdGhQZXJjZW50YWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLndpZHRoID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKiBjb2x1bW4ud2lkdGhQZXJjZW50YWdlICsgJ3B4JztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBXaGVuIGxheW91dCBpcyBjaGFuZ2VkLCB0aGUgXCJkaXNwbGF5IGFib3ZlIHZpZXcgcG9ydFwiIGl0ZW0gbGlzdCBkYXRhIHNvdXJjZSBpcyB1cGRhdGVkXHJcbiAgICAgICAgICAgIC8vIGJ1dCB0aGUgaHRtbCBpcyBub3QgdXBkYXRlZCB5ZXQuIFNvIHRoZSBVSSBvZiB0aGUgXCJkaXNwbGF5IGFib3ZlIHZpZXcgcG9ydFwiIGlzIG5vdCBnb29kLlxyXG4gICAgICAgICAgICAvLyBTbyBoaWRlIHRoZSBVSSBmb3Igbm93IGFuZCBhZGp1c3QgaXQgaW4gc2V0VGltZW91dC5cclxuICAgICAgICAgICAgc2Nyb2xsQWJvdmVEYXRhRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxBYm92ZURhdGFFbGVtZW50SGVpZ2h0ID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU2Nyb2xsQWJvdmVEYXRhRWxlbWVudCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ29sdW1uRG9tV2lkdGhzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwcml2YXRlIGRlZmVycmVkT25MYXlvdXRDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMub25MYXlvdXRDaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVUcmVlTm9kZVNlbGVjdGlvbihub2RlOiBUcmVlTm9kZURhdGFJdGVtLCBzZWxlY3RlZDogYm9vbGVhbiwgc2tpcEV2ZW50PzogYm9vbGVhbiwgc2tpcExpbmtTZWxlY3Rpb24/OiBib29sZWFuLFxyXG4gICAgICAgIGl0ZW1zVG9TZWxlY3Q/OiBUcmVlTm9kZURhdGFJdGVtW10pOiB2b2lkIHtcclxuICAgICAgICBpZiAoaXRlbXNUb1NlbGVjdCkge1xyXG4gICAgICAgICAgICBzZWxlY3RlZCA9IGl0ZW1zVG9TZWxlY3QuaW5kZXhPZihub2RlLmRhdGEpICE9PSAtMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgIT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24gfHxcclxuICAgICAgICAgICAgKHNraXBMaW5rU2VsZWN0aW9uIHx8ICFub2RlLmNoaWxkcmVuIHx8ICFub2RlLmNoaWxkcmVuLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmludGVybmFsU2VsZWN0aW9uLmluZGV4T2Yobm9kZSk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24ucHVzaChub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXBFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1NlbGVjdGVkLmVtaXQoeyBkYXRhOiBub2RlLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uc3BsaWNlKHRoaXMuaW50ZXJuYWxTZWxlY3Rpb24uaW5kZXhPZihub2RlKSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFza2lwRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dVbnNlbGVjdGVkLmVtaXQoeyBkYXRhOiBub2RlLmRhdGEgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBub2RlLnNlbGVjdGVkID0gc2VsZWN0ZWQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09IERhdGFUYWJsZUNvbXBvbmVudC5zZWxlY3Rpb25Nb2RlTXVsdGlwbGVPcHRpb24pIHtcclxuICAgICAgICAgICAgaWYgKCFza2lwTGlua1NlbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2hvdWxkU2VsZWN0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnROb2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW5baV0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFNlbGVjdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUuc2VsZWN0ZWQgPSBzaG91bGRTZWxlY3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCghc2tpcExpbmtTZWxlY3Rpb24gfHwgaXRlbXNUb1NlbGVjdCkgJiYgbm9kZS5jaGlsZHJlbikge1xyXG4gICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkTm9kZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZE5vZGUucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZS5wYXJlbnQgPSBub2RlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRyZWVOb2RlU2VsZWN0aW9uKGNoaWxkTm9kZSwgc2VsZWN0ZWQsIHNraXBFdmVudCwgc2tpcExpbmtTZWxlY3Rpb24sIGl0ZW1zVG9TZWxlY3QpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhbGlnbkNvbnRlbnQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGVhZGVyVGFibGVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGVudEVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5tYXJnaW5Ub3AgPSB0aGlzLmhlYWRlclRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArICdweCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHRyeSB0byBmb2N1cyBvbiByb3cgZnVuY3Rpb247IGlmIHRoZXJlIGFyZSBubyByZWNvcmRzLCB0aGUgbm8gcmVjb3JkcyBtZXNzYWdlIGlzIHNlbGVjdGVkXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggT25seSBwYXNzIGluIGluZGV4IGlmIG5lZWRzIGZvY3VzIG9ubHlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cnlUb0ZvY3VzU2VsZWN0ZWRSb3coaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucmVuZGVyZWRJdGVtcyB8fCAhdGhpcy5yZW5kZXJlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnRyeVRvRm9jdXNFbXB0eU1lc3NhZ2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93VGltZXIpO1xyXG4gICAgICAgIHRoaXMudHJ5VG9Gb2N1c1NlbGVjdGVkUm93VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgbGV0IHJvdzogSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZChpbmRleCkgJiYgaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgcm93ID0gdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoYC5zbWUtdGFibGUtcm93LnNtZS10YWJsZS1yb3ctZGF0YVtkYXRhLXJlbmRlcmVkLWl0ZW0taW5kZXg9XCIke2luZGV4fVwiXWApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gaW5kZXg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKE1zZnRTbWUuaXNOdWxsT3JVbmRlZmluZWQocm93KSkge1xyXG4gICAgICAgICAgICAgICAgcm93ID0gdGhpcy5zY3JvbGxEYXRhRWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zbWUtdGFibGUtcm93LnNtZS10YWJsZS1yb3ctZGF0YS5zbWUtdGFibGUtcm93LWFjdGl2ZScpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVGb2N1c2VkSXRlbUluZGV4ID0gdGhpcy5hY3RpdmVSZW5kZXJlZEl0ZW1JbmRleDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGNvbnRhaW5lclRvcCA9IDA7XHJcbiAgICAgICAgICAgIGxldCBjb250YWluZXJCb3R0b20gPSBOdW1iZXIuTUFYX1ZBTFVFO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJDbGllbnRSZWN0ID0gdGhpcy5zY3JvbGxDb250YWluZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKVswXTtcclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lckNsaWVudFJlY3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lclRvcCA9IGNvbnRhaW5lckNsaWVudFJlY3QudG9wO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyQm90dG9tID0gY29udGFpbmVyQ2xpZW50UmVjdC5ib3R0b207XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBpc1Jvd0luVmlld1BvcnQgPSBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHJvdykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHJvd1RvcCA9IDA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3dDbGllbnRSZWN0ID0gcm93LmdldENsaWVudFJlY3RzKClbMF07XHJcbiAgICAgICAgICAgICAgICBpZiAocm93Q2xpZW50UmVjdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvd1RvcCA9IHJvd0NsaWVudFJlY3QudG9wO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlzUm93SW5WaWV3UG9ydCA9IHJvd1RvcCA+PSBjb250YWluZXJUb3AgJiYgcm93VG9wIDwgY29udGFpbmVyQm90dG9tO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyb3cgJiYgIWlzUm93SW5WaWV3UG9ydCAmJiBpbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0ZWQgcm93IGlzIG5vdCBpbiB2aWV3cG9ydCwganVzdCBmb2N1cyB0aGUgZmlyc3QgdmlzaWJsZSByb3cgaW4gdGhlIHZpZXdwb3J0LlxyXG4gICAgICAgICAgICAgICAgLy8gVGhlbiBkYXRhIHRhYmxlIHdpbGwgc3RpbGwgYmUgYWJsZSB0byByZWNlaXZlIGtleWJvYXJkIGV2ZW50LlxyXG4gICAgICAgICAgICAgICAgY29uc3QgYmFja3VwUm93cyA9IHRoaXMuc2Nyb2xsRGF0YUVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLXJvdy5zbWUtdGFibGUtcm93LWRhdGEnKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFja3VwUm93cy5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3dDbGllbnRSZWN0ID0gYmFja3VwUm93c1tpXS5nZXRDbGllbnRSZWN0cygpWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3dDbGllbnRSZWN0LnRvcCA+IGNvbnRhaW5lclRvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBiYWNrdXBSb3dzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRDb2x1bW5JbmRleFdpdGhGb2N1c2VkRWxlbWVudCA+PSAwICYmICF0aGlzLmVkaXRhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IDxIVE1MRWxlbWVudD5yb3cucXVlcnlTZWxlY3RvckFsbCgnLnNtZS10YWJsZS10ZCcpW3RoaXMuY3VycmVudENvbHVtbkluZGV4V2l0aEZvY3VzZWRFbGVtZW50XTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb2N1c2FibGVFbGVtZW50ID0gRG9tLmdldEZpcnN0Rm9jdXNhYmxlRGVzY2VuZGVudChjZWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZWRpdGFibGUgZGF0YSB0YWJsZSwgYmVjYXVzZSBvZiB0aGUgZGVzaWduXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIGZvY3VzIG9uIHRoZSByb3cgZmlyc3RcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9jdXNhYmxlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb2N1c2FibGVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm93LmZvY3VzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByb3cuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQm9keUVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkVsZW1lbnRGb2N1c2luZyhldmVudDogRWxlbWVudEZvY3VzaW5nRXZlbnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Wm9uZSA9PT0gdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jb250ZW50QXJlYUhhc0ZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdEZvY3VzQmVoYXZpb3IoKTtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0RXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldEVsZW1lbnQgJiYgZXZlbnQudGFyZ2V0RWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2RhdGEtc21lLWxhc3QtZm9jdXNhYmxlLXNoYWRvdy1lbGVtZW50JylcclxuICAgICAgICAgICAgJiYgZXZlbnQudGFyZ2V0RWxlbWVudCA9PT0gdGhpcy5sYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0Rm9jdXNCZWhhdmlvcigpO1xyXG4gICAgICAgICAgICAvLyBUaGUgdGhpcmQgY29uZGl0aW9uIGlzIGFkZGVkIHRvIGZpeCBrZXlib2FyZCBmb2N1cyBiZWluZyB0cmFwcGVkIGluIHRoZSBkYXRhIHRhYmxlXHJcbiAgICAgICAgICAgIC8vIHdoZW4gdGhlIGxhc3QgZm9jdXNhYmxlIGVsZW1lbnQgZG9lc24ndCBtZWV0IHRoZSBmaXJzdCAyIGNvbmRpdGlvbnMgKGV4OiB0aGUgbGFzdCBmb2N1c2FibGUgZWxlbWVudCBpcyBhIGxpbmspLlxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlWm9uZSA9PT0gdGhpcy5jb250ZW50RWxlbWVudC5uYXRpdmVFbGVtZW50IHx8IGV2ZW50LnNvdXJjZVpvbmUgPT09IHRoaXMuaGVhZGVyRWxlbWVudC5uYXRpdmVFbGVtZW50IHx8XHJcbiAgICAgICAgICAgICAgICAoZXZlbnQudGFyZ2V0RWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgndGFiaW5kZXgnKSk/LnZhbHVlID49ICcwJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEZvY3VzYWJsZUVsZW1lbnQgPSBEb20uZ2V0TmV4dFpvbmVFbGVtZW50KGV2ZW50LnRhcmdldEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0Rm9jdXNhYmxlRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldEVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbExhc3RGb2N1c2FibGVTaGFkb3dFbGVtZW50Rm9jdXNPbmNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHRFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFRhcmdldFpvbmUgPSBEb20uZ2V0QW5jZXN0b3Jab25lKG5leHRGb2N1c2FibGVFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBDb3JlRW52aXJvbm1lbnQuYWNjZXNzaWJpbGl0eU1hbmFnZXIucHJvY2Vzc0VsZW1lbnRGb2N1c2luZyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQubmF0aXZlRXZlbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRGb2N1c2FibGVFbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC50YXJnZXRab25lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxUYXJnZXRab25lKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0RXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZW5kZXJlZEl0ZW1CeUluZGV4KHRoaXMuYWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cnlUb0ZvY3VzU2VsZWN0ZWRSb3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NDb2x1bW5zKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucHJvY2Vzc0FjdHVhbENvbHVtbnMoKTtcclxuICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zTWFpbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc0NvbHVtbnNNYWluKCkge1xyXG4gICAgICAgIHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtY29sY291bnQnLFxyXG4gICAgICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMubGVuZ3RoICsgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbiA/IDEgOiAwKSk7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDb2x1bW5Eb21XaWR0aHMoKTtcclxuICAgICAgICB0aGlzLmFjdHVhbENvbHVtblByb2Nlc3NlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzQWN0dWFsQ29sdW1ucygpIHtcclxuICAgICAgICB0aGlzLmFjdHVhbENvbHVtbnMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKHNvdXJjZUNvbHVtbiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlQ29sdW1uICE9PSB0aGlzLmdyb3VwQ29sdW1uICYmICFzb3VyY2VDb2x1bW4uaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxDb2x1bW5zLnB1c2goc291cmNlQ29sdW1uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwcm9jZXNzQ29sdW1uc0J5T3JkZXIob3JkZXI6IEFycmF5PHN0cmluZz4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNvbHVtbnNPcmRlciA9IG9yZGVyO1xyXG4gICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucyA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcclxuICAgICAgICAgICAgb3JkZXIuZm9yRWFjaChmaWVsZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4uZmllbGQgPT09IGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlQ29sdW1uICYmIHNvdXJjZUNvbHVtbiAhPT0gdGhpcy5ncm91cENvbHVtbiAmJiAhc291cmNlQ29sdW1uLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1ucy5wdXNoKHNvdXJjZUNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3JkZXIgJiYgb3JkZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NDb2x1bW5zTWFpbigpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbHVtbnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBmaWx0ZXJlZCBpdGVtcyAoaWYgYW55KSB3aXRoaW4gdGhlIGRhdGFUYWJsZS5cclxuICAgICAqIEByZXR1cm5zIG51bWJlciBvZiBkYXRhVGFibGUgZmlsdGVyZWQgaXRlbXMsIHplcm8gaWYgbm9uZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldE51bWJlck9mRmlsdGVyZWRJdGVtcygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkSXRlbXMgPyB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoIDogMDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgdG9vbHRpcCBoYW5kbGVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGRhdGEgdGFibGUgY29sdW1uLlxyXG4gICAgICogQHBhcmFtIGNvbHVtbiAgICAgICAgQ29sdW1uIGZvciB0b29sdGlwIGhhbmRsZXJcclxuICAgICAqIEBwYXJhbSByZW5kZXJlZEl0ZW0gIERhdGEgaXRlbSBmb3IgdGhlIHJvd1xyXG4gICAgICogQHJldHVybnMgICAgICAgICAgICAgVG9vbHRpcCBzdHJpbmcgaWYgZXhpc3RzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29sdW1uVG9vbHRpcFRleHQoY29sdW1uOiBEYXRhVGFibGVDb2x1bW5Db21wb25lbnQsIHJlbmRlcmVkSXRlbTogRGF0YVRhYmxlUmVuZGVyZWRJdGVtKTogc3RyaW5nIHtcclxuICAgICAgICBpZiAoISFjb2x1bW4uZ2V0VG9vbHRpcEhhbmRsZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5nZXRUb29sdGlwSGFuZGxlcihyZW5kZXJlZEl0ZW0uZGF0YSwgY29sdW1uLmZpZWxkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuZW5hYmxlRGVmYXVsdFRvb2x0aXBzICYmICFNc2Z0U21lLmlzTnVsbE9yVW5kZWZpbmVkKGNvbHVtbi5maWVsZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgPyBjb2x1bW4uZ2V0RGVmYXVsdFRvb2x0aXBIYW5kbGVyKHJlbmRlcmVkSXRlbS5kYXRhLCBjb2x1bW4uZmllbGQpIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYWRkZWQgZnJvbSB1cGdyYWRpbmcgZGF0YSB0YWJsZSB0byBzdXBwb3J0IGVkaXRhYmxlIGRhdGEgdGFibGVcclxuICAgICAqIFRoZSBpZGVhIGlzIHRvIHVzZSB0aGUgZGF0YSB0YWJsZSdzIGhlYWRlciB3aWR0aCB0byBiZSBhcHBsaWVkIG9uIHRoZSBkYXRhIHRhYmxlIGJvZHkgY29sdW1ucy5cclxuICAgICAqIFdoZW4gbm90IHNob3dpbmcgaGVhZGVycywgbmVlZCB0byB1c2UgdGhlIGhlYWRlcidzIHdpZHRoIHRvIGJlIGFwcGxpZWQgdG8gdGQgYXMgd2VsbC5cclxuICAgICAqL1xyXG4gICAgQFlpZWxkKClcclxuICAgIHByaXZhdGUgY2FsY3VsYXRlQ29sdW1uRG9tV2lkdGhzKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRoRWxlbWVudHMgPSB0aGlzLmhlYWRlckVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc21lLXRhYmxlLWNhcHRpb24uc21lLXRhYmxlLWNvbHVtbi1oZWFkZXInKTtcclxuICAgICAgICBpZiAodGhFbGVtZW50cyAmJiB0aEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFjdHVhbENvbHVtbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFsQ29sdW1uc1tpXS5kb21XaWR0aCA9IHRoRWxlbWVudHNbaV0ub2Zmc2V0V2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRJc0NvbHVtbldpZHRoQ2FsY3VsYXRlZCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gZ2l2ZXMgb25lIG1vcmUgdGljayBzbyB0aGF0IHRoZSBsb2FkaW5nIHdoZWVsIGNhbiBzdGFuZCBvbmUgbW9yZSBodG1sIHJlbmRlcmluZyBsaWZlIGN5Y2xlXHJcbiAgICAgKiBUaGlzIGZpeGVzIGEgYnVnIHJlbGF0ZWQgdG8gZGF0YSB0YWJsZSBvbiBsb2FkIG1pcy1hbGlnbmVkXHJcbiAgICAgKiBAcGFyYW0gaW5wdXQgYm9vbGVhblxyXG4gICAgICovXHJcbiAgICBARGVib3VuY2UoKVxyXG4gICAgcHJpdmF0ZSBzZXRJc0NvbHVtbldpZHRoQ2FsY3VsYXRlZChpbnB1dDogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuaXNDb2x1bW5XaWR0aENhbGN1bGF0ZWQgPSBpbnB1dDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4QnlTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSAhPT0gRGF0YVRhYmxlQ29tcG9uZW50LnNlbGVjdGlvbk1vZGVNdWx0aXBsZU9wdGlvbikge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVuZGVyZWRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0FzVHJlZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0ubm9kZSA9PT0gdGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleChpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0YWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJlZEl0ZW1zW2ldLmRhdGEuY29udGVudCA9PT0gdGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVkSXRlbXNbaV0uZGF0YSA9PT0gdGhpcy5zZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFRyZWVOb2RlRGF0YUlkZW50aXR5KG5vZGU6IFRyZWVOb2RlRGF0YUl0ZW0pOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG5vZGU7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9ICcnO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5nZXRJdGVtSWRlbnRpdHlGdW5jdGlvbikge1xyXG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0SXRlbUlkZW50aXR5RnVuY3Rpb24oY3VycmVudE5vZGUuZGF0YSkgKyAnXFxcXCcgKyByZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNlbGVjdEFsbCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMucmVuZGVyZWRJdGVtcy5zbGljZSgpLm1hcChpdGVtID0+IGl0ZW0uZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucm93U2VsZWN0ZWQuZW1pdCh7IGRhdGE6IGl0ZW0uZGF0YSB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXBwbHlRdWVyeUVkaXRvcih2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3Q6IFF1ZXJ5RGF0YSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaW50ZXJuYWxRdWVyeUVkaXRvciA9IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdDtcclxuICAgICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBxdWVyeUVkaXRvckZpbHRlck1haW4odmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0OiBRdWVyeURhdGEsIGl0ZW06IERhdGFUYWJsZURhdGFJdGVtKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBxdWVyeUVkaXRvckl0ZW0gPSB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QuY29udGVudHNbaV07XHJcbiAgICAgICAgICAgIGlmIChmb3VuZCAmJiB0aGlzLmFjdHVhbENvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gcXVlcnlFZGl0b3JJdGVtLmNvbHVtbi52YWx1ZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuYWN0dWFsQ29sdW1ucy5maWx0ZXIoKGNvbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2wuZmllbGQgPT09IGZpZWxkO1xyXG4gICAgICAgICAgICAgICAgfSlbMF07XHJcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5yZXNvbHZlT2JqZWN0UGF0aChpdGVtLCBjb2x1bW4uZmllbGQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5maWx0ZXJPdmVycmlkaW5nRnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29sdW1uLmZpbHRlck92ZXJyaWRpbmdGdW5jdGlvbih2YWx1ZSwgaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhc2VTZW5zaXRpdmVGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldEZsb2F0VmFsID0gcGFyc2VGbG9hdChxdWVyeUVkaXRvckl0ZW0udmFsdWUudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxGbG9hdFZhbCA9IHBhcnNlRmxvYXQodmFsdWUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFN0cmluZ1ZhbCA9IHF1ZXJ5RWRpdG9ySXRlbS52YWx1ZS52YWx1ZS50b1N0cmluZygpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFN0cmluZ1ZhbCA9IHZhbHVlLnRvU3RyaW5nKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5RWRpdG9ySXRlbSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHF1ZXJ5RWRpdG9ySXRlbS52YWx1ZS50eXBlID09PSBRdWVyeURhdGFJdGVtVmFsdWVUeXBlLlNpbmdsZURyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcXVlcnlFZGl0b3JJdGVtLnZhbHVlLnR5cGUgPT09IFF1ZXJ5RGF0YUl0ZW1WYWx1ZVR5cGUuVGV4dElucHV0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChxdWVyeUVkaXRvckl0ZW0ub3BlcmFuZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUXVlcnlEYXRhT3BlcmFuZC5FcTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5xdWVyeUVkaXRvckVxdWFsSXNDb250YWluKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsU3RyaW5nVmFsLmluZGV4T2YodGFyZ2V0U3RyaW5nVmFsKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmlsdGVyIHN0cmluZyBpcyBlbXB0eSB0aGVuIHRyZWF0IGFzICdFcXVhbElzQ29udGFpbicgdG8gcmVmcmVzaCBkYXRhIHRhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsU3RyaW5nVmFsICE9PSB0YXJnZXRTdHJpbmdWYWwgJiYgIU1zZnRTbWUuaXNFbXB0eSh0YXJnZXRTdHJpbmdWYWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFF1ZXJ5RGF0YU9wZXJhbmQuR3Q6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGFyZ2V0RmxvYXRWYWwgfHwgdGFyZ2V0RmxvYXRWYWwgPT09IDApICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWN0dWFsRmxvYXRWYWwgfHwgYWN0dWFsRmxvYXRWYWwgPT09IDApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YXJnZXRGbG9hdFZhbCA8PSBhY3R1YWxGbG9hdFZhbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUXVlcnlEYXRhT3BlcmFuZC5MdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0YXJnZXRGbG9hdFZhbCB8fCB0YXJnZXRGbG9hdFZhbCA9PT0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChhY3R1YWxGbG9hdFZhbCB8fCBhY3R1YWxGbG9hdFZhbCA9PT0gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRhcmdldEZsb2F0VmFsID49IGFjdHVhbEZsb2F0VmFsKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBRdWVyeURhdGFPcGVyYW5kLk5xOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShhY3R1YWxTdHJpbmdWYWwgIT09IHRhcmdldFN0cmluZ1ZhbCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBlcVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsU3RyaW5nVmFsLmluZGV4T2YodGFyZ2V0U3RyaW5nVmFsKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVlcnlFZGl0b3JJdGVtLnZhbHVlLnR5cGUgPT09IFF1ZXJ5RGF0YUl0ZW1WYWx1ZVR5cGUuTXVsdGlTZWxlY3REcm9wZG93bikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0aGlzLnF1ZXJ5RWRpdG9yRmlsdGVyQnlNdWx0aXBsZVNlbGVjdGlvbihcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LCBxdWVyeUVkaXRvckl0ZW0sIGFjdHVhbFN0cmluZ1ZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocXVlcnlFZGl0b3JJdGVtLnZhbHVlLnR5cGUgPT09IFF1ZXJ5RGF0YUl0ZW1WYWx1ZVR5cGUuVGltZXNwYW5Ecm9wZG93bikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0aGlzLnF1ZXJ5RWRpdG9yRmlsdGVyQnlUaW1lc3BhbkRyb3Bkb3duKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWRRdWVyeUVkaXRvckxpc3QsIHF1ZXJ5RWRpdG9ySXRlbSwgYWN0dWFsU3RyaW5nVmFsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmb3VuZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHF1ZXJ5RWRpdG9yRmlsdGVyQnlUaW1lc3BhbkRyb3Bkb3duKFxyXG4gICAgICAgIHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdDogUXVlcnlEYXRhLCBxdWVyeUVkaXRvckl0ZW06IFF1ZXJ5RGF0YUl0ZW0sIGFjdHVhbFN0cmluZ1ZhbDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgZmllbGQgPSBxdWVyeUVkaXRvckl0ZW0uY29sdW1uLnZhbHVlO1xyXG4gICAgICAgIGxldCByZXMgPSBmYWxzZTtcclxuICAgICAgICBsb29wMTpcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzW2ldO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnZhbHVlLnR5cGUgPT09IFF1ZXJ5RGF0YUl0ZW1WYWx1ZVR5cGUuVGltZXNwYW5Ecm9wZG93biAmJiBpdGVtLmNvbHVtbiAmJiBpdGVtLmNvbHVtbi52YWx1ZSA9PT0gZmllbGQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlLnZhbHVlICYmIGl0ZW0udmFsdWUudmFsdWUuc3RhcnQgJiYgaXRlbS52YWx1ZS52YWx1ZS5lbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IGl0ZW0udmFsdWUudmFsdWUuc3RhcnQuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IGl0ZW0udmFsdWUudmFsdWUuZW5kLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWwgPSBuZXcgRGF0ZShhY3R1YWxTdHJpbmdWYWwpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPD0gYWN0dWFsICYmIGFjdHVhbCA8PSBlbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBxdWVyeUVkaXRvckZpbHRlckJ5TXVsdGlwbGVTZWxlY3Rpb24oXHJcbiAgICAgICAgdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0OiBRdWVyeURhdGEsIHF1ZXJ5RWRpdG9ySXRlbTogUXVlcnlEYXRhSXRlbSwgYWN0dWFsU3RyaW5nVmFsOiBzdHJpbmcpOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgY29uc3QgZmllbGQgPSBxdWVyeUVkaXRvckl0ZW0uY29sdW1uLnZhbHVlO1xyXG4gICAgICAgIGxldCByZXMgPSBmYWxzZTtcclxuICAgICAgICBsb29wMTpcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbGlkYXRlZFF1ZXJ5RWRpdG9yTGlzdC5jb250ZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdmFsaWRhdGVkUXVlcnlFZGl0b3JMaXN0LmNvbnRlbnRzW2ldO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLnZhbHVlLnR5cGUgPT09IFF1ZXJ5RGF0YUl0ZW1WYWx1ZVR5cGUuTXVsdGlTZWxlY3REcm9wZG93biAmJiBpdGVtLmNvbHVtbiAmJiBpdGVtLmNvbHVtbi52YWx1ZSA9PT0gZmllbGQpIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaXRlbS52YWx1ZS52YWx1ZS5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFN0cmluZ1ZhbCA9IGl0ZW0udmFsdWUudmFsdWVbal0udG9TdHJpbmcoKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWxTdHJpbmdWYWwgPT09IHRhcmdldFN0cmluZ1ZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wMTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgdGhlIGlkQmFnIHVzZWQgYnkgdGhpcyBjb21wb25lbnQgdG8gc3RvcmUgdW5pcXVlIGVsZW1lbnQgaWRzLlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlSWRCYWcoKTogTXNmdFNtZS5TdHJpbmdNYXA8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZmlyc3REYXRhQ29sdW1uOiAnJyxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogdGhlIHRyZWUgZ3JpZCBhY2Nlc3NpYmlsaXR5IGRvY3VtZW50YXRpb25zOiBodHRwczovL3dpa2kubW96aWxsYS5vcmcvQWNjZXNzaWJpbGl0eS9UcmVlR3JpZFxyXG4gKi9cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtdHJlZS10YWJsZScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFRyZWVUYWJsZUNvbXBvbmVudCBleHRlbmRzIERhdGFUYWJsZUNvbXBvbmVudCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ1RyZWVUYWJsZUNvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuc2hvd0FzVHJlZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldEluaXRpYWxIb3N0Q2xhc3NlcygpIHtcclxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW5pdGlhbEhvc3RDbGFzc2VzKCkuY29uY2F0KFtcclxuICAgICAgICAgICAgJ3NtZS10cmVlLXRhYmxlJ1xyXG4gICAgICAgIF0pO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgcm9sZT1cInByZXNlbnRhdGlvblwiIGNsYXNzPVwic21lLXRhYmxlLWhlYWRlciBzbWUtZm9jdXMtem9uZSBzbWUtZGF0YS10YWJsZS10cmFuc2l0aW9uXCIgI2hlYWRlclxyXG4gIFtjbGFzcy5zbWUtc2hhZG93LXNjcm9sbGVkLWNvbnRlbnRdPVwiaXNTY3JvbGxlZERvd25cIiBbY2xhc3Muc21lLXRhYmxlLW11bHRpLXNlbGVjdF09XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJ1wiXHJcbiAgW2NsYXNzLnNtZS10YWJsZS1zZWxlY3RhYmxlXT1cInNlbGVjdGFibGVcIiBbY2xhc3Muc21lLXRhYmxlLWluZGVudGVkXT1cInNob3dMZWZ0TWFyZ2luXCJcclxuICBbY2xhc3Muc21lLXRhYmxlLXNlbGVjdC1hbGwtZW5hYmxlZF09XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJyAmJiBzaG93QWxsSXRlbUNoZWNrYm94XCI+XHJcbiAgPCEtLSBBY2NvcmRpbmcgdG8gdGhlIGFjY2Vzc2liaWxpdHkgdGVhbSwgZGF0YS10YWJsZSBoZWFkZXJzIHNob3VsZCBiZSBhY2Nlc3NpYmxlIGJ5IGtleWJvYXJkXHJcbiAgYW5kIHRoZSByZXNpemVyIHNob3VsZCBhbHNvIGJlIGFjY2Vzc2VkIGJ5IGtleWJvYXJkLi0tPlxyXG4gIDxkaXYgI2hlYWRlclRhYmxlIGNsYXNzPVwic21lLXRhYmxlIHNtZS10YWJsZS12aXJ0dWFsaXplZCBzbWUtdGFibGUtYXV0by13aWR0aC1waG9uZS1kb3duXCIgcm9sZT1cInJvd2dyb3VwXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLXJvdyBzbWUtYXJyYW5nZS1zdGFjay1oIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG9cIiByb2xlPVwicm93XCJcclxuICAgICAgKGtleWRvd24pPVwib25IZWFkZXJUYWJsZVByZXNzZWQoJGV2ZW50KVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNhcHRpb25cIiBbYXR0ci5yb2xlXT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnPydjb2x1bW5oZWFkZXInOidwcmVzZW50YXRpb24nXCJcclxuICAgICAgICBkYXRhLXV0YS1pZD1cImNoZWNrYm94Q29sdW1uXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jaGVja2JveCBzbWUtdGFibGUtaGVhZGVyLWNoZWNrYm94XCJcclxuICAgICAgICAgICpuZ0lmPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZScgJiYgc2hvd0FsbEl0ZW1DaGVja2JveCAmJiBzaG93SGVhZGVyXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgPGlucHV0IHNtZS1saW50LWRpc2FibGUtc2VsZiB0eXBlPVwiY2hlY2tib3hcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImdldEFsbEl0ZW1DaGVja0JveEFyaWFMYWJlbCgpXCJcclxuICAgICAgICAgICAgW2NoZWNrZWRdPVwic2hvdWxkQWxsSXRlbUNoZWNrQm94Q2hlY2tlZCgpXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1jaGVja2VkXT1cInNob3VsZEFsbEl0ZW1DaGVja0JveENoZWNrZWQoKT8ndHJ1ZSc6J2ZhbHNlJ1wiIChjaGFuZ2UpPVwib25BbGxJdGVtQ2hlY2tCb3hDbGlja2VkKClcIiAvPlxyXG4gICAgICAgICAgPGxhYmVsIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGFjdHVhbENvbHVtbnM7IGxldCBjb2xJbmRleCA9IGluZGV4XCIgW2F0dHIuZmllbGRdPVwiY29sdW1uLmZpZWxkXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7J3dpZHRoJzogY29sdW1uLndpZHRofVwiXHJcbiAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2FwdGlvbiBzbWUtdGFibGUtY29sdW1uLWhlYWRlciBzbWUtcG9zaXRpb24tZmxleC1hdXRvIHt7Y29sdW1uLnN0eWxlQ2xhc3N9fVwiXHJcbiAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiIFthdHRyLmRhdGEtdXRhLWlkXT1cImNvbHVtbi51dGFJZFwiIFthdHRyLmNvbHVtbi1pbmRleF09XCJjb2xJbmRleFwiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb2x1bW4uc29ydGFibGUgJiYgY29sdW1uLnNvcnRhYmxlIT0nZmFsc2UnICYmIHNob3dIZWFkZXJcIlxyXG4gICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtaGVhZGVyLWNlbGwgc21lLWZvY3VzLXpvbmVcIiAoY2xpY2spPVwiY2xpY2tDb2x1bW4oY29sdW1uKVwiIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxyXG4gICAgICAgICAgW3RpdGxlXT1cImNvbHVtbi5oZWFkZXJcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIiB0YWJpbmRleD1cIjBcIiBbYXR0ci5hcmlhLXNvcnRdPVwiY29sdW1uU29ydFNldHRpbmdzW2NvbHVtbi5oZWFkZXJdXCI+XHJcbiAgICAgICAgICA8c3Bhbj57e2NvbHVtbi5oZWFkZXJ9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLWljb24gc21lLW1hcmdpbi1sZWZ0LXh4c1wiIFthdHRyLmFyaWEtbGFiZWxdPVwiY29sdW1uLnNvcnRhYmxlID8gZ2V0U29ydExhYmVsKGNvbHVtbikgOiBudWxsXCJcclxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtaWNvbi11cCc6Y29sdW1uLnNvcnRNb2RlPT09c29ydE1vZGVFbnVtLkFzY2VuZCwnc21lLWljb24tZG93bic6Y29sdW1uLnNvcnRNb2RlPT09c29ydE1vZGVFbnVtLkRlc2NlbmR9XCI+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhKGNvbHVtbi5zb3J0YWJsZSAmJiBjb2x1bW4uc29ydGFibGUhPSdmYWxzZScpICYmIHNob3dIZWFkZXJcIiBjbGFzcz1cInNtZS10YWJsZS1oZWFkZXItY2VsbFwiXHJcbiAgICAgICAgICByb2xlPVwiY29sdW1uaGVhZGVyXCIgW3RpdGxlXT1cImNvbHVtbi5oZWFkZXJcIj5cclxuICAgICAgICAgIDxzcGFuPnt7Y29sdW1uLmhlYWRlcn19PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtaWNvbiBzbWUtbWFyZ2luLWxlZnQteHhzXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJjb2x1bW4uc29ydGFibGUgPyBnZXRTb3J0TGFiZWwoY29sdW1uKSA6IG51bGxcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NtZS1pY29uLXVwJzpjb2x1bW4uc29ydE1vZGU9PT1zb3J0TW9kZUVudW0uQXNjZW5kLCdzbWUtaWNvbi1kb3duJzpjb2x1bW4uc29ydE1vZGU9PT1zb3J0TW9kZUVudW0uRGVzY2VuZH1cIj48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiFzaG93SGVhZGVyXCIgY2xhc3M9XCJzbWUtdGFibGUtaGVhZGVyLWNlbGxcIiByb2xlPVwiY29sdW1uaGVhZGVyXCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHNtZS1yZXNpemVyIHRhYmluZGV4PVwiMFwiICpuZ0lmPVwiY29sSW5kZXghPT1hY3R1YWxDb2x1bW5zLmxlbmd0aC0xICYmIHNob3dIZWFkZXJcIlxyXG4gICAgICAgICAgcmVzaXplckhvc3RTZWxlY3Rvcj1cImRpdi5zbWUtdGFibGUtaGVhZGVyXCIgKHJlc2l6ZWQpPVwib25Db2x1bW5SZXNpemVkKGNvbEluZGV4LCAkZXZlbnQpXCJcclxuICAgICAgICAgIFt2aXNpYmxlVG9TY3JlZW5SZWFkZXJdPVwidHJ1ZVwiIFtzaG93UmVzaXplckNvdmVyXT1cImZhbHNlXCIgb3JpZW50YXRpb249XCJsZWZ0XCJcclxuICAgICAgICAgIChyZXNpemluZyk9XCJvbkNvbHVtblJlc2l6aW5nKCRldmVudClcIiBjbGFzcz1cInNtZS1mb2N1cy16b25lXCI+PC9zbWUtcmVzaXplcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJzbWUtZm9jdXMtem9uZSBzbWUtdGFibGUtY29udGFpbmVyIHNtZS1kYXRhLXRhYmxlLXRyYW5zaXRpb25cIiAjY29udGVudCByb2xlPVwicHJlc2VudGF0aW9uXCJcclxuICBbY2xhc3Muc21lLXRhYmxlLW11bHRpLXNlbGVjdF09XCJzZWxlY3Rpb25Nb2RlPT09J211bHRpcGxlJ1wiIFtjbGFzcy5zbWUtdGFibGUtc2VsZWN0YWJsZV09XCJzZWxlY3RhYmxlXCJcclxuICBbY2xhc3Muc21lLW1hcmdpbi10b3Atbm9uZV09XCIhc2hvd0hlYWRlclwiIFtjbGFzcy5zbWUtdGFibGUtaW5kZW50ZWRdPVwic2hvd0xlZnRNYXJnaW5cIlxyXG4gIFtjbGFzcy5zbWUtdGFibGUtZ3JpZC1saW5lc109XCJzaG93R3JpZFwiXHJcbiAgW2NsYXNzLnNtZS10YWJsZS1zZWxlY3QtYWxsLWVuYWJsZWRdPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZScgJiYgc2hvd0FsbEl0ZW1DaGVja2JveFwiXHJcbiAgW2NsYXNzLnNtZS10YWJsZS1lZGl0YWJsZV09XCJlZGl0YWJsZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtc2Nyb2xsLWNvbnRhaW5lciBzbWUtbGF5b3V0LWFic29sdXRlIHNtZS1wb3NpdGlvbi1pbnNldC1ub25lXCJcclxuICAgIFtuZ0NsYXNzXT1cInsnc21lLWxheW91dC1hYnNvbHV0ZSBzbWUtcG9zaXRpb24taW5zZXQtbm9uZSc6IHNjcm9sbGFibGUsICdzbWUtc2Nyb2xsYWJsZSc6IHNob3VsZFNjcm9sbH1cIlxyXG4gICAgI3Njcm9sbENvbnRhaW5lciByb2xlPVwicm93Z3JvdXBcIj5cclxuICAgIDxkaXYgcm9sZT1cInJvd1wiIGNsYXNzPVwic21lLXRhYmxlLXJvdyBzbWUtdGFibGUtcm93LXBsYWNlaG9sZGVyXCIgI2VtcHR5TWVzc2FnZSB0YWJpbmRleD1cIjBcIlxyXG4gICAgICAqbmdJZj1cInNob3dOb1JlY29yZHNNZXNzYWdlKClcIiBkYXRhLXV0YS1pZD1cImVtcHR5LXRhYmxlLW1lc3NhZ2VcIj5cclxuICAgICAgPHNtZS1sb2FkaW5nLXdoZWVsICpuZ0lmPVwiaXNMb2FkaW5nIHx8ICFpc0NvbHVtbldpZHRoQ2FsY3VsYXRlZFwiIFttZXNzYWdlXT1cImxvYWRpbmdNZXNzYWdlXCI+XHJcbiAgICAgIDwvc21lLWxvYWRpbmctd2hlZWw+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2VsbCBzbWUtdGFibGUtY2VsbC1wbGFjZWhvbGRlclwiPiZuYnNwOzwvZGl2PlxyXG4gICAgICA8ZGl2IHJvbGU9XCJjZWxsXCIgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiPnt7Z2V0Tm9SZWNvcmRzTWVzc2FnZSgpfX08L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInNtZS1sYXlvdXQtcmVsYXRpdmUgc21lLXBvc2l0aW9uLXN0cmV0Y2gtaCBzbWUtYXJyYW5nZS1vdmVyZmxvdy1oaWRlXCIgI3Njcm9sbEJvZHkgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlIHNtZS10YWJsZS1zY3JvbGxhYmxlIHNtZS10YWJsZS12aXJ0dWFsaXplZFwiICNzY3JvbGxBYm92ZURhdGFcclxuICAgICAgICBbbmdTdHlsZV09XCJ7dG9wOiBzY3JvbGxBYm92ZURhdGFTdHlsZVRvcH1cIiBbYXR0ci5hcmlhLWhpZGRlbl09XCJ0cnVlXCIgc21lLWxpbnQtZGlzYWJsZT5cclxuICAgICAgICA8IS0tIEFib3ZlIHZpZXcgcG9ydCAtLT5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByZW5kZXJlZEl0ZW0gb2YgcmVuZGVyZWRJdGVtc0Fib3ZlVmlld1BvcnQ7IGxldCByb3dJbmRleCA9IGluZGV4XCJcclxuICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLXJvdyBzbWUtdGFibGUtcm93LWRhdGEgc21lLXRhYmxlLXJvdy1zZWxlY3RhYmxlXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtcm93LWFjdGl2ZV09XCJyZW5kZXJlZEl0ZW0uaW5kZXggPT09IGdldEFjdGl2ZVJlbmRlcmVkSXRlbUluZGV4KClcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1yb3ctc2VsZWN0ZWRdPVwicmVuZGVyZWRJdGVtLmluZGV4ID09PSBnZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpIHx8IGlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1ncm91cC1pdGVtXT1cInJlbmRlcmVkSXRlbS50eXBlID09PSByZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEl0ZW1cIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1ncm91cC1oZWFkZXJdPVwicmVuZGVyZWRJdGVtLnR5cGUgPT09IHJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLWFycmFuZ2Utc3RhY2staFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLXRkIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG9cIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd0FzVHJlZVwiIGNsYXNzPVwic21lLXRhYmxlLWNoZWNrYm94XCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxsYWJlbCByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGFjdHVhbENvbHVtbnM7IGxldCBjb2xJbmRleD1pbmRleFwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtdGFibGUtY29sdW1uLWZpcnN0JzogaXNGaXJzdERhdGFDb2x1bW4oY29sdW1uKSwgJ3NtZS10YWJsZS1ncm91cC1oZWFkZXItY2VsbCc6IHJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXJ9XCJcclxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J3dpZHRoJzpjb2x1bW4uZG9tV2lkdGgrJ3B4J31cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLXRkIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG8ge3tjb2x1bW4uc3R5bGVDbGFzc319XCJcclxuICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJpc1RyZWVUYWJsZVBhcmVudE5vZGUocmVuZGVyZWRJdGVtKSA/IC0xIDogMFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtc2NyZWVuLXJlYWRlciBzbWUtc2NyZWVuLXJlYWRlci1kaXNhYmxlLWNvcHlcIiAqbmdJZj1cImlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbilcIj5cclxuICAgICAgICAgICAgICAgIHt7Z2V0QWRkaXRpb25hbFNjcmVlblJlY29yZGVyQ29udGVudChyZW5kZXJlZEl0ZW0pfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiBjb2xJbmRleD09PTBcIiBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0dyb3VwVG9nZ2xlKHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidXNlR3JvdXBUb2dnbGVcIiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXNpemUteHhzIHNtZS1tYXJnaW4tcmlnaHQteHhzXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtaWNvbi1jaGV2cm9uRG93bic6aXNHcm91cEV4cGFuZGVkKHJlbmRlcmVkSXRlbS5kYXRhKSwgJ3NtZS1pY29uLWNoZXZyb25SaWdodCc6IWlzR3JvdXBFeHBhbmRlZChyZW5kZXJlZEl0ZW0uZGF0YSl9XCI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAge3tyZW5kZXJlZEl0ZW0uZGF0YX19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyIFt0ZW1wbGF0ZV09XCJ0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGVcIiBbZGF0YV09XCJyZW5kZXJlZEl0ZW0uZGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3NtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uVHJlZU5vZGUgJiYgIXJlbmRlcmVkSXRlbS5ub2RlLmlzQnVzeSAmJiBjb2xJbmRleD09PTBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbFwiIFtuZ1N0eWxlXT1cInsncGFkZGluZy1sZWZ0JzoocmVuZGVyZWRJdGVtLmRlcHRoKjE2KzQpKydweCd9XCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWV4cGFuZGFibGUnOiByZW5kZXJlZEl0ZW0uaGFzQ2hpbGRyZW4gJiYgIXJlbmRlcmVkSXRlbS5ub2RlLmlzTGVhZn1cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLWljb24gc21lLWljb24tc2l6ZS14eHNcIiByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZD8ndHJ1ZSc6J2ZhbHNlJ1wiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja1RyZWVUb2dnbGUoJGV2ZW50LCByZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtaWNvbi1jaGV2cm9uRG93bic6cmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQsICdzbWUtaWNvbi1jaGV2cm9uUmlnaHQnOiFyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZH1cIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkID8gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLmNvbGxhcHNlIDogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLmV4cGFuZFwiPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbC1wbGFjZWhvbGRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5UcmVlTm9kZSAmJiByZW5kZXJlZEl0ZW0ubm9kZS5pc0J1c3kgJiYgY29sSW5kZXg9PT0wXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWV4cGFuZGVyLWNlbGxcIiBbbmdTdHlsZV09XCJ7J3BhZGRpbmctbGVmdCc6KHJlbmRlcmVkSXRlbS5kZXB0aCoxNis0KSsncHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgPHNtZS1sb2FkaW5nLXdoZWVsIHNpemU9XCJleHRyYS1zbWFsbFwiIFtpbmxpbmVdPVwidHJ1ZVwiIFtpc0JhY2tncm91bmRUcmFuc3BhcmVudF09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8L3NtZS1sb2FkaW5nLXdoZWVsPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbC1wbGFjZWhvbGRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dBc1RyZWUgJiYgc2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZScgJiYgcmVuZGVyZWRJdGVtLnR5cGU9PXJlbmRlcmVkSXRlbVR5cGVFbnVtLlRyZWVOb2RlICYmIGNvbEluZGV4PT0wXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGwgc21lLXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2hlY2tib3hcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uSXRlbUNoZWNrQm94Q2xpY2tlZChyZW5kZXJlZEl0ZW0pXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFlZGl0YWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2x1bW4uYm9keVRlbXBsYXRlICYmIHJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIiBbY2xhc3Muc21lLXRhYmxlLWNlbGwtZnVsbC1oZWlnaHRdPVwiYXV0b1Jvd0hlaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICB7e3JlbmRlcmVkSXRlbS5kYXRhP3Jlc29sdmVPYmplY3RQYXRoKHJlbmRlcmVkSXRlbS5kYXRhLGNvbHVtbi5maWVsZCk6Jy4nfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiByZW5kZXJlZEl0ZW0uZGF0YSAmJiBjb2x1bW4uYm9keVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWZ1bGwtaGVpZ2h0XT1cImF1dG9Sb3dIZWlnaHRcIiBbY2xhc3Muc21lLXRhYmxlLWNlbGwtaGVpZ2h0LWF1dG9dPVwiYXV0b1Jvd0hlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIj5cclxuICAgICAgICAgICAgICAgICAgPHNtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlciAqbmdJZj1cIiFyZW5kZXJlZEl0ZW0uZGF0YS5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cImNvbHVtbi5ib2R5VGVtcGxhdGVcIiBbZGF0YV09XCJyZW5kZXJlZEl0ZW0uZGF0YVwiIFtyb3dJbmRleF09XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3NtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZSBzbWUtdGFibGUtc2Nyb2xsYWJsZVwiICNzY3JvbGxEYXRhIFtjbGFzcy5zbWUtdGFibGUtdmlydHVhbGl6ZWRdPVwiIWRpc2FibGVVSVZpcnR1YWxpemF0aW9uXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7dG9wOiBzY3JvbGxEYXRhU3R5bGVUb3B9XCIgc21lLWxpbnQtZGlzYWJsZSByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcmVuZGVyZWRJdGVtIG9mIHJlbmRlcmVkSXRlbXNJbkFuZEJlbG93Vmlld1BvcnQ7IGxldCByb3dJbmRleCA9IGluZGV4XCJcclxuICAgICAgICAgIChrZXlkb3duKT1cIm9uQ29udGVudFRhYmxlUHJlc3NlZCgkZXZlbnQpXCIgKGtleXVwKT1cIm9uQ29udGVudFRhYmxlS2V5VXAoJGV2ZW50KVwiXHJcbiAgICAgICAgICAoY29udGV4dG1lbnUpPVwiZW5hYmxlUmlnaHRDbGlja1NlbGVjdCA/IHNlbGVjdEl0ZW0oJGV2ZW50LCByZW5kZXJlZEl0ZW0pIDogdHJ1ZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0SXRlbSgkZXZlbnQsIHJlbmRlcmVkSXRlbSlcIiBjbGFzcz1cInNtZS10YWJsZS1yb3cgc21lLXRhYmxlLXJvdy1kYXRhIHNtZS10YWJsZS1yb3ctc2VsZWN0YWJsZVwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLXRhYmxlLXJvdy1hY3RpdmVdPVwicmVuZGVyZWRJdGVtLmluZGV4ID09PSBnZXRBY3RpdmVSZW5kZXJlZEl0ZW1JbmRleCgpXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtcm93LXNlbGVjdGVkXT1cInJlbmRlcmVkSXRlbS5pbmRleCA9PT0gZ2V0QWN0aXZlUmVuZGVyZWRJdGVtSW5kZXgoKSB8fCBpc0l0ZW1TZWxlY3RlZChyZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtZ3JvdXAtaXRlbV09XCJyZW5kZXJlZEl0ZW0udHlwZSA9PT0gcmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBJdGVtXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtZ3JvdXAtaGVhZGVyXT1cInJlbmRlcmVkSXRlbS50eXBlID09PSByZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlclwiXHJcbiAgICAgICAgICBbY2xhc3Muc21lLWNoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiIFtjbGFzcy5zbWUtdGFibGUtcm93LWVkaXRhYmxlXT1cImVkaXRhYmxlXCJcclxuICAgICAgICAgIFtjbGFzcy5zbWUtaGFzLXZhbGlkYXRpb24tZXJyb3JdPVwiaGFzVmFsaWRhdGlvbkVycm9yKHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgW2NsYXNzLnNtZS1kYXRhLXRhYmxlLXJvdy1uZXctaXRlbV09XCJyZW5kZXJlZEl0ZW0/LmRhdGE/LmlzTmV3Um93XCJcclxuICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInJlbmRlcmVkSXRlbS5pbmRleCA+PSAwID8gMCA6IHVuZGVmaW5lZFwiIChkYmxjbGljayk9XCJkb3VibGVDbGlja1JvdygkZXZlbnQscmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICAoZm9jdXMpPVwib25Db250ZW50SXRlbUZvY3VzZWQoJGV2ZW50LCByZW5kZXJlZEl0ZW0pXCIgKGZvY3VzaW4pPVwib25Db250ZW50SXRlbUZvY3VzZWQoJGV2ZW50LCByZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgIChmb2N1c291dCk9XCJvbkNvbnRlbnRJdGVtQmx1cnJlZCgkZXZlbnQsIHJlbmRlcmVkSXRlbSlcIiBbYXR0ci5kYXRhLXJlbmRlcmVkLWl0ZW0taW5kZXhdPVwicmVuZGVyZWRJdGVtLmluZGV4XCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtcm93aW5kZXhdPVwicmVuZGVyZWRJdGVtLmluZGV4KzJcIiBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzSXRlbVNlbGVjdGVkKHJlbmRlcmVkSXRlbSk/J3RydWUnOidmYWxzZSdcIlxyXG4gICAgICAgICAgKG1vdXNlZW50ZXIpPVwic2V0SG92ZXJlZFJlbmRlcmVkSXRlbShyZW5kZXJlZEl0ZW0pXCIgKG1vdXNlbGVhdmUpPVwidW5zZXRIb3ZlcmVkUmVuZGVyZWRJdGVtKHJlbmRlcmVkSXRlbSlcIlxyXG4gICAgICAgICAgcm9sZT1cInJvd1wiIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiZ2V0QXJpYUV4cGFuZGVkQXR0cmlidXRlVmFsdWUocmVuZGVyZWRJdGVtKVwiXHJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxldmVsXT1cInNob3dBc1RyZWUgJiYgcmVuZGVyZWRJdGVtLmRlcHRoID8gKHJlbmRlcmVkSXRlbS5kZXB0aCsxKTp1bmRlZmluZWRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtYXJyYW5nZS1zdGFjay1oXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21lLXRhYmxlLXRkIHNtZS1wb3NpdGlvbi1mbGV4LWF1dG9cIlxyXG4gICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwic2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZScgPyBnZXRSb2xlQXR0cmlidXRlRm9yVGFibGVSb3dDZWxsKHJlbmRlcmVkSXRlbSkgOiAncHJlc2VudGF0aW9uJ1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd0FzVHJlZVwiIGNsYXNzPVwic21lLXRhYmxlLWNlbGwgc21lLXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIlxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLnNtZS10YWJsZS1jZWxsLWZ1bGwtaGVpZ2h0XT1cImF1dG9Sb3dIZWlnaHRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2hlY2tib3hcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKT8ndHJ1ZSc6J2ZhbHNlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImlkQmFnLmZpcnN0RGF0YUNvbHVtbiArIHJlbmRlcmVkSXRlbS5pbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiIChjaGFuZ2UpPVwib25JdGVtQ2hlY2tCb3hDbGlja2VkKHJlbmRlcmVkSXRlbSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBhY3R1YWxDb2x1bW5zOyBsZXQgY29sSW5kZXg9aW5kZXhcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLXRhYmxlLWNvbHVtbi1maXJzdCc6IGlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbiksICdzbWUtdGFibGUtZ3JvdXAtaGVhZGVyLWNlbGwnOiByZW5kZXJlZEl0ZW0udHlwZT09PXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyfVwiXHJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyd3aWR0aCc6Y29sdW1uLmRvbVdpZHRoKydweCd9XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS10ZCBzbWUtcG9zaXRpb24tZmxleC1hdXRvIHt7Y29sdW1uLnN0eWxlQ2xhc3N9fVwiXHJcbiAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCJnZXRSb2xlQXR0cmlidXRlRm9yVGFibGVSb3dDZWxsKHJlbmRlcmVkSXRlbSlcIiBbYXR0ci5hcmlhLXJvd2luZGV4XT1cInJlbmRlcmVkSXRlbS5pbmRleCsyXCJcclxuICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJpc1RyZWVUYWJsZVBhcmVudE5vZGUocmVuZGVyZWRJdGVtKSA/IC0xIDogMFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtc2NyZWVuLXJlYWRlciBzbWUtc2NyZWVuLXJlYWRlci1kaXNhYmxlLWNvcHlcIiAqbmdJZj1cImlzRmlyc3REYXRhQ29sdW1uKGNvbHVtbilcIj5cclxuICAgICAgICAgICAgICAgIHt7Z2V0QWRkaXRpb25hbFNjcmVlblJlY29yZGVyQ29udGVudChyZW5kZXJlZEl0ZW0pfX08L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiBjb2xJbmRleD09PTBcIiBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0dyb3VwVG9nZ2xlKHJlbmRlcmVkSXRlbSlcIiBbaWRdPVwiZ2V0Rmlyc3RDb2x1bW5JZChjb2x1bW4sIHJlbmRlcmVkSXRlbSlcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidXNlR3JvdXBUb2dnbGVcIiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXNpemUteHhzIHNtZS1tYXJnaW4tcmlnaHQteHhzXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtaWNvbi1jaGV2cm9uRG93bic6aXNHcm91cEV4cGFuZGVkKHJlbmRlcmVkSXRlbS5kYXRhKSwgJ3NtZS1pY29uLWNoZXZyb25SaWdodCc6IWlzR3JvdXBFeHBhbmRlZChyZW5kZXJlZEl0ZW0uZGF0YSl9XCI+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiF0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAge3tyZW5kZXJlZEl0ZW0uZGF0YX19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInRoaXMuZ3JvdXBIZWFkZXJUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyIFt0ZW1wbGF0ZV09XCJ0aGlzLmdyb3VwSGVhZGVyVGVtcGxhdGVcIiBbZGF0YV09XCJyZW5kZXJlZEl0ZW0uZGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3NtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlPT09cmVuZGVyZWRJdGVtVHlwZUVudW0uVHJlZU5vZGUgJiYgIXJlbmRlcmVkSXRlbS5ub2RlLmlzQnVzeSAmJiBjb2xJbmRleD09PTBcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbFwiIFtuZ1N0eWxlXT1cInsncGFkZGluZy1sZWZ0JzoocmVuZGVyZWRJdGVtLmRlcHRoKjE2KzQpKydweCd9XCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnc21lLWV4cGFuZGFibGUnOiByZW5kZXJlZEl0ZW0uaGFzQ2hpbGRyZW4gJiYgIXJlbmRlcmVkSXRlbS5ub2RlLmlzTGVhZn1cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic21lLWljb24gc21lLWljb24tc2l6ZS14eHNcIiByb2xlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZD8ndHJ1ZSc6J2ZhbHNlJ1wiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja1RyZWVUb2dnbGUoJGV2ZW50LCByZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzbWUtaWNvbi1jaGV2cm9uRG93bic6cmVuZGVyZWRJdGVtLm5vZGUuZXhwYW5kZWQsICdzbWUtaWNvbi1jaGV2cm9uUmlnaHQnOiFyZW5kZXJlZEl0ZW0ubm9kZS5leHBhbmRlZH1cIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInJlbmRlcmVkSXRlbS5ub2RlLmV4cGFuZGVkID8gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLmNvbGxhcHNlIDogdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkRhdGFUYWJsZS5hcmlhLmxhYmVsLmV4cGFuZFwiPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbC1wbGFjZWhvbGRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGU9PT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5UcmVlTm9kZSAmJiByZW5kZXJlZEl0ZW0ubm9kZS5pc0J1c3kgJiYgY29sSW5kZXg9PT0wXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWV4cGFuZGVyLWNlbGxcIiBbbmdTdHlsZV09XCJ7J3BhZGRpbmctbGVmdCc6KHJlbmRlcmVkSXRlbS5kZXB0aCoxNis0KSsncHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgPHNtZS1sb2FkaW5nLXdoZWVsIHNpemU9XCJleHRyYS1zbWFsbFwiIFtpbmxpbmVdPVwidHJ1ZVwiIFtpc0JhY2tncm91bmRUcmFuc3BhcmVudF09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8L3NtZS1sb2FkaW5nLXdoZWVsPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtdGFibGUtZXhwYW5kZXItY2VsbC1wbGFjZWhvbGRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2XHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dBc1RyZWUgJiYgc2VsZWN0aW9uTW9kZT09PSdtdWx0aXBsZScgJiYgcmVuZGVyZWRJdGVtLnR5cGU9PXJlbmRlcmVkSXRlbVR5cGVFbnVtLlRyZWVOb2RlICYmIGNvbEluZGV4PT0wXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGwgc21lLXRhYmxlLWNoZWNrYm94LWNvbnRhaW5lclwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2hlY2tib3hcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbYXR0ci5hcmlhLWNoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKT8ndHJ1ZSc6J2ZhbHNlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImlkQmFnLmZpcnN0RGF0YUNvbHVtbiArIHJlbmRlcmVkSXRlbS5pbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiaXNJdGVtU2VsZWN0ZWQocmVuZGVyZWRJdGVtKVwiIChjaGFuZ2UpPVwib25JdGVtQ2hlY2tCb3hDbGlja2VkKHJlbmRlcmVkSXRlbSlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWVkaXRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbHVtbi5ib2R5VGVtcGxhdGUgJiYgcmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiIFtjbGFzcy5zbWUtdGFibGUtY2VsbC1mdWxsLWhlaWdodF09XCJhdXRvUm93SGVpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgW2lkXT1cImdldEZpcnN0Q29sdW1uSWQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImdldENvbHVtblRvb2x0aXBUZXh0KGNvbHVtbiwgcmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e3JlbmRlcmVkSXRlbS5kYXRhP3Jlc29sdmVPYmplY3RQYXRoKHJlbmRlcmVkSXRlbS5kYXRhLGNvbHVtbi5maWVsZCk6Jy4nfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyZW5kZXJlZEl0ZW0udHlwZSE9cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXIgJiYgcmVuZGVyZWRJdGVtLmRhdGEgJiYgY29sdW1uLmJvZHlUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIiBbY2xhc3Muc21lLXRhYmxlLWNlbGwtaGVpZ2h0LWF1dG9dPVwiYXV0b1Jvd0hlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zbWUtdGFibGUtY2VsbC1mdWxsLWhlaWdodF09XCJhdXRvUm93SGVpZ2h0XCIgW2lkXT1cImdldEZpcnN0Q29sdW1uSWQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImdldENvbHVtblRvb2x0aXBUZXh0KGNvbHVtbiwgcmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyICpuZ0lmPVwiIXJlbmRlcmVkSXRlbS5kYXRhLnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sdW1uLmJvZHlUZW1wbGF0ZVwiIFtkYXRhXT1cInJlbmRlcmVkSXRlbS5kYXRhXCIgW3Jvd0luZGV4XT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvc21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVkaXRhYmxlICYmICFjb2x1bW4uYm9keUVkaXRUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFjb2x1bW4uYm9keVJlYWRUZW1wbGF0ZSAmJiByZW5kZXJlZEl0ZW0udHlwZSE9cmVuZGVyZWRJdGVtVHlwZUVudW0uR3JvdXBIZWFkZXJcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImdldENvbHVtblRvb2x0aXBUZXh0KGNvbHVtbiwgcmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICB7e3JlbmRlcmVkSXRlbS5kYXRhP3Jlc29sdmVPYmplY3RQYXRoKHJlbmRlcmVkSXRlbS5kYXRhLmNvbnRlbnQsY29sdW1uLmZpZWxkKTonLid9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInJlbmRlcmVkSXRlbS50eXBlIT1yZW5kZXJlZEl0ZW1UeXBlRW51bS5Hcm91cEhlYWRlciAmJiByZW5kZXJlZEl0ZW0uZGF0YSAmJiBjb2x1bW4uYm9keVJlYWRUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic21lLXRhYmxlLWNlbGxcIlxyXG4gICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZ2V0Q29sdW1uVG9vbHRpcFRleHQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXIgKm5nSWY9XCIhcmVuZGVyZWRJdGVtLmRhdGEucGxhY2Vob2xkZXJcIiBbcmVuZGVyZWRJdGVtXT1cInJlbmRlcmVkSXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlXT1cImNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlXCIgW2RhdGFdPVwicmVuZGVyZWRJdGVtLmRhdGEuY29udGVudFwiIFtyb3dJbmRleF09XCJyb3dJbmRleFwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3NtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlZGl0YWJsZSAmJiBjb2x1bW4uYm9keUVkaXRUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzaG91bGRTaG93RWRpdFJvdyhyZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhY29sdW1uLmJvZHlSZWFkVGVtcGxhdGUgJiYgcmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZ2V0Q29sdW1uVG9vbHRpcFRleHQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tyZW5kZXJlZEl0ZW0uZGF0YT9yZXNvbHZlT2JqZWN0UGF0aChyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50LGNvbHVtbi5maWVsZCk6Jy4nfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicmVuZGVyZWRJdGVtLnR5cGUhPXJlbmRlcmVkSXRlbVR5cGVFbnVtLkdyb3VwSGVhZGVyICYmIHJlbmRlcmVkSXRlbS5kYXRhICYmIGNvbHVtbi5ib2R5UmVhZFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiZ2V0Q29sdW1uVG9vbHRpcFRleHQoY29sdW1uLCByZW5kZXJlZEl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlciAqbmdJZj1cIiFyZW5kZXJlZEl0ZW0uZGF0YS5wbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sdW1uLmJvZHlSZWFkVGVtcGxhdGVcIiBbZGF0YV09XCJyZW5kZXJlZEl0ZW0uZGF0YS5jb250ZW50XCIgW3Jvd0luZGV4XT1cInJvd0luZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zbWUtZGF0YS10YWJsZS10ZW1wbGF0ZS1sb2FkZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvdWxkU2hvd0VkaXRSb3cocmVuZGVyZWRJdGVtKVwiIGNsYXNzPVwic21lLXRhYmxlLWNlbGwgc21lLXRhYmxlLWVkaXQtY29udGFpbmVyXCJcclxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cImdldENvbHVtblRvb2x0aXBUZXh0KGNvbHVtbiwgcmVuZGVyZWRJdGVtKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c21lLWRhdGEtdGFibGUtdGVtcGxhdGUtbG9hZGVyICpuZ0lmPVwiIXJlbmRlcmVkSXRlbS5kYXRhLnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVdPVwiY29sdW1uLmJvZHlFZGl0VGVtcGxhdGVcIiBbZmllbGRdPVwiY29sdW1uLmZpZWxkXCIgW2RhdGFdPVwicmVuZGVyZWRJdGVtLmRhdGEuY29udGVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd0luZGV4XT1cInJvd0luZGV4XCIgW3JlbmRlcmVkSXRlbV09XCJyZW5kZXJlZEl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWxpZGF0aW9uQWxlcnQpPVwib25WYWxpZGF0aW9uQWxlcnRIYW5kbGVyKHJlbmRlcmVkSXRlbSwgY29sdW1uLmZpZWxkLCAkZXZlbnQuYWxlcnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAoZGF0YUNoYW5nZWQpPVwib25FZGl0YWJsZURhdGFDaGFuZ2VkKCRldmVudC5yZW5kZXJlZEl0ZW0sJGV2ZW50LmZpZWxkKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3NtZS1kYXRhLXRhYmxlLXRlbXBsYXRlLWxvYWRlcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImhhc1ZhbGlkYXRpb25FcnJvcihyZW5kZXJlZEl0ZW0pXCIgY2xhc3M9XCJzbWUtdGFibGUtcm93LXZhbGlkYXRpb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS10ZCBzbWUtcG9zaXRpb24tZmxleC1hdXRvXCJcclxuICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnID8gZ2V0Um9sZUF0dHJpYnV0ZUZvclRhYmxlUm93Q2VsbChyZW5kZXJlZEl0ZW0pIDogJ3ByZXNlbnRhdGlvbidcIlxyXG4gICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInNlbGVjdGlvbk1vZGU9PT0nbXVsdGlwbGUnPycwJzondW5kZWZpbmVkJ1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtY2VsbFwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHZhbGlkYXRpb25SZXN1bHRJdGVtIG9mIHJlbmRlcmVkSXRlbS52YWxpZGF0aW9uUmVzdWx0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzbWUtdmFsaWRhdGlvbi1hbGVydCBbYWxlcnRdPVwidmFsaWRhdGlvblJlc3VsdEl0ZW0uYWxlcnRcIj48L3NtZS12YWxpZGF0aW9uLWFsZXJ0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1yb3dcIiAjdGVtcFJvdz5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWUtdGFibGUtdGRcIiB0YWJpbmRleD1cIjBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtZS10YWJsZS1jZWxsXCI+Jm5ic3A7PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJzaG91bGRVc2VMYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudFwiICNsYXN0Rm9jdXNhYmxlU2hhZG93RWxlbWVudCBjbGFzcz1cInNtZS1mb2N1cy16b25lXCJcclxuICAgICAgZGF0YS1zbWUtbGFzdC1mb2N1c2FibGUtc2hhZG93LWVsZW1lbnQgKGZvY3VzKT1cIm9uTGFzdEZvY3VzYWJsZVNoYWRvd0VsZW1lbnRGb2N1c2VkKCRldmVudClcIiB0YWJpbmRleD1cIjBcIj48L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwic21lLWxheW91dC1hYnNvbHV0ZSBzbWUtcG9zaXRpb24taW5zZXQtbm9uZVwiXHJcbiAgICAqbmdJZj1cImlzQnVzeSB8fCAodGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2sgJiYgdGhpcy5ub2RlTmF2aWdhdGluZ1Rhc2suaXNSdW5uaW5nKVwiPlxyXG4gICAgPHNtZS1sb2FkaW5nLXdoZWVsIFtpc0JhY2tncm91bmRUcmFuc3BhcmVudF09XCJ0cnVlXCI+PC9zbWUtbG9hZGluZy13aGVlbD5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgI3Jlc2l6ZXJJbmRpY2F0b3JcclxuICBjbGFzcz1cInNtZS13aWR0aC14eHMgc21lLWxheW91dC1hYnNvbHV0ZSBzbWUtcG9zaXRpb24tc3RyZXRjaC12IHNtZS1iYWNrZ3JvdW5kLWNvbG9yLWJhc2UtODAgc21lLWxheWVyLWZseW91dCBzbWUtbGF5b3V0LW5vbmVcIj5cclxuPC9kaXY+XHJcbiJdfQ==
|