valtech-components 2.0.292 → 2.0.294

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/esm2022/lib/components/atoms/avatar/avatar.component.mjs +3 -3
  2. package/esm2022/lib/components/atoms/box/box.component.mjs +3 -3
  3. package/esm2022/lib/components/atoms/button/button.component.mjs +45 -12
  4. package/esm2022/lib/components/atoms/display/display.component.mjs +47 -11
  5. package/esm2022/lib/components/atoms/display/types.mjs +1 -1
  6. package/esm2022/lib/components/atoms/divider/divider.component.mjs +3 -3
  7. package/esm2022/lib/components/atoms/href/href.component.mjs +3 -3
  8. package/esm2022/lib/components/atoms/icon/icon.component.mjs +3 -3
  9. package/esm2022/lib/components/atoms/image/image.component.mjs +3 -3
  10. package/esm2022/lib/components/atoms/progress-bar/progress-bar.component.mjs +3 -3
  11. package/esm2022/lib/components/atoms/text/text.component.mjs +3 -3
  12. package/esm2022/lib/components/atoms/title/title.component.mjs +77 -23
  13. package/esm2022/lib/components/atoms/title/types.mjs +30 -2
  14. package/esm2022/lib/components/molecules/alert-box/alert-box.component.mjs +57 -10
  15. package/esm2022/lib/components/molecules/alert-box/types.mjs +1 -1
  16. package/esm2022/lib/components/molecules/button-group/button-group.component.mjs +3 -3
  17. package/esm2022/lib/components/molecules/card/card.component.mjs +3 -3
  18. package/esm2022/lib/components/molecules/content-loader/content-loader.component.mjs +3 -3
  19. package/esm2022/lib/components/molecules/date-input/date-input.component.mjs +3 -3
  20. package/esm2022/lib/components/molecules/file-input/file-input.component.mjs +3 -3
  21. package/esm2022/lib/components/molecules/hint/hint.component.mjs +3 -3
  22. package/esm2022/lib/components/molecules/language-selector/language-selector.component.mjs +219 -0
  23. package/esm2022/lib/components/molecules/language-selector/types.mjs +2 -0
  24. package/esm2022/lib/components/molecules/layered-card/layered-card.component.mjs +3 -3
  25. package/esm2022/lib/components/molecules/link/link.component.mjs +3 -3
  26. package/esm2022/lib/components/molecules/links-cake/links-cake.component.mjs +3 -3
  27. package/esm2022/lib/components/molecules/notes-box/notes-box.component.mjs +3 -3
  28. package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +3 -3
  29. package/esm2022/lib/components/molecules/pin-input/pin-input.component.mjs +3 -3
  30. package/esm2022/lib/components/molecules/popover-selector/popover-selector.component.mjs +170 -0
  31. package/esm2022/lib/components/molecules/popover-selector/types.mjs +2 -0
  32. package/esm2022/lib/components/molecules/progress-status/progress-status.component.mjs +3 -3
  33. package/esm2022/lib/components/molecules/prompter/prompter.component.mjs +3 -3
  34. package/esm2022/lib/components/molecules/searchbar/searchbar.component.mjs +3 -3
  35. package/esm2022/lib/components/molecules/text-input/text-input.component.mjs +3 -3
  36. package/esm2022/lib/components/molecules/title-block/title-block.component.mjs +3 -3
  37. package/esm2022/lib/components/organisms/banner/banner.component.mjs +3 -3
  38. package/esm2022/lib/components/organisms/form/form.component.mjs +3 -3
  39. package/esm2022/lib/components/organisms/header/header.component.mjs +3 -3
  40. package/esm2022/lib/components/organisms/item-list/item-list.component.mjs +3 -3
  41. package/esm2022/lib/components/organisms/item-list/types.mjs +1 -1
  42. package/esm2022/lib/components/organisms/no-content/no-content.component.mjs +3 -3
  43. package/esm2022/lib/components/organisms/toolbar/toolbar.component.mjs +3 -3
  44. package/esm2022/lib/components/organisms/wizard/wizard.component.mjs +3 -3
  45. package/esm2022/lib/components/templates/layout/layout.component.mjs +2 -2
  46. package/esm2022/lib/components/types.mjs +1 -1
  47. package/esm2022/lib/examples/display-demo.component.mjs +518 -0
  48. package/esm2022/lib/examples/display-simple-example.component.mjs +202 -0
  49. package/esm2022/lib/examples/selector-examples.component.mjs +208 -0
  50. package/esm2022/lib/services/lang-provider/components/display-demo.mjs +86 -0
  51. package/esm2022/lib/services/lang-provider/content.mjs +2 -1
  52. package/esm2022/lib/shared/utils/reactive-content.mjs +117 -0
  53. package/esm2022/public-api.mjs +9 -1
  54. package/fesm2022/valtech-components.mjs +3435 -1844
  55. package/fesm2022/valtech-components.mjs.map +1 -1
  56. package/lib/components/atoms/button/button.component.d.ts +10 -3
  57. package/lib/components/atoms/display/display.component.d.ts +12 -4
  58. package/lib/components/atoms/display/types.d.ts +13 -3
  59. package/lib/components/atoms/title/title.component.d.ts +6 -1
  60. package/lib/components/atoms/title/types.d.ts +29 -3
  61. package/lib/components/molecules/alert-box/alert-box.component.d.ts +17 -9
  62. package/lib/components/molecules/alert-box/types.d.ts +29 -0
  63. package/lib/components/molecules/language-selector/language-selector.component.d.ts +50 -0
  64. package/lib/components/molecules/language-selector/types.d.ts +52 -0
  65. package/lib/components/molecules/popover-selector/popover-selector.component.d.ts +29 -0
  66. package/lib/components/molecules/popover-selector/types.d.ts +69 -0
  67. package/lib/components/organisms/item-list/types.d.ts +54 -9
  68. package/lib/components/types.d.ts +12 -3
  69. package/lib/examples/display-demo.component.d.ts +62 -0
  70. package/lib/examples/display-simple-example.component.d.ts +23 -0
  71. package/lib/examples/selector-examples.component.d.ts +20 -0
  72. package/lib/services/lang-provider/components/display-demo.d.ts +3 -0
  73. package/lib/shared/utils/reactive-content.d.ts +109 -0
  74. package/package.json +4 -2
  75. package/public-api.d.ts +8 -0
  76. package/src/lib/components/styles/overrides.scss +583 -0
  77. package/src/lib/components/styles/variables.scss +7 -3
