@libs-ui/components-inputs-multi-language 0.2.74 → 0.2.75
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/index.mjs +2 -2
- package/esm2022/items/items.component.mjs +2 -2
- package/esm2022/multi-language.component.mjs +362 -0
- package/fesm2022/libs-ui-components-inputs-multi-language.mjs.map +1 -1
- package/index.d.ts +1 -1
- package/package.json +1 -1
- package/esm2022/inputs-multi-language.component.mjs +0 -362
- /package/{inputs-multi-language.component.d.ts → multi-language.component.d.ts} +0 -0
package/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,362 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, effect, input, model, output, signal, untracked } from '@angular/core';
|
|
2
|
-
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
3
|
-
import { LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';
|
|
4
|
-
import { LibsUiComponentsInputsValidComponent } from '@libs-ui/components-inputs-valid';
|
|
5
|
-
import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
|
|
6
|
-
import { cloneDeep, get, isNil } from '@libs-ui/utils';
|
|
7
|
-
import { TranslateModule } from '@ngx-translate/core';
|
|
8
|
-
import { Subject, takeUntil, timer } from 'rxjs';
|
|
9
|
-
import { LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe } from './pipes/display-language.pipe';
|
|
10
|
-
import { LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe } from './pipes/get-disable-key.pipe';
|
|
11
|
-
import { currenciesOptions, currenciesSupport, httpRequestDetail, langOptions, languageSupport, listConfigItem, validRequired } from './utils/multi-language';
|
|
12
|
-
import { LibsUiComponentsInputsMultiLanguageGetItemPipe } from './pipes/get-item.pipe';
|
|
13
|
-
import { LibsUiPipesEscapeHtmlPipe } from '@libs-ui/pipes-escape-html';
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
import * as i1 from "@ngx-translate/core";
|
|
16
|
-
export class LibsUiComponentsInputsMultiLanguageComponent {
|
|
17
|
-
/* PROPERTY */
|
|
18
|
-
languageDisplay = signal([]);
|
|
19
|
-
dataLanguageChange = signal({});
|
|
20
|
-
langDefault = signal(languageSupport());
|
|
21
|
-
currencyUnits = signal([]);
|
|
22
|
-
options = signal(langOptions());
|
|
23
|
-
validRequiredDefault = signal(validRequired());
|
|
24
|
-
listConfigItem = computed(() => listConfigItem(this.options()));
|
|
25
|
-
httpRequestDetail = computed(() => httpRequestDetail(this.options()));
|
|
26
|
-
inputFunctionControl = signal(new Map());
|
|
27
|
-
// private quillFunctionControl: Array<IQuillFunctionControl>;
|
|
28
|
-
onDestroy = new Subject();
|
|
29
|
-
/* INPUT */
|
|
30
|
-
zIndex = input();
|
|
31
|
-
viewType = input('text', { transform: value => value ?? 'text' });
|
|
32
|
-
singleLanguage = input();
|
|
33
|
-
data = model([]);
|
|
34
|
-
validRequired = input(validRequired(), { transform: value => value ?? validRequired() });
|
|
35
|
-
ignoreAdd = model();
|
|
36
|
-
titleField = input();
|
|
37
|
-
keyHeader = input();
|
|
38
|
-
textArea = input();
|
|
39
|
-
placeholder = input();
|
|
40
|
-
extendClass = model();
|
|
41
|
-
extendClassContent = input();
|
|
42
|
-
viewPosition = input('row');
|
|
43
|
-
ignoreRemove = input();
|
|
44
|
-
validMaxLength = input({ length: 0 }, { transform: value => value ?? { length: 0 } });
|
|
45
|
-
validMinLength = input();
|
|
46
|
-
countCharacters = input();
|
|
47
|
-
viewContent = input();
|
|
48
|
-
classIncludeKey = input('libs-ui-font-h4r');
|
|
49
|
-
classIncludeValue = input('libs-ui-font-h4s');
|
|
50
|
-
dataLanguage = model({});
|
|
51
|
-
multiLine = input();
|
|
52
|
-
readonly = input();
|
|
53
|
-
acceptNegativeValue = input();
|
|
54
|
-
valueUpDownNumber = input();
|
|
55
|
-
maxValueNumber = input();
|
|
56
|
-
onlyAcceptNegativeValue = input();
|
|
57
|
-
/* OUTPUT */
|
|
58
|
-
outEventMultiLanguage = output();
|
|
59
|
-
outChangeTypeLanguage = output();
|
|
60
|
-
outFunctionsControl = output();
|
|
61
|
-
outChangeValueInput = output();
|
|
62
|
-
constructor() {
|
|
63
|
-
effect(() => {
|
|
64
|
-
const viewType = this.viewType();
|
|
65
|
-
untracked(() => {
|
|
66
|
-
if (viewType === 'integer') {
|
|
67
|
-
this.langDefault.set(currenciesSupport());
|
|
68
|
-
this.options.set(currenciesOptions());
|
|
69
|
-
this.options().forEach(item => {
|
|
70
|
-
this.currencyUnits().push({
|
|
71
|
-
label: item.label,
|
|
72
|
-
id: item.key,
|
|
73
|
-
type: item.label
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
this.currencyUnits.update(value => [...value]);
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
effect(() => {
|
|
81
|
-
untracked(() => {
|
|
82
|
-
const dataLanguage = this.dataLanguage();
|
|
83
|
-
this.dataLanguageChange.set(cloneDeep(dataLanguage));
|
|
84
|
-
this.generateData();
|
|
85
|
-
const optionsSelected = new Set();
|
|
86
|
-
Object.keys(this.dataLanguageChange()).forEach((key) => {
|
|
87
|
-
if (this.options().find(item => item.key === key)) {
|
|
88
|
-
optionsSelected.add(key);
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
if (this.langDefault().length) {
|
|
92
|
-
this.langDefault().forEach((key) => {
|
|
93
|
-
if (!isNil(get(this.dataLanguageChange, key))) {
|
|
94
|
-
optionsSelected.add(key);
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
this.languageDisplay.set(Array.from(optionsSelected));
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
effect(() => {
|
|
102
|
-
const singleLanguage = this.singleLanguage();
|
|
103
|
-
untracked(() => {
|
|
104
|
-
this.outChangeTypeLanguage.emit(true);
|
|
105
|
-
if (!singleLanguage) {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
const key = this.langDefault()[0];
|
|
109
|
-
this.dataLanguage.update(value => ({ ...value, [key]: get(this.dataLanguageChange, key) }));
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
effect(() => {
|
|
113
|
-
const validRequired = this.validRequired();
|
|
114
|
-
untracked(() => {
|
|
115
|
-
if (!validRequired) {
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
this.validRequiredDefault.update(value => ({ ...value, isRequired: validRequired.isRequired }));
|
|
119
|
-
if (!validRequired.isRequired) {
|
|
120
|
-
this.validate();
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
ngOnInit() {
|
|
126
|
-
this.outFunctionsControl.emit({
|
|
127
|
-
checkIsValid: this.validate.bind(this),
|
|
128
|
-
getData: this.getData.bind(this)
|
|
129
|
-
});
|
|
130
|
-
this.extendClass.update(value => `${value || ''} ${this.viewPosition() === 'row' ? 'flex-row' : 'flex-col'}`);
|
|
131
|
-
}
|
|
132
|
-
async handlerInputFunctionControl(event, key) {
|
|
133
|
-
this.inputFunctionControl().set(key, event);
|
|
134
|
-
}
|
|
135
|
-
// protected async handlerFunctionControlEditor(event: IQuillFunctionControl) {
|
|
136
|
-
// this.functionControlEditor.push(event);
|
|
137
|
-
// }
|
|
138
|
-
async handlerSelectChange(event, keyOld) {
|
|
139
|
-
if (!event || event.key === keyOld) {
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
this.languageDisplay.update(value => value.map(item => item === keyOld ? event.key : item));
|
|
143
|
-
delete this.dataLanguageChange()[keyOld];
|
|
144
|
-
delete this.dataLanguage()[keyOld];
|
|
145
|
-
this.setDefaultData(event.key);
|
|
146
|
-
}
|
|
147
|
-
async handlerAddLanguage(event) {
|
|
148
|
-
event.stopPropagation();
|
|
149
|
-
const lang = this.options().find(item => !this.languageDisplay().includes(item.key));
|
|
150
|
-
if (!lang) {
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
this.languageDisplay.update(value => [...value, lang.key]);
|
|
154
|
-
this.setDefaultData(lang.key);
|
|
155
|
-
if (this.options().length === this.languageDisplay().length) {
|
|
156
|
-
this.ignoreAdd.set(true);
|
|
157
|
-
}
|
|
158
|
-
this.outEventMultiLanguage.emit({ action: 'add', data: this.dataLanguageChange() });
|
|
159
|
-
}
|
|
160
|
-
async handlerRemoveLanguage(event, key) {
|
|
161
|
-
event.stopPropagation();
|
|
162
|
-
this.ignoreAdd.set(true);
|
|
163
|
-
this.dataLanguageChange.update(value => {
|
|
164
|
-
delete value[key];
|
|
165
|
-
return { ...value };
|
|
166
|
-
});
|
|
167
|
-
this.validateIsMultiKey();
|
|
168
|
-
this.languageDisplay.update(value => value.filter(item => item !== key));
|
|
169
|
-
this.outEventMultiLanguage.emit({ action: 'remove', data: this.dataLanguageChange() });
|
|
170
|
-
this.inputFunctionControl().delete(key);
|
|
171
|
-
}
|
|
172
|
-
async getData() {
|
|
173
|
-
if (this.singleLanguage()) {
|
|
174
|
-
const key = this.langDefault()[0];
|
|
175
|
-
this.dataLanguage.update(value => ({ ...value, [key]: get(this.dataLanguageChange, key) }));
|
|
176
|
-
return this.dataLanguage();
|
|
177
|
-
}
|
|
178
|
-
if (this.data().length > 1) {
|
|
179
|
-
for (const item of this.data()) {
|
|
180
|
-
const lang = this.langDefault()[0];
|
|
181
|
-
const key = item.keyBindData;
|
|
182
|
-
const dataByKey = key ? get(this.dataLanguageChange, key) : undefined;
|
|
183
|
-
if (key && dataByKey && lang && !get(dataByKey, lang) && !get(this.dataLanguageChange, lang)) {
|
|
184
|
-
return {};
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
return this.dataLanguageChange();
|
|
189
|
-
}
|
|
190
|
-
async generateData() {
|
|
191
|
-
const lang = this.langDefault()[0];
|
|
192
|
-
if (this.data().length) {
|
|
193
|
-
this.data().forEach((item, index) => {
|
|
194
|
-
const key = item.keyBindData;
|
|
195
|
-
if (!index && isNil(get(this.dataLanguageChange, lang))) {
|
|
196
|
-
this.setDefaultData(lang);
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
if (!key || !isNil(get(this.dataLanguageChange, key))) {
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
this.dataLanguageChange.update(value => ({ ...value, [key]: { [lang]: '' } }));
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
if (!this.data().length) {
|
|
206
|
-
if (!this.dataLanguage() || !Object.keys(this.dataLanguage()).length) {
|
|
207
|
-
this.setDefaultData(lang);
|
|
208
|
-
}
|
|
209
|
-
this.data.set([{
|
|
210
|
-
type: this.viewType(),
|
|
211
|
-
placeholder: this.placeholder(),
|
|
212
|
-
isOneValue: false,
|
|
213
|
-
keyBindData: ''
|
|
214
|
-
}]);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
async setDefaultData(key) {
|
|
218
|
-
this.dataLanguageChange.update(value => ({ ...value, [key]: '' }));
|
|
219
|
-
this.dataLanguage.update(value => ({ ...value, [key]: '' }));
|
|
220
|
-
}
|
|
221
|
-
async validate() {
|
|
222
|
-
let valid = true;
|
|
223
|
-
for (const control of this.inputFunctionControl().values()) {
|
|
224
|
-
if (!(await control.checkIsValid())) {
|
|
225
|
-
valid = false;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
// for (const control of this.functionControlEditor.values()) {
|
|
229
|
-
// if (!(await control.valid())) {
|
|
230
|
-
// valid = false;
|
|
231
|
-
// }
|
|
232
|
-
// }
|
|
233
|
-
if (this.singleLanguage()) {
|
|
234
|
-
return valid;
|
|
235
|
-
}
|
|
236
|
-
if (this.data().length === 1) {
|
|
237
|
-
await this.validateDefault();
|
|
238
|
-
}
|
|
239
|
-
this.validateIsMultiKey();
|
|
240
|
-
return valid;
|
|
241
|
-
}
|
|
242
|
-
async validateDefault() {
|
|
243
|
-
let valid = true;
|
|
244
|
-
if (this.validRequired().isRequired) {
|
|
245
|
-
this.validRequiredDefault.update(value => ({ ...value, isRequired: true }));
|
|
246
|
-
if (!(await this.checkValidInput())) {
|
|
247
|
-
valid = false;
|
|
248
|
-
}
|
|
249
|
-
return valid;
|
|
250
|
-
}
|
|
251
|
-
if (Object.keys(this.dataLanguageChange()).length === 1) {
|
|
252
|
-
this.validRequiredDefault.update(value => ({ ...value, isRequired: false }));
|
|
253
|
-
if (!(await this.checkValidInput())) {
|
|
254
|
-
valid = false;
|
|
255
|
-
}
|
|
256
|
-
return valid;
|
|
257
|
-
}
|
|
258
|
-
for (const key of Object.keys(this.dataLanguageChange())) {
|
|
259
|
-
if (key !== 'id' && key !== this.keyHeader() && get(this.dataLanguageChange, key) && key !== this.langDefault()[0]) {
|
|
260
|
-
this.validRequiredDefault.update(value => ({ ...value, isRequired: true }));
|
|
261
|
-
if (!(await this.checkValidInput())) {
|
|
262
|
-
valid = false;
|
|
263
|
-
}
|
|
264
|
-
return;
|
|
265
|
-
}
|
|
266
|
-
this.validRequiredDefault.update(value => ({ ...value, isRequired: false }));
|
|
267
|
-
if (!(await this.checkValidInput())) {
|
|
268
|
-
valid = false;
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
return valid;
|
|
272
|
-
}
|
|
273
|
-
async checkValidInput() {
|
|
274
|
-
let valid = true;
|
|
275
|
-
for (const control of this.inputFunctionControl().values()) {
|
|
276
|
-
if (!(await control.checkIsValid())) {
|
|
277
|
-
valid = false;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
return valid;
|
|
281
|
-
}
|
|
282
|
-
async validateIsMultiKey() {
|
|
283
|
-
if (this.data().length > 1) {
|
|
284
|
-
if (this.data()[0].validRequired?.isRequired) {
|
|
285
|
-
return;
|
|
286
|
-
}
|
|
287
|
-
this.data().forEach((item) => {
|
|
288
|
-
if (!item.keyBindData) {
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
Object.keys(get(this.dataLanguageChange, item.keyBindData)).forEach(async (keyBind) => {
|
|
292
|
-
for (const key of Object.keys(this.dataLanguageChange())) {
|
|
293
|
-
if (key === item.keyBindData || key === keyBind) {
|
|
294
|
-
continue;
|
|
295
|
-
}
|
|
296
|
-
if (get(this.dataLanguageChange, key) && this.options().find(item => item.key === key)) {
|
|
297
|
-
this.data().forEach(async (config) => {
|
|
298
|
-
if (config && config.validRequiredLangDefault) {
|
|
299
|
-
config.validRequiredLangDefault.isRequired = true;
|
|
300
|
-
await this.checkValidInput();
|
|
301
|
-
}
|
|
302
|
-
});
|
|
303
|
-
return;
|
|
304
|
-
}
|
|
305
|
-
this.data().forEach(async (config) => {
|
|
306
|
-
if (config && config.validRequiredLangDefault) {
|
|
307
|
-
config.validRequiredLangDefault.isRequired = false;
|
|
308
|
-
await this.checkValidInput();
|
|
309
|
-
}
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
const dataLanguageChangeByKeyBind = get(this.dataLanguageChange, keyBind);
|
|
313
|
-
const dataLanguageChangeByKeyBindData = item.keyBindData ? get(this.dataLanguageChange, item.keyBindData) : undefined;
|
|
314
|
-
if ((!dataLanguageChangeByKeyBind && !get(dataLanguageChangeByKeyBindData, keyBind)) || (dataLanguageChangeByKeyBind && get(dataLanguageChangeByKeyBindData, keyBind))) {
|
|
315
|
-
return;
|
|
316
|
-
}
|
|
317
|
-
if (!dataLanguageChangeByKeyBind) {
|
|
318
|
-
const dataFirst = this.data()[0];
|
|
319
|
-
if (dataFirst && dataFirst.validRequiredLangDefault) {
|
|
320
|
-
dataFirst.validRequiredLangDefault.isRequired = true;
|
|
321
|
-
await this.checkValidInput();
|
|
322
|
-
}
|
|
323
|
-
return;
|
|
324
|
-
}
|
|
325
|
-
if (!get(dataLanguageChangeByKeyBindData, keyBind)) {
|
|
326
|
-
const dataSecond = this.data()[1];
|
|
327
|
-
if (dataSecond && dataSecond.validRequiredLangDefault) {
|
|
328
|
-
dataSecond.validRequiredLangDefault.isRequired = true;
|
|
329
|
-
await this.checkValidInput();
|
|
330
|
-
}
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
});
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
async handlerInputChange() {
|
|
338
|
-
this.outChangeValueInput.emit();
|
|
339
|
-
timer(500).pipe(takeUntil(this.onDestroy)).subscribe(() => this.validate());
|
|
340
|
-
}
|
|
341
|
-
ngOnDestroy() {
|
|
342
|
-
this.onDestroy.next();
|
|
343
|
-
this.onDestroy.complete();
|
|
344
|
-
}
|
|
345
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsInputsMultiLanguageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
346
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: LibsUiComponentsInputsMultiLanguageComponent, isStandalone: true, selector: "libs_ui-components-inputs-multi_language", inputs: { zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, viewType: { classPropertyName: "viewType", publicName: "viewType", isSignal: true, isRequired: false, transformFunction: null }, singleLanguage: { classPropertyName: "singleLanguage", publicName: "singleLanguage", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, ignoreAdd: { classPropertyName: "ignoreAdd", publicName: "ignoreAdd", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: "titleField", publicName: "titleField", isSignal: true, isRequired: false, transformFunction: null }, keyHeader: { classPropertyName: "keyHeader", publicName: "keyHeader", isSignal: true, isRequired: false, transformFunction: null }, textArea: { classPropertyName: "textArea", publicName: "textArea", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, extendClass: { classPropertyName: "extendClass", publicName: "extendClass", isSignal: true, isRequired: false, transformFunction: null }, extendClassContent: { classPropertyName: "extendClassContent", publicName: "extendClassContent", isSignal: true, isRequired: false, transformFunction: null }, viewPosition: { classPropertyName: "viewPosition", publicName: "viewPosition", isSignal: true, isRequired: false, transformFunction: null }, ignoreRemove: { classPropertyName: "ignoreRemove", publicName: "ignoreRemove", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, countCharacters: { classPropertyName: "countCharacters", publicName: "countCharacters", isSignal: true, isRequired: false, transformFunction: null }, viewContent: { classPropertyName: "viewContent", publicName: "viewContent", isSignal: true, isRequired: false, transformFunction: null }, classIncludeKey: { classPropertyName: "classIncludeKey", publicName: "classIncludeKey", isSignal: true, isRequired: false, transformFunction: null }, classIncludeValue: { classPropertyName: "classIncludeValue", publicName: "classIncludeValue", isSignal: true, isRequired: false, transformFunction: null }, dataLanguage: { classPropertyName: "dataLanguage", publicName: "dataLanguage", isSignal: true, isRequired: false, transformFunction: null }, multiLine: { classPropertyName: "multiLine", publicName: "multiLine", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { data: "dataChange", ignoreAdd: "ignoreAddChange", extendClass: "extendClassChange", dataLanguage: "dataLanguageChange", outEventMultiLanguage: "outEventMultiLanguage", outChangeTypeLanguage: "outChangeTypeLanguage", outFunctionsControl: "outFunctionsControl", outChangeValueInput: "outChangeValueInput" }, ngImport: i0, template: "<div class=\"w-full\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m mb-[4px]\"> {{ titleField | translate }}</div>\n }\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div [class.mt-[4px]]=\"!$first\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[8px]]=\"countCharacters() && !$first\">\n <div class=\"flex {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe:key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex relative p-0 {{ extendClassContent() }}\"\n [class.w-[calc(100%-150px)]]=\"!textArea() && !singleLanguage() && viewPosition() === 'row'\"\n [class.w-full]=\"textArea() || singleLanguage() || viewPosition() === 'column'\">\n @for (item of data(); track item) {\n @if (item.type !== 'editor' && !item.isOneValue || (item.isOneValue && $first)) {\n <div class=\"relative {{ item.classIncludeInput }}\"\n [class.w-full]=\"singleLanguage() && !multiLine() || readonly() || $first\"\n [class.w-[calc(100%-28px)]]=\"textArea() || (!singleLanguage() && multiLine())\"\n [class.w-[calc(100%-40px)]]=\"!textArea() && !singleLanguage() && !multiLine() && !readonly()\"\n [class.w-[calc(100%-70px)]]=\"!textArea() && !singleLanguage() && multiLine()\"\n [class.mt-[8px]]=\"viewPosition() === 'column'\"\n [class.ml-[12px]]=\"!singleLanguage() && !textArea() && viewPosition() === 'row'\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe:dataLanguageChange; as itemMap) {\n <libs_ui-components-inputs-valid [dataType]=\"item.type === 'number' ? 'int' : (item.type === 'text' ? 'string' : (item.type === 'bigint' ? 'bigint' : 'float'))\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [labelConfig]=\"countCharacters() ? { classInclude: 'absolute -top-[20px]', required: true} : undefined\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"item.placeholder\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"($index === 0 && data().length <= 1) ? validRequiredDefault() : \n ($index === 0 && data().length > 1 && item.validRequiredLangDefault) ? item.validRequiredLangDefault : item.validRequired ? item.validRequired : (validRequired() || { isRequired: false })\"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength.length ? validMaxLength.length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"{length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: {number: validMinLength()?.length}}\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event, key)\" />\n }\n </div>\n }\n @if (item.type === 'editor') {\n <div class=\"w-[calc(100%-28px)]\">\n <div class=\"h-[250px]\">\n <!-- <mo-libs-core_ui-components-quill [item]=\"item.keyBindData ? dataLanguageChange[item.keyBindData] : dataLanguageChange\"\n [fieldNameBind]=\"key\"\n [validRequired]=\"(i === 0 && configDatas.length <= 1) ? validRequiredLangDefault : validRequiredName\"\n [placeholder]=\"(item.placeholder || '' | translate)\"\n [readonly]=\"readonly\"\n (moFocus)=\"handlerInputChange()\"\n (moChange)=\"handlerInputChange()\"\n (moFunctionsControl)=\"handlerFunctionControlEditor($event)\">\n </mo-libs-core_ui-components-quill> -->\n </div>\n </div>\n }\n }\n @if (($index > 0 && data().length === 1) && !ignoreRemove() && !readonly()) {\n <div class=\"h-[32px] flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631'\n },\n rootColor: '#071631'\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{config: {content: 'i18n_delete', zIndex: 1205}}\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n </div>\n }\n </div>\n </div>\n @if ($index === 0 && !singleLanguage() && (options().length !== languageDisplay().length) && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [label]=\"'i18n_add_language'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classInclude]=\"'!px-0 mt-[8px]'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex\">\n @if (singleLanguage()) {\n <div class=\"flex\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe:options()\" />\n </div>\n }\n <div class=\"w-[calc(100%-100px)]\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.flex]=\"!singleLanguage || $first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"((dataLanguageChange()[key] || dataLanguageChange()[key] === 0) ? (dataLanguageChange()[key] + '') : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{zIndex: zIndex()}\" />\n </div>\n </div>\n }\n }\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button type=\"button-link-primary\"\n [classIconLeft]=\"'libs-ui-icon-add mr-[8px] text-[10px]'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [classInclude]=\"'!pb-0'\"\n [label]=\"'i18n_add_currency'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "hiddenContent", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe, name: "LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe, name: "LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetItemPipe, name: "LibsUiComponentsInputsMultiLanguageGetItemPipe" }, { kind: "pipe", type: LibsUiPipesEscapeHtmlPipe, name: "LibsUiPipesEscapeHtmlPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
347
|
-
}
|
|
348
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsInputsMultiLanguageComponent, decorators: [{
|
|
349
|
-
type: Component,
|
|
350
|
-
args: [{ selector: 'libs_ui-components-inputs-multi_language', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
351
|
-
TranslateModule,
|
|
352
|
-
LibsUiComponentsDropdownComponent,
|
|
353
|
-
LibsUiComponentsInputsValidComponent,
|
|
354
|
-
LibsUiComponentsButtonsButtonComponent,
|
|
355
|
-
LibsUiComponentsPopoverComponent,
|
|
356
|
-
LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe,
|
|
357
|
-
LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe,
|
|
358
|
-
LibsUiComponentsInputsMultiLanguageGetItemPipe,
|
|
359
|
-
LibsUiPipesEscapeHtmlPipe
|
|
360
|
-
], template: "<div class=\"w-full\">\n @if (titleField(); as titleField) {\n <div class=\"libs-ui-font-h6m mb-[4px]\"> {{ titleField | translate }}</div>\n }\n @for (key of languageDisplay(); track key) {\n @if (!viewContent()) {\n <div [class.mt-[4px]]=\"!$first\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[8px]]=\"countCharacters() && !$first\">\n <div class=\"flex {{ extendClass() }}\">\n @if (!singleLanguage()) {\n <div>\n <libs_ui-components-dropdown [listConfig]=\"listConfigItem()\"\n [httpRequestDetailItemById]=\"httpRequestDetail()\"\n [listKeysDisable]=\"languageDisplay() | LibsUiComponentsInputsMultiLanguageGetDisableKeyPipe:key\"\n [readonly]=\"$index === 0 || readonly()\"\n [listKeySelected]=\"key\"\n [zIndex]=\"zIndex()\"\n [classInclude]=\"'w-[150px]'\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectChange($event, key)\" />\n </div>\n }\n <div class=\"flex relative p-0 {{ extendClassContent() }}\"\n [class.w-[calc(100%-150px)]]=\"!textArea() && !singleLanguage() && viewPosition() === 'row'\"\n [class.w-full]=\"textArea() || singleLanguage() || viewPosition() === 'column'\">\n @for (item of data(); track item) {\n @if (item.type !== 'editor' && !item.isOneValue || (item.isOneValue && $first)) {\n <div class=\"relative {{ item.classIncludeInput }}\"\n [class.w-full]=\"singleLanguage() && !multiLine() || readonly() || $first\"\n [class.w-[calc(100%-28px)]]=\"textArea() || (!singleLanguage() && multiLine())\"\n [class.w-[calc(100%-40px)]]=\"!textArea() && !singleLanguage() && !multiLine() && !readonly()\"\n [class.w-[calc(100%-70px)]]=\"!textArea() && !singleLanguage() && multiLine()\"\n [class.mt-[8px]]=\"viewPosition() === 'column'\"\n [class.ml-[12px]]=\"!singleLanguage() && !textArea() && viewPosition() === 'row'\">\n @if (item.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe:dataLanguageChange; as itemMap) {\n <libs_ui-components-inputs-valid [dataType]=\"item.type === 'number' ? 'int' : (item.type === 'text' ? 'string' : (item.type === 'bigint' ? 'bigint' : 'float'))\"\n [(item)]=\"itemMap\"\n [fieldNameBind]=\"key\"\n [labelConfig]=\"countCharacters() ? { classInclude: 'absolute -top-[20px]', required: true} : undefined\"\n [tagInput]=\"textArea() ? 'textarea' : 'input'\"\n [placeholder]=\"item.placeholder\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"($index === 0 && data().length <= 1) ? validRequiredDefault() : \n ($index === 0 && data().length > 1 && item.validRequiredLangDefault) ? item.validRequiredLangDefault : item.validRequired ? item.validRequired : (validRequired() || { isRequired: false })\"\n [unitsRight]=\"currencyUnits()\"\n [keySelectedUnitRight]=\"key\"\n [readonly]=\"readonly()\"\n [showCount]=\"countCharacters()\"\n [maxLength]=\"validMaxLength.length ? validMaxLength.length : undefined\"\n [fixedFloat]=\"item.type === 'bigint' ? 4 : 14\"\n [validMinLength]=\"{length: validMinLength()?.length || -1, message: 'i18n_minimum_length_number', interpolateParams: {number: validMinLength()?.length}}\"\n [acceptNegativeValue]=\"acceptNegativeValue()\"\n [valueUpDownNumber]=\"valueUpDownNumber()\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n (outValueChange)=\"handlerInputChange()\"\n (outFunctionsControl)=\"handlerInputFunctionControl($event, key)\" />\n }\n </div>\n }\n @if (item.type === 'editor') {\n <div class=\"w-[calc(100%-28px)]\">\n <div class=\"h-[250px]\">\n <!-- <mo-libs-core_ui-components-quill [item]=\"item.keyBindData ? dataLanguageChange[item.keyBindData] : dataLanguageChange\"\n [fieldNameBind]=\"key\"\n [validRequired]=\"(i === 0 && configDatas.length <= 1) ? validRequiredLangDefault : validRequiredName\"\n [placeholder]=\"(item.placeholder || '' | translate)\"\n [readonly]=\"readonly\"\n (moFocus)=\"handlerInputChange()\"\n (moChange)=\"handlerInputChange()\"\n (moFunctionsControl)=\"handlerFunctionControlEditor($event)\">\n </mo-libs-core_ui-components-quill> -->\n </div>\n </div>\n }\n }\n @if (($index > 0 && data().length === 1) && !ignoreRemove() && !readonly()) {\n <div class=\"h-[32px] flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631'\n },\n rootColor: '#071631'\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{config: {content: 'i18n_delete', zIndex: 1205}}\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerRemoveLanguage($event, key)\" />\n </div>\n }\n </div>\n </div>\n @if ($index === 0 && !singleLanguage() && (options().length !== languageDisplay().length) && viewType() !== 'integer' && !readonly()) {\n <libs_ui-components-buttons-button [type]=\"'button-link-primary'\"\n [label]=\"'i18n_add_language'\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n [classInclude]=\"'!px-0 mt-[8px]'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n </div>\n }\n @if (viewContent()) {\n <div class=\"flex\">\n @if (singleLanguage()) {\n <div class=\"flex\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"classIncludeKey()\"\n [innerHTML]=\"key | LibsUiComponentsInputsMultiLanguageDisplayLanguagePipe:options()\" />\n </div>\n }\n <div class=\"w-[calc(100%-100px)]\"\n [class.hidden]=\"singleLanguage() && !$first\"\n [class.flex]=\"!singleLanguage || $first\"\n [class.mt-[4px]]=\"!singleLanguage() && !$first\">\n <libs_ui-components-popover [type]=\"'text'\"\n [classInclude]=\"classIncludeValue()\"\n [innerHTML]=\"((dataLanguageChange()[key] || dataLanguageChange()[key] === 0) ? (dataLanguageChange()[key] + '') : '') | LibsUiPipesEscapeHtmlPipe\"\n [config]=\"{zIndex: zIndex()}\" />\n </div>\n </div>\n }\n }\n @if (viewType() === 'integer' && !this.ignoreAdd() && !readonly()) {\n <libs_ui-components-buttons-button type=\"button-link-primary\"\n [classIconLeft]=\"'libs-ui-icon-add mr-[8px] text-[10px]'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [classInclude]=\"'!pb-0'\"\n [label]=\"'i18n_add_currency'\"\n (outClick)=\"handlerAddLanguage($event)\" />\n }\n</div>\n" }]
|
|
361
|
-
}], ctorParameters: () => [] });
|
|
362
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRzLW11bHRpLWxhbmd1YWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvbXVsdGktbGFuZ3VhZ2Uvc3JjL2lucHV0cy1tdWx0aS1sYW5ndWFnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL211bHRpLWxhbmd1YWdlL3NyYy9pbnB1dHMtbXVsdGktbGFuZ3VhZ2UuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pKLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBa0IsaUNBQWlDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRyxPQUFPLEVBQWlFLG9DQUFvQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkosT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVqRCxPQUFPLEVBQUUsc0RBQXNELEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RyxPQUFPLEVBQUUsb0RBQW9ELEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUs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Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRVMsS0FBSyxDQUFDLGtCQUFrQjtRQUNoQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7d0dBL1ZVLDRDQUE0Qzs0RkFBNUMsNENBQTRDLHVxSUNqQ3pELHk2UEEySUEsMkNEckhJLGVBQWUsNEZBQ2YsaUNBQWlDLG16REFDakMsb0NBQW9DLHF6REFDcEMsc0NBQXNDLGloQkFDdEMsZ0NBQWdDLGdlQUNoQyxvREFBb0Qsd0ZBQ3BELHNEQUFzRCwwRkFDdEQsOENBQThDLGtGQUM5Qyx5QkFBeUI7OzRGQUdoQiw0Q0FBNEM7a0JBbEJ4RCxTQUFTOytCQUVFLDBDQUEwQyxjQUV4QyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ1AsZUFBZTt3QkFDZixpQ0FBaUM7d0JBQ2pDLG9DQUFvQzt3QkFDcEMsc0NBQXNDO3dCQUN0QyxnQ0FBZ0M7d0JBQ2hDLG9EQUFvRDt3QkFDcEQsc0RBQXNEO3dCQUN0RCw4Q0FBOEM7d0JBQzlDLHlCQUF5QjtxQkFDMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgZWZmZWN0LCBpbnB1dCwgbW9kZWwsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSUlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2xFdmVudCwgSVZhbGlkTGVuZ3RoLCBJVmFsaWRSZXF1aXJlZCwgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtdmFsaWQnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXBvcG92ZXInO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBnZXQsIGlzTmlsIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQ3VycmVuY3lVbml0LCBJRGF0YUl0ZW0sIElEYXRhTXVsdGlMYW5ndWFnZSwgSUV2ZW50TXVsdGlMYW5ndWFnZSwgSUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJT3B0aW9uLCBUWVBFX1ZJRVdfTVVMVElfTEFOR1VBR0UgfSBmcm9tICcuL2ludGVyZmFjZXMvbXVsdGktbGFuZ3VhZ2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlRGlzcGxheUxhbmd1YWdlUGlwZSB9IGZyb20gJy4vcGlwZXMvZGlzcGxheS1sYW5ndWFnZS5waXBlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlR2V0RGlzYWJsZUtleVBpcGUgfSBmcm9tICcuL3BpcGVzL2dldC1kaXNhYmxlLWtleS5waXBlJztcbmltcG9ydCB7IGN1cnJlbmNpZXNPcHRpb25zLCBjdXJyZW5jaWVzU3VwcG9ydCwgaHR0cFJlcXVlc3REZXRhaWwsIGxhbmdPcHRpb25zLCBsYW5ndWFnZVN1cHBvcnQsIGxpc3RDb25maWdJdGVtLCB2YWxpZFJlcXVpcmVkIH0gZnJvbSAnLi91dGlscy9tdWx0aS1sYW5ndWFnZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldEl0ZW1QaXBlIH0gZnJvbSAnLi9waXBlcy9nZXQtaXRlbS5waXBlJztcbmltcG9ydCB7IExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGUgfSBmcm9tICdAbGlicy11aS9waXBlcy1lc2NhcGUtaHRtbCc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtbXVsdGlfbGFuZ3VhZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW5wdXRzLW11bHRpLWxhbmd1YWdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTGlic1VpQ29tcG9uZW50c0Ryb3Bkb3duQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNWYWxpZENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldERpc2FibGVLZXlQaXBlLFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNNdWx0aUxhbmd1YWdlRGlzcGxheUxhbmd1YWdlUGlwZSxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldEl0ZW1QaXBlLFxuICAgIExpYnNVaVBpcGVzRXNjYXBlSHRtbFBpcGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvKiBQUk9QRVJUWSAqL1xuICBwcm90ZWN0ZWQgbGFuZ3VhZ2VEaXNwbGF5ID0gc2lnbmFsPEFycmF5PHN0cmluZz4+KFtdKTtcbiAgcHJvdGVjdGVkIGRhdGFMYW5ndWFnZUNoYW5nZSA9IHNpZ25hbDxJRGF0YU11bHRpTGFuZ3VhZ2U+KHt9KTtcbiAgcHJvdGVjdGVkIGxhbmdEZWZhdWx0ID0gc2lnbmFsPEFycmF5PHN0cmluZz4+KGxhbmd1YWdlU3VwcG9ydCgpKTtcbiAgcHJvdGVjdGVkIGN1cnJlbmN5VW5pdHMgPSBzaWduYWw8QXJyYXk8SUN1cnJlbmN5VW5pdD4+KFtdKTtcbiAgcHJvdGVjdGVkIG9wdGlvbnMgPSBzaWduYWw8QXJyYXk8SU9wdGlvbj4+KGxhbmdPcHRpb25zKCkpO1xuICBwcm90ZWN0ZWQgdmFsaWRSZXF1aXJlZERlZmF1bHQgPSBzaWduYWw8SVZhbGlkUmVxdWlyZWQ+KHZhbGlkUmVxdWlyZWQoKSk7XG4gIHByb3RlY3RlZCBsaXN0Q29uZmlnSXRlbSA9IGNvbXB1dGVkKCgpID0+IGxpc3RDb25maWdJdGVtKHRoaXMub3B0aW9ucygpKSk7XG4gIHByb3RlY3RlZCBodHRwUmVxdWVzdERldGFpbCA9IGNvbXB1dGVkKCgpID0+IGh0dHBSZXF1ZXN0RGV0YWlsKHRoaXMub3B0aW9ucygpKSk7XG5cbiAgcHJpdmF0ZSBpbnB1dEZ1bmN0aW9uQ29udHJvbCA9IHNpZ25hbDxNYXA8c3RyaW5nLCBJSW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbEV2ZW50Pj4obmV3IE1hcCgpKTtcbiAgLy8gcHJpdmF0ZSBxdWlsbEZ1bmN0aW9uQ29udHJvbDogQXJyYXk8SVF1aWxsRnVuY3Rpb25Db250cm9sPjtcbiAgcHJpdmF0ZSBvbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qIElOUFVUICovXG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgdmlld1R5cGUgPSBpbnB1dDxUWVBFX1ZJRVdfTVVMVElfTEFOR1VBR0UsIFRZUEVfVklFV19NVUxUSV9MQU5HVUFHRSB8IHVuZGVmaW5lZD4oJ3RleHQnLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gJ3RleHQnIH0pO1xuICByZWFkb25seSBzaW5nbGVMYW5ndWFnZSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGRhdGEgPSBtb2RlbDxBcnJheTxJRGF0YUl0ZW0+PihbXSk7XG4gIHJlYWRvbmx5IHZhbGlkUmVxdWlyZWQgPSBpbnB1dDxJVmFsaWRSZXF1aXJlZCwgSVZhbGlkUmVxdWlyZWQgfCB1bmRlZmluZWQ+KHZhbGlkUmVxdWlyZWQoKSwgeyB0cmFuc2Zvcm06IHZhbHVlID0+IHZhbHVlID8/IHZhbGlkUmVxdWlyZWQoKSB9KVxuICByZWFkb25seSBpZ25vcmVBZGQgPSBtb2RlbDxib29sZWFuPigpO1xuICByZWFkb25seSB0aXRsZUZpZWxkID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBrZXlIZWFkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHRleHRBcmVhID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGV4dGVuZENsYXNzID0gbW9kZWw8c3RyaW5nPigpO1xuICByZWFkb25seSBleHRlbmRDbGFzc0NvbnRlbnQgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHZpZXdQb3NpdGlvbiA9IGlucHV0PCdyb3cnIHwgJ2NvbHVtbic+KCdyb3cnKTtcbiAgcmVhZG9ubHkgaWdub3JlUmVtb3ZlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmFsaWRNYXhMZW5ndGggPSBpbnB1dDxJVmFsaWRMZW5ndGgsIElWYWxpZExlbmd0aCB8IHVuZGVmaW5lZD4oeyBsZW5ndGg6IDAgfSwgeyB0cmFuc2Zvcm06IHZhbHVlID0+IHZhbHVlID8/IHsgbGVuZ3RoOiAwIH0gfSk7XG4gIHJlYWRvbmx5IHZhbGlkTWluTGVuZ3RoID0gaW5wdXQ8SVZhbGlkTGVuZ3RoPigpO1xuICByZWFkb25seSBjb3VudENoYXJhY3RlcnMgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB2aWV3Q29udGVudCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGNsYXNzSW5jbHVkZUtleSA9IGlucHV0PHN0cmluZz4oJ2xpYnMtdWktZm9udC1oNHInKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlVmFsdWUgPSBpbnB1dDxzdHJpbmc+KCdsaWJzLXVpLWZvbnQtaDRzJyk7XG4gIHJlYWRvbmx5IGRhdGFMYW5ndWFnZSA9IG1vZGVsPElEYXRhTXVsdGlMYW5ndWFnZT4oe30pO1xuICByZWFkb25seSBtdWx0aUxpbmUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSByZWFkb25seSA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGFjY2VwdE5lZ2F0aXZlVmFsdWUgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSB2YWx1ZVVwRG93bk51bWJlciA9IGlucHV0PG51bWJlcj4oKTtcbiAgcmVhZG9ubHkgbWF4VmFsdWVOdW1iZXIgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG9ubHlBY2NlcHROZWdhdGl2ZVZhbHVlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvKiBPVVRQVVQgKi9cbiAgcmVhZG9ubHkgb3V0RXZlbnRNdWx0aUxhbmd1YWdlID0gb3V0cHV0PElFdmVudE11bHRpTGFuZ3VhZ2U+KCk7XG4gIHJlYWRvbmx5IG91dENoYW5nZVR5cGVMYW5ndWFnZSA9IG91dHB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElJbnB1dE11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVmFsdWVJbnB1dCA9IG91dHB1dDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB2aWV3VHlwZSA9IHRoaXMudmlld1R5cGUoKTtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGlmICh2aWV3VHlwZSA9PT0gJ2ludGVnZXInKSB7XG4gICAgICAgICAgdGhpcy5sYW5nRGVmYXVsdC5zZXQoY3VycmVuY2llc1N1cHBvcnQoKSk7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLnNldChjdXJyZW5jaWVzT3B0aW9ucygpKTtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMoKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW5jeVVuaXRzKCkucHVzaCh7XG4gICAgICAgICAgICAgIGxhYmVsOiBpdGVtLmxhYmVsLFxuICAgICAgICAgICAgICBpZDogaXRlbS5rZXksXG4gICAgICAgICAgICAgIHR5cGU6IGl0ZW0ubGFiZWxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuY3VycmVuY3lVbml0cy51cGRhdGUodmFsdWUgPT4gWy4uLnZhbHVlXSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhTGFuZ3VhZ2UgPSB0aGlzLmRhdGFMYW5ndWFnZSgpO1xuICAgICAgICB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZS5zZXQoY2xvbmVEZWVwKGRhdGFMYW5ndWFnZSkpO1xuICAgICAgICB0aGlzLmdlbmVyYXRlRGF0YSgpO1xuICAgICAgICBjb25zdCBvcHRpb25zU2VsZWN0ZWQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zKCkuZmluZChpdGVtID0+IGl0ZW0ua2V5ID09PSBrZXkpKSB7XG4gICAgICAgICAgICBvcHRpb25zU2VsZWN0ZWQuYWRkKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMubGFuZ0RlZmF1bHQoKS5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmxhbmdEZWZhdWx0KCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzTmlsKGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwga2V5KSkpIHtcbiAgICAgICAgICAgICAgb3B0aW9uc1NlbGVjdGVkLmFkZChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFuZ3VhZ2VEaXNwbGF5LnNldChBcnJheS5mcm9tKG9wdGlvbnNTZWxlY3RlZCkpO1xuICAgICAgfSlcbiAgICB9KVxuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHNpbmdsZUxhbmd1YWdlID0gdGhpcy5zaW5nbGVMYW5ndWFnZSgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgdGhpcy5vdXRDaGFuZ2VUeXBlTGFuZ3VhZ2UuZW1pdCh0cnVlKTtcbiAgICAgICAgaWYgKCFzaW5nbGVMYW5ndWFnZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmxhbmdEZWZhdWx0KClbMF07XG4gICAgICAgIHRoaXMuZGF0YUxhbmd1YWdlLnVwZGF0ZSh2YWx1ZSA9PiAoeyAuLi52YWx1ZSwgW2tleV06IGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwga2V5KSB9KSk7XG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgdmFsaWRSZXF1aXJlZCA9IHRoaXMudmFsaWRSZXF1aXJlZCgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKCF2YWxpZFJlcXVpcmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWRSZXF1aXJlZERlZmF1bHQudXBkYXRlKHZhbHVlID0+ICh7IC4uLnZhbHVlLCBpc1JlcXVpcmVkOiB2YWxpZFJlcXVpcmVkLmlzUmVxdWlyZWQgfSkpXG4gICAgICAgIGlmICghdmFsaWRSZXF1aXJlZC5pc1JlcXVpcmVkKSB7XG4gICAgICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm91dEZ1bmN0aW9uc0NvbnRyb2wuZW1pdCh7XG4gICAgICBjaGVja0lzVmFsaWQ6IHRoaXMudmFsaWRhdGUuYmluZCh0aGlzKSxcbiAgICAgIGdldERhdGE6IHRoaXMuZ2V0RGF0YS5iaW5kKHRoaXMpXG4gICAgfSk7XG4gICAgdGhpcy5leHRlbmRDbGFzcy51cGRhdGUodmFsdWUgPT4gYCR7dmFsdWUgfHwgJyd9ICR7dGhpcy52aWV3UG9zaXRpb24oKSA9PT0gJ3JvdycgPyAnZmxleC1yb3cnIDogJ2ZsZXgtY29sJ31gKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVySW5wdXRGdW5jdGlvbkNvbnRyb2woZXZlbnQ6IElJbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sRXZlbnQsIGtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5pbnB1dEZ1bmN0aW9uQ29udHJvbCgpLnNldChrZXksIGV2ZW50KTtcbiAgfVxuXG4gIC8vIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRnVuY3Rpb25Db250cm9sRWRpdG9yKGV2ZW50OiBJUXVpbGxGdW5jdGlvbkNvbnRyb2wpIHtcbiAgLy8gICB0aGlzLmZ1bmN0aW9uQ29udHJvbEVkaXRvci5wdXNoKGV2ZW50KTtcbiAgLy8gfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0Q2hhbmdlKGV2ZW50OiBJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZCwga2V5T2xkOiBzdHJpbmcpIHtcbiAgICBpZiAoIWV2ZW50IHx8IGV2ZW50LmtleSA9PT0ga2V5T2xkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubGFuZ3VhZ2VEaXNwbGF5LnVwZGF0ZSh2YWx1ZSA9PiB2YWx1ZS5tYXAoaXRlbSA9PiBpdGVtID09PSBrZXlPbGQgPyBldmVudC5rZXkgYXMgc3RyaW5nIDogaXRlbSkpXG4gICAgZGVsZXRlIHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKClba2V5T2xkXTtcbiAgICBkZWxldGUgdGhpcy5kYXRhTGFuZ3VhZ2UoKVtrZXlPbGRdO1xuICAgIHRoaXMuc2V0RGVmYXVsdERhdGEoZXZlbnQua2V5IGFzIHN0cmluZyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckFkZExhbmd1YWdlKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGxhbmcgPSB0aGlzLm9wdGlvbnMoKS5maW5kKGl0ZW0gPT4gIXRoaXMubGFuZ3VhZ2VEaXNwbGF5KCkuaW5jbHVkZXMoaXRlbS5rZXkpKTtcbiAgICBpZiAoIWxhbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYW5ndWFnZURpc3BsYXkudXBkYXRlKHZhbHVlID0+IFsuLi52YWx1ZSwgbGFuZy5rZXldKTtcbiAgICB0aGlzLnNldERlZmF1bHREYXRhKGxhbmcua2V5KTtcbiAgICBpZiAodGhpcy5vcHRpb25zKCkubGVuZ3RoID09PSB0aGlzLmxhbmd1YWdlRGlzcGxheSgpLmxlbmd0aCkge1xuICAgICAgdGhpcy5pZ25vcmVBZGQuc2V0KHRydWUpO1xuICAgIH1cbiAgICB0aGlzLm91dEV2ZW50TXVsdGlMYW5ndWFnZS5lbWl0KHsgYWN0aW9uOiAnYWRkJywgZGF0YTogdGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UoKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUmVtb3ZlTGFuZ3VhZ2UoZXZlbnQ6IEV2ZW50LCBrZXk6IHN0cmluZykge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaWdub3JlQWRkLnNldCh0cnVlKTtcbiAgICB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZS51cGRhdGUodmFsdWUgPT4ge1xuICAgICAgZGVsZXRlIHZhbHVlW2tleV07XG4gICAgICByZXR1cm4geyAuLi52YWx1ZSB9O1xuICAgIH0pXG4gICAgdGhpcy52YWxpZGF0ZUlzTXVsdGlLZXkoKTtcbiAgICB0aGlzLmxhbmd1YWdlRGlzcGxheS51cGRhdGUodmFsdWUgPT4gdmFsdWUuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0ga2V5KSk7XG4gICAgdGhpcy5vdXRFdmVudE11bHRpTGFuZ3VhZ2UuZW1pdCh7IGFjdGlvbjogJ3JlbW92ZScsIGRhdGE6IHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkgfSk7XG4gICAgdGhpcy5pbnB1dEZ1bmN0aW9uQ29udHJvbCgpLmRlbGV0ZShrZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXREYXRhKCkge1xuICAgIGlmICh0aGlzLnNpbmdsZUxhbmd1YWdlKCkpIHtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMubGFuZ0RlZmF1bHQoKVswXTtcbiAgICAgIHRoaXMuZGF0YUxhbmd1YWdlLnVwZGF0ZSh2YWx1ZSA9PiAoeyAuLi52YWx1ZSwgW2tleV06IGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwga2V5KSB9KSk7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhTGFuZ3VhZ2UoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YSgpLmxlbmd0aCA+IDEpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmRhdGEoKSkge1xuICAgICAgICBjb25zdCBsYW5nID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgICAgICBjb25zdCBrZXkgPSBpdGVtLmtleUJpbmREYXRhO1xuICAgICAgICBjb25zdCBkYXRhQnlLZXkgPSBrZXkgPyBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGtleSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChrZXkgJiYgZGF0YUJ5S2V5ICYmIGxhbmcgJiYgIWdldChkYXRhQnlLZXksIGxhbmcpICYmICFnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGxhbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlRGF0YSgpIHtcbiAgICBjb25zdCBsYW5nID0gdGhpcy5sYW5nRGVmYXVsdCgpWzBdO1xuICAgIGlmICh0aGlzLmRhdGEoKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZGF0YSgpLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGl0ZW0ua2V5QmluZERhdGE7XG4gICAgICAgIGlmICghaW5kZXggJiYgaXNOaWwoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBsYW5nKSkpIHtcbiAgICAgICAgICB0aGlzLnNldERlZmF1bHREYXRhKGxhbmcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWtleSB8fCAhaXNOaWwoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXkpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZS51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIFtrZXldOiB7IFtsYW5nXTogJycgfSB9KSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmRhdGEoKS5sZW5ndGgpIHtcbiAgICAgIGlmICghdGhpcy5kYXRhTGFuZ3VhZ2UoKSB8fCAhT2JqZWN0LmtleXModGhpcy5kYXRhTGFuZ3VhZ2UoKSkubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdERhdGEobGFuZyk7XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGEuc2V0KFt7XG4gICAgICAgIHR5cGU6IHRoaXMudmlld1R5cGUoKSxcbiAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIoKSxcbiAgICAgICAgaXNPbmVWYWx1ZTogZmFsc2UsXG4gICAgICAgIGtleUJpbmREYXRhOiAnJ1xuICAgICAgfV0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0RGVmYXVsdERhdGEoa2V5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZS51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIFtrZXldOiAnJyB9KSk7XG4gICAgdGhpcy5kYXRhTGFuZ3VhZ2UudXBkYXRlKHZhbHVlID0+ICh7IC4uLnZhbHVlLCBba2V5XTogJycgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZSgpIHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLmlucHV0RnVuY3Rpb25Db250cm9sKCkudmFsdWVzKCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGNvbnRyb2wuY2hlY2tJc1ZhbGlkKCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLmZ1bmN0aW9uQ29udHJvbEVkaXRvci52YWx1ZXMoKSkge1xuICAgIC8vICAgaWYgKCEoYXdhaXQgY29udHJvbC52YWxpZCgpKSkge1xuICAgIC8vICAgICB2YWxpZCA9IGZhbHNlO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgICBpZiAodGhpcy5zaW5nbGVMYW5ndWFnZSgpKSB7XG4gICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEoKS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGF3YWl0IHRoaXMudmFsaWRhdGVEZWZhdWx0KCk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVJc011bHRpS2V5KCk7XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZURlZmF1bHQoKSB7XG4gICAgbGV0IHZhbGlkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy52YWxpZFJlcXVpcmVkKCkuaXNSZXF1aXJlZCkge1xuICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IHRydWUgfSkpO1xuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWxpZDtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IGZhbHNlIH0pKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlKCkpKSB7XG4gICAgICBpZiAoa2V5ICE9PSAnaWQnICYmIGtleSAhPT0gdGhpcy5rZXlIZWFkZXIoKSAmJiBnZXQodGhpcy5kYXRhTGFuZ3VhZ2VDaGFuZ2UsIGtleSkgJiYga2V5ICE9PSB0aGlzLmxhbmdEZWZhdWx0KClbMF0pIHtcbiAgICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IHRydWUgfSkpO1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpKSkge1xuICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy52YWxpZFJlcXVpcmVkRGVmYXVsdC51cGRhdGUodmFsdWUgPT4gKHsgLi4udmFsdWUsIGlzUmVxdWlyZWQ6IGZhbHNlIH0pKTtcbiAgICAgIGlmICghKGF3YWl0IHRoaXMuY2hlY2tWYWxpZElucHV0KCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWxpZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tWYWxpZElucHV0KCkge1xuICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuaW5wdXRGdW5jdGlvbkNvbnRyb2woKS52YWx1ZXMoKSkge1xuICAgICAgaWYgKCEoYXdhaXQgY29udHJvbC5jaGVja0lzVmFsaWQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUlzTXVsdGlLZXkoKSB7XG4gICAgaWYgKHRoaXMuZGF0YSgpLmxlbmd0aCA+IDEpIHtcbiAgICAgIGlmICh0aGlzLmRhdGEoKVswXS52YWxpZFJlcXVpcmVkPy5pc1JlcXVpcmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YSgpLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKCFpdGVtLmtleUJpbmREYXRhKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5rZXlzKGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwgaXRlbS5rZXlCaW5kRGF0YSkpLmZvckVhY2goYXN5bmMgKGtleUJpbmQpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSgpKSkge1xuICAgICAgICAgICAgaWYgKGtleSA9PT0gaXRlbS5rZXlCaW5kRGF0YSB8fCBrZXkgPT09IGtleUJpbmQpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXkpICYmIHRoaXMub3B0aW9ucygpLmZpbmQoaXRlbSA9PiBpdGVtLmtleSA9PT0ga2V5KSkge1xuICAgICAgICAgICAgICB0aGlzLmRhdGEoKS5mb3JFYWNoKGFzeW5jIChjb25maWcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQuaXNSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGF0YSgpLmZvckVhY2goYXN5bmMgKGNvbmZpZykgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25maWcudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kID0gZ2V0KHRoaXMuZGF0YUxhbmd1YWdlQ2hhbmdlLCBrZXlCaW5kKTtcbiAgICAgICAgICBjb25zdCBkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmREYXRhID0gaXRlbS5rZXlCaW5kRGF0YSA/IGdldCh0aGlzLmRhdGFMYW5ndWFnZUNoYW5nZSwgaXRlbS5rZXlCaW5kRGF0YSkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKCghZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kICYmICFnZXQoZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kRGF0YSwga2V5QmluZCkpIHx8IChkYXRhTGFuZ3VhZ2VDaGFuZ2VCeUtleUJpbmQgJiYgZ2V0KGRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZERhdGEsIGtleUJpbmQpKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWRhdGFMYW5ndWFnZUNoYW5nZUJ5S2V5QmluZCkge1xuICAgICAgICAgICAgY29uc3QgZGF0YUZpcnN0ID0gdGhpcy5kYXRhKClbMF07XG4gICAgICAgICAgICBpZiAoZGF0YUZpcnN0ICYmIGRhdGFGaXJzdC52YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgZGF0YUZpcnN0LnZhbGlkUmVxdWlyZWRMYW5nRGVmYXVsdC5pc1JlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1ZhbGlkSW5wdXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFnZXQoZGF0YUxhbmd1YWdlQ2hhbmdlQnlLZXlCaW5kRGF0YSwga2V5QmluZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFTZWNvbmQgPSB0aGlzLmRhdGEoKVsxXTtcbiAgICAgICAgICAgIGlmIChkYXRhU2Vjb25kICYmIGRhdGFTZWNvbmQudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0KSB7XG4gICAgICAgICAgICAgIGRhdGFTZWNvbmQudmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0LmlzUmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrVmFsaWRJbnB1dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlcklucHV0Q2hhbmdlKCkge1xuICAgIHRoaXMub3V0Q2hhbmdlVmFsdWVJbnB1dC5lbWl0KCk7XG4gICAgdGltZXIoNTAwKS5waXBlKHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLnZhbGlkYXRlKCkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5vbkRlc3Ryb3kubmV4dCgpO1xuICAgIHRoaXMub25EZXN0cm95LmNvbXBsZXRlKCk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICBAaWYgKHRpdGxlRmllbGQoKTsgYXMgdGl0bGVGaWVsZCkge1xuICAgIDxkaXYgY2xhc3M9XCJsaWJzLXVpLWZvbnQtaDZtIG1iLVs0cHhdXCI+IHt7IHRpdGxlRmllbGQgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgfVxuICBAZm9yIChrZXkgb2YgbGFuZ3VhZ2VEaXNwbGF5KCk7IHRyYWNrIGtleSkge1xuICAgIEBpZiAoIXZpZXdDb250ZW50KCkpIHtcbiAgICAgIDxkaXYgW2NsYXNzLm10LVs0cHhdXT1cIiEkZmlyc3RcIlxuICAgICAgICBbY2xhc3MuaGlkZGVuXT1cInNpbmdsZUxhbmd1YWdlKCkgJiYgISRmaXJzdFwiXG4gICAgICAgIFtjbGFzcy5tdC1bOHB4XV09XCJjb3VudENoYXJhY3RlcnMoKSAmJiAhJGZpcnN0XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHt7IGV4dGVuZENsYXNzKCkgfX1cIj5cbiAgICAgICAgICBAaWYgKCFzaW5nbGVMYW5ndWFnZSgpKSB7XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duIFtsaXN0Q29uZmlnXT1cImxpc3RDb25maWdJdGVtKClcIlxuICAgICAgICAgICAgICAgIFtodHRwUmVxdWVzdERldGFpbEl0ZW1CeUlkXT1cImh0dHBSZXF1ZXN0RGV0YWlsKClcIlxuICAgICAgICAgICAgICAgIFtsaXN0S2V5c0Rpc2FibGVdPVwibGFuZ3VhZ2VEaXNwbGF5KCkgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldERpc2FibGVLZXlQaXBlOmtleVwiXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIiRpbmRleCA9PT0gMCB8fCByZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICBbbGlzdEtleVNlbGVjdGVkXT1cImtleVwiXG4gICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCIndy1bMTUwcHhdJ1wiXG4gICAgICAgICAgICAgICAgW2xpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgKG91dFNlbGVjdEtleSk9XCJoYW5kbGVyU2VsZWN0Q2hhbmdlKCRldmVudCwga2V5KVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggcmVsYXRpdmUgcC0wIHt7IGV4dGVuZENsYXNzQ29udGVudCgpIH19XCJcbiAgICAgICAgICAgIFtjbGFzcy53LVtjYWxjKDEwMCUtMTUwcHgpXV09XCIhdGV4dEFyZWEoKSAmJiAhc2luZ2xlTGFuZ3VhZ2UoKSAmJiB2aWV3UG9zaXRpb24oKSA9PT0gJ3JvdydcIlxuICAgICAgICAgICAgW2NsYXNzLnctZnVsbF09XCJ0ZXh0QXJlYSgpIHx8IHNpbmdsZUxhbmd1YWdlKCkgfHwgdmlld1Bvc2l0aW9uKCkgPT09ICdjb2x1bW4nXCI+XG4gICAgICAgICAgICBAZm9yIChpdGVtIG9mIGRhdGEoKTsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgICBAaWYgKGl0ZW0udHlwZSAhPT0gJ2VkaXRvcicgJiYgIWl0ZW0uaXNPbmVWYWx1ZSB8fCAoaXRlbS5pc09uZVZhbHVlICYmICRmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUge3sgaXRlbS5jbGFzc0luY2x1ZGVJbnB1dCB9fVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mudy1mdWxsXT1cInNpbmdsZUxhbmd1YWdlKCkgJiYgIW11bHRpTGluZSgpIHx8IHJlYWRvbmx5KCkgfHwgJGZpcnN0XCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy53LVtjYWxjKDEwMCUtMjhweCldXT1cInRleHRBcmVhKCkgfHwgKCFzaW5nbGVMYW5ndWFnZSgpICYmIG11bHRpTGluZSgpKVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Mudy1bY2FsYygxMDAlLTQwcHgpXV09XCIhdGV4dEFyZWEoKSAmJiAhc2luZ2xlTGFuZ3VhZ2UoKSAmJiAhbXVsdGlMaW5lKCkgJiYgIXJlYWRvbmx5KClcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnctW2NhbGMoMTAwJS03MHB4KV1dPVwiIXRleHRBcmVhKCkgJiYgIXNpbmdsZUxhbmd1YWdlKCkgJiYgbXVsdGlMaW5lKClcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLm10LVs4cHhdXT1cInZpZXdQb3NpdGlvbigpID09PSAnY29sdW1uJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MubWwtWzEycHhdXT1cIiFzaW5nbGVMYW5ndWFnZSgpICYmICF0ZXh0QXJlYSgpICYmIHZpZXdQb3NpdGlvbigpID09PSAncm93J1wiPlxuICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmtleUJpbmREYXRhIHwgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXRJdGVtUGlwZTpkYXRhTGFuZ3VhZ2VDaGFuZ2U7IGFzIGl0ZW1NYXApIHtcbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtdmFsaWQgW2RhdGFUeXBlXT1cIml0ZW0udHlwZSA9PT0gJ251bWJlcicgPyAnaW50JyA6IChpdGVtLnR5cGUgPT09ICd0ZXh0JyA/ICdzdHJpbmcnIDogKGl0ZW0udHlwZSA9PT0gJ2JpZ2ludCcgPyAnYmlnaW50JyA6ICdmbG9hdCcpKVwiXG4gICAgICAgICAgICAgICAgICAgICAgWyhpdGVtKV09XCJpdGVtTWFwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZmllbGROYW1lQmluZF09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbENvbmZpZ109XCJjb3VudENoYXJhY3RlcnMoKSA/IHsgY2xhc3NJbmNsdWRlOiAnYWJzb2x1dGUgLXRvcC1bMjBweF0nLCByZXF1aXJlZDogdHJ1ZX0gOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0YWdJbnB1dF09XCJ0ZXh0QXJlYSgpID8gJ3RleHRhcmVhJyA6ICdpbnB1dCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJpdGVtLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRSZXF1aXJlZF09XCIoJGluZGV4ID09PSAwICYmIGRhdGEoKS5sZW5ndGggPD0gMSkgPyB2YWxpZFJlcXVpcmVkRGVmYXVsdCgpIDogXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJGluZGV4ID09PSAwICYmIGRhdGEoKS5sZW5ndGggPiAxICYmIGl0ZW0udmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0KSA/IGl0ZW0udmFsaWRSZXF1aXJlZExhbmdEZWZhdWx0IDogaXRlbS52YWxpZFJlcXVpcmVkID8gaXRlbS52YWxpZFJlcXVpcmVkIDogKHZhbGlkUmVxdWlyZWQoKSB8fCB7IGlzUmVxdWlyZWQ6IGZhbHNlIH0pXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdW5pdHNSaWdodF09XCJjdXJyZW5jeVVuaXRzKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFtrZXlTZWxlY3RlZFVuaXRSaWdodF09XCJrZXlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd0NvdW50XT1cImNvdW50Q2hhcmFjdGVycygpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cInZhbGlkTWF4TGVuZ3RoLmxlbmd0aCA/IHZhbGlkTWF4TGVuZ3RoLmxlbmd0aCA6IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZpeGVkRmxvYXRdPVwiaXRlbS50eXBlID09PSAnYmlnaW50JyA/IDQgOiAxNFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkTWluTGVuZ3RoXT1cIntsZW5ndGg6IHZhbGlkTWluTGVuZ3RoKCk/Lmxlbmd0aCB8fCAtMSwgbWVzc2FnZTogJ2kxOG5fbWluaW11bV9sZW5ndGhfbnVtYmVyJywgaW50ZXJwb2xhdGVQYXJhbXM6IHtudW1iZXI6IHZhbGlkTWluTGVuZ3RoKCk/Lmxlbmd0aH19XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0TmVnYXRpdmVWYWx1ZV09XCJhY2NlcHROZWdhdGl2ZVZhbHVlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZVVwRG93bk51bWJlcl09XCJ2YWx1ZVVwRG93bk51bWJlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwibWF4VmFsdWVOdW1iZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW29ubHlBY2NlcHROZWdhdGl2ZVZhbHVlXT1cIm9ubHlBY2NlcHROZWdhdGl2ZVZhbHVlKClcIlxuICAgICAgICAgICAgICAgICAgICAgIChvdXRWYWx1ZUNoYW5nZSk9XCJoYW5kbGVySW5wdXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG91dEZ1bmN0aW9uc0NvbnRyb2wpPVwiaGFuZGxlcklucHV0RnVuY3Rpb25Db250cm9sKCRldmVudCwga2V5KVwiIC8+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChpdGVtLnR5cGUgPT09ICdlZGl0b3InKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctW2NhbGMoMTAwJS0yOHB4KV1cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLVsyNTBweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8bW8tbGlicy1jb3JlX3VpLWNvbXBvbmVudHMtcXVpbGwgW2l0ZW1dPVwiaXRlbS5rZXlCaW5kRGF0YSA/IGRhdGFMYW5ndWFnZUNoYW5nZVtpdGVtLmtleUJpbmREYXRhXSA6IGRhdGFMYW5ndWFnZUNoYW5nZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2ZpZWxkTmFtZUJpbmRdPVwia2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRSZXF1aXJlZF09XCIoaSA9PT0gMCAmJiBjb25maWdEYXRhcy5sZW5ndGggPD0gMSkgPyB2YWxpZFJlcXVpcmVkTGFuZ0RlZmF1bHQgOiB2YWxpZFJlcXVpcmVkTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIihpdGVtLnBsYWNlaG9sZGVyIHx8ICcnIHwgdHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAobW9Gb2N1cyk9XCJoYW5kbGVySW5wdXRDaGFuZ2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKG1vQ2hhbmdlKT1cImhhbmRsZXJJbnB1dENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAobW9GdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2xFZGl0b3IoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICA8L21vLWxpYnMtY29yZV91aS1jb21wb25lbnRzLXF1aWxsPiAtLT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKCgkaW5kZXggPiAwICYmIGRhdGEoKS5sZW5ndGggPT09IDEpICYmICFpZ25vcmVSZW1vdmUoKSAmJiAhcmVhZG9ubHkoKSkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC1bMzJweF0gZmxleCBpdGVtcy1jZW50ZXIgbWwtWzE2cHhdXCI+XG4gICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbiBbdHlwZV09XCInYnV0dG9uLWxpbmstY3VzdG9tJ1wiXG4gICAgICAgICAgICAgICAgICBbYnV0dG9uQ3VzdG9tXT1cIntcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnU3RlcENvbG9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGV4dDogJyMwNzE2MzEnLFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRfaG92ZXI6ICcjZWUyZDQxJyxcbiAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2FjdGl2ZTogJyNlZTJkNDEnLFxuICAgICAgICAgICAgICAgICAgICAgIHRleHRfZGlzYWJsZTogJzA3MTYzMSdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcm9vdENvbG9yOiAnIzA3MTYzMSdcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cIntjb25maWc6IHtjb250ZW50OiAnaTE4bl9kZWxldGUnLCB6SW5kZXg6IDEyMDV9fVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLXJlbW92ZSdcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCdcIlxuICAgICAgICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJSZW1vdmVMYW5ndWFnZSgkZXZlbnQsIGtleSlcIiAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoJGluZGV4ID09PSAwICYmICFzaW5nbGVMYW5ndWFnZSgpICYmIChvcHRpb25zKCkubGVuZ3RoICE9PSBsYW5ndWFnZURpc3BsYXkoKS5sZW5ndGgpICYmIHZpZXdUeXBlKCkgIT09ICdpbnRlZ2VyJyAmJiAhcmVhZG9ubHkoKSkge1xuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b24gW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXByaW1hcnknXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCInaTE4bl9hZGRfbGFuZ3VhZ2UnXCJcbiAgICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tYWRkJ1wiXG4gICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcHgtMCBtdC1bOHB4XSdcIlxuICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJBZGRMYW5ndWFnZSgkZXZlbnQpXCIgLz5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIEBpZiAodmlld0NvbnRlbnQoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgQGlmIChzaW5nbGVMYW5ndWFnZSgpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIlxuICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCJzaW5nbGVMYW5ndWFnZSgpICYmICEkZmlyc3RcIlxuICAgICAgICAgICAgW2NsYXNzLm10LVs0cHhdXT1cIiFzaW5nbGVMYW5ndWFnZSgpICYmICEkZmlyc3RcIj5cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cImNsYXNzSW5jbHVkZUtleSgpXCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJrZXkgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZURpc3BsYXlMYW5ndWFnZVBpcGU6b3B0aW9ucygpXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8ZGl2IGNsYXNzPVwidy1bY2FsYygxMDAlLTEwMHB4KV1cIlxuICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwic2luZ2xlTGFuZ3VhZ2UoKSAmJiAhJGZpcnN0XCJcbiAgICAgICAgICBbY2xhc3MuZmxleF09XCIhc2luZ2xlTGFuZ3VhZ2UgfHwgJGZpcnN0XCJcbiAgICAgICAgICBbY2xhc3MubXQtWzRweF1dPVwiIXNpbmdsZUxhbmd1YWdlKCkgJiYgISRmaXJzdFwiPlxuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCJjbGFzc0luY2x1ZGVWYWx1ZSgpXCJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiKChkYXRhTGFuZ3VhZ2VDaGFuZ2UoKVtrZXldIHx8IGRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleV0gPT09IDApID8gKGRhdGFMYW5ndWFnZUNoYW5nZSgpW2tleV0gKyAnJykgOiAnJykgfCBMaWJzVWlQaXBlc0VzY2FwZUh0bWxQaXBlXCJcbiAgICAgICAgICAgIFtjb25maWddPVwie3pJbmRleDogekluZGV4KCl9XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIH1cbiAgQGlmICh2aWV3VHlwZSgpID09PSAnaW50ZWdlcicgJiYgIXRoaXMuaWdub3JlQWRkKCkgJiYgIXJlYWRvbmx5KCkpIHtcbiAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uIHR5cGU9XCJidXR0b24tbGluay1wcmltYXJ5XCJcbiAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tYWRkIG1yLVs4cHhdIHRleHQtWzEwcHhdJ1wiXG4gICAgICBbY2xhc3NMYWJlbF09XCInbGlicy11aS1mb250LWg1cidcIlxuICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXBiLTAnXCJcbiAgICAgIFtsYWJlbF09XCInaTE4bl9hZGRfY3VycmVuY3knXCJcbiAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQWRkTGFuZ3VhZ2UoJGV2ZW50KVwiIC8+XG4gIH1cbjwvZGl2PlxuIl19
|
|
File without changes
|