valtech-components 2.0.419 → 2.0.420

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 (107) hide show
  1. package/esm2022/lib/components/atoms/button/button.component.mjs +30 -102
  2. package/esm2022/lib/components/atoms/countdown/countdown.component.mjs +2 -7
  3. package/esm2022/lib/components/atoms/display/display.component.mjs +18 -101
  4. package/esm2022/lib/components/atoms/image/image.component.mjs +2 -5
  5. package/esm2022/lib/components/atoms/price-tag/price-tag.component.mjs +2 -12
  6. package/esm2022/lib/components/atoms/qr-code/qr-code.component.mjs +4 -29
  7. package/esm2022/lib/components/atoms/text/text.component.mjs +49 -171
  8. package/esm2022/lib/components/atoms/title/title.component.mjs +23 -65
  9. package/esm2022/lib/components/atoms/title/types.mjs +7 -19
  10. package/esm2022/lib/components/molecules/accordion/accordion.component.mjs +7 -53
  11. package/esm2022/lib/components/molecules/alert-box/alert-box.component.mjs +7 -26
  12. package/esm2022/lib/components/molecules/breadcrumb/breadcrumb.component.mjs +7 -42
  13. package/esm2022/lib/components/molecules/check-input/check-input.component.mjs +12 -41
  14. package/esm2022/lib/components/molecules/chip-group/chip-group.component.mjs +3 -28
  15. package/esm2022/lib/components/molecules/code-display/code-display.component.mjs +2 -5
  16. package/esm2022/lib/components/molecules/command-display/command-display.component.mjs +3 -6
  17. package/esm2022/lib/components/molecules/comment/comment.component.mjs +5 -31
  18. package/esm2022/lib/components/molecules/currency-input/currency-input.component.mjs +2 -23
  19. package/esm2022/lib/components/molecules/date-range-input/date-range-input.component.mjs +2 -29
  20. package/esm2022/lib/components/molecules/expandable-text/expandable-text.component.mjs +4 -6
  21. package/esm2022/lib/components/molecules/glow-card/glow-card.component.mjs +16 -40
  22. package/esm2022/lib/components/molecules/language-selector/language-selector.component.mjs +25 -125
  23. package/esm2022/lib/components/molecules/multi-select-search/multi-select-search.component.mjs +4 -6
  24. package/esm2022/lib/components/molecules/number-stepper/number-stepper.component.mjs +2 -10
  25. package/esm2022/lib/components/molecules/participant-card/participant-card.component.mjs +2 -4
  26. package/esm2022/lib/components/molecules/phone-input/phone-input.component.mjs +2 -23
  27. package/esm2022/lib/components/molecules/plain-code-box/plain-code-box.component.mjs +3 -6
  28. package/esm2022/lib/components/molecules/popover-selector/popover-selector.component.mjs +9 -12
  29. package/esm2022/lib/components/molecules/raffle-status-card/raffle-status-card.component.mjs +3 -11
  30. package/esm2022/lib/components/molecules/range-input/range-input.component.mjs +4 -25
  31. package/esm2022/lib/components/molecules/segment-control/segment-control.component.mjs +3 -34
  32. package/esm2022/lib/components/molecules/select-input/select-input.component.mjs +11 -20
  33. package/esm2022/lib/components/molecules/select-search/select-search.component.mjs +4 -6
  34. package/esm2022/lib/components/molecules/share-buttons/share-buttons.component.mjs +1 -6
  35. package/esm2022/lib/components/molecules/stepper/stepper.component.mjs +3 -28
  36. package/esm2022/lib/components/molecules/tabs/tabs.component.mjs +7 -41
  37. package/esm2022/lib/components/molecules/textarea-input/textarea-input.component.mjs +2 -27
  38. package/esm2022/lib/components/molecules/ticket-grid/ticket-grid.component.mjs +2 -10
  39. package/esm2022/lib/components/molecules/toggle-input/toggle-input.component.mjs +7 -37
  40. package/esm2022/lib/components/molecules/winner-display/winner-display.component.mjs +1 -12
  41. package/esm2022/lib/components/organisms/comment-section/comment-section.component.mjs +8 -54
  42. package/esm2022/lib/components/organisms/data-table/data-table.component.mjs +1 -3
  43. package/esm2022/lib/components/organisms/wizard/wizard.component.mjs +3 -5
  44. package/esm2022/lib/services/locale.service.mjs +75 -0
  45. package/esm2022/lib/services/types.mjs +5 -3
  46. package/esm2022/public-api.mjs +2 -7
  47. package/fesm2022/valtech-components.mjs +366 -2279
  48. package/fesm2022/valtech-components.mjs.map +1 -1
  49. package/lib/components/atoms/button/button.component.d.ts +12 -37
  50. package/lib/components/atoms/countdown/countdown.component.d.ts +0 -1
  51. package/lib/components/atoms/display/display.component.d.ts +8 -60
  52. package/lib/components/atoms/image/image.component.d.ts +0 -2
  53. package/lib/components/atoms/price-tag/price-tag.component.d.ts +0 -1
  54. package/lib/components/atoms/qr-code/qr-code.component.d.ts +2 -6
  55. package/lib/components/atoms/text/text.component.d.ts +20 -68
  56. package/lib/components/atoms/title/title.component.d.ts +7 -12
  57. package/lib/components/atoms/title/types.d.ts +11 -24
  58. package/lib/components/molecules/accordion/accordion.component.d.ts +2 -9
  59. package/lib/components/molecules/alert-box/alert-box.component.d.ts +3 -8
  60. package/lib/components/molecules/breadcrumb/breadcrumb.component.d.ts +2 -8
  61. package/lib/components/molecules/check-input/check-input.component.d.ts +2 -10
  62. package/lib/components/molecules/chip-group/chip-group.component.d.ts +2 -8
  63. package/lib/components/molecules/code-display/code-display.component.d.ts +0 -2
  64. package/lib/components/molecules/command-display/command-display.component.d.ts +0 -3
  65. package/lib/components/molecules/comment/comment.component.d.ts +2 -6
  66. package/lib/components/molecules/currency-input/currency-input.component.d.ts +0 -3
  67. package/lib/components/molecules/date-range-input/date-range-input.component.d.ts +0 -3
  68. package/lib/components/molecules/expandable-text/expandable-text.component.d.ts +0 -1
  69. package/lib/components/molecules/glow-card/glow-card.component.d.ts +5 -9
  70. package/lib/components/molecules/language-selector/language-selector.component.d.ts +7 -19
  71. package/lib/components/molecules/multi-select-search/multi-select-search.component.d.ts +0 -2
  72. package/lib/components/molecules/number-stepper/number-stepper.component.d.ts +0 -1
  73. package/lib/components/molecules/participant-card/participant-card.component.d.ts +0 -1
  74. package/lib/components/molecules/phone-input/phone-input.component.d.ts +0 -3
  75. package/lib/components/molecules/plain-code-box/plain-code-box.component.d.ts +0 -3
  76. package/lib/components/molecules/popover-selector/popover-selector.component.d.ts +3 -4
  77. package/lib/components/molecules/raffle-status-card/raffle-status-card.component.d.ts +0 -1
  78. package/lib/components/molecules/range-input/range-input.component.d.ts +3 -8
  79. package/lib/components/molecules/segment-control/segment-control.component.d.ts +2 -8
  80. package/lib/components/molecules/select-input/select-input.component.d.ts +2 -3
  81. package/lib/components/molecules/select-search/select-search.component.d.ts +0 -2
  82. package/lib/components/molecules/share-buttons/share-buttons.component.d.ts +0 -1
  83. package/lib/components/molecules/stepper/stepper.component.d.ts +2 -8
  84. package/lib/components/molecules/tabs/tabs.component.d.ts +2 -8
  85. package/lib/components/molecules/textarea-input/textarea-input.component.d.ts +2 -6
  86. package/lib/components/molecules/ticket-grid/ticket-grid.component.d.ts +0 -1
  87. package/lib/components/molecules/toggle-input/toggle-input.component.d.ts +2 -8
  88. package/lib/components/molecules/winner-display/winner-display.component.d.ts +0 -1
  89. package/lib/components/organisms/comment-section/comment-section.component.d.ts +2 -6
  90. package/lib/components/organisms/data-table/data-table.component.d.ts +0 -1
  91. package/lib/components/organisms/wizard/wizard.component.d.ts +0 -2
  92. package/lib/services/locale.service.d.ts +52 -0
  93. package/lib/services/types.d.ts +1 -6
  94. package/package.json +1 -1
  95. package/public-api.d.ts +1 -5
  96. package/esm2022/lib/services/lang-provider/components/lang-settings.mjs +0 -13
  97. package/esm2022/lib/services/lang-provider/content.mjs +0 -156
  98. package/esm2022/lib/services/lang-provider/lang-provider.service.mjs +0 -530
  99. package/esm2022/lib/services/lang-provider/types.mjs +0 -23
  100. package/esm2022/lib/shared/utils/content.mjs +0 -186
  101. package/esm2022/lib/shared/utils/simple-content.mjs +0 -119
  102. package/lib/services/lang-provider/components/lang-settings.d.ts +0 -3
  103. package/lib/services/lang-provider/content.d.ts +0 -17
  104. package/lib/services/lang-provider/lang-provider.service.d.ts +0 -264
  105. package/lib/services/lang-provider/types.d.ts +0 -30
  106. package/lib/shared/utils/content.d.ts +0 -199
  107. package/lib/shared/utils/simple-content.d.ts +0 -120
