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.
- package/esm2022/lib/components/atoms/button/button.component.mjs +30 -102
- package/esm2022/lib/components/atoms/countdown/countdown.component.mjs +2 -7
- package/esm2022/lib/components/atoms/display/display.component.mjs +18 -101
- package/esm2022/lib/components/atoms/image/image.component.mjs +2 -5
- package/esm2022/lib/components/atoms/price-tag/price-tag.component.mjs +2 -12
- package/esm2022/lib/components/atoms/qr-code/qr-code.component.mjs +4 -29
- package/esm2022/lib/components/atoms/text/text.component.mjs +49 -171
- package/esm2022/lib/components/atoms/title/title.component.mjs +23 -65
- package/esm2022/lib/components/atoms/title/types.mjs +7 -19
- package/esm2022/lib/components/molecules/accordion/accordion.component.mjs +7 -53
- package/esm2022/lib/components/molecules/alert-box/alert-box.component.mjs +7 -26
- package/esm2022/lib/components/molecules/breadcrumb/breadcrumb.component.mjs +7 -42
- package/esm2022/lib/components/molecules/check-input/check-input.component.mjs +12 -41
- package/esm2022/lib/components/molecules/chip-group/chip-group.component.mjs +3 -28
- package/esm2022/lib/components/molecules/code-display/code-display.component.mjs +2 -5
- package/esm2022/lib/components/molecules/command-display/command-display.component.mjs +3 -6
- package/esm2022/lib/components/molecules/comment/comment.component.mjs +5 -31
- package/esm2022/lib/components/molecules/currency-input/currency-input.component.mjs +2 -23
- package/esm2022/lib/components/molecules/date-range-input/date-range-input.component.mjs +2 -29
- package/esm2022/lib/components/molecules/expandable-text/expandable-text.component.mjs +4 -6
- package/esm2022/lib/components/molecules/glow-card/glow-card.component.mjs +16 -40
- package/esm2022/lib/components/molecules/language-selector/language-selector.component.mjs +25 -125
- package/esm2022/lib/components/molecules/multi-select-search/multi-select-search.component.mjs +4 -6
- package/esm2022/lib/components/molecules/number-stepper/number-stepper.component.mjs +2 -10
- package/esm2022/lib/components/molecules/participant-card/participant-card.component.mjs +2 -4
- package/esm2022/lib/components/molecules/phone-input/phone-input.component.mjs +2 -23
- package/esm2022/lib/components/molecules/plain-code-box/plain-code-box.component.mjs +3 -6
- package/esm2022/lib/components/molecules/popover-selector/popover-selector.component.mjs +9 -12
- package/esm2022/lib/components/molecules/raffle-status-card/raffle-status-card.component.mjs +3 -11
- package/esm2022/lib/components/molecules/range-input/range-input.component.mjs +4 -25
- package/esm2022/lib/components/molecules/segment-control/segment-control.component.mjs +3 -34
- package/esm2022/lib/components/molecules/select-input/select-input.component.mjs +11 -20
- package/esm2022/lib/components/molecules/select-search/select-search.component.mjs +4 -6
- package/esm2022/lib/components/molecules/share-buttons/share-buttons.component.mjs +1 -6
- package/esm2022/lib/components/molecules/stepper/stepper.component.mjs +3 -28
- package/esm2022/lib/components/molecules/tabs/tabs.component.mjs +7 -41
- package/esm2022/lib/components/molecules/textarea-input/textarea-input.component.mjs +2 -27
- package/esm2022/lib/components/molecules/ticket-grid/ticket-grid.component.mjs +2 -10
- package/esm2022/lib/components/molecules/toggle-input/toggle-input.component.mjs +7 -37
- package/esm2022/lib/components/molecules/winner-display/winner-display.component.mjs +1 -12
- package/esm2022/lib/components/organisms/comment-section/comment-section.component.mjs +8 -54
- package/esm2022/lib/components/organisms/data-table/data-table.component.mjs +1 -3
- package/esm2022/lib/components/organisms/wizard/wizard.component.mjs +3 -5
- package/esm2022/lib/services/locale.service.mjs +75 -0
- package/esm2022/lib/services/types.mjs +5 -3
- package/esm2022/public-api.mjs +2 -7
- package/fesm2022/valtech-components.mjs +366 -2279
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/button/button.component.d.ts +12 -37
- package/lib/components/atoms/countdown/countdown.component.d.ts +0 -1
- package/lib/components/atoms/display/display.component.d.ts +8 -60
- package/lib/components/atoms/image/image.component.d.ts +0 -2
- package/lib/components/atoms/price-tag/price-tag.component.d.ts +0 -1
- package/lib/components/atoms/qr-code/qr-code.component.d.ts +2 -6
- package/lib/components/atoms/text/text.component.d.ts +20 -68
- package/lib/components/atoms/title/title.component.d.ts +7 -12
- package/lib/components/atoms/title/types.d.ts +11 -24
- package/lib/components/molecules/accordion/accordion.component.d.ts +2 -9
- package/lib/components/molecules/alert-box/alert-box.component.d.ts +3 -8
- package/lib/components/molecules/breadcrumb/breadcrumb.component.d.ts +2 -8
- package/lib/components/molecules/check-input/check-input.component.d.ts +2 -10
- package/lib/components/molecules/chip-group/chip-group.component.d.ts +2 -8
- package/lib/components/molecules/code-display/code-display.component.d.ts +0 -2
- package/lib/components/molecules/command-display/command-display.component.d.ts +0 -3
- package/lib/components/molecules/comment/comment.component.d.ts +2 -6
- package/lib/components/molecules/currency-input/currency-input.component.d.ts +0 -3
- package/lib/components/molecules/date-range-input/date-range-input.component.d.ts +0 -3
- package/lib/components/molecules/expandable-text/expandable-text.component.d.ts +0 -1
- package/lib/components/molecules/glow-card/glow-card.component.d.ts +5 -9
- package/lib/components/molecules/language-selector/language-selector.component.d.ts +7 -19
- package/lib/components/molecules/multi-select-search/multi-select-search.component.d.ts +0 -2
- package/lib/components/molecules/number-stepper/number-stepper.component.d.ts +0 -1
- package/lib/components/molecules/participant-card/participant-card.component.d.ts +0 -1
- package/lib/components/molecules/phone-input/phone-input.component.d.ts +0 -3
- package/lib/components/molecules/plain-code-box/plain-code-box.component.d.ts +0 -3
- package/lib/components/molecules/popover-selector/popover-selector.component.d.ts +3 -4
- package/lib/components/molecules/raffle-status-card/raffle-status-card.component.d.ts +0 -1
- package/lib/components/molecules/range-input/range-input.component.d.ts +3 -8
- package/lib/components/molecules/segment-control/segment-control.component.d.ts +2 -8
- package/lib/components/molecules/select-input/select-input.component.d.ts +2 -3
- package/lib/components/molecules/select-search/select-search.component.d.ts +0 -2
- package/lib/components/molecules/share-buttons/share-buttons.component.d.ts +0 -1
- package/lib/components/molecules/stepper/stepper.component.d.ts +2 -8
- package/lib/components/molecules/tabs/tabs.component.d.ts +2 -8
- package/lib/components/molecules/textarea-input/textarea-input.component.d.ts +2 -6
- package/lib/components/molecules/ticket-grid/ticket-grid.component.d.ts +0 -1
- package/lib/components/molecules/toggle-input/toggle-input.component.d.ts +2 -8
- package/lib/components/molecules/winner-display/winner-display.component.d.ts +0 -1
- package/lib/components/organisms/comment-section/comment-section.component.d.ts +2 -6
- package/lib/components/organisms/data-table/data-table.component.d.ts +0 -1
- package/lib/components/organisms/wizard/wizard.component.d.ts +0 -2
- package/lib/services/locale.service.d.ts +52 -0
- package/lib/services/types.d.ts +1 -6
- package/package.json +1 -1
- package/public-api.d.ts +1 -5
- package/esm2022/lib/services/lang-provider/components/lang-settings.mjs +0 -13
- package/esm2022/lib/services/lang-provider/content.mjs +0 -156
- package/esm2022/lib/services/lang-provider/lang-provider.service.mjs +0 -530
- package/esm2022/lib/services/lang-provider/types.mjs +0 -23
- package/esm2022/lib/shared/utils/content.mjs +0 -186
- package/esm2022/lib/shared/utils/simple-content.mjs +0 -119
- package/lib/services/lang-provider/components/lang-settings.d.ts +0 -3
- package/lib/services/lang-provider/content.d.ts +0 -17
- package/lib/services/lang-provider/lang-provider.service.d.ts +0 -264
- package/lib/services/lang-provider/types.d.ts +0 -30
- package/lib/shared/utils/content.d.ts +0 -199
- 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=
|