igniteui-angular 17.0.0-beta.1 → 17.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +44 -0
  2. package/esm2022/lib/grids/filtering/excel-style/common.mjs +6 -1
  3. package/esm2022/lib/grids/filtering/excel-style/excel-style-filtering.component.mjs +2 -2
  4. package/esm2022/lib/grids/filtering/excel-style/excel-style-search.component.mjs +147 -6
  5. package/esm2022/lib/grids/pivot-grid/pivot-data-selector.component.mjs +2 -2
  6. package/esm2022/lib/grids/pivot-grid/pivot-grid.component.mjs +2 -2
  7. package/esm2022/lib/grids/pivot-grid/pivot-header-row.component.mjs +2 -2
  8. package/esm2022/lib/list/list-item.component.mjs +10 -4
  9. package/esm2022/lib/list/list.component.mjs +10 -4
  10. package/fesm2022/igniteui-angular.mjs +215 -58
  11. package/fesm2022/igniteui-angular.mjs.map +1 -1
  12. package/lib/core/styles/components/list/_list-component.scss +5 -0
  13. package/lib/core/styles/components/list/_list-theme.scss +10 -0
  14. package/lib/grids/filtering/excel-style/common.d.ts +8 -0
  15. package/lib/grids/filtering/excel-style/excel-style-search.component.d.ts +23 -2
  16. package/lib/list/list-item.component.d.ts +5 -3
  17. package/lib/list/list.component.d.ts +4 -2
  18. package/package.json +2 -2
  19. package/styles/igniteui-angular-dark.css +1 -1
  20. package/styles/igniteui-angular.css +1 -1
  21. package/styles/igniteui-bootstrap-dark.css +1 -1
  22. package/styles/igniteui-bootstrap-light.css +1 -1
  23. package/styles/igniteui-dark-green.css +1 -1
  24. package/styles/igniteui-fluent-dark-excel.css +1 -1
  25. package/styles/igniteui-fluent-dark-word.css +1 -1
  26. package/styles/igniteui-fluent-dark.css +1 -1
  27. package/styles/igniteui-fluent-light-excel.css +1 -1
  28. package/styles/igniteui-fluent-light-word.css +1 -1
  29. package/styles/igniteui-fluent-light.css +1 -1
  30. package/styles/igniteui-indigo-dark.css +1 -1
  31. package/styles/igniteui-indigo-light.css +1 -1
  32. package/styles/maps/igniteui-angular-dark.css.map +1 -1
  33. package/styles/maps/igniteui-angular.css.map +1 -1
  34. package/styles/maps/igniteui-bootstrap-dark.css.map +1 -1
  35. package/styles/maps/igniteui-bootstrap-light.css.map +1 -1
  36. package/styles/maps/igniteui-dark-green.css.map +1 -1
  37. package/styles/maps/igniteui-fluent-dark-excel.css.map +1 -1
  38. package/styles/maps/igniteui-fluent-dark-word.css.map +1 -1
  39. package/styles/maps/igniteui-fluent-dark.css.map +1 -1
  40. package/styles/maps/igniteui-fluent-light-excel.css.map +1 -1
  41. package/styles/maps/igniteui-fluent-light-word.css.map +1 -1
  42. package/styles/maps/igniteui-fluent-light.css.map +1 -1
  43. package/styles/maps/igniteui-indigo-dark.css.map +1 -1
  44. package/styles/maps/igniteui-indigo-light.css.map +1 -1
@@ -171,9 +171,10 @@ export class IgxListItemComponent {
171
171
  * @hidden
172
172
  */
173
173
  this.lastPanDir = IgxListPanState.NONE;
174
+ this._role = '';
174
175
  }
175
176
  /**
176
- * Gets the `role` attribute of the `list item`.
177
+ * Gets/Sets the `role` attribute of the `list item`.
177
178
  * ```typescript
178
179
  * let itemRole = this.listItem.role;
179
180
  * ```
@@ -181,7 +182,10 @@ export class IgxListItemComponent {
181
182
  * @memberof IgxListItemComponent
182
183
  */
183
184
  get role() {
184
- return this.isHeader ? 'separator' : 'listitem';
185
+ return this._role ? this._role : this.isHeader ? 'separator' : 'listitem';
186
+ }
187
+ set role(val) {
188
+ this._role = val;
185
189
  }
