valtech-components 4.0.972 → 4.0.973

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.
@@ -1,12 +1,13 @@
1
- import { Component, EventEmitter, Input, Output, ViewChild, inject, signal, } from '@angular/core';
1
+ import { Component, EventEmitter, Injector, Input, Output, ViewChild, inject, signal, } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
- import { IonButton, IonIcon } from '@ionic/angular/standalone';
3
+ import { IonButton, IonIcon, IonSpinner } from '@ionic/angular/standalone';
4
4
  import { addIcons } from 'ionicons';
5
- import { chatboxOutline, listOutline, removeOutline } from 'ionicons/icons';
5
+ import { chatboxOutline, imageOutline, listOutline, removeOutline } from 'ionicons/icons';
6
6
  import { Editor } from '@tiptap/core';
7
7
  import StarterKit from '@tiptap/starter-kit';
8
8
  import Image from '@tiptap/extension-image';
9
9
  import { I18nService } from '../../../services/i18n';
10
+ import { StorageService } from '../../../services/firebase/storage.service';
10
11
  import { RICH_EDITOR_I18N } from './rich-editor.i18n';
11
12
  import { tiptapDocToArticle } from './tiptap-to-article';
12
13
  import { articleToTiptapDoc } from './article-to-tiptap';
@@ -14,7 +15,7 @@ import * as i0 from "@angular/core";
14
15
  // Íconos de la toolbar. B/I/H2/H3 no tienen ícono Ionicons dedicado — se
15
16
  // renderizan como texto ("B", "I", "H2", "H3") directo en el botón, mismo
16
17
  // criterio que un editor de texto rico convencional (Google Docs, Notion).
17
- addIcons({ listOutline, chatboxOutline, removeOutline });
18
+ addIcons({ listOutline, chatboxOutline, removeOutline, imageOutline });
18
19
  /**
19
20
  * val-rich-editor
20
21
  *
@@ -40,11 +41,13 @@ export class RichEditorComponent {
40
41
  this.props = {};
41
42
  this.articleChange = new EventEmitter();
42
43
  this.i18n = inject(I18nService);
44
+ this.injector = inject(Injector);
43
45
  /** Se recalcula en cada `onUpdate`/`onSelectionUpdate` para reflejar el
44
46
  * mark/nodo activo bajo el cursor (ej. el botón "B" resaltado si el
45
47
  * cursor está dentro de texto en negrita). */
46
48
  this._toolbarTick = signal(0);
47
49
  this.toolbarButtons = signal([]);
50
+ this.uploadingImage = signal(false);
48
51
  this.i18n.registerDefaults('RichEditor', RICH_EDITOR_I18N);
49
52
  }
50
53
  t(key) {
@@ -175,6 +178,36 @@ export class RichEditorComponent {
175
178
  }
176
179
  this.refreshToolbar();
177
180
  }
181
+ /**
182
+ * Sube la imagen elegida vía `StorageService` (Regla #12 — nunca URL pegada
183
+ * a mano, siempre vía Storage) y la inserta en el punto del cursor.
184
+ * `StorageService` se resuelve perezosamente (vía `Injector`, no como
185
+ * campo de la clase): si la app consumer no configuró
186
+ * `provideValtechFirebase`, el editor sigue funcionando normal para todo
187
+ * lo demás — solo el botón de imagen queda sin efecto, con log de error en
188
+ * vez de romper el resto del componente.
189
+ */
190
+ async onImageSelected(event) {
191
+ const input = event.target;
192
+ const file = input.files?.[0];
193
+ input.value = ''; // permite re-seleccionar el mismo archivo después
194
+ if (!file || !this.editor)
195
+ return;
196
+ this.uploadingImage.set(true);
197
+ try {
198
+ const storage = this.injector.get(StorageService);
199
+ const path = `rich-editor/${Date.now()}-${file.name}`;
200
+ const result = await storage.uploadAndGetUrl(path, file);
201
+ this.editor.chain().focus().setImage({ src: result.downloadUrl, alt: file.name }).run();
202
+ this.emitArticle(this.editor.getJSON());
203
+ }
204
+ catch (err) {
205
+ console.error('[val-rich-editor] No se pudo subir la imagen — ¿la app configuró provideValtechFirebase?', err);
206
+ }
207
+ finally {
208
+ this.uploadingImage.set(false);
209
+ }
210
+ }
178
211
  ngOnDestroy() {
179
212
  this.editor?.destroy();
180
213
  }
@@ -221,15 +254,30 @@ export class RichEditorComponent {
221
254
  }
222
255
  </ion-button>
223
256
  }
257
+ <!-- Label trick (mismo patrón que val-attachment-uploader): el
258
+ <label> nativo reenvía el clic al input como gesto confiable,
259
+ ion-button + input.click() programático falla en iOS PWA. -->
260
+ <label
261
+ class="rich-editor__image-btn"
262
+ [class.rich-editor__image-btn--disabled]="uploadingImage()"
263
+ [attr.aria-label]="t('image')"
264
+ >
265
+ @if (uploadingImage()) {
266
+ <ion-spinner name="dots" />
267
+ } @else {
268
+ <ion-icon name="image-outline" />
269
+ }
270
+ <input type="file" accept="image/*" [disabled]="uploadingImage()" (change)="onImageSelected($event)" />
271
+ </label>
224
272
  </div>
225
273
  }
226
274
  <div #editorHost class="rich-editor__surface"></div>
227
275
  </div>
228
- `, isInline: true, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
276
+ `, isInline: true, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__image-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin:0 0 0 4px;border-radius:6px;color:var(--ion-color-dark, #232323);font-size:1.125rem;cursor:pointer}.rich-editor__image-btn:hover{background:#0000000f}.rich-editor__image-btn--disabled{opacity:.5;pointer-events:none}.rich-editor__image-btn input[type=file]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }] }); }
229
277
  }
230
278
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RichEditorComponent, decorators: [{
231
279
  type: Component,
232
- args: [{ selector: 'val-rich-editor', standalone: true, imports: [CommonModule, IonButton, IonIcon], template: `
280
+ args: [{ selector: 'val-rich-editor', standalone: true, imports: [CommonModule, IonButton, IonIcon, IonSpinner], template: `
233
281
  <div class="rich-editor" [class.rich-editor--disabled]="props.disabled">
234
282
  @if (!props.disabled) {
235
283
  <div class="rich-editor__toolbar" role="toolbar">
@@ -271,11 +319,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
271
319
  }
272
320
  </ion-button>
273
321
  }
322
+ <!-- Label trick (mismo patrón que val-attachment-uploader): el
323
+ <label> nativo reenvía el clic al input como gesto confiable,
324
+ ion-button + input.click() programático falla en iOS PWA. -->
325
+ <label
326
+ class="rich-editor__image-btn"
327
+ [class.rich-editor__image-btn--disabled]="uploadingImage()"
328
+ [attr.aria-label]="t('image')"
329
+ >
330
+ @if (uploadingImage()) {
331
+ <ion-spinner name="dots" />
332
+ } @else {
333
+ <ion-icon name="image-outline" />
334
+ }
335
+ <input type="file" accept="image/*" [disabled]="uploadingImage()" (change)="onImageSelected($event)" />
336
+ </label>
274
337
  </div>
275
338
  }
276
339
  <div #editorHost class="rich-editor__surface"></div>
277
340
  </div>
278
- `, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"] }]
341
+ `, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__image-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin:0 0 0 4px;border-radius:6px;color:var(--ion-color-dark, #232323);font-size:1.125rem;cursor:pointer}.rich-editor__image-btn:hover{background:#0000000f}.rich-editor__image-btn--disabled{opacity:.5;pointer-events:none}.rich-editor__image-btn input[type=file]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"] }]
279
342
  }], ctorParameters: () => [], propDecorators: { props: [{
280
343
  type: Input
281
344
  }], articleChange: [{
@@ -284,4 +347,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
284
347
  type: ViewChild,
285
348
  args: ['editorHost', { static: true }]
286
349
  }] } });
