@cleavelandprice/ngx-lib 3.1.16 → 3.1.17

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.
@@ -9,6 +9,7 @@ export declare class UserFormFieldComponent implements OnInit {
9
9
  private activeDirectoryService;
10
10
  private sharePointService;
11
11
  usersSelected: EventEmitter<string | string[]>;
12
+ userUnSelected: EventEmitter<string>;
12
13
  placeholder: string;
13
14
  clickable: boolean;
14
15
  userChooserData: UserChooserData;
@@ -19,9 +20,10 @@ export declare class UserFormFieldComponent implements OnInit {
19
20
  constructor(dialog: MatDialog, activeDirectoryService: ActiveDirectoryService, sharePointService: SharePointService);
20
21
  ngOnInit(): void;
21
22
  selectUser(): void;
23
+ unSelectUser(accountName: string): void;
22
24
  private getData;
23
25
  getUser(accountName: string): User | undefined;
24
26
  getPhoto(accountName: string): string | undefined;
25
27
  static ɵfac: i0.ɵɵFactoryDeclaration<UserFormFieldComponent, never>;
26
- static ɵcmp: i0.ɵɵComponentDeclaration<UserFormFieldComponent, "user-form-field", never, { "placeholder": "placeholder"; "clickable": "clickable"; "userChooserData": "userChooserData"; }, { "usersSelected": "usersSelected"; }, never, never, false>;
28
+ static ɵcmp: i0.ɵɵComponentDeclaration<UserFormFieldComponent, "user-form-field", never, { "placeholder": "placeholder"; "clickable": "clickable"; "userChooserData": "userChooserData"; }, { "usersSelected": "usersSelected"; "userUnSelected": "userUnSelected"; }, never, never, false>;
27
29
  }
@@ -121,6 +121,7 @@ export class UserChooserComponent {
121
121
  // Need groups in place before we handle exclusions/inclusions/pre-selections
122
122
  this.groups = this.adGroupsNeeded ? data[2] : null;
123
123
  let users = data[0];
124
+ users.forEach(u => u.selected = false); // In case existing data was re-used
124
125
  users = this.includeUsersByAccountName(users);
125
126
  users = this.includeUsersByGroupName(users);
126
127
  users = this.includeUsersByDepartment(users);
@@ -335,7 +336,7 @@ export class UserChooserComponent {
335
336
  }
336
337
  listenForFilterChanges() {
337
338
  this.filterForm.get('filter')?.valueChanges
338
- .pipe(debounceTime(500))
339
+ .pipe(debounceTime(250))
339
340
  .subscribe(() => this.dataSource.filter = this.filterForm.value.filter?.trim().toLowerCase());
340
341
  }
341
342
  tooltip(user) {
@@ -349,10 +350,10 @@ export class UserChooserComponent {
349
350
  }
350
351
  }
351
352
  UserChooserComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: UserChooserComponent, deps: [{ token: MAT_DIALOG_DATA }, { token: i1.MatDialogRef }, { token: i2.ActiveDirectoryService }, { token: i3.SharePointService }], target: i0.ɵɵFactoryTarget.Component });
352
- UserChooserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.1", type: UserChooserComponent, selector: "user-chooser", viewQueries: [{ propertyName: "selectionList", first: true, predicate: MatSelectionList, descendants: true }], ngImport: i0, template: "<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ data.title }}</h2>\n\n <div>\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n <div *ngIf=\"!(dataSource && photos)\">\n <mat-spinner [diameter]=\"50\"></mat-spinner>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n\n <ng-container *ngIf=\"dataSource && photos\">\n <form [formGroup]=\"filterForm\">\n <mat-form-field *ngIf=\"dataSource\">\n <input matInput placeholder=\"Search\" formControlName=\"filter\">\n\n <button *ngIf=\"filterForm.value.filter\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n </mat-form-field>\n </form>\n\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n\n <mat-list-option *ngFor=\"let user of dataSource?.filteredData\" [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n\n <img *ngIf=\"getPhoto(user)\" matListAvatar alt=\"\" [src]=\"getPhoto(user)\">\n\n <mat-icon *ngIf=\"!getPhoto(user)\" matListAvatar class=\"no-photo\"\n fontIcon=\"account_circle\">\n </mat-icon>\n \n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n <div *ngIf=\"data.showPhone && user.telephoneNumber\">{{ user.telephoneNumber }}</div>\n </div>\n \n <div>{{ user.department }}</div>\n \n <div class=\"title\">{{ user.title }}</div>\n </div>\n </mat-list-option>\n </mat-selection-list>\n </ng-container>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <ng-container *ngIf=\"dataSource && photos\">\n <mat-slide-toggle *ngIf=\"selectedOptions.length\" (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n *ngIf=\"isMultiMode\">\n <mat-icon fontIcon=\"select_all\"></mat-icon>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n \n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n *ngIf=\"isMultiMode && selectedOptions.length\">\n <mat-icon fontIcon=\"clear_all\"></mat-icon>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"></mat-icon>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n </ng-container>\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}.mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width:801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix]" }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i10.MatListAvatarCssMatStyler, selector: "[mat-list-avatar], [matListAvatar]" }, { kind: "component", type: i10.MatSelectionList, selector: "mat-selection-list", inputs: ["disableRipple", "color", "compareWith", "disabled", "multiple"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i10.MatListOption, selector: "mat-list-option", inputs: ["disableRipple", "checkboxPosition", "color", "value", "disabled", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "component", type: i11.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i12.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
353
+ UserChooserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.1", type: UserChooserComponent, selector: "user-chooser", viewQueries: [{ propertyName: "selectionList", first: true, predicate: MatSelectionList, descendants: true }], ngImport: i0, template: "<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ data.title }}</h2>\n\n <div>\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n <div *ngIf=\"!(dataSource && photos)\">\n <mat-spinner [diameter]=\"50\"></mat-spinner>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n\n <ng-container *ngIf=\"dataSource && photos\">\n <form [formGroup]=\"filterForm\">\n <mat-form-field *ngIf=\"dataSource\">\n <input matInput placeholder=\"Search\" formControlName=\"filter\">\n\n <button *ngIf=\"filterForm.value.filter\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n </mat-form-field>\n </form>\n\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n\n <mat-list-option *ngFor=\"let user of dataSource?.filteredData\" [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n\n <img *ngIf=\"getPhoto(user)\" matListAvatar alt=\"\" [src]=\"getPhoto(user)\">\n\n <mat-icon *ngIf=\"!getPhoto(user)\" matListAvatar class=\"no-photo\"\n fontIcon=\"account_circle\">\n </mat-icon>\n \n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n <div *ngIf=\"data.showPhone && user.telephoneNumber\">{{ user.telephoneNumber }}</div>\n </div>\n \n <div>{{ user.department }}</div>\n \n <div class=\"title\">{{ user.title }}</div>\n </div>\n </mat-list-option>\n </mat-selection-list>\n </ng-container>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <ng-container *ngIf=\"dataSource && photos\">\n <mat-slide-toggle *ngIf=\"selectedOptions.length\" (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n *ngIf=\"isMultiMode\">\n <mat-icon fontIcon=\"select_all\"></mat-icon>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n \n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n *ngIf=\"isMultiMode && selectedOptions.length\">\n <mat-icon fontIcon=\"clear_all\"></mat-icon>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n\n <button *ngIf=\"isMultiMode || !data.closeWhenSelectionMade\" mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"></mat-icon>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n </ng-container>\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}.mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width:801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i5.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix]" }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i10.MatListAvatarCssMatStyler, selector: "[mat-list-avatar], [matListAvatar]" }, { kind: "component", type: i10.MatSelectionList, selector: "mat-selection-list", inputs: ["disableRipple", "color", "compareWith", "disabled", "multiple"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i10.MatListOption, selector: "mat-list-option", inputs: ["disableRipple", "checkboxPosition", "color", "value", "disabled", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "component", type: i11.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i12.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
353
354
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: UserChooserComponent, decorators: [{
354
355
  type: Component,
355
- args: [{ selector: 'user-chooser', template: "<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ data.title }}</h2>\n\n <div>\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n <div *ngIf=\"!(dataSource && photos)\">\n <mat-spinner [diameter]=\"50\"></mat-spinner>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n\n <ng-container *ngIf=\"dataSource && photos\">\n <form [formGroup]=\"filterForm\">\n <mat-form-field *ngIf=\"dataSource\">\n <input matInput placeholder=\"Search\" formControlName=\"filter\">\n\n <button *ngIf=\"filterForm.value.filter\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n </mat-form-field>\n </form>\n\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n\n <mat-list-option *ngFor=\"let user of dataSource?.filteredData\" [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n\n <img *ngIf=\"getPhoto(user)\" matListAvatar alt=\"\" [src]=\"getPhoto(user)\">\n\n <mat-icon *ngIf=\"!getPhoto(user)\" matListAvatar class=\"no-photo\"\n fontIcon=\"account_circle\">\n </mat-icon>\n \n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n <div *ngIf=\"data.showPhone && user.telephoneNumber\">{{ user.telephoneNumber }}</div>\n </div>\n \n <div>{{ user.department }}</div>\n \n <div class=\"title\">{{ user.title }}</div>\n </div>\n </mat-list-option>\n </mat-selection-list>\n </ng-container>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <ng-container *ngIf=\"dataSource && photos\">\n <mat-slide-toggle *ngIf=\"selectedOptions.length\" (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n *ngIf=\"isMultiMode\">\n <mat-icon fontIcon=\"select_all\"></mat-icon>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n \n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n *ngIf=\"isMultiMode && selectedOptions.length\">\n <mat-icon fontIcon=\"clear_all\"></mat-icon>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n\n <button mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"></mat-icon>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n </ng-container>\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}.mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width:801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"] }]
356
+ args: [{ selector: 'user-chooser', template: "<div id=\"dialog-title\">\n <h2 mat-dialog-title>{{ data.title }}</h2>\n\n <div>\n {{ selectedOptions.length }} selected\n </div>\n</div>\n\n<mat-dialog-content>\n <div *ngIf=\"!(dataSource && photos)\">\n <mat-spinner [diameter]=\"50\"></mat-spinner>\n <h2 id=\"spinner-message\">Getting users and photos...</h2>\n </div>\n\n <ng-container *ngIf=\"dataSource && photos\">\n <form [formGroup]=\"filterForm\">\n <mat-form-field *ngIf=\"dataSource\">\n <input matInput placeholder=\"Search\" formControlName=\"filter\">\n\n <button *ngIf=\"filterForm.value.filter\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"filterForm.get('filter')?.setValue('')\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n </mat-form-field>\n </form>\n\n <mat-selection-list [multiple]=\"isMultiMode\"\n (selectionChange)=\"listSelectionChanged($event.options)\">\n\n <mat-list-option *ngFor=\"let user of dataSource?.filteredData\" [value]=\"user\" [selected]=\"user.selected\"\n (selectedChange)=\"optionSelectionChanged(option)\" #option>\n\n <img *ngIf=\"getPhoto(user)\" matListAvatar alt=\"\" [src]=\"getPhoto(user)\">\n\n <mat-icon *ngIf=\"!getPhoto(user)\" matListAvatar class=\"no-photo\"\n fontIcon=\"account_circle\">\n </mat-icon>\n \n <div class=\"user\">\n <div [matTooltip]=\"tooltip(user)\" class=\"user-name\">\n {{ user.displayName }}\n <div *ngIf=\"data.showPhone && user.telephoneNumber\">{{ user.telephoneNumber }}</div>\n </div>\n \n <div>{{ user.department }}</div>\n \n <div class=\"title\">{{ user.title }}</div>\n </div>\n </mat-list-option>\n </mat-selection-list>\n </ng-container>\n</mat-dialog-content>\n\n<mat-dialog-actions>\n <ng-container *ngIf=\"dataSource && photos\">\n <mat-slide-toggle *ngIf=\"selectedOptions.length\" (change)=\"hideUnselectedChanged($event.checked)\">\n Hide Unselected\n </mat-slide-toggle>\n\n <button mat-raised-button color=\"primary\" (click)=\"selectAll()\"\n *ngIf=\"isMultiMode\">\n <mat-icon fontIcon=\"select_all\"></mat-icon>\n <span class=\"hide-mobile\">Select All</span>\n </button>\n \n <button mat-raised-button color=\"primary\" (click)=\"deselectAll()\"\n *ngIf=\"isMultiMode && selectedOptions.length\">\n <mat-icon fontIcon=\"clear_all\"></mat-icon>\n <span class=\"hide-mobile\">Clear All</span>\n </button>\n\n <button *ngIf=\"isMultiMode || !data.closeWhenSelectionMade\" mat-raised-button color=\"primary\" (click)=\"close()\" matTooltip=\"Accept your selection\"\n [disabled]=\"!selectedOptions.length\">\n <mat-icon fontIcon=\"check\"></mat-icon>\n <span class=\"hide-mobile\">Ok</span>\n </button>\n </ng-container>\n\n <button mat-raised-button color=\"warn\" mat-dialog-close matTooltip=\"Close this window\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n <span class=\"hide-mobile\">Cancel</span>\n </button>\n</mat-dialog-actions>", styles: ["::ng-deep .mat-tooltip{font-size:1em!important;white-space:pre-line}mat-dialog-content{min-width:50vw}#dialog-title{display:flex;justify-content:space-between}.mat-spinner{margin:0 auto}#spinner-message{text-align:center;padding:.5em}mat-form-field{width:100%}.title{font-style:italic;color:#757575}img,.no-photo{width:2rem;height:2rem;font-size:2.3rem!important;border-radius:100%}.hide-mobile{display:none}mat-dialog-actions{display:grid;grid-auto-flow:column;grid-gap:1em;justify-content:center}.user-name{display:flex;justify-content:space-between}.user-name>div:last-child{margin-right:10rem;font-weight:400;font-style:italic;color:#757575}@media (min-width:801px){.user{display:grid;grid-template-columns:1fr 1fr 1fr}.user>div:first-child{font-weight:700}.hide-mobile{display:initial}}\n", ".material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:\"liga\"}\n"] }]
356
357
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
357
358
  type: Inject,
358
359
  args: [MAT_DIALOG_DATA]
@@ -360,4 +361,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImpor
360
361
  type: ViewChild,
361
362
  args: [MatSelectionList]
362
363
  }] } });
