valtech-components 2.0.302 → 2.0.304
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.
- package/esm2022/lib/components/atoms/button/button.component.mjs +103 -23
- package/esm2022/lib/components/types.mjs +1 -1
- package/esm2022/lib/services/lang-provider/content.mjs +1 -55
- package/esm2022/lib/services/lang-provider/lang-provider.service.mjs +4 -9
- package/esm2022/lib/shared/utils/content.mjs +2 -8
- package/esm2022/public-api.mjs +1 -12
- package/fesm2022/valtech-components.mjs +124 -2807
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/button/button.component.d.ts +33 -2
- package/lib/components/types.d.ts +19 -7
- package/package.json +1 -1
- package/public-api.d.ts +0 -10
- package/esm2022/lib/examples/comprehensive-link-test.component.mjs +0 -208
- package/esm2022/lib/examples/custom-content-demo.component.mjs +0 -291
- package/esm2022/lib/examples/display-demo.component.mjs +0 -518
- package/esm2022/lib/examples/display-simple-example.component.mjs +0 -202
- package/esm2022/lib/examples/link-processing-example.component.mjs +0 -233
- package/esm2022/lib/examples/multi-language-demo.component.mjs +0 -304
- package/esm2022/lib/examples/reactive-components-demo.component.mjs +0 -303
- package/esm2022/lib/examples/reactivity-test.component.mjs +0 -200
- package/esm2022/lib/examples/selector-examples.component.mjs +0 -234
- package/esm2022/lib/examples/user-issue-test.component.mjs +0 -267
- package/lib/examples/comprehensive-link-test.component.d.ts +0 -23
- package/lib/examples/custom-content-demo.component.d.ts +0 -26
- package/lib/examples/display-demo.component.d.ts +0 -62
- package/lib/examples/display-simple-example.component.d.ts +0 -23
- package/lib/examples/link-processing-example.component.d.ts +0 -26
- package/lib/examples/multi-language-demo.component.d.ts +0 -34
- package/lib/examples/reactive-components-demo.component.d.ts +0 -45
- package/lib/examples/reactivity-test.component.d.ts +0 -27
- package/lib/examples/selector-examples.component.d.ts +0 -21
- package/lib/examples/user-issue-test.component.d.ts +0 -31
|
@@ -1,304 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { Component } from '@angular/core';
|
|
3
|
-
import { ButtonComponent } from '../components/atoms/button/button.component';
|
|
4
|
-
import { TextComponent } from '../components/atoms/text/text.component';
|
|
5
|
-
import { LANGUAGES } from '../services/lang-provider/types';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "../services/content.service";
|
|
8
|
-
import * as i2 from "../services/lang-provider/lang-provider.service";
|
|
9
|
-
import * as i3 from "@angular/common";
|
|
10
|
-
/**
|
|
11
|
-
* MultiLanguageDemoComponent - Demuestra el sistema de idiomas flexible.
|
|
12
|
-
*
|
|
13
|
-
* Este componente muestra cómo el sistema maneja múltiples idiomas,
|
|
14
|
-
* fallbacks automáticos y warnings por traducciones faltantes.
|
|
15
|
-
*/
|
|
16
|
-
export class MultiLanguageDemoComponent {
|
|
17
|
-
constructor(content, langService) {
|
|
18
|
-
this.content = content;
|
|
19
|
-
this.langService = langService;
|
|
20
|
-
this.availableLanguages = [];
|
|
21
|
-
this.analysisResults = null;
|
|
22
|
-
// Global content observables
|
|
23
|
-
this.okButton$ = this.content.fromContent({ key: 'ok' });
|
|
24
|
-
this.cancelButton$ = this.content.fromContent({ key: 'cancel' });
|
|
25
|
-
this.saveButton$ = this.content.fromContent({ key: 'save' });
|
|
26
|
-
this.deleteButton$ = this.content.fromContent({ key: 'delete' });
|
|
27
|
-
// Content that might have missing translations
|
|
28
|
-
this.nextButton$ = this.content.fromContent({ key: 'next', fallback: 'Next' });
|
|
29
|
-
this.finishButton$ = this.content.fromContent({ key: 'finish', fallback: 'Finish' });
|
|
30
|
-
this.searchPlaceholder$ = this.content.fromContent({ key: 'searchPlaceholder', fallback: 'Search...' });
|
|
31
|
-
this.noDataMessage$ = this.content.fromContent({ key: 'noData', fallback: 'No data available' });
|
|
32
|
-
}
|
|
33
|
-
ngOnInit() {
|
|
34
|
-
this.availableLanguages = this.langService.availableLangs;
|
|
35
|
-
}
|
|
36
|
-
switchLanguage(lang) {
|
|
37
|
-
console.log(`Switching to language: ${lang}`);
|
|
38
|
-
this.langService.setLang(lang);
|
|
39
|
-
this.analysisResults = null; // Reset analysis when language changes
|
|
40
|
-
}
|
|
41
|
-
getLanguageName(lang) {
|
|
42
|
-
const names = {
|
|
43
|
-
[LANGUAGES.ES]: 'Español',
|
|
44
|
-
[LANGUAGES.EN]: 'English',
|
|
45
|
-
[LANGUAGES.FR]: 'Français',
|
|
46
|
-
[LANGUAGES.DE]: 'Deutsch',
|
|
47
|
-
pt: 'Português',
|
|
48
|
-
};
|
|
49
|
-
return names[lang] || lang.toUpperCase();
|
|
50
|
-
}
|
|
51
|
-
analyzeCurrentComponent() {
|
|
52
|
-
const componentName = '_global'; // Analyzing global content for this demo
|
|
53
|
-
const availableLanguages = this.langService.getAvailableLanguagesForComponent(componentName);
|
|
54
|
-
const missingKeys = this.langService.getMissingContentKeys(componentName, this.langService.currentLang);
|
|
55
|
-
this.analysisResults = {
|
|
56
|
-
availableLanguages,
|
|
57
|
-
missingKeys,
|
|
58
|
-
};
|
|
59
|
-
console.log('Component analysis results:', this.analysisResults);
|
|
60
|
-
}
|
|
61
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiLanguageDemoComponent, deps: [{ token: i1.ContentService }, { token: i2.LangService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
62
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiLanguageDemoComponent, isStandalone: true, selector: "val-multi-language-demo", ngImport: i0, template: `
|
|
63
|
-
<div class="multi-lang-demo">
|
|
64
|
-
<h2>Sistema de Idiomas Flexible</h2>
|
|
65
|
-
|
|
66
|
-
<div class="language-info">
|
|
67
|
-
<h3>Información del Sistema:</h3>
|
|
68
|
-
<p><strong>Idioma actual:</strong> {{ langService.currentLang }}</p>
|
|
69
|
-
<p><strong>Idioma por defecto:</strong> {{ langService.defaultLanguage }}</p>
|
|
70
|
-
<p><strong>Idiomas disponibles:</strong> {{ langService.availableLangs.join(', ') }}</p>
|
|
71
|
-
</div>
|
|
72
|
-
|
|
73
|
-
<div class="language-switcher">
|
|
74
|
-
<h3>Cambiar Idioma:</h3>
|
|
75
|
-
<div class="button-group">
|
|
76
|
-
<button
|
|
77
|
-
*ngFor="let lang of availableLanguages"
|
|
78
|
-
[class.active]="lang === langService.currentLang"
|
|
79
|
-
(click)="switchLanguage(lang)"
|
|
80
|
-
>
|
|
81
|
-
{{ getLanguageName(lang) }}
|
|
82
|
-
</button>
|
|
83
|
-
<!-- Ejemplo de idioma no disponible -->
|
|
84
|
-
<button (click)="switchLanguage('pt')">Português (no disponible)</button>
|
|
85
|
-
</div>
|
|
86
|
-
</div>
|
|
87
|
-
|
|
88
|
-
<div class="content-examples">
|
|
89
|
-
<h3>Contenido Global:</h3>
|
|
90
|
-
<div class="example-grid">
|
|
91
|
-
<val-text
|
|
92
|
-
[props]="{ content: okButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
|
|
93
|
-
></val-text>
|
|
94
|
-
<val-text
|
|
95
|
-
[props]="{
|
|
96
|
-
content: cancelButton$ | async,
|
|
97
|
-
size: 'medium',
|
|
98
|
-
color: 'dark',
|
|
99
|
-
bold: false,
|
|
100
|
-
processLinks: false,
|
|
101
|
-
}"
|
|
102
|
-
></val-text>
|
|
103
|
-
<val-text
|
|
104
|
-
[props]="{ content: saveButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
|
|
105
|
-
></val-text>
|
|
106
|
-
<val-text
|
|
107
|
-
[props]="{
|
|
108
|
-
content: deleteButton$ | async,
|
|
109
|
-
size: 'medium',
|
|
110
|
-
color: 'dark',
|
|
111
|
-
bold: false,
|
|
112
|
-
processLinks: false,
|
|
113
|
-
}"
|
|
114
|
-
></val-text>
|
|
115
|
-
</div>
|
|
116
|
-
|
|
117
|
-
<h3>Contenido con Fallback (algunas traducciones faltantes):</h3>
|
|
118
|
-
<div class="example-grid">
|
|
119
|
-
<val-text
|
|
120
|
-
[props]="{ content: nextButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
|
|
121
|
-
></val-text>
|
|
122
|
-
<val-text
|
|
123
|
-
[props]="{
|
|
124
|
-
content: finishButton$ | async,
|
|
125
|
-
size: 'medium',
|
|
126
|
-
color: 'dark',
|
|
127
|
-
bold: false,
|
|
128
|
-
processLinks: false,
|
|
129
|
-
}"
|
|
130
|
-
></val-text>
|
|
131
|
-
<val-text
|
|
132
|
-
[props]="{
|
|
133
|
-
content: searchPlaceholder$ | async,
|
|
134
|
-
size: 'medium',
|
|
135
|
-
color: 'dark',
|
|
136
|
-
bold: false,
|
|
137
|
-
processLinks: false,
|
|
138
|
-
}"
|
|
139
|
-
></val-text>
|
|
140
|
-
<val-text
|
|
141
|
-
[props]="{
|
|
142
|
-
content: noDataMessage$ | async,
|
|
143
|
-
size: 'medium',
|
|
144
|
-
color: 'dark',
|
|
145
|
-
bold: false,
|
|
146
|
-
processLinks: false,
|
|
147
|
-
}"
|
|
148
|
-
></val-text>
|
|
149
|
-
</div>
|
|
150
|
-
</div>
|
|
151
|
-
|
|
152
|
-
<div class="warning-info">
|
|
153
|
-
<h3>Información de Warnings:</h3>
|
|
154
|
-
<p>
|
|
155
|
-
Abre la consola del navegador para ver los warnings cuando cambies a idiomas con traducciones incompletas
|
|
156
|
-
(francés, alemán).
|
|
157
|
-
</p>
|
|
158
|
-
<p>El sistema automáticamente usará el idioma por defecto o el primer idioma disponible como fallback.</p>
|
|
159
|
-
</div>
|
|
160
|
-
|
|
161
|
-
<div class="component-analysis">
|
|
162
|
-
<h3>Análisis del Componente:</h3>
|
|
163
|
-
<button (click)="analyzeCurrentComponent()">Analizar Contenido</button>
|
|
164
|
-
<div *ngIf="analysisResults" class="analysis-results">
|
|
165
|
-
<p>
|
|
166
|
-
<strong>Idiomas disponibles para este componente:</strong>
|
|
167
|
-
{{ analysisResults.availableLanguages.join(', ') }}
|
|
168
|
-
</p>
|
|
169
|
-
<div *ngIf="analysisResults.missingKeys.length > 0">
|
|
170
|
-
<p>
|
|
171
|
-
<strong>Claves faltantes en {{ langService.currentLang }}:</strong>
|
|
172
|
-
</p>
|
|
173
|
-
<ul>
|
|
174
|
-
<li *ngFor="let key of analysisResults.missingKeys">{{ key }}</li>
|
|
175
|
-
</ul>
|
|
176
|
-
</div>
|
|
177
|
-
</div>
|
|
178
|
-
</div>
|
|
179
|
-
</div>
|
|
180
|
-
`, isInline: true, styles: [".multi-lang-demo{padding:20px;max-width:800px}.language-info,.content-examples,.warning-info,.component-analysis{margin:20px 0;padding:15px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}.button-group{display:flex;gap:10px;flex-wrap:wrap}.button-group button{padding:8px 16px;border:1px solid var(--ion-color-primary, #3880ff);background:#fff;color:var(--ion-color-primary, #3880ff);border-radius:4px;cursor:pointer;transition:all .2s}.button-group button:hover{background:var(--ion-color-primary-tint, #4992ff);color:#fff}.button-group button.active{background:var(--ion-color-primary, #3880ff);color:#fff}.example-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px;margin-top:10px}.analysis-results{margin-top:10px;padding:10px;background:#fff;border-radius:4px}h2{color:var(--ion-color-primary, #3880ff)}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
|
|
181
|
-
}
|
|
182
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiLanguageDemoComponent, decorators: [{
|
|
183
|
-
type: Component,
|
|
184
|
-
args: [{ selector: 'val-multi-language-demo', standalone: true, imports: [CommonModule, TextComponent, ButtonComponent], template: `
|
|
185
|
-
<div class="multi-lang-demo">
|
|
186
|
-
<h2>Sistema de Idiomas Flexible</h2>
|
|
187
|
-
|
|
188
|
-
<div class="language-info">
|
|
189
|
-
<h3>Información del Sistema:</h3>
|
|
190
|
-
<p><strong>Idioma actual:</strong> {{ langService.currentLang }}</p>
|
|
191
|
-
<p><strong>Idioma por defecto:</strong> {{ langService.defaultLanguage }}</p>
|
|
192
|
-
<p><strong>Idiomas disponibles:</strong> {{ langService.availableLangs.join(', ') }}</p>
|
|
193
|
-
</div>
|
|
194
|
-
|
|
195
|
-
<div class="language-switcher">
|
|
196
|
-
<h3>Cambiar Idioma:</h3>
|
|
197
|
-
<div class="button-group">
|
|
198
|
-
<button
|
|
199
|
-
*ngFor="let lang of availableLanguages"
|
|
200
|
-
[class.active]="lang === langService.currentLang"
|
|
201
|
-
(click)="switchLanguage(lang)"
|
|
202
|
-
>
|
|
203
|
-
{{ getLanguageName(lang) }}
|
|
204
|
-
</button>
|
|
205
|
-
<!-- Ejemplo de idioma no disponible -->
|
|
206
|
-
<button (click)="switchLanguage('pt')">Português (no disponible)</button>
|
|
207
|
-
</div>
|
|
208
|
-
</div>
|
|
209
|
-
|
|
210
|
-
<div class="content-examples">
|
|
211
|
-
<h3>Contenido Global:</h3>
|
|
212
|
-
<div class="example-grid">
|
|
213
|
-
<val-text
|
|
214
|
-
[props]="{ content: okButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
|
|
215
|
-
></val-text>
|
|
216
|
-
<val-text
|
|
217
|
-
[props]="{
|
|
218
|
-
content: cancelButton$ | async,
|
|
219
|
-
size: 'medium',
|
|
220
|
-
color: 'dark',
|
|
221
|
-
bold: false,
|
|
222
|
-
processLinks: false,
|
|
223
|
-
}"
|
|
224
|
-
></val-text>
|
|
225
|
-
<val-text
|
|
226
|
-
[props]="{ content: saveButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
|
|
227
|
-
></val-text>
|
|
228
|
-
<val-text
|
|
229
|
-
[props]="{
|
|
230
|
-
content: deleteButton$ | async,
|
|
231
|
-
size: 'medium',
|
|
232
|
-
color: 'dark',
|
|
233
|
-
bold: false,
|
|
234
|
-
processLinks: false,
|
|
235
|
-
}"
|
|
236
|
-
></val-text>
|
|
237
|
-
</div>
|
|
238
|
-
|
|
239
|
-
<h3>Contenido con Fallback (algunas traducciones faltantes):</h3>
|
|
240
|
-
<div class="example-grid">
|
|
241
|
-
<val-text
|
|
242
|
-
[props]="{ content: nextButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
|
|
243
|
-
></val-text>
|
|
244
|
-
<val-text
|
|
245
|
-
[props]="{
|
|
246
|
-
content: finishButton$ | async,
|
|
247
|
-
size: 'medium',
|
|
248
|
-
color: 'dark',
|
|
249
|
-
bold: false,
|
|
250
|
-
processLinks: false,
|
|
251
|
-
}"
|
|
252
|
-
></val-text>
|
|
253
|
-
<val-text
|
|
254
|
-
[props]="{
|
|
255
|
-
content: searchPlaceholder$ | async,
|
|
256
|
-
size: 'medium',
|
|
257
|
-
color: 'dark',
|
|
258
|
-
bold: false,
|
|
259
|
-
processLinks: false,
|
|
260
|
-
}"
|
|
261
|
-
></val-text>
|
|
262
|
-
<val-text
|
|
263
|
-
[props]="{
|
|
264
|
-
content: noDataMessage$ | async,
|
|
265
|
-
size: 'medium',
|
|
266
|
-
color: 'dark',
|
|
267
|
-
bold: false,
|
|
268
|
-
processLinks: false,
|
|
269
|
-
}"
|
|
270
|
-
></val-text>
|
|
271
|
-
</div>
|
|
272
|
-
</div>
|
|
273
|
-
|
|
274
|
-
<div class="warning-info">
|
|
275
|
-
<h3>Información de Warnings:</h3>
|
|
276
|
-
<p>
|
|
277
|
-
Abre la consola del navegador para ver los warnings cuando cambies a idiomas con traducciones incompletas
|
|
278
|
-
(francés, alemán).
|
|
279
|
-
</p>
|
|
280
|
-
<p>El sistema automáticamente usará el idioma por defecto o el primer idioma disponible como fallback.</p>
|
|
281
|
-
</div>
|
|
282
|
-
|
|
283
|
-
<div class="component-analysis">
|
|
284
|
-
<h3>Análisis del Componente:</h3>
|
|
285
|
-
<button (click)="analyzeCurrentComponent()">Analizar Contenido</button>
|
|
286
|
-
<div *ngIf="analysisResults" class="analysis-results">
|
|
287
|
-
<p>
|
|
288
|
-
<strong>Idiomas disponibles para este componente:</strong>
|
|
289
|
-
{{ analysisResults.availableLanguages.join(', ') }}
|
|
290
|
-
</p>
|
|
291
|
-
<div *ngIf="analysisResults.missingKeys.length > 0">
|
|
292
|
-
<p>
|
|
293
|
-
<strong>Claves faltantes en {{ langService.currentLang }}:</strong>
|
|
294
|
-
</p>
|
|
295
|
-
<ul>
|
|
296
|
-
<li *ngFor="let key of analysisResults.missingKeys">{{ key }}</li>
|
|
297
|
-
</ul>
|
|
298
|
-
</div>
|
|
299
|
-
</div>
|
|
300
|
-
</div>
|
|
301
|
-
</div>
|
|
302
|
-
`, styles: [".multi-lang-demo{padding:20px;max-width:800px}.language-info,.content-examples,.warning-info,.component-analysis{margin:20px 0;padding:15px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}.button-group{display:flex;gap:10px;flex-wrap:wrap}.button-group button{padding:8px 16px;border:1px solid var(--ion-color-primary, #3880ff);background:#fff;color:var(--ion-color-primary, #3880ff);border-radius:4px;cursor:pointer;transition:all .2s}.button-group button:hover{background:var(--ion-color-primary-tint, #4992ff);color:#fff}.button-group button.active{background:var(--ion-color-primary, #3880ff);color:#fff}.example-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px;margin-top:10px}.analysis-results{margin-top:10px;padding:10px;background:#fff;border-radius:4px}h2{color:var(--ion-color-primary, #3880ff)}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px}\n"] }]
|
|
303
|
-
}], ctorParameters: () => [{ type: i1.ContentService }, { type: i2.LangService }] });
|
|
304
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktbGFuZ3VhZ2UtZGVtby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9leGFtcGxlcy9tdWx0aS1sYW5ndWFnZS1kZW1vLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBR3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7QUFFNUQ7Ozs7O0dBS0c7QUFpTUgsTUFBTSxPQUFPLDBCQUEwQjtJQWdCckMsWUFDUyxPQUF1QixFQUN2QixXQUF3QjtRQUR4QixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUN2QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQWpCakMsdUJBQWtCLEdBQWEsRUFBRSxDQUFDO1FBQ2xDLG9CQUFlLEdBQW1FLElBQUksQ0FBQztRQUV2Riw2QkFBNkI7UUFDN0IsY0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDcEQsa0JBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVELGdCQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN4RCxrQkFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFD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c0hUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2F0b21zL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2F0b21zL3RleHQvdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgTGFuZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL2xhbmctcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBMQU5HVUFHRVMgfSBmcm9tICcuLi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL3R5cGVzJztcblxuLyoqXG4gKiBNdWx0aUxhbmd1YWdlRGVtb0NvbXBvbmVudCAtIERlbXVlc3RyYSBlbCBzaXN0ZW1hIGRlIGlkaW9tYXMgZmxleGlibGUuXG4gKlxuICogRXN0ZSBjb21wb25lbnRlIG11ZXN0cmEgY8OzbW8gZWwgc2lzdGVtYSBtYW5lamEgbcO6bHRpcGxlcyBpZGlvbWFzLFxuICogZmFsbGJhY2tzIGF1dG9tw6F0aWNvcyB5IHdhcm5pbmdzIHBvciB0cmFkdWNjaW9uZXMgZmFsdGFudGVzLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtbXVsdGktbGFuZ3VhZ2UtZGVtbycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFRleHRDb21wb25lbnQsIEJ1dHRvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cIm11bHRpLWxhbmctZGVtb1wiPlxuICAgICAgPGgyPlNpc3RlbWEgZGUgSWRpb21hcyBGbGV4aWJsZTwvaDI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1pbmZvXCI+XG4gICAgICAgIDxoMz5JbmZvcm1hY2nDs24gZGVsIFNpc3RlbWE6PC9oMz5cbiAgICAgICAgPHA+PHN0cm9uZz5JZGlvbWEgYWN0dWFsOjwvc3Ryb25nPiB7eyBsYW5nU2VydmljZS5jdXJyZW50TGFuZyB9fTwvcD5cbiAgICAgICAgPHA+PHN0cm9uZz5JZGlvbWEgcG9yIGRlZmVjdG86PC9zdHJvbmc+IHt7IGxhbmdTZXJ2aWNlLmRlZmF1bHRMYW5ndWFnZSB9fTwvcD5cbiAgICAgICAgPHA+PHN0cm9uZz5JZGlvbWFzIGRpc3BvbmlibGVzOjwvc3Ryb25nPiB7eyBsYW5nU2VydmljZS5hdmFpbGFibGVMYW5ncy5qb2luKCcsICcpIH19PC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1zd2l0Y2hlclwiPlxuICAgICAgICA8aDM+Q2FtYmlhciBJZGlvbWE6PC9oMz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1ncm91cFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsYW5nIG9mIGF2YWlsYWJsZUxhbmd1YWdlc1wiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImxhbmcgPT09IGxhbmdTZXJ2aWNlLmN1cnJlbnRMYW5nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzd2l0Y2hMYW5ndWFnZShsYW5nKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0TGFuZ3VhZ2VOYW1lKGxhbmcpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPCEtLSBFamVtcGxvIGRlIGlkaW9tYSBubyBkaXNwb25pYmxlIC0tPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInN3aXRjaExhbmd1YWdlKCdwdCcpXCI+UG9ydHVndcOqcyAobm8gZGlzcG9uaWJsZSk8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZXhhbXBsZXNcIj5cbiAgICAgICAgPGgzPkNvbnRlbmlkbyBHbG9iYWw6PC9oMz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZ3JpZFwiPlxuICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgW3Byb3BzXT1cInsgY29udGVudDogb2tCdXR0b24kIHwgYXN5bmMsIHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgcHJvY2Vzc0xpbmtzOiBmYWxzZSB9XCJcbiAgICAgICAgICA+PC92YWwtdGV4dD5cbiAgICAgICAgICA8dmFsLXRleHRcbiAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IGNhbmNlbEJ1dHRvbiQgfCBhc3luYyxcbiAgICAgICAgICAgICAgc2l6ZTogJ21lZGl1bScsXG4gICAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgICBwcm9jZXNzTGlua3M6IGZhbHNlLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPjwvdmFsLXRleHQ+XG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBbcHJvcHNdPVwieyBjb250ZW50OiBzYXZlQnV0dG9uJCB8IGFzeW5jLCBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIHByb2Nlc3NMaW5rczogZmFsc2UgfVwiXG4gICAgICAgICAgPjwvdmFsLXRleHQ+XG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICBjb250ZW50OiBkZWxldGVCdXR0b24kIHwgYXN5bmMsXG4gICAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcHJvY2Vzc0xpbmtzOiBmYWxzZSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID48L3ZhbC10ZXh0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aDM+Q29udGVuaWRvIGNvbiBGYWxsYmFjayAoYWxndW5hcyB0cmFkdWNjaW9uZXMgZmFsdGFudGVzKTo8L2gzPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1ncmlkXCI+XG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBbcHJvcHNdPVwieyBjb250ZW50OiBuZXh0QnV0dG9uJCB8IGFzeW5jLCBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIHByb2Nlc3NMaW5rczogZmFsc2UgfVwiXG4gICAgICAgICAgPjwvdmFsLXRleHQ+XG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICBjb250ZW50OiBmaW5pc2hCdXR0b24kIHwgYXN5bmMsXG4gICAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcHJvY2Vzc0xpbmtzOiBmYWxzZSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID48L3ZhbC10ZXh0PlxuICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgY29udGVudDogc2VhcmNoUGxhY2Vob2xkZXIkIHwgYXN5bmMsXG4gICAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcHJvY2Vzc0xpbmtzOiBmYWxzZSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID48L3ZhbC10ZXh0PlxuICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgY29udGVudDogbm9EYXRhTWVzc2FnZSQgfCBhc3luYyxcbiAgICAgICAgICAgICAgc2l6ZTogJ21lZGl1bScsXG4gICAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgICBwcm9jZXNzTGlua3M6IGZhbHNlLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPjwvdmFsLXRleHQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3YXJuaW5nLWluZm9cIj5cbiAgICAgICAgPGgzPkluZm9ybWFjacOzbiBkZSBXYXJuaW5nczo8L2gzPlxuICAgICAgICA8cD5cbiAgICAgICAgICBBYnJlIGxhIGNvbnNvbGEgZGVsIG5hdmVnYWRvciBwYXJhIHZlciBsb3Mgd2FybmluZ3MgY3VhbmRvIGNhbWJpZXMgYSBpZGlvbWFzIGNvbiB0cmFkdWNjaW9uZXMgaW5jb21wbGV0YXNcbiAgICAgICAgICAoZnJhbmPDqXMsIGFsZW3DoW4pLlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPkVsIHNpc3RlbWEgYXV0b23DoXRpY2FtZW50ZSB1c2Fyw6EgZWwgaWRpb21hIHBvciBkZWZlY3RvIG8gZWwgcHJpbWVyIGlkaW9tYSBkaXNwb25pYmxlIGNvbW8gZmFsbGJhY2suPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtYW5hbHlzaXNcIj5cbiAgICAgICAgPGgzPkFuw6FsaXNpcyBkZWwgQ29tcG9uZW50ZTo8L2gzPlxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhbmFseXplQ3VycmVudENvbXBvbmVudCgpXCI+QW5hbGl6YXIgQ29udGVuaWRvPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJhbmFseXNpc1Jlc3VsdHNcIiBjbGFzcz1cImFuYWx5c2lzLXJlc3VsdHNcIj5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIDxzdHJvbmc+SWRpb21hcyBkaXNwb25pYmxlcyBwYXJhIGVzdGUgY29tcG9uZW50ZTo8L3N0cm9uZz5cbiAgICAgICAgICAgIHt7IGFuYWx5c2lzUmVzdWx0cy5hdmFpbGFibGVMYW5ndWFnZXMuam9pbignLCAnKSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYW5hbHlzaXNSZXN1bHRzLm1pc3NpbmdLZXlzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICA8c3Ryb25nPkNsYXZlcyBmYWx0YW50ZXMgZW4ge3sgbGFuZ1NlcnZpY2UuY3VycmVudExhbmcgfX06PC9zdHJvbmc+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQga2V5IG9mIGFuYWx5c2lzUmVzdWx0cy5taXNzaW5nS2V5c1wiPnt7IGtleSB9fTwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAubXVsdGktbGFuZy1kZW1vIHtcbiAgICAgICAgcGFkZGluZzogMjBweDtcbiAgICAgICAgbWF4LXdpZHRoOiA4MDBweDtcbiAgICAgIH1cblxuICAgICAgLmxhbmd1YWdlLWluZm8sXG4gICAgICAuY29udGVudC1leGFtcGxlcyxcbiAgICAgIC53YXJuaW5nLWluZm8sXG4gICAgICAuY29tcG9uZW50LWFuYWx5c2lzIHtcbiAgICAgICAgbWFyZ2luOiAyMHB4IDA7XG4gICAgICAgIHBhZGRpbmc6IDE1cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1jb2xvci1saWdodCwgI2Y0ZjVmOCk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLWxpZ2h0LXRpbnQsICNmNWY2ZjkpO1xuICAgICAgfVxuXG4gICAgICAuYnV0dG9uLWdyb3VwIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiAxMHB4O1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICB9XG5cbiAgICAgIC5idXR0b24tZ3JvdXAgYnV0dG9uIHtcbiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1jb2xvci1wcmltYXJ5LCAjMzg4MGZmKTtcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSwgIzM4ODBmZik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycztcbiAgICAgIH1cblxuICAgICAgLmJ1dHRvbi1ncm91cCBidXR0b246aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeS10aW50LCAjNDk5MmZmKTtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgfVxuXG4gICAgICAuYnV0dG9uLWdyb3VwIGJ1dHRvbi5hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSwgIzM4ODBmZik7XG4gICAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgIH1cblxuICAgICAgLmV4YW1wbGUtZ3JpZCB7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjAwcHgsIDFmcikpO1xuICAgICAgICBnYXA6IDEwcHg7XG4gICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICB9XG5cbiAgICAgIC5hbmFseXNpcy1yZXN1bHRzIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICAgICAgcGFkZGluZzogMTBweDtcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIH1cblxuICAgICAgaDIge1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLXByaW1hcnksICMzODgwZmYpO1xuICAgICAgfVxuXG4gICAgICBoMyB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFyaywgIzIyMjQyOCk7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlMYW5ndWFnZURlbW9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBhdmFpbGFibGVMYW5ndWFnZXM6IHN0cmluZ1tdID0gW107XG4gIGFuYWx5c2lzUmVzdWx0czogeyBhdmFpbGFibGVMYW5ndWFnZXM6IHN0cmluZ1tdOyBtaXNzaW5nS2V5czogc3RyaW5nW10gfSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIEdsb2JhbCBjb250ZW50IG9ic2VydmFibGVzXG4gIG9rQnV0dG9uJCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ29rJyB9KTtcbiAgY2FuY2VsQnV0dG9uJCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ2NhbmNlbCcgfSk7XG4gIHNhdmVCdXR0b24kID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnc2F2ZScgfSk7XG4gIGRlbGV0ZUJ1dHRvbiQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoeyBrZXk6ICdkZWxldGUnIH0pO1xuXG4gIC8vIENvbnRlbnQgdGhhdCBtaWdodCBoYXZlIG1pc3NpbmcgdHJhbnNsYXRpb25zXG4gIG5leHRCdXR0b24kID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnbmV4dCcsIGZhbGxiYWNrOiAnTmV4dCcgfSk7XG4gIGZpbmlzaEJ1dHRvbiQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoeyBrZXk6ICdmaW5pc2gnLCBmYWxsYmFjazogJ0ZpbmlzaCcgfSk7XG4gIHNlYXJjaFBsYWNlaG9sZGVyJCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ3NlYXJjaFBsYWNlaG9sZGVyJywgZmFsbGJhY2s6ICdTZWFyY2guLi4nIH0pO1xuICBub0RhdGFNZXNzYWdlJCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ25vRGF0YScsIGZhbGxiYWNrOiAnTm8gZGF0YSBhdmFpbGFibGUnIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb250ZW50OiBDb250ZW50U2VydmljZSxcbiAgICBwdWJsaWMgbGFuZ1NlcnZpY2U6IExhbmdTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyA9IHRoaXMubGFuZ1NlcnZpY2UuYXZhaWxhYmxlTGFuZ3M7XG4gIH1cblxuICBzd2l0Y2hMYW5ndWFnZShsYW5nOiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmxvZyhgU3dpdGNoaW5nIHRvIGxhbmd1YWdlOiAke2xhbmd9YCk7XG4gICAgdGhpcy5sYW5nU2VydmljZS5zZXRMYW5nKGxhbmcpO1xuICAgIHRoaXMuYW5hbHlzaXNSZXN1bHRzID0gbnVsbDsgLy8gUmVzZXQgYW5hbHlzaXMgd2hlbiBsYW5ndWFnZSBjaGFuZ2VzXG4gIH1cblxuICBnZXRMYW5ndWFnZU5hbWUobGFuZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFtMQU5HVUFHRVMuRVNdOiAnRXNwYcOxb2wnLFxuICAgICAgW0xBTkdVQUdFUy5FTl06ICdFbmdsaXNoJyxcbiAgICAgIFtMQU5HVUFHRVMuRlJdOiAnRnJhbsOnYWlzJyxcbiAgICAgIFtMQU5HVUFHRVMuREVdOiAnRGV1dHNjaCcsXG4gICAgICBwdDogJ1BvcnR1Z3XDqnMnLFxuICAgIH07XG4gICAgcmV0dXJuIG5hbWVzW2xhbmddIHx8IGxhbmcudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIGFuYWx5emVDdXJyZW50Q29tcG9uZW50KCkge1xuICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSAnX2dsb2JhbCc7IC8vIEFuYWx5emluZyBnbG9iYWwgY29udGVudCBmb3IgdGhpcyBkZW1vXG4gICAgY29uc3QgYXZhaWxhYmxlTGFuZ3VhZ2VzID0gdGhpcy5sYW5nU2VydmljZS5nZXRBdmFpbGFibGVMYW5ndWFnZXNGb3JDb21wb25lbnQoY29tcG9uZW50TmFtZSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSB0aGlzLmxhbmdTZXJ2aWNlLmdldE1pc3NpbmdDb250ZW50S2V5cyhjb21wb25lbnROYW1lLCB0aGlzLmxhbmdTZXJ2aWNlLmN1cnJlbnRMYW5nKTtcblxuICAgIHRoaXMuYW5hbHlzaXNSZXN1bHRzID0ge1xuICAgICAgYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgbWlzc2luZ0tleXMsXG4gICAgfTtcblxuICAgIGNvbnNvbGUubG9nKCdDb21wb25lbnQgYW5hbHlzaXMgcmVzdWx0czonLCB0aGlzLmFuYWx5c2lzUmVzdWx0cyk7XG4gIH1cbn1cbiJdfQ==
|