287
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9yaWNoLWVkaXRvci9yaWNoLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxLQUFLLE1BQU0seUJBQXlCLENBQUM7QUFFNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUd6RCx5RUFBeUU7QUFDekUsMEVBQTBFO0FBQzFFLDJFQUEyRTtBQUMzRSxRQUFRLENBQUMsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7QUFFekQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0Ft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Z0IsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUMvQixNQUFNO1lBQ1IsS0FBSyxXQUFXO2dCQUNkLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNoQyxNQUFNO1FBQ1YsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDekIsQ0FBQzsrR0F6SlUsbUJBQW1CO21HQUFuQixtQkFBbUIsaVNBakRwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThDVCw2c0RBL0NTLFlBQVksK0JBQUUsU0FBUyxvUEFBRSxPQUFPOzs0RkFrRC9CLG1CQUFtQjtrQkFyRC9CLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsWUFDakM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q1Q7d0RBSVEsS0FBSztzQkFBYixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBRW9DLFVBQVU7c0JBQXBELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBpbmplY3QsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25JY29uIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IGNoYXRib3hPdXRsaW5lLCBsaXN0T3V0bGluZSwgcmVtb3ZlT3V0bGluZSB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJ0B0aXB0YXAvY29yZSc7XG5pbXBvcnQgU3RhcnRlcktpdCBmcm9tICdAdGlwdGFwL3N0YXJ0ZXIta2l0JztcbmltcG9ydCBJbWFnZSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1pbWFnZSc7XG5cbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBBcnRpY2xlTWV0YWRhdGEgfSBmcm9tICcuLi9hcnRpY2xlL3R5cGVzJztcbmltcG9ydCB7IFJpY2hFZGl0b3JNZXRhZGF0YSwgUmljaEVkaXRvclRvb2xiYXJCdXR0b24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFJJQ0hfRURJVE9SX0kxOE4gfSBmcm9tICcuL3JpY2gtZWRpdG9yLmkxOG4nO1xuaW1wb3J0IHsgdGlwdGFwRG9jVG9BcnRpY2xlIH0gZnJvbSAnLi90aXB0YXAtdG8tYXJ0aWNsZSc7XG5pbXBvcnQgeyBhcnRpY2xlVG9UaXB0YXBEb2MgfSBmcm9tICcuL2FydGljbGUtdG8tdGlwdGFwJztcbmltcG9ydCB0eXBlIHsgVGlwdGFwRG9jIH0gZnJvbSAnLi90aXB0YXAtdG8tYXJ0aWNsZSc7XG5cbi8vIMONY29ub3MgZGUgbGEgdG9vbGJhci4gQi9JL0gyL0gzIG5vIHRpZW5lbiDDrWNvbm8gSW9uaWNvbnMgZGVkaWNhZG8g4oCUIHNlXG4vLyByZW5kZXJpemFuIGNvbW8gdGV4dG8gKFwiQlwiLCBcIklcIiwgXCJIMlwiLCBcIkgzXCIpIGRpcmVjdG8gZW4gZWwgYm90w7NuLCBtaXNtb1xuLy8gY3JpdGVyaW8gcXVlIHVuIGVkaXRvciBkZSB0ZXh0byByaWNvIGNvbnZlbmNpb25hbCAoR29vZ2xlIERvY3MsIE5vdGlvbikuXG5hZGRJY29ucyh7IGxpc3RPdXRsaW5lLCBjaGF0Ym94T3V0bGluZSwgcmVtb3ZlT3V0bGluZSB9KTtcblxuLyoqXG4gKiB2YWwtcmljaC1lZGl0b3JcbiAqXG4gKiBPcmdhbmlzbTogZWRpdG9yIFdZU0lXWUcgcmV1c2FibGUgcGFyYSB0b2RhIGxhIHBsYXRhZm9ybWEsIHNvYnJlIFRpcFRhcC5cbiAqIEVtaXRlIGBBcnRpY2xlTWV0YWRhdGFgIOKAlCBlbCBtaXNtbyBjb250cmF0byBxdWUgYHZhbC1hcnRpY2xlYCByZW5kZXJpemEsXG4gKiBxdWUgdGFtYmnDqW4gcHJvZHVjZW4gTWFya2Rvd24gKGBwYXJzZU1hcmtkb3duQXJ0aWNsZWApIHkgKGEgZnV0dXJvKSBlbFxuICogcGFnZSBidWlsZGVyLiBFbCBjb25zdW1lciBudW5jYSB0b2NhIFRpcFRhcCBkaXJlY3RhbWVudGUuXG4gKlxuICogQ29iZXJ0dXJhIGRlIGxhIHRvb2xiYXIgdjE6IG5lZ3JpdGEsIGN1cnNpdmEsIHTDrXR1bG8gKEgyKSwgc3VidMOtdHVsbyAoSDMpLFxuICogbGlzdGEgY29uL3NpbiB2acOxZXRhcywgY2l0YSwgc2VwYXJhZG9yLCBpbWFnZW4uIFZlciBgdGlwdGFwLXRvLWFydGljbGUudHNgXG4gKiBwYXJhIHF1w6kgdGlwb3MgZGUgYEFydGljbGVFbGVtZW50YCBwdWVkZSBwcm9kdWNpciBlbCBlZGl0b3IgaG95LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8dmFsLXJpY2gtZWRpdG9yXG4gKiAgIFtwcm9wc109XCJ7IGluaXRpYWxWYWx1ZTogcmVjaXBlLmRlc2NyaXB0aW9uQXJ0aWNsZSwgcGxhY2Vob2xkZXI6ICdFc2NyaWJlIGxhIHByZXBhcmFjacOzbi4uLicgfVwiXG4gKiAgIChhcnRpY2xlQ2hhbmdlKT1cIm9uQXJ0aWNsZUNoYW5nZSgkZXZlbnQpXCJcbiAqIC8+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXJpY2gtZWRpdG9yJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSW9uQnV0dG9uLCBJb25JY29uXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicmljaC1lZGl0b3JcIiBbY2xhc3MucmljaC1lZGl0b3ItLWRpc2FibGVkXT1cInByb3BzLmRpc2FibGVkXCI+XG4gICAgICBAaWYgKCFwcm9wcy5kaXNhYmxlZCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicmljaC1lZGl0b3JfX3Rvb2xiYXJcIiByb2xlPVwidG9vbGJhclwiPlxuICAgICAgICAgIEBmb3IgKGJ0biBvZiB0b29sYmFyQnV0dG9ucygpOyB0cmFjayBidG4udG9rZW4pIHtcbiAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgIGZpbGw9XCJjbGVhclwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5yaWNoLWVkaXRvcl9fYnRuLS1hY3RpdmVdPVwiYnRuLmlzQWN0aXZlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ0bi5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYnRuLmxhYmVsXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImJ0bi5pc0FjdGl2ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJydW5Db21tYW5kKGJ0bi50b2tlbilcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBAc3dpdGNoIChidG4udG9rZW4pIHtcbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2JvbGQnKSB7XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPkI8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdpdGFsaWMnKSB7XG4gICAgICAgICAgICAgICAgICA8ZW0+STwvZW0+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnaGVhZGluZzInKSB7XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPkgyPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnaGVhZGluZzMnKSB7XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPkgzPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnYnVsbGV0TGlzdCcpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwibGlzdC1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnb3JkZXJlZExpc3QnKSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImxpc3Qtb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ3F1b3RlJykge1xuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGF0Ym94LW91dGxpbmVcIiBzbG90PVwiaWNvbi1vbmx5XCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdzZXBhcmF0b3InKSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInJlbW92ZS1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXYgI2VkaXRvckhvc3QgY2xhc3M9XCJyaWNoLWVkaXRvcl9fc3VyZmFjZVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vcmljaC1lZGl0b3IuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBSaWNoRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwcm9wczogUmljaEVkaXRvck1ldGFkYXRhID0ge307XG4gIEBPdXRwdXQoKSBhcnRpY2xlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcnRpY2xlTWV0YWRhdGE+KCk7XG5cbiAgQFZpZXdDaGlsZCgnZWRpdG9ySG9zdCcsIHsgc3RhdGljOiB0cnVlIH0pIGVkaXRvckhvc3QhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIGVkaXRvcj86IEVkaXRvcjtcblxuICAvKiogU2UgcmVjYWxjdWxhIGVuIGNhZGEgYG9uVXBkYXRlYC9gb25TZWxlY3Rpb25VcGRhdGVgIHBhcmEgcmVmbGVqYXIgZWxcbiAgICogbWFyay9ub2RvIGFjdGl2byBiYWpvIGVsIGN1cnNvciAoZWouIGVsIGJvdMOzbiBcIkJcIiByZXNhbHRhZG8gc2kgZWxcbiAgICogY3Vyc29yIGVzdMOhIGRlbnRybyBkZSB0ZXh0byBlbiBuZWdyaXRhKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdG9vbGJhclRpY2sgPSBzaWduYWwoMCk7XG4gIHJlYWRvbmx5IHRvb2xiYXJCdXR0b25zID0gc2lnbmFsPFJpY2hFZGl0b3JUb29sYmFyQnV0dG9uW10+KFtdKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnUmljaEVkaXRvcicsIFJJQ0hfRURJVE9SX0kxOE4pO1xuICB9XG5cbiAgcHJpdmF0ZSB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnUmljaEVkaXRvcicpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yID0gbmV3IEVkaXRvcih7XG4gICAgICBlbGVtZW50OiB0aGlzLmVkaXRvckhvc3QubmF0aXZlRWxlbWVudCxcbiAgICAgIGV4dGVuc2lvbnM6IFtTdGFydGVyS2l0LCBJbWFnZV0sXG4gICAgICBlZGl0YWJsZTogIXRoaXMucHJvcHMuZGlzYWJsZWQsXG4gICAgICBjb250ZW50OiB0aGlzLnByb3BzLmluaXRpYWxWYWx1ZVxuICAgICAgICA/IChhcnRpY2xlVG9UaXB0YXBEb2ModGhpcy5wcm9wcy5pbml0aWFsVmFsdWUpIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIDogJycsXG4gICAgICBlZGl0b3JQcm9wczoge1xuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgJ2RhdGEtcGxhY2Vob2xkZXInOiB0aGlzLnByb3BzLnBsYWNlaG9sZGVyID8/ICcnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG9uVXBkYXRlOiAoeyBlZGl0b3IgfSkgPT4ge1xuICAgICAgICB0aGlzLmVtaXRBcnRpY2xlKGVkaXRvci5nZXRKU09OKCkgYXMgVGlwdGFwRG9jKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9vbGJhcigpO1xuICAgICAgfSxcbiAgICAgIG9uU2VsZWN0aW9uVXBkYXRlOiAoKSA9PiB0aGlzLnJlZnJlc2hUb29sYmFyKCksXG4gICAgfSk7XG4gICAgdGhpcy5yZWZyZXNoVG9vbGJhcigpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydwcm9wcyddPy5jdXJyZW50VmFsdWUgJiYgdGhpcy5lZGl0b3IpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnNldEVkaXRhYmxlKCF0aGlzLnByb3BzLmRpc2FibGVkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRBcnRpY2xlKGRvYzogVGlwdGFwRG9jKTogdm9pZCB7XG4gICAgdGhpcy5hcnRpY2xlQ2hhbmdlLmVtaXQodGlwdGFwRG9jVG9BcnRpY2xlKGRvYykpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoVG9vbGJhcigpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcbiAgICBpZiAoIWVkaXRvcikgcmV0dXJuO1xuICAgIHRoaXMudG9vbGJhckJ1dHRvbnMuc2V0KFtcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdib2xkJyxcbiAgICAgICAgaWNvbjogJycsXG4gICAgICAgIGxhYmVsOiB0aGlzLnQoJ2JvbGQnKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnYm9sZCcpLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ2l0YWxpYycsXG4gICAgICAgIGljb246ICcnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdpdGFsaWMnKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnaXRhbGljJyksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnaGVhZGluZzInLFxuICAgICAgICBpY29uOiAnJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnaGVhZGluZzInKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnaGVhZGluZycsIHsgbGV2ZWw6IDIgfSksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnaGVhZGluZzMnLFxuICAgICAgICBpY29uOiAnJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnaGVhZGluZzMnKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnaGVhZGluZycsIHsgbGV2ZWw6IDMgfSksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnYnVsbGV0TGlzdCcsXG4gICAgICAgIGljb246ICdsaXN0LW91dGxpbmUnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdidWxsZXRMaXN0JyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2J1bGxldExpc3QnKSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdvcmRlcmVkTGlzdCcsXG4gICAgICAgIGljb246ICdsaXN0LW91dGxpbmUnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdvcmRlcmVkTGlzdCcpLFxuICAgICAgICBpc0FjdGl2ZTogZWRpdG9yLmlzQWN0aXZlKCdvcmRlcmVkTGlzdCcpLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ3F1b3RlJyxcbiAgICAgICAgaWNvbjogJ2NoYXRib3gtb3V0bGluZScsXG4gICAgICAgIGxhYmVsOiB0aGlzLnQoJ3F1b3RlJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2Jsb2NrcXVvdGUnKSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdzZXBhcmF0b3InLFxuICAgICAgICBpY29uOiAncmVtb3ZlLW91dGxpbmUnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdzZXBhcmF0b3InKSxcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG5cbiAgcnVuQ29tbWFuZCh0b2tlbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XG4gICAgaWYgKCFlZGl0b3IpIHJldHVybjtcbiAgICBjb25zdCBjaGFpbiA9IGVkaXRvci5jaGFpbigpLmZvY3VzKCk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSAnYm9sZCc6XG4gICAgICAgIGNoYWluLnRvZ2dsZUJvbGQoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpdGFsaWMnOlxuICAgICAgICBjaGFpbi50b2dnbGVJdGFsaWMoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdoZWFkaW5nMic6XG4gICAgICAgIGNoYWluLnRvZ2dsZUhlYWRpbmcoeyBsZXZlbDogMiB9KS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdoZWFkaW5nMyc6XG4gICAgICAgIGNoYWluLnRvZ2dsZUhlYWRpbmcoeyBsZXZlbDogMyB9KS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdidWxsZXRMaXN0JzpcbiAgICAgICAgY2hhaW4udG9nZ2xlQnVsbGV0TGlzdCgpLnJ1bigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29yZGVyZWRMaXN0JzpcbiAgICAgICAgY2hhaW4udG9nZ2xlT3JkZXJlZExpc3QoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdxdW90ZSc6XG4gICAgICAgIGNoYWluLnRvZ2dsZUJsb2NrcXVvdGUoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZXBhcmF0b3InOlxuICAgICAgICBjaGFpbi5zZXRIb3Jpem9udGFsUnVsZSgpLnJ1bigpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoVG9vbGJhcigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3I/LmRlc3Ryb3koKTtcbiAgfVxufVxuIl19
350
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9yaWNoLWVkaXRvci9yaWNoLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxLQUFLLE1BQU0seUJBQXlCLENBQUM7QUFFNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUc1RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFHekQseUVBQXlFO0FBQ3pFLDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0UsUUFBUSxDQUFD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aWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBpbmplY3QsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25JY29uLCBJb25TcGlubmVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IGNoYXRib3hPdXRsaW5lLCBpbWFnZU91dGxpbmUsIGxpc3RPdXRsaW5lLCByZW1vdmVPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnQHRpcHRhcC9jb3JlJztcbmltcG9ydCBTdGFydGVyS2l0IGZyb20gJ0B0aXB0YXAvc3RhcnRlci1raXQnO1xuaW1wb3J0IEltYWdlIGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWltYWdlJztcblxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmlyZWJhc2Uvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFydGljbGVNZXRhZGF0YSB9IGZyb20gJy4uL2FydGljbGUvdHlwZXMnO1xuaW1wb3J0IHsgUmljaEVkaXRvck1ldGFkYXRhLCBSaWNoRWRpdG9yVG9vbGJhckJ1dHRvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgUklDSF9FRElUT1JfSTE4TiB9IGZyb20gJy4vcmljaC1lZGl0b3IuaTE4bic7XG5pbXBvcnQgeyB0aXB0YXBEb2NUb0FydGljbGUgfSBmcm9tICcuL3RpcHRhcC10by1hcnRpY2xlJztcbmltcG9ydCB7IGFydGljbGVUb1RpcHRhcERvYyB9IGZyb20gJy4vYXJ0aWNsZS10by10aXB0YXAnO1xuaW1wb3J0IHR5cGUgeyBUaXB0YXBEb2MgfSBmcm9tICcuL3RpcHRhcC10by1hcnRpY2xlJztcblxuLy8gw41jb25vcyBkZSBsYSB0b29sYmFyLiBCL0kvSDIvSDMgbm8gdGllbmVuIMOtY29ubyBJb25pY29ucyBkZWRpY2FkbyDigJQgc2Vcbi8vIHJlbmRlcml6YW4gY29tbyB0ZXh0byAoXCJCXCIsIFwiSVwiLCBcIkgyXCIsIFwiSDNcIikgZGlyZWN0byBlbiBlbCBib3TDs24sIG1pc21vXG4vLyBjcml0ZXJpbyBxdWUgdW4gZWRpdG9yIGRlIHRleHRvIHJpY28gY29udmVuY2lvbmFsIChHb29nbGUgRG9jcywgTm90aW9uKS5cbmFkZEljb25zKHsgbGlzdE91dGxpbmUsIGNoYXRib3hPdXRsaW5lLCByZW1vdmVPdXRsaW5lLCBpbWFnZU91dGxpbmUgfSk7XG5cbi8qKlxuICogdmFsLXJpY2gtZWRpdG9yXG4gKlxuICogT3JnYW5pc206IGVkaXRvciBXWVNJV1lHIHJldXNhYmxlIHBhcmEgdG9kYSBsYSBwbGF0YWZvcm1hLCBzb2JyZSBUaXBUYXAuXG4gKiBFbWl0ZSBgQXJ0aWNsZU1ldGFkYXRhYCDigJQgZWwgbWlzbW8gY29udHJhdG8gcXVlIGB2YWwtYXJ0aWNsZWAgcmVuZGVyaXphLFxuICogcXVlIHRhbWJpw6luIHByb2R1Y2VuIE1hcmtkb3duIChgcGFyc2VNYXJrZG93bkFydGljbGVgKSB5IChhIGZ1dHVybykgZWxcbiAqIHBhZ2UgYnVpbGRlci4gRWwgY29uc3VtZXIgbnVuY2EgdG9jYSBUaXBUYXAgZGlyZWN0YW1lbnRlLlxuICpcbiAqIENvYmVydHVyYSBkZSBsYSB0b29sYmFyIHYxOiBuZWdyaXRhLCBjdXJzaXZhLCB0w610dWxvIChIMiksIHN1YnTDrXR1bG8gKEgzKSxcbiAqIGxpc3RhIGNvbi9zaW4gdmnDsWV0YXMsIGNpdGEsIHNlcGFyYWRvciwgaW1hZ2VuLiBWZXIgYHRpcHRhcC10by1hcnRpY2xlLnRzYFxuICogcGFyYSBxdcOpIHRpcG9zIGRlIGBBcnRpY2xlRWxlbWVudGAgcHVlZGUgcHJvZHVjaXIgZWwgZWRpdG9yIGhveS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHZhbC1yaWNoLWVkaXRvclxuICogICBbcHJvcHNdPVwieyBpbml0aWFsVmFsdWU6IHJlY2lwZS5kZXNjcmlwdGlvbkFydGljbGUsIHBsYWNlaG9sZGVyOiAnRXNjcmliZSBsYSBwcmVwYXJhY2nDs24uLi4nIH1cIlxuICogICAoYXJ0aWNsZUNoYW5nZSk9XCJvbkFydGljbGVDaGFuZ2UoJGV2ZW50KVwiXG4gKiAvPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1yaWNoLWVkaXRvcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIElvbkJ1dHRvbiwgSW9uSWNvbiwgSW9uU3Bpbm5lcl0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJpY2gtZWRpdG9yXCIgW2NsYXNzLnJpY2gtZWRpdG9yLS1kaXNhYmxlZF09XCJwcm9wcy5kaXNhYmxlZFwiPlxuICAgICAgQGlmICghcHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJpY2gtZWRpdG9yX190b29sYmFyXCIgcm9sZT1cInRvb2xiYXJcIj5cbiAgICAgICAgICBAZm9yIChidG4gb2YgdG9vbGJhckJ1dHRvbnMoKTsgdHJhY2sgYnRuLnRva2VuKSB7XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICBbY2xhc3MucmljaC1lZGl0b3JfX2J0bi0tYWN0aXZlXT1cImJ0bi5pc0FjdGl2ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidG4uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImJ0bi5sYWJlbFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJidG4uaXNBY3RpdmVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwicnVuQ29tbWFuZChidG4udG9rZW4pXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQHN3aXRjaCAoYnRuLnRva2VuKSB7XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdib2xkJykge1xuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5CPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnaXRhbGljJykge1xuICAgICAgICAgICAgICAgICAgPGVtPkk8L2VtPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2hlYWRpbmcyJykge1xuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5IMjwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2hlYWRpbmczJykge1xuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5IMzwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2J1bGxldExpc3QnKSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImxpc3Qtb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ29yZGVyZWRMaXN0Jykge1xuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJsaXN0LW91dGxpbmVcIiBzbG90PVwiaWNvbi1vbmx5XCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdxdW90ZScpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hhdGJveC1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnc2VwYXJhdG9yJykge1xuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJyZW1vdmUtb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8IS0tIExhYmVsIHRyaWNrIChtaXNtbyBwYXRyw7NuIHF1ZSB2YWwtYXR0YWNobWVudC11cGxvYWRlcik6IGVsXG4gICAgICAgICAgICAgICA8bGFiZWw+IG5hdGl2byByZWVudsOtYSBlbCBjbGljIGFsIGlucHV0IGNvbW8gZ2VzdG8gY29uZmlhYmxlLFxuICAgICAgICAgICAgICAgaW9uLWJ1dHRvbiArIGlucHV0LmNsaWNrKCkgcHJvZ3JhbcOhdGljbyBmYWxsYSBlbiBpT1MgUFdBLiAtLT5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwicmljaC1lZGl0b3JfX2ltYWdlLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MucmljaC1lZGl0b3JfX2ltYWdlLWJ0bi0tZGlzYWJsZWRdPVwidXBsb2FkaW5nSW1hZ2UoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2ltYWdlJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBpZiAodXBsb2FkaW5nSW1hZ2UoKSkge1xuICAgICAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImRvdHNcIiAvPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiaW1hZ2Utb3V0bGluZVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCJpbWFnZS8qXCIgW2Rpc2FibGVkXT1cInVwbG9hZGluZ0ltYWdlKClcIiAoY2hhbmdlKT1cIm9uSW1hZ2VTZWxlY3RlZCgkZXZlbnQpXCIgLz5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXYgI2VkaXRvckhvc3QgY2xhc3M9XCJyaWNoLWVkaXRvcl9fc3VyZmFjZVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vcmljaC1lZGl0b3IuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBSaWNoRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwcm9wczogUmljaEVkaXRvck1ldGFkYXRhID0ge307XG4gIEBPdXRwdXQoKSBhcnRpY2xlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcnRpY2xlTWV0YWRhdGE+KCk7XG5cbiAgQFZpZXdDaGlsZCgnZWRpdG9ySG9zdCcsIHsgc3RhdGljOiB0cnVlIH0pIGVkaXRvckhvc3QhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSBlZGl0b3I/OiBFZGl0b3I7XG5cbiAgLyoqIFNlIHJlY2FsY3VsYSBlbiBjYWRhIGBvblVwZGF0ZWAvYG9uU2VsZWN0aW9uVXBkYXRlYCBwYXJhIHJlZmxlamFyIGVsXG4gICAqIG1hcmsvbm9kbyBhY3Rpdm8gYmFqbyBlbCBjdXJzb3IgKGVqLiBlbCBib3TDs24gXCJCXCIgcmVzYWx0YWRvIHNpIGVsXG4gICAqIGN1cnNvciBlc3TDoSBkZW50cm8gZGUgdGV4dG8gZW4gbmVncml0YSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Rvb2xiYXJUaWNrID0gc2lnbmFsKDApO1xuICByZWFkb25seSB0b29sYmFyQnV0dG9ucyA9IHNpZ25hbDxSaWNoRWRpdG9yVG9vbGJhckJ1dHRvbltdPihbXSk7XG4gIHJlYWRvbmx5IHVwbG9hZGluZ0ltYWdlID0gc2lnbmFsKGZhbHNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnUmljaEVkaXRvcicsIFJJQ0hfRURJVE9SX0kxOE4pO1xuICB9XG5cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgJ1JpY2hFZGl0b3InKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvciA9IG5ldyBFZGl0b3Ioe1xuICAgICAgZWxlbWVudDogdGhpcy5lZGl0b3JIb3N0Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICBleHRlbnNpb25zOiBbU3RhcnRlcktpdCwgSW1hZ2VdLFxuICAgICAgZWRpdGFibGU6ICF0aGlzLnByb3BzLmRpc2FibGVkLFxuICAgICAgY29udGVudDogdGhpcy5wcm9wcy5pbml0aWFsVmFsdWVcbiAgICAgICAgPyAoYXJ0aWNsZVRvVGlwdGFwRG9jKHRoaXMucHJvcHMuaW5pdGlhbFZhbHVlKSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICA6ICcnLFxuICAgICAgZWRpdG9yUHJvcHM6IHtcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICdkYXRhLXBsYWNlaG9sZGVyJzogdGhpcy5wcm9wcy5wbGFjZWhvbGRlciA/PyAnJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZTogKHsgZWRpdG9yIH0pID0+IHtcbiAgICAgICAgdGhpcy5lbWl0QXJ0aWNsZShlZGl0b3IuZ2V0SlNPTigpIGFzIFRpcHRhcERvYyk7XG4gICAgICAgIHRoaXMucmVmcmVzaFRvb2xiYXIoKTtcbiAgICAgIH0sXG4gICAgICBvblNlbGVjdGlvblVwZGF0ZTogKCkgPT4gdGhpcy5yZWZyZXNoVG9vbGJhcigpLFxuICAgIH0pO1xuICAgIHRoaXMucmVmcmVzaFRvb2xiYXIoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sncHJvcHMnXT8uY3VycmVudFZhbHVlICYmIHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmVkaXRvci5zZXRFZGl0YWJsZSghdGhpcy5wcm9wcy5kaXNhYmxlZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0QXJ0aWNsZShkb2M6IFRpcHRhcERvYyk6IHZvaWQge1xuICAgIHRoaXMuYXJ0aWNsZUNoYW5nZS5lbWl0KHRpcHRhcERvY1RvQXJ0aWNsZShkb2MpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFRvb2xiYXIoKTogdm9pZCB7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XG4gICAgaWYgKCFlZGl0b3IpIHJldHVybjtcbiAgICB0aGlzLnRvb2xiYXJCdXR0b25zLnNldChbXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnYm9sZCcsXG4gICAgICAgIGljb246ICcnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdib2xkJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2JvbGQnKSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdpdGFsaWMnLFxuICAgICAgICBpY29uOiAnJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnaXRhbGljJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2l0YWxpYycpLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ2hlYWRpbmcyJyxcbiAgICAgICAgaWNvbjogJycsXG4gICAgICAgIGxhYmVsOiB0aGlzLnQoJ2hlYWRpbmcyJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2hlYWRpbmcnLCB7IGxldmVsOiAyIH0pLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ2hlYWRpbmczJyxcbiAgICAgICAgaWNvbjogJycsXG4gICAgICAgIGxhYmVsOiB0aGlzLnQoJ2hlYWRpbmczJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2hlYWRpbmcnLCB7IGxldmVsOiAzIH0pLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ2J1bGxldExpc3QnLFxuICAgICAgICBpY29uOiAnbGlzdC1vdXRsaW5lJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnYnVsbGV0TGlzdCcpLFxuICAgICAgICBpc0FjdGl2ZTogZWRpdG9yLmlzQWN0aXZlKCdidWxsZXRMaXN0JyksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnb3JkZXJlZExpc3QnLFxuICAgICAgICBpY29uOiAnbGlzdC1vdXRsaW5lJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnb3JkZXJlZExpc3QnKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnb3JkZXJlZExpc3QnKSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdxdW90ZScsXG4gICAgICAgIGljb246ICdjaGF0Ym94LW91dGxpbmUnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdxdW90ZScpLFxuICAgICAgICBpc0FjdGl2ZTogZWRpdG9yLmlzQWN0aXZlKCdibG9ja3F1b3RlJyksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnc2VwYXJhdG9yJyxcbiAgICAgICAgaWNvbjogJ3JlbW92ZS1vdXRsaW5lJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnc2VwYXJhdG9yJyksXG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIHJ1bkNvbW1hbmQodG9rZW46IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yO1xuICAgIGlmICghZWRpdG9yKSByZXR1cm47XG4gICAgY29uc3QgY2hhaW4gPSBlZGl0b3IuY2hhaW4oKS5mb2N1cygpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ2JvbGQnOlxuICAgICAgICBjaGFpbi50b2dnbGVCb2xkKCkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaXRhbGljJzpcbiAgICAgICAgY2hhaW4udG9nZ2xlSXRhbGljKCkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaGVhZGluZzInOlxuICAgICAgICBjaGFpbi50b2dnbGVIZWFkaW5nKHsgbGV2ZWw6IDIgfSkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaGVhZGluZzMnOlxuICAgICAgICBjaGFpbi50b2dnbGVIZWFkaW5nKHsgbGV2ZWw6IDMgfSkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYnVsbGV0TGlzdCc6XG4gICAgICAgIGNoYWluLnRvZ2dsZUJ1bGxldExpc3QoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvcmRlcmVkTGlzdCc6XG4gICAgICAgIGNoYWluLnRvZ2dsZU9yZGVyZWRMaXN0KCkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncXVvdGUnOlxuICAgICAgICBjaGFpbi50b2dnbGVCbG9ja3F1b3RlKCkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VwYXJhdG9yJzpcbiAgICAgICAgY2hhaW4uc2V0SG9yaXpvbnRhbFJ1bGUoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMucmVmcmVzaFRvb2xiYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJlIGxhIGltYWdlbiBlbGVnaWRhIHbDrWEgYFN0b3JhZ2VTZXJ2aWNlYCAoUmVnbGEgIzEyIOKAlCBudW5jYSBVUkwgcGVnYWRhXG4gICAqIGEgbWFubywgc2llbXByZSB2w61hIFN0b3JhZ2UpIHkgbGEgaW5zZXJ0YSBlbiBlbCBwdW50byBkZWwgY3Vyc29yLlxuICAgKiBgU3RvcmFnZVNlcnZpY2VgIHNlIHJlc3VlbHZlIHBlcmV6b3NhbWVudGUgKHbDrWEgYEluamVjdG9yYCwgbm8gY29tb1xuICAgKiBjYW1wbyBkZSBsYSBjbGFzZSk6IHNpIGxhIGFwcCBjb25zdW1lciBubyBjb25maWd1csOzXG4gICAqIGBwcm92aWRlVmFsdGVjaEZpcmViYXNlYCwgZWwgZWRpdG9yIHNpZ3VlIGZ1bmNpb25hbmRvIG5vcm1hbCBwYXJhIHRvZG9cbiAgICogbG8gZGVtw6FzIOKAlCBzb2xvIGVsIGJvdMOzbiBkZSBpbWFnZW4gcXVlZGEgc2luIGVmZWN0bywgY29uIGxvZyBkZSBlcnJvciBlblxuICAgKiB2ZXogZGUgcm9tcGVyIGVsIHJlc3RvIGRlbCBjb21wb25lbnRlLlxuICAgKi9cbiAgYXN5bmMgb25JbWFnZVNlbGVjdGVkKGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzPy5bMF07XG4gICAgaW5wdXQudmFsdWUgPSAnJzsgLy8gcGVybWl0ZSByZS1zZWxlY2Npb25hciBlbCBtaXNtbyBhcmNoaXZvIGRlc3B1w6lzXG4gICAgaWYgKCFmaWxlIHx8ICF0aGlzLmVkaXRvcikgcmV0dXJuO1xuXG4gICAgdGhpcy51cGxvYWRpbmdJbWFnZS5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmluamVjdG9yLmdldChTdG9yYWdlU2VydmljZSk7XG4gICAgICBjb25zdCBwYXRoID0gYHJpY2gtZWRpdG9yLyR7RGF0ZS5ub3coKX0tJHtmaWxlLm5hbWV9YDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UudXBsb2FkQW5kR2V0VXJsKHBhdGgsIGZpbGUpO1xuICAgICAgdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnNldEltYWdlKHsgc3JjOiByZXN1bHQuZG93bmxvYWRVcmwsIGFsdDogZmlsZS5uYW1lIH0pLnJ1bigpO1xuICAgICAgdGhpcy5lbWl0QXJ0aWNsZSh0aGlzLmVkaXRvci5nZXRKU09OKCkgYXMgVGlwdGFwRG9jKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1t2YWwtcmljaC1lZGl0b3JdIE5vIHNlIHB1ZG8gc3ViaXIgbGEgaW1hZ2VuIOKAlCDCv2xhIGFwcCBjb25maWd1csOzIHByb3ZpZGVWYWx0ZWNoRmlyZWJhc2U/JywgZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy51cGxvYWRpbmdJbWFnZS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yPy5kZXN0cm95KCk7XG4gIH1cbn1cbiJdfQ==
@@ -12,6 +12,7 @@ export const RICH_EDITOR_I18N = {
12
12
  orderedList: 'Lista numerada',
13
13
  quote: 'Cita',
14
14
  separator: 'Separador',
15
+ image: 'Insertar imagen',
15
16
  },