186
190
  /**
187
191
  * Indicates whether `list item` should have header style.
@@ -372,7 +376,7 @@ export class IgxListItemComponent {
372
376
  this.hideLeftAndRightPanTemplates();
373
377
  }
374
378
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: IgxListItemComponent, deps: [{ token: i1.IgxListBaseDirective }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
375
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.0.1", type: IgxListItemComponent, isStandalone: true, selector: "igx-list-item", inputs: { isHeader: ["isHeader", "isHeader", booleanAttribute], hidden: ["hidden", "hidden", booleanAttribute], index: "index" }, host: { listeners: { "click": "clicked($event)", "panstart": "panStart()", "pancancel": "panCancel()", "panmove": "panMove($event)", "panend": "panEnd()" }, properties: { "attr.aria-label": "this.ariaLabel", "style.touch-action": "this.touchAction", "attr.role": "this.role", "class.igx-list__header": "this.headerStyle", "class.igx-list__item-base": "this.innerStyle", "style.display": "this.display" } }, providers: [HammerGesturesManager], viewQueries: [{ propertyName: "leftPanningTemplateElement", first: true, predicate: ["leftPanningTmpl"], descendants: true }, { propertyName: "rightPanningTemplateElement", first: true, predicate: ["rightPanningTmpl"], descendants: true }], ngImport: i0, template: "\n<div *ngIf=\"!isHeader && list.listItemLeftPanningTemplate\" #leftPanningTmpl class=\"igx-list__item-right\"\n [style.width.rem]=\"offsetWidthInRem\" [style.height.rem]=\"offsetHeightInRem\">\n <ng-container *ngTemplateOutlet=\"list.listItemLeftPanningTemplate.template; context: context\">\n </ng-container>\n</div>\n\n<div *ngIf=\"!isHeader && list.listItemRightPanningTemplate\" #rightPanningTmpl class=\"igx-list__item-left\"\n [style.width.rem]=\"offsetWidthInRem\" [style.height.rem]=\"offsetHeightInRem\">\n <ng-container *ngTemplateOutlet=\"list.listItemRightPanningTemplate.template; context: context\">\n </ng-container>\n</div>\n\n<ng-template #itemsContent>\n <ng-content></ng-content>\n</ng-template>\n\n<ng-template #itemThumbnails>\n <div class=\"igx-list__item-thumbnail\">\n <ng-content select=\"[igxListThumbnail], igx-list__item-thumbnail, igx-avatar\"></ng-content>\n </div>\n</ng-template>\n\n<ng-template #itemLines>\n <div class=\"igx-list__item-lines\">\n <ng-content select=\"[igxListLine], .igx-list__item-lines, [igxListLineTitle], [igxListLineSubTitle], .igx-list__item-line-title, .igx-list__item-line-subtitle\"></ng-content>\n </div>\n</ng-template>\n\n<ng-template #itemActions>\n <div class=\"igx-list__item-actions\">\n <ng-content select=\"[igxListAction], .igx-list__item-actions\"></ng-content>\n </div>\n</ng-template>\n\n<ng-container *ngIf=\"isHeader\">\n <ng-container *ngTemplateOutlet=\"itemsContent\"></ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"!isHeader\">\n <div class=\"igx-list__item-content\">\n <ng-container *ngTemplateOutlet=\"itemThumbnails\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemLines\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemActions\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemsContent\"></ng-container>\n </div>\n</ng-container>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
379
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.0.1", type: IgxListItemComponent, isStandalone: true, selector: "igx-list-item", inputs: { isHeader: ["isHeader", "isHeader", booleanAttribute], hidden: ["hidden", "hidden", booleanAttribute], index: "index", role: "role" }, host: { listeners: { "click": "clicked($event)", "panstart": "panStart()", "pancancel": "panCancel()", "panmove": "panMove($event)", "panend": "panEnd()" }, properties: { "attr.aria-label": "this.ariaLabel", "style.touch-action": "this.touchAction", "attr.role": "this.role", "class.igx-list__header": "this.headerStyle", "class.igx-list__item-base": "this.innerStyle", "style.display": "this.display" } }, providers: [HammerGesturesManager], viewQueries: [{ propertyName: "leftPanningTemplateElement", first: true, predicate: ["leftPanningTmpl"], descendants: true }, { propertyName: "rightPanningTemplateElement", first: true, predicate: ["rightPanningTmpl"], descendants: true }], ngImport: i0, template: "\n<div *ngIf=\"!isHeader && list.listItemLeftPanningTemplate\" #leftPanningTmpl class=\"igx-list__item-right\"\n [style.width.rem]=\"offsetWidthInRem\" [style.height.rem]=\"offsetHeightInRem\">\n <ng-container *ngTemplateOutlet=\"list.listItemLeftPanningTemplate.template; context: context\">\n </ng-container>\n</div>\n\n<div *ngIf=\"!isHeader && list.listItemRightPanningTemplate\" #rightPanningTmpl class=\"igx-list__item-left\"\n [style.width.rem]=\"offsetWidthInRem\" [style.height.rem]=\"offsetHeightInRem\">\n <ng-container *ngTemplateOutlet=\"list.listItemRightPanningTemplate.template; context: context\">\n </ng-container>\n</div>\n\n<ng-template #itemsContent>\n <ng-content></ng-content>\n</ng-template>\n\n<ng-template #itemThumbnails>\n <div class=\"igx-list__item-thumbnail\">\n <ng-content select=\"[igxListThumbnail], igx-list__item-thumbnail, igx-avatar\"></ng-content>\n </div>\n</ng-template>\n\n<ng-template #itemLines>\n <div class=\"igx-list__item-lines\">\n <ng-content select=\"[igxListLine], .igx-list__item-lines, [igxListLineTitle], [igxListLineSubTitle], .igx-list__item-line-title, .igx-list__item-line-subtitle\"></ng-content>\n </div>\n</ng-template>\n\n<ng-template #itemActions>\n <div class=\"igx-list__item-actions\">\n <ng-content select=\"[igxListAction], .igx-list__item-actions\"></ng-content>\n </div>\n</ng-template>\n\n<ng-container *ngIf=\"isHeader\">\n <ng-container *ngTemplateOutlet=\"itemsContent\"></ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"!isHeader\">\n <div class=\"igx-list__item-content\">\n <ng-container *ngTemplateOutlet=\"itemThumbnails\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemLines\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemActions\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemsContent\"></ng-container>\n </div>\n</ng-container>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
376
380
  }
377
381
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: IgxListItemComponent, decorators: [{
378
382
  type: Component,
@@ -400,6 +404,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImpor
400
404
  }], role: [{
401
405
  type: HostBinding,
402
406
  args: ['attr.role']
407
+ }, {
408
+ type: Input
403
409
  }], headerStyle: [{
404
410
  type: HostBinding,
405
411
  args: ['class.igx-list__header']
@@ -425,4 +431,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImpor
425
431
  type: HostListener,
426
432
  args: ['panend']
427
433
  }] } });
428
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9saXN0L2xpc3QtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvbGlzdC9saXN0LWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBRVQsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBRUwsU0FBUyxFQUNULGdCQUFnQixFQUNuQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0gsZUFBZSxFQUdsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQUV6RDs7Ozs7Ozs7Ozs7OztHQWFHO0FBU0gsTUFBTSxPQUFPLG9CQUFvQjtJQTJGN0I7Ozs7Ozs7T0FPRztJQUNILElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQ1csS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQVcsS0FBSyxDQUFDLEtBQWE7UUFD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SUFBSSxFQUFFLGdCQUFnQixDQUFDOzBJQVUxQiwwQkFBMEI7c0JBRGhDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQVVyQiwyQkFBMkI7c0JBRGpDLFNBQVM7dUJBQUMsa0JBQWtCO2dCQWV0QixRQUFRO3NCQURkLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBZ0IvQixNQUFNO3NCQURaLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBZS9CLFNBQVM7c0JBRGYsV0FBVzt1QkFBQyxpQkFBaUI7Z0JBVXZCLFdBQVc7c0JBRGpCLFdBQVc7dUJBQUMsb0JBQW9CO2dCQTRDdEIsS0FBSztzQkFEZixLQUFLO2dCQXNISyxJQUFJO3NCQURkLFdBQVc7dUJBQUMsV0FBVztnQkFjYixXQUFXO3NCQURyQixXQUFXO3VCQUFDLHdCQUF3QjtnQkFjMUIsVUFBVTtzQkFEcEIsV0FBVzt1QkFBQywyQkFBMkI7Z0JBYzdCLE9BQU87c0JBRGpCLFdBQVc7dUJBQUMsZUFBZTtnQkFTckIsT0FBTztzQkFEYixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVMUIsUUFBUTtzQkFEZCxZQUFZO3VCQUFDLFVBQVU7Z0JBZ0JqQixTQUFTO3NCQURmLFlBQVk7dUJBQUMsV0FBVztnQkFVbEIsT0FBTztzQkFEYixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFzQjVCLE1BQU07c0JBRFosWUFBWTt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFZpZXdDaGlsZCxcbiAgICBib29sZWFuQXR0cmlidXRlXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge1xuICAgIElneExpc3RQYW5TdGF0ZSxcbiAgICBJTGlzdENoaWxkLFxuICAgIElneExpc3RCYXNlRGlyZWN0aXZlXG59IGZyb20gJy4vbGlzdC5jb21tb24nO1xuXG5pbXBvcnQgeyBIYW1tZXJHZXN0dXJlc01hbmFnZXIgfSBmcm9tICcuLi9jb3JlL3RvdWNoJztcbmltcG9ydCB7IHJlbSB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbi8qKlxuICogVGhlIElnbml0ZSBVSSBMaXN0IEl0ZW0gY29tcG9uZW50IGlzIGEgY29udGFpbmVyIGludGVuZGVkIGZvciByb3cgaXRlbXMgaW4gdGhlIElnbml0ZSBVSSBmb3IgQW5ndWxhciBMaXN0IGNvbXBvbmVudC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgaHRtbFxuICogPGlneC1saXN0PlxuICogICA8aWd4LWxpc3QtaXRlbSBpc0hlYWRlcj1cInRydWVcIj5Db250YWN0czwvaWd4LWxpc3QtaXRlbT5cbiAqICAgPGlneC1saXN0LWl0ZW0gKm5nRm9yPVwibGV0IGNvbnRhY3Qgb2YgY29udGFjdHNcIj5cbiAqICAgICA8c3BhbiBjbGFzcz1cIm5hbWVcIj57eyBjb250YWN0Lm5hbWUgfX08L3NwYW4+XG4gKiAgICAgPHNwYW4gY2xhc3M9XCJwaG9uZVwiPnt7IGNvbnRhY3QucGhvbmUgfX08L3NwYW4+XG4gKiAgIDwvaWd4LWxpc3QtaXRlbT5cbiAqIDwvaWd4LWxpc3Q+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgcHJvdmlkZXJzOiBbSGFtbWVyR2VzdHVyZXNNYW5hZ2VyXSxcbiAgICBzZWxlY3RvcjogJ2lneC1saXN0LWl0ZW0nLFxuICAgIHRlbXBsYXRlVXJsOiAnbGlzdC1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0XVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hMaXN0SXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIElMaXN0Q2hpbGQge1xuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIHRoZSB0ZW1wbGF0ZSdzIGJhc2UgZWxlbWVudCBzaG93biB3aGVuIGxlZnQgcGFubmluZyBhIGxpc3QgaXRlbS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbGVmdFBhblRtcGwgPSB0aGlzLmxpc3RJdGVtLmxlZnRQYW5uaW5nVGVtcGxhdGVFbGVtZW50O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2xlZnRQYW5uaW5nVG1wbCcpXG4gICAgcHVibGljIGxlZnRQYW5uaW5nVGVtcGxhdGVFbGVtZW50O1xuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gdGhlIHRlbXBsYXRlJ3MgYmFzZSBlbGVtZW50IHNob3duIHdoZW4gcmlnaHQgcGFubmluZyBhIGxpc3QgaXRlbS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcmlnaHRQYW5UbXBsID0gdGhpcy5saXN0SXRlbS5yaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgncmlnaHRQYW5uaW5nVG1wbCcpXG4gICAgcHVibGljIHJpZ2h0UGFubmluZ1RlbXBsYXRlRWxlbWVudDtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBgbGlzdCBpdGVtYCBpcyBhIGhlYWRlci5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1saXN0LWl0ZW0gW2lzSGVhZGVyXSA9IFwidHJ1ZVwiPkhlYWRlcjwvaWd4LWxpc3QtaXRlbT5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzSGVhZGVyID0gIHRoaXMubGlzdEl0ZW0uaXNIZWFkZXI7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgaXNIZWFkZXI6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgYGxpc3QgaXRlbWAgaXMgaGlkZGVuLlxuICAgICAqIEJ5IGRlZmF1bHQgdGhlIGBoaWRkZW5gIHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdC1pdGVtIFtoaWRkZW5dID0gXCJ0cnVlXCI+SGlkZGVuIEl0ZW08L2lneC1saXN0LWl0ZW0+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0hpZGRlbiA9ICB0aGlzLmxpc3RJdGVtLmhpZGRlbjtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBoaWRkZW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZSBvZiB0aGUgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMubGlzdEl0ZW0uYXJpYUxhYmVsID0gXCJJdGVtMVwiO1xuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXRlbUFyaWFMYWJlbCA9IHRoaXMubGlzdEl0ZW0uYXJpYUxhYmVsO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbGFiZWwnKVxuICAgIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB0b3VjaC1hY3Rpb25gIHN0eWxlIG9mIHRoZSBgbGlzdCBpdGVtYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHRvdWNoQWN0aW9uID0gdGhpcy5saXN0SXRlbS50b3VjaEFjdGlvbjtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLnRvdWNoLWFjdGlvbicpXG4gICAgcHVibGljIHRvdWNoQWN0aW9uID0gJ3Bhbi15JztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9wYW5TdGF0ZTogSWd4TGlzdFBhblN0YXRlID0gSWd4TGlzdFBhblN0YXRlLk5PTkU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYW5PZmZzZXQgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX2luZGV4OiBudW1iZXIgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgbGFzdFBhbkRpciA9IElneExpc3RQYW5TdGF0ZS5OT05FO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHBhblN0YXRlYCBvZiBhIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXRlbVBhblN0YXRlID0gIHRoaXMubGlzdEl0ZW0ucGFuU3RhdGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhblN0YXRlKCk6IElneExpc3RQYW5TdGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYW5TdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgaW5kZXhgIG9mIGEgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpdGVtSW5kZXggPSAgdGhpcy5saXN0SXRlbS5pbmRleDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5kZXggIT09IG51bGwgPyB0aGlzLl9pbmRleCA6IHRoaXMubGlzdC5jaGlsZHJlbi50b0FycmF5KCkuaW5kZXhPZih0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgaW5kZXhgIG9mIHRoZSBgbGlzdCBpdGVtYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5saXN0SXRlbS5pbmRleCA9IGluZGV4O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBpbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2luZGV4ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBlbGVtZW50IHJlZmVyZW5jZSB0byB0aGUgbGlzdCBpdGVtLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGlzdEl0ZW1FbGVtZW50ID0gIHRoaXMubGlzdEl0ZW0uZWxlbWVudC5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgY29udGFpbmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBsaXN0IGl0ZW0ncyBjb250ZW50LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGlzdEl0ZW1Db250YWluZXIgPSAgdGhpcy5saXN0SXRlbS5jb250ZW50RWxlbWVudC5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29udGVudEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSB0aGlzLmVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaWd4LWxpc3RfX2l0ZW0tY29udGVudCcpO1xuICAgICAgICByZXR1cm4gKGNhbmRpZGF0ZXMgJiYgY2FuZGlkYXRlcy5sZW5ndGggPiAwKSA/IGNhbmRpZGF0ZXNbMF0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBjb250ZXh0YCBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgYHRlbXBsYXRlIGNvbnRleHRgIGJpbmRpbmcgaW50byB0aGUgYGxpc3QgaXRlbSBjb250YWluZXJgXG4gICAgICogYnkgcHJvdmlkaW5nIHRoZSBgJGltcGxpY2l0YCBkZWNsYXJhdGlvbiB3aGljaCBpcyB0aGUgYElneExpc3RJdGVtQ29tcG9uZW50YCBpdHNlbGYuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsaXN0SXRlbUNvbXBvbmVudCA9IHRoaXMubGlzdEl0ZW0uY29udGV4dDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICRpbXBsaWNpdDogdGhpc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIGEgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpdGVtV2lkdGggPSB0aGlzLmxpc3RJdGVtLndpZHRoO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCB3aWR0aCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1heGltdW0gbGVmdCBwb3NpdGlvbiBvZiB0aGUgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBtYXhMZWZ0ID0gdGhpcy5saXN0SXRlbS5tYXhMZWZ0O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhMZWZ0KCkge1xuICAgICAgICByZXR1cm4gLXRoaXMud2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbWF4aW11bSByaWdodCBwb3NpdGlvbiBvZiB0aGUgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBtYXhSaWdodCA9IHRoaXMubGlzdEl0ZW0ubWF4UmlnaHQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1heFJpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy53aWR0aDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IG9mZnNldFdpZHRoSW5SZW0oKSB7XG4gICAgICAgIHJldHVybiByZW0odGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IG9mZnNldEhlaWdodEluUmVtKCkge1xuICAgICAgICByZXR1cm4gcmVtKHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgbGlzdDogSWd4TGlzdEJhc2VEaXJlY3RpdmUsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGByb2xlYCBhdHRyaWJ1dGUgb2YgdGhlIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXRlbVJvbGUgPSAgdGhpcy5saXN0SXRlbS5yb2xlO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyBnZXQgcm9sZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIZWFkZXIgPyAnc2VwYXJhdG9yJyA6ICdsaXN0aXRlbSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYGxpc3QgaXRlbWAgc2hvdWxkIGhhdmUgaGVhZGVyIHN0eWxlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaGVhZGVyU3R5bGUgPSAgdGhpcy5saXN0SXRlbS5oZWFkZXJTdHlsZTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWxpc3RfX2hlYWRlcicpXG4gICAgcHVibGljIGdldCBoZWFkZXJTdHlsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIZWFkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgaW5uZXIgc3R5bGUgb2YgdGhlIGBsaXN0IGl0ZW1gIGlmIHRoZSBpdGVtIGlzIG5vdCBjb3VudGVkIGFzIGhlYWRlci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlubmVyU3R5bGUgPSAgdGhpcy5saXN0SXRlbS5pbm5lclN0eWxlO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtbGlzdF9faXRlbS1iYXNlJylcbiAgICBwdWJsaWMgZ2V0IGlubmVyU3R5bGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0hlYWRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHN0cmluZyB2YWx1ZSB3aGljaCBkZXNjcmliZXMgdGhlIGRpc3BsYXkgbW9kZSBvZiB0aGUgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0hpZGRlbiA9IHRoaXMubGlzdEl0ZW0uZGlzcGxheTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUuZGlzcGxheScpXG4gICAgcHVibGljIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmhpZGRlbiA/ICdub25lJyA6ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIGNsaWNrZWQoZXZ0KSB7XG4gICAgICAgIHRoaXMubGlzdC5pdGVtQ2xpY2tlZC5lbWl0KHsgaXRlbTogdGhpcywgZXZlbnQ6IGV2dCwgZGlyZWN0aW9uOiB0aGlzLmxhc3RQYW5EaXIgfSk7XG4gICAgICAgIHRoaXMubGFzdFBhbkRpciA9IElneExpc3RQYW5TdGF0ZS5OT05FO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW5zdGFydCcpXG4gICAgcHVibGljIHBhblN0YXJ0KCkge1xuICAgICAgICBpZiAodGhpcy5pc1RydWUodGhpcy5pc0hlYWRlcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNUcnVlKHRoaXMubGlzdC5hbGxvd0xlZnRQYW5uaW5nKSAmJiAhdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93UmlnaHRQYW5uaW5nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5saXN0LnN0YXJ0UGFuLmVtaXQoeyBpdGVtOiB0aGlzLCBkaXJlY3Rpb246IHRoaXMubGFzdFBhbkRpciwga2VlcGl0ZW06IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW5jYW5jZWwnKVxuICAgIHB1YmxpYyBwYW5DYW5jZWwoKSB7XG4gICAgICAgIHRoaXMucmVzZXRQYW5Qb3NpdGlvbigpO1xuICAgICAgICB0aGlzLmxpc3QuZW5kUGFuLmVtaXQoeyBpdGVtOiB0aGlzLCBkaXJlY3Rpb246IHRoaXMubGFzdFBhbkRpciwga2VlcEl0ZW06IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW5tb3ZlJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgcGFuTW92ZShldikge1xuICAgICAgICBpZiAodGhpcy5pc1RydWUodGhpcy5pc0hlYWRlcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNUcnVlKHRoaXMubGlzdC5hbGxvd0xlZnRQYW5uaW5nKSAmJiAhdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93UmlnaHRQYW5uaW5nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzUGFubmluZ1RvTGVmdCA9IGV2LmRlbHRhWCA8IDA7XG4gICAgICAgIGlmIChpc1Bhbm5pbmdUb0xlZnQgJiYgdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93TGVmdFBhbm5pbmcpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dMZWZ0UGFuVGVtcGxhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudEVsZW1lbnRMZWZ0KE1hdGgubWF4KHRoaXMubWF4TGVmdCwgZXYuZGVsdGFYKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzUGFubmluZ1RvTGVmdCAmJiB0aGlzLmlzVHJ1ZSh0aGlzLmxpc3QuYWxsb3dSaWdodFBhbm5pbmcpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dSaWdodFBhblRlbXBsYXRlKCk7XG4gICAgICAgICAgICB0aGlzLnNldENvbnRlbnRFbGVtZW50TGVmdChNYXRoLm1pbih0aGlzLm1heFJpZ2h0LCBldi5kZWx0YVgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW5lbmQnKVxuICAgIHB1YmxpYyBwYW5FbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzVHJ1ZSh0aGlzLmlzSGVhZGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93TGVmdFBhbm5pbmcpICYmICF0aGlzLmlzVHJ1ZSh0aGlzLmxpc3QuYWxsb3dSaWdodFBhbm5pbmcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgdHJhbnNsYXRpb24gb2Zmc2V0IG9mIHRoZSBjdXJyZW50IGxpc3QgaXRlbSBjb250ZW50XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlT2Zmc2V0ID0gdGhpcy5wYW5PZmZzZXQ7XG4gICAgICAgIGNvbnN0IHdpZHRoVHJpZ2dlcmluZ0dyaXAgPSB0aGlzLndpZHRoICogdGhpcy5saXN0LnBhbkVuZFRyaWdnZXJpbmdUaHJlc2hvbGQ7XG5cbiAgICAgICAgaWYgKHJlbGF0aXZlT2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIG5vIHBhbm5pbmcgaGFzIG9jY3VyZWRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpciA9IHJlbGF0aXZlT2Zmc2V0ID4gMCA/IElneExpc3RQYW5TdGF0ZS5SSUdIVCA6IElneExpc3RQYW5TdGF0ZS5MRUZUO1xuICAgICAgICB0aGlzLmxhc3RQYW5EaXIgPSBkaXI7XG5cbiAgICAgICAgY29uc3QgYXJncyA9IHsgaXRlbTogdGhpcywgZGlyZWN0aW9uOiBkaXIsIGtlZXBJdGVtOiBmYWxzZSB9O1xuICAgICAgICB0aGlzLmxpc3QuZW5kUGFuLmVtaXQoYXJncyk7XG5cbiAgICAgICAgY29uc3Qgb2xkUGFuU3RhdGUgPSB0aGlzLl9wYW5TdGF0ZTtcbiAgICAgICAgaWYgKE1hdGguYWJzKHJlbGF0aXZlT2Zmc2V0KSA8IHdpZHRoVHJpZ2dlcmluZ0dyaXApIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRQYW5Qb3NpdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5saXN0LnJlc2V0UGFuLmVtaXQodGhpcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlyID09PSBJZ3hMaXN0UGFuU3RhdGUuTEVGVCkge1xuICAgICAgICAgICAgdGhpcy5saXN0LmxlZnRQYW4uZW1pdChhcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGlzdC5yaWdodFBhbi5lbWl0KGFyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3Mua2VlcEl0ZW0gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudEVsZW1lbnRMZWZ0KDApO1xuICAgICAgICAgICAgdGhpcy5fcGFuU3RhdGUgPSBJZ3hMaXN0UGFuU3RhdGUuTk9ORTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkaXIgPT09IElneExpc3RQYW5TdGF0ZS5MRUZUKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDb250ZW50RWxlbWVudExlZnQodGhpcy5tYXhMZWZ0KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYW5TdGF0ZSA9IElneExpc3RQYW5TdGF0ZS5MRUZUO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbnRlbnRFbGVtZW50TGVmdCh0aGlzLm1heFJpZ2h0KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYW5TdGF0ZSA9IElneExpc3RQYW5TdGF0ZS5SSUdIVDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvbGRQYW5TdGF0ZSAhPT0gdGhpcy5fcGFuU3RhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MyID0geyBvbGRTdGF0ZTogb2xkUGFuU3RhdGUsIG5ld1N0YXRlOiB0aGlzLl9wYW5TdGF0ZSwgaXRlbTogdGhpcyB9O1xuICAgICAgICAgICAgdGhpcy5saXN0LnBhblN0YXRlQ2hhbmdlLmVtaXQoYXJnczIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGlkZUxlZnRBbmRSaWdodFBhblRlbXBsYXRlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNob3dMZWZ0UGFuVGVtcGxhdGUoKSB7XG4gICAgICAgIHRoaXMuc2V0TGVmdEFuZFJpZ2h0VGVtcGxhdGVzVmlzaWJpbGl0eSgndmlzaWJsZScsICdoaWRkZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzaG93UmlnaHRQYW5UZW1wbGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zZXRMZWZ0QW5kUmlnaHRUZW1wbGF0ZXNWaXNpYmlsaXR5KCdoaWRkZW4nLCAndmlzaWJsZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIGhpZGVMZWZ0QW5kUmlnaHRQYW5UZW1wbGF0ZXMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRMZWZ0QW5kUmlnaHRUZW1wbGF0ZXNWaXNpYmlsaXR5KCdoaWRkZW4nLCAnaGlkZGVuJyk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0TGVmdEFuZFJpZ2h0VGVtcGxhdGVzVmlzaWJpbGl0eShsZWZ0VmlzaWJpbGl0eSwgcmlnaHRWaXNpYmlsaXR5KSB7XG4gICAgICAgIGlmICh0aGlzLmxlZnRQYW5uaW5nVGVtcGxhdGVFbGVtZW50ICYmIHRoaXMubGVmdFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5sZWZ0UGFubmluZ1RlbXBsYXRlRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBsZWZ0VmlzaWJpbGl0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQgJiYgdGhpcy5yaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5yaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gcmlnaHRWaXNpYmlsaXR5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0Q29udGVudEVsZW1lbnRMZWZ0KHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5wYW5PZmZzZXQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jb250ZW50RWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgnICsgdmFsdWUgKyAncHgpJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc1RydWUodmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzZXRQYW5Qb3NpdGlvbigpIHtcbiAgICAgICAgdGhpcy5zZXRDb250ZW50RWxlbWVudExlZnQoMCk7XG4gICAgICAgIHRoaXMuX3BhblN0YXRlID0gSWd4TGlzdFBhblN0YXRlLk5PTkU7XG4gICAgICAgIHRoaXMuaGlkZUxlZnRBbmRSaWdodFBhblRlbXBsYXRlcygpO1xuICAgIH1cbn1cbiIsIlxuPGRpdiAqbmdJZj1cIiFpc0hlYWRlciAmJiBsaXN0Lmxpc3RJdGVtTGVmdFBhbm5pbmdUZW1wbGF0ZVwiICNsZWZ0UGFubmluZ1RtcGwgY2xhc3M9XCJpZ3gtbGlzdF9faXRlbS1yaWdodFwiXG4gICAgW3N0eWxlLndpZHRoLnJlbV09XCJvZmZzZXRXaWR0aEluUmVtXCIgW3N0eWxlLmhlaWdodC5yZW1dPVwib2Zmc2V0SGVpZ2h0SW5SZW1cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdC5saXN0SXRlbUxlZnRQYW5uaW5nVGVtcGxhdGUudGVtcGxhdGU7IGNvbnRleHQ6IGNvbnRleHRcIj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiIWlzSGVhZGVyICYmIGxpc3QubGlzdEl0ZW1SaWdodFBhbm5pbmdUZW1wbGF0ZVwiICNyaWdodFBhbm5pbmdUbXBsIGNsYXNzPVwiaWd4LWxpc3RfX2l0ZW0tbGVmdFwiXG4gICAgW3N0eWxlLndpZHRoLnJlbV09XCJvZmZzZXRXaWR0aEluUmVtXCIgW3N0eWxlLmhlaWdodC5yZW1dPVwib2Zmc2V0SGVpZ2h0SW5SZW1cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdC5saXN0SXRlbVJpZ2h0UGFubmluZ1RlbXBsYXRlLnRlbXBsYXRlOyBjb250ZXh0OiBjb250ZXh0XCI+XG4gICAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNpdGVtc0NvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpdGVtVGh1bWJuYWlscz5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWxpc3RfX2l0ZW0tdGh1bWJuYWlsXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpZ3hMaXN0VGh1bWJuYWlsXSwgaWd4LWxpc3RfX2l0ZW0tdGh1bWJuYWlsLCBpZ3gtYXZhdGFyXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpdGVtTGluZXM+XG4gICAgPGRpdiBjbGFzcz1cImlneC1saXN0X19pdGVtLWxpbmVzXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpZ3hMaXN0TGluZV0sIC5pZ3gtbGlzdF9faXRlbS1saW5lcywgW2lneExpc3RMaW5lVGl0bGVdLCBbaWd4TGlzdExpbmVTdWJUaXRsZV0sIC5pZ3gtbGlzdF9faXRlbS1saW5lLXRpdGxlLCAuaWd4LWxpc3RfX2l0ZW0tbGluZS1zdWJ0aXRsZVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaXRlbUFjdGlvbnM+XG4gICAgPGRpdiBjbGFzcz1cImlneC1saXN0X19pdGVtLWFjdGlvbnNcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2lneExpc3RBY3Rpb25dLCAuaWd4LWxpc3RfX2l0ZW0tYWN0aW9uc1wiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJpc0hlYWRlclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtc0NvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiIWlzSGVhZGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImlneC1saXN0X19pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1UaHVtYm5haWxzXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtTGluZXNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1BY3Rpb25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtc0NvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
434
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9saXN0L2xpc3QtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvbGlzdC9saXN0LWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBRVQsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBRUwsU0FBUyxFQUNULGdCQUFnQixFQUNuQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0gsZUFBZSxFQUdsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQUV6RDs7Ozs7Ozs7Ozs7OztHQWFHO0FBU0gsTUFBTSxPQUFPLG9CQUFvQjtJQTZGN0I7Ozs7Ozs7T0FPRztJQUNILElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQ1csS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQVcsS0FBSyxDQUFDLEtBQWE7UUFD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Q29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGQsXG4gICAgYm9vbGVhbkF0dHJpYnV0ZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgICBJZ3hMaXN0UGFuU3RhdGUsXG4gICAgSUxpc3RDaGlsZCxcbiAgICBJZ3hMaXN0QmFzZURpcmVjdGl2ZVxufSBmcm9tICcuL2xpc3QuY29tbW9uJztcblxuaW1wb3J0IHsgSGFtbWVyR2VzdHVyZXNNYW5hZ2VyIH0gZnJvbSAnLi4vY29yZS90b3VjaCc7XG5pbXBvcnQgeyByZW0gfSBmcm9tICcuLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG4vKipcbiAqIFRoZSBJZ25pdGUgVUkgTGlzdCBJdGVtIGNvbXBvbmVudCBpcyBhIGNvbnRhaW5lciBpbnRlbmRlZCBmb3Igcm93IGl0ZW1zIGluIHRoZSBJZ25pdGUgVUkgZm9yIEFuZ3VsYXIgTGlzdCBjb21wb25lbnQuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYGh0bWxcbiAqIDxpZ3gtbGlzdD5cbiAqICAgPGlneC1saXN0LWl0ZW0gaXNIZWFkZXI9XCJ0cnVlXCI+Q29udGFjdHM8L2lneC1saXN0LWl0ZW0+XG4gKiAgIDxpZ3gtbGlzdC1pdGVtICpuZ0Zvcj1cImxldCBjb250YWN0IG9mIGNvbnRhY3RzXCI+XG4gKiAgICAgPHNwYW4gY2xhc3M9XCJuYW1lXCI+e3sgY29udGFjdC5uYW1lIH19PC9zcGFuPlxuICogICAgIDxzcGFuIGNsYXNzPVwicGhvbmVcIj57eyBjb250YWN0LnBob25lIH19PC9zcGFuPlxuICogICA8L2lneC1saXN0LWl0ZW0+XG4gKiA8L2lneC1saXN0PlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHByb3ZpZGVyczogW0hhbW1lckdlc3R1cmVzTWFuYWdlcl0sXG4gICAgc2VsZWN0b3I6ICdpZ3gtbGlzdC1pdGVtJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2xpc3QtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbTmdJZiwgTmdUZW1wbGF0ZU91dGxldF1cbn0pXG5leHBvcnQgY2xhc3MgSWd4TGlzdEl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBJTGlzdENoaWxkIHtcbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIHJlZmVyZW5jZSB0byB0aGUgdGVtcGxhdGUncyBiYXNlIGVsZW1lbnQgc2hvd24gd2hlbiBsZWZ0IHBhbm5pbmcgYSBsaXN0IGl0ZW0uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGxlZnRQYW5UbXBsID0gdGhpcy5saXN0SXRlbS5sZWZ0UGFubmluZ1RlbXBsYXRlRWxlbWVudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdsZWZ0UGFubmluZ1RtcGwnKVxuICAgIHB1YmxpYyBsZWZ0UGFubmluZ1RlbXBsYXRlRWxlbWVudDtcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIHRoZSB0ZW1wbGF0ZSdzIGJhc2UgZWxlbWVudCBzaG93biB3aGVuIHJpZ2h0IHBhbm5pbmcgYSBsaXN0IGl0ZW0uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHJpZ2h0UGFuVG1wbCA9IHRoaXMubGlzdEl0ZW0ucmlnaHRQYW5uaW5nVGVtcGxhdGVFbGVtZW50O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3JpZ2h0UGFubmluZ1RtcGwnKVxuICAgIHB1YmxpYyByaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgYGxpc3QgaXRlbWAgaXMgYSBoZWFkZXIuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdC1pdGVtIFtpc0hlYWRlcl0gPSBcInRydWVcIj5IZWFkZXI8L2lneC1saXN0LWl0ZW0+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0hlYWRlciA9ICB0aGlzLmxpc3RJdGVtLmlzSGVhZGVyO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGlzSGVhZGVyOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGBsaXN0IGl0ZW1gIGlzIGhpZGRlbi5cbiAgICAgKiBCeSBkZWZhdWx0IHRoZSBgaGlkZGVuYCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWxpc3QtaXRlbSBbaGlkZGVuXSA9IFwidHJ1ZVwiPkhpZGRlbiBJdGVtPC9pZ3gtbGlzdC1pdGVtPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNIaWRkZW4gPSAgdGhpcy5saXN0SXRlbS5oaWRkZW47XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgaGlkZGVuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGUgb2YgdGhlIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmxpc3RJdGVtLmFyaWFMYWJlbCA9IFwiSXRlbTFcIjtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGl0ZW1BcmlhTGFiZWwgPSB0aGlzLmxpc3RJdGVtLmFyaWFMYWJlbDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWxhYmVsJylcbiAgICBwdWJsaWMgYXJpYUxhYmVsOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgdG91Y2gtYWN0aW9uYCBzdHlsZSBvZiB0aGUgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB0b3VjaEFjdGlvbiA9IHRoaXMubGlzdEl0ZW0udG91Y2hBY3Rpb247XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS50b3VjaC1hY3Rpb24nKVxuICAgIHB1YmxpYyB0b3VjaEFjdGlvbiA9ICdwYW4teSc7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfcGFuU3RhdGU6IElneExpc3RQYW5TdGF0ZSA9IElneExpc3RQYW5TdGF0ZS5OT05FO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgcGFuT2Zmc2V0ID0gMDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxhc3RQYW5EaXIgPSBJZ3hMaXN0UGFuU3RhdGUuTk9ORTtcblxuICAgIHByaXZhdGUgX3JvbGU6IHN0cmluZyA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHBhblN0YXRlYCBvZiBhIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXRlbVBhblN0YXRlID0gIHRoaXMubGlzdEl0ZW0ucGFuU3RhdGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhblN0YXRlKCk6IElneExpc3RQYW5TdGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYW5TdGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgaW5kZXhgIG9mIGEgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpdGVtSW5kZXggPSAgdGhpcy5saXN0SXRlbS5pbmRleDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5kZXggIT09IG51bGwgPyB0aGlzLl9pbmRleCA6IHRoaXMubGlzdC5jaGlsZHJlbi50b0FycmF5KCkuaW5kZXhPZih0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgaW5kZXhgIG9mIHRoZSBgbGlzdCBpdGVtYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5saXN0SXRlbS5pbmRleCA9IGluZGV4O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBpbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2luZGV4ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBlbGVtZW50IHJlZmVyZW5jZSB0byB0aGUgbGlzdCBpdGVtLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGlzdEl0ZW1FbGVtZW50ID0gIHRoaXMubGlzdEl0ZW0uZWxlbWVudC5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgY29udGFpbmVyIHdoaWNoIGNvbnRhaW5zIHRoZSBsaXN0IGl0ZW0ncyBjb250ZW50LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGlzdEl0ZW1Db250YWluZXIgPSAgdGhpcy5saXN0SXRlbS5jb250ZW50RWxlbWVudC5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29udGVudEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSB0aGlzLmVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaWd4LWxpc3RfX2l0ZW0tY29udGVudCcpO1xuICAgICAgICByZXR1cm4gKGNhbmRpZGF0ZXMgJiYgY2FuZGlkYXRlcy5sZW5ndGggPiAwKSA/IGNhbmRpZGF0ZXNbMF0gOiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBjb250ZXh0YCBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgYHRlbXBsYXRlIGNvbnRleHRgIGJpbmRpbmcgaW50byB0aGUgYGxpc3QgaXRlbSBjb250YWluZXJgXG4gICAgICogYnkgcHJvdmlkaW5nIHRoZSBgJGltcGxpY2l0YCBkZWNsYXJhdGlvbiB3aGljaCBpcyB0aGUgYElneExpc3RJdGVtQ29tcG9uZW50YCBpdHNlbGYuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsaXN0SXRlbUNvbXBvbmVudCA9IHRoaXMubGlzdEl0ZW0uY29udGV4dDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICRpbXBsaWNpdDogdGhpc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIGEgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpdGVtV2lkdGggPSB0aGlzLmxpc3RJdGVtLndpZHRoO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCB3aWR0aCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1heGltdW0gbGVmdCBwb3NpdGlvbiBvZiB0aGUgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBtYXhMZWZ0ID0gdGhpcy5saXN0SXRlbS5tYXhMZWZ0O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhMZWZ0KCkge1xuICAgICAgICByZXR1cm4gLXRoaXMud2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbWF4aW11bSByaWdodCBwb3NpdGlvbiBvZiB0aGUgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBtYXhSaWdodCA9IHRoaXMubGlzdEl0ZW0ubWF4UmlnaHQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1heFJpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy53aWR0aDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IG9mZnNldFdpZHRoSW5SZW0oKSB7XG4gICAgICAgIHJldHVybiByZW0odGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgZ2V0IG9mZnNldEhlaWdodEluUmVtKCkge1xuICAgICAgICByZXR1cm4gcmVtKHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgbGlzdDogSWd4TGlzdEJhc2VEaXJlY3RpdmUsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgYHJvbGVgIGF0dHJpYnV0ZSBvZiB0aGUgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpdGVtUm9sZSA9ICB0aGlzLmxpc3RJdGVtLnJvbGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb2xlID8gdGhpcy5fcm9sZSA6IHRoaXMuaXNIZWFkZXIgPyAnc2VwYXJhdG9yJyA6ICdsaXN0aXRlbSc7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCByb2xlKHZhbDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3JvbGUgPSB2YWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYGxpc3QgaXRlbWAgc2hvdWxkIGhhdmUgaGVhZGVyIHN0eWxlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaGVhZGVyU3R5bGUgPSAgdGhpcy5saXN0SXRlbS5oZWFkZXJTdHlsZTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWxpc3RfX2hlYWRlcicpXG4gICAgcHVibGljIGdldCBoZWFkZXJTdHlsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIZWFkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgaW5uZXIgc3R5bGUgb2YgdGhlIGBsaXN0IGl0ZW1gIGlmIHRoZSBpdGVtIGlzIG5vdCBjb3VudGVkIGFzIGhlYWRlci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlubmVyU3R5bGUgPSAgdGhpcy5saXN0SXRlbS5pbm5lclN0eWxlO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtbGlzdF9faXRlbS1iYXNlJylcbiAgICBwdWJsaWMgZ2V0IGlubmVyU3R5bGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0hlYWRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHN0cmluZyB2YWx1ZSB3aGljaCBkZXNjcmliZXMgdGhlIGRpc3BsYXkgbW9kZSBvZiB0aGUgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0hpZGRlbiA9IHRoaXMubGlzdEl0ZW0uZGlzcGxheTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUuZGlzcGxheScpXG4gICAgcHVibGljIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmhpZGRlbiA/ICdub25lJyA6ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIGNsaWNrZWQoZXZ0KSB7XG4gICAgICAgIHRoaXMubGlzdC5pdGVtQ2xpY2tlZC5lbWl0KHsgaXRlbTogdGhpcywgZXZlbnQ6IGV2dCwgZGlyZWN0aW9uOiB0aGlzLmxhc3RQYW5EaXIgfSk7XG4gICAgICAgIHRoaXMubGFzdFBhbkRpciA9IElneExpc3RQYW5TdGF0ZS5OT05FO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW5zdGFydCcpXG4gICAgcHVibGljIHBhblN0YXJ0KCkge1xuICAgICAgICBpZiAodGhpcy5pc1RydWUodGhpcy5pc0hlYWRlcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNUcnVlKHRoaXMubGlzdC5hbGxvd0xlZnRQYW5uaW5nKSAmJiAhdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93UmlnaHRQYW5uaW5nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5saXN0LnN0YXJ0UGFuLmVtaXQoeyBpdGVtOiB0aGlzLCBkaXJlY3Rpb246IHRoaXMubGFzdFBhbkRpciwga2VlcGl0ZW06IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW5jYW5jZWwnKVxuICAgIHB1YmxpYyBwYW5DYW5jZWwoKSB7XG4gICAgICAgIHRoaXMucmVzZXRQYW5Qb3NpdGlvbigpO1xuICAgICAgICB0aGlzLmxpc3QuZW5kUGFuLmVtaXQoeyBpdGVtOiB0aGlzLCBkaXJlY3Rpb246IHRoaXMubGFzdFBhbkRpciwga2VlcEl0ZW06IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW5tb3ZlJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgcGFuTW92ZShldikge1xuICAgICAgICBpZiAodGhpcy5pc1RydWUodGhpcy5pc0hlYWRlcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNUcnVlKHRoaXMubGlzdC5hbGxvd0xlZnRQYW5uaW5nKSAmJiAhdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93UmlnaHRQYW5uaW5nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzUGFubmluZ1RvTGVmdCA9IGV2LmRlbHRhWCA8IDA7XG4gICAgICAgIGlmIChpc1Bhbm5pbmdUb0xlZnQgJiYgdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93TGVmdFBhbm5pbmcpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dMZWZ0UGFuVGVtcGxhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudEVsZW1lbnRMZWZ0KE1hdGgubWF4KHRoaXMubWF4TGVmdCwgZXYuZGVsdGFYKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzUGFubmluZ1RvTGVmdCAmJiB0aGlzLmlzVHJ1ZSh0aGlzLmxpc3QuYWxsb3dSaWdodFBhbm5pbmcpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dSaWdodFBhblRlbXBsYXRlKCk7XG4gICAgICAgICAgICB0aGlzLnNldENvbnRlbnRFbGVtZW50TGVmdChNYXRoLm1pbih0aGlzLm1heFJpZ2h0LCBldi5kZWx0YVgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdwYW5lbmQnKVxuICAgIHB1YmxpYyBwYW5FbmQoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzVHJ1ZSh0aGlzLmlzSGVhZGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93TGVmdFBhbm5pbmcpICYmICF0aGlzLmlzVHJ1ZSh0aGlzLmxpc3QuYWxsb3dSaWdodFBhbm5pbmcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgdHJhbnNsYXRpb24gb2Zmc2V0IG9mIHRoZSBjdXJyZW50IGxpc3QgaXRlbSBjb250ZW50XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlT2Zmc2V0ID0gdGhpcy5wYW5PZmZzZXQ7XG4gICAgICAgIGNvbnN0IHdpZHRoVHJpZ2dlcmluZ0dyaXAgPSB0aGlzLndpZHRoICogdGhpcy5saXN0LnBhbkVuZFRyaWdnZXJpbmdUaHJlc2hvbGQ7XG5cbiAgICAgICAgaWYgKHJlbGF0aXZlT2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIG5vIHBhbm5pbmcgaGFzIG9jY3VyZWRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpciA9IHJlbGF0aXZlT2Zmc2V0ID4gMCA/IElneExpc3RQYW5TdGF0ZS5SSUdIVCA6IElneExpc3RQYW5TdGF0ZS5MRUZUO1xuICAgICAgICB0aGlzLmxhc3RQYW5EaXIgPSBkaXI7XG5cbiAgICAgICAgY29uc3QgYXJncyA9IHsgaXRlbTogdGhpcywgZGlyZWN0aW9uOiBkaXIsIGtlZXBJdGVtOiBmYWxzZSB9O1xuICAgICAgICB0aGlzLmxpc3QuZW5kUGFuLmVtaXQoYXJncyk7XG5cbiAgICAgICAgY29uc3Qgb2xkUGFuU3RhdGUgPSB0aGlzLl9wYW5TdGF0ZTtcbiAgICAgICAgaWYgKE1hdGguYWJzKHJlbGF0aXZlT2Zmc2V0KSA8IHdpZHRoVHJpZ2dlcmluZ0dyaXApIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRQYW5Qb3NpdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5saXN0LnJlc2V0UGFuLmVtaXQodGhpcyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlyID09PSBJZ3hMaXN0UGFuU3RhdGUuTEVGVCkge1xuICAgICAgICAgICAgdGhpcy5saXN0LmxlZnRQYW4uZW1pdChhcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGlzdC5yaWdodFBhbi5lbWl0KGFyZ3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyZ3Mua2VlcEl0ZW0gPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudEVsZW1lbnRMZWZ0KDApO1xuICAgICAgICAgICAgdGhpcy5fcGFuU3RhdGUgPSBJZ3hMaXN0UGFuU3RhdGUuTk9ORTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkaXIgPT09IElneExpc3RQYW5TdGF0ZS5MRUZUKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDb250ZW50RWxlbWVudExlZnQodGhpcy5tYXhMZWZ0KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYW5TdGF0ZSA9IElneExpc3RQYW5TdGF0ZS5MRUZUO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbnRlbnRFbGVtZW50TGVmdCh0aGlzLm1heFJpZ2h0KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9wYW5TdGF0ZSA9IElneExpc3RQYW5TdGF0ZS5SSUdIVDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvbGRQYW5TdGF0ZSAhPT0gdGhpcy5fcGFuU3RhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGFyZ3MyID0geyBvbGRTdGF0ZTogb2xkUGFuU3RhdGUsIG5ld1N0YXRlOiB0aGlzLl9wYW5TdGF0ZSwgaXRlbTogdGhpcyB9O1xuICAgICAgICAgICAgdGhpcy5saXN0LnBhblN0YXRlQ2hhbmdlLmVtaXQoYXJnczIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGlkZUxlZnRBbmRSaWdodFBhblRlbXBsYXRlcygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNob3dMZWZ0UGFuVGVtcGxhdGUoKSB7XG4gICAgICAgIHRoaXMuc2V0TGVmdEFuZFJpZ2h0VGVtcGxhdGVzVmlzaWJpbGl0eSgndmlzaWJsZScsICdoaWRkZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzaG93UmlnaHRQYW5UZW1wbGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zZXRMZWZ0QW5kUmlnaHRUZW1wbGF0ZXNWaXNpYmlsaXR5KCdoaWRkZW4nLCAndmlzaWJsZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIGhpZGVMZWZ0QW5kUmlnaHRQYW5UZW1wbGF0ZXMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRMZWZ0QW5kUmlnaHRUZW1wbGF0ZXNWaXNpYmlsaXR5KCdoaWRkZW4nLCAnaGlkZGVuJyk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0TGVmdEFuZFJpZ2h0VGVtcGxhdGVzVmlzaWJpbGl0eShsZWZ0VmlzaWJpbGl0eSwgcmlnaHRWaXNpYmlsaXR5KSB7XG4gICAgICAgIGlmICh0aGlzLmxlZnRQYW5uaW5nVGVtcGxhdGVFbGVtZW50ICYmIHRoaXMubGVmdFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5sZWZ0UGFubmluZ1RlbXBsYXRlRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBsZWZ0VmlzaWJpbGl0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQgJiYgdGhpcy5yaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5yaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gcmlnaHRWaXNpYmlsaXR5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0Q29udGVudEVsZW1lbnRMZWZ0KHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5wYW5PZmZzZXQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jb250ZW50RWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgnICsgdmFsdWUgKyAncHgpJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc1RydWUodmFsdWU6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzZXRQYW5Qb3NpdGlvbigpIHtcbiAgICAgICAgdGhpcy5zZXRDb250ZW50RWxlbWVudExlZnQoMCk7XG4gICAgICAgIHRoaXMuX3BhblN0YXRlID0gSWd4TGlzdFBhblN0YXRlLk5PTkU7XG4gICAgICAgIHRoaXMuaGlkZUxlZnRBbmRSaWdodFBhblRlbXBsYXRlcygpO1xuICAgIH1cbn1cbiIsIlxuPGRpdiAqbmdJZj1cIiFpc0hlYWRlciAmJiBsaXN0Lmxpc3RJdGVtTGVmdFBhbm5pbmdUZW1wbGF0ZVwiICNsZWZ0UGFubmluZ1RtcGwgY2xhc3M9XCJpZ3gtbGlzdF9faXRlbS1yaWdodFwiXG4gICAgW3N0eWxlLndpZHRoLnJlbV09XCJvZmZzZXRXaWR0aEluUmVtXCIgW3N0eWxlLmhlaWdodC5yZW1dPVwib2Zmc2V0SGVpZ2h0SW5SZW1cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdC5saXN0SXRlbUxlZnRQYW5uaW5nVGVtcGxhdGUudGVtcGxhdGU7IGNvbnRleHQ6IGNvbnRleHRcIj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiIWlzSGVhZGVyICYmIGxpc3QubGlzdEl0ZW1SaWdodFBhbm5pbmdUZW1wbGF0ZVwiICNyaWdodFBhbm5pbmdUbXBsIGNsYXNzPVwiaWd4LWxpc3RfX2l0ZW0tbGVmdFwiXG4gICAgW3N0eWxlLndpZHRoLnJlbV09XCJvZmZzZXRXaWR0aEluUmVtXCIgW3N0eWxlLmhlaWdodC5yZW1dPVwib2Zmc2V0SGVpZ2h0SW5SZW1cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdC5saXN0SXRlbVJpZ2h0UGFubmluZ1RlbXBsYXRlLnRlbXBsYXRlOyBjb250ZXh0OiBjb250ZXh0XCI+XG4gICAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNpdGVtc0NvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpdGVtVGh1bWJuYWlscz5cbiAgICA8ZGl2IGNsYXNzPVwiaWd4LWxpc3RfX2l0ZW0tdGh1bWJuYWlsXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpZ3hMaXN0VGh1bWJuYWlsXSwgaWd4LWxpc3RfX2l0ZW0tdGh1bWJuYWlsLCBpZ3gtYXZhdGFyXCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpdGVtTGluZXM+XG4gICAgPGRpdiBjbGFzcz1cImlneC1saXN0X19pdGVtLWxpbmVzXCI+XG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltpZ3hMaXN0TGluZV0sIC5pZ3gtbGlzdF9faXRlbS1saW5lcywgW2lneExpc3RMaW5lVGl0bGVdLCBbaWd4TGlzdExpbmVTdWJUaXRsZV0sIC5pZ3gtbGlzdF9faXRlbS1saW5lLXRpdGxlLCAuaWd4LWxpc3RfX2l0ZW0tbGluZS1zdWJ0aXRsZVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaXRlbUFjdGlvbnM+XG4gICAgPGRpdiBjbGFzcz1cImlneC1saXN0X19pdGVtLWFjdGlvbnNcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2lneExpc3RBY3Rpb25dLCAuaWd4LWxpc3RfX2l0ZW0tYWN0aW9uc1wiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJpc0hlYWRlclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtc0NvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiIWlzSGVhZGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImlneC1saXN0X19pdGVtLWNvbnRlbnRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1UaHVtYm5haWxzXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtTGluZXNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIml0ZW1BY3Rpb25zXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtc0NvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19
@@ -301,6 +301,7 @@ export class IgxListComponent extends IgxListBaseDirective {
301
301
  */
