@sumaris-net/ngx-components 2.12.16-rc2 → 2.12.16-rc4

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 (60) hide show
  1. package/esm2022/public_api.mjs +5 -1
  2. package/esm2022/src/app/admin/users/users.mjs +3 -3
  3. package/esm2022/src/app/core/account/account.module.mjs +17 -4
  4. package/esm2022/src/app/core/account/account.page.mjs +14 -5
  5. package/esm2022/src/app/core/account/password/change-password.form.mjs +60 -0
  6. package/esm2022/src/app/core/account/password/change-password.module.mjs +22 -0
  7. package/esm2022/src/app/core/account/password/change-password.page.mjs +144 -0
  8. package/esm2022/src/app/core/auth/auth.form.mjs +41 -22
  9. package/esm2022/src/app/core/auth/auth.module.mjs +14 -5
  10. package/esm2022/src/app/core/auth/reset-password.modal.mjs +77 -0
  11. package/esm2022/src/app/core/core.module.mjs +5 -1
  12. package/esm2022/src/app/core/form/form.module.mjs +7 -3
  13. package/esm2022/src/app/core/form/username/username.form.mjs +52 -0
  14. package/esm2022/src/app/core/form/username/username.module.mjs +20 -0
  15. package/esm2022/src/app/core/home/home.mjs +23 -9
  16. package/esm2022/src/app/core/register/register-confirm.page.mjs +10 -8
  17. package/esm2022/src/app/core/register/register.form.mjs +3 -3
  18. package/esm2022/src/app/core/services/account.service.mjs +96 -12
  19. package/esm2022/src/app/core/services/config/core.config.mjs +7 -1
  20. package/esm2022/src/app/core/services/errors.mjs +2 -1
  21. package/esm2022/src/app/core/settings/settings.page.mjs +3 -3
  22. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +1 -1
  23. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +55 -72
  24. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +3 -3
  25. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +5 -4
  26. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +2 -2
  27. package/esm2022/src/app/shared/toolbar/toolbar.mjs +13 -8
  28. package/esm2022/src/app/shared/validator/validators.mjs +13 -1
  29. package/esm2022/src/environments/environment.mjs +12 -6
  30. package/fesm2022/sumaris-net.ngx-components.mjs +714 -237
  31. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  32. package/package.json +5 -4
  33. package/public_api.d.ts +4 -0
  34. package/src/app/core/account/account.module.d.ts +2 -1
  35. package/src/app/core/account/account.page.d.ts +23 -14
  36. package/src/app/core/account/password/change-password.form.d.ts +19 -0
  37. package/src/app/core/account/password/change-password.module.d.ts +11 -0
  38. package/src/app/core/account/password/change-password.page.d.ts +36 -0
  39. package/src/app/core/auth/auth.form.d.ts +11 -9
  40. package/src/app/core/auth/auth.module.d.ts +6 -4
  41. package/src/app/core/auth/reset-password.modal.d.ts +26 -0
  42. package/src/app/core/core.module.d.ts +2 -1
  43. package/src/app/core/form/form.module.d.ts +2 -1
  44. package/src/app/core/form/username/username.form.d.ts +19 -0
  45. package/src/app/core/form/username/username.module.d.ts +9 -0
  46. package/src/app/core/home/home.d.ts +9 -1
  47. package/src/app/core/services/account.service.d.ts +8 -0
  48. package/src/app/core/services/config/core.config.d.ts +1 -0
  49. package/src/app/core/services/errors.d.ts +1 -0
  50. package/src/app/shared/inputs.d.ts +1 -1
  51. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +1 -0
  52. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +2 -0
  53. package/src/app/shared/toolbar/toolbar.d.ts +5 -0
  54. package/src/app/shared/validator/validators.d.ts +2 -0
  55. package/src/assets/i18n/en-US.json +26 -12
  56. package/src/assets/i18n/en.json +26 -13
  57. package/src/assets/i18n/fr.json +20 -9
  58. package/src/assets/manifest.json +1 -1
  59. package/src/theme/_ionic.globals.scss +1 -0
  60. package/src/theme/_mixins.scss +1 -0
