@sumaris-net/ngx-components 18.0.1 → 18.0.2-alpha2

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 (76) hide show
  1. package/esm2022/public_api.mjs +3 -2
  2. package/esm2022/src/app/admin/services/filter/person.filter.mjs +10 -3
  3. package/esm2022/src/app/admin/services/person.service.mjs +6 -3
  4. package/esm2022/src/app/admin/users/users.mjs +2 -2
  5. package/esm2022/src/app/core/account/account.page.mjs +3 -5
  6. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +3 -3
  7. package/esm2022/src/app/core/form/properties/properties.form.mjs +69 -47
  8. package/esm2022/src/app/core/form/properties/properties.utils.mjs +186 -23
  9. package/esm2022/src/app/core/form/properties/property.validator.mjs +36 -4
  10. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +25 -11
  11. package/esm2022/src/app/core/home/home.module.mjs +2 -2
  12. package/esm2022/src/app/core/menu/menu.module.mjs +2 -2
  13. package/esm2022/src/app/core/register/register.form.mjs +1 -1
  14. package/esm2022/src/app/core/services/local-settings.service.mjs +17 -8
  15. package/esm2022/src/app/core/services/model/settings.model.mjs +1 -1
  16. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +4 -24
  17. package/esm2022/src/app/core/settings/settings.page.mjs +44 -13
  18. package/esm2022/src/app/core/table/column/row-field.component.mjs +1 -1
  19. package/esm2022/src/app/core/table/testing/table.testing.mjs +1 -1
  20. package/esm2022/src/app/core/table/testing/table2.testing.mjs +1 -1
  21. package/esm2022/src/app/shared/form/field.component.mjs +15 -8
  22. package/esm2022/src/app/shared/form/field.model.mjs +1 -1
  23. package/esm2022/src/app/shared/functions.mjs +6 -3
  24. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +2 -2
  25. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +11 -4
  26. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +2 -2
  27. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +1 -1
  28. package/esm2022/src/app/shared/material/chips/chips.module.mjs +2 -2
  29. package/esm2022/src/app/shared/material/chips/material.chips.mjs +4 -3
  30. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +1 -1
  31. package/esm2022/src/app/shared/pipes/property.pipes.mjs +25 -31
  32. package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +71 -0
  33. package/esm2022/src/app/shared/rx-state/rx-state.module.mjs +19 -0
  34. package/esm2022/src/app/shared/services.mjs +11 -3
  35. package/esm2022/src/app/shared/shared.module.mjs +2 -2
  36. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +2 -2
  37. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +2 -2
  38. package/esm2022/src/app/shared/types.mjs +1 -1
  39. package/esm2022/src/app/social/user-event/user-event.module.mjs +2 -2
  40. package/esm2022/src/environments/environment.mjs +3 -6
  41. package/fesm2022/sumaris-net.ngx-components.mjs +519 -176
  42. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  43. package/package.json +1 -1
  44. package/public_api.d.ts +2 -1
  45. package/src/app/admin/services/filter/person.filter.d.ts +1 -0
  46. package/src/app/admin/services/person.service.d.ts +5 -0
  47. package/src/app/core/form/properties/properties.form.d.ts +17 -9
  48. package/src/app/core/form/properties/properties.utils.d.ts +21 -11
  49. package/src/app/core/form/properties/property.validator.d.ts +8 -0
  50. package/src/app/core/form/properties/testing/properties-form.test.d.ts +4 -2
  51. package/src/app/core/home/home.module.d.ts +1 -1
  52. package/src/app/core/menu/menu.module.d.ts +1 -1
  53. package/src/app/core/services/local-settings.service.d.ts +3 -1
  54. package/src/app/core/services/model/settings.model.d.ts +1 -1
  55. package/src/app/core/services/validator/local-settings.validator.d.ts +3 -7
  56. package/src/app/core/settings/settings.page.d.ts +2 -1
  57. package/src/app/shared/form/field.component.d.ts +6 -3
  58. package/src/app/shared/form/field.model.d.ts +2 -0
  59. package/src/app/shared/functions.d.ts +1 -0
  60. package/src/app/shared/image/gallery/image-gallery.module.d.ts +1 -1
  61. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +4 -1
  62. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +1 -1
  63. package/src/app/shared/material/chips/chips.module.d.ts +1 -1
  64. package/src/app/shared/material/chips/material.chips.d.ts +1 -0
  65. package/src/app/shared/pipes/property.pipes.d.ts +2 -8
  66. package/src/app/shared/rx-state/rx-state.decorators.d.ts +7 -0
  67. package/src/app/shared/services.d.ts +2 -0
  68. package/src/app/shared/shared.module.d.ts +1 -1
  69. package/src/app/shared/storage/storage-explorer.module.d.ts +1 -1
  70. package/src/app/shared/toolbar/toolbar.module.d.ts +1 -1
  71. package/src/app/shared/types.d.ts +2 -2
  72. package/src/app/social/user-event/user-event.module.d.ts +1 -1
  73. package/src/assets/i18n/fr.json +3 -1
  74. package/src/assets/manifest.json +1 -1
  75. package/esm2022/src/app/shared/rx-state.module.mjs +0 -19
  76. /package/src/app/shared/{rx-state.module.d.ts → rx-state/rx-state.module.d.ts} +0 -0
@@ -175,7 +175,7 @@ export class RegisterForm {
175
175
  this.form.enable();
176
176
  }
177
177
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: RegisterForm, deps: [{ token: i1.AccountService }, { token: i2.AccountValidatorService }, { token: i3.UntypedFormBuilder }, { token: ENVIRONMENT }, { token: i4.LocalSettingsService }], target: i0.ɵɵFactoryTarget.Component });
178
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: RegisterForm, selector: "app-register-form", outputs: { onCancel: "onCancel", onSubmit: "onSubmit" }, viewQueries: [{ propertyName: "stepper", first: true, predicate: ["stepper"], descendants: true, static: true }], ngImport: i0, template: "<mat-horizontal-stepper linear #stepper=\"matHorizontalStepper\">\n <!-- Step 1: Username -->\n <mat-step [stepControl]=\"forms[0]\" *ngIf=\"forms[0].controls; let controls\">\n <form [formGroup]=\"forms[0]\" class=\"form-container ion-padding\" (keyup.enter)=\"slideNext($event)\">\n <ng-template matStepLabel>{{ 'REGISTER.STEP_EMAIL' | translate }}</ng-template>\n\n <!-- Email -->\n <mat-form-field>\n <mat-label>{{ 'USER.EMAIL' | translate }}</mat-label>\n <input\n matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"email\"\n autocomplete=\"off\"\n required\n />\n <mat-error *ngIf=\"controls.email.hasError('required') && controls.email.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error\n *ngIf=\"controls.email.hasError('email') && !controls.email.hasError('required') && controls.email.touched\"\n >\n <span>{{ 'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}</span>\n </mat-error>\n <mat-error *ngIf=\"controls.email.hasError('availability') && controls.email.touched\" translate>\n REGISTER.ERROR.EMAIL_ALREADY_REGISTERED\n </mat-error>\n </mat-form-field>\n\n <!-- Confirm Email -->\n <mat-form-field>\n <mat-label>{{ 'REGISTER.CONFIRM_EMAIL' | translate }}</mat-label>\n <input matInput autocomplete=\"off\" matFormFieldControl formControlName=\"confirmEmail\" />\n <mat-error *ngIf=\"controls.confirmEmail.hasError('required') && controls.confirmEmail.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.confirmEmail.hasError('equals') && controls.confirmEmail.touched\">\n <span>{{ 'REGISTER.ERROR.NOT_SAME_EMAIL' | translate }}</span>\n </mat-error>\n </mat-form-field>\n </form>\n </mat-step>\n\n <!-- Step 2: Password -->\n <mat-step [stepControl]=\"forms[1]\" *ngIf=\"forms[1].controls; let controls\">\n <form [formGroup]=\"forms[1]\" class=\"form-container ion-padding\" (keyup.enter)=\"slideNext($event)\">\n <ng-template matStepLabel>{{ 'REGISTER.STEP_PASSWORD' | translate }}</ng-template>\n\n <!-- Password -->\n <mat-form-field>\n <mat-label>{{ 'USER.PASSWORD' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"password\"\n autocomplete=\"section-red new-password\"\n [type]=\"showPwd ? 'text' : 'password'\"\n required\n />\n <button matSuffix mat-icon-button type=\"button\" (click)=\"showPwd = !showPwd\" tabindex=\"-1\">\n <mat-icon>{{ showPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-error *ngIf=\"controls.password.hasError('required') && controls.password.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.password.hasError('minlength') && controls.password.touched\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: { requiredLength: 8 } }}</span>\n </mat-error>\n </mat-form-field>\n\n <!-- Confirm password -->\n <mat-form-field>\n <mat-label>{{ 'REGISTER.CONFIRM_PASSWORD' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"confirmPassword\"\n autocomplete=\"section-red new-password\"\n [type]=\"showConfirmPwd ? 'text' : 'password'\"\n required\n />\n <button mat-icon-button matSuffix (click)=\"showConfirmPwd = !showConfirmPwd\" tabindex=\"-1\">\n <mat-icon>{{ showConfirmPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-error *ngIf=\"controls.confirmPassword.hasError('required') && controls.confirmPassword.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.confirmPassword.hasError('equals') && controls.confirmPassword.touched\">\n <span>{{ 'REGISTER.ERROR.NOT_SAME_PASSWORD' | translate }}</span>\n </mat-error>\n </mat-form-field>\n </form>\n </mat-step>\n\n <!-- Step 3: user details -->\n <mat-step [stepControl]=\"forms[2]\" *ngIf=\"forms[2].controls; let controls\">\n <form\n [formGroup]=\"forms[2]\"\n (ngSubmit)=\"doSubmit($event)\"\n class=\"form-container ion-padding\"\n (keyup.enter)=\"doSubmit()\"\n >\n <ng-template matStepLabel>{{ 'REGISTER.STEP_USER_DETAILS' | translate }}</ng-template>\n\n <!-- error -->\n <ion-item *ngIf=\"error && !sending\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <!-- Last name -->\n <mat-form-field>\n <mat-label>{{ 'USER.LAST_NAME' | translate }}</mat-label>\n <input matInput formControlName=\"lastName\" autocomplete=\"section-blue family-name\" required />\n <mat-error *ngIf=\"controls.lastName.hasError('required') && controls.lastName.dirty\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.lastName.hasError('minlength') && controls.lastName.dirty\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: { requiredLength: 2 } }}</span>\n </mat-error>\n </mat-form-field>\n\n <!-- First name -->\n <mat-form-field>\n <mat-label>{{ 'USER.FIRST_NAME' | translate }}</mat-label>\n <input matInput formControlName=\"firstName\" autocomplete=\"section-blue given-name\" required />\n <mat-error *ngIf=\"controls.firstName.hasError('required') && controls.firstName.dirty\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.firstName.hasError('minlength') && controls.firstName.dirty\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: { requiredLength: 2 } }}</span>\n </mat-error>\n </mat-form-field>\n\n <!-- Additional fields -->\n <app-form-field\n *ngFor=\"let field of additionalFields\"\n [definition]=\"field\"\n [formControlName]=\"field.key\"\n [required]=\"true\"\n ></app-form-field>\n </form>\n </mat-step>\n</mat-horizontal-stepper>\n", styles: ["form ion-toolbar.toolbar-buttons .toolbar-content{text-align:right}form ion-toolbar.toolbar-buttons .toolbar-background{border:0;background:inherit!important}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i6.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i6.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "directive", type: i7.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "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: "component", type: i12.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i12.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i12.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i13.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i14.AppFormField, selector: "app-form-field", inputs: ["definition", "required", "readonly", "disabled", "formControl", "formControlName", "placeholder", "compact", "floatLabel", "appearance", "subscriptSizing", "tabindex", "autofocus", "clearable", "chipColor", "class", "debug"], outputs: ["keyup.enter"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }] });
178
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: RegisterForm, selector: "app-register-form", outputs: { onCancel: "onCancel", onSubmit: "onSubmit" }, viewQueries: [{ propertyName: "stepper", first: true, predicate: ["stepper"], descendants: true, static: true }], ngImport: i0, template: "<mat-horizontal-stepper linear #stepper=\"matHorizontalStepper\">\n <!-- Step 1: Username -->\n <mat-step [stepControl]=\"forms[0]\" *ngIf=\"forms[0].controls; let controls\">\n <form [formGroup]=\"forms[0]\" class=\"form-container ion-padding\" (keyup.enter)=\"slideNext($event)\">\n <ng-template matStepLabel>{{ 'REGISTER.STEP_EMAIL' | translate }}</ng-template>\n\n <!-- Email -->\n <mat-form-field>\n <mat-label>{{ 'USER.EMAIL' | translate }}</mat-label>\n <input\n matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"email\"\n autocomplete=\"off\"\n required\n />\n <mat-error *ngIf=\"controls.email.hasError('required') && controls.email.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error\n *ngIf=\"controls.email.hasError('email') && !controls.email.hasError('required') && controls.email.touched\"\n >\n <span>{{ 'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}</span>\n </mat-error>\n <mat-error *ngIf=\"controls.email.hasError('availability') && controls.email.touched\" translate>\n REGISTER.ERROR.EMAIL_ALREADY_REGISTERED\n </mat-error>\n </mat-form-field>\n\n <!-- Confirm Email -->\n <mat-form-field>\n <mat-label>{{ 'REGISTER.CONFIRM_EMAIL' | translate }}</mat-label>\n <input matInput autocomplete=\"off\" matFormFieldControl formControlName=\"confirmEmail\" />\n <mat-error *ngIf=\"controls.confirmEmail.hasError('required') && controls.confirmEmail.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.confirmEmail.hasError('equals') && controls.confirmEmail.touched\">\n <span>{{ 'REGISTER.ERROR.NOT_SAME_EMAIL' | translate }}</span>\n </mat-error>\n </mat-form-field>\n </form>\n </mat-step>\n\n <!-- Step 2: Password -->\n <mat-step [stepControl]=\"forms[1]\" *ngIf=\"forms[1].controls; let controls\">\n <form [formGroup]=\"forms[1]\" class=\"form-container ion-padding\" (keyup.enter)=\"slideNext($event)\">\n <ng-template matStepLabel>{{ 'REGISTER.STEP_PASSWORD' | translate }}</ng-template>\n\n <!-- Password -->\n <mat-form-field>\n <mat-label>{{ 'USER.PASSWORD' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"password\"\n autocomplete=\"section-red new-password\"\n [type]=\"showPwd ? 'text' : 'password'\"\n required\n />\n <button matSuffix mat-icon-button type=\"button\" (click)=\"showPwd = !showPwd\" tabindex=\"-1\">\n <mat-icon>{{ showPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-error *ngIf=\"controls.password.hasError('required') && controls.password.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.password.hasError('minlength') && controls.password.touched\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: { requiredLength: 8 } }}</span>\n </mat-error>\n </mat-form-field>\n\n <!-- Confirm password -->\n <mat-form-field>\n <mat-label>{{ 'REGISTER.CONFIRM_PASSWORD' | translate }}</mat-label>\n <input\n matInput\n formControlName=\"confirmPassword\"\n autocomplete=\"section-red new-password\"\n [type]=\"showConfirmPwd ? 'text' : 'password'\"\n required\n />\n <button mat-icon-button matSuffix (click)=\"showConfirmPwd = !showConfirmPwd\" tabindex=\"-1\">\n <mat-icon>{{ showConfirmPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-error *ngIf=\"controls.confirmPassword.hasError('required') && controls.confirmPassword.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.confirmPassword.hasError('equals') && controls.confirmPassword.touched\">\n <span>{{ 'REGISTER.ERROR.NOT_SAME_PASSWORD' | translate }}</span>\n </mat-error>\n </mat-form-field>\n </form>\n </mat-step>\n\n <!-- Step 3: user details -->\n <mat-step [stepControl]=\"forms[2]\" *ngIf=\"forms[2].controls; let controls\">\n <form\n [formGroup]=\"forms[2]\"\n (ngSubmit)=\"doSubmit($event)\"\n class=\"form-container ion-padding\"\n (keyup.enter)=\"doSubmit()\"\n >\n <ng-template matStepLabel>{{ 'REGISTER.STEP_USER_DETAILS' | translate }}</ng-template>\n\n <!-- error -->\n <ion-item *ngIf=\"error && !sending\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <!-- Last name -->\n <mat-form-field>\n <mat-label>{{ 'USER.LAST_NAME' | translate }}</mat-label>\n <input matInput formControlName=\"lastName\" autocomplete=\"section-blue family-name\" required />\n <mat-error *ngIf=\"controls.lastName.hasError('required') && controls.lastName.dirty\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.lastName.hasError('minlength') && controls.lastName.dirty\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: { requiredLength: 2 } }}</span>\n </mat-error>\n </mat-form-field>\n\n <!-- First name -->\n <mat-form-field>\n <mat-label>{{ 'USER.FIRST_NAME' | translate }}</mat-label>\n <input matInput formControlName=\"firstName\" autocomplete=\"section-blue given-name\" required />\n <mat-error *ngIf=\"controls.firstName.hasError('required') && controls.firstName.dirty\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"controls.firstName.hasError('minlength') && controls.firstName.dirty\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: { requiredLength: 2 } }}</span>\n </mat-error>\n </mat-form-field>\n\n <!-- Additional fields -->\n <app-form-field\n *ngFor=\"let field of additionalFields\"\n [definition]=\"field\"\n [formControlName]=\"field.key\"\n [required]=\"true\"\n ></app-form-field>\n </form>\n </mat-step>\n</mat-horizontal-stepper>\n", styles: ["form ion-toolbar.toolbar-buttons .toolbar-content{text-align:right}form ion-toolbar.toolbar-buttons .toolbar-background{border:0;background:inherit!important}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i6.IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i6.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "directive", type: i7.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "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: "component", type: i12.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i12.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i12.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i13.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i14.AppFormField, selector: "app-form-field", inputs: ["definition", "readonly", "disabled", "formControl", "formControlName", "placeholder", "compact", "required", "hideRequiredMarker", "floatLabel", "label", "appearance", "subscriptSizing", "tabindex", "autofocus", "clearable", "chipColor", "class", "debug"], outputs: ["keyup.enter"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }] });
179
179
  }