@@ -1,530 +0,0 @@
1
- import { Inject, Injectable } from '@angular/core';
2
- import { BehaviorSubject, distinctUntilChanged, map, shareReplay } from 'rxjs';
3
- import { LANG } from '../../shared/constants/storage';
4
- import { LocalStorageService } from '../local-storage.service';
5
- import { ValtechConfigService } from '../types';
6
- import { LANGUAGES, TextContent } from './types';
7
- import * as i0 from "@angular/core";
8
- /**
9
- * LangService - Reactive language and content management service.
10
- *
11
- * This service provides reactive content management with Observable-based language switching.
12
- * Components can subscribe to content changes and automatically update when the language changes.
13
- *
14
- * The service automatically detects available languages from the content configuration
15
- * and provides intelligent fallbacks with console warnings for missing translations.
16
- *
17
- * @example Basic usage:
18
- * ```typescript
19
- * constructor(private langService: LangService) {}
20
- *
21
- * // Get current language
22
- * const currentLang = this.langService.currentLang;
23
- *
24
- * // Subscribe to language changes
25
- * this.langService.currentLang$.subscribe(lang => console.log('Language changed:', lang));
26
- *
27
- * // Get static text
28
- * const text = this.langService.getText('ComponentName', 'textKey');
29
- *
30
- * // Get reactive text
31
- * const text$ = this.langService.getContent('ComponentName', 'textKey');
32
- * ```
33
- */
34
- export class LangService {
35
- constructor(config) {
36
- this.availableLanguages = [];
37
- this.warnedMissingLanguages = new Set();
38
- console.log('LangService: Injected config:', config);
39
- this.content = config.content;
40
- this.config = config;
41
- // Detect available languages from content
42
- this.detectAvailableLanguages();
43
- // Set default language (prefer Spanish, then English, then first available)
44
- this.defaultLang = this.determineDefaultLanguage();
45
- // Initialize with stored language or default
46
- const current = LocalStorageService.get(LANG);
47
- const initialLang = this.validateLanguage(current) || this.defaultLang;
48
- this.selectedLang = new BehaviorSubject(initialLang);
49
- console.log('LangService: Initialized with languages:', {
50
- available: this.availableLanguages,
51
- default: this.defaultLang,
52
- current: initialLang,
53
- });
54
- }
55
- /**
56
- * Detect available languages from the content configuration.
57
- * Scans all component content to find which languages are actually configured.
58
- */
59
- detectAvailableLanguages() {
60
- const languageSet = new Set();
61
- Object.values(this.content).forEach(componentContent => {
62
- if (componentContent?.Content) {
63
- Object.keys(componentContent.Content).forEach(lang => {
64
- languageSet.add(lang);
65
- });
66
- }
67
- });
68
- this.availableLanguages = Array.from(languageSet).sort();
69
- if (this.availableLanguages.length === 0) {
70
- console.warn('LangService: No languages detected in content configuration!');
71
- this.availableLanguages = [LANGUAGES.ES]; // Fallback
72
- }
73
- }
74
- /**
75
- * Determine the best default language based on available content.
76
- */
77
- determineDefaultLanguage() {
78
- // Preference order: Spanish, English, then first available
79
- const preferredOrder = [LANGUAGES.ES, LANGUAGES.EN];
80
- for (const preferred of preferredOrder) {
81
- if (this.availableLanguages.includes(preferred)) {
82
- return preferred;
83
- }
84
- }
85
- return this.availableLanguages[0];
86
- }
87
- /**
88
- * Validate if a language is available in the content.
89
- */
90
- validateLanguage(lang) {
91
- if (!lang)
92
- return null;
93
- return this.availableLanguages.includes(lang) ? lang : null;
94
- }
95
- /**
96
- * Get the best available language for a component and key.
97
- * Provides intelligent fallback with warnings.
98
- */
99
- getBestAvailableContent(className, key, requestedLang) {
100
- const componentContent = this.content[className];
101
- if (!componentContent) {
102
- return {
103
- content: undefined,
104
- actualLang: requestedLang,
105
- shouldWarn: false,
106
- };
107
- }
108
- // Try requested language first
109
- const requestedContent = componentContent.Content[requestedLang];
110
- if (requestedContent?.[key]) {
111
- return {
112
- content: requestedContent[key],
113
- actualLang: requestedLang,
114
- shouldWarn: false,
115
- };
116
- }
117
- // Language not available, try fallbacks
118
- const warningKey = `${className}.${key}.${requestedLang}`;
119
- const shouldWarn = !this.warnedMissingLanguages.has(warningKey);
120
- if (shouldWarn) {
121
- this.warnedMissingLanguages.add(warningKey);
122
- }
123
- // Try default language
124
- if (requestedLang !== this.defaultLang) {
125
- const defaultContent = componentContent.Content[this.defaultLang];
126
- if (defaultContent?.[key]) {
127
- return {
128
- content: defaultContent[key],
129
- actualLang: this.defaultLang,
130
- shouldWarn,
131
- };
132
- }
133
- }
134
- // Try first available language
135
- for (const availableLang of this.availableLanguages) {
136
- const availableContent = componentContent.Content[availableLang];
137
- if (availableContent?.[key]) {
138
- return {
139
- content: availableContent[key],
140
- actualLang: availableLang,
141
- shouldWarn,
142
- };
143
- }
144
- }
145
- return {
146
- content: undefined,
147
- actualLang: requestedLang,
148
- shouldWarn,
149
- };
150
- }
151
- /**
152
- * Observable that emits the current language whenever it changes.
153
- * Use this to subscribe to language changes in components.
154
- */
155
- get currentLang$() {
156
- return this.selectedLang.asObservable().pipe(distinctUntilChanged(), shareReplay(1) // Ensure new subscribers get the current value
157
- );
158
- }
159
- /**
160
- * Get the current language synchronously.
161
- */
162
- get currentLang() {
163
- return this.selectedLang.value;
164
- }
165
- /**
166
- * Get array of available languages detected from content.
167
- */
168
- get availableLangs() {
169
- return [...this.availableLanguages];
170
- }
171
- /**
172
- * Get the default language.
173
- */
174
- get defaultLanguage() {
175
- return this.defaultLang;
176
- }
177
- /**
178
- * Set the current language and persist it to localStorage.
179
- * This will trigger updates in all reactive content subscriptions.
180
- *
181
- * Validates that the language is available and warns if not.
182
- *
183
- * @param lang - The language to set
184
- */
185
- setLang(lang) {
186
- if (!this.availableLanguages.includes(lang)) {
187
- console.warn(`LangService: Language "${lang}" is not available. Available languages:`, this.availableLanguages);
188
- console.warn(`LangService: Falling back to default language "${this.defaultLang}"`);
189
- lang = this.defaultLang;
190
- }
191
- this.selectedLang.next(lang);
192
- LocalStorageService.set(LANG, lang);
193
- }
194
- /**
195
- * Get content for a component class and key (legacy method).
196
- *
197
- * @deprecated Use getText() or getContent() for better type safety
198
- */
199
- Text(className) {
200
- const componentContent = this.content[className];
201
- return componentContent?.Content[this.selectedLang.value] || {};
202
- }
203
- /**
204
- * Get a single content string synchronously for the current language.
205
- * Provides intelligent fallback with warnings for missing translations.
206
- *
207
- * @param className - The component class name
208
- * @param key - The text key
209
- * @param fallback - Optional fallback text if key is not found
210
- * @returns The text string or fallback
211
- */
212
- getText(className, key, fallback) {
213
- const result = this.getBestAvailableContent(className, key, this.selectedLang.value);
214
- if (result.shouldWarn && result.actualLang !== this.selectedLang.value) {
215
- console.warn(`LangService: Content "${className}.${key}" not available in "${this.selectedLang.value}".`, `Using "${result.actualLang}" instead. Available languages:`, this.availableLanguages);
216
- }
217
- return result.content || fallback || `[${className}.${key}]`;
218
- }
219
- /**
220
- * Get a reactive Observable for a specific text key that updates when language changes.
221
- * This is the recommended method for components that need reactive content.
222
- * Provides intelligent fallback with warnings for missing translations.
223
- *
224
- * @param className - The component class name
225
- * @param key - The text key
226
- * @param fallback - Optional fallback text if key is not found
227
- * @returns Observable that emits the text string whenever language changes
228
- */
229
- getContent(className, key, fallback) {
230
- return this.currentLang$.pipe(map(lang => {
231
- const result = this.getBestAvailableContent(className, key, lang);
232
- if (result.shouldWarn && result.actualLang !== lang) {
233
- console.warn(`LangService: Content "${className}.${key}" not available in "${lang}".`, `Using "${result.actualLang}" instead. Available languages:`, this.availableLanguages);
234
- }
235
- return result.content || fallback || `[${className}.${key}]`;
236
- }), distinctUntilChanged());
237
- }
238
- /**
239
- * Get reactive content for multiple keys at once.
240
- * Provides intelligent fallback with warnings for missing translations.
241
- *
242
- * @param className - The component class name
243
- * @param keys - Array of text keys to retrieve
244
- * @returns Observable that emits an object with all requested keys
245
- */
246
- getMultipleContent(className, keys) {
247
- return this.currentLang$.pipe(map(lang => {
248
- const result = {};
249
- keys.forEach(key => {
250
- const contentResult = this.getBestAvailableContent(className, key, lang);
251
- if (contentResult.shouldWarn && contentResult.actualLang !== lang) {
252
- console.warn(`LangService: Content "${className}.${key}" not available in "${lang}".`, `Using "${contentResult.actualLang}" instead.`);
253
- }
254
- result[key] = contentResult.content || `[${className}.${key}]`;
255
- });
256
- return result;
257
- }), distinctUntilChanged((prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)));
258
- }
259
- /**
260
- * Check if a content key exists for a component in any available language.
261
- *
262
- * @param className - The component class name
263
- * @param key - The text key
264
- * @returns True if the key exists in any language
265
- */
266
- hasContent(className, key) {
267
- const classContent = this.content[className];
268
- if (!classContent)
269
- return false;
270
- return Object.values(classContent.Content).some(langContent => langContent && typeof langContent[key] === 'string');
271
- }
272
- /**
273
- * Check if a content key exists for a component in a specific language.
274
- *
275
- * @param className - The component class name
276
- * @param key - The text key
277
- * @param lang - The language to check (defaults to current language)
278
- * @returns True if the key exists in the specified language
279
- */
280
- hasContentInLanguage(className, key, lang) {
281
- const targetLang = lang || this.currentLang;
282
- const classContent = this.content[className]?.Content[targetLang];
283
- return classContent && typeof classContent[key] === 'string';
284
- }
285
- /**
286
- * Get available languages for a specific component.
287
- *
288
- * @param className - The component class name
289
- * @returns Array of language codes available for the component
290
- */
291
- getAvailableLanguagesForComponent(className) {
292
- const classContent = this.content[className];
293
- if (!classContent)
294
- return [];
295
- return Object.keys(classContent.Content).filter(lang => classContent.Content[lang] && Object.keys(classContent.Content[lang]).length > 0);
296
- }
297
- /**
298
- * Get missing content keys for a component in a specific language.
299
- * Useful for identifying incomplete translations.
300
- *
301
- * @param className - The component class name
302
- * @param lang - The language to check
303
- * @param referenceLang - The reference language to compare against (defaults to default language)
304
- * @returns Array of missing keys
305
- */
306
- getMissingContentKeys(className, lang, referenceLang) {
307
- const refLang = referenceLang || this.defaultLang;
308
- const classContent = this.content[className];
309
- if (!classContent)
310
- return [];
311
- const referenceContent = classContent.Content[refLang] || {};
312
- const targetContent = classContent.Content[lang] || {};
313
- return Object.keys(referenceContent).filter(key => !targetContent[key] || typeof targetContent[key] !== 'string');
314
- }
315
- /**
316
- * Register or update content for a component dynamically.
317
- * This allows registering content at runtime without APP_INITIALIZER.
318
- *
319
- * @param className - The component class name
320
- * @param content - The multilingual content object
321
- * @param merge - Whether to merge with existing content (default: true)
322
- *
323
- * @example
324
- * ```typescript
325
- * this.langService.registerContent('MyComponent', {
326
- * [LANGUAGES.ES]: { title: 'Título', description: 'Descripción' },
327
- * [LANGUAGES.EN]: { title: 'Title', description: 'Description' }
328
- * });
329
- * ```
330
- */
331
- registerContent(className, content, merge = true) {
332
- if (!className) {
333
- console.error('LangService: className is required for registerContent');
334
- return;
335
- }
336
- if (!content || typeof content !== 'object') {
337
- console.error('LangService: Invalid content provided for registerContent');
338
- return;
339
- }
340
- console.log(`LangService: Registering content for "${className}"`, {
341
- merge,
342
- languages: Object.keys(content),
343
- });
344
- // Initialize component content if it doesn't exist
345
- if (!this.content[className]) {
346
- this.content[className] = new TextContent({});
347
- }
348
- // Merge or replace content for each language
349
- Object.entries(content).forEach(([lang, langContent]) => {
350
- if (!langContent || typeof langContent !== 'object') {
351
- console.warn(`LangService: Invalid content for language "${lang}" in "${className}"`);
352
- return;
353
- }
354
- if (!this.content[className].Content[lang]) {
355
- this.content[className].Content[lang] = {};
356
- }
357
- if (merge) {
358
- this.content[className].Content[lang] = {
359
- ...this.content[className].Content[lang],
360
- ...langContent,
361
- };
362
- }
363
- else {
364
- this.content[className].Content[lang] = { ...langContent };
365
- }
366
- });
367
- // Update available languages
368
- this.detectAvailableLanguages();
369
- console.log(`LangService: Content registered successfully for "${className}"`);
370
- }
371
- /**
372
- * Update multiple content registrations at once.
373
- *
374
- * @param contentMap - Map of className to content
375
- * @param merge - Whether to merge with existing content (default: true)
376
- *
377
- * @example
378
- * ```typescript
379
- * this.langService.registerMultipleContent({
380
- * 'Component1': { [LANGUAGES.ES]: { key1: 'valor1' } },
381
- * 'Component2': { [LANGUAGES.EN]: { key2: 'value2' } }
382
- * });
383
- * ```
384
- */
385
- registerMultipleContent(contentMap, merge = true) {
386
- if (!contentMap || typeof contentMap !== 'object') {
387
- console.error('LangService: Invalid contentMap provided for registerMultipleContent');
388
- return;
389
- }
390
- console.log('LangService: Registering multiple content entries', {
391
- classes: Object.keys(contentMap),
392
- merge,
393
- });
394
- Object.entries(contentMap).forEach(([className, content]) => {
395
- this.registerContent(className, content, merge);
396
- });
397
- console.log('LangService: Multiple content registration completed');
398
- }
399
- /**
400
- * Remove content for a specific component.
401
- *
402
- * @param className - The component class name to remove
403
- */
404
- removeContent(className) {
405
- if (!className) {
406
- console.error('LangService: className is required for removeContent');
407
- return;
408
- }
409
- if (this.content[className]) {
410
- delete this.content[className];
411
- this.detectAvailableLanguages();
412
- console.log(`LangService: Content removed for "${className}"`);
413
- }
414
- else {
415
- console.warn(`LangService: No content found for "${className}" to remove`);
416
- }
417
- }
418
- /**
419
- * Get a list of all registered component classes.
420
- *
421
- * @returns Array of registered class names
422
- */
423
- getRegisteredClasses() {
424
- return Object.keys(this.content);
425
- }
426
- /**
427
- * Get the complete content configuration (for debugging purposes).
428
- * Returns a deep copy to prevent accidental mutations.
429
- *
430
- * @returns Complete content configuration
431
- */
432
- getContentConfiguration() {
433
- return JSON.parse(JSON.stringify(this.content));
434
- }
435
- /**
436
- * Clear all content and reset to initial state.
437
- * Useful for testing or complete reinitialization.
438
- */
439
- clearAllContent() {
440
- console.log('LangService: Clearing all content');
441
- this.content = {};
442
- this.availableLanguages = [LANGUAGES.ES]; // Reset to default
443
- this.warnedMissingLanguages.clear();
444
- console.log('LangService: All content cleared');
445
- }
446
- /**
447
- * Get content with interpolation support.
448
- * Retrieves content and replaces placeholders with provided values.
449
- *
450
- * @param className - The component class name
451
- * @param key - The text key
452
- * @param interpolationData - Object with values to interpolate
453
- * @param fallback - Optional fallback text if key is not found
454
- * @returns Text with interpolated values
455
- */
456
- getTextWithInterpolation(className, key, interpolationData, fallback) {
457
- const content = this.getText(className, key, fallback);
458
- return this.interpolateString(content, interpolationData);
459
- }
460
- /**
461
- * Get reactive content with interpolation support.
462
- * Returns an Observable that emits interpolated content when language changes.
463
- *
464
- * @param className - The component class name
465
- * @param key - The text key
466
- * @param interpolationData - Object with values to interpolate
467
- * @param fallback - Optional fallback text if key is not found
468
- * @returns Observable that emits interpolated text
469
- */
470
- getContentWithInterpolation(className, key, interpolationData, fallback) {
471
- return this.getContent(className, key, fallback).pipe(map(content => this.interpolateString(content, interpolationData)));
472
- }
473
- /**
474
- * Interpolate a string with provided values.
475
- * Replaces placeholders like {{key}} or {key} with actual values.
476
- *
477
- * @param content - Content string with placeholders
478
- * @param values - Values to interpolate
479
- * @returns Interpolated string
480
- *
481
- * @example
482
- * ```typescript
483
- * interpolateString('Hello {{name}}!', { name: 'World' })
484
- * // Returns: 'Hello World!'
485
- * ```
486
- */
487
- interpolateString(content, values) {
488
- if (!values || !content) {
489
- return content;
490
- }
491
- return content.replace(/\{\{?(\w+)\}?\}/g, (match, key) => {
492
- const value = values[key];
493
- return value !== undefined ? String(value) : match;
494
- });
495
- }
496
- /**
497
- * Legacy function equivalent to the old fromContentWithInterpolation.
498
- * Provides reactive content with interpolation support for backward compatibility.
499
- *
500
- * @param className - The component class name
501
- * @param key - The text key
502
- * @param interpolationData - Object with values to interpolate
503
- * @param fallback - Optional fallback text if key is not found
504
- * @returns Observable that emits interpolated text
505
- *
506
- * @deprecated Use getContentWithInterpolation instead
507
- */
508
- fromContentWithInterpolation(className, key, interpolationData, fallback) {
509
- return this.getContentWithInterpolation(className, key, interpolationData, fallback);
510
- }
511
- // Legacy getters/setters for backward compatibility
512
- get Lang() {
513
- return this.currentLang;
514
- }
515
- set Lang(lang) {
516
- this.setLang(lang);
517
- }
518
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LangService, deps: [{ token: ValtechConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
519
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LangService, providedIn: 'root' }); }
520
- }
521
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LangService, decorators: [{
522
- type: Injectable,
523
- args: [{
524
- providedIn: 'root',
525
- }]
526
- }], ctorParameters: () => [{ type: undefined, decorators: [{
527
- type: Inject,
528
- args: [ValtechConfigService]
529
- }] }] });
530
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZy1wcm92aWRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL2xhbmctcHJvdmlkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFjLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0YsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBaUIsb0JBQW9CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFL0QsT0FBTyxFQUFFLFNBQVMsRUFBOEMsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQUU3Rjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUlILE1BQU0sT0FBTyxXQUFXO0lBUXRCLFlBQTBDLE1BQXFCO1FBTHZELHVCQUFrQixHQUFpQixFQUFFLENBQUM7UUFHdEMsMkJBQXNCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUdqRCxPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQiwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFFaEMsNEVBQTRFO1FBQzVFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFFbkQsNkNBQTZDO1FBQzdDLE1BQU0sT0FBTyxH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RDtJQUNwRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLElBQWdCO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckIsQ0FBQzsrR0FubUJVLFdBQVcsa0JBUUYsb0JBQW9CO21IQVI3QixXQUFXLGNBRlYsTUFBTTs7NEZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVNjLE1BQU07MkJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBMQU5HIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2NvbnN0YW50cy9zdG9yYWdlJztcbmltcG9ydCB7IExvY2FsU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9sb2NhbC1zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmFsdGVjaENvbmZpZywgVmFsdGVjaENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJy4vY29udGVudCc7XG5pbXBvcnQgeyBMQU5HVUFHRVMsIExhbmdPcHRpb24sIExhbmd1YWdlVGV4dCwgTGFuZ3VhZ2VzQ29udGVudCwgVGV4dENvbnRlbnQgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBMYW5nU2VydmljZSAtIFJlYWN0aXZlIGxhbmd1YWdlIGFuZCBjb250ZW50IG1hbmFnZW1lbnQgc2VydmljZS5cbiAqXG4gKiBUaGlzIHNlcnZpY2UgcHJvdmlkZXMgcmVhY3RpdmUgY29udGVudCBtYW5hZ2VtZW50IHdpdGggT2JzZXJ2YWJsZS1iYXNlZCBsYW5ndWFnZSBzd2l0Y2hpbmcuXG4gKiBDb21wb25lbnRzIGNhbiBzdWJzY3JpYmUgdG8gY29udGVudCBjaGFuZ2VzIGFuZCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSB3aGVuIHRoZSBsYW5ndWFnZSBjaGFuZ2VzLlxuICpcbiAqIFRoZSBzZXJ2aWNlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBhdmFpbGFibGUgbGFuZ3VhZ2VzIGZyb20gdGhlIGNvbnRlbnQgY29uZmlndXJhdGlvblxuICogYW5kIHByb3ZpZGVzIGludGVsbGlnZW50IGZhbGxiYWNrcyB3aXRoIGNvbnNvbGUgd2FybmluZ3MgZm9yIG1pc3NpbmcgdHJhbnNsYXRpb25zLlxuICpcbiAqIEBleGFtcGxlIEJhc2ljIHVzYWdlOlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3RydWN0b3IocHJpdmF0ZSBsYW5nU2VydmljZTogTGFuZ1NlcnZpY2UpIHt9XG4gKlxuICogLy8gR2V0IGN1cnJlbnQgbGFuZ3VhZ2VcbiAqIGNvbnN0IGN1cnJlbnRMYW5nID0gdGhpcy5sYW5nU2VydmljZS5jdXJyZW50TGFuZztcbiAqXG4gKiAvLyBTdWJzY3JpYmUgdG8gbGFuZ3VhZ2UgY2hhbmdlc1xuICogdGhpcy5sYW5nU2VydmljZS5jdXJyZW50TGFuZyQuc3Vic2NyaWJlKGxhbmcgPT4gY29uc29sZS5sb2coJ0xhbmd1YWdlIGNoYW5nZWQ6JywgbGFuZykpO1xuICpcbiAqIC8vIEdldCBzdGF0aWMgdGV4dFxuICogY29uc3QgdGV4dCA9IHRoaXMubGFuZ1NlcnZpY2UuZ2V0VGV4dCgnQ29tcG9uZW50TmFtZScsICd0ZXh0S2V5Jyk7XG4gKlxuICogLy8gR2V0IHJlYWN0aXZlIHRleHRcbiAqIGNvbnN0IHRleHQkID0gdGhpcy5sYW5nU2VydmljZS5nZXRDb250ZW50KCdDb21wb25lbnROYW1lJywgJ3RleHRLZXknKTtcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTGFuZ1NlcnZpY2Uge1xuICBwcml2YXRlIGNvbnRlbnQ6IFByb3ZpZGVyO1xuICBwcml2YXRlIGRlZmF1bHRMYW5nOiBMYW5nT3B0aW9uO1xuICBwcml2YXRlIGF2YWlsYWJsZUxhbmd1YWdlczogTGFuZ09wdGlvbltdID0gW107XG4gIHByaXZhdGUgc2VsZWN0ZWRMYW5nOiBCZWhhdmlvclN1YmplY3Q8TGFuZ09wdGlvbj47XG4gIHByaXZhdGUgY29uZmlnOiBWYWx0ZWNoQ29uZmlnO1xuICBwcml2YXRlIHdhcm5lZE1pc3NpbmdMYW5ndWFnZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KFZhbHRlY2hDb25maWdTZXJ2aWNlKSBjb25maWc6IFZhbHRlY2hDb25maWcpIHtcbiAgICBjb25zb2xlLmxvZygnTGFuZ1NlcnZpY2U6IEluamVjdGVkIGNvbmZpZzonLCBjb25maWcpO1xuICAgIHRoaXMuY29udGVudCA9IGNvbmZpZy5jb250ZW50O1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuXG4gICAgLy8gRGV0ZWN0IGF2YWlsYWJsZSBsYW5ndWFnZXMgZnJvbSBjb250ZW50XG4gICAgdGhpcy5kZXRlY3RBdmFpbGFibGVMYW5ndWFnZXMoKTtcblxuICAgIC8vIFNldCBkZWZhdWx0IGxhbmd1YWdlIChwcmVmZXIgU3BhbmlzaCwgdGhlbiBFbmdsaXNoLCB0aGVuIGZpcnN0IGF2YWlsYWJsZSlcbiAgICB0aGlzLmRlZmF1bHRMYW5nID0gdGhpcy5kZXRlcm1pbmVEZWZhdWx0TGFuZ3VhZ2UoKTtcblxuICAgIC8vIEluaXRpYWxpemUgd2l0aCBzdG9yZWQgbGFuZ3VhZ2Ugb3IgZGVmYXVsdFxuICAgIGNvbnN0IGN1cnJlbnQgPSBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldDxMYW5nT3B0aW9uPihMQU5HKTtcbiAgICBjb25zdCBpbml0aWFsTGFuZyA9IHRoaXMudmFsaWRhdGVMYW5ndWFnZShjdXJyZW50KSB8fCB0aGlzLmRlZmF1bHRMYW5nO1xuXG4gICAgdGhpcy5zZWxlY3RlZExhbmcgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PExhbmdPcHRpb24+KGluaXRpYWxMYW5nKTtcblxuICAgIGNvbnNvbGUubG9nKCdMYW5nU2VydmljZTogSW5pdGlhbGl6ZWQgd2l0aCBsYW5ndWFnZXM6Jywge1xuICAgICAgYXZhaWxhYmxlOiB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyxcbiAgICAgIGRlZmF1bHQ6IHRoaXMuZGVmYXVsdExhbmcsXG4gICAgICBjdXJyZW50OiBpbml0aWFsTGFuZyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3QgYXZhaWxhYmxlIGxhbmd1YWdlcyBmcm9tIHRoZSBjb250ZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqIFNjYW5zIGFsbCBjb21wb25lbnQgY29udGVudCB0byBmaW5kIHdoaWNoIGxhbmd1YWdlcyBhcmUgYWN0dWFsbHkgY29uZmlndXJlZC5cbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0QXZhaWxhYmxlTGFuZ3VhZ2VzKCk6IHZvaWQge1xuICAgIGNvbnN0IGxhbmd1YWdlU2V0ID0gbmV3IFNldDxMYW5nT3B0aW9uPigpO1xuXG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLmNvbnRlbnQpLmZvckVhY2goY29tcG9uZW50Q29udGVudCA9PiB7XG4gICAgICBpZiAoY29tcG9uZW50Q29udGVudD8uQ29udGVudCkge1xuICAgICAgICBPYmplY3Qua2V5cyhjb21wb25lbnRDb250ZW50LkNvbnRlbnQpLmZvckVhY2gobGFuZyA9PiB7XG4gICAgICAgICAgbGFuZ3VhZ2VTZXQuYWRkKGxhbmcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gQXJyYXkuZnJvbShsYW5ndWFnZVNldCkuc29ydCgpO1xuXG4gICAgaWYgKHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKCdMYW5nU2VydmljZTogTm8gbGFuZ3VhZ2VzIGRldGVjdGVkIGluIGNvbnRlbnQgY29uZmlndXJhdGlvbiEnKTtcbiAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gW0xBTkdVQUdFUy5FU107IC8vIEZhbGxiYWNrXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSB0aGUgYmVzdCBkZWZhdWx0IGxhbmd1YWdlIGJhc2VkIG9uIGF2YWlsYWJsZSBjb250ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlcm1pbmVEZWZhdWx0TGFuZ3VhZ2UoKTogTGFuZ09wdGlvbiB7XG4gICAgLy8gUHJlZmVyZW5jZSBvcmRlcjogU3BhbmlzaCwgRW5nbGlzaCwgdGhlbiBmaXJzdCBhdmFpbGFibGVcbiAgICBjb25zdCBwcmVmZXJyZWRPcmRlciA9IFtMQU5HVUFHRVMuRVMsIExBTkdVQUdFUy5FTl07XG5cbiAgICBmb3IgKGNvbnN0IHByZWZlcnJlZCBvZiBwcmVmZXJyZWRPcmRlcikge1xuICAgICAgaWYgKHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzLmluY2x1ZGVzKHByZWZlcnJlZCkpIHtcbiAgICAgICAgcmV0dXJuIHByZWZlcnJlZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hdmFpbGFibGVMYW5ndWFnZXNbMF07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgaWYgYSBsYW5ndWFnZSBpcyBhdmFpbGFibGUgaW4gdGhlIGNvbnRlbnQuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTGFuZ3VhZ2UobGFuZzogTGFuZ09wdGlvbiB8IG51bGwpOiBMYW5nT3B0aW9uIHwgbnVsbCB7XG4gICAgaWYgKCFsYW5nKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMuaW5jbHVkZXMobGFuZykgPyBsYW5nIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGJlc3QgYXZhaWxhYmxlIGxhbmd1YWdlIGZvciBhIGNvbXBvbmVudCBhbmQga2V5LlxuICAgKiBQcm92aWRlcyBpbnRlbGxpZ2VudCBmYWxsYmFjayB3aXRoIHdhcm5pbmdzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRCZXN0QXZhaWxhYmxlQ29udGVudChcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBrZXk6IHN0cmluZyxcbiAgICByZXF1ZXN0ZWRMYW5nOiBMYW5nT3B0aW9uXG4gICk6IHtcbiAgICBjb250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgYWN0dWFsTGFuZzogTGFuZ09wdGlvbjtcbiAgICBzaG91bGRXYXJuOiBib29sZWFuO1xuICB9IHtcbiAgICBjb25zdCBjb21wb25lbnRDb250ZW50ID0gdGhpcy5jb250ZW50W2NsYXNzTmFtZV07XG5cbiAgICBpZiAoIWNvbXBvbmVudENvbnRlbnQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgYWN0dWFsTGFuZzogcmVxdWVzdGVkTGFuZyxcbiAgICAgICAgc2hvdWxkV2FybjogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFRyeSByZXF1ZXN0ZWQgbGFuZ3VhZ2UgZmlyc3RcbiAgICBjb25zdCByZXF1ZXN0ZWRDb250ZW50ID0gY29tcG9uZW50Q29udGVudC5Db250ZW50W3JlcXVlc3RlZExhbmddO1xuICAgIGlmIChyZXF1ZXN0ZWRDb250ZW50Py5ba2V5XSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogcmVxdWVzdGVkQ29udGVudFtrZXldLFxuICAgICAgICBhY3R1YWxMYW5nOiByZXF1ZXN0ZWRMYW5nLFxuICAgICAgICBzaG91bGRXYXJuOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gTGFuZ3VhZ2Ugbm90IGF2YWlsYWJsZSwgdHJ5IGZhbGxiYWNrc1xuICAgIGNvbnN0IHdhcm5pbmdLZXkgPSBgJHtjbGFzc05hbWV9LiR7a2V5fS4ke3JlcXVlc3RlZExhbmd9YDtcbiAgICBjb25zdCBzaG91bGRXYXJuID0gIXRoaXMud2FybmVkTWlzc2luZ0xhbmd1YWdlcy5oYXMod2FybmluZ0tleSk7XG5cbiAgICBpZiAoc2hvdWxkV2Fybikge1xuICAgICAgdGhpcy53YXJuZWRNaXNzaW5nTGFuZ3VhZ2VzLmFkZCh3YXJuaW5nS2V5KTtcbiAgICB9XG5cbiAgICAvLyBUcnkgZGVmYXVsdCBsYW5ndWFnZVxuICAgIGlmIChyZXF1ZXN0ZWRMYW5nICE9PSB0aGlzLmRlZmF1bHRMYW5nKSB7XG4gICAgICBjb25zdCBkZWZhdWx0Q29udGVudCA9IGNvbXBvbmVudENvbnRlbnQuQ29udGVudFt0aGlzLmRlZmF1bHRMYW5nXTtcbiAgICAgIGlmIChkZWZhdWx0Q29udGVudD8uW2tleV0pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBkZWZhdWx0Q29udGVudFtrZXldLFxuICAgICAgICAgIGFjdHVhbExhbmc6IHRoaXMuZGVmYXVsdExhbmcsXG4gICAgICAgICAgc2hvdWxkV2FybixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUcnkgZmlyc3QgYXZhaWxhYmxlIGxhbmd1YWdlXG4gICAgZm9yIChjb25zdCBhdmFpbGFibGVMYW5nIG9mIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzKSB7XG4gICAgICBjb25zdCBhdmFpbGFibGVDb250ZW50ID0gY29tcG9uZW50Q29udGVudC5Db250ZW50W2F2YWlsYWJsZUxhbmddO1xuICAgICAgaWYgKGF2YWlsYWJsZUNvbnRlbnQ/LltrZXldKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogYXZhaWxhYmxlQ29udGVudFtrZXldLFxuICAgICAgICAgIGFjdHVhbExhbmc6IGF2YWlsYWJsZUxhbmcsXG4gICAgICAgICAgc2hvdWxkV2FybixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogdW5kZWZpbmVkLFxuICAgICAgYWN0dWFsTGFuZzogcmVxdWVzdGVkTGFuZyxcbiAgICAgIHNob3VsZFdhcm4sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGN1cnJlbnQgbGFuZ3VhZ2Ugd2hlbmV2ZXIgaXQgY2hhbmdlcy5cbiAgICogVXNlIHRoaXMgdG8gc3Vic2NyaWJlIHRvIGxhbmd1YWdlIGNoYW5nZXMgaW4gY29tcG9uZW50cy5cbiAgICovXG4gIGdldCBjdXJyZW50TGFuZyQoKTogT2JzZXJ2YWJsZTxMYW5nT3B0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMYW5nLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgc2hhcmVSZXBsYXkoMSkgLy8gRW5zdXJlIG5ldyBzdWJzY3JpYmVycyBnZXQgdGhlIGN1cnJlbnQgdmFsdWVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBsYW5ndWFnZSBzeW5jaHJvbm91c2x5LlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRMYW5nKCk6IExhbmdPcHRpb24ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTGFuZy52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYXJyYXkgb2YgYXZhaWxhYmxlIGxhbmd1YWdlcyBkZXRlY3RlZCBmcm9tIGNvbnRlbnQuXG4gICAqL1xuICBnZXQgYXZhaWxhYmxlTGFuZ3MoKTogTGFuZ09wdGlvbltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UuXG4gICAqL1xuICBnZXQgZGVmYXVsdExhbmd1YWdlKCk6IExhbmdPcHRpb24ge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRMYW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VycmVudCBsYW5ndWFnZSBhbmQgcGVyc2lzdCBpdCB0byBsb2NhbFN0b3JhZ2UuXG4gICAqIFRoaXMgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgaW4gYWxsIHJlYWN0aXZlIGNvbnRlbnQgc3Vic2NyaXB0aW9ucy5cbiAgICpcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGxhbmd1YWdlIGlzIGF2YWlsYWJsZSBhbmQgd2FybnMgaWYgbm90LlxuICAgKlxuICAgKiBAcGFyYW0gbGFuZyAtIFRoZSBsYW5ndWFnZSB0byBzZXRcbiAgICovXG4gIHNldExhbmcobGFuZzogTGFuZ09wdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5hdmFpbGFibGVMYW5ndWFnZXMuaW5jbHVkZXMobGFuZykpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYExhbmdTZXJ2aWNlOiBMYW5ndWFnZSBcIiR7bGFuZ31cIiBpcyBub3QgYXZhaWxhYmxlLiBBdmFpbGFibGUgbGFuZ3VhZ2VzOmAsXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGFuZ3VhZ2VzXG4gICAgICApO1xuICAgICAgY29uc29sZS53YXJuKGBMYW5nU2VydmljZTogRmFsbGluZyBiYWNrIHRvIGRlZmF1bHQgbGFuZ3VhZ2UgXCIke3RoaXMuZGVmYXVsdExhbmd9XCJgKTtcbiAgICAgIGxhbmcgPSB0aGlzLmRlZmF1bHRMYW5nO1xuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRMYW5nLm5leHQobGFuZyk7XG4gICAgTG9jYWxTdG9yYWdlU2VydmljZS5zZXQ8TGFuZ09wdGlvbj4oTEFORywgbGFuZyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbnRlbnQgZm9yIGEgY29tcG9uZW50IGNsYXNzIGFuZCBrZXkgKGxlZ2FjeSBtZXRob2QpLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VGV4dCgpIG9yIGdldENvbnRlbnQoKSBmb3IgYmV0dGVyIHR5cGUgc2FmZXR5XG4gICAqL1xuICBUZXh0KGNsYXNzTmFtZTogc3RyaW5nKTogTGFuZ3VhZ2VUZXh0IHtcbiAgICBjb25zdCBjb21wb25lbnRDb250ZW50ID0gdGhpcy5jb250ZW50W2NsYXNzTmFtZV07XG4gICAgcmV0dXJuIGNvbXBvbmVudENvbnRlbnQ/LkNvbnRlbnRbdGhpcy5zZWxlY3RlZExhbmcudmFsdWVdIHx8IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSBjb250ZW50IHN0cmluZyBzeW5jaHJvbm91c2x5IGZvciB0aGUgY3VycmVudCBsYW5ndWFnZS5cbiAgICogUHJvdmlkZXMgaW50ZWxsaWdlbnQgZmFsbGJhY2sgd2l0aCB3YXJuaW5ncyBmb3IgbWlzc2luZyB0cmFuc2xhdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBjbGFzc05hbWUgLSBUaGUgY29tcG9uZW50IGNsYXNzIG5hbWVcbiAgICogQHBhcmFtIGtleSAtIFRoZSB0ZXh0IGtleVxuICAgKiBAcGFyYW0gZmFsbGJhY2sgLSBPcHRpb25hbCBmYWxsYmFjayB0ZXh0IGlmIGtleSBpcyBub3QgZm91bmRcbiAgICogQHJldHVybnMgVGhlIHRleHQgc3RyaW5nIG9yIGZhbGxiYWNrXG4gICAqL1xuICBnZXRUZXh0KGNsYXNzTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgZmFsbGJhY2s/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZ2V0QmVzdEF2YWlsYWJsZUNvbnRlbnQoY2xhc3NOYW1lLCBrZXksIHRoaXMuc2VsZWN0ZWRMYW5nLnZhbHVlKTtcblxuICAgIGlmIChyZXN1bHQuc2hvdWxkV2FybiAmJiByZXN1bHQuYWN0dWFsTGFuZyAhPT0gdGhpcy5zZWxlY3RlZExhbmcudmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYExhbmdTZXJ2aWNlOiBDb250ZW50IFwiJHtjbGFzc05hbWV9LiR7a2V5fVwiIG5vdCBhdmFpbGFibGUgaW4gXCIke3RoaXMuc2VsZWN0ZWRMYW5nLnZhbHVlfVwiLmAsXG4gICAgICAgIGBVc2luZyBcIiR7cmVzdWx0LmFjdHVhbExhbmd9XCIgaW5zdGVhZC4gQXZhaWxhYmxlIGxhbmd1YWdlczpgLFxuICAgICAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LmNvbnRlbnQgfHwgZmFsbGJhY2sgfHwgYFske2NsYXNzTmFtZX0uJHtrZXl9XWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgcmVhY3RpdmUgT2JzZXJ2YWJsZSBmb3IgYSBzcGVjaWZpYyB0ZXh0IGtleSB0aGF0IHVwZGF0ZXMgd2hlbiBsYW5ndWFnZSBjaGFuZ2VzLlxuICAgKiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBtZXRob2QgZm9yIGNvbXBvbmVudHMgdGhhdCBuZWVkIHJlYWN0aXZlIGNvbnRlbnQuXG4gICAqIFByb3ZpZGVzIGludGVsbGlnZW50IGZhbGxiYWNrIHdpdGggd2FybmluZ3MgZm9yIG1pc3NpbmcgdHJhbnNsYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gY2xhc3NOYW1lIC0gVGhlIGNvbXBvbmVudCBjbGFzcyBuYW1lXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgdGV4dCBrZXlcbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gT3B0aW9uYWwgZmFsbGJhY2sgdGV4dCBpZiBrZXkgaXMgbm90IGZvdW5kXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgdGV4dCBzdHJpbmcgd2hlbmV2ZXIgbGFuZ3VhZ2UgY2hhbmdlc1xuICAgKi9cbiAgZ2V0Q29udGVudChjbGFzc05hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIGZhbGxiYWNrPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TGFuZyQucGlwZShcbiAgICAgIG1hcChsYW5nID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5nZXRCZXN0QXZhaWxhYmxlQ29udGVudChjbGFzc05hbWUsIGtleSwgbGFuZyk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5zaG91bGRXYXJuICYmIHJlc3VsdC5hY3R1YWxMYW5nICE9PSBsYW5nKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYExhbmdTZXJ2aWNlOiBDb250ZW50IFwiJHtjbGFzc05hbWV9LiR7a2V5fVwiIG5vdCBhdmFpbGFibGUgaW4gXCIke2xhbmd9XCIuYCxcbiAgICAgICAgICAgIGBVc2luZyBcIiR7cmVzdWx0LmFjdHVhbExhbmd9XCIgaW5zdGVhZC4gQXZhaWxhYmxlIGxhbmd1YWdlczpgLFxuICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVMYW5ndWFnZXNcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5jb250ZW50IHx8IGZhbGxiYWNrIHx8IGBbJHtjbGFzc05hbWV9LiR7a2V5fV1gO1xuICAgICAgfSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVhY3RpdmUgY29udGVudCBmb3IgbXVsdGlwbGUga2V5cyBhdCBvbmNlLlxuICAgKiBQcm92aWRlcyBpbnRlbGxpZ2VudCBmYWxsYmFjayB3aXRoIHdhcm5pbmdzIGZvciBtaXNzaW5nIHRyYW5zbGF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZVxuICAgKiBAcGFyYW0ga2V5cyAtIEFycmF5IG9mIHRleHQga2V5cyB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgYW4gb2JqZWN0IHdpdGggYWxsIHJlcXVlc3RlZCBrZXlzXG4gICAqL1xuICBnZXRNdWx0aXBsZUNvbnRlbnQoY2xhc3NOYW1lOiBzdHJpbmcsIGtleXM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudExhbmckLnBpcGUoXG4gICAgICBtYXAobGFuZyA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnRSZXN1bHQgPSB0aGlzLmdldEJlc3RBdmFpbGFibGVDb250ZW50KGNsYXNzTmFtZSwga2V5LCBsYW5nKTtcblxuICAgICAgICAgIGlmIChjb250ZW50UmVzdWx0LnNob3VsZFdhcm4gJiYgY29udGVudFJlc3VsdC5hY3R1YWxMYW5nICE9PSBsYW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBMYW5nU2VydmljZTogQ29udGVudCBcIiR7Y2xhc3NOYW1lfS4ke2tleX1cIiBub3QgYXZhaWxhYmxlIGluIFwiJHtsYW5nfVwiLmAsXG4gICAgICAgICAgICAgIGBVc2luZyBcIiR7Y29udGVudFJlc3VsdC5hY3R1YWxMYW5nfVwiIGluc3RlYWQuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXN1bHRba2V5XSA9IGNvbnRlbnRSZXN1bHQuY29udGVudCB8fCBgWyR7Y2xhc3NOYW1lfS4ke2tleX1dYDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXYsIGN1cnIpID0+IEpTT04uc3RyaW5naWZ5KHByZXYpID09PSBKU09OLnN0cmluZ2lmeShjdXJyKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgY29udGVudCBrZXkgZXhpc3RzIGZvciBhIGNvbXBvbmVudCBpbiBhbnkgYXZhaWxhYmxlIGxhbmd1YWdlLlxuICAgKlxuICAgKiBAcGFyYW0gY2xhc3NOYW1lIC0gVGhlIGNvbXBvbmVudCBjbGFzcyBuYW1lXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgdGV4dCBrZXlcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUga2V5IGV4aXN0cyBpbiBhbnkgbGFuZ3VhZ2VcbiAgICovXG4gIGhhc0NvbnRlbnQoY2xhc3NOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2xhc3NDb250ZW50ID0gdGhpcy5jb250ZW50W2NsYXNzTmFtZV07XG4gICAgaWYgKCFjbGFzc0NvbnRlbnQpIHJldHVybiBmYWxzZTtcblxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKGNsYXNzQ29udGVudC5Db250ZW50KS5zb21lKFxuICAgICAgbGFuZ0NvbnRlbnQgPT4gbGFuZ0NvbnRlbnQgJiYgdHlwZW9mIGxhbmdDb250ZW50W2tleV0gPT09ICdzdHJpbmcnXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGNvbnRlbnQga2V5IGV4aXN0cyBmb3IgYSBjb21wb25lbnQgaW4gYSBzcGVjaWZpYyBsYW5ndWFnZS5cbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZVxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIHRleHQga2V5XG4gICAqIEBwYXJhbSBsYW5nIC0gVGhlIGxhbmd1YWdlIHRvIGNoZWNrIChkZWZhdWx0cyB0byBjdXJyZW50IGxhbmd1YWdlKVxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBrZXkgZXhpc3RzIGluIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2VcbiAgICovXG4gIGhhc0NvbnRlbnRJbkxhbmd1YWdlKGNsYXNzTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgbGFuZz86IExhbmdPcHRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCB0YXJnZXRMYW5nID0gbGFuZyB8fCB0aGlzLmN1cnJlbnRMYW5nO1xuICAgIGNvbnN0IGNsYXNzQ29udGVudCA9IHRoaXMuY29udGVudFtjbGFzc05hbWVdPy5Db250ZW50W3RhcmdldExhbmddO1xuICAgIHJldHVybiBjbGFzc0NvbnRlbnQgJiYgdHlwZW9mIGNsYXNzQ29udGVudFtrZXldID09PSAnc3RyaW5nJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYXZhaWxhYmxlIGxhbmd1YWdlcyBmb3IgYSBzcGVjaWZpYyBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjbGFzc05hbWUgLSBUaGUgY29tcG9uZW50IGNsYXNzIG5hbWVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgbGFuZ3VhZ2UgY29kZXMgYXZhaWxhYmxlIGZvciB0aGUgY29tcG9uZW50XG4gICAqL1xuICBnZXRBdmFpbGFibGVMYW5ndWFnZXNGb3JDb21wb25lbnQoY2xhc3NOYW1lOiBzdHJpbmcpOiBMYW5nT3B0aW9uW10ge1xuICAgIGNvbnN0IGNsYXNzQ29udGVudCA9IHRoaXMuY29udGVudFtjbGFzc05hbWVdO1xuICAgIGlmICghY2xhc3NDb250ZW50KSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoY2xhc3NDb250ZW50LkNvbnRlbnQpLmZpbHRlcihcbiAgICAgIGxhbmcgPT4gY2xhc3NDb250ZW50LkNvbnRlbnRbbGFuZ10gJiYgT2JqZWN0LmtleXMoY2xhc3NDb250ZW50LkNvbnRlbnRbbGFuZ10pLmxlbmd0aCA+IDBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtaXNzaW5nIGNvbnRlbnQga2V5cyBmb3IgYSBjb21wb25lbnQgaW4gYSBzcGVjaWZpYyBsYW5ndWFnZS5cbiAgICogVXNlZnVsIGZvciBpZGVudGlmeWluZyBpbmNvbXBsZXRlIHRyYW5zbGF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZVxuICAgKiBAcGFyYW0gbGFuZyAtIFRoZSBsYW5ndWFnZSB0byBjaGVja1xuICAgKiBAcGFyYW0gcmVmZXJlbmNlTGFuZyAtIFRoZSByZWZlcmVuY2UgbGFuZ3VhZ2UgdG8gY29tcGFyZSBhZ2FpbnN0IChkZWZhdWx0cyB0byBkZWZhdWx0IGxhbmd1YWdlKVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBtaXNzaW5nIGtleXNcbiAgICovXG4gIGdldE1pc3NpbmdDb250ZW50S2V5cyhjbGFzc05hbWU6IHN0cmluZywgbGFuZzogTGFuZ09wdGlvbiwgcmVmZXJlbmNlTGFuZz86IExhbmdPcHRpb24pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgcmVmTGFuZyA9IHJlZmVyZW5jZUxhbmcgfHwgdGhpcy5kZWZhdWx0TGFuZztcbiAgICBjb25zdCBjbGFzc0NvbnRlbnQgPSB0aGlzLmNvbnRlbnRbY2xhc3NOYW1lXTtcblxuICAgIGlmICghY2xhc3NDb250ZW50KSByZXR1cm4gW107XG5cbiAgICBjb25zdCByZWZlcmVuY2VDb250ZW50ID0gY2xhc3NDb250ZW50LkNvbnRlbnRbcmVmTGFuZ10gfHwge307XG4gICAgY29uc3QgdGFyZ2V0Q29udGVudCA9IGNsYXNzQ29udGVudC5Db250ZW50W2xhbmddIHx8IHt9O1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlZmVyZW5jZUNvbnRlbnQpLmZpbHRlcihcbiAgICAgIGtleSA9PiAhdGFyZ2V0Q29udGVudFtrZXldIHx8IHR5cGVvZiB0YXJnZXRDb250ZW50W2tleV0gIT09ICdzdHJpbmcnXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBvciB1cGRhdGUgY29udGVudCBmb3IgYSBjb21wb25lbnQgZHluYW1pY2FsbHkuXG4gICAqIFRoaXMgYWxsb3dzIHJlZ2lzdGVyaW5nIGNvbnRlbnQgYXQgcnVudGltZSB3aXRob3V0IEFQUF9JTklUSUFMSVpFUi5cbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZVxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBtdWx0aWxpbmd1YWwgY29udGVudCBvYmplY3RcbiAgICogQHBhcmFtIG1lcmdlIC0gV2hldGhlciB0byBtZXJnZSB3aXRoIGV4aXN0aW5nIGNvbnRlbnQgKGRlZmF1bHQ6IHRydWUpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGhpcy5sYW5nU2VydmljZS5yZWdpc3RlckNvbnRlbnQoJ015Q29tcG9uZW50Jywge1xuICAgKiAgIFtMQU5HVUFHRVMuRVNdOiB7IHRpdGxlOiAnVMOtdHVsbycsIGRlc2NyaXB0aW9uOiAnRGVzY3JpcGNpw7NuJyB9LFxuICAgKiAgIFtMQU5HVUFHRVMuRU5dOiB7IHRpdGxlOiAnVGl0bGUnLCBkZXNjcmlwdGlvbjogJ0Rlc2NyaXB0aW9uJyB9XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHJlZ2lzdGVyQ29udGVudChjbGFzc05hbWU6IHN0cmluZywgY29udGVudDogTGFuZ3VhZ2VzQ29udGVudCwgbWVyZ2U6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0xhbmdTZXJ2aWNlOiBjbGFzc05hbWUgaXMgcmVxdWlyZWQgZm9yIHJlZ2lzdGVyQ29udGVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghY29udGVudCB8fCB0eXBlb2YgY29udGVudCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0xhbmdTZXJ2aWNlOiBJbnZhbGlkIGNvbnRlbnQgcHJvdmlkZWQgZm9yIHJlZ2lzdGVyQ29udGVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBMYW5nU2VydmljZTogUmVnaXN0ZXJpbmcgY29udGVudCBmb3IgXCIke2NsYXNzTmFtZX1cImAsIHtcbiAgICAgIG1lcmdlLFxuICAgICAgbGFuZ3VhZ2VzOiBPYmplY3Qua2V5cyhjb250ZW50KSxcbiAgICB9KTtcblxuICAgIC8vIEluaXRpYWxpemUgY29tcG9uZW50IGNvbnRlbnQgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgIGlmICghdGhpcy5jb250ZW50W2NsYXNzTmFtZV0pIHtcbiAgICAgIHRoaXMuY29udGVudFtjbGFzc05hbWVdID0gbmV3IFRleHRDb250ZW50KHt9KTtcbiAgICB9XG5cbiAgICAvLyBNZXJnZSBvciByZXBsYWNlIGNvbnRlbnQgZm9yIGVhY2ggbGFuZ3VhZ2VcbiAgICBPYmplY3QuZW50cmllcyhjb250ZW50KS5mb3JFYWNoKChbbGFuZywgbGFuZ0NvbnRlbnRdKSA9PiB7XG4gICAgICBpZiAoIWxhbmdDb250ZW50IHx8IHR5cGVvZiBsYW5nQ29udGVudCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBMYW5nU2VydmljZTogSW52YWxpZCBjb250ZW50IGZvciBsYW5ndWFnZSBcIiR7bGFuZ31cIiBpbiBcIiR7Y2xhc3NOYW1lfVwiYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmNvbnRlbnRbY2xhc3NOYW1lXS5Db250ZW50W2xhbmddKSB7XG4gICAgICAgIHRoaXMuY29udGVudFtjbGFzc05hbWVdLkNvbnRlbnRbbGFuZ10gPSB7fTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lcmdlKSB7XG4gICAgICAgIHRoaXMuY29udGVudFtjbGFzc05hbWVdLkNvbnRlbnRbbGFuZ10gPSB7XG4gICAgICAgICAgLi4udGhpcy5jb250ZW50W2NsYXNzTmFtZV0uQ29udGVudFtsYW5nXSxcbiAgICAgICAgICAuLi5sYW5nQ29udGVudCxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29udGVudFtjbGFzc05hbWVdLkNvbnRlbnRbbGFuZ10gPSB7IC4uLmxhbmdDb250ZW50IH07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgYXZhaWxhYmxlIGxhbmd1YWdlc1xuICAgIHRoaXMuZGV0ZWN0QXZhaWxhYmxlTGFuZ3VhZ2VzKCk7XG5cbiAgICBjb25zb2xlLmxvZyhgTGFuZ1NlcnZpY2U6IENvbnRlbnQgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHkgZm9yIFwiJHtjbGFzc05hbWV9XCJgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgbXVsdGlwbGUgY29udGVudCByZWdpc3RyYXRpb25zIGF0IG9uY2UuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50TWFwIC0gTWFwIG9mIGNsYXNzTmFtZSB0byBjb250ZW50XG4gICAqIEBwYXJhbSBtZXJnZSAtIFdoZXRoZXIgdG8gbWVyZ2Ugd2l0aCBleGlzdGluZyBjb250ZW50IChkZWZhdWx0OiB0cnVlKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHRoaXMubGFuZ1NlcnZpY2UucmVnaXN0ZXJNdWx0aXBsZUNvbnRlbnQoe1xuICAgKiAgICdDb21wb25lbnQxJzogeyBbTEFOR1VBR0VTLkVTXTogeyBrZXkxOiAndmFsb3IxJyB9IH0sXG4gICAqICAgJ0NvbXBvbmVudDInOiB7IFtMQU5HVUFHRVMuRU5dOiB7IGtleTI6ICd2YWx1ZTInIH0gfVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICByZWdpc3Rlck11bHRpcGxlQ29udGVudChcbiAgICBjb250ZW50TWFwOiBSZWNvcmQ8c3RyaW5nLCBMYW5ndWFnZXNDb250ZW50PixcbiAgICBtZXJnZTogYm9vbGVhbiA9IHRydWVcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFjb250ZW50TWFwIHx8IHR5cGVvZiBjb250ZW50TWFwICE9PSAnb2JqZWN0Jykge1xuICAgICAgY29uc29sZS5lcnJvcignTGFuZ1NlcnZpY2U6IEludmFsaWQgY29udGVudE1hcCBwcm92aWRlZCBmb3IgcmVnaXN0ZXJNdWx0aXBsZUNvbnRlbnQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnTGFuZ1NlcnZpY2U6IFJlZ2lzdGVyaW5nIG11bHRpcGxlIGNvbnRlbnQgZW50cmllcycsIHtcbiAgICAgIGNsYXNzZXM6IE9iamVjdC5rZXlzKGNvbnRlbnRNYXApLFxuICAgICAgbWVyZ2UsXG4gICAgfSk7XG5cbiAgICBPYmplY3QuZW50cmllcyhjb250ZW50TWFwKS5mb3JFYWNoKChbY2xhc3NOYW1lLCBjb250ZW50XSkgPT4ge1xuICAgICAgdGhpcy5yZWdpc3RlckNvbnRlbnQoY2xhc3NOYW1lLCBjb250ZW50LCBtZXJnZSk7XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygnTGFuZ1NlcnZpY2U6IE11bHRpcGxlIGNvbnRlbnQgcmVnaXN0cmF0aW9uIGNvbXBsZXRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBjb250ZW50IGZvciBhIHNwZWNpZmljIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZSB0byByZW1vdmVcbiAgICovXG4gIHJlbW92ZUNvbnRlbnQoY2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIWNsYXNzTmFtZSkge1xuICAgICAgY29uc29sZS5lcnJvcignTGFuZ1NlcnZpY2U6IGNsYXNzTmFtZSBpcyByZXF1aXJlZCBmb3IgcmVtb3ZlQ29udGVudCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbnRlbnRbY2xhc3NOYW1lXSkge1xuICAgICAgZGVsZXRlIHRoaXMuY29udGVudFtjbGFzc05hbWVdO1xuICAgICAgdGhpcy5kZXRlY3RBdmFpbGFibGVMYW5ndWFnZXMoKTtcbiAgICAgIGNvbnNvbGUubG9nKGBMYW5nU2VydmljZTogQ29udGVudCByZW1vdmVkIGZvciBcIiR7Y2xhc3NOYW1lfVwiYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgTGFuZ1NlcnZpY2U6IE5vIGNvbnRlbnQgZm91bmQgZm9yIFwiJHtjbGFzc05hbWV9XCIgdG8gcmVtb3ZlYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgY29tcG9uZW50IGNsYXNzZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHJlZ2lzdGVyZWQgY2xhc3MgbmFtZXNcbiAgICovXG4gIGdldFJlZ2lzdGVyZWRDbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5jb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbXBsZXRlIGNvbnRlbnQgY29uZmlndXJhdGlvbiAoZm9yIGRlYnVnZ2luZyBwdXJwb3NlcykuXG4gICAqIFJldHVybnMgYSBkZWVwIGNvcHkgdG8gcHJldmVudCBhY2NpZGVudGFsIG11dGF0aW9ucy5cbiAgICpcbiAgICogQHJldHVybnMgQ29tcGxldGUgY29udGVudCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBnZXRDb250ZW50Q29uZmlndXJhdGlvbigpOiBQcm92aWRlciB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5jb250ZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGNvbnRlbnQgYW5kIHJlc2V0IHRvIGluaXRpYWwgc3RhdGUuXG4gICAqIFVzZWZ1bCBmb3IgdGVzdGluZyBvciBjb21wbGV0ZSByZWluaXRpYWxpemF0aW9uLlxuICAgKi9cbiAgY2xlYXJBbGxDb250ZW50KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKCdMYW5nU2VydmljZTogQ2xlYXJpbmcgYWxsIGNvbnRlbnQnKTtcbiAgICB0aGlzLmNvbnRlbnQgPSB7fTtcbiAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyA9IFtMQU5HVUFHRVMuRVNdOyAvLyBSZXNldCB0byBkZWZhdWx0XG4gICAgdGhpcy53YXJuZWRNaXNzaW5nTGFuZ3VhZ2VzLmNsZWFyKCk7XG4gICAgY29uc29sZS5sb2coJ0xhbmdTZXJ2aWNlOiBBbGwgY29udGVudCBjbGVhcmVkJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbnRlbnQgd2l0aCBpbnRlcnBvbGF0aW9uIHN1cHBvcnQuXG4gICAqIFJldHJpZXZlcyBjb250ZW50IGFuZCByZXBsYWNlcyBwbGFjZWhvbGRlcnMgd2l0aCBwcm92aWRlZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBjbGFzc05hbWUgLSBUaGUgY29tcG9uZW50IGNsYXNzIG5hbWVcbiAgICogQHBhcmFtIGtleSAtIFRoZSB0ZXh0IGtleVxuICAgKiBAcGFyYW0gaW50ZXJwb2xhdGlvbkRhdGEgLSBPYmplY3Qgd2l0aCB2YWx1ZXMgdG8gaW50ZXJwb2xhdGVcbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gT3B0aW9uYWwgZmFsbGJhY2sgdGV4dCBpZiBrZXkgaXMgbm90IGZvdW5kXG4gICAqIEByZXR1cm5zIFRleHQgd2l0aCBpbnRlcnBvbGF0ZWQgdmFsdWVzXG4gICAqL1xuICBnZXRUZXh0V2l0aEludGVycG9sYXRpb24oXG4gICAgY2xhc3NOYW1lOiBzdHJpbmcsXG4gICAga2V5OiBzdHJpbmcsXG4gICAgaW50ZXJwb2xhdGlvbkRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+LFxuICAgIGZhbGxiYWNrPzogc3RyaW5nXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0VGV4dChjbGFzc05hbWUsIGtleSwgZmFsbGJhY2spO1xuICAgIHJldHVybiB0aGlzLmludGVycG9sYXRlU3RyaW5nKGNvbnRlbnQsIGludGVycG9sYXRpb25EYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVhY3RpdmUgY29udGVudCB3aXRoIGludGVycG9sYXRpb24gc3VwcG9ydC5cbiAgICogUmV0dXJucyBhbiBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgaW50ZXJwb2xhdGVkIGNvbnRlbnQgd2hlbiBsYW5ndWFnZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAcGFyYW0gY2xhc3NOYW1lIC0gVGhlIGNvbXBvbmVudCBjbGFzcyBuYW1lXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgdGV4dCBrZXlcbiAgICogQHBhcmFtIGludGVycG9sYXRpb25EYXRhIC0gT2JqZWN0IHdpdGggdmFsdWVzIHRvIGludGVycG9sYXRlXG4gICAqIEBwYXJhbSBmYWxsYmFjayAtIE9wdGlvbmFsIGZhbGxiYWNrIHRleHQgaWYga2V5IGlzIG5vdCBmb3VuZFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgaW50ZXJwb2xhdGVkIHRleHRcbiAgICovXG4gIGdldENvbnRlbnRXaXRoSW50ZXJwb2xhdGlvbihcbiAgICBjbGFzc05hbWU6IHN0cmluZyxcbiAgICBrZXk6IHN0cmluZyxcbiAgICBpbnRlcnBvbGF0aW9uRGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4sXG4gICAgZmFsbGJhY2s/OiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb250ZW50KGNsYXNzTmFtZSwga2V5LCBmYWxsYmFjaykucGlwZShcbiAgICAgIG1hcChjb250ZW50ID0+IHRoaXMuaW50ZXJwb2xhdGVTdHJpbmcoY29udGVudCwgaW50ZXJwb2xhdGlvbkRhdGEpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJwb2xhdGUgYSBzdHJpbmcgd2l0aCBwcm92aWRlZCB2YWx1ZXMuXG4gICAqIFJlcGxhY2VzIHBsYWNlaG9sZGVycyBsaWtlIHt7a2V5fX0gb3Ige2tleX0gd2l0aCBhY3R1YWwgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGVudCAtIENvbnRlbnQgc3RyaW5nIHdpdGggcGxhY2Vob2xkZXJzXG4gICAqIEBwYXJhbSB2YWx1ZXMgLSBWYWx1ZXMgdG8gaW50ZXJwb2xhdGVcbiAgICogQHJldHVybnMgSW50ZXJwb2xhdGVkIHN0cmluZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGludGVycG9sYXRlU3RyaW5nKCdIZWxsbyB7e25hbWV9fSEnLCB7IG5hbWU6ICdXb3JsZCcgfSlcbiAgICogLy8gUmV0dXJuczogJ0hlbGxvIFdvcmxkISdcbiAgICogYGBgXG4gICAqL1xuICBwcml2YXRlIGludGVycG9sYXRlU3RyaW5nKGNvbnRlbnQ6IHN0cmluZywgdmFsdWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPik6IHN0cmluZyB7XG4gICAgaWYgKCF2YWx1ZXMgfHwgIWNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2UoL1xce1xcez8oXFx3KylcXH0/XFx9L2csIChtYXRjaCwga2V5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1trZXldO1xuICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyBTdHJpbmcodmFsdWUpIDogbWF0Y2g7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGVnYWN5IGZ1bmN0aW9uIGVxdWl2YWxlbnQgdG8gdGhlIG9sZCBmcm9tQ29udGVudFdpdGhJbnRlcnBvbGF0aW9uLlxuICAgKiBQcm92aWRlcyByZWFjdGl2ZSBjb250ZW50IHdpdGggaW50ZXJwb2xhdGlvbiBzdXBwb3J0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0gY2xhc3NOYW1lIC0gVGhlIGNvbXBvbmVudCBjbGFzcyBuYW1lXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgdGV4dCBrZXlcbiAgICogQHBhcmFtIGludGVycG9sYXRpb25EYXRhIC0gT2JqZWN0IHdpdGggdmFsdWVzIHRvIGludGVycG9sYXRlXG4gICAqIEBwYXJhbSBmYWxsYmFjayAtIE9wdGlvbmFsIGZhbGxiYWNrIHRleHQgaWYga2V5IGlzIG5vdCBmb3VuZFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgaW50ZXJwb2xhdGVkIHRleHRcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGdldENvbnRlbnRXaXRoSW50ZXJwb2xhdGlvbiBpbnN0ZWFkXG4gICAqL1xuICBmcm9tQ29udGVudFdpdGhJbnRlcnBvbGF0aW9uKFxuICAgIGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIGtleTogc3RyaW5nLFxuICAgIGludGVycG9sYXRpb25EYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPixcbiAgICBmYWxsYmFjaz86IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmdldENvbnRlbnRXaXRoSW50ZXJwb2xhdGlvbihjbGFzc05hbWUsIGtleSwgaW50ZXJwb2xhdGlvbkRhdGEsIGZhbGxiYWNrKTtcbiAgfVxuXG4gIC8vIExlZ2FjeSBnZXR0ZXJzL3NldHRlcnMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgZ2V0IExhbmcoKTogTGFuZ09wdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudExhbmc7XG4gIH1cblxuICBzZXQgTGFuZyhsYW5nOiBMYW5nT3B0aW9uKSB7XG4gICAgdGhpcy5zZXRMYW5nKGxhbmcpO1xuICB9XG59XG4iXX0=
@@ -1,23 +0,0 @@
1
- export class TextContent {
2
- constructor(text) {
3
- this.text = text;
4
- }
5
- get Content() {
6
- return this.text;
7
- }
8
- }
9
- /**
10
- * Common language constants for convenience.
11
- * Users can still use any language code string directly.
12
- */
13
- export const LANGUAGES = {
14
- ES: 'es',
15
- EN: 'en',
16
- FR: 'fr',
17
- DE: 'de',
18
- PT: 'pt',
19
- IT: 'it',
20
- ZH: 'zh',
21
- JA: 'ja',
22
- };
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2xhbmctcHJvdmlkZXIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsTUFBTSxPQUFPLFdBQVc7SUFFdEIsWUFBWSxJQUFzQjtRQUNoQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQVFEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRztJQUN2QixFQUFFLEVBQUUsSUFBYTtJQUNqQixFQUFFLEVBQUUsSUFBYTtJQUNqQixFQUFFLEVBQUUsSUFBYTtJQUNqQixFQUFFLEVBQUUsSUFBYTtJQUNqQixFQUFFLEVBQUUsSUFBYTtJQUNqQixFQUFFLEVBQUUsSUFBYTtJQUNqQixFQUFFLEVBQUUsSUFBYTtJQUNqQixFQUFFLEVBQUUsSUFBYTtDQUNULENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBMYW5ndWFnZVRleHQgPSB7XG4gIFtrZXk6IHN0cmluZ106IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIExhbmd1YWdlc0NvbnRlbnQgPSB7XG4gIFtrZXk6IHN0cmluZ106IExhbmd1YWdlVGV4dDtcbn07XG5cbmV4cG9ydCBjbGFzcyBUZXh0Q29udGVudCB7XG4gIHRleHQ6IExhbmd1YWdlc0NvbnRlbnQ7XG4gIGNvbnN0cnVjdG9yKHRleHQ6IExhbmd1YWdlc0NvbnRlbnQpIHtcbiAgICB0aGlzLnRleHQgPSB0ZXh0O1xuICB9XG5cbiAgZ2V0IENvbnRlbnQoKTogTGFuZ3VhZ2VzQ29udGVudCB7XG4gICAgcmV0dXJuIHRoaXMudGV4dDtcbiAgfVxufVxuXG4vKipcbiAqIExhbmd1YWdlIGNvZGUgdHlwZSAtIHN1cHBvcnRzIGFueSB2YWxpZCBsYW5ndWFnZSBjb2RlIHN0cmluZy5cbiAqIENvbW1vbiBleGFtcGxlczogJ2VzJywgJ2VuJywgJ2ZyJywgJ2RlJywgJ3B0JywgJ2l0JywgJ3poJywgJ2phJywgZXRjLlxuICovXG5leHBvcnQgdHlwZSBMYW5nT3B0aW9uID0gc3RyaW5nO1xuXG4vKipcbiAqIENvbW1vbiBsYW5ndWFnZSBjb25zdGFudHMgZm9yIGNvbnZlbmllbmNlLlxuICogVXNlcnMgY2FuIHN0aWxsIHVzZSBhbnkgbGFuZ3VhZ2UgY29kZSBzdHJpbmcgZGlyZWN0bHkuXG4gKi9cbmV4cG9ydCBjb25zdCBMQU5HVUFHRVMgPSB7XG4gIEVTOiAnZXMnIGFzIGNvbnN0LFxuICBFTjogJ2VuJyBhcyBjb25zdCxcbiAgRlI6ICdmcicgYXMgY29uc3QsXG4gIERFOiAnZGUnIGFzIGNvbnN0LFxuICBQVDogJ3B0JyBhcyBjb25zdCxcbiAgSVQ6ICdpdCcgYXMgY29uc3QsXG4gIFpIOiAnemgnIGFzIGNvbnN0LFxuICBKQTogJ2phJyBhcyBjb25zdCxcbn0gYXMgY29uc3Q7XG4iXX0=