@@ -0,0 +1,60 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
+ import { UntypedFormControl, Validators } from '@angular/forms';
3
+ import { AppForm } from '../../form/form.class';
4
+ import { SharedValidators } from '../../../shared/validator/validators';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ import * as i2 from "@angular/common";
8
+ import * as i3 from "@angular/material/form-field";
9
+ import * as i4 from "@angular/material/input";
10
+ import * as i5 from "@angular/material/icon";
11
+ import * as i6 from "@angular/material/button";
12
+ import * as i7 from "@ngx-translate/core";
13
+ export class ChangePasswordForm extends AppForm {
14
+ cd;
15
+ showPwd = false;
16
+ showConfirmPwd = false;
17
+ usernamePlaceholder;
18
+ emailValidator = false;
19
+ set username(value) {
20
+ this.form.get('username').setValue(value);
21
+ }
22
+ get username() {
23
+ return this.form.get('username').value;
24
+ }
25
+ constructor(injector, formBuilder, cd) {
26
+ super(injector, formBuilder.group({
27
+ username: new UntypedFormControl(null, Validators.required),
28
+ password: new UntypedFormControl(null, Validators.compose([Validators.required, Validators.minLength(8)])),
29
+ confirmPassword: new UntypedFormControl(null, Validators.compose([Validators.required, SharedValidators.equals('password')])),
30
+ }));
31
+ this.cd = cd;
32
+ }
33
+ ngOnInit() {
34
+ super.ngOnInit();
35
+ // Add/remove email validator
36
+ const usernNameControl = this.form.get('username');
37
+ if (this.emailValidator && !usernNameControl.hasValidator(Validators.email)) {
38
+ usernNameControl.addValidators(Validators.email);
39
+ }
40
+ else if (!this.emailValidator && usernNameControl.hasValidator(Validators.email)) {
41
+ usernNameControl.removeValidators(Validators.email);
42
+ }
43
+ }
44
+ markForCheck() {
45
+ this.cd.markForCheck();
46
+ }
47
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChangePasswordForm, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
48
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ChangePasswordForm, selector: "app-change-password-form", inputs: { usernamePlaceholder: "usernamePlaceholder", emailValidator: "emailValidator", username: "username" }, usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\" class=\"form-container\">\n <!-- Username -->\n <mat-form-field>\n <mat-label>{{ usernamePlaceholder | translate }}</mat-label>\n <input matInput formControlName=\"username\" readonly />\n\n <mat-error *ngIf=\"form.controls.username.hasError('required') && form.controls.username.touched\">\n {{ 'ERROR.FIELD_REQUIRED' | translate }}\n </mat-error>\n <mat-error *ngIf=\"form.controls.username.hasError('username') && form.controls.username.touched\">\n {{ 'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}\n </mat-error>\n </mat-form-field>\n\n <!-- Password -->\n <mat-form-field>\n <mat-label>{{ 'REGISTER.STEP_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=\"form.controls.password.hasError('required') && form.controls.password.touched\">\n {{ 'ERROR.FIELD_REQUIRED' | translate }}\n </mat-error>\n <mat-error *ngIf=\"form.controls.password.hasError('minlength') && form.controls.password.touched\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: form.controls.password.errors.minlength }}</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=\"form.controls.confirmPassword.hasError('required') && form.controls.confirmPassword.touched\">\n {{ 'ERROR.FIELD_REQUIRED' | translate }}\n </mat-error>\n <mat-error *ngIf=\"form.controls.confirmPassword.hasError('equals') && form.controls.confirmPassword.touched\">\n <span>{{ 'REGISTER.ERROR.NOT_SAME_PASSWORD' | translate }}</span>\n </mat-error>\n </mat-form-field>\n</form>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.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: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
49
+ }
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChangePasswordForm, decorators: [{
51
+ type: Component,
52
+ args: [{ selector: 'app-change-password-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\" class=\"form-container\">\n <!-- Username -->\n <mat-form-field>\n <mat-label>{{ usernamePlaceholder | translate }}</mat-label>\n <input matInput formControlName=\"username\" readonly />\n\n <mat-error *ngIf=\"form.controls.username.hasError('required') && form.controls.username.touched\">\n {{ 'ERROR.FIELD_REQUIRED' | translate }}\n </mat-error>\n <mat-error *ngIf=\"form.controls.username.hasError('username') && form.controls.username.touched\">\n {{ 'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}\n </mat-error>\n </mat-form-field>\n\n <!-- Password -->\n <mat-form-field>\n <mat-label>{{ 'REGISTER.STEP_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=\"form.controls.password.hasError('required') && form.controls.password.touched\">\n {{ 'ERROR.FIELD_REQUIRED' | translate }}\n </mat-error>\n <mat-error *ngIf=\"form.controls.password.hasError('minlength') && form.controls.password.touched\">\n <span>{{ 'ERROR.FIELD_MIN_LENGTH' | translate: form.controls.password.errors.minlength }}</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=\"form.controls.confirmPassword.hasError('required') && form.controls.confirmPassword.touched\">\n {{ 'ERROR.FIELD_REQUIRED' | translate }}\n </mat-error>\n <mat-error *ngIf=\"form.controls.confirmPassword.hasError('equals') && form.controls.confirmPassword.touched\">\n <span>{{ 'REGISTER.ERROR.NOT_SAME_PASSWORD' | translate }}</span>\n </mat-error>\n </mat-form-field>\n</form>\n" }]
53
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }], propDecorators: { usernamePlaceholder: [{
54
+ type: Input
55
+ }], emailValidator: [{
56
+ type: Input
57
+ }], username: [{
58
+ type: Input
59
+ }] } });
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLXBhc3N3b3JkLmZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvYWNjb3VudC9wYXNzd29yZC9jaGFuZ2UtcGFzc3dvcmQuZm9ybS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9hY2NvdW50L3Bhc3N3b3JkL2NoYW5nZS1wYXNzd29yZC5mb3JtLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQVksS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQy9HLE9BQU8sRUFBc0Isa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7Ozs7Ozs7QUFTeEUsTUFBTSxPQUFPLGtCQUFtQixTQUFRLE9BQWlCO0lBa0I3QztJQWpCQSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFFeEIsbUJBQW1CLENBQVM7SUFDNUIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUVoQyxJQUFhLFFBQVEsQ0FBQyxLQUFhO1FBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDekMsQ0FBQztJQUVELFlBQ0UsUUFBa0IsRUFDbEIsV0FBK0IsRUFDdkIsRUFBcUI7UUFFN0IsS0FBSyxDQUNILFFBQVEsRUFDUixXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ2hCLFFBQVEsRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQzNELFFBQVEsRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRyxlQUFlLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM5SCxDQUFDLENBQ0gsQ0FBQztRQVRNLE9BQUUsR0FBRixFQUFFLENBQW1CO0lBVS9CLENBQUM7SUFFRCxRQUFRO1FBQ04sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRWpCLDZCQUE2QjtRQUM3QixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25ELElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1RSxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25ELENBQUM7YUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkYsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RELENBQUM7SUFDSCxDQUFDO0lBRVMsWUFBWTtRQUNwQixJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pCLENBQUM7d0dBNUNVLGtCQUFrQjs0RkFBbEIsa0JBQWtCLHVNQ1ovQix3NUVBd0RBOzs0RkQ1Q2Esa0JBQWtCO2tCQU45QixTQUFTOytCQUNFLDBCQUEwQixtQkFHbkIsdUJBQXVCLENBQUMsTUFBTTs4SUFNdEMsbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRU8sUUFBUTtzQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBcHBGb3JtIH0gZnJvbSAnLi4vLi4vZm9ybS9mb3JtLmNsYXNzJztcbmltcG9ydCB7IFNoYXJlZFZhbGlkYXRvcnMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdmFsaWRhdG9yL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgQXV0aERhdGEgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hY2NvdW50LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtY2hhbmdlLXBhc3N3b3JkLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJ2NoYW5nZS1wYXNzd29yZC5mb3JtLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGFuZ2UtcGFzc3dvcmQuZm9ybS5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFuZ2VQYXNzd29yZEZvcm0gZXh0ZW5kcyBBcHBGb3JtPEF1dGhEYXRhPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByb3RlY3RlZCBzaG93UHdkID0gZmFsc2U7XG4gIHByb3RlY3RlZCBzaG93Q29uZmlybVB3ZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHVzZXJuYW1lUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgZW1haWxWYWxpZGF0b3IgPSBmYWxzZTtcblxuICBASW5wdXQoKSBzZXQgdXNlcm5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZm9ybS5nZXQoJ3VzZXJuYW1lJykuc2V0VmFsdWUodmFsdWUpO1xuICB9XG5cbiAgZ2V0IHVzZXJuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ3VzZXJuYW1lJykudmFsdWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIGluamVjdG9yLFxuICAgICAgZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICB1c2VybmFtZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgICAgcGFzc3dvcmQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg4KV0pKSxcbiAgICAgICAgY29uZmlybVBhc3N3b3JkOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKG51bGwsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZCwgU2hhcmVkVmFsaWRhdG9ycy5lcXVhbHMoJ3Bhc3N3b3JkJyldKSksXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgLy8gQWRkL3JlbW92ZSBlbWFpbCB2YWxpZGF0b3JcbiAgICBjb25zdCB1c2Vybk5hbWVDb250cm9sID0gdGhpcy5mb3JtLmdldCgndXNlcm5hbWUnKTtcbiAgICBpZiAodGhpcy5lbWFpbFZhbGlkYXRvciAmJiAhdXNlcm5OYW1lQ29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5lbWFpbCkpIHtcbiAgICAgIHVzZXJuTmFtZUNvbnRyb2wuYWRkVmFsaWRhdG9ycyhWYWxpZGF0b3JzLmVtYWlsKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmVtYWlsVmFsaWRhdG9yICYmIHVzZXJuTmFtZUNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMuZW1haWwpKSB7XG4gICAgICB1c2Vybk5hbWVDb250cm9sLnJlbW92ZVZhbGlkYXRvcnMoVmFsaWRhdG9ycy5lbWFpbCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCI+XG4gIDwhLS0gVXNlcm5hbWUgLS0+XG4gIDxtYXQtZm9ybS1maWVsZD5cbiAgICA8bWF0LWxhYmVsPnt7IHVzZXJuYW1lUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidXNlcm5hbWVcIiByZWFkb25seSAvPlxuXG4gICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMudXNlcm5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgZm9ybS5jb250cm9scy51c2VybmFtZS50b3VjaGVkXCI+XG4gICAgICB7eyAnRVJST1IuRklFTERfUkVRVUlSRUQnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9tYXQtZXJyb3I+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMudXNlcm5hbWUuaGFzRXJyb3IoJ3VzZXJuYW1lJykgJiYgZm9ybS5jb250cm9scy51c2VybmFtZS50b3VjaGVkXCI+XG4gICAgICB7eyAnRVJST1IuRklFTERfTk9UX1ZBTElEX0VNQUlMJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvbWF0LWVycm9yPlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDwhLS0gUGFzc3dvcmQgLS0+XG4gIDxtYXQtZm9ybS1maWVsZD5cbiAgICA8bWF0LWxhYmVsPnt7ICdSRUdJU1RFUi5TVEVQX1BBU1NXT1JEJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dFxuICAgICAgbWF0SW5wdXRcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cInBhc3N3b3JkXCJcbiAgICAgIGF1dG9jb21wbGV0ZT1cInNlY3Rpb24tcmVkIG5ldy1wYXNzd29yZFwiXG4gICAgICBbdHlwZV09XCJzaG93UHdkID8gJ3RleHQnIDogJ3Bhc3N3b3JkJ1wiXG4gICAgICByZXF1aXJlZFxuICAgIC8+XG4gICAgPGJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2hvd1B3ZCA9ICFzaG93UHdkXCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgPG1hdC1pY29uPnt7IHNob3dQd2QgPyAndmlzaWJpbGl0eV9vZmYnIDogJ3Zpc2liaWxpdHknIH19PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5jb250cm9scy5wYXNzd29yZC5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiBmb3JtLmNvbnRyb2xzLnBhc3N3b3JkLnRvdWNoZWRcIj5cbiAgICAgIHt7ICdFUlJPUi5GSUVMRF9SRVFVSVJFRCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5jb250cm9scy5wYXNzd29yZC5oYXNFcnJvcignbWlubGVuZ3RoJykgJiYgZm9ybS5jb250cm9scy5wYXNzd29yZC50b3VjaGVkXCI+XG4gICAgICA8c3Bhbj57eyAnRVJST1IuRklFTERfTUlOX0xFTkdUSCcgfCB0cmFuc2xhdGU6IGZvcm0uY29udHJvbHMucGFzc3dvcmQuZXJyb3JzLm1pbmxlbmd0aCB9fTwvc3Bhbj5cbiAgICA8L21hdC1lcnJvcj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8IS0tIENvbmZpcm0gcGFzc3dvcmQgLS0+XG4gIDxtYXQtZm9ybS1maWVsZD5cbiAgICA8bWF0LWxhYmVsPnt7ICdSRUdJU1RFUi5DT05GSVJNX1BBU1NXT1JEJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dFxuICAgICAgbWF0SW5wdXRcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbmZpcm1QYXNzd29yZFwiXG4gICAgICBhdXRvY29tcGxldGU9XCJzZWN0aW9uLXJlZCBuZXctcGFzc3dvcmRcIlxuICAgICAgW3R5cGVdPVwic2hvd0NvbmZpcm1Qd2QgPyAndGV4dCcgOiAncGFzc3dvcmQnXCJcbiAgICAgIHJlcXVpcmVkXG4gICAgLz5cbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRTdWZmaXggKGNsaWNrKT1cInNob3dDb25maXJtUHdkID0gIXNob3dDb25maXJtUHdkXCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgPG1hdC1pY29uPnt7IHNob3dDb25maXJtUHdkID8gJ3Zpc2liaWxpdHlfb2ZmJyA6ICd2aXNpYmlsaXR5JyB9fTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMuY29uZmlybVBhc3N3b3JkLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIGZvcm0uY29udHJvbHMuY29uZmlybVBhc3N3b3JkLnRvdWNoZWRcIj5cbiAgICAgIHt7ICdFUlJPUi5GSUVMRF9SRVFVSVJFRCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5jb250cm9scy5jb25maXJtUGFzc3dvcmQuaGFzRXJyb3IoJ2VxdWFscycpICYmIGZvcm0uY29udHJvbHMuY29uZmlybVBhc3N3b3JkLnRvdWNoZWRcIj5cbiAgICAgIDxzcGFuPnt7ICdSRUdJU1RFUi5FUlJPUi5OT1RfU0FNRV9QQVNTV09SRCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgPC9tYXQtZXJyb3I+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG48L2Zvcm0+XG4iXX0=
@@ -0,0 +1,22 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { RouterModule } from '@angular/router';
3
+ import { SharedModule } from '../../../shared/shared.module';
4
+ import { TranslateModule } from '@ngx-translate/core';
5
+ import { ChangePasswordForm } from './change-password.form';
6
+ import { AppChangePasswordPage } from './change-password.page';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@ngx-translate/core";
9
+ export class AppChangePasswordModule {
10
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppChangePasswordModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
11
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: AppChangePasswordModule, declarations: [ChangePasswordForm, AppChangePasswordPage], imports: [SharedModule, RouterModule, i1.TranslateModule], exports: [TranslateModule, ChangePasswordForm, AppChangePasswordPage] });
12
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppChangePasswordModule, imports: [SharedModule, RouterModule, TranslateModule.forChild(), TranslateModule] });
13
+ }
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppChangePasswordModule, decorators: [{
15
+ type: NgModule,
16
+ args: [{
17
+ imports: [SharedModule, RouterModule, TranslateModule.forChild()],
18
+ declarations: [ChangePasswordForm, AppChangePasswordPage],
19
+ exports: [TranslateModule, ChangePasswordForm, AppChangePasswordPage],
20
+ }]
21
+ }] });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLXBhc3N3b3JkLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9hY2NvdW50L3Bhc3N3b3JkL2NoYW5nZS1wYXNzd29yZC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBUS9ELE1BQU0sT0FBTyx1QkFBdUI7d0dBQXZCLHVCQUF1Qjt5R0FBdkIsdUJBQXVCLGlCQUhuQixrQkFBa0IsRUFBRSxxQkFBcUIsYUFGOUMsWUFBWSxFQUFFLFlBQVksaUNBRzFCLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUI7eUdBRXpELHVCQUF1QixZQUx4QixZQUFZLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUUsRUFHdEQsZUFBZTs7NEZBRWQsdUJBQXVCO2tCQU5uQyxRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUVqRSxZQUFZLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxxQkFBcUIsQ0FBQztvQkFDekQsT0FBTyxFQUFFLENBQUMsZUFBZSxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixDQUFDO2lCQUN0RSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU2hhcmVkTW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NoYXJlZC5tb2R1bGUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBDaGFuZ2VQYXNzd29yZEZvcm0gfSBmcm9tICcuL2NoYW5nZS1wYXNzd29yZC5mb3JtJztcbmltcG9ydCB7IEFwcENoYW5nZVBhc3N3b3JkUGFnZSB9IGZyb20gJy4vY2hhbmdlLXBhc3N3b3JkLnBhZ2UnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbU2hhcmVkTW9kdWxlLCBSb3V0ZXJNb2R1bGUsIFRyYW5zbGF0ZU1vZHVsZS5mb3JDaGlsZCgpXSxcblxuICBkZWNsYXJhdGlvbnM6IFtDaGFuZ2VQYXNzd29yZEZvcm0sIEFwcENoYW5nZVBhc3N3b3JkUGFnZV0sXG4gIGV4cG9ydHM6IFtUcmFuc2xhdGVNb2R1bGUsIENoYW5nZVBhc3N3b3JkRm9ybSwgQXBwQ2hhbmdlUGFzc3dvcmRQYWdlXSxcbn0pXG5leHBvcnQgY2xhc3MgQXBwQ2hhbmdlUGFzc3dvcmRNb2R1bGUge31cbiJdfQ==
@@ -0,0 +1,144 @@
1
+ import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core';
2
+ import { getRandomImageWithCredit } from '../../home/home';
3
+ import { isNotEmptyArray, isNotNilOrBlank, nullIfNilOrBlank } from '../../../shared/functions';
4
+ import { CORE_CONFIG_OPTIONS } from '../../services/config/core.config';
5
+ import { AppFormContainer } from '../../form/form-container.class';
6
+ import { environment } from '../../../../environments/environment';
7
+ import { Toasts } from '../../../shared/toast/toasts';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "../../services/config.service";
10
+ import * as i2 from "../../services/account.service";
11
+ import * as i3 from "@ionic/angular";
12
+ import * as i4 from "@ngx-translate/core";
13
+ import * as i5 from "@angular/router";
14
+ import * as i6 from "@angular/common";
15
+ import * as i7 from "../../../shared/toolbar/toolbar";
16
+ import * as i8 from "./change-password.form";
17
+ import * as i9 from "@rx-angular/template/push";
18
+ export class AppChangePasswordPage extends AppFormContainer {
19
+ configService;
20
+ accountService;
21
+ toastController;
22
+ translate;
23
+ navController;
24
+ activatedRoute;
25
+ cd;
26
+ token;
27
+ username;
28
+ contentStyle = {};
29
+ sending = false;
30
+ isLogin = false;
31
+ usernamePlaceholder;
32
+ emailValidator = false;
33
+ form;
34
+ constructor(configService, accountService, toastController, translate, navController, activatedRoute, cd) {
35
+ super();
36
+ this.configService = configService;
37
+ this.accountService = accountService;
38
+ this.toastController = toastController;
39
+ this.translate = translate;
40
+ this.navController = navController;
41
+ this.activatedRoute = activatedRoute;
42
+ this.cd = cd;
43
+ this.debug = !environment.production;
44
+ // Get username + token (from the route)
45
+ this.username =
46
+ nullIfNilOrBlank(this.activatedRoute.snapshot.params['email']) || nullIfNilOrBlank(this.activatedRoute.snapshot.params['username']);
47
+ if (isNotNilOrBlank(this.username)) {
48
+ this.token =
49
+ nullIfNilOrBlank(this.activatedRoute.snapshot.params['token']) || nullIfNilOrBlank(this.activatedRoute.snapshot.queryParams['token']);
50
+ }
51
+ console.debug(`[password] username: ${this.username}, token: ${this.token}`);
52
+ }
53
+ async ngOnInit() {
54
+ super.ngOnInit();
55
+ // Wait account service to be ready
56
+ await this.accountService.ready();
57
+ this.isLogin = this.accountService.isLogin();
58
+ if (this.isLogin) {
59
+ this.username = this.username || this.accountService.account.email;
60
+ this.markForCheck();
61
+ }
62
+ this.form.username = this.username;
63
+ this.addForms([this.form]);
64
+ this.registerSubscription(this.configService.config.subscribe((config) => this.onConfigReady(config)));
65
+ }
66
+ ngOnDestroy() {
67
+ super.ngOnDestroy();
68
+ }
69
+ async onConfigReady(config) {
70
+ console.debug('[password] Config loaded', config);
71
+ if (isNotEmptyArray(config?.backgroundImages)) {
72
+ const { image } = getRandomImageWithCredit(config.backgroundImages);
73
+ this.contentStyle = { 'background-image': `url(${image})` };
74
+ }
75
+ else {
76
+ const primaryColor = config.getProperty(CORE_CONFIG_OPTIONS.COLOR_PRIMARY) || 'var(--ion-color-primary)';
77
+ this.contentStyle = { 'background-color': primaryColor };
78
+ }
79
+ const tokenType = config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE);
80
+ if (tokenType === 'token') {
81
+ this.usernamePlaceholder = 'USER.EMAIL';
82
+ this.emailValidator = true;
83
+ }
84
+ else {
85
+ this.usernamePlaceholder = 'USER.USERNAME';
86
+ this.emailValidator = false;
87
+ }
88
+ this.markAsLoaded();
89
+ this.enable();
90
+ }
91
+ async doSubmit(event) {
92
+ if (event?.defaultPrevented)
93
+ return;
94
+ if (this.form.disabled || this.sending)
95
+ return; // Skip
96
+ this.sending = true;
97
+ const { username, password } = this.form.value;
98
+ this.form.disable();
99
+ try {
100
+ const authData = { username, password };
101
+ // Token exists : send confirmation
102
+ if (isNotNilOrBlank(this.token)) {
103
+ // Update pubkey, using the token
104
+ const done = await this.accountService.resetPubkey(authData, this.token);
105
+ if (done) {
106
+ await this.navController.navigateRoot('/');
107
+ await this.showToast({ message: 'AUTH.CONFIRM.PASSWORD_CHANGED', type: 'info' });
108
+ }
109
+ }
110
+ else {
111
+ // Update pubkey on the current account
112
+ const done = await this.accountService.updatePubkey(authData);
113
+ if (done) {
114
+ await this.navController.navigateRoot('/account');
115
+ await this.showToast({ message: 'AUTH.CONFIRM.PASSWORD_CHANGED', type: 'info' });
116
+ }
117
+ }
118
+ }
119
+ catch (err) {
120
+ this.form.error = (err && err.message) || err;
121
+ this.form.enable();
122
+ }
123
+ finally {
124
+ this.sending = false;
125
+ this.markForCheck();
126
+ }
127
+ }
128
+ async showToast(opts) {
129
+ await Toasts.show(this.toastController, this.translate, opts);
130
+ }
131
+ markForCheck() {
132
+ this.cd.markForCheck();
133
+ }
134
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppChangePasswordPage, deps: [{ token: i1.ConfigService }, { token: i2.AccountService }, { token: i3.ToastController }, { token: i4.TranslateService }, { token: i3.NavController }, { token: i5.ActivatedRoute }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
135
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AppChangePasswordPage, selector: "app-change-password-page", viewQueries: [{ propertyName: "form", first: true, predicate: ["form"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<app-toolbar\n [title]=\"'AUTH.RESET_PASSWORD.TITLE' | translate\"\n color=\"primary\"\n [canGoBack]=\"isLogin\"\n defaultBackHref=\"/account\"\n></app-toolbar>\n<ion-content class=\"bg-image-cover center ion-padding\" [ngStyle]=\"contentStyle\">\n <ion-card class=\"ion-margin-top\">\n <ion-card-content>\n <app-change-password-form\n #form\n [usernamePlaceholder]=\"usernamePlaceholder\"\n [emailValidator]=\"emailValidator\"\n (onSubmit)=\"doSubmit()\"\n [debug]=\"debug\"\n ></app-change-password-form>\n </ion-card-content>\n\n @if (loadingSubject | push) {\n <ion-spinner></ion-spinner>\n } @else {\n <ion-footer>\n <ion-button expand=\"full\" color=\"tertiary\" (click)=\"doSubmit()\">\n <ion-label>{{ 'COMMON.BTN_VALIDATE' | translate }}</ion-label>\n </ion-button>\n </ion-footer>\n }\n </ion-card>\n</ion-content>\n", styles: [".center,ion-text,ion-card,ion-content{text-align:center;display:inline-block}ion-content{--ion-background-color: transparent;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;display:inline-block;padding:15px}ion-card{padding:var(--ion-padding);background-color:var(--ion-card-background-color);min-width:480px;max-width:500px;z-index:9}ion-card button{margin-top:16px}@media screen and (max-width: 575px){ion-content ion-card{min-width:160px;width:auto}ion-content ion-card ion-footer ion-button{margin-top:8px}}\n"], dependencies: [{ kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i3.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i3.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i3.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i3.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i3.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i3.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i7.ToolbarComponent, selector: "app-toolbar", inputs: ["progressBarMode", "title", "color", "class", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }, { kind: "component", type: i8.ChangePasswordForm, selector: "app-change-password-form", inputs: ["usernamePlaceholder", "emailValidator", "username"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "pipe", type: i9.RxPush, name: "push" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
136
+ }
137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppChangePasswordPage, decorators: [{
138
+ type: Component,
139
+ args: [{ selector: 'app-change-password-page', changeDetection: ChangeDetectionStrategy.OnPush, template: "<app-toolbar\n [title]=\"'AUTH.RESET_PASSWORD.TITLE' | translate\"\n color=\"primary\"\n [canGoBack]=\"isLogin\"\n defaultBackHref=\"/account\"\n></app-toolbar>\n<ion-content class=\"bg-image-cover center ion-padding\" [ngStyle]=\"contentStyle\">\n <ion-card class=\"ion-margin-top\">\n <ion-card-content>\n <app-change-password-form\n #form\n [usernamePlaceholder]=\"usernamePlaceholder\"\n [emailValidator]=\"emailValidator\"\n (onSubmit)=\"doSubmit()\"\n [debug]=\"debug\"\n ></app-change-password-form>\n </ion-card-content>\n\n @if (loadingSubject | push) {\n <ion-spinner></ion-spinner>\n } @else {\n <ion-footer>\n <ion-button expand=\"full\" color=\"tertiary\" (click)=\"doSubmit()\">\n <ion-label>{{ 'COMMON.BTN_VALIDATE' | translate }}</ion-label>\n </ion-button>\n </ion-footer>\n }\n </ion-card>\n</ion-content>\n", styles: [".center,ion-text,ion-card,ion-content{text-align:center;display:inline-block}ion-content{--ion-background-color: transparent;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;display:inline-block;padding:15px}ion-card{padding:var(--ion-padding);background-color:var(--ion-card-background-color);min-width:480px;max-width:500px;z-index:9}ion-card button{margin-top:16px}@media screen and (max-width: 575px){ion-content ion-card{min-width:160px;width:auto}ion-content ion-card ion-footer ion-button{margin-top:8px}}\n"] }]
140
+ }], ctorParameters: () => [{ type: i1.ConfigService }, { type: i2.AccountService }, { type: i3.ToastController }, { type: i4.TranslateService }, { type: i3.NavController }, { type: i5.ActivatedRoute }, { type: i0.ChangeDetectorRef }], propDecorators: { form: [{
141
+ type: ViewChild,
142
+ args: ['form', { static: true }]
143
+ }] } });
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlLXBhc3N3b3JkLnBhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvYWNjb3VudC9wYXNzd29yZC9jaGFuZ2UtcGFzc3dvcmQucGFnZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9hY2NvdW50L3Bhc3N3b3JkL2NoYW5nZS1wYXNzd29yZC5wYWdlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUlwSCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUkzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVuRSxPQUFPLEVBQW9CLE1BQU0sRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7OztBQVN4RSxNQUFNLE9BQU8scUJBQXNCLFNBQVEsZ0JBQWdCO0lBYTdDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBbEJGLEtBQUssQ0FBUztJQUNkLFFBQVEsQ0FBUztJQUNqQixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVoQixtQkFBbUIsQ0FBUztJQUM1QixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBRVksSUFBSSxDQUFxQjtJQUV0RSxZQUNZLGFBQTRCLEVBQzVCLGNBQThCLEVBQzlCLGVBQWdDLEVBQ2hD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QUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVTLFlBQVk7UUFDcEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN6QixDQUFDO3dHQTlIVSxxQkFBcUI7NEZBQXJCLHFCQUFxQixtTUN0QmxDLG02QkE2QkE7OzRGRFBhLHFCQUFxQjtrQkFOakMsU0FBUzsrQkFDRSwwQkFBMEIsbUJBR25CLHVCQUF1QixDQUFDLE1BQU07cVFBWUYsSUFBSTtzQkFBaEQsU0FBUzt1QkFBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlLCBBdXRoRGF0YSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBDaGFuZ2VQYXNzd29yZEZvcm0gfSBmcm9tICcuL2NoYW5nZS1wYXNzd29yZC5mb3JtJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGdldFJhbmRvbUltYWdlV2l0aENyZWRpdCB9IGZyb20gJy4uLy4uL2hvbWUvaG9tZSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmF2Q29udHJvbGxlciwgVG9hc3RDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vZGVsL2NvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsT3JCbGFuaywgbnVsbElmTmlsT3JCbGFuayB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgQ09SRV9DT05GSUdfT1BUSU9OUyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQgeyBBcHBGb3JtQ29udGFpbmVyIH0gZnJvbSAnLi4vLi4vZm9ybS9mb3JtLWNvbnRhaW5lci5jbGFzcyc7XG5pbXBvcnQgeyBlbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBBdXRoVG9rZW5UeXBlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmV0d29yay50eXBlcyc7XG5pbXBvcnQgeyBTaG93VG9hc3RPcHRpb25zLCBUb2FzdHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdG9hc3QvdG9hc3RzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWNoYW5nZS1wYXNzd29yZC1wYWdlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NoYW5nZS1wYXNzd29yZC5wYWdlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGFuZ2UtcGFzc3dvcmQucGFnZS5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBDaGFuZ2VQYXNzd29yZFBhZ2UgZXh0ZW5kcyBBcHBGb3JtQ29udGFpbmVyIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcm90ZWN0ZWQgdG9rZW46IHN0cmluZztcbiAgcHJvdGVjdGVkIHVzZXJuYW1lOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBjb250ZW50U3R5bGUgPSB7fTtcbiAgcHJvdGVjdGVkIHNlbmRpbmcgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGlzTG9naW4gPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgdXNlcm5hbWVQbGFjZWhvbGRlcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgZW1haWxWYWxpZGF0b3IgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdmb3JtJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBmb3JtOiBDaGFuZ2VQYXNzd29yZEZvcm07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgdG9hc3RDb250cm9sbGVyOiBUb2FzdENvbnRyb2xsZXIsXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgbmF2Q29udHJvbGxlcjogTmF2Q29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmRlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG5cbiAgICAvLyBHZXQgdXNlcm5hbWUgICsgdG9rZW4gKGZyb20gdGhlIHJvdXRlKVxuICAgIHRoaXMudXNlcm5hbWUgPVxuICAgICAgbnVsbElmTmlsT3JCbGFuayh0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmFtc1snZW1haWwnXSkgfHwgbnVsbElmTmlsT3JCbGFuayh0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmFtc1sndXNlcm5hbWUnXSk7XG4gICAgaWYgKGlzTm90TmlsT3JCbGFuayh0aGlzLnVzZXJuYW1lKSkge1xuICAgICAgdGhpcy50b2tlbiA9XG4gICAgICAgIG51bGxJZk5pbE9yQmxhbmsodGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ3Rva2VuJ10pIHx8IG51bGxJZk5pbE9yQmxhbmsodGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1sndG9rZW4nXSk7XG4gICAgfVxuICAgIGNvbnNvbGUuZGVidWcoYFtwYXNzd29yZF0gdXNlcm5hbWU6ICR7dGhpcy51c2VybmFtZX0sIHRva2VuOiAke3RoaXMudG9rZW59YCk7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgLy8gV2FpdCBhY2NvdW50IHNlcnZpY2UgdG8gYmUgcmVhZHlcbiAgICBhd2FpdCB0aGlzLmFjY291bnRTZXJ2aWNlLnJlYWR5KCk7XG5cbiAgICB0aGlzLmlzTG9naW4gPSB0aGlzLmFjY291bnRTZXJ2aWNlLmlzTG9naW4oKTtcbiAgICBpZiAodGhpcy5pc0xvZ2luKSB7XG4gICAgICB0aGlzLnVzZXJuYW1lID0gdGhpcy51c2VybmFtZSB8fCB0aGlzLmFjY291bnRTZXJ2aWNlLmFjY291bnQuZW1haWw7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICB0aGlzLmZvcm0udXNlcm5hbWUgPSB0aGlzLnVzZXJuYW1lO1xuXG4gICAgdGhpcy5hZGRGb3JtcyhbdGhpcy5mb3JtXSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHRoaXMuY29uZmlnU2VydmljZS5jb25maWcuc3Vic2NyaWJlKChjb25maWcpID0+IHRoaXMub25Db25maWdSZWFkeShjb25maWcpKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICB9XG5cbiAgYXN5bmMgb25Db25maWdSZWFkeShjb25maWc6IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zb2xlLmRlYnVnKCdbcGFzc3dvcmRdIENvbmZpZyBsb2FkZWQnLCBjb25maWcpO1xuICAgIGlmIChpc05vdEVtcHR5QXJyYXkoY29uZmlnPy5iYWNrZ3JvdW5kSW1hZ2VzKSkge1xuICAgICAgY29uc3QgeyBpbWFnZSB9ID0gZ2V0UmFuZG9tSW1hZ2VXaXRoQ3JlZGl0KGNvbmZpZy5iYWNrZ3JvdW5kSW1hZ2VzKTtcbiAgICAgIHRoaXMuY29udGVudFN0eWxlID0geyAnYmFja2dyb3VuZC1pbWFnZSc6IGB1cmwoJHtpbWFnZX0pYCB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwcmltYXJ5Q29sb3IgPSBjb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5DT0xPUl9QUklNQVJZKSB8fCAndmFyKC0taW9uLWNvbG9yLXByaW1hcnkpJztcbiAgICAgIHRoaXMuY29udGVudFN0eWxlID0geyAnYmFja2dyb3VuZC1jb2xvcic6IHByaW1hcnlDb2xvciB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuVHlwZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLkFVVEhfVE9LRU5fVFlQRSkgYXMgQXV0aFRva2VuVHlwZTtcbiAgICBpZiAodG9rZW5UeXBlID09PSAndG9rZW4nKSB7XG4gICAgICB0aGlzLnVzZXJuYW1lUGxhY2Vob2xkZXIgPSAnVVNFUi5FTUFJTCc7XG4gICAgICB0aGlzLmVtYWlsVmFsaWRhdG9yID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51c2VybmFtZVBsYWNlaG9sZGVyID0gJ1VTRVIuVVNFUk5BTUUnO1xuICAgICAgdGhpcy5lbWFpbFZhbGlkYXRvciA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMubWFya0FzTG9hZGVkKCk7XG4gICAgdGhpcy5lbmFibGUoKTtcbiAgfVxuXG4gIGFzeW5jIGRvU3VibWl0KGV2ZW50PzogRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQ/LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjtcblxuICAgIGlmICh0aGlzLmZvcm0uZGlzYWJsZWQgfHwgdGhpcy5zZW5kaW5nKSByZXR1cm47IC8vIFNraXBcblxuICAgIHRoaXMuc2VuZGluZyA9IHRydWU7XG4gICAgY29uc3QgeyB1c2VybmFtZSwgcGFzc3dvcmQgfSA9IHRoaXMuZm9ybS52YWx1ZTtcblxuICAgIHRoaXMuZm9ybS5kaXNhYmxlKCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXV0aERhdGE6IEF1dGhEYXRhID0geyB1c2VybmFtZSwgcGFzc3dvcmQgfTtcblxuICAgICAgLy8gVG9rZW4gZXhpc3RzIDogc2VuZCBjb25maXJtYXRpb25cbiAgICAgIGlmIChpc05vdE5pbE9yQmxhbmsodGhpcy50b2tlbikpIHtcbiAgICAgICAgLy8gVXBkYXRlIHB1YmtleSwgdXNpbmcgdGhlIHRva2VuXG4gICAgICAgIGNvbnN0IGRvbmUgPSBhd2FpdCB0aGlzLmFjY291bnRTZXJ2aWNlLnJlc2V0UHVia2V5KGF1dGhEYXRhLCB0aGlzLnRva2VuKTtcbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVSb290KCcvJyk7XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7IG1lc3NhZ2U6ICdBVVRILkNPTkZJUk0uUEFTU1dPUkRfQ0hBTkdFRCcsIHR5cGU6ICdpbmZvJyB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXBkYXRlIHB1YmtleSBvbiB0aGUgY3VycmVudCBhY2NvdW50XG4gICAgICAgIGNvbnN0IGRvbmUgPSBhd2FpdCB0aGlzLmFjY291bnRTZXJ2aWNlLnVwZGF0ZVB1YmtleShhdXRoRGF0YSk7XG5cbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVSb290KCcvYWNjb3VudCcpO1xuXG4gICAgICAgICAgYXdhaXQgdGhpcy5zaG93VG9hc3QoeyBtZXNzYWdlOiAnQVVUSC5DT05GSVJNLlBBU1NXT1JEX0NIQU5HRUQnLCB0eXBlOiAnaW5mbycgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuZm9ybS5lcnJvciA9IChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8IGVycjtcbiAgICAgIHRoaXMuZm9ybS5lbmFibGUoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzaG93VG9hc3Qob3B0czogU2hvd1RvYXN0T3B0aW9ucykge1xuICAgIGF3YWl0IFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwgb3B0cyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjxhcHAtdG9vbGJhclxuICBbdGl0bGVdPVwiJ0FVVEguUkVTRVRfUEFTU1dPUkQuVElUTEUnIHwgdHJhbnNsYXRlXCJcbiAgY29sb3I9XCJwcmltYXJ5XCJcbiAgW2NhbkdvQmFja109XCJpc0xvZ2luXCJcbiAgZGVmYXVsdEJhY2tIcmVmPVwiL2FjY291bnRcIlxuPjwvYXBwLXRvb2xiYXI+XG48aW9uLWNvbnRlbnQgY2xhc3M9XCJiZy1pbWFnZS1jb3ZlciBjZW50ZXIgaW9uLXBhZGRpbmdcIiBbbmdTdHlsZV09XCJjb250ZW50U3R5bGVcIj5cbiAgPGlvbi1jYXJkIGNsYXNzPVwiaW9uLW1hcmdpbi10b3BcIj5cbiAgICA8aW9uLWNhcmQtY29udGVudD5cbiAgICAgIDxhcHAtY2hhbmdlLXBhc3N3b3JkLWZvcm1cbiAgICAgICAgI2Zvcm1cbiAgICAgICAgW3VzZXJuYW1lUGxhY2Vob2xkZXJdPVwidXNlcm5hbWVQbGFjZWhvbGRlclwiXG4gICAgICAgIFtlbWFpbFZhbGlkYXRvcl09XCJlbWFpbFZhbGlkYXRvclwiXG4gICAgICAgIChvblN1Ym1pdCk9XCJkb1N1Ym1pdCgpXCJcbiAgICAgICAgW2RlYnVnXT1cImRlYnVnXCJcbiAgICAgID48L2FwcC1jaGFuZ2UtcGFzc3dvcmQtZm9ybT5cbiAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG5cbiAgICBAaWYgKGxvYWRpbmdTdWJqZWN0IHwgcHVzaCkge1xuICAgICAgPGlvbi1zcGlubmVyPjwvaW9uLXNwaW5uZXI+XG4gICAgfSBAZWxzZSB7XG4gICAgICA8aW9uLWZvb3Rlcj5cbiAgICAgICAgPGlvbi1idXR0b24gZXhwYW5kPVwiZnVsbFwiIGNvbG9yPVwidGVydGlhcnlcIiAoY2xpY2spPVwiZG9TdWJtaXQoKVwiPlxuICAgICAgICAgIDxpb24tbGFiZWw+e3sgJ0NPTU1PTi5CVE5fVkFMSURBVEUnIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWZvb3Rlcj5cbiAgICB9XG4gIDwvaW9uLWNhcmQ+XG48L2lvbi1jb250ZW50PlxuIl19
@@ -6,24 +6,25 @@ import { AppForm } from '../form/form.class';
6
6
  import { ENVIRONMENT } from '../../../environments/environment.class';
7
7
  import { CORE_CONFIG_OPTIONS } from '../services/config/core.config';
8
8
  import { AppFormUtils } from '../form/form.utils';
9
+ import { AppResetPasswordModal } from './reset-password.modal';
9
10
  import { setTimeout } from '@rx-angular/cdk/zone-less/browser';
10
11
  import * as i0 from "@angular/core";
11
- import * as i1 from "../services/platform.service";
12
- import * as i2 from "@angular/forms";
13
- import * as i3 from "../services/local-settings.service";
14
- import * as i4 from "../services/config.service";
15
- import * as i5 from "@ionic/angular";
16
- import * as i6 from "../services/network.service";
17
- import * as i7 from "@angular/common";
18
- import * as i8 from "@ngx-translate/core";
19
- import * as i9 from "@angular/material/form-field";
20
- import * as i10 from "@angular/material/input";
21
- import * as i11 from "@angular/material/checkbox";
22
- import * as i12 from "@angular/material/icon";
23
- import * as i13 from "@angular/material/button";
24
- import * as i14 from "@angular/material/slide-toggle";
25
- import * as i15 from "../../shared/directives/autofocus.directive";
26
- import * as i16 from "../../shared/pipes/colors.pipe";
12
+ import * as i1 from "@angular/forms";
13
+ import * as i2 from "../services/local-settings.service";
14
+ import * as i3 from "../services/config.service";
15
+ import * as i4 from "@ionic/angular";
16
+ import * as i5 from "../services/network.service";
17
+ import * as i6 from "@angular/common";
18
+ import * as i7 from "@angular/material/form-field";
19
+ import * as i8 from "@angular/material/input";
20
+ import * as i9 from "@angular/material/checkbox";
21
+ import * as i10 from "@angular/material/icon";
22
+ import * as i11 from "@angular/material/button";
23
+ import * as i12 from "@angular/material/slide-toggle";
24
+ import * as i13 from "../../shared/directives/autofocus.directive";
25
+ import * as i14 from "@ngx-translate/core";
26
+ import * as i15 from "../../shared/pipes/colors.pipe";
27
+ import * as i16 from "../../../environments/environment.class";
27
28
  export class AppAuthForm extends AppForm {
28
29
  configService;
29
30
  modalCtrl;
@@ -34,6 +35,7 @@ export class AppAuthForm extends AppForm {
34
35
  canWorkOffline = false;
35
36
  showPwd = false;
36
37
  canRegister;
38
+ canResetPassword;
37
39
  usernamePlaceholder;
38
40
  onCancel = new EventEmitter();
39
41
  onSubmit = new EventEmitter();
@@ -41,7 +43,7 @@ export class AppAuthForm extends AppForm {
41
43
  super.disable(opts);
42
44
  this.showPwd = false; // Hide pwd when disable (e.g. when submitted)
43
45
  }
44
- constructor(injector, platform, formBuilder, settings, configService, modalCtrl, network, cd, environment) {
46
+ constructor(injector, formBuilder, settings, configService, modalCtrl, network, cd, environment) {
45
47
  super(injector, formBuilder.group({
46
48
  username: [null, Validators.required],
47
49
  password: [null, Validators.required],
@@ -72,6 +74,8 @@ export class AppAuthForm extends AppForm {
72
74
  }
73
75
  // Enable/disable registration link
74
76
  this.canRegister = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.REGISTRATION_ENABLE);
77
+ // Enable/Disable reset password link
78
+ this.canResetPassword = tokenType == 'token' && config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.AUTH_RESET_PASSWORD_ENABLE);
75
79
  this.markForCheck();
76
80
  }));
77
81
  // For DEV only
@@ -118,17 +122,32 @@ export class AppAuthForm extends AppForm {
118
122
  return modal.present();
119
123
  }, 200);
120
124
  }
125
+ resetPassword() {
126
+ this.onCancel.emit();
127
+ const data = this.form.value;
128
+ setTimeout(async () => {
129
+ const modal = await this.modalCtrl.create({
130
+ component: AppResetPasswordModal,
131
+ componentProps: {
132
+ username: data.username || null,
133
+ usernamePlaceholder: this.usernamePlaceholder,
134
+ },
135
+ backdropDismiss: false,
136
+ });
137
+ return modal.present();
138
+ }, 200);
139
+ }
121
140
  /* -- protected functions -- */
122
141
  markForCheck() {
123
142
  this.cd.markForCheck();
124
143
  }
125
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppAuthForm, deps: [{ token: i0.Injector }, { token: i1.PlatformService }, { token: i2.UntypedFormBuilder }, { token: i3.LocalSettingsService }, { token: i4.ConfigService }, { token: i5.ModalController }, { token: i6.NetworkService }, { token: i0.ChangeDetectorRef }, { token: ENVIRONMENT, optional: true }], target: i0.ɵɵFactoryTarget.Component });
126
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AppAuthForm, selector: "app-auth-form", outputs: { onCancel: "onCancel", onSubmit: "onSubmit" }, usesInheritance: true, ngImport: i0, template: "<form\n [formGroup]=\"form\"\n novalidate\n (ngSubmit)=\"doSubmit($event)\"\n class=\"form-container ion-padding\"\n (keyup.enter)=\"doSubmit($event)\"\n>\n <!-- error -->\n <ion-item lines=\"none\" *ngIf=\"error && !loading\" @slideUpDownAnimation>\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 <!-- Username -->\n <mat-form-field>\n <mat-label>{{ usernamePlaceholder | translate }}</mat-label>\n <input\n matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"username\"\n autocomplete=\"off\"\n required\n />\n <mat-error *ngIf=\"form.controls.username.hasError('required') && form.controls.username.dirty\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"form.controls.username.hasError('email') && form.controls.username.dirty\">\n <span>{{ 'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}</span>\n </mat-error>\n </mat-form-field>\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 (keyup.enter)=\"doSubmit($event)\"\n required\n />\n\n <!-- Show pwd button -->\n <button matSuffix type=\"button\" mat-icon-button (click)=\"showPwd = !showPwd\" tabindex=\"-1\">\n <mat-icon>{{ showPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-error *ngIf=\"form.controls.password.hasError('required') && form.controls.password.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n\n <ng-container *ngIf=\"canWorkOffline\">\n <!-- Force offline (desktop) -->\n <mat-form-field hidden-xs hidden-sm hidden-mobile [color]=\"'medium' | matColor\">\n <input matInput hidden formControlName=\"offline\" type=\"text\" />\n\n <!-- check box -->\n <mat-checkbox\n [disabled]=\"network.offline\"\n (change)=\"form.controls.offline.setValue($event.checked)\"\n [checked]=\"form.controls.offline.value\"\n >\n <ion-text color=\"medium\" translate>AUTH.OFFLINE_MODE</ion-text>\n </mat-checkbox>\n </mat-form-field>\n\n <!-- Force offline (mobile) -->\n <mat-form-field visible-xs visible-sm visible-mobile [color]=\"'medium' | matColor\">\n <input matInput hidden formControlName=\"offline\" type=\"text\" />\n <!-- slide toggle -->\n <ion-text color=\"medium\" translate>AUTH.OFFLINE_MODE</ion-text>\n <mat-slide-toggle\n matSuffix\n [disabled]=\"network.offline\"\n (change)=\"form.controls.offline.setValue($event.checked)\"\n [checked]=\"form.controls.offline.value\"\n ></mat-slide-toggle>\n </mat-form-field>\n </ng-container>\n\n <!-- Not register yet ? -->\n <p *ngIf=\"canRegister\" class=\"padding\" style=\"text-align: center\">\n <span translate>AUTH.NO_ACCOUNT_QUESTION</span>\n <br />\n <a href=\"#\" (click)=\"register()\">\n <span translate>AUTH.BTN_REGISTER</span>\n </a>\n </p>\n</form>\n", styles: [""], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i5.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i5.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i5.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i8.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i10.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: i11.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i13.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i14.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i15.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }, { kind: "pipe", type: i16.MatColorPipe, name: "matColor" }], animations: [slideUpDownAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
144
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppAuthForm, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: i2.LocalSettingsService }, { token: i3.ConfigService }, { token: i4.ModalController }, { token: i5.NetworkService }, { token: i0.ChangeDetectorRef }, { token: ENVIRONMENT, optional: true }], target: i0.ɵɵFactoryTarget.Component });
145
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AppAuthForm, selector: "app-auth-form", outputs: { onCancel: "onCancel", onSubmit: "onSubmit" }, usesInheritance: true, ngImport: i0, template: "<form\n [formGroup]=\"form\"\n novalidate\n (ngSubmit)=\"doSubmit($event)\"\n class=\"form-container ion-padding\"\n (keyup.enter)=\"doSubmit($event)\"\n>\n <!-- error -->\n <ion-item lines=\"none\" *ngIf=\"error && !loading\" @slideUpDownAnimation>\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 <!-- Username -->\n <mat-form-field>\n <mat-label>{{ usernamePlaceholder | translate }}</mat-label>\n <input\n matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"username\"\n autocomplete=\"off\"\n required\n />\n <mat-error *ngIf=\"form.controls.username.hasError('required') && form.controls.username.dirty\">\n {{ 'ERROR.FIELD_REQUIRED' | translate }}\n </mat-error>\n <mat-error *ngIf=\"form.controls.username.hasError('email') && form.controls.username.dirty\">\n <span>{{ 'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}</span>\n </mat-error>\n </mat-form-field>\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 (keyup.enter)=\"doSubmit($event)\"\n required\n />\n\n <!-- Show pwd button -->\n <button matSuffix type=\"button\" mat-icon-button (click)=\"showPwd = !showPwd\" tabindex=\"-1\">\n <mat-icon>{{ showPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-error *ngIf=\"form.controls.password.hasError('required') && form.controls.password.touched\">\n {{ 'ERROR.FIELD_REQUIRED' | translate }}\n </mat-error>\n </mat-form-field>\n\n <ng-container *ngIf=\"canWorkOffline\">\n <!-- Force offline (desktop) -->\n <mat-form-field hidden-xs hidden-sm hidden-mobile [color]=\"'medium' | matColor\">\n <input matInput hidden formControlName=\"offline\" type=\"text\" />\n\n <!-- check box -->\n <mat-checkbox\n [disabled]=\"network.offline\"\n (change)=\"form.controls.offline.setValue($event.checked)\"\n [checked]=\"form.controls.offline.value\"\n >\n <ion-text color=\"medium\">{{ 'AUTH.OFFLINE_MODE' | translate }}</ion-text>\n </mat-checkbox>\n </mat-form-field>\n\n <!-- Force offline (mobile) -->\n <mat-form-field visible-xs visible-sm visible-mobile [color]=\"'medium' | matColor\">\n <input matInput hidden formControlName=\"offline\" type=\"text\" />\n <!-- slide toggle -->\n <ion-text color=\"medium\">{{ 'AUTH.OFFLINE_MODE' | translate }}</ion-text>\n <mat-slide-toggle\n matSuffix\n [disabled]=\"network.offline\"\n (change)=\"form.controls.offline.setValue($event.checked)\"\n [checked]=\"form.controls.offline.value\"\n ></mat-slide-toggle>\n </mat-form-field>\n </ng-container>\n\n <!-- Not register yet ? -->\n @if (canRegister) {\n <ion-text class=\"ion-text-center\">\n <p>\n <span>{{ 'AUTH.NO_ACCOUNT_QUESTION' | translate }}</span>\n <br />\n <a href=\"#\" (click)=\"register()\">\n <span>{{ 'AUTH.BTN_REGISTER' | translate }}</span>\n </a>\n </p>\n </ion-text>\n }\n\n <!-- Reset password -->\n @if (canResetPassword) {\n <ion-text class=\"ion-text-center\">\n <p>\n <span>{{ 'AUTH.RESET_PASSWORD_QUESTION' | translate }}</span>\n <br />\n <a href=\"#\" (click)=\"resetPassword()\">\n <span>{{ 'AUTH.BTN_RESET_PASSWORD' | translate }}</span>\n </a>\n </p>\n </ion-text>\n }\n</form>\n", styles: [""], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { 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.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i13.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "pipe", type: i14.TranslatePipe, name: "translate" }, { kind: "pipe", type: i15.MatColorPipe, name: "matColor" }], animations: [slideUpDownAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
127
146
  }
