@decaf-ts/for-angular 0.0.21 → 0.0.22

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.
@@ -1025,9 +1025,14 @@ let ListComponent = class ListComponent extends NgxBaseComponent {
1025
1025
  async parseResult(result) {
1026
1026
  if (!Array.isArray(result) && ('page' in result && 'total' in result)) {
1027
1027
  const paginator = result;
1028
- result = await paginator.page(this.page);
1029
- // TODO: Chage for result.total;
1030
- this.getMoreData(paginator.total);
1028
+ try {
1029
+ result = await paginator.page(this.page);
1030
+ // TODO: Chage for result.total;
1031
+ this.getMoreData(paginator.total);
1032
+ }
1033
+ catch (error) {
1034
+ result = [];
1035
+ }
1031
1036
  }
1032
1037
  else {
1033
1038
  this.getMoreData(result?.length || 0);
@@ -1142,7 +1147,7 @@ let ListComponent = class ListComponent extends NgxBaseComponent {
1142
1147
  }, []);
1143
1148
  }
1144
1149
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1145
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ListComponent, isStandalone: true, selector: "ngx-decaf-list", inputs: { type: "type", translatable: "translatable", showSearchbar: "showSearchbar", data: "data", source: "source", start: "start", limit: "limit", loadMoreData: "loadMoreData", lines: "lines", inset: "inset", scrollThreshold: "scrollThreshold", scrollPosition: "scrollPosition", loadingText: "loadingText", showRefresher: "showRefresher", loadingSpinner: "loadingSpinner", enableFilter: "enableFilter", sortDirection: "sortDirection", sortBy: "sortBy", disableSort: "disableSort", emptyIcon: "emptyIcon", empty: "empty" }, outputs: { refreshEvent: "refreshEvent", clickEvent: "clickEvent" }, host: { listeners: { "window:ListItemClickEvent": "handleClick($event)", "window:searchbarEvent": "handleSearch($event)", "window:BackButtonNavigationEndEvent": "refresh($event)" } }, usesInheritance: true, ngImport: i0, template: "\n@if(showRefresher) {\n <ion-refresher slot=\"fixed\" [pullFactor]=\"1\" [pullMin]=\"100\" [pullMax]=\"200\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content />\n </ion-refresher>\n}\n\n@if(showSearchbar && data?.length) {\n @if(model && enableFilter) {\n <ngx-decaf-filter\n [model]=\"model\"\n [sortDirection]=\"sortDirection\"\n [disableSort]=\"disableSort\"\n (filterEvent)=\"handleFilter($event)\"\n (searchEvent)=\"handleSearch($event)\"\n />\n } @else {\n <ngx-decaf-searchbar [emitEventToWindow]=\"false\" [debounce]=\"500\" (searchEvent)=\"handleSearch($event)\" />\n }\n}\n\n@if(data?.length) {\n <ion-list [id]=\"uid\" [inset]=\"inset\" [lines]=\"lines\" #component>\n @if(item?.tag) {\n @for(child of items; track trackItemFn($index, child)) {\n <ngx-decaf-component-renderer\n [tag]=\"item.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{\n item: child,\n mapper: mapper,\n route: route\n }'>\n </ngx-decaf-component-renderer>\n }\n } @else {\n <ng-content></ng-content>\n }\n </ion-list>\n\n @if(loadMoreData) {\n @if(pages > 0 && type === 'paginated' && !searchValue?.length) {\n <ngx-decaf-pagination\n [totalPages]=\"pages\"\n [current]=\"page\"\n (clickEvent)=\"handlePaginate($event)\"\n />\n\n } @else {\n <ion-infinite-scroll\n [class]=\"searchValue?.length ? 'dcf-hidden' : ''\"\n\n [position]=\"scrollPosition\"\n [threshold]=\"scrollThreshold\"\n (ionInfinite)=\"handleRefresh($event)\">\n <ion-infinite-scroll-content [loadingSpinner]=\"loadingSpinner\" [loadingText]=\"loadingText\" />\n </ion-infinite-scroll>\n }\n }\n} @else {\n @if(refreshing) {\n @for(skl of skeletonData; track skl) {\n <ion-item>\n <ion-thumbnail slot=\"start\">\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n </ion-thumbnail>\n <ion-label>\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n </ion-label>\n </ion-item>\n }\n\n } @else {\n @if(!searchValue?.length) {\n <ngx-decaf-empty-state\n [title]=\"(locale + '.'+ empty.title) | translate\"\n [subtitle]=\"(locale + '.'+ empty.subtitle) | translate\"\n [buttonText]=\"empty.showButton ? (locale + '.'+ empty.button | translate) : ''\"\n [buttonLink]=\"empty.showButton ? empty.route : ''\"\n />\n } @else {\n <ngx-decaf-empty-state\n icon=\"search-outline\"\n ngClass=\"empty-search\"\n [translatable]=\"true\"\n title=\"search.title\"\n subtitle=\"search.subtitle\"\n [searchValue]=\"searchValue\"\n />\n }\n }\n}\n\n", styles: ["ion-infinite-scroll{max-height:50px}ion-infinite-scroll:not(.infinite-scroll-loading) ::ng-deep{max-height:1.5rem}ion-infinite-scroll ::ng-deep ion-spinner{--color: var(--dcf-color-primary);padding-top:1rem}@media (max-width: 768px){#end,[slot=end]{display:none!important}}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: PaginationComponent, selector: "ngx-decaf-pagination", inputs: ["totalPages", "current"], outputs: ["clickEvent"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonThumbnail, selector: "ion-thumbnail" }, { kind: "component", type: IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }, { kind: "component", type: SearchbarComponent, selector: "ngx-decaf-searchbar", inputs: ["autocomplete", "autocorrect", "animated", "buttonCancelText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value", "queryKeys", "isVisible", "wrapper", "wrapperColor", "emitEventToWindow"], outputs: ["searchEvent"] }, { kind: "component", type: EmptyStateComponent, selector: "ngx-decaf-empty-state", inputs: ["title", "titleColor", "subtitle", "subtitleColor", "showIcon", "icon", "iconSize", "iconColor", "buttonLink", "buttonText", "buttonFill", "buttonColor", "buttonSize", "searchValue"] }, { kind: "component", type: FilterComponent, selector: "ngx-decaf-filter", inputs: ["indexes", "conditions", "sortBy", "disableSort"], outputs: ["filterEvent", "searchEvent"] }, { kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "model", "parent"], outputs: ["listenEvent"] }] }); }
1150
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ListComponent, isStandalone: true, selector: "ngx-decaf-list", inputs: { type: "type", translatable: "translatable", showSearchbar: "showSearchbar", data: "data", source: "source", start: "start", limit: "limit", loadMoreData: "loadMoreData", lines: "lines", inset: "inset", scrollThreshold: "scrollThreshold", scrollPosition: "scrollPosition", loadingText: "loadingText", showRefresher: "showRefresher", loadingSpinner: "loadingSpinner", enableFilter: "enableFilter", sortDirection: "sortDirection", sortBy: "sortBy", disableSort: "disableSort", emptyIcon: "emptyIcon", empty: "empty" }, outputs: { refreshEvent: "refreshEvent", clickEvent: "clickEvent" }, host: { listeners: { "window:ListItemClickEvent": "handleClick($event)", "window:searchbarEvent": "handleSearch($event)", "window:BackButtonNavigationEndEvent": "refresh($event)" } }, usesInheritance: true, ngImport: i0, template: "\n@if(showRefresher) {\n <ion-refresher slot=\"fixed\" [pullFactor]=\"1\" [pullMin]=\"100\" [pullMax]=\"200\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content />\n </ion-refresher>\n}\n\n@if(showSearchbar && data?.length) {\n @if(model && enableFilter) {\n <ngx-decaf-filter\n [model]=\"model\"\n [sortDirection]=\"sortDirection\"\n [disableSort]=\"disableSort\"\n (filterEvent)=\"handleFilter($event)\"\n (searchEvent)=\"handleSearch($event)\"\n />\n } @else {\n <ngx-decaf-searchbar [emitEventToWindow]=\"false\" [debounce]=\"500\" (searchEvent)=\"handleSearch($event)\" />\n }\n}\n\n@if(data?.length) {\n <ion-list [id]=\"uid\" [inset]=\"inset\" [lines]=\"lines\" #component>\n @if(item?.tag) {\n @for(child of items; track trackItemFn($index, child)) {\n <ngx-decaf-component-renderer\n [tag]=\"item.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{\n item: child,\n mapper: mapper,\n route: route\n }'>\n </ngx-decaf-component-renderer>\n }\n } @else {\n <ng-content></ng-content>\n }\n </ion-list>\n\n @if(loadMoreData) {\n @if(pages > 0 && type === 'paginated' && !searchValue?.length) {\n <ngx-decaf-pagination\n [totalPages]=\"pages\"\n [current]=\"page\"\n (clickEvent)=\"handlePaginate($event)\"\n />\n\n } @else {\n <ion-infinite-scroll\n [class]=\"searchValue?.length ? 'dcf-hidden' : ''\"\n\n [position]=\"scrollPosition\"\n [threshold]=\"scrollThreshold\"\n (ionInfinite)=\"handleRefresh($event)\">\n <ion-infinite-scroll-content [loadingSpinner]=\"loadingSpinner\" [loadingText]=\"loadingText\" />\n </ion-infinite-scroll>\n }\n }\n} @else {\n @if(refreshing) {\n @for(skl of skeletonData; track $index) {\n <ion-item>\n <ion-thumbnail slot=\"start\">\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n </ion-thumbnail>\n <ion-label>\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n </ion-label>\n </ion-item>\n }\n\n } @else {\n @if(!searchValue?.length) {\n <ngx-decaf-empty-state\n [title]=\"(locale + '.'+ empty.title) | translate\"\n [subtitle]=\"(locale + '.'+ empty.subtitle) | translate\"\n [buttonText]=\"empty.showButton ? (locale + '.'+ empty.button | translate) : ''\"\n [buttonLink]=\"empty.showButton ? empty.route : ''\"\n />\n } @else {\n <ngx-decaf-empty-state\n icon=\"search-outline\"\n ngClass=\"empty-search\"\n [translatable]=\"true\"\n title=\"search.title\"\n subtitle=\"search.subtitle\"\n [searchValue]=\"searchValue\"\n />\n }\n }\n}\n\n", styles: ["ion-infinite-scroll{max-height:50px}ion-infinite-scroll:not(.infinite-scroll-loading) ::ng-deep{max-height:1.5rem}ion-infinite-scroll ::ng-deep ion-spinner{--color: var(--dcf-color-primary);padding-top:1rem}@media (max-width: 768px){#end,[slot=end]{display:none!important}}\n"], dependencies: [{ kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: PaginationComponent, selector: "ngx-decaf-pagination", inputs: ["totalPages", "current"], outputs: ["clickEvent"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonThumbnail, selector: "ion-thumbnail" }, { kind: "component", type: IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: IonInfiniteScroll, selector: "ion-infinite-scroll", inputs: ["disabled", "position", "threshold"] }, { kind: "component", type: IonInfiniteScrollContent, selector: "ion-infinite-scroll-content", inputs: ["loadingSpinner", "loadingText"] }, { kind: "component", type: SearchbarComponent, selector: "ngx-decaf-searchbar", inputs: ["autocomplete", "autocorrect", "animated", "buttonCancelText", "clearIcon", "color", "debounce", "disabled", "enterkeyhint", "inputmode", "placeholder", "searchIcon", "showCancelButton", "showClearButton", "spellcheck", "type", "value", "queryKeys", "isVisible", "wrapper", "wrapperColor", "emitEventToWindow"], outputs: ["searchEvent"] }, { kind: "component", type: EmptyStateComponent, selector: "ngx-decaf-empty-state", inputs: ["title", "titleColor", "subtitle", "subtitleColor", "showIcon", "icon", "iconSize", "iconColor", "buttonLink", "buttonText", "buttonFill", "buttonColor", "buttonSize", "searchValue"] }, { kind: "component", type: FilterComponent, selector: "ngx-decaf-filter", inputs: ["indexes", "conditions", "sortBy", "disableSort"], outputs: ["filterEvent", "searchEvent"] }, { kind: "component", type: ComponentRendererComponent, selector: "ngx-decaf-component-renderer", inputs: ["tag", "globals", "model", "parent"], outputs: ["listenEvent"] }] }); }
1146
1151
  };
1147
1152
  ListComponent = __decorate([
1148
1153
  Dynamic(),
@@ -1172,7 +1177,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1172
1177
  ListItemComponent,
1173
1178
  FilterComponent,
1174
1179
  ComponentRendererComponent
1175
- ], template: "\n@if(showRefresher) {\n <ion-refresher slot=\"fixed\" [pullFactor]=\"1\" [pullMin]=\"100\" [pullMax]=\"200\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content />\n </ion-refresher>\n}\n\n@if(showSearchbar && data?.length) {\n @if(model && enableFilter) {\n <ngx-decaf-filter\n [model]=\"model\"\n [sortDirection]=\"sortDirection\"\n [disableSort]=\"disableSort\"\n (filterEvent)=\"handleFilter($event)\"\n (searchEvent)=\"handleSearch($event)\"\n />\n } @else {\n <ngx-decaf-searchbar [emitEventToWindow]=\"false\" [debounce]=\"500\" (searchEvent)=\"handleSearch($event)\" />\n }\n}\n\n@if(data?.length) {\n <ion-list [id]=\"uid\" [inset]=\"inset\" [lines]=\"lines\" #component>\n @if(item?.tag) {\n @for(child of items; track trackItemFn($index, child)) {\n <ngx-decaf-component-renderer\n [tag]=\"item.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{\n item: child,\n mapper: mapper,\n route: route\n }'>\n </ngx-decaf-component-renderer>\n }\n } @else {\n <ng-content></ng-content>\n }\n </ion-list>\n\n @if(loadMoreData) {\n @if(pages > 0 && type === 'paginated' && !searchValue?.length) {\n <ngx-decaf-pagination\n [totalPages]=\"pages\"\n [current]=\"page\"\n (clickEvent)=\"handlePaginate($event)\"\n />\n\n } @else {\n <ion-infinite-scroll\n [class]=\"searchValue?.length ? 'dcf-hidden' : ''\"\n\n [position]=\"scrollPosition\"\n [threshold]=\"scrollThreshold\"\n (ionInfinite)=\"handleRefresh($event)\">\n <ion-infinite-scroll-content [loadingSpinner]=\"loadingSpinner\" [loadingText]=\"loadingText\" />\n </ion-infinite-scroll>\n }\n }\n} @else {\n @if(refreshing) {\n @for(skl of skeletonData; track skl) {\n <ion-item>\n <ion-thumbnail slot=\"start\">\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n </ion-thumbnail>\n <ion-label>\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n </ion-label>\n </ion-item>\n }\n\n } @else {\n @if(!searchValue?.length) {\n <ngx-decaf-empty-state\n [title]=\"(locale + '.'+ empty.title) | translate\"\n [subtitle]=\"(locale + '.'+ empty.subtitle) | translate\"\n [buttonText]=\"empty.showButton ? (locale + '.'+ empty.button | translate) : ''\"\n [buttonLink]=\"empty.showButton ? empty.route : ''\"\n />\n } @else {\n <ngx-decaf-empty-state\n icon=\"search-outline\"\n ngClass=\"empty-search\"\n [translatable]=\"true\"\n title=\"search.title\"\n subtitle=\"search.subtitle\"\n [searchValue]=\"searchValue\"\n />\n }\n }\n}\n\n", styles: ["ion-infinite-scroll{max-height:50px}ion-infinite-scroll:not(.infinite-scroll-loading) ::ng-deep{max-height:1.5rem}ion-infinite-scroll ::ng-deep ion-spinner{--color: var(--dcf-color-primary);padding-top:1rem}@media (max-width: 768px){#end,[slot=end]{display:none!important}}\n"] }]
1180
+ ], template: "\n@if(showRefresher) {\n <ion-refresher slot=\"fixed\" [pullFactor]=\"1\" [pullMin]=\"100\" [pullMax]=\"200\" (ionRefresh)=\"handleRefresh($event)\">\n <ion-refresher-content />\n </ion-refresher>\n}\n\n@if(showSearchbar && data?.length) {\n @if(model && enableFilter) {\n <ngx-decaf-filter\n [model]=\"model\"\n [sortDirection]=\"sortDirection\"\n [disableSort]=\"disableSort\"\n (filterEvent)=\"handleFilter($event)\"\n (searchEvent)=\"handleSearch($event)\"\n />\n } @else {\n <ngx-decaf-searchbar [emitEventToWindow]=\"false\" [debounce]=\"500\" (searchEvent)=\"handleSearch($event)\" />\n }\n}\n\n@if(data?.length) {\n <ion-list [id]=\"uid\" [inset]=\"inset\" [lines]=\"lines\" #component>\n @if(item?.tag) {\n @for(child of items; track trackItemFn($index, child)) {\n <ngx-decaf-component-renderer\n [tag]=\"item.tag\"\n (listenEvent)=\"handleEvent($event)\"\n [globals]='{\n item: child,\n mapper: mapper,\n route: route\n }'>\n </ngx-decaf-component-renderer>\n }\n } @else {\n <ng-content></ng-content>\n }\n </ion-list>\n\n @if(loadMoreData) {\n @if(pages > 0 && type === 'paginated' && !searchValue?.length) {\n <ngx-decaf-pagination\n [totalPages]=\"pages\"\n [current]=\"page\"\n (clickEvent)=\"handlePaginate($event)\"\n />\n\n } @else {\n <ion-infinite-scroll\n [class]=\"searchValue?.length ? 'dcf-hidden' : ''\"\n\n [position]=\"scrollPosition\"\n [threshold]=\"scrollThreshold\"\n (ionInfinite)=\"handleRefresh($event)\">\n <ion-infinite-scroll-content [loadingSpinner]=\"loadingSpinner\" [loadingText]=\"loadingText\" />\n </ion-infinite-scroll>\n }\n }\n} @else {\n @if(refreshing) {\n @for(skl of skeletonData; track $index) {\n <ion-item>\n <ion-thumbnail slot=\"start\">\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n </ion-thumbnail>\n <ion-label>\n <ion-skeleton-text [animated]=\"true\"></ion-skeleton-text>\n <ion-text class=\"date\" style=\"width: 20%;\"><ion-skeleton-text [animated]=\"true\"></ion-skeleton-text></ion-text>\n </ion-label>\n </ion-item>\n }\n\n } @else {\n @if(!searchValue?.length) {\n <ngx-decaf-empty-state\n [title]=\"(locale + '.'+ empty.title) | translate\"\n [subtitle]=\"(locale + '.'+ empty.subtitle) | translate\"\n [buttonText]=\"empty.showButton ? (locale + '.'+ empty.button | translate) : ''\"\n [buttonLink]=\"empty.showButton ? empty.route : ''\"\n />\n } @else {\n <ngx-decaf-empty-state\n icon=\"search-outline\"\n ngClass=\"empty-search\"\n [translatable]=\"true\"\n title=\"search.title\"\n subtitle=\"search.subtitle\"\n [searchValue]=\"searchValue\"\n />\n }\n }\n}\n\n", styles: ["ion-infinite-scroll{max-height:50px}ion-infinite-scroll:not(.infinite-scroll-loading) ::ng-deep{max-height:1.5rem}ion-infinite-scroll ::ng-deep ion-spinner{--color: var(--dcf-color-primary);padding-top:1rem}@media (max-width: 768px){#end,[slot=end]{display:none!important}}\n"] }]
1176
1181
  }], ctorParameters: () => [], propDecorators: { type: [{
1177
1182
  type: Input
1178
1183
  }], translatable: [{
@@ -1229,4 +1234,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1229
1234
  type: HostListener,
1230
1235
  args: ['window:BackButtonNavigationEndEvent', ['$event']]
1231
1236
  }] } });
