mmhglobal-dynamicform 2.41.1 → 2.41.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/esm2020/lib/services/main.service.mjs +7 -6
- package/esm2020/lib/uicontent/uicontent.component.mjs +1 -2
- package/esm2020/lib/zgrid/zgrid.component.mjs +2 -2
- package/fesm2015/mmhglobal-dynamicform.mjs +7 -7
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -1
- package/fesm2020/mmhglobal-dynamicform.mjs +7 -7
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -57,7 +57,7 @@ export class MainService {
|
|
|
57
57
|
};
|
|
58
58
|
console.log('MainService constructor');
|
|
59
59
|
this.environment = this.zcoreService.getEnvironment();
|
|
60
|
-
this.oauthEnvironmentUrl = this.
|
|
60
|
+
this.oauthEnvironmentUrl = this.zcoreService.getOauthUrl();
|
|
61
61
|
this.router.events.subscribe((event) => {
|
|
62
62
|
if (event instanceof NavigationStart) {
|
|
63
63
|
this.handleNavigationStart(event);
|
|
@@ -95,14 +95,15 @@ export class MainService {
|
|
|
95
95
|
console.log(event);
|
|
96
96
|
}
|
|
97
97
|
handleNavigationError(event) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
this.updateAppMonPerformance(TriggerFromType.navigateError, this.previousUrl, false, duration).subscribe();
|
|
101
|
-
}
|
|
98
|
+
const duration = performance.now() - this.navigationStartTime;
|
|
99
|
+
this.updateAppMonPerformance(TriggerFromType.navigateError, this.previousUrl, false, duration).subscribe();
|
|
102
100
|
console.log(event.error);
|
|
103
101
|
this.removeLastNavigateRecord();
|
|
104
102
|
}
|
|
105
103
|
updateAppMonPerformance(triggerType, url, isSuccess, duration) {
|
|
104
|
+
if (this.environment.skipAppmon) {
|
|
105
|
+
return of({});
|
|
106
|
+
}
|
|
106
107
|
// Initialize appmonDomainUrl if missing
|
|
107
108
|
if (!this.resourceApiService.appmonDomainUrl) {
|
|
108
109
|
this.resourceApiService.appmonDomainUrl = sessionStorage.getItem('AppmonDomainUrl') || '';
|
|
@@ -1306,4 +1307,4 @@ export function refreshGrid(group) {
|
|
|
1306
1307
|
}
|
|
1307
1308
|
group.isTriggered = false;
|
|
1308
1309
|
}
|
|
1309
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvc2VydmljZXMvbWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFpQyxNQUFNLGlCQUFpQixDQUFDO0FBS2pILDhCQUE4QjtBQUM5QixPQUFPLEVBQWMsZUFBZSxFQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFRLE1BQU0sTUFBTSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBTy9ELE9BQU8sRUFDUSxXQUFXLEVBQWdCLGdCQUFnQixFQUVYLE1BQU0sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUF1QyxlQUFlLEVBRTFKLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7O0FBTXpCLE1BQU0sT0FBTyxXQUFXO0lBbUJ0QixZQUNVLE1BQWMsRUFDZCxjQUE4QixFQUM5QixTQUEwQixFQUMxQixhQUE0QixFQUM1QixZQUEwQixFQUMxQixZQUEwQixFQUMxQixZQUEwQixFQUMxQixrQkFBc0MsRUFDdEMsNEJBQTBELEVBQzFELGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLGNBQXFDLEVBQ3JDLFlBQW9DLEVBQ3BDLGtCQUFzQyxFQUN0QyxjQUE4QixFQUM5QixhQUE0QixFQUM1QixhQUE0QixFQUM1QixZQUEwQixFQUMxQixXQUF3QixFQUN4QixXQUF3QjtRQXBCeEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1C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LElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pDO0lBQ0gsQ0FBQzs7d0dBcmlEVSxXQUFXOzRHQUFYLFdBQVcsY0FIVixNQUFNOzJGQUdQLFdBQVc7a0JBSnZCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COztBQTBpREQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFhO0lBQ3ZDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQVUsQ0FBQztJQUNuRCxJQUFJLFlBQVksRUFBRTtRQUNoQixZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDeEI7SUFDRCxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnRSZWYsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uU3RhcnQsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25FcnJvciwgUm91dGVyLCBFdmVudCwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuLyoqKioqKioqKiogSW9uaWMgKioqKioqKioqKi9cclxuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBOYXZDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBvZiwgZm9ya0pvaW4sIGZyb20gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFwLCBzd2l0Y2hNYXAsIG1hcCwgbWVyZ2VBbGwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IERpYWxvZ1JlZiwgRGlhbG9nU2VydmljZSwgRGlhbG9nU2V0dGluZ3MgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kaWFsb2cnO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50RGVidWdTZXJ2aWNlIH0gZnJvbSAnLi96Y29tcG9uZW50LmRlYnVnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBaR3JpZCB9IGZyb20gJy4uL3pncmlkL3pncmlkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1vZGFsU2VydmljZSwgTW9kYWxSZXNwb25zZSB9IGZyb20gJ21taGdsb2JhbC16bW9kYWwnO1xyXG5pbXBvcnQge1xyXG4gIEFsZXJ0QnV0dG9uLCBNRVNTQUdFVFlQRSwgQWxlcnRTZXJ2aWNlLCBaQ29tcG9uZW50SGVscGVyLCBNb2RhbFBhZ2VQYXJhbXMsXHJcbiAgQ2FjaGVTZXJ2aWNlLCBGaWVsZFNlcnZpY2UsIFJlc291cmNlQXBpU2VydmljZSwgVHJhbnNsYXRpb25TZXJ2aWNlLCBXZWJBcGlTZXJ2aWNlLCBTdG9yYWdlU2Vzc2lvblNlcnZpY2UsIE9BdXRoMlNlcnZpY2UsIFNpZ25hbHJTZXJ2aWNlLCBDb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlLFxyXG4gIFpDb21wb25lbnRPdXRwdXRFdmVudCwgWkNvcmVTZXJ2aWNlLCBaRmllbGQsIFpHcm91cCwgRGVmYXVsdE1lc3NhZ2UsIERlZmF1bHREaWFsb2dUaXRsZSwgQWN0aW9uVHlwZSwgVG9hc3RTZXJ2aWNlLCBBdXRoU2VydmljZSwgRm9ybVR5cGUsIFRyaWdnZXJGcm9tVHlwZSxcclxuICBXZWJBcGlBZGRpdGlvbmFsRGV0YWlsLCBNZW51U2VydmljZSwgT0F1dGhNZW51SXRlbVxyXG59IGZyb20gJ21taGdsb2JhbC16Y29yZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIE1haW5TZXJ2aWNlIHtcclxuICBwcml2YXRlIGdyb3VwOiBaR3JvdXA7XHJcbiAgcHJpdmF0ZSBvYXV0aEVudmlyb25tZW50VXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBlbnZpcm9ubWVudDtcclxuICBwcml2YXRlIGJhY2tOYXZpZ2F0aW9uUGF0aDogc3RyaW5nW10gPSBbXTtcclxuICBwcml2YXRlIHJvdXRlUGFyYW06IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSBwcmV2aW91c1JvdXRlUGFyYW06IHN0cmluZztcclxuICBwdWJsaWMgY3VycmVudFVybDogc3RyaW5nID0gJyc7XHJcblxyXG4gIHByaXZhdGUgTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVkgPSAncm91dGVQYXJhbSc7XHJcbiAgcHJpdmF0ZSBQUkVWSU9VU19QQUdFX1JPVVRFX1BBUkFNX1NUT1JBR0VfS0VZID0gJ3ByZXZpb3VzUGFnZVJvdXRlUGFyYW0nO1xyXG4gIHByaXZhdGUgQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVkgPSAnYmFja05hdmlnYXRpb25QYXRoJztcclxuICBwcml2YXRlIE5BVklHQVRFRF9SRUxPQURfR1JJRF9TVE9SQUdFX0tFWSA9ICduYXZpZ2F0ZWRSZWxvYWRHcmlkJztcclxuICBwcml2YXRlIENMT05FX05FV19NT0RFTF9DQUNIRV9LRVkgPSAnY2xvbmVOZXdNb2RlbCc7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjcmV0S2V5ID0gJ215LXNlY3JldC1rZXknO1xyXG4gIHByaXZhdGUgcHJldmlvdXNVcmw6IHN0cmluZztcclxuICBwcml2YXRlIG5hdmlnYXRpb25TdGFydFRpbWU6IG51bWJlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLFxyXG4gICAgcHJpdmF0ZSBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyLFxyXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgY2FjaGVTZXJ2aWNlOiBDYWNoZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpZWxkU2VydmljZTogRmllbGRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZXNvdXJjZUFwaVNlcnZpY2U6IFJlc291cmNlQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgY29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZTogQ29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgemNvcmVTZXJ2aWNlOiBaQ29yZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlc3Npb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkZWJ1Z1NlcnZpY2U6IFpDb21wb25lbnREZWJ1Z1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0aW9uU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzaWduYWxyU2VydmljZTogU2lnbmFsclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIG9hdXRoMlNlcnZpY2U6IE9BdXRoMlNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1lbnVTZXJ2aWNlOiBNZW51U2VydmljZVxyXG4gICkge1xyXG4gICAgY29uc29sZS5sb2coJ01haW5TZXJ2aWNlIGNvbnN0cnVjdG9yJyk7XHJcbiAgICB0aGlzLmVudmlyb25tZW50ID0gdGhpcy56Y29yZVNlcnZpY2UuZ2V0RW52aXJvbm1lbnQoKTtcclxuICAgIHRoaXMub2F1dGhFbnZpcm9ubWVudFVybCA9IHRoaXMuZW52aXJvbm1lbnQuZTFPYXV0aFVybCArICcvJztcclxuICAgIHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZU5hdmlnYXRpb25TdGFydChldmVudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZU5hdmlnYXRpb25FbmQoZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZU5hdmlnYXRpb25FcnJvcihldmVudCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgZGlzbWlzc0FsbE92ZXJsYXlzKCk6IHZvaWQge1xyXG4gICAgdGhpcy50b2FzdFNlcnZpY2U/LmRpc21pc3NBbGwoKTtcclxuICAgIHRoaXMuYWxlcnRTZXJ2aWNlPy5kaXNtaXNzQWxsKCk7XHJcbiAgICB0aGlzLm1vZGFsU2VydmljZT8uZGlzbWlzc0FsbCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVOYXZpZ2F0aW9uU3RhcnQoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG5cclxuICAgIHRoaXMubmF2aWdhdGlvblN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgdGhpcy5wcmV2aW91c1VybCA9IHRoaXMuY3VycmVudFVybCB8fCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XHJcbiAgICB0aGlzLmN1cnJlbnRVcmwgPSBldmVudC51cmw7XHJcblxyXG4gICAgY29uc3QgdHJpZ2dlclR5cGUgPSB0aGlzLnByZXZpb3VzVXJsID09PSB0aGlzLmN1cnJlbnRVcmwgPyBUcmlnZ2VyRnJvbVR5cGUucmVmcmVzaFN0YXJ0IDogVHJpZ2dlckZyb21UeXBlLm5hdmlnYXRlU3RhcnQ7XHJcbiAgICB0aGlzLnVwZGF0ZUFwcE1vblBlcmZvcm1hbmNlKHRyaWdnZXJUeXBlLCB0aGlzLnByZXZpb3VzVXJsLCB0cnVlKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLmRpc21pc3NBbGxPdmVybGF5cygpO1xyXG5cclxuICAgIGlmICh0aGlzLmdldFN0YXJ0dXBQYWdlKCkgPT09IGV2ZW50LnVybCkge1xyXG4gICAgICB0aGlzLnJlc2V0Um91dGVQYXJhbSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVOYXZpZ2F0aW9uRW5kKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKTogdm9pZCB7XHJcbiAgICBjb25zdCBkdXJhdGlvbiA9IHBlcmZvcm1hbmNlLm5vdygpIC0gdGhpcy5uYXZpZ2F0aW9uU3RhcnRUaW1lO1xyXG4gICAgY29uc3QgdHJpZ2dlclR5cGUgPSB0aGlzLnByZXZpb3VzVXJsID09PSB0aGlzLmN1cnJlbnRVcmwgPyBUcmlnZ2VyRnJvbVR5cGUucmVmcmVzaEVuZCA6IFRyaWdnZXJGcm9tVHlwZS5uYXZpZ2F0ZUVuZDtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUFwcE1vblBlcmZvcm1hbmNlKHRyaWdnZXJUeXBlLCBldmVudC51cmxBZnRlclJlZGlyZWN0cywgdHJ1ZSwgZHVyYXRpb24pLnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5jdXJyZW50VXJsID0gZXZlbnQudXJsQWZ0ZXJSZWRpcmVjdHM7XHJcblxyXG4gICAgY29uc29sZS5sb2coZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVOYXZpZ2F0aW9uRXJyb3IoZXZlbnQ6IE5hdmlnYXRpb25FcnJvcik6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmVudmlyb25tZW50LnNraXBBcHBtb24pXHJcbiAgICB7XHJcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSB0aGlzLm5hdmlnYXRpb25TdGFydFRpbWU7XHJcbiAgICAgIHRoaXMudXBkYXRlQXBwTW9uUGVyZm9ybWFuY2UoVHJpZ2dlckZyb21UeXBlLm5hdmlnYXRlRXJyb3IsIHRoaXMucHJldmlvdXNVcmwsIGZhbHNlLCBkdXJhdGlvbikuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS5sb2coZXZlbnQuZXJyb3IpO1xyXG4gICAgdGhpcy5yZW1vdmVMYXN0TmF2aWdhdGVSZWNvcmQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQXBwTW9uUGVyZm9ybWFuY2UoXHJcbiAgICB0cmlnZ2VyVHlwZTogVHJpZ2dlckZyb21UeXBlLFxyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICBpc1N1Y2Nlc3M6IGJvb2xlYW4sXHJcbiAgICBkdXJhdGlvbj86IG51bWJlclxyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBJbml0aWFsaXplIGFwcG1vbkRvbWFpblVybCBpZiBtaXNzaW5nXHJcbiAgICBpZiAoIXRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLmFwcG1vbkRvbWFpblVybCkge1xyXG4gICAgICB0aGlzLnJlc291cmNlQXBpU2VydmljZS5hcHBtb25Eb21haW5VcmwgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdBcHBtb25Eb21haW5VcmwnKSB8fCAnJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgZGVwZW5kZW5jaWVzXHJcbiAgICBpZiAoIXRoaXMuYXV0aFNlcnZpY2UuZTFUb2tlbiB8fCAhdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuYXBwbW9uRG9tYWluVXJsKSB7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZ2V0Q3VycmVudFRpbWVzdGFtcCA9ICgpOiBzdHJpbmcgPT4ge1xyXG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgY29uc3QgcGFkID0gKG46IG51bWJlcikgPT4gbi50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICAgIHJldHVybiBgJHtkYXRlLmdldEZ1bGxZZWFyKCl9LSR7cGFkKGRhdGUuZ2V0TW9udGgoKSArIDEpfS0ke3BhZChkYXRlLmdldERhdGUoKSl9ICR7cGFkKGRhdGUuZ2V0SG91cnMoKSl9OiR7cGFkKGRhdGUuZ2V0TWludXRlcygpKX06JHtwYWQoZGF0ZS5nZXRTZWNvbmRzKCkpfS4ke2RhdGUuZ2V0TWlsbGlzZWNvbmRzKCkudG9TdHJpbmcoKS5wYWRTdGFydCg3LCAnMCcpfWA7XHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IGdldEN1cnJlbnRUaW1lc3RhbXAoKTtcclxuICAgIGNvbnN0IGN1cnJlbnREb21haW4gPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xyXG5cclxuICAgIC8vIERldGVybWluZSBtZW51IG5hbWVcclxuICAgIGNvbnN0IExPR0lOX1BBR0UgPSAnTG9naW5QYWdlJztcclxuICAgIGNvbnN0IEhPTUVfUEFHRSA9ICdIb21lUGFnZSc7XHJcbiAgICBjb25zdCBBVVRIX1BBVEggPSAnL2F1dGgnO1xyXG5cclxuICAgIGxldCBtZW51TmFtZSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ21lbnVOYW1lJykgfHwgbnVsbDtcclxuICAgIGlmICh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgPT09IEFVVEhfUEFUSCkge1xyXG4gICAgICBtZW51TmFtZSA9IExPR0lOX1BBR0U7XHJcbiAgICB9IGVsc2UgaWYgKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA9PT0gdGhpcy5lbnZpcm9ubWVudC5zdGFydFVwUGFnZSkge1xyXG4gICAgICBtZW51TmFtZSA9IEhPTUVfUEFHRTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBCdWlsZCB0aGUgcmVxdWVzdCBwYXlsb2FkXHJcbiAgICBjb25zdCBwYXJhbXMgPSB7XHJcbiAgICAgIFVybDogYCR7Y3VycmVudERvbWFpbn0ke3VybH1gLFxyXG4gICAgICBJc0F1dGhlbnRpY2F0ZWQ6IHRydWUsXHJcbiAgICAgIFRpbWVzdGFtcDogdGltZXN0YW1wLFxyXG4gICAgICBEdXJhdGlvbjogZHVyYXRpb24gPz8gbnVsbCxcclxuICAgICAgUmVxdWVzdE1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBVc2VyTmFtZTogdGhpcy5hdXRoU2VydmljZS51c2VySWQsXHJcbiAgICAgIFVzZXJJZDogdGhpcy5hdXRoU2VydmljZS5lMVRva2VuPy51c2VyTmFtZSB8fCAnJyxcclxuICAgICAgU3VjY2VzczogaXNTdWNjZXNzLFxyXG4gICAgICBFbnZpcm9ubWVudDogJ1VJJyxcclxuICAgICAgUHJvamVjdENvZGU6IHRoaXMuZW52aXJvbm1lbnQucHJvamVjdENvZGVzWzBdLFxyXG4gICAgICBTb3VyY2VOYW1lOiB0aGlzLmVudmlyb25tZW50LnByb2plY3RDb2Rlc1swXSxcclxuICAgICAgQ29tcG9uZW50Q29kZTogbnVsbCxcclxuICAgICAgRXZlbnRJZDogbnVsbCxcclxuICAgICAgRXZlbnRUeXBlOiB0cmlnZ2VyVHlwZSxcclxuICAgICAgU2Vzc2lvbklkOiBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdzZXNzaW9uVGFiSWQnKSxcclxuICAgICAgTWVudU5hbWU6IG1lbnVOYW1lLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBBUEkgRW5kcG9pbnRcclxuICAgIGNvbnN0IGFwaUVuZHBvaW50ID0gYCR7dGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuYXBwbW9uRG9tYWluVXJsfWFwaS9BcGlTdW1tYXJ5SW5mb3MvYDtcclxuXHJcbiAgICAvLyBDYWxsIHRoZSB3ZWIgQVBJIGFuZCBoYW5kbGUgZXJyb3JzXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChhcGlFbmRwb2ludCwgcGFyYW1zKTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBmb3Igc2lnbmFsUiBhbGVydFxyXG4gIHB1YmxpYyBnZXRMaXN0RmllbGROYW1lID0gKGZpZWxkTmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+ID0+IHtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCkuc2V0KFwibmFtZVwiLCBmaWVsZE5hbWUpO1xyXG4gICAgcmV0dXJuIHRoaXMub2F1dGgyU2VydmljZS5odHRwR2V0JCh0aGlzLmZpZWxkU2VydmljZS5saXN0RmllbGRBcGlSb3V0ZSwgcGFyYW1zKS5waXBlKFxyXG4gICAgICBtYXAocmVzID0+IChyZXMgYXMgYW55KS5GaWVsZEVsZW1lbnRNYXN0ZXJJZCksXHJcbiAgICAgIHN3aXRjaE1hcChpZCA9PiB0aGlzLm9hdXRoMlNlcnZpY2UuaHR0cEdldCQodGhpcy5maWVsZFNlcnZpY2UuZm9ybUZpZWxkQXBpUm91dGUsIHsgaWQgfSkpLFxyXG4gICAgICBtYXAocmVzID0+IChyZXMgYXMgYW55KS5OYW1lIGFzIHN0cmluZylcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJGb3JtTGlzdEZpZWxkcyA9ICgpID0+IHtcclxuICAgIHRoaXMuZmllbGRTZXJ2aWNlLmRhdGFGb3JtRmllbGRzID0ge307XHJcbiAgICB0aGlzLmZpZWxkU2VydmljZS5kYXRhTGlzdEZpZWxkcyA9IHt9O1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2UuZGF0YUxpc3RGaWVsZEl0ZW1zID0ge307XHJcbiAgfVxyXG5cclxuICBkaWFsb2dPcGVuKG9wdGlvbnM6IERpYWxvZ1NldHRpbmdzKTogRGlhbG9nUmVmIHtcclxuICAgIHJldHVybiB0aGlzLmRpYWxvZ1NlcnZpY2Uub3BlbihvcHRpb25zKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHN0YXJ0VXAoKSB7XHJcbiAgICBjb25zb2xlLmxvZygnQXQgbWFpbi5zZXJ2aWNlIChTdGFydFVwKSAuLi4nKTtcclxuICB9XHJcblxyXG4gIHNldEdyb3VwKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIHRoaXMuZ3JvdXAgPSBncm91cDtcclxuICAgIHRoaXMuZmllbGRTZXJ2aWNlLnNldEdyb3VwKGdyb3VwKTtcclxuICAgIHRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLnNldEdyb3VwKGdyb3VwKTtcclxuICAgIHRoaXMud2ViQXBpU2VydmljZS5zZXRHcm91cChncm91cCk7XHJcbiAgICB0aGlzLnNldEdyb3VwRm9yRGVidWdnZXIoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVzb3VyY2VTZXJ2ZXJEYXRhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLmxvYWREYXRhKCk7XHJcbiAgfVxyXG5cclxuICBnZXRHcm91cEZpZWxkcyhcclxuICAgIGZpZWxkRWxlbWVudE5hbWU6IHN0cmluZyxcclxuICAgIGZvcm1UeXBlOiBGb3JtVHlwZSB8ICdMaXN0RmllbGQnIHwgJ0Zvcm1GaWVsZCcsXHJcbiAgICB0cmlnZ2VyRnJvbTogVHJpZ2dlckZyb21UeXBlLFxyXG4gICAgZ3JvdXA6IFpHcm91cCxcclxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgZmllbGRFbGVtZW50TmFtZSxcclxuICAgICAgZm9ybVR5cGUsXHJcbiAgICAgIGdyb3VwLFxyXG4gICAgICBwcm9wZXJ0eU5hbWUsXHJcbiAgICAgIHRyaWdnZXJGcm9tXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbGl6ZUdyb3VwKFxyXG4gICAgZ3JvdXA6IFpHcm91cCxcclxuICAgIGN0cmxOYW1lOiBzdHJpbmcsXHJcbiAgICBwYWdlTmFtZTogc3RyaW5nLFxyXG4gICAgbWU6IGFueVxyXG4gICk6IFN1YnNjcmlwdGlvbiB7XHJcbiAgICBpZiAobWUuc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIG1lLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmVzb3VyY2VOYW1lID0gZ3JvdXAucmVzb3VyY2VVUkxOYW1lIHx8IGN0cmxOYW1lO1xyXG4gICAgZ3JvdXAucmVzb3VyY2VVUkxOYW1lID0gcmVzb3VyY2VOYW1lO1xyXG5cclxuICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAsIHtcclxuICAgICAgcmVzb3VyY2VVUkw6IHRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLmdldFVSTChyZXNvdXJjZU5hbWUpLFxyXG4gICAgICBncmlkQ29sdW1uRmllbGRzOiB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKFxyXG4gICAgICAgIGN0cmxOYW1lLFxyXG4gICAgICAgIFwiRm9ybUZpZWxkXCJcclxuICAgICAgKSxcclxuICAgICAgY3RybFNjb3BlOiBtZSxcclxuICAgICAgcGFnZU5hbWUsXHJcbiAgICAgIGN0cmxOYW1lLFxyXG4gICAgICAvLyBjcmVhdGVNb2RlbFVSTDogXCIvY3JlYXRlXCIgKyBjdHJsTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICBlZGl0TW9kZWxVUkw6IGN0cmxOYW1lLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIC8vIGxpc3RNb2RlbFVSTDogXCIvbGlzdFwiICsgY3RybE5hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgLy8gZm9ybUhlYWRlcjogXCIuLi5cIixcclxuICAgICAgaXNMb2FkaW5nOiB0cnVlLFxyXG4gICAgICBmaWVsZHM6IFtdLFxyXG4gICAgICB6TW9kZWw6IHt9LFxyXG4gICAgICB6Q29tcG9uZW50czoge30sXHJcbiAgICAgIHpEYXRhOiB7fSxcclxuICAgICAgc3ViamVjdDogbmV3IEJlaGF2aW9yU3ViamVjdDxaQ29tcG9uZW50T3V0cHV0RXZlbnQ+KG51bGwpLFxyXG4gICAgICAvLyBmb3JtOiBudWxsIGFzIEZvcm1Hcm91cCwgLy8gcmVtb3ZlZCBmb3IgYnVnIGZpeC5cclxuICAgICAgY2FuY2VsQnV0dG9uTmFtZTogXCJDbG9zZVwiLFxyXG4gICAgICB6QnV0dG9uc0NvdW50OiAwLFxyXG4gICAgICAvLyB0b3BSaWdodEFjdGlvbkJ1dHRvbjogW10sXHJcbiAgICAgIC8vIG9uQWN0aW9uOiB0aGlzLm9uQWN0aW9uLmJpbmQodGhpcyksXHJcbiAgICAgIGJhY2tOYXZpZ2F0aW9uOiB0aGlzLmJhY2tOYXZpZ2F0aW9uLmJpbmQodGhpcyksXHJcbiAgICAgIGhpc3RvcnlCYWNrOiB0aGlzLmhpc3RvcnlCYWNrLmJpbmQodGhpcyksXHJcbiAgICAgIHJlZnJlc2hQYWdlOiB0aGlzLnJlZnJlc2hQYWdlLmJpbmQodGhpcyksXHJcbiAgICAgIHJlZnJlc2hHcmlkOiB0aGlzLnJlZnJlc2hHcmlkLmJpbmQodGhpcyksXHJcbiAgICAgIHVwZGF0ZU1vZGVsOiB0aGlzLnVwZGF0ZU1vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIGNyZWF0ZU1vZGVsOiB0aGlzLmNyZWF0ZU1vZGVsLmJpbmQodGhpcyksXHJcbiAgICAgIGNsb25lTmV3TW9kZWw6IHRoaXMuY2xvbmVOZXdNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICBkZWxldGVNb2RlbDogdGhpcy5kZWxldGVNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICBuZXdNb2RlbDogdGhpcy5uZXdNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICAvLyB1cGRhdGVFZGl0TW9kZTogdGhpcy51cGRhdGVFZGl0TW9kZS5iaW5kKHRoaXMpLFxyXG4gICAgICAvLyBfaXNEZWJ1Z2dpbmc6IGVudmlyb25tZW50LmRlYnVnU2Vzc2lvbiB8fCBmYWxzZSxcclxuICAgICAgLy8gX2RlYnVnOiB7XHJcbiAgICAgIC8vICAgekRhdGE6ICB7IGNvbGxlY3RlZEFjdGl2aXRpZXM6IFtdLCBhY3Rpdml0eUNvdW50OiAwIH1cclxuICAgICAgLy8gfVxyXG4gICAgICAvLyBhZnRlckdldE1vZGVsU3VjY2VzczogbnVsbCxcclxuICAgICAgLy8gYmVmb3JlVXBkYXRlTW9kZWw6IG51bGwsXHJcbiAgICAgIC8vIGlzRWRpdDogZmFsc2VcclxuICAgIH0pO1xyXG5cclxuICAgIG1lLnN1YnNjcmlwdGlvbiA9IGdyb3VwLnN1YmplY3Quc3Vic2NyaWJlKChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50KSA9PlxyXG4gICAgICB0aGlzLnN1YmplY3RFdmVudChldmVudCwgZ3JvdXAsIG1lKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gbWUuc3Vic2NyaXB0aW9uO1xyXG4gIH1cclxuXHJcbiAgZ2V0TW9kZWwkKGdyb3VwOiBaR3JvdXAsIGlkOiBzdHJpbmcsIHRyaWdnZXJGcm9tPzogVHJpZ2dlckZyb21UeXBlKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IHJlY0lkID0gaWQgfHwgZ3JvdXAucmVmZXJlbmNlSWQ7XHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgIC5odHRwR2V0JChgJHtncm91cC5yZXNvdXJjZVVSTH0vJHtyZWNJZH1gLCBudWxsLCB7IHRyaWdnZXJGcm9tOiB0cmlnZ2VyRnJvbSB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgZ3JvdXAuek1vZGVsID0gem1vZGVsO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZ3JvdXAuYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3MoZ3JvdXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgY2FuRXhpdChmb3JtOiBGb3JtR3JvdXApOiBib29sZWFuIHwgT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIWZvcm0gfHwgIWZvcm0uZGlydHkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZvcm1bJ3NraXBEaXJ0eUNoZWNrJ10pIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYWxlcnRTZXJ2aWNlXHJcbiAgICAgIC5zaG93KFwiRGF0YSBub3Qgc2F2ZSB5ZXRcIiwgXCJBcmUgeW91IHN1cmUgd2FudCB0byBkaXNjYXJkIHRoZSBjaGFuZ2VzP1wiLCBbXHJcbiAgICAgICAgXCJDYW5jZWxcIixcclxuICAgICAgICBcIkRpc2NhcmQgQ2hhbmdlc1wiLFxyXG4gICAgICBdKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVwbHkgPT09IFwiRGlzY2FyZCBDaGFuZ2VzXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VNb2RhbEZvcm0oZ3JvdXA/OiBaR3JvdXApIHtcclxuICAgIGlmIChncm91cCAmJiBncm91cC5zdWJqZWN0KSB7XHJcbiAgICAgIGdyb3VwLnN1YmplY3QubmV4dCh7XHJcbiAgICAgICAgdHlwZTogXCJNb2RhbFNlcnZpY2UuY2xvc2VcIixcclxuICAgICAgICB0YXJnZXQ6IFwibW9kYWxHcm91cC5tb2RhbENhbmNlbCgpXCJcclxuICAgICAgfSBhcyBaQ29tcG9uZW50T3V0cHV0RXZlbnQpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubW9kYWxDdHJsLmRpc21pc3MoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN1YmplY3RFdmVudChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwLCBtZTogYW55KSB7XHJcbiAgICBpZiAoIWV2ZW50IHx8ICFldmVudC50YXJnZXQgfHwgZXZlbnQudGFyZ2V0LnN0YXJ0c1dpdGgoXCJtb2RhbEdyb3VwLlwiKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcIj4+IFN1YmplY3RFdmVudFwiLCBldmVudCk7XHJcbiAgICBsZXQgY2FsbEZ1bmM7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY2FsbEZ1bmMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwoXHJcbiAgICAgICAgZ3JvdXAuY3RybFNjb3BlLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBncm91cFxyXG4gICAgICApO1xyXG4gICAgICAvLyBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoZXZlbnQuVGFyZ2V0LCBncm91cCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJFcnJvciB3aGVuIGdldEdyb3VwVmFsdWU6IFwiLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBcIiA+IEVycm9yOiBcIixcclxuICAgICAgICBlcnJvclxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNhbGxGdW5jKGV2ZW50KTtcclxuICAgIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICBjb25zdCBuZXdGdW5jID0gY2FsbEZ1bmMuYmluZChtZSk7XHJcbiAgICAgIG5ld0Z1bmMoZXZlbnQsIGdyb3VwLCBtZSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICBpZiAoZXZlbnQudHlwZS5lbmRzV2l0aChcIm9uTmF2aWdhdGVUb1wiKSkge1xyXG4gICAgICAgIGNvbnN0IG5VcmwgPSBldmVudC50YXJnZXQucmVwbGFjZShcIi86aWRcIiwgXCIvXCIgKyBldmVudC5kYXRhKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbblVybF0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiemdyaWQtY2VsbENsaWNrXCIpIHtcclxuICAgICAgICAvLyAoY2FsbEZ1bmMuc3RhcnRzV2l0aCgnZWRpdCcpKSB7ICB6Z3JpZC1jZWxsQ2xpY2tcclxuICAgICAgICBjb25zdCBjTmFtZSA9IGNhbGxGdW5jLnNsaWNlKDQpO1xyXG4gICAgICAgIC8vIC8vIGRlYnVnZ2VyO1xyXG4gICAgICAgIC8vIGNvbnN0IG1vZGFsR3JvdXBQYXJhbTogTW9kYWxQYWdlUGFyYW1zID0ge307XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLmNvbnRyb2xsZXJOYW1lID0gY05hbWU7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLnJlZmVySWQgPSBldmVudC5kYXRhLklkO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5jb2xGaWVsZHMkID0gZXZlbnQuY29sdW1uRmllbGRzJDtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0ucGFyZW50R3JvdXAgPSBtZS5ncm91cDtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtKG1vZGFsR3JvdXBQYXJhbSk7XHJcbiAgICAgICAgdGhpcy5zaG93ek1vZGFsKFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBmaWVsZEVsZW1lbnROYW1lOiBjTmFtZSxcclxuICAgICAgICAgICAgZmllbGRFbGVtZW50T2JzZXJ2YWJsZSQ6IGV2ZW50LmNvbHVtbkZpZWxkcyQsXHJcbiAgICAgICAgICAgIHBhcmVudEdyb3VwOiBncm91cCxcclxuICAgICAgICAgICAgek1vZGVsOiB7fSxcclxuICAgICAgICAgICAgZm9ybUhlYWRlcjogJycsXHJcbiAgICAgICAgICAgIHJlZmVySWQ6IGV2ZW50LmRhdGEuSWRcclxuICAgICAgICAgIH1cclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJ6Z3JpZC1jZWxsQ2xpY2tcIikge1xyXG4gICAgICAgIGlmIChjYWxsRnVuYy5uYXZpZ2F0ZVVybCkge1xyXG4gICAgICAgICAgY29uc3QgdXJsID0gY2FsbEZ1bmMubmF2aWdhdGVVcmwucmVwbGFjZShcIjppZFwiLCBldmVudC5kYXRhLklkKTtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChjYWxsRnVuYy5mb3JtSGVhZGVyKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3d6TW9kYWwoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBmaWVsZEVsZW1lbnROYW1lOiBjYWxsRnVuYy5jdHJsTmFtZSxcclxuICAgICAgICAgICAgICBmaWVsZEVsZW1lbnRPYnNlcnZhYmxlJDogZXZlbnQuY29sdW1uRmllbGRzJCxcclxuICAgICAgICAgICAgICBwYXJlbnRHcm91cDogbWUuZ3JvdXAsXHJcbiAgICAgICAgICAgICAgek1vZGVsOiB7fSxcclxuICAgICAgICAgICAgICBmb3JtSGVhZGVyOiBjYWxsRnVuYy5mb3JtSGVhZGVyLFxyXG4gICAgICAgICAgICAgIHJlZmVySWQ6IGV2ZW50LmRhdGEuSWRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgXCJJbnZhbGlkIGNhbGxGdW5jIHR5cGU6IFwiLFxyXG4gICAgICAgICAgY2FsbEZ1bmMsXHJcbiAgICAgICAgICBcIiBldmVudC5UYXJnZXQ6IFwiLFxyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICAvLyB0aGlzLm9wZW5Nb2RhbEZvcm1CeUNvbXBvbmVudChjYWxsRnVuYy50eXBlLCBldmVudC5EYXRhLklkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBcIkZ1bmN0aW9uIG5vdCBkZWZpbmVkIGluIGdyb3VwIGZvcjogXCIsXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LFxyXG4gICAgICAgIFwiLCBFdmVudDogXCIsXHJcbiAgICAgICAgZXZlbnRcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZVN1Y2Nlc3MocmVzOiBSZXNwb25zZSB8IGFueSwgc3VjY2Vzc01zZzogc3RyaW5nKTogUmVzcG9uc2Uge1xyXG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXMgJiYgcmVzLlByb2Nlc3NpbmdTdGF0dXMpIHtcclxuICAgICAgaWYgKHRoaXMuZ3JvdXA/LmRpc2FibGVTdWNjZXNzQ3JlYXRlTXNnIHx8IHRoaXMuZ3JvdXA/LmRpc2FibGVTdWNjZXNzVXBkYXRlTXNnIHx8IHRoaXMuZ3JvdXA/LmRpc2FibGVTdWNjZXNzRGVsZXRlTXNnKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlcztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gc2V0IHNlc3Npb25zdG9yYWdlIHRvIHRyaWdnZXIgdXBkYXRlIHVwb24gY3JlYXRlZFxyXG5cclxuICAgICAgLy8gQWxlcnQgdXNlciB1cGRhdGUvc2F2ZSBzdWNjZXNzXHJcbiAgICAgIHRoaXMud2ViQXBpU2VydmljZS5zaG93SHR0cFJlc3BvbnNlTWVzc2FnZShNRVNTQUdFVFlQRS5TdWNjZXNzLCBzdWNjZXNzTXNnLCBudWxsKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyeVVwZGF0ZUdyb3VwVHJpZ2dlcih2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgdGhpcy5ncm91cC5pc1RyaWdnZXJlZCA9IHZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlRXJyb3IocmVzOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5oYW5kbGVFcnJvcihyZXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJvdXRlTmF2aWdhdGUocGFnZU5hbWU6IHN0cmluZywgcGFnZVBhcmFtczogc3RyaW5nW10sIHJvdXRlUmVsYXRpdmU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICB0aGlzLnNldE5hdmlnYXRpb25QYXJhbXMocGFnZVBhcmFtcyk7XHJcbiAgICBjb25zdCBzbmFwc2hvdFVybCA9IHRoaXMuYWN0aXZhdGVkUm91dGVbJ19yb3V0ZXJTdGF0ZSddLnNuYXBzaG90LnVybC5zcGxpdCgnPycpWzBdO1xyXG4gICAgY29uc3QgcGFnZVVybCA9IHJvdXRlUmVsYXRpdmUgPyBzbmFwc2hvdFVybCArICcvJyArIHBhZ2VOYW1lIDogcGFnZU5hbWU7XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3BhZ2VVcmxdLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TmF2aWdhdGlvblBhcmFtcyh1cmxQYXJhbXM6IHN0cmluZ1tdKSB7XHJcbiAgICAvLyBJZiBpdCBpcyBudWxsIG9yIHVuZGVmaW5lZFxyXG4gICAgaWYgKCF0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkge1xyXG4gICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5pc1ZhbHVlSW5MYXN0RWxlbWVudCh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCwgdGhpcy5yb3V0ZXIudXJsKSkge1xyXG4gICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aC5wdXNoKHRoaXMucm91dGVyLnVybCk7XHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMuYmFja05hdmlnYXRpb25QYXRoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZXRSb3V0ZVBhcmFtKHVybFBhcmFtcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Um91dGVQYXJhbShyb3V0ZVBhcmFtczogc3RyaW5nW10pIHtcclxuICAgIC8vIElmIGl0IGlzIG51bGwgb3IgdW5kZWZpbmVkXHJcbiAgICBpZiAoIXRoaXMucm91dGVQYXJhbSkge1xyXG4gICAgICB0aGlzLnJvdXRlUGFyYW0gPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBGaWx0ZXIgb3V0IGFueSBlbXB0eSBzdHJpbmcgcm91dGUgcGFyYW1zIGFuZCBqb2luIHRoZW0gaW50byBhIHNpbmdsZSBzdHJpbmdcclxuICAgIGNvbnN0IG5ld1JvdXRlUGFyYW0gPSAnLycgKyBPYmplY3QudmFsdWVzKHJvdXRlUGFyYW1zKS5maWx0ZXIoZWwgPT4gZWwgIT09ICcnKS5qb2luKCcvJyk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzVmFsdWVJbkxhc3RFbGVtZW50KHRoaXMucm91dGVQYXJhbSwgbmV3Um91dGVQYXJhbSkpIHtcclxuICAgICAgaWYgKHJvdXRlUGFyYW1zKSB7XHJcbiAgICAgICAgLy8gQ2FwdHVyZSB0aGUgcHJldmlvdXMgcGFnZSdzIHJvdXRlIHBhcmFtIHRvIGJlIHVzZWQgZm9yIGJhY2tuYXZpZ2F0aW9uIGNoZWNraW5nXHJcbiAgICAgICAgdGhpcy5wcmV2aW91c1JvdXRlUGFyYW0gPSB0aGlzLnJvdXRlUGFyYW1bdGhpcy5yb3V0ZVBhcmFtLmxlbmd0aCAtIDFdO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgcHJldmlvdXMgcm91dGUgcGFyYW0gZXhpc3RzLCBjaGVjayBpZiB0aGUgbGFzdCBzZWdtZW50IGlzICduZXcnIG9yICd1cGRhdGUnXHJcbiAgICAgICAgaWYgKHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXJhbVNlZ21lbnQgPSB0aGlzLnByZXZpb3VzUm91dGVQYXJhbS5zcGxpdChcIi9cIik7XHJcbiAgICAgICAgICBjb25zdCBhY3Rpb25TZWdtZW50ID0gcGFyYW1TZWdtZW50W3BhcmFtU2VnbWVudC5sZW5ndGggLSAxXTtcclxuICAgICAgICAgIC8vIElmIHRoZSBsYXN0IHNlZ21lbnQgaXMgJ25ldycgb3IgJ3VwZGF0ZScsIHN0b3JlIHRoZSBwcmV2aW91cyByb3V0ZSBwYXJhbSBpbiBzZXNzaW9uIHN0b3JhZ2VcclxuICAgICAgICAgIGNvbnN0IHZhbGlkQWN0aW9uVHlwZXMgPSBbQWN0aW9uVHlwZS5OZXcudG9TdHJpbmcoKSwgQWN0aW9uVHlwZS5FZGl0LnRvU3RyaW5nKCksIEFjdGlvblR5cGUuVXBkYXRlLnRvU3RyaW5nKCldO1xyXG5cclxuICAgICAgICAgIGlmICh2YWxpZEFjdGlvblR5cGVzLmluY2x1ZGVzKGFjdGlvblNlZ21lbnQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wcmV2aW91c1JvdXRlUGFyYW0pKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFkZCB0aGUgbmV3IHJvdXRlIHBhcmFtIHRvIHRoZSByb3V0ZVBhcmFtIGFycmF5IGFuZCBzdG9yZSBpdCBpbiBzZXNzaW9uIHN0b3JhZ2VcclxuICAgICAgICB0aGlzLnJvdXRlUGFyYW0ucHVzaChuZXdSb3V0ZVBhcmFtKTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJvdXRlUGFyYW0pKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1ZhbHVlSW5MYXN0RWxlbWVudChhcnJheTogYW55W10sIHRhcmdldFZhbHVlOiBhbnkpIHtcclxuICAgIGlmIChhcnJheVthcnJheS5sZW5ndGggLSAxXSA9PT0gdGFyZ2V0VmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbWVudU9uQ2xpY2soaXRlbTogT0F1dGhNZW51SXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgeyBBcHBDbGllbnRQYXRoOiBhcHBDbGllbnRQYXRoLCBVUkw6IHBhdGhOYW1lLCBOYW1lOiBuYW1lIH0gPSBpdGVtO1xyXG4gICAgY29uc3Qgc3RhcnR1cFBhZ2UgPSB0aGlzLnpjb3JlU2VydmljZS5nZXRFbnZpcm9ubWVudCgpLnN0YXJ0VXBQYWdlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBMQVVOQ0hFUiA9ICdsYXVuY2hlcic7XHJcblxyXG4gICAgLy8gU2F2ZSBtZW51IG5hbWUgdG8gc2Vzc2lvblN0b3JhZ2VcclxuICAgIHRoaXMubWVudVNlcnZpY2Uuc2V0TWVudU5hbWUobmFtZSk7XHJcblxyXG4gICAgLy8gSGFuZGxlIGFwcCBjbGllbnQgcGF0aCBuYXZpZ2F0aW9uXHJcbiAgICBpZiAoYXBwQ2xpZW50UGF0aCAmJiBzdGFydHVwUGFnZSA9PT0gTEFVTkNIRVIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQXBwQ2xpZW50TmF2aWdhdGlvbihwYXRoTmFtZSwgYXBwQ2xpZW50UGF0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGV0ZXJtaW5lIG5hdmlnYXRpb24gcGF0aFxyXG4gICAgY29uc3QgbmF2aWdhdGlvblBhdGggPSB0aGlzLmdldE5hdmlnYXRpb25QYXRoKHN0YXJ0dXBQYWdlLCBwYXRoTmFtZSk7XHJcblxyXG4gICAgLy8gTmF2aWdhdGUgdG8gdGhlIGRldGVybWluZWQgcGF0aFxyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGVUb1BhdGgobmF2aWdhdGlvblBhdGgsIHBhdGhOYW1lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlQXBwQ2xpZW50TmF2aWdhdGlvbihwYXRoTmFtZTogc3RyaW5nLCBhcHBDbGllbnRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIFpDb21wb25lbnRIZWxwZXIub3BlbkFwcENsaWVudFBhdGgocGF0aE5hbWUsIGFwcENsaWVudFBhdGgsIHRoaXMuYXV0aFNlcnZpY2UpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBvcGVuIEFwcCBDbGllbnQgUGF0aCBmb3IgJHtwYXRoTmFtZX06YCwgZXJyb3IpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE5hdmlnYXRpb25QYXRoKHN0YXJ0dXBQYWdlOiBzdHJpbmcsIHBhdGhOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBNRU5VX1BBR0VfUFJFRklYID0gJ18nO1xyXG4gICAgcmV0dXJuIHN0YXJ0dXBQYWdlLnN0YXJ0c1dpdGgoTUVOVV9QQUdFX1BSRUZJWCkgPyBbc3RhcnR1cFBhZ2VdIDogW3BhdGhOYW1lXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbmF2aWdhdGVUb1BhdGgobmF2aWdhdGlvblBhdGg6IHN0cmluZ1tdLCBwYXRoTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnNldE5hdmlnYXRpb25QYXJhbXMobmF2aWdhdGlvblBhdGgpO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcGF0aE5hbWVdKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oYE5hdmlnYXRpb24gdG8gJHtwYXRoTmFtZX0gZmFpbGVkOmAsIGVycm9yKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG5hdmlnYXRlRnJvbU1lbnUocGFnZU5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgeyBzdGFydFVwUGFnZSB9ID0gdGhpcy5lbnZpcm9ubWVudDtcclxuICAgIHRoaXMuc2V0Um91dGVQYXJhbShbYCR7c3RhcnRVcFBhZ2V9YF0pO1xyXG4gICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgucHVzaCh0aGlzLmdldFN0YXJ0dXBQYWdlKCkpO1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoW3RoaXMuZ2V0U3RhcnR1cFBhZ2UoKV0pKTtcclxuXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcGFnZU5hbWVdLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXRSb3V0ZVBhcmFtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yb3V0ZVBhcmFtID0gW107XHJcbiAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCA9IFtdO1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5yb3V0ZVBhcmFtKSk7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXROYXZpZ2F0aW9uUGFyYW1zKCk6IGFueVtdIHtcclxuICAgIHRoaXMucm91dGVQYXJhbSA9IHRoaXMucm91dGVQYXJhbSB8fCBbXTtcclxuXHJcbiAgICBpZiAodGhpcy5yb3V0ZVBhcmFtLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb25zdCBzdG9yZWRQYXJhbXMgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVkpO1xyXG4gICAgICBpZiAoc3RvcmVkUGFyYW1zKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMucm91dGVQYXJhbSA9IEpTT04ucGFyc2Uoc3RvcmVkUGFyYW1zKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBzdG9yZWQgcm91dGVQYXJhbTonLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coJ05vIHN0b3JlZCBuYXZpZ2F0aW9uIHBhcmFtcyBmb3VuZC4nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5yb3V0ZVBhcmFtO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE5hdmlnYXRpb25QYXJlbnRQYXJhbSgpOiBhbnkge1xyXG4gICAgY29uc3QgbmF2aWdhdGlvblBhcmVudFBhcmFtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvblBhcmFtcygpO1xyXG5cclxuICAgIGlmIChuYXZpZ2F0aW9uUGFyZW50UGFyYW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIG5hdmlnYXRpb25QYXJlbnRQYXJhbXNbbmF2aWdhdGlvblBhcmVudFBhcmFtcy5sZW5ndGggLSAyXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLndhcm4oJ05hdmlnYXRpb24gcGFyZW50IHBhcmFtcyBub3QgZm91bmQuJyk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXROYXZpZ2F0aW9uQ3VycmVudFBhcmFtKCk6IGFueSB7XHJcbiAgICBjb25zdCBuYXZpZ2F0aW9uQ3VycmVudFBhcmFtcyA9IHRoaXMuZ2V0TmF2aWdhdGlvblBhcmFtcygpO1xyXG5cclxuICAgIGlmIChuYXZpZ2F0aW9uQ3VycmVudFBhcmFtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBuYXZpZ2F0aW9uQ3VycmVudFBhcmFtc1tuYXZpZ2F0aW9uQ3VycmVudFBhcmFtcy5sZW5ndGggLSAxXTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLndhcm4oJ05hdmlnYXRpb24gY3VycmVudCBwYXJhbXMgbm90IGZvdW5kLicpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTogYW55IHtcclxuICAgIGlmICh0aGlzLnByZXZpb3VzUm91dGVQYXJhbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIFJldHVybiB0aGUgY2FjaGVkIHZhbHVlIGlmIGl0IGV4aXN0c1xyXG4gICAgICByZXR1cm4gdGhpcy5wcmV2aW91c1JvdXRlUGFyYW07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcHJldmlvdXNSb3V0ZVBhcmFtU3RyID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLlBSRVZJT1VTX1BBR0VfUk9VVEVfUEFSQU1fU1RPUkFHRV9LRVkpO1xyXG4gICAgaWYgKHByZXZpb3VzUm91dGVQYXJhbVN0cikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzUm91dGVQYXJhbSA9IEpTT04ucGFyc2UocHJldmlvdXNSb3V0ZVBhcmFtU3RyKTtcclxuICAgICAgICB0aGlzLnByZXZpb3VzUm91dGVQYXJhbSA9IHByZXZpb3VzUm91dGVQYXJhbTtcclxuICAgICAgICByZXR1cm4gcHJldmlvdXNSb3V0ZVBhcmFtO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgVW5hYmxlIHRvIHBhcnNlIHByZXZpb3VzIHJvdXRlIHBhcmFtIGZyb20gc2Vzc2lvbiBzdG9yYWdlOiAke2Vycm9yfWApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ05vIHByZXZpb3VzIHBhZ2Ugcm91dGUgcGFyYW0gZm91bmQgaW4gc2Vzc2lvbiBzdG9yYWdlLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZVByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnJlbW92ZSh0aGlzLlBSRVZJT1VTX1BBR0VfUk9VVEVfUEFSQU1fU1RPUkFHRV9LRVkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUxhc3ROYXZpZ2F0ZVJlY29yZCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRpb25QYXRoKCk7XHJcbiAgICB0aGlzLnJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlTGFzdE5hdmlnYXRpb25QYXRoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSkgfHwgXCJudWxsXCIpO1xyXG4gICAgaWYgKHRoaXMuYmFja05hdmlnYXRpb25QYXRoKSB7XHJcbiAgICAgIHRoaXMuYmFja05hdmlnYXRpb25QYXRoLnBvcCgpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiTm8gYmFjayBuYXZpZ2F0aW9uIHBhdGggZm91bmQgaW4gc2Vzc2lvbi5cIik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVtb3ZlTGFzdFJvdXRlUGFyYW0oKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlUGFyYW0gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5OQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSkgfHwgXCJudWxsXCIpO1xyXG4gICAgaWYgKHRoaXMucm91dGVQYXJhbSkge1xyXG4gICAgICB0aGlzLnJvdXRlUGFyYW0ucG9wKCk7XHJcbiAgICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMucm91dGVQYXJhbSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFwicm91dGVQYXJhbSBzZXNzaW9uIGlzIG51bGwuXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGJhY2tOYXZpZ2F0aW9uKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChncm91cFsnaXNFbWJlZGRlZFBhZ2UnXSkge1xyXG4gICAgICBncm91cFsnaXNUcmlnZ2VyZWQnXSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNsb3NlQ29udGFpbmVyVmlldyhncm91cCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZ3JvdXAuYmVmb3JlQmFja05hdmlnYXRpb25QYWdlKSB7XHJcbiAgICAgIGdyb3VwLmJlZm9yZUJhY2tOYXZpZ2F0aW9uUGFnZShncm91cCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRlQmFja1RvUHJldmlvdXNQYWdlKGdyb3VwKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm5hdmlnYXRlQmFja1RvUHJldmlvdXNQYWdlKGdyb3VwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgbmF2aWdhdGVCYWNrVG9QcmV2aW91c1BhZ2UoZ3JvdXA6IFpHcm91cCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG5cclxuICAgIGNvbnN0IGJhY2tOYXZpZ2F0aW9uUGF0aDogc3RyaW5nW10gPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSkpO1xyXG4gICAgY29uc3QgYmFja05hdmlnYXRpb25VUkwgPSBncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UgfHwgYmFja05hdmlnYXRpb25QYXRoW2JhY2tOYXZpZ2F0aW9uUGF0aC5sZW5ndGggLSAxXTtcclxuXHJcbiAgICBpZiAoIWJhY2tOYXZpZ2F0aW9uVVJMKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBuYXZpZ2F0aW5nIGJhY2sgdG8gcHJldmlvdXMgcGFnZTogYmFja05hdmlnYXRpb25VUkwgaXMgbm90IHNldC5cIik7XHJcbiAgICAgIC8vdGhyb3cgbmV3IEVycm9yKFwiQmFja05hdmlnYXRpb25QYXRoIG5vdCBzZXQuXCIpO1xyXG4gICAgICBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuZ2V0U3RhcnR1cFBhZ2UoKSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlKSB7XHJcbiAgICAgIGNvbnN0IHByZXZpb3VzUm91dGVQYXJhbSA9IHRoaXMuZ2V0UHJldmlvdXNQYWdlUm91dGVQYXJhbSgpO1xyXG4gICAgICBjb25zdCBwcmV2aW91c0N1cnJlbnRSb3V0ZVBhcmFtID0gdGhpcy5nZXROYXZpZ2F0aW9uQ3VycmVudFBhcmFtKCk7XHJcbiAgICAgIGlmICh0aGlzLnJvdXRlUGFyYW0ubGVuZ3RoID09PSAwICYmIHRoaXMucm91dGVOYXZpZ2F0ZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMuZ2V0U3RhcnR1cFBhZ2UoKSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChwcmV2aW91c1JvdXRlUGFyYW0gJiYgcHJldmlvdXNSb3V0ZVBhcmFtID09PSBwcmV2aW91c0N1cnJlbnRSb3V0ZVBhcmFtKSB7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZW1vdmVMYXN0Um91dGVQYXJhbSgpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlTGFzdE5hdmlnYXRpb25QYXRoKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLk5BVklHQVRFRF9SRUxPQURfR1JJRF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodHJ1ZSkpO1xyXG5cclxuICAgIGlmICh0aGlzLmNhY2hlU2VydmljZS5nZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpKSB7XHJcbiAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyQ2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGJhY2tOYXZpZ2F0aW9uVVJMLCB7IHJlcGxhY2VVcmw6IHRydWUgfSk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBuYXZpZ2F0aW5nIGJhY2sgdG8gcHJldmlvdXMgcGFnZTogJHtlcnJvci5tZXNzYWdlfWApO1xyXG4gICAgICAvL3Rocm93IGVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFN0YXJ0dXBQYWdlKCkge1xyXG4gICAgY29uc3QgeyBzdGFydFVwUGFnZSB9ID0gdGhpcy5lbnZpcm9ubWVudDtcclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGUgc3RhcnR1cCBwYWdlIHN0YXJ0cyB3aXRoIGEgdW5kZXJzY29yZS5cclxuICAgIGlmIChzdGFydFVwUGFnZS5zdGFydHNXaXRoKCdfJykpIHtcclxuICAgICAgcmV0dXJuIGAvJHtzdGFydFVwUGFnZS5zbGljZSgxKX1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIG5vdCwgcHJlcGVuZCBhIGZvcndhcmQgc2xhc2ggYW5kIHJldHVybi5cclxuICAgIHJldHVybiBgLyR7c3RhcnRVcFBhZ2V9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGlzdG9yeUJhY2soKSB7XHJcbiAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZ3JvdXBbJ2lzRW1iZWRkZWRQYWdlJ10pIHtcclxuICAgICAgdGhpcy5jbG9zZUNvbnRhaW5lclZpZXcodGhpcy5ncm91cCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5hdkNvbnRyb2xsZXIucG9wKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaEdyaWQoXHJcbiAgICBldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LFxyXG4gICAgZ3JvdXA6IFpHcm91cCxcclxuICAgIG1lOiBhbnksXHJcbiAgICBncmlkT3B0aW9uTmFtZT86IHN0cmluZ1xyXG4gICkge1xyXG4gICAgZ3JpZE9wdGlvbk5hbWUgPSBncmlkT3B0aW9uTmFtZSB8fCBcImdyaWRPcHRpb25zXCI7XHJcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgIGNvbnN0IGdyaWRPcHRpb24gPSBldmVudC50YXJnZXRcclxuICAgICAgICAudHJpbSgpXHJcbiAgICAgICAgLnJlcGxhY2UoXCIoXCIsIFwiXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoXCIpXCIsIFwiXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoXCJncm91cC5yZWZyZXNoR3JpZFwiLCBcIlwiKTtcclxuICAgICAgaWYgKGdyaWRPcHRpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGdyaWRPcHRpb25OYW1lID0gZ3JpZE9wdGlvbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHpncmlkQ29udHJvbCA9IGdyb3VwW2dyaWRPcHRpb25OYW1lXSBhcyBaR3JpZDtcclxuICAgIGlmICh6Z3JpZENvbnRyb2wpIHtcclxuICAgICAgemdyaWRDb250cm9sLmdldERhdGEoKTtcclxuICAgIH1cclxuICAgIGdyb3VwWydpc1RyaWdnZXJlZCddID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlZnJlc2hQYWdlKCkge1xyXG4gICAgaWYgKHRoaXMuZ3JvdXApIHtcclxuICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAvLyB0aGlzLnJvdXRlci5yb3V0ZVJldXNlU3RyYXRlZ3kuc2hvdWxkUmV1c2VSb3V0ZSA9ICgpID0+IGZhbHNlO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIub25TYW1lVXJsTmF2aWdhdGlvbiA9ICdyZWxvYWQnO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ1BhdGg6ICcsIHRoaXMuYWN0aXZhdGVkUm91dGVbJ19yb3V0ZXJTdGF0ZSddLnNuYXBzaG90LnVybCk7XHJcbiAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9jcm0vY3VzdG9tZXInXSk7XHJcbiAgfVxyXG5cclxuICBnZXRDbG9uZU5ld0NhY2hlWk1vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IGNhY2hlWk1vZGVsID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKTtcclxuICAgIGlmIChjYWNoZVpNb2RlbCkge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICAgIGdyb3VwLnpNb2RlbCA9IGNhY2hlWk1vZGVsO1xyXG4gICAgICBncm91cC56TW9kZWwuSWQgPSAwO1xyXG4gICAgfVxyXG4gICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbmV3TW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgb2YoW10pLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJCZWZvcmUgbmV3LCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlTmV3TW9kZWwoZ3JvdXApO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImN1cnJlbnQgdXJsOiBcIiwgdGhpcy5yb3V0ZXIudXJsKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlSWQgPSBncm91cC5wYXJlbnRSZWZlcmVuY2VJZCB8fCBcIjBcIjtcclxuICAgICAgICAvL2NvbnN0IHBhdGhTZWdtZW50ID0gdGhpcy5yb3V0ZXIudXJsLnNwbGl0KFwiL1wiKTtcclxuICAgICAgICAvL2NvbnN0IGxhc3RTZWdtZW50ID0gcGF0aFNlZ21lbnRbcGF0aFNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgY29uc3QgY3VycmVudE5hdmlnYXRpb25QYXJhbSA9IHRoaXMuZ2V0TmF2aWdhdGlvbkN1cnJlbnRQYXJhbSgpO1xyXG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25TZWdtZW50cyA9IGN1cnJlbnROYXZpZ2F0aW9uUGFyYW0gPyBjdXJyZW50TmF2aWdhdGlvblBhcmFtLnNwbGl0KCcvJykgOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRBY3Rpb24gPSBncm91cC5pc0Nsb25lTmV3ID8gQWN0aW9uVHlwZS5OZXcgOiBBY3Rpb25UeXBlLkVkaXQ7XHJcbiAgICAgICAgY29uc3QgYWN0aW9uU2VnbWVudCA9IGdyb3VwLmlzQ2xvbmVOZXcgPyAobmF2aWdhdGlvblNlZ21lbnRzID8gbmF2aWdhdGlvblNlZ21lbnRzW25hdmlnYXRpb25TZWdtZW50cy5sZW5ndGggLSAxXSA6IEFjdGlvblR5cGUuTmV3KSA6IGRlZmF1bHRBY3Rpb247XHJcblxyXG4gICAgICAgIGlmIChncm91cC5pc0xpc3RGb3JtKSB7XHJcbiAgICAgICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcblxyXG4gICAgICAgICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKFtyZWZlcmVuY2VJZCwgQWN0aW9uVHlwZS5OZXcudG9TdHJpbmcoKV0pO1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2dyb3VwLmVkaXRNb2RlbFVSTF0sIHtcclxuICAgICAgICAgICAgcmVsYXRpdmVUbzogZ3JvdXAuY3RybFNjb3BlLmFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gMTogRnJvbSBMaXN0IE5ldyhhY3Rpb246IG5ldykgPT0+IENsZWFyIGZvcm1cclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDI6IEZyb20gRm9ybSBOZXcoYWN0aW9uOiBuZXcpID09PiBDbGVhciBmb3JtXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyAzOiBGcm9tIEZvcm0gTmV3KGFjdGlvbjogbmV3KSwgaXNDbG9uZU5ldyA9PT4gRE9OVCBDbGVhciBmb3JtXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyA0OiBGcm9tIEZvcm0gTmV3KGFjdGlvbjogbmV3KSwgaXNDbG9uZU5ldywgU2F2ZSwgQ2xpY2sgTmV3ID09PiBDbGVhciBmb3JtIChXaGVuIENyZWF0ZU1vZGVsLCBuZWVkIGNoYW5nZSBpc0Nsb25lTmV3ID0gZmFsc2UpXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyA1OiBGcm9tIExpc3Qgb3BlbiByZWNvcmQoYWN0aW9uOiBlZGl0KSwgaXNDbG9uZU5ldyA9PT4gRE9OVCBDbGVhciBmb3JtXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyA2OiBGcm9tIExpc3Qgb3BlbiByZWNvcmQoYWN0aW9uOiBlZGl0KSwgaXNDbG9uZU5ldywgU2F2ZSwgQ2xpY2sgTmV3ID09PiBDbGVhciBmb3JtIChXaGVuIFVwZGF0ZU1vZGVsLCBuZWVkIGNoYW5nZSBpc0Nsb25lTmV3ID0gZmFsc2UpXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyA3OiBGcm9tIExpc3Qgb3BlbiByZWNvcmQoYWN0aW9uOiBlZGl0KSwgQ2xpY2sgTmV3ID09PiBDbGVhciBmb3JtXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyA4OiBGcm9tIExpc3Qgb3BlbiByZWNvcmQoYWN0aW9uOiBlZGl0KSwgQ2xpY2sgTmV3LCBTYXZlLCBpc0Nsb25lTmV3ID09PiBET05UIENsZWFyIGZvcm1cclxuXHJcbiAgICAgICAgICBpZiAoYWN0aW9uU2VnbWVudCA9PT0gQWN0aW9uVHlwZS5FZGl0IHx8IGFjdGlvblNlZ21lbnQgPT09IEFjdGlvblR5cGUuTmV3KSB7XHJcbiAgICAgICAgICAgIGlmICghZ3JvdXAuaXNDbG9uZU5ldykge1xyXG4gICAgICAgICAgICAgIGdyb3VwLnpNb2RlbCA9IHt9O1xyXG4gICAgICAgICAgICAgIGdyb3VwLmZvcm0ucmVzZXQoKTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSB3b3JrZmxvdyBidXR0b24gaWYgdGhlIFR5cGVDb2RlIGlzICdGVU5DVElPTidcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pc1R5cGVDb2RlRnVuY3Rpb24oZXZlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZFdvcmtmbG93QnV0dG9uKGdyb3VwLCBldmVudC5kYXRhKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFjdGlvblNlZ21lbnQgPT09IEFjdGlvblR5cGUuRWRpdCkge1xyXG4gICAgICAgICAgICAgIC8vIGNsZWFyIGNsb25lTmV3TW9kZWwgY2FjaGUoaWYgaGF2ZSlcclxuICAgICAgICAgICAgICBpZiAodGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVNlcnZpY2UuY2xlYXJDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy90aGlzLnNldE5hdmlnYXRpb25QYXJhbXMoW3JlZmVyZW5jZUlkLCAnbmV3J10pO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGFzdFJvdXRlUGFyYW0oKTtcclxuICAgICAgICAgICAgICB0aGlzLnNldFJvdXRlUGFyYW0oW3JlZmVyZW5jZUlkLCBBY3Rpb25UeXBlLk5ldy50b1N0cmluZygpXSk7XHJcblxyXG4gICAgICAgICAgICAgIGdyb3VwLnpNb2RlbFtncm91cC5wYXJlbnRSZWZlcmVuY2VGaWVsZF0gPSByZWZlcmVuY2VJZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBncm91cC5pc0VkaXQgPSBmYWxzZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNOZXcgPSB0cnVlO1xyXG4gICAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKFtyZWZlcmVuY2VJZCwgQWN0aW9uVHlwZS5OZXcudG9TdHJpbmcoKV0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2dyb3VwLmVkaXRNb2RlbFVSTF0sIHtcclxuICAgICAgICAgICAgICByZWxhdGl2ZVRvOiBncm91cC5jdHJsU2NvcGUuYWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChncm91cC5pc0Nsb25lTmV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJDbG9uZU5ld01vZGVsKGdyb3VwLCBncm91cC56TW9kZWwpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWZ0ZXJOZXdNb2RlbChncm91cCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjcmVhdGVNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICBjb25zdCBmZzogRm9ybUdyb3VwID0gZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBjb25zdCByZXNNZXNzYWdlID0gZ3JvdXAuU3VjY2Vzc0NyZWF0ZWRNZXNzYWdlIHx8IERlZmF1bHRNZXNzYWdlLnJlY29yZENyZWF0ZWQ7XHJcbiAgICBsZXQgY3JlYXRlTW9kZWxyZXMgPSBudWxsO1xyXG5cclxuICAgIGlmICghZmcuZGlydHkpIHtcclxuICAgICAgY29uc29sZS53YXJuKERlZmF1bHRNZXNzYWdlLm5vdERpcnR5TWVzc2FnZSk7XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZmcudmFsaWQpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRFcnJvckhhbmRsZXJTZXJ2aWNlLnNob3dGb3JtR3JvdXBFcnJvck1lc3NhZ2UoZ3JvdXAsIGZnKTtcclxuICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgb2YoZ3JvdXAuek1vZGVsKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIGNyZWF0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJlZm9yZUNyZWF0ZU1vZGVsKGdyb3VwKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmdyb3VwLnNraXBDcmVhdGVVc2luZ0Zvcm1WYWx1ZSkge1xyXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG5ld01vZGVsID0gT2JqZWN0LmFzc2lnbih7fSwgZ3JvdXAuek1vZGVsKTtcclxuICAgICAgICBaQ29tcG9uZW50SGVscGVyLnJlbW92ZU51bGxGaWVsZHMobmV3TW9kZWwpO1xyXG5cclxuICAgICAgICBjb25zdCB3ZWJBcGlBZGRpdGlvbmFsRGV0YWlsOiBXZWJBcGlBZGRpdGlvbmFsRGV0YWlsID0ge1xyXG4gICAgICAgICAgYnV0dG9uRGV0YWlsOiBldmVudCxcclxuICAgICAgICAgIGdyb3VwOiBncm91cCxcclxuICAgICAgICAgIHRyaWdnZXJGcm9tOiBldmVudCA/IGV2ZW50LnRyaWdnZXJGcm9tIDogdW5kZWZpbmVkXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwUG9zdCQoZ3JvdXAucmVzb3VyY2VVUkwsIG5ld01vZGVsLCB3ZWJBcGlBZGRpdGlvbmFsRGV0YWlsKS5waXBlKFxyXG4gICAgICAgICAgdGFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgIGNyZWF0ZU1vZGVscmVzID0gcmVzcDtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3A7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCByZXNNZXNzYWdlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcCgoem1vZGVsOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkFmdGVyIGNyZWF0ZWQsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICB0aGlzLnBhdGNoVXBkYXRlZHpNb2RlbChmZywgem1vZGVsLCBncm91cCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJDcmVhdGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgIGlmIChjcmVhdGVNb2RlbHJlcy5Qcm9jZXNzaW5nU3RhdHVzID09IG51bGwgfHwgY3JlYXRlTW9kZWxyZXMuUHJvY2Vzc2luZ1N0YXR1cyA9PSB0cnVlKSB7XHJcbiAgICAgICAgICBpZiAocmVzcCAmJiBncm91cC56TW9kZWwuSWQgIT09IDApIHtcclxuICAgICAgICAgICAgZ3JvdXAuaXNOZXcgPSBmYWxzZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNFZGl0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNDbG9uZU5ldyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBncm91cC5jYW5jZWxCdXR0b25OYW1lID0gXCJDbG9zZVwiO1xyXG4gICAgICAgICAgICAvLyBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgcmVzcCk7XHJcbiAgICAgICAgICAgIC8vIGZnLnBhdGNoVmFsdWUocmVzcCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG5cclxuICAgICAgICAgIGlmICgoZ3JvdXAuaXNDbG9zZUFmdGVyU3VjY2VzcyB8fCBncm91cC5pc0Nsb3NlQWZ0ZXJDcmVhdGVkKSAmJiAhZ3JvdXAuaXNDbG9uZU5ldykge1xyXG4gICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBmZy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkRvbmUgdXBkYXRlTW9kZWwgdXBkYXRlZCB6TW9kZWw6XCIsIGZnLnZhbHVlKTtcclxuICAgICAgICAvLyB0aGlzLnRvYXN0U2VydmljZS5zaG93KFwiUmVjb3JkIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgdGhpcy51cGRhdGVNb2RlbE9ic2VydmFibGUoZXZlbnQsIGdyb3VwKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVNb2RlbE9ic2VydmFibGUoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgZm9ybTogRm9ybUdyb3VwID0gbnVsbCwgdXBkYXRlQVBJT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxhbnk+ID0gbnVsbCwgaXNTa2lwRGlydHkgPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBmZyA9IGZvcm0gfHwgZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBjb25zdCByZXNNZXNzYWdlID0gZ3JvdXAuU3VjY2Vzc1VwZGF0ZWRNZXNzYWdlIHx8IERlZmF1bHRNZXNzYWdlLnJlY29yZFVwZGF0ZWQ7XHJcbiAgICBsZXQgdXBkYXRlTW9kZWxyZXMgPSBudWxsO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0Zvcm1EaXJ0eUFuZFZhbGlkKGZnLCBncm91cCwgaXNTa2lwRGlydHksIGV2ZW50KSkge1xyXG4gICAgICBpZiAoaXNTa2lwRGlydHkpIHtcclxuICAgICAgICBmZy5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgICByZXR1cm4gb2YoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHdlYkFwaUFkZGl0aW9uYWxEZXRhaWw6IFdlYkFwaUFkZGl0aW9uYWxEZXRhaWwgPSB7XHJcbiAgICAgIGJ1dHRvbkRldGFpbDogZXZlbnQsXHJcbiAgICAgIGdyb3VwOiBncm91cCxcclxuICAgICAgdHJpZ2dlckZyb206IGV2ZW50ID8gZXZlbnQudHJpZ2dlckZyb20gOiB1bmRlZmluZWRcclxuICAgIH07XHJcblxyXG4gICAgdXBkYXRlQVBJT2JzZXJ2YWJsZSA9IHVwZGF0ZUFQSU9ic2VydmFibGUgfHwgdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQdXQkKGAke2dyb3VwLnJlc291cmNlVVJMfS8ke2dyb3VwLnpNb2RlbC5JZH1gLCBncm91cC56TW9kZWwsIHdlYkFwaUFkZGl0aW9uYWxEZXRhaWwpLnBpcGUoXHJcbiAgICAgIHRhcCgocmVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgcmVzTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgICAgICAvL3RoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIFwiUmVjb3JkIGlzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiKVxyXG4gICAgICApKTtcclxuXHJcbiAgICByZXR1cm4gb2YoZ3JvdXAuek1vZGVsKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIHVwZGF0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFncm91cC5za2lwVXBkYXRlVXNpbmdGb3JtVmFsdWUpIHtcclxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICByZXR1cm4gdXBkYXRlQVBJT2JzZXJ2YWJsZTtcclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcCgocmVzcDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJBZnRlciB1cGRhdGVkLCByZXNwb25zZTpcIiwgcmVzcCk7XHJcbiAgICAgICAgdXBkYXRlTW9kZWxyZXMgPSByZXNwO1xyXG4gICAgICAgIGdyb3VwLmlzQ2xvbmVOZXcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnBhdGNoVXBkYXRlZHpNb2RlbChmZywgcmVzcCwgZ3JvdXApO1xyXG4gICAgICAgIGZnLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJVcGRhdGVNb2RlbChncm91cCwgcmVzcCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICBpZiAodXBkYXRlTW9kZWxyZXMgJiYgdXBkYXRlTW9kZWxyZXMuUHJvY2Vzc2luZ1N0YXR1cykge1xyXG4gICAgICAgICAgaWYgKGdyb3VwLmlzQ2xvc2VBZnRlclN1Y2Nlc3MgfHwgZ3JvdXAuaXNDbG9zZUFmdGVyVXBkYXRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uKG51bGwsIGdyb3VwLCB0aGlzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvbmVzIGEgbmV3IG1vZGVsIGZvciBhIFpHcm91cCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgWkNvbXBvbmVudE91dHB1dEV2ZW50LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtaQ29tcG9uZW50T3V0cHV0RXZlbnR9IGV2ZW50IC0gVGhlIFpDb21wb25lbnRPdXRwdXRFdmVudCB0cmlnZ2VyaW5nIHRoZSBjbG9uZS5cclxuICAgKiBAcGFyYW0ge1pHcm91cH0gZ3JvdXAgLSBUaGUgWkdyb3VwIHRvIGNsb25lIHRoZSBuZXcgbW9kZWwgZm9yLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2xvbmVOZXdNb2RlbChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwKSB7XHJcbiAgICAvLyBTZXQgZmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIG1vZGVsIGlzIGJlaW5nIGNsb25lZFxyXG4gICAgZ3JvdXAuaXNDbG9uZU5ldyA9IHRydWU7XHJcblxyXG4gICAgLy8gRXh0cmFjdCB0aGUgZnVuY3Rpb24gdmFsdWUgZnJvbSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudFxyXG4gICAgY29uc3QgeyB0YXJnZXQgfSA9IGV2ZW50O1xyXG4gICAgY29uc3QgZnVuY3Rpb25WYWx1ZSA9IHRhcmdldD8ubWF0Y2goL1xcKChbXildKylcXCkvKT8uWzFdO1xyXG5cclxuICAgIC8vIElmIHRoZSBmdW5jdGlvbiB2YWx1ZSBpcyAndHJ1ZScsIHJlc2V0IHRoZSBmb3JtIGFuZCBtb2RlbFxyXG4gICAgaWYgKGZ1bmN0aW9uVmFsdWUgPT09ICd0cnVlJykge1xyXG4gICAgICBncm91cC56TW9kZWwgPSB7fTtcclxuICAgICAgZ3JvdXAuZm9ybS5yZXNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERlZmluZSB0aGUgdmFsdWVzIGZvciB0aGUgV0ZTIG1vZGVsXHJcbiAgICBjb25zdCBuZXdNb2RlbFZhbHVlcyA9IHtcclxuICAgICAgSWQ6IDAsXHJcbiAgICAgIFdGU19Eb2N1bWVudElkOiBudWxsLFxyXG4gICAgICBXRlNfU3RhdHVzQ29kZTogbnVsbCxcclxuICAgICAgV0ZTX1N0YXR1c0lkOiBudWxsLFxyXG4gICAgICBXRlNfU3RhdHVzTmFtZTogbnVsbCxcclxuICAgIH07XHJcblxyXG4gICAgLy8gQXNzaWduIHRoZSBXRlMgbW9kZWwgdmFsdWVzIHRvIHRoZSBmb3JtIHZhbHVlIGFuZCBaTW9kZWxcclxuICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuZm9ybS52YWx1ZSwgbmV3TW9kZWxWYWx1ZXMpO1xyXG4gICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGdyb3VwLmZvcm0udmFsdWUpO1xyXG5cclxuICAgIC8vIFBhdGNoIHRoZSBmb3JtIHdpdGggdGhlIFpNb2RlbCwgbWFyayBpdCBhcyBkaXJ0eSwgYW5kIGNhY2hlIHRoZSBaTW9kZWxcclxuICAgIGNvbnN0IGZnID0gZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBjb25zdCByZXN1bHREYXRhID0gWkNvbXBvbmVudEhlbHBlci5yZW1vdmVUZXh0RWRpdG9yVmFsdWVGcm9tRm9ybVBhdGNoaW5nKGdyb3VwLnpNb2RlbCwgZ3JvdXApO1xyXG4gICAgZmcucGF0Y2hWYWx1ZShyZXN1bHREYXRhKTtcclxuICAgIGZnLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB0aGlzLmNhY2hlU2VydmljZS5zZXRDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVksIGdyb3VwLnpNb2RlbCk7XHJcblxyXG4gICAgLy8gQ2FsbCB0aGUgbmV3TW9kZWwgZnVuY3Rpb24gZm9yIHRoZSBncm91cFxyXG4gICAgdGhpcy5uZXdNb2RlbChudWxsLCBncm91cCk7XHJcblxyXG4gICAgLy8gUmVsb2FkIHRoZSB3b3JrZmxvdyBidXR0b24gaWYgdGhlIFR5cGVDb2RlIGlzICdGVU5DVElPTidcclxuICAgIGlmICh0aGlzLmlzVHlwZUNvZGVGdW5jdGlvbihldmVudCkpIHtcclxuICAgICAgdGhpcy5yZWxvYWRXb3JrZmxvd0J1dHRvbihncm91cCwgZXZlbnQuZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgdGhlIHRyaWdnZXIgZmxhZ1xyXG4gICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGVsZXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3QgcmVzTWVzc2FnZSA9IGdyb3VwLlN1Y2Nlc3NEZWxldGVkTWVzc2FnZSB8fCBEZWZhdWx0TWVzc2FnZS5yZWNvcmREZWxldGVkO1xyXG5cclxuICAgIG9mKGdyb3VwLnpNb2RlbClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIGRlbGV0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5hbGVydFNlcnZpY2Uuc2hvdyhcIkRlbGV0ZSBSZWNvcmRcIiwgRGVmYXVsdE1lc3NhZ2UuY29uZmlybWF0aW9uLFxyXG4gICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIk5vXCIsIGNzc0NsYXNzOiBcInNlY29uZGFyeVwiIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgICAgICAgICAgeyB0ZXh0OiBcIlllc1wiLCBjc3NDbGFzczogXCJwcmltYXJ5XCIgfSBhcyBBbGVydEJ1dHRvblxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKHJlcGx5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmIChyZXBseSA9PT0gXCJZZXNcIikge1xyXG4gICAgICAgICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcih0cnVlKTtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIGZnLnZhbHVlKTtcclxuICAgICAgICAgICAgZ3JvdXAuek1vZGVsLkRpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGxldCB0ZW1wUmVzcG9uc2UgPSB7fTtcclxuICAgICAgICAgICAgY29uc3Qgd2ViQXBpQWRkaXRpb25hbERldGFpbDogV2ViQXBpQWRkaXRpb25hbERldGFpbCA9IHtcclxuICAgICAgICAgICAgICBidXR0b25EZXRhaWw6IGV2ZW50LFxyXG4gICAgICAgICAgICAgIGdyb3VwOiBncm91cCxcclxuICAgICAgICAgICAgICB0cmlnZ2VyRnJvbTogZXZlbnQgPyBldmVudC50cmlnZ2VyRnJvbSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgLmh0dHBQdXQkKGAke2dyb3VwLnJlc291cmNlVVJMfS8ke2dyb3VwLnpNb2RlbC5JZH1gLCBncm91cC56TW9kZWwsIHdlYkFwaUFkZGl0aW9uYWxEZXRhaWwpXHJcbiAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICB0YXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICB0ZW1wUmVzcG9uc2UgPSBPYmplY3QuYXNzaWduKHt9LCByZXMpO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCByZXNNZXNzYWdlKVxyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkFmdGVyIGRlbGV0ZWQsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWZ0ZXJEZWxldGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgdGFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIC8vdGhpcy5oaXN0b3J5QmFjaygpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGVtcFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBSZXNwb25zZVsnUHJvY2Vzc2luZ1N0YXR1cyddKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBmZy5yZXNldCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvbihudWxsLCBncm91cCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGdyb3VwLnpNb2RlbC5EaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGF0Y2hVcGRhdGVkek1vZGVsKGZnOiBGb3JtR3JvdXAsIHJlc3A6IGFueSwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKHJlc3ApIHtcclxuICAgICAgaWYgKHJlc3AuRGF0YSkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCByZXNwLkRhdGEpO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdERhdGEgPSBaQ29tcG9uZW50SGVscGVyLnJlbW92ZVRleHRFZGl0b3JWYWx1ZUZyb21Gb3JtUGF0Y2hpbmcocmVzcC5EYXRhLCBncm91cCk7XHJcbiAgICAgICAgZmcucGF0Y2hWYWx1ZShyZXN1bHREYXRhKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChyZXNwW1wiSWRcIl0pIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgcmVzcCk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0RGF0YSA9IFpDb21wb25lbnRIZWxwZXIucmVtb3ZlVGV4dEVkaXRvclZhbHVlRnJvbUZvcm1QYXRjaGluZyhyZXNwLCBncm91cCk7XHJcbiAgICAgICAgZmcucGF0Y2hWYWx1ZShyZXN1bHREYXRhKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkZhaWxlZCB0byBwYXRjaFVwZGF0ZWR6TW9kZWwgdG8gdGhlIGZvcm1ncm91cFwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdyb3VwLnJlZmVyZW5jZUlkID0gZ3JvdXAuek1vZGVsLklkO1xyXG4gICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuXHJcbiAgICBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1R5cGVDb2RlRnVuY3Rpb24oZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCkge1xyXG4gICAgcmV0dXJuIGV2ZW50Py5kYXRhPy5UeXBlQ29kZSA9PT0gJ0ZVTkNUSU9OJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVsb2FkV29ya2Zsb3dCdXR0b24oZ3JvdXA6IFpHcm91cCwgZGF0YTogYW55KSB7XHJcbiAgICAvLyBDaGFuZ2VkIHRvIHNob3VsZCByZWxvYWQgYWxsIHdvcmtmbG93IGJ1dHRvbiBpZiBpdCB0cmlnZ2VyIG5ldy9jbG9uZW5ldyB2aWEgdGhlIGZvcm0gcGFnZS5cclxuXHJcbiAgICAvL2lmIChkYXRhLnJlbG9hZEFsbFdvcmtmbG93QnV0dG9uKSB7XHJcbiAgICBjb25zdCB3b3JrZmxvd0J1dHRvbkxpc3QgPSBPYmplY3Qua2V5cyhncm91cC56Q29tcG9uZW50cylcclxuICAgICAgLmZpbHRlcihrZXkgPT4ga2V5LnN0YXJ0c1dpdGgoJ3p3b3JrZmxvd2J1dHRvbnNfJykpXHJcbiAgICAgIC5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XHJcbiAgICAgICAgb2JqW2tleV0gPSBncm91cC56Q29tcG9uZW50c1trZXldO1xyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICAgIH0sIHt9KTtcclxuXHJcbiAgICBPYmplY3QudmFsdWVzKHdvcmtmbG93QnV0dG9uTGlzdCkuZm9yRWFjaCh2YWx1ZSA9PiB7XHJcbiAgICAgIHZhbHVlPy5bJ2xvYWRCdXR0b24nXT8uKCk7XHJcbiAgICB9KTtcclxuICAgIC8vfVxyXG4gICAgLy9lbHNlIHtcclxuICAgIC8vICBjb25zdCB3b3JrZmxvd0J1dHRvbnMgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudChncm91cCwgYHp3b3JrZmxvd2J1dHRvbnNfJHtkYXRhLnpCdXR0b25OYW1lfWApO1xyXG4gICAgLy8gIHdvcmtmbG93QnV0dG9ucz8uWydsb2FkQnV0dG9uJ10/LigpO1xyXG4gICAgLy99XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNGb3JtRGlydHlBbmRWYWxpZChmZzogRm9ybUdyb3VwLCBncm91cDogWkdyb3VwLCBpc1NraXBEaXJ0eSA9IGZhbHNlLCBldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIWlzU2tpcERpcnR5ICYmICFmZy5kaXJ0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oRGVmYXVsdE1lc3NhZ2Uubm90RGlydHlNZXNzYWdlKTtcclxuICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50ICYmIGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YVtgRm9ybU5vdERpcnR5TWVzc2FnZWBdID8gZXZlbnQuZGF0YVtgRm9ybU5vdERpcnR5TWVzc2FnZWBdIDogRGVmYXVsdE1lc3NhZ2Uubm90RGlydHlNZXNzYWdlO1xyXG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93T2theShEZWZhdWx0RGlhbG9nVGl0bGUubm90aGluZ1RvVXBkYXRlLCBtZXNzYWdlLCBbXCJjb2wtNVwiXSk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZnLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZS5zaG93Rm9ybUdyb3VwRXJyb3JNZXNzYWdlKGdyb3VwLCBmZyk7XHJcbiAgICAgIGZnLm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgZmcubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlVXBkYXRlTW9kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZVVwZGF0ZU1vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVEZWxldGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVEZWxldGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlRGVsZXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVOZXdNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZU5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZU5ld29kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZU5ld01vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlQ3JlYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVDcmVhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVDcmVhdGVNb2RlbCBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlQ3JlYXRlTW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgYmVmb3JlUGFnZUluaXRpYWxpc2UoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVQYWdlSW5pdGlhbGlzZSBpcyB1bmRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYmVmb3JlUGFnZUluaXRpYWxpc2UoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckdldE1vZGVsU3VjY2Vzcyhncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuek1vZGVsLklkKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcInpNb2RlbC5JZCBpcyBub3QgZGVmaW5lZFwiLCBncm91cC56TW9kZWwpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgaWYgKCFncm91cC5hZnRlckdldE1vZGVsU3VjY2Vzcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckdldE1vZGVsU3VjY2VzcyBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckdldE1vZGVsU3VjY2Vzcyhncm91cCk7XHJcbiAgfVxyXG5cclxuICBhZnRlck5ld01vZGVsKGdyb3VwOiBaR3JvdXApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlck5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyTmV3TW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJOZXdNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyQ3JlYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckNyZWF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyQ3JlYXRlTW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJDcmVhdGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJVcGRhdGVNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyVXBkYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJVcGRhdGVNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlclVwZGF0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckRlbGV0ZU1vZGVsKGdyb3VwOiBaR3JvdXAsIHptb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJEZWxldGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckRlbGV0ZU1vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyRGVsZXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgfVxyXG5cclxuICBhZnRlckNsb25lTmV3TW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlckNsb25lTmV3TW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJDbG9uZU5ld01vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyQ2xvbmVOZXdNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIGFmdGVyUGFnZUluaXRpYWxpc2UoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5hZnRlclBhZ2VJbml0aWFsaXNlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyUGFnZUluaXRpYWxpc2UoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBvbkFjdGlvbihncm91cDogWkdyb3VwKSB7XHJcbiAgLy8gICB0aGlzLmFjdGlvblNoZWV0Q3RybFxyXG4gIC8vICAgICAuY3JlYXRlKHtcclxuICAvLyAgICAgICBoZWFkZXI6IFwiQ2hvb3NlIGFuIEFjdGlvblwiLFxyXG4gIC8vICAgICAgIGJ1dHRvbnM6IGdyb3VwLnRvcFJpZ2h0QWN0aW9uQnV0dG9uXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICAgIC50aGVuKGFjdGlvblNoZWV0RWwgPT4ge1xyXG4gIC8vICAgICAgIGFjdGlvblNoZWV0RWwucHJlc2VudCgpO1xyXG4gIC8vICAgICB9KTtcclxuICAvLyB9XHJcblxyXG4gIC8vIHNldE1vZGVsVmFsdWUocHJvcGVydHlOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGdyb3VwOiBaR3JvdXApIHtcclxuICAvLyAgIGdyb3VwLnpNb2RlbFtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XHJcbiAgLy8gICBpZiAoZ3JvdXAuaXNMb2FkaW5nKSB7XHJcbiAgLy8gICAgIHJldHVybjtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IGZnID0gZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgLy8gICBpZiAoIWZnKSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICwgbm8tZGVidWdnZXJcclxuICAvLyAgICAgZGVidWdnZXI7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjb25zdCBmYyA9IGZnLmNvbnRyb2xzW3Byb3BlcnR5TmFtZV07XHJcbiAgLy8gICBpZiAoIWZjKSB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyXHJcbiAgLy8gICAgIGRlYnVnZ2VyO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgZmMuc2V0VmFsdWUodmFsdWUpO1xyXG4gIC8vICAgZmMubWFya0FzRGlydHkoKTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBzaG93ek1vZGFsKG1vZGFsUGFnZVBhcmFtczogTW9kYWxQYWdlUGFyYW1zKTogT2JzZXJ2YWJsZTxNb2RhbFJlc3BvbnNlPiB7XHJcbiAgICBpZiAobW9kYWxQYWdlUGFyYW1zLnBhcmVudEdyb3VwKSB7XHJcbiAgICAgIC8vIGRpc2FibGUgaXNUcmlnZ2VyZWQgYmVmb3JlIGRpc3BsYXkgdGhlIHBvcHVwLlxyXG4gICAgICBtb2RhbFBhZ2VQYXJhbXMucGFyZW50R3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLm1vZGFsU2VydmljZS5zaG93KG1vZGFsUGFnZVBhcmFtcyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVQb3N0KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBmb3IgUG9zdCB0byBDb29raWVTdG9yZVxyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcImFwaS9Db29raWVTdG9yZXNcIjtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVmFsdWUgPSB7XHJcbiAgICAgICdOYW1lJzogbmFtZSxcclxuICAgICAgJ1ZhbHVlJzogSlNPTi5zdHJpbmdpZnkodmFsdWUpXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFBvc3QkKGNvb2tpZVN0b3JlVVJMLCBjb29raWVTdG9yZVZhbHVlKS5waXBlKG1hcChyZXMgPT4ge1xyXG4gICAgICBpZiAocmVzKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJncmlkIGNvbmZpZyBzYXZlZChcIiArIHJlcy5zdGF0dXMgKyBcIik6IFwiLCByZXMpO1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb29raWVTdG9yZUdldChuYW1lOiBzdHJpbmcsIGFjY2Vzc1Rva2VuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcImFwaS9Db29raWVTdG9yZXMvP25hbWU9XCIgKyBuYW1lO1xyXG5cclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cEdldCQoY29va2llU3RvcmVVUkwsIHsgaGVhZGVyczogYWNjZXNzVG9rZW4gfSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb29raWVTdG9yZURlbGV0ZU11bHRpcGxlKG5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAvLyBmb3IgUG9zdCB0byBDb29raWVTdG9yZVxyXG4gICAgY29uc3QgY29va2llU3RvcmVVUkwgPSB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgKyBcIkFkbWluL0RlbGV0ZU11bHRpcGxlQ29va2llc1wiO1xyXG4gICAgY29uc3QgY29va2llU3RvcmVWYWx1ZSA9IHtcclxuICAgICAgJ2NvbnRhaW5OYW1lJzogbmFtZVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChjb29raWVTdG9yZVVSTCwgY29va2llU3RvcmVWYWx1ZSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb0VsZW1lbnRCeUlkKGlkOiBzdHJpbmcsIGJlaGF2aW9yOiAnc21vb3RoJyB8ICdhdXRvJyA9ICdzbW9vdGgnKSB7XHJcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuICAgIGVsLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3IgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdHJhbnNsYXRpb25QYWdlRWxlbWVudChncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IG9ic0xpc3QgPSBuZXcgQXJyYXk8T2JzZXJ2YWJsZTxhbnk+PigpO1xyXG4gICAgaWYgKGdyb3VwLmZvcm1IZWFkZXIpIHtcclxuICAgICAgb2JzTGlzdC5wdXNoKHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLiR0cmFuc2xhdGVTaW5nbGVJdGVtKGdyb3VwLCBcImZvcm1IZWFkZXJcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChncm91cC5uYXZJdGVtcyAmJiBncm91cC5uYXZJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIG9ic0xpc3QucHVzaCh0aGlzLnRyYW5zbGF0aW9uU2VydmljZS4kdHJhbnNsYXRlSXRlbUxpc3QoZ3JvdXAubmF2SXRlbXMsIFwidGV4dFwiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9ic0xpc3QubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcmtKb2luKG9ic0xpc3QpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vI3JlZ2lvbiBzaWduYWxSIHNlcnZpY2VcclxuICBwdWJsaWMgam9pblByb2plY3RTaWduYWxSKHByb2plY3RDb2RlPzogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5zaWduYWxyU2VydmljZS5zaWduYWxSRW5hYmxlZCgpKSB7XHJcbiAgICAgIGlmIChwcm9qZWN0Q29kZSkge1xyXG4gICAgICAgIHRoaXMuc2lnbmFsclNlcnZpY2Uuam9pbkdyb3VwKHByb2plY3RDb2RlKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBXZSBkZWZhdWx0IGZpcnN0IHByb2plY3QgY29kZSBpbiBlbnZpcm9ubWVudCBhcyBncm91cFxyXG4gICAgICAgIGNvbnN0IGVudmlyb25tZW50ID0gdGhpcy56Y29yZVNlcnZpY2UuZ2V0RW52aXJvbm1lbnQoKTtcclxuICAgICAgICBjb25zdCBmaXJzdFByb2plY3RDb2RlID0gZW52aXJvbm1lbnQucHJvamVjdENvZGVzWzBdO1xyXG4gICAgICAgIHRoaXMuc2lnbmFsclNlcnZpY2Uuam9pbkdyb3VwKGZpcnN0UHJvamVjdENvZGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlU2lnbmFsUk1vZGlmaWNhdGlvbkFsZXJ0KGZvcm1JZDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5zaWduYWxyU2VydmljZS5zaWduYWxSRW5hYmxlZCgpICYmIHRoaXMuZW52aXJvbm1lbnQuZW5hYmxlRm9ybVBhZ2VNb2RpZmljYXRpb25BbGVydCkge1xyXG4gICAgICBjb25zdCBldmVudE5hbWUgPSBgJHt3aW5kb3cubG9jYXRpb24uaHJlZn1gLnJlcGxhY2UoLyhbXjpdXFwvKVxcLysvZywgXCIkMVwiKTtcclxuICAgICAgaWYgKCF0aGlzLmdyb3VwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIpIHtcclxuICAgICAgICB0aGlzLmdyb3VwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIgPSB7fTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdyb3VwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXJbJ2FsZXJ0Rm9ybU1vZGlmaWVkJ10gPSB0aGlzLmFsZXJ0Rm9ybU1vZGlmaWVkLmJpbmQodGhpcywgZm9ybUlkKTtcclxuXHJcbiAgICAgIHRoaXMuc2lnbmFsclNlcnZpY2UudW5zdWJzY3JpYmVGcm9tRXZlbnQoYCR7ZXZlbnROYW1lfWApOyAvLyB1bnN1YnNjcmliZSB0aGUgZXZlbnQgYmVmb3JlIHN1YnNjcmliZSB0byBldmVudCBhZ2Fpbi5cclxuICAgICAgdGhpcy5zaWduYWxyU2VydmljZS5zdWJzY3JpYmVUb0V2ZW50KHRoaXMuZ3JvdXAsIGAke2V2ZW50TmFtZX1gLCBgZ3JvdXAuc2lnbmFsUkNhbGxiYWNrSGFuZGxlci5hbGVydEZvcm1Nb2RpZmllZGApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignZW5hYmxlRm9ybVBhZ2VNb2RpZmljYXRpb25BbGVydCBub3QgZW5hYmxlZC4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWxlcnRGb3JtTW9kaWZpZWQoZm9ybUlkOiBzdHJpbmcsIGdyb3VwOiBaR3JvdXAsIHJlc3A6IGFueSwgZXZlbnROYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmICghcmVzcCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzcFJlc3VsdCA9IEpTT04ucGFyc2UocmVzcCk7XHJcblxyXG4gICAgaWYgKCFyZXNwUmVzdWx0LlVzZXJOYW1lKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZm9ybUlkID09PSByZXNwUmVzdWx0LklkPy50b1N0cmluZygpICYmIGV2ZW50TmFtZSA9PT0gd2luZG93LmxvY2F0aW9uLmhyZWYpIHtcclxuICAgICAgaWYgKHJlc3BSZXN1bHQuVXNlck5hbWUgPT09IHRoaXMuYXV0aFNlcnZpY2UuZTFUb2tlbi5teVByb2ZpbGUuVXNlck5hbWUpIHtcclxuICAgICAgICBpZiAocmVzcFJlc3VsdC5BY3Rpb24gPT09IEFjdGlvblR5cGUuVXBkYXRlKSB7XHJcbiAgICAgICAgICB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cEdldCQoYCR7dGhpcy5ncm91cC5yZXNvdXJjZVVSTH0vJHtmb3JtSWR9YCwgbnVsbCwgeyB0cmlnZ2VyRnJvbTogVHJpZ2dlckZyb21UeXBlLnNpZ25hbFJBbGVydCB9KS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVsb2FkRGF0YUFuZFdvcmtmbG93QnV0dG9uKHJlc3ApO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChyZXNwUmVzdWx0LkFjdGlvbiA9PT0gQWN0aW9uVHlwZS5EZWxldGUpIHtcclxuICAgICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3coXCJSZWNvcmQgRGVsZXRlZCBieSBBbm90aGVyIFVzZXJcIiwgXCJUaGUgY3VycmVudCByZWNvcmQgaGFzIGJlZW4gZGVsZXRlZCBieSBhbm90aGVyIHVzZXIuXCIsIFtcclxuICAgICAgICAgICAgeyB0ZXh0OiBcIk9LXCIsIGNzc0NsYXNzOiBcInByaW1hcnlcIiB9IGFzIEFsZXJ0QnV0dG9uXHJcbiAgICAgICAgICBdLCBbXCJjb2wtNlwiXSwgdW5kZWZpbmVkLCB0cnVlKS5waXBlKHN3aXRjaE1hcCgocmVwbHkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlcGx5ID09PSBcIk9LXCIpIHtcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlQmFja1RvUHJldmlvdXNQYWdlKGdyb3VwKTtcclxuICAgICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICApLnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXNwUmVzdWx0LkFjdGlvbiA9PT0gQWN0aW9uVHlwZS5VcGRhdGUpIHtcclxuICAgICAgICAgIHRoaXMud2ViQXBpU2VydmljZS5odHRwR2V0JChgJHt0aGlzLmdyb3VwLnJlc291cmNlVVJMfS8ke2Zvcm1JZH1gLCBudWxsKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwICYmIHJlc3AuUm93VmVyc2lvbikge1xyXG4gICAgICAgICAgICAgIGlmIChyZXNwLlJvd1ZlcnNpb24gIT09IHRoaXMuZ3JvdXAuek1vZGVsPy5Sb3dWZXJzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93KFwiVGhlIGN1cnJlbnQgcGFnZSBoYXMgYmVlbiBtb2RpZmllZCBieSBvdGhlciB1c2Vycy5cIiwgXCJXb3VsZCB5b3UgbGlrZSB0byByZWZyZXNoIHRoZSBwYWdlIGRhdGE/XCIsIFtcclxuICAgICAgICAgICAgICAgICAgeyB0ZXh0OiBcIk5vXCIsIGNzc0NsYXNzOiBcInNlY29uZGFyeVwiIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgICAgICAgICAgICAgIHsgdGV4dDogXCJZZXNcIiwgY3NzQ2xhc3M6IFwicHJpbWFyeVwiIH0gYXMgQWxlcnRCdXR0b25cclxuICAgICAgICAgICAgICAgIF0sIFtcImNvbC02XCJdLCB1bmRlZmluZWQsIHRydWUpLnBpcGUoc3dpdGNoTWFwKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAocmVwbHkgPT09IFwiWWVzXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZERhdGFBbmRXb3JrZmxvd0J1dHRvbihyZXNwKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93UGVybWFuZW50bHkoJ1RoZSBkYXRhIG9uIHRoZSBjdXJyZW50IHBhZ2UgaXMgbm90IHVwIHRvIGRhdGUsIGFzIGl0IGhhcyBiZWVuIHNhdmVkIGFuZCBvdmVyd3JpdHRlbiBieSBhbm90aGVyIHVzZXIuIFBsZWFzZSByZWZyZXNoIHRoZSBwYWdlLicsICd0b3AnLCAnd2FybmluZycpO1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEFsZXJ0IHJlY2VpdmVkIHJlZ2FyZGluZyBmb3JtIG1vZGlmaWNhdGlvbiwgUm93VmVyc2lvbiByZW1haW5zIHVuYWx0ZXJlZC4gTm8gZnVydGhlciBhY3Rpb24gaGFzIGJlZW4gdGFrZW4uYClcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWxvYWREYXRhQW5kV29ya2Zsb3dCdXR0b24oek1vZGVsOiBhbnkpIHtcclxuICAgIHRoaXMuZ3JvdXAuek1vZGVsID0gek1vZGVsO1xyXG4gICAgY29uc3QgZmc6IEZvcm1Hcm91cCA9IHRoaXMuZ3JvdXAuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBjb25zdCByZXN1bHREYXRhID0gWkNvbXBvbmVudEhlbHBlci5yZW1vdmVUZXh0RWRpdG9yVmFsdWVGcm9tRm9ybVBhdGNoaW5nKHRoaXMuZ3JvdXAuek1vZGVsLCB0aGlzLmdyb3VwKTtcclxuICAgIGZnLnBhdGNoVmFsdWUocmVzdWx0RGF0YSk7XHJcbiAgICBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG5cclxuICAgIC8vIENhcHR1cmUgYWxsIHdvcmtmbG93IGJ1dHRvbnNcclxuICAgIGNvbnN0IHdvcmtmbG93QnV0dG9ucyA9IE9iamVjdC5rZXlzKHRoaXMuZ3JvdXAuekNvbXBvbmVudHMpXHJcbiAgICAgIC5maWx0ZXIoa2V5ID0+IGtleS5zdGFydHNXaXRoKFwiendvcmtmbG93YnV0dG9uc19cIikpXHJcbiAgICAgIC5tYXAoa2V5ID0+IHRoaXMuZ3JvdXAuekNvbXBvbmVudHNba2V5XSk7XHJcblxyXG4gICAgLy8gUmVsb2FkIHdvcmtmbG93IGJ1dHRvbnNcclxuICAgIHdvcmtmbG93QnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7XHJcbiAgICAgIGJ1dHRvbi5sb2FkQnV0dG9uKCk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vICNyZWdpb24gREVDXHJcbiAgcHVibGljIGFzeW5jIGxvYWRDb250YWluZXJWaWV3KGVsZW1lbnRDb250YWluZXI6IGFueSwgY29udGFpbmVyUGFnZTogYW55LCBkYXRhOiBaRmllbGQsIGdyb3VwPzogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWVsZW1lbnRDb250YWluZXIpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJFbGVtZW50Q29udGFpbmVyIGlzIG51bGwuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFjb250YWluZXJQYWdlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQ29udGFpbmVyUGFnZSBpcyBudWxsLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHZpZXdDb250YWluZXJSZWYgPSBlbGVtZW50Q29udGFpbmVyLnZpZXdDb250YWluZXJSZWY7XHJcbiAgICB2aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XHJcblxyXG4gICAgY29uc3QgZW1iZWRkZWRncm91cCA9IG5ldyBaR3JvdXAoKTtcclxuICAgIHRoaXMuc2V0R3JvdXBGb3JEZWJ1Z2dlcihlbWJlZGRlZGdyb3VwKTtcclxuICAgIGNvbnN0IGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT4gPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb250YWluZXJQYWdlKTtcclxuXHJcbiAgICBlbWJlZGRlZGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7IC8vIGVuYWJsZSBiYWNrIHRoZSBidXR0b24gZm9yIHRyaWdnZXJpbmcuXHJcblxyXG4gICAgLy8gT2JqZWN0LmFzc2lnbihjb21wb25lbnRSZWYuaW5zdGFuY2VbXCJncm91cFwiXSwgZ3JvdXApO1xyXG4gICAgT2JqZWN0LmFzc2lnbihjb21wb25lbnRSZWYuaW5zdGFuY2VbXCJncm91cFwiXSwgZW1iZWRkZWRncm91cCk7XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihjb21wb25lbnRSZWYuaW5zdGFuY2VbXCJncm91cFwiXSwgeyBwYXJlbnRHcm91cDogZ3JvdXAsIGlzRW1iZWRkZWRQYWdlOiB0cnVlLCBlbGVtZW50Q29udGFpbmVyOiBlbGVtZW50Q29udGFpbmVyLCBDb250YWluZXJGb3JtQXV0b1Njcm9sbDogZGF0YS5Db250YWluZXJGb3JtQXV0b1Njcm9sbCB9KTtcclxuXHJcbiAgICAvLyB0b2RvOiBhZGQgaW4gcHJvcFxyXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5Db250YWluZXJGb3JtQXV0b1Njcm9sbCkge1xyXG4gICAgICB0aGlzLnNjcm9sbFRvRW1iYmVkQ29tcG9uZW50UGFnZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvRW1iYmVkQ29tcG9uZW50UGFnZShtaWxsaVNlY29uZHM6IG51bWJlciA9IDE1MDApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGVuZE9mR3JpZERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZW5kLW9mLWdyaWRcIik7XHJcbiAgICBjb25zdCBlbmRPZkdyaWRQb3NpdGlvbkluZm8gPSBlbmRPZkdyaWREaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBjb25zdCB5Q29vciA9IChlbmRPZkdyaWRQb3NpdGlvbkluZm8/LnkgfHwgNjMwKSAtIDEwO1xyXG5cclxuICAgIGNvbnN0IG1haW5Jb25Db250ZW50OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImlvbi1jb250ZW50LW1haW4tcGFnZVwiKTtcclxuICAgIHJldHVybiBtYWluSW9uQ29udGVudC5zY3JvbGxCeVBvaW50KDAsIHlDb29yLCBtaWxsaVNlY29uZHMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNjcm9sbFRvVG9wT2ZQYWdlKG1pbGxpU2Vjb25kczogbnVtYmVyID0gMTUwMCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgbWFpbklvbkNvbnRlbnQ6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiaW9uLWNvbnRlbnQtbWFpbi1wYWdlXCIpO1xyXG4gICAgcmV0dXJuIG1haW5Jb25Db250ZW50LnNjcm9sbFRvUG9pbnQoMCwgMCwgbWlsbGlTZWNvbmRzKSBhcyBQcm9taXNlPHZvaWQ+O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNsb3NlQ29udGFpbmVyVmlldyhncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoZ3JvdXBbYHBhcmVudEdyb3VwYF0gJiYgZ3JvdXBbYHBhcmVudEdyb3VwYF1bYGUxQ2xvc2VHcmlkQ29udGFpbmVyYF0gJiYgdHlwZW9mIGdyb3VwW2BwYXJlbnRHcm91cGBdW2BlMUNsb3NlR3JpZENvbnRhaW5lcmBdID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgZ3JvdXBbYHBhcmVudEdyb3VwYF1bYGUxQ2xvc2VHcmlkQ29udGFpbmVyYF0oZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgcHJpdmF0ZSBzZXRHcm91cEZvckRlYnVnZ2VyKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IGlzRGVidWdnaW5nID0gdGhpcy56Y29yZVNlcnZpY2UuaXNEZWJ1Z1Nlc3Npb24oKSB8fCBmYWxzZTtcclxuICAgIGlmIChpc0RlYnVnZ2luZykge1xyXG4gICAgICB0aGlzLmRlYnVnU2VydmljZS5vbkluaXREZWJ1Z2dlcihncm91cCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVmcmVzaEdyaWQoZ3JvdXA6IFpHcm91cCkge1xyXG4gIGNvbnN0IHpncmlkQ29udHJvbCA9IGdyb3VwW1wiZ3JpZE9wdGlvbnNcIl0gYXMgWkdyaWQ7XHJcbiAgaWYgKHpncmlkQ29udHJvbCkge1xyXG4gICAgemdyaWRDb250cm9sLmdldERhdGEoKTtcclxuICB9XHJcbiAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxufVxyXG4iXX0=
|
|
1310
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvc2VydmljZXMvbWFpbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQWdCLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFpQyxNQUFNLGlCQUFpQixDQUFDO0FBS2pILDhCQUE4QjtBQUM5QixPQUFPLEVBQWMsZUFBZSxFQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFRLE1BQU0sTUFBTSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBTy9ELE9BQU8sRUFDUSxXQUFXLEVBQWdCLGdCQUFnQixFQUVYLE1BQU0sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUF1QyxlQUFlLEVBRTFKLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7O0FBTXpCLE1BQU0sT0FBTyxXQUFXO0lBbUJ0QixZQUNVLE1BQWMsRUFDZCxjQUE4QixFQUM5QixTQUEwQixFQUMxQixhQUE0QixFQUM1QixZQUEwQixFQUMxQixZQUEwQixFQUMxQixZQUEwQixFQUMxQixrQkFBc0MsRUFDdEMsNEJBQTBELEVBQzFELGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLFlBQTBCLEVBQzFCLGNBQXFDLEVBQ3JDLFlBQW9DLEVBQ3BDLGtCQUFzQyxFQUN0QyxjQUE4QixFQUM5QixhQUE0QixFQUM1QixhQUE0QixFQUM1QixZQUEwQixFQUMxQixXQUF3QixFQUN4QixXQUF3QjtRQXBCeEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1C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UUFDaEUsSUFBSSxXQUFXLEVBQUU7WUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUM7O3dHQXZpRFUsV0FBVzs0R0FBWCxXQUFXLGNBSFYsTUFBTTsyRkFHUCxXQUFXO2tCQUp2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7QUE0aURELE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYTtJQUN2QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFVLENBQUM7SUFDbkQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ3hCO0lBQ0QsS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgTmF2aWdhdGlvblN0YXJ0LCBOYXZpZ2F0aW9uRW5kLCBOYXZpZ2F0aW9uRXJyb3IsIFJvdXRlciwgRXZlbnQsIEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcbmltcG9ydCB7IE1vZGFsQ29udHJvbGxlciwgTmF2Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIFN1YnNjcmlwdGlvbiwgb2YsIGZvcmtKb2luLCBmcm9tIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRhcCwgc3dpdGNoTWFwLCBtYXAsIG1lcmdlQWxsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEaWFsb2dSZWYsIERpYWxvZ1NlcnZpY2UsIERpYWxvZ1NldHRpbmdzIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZGlhbG9nJztcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgWkNvbXBvbmVudERlYnVnU2VydmljZSB9IGZyb20gJy4vemNvbXBvbmVudC5kZWJ1Zy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgWkdyaWQgfSBmcm9tICcuLi96Z3JpZC96Z3JpZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNb2RhbFNlcnZpY2UsIE1vZGFsUmVzcG9uc2UgfSBmcm9tICdtbWhnbG9iYWwtem1vZGFsJztcclxuaW1wb3J0IHtcclxuICBBbGVydEJ1dHRvbiwgTUVTU0FHRVRZUEUsIEFsZXJ0U2VydmljZSwgWkNvbXBvbmVudEhlbHBlciwgTW9kYWxQYWdlUGFyYW1zLFxyXG4gIENhY2hlU2VydmljZSwgRmllbGRTZXJ2aWNlLCBSZXNvdXJjZUFwaVNlcnZpY2UsIFRyYW5zbGF0aW9uU2VydmljZSwgV2ViQXBpU2VydmljZSwgU3RvcmFnZVNlc3Npb25TZXJ2aWNlLCBPQXV0aDJTZXJ2aWNlLCBTaWduYWxyU2VydmljZSwgQ29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZSxcclxuICBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIFpDb3JlU2VydmljZSwgWkZpZWxkLCBaR3JvdXAsIERlZmF1bHRNZXNzYWdlLCBEZWZhdWx0RGlhbG9nVGl0bGUsIEFjdGlvblR5cGUsIFRvYXN0U2VydmljZSwgQXV0aFNlcnZpY2UsIEZvcm1UeXBlLCBUcmlnZ2VyRnJvbVR5cGUsXHJcbiAgV2ViQXBpQWRkaXRpb25hbERldGFpbCwgTWVudVNlcnZpY2UsIE9BdXRoTWVudUl0ZW1cclxufSBmcm9tICdtbWhnbG9iYWwtemNvcmUnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBNYWluU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBncm91cDogWkdyb3VwO1xyXG4gIHByaXZhdGUgb2F1dGhFbnZpcm9ubWVudFVybDogc3RyaW5nO1xyXG4gIHByaXZhdGUgZW52aXJvbm1lbnQ7XHJcbiAgcHJpdmF0ZSBiYWNrTmF2aWdhdGlvblBhdGg6IHN0cmluZ1tdID0gW107XHJcbiAgcHJpdmF0ZSByb3V0ZVBhcmFtOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHByaXZhdGUgcHJldmlvdXNSb3V0ZVBhcmFtOiBzdHJpbmc7XHJcbiAgcHVibGljIGN1cnJlbnRVcmw6IHN0cmluZyA9ICcnO1xyXG5cclxuICBwcml2YXRlIE5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZID0gJ3JvdXRlUGFyYW0nO1xyXG4gIHByaXZhdGUgUFJFVklPVVNfUEFHRV9ST1VURV9QQVJBTV9TVE9SQUdFX0tFWSA9ICdwcmV2aW91c1BhZ2VSb3V0ZVBhcmFtJztcclxuICBwcml2YXRlIEJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZID0gJ2JhY2tOYXZpZ2F0aW9uUGF0aCc7XHJcbiAgcHJpdmF0ZSBOQVZJR0FURURfUkVMT0FEX0dSSURfU1RPUkFHRV9LRVkgPSAnbmF2aWdhdGVkUmVsb2FkR3JpZCc7XHJcbiAgcHJpdmF0ZSBDTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZID0gJ2Nsb25lTmV3TW9kZWwnO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHNlY3JldEtleSA9ICdteS1zZWNyZXQta2V5JztcclxuICBwcml2YXRlIHByZXZpb3VzVXJsOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBuYXZpZ2F0aW9uU3RhcnRUaW1lOiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbEN0cmw6IE1vZGFsQ29udHJvbGxlcixcclxuICAgIHByaXZhdGUgbmF2Q29udHJvbGxlcjogTmF2Q29udHJvbGxlcixcclxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNhY2hlU2VydmljZTogQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWVsZFNlcnZpY2U6IEZpZWxkU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVzb3VyY2VBcGlTZXJ2aWNlOiBSZXNvdXJjZUFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2U6IENvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHdlYkFwaVNlcnZpY2U6IFdlYkFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHpjb3JlU2VydmljZTogWkNvcmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcclxuICAgIHByaXZhdGUgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgZGVidWdTZXJ2aWNlOiBaQ29tcG9uZW50RGVidWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGlvblNlcnZpY2U6IFRyYW5zbGF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgc2lnbmFsclNlcnZpY2U6IFNpZ25hbHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBvYXV0aDJTZXJ2aWNlOiBPQXV0aDJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtZW51U2VydmljZTogTWVudVNlcnZpY2VcclxuICApIHtcclxuICAgIGNvbnNvbGUubG9nKCdNYWluU2VydmljZSBjb25zdHJ1Y3RvcicpO1xyXG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IHRoaXMuemNvcmVTZXJ2aWNlLmdldEVudmlyb25tZW50KCk7XHJcbiAgICB0aGlzLm9hdXRoRW52aXJvbm1lbnRVcmwgPSB0aGlzLnpjb3JlU2VydmljZS5nZXRPYXV0aFVybCgpO1xyXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgoZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlTmF2aWdhdGlvblN0YXJ0KGV2ZW50KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlTmF2aWdhdGlvbkVuZChldmVudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FcnJvcikge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlTmF2aWdhdGlvbkVycm9yKGV2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBkaXNtaXNzQWxsT3ZlcmxheXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRvYXN0U2VydmljZT8uZGlzbWlzc0FsbCgpO1xyXG4gICAgdGhpcy5hbGVydFNlcnZpY2U/LmRpc21pc3NBbGwoKTtcclxuICAgIHRoaXMubW9kYWxTZXJ2aWNlPy5kaXNtaXNzQWxsKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU5hdmlnYXRpb25TdGFydChldmVudDogTmF2aWdhdGlvblN0YXJ0KTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcblxyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XHJcbiAgICB0aGlzLnByZXZpb3VzVXJsID0gdGhpcy5jdXJyZW50VXJsIHx8IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtcclxuICAgIHRoaXMuY3VycmVudFVybCA9IGV2ZW50LnVybDtcclxuXHJcbiAgICBjb25zdCB0cmlnZ2VyVHlwZSA9IHRoaXMucHJldmlvdXNVcmwgPT09IHRoaXMuY3VycmVudFVybCA/IFRyaWdnZXJGcm9tVHlwZS5yZWZyZXNoU3RhcnQgOiBUcmlnZ2VyRnJvbVR5cGUubmF2aWdhdGVTdGFydDtcclxuICAgIHRoaXMudXBkYXRlQXBwTW9uUGVyZm9ybWFuY2UodHJpZ2dlclR5cGUsIHRoaXMucHJldmlvdXNVcmwsIHRydWUpLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIHRoaXMuZGlzbWlzc0FsbE92ZXJsYXlzKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZ2V0U3RhcnR1cFBhZ2UoKSA9PT0gZXZlbnQudXJsKSB7XHJcbiAgICAgIHRoaXMucmVzZXRSb3V0ZVBhcmFtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU5hdmlnYXRpb25FbmQoZXZlbnQ6IE5hdmlnYXRpb25FbmQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSB0aGlzLm5hdmlnYXRpb25TdGFydFRpbWU7XHJcbiAgICBjb25zdCB0cmlnZ2VyVHlwZSA9IHRoaXMucHJldmlvdXNVcmwgPT09IHRoaXMuY3VycmVudFVybCA/IFRyaWdnZXJGcm9tVHlwZS5yZWZyZXNoRW5kIDogVHJpZ2dlckZyb21UeXBlLm5hdmlnYXRlRW5kO1xyXG5cclxuICAgIHRoaXMudXBkYXRlQXBwTW9uUGVyZm9ybWFuY2UodHJpZ2dlclR5cGUsIGV2ZW50LnVybEFmdGVyUmVkaXJlY3RzLCB0cnVlLCBkdXJhdGlvbikuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLmN1cnJlbnRVcmwgPSBldmVudC51cmxBZnRlclJlZGlyZWN0cztcclxuXHJcbiAgICBjb25zb2xlLmxvZyhldmVudCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU5hdmlnYXRpb25FcnJvcihldmVudDogTmF2aWdhdGlvbkVycm9yKTogdm9pZCB7XHJcbiAgICBjb25zdCBkdXJhdGlvbiA9IHBlcmZvcm1hbmNlLm5vdygpIC0gdGhpcy5uYXZpZ2F0aW9uU3RhcnRUaW1lO1xyXG4gICAgdGhpcy51cGRhdGVBcHBNb25QZXJmb3JtYW5jZShUcmlnZ2VyRnJvbVR5cGUubmF2aWdhdGVFcnJvciwgdGhpcy5wcmV2aW91c1VybCwgZmFsc2UsIGR1cmF0aW9uKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhldmVudC5lcnJvcik7XHJcbiAgICB0aGlzLnJlbW92ZUxhc3ROYXZpZ2F0ZVJlY29yZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVBcHBNb25QZXJmb3JtYW5jZShcclxuICAgIHRyaWdnZXJUeXBlOiBUcmlnZ2VyRnJvbVR5cGUsXHJcbiAgICB1cmw6IHN0cmluZyxcclxuICAgIGlzU3VjY2VzczogYm9vbGVhbixcclxuICAgIGR1cmF0aW9uPzogbnVtYmVyXHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLmVudmlyb25tZW50LnNraXBBcHBtb24pXHJcbiAgICB7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBhcHBtb25Eb21haW5VcmwgaWYgbWlzc2luZ1xyXG4gICAgaWYgKCF0aGlzLnJlc291cmNlQXBpU2VydmljZS5hcHBtb25Eb21haW5VcmwpIHtcclxuICAgICAgdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuYXBwbW9uRG9tYWluVXJsID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnQXBwbW9uRG9tYWluVXJsJykgfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIGRlcGVuZGVuY2llc1xyXG4gICAgaWYgKCF0aGlzLmF1dGhTZXJ2aWNlLmUxVG9rZW4gfHwgIXRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLmFwcG1vbkRvbWFpblVybCkge1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdldEN1cnJlbnRUaW1lc3RhbXAgPSAoKTogc3RyaW5nID0+IHtcclxuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgIGNvbnN0IHBhZCA9IChuOiBudW1iZXIpID0+IG4udG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgICByZXR1cm4gYCR7ZGF0ZS5nZXRGdWxsWWVhcigpfS0ke3BhZChkYXRlLmdldE1vbnRoKCkgKyAxKX0tJHtwYWQoZGF0ZS5nZXREYXRlKCkpfSAke3BhZChkYXRlLmdldEhvdXJzKCkpfToke3BhZChkYXRlLmdldE1pbnV0ZXMoKSl9OiR7cGFkKGRhdGUuZ2V0U2Vjb25kcygpKX0uJHtkYXRlLmdldE1pbGxpc2Vjb25kcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoNywgJzAnKX1gO1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBnZXRDdXJyZW50VGltZXN0YW1wKCk7XHJcbiAgICBjb25zdCBjdXJyZW50RG9tYWluID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcclxuXHJcbiAgICAvLyBEZXRlcm1pbmUgbWVudSBuYW1lXHJcbiAgICBjb25zdCBMT0dJTl9QQUdFID0gJ0xvZ2luUGFnZSc7XHJcbiAgICBjb25zdCBIT01FX1BBR0UgPSAnSG9tZVBhZ2UnO1xyXG4gICAgY29uc3QgQVVUSF9QQVRIID0gJy9hdXRoJztcclxuXHJcbiAgICBsZXQgbWVudU5hbWUgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdtZW51TmFtZScpIHx8IG51bGw7XHJcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLnBhdGhuYW1lID09PSBBVVRIX1BBVEgpIHtcclxuICAgICAgbWVudU5hbWUgPSBMT0dJTl9QQUdFO1xyXG4gICAgfSBlbHNlIGlmICh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgPT09IHRoaXMuZW52aXJvbm1lbnQuc3RhcnRVcFBhZ2UpIHtcclxuICAgICAgbWVudU5hbWUgPSBIT01FX1BBR0U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QgcGF5bG9hZFxyXG4gICAgY29uc3QgcGFyYW1zID0ge1xyXG4gICAgICBVcmw6IGAke2N1cnJlbnREb21haW59JHt1cmx9YCxcclxuICAgICAgSXNBdXRoZW50aWNhdGVkOiB0cnVlLFxyXG4gICAgICBUaW1lc3RhbXA6IHRpbWVzdGFtcCxcclxuICAgICAgRHVyYXRpb246IGR1cmF0aW9uID8/IG51bGwsXHJcbiAgICAgIFJlcXVlc3RNZXRob2Q6ICdQT1NUJyxcclxuICAgICAgVXNlck5hbWU6IHRoaXMuYXV0aFNlcnZpY2UudXNlcklkLFxyXG4gICAgICBVc2VySWQ6IHRoaXMuYXV0aFNlcnZpY2UuZTFUb2tlbj8udXNlck5hbWUgfHwgJycsXHJcbiAgICAgIFN1Y2Nlc3M6IGlzU3VjY2VzcyxcclxuICAgICAgRW52aXJvbm1lbnQ6ICdVSScsXHJcbiAgICAgIFByb2plY3RDb2RlOiB0aGlzLmVudmlyb25tZW50LnByb2plY3RDb2Rlc1swXSxcclxuICAgICAgU291cmNlTmFtZTogdGhpcy5lbnZpcm9ubWVudC5wcm9qZWN0Q29kZXNbMF0sXHJcbiAgICAgIENvbXBvbmVudENvZGU6IG51bGwsXHJcbiAgICAgIEV2ZW50SWQ6IG51bGwsXHJcbiAgICAgIEV2ZW50VHlwZTogdHJpZ2dlclR5cGUsXHJcbiAgICAgIFNlc3Npb25JZDogc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnc2Vzc2lvblRhYklkJyksXHJcbiAgICAgIE1lbnVOYW1lOiBtZW51TmFtZSxcclxuICAgIH07XHJcblxyXG4gICAgLy8gQVBJIEVuZHBvaW50XHJcbiAgICBjb25zdCBhcGlFbmRwb2ludCA9IGAke3RoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLmFwcG1vbkRvbWFpblVybH1hcGkvQXBpU3VtbWFyeUluZm9zL2A7XHJcblxyXG4gICAgLy8gQ2FsbCB0aGUgd2ViIEFQSSBhbmQgaGFuZGxlIGVycm9yc1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwUG9zdCQoYXBpRW5kcG9pbnQsIHBhcmFtcyk7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gZm9yIHNpZ25hbFIgYWxlcnRcclxuICBwdWJsaWMgZ2V0TGlzdEZpZWxkTmFtZSA9IChmaWVsZE5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiA9PiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpLnNldChcIm5hbWVcIiwgZmllbGROYW1lKTtcclxuICAgIHJldHVybiB0aGlzLm9hdXRoMlNlcnZpY2UuaHR0cEdldCQodGhpcy5maWVsZFNlcnZpY2UubGlzdEZpZWxkQXBpUm91dGUsIHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKHJlcyA9PiAocmVzIGFzIGFueSkuRmllbGRFbGVtZW50TWFzdGVySWQpLFxyXG4gICAgICBzd2l0Y2hNYXAoaWQgPT4gdGhpcy5vYXV0aDJTZXJ2aWNlLmh0dHBHZXQkKHRoaXMuZmllbGRTZXJ2aWNlLmZvcm1GaWVsZEFwaVJvdXRlLCB7IGlkIH0pKSxcclxuICAgICAgbWFwKHJlcyA9PiAocmVzIGFzIGFueSkuTmFtZSBhcyBzdHJpbmcpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyRm9ybUxpc3RGaWVsZHMgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmZpZWxkU2VydmljZS5kYXRhRm9ybUZpZWxkcyA9IHt9O1xyXG4gICAgdGhpcy5maWVsZFNlcnZpY2UuZGF0YUxpc3RGaWVsZHMgPSB7fTtcclxuICAgIHRoaXMuZmllbGRTZXJ2aWNlLmRhdGFMaXN0RmllbGRJdGVtcyA9IHt9O1xyXG4gIH1cclxuXHJcbiAgZGlhbG9nT3BlbihvcHRpb25zOiBEaWFsb2dTZXR0aW5ncyk6IERpYWxvZ1JlZiB7XHJcbiAgICByZXR1cm4gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4ob3B0aW9ucyk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBzdGFydFVwKCkge1xyXG4gICAgY29uc29sZS5sb2coJ0F0IG1haW4uc2VydmljZSAoU3RhcnRVcCkgLi4uJyk7XHJcbiAgfVxyXG5cclxuICBzZXRHcm91cChncm91cDogWkdyb3VwKSB7XHJcbiAgICB0aGlzLmdyb3VwID0gZ3JvdXA7XHJcbiAgICB0aGlzLmZpZWxkU2VydmljZS5zZXRHcm91cChncm91cCk7XHJcbiAgICB0aGlzLnJlc291cmNlQXBpU2VydmljZS5zZXRHcm91cChncm91cCk7XHJcbiAgICB0aGlzLndlYkFwaVNlcnZpY2Uuc2V0R3JvdXAoZ3JvdXApO1xyXG4gICAgdGhpcy5zZXRHcm91cEZvckRlYnVnZ2VyKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIGdldFJlc291cmNlU2VydmVyRGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLnJlc291cmNlQXBpU2VydmljZS5sb2FkRGF0YSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JvdXBGaWVsZHMoXHJcbiAgICBmaWVsZEVsZW1lbnROYW1lOiBzdHJpbmcsXHJcbiAgICBmb3JtVHlwZTogRm9ybVR5cGUgfCAnTGlzdEZpZWxkJyB8ICdGb3JtRmllbGQnLFxyXG4gICAgdHJpZ2dlckZyb206IFRyaWdnZXJGcm9tVHlwZSxcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBwcm9wZXJ0eU5hbWU6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoXHJcbiAgICAgIGZpZWxkRWxlbWVudE5hbWUsXHJcbiAgICAgIGZvcm1UeXBlLFxyXG4gICAgICBncm91cCxcclxuICAgICAgcHJvcGVydHlOYW1lLFxyXG4gICAgICB0cmlnZ2VyRnJvbVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGluaXRpYWxpemVHcm91cChcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBjdHJsTmFtZTogc3RyaW5nLFxyXG4gICAgcGFnZU5hbWU6IHN0cmluZyxcclxuICAgIG1lOiBhbnlcclxuICApOiBTdWJzY3JpcHRpb24ge1xyXG4gICAgaWYgKG1lLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICBtZS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGdyb3VwLnJlc291cmNlVVJMTmFtZSB8fCBjdHJsTmFtZTtcclxuICAgIGdyb3VwLnJlc291cmNlVVJMTmFtZSA9IHJlc291cmNlTmFtZTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwLCB7XHJcbiAgICAgIHJlc291cmNlVVJMOiB0aGlzLnJlc291cmNlQXBpU2VydmljZS5nZXRVUkwocmVzb3VyY2VOYW1lKSxcclxuICAgICAgZ3JpZENvbHVtbkZpZWxkczogdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgICBjdHJsTmFtZSxcclxuICAgICAgICBcIkZvcm1GaWVsZFwiXHJcbiAgICAgICksXHJcbiAgICAgIGN0cmxTY29wZTogbWUsXHJcbiAgICAgIHBhZ2VOYW1lLFxyXG4gICAgICBjdHJsTmFtZSxcclxuICAgICAgLy8gY3JlYXRlTW9kZWxVUkw6IFwiL2NyZWF0ZVwiICsgY3RybE5hbWUudG9Mb3dlckNhc2UoKSxcclxuICAgICAgZWRpdE1vZGVsVVJMOiBjdHJsTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAvLyBsaXN0TW9kZWxVUkw6IFwiL2xpc3RcIiArIGN0cmxOYW1lLnRvTG93ZXJDYXNlKCksXHJcbiAgICAgIC8vIGZvcm1IZWFkZXI6IFwiLi4uXCIsXHJcbiAgICAgIGlzTG9hZGluZzogdHJ1ZSxcclxuICAgICAgZmllbGRzOiBbXSxcclxuICAgICAgek1vZGVsOiB7fSxcclxuICAgICAgekNvbXBvbmVudHM6IHt9LFxyXG4gICAgICB6RGF0YToge30sXHJcbiAgICAgIHN1YmplY3Q6IG5ldyBCZWhhdmlvclN1YmplY3Q8WkNvbXBvbmVudE91dHB1dEV2ZW50PihudWxsKSxcclxuICAgICAgLy8gZm9ybTogbnVsbCBhcyBGb3JtR3JvdXAsIC8vIHJlbW92ZWQgZm9yIGJ1ZyBmaXguXHJcbiAgICAgIGNhbmNlbEJ1dHRvbk5hbWU6IFwiQ2xvc2VcIixcclxuICAgICAgekJ1dHRvbnNDb3VudDogMCxcclxuICAgICAgLy8gdG9wUmlnaHRBY3Rpb25CdXR0b246IFtdLFxyXG4gICAgICAvLyBvbkFjdGlvbjogdGhpcy5vbkFjdGlvbi5iaW5kKHRoaXMpLFxyXG4gICAgICBiYWNrTmF2aWdhdGlvbjogdGhpcy5iYWNrTmF2aWdhdGlvbi5iaW5kKHRoaXMpLFxyXG4gICAgICBoaXN0b3J5QmFjazogdGhpcy5oaXN0b3J5QmFjay5iaW5kKHRoaXMpLFxyXG4gICAgICByZWZyZXNoUGFnZTogdGhpcy5yZWZyZXNoUGFnZS5iaW5kKHRoaXMpLFxyXG4gICAgICByZWZyZXNoR3JpZDogdGhpcy5yZWZyZXNoR3JpZC5iaW5kKHRoaXMpLFxyXG4gICAgICB1cGRhdGVNb2RlbDogdGhpcy51cGRhdGVNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICBjcmVhdGVNb2RlbDogdGhpcy5jcmVhdGVNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICBjbG9uZU5ld01vZGVsOiB0aGlzLmNsb25lTmV3TW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgZGVsZXRlTW9kZWw6IHRoaXMuZGVsZXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgbmV3TW9kZWw6IHRoaXMubmV3TW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgLy8gdXBkYXRlRWRpdE1vZGU6IHRoaXMudXBkYXRlRWRpdE1vZGUuYmluZCh0aGlzKSxcclxuICAgICAgLy8gX2lzRGVidWdnaW5nOiBlbnZpcm9ubWVudC5kZWJ1Z1Nlc3Npb24gfHwgZmFsc2UsXHJcbiAgICAgIC8vIF9kZWJ1Zzoge1xyXG4gICAgICAvLyAgIHpEYXRhOiAgeyBjb2xsZWN0ZWRBY3Rpdml0aWVzOiBbXSwgYWN0aXZpdHlDb3VudDogMCB9XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3M6IG51bGwsXHJcbiAgICAgIC8vIGJlZm9yZVVwZGF0ZU1vZGVsOiBudWxsLFxyXG4gICAgICAvLyBpc0VkaXQ6IGZhbHNlXHJcbiAgICB9KTtcclxuXHJcbiAgICBtZS5zdWJzY3JpcHRpb24gPSBncm91cC5zdWJqZWN0LnN1YnNjcmliZSgoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCkgPT5cclxuICAgICAgdGhpcy5zdWJqZWN0RXZlbnQoZXZlbnQsIGdyb3VwLCBtZSlcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIG1lLnN1YnNjcmlwdGlvbjtcclxuICB9XHJcblxyXG4gIGdldE1vZGVsJChncm91cDogWkdyb3VwLCBpZDogc3RyaW5nLCB0cmlnZ2VyRnJvbT86IFRyaWdnZXJGcm9tVHlwZSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCByZWNJZCA9IGlkIHx8IGdyb3VwLnJlZmVyZW5jZUlkO1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZVxyXG4gICAgICAuaHR0cEdldCQoYCR7Z3JvdXAucmVzb3VyY2VVUkx9LyR7cmVjSWR9YCwgbnVsbCwgeyB0cmlnZ2VyRnJvbTogdHJpZ2dlckZyb20gfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgIGdyb3VwLnpNb2RlbCA9IHptb2RlbDtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGdyb3VwLmFmdGVyR2V0TW9kZWxTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyR2V0TW9kZWxTdWNjZXNzKGdyb3VwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIGNhbkV4aXQoZm9ybTogRm9ybUdyb3VwKTogYm9vbGVhbiB8IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKCFmb3JtIHx8ICFmb3JtLmRpcnR5KSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChmb3JtWydza2lwRGlydHlDaGVjayddKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmFsZXJ0U2VydmljZVxyXG4gICAgICAuc2hvdyhcIkRhdGEgbm90IHNhdmUgeWV0XCIsIFwiQXJlIHlvdSBzdXJlIHdhbnQgdG8gZGlzY2FyZCB0aGUgY2hhbmdlcz9cIiwgW1xyXG4gICAgICAgIFwiQ2FuY2VsXCIsXHJcbiAgICAgICAgXCJEaXNjYXJkIENoYW5nZXNcIixcclxuICAgICAgXSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcGx5ID09PSBcIkRpc2NhcmQgQ2hhbmdlc1wiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIGNsb3NlTW9kYWxGb3JtKGdyb3VwPzogWkdyb3VwKSB7XHJcbiAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAuc3ViamVjdCkge1xyXG4gICAgICBncm91cC5zdWJqZWN0Lm5leHQoe1xyXG4gICAgICAgIHR5cGU6IFwiTW9kYWxTZXJ2aWNlLmNsb3NlXCIsXHJcbiAgICAgICAgdGFyZ2V0OiBcIm1vZGFsR3JvdXAubW9kYWxDYW5jZWwoKVwiXHJcbiAgICAgIH0gYXMgWkNvbXBvbmVudE91dHB1dEV2ZW50KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm1vZGFsQ3RybC5kaXNtaXNzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdWJqZWN0RXZlbnQoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnRhcmdldC5zdGFydHNXaXRoKFwibW9kYWxHcm91cC5cIikpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coXCI+PiBTdWJqZWN0RXZlbnRcIiwgZXZlbnQpO1xyXG4gICAgbGV0IGNhbGxGdW5jO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNhbGxGdW5jID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKFxyXG4gICAgICAgIGdyb3VwLmN0cmxTY29wZSxcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgZ3JvdXBcclxuICAgICAgKTtcclxuICAgICAgLy8gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKGV2ZW50LlRhcmdldCwgZ3JvdXApO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIFwiRXJyb3Igd2hlbiBnZXRHcm91cFZhbHVlOiBcIixcclxuICAgICAgICBldmVudC50YXJnZXQsXHJcbiAgICAgICAgXCIgPiBFcnJvcjogXCIsXHJcbiAgICAgICAgZXJyb3JcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjYWxsRnVuYyhldmVudCk7XHJcbiAgICBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgY29uc3QgbmV3RnVuYyA9IGNhbGxGdW5jLmJpbmQobWUpO1xyXG4gICAgICBuZXdGdW5jKGV2ZW50LCBncm91cCwgbWUpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUuZW5kc1dpdGgoXCJvbk5hdmlnYXRlVG9cIikpIHtcclxuICAgICAgICBjb25zdCBuVXJsID0gZXZlbnQudGFyZ2V0LnJlcGxhY2UoXCIvOmlkXCIsIFwiL1wiICsgZXZlbnQuZGF0YSk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW25VcmxdKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBcInpncmlkLWNlbGxDbGlja1wiKSB7XHJcbiAgICAgICAgLy8gKGNhbGxGdW5jLnN0YXJ0c1dpdGgoJ2VkaXQnKSkgeyAgemdyaWQtY2VsbENsaWNrXHJcbiAgICAgICAgY29uc3QgY05hbWUgPSBjYWxsRnVuYy5zbGljZSg0KTtcclxuICAgICAgICAvLyAvLyBkZWJ1Z2dlcjtcclxuICAgICAgICAvLyBjb25zdCBtb2RhbEdyb3VwUGFyYW06IE1vZGFsUGFnZVBhcmFtcyA9IHt9O1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5jb250cm9sbGVyTmFtZSA9IGNOYW1lO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5yZWZlcklkID0gZXZlbnQuZGF0YS5JZDtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0uY29sRmllbGRzJCA9IGV2ZW50LmNvbHVtbkZpZWxkcyQ7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLnBhcmVudEdyb3VwID0gbWUuZ3JvdXA7XHJcblxyXG4gICAgICAgIC8vIHRoaXMub3Blbk1vZGFsRm9ybShtb2RhbEdyb3VwUGFyYW0pO1xyXG4gICAgICAgIHRoaXMuc2hvd3pNb2RhbChcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgZmllbGRFbGVtZW50TmFtZTogY05hbWUsXHJcbiAgICAgICAgICAgIGZpZWxkRWxlbWVudE9ic2VydmFibGUkOiBldmVudC5jb2x1bW5GaWVsZHMkLFxyXG4gICAgICAgICAgICBwYXJlbnRHcm91cDogZ3JvdXAsXHJcbiAgICAgICAgICAgIHpNb2RlbDoge30sXHJcbiAgICAgICAgICAgIGZvcm1IZWFkZXI6ICcnLFxyXG4gICAgICAgICAgICByZWZlcklkOiBldmVudC5kYXRhLklkXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiemdyaWQtY2VsbENsaWNrXCIpIHtcclxuICAgICAgICBpZiAoY2FsbEZ1bmMubmF2aWdhdGVVcmwpIHtcclxuICAgICAgICAgIGNvbnN0IHVybCA9IGNhbGxGdW5jLm5hdmlnYXRlVXJsLnJlcGxhY2UoXCI6aWRcIiwgZXZlbnQuZGF0YS5JZCk7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoY2FsbEZ1bmMuZm9ybUhlYWRlcikge1xyXG4gICAgICAgICAgdGhpcy5zaG93ek1vZGFsKFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZmllbGRFbGVtZW50TmFtZTogY2FsbEZ1bmMuY3RybE5hbWUsXHJcbiAgICAgICAgICAgICAgZmllbGRFbGVtZW50T2JzZXJ2YWJsZSQ6IGV2ZW50LmNvbHVtbkZpZWxkcyQsXHJcbiAgICAgICAgICAgICAgcGFyZW50R3JvdXA6IG1lLmdyb3VwLFxyXG4gICAgICAgICAgICAgIHpNb2RlbDoge30sXHJcbiAgICAgICAgICAgICAgZm9ybUhlYWRlcjogY2FsbEZ1bmMuZm9ybUhlYWRlcixcclxuICAgICAgICAgICAgICByZWZlcklkOiBldmVudC5kYXRhLklkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgIFwiSW52YWxpZCBjYWxsRnVuYyB0eXBlOiBcIixcclxuICAgICAgICAgIGNhbGxGdW5jLFxyXG4gICAgICAgICAgXCIgZXZlbnQuVGFyZ2V0OiBcIixcclxuICAgICAgICAgIGV2ZW50LnRhcmdldFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtQnlDb21wb25lbnQoY2FsbEZ1bmMudHlwZSwgZXZlbnQuRGF0YS5JZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJGdW5jdGlvbiBub3QgZGVmaW5lZCBpbiBncm91cCBmb3I6IFwiLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBcIiwgRXZlbnQ6IFwiLFxyXG4gICAgICAgIGV2ZW50XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTdWNjZXNzKHJlczogUmVzcG9uc2UgfCBhbnksIHN1Y2Nlc3NNc2c6IHN0cmluZyk6IFJlc3BvbnNlIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzICYmIHJlcy5Qcm9jZXNzaW5nU3RhdHVzKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc0NyZWF0ZU1zZyB8fCB0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc1VwZGF0ZU1zZyB8fCB0aGlzLmdyb3VwPy5kaXNhYmxlU3VjY2Vzc0RlbGV0ZU1zZykge1xyXG4gICAgICAgIHJldHVybiByZXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHNldCBzZXNzaW9uc3RvcmFnZSB0byB0cmlnZ2VyIHVwZGF0ZSB1cG9uIGNyZWF0ZWRcclxuXHJcbiAgICAgIC8vIEFsZXJ0IHVzZXIgdXBkYXRlL3NhdmUgc3VjY2Vzc1xyXG4gICAgICB0aGlzLndlYkFwaVNlcnZpY2Uuc2hvd0h0dHBSZXNwb25zZU1lc3NhZ2UoTUVTU0FHRVRZUEUuU3VjY2Vzcywgc3VjY2Vzc01zZywgbnVsbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlVcGRhdGVHcm91cFRyaWdnZXIodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMuZ3JvdXAuaXNUcmlnZ2VyZWQgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUVycm9yKHJlczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaGFuZGxlRXJyb3IocmVzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByb3V0ZU5hdmlnYXRlKHBhZ2VOYW1lOiBzdHJpbmcsIHBhZ2VQYXJhbXM6IHN0cmluZ1tdLCByb3V0ZVJlbGF0aXZlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKHBhZ2VQYXJhbXMpO1xyXG4gICAgY29uc3Qgc25hcHNob3RVcmwgPSB0aGlzLmFjdGl2YXRlZFJvdXRlWydfcm91dGVyU3RhdGUnXS5zbmFwc2hvdC51cmwuc3BsaXQoJz8nKVswXTtcclxuICAgIGNvbnN0IHBhZ2VVcmwgPSByb3V0ZVJlbGF0aXZlID8gc25hcHNob3RVcmwgKyAnLycgKyBwYWdlTmFtZSA6IHBhZ2VOYW1lO1xyXG5cclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtwYWdlVXJsXSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldE5hdmlnYXRpb25QYXJhbXModXJsUGFyYW1zOiBzdHJpbmdbXSkge1xyXG4gICAgLy8gSWYgaXQgaXMgbnVsbCBvciB1bmRlZmluZWRcclxuICAgIGlmICghdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuaXNWYWx1ZUluTGFzdEVsZW1lbnQodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgsIHRoaXMucm91dGVyLnVybCkpIHtcclxuICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGgucHVzaCh0aGlzLnJvdXRlci51cmwpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLkJBQ0tfTkFWSUdBVElPTl9QQVRIX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0Um91dGVQYXJhbSh1cmxQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFJvdXRlUGFyYW0ocm91dGVQYXJhbXM6IHN0cmluZ1tdKSB7XHJcbiAgICAvLyBJZiBpdCBpcyBudWxsIG9yIHVuZGVmaW5lZFxyXG4gICAgaWYgKCF0aGlzLnJvdXRlUGFyYW0pIHtcclxuICAgICAgdGhpcy5yb3V0ZVBhcmFtID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRmlsdGVyIG91dCBhbnkgZW1wdHkgc3RyaW5nIHJvdXRlIHBhcmFtcyBhbmQgam9pbiB0aGVtIGludG8gYSBzaW5nbGUgc3RyaW5nXHJcbiAgICBjb25zdCBuZXdSb3V0ZVBhcmFtID0gJy8nICsgT2JqZWN0LnZhbHVlcyhyb3V0ZVBhcmFtcykuZmlsdGVyKGVsID0+IGVsICE9PSAnJykuam9pbignLycpO1xyXG5cclxuICAgIGlmICghdGhpcy5pc1ZhbHVlSW5MYXN0RWxlbWVudCh0aGlzLnJvdXRlUGFyYW0sIG5ld1JvdXRlUGFyYW0pKSB7XHJcbiAgICAgIGlmIChyb3V0ZVBhcmFtcykge1xyXG4gICAgICAgIC8vIENhcHR1cmUgdGhlIHByZXZpb3VzIHBhZ2UncyByb3V0ZSBwYXJhbSB0byBiZSB1c2VkIGZvciBiYWNrbmF2aWdhdGlvbiBjaGVja2luZ1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtID0gdGhpcy5yb3V0ZVBhcmFtW3RoaXMucm91dGVQYXJhbS5sZW5ndGggLSAxXTtcclxuXHJcbiAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIHJvdXRlIHBhcmFtIGV4aXN0cywgY2hlY2sgaWYgdGhlIGxhc3Qgc2VnbWVudCBpcyAnbmV3JyBvciAndXBkYXRlJ1xyXG4gICAgICAgIGlmICh0aGlzLnByZXZpb3VzUm91dGVQYXJhbSkge1xyXG4gICAgICAgICAgY29uc3QgcGFyYW1TZWdtZW50ID0gdGhpcy5wcmV2aW91c1JvdXRlUGFyYW0uc3BsaXQoXCIvXCIpO1xyXG4gICAgICAgICAgY29uc3QgYWN0aW9uU2VnbWVudCA9IHBhcmFtU2VnbWVudFtwYXJhbVNlZ21lbnQubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAvLyBJZiB0aGUgbGFzdCBzZWdtZW50IGlzICduZXcnIG9yICd1cGRhdGUnLCBzdG9yZSB0aGUgcHJldmlvdXMgcm91dGUgcGFyYW0gaW4gc2Vzc2lvbiBzdG9yYWdlXHJcbiAgICAgICAgICBjb25zdCB2YWxpZEFjdGlvblR5cGVzID0gW0FjdGlvblR5cGUuTmV3LnRvU3RyaW5nKCksIEFjdGlvblR5cGUuRWRpdC50b1N0cmluZygpLCBBY3Rpb25UeXBlLlVwZGF0ZS50b1N0cmluZygpXTtcclxuXHJcbiAgICAgICAgICBpZiAodmFsaWRBY3Rpb25UeXBlcy5pbmNsdWRlcyhhY3Rpb25TZWdtZW50KSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLlBSRVZJT1VTX1BBR0VfUk9VVEVfUEFSQU1fU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBZGQgdGhlIG5ldyByb3V0ZSBwYXJhbSB0byB0aGUgcm91dGVQYXJhbSBhcnJheSBhbmQgc3RvcmUgaXQgaW4gc2Vzc2lvbiBzdG9yYWdlXHJcbiAgICAgICAgdGhpcy5yb3V0ZVBhcmFtLnB1c2gobmV3Um91dGVQYXJhbSk7XHJcbiAgICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FUSU9OX1BBUkFNU19TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5yb3V0ZVBhcmFtKSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNWYWx1ZUluTGFzdEVsZW1lbnQoYXJyYXk6IGFueVtdLCB0YXJnZXRWYWx1ZTogYW55KSB7XHJcbiAgICBpZiAoYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV0gPT09IHRhcmdldFZhbHVlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1lbnVPbkNsaWNrKGl0ZW06IE9BdXRoTWVudUl0ZW0pOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHsgQXBwQ2xpZW50UGF0aDogYXBwQ2xpZW50UGF0aCwgVVJMOiBwYXRoTmFtZSwgTmFtZTogbmFtZSB9ID0gaXRlbTtcclxuICAgIGNvbnN0IHN0YXJ0dXBQYWdlID0gdGhpcy56Y29yZVNlcnZpY2UuZ2V0RW52aXJvbm1lbnQoKS5zdGFydFVwUGFnZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgY29uc3QgTEFVTkNIRVIgPSAnbGF1bmNoZXInO1xyXG5cclxuICAgIC8vIFNhdmUgbWVudSBuYW1lIHRvIHNlc3Npb25TdG9yYWdlXHJcbiAgICB0aGlzLm1lbnVTZXJ2aWNlLnNldE1lbnVOYW1lKG5hbWUpO1xyXG5cclxuICAgIC8vIEhhbmRsZSBhcHAgY2xpZW50IHBhdGggbmF2aWdhdGlvblxyXG4gICAgaWYgKGFwcENsaWVudFBhdGggJiYgc3RhcnR1cFBhZ2UgPT09IExBVU5DSEVSKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUFwcENsaWVudE5hdmlnYXRpb24ocGF0aE5hbWUsIGFwcENsaWVudFBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERldGVybWluZSBuYXZpZ2F0aW9uIHBhdGhcclxuICAgIGNvbnN0IG5hdmlnYXRpb25QYXRoID0gdGhpcy5nZXROYXZpZ2F0aW9uUGF0aChzdGFydHVwUGFnZSwgcGF0aE5hbWUpO1xyXG5cclxuICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBkZXRlcm1pbmVkIHBhdGhcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRlVG9QYXRoKG5hdmlnYXRpb25QYXRoLCBwYXRoTmFtZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUFwcENsaWVudE5hdmlnYXRpb24ocGF0aE5hbWU6IHN0cmluZywgYXBwQ2xpZW50UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBaQ29tcG9uZW50SGVscGVyLm9wZW5BcHBDbGllbnRQYXRoKHBhdGhOYW1lLCBhcHBDbGllbnRQYXRoLCB0aGlzLmF1dGhTZXJ2aWNlKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gb3BlbiBBcHAgQ2xpZW50IFBhdGggZm9yICR7cGF0aE5hbWV9OmAsIGVycm9yKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXROYXZpZ2F0aW9uUGF0aChzdGFydHVwUGFnZTogc3RyaW5nLCBwYXRoTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgTUVOVV9QQUdFX1BSRUZJWCA9ICdfJztcclxuICAgIHJldHVybiBzdGFydHVwUGFnZS5zdGFydHNXaXRoKE1FTlVfUEFHRV9QUkVGSVgpID8gW3N0YXJ0dXBQYWdlXSA6IFtwYXRoTmFtZV07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5hdmlnYXRlVG9QYXRoKG5hdmlnYXRpb25QYXRoOiBzdHJpbmdbXSwgcGF0aE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKG5hdmlnYXRpb25QYXRoKTtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3BhdGhOYW1lXSk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKGBOYXZpZ2F0aW9uIHRvICR7cGF0aE5hbWV9IGZhaWxlZDpgLCBlcnJvcik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBuYXZpZ2F0ZUZyb21NZW51KHBhZ2VOYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHsgc3RhcnRVcFBhZ2UgfSA9IHRoaXMuZW52aXJvbm1lbnQ7XHJcbiAgICB0aGlzLnNldFJvdXRlUGFyYW0oW2Ake3N0YXJ0VXBQYWdlfWBdKTtcclxuICAgIHRoaXMuYmFja05hdmlnYXRpb25QYXRoLnB1c2godGhpcy5nZXRTdGFydHVwUGFnZSgpKTtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KFt0aGlzLmdldFN0YXJ0dXBQYWdlKCldKSk7XHJcblxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3BhZ2VOYW1lXSwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlc2V0Um91dGVQYXJhbSgpOiB2b2lkIHtcclxuICAgIHRoaXMucm91dGVQYXJhbSA9IFtdO1xyXG4gICAgdGhpcy5iYWNrTmF2aWdhdGlvblBhdGggPSBbXTtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0KHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMucm91dGVQYXJhbSkpO1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TmF2aWdhdGlvblBhcmFtcygpOiBhbnlbXSB7XHJcbiAgICB0aGlzLnJvdXRlUGFyYW0gPSB0aGlzLnJvdXRlUGFyYW0gfHwgW107XHJcblxyXG4gICAgaWYgKHRoaXMucm91dGVQYXJhbS5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc3Qgc3RvcmVkUGFyYW1zID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZKTtcclxuICAgICAgaWYgKHN0b3JlZFBhcmFtcykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlUGFyYW0gPSBKU09OLnBhcnNlKHN0b3JlZFBhcmFtcyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgc3RvcmVkIHJvdXRlUGFyYW06JywgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdObyBzdG9yZWQgbmF2aWdhdGlvbiBwYXJhbXMgZm91bmQuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucm91dGVQYXJhbTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXROYXZpZ2F0aW9uUGFyZW50UGFyYW0oKTogYW55IHtcclxuICAgIGNvbnN0IG5hdmlnYXRpb25QYXJlbnRQYXJhbXMgPSB0aGlzLmdldE5hdmlnYXRpb25QYXJhbXMoKTtcclxuXHJcbiAgICBpZiAobmF2aWdhdGlvblBhcmVudFBhcmFtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBuYXZpZ2F0aW9uUGFyZW50UGFyYW1zW25hdmlnYXRpb25QYXJlbnRQYXJhbXMubGVuZ3RoIC0gMl07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS53YXJuKCdOYXZpZ2F0aW9uIHBhcmVudCBwYXJhbXMgbm90IGZvdW5kLicpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TmF2aWdhdGlvbkN1cnJlbnRQYXJhbSgpOiBhbnkge1xyXG4gICAgY29uc3QgbmF2aWdhdGlvbkN1cnJlbnRQYXJhbXMgPSB0aGlzLmdldE5hdmlnYXRpb25QYXJhbXMoKTtcclxuXHJcbiAgICBpZiAobmF2aWdhdGlvbkN1cnJlbnRQYXJhbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gbmF2aWdhdGlvbkN1cnJlbnRQYXJhbXNbbmF2aWdhdGlvbkN1cnJlbnRQYXJhbXMubGVuZ3RoIC0gMV07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS53YXJuKCdOYXZpZ2F0aW9uIGN1cnJlbnQgcGFyYW1zIG5vdCBmb3VuZC4nKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk6IGFueSB7XHJcbiAgICBpZiAodGhpcy5wcmV2aW91c1JvdXRlUGFyYW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyBSZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZSBpZiBpdCBleGlzdHNcclxuICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXNSb3V0ZVBhcmFtO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZXZpb3VzUm91dGVQYXJhbVN0ciA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5QUkVWSU9VU19QQUdFX1JPVVRFX1BBUkFNX1NUT1JBR0VfS0VZKTtcclxuICAgIGlmIChwcmV2aW91c1JvdXRlUGFyYW1TdHIpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwcmV2aW91c1JvdXRlUGFyYW0gPSBKU09OLnBhcnNlKHByZXZpb3VzUm91dGVQYXJhbVN0cik7XHJcbiAgICAgICAgdGhpcy5wcmV2aW91c1JvdXRlUGFyYW0gPSBwcmV2aW91c1JvdXRlUGFyYW07XHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzUm91dGVQYXJhbTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oYFVuYWJsZSB0byBwYXJzZSBwcmV2aW91cyByb3V0ZSBwYXJhbSBmcm9tIHNlc3Npb24gc3RvcmFnZTogJHtlcnJvcn1gKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdObyBwcmV2aW91cyBwYWdlIHJvdXRlIHBhcmFtIGZvdW5kIGluIHNlc3Npb24gc3RvcmFnZS4nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5yZW1vdmUodGhpcy5QUkVWSU9VU19QQUdFX1JPVVRFX1BBUkFNX1NUT1JBR0VfS0VZKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVMYXN0TmF2aWdhdGVSZWNvcmQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlbW92ZUxhc3ROYXZpZ2F0aW9uUGF0aCgpO1xyXG4gICAgdGhpcy5yZW1vdmVMYXN0Um91dGVQYXJhbSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUxhc3ROYXZpZ2F0aW9uUGF0aCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYmFja05hdmlnYXRpb25QYXRoID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVkpIHx8IFwibnVsbFwiKTtcclxuICAgIGlmICh0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aCkge1xyXG4gICAgICB0aGlzLmJhY2tOYXZpZ2F0aW9uUGF0aC5wb3AoKTtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5CQUNLX05BVklHQVRJT05fUEFUSF9TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodGhpcy5iYWNrTmF2aWdhdGlvblBhdGgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIk5vIGJhY2sgbmF2aWdhdGlvbiBwYXRoIGZvdW5kIGluIHNlc3Npb24uXCIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk6IHZvaWQge1xyXG4gICAgdGhpcy5yb3V0ZVBhcmFtID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuTkFWSUdBVElPTl9QQVJBTVNfU1RPUkFHRV9LRVkpIHx8IFwibnVsbFwiKTtcclxuICAgIGlmICh0aGlzLnJvdXRlUGFyYW0pIHtcclxuICAgICAgdGhpcy5yb3V0ZVBhcmFtLnBvcCgpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldCh0aGlzLk5BVklHQVRJT05fUEFSQU1TX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLnJvdXRlUGFyYW0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcInJvdXRlUGFyYW0gc2Vzc2lvbiBpcyBudWxsLlwiKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBiYWNrTmF2aWdhdGlvbihldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50LCBncm91cDogWkdyb3VwLCBtZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoZ3JvdXBbJ2lzRW1iZWRkZWRQYWdlJ10pIHtcclxuICAgICAgZ3JvdXBbJ2lzVHJpZ2dlcmVkJ10gPSBmYWxzZTtcclxuICAgICAgdGhpcy5jbG9zZUNvbnRhaW5lclZpZXcoZ3JvdXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGdyb3VwLmJlZm9yZUJhY2tOYXZpZ2F0aW9uUGFnZSkge1xyXG4gICAgICBncm91cC5iZWZvcmVCYWNrTmF2aWdhdGlvblBhZ2UoZ3JvdXApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZUJhY2tUb1ByZXZpb3VzUGFnZShncm91cCk7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5uYXZpZ2F0ZUJhY2tUb1ByZXZpb3VzUGFnZShncm91cCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG5hdmlnYXRlQmFja1RvUHJldmlvdXNQYWdlKGdyb3VwOiBaR3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuXHJcbiAgICBjb25zdCBiYWNrTmF2aWdhdGlvblBhdGg6IHN0cmluZ1tdID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuQkFDS19OQVZJR0FUSU9OX1BBVEhfU1RPUkFHRV9LRVkpKTtcclxuICAgIGNvbnN0IGJhY2tOYXZpZ2F0aW9uVVJMID0gZ3JvdXAuYmFja05hdmlnYXRpb25QYWdlIHx8IGJhY2tOYXZpZ2F0aW9uUGF0aFtiYWNrTmF2aWdhdGlvblBhdGgubGVuZ3RoIC0gMV07XHJcblxyXG4gICAgaWYgKCFiYWNrTmF2aWdhdGlvblVSTCkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgbmF2aWdhdGluZyBiYWNrIHRvIHByZXZpb3VzIHBhZ2U6IGJhY2tOYXZpZ2F0aW9uVVJMIGlzIG5vdCBzZXQuXCIpO1xyXG4gICAgICAvL3Rocm93IG5ldyBFcnJvcihcIkJhY2tOYXZpZ2F0aW9uUGF0aCBub3Qgc2V0LlwiKTtcclxuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLmdldFN0YXJ0dXBQYWdlKCksIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWdyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZSkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c1JvdXRlUGFyYW0gPSB0aGlzLmdldFByZXZpb3VzUGFnZVJvdXRlUGFyYW0oKTtcclxuICAgICAgY29uc3QgcHJldmlvdXNDdXJyZW50Um91dGVQYXJhbSA9IHRoaXMuZ2V0TmF2aWdhdGlvbkN1cnJlbnRQYXJhbSgpO1xyXG4gICAgICBpZiAodGhpcy5yb3V0ZVBhcmFtLmxlbmd0aCA9PT0gMCAmJiB0aGlzLnJvdXRlTmF2aWdhdGUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLmdldFN0YXJ0dXBQYWdlKCksIHsgcmVwbGFjZVVybDogdHJ1ZSB9KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAocHJldmlvdXNSb3V0ZVBhcmFtICYmIHByZXZpb3VzUm91dGVQYXJhbSA9PT0gcHJldmlvdXNDdXJyZW50Um91dGVQYXJhbSkge1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVQcmV2aW91c1BhZ2VSb3V0ZVBhcmFtKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVtb3ZlTGFzdFJvdXRlUGFyYW0oKTtcclxuICAgICAgICB0aGlzLnJlbW92ZUxhc3ROYXZpZ2F0aW9uUGF0aCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXQodGhpcy5OQVZJR0FURURfUkVMT0FEX0dSSURfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcclxuXHJcbiAgICBpZiAodGhpcy5jYWNoZVNlcnZpY2UuZ2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKSkge1xyXG4gICAgICB0aGlzLmNhY2hlU2VydmljZS5jbGVhckNhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybChiYWNrTmF2aWdhdGlvblVSTCwgeyByZXBsYWNlVXJsOiB0cnVlIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgbmF2aWdhdGluZyBiYWNrIHRvIHByZXZpb3VzIHBhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKTtcclxuICAgICAgLy90aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTdGFydHVwUGFnZSgpIHtcclxuICAgIGNvbnN0IHsgc3RhcnRVcFBhZ2UgfSA9IHRoaXMuZW52aXJvbm1lbnQ7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHN0YXJ0dXAgcGFnZSBzdGFydHMgd2l0aCBhIHVuZGVyc2NvcmUuXHJcbiAgICBpZiAoc3RhcnRVcFBhZ2Uuc3RhcnRzV2l0aCgnXycpKSB7XHJcbiAgICAgIHJldHVybiBgLyR7c3RhcnRVcFBhZ2Uuc2xpY2UoMSl9YDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBub3QsIHByZXBlbmQgYSBmb3J3YXJkIHNsYXNoIGFuZCByZXR1cm4uXHJcbiAgICByZXR1cm4gYC8ke3N0YXJ0VXBQYWdlfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhpc3RvcnlCYWNrKCkge1xyXG4gICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG5cclxuICAgIGlmICh0aGlzLmdyb3VwWydpc0VtYmVkZGVkUGFnZSddKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VDb250YWluZXJWaWV3KHRoaXMuZ3JvdXApO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5uYXZDb250cm9sbGVyLnBvcCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2hHcmlkKFxyXG4gICAgZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCxcclxuICAgIGdyb3VwOiBaR3JvdXAsXHJcbiAgICBtZTogYW55LFxyXG4gICAgZ3JpZE9wdGlvbk5hbWU/OiBzdHJpbmdcclxuICApIHtcclxuICAgIGdyaWRPcHRpb25OYW1lID0gZ3JpZE9wdGlvbk5hbWUgfHwgXCJncmlkT3B0aW9uc1wiO1xyXG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCkge1xyXG4gICAgICBjb25zdCBncmlkT3B0aW9uID0gZXZlbnQudGFyZ2V0XHJcbiAgICAgICAgLnRyaW0oKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiKFwiLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiKVwiLCBcIlwiKVxyXG4gICAgICAgIC5yZXBsYWNlKFwiZ3JvdXAucmVmcmVzaEdyaWRcIiwgXCJcIik7XHJcbiAgICAgIGlmIChncmlkT3B0aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBncmlkT3B0aW9uTmFtZSA9IGdyaWRPcHRpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB6Z3JpZENvbnRyb2wgPSBncm91cFtncmlkT3B0aW9uTmFtZV0gYXMgWkdyaWQ7XHJcbiAgICBpZiAoemdyaWRDb250cm9sKSB7XHJcbiAgICAgIHpncmlkQ29udHJvbC5nZXREYXRhKCk7XHJcbiAgICB9XHJcbiAgICBncm91cFsnaXNUcmlnZ2VyZWQnXSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoUGFnZSgpIHtcclxuICAgIGlmICh0aGlzLmdyb3VwKSB7XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIucm91dGVSZXVzZVN0cmF0ZWd5LnNob3VsZFJldXNlUm91dGUgPSAoKSA9PiBmYWxzZTtcclxuICAgIC8vIHRoaXMucm91dGVyLm9uU2FtZVVybE5hdmlnYXRpb24gPSAncmVsb2FkJztcclxuICAgIC8vIGNvbnNvbGUubG9nKCdQYXRoOiAnLCB0aGlzLmFjdGl2YXRlZFJvdXRlWydfcm91dGVyU3RhdGUnXS5zbmFwc2hvdC51cmwpO1xyXG4gICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvY3JtL2N1c3RvbWVyJ10pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xvbmVOZXdDYWNoZVpNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBjb25zdCBjYWNoZVpNb2RlbCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldENhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSk7XHJcbiAgICBpZiAoY2FjaGVaTW9kZWwpIHtcclxuICAgICAgdGhpcy5jYWNoZVNlcnZpY2UuY2xlYXJDYWNoZSh0aGlzLkNMT05FX05FV19NT0RFTF9DQUNIRV9LRVkpO1xyXG4gICAgICBncm91cC56TW9kZWwgPSBjYWNoZVpNb2RlbDtcclxuICAgICAgZ3JvdXAuek1vZGVsLklkID0gMDtcclxuICAgIH1cclxuICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5ld01vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIG9mKFtdKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHptb2RlbCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIG5ldywgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmJlZm9yZU5ld01vZGVsKGdyb3VwKTtcclxuICAgICAgfSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJjdXJyZW50IHVybDogXCIsIHRoaXMucm91dGVyLnVybCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZUlkID0gZ3JvdXAucGFyZW50UmVmZXJlbmNlSWQgfHwgXCIwXCI7XHJcbiAgICAgICAgLy9jb25zdCBwYXRoU2VnbWVudCA9IHRoaXMucm91dGVyLnVybC5zcGxpdChcIi9cIik7XHJcbiAgICAgICAgLy9jb25zdCBsYXN0U2VnbWVudCA9IHBhdGhTZWdtZW50W3BhdGhTZWdtZW50Lmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnROYXZpZ2F0aW9uUGFyYW0gPSB0aGlzLmdldE5hdmlnYXRpb25DdXJyZW50UGFyYW0oKTtcclxuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uU2VnbWVudHMgPSBjdXJyZW50TmF2aWdhdGlvblBhcmFtID8gY3VycmVudE5hdmlnYXRpb25QYXJhbS5zcGxpdCgnLycpIDogbnVsbDtcclxuICAgICAgICBjb25zdCBkZWZhdWx0QWN0aW9uID0gZ3JvdXAuaXNDbG9uZU5ldyA/IEFjdGlvblR5cGUuTmV3IDogQWN0aW9uVHlwZS5FZGl0O1xyXG4gICAgICAgIGNvbnN0IGFjdGlvblNlZ21lbnQgPSBncm91cC5pc0Nsb25lTmV3ID8gKG5hdmlnYXRpb25TZWdtZW50cyA/IG5hdmlnYXRpb25TZWdtZW50c1tuYXZpZ2F0aW9uU2VnbWVudHMubGVuZ3RoIC0gMV0gOiBBY3Rpb25UeXBlLk5ldykgOiBkZWZhdWx0QWN0aW9uO1xyXG5cclxuICAgICAgICBpZiAoZ3JvdXAuaXNMaXN0Rm9ybSkge1xyXG4gICAgICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG5cclxuICAgICAgICAgIHRoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhbcmVmZXJlbmNlSWQsIEFjdGlvblR5cGUuTmV3LnRvU3RyaW5nKCldKTtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtncm91cC5lZGl0TW9kZWxVUkxdLCB7XHJcbiAgICAgICAgICAgIHJlbGF0aXZlVG86IGdyb3VwLmN0cmxTY29wZS5hY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIC8vIFNjZW5hcmlvIDE6IEZyb20gTGlzdCBOZXcoYWN0aW9uOiBuZXcpID09PiBDbGVhciBmb3JtXHJcbiAgICAgICAgICAvLyBTY2VuYXJpbyAyOiBGcm9tIEZvcm0gTmV3KGFjdGlvbjogbmV3KSA9PT4gQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gMzogRnJvbSBGb3JtIE5ldyhhY3Rpb246IG5ldyksIGlzQ2xvbmVOZXcgPT0+IERPTlQgQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gNDogRnJvbSBGb3JtIE5ldyhhY3Rpb246IG5ldyksIGlzQ2xvbmVOZXcsIFNhdmUsIENsaWNrIE5ldyA9PT4gQ2xlYXIgZm9ybSAoV2hlbiBDcmVhdGVNb2RlbCwgbmVlZCBjaGFuZ2UgaXNDbG9uZU5ldyA9IGZhbHNlKVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gNTogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIGlzQ2xvbmVOZXcgPT0+IERPTlQgQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gNjogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIGlzQ2xvbmVOZXcsIFNhdmUsIENsaWNrIE5ldyA9PT4gQ2xlYXIgZm9ybSAoV2hlbiBVcGRhdGVNb2RlbCwgbmVlZCBjaGFuZ2UgaXNDbG9uZU5ldyA9IGZhbHNlKVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gNzogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIENsaWNrIE5ldyA9PT4gQ2xlYXIgZm9ybVxyXG4gICAgICAgICAgLy8gU2NlbmFyaW8gODogRnJvbSBMaXN0IG9wZW4gcmVjb3JkKGFjdGlvbjogZWRpdCksIENsaWNrIE5ldywgU2F2ZSwgaXNDbG9uZU5ldyA9PT4gRE9OVCBDbGVhciBmb3JtXHJcblxyXG4gICAgICAgICAgaWYgKGFjdGlvblNlZ21lbnQgPT09IEFjdGlvblR5cGUuRWRpdCB8fCBhY3Rpb25TZWdtZW50ID09PSBBY3Rpb25UeXBlLk5ldykge1xyXG4gICAgICAgICAgICBpZiAoIWdyb3VwLmlzQ2xvbmVOZXcpIHtcclxuICAgICAgICAgICAgICBncm91cC56TW9kZWwgPSB7fTtcclxuICAgICAgICAgICAgICBncm91cC5mb3JtLnJlc2V0KCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgd29ya2Zsb3cgYnV0dG9uIGlmIHRoZSBUeXBlQ29kZSBpcyAnRlVOQ1RJT04nXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNUeXBlQ29kZUZ1bmN0aW9uKGV2ZW50KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWxvYWRXb3JrZmxvd0J1dHRvbihncm91cCwgZXZlbnQuZGF0YSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhY3Rpb25TZWdtZW50ID09PSBBY3Rpb25UeXBlLkVkaXQpIHtcclxuICAgICAgICAgICAgICAvLyBjbGVhciBjbG9uZU5ld01vZGVsIGNhY2hlKGlmIGhhdmUpXHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuY2FjaGVTZXJ2aWNlLmdldENhY2hlKHRoaXMuQ0xPTkVfTkVXX01PREVMX0NBQ0hFX0tFWSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVTZXJ2aWNlLmNsZWFyQ2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIC8vdGhpcy5zZXROYXZpZ2F0aW9uUGFyYW1zKFtyZWZlcmVuY2VJZCwgJ25ldyddKTtcclxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZUxhc3RSb3V0ZVBhcmFtKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXRSb3V0ZVBhcmFtKFtyZWZlcmVuY2VJZCwgQWN0aW9uVHlwZS5OZXcudG9TdHJpbmcoKV0pO1xyXG5cclxuICAgICAgICAgICAgICBncm91cC56TW9kZWxbZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGRdID0gcmVmZXJlbmNlSWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZ3JvdXAuaXNFZGl0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyb3VwLmlzTmV3ID0gdHJ1ZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TmF2aWdhdGlvblBhcmFtcyhbcmVmZXJlbmNlSWQsIEFjdGlvblR5cGUuTmV3LnRvU3RyaW5nKCldKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtncm91cC5lZGl0TW9kZWxVUkxdLCB7XHJcbiAgICAgICAgICAgICAgcmVsYXRpdmVUbzogZ3JvdXAuY3RybFNjb3BlLmFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZ3JvdXAuaXNDbG9uZU5ldykge1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyQ2xvbmVOZXdNb2RlbChncm91cCwgZ3JvdXAuek1vZGVsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFmdGVyTmV3TW9kZWwoZ3JvdXApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY3JlYXRlTW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgY29uc3QgZmc6IEZvcm1Hcm91cCA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3QgcmVzTWVzc2FnZSA9IGdyb3VwLlN1Y2Nlc3NDcmVhdGVkTWVzc2FnZSB8fCBEZWZhdWx0TWVzc2FnZS5yZWNvcmRDcmVhdGVkO1xyXG4gICAgbGV0IGNyZWF0ZU1vZGVscmVzID0gbnVsbDtcclxuXHJcbiAgICBpZiAoIWZnLmRpcnR5KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihEZWZhdWx0TWVzc2FnZS5ub3REaXJ0eU1lc3NhZ2UpO1xyXG4gICAgICB0aGlzLnRyeVVwZGF0ZUdyb3VwVHJpZ2dlcihmYWxzZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZnLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50RXJyb3JIYW5kbGVyU2VydmljZS5zaG93Rm9ybUdyb3VwRXJyb3JNZXNzYWdlKGdyb3VwLCBmZyk7XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIG9mKGdyb3VwLnpNb2RlbCkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSBjcmVhdGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5iZWZvcmVDcmVhdGVNb2RlbChncm91cCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5ncm91cC5za2lwQ3JlYXRlVXNpbmdGb3JtVmFsdWUpIHtcclxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICBjb25zdCBuZXdNb2RlbCA9IE9iamVjdC5hc3NpZ24oe30sIGdyb3VwLnpNb2RlbCk7XHJcbiAgICAgICAgWkNvbXBvbmVudEhlbHBlci5yZW1vdmVOdWxsRmllbGRzKG5ld01vZGVsKTtcclxuXHJcbiAgICAgICAgY29uc3Qgd2ViQXBpQWRkaXRpb25hbERldGFpbDogV2ViQXBpQWRkaXRpb25hbERldGFpbCA9IHtcclxuICAgICAgICAgIGJ1dHRvbkRldGFpbDogZXZlbnQsXHJcbiAgICAgICAgICBncm91cDogZ3JvdXAsXHJcbiAgICAgICAgICB0cmlnZ2VyRnJvbTogZXZlbnQgPyBldmVudC50cmlnZ2VyRnJvbSA6IHVuZGVmaW5lZFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFBvc3QkKGdyb3VwLnJlc291cmNlVVJMLCBuZXdNb2RlbCwgd2ViQXBpQWRkaXRpb25hbERldGFpbCkucGlwZShcclxuICAgICAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICBjcmVhdGVNb2RlbHJlcyA9IHJlc3A7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwO1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICB0YXAoKHJlcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgcmVzTWVzc2FnZSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKHptb2RlbDogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJBZnRlciBjcmVhdGVkLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgdGhpcy5wYXRjaFVwZGF0ZWR6TW9kZWwoZmcsIHptb2RlbCwgZ3JvdXApO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFmdGVyQ3JlYXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKHJlc3ApID0+IHtcclxuICAgICAgICBpZiAoY3JlYXRlTW9kZWxyZXMuUHJvY2Vzc2luZ1N0YXR1cyA9PSBudWxsIHx8IGNyZWF0ZU1vZGVscmVzLlByb2Nlc3NpbmdTdGF0dXMgPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgaWYgKHJlc3AgJiYgZ3JvdXAuek1vZGVsLklkICE9PSAwKSB7XHJcbiAgICAgICAgICAgIGdyb3VwLmlzTmV3ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGdyb3VwLmlzRWRpdCA9IHRydWU7XHJcbiAgICAgICAgICAgIGdyb3VwLmlzQ2xvbmVOZXcgPSBmYWxzZTtcclxuICAgICAgICAgICAgZ3JvdXAuaXNUcmlnZ2VyZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgZ3JvdXAuY2FuY2VsQnV0dG9uTmFtZSA9IFwiQ2xvc2VcIjtcclxuICAgICAgICAgICAgLy8gT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIHJlc3ApO1xyXG4gICAgICAgICAgICAvLyBmZy5wYXRjaFZhbHVlKHJlc3ApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gZmcubWFya0FzUHJpc3RpbmUoKTtcclxuXHJcbiAgICAgICAgICBpZiAoKGdyb3VwLmlzQ2xvc2VBZnRlclN1Y2Nlc3MgfHwgZ3JvdXAuaXNDbG9zZUFmdGVyQ3JlYXRlZCkgJiYgIWdyb3VwLmlzQ2xvbmVOZXcpIHtcclxuICAgICAgICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvbihudWxsLCBncm91cCwgdGhpcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgZmcubWFya0FzRGlydHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJEb25lIHVwZGF0ZU1vZGVsIHVwZGF0ZWQgek1vZGVsOlwiLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgLy8gdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhcIlJlY29yZCBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS5cIik7XHJcbiAgICAgIH0pXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZU1vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIHRoaXMudXBkYXRlTW9kZWxPYnNlcnZhYmxlKGV2ZW50LCBncm91cCkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlTW9kZWxPYnNlcnZhYmxlKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXAsIGZvcm06IEZvcm1Hcm91cCA9IG51bGwsIHVwZGF0ZUFQSU9ic2VydmFibGU6IE9ic2VydmFibGU8YW55PiA9IG51bGwsIGlzU2tpcERpcnR5ID0gZmFsc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgZmcgPSBmb3JtIHx8IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3QgcmVzTWVzc2FnZSA9IGdyb3VwLlN1Y2Nlc3NVcGRhdGVkTWVzc2FnZSB8fCBEZWZhdWx0TWVzc2FnZS5yZWNvcmRVcGRhdGVkO1xyXG4gICAgbGV0IHVwZGF0ZU1vZGVscmVzID0gbnVsbDtcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNGb3JtRGlydHlBbmRWYWxpZChmZywgZ3JvdXAsIGlzU2tpcERpcnR5LCBldmVudCkpIHtcclxuICAgICAgaWYgKGlzU2tpcERpcnR5KSB7XHJcbiAgICAgICAgZmcubWFya0FsbEFzVG91Y2hlZCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB3ZWJBcGlBZGRpdGlvbmFsRGV0YWlsOiBXZWJBcGlBZGRpdGlvbmFsRGV0YWlsID0ge1xyXG4gICAgICBidXR0b25EZXRhaWw6IGV2ZW50LFxyXG4gICAgICBncm91cDogZ3JvdXAsXHJcbiAgICAgIHRyaWdnZXJGcm9tOiBldmVudCA/IGV2ZW50LnRyaWdnZXJGcm9tIDogdW5kZWZpbmVkXHJcbiAgICB9O1xyXG5cclxuICAgIHVwZGF0ZUFQSU9ic2VydmFibGUgPSB1cGRhdGVBUElPYnNlcnZhYmxlIHx8IHRoaXMud2ViQXBpU2VydmljZS5odHRwUHV0JChgJHtncm91cC5yZXNvdXJjZVVSTH0vJHtncm91cC56TW9kZWwuSWR9YCwgZ3JvdXAuek1vZGVsLCB3ZWJBcGlBZGRpdGlvbmFsRGV0YWlsKS5waXBlKFxyXG4gICAgICB0YXAoKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIHJlc01lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICAgICAgLy90aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCBcIlJlY29yZCBpcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5cIilcclxuICAgICAgKSk7XHJcblxyXG4gICAgcmV0dXJuIG9mKGdyb3VwLnpNb2RlbCkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSB1cGRhdGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5iZWZvcmVVcGRhdGVNb2RlbChncm91cCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIGlmICghZ3JvdXAuc2tpcFVwZGF0ZVVzaW5nRm9ybVZhbHVlKSB7XHJcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgZmcudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUFQSU9ic2VydmFibGU7XHJcbiAgICAgIH0pLFxyXG4gICAgICBzd2l0Y2hNYXAoKHJlc3A6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgdXBkYXRlZCwgcmVzcG9uc2U6XCIsIHJlc3ApO1xyXG4gICAgICAgIHVwZGF0ZU1vZGVscmVzID0gcmVzcDtcclxuICAgICAgICBncm91cC5pc0Nsb25lTmV3ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5wYXRjaFVwZGF0ZWR6TW9kZWwoZmcsIHJlc3AsIGdyb3VwKTtcclxuICAgICAgICBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFmdGVyVXBkYXRlTW9kZWwoZ3JvdXAsIHJlc3ApO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKChyZXNwKSA9PiB7XHJcbiAgICAgICAgaWYgKHVwZGF0ZU1vZGVscmVzICYmIHVwZGF0ZU1vZGVscmVzLlByb2Nlc3NpbmdTdGF0dXMpIHtcclxuICAgICAgICAgIGlmIChncm91cC5pc0Nsb3NlQWZ0ZXJTdWNjZXNzIHx8IGdyb3VwLmlzQ2xvc2VBZnRlclVwZGF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5iYWNrTmF2aWdhdGlvbihudWxsLCBncm91cCwgdGhpcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsb25lcyBhIG5ldyBtb2RlbCBmb3IgYSBaR3JvdXAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIFpDb21wb25lbnRPdXRwdXRFdmVudC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7WkNvbXBvbmVudE91dHB1dEV2ZW50fSBldmVudCAtIFRoZSBaQ29tcG9uZW50T3V0cHV0RXZlbnQgdHJpZ2dlcmluZyB0aGUgY2xvbmUuXHJcbiAgICogQHBhcmFtIHtaR3JvdXB9IGdyb3VwIC0gVGhlIFpHcm91cCB0byBjbG9uZSB0aGUgbmV3IG1vZGVsIGZvci5cclxuICAgKi9cclxuICBwcml2YXRlIGNsb25lTmV3TW9kZWwoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgLy8gU2V0IGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBtb2RlbCBpcyBiZWluZyBjbG9uZWRcclxuICAgIGdyb3VwLmlzQ2xvbmVOZXcgPSB0cnVlO1xyXG5cclxuICAgIC8vIEV4dHJhY3QgdGhlIGZ1bmN0aW9uIHZhbHVlIGZyb20gdGhlIHRhcmdldCBvZiB0aGUgZXZlbnRcclxuICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBldmVudDtcclxuICAgIGNvbnN0IGZ1bmN0aW9uVmFsdWUgPSB0YXJnZXQ/Lm1hdGNoKC9cXCgoW14pXSspXFwpLyk/LlsxXTtcclxuXHJcbiAgICAvLyBJZiB0aGUgZnVuY3Rpb24gdmFsdWUgaXMgJ3RydWUnLCByZXNldCB0aGUgZm9ybSBhbmQgbW9kZWxcclxuICAgIGlmIChmdW5jdGlvblZhbHVlID09PSAndHJ1ZScpIHtcclxuICAgICAgZ3JvdXAuek1vZGVsID0ge307XHJcbiAgICAgIGdyb3VwLmZvcm0ucmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEZWZpbmUgdGhlIHZhbHVlcyBmb3IgdGhlIFdGUyBtb2RlbFxyXG4gICAgY29uc3QgbmV3TW9kZWxWYWx1ZXMgPSB7XHJcbiAgICAgIElkOiAwLFxyXG4gICAgICBXRlNfRG9jdW1lbnRJZDogbnVsbCxcclxuICAgICAgV0ZTX1N0YXR1c0NvZGU6IG51bGwsXHJcbiAgICAgIFdGU19TdGF0dXNJZDogbnVsbCxcclxuICAgICAgV0ZTX1N0YXR1c05hbWU6IG51bGwsXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEFzc2lnbiB0aGUgV0ZTIG1vZGVsIHZhbHVlcyB0byB0aGUgZm9ybSB2YWx1ZSBhbmQgWk1vZGVsXHJcbiAgICBPYmplY3QuYXNzaWduKGdyb3VwLmZvcm0udmFsdWUsIG5ld01vZGVsVmFsdWVzKTtcclxuICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCBncm91cC5mb3JtLnZhbHVlKTtcclxuXHJcbiAgICAvLyBQYXRjaCB0aGUgZm9ybSB3aXRoIHRoZSBaTW9kZWwsIG1hcmsgaXQgYXMgZGlydHksIGFuZCBjYWNoZSB0aGUgWk1vZGVsXHJcbiAgICBjb25zdCBmZyA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3QgcmVzdWx0RGF0YSA9IFpDb21wb25lbnRIZWxwZXIucmVtb3ZlVGV4dEVkaXRvclZhbHVlRnJvbUZvcm1QYXRjaGluZyhncm91cC56TW9kZWwsIGdyb3VwKTtcclxuICAgIGZnLnBhdGNoVmFsdWUocmVzdWx0RGF0YSk7XHJcbiAgICBmZy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgdGhpcy5jYWNoZVNlcnZpY2Uuc2V0Q2FjaGUodGhpcy5DTE9ORV9ORVdfTU9ERUxfQ0FDSEVfS0VZLCBncm91cC56TW9kZWwpO1xyXG5cclxuICAgIC8vIENhbGwgdGhlIG5ld01vZGVsIGZ1bmN0aW9uIGZvciB0aGUgZ3JvdXBcclxuICAgIHRoaXMubmV3TW9kZWwobnVsbCwgZ3JvdXApO1xyXG5cclxuICAgIC8vIFJlbG9hZCB0aGUgd29ya2Zsb3cgYnV0dG9uIGlmIHRoZSBUeXBlQ29kZSBpcyAnRlVOQ1RJT04nXHJcbiAgICBpZiAodGhpcy5pc1R5cGVDb2RlRnVuY3Rpb24oZXZlbnQpKSB7XHJcbiAgICAgIHRoaXMucmVsb2FkV29ya2Zsb3dCdXR0b24oZ3JvdXAsIGV2ZW50LmRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsZWFyIHRoZSB0cmlnZ2VyIGZsYWdcclxuICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRlbGV0ZU1vZGVsKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGNvbnN0IGZnOiBGb3JtR3JvdXAgPSBncm91cC5mb3JtIGFzIEZvcm1Hcm91cDtcclxuICAgIGNvbnN0IHJlc01lc3NhZ2UgPSBncm91cC5TdWNjZXNzRGVsZXRlZE1lc3NhZ2UgfHwgRGVmYXVsdE1lc3NhZ2UucmVjb3JkRGVsZXRlZDtcclxuXHJcbiAgICBvZihncm91cC56TW9kZWwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlZm9yZSBkZWxldGUsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmJlZm9yZURlbGV0ZU1vZGVsKGdyb3VwKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIoZmFsc2UpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3coXCJEZWxldGUgUmVjb3JkXCIsIERlZmF1bHRNZXNzYWdlLmNvbmZpcm1hdGlvbixcclxuICAgICAgICAgICAgW1xyXG4gICAgICAgICAgICAgIHsgdGV4dDogXCJOb1wiLCBjc3NDbGFzczogXCJzZWNvbmRhcnlcIiB9IGFzIEFsZXJ0QnV0dG9uLFxyXG4gICAgICAgICAgICAgIHsgdGV4dDogXCJZZXNcIiwgY3NzQ2xhc3M6IFwicHJpbWFyeVwiIH0gYXMgQWxlcnRCdXR0b25cclxuICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKChyZXBseTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVwbHkgPT09IFwiWWVzXCIpIHtcclxuICAgICAgICAgICAgdGhpcy50cnlVcGRhdGVHcm91cFRyaWdnZXIodHJ1ZSk7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZ3JvdXAuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgICAgIGdyb3VwLnpNb2RlbC5EaXNhYmxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBsZXQgdGVtcFJlc3BvbnNlID0ge307XHJcbiAgICAgICAgICAgIGNvbnN0IHdlYkFwaUFkZGl0aW9uYWxEZXRhaWw6IFdlYkFwaUFkZGl0aW9uYWxEZXRhaWwgPSB7XHJcbiAgICAgICAgICAgICAgYnV0dG9uRGV0YWlsOiBldmVudCxcclxuICAgICAgICAgICAgICBncm91cDogZ3JvdXAsXHJcbiAgICAgICAgICAgICAgdHJpZ2dlckZyb206IGV2ZW50ID8gZXZlbnQudHJpZ2dlckZyb20gOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZVxyXG4gICAgICAgICAgICAgIC5odHRwUHV0JChgJHtncm91cC5yZXNvdXJjZVVSTH0vJHtncm91cC56TW9kZWwuSWR9YCwgZ3JvdXAuek1vZGVsLCB3ZWJBcGlBZGRpdGlvbmFsRGV0YWlsKVxyXG4gICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFwKChyZXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgdGVtcFJlc3BvbnNlID0gT2JqZWN0LmFzc2lnbih7fSwgcmVzKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzKHJlcywgcmVzTWVzc2FnZSlcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJBZnRlciBkZWxldGVkLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFmdGVyRGVsZXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHRhcCgocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAvL3RoaXMuaGlzdG9yeUJhY2soKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHRlbXBSZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wUmVzcG9uc2VbJ1Byb2Nlc3NpbmdTdGF0dXMnXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZmcucmVzZXQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFja05hdmlnYXRpb24obnVsbCwgZ3JvdXAsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBncm91cC56TW9kZWwuRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhdGNoVXBkYXRlZHpNb2RlbChmZzogRm9ybUdyb3VwLCByZXNwOiBhbnksIGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmIChyZXNwKSB7XHJcbiAgICAgIGlmIChyZXNwLkRhdGEpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGdyb3VwLnpNb2RlbCwgcmVzcC5EYXRhKTtcclxuICAgICAgICBjb25zdCByZXN1bHREYXRhID0gWkNvbXBvbmVudEhlbHBlci5yZW1vdmVUZXh0RWRpdG9yVmFsdWVGcm9tRm9ybVBhdGNoaW5nKHJlc3AuRGF0YSwgZ3JvdXApO1xyXG4gICAgICAgIGZnLnBhdGNoVmFsdWUocmVzdWx0RGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAocmVzcFtcIklkXCJdKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihncm91cC56TW9kZWwsIHJlc3ApO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdERhdGEgPSBaQ29tcG9uZW50SGVscGVyLnJlbW92ZVRleHRFZGl0b3JWYWx1ZUZyb21Gb3JtUGF0Y2hpbmcocmVzcCwgZ3JvdXApO1xyXG4gICAgICAgIGZnLnBhdGNoVmFsdWUocmVzdWx0RGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJGYWlsZWQgdG8gcGF0Y2hVcGRhdGVkek1vZGVsIHRvIHRoZSBmb3JtZ3JvdXBcIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBncm91cC5yZWZlcmVuY2VJZCA9IGdyb3VwLnpNb2RlbC5JZDtcclxuICAgIHRoaXMudHJ5VXBkYXRlR3JvdXBUcmlnZ2VyKGZhbHNlKTtcclxuICAgIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcblxyXG4gICAgZmcubWFya0FzUHJpc3RpbmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNUeXBlQ29kZUZ1bmN0aW9uKGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpIHtcclxuICAgIHJldHVybiBldmVudD8uZGF0YT8uVHlwZUNvZGUgPT09ICdGVU5DVElPTic7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbG9hZFdvcmtmbG93QnV0dG9uKGdyb3VwOiBaR3JvdXAsIGRhdGE6IGFueSkge1xyXG4gICAgLy8gQ2hhbmdlZCB0byBzaG91bGQgcmVsb2FkIGFsbCB3b3JrZmxvdyBidXR0b24gaWYgaXQgdHJpZ2dlciBuZXcvY2xvbmVuZXcgdmlhIHRoZSBmb3JtIHBhZ2UuXHJcblxyXG4gICAgLy9pZiAoZGF0YS5yZWxvYWRBbGxXb3JrZmxvd0J1dHRvbikge1xyXG4gICAgY29uc3Qgd29ya2Zsb3dCdXR0b25MaXN0ID0gT2JqZWN0LmtleXMoZ3JvdXAuekNvbXBvbmVudHMpXHJcbiAgICAgIC5maWx0ZXIoa2V5ID0+IGtleS5zdGFydHNXaXRoKCd6d29ya2Zsb3didXR0b25zXycpKVxyXG4gICAgICAucmVkdWNlKChvYmosIGtleSkgPT4ge1xyXG4gICAgICAgIG9ialtrZXldID0gZ3JvdXAuekNvbXBvbmVudHNba2V5XTtcclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgICB9LCB7fSk7XHJcblxyXG4gICAgT2JqZWN0LnZhbHVlcyh3b3JrZmxvd0J1dHRvbkxpc3QpLmZvckVhY2godmFsdWUgPT4ge1xyXG4gICAgICB2YWx1ZT8uWydsb2FkQnV0dG9uJ10/LigpO1xyXG4gICAgfSk7XHJcbiAgICAvL31cclxuICAgIC8vZWxzZSB7XHJcbiAgICAvLyAgY29uc3Qgd29ya2Zsb3dCdXR0b25zID0gWkNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnQoZ3JvdXAsIGB6d29ya2Zsb3didXR0b25zXyR7ZGF0YS56QnV0dG9uTmFtZX1gKTtcclxuICAgIC8vICB3b3JrZmxvd0J1dHRvbnM/LlsnbG9hZEJ1dHRvbiddPy4oKTtcclxuICAgIC8vfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzRm9ybURpcnR5QW5kVmFsaWQoZmc6IEZvcm1Hcm91cCwgZ3JvdXA6IFpHcm91cCwgaXNTa2lwRGlydHkgPSBmYWxzZSwgZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFpc1NraXBEaXJ0eSAmJiAhZmcuZGlydHkpIHtcclxuICAgICAgY29uc29sZS53YXJuKERlZmF1bHRNZXNzYWdlLm5vdERpcnR5TWVzc2FnZSk7XHJcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudCAmJiBldmVudC5kYXRhICYmIGV2ZW50LmRhdGFbYEZvcm1Ob3REaXJ0eU1lc3NhZ2VgXSA/IGV2ZW50LmRhdGFbYEZvcm1Ob3REaXJ0eU1lc3NhZ2VgXSA6IERlZmF1bHRNZXNzYWdlLm5vdERpcnR5TWVzc2FnZTtcclxuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc2hvd09rYXkoRGVmYXVsdERpYWxvZ1RpdGxlLm5vdGhpbmdUb1VwZGF0ZSwgbWVzc2FnZSwgW1wiY29sLTVcIl0pO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmZy52YWxpZCkge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudEVycm9ySGFuZGxlclNlcnZpY2Uuc2hvd0Zvcm1Hcm91cEVycm9yTWVzc2FnZShncm91cCwgZmcpO1xyXG4gICAgICBmZy5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICAgIGZnLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBiZWZvcmVVcGRhdGVNb2RlbChncm91cDogWkdyb3VwKSB7XHJcbiAgICBpZiAoIWdyb3VwLmJlZm9yZVVwZGF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmJlZm9yZVVwZGF0ZU1vZGVsIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVVcGRhdGVNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZURlbGV0ZU1vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlRGVsZXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlRGVsZXRlTW9kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZURlbGV0ZU1vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlTmV3TW9kZWwoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKCFncm91cC5iZWZvcmVOZXdNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5iZWZvcmVOZXdvZGVsIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5iZWZvcmVOZXdNb2RlbChncm91cCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJlZm9yZUNyZWF0ZU1vZGVsKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlQ3JlYXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlQ3JlYXRlTW9kZWwgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZUNyZWF0ZU1vZGVsKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIGJlZm9yZVBhZ2VJbml0aWFsaXNlKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYmVmb3JlUGFnZUluaXRpYWxpc2UpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYmVmb3JlUGFnZUluaXRpYWxpc2UgaXMgdW5kZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmJlZm9yZVBhZ2VJbml0aWFsaXNlKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3MoZ3JvdXA6IFpHcm91cCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLnpNb2RlbC5JZCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJ6TW9kZWwuSWQgaXMgbm90IGRlZmluZWRcIiwgZ3JvdXAuek1vZGVsKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3MpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3MgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJHZXRNb2RlbFN1Y2Nlc3MoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJOZXdNb2RlbChncm91cDogWkdyb3VwKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJOZXdNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlck5ld01vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyTmV3TW9kZWwoZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlckNyZWF0ZU1vZGVsKGdyb3VwOiBaR3JvdXAsIHptb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJDcmVhdGVNb2RlbCkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlckNyZWF0ZU1vZGVsIGlzIG5vdCBkZWZpbmVkXCIpO1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGdyb3VwLmFmdGVyQ3JlYXRlTW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFmdGVyVXBkYXRlTW9kZWwoZ3JvdXA6IFpHcm91cCwgem1vZGVsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKCFncm91cC5hZnRlclVwZGF0ZU1vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyVXBkYXRlTW9kZWwgaXMgbm90IGRlZmluZWRcIik7XHJcbiAgICAgIHJldHVybiBvZih7fSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXAuYWZ0ZXJVcGRhdGVNb2RlbChncm91cCwgem1vZGVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWZ0ZXJEZWxldGVNb2RlbChncm91cDogWkdyb3VwLCB6bW9kZWw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBpZiAoIWdyb3VwLmFmdGVyRGVsZXRlTW9kZWwpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiZ3JvdXAuYWZ0ZXJEZWxldGVNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckRlbGV0ZU1vZGVsKGdyb3VwLCB6bW9kZWwpO1xyXG4gIH1cclxuXHJcbiAgYWZ0ZXJDbG9uZU5ld01vZGVsKGdyb3VwOiBaR3JvdXAsIHptb2RlbDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJDbG9uZU5ld01vZGVsKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcImdyb3VwLmFmdGVyQ2xvbmVOZXdNb2RlbCBpcyBub3QgZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlckNsb25lTmV3TW9kZWwoZ3JvdXAsIHptb2RlbCk7XHJcbiAgfVxyXG5cclxuICBhZnRlclBhZ2VJbml0aWFsaXNlKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGlmICghZ3JvdXAuYWZ0ZXJQYWdlSW5pdGlhbGlzZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJncm91cC5hZnRlclBhZ2VJbml0aWFsaXNlIGlzIHVuZGVmaW5lZFwiKTtcclxuICAgICAgcmV0dXJuIG9mKHt9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBncm91cC5hZnRlclBhZ2VJbml0aWFsaXNlKGdyb3VwKTtcclxuICB9XHJcblxyXG4gIC8vIHByaXZhdGUgb25BY3Rpb24oZ3JvdXA6IFpHcm91cCkge1xyXG4gIC8vICAgdGhpcy5hY3Rpb25TaGVldEN0cmxcclxuICAvLyAgICAgLmNyZWF0ZSh7XHJcbiAgLy8gICAgICAgaGVhZGVyOiBcIkNob29zZSBhbiBBY3Rpb25cIixcclxuICAvLyAgICAgICBidXR0b25zOiBncm91cC50b3BSaWdodEFjdGlvbkJ1dHRvblxyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgICAudGhlbihhY3Rpb25TaGVldEVsID0+IHtcclxuICAvLyAgICAgICBhY3Rpb25TaGVldEVsLnByZXNlbnQoKTtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBzZXRNb2RlbFZhbHVlKHByb3BlcnR5TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBncm91cDogWkdyb3VwKSB7XHJcbiAgLy8gICBncm91cC56TW9kZWxbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xyXG4gIC8vICAgaWYgKGdyb3VwLmlzTG9hZGluZykge1xyXG4gIC8vICAgICByZXR1cm47XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjb25zdCBmZyA9IGdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gIC8vICAgaWYgKCFmZykge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSAsIG5vLWRlYnVnZ2VyXHJcbiAgLy8gICAgIGRlYnVnZ2VyO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgY29uc3QgZmMgPSBmZy5jb250cm9sc1twcm9wZXJ0eU5hbWVdO1xyXG4gIC8vICAgaWYgKCFmYykge1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlclxyXG4gIC8vICAgICBkZWJ1Z2dlcjtcclxuICAvLyAgIH1cclxuICAvLyAgIGZjLnNldFZhbHVlKHZhbHVlKTtcclxuICAvLyAgIGZjLm1hcmtBc0RpcnR5KCk7XHJcbiAgLy8gfVxyXG5cclxuICBwdWJsaWMgc2hvd3pNb2RhbChtb2RhbFBhZ2VQYXJhbXM6IE1vZGFsUGFnZVBhcmFtcyk6IE9ic2VydmFibGU8TW9kYWxSZXNwb25zZT4ge1xyXG4gICAgaWYgKG1vZGFsUGFnZVBhcmFtcy5wYXJlbnRHcm91cCkge1xyXG4gICAgICAvLyBkaXNhYmxlIGlzVHJpZ2dlcmVkIGJlZm9yZSBkaXNwbGF5IHRoZSBwb3B1cC5cclxuICAgICAgbW9kYWxQYWdlUGFyYW1zLnBhcmVudEdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhtb2RhbFBhZ2VQYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNvb2tpZVN0b3JlUG9zdChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgLy8gZm9yIFBvc3QgdG8gQ29va2llU3RvcmVcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVVJMID0gdGhpcy5vYXV0aEVudmlyb25tZW50VXJsICsgXCJhcGkvQ29va2llU3RvcmVzXCI7XHJcbiAgICBjb25zdCBjb29raWVTdG9yZVZhbHVlID0ge1xyXG4gICAgICAnTmFtZSc6IG5hbWUsXHJcbiAgICAgICdWYWx1ZSc6IEpTT04uc3RyaW5naWZ5KHZhbHVlKVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQb3N0JChjb29raWVTdG9yZVVSTCwgY29va2llU3RvcmVWYWx1ZSkucGlwZShtYXAocmVzID0+IHtcclxuICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiZ3JpZCBjb25maWcgc2F2ZWQoXCIgKyByZXMuc3RhdHVzICsgXCIpOiBcIiwgcmVzKTtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVHZXQobmFtZTogc3RyaW5nLCBhY2Nlc3NUb2tlbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVVJMID0gdGhpcy5vYXV0aEVudmlyb25tZW50VXJsICsgXCJhcGkvQ29va2llU3RvcmVzLz9uYW1lPVwiICsgbmFtZTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBHZXQkKGNvb2tpZVN0b3JlVVJMLCB7IGhlYWRlcnM6IGFjY2Vzc1Rva2VuIH0pLnBpcGUobWFwKHJlcyA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29va2llU3RvcmVEZWxldGVNdWx0aXBsZShuYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgLy8gZm9yIFBvc3QgdG8gQ29va2llU3RvcmVcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVVJMID0gdGhpcy5vYXV0aEVudmlyb25tZW50VXJsICsgXCJBZG1pbi9EZWxldGVNdWx0aXBsZUNvb2tpZXNcIjtcclxuICAgIGNvbnN0IGNvb2tpZVN0b3JlVmFsdWUgPSB7XHJcbiAgICAgICdjb250YWluTmFtZSc6IG5hbWVcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwUG9zdCQoY29va2llU3RvcmVVUkwsIGNvb2tpZVN0b3JlVmFsdWUpLnBpcGUobWFwKHJlcyA9PiB7XHJcbiAgICAgIGlmIChyZXMpIHtcclxuICAgICAgICByZXR1cm4gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2Nyb2xsVG9FbGVtZW50QnlJZChpZDogc3RyaW5nLCBiZWhhdmlvcjogJ3Ntb290aCcgfCAnYXV0bycgPSAnc21vb3RoJykge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XHJcbiAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRyYW5zbGF0aW9uUGFnZUVsZW1lbnQoZ3JvdXA6IFpHcm91cCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBjb25zdCBvYnNMaXN0ID0gbmV3IEFycmF5PE9ic2VydmFibGU8YW55Pj4oKTtcclxuICAgIGlmIChncm91cC5mb3JtSGVhZGVyKSB7XHJcbiAgICAgIG9ic0xpc3QucHVzaCh0aGlzLnRyYW5zbGF0aW9uU2VydmljZS4kdHJhbnNsYXRlU2luZ2xlSXRlbShncm91cCwgXCJmb3JtSGVhZGVyXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZ3JvdXAubmF2SXRlbXMgJiYgZ3JvdXAubmF2SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBvYnNMaXN0LnB1c2godGhpcy50cmFuc2xhdGlvblNlcnZpY2UuJHRyYW5zbGF0ZUl0ZW1MaXN0KGdyb3VwLm5hdkl0ZW1zLCBcInRleHRcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChvYnNMaXN0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gb2Yoe30pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmb3JrSm9pbihvYnNMaXN0KTtcclxuICB9XHJcblxyXG5cclxuICAvLyNyZWdpb24gc2lnbmFsUiBzZXJ2aWNlXHJcbiAgcHVibGljIGpvaW5Qcm9qZWN0U2lnbmFsUihwcm9qZWN0Q29kZT86IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuc2lnbmFsclNlcnZpY2Uuc2lnbmFsUkVuYWJsZWQoKSkge1xyXG4gICAgICBpZiAocHJvamVjdENvZGUpIHtcclxuICAgICAgICB0aGlzLnNpZ25hbHJTZXJ2aWNlLmpvaW5Hcm91cChwcm9qZWN0Q29kZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgLy8gV2UgZGVmYXVsdCBmaXJzdCBwcm9qZWN0IGNvZGUgaW4gZW52aXJvbm1lbnQgYXMgZ3JvdXBcclxuICAgICAgICBjb25zdCBlbnZpcm9ubWVudCA9IHRoaXMuemNvcmVTZXJ2aWNlLmdldEVudmlyb25tZW50KCk7XHJcbiAgICAgICAgY29uc3QgZmlyc3RQcm9qZWN0Q29kZSA9IGVudmlyb25tZW50LnByb2plY3RDb2Rlc1swXTtcclxuICAgICAgICB0aGlzLnNpZ25hbHJTZXJ2aWNlLmpvaW5Hcm91cChmaXJzdFByb2plY3RDb2RlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVNpZ25hbFJNb2RpZmljYXRpb25BbGVydChmb3JtSWQ6IHN0cmluZykge1xyXG4gICAgaWYgKHRoaXMuc2lnbmFsclNlcnZpY2Uuc2lnbmFsUkVuYWJsZWQoKSAmJiB0aGlzLmVudmlyb25tZW50LmVuYWJsZUZvcm1QYWdlTW9kaWZpY2F0aW9uQWxlcnQpIHtcclxuICAgICAgY29uc3QgZXZlbnROYW1lID0gYCR7d2luZG93LmxvY2F0aW9uLmhyZWZ9YC5yZXBsYWNlKC8oW146XVxcLylcXC8rL2csIFwiJDFcIik7XHJcbiAgICAgIGlmICghdGhpcy5ncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyKSB7XHJcbiAgICAgICAgdGhpcy5ncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyID0ge307XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5ncm91cC5zaWduYWxSQ2FsbGJhY2tIYW5kbGVyWydhbGVydEZvcm1Nb2RpZmllZCddID0gdGhpcy5hbGVydEZvcm1Nb2RpZmllZC5iaW5kKHRoaXMsIGZvcm1JZCk7XHJcblxyXG4gICAgICB0aGlzLnNpZ25hbHJTZXJ2aWNlLnVuc3Vic2NyaWJlRnJvbUV2ZW50KGAke2V2ZW50TmFtZX1gKTsgLy8gdW5zdWJzY3JpYmUgdGhlIGV2ZW50IGJlZm9yZSBzdWJzY3JpYmUgdG8gZXZlbnQgYWdhaW4uXHJcbiAgICAgIHRoaXMuc2lnbmFsclNlcnZpY2Uuc3Vic2NyaWJlVG9FdmVudCh0aGlzLmdyb3VwLCBgJHtldmVudE5hbWV9YCwgYGdyb3VwLnNpZ25hbFJDYWxsYmFja0hhbmRsZXIuYWxlcnRGb3JtTW9kaWZpZWRgKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ2VuYWJsZUZvcm1QYWdlTW9kaWZpY2F0aW9uQWxlcnQgbm90IGVuYWJsZWQuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFsZXJ0Rm9ybU1vZGlmaWVkKGZvcm1JZDogc3RyaW5nLCBncm91cDogWkdyb3VwLCByZXNwOiBhbnksIGV2ZW50TmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXJlc3ApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3BSZXN1bHQgPSBKU09OLnBhcnNlKHJlc3ApO1xyXG5cclxuICAgIGlmICghcmVzcFJlc3VsdC5Vc2VyTmFtZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZvcm1JZCA9PT0gcmVzcFJlc3VsdC5JZD8udG9TdHJpbmcoKSAmJiBldmVudE5hbWUgPT09IHdpbmRvdy5sb2NhdGlvbi5ocmVmKSB7XHJcbiAgICAgIGlmIChyZXNwUmVzdWx0LlVzZXJOYW1lID09PSB0aGlzLmF1dGhTZXJ2aWNlLmUxVG9rZW4ubXlQcm9maWxlLlVzZXJOYW1lKSB7XHJcbiAgICAgICAgaWYgKHJlc3BSZXN1bHQuQWN0aW9uID09PSBBY3Rpb25UeXBlLlVwZGF0ZSkge1xyXG4gICAgICAgICAgdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBHZXQkKGAke3RoaXMuZ3JvdXAucmVzb3VyY2VVUkx9LyR7Zm9ybUlkfWAsIG51bGwsIHsgdHJpZ2dlckZyb206IFRyaWdnZXJGcm9tVHlwZS5zaWduYWxSQWxlcnQgfSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlbG9hZERhdGFBbmRXb3JrZmxvd0J1dHRvbihyZXNwKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAocmVzcFJlc3VsdC5BY3Rpb24gPT09IEFjdGlvblR5cGUuRGVsZXRlKSB7XHJcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93KFwiUmVjb3JkIERlbGV0ZWQgYnkgQW5vdGhlciBVc2VyXCIsIFwiVGhlIGN1cnJlbnQgcmVjb3JkIGhhcyBiZWVuIGRlbGV0ZWQgYnkgYW5vdGhlciB1c2VyLlwiLCBbXHJcbiAgICAgICAgICAgIHsgdGV4dDogXCJPS1wiLCBjc3NDbGFzczogXCJwcmltYXJ5XCIgfSBhcyBBbGVydEJ1dHRvblxyXG4gICAgICAgICAgXSwgW1wiY29sLTZcIl0sIHVuZGVmaW5lZCwgdHJ1ZSkucGlwZShzd2l0Y2hNYXAoKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXBseSA9PT0gXCJPS1wiKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZUJhY2tUb1ByZXZpb3VzUGFnZShncm91cCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVzcFJlc3VsdC5BY3Rpb24gPT09IEFjdGlvblR5cGUuVXBkYXRlKSB7XHJcbiAgICAgICAgICB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cEdldCQoYCR7dGhpcy5ncm91cC5yZXNvdXJjZVVSTH0vJHtmb3JtSWR9YCwgbnVsbCkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcCAmJiByZXNwLlJvd1ZlcnNpb24pIHtcclxuICAgICAgICAgICAgICBpZiAocmVzcC5Sb3dWZXJzaW9uICE9PSB0aGlzLmdyb3VwLnpNb2RlbD8uUm93VmVyc2lvbikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc2hvdyhcIlRoZSBjdXJyZW50IHBhZ2UgaGFzIGJlZW4gbW9kaWZpZWQgYnkgb3RoZXIgdXNlcnMuXCIsIFwiV291bGQgeW91IGxpa2UgdG8gcmVmcmVzaCB0aGUgcGFnZSBkYXRhP1wiLCBbXHJcbiAgICAgICAgICAgICAgICAgIHsgdGV4dDogXCJOb1wiLCBjc3NDbGFzczogXCJzZWNvbmRhcnlcIiB9IGFzIEFsZXJ0QnV0dG9uLFxyXG4gICAgICAgICAgICAgICAgICB7IHRleHQ6IFwiWWVzXCIsIGNzc0NsYXNzOiBcInByaW1hcnlcIiB9IGFzIEFsZXJ0QnV0dG9uXHJcbiAgICAgICAgICAgICAgICBdLCBbXCJjb2wtNlwiXSwgdW5kZWZpbmVkLCB0cnVlKS5waXBlKHN3aXRjaE1hcCgocmVwbHkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKHJlcGx5ID09PSBcIlllc1wiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWxvYWREYXRhQW5kV29ya2Zsb3dCdXR0b24ocmVzcCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvd1Blcm1hbmVudGx5KCdUaGUgZGF0YSBvbiB0aGUgY3VycmVudCBwYWdlIGlzIG5vdCB1cCB0byBkYXRlLCBhcyBpdCBoYXMgYmVlbiBzYXZlZCBhbmQgb3ZlcndyaXR0ZW4gYnkgYW5vdGhlciB1c2VyLiBQbGVhc2UgcmVmcmVzaCB0aGUgcGFnZS4nLCAndG9wJywgJ3dhcm5pbmcnKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApLnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBbGVydCByZWNlaXZlZCByZWdhcmRpbmcgZm9ybSBtb2RpZmljYXRpb24sIFJvd1ZlcnNpb24gcmVtYWlucyB1bmFsdGVyZWQuIE5vIGZ1cnRoZXIgYWN0aW9uIGhhcyBiZWVuIHRha2VuLmApXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVsb2FkRGF0YUFuZFdvcmtmbG93QnV0dG9uKHpNb2RlbDogYW55KSB7XHJcbiAgICB0aGlzLmdyb3VwLnpNb2RlbCA9IHpNb2RlbDtcclxuICAgIGNvbnN0IGZnOiBGb3JtR3JvdXAgPSB0aGlzLmdyb3VwLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgY29uc3QgcmVzdWx0RGF0YSA9IFpDb21wb25lbnRIZWxwZXIucmVtb3ZlVGV4dEVkaXRvclZhbHVlRnJvbUZvcm1QYXRjaGluZyh0aGlzLmdyb3VwLnpNb2RlbCwgdGhpcy5ncm91cCk7XHJcbiAgICBmZy5wYXRjaFZhbHVlKHJlc3VsdERhdGEpO1xyXG4gICAgZmcubWFya0FzUHJpc3RpbmUoKTtcclxuXHJcbiAgICAvLyBDYXB0dXJlIGFsbCB3b3JrZmxvdyBidXR0b25zXHJcbiAgICBjb25zdCB3b3JrZmxvd0J1dHRvbnMgPSBPYmplY3Qua2V5cyh0aGlzLmdyb3VwLnpDb21wb25lbnRzKVxyXG4gICAgICAuZmlsdGVyKGtleSA9PiBrZXkuc3RhcnRzV2l0aChcInp3b3JrZmxvd2J1dHRvbnNfXCIpKVxyXG4gICAgICAubWFwKGtleSA9PiB0aGlzLmdyb3VwLnpDb21wb25lbnRzW2tleV0pO1xyXG5cclxuICAgIC8vIFJlbG9hZCB3b3JrZmxvdyBidXR0b25zXHJcbiAgICB3b3JrZmxvd0J1dHRvbnMuZm9yRWFjaChidXR0b24gPT4ge1xyXG4gICAgICBidXR0b24ubG9hZEJ1dHRvbigpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIERFQ1xyXG4gIHB1YmxpYyBhc3luYyBsb2FkQ29udGFpbmVyVmlldyhlbGVtZW50Q29udGFpbmVyOiBhbnksIGNvbnRhaW5lclBhZ2U6IGFueSwgZGF0YTogWkZpZWxkLCBncm91cD86IFpHcm91cCkge1xyXG4gICAgaWYgKCFlbGVtZW50Q29udGFpbmVyKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiRWxlbWVudENvbnRhaW5lciBpcyBudWxsLlwiKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29udGFpbmVyUGFnZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkNvbnRhaW5lclBhZ2UgaXMgbnVsbC5cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aWV3Q29udGFpbmVyUmVmID0gZWxlbWVudENvbnRhaW5lci52aWV3Q29udGFpbmVyUmVmO1xyXG4gICAgdmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xyXG5cclxuICAgIGNvbnN0IGVtYmVkZGVkZ3JvdXAgPSBuZXcgWkdyb3VwKCk7XHJcbiAgICB0aGlzLnNldEdyb3VwRm9yRGVidWdnZXIoZW1iZWRkZWRncm91cCk7XHJcbiAgICBjb25zdCBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+ID0gdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29udGFpbmVyUGFnZSk7XHJcblxyXG4gICAgZW1iZWRkZWRncm91cC5pc1RyaWdnZXJlZCA9IGZhbHNlOyAvLyBlbmFibGUgYmFjayB0aGUgYnV0dG9uIGZvciB0cmlnZ2VyaW5nLlxyXG5cclxuICAgIC8vIE9iamVjdC5hc3NpZ24oY29tcG9uZW50UmVmLmluc3RhbmNlW1wiZ3JvdXBcIl0sIGdyb3VwKTtcclxuICAgIE9iamVjdC5hc3NpZ24oY29tcG9uZW50UmVmLmluc3RhbmNlW1wiZ3JvdXBcIl0sIGVtYmVkZGVkZ3JvdXApO1xyXG5cclxuICAgIE9iamVjdC5hc3NpZ24oY29tcG9uZW50UmVmLmluc3RhbmNlW1wiZ3JvdXBcIl0sIHsgcGFyZW50R3JvdXA6IGdyb3VwLCBpc0VtYmVkZGVkUGFnZTogdHJ1ZSwgZWxlbWVudENvbnRhaW5lcjogZWxlbWVudENvbnRhaW5lciwgQ29udGFpbmVyRm9ybUF1dG9TY3JvbGw6IGRhdGEuQ29udGFpbmVyRm9ybUF1dG9TY3JvbGwgfSk7XHJcblxyXG4gICAgLy8gdG9kbzogYWRkIGluIHByb3BcclxuICAgIGlmIChkYXRhICYmIGRhdGEuQ29udGFpbmVyRm9ybUF1dG9TY3JvbGwpIHtcclxuICAgICAgdGhpcy5zY3JvbGxUb0VtYmJlZENvbXBvbmVudFBhZ2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb0VtYmJlZENvbXBvbmVudFBhZ2UobWlsbGlTZWNvbmRzOiBudW1iZXIgPSAxNTAwKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBlbmRPZkdyaWREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImVuZC1vZi1ncmlkXCIpO1xyXG4gICAgY29uc3QgZW5kT2ZHcmlkUG9zaXRpb25JbmZvID0gZW5kT2ZHcmlkRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgeUNvb3IgPSAoZW5kT2ZHcmlkUG9zaXRpb25JbmZvPy55IHx8IDYzMCkgLSAxMDtcclxuXHJcbiAgICBjb25zdCBtYWluSW9uQ29udGVudDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJpb24tY29udGVudC1tYWluLXBhZ2VcIik7XHJcbiAgICByZXR1cm4gbWFpbklvbkNvbnRlbnQuc2Nyb2xsQnlQb2ludCgwLCB5Q29vciwgbWlsbGlTZWNvbmRzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzY3JvbGxUb1RvcE9mUGFnZShtaWxsaVNlY29uZHM6IG51bWJlciA9IDE1MDApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IG1haW5Jb25Db250ZW50OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImlvbi1jb250ZW50LW1haW4tcGFnZVwiKTtcclxuICAgIHJldHVybiBtYWluSW9uQ29udGVudC5zY3JvbGxUb1BvaW50KDAsIDAsIG1pbGxpU2Vjb25kcykgYXMgUHJvbWlzZTx2b2lkPjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjbG9zZUNvbnRhaW5lclZpZXcoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgaWYgKGdyb3VwW2BwYXJlbnRHcm91cGBdICYmIGdyb3VwW2BwYXJlbnRHcm91cGBdW2BlMUNsb3NlR3JpZENvbnRhaW5lcmBdICYmIHR5cGVvZiBncm91cFtgcGFyZW50R3JvdXBgXVtgZTFDbG9zZUdyaWRDb250YWluZXJgXSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIGdyb3VwW2BwYXJlbnRHcm91cGBdW2BlMUNsb3NlR3JpZENvbnRhaW5lcmBdKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHByaXZhdGUgc2V0R3JvdXBGb3JEZWJ1Z2dlcihncm91cDogWkdyb3VwKSB7XHJcbiAgICBjb25zdCBpc0RlYnVnZ2luZyA9IHRoaXMuemNvcmVTZXJ2aWNlLmlzRGVidWdTZXNzaW9uKCkgfHwgZmFsc2U7XHJcbiAgICBpZiAoaXNEZWJ1Z2dpbmcpIHtcclxuICAgICAgdGhpcy5kZWJ1Z1NlcnZpY2Uub25Jbml0RGVidWdnZXIoZ3JvdXApO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlZnJlc2hHcmlkKGdyb3VwOiBaR3JvdXApIHtcclxuICBjb25zdCB6Z3JpZENvbnRyb2wgPSBncm91cFtcImdyaWRPcHRpb25zXCJdIGFzIFpHcmlkO1xyXG4gIGlmICh6Z3JpZENvbnRyb2wpIHtcclxuICAgIHpncmlkQ29udHJvbC5nZXREYXRhKCk7XHJcbiAgfVxyXG4gIGdyb3VwLmlzVHJpZ2dlcmVkID0gZmFsc2U7XHJcbn1cclxuIl19
|