16
17
  en: {
17
18
  bold: 'Bold',
@@ -22,6 +23,7 @@ export const RICH_EDITOR_I18N = {
22
23
  orderedList: 'Numbered list',
23
24
  quote: 'Quote',
24
25
  separator: 'Separator',
26
+ image: 'Insert image',
25
27
  },
26
28
  };
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC1lZGl0b3IuaTE4bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvcmljaC1lZGl0b3IvcmljaC1lZGl0b3IuaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixFQUFFLEVBQUU7UUFDRixJQUFJLEVBQUUsU0FBUztRQUNmLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLFFBQVEsRUFBRSxXQUFXO1FBQ3JCLFVBQVUsRUFBRSxtQkFBbUI7UUFDL0IsV0FBVyxFQUFFLGdCQUFnQjtRQUM3QixLQUFLLEVBQUUsTUFBTTtRQUNiLFNBQVMsRUFBRSxXQUFXO0tBQ3ZCO0lBQ0QsRUFBRSxFQUFFO1FBQ0YsSUFBSSxFQUFFLE1BQU07UUFDWixNQUFNLEVBQUUsUUFBUTtRQUNoQixRQUFRLEVBQUUsU0FBUztRQUNuQixRQUFRLEVBQUUsWUFBWTtRQUN0QixVQUFVLEVBQUUsYUFBYTtRQUN6QixXQUFXLEVBQUUsZUFBZTtRQUM1QixLQUFLLEVBQUUsT0FBTztRQUNkLFNBQVMsRUFBRSxXQUFXO0tBQ3ZCO0NBQ08sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVmYXVsdHMgaTE4biAoZXMvZW4pIGRlbCBgdmFsLXJpY2gtZWRpdG9yYC4gQXV0by1yZWdpc3RyYWRvcyBlbiBlbFxuICogY29uc3RydWN0b3IgKG5hbWVzcGFjZSBgUmljaEVkaXRvcmApIOKAlCBlbCBjb25zdW1lciBudW5jYSBsb3MgcmVnaXN0cmEuXG4gKi9cbmV4cG9ydCBjb25zdCBSSUNIX0VESVRPUl9JMThOID0ge1xuICBlczoge1xuICAgIGJvbGQ6ICdOZWdyaXRhJyxcbiAgICBpdGFsaWM6ICdDdXJzaXZhJyxcbiAgICBoZWFkaW5nMjogJ1TDrXR1bG8nLFxuICAgIGhlYWRpbmczOiAnU3VidMOtdHVsbycsXG4gICAgYnVsbGV0TGlzdDogJ0xpc3RhIGNvbiB2acOxZXRhcycsXG4gICAgb3JkZXJlZExpc3Q6ICdMaXN0YSBudW1lcmFkYScsXG4gICAgcXVvdGU6ICdDaXRhJyxcbiAgICBzZXBhcmF0b3I6ICdTZXBhcmFkb3InLFxuICB9LFxuICBlbjoge1xuICAgIGJvbGQ6ICdCb2xkJyxcbiAgICBpdGFsaWM6ICdJdGFsaWMnLFxuICAgIGhlYWRpbmcyOiAnSGVhZGluZycsXG4gICAgaGVhZGluZzM6ICdTdWJoZWFkaW5nJyxcbiAgICBidWxsZXRMaXN0OiAnQnVsbGV0IGxpc3QnLFxuICAgIG9yZGVyZWRMaXN0OiAnTnVtYmVyZWQgbGlzdCcsXG4gICAgcXVvdGU6ICdRdW90ZScsXG4gICAgc2VwYXJhdG9yOiAnU2VwYXJhdG9yJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG4iXX0=
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC1lZGl0b3IuaTE4bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvcmljaC1lZGl0b3IvcmljaC1lZGl0b3IuaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixFQUFFLEVBQUU7UUFDRixJQUFJLEVBQUUsU0FBUztRQUNmLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLFFBQVEsRUFBRSxXQUFXO1FBQ3JCLFVBQVUsRUFBRSxtQkFBbUI7UUFDL0IsV0FBVyxFQUFFLGdCQUFnQjtRQUM3QixLQUFLLEVBQUUsTUFBTTtRQUNiLFNBQVMsRUFBRSxXQUFXO1FBQ3RCLEtBQUssRUFBRSxpQkFBaUI7S0FDekI7SUFDRCxFQUFFLEVBQUU7UUFDRixJQUFJLEVBQUUsTUFBTTtRQUNaLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLFFBQVEsRUFBRSxZQUFZO1FBQ3RCLFVBQVUsRUFBRSxhQUFhO1FBQ3pCLFdBQVcsRUFBRSxlQUFlO1FBQzVCLEtBQUssRUFBRSxPQUFPO1FBQ2QsU0FBUyxFQUFFLFdBQVc7UUFDdEIsS0FBSyxFQUFFLGNBQWM7S0FDdEI7Q0FDTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZWZhdWx0cyBpMThuIChlcy9lbikgZGVsIGB2YWwtcmljaC1lZGl0b3JgLiBBdXRvLXJlZ2lzdHJhZG9zIGVuIGVsXG4gKiBjb25zdHJ1Y3RvciAobmFtZXNwYWNlIGBSaWNoRWRpdG9yYCkg4oCUIGVsIGNvbnN1bWVyIG51bmNhIGxvcyByZWdpc3RyYS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJJQ0hfRURJVE9SX0kxOE4gPSB7XG4gIGVzOiB7XG4gICAgYm9sZDogJ05lZ3JpdGEnLFxuICAgIGl0YWxpYzogJ0N1cnNpdmEnLFxuICAgIGhlYWRpbmcyOiAnVMOtdHVsbycsXG4gICAgaGVhZGluZzM6ICdTdWJ0w610dWxvJyxcbiAgICBidWxsZXRMaXN0OiAnTGlzdGEgY29uIHZpw7FldGFzJyxcbiAgICBvcmRlcmVkTGlzdDogJ0xpc3RhIG51bWVyYWRhJyxcbiAgICBxdW90ZTogJ0NpdGEnLFxuICAgIHNlcGFyYXRvcjogJ1NlcGFyYWRvcicsXG4gICAgaW1hZ2U6ICdJbnNlcnRhciBpbWFnZW4nLFxuICB9LFxuICBlbjoge1xuICAgIGJvbGQ6ICdCb2xkJyxcbiAgICBpdGFsaWM6ICdJdGFsaWMnLFxuICAgIGhlYWRpbmcyOiAnSGVhZGluZycsXG4gICAgaGVhZGluZzM6ICdTdWJoZWFkaW5nJyxcbiAgICBidWxsZXRMaXN0OiAnQnVsbGV0IGxpc3QnLFxuICAgIG9yZGVyZWRMaXN0OiAnTnVtYmVyZWQgbGlzdCcsXG4gICAgcXVvdGU6ICdRdW90ZScsXG4gICAgc2VwYXJhdG9yOiAnU2VwYXJhdG9yJyxcbiAgICBpbWFnZTogJ0luc2VydCBpbWFnZScsXG4gIH0sXG59IGFzIGNvbnN0O1xuIl19
@@ -2,5 +2,5 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export const VERSION = '4.0.972';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC45NzInO1xuIl19
5
+ export const VERSION = '4.0.973';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC45NzMnO1xuIl19
@@ -70,7 +70,7 @@ import fixWebmDuration from 'fix-webm-duration';
70
70
  * Current version of valtech-components.
