@sumaris-net/ngx-components 18.23.49 → 18.23.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/doc/changelog.md +4 -0
  2. package/esm2022/public_api.mjs +2 -1
  3. package/esm2022/src/app/admin/users/users.mjs +25 -22
  4. package/esm2022/src/app/core/account/new-token.form.mjs +12 -9
  5. package/esm2022/src/app/core/account/token.table.mjs +14 -11
  6. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +9 -6
  7. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +8 -5
  8. package/esm2022/src/app/core/form/list/list.form.mjs +8 -5
  9. package/esm2022/src/app/core/form/properties/properties.form.mjs +12 -9
  10. package/esm2022/src/app/core/form/properties/properties.table.mjs +15 -12
  11. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +10 -7
  12. package/esm2022/src/app/core/home/home.mjs +21 -18
  13. package/esm2022/src/app/core/menu/menu.component.mjs +10 -7
  14. package/esm2022/src/app/core/settings/settings.page.mjs +10 -7
  15. package/esm2022/src/app/core/table/column/actions-column.component.mjs +8 -5
  16. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +9 -6
  17. package/esm2022/src/app/core/table/testing/table.testing.mjs +27 -23
  18. package/esm2022/src/app/core/table/testing/table2.testing.mjs +25 -22
  19. package/esm2022/src/app/shared/constants.mjs +3 -1
  20. package/esm2022/src/app/shared/directives/autotooltip.directive.mjs +35 -0
  21. package/esm2022/src/app/shared/directives/directives.module.mjs +33 -4
  22. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +15 -12
  23. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +13 -11
  24. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +4 -2
  25. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +5 -2
  26. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +9 -6
  27. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +15 -4
  28. package/esm2022/src/app/shared/material/chips/chips.module.mjs +5 -2
  29. package/esm2022/src/app/shared/material/chips/material.chips.mjs +14 -12
  30. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +8 -5
  31. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +11 -9
  32. package/esm2022/src/app/social/feed/feed.component.mjs +15 -12
  33. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +11 -8
  34. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +12 -9
  35. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +12 -8
  36. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +12 -9
  37. package/esm2022/src/app/social/user-event/notification/user-event-notification.modal.mjs +9 -6
  38. package/fesm2022/sumaris-net.ngx-components.mjs +194 -89
  39. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  40. package/package.json +1 -1
  41. package/public_api.d.ts +1 -0
  42. package/src/app/admin/users/users.d.ts +1 -0
  43. package/src/app/core/account/new-token.form.d.ts +1 -0
  44. package/src/app/core/account/token.table.d.ts +1 -0
  45. package/src/app/core/form/array/testing/form-array.test.d.ts +1 -0
  46. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +1 -0
  47. package/src/app/core/form/list/list.form.d.ts +1 -0
  48. package/src/app/core/form/properties/properties.form.d.ts +1 -0
  49. package/src/app/core/form/properties/properties.table.d.ts +1 -0
  50. package/src/app/core/form/text-popover/text-popover.component.d.ts +1 -0
  51. package/src/app/core/home/home.d.ts +1 -0
  52. package/src/app/core/menu/menu.component.d.ts +1 -0
  53. package/src/app/core/settings/settings.page.d.ts +1 -0
  54. package/src/app/core/table/column/actions-column.component.d.ts +1 -0
  55. package/src/app/core/table/column/nav-actions-column.component.d.ts +1 -0
  56. package/src/app/core/table/testing/table.testing.d.ts +1 -0
  57. package/src/app/core/table/testing/table2.testing.d.ts +1 -0
  58. package/src/app/shared/constants.d.ts +2 -0
  59. package/src/app/shared/directives/autotooltip.directive.d.ts +14 -0
  60. package/src/app/shared/directives/directives.module.d.ts +4 -3
  61. package/src/app/shared/image/gallery/image-gallery.component.d.ts +1 -0
  62. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +1 -0
  63. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +2 -1
  64. package/src/app/shared/material/boolean/boolean.module.d.ts +2 -1
  65. package/src/app/shared/material/boolean/material.boolean.d.ts +1 -0
  66. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +5 -0
  67. package/src/app/shared/material/chips/chips.module.d.ts +2 -1
  68. package/src/app/shared/material/chips/material.chips.d.ts +1 -0
  69. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +1 -0
  70. package/src/app/shared/storage/storage-explorer.component.d.ts +1 -0
  71. package/src/app/social/feed/feed.component.d.ts +1 -0
  72. package/src/app/social/job/progression/job-progression.icon.d.ts +1 -0
  73. package/src/app/social/job/progression/job-progression.list.d.ts +1 -0
  74. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +1 -0
  75. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +2 -0
  76. package/src/app/social/user-event/notification/user-event-notification.modal.d.ts +1 -0
  77. package/src/assets/manifest.json +1 -1
@@ -1,7 +1,8 @@
1
- import { Component, Input } from '@angular/core';
1
+ import { Component, inject, Input } from '@angular/core';
2
2
  import { AppForm } from '../form/form.class';
3
3
  import { PlatformService } from '../services/platform.service';
4
4
  import { isNilOrBlank, isNotNilOrBlank } from '../../shared/functions';
5
+ import { SHOW_TOOLTIP } from '../../shared/constants';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "../services/validator/user-token.validator";
7
8
  import * as i2 from "../services/account.service";
@@ -13,11 +14,12 @@ import * as i7 from "@angular/material/form-field";
13
14
  import * as i8 from "@angular/material/input";
14
15
  import * as i9 from "@angular/material/icon";
15
16
  import * as i10 from "@angular/material/button";