180
180
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: RegisterForm, decorators: [{
181
181
  type: Component,
@@ -71,7 +71,7 @@ export class LocalSettingsService extends StartableService {
71
71
  this._optionDefs = Object.values(options?.options || {});
72
72
  this._serializeAsString = options?.serializeAsString || false;
73
73
  this.resetData();
74
- this._debug = !environment.production;
74
+ this._debug = true; // !environment.production;
75
75
  if (this._debug)
76
76
  console.debug('[settings] Creating service');
77
77
  }
@@ -301,13 +301,22 @@ export class LocalSettingsService extends StartableService {
301
301
  get optionDefs() {
302
302
  return this._optionDefs;
303
303
  }
304
- registerOption(def) {
305
- if (this._optionDefs.findIndex((f) => f.key === def.key) !== -1) {
306
- throw new Error(`Additional additional property {${def.key}} already define.`);
304
+ registerOption(def, opts) {
305
+ const index = this._optionDefs.findIndex((f) => f.key === def.key);
306
+ if (index !== -1) {
307
+ if (opts?.replaceIfExists !== true) {
308
+ throw new Error(`Additional additional property {${def.key}} already define.`);
309
+ }
310
+ // Replace existing
311
+ if (this._debug)
312
+ console.debug(`[settings] Updating additional property {${def.key}}`, def);
313
+ this._optionDefs[index] = def;
314
+ }
315
+ else {
316
+ if (this._debug)
317
+ console.debug(`[settings] Adding additional property {${def.key}}`, def);
318
+ this._optionDefs.push(def);
307
319
  }
308
- if (this._debug)
309
- console.debug(`[settings] Adding additional property {${def.key}}`, def);
310
- this._optionDefs.push(def);
311
320
  }
312
321
  registerOptions(defs) {
313
322
  (defs || []).forEach((def) => this.registerOption(def));
@@ -479,4 +488,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
479
488
  type: Inject,
480
489
  args: [APP_LOCAL_SETTINGS_OPTIONS]
481
490
  }] }] });