71
71
  * This is automatically updated during the publish process.
72
72
  */
73
- const VERSION = '4.0.972';
73
+ const VERSION = '4.0.973';
74
74
 
75
75
  function evaluateValtechAccess(rule, context, features = {}, visitedFeatures = new Set()) {
76
76
  if (rule == null)
@@ -39420,6 +39420,7 @@ const RICH_EDITOR_I18N = {
39420
39420
  orderedList: 'Lista numerada',
39421
39421
  quote: 'Cita',
39422
39422
  separator: 'Separador',
39423
+ image: 'Insertar imagen',
39423
39424
  },
39424
39425
  en: {
39425
39426
  bold: 'Bold',
@@ -39430,6 +39431,7 @@ const RICH_EDITOR_I18N = {
39430
39431
  orderedList: 'Numbered list',
39431
39432
  quote: 'Quote',
39432
39433
  separator: 'Separator',
39434
+ image: 'Insert image',
39433
39435
  },
39434
39436
  };
39435
39437
 
@@ -39682,7 +39684,7 @@ function articleToTiptapDoc(article) {
39682
39684
  // Íconos de la toolbar. B/I/H2/H3 no tienen ícono Ionicons dedicado — se
39683
39685
  // renderizan como texto ("B", "I", "H2", "H3") directo en el botón, mismo
39684
39686
  // criterio que un editor de texto rico convencional (Google Docs, Notion).
39685
- addIcons({ listOutline, chatboxOutline, removeOutline });
39687
+ addIcons({ listOutline, chatboxOutline, removeOutline, imageOutline });
39686
39688
  /**
39687
39689
  * val-rich-editor
39688
39690
  *
@@ -39708,11 +39710,13 @@ class RichEditorComponent {
39708
39710
  this.props = {};
39709
39711
  this.articleChange = new EventEmitter();
39710
39712
  this.i18n = inject(I18nService);
39713
+ this.injector = inject(Injector);
39711
39714
  /** Se recalcula en cada `onUpdate`/`onSelectionUpdate` para reflejar el
39712
39715
  * mark/nodo activo bajo el cursor (ej. el botón "B" resaltado si el
39713
39716
  * cursor está dentro de texto en negrita). */
39714
39717
  this._toolbarTick = signal(0);
39715
39718
  this.toolbarButtons = signal([]);
39719
+ this.uploadingImage = signal(false);
39716
39720
  this.i18n.registerDefaults('RichEditor', RICH_EDITOR_I18N);
39717
39721
  }
39718
39722
  t(key) {
@@ -39843,6 +39847,36 @@ class RichEditorComponent {
39843
39847
  }
39844
39848
  this.refreshToolbar();
39845
39849
  }
39850
+ /**
39851
+ * Sube la imagen elegida vía `StorageService` (Regla #12 — nunca URL pegada
39852
+ * a mano, siempre vía Storage) y la inserta en el punto del cursor.
39853
+ * `StorageService` se resuelve perezosamente (vía `Injector`, no como
39854
+ * campo de la clase): si la app consumer no configuró
39855
+ * `provideValtechFirebase`, el editor sigue funcionando normal para todo
39856
+ * lo demás — solo el botón de imagen queda sin efecto, con log de error en
39857
+ * vez de romper el resto del componente.
39858
+ */
39859
+ async onImageSelected(event) {
39860
+ const input = event.target;
39861
+ const file = input.files?.[0];
39862
+ input.value = ''; // permite re-seleccionar el mismo archivo después
39863
+ if (!file || !this.editor)
39864
+ return;
39865
+ this.uploadingImage.set(true);
39866
+ try {
39867
+ const storage = this.injector.get(StorageService);
39868
+ const path = `rich-editor/${Date.now()}-${file.name}`;
39869
+ const result = await storage.uploadAndGetUrl(path, file);
39870
+ this.editor.chain().focus().setImage({ src: result.downloadUrl, alt: file.name }).run();
39871
+ this.emitArticle(this.editor.getJSON());
39872
+ }
39873
+ catch (err) {
39874
+ console.error('[val-rich-editor] No se pudo subir la imagen — ¿la app configuró provideValtechFirebase?', err);
39875
+ }
39876
+ finally {
39877
+ this.uploadingImage.set(false);
39878
+ }
39879
+ }
39846
39880
  ngOnDestroy() {
39847
39881
  this.editor?.destroy();
39848
39882
  }
@@ -39889,15 +39923,30 @@ class RichEditorComponent {
39889
39923
  }
39890
39924
  </ion-button>
39891
39925
  }