16
- import * as i11 from "../../shared/material/datetime/material.date";
17
- import * as i12 from "../../shared/material/chips/material.chips";
18
- import * as i13 from "../../shared/directives/autofocus.directive";
19
- import * as i14 from "../../shared/pipes/string.pipes";
20
- import * as i15 from "../../shared/pipes/form.pipes";
17
+ import * as i11 from "@angular/material/tooltip";
18
+ import * as i12 from "../../shared/material/datetime/material.date";
19
+ import * as i13 from "../../shared/material/chips/material.chips";
20
+ import * as i14 from "../../shared/directives/autofocus.directive";
21
+ import * as i15 from "../../shared/pipes/string.pipes";
22
+ import * as i16 from "../../shared/pipes/form.pipes";
21
23
  export class NewTokenForm extends AppForm {
22
24
  validator;
23
25
  accountService;
@@ -28,6 +30,7 @@ export class NewTokenForm extends AppForm {
28
30
  existingNames;
29
31
  mobile;
30
32
  platform;
33
+ showTooltip = inject(SHOW_TOOLTIP);
31
34
  constructor(injector, validator, accountService, cd) {
32
35
  super(injector, validator.getFormGroup());
33
36
  this.validator = validator;
@@ -89,11 +92,11 @@ export class NewTokenForm extends AppForm {
89
92
  this.cd.markForCheck();
90
93
  }
91
94
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NewTokenForm, deps: [{ token: i0.Injector }, { token: i1.UserTokenValidatorService }, { token: i2.AccountService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
92
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: NewTokenForm, selector: "app-new-token-form", inputs: { showScopes: "showScopes", tokenScopes: "tokenScopes", existingNames: "existingNames", mobile: "mobile" }, usesInheritance: true, ngImport: i0, template: "<form class=\"form-container\" [formGroup]=\"form\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-form-field>\n <mat-label>{{ 'ACCOUNT.TOKENS.CREATE.NAME' | translate }}</mat-label>\n <input\n matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"name\"\n autocomplete=\"off\"\n required\n [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n />\n <mat-error *ngIf=\"form.controls.name.hasError('required') && form.controls.name.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"form.controls.name.hasError('notAlreadyExists') && form.controls.name.touched\" translate>\n ACCOUNT.TOKENS.CREATE.NAME_ALREADY_EXISTS\n </mat-error>\n </mat-form-field>\n </ion-col>\n </ion-row>\n @if (showScopes) {\n <ion-row>\n <ion-col>\n <mat-chips-field\n formControlName=\"scopes\"\n appearance=\"fill\"\n chipColor=\"primary\"\n [placeholder]=\"'ACCOUNT.TOKENS.CREATE.SCOPES' | translate\"\n [config]=\"tokenConfig\"\n [mobile]=\"mobile\"\n [debug]=\"false\"\n [required]=\"true\"\n [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n >\n <mat-error *ngIf=\"form.controls.name.hasError('notEmptyArray') && form.controls.name.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-chips-field>\n </ion-col>\n </ion-row>\n }\n <ion-row>\n <ion-col>\n <mat-date-field\n formControlName=\"expirationDate\"\n [placeholder]=\"'ACCOUNT.TOKENS.CREATE.EXPIRATION_DATE' | translate\"\n [mobile]=\"mobile\"\n [required]=\"true\"\n [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n ></mat-date-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <ion-button\n *ngIf=\"form | formGetValue: 'token' | isNilOrBlank; else showToken\"\n [title]=\"'ACCOUNT.TOKENS.CREATE.BTN_GENERATE_TITLE' | translate\"\n (click)=\"generate($event)\"\n [disabled]=\"form.invalid\"\n >\n {{ 'ACCOUNT.TOKENS.CREATE.BTN_GENERATE' | translate }}\n </ion-button>\n <ng-template #showToken>\n <p><b translate>ACCOUNT.TOKENS.CREATE.COPY_HELP</b></p>\n <mat-form-field subscriptSizing=\"dynamic\">\n <textarea\n matInput\n formControlName=\"token\"\n readonly\n style=\"height: auto; background-color: lightgray\"\n rows=\"8\"\n ></textarea>\n <button\n matSuffix\n mat-icon-button\n [title]=\"'ACCOUNT.TOKENS.CREATE.BTN_COPY_TITLE' | translate\"\n (click)=\"copy($event)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n </mat-form-field>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-grid>\n</form>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "directive", type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i11.MatDate, selector: "mat-date-field", inputs: ["formControl", "formControlName", "placeholder", "floatLabel", "mobile", "compact", "autofocus", "clearable", "required", "startDate", "timezone", "datePickerFilter", "appearance", "subscriptSizing", "readonly", "tabindex"] }, { kind: "component", type: i12.MatChipsField, selector: "mat-chips-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "placeholder", "suggestFn", "required", "mobile", "readonly", "clearable", "debounceTime", "displaySeparator", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "autofocus", "config", "i18nPrefix", "noResultMessage", "panelClass", "panelWidth", "disableRipple", "matAutocompletePosition", "itemSize", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "chipColor", "debug", "applyImplicitValue", "dropButtonTitle", "clearButtonTitle", "trimSearchText", "hideRequiredMarker", "colSizes", "separatorKeysCodes", "showChips", "appearance", "subscriptSizing", "class", "filter", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keyup.enter"] }, { kind: "directive", type: i13.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i14.IsNilOrBlankPipe, name: "isNilOrBlank" }, { kind: "pipe", type: i14.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }, { kind: "pipe", type: i15.FormGetValuePipe, name: "formGetValue" }] });
95
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: NewTokenForm, selector: "app-new-token-form", inputs: { showScopes: "showScopes", tokenScopes: "tokenScopes", existingNames: "existingNames", mobile: "mobile" }, usesInheritance: true, ngImport: i0, template: "<form class=\"form-container\" [formGroup]=\"form\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-form-field>\n <mat-label>{{ 'ACCOUNT.TOKENS.CREATE.NAME' | translate }}</mat-label>\n <input\n matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"name\"\n autocomplete=\"off\"\n required\n [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n />\n <mat-error *ngIf=\"form.controls.name.hasError('required') && form.controls.name.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"form.controls.name.hasError('notAlreadyExists') && form.controls.name.touched\" translate>\n ACCOUNT.TOKENS.CREATE.NAME_ALREADY_EXISTS\n </mat-error>\n </mat-form-field>\n </ion-col>\n </ion-row>\n @if (showScopes) {\n <ion-row>\n <ion-col>\n <mat-chips-field\n formControlName=\"scopes\"\n appearance=\"fill\"\n chipColor=\"primary\"\n [placeholder]=\"'ACCOUNT.TOKENS.CREATE.SCOPES' | translate\"\n [config]=\"tokenConfig\"\n [mobile]=\"mobile\"\n [debug]=\"false\"\n [required]=\"true\"\n [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n >\n <mat-error *ngIf=\"form.controls.name.hasError('notEmptyArray') && form.controls.name.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-chips-field>\n </ion-col>\n </ion-row>\n }\n <ion-row>\n <ion-col>\n <mat-date-field\n formControlName=\"expirationDate\"\n [placeholder]=\"'ACCOUNT.TOKENS.CREATE.EXPIRATION_DATE' | translate\"\n [mobile]=\"mobile\"\n [required]=\"true\"\n [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n ></mat-date-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <ion-button\n *ngIf=\"form | formGetValue: 'token' | isNilOrBlank; else showToken\"\n [title]=\"!showTooltip ? ('ACCOUNT.TOKENS.CREATE.BTN_GENERATE_TITLE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('ACCOUNT.TOKENS.CREATE.BTN_GENERATE_TITLE' | translate) : ''\"\n (click)=\"generate($event)\"\n [disabled]=\"form.invalid\"\n >\n {{ 'ACCOUNT.TOKENS.CREATE.BTN_GENERATE' | translate }}\n </ion-button>\n <ng-template #showToken>\n <p><b translate>ACCOUNT.TOKENS.CREATE.COPY_HELP</b></p>\n <mat-form-field subscriptSizing=\"dynamic\">\n <textarea\n matInput\n formControlName=\"token\"\n readonly\n style=\"height: auto; background-color: lightgray\"\n rows=\"8\"\n ></textarea>\n <button\n matSuffix\n mat-icon-button\n [title]=\"!showTooltip ? ('ACCOUNT.TOKENS.CREATE.BTN_COPY_TITLE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('ACCOUNT.TOKENS.CREATE.BTN_COPY_TITLE' | translate) : ''\"\n (click)=\"copy($event)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n </mat-form-field>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-grid>\n</form>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "directive", type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i12.MatDate, selector: "mat-date-field", inputs: ["formControl", "formControlName", "placeholder", "floatLabel", "mobile", "compact", "autofocus", "clearable", "required", "startDate", "timezone", "datePickerFilter", "appearance", "subscriptSizing", "readonly", "tabindex"] }, { kind: "component", type: i13.MatChipsField, selector: "mat-chips-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "placeholder", "suggestFn", "required", "mobile", "readonly", "clearable", "debounceTime", "displaySeparator", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "autofocus", "config", "i18nPrefix", "noResultMessage", "panelClass", "panelWidth", "disableRipple", "matAutocompletePosition", "itemSize", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "chipColor", "debug", "applyImplicitValue", "dropButtonTitle", "clearButtonTitle", "trimSearchText", "hideRequiredMarker", "colSizes", "separatorKeysCodes", "showChips", "appearance", "subscriptSizing", "class", "filter", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keyup.enter"] }, { kind: "directive", type: i14.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i15.IsNilOrBlankPipe, name: "isNilOrBlank" }, { kind: "pipe", type: i15.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }, { kind: "pipe", type: i16.FormGetValuePipe, name: "formGetValue" }] });
93
96
  }
94
97
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NewTokenForm, decorators: [{
95
98
  type: Component,
96
- args: [{ selector: 'app-new-token-form', template: "<form class=\"form-container\" [formGroup]=\"form\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-form-field>\n <mat-label>{{ 'ACCOUNT.TOKENS.CREATE.NAME' | translate }}</mat-label>\n <input\n matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"name\"\n autocomplete=\"off\"\n required\n [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n />\n <mat-error *ngIf=\"form.controls.name.hasError('required') && form.controls.name.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"form.controls.name.hasError('notAlreadyExists') && form.controls.name.touched\" translate>\n ACCOUNT.TOKENS.CREATE.NAME_ALREADY_EXISTS\n </mat-error>\n </mat-form-field>\n </ion-col>\n </ion-row>\n @if (showScopes) {\n <ion-row>\n <ion-col>\n <mat-chips-field\n formControlName=\"scopes\"\n appearance=\"fill\"\n chipColor=\"primary\"\n [placeholder]=\"'ACCOUNT.TOKENS.CREATE.SCOPES' | translate\"\n [config]=\"tokenConfig\"\n [mobile]=\"mobile\"\n [debug]=\"false\"\n [required]=\"true\"\n [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n >\n <mat-error *ngIf=\"form.controls.name.hasError('notEmptyArray') && form.controls.name.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-chips-field>\n </ion-col>\n </ion-row>\n }\n <ion-row>\n <ion-col>\n <mat-date-field\n formControlName=\"expirationDate\"\n [placeholder]=\"'ACCOUNT.TOKENS.CREATE.EXPIRATION_DATE' | translate\"\n [mobile]=\"mobile\"\n [required]=\"true\"\n [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n ></mat-date-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <ion-button\n *ngIf=\"form | formGetValue: 'token' | isNilOrBlank; else showToken\"\n [title]=\"'ACCOUNT.TOKENS.CREATE.BTN_GENERATE_TITLE' | translate\"\n (click)=\"generate($event)\"\n [disabled]=\"form.invalid\"\n >\n {{ 'ACCOUNT.TOKENS.CREATE.BTN_GENERATE' | translate }}\n </ion-button>\n <ng-template #showToken>\n <p><b translate>ACCOUNT.TOKENS.CREATE.COPY_HELP</b></p>\n <mat-form-field subscriptSizing=\"dynamic\">\n <textarea\n matInput\n formControlName=\"token\"\n readonly\n style=\"height: auto; background-color: lightgray\"\n rows=\"8\"\n ></textarea>\n <button\n matSuffix\n mat-icon-button\n [title]=\"'ACCOUNT.TOKENS.CREATE.BTN_COPY_TITLE' | translate\"\n (click)=\"copy($event)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n </mat-form-field>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-grid>\n</form>\n" }]
99
+ args: [{ selector: 'app-new-token-form', template: "<form class=\"form-container\" [formGroup]=\"form\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-form-field>\n <mat-label>{{ 'ACCOUNT.TOKENS.CREATE.NAME' | translate }}</mat-label>\n <input\n matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"name\"\n autocomplete=\"off\"\n required\n [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n />\n <mat-error *ngIf=\"form.controls.name.hasError('required') && form.controls.name.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"form.controls.name.hasError('notAlreadyExists') && form.controls.name.touched\" translate>\n ACCOUNT.TOKENS.CREATE.NAME_ALREADY_EXISTS\n </mat-error>\n </mat-form-field>\n </ion-col>\n </ion-row>\n @if (showScopes) {\n <ion-row>\n <ion-col>\n <mat-chips-field\n formControlName=\"scopes\"\n appearance=\"fill\"\n chipColor=\"primary\"\n [placeholder]=\"'ACCOUNT.TOKENS.CREATE.SCOPES' | translate\"\n [config]=\"tokenConfig\"\n [mobile]=\"mobile\"\n [debug]=\"false\"\n [required]=\"true\"\n [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n >\n <mat-error *ngIf=\"form.controls.name.hasError('notEmptyArray') && form.controls.name.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-chips-field>\n </ion-col>\n </ion-row>\n }\n <ion-row>\n <ion-col>\n <mat-date-field\n formControlName=\"expirationDate\"\n [placeholder]=\"'ACCOUNT.TOKENS.CREATE.EXPIRATION_DATE' | translate\"\n [mobile]=\"mobile\"\n [required]=\"true\"\n [readonly]=\"form | formGetValue: 'token' | isNotNilOrBlank\"\n ></mat-date-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <ion-button\n *ngIf=\"form | formGetValue: 'token' | isNilOrBlank; else showToken\"\n [title]=\"!showTooltip ? ('ACCOUNT.TOKENS.CREATE.BTN_GENERATE_TITLE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('ACCOUNT.TOKENS.CREATE.BTN_GENERATE_TITLE' | translate) : ''\"\n (click)=\"generate($event)\"\n [disabled]=\"form.invalid\"\n >\n {{ 'ACCOUNT.TOKENS.CREATE.BTN_GENERATE' | translate }}\n </ion-button>\n <ng-template #showToken>\n <p><b translate>ACCOUNT.TOKENS.CREATE.COPY_HELP</b></p>\n <mat-form-field subscriptSizing=\"dynamic\">\n <textarea\n matInput\n formControlName=\"token\"\n readonly\n style=\"height: auto; background-color: lightgray\"\n rows=\"8\"\n ></textarea>\n <button\n matSuffix\n mat-icon-button\n [title]=\"!showTooltip ? ('ACCOUNT.TOKENS.CREATE.BTN_COPY_TITLE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('ACCOUNT.TOKENS.CREATE.BTN_COPY_TITLE' | translate) : ''\"\n (click)=\"copy($event)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n </mat-form-field>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-grid>\n</form>\n" }]
97
100
  }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.UserTokenValidatorService }, { type: i2.AccountService }, { type: i0.ChangeDetectorRef }], propDecorators: { showScopes: [{
98
101
  type: Input
99
102
  }], tokenScopes: [{
@@ -103,4 +106,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
103
106
  }], mobile: [{
104
107
  type: Input
105
108
  }] } });
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXRva2VuLmZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvYWNjb3VudC9uZXctdG9rZW4uZm9ybS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9hY2NvdW50L25ldy10b2tlbi5mb3JtLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFxQixTQUFTLEVBQVksS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBR3RGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNdkUsTUFBTSxPQUFPLFlBQWEsU0FBUSxPQUFrQjtJQVd0QztJQUNBO0lBQ0E7SUFaRixXQUFXLENBQTZCO0lBQ3pDLFVBQVUsQ0FBVTtJQUNwQixXQUFXLENBQWU7SUFDMUIsYUFBYSxDQUFXO0lBQ3hCLE1BQU0sQ0FBVTtJQUVSLFFBQVEsQ0FBa0I7SUFFM0MsWUFDRSxRQUFrQixFQUNSLFNBQW9DLEVBQ3BDLGNBQThCLEVBQzlCLEVBQXFCO1FBRS9CLEtBQUssQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFKaEMsY0FBUyxHQUFULFNBQVMsQ0FBMkI7UUFDcEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBRy9CLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxLQUFLLENBQUMsS0FBSyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtB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ZW5TY29wZSwgVXNlclRva2VuIH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvdG9rZW4ubW9kZWwnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5qZWN0b3IsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVzZXJUb2tlblZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy92YWxpZGF0b3IvdXNlci10b2tlbi52YWxpZGF0b3InO1xuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWcgfSBmcm9tICcuLi8uLi9zaGFyZWQvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL21hdGVyaWFsLmF1dG9jb21wbGV0ZS5jb25maWcnO1xuaW1wb3J0IHsgQXBwRm9ybSB9IGZyb20gJy4uL2Zvcm0vZm9ybS5jbGFzcyc7XG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IGlzTmlsT3JCbGFuaywgaXNOb3ROaWxPckJsYW5rIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1uZXctdG9rZW4tZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZXctdG9rZW4uZm9ybS5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgTmV3VG9rZW5Gb3JtIGV4dGVuZHMgQXBwRm9ybTxVc2VyVG9rZW4+IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJvdGVjdGVkIHRva2VuQ29uZmlnOiBNYXRBdXRvY29tcGxldGVGaWVsZENvbmZpZztcbiAgQElucHV0KCkgc2hvd1Njb3BlczogYm9vbGVhbjtcbiAgQElucHV0KCkgdG9rZW5TY29wZXM6IFRva2VuU2NvcGVbXTtcbiAgQElucHV0KCkgZXhpc3RpbmdOYW1lczogc3RyaW5nW107XG4gIEBJbnB1dCgpIG1vYmlsZTogYm9vbGVhbjtcblxuICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtOiBQbGF0Zm9ybVNlcnZpY2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCB2YWxpZGF0b3I6IFVzZXJUb2tlblZhbGlkYXRvclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHN1cGVyKGluamVjdG9yLCB2YWxpZGF0b3IuZ2V0Rm9ybUdyb3VwKCkpO1xuICAgIHRoaXMucGxhdGZvcm0gPSBpbmplY3Rvci5nZXQoUGxhdGZvcm1TZXJ2aWNlKTtcbiAgfVxuXG4gIGdldCB2YWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIudmFsaWQgJiYgaXNOb3ROaWxPckJsYW5rKHRoaXMudmFsdWU/LnRva2VuKTtcbiAgfVxuXG4gIGdldCBpbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5pbnZhbGlkIHx8IGlzTmlsT3JCbGFuayh0aGlzLnZhbHVlPy50b2tlbik7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgdGhpcy50b2tlbkNvbmZpZyA9IHtcbiAgICAgIGl0ZW1zOiB0aGlzLnRva2VuU2NvcGVzLnNsaWNlKCkubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICB2YWx1ZS5uYW1lID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh2YWx1ZS5uYW1lKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSksXG4gICAgICBhdHRyaWJ1dGVzOiBbJ25hbWUnXSxcbiAgICB9O1xuXG4gICAgdGhpcy52YWxpZGF0b3IudXBkYXRlRm9ybUdyb3VwKHRoaXMuZm9ybSwgdGhpcy5leGlzdGluZ05hbWVzKTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlKGV2ZW50OiBVSUV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5hY2NvdW50U2VydmljZS5nZW5lcmF0ZVRva2VuKHRoaXMuZ2V0RmxhZ3ModGhpcy52YWx1ZS5zY29wZXMpKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgdGhpcy5zZXRFcnJvcignTm8gdG9rZW4gZ2VuZXJhdGVkICEnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoeyB0b2tlbiB9KTtcblxuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnNldEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNvcHkoZXZlbnQ6IFVJRXZlbnQpIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgYXdhaXQgdGhpcy5wbGF0Zm9ybS5jb3B5VG9DbGlwYm9hcmQodGhpcy52YWx1ZS50b2tlbiwge1xuICAgICAgbWVzc2FnZTogJ0FDQ09VTlQuVE9LRU5TLkNSRUFURS5DT1BJRUQnLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2V0VmFsdWUoKTogUHJvbWlzZTxVc2VyVG9rZW4+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHN1cGVyLmdldFZhbHVlKCk7XG5cbiAgICAvLyBTZXQgZmxhZ3MgZnJvbSBzY29wZXNcbiAgICB2YWx1ZS5mbGFncyA9IHRoaXMuZ2V0RmxhZ3ModmFsdWUuc2NvcGVzKTtcblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRGbGFncyhzY29wZXM6IFRva2VuU2NvcGVbXSk6IG51bWJlciB7XG4gICAgbGV0IGZsYWdzID0gMDtcbiAgICBzY29wZXMuZm9yRWFjaCgoc2NvcGUpID0+IHtcbiAgICAgIGZsYWdzICs9IHNjb3BlLmZsYWc7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZsYWdzO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8Zm9ybSBjbGFzcz1cImZvcm0tY29udGFpbmVyXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XG4gIDxpb24tZ3JpZCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgPGlvbi1yb3c+XG4gICAgICA8aW9uLWNvbD5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtbGFiZWw+e3sgJ0FDQ09VTlQuVE9LRU5TLkNSRUFURS5OQU1FJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgbWF0SW5wdXRcbiAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbYXV0b2ZvY3VzRGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm5hbWVcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwiZm9ybSB8IGZvcm1HZXRWYWx1ZTogJ3Rva2VuJyB8IGlzTm90TmlsT3JCbGFua1wiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5jb250cm9scy5uYW1lLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIGZvcm0uY29udHJvbHMubmFtZS50b3VjaGVkXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgRVJST1IuRklFTERfUkVRVUlSRURcbiAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5jb250cm9scy5uYW1lLmhhc0Vycm9yKCdub3RBbHJlYWR5RXhpc3RzJykgJiYgZm9ybS5jb250cm9scy5uYW1lLnRvdWNoZWRcIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICBBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuTkFNRV9BTFJFQURZX0VYSVNUU1xuICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgICBAaWYgKHNob3dTY29wZXMpIHtcbiAgICAgIDxpb24tcm93PlxuICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICA8bWF0LWNoaXBzLWZpZWxkXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzY29wZXNcIlxuICAgICAgICAgICAgYXBwZWFyYW5jZT1cImZpbGxcIlxuICAgICAgICAgICAgY2hpcENvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0FDQ09VTlQuVE9LRU5TLkNSRUFURS5TQ09QRVMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtjb25maWddPVwidG9rZW5Db25maWdcIlxuICAgICAgICAgICAgW21vYmlsZV09XCJtb2JpbGVcIlxuICAgICAgICAgICAgW2RlYnVnXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtyZWFkb25seV09XCJmb3JtIHwgZm9ybUdldFZhbHVlOiAndG9rZW4nIHwgaXNOb3ROaWxPckJsYW5rXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5jb250cm9scy5uYW1lLmhhc0Vycm9yKCdub3RFbXB0eUFycmF5JykgJiYgZm9ybS5jb250cm9scy5uYW1lLnRvdWNoZWRcIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICAgIEVSUk9SLkZJRUxEX1JFUVVJUkVEXG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1jaGlwcy1maWVsZD5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgIH1cbiAgICA8aW9uLXJvdz5cbiAgICAgIDxpb24tY29sPlxuICAgICAgICA8bWF0LWRhdGUtZmllbGRcbiAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJleHBpcmF0aW9uRGF0ZVwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuRVhQSVJBVElPTl9EQVRFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW21vYmlsZV09XCJtb2JpbGVcIlxuICAgICAgICAgIFtyZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICBbcmVhZG9ubHldPVwiZm9ybSB8IGZvcm1HZXRWYWx1ZTogJ3Rva2VuJyB8IGlzTm90TmlsT3JCbGFua1wiXG4gICAgICAgID48L21hdC1kYXRlLWZpZWxkPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgICA8aW9uLXJvdz5cbiAgICAgIDxpb24tY29sPlxuICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICpuZ0lmPVwiZm9ybSB8IGZvcm1HZXRWYWx1ZTogJ3Rva2VuJyB8IGlzTmlsT3JCbGFuazsgZWxzZSBzaG93VG9rZW5cIlxuICAgICAgICAgIFt0aXRsZV09XCInQUNDT1VOVC5UT0tFTlMuQ1JFQVRFLkJUTl9HRU5FUkFURV9USVRMRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIChjbGljayk9XCJnZW5lcmF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7ICdBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuQlROX0dFTkVSQVRFJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd1Rva2VuPlxuICAgICAgICAgIDxwPjxiIHRyYW5zbGF0ZT5BQ0NPVU5ULlRPS0VOUy5DUkVBVEUuQ09QWV9IRUxQPC9iPjwvcD5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiPlxuICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRva2VuXCJcbiAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgc3R5bGU9XCJoZWlnaHQ6IGF1dG87IGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheVwiXG4gICAgICAgICAgICAgIHJvd3M9XCI4XCJcbiAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBtYXRTdWZmaXhcbiAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgIFt0aXRsZV09XCInQUNDT1VOVC5UT0tFTlMuQ1JFQVRFLkJUTl9DT1BZX1RJVExFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjb3B5KCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9jb3B5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgPC9pb24tcm93PlxuICA8L2lvbi1ncmlkPlxuPC9mb3JtPlxuIl19
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXRva2VuLmZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvYWNjb3VudC9uZXctdG9rZW4uZm9ybS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9hY2NvdW50L25ldy10b2tlbi5mb3JtLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFxQixTQUFTLEVBQUUsTUFBTSxFQUFZLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUc5RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNdEQsTUFBTSxPQUFPLFlBQWEsU0FBUSxPQUFrQjtJQWF0QztJQUNBO0lBQ0E7SUFkRixXQUFXLENBQTZCO0lBQ3pDLFVBQVUsQ0FBVTtJQUNwQixXQUFXLENBQWU7SUFDMUIsYUFBYSxDQUFXO0lBQ3hCLE1BQU0sQ0FBVTtJQUVSLFFBQVEsQ0FBa0I7SUFFM0MsV0FBVyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUVuQyxZQUNFLFFBQWtCLEVBQ1IsU0FBb0MsRUFDcEMsY0FBOEIsRUFDOUIsRUFBcUI7UUFFL0IsS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUpoQyxjQUFTLEdBQVQsU0FBUyxDQUEyQjtRQUNwQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsT0FBRSxHQUFGLEVBQUUsQ0FBbUI7UUFHL0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FB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LFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUb2tlblNjb3BlLCBVc2VyVG9rZW4gfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC90b2tlbi5tb2RlbCc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBpbmplY3QsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVc2VyVG9rZW5WYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvdmFsaWRhdG9yL3VzZXItdG9rZW4udmFsaWRhdG9yJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21hdGVyaWFsL2F1dG9jb21wbGV0ZS9tYXRlcmlhbC5hdXRvY29tcGxldGUuY29uZmlnJztcbmltcG9ydCB7IEFwcEZvcm0gfSBmcm9tICcuLi9mb3JtL2Zvcm0uY2xhc3MnO1xuaW1wb3J0IHsgQWNjb3VudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgUGxhdGZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcGxhdGZvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBpc05pbE9yQmxhbmssIGlzTm90TmlsT3JCbGFuayB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuXG5pbXBvcnQgeyBTSE9XX1RPT0xUSVAgfSBmcm9tICcuLi8uLi9zaGFyZWQvY29uc3RhbnRzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLW5ldy10b2tlbi1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25ldy10b2tlbi5mb3JtLmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBOZXdUb2tlbkZvcm0gZXh0ZW5kcyBBcHBGb3JtPFVzZXJUb2tlbj4gaW1wbGVtZW50cyBPbkluaXQge1xuICBwcm90ZWN0ZWQgdG9rZW5Db25maWc6IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnO1xuICBASW5wdXQoKSBzaG93U2NvcGVzOiBib29sZWFuO1xuICBASW5wdXQoKSB0b2tlblNjb3BlczogVG9rZW5TY29wZVtdO1xuICBASW5wdXQoKSBleGlzdGluZ05hbWVzOiBzdHJpbmdbXTtcbiAgQElucHV0KCkgbW9iaWxlOiBib29sZWFuO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm06IFBsYXRmb3JtU2VydmljZTtcblxuICBzaG93VG9vbHRpcCA9IGluamVjdChTSE9XX1RPT0xUSVApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdG9yOiBVc2VyVG9rZW5WYWxpZGF0b3JTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgdmFsaWRhdG9yLmdldEZvcm1Hcm91cCgpKTtcbiAgICB0aGlzLnBsYXRmb3JtID0gaW5qZWN0b3IuZ2V0KFBsYXRmb3JtU2VydmljZSk7XG4gIH1cblxuICBnZXQgdmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHN1cGVyLnZhbGlkICYmIGlzTm90TmlsT3JCbGFuayh0aGlzLnZhbHVlPy50b2tlbik7XG4gIH1cblxuICBnZXQgaW52YWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIuaW52YWxpZCB8fCBpc05pbE9yQmxhbmsodGhpcy52YWx1ZT8udG9rZW4pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIHRoaXMudG9rZW5Db25maWcgPSB7XG4gICAgICBpdGVtczogdGhpcy50b2tlblNjb3Blcy5zbGljZSgpLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgdmFsdWUubmFtZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQodmFsdWUubmFtZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0pLFxuICAgICAgYXR0cmlidXRlczogWyduYW1lJ10sXG4gICAgfTtcblxuICAgIHRoaXMudmFsaWRhdG9yLnVwZGF0ZUZvcm1Hcm91cCh0aGlzLmZvcm0sIHRoaXMuZXhpc3RpbmdOYW1lcyk7XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZShldmVudDogVUlFdmVudCkge1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuYWNjb3VudFNlcnZpY2UuZ2VuZXJhdGVUb2tlbih0aGlzLmdldEZsYWdzKHRoaXMudmFsdWUuc2NvcGVzKSk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHRoaXMuc2V0RXJyb3IoJ05vIHRva2VuIGdlbmVyYXRlZCAhJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHsgdG9rZW4gfSk7XG5cbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5zZXRFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjb3B5KGV2ZW50OiBVSUV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGF3YWl0IHRoaXMucGxhdGZvcm0uY29weVRvQ2xpcGJvYXJkKHRoaXMudmFsdWUudG9rZW4sIHtcbiAgICAgIG1lc3NhZ2U6ICdBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuQ09QSUVEJyxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGdldFZhbHVlKCk6IFByb21pc2U8VXNlclRva2VuPiB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBzdXBlci5nZXRWYWx1ZSgpO1xuXG4gICAgLy8gU2V0IGZsYWdzIGZyb20gc2NvcGVzXG4gICAgdmFsdWUuZmxhZ3MgPSB0aGlzLmdldEZsYWdzKHZhbHVlLnNjb3Blcyk7XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0RmxhZ3Moc2NvcGVzOiBUb2tlblNjb3BlW10pOiBudW1iZXIge1xuICAgIGxldCBmbGFncyA9IDA7XG4gICAgc2NvcGVzLmZvckVhY2goKHNjb3BlKSA9PiB7XG4gICAgICBmbGFncyArPSBzY29wZS5mbGFnO1xuICAgIH0pO1xuICAgIHJldHVybiBmbGFncztcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGZvcm0gY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICA8aW9uLWdyaWQgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiPlxuICAgIDxpb24tcm93PlxuICAgICAgPGlvbi1jb2w+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bWF0LWxhYmVsPnt7ICdBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuTkFNRScgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICBbYXBwQXV0b2ZvY3VzXT1cInRydWVcIlxuICAgICAgICAgICAgW2F1dG9mb2N1c0RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cImZvcm0gfCBmb3JtR2V0VmFsdWU6ICd0b2tlbicgfCBpc05vdE5pbE9yQmxhbmtcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMubmFtZS5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiBmb3JtLmNvbnRyb2xzLm5hbWUudG91Y2hlZFwiIHRyYW5zbGF0ZT5cbiAgICAgICAgICAgIEVSUk9SLkZJRUxEX1JFUVVJUkVEXG4gICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMubmFtZS5oYXNFcnJvcignbm90QWxyZWFkeUV4aXN0cycpICYmIGZvcm0uY29udHJvbHMubmFtZS50b3VjaGVkXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgQUNDT1VOVC5UT0tFTlMuQ1JFQVRFLk5BTUVfQUxSRUFEWV9FWElTVFNcbiAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gICAgQGlmIChzaG93U2NvcGVzKSB7XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgPG1hdC1jaGlwcy1maWVsZFxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2NvcGVzXCJcbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJmaWxsXCJcbiAgICAgICAgICAgIGNoaXBDb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuU0NPUEVTJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cInRva2VuQ29uZmlnXCJcbiAgICAgICAgICAgIFttb2JpbGVdPVwibW9iaWxlXCJcbiAgICAgICAgICAgIFtkZWJ1Z109XCJmYWxzZVwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwiZm9ybSB8IGZvcm1HZXRWYWx1ZTogJ3Rva2VuJyB8IGlzTm90TmlsT3JCbGFua1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMubmFtZS5oYXNFcnJvcignbm90RW1wdHlBcnJheScpICYmIGZvcm0uY29udHJvbHMubmFtZS50b3VjaGVkXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICBFUlJPUi5GSUVMRF9SRVFVSVJFRFxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtY2hpcHMtZmllbGQ+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICB9XG4gICAgPGlvbi1yb3c+XG4gICAgICA8aW9uLWNvbD5cbiAgICAgICAgPG1hdC1kYXRlLWZpZWxkXG4gICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZXhwaXJhdGlvbkRhdGVcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInQUNDT1VOVC5UT0tFTlMuQ1JFQVRFLkVYUElSQVRJT05fREFURScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIFttb2JpbGVdPVwibW9iaWxlXCJcbiAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgW3JlYWRvbmx5XT1cImZvcm0gfCBmb3JtR2V0VmFsdWU6ICd0b2tlbicgfCBpc05vdE5pbE9yQmxhbmtcIlxuICAgICAgICA+PC9tYXQtZGF0ZS1maWVsZD5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gICAgPGlvbi1yb3c+XG4gICAgICA8aW9uLWNvbD5cbiAgICAgICAgPGlvbi1idXR0b25cbiAgICAgICAgICAqbmdJZj1cImZvcm0gfCBmb3JtR2V0VmFsdWU6ICd0b2tlbicgfCBpc05pbE9yQmxhbms7IGVsc2Ugc2hvd1Rva2VuXCJcbiAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuQlROX0dFTkVSQVRFX1RJVExFJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoJ0FDQ09VTlQuVE9LRU5TLkNSRUFURS5CVE5fR0VORVJBVEVfVElUTEUnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAoY2xpY2spPVwiZ2VuZXJhdGUoJGV2ZW50KVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyAnQUNDT1VOVC5UT0tFTlMuQ1JFQVRFLkJUTl9HRU5FUkFURScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3Nob3dUb2tlbj5cbiAgICAgICAgICA8cD48YiB0cmFuc2xhdGU+QUNDT1VOVC5UT0tFTlMuQ1JFQVRFLkNPUFlfSEVMUDwvYj48L3A+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIj5cbiAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0b2tlblwiXG4gICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgIHN0eWxlPVwiaGVpZ2h0OiBhdXRvOyBiYWNrZ3JvdW5kLWNvbG9yOiBsaWdodGdyYXlcIlxuICAgICAgICAgICAgICByb3dzPVwiOFwiXG4gICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0U3VmZml4XG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuQlROX0NPUFlfVElUTEUnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwic2hvd1Rvb2x0aXAgPyAoJ0FDQ09VTlQuVE9LRU5TLkNSRUFURS5CVE5fQ09QWV9USVRMRScgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY29weSgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNvbnRlbnRfY29weTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9pb24tY29sPlxuICAgIDwvaW9uLXJvdz5cbiAgPC9pb24tZ3JpZD5cbjwvZm9ybT5cbiJdfQ==
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, Inject, Input, Optional } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, inject, Inject, Input, Optional } from '@angular/core';
2
2
  import { ValidatorService } from '@e-is/ngx-material-table';