482
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtc2V0dGluZ3Muc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUkxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckosT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCxPQUFPLEVBQUUsV0FBVyxFQUFlLE1BQU0seUNBQXlDLENBQUM7QUFDbkYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFFL0QsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUVsRixvREFBb0Q7QUFDcEQsTUFBTSxnQkFBZ0Is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RSxDQUFDO2dCQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEUsQ0FBQztZQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsa0NBQWtDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO3VHQXRnQlUsb0JBQW9CLGlHQWdEckIsV0FBVyxhQUNDLGtCQUFrQiw2QkFDbEIsMEJBQTBCOzJHQWxEckMsb0JBQW9CLGNBSG5CLE1BQU07OzJGQUdQLG9CQUFvQjtrQkFKaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtvQkFDbEIsd0RBQXdEO2lCQUN6RDs7MEJBaURJLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsa0JBQWtCOzswQkFDckMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQywwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMb2NhbFNldHRpbmdzLCBPZmZsaW5lRmVhdHVyZSwgVXNhZ2VNb2RlIH0gZnJvbSAnLi9tb2RlbC9zZXR0aW5ncy5tb2RlbCc7XG5pbXBvcnQgeyBQZWVyIH0gZnJvbSAnLi9tb2RlbC9wZWVyLm1vZGVsJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFN0b3JhZ2UgfSBmcm9tICdAaW9uaWMvc3RvcmFnZS1hbmd1bGFyJztcblxuaW1wb3J0IHsgZXF1YWxzLCBnZXRQcm9wZXJ0eUJ5UGF0aCwgaXNFbXB0eUFycmF5LCBpc05pbCwgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbCwgaXNOb3ROaWxPckJsYW5rLCB1bmRlZmluZWRJZk51bGwgfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgRm9ybUZpZWxkRGVmaW5pdGlvbiwgRm9ybUZpZWxkRGVmaW5pdGlvbk1hcCB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTGF0TG9uZ1BhdHRlcm4gfSBmcm9tICcuLi8uLi9zaGFyZWQvbWF0ZXJpYWwvbGF0bG9uZy9sYXRsb25nLnV0aWxzJztcbmltcG9ydCB7IEVOVklST05NRU5ULCBFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBlbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBEYXRlVXRpbHMsIGZyb21EYXRlSVNPU3RyaW5nIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2RhdGVzJztcbmltcG9ydCB7IEhpc3RvcnlQYWdlUmVmZXJlbmNlIH0gZnJvbSAnLi9tb2RlbC9oaXN0b3J5Lm1vZGVsJztcbmltcG9ydCB7IFN0YXJ0YWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RhcnRhYmxlLXNlcnZpY2UuY2xhc3MnO1xuaW1wb3J0IHsgaXNDYXBhY2l0b3IsIGlzTW9iaWxlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3BsYXRmb3Jtcyc7XG5cbmV4cG9ydCBjb25zdCBTRVRUSU5HU19TVE9SQUdFX0tFWSA9ICdzZXR0aW5ncyc7XG5leHBvcnQgY29uc3QgU0VUVElOR1NfVFJBTlNJRU5UX1BST1BFUlRJRVMgPSBbJ21vYmlsZScsICd0b3VjaFVpJyAvKmRlcHJlY2F0ZWQqL107XG5cbi8vIGZpeG1lOiB0aGlzIGNvbnN0YW50IHBvaW50cyB0byBzdGF0aWMgZW52aXJvbm1lbnRcbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IExvY2FsU2V0dGluZ3MgPSB7XG4gIGFjY291bnRJbmhlcml0YW5jZTogdHJ1ZSxcbiAgbG9jYWxlOiBlbnZpcm9ubWVudC5kZWZhdWx0TG9jYWxlLFxuICBsYXRMb25nRm9ybWF0OiBlbnZpcm9ubWVudC5kZWZhdWx0TGF0TG9uZ0Zvcm1hdCB8fCAnRERNTScsXG4gIHBhZ2VIaXN0b3J5TWF4U2l6ZTogMyxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxTZXR0aW5nc09wdGlvbnMge1xuICBzZXJpYWxpemVBc1N0cmluZz86IGJvb2xlYW47IC8vIGZhbHNlIGJ5IGRlZmF1bHRcbiAgb3B0aW9uczogRm9ybUZpZWxkRGVmaW5pdGlvbk1hcDtcbn1cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBBZGRUb1BhZ2VIaXN0b3J5T3B0aW9ucyB7XG4gIHJlbW92ZVBhdGhRdWVyeVBhcmFtcz86IGJvb2xlYW47XG4gIHJlbW92ZVRpdGxlU21hbGxUYWc/OiBib29sZWFuO1xuICBlbWl0RXZlbnQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQVBQX0xPQ0FMX1NFVFRJTkdTID0gbmV3IEluamVjdGlvblRva2VuPFBhcnRpYWw8TG9jYWxTZXR0aW5ncz4+KCdEZWZhdWx0TG9jYWxTZXR0aW5ncycpO1xuZXhwb3J0IGNvbnN0IEFQUF9MT0NBTF9TRVRUSU5HU19PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuPExvY2FsU2V0dGluZ3NPcHRpb25zPignTG9jYWxTZXR0aW5nc09wdGlvbnMnKTtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIC8vZGVwczogW0FQUF9MT0NBTF9TRVRUSU5HUywgQVBQX0xPQ0FMX1NFVFRJTkdTX09QVElPTlNdXG59KVxuZXhwb3J0IGNsYXNzIExvY2FsU2V0dGluZ3NTZXJ2aWNlIGV4dGVuZHMgU3RhcnRhYmxlU2VydmljZTxMb2NhbFNldHRpbmdzPiB7XG4gIG9uQ2hhbmdlID0gbmV3IFN1YmplY3Q8TG9jYWxTZXR0aW5ncz4oKTtcbiAgZGFya01vZGUkID0gdGhpcy5vbkNoYW5nZS5waXBlKG1hcCgoZGF0YSkgPT4gZGF0YT8uZGFya01vZGUgfHwgZmFsc2UpKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25EZWZzOiBGb3JtRmllbGREZWZpbml0aW9uW107XG4gIHByaXZhdGUgcmVhZG9ubHkgX3NlcmlhbGl6ZUFzU3RyaW5nOiBib29sZWFuO1xuICBwcml2YXRlIF8kcGVyc2lzdDogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgZ2V0IHNldHRpbmdzKCk6IExvY2FsU2V0dGluZ3Mge1xuICAgIHJldHVybiB0aGlzLl9kYXRhIHx8IHRoaXMuZGVmYXVsdFNldHRpbmdzO1xuICB9XG5cbiAgZ2V0IGxvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAodGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLmxvY2FsZSkgfHwgdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmcgfHwgdGhpcy50cmFuc2xhdGUuZGVmYXVsdExhbmc7XG4gIH1cblxuICBnZXQgbGF0TG9uZ0Zvcm1hdCgpOiBMYXRMb25nUGF0dGVybiB7XG4gICAgcmV0dXJuICh0aGlzLl9kYXRhICYmIHRoaXMuX2RhdGEubGF0TG9uZ0Zvcm1hdCkgfHwgJ0RETU0nO1xuICB9XG5cbiAgZ2V0IHVzYWdlTW9kZSgpOiBVc2FnZU1vZGUge1xuICAgIHJldHVybiBpc05vdE5pbCh0aGlzLl9kYXRhLnVzYWdlTW9kZSkgPyB0aGlzLl9kYXRhLnVzYWdlTW9kZSA6IGlzQ2FwYWNpdG9yKHdpbmRvdykgfHwgaXNNb2JpbGUod2luZG93KSA/ICdGSUVMRCcgOiAnREVTSyc7XG4gIH1cblxuICBnZXQgbW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05vdE5pbCh0aGlzLl9kYXRhLm1vYmlsZSkgPyB0aGlzLl9kYXRhLm1vYmlsZSA6IGlzTW9iaWxlKHdpbmRvdyk7XG4gIH1cblxuICBzZXQgbW9iaWxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGF0YS5tb2JpbGUgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBwYWdlSGlzdG9yeSgpOiBIaXN0b3J5UGFnZVJlZmVyZW5jZVtdIHtcbiAgICByZXR1cm4gKHRoaXMuX2RhdGEgJiYgdGhpcy5fZGF0YS5wYWdlSGlzdG9yeSkgfHwgW107XG4gIH1cblxuICBnZXQgYWxsb3dEYXJrTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudD8uYWxsb3dEYXJrTW9kZSA9PT0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBpc0RhcmtNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFsbG93RGFya01vZGUgJiYgdGhpcy5fZGF0YT8uZGFya01vZGUgPT09IHRydWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yYWdlOiBTdG9yYWdlLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCByZWFkb25seSBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfTE9DQUxfU0VUVElOR1MpIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFNldHRpbmdzOiBMb2NhbFNldHRpbmdzLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX0xPQ0FMX1NFVFRJTkdTX09QVElPTlMpIG9wdGlvbnM6IExvY2FsU2V0dGluZ3NPcHRpb25zXG4gICkge1xuICAgIHN1cGVyKHBsYXRmb3JtKTtcbiAgICB0aGlzLmRlZmF1bHRTZXR0aW5ncyA9IHsgLi4uREVGQVVMVF9TRVRUSU5HUywgLi4udGhpcy5kZWZhdWx0U2V0dGluZ3MgfTtcblxuICAgIHRoaXMuX29wdGlvbkRlZnMgPSBPYmplY3QudmFsdWVzKG9wdGlvbnM/Lm9wdGlvbnMgfHwge30pO1xuICAgIHRoaXMuX3NlcmlhbGl6ZUFzU3RyaW5nID0gb3B0aW9ucz8uc2VyaWFsaXplQXNTdHJpbmcgfHwgZmFsc2U7XG5cbiAgICB0aGlzLnJlc2V0RGF0YSgpO1xuXG4gICAgdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1tzZXR0aW5nc10gQ3JlYXRpbmcgc2VydmljZScpO1xuICB9XG5cbiAgbmdPblN0YXJ0KCk6IFByb21pc2U8TG9jYWxTZXR0aW5ncz4ge1xuICAgIGNvbnNvbGUuaW5mbygnW3NldHRpbmdzXSBTdGFydGluZyBzZXJ2aWNlLi4uJyk7XG5cbiAgICAvLyBEZWZhdWx0IHZhbHVlXG4gICAgdGhpcy5fZGF0YS5tb2JpbGUgPSB0aGlzLm1vYmlsZTtcbiAgICB0aGlzLl9kYXRhLnVzYWdlTW9kZSA9IHRoaXMudXNhZ2VNb2RlO1xuXG4gICAgLy8gUmVzdG9yaW5nIGxvY2FsIHNldHRpbmdzXG4gICAgcmV0dXJuIHRoaXMucmVzdG9yZUxvY2FsbHkoKTtcbiAgfVxuXG4gIGlzVXNhZ2VNb2RlKG1vZGU6IFVzYWdlTW9kZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnVzYWdlTW9kZSA9PT0gbW9kZTtcbiAgfVxuXG4gIGlzT25GaWVsZE1vZGUodmFsdWU/OiBVc2FnZU1vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHZhbHVlIHx8IHRoaXMudXNhZ2VNb2RlKSA9PT0gJ0ZJRUxEJztcbiAgfVxuXG4gIGFzeW5jIHJlc3RvcmVMb2NhbGx5KCk6IFByb21pc2U8TG9jYWxTZXR0aW5ncyB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBkYXRhID0gdGhpcy5fZGF0YSB8fCA8TG9jYWxTZXR0aW5ncz57fTtcblxuICAgIC8vIFJlc3RvcmUgZnJvbSBzdG9yYWdlXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBhd2FpdCB0aGlzLnN0b3JhZ2UuZ2V0KFNFVFRJTkdTX1NUT1JBR0VfS0VZKTtcblxuICAgIC8vIFJlc3RvcmUgbG9jYWwgc2V0dGluZ3MgKG9yIGtlZXAgb2xkIHNldHRpbmdzKVxuICAgIGlmIChpc05vdE5pbChzZXR0aW5ncykpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW3NldHRpbmdzXSBSZXN0b3JpbmcgcHJldmlvdXMgc2V0dGluZ3MuLi4nKTtcblxuICAgICAgY29uc3QgcmVzdG9yZWREYXRhID0gdHlwZW9mIHNldHRpbmdzID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2Uoc2V0dGluZ3MpIDogc2V0dGluZ3M7XG5cbiAgICAgIC8vIEF2b2lkIHRvIG92ZXJyaWRlIHRyYW5zaWVudCBwcm9wZXJ0aWVzXG4gICAgICBTRVRUSU5HU19UUkFOU0lFTlRfUFJPUEVSVElFUy5mb3JFYWNoKCh0cmFuc2llbnRLZXkpID0+IHtcbiAgICAgICAgZGVsZXRlIHJlc3RvcmVkRGF0YVt0cmFuc2llbnRLZXldO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIE1lcmdlIGludG8gZXhpc3RpbmcgZGF0YVxuICAgICAgZGF0YSA9IE9iamVjdC5hc3NpZ24oZGF0YSwgcmVzdG9yZWREYXRhKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGRhcmtNb2RlLCBpZiBub3Qgc2V0XG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnQ/LmFsbG93RGFya01vZGUgIT09IHRydWUpIHtcbiAgICAgIGRlbGV0ZSBkYXRhLmRhcmtNb2RlO1xuICAgIH0gZWxzZSBpZiAoaXNOaWwoZGF0YS5kYXJrTW9kZSkpIHtcbiAgICAgIGRhdGEuZGFya01vZGUgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXM7XG4gICAgfVxuXG4gICAgLy8gRW1pdCBldmVudFxuICAgIHRoaXMub25DaGFuZ2UubmV4dChkYXRhKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgc2V0UHJvcGVydHk8VCA9IHN0cmluZz4oa2V5T3JEZWY6IHN0cmluZyB8IEZvcm1GaWVsZERlZmluaXRpb24sIHZhbHVlOiBULCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuOyBpbW1lZGlhdGU/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIXRoaXMuX2RhdGEgfHwgIWtleU9yRGVmKSByZXR1cm47XG4gICAgaWYgKHR5cGVvZiBrZXlPckRlZiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMuc2V0UHJvcGVydHkoa2V5T3JEZWYua2V5LCB2YWx1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2RhdGEucHJvcGVydGllcyA9IHRoaXMuX2RhdGEucHJvcGVydGllcyB8fCB7fTtcbiAgICB0aGlzLl9kYXRhLnByb3BlcnRpZXNba2V5T3JEZWZdID0gaXNOaWwodmFsdWUpID8gdW5kZWZpbmVkIDogdmFsdWUudG9TdHJpbmcoKTtcblxuICAgIC8vIFVwZGF0ZSBsb2NhbCBzZXR0aW5nc1xuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMucGVyc2lzdExvY2FsbHkob3B0cz8uaW1tZWRpYXRlKTtcbiAgICB9XG4gIH1cblxuICBnZXRQcm9wZXJ0eShrZXlPckRlZjogc3RyaW5nIHwgRm9ybUZpZWxkRGVmaW5pdGlvbiwgZGVmYXVsdFZhbHVlPzogYW55KTogYW55IHtcbiAgICBpZiAodHlwZW9mIGtleU9yRGVmID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoa2V5T3JEZWYua2V5LCBpc05vdE5pbChkZWZhdWx0VmFsdWUpID8gZGVmYXVsdFZhbHVlIDoga2V5T3JEZWYuZGVmYXVsdFZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9kYXRhICYmIHRoaXMuX2RhdGEucHJvcGVydGllcyAmJiB0aGlzLl9kYXRhLnByb3BlcnRpZXNba2V5T3JEZWZdO1xuICAgIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZElmTnVsbChkZWZhdWx0VmFsdWUpO1xuICB9XG5cbiAgZ2V0UHJvcGVydHlBc0Jvb2xlYW4oZGVmaW5pdGlvbjogRm9ybUZpZWxkRGVmaW5pdGlvbiwgZGVmYXVsdFZhbHVlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eShkZWZpbml0aW9uLCBkZWZhdWx0VmFsdWUpO1xuICAgIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgPyB2YWx1ZSAmJiB2YWx1ZSAhPT0gJ2ZhbHNlJyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFByb3BlcnR5QXNJbnQoZGVmaW5pdGlvbjogRm9ybUZpZWxkRGVmaW5pdGlvbiwgZGVmYXVsdFZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHkoZGVmaW5pdGlvbiwgZGVmYXVsdFZhbHVlKTtcbiAgICByZXR1cm4gaXNOb3ROaWwodmFsdWUpID8gcGFyc2VJbnQodmFsdWUpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0UHJvcGVydHlBc051bWJlcnMoZGVmaW5pdGlvbjogRm9ybUZpZWxkRGVmaW5pdGlvbiwgZGVmYXVsdFZhbHVlPzogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFByb3BlcnR5KGRlZmluaXRpb24sIGRlZmF1bHRWYWx1ZSk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcChwYXJzZUZsb2F0KSB8fCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGlzTm90TmlsKHZhbHVlKSA/IFtwYXJzZUZsb2F0KHZhbHVlKV0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRQcm9wZXJ0eUFzU3RyaW5ncyhkZWZpbml0aW9uOiBGb3JtRmllbGREZWZpbml0aW9uLCBkZWZhdWx0VmFsdWU/OiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHkoZGVmaW5pdGlvbiwgZGVmYXVsdFZhbHVlKTtcbiAgICByZXR1cm4gKHZhbHVlICYmIHZhbHVlLnNwbGl0KCcsJykpIHx8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFByb3BlcnR5QXNPYmplY3RzKGRlZmluaXRpb246IEZvcm1GaWVsZERlZmluaXRpb24sIGRlZmF1bHRWYWx1ZT86IGFueVtdKTogYW55W10ge1xuICAgIGxldCB2YWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHkoZGVmaW5pdGlvbiwgZGVmYXVsdFZhbHVlKTtcbiAgICAvLyBQYXJzZSBhcnJheVxuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgYXN5bmMgYXBwbHkoc2V0dGluZ3M6IFBhcnRpYWw8TG9jYWxTZXR0aW5ncz4sIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW47IHBlcnNpc3RJbW1lZGlhdGU/OiBib29sZWFuIH0pIHtcbiAgICBpZiAoIXRoaXMuc3RhcnRlZCkgYXdhaXQgdGhpcy5yZWFkeSgpO1xuXG4gICAgY29uc3QgZGF0YSA9IHsgLi4udGhpcy5fZGF0YSwgLi4uc2V0dGluZ3MgfTtcblxuICAgIGlmIChlcXVhbHMoZGF0YSwgdGhpcy5fZGF0YSkpIHJldHVybjsgLy8gU2tpcCBpZiBubyBjaGFuZ2VzXG5cbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcblxuICAgIC8vIFNhdmUgbG9jYWxseVxuICAgIGlmIChvcHRzICYmIG9wdHMucGVyc2lzdEltbWVkaWF0ZSkge1xuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0TG9jYWxseSh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wZXJzaXN0TG9jYWxseSgpOyAvLyBObyBBV0FJVFxuICAgIH1cblxuICAgIC8vIEVtaXQgZXZlbnRcbiAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlLm5leHQodGhpcy5fZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXBwbHlQcm9wZXJ0eShrZXk6IGtleW9mIExvY2FsU2V0dGluZ3MsIHZhbHVlOiBhbnksIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW47IHBlcnNpc3RJbW1lZGlhdGU/OiBib29sZWFuIH0pIHtcbiAgICBjb25zdCBjaGFuZ2VzID0ge307XG4gICAgY2hhbmdlc1trZXldID0gdmFsdWU7XG4gICAgYXdhaXQgdGhpcy5hcHBseShjaGFuZ2VzLCBvcHRzKTtcbiAgfVxuXG4gIGdldFBhZ2VTZXR0aW5nczxUID0gYW55PihwYWdlSWQ6IHN0cmluZywgcHJvcGVydHlOYW1lPzogc3RyaW5nKTogVCB7XG4gICAgaWYgKCF0aGlzLl9kYXRhIHx8ICF0aGlzLl9kYXRhLnBhZ2VzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGtleSA9IHBhZ2VJZC5yZXBsYWNlKC9bL10vZywgJ19fJyk7XG4gICAgaWYgKGlzTm90TmlsT3JCbGFuayhwcm9wZXJ0eU5hbWUpKSB7XG4gICAgICByZXR1cm4gZ2V0UHJvcGVydHlCeVBhdGgodGhpcy5fZGF0YS5wYWdlcywga2V5ICsgJy4nICsgcHJvcGVydHlOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEucGFnZXNba2V5XTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVQYWdlU2V0dGluZyhwYWdlSWQ6IHN0cmluZywgdmFsdWU6IGFueSwgcHJvcGVydHlOYW1lPzogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGF0YSA9IHRoaXMuX2RhdGEgfHwgdGhpcy5kZWZhdWx0U2V0dGluZ3M7XG4gICAgdGhpcy5fZGF0YS5wYWdlcyA9IHRoaXMuX2RhdGEucGFnZXMgfHwge307XG5cbiAgICBjb25zdCBrZXkgPSBwYWdlSWQucmVwbGFjZSgvWy9dL2csICdfXycpO1xuICAgIGlmIChwcm9wZXJ0eU5hbWUpIHtcbiAgICAgIHRoaXMuX2RhdGEucGFnZXNba2V5XSA9IHRoaXMuX2RhdGEucGFnZXNba2V5XSB8fCB7fTtcbiAgICAgIHRoaXMuX2RhdGEucGFnZXNba2V5XVtwcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RhdGEucGFnZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBsb2NhbCBzZXR0aW5nc1xuICAgIHRoaXMucGVyc2lzdExvY2FsbHkoKTtcbiAgfVxuXG4gIGdldE9mZmxpbmVGZWF0dXJlPEYgPSBhbnk+KGZlYXR1cmVOYW1lOiBzdHJpbmcpOiBPZmZsaW5lRmVhdHVyZTxGPiB7XG4gICAgaWYgKCF0aGlzLl9kYXRhIHx8ICF0aGlzLl9kYXRhLm9mZmxpbmVGZWF0dXJlcyB8fCBpc0VtcHR5QXJyYXkodGhpcy5fZGF0YS5vZmZsaW5lRmVhdHVyZXMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICghZmVhdHVyZU5hbWUpIHRocm93IEVycm9yKFwiTWlzc2luZyAnZmVhdHVyZU5hbWUnIGFyZ3VtZW50XCIpO1xuXG4gICAgZmVhdHVyZU5hbWUgPSBmZWF0dXJlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGZlYXR1cmVQcmVmaXggPSBmZWF0dXJlTmFtZSArICcjJztcbiAgICBjb25zdCBmZWF0dXJlID0gdGhpcy5fZGF0YS5vZmZsaW5lRmVhdHVyZXMuZmluZCgoZikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBmID09PSAnc3RyaW5nJykgcmV0dXJuIGYudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGZlYXR1cmVQcmVmaXgpO1xuICAgICAgaWYgKGYgJiYgdHlwZW9mIGYgPT09ICdvYmplY3QnICYmIGYubmFtZSkgcmV0dXJuIGYubmFtZSA9PT0gZmVhdHVyZU5hbWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgaWYgKCFmZWF0dXJlKSByZXR1cm47IC8vIE5vdCBmb3VuZFxuICAgIGlmICh0eXBlb2YgZmVhdHVyZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGxhc3RTeW5jRGF0ZSA9IGZlYXR1cmUuc3Vic3RyaW5nKGZlYXR1cmVQcmVmaXgubGVuZ3RoKTtcbiAgICAgIGNvbnNvbGUuZGVidWcoYFske2ZlYXR1cmVOYW1lfV0gTGFzdCBzeW5jaHJvbml6YXRpb24gZGF0ZTogJHtsYXN0U3luY0RhdGV9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBmZWF0dXJlTmFtZSxcbiAgICAgICAgbGFzdFN5bmNEYXRlLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGZlYXR1cmU7XG4gIH1cblxuICBnZXRPZmZsaW5lRmVhdHVyZUxhc3RTeW5jRGF0ZShmZWF0dXJlTmFtZTogc3RyaW5nKTogTW9tZW50IHtcbiAgICBjb25zdCBmZWF0dXJlID0gdGhpcy5nZXRPZmZsaW5lRmVhdHVyZShmZWF0dXJlTmFtZSk7XG4gICAgcmV0dXJuIGZlYXR1cmUgJiYgZnJvbURhdGVJU09TdHJpbmcoZmVhdHVyZS5sYXN0U3luY0RhdGUpO1xuICB9XG5cbiAgaGFzT2ZmbGluZUZlYXR1cmUoZmVhdHVyZU5hbWU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoZmVhdHVyZU5hbWUpIHJldHVybiBpc05vdE5pbCh0aGlzLmdldE9mZmxpbmVGZWF0dXJlKGZlYXR1cmVOYW1lKSk7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGEgJiYgaXNOb3RFbXB0eUFycmF5KHRoaXMuX2RhdGEub2ZmbGluZUZlYXR1cmVzKTtcbiAgfVxuXG4gIHNhdmVPZmZsaW5lRmVhdHVyZShmZWF0dXJlOiBPZmZsaW5lRmVhdHVyZSkge1xuICAgIHRoaXMuX2RhdGEgPSB0aGlzLl9kYXRhIHx8IHRoaXMuZGVmYXVsdFNldHRpbmdzO1xuICAgIHRoaXMuX2RhdGEub2ZmbGluZUZlYXR1cmVzID0gdGhpcy5fZGF0YS5vZmZsaW5lRmVhdHVyZXMgfHwgW107XG5cbiAgICBmZWF0dXJlLm5hbWUgPSBmZWF0dXJlLm5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGNvbnN0IGZlYXR1cmVQcmVmaXggPSBmZWF0dXJlLm5hbWUgKyAnIyc7XG4gICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IHRoaXMuX2RhdGEub2ZmbGluZUZlYXR1cmVzLmZpbmRJbmRleCgoZikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBmID09PSAnc3RyaW5nJykgcmV0dXJuIGYudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKGZlYXR1cmVQcmVmaXgpO1xuICAgICAgaWYgKGYgJiYgdHlwZW9mIGYgPT09ICdvYmplY3QnICYmIGYubmFtZSkgcmV0dXJuIGYubmFtZSA9PT0gZmVhdHVyZS5uYW1lO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIGlmIChleGlzdGluZ0luZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5fZGF0YS5vZmZsaW5lRmVhdHVyZXNbZXhpc3RpbmdJbmRleF0gPSBmZWF0dXJlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kYXRhLm9mZmxpbmVGZWF0dXJlcy5wdXNoKGZlYXR1cmUpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBsb2NhbCBzZXR0aW5nc1xuICAgIHRoaXMucGVyc2lzdExvY2FsbHkoKTtcbiAgfVxuXG4gIG1hcmtPZmZsaW5lRmVhdHVyZUFzU3luYyhmZWF0dXJlTmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IGZlYXR1cmUgPSB0aGlzLmdldE9mZmxpbmVGZWF0dXJlKGZlYXR1cmVOYW1lKTtcblxuICAgIGlmICghZmVhdHVyZSkge1xuICAgICAgZmVhdHVyZSA9IDxPZmZsaW5lRmVhdHVyZT57XG4gICAgICAgIG5hbWU6IGZlYXR1cmVOYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIGxhc3RTeW5jRGF0ZTogRGF0ZVV0aWxzLm1vbWVudCgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBmZWF0dXJlLmxhc3RTeW5jRGF0ZSA9IERhdGVVdGlscy5tb21lbnQoKS50b0lTT1N0cmluZygpO1xuICAgIH1cblxuICAgIHRoaXMuc2F2ZU9mZmxpbmVGZWF0dXJlKGZlYXR1cmUpO1xuICB9XG5cbiAgcmVtb3ZlT2ZmbGluZUZlYXR1cmVzKCkge1xuICAgIGlmICh0aGlzLl9kYXRhICYmIHRoaXMuX2RhdGEub2ZmbGluZUZlYXR1cmVzKSB7XG4gICAgICB0aGlzLl9kYXRhLm9mZmxpbmVGZWF0dXJlcyA9IFtdO1xuXG4gICAgICAvLyBVcGRhdGUgbG9jYWwgc2V0dGluZ3NcbiAgICAgIHRoaXMucGVyc2lzdExvY2FsbHkoKTtcbiAgICB9XG4gIH1cblxuICBnZXRGaWVsZERpc3BsYXlBdHRyaWJ1dGVzKGZpZWxkTmFtZTogc3RyaW5nLCBkZWZhdWx0QXR0cmlidXRlcz86IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLnByb3BlcnRpZXMgJiYgdGhpcy5fZGF0YS5wcm9wZXJ0aWVzW2BzdW1hcmlzLmZpZWxkLiR7ZmllbGROYW1lfS5hdHRyaWJ1dGVzYF07XG4gICAgLy8gTm90aGluZyBmb3VuZCBpbiBzZXR0aW5nczogcmV0dXJuIGRlZmF1bHRzXG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIGRlZmF1bHRBdHRyaWJ1dGVzIHx8IFsnbGFiZWwnLCAnbmFtZSddO1xuXG4gICAgcmV0dXJuIHZhbHVlLnNwbGl0KCcsJyk7XG4gIH1cblxuICBnZXRQYWdlRmllbGREZWZhdWx0VmFsdWUocGFnZUlkOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5nZXRQYWdlU2V0dGluZ3MocGFnZUlkLCBgZmllbGQuJHtmaWVsZE5hbWV9LmRlZmF1bHRWYWx1ZWApO1xuICB9XG5cbiAgZ2V0IG9wdGlvbkRlZnMoKTogRm9ybUZpZWxkRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uRGVmcztcbiAgfVxuXG4gIHJlZ2lzdGVyT3B0aW9uKGRlZjogRm9ybUZpZWxkRGVmaW5pdGlvbikge1xuICAgIGlmICh0aGlzLl9vcHRpb25EZWZzLmZpbmRJbmRleCgoZikgPT4gZi5rZXkgPT09IGRlZi5rZXkpICE9PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBBZGRpdGlvbmFsIGFkZGl0aW9uYWwgcHJvcGVydHkgeyR7ZGVmLmtleX19IGFscmVhZHkgZGVmaW5lLmApO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFtzZXR0aW5nc10gQWRkaW5nIGFkZGl0aW9uYWwgcHJvcGVydHkgeyR7ZGVmLmtleX19YCwgZGVmKTtcbiAgICB0aGlzLl9vcHRpb25EZWZzLnB1c2goZGVmKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT3B0aW9ucyhkZWZzOiBGb3JtRmllbGREZWZpbml0aW9uW10pIHtcbiAgICAoZGVmcyB8fCBbXSkuZm9yRWFjaCgoZGVmKSA9PiB0aGlzLnJlZ2lzdGVyT3B0aW9uKGRlZikpO1xuICB9XG5cbiAgYXN5bmMgYWRkVG9QYWdlSGlzdG9yeShcbiAgICBwYWdlOiBIaXN0b3J5UGFnZVJlZmVyZW5jZSxcbiAgICBvcHRzPzogQWRkVG9QYWdlSGlzdG9yeU9wdGlvbnMsXG4gICAgcGFnZUhpc3Rvcnk/OiBIaXN0b3J5UGFnZVJlZmVyZW5jZVtdIC8vIHVzZWQgZm9yIHJlY3Vyc2l2ZSBjYWxsIHRvIGNoaWxkcmVuXG4gICkge1xuICAgIC8vIElmIG5vdCBpbnNpZGUgcmVjdXJzaXZlIGNhbGw6IGZpbGwgcGFnZSBoaXN0b3J5IGRlZmF1bHRzXG4gICAgaWYgKCFwYWdlSGlzdG9yeSkgdGhpcy5maWxsUGFnZUhpc3RvcnlEZWZhdWx0cyhwYWdlLCBvcHRzKTtcblxuICAgIHBhZ2VIaXN0b3J5ID0gcGFnZUhpc3RvcnkgfHwgdGhpcy5fZGF0YS5wYWdlSGlzdG9yeTtcblxuICAgIGNvbnN0IGluZGV4ID0gcGFnZUhpc3RvcnkuZmluZEluZGV4KFxuICAgICAgKHApID0+XG4gICAgICAgIC8vIHNhbWUgcGF0aFxuICAgICAgICBwLnBhdGggPT09IHBhZ2UucGF0aCB8fFxuICAgICAgICAvLyBvciBzdWItcGF0aFxuICAgICAgICBwYWdlLnBhdGguc3RhcnRzV2l0aChwLnBhdGggKyAnLycpXG4gICAgKTtcblxuICAgIC8vIE5ldyBwYWdlOiBpbnNlcnQgaXRcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAvL2lmICh0aGlzLl9kZWJ1ZylcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1tzZXR0aW5nc10gQWRkaW5nIHBhZ2UgdG8gaGlzdG9yeTogJywgcGFnZSk7XG5cbiAgICAgIC8vIFByZXBlbmQgdG8gbGlzdFxuICAgICAgcGFnZUhpc3Rvcnkuc3BsaWNlKDAsIDAsIHBhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBleGlzdGluZ1BhZ2UgPSBwYWdlSGlzdG9yeVtpbmRleF07XG5cbiAgICAgIC8vIFNhbWUgcGF0aDogcmVwbGFjZSBleGlzdGluZyBwYWdlXG4gICAgICBpZiAocGFnZUhpc3RvcnlbaW5kZXhdLnBhdGggPT09IHBhZ2UucGF0aCkge1xuICAgICAgICAvL2lmICh0aGlzLl9kZWJ1ZylcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW3NldHRpbmdzXSBVcGRhdGluZyBleGlzdGluZyBwYWdlIGluIGhpc3Rvcnk6ICcsIHBhZ2UpO1xuICAgICAgICBwYWdlSGlzdG9yeS5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICAgIC8vIENvcHkgZXhpdGluZyBjaGlsZHJlblxuICAgICAgICBwYWdlLmNoaWxkcmVuID0gZXhpc3RpbmdQYWdlLmNoaWxkcmVuIHx8IFtdO1xuXG4gICAgICAgIC8vIFByZXBlbmQgdG8gbGlzdFxuICAgICAgICBwYWdlSGlzdG9yeS5zcGxpY2UoMCwgMCwgcGFnZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vdCBzYW1lIHBhdGggKHNob3VsZCBiZSBhIHBhcmVudCBwYWdlKVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIENyZWF0ZSBwYXJlbnQncyBjaGlsZHJlbiBhcnJheSwgaWYgbm90IGV4aXN0c1xuICAgICAgICBleGlzdGluZ1BhZ2UuY2hpbGRyZW4gPSBleGlzdGluZ1BhZ2UuY2hpbGRyZW4gfHwgW107XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBwYXJlbnQgdGltZVxuICAgICAgICBleGlzdGluZ1BhZ2UudGltZSA9IHBhZ2UudGltZTtcblxuICAgICAgICAvLyBBZGQgcGFnZSBhcyBwYXJlbnQncyBjaGlsZHJlbiAocmVjdXJzaXZlIGNhbGwpXG4gICAgICAgIGF3YWl0IHRoaXMuYWRkVG9QYWdlSGlzdG9yeShwYWdlLCBvcHRzLCBleGlzdGluZ1BhZ2UuY2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNhdmUgbG9jYWxseSAob25seSBpZiBub3QgYSByZWN1cnNpdmUgZXhlY3V0aW9uKVxuICAgIGlmIChwYWdlSGlzdG9yeSA9PT0gdGhpcy5fZGF0YS5wYWdlSGlzdG9yeSkge1xuICAgICAgLy8gSWYgbWF4IGhhcyBiZWVuIHJlYWNoZWQsIHJlbW92ZSBvbGQgcGFnZXNcbiAgICAgIGlmICh0aGlzLl9kYXRhLnBhZ2VIaXN0b3J5Lmxlbmd0aCA+IHRoaXMuX2RhdGEucGFnZUhpc3RvcnlNYXhTaXplKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRQYWdlcyA9IHBhZ2VIaXN0b3J5LnNwbGljZSh0aGlzLl9kYXRhLnBhZ2VIaXN0b3J5TWF4U2l6ZSwgcGFnZUhpc3RvcnkubGVuZ3RoIC0gdGhpcy5fZGF0YS5wYWdlSGlzdG9yeU1heFNpemUpO1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbc2V0dGluZ3NdIFBhZ2VzIHJlbW92ZWQgZnJvbSBoaXN0b3J5OiAnLCByZW1vdmVkUGFnZXMpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBuZXcgdmFsdWVcbiAgICAgIGF3YWl0IHRoaXMuYXBwbHlQcm9wZXJ0eSgncGFnZUhpc3RvcnknLCBwYWdlSGlzdG9yeSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVtb3ZlUGFnZUhpc3RvcnkoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW47IHBlcnNpc3RJbW1lZGlhdGU/OiBib29sZWFuIH0sXG4gICAgcGFnZUhpc3Rvcnk6IEhpc3RvcnlQYWdlUmVmZXJlbmNlW10gPSB1bmRlZmluZWQsIC8vIHVzZWQgZm9yIHJlY3Vyc2l2ZSBjYWxsIHRvIGNoaWxkcmVuKVxuICAgIGRlcHRoID0gMFxuICApIHtcbiAgICBjb25zdCByb290ID0gZGVwdGggPT09IDA7XG4gICAgcGFnZUhpc3RvcnkgPSBwYWdlSGlzdG9yeSB8fCB0aGlzLl9kYXRhLnBhZ2VIaXN0b3J5Py5zbGljZSgpIC8qY2xvbmUsIHRvIGZvcmNlIGFwcGx5IHRvIHNhdmUgKi8gfHwgW107XG5cbiAgICBjb25zdCBpbmRleCA9IHBhZ2VIaXN0b3J5LmZpbmRJbmRleCgocCkgPT4gcC5wYXRoID09PSBwYXRoKTtcbiAgICBsZXQgZm91bmQgPSBpbmRleCAhPT0gLTE7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbc2V0dGluZ3NdIFJlbW92ZSBwYWdlIGhpc3Rvcnk6ICcsIHBhdGgpO1xuICAgICAgLy8gUmVtb3ZlIHZhbHVlXG4gICAgICBwYWdlSGlzdG9yeS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTZWFyY2ggcGF0aCBvbiBjaGlsZHJlbiAoc3RvcCB3aGVuIGZvdW5kKVxuICAgICAgZm91bmQgPVxuICAgICAgICBwYWdlSGlzdG9yeVxuICAgICAgICAgIC5tYXAoKHApID0+IHAuY2hpbGRyZW4pXG4gICAgICAgICAgLmZpbHRlcihpc05vdEVtcHR5QXJyYXkpXG4gICAgICAgICAgLmZpbmRJbmRleCgoY2hpbGRyZW4pID0+IHRoaXMucmVtb3ZlUGFnZUhpc3RvcnkocGF0aCwgb3B0cywgY2hpbGRyZW4sIChkZXB0aCB8fCAwKSArIDEpKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSBsb2NhbGx5IChvbmx5IGlmIHJvb3QgbGV2ZWwpXG4gICAgaWYgKGZvdW5kICYmIHJvb3QpIHtcbiAgICAgIC8vIEFwcGx5IGNoYW5nZXNcbiAgICAgIGF3YWl0IHRoaXMuYXBwbHlQcm9wZXJ0eSgncGFnZUhpc3RvcnknLCBwYWdlSGlzdG9yeSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgYXN5bmMgY2xlYXJQYWdlSGlzdG9yeSgpIHtcbiAgICAvLyBSZXNldCBhbGwgcGFnZSBoaXN0b3J5XG4gICAgYXdhaXQgdGhpcy5hcHBseVByb3BlcnR5KCdwYWdlSGlzdG9yeScsIFtdLCB7IHBlcnNpc3RJbW1lZGlhdGU6IHRydWUgfSk7XG4gIH1cblxuICAvKiAtLSBQcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBhc3luYyBuZ09uU3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlc2V0RGF0YSgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldERhdGEoKSB7XG4gICAgdGhpcy5fZGF0YSA9IHsgLi4udGhpcy5fZGF0YSwgLi4udGhpcy5kZWZhdWx0U2V0dGluZ3MgfTtcblxuICAgIHRoaXMuX2RhdGEubG9jYWxlID0gdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmcgfHwgdGhpcy50cmFuc2xhdGUuZGVmYXVsdExhbmc7XG4gICAgdGhpcy5fZGF0YS5tb2JpbGUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZGF0YS51c2FnZU1vZGUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZGF0YS5wYWdlSGlzdG9yeSA9IFtdO1xuXG4gICAgY29uc3QgZGVmYXVsdFBlZXIgPSB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRQZWVyICYmIFBlZXIuZnJvbU9iamVjdCh0aGlzLmVudmlyb25tZW50LmRlZmF1bHRQZWVyKTtcbiAgICB0aGlzLl9kYXRhLnBlZXJVcmwgPSAoZGVmYXVsdFBlZXIgJiYgZGVmYXVsdFBlZXIudXJsKSB8fCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodGhpcy5zdGFydGVkKSB0aGlzLm9uQ2hhbmdlLm5leHQodGhpcy5fZGF0YSk7XG4gIH1cblxuICBwcml2YXRlIHBlcnNpc3RMb2NhbGx5KGltbWVkaWF0ZT86IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIEV4ZWN1dGUgaW1tZWRpYXRlXG4gICAgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgaWYgKCF0aGlzLl9kYXRhKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1tzZXR0aW5nc10gUmVtb3ZpbmcgbG9jYWwgc2V0dGluZ3MgZnJvbSBzdG9yYWdlJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2UucmVtb3ZlKFNFVFRJTkdTX1NUT1JBR0VfS0VZKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1tzZXR0aW5nc10gU3RvcmUgbG9jYWwgc2V0dGluZ3MnLCB0aGlzLl9kYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuX3NlcmlhbGl6ZUFzU3RyaW5nKSB7XG4gICAgICAgICAgLy8gRml4IHNlcmlhbGl6YXRpb24gZXJyb3IsIGluIFN1bWFyaXMtQXBwXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5zZXQoU0VUVElOR1NfU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHRoaXMuX2RhdGEpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLnNldChTRVRUSU5HU19TVE9SQUdFX0tFWSwgdGhpcy5fZGF0YSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXhlY3V0ZSB3aXRoIGRlbGF5XG4gICAgZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgdGhlIGV2ZW50IGVtaXR0ZXJcbiAgICAgIGlmICghdGhpcy5fJHBlcnNpc3QpIHtcbiAgICAgICAgdGhpcy5fJHBlcnNpc3QgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4odHJ1ZSk7XG4gICAgICAgIHRoaXMuXyRwZXJzaXN0XG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBkZWJvdW5jZVRpbWUoMjAwMCksIC8vIGFkZCBhIGRlbGF5IG9mIDJzXG4gICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5zdGFydGVkKVxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMucGVyc2lzdExvY2FsbHkodHJ1ZSkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl8kcGVyc2lzdC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWxsUGFnZUhpc3RvcnlEZWZhdWx0cyhcbiAgICBwYWdlOiBIaXN0b3J5UGFnZVJlZmVyZW5jZSxcbiAgICBvcHRzPzoge1xuICAgICAgcmVtb3ZlUGF0aFF1ZXJ5UGFyYW1zPzogYm9vbGVhbjtcbiAgICAgIHJlbW92ZVRpdGxlU21hbGxUYWc/OiBib29sZWFuO1xuICAgIH1cbiAgKTogSGlzdG9yeVBhZ2VSZWZlcmVuY2Uge1xuICAgIGlmICghcGFnZSB8fCAhcGFnZS50aXRsZSB8fCAhcGFnZS5wYXRoKSB0aHJvdyBFcnJvcihcIk1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQgJ3BhZ2UnLCAncGFnZS5wYXRoJyBvciAncGFnZS50aXRsZSdcIik7XG5cbiAgICAvLyBTZXQgdGltZVxuICAgIHBhZ2UudGltZSA9IHBhZ2UudGltZSB8fCBEYXRlVXRpbHMubW9tZW50KCk7XG5cbiAgICAvLyBDbGVhbiB0aGUgdGl0bGUgKHJlbW92ZSA8c21hbGw+IHRhZ3MpXG4gICAgaWYgKCFvcHRzIHx8IG9wdHMucmVtb3ZlVGl0bGVTbWFsbFRhZyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IHRhZ0luZGV4ID0gcGFnZS50aXRsZS5pbmRleE9mKCc8L3NtYWxsPicpO1xuICAgICAgaWYgKHRhZ0luZGV4ICE9PSAtMSkge1xuICAgICAgICBwYWdlLnRpdGxlID0gcGFnZS50aXRsZS5zdWJzdHJpbmcodGFnSW5kZXggKyAnPC9zbWFsbD4nLmxlbmd0aCk7XG4gICAgICB9XG4gICAgICBwYWdlLnRpdGxlID0gcGFnZS50aXRsZS5yZXBsYWNlKC9bIF0qY2xhc3M9J2hpZGRlbi14cyBoaWRkZW4tc20nL2csICcnKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgcXVlcnkgcGFyYW1zXG4gICAgaWYgKCFvcHRzIHx8IG9wdHMucmVtb3ZlUGF0aFF1ZXJ5UGFyYW1zICE9PSBmYWxzZSkge1xuICAgICAgcGFnZS5wYXRoID0gcGFnZS5wYXRoLnJlcGxhY2UoL1s/XS4qJC8sICcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFnZTtcbiAgfVxufVxuIl19
491
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtc2V0dGluZ3Muc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUkxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckosT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUkvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCxPQUFPLEVBQUUsV0FBVyxFQUFlLE1BQU0seUNBQXlDLENBQUM7QUFDbkYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7QUFFL0QsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUVsRixvREFBb0Q7QUFDcEQsTUFBTSxnQkFBZ0Is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Q3JDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5ncywgT2ZmbGluZUZlYXR1cmUsIFVzYWdlTW9kZSB9IGZyb20gJy4vbW9kZWwvc2V0dGluZ3MubW9kZWwnO1xuaW1wb3J0IHsgUGVlciB9IGZyb20gJy4vbW9kZWwvcGVlci5tb2RlbCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdG9yYWdlIH0gZnJvbSAnQGlvbmljL3N0b3JhZ2UtYW5ndWxhcic7XG5cbmltcG9ydCB7IGVxdWFscywgZ2V0UHJvcGVydHlCeVBhdGgsIGlzRW1wdHlBcnJheSwgaXNOaWwsIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFuaywgdW5kZWZpbmVkSWZOdWxsIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IEZvcm1GaWVsZERlZmluaXRpb24sIEZvcm1GaWVsZERlZmluaXRpb25NYXAgfSBmcm9tICcuLi8uLi9zaGFyZWQvZm9ybS9maWVsZC5tb2RlbCc7XG5pbXBvcnQgeyBNb21lbnQgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IExhdExvbmdQYXR0ZXJuIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21hdGVyaWFsL2xhdGxvbmcvbGF0bG9uZy51dGlscyc7XG5pbXBvcnQgeyBFTlZJUk9OTUVOVCwgRW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgZW52aXJvbm1lbnQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQnO1xuaW1wb3J0IHsgRGF0ZVV0aWxzLCBmcm9tRGF0ZUlTT1N0cmluZyB9IGZyb20gJy4uLy4uL3NoYXJlZC9kYXRlcyc7XG5pbXBvcnQgeyBIaXN0b3J5UGFnZVJlZmVyZW5jZSB9IGZyb20gJy4vbW9kZWwvaGlzdG9yeS5tb2RlbCc7XG5pbXBvcnQgeyBTdGFydGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3N0YXJ0YWJsZS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IGlzQ2FwYWNpdG9yLCBpc01vYmlsZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9wbGF0Zm9ybXMnO1xuXG5leHBvcnQgY29uc3QgU0VUVElOR1NfU1RPUkFHRV9LRVkgPSAnc2V0dGluZ3MnO1xuZXhwb3J0IGNvbnN0IFNFVFRJTkdTX1RSQU5TSUVOVF9QUk9QRVJUSUVTID0gWydtb2JpbGUnLCAndG91Y2hVaScgLypkZXByZWNhdGVkKi9dO1xuXG4vLyBmaXhtZTogdGhpcyBjb25zdGFudCBwb2ludHMgdG8gc3RhdGljIGVudmlyb25tZW50XG5jb25zdCBERUZBVUxUX1NFVFRJTkdTOiBMb2NhbFNldHRpbmdzID0ge1xuICBhY2NvdW50SW5oZXJpdGFuY2U6IHRydWUsXG4gIGxvY2FsZTogZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZSxcbiAgbGF0TG9uZ0Zvcm1hdDogZW52aXJvbm1lbnQuZGVmYXVsdExhdExvbmdGb3JtYXQgfHwgJ0RETU0nLFxuICBwYWdlSGlzdG9yeU1heFNpemU6IDMsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsU2V0dGluZ3NPcHRpb25zIHtcbiAgc2VyaWFsaXplQXNTdHJpbmc/OiBib29sZWFuOyAvLyBmYWxzZSBieSBkZWZhdWx0XG4gIG9wdGlvbnM6IEZvcm1GaWVsZERlZmluaXRpb25NYXA7XG59XG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgQWRkVG9QYWdlSGlzdG9yeU9wdGlvbnMge1xuICByZW1vdmVQYXRoUXVlcnlQYXJhbXM/OiBib29sZWFuO1xuICByZW1vdmVUaXRsZVNtYWxsVGFnPzogYm9vbGVhbjtcbiAgZW1pdEV2ZW50PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEFQUF9MT0NBTF9TRVRUSU5HUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxQYXJ0aWFsPExvY2FsU2V0dGluZ3M+PignRGVmYXVsdExvY2FsU2V0dGluZ3MnKTtcbmV4cG9ydCBjb25zdCBBUFBfTE9DQUxfU0VUVElOR1NfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxMb2NhbFNldHRpbmdzT3B0aW9ucz4oJ0xvY2FsU2V0dGluZ3NPcHRpb25zJyk7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICAvL2RlcHM6IFtBUFBfTE9DQUxfU0VUVElOR1MsIEFQUF9MT0NBTF9TRVRUSU5HU19PUFRJT05TXVxufSlcbmV4cG9ydCBjbGFzcyBMb2NhbFNldHRpbmdzU2VydmljZSBleHRlbmRzIFN0YXJ0YWJsZVNlcnZpY2U8TG9jYWxTZXR0aW5ncz4ge1xuICBvbkNoYW5nZSA9IG5ldyBTdWJqZWN0PExvY2FsU2V0dGluZ3M+KCk7XG4gIGRhcmtNb2RlJCA9IHRoaXMub25DaGFuZ2UucGlwZShtYXAoKGRhdGEpID0+IGRhdGE/LmRhcmtNb2RlIHx8IGZhbHNlKSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uRGVmczogRm9ybUZpZWxkRGVmaW5pdGlvbltdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZXJpYWxpemVBc1N0cmluZzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfJHBlcnNpc3Q6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gIGdldCBzZXR0aW5ncygpOiBMb2NhbFNldHRpbmdzIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YSB8fCB0aGlzLmRlZmF1bHRTZXR0aW5ncztcbiAgfVxuXG4gIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKHRoaXMuX2RhdGEgJiYgdGhpcy5fZGF0YS5sb2NhbGUpIHx8IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nIHx8IHRoaXMudHJhbnNsYXRlLmRlZmF1bHRMYW5nO1xuICB9XG5cbiAgZ2V0IGxhdExvbmdGb3JtYXQoKTogTGF0TG9uZ1BhdHRlcm4ge1xuICAgIHJldHVybiAodGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLmxhdExvbmdGb3JtYXQpIHx8ICdERE1NJztcbiAgfVxuXG4gIGdldCB1c2FnZU1vZGUoKTogVXNhZ2VNb2RlIHtcbiAgICByZXR1cm4gaXNOb3ROaWwodGhpcy5fZGF0YS51c2FnZU1vZGUpID8gdGhpcy5fZGF0YS51c2FnZU1vZGUgOiBpc0NhcGFjaXRvcih3aW5kb3cpIHx8IGlzTW9iaWxlKHdpbmRvdykgPyAnRklFTEQnIDogJ0RFU0snO1xuICB9XG5cbiAgZ2V0IG1vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOb3ROaWwodGhpcy5fZGF0YS5tb2JpbGUpID8gdGhpcy5fZGF0YS5tb2JpbGUgOiBpc01vYmlsZSh3aW5kb3cpO1xuICB9XG5cbiAgc2V0IG1vYmlsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2RhdGEubW9iaWxlID0gdmFsdWU7XG4gIH1cblxuICBnZXQgcGFnZUhpc3RvcnkoKTogSGlzdG9yeVBhZ2VSZWZlcmVuY2VbXSB7XG4gICAgcmV0dXJuICh0aGlzLl9kYXRhICYmIHRoaXMuX2RhdGEucGFnZUhpc3RvcnkpIHx8IFtdO1xuICB9XG5cbiAgZ2V0IGFsbG93RGFya01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/LmFsbG93RGFya01vZGUgPT09IHRydWU7XG4gIH1cblxuICBnZXQgaXNEYXJrTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hbGxvd0RhcmtNb2RlICYmIHRoaXMuX2RhdGE/LmRhcmtNb2RlID09PSB0cnVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZSxcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX0xPQ0FMX1NFVFRJTkdTKSBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRTZXR0aW5nczogTG9jYWxTZXR0aW5ncyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9MT0NBTF9TRVRUSU5HU19PUFRJT05TKSBvcHRpb25zOiBMb2NhbFNldHRpbmdzT3B0aW9uc1xuICApIHtcbiAgICBzdXBlcihwbGF0Zm9ybSk7XG4gICAgdGhpcy5kZWZhdWx0U2V0dGluZ3MgPSB7IC4uLkRFRkFVTFRfU0VUVElOR1MsIC4uLnRoaXMuZGVmYXVsdFNldHRpbmdzIH07XG5cbiAgICB0aGlzLl9vcHRpb25EZWZzID0gT2JqZWN0LnZhbHVlcyhvcHRpb25zPy5vcHRpb25zIHx8IHt9KTtcbiAgICB0aGlzLl9zZXJpYWxpemVBc1N0cmluZyA9IG9wdGlvbnM/LnNlcmlhbGl6ZUFzU3RyaW5nIHx8IGZhbHNlO1xuXG4gICAgdGhpcy5yZXNldERhdGEoKTtcblxuICAgIHRoaXMuX2RlYnVnID0gdHJ1ZTsgLy8gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbc2V0dGluZ3NdIENyZWF0aW5nIHNlcnZpY2UnKTtcbiAgfVxuXG4gIG5nT25TdGFydCgpOiBQcm9taXNlPExvY2FsU2V0dGluZ3M+IHtcbiAgICBjb25zb2xlLmluZm8oJ1tzZXR0aW5nc10gU3RhcnRpbmcgc2VydmljZS4uLicpO1xuXG4gICAgLy8gRGVmYXVsdCB2YWx1ZVxuICAgIHRoaXMuX2RhdGEubW9iaWxlID0gdGhpcy5tb2JpbGU7XG4gICAgdGhpcy5fZGF0YS51c2FnZU1vZGUgPSB0aGlzLnVzYWdlTW9kZTtcblxuICAgIC8vIFJlc3RvcmluZyBsb2NhbCBzZXR0aW5nc1xuICAgIHJldHVybiB0aGlzLnJlc3RvcmVMb2NhbGx5KCk7XG4gIH1cblxuICBpc1VzYWdlTW9kZShtb2RlOiBVc2FnZU1vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51c2FnZU1vZGUgPT09IG1vZGU7XG4gIH1cblxuICBpc09uRmllbGRNb2RlKHZhbHVlPzogVXNhZ2VNb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh2YWx1ZSB8fCB0aGlzLnVzYWdlTW9kZSkgPT09ICdGSUVMRCc7XG4gIH1cblxuICBhc3luYyByZXN0b3JlTG9jYWxseSgpOiBQcm9taXNlPExvY2FsU2V0dGluZ3MgfCB1bmRlZmluZWQ+IHtcbiAgICBsZXQgZGF0YSA9IHRoaXMuX2RhdGEgfHwgPExvY2FsU2V0dGluZ3M+e307XG5cbiAgICAvLyBSZXN0b3JlIGZyb20gc3RvcmFnZVxuICAgIGNvbnN0IHNldHRpbmdzID0gYXdhaXQgdGhpcy5zdG9yYWdlLmdldChTRVRUSU5HU19TVE9SQUdFX0tFWSk7XG5cbiAgICAvLyBSZXN0b3JlIGxvY2FsIHNldHRpbmdzIChvciBrZWVwIG9sZCBzZXR0aW5ncylcbiAgICBpZiAoaXNOb3ROaWwoc2V0dGluZ3MpKSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1tzZXR0aW5nc10gUmVzdG9yaW5nIHByZXZpb3VzIHNldHRpbmdzLi4uJyk7XG5cbiAgICAgIGNvbnN0IHJlc3RvcmVkRGF0YSA9IHR5cGVvZiBzZXR0aW5ncyA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHNldHRpbmdzKSA6IHNldHRpbmdzO1xuXG4gICAgICAvLyBBdm9pZCB0byBvdmVycmlkZSB0cmFuc2llbnQgcHJvcGVydGllc1xuICAgICAgU0VUVElOR1NfVFJBTlNJRU5UX1BST1BFUlRJRVMuZm9yRWFjaCgodHJhbnNpZW50S2V5KSA9PiB7XG4gICAgICAgIGRlbGV0ZSByZXN0b3JlZERhdGFbdHJhbnNpZW50S2V5XTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBNZXJnZSBpbnRvIGV4aXN0aW5nIGRhdGFcbiAgICAgIGRhdGEgPSBPYmplY3QuYXNzaWduKGRhdGEsIHJlc3RvcmVkRGF0YSk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBkYXJrTW9kZSwgaWYgbm90IHNldFxuICAgIGlmICh0aGlzLmVudmlyb25tZW50Py5hbGxvd0RhcmtNb2RlICE9PSB0cnVlKSB7XG4gICAgICBkZWxldGUgZGF0YS5kYXJrTW9kZTtcbiAgICB9IGVsc2UgaWYgKGlzTmlsKGRhdGEuZGFya01vZGUpKSB7XG4gICAgICBkYXRhLmRhcmtNb2RlID0gd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzO1xuICAgIH1cblxuICAgIC8vIEVtaXQgZXZlbnRcbiAgICB0aGlzLm9uQ2hhbmdlLm5leHQoZGF0YSk7XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIHNldFByb3BlcnR5PFQgPSBzdHJpbmc+KGtleU9yRGVmOiBzdHJpbmcgfCBGb3JtRmllbGREZWZpbml0aW9uLCB2YWx1ZTogVCwgb3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbjsgaW1tZWRpYXRlPzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKCF0aGlzLl9kYXRhIHx8ICFrZXlPckRlZikgcmV0dXJuO1xuICAgIGlmICh0eXBlb2Yga2V5T3JEZWYgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLnNldFByb3BlcnR5KGtleU9yRGVmLmtleSwgdmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhLnByb3BlcnRpZXMgPSB0aGlzLl9kYXRhLnByb3BlcnRpZXMgfHwge307XG4gICAgdGhpcy5fZGF0YS5wcm9wZXJ0aWVzW2tleU9yRGVmXSA9IGlzTmlsKHZhbHVlKSA/IHVuZGVmaW5lZCA6IHZhbHVlLnRvU3RyaW5nKCk7XG5cbiAgICAvLyBVcGRhdGUgbG9jYWwgc2V0dGluZ3NcbiAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnBlcnNpc3RMb2NhbGx5KG9wdHM/LmltbWVkaWF0ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHJvcGVydHkoa2V5T3JEZWY6IHN0cmluZyB8IEZvcm1GaWVsZERlZmluaXRpb24sIGRlZmF1bHRWYWx1ZT86IGFueSk6IGFueSB7XG4gICAgaWYgKHR5cGVvZiBrZXlPckRlZiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5KGtleU9yRGVmLmtleSwgaXNOb3ROaWwoZGVmYXVsdFZhbHVlKSA/IGRlZmF1bHRWYWx1ZSA6IGtleU9yRGVmLmRlZmF1bHRWYWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLnByb3BlcnRpZXMgJiYgdGhpcy5fZGF0YS5wcm9wZXJ0aWVzW2tleU9yRGVmXTtcbiAgICByZXR1cm4gaXNOb3ROaWwodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWRJZk51bGwoZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIGdldFByb3BlcnR5QXNCb29sZWFuKGRlZmluaXRpb246IEZvcm1GaWVsZERlZmluaXRpb24sIGRlZmF1bHRWYWx1ZT86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHkoZGVmaW5pdGlvbiwgZGVmYXVsdFZhbHVlKTtcbiAgICByZXR1cm4gaXNOb3ROaWwodmFsdWUpID8gdmFsdWUgJiYgdmFsdWUgIT09ICdmYWxzZScgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRQcm9wZXJ0eUFzSW50KGRlZmluaXRpb246IEZvcm1GaWVsZERlZmluaXRpb24sIGRlZmF1bHRWYWx1ZT86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFByb3BlcnR5KGRlZmluaXRpb24sIGRlZmF1bHRWYWx1ZSk7XG4gICAgcmV0dXJuIGlzTm90TmlsKHZhbHVlKSA/IHBhcnNlSW50KHZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFByb3BlcnR5QXNOdW1iZXJzKGRlZmluaXRpb246IEZvcm1GaWVsZERlZmluaXRpb24sIGRlZmF1bHRWYWx1ZT86IG51bWJlcltdKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRQcm9wZXJ0eShkZWZpbml0aW9uLCBkZWZhdWx0VmFsdWUpO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsdWUuc3BsaXQoJywnKS5tYXAocGFyc2VGbG9hdCkgfHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgPyBbcGFyc2VGbG9hdCh2YWx1ZSldIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0UHJvcGVydHlBc1N0cmluZ3MoZGVmaW5pdGlvbjogRm9ybUZpZWxkRGVmaW5pdGlvbiwgZGVmYXVsdFZhbHVlPzogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFByb3BlcnR5KGRlZmluaXRpb24sIGRlZmF1bHRWYWx1ZSk7XG4gICAgcmV0dXJuICh2YWx1ZSAmJiB2YWx1ZS5zcGxpdCgnLCcpKSB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRQcm9wZXJ0eUFzT2JqZWN0cyhkZWZpbml0aW9uOiBGb3JtRmllbGREZWZpbml0aW9uLCBkZWZhdWx0VmFsdWU/OiBhbnlbXSk6IGFueVtdIHtcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmdldFByb3BlcnR5KGRlZmluaXRpb24sIGRlZmF1bHRWYWx1ZSk7XG4gICAgLy8gUGFyc2UgYXJyYXlcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGFzeW5jIGFwcGx5KHNldHRpbmdzOiBQYXJ0aWFsPExvY2FsU2V0dGluZ3M+LCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuOyBwZXJzaXN0SW1tZWRpYXRlPzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIGF3YWl0IHRoaXMucmVhZHkoKTtcblxuICAgIGNvbnN0IGRhdGEgPSB7IC4uLnRoaXMuX2RhdGEsIC4uLnNldHRpbmdzIH07XG5cbiAgICBpZiAoZXF1YWxzKGRhdGEsIHRoaXMuX2RhdGEpKSByZXR1cm47IC8vIFNraXAgaWYgbm8gY2hhbmdlc1xuXG4gICAgdGhpcy5fZGF0YSA9IGRhdGE7XG5cbiAgICAvLyBTYXZlIGxvY2FsbHlcbiAgICBpZiAob3B0cyAmJiBvcHRzLnBlcnNpc3RJbW1lZGlhdGUpIHtcbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdExvY2FsbHkodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGVyc2lzdExvY2FsbHkoKTsgLy8gTm8gQVdBSVRcbiAgICB9XG5cbiAgICAvLyBFbWl0IGV2ZW50XG4gICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuX2RhdGEpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFwcGx5UHJvcGVydHkoa2V5OiBrZXlvZiBMb2NhbFNldHRpbmdzLCB2YWx1ZTogYW55LCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuOyBwZXJzaXN0SW1tZWRpYXRlPzogYm9vbGVhbiB9KSB7XG4gICAgY29uc3QgY2hhbmdlcyA9IHt9O1xuICAgIGNoYW5nZXNba2V5XSA9IHZhbHVlO1xuICAgIGF3YWl0IHRoaXMuYXBwbHkoY2hhbmdlcywgb3B0cyk7XG4gIH1cblxuICBnZXRQYWdlU2V0dGluZ3M8VCA9IGFueT4ocGFnZUlkOiBzdHJpbmcsIHByb3BlcnR5TmFtZT86IHN0cmluZyk6IFQge1xuICAgIGlmICghdGhpcy5fZGF0YSB8fCAhdGhpcy5fZGF0YS5wYWdlcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBrZXkgPSBwYWdlSWQucmVwbGFjZSgvWy9dL2csICdfXycpO1xuICAgIGlmIChpc05vdE5pbE9yQmxhbmsocHJvcGVydHlOYW1lKSkge1xuICAgICAgcmV0dXJuIGdldFByb3BlcnR5QnlQYXRoKHRoaXMuX2RhdGEucGFnZXMsIGtleSArICcuJyArIHByb3BlcnR5TmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9kYXRhLnBhZ2VzW2tleV07XG4gIH1cblxuICBhc3luYyBzYXZlUGFnZVNldHRpbmcocGFnZUlkOiBzdHJpbmcsIHZhbHVlOiBhbnksIHByb3BlcnR5TmFtZT86IHN0cmluZykge1xuICAgIHRoaXMuX2RhdGEgPSB0aGlzLl9kYXRhIHx8IHRoaXMuZGVmYXVsdFNldHRpbmdzO1xuICAgIHRoaXMuX2RhdGEucGFnZXMgPSB0aGlzLl9kYXRhLnBhZ2VzIHx8IHt9O1xuXG4gICAgY29uc3Qga2V5ID0gcGFnZUlkLnJlcGxhY2UoL1svXS9nLCAnX18nKTtcbiAgICBpZiAocHJvcGVydHlOYW1lKSB7XG4gICAgICB0aGlzLl9kYXRhLnBhZ2VzW2tleV0gPSB0aGlzLl9kYXRhLnBhZ2VzW2tleV0gfHwge307XG4gICAgICB0aGlzLl9kYXRhLnBhZ2VzW2tleV1bcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kYXRhLnBhZ2VzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbG9jYWwgc2V0dGluZ3NcbiAgICB0aGlzLnBlcnNpc3RMb2NhbGx5KCk7XG4gIH1cblxuICBnZXRPZmZsaW5lRmVhdHVyZTxGID0gYW55PihmZWF0dXJlTmFtZTogc3RyaW5nKTogT2ZmbGluZUZlYXR1cmU8Rj4ge1xuICAgIGlmICghdGhpcy5fZGF0YSB8fCAhdGhpcy5fZGF0YS5vZmZsaW5lRmVhdHVyZXMgfHwgaXNFbXB0eUFycmF5KHRoaXMuX2RhdGEub2ZmbGluZUZlYXR1cmVzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIWZlYXR1cmVOYW1lKSB0aHJvdyBFcnJvcihcIk1pc3NpbmcgJ2ZlYXR1cmVOYW1lJyBhcmd1bWVudFwiKTtcblxuICAgIGZlYXR1cmVOYW1lID0gZmVhdHVyZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBmZWF0dXJlUHJlZml4ID0gZmVhdHVyZU5hbWUgKyAnIyc7XG4gICAgY29uc3QgZmVhdHVyZSA9IHRoaXMuX2RhdGEub2ZmbGluZUZlYXR1cmVzLmZpbmQoKGYpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZiA9PT0gJ3N0cmluZycpIHJldHVybiBmLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChmZWF0dXJlUHJlZml4KTtcbiAgICAgIGlmIChmICYmIHR5cGVvZiBmID09PSAnb2JqZWN0JyAmJiBmLm5hbWUpIHJldHVybiBmLm5hbWUgPT09IGZlYXR1cmVOYW1lO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIGlmICghZmVhdHVyZSkgcmV0dXJuOyAvLyBOb3QgZm91bmRcbiAgICBpZiAodHlwZW9mIGZlYXR1cmUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBsYXN0U3luY0RhdGUgPSBmZWF0dXJlLnN1YnN0cmluZyhmZWF0dXJlUHJlZml4Lmxlbmd0aCk7XG4gICAgICBjb25zb2xlLmRlYnVnKGBbJHtmZWF0dXJlTmFtZX1dIExhc3Qgc3luY2hyb25pemF0aW9uIGRhdGU6ICR7bGFzdFN5bmNEYXRlfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZmVhdHVyZU5hbWUsXG4gICAgICAgIGxhc3RTeW5jRGF0ZSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmZWF0dXJlO1xuICB9XG5cbiAgZ2V0T2ZmbGluZUZlYXR1cmVMYXN0U3luY0RhdGUoZmVhdHVyZU5hbWU6IHN0cmluZyk6IE1vbWVudCB7XG4gICAgY29uc3QgZmVhdHVyZSA9IHRoaXMuZ2V0T2ZmbGluZUZlYXR1cmUoZmVhdHVyZU5hbWUpO1xuICAgIHJldHVybiBmZWF0dXJlICYmIGZyb21EYXRlSVNPU3RyaW5nKGZlYXR1cmUubGFzdFN5bmNEYXRlKTtcbiAgfVxuXG4gIGhhc09mZmxpbmVGZWF0dXJlKGZlYXR1cmVOYW1lPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKGZlYXR1cmVOYW1lKSByZXR1cm4gaXNOb3ROaWwodGhpcy5nZXRPZmZsaW5lRmVhdHVyZShmZWF0dXJlTmFtZSkpO1xuICAgIHJldHVybiB0aGlzLl9kYXRhICYmIGlzTm90RW1wdHlBcnJheSh0aGlzLl9kYXRhLm9mZmxpbmVGZWF0dXJlcyk7XG4gIH1cblxuICBzYXZlT2ZmbGluZUZlYXR1cmUoZmVhdHVyZTogT2ZmbGluZUZlYXR1cmUpIHtcbiAgICB0aGlzLl9kYXRhID0gdGhpcy5fZGF0YSB8fCB0aGlzLmRlZmF1bHRTZXR0aW5ncztcbiAgICB0aGlzLl9kYXRhLm9mZmxpbmVGZWF0dXJlcyA9IHRoaXMuX2RhdGEub2ZmbGluZUZlYXR1cmVzIHx8IFtdO1xuXG4gICAgZmVhdHVyZS5uYW1lID0gZmVhdHVyZS5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBjb25zdCBmZWF0dXJlUHJlZml4ID0gZmVhdHVyZS5uYW1lICsgJyMnO1xuICAgIGNvbnN0IGV4aXN0aW5nSW5kZXggPSB0aGlzLl9kYXRhLm9mZmxpbmVGZWF0dXJlcy5maW5kSW5kZXgoKGYpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZiA9PT0gJ3N0cmluZycpIHJldHVybiBmLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChmZWF0dXJlUHJlZml4KTtcbiAgICAgIGlmIChmICYmIHR5cGVvZiBmID09PSAnb2JqZWN0JyAmJiBmLm5hbWUpIHJldHVybiBmLm5hbWUgPT09IGZlYXR1cmUubmFtZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2RhdGEub2ZmbGluZUZlYXR1cmVzW2V4aXN0aW5nSW5kZXhdID0gZmVhdHVyZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGF0YS5vZmZsaW5lRmVhdHVyZXMucHVzaChmZWF0dXJlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbG9jYWwgc2V0dGluZ3NcbiAgICB0aGlzLnBlcnNpc3RMb2NhbGx5KCk7XG4gIH1cblxuICBtYXJrT2ZmbGluZUZlYXR1cmVBc1N5bmMoZmVhdHVyZU5hbWU6IHN0cmluZykge1xuICAgIGxldCBmZWF0dXJlID0gdGhpcy5nZXRPZmZsaW5lRmVhdHVyZShmZWF0dXJlTmFtZSk7XG5cbiAgICBpZiAoIWZlYXR1cmUpIHtcbiAgICAgIGZlYXR1cmUgPSA8T2ZmbGluZUZlYXR1cmU+e1xuICAgICAgICBuYW1lOiBmZWF0dXJlTmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICBsYXN0U3luY0RhdGU6IERhdGVVdGlscy5tb21lbnQoKS50b0lTT1N0cmluZygpLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmVhdHVyZS5sYXN0U3luY0RhdGUgPSBEYXRlVXRpbHMubW9tZW50KCkudG9JU09TdHJpbmcoKTtcbiAgICB9XG5cbiAgICB0aGlzLnNhdmVPZmZsaW5lRmVhdHVyZShmZWF0dXJlKTtcbiAgfVxuXG4gIHJlbW92ZU9mZmxpbmVGZWF0dXJlcygpIHtcbiAgICBpZiAodGhpcy5fZGF0YSAmJiB0aGlzLl9kYXRhLm9mZmxpbmVGZWF0dXJlcykge1xuICAgICAgdGhpcy5fZGF0YS5vZmZsaW5lRmVhdHVyZXMgPSBbXTtcblxuICAgICAgLy8gVXBkYXRlIGxvY2FsIHNldHRpbmdzXG4gICAgICB0aGlzLnBlcnNpc3RMb2NhbGx5KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RmllbGREaXNwbGF5QXR0cmlidXRlcyhmaWVsZE5hbWU6IHN0cmluZywgZGVmYXVsdEF0dHJpYnV0ZXM/OiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2RhdGEgJiYgdGhpcy5fZGF0YS5wcm9wZXJ0aWVzICYmIHRoaXMuX2RhdGEucHJvcGVydGllc1tgc3VtYXJpcy5maWVsZC4ke2ZpZWxkTmFtZX0uYXR0cmlidXRlc2BdO1xuICAgIC8vIE5vdGhpbmcgZm91bmQgaW4gc2V0dGluZ3M6IHJldHVybiBkZWZhdWx0c1xuICAgIGlmICghdmFsdWUpIHJldHVybiBkZWZhdWx0QXR0cmlidXRlcyB8fCBbJ2xhYmVsJywgJ25hbWUnXTtcblxuICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpO1xuICB9XG5cbiAgZ2V0UGFnZUZpZWxkRGVmYXVsdFZhbHVlKHBhZ2VJZDogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFnZVNldHRpbmdzKHBhZ2VJZCwgYGZpZWxkLiR7ZmllbGROYW1lfS5kZWZhdWx0VmFsdWVgKTtcbiAgfVxuXG4gIGdldCBvcHRpb25EZWZzKCk6IEZvcm1GaWVsZERlZmluaXRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbkRlZnM7XG4gIH1cblxuICByZWdpc3Rlck9wdGlvbihkZWY6IEZvcm1GaWVsZERlZmluaXRpb24sIG9wdHM/OiB7IHJlcGxhY2VJZkV4aXN0cz86IGJvb2xlYW4gfSkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fb3B0aW9uRGVmcy5maW5kSW5kZXgoKGYpID0+IGYua2V5ID09PSBkZWYua2V5KTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICBpZiAob3B0cz8ucmVwbGFjZUlmRXhpc3RzICE9PSB0cnVlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQWRkaXRpb25hbCBhZGRpdGlvbmFsIHByb3BlcnR5IHske2RlZi5rZXl9fSBhbHJlYWR5IGRlZmluZS5gKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxhY2UgZXhpc3RpbmdcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW3NldHRpbmdzXSBVcGRhdGluZyBhZGRpdGlvbmFsIHByb3BlcnR5IHske2RlZi5rZXl9fWAsIGRlZik7XG4gICAgICB0aGlzLl9vcHRpb25EZWZzW2luZGV4XSA9IGRlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbc2V0dGluZ3NdIEFkZGluZyBhZGRpdGlvbmFsIHByb3BlcnR5IHske2RlZi5rZXl9fWAsIGRlZik7XG4gICAgICB0aGlzLl9vcHRpb25EZWZzLnB1c2goZGVmKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9wdGlvbnMoZGVmczogRm9ybUZpZWxkRGVmaW5pdGlvbltdKSB7XG4gICAgKGRlZnMgfHwgW10pLmZvckVhY2goKGRlZikgPT4gdGhpcy5yZWdpc3Rlck9wdGlvbihkZWYpKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFRvUGFnZUhpc3RvcnkoXG4gICAgcGFnZTogSGlzdG9yeVBhZ2VSZWZlcmVuY2UsXG4gICAgb3B0cz86IEFkZFRvUGFnZUhpc3RvcnlPcHRpb25zLFxuICAgIHBhZ2VIaXN0b3J5PzogSGlzdG9yeVBhZ2VSZWZlcmVuY2VbXSAvLyB1c2VkIGZvciByZWN1cnNpdmUgY2FsbCB0byBjaGlsZHJlblxuICApIHtcbiAgICAvLyBJZiBub3QgaW5zaWRlIHJlY3Vyc2l2ZSBjYWxsOiBmaWxsIHBhZ2UgaGlzdG9yeSBkZWZhdWx0c1xuICAgIGlmICghcGFnZUhpc3RvcnkpIHRoaXMuZmlsbFBhZ2VIaXN0b3J5RGVmYXVsdHMocGFnZSwgb3B0cyk7XG5cbiAgICBwYWdlSGlzdG9yeSA9IHBhZ2VIaXN0b3J5IHx8IHRoaXMuX2RhdGEucGFnZUhpc3Rvcnk7XG5cbiAgICBjb25zdCBpbmRleCA9IHBhZ2VIaXN0b3J5LmZpbmRJbmRleChcbiAgICAgIChwKSA9PlxuICAgICAgICAvLyBzYW1lIHBhdGhcbiAgICAgICAgcC5wYXRoID09PSBwYWdlLnBhdGggfHxcbiAgICAgICAgLy8gb3Igc3ViLXBhdGhcbiAgICAgICAgcGFnZS5wYXRoLnN0YXJ0c1dpdGgocC5wYXRoICsgJy8nKVxuICAgICk7XG5cbiAgICAvLyBOZXcgcGFnZTogaW5zZXJ0IGl0XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgLy9pZiAodGhpcy5fZGVidWcpXG4gICAgICBjb25zb2xlLmRlYnVnKCdbc2V0dGluZ3NdIEFkZGluZyBwYWdlIHRvIGhpc3Rvcnk6ICcsIHBhZ2UpO1xuXG4gICAgICAvLyBQcmVwZW5kIHRvIGxpc3RcbiAgICAgIHBhZ2VIaXN0b3J5LnNwbGljZSgwLCAwLCBwYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXhpc3RpbmdQYWdlID0gcGFnZUhpc3RvcnlbaW5kZXhdO1xuXG4gICAgICAvLyBTYW1lIHBhdGg6IHJlcGxhY2UgZXhpc3RpbmcgcGFnZVxuICAgICAgaWYgKHBhZ2VIaXN0b3J5W2luZGV4XS5wYXRoID09PSBwYWdlLnBhdGgpIHtcbiAgICAgICAgLy9pZiAodGhpcy5fZGVidWcpXG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1tzZXR0aW5nc10gVXBkYXRpbmcgZXhpc3RpbmcgcGFnZSBpbiBoaXN0b3J5OiAnLCBwYWdlKTtcbiAgICAgICAgcGFnZUhpc3Rvcnkuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAvLyBDb3B5IGV4aXRpbmcgY2hpbGRyZW5cbiAgICAgICAgcGFnZS5jaGlsZHJlbiA9IGV4aXN0aW5nUGFnZS5jaGlsZHJlbiB8fCBbXTtcblxuICAgICAgICAvLyBQcmVwZW5kIHRvIGxpc3RcbiAgICAgICAgcGFnZUhpc3Rvcnkuc3BsaWNlKDAsIDAsIHBhZ2UpO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3Qgc2FtZSBwYXRoIChzaG91bGQgYmUgYSBwYXJlbnQgcGFnZSlcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBDcmVhdGUgcGFyZW50J3MgY2hpbGRyZW4gYXJyYXksIGlmIG5vdCBleGlzdHNcbiAgICAgICAgZXhpc3RpbmdQYWdlLmNoaWxkcmVuID0gZXhpc3RpbmdQYWdlLmNoaWxkcmVuIHx8IFtdO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgcGFyZW50IHRpbWVcbiAgICAgICAgZXhpc3RpbmdQYWdlLnRpbWUgPSBwYWdlLnRpbWU7XG5cbiAgICAgICAgLy8gQWRkIHBhZ2UgYXMgcGFyZW50J3MgY2hpbGRyZW4gKHJlY3Vyc2l2ZSBjYWxsKVxuICAgICAgICBhd2FpdCB0aGlzLmFkZFRvUGFnZUhpc3RvcnkocGFnZSwgb3B0cywgZXhpc3RpbmdQYWdlLmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTYXZlIGxvY2FsbHkgKG9ubHkgaWYgbm90IGEgcmVjdXJzaXZlIGV4ZWN1dGlvbilcbiAgICBpZiAocGFnZUhpc3RvcnkgPT09IHRoaXMuX2RhdGEucGFnZUhpc3RvcnkpIHtcbiAgICAgIC8vIElmIG1heCBoYXMgYmVlbiByZWFjaGVkLCByZW1vdmUgb2xkIHBhZ2VzXG4gICAgICBpZiAodGhpcy5fZGF0YS5wYWdlSGlzdG9yeS5sZW5ndGggPiB0aGlzLl9kYXRhLnBhZ2VIaXN0b3J5TWF4U2l6ZSkge1xuICAgICAgICBjb25zdCByZW1vdmVkUGFnZXMgPSBwYWdlSGlzdG9yeS5zcGxpY2UodGhpcy5fZGF0YS5wYWdlSGlzdG9yeU1heFNpemUsIHBhZ2VIaXN0b3J5Lmxlbmd0aCAtIHRoaXMuX2RhdGEucGFnZUhpc3RvcnlNYXhTaXplKTtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW3NldHRpbmdzXSBQYWdlcyByZW1vdmVkIGZyb20gaGlzdG9yeTogJywgcmVtb3ZlZFBhZ2VzKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgbmV3IHZhbHVlXG4gICAgICBhd2FpdCB0aGlzLmFwcGx5UHJvcGVydHkoJ3BhZ2VIaXN0b3J5JywgcGFnZUhpc3RvcnkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVBhZ2VIaXN0b3J5KFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuOyBwZXJzaXN0SW1tZWRpYXRlPzogYm9vbGVhbiB9LFxuICAgIHBhZ2VIaXN0b3J5OiBIaXN0b3J5UGFnZVJlZmVyZW5jZVtdID0gdW5kZWZpbmVkLCAvLyB1c2VkIGZvciByZWN1cnNpdmUgY2FsbCB0byBjaGlsZHJlbilcbiAgICBkZXB0aCA9IDBcbiAgKSB7XG4gICAgY29uc3Qgcm9vdCA9IGRlcHRoID09PSAwO1xuICAgIHBhZ2VIaXN0b3J5ID0gcGFnZUhpc3RvcnkgfHwgdGhpcy5fZGF0YS5wYWdlSGlzdG9yeT8uc2xpY2UoKSAvKmNsb25lLCB0byBmb3JjZSBhcHBseSB0byBzYXZlICovIHx8IFtdO1xuXG4gICAgY29uc3QgaW5kZXggPSBwYWdlSGlzdG9yeS5maW5kSW5kZXgoKHApID0+IHAucGF0aCA9PT0gcGF0aCk7XG4gICAgbGV0IGZvdW5kID0gaW5kZXggIT09IC0xO1xuICAgIGlmIChmb3VuZCkge1xuICAgICAgY29uc29sZS5kZWJ1ZygnW3NldHRpbmdzXSBSZW1vdmUgcGFnZSBoaXN0b3J5OiAnLCBwYXRoKTtcbiAgICAgIC8vIFJlbW92ZSB2YWx1ZVxuICAgICAgcGFnZUhpc3Rvcnkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2VhcmNoIHBhdGggb24gY2hpbGRyZW4gKHN0b3Agd2hlbiBmb3VuZClcbiAgICAgIGZvdW5kID1cbiAgICAgICAgcGFnZUhpc3RvcnlcbiAgICAgICAgICAubWFwKChwKSA9PiBwLmNoaWxkcmVuKVxuICAgICAgICAgIC5maWx0ZXIoaXNOb3RFbXB0eUFycmF5KVxuICAgICAgICAgIC5maW5kSW5kZXgoKGNoaWxkcmVuKSA9PiB0aGlzLnJlbW92ZVBhZ2VIaXN0b3J5KHBhdGgsIG9wdHMsIGNoaWxkcmVuLCAoZGVwdGggfHwgMCkgKyAxKSkgIT09IC0xO1xuICAgIH1cblxuICAgIC8vIFNhdmUgbG9jYWxseSAob25seSBpZiByb290IGxldmVsKVxuICAgIGlmIChmb3VuZCAmJiByb290KSB7XG4gICAgICAvLyBBcHBseSBjaGFuZ2VzXG4gICAgICBhd2FpdCB0aGlzLmFwcGx5UHJvcGVydHkoJ3BhZ2VIaXN0b3J5JywgcGFnZUhpc3RvcnkpO1xuICAgIH1cblxuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyUGFnZUhpc3RvcnkoKSB7XG4gICAgLy8gUmVzZXQgYWxsIHBhZ2UgaGlzdG9yeVxuICAgIGF3YWl0IHRoaXMuYXBwbHlQcm9wZXJ0eSgncGFnZUhpc3RvcnknLCBbXSwgeyBwZXJzaXN0SW1tZWRpYXRlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyogLS0gUHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZXNldERhdGEoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXREYXRhKCkge1xuICAgIHRoaXMuX2RhdGEgPSB7IC4uLnRoaXMuX2RhdGEsIC4uLnRoaXMuZGVmYXVsdFNldHRpbmdzIH07XG5cbiAgICB0aGlzLl9kYXRhLmxvY2FsZSA9IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nIHx8IHRoaXMudHJhbnNsYXRlLmRlZmF1bHRMYW5nO1xuICAgIHRoaXMuX2RhdGEubW9iaWxlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2RhdGEudXNhZ2VNb2RlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2RhdGEucGFnZUhpc3RvcnkgPSBbXTtcblxuICAgIGNvbnN0IGRlZmF1bHRQZWVyID0gdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0UGVlciAmJiBQZWVyLmZyb21PYmplY3QodGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0UGVlcik7XG4gICAgdGhpcy5fZGF0YS5wZWVyVXJsID0gKGRlZmF1bHRQZWVyICYmIGRlZmF1bHRQZWVyLnVybCkgfHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHRoaXMuc3RhcnRlZCkgdGhpcy5vbkNoYW5nZS5uZXh0KHRoaXMuX2RhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBwZXJzaXN0TG9jYWxseShpbW1lZGlhdGU/OiBib29sZWFuKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBFeGVjdXRlIGltbWVkaWF0ZVxuICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgIGlmICghdGhpcy5fZGF0YSkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbc2V0dGluZ3NdIFJlbW92aW5nIGxvY2FsIHNldHRpbmdzIGZyb20gc3RvcmFnZScpO1xuICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLnJlbW92ZShTRVRUSU5HU19TVE9SQUdFX0tFWSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbc2V0dGluZ3NdIFN0b3JlIGxvY2FsIHNldHRpbmdzJywgdGhpcy5fZGF0YSk7XG4gICAgICAgIGlmICh0aGlzLl9zZXJpYWxpemVBc1N0cmluZykge1xuICAgICAgICAgIC8vIEZpeCBzZXJpYWxpemF0aW9uIGVycm9yLCBpbiBTdW1hcmlzLUFwcFxuICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2Uuc2V0KFNFVFRJTkdTX1NUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh0aGlzLl9kYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5zZXQoU0VUVElOR1NfU1RPUkFHRV9LRVksIHRoaXMuX2RhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV4ZWN1dGUgd2l0aCBkZWxheVxuICAgIGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIHRoZSBldmVudCBlbWl0dGVyXG4gICAgICBpZiAoIXRoaXMuXyRwZXJzaXN0KSB7XG4gICAgICAgIHRoaXMuXyRwZXJzaXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KHRydWUpO1xuICAgICAgICB0aGlzLl8kcGVyc2lzdFxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDIwMDApLCAvLyBhZGQgYSBkZWxheSBvZiAyc1xuICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuc3RhcnRlZClcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnBlcnNpc3RMb2NhbGx5KHRydWUpKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fJHBlcnNpc3QuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmlsbFBhZ2VIaXN0b3J5RGVmYXVsdHMoXG4gICAgcGFnZTogSGlzdG9yeVBhZ2VSZWZlcmVuY2UsXG4gICAgb3B0cz86IHtcbiAgICAgIHJlbW92ZVBhdGhRdWVyeVBhcmFtcz86IGJvb2xlYW47XG4gICAgICByZW1vdmVUaXRsZVNtYWxsVGFnPzogYm9vbGVhbjtcbiAgICB9XG4gICk6IEhpc3RvcnlQYWdlUmVmZXJlbmNlIHtcbiAgICBpZiAoIXBhZ2UgfHwgIXBhZ2UudGl0bGUgfHwgIXBhZ2UucGF0aCkgdGhyb3cgRXJyb3IoXCJNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50ICdwYWdlJywgJ3BhZ2UucGF0aCcgb3IgJ3BhZ2UudGl0bGUnXCIpO1xuXG4gICAgLy8gU2V0IHRpbWVcbiAgICBwYWdlLnRpbWUgPSBwYWdlLnRpbWUgfHwgRGF0ZVV0aWxzLm1vbWVudCgpO1xuXG4gICAgLy8gQ2xlYW4gdGhlIHRpdGxlIChyZW1vdmUgPHNtYWxsPiB0YWdzKVxuICAgIGlmICghb3B0cyB8fCBvcHRzLnJlbW92ZVRpdGxlU21hbGxUYWcgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB0YWdJbmRleCA9IHBhZ2UudGl0bGUuaW5kZXhPZignPC9zbWFsbD4nKTtcbiAgICAgIGlmICh0YWdJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgcGFnZS50aXRsZSA9IHBhZ2UudGl0bGUuc3Vic3RyaW5nKHRhZ0luZGV4ICsgJzwvc21hbGw+Jy5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgcGFnZS50aXRsZSA9IHBhZ2UudGl0bGUucmVwbGFjZSgvWyBdKmNsYXNzPSdoaWRkZW4teHMgaGlkZGVuLXNtJy9nLCAnJyk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHF1ZXJ5IHBhcmFtc1xuICAgIGlmICghb3B0cyB8fCBvcHRzLnJlbW92ZVBhdGhRdWVyeVBhcmFtcyAhPT0gZmFsc2UpIHtcbiAgICAgIHBhZ2UucGF0aCA9IHBhZ2UucGF0aC5yZXBsYWNlKC9bP10uKiQvLCAnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhZ2U7XG4gIH1cbn1cbiJdfQ==
@@ -1,4 +1,4 @@
1
1
  import { InjectionToken } from '@angular/core';