1232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbGlzdC9saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9saXN0L2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXpHLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLE9BQU8sRUFDUCxZQUFZLEVBQ1osVUFBVSxFQUNYLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBWSxjQUFjLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBRUwsT0FBTyxFQUNQLGNBQWMsRUFDZCxrQkFBa0IsRUFLbkIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxD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TztzQkFEWixZQUFZO3VCQUFDLHFDQUFxQyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dCwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3kgIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50LCBSZWZyZXNoZXJDdXN0b21FdmVudCwgU3Bpbm5lclR5cGVzIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtcbiAgSW9uSW5maW5pdGVTY3JvbGwsXG4gIElvbkluZmluaXRlU2Nyb2xsQ29udGVudCxcbiAgSW9uSXRlbSxcbiAgSW9uTGFiZWwsXG4gIElvbkxpc3QsXG4gIElvblJlZnJlc2hlcixcbiAgSW9uUmVmcmVzaGVyQ29udGVudCxcbiAgSW9uU2tlbGV0b25UZXh0LFxuICBJb25UZXh0LFxuICBJb25UaHVtYm5haWwsXG4gIElvbkxvYWRpbmdcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBNb2RlbCwgUHJpbWl0aXZlcyB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBDb25kaXRpb24sIE9ic2VydmVyLCBPcmRlckRpcmVjdGlvbiwgUGFnaW5hdG9yIH0gZnJvbSAnQGRlY2FmLXRzL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmFzZUN1c3RvbUV2ZW50LFxuICBEeW5hbWljLFxuICBFdmVudENvbnN0YW50cyxcbiAgQ29tcG9uZW50c1RhZ05hbWVzLFxuICBSZW5kZXJlckN1c3RvbUV2ZW50LFxuICBTdHJpbmdPckJvb2xlYW4sXG4gIEtleVZhbHVlLFxuICBMaXN0SXRlbUN1c3RvbUV2ZW50XG59IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBOZ3hCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lL05neEJhc2VDb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgc3RyaW5nVG9Cb29sZWFuLFxuICBmb3JtYXREYXRlLFxuICBpc1ZhbGlkRGF0ZVxufSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IFNlYXJjaGJhckNvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaGJhci9zZWFyY2hiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlzdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9saXN0LWl0ZW0vbGlzdC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1yZW5kZXJlci9jb21wb25lbnQtcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRpb25DdXN0b21FdmVudCB9IGZyb20gJy4uL3BhZ2luYXRpb24vY29uc3RhbnRzJztcbmltcG9ydCB7IElMaXN0RW1wdHlSZXN1bHQsIExpc3RDb21wb25lbnRzVHlwZXMsIERlY2FmUmVwb3NpdG9yeSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEZ1bmN0aW9uTGlrZSwgSUZpbHRlclF1ZXJ5LCBJRmlsdGVyUXVlcnlJdGVtIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4uL2ZpbHRlci9maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFRyYW5zbGF0ZVBpcGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSB2ZXJzYXRpbGUgbGlzdCBjb21wb25lbnQgdGhhdCBzdXBwb3J0cyB2YXJpb3VzIGRhdGEgZGlzcGxheSBtb2Rlcy5cbiAqIEBzdW1tYXJ5IFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZmxleGlibGUgd2F5IHRvIGRpc3BsYXkgbGlzdHMgb2YgZGF0YSB3aXRoIHN1cHBvcnRcbiAqIGZvciBpbmZpbml0ZSBzY3JvbGxpbmcsIHBhZ2luYXRpb24sIHNlYXJjaGluZywgYW5kIGN1c3RvbSBpdGVtIHJlbmRlcmluZy4gSXQgY2FuIGZldGNoXG4gKiBkYXRhIGZyb20gdmFyaW91cyBzb3VyY2VzIGluY2x1ZGluZyBtb2RlbHMsIGZ1bmN0aW9ucywgb3IgZGlyZWN0IGRhdGEgaW5wdXQuXG4gKlxuICogVGhlIGNvbXBvbmVudCBzdXBwb3J0cyB0d28gbWFpbiBkaXNwbGF5IHR5cGVzOlxuICogMS4gSW5maW5pdGUgc2Nyb2xsaW5nIC0gTG9hZHMgbW9yZSBkYXRhIGFzIHRoZSB1c2VyIHNjcm9sbHNcbiAqIDIuIFBhZ2luYXRpb24gLSBEaXNwbGF5cyBkYXRhIGluIHBhZ2VzIHdpdGggbmF2aWdhdGlvbiBjb250cm9sc1xuICpcbiAqIEFkZGl0aW9uYWwgZmVhdHVyZXMgaW5jbHVkZTpcbiAqIC0gUHVsbC10by1yZWZyZXNoIGZ1bmN0aW9uYWxpdHlcbiAqIC0gU2VhcmNoIGZpbHRlcmluZ1xuICogLSBFbXB0eSBzdGF0ZSBjdXN0b21pemF0aW9uXG4gKiAtIEN1c3RvbSBpdGVtIHJlbmRlcmluZ1xuICogLSBFdmVudCBlbWlzc2lvbiBmb3IgaW50ZXJhY3Rpb25zXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAqICAgcGFydGljaXBhbnQgTCBhcyBMaXN0Q29tcG9uZW50XG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGF0YSBTb3VyY2VcbiAqICAgcGFydGljaXBhbnQgRSBhcyBFeHRlcm5hbCBDb21wb25lbnRzXG4gKlxuICogICBVLT4+TDogSW5pdGlhbGl6ZSBjb21wb25lbnRcbiAqICAgTC0+Pkw6IG5nT25Jbml0KClcbiAqICAgTC0+PkQ6IFJlcXVlc3QgaW5pdGlhbCBkYXRhXG4gKiAgIEQtLT4+TDogUmV0dXJuIGRhdGFcbiAqICAgTC0+Pkw6IFByb2Nlc3MgYW5kIGRpc3BsYXkgZGF0YVxuICpcbiAqICAgYWx0IFVzZXIgc2Nyb2xscyAoSW5maW5pdGUgbW9kZSlcbiAqICAgICBVLT4+TDogU2Nyb2xsIHRvIGJvdHRvbVxuICogICAgIEwtPj5EOiBSZXF1ZXN0IG1vcmUgZGF0YVxuICogICAgIEQtLT4+TDogUmV0dXJuIGFkZGl0aW9uYWwgZGF0YVxuICogICAgIEwtPj5MOiBBcHBlbmQgdG8gZXhpc3RpbmcgZGF0YVxuICogICBlbHNlIFVzZXIgY2hhbmdlcyBwYWdlIChQYWdpbmF0ZWQgbW9kZSlcbiAqICAgICBVLT4+TDogQ2xpY2sgcGFnZSBudW1iZXJcbiAqICAgICBMLT4+TDogaGFuZGxlUGFnaW5hdGUoKVxuICogICAgIEwtPj5EOiBSZXF1ZXN0IGRhdGEgZm9yIHBhZ2VcbiAqICAgICBELS0+Pkw6IFJldHVybiBwYWdlIGRhdGFcbiAqICAgICBMLT4+TDogUmVwbGFjZSBkaXNwbGF5ZWQgZGF0YVxuICogICBlbmRcbiAqXG4gKiAgIGFsdCBVc2VyIHNlYXJjaGVzXG4gKiAgICAgVS0+Pkw6IEVudGVyIHNlYXJjaCB0ZXJtXG4gKiAgICAgTC0+Pkw6IGhhbmRsZVNlYXJjaCgpXG4gKiAgICAgTC0+PkQ6IEZpbHRlciBkYXRhIGJ5IHNlYXJjaCB0ZXJtXG4gKiAgICAgRC0tPj5MOiBSZXR1cm4gZmlsdGVyZWQgZGF0YVxuICogICAgIEwtPj5MOiBVcGRhdGUgZGlzcGxheWVkIGRhdGFcbiAqICAgZW5kXG4gKlxuICogICBhbHQgVXNlciBjbGlja3MgaXRlbVxuICogICAgIFUtPj5MOiBDbGljayBsaXN0IGl0ZW1cbiAqICAgICBMLT4+TDogaGFuZGxlQ2xpY2soKVxuICogICAgIEwtPj5FOiBFbWl0IGNsaWNrRXZlbnRcbiAqICAgZW5kXG4gKlxuICogQGV4YW1wbGVcbiAqIDxuZ3gtZGVjYWYtbGlzdFxuICogICBbc291cmNlXT1cImRhdGFTb3VyY2VcIlxuICogICBbbGltaXRdPVwiMTBcIlxuICogICBbdHlwZV09XCInaW5maW5pdGUnXCJcbiAqICAgW3Nob3dTZWFyY2hiYXJdPVwidHJ1ZVwiXG4gKiAgIChjbGlja0V2ZW50KT1cImhhbmRsZUl0ZW1DbGljaygkZXZlbnQpXCJcbiAqICAgKHJlZnJlc2hFdmVudCk9XCJoYW5kbGVSZWZyZXNoKCRldmVudClcIj5cbiAqIDwvbmd4LWRlY2FmLWxpc3Q+XG4gKlxuICogQGV4dGVuZHMge05neEJhc2VDb21wb25lbnR9XG4gKiBAaW1wbGVtZW50cyB7T25Jbml0fVxuICovXG5ARHluYW1pYygpXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZGVjYWYtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlUGlwZSxcbiAgICBJb25SZWZyZXNoZXIsXG4gICAgSW9uTG9hZGluZyxcbiAgICBQYWdpbmF0aW9uQ29tcG9uZW50LFxuICAgIElvbkxpc3QsXG4gICAgSW9uSXRlbSxcbiAgICBJb25UaHVtYm5haWwsXG4gICAgSW9uU2tlbGV0b25UZXh0LFxuICAgIElvbkxhYmVsLFxuICAgIElvblRleHQsXG4gICAgSW9uUmVmcmVzaGVyQ29udGVudCxcbiAgICBJb25JbmZpbml0ZVNjcm9sbCxcbiAgICBJb25JbmZpbml0ZVNjcm9sbENvbnRlbnQsXG4gICAgSW9uVGh1bWJuYWlsLFxuICAgIElvblNrZWxldG9uVGV4dCxcbiAgICBTZWFyY2hiYXJDb21wb25lbnQsXG4gICAgRW1wdHlTdGF0ZUNvbXBvbmVudCxcbiAgICBMaXN0SXRlbUNvbXBvbmVudCxcbiAgICBGaWx0ZXJDb21wb25lbnQsXG4gICAgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaXN0Q29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkaXNwbGF5IG1vZGUgZm9yIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBob3cgdGhlIGxpc3QgZGF0YSBpcyBsb2FkZWQgYW5kIGRpc3BsYXllZC4gT3B0aW9ucyBpbmNsdWRlOlxuICAgKiAtIElORklOSVRFOiBMb2FkcyBtb3JlIGRhdGEgYXMgdGhlIHVzZXIgc2Nyb2xscyAoaW5maW5pdGUgc2Nyb2xsaW5nKVxuICAgKiAtIFBBR0lOQVRFRDogRGlzcGxheXMgZGF0YSBpbiBwYWdlcyB3aXRoIG5hdmlnYXRpb24gY29udHJvbHNcbiAgICpcbiAgICogQHR5cGUge0xpc3RDb21wb25lbnRzVHlwZXN9XG4gICAqIEBkZWZhdWx0IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHR5cGU6IExpc3RDb21wb25lbnRzVHlwZXMgPSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciB0aGUgY29tcG9uZW50IHVzZXMgdHJhbnNsYXRpb24gc2VydmljZXMuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIHRoZSBjb21wb25lbnQgd2lsbCBhdHRlbXB0IHRvIHVzZSB0cmFuc2xhdGlvbiBzZXJ2aWNlc1xuICAgKiBmb3IgYW55IHRleHQgY29udGVudC4gVGhpcyBhbGxvd3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uIG9mIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgdHJhbnNsYXRhYmxlOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHNlYXJjaCBiYXIuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIGRpc3BsYXlzIGEgc2VhcmNoIGJhciBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0IHRoYXQgYWxsb3dzXG4gICAqIHVzZXJzIHRvIGZpbHRlciB0aGUgbGlzdCBpdGVtcy4gVGhlIHNlYXJjaCBmdW5jdGlvbmFsaXR5IHdvcmtzIGJ5IGZpbHRlcmluZyB0aGVcbiAgICogZXhpc3RpbmcgZGF0YSBvciBieSB0cmlnZ2VyaW5nIGEgbmV3IGRhdGEgZmV0Y2ggd2l0aCBzZWFyY2ggcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc2hvd1NlYXJjaGJhcjogU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERpcmVjdCBkYXRhIGlucHV0IGZvciB0aGUgbGlzdCBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgd2F5IHRvIGRpcmVjdGx5IHBhc3MgZGF0YSB0byB0aGUgbGlzdCBjb21wb25lbnQgaW5zdGVhZCBvZlxuICAgKiBmZXRjaGluZyBpdCBmcm9tIGEgc291cmNlLiBXaGVuIGJvdGggZGF0YSBhbmQgc291cmNlIGFyZSBwcm92aWRlZCwgdGhlIGNvbXBvbmVudFxuICAgKiB3aWxsIHVzZSB0aGUgc291cmNlIHRvIGZldGNoIGRhdGEgb25seSBpZiB0aGUgZGF0YSBhcnJheSBpcyBlbXB0eS5cbiAgICpcbiAgICogQHR5cGUge0tleVZhbHVlW10gfCB1bmRlZmluZWR9XG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZGF0YT86IEtleVZhbHVlW10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoZXJlIHRoZSBsaXN0IHNob3VsZCBmZXRjaCBpdHMgZGF0YSBmcm9tLiBUaGlzIGNhbiBiZSBlaXRoZXI6XG4gICAqIC0gQSBzdHJpbmcgVVJMIG9yIGVuZHBvaW50IGlkZW50aWZpZXJcbiAgICogLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBkYXRhIHdoZW4gY2FsbGVkXG4gICAqIFRoZSBjb21wb25lbnQgd2lsbCBjYWxsIHRoaXMgc291cmNlIHdoZW4gaXQgbmVlZHMgdG8gbG9hZCBvciByZWZyZXNoIGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBGdW5jdGlvbkxpa2V9XG4gICAqIEByZXF1aXJlZFxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc291cmNlITogc3RyaW5nIHwgRnVuY3Rpb25MaWtlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0YXJ0aW5nIGluZGV4IGZvciBkYXRhIGZldGNoaW5nLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGluZGV4IGZyb20gd2hpY2ggdG8gc3RhcnQgZmV0Y2hpbmcgZGF0YS4gVGhpcyBpcyB1c2VkXG4gICAqIGZvciBwYWdpbmF0aW9uIGFuZCBpbmZpbml0ZSBzY3JvbGxpbmcgdG8gZGV0ZXJtaW5lIHdoaWNoIHN1YnNldCBvZiBkYXRhIHRvIGxvYWQuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDBcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHN0YXJ0OiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG51bWJlciBvZiBpdGVtcyB0byBmZXRjaCBwZXIgcGFnZSBvciBsb2FkIG9wZXJhdGlvbi5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBob3cgbWFueSBpdGVtcyBhcmUgbG9hZGVkIGF0IG9uY2UgZHVyaW5nIHBhZ2luYXRpb24gb3JcbiAgICogaW5maW5pdGUgc2Nyb2xsaW5nLiBUaGlzIGFmZmVjdHMgdGhlIHNpemUgb2YgZGF0YSBjaHVua3MgcmVxdWVzdGVkIGZyb20gdGhlIHNvdXJjZS5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMTBcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxpbWl0OiBudW1iZXIgPSAxMDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgbW9yZSBkYXRhIGNhbiBiZSBsb2FkZWQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIHRoZSBjb21wb25lbnQgd2lsbCBhbGxvdyBsb2FkaW5nIGFkZGl0aW9uYWwgZGF0YVxuICAgKiB0aHJvdWdoIGluZmluaXRlIHNjcm9sbGluZyBvciBwYWdpbmF0aW9uLiBXaGVuIGZhbHNlLCB0aGUgY29tcG9uZW50IHdpbGwgbm90XG4gICAqIGF0dGVtcHQgdG8gbG9hZCBtb3JlIGRhdGEgYmV5b25kIHdoYXQgaXMgaW5pdGlhbGx5IGRpc3BsYXllZC5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbG9hZE1vcmVEYXRhOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc3R5bGUgb2YgZGl2aWRpbmcgbGluZXMgYmV0d2VlbiBsaXN0IGl0ZW1zLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGhvdyBkaXZpZGluZyBsaW5lcyBhcHBlYXIgYmV0d2VlbiBsaXN0IGl0ZW1zLiBPcHRpb25zIGluY2x1ZGU6XG4gICAqIC0gXCJpbnNldFwiOiBMaW5lcyBhcmUgaW5zZXQgZnJvbSB0aGUgZWRnZXNcbiAgICogLSBcImZ1bGxcIjogTGluZXMgZXh0ZW5kIHRoZSBmdWxsIHdpZHRoXG4gICAqIC0gXCJub25lXCI6IE5vIGRpdmlkaW5nIGxpbmVzXG4gICAqXG4gICAqIEB0eXBlIHtcImluc2V0XCIgfCBcImZ1bGxcIiB8IFwibm9uZVwifVxuICAgKiBAZGVmYXVsdCBcImZ1bGxcIlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbGluZXM6IFwiaW5zZXRcIiB8IFwiZnVsbFwiIHwgXCJub25lXCIgPSBcImZ1bGxcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgdGhlIGxpc3QgaGFzIGluc2V0IHN0eWxpbmcuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIHRoZSBsaXN0IHdpbGwgaGF2ZSBpbnNldCBzdHlsaW5nIHdpdGggcm91bmRlZCBjb3JuZXJzXG4gICAqIGFuZCBtYXJnaW4gYXJvdW5kIHRoZSBlZGdlcy4gVGhpcyBjcmVhdGVzIGEgY2FyZC1saWtlIGFwcGVhcmFuY2UgZm9yIHRoZSBsaXN0LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgaW5zZXQ6IFN0cmluZ09yQm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHRocmVzaG9sZCBmb3IgdHJpZ2dlcmluZyBpbmZpbml0ZSBzY3JvbGwgbG9hZGluZy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyBjbG9zZSB0byB0aGUgYm90dG9tIG9mIHRoZSBsaXN0IHRoZSB1c2VyIG11c3Qgc2Nyb2xsXG4gICAqIGJlZm9yZSB0aGUgY29tcG9uZW50IHRyaWdnZXJzIGxvYWRpbmcgb2YgYWRkaXRpb25hbCBkYXRhLiBUaGlzIGlzIGV4cHJlc3NlZFxuICAgKiBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGxpc3QgaGVpZ2h0LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBcIjE1JVwiXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzY3JvbGxUaHJlc2hvbGQ6IHN0cmluZyA9IFwiMTUlXCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcG9zaXRpb24gd2hlcmUgbmV3IGl0ZW1zIGFyZSBhZGRlZCBkdXJpbmcgaW5maW5pdGUgc2Nyb2xsaW5nLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoZXRoZXIgbmV3IGl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgbGlzdFxuICAgKiB3aGVuIGxvYWRpbmcgbW9yZSBkYXRhIHRocm91Z2ggaW5maW5pdGUgc2Nyb2xsaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7XCJib3R0b21cIiB8IFwidG9wXCJ9XG4gICAqIEBkZWZhdWx0IFwiYm90dG9tXCJcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNjcm9sbFBvc2l0aW9uOiBcImJvdHRvbVwiIHwgXCJ0b3BcIiA9IFwiYm90dG9tXCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXN0b20gdGV4dCB0byBkaXNwbGF5IGR1cmluZyBsb2FkaW5nIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgdGV4dCBzaG93biBpbiB0aGUgbG9hZGluZyBpbmRpY2F0b3Igd2hlbiB0aGUgY29tcG9uZW50XG4gICAqIGlzIGZldGNoaW5nIGRhdGEuIElmIG5vdCBwcm92aWRlZCwgYSBkZWZhdWx0IGxvYWRpbmcgbWVzc2FnZSB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsb2FkaW5nVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBwdWxsLXRvLXJlZnJlc2ggZmVhdHVyZS5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgZW5hYmxlcyB0aGUgcHVsbC10by1yZWZyZXNoIGZ1bmN0aW9uYWxpdHkgdGhhdCBhbGxvd3NcbiAgICogdXNlcnMgdG8gcmVmcmVzaCB0aGUgbGlzdCBkYXRhIGJ5IHB1bGxpbmcgZG93biBmcm9tIHRoZSB0b3Agb2YgdGhlIGxpc3QuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNob3dSZWZyZXNoZXI6IFN0cmluZ09yQm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdHlwZSBvZiBzcGlubmVyIHRvIGRpc3BsYXkgZHVyaW5nIGxvYWRpbmcgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSB2aXN1YWwgc3R5bGUgb2YgdGhlIGxvYWRpbmcgc3Bpbm5lciBzaG93biBkdXJpbmcgZGF0YVxuICAgKiBmZXRjaGluZyBvcGVyYXRpb25zLiBVc2VzIElvbmljJ3MgcHJlZGVmaW5lZCBzcGlubmVyIHR5cGVzLlxuICAgKlxuICAgKiBAdHlwZSB7U3Bpbm5lclR5cGVzfVxuICAgKiBAZGVmYXVsdCBcImNpcmN1bGFyXCJcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxvYWRpbmdTcGlubmVyOiBTcGlubmVyVHlwZXMgPSBcImNpcmN1bGFyXCI7XG5cbiAgLy8gLyoqXG4gIC8vICAqIEBkZXNjcmlwdGlvbiBRdWVyeSBwYXJhbWV0ZXJzIGZvciBkYXRhIGZldGNoaW5nLlxuICAvLyAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgYWRkaXRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZldGNoaW5nIGRhdGEgZnJvbVxuICAvLyAgKiB0aGUgc291cmNlLiBUaGlzIGNhbiBiZSBwcm92aWRlZCBhcyBhIHN0cmluZyAoSlNPTikgb3IgYSBkaXJlY3Qgb2JqZWN0LlxuICAvLyAgKlxuICAvLyAgKiBAdHlwZSB7c3RyaW5nIHwgS2V5VmFsdWUgfCB1bmRlZmluZWR9XG4gIC8vICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gIC8vICAqL1xuICAvLyBASW5wdXQoKVxuICAvLyBxdWVyeT86IHN0cmluZyB8IEtleVZhbHVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciB0aGUgZmlsdGVyaW5nIGZ1bmN0aW9uYWxpdHkgaXMgZW5hYmxlZC5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgZW5hYmxlcyB0aGUgZmlsdGVyIGNvbXBvbmVudCB0aGF0IGFsbG93cyB1c2VycyB0byBjcmVhdGVcbiAgICogY29tcGxleCBzZWFyY2ggY3JpdGVyaWEgd2l0aCBtdWx0aXBsZSBmaWVsZCBmaWx0ZXJzLCBjb25kaXRpb25zLCBhbmQgdmFsdWVzLlxuICAgKiBXaGVuIGZhbHNlLCBkaXNhYmxlcyB0aGUgZmlsdGVyIGludGVyZmFjZSBlbnRpcmVseS5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZW5hYmxlRmlsdGVyOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU29ydGluZyBwYXJhbWV0ZXJzIGZvciBkYXRhIGZldGNoaW5nLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IHRoZSBmZXRjaGVkIGRhdGEgc2hvdWxkIGJlIHNvcnRlZC4gVGhpcyBjYW4gYmUgcHJvdmlkZWRcbiAgICogYXMgYSBzdHJpbmcgKGZpZWxkIG5hbWUgd2l0aCBvcHRpb25hbCBkaXJlY3Rpb24pIG9yIGEgZGlyZWN0IG9iamVjdC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IEtleVZhbHVlIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc29ydERpcmVjdGlvbjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5EU0M7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNvcnRpbmcgcGFyYW1ldGVycyBmb3IgZGF0YSBmZXRjaGluZy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyB0aGUgZmV0Y2hlZCBkYXRhIHNob3VsZCBiZSBzb3J0ZWQuIFRoaXMgY2FuIGJlIHByb3ZpZGVkXG4gICAqIGFzIGEgc3RyaW5nIChmaWVsZCBuYW1lIHdpdGggb3B0aW9uYWwgZGlyZWN0aW9uKSBvciBhIGRpcmVjdCBvYmplY3QuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBLZXlWYWx1ZSB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNvcnRCeSE6IHN0cmluZztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciBzb3J0aW5nIGZ1bmN0aW9uYWxpdHkgaXMgZGlzYWJsZWQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIGRpc2FibGVzIHRoZSBzb3J0IGNvbnRyb2xzIGFuZCBwcmV2ZW50cyB1c2VycyBmcm9tXG4gICAqIGNoYW5naW5nIHRoZSBzb3J0IG9yZGVyIG9yIGZpZWxkLiBUaGUgbGlzdCB3aWxsIG1haW50YWluIGl0cyBkZWZhdWx0IG9yXG4gICAqIHByb2dyYW1tYXRpY2FsbHkgc2V0IHNvcnQgY29uZmlndXJhdGlvbiB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBkaXNhYmxlU29ydDogU3RyaW5nT3JCb29sZWFuID0gZmFsc2U7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEljb24gdG8gZGlzcGxheSB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5LlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGljb24gc2hvd24gaW4gdGhlIGVtcHR5IHN0YXRlIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUuXG4gICAqIFRoaXMgY2FuIGJlIGFueSBpY29uIG5hbWUgc3VwcG9ydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbidzIGljb24gc3lzdGVtLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAZGVmYXVsdCAndGktZGF0YWJhc2UtZXhjbGFtYXRpb24nXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBlbXB0eUljb24/OiBzdHJpbmcgPSAndGktZGF0YWJhc2UtZXhjbGFtYXRpb24nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBmb3IgdGhlIGVtcHR5IHN0YXRlIGRpc3BsYXkuXG4gICAqIEBzdW1tYXJ5IEN1c3RvbWl6ZXMgaG93IHRoZSBlbXB0eSBzdGF0ZSBpcyBkaXNwbGF5ZWQgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICogVGhpcyBpbmNsdWRlcyB0aGUgdGl0bGUsIHN1YnRpdGxlLCBidXR0b24gdGV4dCwgaWNvbiwgYW5kIG5hdmlnYXRpb24gbGluay5cbiAgICpcbiAgICogQHR5cGUge1BhcnRpYWw8SUxpc3RFbXB0eVJlc3VsdD59XG4gICAqIEBkZWZhdWx0IHtcbiAgICogICB0aXRsZTogJ2VtcHR5LnRpdGxlJyxcbiAgICogICBzdWJ0aXRsZTogJ2VtcHR5LnN1YnRpdGxlJyxcbiAgICogICBzaG93QnV0dG9uOiBmYWxzZSxcbiAgICogICBpY29uOiAnYWxlcnQtY2lyY2xlLW91dGxpbmUnLFxuICAgKiAgIGJ1dHRvblRleHQ6ICdsb2NhbGUuZW1wdHkuYnV0dG9uJyxcbiAgICogICBsaW5rOiAnJ1xuICAgKiB9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBlbXB0eTogUGFydGlhbDxJTGlzdEVtcHR5UmVzdWx0PiA9IHtcbiAgICB0aXRsZTogJ2VtcHR5LnRpdGxlJyxcbiAgICBzdWJ0aXRsZTogJ2VtcHR5LnN1YnRpdGxlJyxcbiAgICBzaG93QnV0dG9uOiBmYWxzZSxcbiAgICBpY29uOiAnYWxlcnQtY2lyY2xlLW91dGxpbmUnLFxuICAgIGJ1dHRvblRleHQ6ICdsb2NhbGUuZW1wdHkuYnV0dG9uJyxcbiAgICBsaW5rOiAnJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY3VycmVudCBwYWdlIG51bWJlciBpbiBwYWdpbmF0ZWQgbW9kZS5cbiAgICogQHN1bW1hcnkgVHJhY2tzIHdoaWNoIHBhZ2UgaXMgY3VycmVudGx5IGJlaW5nIGRpc3BsYXllZCB3aGVuIHRoZSBjb21wb25lbnRcbiAgICogaXMgaW4gcGFnaW5hdGVkIG1vZGUuIFRoaXMgaXMgdXNlZCBmb3IgcGFnaW5hdGlvbiBjb250cm9scyBhbmQgZGF0YSBmZXRjaGluZy5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcGFnZTogbnVtYmVyID0gMTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMgYXZhaWxhYmxlLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGNhbGN1bGF0ZWQgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGJhc2VkIG9uIHRoZSBkYXRhIHNpemVcbiAgICogYW5kIGxpbWl0LiBUaGlzIGlzIHVzZWQgZm9yIHBhZ2luYXRpb24gY29udHJvbHMgYW5kIGJvdW5kYXJ5IGNoZWNraW5nLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcGFnZXMhOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRpY2F0ZXMgd2hldGhlciBhIHJlZnJlc2ggb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLlxuICAgKiBAc3VtbWFyeSBXaGVuIHRydWUsIHRoZSBjb21wb25lbnQgaXMgY3VycmVudGx5IGZldGNoaW5nIG5ldyBkYXRhLiBUaGlzIGlzIHVzZWRcbiAgICogdG8gY29udHJvbCBsb2FkaW5nIGluZGljYXRvcnMgYW5kIHByZXZlbnQgZHVwbGljYXRlIHJlZnJlc2ggb3BlcmF0aW9ucyBmcm9tXG4gICAqIGJlaW5nIHRyaWdnZXJlZCBzaW11bHRhbmVvdXNseS5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICByZWZyZXNoaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSB1c2VkIGZvciByZW5kZXJpbmcgc2tlbGV0b24gbG9hZGluZyBwbGFjZWhvbGRlcnMuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIHBsYWNlaG9sZGVyIGl0ZW1zIHRoYXQgYXJlIGRpc3BsYXllZCBkdXJpbmcgZGF0YSBsb2FkaW5nLlxuICAgKiBUaGUgbGVuZ3RoIG9mIHRoaXMgYXJyYXkgZGV0ZXJtaW5lcyBob3cgbWFueSBza2VsZXRvbiBpdGVtcyBhcmUgc2hvd24uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmdbXX1cbiAgICogQGRlZmF1bHQgbmV3IEFycmF5KDIpXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBza2VsZXRvbkRhdGE6IHN0cmluZ1tdID0gbmV3IEFycmF5KDIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHByb2Nlc3NlZCBsaXN0IGl0ZW1zIHJlYWR5IGZvciBkaXNwbGF5LlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgc2V0IG9mIGl0ZW1zIGJlaW5nIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBhZnRlclxuICAgKiBwcm9jZXNzaW5nIGZyb20gdGhlIHJhdyBkYXRhIHNvdXJjZS4gVGhpcyBtYXkgYmUgYSBzdWJzZXQgb2YgdGhlIGZ1bGwgZGF0YVxuICAgKiB3aGVuIHVzaW5nIHBhZ2luYXRpb24gb3IgaW5maW5pdGUgc2Nyb2xsaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7S2V5VmFsdWVbXX1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGl0ZW1zITogS2V5VmFsdWVbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50IHNlYXJjaCBxdWVyeSB2YWx1ZS5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhlIHNlYXJjaCBiYXIuIFRoaXMgaXMgdXNlZCB0byBmaWx0ZXJcbiAgICogdGhlIGxpc3QgZGF0YSBvciB0byBzZW5kIGFzIGEgc2VhcmNoIHBhcmFtZXRlciB3aGVuIGZldGNoaW5nIG5ldyBkYXRhLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgc2VhcmNoVmFsdWU/OiBzdHJpbmcgfCBJRmlsdGVyUXVlcnkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBIHBhZ2luYXRvciBvYmplY3QgZm9yIGhhbmRsaW5nIHBhZ2luYXRpb24gb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBwYWdpbmF0b3Igb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYW5kIG5hdmlnYXRlXG4gICAqIHRocm91Z2ggZGF0YSBpbiBjaHVua3MsIHJlZHVjaW5nIG1lbW9yeSB1c2FnZSBhbmQgaW1wcm92aW5nIHBlcmZvcm1hbmNlLlxuICAgKlxuICAgKiBUaGUgcGFnaW5hdG9yIG9iamVjdCBpcyBpbml0aWFsaXplZCBpbiB0aGUgYG5nT25Jbml0YCBsaWZlY3ljbGUgaG9vayBhbmQgaXNcbiAgICogdXNlZCB0byBmZXRjaCBhbmQgZGlzcGxheSBkYXRhIGluIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudC4gSXQgaXMgYW4gaW5zdGFuY2VcbiAgICogb2YgdGhlIGBQYWdpbmF0b3JgIGNsYXNzIGZyb20gdGhlIGBAZGVjYWYtdHMvY29yZWAgcGFja2FnZSwgd2hpY2ggcHJvdmlkZXNcbiAgICogbWV0aG9kcyBmb3IgcXVlcnlpbmcgYW5kIG1hbmlwdWxhdGluZyBwYWdpbmF0ZWQgZGF0YS5cbiAgICpcbiAgICogQHR5cGUge1BhZ2luYXRvcjxNb2RlbD59XG4gICAqIEBtZW1iZXJPZiBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqL1xuICBwYWdpbmF0b3IhOiBQYWdpbmF0b3I8TW9kZWw+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxhc3QgcGFnZSBudW1iZXIgdGhhdCB3YXMgZGlzcGxheWVkLlxuICAgKiBAc3VtbWFyeSBLZWVwcyB0cmFjayBvZiB0aGUgcHJldmlvdXNseSBkaXNwbGF5ZWQgcGFnZSBudW1iZXIsIHdoaWNoIGlzIHVzZWZ1bFxuICAgKiBmb3IgaGFuZGxpbmcgbmF2aWdhdGlvbiBhbmQgc2VhcmNoIG9wZXJhdGlvbnMgaW4gcGFnaW5hdGVkIG1vZGUuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDFcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGxhc3RQYWdlOiBudW1iZXIgPSAxXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciByZWZyZXNoIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGxpc3QgZGF0YSBpcyByZWZyZXNoZWQsIGVpdGhlciB0aHJvdWdoIHB1bGwtdG8tcmVmcmVzaFxuICAgKiBvciBwcm9ncmFtbWF0aWMgcmVmcmVzaC4gVGhlIGV2ZW50IGluY2x1ZGVzIHRoZSByZWZyZXNoZWQgZGF0YSBhbmQgY29tcG9uZW50IGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRFbWl0dGVyPEJhc2VDdXN0b21FdmVudD59XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBAT3V0cHV0KClcbiAgcmVmcmVzaEV2ZW50OiBFdmVudEVtaXR0ZXI8QmFzZUN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QmFzZUN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZW1pdHRlciBmb3IgaXRlbSBjbGljayBpbnRlcmFjdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBsaXN0IGl0ZW0gaXMgY2xpY2tlZC4gVGhlIGV2ZW50IGluY2x1ZGVzIHRoZSBkYXRhXG4gICAqIG9mIHRoZSBjbGlja2VkIGl0ZW0sIGFsbG93aW5nIHBhcmVudCBjb21wb25lbnRzIHRvIHJlc3BvbmQgdG8gdGhlIGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRFbWl0dGVyPEtleVZhbHVlPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKVxuICBjbGlja0V2ZW50OiAgRXZlbnRFbWl0dGVyPExpc3RJdGVtQ3VzdG9tRXZlbnR8UmVuZGVyZXJDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPExpc3RJdGVtQ3VzdG9tRXZlbnR8UmVuZGVyZXJDdXN0b21FdmVudD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN1YmplY3QgZm9yIGRlYm91bmNpbmcgY2xpY2sgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBVc2VzIFJ4SlMgU3ViamVjdCB0byBjb2xsZWN0IGNsaWNrIGV2ZW50cyBhbmQgZW1pdCB0aGVtIGFmdGVyIGEgZGVib3VuY2VcbiAgICogcGVyaW9kLiBUaGlzIHByZXZlbnRzIG11bHRpcGxlIHJhcGlkIGNsaWNrcyBmcm9tIHRyaWdnZXJpbmcgbXVsdGlwbGUgZXZlbnRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7U3ViamVjdDxDdXN0b21FdmVudCB8IExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50Pn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgY2xpY2tJdGVtU3ViamVjdDogU3ViamVjdDxDdXN0b21FdmVudCB8IExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50PiA9IG5ldyBTdWJqZWN0PEN1c3RvbUV2ZW50IHwgTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQ+KCk7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN1YmplY3QgZm9yIGRlYm91bmNpbmcgcmVwb3NpdG9yeSBvYnNlcnZhdGlvbiBldmVudHMuXG4gICAqIEBzdW1tYXJ5IFJ4SlMgU3ViamVjdCB0aGF0IGNvbGxlY3RzIHJlcG9zaXRvcnkgY2hhbmdlIGV2ZW50cyBhbmQgZW1pdHMgdGhlbSBhZnRlclxuICAgKiBhIGRlYm91bmNlIHBlcmlvZC4gVGhpcyBwcmV2ZW50cyBtdWx0aXBsZSByYXBpZCByZXBvc2l0b3J5IGNoYW5nZXMgZnJvbSB0cmlnZ2VyaW5nXG4gICAqIG11bHRpcGxlIGxpc3QgcmVmcmVzaCBvcGVyYXRpb25zLCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UgYW5kIHVzZXIgZXhwZXJpZW5jZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1N1YmplY3Q8YW55Pn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgb2JzZXJ2ZXJTdWJqZXQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9ic2VydmVyIG9iamVjdCBmb3IgcmVwb3NpdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9ucy5cbiAgICogQHN1bW1hcnkgSW1wbGVtZW50cyB0aGUgT2JzZXJ2ZXIgaW50ZXJmYWNlIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucyB3aGVuIHRoZVxuICAgKiB1bmRlcmx5aW5nIGRhdGEgcmVwb3NpdG9yeSBjaGFuZ2VzLiBUaGlzIGVuYWJsZXMgYXV0b21hdGljIGxpc3QgdXBkYXRlcyB3aGVuXG4gICAqIGRhdGEgaXMgY3JlYXRlZCwgdXBkYXRlZCwgb3IgZGVsZXRlZCB0aHJvdWdoIHRoZSByZXBvc2l0b3J5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7T2JzZXJ2ZXJ9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIG9ic2VydmVyOiBPYnNlcnZlciA9IHsgcmVmcmVzaDogYXN5bmMgKC4uLiBhcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHZvaWQ+ID0+IHRoaXMub2JzZXJ2ZVJlcG9zaXRvcnkoLi4uYXJncyl9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0IG9mIGF2YWlsYWJsZSBpbmRleGVzIGZvciBkYXRhIHF1ZXJ5aW5nIGFuZCBmaWx0ZXJpbmcuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgbGlzdCBvZiBpbmRleCBuYW1lcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG9wdGltaXplIGRhdGEgcXVlcnlpbmcgYW5kIGZpbHRlcmluZ1xuICAgKiBvcGVyYXRpb25zLCBlc3BlY2lhbGx5IGluIHNjZW5hcmlvcyB3aXRoIGxhcmdlIGRhdGFzZXRzLlxuICAgKlxuICAgKiBJbmRleGVzIGNhbiBzaWduaWZpY2FudGx5IGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIGRhdGEgcmV0cmlldmFsIGJ5IGFsbG93aW5nIHRoZSBkYXRhYmFzZVxuICAgKiB0byBxdWlja2x5IGxvY2F0ZSBhbmQgcmV0cmlldmUgcmVsZXZhbnQgZGF0YSBiYXNlZCBvbiBpbmRleGVkIGZpZWxkcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ1tdfVxuICAgKiBAZGVmYXVsdCBbXVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgaW5kZXhlcyE6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIExpc3RDb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgTGlzdENvbXBvbmVudCBhbmQgc2V0cyB1cCB0aGUgYmFzZSBjb21wb25lbnQgd2l0aCB0aGUgYXBwcm9wcmlhdGVcbiAgICogY29tcG9uZW50IG5hbWUuIFRoaXMgY29uc3RydWN0b3IgaXMgY2FsbGVkIHdoZW4gQW5ndWxhciBpbnN0YW50aWF0ZXMgdGhlIGNvbXBvbmVudCBhbmRcbiAgICogYmVmb3JlIGFueSBpbnB1dCBwcm9wZXJ0aWVzIGFyZSBzZXQuIEl0IHBhc3NlcyB0aGUgY29tcG9uZW50IG5hbWUgdG8gdGhlIHBhcmVudCBjbGFzc1xuICAgKiBjb25zdHJ1Y3RvciB0byBlbmFibGUgcHJvcGVyIGxvY2FsaXphdGlvbiBhbmQgY29tcG9uZW50IGlkZW50aWZpY2F0aW9uLlxuICAgKlxuICAgKiBUaGUgY29uc3RydWN0b3IgaXMgaW50ZW50aW9uYWxseSBtaW5pbWFsLCB3aXRoIG1vc3QgaW5pdGlhbGl6YXRpb24gbG9naWMgZGVmZXJyZWQgdG9cbiAgICogdGhlIG5nT25Jbml0IGxpZmVjeWNsZSBob29rLiBUaGlzIGZvbGxvd3MgQW5ndWxhciBiZXN0IHByYWN0aWNlcyBieSBrZWVwaW5nIHRoZSBjb25zdHJ1Y3RvclxuICAgKiBmb2N1c2VkIG9uIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGFuZCBiYXNpYyBzZXR1cCwgd2hpbGUgY29tcGxleCBpbml0aWFsaXphdGlvbiB0aGF0IGRlcGVuZHNcbiAgICogb24gaW5wdXQgcHJvcGVydGllcyBpcyBoYW5kbGVkIGluIG5nT25Jbml0LlxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJMaXN0Q29tcG9uZW50XCIpO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgYWZ0ZXIgQW5ndWxhciBzZXRzIHRoZSBpbnB1dCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBjb21wb25lbnQgYnkgaW5pdGlhbGl6aW5nIGV2ZW50IHN1YnNjcmlwdGlvbnMsIHByb2Nlc3NpbmcgYm9vbGVhblxuICAgKiBpbnB1dHMsIGFuZCBsb2FkaW5nIHRoZSBpbml0aWFsIGRhdGEuIFRoaXMgbWV0aG9kIHByZXBhcmVzIHRoZSBjb21wb25lbnQgZm9yIHVzZXJcbiAgICogaW50ZXJhY3Rpb24gYnkgZW5zdXJpbmcgYWxsIHByb3BlcnRpZXMgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGFuZCBkYXRhIGlzIGxvYWRlZC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQW5ndWxhciBMaWZlY3ljbGVcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExpc3RDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIERhdGEgU291cmNlXG4gICAqXG4gICAqICAgQS0+Pkw6IG5nT25Jbml0KClcbiAgICogICBMLT4+TDogU2V0IHVwIGNsaWNrIGV2ZW50IGRlYm91bmNpbmdcbiAgICogICBMLT4+TDogUHJvY2VzcyBib29sZWFuIGlucHV0c1xuICAgKiAgIEwtPj5MOiBDb25maWd1cmUgY29tcG9uZW50IGJhc2VkIG9uIGlucHV0c1xuICAgKiAgIEwtPj5MOiByZWZyZXNoKClcbiAgICogICBMLT4+RDogUmVxdWVzdCBpbml0aWFsIGRhdGFcbiAgICogICBELS0+Pkw6IFJldHVybiBkYXRhXG4gICAqICAgTC0+Pkw6IFByb2Nlc3MgYW5kIGRpc3BsYXkgZGF0YVxuICAgKiAgIEwtPj5MOiBDb25maWd1cmUgZW1wdHkgc3RhdGUgaWYgbmVlZGVkXG4gICAqICAgTC0+Pkw6IGluaXRpYWxpemUoKVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbGlja0l0ZW1TdWJqZWN0LnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLnN1YnNjcmliZShldmVudCA9PiB0aGlzLmNsaWNrRXZlbnRFbWl0KGV2ZW50IGFzIExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50KSk7XG4gICAgdGhpcy5vYnNlcnZlclN1YmpldC5waXBlKGRlYm91bmNlVGltZSgxMDApKS5zdWJzY3JpYmUoYXJncyA9PiB0aGlzLmhhbmRsZU9ic2VydmVFdmVudChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKSk7XG4gICAgdGhpcy5lbmFibGVGaWx0ZXIgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5lbmFibGVGaWx0ZXIpO1xuICAgIHRoaXMubGltaXQgPSBOdW1iZXIodGhpcy5saW1pdCk7XG4gICAgdGhpcy5zdGFydCA9IE51bWJlcih0aGlzLnN0YXJ0KTtcbiAgICB0aGlzLmluc2V0ID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuaW5zZXQpO1xuICAgIHRoaXMuc2hvd1JlZnJlc2hlciA9IHN0cmluZ1RvQm9vbGVhbih0aGlzLnNob3dSZWZyZXNoZXIpO1xuICAgIHRoaXMubG9hZE1vcmVEYXRhID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMubG9hZE1vcmVEYXRhKTtcbiAgICB0aGlzLnNob3dTZWFyY2hiYXIgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5zaG93U2VhcmNoYmFyKTtcbiAgICB0aGlzLmRpc2FibGVTb3J0ID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuZGlzYWJsZVNvcnQpO1xuICAgIGlmKHR5cGVvZiB0aGlzLml0ZW0/LlsndGFnJ10gPT09ICdib29sZWFuJyAmJiB0aGlzLml0ZW0/LlsndGFnJ10gPT09IHRydWUpXG4gICAgICB0aGlzLml0ZW1bJ3RhZyddID0gQ29tcG9uZW50c1RhZ05hbWVzLkxJU1RfSVRFTSBhcyBzdHJpbmc7XG5cbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcblxuICAgIGlmKHRoaXMub3BlcmF0aW9ucy5pbmNsdWRlcyhPcGVyYXRpb25LZXlzLkNSRUFURSkgJiYgdGhpcy5yb3V0ZSlcbiAgICAgIHRoaXMuZW1wdHkubGluayA9IGAke3RoaXMucm91dGV9LyR7T3BlcmF0aW9uS2V5cy5DUkVBVEV9YDtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuXG4gICAgaWYodGhpcy5tb2RlbCBpbnN0YW5jZW9mIE1vZGVsICYmIHRoaXMuX3JlcG9zaXRvcnkpXG4gICAgICB0aGlzLl9yZXBvc2l0b3J5Lm9ic2VydmUodGhpcy5vYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsZWFucyB1cCByZXNvdXJjZXMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgY2xlYW51cCBvcGVyYXRpb25zIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIERPTS5cbiAgICogVGhpcyBpbmNsdWRlcyBjbGVhcmluZyByZWZlcmVuY2VzIHRvIG1vZGVscyBhbmQgZGF0YSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZih0aGlzLl9yZXBvc2l0b3J5KVxuICAgICAgdGhpcy5fcmVwb3NpdG9yeS51bk9ic2VydmUodGhpcy5vYnNlcnZlcik7XG4gICAgdGhpcy5kYXRhID0gIHRoaXMubW9kZWwgPSB0aGlzLl9yZXBvc2l0b3J5ID0gdGhpcy5wYWdpbmF0b3IgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcmVwb3NpdG9yeSBvYnNlcnZhdGlvbiBldmVudHMgd2l0aCBkZWJvdW5jaW5nLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgcmVwb3NpdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBhbmQgcm91dGVzIHRoZW0gYXBwcm9wcmlhdGVseS5cbiAgICogRm9yIENSRUFURSBldmVudHMgd2l0aCBhIFVJRCwgaGFuZGxlcyB0aGVtIGltbWVkaWF0ZWx5LiBGb3Igb3RoZXIgZXZlbnRzLFxuICAgKiBwYXNzZXMgdGhlbSB0byB0aGUgZGVib3VuY2VkIG9ic2VydmVyIHN1YmplY3QgdG8gcHJldmVudCBleGNlc3NpdmUgdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHsuLi51bmtub3duW119IGFyZ3MgLSBUaGUgcmVwb3NpdG9yeSBldmVudCBhcmd1bWVudHMgaW5jbHVkaW5nIHRhYmxlLCBldmVudCB0eXBlLCBhbmQgVUlEXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgb2JzZXJ2ZVJlcG9zaXRvcnkoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgW3RhYmxlLCBldmVudCwgdWlkXSA9IGFyZ3M7XG4gICAgaWYoZXZlbnQgPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFICYmICEhdWlkKVxuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlT2JzZXJ2ZUV2ZW50KHRhYmxlIGFzIHN0cmluZywgZXZlbnQsIHVpZCBhcyBzdHJpbmcgfCBudW1iZXIpO1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVyU3ViamV0Lm5leHQoYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgc3BlY2lmaWMgcmVwb3NpdG9yeSBldmVudHMgYW5kIHVwZGF0ZXMgdGhlIGxpc3QgYWNjb3JkaW5nbHkuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyByZXBvc2l0b3J5IGNoYW5nZSBldmVudHMgKENSRUFURSwgVVBEQVRFLCBERUxFVEUpIGFuZCBwZXJmb3Jtc1xuICAgKiB0aGUgYXBwcm9wcmlhdGUgbGlzdCBvcGVyYXRpb25zLiBUaGlzIGluY2x1ZGVzIGFkZGluZyBuZXcgaXRlbXMsIHVwZGF0aW5nIGV4aXN0aW5nXG4gICAqIG9uZXMsIG9yIHJlbW92aW5nIGRlbGV0ZWQgaXRlbXMgZnJvbSB0aGUgbGlzdCBkaXNwbGF5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvbW9kZWwgbmFtZSB0aGF0IGNoYW5nZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiAoQ1JFQVRFLCBVUERBVEUsIERFTEVURSlcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHVpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYWZmZWN0ZWQgaXRlbVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGhhbmRsZU9ic2VydmVFdmVudCh0YWJsZTogc3RyaW5nLCBldmVudDogT3BlcmF0aW9uS2V5cywgdWlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5DUkVBVEUpIHtcbiAgICAgIGlmKHVpZCkge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUNyZWF0ZSh1aWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5VUERBVEUpXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVXBkYXRlKHVpZCk7XG4gICAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5ERUxFVEUpXG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRlKHVpZCk7XG4gICAgICB0aGlzLnJlZnJlc2hFdmVudEVtaXQoKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gZm9yIHRyYWNraW5nIGl0ZW1zIGluIHRoZSBsaXN0LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHRyYWNraW5nIGZ1bmN0aW9uIGZvciB0aGUgYCpuZ0ZvcmAgZGlyZWN0aXZlIGluIHRoZSBjb21wb25lbnQgdGVtcGxhdGUuXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpZGVudGlmeSBhbmQgY29udHJvbCB0aGUgcmVuZGVyaW5nIG9mIGl0ZW1zIGluIHRoZSBsaXN0LFxuICAgKiBwcmV2ZW50aW5nIGR1cGxpY2F0ZSBvciB1bm5lY2Vzc2FyeSByZW5kZXJpbmcuXG4gICAqXG4gICAqIFRoZSBgdHJhY2tJdGVtRm5gIGZ1bmN0aW9uIHRha2VzIHR3byBwYXJhbWV0ZXJzOiBgaW5kZXhgICh0aGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlIGxpc3QpXG4gICAqIGFuZCBgaXRlbWAgKHRoZSBhY3R1YWwgaXRlbSBmcm9tIHRoZSBsaXN0KS4gSXQgcmV0dXJucyB0aGUgdHJhY2tpbmcga2V5LCB3aGljaCBpbiB0aGlzIGNhc2VcbiAgICogaXMgdGhlIHVuaW9uIG9mIHRoZSBgdWlkYCBvZiB0aGUgaXRlbSB3aXRoIHRoZSBtb2RlbCBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlIGxpc3QuXG5cbiAgICogQHBhcmFtIHtLZXlWYWx1ZSB8IHN0cmluZyB8IG51bWJlcn0gaXRlbSAtIFRoZSBhY3R1YWwgaXRlbSBmcm9tIHRoZSBsaXN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVtYmVyfSBUaGUgdHJhY2tpbmcga2V5IGZvciB0aGUgaXRlbS5cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIG92ZXJyaWRlIHRyYWNrSXRlbUZuKGluZGV4OiBudW1iZXIsIGl0ZW06IEtleVZhbHVlIHwgc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gYCR7IChpdGVtIGFzIEtleVZhbHVlKT8uWyd1aWQnXSB8fCAoaXRlbSBhcyBLZXlWYWx1ZSk/Llt0aGlzLnBrXX0tJHtpbmRleH1gO1xuICB9XG5cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50IGZyb20gdGhlIHJlcG9zaXRvcnkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB1aWQgLSBUaGUgSUQgb2YgdGhlIGl0ZW0gdG8gY3JlYXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaXRlbSBpcyBjcmVhdGVkIGFuZCBhZGRlZCB0byB0aGUgbGlzdC5cbiAgICovXG4gIGFzeW5jIGhhbmRsZUNyZWF0ZSh1aWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX3JlcG9zaXRvcnk/LnJlYWQodWlkKTtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5tYXBSZXN1bHRzKFtyZXN1bHQgYXMgS2V5VmFsdWVdKVswXTtcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhID0gW2l0ZW0sIC4uLnRoaXMuaXRlbXMgfHwgW11dO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgdGhlIHVwZGF0ZSBldmVudCBmcm9tIHRoZSByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIHRoZSBsaXN0IGl0ZW0gd2l0aCB0aGUgc3BlY2lmaWVkIElEIGJhc2VkIG9uIHRoZSBuZXcgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHVpZCAtIFRoZSBJRCBvZiB0aGUgaXRlbSB0byB1cGRhdGVcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBhc3luYyBoYW5kbGVVcGRhdGUodWlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpdGVtOiBLZXlWYWx1ZSA9IHRoaXMuaXRlbU1hcHBlcihhd2FpdCB0aGlzLl9yZXBvc2l0b3J5Py5yZWFkKHVpZCkgfHwge30sIHRoaXMubWFwcGVyKTtcbiAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICBmb3IoY29uc3Qga2V5IGluIHRoaXMuaXRlbXMgYXMgS2V5VmFsdWVbXSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMuaXRlbXNba2V5XSBhcyBLZXlWYWx1ZTtcbiAgICAgICAgaWYoY2hpbGRbJ3VpZCddID09PSBpdGVtWyd1aWQnXSkge1xuICAgICAgICAgIHRoaXMuaXRlbXNba2V5XSA9IE9iamVjdC5hc3NpZ24oe30sIGNoaWxkLCBpdGVtKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YSA9IFsgLi4udGhpcy5pdGVtc107XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBsaXN0IGJ5IElELlxuICAgKiBAc3VtbWFyeSBGaWx0ZXJzIG91dCBhbiBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBJRCBmcm9tIHRoZSBkYXRhIGFycmF5IGFuZFxuICAgKiByZWZyZXNoZXMgdGhlIGxpc3QgZGlzcGxheS4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBhZnRlciBhIGRlbGV0ZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1aWQgLSBUaGUgSUQgb2YgdGhlIGl0ZW0gdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwayAtIFRoZSBwcmltYXJ5IGtleSBmaWVsZCBuYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlRGVsZXRlKHVpZDogc3RyaW5nIHwgbnVtYmVyLCBwaz86IHN0cmluZyk6IHZvaWQgIHtcbiAgICBpZighcGspXG4gICAgICBwayA9IHRoaXMucGs7XG4gICAgdGhpcy5pdGVtcyA9IHRoaXMuZGF0YT8uZmlsdGVyKChpdGVtOiBLZXlWYWx1ZSkgPT4gaXRlbVsndWlkJ10gIT09IHVpZCkgfHwgW107XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBjbGljayBldmVudHMgZnJvbSBsaXN0IGl0ZW1zLlxuICAgKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBnbG9iYWwgTGlzdEl0ZW1DbGlja0V2ZW50IGV2ZW50cyBhbmQgcGFzc2VzIHRoZW0gdG8gdGhlXG4gICAqIGRlYm91bmNlZCBjbGljayBzdWJqZWN0LiBUaGlzIGFsbG93cyB0aGUgY29tcG9uZW50IHRvIHJlc3BvbmQgdG8gY2xpY2tzIG9uXG4gICAqIGxpc3QgaXRlbXMgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGV5IG9yaWdpbmF0ZSBmcm9tLlxuICAgKlxuICAgKiBAcGFyYW0ge0xpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50fSBldmVudCAtIFRoZSBjbGljayBldmVudFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpMaXN0SXRlbUNsaWNrRXZlbnQnLCBbJyRldmVudCddKVxuICBoYW5kbGVDbGljayhldmVudDogTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrSXRlbVN1YmplY3QubmV4dChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgc2VhcmNoIGV2ZW50cyBmcm9tIHRoZSBzZWFyY2ggYmFyLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgc2VhcmNoIHF1ZXJpZXMgZnJvbSB0aGUgc2VhcmNoIGJhciBjb21wb25lbnQsIHVwZGF0aW5nIHRoZVxuICAgKiBkaXNwbGF5ZWQgZGF0YSBiYXNlZCBvbiB0aGUgc2VhcmNoIHRlcm0uIFRoZSBiZWhhdmlvciBkaWZmZXJzIGJldHdlZW4gaW5maW5pdGVcbiAgICogYW5kIHBhZ2luYXRlZCBtb2RlcyB0byBwcm92aWRlIHRoZSBiZXN0IHVzZXIgZXhwZXJpZW5jZSBmb3IgZWFjaCBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gdmFsdWUgLSBUaGUgc2VhcmNoIHRlcm0gb3IgdW5kZWZpbmVkIHRvIGNsZWFyIHNlYXJjaFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogZmxvd2NoYXJ0IFREXG4gICAqICAgQVtTZWFyY2ggRXZlbnRdIC0tPiBCe1R5cGUgaXMgSW5maW5pdGU/fVxuICAgKiAgIEIgLS0+fFllc3wgQ1tEaXNhYmxlIGxvYWRNb3JlRGF0YV1cbiAgICogICBCIC0tPnxOb3wgRFtFbmFibGUgbG9hZE1vcmVEYXRhXVxuICAgKiAgIEMgLS0+IEV7U2VhcmNoIHZhbHVlIHVuZGVmaW5lZD99XG4gICAqICAgRSAtLT58WWVzfCBGW0VuYWJsZSBsb2FkTW9yZURhdGFdXG4gICAqICAgRSAtLT58Tm98IEdbU3RvcmUgc2VhcmNoIHZhbHVlXVxuICAgKiAgIEQgLS0+IEdcbiAgICogICBGIC0tPiBIW1Jlc2V0IHBhZ2UgdG8gMV1cbiAgICogICBHIC0tPiBJW1JlZnJlc2ggZGF0YV1cbiAgICogICBIIC0tPiBJXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2VhcmNoYmFyRXZlbnQnLCBbJyRldmVudCddKVxuICBhc3luYyBoYW5kbGVTZWFyY2godmFsdWU6IHN0cmluZyB8IElGaWx0ZXJRdWVyeSB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmKHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURSkge1xuICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IHRydWU7XG4gICAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgICBpZih2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICB0aGlzLnBhZ2UgPSB0aGlzLmxhc3RQYWdlO1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGZpbHRlciBldmVudHMgZnJvbSB0aGUgZmlsdGVyIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGZpbHRlciBxdWVyaWVzIGZyb20gdGhlIGZpbHRlciBjb21wb25lbnQgYW5kIGFwcGxpZXMgdGhlbVxuICAgKiB0byB0aGUgbGlzdCBkYXRhLiBUaGlzIG1ldGhvZCBhY3RzIGFzIGEgYnJpZGdlIGJldHdlZW4gdGhlIGZpbHRlciBjb21wb25lbnRcbiAgICogYW5kIHRoZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSwgY29udmVydGluZyBmaWx0ZXIgcXVlcmllcyBpbnRvIHNlYXJjaCBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0lGaWx0ZXJRdWVyeSB8IHVuZGVmaW5lZH0gdmFsdWUgLSBUaGUgZmlsdGVyIHF1ZXJ5IG9iamVjdCBvciB1bmRlZmluZWQgdG8gY2xlYXIgZmlsdGVyc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGhhbmRsZUZpbHRlcih2YWx1ZTogSUZpbHRlclF1ZXJ5IHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVTZWFyY2godmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbGVhcnMgdGhlIGN1cnJlbnQgc2VhcmNoIGFuZCByZXNldHMgdGhlIGxpc3QuXG4gICAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNsZWFycyB0aGUgc2VhcmNoIGJ5IGNhbGxpbmcgaGFuZGxlU2VhcmNoXG4gICAqIHdpdGggdW5kZWZpbmVkLiBUaGlzIHJlc2V0cyB0aGUgbGlzdCB0byBzaG93IGFsbCBkYXRhIHdpdGhvdXQgZmlsdGVyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGNsZWFyU2VhcmNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuaGFuZGxlU2VhcmNoKHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVtaXRzIGEgcmVmcmVzaCBldmVudCB3aXRoIHRoZSBjdXJyZW50IGRhdGEuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYW5kIGVtaXRzIGEgcmVmcmVzaCBldmVudCBjb250YWluaW5nIHRoZSBjdXJyZW50IGxpc3QgZGF0YS5cbiAgICogVGhpcyBub3RpZmllcyBwYXJlbnQgY29tcG9uZW50cyB0aGF0IHRoZSBsaXN0IGRhdGEgaGFzIGJlZW4gcmVmcmVzaGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0tleVZhbHVlW119IFtkYXRhXSAtIE9wdGlvbmFsIGRhdGEgdG8gaW5jbHVkZSBpbiB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICByZWZyZXNoRXZlbnRFbWl0KGRhdGE/OiBLZXlWYWx1ZVtdKTogdm9pZCB7XG4gICAgaWYoIWRhdGEpXG4gICAgICBkYXRhID0gdGhpcy5pdGVtcztcbiAgICB0aGlzLnNrZWxldG9uRGF0YSA9IG5ldyBBcnJheShkYXRhPy5sZW5ndGggfHwgMik7XG4gICAgdGhpcy5yZWZyZXNoRXZlbnQuZW1pdCh7XG4gICAgICBuYW1lOiBFdmVudENvbnN0YW50cy5SRUZSRVNILFxuICAgICAgZGF0YTogZGF0YSB8fCBbXSxcbiAgICAgIGNvbXBvbmVudDogdGhpcy5jb21wb25lbnROYW1lXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVtaXRzIGEgY2xpY2sgZXZlbnQgZm9yIGEgbGlzdCBpdGVtLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgYW5kIGVtaXRzIGEgY2xpY2sgZXZlbnQgd2hlbiBhIGxpc3QgaXRlbSBpcyBjbGlja2VkLlxuICAgKiBUaGlzIGV4dHJhY3RzIHRoZSByZWxldmFudCBkYXRhIGZyb20gdGhlIGV2ZW50IGFuZCBwYXNzZXMgaXQgdG8gcGFyZW50IGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7TGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnR9IGV2ZW50IC0gVGhlIGNsaWNrIGV2ZW50XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBjbGlja0V2ZW50RW1pdChldmVudDogTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZnJlc2hlcyB0aGUgbGlzdCBkYXRhIGZyb20gdGhlIGNvbmZpZ3VyZWQgc291cmNlLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBoYW5kbGVzIGJvdGggaW5pdGlhbCBkYXRhIGxvYWRpbmcgYW5kIHN1YnNlcXVlbnQgcmVmcmVzaCBvcGVyYXRpb25zLFxuICAgKiBpbmNsdWRpbmcgcHVsbC10by1yZWZyZXNoIGFuZCBpbmZpbml0ZSBzY3JvbGxpbmcuIEl0IG1hbmFnZXMgdGhlIGRhdGEgZmV0Y2hpbmcgcHJvY2VzcyxcbiAgICogdXBkYXRlcyB0aGUgY29tcG9uZW50J3Mgc3RhdGUsIGFuZCBoYW5kbGVzIHBhZ2luYXRpb24gb3IgaW5maW5pdGUgc2Nyb2xsaW5nIGxvZ2ljIGJhc2VkXG4gICAqIG9uIHRoZSBjb21wb25lbnQncyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBUaGUgbWV0aG9kIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gICAqIDEuIFNldHMgdGhlIHJlZnJlc2hpbmcgZmxhZyB0byBpbmRpY2F0ZSBhIGRhdGEgZmV0Y2ggaXMgaW4gcHJvZ3Jlc3NcbiAgICogMi4gQ2FsY3VsYXRlcyB0aGUgYXBwcm9wcmlhdGUgc3RhcnQgYW5kIGxpbWl0IHZhbHVlcyBiYXNlZCBvbiBwYWdpbmF0aW9uIHNldHRpbmdzXG4gICAqIDMuIEZldGNoZXMgZGF0YSBmcm9tIHRoZSBhcHByb3ByaWF0ZSBzb3VyY2UgKG1vZGVsIG9yIHJlcXVlc3QpXG4gICAqIDQuIFVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzIGRhdGEgYW5kIGVtaXRzIGEgcmVmcmVzaCBldmVudFxuICAgKiA1LiBIYW5kbGVzIHBhZ2luYXRpb24gb3IgaW5maW5pdGUgc2Nyb2xsaW5nIHN0YXRlIHVwZGF0ZXNcbiAgICogNi4gQ29tcGxldGVzIGFueSBwcm92aWRlZCBldmVudCAobGlrZSBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50KVxuICAgKlxuICAgKiBAcGFyYW0ge0luZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfCBSZWZyZXNoZXJDdXN0b21FdmVudCB8IGJvb2xlYW59IGV2ZW50IC0gVGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSByZWZyZXNoLFxuICAgKiBvciBhIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgaXMgYSBmb3JjZWQgcmVmcmVzaFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVmcmVzaCBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBMaXN0Q29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBEYXRhIFNvdXJjZVxuICAgKiAgIHBhcnRpY2lwYW50IEUgYXMgRXZlbnQgU3lzdGVtXG4gICAqXG4gICAqICAgTC0+Pkw6IHJlZnJlc2goZXZlbnQpXG4gICAqICAgTC0+Pkw6IFNldCByZWZyZXNoaW5nIGZsYWdcbiAgICogICBMLT4+TDogQ2FsY3VsYXRlIHN0YXJ0IGFuZCBsaW1pdFxuICAgKiAgIGFsdCBVc2luZyBtb2RlbFxuICAgKiAgICAgTC0+PkQ6IGdldEZyb21Nb2RlbChmb3JjZSwgc3RhcnQsIGxpbWl0KVxuICAgKiAgICAgRC0tPj5MOiBSZXR1cm4gZGF0YVxuICAgKiAgIGVsc2UgVXNpbmcgcmVxdWVzdFxuICAgKiAgICAgTC0+PkQ6IGdldEZyb21SZXF1ZXN0KGZvcmNlLCBzdGFydCwgbGltaXQpXG4gICAqICAgICBELS0+Pkw6IFJldHVybiBkYXRhXG4gICAqICAgZW5kXG4gICAqICAgTC0+PkU6IHJlZnJlc2hFdmVudEVtaXQoKVxuICAgKiAgIGFsdCBJbmZpbml0ZSBzY3JvbGxpbmcgbW9kZVxuICAgKiAgICAgTC0+Pkw6IENoZWNrIGlmIHJlYWNoZWQgbGFzdCBwYWdlXG4gICAqICAgICBhbHQgTGFzdCBwYWdlIHJlYWNoZWRcbiAgICogICAgICAgTC0+Pkw6IENvbXBsZXRlIHNjcm9sbCBldmVudFxuICAgKiAgICAgICBMLT4+TDogRGlzYWJsZSBsb2FkTW9yZURhdGFcbiAgICogICAgIGVsc2UgTW9yZSBwYWdlcyBhdmFpbGFibGVcbiAgICogICAgICAgTC0+Pkw6IEluY3JlbWVudCBwYWdlIG51bWJlclxuICAgKiAgICAgICBMLT4+TDogQ29tcGxldGUgc2Nyb2xsIGV2ZW50IGFmdGVyIGRlbGF5XG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIFBhZ2luYXRlZCBtb2RlXG4gICAqICAgICBMLT4+TDogQ2xlYXIgcmVmcmVzaGluZyBmbGFnIGFmdGVyIGRlbGF5XG4gICAqICAgZW5kXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6QmFja0J1dHRvbk5hdmlnYXRpb25FbmRFdmVudCcsIFsnJGV2ZW50J10pXG4gIGFzeW5jIHJlZnJlc2goZXZlbnQ6IEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfCBSZWZyZXNoZXJDdXN0b21FdmVudCB8IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vICBpZih0eXBlb2YgZm9yY2UgIT09ICdib29sZWFuJyAmJiBmb3JjZS50eXBlID09PSBFdmVudENvbnN0YW50cy5CQUNLX0JVVFRPTl9OQVZJR0FUSU9OKSB7XG4gICAgLy8gICAgY29uc3Qge3JlZnJlc2h9ID0gKGZvcmNlIGFzIEN1c3RvbUV2ZW50KS5kZXRhaWw7XG4gICAgLy8gICAgaWYoIXJlZnJlc2gpXG4gICAgLy8gICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gIH1cblxuICAgIHRoaXMucmVmcmVzaGluZyA9IHRydWU7XG4gICAgY29uc3Qgc3RhcnQ6IG51bWJlciA9IHRoaXMucGFnZSA+IDEgPyAodGhpcy5wYWdlIC0gMSkgKiB0aGlzLmxpbWl0IDogdGhpcy5zdGFydDtcbiAgICBjb25zdCBsaW1pdDogbnVtYmVyID0gKHRoaXMucGFnZSAqICh0aGlzLmxpbWl0ID4gMTIgPyAxMiA6IHRoaXMubGltaXQpKTtcblxuICAgIHRoaXMuZGF0YSA9ICF0aGlzLm1vZGVsID9cbiAgICAgIGF3YWl0IHRoaXMuZ2V0RnJvbVJlcXVlc3QoISFldmVudCwgc3RhcnQsIGxpbWl0KVxuICAgICAgOiBhd2FpdCB0aGlzLmdldEZyb21Nb2RlbCghIWV2ZW50KSBhcyBLZXlWYWx1ZVtdO1xuXG4gICAgdGhpcy5yZWZyZXNoRXZlbnRFbWl0KCk7XG5cbiAgICBpZih0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEUpIHtcbiAgICAgIGlmKHRoaXMucGFnZSA9PT0gdGhpcy5wYWdlcykge1xuICAgICAgICBpZigoZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCk/LnRhcmdldClcbiAgICAgICAgICAoZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCkudGFyZ2V0LmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhZ2UgKz0gMTtcbiAgICAgICAgdGhpcy5yZWZyZXNoaW5nID0gZmFsc2U7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYoKGV2ZW50IGFzIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQpPy50YXJnZXQgJiYgKGV2ZW50IGFzIEN1c3RvbUV2ZW50KT8udHlwZSAhPT0gRXZlbnRDb25zdGFudHMuQkFDS19CVVRUT05fTkFWSUdBVElPTilcbiAgICAgICAgICAgICAgKGV2ZW50IGFzIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQpLnRhcmdldC5jb21wbGV0ZSgpO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWZyZXNoaW5nID0gZmFsc2U7XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBwYWdpbmF0aW9uIGV2ZW50cyBmcm9tIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudC5cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBwYWdpbmF0aW9uIGV2ZW50cyBieSB1cGRhdGluZyB0aGUgY3VycmVudCBwYWdlIG51bWJlciBhbmRcbiAqIHJlZnJlc2hpbmcgdGhlIGxpc3QgZGF0YSB0byBkaXNwbGF5IHRoZSBzZWxlY3RlZCBwYWdlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWRcbiAqIHdoZW4gYSB1c2VyIGludGVyYWN0cyB3aXRoIHRoZSBwYWdpbmF0aW9uIGNvbnRyb2xzIHRvIG5hdmlnYXRlIGJldHdlZW4gcGFnZXMuXG4gKlxuICogQHBhcmFtIHtQYWdpbmF0aW9uQ3VzdG9tRXZlbnR9IGV2ZW50IC0gVGhlIHBhZ2luYXRpb24gZXZlbnQgY29udGFpbmluZyBwYWdlIGluZm9ybWF0aW9uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5oYW5kbGVQYWdpbmF0ZShldmVudDogUGFnaW5hdGlvbkN1c3RvbUV2ZW50KTogdm9pZCB7XG4gIGNvbnN0IHsgcGFnZX0gPSBldmVudC5kYXRhO1xuICB0aGlzLnBhZ2UgPSBwYWdlO1xuICB0aGlzLnJlZnJlc2godHJ1ZSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcHVsbC10by1yZWZyZXNoIGV2ZW50cyBmcm9tIHRoZSByZWZyZXNoZXIgY29tcG9uZW50LlxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIHJlZnJlc2ggZXZlbnRzIHRyaWdnZXJlZCBieSB0aGUgdXNlciBwdWxsaW5nIGRvd24gb24gdGhlIGxpc3RcbiAqIG9yIGJ5IHByb2dyYW1tYXRpYyByZWZyZXNoIHJlcXVlc3RzLiBUaGlzIG1ldGhvZCByZWZyZXNoZXMgdGhlIGxpc3QgZGF0YSBhbmRcbiAqIGNvbXBsZXRlcyB0aGUgcmVmcmVzaGVyIGFuaW1hdGlvbiB3aGVuIHRoZSBkYXRhIGlzIGxvYWRlZC5cbiAqXG4gKiBAcGFyYW0ge0luZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfCBDdXN0b21FdmVudH0gW2V2ZW50XSAtIFRoZSByZWZyZXNoIGV2ZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVmcmVzaCBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5hc3luYyBoYW5kbGVSZWZyZXNoKGV2ZW50PzogSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCB8IEN1c3RvbUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHRoaXMucmVmcmVzaChldmVudCBhcyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50IHx8IHRydWUpO1xuICBpZihldmVudCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gQW55IGNhbGxzIHRvIGxvYWQgZGF0YSBnbyBoZXJlXG4gICAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJb25SZWZyZXNoZXJFbGVtZW50KS5jb21wbGV0ZSgpO1xuICAgIH0sIDQwMCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZpbHRlcnMgZGF0YSBiYXNlZCBvbiBhIHNlYXJjaCBzdHJpbmcuXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgdGhlIGN1cnJlbnQgZGF0YSBhcnJheSB0byBmaW5kIGl0ZW1zIHRoYXQgbWF0Y2ggdGhlIHByb3ZpZGVkXG4gKiBzZWFyY2ggc3RyaW5nLiBUaGlzIHVzZXMgdGhlIGFycmF5UXVlcnlCeVN0cmluZyB1dGlsaXR5IHRvIHBlcmZvcm0gdGhlIGZpbHRlcmluZ1xuICogYWNyb3NzIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBpdGVtcy5cbiAqXG4gKiBAcGFyYW0ge0tleVZhbHVlW119IHJlc3VsdHMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gc2VhcmNoIHRocm91Z2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWFyY2ggLSBUaGUgc2VhcmNoIHN0cmluZyB0byBmaWx0ZXIgYnlcbiAqIEByZXR1cm5zIHtLZXlWYWx1ZVtdfSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZmlsdGVyZWQgYXJyYXkgb2YgaXRlbXNcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG4gIHBhcnNlU2VhcmNoUmVzdWx0cyhyZXN1bHRzOiBLZXlWYWx1ZVtdLCBzZWFyY2g6IHN0cmluZyk6IEtleVZhbHVlW10ge1xuICAgIHJldHVybiByZXN1bHRzLmZpbHRlcigoaXRlbTogS2V5VmFsdWUpID0+XG4gICAgICBPYmplY3QudmFsdWVzKGl0ZW0pLnNvbWUodmFsdWUgPT5cbiAgICAgICAgICB2YWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoKHNlYXJjaCBhcyBzdHJpbmcpPy50b0xvd2VyQ2FzZSgpKVxuICAgICAgICApXG4gICAgKTtcbiAgfVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGZXRjaGVzIGRhdGEgZnJvbSBhIHJlcXVlc3Qgc291cmNlLlxuICogQHN1bW1hcnkgUmV0cmlldmVzIGRhdGEgZnJvbSB0aGUgY29uZmlndXJlZCBzb3VyY2UgZnVuY3Rpb24gb3IgVVJMLCBwcm9jZXNzZXMgaXQsXG4gKiBhbmQgdXBkYXRlcyB0aGUgY29tcG9uZW50J3MgZGF0YSBzdGF0ZS4gVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIGluaXRpYWwgZGF0YSBsb2FkaW5nXG4gKiBhbmQgc3Vic2VxdWVudCByZWZyZXNoIG9wZXJhdGlvbnMgd2hlbiB1c2luZyBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZSByYXRoZXIgdGhhbiBhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgLSBXaGV0aGVyIHRvIGZvcmNlIGEgcmVmcmVzaCBldmVuIGlmIGRhdGEgYWxyZWFkeSBleGlzdHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIFRoZSBzdGFydGluZyBpbmRleCBmb3IgcGFnaW5hdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHJpZXZlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxLZXlWYWx1ZVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZldGNoZWQgZGF0YVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbmFzeW5jIGdldEZyb21SZXF1ZXN0KGZvcmNlOiBib29sZWFuID0gZmFsc2UsIHN0YXJ0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBQcm9taXNlPEtleVZhbHVlW10+IHtcbiAgbGV0IHJlcXVlc3Q6IEtleVZhbHVlW10gPSBbXTtcbiAgaWYoIXRoaXMuZGF0YT8ubGVuZ3RoIHx8IGZvcmNlIHx8ICh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCB8fCAhISh0aGlzLnNlYXJjaFZhbHVlIGFzIElGaWx0ZXJRdWVyeSkpIHtcbiAgICAvLyAoc2VsZi5kYXRhIGFzIExpc3RJdGVtW10pID0gW107XG4gICAgaWYoISh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCAmJiAhKHRoaXMuc2VhcmNoVmFsdWUgYXMgSUZpbHRlclF1ZXJ5KSkge1xuICAgICAgaWYoIXRoaXMuc291cmNlICYmICF0aGlzLmRhdGE/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdObyBkYXRhIGFuZCBzb3VyY2UgcGFzc2VkIHRvIGluZmluaXRlIGxpc3QnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBpZih0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxuICAgICAgICByZXF1ZXN0ID0gYXdhaXQgdGhpcy5zb3VyY2UoKTtcblxuICAgICAgaWYoIUFycmF5LmlzQXJyYXkocmVxdWVzdCkpXG4gICAgICAgIHJlcXVlc3QgPSByZXF1ZXN0Py5bJ3Jlc3BvbnNlJ10/LlsnZGF0YSddIHx8IHJlcXVlc3Q/LlsncmVzdWx0cyddIHx8IFtdO1xuICAgICAgdGhpcy5kYXRhID0gWy4uLiBhd2FpdCB0aGlzLnBhcnNlUmVzdWx0KHJlcXVlc3QpXTtcbiAgICAgIGlmKHRoaXMuZGF0YT8ubGVuZ3RoKVxuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFID9cbiAgICAgICAgICAodGhpcy5pdGVtcyB8fCBbXSkuY29uY2F0KFsuLi50aGlzLmRhdGEuc2xpY2Uoc3RhcnQsIGxpbWl0KV0pIDogWy4uLnJlcXVlc3Quc2xpY2Uoc3RhcnQsIGxpbWl0KSBhcyBLZXlWYWx1ZVtdXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID0gdGhpcy5wYXJzZVNlYXJjaFJlc3VsdHModGhpcy5kYXRhIGFzIFtdLCB0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk7XG4gICAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhO1xuICAgIH1cbiAgfVxuXG4gIGlmKHRoaXMubG9hZE1vcmVEYXRhICYmIHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5QQUdJTkFURUQpXG4gICAgdGhpcy5nZXRNb3JlRGF0YSh0aGlzLmRhdGE/Lmxlbmd0aCB8fCAwKTtcbiAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXSBhcyBLZXlWYWx1ZVtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGZXRjaGVzIGRhdGEgZnJvbSBhIG1vZGVsIHNvdXJjZS5cbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyBkYXRhIGZyb20gdGhlIGNvbmZpZ3VyZWQgbW9kZWwgdXNpbmcgaXRzIHBhZ2luYXRpb24gb3IgZmluZCBtZXRob2RzLFxuICogcHJvY2Vzc2VzIGl0LCBhbmQgdXBkYXRlcyB0aGUgY29tcG9uZW50J3MgZGF0YSBzdGF0ZS4gVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIGluaXRpYWxcbiAqIGRhdGEgbG9hZGluZyBhbmQgc3Vic2VxdWVudCByZWZyZXNoIG9wZXJhdGlvbnMgd2hlbiB1c2luZyBhIG1vZGVsIGFzIHRoZSBkYXRhIHNvdXJjZS5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlIC0gV2hldGhlciB0byBmb3JjZSBhIHJlZnJlc2ggZXZlbiBpZiBkYXRhIGFscmVhZHkgZXhpc3RzXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBUaGUgc3RhcnRpbmcgaW5kZXggZm9yIHBhZ2luYXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byByZXRyaWV2ZVxuICogQHJldHVybnMge1Byb21pc2U8S2V5VmFsdWVbXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmZXRjaGVkIGRhdGFcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5hc3luYyBnZXRGcm9tTW9kZWwoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8S2V5VmFsdWVbXT4ge1xuICBsZXQgZGF0YSA9IFsgLi4uIHRoaXMuZGF0YSB8fCBbXV07XG4gIGxldCByZXF1ZXN0OiBLZXlWYWx1ZVtdID0gW107XG5cbiAgLy8gZ2V0dGluZyBtb2RlbCByZXBvc2l0b3J5XG4gIGlmKCF0aGlzLl9yZXBvc2l0b3J5KVxuICAgIHRoaXMuX3JlcG9zaXRvcnkgPSB0aGlzLnJlcG9zaXRvcnk7XG4gIGNvbnN0IHJlcG8gPSB0aGlzLl9yZXBvc2l0b3J5IGFzIERlY2FmUmVwb3NpdG9yeTxNb2RlbD47XG4gIGlmKCF0aGlzLmRhdGE/Lmxlbmd0aCB8fCBmb3JjZSB8fCAodGhpcy5zZWFyY2hWYWx1ZSBhcyBzdHJpbmcpPy5sZW5ndGggfHwgISEodGhpcy5zZWFyY2hWYWx1ZSBhcyBJRmlsdGVyUXVlcnkpKSB7XG4gICAgdHJ5IHtcbiAgICAgaWYoISh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCAmJiAhKHRoaXMuc2VhcmNoVmFsdWUgYXMgSUZpbHRlclF1ZXJ5KSkge1xuICAgICAgICAodGhpcy5kYXRhIGFzIEtleVZhbHVlW10pID0gW107XG4gICAgICAgIC8vIGNvbnN0IHJhd1F1ZXJ5ID0gdGhpcy5wYXJzZVF1ZXJ5KHNlbGYubW9kZWwgYXMgUmVwb3NpdG9yeTxNb2RlbD4sIHN0YXJ0LCBsaW1pdCk7XG4gICAgICAgIC8vIHJlcXVlc3QgPSB0aGlzLnBhcnNlUmVzdWx0KGF3YWl0ICh0aGlzLm1vZGVsIGFzIGFueSk/LnBhZ2luYXRlKHN0YXJ0LCBsaW1pdCkpO1xuICAgICAgICAgIGlmKCF0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IgPSBhd2FpdCByZXBvXG4gICAgICAgICAgICAgIC5zZWxlY3QoKVxuICAgICAgICAgICAgICAub3JkZXJCeShbdGhpcy5wayBhcyBrZXlvZiBNb2RlbCwgdGhpcy5zb3J0RGlyZWN0aW9uXSlcbiAgICAgICAgICAgICAgLnBhZ2luYXRlKHRoaXMubGltaXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXF1ZXN0ID0gYXdhaXQgdGhpcy5wYXJzZVJlc3VsdCh0aGlzLnBhZ2luYXRvcik7XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmKCF0aGlzLmluZGV4ZXMpXG4gICAgICAgICAgdGhpcy5pbmRleGVzID0gKE9iamVjdC52YWx1ZXModGhpcy5tYXBwZXIpIHx8IFt0aGlzLnBrXSk7XG5cbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gdGhpcy5wYXJzZUNvbmRpdGlvbnModGhpcy5zZWFyY2hWYWx1ZSBhcyBzdHJpbmcgfCBudW1iZXIgfCBJRmlsdGVyUXVlcnkpO1xuICAgICAgICByZXF1ZXN0ID0gYXdhaXQgdGhpcy5wYXJzZVJlc3VsdChhd2FpdCByZXBvLnF1ZXJ5KGNvbmRpdGlvbiwgKHRoaXMuc29ydEJ5IHx8IHRoaXMucGspIGFzIGtleW9mIE1vZGVsLCB0aGlzLnNvcnREaXJlY3Rpb24pKTtcbiAgICAgICAgZGF0YSA9IFtdO1xuICAgICAgfVxuICAgICAgZGF0YSA9IHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURSA/IFsuLi4gKGRhdGEpLmNvbmNhdChyZXF1ZXN0KV0gOiBbLi4ucmVxdWVzdF07XG4gICAgfSBjYXRjaChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKGVycm9yIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBgVW5hYmxlIHRvIGZpbmQgJHt0aGlzLm1vZGVsfSBvbiByZWdpc3RyeS4gUmV0dXJuIGVtcHR5IGFycmF5IGZyb20gY29tcG9uZW50YCk7XG4gICAgfVxuICB9XG5cbiAgaWYoZGF0YT8ubGVuZ3RoKSB7XG4gICAgaWYodGhpcy5zZWFyY2hWYWx1ZSkge1xuICAgICAgdGhpcy5pdGVtcyA9IFsuLi5kYXRhXTtcbiAgICAgIGlmKHRoaXMuaXRlbXM/Lmxlbmd0aCA8PSB0aGlzLmxpbWl0KVxuICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLml0ZW1zID0gWy4uLmRhdGFdO1xuICAgIH1cbiAgfVxuICBpZih0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuUEFHSU5BVEVEICYmIHRoaXMucGFnaW5hdG9yKVxuICAgICAgdGhpcy5nZXRNb3JlRGF0YSh0aGlzLnBhZ2luYXRvci50b3RhbCk7XG4gIHJldHVybiBkYXRhIHx8IFtdIGFzIEtleVZhbHVlW107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIHNlYXJjaCB2YWx1ZXMgb3IgZmlsdGVyIHF1ZXJpZXMgaW50byBkYXRhYmFzZSBjb25kaXRpb25zLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyBzZWFyY2ggaW5wdXQgb3IgY29tcGxleCBmaWx0ZXIgcXVlcmllcyBpbnRvIENvbmRpdGlvbiBvYmplY3RzXG4gKiB0aGF0IGNhbiBiZSB1c2VkIGZvciBkYXRhYmFzZSBxdWVyeWluZy4gSGFuZGxlcyBib3RoIHNpbXBsZSBzdHJpbmcvbnVtYmVyIHNlYXJjaGVzXG4gKiBhY3Jvc3MgaW5kZXhlZCBmaWVsZHMgYW5kIGNvbXBsZXggZmlsdGVyIHF1ZXJpZXMgd2l0aCBtdWx0aXBsZSBjcml0ZXJpYS5cbiAqXG4gKiBGb3Igc2ltcGxlIHNlYXJjaGVzIChzdHJpbmcvbnVtYmVyKTpcbiAqIC0gQ3JlYXRlcyBjb25kaXRpb25zIHRoYXQgc2VhcmNoIGFjcm9zcyBhbGwgaW5kZXhlZCBmaWVsZHNcbiAqIC0gVXNlcyBlcXVhbGl0eSBmb3IgbnVtZXJpYyB2YWx1ZXMgYW5kIHJlZ2V4IGZvciBzdHJpbmcgdmFsdWVzXG4gKiAtIENvbWJpbmVzIGNvbmRpdGlvbnMgd2l0aCBPUiBsb2dpYyB0byBzZWFyY2ggbXVsdGlwbGUgZmllbGRzXG4gKlxuICogRm9yIGNvbXBsZXggZmlsdGVyIHF1ZXJpZXM6XG4gKiAtIFByb2Nlc3NlcyBlYWNoIGZpbHRlciBpdGVtIHdpdGggaXRzIHNwZWNpZmljIGNvbmRpdGlvbiB0eXBlXG4gKiAtIFN1cHBvcnRzIEVxdWFsLCBOb3QgRXF1YWwsIENvbnRhaW5zLCBOb3QgQ29udGFpbnMsIEdyZWF0ZXIgVGhhbiwgTGVzcyBUaGFuXG4gKiAtIFVwZGF0ZXMgc29ydCBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBmaWx0ZXIgcXVlcnlcbiAqIC0gQ29tYmluZXMgbXVsdGlwbGUgZmlsdGVyIGNvbmRpdGlvbnMgd2l0aCBPUiBsb2dpY1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgSUZpbHRlclF1ZXJ5fSB2YWx1ZSAtIFRoZSBzZWFyY2ggdmFsdWUgb3IgZmlsdGVyIHF1ZXJ5IG9iamVjdFxuICogQHJldHVybnMge0NvbmRpdGlvbjxNb2RlbD59IEEgQ29uZGl0aW9uIG9iamVjdCBmb3IgZGF0YWJhc2UgcXVlcnlpbmdcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbnBhcnNlQ29uZGl0aW9ucyh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgSUZpbHRlclF1ZXJ5KTogQ29uZGl0aW9uPE1vZGVsPiB7XG4gIGxldCBfY29uZGl0aW9uOiBDb25kaXRpb248TW9kZWw+O1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFByaW1pdGl2ZXMuU1RSSU5HIHx8IHR5cGVvZiB2YWx1ZSA9PT0gUHJpbWl0aXZlcy5OVU1CRVIpIHtcbiAgICBfY29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4odGhpcy5wayBhcyBrZXlvZiBNb2RlbCkuZXEoIWlzTmFOKHZhbHVlIGFzIG51bWJlcikgPyBOdW1iZXIodmFsdWUpIDogdmFsdWUpO1xuICAgIGZvciAoY29uc3QgaW5kZXggb2YgdGhpcy5pbmRleGVzKSB7XG4gICAgICAgIGlmKGluZGV4ID09PSB0aGlzLnBrKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBsZXQgb3JDb25kaXRpb247XG4gICAgICAgIGlmKCFpc05hTih2YWx1ZSBhcyBudW1iZXIpKSB7XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkuZXEoTnVtYmVyKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkucmVnZXhwKHZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgX2NvbmRpdGlvbiA9IF9jb25kaXRpb24ub3Iob3JDb25kaXRpb24pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7cXVlcnksIHNvcnR9ID0gdmFsdWUgYXMgSUZpbHRlclF1ZXJ5O1xuICAgIF9jb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPih0aGlzLnBrIGFzIGtleW9mIE1vZGVsKS5kaWYoJ251bGwnKTtcblxuICAgIGlmKHF1ZXJ5Py5sZW5ndGgpXG4gICAgICBfY29uZGl0aW9uID0gdW5kZWZpbmVkIGFzIHVua25vd24gYXMgQ29uZGl0aW9uPE1vZGVsPjtcblxuICAgIChxdWVyeSB8fCBbXSkuZm9yRWFjaCgoaXRlbTogSUZpbHRlclF1ZXJ5SXRlbSkgPT4ge1xuICAgICAgY29uc3Qge3ZhbHVlLCBjb25kaXRpb24sIGluZGV4fSA9IGl0ZW07XG4gICAgICBsZXQgdmFsID0gdmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaWYoaW5kZXggPT09IHRoaXMucGsgfHwgIWlzTmFOKHZhbCBhcyBudW1iZXIpKVxuICAgICAgICB2YWwgPSBOdW1iZXIodmFsKTtcbiAgICAgIGxldCBvckNvbmRpdGlvbjtcbiAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJFcXVhbFwiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLmVxKHZhbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJOb3QgRXF1YWxcIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5kaWYodmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk5vdCBDb250YWluc1wiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gIUNvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5yZWdleHAobmV3IFJlZ0V4cChgXig/IS4qJHt2YWx9KS4qJGApKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkNvbnRhaW5zXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkucmVnZXhwKHZhbCBhcyBzdHJpbmcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiR3JlYXRlciBUaGFuXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkuZ3RlKHZhbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJMZXNzIFRoYW5cIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5sdGUodmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIF9jb25kaXRpb24gPSAoIV9jb25kaXRpb24gP1xuICAgICAgICBvckNvbmRpdGlvbiA6IF9jb25kaXRpb24uYW5kKG9yQ29uZGl0aW9uIGFzIHVua25vd24gYXMgQ29uZGl0aW9uPE1vZGVsPikpIGFzIENvbmRpdGlvbjxNb2RlbD47XG4gICAgfSk7XG5cbiAgICB0aGlzLnNvcnRCeSA9IHNvcnQ/LnZhbHVlIGFzIGtleW9mIE1vZGVsIHx8IHRoaXMucGs7XG4gICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gc29ydD8uZGlyZWN0aW9uIHx8IHRoaXMuc29ydERpcmVjdGlvbjtcbiAgfVxuICByZXR1cm4gX2NvbmRpdGlvbiBhcyBDb25kaXRpb248TW9kZWw+O1xuXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBxdWVyeSByZXN1bHRzIGludG8gYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LlxuICogQHN1bW1hcnkgSGFuZGxlcyBkaWZmZXJlbnQgcmVzdWx0IGZvcm1hdHMgZnJvbSB2YXJpb3VzIGRhdGEgc291cmNlcywgZXh0cmFjdGluZ1xuICogcGFnaW5hdGlvbiBpbmZvcm1hdGlvbiB3aGVuIGF2YWlsYWJsZSBhbmQgYXBwbHlpbmcgYW55IGNvbmZpZ3VyZWQgZGF0YSBtYXBwaW5nLlxuICogVGhpcyBlbnN1cmVzIGNvbnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiB0aGUgc291cmNlLlxuICpcbiAqIEBwcm90ZWN0ZWRcbiAqIEBwYXJhbSB7S2V5VmFsdWVbXSB8IFBhZ2luYXRvcn0gcmVzdWx0IC0gVGhlIHJhdyBxdWVyeSByZXN1bHRcbiAqIEByZXR1cm5zIHtLZXlWYWx1ZVtdfSBUaGUgcHJvY2Vzc2VkIGFycmF5IG9mIGl0ZW1zXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xucHJvdGVjdGVkIGFzeW5jIHBhcnNlUmVzdWx0KHJlc3VsdDogS2V5VmFsdWVbXSB8IFBhZ2luYXRvcjxNb2RlbD4pOiBQcm9taXNlPEtleVZhbHVlW10+IHtcbiAgaWYoIUFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiAoJ3BhZ2UnIGluIHJlc3VsdCAmJiAndG90YWwnIGluIHJlc3VsdCkpIHtcbiAgICBjb25zdCBwYWdpbmF0b3IgPSByZXN1bHQgYXMgUGFnaW5hdG9yPE1vZGVsPjtcbiAgICByZXN1bHQgPSBhd2FpdCBwYWdpbmF0b3IucGFnZSh0aGlzLnBhZ2UpO1xuICAgIC8vIFRPRE86IENoYWdlIGZvciByZXN1bHQudG90YWw7XG4gICAgdGhpcy5nZXRNb3JlRGF0YShwYWdpbmF0b3IudG90YWwpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZ2V0TW9yZURhdGEoKHJlc3VsdCBhcyBLZXlWYWx1ZVtdKT8ubGVuZ3RoIHx8IDApO1xuICB9XG4gIHJldHVybiAoT2JqZWN0LmtleXModGhpcy5tYXBwZXIgfHwge30pLmxlbmd0aCkgP1xuICAgIHRoaXMubWFwUmVzdWx0cyhyZXN1bHQpIDogcmVzdWx0O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIHBhZ2luYXRpb24gc3RhdGUgYmFzZWQgb24gZGF0YSBsZW5ndGguXG4gKiBAc3VtbWFyeSBDYWxjdWxhdGVzIHdoZXRoZXIgbW9yZSBkYXRhIGlzIGF2YWlsYWJsZSBhbmQgaG93IG1hbnkgcGFnZXMgZXhpc3RcbiAqIGJhc2VkIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgYW5kIHRoZSBjb25maWd1cmVkIGxpbWl0IHBlciBwYWdlLlxuICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGNvbnRyb2wgcGFnaW5hdGlvbiBVSSBhbmQgaW5maW5pdGUgc2Nyb2xsaW5nIGJlaGF2aW9yLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggLSBUaGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGF2YWlsYWJsZVxuICogQHJldHVybnMge3ZvaWR9XG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xuZ2V0TW9yZURhdGEobGVuZ3RoOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYodGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFKSB7XG4gICAgaWYodGhpcy5wYWdpbmF0b3IpXG4gICAgICBsZW5ndGggPSBsZW5ndGggKiB0aGlzLmxpbWl0O1xuICAgIGlmKGxlbmd0aCA8PSB0aGlzLmxpbWl0KSB7XG4gICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhZ2VzID0gTWF0aC5mbG9vcihsZW5ndGggLyB0aGlzLmxpbWl0KTtcbiAgICAgIGlmKCh0aGlzLnBhZ2VzICogdGhpcy5saW1pdCkgPCBsZW5ndGgpXG4gICAgICAgIHRoaXMucGFnZXMgKz0gMTtcbiAgICAgIGlmKHRoaXMucGFnZXMgPT09IDEpXG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMucGFnZXMgPSBsZW5ndGg7XG4gICAgaWYodGhpcy5wYWdlcyA9PT0gMSlcbiAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBhIHNpbmdsZSBpdGVtIHVzaW5nIHRoZSBjb25maWd1cmVkIG1hcHBlci5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgYSBkYXRhIGl0ZW0gYWNjb3JkaW5nIHRvIHRoZSBtYXBwaW5nIGNvbmZpZ3VyYXRpb24sXG4gKiBleHRyYWN0aW5nIG5lc3RlZCBwcm9wZXJ0aWVzIGFuZCBmb3JtYXR0aW5nIHZhbHVlcyBhcyBuZWVkZWQuIFRoaXMgYWxsb3dzXG4gKiB0aGUgY29tcG9uZW50IHRvIGRpc3BsYXkgZGF0YSBpbiBhIGZvcm1hdCBkaWZmZXJlbnQgZnJvbSBob3cgaXQncyBzdG9yZWQuXG4gKlxuICogQHByb3RlY3RlZFxuICogQHBhcmFtIHtLZXlWYWx1ZX0gaXRlbSAtIFRoZSBpdGVtIHRvIG1hcFxuICogQHBhcmFtIHtLZXlWYWx1ZX0gbWFwcGVyIC0gVGhlIG1hcHBpbmcgY29uZmlndXJhdGlvblxuICogQHBhcmFtIHtLZXlWYWx1ZX0gW3Byb3BzXSAtIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBpbmNsdWRlXG4gKiBAcmV0dXJucyB7S2V5VmFsdWV9IFRoZSBtYXBwZWQgaXRlbVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbnByb3RlY3RlZCBpdGVtTWFwcGVyKGl0ZW06IEtleVZhbHVlLCBtYXBwZXI6IEtleVZhbHVlLCBwcm9wcz86IEtleVZhbHVlKTogS2V5VmFsdWUge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMobWFwcGVyKS5yZWR1Y2UoKGFjY3VtOiBLZXlWYWx1ZSwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgY29uc3QgYXJyYXlWYWx1ZSA9IHZhbHVlLnNwbGl0KCcuJyk7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgYWNjdW1ba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXJyYXlWYWx1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgdmFsdWUgPSBpdGVtPy5bdmFsdWVdID8gaXRlbVt2YWx1ZV0gOiB2YWx1ZSAhPT0ga2V5ID8gdmFsdWUgOiBcIlwiO1xuICAgICAgICBpZihpc1ZhbGlkRGF0ZSh2YWx1ZSkpXG4gICAgICAgICAgdmFsdWUgPSBgJHtmb3JtYXREYXRlKHZhbHVlKX1gO1xuICAgICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgdmFsO1xuXG4gICAgICAgIGZvciAoY29uc3QgX3ZhbHVlIG9mIGFycmF5VmFsdWUpXG4gICAgICAgICAgdmFsID0gIXZhbFxuICAgICAgICAgICAgPyBpdGVtW192YWx1ZV1cbiAgICAgICAgICAgIDogKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZSh2YWwpIDogdmFsKVtfdmFsdWVdO1xuXG5cbiAgICAgICAgaWYgKGlzVmFsaWREYXRlKG5ldyBEYXRlKHZhbCkpKVxuICAgICAgICAgIHZhbCA9IGAke2Zvcm1hdERhdGUodmFsKX1gO1xuXG4gICAgICAgIGFjY3VtW2tleV0gPSB2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHByb3BzIHx8IHt9LCBhY2N1bSk7XG4gIH0sIHt9KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcyBhbGwgcmVzdWx0IGl0ZW1zIHVzaW5nIHRoZSBjb25maWd1cmVkIG1hcHBlci5cbiAqIEBzdW1tYXJ5IEFwcGxpZXMgdGhlIGl0ZW1NYXBwZXIgdG8gZWFjaCBpdGVtIGluIHRoZSByZXN1bHQgc2V0LCBhZGRpbmdcbiAqIGNvbW1vbiBwcm9wZXJ0aWVzIGxpa2Ugb3BlcmF0aW9ucyBhbmQgcm91dGUgaW5mb3JtYXRpb24uIFRoaXMgdHJhbnNmb3Jtc1xuICogdGhlIHJhdyBkYXRhIGludG8gdGhlIGZvcm1hdCBleHBlY3RlZCBieSB0aGUgbGlzdCBpdGVtIGNvbXBvbmVudHMuXG4gKlxuICogQHBhcmFtIHtLZXlWYWx1ZVtdfSBkYXRhIC0gVGhlIGFycmF5IG9mIGl0ZW1zIHRvIG1hcFxuICogQHJldHVybnMge0tleVZhbHVlW119IFRoZSBhcnJheSBvZiBtYXBwZWQgaXRlbXNcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG4gIG1hcFJlc3VsdHMoZGF0YTogS2V5VmFsdWVbXSk6IEtleVZhbHVlW10ge1xuICAgIGlmKCFkYXRhIHx8ICFkYXRhLmxlbmd0aClcbiAgICAgIHJldHVybiBbXTtcbiAgICAvLyBwYXNzaW5nIHVpZCBhcyBwcm9wIHRvIG1hcHBlclxuICAgIHRoaXMubWFwcGVyID0gey4uLiB0aGlzLm1hcHBlciwgLi4uIHt1aWQ6IHRoaXMucGt9fTtcbiAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgb3BlcmF0aW9uczogdGhpcy5vcGVyYXRpb25zLFxuICAgICAgcm91dGU6IHRoaXMucm91dGUsXG4gICAgICAuLi4gIE9iamVjdC5rZXlzKHRoaXMuaXRlbSkucmVkdWNlKChhY2M6IEtleVZhbHVlLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBhY2Nba2V5XSA9IHRoaXMuaXRlbVtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30pLFxuICAgICAgLy8gLi4uICghdGhpcy5pdGVtLnJlbmRlciA/IHt9IDogIE9iamVjdC5rZXlzKHRoaXMuaXRlbSkucmVkdWNlKChhY2M6IEtleVZhbHVlLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgLy8gICBhY2Nba2V5XSA9IHRoaXMuaXRlbVtrZXkgYXMga2V5b2YgSUxpc3RJdGVtUHJvcF07XG4gICAgICAvLyAgIHJldHVybiBhY2M7XG4gICAgICAvLyB9LCB7fSkpXG4gICAgfSk7XG4gICAgcmV0dXJuIGRhdGEucmVkdWNlKChhY2N1bTogS2V5VmFsdWVbXSwgY3VycikgPT4ge1xuICAgICAgICBhY2N1bS5wdXNoKHsuLi4gdGhpcy5pdGVtTWFwcGVyKGN1cnIsIHRoaXMubWFwcGVyIGFzIEtleVZhbHVlLCBwcm9wcyksIC4uLiB7cGs6IHRoaXMucGt9fSk7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG4gIH1cbn1cblxuIiwiXG5AaWYoc2hvd1JlZnJlc2hlcikge1xuICA8aW9uLXJlZnJlc2hlciBzbG90PVwiZml4ZWRcIiBbcHVsbEZhY3Rvcl09XCIxXCIgW3B1bGxNaW5dPVwiMTAwXCIgW3B1bGxNYXhdPVwiMjAwXCIgKGlvblJlZnJlc2gpPVwiaGFuZGxlUmVmcmVzaCgkZXZlbnQpXCI+XG4gICAgPGlvbi1yZWZyZXNoZXItY29udGVudCAvPlxuICA8L2lvbi1yZWZyZXNoZXI+XG59XG5cbkBpZihzaG93U2VhcmNoYmFyICYmIGRhdGE/Lmxlbmd0aCkge1xuICBAaWYobW9kZWwgJiYgZW5hYmxlRmlsdGVyKSB7XG4gICAgPG5neC1kZWNhZi1maWx0ZXJcbiAgICAgIFttb2RlbF09XCJtb2RlbFwiXG4gICAgICBbc29ydERpcmVjdGlvbl09XCJzb3J0RGlyZWN0aW9uXCJcbiAgICAgIFtkaXNhYmxlU29ydF09XCJkaXNhYmxlU29ydFwiXG4gICAgICAoZmlsdGVyRXZlbnQpPVwiaGFuZGxlRmlsdGVyKCRldmVudClcIlxuICAgICAgKHNlYXJjaEV2ZW50KT1cImhhbmRsZVNlYXJjaCgkZXZlbnQpXCJcbiAgICAvPlxuICB9IEBlbHNlIHtcbiAgICA8bmd4LWRlY2FmLXNlYXJjaGJhciBbZW1pdEV2ZW50VG9XaW5kb3ddPVwiZmFsc2VcIiBbZGVib3VuY2VdPVwiNTAwXCIgKHNlYXJjaEV2ZW50KT1cImhhbmRsZVNlYXJjaCgkZXZlbnQpXCIgLz5cbiAgfVxufVxuXG5AaWYoZGF0YT8ubGVuZ3RoKSB7XG4gIDxpb24tbGlzdCBbaWRdPVwidWlkXCIgW2luc2V0XT1cImluc2V0XCIgW2xpbmVzXT1cImxpbmVzXCIgI2NvbXBvbmVudD5cbiAgICBAaWYoaXRlbT8udGFnKSB7XG4gICAgICBAZm9yKGNoaWxkIG9mIGl0ZW1zOyB0cmFjayB0cmFja0l0ZW1GbigkaW5kZXgsIGNoaWxkKSkge1xuICAgICAgICA8bmd4LWRlY2FmLWNvbXBvbmVudC1yZW5kZXJlclxuICAgICAgICAgIFt0YWddPVwiaXRlbS50YWdcIlxuICAgICAgICAgIChsaXN0ZW5FdmVudCk9XCJoYW5kbGVFdmVudCgkZXZlbnQpXCJcbiAgICAgICAgICBbZ2xvYmFsc109J3tcbiAgICAgICAgICAgIGl0ZW06IGNoaWxkLFxuICAgICAgICAgICAgbWFwcGVyOiBtYXBwZXIsXG4gICAgICAgICAgICByb3V0ZTogcm91dGVcbiAgICAgICAgICB9Jz5cbiAgICAgICAgICA8L25neC1kZWNhZi1jb21wb25lbnQtcmVuZGVyZXI+XG4gICAgICAgIH1cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICB9XG4gIDwvaW9uLWxpc3Q+XG5cbiAgQGlmKGxvYWRNb3JlRGF0YSkge1xuICAgIEBpZihwYWdlcyA+IDAgJiYgdHlwZSA9PT0gJ3BhZ2luYXRlZCcgJiYgIXNlYXJjaFZhbHVlPy5sZW5ndGgpIHtcbiAgICAgIDxuZ3gtZGVjYWYtcGFnaW5hdGlvblxuICAgICAgICBbdG90YWxQYWdlc109XCJwYWdlc1wiXG4gICAgICAgIFtjdXJyZW50XT1cInBhZ2VcIlxuICAgICAgICAoY2xpY2tFdmVudCk9XCJoYW5kbGVQYWdpbmF0ZSgkZXZlbnQpXCJcbiAgICAgIC8+XG5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxpb24taW5maW5pdGUtc2Nyb2xsXG4gICAgICAgIFtjbGFzc109XCJzZWFyY2hWYWx1ZT8ubGVuZ3RoID8gJ2RjZi1oaWRkZW4nIDogJydcIlxuXG4gICAgICAgIFtwb3NpdGlvbl09XCJzY3JvbGxQb3NpdGlvblwiXG4gICAgICAgIFt0aHJlc2hvbGRdPVwic2Nyb2xsVGhyZXNob2xkXCJcbiAgICAgICAgKGlvbkluZmluaXRlKT1cImhhbmRsZVJlZnJlc2goJGV2ZW50KVwiPlxuICAgICAgICA8aW9uLWluZmluaXRlLXNjcm9sbC1jb250ZW50IFtsb2FkaW5nU3Bpbm5lcl09XCJsb2FkaW5nU3Bpbm5lclwiIFtsb2FkaW5nVGV4dF09XCJsb2FkaW5nVGV4dFwiIC8+XG4gICAgICA8L2lvbi1pbmZpbml0ZS1zY3JvbGw+XG4gICAgfVxuICB9XG59IEBlbHNlIHtcbiAgQGlmKHJlZnJlc2hpbmcpIHtcbiAgICBAZm9yKHNrbCBvZiBza2VsZXRvbkRhdGE7IHRyYWNrIHNrbCkge1xuICAgICAgPGlvbi1pdGVtPlxuICAgICAgICA8aW9uLXRodW1ibmFpbCBzbG90PVwic3RhcnRcIj5cbiAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICA8L2lvbi10aHVtYm5haWw+XG4gICAgICAgIDxpb24tbGFiZWw+XG4gICAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCI+PC9pb24tc2tlbGV0b24tdGV4dD5cbiAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJkYXRlXCIgc3R5bGU9XCJ3aWR0aDogMjAlO1wiPjxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+PC9pb24tdGV4dD5cbiAgICAgICAgPC9pb24tbGFiZWw+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIH1cblxuICB9IEBlbHNlIHtcbiAgICBAaWYoIXNlYXJjaFZhbHVlPy5sZW5ndGgpIHtcbiAgICAgIDxuZ3gtZGVjYWYtZW1wdHktc3RhdGVcbiAgICAgICAgW3RpdGxlXT1cIihsb2NhbGUgKyAnLicrIGVtcHR5LnRpdGxlKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtzdWJ0aXRsZV09XCIobG9jYWxlICsgJy4nKyBlbXB0eS5zdWJ0aXRsZSkgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbYnV0dG9uVGV4dF09XCJlbXB0eS5zaG93QnV0dG9uID8gKGxvY2FsZSArICcuJysgZW1wdHkuYnV0dG9uIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgW2J1dHRvbkxpbmtdPVwiZW1wdHkuc2hvd0J1dHRvbiA/IGVtcHR5LnJvdXRlIDogJydcIlxuICAgICAgLz5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxuZ3gtZGVjYWYtZW1wdHktc3RhdGVcbiAgICAgICAgaWNvbj1cInNlYXJjaC1vdXRsaW5lXCJcbiAgICAgICAgbmdDbGFzcz1cImVtcHR5LXNlYXJjaFwiXG4gICAgICAgIFt0cmFuc2xhdGFibGVdPVwidHJ1ZVwiXG4gICAgICAgIHRpdGxlPVwic2VhcmNoLnRpdGxlXCJcbiAgICAgICAgc3VidGl0bGU9XCJzZWFyY2guc3VidGl0bGVcIlxuICAgICAgICBbc2VhcmNoVmFsdWVdPVwic2VhcmNoVmFsdWVcIlxuICAgICAgLz5cbiAgICB9XG4gIH1cbn1cblxuIl19
1237
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbGlzdC9saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9saXN0L2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXpHLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLE9BQU8sRUFDUCxZQUFZLEVBQ1osVUFBVSxFQUNYLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBWSxjQUFjLEVBQWEsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBRUwsT0FBTyxFQUNQLGNBQWMsRUFDZCxrQkFBa0IsRUFLbkIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUNMLGVBQWUsRUFDZixVQUFVLEVBQ1YsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxD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LEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBOEIvQyxZQUFZO3NCQURqQixZQUFZO3VCQUFDLHVCQUF1QixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXNJM0MsT0FBTztzQkFEWixZQUFZO3VCQUFDLHFDQUFxQyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dCwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3kgIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50LCBSZWZyZXNoZXJDdXN0b21FdmVudCwgU3Bpbm5lclR5cGVzIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtcbiAgSW9uSW5maW5pdGVTY3JvbGwsXG4gIElvbkluZmluaXRlU2Nyb2xsQ29udGVudCxcbiAgSW9uSXRlbSxcbiAgSW9uTGFiZWwsXG4gIElvbkxpc3QsXG4gIElvblJlZnJlc2hlcixcbiAgSW9uUmVmcmVzaGVyQ29udGVudCxcbiAgSW9uU2tlbGV0b25UZXh0LFxuICBJb25UZXh0LFxuICBJb25UaHVtYm5haWwsXG4gIElvbkxvYWRpbmdcbn0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9wZXJhdGlvbktleXMgfSBmcm9tICdAZGVjYWYtdHMvZGItZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBNb2RlbCwgUHJpbWl0aXZlcyB9IGZyb20gJ0BkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBDb25kaXRpb24sIE9ic2VydmVyLCBPcmRlckRpcmVjdGlvbiwgUGFnaW5hdG9yIH0gZnJvbSAnQGRlY2FmLXRzL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmFzZUN1c3RvbUV2ZW50LFxuICBEeW5hbWljLFxuICBFdmVudENvbnN0YW50cyxcbiAgQ29tcG9uZW50c1RhZ05hbWVzLFxuICBSZW5kZXJlckN1c3RvbUV2ZW50LFxuICBTdHJpbmdPckJvb2xlYW4sXG4gIEtleVZhbHVlLFxuICBMaXN0SXRlbUN1c3RvbUV2ZW50XG59IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQgeyBOZ3hCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZW5naW5lL05neEJhc2VDb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgc3RyaW5nVG9Cb29sZWFuLFxuICBmb3JtYXREYXRlLFxuICBpc1ZhbGlkRGF0ZVxufSBmcm9tICcuLi8uLi9oZWxwZXJzJztcbmltcG9ydCB7IFNlYXJjaGJhckNvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaGJhci9zZWFyY2hiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlzdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuLi9saXN0LWl0ZW0vbGlzdC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1yZW5kZXJlci9jb21wb25lbnQtcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRpb25Db21wb25lbnQgfSBmcm9tICcuLi9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IFBhZ2luYXRpb25DdXN0b21FdmVudCB9IGZyb20gJy4uL3BhZ2luYXRpb24vY29uc3RhbnRzJztcbmltcG9ydCB7IElMaXN0RW1wdHlSZXN1bHQsIExpc3RDb21wb25lbnRzVHlwZXMsIERlY2FmUmVwb3NpdG9yeSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEZ1bmN0aW9uTGlrZSwgSUZpbHRlclF1ZXJ5LCBJRmlsdGVyUXVlcnlJdGVtIH0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7IEZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4uL2ZpbHRlci9maWx0ZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFRyYW5zbGF0ZVBpcGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSB2ZXJzYXRpbGUgbGlzdCBjb21wb25lbnQgdGhhdCBzdXBwb3J0cyB2YXJpb3VzIGRhdGEgZGlzcGxheSBtb2Rlcy5cbiAqIEBzdW1tYXJ5IFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgZmxleGlibGUgd2F5IHRvIGRpc3BsYXkgbGlzdHMgb2YgZGF0YSB3aXRoIHN1cHBvcnRcbiAqIGZvciBpbmZpbml0ZSBzY3JvbGxpbmcsIHBhZ2luYXRpb24sIHNlYXJjaGluZywgYW5kIGN1c3RvbSBpdGVtIHJlbmRlcmluZy4gSXQgY2FuIGZldGNoXG4gKiBkYXRhIGZyb20gdmFyaW91cyBzb3VyY2VzIGluY2x1ZGluZyBtb2RlbHMsIGZ1bmN0aW9ucywgb3IgZGlyZWN0IGRhdGEgaW5wdXQuXG4gKlxuICogVGhlIGNvbXBvbmVudCBzdXBwb3J0cyB0d28gbWFpbiBkaXNwbGF5IHR5cGVzOlxuICogMS4gSW5maW5pdGUgc2Nyb2xsaW5nIC0gTG9hZHMgbW9yZSBkYXRhIGFzIHRoZSB1c2VyIHNjcm9sbHNcbiAqIDIuIFBhZ2luYXRpb24gLSBEaXNwbGF5cyBkYXRhIGluIHBhZ2VzIHdpdGggbmF2aWdhdGlvbiBjb250cm9sc1xuICpcbiAqIEFkZGl0aW9uYWwgZmVhdHVyZXMgaW5jbHVkZTpcbiAqIC0gUHVsbC10by1yZWZyZXNoIGZ1bmN0aW9uYWxpdHlcbiAqIC0gU2VhcmNoIGZpbHRlcmluZ1xuICogLSBFbXB0eSBzdGF0ZSBjdXN0b21pemF0aW9uXG4gKiAtIEN1c3RvbSBpdGVtIHJlbmRlcmluZ1xuICogLSBFdmVudCBlbWlzc2lvbiBmb3IgaW50ZXJhY3Rpb25zXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAqICAgcGFydGljaXBhbnQgTCBhcyBMaXN0Q29tcG9uZW50XG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGF0YSBTb3VyY2VcbiAqICAgcGFydGljaXBhbnQgRSBhcyBFeHRlcm5hbCBDb21wb25lbnRzXG4gKlxuICogICBVLT4+TDogSW5pdGlhbGl6ZSBjb21wb25lbnRcbiAqICAgTC0+Pkw6IG5nT25Jbml0KClcbiAqICAgTC0+PkQ6IFJlcXVlc3QgaW5pdGlhbCBkYXRhXG4gKiAgIEQtLT4+TDogUmV0dXJuIGRhdGFcbiAqICAgTC0+Pkw6IFByb2Nlc3MgYW5kIGRpc3BsYXkgZGF0YVxuICpcbiAqICAgYWx0IFVzZXIgc2Nyb2xscyAoSW5maW5pdGUgbW9kZSlcbiAqICAgICBVLT4+TDogU2Nyb2xsIHRvIGJvdHRvbVxuICogICAgIEwtPj5EOiBSZXF1ZXN0IG1vcmUgZGF0YVxuICogICAgIEQtLT4+TDogUmV0dXJuIGFkZGl0aW9uYWwgZGF0YVxuICogICAgIEwtPj5MOiBBcHBlbmQgdG8gZXhpc3RpbmcgZGF0YVxuICogICBlbHNlIFVzZXIgY2hhbmdlcyBwYWdlIChQYWdpbmF0ZWQgbW9kZSlcbiAqICAgICBVLT4+TDogQ2xpY2sgcGFnZSBudW1iZXJcbiAqICAgICBMLT4+TDogaGFuZGxlUGFnaW5hdGUoKVxuICogICAgIEwtPj5EOiBSZXF1ZXN0IGRhdGEgZm9yIHBhZ2VcbiAqICAgICBELS0+Pkw6IFJldHVybiBwYWdlIGRhdGFcbiAqICAgICBMLT4+TDogUmVwbGFjZSBkaXNwbGF5ZWQgZGF0YVxuICogICBlbmRcbiAqXG4gKiAgIGFsdCBVc2VyIHNlYXJjaGVzXG4gKiAgICAgVS0+Pkw6IEVudGVyIHNlYXJjaCB0ZXJtXG4gKiAgICAgTC0+Pkw6IGhhbmRsZVNlYXJjaCgpXG4gKiAgICAgTC0+PkQ6IEZpbHRlciBkYXRhIGJ5IHNlYXJjaCB0ZXJtXG4gKiAgICAgRC0tPj5MOiBSZXR1cm4gZmlsdGVyZWQgZGF0YVxuICogICAgIEwtPj5MOiBVcGRhdGUgZGlzcGxheWVkIGRhdGFcbiAqICAgZW5kXG4gKlxuICogICBhbHQgVXNlciBjbGlja3MgaXRlbVxuICogICAgIFUtPj5MOiBDbGljayBsaXN0IGl0ZW1cbiAqICAgICBMLT4+TDogaGFuZGxlQ2xpY2soKVxuICogICAgIEwtPj5FOiBFbWl0IGNsaWNrRXZlbnRcbiAqICAgZW5kXG4gKlxuICogQGV4YW1wbGVcbiAqIDxuZ3gtZGVjYWYtbGlzdFxuICogICBbc291cmNlXT1cImRhdGFTb3VyY2VcIlxuICogICBbbGltaXRdPVwiMTBcIlxuICogICBbdHlwZV09XCInaW5maW5pdGUnXCJcbiAqICAgW3Nob3dTZWFyY2hiYXJdPVwidHJ1ZVwiXG4gKiAgIChjbGlja0V2ZW50KT1cImhhbmRsZUl0ZW1DbGljaygkZXZlbnQpXCJcbiAqICAgKHJlZnJlc2hFdmVudCk9XCJoYW5kbGVSZWZyZXNoKCRldmVudClcIj5cbiAqIDwvbmd4LWRlY2FmLWxpc3Q+XG4gKlxuICogQGV4dGVuZHMge05neEJhc2VDb21wb25lbnR9XG4gKiBAaW1wbGVtZW50cyB7T25Jbml0fVxuICovXG5ARHluYW1pYygpXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtZGVjYWYtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgVHJhbnNsYXRlUGlwZSxcbiAgICBJb25SZWZyZXNoZXIsXG4gICAgSW9uTG9hZGluZyxcbiAgICBQYWdpbmF0aW9uQ29tcG9uZW50LFxuICAgIElvbkxpc3QsXG4gICAgSW9uSXRlbSxcbiAgICBJb25UaHVtYm5haWwsXG4gICAgSW9uU2tlbGV0b25UZXh0LFxuICAgIElvbkxhYmVsLFxuICAgIElvblRleHQsXG4gICAgSW9uUmVmcmVzaGVyQ29udGVudCxcbiAgICBJb25JbmZpbml0ZVNjcm9sbCxcbiAgICBJb25JbmZpbml0ZVNjcm9sbENvbnRlbnQsXG4gICAgSW9uVGh1bWJuYWlsLFxuICAgIElvblNrZWxldG9uVGV4dCxcbiAgICBTZWFyY2hiYXJDb21wb25lbnQsXG4gICAgRW1wdHlTdGF0ZUNvbXBvbmVudCxcbiAgICBMaXN0SXRlbUNvbXBvbmVudCxcbiAgICBGaWx0ZXJDb21wb25lbnQsXG4gICAgQ29tcG9uZW50UmVuZGVyZXJDb21wb25lbnRcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaXN0Q29tcG9uZW50IGV4dGVuZHMgTmd4QmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBkaXNwbGF5IG1vZGUgZm9yIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBob3cgdGhlIGxpc3QgZGF0YSBpcyBsb2FkZWQgYW5kIGRpc3BsYXllZC4gT3B0aW9ucyBpbmNsdWRlOlxuICAgKiAtIElORklOSVRFOiBMb2FkcyBtb3JlIGRhdGEgYXMgdGhlIHVzZXIgc2Nyb2xscyAoaW5maW5pdGUgc2Nyb2xsaW5nKVxuICAgKiAtIFBBR0lOQVRFRDogRGlzcGxheXMgZGF0YSBpbiBwYWdlcyB3aXRoIG5hdmlnYXRpb24gY29udHJvbHNcbiAgICpcbiAgICogQHR5cGUge0xpc3RDb21wb25lbnRzVHlwZXN9XG4gICAqIEBkZWZhdWx0IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHR5cGU6IExpc3RDb21wb25lbnRzVHlwZXMgPSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciB0aGUgY29tcG9uZW50IHVzZXMgdHJhbnNsYXRpb24gc2VydmljZXMuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIHRoZSBjb21wb25lbnQgd2lsbCBhdHRlbXB0IHRvIHVzZSB0cmFuc2xhdGlvbiBzZXJ2aWNlc1xuICAgKiBmb3IgYW55IHRleHQgY29udGVudC4gVGhpcyBhbGxvd3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uIG9mIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgb3ZlcnJpZGUgdHJhbnNsYXRhYmxlOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHNlYXJjaCBiYXIuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIGRpc3BsYXlzIGEgc2VhcmNoIGJhciBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0IHRoYXQgYWxsb3dzXG4gICAqIHVzZXJzIHRvIGZpbHRlciB0aGUgbGlzdCBpdGVtcy4gVGhlIHNlYXJjaCBmdW5jdGlvbmFsaXR5IHdvcmtzIGJ5IGZpbHRlcmluZyB0aGVcbiAgICogZXhpc3RpbmcgZGF0YSBvciBieSB0cmlnZ2VyaW5nIGEgbmV3IGRhdGEgZmV0Y2ggd2l0aCBzZWFyY2ggcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc2hvd1NlYXJjaGJhcjogU3RyaW5nT3JCb29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERpcmVjdCBkYXRhIGlucHV0IGZvciB0aGUgbGlzdCBjb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgd2F5IHRvIGRpcmVjdGx5IHBhc3MgZGF0YSB0byB0aGUgbGlzdCBjb21wb25lbnQgaW5zdGVhZCBvZlxuICAgKiBmZXRjaGluZyBpdCBmcm9tIGEgc291cmNlLiBXaGVuIGJvdGggZGF0YSBhbmQgc291cmNlIGFyZSBwcm92aWRlZCwgdGhlIGNvbXBvbmVudFxuICAgKiB3aWxsIHVzZSB0aGUgc291cmNlIHRvIGZldGNoIGRhdGEgb25seSBpZiB0aGUgZGF0YSBhcnJheSBpcyBlbXB0eS5cbiAgICpcbiAgICogQHR5cGUge0tleVZhbHVlW10gfCB1bmRlZmluZWR9XG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZGF0YT86IEtleVZhbHVlW10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBsaXN0IGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHdoZXJlIHRoZSBsaXN0IHNob3VsZCBmZXRjaCBpdHMgZGF0YSBmcm9tLiBUaGlzIGNhbiBiZSBlaXRoZXI6XG4gICAqIC0gQSBzdHJpbmcgVVJMIG9yIGVuZHBvaW50IGlkZW50aWZpZXJcbiAgICogLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBkYXRhIHdoZW4gY2FsbGVkXG4gICAqIFRoZSBjb21wb25lbnQgd2lsbCBjYWxsIHRoaXMgc291cmNlIHdoZW4gaXQgbmVlZHMgdG8gbG9hZCBvciByZWZyZXNoIGRhdGEuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBGdW5jdGlvbkxpa2V9XG4gICAqIEByZXF1aXJlZFxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc291cmNlITogc3RyaW5nIHwgRnVuY3Rpb25MaWtlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0YXJ0aW5nIGluZGV4IGZvciBkYXRhIGZldGNoaW5nLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGluZGV4IGZyb20gd2hpY2ggdG8gc3RhcnQgZmV0Y2hpbmcgZGF0YS4gVGhpcyBpcyB1c2VkXG4gICAqIGZvciBwYWdpbmF0aW9uIGFuZCBpbmZpbml0ZSBzY3JvbGxpbmcgdG8gZGV0ZXJtaW5lIHdoaWNoIHN1YnNldCBvZiBkYXRhIHRvIGxvYWQuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDBcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHN0YXJ0OiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG51bWJlciBvZiBpdGVtcyB0byBmZXRjaCBwZXIgcGFnZSBvciBsb2FkIG9wZXJhdGlvbi5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBob3cgbWFueSBpdGVtcyBhcmUgbG9hZGVkIGF0IG9uY2UgZHVyaW5nIHBhZ2luYXRpb24gb3JcbiAgICogaW5maW5pdGUgc2Nyb2xsaW5nLiBUaGlzIGFmZmVjdHMgdGhlIHNpemUgb2YgZGF0YSBjaHVua3MgcmVxdWVzdGVkIGZyb20gdGhlIHNvdXJjZS5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMTBcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxpbWl0OiBudW1iZXIgPSAxMDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgbW9yZSBkYXRhIGNhbiBiZSBsb2FkZWQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIHRoZSBjb21wb25lbnQgd2lsbCBhbGxvdyBsb2FkaW5nIGFkZGl0aW9uYWwgZGF0YVxuICAgKiB0aHJvdWdoIGluZmluaXRlIHNjcm9sbGluZyBvciBwYWdpbmF0aW9uLiBXaGVuIGZhbHNlLCB0aGUgY29tcG9uZW50IHdpbGwgbm90XG4gICAqIGF0dGVtcHQgdG8gbG9hZCBtb3JlIGRhdGEgYmV5b25kIHdoYXQgaXMgaW5pdGlhbGx5IGRpc3BsYXllZC5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbG9hZE1vcmVEYXRhOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc3R5bGUgb2YgZGl2aWRpbmcgbGluZXMgYmV0d2VlbiBsaXN0IGl0ZW1zLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGhvdyBkaXZpZGluZyBsaW5lcyBhcHBlYXIgYmV0d2VlbiBsaXN0IGl0ZW1zLiBPcHRpb25zIGluY2x1ZGU6XG4gICAqIC0gXCJpbnNldFwiOiBMaW5lcyBhcmUgaW5zZXQgZnJvbSB0aGUgZWRnZXNcbiAgICogLSBcImZ1bGxcIjogTGluZXMgZXh0ZW5kIHRoZSBmdWxsIHdpZHRoXG4gICAqIC0gXCJub25lXCI6IE5vIGRpdmlkaW5nIGxpbmVzXG4gICAqXG4gICAqIEB0eXBlIHtcImluc2V0XCIgfCBcImZ1bGxcIiB8IFwibm9uZVwifVxuICAgKiBAZGVmYXVsdCBcImZ1bGxcIlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgbGluZXM6IFwiaW5zZXRcIiB8IFwiZnVsbFwiIHwgXCJub25lXCIgPSBcImZ1bGxcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHdoZXRoZXIgdGhlIGxpc3QgaGFzIGluc2V0IHN0eWxpbmcuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIHRoZSBsaXN0IHdpbGwgaGF2ZSBpbnNldCBzdHlsaW5nIHdpdGggcm91bmRlZCBjb3JuZXJzXG4gICAqIGFuZCBtYXJnaW4gYXJvdW5kIHRoZSBlZGdlcy4gVGhpcyBjcmVhdGVzIGEgY2FyZC1saWtlIGFwcGVhcmFuY2UgZm9yIHRoZSBsaXN0LlxuICAgKlxuICAgKiBAdHlwZSB7U3RyaW5nT3JCb29sZWFufVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgaW5zZXQ6IFN0cmluZ09yQm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHRocmVzaG9sZCBmb3IgdHJpZ2dlcmluZyBpbmZpbml0ZSBzY3JvbGwgbG9hZGluZy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyBjbG9zZSB0byB0aGUgYm90dG9tIG9mIHRoZSBsaXN0IHRoZSB1c2VyIG11c3Qgc2Nyb2xsXG4gICAqIGJlZm9yZSB0aGUgY29tcG9uZW50IHRyaWdnZXJzIGxvYWRpbmcgb2YgYWRkaXRpb25hbCBkYXRhLiBUaGlzIGlzIGV4cHJlc3NlZFxuICAgKiBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGxpc3QgaGVpZ2h0LlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAZGVmYXVsdCBcIjE1JVwiXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBzY3JvbGxUaHJlc2hvbGQ6IHN0cmluZyA9IFwiMTUlXCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgcG9zaXRpb24gd2hlcmUgbmV3IGl0ZW1zIGFyZSBhZGRlZCBkdXJpbmcgaW5maW5pdGUgc2Nyb2xsaW5nLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoZXRoZXIgbmV3IGl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgbGlzdFxuICAgKiB3aGVuIGxvYWRpbmcgbW9yZSBkYXRhIHRocm91Z2ggaW5maW5pdGUgc2Nyb2xsaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7XCJib3R0b21cIiB8IFwidG9wXCJ9XG4gICAqIEBkZWZhdWx0IFwiYm90dG9tXCJcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNjcm9sbFBvc2l0aW9uOiBcImJvdHRvbVwiIHwgXCJ0b3BcIiA9IFwiYm90dG9tXCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXN0b20gdGV4dCB0byBkaXNwbGF5IGR1cmluZyBsb2FkaW5nIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgdGV4dCBzaG93biBpbiB0aGUgbG9hZGluZyBpbmRpY2F0b3Igd2hlbiB0aGUgY29tcG9uZW50XG4gICAqIGlzIGZldGNoaW5nIGRhdGEuIElmIG5vdCBwcm92aWRlZCwgYSBkZWZhdWx0IGxvYWRpbmcgbWVzc2FnZSB3aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBsb2FkaW5nVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBwdWxsLXRvLXJlZnJlc2ggZmVhdHVyZS5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgZW5hYmxlcyB0aGUgcHVsbC10by1yZWZyZXNoIGZ1bmN0aW9uYWxpdHkgdGhhdCBhbGxvd3NcbiAgICogdXNlcnMgdG8gcmVmcmVzaCB0aGUgbGlzdCBkYXRhIGJ5IHB1bGxpbmcgZG93biBmcm9tIHRoZSB0b3Agb2YgdGhlIGxpc3QuXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNob3dSZWZyZXNoZXI6IFN0cmluZ09yQm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdHlwZSBvZiBzcGlubmVyIHRvIGRpc3BsYXkgZHVyaW5nIGxvYWRpbmcgb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIHRoZSB2aXN1YWwgc3R5bGUgb2YgdGhlIGxvYWRpbmcgc3Bpbm5lciBzaG93biBkdXJpbmcgZGF0YVxuICAgKiBmZXRjaGluZyBvcGVyYXRpb25zLiBVc2VzIElvbmljJ3MgcHJlZGVmaW5lZCBzcGlubmVyIHR5cGVzLlxuICAgKlxuICAgKiBAdHlwZSB7U3Bpbm5lclR5cGVzfVxuICAgKiBAZGVmYXVsdCBcImNpcmN1bGFyXCJcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxvYWRpbmdTcGlubmVyOiBTcGlubmVyVHlwZXMgPSBcImNpcmN1bGFyXCI7XG5cbiAgLy8gLyoqXG4gIC8vICAqIEBkZXNjcmlwdGlvbiBRdWVyeSBwYXJhbWV0ZXJzIGZvciBkYXRhIGZldGNoaW5nLlxuICAvLyAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgYWRkaXRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHVzZSB3aGVuIGZldGNoaW5nIGRhdGEgZnJvbVxuICAvLyAgKiB0aGUgc291cmNlLiBUaGlzIGNhbiBiZSBwcm92aWRlZCBhcyBhIHN0cmluZyAoSlNPTikgb3IgYSBkaXJlY3Qgb2JqZWN0LlxuICAvLyAgKlxuICAvLyAgKiBAdHlwZSB7c3RyaW5nIHwgS2V5VmFsdWUgfCB1bmRlZmluZWR9XG4gIC8vICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gIC8vICAqL1xuICAvLyBASW5wdXQoKVxuICAvLyBxdWVyeT86IHN0cmluZyB8IEtleVZhbHVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciB0aGUgZmlsdGVyaW5nIGZ1bmN0aW9uYWxpdHkgaXMgZW5hYmxlZC5cbiAgICogQHN1bW1hcnkgV2hlbiBzZXQgdG8gdHJ1ZSwgZW5hYmxlcyB0aGUgZmlsdGVyIGNvbXBvbmVudCB0aGF0IGFsbG93cyB1c2VycyB0byBjcmVhdGVcbiAgICogY29tcGxleCBzZWFyY2ggY3JpdGVyaWEgd2l0aCBtdWx0aXBsZSBmaWVsZCBmaWx0ZXJzLCBjb25kaXRpb25zLCBhbmQgdmFsdWVzLlxuICAgKiBXaGVuIGZhbHNlLCBkaXNhYmxlcyB0aGUgZmlsdGVyIGludGVyZmFjZSBlbnRpcmVseS5cbiAgICpcbiAgICogQHR5cGUge1N0cmluZ09yQm9vbGVhbn1cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgZW5hYmxlRmlsdGVyOiBTdHJpbmdPckJvb2xlYW4gPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU29ydGluZyBwYXJhbWV0ZXJzIGZvciBkYXRhIGZldGNoaW5nLlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IHRoZSBmZXRjaGVkIGRhdGEgc2hvdWxkIGJlIHNvcnRlZC4gVGhpcyBjYW4gYmUgcHJvdmlkZWRcbiAgICogYXMgYSBzdHJpbmcgKGZpZWxkIG5hbWUgd2l0aCBvcHRpb25hbCBkaXJlY3Rpb24pIG9yIGEgZGlyZWN0IG9iamVjdC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZyB8IEtleVZhbHVlIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgQElucHV0KClcbiAgc29ydERpcmVjdGlvbjogT3JkZXJEaXJlY3Rpb24gPSBPcmRlckRpcmVjdGlvbi5EU0M7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNvcnRpbmcgcGFyYW1ldGVycyBmb3IgZGF0YSBmZXRjaGluZy5cbiAgICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyB0aGUgZmV0Y2hlZCBkYXRhIHNob3VsZCBiZSBzb3J0ZWQuIFRoaXMgY2FuIGJlIHByb3ZpZGVkXG4gICAqIGFzIGEgc3RyaW5nIChmaWVsZCBuYW1lIHdpdGggb3B0aW9uYWwgZGlyZWN0aW9uKSBvciBhIGRpcmVjdCBvYmplY3QuXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmcgfCBLZXlWYWx1ZSB8IHVuZGVmaW5lZH1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNvcnRCeSE6IHN0cmluZztcblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udHJvbHMgd2hldGhlciBzb3J0aW5nIGZ1bmN0aW9uYWxpdHkgaXMgZGlzYWJsZWQuXG4gICAqIEBzdW1tYXJ5IFdoZW4gc2V0IHRvIHRydWUsIGRpc2FibGVzIHRoZSBzb3J0IGNvbnRyb2xzIGFuZCBwcmV2ZW50cyB1c2VycyBmcm9tXG4gICAqIGNoYW5naW5nIHRoZSBzb3J0IG9yZGVyIG9yIGZpZWxkLiBUaGUgbGlzdCB3aWxsIG1haW50YWluIGl0cyBkZWZhdWx0IG9yXG4gICAqIHByb2dyYW1tYXRpY2FsbHkgc2V0IHNvcnQgY29uZmlndXJhdGlvbiB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24uXG4gICAqXG4gICAqIEB0eXBlIHtTdHJpbmdPckJvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBkaXNhYmxlU29ydDogU3RyaW5nT3JCb29sZWFuID0gZmFsc2U7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEljb24gdG8gZGlzcGxheSB3aGVuIHRoZSBsaXN0IGlzIGVtcHR5LlxuICAgKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGljb24gc2hvd24gaW4gdGhlIGVtcHR5IHN0YXRlIHdoZW4gbm8gZGF0YSBpcyBhdmFpbGFibGUuXG4gICAqIFRoaXMgY2FuIGJlIGFueSBpY29uIG5hbWUgc3VwcG9ydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbidzIGljb24gc3lzdGVtLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAZGVmYXVsdCAndGktZGF0YWJhc2UtZXhjbGFtYXRpb24nXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBlbXB0eUljb24/OiBzdHJpbmcgPSAndGktZGF0YWJhc2UtZXhjbGFtYXRpb24nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBmb3IgdGhlIGVtcHR5IHN0YXRlIGRpc3BsYXkuXG4gICAqIEBzdW1tYXJ5IEN1c3RvbWl6ZXMgaG93IHRoZSBlbXB0eSBzdGF0ZSBpcyBkaXNwbGF5ZWQgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZS5cbiAgICogVGhpcyBpbmNsdWRlcyB0aGUgdGl0bGUsIHN1YnRpdGxlLCBidXR0b24gdGV4dCwgaWNvbiwgYW5kIG5hdmlnYXRpb24gbGluay5cbiAgICpcbiAgICogQHR5cGUge1BhcnRpYWw8SUxpc3RFbXB0eVJlc3VsdD59XG4gICAqIEBkZWZhdWx0IHtcbiAgICogICB0aXRsZTogJ2VtcHR5LnRpdGxlJyxcbiAgICogICBzdWJ0aXRsZTogJ2VtcHR5LnN1YnRpdGxlJyxcbiAgICogICBzaG93QnV0dG9uOiBmYWxzZSxcbiAgICogICBpY29uOiAnYWxlcnQtY2lyY2xlLW91dGxpbmUnLFxuICAgKiAgIGJ1dHRvblRleHQ6ICdsb2NhbGUuZW1wdHkuYnV0dG9uJyxcbiAgICogICBsaW5rOiAnJ1xuICAgKiB9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBlbXB0eTogUGFydGlhbDxJTGlzdEVtcHR5UmVzdWx0PiA9IHtcbiAgICB0aXRsZTogJ2VtcHR5LnRpdGxlJyxcbiAgICBzdWJ0aXRsZTogJ2VtcHR5LnN1YnRpdGxlJyxcbiAgICBzaG93QnV0dG9uOiBmYWxzZSxcbiAgICBpY29uOiAnYWxlcnQtY2lyY2xlLW91dGxpbmUnLFxuICAgIGJ1dHRvblRleHQ6ICdsb2NhbGUuZW1wdHkuYnV0dG9uJyxcbiAgICBsaW5rOiAnJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY3VycmVudCBwYWdlIG51bWJlciBpbiBwYWdpbmF0ZWQgbW9kZS5cbiAgICogQHN1bW1hcnkgVHJhY2tzIHdoaWNoIHBhZ2UgaXMgY3VycmVudGx5IGJlaW5nIGRpc3BsYXllZCB3aGVuIHRoZSBjb21wb25lbnRcbiAgICogaXMgaW4gcGFnaW5hdGVkIG1vZGUuIFRoaXMgaXMgdXNlZCBmb3IgcGFnaW5hdGlvbiBjb250cm9scyBhbmQgZGF0YSBmZXRjaGluZy5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcGFnZTogbnVtYmVyID0gMTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMgYXZhaWxhYmxlLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGNhbGN1bGF0ZWQgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGJhc2VkIG9uIHRoZSBkYXRhIHNpemVcbiAgICogYW5kIGxpbWl0LiBUaGlzIGlzIHVzZWQgZm9yIHBhZ2luYXRpb24gY29udHJvbHMgYW5kIGJvdW5kYXJ5IGNoZWNraW5nLlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcGFnZXMhOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbmRpY2F0ZXMgd2hldGhlciBhIHJlZnJlc2ggb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLlxuICAgKiBAc3VtbWFyeSBXaGVuIHRydWUsIHRoZSBjb21wb25lbnQgaXMgY3VycmVudGx5IGZldGNoaW5nIG5ldyBkYXRhLiBUaGlzIGlzIHVzZWRcbiAgICogdG8gY29udHJvbCBsb2FkaW5nIGluZGljYXRvcnMgYW5kIHByZXZlbnQgZHVwbGljYXRlIHJlZnJlc2ggb3BlcmF0aW9ucyBmcm9tXG4gICAqIGJlaW5nIHRyaWdnZXJlZCBzaW11bHRhbmVvdXNseS5cbiAgICpcbiAgICogQHR5cGUge2Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICByZWZyZXNoaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBcnJheSB1c2VkIGZvciByZW5kZXJpbmcgc2tlbGV0b24gbG9hZGluZyBwbGFjZWhvbGRlcnMuXG4gICAqIEBzdW1tYXJ5IENvbnRhaW5zIHBsYWNlaG9sZGVyIGl0ZW1zIHRoYXQgYXJlIGRpc3BsYXllZCBkdXJpbmcgZGF0YSBsb2FkaW5nLlxuICAgKiBUaGUgbGVuZ3RoIG9mIHRoaXMgYXJyYXkgZGV0ZXJtaW5lcyBob3cgbWFueSBza2VsZXRvbiBpdGVtcyBhcmUgc2hvd24uXG4gICAqXG4gICAqIEB0eXBlIHtzdHJpbmdbXX1cbiAgICogQGRlZmF1bHQgbmV3IEFycmF5KDIpXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBza2VsZXRvbkRhdGE6IHN0cmluZ1tdID0gbmV3IEFycmF5KDIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHByb2Nlc3NlZCBsaXN0IGl0ZW1zIHJlYWR5IGZvciBkaXNwbGF5LlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgc2V0IG9mIGl0ZW1zIGJlaW5nIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBhZnRlclxuICAgKiBwcm9jZXNzaW5nIGZyb20gdGhlIHJhdyBkYXRhIHNvdXJjZS4gVGhpcyBtYXkgYmUgYSBzdWJzZXQgb2YgdGhlIGZ1bGwgZGF0YVxuICAgKiB3aGVuIHVzaW5nIHBhZ2luYXRpb24gb3IgaW5maW5pdGUgc2Nyb2xsaW5nLlxuICAgKlxuICAgKiBAdHlwZSB7S2V5VmFsdWVbXX1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGl0ZW1zITogS2V5VmFsdWVbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50IHNlYXJjaCBxdWVyeSB2YWx1ZS5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSB0ZXh0IGVudGVyZWQgaW4gdGhlIHNlYXJjaCBiYXIuIFRoaXMgaXMgdXNlZCB0byBmaWx0ZXJcbiAgICogdGhlIGxpc3QgZGF0YSBvciB0byBzZW5kIGFzIGEgc2VhcmNoIHBhcmFtZXRlciB3aGVuIGZldGNoaW5nIG5ldyBkYXRhLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgc2VhcmNoVmFsdWU/OiBzdHJpbmcgfCBJRmlsdGVyUXVlcnkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBIHBhZ2luYXRvciBvYmplY3QgZm9yIGhhbmRsaW5nIHBhZ2luYXRpb24gb3BlcmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgYSBwYWdpbmF0b3Igb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYW5kIG5hdmlnYXRlXG4gICAqIHRocm91Z2ggZGF0YSBpbiBjaHVua3MsIHJlZHVjaW5nIG1lbW9yeSB1c2FnZSBhbmQgaW1wcm92aW5nIHBlcmZvcm1hbmNlLlxuICAgKlxuICAgKiBUaGUgcGFnaW5hdG9yIG9iamVjdCBpcyBpbml0aWFsaXplZCBpbiB0aGUgYG5nT25Jbml0YCBsaWZlY3ljbGUgaG9vayBhbmQgaXNcbiAgICogdXNlZCB0byBmZXRjaCBhbmQgZGlzcGxheSBkYXRhIGluIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudC4gSXQgaXMgYW4gaW5zdGFuY2VcbiAgICogb2YgdGhlIGBQYWdpbmF0b3JgIGNsYXNzIGZyb20gdGhlIGBAZGVjYWYtdHMvY29yZWAgcGFja2FnZSwgd2hpY2ggcHJvdmlkZXNcbiAgICogbWV0aG9kcyBmb3IgcXVlcnlpbmcgYW5kIG1hbmlwdWxhdGluZyBwYWdpbmF0ZWQgZGF0YS5cbiAgICpcbiAgICogQHR5cGUge1BhZ2luYXRvcjxNb2RlbD59XG4gICAqIEBtZW1iZXJPZiBQYWdpbmF0aW9uQ29tcG9uZW50XG4gICAqL1xuICBwYWdpbmF0b3IhOiBQYWdpbmF0b3I8TW9kZWw+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxhc3QgcGFnZSBudW1iZXIgdGhhdCB3YXMgZGlzcGxheWVkLlxuICAgKiBAc3VtbWFyeSBLZWVwcyB0cmFjayBvZiB0aGUgcHJldmlvdXNseSBkaXNwbGF5ZWQgcGFnZSBudW1iZXIsIHdoaWNoIGlzIHVzZWZ1bFxuICAgKiBmb3IgaGFuZGxpbmcgbmF2aWdhdGlvbiBhbmQgc2VhcmNoIG9wZXJhdGlvbnMgaW4gcGFnaW5hdGVkIG1vZGUuXG4gICAqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqIEBkZWZhdWx0IDFcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGxhc3RQYWdlOiBudW1iZXIgPSAxXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFdmVudCBlbWl0dGVyIGZvciByZWZyZXNoIG9wZXJhdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGxpc3QgZGF0YSBpcyByZWZyZXNoZWQsIGVpdGhlciB0aHJvdWdoIHB1bGwtdG8tcmVmcmVzaFxuICAgKiBvciBwcm9ncmFtbWF0aWMgcmVmcmVzaC4gVGhlIGV2ZW50IGluY2x1ZGVzIHRoZSByZWZyZXNoZWQgZGF0YSBhbmQgY29tcG9uZW50IGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRFbWl0dGVyPEJhc2VDdXN0b21FdmVudD59XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBAT3V0cHV0KClcbiAgcmVmcmVzaEV2ZW50OiBFdmVudEVtaXR0ZXI8QmFzZUN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QmFzZUN1c3RvbUV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXZlbnQgZW1pdHRlciBmb3IgaXRlbSBjbGljayBpbnRlcmFjdGlvbnMuXG4gICAqIEBzdW1tYXJ5IEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBsaXN0IGl0ZW0gaXMgY2xpY2tlZC4gVGhlIGV2ZW50IGluY2x1ZGVzIHRoZSBkYXRhXG4gICAqIG9mIHRoZSBjbGlja2VkIGl0ZW0sIGFsbG93aW5nIHBhcmVudCBjb21wb25lbnRzIHRvIHJlc3BvbmQgdG8gdGhlIGludGVyYWN0aW9uLlxuICAgKlxuICAgKiBAdHlwZSB7RXZlbnRFbWl0dGVyPEtleVZhbHVlPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBPdXRwdXQoKVxuICBjbGlja0V2ZW50OiAgRXZlbnRFbWl0dGVyPExpc3RJdGVtQ3VzdG9tRXZlbnR8UmVuZGVyZXJDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPExpc3RJdGVtQ3VzdG9tRXZlbnR8UmVuZGVyZXJDdXN0b21FdmVudD4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN1YmplY3QgZm9yIGRlYm91bmNpbmcgY2xpY2sgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBVc2VzIFJ4SlMgU3ViamVjdCB0byBjb2xsZWN0IGNsaWNrIGV2ZW50cyBhbmQgZW1pdCB0aGVtIGFmdGVyIGEgZGVib3VuY2VcbiAgICogcGVyaW9kLiBUaGlzIHByZXZlbnRzIG11bHRpcGxlIHJhcGlkIGNsaWNrcyBmcm9tIHRyaWdnZXJpbmcgbXVsdGlwbGUgZXZlbnRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7U3ViamVjdDxDdXN0b21FdmVudCB8IExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50Pn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIHByaXZhdGUgY2xpY2tJdGVtU3ViamVjdDogU3ViamVjdDxDdXN0b21FdmVudCB8IExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50PiA9IG5ldyBTdWJqZWN0PEN1c3RvbUV2ZW50IHwgTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQ+KCk7XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFN1YmplY3QgZm9yIGRlYm91bmNpbmcgcmVwb3NpdG9yeSBvYnNlcnZhdGlvbiBldmVudHMuXG4gICAqIEBzdW1tYXJ5IFJ4SlMgU3ViamVjdCB0aGF0IGNvbGxlY3RzIHJlcG9zaXRvcnkgY2hhbmdlIGV2ZW50cyBhbmQgZW1pdHMgdGhlbSBhZnRlclxuICAgKiBhIGRlYm91bmNlIHBlcmlvZC4gVGhpcyBwcmV2ZW50cyBtdWx0aXBsZSByYXBpZCByZXBvc2l0b3J5IGNoYW5nZXMgZnJvbSB0cmlnZ2VyaW5nXG4gICAqIG11bHRpcGxlIGxpc3QgcmVmcmVzaCBvcGVyYXRpb25zLCBpbXByb3ZpbmcgcGVyZm9ybWFuY2UgYW5kIHVzZXIgZXhwZXJpZW5jZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1N1YmplY3Q8YW55Pn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgb2JzZXJ2ZXJTdWJqZXQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIE9ic2VydmVyIG9iamVjdCBmb3IgcmVwb3NpdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9ucy5cbiAgICogQHN1bW1hcnkgSW1wbGVtZW50cyB0aGUgT2JzZXJ2ZXIgaW50ZXJmYWNlIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9ucyB3aGVuIHRoZVxuICAgKiB1bmRlcmx5aW5nIGRhdGEgcmVwb3NpdG9yeSBjaGFuZ2VzLiBUaGlzIGVuYWJsZXMgYXV0b21hdGljIGxpc3QgdXBkYXRlcyB3aGVuXG4gICAqIGRhdGEgaXMgY3JlYXRlZCwgdXBkYXRlZCwgb3IgZGVsZXRlZCB0aHJvdWdoIHRoZSByZXBvc2l0b3J5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7T2JzZXJ2ZXJ9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBwcml2YXRlIG9ic2VydmVyOiBPYnNlcnZlciA9IHsgcmVmcmVzaDogYXN5bmMgKC4uLiBhcmdzOiB1bmtub3duW10pOiBQcm9taXNlPHZvaWQ+ID0+IHRoaXMub2JzZXJ2ZVJlcG9zaXRvcnkoLi4uYXJncyl9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMaXN0IG9mIGF2YWlsYWJsZSBpbmRleGVzIGZvciBkYXRhIHF1ZXJ5aW5nIGFuZCBmaWx0ZXJpbmcuXG4gICAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgbGlzdCBvZiBpbmRleCBuYW1lcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG9wdGltaXplIGRhdGEgcXVlcnlpbmcgYW5kIGZpbHRlcmluZ1xuICAgKiBvcGVyYXRpb25zLCBlc3BlY2lhbGx5IGluIHNjZW5hcmlvcyB3aXRoIGxhcmdlIGRhdGFzZXRzLlxuICAgKlxuICAgKiBJbmRleGVzIGNhbiBzaWduaWZpY2FudGx5IGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIGRhdGEgcmV0cmlldmFsIGJ5IGFsbG93aW5nIHRoZSBkYXRhYmFzZVxuICAgKiB0byBxdWlja2x5IGxvY2F0ZSBhbmQgcmV0cmlldmUgcmVsZXZhbnQgZGF0YSBiYXNlZCBvbiBpbmRleGVkIGZpZWxkcy5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ1tdfVxuICAgKiBAZGVmYXVsdCBbXVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgaW5kZXhlcyE6IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIExpc3RDb21wb25lbnQuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgTGlzdENvbXBvbmVudCBhbmQgc2V0cyB1cCB0aGUgYmFzZSBjb21wb25lbnQgd2l0aCB0aGUgYXBwcm9wcmlhdGVcbiAgICogY29tcG9uZW50IG5hbWUuIFRoaXMgY29uc3RydWN0b3IgaXMgY2FsbGVkIHdoZW4gQW5ndWxhciBpbnN0YW50aWF0ZXMgdGhlIGNvbXBvbmVudCBhbmRcbiAgICogYmVmb3JlIGFueSBpbnB1dCBwcm9wZXJ0aWVzIGFyZSBzZXQuIEl0IHBhc3NlcyB0aGUgY29tcG9uZW50IG5hbWUgdG8gdGhlIHBhcmVudCBjbGFzc1xuICAgKiBjb25zdHJ1Y3RvciB0byBlbmFibGUgcHJvcGVyIGxvY2FsaXphdGlvbiBhbmQgY29tcG9uZW50IGlkZW50aWZpY2F0aW9uLlxuICAgKlxuICAgKiBUaGUgY29uc3RydWN0b3IgaXMgaW50ZW50aW9uYWxseSBtaW5pbWFsLCB3aXRoIG1vc3QgaW5pdGlhbGl6YXRpb24gbG9naWMgZGVmZXJyZWQgdG9cbiAgICogdGhlIG5nT25Jbml0IGxpZmVjeWNsZSBob29rLiBUaGlzIGZvbGxvd3MgQW5ndWxhciBiZXN0IHByYWN0aWNlcyBieSBrZWVwaW5nIHRoZSBjb25zdHJ1Y3RvclxuICAgKiBmb2N1c2VkIG9uIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGFuZCBiYXNpYyBzZXR1cCwgd2hpbGUgY29tcGxleCBpbml0aWFsaXphdGlvbiB0aGF0IGRlcGVuZHNcbiAgICogb24gaW5wdXQgcHJvcGVydGllcyBpcyBoYW5kbGVkIGluIG5nT25Jbml0LlxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJMaXN0Q29tcG9uZW50XCIpO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgYWZ0ZXIgQW5ndWxhciBzZXRzIHRoZSBpbnB1dCBwcm9wZXJ0aWVzLlxuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBjb21wb25lbnQgYnkgaW5pdGlhbGl6aW5nIGV2ZW50IHN1YnNjcmlwdGlvbnMsIHByb2Nlc3NpbmcgYm9vbGVhblxuICAgKiBpbnB1dHMsIGFuZCBsb2FkaW5nIHRoZSBpbml0aWFsIGRhdGEuIFRoaXMgbWV0aG9kIHByZXBhcmVzIHRoZSBjb21wb25lbnQgZm9yIHVzZXJcbiAgICogaW50ZXJhY3Rpb24gYnkgZW5zdXJpbmcgYWxsIHByb3BlcnRpZXMgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkIGFuZCBkYXRhIGlzIGxvYWRlZC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQW5ndWxhciBMaWZlY3ljbGVcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExpc3RDb21wb25lbnRcbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIERhdGEgU291cmNlXG4gICAqXG4gICAqICAgQS0+Pkw6IG5nT25Jbml0KClcbiAgICogICBMLT4+TDogU2V0IHVwIGNsaWNrIGV2ZW50IGRlYm91bmNpbmdcbiAgICogICBMLT4+TDogUHJvY2VzcyBib29sZWFuIGlucHV0c1xuICAgKiAgIEwtPj5MOiBDb25maWd1cmUgY29tcG9uZW50IGJhc2VkIG9uIGlucHV0c1xuICAgKiAgIEwtPj5MOiByZWZyZXNoKClcbiAgICogICBMLT4+RDogUmVxdWVzdCBpbml0aWFsIGRhdGFcbiAgICogICBELS0+Pkw6IFJldHVybiBkYXRhXG4gICAqICAgTC0+Pkw6IFByb2Nlc3MgYW5kIGRpc3BsYXkgZGF0YVxuICAgKiAgIEwtPj5MOiBDb25maWd1cmUgZW1wdHkgc3RhdGUgaWYgbmVlZGVkXG4gICAqICAgTC0+Pkw6IGluaXRpYWxpemUoKVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbGlja0l0ZW1TdWJqZWN0LnBpcGUoZGVib3VuY2VUaW1lKDEwMCkpLnN1YnNjcmliZShldmVudCA9PiB0aGlzLmNsaWNrRXZlbnRFbWl0KGV2ZW50IGFzIExpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50KSk7XG4gICAgdGhpcy5vYnNlcnZlclN1YmpldC5waXBlKGRlYm91bmNlVGltZSgxMDApKS5zdWJzY3JpYmUoYXJncyA9PiB0aGlzLmhhbmRsZU9ic2VydmVFdmVudChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKSk7XG4gICAgdGhpcy5lbmFibGVGaWx0ZXIgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5lbmFibGVGaWx0ZXIpO1xuICAgIHRoaXMubGltaXQgPSBOdW1iZXIodGhpcy5saW1pdCk7XG4gICAgdGhpcy5zdGFydCA9IE51bWJlcih0aGlzLnN0YXJ0KTtcbiAgICB0aGlzLmluc2V0ID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuaW5zZXQpO1xuICAgIHRoaXMuc2hvd1JlZnJlc2hlciA9IHN0cmluZ1RvQm9vbGVhbih0aGlzLnNob3dSZWZyZXNoZXIpO1xuICAgIHRoaXMubG9hZE1vcmVEYXRhID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMubG9hZE1vcmVEYXRhKTtcbiAgICB0aGlzLnNob3dTZWFyY2hiYXIgPSBzdHJpbmdUb0Jvb2xlYW4odGhpcy5zaG93U2VhcmNoYmFyKTtcbiAgICB0aGlzLmRpc2FibGVTb3J0ID0gc3RyaW5nVG9Cb29sZWFuKHRoaXMuZGlzYWJsZVNvcnQpO1xuICAgIGlmKHR5cGVvZiB0aGlzLml0ZW0/LlsndGFnJ10gPT09ICdib29sZWFuJyAmJiB0aGlzLml0ZW0/LlsndGFnJ10gPT09IHRydWUpXG4gICAgICB0aGlzLml0ZW1bJ3RhZyddID0gQ29tcG9uZW50c1RhZ05hbWVzLkxJU1RfSVRFTSBhcyBzdHJpbmc7XG5cbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcblxuICAgIGlmKHRoaXMub3BlcmF0aW9ucy5pbmNsdWRlcyhPcGVyYXRpb25LZXlzLkNSRUFURSkgJiYgdGhpcy5yb3V0ZSlcbiAgICAgIHRoaXMuZW1wdHkubGluayA9IGAke3RoaXMucm91dGV9LyR7T3BlcmF0aW9uS2V5cy5DUkVBVEV9YDtcblxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuXG4gICAgaWYodGhpcy5tb2RlbCBpbnN0YW5jZW9mIE1vZGVsICYmIHRoaXMuX3JlcG9zaXRvcnkpXG4gICAgICB0aGlzLl9yZXBvc2l0b3J5Lm9ic2VydmUodGhpcy5vYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsZWFucyB1cCByZXNvdXJjZXMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgY2xlYW51cCBvcGVyYXRpb25zIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIERPTS5cbiAgICogVGhpcyBpbmNsdWRlcyBjbGVhcmluZyByZWZlcmVuY2VzIHRvIG1vZGVscyBhbmQgZGF0YSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZih0aGlzLl9yZXBvc2l0b3J5KVxuICAgICAgdGhpcy5fcmVwb3NpdG9yeS51bk9ic2VydmUodGhpcy5vYnNlcnZlcik7XG4gICAgdGhpcy5kYXRhID0gIHRoaXMubW9kZWwgPSB0aGlzLl9yZXBvc2l0b3J5ID0gdGhpcy5wYWdpbmF0b3IgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcmVwb3NpdG9yeSBvYnNlcnZhdGlvbiBldmVudHMgd2l0aCBkZWJvdW5jaW5nLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgcmVwb3NpdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBhbmQgcm91dGVzIHRoZW0gYXBwcm9wcmlhdGVseS5cbiAgICogRm9yIENSRUFURSBldmVudHMgd2l0aCBhIFVJRCwgaGFuZGxlcyB0aGVtIGltbWVkaWF0ZWx5LiBGb3Igb3RoZXIgZXZlbnRzLFxuICAgKiBwYXNzZXMgdGhlbSB0byB0aGUgZGVib3VuY2VkIG9ic2VydmVyIHN1YmplY3QgdG8gcHJldmVudCBleGNlc3NpdmUgdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHsuLi51bmtub3duW119IGFyZ3MgLSBUaGUgcmVwb3NpdG9yeSBldmVudCBhcmd1bWVudHMgaW5jbHVkaW5nIHRhYmxlLCBldmVudCB0eXBlLCBhbmQgVUlEXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgYXN5bmMgb2JzZXJ2ZVJlcG9zaXRvcnkoLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgW3RhYmxlLCBldmVudCwgdWlkXSA9IGFyZ3M7XG4gICAgaWYoZXZlbnQgPT09IE9wZXJhdGlvbktleXMuQ1JFQVRFICYmICEhdWlkKVxuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlT2JzZXJ2ZUV2ZW50KHRhYmxlIGFzIHN0cmluZywgZXZlbnQsIHVpZCBhcyBzdHJpbmcgfCBudW1iZXIpO1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVyU3ViamV0Lm5leHQoYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgc3BlY2lmaWMgcmVwb3NpdG9yeSBldmVudHMgYW5kIHVwZGF0ZXMgdGhlIGxpc3QgYWNjb3JkaW5nbHkuXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyByZXBvc2l0b3J5IGNoYW5nZSBldmVudHMgKENSRUFURSwgVVBEQVRFLCBERUxFVEUpIGFuZCBwZXJmb3Jtc1xuICAgKiB0aGUgYXBwcm9wcmlhdGUgbGlzdCBvcGVyYXRpb25zLiBUaGlzIGluY2x1ZGVzIGFkZGluZyBuZXcgaXRlbXMsIHVwZGF0aW5nIGV4aXN0aW5nXG4gICAqIG9uZXMsIG9yIHJlbW92aW5nIGRlbGV0ZWQgaXRlbXMgZnJvbSB0aGUgbGlzdCBkaXNwbGF5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgLSBUaGUgdGFibGUvbW9kZWwgbmFtZSB0aGF0IGNoYW5nZWRcbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBldmVudCAtIFRoZSB0eXBlIG9mIG9wZXJhdGlvbiAoQ1JFQVRFLCBVUERBVEUsIERFTEVURSlcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHVpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYWZmZWN0ZWQgaXRlbVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGhhbmRsZU9ic2VydmVFdmVudCh0YWJsZTogc3RyaW5nLCBldmVudDogT3BlcmF0aW9uS2V5cywgdWlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5DUkVBVEUpIHtcbiAgICAgIGlmKHVpZCkge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUNyZWF0ZSh1aWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5VUERBVEUpXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVXBkYXRlKHVpZCk7XG4gICAgICBpZihldmVudCA9PT0gT3BlcmF0aW9uS2V5cy5ERUxFVEUpXG4gICAgICAgIHRoaXMuaGFuZGxlRGVsZXRlKHVpZCk7XG4gICAgICB0aGlzLnJlZnJlc2hFdmVudEVtaXQoKTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gZm9yIHRyYWNraW5nIGl0ZW1zIGluIHRoZSBsaXN0LlxuICAgKiBAc3VtbWFyeSBQcm92aWRlcyBhIHRyYWNraW5nIGZ1bmN0aW9uIGZvciB0aGUgYCpuZ0ZvcmAgZGlyZWN0aXZlIGluIHRoZSBjb21wb25lbnQgdGVtcGxhdGUuXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpZGVudGlmeSBhbmQgY29udHJvbCB0aGUgcmVuZGVyaW5nIG9mIGl0ZW1zIGluIHRoZSBsaXN0LFxuICAgKiBwcmV2ZW50aW5nIGR1cGxpY2F0ZSBvciB1bm5lY2Vzc2FyeSByZW5kZXJpbmcuXG4gICAqXG4gICAqIFRoZSBgdHJhY2tJdGVtRm5gIGZ1bmN0aW9uIHRha2VzIHR3byBwYXJhbWV0ZXJzOiBgaW5kZXhgICh0aGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlIGxpc3QpXG4gICAqIGFuZCBgaXRlbWAgKHRoZSBhY3R1YWwgaXRlbSBmcm9tIHRoZSBsaXN0KS4gSXQgcmV0dXJucyB0aGUgdHJhY2tpbmcga2V5LCB3aGljaCBpbiB0aGlzIGNhc2VcbiAgICogaXMgdGhlIHVuaW9uIG9mIHRoZSBgdWlkYCBvZiB0aGUgaXRlbSB3aXRoIHRoZSBtb2RlbCBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlIGxpc3QuXG5cbiAgICogQHBhcmFtIHtLZXlWYWx1ZSB8IHN0cmluZyB8IG51bWJlcn0gaXRlbSAtIFRoZSBhY3R1YWwgaXRlbSBmcm9tIHRoZSBsaXN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVtYmVyfSBUaGUgdHJhY2tpbmcga2V5IGZvciB0aGUgaXRlbS5cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIG92ZXJyaWRlIHRyYWNrSXRlbUZuKGluZGV4OiBudW1iZXIsIGl0ZW06IEtleVZhbHVlIHwgc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gYCR7IChpdGVtIGFzIEtleVZhbHVlKT8uWyd1aWQnXSB8fCAoaXRlbSBhcyBLZXlWYWx1ZSk/Llt0aGlzLnBrXX0tJHtpbmRleH1gO1xuICB9XG5cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY3JlYXRlIGV2ZW50IGZyb20gdGhlIHJlcG9zaXRvcnkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB1aWQgLSBUaGUgSUQgb2YgdGhlIGl0ZW0gdG8gY3JlYXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaXRlbSBpcyBjcmVhdGVkIGFuZCBhZGRlZCB0byB0aGUgbGlzdC5cbiAgICovXG4gIGFzeW5jIGhhbmRsZUNyZWF0ZSh1aWQ6IHN0cmluZyB8IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX3JlcG9zaXRvcnk/LnJlYWQodWlkKTtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5tYXBSZXN1bHRzKFtyZXN1bHQgYXMgS2V5VmFsdWVdKVswXTtcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhID0gW2l0ZW0sIC4uLnRoaXMuaXRlbXMgfHwgW11dO1xuICB9XG5cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgdGhlIHVwZGF0ZSBldmVudCBmcm9tIHRoZSByZXBvc2l0b3J5LlxuICAgKiBAc3VtbWFyeSBVcGRhdGVzIHRoZSBsaXN0IGl0ZW0gd2l0aCB0aGUgc3BlY2lmaWVkIElEIGJhc2VkIG9uIHRoZSBuZXcgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHVpZCAtIFRoZSBJRCBvZiB0aGUgaXRlbSB0byB1cGRhdGVcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBwcml2YXRlXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBhc3luYyBoYW5kbGVVcGRhdGUodWlkOiBzdHJpbmcgfCBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpdGVtOiBLZXlWYWx1ZSA9IHRoaXMuaXRlbU1hcHBlcihhd2FpdCB0aGlzLl9yZXBvc2l0b3J5Py5yZWFkKHVpZCkgfHwge30sIHRoaXMubWFwcGVyKTtcbiAgICB0aGlzLmRhdGEgPSBbXTtcbiAgICBmb3IoY29uc3Qga2V5IGluIHRoaXMuaXRlbXMgYXMgS2V5VmFsdWVbXSkge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMuaXRlbXNba2V5XSBhcyBLZXlWYWx1ZTtcbiAgICAgICAgaWYoY2hpbGRbJ3VpZCddID09PSBpdGVtWyd1aWQnXSkge1xuICAgICAgICAgIHRoaXMuaXRlbXNba2V5XSA9IE9iamVjdC5hc3NpZ24oe30sIGNoaWxkLCBpdGVtKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZGF0YSA9IFsgLi4udGhpcy5pdGVtc107XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBsaXN0IGJ5IElELlxuICAgKiBAc3VtbWFyeSBGaWx0ZXJzIG91dCBhbiBpdGVtIHdpdGggdGhlIHNwZWNpZmllZCBJRCBmcm9tIHRoZSBkYXRhIGFycmF5IGFuZFxuICAgKiByZWZyZXNoZXMgdGhlIGxpc3QgZGlzcGxheS4gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBhZnRlciBhIGRlbGV0ZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1aWQgLSBUaGUgSUQgb2YgdGhlIGl0ZW0gdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwayAtIFRoZSBwcmltYXJ5IGtleSBmaWVsZCBuYW1lXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgaGFuZGxlRGVsZXRlKHVpZDogc3RyaW5nIHwgbnVtYmVyLCBwaz86IHN0cmluZyk6IHZvaWQgIHtcbiAgICBpZighcGspXG4gICAgICBwayA9IHRoaXMucGs7XG4gICAgdGhpcy5pdGVtcyA9IHRoaXMuZGF0YT8uZmlsdGVyKChpdGVtOiBLZXlWYWx1ZSkgPT4gaXRlbVsndWlkJ10gIT09IHVpZCkgfHwgW107XG4gIH1cblxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBjbGljayBldmVudHMgZnJvbSBsaXN0IGl0ZW1zLlxuICAgKiBAc3VtbWFyeSBMaXN0ZW5zIGZvciBnbG9iYWwgTGlzdEl0ZW1DbGlja0V2ZW50IGV2ZW50cyBhbmQgcGFzc2VzIHRoZW0gdG8gdGhlXG4gICAqIGRlYm91bmNlZCBjbGljayBzdWJqZWN0LiBUaGlzIGFsbG93cyB0aGUgY29tcG9uZW50IHRvIHJlc3BvbmQgdG8gY2xpY2tzIG9uXG4gICAqIGxpc3QgaXRlbXMgcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGV5IG9yaWdpbmF0ZSBmcm9tLlxuICAgKlxuICAgKiBAcGFyYW0ge0xpc3RJdGVtQ3VzdG9tRXZlbnQgfCBSZW5kZXJlckN1c3RvbUV2ZW50fSBldmVudCAtIFRoZSBjbGljayBldmVudFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICpcbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpMaXN0SXRlbUNsaWNrRXZlbnQnLCBbJyRldmVudCddKVxuICBoYW5kbGVDbGljayhldmVudDogTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrSXRlbVN1YmplY3QubmV4dChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgc2VhcmNoIGV2ZW50cyBmcm9tIHRoZSBzZWFyY2ggYmFyLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgc2VhcmNoIHF1ZXJpZXMgZnJvbSB0aGUgc2VhcmNoIGJhciBjb21wb25lbnQsIHVwZGF0aW5nIHRoZVxuICAgKiBkaXNwbGF5ZWQgZGF0YSBiYXNlZCBvbiB0aGUgc2VhcmNoIHRlcm0uIFRoZSBiZWhhdmlvciBkaWZmZXJzIGJldHdlZW4gaW5maW5pdGVcbiAgICogYW5kIHBhZ2luYXRlZCBtb2RlcyB0byBwcm92aWRlIHRoZSBiZXN0IHVzZXIgZXhwZXJpZW5jZSBmb3IgZWFjaCBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gdmFsdWUgLSBUaGUgc2VhcmNoIHRlcm0gb3IgdW5kZWZpbmVkIHRvIGNsZWFyIHNlYXJjaFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogZmxvd2NoYXJ0IFREXG4gICAqICAgQVtTZWFyY2ggRXZlbnRdIC0tPiBCe1R5cGUgaXMgSW5maW5pdGU/fVxuICAgKiAgIEIgLS0+fFllc3wgQ1tEaXNhYmxlIGxvYWRNb3JlRGF0YV1cbiAgICogICBCIC0tPnxOb3wgRFtFbmFibGUgbG9hZE1vcmVEYXRhXVxuICAgKiAgIEMgLS0+IEV7U2VhcmNoIHZhbHVlIHVuZGVmaW5lZD99XG4gICAqICAgRSAtLT58WWVzfCBGW0VuYWJsZSBsb2FkTW9yZURhdGFdXG4gICAqICAgRSAtLT58Tm98IEdbU3RvcmUgc2VhcmNoIHZhbHVlXVxuICAgKiAgIEQgLS0+IEdcbiAgICogICBGIC0tPiBIW1Jlc2V0IHBhZ2UgdG8gMV1cbiAgICogICBHIC0tPiBJW1JlZnJlc2ggZGF0YV1cbiAgICogICBIIC0tPiBJXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2VhcmNoYmFyRXZlbnQnLCBbJyRldmVudCddKVxuICBhc3luYyBoYW5kbGVTZWFyY2godmFsdWU6IHN0cmluZyB8IElGaWx0ZXJRdWVyeSB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmKHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURSkge1xuICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbHVlO1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IHRydWU7XG4gICAgICB0aGlzLnNlYXJjaFZhbHVlID0gdmFsdWU7XG4gICAgICBpZih2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICB0aGlzLnBhZ2UgPSB0aGlzLmxhc3RQYWdlO1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKHRydWUpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGZpbHRlciBldmVudHMgZnJvbSB0aGUgZmlsdGVyIGNvbXBvbmVudC5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGZpbHRlciBxdWVyaWVzIGZyb20gdGhlIGZpbHRlciBjb21wb25lbnQgYW5kIGFwcGxpZXMgdGhlbVxuICAgKiB0byB0aGUgbGlzdCBkYXRhLiBUaGlzIG1ldGhvZCBhY3RzIGFzIGEgYnJpZGdlIGJldHdlZW4gdGhlIGZpbHRlciBjb21wb25lbnRcbiAgICogYW5kIHRoZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSwgY29udmVydGluZyBmaWx0ZXIgcXVlcmllcyBpbnRvIHNlYXJjaCBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge0lGaWx0ZXJRdWVyeSB8IHVuZGVmaW5lZH0gdmFsdWUgLSBUaGUgZmlsdGVyIHF1ZXJ5IG9iamVjdCBvciB1bmRlZmluZWQgdG8gY2xlYXIgZmlsdGVyc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGhhbmRsZUZpbHRlcih2YWx1ZTogSUZpbHRlclF1ZXJ5IHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5oYW5kbGVTZWFyY2godmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbGVhcnMgdGhlIGN1cnJlbnQgc2VhcmNoIGFuZCByZXNldHMgdGhlIGxpc3QuXG4gICAqIEBzdW1tYXJ5IENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNsZWFycyB0aGUgc2VhcmNoIGJ5IGNhbGxpbmcgaGFuZGxlU2VhcmNoXG4gICAqIHdpdGggdW5kZWZpbmVkLiBUaGlzIHJlc2V0cyB0aGUgbGlzdCB0byBzaG93IGFsbCBkYXRhIHdpdGhvdXQgZmlsdGVyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAgICovXG4gIGFzeW5jIGNsZWFyU2VhcmNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuaGFuZGxlU2VhcmNoKHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVtaXRzIGEgcmVmcmVzaCBldmVudCB3aXRoIHRoZSBjdXJyZW50IGRhdGEuXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYW5kIGVtaXRzIGEgcmVmcmVzaCBldmVudCBjb250YWluaW5nIHRoZSBjdXJyZW50IGxpc3QgZGF0YS5cbiAgICogVGhpcyBub3RpZmllcyBwYXJlbnQgY29tcG9uZW50cyB0aGF0IHRoZSBsaXN0IGRhdGEgaGFzIGJlZW4gcmVmcmVzaGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0tleVZhbHVlW119IFtkYXRhXSAtIE9wdGlvbmFsIGRhdGEgdG8gaW5jbHVkZSBpbiB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICByZWZyZXNoRXZlbnRFbWl0KGRhdGE/OiBLZXlWYWx1ZVtdKTogdm9pZCB7XG4gICAgaWYoIWRhdGEpXG4gICAgICBkYXRhID0gdGhpcy5pdGVtcztcbiAgICB0aGlzLnNrZWxldG9uRGF0YSA9IG5ldyBBcnJheShkYXRhPy5sZW5ndGggfHwgMik7XG4gICAgdGhpcy5yZWZyZXNoRXZlbnQuZW1pdCh7XG4gICAgICBuYW1lOiBFdmVudENvbnN0YW50cy5SRUZSRVNILFxuICAgICAgZGF0YTogZGF0YSB8fCBbXSxcbiAgICAgIGNvbXBvbmVudDogdGhpcy5jb21wb25lbnROYW1lXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEVtaXRzIGEgY2xpY2sgZXZlbnQgZm9yIGEgbGlzdCBpdGVtLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgYW5kIGVtaXRzIGEgY2xpY2sgZXZlbnQgd2hlbiBhIGxpc3QgaXRlbSBpcyBjbGlja2VkLlxuICAgKiBUaGlzIGV4dHJhY3RzIHRoZSByZWxldmFudCBkYXRhIGZyb20gdGhlIGV2ZW50IGFuZCBwYXNzZXMgaXQgdG8gcGFyZW50IGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7TGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnR9IGV2ZW50IC0gVGhlIGNsaWNrIGV2ZW50XG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKlxuICAgKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSBjbGlja0V2ZW50RW1pdChldmVudDogTGlzdEl0ZW1DdXN0b21FdmVudCB8IFJlbmRlcmVyQ3VzdG9tRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZnJlc2hlcyB0aGUgbGlzdCBkYXRhIGZyb20gdGhlIGNvbmZpZ3VyZWQgc291cmNlLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBoYW5kbGVzIGJvdGggaW5pdGlhbCBkYXRhIGxvYWRpbmcgYW5kIHN1YnNlcXVlbnQgcmVmcmVzaCBvcGVyYXRpb25zLFxuICAgKiBpbmNsdWRpbmcgcHVsbC10by1yZWZyZXNoIGFuZCBpbmZpbml0ZSBzY3JvbGxpbmcuIEl0IG1hbmFnZXMgdGhlIGRhdGEgZmV0Y2hpbmcgcHJvY2VzcyxcbiAgICogdXBkYXRlcyB0aGUgY29tcG9uZW50J3Mgc3RhdGUsIGFuZCBoYW5kbGVzIHBhZ2luYXRpb24gb3IgaW5maW5pdGUgc2Nyb2xsaW5nIGxvZ2ljIGJhc2VkXG4gICAqIG9uIHRoZSBjb21wb25lbnQncyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBUaGUgbWV0aG9kIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gICAqIDEuIFNldHMgdGhlIHJlZnJlc2hpbmcgZmxhZyB0byBpbmRpY2F0ZSBhIGRhdGEgZmV0Y2ggaXMgaW4gcHJvZ3Jlc3NcbiAgICogMi4gQ2FsY3VsYXRlcyB0aGUgYXBwcm9wcmlhdGUgc3RhcnQgYW5kIGxpbWl0IHZhbHVlcyBiYXNlZCBvbiBwYWdpbmF0aW9uIHNldHRpbmdzXG4gICAqIDMuIEZldGNoZXMgZGF0YSBmcm9tIHRoZSBhcHByb3ByaWF0ZSBzb3VyY2UgKG1vZGVsIG9yIHJlcXVlc3QpXG4gICAqIDQuIFVwZGF0ZXMgdGhlIGNvbXBvbmVudCdzIGRhdGEgYW5kIGVtaXRzIGEgcmVmcmVzaCBldmVudFxuICAgKiA1LiBIYW5kbGVzIHBhZ2luYXRpb24gb3IgaW5maW5pdGUgc2Nyb2xsaW5nIHN0YXRlIHVwZGF0ZXNcbiAgICogNi4gQ29tcGxldGVzIGFueSBwcm92aWRlZCBldmVudCAobGlrZSBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50KVxuICAgKlxuICAgKiBAcGFyYW0ge0luZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfCBSZWZyZXNoZXJDdXN0b21FdmVudCB8IGJvb2xlYW59IGV2ZW50IC0gVGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSByZWZyZXNoLFxuICAgKiBvciBhIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgaXMgYSBmb3JjZWQgcmVmcmVzaFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVmcmVzaCBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBMaXN0Q29tcG9uZW50XG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBEYXRhIFNvdXJjZVxuICAgKiAgIHBhcnRpY2lwYW50IEUgYXMgRXZlbnQgU3lzdGVtXG4gICAqXG4gICAqICAgTC0+Pkw6IHJlZnJlc2goZXZlbnQpXG4gICAqICAgTC0+Pkw6IFNldCByZWZyZXNoaW5nIGZsYWdcbiAgICogICBMLT4+TDogQ2FsY3VsYXRlIHN0YXJ0IGFuZCBsaW1pdFxuICAgKiAgIGFsdCBVc2luZyBtb2RlbFxuICAgKiAgICAgTC0+PkQ6IGdldEZyb21Nb2RlbChmb3JjZSwgc3RhcnQsIGxpbWl0KVxuICAgKiAgICAgRC0tPj5MOiBSZXR1cm4gZGF0YVxuICAgKiAgIGVsc2UgVXNpbmcgcmVxdWVzdFxuICAgKiAgICAgTC0+PkQ6IGdldEZyb21SZXF1ZXN0KGZvcmNlLCBzdGFydCwgbGltaXQpXG4gICAqICAgICBELS0+Pkw6IFJldHVybiBkYXRhXG4gICAqICAgZW5kXG4gICAqICAgTC0+PkU6IHJlZnJlc2hFdmVudEVtaXQoKVxuICAgKiAgIGFsdCBJbmZpbml0ZSBzY3JvbGxpbmcgbW9kZVxuICAgKiAgICAgTC0+Pkw6IENoZWNrIGlmIHJlYWNoZWQgbGFzdCBwYWdlXG4gICAqICAgICBhbHQgTGFzdCBwYWdlIHJlYWNoZWRcbiAgICogICAgICAgTC0+Pkw6IENvbXBsZXRlIHNjcm9sbCBldmVudFxuICAgKiAgICAgICBMLT4+TDogRGlzYWJsZSBsb2FkTW9yZURhdGFcbiAgICogICAgIGVsc2UgTW9yZSBwYWdlcyBhdmFpbGFibGVcbiAgICogICAgICAgTC0+Pkw6IEluY3JlbWVudCBwYWdlIG51bWJlclxuICAgKiAgICAgICBMLT4+TDogQ29tcGxldGUgc2Nyb2xsIGV2ZW50IGFmdGVyIGRlbGF5XG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIFBhZ2luYXRlZCBtb2RlXG4gICAqICAgICBMLT4+TDogQ2xlYXIgcmVmcmVzaGluZyBmbGFnIGFmdGVyIGRlbGF5XG4gICAqICAgZW5kXG4gICAqXG4gICAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gICAqL1xuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6QmFja0J1dHRvbk5hdmlnYXRpb25FbmRFdmVudCcsIFsnJGV2ZW50J10pXG4gIGFzeW5jIHJlZnJlc2goZXZlbnQ6IEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfCBSZWZyZXNoZXJDdXN0b21FdmVudCB8IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vICBpZih0eXBlb2YgZm9yY2UgIT09ICdib29sZWFuJyAmJiBmb3JjZS50eXBlID09PSBFdmVudENvbnN0YW50cy5CQUNLX0JVVFRPTl9OQVZJR0FUSU9OKSB7XG4gICAgLy8gICAgY29uc3Qge3JlZnJlc2h9ID0gKGZvcmNlIGFzIEN1c3RvbUV2ZW50KS5kZXRhaWw7XG4gICAgLy8gICAgaWYoIXJlZnJlc2gpXG4gICAgLy8gICAgICByZXR1cm4gZmFsc2U7XG4gICAgLy8gIH1cblxuICAgIHRoaXMucmVmcmVzaGluZyA9IHRydWU7XG4gICAgY29uc3Qgc3RhcnQ6IG51bWJlciA9IHRoaXMucGFnZSA+IDEgPyAodGhpcy5wYWdlIC0gMSkgKiB0aGlzLmxpbWl0IDogdGhpcy5zdGFydDtcbiAgICBjb25zdCBsaW1pdDogbnVtYmVyID0gKHRoaXMucGFnZSAqICh0aGlzLmxpbWl0ID4gMTIgPyAxMiA6IHRoaXMubGltaXQpKTtcblxuICAgIHRoaXMuZGF0YSA9ICF0aGlzLm1vZGVsID9cbiAgICAgIGF3YWl0IHRoaXMuZ2V0RnJvbVJlcXVlc3QoISFldmVudCwgc3RhcnQsIGxpbWl0KVxuICAgICAgOiBhd2FpdCB0aGlzLmdldEZyb21Nb2RlbCghIWV2ZW50KSBhcyBLZXlWYWx1ZVtdO1xuXG4gICAgdGhpcy5yZWZyZXNoRXZlbnRFbWl0KCk7XG5cbiAgICBpZih0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEUpIHtcbiAgICAgIGlmKHRoaXMucGFnZSA9PT0gdGhpcy5wYWdlcykge1xuICAgICAgICBpZigoZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCk/LnRhcmdldClcbiAgICAgICAgICAoZXZlbnQgYXMgSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCkudGFyZ2V0LmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhZ2UgKz0gMTtcbiAgICAgICAgdGhpcy5yZWZyZXNoaW5nID0gZmFsc2U7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYoKGV2ZW50IGFzIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQpPy50YXJnZXQgJiYgKGV2ZW50IGFzIEN1c3RvbUV2ZW50KT8udHlwZSAhPT0gRXZlbnRDb25zdGFudHMuQkFDS19CVVRUT05fTkFWSUdBVElPTilcbiAgICAgICAgICAgICAgKGV2ZW50IGFzIEluZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQpLnRhcmdldC5jb21wbGV0ZSgpO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWZyZXNoaW5nID0gZmFsc2U7XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBwYWdpbmF0aW9uIGV2ZW50cyBmcm9tIHRoZSBwYWdpbmF0aW9uIGNvbXBvbmVudC5cbiAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBwYWdpbmF0aW9uIGV2ZW50cyBieSB1cGRhdGluZyB0aGUgY3VycmVudCBwYWdlIG51bWJlciBhbmRcbiAqIHJlZnJlc2hpbmcgdGhlIGxpc3QgZGF0YSB0byBkaXNwbGF5IHRoZSBzZWxlY3RlZCBwYWdlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWRcbiAqIHdoZW4gYSB1c2VyIGludGVyYWN0cyB3aXRoIHRoZSBwYWdpbmF0aW9uIGNvbnRyb2xzIHRvIG5hdmlnYXRlIGJldHdlZW4gcGFnZXMuXG4gKlxuICogQHBhcmFtIHtQYWdpbmF0aW9uQ3VzdG9tRXZlbnR9IGV2ZW50IC0gVGhlIHBhZ2luYXRpb24gZXZlbnQgY29udGFpbmluZyBwYWdlIGluZm9ybWF0aW9uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5oYW5kbGVQYWdpbmF0ZShldmVudDogUGFnaW5hdGlvbkN1c3RvbUV2ZW50KTogdm9pZCB7XG4gIGNvbnN0IHsgcGFnZX0gPSBldmVudC5kYXRhO1xuICB0aGlzLnBhZ2UgPSBwYWdlO1xuICB0aGlzLnJlZnJlc2godHJ1ZSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcHVsbC10by1yZWZyZXNoIGV2ZW50cyBmcm9tIHRoZSByZWZyZXNoZXIgY29tcG9uZW50LlxuICogQHN1bW1hcnkgUHJvY2Vzc2VzIHJlZnJlc2ggZXZlbnRzIHRyaWdnZXJlZCBieSB0aGUgdXNlciBwdWxsaW5nIGRvd24gb24gdGhlIGxpc3RcbiAqIG9yIGJ5IHByb2dyYW1tYXRpYyByZWZyZXNoIHJlcXVlc3RzLiBUaGlzIG1ldGhvZCByZWZyZXNoZXMgdGhlIGxpc3QgZGF0YSBhbmRcbiAqIGNvbXBsZXRlcyB0aGUgcmVmcmVzaGVyIGFuaW1hdGlvbiB3aGVuIHRoZSBkYXRhIGlzIGxvYWRlZC5cbiAqXG4gKiBAcGFyYW0ge0luZmluaXRlU2Nyb2xsQ3VzdG9tRXZlbnQgfCBDdXN0b21FdmVudH0gW2V2ZW50XSAtIFRoZSByZWZyZXNoIGV2ZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVmcmVzaCBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5hc3luYyBoYW5kbGVSZWZyZXNoKGV2ZW50PzogSW5maW5pdGVTY3JvbGxDdXN0b21FdmVudCB8IEN1c3RvbUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHRoaXMucmVmcmVzaChldmVudCBhcyBJbmZpbml0ZVNjcm9sbEN1c3RvbUV2ZW50IHx8IHRydWUpO1xuICBpZihldmVudCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgLy8gQW55IGNhbGxzIHRvIGxvYWQgZGF0YSBnbyBoZXJlXG4gICAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJb25SZWZyZXNoZXJFbGVtZW50KS5jb21wbGV0ZSgpO1xuICAgIH0sIDQwMCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZpbHRlcnMgZGF0YSBiYXNlZCBvbiBhIHNlYXJjaCBzdHJpbmcuXG4gKiBAc3VtbWFyeSBQcm9jZXNzZXMgdGhlIGN1cnJlbnQgZGF0YSBhcnJheSB0byBmaW5kIGl0ZW1zIHRoYXQgbWF0Y2ggdGhlIHByb3ZpZGVkXG4gKiBzZWFyY2ggc3RyaW5nLiBUaGlzIHVzZXMgdGhlIGFycmF5UXVlcnlCeVN0cmluZyB1dGlsaXR5IHRvIHBlcmZvcm0gdGhlIGZpbHRlcmluZ1xuICogYWNyb3NzIGFsbCBwcm9wZXJ0aWVzIG9mIHRoZSBpdGVtcy5cbiAqXG4gKiBAcGFyYW0ge0tleVZhbHVlW119IHJlc3VsdHMgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gc2VhcmNoIHRocm91Z2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWFyY2ggLSBUaGUgc2VhcmNoIHN0cmluZyB0byBmaWx0ZXIgYnlcbiAqIEByZXR1cm5zIHtLZXlWYWx1ZVtdfSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZmlsdGVyZWQgYXJyYXkgb2YgaXRlbXNcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG4gIHBhcnNlU2VhcmNoUmVzdWx0cyhyZXN1bHRzOiBLZXlWYWx1ZVtdLCBzZWFyY2g6IHN0cmluZyk6IEtleVZhbHVlW10ge1xuICAgIHJldHVybiByZXN1bHRzLmZpbHRlcigoaXRlbTogS2V5VmFsdWUpID0+XG4gICAgICBPYmplY3QudmFsdWVzKGl0ZW0pLnNvbWUodmFsdWUgPT5cbiAgICAgICAgICB2YWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoKHNlYXJjaCBhcyBzdHJpbmcpPy50b0xvd2VyQ2FzZSgpKVxuICAgICAgICApXG4gICAgKTtcbiAgfVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGZXRjaGVzIGRhdGEgZnJvbSBhIHJlcXVlc3Qgc291cmNlLlxuICogQHN1bW1hcnkgUmV0cmlldmVzIGRhdGEgZnJvbSB0aGUgY29uZmlndXJlZCBzb3VyY2UgZnVuY3Rpb24gb3IgVVJMLCBwcm9jZXNzZXMgaXQsXG4gKiBhbmQgdXBkYXRlcyB0aGUgY29tcG9uZW50J3MgZGF0YSBzdGF0ZS4gVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIGluaXRpYWwgZGF0YSBsb2FkaW5nXG4gKiBhbmQgc3Vic2VxdWVudCByZWZyZXNoIG9wZXJhdGlvbnMgd2hlbiB1c2luZyBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZSByYXRoZXIgdGhhbiBhIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgLSBXaGV0aGVyIHRvIGZvcmNlIGEgcmVmcmVzaCBldmVuIGlmIGRhdGEgYWxyZWFkeSBleGlzdHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCAtIFRoZSBzdGFydGluZyBpbmRleCBmb3IgcGFnaW5hdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIHJldHJpZXZlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxLZXlWYWx1ZVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZldGNoZWQgZGF0YVxuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbmFzeW5jIGdldEZyb21SZXF1ZXN0KGZvcmNlOiBib29sZWFuID0gZmFsc2UsIHN0YXJ0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBQcm9taXNlPEtleVZhbHVlW10+IHtcbiAgbGV0IHJlcXVlc3Q6IEtleVZhbHVlW10gPSBbXTtcbiAgaWYoIXRoaXMuZGF0YT8ubGVuZ3RoIHx8IGZvcmNlIHx8ICh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCB8fCAhISh0aGlzLnNlYXJjaFZhbHVlIGFzIElGaWx0ZXJRdWVyeSkpIHtcbiAgICAvLyAoc2VsZi5kYXRhIGFzIExpc3RJdGVtW10pID0gW107XG4gICAgaWYoISh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCAmJiAhKHRoaXMuc2VhcmNoVmFsdWUgYXMgSUZpbHRlclF1ZXJ5KSkge1xuICAgICAgaWYoIXRoaXMuc291cmNlICYmICF0aGlzLmRhdGE/Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdObyBkYXRhIGFuZCBzb3VyY2UgcGFzc2VkIHRvIGluZmluaXRlIGxpc3QnKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICBpZih0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEZ1bmN0aW9uKVxuICAgICAgICByZXF1ZXN0ID0gYXdhaXQgdGhpcy5zb3VyY2UoKTtcblxuICAgICAgaWYoIUFycmF5LmlzQXJyYXkocmVxdWVzdCkpXG4gICAgICAgIHJlcXVlc3QgPSByZXF1ZXN0Py5bJ3Jlc3BvbnNlJ10/LlsnZGF0YSddIHx8IHJlcXVlc3Q/LlsncmVzdWx0cyddIHx8IFtdO1xuICAgICAgdGhpcy5kYXRhID0gWy4uLiBhd2FpdCB0aGlzLnBhcnNlUmVzdWx0KHJlcXVlc3QpXTtcbiAgICAgIGlmKHRoaXMuZGF0YT8ubGVuZ3RoKVxuICAgICAgICB0aGlzLml0ZW1zID0gdGhpcy50eXBlID09PSBMaXN0Q29tcG9uZW50c1R5cGVzLklORklOSVRFID9cbiAgICAgICAgICAodGhpcy5pdGVtcyB8fCBbXSkuY29uY2F0KFsuLi50aGlzLmRhdGEuc2xpY2Uoc3RhcnQsIGxpbWl0KV0pIDogWy4uLnJlcXVlc3Quc2xpY2Uoc3RhcnQsIGxpbWl0KSBhcyBLZXlWYWx1ZVtdXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhID0gdGhpcy5wYXJzZVNlYXJjaFJlc3VsdHModGhpcy5kYXRhIGFzIFtdLCB0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk7XG4gICAgICB0aGlzLml0ZW1zID0gdGhpcy5kYXRhO1xuICAgIH1cbiAgfVxuXG4gIGlmKHRoaXMubG9hZE1vcmVEYXRhICYmIHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5QQUdJTkFURUQpXG4gICAgdGhpcy5nZXRNb3JlRGF0YSh0aGlzLmRhdGE/Lmxlbmd0aCB8fCAwKTtcbiAgcmV0dXJuIHRoaXMuZGF0YSB8fCBbXSBhcyBLZXlWYWx1ZVtdO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGZXRjaGVzIGRhdGEgZnJvbSBhIG1vZGVsIHNvdXJjZS5cbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyBkYXRhIGZyb20gdGhlIGNvbmZpZ3VyZWQgbW9kZWwgdXNpbmcgaXRzIHBhZ2luYXRpb24gb3IgZmluZCBtZXRob2RzLFxuICogcHJvY2Vzc2VzIGl0LCBhbmQgdXBkYXRlcyB0aGUgY29tcG9uZW50J3MgZGF0YSBzdGF0ZS4gVGhpcyBtZXRob2QgaGFuZGxlcyBib3RoIGluaXRpYWxcbiAqIGRhdGEgbG9hZGluZyBhbmQgc3Vic2VxdWVudCByZWZyZXNoIG9wZXJhdGlvbnMgd2hlbiB1c2luZyBhIG1vZGVsIGFzIHRoZSBkYXRhIHNvdXJjZS5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlIC0gV2hldGhlciB0byBmb3JjZSBhIHJlZnJlc2ggZXZlbiBpZiBkYXRhIGFscmVhZHkgZXhpc3RzXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgLSBUaGUgc3RhcnRpbmcgaW5kZXggZm9yIHBhZ2luYXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byByZXRyaWV2ZVxuICogQHJldHVybnMge1Byb21pc2U8S2V5VmFsdWVbXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmZXRjaGVkIGRhdGFcbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5hc3luYyBnZXRGcm9tTW9kZWwoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8S2V5VmFsdWVbXT4ge1xuICBsZXQgZGF0YSA9IFsgLi4uIHRoaXMuZGF0YSB8fCBbXV07XG4gIGxldCByZXF1ZXN0OiBLZXlWYWx1ZVtdID0gW107XG5cbiAgLy8gZ2V0dGluZyBtb2RlbCByZXBvc2l0b3J5XG4gIGlmKCF0aGlzLl9yZXBvc2l0b3J5KVxuICAgIHRoaXMuX3JlcG9zaXRvcnkgPSB0aGlzLnJlcG9zaXRvcnk7XG4gIGNvbnN0IHJlcG8gPSB0aGlzLl9yZXBvc2l0b3J5IGFzIERlY2FmUmVwb3NpdG9yeTxNb2RlbD47XG4gIGlmKCF0aGlzLmRhdGE/Lmxlbmd0aCB8fCBmb3JjZSB8fCAodGhpcy5zZWFyY2hWYWx1ZSBhcyBzdHJpbmcpPy5sZW5ndGggfHwgISEodGhpcy5zZWFyY2hWYWx1ZSBhcyBJRmlsdGVyUXVlcnkpKSB7XG4gICAgdHJ5IHtcbiAgICAgaWYoISh0aGlzLnNlYXJjaFZhbHVlIGFzIHN0cmluZyk/Lmxlbmd0aCAmJiAhKHRoaXMuc2VhcmNoVmFsdWUgYXMgSUZpbHRlclF1ZXJ5KSkge1xuICAgICAgICAodGhpcy5kYXRhIGFzIEtleVZhbHVlW10pID0gW107XG4gICAgICAgIC8vIGNvbnN0IHJhd1F1ZXJ5ID0gdGhpcy5wYXJzZVF1ZXJ5KHNlbGYubW9kZWwgYXMgUmVwb3NpdG9yeTxNb2RlbD4sIHN0YXJ0LCBsaW1pdCk7XG4gICAgICAgIC8vIHJlcXVlc3QgPSB0aGlzLnBhcnNlUmVzdWx0KGF3YWl0ICh0aGlzLm1vZGVsIGFzIGFueSk/LnBhZ2luYXRlKHN0YXJ0LCBsaW1pdCkpO1xuICAgICAgICAgIGlmKCF0aGlzLnBhZ2luYXRvcikge1xuICAgICAgICAgICAgdGhpcy5wYWdpbmF0b3IgPSBhd2FpdCByZXBvXG4gICAgICAgICAgICAgIC5zZWxlY3QoKVxuICAgICAgICAgICAgICAub3JkZXJCeShbdGhpcy5wayBhcyBrZXlvZiBNb2RlbCwgdGhpcy5zb3J0RGlyZWN0aW9uXSlcbiAgICAgICAgICAgICAgLnBhZ2luYXRlKHRoaXMubGltaXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXF1ZXN0ID0gYXdhaXQgdGhpcy5wYXJzZVJlc3VsdCh0aGlzLnBhZ2luYXRvcik7XG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGlmKCF0aGlzLmluZGV4ZXMpXG4gICAgICAgICAgdGhpcy5pbmRleGVzID0gKE9iamVjdC52YWx1ZXModGhpcy5tYXBwZXIpIHx8IFt0aGlzLnBrXSk7XG5cbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gdGhpcy5wYXJzZUNvbmRpdGlvbnModGhpcy5zZWFyY2hWYWx1ZSBhcyBzdHJpbmcgfCBudW1iZXIgfCBJRmlsdGVyUXVlcnkpO1xuICAgICAgICByZXF1ZXN0ID0gYXdhaXQgdGhpcy5wYXJzZVJlc3VsdChhd2FpdCByZXBvLnF1ZXJ5KGNvbmRpdGlvbiwgKHRoaXMuc29ydEJ5IHx8IHRoaXMucGspIGFzIGtleW9mIE1vZGVsLCB0aGlzLnNvcnREaXJlY3Rpb24pKTtcbiAgICAgICAgZGF0YSA9IFtdO1xuICAgICAgfVxuICAgICAgZGF0YSA9IHRoaXMudHlwZSA9PT0gTGlzdENvbXBvbmVudHNUeXBlcy5JTkZJTklURSA/IFsuLi4gKGRhdGEpLmNvbmNhdChyZXF1ZXN0KV0gOiBbLi4ucmVxdWVzdF07XG4gICAgfSBjYXRjaChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoKGVycm9yIGFzIEVycm9yKT8ubWVzc2FnZSB8fCBgVW5hYmxlIHRvIGZpbmQgJHt0aGlzLm1vZGVsfSBvbiByZWdpc3RyeS4gUmV0dXJuIGVtcHR5IGFycmF5IGZyb20gY29tcG9uZW50YCk7XG4gICAgfVxuICB9XG5cbiAgaWYoZGF0YT8ubGVuZ3RoKSB7XG4gICAgaWYodGhpcy5zZWFyY2hWYWx1ZSkge1xuICAgICAgdGhpcy5pdGVtcyA9IFsuLi5kYXRhXTtcbiAgICAgIGlmKHRoaXMuaXRlbXM/Lmxlbmd0aCA8PSB0aGlzLmxpbWl0KVxuICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YSA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLml0ZW1zID0gWy4uLmRhdGFdO1xuICAgIH1cbiAgfVxuICBpZih0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuUEFHSU5BVEVEICYmIHRoaXMucGFnaW5hdG9yKVxuICAgICAgdGhpcy5nZXRNb3JlRGF0YSh0aGlzLnBhZ2luYXRvci50b3RhbCk7XG4gIHJldHVybiBkYXRhIHx8IFtdIGFzIEtleVZhbHVlW107XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIHNlYXJjaCB2YWx1ZXMgb3IgZmlsdGVyIHF1ZXJpZXMgaW50byBkYXRhYmFzZSBjb25kaXRpb25zLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyBzZWFyY2ggaW5wdXQgb3IgY29tcGxleCBmaWx0ZXIgcXVlcmllcyBpbnRvIENvbmRpdGlvbiBvYmplY3RzXG4gKiB0aGF0IGNhbiBiZSB1c2VkIGZvciBkYXRhYmFzZSBxdWVyeWluZy4gSGFuZGxlcyBib3RoIHNpbXBsZSBzdHJpbmcvbnVtYmVyIHNlYXJjaGVzXG4gKiBhY3Jvc3MgaW5kZXhlZCBmaWVsZHMgYW5kIGNvbXBsZXggZmlsdGVyIHF1ZXJpZXMgd2l0aCBtdWx0aXBsZSBjcml0ZXJpYS5cbiAqXG4gKiBGb3Igc2ltcGxlIHNlYXJjaGVzIChzdHJpbmcvbnVtYmVyKTpcbiAqIC0gQ3JlYXRlcyBjb25kaXRpb25zIHRoYXQgc2VhcmNoIGFjcm9zcyBhbGwgaW5kZXhlZCBmaWVsZHNcbiAqIC0gVXNlcyBlcXVhbGl0eSBmb3IgbnVtZXJpYyB2YWx1ZXMgYW5kIHJlZ2V4IGZvciBzdHJpbmcgdmFsdWVzXG4gKiAtIENvbWJpbmVzIGNvbmRpdGlvbnMgd2l0aCBPUiBsb2dpYyB0byBzZWFyY2ggbXVsdGlwbGUgZmllbGRzXG4gKlxuICogRm9yIGNvbXBsZXggZmlsdGVyIHF1ZXJpZXM6XG4gKiAtIFByb2Nlc3NlcyBlYWNoIGZpbHRlciBpdGVtIHdpdGggaXRzIHNwZWNpZmljIGNvbmRpdGlvbiB0eXBlXG4gKiAtIFN1cHBvcnRzIEVxdWFsLCBOb3QgRXF1YWwsIENvbnRhaW5zLCBOb3QgQ29udGFpbnMsIEdyZWF0ZXIgVGhhbiwgTGVzcyBUaGFuXG4gKiAtIFVwZGF0ZXMgc29ydCBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBmaWx0ZXIgcXVlcnlcbiAqIC0gQ29tYmluZXMgbXVsdGlwbGUgZmlsdGVyIGNvbmRpdGlvbnMgd2l0aCBPUiBsb2dpY1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgSUZpbHRlclF1ZXJ5fSB2YWx1ZSAtIFRoZSBzZWFyY2ggdmFsdWUgb3IgZmlsdGVyIHF1ZXJ5IG9iamVjdFxuICogQHJldHVybnMge0NvbmRpdGlvbjxNb2RlbD59IEEgQ29uZGl0aW9uIG9iamVjdCBmb3IgZGF0YWJhc2UgcXVlcnlpbmdcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbnBhcnNlQ29uZGl0aW9ucyh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgSUZpbHRlclF1ZXJ5KTogQ29uZGl0aW9uPE1vZGVsPiB7XG4gIGxldCBfY29uZGl0aW9uOiBDb25kaXRpb248TW9kZWw+O1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFByaW1pdGl2ZXMuU1RSSU5HIHx8IHR5cGVvZiB2YWx1ZSA9PT0gUHJpbWl0aXZlcy5OVU1CRVIpIHtcbiAgICBfY29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4odGhpcy5wayBhcyBrZXlvZiBNb2RlbCkuZXEoIWlzTmFOKHZhbHVlIGFzIG51bWJlcikgPyBOdW1iZXIodmFsdWUpIDogdmFsdWUpO1xuICAgIGZvciAoY29uc3QgaW5kZXggb2YgdGhpcy5pbmRleGVzKSB7XG4gICAgICAgIGlmKGluZGV4ID09PSB0aGlzLnBrKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBsZXQgb3JDb25kaXRpb247XG4gICAgICAgIGlmKCFpc05hTih2YWx1ZSBhcyBudW1iZXIpKSB7XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkuZXEoTnVtYmVyKHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkucmVnZXhwKHZhbHVlIGFzIHN0cmluZyk7XG4gICAgICAgIH1cbiAgICAgICAgX2NvbmRpdGlvbiA9IF9jb25kaXRpb24ub3Iob3JDb25kaXRpb24pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7cXVlcnksIHNvcnR9ID0gdmFsdWUgYXMgSUZpbHRlclF1ZXJ5O1xuICAgIF9jb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPih0aGlzLnBrIGFzIGtleW9mIE1vZGVsKS5kaWYoJ251bGwnKTtcblxuICAgIGlmKHF1ZXJ5Py5sZW5ndGgpXG4gICAgICBfY29uZGl0aW9uID0gdW5kZWZpbmVkIGFzIHVua25vd24gYXMgQ29uZGl0aW9uPE1vZGVsPjtcblxuICAgIChxdWVyeSB8fCBbXSkuZm9yRWFjaCgoaXRlbTogSUZpbHRlclF1ZXJ5SXRlbSkgPT4ge1xuICAgICAgY29uc3Qge3ZhbHVlLCBjb25kaXRpb24sIGluZGV4fSA9IGl0ZW07XG4gICAgICBsZXQgdmFsID0gdmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICAgICAgaWYoaW5kZXggPT09IHRoaXMucGsgfHwgIWlzTmFOKHZhbCBhcyBudW1iZXIpKVxuICAgICAgICB2YWwgPSBOdW1iZXIodmFsKTtcbiAgICAgIGxldCBvckNvbmRpdGlvbjtcbiAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7XG4gICAgICAgIGNhc2UgXCJFcXVhbFwiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHJpYnV0ZTxNb2RlbD4oaW5kZXggYXMga2V5b2YgTW9kZWwpLmVxKHZhbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJOb3QgRXF1YWxcIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5kaWYodmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk5vdCBDb250YWluc1wiOlxuICAgICAgICAgIG9yQ29uZGl0aW9uID0gIUNvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5yZWdleHAobmV3IFJlZ0V4cChgXig/IS4qJHt2YWx9KS4qJGApKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkNvbnRhaW5zXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkucmVnZXhwKHZhbCBhcyBzdHJpbmcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiR3JlYXRlciBUaGFuXCI6XG4gICAgICAgICAgb3JDb25kaXRpb24gPSBDb25kaXRpb24uYXR0cmlidXRlPE1vZGVsPihpbmRleCBhcyBrZXlvZiBNb2RlbCkuZ3RlKHZhbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJMZXNzIFRoYW5cIjpcbiAgICAgICAgICBvckNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyaWJ1dGU8TW9kZWw+KGluZGV4IGFzIGtleW9mIE1vZGVsKS5sdGUodmFsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIF9jb25kaXRpb24gPSAoIV9jb25kaXRpb24gP1xuICAgICAgICBvckNvbmRpdGlvbiA6IF9jb25kaXRpb24uYW5kKG9yQ29uZGl0aW9uIGFzIHVua25vd24gYXMgQ29uZGl0aW9uPE1vZGVsPikpIGFzIENvbmRpdGlvbjxNb2RlbD47XG4gICAgfSk7XG5cbiAgICB0aGlzLnNvcnRCeSA9IHNvcnQ/LnZhbHVlIGFzIGtleW9mIE1vZGVsIHx8IHRoaXMucGs7XG4gICAgdGhpcy5zb3J0RGlyZWN0aW9uID0gc29ydD8uZGlyZWN0aW9uIHx8IHRoaXMuc29ydERpcmVjdGlvbjtcbiAgfVxuICByZXR1cm4gX2NvbmRpdGlvbiBhcyBDb25kaXRpb248TW9kZWw+O1xuXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBxdWVyeSByZXN1bHRzIGludG8gYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LlxuICogQHN1bW1hcnkgSGFuZGxlcyBkaWZmZXJlbnQgcmVzdWx0IGZvcm1hdHMgZnJvbSB2YXJpb3VzIGRhdGEgc291cmNlcywgZXh0cmFjdGluZ1xuICogcGFnaW5hdGlvbiBpbmZvcm1hdGlvbiB3aGVuIGF2YWlsYWJsZSBhbmQgYXBwbHlpbmcgYW55IGNvbmZpZ3VyZWQgZGF0YSBtYXBwaW5nLlxuICogVGhpcyBlbnN1cmVzIGNvbnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiB0aGUgc291cmNlLlxuICpcbiAqIEBwcm90ZWN0ZWRcbiAqIEBwYXJhbSB7S2V5VmFsdWVbXSB8IFBhZ2luYXRvcn0gcmVzdWx0IC0gVGhlIHJhdyBxdWVyeSByZXN1bHRcbiAqIEByZXR1cm5zIHtLZXlWYWx1ZVtdfSBUaGUgcHJvY2Vzc2VkIGFycmF5IG9mIGl0ZW1zXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xucHJvdGVjdGVkIGFzeW5jIHBhcnNlUmVzdWx0KHJlc3VsdDogS2V5VmFsdWVbXSB8IFBhZ2luYXRvcjxNb2RlbD4pOiBQcm9taXNlPEtleVZhbHVlW10+IHtcbiAgaWYoIUFycmF5LmlzQXJyYXkocmVzdWx0KSAmJiAoJ3BhZ2UnIGluIHJlc3VsdCAmJiAndG90YWwnIGluIHJlc3VsdCkpIHtcbiAgICBjb25zdCBwYWdpbmF0b3IgPSByZXN1bHQgYXMgUGFnaW5hdG9yPE1vZGVsPjtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgcGFnaW5hdG9yLnBhZ2UodGhpcy5wYWdlKTtcbiAgICAgIC8vIFRPRE86IENoYWdlIGZvciByZXN1bHQudG90YWw7XG4gICAgICB0aGlzLmdldE1vcmVEYXRhKHBhZ2luYXRvci50b3RhbCk7XG4gICAgfSBjYXRjaChlcnJvcjogdW5rbm93bikge1xuICAgICAgcmVzdWx0ID0gW107XG4gICAgfVxuXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5nZXRNb3JlRGF0YSgocmVzdWx0IGFzIEtleVZhbHVlW10pPy5sZW5ndGggfHwgMCk7XG4gIH1cbiAgcmV0dXJuIChPYmplY3Qua2V5cyh0aGlzLm1hcHBlciB8fCB7fSkubGVuZ3RoKSA/XG4gICAgdGhpcy5tYXBSZXN1bHRzKHJlc3VsdCkgOiByZXN1bHQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgcGFnaW5hdGlvbiBzdGF0ZSBiYXNlZCBvbiBkYXRhIGxlbmd0aC5cbiAqIEBzdW1tYXJ5IENhbGN1bGF0ZXMgd2hldGhlciBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBob3cgbWFueSBwYWdlcyBleGlzdFxuICogYmFzZWQgb24gdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBhbmQgdGhlIGNvbmZpZ3VyZWQgbGltaXQgcGVyIHBhZ2UuXG4gKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gY29udHJvbCBwYWdpbmF0aW9uIFVJIGFuZCBpbmZpbml0ZSBzY3JvbGxpbmcgYmVoYXZpb3IuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgYXZhaWxhYmxlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqXG4gKiBAbWVtYmVyT2YgTGlzdENvbXBvbmVudFxuICovXG5nZXRNb3JlRGF0YShsZW5ndGg6IG51bWJlcik6IHZvaWQge1xuICBpZih0aGlzLnR5cGUgPT09IExpc3RDb21wb25lbnRzVHlwZXMuSU5GSU5JVEUpIHtcbiAgICBpZih0aGlzLnBhZ2luYXRvcilcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCAqIHRoaXMubGltaXQ7XG4gICAgaWYobGVuZ3RoIDw9IHRoaXMubGltaXQpIHtcbiAgICAgIHRoaXMubG9hZE1vcmVEYXRhID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFnZXMgPSBNYXRoLmZsb29yKGxlbmd0aCAvIHRoaXMubGltaXQpO1xuICAgICAgaWYoKHRoaXMucGFnZXMgKiB0aGlzLmxpbWl0KSA8IGxlbmd0aClcbiAgICAgICAgdGhpcy5wYWdlcyArPSAxO1xuICAgICAgaWYodGhpcy5wYWdlcyA9PT0gMSlcbiAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5wYWdlcyA9IGxlbmd0aDtcbiAgICBpZih0aGlzLnBhZ2VzID09PSAxKVxuICAgICAgdGhpcy5sb2FkTW9yZURhdGEgPSBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIGEgc2luZ2xlIGl0ZW0gdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWFwcGVyLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyBhIGRhdGEgaXRlbSBhY2NvcmRpbmcgdG8gdGhlIG1hcHBpbmcgY29uZmlndXJhdGlvbixcbiAqIGV4dHJhY3RpbmcgbmVzdGVkIHByb3BlcnRpZXMgYW5kIGZvcm1hdHRpbmcgdmFsdWVzIGFzIG5lZWRlZC4gVGhpcyBhbGxvd3NcbiAqIHRoZSBjb21wb25lbnQgdG8gZGlzcGxheSBkYXRhIGluIGEgZm9ybWF0IGRpZmZlcmVudCBmcm9tIGhvdyBpdCdzIHN0b3JlZC5cbiAqXG4gKiBAcHJvdGVjdGVkXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBpdGVtIC0gVGhlIGl0ZW0gdG8gbWFwXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBtYXBwZXIgLSBUaGUgbWFwcGluZyBjb25maWd1cmF0aW9uXG4gKiBAcGFyYW0ge0tleVZhbHVlfSBbcHJvcHNdIC0gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIGluY2x1ZGVcbiAqIEByZXR1cm5zIHtLZXlWYWx1ZX0gVGhlIG1hcHBlZCBpdGVtXG4gKlxuICogQG1lbWJlck9mIExpc3RDb21wb25lbnRcbiAqL1xucHJvdGVjdGVkIGl0ZW1NYXBwZXIoaXRlbTogS2V5VmFsdWUsIG1hcHBlcjogS2V5VmFsdWUsIHByb3BzPzogS2V5VmFsdWUpOiBLZXlWYWx1ZSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhtYXBwZXIpLnJlZHVjZSgoYWNjdW06IEtleVZhbHVlLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBhcnJheVZhbHVlID0gdmFsdWUuc3BsaXQoJy4nKTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICBhY2N1bVtrZXldID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhcnJheVZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICB2YWx1ZSA9IGl0ZW0/Llt2YWx1ZV0gPyBpdGVtW3ZhbHVlXSA6IHZhbHVlICE9PSBrZXkgPyB2YWx1ZSA6IFwiXCI7XG4gICAgICAgIGlmKGlzVmFsaWREYXRlKHZhbHVlKSlcbiAgICAgICAgICB2YWx1ZSA9IGAke2Zvcm1hdERhdGUodmFsdWUpfWA7XG4gICAgICAgIGFjY3VtW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB2YWw7XG5cbiAgICAgICAgZm9yIChjb25zdCBfdmFsdWUgb2YgYXJyYXlWYWx1ZSlcbiAgICAgICAgICB2YWwgPSAhdmFsXG4gICAgICAgICAgICA/IGl0ZW1bX3ZhbHVlXVxuICAgICAgICAgICAgOiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHZhbCkgOiB2YWwpW192YWx1ZV07XG5cblxuICAgICAgICBpZiAoaXNWYWxpZERhdGUobmV3IERhdGUodmFsKSkpXG4gICAgICAgICAgdmFsID0gYCR7Zm9ybWF0RGF0ZSh2YWwpfWA7XG5cbiAgICAgICAgYWNjdW1ba2V5XSA9IHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogdmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMgfHwge30sIGFjY3VtKTtcbiAgfSwge30pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBzIGFsbCByZXN1bHQgaXRlbXMgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgbWFwcGVyLlxuICogQHN1bW1hcnkgQXBwbGllcyB0aGUgaXRlbU1hcHBlciB0byBlYWNoIGl0ZW0gaW4gdGhlIHJlc3VsdCBzZXQsIGFkZGluZ1xuICogY29tbW9uIHByb3BlcnRpZXMgbGlrZSBvcGVyYXRpb25zIGFuZCByb3V0ZSBpbmZvcm1hdGlvbi4gVGhpcyB0cmFuc2Zvcm1zXG4gKiB0aGUgcmF3IGRhdGEgaW50byB0aGUgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZSBsaXN0IGl0ZW0gY29tcG9uZW50cy5cbiAqXG4gKiBAcGFyYW0ge0tleVZhbHVlW119IGRhdGEgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gbWFwXG4gKiBAcmV0dXJucyB7S2V5VmFsdWVbXX0gVGhlIGFycmF5IG9mIG1hcHBlZCBpdGVtc1xuICpcbiAqIEBtZW1iZXJPZiBMaXN0Q29tcG9uZW50XG4gKi9cbiAgbWFwUmVzdWx0cyhkYXRhOiBLZXlWYWx1ZVtdKTogS2V5VmFsdWVbXSB7XG4gICAgaWYoIWRhdGEgfHwgIWRhdGEubGVuZ3RoKVxuICAgICAgcmV0dXJuIFtdO1xuICAgIC8vIHBhc3NpbmcgdWlkIGFzIHByb3AgdG8gbWFwcGVyXG4gICAgdGhpcy5tYXBwZXIgPSB7Li4uIHRoaXMubWFwcGVyLCAuLi4ge3VpZDogdGhpcy5wa319O1xuICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBvcGVyYXRpb25zOiB0aGlzLm9wZXJhdGlvbnMsXG4gICAgICByb3V0ZTogdGhpcy5yb3V0ZSxcbiAgICAgIC4uLiAgT2JqZWN0LmtleXModGhpcy5pdGVtKS5yZWR1Y2UoKGFjYzogS2V5VmFsdWUsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gdGhpcy5pdGVtW2tleV07XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSksXG4gICAgICAvLyAuLi4gKCF0aGlzLml0ZW0ucmVuZGVyID8ge30gOiAgT2JqZWN0LmtleXModGhpcy5pdGVtKS5yZWR1Y2UoKGFjYzogS2V5VmFsdWUsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAvLyAgIGFjY1trZXldID0gdGhpcy5pdGVtW2tleSBhcyBrZXlvZiBJTGlzdEl0ZW1Qcm9wXTtcbiAgICAgIC8vICAgcmV0dXJuIGFjYztcbiAgICAgIC8vIH0sIHt9KSlcbiAgICB9KTtcbiAgICByZXR1cm4gZGF0YS5yZWR1Y2UoKGFjY3VtOiBLZXlWYWx1ZVtdLCBjdXJyKSA9PiB7XG4gICAgICAgIGFjY3VtLnB1c2goey4uLiB0aGlzLml0ZW1NYXBwZXIoY3VyciwgdGhpcy5tYXBwZXIgYXMgS2V5VmFsdWUsIHByb3BzKSwgLi4uIHtwazogdGhpcy5wa319KTtcbiAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIFtdKTtcbiAgfVxufVxuXG4iLCJcbkBpZihzaG93UmVmcmVzaGVyKSB7XG4gIDxpb24tcmVmcmVzaGVyIHNsb3Q9XCJmaXhlZFwiIFtwdWxsRmFjdG9yXT1cIjFcIiBbcHVsbE1pbl09XCIxMDBcIiBbcHVsbE1heF09XCIyMDBcIiAoaW9uUmVmcmVzaCk9XCJoYW5kbGVSZWZyZXNoKCRldmVudClcIj5cbiAgICA8aW9uLXJlZnJlc2hlci1jb250ZW50IC8+XG4gIDwvaW9uLXJlZnJlc2hlcj5cbn1cblxuQGlmKHNob3dTZWFyY2hiYXIgJiYgZGF0YT8ubGVuZ3RoKSB7XG4gIEBpZihtb2RlbCAmJiBlbmFibGVGaWx0ZXIpIHtcbiAgICA8bmd4LWRlY2FmLWZpbHRlclxuICAgICAgW21vZGVsXT1cIm1vZGVsXCJcbiAgICAgIFtzb3J0RGlyZWN0aW9uXT1cInNvcnREaXJlY3Rpb25cIlxuICAgICAgW2Rpc2FibGVTb3J0XT1cImRpc2FibGVTb3J0XCJcbiAgICAgIChmaWx0ZXJFdmVudCk9XCJoYW5kbGVGaWx0ZXIoJGV2ZW50KVwiXG4gICAgICAoc2VhcmNoRXZlbnQpPVwiaGFuZGxlU2VhcmNoKCRldmVudClcIlxuICAgIC8+XG4gIH0gQGVsc2Uge1xuICAgIDxuZ3gtZGVjYWYtc2VhcmNoYmFyIFtlbWl0RXZlbnRUb1dpbmRvd109XCJmYWxzZVwiIFtkZWJvdW5jZV09XCI1MDBcIiAoc2VhcmNoRXZlbnQpPVwiaGFuZGxlU2VhcmNoKCRldmVudClcIiAvPlxuICB9XG59XG5cbkBpZihkYXRhPy5sZW5ndGgpIHtcbiAgPGlvbi1saXN0IFtpZF09XCJ1aWRcIiBbaW5zZXRdPVwiaW5zZXRcIiBbbGluZXNdPVwibGluZXNcIiAjY29tcG9uZW50PlxuICAgIEBpZihpdGVtPy50YWcpIHtcbiAgICAgIEBmb3IoY2hpbGQgb2YgaXRlbXM7IHRyYWNrIHRyYWNrSXRlbUZuKCRpbmRleCwgY2hpbGQpKSB7XG4gICAgICAgIDxuZ3gtZGVjYWYtY29tcG9uZW50LXJlbmRlcmVyXG4gICAgICAgICAgW3RhZ109XCJpdGVtLnRhZ1wiXG4gICAgICAgICAgKGxpc3RlbkV2ZW50KT1cImhhbmRsZUV2ZW50KCRldmVudClcIlxuICAgICAgICAgIFtnbG9iYWxzXT0ne1xuICAgICAgICAgICAgaXRlbTogY2hpbGQsXG4gICAgICAgICAgICBtYXBwZXI6IG1hcHBlcixcbiAgICAgICAgICAgIHJvdXRlOiByb3V0ZVxuICAgICAgICAgIH0nPlxuICAgICAgICAgIDwvbmd4LWRlY2FmLWNvbXBvbmVudC1yZW5kZXJlcj5cbiAgICAgICAgfVxuICAgIH0gQGVsc2Uge1xuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIH1cbiAgPC9pb24tbGlzdD5cblxuICBAaWYobG9hZE1vcmVEYXRhKSB7XG4gICAgQGlmKHBhZ2VzID4gMCAmJiB0eXBlID09PSAncGFnaW5hdGVkJyAmJiAhc2VhcmNoVmFsdWU/Lmxlbmd0aCkge1xuICAgICAgPG5neC1kZWNhZi1wYWdpbmF0aW9uXG4gICAgICAgIFt0b3RhbFBhZ2VzXT1cInBhZ2VzXCJcbiAgICAgICAgW2N1cnJlbnRdPVwicGFnZVwiXG4gICAgICAgIChjbGlja0V2ZW50KT1cImhhbmRsZVBhZ2luYXRlKCRldmVudClcIlxuICAgICAgLz5cblxuICAgIH0gQGVsc2Uge1xuICAgICAgPGlvbi1pbmZpbml0ZS1zY3JvbGxcbiAgICAgICAgW2NsYXNzXT1cInNlYXJjaFZhbHVlPy5sZW5ndGggPyAnZGNmLWhpZGRlbicgOiAnJ1wiXG5cbiAgICAgICAgW3Bvc2l0aW9uXT1cInNjcm9sbFBvc2l0aW9uXCJcbiAgICAgICAgW3RocmVzaG9sZF09XCJzY3JvbGxUaHJlc2hvbGRcIlxuICAgICAgICAoaW9uSW5maW5pdGUpPVwiaGFuZGxlUmVmcmVzaCgkZXZlbnQpXCI+XG4gICAgICAgIDxpb24taW5maW5pdGUtc2Nyb2xsLWNvbnRlbnQgW2xvYWRpbmdTcGlubmVyXT1cImxvYWRpbmdTcGlubmVyXCIgW2xvYWRpbmdUZXh0XT1cImxvYWRpbmdUZXh0XCIgLz5cbiAgICAgIDwvaW9uLWluZmluaXRlLXNjcm9sbD5cbiAgICB9XG4gIH1cbn0gQGVsc2Uge1xuICBAaWYocmVmcmVzaGluZykge1xuICAgIEBmb3Ioc2tsIG9mIHNrZWxldG9uRGF0YTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICA8aW9uLWl0ZW0+XG4gICAgICAgIDxpb24tdGh1bWJuYWlsIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBbYW5pbWF0ZWRdPVwidHJ1ZVwiPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICAgIDwvaW9uLXRodW1ibmFpbD5cbiAgICAgICAgPGlvbi1sYWJlbD5cbiAgICAgICAgICA8aW9uLXNrZWxldG9uLXRleHQgW2FuaW1hdGVkXT1cInRydWVcIj48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgICAgIDxpb24tdGV4dCBjbGFzcz1cImRhdGVcIiBzdHlsZT1cIndpZHRoOiAyMCU7XCI+PGlvbi1za2VsZXRvbi10ZXh0IFthbmltYXRlZF09XCJ0cnVlXCI+PC9pb24tc2tlbGV0b24tdGV4dD48L2lvbi10ZXh0PlxuICAgICAgICA8L2lvbi1sYWJlbD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgfVxuXG4gIH0gQGVsc2Uge1xuICAgIEBpZighc2VhcmNoVmFsdWU/Lmxlbmd0aCkge1xuICAgICAgPG5neC1kZWNhZi1lbXB0eS1zdGF0ZVxuICAgICAgICBbdGl0bGVdPVwiKGxvY2FsZSArICcuJysgZW1wdHkudGl0bGUpIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3N1YnRpdGxlXT1cIihsb2NhbGUgKyAnLicrIGVtcHR5LnN1YnRpdGxlKSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFtidXR0b25UZXh0XT1cImVtcHR5LnNob3dCdXR0b24gPyAobG9jYWxlICsgJy4nKyBlbXB0eS5idXR0b24gfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICBbYnV0dG9uTGlua109XCJlbXB0eS5zaG93QnV0dG9uID8gZW1wdHkucm91dGUgOiAnJ1wiXG4gICAgICAvPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPG5neC1kZWNhZi1lbXB0eS1zdGF0ZVxuICAgICAgICBpY29uPVwic2VhcmNoLW91dGxpbmVcIlxuICAgICAgICBuZ0NsYXNzPVwiZW1wdHktc2VhcmNoXCJcbiAgICAgICAgW3RyYW5zbGF0YWJsZV09XCJ0cnVlXCJcbiAgICAgICAgdGl0bGU9XCJzZWFyY2gudGl0bGVcIlxuICAgICAgICBzdWJ0aXRsZT1cInNlYXJjaC5zdWJ0aXRsZVwiXG4gICAgICAgIFtzZWFyY2hWYWx1ZV09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAvPlxuICAgIH1cbiAgfVxufVxuXG4iXX0=