39926
+ <!-- Label trick (mismo patrón que val-attachment-uploader): el
39927
+ <label> nativo reenvía el clic al input como gesto confiable,
39928
+ ion-button + input.click() programático falla en iOS PWA. -->
39929
+ <label
39930
+ class="rich-editor__image-btn"
39931
+ [class.rich-editor__image-btn--disabled]="uploadingImage()"
39932
+ [attr.aria-label]="t('image')"
39933
+ >
39934
+ @if (uploadingImage()) {
39935
+ <ion-spinner name="dots" />
39936
+ } @else {
39937
+ <ion-icon name="image-outline" />
39938
+ }
39939
+ <input type="file" accept="image/*" [disabled]="uploadingImage()" (change)="onImageSelected($event)" />
39940
+ </label>
39892
39941
  </div>
39893
39942
  }
39894
39943
  <div #editorHost class="rich-editor__surface"></div>
39895
39944
  </div>
39896
- `, isInline: true, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
39945
+ `, isInline: true, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__image-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin:0 0 0 4px;border-radius:6px;color:var(--ion-color-dark, #232323);font-size:1.125rem;cursor:pointer}.rich-editor__image-btn:hover{background:#0000000f}.rich-editor__image-btn--disabled{opacity:.5;pointer-events:none}.rich-editor__image-btn input[type=file]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }] }); }
39897
39946
  }