363
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jaG9vc2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnkvZ3VpL3NyYy9jb21wb25lbnRzL3VzZXItY2hvb3Nlci91c2VyLWNob29zZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeS9ndWkvc3JjL2NvbXBvbmVudHMvdXNlci1jaG9vc2VyL3VzZXItY2hvb3Nlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQWdCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBaUIsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLOUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFHbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFVbkQsTUFBTSxPQUFPLG9CQUFvQjtJQWtDL0IsWUFBWTtJQUVaLG1CQUFtQjtJQUNuQixZQUE0QyxJQUFxQixFQUM3QyxTQUE2QyxFQUM3QyxzQkFBOEMsRUFDOUMsaUJBQW9DO1FBSFosU0FBSSxHQUFKLElB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QUssT0FBTyxDQUNwQyxFQUFFLElBQUksQ0FDUjtpQkFDQSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFFLEdBQUcsQ0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqQixFQUFFLENBQUM7SUFDUCxDQUFDOztpSEF6WlUsb0JBQW9CLGtCQXFDWCxlQUFlO3FHQXJDeEIsb0JBQW9CLG1HQUVwQixnQkFBZ0IsZ0RDekI3QiwyMEdBaUZxQjsyRkQxRFIsb0JBQW9CO2tCQVJoQyxTQUFTOytCQUNFLGNBQWM7OzBCQTRDWCxNQUFNOzJCQUFDLGVBQWU7NElBbkNOLGFBQWE7c0JBQXpDLFNBQVM7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0TGlzdE9wdGlvbiwgTWF0U2VsZWN0aW9uTGlzdCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xpc3QnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQWN0aXZlRGlyZWN0b3J5U2VydmljZSwgR3JvdXAgfSBmcm9tICdAY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeSc7XG5pbXBvcnQgeyBTaGFyZVBvaW50U2VydmljZSwgUGhvdG9JdGVtIH0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL3NoYXJlcG9pbnQnO1xuXG5pbXBvcnQgeyBkZWZhdWx0VXNlckNob29zZXJDb25maWcgfSBmcm9tICcuLi8uLi9tb2RlbC9kZWZhdWx0LXVzZXItY2hvb3Nlci1jb25maWcnO1xuaW1wb3J0IHsgU2VsZWN0YWJsZVVzZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9zZWxlY3RhYmxlLXVzZXInO1xuaW1wb3J0IHsgVXNlckNob29zZXJEYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlci1jaG9vc2VyLWRhdGEnO1xuaW1wb3J0IHsgVXNlckNob29zZXJNb2RlIH0gZnJvbSAnLi4vLi4vcHVibGljX2FwaSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3VzZXItY2hvb3NlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWNob29zZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtcbiAgICAnLi91c2VyLWNob29zZXIuY29tcG9uZW50LmNzcycsXG4gICAgJy4uLy4uLy4uLy4uLy4uL3N0eWxlcy9tYXQtaWNvbi5jc3MnXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVXNlckNob29zZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvLyNyZWdpb24gRmllbGRzXG4gIEBWaWV3Q2hpbGQoTWF0U2VsZWN0aW9uTGlzdCkgc2VsZWN0aW9uTGlzdDogTWF0U2VsZWN0aW9uTGlzdCB8IG51bGwgPSBudWxsO1xuXG4gIGZpbHRlckZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBmaWx0ZXI6IG5ldyBGb3JtQ29udHJvbCgpXG4gIH0pO1xuXG4gIGRhdGFTb3VyY2U6IE1hdFRhYmxlRGF0YVNvdXJjZTxTZWxlY3RhYmxlVXNlcj4gfCBudWxsID0gbnVsbDtcbiAgcGhvdG9zOiBQaG90b0l0ZW1bXSB8IG51bGwgPSBudWxsO1xuICBncm91cHM6IEdyb3VwW10gfCBudWxsID0gbnVsbDsgLy8gTWF5IG9yIG1heSBub3QgZ2V0IHBvcHVsYXRlZCwgZGVwZW5kaW5nIG9uIGNvbmZpZyBkYXRhIHNlbnQgaW5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFByb3BlcnRpZXNcbiAgZ2V0IGlzTXVsdGlNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEubW9kZSA9PT0gVXNlckNob29zZXJNb2RlLk11bHRpcGxlO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkT3B0aW9ucygpOiBNYXRMaXN0T3B0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkxpc3Q/Lm9wdGlvbnMuZmlsdGVyKG8gPT4gby5zZWxlY3RlZCkgPz8gW107XG4gIH1cblxuICBnZXQgZmlsdGVyVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLmZpbHRlcjtcbiAgfVxuXG4gIGdldCBhZEdyb3Vwc05lZWRlZCgpOiBib29sZWFuIHtcbiAgICAvLyBJZiBhbnkgYXJlIHRoZXNlIGFyZSB0cnVlLCB0aGVuIHdlIG5lZWQgdG8gcHVsbCBBRCBncm91cHMgZm9yIHVzZSBsYXRlclxuICAgIHJldHVybiB0aGlzLmRhdGEuc2hvd0dyb3VwTWVtYmVyc2hpcFRvb2x0aXBzIHx8XG4gICAgICB0aGlzLmRhdGEuZXhjbHVzaW9ucy5ncm91cHMubGVuZ3RoID4gMCB8fFxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMuZ3JvdXBzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRoaXMuZGF0YS5wcmVTZWxlY3Rpb25zLmdyb3Vwcy5sZW5ndGggPiAwIHx8XG4gICAgICB0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy5ncm91cE1lbWJlcnNoaXA7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIExpZmVjeWNsZVxuICBjb25zdHJ1Y3RvcihASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IFVzZXJDaG9vc2VyRGF0YSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxVc2VyQ2hvb3NlckNvbXBvbmVudD4sXG4gICAgICAgICAgICAgIHByaXZhdGUgYWN0aXZlRGlyZWN0b3J5U2VydmljZTogQWN0aXZlRGlyZWN0b3J5U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzaGFyZVBvaW50U2VydmljZTogU2hhcmVQb2ludFNlcnZpY2UpIHtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgIC4uLmRlZmF1bHRVc2VyQ2hvb3NlckNvbmZpZyxcbiAgICAgICAgICAgICAgICAgIC4uLmRhdGFcbiAgICAgICAgICAgICAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdldERhdGEoKTtcbiAgICB0aGlzLmxpc3RlbkZvckZpbHRlckNoYW5nZXMoKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gRXZlbnRzXG4gICBsaXN0U2VsZWN0aW9uQ2hhbmdlZChvcHRpb25zOiBNYXRMaXN0T3B0aW9uW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhLm1vZGUgPT09IFVzZXJDaG9vc2VyTW9kZS5TaW5nbGUgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCAmJlxuICAgICAgdGhpcy5kYXRhLmNsb3NlV2hlblNlbGVjdGlvbk1hZGVcbiAgICAgICkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9wdGlvblNlbGVjdGlvbkNoYW5nZWQob3B0aW9uOiBNYXRMaXN0T3B0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZGF0YVNvdXJjZT8uZGF0YVxuICAgICAgLmZpbmQodSA9PiB1LnNBTUFjY291bnROYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IChvcHRpb24udmFsdWUgYXMgU2VsZWN0YWJsZVVzZXIpLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHVzZXIuc2VsZWN0ZWQgPSBvcHRpb24uc2VsZWN0ZWQ7XG4gICAgfVxuICB9XG5cbiAgaGlkZVVuc2VsZWN0ZWRDaGFuZ2VkKHNlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnNldFZhbHVlKHNlbGVjdGVkID8gJ3tzZWxlY3RlZDp0cnVlfScgOiBudWxsKTtcbiAgfVxuXG4gIHNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkxpc3Q/LnNlbGVjdEFsbCgpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTGlzdD8ub3B0aW9ucykge1xuICAgICAgdGhpcy5saXN0U2VsZWN0aW9uQ2hhbmdlZCh0aGlzLnNlbGVjdGlvbkxpc3Q/Lm9wdGlvbnMudG9BcnJheSgpKTtcbiAgICB9XG4gIH1cblxuICBkZXNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkxpc3Q/LmRlc2VsZWN0QWxsKCk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFV0aWxpdGllc1xuICBwcml2YXRlIGdldERhdGEoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YU9ic2VydmFibGVzOiBPYnNlcnZhYmxlPGFueT5bXSA9IFtcbiAgICAgIHRoaXMuZGF0YS51c2VycyA/XG4gICAgICAgIC8vIFVzZXJzIHdlcmUgcGFzc2VkIGluXG4gICAgICAgIG9mKHRoaXMuZGF0YS51c2VycykgOlxuICAgICAgICAvLyBVc2VycyBuZWVkIHRvIGJlIHJldHJpZXZlZFxuICAgICAgICB0aGlzLmFjdGl2ZURpcmVjdG9yeVNlcnZpY2UuZ2V0VXNlcnMoZmFsc2UsIHRoaXMuZGF0YS5pbmNsdWRlRGlzYWJsZWRVc2VycywgdGhpcy5kYXRhLnBhcmVudE91KSxcblxuICAgICAgdGhpcy5kYXRhLnBob3RvcyA/XG4gICAgICAgIC8vIFBob3RvcyB3ZXJlIHBhc3NlZCBpblxuICAgICAgICBvZih0aGlzLmRhdGEucGhvdG9zKSA6XG4gICAgICAgIC8vIFBob3RvcyBuZWVkIHRvIGJlIHJldHJpZXZlZFxuICAgICAgICB0aGlzLnNoYXJlUG9pbnRTZXJ2aWNlLmdldFBob3RvcygpXG4gICAgXTtcblxuICAgIC8vIERvIHdlIG5lZWQgQUQgZ3JvdXBzP1xuICAgIGlmICh0aGlzLmFkR3JvdXBzTmVlZGVkKSB7XG4gICAgICB0aGlzLmRhdGEuZ3JvdXBzID9cbiAgICAgICAgLy8gR3JvdXBzIHdlcmUgcGFzc2VkIGluXG4gICAgICAgIG9mKHRoaXMuZGF0YS5ncm91cHMpIDpcbiAgICAgICAgLy8gR3JvdXBzIG5lZWQgdG8gYmUgcmV0cmlldmVkXG4gICAgICAgIGRhdGFPYnNlcnZhYmxlcy5wdXNoKHRoaXMuYWN0aXZlRGlyZWN0b3J5U2VydmljZS5nZXRHcm91cHMoKSk7XG4gICAgfVxuXG5cbiAgICBmb3JrSm9pbihkYXRhT2JzZXJ2YWJsZXMpXG4gICAgICAvLy5zdWJzY3JpYmUoKFt1c2VycywgcGhvdG9zXSkgPT4ge1xuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgLy8gTmVlZCBncm91cHMgaW4gcGxhY2UgYmVmb3JlIHdlIGhhbmRsZSBleGNsdXNpb25zL2luY2x1c2lvbnMvcHJlLXNlbGVjdGlvbnNcbiAgICAgICAgdGhpcy5ncm91cHMgPSB0aGlzLmFkR3JvdXBzTmVlZGVkID8gZGF0YVsyXSA6IG51bGw7XG5cbiAgICAgICAgbGV0IHVzZXJzID0gZGF0YVswXSBhcyBTZWxlY3RhYmxlVXNlcltdO1xuICAgICAgICB1c2VycyA9IHRoaXMuaW5jbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5pbmNsdWRlVXNlcnNCeUdyb3VwTmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5pbmNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuaW5jbHVkZVVzZXJzQnlUaXRsZSh1c2Vycyk7XG5cbiAgICAgICAgdXNlcnMgPSB0aGlzLmV4Y2x1ZGVVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuZXhjbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuZXhjbHVkZVVzZXJzQnlEZXBhcnRtZW50KHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLmV4Y2x1ZGVVc2Vyc0J5VGl0bGUodXNlcnMpO1xuXG4gICAgICAgIHVzZXJzID0gdGhpcy5wcmVTZWxlY3RVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMucHJlU2VsZWN0VXNlcnNCeUdyb3VwTmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5wcmVTZWxlY3RVc2Vyc0J5RGVwYXJ0bWVudCh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5wcmVTZWxlY3RVc2Vyc0J5VGl0bGUodXNlcnMpO1xuXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UodXNlcnMpO1xuICAgICAgXG4gICAgICAgIHRoaXMucGhvdG9zID0gZGF0YVsxXTtcblxuICAgICAgICB0aGlzLnNldEZpbHRlclByZWRpY2F0ZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRPcHRpb25zKSB7XG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWxlY3RlZE9wdGlvbnNcbiAgICAgIC5tYXAobyA9PiBvLnZhbHVlIGFzIFNlbGVjdGFibGVVc2VyKVxuICAgICAgLm1hcCh1ID0+IHRoaXMuZGF0YS5yZXR1cm5Vc2VyT2JqZWN0cyA/IHUgOiB1LnNBTUFjY291bnROYW1lKTtcblxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRoaXMuZGF0YS5tb2RlID09PSBVc2VyQ2hvb3Nlck1vZGUuTXVsdGlwbGUgP1xuICAgICAgdmFsdWUgOlxuICAgICAgdmFsdWVbMF1cbiAgICApO1xuICB9XG5cbiAgZ2V0UGhvdG8odXNlcjogU2VsZWN0YWJsZVVzZXIpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBob3Rvcz8uZmluZChwID0+XG4gICAgICAocC5lbXBsb3llZU51bWJlciAmJiBwLmVtcGxveWVlTnVtYmVyLnRvU3RyaW5nKCkgPT09IHVzZXIuZW1wbG95ZWVOdW1iZXIpIHx8XG4gICAgICBwLmFjY291bnROYW1lPy50b0xvd2VyQ2FzZSgpID09PSB1c2VyLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIHAuZGlzcGxheU5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgcC50aXRsZT8udG9Mb3dlckNhc2UoKSA9PT0gdXNlci5kaXNwbGF5TmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgKT8uZW5jb2RlZEFic1VybDtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBFeGNsdXNpb25zIC0gd29uJ3QgYmUgaW5jbHVkZWQgaW4gdGhlIGRhdGFTb3VyY2UgYXQgYWxsXG4gIHByaXZhdGUgZXhjbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5leGNsdXNpb25zLmFjY291bnROYW1lc1xuICAgICAgLmZvckVhY2goYWNjb3VudE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmZpbmRJbmRleCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBleGNsdWRlVXNlcnNCeUdyb3VwTmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5leGNsdXNpb25zLmdyb3Vwc1xuICAgICAgLmZvckVhY2goZ3JvdXBOYW1lID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3Vwcz8uZmluZChnID0+IGcubmFtZS50b0xvd2VyQ2FzZSgpID09PSBncm91cE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmICghZ3JvdXApIHsgcmV0dXJuOyB9XG4gICAgICAgIFxuICAgICAgICBncm91cC5tZW1iZXIuZm9yRWFjaChncm91cE1lbWJlckRuID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmZpbmRJbmRleCh1ID0+IHUuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwTWVtYmVyRG4pO1xuICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICB1c2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBleGNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEuZXhjbHVzaW9ucy5kZXBhcnRtZW50c1xuICAgICAgLmZvckVhY2goZGVwYXJ0bWVudCA9PiB7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVkVXNlcnMgPSB1c2Vycy5maWx0ZXIodSA9PiB1LmRlcGFydG1lbnQ/LnRvTG93ZXJDYXNlKCkgPT09IGRlcGFydG1lbnQudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgZXhjbHVkZWRVc2Vycy5mb3JFYWNoKHVzZXIgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuaW5kZXhPZih1c2VyKTtcbiAgICAgICAgICB1c2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBleGNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLmV4Y2x1c2lvbnMudGl0bGVzXG4gICAgICAuZm9yRWFjaCh0aXRsZSA9PiB7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVkVXNlcnMgPSB1c2Vycy5maWx0ZXIodSA9PiB1LnRpdGxlPy50b0xvd2VyQ2FzZSgpID09PSB0aXRsZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgXG4gICAgICAgIGV4Y2x1ZGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHVzZXJzLmluZGV4T2YodXNlcik7XG4gICAgICAgICAgdXNlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gSW5jbHVzaW9ucyAtIG9ubHkgdGhlc2Ugd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZGF0YVNvdXJjZVxuICBwcml2YXRlIGluY2x1ZGVVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICByZXR1cm4gdXNlcnMuZmlsdGVyKHVzZXIgPT5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLmFjY291bnROYW1lcy5sZW5ndGggPT09IDAgfHwgLy8gTm8gYWNjb3VudCBpbmNsdXNpb25zIHNwZWNpZmllZFxuXG4gICAgICB0aGlzLmRhdGEuaW5jbHVzaW9ucy5hY2NvdW50TmFtZXMuZmluZChhY2NvdW50TmFtZSA9PlxuICAgICAgICBhY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpID09PSB1c2VyLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICByZXR1cm4gdXNlcnMuZmlsdGVyKHVzZXIgPT5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLmRlcGFydG1lbnRzLmxlbmd0aCA9PT0gMCB8fCAvLyBObyBkZXBhcnRtZW50IGluY2x1c2lvbnMgc3BlY2lmaWVkXG5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLmRlcGFydG1lbnRzLmZpbmQoZGVwYXJ0bWVudCA9PlxuICAgICAgICBkZXBhcnRtZW50LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKVxuICAgICAgKSk7XG4gIH1cblxuICBwcml2YXRlIGluY2x1ZGVVc2Vyc0J5VGl0bGUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICByZXR1cm4gdXNlcnMuZmlsdGVyKHVzZXIgPT5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLnRpdGxlcy5sZW5ndGggPT09IDAgfHwgLy8gTm8gdGl0bGUgaW5jbHVzaW9ucyBzcGVjaWZpZWRcblxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMudGl0bGVzLmZpbmQodGl0bGUgPT5cbiAgICAgICAgdGl0bGUudG9Mb3dlckNhc2UoKSA9PT0gdXNlci50aXRsZT8udG9Mb3dlckNhc2UoKVxuICAgICAgKSk7XG4gIH1cblxuICBwcml2YXRlIGluY2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgaWYgKCF0aGlzLmRhdGEuaW5jbHVzaW9ucy5ncm91cHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdXNlcnM7IC8vIE5vIGdyb3VwIGluY2x1c2lvbnMgc3BlY2lmaWVkXG4gICAgfVxuXG4gICAgLy8gQ2hlYXRpbmcgYSBiaXQgYW5kIGxldmVyYWdpbmcgdGhlICdzZWxlY3RlZCcgcHJvcGVydHkgdG8ga2VlcCB0cmFjayBvZiB3aG8gc2hvdWxkIGJlIGluY2x1ZGVkXG4gICAgLy8gU2luY2UgaW5jbHVzaW9ucyBoYXBwZW4gYmVmb3IgcHJlLXNlbGVjdGlvbnMsIHdlIGNhbiBkbyB0aGF0LCBhcyBsb25nIGFzIHdlIHNldCAnc2VsZWN0ZWQnIGJhY2sgdG8gZmFsc2Ugd2hlbiB3ZSdyZSBkb25lXG4gICAgdGhpcy5kYXRhLmluY2x1c2lvbnMuZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cblxuICAgICAgICB1c2Vyc1xuICAgICAgICAgIC5maWx0ZXIodXNlciA9PlxuICAgICAgICAgICAgICBncm91cC5tZW1iZXIuZmluZChncm91cE1lbWJlckRuID0+IGdyb3VwTWVtYmVyRG4gPT09IHVzZXIuZGlzdGluZ3Vpc2hlZE5hbWUpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5mb3JFYWNoKHVzZXIgPT4gdXNlci5zZWxlY3RlZCA9IHRydWUpO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAvLyBBdCB0aGlzIHBvaW50LCBhbGwgb2YgdGhlIGFwcHJvcHJpYXRlIHVzZXJzIHNob3VsZCBoYXZlICdzZWxlY3RlZCcgc2V0IHRvIHRydWVcbiAgICBjb25zdCBzZWxlY3RlZFVzZXJzID0gdXNlcnMuZmlsdGVyKHVzZXIgPT4gdXNlci5zZWxlY3RlZCk7IC8vIFN1YnNldCBvZiB0aGUgb3JpZ2luYWwgbGlzdFxuICAgIC8vIFJlc2V0ICdzZWxlY3RlZCcgdG8gZmFsc2UsIGFuZCByZXR1cm5cbiAgICBzZWxlY3RlZFVzZXJzLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gZmFsc2UpO1xuICAgIHJldHVybiBzZWxlY3RlZFVzZXJzO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiAgUHJlLVNlbGVjdGlvbnNcbiAgcHJpdmF0ZSBwcmVTZWxlY3RVc2Vyc0J5QWNjb3VudE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEucHJlU2VsZWN0aW9ucy5hY2NvdW50TmFtZXNcbiAgICAgIC5mb3JFYWNoKGFjY291bnROYW1lID0+IHtcbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJzLmZpbmQodSA9PiB1LnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgPT09IGFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIXVzZXIpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdXNlci5zZWxlY3RlZCA9IHRydWU7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gIHByaXZhdGUgcHJlU2VsZWN0VXNlcnNCeURlcGFydG1lbnQodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEucHJlU2VsZWN0aW9ucy5kZXBhcnRtZW50c1xuICAgICAgLmZvckVhY2goZGVwYXJ0bWVudCA9PlxuICAgICAgICB1c2Vyc1xuICAgICAgICAgIC5maWx0ZXIodSA9PiB1LmRlcGFydG1lbnQ/LnRvTG93ZXJDYXNlKCkgPT09IGRlcGFydG1lbnQudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAuZm9yRWFjaCh1c2VyID0+IHVzZXIuc2VsZWN0ZWQgPSB0cnVlKVxuICAgICAgKTtcblxuICAgIHJldHVybiB1c2VycztcbiAgfVxuXG4gIHByaXZhdGUgcHJlU2VsZWN0VXNlcnNCeVRpdGxlKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLnByZVNlbGVjdGlvbnMudGl0bGVzXG4gICAgICAuZm9yRWFjaCh0aXRsZSA9PlxuICAgICAgICB1c2Vyc1xuICAgICAgICAgIC5maWx0ZXIodSA9PiB1LnRpdGxlPy50b0xvd2VyQ2FzZSgpID09PSB0aXRsZS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgIC5mb3JFYWNoKHVzZXIgPT4gdXNlci5zZWxlY3RlZCA9IHRydWUpXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVTZWxlY3RVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLnByZVNlbGVjdGlvbnMuZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cblxuICAgICAgICBncm91cC5tZW1iZXIuZm9yRWFjaChncm91cE1lbWJlckRuID0+IHtcbiAgICAgICAgICBjb25zdCB1c2VyID0gdXNlcnMuZmluZCh1ID0+IHUuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwTWVtYmVyRG4pO1xuICAgICAgICAgIGlmICghdXNlcikgeyByZXR1cm47IH1cblxuICAgICAgICAgIHVzZXIuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuICBcbiAgcHJpdmF0ZSBzZXRGaWx0ZXJQcmVkaWNhdGUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRhdGFTb3VyY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyUHJlZGljYXRlID0gKHVzZXI6IFNlbGVjdGFibGVVc2VyLCBmaWx0ZXI6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKGZpbHRlciA9PT0gJ3tzZWxlY3RlZDp0cnVlfScpIHtcbiAgICAgICAgcmV0dXJuIHVzZXIuc2VsZWN0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoZmlsdGVyLCAnaScpOyAvLyBDYXNlLWluc2Vuc2l0aXZlXG4gICAgICAgIGxldCBtYXRjaCA9IGZhbHNlOyAvLyBUaGUgZW5kIHJlc3VsdCAtIHdoZXRoZXIgb3Igbm90IGEgZW1wbG95ZWUgbWF0Y2hlcyB0aGUgZmlsdGVyXG5cbiAgICAgICAgY29uc3QgZmlsdGVyUHJvcGVydGllcyA9IFsgJ2Rpc3BsYXlOYW1lJyBdO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmZpbHRlck9wdGlvbnMuYWNjb3VudE5hbWUpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ3NBTUFjY291bnROYW1lJylcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLmZpbHRlck9wdGlvbnMudGl0bGUpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ3RpdGxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YS5maWx0ZXJPcHRpb25zLmRlcGFydG1lbnQpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ2RlcGFydG1lbnQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLmZpbHRlck9wdGlvbnMucGhvbmVOdW1iZXIpIHtcbiAgICAgICAgICBmaWx0ZXJQcm9wZXJ0aWVzLnB1c2goJ3RlbGVwaG9uZU51bWJlcicpO1xuICAgICAgICB9XG4gIFxuICAgICAgICAvLyBNYXRjaCBvbiB0aGUgcHJvcGVydGllcyBjb25maWd1cmVkIGFib3ZlXG4gICAgICAgIGZpbHRlclByb3BlcnRpZXNcbiAgICAgICAgICAuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAodXNlcltmaWVsZF0gJiYgdXNlcltmaWVsZF0ubWF0Y2gocmVnZXgpKSB7XG4gICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgXG4gICAgICAgIC8vIE1hdGNoIG9uIGdyb3VwIG1lbWJlcnNoaXAgKGdyb3VwIG5hbWUpXG4gICAgICAgIGlmICh0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy5ncm91cE1lbWJlcnNoaXApIHtcbiAgICAgICAgICB1c2VyLm1lbWJlck9mLmZvckVhY2goZ3JvdXBEbiA9PiB7XG4gICAgICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGdyb3VwID0+IGdyb3VwLmRpc3Rpbmd1aXNoZWROYW1lID09PSBncm91cERuICYmIGdyb3VwLm5hbWUubWF0Y2gocmVnZXgpKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgICAgICAgIG1hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5Gb3JGaWx0ZXJDaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyRm9ybS5nZXQoJ2ZpbHRlcicpPy52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoNTAwKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmRhdGFTb3VyY2UhLmZpbHRlciA9IHRoaXMuZmlsdGVyRm9ybS52YWx1ZS5maWx0ZXI/LnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIHRvb2x0aXAodXNlcjogU2VsZWN0YWJsZVVzZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRhdGEuc2hvd0dyb3VwTWVtYmVyc2hpcFRvb2x0aXBzID9cbiAgICAgIHVzZXIubWVtYmVyT2ZcbiAgICAgICAgLm1hcChncm91cERuID0+XG4gICAgICAgICAgdGhpcy5ncm91cHNcbiAgICAgICAgICAgID8uZmluZChncm91cCA9PlxuICAgICAgICAgICAgICBncm91cC5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBEblxuICAgICAgICAgICAgKT8ubmFtZVxuICAgICAgICAgIClcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYSEgPiBiISA/IDEgOiAtMSlcbiAgICAgICAgICAuam9pbignXFxuJykgOlxuICAgICAgJyc7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG59XG4iLCI8ZGl2IGlkPVwiZGlhbG9nLXRpdGxlXCI+XG4gICAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+e3sgZGF0YS50aXRsZSB9fTwvaDI+XG5cbiAgICA8ZGl2PlxuICAgICAgICB7eyBzZWxlY3RlZE9wdGlvbnMubGVuZ3RoIH19IHNlbGVjdGVkXG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICA8ZGl2ICpuZ0lmPVwiIShkYXRhU291cmNlICYmIHBob3RvcylcIj5cbiAgICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG4gICAgICAgIDxoMiBpZD1cInNwaW5uZXItbWVzc2FnZVwiPkdldHRpbmcgdXNlcnMgYW5kIHBob3Rvcy4uLjwvaDI+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YVNvdXJjZSAmJiBwaG90b3NcIj5cbiAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJkYXRhU291cmNlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgZm9ybUNvbnRyb2xOYW1lPVwiZmlsdGVyXCI+XG5cbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZmlsdGVyRm9ybS52YWx1ZS5maWx0ZXJcIiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJDbGVhclwiIChjbGljayk9XCJmaWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnNldFZhbHVlKCcnKVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJjbG9zZVwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Zvcm0+XG5cbiAgICAgICAgPG1hdC1zZWxlY3Rpb24tbGlzdCBbbXVsdGlwbGVdPVwiaXNNdWx0aU1vZGVcIlxuICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJsaXN0U2VsZWN0aW9uQ2hhbmdlZCgkZXZlbnQub3B0aW9ucylcIj5cblxuICAgICAgICAgICAgPG1hdC1saXN0LW9wdGlvbiAqbmdGb3I9XCJsZXQgdXNlciBvZiBkYXRhU291cmNlPy5maWx0ZXJlZERhdGFcIiBbdmFsdWVdPVwidXNlclwiIFtzZWxlY3RlZF09XCJ1c2VyLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAoc2VsZWN0ZWRDaGFuZ2UpPVwib3B0aW9uU2VsZWN0aW9uQ2hhbmdlZChvcHRpb24pXCIgI29wdGlvbj5cblxuICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJnZXRQaG90byh1c2VyKVwiIG1hdExpc3RBdmF0YXIgYWx0PVwiXCIgW3NyY109XCJnZXRQaG90byh1c2VyKVwiPlxuXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWdldFBob3RvKHVzZXIpXCIgbWF0TGlzdEF2YXRhciBjbGFzcz1cIm5vLXBob3RvXCJcbiAgICAgICAgICAgICAgICAgICAgZm9udEljb249XCJhY2NvdW50X2NpcmNsZVwiPlxuICAgICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFttYXRUb29sdGlwXT1cInRvb2x0aXAodXNlcilcIiBjbGFzcz1cInVzZXItbmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdXNlci5kaXNwbGF5TmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRhdGEuc2hvd1Bob25lICYmIHVzZXIudGVsZXBob25lTnVtYmVyXCI+e3sgdXNlci50ZWxlcGhvbmVOdW1iZXIgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IHVzZXIuZGVwYXJ0bWVudCB9fTwvZGl2PlxuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+e3sgdXNlci50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtbGlzdC1vcHRpb24+XG4gICAgICAgIDwvbWF0LXNlbGVjdGlvbi1saXN0PlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XG5cbjxtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGFTb3VyY2UgJiYgcGhvdG9zXCI+XG4gICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlICpuZ0lmPVwic2VsZWN0ZWRPcHRpb25zLmxlbmd0aFwiIChjaGFuZ2UpPVwiaGlkZVVuc2VsZWN0ZWRDaGFuZ2VkKCRldmVudC5jaGVja2VkKVwiPlxuICAgICAgICAgICAgSGlkZSBVbnNlbGVjdGVkXG4gICAgICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cblxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzZWxlY3RBbGwoKVwiXG4gICAgICAgICAgICAqbmdJZj1cImlzTXVsdGlNb2RlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJzZWxlY3RfYWxsXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5TZWxlY3QgQWxsPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICBcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZGVzZWxlY3RBbGwoKVwiXG4gICAgICAgICAgICAqbmdJZj1cImlzTXVsdGlNb2RlICYmIHNlbGVjdGVkT3B0aW9ucy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNsZWFyX2FsbFwiPjwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGUtbW9iaWxlXCI+Q2xlYXIgQWxsPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJjbG9zZSgpXCIgbWF0VG9vbHRpcD1cIkFjY2VwdCB5b3VyIHNlbGVjdGlvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlbGVjdGVkT3B0aW9ucy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNoZWNrXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5Pazwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwid2FyblwiIG1hdC1kaWFsb2ctY2xvc2UgbWF0VG9vbHRpcD1cIkNsb3NlIHRoaXMgd2luZG93XCI+XG4gICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNsb3NlXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPkNhbmNlbDwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbjwvbWF0LWRpYWxvZy1hY3Rpb25zPiJdfQ==
364
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1jaG9vc2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnkvZ3VpL3NyYy9jb21wb25lbnRzL3VzZXItY2hvb3Nlci91c2VyLWNob29zZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeS9ndWkvc3JjL2NvbXBvbmVudHMvdXNlci1jaG9vc2VyL3VzZXItY2hvb3Nlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQWdCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBaUIsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLOUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFHbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFVbkQsTUFBTSxPQUFPLG9CQUFvQjtJQWtDL0IsWUFBWTtJQUVaLG1CQUFtQjtJQUNuQixZQUE0QyxJQUFxQixFQUM3QyxTQUE2QyxFQUM3QyxzQkFBOEMsRUFDOUMsaUJBQW9DO1FBSFosU0FBSSxHQUFKLElB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QU8sQ0FBQyxFQUFFLENBQ2IsSUFBSSxDQUFDLE1BQU07Z0JBQ1QsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDYixLQUFLLENBQUMsaUJBQWlCLEtBQUssT0FBTyxDQUNwQyxFQUFFLElBQUksQ0FDUjtpQkFDQSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFFLEdBQUcsQ0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqQixFQUFFLENBQUM7SUFDUCxDQUFDOztpSEExWlUsb0JBQW9CLGtCQXFDWCxlQUFlO3FHQXJDeEIsb0JBQW9CLG1HQUVwQixnQkFBZ0IsZ0RDekI3QixpNEdBaUZxQjsyRkQxRFIsb0JBQW9CO2tCQVJoQyxTQUFTOytCQUNFLGNBQWM7OzBCQTRDWCxNQUFNOzJCQUFDLGVBQWU7NElBbkNOLGFBQWE7c0JBQXpDLFNBQVM7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0TGlzdE9wdGlvbiwgTWF0U2VsZWN0aW9uTGlzdCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xpc3QnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQWN0aXZlRGlyZWN0b3J5U2VydmljZSwgR3JvdXAgfSBmcm9tICdAY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeSc7XG5pbXBvcnQgeyBTaGFyZVBvaW50U2VydmljZSwgUGhvdG9JdGVtIH0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL3NoYXJlcG9pbnQnO1xuXG5pbXBvcnQgeyBkZWZhdWx0VXNlckNob29zZXJDb25maWcgfSBmcm9tICcuLi8uLi9tb2RlbC9kZWZhdWx0LXVzZXItY2hvb3Nlci1jb25maWcnO1xuaW1wb3J0IHsgU2VsZWN0YWJsZVVzZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9zZWxlY3RhYmxlLXVzZXInO1xuaW1wb3J0IHsgVXNlckNob29zZXJEYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlci1jaG9vc2VyLWRhdGEnO1xuaW1wb3J0IHsgVXNlckNob29zZXJNb2RlIH0gZnJvbSAnLi4vLi4vcHVibGljX2FwaSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3VzZXItY2hvb3NlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWNob29zZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFtcbiAgICAnLi91c2VyLWNob29zZXIuY29tcG9uZW50LmNzcycsXG4gICAgJy4uLy4uLy4uLy4uLy4uL3N0eWxlcy9tYXQtaWNvbi5jc3MnXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVXNlckNob29zZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvLyNyZWdpb24gRmllbGRzXG4gIEBWaWV3Q2hpbGQoTWF0U2VsZWN0aW9uTGlzdCkgc2VsZWN0aW9uTGlzdDogTWF0U2VsZWN0aW9uTGlzdCB8IG51bGwgPSBudWxsO1xuXG4gIGZpbHRlckZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBmaWx0ZXI6IG5ldyBGb3JtQ29udHJvbCgpXG4gIH0pO1xuXG4gIGRhdGFTb3VyY2U6IE1hdFRhYmxlRGF0YVNvdXJjZTxTZWxlY3RhYmxlVXNlcj4gfCBudWxsID0gbnVsbDtcbiAgcGhvdG9zOiBQaG90b0l0ZW1bXSB8IG51bGwgPSBudWxsO1xuICBncm91cHM6IEdyb3VwW10gfCBudWxsID0gbnVsbDsgLy8gTWF5IG9yIG1heSBub3QgZ2V0IHBvcHVsYXRlZCwgZGVwZW5kaW5nIG9uIGNvbmZpZyBkYXRhIHNlbnQgaW5cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFByb3BlcnRpZXNcbiAgZ2V0IGlzTXVsdGlNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEubW9kZSA9PT0gVXNlckNob29zZXJNb2RlLk11bHRpcGxlO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGVkT3B0aW9ucygpOiBNYXRMaXN0T3B0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkxpc3Q/Lm9wdGlvbnMuZmlsdGVyKG8gPT4gby5zZWxlY3RlZCkgPz8gW107XG4gIH1cblxuICBnZXQgZmlsdGVyVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLmZpbHRlcjtcbiAgfVxuXG4gIGdldCBhZEdyb3Vwc05lZWRlZCgpOiBib29sZWFuIHtcbiAgICAvLyBJZiBhbnkgYXJlIHRoZXNlIGFyZSB0cnVlLCB0aGVuIHdlIG5lZWQgdG8gcHVsbCBBRCBncm91cHMgZm9yIHVzZSBsYXRlclxuICAgIHJldHVybiB0aGlzLmRhdGEuc2hvd0dyb3VwTWVtYmVyc2hpcFRvb2x0aXBzIHx8XG4gICAgICB0aGlzLmRhdGEuZXhjbHVzaW9ucy5ncm91cHMubGVuZ3RoID4gMCB8fFxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMuZ3JvdXBzLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRoaXMuZGF0YS5wcmVTZWxlY3Rpb25zLmdyb3Vwcy5sZW5ndGggPiAwIHx8XG4gICAgICB0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy5ncm91cE1lbWJlcnNoaXA7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIExpZmVjeWNsZVxuICBjb25zdHJ1Y3RvcihASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IFVzZXJDaG9vc2VyRGF0YSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxVc2VyQ2hvb3NlckNvbXBvbmVudD4sXG4gICAgICAgICAgICAgIHByaXZhdGUgYWN0aXZlRGlyZWN0b3J5U2VydmljZTogQWN0aXZlRGlyZWN0b3J5U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzaGFyZVBvaW50U2VydmljZTogU2hhcmVQb2ludFNlcnZpY2UpIHtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgIC4uLmRlZmF1bHRVc2VyQ2hvb3NlckNvbmZpZyxcbiAgICAgICAgICAgICAgICAgIC4uLmRhdGFcbiAgICAgICAgICAgICAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdldERhdGEoKTtcbiAgICB0aGlzLmxpc3RlbkZvckZpbHRlckNoYW5nZXMoKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gRXZlbnRzXG4gICBsaXN0U2VsZWN0aW9uQ2hhbmdlZChvcHRpb25zOiBNYXRMaXN0T3B0aW9uW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhLm1vZGUgPT09IFVzZXJDaG9vc2VyTW9kZS5TaW5nbGUgJiZcbiAgICAgIHRoaXMuc2VsZWN0ZWRPcHRpb25zLmxlbmd0aCAmJlxuICAgICAgdGhpcy5kYXRhLmNsb3NlV2hlblNlbGVjdGlvbk1hZGVcbiAgICAgICkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIG9wdGlvblNlbGVjdGlvbkNoYW5nZWQob3B0aW9uOiBNYXRMaXN0T3B0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZGF0YVNvdXJjZT8uZGF0YVxuICAgICAgLmZpbmQodSA9PiB1LnNBTUFjY291bnROYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IChvcHRpb24udmFsdWUgYXMgU2VsZWN0YWJsZVVzZXIpLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHVzZXIuc2VsZWN0ZWQgPSBvcHRpb24uc2VsZWN0ZWQ7XG4gICAgfVxuICB9XG5cbiAgaGlkZVVuc2VsZWN0ZWRDaGFuZ2VkKHNlbGVjdGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnNldFZhbHVlKHNlbGVjdGVkID8gJ3tzZWxlY3RlZDp0cnVlfScgOiBudWxsKTtcbiAgfVxuXG4gIHNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkxpc3Q/LnNlbGVjdEFsbCgpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uTGlzdD8ub3B0aW9ucykge1xuICAgICAgdGhpcy5saXN0U2VsZWN0aW9uQ2hhbmdlZCh0aGlzLnNlbGVjdGlvbkxpc3Q/Lm9wdGlvbnMudG9BcnJheSgpKTtcbiAgICB9XG4gIH1cblxuICBkZXNlbGVjdEFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGlvbkxpc3Q/LmRlc2VsZWN0QWxsKCk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFV0aWxpdGllc1xuICBwcml2YXRlIGdldERhdGEoKTogdm9pZCB7XG4gICAgY29uc3QgZGF0YU9ic2VydmFibGVzOiBPYnNlcnZhYmxlPGFueT5bXSA9IFtcbiAgICAgIHRoaXMuZGF0YS51c2VycyA/XG4gICAgICAgIC8vIFVzZXJzIHdlcmUgcGFzc2VkIGluXG4gICAgICAgIG9mKHRoaXMuZGF0YS51c2VycykgOlxuICAgICAgICAvLyBVc2VycyBuZWVkIHRvIGJlIHJldHJpZXZlZFxuICAgICAgICB0aGlzLmFjdGl2ZURpcmVjdG9yeVNlcnZpY2UuZ2V0VXNlcnMoZmFsc2UsIHRoaXMuZGF0YS5pbmNsdWRlRGlzYWJsZWRVc2VycywgdGhpcy5kYXRhLnBhcmVudE91KSxcblxuICAgICAgdGhpcy5kYXRhLnBob3RvcyA/XG4gICAgICAgIC8vIFBob3RvcyB3ZXJlIHBhc3NlZCBpblxuICAgICAgICBvZih0aGlzLmRhdGEucGhvdG9zKSA6XG4gICAgICAgIC8vIFBob3RvcyBuZWVkIHRvIGJlIHJldHJpZXZlZFxuICAgICAgICB0aGlzLnNoYXJlUG9pbnRTZXJ2aWNlLmdldFBob3RvcygpXG4gICAgXTtcblxuICAgIC8vIERvIHdlIG5lZWQgQUQgZ3JvdXBzP1xuICAgIGlmICh0aGlzLmFkR3JvdXBzTmVlZGVkKSB7XG4gICAgICB0aGlzLmRhdGEuZ3JvdXBzID9cbiAgICAgICAgLy8gR3JvdXBzIHdlcmUgcGFzc2VkIGluXG4gICAgICAgIG9mKHRoaXMuZGF0YS5ncm91cHMpIDpcbiAgICAgICAgLy8gR3JvdXBzIG5lZWQgdG8gYmUgcmV0cmlldmVkXG4gICAgICAgIGRhdGFPYnNlcnZhYmxlcy5wdXNoKHRoaXMuYWN0aXZlRGlyZWN0b3J5U2VydmljZS5nZXRHcm91cHMoKSk7XG4gICAgfVxuXG5cbiAgICBmb3JrSm9pbihkYXRhT2JzZXJ2YWJsZXMpXG4gICAgICAvLy5zdWJzY3JpYmUoKFt1c2VycywgcGhvdG9zXSkgPT4ge1xuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgLy8gTmVlZCBncm91cHMgaW4gcGxhY2UgYmVmb3JlIHdlIGhhbmRsZSBleGNsdXNpb25zL2luY2x1c2lvbnMvcHJlLXNlbGVjdGlvbnNcbiAgICAgICAgdGhpcy5ncm91cHMgPSB0aGlzLmFkR3JvdXBzTmVlZGVkID8gZGF0YVsyXSA6IG51bGw7XG5cbiAgICAgICAgbGV0IHVzZXJzID0gZGF0YVswXSBhcyBTZWxlY3RhYmxlVXNlcltdO1xuICAgICAgICB1c2Vycy5mb3JFYWNoKHUgPT4gdS5zZWxlY3RlZCA9IGZhbHNlKTsgLy8gSW4gY2FzZSBleGlzdGluZyBkYXRhIHdhcyByZS11c2VkXG4gICAgICAgIHVzZXJzID0gdGhpcy5pbmNsdWRlVXNlcnNCeUFjY291bnROYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLmluY2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLmluY2x1ZGVVc2Vyc0J5RGVwYXJ0bWVudCh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5pbmNsdWRlVXNlcnNCeVRpdGxlKHVzZXJzKTtcblxuICAgICAgICB1c2VycyA9IHRoaXMuZXhjbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5leGNsdWRlVXNlcnNCeUdyb3VwTmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5leGNsdWRlVXNlcnNCeURlcGFydG1lbnQodXNlcnMpO1xuICAgICAgICB1c2VycyA9IHRoaXMuZXhjbHVkZVVzZXJzQnlUaXRsZSh1c2Vycyk7XG5cbiAgICAgICAgdXNlcnMgPSB0aGlzLnByZVNlbGVjdFVzZXJzQnlBY2NvdW50TmFtZSh1c2Vycyk7XG4gICAgICAgIHVzZXJzID0gdGhpcy5wcmVTZWxlY3RVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLnByZVNlbGVjdFVzZXJzQnlEZXBhcnRtZW50KHVzZXJzKTtcbiAgICAgICAgdXNlcnMgPSB0aGlzLnByZVNlbGVjdFVzZXJzQnlUaXRsZSh1c2Vycyk7XG5cbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZSh1c2Vycyk7XG4gICAgICBcbiAgICAgICAgdGhpcy5waG90b3MgPSBkYXRhWzFdO1xuXG4gICAgICAgIHRoaXMuc2V0RmlsdGVyUHJlZGljYXRlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZE9wdGlvbnMpIHtcbiAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlbGVjdGVkT3B0aW9uc1xuICAgICAgLm1hcChvID0+IG8udmFsdWUgYXMgU2VsZWN0YWJsZVVzZXIpXG4gICAgICAubWFwKHUgPT4gdGhpcy5kYXRhLnJldHVyblVzZXJPYmplY3RzID8gdSA6IHUuc0FNQWNjb3VudE5hbWUpO1xuXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGhpcy5kYXRhLm1vZGUgPT09IFVzZXJDaG9vc2VyTW9kZS5NdWx0aXBsZSA/XG4gICAgICB2YWx1ZSA6XG4gICAgICB2YWx1ZVswXVxuICAgICk7XG4gIH1cblxuICBnZXRQaG90byh1c2VyOiBTZWxlY3RhYmxlVXNlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucGhvdG9zPy5maW5kKHAgPT5cbiAgICAgIChwLmVtcGxveWVlTnVtYmVyICYmIHAuZW1wbG95ZWVOdW1iZXIudG9TdHJpbmcoKSA9PT0gdXNlci5lbXBsb3llZU51bWJlcikgfHxcbiAgICAgIHAuYWNjb3VudE5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgcC5kaXNwbGF5TmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gdXNlci5kaXNwbGF5TmFtZS50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBwLnRpdGxlPy50b0xvd2VyQ2FzZSgpID09PSB1c2VyLmRpc3BsYXlOYW1lLnRvTG93ZXJDYXNlKClcbiAgICApPy5lbmNvZGVkQWJzVXJsO1xuICB9XG5cbiAgLy8jcmVnaW9uIEV4Y2x1c2lvbnMgLSB3b24ndCBiZSBpbmNsdWRlZCBpbiB0aGUgZGF0YVNvdXJjZSBhdCBhbGxcbiAgcHJpdmF0ZSBleGNsdWRlVXNlcnNCeUFjY291bnROYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLmV4Y2x1c2lvbnMuYWNjb3VudE5hbWVzXG4gICAgICAuZm9yRWFjaChhY2NvdW50TmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuZmluZEluZGV4KHUgPT4gdS5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpID09PSBhY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgeyByZXR1cm47IH1cblxuICAgICAgICB1c2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cblxuICBwcml2YXRlIGV4Y2x1ZGVVc2Vyc0J5R3JvdXBOYW1lKHVzZXJzOiBTZWxlY3RhYmxlVXNlcltdKTogU2VsZWN0YWJsZVVzZXJbXSB7XG4gICAgdGhpcy5kYXRhLmV4Y2x1c2lvbnMuZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cE5hbWUgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzPy5maW5kKGcgPT4gZy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGdyb3VwTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgaWYgKCFncm91cCkgeyByZXR1cm47IH1cbiAgICAgICAgXG4gICAgICAgIGdyb3VwLm1lbWJlci5mb3JFYWNoKGdyb3VwTWVtYmVyRG4gPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuZmluZEluZGV4KHUgPT4gdS5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBNZW1iZXJEbik7XG4gICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgeyByZXR1cm47IH1cblxuICAgICAgICAgIHVzZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cblxuICBwcml2YXRlIGV4Y2x1ZGVVc2Vyc0J5RGVwYXJ0bWVudCh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5leGNsdXNpb25zLmRlcGFydG1lbnRzXG4gICAgICAuZm9yRWFjaChkZXBhcnRtZW50ID0+IHtcbiAgICAgICAgY29uc3QgZXhjbHVkZWRVc2VycyA9IHVzZXJzLmZpbHRlcih1ID0+IHUuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKSA9PT0gZGVwYXJ0bWVudC50b0xvd2VyQ2FzZSgpKTtcblxuICAgICAgICBleGNsdWRlZFVzZXJzLmZvckVhY2godXNlciA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSB1c2Vycy5pbmRleE9mKHVzZXIpO1xuICAgICAgICAgIHVzZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cblxuICBwcml2YXRlIGV4Y2x1ZGVVc2Vyc0J5VGl0bGUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEuZXhjbHVzaW9ucy50aXRsZXNcbiAgICAgIC5mb3JFYWNoKHRpdGxlID0+IHtcbiAgICAgICAgY29uc3QgZXhjbHVkZWRVc2VycyA9IHVzZXJzLmZpbHRlcih1ID0+IHUudGl0bGU/LnRvTG93ZXJDYXNlKCkgPT09IHRpdGxlLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBcbiAgICAgICAgZXhjbHVkZWRVc2Vycy5mb3JFYWNoKHVzZXIgPT4ge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdXNlcnMuaW5kZXhPZih1c2VyKTtcbiAgICAgICAgICB1c2Vycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBJbmNsdXNpb25zIC0gb25seSB0aGVzZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkYXRhU291cmNlXG4gIHByaXZhdGUgaW5jbHVkZVVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHJldHVybiB1c2Vycy5maWx0ZXIodXNlciA9PlxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMuYWNjb3VudE5hbWVzLmxlbmd0aCA9PT0gMCB8fCAvLyBObyBhY2NvdW50IGluY2x1c2lvbnMgc3BlY2lmaWVkXG5cbiAgICAgIHRoaXMuZGF0YS5pbmNsdXNpb25zLmFjY291bnROYW1lcy5maW5kKGFjY291bnROYW1lID0+XG4gICAgICAgIGFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKVxuICAgICAgKSk7XG4gIH1cblxuICBwcml2YXRlIGluY2x1ZGVVc2Vyc0J5RGVwYXJ0bWVudCh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHJldHVybiB1c2Vycy5maWx0ZXIodXNlciA9PlxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMuZGVwYXJ0bWVudHMubGVuZ3RoID09PSAwIHx8IC8vIE5vIGRlcGFydG1lbnQgaW5jbHVzaW9ucyBzcGVjaWZpZWRcblxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMuZGVwYXJ0bWVudHMuZmluZChkZXBhcnRtZW50ID0+XG4gICAgICAgIGRlcGFydG1lbnQudG9Mb3dlckNhc2UoKSA9PT0gdXNlci5kZXBhcnRtZW50Py50b0xvd2VyQ2FzZSgpXG4gICAgICApKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5jbHVkZVVzZXJzQnlUaXRsZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHJldHVybiB1c2Vycy5maWx0ZXIodXNlciA9PlxuICAgICAgdGhpcy5kYXRhLmluY2x1c2lvbnMudGl0bGVzLmxlbmd0aCA9PT0gMCB8fCAvLyBObyB0aXRsZSBpbmNsdXNpb25zIHNwZWNpZmllZFxuXG4gICAgICB0aGlzLmRhdGEuaW5jbHVzaW9ucy50aXRsZXMuZmluZCh0aXRsZSA9PlxuICAgICAgICB0aXRsZS50b0xvd2VyQ2FzZSgpID09PSB1c2VyLnRpdGxlPy50b0xvd2VyQ2FzZSgpXG4gICAgICApKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5jbHVkZVVzZXJzQnlHcm91cE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICBpZiAoIXRoaXMuZGF0YS5pbmNsdXNpb25zLmdyb3Vwcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB1c2VyczsgLy8gTm8gZ3JvdXAgaW5jbHVzaW9ucyBzcGVjaWZpZWRcbiAgICB9XG5cbiAgICAvLyBDaGVhdGluZyBhIGJpdCBhbmQgbGV2ZXJhZ2luZyB0aGUgJ3NlbGVjdGVkJyBwcm9wZXJ0eSB0byBrZWVwIHRyYWNrIG9mIHdobyBzaG91bGQgYmUgaW5jbHVkZWRcbiAgICAvLyBTaW5jZSBpbmNsdXNpb25zIGhhcHBlbiBiZWZvciBwcmUtc2VsZWN0aW9ucywgd2UgY2FuIGRvIHRoYXQsIGFzIGxvbmcgYXMgd2Ugc2V0ICdzZWxlY3RlZCcgYmFjayB0byBmYWxzZSB3aGVuIHdlJ3JlIGRvbmVcbiAgICB0aGlzLmRhdGEuaW5jbHVzaW9ucy5ncm91cHNcbiAgICAgIC5mb3JFYWNoKGdyb3VwTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZyA9PiBnLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZ3JvdXBOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxuXG4gICAgICAgIHVzZXJzXG4gICAgICAgICAgLmZpbHRlcih1c2VyID0+XG4gICAgICAgICAgICAgIGdyb3VwLm1lbWJlci5maW5kKGdyb3VwTWVtYmVyRG4gPT4gZ3JvdXBNZW1iZXJEbiA9PT0gdXNlci5kaXN0aW5ndWlzaGVkTmFtZSlcbiAgICAgICAgICApXG4gICAgICAgICAgLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gdHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIFxuICAgIC8vIEF0IHRoaXMgcG9pbnQsIGFsbCBvZiB0aGUgYXBwcm9wcmlhdGUgdXNlcnMgc2hvdWxkIGhhdmUgJ3NlbGVjdGVkJyBzZXQgdG8gdHJ1ZVxuICAgIGNvbnN0IHNlbGVjdGVkVXNlcnMgPSB1c2Vycy5maWx0ZXIodXNlciA9PiB1c2VyLnNlbGVjdGVkKTsgLy8gU3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBsaXN0XG4gICAgLy8gUmVzZXQgJ3NlbGVjdGVkJyB0byBmYWxzZSwgYW5kIHJldHVyblxuICAgIHNlbGVjdGVkVXNlcnMuZm9yRWFjaCh1c2VyID0+IHVzZXIuc2VsZWN0ZWQgPSBmYWxzZSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkVXNlcnM7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uICBQcmUtU2VsZWN0aW9uc1xuICBwcml2YXRlIHByZVNlbGVjdFVzZXJzQnlBY2NvdW50TmFtZSh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5wcmVTZWxlY3Rpb25zLmFjY291bnROYW1lc1xuICAgICAgLmZvckVhY2goYWNjb3VudE5hbWUgPT4ge1xuICAgICAgICBjb25zdCB1c2VyID0gdXNlcnMuZmluZCh1ID0+IHUuc0FNQWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIGlmICghdXNlcikgeyByZXR1cm47IH1cblxuICAgICAgICB1c2VyLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVTZWxlY3RVc2Vyc0J5RGVwYXJ0bWVudCh1c2VyczogU2VsZWN0YWJsZVVzZXJbXSk6IFNlbGVjdGFibGVVc2VyW10ge1xuICAgIHRoaXMuZGF0YS5wcmVTZWxlY3Rpb25zLmRlcGFydG1lbnRzXG4gICAgICAuZm9yRWFjaChkZXBhcnRtZW50ID0+XG4gICAgICAgIHVzZXJzXG4gICAgICAgICAgLmZpbHRlcih1ID0+IHUuZGVwYXJ0bWVudD8udG9Mb3dlckNhc2UoKSA9PT0gZGVwYXJ0bWVudC50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgIC5mb3JFYWNoKHVzZXIgPT4gdXNlci5zZWxlY3RlZCA9IHRydWUpXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHVzZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVTZWxlY3RVc2Vyc0J5VGl0bGUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEucHJlU2VsZWN0aW9ucy50aXRsZXNcbiAgICAgIC5mb3JFYWNoKHRpdGxlID0+XG4gICAgICAgIHVzZXJzXG4gICAgICAgICAgLmZpbHRlcih1ID0+IHUudGl0bGU/LnRvTG93ZXJDYXNlKCkgPT09IHRpdGxlLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgLmZvckVhY2godXNlciA9PiB1c2VyLnNlbGVjdGVkID0gdHJ1ZSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cblxuICBwcml2YXRlIHByZVNlbGVjdFVzZXJzQnlHcm91cE5hbWUodXNlcnM6IFNlbGVjdGFibGVVc2VyW10pOiBTZWxlY3RhYmxlVXNlcltdIHtcbiAgICB0aGlzLmRhdGEucHJlU2VsZWN0aW9ucy5ncm91cHNcbiAgICAgIC5mb3JFYWNoKGdyb3VwTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZyA9PiBnLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gZ3JvdXBOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBpZiAoIWdyb3VwKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGdyb3VwLm1lbWJlci5mb3JFYWNoKGdyb3VwTWVtYmVyRG4gPT4ge1xuICAgICAgICAgIGNvbnN0IHVzZXIgPSB1c2Vycy5maW5kKHUgPT4gdS5kaXN0aW5ndWlzaGVkTmFtZSA9PT0gZ3JvdXBNZW1iZXJEbik7XG4gICAgICAgICAgaWYgKCF1c2VyKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgdXNlci5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdXNlcnM7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG4gIFxuICBwcml2YXRlIHNldEZpbHRlclByZWRpY2F0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXJQcmVkaWNhdGUgPSAodXNlcjogU2VsZWN0YWJsZVVzZXIsIGZpbHRlcjogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZmlsdGVyID09PSAne3NlbGVjdGVkOnRydWV9Jykge1xuICAgICAgICByZXR1cm4gdXNlci5zZWxlY3RlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChmaWx0ZXIsICdpJyk7IC8vIENhc2UtaW5zZW5zaXRpdmVcbiAgICAgICAgbGV0IG1hdGNoID0gZmFsc2U7IC8vIFRoZSBlbmQgcmVzdWx0IC0gd2hldGhlciBvciBub3QgYSBlbXBsb3llZSBtYXRjaGVzIHRoZSBmaWx0ZXJcblxuICAgICAgICBjb25zdCBmaWx0ZXJQcm9wZXJ0aWVzID0gWyAnZGlzcGxheU5hbWUnIF07XG4gICAgICAgIGlmICh0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy5hY2NvdW50TmFtZSkge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgnc0FNQWNjb3VudE5hbWUnKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy50aXRsZSkge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgndGl0bGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhLmZpbHRlck9wdGlvbnMuZGVwYXJ0bWVudCkge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgnZGVwYXJ0bWVudCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGEuZmlsdGVyT3B0aW9ucy5waG9uZU51bWJlcikge1xuICAgICAgICAgIGZpbHRlclByb3BlcnRpZXMucHVzaCgndGVsZXBob25lTnVtYmVyJyk7XG4gICAgICAgIH1cbiAgXG4gICAgICAgIC8vIE1hdGNoIG9uIHRoZSBwcm9wZXJ0aWVzIGNvbmZpZ3VyZWQgYWJvdmVcbiAgICAgICAgZmlsdGVyUHJvcGVydGllc1xuICAgICAgICAgIC5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh1c2VyW2ZpZWxkXSAmJiB1c2VyW2ZpZWxkXS5tYXRjaChyZWdleCkpIHtcbiAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICBcbiAgICAgICAgLy8gTWF0Y2ggb24gZ3JvdXAgbWVtYmVyc2hpcCAoZ3JvdXAgbmFtZSlcbiAgICAgICAgaWYgKHRoaXMuZGF0YS5maWx0ZXJPcHRpb25zLmdyb3VwTWVtYmVyc2hpcCkge1xuICAgICAgICAgIHVzZXIubWVtYmVyT2YuZm9yRWFjaChncm91cERuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHM/LmZpbmQoZ3JvdXAgPT4gZ3JvdXAuZGlzdGluZ3Vpc2hlZE5hbWUgPT09IGdyb3VwRG4gJiYgZ3JvdXAubmFtZS5tYXRjaChyZWdleCkpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGxpc3RlbkZvckZpbHRlckNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgyNTApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuZGF0YVNvdXJjZSEuZmlsdGVyID0gdGhpcy5maWx0ZXJGb3JtLnZhbHVlLmZpbHRlcj8udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuICB9XG5cbiAgdG9vbHRpcCh1c2VyOiBTZWxlY3RhYmxlVXNlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5zaG93R3JvdXBNZW1iZXJzaGlwVG9vbHRpcHMgP1xuICAgICAgdXNlci5tZW1iZXJPZlxuICAgICAgICAubWFwKGdyb3VwRG4gPT5cbiAgICAgICAgICB0aGlzLmdyb3Vwc1xuICAgICAgICAgICAgPy5maW5kKGdyb3VwID0+XG4gICAgICAgICAgICAgIGdyb3VwLmRpc3Rpbmd1aXNoZWROYW1lID09PSBncm91cERuXG4gICAgICAgICAgICApPy5uYW1lXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhISA+IGIhID8gMSA6IC0xKVxuICAgICAgICAgIC5qb2luKCdcXG4nKSA6XG4gICAgICAnJztcbiAgfVxuICAvLyNlbmRyZWdpb25cbn1cbiIsIjxkaXYgaWQ9XCJkaWFsb2ctdGl0bGVcIj5cbiAgICA8aDIgbWF0LWRpYWxvZy10aXRsZT57eyBkYXRhLnRpdGxlIH19PC9oMj5cblxuICAgIDxkaXY+XG4gICAgICAgIHt7IHNlbGVjdGVkT3B0aW9ucy5sZW5ndGggfX0gc2VsZWN0ZWRcbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48bWF0LWRpYWxvZy1jb250ZW50PlxuICAgIDxkaXYgKm5nSWY9XCIhKGRhdGFTb3VyY2UgJiYgcGhvdG9zKVwiPlxuICAgICAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjUwXCI+PC9tYXQtc3Bpbm5lcj5cbiAgICAgICAgPGgyIGlkPVwic3Bpbm5lci1tZXNzYWdlXCI+R2V0dGluZyB1c2VycyBhbmQgcGhvdG9zLi4uPC9oMj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkYXRhU291cmNlICYmIHBob3Rvc1wiPlxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIj5cbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cImRhdGFTb3VyY2VcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWFyY2hcIiBmb3JtQ29udHJvbE5hbWU9XCJmaWx0ZXJcIj5cblxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJmaWx0ZXJGb3JtLnZhbHVlLmZpbHRlclwiIG1hdFN1ZmZpeCBtYXQtaWNvbi1idXR0b24gYXJpYS1sYWJlbD1cIkNsZWFyXCIgKGNsaWNrKT1cImZpbHRlckZvcm0uZ2V0KCdmaWx0ZXInKT8uc2V0VmFsdWUoJycpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNsb3NlXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZm9ybT5cblxuICAgICAgICA8bWF0LXNlbGVjdGlvbi1saXN0IFttdWx0aXBsZV09XCJpc011bHRpTW9kZVwiXG4gICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cImxpc3RTZWxlY3Rpb25DaGFuZ2VkKCRldmVudC5vcHRpb25zKVwiPlxuXG4gICAgICAgICAgICA8bWF0LWxpc3Qtb3B0aW9uICpuZ0Zvcj1cImxldCB1c2VyIG9mIGRhdGFTb3VyY2U/LmZpbHRlcmVkRGF0YVwiIFt2YWx1ZV09XCJ1c2VyXCIgW3NlbGVjdGVkXT1cInVzZXIuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJvcHRpb25TZWxlY3Rpb25DaGFuZ2VkKG9wdGlvbilcIiAjb3B0aW9uPlxuXG4gICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImdldFBob3RvKHVzZXIpXCIgbWF0TGlzdEF2YXRhciBhbHQ9XCJcIiBbc3JjXT1cImdldFBob3RvKHVzZXIpXCI+XG5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCIhZ2V0UGhvdG8odXNlcilcIiBtYXRMaXN0QXZhdGFyIGNsYXNzPVwibm8tcGhvdG9cIlxuICAgICAgICAgICAgICAgICAgICBmb250SWNvbj1cImFjY291bnRfY2lyY2xlXCI+XG4gICAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW21hdFRvb2x0aXBdPVwidG9vbHRpcCh1c2VyKVwiIGNsYXNzPVwidXNlci1uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyB1c2VyLmRpc3BsYXlOYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGF0YS5zaG93UGhvbmUgJiYgdXNlci50ZWxlcGhvbmVOdW1iZXJcIj57eyB1c2VyLnRlbGVwaG9uZU51bWJlciB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgdXNlci5kZXBhcnRtZW50IH19PC9kaXY+XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj57eyB1c2VyLnRpdGxlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1saXN0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0aW9uLWxpc3Q+XG4gICAgPC9uZy1jb250YWluZXI+XG48L21hdC1kaWFsb2ctY29udGVudD5cblxuPG1hdC1kaWFsb2ctYWN0aW9ucz5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YVNvdXJjZSAmJiBwaG90b3NcIj5cbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgKm5nSWY9XCJzZWxlY3RlZE9wdGlvbnMubGVuZ3RoXCIgKGNoYW5nZSk9XCJoaWRlVW5zZWxlY3RlZENoYW5nZWQoJGV2ZW50LmNoZWNrZWQpXCI+XG4gICAgICAgICAgICBIaWRlIFVuc2VsZWN0ZWRcbiAgICAgICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxuXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cInNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNNdWx0aU1vZGVcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cInNlbGVjdF9hbGxcIj48L21hdC1pY29uPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPlNlbGVjdCBBbGw8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIFxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJkZXNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgICpuZ0lmPVwiaXNNdWx0aU1vZGUgJiYgc2VsZWN0ZWRPcHRpb25zLmxlbmd0aFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiY2xlYXJfYWxsXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGlkZS1tb2JpbGVcIj5DbGVhciBBbGw8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJpc011bHRpTW9kZSB8fCAhZGF0YS5jbG9zZVdoZW5TZWxlY3Rpb25NYWRlXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImNsb3NlKClcIiBtYXRUb29sdGlwPVwiQWNjZXB0IHlvdXIgc2VsZWN0aW9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2VsZWN0ZWRPcHRpb25zLmxlbmd0aFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiY2hlY2tcIj48L21hdC1pY29uPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoaWRlLW1vYmlsZVwiPk9rPC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJ3YXJuXCIgbWF0LWRpYWxvZy1jbG9zZSBtYXRUb29sdGlwPVwiQ2xvc2UgdGhpcyB3aW5kb3dcIj5cbiAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiY2xvc2VcIj48L21hdC1pY29uPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImhpZGUtbW9iaWxlXCI+Q2FuY2VsPC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuPC9tYXQtZGlhbG9nLWFjdGlvbnM+Il19
@@ -7,10 +7,12 @@ import * as i1 from "@angular/material/dialog";
7
7
  import * as i2 from "@cleavelandprice/ngx-lib/active-directory";
