valtech-components 2.0.984 → 2.0.986

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 (35) hide show
  1. package/esm2022/lib/components/molecules/date-input/date-input.component.mjs +97 -14
  2. package/esm2022/lib/components/organisms/account-view/account-view.component.mjs +732 -0
  3. package/esm2022/lib/components/organisms/account-view/account-view.i18n.mjs +96 -0
  4. package/esm2022/lib/components/organisms/account-view/account.routes.mjs +29 -0
  5. package/esm2022/lib/components/organisms/account-view/types.mjs +2 -0
  6. package/esm2022/lib/components/organisms/bottom-nav/bottom-nav.component.mjs +3 -3
  7. package/esm2022/lib/components/organisms/create-org-modal/create-org-modal.component.mjs +240 -0
  8. package/esm2022/lib/components/organisms/create-org-modal/create-org-modal.i18n.mjs +46 -0
  9. package/esm2022/lib/components/organisms/delete-account-modal/delete-account-modal.component.mjs +272 -0
  10. package/esm2022/lib/components/organisms/delete-account-modal/delete-account-modal.i18n.mjs +40 -0
  11. package/esm2022/lib/components/organisms/org-info-sheet/org-info-sheet.component.mjs +205 -0
  12. package/esm2022/lib/components/organisms/org-info-sheet/org-info-sheet.i18n.mjs +35 -0
  13. package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.component.mjs +280 -0
  14. package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.i18n.mjs +26 -0
  15. package/esm2022/lib/services/font-size/font-size.service.mjs +3 -1
  16. package/esm2022/lib/version.mjs +2 -2
  17. package/esm2022/public-api.mjs +8 -1
  18. package/fesm2022/valtech-components.mjs +2279 -279
  19. package/fesm2022/valtech-components.mjs.map +1 -1
  20. package/lib/components/molecules/date-input/date-input.component.d.ts +9 -0
  21. package/lib/components/organisms/account-view/account-view.component.d.ts +88 -0
  22. package/lib/components/organisms/account-view/account-view.i18n.d.ts +7 -0
  23. package/lib/components/organisms/account-view/account.routes.d.ts +24 -0
  24. package/lib/components/organisms/account-view/types.d.ts +44 -0
  25. package/lib/components/organisms/create-org-modal/create-org-modal.component.d.ts +45 -0
  26. package/lib/components/organisms/create-org-modal/create-org-modal.i18n.d.ts +7 -0
  27. package/lib/components/organisms/delete-account-modal/delete-account-modal.component.d.ts +50 -0
  28. package/lib/components/organisms/delete-account-modal/delete-account-modal.i18n.d.ts +7 -0
  29. package/lib/components/organisms/org-info-sheet/org-info-sheet.component.d.ts +44 -0
  30. package/lib/components/organisms/org-info-sheet/org-info-sheet.i18n.d.ts +12 -0
  31. package/lib/components/organisms/switch-org-modal/switch-org-modal.component.d.ts +47 -0
  32. package/lib/components/organisms/switch-org-modal/switch-org-modal.i18n.d.ts +7 -0
  33. package/lib/version.d.ts +1 -1
  34. package/package.json +1 -1
  35. package/public-api.d.ts +7 -0