@@ -0,0 +1,518 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component } from '@angular/core';
3
+ import { IonButton, IonCard, IonCardContent, IonCardHeader, IonCardTitle } from '@ionic/angular/standalone';
4
+ import { map } from 'rxjs/operators';
5
+ import { DisplayComponent } from '../components/atoms/display/display.component';
6
+ import { LanguageSelectorComponent } from '../components/molecules/language-selector/language-selector.component';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../services/content.service";
9
+ import * as i2 from "../services/lang-provider/lang-provider.service";
10
+ import * as i3 from "@angular/common";
11
+ /**
12
+ * Componente de demostración para val-display con contenido reactivo.
13
+ * Muestra diferentes patrones de uso y casos de ejemplo.
14
+ */
15
+ export class DisplayDemoComponent {
16
+ constructor(contentService, langService) {
17
+ this.contentService = contentService;
18
+ this.langService = langService;
19
+ // Contador para ejemplos dinámicos
20
+ this.counter = 0;
21
+ // Configuración del selector de idioma
22
+ this.languageSelectorProps = {
23
+ showLabel: true,
24
+ labelConfig: {
25
+ className: '_global',
26
+ key: 'language',
27
+ fallback: 'Idioma',
28
+ },
29
+ showFlags: true,
30
+ color: 'primary',
31
+ size: 'default',
32
+ fill: 'outline',
33
+ };
34
+ // Configuraciones de ejemplo - ESTÁTICAS
35
+ this.smallStaticDisplay = {
36
+ content: 'Texto pequeño estático',
37
+ color: 'dark',
38
+ size: 'small',
39
+ };
40
+ this.mediumStaticDisplay = {
41
+ content: 'Texto mediano estático',
42
+ color: 'dark',
43
+ size: 'medium',
44
+ };
45
+ this.largeStaticDisplay = {
46
+ content: 'Texto grande estático',
47
+ color: 'dark',
48
+ size: 'large',
49
+ };
50
+ this.xlargeStaticDisplay = {
51
+ content: 'Texto extra grande estático',
52
+ color: 'dark',
53
+ size: 'xlarge',
54
+ };
55
+ // Ejemplos de colores estáticos
56
+ this.primaryDisplay = {
57
+ content: 'Texto primario',
58
+ color: 'primary',
59
+ size: 'medium',
60
+ };
61
+ this.secondaryDisplay = {
62
+ content: 'Texto secundario',
63
+ color: 'secondary',
64
+ size: 'medium',
65
+ };
66
+ this.successDisplay = {
67
+ content: 'Texto de éxito',
68
+ color: 'success',
69
+ size: 'medium',
70
+ };
71
+ this.warningDisplay = {
72
+ content: 'Texto de advertencia',
73
+ color: 'warning',
74
+ size: 'medium',
75
+ };
76
+ this.dangerDisplay = {
77
+ content: 'Texto de peligro',
78
+ color: 'danger',
79
+ size: 'medium',
80
+ };
81
+ // Configuraciones de ejemplo - REACTIVAS
82
+ this.welcomeDisplay = {
83
+ contentConfig: {
84
+ className: 'displayDemo',
85
+ key: 'welcomeTitle',
86
+ fallback: 'Bienvenido a la aplicación',
87
+ },
88
+ color: 'primary',
89
+ size: 'xlarge',
90
+ };
91
+ this.descriptionDisplay = {
92
+ contentConfig: {
93
+ className: 'displayDemo',
94
+ key: 'welcomeDescription',
95
+ fallback: 'Esta es una descripción de ejemplo',
96
+ },
97
+ color: 'medium',
98
+ size: 'medium',
99
+ };
100
+ this.statusDisplay = {
101
+ contentConfig: {
102
+ className: 'displayDemo',
103
+ key: 'statusOnline',
104
+ fallback: 'En línea',
105
+ },
106
+ color: 'success',
107
+ size: 'small',
108
+ };
109
+ // Ejemplos con interpolación
110
+ this.userWelcomeDisplay = {
111
+ contentConfig: {
112
+ className: 'displayDemo',
113
+ key: 'welcomeUser',
114
+ fallback: 'Hola, {{userName}}!',
115
+ interpolation: {
116
+ userName: 'Juan Pérez',
117
+ },
118
+ },
119
+ color: 'tertiary',
120
+ size: 'large',
121
+ };
122
+ this.counterDisplay = {
123
+ contentConfig: {
124
+ className: 'displayDemo',
125
+ key: 'counterCurrent',
126
+ fallback: 'Contador: {{count}}',
127
+ interpolation: {
128
+ count: this.counter,
129
+ },
130
+ },
131
+ color: 'secondary',
132
+ size: 'medium',
133
+ };
134
+ // Ejemplos con claves faltantes para demostrar fallbacks
135
+ this.missingKeyDisplay = {
136
+ contentConfig: {
137
+ className: 'displayDemo',
138
+ key: 'this.key.does.not.exist',
139
+ fallback: 'Esta clave no existe, pero tengo fallback',
140
+ },
141
+ color: 'warning',
142
+ size: 'medium',
143
+ };
144
+ this.noFallbackDisplay = {
145
+ contentConfig: {
146
+ className: 'displayDemo',
147
+ key: 'another.missing.key',
148
+ // Sin fallback - usará la clave como fallback
149
+ },
150
+ color: 'danger',
151
+ size: 'small',
152
+ };
153
+ // Ejemplos mixtos
154
+ this.staticMixedDisplay = {
155
+ content: 'Este es contenido estático (no cambia con el idioma)',
156
+ color: 'dark',
157
+ size: 'medium',
158
+ };
159
+ this.reactiveMixedDisplay = {
160
+ contentConfig: {
161
+ className: 'displayDemo',
162
+ key: 'mixedReactive',
163
+ fallback: 'Este contenido sí cambia con el idioma',
164
+ },
165
+ color: 'primary',
166
+ size: 'medium',
167
+ };
168
+ // Ejemplo dinámico que se actualiza
169
+ this.dynamicCounterDisplay = {
170
+ contentConfig: {
171
+ className: 'displayDemo',
172
+ key: 'dynamicContent',
173
+ fallback: 'Clics: {{count}}',
174
+ interpolation: {
175
+ count: this.counter,
176
+ },
177
+ },
178
+ color: 'tertiary',
179
+ size: 'large',
180
+ };
181
+ }
182
+ ngOnInit() {
183
+ this.initializeContent();
184
+ this.initializeLanguageState();
185
+ }
186
+ initializeContent() {
187
+ // Contenido de la página
188
+ this.demoTitle$ = this.contentService.fromContent({
189
+ className: 'displayDemo',
190
+ key: 'pageTitle',
191
+ fallback: 'Demostración del Componente Display',
192
+ });
193
+ this.languageLabel$ = this.contentService.fromContent({
194
+ className: '_global',
195
+ key: 'language',
196
+ fallback: 'Idioma',
197
+ });
198
+ this.staticSectionTitle$ = this.contentService.fromContent({
199
+ className: 'displayDemo',
200
+ key: 'sectionsStatic',
201
+ fallback: 'Ejemplos Estáticos',
202
+ });
203
+ this.reactiveSectionTitle$ = this.contentService.fromContent({
204
+ className: 'displayDemo',
205
+ key: 'sectionsReactive',
206
+ fallback: 'Ejemplos Reactivos',
207
+ });
208
+ this.mixedSectionTitle$ = this.contentService.fromContent({
209
+ className: 'displayDemo',
210
+ key: 'sectionsMixed',
211
+ fallback: 'Ejemplos Mixtos',
212
+ });
213
+ this.dynamicSectionTitle$ = this.contentService.fromContent({
214
+ className: 'displayDemo',
215
+ key: 'sectionsDynamic',
216
+ fallback: 'Ejemplos Dinámicos',
217
+ });
218
+ this.analysisTitle$ = this.contentService.fromContent({
219
+ className: 'displayDemo',
220
+ key: 'sectionsAnalysis',
221
+ fallback: 'Análisis de Idioma',
222
+ });
223
+ this.reactiveContentTitle$ = this.contentService.fromContent({
224
+ className: 'displayDemo',
225
+ key: 'subsectionsReactiveContent',
226
+ fallback: 'Contenido reactivo básico:',
227
+ });
228
+ this.interpolationTitle$ = this.contentService.fromContent({
229
+ className: 'displayDemo',
230
+ key: 'subsectionsInterpolation',
231
+ fallback: 'Contenido con interpolación:',
232
+ });
233
+ this.fallbackTitle$ = this.contentService.fromContent({
234
+ className: 'displayDemo',
235
+ key: 'subsectionsFallback',
236
+ fallback: 'Demostración de fallbacks:',
237
+ });
238
+ this.mixedContentTitle$ = this.contentService.fromContent({
239
+ className: 'displayDemo',
240
+ key: 'subsectionsMixedContent',
241
+ fallback: 'Contenido estático vs reactivo:',
242
+ });
243
+ this.dynamicContentTitle$ = this.contentService.fromContent({
244
+ className: 'displayDemo',
245
+ key: 'subsectionsDynamicContent',
246
+ fallback: 'Contenido que se actualiza dinámicamente:',
247
+ });
248
+ this.updateButtonText$ = this.contentService.fromContent({
249
+ className: 'displayDemo',
250
+ key: 'buttonsUpdateCounter',
251
+ fallback: 'Actualizar Contador',
252
+ });
253
+ this.currentLangLabel$ = this.contentService.fromContent({
254
+ className: 'displayDemo',
255
+ key: 'analysisCurrentLanguage',
256
+ fallback: 'Idioma actual',
257
+ });
258
+ this.availableLangsLabel$ = this.contentService.fromContent({
259
+ className: 'displayDemo',
260
+ key: 'analysisAvailableLanguages',
261
+ fallback: 'Idiomas disponibles',
262
+ });
263
+ }
264
+ initializeLanguageState() {
265
+ this.currentLanguage$ = this.langService.currentLang$;
266
+ this.availableLanguages$ = this.langService.currentLang$.pipe(map(() => this.langService.availableLangs));
267
+ }
268
+ changeLanguage(language) {
269
+ this.langService.setLang(language);
270
+ }
271
+ onLanguageChange(language) {
272
+ console.log('Language changed to:', language);
273
+ // El language selector ya maneja el cambio de idioma internamente
274
+ // pero podemos agregar lógica adicional aquí si es necesario
275
+ }
276
+ updateCounter() {
277
+ this.counter++;
278
+ // Actualizar los displays que usan el contador
279
+ this.counterDisplay = {
280
+ ...this.counterDisplay,
281
+ contentConfig: {
282
+ ...this.counterDisplay.contentConfig,
283
+ interpolation: {
284
+ count: this.counter,
285
+ },
286
+ },
287
+ };
288
+ this.dynamicCounterDisplay = {
289
+ ...this.dynamicCounterDisplay,
290
+ contentConfig: {
291
+ ...this.dynamicCounterDisplay.contentConfig,
292
+ interpolation: {
293
+ count: this.counter,
294
+ },
295
+ },
296
+ };
297
+ }
298
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DisplayDemoComponent, deps: [{ token: i1.ContentService }, { token: i2.LangService }], target: i0.ɵɵFactoryTarget.Component }); }
299
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DisplayDemoComponent, isStandalone: true, selector: "val-display-demo", ngImport: i0, template: `
300
+ <div class="display-demo">
301
+ <ion-card>
302
+ <ion-card-header>
303
+ <ion-card-title>{{ demoTitle$ | async }}</ion-card-title>
304
+ </ion-card-header>
305
+
306
+ <ion-card-content>
307
+ <!-- Selector de idioma -->
308
+ <div class="language-selector-container">
309
+ <val-language-selector [props]="languageSelectorProps" (languageChange)="onLanguageChange($event)">
310
+ </val-language-selector>
311
+ </div>
312
+
313
+ <!-- Ejemplos estáticos -->
314
+ <div class="section">
315
+ <h3>{{ staticSectionTitle$ | async }}</h3>
316
+
317
+ <div class="example-group">
318
+ <h4>Diferentes tamaños:</h4>
319
+ <val-display [props]="smallStaticDisplay"></val-display>
320
+ <val-display [props]="mediumStaticDisplay"></val-display>
321
+ <val-display [props]="largeStaticDisplay"></val-display>
322
+ <val-display [props]="xlargeStaticDisplay"></val-display>
323
+ </div>
324
+
325
+ <div class="example-group">
326
+ <h4>Diferentes colores:</h4>
327
+ <val-display [props]="primaryDisplay"></val-display>
328
+ <val-display [props]="secondaryDisplay"></val-display>
329
+ <val-display [props]="successDisplay"></val-display>
330
+ <val-display [props]="warningDisplay"></val-display>
331
+ <val-display [props]="dangerDisplay"></val-display>
332
+ </div>
333
+ </div>
334
+
335
+ <!-- Ejemplos reactivos -->
336
+ <div class="section">
337
+ <h3>{{ reactiveSectionTitle$ | async }}</h3>
338
+
339
+ <div class="example-group">
340
+ <h4>{{ reactiveContentTitle$ | async }}</h4>
341
+ <val-display [props]="welcomeDisplay"></val-display>
342
+ <val-display [props]="descriptionDisplay"></val-display>
343
+ <val-display [props]="statusDisplay"></val-display>
344
+ </div>
345
+
346
+ <div class="example-group">
347
+ <h4>{{ interpolationTitle$ | async }}</h4>
348
+ <val-display [props]="userWelcomeDisplay"></val-display>
349
+ <val-display [props]="counterDisplay"></val-display>
350
+ </div>
351
+
352
+ <div class="example-group">
353
+ <h4>{{ fallbackTitle$ | async }}</h4>
354
+ <val-display [props]="missingKeyDisplay"></val-display>
355
+ <val-display [props]="noFallbackDisplay"></val-display>
356
+ </div>
357
+ </div>
358
+
359
+ <!-- Ejemplos mixtos -->
360
+ <div class="section">
361
+ <h3>{{ mixedSectionTitle$ | async }}</h3>
362
+
363
+ <div class="example-group">
364
+ <h4>{{ mixedContentTitle$ | async }}</h4>
365
+ <div class="mixed-examples">
366
+ <val-display [props]="staticMixedDisplay"></val-display>
367
+ <val-display [props]="reactiveMixedDisplay"></val-display>
368
+ </div>
369
+ </div>
370
+ </div>
371
+
372
+ <!-- Ejemplos dinámicos -->
373
+ <div class="section">
374
+ <h3>{{ dynamicSectionTitle$ | async }}</h3>
375
+
376
+ <div class="example-group">
377
+ <h4>{{ dynamicContentTitle$ | async }}</h4>
378
+ <ion-button (click)="updateCounter()" color="primary">
379
+ {{ updateButtonText$ | async }}
380
+ </ion-button>
381
+ <val-display [props]="dynamicCounterDisplay"></val-display>
382
+ </div>
383
+ </div>
384
+
385
+ <!-- Análisis de contenido -->
386
+ <div class="section">
387
+ <h3>{{ analysisTitle$ | async }}</h3>
388
+ <div class="analysis-info">
389
+ <p>
390
+ <strong>{{ currentLangLabel$ | async }}:</strong> {{ currentLanguage$ | async | uppercase }}
391
+ </p>
392
+ <p>
393
+ <strong>{{ availableLangsLabel$ | async }}:</strong>
394
+ {{ (availableLanguages$ | async)?.join(', ') | uppercase }}
395
+ </p>
396
+ </div>
397
+ </div>
398
+ </ion-card-content>
399
+ </ion-card>
400
+ </div>
401
+ `, isInline: true, styles: [".display-demo{padding:16px}.language-selector-container{margin:16px 0;padding:12px;background:var(--ion-color-step-50);border-radius:8px}.section{margin:24px 0;border-bottom:1px solid var(--ion-color-light);padding-bottom:16px}.example-group{margin:16px 0;padding:12px;background:var(--ion-color-light);border-radius:8px}.example-group h4{margin:0 0 12px;color:var(--ion-color-medium)}.mixed-examples{display:flex;flex-direction:column;gap:8px}.analysis-info{background:var(--ion-color-step-50);padding:16px;border-radius:8px;margin-top:16px}val-display{display:block;margin:8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i3.UpperCasePipe, name: "uppercase" }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { 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: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: LanguageSelectorComponent, selector: "val-language-selector", inputs: ["props"], outputs: ["languageChange"] }] }); }
402
+ }
403
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DisplayDemoComponent, decorators: [{
404
+ type: Component,
405
+ args: [{ selector: 'val-display-demo', standalone: true, imports: [
406
+ CommonModule,
407
+ IonCard,
408
+ IonCardContent,
409
+ IonCardHeader,
410
+ IonCardTitle,
411
+ IonButton,
412
+ DisplayComponent,
413
+ LanguageSelectorComponent,
414
+ ], template: `
415
+ <div class="display-demo">
416
+ <ion-card>
417
+ <ion-card-header>
418
+ <ion-card-title>{{ demoTitle$ | async }}</ion-card-title>
419
+ </ion-card-header>
420
+
421
+ <ion-card-content>
422
+ <!-- Selector de idioma -->
423
+ <div class="language-selector-container">
424
+ <val-language-selector [props]="languageSelectorProps" (languageChange)="onLanguageChange($event)">
425
+ </val-language-selector>
426
+ </div>
427
+
428
+ <!-- Ejemplos estáticos -->
429
+ <div class="section">
430
+ <h3>{{ staticSectionTitle$ | async }}</h3>
431
+
432
+ <div class="example-group">
433
+ <h4>Diferentes tamaños:</h4>
434
+ <val-display [props]="smallStaticDisplay"></val-display>
435
+ <val-display [props]="mediumStaticDisplay"></val-display>
436
+ <val-display [props]="largeStaticDisplay"></val-display>
437
+ <val-display [props]="xlargeStaticDisplay"></val-display>
438
+ </div>
439
+
440
+ <div class="example-group">
441
+ <h4>Diferentes colores:</h4>
442
+ <val-display [props]="primaryDisplay"></val-display>
443
+ <val-display [props]="secondaryDisplay"></val-display>
444
+ <val-display [props]="successDisplay"></val-display>
445
+ <val-display [props]="warningDisplay"></val-display>
446
+ <val-display [props]="dangerDisplay"></val-display>
447
+ </div>
448
+ </div>
449
+
450
+ <!-- Ejemplos reactivos -->
451
+ <div class="section">
452
+ <h3>{{ reactiveSectionTitle$ | async }}</h3>
453
+
454
+ <div class="example-group">
455
+ <h4>{{ reactiveContentTitle$ | async }}</h4>
456
+ <val-display [props]="welcomeDisplay"></val-display>
457
+ <val-display [props]="descriptionDisplay"></val-display>
458
+ <val-display [props]="statusDisplay"></val-display>
459
+ </div>
460
+
461
+ <div class="example-group">
462
+ <h4>{{ interpolationTitle$ | async }}</h4>
463
+ <val-display [props]="userWelcomeDisplay"></val-display>
464
+ <val-display [props]="counterDisplay"></val-display>
465
+ </div>
466
+
467
+ <div class="example-group">
468
+ <h4>{{ fallbackTitle$ | async }}</h4>
469
+ <val-display [props]="missingKeyDisplay"></val-display>
470
+ <val-display [props]="noFallbackDisplay"></val-display>
471
+ </div>
472
+ </div>
473
+
474
+ <!-- Ejemplos mixtos -->
475
+ <div class="section">
476
+ <h3>{{ mixedSectionTitle$ | async }}</h3>
477
+
478
+ <div class="example-group">
479
+ <h4>{{ mixedContentTitle$ | async }}</h4>
480
+ <div class="mixed-examples">
481
+ <val-display [props]="staticMixedDisplay"></val-display>
482
+ <val-display [props]="reactiveMixedDisplay"></val-display>
483
+ </div>
484
+ </div>
485
+ </div>
486
+
487
+ <!-- Ejemplos dinámicos -->
488
+ <div class="section">
489
+ <h3>{{ dynamicSectionTitle$ | async }}</h3>
490
+
491
+ <div class="example-group">
492
+ <h4>{{ dynamicContentTitle$ | async }}</h4>
493
+ <ion-button (click)="updateCounter()" color="primary">
494
+ {{ updateButtonText$ | async }}
495
+ </ion-button>
496
+ <val-display [props]="dynamicCounterDisplay"></val-display>
497
+ </div>
498
+ </div>
499
+
500
+ <!-- Análisis de contenido -->
501
+ <div class="section">
502
+ <h3>{{ analysisTitle$ | async }}</h3>
503
+ <div class="analysis-info">
504
+ <p>
505
+ <strong>{{ currentLangLabel$ | async }}:</strong> {{ currentLanguage$ | async | uppercase }}
506
+ </p>
507
+ <p>
508
+ <strong>{{ availableLangsLabel$ | async }}:</strong>
509
+ {{ (availableLanguages$ | async)?.join(', ') | uppercase }}
510
+ </p>
511
+ </div>
512
+ </div>
513
+ </ion-card-content>
514
+ </ion-card>
515
+ </div>
516
+ `, styles: [".display-demo{padding:16px}.language-selector-container{margin:16px 0;padding:12px;background:var(--ion-color-step-50);border-radius:8px}.section{margin:24px 0;border-bottom:1px solid var(--ion-color-light);padding-bottom:16px}.example-group{margin:16px 0;padding:12px;background:var(--ion-color-light);border-radius:8px}.example-group h4{margin:0 0 12px;color:var(--ion-color-medium)}.mixed-examples{display:flex;flex-direction:column;gap:8px}.analysis-info{background:var(--ion-color-step-50);padding:16px;border-radius:8px;margin-top:16px}val-display{display:block;margin:8px 0}\n"] }]
517
+ }], ctorParameters: () => [{ type: i1.ContentService }, { type: i2.LangService }] });
518
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS1kZW1vLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRlY2gtY29tcG9uZW50cy9zcmMvbGliL2V4YW1wbGVzL2Rpc3BsYXktZGVtby5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUU1RyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFakYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sdUVBQXVFLENBQUM7Ozs7O0FBS2xIOzs7R0FHRztBQWlLSCxNQUFNLE9BQU8sb0JBQW9CO0lBNk0vQixZQUNVLGNBQThCLEVBQzlCLFdBQXdCO1FBRHhCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQXpMbEMsbUNBQW1DO1FBQzNCLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFFcEIsdUNBQXVDO1FBQ3ZDLDBCQUFxQixHQUE2QjtZQUNoRCxTQUFTLEVBQUUsSUFBSTtZQUNmLFdBQVcsRUFBRTtnQkFDWCxTQUFTLEVBQUUsU0FBUztnQkFDcEIsR0FBRyxFQUFFLFVBQVU7Z0JBQ2YsUUFBUSxFQUFFLFFBQVE7YUFDbkI7WUFDRCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxTQUFTO1lBQ2hCLElBQUksRUFBRSxTQUFTO1lBQ2YsSUFBSSxFQUFFLFNBQVM7U0FDaEIsQ0FBQztRQUVGLHlDQUF5QztRQUN6Qyx1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Q0YsQ0FBQztRQUVGLElBQUksQ0FBQyxxQkFBcUIsR0FBRztZQUMzQixHQUFHLElBQUksQ0FBQyxxQkFBcUI7WUFDN0IsYUFBYSxFQUFFO2dCQUNiLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWM7Z0JBQzVDLGFBQWEsRUFBRTtvQkFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU87aUJBQ3BCO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzsrR0ExVlUsb0JBQW9CO21HQUFwQixvQkFBb0IsNEVBbkpyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0dULGdwQkEvR0MsWUFBWSxpSkFDWixPQUFPLHlMQUNQLGNBQWMsK0VBQ2QsYUFBYSxzR0FDYixZQUFZLHNGQUNaLFNBQVMsb1BBQ1QsZ0JBQWdCLDJFQUNoQix5QkFBeUI7OzRGQXFKaEIsb0JBQW9CO2tCQWhLaEMsU0FBUzsrQkFDRSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osT0FBTzt3QkFDUCxjQUFjO3dCQUNkLGFBQWE7d0JBQ2IsWUFBWTt3QkFDWixTQUFTO3dCQUNULGdCQUFnQjt3QkFDaEIseUJBQXlCO3FCQUMxQixZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzR1QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElvbkJ1dHRvbiwgSW9uQ2FyZCwgSW9uQ2FyZENvbnRlbnQsIElvbkNhcmRIZWFkZXIsIElvbkNhcmRUaXRsZSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGlzcGxheUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvYXRvbXMvZGlzcGxheS9kaXNwbGF5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEaXNwbGF5TWV0YWRhdGEgfSBmcm9tICcuLi9jb21wb25lbnRzL2F0b21zL2Rpc3BsYXkvdHlwZXMnO1xuaW1wb3J0IHsgTGFuZ3VhZ2VTZWxlY3RvckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvbW9sZWN1bGVzL2xhbmd1YWdlLXNlbGVjdG9yL2xhbmd1YWdlLXNlbGVjdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBMYW5ndWFnZVNlbGVjdG9yTWV0YWRhdGEgfSBmcm9tICcuLi9jb21wb25lbnRzL21vbGVjdWxlcy9sYW5ndWFnZS1zZWxlY3Rvci90eXBlcyc7XG5pbXBvcnQgeyBDb250ZW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBMYW5nU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2xhbmctcHJvdmlkZXIvbGFuZy1wcm92aWRlci5zZXJ2aWNlJztcblxuLyoqXG4gKiBDb21wb25lbnRlIGRlIGRlbW9zdHJhY2nDs24gcGFyYSB2YWwtZGlzcGxheSBjb24gY29udGVuaWRvIHJlYWN0aXZvLlxuICogTXVlc3RyYSBkaWZlcmVudGVzIHBhdHJvbmVzIGRlIHVzbyB5IGNhc29zIGRlIGVqZW1wbG8uXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1kaXNwbGF5LWRlbW8nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIElvbkNhcmQsXG4gICAgSW9uQ2FyZENvbnRlbnQsXG4gICAgSW9uQ2FyZEhlYWRlcixcbiAgICBJb25DYXJkVGl0bGUsXG4gICAgSW9uQnV0dG9uLFxuICAgIERpc3BsYXlDb21wb25lbnQsXG4gICAgTGFuZ3VhZ2VTZWxlY3RvckNvbXBvbmVudCxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiZGlzcGxheS1kZW1vXCI+XG4gICAgICA8aW9uLWNhcmQ+XG4gICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1jYXJkLXRpdGxlPnt7IGRlbW9UaXRsZSQgfCBhc3luYyB9fTwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgIDwvaW9uLWNhcmQtaGVhZGVyPlxuXG4gICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgIDwhLS0gU2VsZWN0b3IgZGUgaWRpb21hIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1zZWxlY3Rvci1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDx2YWwtbGFuZ3VhZ2Utc2VsZWN0b3IgW3Byb3BzXT1cImxhbmd1YWdlU2VsZWN0b3JQcm9wc1wiIChsYW5ndWFnZUNoYW5nZSk9XCJvbkxhbmd1YWdlQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgICAgIDwvdmFsLWxhbmd1YWdlLXNlbGVjdG9yPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBFamVtcGxvcyBlc3TDoXRpY29zIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uXCI+XG4gICAgICAgICAgICA8aDM+e3sgc3RhdGljU2VjdGlvblRpdGxlJCB8IGFzeW5jIH19PC9oMz5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGg0PkRpZmVyZW50ZXMgdGFtYcOxb3M6PC9oND5cbiAgICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJzbWFsbFN0YXRpY0Rpc3BsYXlcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cIm1lZGl1bVN0YXRpY0Rpc3BsYXlcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cImxhcmdlU3RhdGljRGlzcGxheVwiPjwvdmFsLWRpc3BsYXk+XG4gICAgICAgICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwieGxhcmdlU3RhdGljRGlzcGxheVwiPjwvdmFsLWRpc3BsYXk+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGg0PkRpZmVyZW50ZXMgY29sb3Jlczo8L2g0PlxuICAgICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInByaW1hcnlEaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJzZWNvbmRhcnlEaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJzdWNjZXNzRGlzcGxheVwiPjwvdmFsLWRpc3BsYXk+XG4gICAgICAgICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwid2FybmluZ0Rpc3BsYXlcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cImRhbmdlckRpc3BsYXlcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEVqZW1wbG9zIHJlYWN0aXZvcyAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICAgICAgPGgzPnt7IHJlYWN0aXZlU2VjdGlvblRpdGxlJCB8IGFzeW5jIH19PC9oMz5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGg0Pnt7IHJlYWN0aXZlQ29udGVudFRpdGxlJCB8IGFzeW5jIH19PC9oND5cbiAgICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ3ZWxjb21lRGlzcGxheVwiPjwvdmFsLWRpc3BsYXk+XG4gICAgICAgICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwiZGVzY3JpcHRpb25EaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJzdGF0dXNEaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1ncm91cFwiPlxuICAgICAgICAgICAgICA8aDQ+e3sgaW50ZXJwb2xhdGlvblRpdGxlJCB8IGFzeW5jIH19PC9oND5cbiAgICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ1c2VyV2VsY29tZURpc3BsYXlcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cImNvdW50ZXJEaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1ncm91cFwiPlxuICAgICAgICAgICAgICA8aDQ+e3sgZmFsbGJhY2tUaXRsZSQgfCBhc3luYyB9fTwvaDQ+XG4gICAgICAgICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwibWlzc2luZ0tleURpc3BsYXlcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cIm5vRmFsbGJhY2tEaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBFamVtcGxvcyBtaXh0b3MgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxoMz57eyBtaXhlZFNlY3Rpb25UaXRsZSQgfCBhc3luYyB9fTwvaDM+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxoND57eyBtaXhlZENvbnRlbnRUaXRsZSQgfCBhc3luYyB9fTwvaDQ+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaXhlZC1leGFtcGxlc1wiPlxuICAgICAgICAgICAgICAgIDx2YWwtZGlzcGxheSBbcHJvcHNdPVwic3RhdGljTWl4ZWREaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInJlYWN0aXZlTWl4ZWREaXNwbGF5XCI+PC92YWwtZGlzcGxheT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gRWplbXBsb3MgZGluw6FtaWNvcyAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvblwiPlxuICAgICAgICAgICAgPGgzPnt7IGR5bmFtaWNTZWN0aW9uVGl0bGUkIHwgYXN5bmMgfX08L2gzPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1ncm91cFwiPlxuICAgICAgICAgICAgICA8aDQ+e3sgZHluYW1pY0NvbnRlbnRUaXRsZSQgfCBhc3luYyB9fTwvaDQ+XG4gICAgICAgICAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJ1cGRhdGVDb3VudGVyKClcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICB7eyB1cGRhdGVCdXR0b25UZXh0JCB8IGFzeW5jIH19XG4gICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJkeW5hbWljQ291bnRlckRpc3BsYXlcIj48L3ZhbC1kaXNwbGF5PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEFuw6FsaXNpcyBkZSBjb250ZW5pZG8gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb25cIj5cbiAgICAgICAgICAgIDxoMz57eyBhbmFseXNpc1RpdGxlJCB8IGFzeW5jIH19PC9oMz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXNpcy1pbmZvXCI+XG4gICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgY3VycmVudExhbmdMYWJlbCQgfCBhc3luYyB9fTo8L3N0cm9uZz4ge3sgY3VycmVudExhbmd1YWdlJCB8IGFzeW5jIHwgdXBwZXJjYXNlIH19XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgPHN0cm9uZz57eyBhdmFpbGFibGVMYW5nc0xhYmVsJCB8IGFzeW5jIH19Ojwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIHt7IChhdmFpbGFibGVMYW5ndWFnZXMkIHwgYXN5bmMpPy5qb2luKCcsICcpIHwgdXBwZXJjYXNlIH19XG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICA8L2lvbi1jYXJkPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuZGlzcGxheS1kZW1vIHtcbiAgICAgICAgcGFkZGluZzogMTZweDtcbiAgICAgIH1cbiAgICAgIC5sYW5ndWFnZS1zZWxlY3Rvci1jb250YWluZXIge1xuICAgICAgICBtYXJnaW46IDE2cHggMDtcbiAgICAgICAgcGFkZGluZzogMTJweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXN0ZXAtNTApO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICB9XG4gICAgICAuc2VjdGlvbiB7XG4gICAgICAgIG1hcmdpbjogMjRweCAwO1xuICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0taW9uLWNvbG9yLWxpZ2h0KTtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDE2cHg7XG4gICAgICB9XG4gICAgICAuZXhhbXBsZS1ncm91cCB7XG4gICAgICAgIG1hcmdpbjogMTZweCAwO1xuICAgICAgICBwYWRkaW5nOiAxMnB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItbGlnaHQpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICB9XG4gICAgICAuZXhhbXBsZS1ncm91cCBoNCB7XG4gICAgICAgIG1hcmdpbjogMCAwIDEycHggMDtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0pO1xuICAgICAgfVxuICAgICAgLm1peGVkLWV4YW1wbGVzIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICB9XG4gICAgICAuYW5hbHlzaXMtaW5mbyB7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jb2xvci1zdGVwLTUwKTtcbiAgICAgICAgcGFkZGluZzogMTZweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBtYXJnaW4tdG9wOiAxNnB4O1xuICAgICAgfVxuICAgICAgdmFsLWRpc3BsYXkge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgbWFyZ2luOiA4cHggMDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBEaXNwbGF5RGVtb0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vIE9ic2VydmFibGVzIHBhcmEgY29udGVuaWRvIHJlYWN0aXZvIGRlIGxhIHDDoWdpbmFcbiAgZGVtb1RpdGxlJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBsYW5ndWFnZUxhYmVsJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBzdGF0aWNTZWN0aW9uVGl0bGUkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIHJlYWN0aXZlU2VjdGlvblRpdGxlJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBtaXhlZFNlY3Rpb25UaXRsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgZHluYW1pY1NlY3Rpb25UaXRsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgYW5hbHlzaXNUaXRsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgcmVhY3RpdmVDb250ZW50VGl0bGUkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIGludGVycG9sYXRpb25UaXRsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgZmFsbGJhY2tUaXRsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgbWl4ZWRDb250ZW50VGl0bGUkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIGR5bmFtaWNDb250ZW50VGl0bGUkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIHVwZGF0ZUJ1dHRvblRleHQkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIGN1cnJlbnRMYW5nTGFiZWwkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIGF2YWlsYWJsZUxhbmdzTGFiZWwkOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgLy8gRXN0YWRvIGRlbCBpZGlvbWFcbiAgY3VycmVudExhbmd1YWdlJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBhdmFpbGFibGVMYW5ndWFnZXMkOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcblxuICAvLyBDb250YWRvciBwYXJhIGVqZW1wbG9zIGRpbsOhbWljb3NcbiAgcHJpdmF0ZSBjb3VudGVyID0gMDtcblxuICAvLyBDb25maWd1cmFjacOzbiBkZWwgc2VsZWN0b3IgZGUgaWRpb21hXG4gIGxhbmd1YWdlU2VsZWN0b3JQcm9wczogTGFuZ3VhZ2VTZWxlY3Rvck1ldGFkYXRhID0ge1xuICAgIHNob3dMYWJlbDogdHJ1ZSxcbiAgICBsYWJlbENvbmZpZzoge1xuICAgICAgY2xhc3NOYW1lOiAnX2dsb2JhbCcsXG4gICAgICBrZXk6ICdsYW5ndWFnZScsXG4gICAgICBmYWxsYmFjazogJ0lkaW9tYScsXG4gICAgfSxcbiAgICBzaG93RmxhZ3M6IHRydWUsXG4gICAgY29sb3I6ICdwcmltYXJ5JyxcbiAgICBzaXplOiAnZGVmYXVsdCcsXG4gICAgZmlsbDogJ291dGxpbmUnLFxuICB9O1xuXG4gIC8vIENvbmZpZ3VyYWNpb25lcyBkZSBlamVtcGxvIC0gRVNUw4FUSUNBU1xuICBzbWFsbFN0YXRpY0Rpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gcGVxdWXDsW8gZXN0w6F0aWNvJyxcbiAgICBjb2xvcjogJ2RhcmsnLFxuICAgIHNpemU6ICdzbWFsbCcsXG4gIH07XG5cbiAgbWVkaXVtU3RhdGljRGlzcGxheTogRGlzcGxheU1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnQ6ICdUZXh0byBtZWRpYW5vIGVzdMOhdGljbycsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgfTtcblxuICBsYXJnZVN0YXRpY0Rpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gZ3JhbmRlIGVzdMOhdGljbycsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBzaXplOiAnbGFyZ2UnLFxuICB9O1xuXG4gIHhsYXJnZVN0YXRpY0Rpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gZXh0cmEgZ3JhbmRlIGVzdMOhdGljbycsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBzaXplOiAneGxhcmdlJyxcbiAgfTtcblxuICAvLyBFamVtcGxvcyBkZSBjb2xvcmVzIGVzdMOhdGljb3NcbiAgcHJpbWFyeURpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gcHJpbWFyaW8nLFxuICAgIGNvbG9yOiAncHJpbWFyeScsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gIH07XG5cbiAgc2Vjb25kYXJ5RGlzcGxheTogRGlzcGxheU1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnQ6ICdUZXh0byBzZWN1bmRhcmlvJyxcbiAgICBjb2xvcjogJ3NlY29uZGFyeScsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gIH07XG5cbiAgc3VjY2Vzc0Rpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gZGUgw6l4aXRvJyxcbiAgICBjb2xvcjogJ3N1Y2Nlc3MnLFxuICAgIHNpemU6ICdtZWRpdW0nLFxuICB9O1xuXG4gIHdhcm5pbmdEaXNwbGF5OiBEaXNwbGF5TWV0YWRhdGEgPSB7XG4gICAgY29udGVudDogJ1RleHRvIGRlIGFkdmVydGVuY2lhJyxcbiAgICBjb2xvcjogJ3dhcm5pbmcnLFxuICAgIHNpemU6ICdtZWRpdW0nLFxuICB9O1xuXG4gIGRhbmdlckRpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnVGV4dG8gZGUgcGVsaWdybycsXG4gICAgY29sb3I6ICdkYW5nZXInLFxuICAgIHNpemU6ICdtZWRpdW0nLFxuICB9O1xuXG4gIC8vIENvbmZpZ3VyYWNpb25lcyBkZSBlamVtcGxvIC0gUkVBQ1RJVkFTXG4gIHdlbGNvbWVEaXNwbGF5OiBEaXNwbGF5TWV0YWRhdGEgPSB7XG4gICAgY29udGVudENvbmZpZzoge1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnd2VsY29tZVRpdGxlJyxcbiAgICAgIGZhbGxiYWNrOiAnQmllbnZlbmlkbyBhIGxhIGFwbGljYWNpw7NuJyxcbiAgICB9LFxuICAgIGNvbG9yOiAncHJpbWFyeScsXG4gICAgc2l6ZTogJ3hsYXJnZScsXG4gIH07XG5cbiAgZGVzY3JpcHRpb25EaXNwbGF5OiBEaXNwbGF5TWV0YWRhdGEgPSB7XG4gICAgY29udGVudENvbmZpZzoge1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnd2VsY29tZURlc2NyaXB0aW9uJyxcbiAgICAgIGZhbGxiYWNrOiAnRXN0YSBlcyB1bmEgZGVzY3JpcGNpw7NuIGRlIGVqZW1wbG8nLFxuICAgIH0sXG4gICAgY29sb3I6ICdtZWRpdW0nLFxuICAgIHNpemU6ICdtZWRpdW0nLFxuICB9O1xuXG4gIHN0YXR1c0Rpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50Q29uZmlnOiB7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICdzdGF0dXNPbmxpbmUnLFxuICAgICAgZmFsbGJhY2s6ICdFbiBsw61uZWEnLFxuICAgIH0sXG4gICAgY29sb3I6ICdzdWNjZXNzJyxcbiAgICBzaXplOiAnc21hbGwnLFxuICB9O1xuXG4gIC8vIEVqZW1wbG9zIGNvbiBpbnRlcnBvbGFjacOzblxuICB1c2VyV2VsY29tZURpc3BsYXk6IERpc3BsYXlNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50Q29uZmlnOiB7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICd3ZWxjb21lVXNlcicsXG4gICAgICBmYWxsYmFjazogJ0hvbGEsIHt7dXNlck5hbWV9fSEnLFxuICAgICAgaW50ZXJwb2xhdGlvbjoge1xuICAgICAgICB1c2VyTmFtZTogJ0p1YW4gUMOpcmV6JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb2xvcjogJ3RlcnRpYXJ5JyxcbiAgICBzaXplOiAnbGFyZ2UnLFxuICB9O1xuXG4gIGNvdW50ZXJEaXNwbGF5OiBEaXNwbGF5TWV0YWRhdGEgPSB7XG4gICAgY29udGVudENvbmZpZzoge1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnY291bnRlckN1cnJlbnQnLFxuICAgICAgZmFsbGJhY2s6ICdDb250YWRvcjoge3tjb3VudH19JyxcbiAgICAgIGludGVycG9sYXRpb246IHtcbiAgICAgICAgY291bnQ6IHRoaXMuY291bnRlcixcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb2xvcjogJ3NlY29uZGFyeScsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gIH07XG5cbiAgLy8gRWplbXBsb3MgY29uIGNsYXZlcyBmYWx0YW50ZXMgcGFyYSBkZW1vc3RyYXIgZmFsbGJhY2tzXG4gIG1pc3NpbmdLZXlEaXNwbGF5OiBEaXNwbGF5TWV0YWRhdGEgPSB7XG4gICAgY29udGVudENvbmZpZzoge1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAndGhpcy5rZXkuZG9lcy5ub3QuZXhpc3QnLFxuICAgICAgZmFsbGJhY2s6ICdFc3RhIGNsYXZlIG5vIGV4aXN0ZSwgcGVybyB0ZW5nbyBmYWxsYmFjaycsXG4gICAgfSxcbiAgICBjb2xvcjogJ3dhcm5pbmcnLFxuICAgIHNpemU6ICdtZWRpdW0nLFxuICB9O1xuXG4gIG5vRmFsbGJhY2tEaXNwbGF5OiBEaXNwbGF5TWV0YWRhdGEgPSB7XG4gICAgY29udGVudENvbmZpZzoge1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnYW5vdGhlci5taXNzaW5nLmtleScsXG4gICAgICAvLyBTaW4gZmFsbGJhY2sgLSB1c2Fyw6EgbGEgY2xhdmUgY29tbyBmYWxsYmFja1xuICAgIH0sXG4gICAgY29sb3I6ICdkYW5nZXInLFxuICAgIHNpemU6ICdzbWFsbCcsXG4gIH07XG5cbiAgLy8gRWplbXBsb3MgbWl4dG9zXG4gIHN0YXRpY01peGVkRGlzcGxheTogRGlzcGxheU1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnQ6ICdFc3RlIGVzIGNvbnRlbmlkbyBlc3TDoXRpY28gKG5vIGNhbWJpYSBjb24gZWwgaWRpb21hKScsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgfTtcblxuICByZWFjdGl2ZU1peGVkRGlzcGxheTogRGlzcGxheU1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnRDb25maWc6IHtcbiAgICAgIGNsYXNzTmFtZTogJ2Rpc3BsYXlEZW1vJyxcbiAgICAgIGtleTogJ21peGVkUmVhY3RpdmUnLFxuICAgICAgZmFsbGJhY2s6ICdFc3RlIGNvbnRlbmlkbyBzw60gY2FtYmlhIGNvbiBlbCBpZGlvbWEnLFxuICAgIH0sXG4gICAgY29sb3I6ICdwcmltYXJ5JyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgfTtcblxuICAvLyBFamVtcGxvIGRpbsOhbWljbyBxdWUgc2UgYWN0dWFsaXphXG4gIGR5bmFtaWNDb3VudGVyRGlzcGxheTogRGlzcGxheU1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnRDb25maWc6IHtcbiAgICAgIGNsYXNzTmFtZTogJ2Rpc3BsYXlEZW1vJyxcbiAgICAgIGtleTogJ2R5bmFtaWNDb250ZW50JyxcbiAgICAgIGZhbGxiYWNrOiAnQ2xpY3M6IHt7Y291bnR9fScsXG4gICAgICBpbnRlcnBvbGF0aW9uOiB7XG4gICAgICAgIGNvdW50OiB0aGlzLmNvdW50ZXIsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29sb3I6ICd0ZXJ0aWFyeScsXG4gICAgc2l6ZTogJ2xhcmdlJyxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbnRlbnRTZXJ2aWNlOiBDb250ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGxhbmdTZXJ2aWNlOiBMYW5nU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplQ29udGVudCgpO1xuICAgIHRoaXMuaW5pdGlhbGl6ZUxhbmd1YWdlU3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbnRlbnQoKSB7XG4gICAgLy8gQ29udGVuaWRvIGRlIGxhIHDDoWdpbmFcbiAgICB0aGlzLmRlbW9UaXRsZSQgPSB0aGlzLmNvbnRlbnRTZXJ2aWNlLmZyb21Db250ZW50KHtcbiAgICAgIGNsYXNzTmFtZTogJ2Rpc3BsYXlEZW1vJyxcbiAgICAgIGtleTogJ3BhZ2VUaXRsZScsXG4gICAgICBmYWxsYmFjazogJ0RlbW9zdHJhY2nDs24gZGVsIENvbXBvbmVudGUgRGlzcGxheScsXG4gICAgfSk7XG5cbiAgICB0aGlzLmxhbmd1YWdlTGFiZWwkID0gdGhpcy5jb250ZW50U2VydmljZS5mcm9tQ29udGVudCh7XG4gICAgICBjbGFzc05hbWU6ICdfZ2xvYmFsJyxcbiAgICAgIGtleTogJ2xhbmd1YWdlJyxcbiAgICAgIGZhbGxiYWNrOiAnSWRpb21hJyxcbiAgICB9KTtcblxuICAgIHRoaXMuc3RhdGljU2VjdGlvblRpdGxlJCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnc2VjdGlvbnNTdGF0aWMnLFxuICAgICAgZmFsbGJhY2s6ICdFamVtcGxvcyBFc3TDoXRpY29zJyxcbiAgICB9KTtcblxuICAgIHRoaXMucmVhY3RpdmVTZWN0aW9uVGl0bGUkID0gdGhpcy5jb250ZW50U2VydmljZS5mcm9tQ29udGVudCh7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICdzZWN0aW9uc1JlYWN0aXZlJyxcbiAgICAgIGZhbGxiYWNrOiAnRWplbXBsb3MgUmVhY3Rpdm9zJyxcbiAgICB9KTtcblxuICAgIHRoaXMubWl4ZWRTZWN0aW9uVGl0bGUkID0gdGhpcy5jb250ZW50U2VydmljZS5mcm9tQ29udGVudCh7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICdzZWN0aW9uc01peGVkJyxcbiAgICAgIGZhbGxiYWNrOiAnRWplbXBsb3MgTWl4dG9zJyxcbiAgICB9KTtcblxuICAgIHRoaXMuZHluYW1pY1NlY3Rpb25UaXRsZSQgPSB0aGlzLmNvbnRlbnRTZXJ2aWNlLmZyb21Db250ZW50KHtcbiAgICAgIGNsYXNzTmFtZTogJ2Rpc3BsYXlEZW1vJyxcbiAgICAgIGtleTogJ3NlY3Rpb25zRHluYW1pYycsXG4gICAgICBmYWxsYmFjazogJ0VqZW1wbG9zIERpbsOhbWljb3MnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hbmFseXNpc1RpdGxlJCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnc2VjdGlvbnNBbmFseXNpcycsXG4gICAgICBmYWxsYmFjazogJ0Fuw6FsaXNpcyBkZSBJZGlvbWEnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWFjdGl2ZUNvbnRlbnRUaXRsZSQgPSB0aGlzLmNvbnRlbnRTZXJ2aWNlLmZyb21Db250ZW50KHtcbiAgICAgIGNsYXNzTmFtZTogJ2Rpc3BsYXlEZW1vJyxcbiAgICAgIGtleTogJ3N1YnNlY3Rpb25zUmVhY3RpdmVDb250ZW50JyxcbiAgICAgIGZhbGxiYWNrOiAnQ29udGVuaWRvIHJlYWN0aXZvIGLDoXNpY286JyxcbiAgICB9KTtcblxuICAgIHRoaXMuaW50ZXJwb2xhdGlvblRpdGxlJCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnc3Vic2VjdGlvbnNJbnRlcnBvbGF0aW9uJyxcbiAgICAgIGZhbGxiYWNrOiAnQ29udGVuaWRvIGNvbiBpbnRlcnBvbGFjacOzbjonLFxuICAgIH0pO1xuXG4gICAgdGhpcy5mYWxsYmFja1RpdGxlJCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnc3Vic2VjdGlvbnNGYWxsYmFjaycsXG4gICAgICBmYWxsYmFjazogJ0RlbW9zdHJhY2nDs24gZGUgZmFsbGJhY2tzOicsXG4gICAgfSk7XG5cbiAgICB0aGlzLm1peGVkQ29udGVudFRpdGxlJCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnc3Vic2VjdGlvbnNNaXhlZENvbnRlbnQnLFxuICAgICAgZmFsbGJhY2s6ICdDb250ZW5pZG8gZXN0w6F0aWNvIHZzIHJlYWN0aXZvOicsXG4gICAgfSk7XG5cbiAgICB0aGlzLmR5bmFtaWNDb250ZW50VGl0bGUkID0gdGhpcy5jb250ZW50U2VydmljZS5mcm9tQ29udGVudCh7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICdzdWJzZWN0aW9uc0R5bmFtaWNDb250ZW50JyxcbiAgICAgIGZhbGxiYWNrOiAnQ29udGVuaWRvIHF1ZSBzZSBhY3R1YWxpemEgZGluw6FtaWNhbWVudGU6JyxcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlQnV0dG9uVGV4dCQgPSB0aGlzLmNvbnRlbnRTZXJ2aWNlLmZyb21Db250ZW50KHtcbiAgICAgIGNsYXNzTmFtZTogJ2Rpc3BsYXlEZW1vJyxcbiAgICAgIGtleTogJ2J1dHRvbnNVcGRhdGVDb3VudGVyJyxcbiAgICAgIGZhbGxiYWNrOiAnQWN0dWFsaXphciBDb250YWRvcicsXG4gICAgfSk7XG5cbiAgICB0aGlzLmN1cnJlbnRMYW5nTGFiZWwkID0gdGhpcy5jb250ZW50U2VydmljZS5mcm9tQ29udGVudCh7XG4gICAgICBjbGFzc05hbWU6ICdkaXNwbGF5RGVtbycsXG4gICAgICBrZXk6ICdhbmFseXNpc0N1cnJlbnRMYW5ndWFnZScsXG4gICAgICBmYWxsYmFjazogJ0lkaW9tYSBhY3R1YWwnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hdmFpbGFibGVMYW5nc0xhYmVsJCA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgY2xhc3NOYW1lOiAnZGlzcGxheURlbW8nLFxuICAgICAga2V5OiAnYW5hbHlzaXNBdmFpbGFibGVMYW5ndWFnZXMnLFxuICAgICAgZmFsbGJhY2s6ICdJZGlvbWFzIGRpc3BvbmlibGVzJyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUxhbmd1YWdlU3RhdGUoKSB7XG4gICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2UkID0gdGhpcy5sYW5nU2VydmljZS5jdXJyZW50TGFuZyQ7XG4gICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMkID0gdGhpcy5sYW5nU2VydmljZS5jdXJyZW50TGFuZyQucGlwZShtYXAoKCkgPT4gdGhpcy5sYW5nU2VydmljZS5hdmFpbGFibGVMYW5ncykpO1xuICB9XG5cbiAgY2hhbmdlTGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZykge1xuICAgIHRoaXMubGFuZ1NlcnZpY2Uuc2V0TGFuZyhsYW5ndWFnZSk7XG4gIH1cblxuICBvbkxhbmd1YWdlQ2hhbmdlKGxhbmd1YWdlOiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmxvZygnTGFuZ3VhZ2UgY2hhbmdlZCB0bzonLCBsYW5ndWFnZSk7XG4gICAgLy8gRWwgbGFuZ3VhZ2Ugc2VsZWN0b3IgeWEgbWFuZWphIGVsIGNhbWJpbyBkZSBpZGlvbWEgaW50ZXJuYW1lbnRlXG4gICAgLy8gcGVybyBwb2RlbW9zIGFncmVnYXIgbMOzZ2ljYSBhZGljaW9uYWwgYXF1w60gc2kgZXMgbmVjZXNhcmlvXG4gIH1cblxuICB1cGRhdGVDb3VudGVyKCkge1xuICAgIHRoaXMuY291bnRlcisrO1xuXG4gICAgLy8gQWN0dWFsaXphciBsb3MgZGlzcGxheXMgcXVlIHVzYW4gZWwgY29udGFkb3JcbiAgICB0aGlzLmNvdW50ZXJEaXNwbGF5ID0ge1xuICAgICAgLi4udGhpcy5jb3VudGVyRGlzcGxheSxcbiAgICAgIGNvbnRlbnRDb25maWc6IHtcbiAgICAgICAgLi4udGhpcy5jb3VudGVyRGlzcGxheS5jb250ZW50Q29uZmlnISxcbiAgICAgICAgaW50ZXJwb2xhdGlvbjoge1xuICAgICAgICAgIGNvdW50OiB0aGlzLmNvdW50ZXIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0aGlzLmR5bmFtaWNDb3VudGVyRGlzcGxheSA9IHtcbiAgICAgIC4uLnRoaXMuZHluYW1pY0NvdW50ZXJEaXNwbGF5LFxuICAgICAgY29udGVudENvbmZpZzoge1xuICAgICAgICAuLi50aGlzLmR5bmFtaWNDb3VudGVyRGlzcGxheS5jb250ZW50Q29uZmlnISxcbiAgICAgICAgaW50ZXJwb2xhdGlvbjoge1xuICAgICAgICAgIGNvdW50OiB0aGlzLmNvdW50ZXIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==