8
8
  import * as i3 from "@cleavelandprice/ngx-lib/sharepoint";
9
9
  import * as i4 from "@angular/common";
10
- import * as i5 from "@angular/material/form-field";
11
- import * as i6 from "@angular/material/input";
12
- import * as i7 from "@angular/material/list";
13
- import * as i8 from "@angular/material/progress-bar";
10
+ import * as i5 from "@angular/material/button";
11
+ import * as i6 from "@angular/material/form-field";
12
+ import * as i7 from "@angular/material/icon";
13
+ import * as i8 from "@angular/material/input";
14
+ import * as i9 from "@angular/material/list";
15
+ import * as i10 from "@angular/material/progress-bar";
14
16
  export class UserFormFieldComponent {
15
17
  //#endregion
16
18
  //#region Lifecycle
@@ -20,6 +22,7 @@ export class UserFormFieldComponent {
20
22
  this.sharePointService = sharePointService;
21
23
  //#region Fields
22
24
  this.usersSelected = new EventEmitter(); // string for Single mode, string[] for multi
25
+ this.userUnSelected = new EventEmitter();
23
26
  this.placeholder = 'Select User(s)';
24
27
  this.clickable = true;
25
28
  this.accountNames = [];
@@ -67,6 +70,12 @@ export class UserFormFieldComponent {
67
70
  this.usersSelected.emit(selected);
68
71
  });
69
72
  }
