@fovestta2/web-angular 1.0.1 → 1.0.4
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/add-update-form/add-update-form.component.mjs +1044 -0
- package/esm2022/lib/fv-controls.module.mjs +16 -4
- package/esm2022/lib/fv-dropdown/fv-dropdown.component.mjs +116 -17
- package/esm2022/lib/fv-entry-field/fv-entry-field.component.mjs +29 -3
- package/esm2022/lib/fv-esi-field/fv-esi-field.component.mjs +63 -0
- package/esm2022/lib/fv-iban-field/fv-iban-field.component.mjs +63 -0
- package/esm2022/lib/fv-ifsc-field/fv-ifsc-field.component.mjs +63 -0
- package/esm2022/lib/fv-micr-field/fv-micr-field.component.mjs +63 -0
- package/esm2022/lib/fv-name-code/fv-name-code.component.mjs +273 -0
- package/esm2022/lib/fv-pf-field/fv-pf-field.component.mjs +63 -0
- package/esm2022/lib/fv-phone-field/fv-phone-field.component.mjs +105 -0
- package/esm2022/lib/fv-radio-group/fv-radio-group.component.mjs +3 -3
- package/esm2022/lib/fv-uan-field/fv-uan-field.component.mjs +65 -0
- package/esm2022/lib/query-form/query-form.component.mjs +569 -0
- package/esm2022/public-api.mjs +15 -5
- package/fesm2022/fovestta2-web-angular.mjs +2492 -88
- package/fesm2022/fovestta2-web-angular.mjs.map +1 -1
- package/lib/add-update-form/add-update-form.component.d.ts +102 -0
- package/lib/fv-controls.module.d.ts +3 -1
- package/lib/fv-dropdown/fv-dropdown.component.d.ts +14 -2
- package/lib/fv-entry-field/fv-entry-field.component.d.ts +4 -1
- package/lib/fv-esi-field/fv-esi-field.component.d.ts +21 -0
- package/lib/fv-iban-field/fv-iban-field.component.d.ts +21 -0
- package/lib/fv-ifsc-field/fv-ifsc-field.component.d.ts +21 -0
- package/lib/fv-micr-field/fv-micr-field.component.d.ts +21 -0
- package/lib/fv-name-code/fv-name-code.component.d.ts +41 -0
- package/lib/fv-pf-field/fv-pf-field.component.d.ts +21 -0
- package/lib/fv-phone-field/fv-phone-field.component.d.ts +25 -0
- package/lib/fv-uan-field/fv-uan-field.component.d.ts +21 -0
- package/lib/query-form/query-form.component.d.ts +53 -0
- package/package.json +2 -2
- package/public-api.d.ts +14 -4
|
@@ -0,0 +1,1044 @@
|
|
|
1
|
+
// add-update-form.component.ts
|
|
2
|
+
import { Component, EventEmitter, Input, Output, } from '@angular/core';
|
|
3
|
+
import { CommonModule } from '@angular/common';
|
|
4
|
+
import { ReactiveFormsModule, Validators, } from '@angular/forms';
|
|
5
|
+
import { distinctUntilChanged } from 'rxjs/operators';
|
|
6
|
+
// Import your library modules
|
|
7
|
+
import { FvEntryFieldComponent } from '../fv-entry-field/fv-entry-field.component';
|
|
8
|
+
import { FvNumberFieldComponent } from '../fv-number-field/fv-number-field.component';
|
|
9
|
+
import { FvDropdownComponent } from '../fv-dropdown/fv-dropdown.component';
|
|
10
|
+
import { FvRadioGroupComponent } from '../fv-radio-group/fv-radio-group.component';
|
|
11
|
+
import { FvCheckboxComponent } from '../fv-checkbox/fv-checkbox.component';
|
|
12
|
+
import { FvDateFieldComponent } from '../fv-date-field/fv-date-field.component';
|
|
13
|
+
import { FvMonthYearFieldComponent } from '../fv-month-year-field/fv-month-year-field.component';
|
|
14
|
+
import { FvFileSelectorComponent } from '../fv-file-selector/fv-file-selector.component';
|
|
15
|
+
import { FvImageSelectorComponent } from '../fv-image-selector/fv-image-selector.component';
|
|
16
|
+
import { FvRichTextEditorComponent } from '../fv-rich-text-editor/fv-rich-text-editor.component';
|
|
17
|
+
import { FvNameCodeComponent } from '../fv-name-code/fv-name-code.component';
|
|
18
|
+
import { FvPhoneFieldComponent } from '../fv-phone-field/fv-phone-field.component';
|
|
19
|
+
import { FvUanFieldComponent } from '../fv-uan-field/fv-uan-field.component';
|
|
20
|
+
import { FvPfFieldComponent } from '../fv-pf-field/fv-pf-field.component';
|
|
21
|
+
import { FvEsiFieldComponent } from '../fv-esi-field/fv-esi-field.component';
|
|
22
|
+
import { FvIfscFieldComponent } from '../fv-ifsc-field/fv-ifsc-field.component';
|
|
23
|
+
import { FvMicrFieldComponent } from '../fv-micr-field/fv-micr-field.component';
|
|
24
|
+
import { FvIbanFieldComponent } from '../fv-iban-field/fv-iban-field.component';
|
|
25
|
+
import * as i0 from "@angular/core";
|
|
26
|
+
import * as i1 from "@angular/forms";
|
|
27
|
+
import * as i2 from "@angular/common";
|
|
28
|
+
export class AddUpdateFormComponent {
|
|
29
|
+
fb;
|
|
30
|
+
hostRef;
|
|
31
|
+
config;
|
|
32
|
+
validationError = new EventEmitter();
|
|
33
|
+
form;
|
|
34
|
+
submitted = false;
|
|
35
|
+
filePreviews = new Map();
|
|
36
|
+
fileNames = new Map();
|
|
37
|
+
valueChangeSubscriptions = [];
|
|
38
|
+
passwordVisibility = new Map();
|
|
39
|
+
searchQueries = new Map();
|
|
40
|
+
constructor(fb, hostRef) {
|
|
41
|
+
this.fb = fb;
|
|
42
|
+
this.hostRef = hostRef;
|
|
43
|
+
}
|
|
44
|
+
ngOnInit() {
|
|
45
|
+
this.initializeForm();
|
|
46
|
+
}
|
|
47
|
+
ngAfterViewInit() {
|
|
48
|
+
// Lifecycle hook - can be used for datepicker initialization if needed
|
|
49
|
+
}
|
|
50
|
+
getColumnWidth(column) {
|
|
51
|
+
const maxCols = this.config.maxColsPerRow || 5;
|
|
52
|
+
const colSpan = Math.min(column.colSpan || 1, maxCols);
|
|
53
|
+
return `calc(${(colSpan / maxCols) * 100}% - 16px)`;
|
|
54
|
+
}
|
|
55
|
+
getControl(name) {
|
|
56
|
+
return this.form.get(name);
|
|
57
|
+
}
|
|
58
|
+
// 2. HELPER: Convert your FieldValidation[] to the library's ValidationSchema
|
|
59
|
+
getSchema(column) {
|
|
60
|
+
const rules = [];
|
|
61
|
+
const errorPriority = [];
|
|
62
|
+
if (column.validations) {
|
|
63
|
+
column.validations.forEach((v) => {
|
|
64
|
+
switch (v.type) {
|
|
65
|
+
case 'required':
|
|
66
|
+
rules.push({
|
|
67
|
+
name: 'required',
|
|
68
|
+
params: { enabled: true },
|
|
69
|
+
errorKey: 'ERR_REQUIRED',
|
|
70
|
+
});
|
|
71
|
+
errorPriority.push('required');
|
|
72
|
+
break;
|
|
73
|
+
case 'email':
|
|
74
|
+
rules.push({
|
|
75
|
+
name: 'regex',
|
|
76
|
+
params: {
|
|
77
|
+
pattern: '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$',
|
|
78
|
+
},
|
|
79
|
+
errorKey: 'ERR_REGEX_MISMATCH',
|
|
80
|
+
});
|
|
81
|
+
errorPriority.push('regex');
|
|
82
|
+
break;
|
|
83
|
+
case 'minLength':
|
|
84
|
+
rules.push({
|
|
85
|
+
name: 'minLength',
|
|
86
|
+
params: { value: v.value },
|
|
87
|
+
errorKey: 'ERR_MIN_LENGTH',
|
|
88
|
+
});
|
|
89
|
+
errorPriority.push('minLength');
|
|
90
|
+
break;
|
|
91
|
+
case 'maxLength':
|
|
92
|
+
rules.push({
|
|
93
|
+
name: 'maxLength',
|
|
94
|
+
params: { value: v.value },
|
|
95
|
+
errorKey: 'ERR_MAX_LENGTH',
|
|
96
|
+
});
|
|
97
|
+
errorPriority.push('maxLength');
|
|
98
|
+
break;
|
|
99
|
+
case 'pattern':
|
|
100
|
+
rules.push({
|
|
101
|
+
name: 'regex',
|
|
102
|
+
params: { pattern: v.value },
|
|
103
|
+
errorKey: 'ERR_REGEX_MISMATCH',
|
|
104
|
+
});
|
|
105
|
+
errorPriority.push('regex');
|
|
106
|
+
break;
|
|
107
|
+
case 'min':
|
|
108
|
+
rules.push({
|
|
109
|
+
name: 'min',
|
|
110
|
+
params: { value: v.value },
|
|
111
|
+
errorKey: 'ERR_MIN_VALUE',
|
|
112
|
+
});
|
|
113
|
+
errorPriority.push('min');
|
|
114
|
+
break;
|
|
115
|
+
case 'max':
|
|
116
|
+
rules.push({
|
|
117
|
+
name: 'max',
|
|
118
|
+
params: { value: v.value },
|
|
119
|
+
errorKey: 'ERR_MAX_VALUE',
|
|
120
|
+
});
|
|
121
|
+
errorPriority.push('max');
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
// Map 'name-code' to 'Dropdown' or similar for validation schema purposes if needed
|
|
127
|
+
let controlType = column.type;
|
|
128
|
+
if (column.type === 'name-code') {
|
|
129
|
+
controlType = 'select'; // Treat as select for schema lookup if library expects 'select' or 'Dropdown'
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
controlType: controlType,
|
|
133
|
+
errorPriority: errorPriority,
|
|
134
|
+
rules: rules,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
isImageField(column) {
|
|
138
|
+
return (column.type === 'file' &&
|
|
139
|
+
(column.accept?.startsWith('image') || column.filePreview === true));
|
|
140
|
+
}
|
|
141
|
+
initializeForm() {
|
|
142
|
+
this.submitted = false;
|
|
143
|
+
const formGroupConfig = {};
|
|
144
|
+
this.config.sections.forEach((section) => {
|
|
145
|
+
section.fields.forEach((column) => {
|
|
146
|
+
let initialValue = column.value || '';
|
|
147
|
+
// Format month-year fields to YYYY-MM format
|
|
148
|
+
if (column.type === 'month-year' && initialValue) {
|
|
149
|
+
initialValue = this.formatMonthYearValue(initialValue);
|
|
150
|
+
}
|
|
151
|
+
formGroupConfig[column.name] = [
|
|
152
|
+
{ value: initialValue, disabled: column.disabled || false },
|
|
153
|
+
null, // We'll set validators after form creation
|
|
154
|
+
];
|
|
155
|
+
// If it's a file field with an existing value, set the preview
|
|
156
|
+
if (column.type === 'file' && column.value) {
|
|
157
|
+
this.filePreviews.set(column.name, column.value);
|
|
158
|
+
// Extract filename from URL or base64
|
|
159
|
+
const fileName = this.extractFileName(column.value);
|
|
160
|
+
if (fileName) {
|
|
161
|
+
this.fileNames.set(column.name, fileName);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Initialize search display for name-code fields - No longer needed as FvNameCode handles display internally
|
|
165
|
+
/* if (column.type === 'name-code' && initialValue && column.options) {
|
|
166
|
+
// Logic moved to component
|
|
167
|
+
} */
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
this.form = this.fb.group(formGroupConfig);
|
|
171
|
+
this.config.sections.forEach((section) => {
|
|
172
|
+
section.fields.forEach((column) => {
|
|
173
|
+
const validators = this.buildValidators(column.validations, this.form);
|
|
174
|
+
if (validators.length > 0) {
|
|
175
|
+
this.form.get(column.name)?.setValidators(validators);
|
|
176
|
+
this.form.get(column.name)?.updateValueAndValidity();
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
// Subscribe to value changes for all fields to trigger onChange handlers
|
|
181
|
+
Object.keys(this.form.controls).forEach((key) => {
|
|
182
|
+
const control = this.form.get(key);
|
|
183
|
+
if (control) {
|
|
184
|
+
const subscription = control.valueChanges
|
|
185
|
+
.pipe(distinctUntilChanged())
|
|
186
|
+
.subscribe((value) => {
|
|
187
|
+
const column = this.getColumnByName(key);
|
|
188
|
+
if (column?.onChange) {
|
|
189
|
+
column.onChange(value, this.form);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
this.valueChangeSubscriptions.push(subscription);
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
ngOnDestroy() {
|
|
197
|
+
// Clean up all subscriptions to prevent memory leaks
|
|
198
|
+
this.valueChangeSubscriptions.forEach((sub) => sub.unsubscribe());
|
|
199
|
+
this.valueChangeSubscriptions = [];
|
|
200
|
+
}
|
|
201
|
+
handleFieldChange(fieldName, eventValue) {
|
|
202
|
+
const column = this.getColumnByName(fieldName);
|
|
203
|
+
const formControl = this.form.get(fieldName);
|
|
204
|
+
// Format month-year fields (especially expiryDate) to YYYY-MM
|
|
205
|
+
if (column?.type === 'month-year' && eventValue) {
|
|
206
|
+
const formattedValue = this.formatMonthYearValue(eventValue);
|
|
207
|
+
if (formControl && formattedValue !== eventValue) {
|
|
208
|
+
formControl.setValue(formattedValue, { emitEvent: false });
|
|
209
|
+
eventValue = formattedValue;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (column?.onChange) {
|
|
213
|
+
// Use the event value directly (what the user just selected/typed)
|
|
214
|
+
// This ensures we have the correct value even if form control hasn't updated yet
|
|
215
|
+
const valueToPass = eventValue !== undefined ? eventValue : this.form.get(fieldName)?.value;
|
|
216
|
+
const onChangeFn = column.onChange; // Store the function reference
|
|
217
|
+
// Store the selected value - this is what the user chose
|
|
218
|
+
const selectedValue = valueToPass;
|
|
219
|
+
// Ensure the form control has the selected value before calling onChange
|
|
220
|
+
if (formControl && selectedValue !== undefined) {
|
|
221
|
+
if (formControl.value !== selectedValue) {
|
|
222
|
+
formControl.setValue(selectedValue, { emitEvent: false });
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Call onChange with the selected value
|
|
226
|
+
if (onChangeFn) {
|
|
227
|
+
onChangeFn(selectedValue, this.form);
|
|
228
|
+
}
|
|
229
|
+
// Restore the value for the field that triggered the change if it was cleared by onChange
|
|
230
|
+
// This is critical: if onChange clears the field that was just changed, we restore it
|
|
231
|
+
// Only restore if we had a non-empty value (empty string, null, undefined are not restored)
|
|
232
|
+
if (formControl &&
|
|
233
|
+
selectedValue !== undefined &&
|
|
234
|
+
selectedValue !== null &&
|
|
235
|
+
selectedValue !== '') {
|
|
236
|
+
// Use setTimeout with 0 delay to run after any synchronous operations in onChange
|
|
237
|
+
setTimeout(() => {
|
|
238
|
+
// Check if the value was cleared or changed
|
|
239
|
+
const currentValue = formControl.value;
|
|
240
|
+
// If the value doesn't match what was selected, restore it
|
|
241
|
+
// This handles the case where onChange cleared the field unintentionally
|
|
242
|
+
if (currentValue !== selectedValue) {
|
|
243
|
+
formControl.setValue(selectedValue, { emitEvent: false });
|
|
244
|
+
}
|
|
245
|
+
}, 0);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
formatMonthYearValue(value) {
|
|
250
|
+
if (!value)
|
|
251
|
+
return value;
|
|
252
|
+
// Normalize to YYYY-MM
|
|
253
|
+
if (value.match(/^\d{2}-\d{4}$/)) {
|
|
254
|
+
const [month, year] = value.split('-');
|
|
255
|
+
return `${year}-${month}`;
|
|
256
|
+
}
|
|
257
|
+
// If already in YYYY-MM format, return as is
|
|
258
|
+
return value;
|
|
259
|
+
}
|
|
260
|
+
parseMonthYearValue(value) {
|
|
261
|
+
if (!value)
|
|
262
|
+
return value;
|
|
263
|
+
// Display and picker both use YYYY-MM; normalize MM-YYYY if present
|
|
264
|
+
if (value.match(/^\d{2}-\d{4}$/)) {
|
|
265
|
+
const [month, year] = value.split('-');
|
|
266
|
+
return `${year}-${month}`;
|
|
267
|
+
}
|
|
268
|
+
return value;
|
|
269
|
+
}
|
|
270
|
+
handleMonthYearChange(fieldName, value) {
|
|
271
|
+
// Format the input value to YYYY-MM format
|
|
272
|
+
let formattedValue = value;
|
|
273
|
+
// If it's in MM-YYYY format, convert to YYYY-MM
|
|
274
|
+
if (formattedValue.match(/^\d{2}-\d{4}$/)) {
|
|
275
|
+
const [month, year] = formattedValue.split('-');
|
|
276
|
+
formattedValue = `${year}-${month}`;
|
|
277
|
+
}
|
|
278
|
+
// If it's in YYYYMM format (no dash), convert to YYYY-MM
|
|
279
|
+
else if (formattedValue.match(/^\d{6}$/)) {
|
|
280
|
+
const year = formattedValue.substring(0, 4);
|
|
281
|
+
const month = formattedValue.substring(4, 6);
|
|
282
|
+
formattedValue = `${year}-${month}`;
|
|
283
|
+
}
|
|
284
|
+
// If it's already in YYYY-MM format, leave as is
|
|
285
|
+
else if (formattedValue.match(/^\d{4}-\d{2}$/)) {
|
|
286
|
+
// Already in correct format
|
|
287
|
+
}
|
|
288
|
+
// If user is typing, allow partial input
|
|
289
|
+
else if (formattedValue.match(/^\d{1,6}$/)) {
|
|
290
|
+
// Allow partial input while typing
|
|
291
|
+
}
|
|
292
|
+
const formControl = this.form.get(fieldName);
|
|
293
|
+
if (formControl && formattedValue !== value) {
|
|
294
|
+
formControl.setValue(formattedValue, { emitEvent: false });
|
|
295
|
+
}
|
|
296
|
+
this.handleFieldChange(fieldName, formattedValue);
|
|
297
|
+
}
|
|
298
|
+
handleMonthYearBlur(fieldName) {
|
|
299
|
+
const formControl = this.form.get(fieldName);
|
|
300
|
+
if (!formControl)
|
|
301
|
+
return;
|
|
302
|
+
const value = formControl.value || '';
|
|
303
|
+
// Ensure the value is in YYYY-MM format on blur
|
|
304
|
+
if (value && !value.match(/^\d{4}-\d{2}$/)) {
|
|
305
|
+
// Try to parse and format
|
|
306
|
+
const formatted = this.formatMonthYearValue(value);
|
|
307
|
+
if (formatted !== value) {
|
|
308
|
+
formControl.setValue(formatted, { emitEvent: false });
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
handleMonthYearPickerChange(fieldName, value) {
|
|
313
|
+
// Month picker outputs YYYY-MM; just normalize
|
|
314
|
+
const formattedValue = this.formatMonthYearValue(value);
|
|
315
|
+
const formControl = this.form.get(fieldName);
|
|
316
|
+
if (formControl) {
|
|
317
|
+
formControl.setValue(formattedValue, { emitEvent: false });
|
|
318
|
+
this.handleFieldChange(fieldName, formattedValue);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
getMonthYearPickerValue(fieldName) {
|
|
322
|
+
const formControl = this.form.get(fieldName);
|
|
323
|
+
if (!formControl)
|
|
324
|
+
return '';
|
|
325
|
+
const value = formControl.value || '';
|
|
326
|
+
// Display and picker both expect YYYY-MM
|
|
327
|
+
return this.parseMonthYearValue(value);
|
|
328
|
+
}
|
|
329
|
+
openMonthPicker(fieldName) {
|
|
330
|
+
const monthInput = document.getElementById(fieldName + '_picker');
|
|
331
|
+
if (monthInput && monthInput.type === 'month') {
|
|
332
|
+
// Update the picker value before opening
|
|
333
|
+
const currentValue = this.getMonthYearPickerValue(fieldName);
|
|
334
|
+
if (currentValue) {
|
|
335
|
+
monthInput.value = currentValue;
|
|
336
|
+
}
|
|
337
|
+
// Try modern showPicker API first, fallback to click
|
|
338
|
+
if (monthInput.showPicker) {
|
|
339
|
+
monthInput.showPicker();
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
monthInput.focus();
|
|
343
|
+
monthInput.click();
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
getColumnByName(name) {
|
|
348
|
+
return this.config.sections
|
|
349
|
+
.flatMap((s) => s.fields)
|
|
350
|
+
.find((c) => c.name === name);
|
|
351
|
+
}
|
|
352
|
+
getFileFields(fields) {
|
|
353
|
+
return fields.filter((f) => f.type === 'file');
|
|
354
|
+
}
|
|
355
|
+
getNonFileFields(fields) {
|
|
356
|
+
return fields.filter((f) => f.type !== 'file');
|
|
357
|
+
}
|
|
358
|
+
togglePasswordVisibility(fieldName) {
|
|
359
|
+
const current = this.passwordVisibility.get(fieldName) || false;
|
|
360
|
+
this.passwordVisibility.set(fieldName, !current);
|
|
361
|
+
}
|
|
362
|
+
hasRequiredValidation(column) {
|
|
363
|
+
return column.validations?.some((v) => v.type === 'required') || false;
|
|
364
|
+
}
|
|
365
|
+
isPasswordVisible(fieldName) {
|
|
366
|
+
return this.passwordVisibility.get(fieldName) || false;
|
|
367
|
+
}
|
|
368
|
+
buildValidators(validations, formGroup) {
|
|
369
|
+
if (!validations)
|
|
370
|
+
return [];
|
|
371
|
+
const validators = [];
|
|
372
|
+
validations.forEach((validation) => {
|
|
373
|
+
switch (validation.type) {
|
|
374
|
+
case 'required':
|
|
375
|
+
validators.push(Validators.required);
|
|
376
|
+
break;
|
|
377
|
+
case 'email':
|
|
378
|
+
validators.push(Validators.email);
|
|
379
|
+
break;
|
|
380
|
+
case 'minLength':
|
|
381
|
+
validators.push(Validators.minLength(validation.value));
|
|
382
|
+
break;
|
|
383
|
+
case 'maxLength':
|
|
384
|
+
validators.push(Validators.maxLength(validation.value));
|
|
385
|
+
break;
|
|
386
|
+
case 'min':
|
|
387
|
+
validators.push(Validators.min(validation.value));
|
|
388
|
+
break;
|
|
389
|
+
case 'max':
|
|
390
|
+
validators.push(Validators.max(validation.value));
|
|
391
|
+
break;
|
|
392
|
+
case 'pattern':
|
|
393
|
+
validators.push(Validators.pattern(validation.value));
|
|
394
|
+
break;
|
|
395
|
+
case 'custom':
|
|
396
|
+
if (validation.validator) {
|
|
397
|
+
validators.push((control) => {
|
|
398
|
+
const isValid = validation.validator(control.value, formGroup);
|
|
399
|
+
return isValid ? null : { custom: true };
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
break;
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
return validators;
|
|
406
|
+
}
|
|
407
|
+
triggerFileUpload(fieldName) {
|
|
408
|
+
document.getElementById('fileInput_' + fieldName)?.click();
|
|
409
|
+
}
|
|
410
|
+
openTimePicker(fieldName) {
|
|
411
|
+
const timeInput = document.getElementById(fieldName);
|
|
412
|
+
if (timeInput && timeInput.type === 'time') {
|
|
413
|
+
// Try modern showPicker API first, fallback to click
|
|
414
|
+
if (timeInput.showPicker) {
|
|
415
|
+
timeInput.showPicker();
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
timeInput.focus();
|
|
419
|
+
timeInput.click();
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
onFileChange(event, fieldName) {
|
|
424
|
+
const file = event.target.files[0];
|
|
425
|
+
if (file) {
|
|
426
|
+
this.fileNames.set(fieldName, file.name);
|
|
427
|
+
const reader = new FileReader();
|
|
428
|
+
reader.readAsDataURL(file);
|
|
429
|
+
reader.onload = () => {
|
|
430
|
+
const base64String = reader.result;
|
|
431
|
+
this.filePreviews.set(fieldName, base64String);
|
|
432
|
+
this.form.get(fieldName)?.setValue(base64String);
|
|
433
|
+
// Trigger onChange handler for file fields
|
|
434
|
+
const column = this.getColumnByName(fieldName);
|
|
435
|
+
if (column?.onChange) {
|
|
436
|
+
column.onChange(base64String, this.form);
|
|
437
|
+
}
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
extractFileName(value) {
|
|
442
|
+
if (!value)
|
|
443
|
+
return '';
|
|
444
|
+
// If it's a URL, extract filename from URL
|
|
445
|
+
if (value.startsWith('http')) {
|
|
446
|
+
const parts = value.split('/');
|
|
447
|
+
return parts[parts.length - 1];
|
|
448
|
+
}
|
|
449
|
+
// If it's base64, return a generic name
|
|
450
|
+
if (value.startsWith(`data:image`)) {
|
|
451
|
+
return 'uploaded-image.jpg';
|
|
452
|
+
}
|
|
453
|
+
return 'existing-photo.jpg';
|
|
454
|
+
}
|
|
455
|
+
getFilePreview(fieldName) {
|
|
456
|
+
return this.filePreviews.get(fieldName) || null;
|
|
457
|
+
}
|
|
458
|
+
getFileName(fieldName) {
|
|
459
|
+
return this.fileNames.get(fieldName) || null;
|
|
460
|
+
}
|
|
461
|
+
mapSearchOptions(options) {
|
|
462
|
+
return options.map(opt => ({
|
|
463
|
+
code: opt.code || opt.value,
|
|
464
|
+
name: opt.name || opt.label || opt.value,
|
|
465
|
+
value: opt.value
|
|
466
|
+
}));
|
|
467
|
+
}
|
|
468
|
+
deleteFile(fieldName) {
|
|
469
|
+
this.filePreviews.delete(fieldName);
|
|
470
|
+
this.fileNames.delete(fieldName);
|
|
471
|
+
this.form.get(fieldName)?.setValue('');
|
|
472
|
+
// Trigger onChange handler when file is deleted
|
|
473
|
+
const column = this.getColumnByName(fieldName);
|
|
474
|
+
if (column?.onChange) {
|
|
475
|
+
column.onChange('', this.form);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
handleSubmit() {
|
|
479
|
+
this.submitted = true;
|
|
480
|
+
if (this.form.invalid) {
|
|
481
|
+
// Mark all fields as touched to show red borders
|
|
482
|
+
Object.keys(this.form.controls).forEach((key) => {
|
|
483
|
+
this.form.get(key)?.markAsTouched();
|
|
484
|
+
});
|
|
485
|
+
// Count only required fields that are invalid
|
|
486
|
+
const allColumns = this.config.sections.flatMap((s) => s.fields);
|
|
487
|
+
const invalidRequiredCount = Object.keys(this.form.controls).filter((key) => {
|
|
488
|
+
const control = this.form.get(key);
|
|
489
|
+
if (!control?.invalid)
|
|
490
|
+
return false;
|
|
491
|
+
// Check if this field has required validation
|
|
492
|
+
const column = allColumns.find((c) => c.name === key);
|
|
493
|
+
return (column?.validations?.some((v) => v.type === 'required') || false);
|
|
494
|
+
}).length;
|
|
495
|
+
// Only emit if there are required fields missing
|
|
496
|
+
if (invalidRequiredCount > 0) {
|
|
497
|
+
this.validationError.emit(`Please fill all required fields marked with *. ${invalidRequiredCount} field(s) need attention.`);
|
|
498
|
+
}
|
|
499
|
+
return;
|
|
500
|
+
}
|
|
501
|
+
const formData = this.form.getRawValue();
|
|
502
|
+
this.config.onSubmit(formData);
|
|
503
|
+
}
|
|
504
|
+
handleReset() {
|
|
505
|
+
this.submitted = false;
|
|
506
|
+
this.form.reset();
|
|
507
|
+
if (this.config.onReset) {
|
|
508
|
+
this.config.onReset();
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
isFieldInvalid(fieldName) {
|
|
512
|
+
const field = this.form.get(fieldName);
|
|
513
|
+
return !!(field && field.invalid && this.submitted);
|
|
514
|
+
}
|
|
515
|
+
getErrorMessage(fieldName) {
|
|
516
|
+
const field = this.form.get(fieldName);
|
|
517
|
+
if (!field?.errors)
|
|
518
|
+
return '';
|
|
519
|
+
// Check if there's a custom message from validations
|
|
520
|
+
const allColumns = this.config.sections.flatMap((s) => s.fields);
|
|
521
|
+
const column = allColumns.find((c) => c.name === fieldName);
|
|
522
|
+
// Check for custom validation error
|
|
523
|
+
if (field.errors['custom']) {
|
|
524
|
+
const customValidation = column?.validations?.find((v) => v.type === 'custom');
|
|
525
|
+
return customValidation?.message || 'Invalid field';
|
|
526
|
+
}
|
|
527
|
+
// Check if there's a custom message from validations
|
|
528
|
+
const errorKeys = Object.keys(field.errors);
|
|
529
|
+
for (const key of errorKeys) {
|
|
530
|
+
const validation = column?.validations?.find((v) => v.type === key);
|
|
531
|
+
if (validation?.message) {
|
|
532
|
+
return validation.message;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
// Default error messages
|
|
536
|
+
if (field.errors['required']) {
|
|
537
|
+
return `${column?.label} is required`;
|
|
538
|
+
}
|
|
539
|
+
if (field.errors['email'])
|
|
540
|
+
return 'Invalid email format';
|
|
541
|
+
if (field.errors['minlength'])
|
|
542
|
+
return `Minimum length is ${field.errors['minlength'].requiredLength}`;
|
|
543
|
+
if (field.errors['maxlength'])
|
|
544
|
+
return `Maximum length is ${field.errors['maxlength'].requiredLength}`;
|
|
545
|
+
if (field.errors['min'])
|
|
546
|
+
return `Minimum value is ${field.errors['min'].min}`;
|
|
547
|
+
if (field.errors['max'])
|
|
548
|
+
return `Maximum value is ${field.errors['max'].max}`;
|
|
549
|
+
if (field.errors['pattern'])
|
|
550
|
+
return 'Invalid format';
|
|
551
|
+
return 'Invalid field';
|
|
552
|
+
}
|
|
553
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AddUpdateFormComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
554
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AddUpdateFormComponent, isStandalone: true, selector: "lib-add-update-form", inputs: { config: "config" }, outputs: { validationError: "validationError" }, ngImport: i0, template: `
|
|
555
|
+
<div class="form-container">
|
|
556
|
+
<div class="form-header" *ngIf="config.formTitle">
|
|
557
|
+
<h2>{{ config.formTitle }}</h2>
|
|
558
|
+
</div>
|
|
559
|
+
|
|
560
|
+
<form [formGroup]="form" (ngSubmit)="handleSubmit()" class="dynamic-form">
|
|
561
|
+
<div *ngFor="let section of config.sections" class="form-section">
|
|
562
|
+
<h3 class="section-title" *ngIf="section.title">
|
|
563
|
+
{{ section.title }}
|
|
564
|
+
</h3>
|
|
565
|
+
|
|
566
|
+
<div class="fields-row">
|
|
567
|
+
<ng-container *ngFor="let column of section.fields">
|
|
568
|
+
<div
|
|
569
|
+
class="form-field-wrapper"
|
|
570
|
+
[ngClass]="'field-' + column.type"
|
|
571
|
+
[ngStyle]="column.hidden ? { display: 'none' } : {}"
|
|
572
|
+
[style.grid-column]="'span ' + (column.colSpan || 1)"
|
|
573
|
+
>
|
|
574
|
+
<ng-container
|
|
575
|
+
*ngIf="
|
|
576
|
+
['text', 'email', 'password'].includes(column.type) &&
|
|
577
|
+
!column.hidden
|
|
578
|
+
"
|
|
579
|
+
>
|
|
580
|
+
<fv-entry-field
|
|
581
|
+
[label]="column.label"
|
|
582
|
+
[placeholder]="column.placeholder || ''"
|
|
583
|
+
[type]="
|
|
584
|
+
column.type === 'password'
|
|
585
|
+
? 'password'
|
|
586
|
+
: column.type === 'email'
|
|
587
|
+
? 'email'
|
|
588
|
+
: 'text'
|
|
589
|
+
"
|
|
590
|
+
[control]="getControl(column.name)"
|
|
591
|
+
[schema]="getSchema(column)"
|
|
592
|
+
[disabled]="column.disabled || false"
|
|
593
|
+
[readonly]="false"
|
|
594
|
+
[allowAlphabetsOnly]="column.allowAlphabetsOnly || false"
|
|
595
|
+
[maxLength]="column.maxLength || null"
|
|
596
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
597
|
+
>
|
|
598
|
+
</fv-entry-field>
|
|
599
|
+
</ng-container>
|
|
600
|
+
|
|
601
|
+
<ng-container
|
|
602
|
+
*ngIf="column.type === 'number' && !column.hidden"
|
|
603
|
+
>
|
|
604
|
+
<fv-number-field
|
|
605
|
+
[label]="column.label"
|
|
606
|
+
[placeholder]="column.placeholder || ''"
|
|
607
|
+
[control]="getControl(column.name)"
|
|
608
|
+
[schema]="getSchema(column)"
|
|
609
|
+
[disabled]="column.disabled || false"
|
|
610
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
611
|
+
>
|
|
612
|
+
</fv-number-field>
|
|
613
|
+
</ng-container>
|
|
614
|
+
|
|
615
|
+
<ng-container
|
|
616
|
+
*ngIf="column.type === 'select' && !column.hidden"
|
|
617
|
+
>
|
|
618
|
+
<fv-dropdown
|
|
619
|
+
[label]="column.label"
|
|
620
|
+
[placeholder]="column.placeholder || 'Select option'"
|
|
621
|
+
[options]="column.options || []"
|
|
622
|
+
[control]="getControl(column.name)"
|
|
623
|
+
[schema]="getSchema(column)"
|
|
624
|
+
[disabled]="column.disabled || false"
|
|
625
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
626
|
+
>
|
|
627
|
+
</fv-dropdown>
|
|
628
|
+
</ng-container>
|
|
629
|
+
|
|
630
|
+
<ng-container
|
|
631
|
+
*ngIf="column.type === 'checkbox' && !column.hidden"
|
|
632
|
+
>
|
|
633
|
+
<fv-checkbox
|
|
634
|
+
[label]="column.label"
|
|
635
|
+
[control]="getControl(column.name)"
|
|
636
|
+
[disabled]="column.disabled || false"
|
|
637
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
638
|
+
>
|
|
639
|
+
</fv-checkbox>
|
|
640
|
+
</ng-container>
|
|
641
|
+
|
|
642
|
+
<ng-container *ngIf="column.type === 'radio' && !column.hidden">
|
|
643
|
+
<fv-radio-group
|
|
644
|
+
[label]="column.label"
|
|
645
|
+
[options]="column.options || []"
|
|
646
|
+
[control]="getControl(column.name)"
|
|
647
|
+
[disabled]="column.disabled || false"
|
|
648
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
649
|
+
>
|
|
650
|
+
</fv-radio-group>
|
|
651
|
+
</ng-container>
|
|
652
|
+
|
|
653
|
+
<ng-container *ngIf="column.type === 'date' && !column.hidden">
|
|
654
|
+
<fv-date-field
|
|
655
|
+
[label]="column.label"
|
|
656
|
+
[control]="getControl(column.name)"
|
|
657
|
+
[schema]="getSchema(column)"
|
|
658
|
+
[disabled]="column.disabled || false"
|
|
659
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
660
|
+
>
|
|
661
|
+
</fv-date-field>
|
|
662
|
+
</ng-container>
|
|
663
|
+
|
|
664
|
+
<ng-container
|
|
665
|
+
*ngIf="column.type === 'month-year' && !column.hidden"
|
|
666
|
+
>
|
|
667
|
+
<fv-month-year-field
|
|
668
|
+
[label]="column.label"
|
|
669
|
+
[control]="getControl(column.name)"
|
|
670
|
+
[schema]="getSchema(column)"
|
|
671
|
+
[disabled]="column.disabled || false"
|
|
672
|
+
(valueChange)="handleMonthYearChange(column.name, $event)"
|
|
673
|
+
>
|
|
674
|
+
</fv-month-year-field>
|
|
675
|
+
</ng-container>
|
|
676
|
+
|
|
677
|
+
<ng-container
|
|
678
|
+
*ngIf="column.type === 'textarea' && !column.hidden"
|
|
679
|
+
>
|
|
680
|
+
<fv-rich-text-editor
|
|
681
|
+
[label]="column.label"
|
|
682
|
+
[placeholder]="column.placeholder || ''"
|
|
683
|
+
[control]="getControl(column.name)"
|
|
684
|
+
[schema]="getSchema(column)"
|
|
685
|
+
[disabled]="column.disabled || false"
|
|
686
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
687
|
+
>
|
|
688
|
+
</fv-rich-text-editor>
|
|
689
|
+
</ng-container>
|
|
690
|
+
|
|
691
|
+
<ng-container *ngIf="column.type === 'file' && !column.hidden">
|
|
692
|
+
<ng-container *ngIf="isImageField(column); else standardFile">
|
|
693
|
+
<fv-image-selector
|
|
694
|
+
[label]="column.label"
|
|
695
|
+
[placeholder]="column.placeholder || 'Select image'"
|
|
696
|
+
[control]="getControl(column.name)"
|
|
697
|
+
[schema]="getSchema(column)"
|
|
698
|
+
[disabled]="column.disabled || false"
|
|
699
|
+
(valueChange)="onFileChange($event, column.name)"
|
|
700
|
+
>
|
|
701
|
+
</fv-image-selector>
|
|
702
|
+
</ng-container>
|
|
703
|
+
|
|
704
|
+
<ng-template #standardFile>
|
|
705
|
+
<fv-file-selector
|
|
706
|
+
[label]="column.label"
|
|
707
|
+
[placeholder]="column.placeholder || 'Select file'"
|
|
708
|
+
[accept]="column.accept || '*/*'"
|
|
709
|
+
[control]="getControl(column.name)"
|
|
710
|
+
[schema]="getSchema(column)"
|
|
711
|
+
[disabled]="column.disabled || false"
|
|
712
|
+
(valueChange)="onFileChange($event, column.name)"
|
|
713
|
+
>
|
|
714
|
+
</fv-file-selector>
|
|
715
|
+
</ng-template>
|
|
716
|
+
</ng-container>
|
|
717
|
+
|
|
718
|
+
<ng-container
|
|
719
|
+
*ngIf="column.type === 'name-code' && !column.hidden"
|
|
720
|
+
>
|
|
721
|
+
<fv-name-code
|
|
722
|
+
[label]="column.label"
|
|
723
|
+
[placeholder]="column.placeholder || 'Search by Code or Name'"
|
|
724
|
+
[options]="column.options ? mapSearchOptions(column.options) : []"
|
|
725
|
+
[control]="getControl(column.name)"
|
|
726
|
+
[schema]="getSchema(column)"
|
|
727
|
+
[disabled]="column.disabled || false"
|
|
728
|
+
>
|
|
729
|
+
</fv-name-code>
|
|
730
|
+
</ng-container>
|
|
731
|
+
|
|
732
|
+
<ng-container *ngIf="column.type === 'phone' && !column.hidden">
|
|
733
|
+
<fv-phone-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-phone-field>
|
|
734
|
+
</ng-container>
|
|
735
|
+
|
|
736
|
+
<ng-container *ngIf="column.type === 'uan' && !column.hidden">
|
|
737
|
+
<fv-uan-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-uan-field>
|
|
738
|
+
</ng-container>
|
|
739
|
+
|
|
740
|
+
<ng-container *ngIf="column.type === 'pf' && !column.hidden">
|
|
741
|
+
<fv-pf-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-pf-field>
|
|
742
|
+
</ng-container>
|
|
743
|
+
|
|
744
|
+
<ng-container *ngIf="column.type === 'esi' && !column.hidden">
|
|
745
|
+
<fv-esi-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-esi-field>
|
|
746
|
+
</ng-container>
|
|
747
|
+
|
|
748
|
+
<ng-container *ngIf="column.type === 'ifsc' && !column.hidden">
|
|
749
|
+
<fv-ifsc-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-ifsc-field>
|
|
750
|
+
</ng-container>
|
|
751
|
+
|
|
752
|
+
<ng-container *ngIf="column.type === 'micr' && !column.hidden">
|
|
753
|
+
<fv-micr-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-micr-field>
|
|
754
|
+
</ng-container>
|
|
755
|
+
|
|
756
|
+
<ng-container *ngIf="column.type === 'iban' && !column.hidden">
|
|
757
|
+
<fv-iban-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-iban-field>
|
|
758
|
+
</ng-container>
|
|
759
|
+
</div>
|
|
760
|
+
</ng-container>
|
|
761
|
+
</div>
|
|
762
|
+
</div>
|
|
763
|
+
|
|
764
|
+
|
|
765
|
+
<div class="form-actions">
|
|
766
|
+
<button
|
|
767
|
+
type="submit"
|
|
768
|
+
class="btn btn-primary"
|
|
769
|
+
[disabled]="form.invalid && submitted"
|
|
770
|
+
>
|
|
771
|
+
{{ config.submitLabel || 'Save' }}
|
|
772
|
+
</button>
|
|
773
|
+
<button
|
|
774
|
+
type="button"
|
|
775
|
+
class="btn btn-outline"
|
|
776
|
+
(click)="config.onCancel()"
|
|
777
|
+
>
|
|
778
|
+
{{ config.cancelLabel || 'Cancel' }}
|
|
779
|
+
</button>
|
|
780
|
+
</div>
|
|
781
|
+
</form>
|
|
782
|
+
</div>
|
|
783
|
+
`, isInline: true, styles: ["@import\"https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";*{font-family:Poppins!important}.form-container{background:#f5f5f5;padding:10px;border-radius:8px;margin:0 auto;max-width:100%;box-sizing:border-box}.error-border{border-color:red!important}.hidden{display:none!important}.form-header{margin-bottom:10px}.form-header h2{margin:0;font-size:20px;font-weight:700;color:#303030}.dynamic-form{background:#fff;padding:10px;border-radius:6px;box-shadow:0 1px 3px #0000001a;max-width:100%;box-sizing:border-box}.form-section{margin-bottom:10px}.section-title{font-size:16px;font-weight:700;color:#303030;margin:0 0 16px;text-transform:uppercase;letter-spacing:.5px}.fields-row{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;width:100%;box-sizing:border-box;overflow:visible}.form-field-wrapper{display:flex;position:relative;flex-direction:column;min-width:0;width:100%;box-sizing:border-box;overflow:visible}.password-toggle-btn{position:absolute;right:10px;top:32px;background:none;border:none;cursor:pointer;padding:4px;color:#666}.password-toggle-btn:hover{color:#333}.password-toggle-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}@media (min-width: 1200px) and (max-width: 1400px){.fields-row{grid-template-columns:repeat(5,1fr)}.form-control{width:180px;max-width:180px}}@media (max-width: 1200px){.fields-row{grid-template-columns:repeat(3,1fr)}.form-control{width:100%;max-width:100%}}@media (max-width: 992px){.fields-row{grid-template-columns:repeat(2,1fr);gap:12px}}@media (max-width: 768px){.fields-row{grid-template-columns:repeat(2,1fr);gap:10px}}@media (max-width: 640px){.fields-row{grid-template-columns:1fr;gap:12px}.form-field-wrapper{width:100%}}label{font-weight:600;margin-bottom:6px;color:#151d48;font-size:14px}.required{color:#e74c3c;margin-left:2px}.form-control{padding:5px 10px;width:100%;max-width:100%;border:1px solid #8CBBA8;border-radius:8px;background-color:#fff;font-size:14px;font-weight:400;font-family:inherit;color:#1f2b41;transition:border-color .2s,box-shadow .2s;box-sizing:border-box}.form-control:focus{outline:none;border-color:#3498db;box-shadow:0 0 0 3px #3498db1a}.form-control:disabled{background-color:#ecf0f1;cursor:not-allowed}textarea.form-control{resize:vertical;min-height:100px}select.form-control{cursor:pointer;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23333' d='M6 9L1 4h10z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;padding-right:40px}.checkbox-wrapper{display:flex;align-items:center;gap:8px}input[type=checkbox]{width:18px;height:18px;cursor:pointer}.checkbox-label{cursor:pointer;margin:0}.file-upload-container{display:flex;align-items:center;gap:20px;padding:20px;background:#fff;max-width:100%;box-sizing:border-box;flex-wrap:wrap}.material-icons{font-family:Material Icons!important;border-radius:4px;display:inline-block;width:40px;padding:8px;height:40px}.file-field-wrapper{width:100%;margin-top:16px;max-width:100%;box-sizing:border-box}.photo-preview-circle{width:100px;height:100px;border-radius:50%;overflow:hidden;border:2px solid #ddd;cursor:pointer;transition:border-color .2s}.photo-preview-circle:hover{border-color:#3498db}.preview-image,.default-photo{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.preview-image img{width:100%;height:100%;object-fit:cover}.default-photo{background:#f0f0f0;color:#999;font-size:40px}.file-info{display:flex;flex-direction:column;gap:8px}.btn-delete{border:none;border-radius:4px;cursor:pointer;font-size:14px;padding:0}.upload-btn-group{display:flex;align-items:center;border:1px solid #d3d3d3;border-radius:8px;background:#fff;overflow:hidden;width:fit-content}.btn-upload{background:#fff;color:#222;border:none;padding:0 18px;font-size:16px;border-right:1px solid #e0e0e0;border-radius:8px 0 0 8px;outline:none;box-shadow:none;cursor:pointer;height:40px;transition:background .2s}.btn-upload-icon{background:#f5f5f5;border:none;border-radius:0 8px 8px 0;display:flex;align-items:center;justify-content:center;width:48px;height:40px;cursor:pointer;transition:background .2s}.btn-upload-icon i.material-icons{font-size:22px;color:#222}.btn-upload:hover,.btn-upload-icon:hover{background:#f0f0f0}.btn-delete{background:#fff;color:red}.btn-delete:hover{background:#f0f0f0}.file-name{font-size:12px;color:#666;margin:10px 8px 8px}.file-label{font-weight:600;margin-bottom:6px;color:#151d48;font-size:14px;display:block}.radio-label{font-weight:600;margin-bottom:15px;color:#151d48;font-size:14px;display:block}.radio-group{display:flex;gap:20px;align-items:center}.radio-item{display:flex;align-items:center;gap:6px}input[type=radio]{width:18px;height:18px;cursor:pointer;accent-color:#3498db}.radio-option-label{cursor:pointer;margin:0;font-weight:400}.hint{font-size:12px;color:#7f8c8d;margin-top:4px}.error-message{color:#e74c3c;font-size:12px;margin-top:4px}.form-actions{display:flex;gap:8px;align-items:center;justify-content:space-between;gap:12px;padding-top:5px}.btn{padding:8px 20px;border:none;border-radius:7px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s}.btn-primary{background-color:#006aff;color:#fff}.btn-primary:hover:not(:disabled){background-color:#2980b9}.btn-primary:disabled{background-color:#bdc3c7;cursor:not-allowed}.btn-secondary{background-color:#95a5a6;color:#fff}.btn-secondary:hover{background-color:#7f8c8d}.btn-outline{background-color:#303030;color:#fff}.btn-outline:hover{background-color:#2b2b2b;color:#fff}.month-year-wrapper{position:relative;display:flex;align-items:center;width:100%}.month-year-wrapper .form-control{padding-right:45px}.month-picker-hidden{position:absolute;opacity:0;pointer-events:none;width:0;height:0;border:none;padding:0;margin:0}.month-picker-btn{position:absolute;right:5px;background:transparent;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;color:#666;transition:color .2s;z-index:1}.month-picker-btn:hover:not(:disabled){color:#3498db}.month-picker-btn:disabled{cursor:not-allowed;opacity:.5}.month-picker-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}.search-select-wrapper{position:relative;width:100%}.search-select-input{padding-right:10px}.search-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:auto;min-width:100%;max-width:calc(100vw - 16px);background:#fff;border:1px solid #d3d3d3;border-radius:8px;max-height:220px;overflow-y:auto;box-shadow:0 4px 10px #00000014;z-index:5;padding:6px 0;transform:translate(0);transition:transform .1s ease-out}.search-select-option{padding:8px 12px;cursor:pointer;display:flex;gap:8px;align-items:center;border-bottom:1px solid #f2f2f2}.search-select-option:last-child{border-bottom:none}.search-select-option:hover{background:#f5f9ff}.option-code{color:#0052cc;font-weight:700;min-width:90px}.option-name{color:#151d48;font-weight:500}.time-picker-wrapper{position:relative;display:flex;align-items:center;width:100%}.time-input{padding-right:45px;flex:1}.time-picker-btn{position:absolute;right:5px;background:transparent;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;color:#666;transition:color .2s;z-index:1}.time-picker-btn:hover:not(:disabled){color:#3498db}.time-picker-btn:disabled{cursor:not-allowed;opacity:.5}.time-picker-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}input[type=time]{cursor:pointer}input[type=time]::-webkit-calendar-picker-indicator{cursor:pointer;opacity:0;position:absolute;right:0;width:100%;height:100%}.date-picker-field{width:100%}.date-picker-field ::ng-deep .mat-mdc-form-field{width:100%}.date-picker-field ::ng-deep .mat-mdc-text-field-wrapper{background-color:#fff}.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__trailing{border-color:#8cbba8}.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__trailing{border-color:#8cbba8}.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__trailing{border-color:#3498db}.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__leading,.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__notch,.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__trailing{border-color:red!important}.date-picker-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.date-picker-field ::ng-deep .mat-mdc-form-field-input-control input{font-family:Poppins!important;font-size:14px;font-weight:400;color:#1f2b41}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FvEntryFieldComponent, selector: "fv-entry-field", inputs: ["label", "placeholder", "schema", "control", "disabled", "readonly", "type", "allowAlphabetsOnly", "maxLength"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvNumberFieldComponent, selector: "fv-number-field", inputs: ["label", "placeholder", "schema", "control", "disabled", "readonly", "min", "max", "step"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvDropdownComponent, selector: "fv-dropdown", inputs: ["label", "placeholder", "options", "schema", "control", "disabled"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvRadioGroupComponent, selector: "fv-radio-group", inputs: ["label", "control", "options", "disabled", "required", "name"], outputs: ["valueChange"] }, { kind: "component", type: FvCheckboxComponent, selector: "fv-checkbox", inputs: ["label", "control", "disabled", "required"], outputs: ["valueChange"] }, { kind: "component", type: FvDateFieldComponent, selector: "fv-date-field", inputs: ["label", "schema", "control", "disabled", "readonly", "min", "max"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvMonthYearFieldComponent, selector: "fv-month-year-field", inputs: ["label", "schema", "control", "disabled", "readonly", "min", "max"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvFileSelectorComponent, selector: "fv-file-selector", inputs: ["label", "placeholder", "schema", "control", "disabled", "accept", "maxSize"], outputs: ["valueChange", "blur"] }, { kind: "component", type: FvImageSelectorComponent, selector: "fv-image-selector", inputs: ["label", "placeholder", "schema", "control", "disabled", "maxSize"], outputs: ["valueChange", "blur"] }, { kind: "component", type: FvRichTextEditorComponent, selector: "fv-rich-text-editor", inputs: ["label", "placeholder", "schema", "control", "disabled", "readonly", "minHeight", "showToolbar"], outputs: ["valueChange", "blur", "focus"] }, { kind: "component", type: FvNameCodeComponent, selector: "fv-name-code", inputs: ["label", "placeholder", "options", "schema", "control", "disabled"], outputs: ["selectionChange"] }, { kind: "component", type: FvPhoneFieldComponent, selector: "fv-phone-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvUanFieldComponent, selector: "fv-uan-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvPfFieldComponent, selector: "fv-pf-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvEsiFieldComponent, selector: "fv-esi-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvIfscFieldComponent, selector: "fv-ifsc-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvMicrFieldComponent, selector: "fv-micr-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }, { kind: "component", type: FvIbanFieldComponent, selector: "fv-iban-field", inputs: ["label", "control", "disabled", "schema"], outputs: ["blur", "focus"] }] });
|
|
784
|
+
}
|
|
785
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AddUpdateFormComponent, decorators: [{
|
|
786
|
+
type: Component,
|
|
787
|
+
args: [{ selector: 'lib-add-update-form', standalone: true, imports: [
|
|
788
|
+
CommonModule,
|
|
789
|
+
ReactiveFormsModule,
|
|
790
|
+
FvEntryFieldComponent,
|
|
791
|
+
FvNumberFieldComponent,
|
|
792
|
+
FvDropdownComponent,
|
|
793
|
+
FvRadioGroupComponent,
|
|
794
|
+
FvCheckboxComponent,
|
|
795
|
+
FvDateFieldComponent,
|
|
796
|
+
FvMonthYearFieldComponent,
|
|
797
|
+
FvFileSelectorComponent,
|
|
798
|
+
FvImageSelectorComponent,
|
|
799
|
+
FvRichTextEditorComponent,
|
|
800
|
+
FvRichTextEditorComponent,
|
|
801
|
+
FvNameCodeComponent,
|
|
802
|
+
FvPhoneFieldComponent,
|
|
803
|
+
FvUanFieldComponent,
|
|
804
|
+
FvPfFieldComponent,
|
|
805
|
+
FvEsiFieldComponent,
|
|
806
|
+
FvIfscFieldComponent,
|
|
807
|
+
FvMicrFieldComponent,
|
|
808
|
+
FvIbanFieldComponent,
|
|
809
|
+
], template: `
|
|
810
|
+
<div class="form-container">
|
|
811
|
+
<div class="form-header" *ngIf="config.formTitle">
|
|
812
|
+
<h2>{{ config.formTitle }}</h2>
|
|
813
|
+
</div>
|
|
814
|
+
|
|
815
|
+
<form [formGroup]="form" (ngSubmit)="handleSubmit()" class="dynamic-form">
|
|
816
|
+
<div *ngFor="let section of config.sections" class="form-section">
|
|
817
|
+
<h3 class="section-title" *ngIf="section.title">
|
|
818
|
+
{{ section.title }}
|
|
819
|
+
</h3>
|
|
820
|
+
|
|
821
|
+
<div class="fields-row">
|
|
822
|
+
<ng-container *ngFor="let column of section.fields">
|
|
823
|
+
<div
|
|
824
|
+
class="form-field-wrapper"
|
|
825
|
+
[ngClass]="'field-' + column.type"
|
|
826
|
+
[ngStyle]="column.hidden ? { display: 'none' } : {}"
|
|
827
|
+
[style.grid-column]="'span ' + (column.colSpan || 1)"
|
|
828
|
+
>
|
|
829
|
+
<ng-container
|
|
830
|
+
*ngIf="
|
|
831
|
+
['text', 'email', 'password'].includes(column.type) &&
|
|
832
|
+
!column.hidden
|
|
833
|
+
"
|
|
834
|
+
>
|
|
835
|
+
<fv-entry-field
|
|
836
|
+
[label]="column.label"
|
|
837
|
+
[placeholder]="column.placeholder || ''"
|
|
838
|
+
[type]="
|
|
839
|
+
column.type === 'password'
|
|
840
|
+
? 'password'
|
|
841
|
+
: column.type === 'email'
|
|
842
|
+
? 'email'
|
|
843
|
+
: 'text'
|
|
844
|
+
"
|
|
845
|
+
[control]="getControl(column.name)"
|
|
846
|
+
[schema]="getSchema(column)"
|
|
847
|
+
[disabled]="column.disabled || false"
|
|
848
|
+
[readonly]="false"
|
|
849
|
+
[allowAlphabetsOnly]="column.allowAlphabetsOnly || false"
|
|
850
|
+
[maxLength]="column.maxLength || null"
|
|
851
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
852
|
+
>
|
|
853
|
+
</fv-entry-field>
|
|
854
|
+
</ng-container>
|
|
855
|
+
|
|
856
|
+
<ng-container
|
|
857
|
+
*ngIf="column.type === 'number' && !column.hidden"
|
|
858
|
+
>
|
|
859
|
+
<fv-number-field
|
|
860
|
+
[label]="column.label"
|
|
861
|
+
[placeholder]="column.placeholder || ''"
|
|
862
|
+
[control]="getControl(column.name)"
|
|
863
|
+
[schema]="getSchema(column)"
|
|
864
|
+
[disabled]="column.disabled || false"
|
|
865
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
866
|
+
>
|
|
867
|
+
</fv-number-field>
|
|
868
|
+
</ng-container>
|
|
869
|
+
|
|
870
|
+
<ng-container
|
|
871
|
+
*ngIf="column.type === 'select' && !column.hidden"
|
|
872
|
+
>
|
|
873
|
+
<fv-dropdown
|
|
874
|
+
[label]="column.label"
|
|
875
|
+
[placeholder]="column.placeholder || 'Select option'"
|
|
876
|
+
[options]="column.options || []"
|
|
877
|
+
[control]="getControl(column.name)"
|
|
878
|
+
[schema]="getSchema(column)"
|
|
879
|
+
[disabled]="column.disabled || false"
|
|
880
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
881
|
+
>
|
|
882
|
+
</fv-dropdown>
|
|
883
|
+
</ng-container>
|
|
884
|
+
|
|
885
|
+
<ng-container
|
|
886
|
+
*ngIf="column.type === 'checkbox' && !column.hidden"
|
|
887
|
+
>
|
|
888
|
+
<fv-checkbox
|
|
889
|
+
[label]="column.label"
|
|
890
|
+
[control]="getControl(column.name)"
|
|
891
|
+
[disabled]="column.disabled || false"
|
|
892
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
893
|
+
>
|
|
894
|
+
</fv-checkbox>
|
|
895
|
+
</ng-container>
|
|
896
|
+
|
|
897
|
+
<ng-container *ngIf="column.type === 'radio' && !column.hidden">
|
|
898
|
+
<fv-radio-group
|
|
899
|
+
[label]="column.label"
|
|
900
|
+
[options]="column.options || []"
|
|
901
|
+
[control]="getControl(column.name)"
|
|
902
|
+
[disabled]="column.disabled || false"
|
|
903
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
904
|
+
>
|
|
905
|
+
</fv-radio-group>
|
|
906
|
+
</ng-container>
|
|
907
|
+
|
|
908
|
+
<ng-container *ngIf="column.type === 'date' && !column.hidden">
|
|
909
|
+
<fv-date-field
|
|
910
|
+
[label]="column.label"
|
|
911
|
+
[control]="getControl(column.name)"
|
|
912
|
+
[schema]="getSchema(column)"
|
|
913
|
+
[disabled]="column.disabled || false"
|
|
914
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
915
|
+
>
|
|
916
|
+
</fv-date-field>
|
|
917
|
+
</ng-container>
|
|
918
|
+
|
|
919
|
+
<ng-container
|
|
920
|
+
*ngIf="column.type === 'month-year' && !column.hidden"
|
|
921
|
+
>
|
|
922
|
+
<fv-month-year-field
|
|
923
|
+
[label]="column.label"
|
|
924
|
+
[control]="getControl(column.name)"
|
|
925
|
+
[schema]="getSchema(column)"
|
|
926
|
+
[disabled]="column.disabled || false"
|
|
927
|
+
(valueChange)="handleMonthYearChange(column.name, $event)"
|
|
928
|
+
>
|
|
929
|
+
</fv-month-year-field>
|
|
930
|
+
</ng-container>
|
|
931
|
+
|
|
932
|
+
<ng-container
|
|
933
|
+
*ngIf="column.type === 'textarea' && !column.hidden"
|
|
934
|
+
>
|
|
935
|
+
<fv-rich-text-editor
|
|
936
|
+
[label]="column.label"
|
|
937
|
+
[placeholder]="column.placeholder || ''"
|
|
938
|
+
[control]="getControl(column.name)"
|
|
939
|
+
[schema]="getSchema(column)"
|
|
940
|
+
[disabled]="column.disabled || false"
|
|
941
|
+
(valueChange)="handleFieldChange(column.name, $event)"
|
|
942
|
+
>
|
|
943
|
+
</fv-rich-text-editor>
|
|
944
|
+
</ng-container>
|
|
945
|
+
|
|
946
|
+
<ng-container *ngIf="column.type === 'file' && !column.hidden">
|
|
947
|
+
<ng-container *ngIf="isImageField(column); else standardFile">
|
|
948
|
+
<fv-image-selector
|
|
949
|
+
[label]="column.label"
|
|
950
|
+
[placeholder]="column.placeholder || 'Select image'"
|
|
951
|
+
[control]="getControl(column.name)"
|
|
952
|
+
[schema]="getSchema(column)"
|
|
953
|
+
[disabled]="column.disabled || false"
|
|
954
|
+
(valueChange)="onFileChange($event, column.name)"
|
|
955
|
+
>
|
|
956
|
+
</fv-image-selector>
|
|
957
|
+
</ng-container>
|
|
958
|
+
|
|
959
|
+
<ng-template #standardFile>
|
|
960
|
+
<fv-file-selector
|
|
961
|
+
[label]="column.label"
|
|
962
|
+
[placeholder]="column.placeholder || 'Select file'"
|
|
963
|
+
[accept]="column.accept || '*/*'"
|
|
964
|
+
[control]="getControl(column.name)"
|
|
965
|
+
[schema]="getSchema(column)"
|
|
966
|
+
[disabled]="column.disabled || false"
|
|
967
|
+
(valueChange)="onFileChange($event, column.name)"
|
|
968
|
+
>
|
|
969
|
+
</fv-file-selector>
|
|
970
|
+
</ng-template>
|
|
971
|
+
</ng-container>
|
|
972
|
+
|
|
973
|
+
<ng-container
|
|
974
|
+
*ngIf="column.type === 'name-code' && !column.hidden"
|
|
975
|
+
>
|
|
976
|
+
<fv-name-code
|
|
977
|
+
[label]="column.label"
|
|
978
|
+
[placeholder]="column.placeholder || 'Search by Code or Name'"
|
|
979
|
+
[options]="column.options ? mapSearchOptions(column.options) : []"
|
|
980
|
+
[control]="getControl(column.name)"
|
|
981
|
+
[schema]="getSchema(column)"
|
|
982
|
+
[disabled]="column.disabled || false"
|
|
983
|
+
>
|
|
984
|
+
</fv-name-code>
|
|
985
|
+
</ng-container>
|
|
986
|
+
|
|
987
|
+
<ng-container *ngIf="column.type === 'phone' && !column.hidden">
|
|
988
|
+
<fv-phone-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-phone-field>
|
|
989
|
+
</ng-container>
|
|
990
|
+
|
|
991
|
+
<ng-container *ngIf="column.type === 'uan' && !column.hidden">
|
|
992
|
+
<fv-uan-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-uan-field>
|
|
993
|
+
</ng-container>
|
|
994
|
+
|
|
995
|
+
<ng-container *ngIf="column.type === 'pf' && !column.hidden">
|
|
996
|
+
<fv-pf-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-pf-field>
|
|
997
|
+
</ng-container>
|
|
998
|
+
|
|
999
|
+
<ng-container *ngIf="column.type === 'esi' && !column.hidden">
|
|
1000
|
+
<fv-esi-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-esi-field>
|
|
1001
|
+
</ng-container>
|
|
1002
|
+
|
|
1003
|
+
<ng-container *ngIf="column.type === 'ifsc' && !column.hidden">
|
|
1004
|
+
<fv-ifsc-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-ifsc-field>
|
|
1005
|
+
</ng-container>
|
|
1006
|
+
|
|
1007
|
+
<ng-container *ngIf="column.type === 'micr' && !column.hidden">
|
|
1008
|
+
<fv-micr-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-micr-field>
|
|
1009
|
+
</ng-container>
|
|
1010
|
+
|
|
1011
|
+
<ng-container *ngIf="column.type === 'iban' && !column.hidden">
|
|
1012
|
+
<fv-iban-field [label]="column.label" [control]="getControl(column.name)" [schema]="getSchema(column)" [disabled]="column.disabled || false"></fv-iban-field>
|
|
1013
|
+
</ng-container>
|
|
1014
|
+
</div>
|
|
1015
|
+
</ng-container>
|
|
1016
|
+
</div>
|
|
1017
|
+
</div>
|
|
1018
|
+
|
|
1019
|
+
|
|
1020
|
+
<div class="form-actions">
|
|
1021
|
+
<button
|
|
1022
|
+
type="submit"
|
|
1023
|
+
class="btn btn-primary"
|
|
1024
|
+
[disabled]="form.invalid && submitted"
|
|
1025
|
+
>
|
|
1026
|
+
{{ config.submitLabel || 'Save' }}
|
|
1027
|
+
</button>
|
|
1028
|
+
<button
|
|
1029
|
+
type="button"
|
|
1030
|
+
class="btn btn-outline"
|
|
1031
|
+
(click)="config.onCancel()"
|
|
1032
|
+
>
|
|
1033
|
+
{{ config.cancelLabel || 'Cancel' }}
|
|
1034
|
+
</button>
|
|
1035
|
+
</div>
|
|
1036
|
+
</form>
|
|
1037
|
+
</div>
|
|
1038
|
+
`, styles: ["@import\"https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";*{font-family:Poppins!important}.form-container{background:#f5f5f5;padding:10px;border-radius:8px;margin:0 auto;max-width:100%;box-sizing:border-box}.error-border{border-color:red!important}.hidden{display:none!important}.form-header{margin-bottom:10px}.form-header h2{margin:0;font-size:20px;font-weight:700;color:#303030}.dynamic-form{background:#fff;padding:10px;border-radius:6px;box-shadow:0 1px 3px #0000001a;max-width:100%;box-sizing:border-box}.form-section{margin-bottom:10px}.section-title{font-size:16px;font-weight:700;color:#303030;margin:0 0 16px;text-transform:uppercase;letter-spacing:.5px}.fields-row{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;width:100%;box-sizing:border-box;overflow:visible}.form-field-wrapper{display:flex;position:relative;flex-direction:column;min-width:0;width:100%;box-sizing:border-box;overflow:visible}.password-toggle-btn{position:absolute;right:10px;top:32px;background:none;border:none;cursor:pointer;padding:4px;color:#666}.password-toggle-btn:hover{color:#333}.password-toggle-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}@media (min-width: 1200px) and (max-width: 1400px){.fields-row{grid-template-columns:repeat(5,1fr)}.form-control{width:180px;max-width:180px}}@media (max-width: 1200px){.fields-row{grid-template-columns:repeat(3,1fr)}.form-control{width:100%;max-width:100%}}@media (max-width: 992px){.fields-row{grid-template-columns:repeat(2,1fr);gap:12px}}@media (max-width: 768px){.fields-row{grid-template-columns:repeat(2,1fr);gap:10px}}@media (max-width: 640px){.fields-row{grid-template-columns:1fr;gap:12px}.form-field-wrapper{width:100%}}label{font-weight:600;margin-bottom:6px;color:#151d48;font-size:14px}.required{color:#e74c3c;margin-left:2px}.form-control{padding:5px 10px;width:100%;max-width:100%;border:1px solid #8CBBA8;border-radius:8px;background-color:#fff;font-size:14px;font-weight:400;font-family:inherit;color:#1f2b41;transition:border-color .2s,box-shadow .2s;box-sizing:border-box}.form-control:focus{outline:none;border-color:#3498db;box-shadow:0 0 0 3px #3498db1a}.form-control:disabled{background-color:#ecf0f1;cursor:not-allowed}textarea.form-control{resize:vertical;min-height:100px}select.form-control{cursor:pointer;appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23333' d='M6 9L1 4h10z'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 8px center;padding-right:40px}.checkbox-wrapper{display:flex;align-items:center;gap:8px}input[type=checkbox]{width:18px;height:18px;cursor:pointer}.checkbox-label{cursor:pointer;margin:0}.file-upload-container{display:flex;align-items:center;gap:20px;padding:20px;background:#fff;max-width:100%;box-sizing:border-box;flex-wrap:wrap}.material-icons{font-family:Material Icons!important;border-radius:4px;display:inline-block;width:40px;padding:8px;height:40px}.file-field-wrapper{width:100%;margin-top:16px;max-width:100%;box-sizing:border-box}.photo-preview-circle{width:100px;height:100px;border-radius:50%;overflow:hidden;border:2px solid #ddd;cursor:pointer;transition:border-color .2s}.photo-preview-circle:hover{border-color:#3498db}.preview-image,.default-photo{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.preview-image img{width:100%;height:100%;object-fit:cover}.default-photo{background:#f0f0f0;color:#999;font-size:40px}.file-info{display:flex;flex-direction:column;gap:8px}.btn-delete{border:none;border-radius:4px;cursor:pointer;font-size:14px;padding:0}.upload-btn-group{display:flex;align-items:center;border:1px solid #d3d3d3;border-radius:8px;background:#fff;overflow:hidden;width:fit-content}.btn-upload{background:#fff;color:#222;border:none;padding:0 18px;font-size:16px;border-right:1px solid #e0e0e0;border-radius:8px 0 0 8px;outline:none;box-shadow:none;cursor:pointer;height:40px;transition:background .2s}.btn-upload-icon{background:#f5f5f5;border:none;border-radius:0 8px 8px 0;display:flex;align-items:center;justify-content:center;width:48px;height:40px;cursor:pointer;transition:background .2s}.btn-upload-icon i.material-icons{font-size:22px;color:#222}.btn-upload:hover,.btn-upload-icon:hover{background:#f0f0f0}.btn-delete{background:#fff;color:red}.btn-delete:hover{background:#f0f0f0}.file-name{font-size:12px;color:#666;margin:10px 8px 8px}.file-label{font-weight:600;margin-bottom:6px;color:#151d48;font-size:14px;display:block}.radio-label{font-weight:600;margin-bottom:15px;color:#151d48;font-size:14px;display:block}.radio-group{display:flex;gap:20px;align-items:center}.radio-item{display:flex;align-items:center;gap:6px}input[type=radio]{width:18px;height:18px;cursor:pointer;accent-color:#3498db}.radio-option-label{cursor:pointer;margin:0;font-weight:400}.hint{font-size:12px;color:#7f8c8d;margin-top:4px}.error-message{color:#e74c3c;font-size:12px;margin-top:4px}.form-actions{display:flex;gap:8px;align-items:center;justify-content:space-between;gap:12px;padding-top:5px}.btn{padding:8px 20px;border:none;border-radius:7px;font-size:12px;font-weight:600;cursor:pointer;transition:all .2s}.btn-primary{background-color:#006aff;color:#fff}.btn-primary:hover:not(:disabled){background-color:#2980b9}.btn-primary:disabled{background-color:#bdc3c7;cursor:not-allowed}.btn-secondary{background-color:#95a5a6;color:#fff}.btn-secondary:hover{background-color:#7f8c8d}.btn-outline{background-color:#303030;color:#fff}.btn-outline:hover{background-color:#2b2b2b;color:#fff}.month-year-wrapper{position:relative;display:flex;align-items:center;width:100%}.month-year-wrapper .form-control{padding-right:45px}.month-picker-hidden{position:absolute;opacity:0;pointer-events:none;width:0;height:0;border:none;padding:0;margin:0}.month-picker-btn{position:absolute;right:5px;background:transparent;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;color:#666;transition:color .2s;z-index:1}.month-picker-btn:hover:not(:disabled){color:#3498db}.month-picker-btn:disabled{cursor:not-allowed;opacity:.5}.month-picker-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}.search-select-wrapper{position:relative;width:100%}.search-select-input{padding-right:10px}.search-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:auto;min-width:100%;max-width:calc(100vw - 16px);background:#fff;border:1px solid #d3d3d3;border-radius:8px;max-height:220px;overflow-y:auto;box-shadow:0 4px 10px #00000014;z-index:5;padding:6px 0;transform:translate(0);transition:transform .1s ease-out}.search-select-option{padding:8px 12px;cursor:pointer;display:flex;gap:8px;align-items:center;border-bottom:1px solid #f2f2f2}.search-select-option:last-child{border-bottom:none}.search-select-option:hover{background:#f5f9ff}.option-code{color:#0052cc;font-weight:700;min-width:90px}.option-name{color:#151d48;font-weight:500}.time-picker-wrapper{position:relative;display:flex;align-items:center;width:100%}.time-input{padding-right:45px;flex:1}.time-picker-btn{position:absolute;right:5px;background:transparent;border:none;cursor:pointer;padding:5px;display:flex;align-items:center;justify-content:center;color:#666;transition:color .2s;z-index:1}.time-picker-btn:hover:not(:disabled){color:#3498db}.time-picker-btn:disabled{cursor:not-allowed;opacity:.5}.time-picker-btn .material-icons{font-size:20px;width:auto;height:auto;padding:0}input[type=time]{cursor:pointer}input[type=time]::-webkit-calendar-picker-indicator{cursor:pointer;opacity:0;position:absolute;right:0;width:100%;height:100%}.date-picker-field{width:100%}.date-picker-field ::ng-deep .mat-mdc-form-field{width:100%}.date-picker-field ::ng-deep .mat-mdc-text-field-wrapper{background-color:#fff}.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__trailing{border-color:#8cbba8}.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-notched-outline__trailing{border-color:#8cbba8}.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__leading,.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__notch,.date-picker-field ::ng-deep .mdc-text-field--outlined.mdc-text-field--focused .mdc-notched-outline__trailing{border-color:#3498db}.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__leading,.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__notch,.date-picker-field.error-border ::ng-deep .mdc-text-field--outlined .mdc-notched-outline__trailing{border-color:red!important}.date-picker-field ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.date-picker-field ::ng-deep .mat-mdc-form-field-input-control input{font-family:Poppins!important;font-size:14px;font-weight:400;color:#1f2b41}\n"] }]
|
|
1039
|
+
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i0.ElementRef }], propDecorators: { config: [{
|
|
1040
|
+
type: Input
|
|
1041
|
+
}], validationError: [{
|
|
1042
|
+
type: Output
|
|
1043
|
+
}] } });
|
|
1044
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLXVwZGF0ZS1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Z2LWNvbnRyb2xzL3NyYy9saWIvYWRkLXVwZGF0ZS1mb3JtL2FkZC11cGRhdGUtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNEVBLCtCQUErQjtBQUMvQixPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUlQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBS0wsbUJBQW1CLEVBQ25CLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELDhCQUE4QjtBQUM5QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM1RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNqRyxPQUFPLEVBQUUs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QUFNIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgRmllbGRUeXBlID1cclxuICB8ICd0ZXh0J1xyXG4gIHwgJ2VtYWlsJ1xyXG4gIHwgJ251bWJlcidcclxuICB8ICdzZWxlY3QnXHJcbiAgfCAnbmFtZS1jb2RlJ1xyXG4gIHwgJ2NoZWNrYm94J1xyXG4gIHwgJ3RleHRhcmVhJ1xyXG4gIHwgJ2RhdGUnXHJcbiAgfCAncGFzc3dvcmQnXHJcbiAgfCAncmFkaW8nXHJcbiAgfCAnZmlsZSdcclxuICB8ICdtb250aC15ZWFyJ1xyXG4gIHwgJ3Bob25lJ1xyXG4gIHwgJ3VhbidcclxuICB8ICdwZidcclxuICB8ICdlc2knXHJcbiAgfCAnaWZzYydcclxuICB8ICdtaWNyJ1xyXG4gIHwgJ2liYW4nO1xyXG5leHBvcnQgdHlwZSBWYWxpZGF0aW9uVHlwZSA9XHJcbiAgfCAncmVxdWlyZWQnXHJcbiAgfCAnZW1haWwnXHJcbiAgfCAnbWluTGVuZ3RoJ1xyXG4gIHwgJ21heExlbmd0aCdcclxuICB8ICdwYXR0ZXJuJ1xyXG4gIHwgJ21pbidcclxuICB8ICdtYXgnXHJcbiAgfCAnY3VzdG9tJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRWYWxpZGF0aW9uIHtcclxuICB0eXBlOiBWYWxpZGF0aW9uVHlwZTtcclxuICB2YWx1ZT86IGFueTsgLy8gRm9yIG1pbkxlbmd0aCwgbWF4TGVuZ3RoLCBtaW4sIG1heCwgcGF0dGVyblxyXG4gIG1lc3NhZ2U/OiBzdHJpbmc7IC8vIEN1c3RvbSBlcnJvciBtZXNzYWdlXHJcbiAgdmFsaWRhdG9yPzogKHZhbHVlOiBhbnksIGZvcm1Hcm91cD86IEZvcm1Hcm91cCkgPT4gYm9vbGVhbjsgLy8gRm9yIGN1c3RvbSB2YWxpZGF0aW9uXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbHVtbiB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdHlwZTogRmllbGRUeXBlO1xyXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xyXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcclxuICBvcHRpb25zPzogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogYW55IH1bXTsgLy8gRm9yIHNlbGVjdCBmaWVsZHNcclxuICB2YWxpZGF0aW9ucz86IEZpZWxkVmFsaWRhdGlvbltdO1xyXG4gIHZhbHVlPzogYW55OyAvLyBEZWZhdWx0IHZhbHVlXHJcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xyXG4gIGNsYXNzTmFtZT86IHN0cmluZztcclxuICBoaWRkZW4/OiBib29sZWFuO1xyXG4gIGhpbnQ/OiBzdHJpbmc7XHJcbiAgY29sU3Bhbj86IG51bWJlcjtcclxuICBvbkNoYW5nZT86ICh2YWx1ZTogYW55LCBmb3JtR3JvdXA6IEZvcm1Hcm91cCkgPT4gdm9pZDtcclxuICBhY2NlcHQ/OiBzdHJpbmc7IC8vIEZvciBmaWxlIGlucHV0IChlLmcuLCAnaW1hZ2UvKicpXHJcbiAgZmlsZVByZXZpZXc/OiBib29sZWFuOyAvLyBTaG93IGltYWdlIHByZXZpZXdgXHJcbiAgc2hvd1RpbWVQaWNrZXI/OiBib29sZWFuOyAvLyBTaG93IHRpbWUgcGlja2VyIGZvciB0ZXh0IGZpZWxkc1xyXG4gIGFsbG93QWxwaGFiZXRzT25seT86IGJvb2xlYW47XHJcbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1TZWN0aW9uIHtcclxuICB0aXRsZT86IHN0cmluZzsgLy8gU2VjdGlvbiBoZWFkaW5nIChlLmcuLCBcIlBFUlNPTkFMIElORk9STUFUSU9OXCIpXHJcbiAgZmllbGRzOiBGb3JtQ29sdW1uW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUNvbmZpZyB7XHJcbiAgc2VjdGlvbnM6IEZvcm1TZWN0aW9uW107XHJcbiAgc3VibWl0TGFiZWw/OiBzdHJpbmc7XHJcbiAgcmVzZXRMYWJlbD86IHN0cmluZztcclxuICBvblN1Ym1pdDogKGRhdGE6IGFueSkgPT4gdm9pZDtcclxuICBvblJlc2V0PzogKCkgPT4gdm9pZDtcclxuICBvbkNhbmNlbDogKCkgPT4gdm9pZDtcclxuICBjYW5jZWxMYWJlbD86IHN0cmluZztcclxuICBmb3JtVGl0bGU/OiBzdHJpbmc7XHJcbiAgbWF4Q29sc1BlclJvdz86IG51bWJlcjtcclxufVxyXG5cclxuLy8gYWRkLXVwZGF0ZS1mb3JtLmNvbXBvbmVudC50c1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBFbGVtZW50UmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtR3JvdXAsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG4vLyBJbXBvcnQgeW91ciBsaWJyYXJ5IG1vZHVsZXNcclxuaW1wb3J0IHsgRnZFbnRyeUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtZW50cnktZmllbGQvZnYtZW50cnktZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZOdW1iZXJGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LW51bWJlci1maWVsZC9mdi1udW1iZXItZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWRyb3Bkb3duL2Z2LWRyb3Bkb3duLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2UmFkaW9Hcm91cENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LXJhZGlvLWdyb3VwL2Z2LXJhZGlvLWdyb3VwLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2Q2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuLi9mdi1jaGVja2JveC9mdi1jaGVja2JveC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGdkRhdGVGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWRhdGUtZmllbGQvZnYtZGF0ZS1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGdk1vbnRoWWVhckZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtbW9udGgteWVhci1maWVsZC9mdi1tb250aC15ZWFyLWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2RmlsZVNlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtZmlsZS1zZWxlY3Rvci9mdi1maWxlLXNlbGVjdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2SW1hZ2VTZWxlY3RvckNvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWltYWdlLXNlbGVjdG9yL2Z2LWltYWdlLXNlbGVjdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZ2UmljaFRleHRFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuLi9mdi1yaWNoLXRleHQtZWRpdG9yL2Z2LXJpY2gtdGV4dC1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZOYW1lQ29kZUNvbXBvbmVudCB9IGZyb20gJy4uL2Z2LW5hbWUtY29kZS9mdi1uYW1lLWNvZGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZQaG9uZUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtcGhvbmUtZmllbGQvZnYtcGhvbmUtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZVYW5GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LXVhbi1maWVsZC9mdi11YW4tZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZQZkZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZnYtcGYtZmllbGQvZnYtcGYtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZFc2lGaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Z2LWVzaS1maWVsZC9mdi1lc2ktZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZJZnNjRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1pZnNjLWZpZWxkL2Z2LWlmc2MtZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZNaWNyRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1taWNyLWZpZWxkL2Z2LW1pY3ItZmllbGQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRnZJYmFuRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi9mdi1pYmFuLWZpZWxkL2Z2LWliYW4tZmllbGQuY29tcG9uZW50JztcclxuXHJcbi8vIEltcG9ydCBWYWxpZGF0aW9uIFR5cGVzXHJcbmltcG9ydCB7IFZhbGlkYXRpb25TY2hlbWEsIFZhbGlkYXRpb25SdWxlIH0gZnJvbSAnQGZvdmVzdHRhL3ZhbGlkYXRpb24tZW5naW5lJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItYWRkLXVwZGF0ZS1mb3JtJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBGdkVudHJ5RmllbGRDb21wb25lbnQsXHJcbiAgICBGdk51bWJlckZpZWxkQ29tcG9uZW50LFxyXG4gICAgRnZEcm9wZG93bkNvbXBvbmVudCxcclxuICAgIEZ2UmFkaW9Hcm91cENvbXBvbmVudCxcclxuICAgIEZ2Q2hlY2tib3hDb21wb25lbnQsXHJcbiAgICBGdkRhdGVGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2TW9udGhZZWFyRmllbGRDb21wb25lbnQsXHJcbiAgICBGdkZpbGVTZWxlY3RvckNvbXBvbmVudCxcclxuICAgIEZ2SW1hZ2VTZWxlY3RvckNvbXBvbmVudCxcclxuICAgIEZ2UmljaFRleHRFZGl0b3JDb21wb25lbnQsXHJcbiAgICBGdlJpY2hUZXh0RWRpdG9yQ29tcG9uZW50LFxyXG4gICAgRnZOYW1lQ29kZUNvbXBvbmVudCxcclxuICAgIEZ2UGhvbmVGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2VWFuRmllbGRDb21wb25lbnQsXHJcbiAgICBGdlBmRmllbGRDb21wb25lbnQsXHJcbiAgICBGdkVzaUZpZWxkQ29tcG9uZW50LFxyXG4gICAgRnZJZnNjRmllbGRDb21wb25lbnQsXHJcbiAgICBGdk1pY3JGaWVsZENvbXBvbmVudCxcclxuICAgIEZ2SWJhbkZpZWxkQ29tcG9uZW50LFxyXG4gIF0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oZWFkZXJcIiAqbmdJZj1cImNvbmZpZy5mb3JtVGl0bGVcIj5cclxuICAgICAgICA8aDI+e3sgY29uZmlnLmZvcm1UaXRsZSB9fTwvaDI+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKG5nU3VibWl0KT1cImhhbmRsZVN1Ym1pdCgpXCIgY2xhc3M9XCJkeW5hbWljLWZvcm1cIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIGNvbmZpZy5zZWN0aW9uc1wiIGNsYXNzPVwiZm9ybS1zZWN0aW9uXCI+XHJcbiAgICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCIgKm5nSWY9XCJzZWN0aW9uLnRpdGxlXCI+XHJcbiAgICAgICAgICAgIHt7IHNlY3Rpb24udGl0bGUgfX1cclxuICAgICAgICAgIDwvaDM+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkcy1yb3dcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIHNlY3Rpb24uZmllbGRzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLXdyYXBwZXJcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiJ2ZpZWxkLScgKyBjb2x1bW4udHlwZVwiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb2x1bW4uaGlkZGVuID8geyBkaXNwbGF5OiAnbm9uZScgfSA6IHt9XCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5ncmlkLWNvbHVtbl09XCInc3BhbiAnICsgKGNvbHVtbi5jb2xTcGFuIHx8IDEpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgWyd0ZXh0JywgJ2VtYWlsJywgJ3Bhc3N3b3JkJ10uaW5jbHVkZXMoY29sdW1uLnR5cGUpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgIWNvbHVtbi5oaWRkZW5cclxuICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGZ2LWVudHJ5LWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4udHlwZSA9PT0gJ3Bhc3N3b3JkJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdwYXNzd29yZCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2x1bW4udHlwZSA9PT0gJ2VtYWlsJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdlbWFpbCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiAndGV4dCdcclxuICAgICAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthbGxvd0FscGhhYmV0c09ubHldPVwiY29sdW1uLmFsbG93QWxwaGFiZXRzT25seSB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21heExlbmd0aF09XCJjb2x1bW4ubWF4TGVuZ3RoIHx8IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1lbnRyeS1maWVsZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ251bWJlcicgJiYgIWNvbHVtbi5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtbnVtYmVyLWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1udW1iZXItZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdzZWxlY3QnICYmICFjb2x1bW4uaGlkZGVuXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGZ2LWRyb3Bkb3duXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IG9wdGlvbidcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zIHx8IFtdXCJcclxuICAgICAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbHVtbi5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImhhbmRsZUZpZWxkQ2hhbmdlKGNvbHVtbi5uYW1lLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8L2Z2LWRyb3Bkb3duPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnY2hlY2tib3gnICYmICFjb2x1bW4uaGlkZGVuXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGZ2LWNoZWNrYm94XHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1jaGVja2JveD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ3JhZGlvJyAmJiAhY29sdW1uLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtcmFkaW8tZ3JvdXBcclxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2x1bW4ub3B0aW9ucyB8fCBbXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1yYWRpby1ncm91cD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2RhdGUnICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi1kYXRlLWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJoYW5kbGVGaWVsZENoYW5nZShjb2x1bW4ubmFtZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9mdi1kYXRlLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnbW9udGgteWVhcicgJiYgIWNvbHVtbi5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtbW9udGgteWVhci1maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlTW9udGhZZWFyQ2hhbmdlKGNvbHVtbi5uYW1lLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8L2Z2LW1vbnRoLXllYXItZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICd0ZXh0YXJlYScgJiYgIWNvbHVtbi5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtcmljaC10ZXh0LWVkaXRvclxyXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb2x1bW4ucGxhY2Vob2xkZXIgfHwgJydcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGFuZGxlRmllbGRDaGFuZ2UoY29sdW1uLm5hbWUsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDwvZnYtcmljaC10ZXh0LWVkaXRvcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2ZpbGUnICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0ltYWdlRmllbGQoY29sdW1uKTsgZWxzZSBzdGFuZGFyZEZpbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZnYtaW1hZ2Utc2VsZWN0b3JcclxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IGltYWdlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQsIGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZnYtaW1hZ2Utc2VsZWN0b3I+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdGFuZGFyZEZpbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGZ2LWZpbGUtc2VsZWN0b3JcclxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VsZWN0IGZpbGUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthY2NlcHRdPVwiY29sdW1uLmFjY2VwdCB8fCAnKi8qJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQsIGNvbHVtbi5uYW1lKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZnYtZmlsZS1zZWxlY3Rvcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ25hbWUtY29kZScgJiYgIWNvbHVtbi5oaWRkZW5cIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtbmFtZS1jb2RlXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbHVtbi5wbGFjZWhvbGRlciB8fCAnU2VhcmNoIGJ5IENvZGUgb3IgTmFtZSdcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zID8gbWFwU2VhcmNoT3B0aW9ucyhjb2x1bW4ub3B0aW9ucykgOiBbXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDwvZnYtbmFtZS1jb2RlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAncGhvbmUnICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi1waG9uZS1maWVsZCBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCIgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIiBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCIgW2Rpc2FibGVkXT1cImNvbHVtbi5kaXNhYmxlZCB8fCBmYWxzZVwiPjwvZnYtcGhvbmUtZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICd1YW4nICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi11YW4tZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIj48L2Z2LXVhbi1maWVsZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ3BmJyAmJiAhY29sdW1uLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtcGYtZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIj48L2Z2LXBmLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnZXNpJyAmJiAhY29sdW1uLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtZXNpLWZpZWxkIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIiBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIiBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9mdi1lc2ktZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdpZnNjJyAmJiAhY29sdW1uLmhpZGRlblwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZnYtaWZzYy1maWVsZCBbbGFiZWxdPVwiY29sdW1uLmxhYmVsXCIgW2NvbnRyb2xdPVwiZ2V0Q29udHJvbChjb2x1bW4ubmFtZSlcIiBbc2NoZW1hXT1cImdldFNjaGVtYShjb2x1bW4pXCIgW2Rpc2FibGVkXT1cImNvbHVtbi5kaXNhYmxlZCB8fCBmYWxzZVwiPjwvZnYtaWZzYy1maWVsZD5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ21pY3InICYmICFjb2x1bW4uaGlkZGVuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxmdi1taWNyLWZpZWxkIFtsYWJlbF09XCJjb2x1bW4ubGFiZWxcIiBbY29udHJvbF09XCJnZXRDb250cm9sKGNvbHVtbi5uYW1lKVwiIFtzY2hlbWFdPVwiZ2V0U2NoZW1hKGNvbHVtbilcIiBbZGlzYWJsZWRdPVwiY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9mdi1taWNyLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnaWJhbicgJiYgIWNvbHVtbi5oaWRkZW5cIj5cclxuICAgICAgICAgICAgICAgICAgPGZ2LWliYW4tZmllbGQgW2xhYmVsXT1cImNvbHVtbi5sYWJlbFwiIFtjb250cm9sXT1cImdldENvbnRyb2woY29sdW1uLm5hbWUpXCIgW3NjaGVtYV09XCJnZXRTY2hlbWEoY29sdW1uKVwiIFtkaXNhYmxlZF09XCJjb2x1bW4uZGlzYWJsZWQgfHwgZmFsc2VcIj48L2Z2LWliYW4tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWFjdGlvbnNcIj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZCAmJiBzdWJtaXR0ZWRcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBjb25maWcuc3VibWl0TGFiZWwgfHwgJ1NhdmUnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpZy5vbkNhbmNlbCgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgY29uZmlnLmNhbmNlbExhYmVsIHx8ICdDYW5jZWwnIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9mb3JtPlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IGBcclxuXHJcbiAgQGltcG9ydCB1cmwoJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9UG9wcGluczp3Z2h0QDMwMDs0MDA7NTAwOzYwMDs3MDAmZGlzcGxheT1zd2FwJyk7XHJcbiAgQGltcG9ydCB1cmwoJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vaWNvbj9mYW1pbHk9TWF0ZXJpYWwrSWNvbnMnKTtcclxuICAgICp7XHJcbiAgICAgIGZvbnQtZmFtaWx5OiBcIlBvcHBpbnNcIiAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG4gICAgLmZvcm0tY29udGFpbmVyIHtcclxuICAgICAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcclxuICAgICAgcGFkZGluZzogMTBweDtcclxuICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gICAgICBtYXJnaW46IDAgYXV0bztcclxuICAgICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgfVxyXG5cclxuICAgIC5lcnJvci1ib3JkZXIge1xyXG4gICAgIGJvcmRlci1jb2xvcjogcmVkICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLmhpZGRlbntcclxuICAgICAgZGlzcGxheTpub25lICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLmZvcm0taGVhZGVyIHtcclxuICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcclxuICAgIH1cclxuXHJcbiAgICAuZm9ybS1oZWFkZXIgaDIge1xyXG4gICAgICBtYXJnaW46IDA7XHJcbiAgICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcclxuICAgICAgY29sb3I6ICMzMDMwMzA7XHJcbiAgICB9XHJcblxyXG4gICAgLmR5bmFtaWMtZm9ybSB7XHJcbiAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gICAgICBwYWRkaW5nOiAxMHB4O1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA2cHg7XHJcbiAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMSk7XHJcbiAgICAgIG1heC13aWR0aDogMTAwJTtcclxuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIH1cclxuXHJcbiAgICAuZm9ybS1zZWN0aW9uIHtcclxuICAgICAgbWFyZ2luLWJvdHRvbToxMHB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5zZWN0aW9uLXRpdGxlIHtcclxuICAgICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgICBmb250LXdlaWdodDogNzAwO1xyXG4gICAgICBjb2xvcjogIzMwMzAzMDtcclxuICAgICAgbWFyZ2luOiAwIDAgMTZweCAwO1xyXG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xyXG4gICAgICBsZXR0ZXItc3BhY2luZzogMC41cHg7XHJcbiAgICB9XHJcblxyXG4gICAgLmZpZWxkcy1yb3cge1xyXG4gICAgICBkaXNwbGF5OiBncmlkO1xyXG4gICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg1LDFmcik7XHJcbiAgICAgIGdhcDogMTZweDtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIC5mb3JtLWZpZWxkLXdyYXBwZXIge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIG1pbi13aWR0aDogMDtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIC5wYXNzd29yZC10b2dnbGUtYnRuIHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgcmlnaHQ6IDEwcHg7XHJcbiAgdG9wOiAzMnB4O1xyXG4gIGJhY2tncm91bmQ6IG5vbmU7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxuICBwYWRkaW5nOiA0cHg7XHJcbiAgY29sb3I6ICM2NjY7XHJcbn1cclxuXHJcbi5wYXNzd29yZC10b2dnbGUtYnRuOmhvdmVyIHtcclxuICBjb2xvcjogIzMzMztcclxufVxyXG5cclxuLnBhc3N3b3JkLXRvZ2dsZS1idG4gLm1hdGVyaWFsLWljb25zIHtcclxuICBmb250LXNpemU6IDIwcHg7XHJcbiAgd2lkdGg6IGF1dG87XHJcbiAgaGVpZ2h0OiBhdXRvO1xyXG4gIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbiAgICBAbWVkaWEgKG1pbi13aWR0aDogMTIwMHB4KSBhbmQgKG1heC13aWR0aDogMTQwMHB4KSB7XHJcbiAgICAgIC5maWVsZHMtcm93IHtcclxuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCg1LDFmcik7XHJcbiAgICAgIH1cclxuICAgICAgLmZvcm0tY29udHJvbCB7XHJcbiAgICAgICAgd2lkdGg6IDE4MHB4O1xyXG4gICAgICAgIG1heC13aWR0aDogMTgwcHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBAbWVkaWEgKG1heC13aWR0aDogMTIwMHB4KSB7XHJcbiAgICAgIC5maWVsZHMtcm93IHtcclxuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgzLDFmcik7XHJcbiAgICAgIH1cclxuICAgICAgLmZvcm0tY29udHJvbCB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQG1lZGlhIChtYXgtd2lkdGg6IDk5MnB4KSB7XHJcbiAgICAgIC5maWVsZHMtcm93IHtcclxuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLDFmcik7XHJcbiAgICAgICAgZ2FwOiAxMnB4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XHJcbiAgICAgIC5maWVsZHMtcm93IHtcclxuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLDFmcik7XHJcbiAgICAgICAgZ2FwOiAxMHB4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQG1lZGlhIChtYXgtd2lkdGg6IDY0MHB4KSB7XHJcbiAgICAgIC5maWVsZHMtcm93IHtcclxuICAgICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcclxuICAgICAgICBnYXA6IDEycHg7XHJcbiAgICAgIH1cclxuICAgICAgLmZvcm0tZmllbGQtd3JhcHBlciB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsYWJlbCB7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICAgIG1hcmdpbi1ib3R0b206IDZweDtcclxuICAgICAgY29sb3I6ICMxNTFENDg7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIH1cclxuXHJcbiAgICAucmVxdWlyZWQge1xyXG4gICAgICBjb2xvcjogI2U3NGMzYztcclxuICAgICAgbWFyZ2luLWxlZnQ6IDJweDtcclxuICAgIH1cclxuXHJcbiAgICAuZm9ybS1jb250cm9sIHtcclxuICAgICAgcGFkZGluZzogNXB4IDEwcHg7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBtYXgtd2lkdGg6IDEwMCU7XHJcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM4Q0JCQTg7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjtcclxuICAgICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgICBmb250LXdlaWdodDogNDAwO1xyXG4gICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcclxuICAgICAgY29sb3I6ICMxZjJiNDE7XHJcbiAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjJzLCBib3gtc2hhZG93IDAuMnM7XHJcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICB9XHJcblxyXG4gICAgLmZvcm0tY29udHJvbDpmb2N1cyB7XHJcbiAgICAgIG91dGxpbmU6IG5vbmU7XHJcbiAgICAgIGJvcmRlci1jb2xvcjogIzM0OThkYjtcclxuICAgICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHJnYmEoNTIsIDE1MiwgMjE5LCAwLjEpO1xyXG4gICAgfVxyXG5cclxuICAgIC5mb3JtLWNvbnRyb2w6ZGlzYWJsZWQge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWNmMGYxO1xyXG4gICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHRleHRhcmVhLmZvcm0tY29udHJvbCB7XHJcbiAgICAgIHJlc2l6ZTogdmVydGljYWw7XHJcbiAgICAgIG1pbi1oZWlnaHQ6IDEwMHB4O1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdC5mb3JtLWNvbnRyb2wge1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XHJcbiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMTInIGhlaWdodD0nMTInIHZpZXdCb3g9JzAgMCAxMiAxMiclM0UlM0NwYXRoIGZpbGw9JyUyMzMzMycgZD0nTTYgOUwxIDRoMTB6Jy8lM0UlM0Mvc3ZnJTNFXCIpO1xyXG4gICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xyXG4gICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCA4cHggY2VudGVyO1xyXG4gICAgICBwYWRkaW5nLXJpZ2h0OiA0MHB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5jaGVja2JveC13cmFwcGVyIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgZ2FwOiA4cHg7XHJcbiAgICB9XHJcblxyXG4gICAgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdIHtcclxuICAgICAgd2lkdGg6IDE4cHg7XHJcbiAgICAgIGhlaWdodDogMThweDtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC5jaGVja2JveC1sYWJlbCB7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgbWFyZ2luOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC5maWxlLXVwbG9hZC1jb250YWluZXIge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBnYXA6IDIwcHg7XHJcbiAgcGFkZGluZzogMjBweDtcclxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxuICBtYXgtd2lkdGg6IDEwMCU7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICBmbGV4LXdyYXA6IHdyYXA7XHJcbn1cclxuXHJcbi5tYXRlcmlhbC1pY29ucyB7XHJcbiAgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucycgIWltcG9ydGFudDtcclxuICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIHdpZHRoOiA0MHB4O1xyXG4gIHBhZGRpbmc6IDhweDtcclxuICBoZWlnaHQ6IDQwcHg7XHJcbn1cclxuXHJcbi5maWxlLWZpZWxkLXdyYXBwZXIge1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIG1hcmdpbi10b3A6IDE2cHg7XHJcbiAgbWF4LXdpZHRoOiAxMDAlO1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbn1cclxuXHJcbi5waG90by1wcmV2aWV3LWNpcmNsZSB7XHJcbiAgd2lkdGg6IDEwMHB4O1xyXG4gIGhlaWdodDogMTAwcHg7XHJcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgYm9yZGVyOiAycHggc29saWQgI2RkZDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMnM7XHJcbn1cclxuXHJcbi5waG90by1wcmV2aWV3LWNpcmNsZTpob3ZlciB7XHJcbiAgYm9yZGVyLWNvbG9yOiAjMzQ5OGRiO1xyXG59XHJcblxyXG4ucHJldmlldy1pbWFnZSwgLmRlZmF1bHQtcGhvdG8ge1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGhlaWdodDogMTAwJTtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbn1cclxuXHJcbi5wcmV2aWV3LWltYWdlIGltZyB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIG9iamVjdC1maXQ6IGNvdmVyO1xyXG59XHJcblxyXG4uZGVmYXVsdC1waG90byB7XHJcbiAgYmFja2dyb3VuZDogI2YwZjBmMDtcclxuICBjb2xvcjogIzk5OTtcclxuICBmb250LXNpemU6IDQwcHg7XHJcbn1cclxuXHJcbi5maWxlLWluZm8ge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBnYXA6IDhweDtcclxufVxyXG4uYnRuLWRlbGV0ZSB7XHJcbiAgYm9yZGVyOiBub25lO1xyXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgZm9udC1zaXplOiAxNHB4O1xyXG4gIHBhZGRpbmc6IDBweDtcclxufVxyXG5cclxuLnVwbG9hZC1idG4tZ3JvdXAge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBib3JkZXI6IDFweCBzb2xpZCAjZDNkM2QzO1xyXG4gIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICBiYWNrZ3JvdW5kOiAjZmZmO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgd2lkdGg6IGZpdC1jb250ZW50O1xyXG59XHJcblxyXG4uYnRuLXVwbG9hZCB7XHJcbiAgYmFja2dyb3VuZDogI2ZmZjtcclxuICBjb2xvcjogIzIyMjtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgcGFkZGluZzogMCAxOHB4O1xyXG4gIGZvbnQtc2l6ZTogMTZweDtcclxuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZTBlMGUwO1xyXG4gIGJvcmRlci1yYWRpdXM6IDhweCAwIDAgOHB4O1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbiAgYm94LXNoYWRvdzogbm9uZTtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgaGVpZ2h0OiA0MHB4O1xyXG4gIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4ycztcclxufVxyXG5cclxuLmJ0bi11cGxvYWQtaWNvbiB7XHJcbiAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgYm9yZGVyLXJhZGl1czogMCA4cHggOHB4IDA7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gIHdpZHRoOiA0OHB4O1xyXG4gIGhlaWdodDogNDBweDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzO1xyXG59XHJcblxyXG4uYnRuLXVwbG9hZC1pY29uIGkubWF0ZXJpYWwtaWNvbnMge1xyXG4gIGZvbnQtc2l6ZTogMjJweDtcclxuICBjb2xvcjogIzIyMjtcclxufVxyXG5cclxuLmJ0bi11cGxvYWQ6aG92ZXIsIC5idG4tdXBsb2FkLWljb246aG92ZXIge1xyXG4gIGJhY2tncm91bmQ6ICNmMGYwZjA7XHJcbn1cclxuXHJcbi5idG4tZGVsZXRlIHtcclxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxuICBjb2xvcjogcmVkO1xyXG59XHJcblxyXG4uYnRuLWRlbGV0ZTpob3ZlciB7XHJcbiAgYmFja2dyb3VuZDogI2YwZjBmMDtcclxufVxyXG5cclxuLmZpbGUtbmFtZSB7XHJcbiAgZm9udC1zaXplOiAxMnB4O1xyXG4gIGNvbG9yOiAjNjY2O1xyXG4gIG1hcmdpbjogOHB4O1xyXG4gIG1hcmdpbi10b3A6IDEwcHg7XHJcbn1cclxuXHJcbi5maWxlLWxhYmVsIHtcclxuICAgIGZvbnQtd2VpZ2h0OiA2MDA7XHJcbiAgICBtYXJnaW4tYm90dG9tOiA2cHg7XHJcbiAgICBjb2xvcjogIzE1MWQ0ODtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICBkaXNwbGF5OiBibG9jaztcclxufVxyXG5cclxuICAgIC5yYWRpby1sYWJlbCB7XHJcbiAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICBtYXJnaW4tYm90dG9tOiAxNXB4O1xyXG4gIGNvbG9yOiAjMTUxRDQ4O1xyXG4gIGZvbnQtc2l6ZTogMTRweDtcclxuICBkaXNwbGF5OiBibG9jaztcclxufVxyXG5cclxuLnJhZGlvLWdyb3VwIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGdhcDogMjBweDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG59XHJcblxyXG4ucmFkaW8taXRlbSB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGdhcDogNnB4O1xyXG59XHJcblxyXG5pbnB1dFt0eXBlPVwicmFkaW9cIl0ge1xyXG4gIHdpZHRoOiAxOHB4O1xyXG4gIGhlaWdodDogMThweDtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgYWNjZW50LWNvbG9yOiAjMzQ5OGRiO1xyXG59XHJcblxyXG4ucmFkaW8tb3B0aW9uLWxhYmVsIHtcclxuICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbn1cclxuXHJcbiAgICAuaGludCB7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgICAgY29sb3I6ICM3ZjhjOGQ7XHJcbiAgICAgIG1hcmdpbi10b3A6IDRweDtcclxuICAgIH1cclxuXHJcbiAgICAuZXJyb3ItbWVzc2FnZSB7XHJcbiAgICAgIGNvbG9yOiAjZTc0YzNjO1xyXG4gICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgIG1hcmdpbi10b3A6IDRweDtcclxuICAgIH1cclxuXHJcbiAgICAuZm9ybS1hY3Rpb25zIHtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgZ2FwOiA4cHg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICAgICAgZ2FwOiAxMnB4O1xyXG4gICAgICBwYWRkaW5nLXRvcDogNXB4O1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4ge1xyXG4gICAgICBwYWRkaW5nOiA4cHggMjBweDtcclxuICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA3cHg7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcclxuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycztcclxuICAgIH1cclxuXHJcbiAgICAuYnRuLXByaW1hcnkge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDA2QUZGO1xyXG4gICAgICBjb2xvcjogd2hpdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1wcmltYXJ5OmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzI5ODBiOTtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuLXByaW1hcnk6ZGlzYWJsZWQge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmRjM2M3O1xyXG4gICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4tc2Vjb25kYXJ5IHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzk1YTVhNjtcclxuICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC5idG4tc2Vjb25kYXJ5OmhvdmVyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzdmOGM4ZDtcclxuICAgIH1cclxuXHJcbiAgICAuYnRuLW91dGxpbmUge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzAzMDMwO1xyXG4gICAgICBjb2xvcjogd2hpdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1vdXRsaW5lOmhvdmVyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzJiMmIyYmZmO1xyXG4gICAgICBjb2xvcjogd2hpdGU7XHJcbiAgICB9XHJcblxyXG4gICAgLm1vbnRoLXllYXItd3JhcHBlciB7XHJcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICB9XHJcblxyXG4gICAgLm1vbnRoLXllYXItd3JhcHBlciAuZm9ybS1jb250cm9sIHtcclxuICAgICAgcGFkZGluZy1yaWdodDogNDVweDtcclxuICAgIH1cclxuXHJcbiAgICAubW9udGgtcGlja2VyLWhpZGRlbiB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgb3BhY2l0eTogMDtcclxuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XHJcbiAgICAgIHdpZHRoOiAwO1xyXG4gICAgICBoZWlnaHQ6IDA7XHJcbiAgICAgIGJvcmRlcjogbm9uZTtcclxuICAgICAgcGFkZGluZzogMDtcclxuICAgICAgbWFyZ2luOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC5tb250aC1waWNrZXItYnRuIHtcclxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICByaWdodDogNXB4O1xyXG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcclxuICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIHBhZGRpbmc6IDVweDtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgIGNvbG9yOiAjNjY2O1xyXG4gICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzO1xyXG4gICAgICB6LWluZGV4OiAxO1xyXG4gICAgfVxyXG5cclxuICAgIC5tb250aC1waWNrZXItYnRuOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcclxuICAgICAgY29sb3I6ICMzNDk4ZGI7XHJcbiAgICB9XHJcblxyXG4gICAgLm1vbnRoLXBpY2tlci1idG46ZGlzYWJsZWQge1xyXG4gICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xyXG4gICAgICBvcGFjaXR5OiAwLjU7XHJcbiAgICB9XHJcblxyXG4gICAgLm1vbnRoLXBpY2tlci1idG4gLm1hdGVyaWFsLWljb25zIHtcclxuICAgICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgICB3aWR0aDogYXV0bztcclxuICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICBwYWRkaW5nOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC5zZWFyY2gtc2VsZWN0LXdyYXBwZXIge1xyXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIC5zZWFyY2gtc2VsZWN0LWlucHV0IHtcclxuICAgICAgcGFkZGluZy1yaWdodDogMTBweDtcclxuICAgIH1cclxuXHJcbiAgICAuc2VhcmNoLXNlbGVjdC1kcm9wZG93biB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgdG9wOiBjYWxjKDEwMCUgKyA0cHgpO1xyXG4gICAgICBsZWZ0OiAwO1xyXG4gICAgICByaWdodDogYXV0bztcclxuICAgICAgbWluLXdpZHRoOiAxMDAlO1xyXG4gICAgICBtYXgtd2lkdGg6IGNhbGMoMTAwdncgLSAxNnB4KTtcclxuICAgICAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkM2QzZDM7XHJcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICAgICAgbWF4LWhlaWdodDogMjIwcHg7XHJcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XHJcbiAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDEwcHggcmdiYSgwLDAsMCwwLjA4KTtcclxuICAgICAgei1pbmRleDogNTtcclxuICAgICAgcGFkZGluZzogNnB4IDA7XHJcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcclxuICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMXMgZWFzZS1vdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLnNlYXJjaC1zZWxlY3Qtb3B0aW9uIHtcclxuICAgICAgcGFkZGluZzogOHB4IDEycHg7XHJcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgZ2FwOiA4cHg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZjJmMmYyO1xyXG4gICAgfVxyXG5cclxuICAgIC5zZWFyY2gtc2VsZWN0LW9wdGlvbjpsYXN0LWNoaWxkIHtcclxuICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAuc2VhcmNoLXNlbGVjdC1vcHRpb246aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kOiAjZjVmOWZmO1xyXG4gICAgfVxyXG5cclxuICAgIC5vcHRpb24tY29kZSB7XHJcbiAgICAgIGNvbG9yOiAjMDA1MmNjO1xyXG4gICAgICBmb250LXdlaWdodDogNzAwO1xyXG4gICAgICBtaW4td2lkdGg6IDkwcHg7XHJcbiAgICB9XHJcblxyXG4gICAgLm9wdGlvbi1uYW1lIHtcclxuICAgICAgY29sb3I6ICMxNTFkNDg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgICB9XHJcblxyXG4gICAgLnRpbWUtcGlja2VyLXdyYXBwZXIge1xyXG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgfVxyXG5cclxuICAgIC50aW1lLWlucHV0IHtcclxuICAgICAgcGFkZGluZy1yaWdodDogNDVweDtcclxuICAgICAgZmxleDogMTtcclxuICAgIH1cclxuXHJcbiAgICAudGltZS1waWNrZXItYnRuIHtcclxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICByaWdodDogNXB4O1xyXG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcclxuICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIHBhZGRpbmc6IDVweDtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XHJcbiAgICAgIGNvbG9yOiAjNjY2O1xyXG4gICAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjJzO1xyXG4gICAgICB6LWluZGV4OiAxO1xyXG4gICAgfVxyXG5cclxuICAgIC50aW1lLXBpY2tlci1idG46aG92ZXI6bm90KDpkaXNhYmxlZCkge1xyXG4gICAgICBjb2xvcjogIzM0OThkYjtcclxuICAgIH1cclxuXHJcbiAgICAudGltZS1waWNrZXItYnRuOmRpc2FibGVkIHtcclxuICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcclxuICAgICAgb3BhY2l0eTogMC41O1xyXG4gICAgfVxyXG5cclxuICAgIC50aW1lLXBpY2tlci1idG4gLm1hdGVyaWFsLWljb25zIHtcclxuICAgICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgICB3aWR0aDogYXV0bztcclxuICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICBwYWRkaW5nOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0W3R5cGU9XCJ0aW1lXCJdIHtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0W3R5cGU9XCJ0aW1lXCJdOjotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3Ige1xyXG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgIG9wYWNpdHk6IDA7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgcmlnaHQ6IDA7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICB9XHJcblxyXG4gICAgLmRhdGUtcGlja2VyLWZpZWxkIHtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICB9XHJcblxyXG4gICAgLmRhdGUtcGlja2VyLWZpZWxkIDo6bmctZGVlcCAubWF0LW1kYy1mb3JtLWZpZWxkIHtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICB9XHJcblxyXG4gICAgLmRhdGUtcGlja2VyLWZpZWxkIDo6bmctZGVlcCAubWF0LW1kYy10ZXh0LWZpZWxkLXdyYXBwZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmO1xyXG4gICAgfVxyXG5cclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcclxuICAgICAgYm9yZGVyLWNvbG9yOiAjOENCQkE4O1xyXG4gICAgfVxyXG5cclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQ6bm90KC5tZGMtdGV4dC1maWVsZC0tZGlzYWJsZWQpIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZDpub3QoLm1kYy10ZXh0LWZpZWxkLS1kaXNhYmxlZCkgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcclxuICAgICAgYm9yZGVyLWNvbG9yOiAjOENCQkE4O1xyXG4gICAgfVxyXG5cclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbGVhZGluZyxcclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1kYy10ZXh0LWZpZWxkLS1vdXRsaW5lZC5tZGMtdGV4dC1maWVsZC0tZm9jdXNlZCAubWRjLW5vdGNoZWQtb3V0bGluZV9fbm90Y2gsXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQubWRjLXRleHQtZmllbGQtLWZvY3VzZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcclxuICAgICAgYm9yZGVyLWNvbG9yOiAjMzQ5OGRiO1xyXG4gICAgfVxyXG5cclxuICAgIC5kYXRlLXBpY2tlci1maWVsZC5lcnJvci1ib3JkZXIgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX2xlYWRpbmcsXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQuZXJyb3ItYm9yZGVyIDo6bmctZGVlcCAubWRjLXRleHQtZmllbGQtLW91dGxpbmVkIC5tZGMtbm90Y2hlZC1vdXRsaW5lX19ub3RjaCxcclxuICAgIC5kYXRlLXBpY2tlci1maWVsZC5lcnJvci1ib3JkZXIgOjpuZy1kZWVwIC5tZGMtdGV4dC1maWVsZC0tb3V0bGluZWQgLm1kYy1ub3RjaGVkLW91dGxpbmVfX3RyYWlsaW5nIHtcclxuICAgICAgYm9yZGVyLWNvbG9yOiByZWQgIWltcG9ydGFudDtcclxuICAgIH1cclxuXHJcbiAgICAuZGF0ZS1waWNrZXItZmllbGQgOjpuZy1kZWVwIC5tYXQtbWRjLWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXIge1xyXG4gICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgfVxyXG5cclxuICAgIC5kYXRlLXBpY2tlci1maWVsZCA6Om5nLWRlZXAgLm1hdC1tZGMtZm9ybS1maWVsZC1pbnB1dC1jb250cm9sIGlucHV0IHtcclxuICAgICAgZm9udC1mYW1pbHk6IFwiUG9wcGluc1wiICFpbXBvcnRhbnQ7XHJcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgICAgZm9udC13ZWlnaHQ6IDQwMDtcclxuICAgICAgY29sb3I6ICMxZjJiNDE7XHJcbiAgICB9XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFkZFVwZGF0ZUZvcm1Db21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICBASW5wdXQoKSBjb25maWchOiBGb3JtQ29uZmlnO1xyXG4gIEBPdXRwdXQoKSB2YWxpZGF0aW9uRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBmb3JtITogRm9ybUdyb3VwO1xyXG4gIHN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gIHByaXZhdGUgZmlsZVByZXZpZXdzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgZmlsZU5hbWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgdmFsdWVDaGFuZ2VTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG4gIHByaXZhdGUgcGFzc3dvcmRWaXNpYmlsaXR5OiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIHNlYXJjaFF1ZXJpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGhvc3RSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAvLyBMaWZlY3ljbGUgaG9vayAtIGNhbiBiZSB1c2VkIGZvciBkYXRlcGlja2VyIGluaXRpYWxpemF0aW9uIGlmIG5lZWRlZFxyXG4gIH1cclxuXHJcbiAgZ2V0Q29sdW1uV2lkdGgoY29sdW1uOiBGb3JtQ29sdW1uKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG1heENvbHMgPSB0aGlzLmNvbmZpZy5tYXhDb2xzUGVyUm93IHx8IDU7XHJcbiAgICBjb25zdCBjb2xTcGFuID0gTWF0aC5taW4oY29sdW1uLmNvbFNwYW4gfHwgMSwgbWF4Q29scyk7XHJcbiAgICByZXR1cm4gYGNhbGMoJHsoY29sU3BhbiAvIG1heENvbHMpICogMTAwfSUgLSAxNnB4KWA7XHJcbiAgfVxyXG5cclxuICBnZXRDb250cm9sKG5hbWU6IHN0cmluZyk6IEZvcm1Db250cm9sIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KG5hbWUpIGFzIEZvcm1Db250cm9sO1xyXG4gIH1cclxuXHJcbiAgLy8gMi4gSEVMUEVSOiBDb252ZXJ0IHlvdXIgRmllbGRWYWxpZGF0aW9uW10gdG8gdGhlIGxpYnJhcnkncyBWYWxpZGF0aW9uU2NoZW1hXHJcbiAgZ2V0U2NoZW1hKGNvbHVtbjogRm9ybUNvbHVtbik6IFZhbGlkYXRpb25TY2hlbWEge1xyXG4gICAgY29uc3QgcnVsZXM6IFZhbGlkYXRpb25SdWxlW10gPSBbXTtcclxuICAgIGNvbnN0IGVycm9yUHJpb3JpdHk6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgaWYgKGNvbHVtbi52YWxpZGF0aW9ucykge1xyXG4gICAgICBjb2x1bW4udmFsaWRhdGlvbnMuZm9yRWFjaCgodikgPT4ge1xyXG4gICAgICAgIHN3aXRjaCAodi50eXBlKSB7XHJcbiAgICAgICAgICBjYXNlICdyZXF1aXJlZCc6XHJcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgIG5hbWU6ICdyZXF1aXJlZCcsXHJcbiAgICAgICAgICAgICAgcGFyYW1zOiB7IGVuYWJsZWQ6IHRydWUgfSxcclxuICAgICAgICAgICAgICBlcnJvcktleTogJ0VSUl9SRVFVSVJFRCcsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBlcnJvclByaW9yaXR5LnB1c2goJ3JlcXVpcmVkJyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnZW1haWwnOlxyXG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcclxuICAgICAgICAgICAgICBuYW1lOiAncmVnZXgnLFxyXG4gICAgICAgICAgICAgIHBhcmFtczoge1xyXG4gICAgICAgICAgICAgICAgcGF0dGVybjogJ15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcXFwuW2EtekEtWl17Mix9JCcsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBlcnJvcktleTogJ0VSUl9SRUdFWF9NSVNNQVRDSCcsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBlcnJvclByaW9yaXR5LnB1c2goJ3JlZ2V4Jyk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSAnbWluTGVuZ3RoJzpcclxuICAgICAgICAgICAgcnVsZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgbmFtZTogJ21pbkxlbmd0aCcsXHJcbiAgICAgICAgICAgICAgcGFyYW1zOiB7IHZhbHVlOiB2LnZhbHVlIH0sXHJcbiAgICAgICAgICAgICAgZXJyb3JLZXk6ICdFUlJfTUlOX0xFTkdUSCcsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBlcnJvclByaW9yaXR5LnB1c2goJ21pbkxlbmd0aCcpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ21heExlbmd0aCc6XHJcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xyXG4gICAgICAgICAgICAgIG5hbWU6ICdtYXhMZW5ndGgnLFxyXG4gICAgICAgICAgICAgIHBhcmFtczogeyB2YWx1ZTogdi52YWx1ZSB9LFxyXG4gICAgICAgICAgICAgIGVycm9yS2V5OiAnRVJSX01BWF9MRU5HVEgnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZXJyb3JQcmlvcml0eS5wdXNoKCdtYXhMZW5ndGgnKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdwYXR0ZXJuJzpcclxuICAgICAgICAgICAgcnVsZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgbmFtZTogJ3JlZ2V4JyxcclxuICAgICAgICAgICAgICBwYXJhbXM6IHsgcGF0dGVybjogdi52YWx1ZSB9LFxyXG4gICAgICAgICAgICAgIGVycm9yS2V5OiAnRVJSX1JFR0VYX01JU01BVENIJyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGVycm9yUHJpb3JpdHkucHVzaCgncmVnZXgnKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdtaW4nOlxyXG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcclxuICAgICAgICAgICAgICBuYW1lOiAnbWluJyxcclxuICAgICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWU6IHYudmFsdWUgfSxcclxuICAgICAgICAgICAgICBlcnJvcktleTogJ0VSUl9NSU5fVkFMVUUnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZXJyb3JQcmlvcml0eS5wdXNoKCdtaW4nKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdtYXgnOlxyXG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcclxuICAgICAgICAgICAgICBuYW1lOiAnbWF4JyxcclxuICAgICAgICAgICAgICBwYXJhbXM6IHsgdmFsdWU6IHYudmFsdWUgfSxcclxuICAgICAgICAgICAgICBlcnJvcktleTogJ0VSUl9NQVhfVkFMVUUnLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZXJyb3JQcmlvcml0eS5wdXNoKCdtYXgnKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNYXAgJ25hbWUtY29kZScgdG8gJ0Ryb3Bkb3duJyBvciBzaW1pbGFyIGZvciB2YWxpZGF0aW9uIHNjaGVtYSBwdXJwb3NlcyBpZiBuZWVkZWRcclxuICAgIGxldCBjb250cm9sVHlwZSA9IGNvbHVtbi50eXBlO1xyXG4gICAgaWYgKGNvbHVtbi50eXBlID09PSAnbmFtZS1jb2RlJykge1xyXG4gICAgICBjb250cm9sVHlwZSA9ICdzZWxlY3QnOyAvLyBUcmVhdCBhcyBzZWxlY3QgZm9yIHNjaGVtYSBsb29rdXAgaWYgbGlicmFyeSBleHBlY3RzICdzZWxlY3QnIG9yICdEcm9wZG93bidcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBjb250cm9sVHlwZTogY29udHJvbFR5cGUsXHJcbiAgICAgIGVycm9yUHJpb3JpdHk6IGVycm9yUHJpb3JpdHksXHJcbiAgICAgIHJ1bGVzOiBydWxlcyxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBpc0ltYWdlRmllbGQoY29sdW1uOiBGb3JtQ29sdW1uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBjb2x1bW4udHlwZSA9PT0gJ2ZpbGUnICYmXHJcbiAgICAgIChjb2x1bW4uYWNjZXB0Py5zdGFydHNXaXRoKCdpbWFnZScpIHx8IGNvbHVtbi5maWxlUHJldmlldyA9PT0gdHJ1ZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBpbml0aWFsaXplRm9ybSgpIHtcclxuICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XHJcbiAgICBjb25zdCBmb3JtR3JvdXBDb25maWc6IGFueSA9IHt9O1xyXG5cclxuICAgIHRoaXMuY29uZmlnLnNlY3Rpb25zLmZvckVhY2goKHNlY3Rpb24pID0+IHtcclxuICAgICAgc2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgbGV0IGluaXRpYWxWYWx1ZSA9IGNvbHVtbi52YWx1ZSB8fCAnJztcclxuXHJcbiAgICAgICAgLy8gRm9ybWF0IG1vbnRoLXllYXIgZmllbGRzIHRvIFlZWVktTU0gZm9ybWF0XHJcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSAnbW9udGgteWVhcicgJiYgaW5pdGlhbFZhbHVlKSB7XHJcbiAgICAgICAgICBpbml0aWFsVmFsdWUgPSB0aGlzLmZvcm1hdE1vbnRoWWVhclZhbHVlKGluaXRpYWxWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3JtR3JvdXBDb25maWdbY29sdW1uLm5hbWVdID0gW1xyXG4gICAgICAgICAgeyB2YWx1ZTogaW5pdGlhbFZhbHVlLCBkaXNhYmxlZDogY29sdW1uLmRpc2FibGVkIHx8IGZhbHNlIH0sXHJcbiAgICAgICAgICBudWxsLCAvLyBXZSdsbCBzZXQgdmFsaWRhdG9ycyBhZnRlciBmb3JtIGNyZWF0aW9uXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgLy8gSWYgaXQncyBhIGZpbGUgZmllbGQgd2l0aCBhbiBleGlzdGluZyB2YWx1ZSwgc2V0IHRoZSBwcmV2aWV3XHJcbiAgICAgICAgaWYgKGNvbHVtbi50eXBlID09PSAnZmlsZScgJiYgY29sdW1uLnZhbHVlKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbGVQcmV2aWV3cy5zZXQoY29sdW1uLm5hbWUsIGNvbHVtbi52YWx1ZSk7XHJcbiAgICAgICAgICAvLyBFeHRyYWN0IGZpbGVuYW1lIGZyb20gVVJMIG9yIGJhc2U2NFxyXG4gICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSB0aGlzLmV4dHJhY3RGaWxlTmFtZShjb2x1bW4udmFsdWUpO1xyXG4gICAgICAgICAgaWYgKGZpbGVOYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVzLnNldChjb2x1bW4ubmFtZSwgZmlsZU5hbWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBzZWFyY2ggZGlzcGxheSBmb3IgbmFtZS1jb2RlIGZpZWxkcyAtIE5vIGxvbmdlciBuZWVkZWQgYXMgRnZOYW1lQ29kZSBoYW5kbGVzIGRpc3BsYXkgaW50ZXJuYWxseVxyXG4gICAgICAgIC8qIGlmIChjb2x1bW4udHlwZSA9PT0gJ25hbWUtY29kZScgJiYgaW5pdGlhbFZhbHVlICYmIGNvbHVtbi5vcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAvLyBMb2dpYyBtb3ZlZCB0byBjb21wb25lbnRcclxuICAgICAgICB9ICovXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cChmb3JtR3JvdXBDb25maWcpO1xyXG5cclxuICAgIHRoaXMuY29uZmlnLnNlY3Rpb25zLmZvckVhY2goKHNlY3Rpb24pID0+IHtcclxuICAgICAgc2VjdGlvbi5maWVsZHMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IHRoaXMuYnVpbGRWYWxpZGF0b3JzKGNvbHVtbi52YWxpZGF0aW9ucywgdGhpcy5mb3JtKTtcclxuICAgICAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmZvcm0uZ2V0KGNvbHVtbi5uYW1lKT8uc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcclxuICAgICAgICAgIHRoaXMuZm9ybS5nZXQoY29sdW1uLm5hbWUpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFN1YnNjcmliZSB0byB2YWx1ZSBjaGFuZ2VzIGZvciBhbGwgZmllbGRzIHRvIHRyaWdnZXIgb25DaGFuZ2UgaGFuZGxlcnNcclxuICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGtleSk7XHJcbiAgICAgIGlmIChjb250cm9sKSB7XHJcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gY29udHJvbC52YWx1ZUNoYW5nZXNcclxuICAgICAgICAgIC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbkJ5TmFtZShrZXkpO1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uPy5vbkNoYW5nZSkge1xyXG4gICAgICAgICAgICAgIGNvbHVtbi5vbkNoYW5nZSh2YWx1ZSwgdGhpcy5mb3JtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZVN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgLy8gQ2xlYW4gdXAgYWxsIHN1YnNjcmlwdGlvbnMgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcclxuICAgIHRoaXMudmFsdWVDaGFuZ2VTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZVN1YnNjcmlwdGlvbnMgPSBbXTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUZpZWxkQ2hhbmdlKGZpZWxkTmFtZTogc3RyaW5nLCBldmVudFZhbHVlPzogYW55KSB7XHJcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbkJ5TmFtZShmaWVsZE5hbWUpO1xyXG4gICAgY29uc3QgZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkTmFtZSk7XHJcblxyXG4gICAgLy8gRm9ybWF0IG1vbnRoLXllYXIgZmllbGRzIChlc3BlY2lhbGx5IGV4cGlyeURhdGUpIHRvIFlZWVktTU1cclxuICAgIGlmIChjb2x1bW4/LnR5cGUgPT09ICdtb250aC15ZWFyJyAmJiBldmVudFZhbHVlKSB7XHJcbiAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRNb250aFllYXJWYWx1ZShldmVudFZhbHVlKTtcclxuICAgICAgaWYgKGZvcm1Db250cm9sICYmIGZvcm1hdHRlZFZhbHVlICE9PSBldmVudFZhbHVlKSB7XHJcbiAgICAgICAgZm9ybUNvbnRyb2wuc2V0VmFsdWUoZm9ybWF0dGVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICBldmVudFZhbHVlID0gZm9ybWF0dGVkVmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29sdW1uPy5vbkNoYW5nZSkge1xyXG4gICAgICAvLyBVc2UgdGhlIGV2ZW50IHZhbHVlIGRpcmVjdGx5ICh3aGF0IHRoZSB1c2VyIGp1c3Qgc2VsZWN0ZWQvdHlwZWQpXHJcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlIGV2ZW4gaWYgZm9ybSBjb250cm9sIGhhc24ndCB1cGRhdGVkIHlldFxyXG4gICAgICBjb25zdCB2YWx1ZVRvUGFzcyA9XHJcbiAgICAgICAgZXZlbnRWYWx1ZSAhPT0gdW5kZWZpbmVkID8gZXZlbnRWYWx1ZSA6IHRoaXMuZm9ybS5nZXQoZmllbGROYW1lKT8udmFsdWU7XHJcbiAgICAgIGNvbnN0IG9uQ2hhbmdlRm4gPSBjb2x1bW4ub25DaGFuZ2U7IC8vIFN0b3JlIHRoZSBmdW5jdGlvbiByZWZlcmVuY2VcclxuXHJcbiAgICAgIC8vIFN0b3JlIHRoZSBzZWxlY3RlZCB2YWx1ZSAtIHRoaXMgaXMgd2hhdCB0aGUgdXNlciBjaG9zZVxyXG4gICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gdmFsdWVUb1Bhc3M7XHJcblxyXG4gICAgICAvLyBFbnN1cmUgdGhlIGZvcm0gY29udHJvbCBoYXMgdGhlIHNlbGVjdGVkIHZhbHVlIGJlZm9yZSBjYWxsaW5nIG9uQ2hhbmdlXHJcbiAgICAgIGlmIChmb3JtQ29udHJvbCAmJiBzZWxlY3RlZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAoZm9ybUNvbnRyb2wudmFsdWUgIT09IHNlbGVjdGVkVmFsdWUpIHtcclxuICAgICAgICAgIGZvcm1Db250cm9sLnNldFZhbHVlKHNlbGVjdGVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIENhbGwgb25DaGFuZ2Ugd2l0aCB0aGUgc2VsZWN0ZWQgdmFsdWVcclxuICAgICAgaWYgKG9uQ2hhbmdlRm4pIHtcclxuICAgICAgICBvbkNoYW5nZUZuKHNlbGVjdGVkVmFsdWUsIHRoaXMuZm9ybSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFJlc3RvcmUgdGhlIHZhbHVlIGZvciB0aGUgZmllbGQgdGhhdCB0cmlnZ2VyZWQgdGhlIGNoYW5nZSBpZiBpdCB3YXMgY2xlYXJlZCBieSBvbkNoYW5nZVxyXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsOiBpZiBvbkNoYW5nZSBjbGVhcnMgdGhlIGZpZWxkIHRoYXQgd2FzIGp1c3QgY2hhbmdlZCwgd2UgcmVzdG9yZSBpdFxyXG4gICAgICAvLyBPbmx5IHJlc3RvcmUgaWYgd2UgaGFkIGEgbm9uLWVtcHR5IHZhbHVlIChlbXB0eSBzdHJpbmcsIG51bGwsIHVuZGVmaW5lZCBhcmUgbm90IHJlc3RvcmVkKVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZm9ybUNvbnRyb2wgJiZcclxuICAgICAgICBzZWxlY3RlZFZhbHVlICE9PSB1bmRlZmluZWQgJiZcclxuICAgICAgICBzZWxlY3RlZFZhbHVlICE9PSBudWxsICYmXHJcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZSAhPT0gJydcclxuICAgICAgKSB7XHJcbiAgICAgICAgLy8gVXNlIHNldFRpbWVvdXQgd2l0aCAwIGRlbGF5IHRvIHJ1biBhZnRlciBhbnkgc3luY2hyb25vdXMgb3BlcmF0aW9ucyBpbiBvbkNoYW5nZVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIHdhcyBjbGVhcmVkIG9yIGNoYW5nZWRcclxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGZvcm1Db250cm9sLnZhbHVlO1xyXG4gICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGRvZXNuJ3QgbWF0Y2ggd2hhdCB3YXMgc2VsZWN0ZWQsIHJlc3RvcmUgaXRcclxuICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBvbkNoYW5nZSBjbGVhcmVkIHRoZSBmaWVsZCB1bmludGVudGlvbmFsbHlcclxuICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT09IHNlbGVjdGVkVmFsdWUpIHtcclxuICAgICAgICAgICAgZm9ybUNvbnRyb2wuc2V0VmFsdWUoc2VsZWN0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb3JtYXRNb250aFllYXJWYWx1ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcclxuICAgIC8vIE5vcm1hbGl6ZSB0byBZWVlZLU1NXHJcbiAgICBpZiAodmFsdWUubWF0Y2goL15cXGR7Mn0tXFxkezR9JC8pKSB7XHJcbiAgICAgIGNvbnN0IFttb250aCwgeWVhcl0gPSB2YWx1ZS5zcGxpdCgnLScpO1xyXG4gICAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH1gO1xyXG4gICAgfVxyXG4gICAgLy8gSWYgYWxyZWFkeSBpbiBZWVlZLU1NIGZvcm1hdCwgcmV0dXJuIGFzIGlzXHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwYXJzZU1vbnRoWWVhclZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHZhbHVlO1xyXG4gICAgLy8gRGlzcGxheSBhbmQgcGlja2VyIGJvdGggdXNlIFlZWVktTU07IG5vcm1hbGl6ZSBNTS1ZWVlZIGlmIHByZXNlbnRcclxuICAgIGlmICh2YWx1ZS5tYXRjaCgvXlxcZHsyfS1cXGR7NH0kLykpIHtcclxuICAgICAgY29uc3QgW21vbnRoLCB5ZWFyXSA9IHZhbHVlLnNwbGl0KCctJyk7XHJcbiAgICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVNb250aFllYXJDaGFuZ2UoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIC8vIEZvcm1hdCB0aGUgaW5wdXQgdmFsdWUgdG8gWVlZWS1NTSBmb3JtYXRcclxuICAgIGxldCBmb3JtYXR0ZWRWYWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgIC8vIElmIGl0J3MgaW4gTU0tWVlZWSBmb3JtYXQsIGNvbnZlcnQgdG8gWVlZWS1NTVxyXG4gICAgaWYgKGZvcm1hdHRlZFZhbHVlLm1hdGNoKC9eXFxkezJ9LVxcZHs0fSQvKSkge1xyXG4gICAgICBjb25zdCBbbW9udGgsIHllYXJdID0gZm9ybWF0dGVkVmFsdWUuc3BsaXQoJy0nKTtcclxuICAgICAgZm9ybWF0dGVkVmFsdWUgPSBgJHt5ZWFyfS0ke21vbnRofWA7XHJcbiAgICB9XHJcbiAgICAvLyBJZiBpdCdzIGluIFlZWVlNTSBmb3JtYXQgKG5vIGRhc2gpLCBjb252ZXJ0IHRvIFlZWVktTU1cclxuICAgIGVsc2UgaWYgKGZvcm1hdHRlZFZhbHVlLm1hdGNoKC9eXFxkezZ9JC8pKSB7XHJcbiAgICAgIGNvbnN0IHllYXIgPSBmb3JtYXR0ZWRWYWx1ZS5zdWJzdHJpbmcoMCwgNCk7XHJcbiAgICAgIGNvbnN0IG1vbnRoID0gZm9ybWF0dGVkVmFsdWUuc3Vic3RyaW5nKDQsIDYpO1xyXG4gICAgICBmb3JtYXR0ZWRWYWx1ZSA9IGAke3llYXJ9LSR7bW9udGh9YDtcclxuICAgIH1cclxuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBpbiBZWVlZLU1NIGZvcm1hdCwgbGVhdmUgYXMgaXNcclxuICAgIGVsc2UgaWYgKGZvcm1hdHRlZFZhbHVlLm1hdGNoKC9eXFxkezR9LVxcZHsyfSQvKSkge1xyXG4gICAgICAvLyBBbHJlYWR5IGluIGNvcnJlY3QgZm9ybWF0XHJcbiAgICB9XHJcbiAgICAvLyBJZiB1c2VyIGlzIHR5cGluZywgYWxsb3cgcGFydGlhbCBpbnB1dFxyXG4gICAgZWxzZSBpZiAoZm9ybWF0dGVkVmFsdWUubWF0Y2goL15cXGR7MSw2fSQvKSkge1xyXG4gICAgICAvLyBBbGxvdyBwYXJ0aWFsIGlucHV0IHdoaWxlIHR5cGluZ1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpO1xyXG4gICAgaWYgKGZvcm1Db250cm9sICYmIGZvcm1hdHRlZFZhbHVlICE9PSB2YWx1ZSkge1xyXG4gICAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaGFuZGxlRmllbGRDaGFuZ2UoZmllbGROYW1lLCBmb3JtYXR0ZWRWYWx1ZSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVNb250aFllYXJCbHVyKGZpZWxkTmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGROYW1lKTtcclxuICAgIGlmICghZm9ybUNvbnRyb2wpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCB2YWx1ZSA9IGZvcm1Db250cm9sLnZhbHVlIHx8ICcnO1xyXG4gICAgLy8gRW5zdXJlIHRoZSB2YWx1ZSBpcyBpbiBZWVlZLU1NIGZvcm1hdCBvbiBibHVyXHJcbiAgICBpZiAodmFsdWUgJiYgIXZhbHVlLm1hdGNoKC9eXFxkezR9LVxcZHsyfSQvKSkge1xyXG4gICAgICAvLyBUcnkgdG8gcGFyc2UgYW5kIGZvcm1hdFxyXG4gICAgICBjb25zdCBmb3JtYXR0ZWQgPSB0aGlzLmZvcm1hdE1vbnRoWWVhclZhbHVlKHZhbHVlKTtcclxuICAgICAgaWYgKGZvcm1hdHRlZCAhPT0gdmFsdWUpIHtcclxuICAgICAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZShmb3JtYXR0ZWQsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlTW9udGhZZWFyUGlja2VyQ2hhbmdlKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAvLyBNb250aCBwaWNrZXIgb3V0cHV0cyBZWVlZLU1NOyBqdXN0IG5vcm1hbGl6ZVxyXG4gICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmZvcm1hdE1vbnRoWWVhclZhbHVlKHZhbHVlKTtcclxuICAgIGNvbnN0IGZvcm1Db250cm9sID0gdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpO1xyXG4gICAgaWYgKGZvcm1Db250cm9sKSB7XHJcbiAgICAgIGZvcm1Db250cm9sLnNldFZhbHVlKGZvcm1hdHRlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgIHRoaXMuaGFuZGxlRmllbGRDaGFuZ2UoZmllbGROYW1lLCBmb3JtYXR0ZWRWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRNb250aFllYXJQaWNrZXJWYWx1ZShmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZm9ybS5nZXQoZmllbGROYW1lKTtcclxuICAgIGlmICghZm9ybUNvbnRyb2wpIHJldHVybiAnJztcclxuICAgIGNvbnN0IHZhbHVlID0gZm9ybUNvbnRyb2wudmFsdWUgfHwgJyc7XHJcbiAgICAvLyBEaXNwbGF5IGFuZCBwaWNrZXIgYm90aCBleHBlY3QgWVlZWS1NTVxyXG4gICAgcmV0dXJuIHRoaXMucGFyc2VNb250aFllYXJWYWx1ZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBvcGVuTW9udGhQaWNrZXIoZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IG1vbnRoSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcclxuICAgICAgZmllbGROYW1lICsgJ19waWNrZXInXHJcbiAgICApIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBpZiAobW9udGhJbnB1dCAmJiBtb250aElucHV0LnR5cGUgPT09ICdtb250aCcpIHtcclxuICAgICAgLy8gVXBkYXRlIHRoZSBwaWNrZXIgdmFsdWUgYmVmb3JlIG9wZW5pbmdcclxuICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5nZXRNb250aFllYXJQaWNrZXJWYWx1ZShmaWVsZE5hbWUpO1xyXG4gICAgICBpZiAoY3VycmVudFZhbHVlKSB7XHJcbiAgICAgICAgbW9udGhJbnB1dC52YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuICAgICAgfVxyXG4gICAgICAvLyBUcnkgbW9kZXJuIHNob3dQaWNrZXIgQVBJIGZpcnN0LCBmYWxsYmFjayB0byBjbGlja1xyXG4gICAgICBpZiAobW9udGhJbnB1dC5zaG93UGlja2VyKSB7XHJcbiAgICAgICAgbW9udGhJbnB1dC5zaG93UGlja2VyKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbW9udGhJbnB1dC5mb2N1cygpO1xyXG4gICAgICAgIG1vbnRoSW5wdXQuY2xpY2soKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Q29sdW1uQnlOYW1lKG5hbWU6IHN0cmluZyk6IEZvcm1Db2x1bW4gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnNlY3Rpb25zXHJcbiAgICAgIC5mbGF0TWFwKChzKSA9PiBzLmZpZWxkcylcclxuICAgICAgLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gbmFtZSk7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlRmllbGRzKGZpZWxkczogRm9ybUNvbHVtbltdKTogRm9ybUNvbHVtbltdIHtcclxuICAgIHJldHVybiBmaWVsZHMuZmlsdGVyKChmKSA9PiBmLnR5cGUgPT09ICdmaWxlJyk7XHJcbiAgfVxyXG5cclxuICBnZXROb25GaWxlRmllbGRzKGZpZWxkczogRm9ybUNvbHVtbltdKTogRm9ybUNvbHVtbltdIHtcclxuICAgIHJldHVybiBmaWVsZHMuZmlsdGVyKChmKSA9PiBmLnR5cGUgIT09ICdmaWxlJyk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVQYXNzd29yZFZpc2liaWxpdHkoZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnBhc3N3b3JkVmlzaWJpbGl0eS5nZXQoZmllbGROYW1lKSB8fCBmYWxzZTtcclxuICAgIHRoaXMucGFzc3dvcmRWaXNpYmlsaXR5LnNldChmaWVsZE5hbWUsICFjdXJyZW50KTtcclxuICB9XHJcbiAgaGFzUmVxdWlyZWRWYWxpZGF0aW9uKGNvbHVtbjogRm9ybUNvbHVtbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGNvbHVtbi52YWxpZGF0aW9ucz8uc29tZSgodikgPT4gdi50eXBlID09PSAncmVxdWlyZWQnKSB8fCBmYWxzZTtcclxuICB9XHJcblxyXG4gIGlzUGFzc3dvcmRWaXNpYmxlKGZpZWxkTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wYXNzd29yZFZpc2liaWxpdHkuZ2V0KGZpZWxkTmFtZSkgfHwgZmFsc2U7XHJcbiAgfVxyXG5cclxuICBidWlsZFZhbGlkYXRvcnMoXHJcbiAgICB2YWxpZGF0aW9ucz86IEZpZWxkVmFsaWRhdGlvbltdLFxyXG4gICAgZm9ybUdyb3VwPzogRm9ybUdyb3VwXHJcbiAgKTogYW55W10ge1xyXG4gICAgaWYgKCF2YWxpZGF0aW9ucykgcmV0dXJuIFtdO1xyXG5cclxuICAgIGNvbnN0IHZhbGlkYXRvcnM6IGFueVtdID0gW107XHJcbiAgICB2YWxpZGF0aW9ucy5mb3JFYWNoKCh2YWxpZGF0aW9uKSA9PiB7XHJcbiAgICAgIHN3aXRjaCAodmFsaWRhdGlvbi50eXBlKSB7XHJcbiAgICAgICAgY2FzZSAncmVxdWlyZWQnOlxyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnZW1haWwnOlxyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMuZW1haWwpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnbWluTGVuZ3RoJzpcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCh2YWxpZGF0aW9uLnZhbHVlKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdtYXhMZW5ndGgnOlxyXG4gICAgICAgICAgdmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHZhbGlkYXRpb24udmFsdWUpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ21pbic6XHJcbiAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW4odmFsaWRhdGlvbi52YWx1ZSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnbWF4JzpcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heCh2YWxpZGF0aW9uLnZhbHVlKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdwYXR0ZXJuJzpcclxuICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4odmFsaWRhdGlvbi52YWx1ZSkpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnY3VzdG9tJzpcclxuICAgICAgICAgIGlmICh2YWxpZGF0aW9uLnZhbGlkYXRvcikge1xyXG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPSB2YWxpZGF0aW9uLnZhbGlkYXRvciEoY29udHJvbC52YWx1ZSwgZm9ybUdyb3VwKTtcclxuICAgICAgICAgICAgICByZXR1cm4gaXNWYWxpZCA/IG51bGwgOiB7IGN1c3RvbTogdHJ1ZSB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB2YWxpZGF0b3JzO1xyXG4gIH1cclxuXHJcbiAgdHJpZ2dlckZpbGVVcGxvYWQoZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWxlSW5wdXRfJyArIGZpZWxkTmFtZSk/LmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBvcGVuVGltZVBpY2tlcihmaWVsZE5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgdGltZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmllbGROYW1lKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xyXG4gICAgaWYgKHRpbWVJbnB1dCAmJiB0aW1lSW5wdXQudHlwZSA9PT0gJ3RpbWUnKSB7XHJcbiAgICAgIC8vIFRyeSBtb2Rlcm4gc2hvd1BpY2tlciBBUEkgZmlyc3QsIGZhbGxiYWNrIHRvIGNsaWNrXHJcbiAgICAgIGlmICh0aW1lSW5wdXQuc2hvd1BpY2tlcikge1xyXG4gICAgICAgIHRpbWVJbnB1dC5zaG93UGlja2VyKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGltZUlucHV0LmZvY3VzKCk7XHJcbiAgICAgICAgdGltZUlucHV0LmNsaWNrKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRmlsZUNoYW5nZShldmVudDogYW55LCBmaWVsZE5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZmlsZTogRmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcclxuICAgIGlmIChmaWxlKSB7XHJcbiAgICAgIHRoaXMuZmlsZU5hbWVzLnNldChmaWVsZE5hbWUsIGZpbGUubmFtZSk7XHJcbiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJhc2U2NFN0cmluZyA9IHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nO1xyXG4gICAgICAgIHRoaXMuZmlsZVByZXZpZXdzLnNldChmaWVsZE5hbWUsIGJhc2U2NFN0cmluZyk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpPy5zZXRWYWx1ZShiYXNlNjRTdHJpbmcpO1xyXG5cclxuICAgICAgICAvLyBUcmlnZ2VyIG9uQ2hhbmdlIGhhbmRsZXIgZm9yIGZpbGUgZmllbGRzXHJcbiAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5nZXRDb2x1bW5CeU5hbWUoZmllbGROYW1lKTtcclxuICAgICAgICBpZiAoY29sdW1uPy5vbkNoYW5nZSkge1xyXG4gICAgICAgICAgY29sdW1uLm9uQ2hhbmdlKGJhc2U2NFN0cmluZywgdGhpcy5mb3JtKTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHRyYWN0RmlsZU5hbWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gJyc7XHJcblxyXG4gICAgLy8gSWYgaXQncyBhIFVSTCwgZXh0cmFjdCBmaWxlbmFtZSBmcm9tIFVSTFxyXG4gICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xyXG4gICAgICBjb25zdCBwYXJ0cyA9IHZhbHVlLnNwbGl0KCcvJyk7XHJcbiAgICAgIHJldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBpdCdzIGJhc2U2NCwgcmV0dXJuIGEgZ2VuZXJpYyBuYW1lXHJcbiAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChgZGF0YTppbWFnZWApKSB7XHJcbiAgICAgIHJldHVybiAndXBsb2FkZWQtaW1hZ2UuanBnJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gJ2V4aXN0aW5nLXBob3RvLmpwZyc7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlUHJldmlldyhmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsZVByZXZpZXdzLmdldChmaWVsZE5hbWUpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRGaWxlTmFtZShmaWVsZE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsZU5hbWVzLmdldChmaWVsZE5hbWUpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBtYXBTZWFyY2hPcHRpb25zKG9wdGlvbnM6IGFueVtdKTogYW55W10ge1xyXG4gICAgcmV0dXJuIG9wdGlvbnMubWFwKG9wdCA9PiAoe1xyXG4gICAgICBjb2RlOiBvcHQuY29kZSB8fCBvcHQudmFsdWUsXHJcbiAgICAgIG5hbWU6IG9wdC5uYW1lIHx8IG9wdC5sYWJlbCB8fCBvcHQudmFsdWUsXHJcbiAgICAgIHZhbHVlOiBvcHQudmFsdWVcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG5cclxuICBkZWxldGVGaWxlKGZpZWxkTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmZpbGVQcmV2aWV3cy5kZWxldGUoZmllbGROYW1lKTtcclxuICAgIHRoaXMuZmlsZU5hbWVzLmRlbGV0ZShmaWVsZE5hbWUpO1xyXG4gICAgdGhpcy5mb3JtLmdldChmaWVsZE5hbWUpPy5zZXRWYWx1ZSgnJyk7XHJcblxyXG4gICAgLy8gVHJpZ2dlciBvbkNoYW5nZSBoYW5kbGVyIHdoZW4gZmlsZSBpcyBkZWxldGVkXHJcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmdldENvbHVtbkJ5TmFtZShmaWVsZE5hbWUpO1xyXG4gICAgaWYgKGNvbHVtbj8ub25DaGFuZ2UpIHtcclxuICAgICAgY29sdW1uLm9uQ2hhbmdlKCcnLCB0aGlzLmZvcm0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlU3VibWl0KCkge1xyXG4gICAgdGhpcy5zdWJtaXR0ZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XHJcbiAgICAgIC8vIE1hcmsgYWxsIGZpZWxkcyBhcyB0b3VjaGVkIHRvIHNob3cgcmVkIGJvcmRlcnNcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5mb3JtLmNvbnRyb2xzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KGtleSk/Lm1hcmtBc1RvdWNoZWQoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBDb3VudCBvbmx5IHJlcXVpcmVkIGZpZWxkcyB0aGF0IGFyZSBpbnZhbGlkXHJcbiAgICAgIGNvbnN0IGFsbENvbHVtbnMgPSB0aGlzLmNvbmZpZy5zZWN0aW9ucy5mbGF0TWFwKChzKSA9PiBzLmZpZWxkcyk7XHJcbiAgICAgIGNvbnN0IGludmFsaWRSZXF1aXJlZENvdW50ID0gT2JqZWN0LmtleXModGhpcy5mb3JtLmNvbnRyb2xzKS5maWx0ZXIoXHJcbiAgICAgICAgKGtleSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoa2V5KTtcclxuICAgICAgICAgIGlmICghY29udHJvbD8uaW52YWxpZCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZmllbGQgaGFzIHJlcXVpcmVkIHZhbGlkYXRpb25cclxuICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZCgoYykgPT4gYy5uYW1lID09PSBrZXkpO1xyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgY29sdW1uPy52YWxpZGF0aW9ucz8uc29tZSgodikgPT4gdi50eXBlID09PSAncmVxdWlyZWQnKSB8fCBmYWxzZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICkubGVuZ3RoO1xyXG5cclxuICAgICAgLy8gT25seSBlbWl0IGlmIHRoZXJlIGFyZSByZXF1aXJlZCBmaWVsZHMgbWlzc2luZ1xyXG4gICAgICBpZiAoaW52YWxpZFJlcXVpcmVkQ291bnQgPiAwKSB7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3IuZW1pdChcclxuICAgICAgICAgIGBQbGVhc2UgZmlsbCBhbGwgcmVxdWlyZWQgZmllbGRzIG1hcmtlZCB3aXRoICouICR7aW52YWxpZFJlcXVpcmVkQ291bnR9IGZpZWxkKHMpIG5lZWQgYXR0ZW50aW9uLmBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmb3JtRGF0YSA9IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgdGhpcy5jb25maWcub25TdWJtaXQoZm9ybURhdGEpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUmVzZXQoKSB7XHJcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5mb3JtLnJlc2V0KCk7XHJcbiAgICBpZiAodGhpcy5jb25maWcub25SZXNldCkge1xyXG4gICAgICB0aGlzLmNvbmZpZy5vblJlc2V0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0ZpZWxkSW52YWxpZChmaWVsZE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkTmFtZSk7XHJcbiAgICByZXR1cm4gISEoZmllbGQgJiYgZmllbGQuaW52YWxpZCAmJiB0aGlzLnN1Ym1pdHRlZCk7XHJcbiAgfVxyXG5cclxuICBnZXRFcnJvck1lc3NhZ2UoZmllbGROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZvcm0uZ2V0KGZpZWxkTmFtZSk7XHJcbiAgICBpZiAoIWZpZWxkPy5lcnJvcnMpIHJldHVybiAnJztcclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGEgY3VzdG9tIG1lc3NhZ2UgZnJvbSB2YWxpZGF0aW9uc1xyXG4gICAgY29uc3QgYWxsQ29sdW1ucyA9IHRoaXMuY29uZmlnLnNlY3Rpb25zLmZsYXRNYXAoKHMpID0+IHMuZmllbGRzKTtcclxuICAgIGNvbnN0IGNvbHVtbiA9IGFsbENvbHVtbnMuZmluZCgoYykgPT4gYy5uYW1lID09PSBmaWVsZE5hbWUpO1xyXG4gICAgLy8gQ2hlY2sgZm9yIGN1c3RvbSB2YWxpZGF0aW9uIGVycm9yXHJcbiAgICBpZiAoZmllbGQuZXJyb3JzWydjdXN0b20nXSkge1xyXG4gICAgICBjb25zdCBjdXN0b21WYWxpZGF0aW9uID0gY29sdW1uPy52YWxpZGF0aW9ucz8uZmluZChcclxuICAgICAgICAodikgPT4gdi50eXBlID09PSAnY3VzdG9tJ1xyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gY3VzdG9tVmFsaWRhdGlvbj8ubWVzc2FnZSB8fCAnSW52YWxpZCBmaWVsZCc7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhIGN1c3RvbSBtZXNzYWdlIGZyb20gdmFsaWRhdGlvbnNcclxuICAgIGNvbnN0IGVycm9yS2V5cyA9IE9iamVjdC5rZXlzKGZpZWxkLmVycm9ycyk7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBlcnJvcktleXMpIHtcclxuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IGNvbHVtbj8udmFsaWRhdGlvbnM/LmZpbmQoKHYpID0+IHYudHlwZSA9PT0ga2V5KTtcclxuICAgICAgaWYgKHZhbGlkYXRpb24/Lm1lc3NhZ2UpIHtcclxuICAgICAgICByZXR1cm4gdmFsaWRhdGlvbi5tZXNzYWdlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBEZWZhdWx0IGVycm9yIG1lc3NhZ2VzXHJcbiAgICBpZiAoZmllbGQuZXJyb3JzWydyZXF1aXJlZCddKSB7XHJcbiAgICAgIHJldHVybiBgJHtjb2x1bW4/LmxhYmVsfSBpcyByZXF1aXJlZGA7XHJcbiAgICB9XHJcbiAgICBpZiAoZmllbGQuZXJyb3JzWydlbWFpbCddKSByZXR1cm4gJ0ludmFsaWQgZW1haWwgZm9ybWF0JztcclxuICAgIGlmIChmaWVsZC5lcnJvcnNbJ21pbmxlbmd0aCddKVxyXG4gICAgICByZXR1cm4gYE1pbmltdW0gbGVuZ3RoIGlzICR7ZmllbGQuZXJyb3JzWydtaW5sZW5ndGgnXS5yZXF1aXJlZExlbmd0aH1gO1xyXG4gICAgaWYgKGZpZWxkLmVycm9yc1snbWF4bGVuZ3RoJ10pXHJcbiAgICAgIHJldHVybiBgTWF4aW11bSBsZW5ndGggaXMgJHtmaWVsZC5lcnJvcnNbJ21heGxlbmd0aCddLnJlcXVpcmVkTGVuZ3RofWA7XHJcbiAgICBpZiAoZmllbGQuZXJyb3JzWydtaW4nXSlcclxuICAgICAgcmV0dXJuIGBNaW5pbXVtIHZhbHVlIGlzICR7ZmllbGQuZXJyb3JzWydtaW4nXS5taW59YDtcclxuICAgIGlmIChmaWVsZC5lcnJvcnNbJ21heCddKVxyXG4gICAgICByZXR1cm4gYE1heGltdW0gdmFsdWUgaXMgJHtmaWVsZC5lcnJvcnNbJ21heCddLm1heH1gO1xyXG4gICAgaWYgKGZpZWxkLmVycm9yc1sncGF0dGVybiddKSByZXR1cm4gJ0ludmFsaWQgZm9ybWF0JztcclxuICAgIHJldHVybiAnSW52YWxpZCBmaWVsZCc7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|