3
3
  import { UserTokenValidatorService } from '../services/validator/user-token.validator';
4
4
  import { UserToken } from '../services/model/token.model';
@@ -10,6 +10,7 @@ import { APP_USER_TOKEN_SCOPES } from '../services/account.service';
10
10
  import { NewTokenModal } from './new-token.modal';
11
11
  import { CORE_CONFIG_OPTIONS } from '../services/config/core.config';
12
12
  import { isNotEmptyArray, isNotNilOrBlank } from '../../shared/functions';
13
+ import { SHOW_TOOLTIP } from '../../shared/constants';
13
14
  import * as i0 from "@angular/core";
14
15
  import * as i1 from "@e-is/ngx-material-table";
15
16
  import * as i2 from "../services/config.service";
@@ -23,18 +24,20 @@ import * as i9 from "@angular/material/toolbar";
23
24
  import * as i10 from "@angular/material/icon";
24
25
  import * as i11 from "@angular/material/button";
25
26
  import * as i12 from "@angular/cdk/a11y";
26
- import * as i13 from "../table/column/actions-column.component";
27
- import * as i14 from "../../shared/pipes/property.pipes";
28
- import * as i15 from "../../shared/pipes/date-format.pipe";
29
- import * as i16 from "../../shared/pipes/selection.pipes";
30
- import * as i17 from "../table/table.pipes";
31
- import * as i18 from "../../../environments/environment.class";
27
+ import * as i13 from "@angular/material/tooltip";
28
+ import * as i14 from "../table/column/actions-column.component";
29
+ import * as i15 from "../../shared/pipes/property.pipes";
30
+ import * as i16 from "../../shared/pipes/date-format.pipe";
31
+ import * as i17 from "../../shared/pipes/selection.pipes";
32
+ import * as i18 from "../table/table.pipes";
33
+ import * as i19 from "../../../environments/environment.class";
32
34
  export class UserTokenTable extends AppInMemoryTable {
33
35
  configService;
34
36
  useSticky = false;
35
37
  showScopes = false;
36
38
  defaultScope;
37
39
  tokenScopes;
40
+ showTooltip = inject(SHOW_TOOLTIP);
38
41
  constructor(injector, validatorService, configService, environment, tokenScopes) {
39
42
  super(injector, [...RESERVED_START_COLUMNS, 'name', 'scopes', 'lastUsedDate', 'expirationDate', 'creationDate', ...RESERVED_END_COLUMNS], UserToken, new InMemoryEntitiesService(UserToken, undefined, {
40
43
  filterFnFactory: () => () => true,
@@ -138,12 +141,12 @@ export class UserTokenTable extends AppInMemoryTable {
138
141
  this.defaultScope = config.getProperty(CORE_CONFIG_OPTIONS.DEFAULT_AUTH_API_TOKEN_SCOPE);
139
142
  }
140
143
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserTokenTable, deps: [{ token: i0.Injector }, { token: i1.ValidatorService }, { token: i2.ConfigService }, { token: ENVIRONMENT }, { token: APP_USER_TOKEN_SCOPES, optional: true }], target: i0.ɵɵFactoryTarget.Component });
141
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UserTokenTable, selector: "app-user-token-table", inputs: { useSticky: "useSticky" }, providers: [{ provide: ValidatorService, useClass: UserTokenValidatorService }], usesInheritance: true, ngImport: i0, template: "<mat-toolbar>\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\" [title]=\"'COMMON.BTN_REFRESH' | translate\" (click)=\"emitRefresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n @if (selection | isEmptySelection) {\n <button\n mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"addToken($event)\"\n >\n <mat-icon>add</mat-icon>\n </button>\n } @else {\n <button mat-icon-button [title]=\"'COMMON.BTN_DELETE' | translate\" (click)=\"deleteSelection($event)\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n }\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\"\n >\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"this | isAllSelected\"\n [indeterminate]=\"this | isNotAllSelected\"\n ></mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection | isSelected: row\"\n ></mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"cdk-visually-hidden\">\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"cdk-visually-hidden\">{{ row.currentData.id }}</td>\n </ng-container>\n\n <!-- name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'NAME' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ (row.currentData | propertyGet: 'name') || (i18nColumnPrefix + 'UNKNOWN' | translate) }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"scopes\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'SCOPES' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ display(row.currentData | propertyGet: 'scopes') }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"creationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'CREATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet: 'creationDate' | dateFormat: { time: true } }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"expirationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'EXPIRATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet: 'expirationDate' | dateFormat: { time: true } }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastUsedDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'LAST_USED_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet: 'lastUsedDate' | dateFormat: { time: true } }}\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\"\n ></app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"\n ></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addToken($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".mat-cell-date-time{width:180px}.mat-column-id{width:90px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i4.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i4.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i4.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: i4.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i4.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i7.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i9.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i12.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i13.ActionsColumnComponent, selector: "app-actions-column", inputs: ["matColumnDef", "style", "showPendingSpinner", "stickyEnd", "canCancel", "canConfirm", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplateStart", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmEditCreateClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i14.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i15.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i16.IsSelectedPipe, name: "isSelected" }, { kind: "pipe", type: i16.IsEmptySelectionPipe, name: "isEmptySelection" }, { kind: "pipe", type: i17.IsAllSelectedPipe, name: "isAllSelected" }, { kind: "pipe", type: i17.IsNotAllSelectedPipe, name: "isNotAllSelected" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
144
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: UserTokenTable, selector: "app-user-token-table", inputs: { useSticky: "useSticky" }, providers: [{ provide: ValidatorService, useClass: UserTokenValidatorService }], usesInheritance: true, ngImport: i0, template: "<mat-toolbar>\n <!-- Refresh -->\n <button\n mat-icon-button\n *ngIf=\"!mobile\"\n [title]=\"!showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n (click)=\"emitRefresh()\"\n >\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n @if (selection | isEmptySelection) {\n <button\n mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"addToken($event)\"\n >\n <mat-icon>add</mat-icon>\n </button>\n } @else {\n <button\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n (click)=\"deleteSelection($event)\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n }\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\"\n >\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"this | isAllSelected\"\n [indeterminate]=\"this | isNotAllSelected\"\n ></mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection | isSelected: row\"\n ></mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"cdk-visually-hidden\">\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"cdk-visually-hidden\">{{ row.currentData.id }}</td>\n </ng-container>\n\n <!-- name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'NAME' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ (row.currentData | propertyGet: 'name') || (i18nColumnPrefix + 'UNKNOWN' | translate) }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"scopes\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'SCOPES' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ display(row.currentData | propertyGet: 'scopes') }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"creationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'CREATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet: 'creationDate' | dateFormat: { time: true } }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"expirationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'EXPIRATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet: 'expirationDate' | dateFormat: { time: true } }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastUsedDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'LAST_USED_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet: 'lastUsedDate' | dateFormat: { time: true } }}\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\"\n ></app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"\n ></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addToken($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".mat-cell-date-time{width:180px}.mat-column-id{width:90px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i4.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i4.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "mode", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i4.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: i4.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i4.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i7.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i9.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i12.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: i13.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i14.ActionsColumnComponent, selector: "app-actions-column", inputs: ["matColumnDef", "style", "showPendingSpinner", "stickyEnd", "canCancel", "canConfirm", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplateStart", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmEditCreateClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i15.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i16.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i17.IsSelectedPipe, name: "isSelected" }, { kind: "pipe", type: i17.IsEmptySelectionPipe, name: "isEmptySelection" }, { kind: "pipe", type: i18.IsAllSelectedPipe, name: "isAllSelected" }, { kind: "pipe", type: i18.IsNotAllSelectedPipe, name: "isNotAllSelected" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
142
145
  }