73
+ unSelectUser(accountName) {
74
+ const index = this.accountNames.findIndex(a => a === accountName);
75
+ this.accountNames.splice(index, 1);
76
+ this.userChooserData.preSelections.accountNames = this.accountNames;
77
+ this.userUnSelected.emit(accountName);
78
+ }
70
79
  //#endregion
71
80
  //#region Utilities
72
81
  getData() {
@@ -102,12 +111,14 @@ export class UserFormFieldComponent {
102
111
  }
103
112
  }
104
113
  UserFormFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: UserFormFieldComponent, deps: [{ token: i1.MatDialog }, { token: i2.ActiveDirectoryService }, { token: i3.SharePointService }], target: i0.ɵɵFactoryTarget.Component });
105
- UserFormFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.1", type: UserFormFieldComponent, selector: "user-form-field", inputs: { placeholder: "placeholder", clickable: "clickable", userChooserData: "userChooserData" }, outputs: { usersSelected: "usersSelected" }, ngImport: i0, template: "<!-- In Microsoft Edge, selectEmployee() never gets called if the input fields are disabled\n So... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\n It's definitely a better experience if the field IS disabled.\n Otherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\n-->\n\n<mat-progress-bar *ngIf=\"!(users && photos)\" mode=\"indeterminate\"></mat-progress-bar>\n\n<div *ngIf=\"users && photos\" (click)=\"selectUser()\" [class.clickable]=\"clickable\">\n <mat-form-field *ngIf=\"!accountNames?.length\">\n <input matInput [disabled]=\"!isEdge\" [placeholder]=\"placeholder\">\n </mat-form-field>\n \n <div *ngIf=\"accountNames?.length\"\n [class.grid]=\"accountNames.length > 1\"\n [class.three]=\"accountNames.length > 2\"\n [class.four]=\"accountNames.length > 3\"\n [class.five]=\"accountNames.length > 4\">\n\n <div *ngFor=\"let accountName of accountNames; let i=index\" class=\"user\">\n <!--<img *ngIf=\"accountName && empUtils.getEmployee(accountName)\" alt=\"\" [src]=\"empUtils.getEmployee(accountName) | employeePhotoUrl:cacheService.photos\">-->\n <img *ngIf=\"getPhoto(accountName)\" matListAvatar alt=\"\" [src]=\"getPhoto(accountName)\">\n \n <mat-form-field>\n <input matInput [disabled]=\"!isEdge\" [placeholder]=\"i === 0 ? placeholder : ''\"\n [value]=\"accountName ? getUser(accountName)?.displayName : accountName\">\n </mat-form-field>\n </div>\n </div>\n </div>", styles: [".user{display:grid;grid-template-columns:auto 1fr;grid-gap:.5em;align-items:center}.clickable,.clickable input{cursor:pointer!important}img{width:2em;height:2em;border-radius:100%}@media (min-width:801px){.grid{display:grid;grid-template-columns:repeat(2,1fr);grid-gap:1em}.three{grid-template-columns:repeat(3,1fr)}.four{grid-template-columns:repeat(4,1fr)}.five{grid-template-columns:repeat(5,1fr)}::ng-deep .grid mat-form-field{width:15vw}}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i7.MatListAvatarCssMatStyler, selector: "[mat-list-avatar], [matListAvatar]" }, { kind: "component", type: i8.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }] });
114
+ UserFormFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.1", type: UserFormFieldComponent, selector: "user-form-field", inputs: { placeholder: "placeholder", clickable: "clickable", userChooserData: "userChooserData" }, outputs: { usersSelected: "usersSelected", userUnSelected: "userUnSelected" }, ngImport: i0, template: "<!-- In Microsoft Edge, selectEmployee() never gets called if the input fields are disabled\n So... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\n It's definitely a better experience if the field IS disabled.\n Otherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\n-->\n\n<mat-progress-bar *ngIf=\"!(users && photos)\" mode=\"indeterminate\"></mat-progress-bar>\n\n<div *ngIf=\"users && photos\" (click)=\"selectUser()\" [class.clickable]=\"clickable\">\n <mat-form-field *ngIf=\"!accountNames?.length\">\n <input matInput [disabled]=\"!isEdge\" [placeholder]=\"placeholder\">\n </mat-form-field>\n \n <div *ngIf=\"accountNames?.length\"\n [class.grid]=\"accountNames.length > 1\"\n [class.three]=\"accountNames.length > 2\"\n [class.four]=\"accountNames.length > 3\"\n [class.five]=\"accountNames.length > 4\">\n\n <div *ngFor=\"let accountName of accountNames; let i=index\" class=\"user\">\n <!--<img *ngIf=\"accountName && empUtils.getEmployee(accountName)\" alt=\"\" [src]=\"empUtils.getEmployee(accountName) | employeePhotoUrl:cacheService.photos\">-->\n <img *ngIf=\"getPhoto(accountName)\" matListAvatar alt=\"\" [src]=\"getPhoto(accountName)\">\n \n <mat-form-field>\n <input matInput [disabled]=\"!isEdge\" [placeholder]=\"i === 0 ? placeholder : ''\"\n [value]=\"accountName ? getUser(accountName)?.displayName : accountName\">\n\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"$event.stopPropagation(); unSelectUser(accountName)\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n </mat-form-field>\n </div>\n </div>\n </div>", styles: [".user{display:grid;grid-template-columns:auto 1fr;grid-gap:.5em;align-items:center}.clickable,.clickable input{cursor:pointer!important}img{width:2em;height:2em;border-radius:100%}@media (min-width:801px){.grid{display:grid;grid-template-columns:repeat(2,1fr);grid-gap:1em}.three{grid-template-columns:repeat(3,1fr)}.four{grid-template-columns:repeat(4,1fr)}.five{grid-template-columns:repeat(5,1fr)}::ng-deep .grid mat-form-field{width:15vw}}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix]" }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i9.MatListAvatarCssMatStyler, selector: "[mat-list-avatar], [matListAvatar]" }, { kind: "component", type: i10.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }] });
106
115
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: UserFormFieldComponent, decorators: [{
107
116
  type: Component,
108
- args: [{ selector: 'user-form-field', template: "<!-- In Microsoft Edge, selectEmployee() never gets called if the input fields are disabled\n So... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\n It's definitely a better experience if the field IS disabled.\n Otherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\n-->\n\n<mat-progress-bar *ngIf=\"!(users && photos)\" mode=\"indeterminate\"></mat-progress-bar>\n\n<div *ngIf=\"users && photos\" (click)=\"selectUser()\" [class.clickable]=\"clickable\">\n <mat-form-field *ngIf=\"!accountNames?.length\">\n <input matInput [disabled]=\"!isEdge\" [placeholder]=\"placeholder\">\n </mat-form-field>\n \n <div *ngIf=\"accountNames?.length\"\n [class.grid]=\"accountNames.length > 1\"\n [class.three]=\"accountNames.length > 2\"\n [class.four]=\"accountNames.length > 3\"\n [class.five]=\"accountNames.length > 4\">\n\n <div *ngFor=\"let accountName of accountNames; let i=index\" class=\"user\">\n <!--<img *ngIf=\"accountName && empUtils.getEmployee(accountName)\" alt=\"\" [src]=\"empUtils.getEmployee(accountName) | employeePhotoUrl:cacheService.photos\">-->\n <img *ngIf=\"getPhoto(accountName)\" matListAvatar alt=\"\" [src]=\"getPhoto(accountName)\">\n \n <mat-form-field>\n <input matInput [disabled]=\"!isEdge\" [placeholder]=\"i === 0 ? placeholder : ''\"\n [value]=\"accountName ? getUser(accountName)?.displayName : accountName\">\n </mat-form-field>\n </div>\n </div>\n </div>", styles: [".user{display:grid;grid-template-columns:auto 1fr;grid-gap:.5em;align-items:center}.clickable,.clickable input{cursor:pointer!important}img{width:2em;height:2em;border-radius:100%}@media (min-width:801px){.grid{display:grid;grid-template-columns:repeat(2,1fr);grid-gap:1em}.three{grid-template-columns:repeat(3,1fr)}.four{grid-template-columns:repeat(4,1fr)}.five{grid-template-columns:repeat(5,1fr)}::ng-deep .grid mat-form-field{width:15vw}}\n"] }]
117
+ args: [{ selector: 'user-form-field', template: "<!-- In Microsoft Edge, selectEmployee() never gets called if the input fields are disabled\n So... I'm dynamically setting the disabled property based on whether or not the browser is Edge.\n It's definitely a better experience if the field IS disabled.\n Otherwise, it's confusing - especially because Edge is SO SLOW to display the resulting dialog window.\n-->\n\n<mat-progress-bar *ngIf=\"!(users && photos)\" mode=\"indeterminate\"></mat-progress-bar>\n\n<div *ngIf=\"users && photos\" (click)=\"selectUser()\" [class.clickable]=\"clickable\">\n <mat-form-field *ngIf=\"!accountNames?.length\">\n <input matInput [disabled]=\"!isEdge\" [placeholder]=\"placeholder\">\n </mat-form-field>\n \n <div *ngIf=\"accountNames?.length\"\n [class.grid]=\"accountNames.length > 1\"\n [class.three]=\"accountNames.length > 2\"\n [class.four]=\"accountNames.length > 3\"\n [class.five]=\"accountNames.length > 4\">\n\n <div *ngFor=\"let accountName of accountNames; let i=index\" class=\"user\">\n <!--<img *ngIf=\"accountName && empUtils.getEmployee(accountName)\" alt=\"\" [src]=\"empUtils.getEmployee(accountName) | employeePhotoUrl:cacheService.photos\">-->\n <img *ngIf=\"getPhoto(accountName)\" matListAvatar alt=\"\" [src]=\"getPhoto(accountName)\">\n \n <mat-form-field>\n <input matInput [disabled]=\"!isEdge\" [placeholder]=\"i === 0 ? placeholder : ''\"\n [value]=\"accountName ? getUser(accountName)?.displayName : accountName\">\n\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"$event.stopPropagation(); unSelectUser(accountName)\">\n <mat-icon fontIcon=\"close\"></mat-icon>\n </button>\n </mat-form-field>\n </div>\n </div>\n </div>", styles: [".user{display:grid;grid-template-columns:auto 1fr;grid-gap:.5em;align-items:center}.clickable,.clickable input{cursor:pointer!important}img{width:2em;height:2em;border-radius:100%}@media (min-width:801px){.grid{display:grid;grid-template-columns:repeat(2,1fr);grid-gap:1em}.three{grid-template-columns:repeat(3,1fr)}.four{grid-template-columns:repeat(4,1fr)}.five{grid-template-columns:repeat(5,1fr)}::ng-deep .grid mat-form-field{width:15vw}}\n"] }]
109
118
  }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.ActiveDirectoryService }, { type: i3.SharePointService }]; }, propDecorators: { usersSelected: [{
110
119
  type: Output
120
+ }], userUnSelected: [{
121
+ type: Output
111
122
  }], placeholder: [{
112
123
  type: Input
113
124
  }], clickable: [{
@@ -115,4 +126,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImpor
115
126
  }], userChooserData: [{
116
127
  type: Input
117
128
  }] } });
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1mb3JtLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnkvZ3VpL3NyYy9jb21wb25lbnRzL3VzZXItZm9ybS1maWVsZC91c2VyLWZvcm0tZmllbGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeS9ndWkvc3JjL2NvbXBvbmVudHMvdXNlci1mb3JtLWZpZWxkL3VzZXItZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTXBDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRW5GLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7Ozs7Ozs7O0FBTzlFLE1BQU0sT0FBTyxzQkFBc0I7SUFrQmpDLFlBQVk7SUFFWixtQkFBbUI7SUFDbkIsWUFBb0IsTUFBaUIsRUFDakIsc0JBQThDLEVBQzlDLGlCQUFvQztRQUZwQyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQXRCeEQsZ0JBQWdCO1FBQ04sa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBcUIsQ0FBQyxDQUFDLDZDQUE2QztRQUNyRyxnQkFBVyxHQUFHLGdCQUFnQixDQUFDO1FBQy9CLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFJMUIsaUJBQVksR0FBYSxFQUFFLENBQUM7UUFFNUIsVUFBSyxHQUF1QixTQUFTLENBQUM7UUFDdEMsV0FBTSxHQUE0QixTQUFTLENBQUM7SUFZZ0IsQ0FBQztJQVg3RCxZQUFZO0lBRVosb0JBQW9CO0lBQ3BCLElBQUksTUFBTTtRQUNSLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFRRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGVBQWUsR0FBRztZQUNyQixHQUFHLHdCQUF3QjtZQUMzQixHQUFHLElBQUksQ0FBQyxlQUFlO1NBQ3hCLENBQUE7UUFFRCxvSEFBb0g7UUFDcEgsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7UUFFcEUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFDRCxZQUFZO0lBRVosZ0JBQWdCO0lBQ2hCLFVBQVU7UUFDUixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUFFLE9BQU87U0FBRTtRQUVoQyxNQUFNLElBQUksR0FBb0I7WUFDNUIsR0FBRyxJQUFJLENBQUMsZUFBZTtZQUV2QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ3BCLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUNyQyxJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUM7YUFDRCxXQUFXLEVBQUU7YUFDYixTQUFTLENBQUMsQ0FBQyxRQUEyQixFQUFFLEVBQUU7WUFDekMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFBRSxPQUFPO2FBQUU7WUFFMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLFFBQVEsQ0FBQyxDQUFDO2dCQUNWLENBQUUsUUFBUSxDQUFFLENBQUM7WUFFZiwySUFBMkk7WUFDM0ksSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7WUFFcEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsWUFBWTtJQUVaLG1CQUFtQjtJQUNYLE9BQU87UUFDYixRQUFRLENBQUM7WUFDUCxJQUFJLENBQUMsZUFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0IsdUJBQXVCO2dCQUN2QixFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDakMsNkJBQTZCO2dCQUM3QixJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZ0IsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsZUFBZ0IsQ0FBQyxRQUFRLENBQUM7WUFFekgsSUFBSSxDQUFDLGVBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzVCLHdCQUF3QjtnQkFDeEIsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLDhCQUE4QjtnQkFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRTtTQUNyQyxDQUFDO2FBQ0MsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRTtZQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxPQUFPLENBQUMsV0FBbUI7UUFDekIsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLEtBQUssV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVELFFBQVEsQ0FBQyxXQUFtQjtRQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFBRSxPQUFPLFNBQVMsQ0FBQztTQUFFO1FBRWhDLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDM0IsQ0FBQyxDQUFDLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUN6RSxDQUFDLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFO1lBQ2xFLENBQUMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7WUFDL0QsQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUMxRCxFQUFFLGFBQWEsQ0FBQztJQUNuQixDQUFDOzttSEF2R1Usc0JBQXNCO3VHQUF0QixzQkFBc0Isd01DakJuQyxzakRBNkJROzJGRFpLLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxpQkFBaUI7cUtBTWpCLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0UsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIG9mIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFjdGl2ZURpcmVjdG9yeVNlcnZpY2UsIFVzZXIgfSBmcm9tICdAY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeSc7XG5pbXBvcnQgeyBQaG90b0l0ZW0sIFNoYXJlUG9pbnRTZXJ2aWNlIH0gZnJvbSAnQGNsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL3NoYXJlcG9pbnQnO1xuXG5pbXBvcnQgeyBVc2VyQ2hvb3NlckRhdGEgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyLWNob29zZXItZGF0YSc7XG5pbXBvcnQgeyBkZWZhdWx0VXNlckNob29zZXJDb25maWcgfSBmcm9tICcuLi8uLi9tb2RlbC9kZWZhdWx0LXVzZXItY2hvb3Nlci1jb25maWcnO1xuXG5pbXBvcnQgeyBVc2VyQ2hvb3NlckNvbXBvbmVudCB9IGZyb20gJy4uL3VzZXItY2hvb3Nlci91c2VyLWNob29zZXIuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndXNlci1mb3JtLWZpZWxkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VzZXItZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VzZXItZm9ybS1maWVsZC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgVXNlckZvcm1GaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vI3JlZ2lvbiBGaWVsZHNcbiAgQE91dHB1dCgpIHVzZXJzU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZyB8IHN0cmluZ1tdPigpOyAvLyBzdHJpbmcgZm9yIFNpbmdsZSBtb2RlLCBzdHJpbmdbXSBmb3IgbXVsdGlcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnU2VsZWN0IFVzZXIocyknO1xuICBASW5wdXQoKSBjbGlja2FibGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIHVzZXJDaG9vc2VyRGF0YSE6IFVzZXJDaG9vc2VyRGF0YTtcblxuICBhY2NvdW50TmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgdXNlcnM6IFVzZXJbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgcGhvdG9zOiBQaG90b0l0ZW1bXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFByb3BlcnRpZXNcbiAgZ2V0IGlzRWRnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRWRnZScpID4gLTE7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG4gIFxuICAvLyNyZWdpb24gTGlmZWN5Y2xlXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgICAgICAgIHByaXZhdGUgYWN0aXZlRGlyZWN0b3J5U2VydmljZTogQWN0aXZlRGlyZWN0b3J5U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBzaGFyZVBvaW50U2VydmljZTogU2hhcmVQb2ludFNlcnZpY2UpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXNlckNob29zZXJEYXRhID0ge1xuICAgICAgLi4uZGVmYXVsdFVzZXJDaG9vc2VyQ29uZmlnLFxuICAgICAgLi4udGhpcy51c2VyQ2hvb3NlckRhdGFcbiAgICB9XG5cbiAgICAvLyBJZiB1c2VycyBoYXZlIGJlZW4gcHJlLXNlbGVjdGVkIGluIHRoZSBjb25maWcsIHN0b3JlIHRob3NlIGluIGFjY291bnROYW1lcywgd2hpY2ggZHJpdmVzIHRoZSBVSSBvZiB0aGlzIGNvbXBvbmVudFxuICAgIHRoaXMuYWNjb3VudE5hbWVzID0gdGhpcy51c2VyQ2hvb3NlckRhdGEucHJlU2VsZWN0aW9ucy5hY2NvdW50TmFtZXM7XG5cbiAgICB0aGlzLmdldERhdGEoKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gRXZlbnRzXG4gIHNlbGVjdFVzZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNsaWNrYWJsZSkgeyByZXR1cm47IH1cblxuICAgIGNvbnN0IGRhdGE6IFVzZXJDaG9vc2VyRGF0YSA9IHtcbiAgICAgIC4uLnRoaXMudXNlckNob29zZXJEYXRhLFxuXG4gICAgICB1c2VyczogdGhpcy51c2VycyxcbiAgICAgIHBob3RvczogdGhpcy5waG90b3MsXG4gICAgfTtcblxuICAgIHRoaXMuZGlhbG9nLm9wZW4oVXNlckNob29zZXJDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KVxuICAgIC5hZnRlckNsb3NlZCgpXG4gICAgLnN1YnNjcmliZSgoc2VsZWN0ZWQ6IHN0cmluZyB8IHN0cmluZ1tdKSA9PiB7XG4gICAgICBpZiAoIXNlbGVjdGVkKSB7IHJldHVybjsgfVxuICAgICAgXG4gICAgICB0aGlzLmFjY291bnROYW1lcyA9IEFycmF5LmlzQXJyYXkoc2VsZWN0ZWQpID9cbiAgICAgICAgc2VsZWN0ZWQgOlxuICAgICAgICBbIHNlbGVjdGVkIF07XG5cbiAgICAgIC8vIE92ZXJ3cml0ZSB3aGF0IG1heSBoYXZlIGJlZW4gcGFzc2VkIGluLCBmb3Igc3Vic2VxdWVudCBsYXVuY2hlcyBvZiBVc2VyQ2hvb3NlckNvbXBvbmVudCAtIG90aGVyd2lzZSBpdCBqdXN0IGtlZXBzIGdldHRpbmcgZmVkIHN0YWxlIGRhdGFcbiAgICAgIHRoaXMudXNlckNob29zZXJEYXRhLnByZVNlbGVjdGlvbnMuYWNjb3VudE5hbWVzID0gdGhpcy5hY2NvdW50TmFtZXM7XG5cbiAgICAgIHRoaXMudXNlcnNTZWxlY3RlZC5lbWl0KHNlbGVjdGVkKTtcbiAgICB9KTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gVXRpbGl0aWVzXG4gIHByaXZhdGUgZ2V0RGF0YSgpOiB2b2lkIHtcbiAgICBmb3JrSm9pbihbXG4gICAgICB0aGlzLnVzZXJDaG9vc2VyRGF0YSEudXNlcnMgP1xuICAgICAgICAvLyBVc2VycyB3ZXJlIHBhc3NlZCBpblxuICAgICAgICBvZih0aGlzLnVzZXJDaG9vc2VyRGF0YSEudXNlcnMpIDpcbiAgICAgICAgLy8gVXNlcnMgbmVlZCB0byBiZSByZXRyaWV2ZWRcbiAgICAgICAgdGhpcy5hY3RpdmVEaXJlY3RvcnlTZXJ2aWNlLmdldFVzZXJzKGZhbHNlLCB0aGlzLnVzZXJDaG9vc2VyRGF0YSEuaW5jbHVkZURpc2FibGVkVXNlcnMsIHRoaXMudXNlckNob29zZXJEYXRhIS5wYXJlbnRPdSksXG5cbiAgICAgIHRoaXMudXNlckNob29zZXJEYXRhIS5waG90b3MgP1xuICAgICAgICAvLyBQaG90b3Mgd2VyZSBwYXNzZWQgaW5cbiAgICAgICAgb2YodGhpcy51c2VyQ2hvb3NlckRhdGEhLnBob3RvcykgOlxuICAgICAgICAvLyBQaG90b3MgbmVlZCB0byBiZSByZXRyaWV2ZWRcbiAgICAgICAgdGhpcy5zaGFyZVBvaW50U2VydmljZS5nZXRQaG90b3MoKVxuICAgIF0pXG4gICAgICAuc3Vic2NyaWJlKChbdXNlcnMsIHBob3Rvc10pID0+IHtcbiAgICAgICAgdGhpcy51c2VycyA9IHVzZXJzO1xuICAgICAgICB0aGlzLnBob3RvcyA9IHBob3RvcztcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0VXNlcihhY2NvdW50TmFtZTogc3RyaW5nKTogVXNlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudXNlcnM/LmZpbmQodSA9PiB1LnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgPT09IGFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkpO1xuICB9XG5cbiAgZ2V0UGhvdG8oYWNjb3VudE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdXNlciA9IHRoaXMuZ2V0VXNlcihhY2NvdW50TmFtZSk7XG4gICAgaWYgKCF1c2VyKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cblxuICAgIHJldHVybiB0aGlzLnBob3Rvcz8uZmluZChwID0+XG4gICAgICAocC5lbXBsb3llZU51bWJlciAmJiBwLmVtcGxveWVlTnVtYmVyLnRvU3RyaW5nKCkgPT09IHVzZXIuZW1wbG95ZWVOdW1iZXIpIHx8XG4gICAgICBwLmFjY291bnROYW1lPy50b0xvd2VyQ2FzZSgpID09PSB1c2VyLnNBTUFjY291bnROYW1lLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIHAuZGlzcGxheU5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgcC50aXRsZT8udG9Mb3dlckNhc2UoKSA9PT0gdXNlci5kaXNwbGF5TmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgKT8uZW5jb2RlZEFic1VybDtcbiAgfVxuICAvLyNlbmRyZWdpb25cbn1cbiIsIjwhLS0gSW4gTWljcm9zb2Z0IEVkZ2UsIHNlbGVjdEVtcGxveWVlKCkgbmV2ZXIgZ2V0cyBjYWxsZWQgaWYgdGhlIGlucHV0IGZpZWxkcyBhcmUgZGlzYWJsZWRcbiAgU28uLi4gSSdtIGR5bmFtaWNhbGx5IHNldHRpbmcgdGhlIGRpc2FibGVkIHByb3BlcnR5IGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IHRoZSBicm93c2VyIGlzIEVkZ2UuXG4gIEl0J3MgZGVmaW5pdGVseSBhIGJldHRlciBleHBlcmllbmNlIGlmIHRoZSBmaWVsZCBJUyBkaXNhYmxlZC5cbiAgT3RoZXJ3aXNlLCBpdCdzIGNvbmZ1c2luZyAtIGVzcGVjaWFsbHkgYmVjYXVzZSBFZGdlIGlzIFNPIFNMT1cgdG8gZGlzcGxheSB0aGUgcmVzdWx0aW5nIGRpYWxvZyB3aW5kb3cuXG4tLT5cblxuPG1hdC1wcm9ncmVzcy1iYXIgKm5nSWY9XCIhKHVzZXJzICYmIHBob3RvcylcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPjwvbWF0LXByb2dyZXNzLWJhcj5cblxuPGRpdiAqbmdJZj1cInVzZXJzICYmIHBob3Rvc1wiIChjbGljayk9XCJzZWxlY3RVc2VyKClcIiBbY2xhc3MuY2xpY2thYmxlXT1cImNsaWNrYWJsZVwiPlxuICAgIDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIiFhY2NvdW50TmFtZXM/Lmxlbmd0aFwiPlxuICAgICAgPGlucHV0IG1hdElucHV0IFtkaXNhYmxlZF09XCIhaXNFZGdlXCIgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCI+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgXG4gICAgPGRpdiAqbmdJZj1cImFjY291bnROYW1lcz8ubGVuZ3RoXCJcbiAgICAgIFtjbGFzcy5ncmlkXT1cImFjY291bnROYW1lcy5sZW5ndGggPiAxXCJcbiAgICAgIFtjbGFzcy50aHJlZV09XCJhY2NvdW50TmFtZXMubGVuZ3RoID4gMlwiXG4gICAgICBbY2xhc3MuZm91cl09XCJhY2NvdW50TmFtZXMubGVuZ3RoID4gM1wiXG4gICAgICBbY2xhc3MuZml2ZV09XCJhY2NvdW50TmFtZXMubGVuZ3RoID4gNFwiPlxuXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBhY2NvdW50TmFtZSBvZiBhY2NvdW50TmFtZXM7IGxldCBpPWluZGV4XCIgY2xhc3M9XCJ1c2VyXCI+XG4gICAgICAgIDwhLS08aW1nICpuZ0lmPVwiYWNjb3VudE5hbWUgJiYgZW1wVXRpbHMuZ2V0RW1wbG95ZWUoYWNjb3VudE5hbWUpXCIgYWx0PVwiXCIgW3NyY109XCJlbXBVdGlscy5nZXRFbXBsb3llZShhY2NvdW50TmFtZSkgfCBlbXBsb3llZVBob3RvVXJsOmNhY2hlU2VydmljZS5waG90b3NcIj4tLT5cbiAgICAgICAgPGltZyAqbmdJZj1cImdldFBob3RvKGFjY291bnROYW1lKVwiIG1hdExpc3RBdmF0YXIgYWx0PVwiXCIgW3NyY109XCJnZXRQaG90byhhY2NvdW50TmFtZSlcIj5cbiAgXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZGlzYWJsZWRdPVwiIWlzRWRnZVwiIFtwbGFjZWhvbGRlcl09XCJpID09PSAwID8gcGxhY2Vob2xkZXIgOiAnJ1wiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFjY291bnROYW1lID8gZ2V0VXNlcihhY2NvdW50TmFtZSk/LmRpc3BsYXlOYW1lIDogYWNjb3VudE5hbWVcIj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj4iXX0=
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1mb3JtLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsZWF2ZWxhbmRwcmljZS9uZ3gtbGliL2FjdGl2ZS1kaXJlY3RvcnkvZ3VpL3NyYy9jb21wb25lbnRzL3VzZXItZm9ybS1maWVsZC91c2VyLWZvcm0tZmllbGQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xlYXZlbGFuZHByaWNlL25neC1saWIvYWN0aXZlLWRpcmVjdG9yeS9ndWkvc3JjL2NvbXBvbmVudHMvdXNlci1mb3JtLWZpZWxkL3VzZXItZm9ybS1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTXBDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRW5GLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7Ozs7Ozs7Ozs7QUFROUUsTUFBTSxPQUFPLHNCQUFzQjtJQW1CakMsWUFBWTtJQUVaLG1CQUFtQjtJQUNuQixZQUFvQixNQUFpQixFQUNqQixzQkFBOEMsRUFDOUMsaUJBQW9DO1FBRnBDLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDakIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBdkJ4RCxnQkFBZ0I7UUFDTixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFxQixDQUFDLENBQUMsNkNBQTZDO1FBQ3BHLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUM3QyxnQkFBVyxH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QUFFLGFBQWEsQ0FBQztJQUNuQixDQUFDOzttSEFqSFUsc0JBQXNCO3VHQUF0QixzQkFBc0IsME9DbEJuQyxveERBaUNROzJGRGZLLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDRSxpQkFBaUI7cUtBTWpCLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFDRSxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgb2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQWN0aXZlRGlyZWN0b3J5U2VydmljZSwgVXNlciB9IGZyb20gJ0BjbGVhdmVsYW5kcHJpY2Uvbmd4LWxpYi9hY3RpdmUtZGlyZWN0b3J5JztcbmltcG9ydCB7IFBob3RvSXRlbSwgU2hhcmVQb2ludFNlcnZpY2UgfSBmcm9tICdAY2xlYXZlbGFuZHByaWNlL25neC1saWIvc2hhcmVwb2ludCc7XG5cbmltcG9ydCB7IFVzZXJDaG9vc2VyRGF0YSB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXItY2hvb3Nlci1kYXRhJztcbmltcG9ydCB7IGRlZmF1bHRVc2VyQ2hvb3NlckNvbmZpZyB9IGZyb20gJy4uLy4uL21vZGVsL2RlZmF1bHQtdXNlci1jaG9vc2VyLWNvbmZpZyc7XG5cbmltcG9ydCB7IFVzZXJDaG9vc2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vdXNlci1jaG9vc2VyL3VzZXItY2hvb3Nlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgVXNlckNob29zZXJNb2RlIH0gZnJvbSAnLi4vLi4vcHVibGljX2FwaSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3VzZXItZm9ybS1maWVsZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi91c2VyLWZvcm0tZmllbGQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91c2VyLWZvcm0tZmllbGQuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJGb3JtRmllbGRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAvLyNyZWdpb24gRmllbGRzXG4gIEBPdXRwdXQoKSB1c2Vyc1NlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCBzdHJpbmdbXT4oKTsgLy8gc3RyaW5nIGZvciBTaW5nbGUgbW9kZSwgc3RyaW5nW10gZm9yIG11bHRpXG4gIEBPdXRwdXQoKSB1c2VyVW5TZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICdTZWxlY3QgVXNlcihzKSc7XG4gIEBJbnB1dCgpIGNsaWNrYWJsZSA9IHRydWU7XG5cbiAgQElucHV0KCkgdXNlckNob29zZXJEYXRhITogVXNlckNob29zZXJEYXRhO1xuXG4gIGFjY291bnROYW1lczogc3RyaW5nW10gPSBbXTtcblxuICB1c2VyczogVXNlcltdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBwaG90b3M6IFBob3RvSXRlbVtdIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gUHJvcGVydGllc1xuICBnZXQgaXNFZGdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdFZGdlJykgPiAtMTtcbiAgfVxuICAvLyNlbmRyZWdpb25cbiAgXG4gIC8vI3JlZ2lvbiBMaWZlY3ljbGVcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBhY3RpdmVEaXJlY3RvcnlTZXJ2aWNlOiBBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIHNoYXJlUG9pbnRTZXJ2aWNlOiBTaGFyZVBvaW50U2VydmljZSkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy51c2VyQ2hvb3NlckRhdGEgPSB7XG4gICAgICAuLi5kZWZhdWx0VXNlckNob29zZXJDb25maWcsXG4gICAgICAuLi50aGlzLnVzZXJDaG9vc2VyRGF0YVxuICAgIH1cblxuICAgIC8vIElmIHVzZXJzIGhhdmUgYmVlbiBwcmUtc2VsZWN0ZWQgaW4gdGhlIGNvbmZpZywgc3RvcmUgdGhvc2UgaW4gYWNjb3VudE5hbWVzLCB3aGljaCBkcml2ZXMgdGhlIFVJIG9mIHRoaXMgY29tcG9uZW50XG4gICAgdGhpcy5hY2NvdW50TmFtZXMgPSB0aGlzLnVzZXJDaG9vc2VyRGF0YS5wcmVTZWxlY3Rpb25zLmFjY291bnROYW1lcztcblxuICAgIHRoaXMuZ2V0RGF0YSgpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBFdmVudHNcbiAgc2VsZWN0VXNlcigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2xpY2thYmxlKSB7IHJldHVybjsgfVxuXG4gICAgY29uc3QgZGF0YTogVXNlckNob29zZXJEYXRhID0ge1xuICAgICAgLi4udGhpcy51c2VyQ2hvb3NlckRhdGEsXG5cbiAgICAgIHVzZXJzOiB0aGlzLnVzZXJzLFxuICAgICAgcGhvdG9zOiB0aGlzLnBob3RvcyxcbiAgICB9O1xuXG4gICAgdGhpcy5kaWFsb2cub3BlbihVc2VyQ2hvb3NlckNvbXBvbmVudCwge1xuICAgICAgZGF0YTogZGF0YVxuICAgIH0pXG4gICAgLmFmdGVyQ2xvc2VkKClcbiAgICAuc3Vic2NyaWJlKChzZWxlY3RlZDogc3RyaW5nIHwgc3RyaW5nW10pID0+IHtcbiAgICAgIGlmICghc2VsZWN0ZWQpIHsgcmV0dXJuOyB9XG4gICAgICBcbiAgICAgIHRoaXMuYWNjb3VudE5hbWVzID0gQXJyYXkuaXNBcnJheShzZWxlY3RlZCkgP1xuICAgICAgICBzZWxlY3RlZCA6XG4gICAgICAgIFsgc2VsZWN0ZWQgXTtcblxuICAgICAgLy8gT3ZlcndyaXRlIHdoYXQgbWF5IGhhdmUgYmVlbiBwYXNzZWQgaW4sIGZvciBzdWJzZXF1ZW50IGxhdW5jaGVzIG9mIFVzZXJDaG9vc2VyQ29tcG9uZW50IC0gb3RoZXJ3aXNlIGl0IGp1c3Qga2VlcHMgZ2V0dGluZyBmZWQgc3RhbGUgZGF0YVxuICAgICAgdGhpcy51c2VyQ2hvb3NlckRhdGEucHJlU2VsZWN0aW9ucy5hY2NvdW50TmFtZXMgPSB0aGlzLmFjY291bnROYW1lcztcblxuICAgICAgdGhpcy51c2Vyc1NlbGVjdGVkLmVtaXQoc2VsZWN0ZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgdW5TZWxlY3RVc2VyKGFjY291bnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuYWNjb3VudE5hbWVzLmZpbmRJbmRleChhID0+IGEgPT09IGFjY291bnROYW1lKTtcbiAgICB0aGlzLmFjY291bnROYW1lcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgdGhpcy51c2VyQ2hvb3NlckRhdGEucHJlU2VsZWN0aW9ucy5hY2NvdW50TmFtZXMgPSB0aGlzLmFjY291bnROYW1lcztcblxuICAgIHRoaXMudXNlclVuU2VsZWN0ZWQuZW1pdChhY2NvdW50TmFtZSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFV0aWxpdGllc1xuICBwcml2YXRlIGdldERhdGEoKTogdm9pZCB7XG4gICAgZm9ya0pvaW4oW1xuICAgICAgdGhpcy51c2VyQ2hvb3NlckRhdGEhLnVzZXJzID9cbiAgICAgICAgLy8gVXNlcnMgd2VyZSBwYXNzZWQgaW5cbiAgICAgICAgb2YodGhpcy51c2VyQ2hvb3NlckRhdGEhLnVzZXJzKSA6XG4gICAgICAgIC8vIFVzZXJzIG5lZWQgdG8gYmUgcmV0cmlldmVkXG4gICAgICAgIHRoaXMuYWN0aXZlRGlyZWN0b3J5U2VydmljZS5nZXRVc2VycyhmYWxzZSwgdGhpcy51c2VyQ2hvb3NlckRhdGEhLmluY2x1ZGVEaXNhYmxlZFVzZXJzLCB0aGlzLnVzZXJDaG9vc2VyRGF0YSEucGFyZW50T3UpLFxuXG4gICAgICB0aGlzLnVzZXJDaG9vc2VyRGF0YSEucGhvdG9zID9cbiAgICAgICAgLy8gUGhvdG9zIHdlcmUgcGFzc2VkIGluXG4gICAgICAgIG9mKHRoaXMudXNlckNob29zZXJEYXRhIS5waG90b3MpIDpcbiAgICAgICAgLy8gUGhvdG9zIG5lZWQgdG8gYmUgcmV0cmlldmVkXG4gICAgICAgIHRoaXMuc2hhcmVQb2ludFNlcnZpY2UuZ2V0UGhvdG9zKClcbiAgICBdKVxuICAgICAgLnN1YnNjcmliZSgoW3VzZXJzLCBwaG90b3NdKSA9PiB7XG4gICAgICAgIHRoaXMudXNlcnMgPSB1c2VycztcbiAgICAgICAgdGhpcy5waG90b3MgPSBwaG90b3M7XG4gICAgICB9KTtcbiAgfVxuXG4gIGdldFVzZXIoYWNjb3VudE5hbWU6IHN0cmluZyk6IFVzZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnVzZXJzPy5maW5kKHUgPT4gdS5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpID09PSBhY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgfVxuXG4gIGdldFBob3RvKGFjY291bnROYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmdldFVzZXIoYWNjb3VudE5hbWUpO1xuICAgIGlmICghdXNlcikgeyByZXR1cm4gdW5kZWZpbmVkOyB9XG5cbiAgICByZXR1cm4gdGhpcy5waG90b3M/LmZpbmQocCA9PlxuICAgICAgKHAuZW1wbG95ZWVOdW1iZXIgJiYgcC5lbXBsb3llZU51bWJlci50b1N0cmluZygpID09PSB1c2VyLmVtcGxveWVlTnVtYmVyKSB8fFxuICAgICAgcC5hY2NvdW50TmFtZT8udG9Mb3dlckNhc2UoKSA9PT0gdXNlci5zQU1BY2NvdW50TmFtZS50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBwLmRpc3BsYXlOYW1lPy50b0xvd2VyQ2FzZSgpID09PSB1c2VyLmRpc3BsYXlOYW1lLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgIHAudGl0bGU/LnRvTG93ZXJDYXNlKCkgPT09IHVzZXIuZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKVxuICAgICk/LmVuY29kZWRBYnNVcmw7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG59XG4iLCI8IS0tIEluIE1pY3Jvc29mdCBFZGdlLCBzZWxlY3RFbXBsb3llZSgpIG5ldmVyIGdldHMgY2FsbGVkIGlmIHRoZSBpbnB1dCBmaWVsZHMgYXJlIGRpc2FibGVkXG4gIFNvLi4uIEknbSBkeW5hbWljYWxseSBzZXR0aW5nIHRoZSBkaXNhYmxlZCBwcm9wZXJ0eSBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCB0aGUgYnJvd3NlciBpcyBFZGdlLlxuICBJdCdzIGRlZmluaXRlbHkgYSBiZXR0ZXIgZXhwZXJpZW5jZSBpZiB0aGUgZmllbGQgSVMgZGlzYWJsZWQuXG4gIE90aGVyd2lzZSwgaXQncyBjb25mdXNpbmcgLSBlc3BlY2lhbGx5IGJlY2F1c2UgRWRnZSBpcyBTTyBTTE9XIHRvIGRpc3BsYXkgdGhlIHJlc3VsdGluZyBkaWFsb2cgd2luZG93LlxuLS0+XG5cbjxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwiISh1c2VycyAmJiBwaG90b3MpXCIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+XG5cbjxkaXYgKm5nSWY9XCJ1c2VycyAmJiBwaG90b3NcIiAoY2xpY2spPVwic2VsZWN0VXNlcigpXCIgW2NsYXNzLmNsaWNrYWJsZV09XCJjbGlja2FibGVcIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhYWNjb3VudE5hbWVzPy5sZW5ndGhcIj5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZGlzYWJsZWRdPVwiIWlzRWRnZVwiIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiPlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gIFxuICAgIDxkaXYgKm5nSWY9XCJhY2NvdW50TmFtZXM/Lmxlbmd0aFwiXG4gICAgICBbY2xhc3MuZ3JpZF09XCJhY2NvdW50TmFtZXMubGVuZ3RoID4gMVwiXG4gICAgICBbY2xhc3MudGhyZWVdPVwiYWNjb3VudE5hbWVzLmxlbmd0aCA+IDJcIlxuICAgICAgW2NsYXNzLmZvdXJdPVwiYWNjb3VudE5hbWVzLmxlbmd0aCA+IDNcIlxuICAgICAgW2NsYXNzLmZpdmVdPVwiYWNjb3VudE5hbWVzLmxlbmd0aCA+IDRcIj5cblxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYWNjb3VudE5hbWUgb2YgYWNjb3VudE5hbWVzOyBsZXQgaT1pbmRleFwiIGNsYXNzPVwidXNlclwiPlxuICAgICAgICA8IS0tPGltZyAqbmdJZj1cImFjY291bnROYW1lICYmIGVtcFV0aWxzLmdldEVtcGxveWVlKGFjY291bnROYW1lKVwiIGFsdD1cIlwiIFtzcmNdPVwiZW1wVXRpbHMuZ2V0RW1wbG95ZWUoYWNjb3VudE5hbWUpIHwgZW1wbG95ZWVQaG90b1VybDpjYWNoZVNlcnZpY2UucGhvdG9zXCI+LS0+XG4gICAgICAgIDxpbWcgKm5nSWY9XCJnZXRQaG90byhhY2NvdW50TmFtZSlcIiBtYXRMaXN0QXZhdGFyIGFsdD1cIlwiIFtzcmNdPVwiZ2V0UGhvdG8oYWNjb3VudE5hbWUpXCI+XG4gIFxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Rpc2FibGVkXT1cIiFpc0VkZ2VcIiBbcGxhY2Vob2xkZXJdPVwiaSA9PT0gMCA/IHBsYWNlaG9sZGVyIDogJydcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJhY2NvdW50TmFtZSA/IGdldFVzZXIoYWNjb3VudE5hbWUpPy5kaXNwbGF5TmFtZSA6IGFjY291bnROYW1lXCI+XG5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIGFyaWEtbGFiZWw9XCJDbGVhclwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHVuU2VsZWN0VXNlcihhY2NvdW50TmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNsb3NlXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+Il19