302
302
  this.itemClicked = new EventEmitter();
303
303
  this._resourceStrings = getCurrentResourceStrings(ListResourceStringsEN);
304
+ this._role = 'list';
304
305
  }
305
306
  /**
306
307
  * @hidden
@@ -314,7 +315,7 @@ export class IgxListComponent extends IgxListBaseDirective {
314
315
  return null;
315
316
  }
316
317
  /**
317
- * Gets the `role` attribute value.
318
+ * Gets/Sets the `role` attribute value.
318
319
  *
319
320
  * @example
320
321
  * ```typescript
@@ -322,7 +323,10 @@ export class IgxListComponent extends IgxListBaseDirective {
322
323
  * ```
323
324
  */
324
325
  get role() {
325
- return 'list';
326
+ return this._role;
327
+ }
328
+ set role(val) {
329
+ this._role = val;
326
330
  }
327
331
  /**
328
332
  * Gets a boolean indicating if the list is empty.
@@ -420,7 +424,7 @@ export class IgxListComponent extends IgxListBaseDirective {
420
424
  }
421
425
  }
422
426
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: IgxListComponent, deps: [{ token: i0.ElementRef }, { token: DisplayDensityToken, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
423
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.0.1", type: IgxListComponent, isStandalone: true, selector: "igx-list", inputs: { panEndTriggeringThreshold: "panEndTriggeringThreshold", id: "id", allowLeftPanning: ["allowLeftPanning", "allowLeftPanning", booleanAttribute], allowRightPanning: ["allowRightPanning", "allowRightPanning", booleanAttribute], isLoading: ["isLoading", "isLoading", booleanAttribute], resourceStrings: "resourceStrings" }, outputs: { leftPan: "leftPan", rightPan: "rightPan", startPan: "startPan", endPan: "endPan", resetPan: "resetPan", panStateChange: "panStateChange", itemClicked: "itemClicked" }, host: { properties: { "attr.id": "this.id", "attr.role": "this.role", "class.igx-list--empty": "this.isListEmpty", "class.igx-list": "this.cssClass", "style.--component-size": "this.componentSize" } }, providers: [{ provide: IgxListBaseDirective, useExisting: IgxListComponent }], queries: [{ propertyName: "emptyListTemplate", first: true, predicate: IgxEmptyListTemplateDirective, descendants: true, read: IgxEmptyListTemplateDirective }, { propertyName: "dataLoadingTemplate", first: true, predicate: IgxDataLoadingTemplateDirective, descendants: true, read: IgxDataLoadingTemplateDirective }, { propertyName: "listItemLeftPanningTemplate", first: true, predicate: IgxListItemLeftPanningTemplateDirective, descendants: true, read: IgxListItemLeftPanningTemplateDirective }, { propertyName: "listItemRightPanningTemplate", first: true, predicate: IgxListItemRightPanningTemplateDirective, descendants: true, read: IgxListItemRightPanningTemplateDirective }, { propertyName: "children", predicate: i0.forwardRef(() => IgxListItemComponent), descendants: true }], viewQueries: [{ propertyName: "defaultEmptyListTemplate", first: true, predicate: ["defaultEmptyList"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultDataLoadingTemplate", first: true, predicate: ["defaultDataLoading"], descendants: true, read: TemplateRef, static: true }], usesInheritance: true, ngImport: i0, template: "<ng-content></ng-content>\n\n<ng-template #defaultEmptyList>\n <article class=\"igx-list__message\">\n {{resourceStrings.igx_list_no_items}}\n </article>\n</ng-template>\n\n<ng-template #defaultDataLoading>\n <article class=\"igx-list__message\">\n {{resourceStrings.igx_list_loading}}\n </article>\n</ng-template>\n\n<ng-container *ngIf=\"!children || children.length === 0 || isLoading\">\n <ng-container *ngTemplateOutlet=\"template; context: context\">\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
427
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.0.1", type: IgxListComponent, isStandalone: true, selector: "igx-list", inputs: { panEndTriggeringThreshold: "panEndTriggeringThreshold", id: "id", allowLeftPanning: ["allowLeftPanning", "allowLeftPanning", booleanAttribute], allowRightPanning: ["allowRightPanning", "allowRightPanning", booleanAttribute], isLoading: ["isLoading", "isLoading", booleanAttribute], resourceStrings: "resourceStrings", role: "role" }, outputs: { leftPan: "leftPan", rightPan: "rightPan", startPan: "startPan", endPan: "endPan", resetPan: "resetPan", panStateChange: "panStateChange", itemClicked: "itemClicked" }, host: { properties: { "attr.id": "this.id", "attr.role": "this.role", "class.igx-list--empty": "this.isListEmpty", "class.igx-list": "this.cssClass", "style.--component-size": "this.componentSize" } }, providers: [{ provide: IgxListBaseDirective, useExisting: IgxListComponent }], queries: [{ propertyName: "emptyListTemplate", first: true, predicate: IgxEmptyListTemplateDirective, descendants: true, read: IgxEmptyListTemplateDirective }, { propertyName: "dataLoadingTemplate", first: true, predicate: IgxDataLoadingTemplateDirective, descendants: true, read: IgxDataLoadingTemplateDirective }, { propertyName: "listItemLeftPanningTemplate", first: true, predicate: IgxListItemLeftPanningTemplateDirective, descendants: true, read: IgxListItemLeftPanningTemplateDirective }, { propertyName: "listItemRightPanningTemplate", first: true, predicate: IgxListItemRightPanningTemplateDirective, descendants: true, read: IgxListItemRightPanningTemplateDirective }, { propertyName: "children", predicate: i0.forwardRef(() => IgxListItemComponent), descendants: true }], viewQueries: [{ propertyName: "defaultEmptyListTemplate", first: true, predicate: ["defaultEmptyList"], descendants: true, read: TemplateRef, static: true }, { propertyName: "defaultDataLoadingTemplate", first: true, predicate: ["defaultDataLoading"], descendants: true, read: TemplateRef, static: true }], usesInheritance: true, ngImport: i0, template: "<ng-content></ng-content>\n\n<ng-template #defaultEmptyList>\n <article class=\"igx-list__message\">\n {{resourceStrings.igx_list_no_items}}\n </article>\n</ng-template>\n\n<ng-template #defaultDataLoading>\n <article class=\"igx-list__message\">\n {{resourceStrings.igx_list_loading}}\n </article>\n</ng-template>\n\n<ng-container *ngIf=\"!children || children.length === 0 || isLoading\">\n <ng-container *ngTemplateOutlet=\"template; context: context\">\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
424
428
  }
425
429
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: IgxListComponent, decorators: [{
426
430
  type: Component,
@@ -486,6 +490,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImpor
486
490
  }], role: [{
487
491
  type: HostBinding,
488
492
  args: ['attr.role']
493
+ }, {
494
+ type: Input
489
495
  }], isListEmpty: [{
490
496
  type: HostBinding,
491
497
  args: ['class.igx-list--empty']
@@ -496,4 +502,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImpor
496
502
  type: HostBinding,
497
503
  args: ['style.--component-size']
498
504
  }] } });
499
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvbGlzdC9saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9saXN0L2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFFZixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxLQUFLLEVBQ0wsTUFBTSxFQUVOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQ3RDLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFDSCxvQkFBb0IsRUFDcEIsK0JBQStCLEVBQy9CLDZCQUE2QixFQUU3Qix1Q0FBdUMsRUFDdkMsd0NBQXdDLEVBQzNDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBMEIsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RSxPQUFPLEVBQXdCLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRW5FLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztBQTZCaEI7OztHQUdHO0FBTUgsTUFBTSxPQUFPLHlCQUF5Qjs4R0FBekIseUJBQXlCO2tHQUF6Qix5QkFBeUI7OzJGQUF6Qix5QkFBeUI7a0JBTHJDLFNBQVM7bUJBQUM7b0JBQ1AsOERBQThEO29CQUM5RCxRQUFR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RC9CLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBa0J0QixpQkFBaUI7c0JBRGhDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBbUIvQixTQUFTO3NCQURmLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBZXRCLE9BQU87c0JBRHRCLE1BQU07Z0JBZVMsUUFBUTtzQkFEdkIsTUFBTTtnQkFlUyxRQUFRO3NCQUR2QixNQUFNO2dCQWVTLE1BQU07c0JBRHJCLE1BQU07Z0JBZVMsUUFBUTtzQkFEdkIsTUFBTTtnQkFnQlMsY0FBYztzQkFEN0IsTUFBTTtnQkFlUyxXQUFXO3NCQUQxQixNQUFNO2dCQVFHLHdCQUF3QjtzQkFEakMsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFReEQsMEJBQTBCO3NCQURuQyxTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVV6RCxlQUFlO3NCQUR6QixLQUFLO2dCQXNDSyxJQUFJO3NCQURkLFdBQVc7dUJBQUMsV0FBVztnQkFjYixXQUFXO3NCQURyQixXQUFXO3VCQUFDLHVCQUF1QjtnQkFVekIsUUFBUTtzQkFEbEIsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBT2xCLGFBQWE7c0JBRHZCLFdBQVc7dUJBQUMsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgT3B0aW9uYWwsXG4gICAgSW5qZWN0LCBEaXJlY3RpdmUsIGJvb2xlYW5BdHRyaWJ1dGVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cblxuXG5pbXBvcnQgeyBJZ3hMaXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vbGlzdC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICAgIElneExpc3RCYXNlRGlyZWN0aXZlLFxuICAgIElneERhdGFMb2FkaW5nVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgSWd4RW1wdHlMaXN0VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgSWd4TGlzdFBhblN0YXRlLFxuICAgIElneExpc3RJdGVtTGVmdFBhbm5pbmdUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hMaXN0SXRlbVJpZ2h0UGFubmluZ1RlbXBsYXRlRGlyZWN0aXZlXG59IGZyb20gJy4vbGlzdC5jb21tb24nO1xuaW1wb3J0IHsgSURpc3BsYXlEZW5zaXR5T3B0aW9ucywgRGlzcGxheURlbnNpdHlUb2tlbiB9IGZyb20gJy4uL2NvcmUvZGVuc2l0eSc7XG5pbXBvcnQgeyBJQmFzZUV2ZW50QXJncyB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgSUxpc3RSZXNvdXJjZVN0cmluZ3MsIExpc3RSZXNvdXJjZVN0cmluZ3NFTiB9IGZyb20gJy4uL2NvcmUvaTE4bi9saXN0LXJlc291cmNlcyc7XG5pbXBvcnQgeyBnZXRDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5cbmxldCBORVhUX0lEID0gMDtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSBwYW5TdGF0ZUNoYW5nZSBpZ3hMaXN0IGV2ZW50IGFyZ3VtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElQYW5TdGF0ZUNoYW5nZUV2ZW50QXJncyBleHRlbmRzIElCYXNlRXZlbnRBcmdzIHtcbiAgICBvbGRTdGF0ZTogSWd4TGlzdFBhblN0YXRlO1xuICAgIG5ld1N0YXRlOiBJZ3hMaXN0UGFuU3RhdGU7XG4gICAgaXRlbTogSWd4TGlzdEl0ZW1Db21wb25lbnQ7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciB0aGUgbGlzdEl0ZW1DbGljayBpZ3hMaXN0IGV2ZW50IGFyZ3VtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElMaXN0SXRlbUNsaWNrRXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VFdmVudEFyZ3Mge1xuICAgIGl0ZW06IElneExpc3RJdGVtQ29tcG9uZW50O1xuICAgIGV2ZW50OiBFdmVudDtcbiAgICBkaXJlY3Rpb246IElneExpc3RQYW5TdGF0ZTtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSBsaXN0SXRlbVBhbm5pbmcgaWd4TGlzdCBldmVudCBhcmd1bWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTGlzdEl0ZW1QYW5uaW5nRXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VFdmVudEFyZ3Mge1xuICAgIGl0ZW06IElneExpc3RJdGVtQ29tcG9uZW50O1xuICAgIGRpcmVjdGlvbjogSWd4TGlzdFBhblN0YXRlO1xuICAgIGtlZXBJdGVtOiBib29sZWFuO1xufVxuXG4vKipcbiAqIGlneExpc3RUaHVtYm5haWwgaXMgY29udGFpbmVyIGZvciB0aGUgTGlzdCBtZWRpYVxuICogVXNlIGl0IHRvIHdyYXAgYW55dGhpbmcgeW91IHdhbnQgdG8gYmUgdXNlZCBhcyBhIHRodW1ibmFpbC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ1tpZ3hMaXN0VGh1bWJuYWlsXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hMaXN0VGh1bWJuYWlsRGlyZWN0aXZlIHsgfVxuXG4vKipcbiAqIGlneExpc3RBY3Rpb24gaXMgY29udGFpbmVyIGZvciB0aGUgTGlzdCBhY3Rpb25cbiAqIFVzZSBpdCB0byB3cmFwIGFueXRoaW5nIHlvdSB3YW50IHRvIGJlIHVzZWQgYXMgYSBsaXN0IGFjdGlvbjogaWNvbiwgY2hlY2tib3guLi5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ1tpZ3hMaXN0QWN0aW9uXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hMaXN0QWN0aW9uRGlyZWN0aXZlIHsgfVxuXG4vKipcbiAqIGlneExpc3RMaW5lIGlzIGNvbnRhaW5lciBmb3IgdGhlIExpc3QgdGV4dCBjb250ZW50XG4gKiBVc2UgaXQgdG8gd3JhcCBhbnl0aGluZyB5b3Ugd2FudCB0byBiZSB1c2VkIGFzIGEgcGxhbmUgdGV4dC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ1tpZ3hMaXN0TGluZV0nLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgSWd4TGlzdExpbmVEaXJlY3RpdmUgeyB9XG5cbi8qKlxuICogaWd4TGlzdExpbmVUaXRsZSBpcyBhIGRpcmVjdGl2ZSB0aGF0IGFkZCBjbGFzcyB0byB0aGUgdGFyZ2V0IGVsZW1lbnRcbiAqIFVzZSBpdCB0byBtYWtlIGFueXRoaW5nIHRvIGxvb2sgbGlrZSBsaXN0IFRpdGxlLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnW2lneExpc3RMaW5lVGl0bGVdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIElneExpc3RMaW5lVGl0bGVEaXJlY3RpdmUge1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWxpc3RfX2l0ZW0tbGluZS10aXRsZScpXG4gICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC1saXN0X19pdGVtLWxpbmUtdGl0bGUnO1xufVxuXG4vKipcbiAqIGlneExpc3RMaW5lU3ViVGl0bGUgaXMgYSBkaXJlY3RpdmUgdGhhdCBhZGQgY2xhc3MgdG8gdGhlIHRhcmdldCBlbGVtZW50XG4gKiBVc2UgaXQgdG8gbWFrZSBhbnl0aGluZyB0byBsb29rIGxpa2UgbGlzdCBTdWJ0aXRsZS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ1tpZ3hMaXN0TGluZVN1YlRpdGxlXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hMaXN0TGluZVN1YlRpdGxlRGlyZWN0aXZlIHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1saXN0X19pdGVtLWxpbmUtc3VidGl0bGUnKVxuICAgIHB1YmxpYyBjc3NDbGFzcyA9ICdpZ3gtbGlzdF9faXRlbS1saW5lLXN1YnRpdGxlJztcbn1cblxuLyoqXG4gKiBEaXNwbGF5cyBhIGNvbGxlY3Rpb24gb2YgZGF0YSBpdGVtcyBpbiBhIHRlbXBsYXRhYmxlIGxpc3QgZm9ybWF0XG4gKlxuICogQGlneE1vZHVsZSBJZ3hMaXN0TW9kdWxlXG4gKlxuICogQGlneFRoZW1lIGlneC1saXN0LXRoZW1lXG4gKlxuICogQGlneEtleXdvcmRzIGxpc3QsIGRhdGFcbiAqXG4gKiBAaWd4R3JvdXAgR3JpZHMgJiBMaXN0c1xuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgSWduaXRlIFVJIExpc3QgZGlzcGxheXMgcm93cyBvZiBpdGVtcyBhbmQgc3VwcG9ydHMgb25lIG9yIG1vcmUgaGVhZGVyIGl0ZW1zIGFzIHdlbGwgYXMgc2VhcmNoIGFuZCBmaWx0ZXJpbmdcbiAqIG9mIGxpc3QgaXRlbXMuIEVhY2ggbGlzdCBpdGVtIGlzIGNvbXBsZXRlbHkgdGVtcGxhdGFibGUgYW5kIHdpbGwgc3VwcG9ydCBhbnkgdmFsaWQgSFRNTCBvciBBbmd1bGFyIGNvbXBvbmVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGlneC1saXN0PlxuICogICA8aWd4LWxpc3QtaXRlbSBpc0hlYWRlcj1cInRydWVcIj5Db250YWN0czwvaWd4LWxpc3QtaXRlbT5cbiAqICAgPGlneC1saXN0LWl0ZW0gKm5nRm9yPVwibGV0IGNvbnRhY3Qgb2YgY29udGFjdHNcIj5cbiAqICAgICA8c3BhbiBjbGFzcz1cIm5hbWVcIj57eyBjb250YWN0Lm5hbWUgfX08L3NwYW4+XG4gKiAgICAgPHNwYW4gY2xhc3M9XCJwaG9uZVwiPnt7IGNvbnRhY3QucGhvbmUgfX08L3NwYW4+XG4gKiAgIDwvaWd4LWxpc3QtaXRlbT5cbiAqIDwvaWd4LWxpc3Q+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtbGlzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICdsaXN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IElneExpc3RCYXNlRGlyZWN0aXZlLCB1c2VFeGlzdGluZzogSWd4TGlzdENvbXBvbmVudCB9XSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0XVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hMaXN0Q29tcG9uZW50IGV4dGVuZHMgSWd4TGlzdEJhc2VEaXJlY3RpdmUge1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIGFsbCBpdGVtcyBhbmQgaGVhZGVycyBpbiB0aGUgbGlzdC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsaXN0Q2hpbGRyZW46IFF1ZXJ5TGlzdCA9IHRoaXMubGlzdC5jaGlsZHJlbjtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKGZvcndhcmRSZWYoKCkgPT4gSWd4TGlzdEl0ZW1Db21wb25lbnQpLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gICAgcHVibGljIG92ZXJyaWRlIGNoaWxkcmVuOiBRdWVyeUxpc3Q8SWd4TGlzdEl0ZW1Db21wb25lbnQ+O1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBlbXB0eSBsaXN0IHRlbXBsYXRlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIHRlbXBsYXRlIGlzIHVzZWQgYnkgSWd4TGlzdCBpbiBjYXNlIHRoZXJlIGFyZSBubyBsaXN0IGl0ZW1zXG4gICAgICogZGVmaW5lZCBhbmQgYGlzTG9hZGluZ2AgaXMgc2V0IHRvIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWxpc3Q+XG4gICAgICogICA8bmctdGVtcGxhdGUgaWd4RW1wdHlMaXN0PlxuICAgICAqICAgICA8cCBjbGFzcz1cImVtcHR5XCI+Tm8gY29udGFjdHMhIDooPC9wPlxuICAgICAqICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiA8L2lneC1saXN0PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgZW1wdHlUZW1wbGF0ZSA9IHRoaXMubGlzdC5lbXB0eUxpc3RUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneEVtcHR5TGlzdFRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneEVtcHR5TGlzdFRlbXBsYXRlRGlyZWN0aXZlIH0pXG4gICAgcHVibGljIGVtcHR5TGlzdFRlbXBsYXRlOiBJZ3hFbXB0eUxpc3RUZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgbGlzdCBsb2FkaW5nIHRlbXBsYXRlLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBUaGlzIHRlbXBsYXRlIGlzIHVzZWQgYnkgSWd4TGlzdCBpbiBjYXNlIHRoZXJlIGFyZSBubyBsaXN0IGl0ZW1zIGRlZmluZWQgYW5kIGBpc0xvYWRpbmdgIGlzIHNldCB0byBgdHJ1ZWAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWxpc3Q+XG4gICAgICogICA8bmctdGVtcGxhdGUgaWd4RGF0YUxvYWRpbmc+XG4gICAgICogICAgIDxwPlBhdGllbmNlLCB3ZSBhcmUgY3VycmVudGx5IGxvYWRpbmcgeW91ciBkYXRhLi4uPC9wPlxuICAgICAqICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiA8L2lneC1saXN0PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbG9hZGluZ1RlbXBsYXRlID0gdGhpcy5saXN0LmRhdGFMb2FkaW5nVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hEYXRhTG9hZGluZ1RlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneERhdGFMb2FkaW5nVGVtcGxhdGVEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgZGF0YUxvYWRpbmdUZW1wbGF0ZTogSWd4RGF0YUxvYWRpbmdUZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgdGVtcGxhdGUgZm9yIGxlZnQgcGFubmluZyBhIGxpc3QgaXRlbS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgbnVsbGAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWxpc3QgW2FsbG93TGVmdFBhbm5pbmddPVwidHJ1ZVwiPlxuICAgICAqICAgPG5nLXRlbXBsYXRlIGlneExpc3RJdGVtTGVmdFBhbm5pbmc+XG4gICAgICogICAgIDxpZ3gtaWNvbj5kZWxldGU8L2lneC1pY29uPkRlbGV0ZVxuICAgICAqICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiA8L2lneC1saXN0PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXRlbUxlZnRQYW5UbXBsID0gdGhpcy5saXN0Lmxpc3RJdGVtTGVmdFBhbm5pbmdUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneExpc3RJdGVtTGVmdFBhbm5pbmdUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBJZ3hMaXN0SXRlbUxlZnRQYW5uaW5nVGVtcGxhdGVEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgb3ZlcnJpZGUgbGlzdEl0ZW1MZWZ0UGFubmluZ1RlbXBsYXRlOiBJZ3hMaXN0SXRlbUxlZnRQYW5uaW5nVGVtcGxhdGVEaXJlY3RpdmU7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIHRlbXBsYXRlIGZvciByaWdodCBwYW5uaW5nIGEgbGlzdCBpdGVtLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBudWxsYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdCBbYWxsb3dSaWdodFBhbm5pbmddID0gXCJ0cnVlXCI+XG4gICAgICogICA8bmctdGVtcGxhdGUgaWd4TGlzdEl0ZW1SaWdodFBhbm5pbmc+XG4gICAgICogICAgIDxpZ3gtaWNvbj5jYWxsPC9pZ3gtaWNvbj5EaWFsXG4gICAgICogICA8L25nLXRlbXBsYXRlPlxuICAgICAqIDwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpdGVtUmlnaHRQYW5UbXBsID0gdGhpcy5saXN0Lmxpc3RJdGVtUmlnaHRQYW5uaW5nVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hMaXN0SXRlbVJpZ2h0UGFubmluZ1RlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneExpc3RJdGVtUmlnaHRQYW5uaW5nVGVtcGxhdGVEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgb3ZlcnJpZGUgbGlzdEl0ZW1SaWdodFBhbm5pbmdUZW1wbGF0ZTogSWd4TGlzdEl0ZW1SaWdodFBhbm5pbmdUZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgdGhyZXNob2xkIGFmdGVyIHdoaWNoIHRoZSBpdGVtJ3MgcGFubmluZyB3aWxsIGJlIGNvbXBsZXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBCeSBkZWZhdWx0IHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIDAuNSB3aGljaCBpcyA1MCUgb2YgdGhlIGxpc3QgaXRlbSdzIHdpZHRoLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1saXN0IFtwYW5FbmRUcmlnZ2VyaW5nVGhyZXNob2xkXT1cIjAuOFwiPjwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcGFuRW5kVHJpZ2dlcmluZ1RocmVzaG9sZCA9IDAuNTtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGlkYCBvZiB0aGUgbGlzdC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogSWYgbm90IHNldCwgdGhlIGBpZGAgb2YgdGhlIGZpcnN0IGxpc3QgY29tcG9uZW50IHdpbGwgYmUgYFwiaWd4LWxpc3QtMFwiYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdCBpZD1cIm15LWZpcnN0LWxpc3RcIj48L2lneC1saXN0PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGlzdElkID0gdGhpcy5saXN0LmlkO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWQgPSBgaWd4LWxpc3QtJHtORVhUX0lEKyt9YDtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBsZWZ0IHBhbm5pbmcgb2YgYW4gaXRlbSBpcyBhbGxvd2VkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWxpc3QgW2FsbG93TGVmdFBhbm5pbmddPVwidHJ1ZVwiPjwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0xlZnRQYW5uaW5nQWxsb3dlZCA9IHRoaXMubGlzdC5hbGxvd0xlZnRQYW5uaW5nO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBvdmVycmlkZSBhbGxvd0xlZnRQYW5uaW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgcmlnaHQgcGFubmluZyBvZiBhbiBpdGVtIGlzIGFsbG93ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdCBbYWxsb3dSaWdodFBhbm5pbmddPVwidHJ1ZVwiPjwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1JpZ2h0UGFubmluZ0FsbG93ZWQgPSB0aGlzLmxpc3QuYWxsb3dSaWdodFBhbm5pbmc7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIG92ZXJyaWRlIGFsbG93UmlnaHRQYW5uaW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgbGlzdCBpcyBjdXJyZW50bHkgbG9hZGluZyBkYXRhLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBTZXQgaXQgdG8gZGlzcGxheSB0aGUgZGF0YUxvYWRpbmdUZW1wbGF0ZSB3aGlsZSBkYXRhIGlzIGJlaW5nIHJldHJpZXZlZC5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiAgPGlneC1saXN0IFtpc0xvYWRpbmddPVwidHJ1ZVwiPjwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0xvYWRpbmcgPSB0aGlzLmxpc3QuaXNMb2FkaW5nO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhIGxlZnQgcGFuIGdlc3R1cmUgaXMgZXhlY3V0ZWQgb24gYSBsaXN0IGl0ZW0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvZiB0eXBlIGBJTGlzdEl0ZW1QYW5uaW5nRXZlbnRBcmdzYCBhcyBhbiBldmVudCBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdCBbYWxsb3dMZWZ0UGFubmluZ109XCJ0cnVlXCIgKGxlZnRQYW4pPVwibGVmdFBhbigkZXZlbnQpXCI+PC9pZ3gtbGlzdD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgbGVmdFBhbiA9IG5ldyBFdmVudEVtaXR0ZXI8SUxpc3RJdGVtUGFubmluZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhIHJpZ2h0IHBhbiBnZXN0dXJlIGlzIGV4ZWN1dGVkIG9uIGEgbGlzdCBpdGVtLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBQcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3Qgb2YgdHlwZSBgSUxpc3RJdGVtUGFubmluZ0V2ZW50QXJnc2AgYXMgYW4gZXZlbnQgYXJndW1lbnQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWxpc3QgW2FsbG93UmlnaHRQYW5uaW5nXT1cInRydWVcIiAocmlnaHRQYW4pPVwicmlnaHRQYW4oJGV2ZW50KVwiPjwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG92ZXJyaWRlIHJpZ2h0UGFuID0gbmV3IEV2ZW50RW1pdHRlcjxJTGlzdEl0ZW1QYW5uaW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGEgcGFuIGdlc3R1cmUgaXMgc3RhcnRlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IG9mIHR5cGUgYElMaXN0SXRlbVBhbm5pbmdFdmVudEFyZ3NgIGFzIGFuIGV2ZW50IGFyZ3VtZW50LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1saXN0IChzdGFydFBhbik9XCJzdGFydFBhbigkZXZlbnQpXCI+PC9pZ3gtbGlzdD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc3RhcnRQYW4gPSBuZXcgRXZlbnRFbWl0dGVyPElMaXN0SXRlbVBhbm5pbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBwYW4gZ2VzdHVyZSBpcyBjb21wbGV0ZWQgb3IgY2FuY2VsZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvZiB0eXBlIGBJTGlzdEl0ZW1QYW5uaW5nRXZlbnRBcmdzYCBhcyBhbiBldmVudCBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdCAoZW5kUGFuKT1cImVuZFBhbigkZXZlbnQpXCI+PC9pZ3gtbGlzdD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgZW5kUGFuID0gbmV3IEV2ZW50RW1pdHRlcjxJTGlzdEl0ZW1QYW5uaW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGEgcGFuIGl0ZW0gaXMgcmV0dXJuZWQgdG8gaXRzIG9yaWdpbmFsIHBvc2l0aW9uLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBQcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3Qgb2YgdHlwZSBgSWd4TGlzdENvbXBvbmVudGAgYXMgYW4gZXZlbnQgYXJndW1lbnQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWxpc3QgKHJlc2V0UGFuKT1cInJlc2V0UGFuKCRldmVudClcIj48L2lneC1saXN0PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvdmVycmlkZSByZXNldFBhbiA9IG5ldyBFdmVudEVtaXR0ZXI8SWd4TGlzdENvbXBvbmVudD4oKTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGEgcGFuIGdlc3R1cmUgaXMgZXhlY3V0ZWQgb24gYSBsaXN0IGl0ZW0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFByb3ZpZGVzIHJlZmVyZW5jZXMgdG8gdGhlIGBJZ3hMaXN0SXRlbUNvbXBvbmVudGAgYW5kIGBJZ3hMaXN0UGFuU3RhdGVgIGFzIGV2ZW50IGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdCAocGFuU3RhdGVDaGFuZ2UpPVwicGFuU3RhdGVDaGFuZ2UoJGV2ZW50KVwiPjwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG92ZXJyaWRlIHBhblN0YXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxJUGFuU3RhdGVDaGFuZ2VFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBsaXN0IGl0ZW0gaXMgY2xpY2tlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUHJvdmlkZXMgcmVmZXJlbmNlcyB0byB0aGUgYElneExpc3RJdGVtQ29tcG9uZW50YCBhbmQgYEV2ZW50YCBhcyBldmVudCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWxpc3QgKGl0ZW1DbGlja2VkKT1cIm9uSXRlbUNsaWNrZWQoJGV2ZW50KVwiPjwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG92ZXJyaWRlIGl0ZW1DbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxJTGlzdEl0ZW1DbGlja0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RW1wdHlMaXN0JywgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pXG4gICAgcHJvdGVjdGVkIGRlZmF1bHRFbXB0eUxpc3RUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdkZWZhdWx0RGF0YUxvYWRpbmcnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdERhdGFMb2FkaW5nVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBwcml2YXRlIF9yZXNvdXJjZVN0cmluZ3MgPSBnZXRDdXJyZW50UmVzb3VyY2VTdHJpbmdzKExpc3RSZXNvdXJjZVN0cmluZ3NFTik7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQgdXNlcyBFTiByZXNvdXJjZXMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHJlc291cmNlU3RyaW5ncyh2YWx1ZTogSUxpc3RSZXNvdXJjZVN0cmluZ3MpIHtcbiAgICAgICAgdGhpcy5fcmVzb3VyY2VTdHJpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcmVzb3VyY2VTdHJpbmdzLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2Ugc3RyaW5ncy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHJlc291cmNlU3RyaW5ncygpOiBJTGlzdFJlc291cmNlU3RyaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXNvdXJjZVN0cmluZ3M7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgX2Rpc3BsYXlEZW5zaXR5T3B0aW9uczogSURpc3BsYXlEZW5zaXR5T3B0aW9ucykge1xuICAgICAgICBzdXBlcihfZGlzcGxheURlbnNpdHlPcHRpb25zLCBlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBzb3J0ZWRDaGlsZHJlbigpOiBJZ3hMaXN0SXRlbUNvbXBvbmVudFtdIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4udG9BcnJheSgpXG4gICAgICAgICAgICAgICAgLnNvcnQoKGE6IElneExpc3RJdGVtQ29tcG9uZW50LCBiOiBJZ3hMaXN0SXRlbUNvbXBvbmVudCkgPT4gYS5pbmRleCAtIGIuaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGByb2xlYCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGlzdFJvbGUgPSAgdGhpcy5saXN0LnJvbGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyBnZXQgcm9sZSgpIHtcbiAgICAgICAgcmV0dXJuICdsaXN0JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBsaXN0IGlzIGVtcHR5LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzRW1wdHkgPSAgdGhpcy5saXN0LmlzTGlzdEVtcHR5O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWxpc3QtLWVtcHR5JylcbiAgICBwdWJsaWMgZ2V0IGlzTGlzdEVtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuY2hpbGRyZW4gfHwgdGhpcy5jaGlsZHJlbi5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWxpc3QnKVxuICAgIHB1YmxpYyBnZXQgY3NzQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0xpc3RFbXB0eTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLi0tY29tcG9uZW50LXNpemUnKVxuICAgIHB1YmxpYyBnZXQgY29tcG9uZW50U2l6ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzTGlzdEVtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDb21wb25lbnRTaXplU3R5bGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsaXN0IGBpdGVtc2AgZXhjbHVkaW5nIHRoZSBoZWFkZXIgb25lcy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsaXN0SXRlbXM6IElneExpc3RJdGVtQ29tcG9uZW50W10gPSB0aGlzLmxpc3QuaXRlbXM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBpdGVtcygpOiBJZ3hMaXN0SXRlbUNvbXBvbmVudFtdIHtcbiAgICAgICAgY29uc3QgaXRlbXM6IElneExpc3RJdGVtQ29tcG9uZW50W10gPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLnNvcnRlZENoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZC5pc0hlYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGhlYWRlciBsaXN0IGBpdGVtc2AuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGlzdEhlYWRlcnM6IElneExpc3RJdGVtQ29tcG9uZW50W10gPSAgdGhpcy5saXN0LmhlYWRlcnM7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJzKCk6IElneExpc3RJdGVtQ29tcG9uZW50W10ge1xuICAgICAgICBjb25zdCBoZWFkZXJzOiBJZ3hMaXN0SXRlbUNvbXBvbmVudFtdID0gW107XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbi50b0FycmF5KCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaXNIZWFkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhlYWRlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYGNvbnRleHRgIG9iamVjdCBvZiB0aGUgdGVtcGxhdGUgYmluZGluZy5cbiAgICAgKlxuICAgICAqIEByZW1hcmtcbiAgICAgKiBHZXRzIHRoZSBgY29udGV4dGAgb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIGB0ZW1wbGF0ZSBjb250ZXh0YCBiaW5kaW5nIGludG8gdGhlIGBsaXN0IGNvbnRhaW5lcmBcbiAgICAgKiBieSBwcm92aWRpbmcgdGhlIGAkaW1wbGljaXRgIGRlY2xhcmF0aW9uIHdoaWNoIGlzIHRoZSBgSWd4TGlzdENvbXBvbmVudGAgaXRzZWxmLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxpc3RDb21wb25lbnQgPSAgdGhpcy5saXN0LmNvbnRleHQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb250ZXh0KCk6IGFueSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAkaW1wbGljaXQ6IHRoaXNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgYFRlbXBsYXRlUmVmYCB0byB0aGUgY3VycmVudGx5IHVzZWQgdGVtcGxhdGUuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGlzdFRlbXBsYXRlID0gdGhpcy5saXN0LnRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8YW55PiB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9hZGluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YUxvYWRpbmdUZW1wbGF0ZSA/IHRoaXMuZGF0YUxvYWRpbmdUZW1wbGF0ZS50ZW1wbGF0ZSA6IHRoaXMuZGVmYXVsdERhdGFMb2FkaW5nVGVtcGxhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUxpc3RUZW1wbGF0ZSA/IHRoaXMuZW1wdHlMaXN0VGVtcGxhdGUudGVtcGxhdGUgOiB0aGlzLmRlZmF1bHRFbXB0eUxpc3RUZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cblxuIiwiPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRFbXB0eUxpc3Q+XG4gICAgPGFydGljbGUgY2xhc3M9XCJpZ3gtbGlzdF9fbWVzc2FnZVwiPlxuICAgICAgICB7e3Jlc291cmNlU3RyaW5ncy5pZ3hfbGlzdF9ub19pdGVtc319XG4gICAgPC9hcnRpY2xlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0RGF0YUxvYWRpbmc+XG4gICAgPGFydGljbGUgY2xhc3M9XCJpZ3gtbGlzdF9fbWVzc2FnZVwiPlxuICAgICAgICB7e3Jlc291cmNlU3RyaW5ncy5pZ3hfbGlzdF9sb2FkaW5nfX1cbiAgICA8L2FydGljbGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCB8fCBpc0xvYWRpbmdcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGU7IGNvbnRleHQ6IGNvbnRleHRcIj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuIl19
505
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pZ25pdGV1aS1hbmd1bGFyL3NyYy9saWIvbGlzdC9saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9saXN0L2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFFZixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxLQUFLLEVBQ0wsTUFBTSxFQUVOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQ3RDLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFDSCxvQkFBb0IsRUFDcEIsK0JBQStCLEVBQy9CLDZCQUE2QixFQUU3Qix1Q0FBdUMsRUFDdkMsd0NBQXdDLEVBQzNDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBMEIsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RSxPQUFPLEVBQXdCLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRW5FLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztBQTZCaEI7OztHQUdHO0FBTUgsTUFBTSxPQUFPLHlCQUF5Qjs4R0FBekIseUJBQXlCO2tHQUF6Qix5QkFBeUI7OzJGQUF6Qix5QkFBeUI7a0JBTHJDLFNBQVM7bUJBQUM7b0JBQ1AsOERBQThEO29CQUM5RCxRQUFR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LEVBQUUsd0NBQXdDLEVBQUU7Z0JBZTFGLHlCQUF5QjtzQkFEeEMsS0FBSztnQkFtQkMsRUFBRTtzQkFGUixXQUFXO3VCQUFDLFNBQVM7O3NCQUNyQixLQUFLO2dCQWtCVSxnQkFBZ0I7c0JBRC9CLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBa0J0QixpQkFBaUI7c0JBRGhDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBbUIvQixTQUFTO3NCQURmLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBZXRCLE9BQU87c0JBRHRCLE1BQU07Z0JBZVMsUUFBUTtzQkFEdkIsTUFBTTtnQkFlUyxRQUFRO3NCQUR2QixNQUFNO2dCQWVTLE1BQU07c0JBRHJCLE1BQU07Z0JBZVMsUUFBUTtzQkFEdkIsTUFBTTtnQkFnQlMsY0FBYztzQkFEN0IsTUFBTTtnQkFlUyxXQUFXO3NCQUQxQixNQUFNO2dCQVFHLHdCQUF3QjtzQkFEakMsU0FBUzt1QkFBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFReEQsMEJBQTBCO3NCQURuQyxTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVV6RCxlQUFlO3NCQUR6QixLQUFLO2dCQXlDSyxJQUFJO3NCQUZkLFdBQVc7dUJBQUMsV0FBVzs7c0JBQ3ZCLEtBQUs7Z0JBa0JLLFdBQVc7c0JBRHJCLFdBQVc7dUJBQUMsdUJBQXVCO2dCQVV6QixRQUFRO3NCQURsQixXQUFXO3VCQUFDLGdCQUFnQjtnQkFPbEIsYUFBYTtzQkFEdkIsV0FBVzt1QkFBQyx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBPcHRpb25hbCxcbiAgICBJbmplY3QsIERpcmVjdGl2ZSwgYm9vbGVhbkF0dHJpYnV0ZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuXG5cbmltcG9ydCB7IElneExpc3RJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9saXN0LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7XG4gICAgSWd4TGlzdEJhc2VEaXJlY3RpdmUsXG4gICAgSWd4RGF0YUxvYWRpbmdUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hFbXB0eUxpc3RUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hMaXN0UGFuU3RhdGUsXG4gICAgSWd4TGlzdEl0ZW1MZWZ0UGFubmluZ1RlbXBsYXRlRGlyZWN0aXZlLFxuICAgIElneExpc3RJdGVtUmlnaHRQYW5uaW5nVGVtcGxhdGVEaXJlY3RpdmVcbn0gZnJvbSAnLi9saXN0LmNvbW1vbic7XG5pbXBvcnQgeyBJRGlzcGxheURlbnNpdHlPcHRpb25zLCBEaXNwbGF5RGVuc2l0eVRva2VuIH0gZnJvbSAnLi4vY29yZS9kZW5zaXR5JztcbmltcG9ydCB7IElCYXNlRXZlbnRBcmdzIH0gZnJvbSAnLi4vY29yZS91dGlscyc7XG5pbXBvcnQgeyBJTGlzdFJlc291cmNlU3RyaW5ncywgTGlzdFJlc291cmNlU3RyaW5nc0VOIH0gZnJvbSAnLi4vY29yZS9pMThuL2xpc3QtcmVzb3VyY2VzJztcbmltcG9ydCB7IGdldEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MgfSBmcm9tICcuLi9jb3JlL2kxOG4vcmVzb3VyY2VzJztcblxubGV0IE5FWFRfSUQgPSAwO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgdGhlIHBhblN0YXRlQ2hhbmdlIGlneExpc3QgZXZlbnQgYXJndW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVBhblN0YXRlQ2hhbmdlRXZlbnRBcmdzIGV4dGVuZHMgSUJhc2VFdmVudEFyZ3Mge1xuICAgIG9sZFN0YXRlOiBJZ3hMaXN0UGFuU3RhdGU7XG4gICAgbmV3U3RhdGU6IElneExpc3RQYW5TdGF0ZTtcbiAgICBpdGVtOiBJZ3hMaXN0SXRlbUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSBsaXN0SXRlbUNsaWNrIGlneExpc3QgZXZlbnQgYXJndW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUxpc3RJdGVtQ2xpY2tFdmVudEFyZ3MgZXh0ZW5kcyBJQmFzZUV2ZW50QXJncyB7XG4gICAgaXRlbTogSWd4TGlzdEl0ZW1Db21wb25lbnQ7XG4gICAgZXZlbnQ6IEV2ZW50O1xuICAgIGRpcmVjdGlvbjogSWd4TGlzdFBhblN0YXRlO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgdGhlIGxpc3RJdGVtUGFubmluZyBpZ3hMaXN0IGV2ZW50IGFyZ3VtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElMaXN0SXRlbVBhbm5pbmdFdmVudEFyZ3MgZXh0ZW5kcyBJQmFzZUV2ZW50QXJncyB7XG4gICAgaXRlbTogSWd4TGlzdEl0ZW1Db21wb25lbnQ7XG4gICAgZGlyZWN0aW9uOiBJZ3hMaXN0UGFuU3RhdGU7XG4gICAga2VlcEl0ZW06IGJvb2xlYW47XG59XG5cbi8qKlxuICogaWd4TGlzdFRodW1ibmFpbCBpcyBjb250YWluZXIgZm9yIHRoZSBMaXN0IG1lZGlhXG4gKiBVc2UgaXQgdG8gd3JhcCBhbnl0aGluZyB5b3Ugd2FudCB0byBiZSB1c2VkIGFzIGEgdGh1bWJuYWlsLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnW2lneExpc3RUaHVtYm5haWxdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIElneExpc3RUaHVtYm5haWxEaXJlY3RpdmUgeyB9XG5cbi8qKlxuICogaWd4TGlzdEFjdGlvbiBpcyBjb250YWluZXIgZm9yIHRoZSBMaXN0IGFjdGlvblxuICogVXNlIGl0IHRvIHdyYXAgYW55dGhpbmcgeW91IHdhbnQgdG8gYmUgdXNlZCBhcyBhIGxpc3QgYWN0aW9uOiBpY29uLCBjaGVja2JveC4uLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnW2lneExpc3RBY3Rpb25dJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIElneExpc3RBY3Rpb25EaXJlY3RpdmUgeyB9XG5cbi8qKlxuICogaWd4TGlzdExpbmUgaXMgY29udGFpbmVyIGZvciB0aGUgTGlzdCB0ZXh0IGNvbnRlbnRcbiAqIFVzZSBpdCB0byB3cmFwIGFueXRoaW5nIHlvdSB3YW50IHRvIGJlIHVzZWQgYXMgYSBwbGFuZSB0ZXh0LlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnW2lneExpc3RMaW5lXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBJZ3hMaXN0TGluZURpcmVjdGl2ZSB7IH1cblxuLyoqXG4gKiBpZ3hMaXN0TGluZVRpdGxlIGlzIGEgZGlyZWN0aXZlIHRoYXQgYWRkIGNsYXNzIHRvIHRoZSB0YXJnZXQgZWxlbWVudFxuICogVXNlIGl0IHRvIG1ha2UgYW55dGhpbmcgdG8gbG9vayBsaWtlIGxpc3QgVGl0bGUuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLXNlbGVjdG9yXG4gICAgc2VsZWN0b3I6ICdbaWd4TGlzdExpbmVUaXRsZV0nLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgSWd4TGlzdExpbmVUaXRsZURpcmVjdGl2ZSB7XG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtbGlzdF9faXRlbS1saW5lLXRpdGxlJylcbiAgICBwdWJsaWMgY3NzQ2xhc3MgPSAnaWd4LWxpc3RfX2l0ZW0tbGluZS10aXRsZSc7XG59XG5cbi8qKlxuICogaWd4TGlzdExpbmVTdWJUaXRsZSBpcyBhIGRpcmVjdGl2ZSB0aGF0IGFkZCBjbGFzcyB0byB0aGUgdGFyZ2V0IGVsZW1lbnRcbiAqIFVzZSBpdCB0byBtYWtlIGFueXRoaW5nIHRvIGxvb2sgbGlrZSBsaXN0IFN1YnRpdGxlLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICAgIHNlbGVjdG9yOiAnW2lneExpc3RMaW5lU3ViVGl0bGVdJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIElneExpc3RMaW5lU3ViVGl0bGVEaXJlY3RpdmUge1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWxpc3RfX2l0ZW0tbGluZS1zdWJ0aXRsZScpXG4gICAgcHVibGljIGNzc0NsYXNzID0gJ2lneC1saXN0X19pdGVtLWxpbmUtc3VidGl0bGUnO1xufVxuXG4vKipcbiAqIERpc3BsYXlzIGEgY29sbGVjdGlvbiBvZiBkYXRhIGl0ZW1zIGluIGEgdGVtcGxhdGFibGUgbGlzdCBmb3JtYXRcbiAqXG4gKiBAaWd4TW9kdWxlIElneExpc3RNb2R1bGVcbiAqXG4gKiBAaWd4VGhlbWUgaWd4LWxpc3QtdGhlbWVcbiAqXG4gKiBAaWd4S2V5d29yZHMgbGlzdCwgZGF0YVxuICpcbiAqIEBpZ3hHcm91cCBHcmlkcyAmIExpc3RzXG4gKlxuICogQHJlbWFya3NcbiAqIFRoZSBJZ25pdGUgVUkgTGlzdCBkaXNwbGF5cyByb3dzIG9mIGl0ZW1zIGFuZCBzdXBwb3J0cyBvbmUgb3IgbW9yZSBoZWFkZXIgaXRlbXMgYXMgd2VsbCBhcyBzZWFyY2ggYW5kIGZpbHRlcmluZ1xuICogb2YgbGlzdCBpdGVtcy4gRWFjaCBsaXN0IGl0ZW0gaXMgY29tcGxldGVseSB0ZW1wbGF0YWJsZSBhbmQgd2lsbCBzdXBwb3J0IGFueSB2YWxpZCBIVE1MIG9yIEFuZ3VsYXIgY29tcG9uZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8aWd4LWxpc3Q+XG4gKiAgIDxpZ3gtbGlzdC1pdGVtIGlzSGVhZGVyPVwidHJ1ZVwiPkNvbnRhY3RzPC9pZ3gtbGlzdC1pdGVtPlxuICogICA8aWd4LWxpc3QtaXRlbSAqbmdGb3I9XCJsZXQgY29udGFjdCBvZiBjb250YWN0c1wiPlxuICogICAgIDxzcGFuIGNsYXNzPVwibmFtZVwiPnt7IGNvbnRhY3QubmFtZSB9fTwvc3Bhbj5cbiAqICAgICA8c3BhbiBjbGFzcz1cInBob25lXCI+e3sgY29udGFjdC5waG9uZSB9fTwvc3Bhbj5cbiAqICAgPC9pZ3gtbGlzdC1pdGVtPlxuICogPC9pZ3gtbGlzdD5cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2lneC1saXN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJ2xpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogSWd4TGlzdEJhc2VEaXJlY3RpdmUsIHVzZUV4aXN0aW5nOiBJZ3hMaXN0Q29tcG9uZW50IH1dLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW05nSWYsIE5nVGVtcGxhdGVPdXRsZXRdXG59KVxuZXhwb3J0IGNsYXNzIElneExpc3RDb21wb25lbnQgZXh0ZW5kcyBJZ3hMaXN0QmFzZURpcmVjdGl2ZSB7XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgYWxsIGl0ZW1zIGFuZCBoZWFkZXJzIGluIHRoZSBsaXN0LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxpc3RDaGlsZHJlbjogUXVlcnlMaXN0ID0gdGhpcy5saXN0LmNoaWxkcmVuO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBJZ3hMaXN0SXRlbUNvbXBvbmVudCksIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgICBwdWJsaWMgb3ZlcnJpZGUgY2hpbGRyZW46IFF1ZXJ5TGlzdDxJZ3hMaXN0SXRlbUNvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGVtcHR5IGxpc3QgdGVtcGxhdGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgdGVtcGxhdGUgaXMgdXNlZCBieSBJZ3hMaXN0IGluIGNhc2UgdGhlcmUgYXJlIG5vIGxpc3QgaXRlbXNcbiAgICAgKiBkZWZpbmVkIGFuZCBgaXNMb2FkaW5nYCBpcyBzZXQgdG8gYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdD5cbiAgICAgKiAgIDxuZy10ZW1wbGF0ZSBpZ3hFbXB0eUxpc3Q+XG4gICAgICogICAgIDxwIGNsYXNzPVwiZW1wdHlcIj5ObyBjb250YWN0cyEgOig8L3A+XG4gICAgICogICA8L25nLXRlbXBsYXRlPlxuICAgICAqIDwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBlbXB0eVRlbXBsYXRlID0gdGhpcy5saXN0LmVtcHR5TGlzdFRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4RW1wdHlMaXN0VGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogSWd4RW1wdHlMaXN0VGVtcGxhdGVEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgZW1wdHlMaXN0VGVtcGxhdGU6IElneEVtcHR5TGlzdFRlbXBsYXRlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBsaXN0IGxvYWRpbmcgdGVtcGxhdGUuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFRoaXMgdGVtcGxhdGUgaXMgdXNlZCBieSBJZ3hMaXN0IGluIGNhc2UgdGhlcmUgYXJlIG5vIGxpc3QgaXRlbXMgZGVmaW5lZCBhbmQgYGlzTG9hZGluZ2AgaXMgc2V0IHRvIGB0cnVlYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdD5cbiAgICAgKiAgIDxuZy10ZW1wbGF0ZSBpZ3hEYXRhTG9hZGluZz5cbiAgICAgKiAgICAgPHA+UGF0aWVuY2UsIHdlIGFyZSBjdXJyZW50bHkgbG9hZGluZyB5b3VyIGRhdGEuLi48L3A+XG4gICAgICogICA8L25nLXRlbXBsYXRlPlxuICAgICAqIDwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsb2FkaW5nVGVtcGxhdGUgPSB0aGlzLmxpc3QuZGF0YUxvYWRpbmdUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneERhdGFMb2FkaW5nVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogSWd4RGF0YUxvYWRpbmdUZW1wbGF0ZURpcmVjdGl2ZSB9KVxuICAgIHB1YmxpYyBkYXRhTG9hZGluZ1RlbXBsYXRlOiBJZ3hEYXRhTG9hZGluZ1RlbXBsYXRlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSB0ZW1wbGF0ZSBmb3IgbGVmdCBwYW5uaW5nIGEgbGlzdCBpdGVtLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBudWxsYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdCBbYWxsb3dMZWZ0UGFubmluZ109XCJ0cnVlXCI+XG4gICAgICogICA8bmctdGVtcGxhdGUgaWd4TGlzdEl0ZW1MZWZ0UGFubmluZz5cbiAgICAgKiAgICAgPGlneC1pY29uPmRlbGV0ZTwvaWd4LWljb24+RGVsZXRlXG4gICAgICogICA8L25nLXRlbXBsYXRlPlxuICAgICAqIDwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpdGVtTGVmdFBhblRtcGwgPSB0aGlzLmxpc3QubGlzdEl0ZW1MZWZ0UGFubmluZ1RlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4TGlzdEl0ZW1MZWZ0UGFubmluZ1RlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneExpc3RJdGVtTGVmdFBhbm5pbmdUZW1wbGF0ZURpcmVjdGl2ZSB9KVxuICAgIHB1YmxpYyBvdmVycmlkZSBsaXN0SXRlbUxlZnRQYW5uaW5nVGVtcGxhdGU6IElneExpc3RJdGVtTGVmdFBhbm5pbmdUZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgdGVtcGxhdGUgZm9yIHJpZ2h0IHBhbm5pbmcgYSBsaXN0IGl0ZW0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYG51bGxgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1saXN0IFthbGxvd1JpZ2h0UGFubmluZ10gPSBcInRydWVcIj5cbiAgICAgKiAgIDxuZy10ZW1wbGF0ZSBpZ3hMaXN0SXRlbVJpZ2h0UGFubmluZz5cbiAgICAgKiAgICAgPGlneC1pY29uPmNhbGw8L2lneC1pY29uPkRpYWxcbiAgICAgKiAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogPC9pZ3gtbGlzdD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGl0ZW1SaWdodFBhblRtcGwgPSB0aGlzLmxpc3QubGlzdEl0ZW1SaWdodFBhbm5pbmdUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneExpc3RJdGVtUmlnaHRQYW5uaW5nVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogSWd4TGlzdEl0ZW1SaWdodFBhbm5pbmdUZW1wbGF0ZURpcmVjdGl2ZSB9KVxuICAgIHB1YmxpYyBvdmVycmlkZSBsaXN0SXRlbVJpZ2h0UGFubmluZ1RlbXBsYXRlOiBJZ3hMaXN0SXRlbVJpZ2h0UGFubmluZ1RlbXBsYXRlRGlyZWN0aXZlO1xuXG4gICAgLyoqXG4gICAgICogUHJvdmlkZXMgYSB0aHJlc2hvbGQgYWZ0ZXIgd2hpY2ggdGhlIGl0ZW0ncyBwYW5uaW5nIHdpbGwgYmUgY29tcGxldGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIEJ5IGRlZmF1bHQgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gMC41IHdoaWNoIGlzIDUwJSBvZiB0aGUgbGlzdCBpdGVtJ3Mgd2lkdGguXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWxpc3QgW3BhbkVuZFRyaWdnZXJpbmdUaHJlc2hvbGRdPVwiMC44XCI+PC9pZ3gtbGlzdD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBvdmVycmlkZSBwYW5FbmRUcmlnZ2VyaW5nVGhyZXNob2xkID0gMC41O1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgaWRgIG9mIHRoZSBsaXN0LlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBJZiBub3Qgc2V0LCB0aGUgYGlkYCBvZiB0aGUgZmlyc3QgbGlzdCBjb21wb25lbnQgd2lsbCBiZSBgXCJpZ3gtbGlzdC0wXCJgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1saXN0IGlkPVwibXktZmlyc3QtbGlzdFwiPjwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsaXN0SWQgPSB0aGlzLmxpc3QuaWQ7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpZCA9IGBpZ3gtbGlzdC0ke05FWFRfSUQrK31gO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGxlZnQgcGFubmluZyBvZiBhbiBpdGVtIGlzIGFsbG93ZWQuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdCBbYWxsb3dMZWZ0UGFubmluZ109XCJ0cnVlXCI+PC9pZ3gtbGlzdD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzTGVmdFBhbm5pbmdBbGxvd2VkID0gdGhpcy5saXN0LmFsbG93TGVmdFBhbm5pbmc7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIG92ZXJyaWRlIGFsbG93TGVmdFBhbm5pbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSByaWdodCBwYW5uaW5nIG9mIGFuIGl0ZW0gaXMgYWxsb3dlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1saXN0IFthbGxvd1JpZ2h0UGFubmluZ109XCJ0cnVlXCI+PC9pZ3gtbGlzdD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzUmlnaHRQYW5uaW5nQWxsb3dlZCA9IHRoaXMubGlzdC5hbGxvd1JpZ2h0UGFubmluZztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgb3ZlcnJpZGUgYWxsb3dSaWdodFBhbm5pbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBsaXN0IGlzIGN1cnJlbnRseSBsb2FkaW5nIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFNldCBpdCB0byBkaXNwbGF5IHRoZSBkYXRhTG9hZGluZ1RlbXBsYXRlIHdoaWxlIGRhdGEgaXMgYmVpbmcgcmV0cmlldmVkLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWxpc3QgW2lzTG9hZGluZ109XCJ0cnVlXCI+PC9pZ3gtbGlzdD5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzTG9hZGluZyA9IHRoaXMubGlzdC5pc0xvYWRpbmc7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGlzTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGEgbGVmdCBwYW4gZ2VzdHVyZSBpcyBleGVjdXRlZCBvbiBhIGxpc3QgaXRlbS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IG9mIHR5cGUgYElMaXN0SXRlbVBhbm5pbmdFdmVudEFyZ3NgIGFzIGFuIGV2ZW50IGFyZ3VtZW50LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1saXN0IFthbGxvd0xlZnRQYW5uaW5nXT1cInRydWVcIiAobGVmdFBhbik9XCJsZWZ0UGFuKCRldmVudClcIj48L2lneC1saXN0PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvdmVycmlkZSBsZWZ0UGFuID0gbmV3IEV2ZW50RW1pdHRlcjxJTGlzdEl0ZW1QYW5uaW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGEgcmlnaHQgcGFuIGdlc3R1cmUgaXMgZXhlY3V0ZWQgb24gYSBsaXN0IGl0ZW0uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvZiB0eXBlIGBJTGlzdEl0ZW1QYW5uaW5nRXZlbnRBcmdzYCBhcyBhbiBldmVudCBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdCBbYWxsb3dSaWdodFBhbm5pbmddPVwidHJ1ZVwiIChyaWdodFBhbik9XCJyaWdodFBhbigkZXZlbnQpXCI+PC9pZ3gtbGlzdD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmlnaHRQYW4gPSBuZXcgRXZlbnRFbWl0dGVyPElMaXN0SXRlbVBhbm5pbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBwYW4gZ2VzdHVyZSBpcyBzdGFydGVkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBQcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3Qgb2YgdHlwZSBgSUxpc3RJdGVtUGFubmluZ0V2ZW50QXJnc2AgYXMgYW4gZXZlbnQgYXJndW1lbnQuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWxpc3QgKHN0YXJ0UGFuKT1cInN0YXJ0UGFuKCRldmVudClcIj48L2lneC1saXN0PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvdmVycmlkZSBzdGFydFBhbiA9IG5ldyBFdmVudEVtaXR0ZXI8SUxpc3RJdGVtUGFubmluZ0V2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhIHBhbiBnZXN0dXJlIGlzIGNvbXBsZXRlZCBvciBjYW5jZWxlZC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IG9mIHR5cGUgYElMaXN0SXRlbVBhbm5pbmdFdmVudEFyZ3NgIGFzIGFuIGV2ZW50IGFyZ3VtZW50LlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1saXN0IChlbmRQYW4pPVwiZW5kUGFuKCRldmVudClcIj48L2lneC1saXN0PlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvdmVycmlkZSBlbmRQYW4gPSBuZXcgRXZlbnRFbWl0dGVyPElMaXN0SXRlbVBhbm5pbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBwYW4gaXRlbSBpcyByZXR1cm5lZCB0byBpdHMgb3JpZ2luYWwgcG9zaXRpb24uXG4gICAgICpcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvZiB0eXBlIGBJZ3hMaXN0Q29tcG9uZW50YCBhcyBhbiBldmVudCBhcmd1bWVudC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdCAocmVzZXRQYW4pPVwicmVzZXRQYW4oJGV2ZW50KVwiPjwvaWd4LWxpc3Q+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG92ZXJyaWRlIHJlc2V0UGFuID0gbmV3IEV2ZW50RW1pdHRlcjxJZ3hMaXN0Q29tcG9uZW50PigpO1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYSBwYW4gZ2VzdHVyZSBpcyBleGVjdXRlZCBvbiBhIGxpc3QgaXRlbS5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUHJvdmlkZXMgcmVmZXJlbmNlcyB0byB0aGUgYElneExpc3RJdGVtQ29tcG9uZW50YCBhbmQgYElneExpc3RQYW5TdGF0ZWAgYXMgZXZlbnQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1saXN0IChwYW5TdGF0ZUNoYW5nZSk9XCJwYW5TdGF0ZUNoYW5nZSgkZXZlbnQpXCI+PC9pZ3gtbGlzdD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcGFuU3RhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPElQYW5TdGF0ZUNoYW5nZUV2ZW50QXJncz4oKTtcblxuICAgIC8qKlxuICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhIGxpc3QgaXRlbSBpcyBjbGlja2VkLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBQcm92aWRlcyByZWZlcmVuY2VzIHRvIHRoZSBgSWd4TGlzdEl0ZW1Db21wb25lbnRgIGFuZCBgRXZlbnRgIGFzIGV2ZW50IGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdCAoaXRlbUNsaWNrZWQpPVwib25JdGVtQ2xpY2tlZCgkZXZlbnQpXCI+PC9pZ3gtbGlzdD5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb3ZlcnJpZGUgaXRlbUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPElMaXN0SXRlbUNsaWNrRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRFbXB0eUxpc3QnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICBwcm90ZWN0ZWQgZGVmYXVsdEVtcHR5TGlzdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHREYXRhTG9hZGluZycsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0RGF0YUxvYWRpbmdUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIHByaXZhdGUgX3Jlc291cmNlU3RyaW5ncyA9IGdldEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MoTGlzdFJlc291cmNlU3RyaW5nc0VOKTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHJlc291cmNlIHN0cmluZ3MuXG4gICAgICogQnkgZGVmYXVsdCBpdCB1c2VzIEVOIHJlc291cmNlcy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgcmVzb3VyY2VTdHJpbmdzKHZhbHVlOiBJTGlzdFJlc291cmNlU3RyaW5ncykge1xuICAgICAgICB0aGlzLl9yZXNvdXJjZVN0cmluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9yZXNvdXJjZVN0cmluZ3MsIHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBzdHJpbmdzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcmVzb3VyY2VTdHJpbmdzKCk6IElMaXN0UmVzb3VyY2VTdHJpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc291cmNlU3RyaW5ncztcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChEaXNwbGF5RGVuc2l0eVRva2VuKSBfZGlzcGxheURlbnNpdHlPcHRpb25zOiBJRGlzcGxheURlbnNpdHlPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKF9kaXNwbGF5RGVuc2l0eU9wdGlvbnMsIGVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IHNvcnRlZENoaWxkcmVuKCk6IElneExpc3RJdGVtQ29tcG9uZW50W10ge1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi50b0FycmF5KClcbiAgICAgICAgICAgICAgICAuc29ydCgoYTogSWd4TGlzdEl0ZW1Db21wb25lbnQsIGI6IElneExpc3RJdGVtQ29tcG9uZW50KSA9PiBhLmluZGV4IC0gYi5pbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcm9sZSA9ICdsaXN0JztcblxuICAgIC8qKlxuICAgICAqIEdldHMvU2V0cyB0aGUgYHJvbGVgIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsaXN0Um9sZSA9ICB0aGlzLmxpc3Qucm9sZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHJvbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yb2xlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcm9sZSh2YWw6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9yb2xlID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIGxpc3QgaXMgZW1wdHkuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNFbXB0eSA9ICB0aGlzLmxpc3QuaXNMaXN0RW1wdHk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtbGlzdC0tZW1wdHknKVxuICAgIHB1YmxpYyBnZXQgaXNMaXN0RW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jaGlsZHJlbiB8fCB0aGlzLmNoaWxkcmVuLmxlbmd0aCA9PT0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtbGlzdCcpXG4gICAgcHVibGljIGdldCBjc3NDbGFzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzTGlzdEVtcHR5O1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUuLS1jb21wb25lbnQtc2l6ZScpXG4gICAgcHVibGljIGdldCBjb21wb25lbnRTaXplKCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNMaXN0RW1wdHkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbXBvbmVudFNpemVTdHlsZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxpc3QgYGl0ZW1zYCBleGNsdWRpbmcgdGhlIGhlYWRlciBvbmVzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxpc3RJdGVtczogSWd4TGlzdEl0ZW1Db21wb25lbnRbXSA9IHRoaXMubGlzdC5pdGVtcztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGl0ZW1zKCk6IElneExpc3RJdGVtQ29tcG9uZW50W10ge1xuICAgICAgICBjb25zdCBpdGVtczogSWd4TGlzdEl0ZW1Db21wb25lbnRbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuc29ydGVkQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLmlzSGVhZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaGVhZGVyIGxpc3QgYGl0ZW1zYC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsaXN0SGVhZGVyczogSWd4TGlzdEl0ZW1Db21wb25lbnRbXSA9ICB0aGlzLmxpc3QuaGVhZGVycztcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlcnMoKTogSWd4TGlzdEl0ZW1Db21wb25lbnRbXSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcnM6IElneExpc3RJdGVtQ29tcG9uZW50W10gPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuLnRvQXJyYXkoKSkge1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZC5pc0hlYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLnB1c2goY2hpbGQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGVhZGVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgY29udGV4dGAgb2JqZWN0IG9mIHRoZSB0ZW1wbGF0ZSBiaW5kaW5nLlxuICAgICAqXG4gICAgICogQHJlbWFya1xuICAgICAqIEdldHMgdGhlIGBjb250ZXh0YCBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyB0aGUgYHRlbXBsYXRlIGNvbnRleHRgIGJpbmRpbmcgaW50byB0aGUgYGxpc3QgY29udGFpbmVyYFxuICAgICAqIGJ5IHByb3ZpZGluZyB0aGUgYCRpbXBsaWNpdGAgZGVjbGFyYXRpb24gd2hpY2ggaXMgdGhlIGBJZ3hMaXN0Q29tcG9uZW50YCBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGlzdENvbXBvbmVudCA9ICB0aGlzLmxpc3QuY29udGV4dDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbnRleHQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICRpbXBsaWNpdDogdGhpc1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBgVGVtcGxhdGVSZWZgIHRvIHRoZSBjdXJyZW50bHkgdXNlZCB0ZW1wbGF0ZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsaXN0VGVtcGxhdGUgPSB0aGlzLmxpc3QudGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGdldCB0ZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2FkaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhTG9hZGluZ1RlbXBsYXRlID8gdGhpcy5kYXRhTG9hZGluZ1RlbXBsYXRlLnRlbXBsYXRlIDogdGhpcy5kZWZhdWx0RGF0YUxvYWRpbmdUZW1wbGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVtcHR5TGlzdFRlbXBsYXRlID8gdGhpcy5lbXB0eUxpc3RUZW1wbGF0ZS50ZW1wbGF0ZSA6IHRoaXMuZGVmYXVsdEVtcHR5TGlzdFRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuXG4iLCI8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEVtcHR5TGlzdD5cbiAgICA8YXJ0aWNsZSBjbGFzcz1cImlneC1saXN0X19tZXNzYWdlXCI+XG4gICAgICAgIHt7cmVzb3VyY2VTdHJpbmdzLmlneF9saXN0X25vX2l0ZW1zfX1cbiAgICA8L2FydGljbGU+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHREYXRhTG9hZGluZz5cbiAgICA8YXJ0aWNsZSBjbGFzcz1cImlneC1saXN0X19tZXNzYWdlXCI+XG4gICAgICAgIHt7cmVzb3VyY2VTdHJpbmdzLmlneF9saXN0X2xvYWRpbmd9fVxuICAgIDwvYXJ0aWNsZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwIHx8IGlzTG9hZGluZ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZTsgY29udGV4dDogY29udGV4dFwiPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG4iXX0=