143
146
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserTokenTable, decorators: [{
144
147
  type: Component,
145
- args: [{ selector: 'app-user-token-table', providers: [{ provide: ValidatorService, useClass: UserTokenValidatorService }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-toolbar>\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\" [title]=\"'COMMON.BTN_REFRESH' | translate\" (click)=\"emitRefresh()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n @if (selection | isEmptySelection) {\n <button\n mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"addToken($event)\"\n >\n <mat-icon>add</mat-icon>\n </button>\n } @else {\n <button mat-icon-button [title]=\"'COMMON.BTN_DELETE' | translate\" (click)=\"deleteSelection($event)\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n }\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\"\n >\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"this | isAllSelected\"\n [indeterminate]=\"this | isNotAllSelected\"\n ></mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection | isSelected: row\"\n ></mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"cdk-visually-hidden\">\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"cdk-visually-hidden\">{{ row.currentData.id }}</td>\n </ng-container>\n\n <!-- name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'NAME' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ (row.currentData | propertyGet: 'name') || (i18nColumnPrefix + 'UNKNOWN' | translate) }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"scopes\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'SCOPES' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ display(row.currentData | propertyGet: 'scopes') }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"creationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'CREATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet: 'creationDate' | dateFormat: { time: true } }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"expirationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'EXPIRATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet: 'expirationDate' | dateFormat: { time: true } }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastUsedDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'LAST_USED_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet: 'lastUsedDate' | dateFormat: { time: true } }}\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\"\n ></app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"\n ></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addToken($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".mat-cell-date-time{width:180px}.mat-column-id{width:90px}\n"] }]
146
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.ValidatorService }, { type: i2.ConfigService }, { type: i18.Environment, decorators: [{
148
+ args: [{ selector: 'app-user-token-table', providers: [{ provide: ValidatorService, useClass: UserTokenValidatorService }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-toolbar>\n <!-- Refresh -->\n <button\n mat-icon-button\n *ngIf=\"!mobile\"\n [title]=\"!showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_REFRESH' | translate) : ''\"\n (click)=\"emitRefresh()\"\n >\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n @if (selection | isEmptySelection) {\n <button\n mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"!showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_ADD' | translate) : ''\"\n (click)=\"addToken($event)\"\n >\n <mat-icon>add</mat-icon>\n </button>\n } @else {\n <button\n mat-icon-button\n [title]=\"!showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n [matTooltip]=\"showTooltip ? ('COMMON.BTN_DELETE' | translate) : ''\"\n (click)=\"deleteSelection($event)\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n }\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table\n #table\n mat-table\n matSort\n matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\"\n >\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox\n (change)=\"$event ? masterToggle() : null\"\n [checked]=\"this | isAllSelected\"\n [indeterminate]=\"this | isNotAllSelected\"\n ></mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox\n (click)=\"$event.stopPropagation()\"\n (change)=\"$event ? selection.toggle(row) : null\"\n [checked]=\"selection | isSelected: row\"\n ></mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"cdk-visually-hidden\">\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"cdk-visually-hidden\">{{ row.currentData.id }}</td>\n </ng-container>\n\n <!-- name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'NAME' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ (row.currentData | propertyGet: 'name') || (i18nColumnPrefix + 'UNKNOWN' | translate) }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"scopes\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'SCOPES' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ display(row.currentData | propertyGet: 'scopes') }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"creationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'CREATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet: 'creationDate' | dateFormat: { time: true } }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"expirationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'EXPIRATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet: 'expirationDate' | dateFormat: { time: true } }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastUsedDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'LAST_USED_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet: 'lastUsedDate' | dateFormat: { time: true } }}\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column\n [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\"\n ></app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: displayedColumns\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"\n ></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject | async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n </div>\n</ion-content>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addToken($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".mat-cell-date-time{width:180px}.mat-column-id{width:90px}\n"] }]
149
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.ValidatorService }, { type: i2.ConfigService }, { type: i19.Environment, decorators: [{
147
150
  type: Inject,
148
151
  args: [ENVIRONMENT]
149
152
  }] }, { type: undefined, decorators: [{
@@ -154,4 +157,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
154
157
  }] }], propDecorators: { useSticky: [{
155
158
  type: Input
156
159
  }] } });