128
147
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AppAuthForm, decorators: [{
129
148
  type: Component,
130
- args: [{ selector: 'app-auth-form', animations: [slideUpDownAnimation], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form\n [formGroup]=\"form\"\n novalidate\n (ngSubmit)=\"doSubmit($event)\"\n class=\"form-container ion-padding\"\n (keyup.enter)=\"doSubmit($event)\"\n>\n <!-- error -->\n <ion-item lines=\"none\" *ngIf=\"error && !loading\" @slideUpDownAnimation>\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 <!-- Username -->\n <mat-form-field>\n <mat-label>{{ usernamePlaceholder | translate }}</mat-label>\n <input\n matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"username\"\n autocomplete=\"off\"\n required\n />\n <mat-error *ngIf=\"form.controls.username.hasError('required') && form.controls.username.dirty\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"form.controls.username.hasError('email') && form.controls.username.dirty\">\n <span>{{ 'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}</span>\n </mat-error>\n </mat-form-field>\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 (keyup.enter)=\"doSubmit($event)\"\n required\n />\n\n <!-- Show pwd button -->\n <button matSuffix type=\"button\" mat-icon-button (click)=\"showPwd = !showPwd\" tabindex=\"-1\">\n <mat-icon>{{ showPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-error *ngIf=\"form.controls.password.hasError('required') && form.controls.password.touched\" translate>\n ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n\n <ng-container *ngIf=\"canWorkOffline\">\n <!-- Force offline (desktop) -->\n <mat-form-field hidden-xs hidden-sm hidden-mobile [color]=\"'medium' | matColor\">\n <input matInput hidden formControlName=\"offline\" type=\"text\" />\n\n <!-- check box -->\n <mat-checkbox\n [disabled]=\"network.offline\"\n (change)=\"form.controls.offline.setValue($event.checked)\"\n [checked]=\"form.controls.offline.value\"\n >\n <ion-text color=\"medium\" translate>AUTH.OFFLINE_MODE</ion-text>\n </mat-checkbox>\n </mat-form-field>\n\n <!-- Force offline (mobile) -->\n <mat-form-field visible-xs visible-sm visible-mobile [color]=\"'medium' | matColor\">\n <input matInput hidden formControlName=\"offline\" type=\"text\" />\n <!-- slide toggle -->\n <ion-text color=\"medium\" translate>AUTH.OFFLINE_MODE</ion-text>\n <mat-slide-toggle\n matSuffix\n [disabled]=\"network.offline\"\n (change)=\"form.controls.offline.setValue($event.checked)\"\n [checked]=\"form.controls.offline.value\"\n ></mat-slide-toggle>\n </mat-form-field>\n </ng-container>\n\n <!-- Not register yet ? -->\n <p *ngIf=\"canRegister\" class=\"padding\" style=\"text-align: center\">\n <span translate>AUTH.NO_ACCOUNT_QUESTION</span>\n <br />\n <a href=\"#\" (click)=\"register()\">\n <span translate>AUTH.BTN_REGISTER</span>\n </a>\n </p>\n</form>\n" }]
131
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.PlatformService }, { type: i2.UntypedFormBuilder }, { type: i3.LocalSettingsService }, { type: i4.ConfigService }, { type: i5.ModalController }, { type: i6.NetworkService }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
149
+ args: [{ selector: 'app-auth-form', animations: [slideUpDownAnimation], changeDetection: ChangeDetectionStrategy.OnPush, template: "<form\n [formGroup]=\"form\"\n novalidate\n (ngSubmit)=\"doSubmit($event)\"\n class=\"form-container ion-padding\"\n (keyup.enter)=\"doSubmit($event)\"\n>\n <!-- error -->\n <ion-item lines=\"none\" *ngIf=\"error && !loading\" @slideUpDownAnimation>\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 <!-- Username -->\n <mat-form-field>\n <mat-label>{{ usernamePlaceholder | translate }}</mat-label>\n <input\n matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"username\"\n autocomplete=\"off\"\n required\n />\n <mat-error *ngIf=\"form.controls.username.hasError('required') && form.controls.username.dirty\">\n {{ 'ERROR.FIELD_REQUIRED' | translate }}\n </mat-error>\n <mat-error *ngIf=\"form.controls.username.hasError('email') && form.controls.username.dirty\">\n <span>{{ 'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}</span>\n </mat-error>\n </mat-form-field>\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 (keyup.enter)=\"doSubmit($event)\"\n required\n />\n\n <!-- Show pwd button -->\n <button matSuffix type=\"button\" mat-icon-button (click)=\"showPwd = !showPwd\" tabindex=\"-1\">\n <mat-icon>{{ showPwd ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\n <mat-error *ngIf=\"form.controls.password.hasError('required') && form.controls.password.touched\">\n {{ 'ERROR.FIELD_REQUIRED' | translate }}\n </mat-error>\n </mat-form-field>\n\n <ng-container *ngIf=\"canWorkOffline\">\n <!-- Force offline (desktop) -->\n <mat-form-field hidden-xs hidden-sm hidden-mobile [color]=\"'medium' | matColor\">\n <input matInput hidden formControlName=\"offline\" type=\"text\" />\n\n <!-- check box -->\n <mat-checkbox\n [disabled]=\"network.offline\"\n (change)=\"form.controls.offline.setValue($event.checked)\"\n [checked]=\"form.controls.offline.value\"\n >\n <ion-text color=\"medium\">{{ 'AUTH.OFFLINE_MODE' | translate }}</ion-text>\n </mat-checkbox>\n </mat-form-field>\n\n <!-- Force offline (mobile) -->\n <mat-form-field visible-xs visible-sm visible-mobile [color]=\"'medium' | matColor\">\n <input matInput hidden formControlName=\"offline\" type=\"text\" />\n <!-- slide toggle -->\n <ion-text color=\"medium\">{{ 'AUTH.OFFLINE_MODE' | translate }}</ion-text>\n <mat-slide-toggle\n matSuffix\n [disabled]=\"network.offline\"\n (change)=\"form.controls.offline.setValue($event.checked)\"\n [checked]=\"form.controls.offline.value\"\n ></mat-slide-toggle>\n </mat-form-field>\n </ng-container>\n\n <!-- Not register yet ? -->\n @if (canRegister) {\n <ion-text class=\"ion-text-center\">\n <p>\n <span>{{ 'AUTH.NO_ACCOUNT_QUESTION' | translate }}</span>\n <br />\n <a href=\"#\" (click)=\"register()\">\n <span>{{ 'AUTH.BTN_REGISTER' | translate }}</span>\n </a>\n </p>\n </ion-text>\n }\n\n <!-- Reset password -->\n @if (canResetPassword) {\n <ion-text class=\"ion-text-center\">\n <p>\n <span>{{ 'AUTH.RESET_PASSWORD_QUESTION' | translate }}</span>\n <br />\n <a href=\"#\" (click)=\"resetPassword()\">\n <span>{{ 'AUTH.BTN_RESET_PASSWORD' | translate }}</span>\n </a>\n </p>\n </ion-text>\n }\n</form>\n" }]
150
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: i2.LocalSettingsService }, { type: i3.ConfigService }, { type: i4.ModalController }, { type: i5.NetworkService }, { type: i0.ChangeDetectorRef }, { type: i16.Environment, decorators: [{
132
151
  type: Optional
133
152
  }, {
134
153
  type: Inject,
@@ -138,4 +157,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
138
157
  }], onSubmit: [{
139
158
  type: Output
140
159
  }] } });
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2F1dGgvYXV0aC5mb3JtLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2F1dGgvYXV0aC5mb3JtLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBb0IsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSixPQUFPLEVBQXNCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUszRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUVqRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXJFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVMvRCxNQUFNLE9BQU8sV0FBWSxTQUFRLE9BQWlCO0lBb0J0QztJQUNBO0lBQ0Q7SUFDQztJQUNtQztJQXZCcEMsTUFBTSxDQUFVO0lBQ3pCLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixXQUFXLENBQVU7SUFDckIsbUJBQW1CLENBQVM7SUFFbEIsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFDbkMsUUFBUSxHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7SUFFbEQsT0FBTyxDQUFD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QWE7Z0JBQ3hCLGVBQWUsRUFBRSxLQUFLO2FBQ3ZCLENBQUMsQ0FBQztZQUNILE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCwrQkFBK0I7SUFFckIsWUFBWTtRQUNwQixJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pCLENBQUM7d0dBeEhVLFdBQVcsMFFBd0JBLFdBQVc7NEZBeEJ0QixXQUFXLHFJQ3hCeEIsMHVHQTJGQSxxL0hEdEVjLENBQUMsb0JBQW9CLENBQUM7OzRGQUd2QixXQUFXO2tCQVB2QixTQUFTOytCQUNFLGVBQWUsY0FHYixDQUFDLG9CQUFvQixDQUFDLG1CQUNqQix1QkFBdUIsQ0FBQyxNQUFNOzswQkEwQjVDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsV0FBVzt5Q0FqQnZCLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5qZWN0b3IsIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgUmVnaXN0ZXJNb2RhbCB9IGZyb20gJy4uL3JlZ2lzdGVyL3JlZ2lzdGVyLm1vZGFsJztcbmltcG9ydCB7IEF1dGhEYXRhIH0gZnJvbSAnLi4vc2VydmljZXMvYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhUb2tlblR5cGUgfSBmcm9tICcuLi9zZXJ2aWNlcy9uZXR3b3JrLnR5cGVzJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBzbGlkZVVwRG93bkFuaW1hdGlvbiB9IGZyb20gJy4uLy4uL3NoYXJlZC9tYXRlcmlhbC9tYXRlcmlhbC5hbmltYXRpb25zJztcbmltcG9ydCB7IFBsYXRmb3JtU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3BsYXRmb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBwRm9ybSB9IGZyb20gJy4uL2Zvcm0vZm9ybS5jbGFzcyc7XG5pbXBvcnQgeyBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBDT1JFX0NPTkZJR19PUFRJT05TIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnL2NvcmUuY29uZmlnJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBGb3JtVXRpbHMgfSBmcm9tICcuLi9mb3JtL2Zvcm0udXRpbHMnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ0ByeC1hbmd1bGFyL2Nkay96b25lLWxlc3MvYnJvd3Nlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hdXRoLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJ2F1dGguZm9ybS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXV0aC5mb3JtLnNjc3MnXSxcbiAgYW5pbWF0aW9uczogW3NsaWRlVXBEb3duQW5pbWF0aW9uXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFwcEF1dGhGb3JtIGV4dGVuZHMgQXBwRm9ybTxBdXRoRGF0YT4gaW1wbGVtZW50cyBPbkluaXQge1xuICByZWFkb25seSBtb2JpbGU6IGJvb2xlYW47XG4gIGNhbldvcmtPZmZsaW5lID0gZmFsc2U7XG4gIHNob3dQd2QgPSBmYWxzZTtcbiAgY2FuUmVnaXN0ZXI6IGJvb2xlYW47XG4gIHVzZXJuYW1lUGxhY2Vob2xkZXI6IHN0cmluZztcblxuICBAT3V0cHV0KCkgb25DYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxBdXRoRGF0YT4oKTtcblxuICBkaXNhYmxlKG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgc3VwZXIuZGlzYWJsZShvcHRzKTtcbiAgICB0aGlzLnNob3dQd2QgPSBmYWxzZTsgLy8gSGlkZSBwd2Qgd2hlbiBkaXNhYmxlIChlLmcuIHdoZW4gc3VibWl0dGVkKVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHBsYXRmb3JtOiBQbGF0Zm9ybVNlcnZpY2UsXG4gICAgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgbW9kYWxDdHJsOiBNb2RhbENvbnRyb2xsZXIsXG4gICAgcHVibGljIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIGluamVjdG9yLFxuICAgICAgZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICB1c2VybmFtZTogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBwYXNzd29yZDogW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICBvZmZsaW5lOiBbbmV0d29yay5vZmZsaW5lXSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMubW9iaWxlID0gc2V0dGluZ3MubW9iaWxlO1xuICAgIHRoaXMuY2FuV29ya09mZmxpbmUgPSB0aGlzLnNldHRpbmdzLmhhc09mZmxpbmVGZWF0dXJlKCk7XG4gICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgLy8gTG9hZCBjb25maWcsIHRvIHNldCB1c2VybmFtZSdzIGxhYmVsIGFuZCB2YWxpZGF0b3JcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5zdWJzY3JpYmUoKGNvbmZpZykgPT4ge1xuICAgICAgICAvLyBTZXQgdGhlIHVzZXJuYW1lIHBsYWNlaG9sZGVyLCB3aXRoIGVtYWlsIG9yIHVzZXJuYW1lXG4gICAgICAgIGNvbnN0IHRva2VuVHlwZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLkFVVEhfVE9LRU5fVFlQRSkgYXMgQXV0aFRva2VuVHlwZTtcbiAgICAgICAgaWYgKHRva2VuVHlwZSA9PT0gJ3Rva2VuJykge1xuICAgICAgICAgIHRoaXMudXNlcm5hbWVQbGFjZWhvbGRlciA9ICdVU0VSLkVNQUlMJztcbiAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCd1c2VybmFtZScpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLmVtYWlsXSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXNlcm5hbWVQbGFjZWhvbGRlciA9ICdVU0VSLlVTRVJOQU1FJztcbiAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCd1c2VybmFtZScpLnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmFibGUvZGlzYWJsZSByZWdpc3RyYXRpb24gbGlua1xuICAgICAgICB0aGlzLmNhblJlZ2lzdGVyID0gY29uZmlnLmdldFByb3BlcnR5QXNCb29sZWFuKENPUkVfQ09ORklHX09QVElPTlMuUkVHSVNUUkFUSU9OX0VOQUJMRSk7XG5cbiAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIEZvciBERVYgb25seVxuICAgIGlmICh0aGlzLmVudmlyb25tZW50ICYmIHRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbiA9PT0gZmFsc2UgJiYgdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0QXV0aFZhbHVlcykge1xuICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHVzZXIsIGZvciB0ZXN0aW5nLlxuICAgICAgLy8gT3ZlcnJpZGUgdXNpbmcgZW52aXJvbm1lbnQsIGlmIGFueVxuICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUodGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0QXV0aFZhbHVlcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2FuY2VsKCkge1xuICAgIHRoaXMub25DYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgYXN5bmMgZG9TdWJtaXQoZXZlbnQ/OiBFdmVudCkge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxvYWRpbmcpIHJldHVybjtcblxuICAgIGlmICghdGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICBhd2FpdCBBcHBGb3JtVXRpbHMud2FpdFdoaWxlUGVuZGluZyh0aGlzLmZvcm0pO1xuICAgICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XG4gICAgICAgIEFwcEZvcm1VdGlscy5sb2dGb3JtRXJyb3JzKHRoaXMuZm9ybSk7XG4gICAgICAgIHJldHVybjsgLy8gU2tpcCBpZiBpbnZhbGlkXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybS52YWx1ZTtcbiAgICB0aGlzLnNob3dQd2QgPSBmYWxzZTsgLy8gSGlkZSBwYXNzd29yZFxuICAgIHRoaXMuZXJyb3IgPSBudWxsOyAvLyBSZXNldCBlcnJvclxuXG4gICAgc2V0VGltZW91dCgoKSA9PlxuICAgICAgdGhpcy5vblN1Ym1pdC5lbWl0KHtcbiAgICAgICAgdXNlcm5hbWU6IGRhdGEudXNlcm5hbWUsXG4gICAgICAgIHBhc3N3b3JkOiBkYXRhLnBhc3N3b3JkLFxuICAgICAgICBvZmZsaW5lOiBkYXRhLm9mZmxpbmUsXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZWdpc3RlcigpIHtcbiAgICB0aGlzLm9uQ2FuY2VsLmVtaXQoKTtcbiAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5tb2RhbEN0cmwuY3JlYXRlKHtcbiAgICAgICAgY29tcG9uZW50OiBSZWdpc3Rlck1vZGFsLFxuICAgICAgICBiYWNrZHJvcERpc21pc3M6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbW9kYWwucHJlc2VudCgpO1xuICAgIH0sIDIwMCk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgZnVuY3Rpb25zIC0tICovXG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iLCI8Zm9ybVxuICBbZm9ybUdyb3VwXT1cImZvcm1cIlxuICBub3ZhbGlkYXRlXG4gIChuZ1N1Ym1pdCk9XCJkb1N1Ym1pdCgkZXZlbnQpXCJcbiAgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBpb24tcGFkZGluZ1wiXG4gIChrZXl1cC5lbnRlcik9XCJkb1N1Ym1pdCgkZXZlbnQpXCJcbj5cbiAgPCEtLSBlcnJvciAtLT5cbiAgPGlvbi1pdGVtIGxpbmVzPVwibm9uZVwiICpuZ0lmPVwiZXJyb3IgJiYgIWxvYWRpbmdcIiBAc2xpZGVVcERvd25BbmltYXRpb24+XG4gICAgPGlvbi1pY29uIGNvbG9yPVwiZGFuZ2VyXCIgc2xvdD1cInN0YXJ0XCIgbmFtZT1cImFsZXJ0LWNpcmNsZVwiPjwvaW9uLWljb24+XG4gICAgPGlvbi1sYWJlbCBjb2xvcj1cImRhbmdlclwiIGNsYXNzPVwiZXJyb3JcIiBbaW5uZXJIVE1MXT1cImVycm9yIHwgdHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gIDwvaW9uLWl0ZW0+XG5cbiAgPCEtLSBVc2VybmFtZSAtLT5cbiAgPG1hdC1mb3JtLWZpZWxkPlxuICAgIDxtYXQtbGFiZWw+e3sgdXNlcm5hbWVQbGFjZWhvbGRlciB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgIDxpbnB1dFxuICAgICAgbWF0SW5wdXRcbiAgICAgIFthcHBBdXRvZm9jdXNdPVwidHJ1ZVwiXG4gICAgICBbYXV0b2ZvY3VzRGVsYXldPVwiNTAwXCJcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cInVzZXJuYW1lXCJcbiAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICByZXF1aXJlZFxuICAgIC8+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMudXNlcm5hbWUuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgZm9ybS5jb250cm9scy51c2VybmFtZS5kaXJ0eVwiIHRyYW5zbGF0ZT5cbiAgICAgIEVSUk9SLkZJRUxEX1JFUVVJUkVEXG4gICAgPC9tYXQtZXJyb3I+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMudXNlcm5hbWUuaGFzRXJyb3IoJ2VtYWlsJykgJiYgZm9ybS5jb250cm9scy51c2VybmFtZS5kaXJ0eVwiPlxuICAgICAgPHNwYW4+e3sgJ0VSUk9SLkZJRUxEX05PVF9WQUxJRF9FTUFJTCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgPC9tYXQtZXJyb3I+XG4gIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgPCEtLSBQYXNzd29yZCAtLT5cbiAgPG1hdC1mb3JtLWZpZWxkPlxuICAgIDxtYXQtbGFiZWw+e3sgJ1VTRVIuUEFTU1dPUkQnIHwgdHJhbnNsYXRlIH19PC9tYXQtbGFiZWw+XG4gICAgPGlucHV0XG4gICAgICBtYXRJbnB1dFxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicGFzc3dvcmRcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwic2VjdGlvbi1yZWQgbmV3LXBhc3N3b3JkXCJcbiAgICAgIFt0eXBlXT1cInNob3dQd2QgPyAndGV4dCcgOiAncGFzc3dvcmQnXCJcbiAgICAgIChrZXl1cC5lbnRlcik9XCJkb1N1Ym1pdCgkZXZlbnQpXCJcbiAgICAgIHJlcXVpcmVkXG4gICAgLz5cblxuICAgIDwhLS0gU2hvdyBwd2QgYnV0dG9uIC0tPlxuICAgIDxidXR0b24gbWF0U3VmZml4IHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNob3dQd2QgPSAhc2hvd1B3ZFwiIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgIDxtYXQtaWNvbj57eyBzaG93UHdkID8gJ3Zpc2liaWxpdHlfb2ZmJyA6ICd2aXNpYmlsaXR5JyB9fTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG4gICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMucGFzc3dvcmQuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgZm9ybS5jb250cm9scy5wYXNzd29yZC50b3VjaGVkXCIgdHJhbnNsYXRlPlxuICAgICAgRVJST1IuRklFTERfUkVRVUlSRURcbiAgICA8L21hdC1lcnJvcj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FuV29ya09mZmxpbmVcIj5cbiAgICA8IS0tIEZvcmNlIG9mZmxpbmUgKGRlc2t0b3ApIC0tPlxuICAgIDxtYXQtZm9ybS1maWVsZCBoaWRkZW4teHMgaGlkZGVuLXNtIGhpZGRlbi1tb2JpbGUgW2NvbG9yXT1cIidtZWRpdW0nIHwgbWF0Q29sb3JcIj5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBoaWRkZW4gZm9ybUNvbnRyb2xOYW1lPVwib2ZmbGluZVwiIHR5cGU9XCJ0ZXh0XCIgLz5cblxuICAgICAgPCEtLSBjaGVjayBib3ggIC0tPlxuICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICBbZGlzYWJsZWRdPVwibmV0d29yay5vZmZsaW5lXCJcbiAgICAgICAgKGNoYW5nZSk9XCJmb3JtLmNvbnRyb2xzLm9mZmxpbmUuc2V0VmFsdWUoJGV2ZW50LmNoZWNrZWQpXCJcbiAgICAgICAgW2NoZWNrZWRdPVwiZm9ybS5jb250cm9scy5vZmZsaW5lLnZhbHVlXCJcbiAgICAgID5cbiAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwibWVkaXVtXCIgdHJhbnNsYXRlPkFVVEguT0ZGTElORV9NT0RFPC9pb24tdGV4dD5cbiAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICA8IS0tIEZvcmNlIG9mZmxpbmUgKG1vYmlsZSkgLS0+XG4gICAgPG1hdC1mb3JtLWZpZWxkIHZpc2libGUteHMgdmlzaWJsZS1zbSB2aXNpYmxlLW1vYmlsZSBbY29sb3JdPVwiJ21lZGl1bScgfCBtYXRDb2xvclwiPlxuICAgICAgPGlucHV0IG1hdElucHV0IGhpZGRlbiBmb3JtQ29udHJvbE5hbWU9XCJvZmZsaW5lXCIgdHlwZT1cInRleHRcIiAvPlxuICAgICAgPCEtLSBzbGlkZSB0b2dnbGUgIC0tPlxuICAgICAgPGlvbi10ZXh0IGNvbG9yPVwibWVkaXVtXCIgdHJhbnNsYXRlPkFVVEguT0ZGTElORV9NT0RFPC9pb24tdGV4dD5cbiAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlXG4gICAgICAgIG1hdFN1ZmZpeFxuICAgICAgICBbZGlzYWJsZWRdPVwibmV0d29yay5vZmZsaW5lXCJcbiAgICAgICAgKGNoYW5nZSk9XCJmb3JtLmNvbnRyb2xzLm9mZmxpbmUuc2V0VmFsdWUoJGV2ZW50LmNoZWNrZWQpXCJcbiAgICAgICAgW2NoZWNrZWRdPVwiZm9ybS5jb250cm9scy5vZmZsaW5lLnZhbHVlXCJcbiAgICAgID48L21hdC1zbGlkZS10b2dnbGU+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBOb3QgcmVnaXN0ZXIgeWV0ID8gLS0+XG4gIDxwICpuZ0lmPVwiY2FuUmVnaXN0ZXJcIiBjbGFzcz1cInBhZGRpbmdcIiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlclwiPlxuICAgIDxzcGFuIHRyYW5zbGF0ZT5BVVRILk5PX0FDQ09VTlRfUVVFU1RJT048L3NwYW4+XG4gICAgPGJyIC8+XG4gICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwicmVnaXN0ZXIoKVwiPlxuICAgICAgPHNwYW4gdHJhbnNsYXRlPkFVVEguQlROX1JFR0lTVEVSPC9zcGFuPlxuICAgIDwvYT5cbiAgPC9wPlxuPC9mb3JtPlxuIl19
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2F1dGgvYXV0aC5mb3JtLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2F1dGgvYXV0aC5mb3JtLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBb0IsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoSixPQUFPLEVBQXNCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUszRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXJFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVMvRCxNQUFNLE9BQU8sV0FBWSxTQUFRLE9BQWlCO0lBb0J0QztJQUNBO0lBQ0Q7SUFDQztJQUNtQztJQXZCMUIsTUFBTSxDQUFVO0lBQ3pCLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixXQUFXLENBQVU7SUFDckIsZ0JBQWdCLENBQVU7SUFDMUIsbUJBQW1CLENBQVM7SUFFNUIsUUFBUSxHQUFHLElBQUksWUFB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LENBQUMsb0JBQW9CLENBQUMsbUJBQ2pCLHVCQUF1QixDQUFDLE1BQU07OzBCQTBCNUMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxXQUFXO3lDQWhCdkIsUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbmplY3RvciwgT25Jbml0LCBPcHRpb25hbCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBSZWdpc3Rlck1vZGFsIH0gZnJvbSAnLi4vcmVnaXN0ZXIvcmVnaXN0ZXIubW9kYWwnO1xuaW1wb3J0IHsgQXV0aERhdGEgfSBmcm9tICcuLi9zZXJ2aWNlcy9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgTmV0d29ya1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFRva2VuVHlwZSB9IGZyb20gJy4uL3NlcnZpY2VzL25ldHdvcmsudHlwZXMnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IHNsaWRlVXBEb3duQW5pbWF0aW9uIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21hdGVyaWFsL21hdGVyaWFsLmFuaW1hdGlvbnMnO1xuaW1wb3J0IHsgQXBwRm9ybSB9IGZyb20gJy4uL2Zvcm0vZm9ybS5jbGFzcyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgQ09SRV9DT05GSUdfT1BUSU9OUyB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBwRm9ybVV0aWxzIH0gZnJvbSAnLi4vZm9ybS9mb3JtLnV0aWxzJztcbmltcG9ydCB7IEFwcFJlc2V0UGFzc3dvcmRNb2RhbCB9IGZyb20gJy4vcmVzZXQtcGFzc3dvcmQubW9kYWwnO1xuaW1wb3J0IHsgc2V0VGltZW91dCB9IGZyb20gJ0ByeC1hbmd1bGFyL2Nkay96b25lLWxlc3MvYnJvd3Nlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hdXRoLWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJ2F1dGguZm9ybS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXV0aC5mb3JtLnNjc3MnXSxcbiAgYW5pbWF0aW9uczogW3NsaWRlVXBEb3duQW5pbWF0aW9uXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFwcEF1dGhGb3JtIGV4dGVuZHMgQXBwRm9ybTxBdXRoRGF0YT4gaW1wbGVtZW50cyBPbkluaXQge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9iaWxlOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgY2FuV29ya09mZmxpbmUgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHNob3dQd2QgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGNhblJlZ2lzdGVyOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgY2FuUmVzZXRQYXNzd29yZDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHVzZXJuYW1lUGxhY2Vob2xkZXI6IHN0cmluZztcblxuICBAT3V0cHV0KCkgb25DYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcjxBdXRoRGF0YT4oKTtcblxuICBkaXNhYmxlKG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgc3VwZXIuZGlzYWJsZShvcHRzKTtcbiAgICB0aGlzLnNob3dQd2QgPSBmYWxzZTsgLy8gSGlkZSBwd2Qgd2hlbiBkaXNhYmxlIChlLmcuIHdoZW4gc3VibWl0dGVkKVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLFxuICAgIHB1YmxpYyBuZXR3b3JrOiBOZXR3b3JrU2VydmljZSxcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50XG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgaW5qZWN0b3IsXG4gICAgICBmb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgIHVzZXJuYW1lOiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIHBhc3N3b3JkOiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgIG9mZmxpbmU6IFtuZXR3b3JrLm9mZmxpbmVdLFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5tb2JpbGUgPSBzZXR0aW5ncy5tb2JpbGU7XG4gICAgdGhpcy5jYW5Xb3JrT2ZmbGluZSA9IHRoaXMuc2V0dGluZ3MuaGFzT2ZmbGluZUZlYXR1cmUoKTtcbiAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAvLyBMb2FkIGNvbmZpZywgdG8gc2V0IHVzZXJuYW1lJ3MgbGFiZWwgYW5kIHZhbGlkYXRvclxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YnNjcmliZSgoY29uZmlnKSA9PiB7XG4gICAgICAgIC8vIFNldCB0aGUgdXNlcm5hbWUgcGxhY2Vob2xkZXIsIHdpdGggZW1haWwgb3IgdXNlcm5hbWVcbiAgICAgICAgY29uc3QgdG9rZW5UeXBlID0gY29uZmlnLmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuQVVUSF9UT0tFTl9UWVBFKSBhcyBBdXRoVG9rZW5UeXBlO1xuICAgICAgICBpZiAodG9rZW5UeXBlID09PSAndG9rZW4nKSB7XG4gICAgICAgICAgdGhpcy51c2VybmFtZVBsYWNlaG9sZGVyID0gJ1VTRVIuRU1BSUwnO1xuICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3VzZXJuYW1lJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51c2VybmFtZVBsYWNlaG9sZGVyID0gJ1VTRVIuVVNFUk5BTUUnO1xuICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3VzZXJuYW1lJykuc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuYWJsZS9kaXNhYmxlIHJlZ2lzdHJhdGlvbiBsaW5rXG4gICAgICAgIHRoaXMuY2FuUmVnaXN0ZXIgPSBjb25maWcuZ2V0UHJvcGVydHlBc0Jvb2xlYW4oQ09SRV9DT05GSUdfT1BUSU9OUy5SRUdJU1RSQVRJT05fRU5BQkxFKTtcblxuICAgICAgICAvLyBFbmFibGUvRGlzYWJsZSByZXNldCBwYXNzd29yZCBsaW5rXG4gICAgICAgIHRoaXMuY2FuUmVzZXRQYXNzd29yZCA9IHRva2VuVHlwZSA9PSAndG9rZW4nICYmIGNvbmZpZy5nZXRQcm9wZXJ0eUFzQm9vbGVhbihDT1JFX0NPTkZJR19PUFRJT05TLkFVVEhfUkVTRVRfUEFTU1dPUkRfRU5BQkxFKTtcblxuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gRm9yIERFViBvbmx5XG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnQgJiYgdGhpcy5lbnZpcm9ubWVudC5wcm9kdWN0aW9uID09PSBmYWxzZSAmJiB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRBdXRoVmFsdWVzKSB7XG4gICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdXNlciwgZm9yIHRlc3RpbmcuXG4gICAgICAvLyBPdmVycmlkZSB1c2luZyBlbnZpcm9ubWVudCwgaWYgYW55XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh0aGlzLmVudmlyb25tZW50LmRlZmF1bHRBdXRoVmFsdWVzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjYW5jZWwoKSB7XG4gICAgdGhpcy5vbkNhbmNlbC5lbWl0KCk7XG4gIH1cblxuICBhc3luYyBkb1N1Ym1pdChldmVudD86IEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubG9hZGluZykgcmV0dXJuO1xuXG4gICAgaWYgKCF0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgIGF3YWl0IEFwcEZvcm1VdGlscy53YWl0V2hpbGVQZW5kaW5nKHRoaXMuZm9ybSk7XG4gICAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcbiAgICAgICAgQXBwRm9ybVV0aWxzLmxvZ0Zvcm1FcnJvcnModGhpcy5mb3JtKTtcbiAgICAgICAgcmV0dXJuOyAvLyBTa2lwIGlmIGludmFsaWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm1hcmtBc0xvYWRpbmcoKTtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5mb3JtLnZhbHVlO1xuICAgIHRoaXMuc2hvd1B3ZCA9IGZhbHNlOyAvLyBIaWRlIHBhc3N3b3JkXG4gICAgdGhpcy5lcnJvciA9IG51bGw7IC8vIFJlc2V0IGVycm9yXG5cbiAgICBzZXRUaW1lb3V0KCgpID0+XG4gICAgICB0aGlzLm9uU3VibWl0LmVtaXQoe1xuICAgICAgICB1c2VybmFtZTogZGF0YS51c2VybmFtZSxcbiAgICAgICAgcGFzc3dvcmQ6IGRhdGEucGFzc3dvcmQsXG4gICAgICAgIG9mZmxpbmU6IGRhdGEub2ZmbGluZSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJlZ2lzdGVyKCkge1xuICAgIHRoaXMub25DYW5jZWwuZW1pdCgpO1xuICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xuICAgICAgICBjb21wb25lbnQ6IFJlZ2lzdGVyTW9kYWwsXG4gICAgICAgIGJhY2tkcm9wRGlzbWlzczogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBtb2RhbC5wcmVzZW50KCk7XG4gICAgfSwgMjAwKTtcbiAgfVxuXG4gIHJlc2V0UGFzc3dvcmQoKSB7XG4gICAgdGhpcy5vbkNhbmNlbC5lbWl0KCk7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZm9ybS52YWx1ZTtcblxuICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsQ3RybC5jcmVhdGUoe1xuICAgICAgICBjb21wb25lbnQ6IEFwcFJlc2V0UGFzc3dvcmRNb2RhbCxcbiAgICAgICAgY29tcG9uZW50UHJvcHM6IHtcbiAgICAgICAgICB1c2VybmFtZTogZGF0YS51c2VybmFtZSB8fCBudWxsLFxuICAgICAgICAgIHVzZXJuYW1lUGxhY2Vob2xkZXI6IHRoaXMudXNlcm5hbWVQbGFjZWhvbGRlcixcbiAgICAgICAgfSxcbiAgICAgICAgYmFja2Ryb3BEaXNtaXNzOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG1vZGFsLnByZXNlbnQoKTtcbiAgICB9LCAyMDApO1xuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIGZ1bmN0aW9ucyAtLSAqL1xuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGZvcm1cbiAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgbm92YWxpZGF0ZVxuICAobmdTdWJtaXQpPVwiZG9TdWJtaXQoJGV2ZW50KVwiXG4gIGNsYXNzPVwiZm9ybS1jb250YWluZXIgaW9uLXBhZGRpbmdcIlxuICAoa2V5dXAuZW50ZXIpPVwiZG9TdWJtaXQoJGV2ZW50KVwiXG4+XG4gIDwhLS0gZXJyb3IgLS0+XG4gIDxpb24taXRlbSBsaW5lcz1cIm5vbmVcIiAqbmdJZj1cImVycm9yICYmICFsb2FkaW5nXCIgQHNsaWRlVXBEb3duQW5pbWF0aW9uPlxuICAgIDxpb24taWNvbiBjb2xvcj1cImRhbmdlclwiIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJhbGVydC1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgIDxpb24tbGFiZWwgY29sb3I9XCJkYW5nZXJcIiBjbGFzcz1cImVycm9yXCIgW2lubmVySFRNTF09XCJlcnJvciB8IHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICA8L2lvbi1pdGVtPlxuXG4gIDwhLS0gVXNlcm5hbWUgLS0+XG4gIDxtYXQtZm9ybS1maWVsZD5cbiAgICA8bWF0LWxhYmVsPnt7IHVzZXJuYW1lUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICA8aW5wdXRcbiAgICAgIG1hdElucHV0XG4gICAgICBbYXBwQXV0b2ZvY3VzXT1cInRydWVcIlxuICAgICAgW2F1dG9mb2N1c0RlbGF5XT1cIjUwMFwiXG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJ1c2VybmFtZVwiXG4gICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgcmVxdWlyZWRcbiAgICAvPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmNvbnRyb2xzLnVzZXJuYW1lLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIGZvcm0uY29udHJvbHMudXNlcm5hbWUuZGlydHlcIj5cbiAgICAgIHt7ICdFUlJPUi5GSUVMRF9SRVFVSVJFRCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5jb250cm9scy51c2VybmFtZS5oYXNFcnJvcignZW1haWwnKSAmJiBmb3JtLmNvbnRyb2xzLnVzZXJuYW1lLmRpcnR5XCI+XG4gICAgICA8c3Bhbj57eyAnRVJST1IuRklFTERfTk9UX1ZBTElEX0VNQUlMJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICA8L21hdC1lcnJvcj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8IS0tIFBhc3N3b3JkIC0tPlxuICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgPG1hdC1sYWJlbD57eyAnVVNFUi5QQVNTV09SRCcgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICA8aW5wdXRcbiAgICAgIG1hdElucHV0XG4gICAgICBmb3JtQ29udHJvbE5hbWU9XCJwYXNzd29yZFwiXG4gICAgICBhdXRvY29tcGxldGU9XCJzZWN0aW9uLXJlZCBuZXctcGFzc3dvcmRcIlxuICAgICAgW3R5cGVdPVwic2hvd1B3ZCA/ICd0ZXh0JyA6ICdwYXNzd29yZCdcIlxuICAgICAgKGtleXVwLmVudGVyKT1cImRvU3VibWl0KCRldmVudClcIlxuICAgICAgcmVxdWlyZWRcbiAgICAvPlxuXG4gICAgPCEtLSBTaG93IHB3ZCBidXR0b24gLS0+XG4gICAgPGJ1dHRvbiBtYXRTdWZmaXggdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwic2hvd1B3ZCA9ICFzaG93UHdkXCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICAgPG1hdC1pY29uPnt7IHNob3dQd2QgPyAndmlzaWJpbGl0eV9vZmYnIDogJ3Zpc2liaWxpdHknIH19PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5jb250cm9scy5wYXNzd29yZC5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiBmb3JtLmNvbnRyb2xzLnBhc3N3b3JkLnRvdWNoZWRcIj5cbiAgICAgIHt7ICdFUlJPUi5GSUVMRF9SRVFVSVJFRCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L21hdC1lcnJvcj5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FuV29ya09mZmxpbmVcIj5cbiAgICA8IS0tIEZvcmNlIG9mZmxpbmUgKGRlc2t0b3ApIC0tPlxuICAgIDxtYXQtZm9ybS1maWVsZCBoaWRkZW4teHMgaGlkZGVuLXNtIGhpZGRlbi1tb2JpbGUgW2NvbG9yXT1cIidtZWRpdW0nIHwgbWF0Q29sb3JcIj5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBoaWRkZW4gZm9ybUNvbnRyb2xOYW1lPVwib2ZmbGluZVwiIHR5cGU9XCJ0ZXh0XCIgLz5cblxuICAgICAgPCEtLSBjaGVjayBib3ggIC0tPlxuICAgICAgPG1hdC1jaGVja2JveFxuICAgICAgICBbZGlzYWJsZWRdPVwibmV0d29yay5vZmZsaW5lXCJcbiAgICAgICAgKGNoYW5nZSk9XCJmb3JtLmNvbnRyb2xzLm9mZmxpbmUuc2V0VmFsdWUoJGV2ZW50LmNoZWNrZWQpXCJcbiAgICAgICAgW2NoZWNrZWRdPVwiZm9ybS5jb250cm9scy5vZmZsaW5lLnZhbHVlXCJcbiAgICAgID5cbiAgICAgICAgPGlvbi10ZXh0IGNvbG9yPVwibWVkaXVtXCI+e3sgJ0FVVEguT0ZGTElORV9NT0RFJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLXRleHQ+XG4gICAgICA8L21hdC1jaGVja2JveD5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgPCEtLSBGb3JjZSBvZmZsaW5lIChtb2JpbGUpIC0tPlxuICAgIDxtYXQtZm9ybS1maWVsZCB2aXNpYmxlLXhzIHZpc2libGUtc20gdmlzaWJsZS1tb2JpbGUgW2NvbG9yXT1cIidtZWRpdW0nIHwgbWF0Q29sb3JcIj5cbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBoaWRkZW4gZm9ybUNvbnRyb2xOYW1lPVwib2ZmbGluZVwiIHR5cGU9XCJ0ZXh0XCIgLz5cbiAgICAgIDwhLS0gc2xpZGUgdG9nZ2xlICAtLT5cbiAgICAgIDxpb24tdGV4dCBjb2xvcj1cIm1lZGl1bVwiPnt7ICdBVVRILk9GRkxJTkVfTU9ERScgfCB0cmFuc2xhdGUgfX08L2lvbi10ZXh0PlxuICAgICAgPG1hdC1zbGlkZS10b2dnbGVcbiAgICAgICAgbWF0U3VmZml4XG4gICAgICAgIFtkaXNhYmxlZF09XCJuZXR3b3JrLm9mZmxpbmVcIlxuICAgICAgICAoY2hhbmdlKT1cImZvcm0uY29udHJvbHMub2ZmbGluZS5zZXRWYWx1ZSgkZXZlbnQuY2hlY2tlZClcIlxuICAgICAgICBbY2hlY2tlZF09XCJmb3JtLmNvbnRyb2xzLm9mZmxpbmUudmFsdWVcIlxuICAgICAgPjwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIE5vdCByZWdpc3RlciB5ZXQgPyAtLT5cbiAgQGlmIChjYW5SZWdpc3Rlcikge1xuICAgIDxpb24tdGV4dCBjbGFzcz1cImlvbi10ZXh0LWNlbnRlclwiPlxuICAgICAgPHA+XG4gICAgICAgIDxzcGFuPnt7ICdBVVRILk5PX0FDQ09VTlRfUVVFU1RJT04nIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8YnIgLz5cbiAgICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwicmVnaXN0ZXIoKVwiPlxuICAgICAgICAgIDxzcGFuPnt7ICdBVVRILkJUTl9SRUdJU1RFUicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvcD5cbiAgICA8L2lvbi10ZXh0PlxuICB9XG5cbiAgPCEtLSBSZXNldCBwYXNzd29yZCAtLT5cbiAgQGlmIChjYW5SZXNldFBhc3N3b3JkKSB7XG4gICAgPGlvbi10ZXh0IGNsYXNzPVwiaW9uLXRleHQtY2VudGVyXCI+XG4gICAgICA8cD5cbiAgICAgICAgPHNwYW4+e3sgJ0FVVEguUkVTRVRfUEFTU1dPUkRfUVVFU1RJT04nIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICA8YnIgLz5cbiAgICAgICAgPGEgaHJlZj1cIiNcIiAoY2xpY2spPVwicmVzZXRQYXNzd29yZCgpXCI+XG4gICAgICAgICAgPHNwYW4+e3sgJ0FVVEguQlROX1JFU0VUX1BBU1NXT1JEJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9wPlxuICAgIDwvaW9uLXRleHQ+XG4gIH1cbjwvZm9ybT5cbiJdfQ==