39898
39947
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RichEditorComponent, decorators: [{
39899
39948
  type: Component,
39900
- args: [{ selector: 'val-rich-editor', standalone: true, imports: [CommonModule, IonButton, IonIcon], template: `
39949
+ args: [{ selector: 'val-rich-editor', standalone: true, imports: [CommonModule, IonButton, IonIcon, IonSpinner], template: `
39901
39950
  <div class="rich-editor" [class.rich-editor--disabled]="props.disabled">
39902
39951
  @if (!props.disabled) {
39903
39952
  <div class="rich-editor__toolbar" role="toolbar">
@@ -39939,11 +39988,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
39939
39988
  }
39940
39989
  </ion-button>
39941
39990
  }
39991
+ <!-- Label trick (mismo patrón que val-attachment-uploader): el
39992
+ <label> nativo reenvía el clic al input como gesto confiable,
39993
+ ion-button + input.click() programático falla en iOS PWA. -->
39994
+ <label
39995
+ class="rich-editor__image-btn"
39996
+ [class.rich-editor__image-btn--disabled]="uploadingImage()"
39997
+ [attr.aria-label]="t('image')"
39998
+ >
39999
+ @if (uploadingImage()) {
40000
+ <ion-spinner name="dots" />
40001
+ } @else {
40002
+ <ion-icon name="image-outline" />
40003
+ }
40004
+ <input type="file" accept="image/*" [disabled]="uploadingImage()" (change)="onImageSelected($event)" />
40005
+ </label>
39942
40006
  </div>
39943
40007
  }
39944
40008
  <div #editorHost class="rich-editor__surface"></div>
39945
40009
  </div>
39946
- `, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"] }]
40010
+ `, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__image-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin:0 0 0 4px;border-radius:6px;color:var(--ion-color-dark, #232323);font-size:1.125rem;cursor:pointer}.rich-editor__image-btn:hover{background:#0000000f}.rich-editor__image-btn--disabled{opacity:.5;pointer-events:none}.rich-editor__image-btn input[type=file]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"] }]
39947
40011
  }], ctorParameters: () => [], propDecorators: { props: [{
39948
40012
  type: Input
39949
40013
  }], articleChange: [{