@@ -0,0 +1,240 @@
1
+ import { Component, effect, inject, Input, signal } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { firstValueFrom } from 'rxjs';
4
+ import { IonButton, IonButtons, IonContent, IonHeader, IonToolbar } from '@ionic/angular/standalone';
5
+ import { FormComponent } from '../form/form.component';
6
+ import { DisplayComponent } from '../../atoms/display/display.component';
7
+ import { TitleComponent } from '../../atoms/title/title.component';
8
+ import { ComponentStates, InputType } from '../../types';
9
+ import { I18nService } from '../../../services/i18n';
10
+ import { OrgService } from '../../../services/org/org.service';
11
+ import { OrgSwitchService } from '../../../services/auth/org-switch.service';
12
+ import { ToastService } from '../../../services/toast.service';
13
+ import { ValtechErrorService } from '../../../services/errors/valtech-error.service';
14
+ import { CREATE_ORG_MODAL_I18N } from './create-org-modal.i18n';
15
+ import * as i0 from "@angular/core";
16
+ const DEFAULT_NAMESPACE = 'CreateOrgModal';
17
+ /**
18
+ * `val-create-org-modal` — modal de creación de organización (organism
19
+ * compartido). Promovido desde `showcase` bajo el proceso de ADR-021. Reusado por
20
+ * la vista Cuenta (y futuras vistas org-aware).
21
+ *
22
+ * Crea la org vía `OrgService.createOrg` y, en éxito, cambia a ella con
23
+ * `OrgSwitchService.switchTo`. El formulario (nombre + tipo + descripción) se
24
+ * construye una vez y se mantiene reactivo a idioma + estado de trabajo vía
25
+ * effects `allowSignalWrites`.
26
+ *
27
+ * Abierto vía `ModalService` — recibe `_modalRef` por `componentProps` + callback
28
+ * `onSuccess(newOrg)`. Header canónico (Regla #5): sin `ion-title`, botón Cerrar
29
+ * texto en `slot=end`, título/subtítulo en el body con `val-display`/`val-title`.
30
+ *
31
+ * Auto-registra sus defaults i18n (es/en) si el consumer no proveyó el namespace
32
+ * `CreateOrgModal`.
33
+ */
34
+ export class CreateOrgModalComponent {
35
+ constructor() {
36
+ this.i18n = inject(I18nService);
37
+ this.orgService = inject(OrgService);
38
+ this.orgSwitch = inject(OrgSwitchService);
39
+ this.toast = inject(ToastService);
40
+ this.errors = inject(ValtechErrorService);
41
+ /** Namespace i18n con que la vista resuelve sus textos. */
42
+ this.i18nNamespace = DEFAULT_NAMESPACE;
43
+ this._busy = signal(false);
44
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE)) {
45
+ this.i18n.registerContent(DEFAULT_NAMESPACE, CREATE_ORG_MODAL_I18N);
46
+ }
47
+ this.formMeta = signal(this.buildFormMeta());
48
+ effect(() => {
49
+ this.i18n.lang();
50
+ this.formMeta.set(this.buildFormMeta());
51
+ }, { allowSignalWrites: true });
52
+ effect(() => {
53
+ const working = this._busy();
54
+ this.formMeta.update(meta => ({
55
+ ...meta,
56
+ state: working ? ComponentStates.WORKING : ComponentStates.ENABLED,
57
+ actions: {
58
+ ...meta.actions,
59
+ state: working ? ComponentStates.WORKING : ComponentStates.ENABLED,
60
+ },
61
+ }));
62
+ }, { allowSignalWrites: true });
63
+ }
64
+ async onSubmit(event) {
65
+ if (this._busy())
66
+ return;
67
+ const name = event.fields['name'];
68
+ const type = event.fields['type'];
69
+ if (!name?.trim() || !type) {
70
+ this.toast.show({
71
+ message: this.t('fillRequired'),
72
+ duration: 3000,
73
+ color: 'dark',
74
+ position: 'top',
75
+ });
76
+ return;
77
+ }
78
+ this._busy.set(true);
79
+ try {
80
+ const description = event.fields['description'];
81
+ const newOrg = await firstValueFrom(this.orgService.createOrg({ name, type, description }));
82
+ this.toast.show({
83
+ message: this.t('successMsg'),
84
+ color: 'dark',
85
+ duration: 3500,
86
+ });
87
+ await this.orgSwitch.switchTo(newOrg.id);
88
+ this.onSuccess?.(newOrg);
89
+ this._modalRef?.dismiss(newOrg, 'confirm');
90
+ }
91
+ catch (err) {
92
+ this.errors.handle(err, { i18nNamespace: this.i18nNamespace });
93
+ }
94
+ finally {
95
+ this._busy.set(false);
96
+ }
97
+ }
98
+ dismiss() {
99
+ this._modalRef?.dismiss(null, 'cancel');
100
+ }
101
+ buildFormMeta() {
102
+ const nameField = {
103
+ token: 'new-org-name',
104
+ name: 'name',
105
+ label: this.t('nameLabel'),
106
+ hint: '',
107
+ placeholder: this.t('namePlaceholder'),
108
+ type: InputType.TEXT,
109
+ order: 1,
110
+ validators: [Validators.required, Validators.minLength(2), Validators.maxLength(100)],
111
+ errors: {
112
+ required: this.t('nameRequired'),
113
+ minlength: this.t('nameMin'),
114
+ },
115
+ value: '',
116
+ state: ComponentStates.ENABLED,
117
+ };
118
+ const typeField = {
119
+ token: 'new-org-type',
120
+ name: 'type',
121
+ label: this.t('typeLabel'),
122
+ hint: '',
123
+ placeholder: '',
124
+ type: InputType.SELECT,
125
+ order: 2,
126
+ validators: [Validators.required],
127
+ errors: {},
128
+ value: 'PERSONAL',
129
+ withDefault: 'PERSONAL',
130
+ state: ComponentStates.ENABLED,
131
+ options: [
132
+ { id: 'PERSONAL', name: this.t('typePersonal'), order: 1 },
133
+ { id: 'PRIVATE', name: this.t('typePrivate'), order: 2 },
134
+ { id: 'PUBLIC', name: this.t('typePublic'), order: 3 },
135
+ { id: 'BUSINESS', name: this.t('typeBusiness'), order: 4 },
136
+ ],
137
+ };
138
+ const descriptionField = {
139
+ token: 'new-org-description',
140
+ name: 'description',
141
+ label: this.t('descriptionLabel'),
142
+ hint: '',
143
+ placeholder: this.t('descriptionPlaceholder'),
144
+ type: InputType.TEXTAREA,
145
+ order: 3,
146
+ validators: [],
147
+ errors: {},
148
+ value: '',
149
+ state: ComponentStates.ENABLED,
150
+ };
151
+ const submitButton = {
152
+ text: this.t('createCta'),
153
+ color: 'dark',
154
+ type: 'submit',
155
+ fill: 'solid',
156
+ size: 'default',
157
+ shape: 'round',
158
+ expand: 'block',
159
+ state: ComponentStates.ENABLED,
160
+ token: 'new-org-submit',
161
+ };
162
+ return {
163
+ name: '',
164
+ state: ComponentStates.ENABLED,
165
+ sections: [
166
+ {
167
+ name: '',
168
+ order: 1,
169
+ fields: [nameField, typeField, descriptionField],
170
+ },
171
+ ],
172
+ actions: submitButton,
173
+ };
174
+ }
175
+ t(key) {
176
+ return this.i18n.t(key, this.i18nNamespace);
177
+ }
178
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CreateOrgModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
179
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CreateOrgModalComponent, isStandalone: true, selector: "val-create-org-modal", inputs: { _modalRef: "_modalRef", onSuccess: "onSuccess", i18nNamespace: "i18nNamespace" }, ngImport: i0, template: `
180
+ <ion-header>
181
+ <ion-toolbar>
182
+ <ion-buttons slot="end">
183
+ <ion-button fill="clear" color="dark" (click)="dismiss()">
184
+ <strong>{{ t('close') }}</strong>
185
+ </ion-button>
186
+ </ion-buttons>
187
+ </ion-toolbar>
188
+ </ion-header>
189
+ <ion-content class="ion-padding">
190
+ <val-display [props]="{ content: t('pageTitle'), size: 'small', color: 'dark' }" />
191
+ <val-title
192
+ [props]="{
193
+ content: t('pageDescription'),
194
+ size: 'large',
195
+ color: '',
196
+ bold: false,
197
+ }"
198
+ />
199
+ <val-form [props]="formMeta()" (onSubmit)="onSubmit($event)" />
200
+ </ion-content>
201
+ `, isInline: true, dependencies: [{ kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: 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: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
202
+ }
203
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CreateOrgModalComponent, decorators: [{
204
+ type: Component,
205
+ args: [{
206
+ selector: 'val-create-org-modal',
207
+ standalone: true,
208
+ imports: [IonHeader, IonToolbar, IonButtons, IonButton, IonContent, FormComponent, DisplayComponent, TitleComponent],
209
+ template: `
210
+ <ion-header>
211
+ <ion-toolbar>
212
+ <ion-buttons slot="end">
213
+ <ion-button fill="clear" color="dark" (click)="dismiss()">
214
+ <strong>{{ t('close') }}</strong>
215
+ </ion-button>
216
+ </ion-buttons>
217
+ </ion-toolbar>
218
+ </ion-header>
219
+ <ion-content class="ion-padding">
220
+ <val-display [props]="{ content: t('pageTitle'), size: 'small', color: 'dark' }" />
221
+ <val-title
222
+ [props]="{
223
+ content: t('pageDescription'),
224
+ size: 'large',
225
+ color: '',
226
+ bold: false,
227
+ }"
228
+ />
229
+ <val-form [props]="formMeta()" (onSubmit)="onSubmit($event)" />
230
+ </ion-content>
231
+ `,
232
+ }]
233
+ }], ctorParameters: () => [], propDecorators: { _modalRef: [{
234
+ type: Input
235
+ }], onSuccess: [{
236
+ type: Input
237
+ }], i18nNamespace: [{
238
+ type: Input
239
+ }] } });
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW9yZy1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL2NyZWF0ZS1vcmctbW9kYWwvY3JlYXRlLW9yZy1tb2RhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFckcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZUFBZSxFQUEyQyxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFckYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FB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Q1IsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQztpQkFDakQ7YUFDRjtZQUNELE9BQU8sRUFBRSxZQUFZO1NBQ3RCLENBQUM7SUFDSixDQUFDO0lBRUQsQ0FBQyxDQUFDLEdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUMsQ0FBQzsrR0F0S1UsdUJBQXVCO21HQUF2Qix1QkFBdUIsNEtBeEJ4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCVCw0REF2QlMsU0FBUyxvR0FBRSxVQUFVLG1GQUFFLFVBQVUsOEVBQUUsU0FBUyxvUEFBRSxVQUFVLHdLQUFFLGFBQWEsOEhBQUUsZ0JBQWdCLDJFQUFFLGNBQWM7OzRGQXlCeEcsdUJBQXVCO2tCQTVCbkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsc0JBQXNCO29CQUNoQyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDO29CQUNwSCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQlQ7aUJBQ0Y7d0RBU1UsU0FBUztzQkFBakIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGVmZmVjdCwgaW5qZWN0LCBJbnB1dCwgc2lnbmFsLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJb25CdXR0b24sIElvbkJ1dHRvbnMsIElvbkNvbnRlbnQsIElvbkhlYWRlciwgSW9uVG9vbGJhciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuXG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEaXNwbGF5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvZGlzcGxheS9kaXNwbGF5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaXRsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL3RpdGxlL3RpdGxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21wb25lbnRTdGF0ZXMsIEZvcm1NZXRhZGF0YSwgRm9ybVN1Ym1pdCwgSW5wdXRNZXRhZGF0YSwgSW5wdXRUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgT3JnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL29yZy9vcmcuc2VydmljZSc7XG5pbXBvcnQgeyBPcmdhbml6YXRpb24sIE9yZ1R5cGUgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9vcmcvdHlwZXMnO1xuaW1wb3J0IHsgT3JnU3dpdGNoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgvb3JnLXN3aXRjaC5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVmFsdGVjaEVycm9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Vycm9ycy92YWx0ZWNoLWVycm9yLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBDUkVBVEVfT1JHX01PREFMX0kxOE4gfSBmcm9tICcuL2NyZWF0ZS1vcmctbW9kYWwuaTE4bic7XG5cbmNvbnN0IERFRkFVTFRfTkFNRVNQQUNFID0gJ0NyZWF0ZU9yZ01vZGFsJztcblxuLyoqXG4gKiBgdmFsLWNyZWF0ZS1vcmctbW9kYWxgIOKAlCBtb2RhbCBkZSBjcmVhY2nDs24gZGUgb3JnYW5pemFjacOzbiAob3JnYW5pc21cbiAqIGNvbXBhcnRpZG8pLiBQcm9tb3ZpZG8gZGVzZGUgYHNob3djYXNlYCBiYWpvIGVsIHByb2Nlc28gZGUgQURSLTAyMS4gUmV1c2FkbyBwb3JcbiAqIGxhIHZpc3RhIEN1ZW50YSAoeSBmdXR1cmFzIHZpc3RhcyBvcmctYXdhcmUpLlxuICpcbiAqIENyZWEgbGEgb3JnIHbDrWEgYE9yZ1NlcnZpY2UuY3JlYXRlT3JnYCB5LCBlbiDDqXhpdG8sIGNhbWJpYSBhIGVsbGEgY29uXG4gKiBgT3JnU3dpdGNoU2VydmljZS5zd2l0Y2hUb2AuIEVsIGZvcm11bGFyaW8gKG5vbWJyZSArIHRpcG8gKyBkZXNjcmlwY2nDs24pIHNlXG4gKiBjb25zdHJ1eWUgdW5hIHZleiB5IHNlIG1hbnRpZW5lIHJlYWN0aXZvIGEgaWRpb21hICsgZXN0YWRvIGRlIHRyYWJham8gdsOtYVxuICogZWZmZWN0cyBgYWxsb3dTaWduYWxXcml0ZXNgLlxuICpcbiAqIEFiaWVydG8gdsOtYSBgTW9kYWxTZXJ2aWNlYCDigJQgcmVjaWJlIGBfbW9kYWxSZWZgIHBvciBgY29tcG9uZW50UHJvcHNgICsgY2FsbGJhY2tcbiAqIGBvblN1Y2Nlc3MobmV3T3JnKWAuIEhlYWRlciBjYW7Ds25pY28gKFJlZ2xhICM1KTogc2luIGBpb24tdGl0bGVgLCBib3TDs24gQ2VycmFyXG4gKiB0ZXh0byBlbiBgc2xvdD1lbmRgLCB0w610dWxvL3N1YnTDrXR1bG8gZW4gZWwgYm9keSBjb24gYHZhbC1kaXNwbGF5YC9gdmFsLXRpdGxlYC5cbiAqXG4gKiBBdXRvLXJlZ2lzdHJhIHN1cyBkZWZhdWx0cyBpMThuIChlcy9lbikgc2kgZWwgY29uc3VtZXIgbm8gcHJvdmV5w7MgZWwgbmFtZXNwYWNlXG4gKiBgQ3JlYXRlT3JnTW9kYWxgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtY3JlYXRlLW9yZy1tb2RhbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtJb25IZWFkZXIsIElvblRvb2xiYXIsIElvbkJ1dHRvbnMsIElvbkJ1dHRvbiwgSW9uQ29udGVudCwgRm9ybUNvbXBvbmVudCwgRGlzcGxheUNvbXBvbmVudCwgVGl0bGVDb21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxpb24taGVhZGVyPlxuICAgICAgPGlvbi10b29sYmFyPlxuICAgICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJkaXNtaXNzKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInsgY29udGVudDogdCgncGFnZVRpdGxlJyksIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycgfVwiIC8+XG4gICAgICA8dmFsLXRpdGxlXG4gICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgY29udGVudDogdCgncGFnZURlc2NyaXB0aW9uJyksXG4gICAgICAgICAgc2l6ZTogJ2xhcmdlJyxcbiAgICAgICAgICBjb2xvcjogJycsXG4gICAgICAgICAgYm9sZDogZmFsc2UsXG4gICAgICAgIH1cIlxuICAgICAgLz5cbiAgICAgIDx2YWwtZm9ybSBbcHJvcHNdPVwiZm9ybU1ldGEoKVwiIChvblN1Ym1pdCk9XCJvblN1Ym1pdCgkZXZlbnQpXCIgLz5cbiAgICA8L2lvbi1jb250ZW50PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBDcmVhdGVPcmdNb2RhbENvbXBvbmVudCB7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgb3JnU2VydmljZSA9IGluamVjdChPcmdTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBvcmdTd2l0Y2ggPSBpbmplY3QoT3JnU3dpdGNoU2VydmljZSk7XG4gIHByaXZhdGUgdG9hc3QgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBlcnJvcnMgPSBpbmplY3QoVmFsdGVjaEVycm9yU2VydmljZSk7XG5cbiAgLyoqIElueWVjdGFkbyBwb3IgYE1vZGFsU2VydmljZS5vcGVuYCDigJQgcmVmZXJlbmNpYSBwYXJhIGNlcnJhciBkZXNkZSBkZW50cm8uICovXG4gIEBJbnB1dCgpIF9tb2RhbFJlZj86IHsgZGlzbWlzczogKGRhdGE/OiB1bmtub3duLCByb2xlPzogc3RyaW5nKSA9PiB2b2lkIH07XG5cbiAgLyoqIENhbGxiYWNrIHRyYXMgY3JlYXIgbGEgb3JnIChwYXNhZG8gcG9yIGBjb21wb25lbnRQcm9wc2ApLiAqL1xuICBASW5wdXQoKSBvblN1Y2Nlc3M/OiAobmV3T3JnOiBPcmdhbml6YXRpb24pID0+IHZvaWQ7XG5cbiAgLyoqIE5hbWVzcGFjZSBpMThuIGNvbiBxdWUgbGEgdmlzdGEgcmVzdWVsdmUgc3VzIHRleHRvcy4gKi9cbiAgQElucHV0KCkgaTE4bk5hbWVzcGFjZSA9IERFRkFVTFRfTkFNRVNQQUNFO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2J1c3kgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBmb3JtTWV0YTogV3JpdGFibGVTaWduYWw8Rm9ybU1ldGFkYXRhPjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoIXRoaXMuaTE4bi5oYXNOYW1lc3BhY2UoREVGQVVMVF9OQU1FU1BBQ0UpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJDb250ZW50KERFRkFVTFRfTkFNRVNQQUNFLCBDUkVBVEVfT1JHX01PREFMX0kxOE4pO1xuICAgIH1cbiAgICB0aGlzLmZvcm1NZXRhID0gc2lnbmFsKHRoaXMuYnVpbGRGb3JtTWV0YSgpKTtcblxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICAgICAgdGhpcy5mb3JtTWV0YS5zZXQodGhpcy5idWlsZEZvcm1NZXRhKCkpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtpbmcgPSB0aGlzLl9idXN5KCk7XG4gICAgICAgIHRoaXMuZm9ybU1ldGEudXBkYXRlKG1ldGEgPT4gKHtcbiAgICAgICAgICAuLi5tZXRhLFxuICAgICAgICAgIHN0YXRlOiB3b3JraW5nID8gQ29tcG9uZW50U3RhdGVzLldPUktJTkcgOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgICBhY3Rpb25zOiB7XG4gICAgICAgICAgICAuLi5tZXRhLmFjdGlvbnMsXG4gICAgICAgICAgICBzdGF0ZTogd29ya2luZyA/IENvbXBvbmVudFN0YXRlcy5XT1JLSU5HIDogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkpO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG4gIH1cblxuICBhc3luYyBvblN1Ym1pdChldmVudDogRm9ybVN1Ym1pdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9idXN5KCkpIHJldHVybjtcbiAgICBjb25zdCBuYW1lID0gZXZlbnQuZmllbGRzWyduYW1lJ10gYXMgc3RyaW5nO1xuICAgIGNvbnN0IHR5cGUgPSBldmVudC5maWVsZHNbJ3R5cGUnXSBhcyBPcmdUeXBlO1xuICAgIGlmICghbmFtZT8udHJpbSgpIHx8ICF0eXBlKSB7XG4gICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLnQoJ2ZpbGxSZXF1aXJlZCcpLFxuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2J1c3kuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGV2ZW50LmZpZWxkc1snZGVzY3JpcHRpb24nXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBuZXdPcmcgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLm9yZ1NlcnZpY2UuY3JlYXRlT3JnKHsgbmFtZSwgdHlwZSwgZGVzY3JpcHRpb24gfSkpO1xuICAgICAgdGhpcy50b2FzdC5zaG93KHtcbiAgICAgICAgbWVzc2FnZTogdGhpcy50KCdzdWNjZXNzTXNnJyksXG4gICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgIGR1cmF0aW9uOiAzNTAwLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLm9yZ1N3aXRjaC5zd2l0Y2hUbyhuZXdPcmcuaWQpO1xuICAgICAgdGhpcy5vblN1Y2Nlc3M/LihuZXdPcmcpO1xuICAgICAgdGhpcy5fbW9kYWxSZWY/LmRpc21pc3MobmV3T3JnLCAnY29uZmlybScpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwgeyBpMThuTmFtZXNwYWNlOiB0aGlzLmkxOG5OYW1lc3BhY2UgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2J1c3kuc2V0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBkaXNtaXNzKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsUmVmPy5kaXNtaXNzKG51bGwsICdjYW5jZWwnKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGb3JtTWV0YSgpOiBGb3JtTWV0YWRhdGEge1xuICAgIGNvbnN0IG5hbWVGaWVsZDogSW5wdXRNZXRhZGF0YSA9IHtcbiAgICAgIHRva2VuOiAnbmV3LW9yZy1uYW1lJyxcbiAgICAgIG5hbWU6ICduYW1lJyxcbiAgICAgIGxhYmVsOiB0aGlzLnQoJ25hbWVMYWJlbCcpLFxuICAgICAgaGludDogJycsXG4gICAgICBwbGFjZWhvbGRlcjogdGhpcy50KCduYW1lUGxhY2Vob2xkZXInKSxcbiAgICAgIHR5cGU6IElucHV0VHlwZS5URVhULFxuICAgICAgb3JkZXI6IDEsXG4gICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMiksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMCldLFxuICAgICAgZXJyb3JzOiB7XG4gICAgICAgIHJlcXVpcmVkOiB0aGlzLnQoJ25hbWVSZXF1aXJlZCcpLFxuICAgICAgICBtaW5sZW5ndGg6IHRoaXMudCgnbmFtZU1pbicpLFxuICAgICAgfSxcbiAgICAgIHZhbHVlOiAnJyxcbiAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICB9IGFzIElucHV0TWV0YWRhdGE7XG5cbiAgICBjb25zdCB0eXBlRmllbGQ6IElucHV0TWV0YWRhdGEgPSB7XG4gICAgICB0b2tlbjogJ25ldy1vcmctdHlwZScsXG4gICAgICBuYW1lOiAndHlwZScsXG4gICAgICBsYWJlbDogdGhpcy50KCd0eXBlTGFiZWwnKSxcbiAgICAgIGhpbnQ6ICcnLFxuICAgICAgcGxhY2Vob2xkZXI6ICcnLFxuICAgICAgdHlwZTogSW5wdXRUeXBlLlNFTEVDVCxcbiAgICAgIG9yZGVyOiAyLFxuICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgZXJyb3JzOiB7fSxcbiAgICAgIHZhbHVlOiAnUEVSU09OQUwnLFxuICAgICAgd2l0aERlZmF1bHQ6ICdQRVJTT05BTCcsXG4gICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgaWQ6ICdQRVJTT05BTCcsIG5hbWU6IHRoaXMudCgndHlwZVBlcnNvbmFsJyksIG9yZGVyOiAxIH0sXG4gICAgICAgIHsgaWQ6ICdQUklWQVRFJywgbmFtZTogdGhpcy50KCd0eXBlUHJpdmF0ZScpLCBvcmRlcjogMiB9LFxuICAgICAgICB7IGlkOiAnUFVCTElDJywgbmFtZTogdGhpcy50KCd0eXBlUHVibGljJyksIG9yZGVyOiAzIH0sXG4gICAgICAgIHsgaWQ6ICdCVVNJTkVTUycsIG5hbWU6IHRoaXMudCgndHlwZUJ1c2luZXNzJyksIG9yZGVyOiA0IH0sXG4gICAgICBdLFxuICAgIH0gYXMgSW5wdXRNZXRhZGF0YTtcblxuICAgIGNvbnN0IGRlc2NyaXB0aW9uRmllbGQ6IElucHV0TWV0YWRhdGEgPSB7XG4gICAgICB0b2tlbjogJ25ldy1vcmctZGVzY3JpcHRpb24nLFxuICAgICAgbmFtZTogJ2Rlc2NyaXB0aW9uJyxcbiAgICAgIGxhYmVsOiB0aGlzLnQoJ2Rlc2NyaXB0aW9uTGFiZWwnKSxcbiAgICAgIGhpbnQ6ICcnLFxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMudCgnZGVzY3JpcHRpb25QbGFjZWhvbGRlcicpLFxuICAgICAgdHlwZTogSW5wdXRUeXBlLlRFWFRBUkVBLFxuICAgICAgb3JkZXI6IDMsXG4gICAgICB2YWxpZGF0b3JzOiBbXSxcbiAgICAgIGVycm9yczoge30sXG4gICAgICB2YWx1ZTogJycsXG4gICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgfSBhcyBJbnB1dE1ldGFkYXRhO1xuXG4gICAgY29uc3Qgc3VibWl0QnV0dG9uID0ge1xuICAgICAgdGV4dDogdGhpcy50KCdjcmVhdGVDdGEnKSxcbiAgICAgIGNvbG9yOiAnZGFyaycgYXMgY29uc3QsXG4gICAgICB0eXBlOiAnc3VibWl0JyBhcyBjb25zdCxcbiAgICAgIGZpbGw6ICdzb2xpZCcgYXMgY29uc3QsXG4gICAgICBzaXplOiAnZGVmYXVsdCcgYXMgY29uc3QsXG4gICAgICBzaGFwZTogJ3JvdW5kJyBhcyBjb25zdCxcbiAgICAgIGV4cGFuZDogJ2Jsb2NrJyBhcyBjb25zdCxcbiAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgIHRva2VuOiAnbmV3LW9yZy1zdWJtaXQnLFxuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJycsXG4gICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgb3JkZXI6IDEsXG4gICAgICAgICAgZmllbGRzOiBbbmFtZUZpZWxkLCB0eXBlRmllbGQsIGRlc2NyaXB0aW9uRmllbGRdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGFjdGlvbnM6IHN1Ym1pdEJ1dHRvbixcbiAgICB9O1xuICB9XG5cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgdGhpcy5pMThuTmFtZXNwYWNlKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Defaults i18n (es/en) embebidos en `val-create-org-modal`. Auto-registrados en
3
+ * el constructor del componente si el consumer no proveyó el namespace
4
+ * (`CreateOrgModal` por default). SOLO incluye las keys que el modal usa.
5
+ */
6
+ export const CREATE_ORG_MODAL_I18N = {
7
+ es: {
8
+ pageTitle: 'Nueva organización',
9
+ pageDescription: 'Crea una nueva organización',
10
+ nameLabel: 'Nombre',
11
+ namePlaceholder: 'Nombre de la organización',
12
+ typeLabel: 'Tipo',
13
+ descriptionLabel: 'Descripción',
14
+ descriptionPlaceholder: 'Opcional',
15
+ createCta: 'Crear organización',
16
+ close: 'Cancelar',
17
+ nameRequired: 'El nombre es obligatorio',
18
+ nameMin: 'Mínimo 2 caracteres',
19
+ typePersonal: 'Personal',
20
+ typePrivate: 'Privada',
21
+ typePublic: 'Pública',
22
+ typeBusiness: 'Empresa',
23
+ successMsg: 'Organización creada. Cambiando...',
24
+ fillRequired: 'Completa todos los campos requeridos.',
25
+ },
26
+ en: {
27
+ pageTitle: 'New organization',
28
+ pageDescription: 'Create a new organization',
29
+ nameLabel: 'Name',
30
+ namePlaceholder: 'Organization name',
31
+ typeLabel: 'Type',
32
+ descriptionLabel: 'Description',
33
+ descriptionPlaceholder: 'Optional',
34
+ createCta: 'Create organization',
35
+ close: 'Cancel',
36
+ nameRequired: 'Name is required',
37
+ nameMin: 'Minimum 2 characters',
38
+ typePersonal: 'Personal',
39
+ typePrivate: 'Private',
40
+ typePublic: 'Public',
41
+ typeBusiness: 'Business',
42
+ successMsg: 'Organization created. Switching...',
43
+ fillRequired: 'Please fill in all required fields.',
44
+ },
45
+ };
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLW9yZy1tb2RhbC5pMThuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9jcmVhdGUtb3JnLW1vZGFsL2NyZWF0ZS1vcmctbW9kYWwuaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQXFCO0lBQ3JELEVBQUUsRUFBRTtRQUNGLFNBQVMsRUFBRSxvQkFBb0I7UUFDL0IsZUFBZSxFQUFFLDZCQUE2QjtRQUM5QyxTQUFTLEVBQUUsUUFBUTtRQUNuQixlQUFlLEVBQUUsMkJBQTJCO1FBQzVDLFNBQVMsRUFBRSxNQUFNO1FBQ2pCLGdCQUFnQixFQUFFLGFBQWE7UUFDL0Isc0JBQXNCLEVBQUUsVUFBVTtRQUNsQyxTQUFTLEVBQUUsb0JBQW9CO1FBQy9CLEtBQUssRUFBRSxVQUFVO1FBQ2pCLFlBQVksRUFBRSwwQkFBMEI7UUFDeEMsT0FBTyxFQUFFLHFCQUFxQjtRQUM5QixZQUFZLEVBQUUsVUFBVTtRQUN4QixXQUFXLEVBQUUsU0FBUztRQUN0QixVQUFVLEVBQUUsU0FBUztRQUNyQixZQUFZLEVBQUUsU0FBUztRQUN2QixVQUFVLEVBQUUsbUNBQW1DO1FBQy9DLFlBQVksRUFBRSx1Q0FBdUM7S0FDdEQ7SUFDRCxFQUFFLEVBQUU7UUFDRixTQUFTLEVBQUUsa0JBQWtCO1FBQzdCLGVBQWUsRUFBRSwyQkFBMkI7UUFDNUMsU0FBUyxFQUFFLE1BQU07UUFDakIsZUFBZSxFQUFFLG1CQUFtQjtRQUNwQyxTQUFTLEVBQUUsTUFBTTtRQUNqQixnQkFBZ0IsRUFBRSxhQUFhO1FBQy9CLHNCQUFzQixFQUFFLFVBQVU7UUFDbEMsU0FBUyxFQUFFLHFCQUFxQjtRQUNoQyxLQUFLLEVBQUUsUUFBUTtRQUNmLFlBQVksRUFBRSxrQkFBa0I7UUFDaEMsT0FBTyxFQUFFLHNCQUFzQjtRQUMvQixZQUFZLEVBQUUsVUFBVTtRQUN4QixXQUFXLEVBQUUsU0FBUztRQUN0QixVQUFVLEVBQUUsUUFBUTtRQUNwQixZQUFZLEVBQUUsVUFBVTtRQUN4QixVQUFVLEVBQUUsb0NBQW9DO1FBQ2hELFlBQVksRUFBRSxxQ0FBcUM7S0FDcEQ7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTGFuZ3VhZ2VzQ29udGVudCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4vdHlwZXMnO1xuXG4vKipcbiAqIERlZmF1bHRzIGkxOG4gKGVzL2VuKSBlbWJlYmlkb3MgZW4gYHZhbC1jcmVhdGUtb3JnLW1vZGFsYC4gQXV0by1yZWdpc3RyYWRvcyBlblxuICogZWwgY29uc3RydWN0b3IgZGVsIGNvbXBvbmVudGUgc2kgZWwgY29uc3VtZXIgbm8gcHJvdmV5w7MgZWwgbmFtZXNwYWNlXG4gKiAoYENyZWF0ZU9yZ01vZGFsYCBwb3IgZGVmYXVsdCkuIFNPTE8gaW5jbHV5ZSBsYXMga2V5cyBxdWUgZWwgbW9kYWwgdXNhLlxuICovXG5leHBvcnQgY29uc3QgQ1JFQVRFX09SR19NT0RBTF9JMThOOiBMYW5ndWFnZXNDb250ZW50ID0ge1xuICBlczoge1xuICAgIHBhZ2VUaXRsZTogJ051ZXZhIG9yZ2FuaXphY2nDs24nLFxuICAgIHBhZ2VEZXNjcmlwdGlvbjogJ0NyZWEgdW5hIG51ZXZhIG9yZ2FuaXphY2nDs24nLFxuICAgIG5hbWVMYWJlbDogJ05vbWJyZScsXG4gICAgbmFtZVBsYWNlaG9sZGVyOiAnTm9tYnJlIGRlIGxhIG9yZ2FuaXphY2nDs24nLFxuICAgIHR5cGVMYWJlbDogJ1RpcG8nLFxuICAgIGRlc2NyaXB0aW9uTGFiZWw6ICdEZXNjcmlwY2nDs24nLFxuICAgIGRlc2NyaXB0aW9uUGxhY2Vob2xkZXI6ICdPcGNpb25hbCcsXG4gICAgY3JlYXRlQ3RhOiAnQ3JlYXIgb3JnYW5pemFjacOzbicsXG4gICAgY2xvc2U6ICdDYW5jZWxhcicsXG4gICAgbmFtZVJlcXVpcmVkOiAnRWwgbm9tYnJlIGVzIG9ibGlnYXRvcmlvJyxcbiAgICBuYW1lTWluOiAnTcOtbmltbyAyIGNhcmFjdGVyZXMnLFxuICAgIHR5cGVQZXJzb25hbDogJ1BlcnNvbmFsJyxcbiAgICB0eXBlUHJpdmF0ZTogJ1ByaXZhZGEnLFxuICAgIHR5cGVQdWJsaWM6ICdQw7pibGljYScsXG4gICAgdHlwZUJ1c2luZXNzOiAnRW1wcmVzYScsXG4gICAgc3VjY2Vzc01zZzogJ09yZ2FuaXphY2nDs24gY3JlYWRhLiBDYW1iaWFuZG8uLi4nLFxuICAgIGZpbGxSZXF1aXJlZDogJ0NvbXBsZXRhIHRvZG9zIGxvcyBjYW1wb3MgcmVxdWVyaWRvcy4nLFxuICB9LFxuICBlbjoge1xuICAgIHBhZ2VUaXRsZTogJ05ldyBvcmdhbml6YXRpb24nLFxuICAgIHBhZ2VEZXNjcmlwdGlvbjogJ0NyZWF0ZSBhIG5ldyBvcmdhbml6YXRpb24nLFxuICAgIG5hbWVMYWJlbDogJ05hbWUnLFxuICAgIG5hbWVQbGFjZWhvbGRlcjogJ09yZ2FuaXphdGlvbiBuYW1lJyxcbiAgICB0eXBlTGFiZWw6ICdUeXBlJyxcbiAgICBkZXNjcmlwdGlvbkxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgIGRlc2NyaXB0aW9uUGxhY2Vob2xkZXI6ICdPcHRpb25hbCcsXG4gICAgY3JlYXRlQ3RhOiAnQ3JlYXRlIG9yZ2FuaXphdGlvbicsXG4gICAgY2xvc2U6ICdDYW5jZWwnLFxuICAgIG5hbWVSZXF1aXJlZDogJ05hbWUgaXMgcmVxdWlyZWQnLFxuICAgIG5hbWVNaW46ICdNaW5pbXVtIDIgY2hhcmFjdGVycycsXG4gICAgdHlwZVBlcnNvbmFsOiAnUGVyc29uYWwnLFxuICAgIHR5cGVQcml2YXRlOiAnUHJpdmF0ZScsXG4gICAgdHlwZVB1YmxpYzogJ1B1YmxpYycsXG4gICAgdHlwZUJ1c2luZXNzOiAnQnVzaW5lc3MnLFxuICAgIHN1Y2Nlc3NNc2c6ICdPcmdhbml6YXRpb24gY3JlYXRlZC4gU3dpdGNoaW5nLi4uJyxcbiAgICBmaWxsUmVxdWlyZWQ6ICdQbGVhc2UgZmlsbCBpbiBhbGwgcmVxdWlyZWQgZmllbGRzLicsXG4gIH0sXG59O1xuIl19
@@ -0,0 +1,272 @@
1
+ import { Component, computed, inject, Input, signal } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { IonButton, IonButtons, IonContent, IonHeader, IonSpinner, IonToolbar } from '@ionic/angular/standalone';
4
+ import { firstValueFrom } from 'rxjs';
5
+ import { FormComponent } from '../form/form.component';
6
+ import { ComponentStates, InputType } from '../../types';
7
+ import { AuthService } from '../../../services/auth/auth.service';
8
+ import { I18nService } from '../../../services/i18n';
9
+ import { ToastService } from '../../../services/toast.service';
10
+ import { ValtechErrorService } from '../../../services/errors/valtech-error.service';
11
+ import { DELETE_ACCOUNT_MODAL_I18N } from './delete-account-modal.i18n';
12
+ import * as i0 from "@angular/core";
13
+ const DEFAULT_NAMESPACE = 'Settings.DeleteAccount';
14
+ /**
15
+ * `val-delete-account-modal` — modal de eliminación de cuenta (organism,
16
+ * cuenta-específico). Promovido desde `showcase` bajo el proceso de ADR-021.
17
+ *
18
+ * Decide el flujo según si la cuenta tiene contraseña:
19
+ * - **con password** → pide la contraseña actual y la verifica vía
20
+ * `auth.deleteAccount({ password })`.
21
+ * - **sin password** (cuenta OAuth) → envía un código por email
22
+ * (`auth.sendDeleteAccountCode()`) y lo pide para confirmar
23
+ * (`auth.deleteAccount({ code })`).
24
+ *
25
+ * Abierto vía `ModalService` — recibe `_modalRef` por `componentProps` para
26
+ * cerrar desde dentro. Header canónico (Regla #5): sin `ion-title`, botón Cerrar
27
+ * texto en `slot=end`, título/subtítulo en el body vía `val-form`.
28
+ *
29
+ * Auto-registra sus defaults i18n (es/en) en el constructor si el consumer no
30
+ * proveyó el namespace `Settings.DeleteAccount`.
31
+ */
32
+ export class DeleteAccountModalComponent {
33
+ constructor() {
34
+ this.auth = inject(AuthService);
35
+ this.errors = inject(ValtechErrorService);
36
+ this.i18n = inject(I18nService);
37
+ this.toast = inject(ToastService);
38
+ /** Namespace i18n con que la vista resuelve sus textos. */
39
+ this.i18nNamespace = DEFAULT_NAMESPACE;
40
+ this.hasPassword = signal(null);
41
+ this.codeSent = signal(false);
42
+ this.formState = signal(ComponentStates.ENABLED);
43
+ this.t = (key) => this.i18n.t(key, this.i18nNamespace);
44
+ this.passwordFormProps = computed(() => ({
45
+ name: this.t('title'),
46
+ state: this.formState(),
47
+ sections: [
48
+ {
49
+ name: this.t('warningPassword'),
50
+ order: 0,
51
+ fields: [
52
+ {
53
+ token: 'delete-password',
54
+ name: 'password',
55
+ label: this.t('passwordLabel'),
56
+ hint: '',
57
+ placeholder: this.t('passwordPlaceholder'),
58
+ type: InputType.PASSWORD,
59
+ order: 0,
60
+ validators: [Validators.required],
61
+ errors: { required: this.t('passwordRequired') },
62
+ state: ComponentStates.ENABLED,
63
+ },
64
+ ],
65
+ },
66
+ ],
67
+ actions: this.submitBtn('delete-password-submit', 'confirmCta'),
68
+ }));
69
+ this.sendCodeFormProps = computed(() => ({
70
+ name: this.t('title'),
71
+ state: this.formState(),
72
+ sections: [
73
+ {
74
+ name: this.t('warningSendCode'),
75
+ order: 0,
76
+ fields: [],
77
+ },
78
+ ],
79
+ actions: this.submitBtn('delete-send-code-submit', 'sendCodeCta'),
80
+ }));
81
+ this.codeFormProps = computed(() => ({
82
+ name: this.t('title'),
83
+ state: this.formState(),
84
+ sections: [
85
+ {
86
+ name: this.t('warningEnterCode'),
87
+ order: 0,
88
+ fields: [
89
+ {
90
+ token: 'delete-code',
91
+ name: 'code',
92
+ label: this.t('codeLabel'),
93
+ hint: '',
94
+ placeholder: this.t('codePlaceholder'),
95
+ type: InputType.TEXT,
96
+ order: 0,
97
+ validators: [Validators.required],
98
+ errors: { required: this.t('codeRequired') },
99
+ state: ComponentStates.ENABLED,
100
+ },
101
+ ],
102
+ },
103
+ ],
104
+ actions: this.submitBtn('delete-code-submit', 'confirmCta'),
105
+ }));
106
+ if (!this.i18n.hasNamespace(DEFAULT_NAMESPACE)) {
107
+ this.i18n.registerContent(DEFAULT_NAMESPACE, DELETE_ACCOUNT_MODAL_I18N);
108
+ }
109
+ }
110
+ ngOnInit() {
111
+ firstValueFrom(this.auth.getProfile())
112
+ .then(profile => this.hasPassword.set(profile.hasPassword ?? true))
113
+ .catch(() => this.hasPassword.set(true));
114
+ }
115
+ submitBtn(token, textKey) {
116
+ return {
117
+ text: this.t(textKey),
118
+ type: 'submit',
119
+ expand: 'block',
120
+ fill: 'solid',
121
+ color: 'dark',
122
+ size: 'default',
123
+ token,
124
+ state: ComponentStates.ENABLED,
125
+ };
126
+ }
127
+ close() {
128
+ this._modalRef?.dismiss(undefined, 'cancel');
129
+ }
130
+ async onPasswordSubmit(event) {
131
+ const password = event.fields['password'];
132
+ if (!password) {
133
+ this.toast.show({
134
+ message: this.t('passwordRequired'),
135
+ duration: 3000,
136
+ color: 'dark',
137
+ position: 'top',
138
+ });
139
+ return;
140
+ }
141
+ this.formState.set(ComponentStates.WORKING);
142
+ try {
143
+ await firstValueFrom(this.auth.deleteAccount({ password }));
144
+ }
145
+ catch (err) {
146
+ this.errors.handle(err, { context: 'delete-account.password' });
147
+ this.formState.set(ComponentStates.ENABLED);
148
+ }
149
+ }
150
+ async onSendCode() {
151
+ this.formState.set(ComponentStates.WORKING);
152
+ try {
153
+ await firstValueFrom(this.auth.sendDeleteAccountCode());
154
+ this.codeSent.set(true);
155
+ }
156
+ catch (err) {
157
+ this.errors.handle(err, { context: 'delete-account.send-code' });
158
+ }
159
+ finally {
160
+ this.formState.set(ComponentStates.ENABLED);
161
+ }
162
+ }
163
+ async onResendCode() {
164
+ this.codeSent.set(false);
165
+ await this.onSendCode();
166
+ }
167
+ async onCodeSubmit(event) {
168
+ const code = event.fields['code'];
169
+ if (!code) {
170
+ this.toast.show({
171
+ message: this.t('codeRequired'),
172
+ duration: 3000,
173
+ color: 'dark',
174
+ position: 'top',
175
+ });
176
+ return;
177
+ }
178
+ this.formState.set(ComponentStates.WORKING);
179
+ try {
180
+ await firstValueFrom(this.auth.deleteAccount({ code }));
181
+ }
182
+ catch (err) {
183
+ this.errors.handle(err, { context: 'delete-account.code' });
184
+ this.formState.set(ComponentStates.ENABLED);
185
+ }
186
+ }
187
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DeleteAccountModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
188
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: DeleteAccountModalComponent, isStandalone: true, selector: "val-delete-account-modal", inputs: { _modalRef: "_modalRef", i18nNamespace: "i18nNamespace" }, ngImport: i0, template: `
189
+ <ion-header>
190
+ <ion-toolbar>
191
+ <ion-buttons slot="end">
192
+ <ion-button fill="clear" color="dark" (click)="close()">
193
+ <strong>{{ t('close') }}</strong>
194
+ </ion-button>
195
+ </ion-buttons>
196
+ </ion-toolbar>
197
+ </ion-header>
198
+
199
+ <ion-content class="ion-padding">
200
+ <section class="modal-form-section">
201
+ @if (hasPassword() === null) {
202
+ <div class="spinner-center">
203
+ <ion-spinner name="crescent" />
204
+ </div>
205
+ } @else if (hasPassword()) {
206
+ <val-form [props]="passwordFormProps()" (onSubmit)="onPasswordSubmit($event)" />
207
+ } @else if (!codeSent()) {
208
+ <val-form [props]="sendCodeFormProps()" (onSubmit)="onSendCode()" />
209
+ } @else {
210
+ <val-form [props]="codeFormProps()" (onSubmit)="onCodeSubmit($event)" />
211
+ <div class="resend-row">
212
+ <ion-button
213
+ fill="clear"
214
+ color="medium"
215
+ size="small"
216
+ [disabled]="formState() === 'WORKING'"
217
+ (click)="onResendCode()"
218
+ >
219
+ {{ t('resend') }}
220
+ </ion-button>
221
+ </div>
222
+ }
223
+ </section>
224
+ </ion-content>
225
+ `, isInline: true, styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.resend-row{display:flex;justify-content:center;margin-top:-8px}.spinner-center{display:flex;justify-content:center;padding-top:32px}\n"], dependencies: [{ kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: 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: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }] }); }
226
+ }
227
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DeleteAccountModalComponent, decorators: [{
228
+ type: Component,
229
+ args: [{ selector: 'val-delete-account-modal', standalone: true, imports: [IonHeader, IonToolbar, IonButtons, IonButton, IonContent, IonSpinner, FormComponent], template: `
230
+ <ion-header>
231
+ <ion-toolbar>
232
+ <ion-buttons slot="end">
233
+ <ion-button fill="clear" color="dark" (click)="close()">
234
+ <strong>{{ t('close') }}</strong>
235
+ </ion-button>
236
+ </ion-buttons>
237
+ </ion-toolbar>
238
+ </ion-header>
239
+
240
+ <ion-content class="ion-padding">
241
+ <section class="modal-form-section">
242
+ @if (hasPassword() === null) {
243
+ <div class="spinner-center">
244
+ <ion-spinner name="crescent" />
245
+ </div>
246
+ } @else if (hasPassword()) {
247
+ <val-form [props]="passwordFormProps()" (onSubmit)="onPasswordSubmit($event)" />
248
+ } @else if (!codeSent()) {
249
+ <val-form [props]="sendCodeFormProps()" (onSubmit)="onSendCode()" />
250
+ } @else {
251
+ <val-form [props]="codeFormProps()" (onSubmit)="onCodeSubmit($event)" />
252
+ <div class="resend-row">
253
+ <ion-button
254
+ fill="clear"
255
+ color="medium"
256
+ size="small"
257
+ [disabled]="formState() === 'WORKING'"
258
+ (click)="onResendCode()"
259
+ >
260
+ {{ t('resend') }}
261
+ </ion-button>
262
+ </div>
263
+ }
264
+ </section>
265
+ </ion-content>
266
+ `, styles: [".modal-form-section{display:flex;flex-direction:column;gap:16px;max-width:420px;margin:0 auto;padding-top:8px}.resend-row{display:flex;justify-content:center;margin-top:-8px}.spinner-center{display:flex;justify-content:center;padding-top:32px}\n"] }]
267
+ }], ctorParameters: () => [], propDecorators: { _modalRef: [{
268
+ type: Input
269
+ }], i18nNamespace: [{
270
+ type: Input
271
+ }] } });
272
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLWFjY291bnQtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9kZWxldGUtYWNjb3VudC1tb2RhbC9kZWxldGUtYWNjb3VudC1tb2RhbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBa0IsZUFBZSxFQUEyQyxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFbEgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFckYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBRXhFLE1BQU0saUJBQWlCLEdBQUcsd0JBQXdCLENBQUM7QUFFbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBa0VILE1BQU0sT0FBTywyQkFBMkI7SUFnQnRDO1FBZlEsU0FBSSxHQUFHLE1BQU0s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QWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLENBQUM7SUFDSCxDQUFDOytHQXZLVSwyQkFBMkI7bUdBQTNCLDJCQUEyQix3SkE3RDVCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUNULCtUQXRDUyxTQUFTLG9HQUFFLFVBQVUsbUZBQUUsVUFBVSw4RUFBRSxTQUFTLG9QQUFFLFVBQVUsd0tBQUUsVUFBVSx5R0FBRSxhQUFhOzs0RkE4RGxGLDJCQUEyQjtrQkFqRXZDLFNBQVM7K0JBQ0UsMEJBQTBCLGNBQ3hCLElBQUksV0FDUCxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxZQUNwRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDVDt3REErQlEsU0FBUztzQkFBakIsS0FBSztnQkFHRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBJbnB1dCwgT25Jbml0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJb25CdXR0b24sIElvbkJ1dHRvbnMsIElvbkNvbnRlbnQsIElvbkhlYWRlciwgSW9uU3Bpbm5lciwgSW9uVG9vbGJhciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RhdGUsIENvbXBvbmVudFN0YXRlcywgRm9ybU1ldGFkYXRhLCBGb3JtU3VibWl0LCBJbnB1dE1ldGFkYXRhLCBJbnB1dFR5cGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aC9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVmFsdGVjaEVycm9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Vycm9ycy92YWx0ZWNoLWVycm9yLnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBERUxFVEVfQUNDT1VOVF9NT0RBTF9JMThOIH0gZnJvbSAnLi9kZWxldGUtYWNjb3VudC1tb2RhbC5pMThuJztcblxuY29uc3QgREVGQVVMVF9OQU1FU1BBQ0UgPSAnU2V0dGluZ3MuRGVsZXRlQWNjb3VudCc7XG5cbi8qKlxuICogYHZhbC1kZWxldGUtYWNjb3VudC1tb2RhbGAg4oCUIG1vZGFsIGRlIGVsaW1pbmFjacOzbiBkZSBjdWVudGEgKG9yZ2FuaXNtLFxuICogY3VlbnRhLWVzcGVjw61maWNvKS4gUHJvbW92aWRvIGRlc2RlIGBzaG93Y2FzZWAgYmFqbyBlbCBwcm9jZXNvIGRlIEFEUi0wMjEuXG4gKlxuICogRGVjaWRlIGVsIGZsdWpvIHNlZ8O6biBzaSBsYSBjdWVudGEgdGllbmUgY29udHJhc2XDsWE6XG4gKiAgLSAqKmNvbiBwYXNzd29yZCoqIOKGkiBwaWRlIGxhIGNvbnRyYXNlw7FhIGFjdHVhbCB5IGxhIHZlcmlmaWNhIHbDrWFcbiAqICAgIGBhdXRoLmRlbGV0ZUFjY291bnQoeyBwYXNzd29yZCB9KWAuXG4gKiAgLSAqKnNpbiBwYXNzd29yZCoqIChjdWVudGEgT0F1dGgpIOKGkiBlbnbDrWEgdW4gY8OzZGlnbyBwb3IgZW1haWxcbiAqICAgIChgYXV0aC5zZW5kRGVsZXRlQWNjb3VudENvZGUoKWApIHkgbG8gcGlkZSBwYXJhIGNvbmZpcm1hclxuICogICAgKGBhdXRoLmRlbGV0ZUFjY291bnQoeyBjb2RlIH0pYCkuXG4gKlxuICogQWJpZXJ0byB2w61hIGBNb2RhbFNlcnZpY2VgIOKAlCByZWNpYmUgYF9tb2RhbFJlZmAgcG9yIGBjb21wb25lbnRQcm9wc2AgcGFyYVxuICogY2VycmFyIGRlc2RlIGRlbnRyby4gSGVhZGVyIGNhbsOzbmljbyAoUmVnbGEgIzUpOiBzaW4gYGlvbi10aXRsZWAsIGJvdMOzbiBDZXJyYXJcbiAqIHRleHRvIGVuIGBzbG90PWVuZGAsIHTDrXR1bG8vc3VidMOtdHVsbyBlbiBlbCBib2R5IHbDrWEgYHZhbC1mb3JtYC5cbiAqXG4gKiBBdXRvLXJlZ2lzdHJhIHN1cyBkZWZhdWx0cyBpMThuIChlcy9lbikgZW4gZWwgY29uc3RydWN0b3Igc2kgZWwgY29uc3VtZXIgbm9cbiAqIHByb3ZlecOzIGVsIG5hbWVzcGFjZSBgU2V0dGluZ3MuRGVsZXRlQWNjb3VudGAuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1kZWxldGUtYWNjb3VudC1tb2RhbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtJb25IZWFkZXIsIElvblRvb2xiYXIsIElvbkJ1dHRvbnMsIElvbkJ1dHRvbiwgSW9uQ29udGVudCwgSW9uU3Bpbm5lciwgRm9ybUNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgdCgnY2xvc2UnKSB9fTwvc3Ryb25nPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuXG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgIDxzZWN0aW9uIGNsYXNzPVwibW9kYWwtZm9ybS1zZWN0aW9uXCI+XG4gICAgICAgIEBpZiAoaGFzUGFzc3dvcmQoKSA9PT0gbnVsbCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyLWNlbnRlclwiPlxuICAgICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2UgaWYgKGhhc1Bhc3N3b3JkKCkpIHtcbiAgICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cInBhc3N3b3JkRm9ybVByb3BzKClcIiAob25TdWJtaXQpPVwib25QYXNzd29yZFN1Ym1pdCgkZXZlbnQpXCIgLz5cbiAgICAgICAgfSBAZWxzZSBpZiAoIWNvZGVTZW50KCkpIHtcbiAgICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cInNlbmRDb2RlRm9ybVByb3BzKClcIiAob25TdWJtaXQpPVwib25TZW5kQ29kZSgpXCIgLz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHZhbC1mb3JtIFtwcm9wc109XCJjb2RlRm9ybVByb3BzKClcIiAob25TdWJtaXQpPVwib25Db2RlU3VibWl0KCRldmVudClcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXNlbmQtcm93XCI+XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICAgICAgICBjb2xvcj1cIm1lZGl1bVwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtU3RhdGUoKSA9PT0gJ1dPUktJTkcnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVzZW5kQ29kZSgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3sgdCgncmVzZW5kJykgfX1cbiAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIC5tb2RhbC1mb3JtLXNlY3Rpb24ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICAgIG1heC13aWR0aDogNDIwcHg7XG4gICAgICAgIG1hcmdpbjogMCBhdXRvO1xuICAgICAgICBwYWRkaW5nLXRvcDogOHB4O1xuICAgICAgfVxuICAgICAgLnJlc2VuZC1yb3cge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgbWFyZ2luLXRvcDogLThweDtcbiAgICAgIH1cbiAgICAgIC5zcGlubmVyLWNlbnRlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBwYWRkaW5nLXRvcDogMzJweDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEZWxldGVBY2NvdW50TW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIGF1dGggPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuICBwcml2YXRlIGVycm9ycyA9IGluamVjdChWYWx0ZWNoRXJyb3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0b2FzdCA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuXG4gIC8qKiBJbnllY3RhZG8gcG9yIGBNb2RhbFNlcnZpY2Uub3BlbmAg4oCUIHJlZmVyZW5jaWEgcGFyYSBjZXJyYXIgZGVzZGUgZGVudHJvLiAqL1xuICBASW5wdXQoKSBfbW9kYWxSZWY/OiB7IGRpc21pc3M6IChkYXRhPzogdW5rbm93biwgcm9sZT86IHN0cmluZykgPT4gdm9pZCB9O1xuXG4gIC8qKiBOYW1lc3BhY2UgaTE4biBjb24gcXVlIGxhIHZpc3RhIHJlc3VlbHZlIHN1cyB0ZXh0b3MuICovXG4gIEBJbnB1dCgpIGkxOG5OYW1lc3BhY2UgPSBERUZBVUxUX05BTUVTUEFDRTtcblxuICByZWFkb25seSBoYXNQYXNzd29yZCA9IHNpZ25hbDxib29sZWFuIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGNvZGVTZW50ID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgZm9ybVN0YXRlID0gc2lnbmFsPENvbXBvbmVudFN0YXRlPihDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKERFRkFVTFRfTkFNRVNQQUNFKSkge1xuICAgICAgdGhpcy5pMThuLnJlZ2lzdGVyQ29udGVudChERUZBVUxUX05BTUVTUEFDRSwgREVMRVRFX0FDQ09VTlRfTU9EQUxfSTE4Tik7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLmdldFByb2ZpbGUoKSlcbiAgICAgIC50aGVuKHByb2ZpbGUgPT4gdGhpcy5oYXNQYXNzd29yZC5zZXQocHJvZmlsZS5oYXNQYXNzd29yZCA/PyB0cnVlKSlcbiAgICAgIC5jYXRjaCgoKSA9PiB0aGlzLmhhc1Bhc3N3b3JkLnNldCh0cnVlKSk7XG4gIH1cblxuICB0ID0gKGtleTogc3RyaW5nKTogc3RyaW5nID0+IHRoaXMuaTE4bi50KGtleSwgdGhpcy5pMThuTmFtZXNwYWNlKTtcblxuICBwcml2YXRlIHN1Ym1pdEJ0bih0b2tlbjogc3RyaW5nLCB0ZXh0S2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogdGhpcy50KHRleHRLZXkpLFxuICAgICAgdHlwZTogJ3N1Ym1pdCcgYXMgY29uc3QsXG4gICAgICBleHBhbmQ6ICdibG9jaycgYXMgY29uc3QsXG4gICAgICBmaWxsOiAnc29saWQnIGFzIGNvbnN0LFxuICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgIHNpemU6ICdkZWZhdWx0JyBhcyBjb25zdCxcbiAgICAgIHRva2VuLFxuICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgIH07XG4gIH1cblxuICByZWFkb25seSBwYXNzd29yZEZvcm1Qcm9wcyA9IGNvbXB1dGVkPEZvcm1NZXRhZGF0YT4oKCkgPT4gKHtcbiAgICBuYW1lOiB0aGlzLnQoJ3RpdGxlJyksXG4gICAgc3RhdGU6IHRoaXMuZm9ybVN0YXRlKCksXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogdGhpcy50KCd3YXJuaW5nUGFzc3dvcmQnKSxcbiAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRva2VuOiAnZGVsZXRlLXBhc3N3b3JkJyxcbiAgICAgICAgICAgIG5hbWU6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICBsYWJlbDogdGhpcy50KCdwYXNzd29yZExhYmVsJyksXG4gICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnQoJ3Bhc3N3b3JkUGxhY2Vob2xkZXInKSxcbiAgICAgICAgICAgIHR5cGU6IElucHV0VHlwZS5QQVNTV09SRCxcbiAgICAgICAgICAgIG9yZGVyOiAwLFxuICAgICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgZXJyb3JzOiB7IHJlcXVpcmVkOiB0aGlzLnQoJ3Bhc3N3b3JkUmVxdWlyZWQnKSB9LFxuICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgIH0gYXMgSW5wdXRNZXRhZGF0YSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBhY3Rpb25zOiB0aGlzLnN1Ym1pdEJ0bignZGVsZXRlLXBhc3N3b3JkLXN1Ym1pdCcsICdjb25maXJtQ3RhJyksXG4gIH0pKTtcblxuICByZWFkb25seSBzZW5kQ29kZUZvcm1Qcm9wcyA9IGNvbXB1dGVkPEZvcm1NZXRhZGF0YT4oKCkgPT4gKHtcbiAgICBuYW1lOiB0aGlzLnQoJ3RpdGxlJyksXG4gICAgc3RhdGU6IHRoaXMuZm9ybVN0YXRlKCksXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogdGhpcy50KCd3YXJuaW5nU2VuZENvZGUnKSxcbiAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgIGZpZWxkczogW10sXG4gICAgICB9LFxuICAgIF0sXG4gICAgYWN0aW9uczogdGhpcy5zdWJtaXRCdG4oJ2RlbGV0ZS1zZW5kLWNvZGUtc3VibWl0JywgJ3NlbmRDb2RlQ3RhJyksXG4gIH0pKTtcblxuICByZWFkb25seSBjb2RlRm9ybVByb3BzID0gY29tcHV0ZWQ8Rm9ybU1ldGFkYXRhPigoKSA9PiAoe1xuICAgIG5hbWU6IHRoaXMudCgndGl0bGUnKSxcbiAgICBzdGF0ZTogdGhpcy5mb3JtU3RhdGUoKSxcbiAgICBzZWN0aW9uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiB0aGlzLnQoJ3dhcm5pbmdFbnRlckNvZGUnKSxcbiAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRva2VuOiAnZGVsZXRlLWNvZGUnLFxuICAgICAgICAgICAgbmFtZTogJ2NvZGUnLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMudCgnY29kZUxhYmVsJyksXG4gICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnQoJ2NvZGVQbGFjZWhvbGRlcicpLFxuICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLlRFWFQsXG4gICAgICAgICAgICBvcmRlcjogMCxcbiAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIGVycm9yczogeyByZXF1aXJlZDogdGhpcy50KCdjb2RlUmVxdWlyZWQnKSB9LFxuICAgICAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgICAgIH0gYXMgSW5wdXRNZXRhZGF0YSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBhY3Rpb25zOiB0aGlzLnN1Ym1pdEJ0bignZGVsZXRlLWNvZGUtc3VibWl0JywgJ2NvbmZpcm1DdGEnKSxcbiAgfSkpO1xuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX21vZGFsUmVmPy5kaXNtaXNzKHVuZGVmaW5lZCwgJ2NhbmNlbCcpO1xuICB9XG5cbiAgYXN5bmMgb25QYXNzd29yZFN1Ym1pdChldmVudDogRm9ybVN1Ym1pdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhc3N3b3JkID0gZXZlbnQuZmllbGRzWydwYXNzd29yZCddO1xuICAgIGlmICghcGFzc3dvcmQpIHtcbiAgICAgIHRoaXMudG9hc3Quc2hvdyh7XG4gICAgICAgIG1lc3NhZ2U6IHRoaXMudCgncGFzc3dvcmRSZXF1aXJlZCcpLFxuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuV09SS0lORyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXV0aC5kZWxldGVBY2NvdW50KHsgcGFzc3dvcmQgfSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwgeyBjb250ZXh0OiAnZGVsZXRlLWFjY291bnQucGFzc3dvcmQnIH0pO1xuICAgICAgdGhpcy5mb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvblNlbmRDb2RlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuZm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuV09SS0lORyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuYXV0aC5zZW5kRGVsZXRlQWNjb3VudENvZGUoKSk7XG4gICAgICB0aGlzLmNvZGVTZW50LnNldCh0cnVlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuZXJyb3JzLmhhbmRsZShlcnIsIHsgY29udGV4dDogJ2RlbGV0ZS1hY2NvdW50LnNlbmQtY29kZScgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZm9ybVN0YXRlLnNldChDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25SZXNlbmRDb2RlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY29kZVNlbnQuc2V0KGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLm9uU2VuZENvZGUoKTtcbiAgfVxuXG4gIGFzeW5jIG9uQ29kZVN1Ym1pdChldmVudDogRm9ybVN1Ym1pdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvZGUgPSBldmVudC5maWVsZHNbJ2NvZGUnXTtcbiAgICBpZiAoIWNvZGUpIHtcbiAgICAgIHRoaXMudG9hc3Quc2hvdyh7XG4gICAgICAgIG1lc3NhZ2U6IHRoaXMudCgnY29kZVJlcXVpcmVkJyksXG4gICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5XT1JLSU5HKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hdXRoLmRlbGV0ZUFjY291bnQoeyBjb2RlIH0pKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuZXJyb3JzLmhhbmRsZShlcnIsIHsgY29udGV4dDogJ2RlbGV0ZS1hY2NvdW50LmNvZGUnIH0pO1xuICAgICAgdGhpcy5mb3JtU3RhdGUuc2V0KENvbXBvbmVudFN0YXRlcy5FTkFCTEVEKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==