157
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4udGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvYWNjb3VudC90b2tlbi50YWJsZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9hY2NvdW50L3Rva2VuLnRhYmxlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVksS0FBSyxFQUFVLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN2RixPQUFPLEVBQWMsU0FBUyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDNUYsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFBb0IsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHcEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTMUUsTUFBTSxPQUFPLGNBQWUsU0FBUSxnQkFBMkI7SUFVakQ7SUFUSCxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRWpCLFVBQVUsR0FBRyxLQUFLLENB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QUFXLGFBQ0MscUJBQXFCOzRGQVpoQyxjQUFjLG1GQUhkLENBQUMsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLHlCQUF5QixFQUFFLENBQUMsaURDbkJqRixzdU1BZ0tBOzs0RkQxSWEsY0FBYztrQkFQMUIsU0FBUzsrQkFDRSxzQkFBc0IsYUFHckIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxtQkFDOUQsdUJBQXVCLENBQUMsTUFBTTs7MEJBYTVDLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMscUJBQXFCO3lDQVhsQyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5qZWN0LCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICdAZS1pcy9uZ3gtbWF0ZXJpYWwtdGFibGUnO1xuaW1wb3J0IHsgVXNlclRva2VuVmFsaWRhdG9yU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3ZhbGlkYXRvci91c2VyLXRva2VuLnZhbGlkYXRvcic7XG5pbXBvcnQgeyBUb2tlblNjb3BlLCBVc2VyVG9rZW4gfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC90b2tlbi5tb2RlbCc7XG5pbXBvcnQgeyBBcHBJbk1lbW9yeVRhYmxlIH0gZnJvbSAnLi4vdGFibGUvbWVtb3J5LXRhYmxlLmNsYXNzJztcbmltcG9ydCB7IFJFU0VSVkVEX0VORF9DT0xVTU5TLCBSRVNFUlZFRF9TVEFSVF9DT0xVTU5TIH0gZnJvbSAnLi4vdGFibGUvdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgSW5NZW1vcnlFbnRpdGllc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IEVudmlyb25tZW50LCBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBBUFBfVVNFUl9UT0tFTl9TQ09QRVMgfSBmcm9tICcuLi9zZXJ2aWNlcy9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSU5ld1Rva2VuT3B0aW9ucywgTmV3VG9rZW5Nb2RhbCB9IGZyb20gJy4vbmV3LXRva2VuLm1vZGFsJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvY29uZmlnLm1vZGVsJztcbmltcG9ydCB7IENPUkVfQ09ORklHX09QVElPTlMgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcvY29yZS5jb25maWcnO1xuaW1wb3J0IHsgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbE9yQmxhbmsgfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXVzZXItdG9rZW4tdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJ3Rva2VuLnRhYmxlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsndG9rZW4udGFibGUuc2NzcyddLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IFZhbGlkYXRvclNlcnZpY2UsIHVzZUNsYXNzOiBVc2VyVG9rZW5WYWxpZGF0b3JTZXJ2aWNlIH1dLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVXNlclRva2VuVGFibGUgZXh0ZW5kcyBBcHBJbk1lbW9yeVRhYmxlPFVzZXJUb2tlbj4gaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB1c2VTdGlja3kgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgc2hvd1Njb3BlcyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgZGVmYXVsdFNjb3BlOiBzdHJpbmc7XG4gIHByb3RlY3RlZCB0b2tlblNjb3BlczogVG9rZW5TY29wZVtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICB2YWxpZGF0b3JTZXJ2aWNlOiBWYWxpZGF0b3JTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9VU0VSX1RPS0VOX1NDT1BFUykgdG9rZW5TY29wZXM6IFRva2VuU2NvcGVbXVxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIGluamVjdG9yLFxuICAgICAgWy4uLlJFU0VSVkVEX1NUQVJUX0NPTFVNTlMsICduYW1lJywgJ3Njb3BlcycsICdsYXN0VXNlZERhdGUnLCAnZXhwaXJhdGlvbkRhdGUnLCAnY3JlYXRpb25EYXRlJywgLi4uUkVTRVJWRURfRU5EX0NPTFVNTlNdLFxuICAgICAgVXNlclRva2VuLFxuICAgICAgbmV3IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlKFVzZXJUb2tlbiwgdW5kZWZpbmVkLCB7XG4gICAgICAgIGZpbHRlckZuRmFjdG9yeTogKCkgPT4gKCkgPT4gdHJ1ZSxcbiAgICAgICAgZXF1YWxzOiBVc2VyVG9rZW4uZXF1YWxzLFxuICAgICAgfSksXG4gICAgICB2YWxpZGF0b3JTZXJ2aWNlXG4gICAgKTtcblxuICAgIHRoaXMudG9rZW5TY29wZXMgPSB0b2tlblNjb3BlcyA/PyBbXTtcbiAgICB0aGlzLmlubGluZUVkaXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLmFsbG93Um93RGV0YWlsID0gZmFsc2U7XG4gICAgdGhpcy5kZWZhdWx0U29ydEJ5ID0gJ2NyZWF0aW9uRGF0ZSc7XG4gICAgdGhpcy5kZWZhdWx0U29ydERpcmVjdGlvbiA9ICdhc2MnO1xuICAgIHRoaXMuaTE4bkNvbHVtblByZWZpeCA9ICdBQ0NPVU5ULlRPS0VOUy5UQUJMRS4nO1xuICAgIHRoaXMuZGVidWcgPSAhZW52aXJvbm1lbnQ/LnByb2R1Y3Rpb247XG5cbiAgICBpZiAoIXRva2VuU2NvcGVzKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIFRva2VuU2NvcGVzIHByb3ZpZGVkLiBQbGVhc2UgcHJvdmlkZSB0aGUgdG9rZW4gQVBQX1VTRVJfVE9LRU5fU0NPUEVTIHdpdGggdmFsaWQgVG9rZW5TY29wZSBhcnJheScpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHRoaXMuY29uZmlnU2VydmljZS5jb25maWcuc3Vic2NyaWJlKChjb25maWcpID0+IHRoaXMub25Db25maWdMb2FkZWQoY29uZmlnKSkpO1xuXG4gICAgdGhpcy5tYXJrQXNSZWFkeSgpO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCk6IFVzZXJUb2tlbltdIHtcbiAgICByZXR1cm4gc3VwZXIudmFsdWUgfHwgW107XG4gIH1cblxuICBzZXQgdmFsdWUoZGF0YTogVXNlclRva2VuW10pIHtcbiAgICBzdXBlci52YWx1ZSA9IGRhdGE7XG4gIH1cblxuICBzZXRWYWx1ZSh2YWx1ZTogVXNlclRva2VuW10sIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIC8vIFNldCBzY29wZXMgZnJvbSBmbGFnc1xuICAgIHZhbHVlPy5mb3JFYWNoKCh1c2VyVG9rZW4pID0+IHtcbiAgICAgIGNvbnN0IHNjb3BlczogVG9rZW5TY29wZVtdID0gW107XG4gICAgICBpZiAodXNlclRva2VuLmZsYWdzKSB7XG4gICAgICAgIHRoaXMudG9rZW5TY29wZXMuZm9yRWFjaCgoc2NvcGUpID0+IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgICAgICAgIGlmICh1c2VyVG9rZW4uZmxhZ3MgJiBzY29wZS5mbGFnKSB7XG4gICAgICAgICAgICBzY29wZXMucHVzaChzY29wZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHVzZXJUb2tlbi5zY29wZXMgPSBzY29wZXM7XG4gICAgfSk7XG5cbiAgICBzdXBlci5zZXRWYWx1ZSh2YWx1ZSwgb3B0cyk7XG4gIH1cblxuICBhc3luYyBhZGRUb2tlbihldmVudDogVUlFdmVudCkge1xuICAgIGlmIChldmVudD8uZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuOyAvLyBBdm9pZCBtdWx0aXBsZSBjYWxsXG5cbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgbmV3VG9rZW4gPSBuZXcgVXNlclRva2VuKCk7XG4gICAgaWYgKGlzTm90TmlsT3JCbGFuayh0aGlzLmRlZmF1bHRTY29wZSkgJiYgaXNOb3RFbXB0eUFycmF5KHRoaXMudG9rZW5TY29wZXMpKSB7XG4gICAgICBjb25zdCBzY29wZSA9IHRoaXMudG9rZW5TY29wZXMuZmluZCgoc2NvcGUpID0+IHNjb3BlLmlkID09PSB0aGlzLmRlZmF1bHRTY29wZSk7XG4gICAgICBpZiAoIXNjb3BlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIlt0b2tlbi10YWJsZV0gQ2Fubm90IGZvdW5kIHRoZSBkZWZhdWx0IHNjb3BlICcke3RoaXMuZGVmYXVsdFNjb3BlfScgaW4gdmFsdWVzIG9mIEFQUF9VU0VSX1RPS0VOX1NDT1BFUyFcIik7XG4gICAgICB9XG4gICAgICBuZXdUb2tlbi5zY29wZXMgPSBzY29wZSA/IFtzY29wZV0gOiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxDdHJsLmNyZWF0ZSh7XG4gICAgICBjb21wb25lbnQ6IE5ld1Rva2VuTW9kYWwsXG4gICAgICBjb21wb25lbnRQcm9wczogPElOZXdUb2tlbk9wdGlvbnM+e1xuICAgICAgICBtb2JpbGU6IHRoaXMubW9iaWxlLFxuICAgICAgICBpc05ldzogdHJ1ZSxcbiAgICAgICAgZGF0YTogbmV3VG9rZW4sXG4gICAgICAgIHNob3dTY29wZXM6IHRoaXMuc2hvd1Njb3BlcyxcbiAgICAgICAgdG9rZW5TY29wZXM6IHRoaXMudG9rZW5TY29wZXMgfHwgW10sXG4gICAgICAgIGV4aXN0aW5nTmFtZXM6IHRoaXMudmFsdWU/Lm1hcCgodikgPT4gdi5uYW1lKSxcbiAgICAgIH0sXG4gICAgICBiYWNrZHJvcERpc21pc3M6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgbW9kYWwucHJlc2VudCgpO1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgbW9kYWwub25EaWREaXNtaXNzKCk7XG5cbiAgICBpZiAoZGF0YT8ubmFtZSkge1xuICAgICAgLy8gQWRkIHRoaXMgdG9rZW4gaW4gdGhlIGxpc3RcbiAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuYWRkUm93VG9UYWJsZSh1bmRlZmluZWQsIHsgZWRpdGluZzogZmFsc2UgfSk7XG4gICAgICByb3cudmFsaWRhdG9yLnBhdGNoVmFsdWUoZGF0YSk7XG5cbiAgICAgIHRoaXMubWFya0FzRGlydHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICAvLyBhc3luYyByZXZvY2F0ZShldmVudDogVUlFdmVudCkge1xuICAvLyAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpIHJldHVybjtcbiAgLy9cbiAgLy8gICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBBbGVydHMuYXNrQ29uZmlybWF0aW9uKHRoaXMuaTE4bkNvbHVtblByZWZpeCArICdDT05GSVJNLlJFVk9DQVRFJywgdGhpcy5hbGVydEN0cmwsIHRoaXMudHJhbnNsYXRlKTtcbiAgLy8gICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICAvL1xuICAvLyAgIGNvbnN0IG5vdyA9IG1vbWVudCgpO1xuICAvLyAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmZvckVhY2gocm93ID0+IHtcbiAgLy8gICAgIHJvdy52YWxpZGF0b3IucGF0Y2hWYWx1ZSh7cmV2b2NhdGlvbkRhdGU6IG5vd30sIHtlbWl0RXZlbnQ6dHJ1ZX0pO1xuICAvLyAgICAgLy8gcm93LnZhbGlkYXRvci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIC8vICAgfSk7XG4gIC8vXG4gIC8vICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgLy8gICAvLyB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gIC8vIH1cblxuICBkaXNwbGF5KHNjb3BlczogVG9rZW5TY29wZVtdKSB7XG4gICAgcmV0dXJuIHNjb3Blcz8ubWFwKCh2YWx1ZSkgPT4gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh2YWx1ZS5uYW1lKSkuam9pbignLCAnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNvbmZpZ0xvYWRlZChjb25maWc6IENvbmZpZ3VyYXRpb24pIHtcbiAgICB0aGlzLnNob3dTY29wZXMgPSBjb25maWcuZ2V0UHJvcGVydHlBc0Jvb2xlYW4oQ09SRV9DT05GSUdfT1BUSU9OUy5BVVRIX0FQSV9UT0tFTl9TQ09QRV9FTkFCTEVEKTtcbiAgICB0aGlzLnNldFNob3dDb2x1bW4oJ3Njb3BlcycsIHRoaXMuc2hvd1Njb3Blcyk7XG4gICAgdGhpcy5kZWZhdWx0U2NvcGUgPSBjb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5ERUZBVUxUX0FVVEhfQVBJX1RPS0VOX1NDT1BFKTtcbiAgfVxufVxuIiwiPG1hdC10b29sYmFyPlxuICA8IS0tIFJlZnJlc2ggLS0+XG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiIW1vYmlsZVwiIFt0aXRsZV09XCInQ09NTU9OLkJUTl9SRUZSRVNIJyB8IHRyYW5zbGF0ZVwiIChjbGljayk9XCJlbWl0UmVmcmVzaCgpXCI+XG4gICAgPG1hdC1pY29uPnJlZnJlc2g8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cblxuICA8aW9uLWl0ZW0gKm5nSWY9XCIhbW9iaWxlICYmIGVycm9yOyBsZXQgZXJyb3JcIiBsaW5lcz1cIm5vbmVcIj5cbiAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICA8aW9uLWxhYmVsIGNvbG9yPVwiZGFuZ2VyXCIgW2lubmVySFRNTF09XCJlcnJvciB8IHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICA8L2lvbi1pdGVtPlxuXG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXNwYWNlclwiPjwvZGl2PlxuXG4gIEBpZiAoc2VsZWN0aW9uIHwgaXNFbXB0eVNlbGVjdGlvbikge1xuICAgIDxidXR0b25cbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgKm5nSWY9XCJjYW5FZGl0ICYmICFtb2JpbGVcIlxuICAgICAgW3RpdGxlXT1cIidDT01NT04uQlROX0FERCcgfCB0cmFuc2xhdGVcIlxuICAgICAgKGNsaWNrKT1cImFkZFRva2VuKCRldmVudClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICB9IEBlbHNlIHtcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fREVMRVRFJyB8IHRyYW5zbGF0ZVwiIChjbGljayk9XCJkZWxldGVTZWxlY3Rpb24oJGV2ZW50KVwiPlxuICAgICAgPG1hdC1pY29uPmRlbGV0ZV9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgfVxuPC9tYXQtdG9vbGJhcj5cblxuPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgPGlvbi1yZWZyZXNoZXIgc2xvdD1cImZpeGVkXCIgKm5nSWY9XCJtb2JpbGVcIiAoaW9uUmVmcmVzaCk9XCJkb1JlZnJlc2goJGV2ZW50KVwiPlxuICAgIDxpb24tcmVmcmVzaGVyLWNvbnRlbnQ+PC9pb24tcmVmcmVzaGVyLWNvbnRlbnQ+XG4gIDwvaW9uLXJlZnJlc2hlcj5cblxuICA8IS0tIHRhYmxlIC0tPlxuICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyXCI+XG4gICAgPHRhYmxlXG4gICAgICAjdGFibGVcbiAgICAgIG1hdC10YWJsZVxuICAgICAgbWF0U29ydFxuICAgICAgbWF0U29ydERpc2FibGVDbGVhclxuICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgICBbbWF0U29ydEFjdGl2ZV09XCJkZWZhdWx0U29ydEJ5XCJcbiAgICAgIFttYXRTb3J0RGlyZWN0aW9uXT1cImRlZmF1bHRTb3J0RGlyZWN0aW9uXCJcbiAgICAgIFt0cmFja0J5XT1cInRyYWNrQnlGblwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIiBbc3RpY2t5XT1cInVzZVN0aWNreVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFjYW5FZGl0XCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwidGhpcyB8IGlzQWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwidGhpcyB8IGlzTm90QWxsU2VsZWN0ZWRcIlxuICAgICAgICAgID48L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFjYW5FZGl0XCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IHNlbGVjdGlvbi50b2dnbGUocm93KSA6IG51bGxcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uIHwgaXNTZWxlY3RlZDogcm93XCJcbiAgICAgICAgICA+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBJZCBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImlkXCIgW3N0aWNreV09XCJ1c2VTdGlja3lcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXIgY2xhc3M9XCJjZGstdmlzdWFsbHktaGlkZGVuXCI+XG4gICAgICAgICAgPGlvbi1sYWJlbD4jPC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cImNkay12aXN1YWxseS1oaWRkZW5cIj57eyByb3cuY3VycmVudERhdGEuaWQgfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gbmFtZSBjb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm5hbWVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1sYWJlbD57eyBpMThuQ29sdW1uUHJlZml4ICsgJ05BTUUnIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICB7eyAocm93LmN1cnJlbnREYXRhIHwgcHJvcGVydHlHZXQ6ICduYW1lJykgfHwgKGkxOG5Db2x1bW5QcmVmaXggKyAnVU5LTk9XTicgfCB0cmFuc2xhdGUpIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzY29wZXNcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1sYWJlbD57eyBpMThuQ29sdW1uUHJlZml4ICsgJ1NDT1BFUycgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgIHt7IGRpc3BsYXkocm93LmN1cnJlbnREYXRhIHwgcHJvcGVydHlHZXQ6ICdzY29wZXMnKSB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiY3JlYXRpb25EYXRlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyIGNsYXNzPVwibWF0LWNlbGwtZGF0ZS10aW1lXCI+XG4gICAgICAgICAgPGlvbi1sYWJlbD57eyBpMThuQ29sdW1uUHJlZml4ICsgJ0NSRUFUSU9OX0RBVEUnIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cIm1hdC1jZWxsLWRhdGUtdGltZVwiPlxuICAgICAgICAgIHt7IHJvdy5jdXJyZW50RGF0YSB8IHByb3BlcnR5R2V0OiAnY3JlYXRpb25EYXRlJyB8IGRhdGVGb3JtYXQ6IHsgdGltZTogdHJ1ZSB9IH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJleHBpcmF0aW9uRGF0ZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciBjbGFzcz1cIm1hdC1jZWxsLWRhdGUtdGltZVwiPlxuICAgICAgICAgIDxpb24tbGFiZWw+e3sgaTE4bkNvbHVtblByZWZpeCArICdFWFBJUkFUSU9OX0RBVEUnIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cIm1hdC1jZWxsLWRhdGUtdGltZVwiPlxuICAgICAgICAgIHt7IHJvdy5jdXJyZW50RGF0YSB8IHByb3BlcnR5R2V0OiAnZXhwaXJhdGlvbkRhdGUnIHwgZGF0ZUZvcm1hdDogeyB0aW1lOiB0cnVlIH0gfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImxhc3RVc2VkRGF0ZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciBjbGFzcz1cIm1hdC1jZWxsLWRhdGUtdGltZVwiPlxuICAgICAgICAgIDxpb24tbGFiZWw+e3sgaTE4bkNvbHVtblByZWZpeCArICdMQVNUX1VTRURfREFURScgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIGNsYXNzPVwibWF0LWNlbGwtZGF0ZS10aW1lXCI+XG4gICAgICAgICAge3sgcm93LmN1cnJlbnREYXRhIHwgcHJvcGVydHlHZXQ6ICdsYXN0VXNlZERhdGUnIHwgZGF0ZUZvcm1hdDogeyB0aW1lOiB0cnVlIH0gfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIEFjdGlvbnMgYnV0dG9ucyBjb2x1bW4gLS0+XG4gICAgICA8YXBwLWFjdGlvbnMtY29sdW1uXG4gICAgICAgIFtzdGlja3lFbmRdPVwidXNlU3RpY2t5XCJcbiAgICAgICAgKG9wdGlvbnNDbGljayk9XCJvcGVuU2VsZWN0Q29sdW1uc01vZGFsKCRldmVudClcIlxuICAgICAgICAoY2FuY2VsT3JEZWxldGVDbGljayk9XCJjYW5jZWxPckRlbGV0ZSgkZXZlbnQuZXZlbnQsICRldmVudC5yb3cpXCJcbiAgICAgICAgKGNvbmZpcm1BbmRBZGRDbGljayk9XCJjb25maXJtQW5kQWRkKCRldmVudC5ldmVudCwgJGV2ZW50LnJvdylcIlxuICAgICAgICAoYmFja3dhcmQpPVwiY29uZmlybUFuZEJhY2t3YXJkKCRldmVudC5ldmVudCwgJGV2ZW50LnJvdylcIlxuICAgICAgICAoZm9yd2FyZCk9XCJjb25maXJtQW5kRm9yd2FyZCgkZXZlbnQuZXZlbnQsICRldmVudC5yb3cpXCJcbiAgICAgICAgW2NhbkNhbmNlbF09XCJmYWxzZVwiXG4gICAgICA+PC9hcHAtYWN0aW9ucy1jb2x1bW4+XG5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICAgIDx0clxuICAgICAgICBtYXQtcm93XG4gICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCJcbiAgICAgICAgW2NsYXNzLm1hdC1yb3ctc2VsZWN0ZWRdPVwicm93LmVkaXRpbmdcIlxuICAgICAgICBbY2xhc3MubWF0LXJvdy1lcnJvcl09XCJyb3cudmFsaWRhdG9yPy5pbnZhbGlkXCJcbiAgICAgICAgW2NsYXNzLm1hdC1yb3ctZGlydHldPVwicm93LnZhbGlkYXRvcj8uZGlydHlcIlxuICAgICAgICAoY2xpY2spPVwiY2xpY2tSb3coJGV2ZW50LCByb3cpXCJcbiAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImVzY2FwZUVkaXRpbmdSb3coJGV2ZW50KVwiXG4gICAgICAgIFtjZGtUcmFwRm9jdXNdPVwicm93LnZhbGlkYXRvcj8uaW52YWxpZFwiXG4gICAgICA+PC90cj5cbiAgICA8L3RhYmxlPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdTdWJqZWN0IHwgYXN5bmM7IGVsc2Ugbm9SZXN1bHRcIj5cbiAgICAgIDxpb24taXRlbT5cbiAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IGFuaW1hdGVkPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNub1Jlc3VsdD5cbiAgICAgIDxpb24taXRlbSAqbmdJZj1cInRvdGFsUm93Q291bnQgPT09IDBcIj5cbiAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJ0ZXh0LWl0YWxpY1wiIHRyYW5zbGF0ZT5DT01NT04uTk9fUkVTVUxUPC9pb24tdGV4dD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG48L2lvbi1jb250ZW50PlxuXG48aW9uLWZhYiBzbG90PVwiZml4ZWRcIiB2ZXJ0aWNhbD1cImJvdHRvbVwiIGhvcml6b250YWw9XCJlbmRcIiAqbmdJZj1cIm1vYmlsZVwiPlxuICA8aW9uLWZhYi1idXR0b24gY29sb3I9XCJ0ZXJ0aWFyeVwiIChjbGljayk9XCJhZGRUb2tlbigkZXZlbnQpXCI+XG4gICAgPGlvbi1pY29uIG5hbWU9XCJhZGRcIj48L2lvbi1pY29uPlxuICA8L2lvbi1mYWItYnV0dG9uPlxuPC9pb24tZmFiPlxuIl19
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4udGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvYWNjb3VudC90b2tlbi50YWJsZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9hY2NvdW50L3Rva2VuLnRhYmxlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFZLEtBQUssRUFBVSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdkYsT0FBTyxFQUFjLFNBQVMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzVGLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQW9CLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBR3BFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTdEQsTUFBTSxPQUFPLGNBQWUsU0FBUSxnQkFBMkI7SUFZakQ7SUFYSCxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBRWpCLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsWUFBWSxDQUFTO0lBQ3JCLFdBQVcsQ0FBZTtJQUVwQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRW5DLFlBQ0UsUUFBa0IsRUFDbEIsZ0JBQWtDLEVBQ3hCLGFBQTRCLEVBQ2pCLFdBQXdCLEVBQ0YsV0FBeUI7UUFFcEUsS0FBSyxDQUNILFFBQVEsRUFDUixDQUFDLEdBQUcsc0JBQXNCLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLEdBQUcsb0JBQW9CLENBQUMsRUFDeEgsU0FBUyxFQUNULElBQUksdUJBQXVCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRTtZQUNoRCxlQUFlLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSTtZQUNqQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU07U0FDekIsQ0FBQyxFQUNGLGdCQUFnQixDQUNqQixDQUFDO1FBYlEsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFldEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLElBQUksRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLHVCQUF1QixDQUFDO1FBQ2hELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDO1FBRXRDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLHFHQUFxRyxDQUFDLENBQUM7UUFDdEgsQ0FBQztJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXhHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBSSxLQUFLLENBQUMsSUFBaUI7UUFDekIsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFrQixFQUFFLElBQThCO1FBQ3pELHdCQUF3QjtRQUN4QixLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDM0IsTUFBTSxNQUFNLEdBQWlCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDakMsc0NBQXNDO29CQUN0QyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNyQixDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELFNBQVMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBYztRQUMzQixJQUFJLEtBQUssRUFBRSxnQkFBZ0I7WUFBRSxPQUFPLENBQUMsc0JBQXNCO1FBRTNELEtBQUssRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUN4QixLQUFLLEVBQUUsZUFBZSxFQUFFLENBQUM7UUFDekIsTUFBTSxRQUFRLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNqQyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzVFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMvRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyx5R0FBeUcsQ0FBQyxDQUFDO1lBQzFILENBQUM7WUFDRCxRQUFRLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQ3hDLFNBQVMsRUFBRSxhQUFhO1lBQ3hCLGNBQWMsRUFBb0I7Z0JBQ2hDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMzQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFO2dCQUNuQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDOUM7WUFDRCxlQUFlLEVBQUUsS0FBSztTQUN2QixDQUFDLENBQUM7UUFFSCxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN0QixNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFNUMsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDZiw2QkFBNkI7WUFDN0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLEdBQUcsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRS9CLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRCxtQ0FBbUM7SUFDbkMsMENBQTBDO0lBQzFDLEVBQUU7SUFDRixnSUFBZ0k7SUFDaEksNEJBQTRCO0lBQzVCLEVBQUU7SUFDRiwwQkFBMEI7SUFDMUIsNkNBQTZDO0lBQzdDLHlFQUF5RTtJQUN6RSxpREFBaUQ7SUFDakQsUUFBUTtJQUNSLEVBQUU7SUFDRix5QkFBeUI7SUFDekIsMkJBQTJCO0lBQzNCLElBQUk7SUFFSixPQUFPLENBQUMsTUFBb0I7UUFDMUIsT0FBTyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVTLGNBQWMsQ0FBQyxNQUFxQjtRQUM1QyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ2hHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUMzRixDQUFDO3dHQTFJVSxjQUFjLHVHQWFmLFdBQVcsYUFDQyxxQkFBcUI7NEZBZGhDLGNBQWMsbUZBSGQsQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxpRENyQmpGLDhqTkE0S0E7OzRGRHBKYSxjQUFjO2tCQVAxQixTQUFTOytCQUNFLHNCQUFzQixhQUdyQixDQUFDLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSx5QkFBeUIsRUFBRSxDQUFDLG1CQUM5RCx1QkFBdUIsQ0FBQyxNQUFNOzswQkFlNUMsTUFBTTsyQkFBQyxXQUFXOzswQkFDbEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxxQkFBcUI7eUNBYmxDLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBpbmplY3QsIEluamVjdCwgSW5qZWN0b3IsIElucHV0LCBPbkluaXQsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBWYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7IFVzZXJUb2tlblZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy92YWxpZGF0b3IvdXNlci10b2tlbi52YWxpZGF0b3InO1xuaW1wb3J0IHsgVG9rZW5TY29wZSwgVXNlclRva2VuIH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvdG9rZW4ubW9kZWwnO1xuaW1wb3J0IHsgQXBwSW5NZW1vcnlUYWJsZSB9IGZyb20gJy4uL3RhYmxlL21lbW9yeS10YWJsZS5jbGFzcyc7XG5pbXBvcnQgeyBSRVNFUlZFRF9FTkRfQ09MVU1OUywgUkVTRVJWRURfU1RBUlRfQ09MVU1OUyB9IGZyb20gJy4uL3RhYmxlL3RhYmxlLm1vZGVsJztcbmltcG9ydCB7IEluTWVtb3J5RW50aXRpZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL21lbW9yeS1lbnRpdHktc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgQVBQX1VTRVJfVE9LRU5fU0NPUEVTIH0gZnJvbSAnLi4vc2VydmljZXMvYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7IElOZXdUb2tlbk9wdGlvbnMsIE5ld1Rva2VuTW9kYWwgfSBmcm9tICcuL25ldy10b2tlbi5tb2RhbCc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2NvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBDT1JFX0NPTkZJR19PUFRJT05TIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnL2NvcmUuY29uZmlnJztcbmltcG9ydCB7IGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWxPckJsYW5rIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5cbmltcG9ydCB7IFNIT1dfVE9PTFRJUCB9IGZyb20gJy4uLy4uL3NoYXJlZC9jb25zdGFudHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdXNlci10b2tlbi10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAndG9rZW4udGFibGUuaHRtbCcsXG4gIHN0eWxlVXJsczogWyd0b2tlbi50YWJsZS5zY3NzJ10sXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVmFsaWRhdG9yU2VydmljZSwgdXNlQ2xhc3M6IFVzZXJUb2tlblZhbGlkYXRvclNlcnZpY2UgfV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBVc2VyVG9rZW5UYWJsZSBleHRlbmRzIEFwcEluTWVtb3J5VGFibGU8VXNlclRva2VuPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHVzZVN0aWNreSA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBzaG93U2NvcGVzID0gZmFsc2U7XG4gIHByb3RlY3RlZCBkZWZhdWx0U2NvcGU6IHN0cmluZztcbiAgcHJvdGVjdGVkIHRva2VuU2NvcGVzOiBUb2tlblNjb3BlW107XG5cbiAgc2hvd1Rvb2x0aXAgPSBpbmplY3QoU0hPV19UT09MVElQKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgdmFsaWRhdG9yU2VydmljZTogVmFsaWRhdG9yU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfVVNFUl9UT0tFTl9TQ09QRVMpIHRva2VuU2NvcGVzOiBUb2tlblNjb3BlW11cbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBpbmplY3RvcixcbiAgICAgIFsuLi5SRVNFUlZFRF9TVEFSVF9DT0xVTU5TLCAnbmFtZScsICdzY29wZXMnLCAnbGFzdFVzZWREYXRlJywgJ2V4cGlyYXRpb25EYXRlJywgJ2NyZWF0aW9uRGF0ZScsIC4uLlJFU0VSVkVEX0VORF9DT0xVTU5TXSxcbiAgICAgIFVzZXJUb2tlbixcbiAgICAgIG5ldyBJbk1lbW9yeUVudGl0aWVzU2VydmljZShVc2VyVG9rZW4sIHVuZGVmaW5lZCwge1xuICAgICAgICBmaWx0ZXJGbkZhY3Rvcnk6ICgpID0+ICgpID0+IHRydWUsXG4gICAgICAgIGVxdWFsczogVXNlclRva2VuLmVxdWFscyxcbiAgICAgIH0pLFxuICAgICAgdmFsaWRhdG9yU2VydmljZVxuICAgICk7XG5cbiAgICB0aGlzLnRva2VuU2NvcGVzID0gdG9rZW5TY29wZXMgPz8gW107XG4gICAgdGhpcy5pbmxpbmVFZGl0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5hbGxvd1Jvd0RldGFpbCA9IGZhbHNlO1xuICAgIHRoaXMuZGVmYXVsdFNvcnRCeSA9ICdjcmVhdGlvbkRhdGUnO1xuICAgIHRoaXMuZGVmYXVsdFNvcnREaXJlY3Rpb24gPSAnYXNjJztcbiAgICB0aGlzLmkxOG5Db2x1bW5QcmVmaXggPSAnQUNDT1VOVC5UT0tFTlMuVEFCTEUuJztcbiAgICB0aGlzLmRlYnVnID0gIWVudmlyb25tZW50Py5wcm9kdWN0aW9uO1xuXG4gICAgaWYgKCF0b2tlblNjb3Blcykge1xuICAgICAgY29uc29sZS53YXJuKCdObyBUb2tlblNjb3BlcyBwcm92aWRlZC4gUGxlYXNlIHByb3ZpZGUgdGhlIHRva2VuIEFQUF9VU0VSX1RPS0VOX1NDT1BFUyB3aXRoIHZhbGlkIFRva2VuU2NvcGUgYXJyYXknKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YnNjcmliZSgoY29uZmlnKSA9PiB0aGlzLm9uQ29uZmlnTG9hZGVkKGNvbmZpZykpKTtcblxuICAgIHRoaXMubWFya0FzUmVhZHkoKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBVc2VyVG9rZW5bXSB7XG4gICAgcmV0dXJuIHN1cGVyLnZhbHVlIHx8IFtdO1xuICB9XG5cbiAgc2V0IHZhbHVlKGRhdGE6IFVzZXJUb2tlbltdKSB7XG4gICAgc3VwZXIudmFsdWUgPSBkYXRhO1xuICB9XG5cbiAgc2V0VmFsdWUodmFsdWU6IFVzZXJUb2tlbltdLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICAvLyBTZXQgc2NvcGVzIGZyb20gZmxhZ3NcbiAgICB2YWx1ZT8uZm9yRWFjaCgodXNlclRva2VuKSA9PiB7XG4gICAgICBjb25zdCBzY29wZXM6IFRva2VuU2NvcGVbXSA9IFtdO1xuICAgICAgaWYgKHVzZXJUb2tlbi5mbGFncykge1xuICAgICAgICB0aGlzLnRva2VuU2NvcGVzLmZvckVhY2goKHNjb3BlKSA9PiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgICAgICBpZiAodXNlclRva2VuLmZsYWdzICYgc2NvcGUuZmxhZykge1xuICAgICAgICAgICAgc2NvcGVzLnB1c2goc2NvcGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB1c2VyVG9rZW4uc2NvcGVzID0gc2NvcGVzO1xuICAgIH0pO1xuXG4gICAgc3VwZXIuc2V0VmFsdWUodmFsdWUsIG9wdHMpO1xuICB9XG5cbiAgYXN5bmMgYWRkVG9rZW4oZXZlbnQ6IFVJRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjsgLy8gQXZvaWQgbXVsdGlwbGUgY2FsbFxuXG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IG5ld1Rva2VuID0gbmV3IFVzZXJUb2tlbigpO1xuICAgIGlmIChpc05vdE5pbE9yQmxhbmsodGhpcy5kZWZhdWx0U2NvcGUpICYmIGlzTm90RW1wdHlBcnJheSh0aGlzLnRva2VuU2NvcGVzKSkge1xuICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzLnRva2VuU2NvcGVzLmZpbmQoKHNjb3BlKSA9PiBzY29wZS5pZCA9PT0gdGhpcy5kZWZhdWx0U2NvcGUpO1xuICAgICAgaWYgKCFzY29wZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbdG9rZW4tdGFibGVdIENhbm5vdCBmb3VuZCB0aGUgZGVmYXVsdCBzY29wZSAnJHt0aGlzLmRlZmF1bHRTY29wZX0nIGluIHZhbHVlcyBvZiBBUFBfVVNFUl9UT0tFTl9TQ09QRVMhXCIpO1xuICAgICAgfVxuICAgICAgbmV3VG9rZW4uc2NvcGVzID0gc2NvcGUgPyBbc2NvcGVdIDogW107XG4gICAgfVxuXG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xuICAgICAgY29tcG9uZW50OiBOZXdUb2tlbk1vZGFsLFxuICAgICAgY29tcG9uZW50UHJvcHM6IDxJTmV3VG9rZW5PcHRpb25zPntcbiAgICAgICAgbW9iaWxlOiB0aGlzLm1vYmlsZSxcbiAgICAgICAgaXNOZXc6IHRydWUsXG4gICAgICAgIGRhdGE6IG5ld1Rva2VuLFxuICAgICAgICBzaG93U2NvcGVzOiB0aGlzLnNob3dTY29wZXMsXG4gICAgICAgIHRva2VuU2NvcGVzOiB0aGlzLnRva2VuU2NvcGVzIHx8IFtdLFxuICAgICAgICBleGlzdGluZ05hbWVzOiB0aGlzLnZhbHVlPy5tYXAoKHYpID0+IHYubmFtZSksXG4gICAgICB9LFxuICAgICAgYmFja2Ryb3BEaXNtaXNzOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIGF3YWl0IG1vZGFsLnByZXNlbnQoKTtcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IG1vZGFsLm9uRGlkRGlzbWlzcygpO1xuXG4gICAgaWYgKGRhdGE/Lm5hbWUpIHtcbiAgICAgIC8vIEFkZCB0aGlzIHRva2VuIGluIHRoZSBsaXN0XG4gICAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLmFkZFJvd1RvVGFibGUodW5kZWZpbmVkLCB7IGVkaXRpbmc6IGZhbHNlIH0pO1xuICAgICAgcm93LnZhbGlkYXRvci5wYXRjaFZhbHVlKGRhdGEpO1xuXG4gICAgICB0aGlzLm1hcmtBc0RpcnR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gYXN5bmMgcmV2b2NhdGUoZXZlbnQ6IFVJRXZlbnQpIHtcbiAgLy8gICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSByZXR1cm47XG4gIC8vXG4gIC8vICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgQWxlcnRzLmFza0NvbmZpcm1hdGlvbih0aGlzLmkxOG5Db2x1bW5QcmVmaXggKyAnQ09ORklSTS5SRVZPQ0FURScsIHRoaXMuYWxlcnRDdHJsLCB0aGlzLnRyYW5zbGF0ZSk7XG4gIC8vICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcbiAgLy9cbiAgLy8gICBjb25zdCBub3cgPSBtb21lbnQoKTtcbiAgLy8gICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5mb3JFYWNoKHJvdyA9PiB7XG4gIC8vICAgICByb3cudmFsaWRhdG9yLnBhdGNoVmFsdWUoe3Jldm9jYXRpb25EYXRlOiBub3d9LCB7ZW1pdEV2ZW50OnRydWV9KTtcbiAgLy8gICAgIC8vIHJvdy52YWxpZGF0b3IudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAvLyAgIH0pO1xuICAvL1xuICAvLyAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIC8vICAgLy8gdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAvLyB9XG5cbiAgZGlzcGxheShzY29wZXM6IFRva2VuU2NvcGVbXSkge1xuICAgIHJldHVybiBzY29wZXM/Lm1hcCgodmFsdWUpID0+IHRoaXMudHJhbnNsYXRlLmluc3RhbnQodmFsdWUubmFtZSkpLmpvaW4oJywgJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Db25maWdMb2FkZWQoY29uZmlnOiBDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5zaG93U2NvcGVzID0gY29uZmlnLmdldFByb3BlcnR5QXNCb29sZWFuKENPUkVfQ09ORklHX09QVElPTlMuQVVUSF9BUElfVE9LRU5fU0NPUEVfRU5BQkxFRCk7XG4gICAgdGhpcy5zZXRTaG93Q29sdW1uKCdzY29wZXMnLCB0aGlzLnNob3dTY29wZXMpO1xuICAgIHRoaXMuZGVmYXVsdFNjb3BlID0gY29uZmlnLmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuREVGQVVMVF9BVVRIX0FQSV9UT0tFTl9TQ09QRSk7XG4gIH1cbn1cbiIsIjxtYXQtdG9vbGJhcj5cbiAgPCEtLSBSZWZyZXNoIC0tPlxuICA8YnV0dG9uXG4gICAgbWF0LWljb24tYnV0dG9uXG4gICAgKm5nSWY9XCIhbW9iaWxlXCJcbiAgICBbdGl0bGVdPVwiIXNob3dUb29sdGlwID8gKCdDT01NT04uQlROX1JFRlJFU0gnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9SRUZSRVNIJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgKGNsaWNrKT1cImVtaXRSZWZyZXNoKClcIlxuICA+XG4gICAgPG1hdC1pY29uPnJlZnJlc2g8L21hdC1pY29uPlxuICA8L2J1dHRvbj5cblxuICA8aW9uLWl0ZW0gKm5nSWY9XCIhbW9iaWxlICYmIGVycm9yOyBsZXQgZXJyb3JcIiBsaW5lcz1cIm5vbmVcIj5cbiAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICA8aW9uLWxhYmVsIGNvbG9yPVwiZGFuZ2VyXCIgW2lubmVySFRNTF09XCJlcnJvciB8IHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICA8L2lvbi1pdGVtPlxuXG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXNwYWNlclwiPjwvZGl2PlxuXG4gIEBpZiAoc2VsZWN0aW9uIHwgaXNFbXB0eVNlbGVjdGlvbikge1xuICAgIDxidXR0b25cbiAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgKm5nSWY9XCJjYW5FZGl0ICYmICFtb2JpbGVcIlxuICAgICAgW3RpdGxlXT1cIiFzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9BREQnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgIFttYXRUb29sdGlwXT1cInNob3dUb29sdGlwID8gKCdDT01NT04uQlROX0FERCcgfCB0cmFuc2xhdGUpIDogJydcIlxuICAgICAgKGNsaWNrKT1cImFkZFRva2VuKCRldmVudClcIlxuICAgID5cbiAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICB9IEBlbHNlIHtcbiAgICA8YnV0dG9uXG4gICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgIFt0aXRsZV09XCIhc2hvd1Rvb2x0aXAgPyAoJ0NPTU1PTi5CVE5fREVMRVRFJyB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICBbbWF0VG9vbHRpcF09XCJzaG93VG9vbHRpcCA/ICgnQ09NTU9OLkJUTl9ERUxFVEUnIHwgdHJhbnNsYXRlKSA6ICcnXCJcbiAgICAgIChjbGljayk9XCJkZWxldGVTZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPG1hdC1pY29uPmRlbGV0ZV9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgfVxuPC9tYXQtdG9vbGJhcj5cblxuPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgPGlvbi1yZWZyZXNoZXIgc2xvdD1cImZpeGVkXCIgKm5nSWY9XCJtb2JpbGVcIiAoaW9uUmVmcmVzaCk9XCJkb1JlZnJlc2goJGV2ZW50KVwiPlxuICAgIDxpb24tcmVmcmVzaGVyLWNvbnRlbnQ+PC9pb24tcmVmcmVzaGVyLWNvbnRlbnQ+XG4gIDwvaW9uLXJlZnJlc2hlcj5cblxuICA8IS0tIHRhYmxlIC0tPlxuICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyXCI+XG4gICAgPHRhYmxlXG4gICAgICAjdGFibGVcbiAgICAgIG1hdC10YWJsZVxuICAgICAgbWF0U29ydFxuICAgICAgbWF0U29ydERpc2FibGVDbGVhclxuICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgICBbbWF0U29ydEFjdGl2ZV09XCJkZWZhdWx0U29ydEJ5XCJcbiAgICAgIFttYXRTb3J0RGlyZWN0aW9uXT1cImRlZmF1bHRTb3J0RGlyZWN0aW9uXCJcbiAgICAgIFt0cmFja0J5XT1cInRyYWNrQnlGblwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIiBbc3RpY2t5XT1cInVzZVN0aWNreVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFjYW5FZGl0XCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwidGhpcyB8IGlzQWxsU2VsZWN0ZWRcIlxuICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwidGhpcyB8IGlzTm90QWxsU2VsZWN0ZWRcIlxuICAgICAgICAgID48L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFjYW5FZGl0XCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cIiRldmVudCA/IHNlbGVjdGlvbi50b2dnbGUocm93KSA6IG51bGxcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwic2VsZWN0aW9uIHwgaXNTZWxlY3RlZDogcm93XCJcbiAgICAgICAgICA+PC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBJZCBDb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImlkXCIgW3N0aWNreV09XCJ1c2VTdGlja3lcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXIgY2xhc3M9XCJjZGstdmlzdWFsbHktaGlkZGVuXCI+XG4gICAgICAgICAgPGlvbi1sYWJlbD4jPC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cImNkay12aXN1YWxseS1oaWRkZW5cIj57eyByb3cuY3VycmVudERhdGEuaWQgfX08L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gbmFtZSBjb2x1bW4gLS0+XG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm5hbWVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1sYWJlbD57eyBpMThuQ29sdW1uUHJlZml4ICsgJ05BTUUnIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICB7eyAocm93LmN1cnJlbnREYXRhIHwgcHJvcGVydHlHZXQ6ICduYW1lJykgfHwgKGkxOG5Db2x1bW5QcmVmaXggKyAnVU5LTk9XTicgfCB0cmFuc2xhdGUpIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzY29wZXNcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1sYWJlbD57eyBpMThuQ29sdW1uUHJlZml4ICsgJ1NDT1BFUycgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgIHt7IGRpc3BsYXkocm93LmN1cnJlbnREYXRhIHwgcHJvcGVydHlHZXQ6ICdzY29wZXMnKSB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiY3JlYXRpb25EYXRlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyIGNsYXNzPVwibWF0LWNlbGwtZGF0ZS10aW1lXCI+XG4gICAgICAgICAgPGlvbi1sYWJlbD57eyBpMThuQ29sdW1uUHJlZml4ICsgJ0NSRUFUSU9OX0RBVEUnIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cIm1hdC1jZWxsLWRhdGUtdGltZVwiPlxuICAgICAgICAgIHt7IHJvdy5jdXJyZW50RGF0YSB8IHByb3BlcnR5R2V0OiAnY3JlYXRpb25EYXRlJyB8IGRhdGVGb3JtYXQ6IHsgdGltZTogdHJ1ZSB9IH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJleHBpcmF0aW9uRGF0ZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciBjbGFzcz1cIm1hdC1jZWxsLWRhdGUtdGltZVwiPlxuICAgICAgICAgIDxpb24tbGFiZWw+e3sgaTE4bkNvbHVtblByZWZpeCArICdFWFBJUkFUSU9OX0RBVEUnIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cIm1hdC1jZWxsLWRhdGUtdGltZVwiPlxuICAgICAgICAgIHt7IHJvdy5jdXJyZW50RGF0YSB8IHByb3BlcnR5R2V0OiAnZXhwaXJhdGlvbkRhdGUnIHwgZGF0ZUZvcm1hdDogeyB0aW1lOiB0cnVlIH0gfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImxhc3RVc2VkRGF0ZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciBjbGFzcz1cIm1hdC1jZWxsLWRhdGUtdGltZVwiPlxuICAgICAgICAgIDxpb24tbGFiZWw+e3sgaTE4bkNvbHVtblByZWZpeCArICdMQVNUX1VTRURfREFURScgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIGNsYXNzPVwibWF0LWNlbGwtZGF0ZS10aW1lXCI+XG4gICAgICAgICAge3sgcm93LmN1cnJlbnREYXRhIHwgcHJvcGVydHlHZXQ6ICdsYXN0VXNlZERhdGUnIHwgZGF0ZUZvcm1hdDogeyB0aW1lOiB0cnVlIH0gfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIEFjdGlvbnMgYnV0dG9ucyBjb2x1bW4gLS0+XG4gICAgICA8YXBwLWFjdGlvbnMtY29sdW1uXG4gICAgICAgIFtzdGlja3lFbmRdPVwidXNlU3RpY2t5XCJcbiAgICAgICAgKG9wdGlvbnNDbGljayk9XCJvcGVuU2VsZWN0Q29sdW1uc01vZGFsKCRldmVudClcIlxuICAgICAgICAoY2FuY2VsT3JEZWxldGVDbGljayk9XCJjYW5jZWxPckRlbGV0ZSgkZXZlbnQuZXZlbnQsICRldmVudC5yb3cpXCJcbiAgICAgICAgKGNvbmZpcm1BbmRBZGRDbGljayk9XCJjb25maXJtQW5kQWRkKCRldmVudC5ldmVudCwgJGV2ZW50LnJvdylcIlxuICAgICAgICAoYmFja3dhcmQpPVwiY29uZmlybUFuZEJhY2t3YXJkKCRldmVudC5ldmVudCwgJGV2ZW50LnJvdylcIlxuICAgICAgICAoZm9yd2FyZCk9XCJjb25maXJtQW5kRm9yd2FyZCgkZXZlbnQuZXZlbnQsICRldmVudC5yb3cpXCJcbiAgICAgICAgW2NhbkNhbmNlbF09XCJmYWxzZVwiXG4gICAgICA+PC9hcHAtYWN0aW9ucy1jb2x1bW4+XG5cbiAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uczsgc3RpY2t5OiB0cnVlXCI+PC90cj5cbiAgICAgIDx0clxuICAgICAgICBtYXQtcm93XG4gICAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCJcbiAgICAgICAgW2NsYXNzLm1hdC1yb3ctc2VsZWN0ZWRdPVwicm93LmVkaXRpbmdcIlxuICAgICAgICBbY2xhc3MubWF0LXJvdy1lcnJvcl09XCJyb3cudmFsaWRhdG9yPy5pbnZhbGlkXCJcbiAgICAgICAgW2NsYXNzLm1hdC1yb3ctZGlydHldPVwicm93LnZhbGlkYXRvcj8uZGlydHlcIlxuICAgICAgICAoY2xpY2spPVwiY2xpY2tSb3coJGV2ZW50LCByb3cpXCJcbiAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImVzY2FwZUVkaXRpbmdSb3coJGV2ZW50KVwiXG4gICAgICAgIFtjZGtUcmFwRm9jdXNdPVwicm93LnZhbGlkYXRvcj8uaW52YWxpZFwiXG4gICAgICA+PC90cj5cbiAgICA8L3RhYmxlPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdTdWJqZWN0IHwgYXN5bmM7IGVsc2Ugbm9SZXN1bHRcIj5cbiAgICAgIDxpb24taXRlbT5cbiAgICAgICAgPGlvbi1za2VsZXRvbi10ZXh0IGFuaW1hdGVkPjwvaW9uLXNrZWxldG9uLXRleHQ+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLXRlbXBsYXRlICNub1Jlc3VsdD5cbiAgICAgIDxpb24taXRlbSAqbmdJZj1cInRvdGFsUm93Q291bnQgPT09IDBcIj5cbiAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJ0ZXh0LWl0YWxpY1wiIHRyYW5zbGF0ZT5DT01NT04uTk9fUkVTVUxUPC9pb24tdGV4dD5cbiAgICAgIDwvaW9uLWl0ZW0+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG48L2lvbi1jb250ZW50PlxuXG48aW9uLWZhYiBzbG90PVwiZml4ZWRcIiB2ZXJ0aWNhbD1cImJvdHRvbVwiIGhvcml6b250YWw9XCJlbmRcIiAqbmdJZj1cIm1vYmlsZVwiPlxuICA8aW9uLWZhYi1idXR0b24gY29sb3I9XCJ0ZXJ0aWFyeVwiIChjbGljayk9XCJhZGRUb2tlbigkZXZlbnQpXCI+XG4gICAgPGlvbi1pY29uIG5hbWU9XCJhZGRcIj48L2lvbi1pY29uPlxuICA8L2lvbi1mYWItYnV0dG9uPlxuPC9pb24tZmFiPlxuIl19