2
2
  export function isOnFieldMode(usageMode) { }
3
3
  export const APP_LOCALES = new InjectionToken('locales');
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3MubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvc2VydmljZXMvbW9kZWwvc2V0dGluZ3MubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUsvQyxNQUFNLFVBQVUsYUFBYSxDQUFDLFNBQW9CLElBQUcsQ0FBQztBQU10RCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxjQUFjLENBQWlCLFNBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJvcGVydGllc01hcCwgUHJvcGVydHkgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdHlwZXMnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhpc3RvcnlQYWdlUmVmZXJlbmNlIH0gZnJvbSAnLi9oaXN0b3J5Lm1vZGVsJztcblxuZXhwb3J0IHR5cGUgVXNhZ2VNb2RlID0gJ0RFU0snIHwgJ0ZJRUxEJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzT25GaWVsZE1vZGUodXNhZ2VNb2RlOiBVc2FnZU1vZGUpIHt9XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBMb2NhbGVDb25maWcgZXh0ZW5kcyBQcm9wZXJ0eSB7XG4gIGNvdW50cnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBBUFBfTE9DQUxFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxMb2NhbGVDb25maWdbXT4oJ2xvY2FsZXMnKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIE9mZmxpbmVGZWF0dXJlPEYgPSBhbnk+IHtcbiAgbmFtZTogc3RyaW5nO1xuICBsYXN0U3luY0RhdGU/OiBzdHJpbmc7XG4gIGZpbHRlcj86IEY7XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBMb2NhbFNldHRpbmdzIHtcbiAgcGFnZXM/OiBhbnk7XG4gIHBlZXJVcmw/OiBzdHJpbmc7XG4gIGxhdExvbmdGb3JtYXQ6ICdERE1NU1MnIHwgJ0RETU0nIHwgJ0REJztcbiAgYWNjb3VudEluaGVyaXRhbmNlPzogYm9vbGVhbjtcbiAgbG9jYWxlOiBzdHJpbmc7XG4gIHVzYWdlTW9kZT86IFVzYWdlTW9kZTtcbiAgbW9iaWxlPzogYm9vbGVhbjtcbiAgcHJvcGVydGllcz86IFByb3BlcnRpZXNNYXA7XG4gIHBhZ2VIaXN0b3J5PzogSGlzdG9yeVBhZ2VSZWZlcmVuY2VbXTtcbiAgb2ZmbGluZUZlYXR1cmVzPzogKHN0cmluZyB8IE9mZmxpbmVGZWF0dXJlKVtdO1xuICBwYWdlSGlzdG9yeU1heFNpemU6IG51bWJlcjtcbiAgZGFya01vZGU/OiBib29sZWFuO1xufVxuIl19
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dGluZ3MubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvc2VydmljZXMvbW9kZWwvc2V0dGluZ3MubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUsvQyxNQUFNLFVBQVUsYUFBYSxDQUFDLFNBQW9CLElBQUcsQ0FBQztBQU10RCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxjQUFjLENBQWlCLFNBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJvcGVydGllc01hcCwgUHJvcGVydHkgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdHlwZXMnO1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhpc3RvcnlQYWdlUmVmZXJlbmNlIH0gZnJvbSAnLi9oaXN0b3J5Lm1vZGVsJztcblxuZXhwb3J0IHR5cGUgVXNhZ2VNb2RlID0gJ0RFU0snIHwgJ0ZJRUxEJztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzT25GaWVsZE1vZGUodXNhZ2VNb2RlOiBVc2FnZU1vZGUpIHt9XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBMb2NhbGVDb25maWcgZXh0ZW5kcyBQcm9wZXJ0eSB7XG4gIGNvdW50cnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBBUFBfTE9DQUxFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxMb2NhbGVDb25maWdbXT4oJ2xvY2FsZXMnKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIE9mZmxpbmVGZWF0dXJlPEYgPSBhbnk+IHtcbiAgbmFtZTogc3RyaW5nO1xuICBsYXN0U3luY0RhdGU/OiBzdHJpbmc7XG4gIGZpbHRlcj86IEY7XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBMb2NhbFNldHRpbmdzIHtcbiAgcGFnZXM/OiBhbnk7XG4gIHBlZXJVcmw/OiBzdHJpbmc7XG4gIGxhdExvbmdGb3JtYXQ6ICdERE1NU1MnIHwgJ0RETU0nIHwgJ0REJztcbiAgYWNjb3VudEluaGVyaXRhbmNlPzogYm9vbGVhbjtcbiAgbG9jYWxlOiBzdHJpbmc7XG4gIHVzYWdlTW9kZT86IFVzYWdlTW9kZTtcbiAgbW9iaWxlPzogYm9vbGVhbjtcbiAgcHJvcGVydGllcz86IFByb3BlcnRpZXNNYXAgfCBQcm9wZXJ0eVtdO1xuICBwYWdlSGlzdG9yeT86IEhpc3RvcnlQYWdlUmVmZXJlbmNlW107XG4gIG9mZmxpbmVGZWF0dXJlcz86IChzdHJpbmcgfCBPZmZsaW5lRmVhdHVyZSlbXTtcbiAgcGFnZUhpc3RvcnlNYXhTaXplOiBudW1iZXI7XG4gIGRhcmtNb2RlPzogYm9vbGVhbjtcbn1cbiJdfQ==
@@ -2,9 +2,7 @@ import { Injectable } from '@angular/core';
2
2
  import { Validators } from '@angular/forms';
3
3
  import { SharedValidators } from '../../../shared/validator/validators';
4
4
  import { AppValidatorService } from './base.validator.class';
5
- import { isNotEmptyArray, toBoolean } from '../../../shared/functions';
6
- import { AppFormArray } from '../../form/array/form-array';
7
- import { AppPropertiesUtils } from '../../form/properties/properties.utils';
5
+ import { toBoolean } from '../../../shared/functions';
8
6
  import * as i0 from "@angular/core";
9
7
  import * as i1 from "@angular/forms";
10
8
  import * as i2 from "../../form/properties/property.validator";
@@ -17,7 +15,7 @@ export class LocalSettingsValidatorService extends AppValidatorService {
17
15
  this.propertyValidator = propertyValidator;
18
16
  this.networkService = networkService;
19
17
  }
20
- getFormGroup(data) {
18
+ getFormGroup(data, opts) {
21
19
  return this.formBuilder.group({
22
20
  accountInheritance: [toBoolean(data?.accountInheritance, true), Validators.required],
23
21
  locale: [data?.locale || null, Validators.required],
@@ -25,29 +23,11 @@ export class LocalSettingsValidatorService extends AppValidatorService {
25
23
  latLongFormat: [data?.latLongFormat || null, Validators.required],
26
24
  usageMode: [data?.usageMode || 'DESK', Validators.required],
27
25
  peerUrl: [data?.peerUrl || null, Validators.required],
28
- properties: this.getPropertiesArray(data?.properties),
26
+ properties: this.propertyValidator.getFormArray(data?.properties, opts),
29
27
  }, {
30
28
  asyncValidators: (group) => this.peerAlive(group.get('peerUrl')),
31
29
  });
32
30
  }
33
- getPropertiesArray(data) {
34
- const fromArray = new AppFormArray((value) => this.propertyValidator.getFormGroup(value, { valueMaxLength: 2000 }), (v1, v2) => this.propertyValidator.equals(v1, v2), (value) => this.propertyValidator.isEmpty(value), {
35
- allowReuseControls: false,
36
- allowEmptyArray: true,
37
- });
38
- if (data) {
39
- const values = AppPropertiesUtils.arrayFromObject(data);
40
- if (isNotEmptyArray(values))
41
- fromArray.patchValue(values);
42
- }
43
- return fromArray;
44
- }
45
- getPropertyFormGroup(data) {
46
- return this.formBuilder.group({
47
- key: [(data && data.key) || null, Validators.compose([Validators.required, Validators.maxLength(50)])],
48
- value: [(data && data.value) || null, Validators.compose([Validators.required, Validators.maxLength(2000)])],
49
- });
50
- }
51
31
  /* -- protected methods -- */
52
32
  async peerAlive(peerUrlControl) {
53
33
  // Offline mode: no error
@@ -78,4 +58,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
78
58
  type: Injectable,
79
59
  args: [{ providedIn: 'root' }]
80
60
  }], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i2.PropertyValidator }, { type: i3.NetworkService }] });
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtc2V0dGluZ3MudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3NlcnZpY2VzL3ZhbGlkYXRvci9sb2NhbC1zZXR0aW5ncy52YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQTJFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7OztBQUc1RSxNQUFNLE9BQU8sNkJBQThCLFNBQVEsbUJBQWtDO0lBR3pFO0lBQ0E7SUFIVixZQUNFLFdBQStCLEVBQ3ZCLGlCQUFvQyxFQUNwQyxjQUE4QjtRQUV0QyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFIWCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtJQUd4QyxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQW9CO1FBQy9CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQzNCO1lBQ0Usa0JBQWtCLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDcEYsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxJQUFJLEVBQUUsVUFBVSxD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QixjQUFjLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztnQkFDN0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDM0IsY0FBYyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRCx3REFBd0Q7Z0JBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUNELHFDQUFxQztpQkFDaEMsQ0FBQztnQkFDSixnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzt1R0F4RVUsNkJBQTZCOzJHQUE3Qiw2QkFBNkIsY0FEaEIsTUFBTTs7MkZBQ25CLDZCQUE2QjtrQkFEekMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3MgfSBmcm9tICcuLi9tb2RlbC9zZXR0aW5ncy5tb2RlbCc7XG5pbXBvcnQgeyBTaGFyZWRWYWxpZGF0b3JzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3ZhbGlkYXRvci92YWxpZGF0b3JzJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICcuL2Jhc2UudmFsaWRhdG9yLmNsYXNzJztcbmltcG9ydCB7IGlzTm90RW1wdHlBcnJheSwgdG9Cb29sZWFuIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBBcHBGb3JtQXJyYXkgfSBmcm9tICcuLi8uLi9mb3JtL2FycmF5L2Zvcm0tYXJyYXknO1xuaW1wb3J0IHsgUHJvcGVydHkgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdHlwZXMnO1xuaW1wb3J0IHsgUHJvcGVydHlWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9mb3JtL3Byb3BlcnRpZXMvcHJvcGVydHkudmFsaWRhdG9yJztcbmltcG9ydCB7IEFwcFByb3BlcnRpZXNVdGlscyB9IGZyb20gJy4uLy4uL2Zvcm0vcHJvcGVydGllcy9wcm9wZXJ0aWVzLnV0aWxzJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBMb2NhbFNldHRpbmdzVmFsaWRhdG9yU2VydmljZSBleHRlbmRzIEFwcFZhbGlkYXRvclNlcnZpY2U8TG9jYWxTZXR0aW5ncz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcHJvcGVydHlWYWxpZGF0b3I6IFByb3BlcnR5VmFsaWRhdG9yLFxuICAgIHByaXZhdGUgbmV0d29ya1NlcnZpY2U6IE5ldHdvcmtTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGZvcm1CdWlsZGVyKTtcbiAgfVxuXG4gIGdldEZvcm1Hcm91cChkYXRhPzogTG9jYWxTZXR0aW5ncyk6IFVudHlwZWRGb3JtR3JvdXAge1xuICAgIHJldHVybiB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKFxuICAgICAge1xuICAgICAgICBhY2NvdW50SW5oZXJpdGFuY2U6IFt0b0Jvb2xlYW4oZGF0YT8uYWNjb3VudEluaGVyaXRhbmNlLCB0cnVlKSwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIGxvY2FsZTogW2RhdGE/LmxvY2FsZSB8fCBudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgZGFya01vZGU6IFt0b0Jvb2xlYW4oZGF0YT8uZGFya01vZGUsIG51bGwpXSxcbiAgICAgICAgbGF0TG9uZ0Zvcm1hdDogW2RhdGE/LmxhdExvbmdGb3JtYXQgfHwgbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIHVzYWdlTW9kZTogW2RhdGE/LnVzYWdlTW9kZSB8fCAnREVTSycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBwZWVyVXJsOiBbZGF0YT8ucGVlclVybCB8fCBudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgcHJvcGVydGllczogdGhpcy5nZXRQcm9wZXJ0aWVzQXJyYXkoZGF0YT8ucHJvcGVydGllcyksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBhc3luY1ZhbGlkYXRvcnM6IChncm91cDogVW50eXBlZEZvcm1Hcm91cCkgPT4gdGhpcy5wZWVyQWxpdmUoZ3JvdXAuZ2V0KCdwZWVyVXJsJykpLFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBnZXRQcm9wZXJ0aWVzQXJyYXkoZGF0YT86IGFueSkge1xuICAgIGNvbnN0IGZyb21BcnJheSA9IG5ldyBBcHBGb3JtQXJyYXk8UHJvcGVydHksIFVudHlwZWRGb3JtR3JvdXA+KFxuICAgICAgKHZhbHVlKSA9PiB0aGlzLnByb3BlcnR5VmFsaWRhdG9yLmdldEZvcm1Hcm91cCh2YWx1ZSwgeyB2YWx1ZU1heExlbmd0aDogMjAwMCB9KSxcbiAgICAgICh2MSwgdjIpID0+IHRoaXMucHJvcGVydHlWYWxpZGF0b3IuZXF1YWxzKHYxLCB2MiksXG4gICAgICAodmFsdWUpID0+IHRoaXMucHJvcGVydHlWYWxpZGF0b3IuaXNFbXB0eSh2YWx1ZSksXG4gICAgICB7XG4gICAgICAgIGFsbG93UmV1c2VDb250cm9sczogZmFsc2UsXG4gICAgICAgIGFsbG93RW1wdHlBcnJheTogdHJ1ZSxcbiAgICAgIH1cbiAgICApO1xuICAgIGlmIChkYXRhKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBBcHBQcm9wZXJ0aWVzVXRpbHMuYXJyYXlGcm9tT2JqZWN0KGRhdGEpO1xuICAgICAgaWYgKGlzTm90RW1wdHlBcnJheSh2YWx1ZXMpKSBmcm9tQXJyYXkucGF0Y2hWYWx1ZSh2YWx1ZXMpO1xuICAgIH1cbiAgICByZXR1cm4gZnJvbUFycmF5O1xuICB9XG5cbiAgZ2V0UHJvcGVydHlGb3JtR3JvdXAoZGF0YT86IHsga2V5OiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nIH0pOiBVbnR5cGVkRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICBrZXk6IFsoZGF0YSAmJiBkYXRhLmtleSkgfHwgbnVsbCwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCg1MCldKV0sXG4gICAgICB2YWx1ZTogWyhkYXRhICYmIGRhdGEudmFsdWUpIHx8IG51bGwsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjAwMCldKV0sXG4gICAgfSk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBhc3luYyBwZWVyQWxpdmUocGVlclVybENvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFByb21pc2U8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+IHtcbiAgICAvLyBPZmZsaW5lIG1vZGU6IG5vIGVycm9yXG4gICAgaWYgKHRoaXMubmV0d29ya1NlcnZpY2Uub2ZmbGluZSkge1xuICAgICAgU2hhcmVkVmFsaWRhdG9ycy5jbGVhckVycm9yKHBlZXJVcmxDb250cm9sLCAncGVlckFsaXZlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFsaXZlID0gYXdhaXQgdGhpcy5uZXR3b3JrU2VydmljZS5jaGVja1BlZXJBbGl2ZShwZWVyVXJsQ29udHJvbC52YWx1ZSk7XG4gICAgICAvLyBLTzogYWRkIGEgdmFsaWRhdGlvbiBlcnJvclxuICAgICAgaWYgKCFhbGl2ZSkge1xuICAgICAgICBjb25zdCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgPSBwZWVyVXJsQ29udHJvbC5lcnJvcnMgfHwge307XG4gICAgICAgIGVycm9yc1sncGVlckFsaXZlJ10gPSB0cnVlO1xuICAgICAgICBwZWVyVXJsQ29udHJvbC5zZXRFcnJvcnMoZXJyb3JzKTtcbiAgICAgICAgcGVlclVybENvbnRyb2wubWFya0FzVG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICAvLyBSZXR1cm4gdGhlIGVycm9yIChzaG91bGQgYmUgYXBwbHkgdG8gdGhlIHBhcmVudCBmb3JtKVxuICAgICAgICByZXR1cm4geyBwZWVyQWxpdmU6IHRydWUgfTtcbiAgICAgIH1cbiAgICAgIC8vIE9LOiByZW1vdmUgdGhlIGV4aXN0aW5nIG9uIGNvbnRyb2xcbiAgICAgIGVsc2Uge1xuICAgICAgICBTaGFyZWRWYWxpZGF0b3JzLmNsZWFyRXJyb3IocGVlclVybENvbnRyb2wsICdwZWVyQWxpdmUnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtc2V0dGluZ3MudmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3NlcnZpY2VzL3ZhbGlkYXRvci9sb2NhbC1zZXR0aW5ncy52YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQTJFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7QUFLdEQsTUFBTSxPQUFPLDZCQUE4QixTQUFRLG1CQUFrQztJQUd6RTtJQUNBO0lBSFYsWUFDRSxXQUErQixFQUN2QixpQkFBb0MsRUFDcEMsY0FBOEI7UUFFdEMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBSFgsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7SUFHeEMsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFvQixFQUFFLElBQThDO1FBQy9FLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQzNCO1lBQ0Usa0JBQWtCLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDcEYsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNuRCxRQUFRLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxJQUFJLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ2pFLFNBQVMsRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLElBQUksTUFBTSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDM0QsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNyRCxVQUFVLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQztTQUN4RSxFQUNEO1lBQ0UsZUFBZSxFQUFFLENBQUMsS0FBdUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ25GLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCw2QkFBNkI7SUFFbkIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxjQUErQjtRQUN2RCx5QkFBeUI7UUFDekIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDM0QsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RSw2QkFBNkI7WUFDN0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLE1BQU0sTUFBTSxHQUFxQixjQUFjLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztnQkFDN0QsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDM0IsY0FBYyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRCx3REFBd0Q7Z0JBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUNELHFDQUFxQztpQkFDaEMsQ0FBQztnQkFDSixnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzt1R0FoRFUsNkJBQTZCOzJHQUE3Qiw2QkFBNkIsY0FEaEIsTUFBTTs7MkZBQ25CLDZCQUE2QjtrQkFEekMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3MgfSBmcm9tICcuLi9tb2RlbC9zZXR0aW5ncy5tb2RlbCc7XG5pbXBvcnQgeyBTaGFyZWRWYWxpZGF0b3JzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3ZhbGlkYXRvci92YWxpZGF0b3JzJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICcuL2Jhc2UudmFsaWRhdG9yLmNsYXNzJztcbmltcG9ydCB7IHRvQm9vbGVhbiB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgUHJvcGVydHlWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9mb3JtL3Byb3BlcnRpZXMvcHJvcGVydHkudmFsaWRhdG9yJztcbmltcG9ydCB7IEZvcm1GaWVsZERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZm9ybS9maWVsZC5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTG9jYWxTZXR0aW5nc1ZhbGlkYXRvclNlcnZpY2UgZXh0ZW5kcyBBcHBWYWxpZGF0b3JTZXJ2aWNlPExvY2FsU2V0dGluZ3M+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIHByb3BlcnR5VmFsaWRhdG9yOiBQcm9wZXJ0eVZhbGlkYXRvcixcbiAgICBwcml2YXRlIG5ldHdvcmtTZXJ2aWNlOiBOZXR3b3JrU2VydmljZVxuICApIHtcbiAgICBzdXBlcihmb3JtQnVpbGRlcik7XG4gIH1cblxuICBnZXRGb3JtR3JvdXAoZGF0YT86IExvY2FsU2V0dGluZ3MsIG9wdHM/OiB7IGRlZmluaXRpb25zPzogRm9ybUZpZWxkRGVmaW5pdGlvbltdIH0pOiBVbnR5cGVkRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtQnVpbGRlci5ncm91cChcbiAgICAgIHtcbiAgICAgICAgYWNjb3VudEluaGVyaXRhbmNlOiBbdG9Cb29sZWFuKGRhdGE/LmFjY291bnRJbmhlcml0YW5jZSwgdHJ1ZSksIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBsb2NhbGU6IFtkYXRhPy5sb2NhbGUgfHwgbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIGRhcmtNb2RlOiBbdG9Cb29sZWFuKGRhdGE/LmRhcmtNb2RlLCBudWxsKV0sXG4gICAgICAgIGxhdExvbmdGb3JtYXQ6IFtkYXRhPy5sYXRMb25nRm9ybWF0IHx8IG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICB1c2FnZU1vZGU6IFtkYXRhPy51c2FnZU1vZGUgfHwgJ0RFU0snLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgcGVlclVybDogW2RhdGE/LnBlZXJVcmwgfHwgbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydHlWYWxpZGF0b3IuZ2V0Rm9ybUFycmF5KGRhdGE/LnByb3BlcnRpZXMsIG9wdHMpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYXN5bmNWYWxpZGF0b3JzOiAoZ3JvdXA6IFVudHlwZWRGb3JtR3JvdXApID0+IHRoaXMucGVlckFsaXZlKGdyb3VwLmdldCgncGVlclVybCcpKSxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgYXN5bmMgcGVlckFsaXZlKHBlZXJVcmxDb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBQcm9taXNlPFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPiB7XG4gICAgLy8gT2ZmbGluZSBtb2RlOiBubyBlcnJvclxuICAgIGlmICh0aGlzLm5ldHdvcmtTZXJ2aWNlLm9mZmxpbmUpIHtcbiAgICAgIFNoYXJlZFZhbGlkYXRvcnMuY2xlYXJFcnJvcihwZWVyVXJsQ29udHJvbCwgJ3BlZXJBbGl2ZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhbGl2ZSA9IGF3YWl0IHRoaXMubmV0d29ya1NlcnZpY2UuY2hlY2tQZWVyQWxpdmUocGVlclVybENvbnRyb2wudmFsdWUpO1xuICAgICAgLy8gS086IGFkZCBhIHZhbGlkYXRpb24gZXJyb3JcbiAgICAgIGlmICghYWxpdmUpIHtcbiAgICAgICAgY29uc3QgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzID0gcGVlclVybENvbnRyb2wuZXJyb3JzIHx8IHt9O1xuICAgICAgICBlcnJvcnNbJ3BlZXJBbGl2ZSddID0gdHJ1ZTtcbiAgICAgICAgcGVlclVybENvbnRyb2wuc2V0RXJyb3JzKGVycm9ycyk7XG4gICAgICAgIHBlZXJVcmxDb250cm9sLm1hcmtBc1RvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBlcnJvciAoc2hvdWxkIGJlIGFwcGx5IHRvIHRoZSBwYXJlbnQgZm9ybSlcbiAgICAgICAgcmV0dXJuIHsgcGVlckFsaXZlOiB0cnVlIH07XG4gICAgICB9XG4gICAgICAvLyBPSzogcmVtb3ZlIHRoZSBleGlzdGluZyBvbiBjb250cm9sXG4gICAgICBlbHNlIHtcbiAgICAgICAgU2hhcmVkVmFsaWRhdG9ycy5jbGVhckVycm9yKHBlZXJVcmxDb250cm9sLCAncGVlckFsaXZlJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=