tuain-ng-forms-lib 17.3.7 → 19.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +280 -335
  2. package/fesm2022/tuain-ng-forms-lib.mjs +297 -103
  3. package/fesm2022/tuain-ng-forms-lib.mjs.map +1 -1
  4. package/lib/classes/forms/action.d.ts +3 -2
  5. package/lib/classes/forms/element.d.ts +2 -1
  6. package/lib/classes/forms/field.d.ts +5 -4
  7. package/lib/classes/forms/form.d.ts +4 -2
  8. package/lib/classes/forms/piece-propagate.d.ts +2 -1
  9. package/lib/classes/forms/piece.d.ts +4 -3
  10. package/lib/classes/forms/section.d.ts +3 -2
  11. package/lib/classes/forms/subsection.d.ts +2 -1
  12. package/lib/classes/forms/table/action.d.ts +2 -1
  13. package/lib/classes/forms/table/column.d.ts +2 -1
  14. package/lib/classes/forms/table/row-data.d.ts +3 -2
  15. package/lib/classes/forms/table/table.d.ts +3 -1
  16. package/lib/components/elements/layout/piece.component.d.ts +2 -2
  17. package/lib/components/forms/basic-form.d.ts +4 -4
  18. package/lib/interfaces/action.interface.d.ts +23 -0
  19. package/lib/interfaces/field.interface.d.ts +70 -0
  20. package/lib/interfaces/form-config.interface.d.ts +24 -16
  21. package/lib/interfaces/form.interface.d.ts +106 -0
  22. package/lib/interfaces/index.d.ts +7 -0
  23. package/lib/interfaces/piece.interface.d.ts +67 -0
  24. package/lib/interfaces/section.interface.d.ts +56 -0
  25. package/lib/interfaces/sse-live-connection.interface.d.ts +67 -0
  26. package/lib/interfaces/table.interface.d.ts +139 -0
  27. package/lib/services/file-manager.service.d.ts +4 -4
  28. package/lib/services/form-manager.service.d.ts +3 -3
  29. package/lib/services/icon-dictionary.service.d.ts +1 -1
  30. package/lib/services/sse-live-connection.service.d.ts +56 -0
  31. package/lib/tokens/sse-live-connection.token.d.ts +7 -0
  32. package/package.json +6 -7
  33. package/public-api.d.ts +2 -0
  34. package/esm2022/lib/classes/forms/action.mjs +0 -112
  35. package/esm2022/lib/classes/forms/element.mjs +0 -25
  36. package/esm2022/lib/classes/forms/field.mjs +0 -484
  37. package/esm2022/lib/classes/forms/form.constants.mjs +0 -55
  38. package/esm2022/lib/classes/forms/form.mjs +0 -589
  39. package/esm2022/lib/classes/forms/piece-propagate.mjs +0 -36
  40. package/esm2022/lib/classes/forms/piece.mjs +0 -139
  41. package/esm2022/lib/classes/forms/section.mjs +0 -150
  42. package/esm2022/lib/classes/forms/subsection.mjs +0 -96
  43. package/esm2022/lib/classes/forms/table/action.mjs +0 -49
  44. package/esm2022/lib/classes/forms/table/column.mjs +0 -74
  45. package/esm2022/lib/classes/forms/table/row-data.mjs +0 -116
  46. package/esm2022/lib/classes/forms/table/table.mjs +0 -537
  47. package/esm2022/lib/components/elements/action.component.mjs +0 -71
  48. package/esm2022/lib/components/elements/field.component.mjs +0 -113
  49. package/esm2022/lib/components/elements/layout/element.component.mjs +0 -23
  50. package/esm2022/lib/components/elements/layout/form-error.component.mjs +0 -25
  51. package/esm2022/lib/components/elements/layout/form-header.component.mjs +0 -25
  52. package/esm2022/lib/components/elements/layout/piece.component.mjs +0 -59
  53. package/esm2022/lib/components/elements/layout/section.component.mjs +0 -57
  54. package/esm2022/lib/components/elements/layout/sub-section.component.mjs +0 -57
  55. package/esm2022/lib/components/elements/tables/table-record-action.component.mjs +0 -71
  56. package/esm2022/lib/components/elements/tables/table-record-field.component.mjs +0 -32
  57. package/esm2022/lib/components/elements/tables/table.component.mjs +0 -109
  58. package/esm2022/lib/components/forms/basic-form.mjs +0 -1408
  59. package/esm2022/lib/components/shared/constants.mjs +0 -2
  60. package/esm2022/lib/interfaces/form-config.interface.mjs +0 -2
  61. package/esm2022/lib/interfaces/icon-resolver.interface.mjs +0 -2
  62. package/esm2022/lib/interfaces/index.mjs +0 -3
  63. package/esm2022/lib/services/base-icon-resolver.service.mjs +0 -40
  64. package/esm2022/lib/services/event-manager.service.mjs +0 -55
  65. package/esm2022/lib/services/file-manager.service.mjs +0 -14
  66. package/esm2022/lib/services/form-manager.service.mjs +0 -88
  67. package/esm2022/lib/services/icon-dictionary.service.mjs +0 -162
  68. package/esm2022/lib/tokens/icon-resolver.token.mjs +0 -3
  69. package/esm2022/lib/tuain-ng-forms-lib.module.mjs +0 -54
  70. package/esm2022/public-api.mjs +0 -43
  71. package/esm2022/tuain-ng-forms-lib.mjs +0 -5
@@ -1,484 +0,0 @@
1
- import { Subject } from 'rxjs';
2
- import yn from 'yn';
3
- import { ElementType, NO_ERROR } from './form.constants';
4
- import { FormElement } from './element';
5
- const UNDEFINED = 'undefined';
6
- const DEFAULT_ERROR_TYPE = 'error';
7
- const DEFAULT_CAPTURE_TYPE = 'INPUT';
8
- const DEFAULT_ALIGNMENT = 'left';
9
- const STD_MAX_LENGTH = 50;
10
- const BIG_MAX_LENGTH = 500;
11
- const directChanges = [
12
- 'defaultEditable', 'defaultValue', 'alignment', 'required', 'errorCode', 'errorMessage', 'errorType',
13
- 'tooltip', 'info', 'format', 'intrinsicErrorMessage', 'outputOnly', 'captureType', 'title', 'type',
14
- 'maxLength', 'maxValue', 'minLength', 'minValue', 'validateOnServer', 'serverAction', 'visibleLabel',
15
- 'options', 'placeholder',
16
- ];
17
- const attrs = {
18
- captureType: { name: '_captureType', propagate: 'captureType' },
19
- errorCode: { name: '_errorCode', propagate: 'errorCode' },
20
- errorMessage: { name: '_errorMessage', propagate: 'errorMessage' },
21
- errorType: { name: '_errorType', propagate: 'errorType' },
22
- defaultValue: { name: '_defaultValue', propagate: 'defaultValue' },
23
- defaultEditable: { name: '_defaultEditable', propagate: 'defaultEditable' },
24
- fieldAlignment: { name: '_fieldAlignment', propagate: 'alignment' },
25
- fieldCode: { name: '_fieldCode', propagate: 'code' },
26
- fieldInfo: { name: '_fieldInfo', propagate: 'info' },
27
- fieldRequired: { name: '_fieldRequired', propagate: 'required' },
28
- fieldTitle: { name: '_fieldTitle', propagate: 'title' },
29
- fieldType: { name: '_fieldType', propagate: 'type' },
30
- fieldFormat: { name: '_fieldFormat', propagate: 'format' },
31
- fieldOptions: { name: '_fieldOptions', propagate: 'options' },
32
- focus: { name: '_focus', propagate: 'focus' },
33
- hasChanged: { name: '_hasChanged', propagate: 'hasChanged' },
34
- intrinsicErrorMessage: { name: '_intrinsicErrorMessage', propagate: null },
35
- maxLength: { name: '_maxLength', propagate: 'maxLength' },
36
- maxValue: { name: '_maxValue', propagate: 'maxValue' },
37
- minLength: { name: '_minLength', propagate: 'minLength' },
38
- minValue: { name: '_minValue', propagate: 'minValue' },
39
- onValidation: { name: '_onValidation', propagate: 'onValidation' },
40
- outputOnly: { name: '_outputOnly', propagate: 'outputOnly' },
41
- placeholder: { name: '_placeholder', propagate: 'placeholder' },
42
- tooltipText: { name: '_tooltipText', propagate: 'tooltip' },
43
- validateOnServer: { name: '_validateOnServer', propagate: 'validateOnServer' },
44
- value: { name: '_value', propagate: 'value' },
45
- visibleLabel: { name: '_visibleLabel', propagate: 'visibleLabel' },
46
- };
47
- export class FieldDescriptor extends FormElement {
48
- _customEvent = new Subject();
49
- _editionFinish = new Subject();
50
- _editionPartial = new Subject();
51
- _detailRequest = new Subject();
52
- _errorType = '';
53
- _errorCode = '';
54
- _errorMessage = '';
55
- _intrinsicErrorMessage = '';
56
- _minValue;
57
- _maxValue;
58
- _maxLength = 0;
59
- _minLength = 0;
60
- _focus = false;
61
- _onValidation = false;
62
- _validateOnServer = false;
63
- _value;
64
- _visibleLabel = false;
65
- _captureType = '';
66
- _defaultValue = '';
67
- _defaultEditable = false;
68
- _externalValue;
69
- _fieldAlignment = '';
70
- _fieldInfo = '';
71
- _fieldRequired = false;
72
- _fieldTitle = '';
73
- _fieldType = '';
74
- _fieldFormat = null;
75
- _hasChanged = false;
76
- _outputOnly = false;
77
- _tooltipText = '';
78
- _placeholder = '';
79
- _fieldCode = '';
80
- _fieldOptions = null;
81
- _customEmpty = null;
82
- constructor(inputFieldReceived, formConfig) {
83
- super(inputFieldReceived, formConfig);
84
- this.elementType = ElementType.Field;
85
- const fld = (inputFieldReceived) ? inputFieldReceived : {};
86
- this.setAttr(attrs.fieldCode, fld.fieldCode);
87
- this.title = fld.fieldTitle ?? this._fieldCode;
88
- this.placeholder = fld.placeholder ?? this.title;
89
- this.type = fld.fieldTypeCode;
90
- this.captureType = fld.captureType ?? DEFAULT_CAPTURE_TYPE;
91
- const defaultValue = fld.defaultValue ?? null;
92
- if (this._fieldType === this._formConfig.fieldTypes.boolean) {
93
- this.defaultValue = defaultValue ?? false;
94
- }
95
- else {
96
- this.defaultValue = defaultValue;
97
- }
98
- const defaultTypeAlignment = (this._formConfig.tableFieldStyles[this._fieldType] != null)
99
- ? this._formConfig.tableFieldStyles[this._fieldType]['text-align'] : DEFAULT_ALIGNMENT;
100
- const fieldAlignment = (fld.alignment != null) ? fld.alignment.toLowerCase() : defaultTypeAlignment;
101
- this.alignment = fieldAlignment;
102
- this.info = fld.info || '';
103
- let fieldFormat;
104
- try {
105
- if (fld.format && typeof fld.format === 'string') {
106
- fieldFormat = new RegExp(fld.format);
107
- }
108
- else if (fld.format?.regExp) {
109
- fieldFormat = new RegExp(fld.format?.regExp);
110
- }
111
- }
112
- catch (e) {
113
- fieldFormat = null;
114
- }
115
- this.format = fieldFormat;
116
- this.validateOnServer = fld.serverAction ?? false;
117
- this.tooltip = fld.tooltip || '';
118
- this.defaultEditable = this.enabled;
119
- this.required = fld.required ?? false;
120
- this.outputOnly = fld.outputOnly ?? false;
121
- this.minValue = fld.minValue;
122
- this.maxValue = fld.maxValue;
123
- this.minLength = fld.minLength ?? 0;
124
- this.maxLength = fld.maxLength || (this._captureType === 'TEXTAREA' ? BIG_MAX_LENGTH : STD_MAX_LENGTH);
125
- this.intrinsicErrorMessage = this._formConfig?.fieldValidations?.[this._fieldType]?.message
126
- ?? this._formConfig?.fieldValidations?.DEFAULT?.message ?? '';
127
- this.setError(fld.errorCode, fld.errorMessage, fld.errorType ?? DEFAULT_ERROR_TYPE);
128
- this.setEditable(fld.editable ?? true);
129
- this.visibleLabel = fld.visibleLabel ?? true;
130
- this.setVisibility(fld.visible);
131
- this.options = fld.fieldOptions;
132
- this._setValue(fld.fieldValue ?? this._defaultValue ?? '');
133
- }
134
- get alignment() { return this._fieldAlignment; }
135
- set alignment(alignment) { this.setAttr(attrs.fieldAlignment, alignment); }
136
- get backend() { return this._validateOnServer; }
137
- get captureType() { return this._captureType; }
138
- set captureType(captureType) { this.setAttr(attrs.captureType, captureType); }
139
- get placeholder() { return this._placeholder; }
140
- set placeholder(placeholder) { this.setAttr(attrs.placeholder, placeholder); }
141
- get code() { return this._fieldCode; }
142
- get defaultValue() { return this._defaultValue; }
143
- set defaultValue(defaultValue) { this.setAttr(attrs.defaultValue, defaultValue); }
144
- get defaultEditable() { return this._defaultEditable; }
145
- set defaultEditable(editable) { this.setAttr(attrs.defaultEditable, editable); }
146
- get detailRequest() { return this._detailRequest.asObservable(); }
147
- get customEvent() { return this._customEvent.asObservable(); }
148
- get editionFinish() { return this._editionFinish.asObservable(); }
149
- get editionPartial() { return this._editionPartial.asObservable(); }
150
- get empty() { return this._customEmpty ? this._customEmpty.call(this) : this.defaultEmpty(); }
151
- get error() { return { type: this._errorType, code: this._errorCode, message: this._errorMessage }; }
152
- set error(errorObj) { this.setError(errorObj.code, errorObj.message, errorObj.type ?? DEFAULT_ERROR_TYPE); }
153
- get errorCode() { return this._errorCode; }
154
- set errorCode(code) { this.setError(code, this._errorMessage); }
155
- get errorMessage() { return this._errorMessage; }
156
- set errorMessage(msg) { this.setError(this._errorCode, msg); }
157
- get errorType() { return this._errorType; }
158
- get externalValue() { return this._externalValue; }
159
- get format() { return this._fieldFormat; }
160
- set format(format) { this.setAttr(attrs.fieldFormat, format); }
161
- get hasChanged() { return this._hasChanged; }
162
- set hasChanged(hasChanged) { this.setAttr(attrs.hasChanged, hasChanged); }
163
- get info() { return this._fieldInfo; }
164
- set info(newInfo) { this.setAttr(attrs.fieldInfo, newInfo); }
165
- set intrinsicErrorMessage(message) { this.setAttr(attrs.intrinsicErrorMessage, message); }
166
- get maxLength() { return (this._maxLength > 0) ? this._maxLength.toString() : ''; }
167
- set maxLength(requiredMaxLength) { this.setAttr(attrs.maxLength, requiredMaxLength ? +requiredMaxLength : null); }
168
- get maxValue() { return this._maxValue; }
169
- set maxValue(inputMaxValue) {
170
- let maxValue = inputMaxValue;
171
- if (this._fieldType === this._formConfig.fieldTypes.date) {
172
- maxValue = new Date(maxValue);
173
- }
174
- this.setAttr(attrs.maxValue, maxValue);
175
- }
176
- get minLength() { return this._minLength; }
177
- set minLength(requiredMinLength) {
178
- this.setAttr(attrs.minLength, requiredMinLength ? +requiredMinLength : null);
179
- }
180
- get minValue() { return this._minValue; }
181
- set minValue(inputMinValue) {
182
- let minValue = inputMinValue;
183
- if (this._fieldType === this._formConfig.fieldTypes.date) {
184
- minValue = new Date(minValue);
185
- }
186
- this.setAttr(attrs.minValue, minValue);
187
- }
188
- get name() { return this._fieldCode; }
189
- get options() {
190
- return this._fieldOptions?.map(option => {
191
- const optionCopy = { ...option };
192
- return optionCopy;
193
- }) ?? [];
194
- }
195
- set options(newOptions) {
196
- if ((!this._formConfig.captureTypesWithOptions.includes(this._captureType))
197
- || typeof newOptions === UNDEFINED || !newOptions
198
- || !Array.isArray(newOptions)) {
199
- return;
200
- }
201
- let fieldOptions = newOptions.map((option) => {
202
- if (option.text !== undefined && option.text !== null
203
- && option.value !== undefined && option.value !== null) {
204
- return { fieldOptionValue: option.text, fieldOptionId: option.value };
205
- }
206
- return option;
207
- });
208
- fieldOptions = (fieldOptions && Array.isArray(fieldOptions)
209
- && fieldOptions.length > 0) ? fieldOptions : [];
210
- this.setAttr(attrs.fieldOptions, fieldOptions);
211
- if (this._value) {
212
- if (this._fieldType === this._formConfig.fieldTypes.array && Array.isArray(this._value)) {
213
- const fieldValue = this._value?.filter(item => this._fieldOptions?.find(opt => opt.fieldOptionId === item));
214
- this.setAttr(attrs.value, fieldValue);
215
- }
216
- else {
217
- const valInOptions = this._fieldOptions?.find(item => item.fieldOptionId === this._value);
218
- if (!valInOptions) {
219
- this._setValue('');
220
- }
221
- }
222
- }
223
- if (this._fieldRequired && this._fieldOptions?.length === 1 && this._value !== this._fieldOptions?.[0].fieldOptionId) {
224
- this._setValue(this._fieldOptions?.[0].fieldOptionId);
225
- this.notifyEditionFinish();
226
- }
227
- }
228
- get optionText() { return this._fieldOptions?.find(item => item.fieldOptionId === this._value)?.fieldOptionValue ?? null; }
229
- get outputOnly() { return this._outputOnly; }
230
- set outputOnly(outputOnly) { this.setAttr(attrs.outputOnly, outputOnly); }
231
- get required() { return this._fieldRequired; }
232
- set required(required) { this.setAttr(attrs.fieldRequired, required ?? false); }
233
- get title() { return this._fieldTitle; }
234
- set title(title) { this.setAttr(attrs.fieldTitle, title?.toString() ?? ''); }
235
- get tooltip() { return this._tooltipText; }
236
- set tooltip(tooltip) { this.setAttr(attrs.tooltipText, tooltip); }
237
- get type() { return this._fieldType; }
238
- set type(fieldType) { this.setAttr(attrs.fieldType, fieldType); }
239
- get onValidation() { return this._onValidation; }
240
- get validating() { return this._onValidation; }
241
- set validating(isValidating) { this.setAttr(attrs.onValidation, isValidating); }
242
- get value() {
243
- return (this._fieldType === this._formConfig.fieldTypes.boolean
244
- || this._fieldType === this._formConfig.fieldTypes.check) ? yn(this._value) : this._value;
245
- }
246
- get validateOnServer() { return this._validateOnServer; }
247
- set validateOnServer(validateOnServer) { this.setAttr(attrs.validateOnServer, validateOnServer); }
248
- get serverAction() { return this._validateOnServer; }
249
- set serverAction(validateOnServer) { this.validateOnServer = validateOnServer; }
250
- set value(newValue) { this._setValue(newValue); }
251
- get visibleLabel() { return this._visibleLabel; }
252
- set visibleLabel(visibleLabel) { this.setAttr(attrs.visibleLabel, visibleLabel); }
253
- /**
254
- * @deprecated Since v17. Use value instead. Will be removed in v19.
255
- */
256
- get fieldValue() { return this.value; }
257
- /**
258
- * @deprecated Since v17. Use hasChanged instead. Will be removed in v19.
259
- */
260
- changed(hasChanged = true) { this.hasChanged = hasChanged; }
261
- clean() { this._setValue(this._defaultValue || ''); this.resetError(); }
262
- setCustomEmpty(fn) { this._customEmpty = fn; }
263
- focus() { this.setAttr(attrs.focus, true); }
264
- getErrorCode() { return this.error.code; }
265
- setErrorCode(code) { this.setError(code, this._errorMessage); }
266
- getErrorMessage() { return this.error.message; }
267
- setErrorMessage(msg) { this.setError(this._errorCode, msg); }
268
- getRequired() { return this.required; }
269
- hasError() { return this._errorCode !== NO_ERROR; }
270
- hideLabel() { this.visibleLabel = false; }
271
- resetError() { (this._errorCode !== NO_ERROR) && this.setError(NO_ERROR, null); }
272
- setEditable(editable = true) { (editable) ? this.enable() : this.disable(); }
273
- setValue(newValue, widgetUpdate = true) { this._setValue(newValue, widgetUpdate); }
274
- showLabel() { this.visibleLabel = true; }
275
- /**
276
- * @deprecated Since v17. Use code instead. Will be removed in v19.
277
- */
278
- get fieldCode() { return this._fieldCode; }
279
- /**
280
- * @deprecated Since v17. Use title instead. Will be removed in v19.
281
- */
282
- setLabel(label) { this.title = label; }
283
- /**
284
- * @deprecated Since v17. Use required instead. Will be removed in v19.
285
- */
286
- setRequired(required) { this.required = required; }
287
- /**
288
- * @deprecated Since v17. Use changed instead. Will be removed in v19.
289
- */
290
- setChanged(hasChanged) { this.changed(hasChanged); }
291
- /**
292
- * @deprecated Since v17. Use value instead. Will be removed in v19.
293
- */
294
- getValue() { return this.value; }
295
- /**
296
- * @deprecated Since v17. Use empty instead. Will be removed in v19.
297
- */
298
- isEmpty() { return this.empty; }
299
- /**
300
- * @deprecated Since v17. Use error instead. Will be removed in v19.
301
- */
302
- getError() { return this.error; }
303
- /**
304
- * @deprecated Since v17. Use optionText instead. Will be removed in v19.
305
- */
306
- getOptionText() { return this.optionText; }
307
- /**
308
- * @deprecated Since v17. Use options instead. Will be removed in v19.
309
- */
310
- getFieldOptions() { return this.options; }
311
- /**
312
- * @deprecated Since v17. Use options instead. Will be removed in v19.
313
- */
314
- setFieldOptions(newOptions) { return this.options = newOptions; }
315
- /**
316
- * @deprecated Since v17. Use intrinsicErrorMessage instead. Will be removed in v19.
317
- */
318
- setIntrinsicErrorMessage(message) { this.intrinsicErrorMessage = message; }
319
- /**
320
- * @deprecated Since v17. Use maxValue instead. Will be removed in v19.
321
- */
322
- setMaxValue(inputMaxValue) { this.maxValue = inputMaxValue; }
323
- /**
324
- * @deprecated Since v17. Use minValue instead. Will be removed in v19.
325
- */
326
- setMinValue(inputMinValue) { this.minValue = inputMinValue; }
327
- /**
328
- * @deprecated Since v17. Use showLabel instead. Will be removed in v19.
329
- */
330
- setVisibleLabel(visibleLabel) { this.visibleLabel = visibleLabel; }
331
- defaultEmpty() {
332
- const fieldCurrentValue = this.value;
333
- if (fieldCurrentValue === undefined || fieldCurrentValue === null) {
334
- return true;
335
- }
336
- if (this._fieldType === this._formConfig.fieldTypes.array
337
- && Array.isArray(fieldCurrentValue) && fieldCurrentValue.length === 0) {
338
- return true;
339
- }
340
- ;
341
- if (this._fieldType === this._formConfig.fieldTypes.phone) {
342
- if (!Array.isArray(fieldCurrentValue)) {
343
- return true;
344
- }
345
- if (fieldCurrentValue.length !== 2 || !fieldCurrentValue[0] || !fieldCurrentValue[1]) {
346
- return true;
347
- }
348
- return false;
349
- }
350
- ;
351
- const arrayFieldTypes = this._formConfig.arrayFieldTypes ?? null;
352
- if (arrayFieldTypes && Object.keys(arrayFieldTypes).includes(this._fieldType)) {
353
- let arraySize = arrayFieldTypes[this._fieldType];
354
- arraySize = !Number.isNaN(+arraySize) ? +arraySize : 0;
355
- if (arraySize === 0) {
356
- return (Array.isArray(fieldCurrentValue) && fieldCurrentValue.length === 0);
357
- }
358
- return (Array.isArray(fieldCurrentValue) && fieldCurrentValue.length < arraySize);
359
- }
360
- ;
361
- return fieldCurrentValue === '';
362
- }
363
- notifyEditionPartial() {
364
- this.resetError();
365
- this._editionPartial.next({ code: this._fieldCode, intrinsicValidation: true });
366
- }
367
- triggerCustomEvent(eventName, eventData) {
368
- this._customEvent.next({ code: this._fieldCode, eventName, eventData });
369
- }
370
- notifyEditionFinish() {
371
- const fieldValue = this.value;
372
- this.resetError();
373
- const validationConfig = this._formConfig.fieldValidations?.[this._fieldType] ?? {};
374
- const { type, validation } = validationConfig;
375
- let message = validationConfig?.message;
376
- let intrinsicValidation = true;
377
- if (fieldValue && (validation || this._fieldFormat)) {
378
- if (type === 'regexp') {
379
- intrinsicValidation = (validation?.test(fieldValue) ?? true)
380
- && (this._fieldFormat?.test(fieldValue) ?? true);
381
- }
382
- else if (type === 'function' && typeof validation === 'function') {
383
- const { valid, message: customMessage } = validation(fieldValue, this);
384
- intrinsicValidation = valid;
385
- message = customMessage;
386
- }
387
- if (!intrinsicValidation) {
388
- this.setError('99', message ?? this._intrinsicErrorMessage);
389
- }
390
- }
391
- if (intrinsicValidation && fieldValue && this._minValue && fieldValue < this._minValue) {
392
- intrinsicValidation = false;
393
- const formatedMinValue = !isNaN(+this._minValue)
394
- ? Number(this._minValue).toLocaleString('es-CO')
395
- : this._minValue;
396
- this.setError('99', `El valor de ${this.title} no puede ser inferior a ${formatedMinValue}`);
397
- }
398
- if (intrinsicValidation && fieldValue && this._maxValue && fieldValue > this._maxValue) {
399
- intrinsicValidation = false;
400
- const formatedMaxValue = !isNaN(+this._maxValue)
401
- ? Number(this._maxValue).toLocaleString('es-CO')
402
- : this._maxValue;
403
- this.setError('99', `El valor de ${this.title} no puede ser superior a ${formatedMaxValue}`);
404
- }
405
- if (intrinsicValidation && fieldValue && typeof fieldValue === 'string'
406
- && this._minLength && fieldValue?.length < this._minLength) {
407
- intrinsicValidation = false;
408
- this.setError('99', `Longitud de ${this._fieldTitle} debe ser de al menos ${this._minLength}`);
409
- }
410
- this._editionFinish.next({ code: this._fieldCode, intrinsicValidation });
411
- }
412
- notifyEditionDetailRequest(detail) {
413
- const detailEvent = { code: this._fieldCode, detail };
414
- this._detailRequest.next(detailEvent);
415
- }
416
- setError(code, message, type = DEFAULT_ERROR_TYPE) {
417
- this.setAttr(attrs.errorCode, code ?? NO_ERROR);
418
- this.setAttr(attrs.errorType, (this._errorCode === NO_ERROR) ? '' : type);
419
- this.setAttr(attrs.errorMessage, message ?? '');
420
- }
421
- updateFromServer(fld) {
422
- const fieldKeys = Object.keys(fld);
423
- for (let index = 0; index < fieldKeys.length; index++) {
424
- const attrName = fieldKeys[index];
425
- const attrValue = fld[attrName];
426
- if (directChanges.includes(attrName)) {
427
- this[attrName] = attrValue;
428
- }
429
- else {
430
- (attrName === 'label') && (this.title = attrValue);
431
- (attrName === 'labelVisible') && (this.visibleLabel = attrValue);
432
- (attrName === 'editable') && this.setEditable(attrValue);
433
- (attrName === 'visible') && this.setVisibility(attrValue);
434
- (attrName === 'value') && (this._setValue(attrValue) && (this.hasChanged = false));
435
- (attrName === 'fieldValue') && (this._setValue(attrValue) && (this.hasChanged = false));
436
- (attrName === 'fieldOptions') && (this.options = attrValue);
437
- (attrName === 'fieldTitle') && (this.title = attrValue);
438
- (attrName === 'fieldTypeCode') && (this.type = attrValue);
439
- (attrName === 'fieldType') && (this.type = attrValue);
440
- (attrName === 'tooltipText') && (this.tooltip = attrValue);
441
- (attrName === 'customAttributes') && (this.setCustomAttributes(attrValue));
442
- }
443
- }
444
- }
445
- _setValue(newValue, widgetUpdate = true) {
446
- if (typeof newValue === UNDEFINED) {
447
- return true;
448
- }
449
- if (newValue === null && this.required) {
450
- return true;
451
- }
452
- let newFinalValue;
453
- if (this._fieldType === this._formConfig.fieldTypes.boolean
454
- || this._fieldType === this._formConfig.fieldTypes.check) {
455
- newFinalValue = yn(newValue) ?? false;
456
- }
457
- else if (this._fieldType === this._formConfig.fieldTypes.array
458
- || this._fieldType === this._formConfig.fieldTypes.map) {
459
- if (newValue === null || newValue === '') {
460
- newFinalValue = [];
461
- }
462
- else if (Array.isArray(newValue)) {
463
- newFinalValue = newValue;
464
- }
465
- else {
466
- newFinalValue = newValue.toString().split(',');
467
- }
468
- }
469
- else {
470
- newFinalValue = newValue;
471
- }
472
- if (this._value !== newFinalValue) {
473
- this._hasChanged = true;
474
- if (widgetUpdate) {
475
- this.setAttr(attrs.value, newFinalValue);
476
- }
477
- else {
478
- this._value = newFinalValue;
479
- }
480
- }
481
- return true;
482
- }
483
- }
484
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWFpbi1uZy1mb3Jtcy1saWIvc3JjL2xpYi9jbGFzc2VzL2Zvcm1zL2ZpZWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUd4QyxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUM7QUFFOUIsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUM7QUFDbkMsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLENBQUM7QUFDckMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFFakMsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBQzFCLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQztBQUUzQixNQUFNLGFBQWEsR0FBRztJQUNwQixpQkFBaUIsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFdBQVc7SUFDcEcsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsdUJBQXVCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTTtJQUNsRyxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGNBQWM7SUFDcEcsU0FBUyxFQUFFLGFBQWE7Q0FDekIsQ0FBQztBQUVGLE1BQU0sS0FBSyxHQUFHO0lBQ1osV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFO0lBQy9ELFNBQVMsRUFBRSxFQUFF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QUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDM0MsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO1lBQzlCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeW4gZnJvbSAneW4nO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUsIE5PX0VSUk9SIH0gZnJvbSAnLi9mb3JtLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBGb3JtRWxlbWVudCB9IGZyb20gJy4vZWxlbWVudCc7XG5pbXBvcnQgeyBGaWVsZERlZmluaXRpb24sIEZpZWxkRWRpdGlvbkV2ZW50LCBGaWVsZEN1c3RvbUV2ZW50RGF0YSwgSUZvcm1Db25maWcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2Zvcm0tY29uZmlnLmludGVyZmFjZSc7XG5cbmNvbnN0IFVOREVGSU5FRCA9ICd1bmRlZmluZWQnO1xuXG5jb25zdCBERUZBVUxUX0VSUk9SX1RZUEUgPSAnZXJyb3InO1xuY29uc3QgREVGQVVMVF9DQVBUVVJFX1RZUEUgPSAnSU5QVVQnO1xuY29uc3QgREVGQVVMVF9BTElHTk1FTlQgPSAnbGVmdCc7XG5cbmNvbnN0IFNURF9NQVhfTEVOR1RIID0gNTA7XG5jb25zdCBCSUdfTUFYX0xFTkdUSCA9IDUwMDtcblxuY29uc3QgZGlyZWN0Q2hhbmdlcyA9IFtcbiAgJ2RlZmF1bHRFZGl0YWJsZScsICdkZWZhdWx0VmFsdWUnLCAnYWxpZ25tZW50JywgJ3JlcXVpcmVkJywgJ2Vycm9yQ29kZScsICdlcnJvck1lc3NhZ2UnLCAnZXJyb3JUeXBlJyxcbiAgJ3Rvb2x0aXAnLCAnaW5mbycsICdmb3JtYXQnLCAnaW50cmluc2ljRXJyb3JNZXNzYWdlJywgJ291dHB1dE9ubHknLCAnY2FwdHVyZVR5cGUnLCAndGl0bGUnLCAndHlwZScsXG4gICdtYXhMZW5ndGgnLCAnbWF4VmFsdWUnLCAnbWluTGVuZ3RoJywgJ21pblZhbHVlJywgJ3ZhbGlkYXRlT25TZXJ2ZXInLCAnc2VydmVyQWN0aW9uJywgJ3Zpc2libGVMYWJlbCcsXG4gICdvcHRpb25zJywgJ3BsYWNlaG9sZGVyJyxcbl07XG5cbmNvbnN0IGF0dHJzID0ge1xuICBjYXB0dXJlVHlwZTogeyBuYW1lOiAnX2NhcHR1cmVUeXBlJywgcHJvcGFnYXRlOiAnY2FwdHVyZVR5cGUnIH0sXG4gIGVycm9yQ29kZTogeyBuYW1lOiAnX2Vycm9yQ29kZScsIHByb3BhZ2F0ZTogJ2Vycm9yQ29kZScgfSxcbiAgZXJyb3JNZXNzYWdlOiB7IG5hbWU6ICdfZXJyb3JNZXNzYWdlJywgcHJvcGFnYXRlOiAnZXJyb3JNZXNzYWdlJyB9LFxuICBlcnJvclR5cGU6IHsgbmFtZTogJ19lcnJvclR5cGUnLCBwcm9wYWdhdGU6ICdlcnJvclR5cGUnIH0sXG4gIGRlZmF1bHRWYWx1ZTogeyBuYW1lOiAnX2RlZmF1bHRWYWx1ZScsIHByb3BhZ2F0ZTogJ2RlZmF1bHRWYWx1ZScgfSxcbiAgZGVmYXVsdEVkaXRhYmxlOiB7IG5hbWU6ICdfZGVmYXVsdEVkaXRhYmxlJywgcHJvcGFnYXRlOiAnZGVmYXVsdEVkaXRhYmxlJyB9LFxuICBmaWVsZEFsaWdubWVudDogeyBuYW1lOiAnX2ZpZWxkQWxpZ25tZW50JywgcHJvcGFnYXRlOiAnYWxpZ25tZW50JyB9LFxuICBmaWVsZENvZGU6IHsgbmFtZTogJ19maWVsZENvZGUnLCBwcm9wYWdhdGU6ICdjb2RlJyB9LFxuICBmaWVsZEluZm86IHsgbmFtZTogJ19maWVsZEluZm8nLCBwcm9wYWdhdGU6ICdpbmZvJyB9LFxuICBmaWVsZFJlcXVpcmVkOiB7IG5hbWU6ICdfZmllbGRSZXF1aXJlZCcsIHByb3BhZ2F0ZTogJ3JlcXVpcmVkJyB9LFxuICBmaWVsZFRpdGxlOiB7IG5hbWU6ICdfZmllbGRUaXRsZScsIHByb3BhZ2F0ZTogJ3RpdGxlJyB9LFxuICBmaWVsZFR5cGU6IHsgbmFtZTogJ19maWVsZFR5cGUnLCBwcm9wYWdhdGU6ICd0eXBlJyB9LFxuICBmaWVsZEZvcm1hdDogeyBuYW1lOiAnX2ZpZWxkRm9ybWF0JywgcHJvcGFnYXRlOiAnZm9ybWF0JyB9LFxuICBmaWVsZE9wdGlvbnM6IHsgbmFtZTogJ19maWVsZE9wdGlvbnMnLCBwcm9wYWdhdGU6ICdvcHRpb25zJyB9LFxuICBmb2N1czogeyBuYW1lOiAnX2ZvY3VzJywgcHJvcGFnYXRlOiAnZm9jdXMnIH0sXG4gIGhhc0NoYW5nZWQ6IHsgbmFtZTogJ19oYXNDaGFuZ2VkJywgcHJvcGFnYXRlOiAnaGFzQ2hhbmdlZCcgfSxcbiAgaW50cmluc2ljRXJyb3JNZXNzYWdlOiB7IG5hbWU6ICdfaW50cmluc2ljRXJyb3JNZXNzYWdlJywgcHJvcGFnYXRlOiBudWxsIGFzIHN0cmluZyB8IG51bGwgfSxcbiAgbWF4TGVuZ3RoOiB7IG5hbWU6ICdfbWF4TGVuZ3RoJywgcHJvcGFnYXRlOiAnbWF4TGVuZ3RoJyB9LFxuICBtYXhWYWx1ZTogeyBuYW1lOiAnX21heFZhbHVlJywgcHJvcGFnYXRlOiAnbWF4VmFsdWUnIH0sXG4gIG1pbkxlbmd0aDogeyBuYW1lOiAnX21pbkxlbmd0aCcsIHByb3BhZ2F0ZTogJ21pbkxlbmd0aCcgfSxcbiAgbWluVmFsdWU6IHsgbmFtZTogJ19taW5WYWx1ZScsIHByb3BhZ2F0ZTogJ21pblZhbHVlJyB9LFxuICBvblZhbGlkYXRpb246IHsgbmFtZTogJ19vblZhbGlkYXRpb24nLCBwcm9wYWdhdGU6ICdvblZhbGlkYXRpb24nIH0sXG4gIG91dHB1dE9ubHk6IHsgbmFtZTogJ19vdXRwdXRPbmx5JywgcHJvcGFnYXRlOiAnb3V0cHV0T25seScgfSxcbiAgcGxhY2Vob2xkZXI6IHsgbmFtZTogJ19wbGFjZWhvbGRlcicsIHByb3BhZ2F0ZTogJ3BsYWNlaG9sZGVyJyB9LFxuICB0b29sdGlwVGV4dDogeyBuYW1lOiAnX3Rvb2x0aXBUZXh0JywgcHJvcGFnYXRlOiAndG9vbHRpcCcgfSxcbiAgdmFsaWRhdGVPblNlcnZlcjogeyBuYW1lOiAnX3ZhbGlkYXRlT25TZXJ2ZXInLCBwcm9wYWdhdGU6ICd2YWxpZGF0ZU9uU2VydmVyJyB9LFxuICB2YWx1ZTogeyBuYW1lOiAnX3ZhbHVlJywgcHJvcGFnYXRlOiAndmFsdWUnIH0sXG4gIHZpc2libGVMYWJlbDogeyBuYW1lOiAnX3Zpc2libGVMYWJlbCcsIHByb3BhZ2F0ZTogJ3Zpc2libGVMYWJlbCcgfSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGV0YWlsRXZlbnQge1xuICBjb2RlOiBzdHJpbmc7XG4gIGRldGFpbDogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkT3B0aW9uIHtcbiAgZmllbGRPcHRpb25WYWx1ZTogc3RyaW5nO1xuICBmaWVsZE9wdGlvbklkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBGaWVsZERlc2NyaXB0b3IgZXh0ZW5kcyBGb3JtRWxlbWVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1c3RvbUV2ZW50ID0gbmV3IFN1YmplY3Q8RmllbGRDdXN0b21FdmVudERhdGE+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2VkaXRpb25GaW5pc2ggPSBuZXcgU3ViamVjdDxGaWVsZEVkaXRpb25FdmVudD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZWRpdGlvblBhcnRpYWwgPSBuZXcgU3ViamVjdDxGaWVsZEVkaXRpb25FdmVudD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGV0YWlsUmVxdWVzdCA9IG5ldyBTdWJqZWN0PERldGFpbEV2ZW50PigpO1xuXG4gIHByaXZhdGUgX2Vycm9yVHlwZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2Vycm9yQ29kZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2Vycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2ludHJpbnNpY0Vycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX21pblZhbHVlOiBhbnk7XG4gIHByaXZhdGUgX21heFZhbHVlOiBhbnk7XG4gIHByaXZhdGUgX21heExlbmd0aDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbWluTGVuZ3RoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9mb2N1czogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9vblZhbGlkYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfdmFsaWRhdGVPblNlcnZlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF92YWx1ZTogYW55O1xuICBwcml2YXRlIF92aXNpYmxlTGFiZWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY2FwdHVyZVR5cGU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWU6IGFueSA9ICcnO1xuICBwcml2YXRlIF9kZWZhdWx0RWRpdGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfZXh0ZXJuYWxWYWx1ZTogYW55O1xuICBwcml2YXRlIF9maWVsZEFsaWdubWVudDogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2ZpZWxkSW5mbzogYW55ID0gJyc7XG4gIHByaXZhdGUgX2ZpZWxkUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfZmllbGRUaXRsZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2ZpZWxkVHlwZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX2ZpZWxkRm9ybWF0OiBSZWdFeHAgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfaGFzQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9vdXRwdXRPbmx5OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3Rvb2x0aXBUZXh0OiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9maWVsZENvZGU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9maWVsZE9wdGlvbnM6IEZpZWxkT3B0aW9uW10gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfY3VzdG9tRW1wdHk6ICgodGhpczogRmllbGREZXNjcmlwdG9yKSA9PiBib29sZWFuKSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0RmllbGRSZWNlaXZlZDogRmllbGREZWZpbml0aW9uLCBmb3JtQ29uZmlnOiBJRm9ybUNvbmZpZykge1xuICAgIHN1cGVyKGlucHV0RmllbGRSZWNlaXZlZCwgZm9ybUNvbmZpZyk7XG4gICAgdGhpcy5lbGVtZW50VHlwZSA9IEVsZW1lbnRUeXBlLkZpZWxkO1xuICAgIGNvbnN0IGZsZDogYW55ID0gKGlucHV0RmllbGRSZWNlaXZlZCkgPyBpbnB1dEZpZWxkUmVjZWl2ZWQgOiB7fTtcbiAgICB0aGlzLnNldEF0dHIoYXR0cnMuZmllbGRDb2RlLCBmbGQuZmllbGRDb2RlKTtcbiAgICB0aGlzLnRpdGxlID0gZmxkLmZpZWxkVGl0bGUgPz8gdGhpcy5fZmllbGRDb2RlO1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPSBmbGQucGxhY2Vob2xkZXIgPz8gdGhpcy50aXRsZTtcbiAgICB0aGlzLnR5cGUgPSBmbGQuZmllbGRUeXBlQ29kZTtcbiAgICB0aGlzLmNhcHR1cmVUeXBlID0gZmxkLmNhcHR1cmVUeXBlID8/IERFRkFVTFRfQ0FQVFVSRV9UWVBFO1xuXG4gICAgY29uc3QgZGVmYXVsdFZhbHVlID0gZmxkLmRlZmF1bHRWYWx1ZSA/PyBudWxsO1xuICAgIGlmICh0aGlzLl9maWVsZFR5cGUgPT09IHRoaXMuX2Zvcm1Db25maWcuZmllbGRUeXBlcy5ib29sZWFuKSB7XG4gICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZSA/PyBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IGRlZmF1bHRUeXBlQWxpZ25tZW50ID0gKHRoaXMuX2Zvcm1Db25maWcudGFibGVGaWVsZFN0eWxlc1t0aGlzLl9maWVsZFR5cGVdICE9IG51bGwpXG4gICAgICA/IHRoaXMuX2Zvcm1Db25maWcudGFibGVGaWVsZFN0eWxlc1t0aGlzLl9maWVsZFR5cGVdWyd0ZXh0LWFsaWduJ10gOiBERUZBVUxUX0FMSUdOTUVOVDtcbiAgICBjb25zdCBmaWVsZEFsaWdubWVudCA9IChmbGQuYWxpZ25tZW50ICE9IG51bGwpID8gZmxkLmFsaWdubWVudC50b0xvd2VyQ2FzZSgpIDogZGVmYXVsdFR5cGVBbGlnbm1lbnQ7XG4gICAgdGhpcy5hbGlnbm1lbnQgPSBmaWVsZEFsaWdubWVudDtcbiAgICB0aGlzLmluZm8gPSBmbGQuaW5mbyB8fCAnJztcbiAgICBsZXQgZmllbGRGb3JtYXQ7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChmbGQuZm9ybWF0ICYmIHR5cGVvZiBmbGQuZm9ybWF0ID09PSAnc3RyaW5nJykge1xuICAgICAgICBmaWVsZEZvcm1hdCA9IG5ldyBSZWdFeHAoZmxkLmZvcm1hdCk7XG4gICAgICB9IGVsc2UgaWYgKGZsZC5mb3JtYXQ/LnJlZ0V4cCkge1xuICAgICAgICBmaWVsZEZvcm1hdCA9IG5ldyBSZWdFeHAoZmxkLmZvcm1hdD8ucmVnRXhwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBmaWVsZEZvcm1hdCA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuZm9ybWF0ID0gZmllbGRGb3JtYXQ7XG4gICAgdGhpcy52YWxpZGF0ZU9uU2VydmVyID0gZmxkLnNlcnZlckFjdGlvbiA/PyBmYWxzZTtcbiAgICB0aGlzLnRvb2x0aXAgPSBmbGQudG9vbHRpcCB8fCAnJztcbiAgICB0aGlzLmRlZmF1bHRFZGl0YWJsZSA9IHRoaXMuZW5hYmxlZDtcbiAgICB0aGlzLnJlcXVpcmVkID0gZmxkLnJlcXVpcmVkID8/IGZhbHNlO1xuICAgIHRoaXMub3V0cHV0T25seSA9IGZsZC5vdXRwdXRPbmx5ID8/IGZhbHNlO1xuICAgIHRoaXMubWluVmFsdWUgPSBmbGQubWluVmFsdWU7XG4gICAgdGhpcy5tYXhWYWx1ZSA9IGZsZC5tYXhWYWx1ZTtcbiAgICB0aGlzLm1pbkxlbmd0aCA9IGZsZC5taW5MZW5ndGggPz8gMDtcbiAgICB0aGlzLm1heExlbmd0aCA9IGZsZC5tYXhMZW5ndGggfHwgKHRoaXMuX2NhcHR1cmVUeXBlID09PSAnVEVYVEFSRUEnID8gQklHX01BWF9MRU5HVEggOiBTVERfTUFYX0xFTkdUSCk7XG4gICAgdGhpcy5pbnRyaW5zaWNFcnJvck1lc3NhZ2UgPSB0aGlzLl9mb3JtQ29uZmlnPy5maWVsZFZhbGlkYXRpb25zPy5bdGhpcy5fZmllbGRUeXBlXT8ubWVzc2FnZVxuICAgICAgPz8gdGhpcy5fZm9ybUNvbmZpZz8uZmllbGRWYWxpZGF0aW9ucz8uREVGQVVMVD8ubWVzc2FnZSA/PyAnJztcblxuICAgIHRoaXMuc2V0RXJyb3IoZmxkLmVycm9yQ29kZSwgZmxkLmVycm9yTWVzc2FnZSwgZmxkLmVycm9yVHlwZSA/PyBERUZBVUxUX0VSUk9SX1RZUEUpO1xuICAgIHRoaXMuc2V0RWRpdGFibGUoZmxkLmVkaXRhYmxlID8/IHRydWUpO1xuICAgIHRoaXMudmlzaWJsZUxhYmVsID0gZmxkLnZpc2libGVMYWJlbCA/PyB0cnVlO1xuICAgIHRoaXMuc2V0VmlzaWJpbGl0eShmbGQudmlzaWJsZSk7XG4gICAgdGhpcy5vcHRpb25zID0gZmxkLmZpZWxkT3B0aW9ucztcbiAgICB0aGlzLl9zZXRWYWx1ZShmbGQuZmllbGRWYWx1ZSA/PyB0aGlzLl9kZWZhdWx0VmFsdWUgPz8gJycpO1xuICB9XG5cbiAgZ2V0IGFsaWdubWVudCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZmllbGRBbGlnbm1lbnQ7IH1cbiAgc2V0IGFsaWdubWVudChhbGlnbm1lbnQpIHsgdGhpcy5zZXRBdHRyKGF0dHJzLmZpZWxkQWxpZ25tZW50LCBhbGlnbm1lbnQpOyB9XG4gIGdldCBiYWNrZW5kKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fdmFsaWRhdGVPblNlcnZlcjsgfVxuXG4gIGdldCBjYXB0dXJlVHlwZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fY2FwdHVyZVR5cGU7IH1cbiAgc2V0IGNhcHR1cmVUeXBlKGNhcHR1cmVUeXBlKSB7IHRoaXMuc2V0QXR0cihhdHRycy5jYXB0dXJlVHlwZSwgY2FwdHVyZVR5cGUpOyB9XG5cbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjsgfVxuICBzZXQgcGxhY2Vob2xkZXIocGxhY2Vob2xkZXIpIHsgdGhpcy5zZXRBdHRyKGF0dHJzLnBsYWNlaG9sZGVyLCBwbGFjZWhvbGRlcik7IH1cblxuICBnZXQgY29kZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZmllbGRDb2RlOyB9XG4gIGdldCBkZWZhdWx0VmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWx1ZTsgfVxuICBzZXQgZGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZSkgeyB0aGlzLnNldEF0dHIoYXR0cnMuZGVmYXVsdFZhbHVlLCBkZWZhdWx0VmFsdWUpOyB9XG4gIGdldCBkZWZhdWx0RWRpdGFibGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9kZWZhdWx0RWRpdGFibGU7IH1cbiAgc2V0IGRlZmF1bHRFZGl0YWJsZShlZGl0YWJsZSkgeyB0aGlzLnNldEF0dHIoYXR0cnMuZGVmYXVsdEVkaXRhYmxlLCBlZGl0YWJsZSk7IH1cbiAgZ2V0IGRldGFpbFJlcXVlc3QoKTogT2JzZXJ2YWJsZTxEZXRhaWxFdmVudD4geyByZXR1cm4gdGhpcy5fZGV0YWlsUmVxdWVzdC5hc09ic2VydmFibGUoKTsgfVxuICBnZXQgY3VzdG9tRXZlbnQoKTogT2JzZXJ2YWJsZTxGaWVsZEN1c3RvbUV2ZW50RGF0YT4geyByZXR1cm4gdGhpcy5fY3VzdG9tRXZlbnQuYXNPYnNlcnZhYmxlKCk7IH1cbiAgZ2V0IGVkaXRpb25GaW5pc2goKTogT2JzZXJ2YWJsZTxGaWVsZEVkaXRpb25FdmVudD4geyByZXR1cm4gdGhpcy5fZWRpdGlvbkZpbmlzaC5hc09ic2VydmFibGUoKTsgfVxuICBnZXQgZWRpdGlvblBhcnRpYWwoKTogT2JzZXJ2YWJsZTxGaWVsZEVkaXRpb25FdmVudD4geyByZXR1cm4gdGhpcy5fZWRpdGlvblBhcnRpYWwuYXNPYnNlcnZhYmxlKCk7IH1cblxuICBnZXQgZW1wdHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9jdXN0b21FbXB0eSA/IHRoaXMuX2N1c3RvbUVtcHR5LmNhbGwodGhpcykgOiB0aGlzLmRlZmF1bHRFbXB0eSgpOyB9XG4gIGdldCBlcnJvcigpOiB7IHR5cGU6IHN0cmluZzsgY29kZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfSB7IHJldHVybiB7IHR5cGU6IHRoaXMuX2Vycm9yVHlwZSwgY29kZTogdGhpcy5fZXJyb3JDb2RlLCBtZXNzYWdlOiB0aGlzLl9lcnJvck1lc3NhZ2UgfTsgfVxuICBzZXQgZXJyb3IoZXJyb3JPYmopIHsgdGhpcy5zZXRFcnJvcihlcnJvck9iai5jb2RlLCBlcnJvck9iai5tZXNzYWdlLCBlcnJvck9iai50eXBlID8/IERFRkFVTFRfRVJST1JfVFlQRSkgfVxuICBnZXQgZXJyb3JDb2RlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9lcnJvckNvZGU7IH1cbiAgc2V0IGVycm9yQ29kZShjb2RlKSB7IHRoaXMuc2V0RXJyb3IoY29kZSwgdGhpcy5fZXJyb3JNZXNzYWdlKTsgfVxuICBnZXQgZXJyb3JNZXNzYWdlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9lcnJvck1lc3NhZ2U7IH1cbiAgc2V0IGVycm9yTWVzc2FnZShtc2cpIHsgdGhpcy5zZXRFcnJvcih0aGlzLl9lcnJvckNvZGUsIG1zZyk7IH1cbiAgZ2V0IGVycm9yVHlwZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZXJyb3JUeXBlOyB9XG4gIGdldCBleHRlcm5hbFZhbHVlKCk6IGFueSB7IHJldHVybiB0aGlzLl9leHRlcm5hbFZhbHVlOyB9XG4gIGdldCBmb3JtYXQoKTogUmVnRXhwIHwgbnVsbCB7IHJldHVybiB0aGlzLl9maWVsZEZvcm1hdDsgfVxuICBzZXQgZm9ybWF0KGZvcm1hdCkgeyB0aGlzLnNldEF0dHIoYXR0cnMuZmllbGRGb3JtYXQsIGZvcm1hdCk7IH1cbiAgZ2V0IGhhc0NoYW5nZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9oYXNDaGFuZ2VkOyB9XG4gIHNldCBoYXNDaGFuZ2VkKGhhc0NoYW5nZWQpIHsgdGhpcy5zZXRBdHRyKGF0dHJzLmhhc0NoYW5nZWQsIGhhc0NoYW5nZWQpOyB9XG5cbiAgZ2V0IGluZm8oKTogYW55IHsgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mbzsgfVxuICBzZXQgaW5mbyhuZXdJbmZvOiBzdHJpbmcpIHsgdGhpcy5zZXRBdHRyKGF0dHJzLmZpZWxkSW5mbywgbmV3SW5mbyk7IH1cbiAgc2V0IGludHJpbnNpY0Vycm9yTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcpIHsgdGhpcy5zZXRBdHRyKGF0dHJzLmludHJpbnNpY0Vycm9yTWVzc2FnZSwgbWVzc2FnZSk7IH1cbiAgZ2V0IG1heExlbmd0aCgpOiBzdHJpbmcgeyByZXR1cm4gKHRoaXMuX21heExlbmd0aCA+IDApID8gdGhpcy5fbWF4TGVuZ3RoLnRvU3RyaW5nKCkgOiAnJzsgfVxuICBzZXQgbWF4TGVuZ3RoKHJlcXVpcmVkTWF4TGVuZ3RoOiBhbnkpIHsgdGhpcy5zZXRBdHRyKGF0dHJzLm1heExlbmd0aCwgcmVxdWlyZWRNYXhMZW5ndGggPyArcmVxdWlyZWRNYXhMZW5ndGggOiBudWxsKTsgfVxuICBnZXQgbWF4VmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuX21heFZhbHVlOyB9XG5cbiAgc2V0IG1heFZhbHVlKGlucHV0TWF4VmFsdWUpIHtcbiAgICBsZXQgbWF4VmFsdWUgPSBpbnB1dE1heFZhbHVlO1xuICAgIGlmICh0aGlzLl9maWVsZFR5cGUgPT09IHRoaXMuX2Zvcm1Db25maWcuZmllbGRUeXBlcy5kYXRlKSB7XG4gICAgICBtYXhWYWx1ZSA9IG5ldyBEYXRlKG1heFZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5zZXRBdHRyKGF0dHJzLm1heFZhbHVlLCBtYXhWYWx1ZSk7XG4gIH1cblxuICBnZXQgbWluTGVuZ3RoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9taW5MZW5ndGg7IH1cbiAgc2V0IG1pbkxlbmd0aChyZXF1aXJlZE1pbkxlbmd0aDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRBdHRyKGF0dHJzLm1pbkxlbmd0aCwgcmVxdWlyZWRNaW5MZW5ndGggPyArcmVxdWlyZWRNaW5MZW5ndGggOiBudWxsKTtcbiAgfVxuICBnZXQgbWluVmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuX21pblZhbHVlOyB9XG5cbiAgc2V0IG1pblZhbHVlKGlucHV0TWluVmFsdWUpIHtcbiAgICBsZXQgbWluVmFsdWUgPSBpbnB1dE1pblZhbHVlO1xuICAgIGlmICh0aGlzLl9maWVsZFR5cGUgPT09IHRoaXMuX2Zvcm1Db25maWcuZmllbGRUeXBlcy5kYXRlKSB7XG4gICAgICBtaW5WYWx1ZSA9IG5ldyBEYXRlKG1pblZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5zZXRBdHRyKGF0dHJzLm1pblZhbHVlLCBtaW5WYWx1ZSk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fZmllbGRDb2RlOyB9XG5cbiAgZ2V0IG9wdGlvbnMoKTogRmllbGRPcHRpb25bXSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9maWVsZE9wdGlvbnM/Lm1hcChvcHRpb24gPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uQ29weTogRmllbGRPcHRpb24gPSB7IC4uLm9wdGlvbiB9O1xuICAgICAgcmV0dXJuIG9wdGlvbkNvcHk7XG4gICAgfSkgPz8gW107XG4gIH1cblxuICBzZXQgb3B0aW9ucyhuZXdPcHRpb25zKSB7XG4gICAgaWYgKCghdGhpcy5fZm9ybUNvbmZpZy5jYXB0dXJlVHlwZXNXaXRoT3B0aW9ucy5pbmNsdWRlcyh0aGlzLl9jYXB0dXJlVHlwZSkpXG4gICAgICB8fCB0eXBlb2YgbmV3T3B0aW9ucyA9PT0gVU5ERUZJTkVEIHx8ICFuZXdPcHRpb25zXG4gICAgICB8fCAhQXJyYXkuaXNBcnJheShuZXdPcHRpb25zKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZmllbGRPcHRpb25zID0gbmV3T3B0aW9ucy5tYXAoKG9wdGlvbjogYW55KSA9PiB7XG4gICAgICBpZiAob3B0aW9uLnRleHQgIT09IHVuZGVmaW5lZCAmJiBvcHRpb24udGV4dCAhPT0gbnVsbFxuICAgICAgICAmJiBvcHRpb24udmFsdWUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb24udmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHsgZmllbGRPcHRpb25WYWx1ZTogb3B0aW9uLnRleHQsIGZpZWxkT3B0aW9uSWQ6IG9wdGlvbi52YWx1ZSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9KTtcbiAgICBmaWVsZE9wdGlvbnMgPSAoZmllbGRPcHRpb25zICYmIEFycmF5LmlzQXJyYXkoZmllbGRPcHRpb25zKVxuICAgICAgJiYgZmllbGRPcHRpb25zLmxlbmd0aCA+IDApID8gZmllbGRPcHRpb25zIDogW107XG4gICAgdGhpcy5zZXRBdHRyKGF0dHJzLmZpZWxkT3B0aW9ucywgZmllbGRPcHRpb25zKTtcbiAgICBpZiAodGhpcy5fdmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLl9maWVsZFR5cGUgPT09IHRoaXMuX2Zvcm1Db25maWcuZmllbGRUeXBlcy5hcnJheSAmJiBBcnJheS5pc0FycmF5KHRoaXMuX3ZhbHVlKSkge1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5fdmFsdWU/LmZpbHRlcihpdGVtID0+XG4gICAgICAgICAgdGhpcy5fZmllbGRPcHRpb25zPy5maW5kKG9wdCA9PiBvcHQuZmllbGRPcHRpb25JZCA9PT0gaXRlbSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXRBdHRyKGF0dHJzLnZhbHVlLCBmaWVsZFZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbEluT3B0aW9ucyA9IHRoaXMuX2ZpZWxkT3B0aW9ucz8uZmluZChpdGVtID0+IGl0ZW0uZmllbGRPcHRpb25JZCA9PT0gdGhpcy5fdmFsdWUpO1xuICAgICAgICBpZiAoIXZhbEluT3B0aW9ucykge1xuICAgICAgICAgIHRoaXMuX3NldFZhbHVlKCcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5fZmllbGRSZXF1aXJlZCAmJiB0aGlzLl9maWVsZE9wdGlvbnM/Lmxlbmd0aCA9PT0gMSAmJiB0aGlzLl92YWx1ZSAhPT0gdGhpcy5fZmllbGRPcHRpb25zPy5bMF0uZmllbGRPcHRpb25JZCkge1xuICAgICAgdGhpcy5fc2V0VmFsdWUodGhpcy5fZmllbGRPcHRpb25zPy5bMF0uZmllbGRPcHRpb25JZCk7XG4gICAgICB0aGlzLm5vdGlmeUVkaXRpb25GaW5pc2goKTtcbiAgICB9XG4gIH1cblxuICBnZXQgb3B0aW9uVGV4dCgpOiBzdHJpbmcgfCBudWxsIHsgcmV0dXJuIHRoaXMuX2ZpZWxkT3B0aW9ucz8uZmluZChpdGVtID0+IGl0ZW0uZmllbGRPcHRpb25JZCA9PT0gdGhpcy5fdmFsdWUpPy5maWVsZE9wdGlvblZhbHVlID8/IG51bGw7IH1cbiAgZ2V0IG91dHB1dE9ubHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9vdXRwdXRPbmx5OyB9XG4gIHNldCBvdXRwdXRPbmx5KG91dHB1dE9ubHkpIHsgdGhpcy5zZXRBdHRyKGF0dHJzLm91dHB1dE9ubHksIG91dHB1dE9ubHkpOyB9XG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2ZpZWxkUmVxdWlyZWQ7IH1cbiAgc2V0IHJlcXVpcmVkKHJlcXVpcmVkOiBib29sZWFuKSB7IHRoaXMuc2V0QXR0cihhdHRycy5maWVsZFJlcXVpcmVkLCByZXF1aXJlZCA/PyBmYWxzZSk7IH1cbiAgZ2V0IHRpdGxlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9maWVsZFRpdGxlOyB9XG4gIHNldCB0aXRsZSh0aXRsZSkgeyB0aGlzLnNldEF0dHIoYXR0cnMuZmllbGRUaXRsZSwgdGl0bGU/LnRvU3RyaW5nKCkgPz8gJycpOyB9XG4gIGdldCB0b29sdGlwKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl90b29sdGlwVGV4dDsgfVxuICBzZXQgdG9vbHRpcCh0b29sdGlwKSB7IHRoaXMuc2V0QXR0cihhdHRycy50b29sdGlwVGV4dCwgdG9vbHRpcCk7IH1cbiAgZ2V0IHR5cGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2ZpZWxkVHlwZTsgfVxuICBzZXQgdHlwZShmaWVsZFR5cGUpIHsgdGhpcy5zZXRBdHRyKGF0dHJzLmZpZWxkVHlwZSwgZmllbGRUeXBlKTsgfVxuICBnZXQgb25WYWxpZGF0aW9uKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fb25WYWxpZGF0aW9uOyB9XG4gIGdldCB2YWxpZGF0aW5nKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fb25WYWxpZGF0aW9uOyB9XG4gIHNldCB2YWxpZGF0aW5nKGlzVmFsaWRhdGluZzogYm9vbGVhbikgeyB0aGlzLnNldEF0dHIoYXR0cnMub25WYWxpZGF0aW9uLCBpc1ZhbGlkYXRpbmcpOyB9XG4gIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiAodGhpcy5fZmllbGRUeXBlID09PSB0aGlzLl9mb3JtQ29uZmlnLmZpZWxkVHlwZXMuYm9vbGVhblxuICAgICAgfHwgdGhpcy5fZmllbGRUeXBlID09PSB0aGlzLl9mb3JtQ29uZmlnLmZpZWxkVHlwZXMuY2hlY2spID8geW4odGhpcy5fdmFsdWUpIDogdGhpcy5fdmFsdWU7XG4gIH1cbiAgZ2V0IHZhbGlkYXRlT25TZXJ2ZXIoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl92YWxpZGF0ZU9uU2VydmVyOyB9XG4gIHNldCB2YWxpZGF0ZU9uU2VydmVyKHZhbGlkYXRlT25TZXJ2ZXIpIHsgdGhpcy5zZXRBdHRyKGF0dHJzLnZhbGlkYXRlT25TZXJ2ZXIsIHZhbGlkYXRlT25TZXJ2ZXIpOyB9XG4gIGdldCBzZXJ2ZXJBY3Rpb24oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl92YWxpZGF0ZU9uU2VydmVyOyB9XG4gIHNldCBzZXJ2ZXJBY3Rpb24odmFsaWRhdGVPblNlcnZlcjogYm9vbGVhbikgeyB0aGlzLnZhbGlkYXRlT25TZXJ2ZXIgPSB2YWxpZGF0ZU9uU2VydmVyOyB9XG5cbiAgc2V0IHZhbHVlKG5ld1ZhbHVlKSB7IHRoaXMuX3NldFZhbHVlKG5ld1ZhbHVlKTsgfVxuICBnZXQgdmlzaWJsZUxhYmVsKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fdmlzaWJsZUxhYmVsOyB9XG4gIHNldCB2aXNpYmxlTGFiZWwodmlzaWJsZUxhYmVsOiBib29sZWFuKSB7IHRoaXMuc2V0QXR0cihhdHRycy52aXNpYmxlTGFiZWwsIHZpc2libGVMYWJlbCk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2UgdmFsdWUgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGdldCBmaWVsZFZhbHVlKCk6IGFueSB7IHJldHVybiB0aGlzLnZhbHVlOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIGhhc0NoYW5nZWQgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGNoYW5nZWQoaGFzQ2hhbmdlZCA9IHRydWUpIHsgdGhpcy5oYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZDsgfVxuXG4gIGNsZWFuKCk6IHZvaWQgeyB0aGlzLl9zZXRWYWx1ZSh0aGlzLl9kZWZhdWx0VmFsdWUgfHwgJycpOyB0aGlzLnJlc2V0RXJyb3IoKTsgfVxuICBzZXRDdXN0b21FbXB0eShmbjogKCh0aGlzOiBGaWVsZERlc2NyaXB0b3IpID0+IGJvb2xlYW4pIHwgbnVsbCk6IHZvaWQgeyB0aGlzLl9jdXN0b21FbXB0eSA9IGZuOyB9XG4gIGZvY3VzKCk6IHZvaWQgeyB0aGlzLnNldEF0dHIoYXR0cnMuZm9jdXMsIHRydWUpOyB9XG4gIGdldEVycm9yQ29kZSgpIHsgcmV0dXJuIHRoaXMuZXJyb3IuY29kZTsgfVxuICBzZXRFcnJvckNvZGUoY29kZTogc3RyaW5nKSB7IHRoaXMuc2V0RXJyb3IoY29kZSwgdGhpcy5fZXJyb3JNZXNzYWdlKTsgfVxuICBnZXRFcnJvck1lc3NhZ2UoKSB7IHJldHVybiB0aGlzLmVycm9yLm1lc3NhZ2U7IH1cbiAgc2V0RXJyb3JNZXNzYWdlKG1zZzogc3RyaW5nKSB7IHRoaXMuc2V0RXJyb3IodGhpcy5fZXJyb3JDb2RlLCBtc2cpOyB9XG4gIGdldFJlcXVpcmVkKCkgeyByZXR1cm4gdGhpcy5yZXF1aXJlZDsgfVxuICBoYXNFcnJvcigpIHsgcmV0dXJuIHRoaXMuX2Vycm9yQ29kZSAhPT0gTk9fRVJST1I7IH1cbiAgaGlkZUxhYmVsKCk6IHZvaWQgeyB0aGlzLnZpc2libGVMYWJlbCA9IGZhbHNlOyB9XG4gIHJlc2V0RXJyb3IoKSB7ICh0aGlzLl9lcnJvckNvZGUgIT09IE5PX0VSUk9SKSAmJiB0aGlzLnNldEVycm9yKE5PX0VSUk9SLCBudWxsKTsgfVxuICBzZXRFZGl0YWJsZShlZGl0YWJsZTogYm9vbGVhbiA9IHRydWUpIHsgKGVkaXRhYmxlKSA/IHRoaXMuZW5hYmxlKCkgOiB0aGlzLmRpc2FibGUoKTsgfVxuICBzZXRWYWx1ZShuZXdWYWx1ZTogYW55LCB3aWRnZXRVcGRhdGU6IGJvb2xlYW4gPSB0cnVlKSB7IHRoaXMuX3NldFZhbHVlKG5ld1ZhbHVlLCB3aWRnZXRVcGRhdGUpOyB9XG4gIHNob3dMYWJlbCgpOiB2b2lkIHsgdGhpcy52aXNpYmxlTGFiZWwgPSB0cnVlOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIGNvZGUgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGdldCBmaWVsZENvZGUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2ZpZWxkQ29kZTsgfVxuXG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIHRpdGxlIGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBzZXRMYWJlbChsYWJlbDogc3RyaW5nKSB7IHRoaXMudGl0bGUgPSBsYWJlbDsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSByZXF1aXJlZCBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgc2V0UmVxdWlyZWQocmVxdWlyZWQ6IGJvb2xlYW4pIHsgdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIGNoYW5nZWQgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIHNldENoYW5nZWQoaGFzQ2hhbmdlZDogYm9vbGVhbikgeyB0aGlzLmNoYW5nZWQoaGFzQ2hhbmdlZCk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2UgdmFsdWUgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIGdldFZhbHVlKCk6IGFueSB7IHJldHVybiB0aGlzLnZhbHVlOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIGVtcHR5IGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBpc0VtcHR5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5lbXB0eSB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIGVycm9yIGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBnZXRFcnJvcigpIHsgcmV0dXJuIHRoaXMuZXJyb3I7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb3B0aW9uVGV4dCBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgZ2V0T3B0aW9uVGV4dCgpIHsgcmV0dXJuIHRoaXMub3B0aW9uVGV4dDsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBvcHRpb25zIGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBnZXRGaWVsZE9wdGlvbnMoKSB7IHJldHVybiB0aGlzLm9wdGlvbnM7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2Ugb3B0aW9ucyBpbnN0ZWFkLiBXaWxsIGJlIHJlbW92ZWQgaW4gdjE5LlxuICAgKi9cbiAgc2V0RmllbGRPcHRpb25zKG5ld09wdGlvbnM6IGFueSkgeyByZXR1cm4gdGhpcy5vcHRpb25zID0gbmV3T3B0aW9uczsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBpbnRyaW5zaWNFcnJvck1lc3NhZ2UgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIHNldEludHJpbnNpY0Vycm9yTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcpIHsgdGhpcy5pbnRyaW5zaWNFcnJvck1lc3NhZ2UgPSBtZXNzYWdlOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIHYxNy4gVXNlIG1heFZhbHVlIGluc3RlYWQuIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTkuXG4gICAqL1xuICBzZXRNYXhWYWx1ZShpbnB1dE1heFZhbHVlOiBhbnkpIHsgdGhpcy5tYXhWYWx1ZSA9IGlucHV0TWF4VmFsdWU7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgU2luY2UgdjE3LiBVc2UgbWluVmFsdWUgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIHNldE1pblZhbHVlKGlucHV0TWluVmFsdWU6IGFueSkgeyB0aGlzLm1pblZhbHVlID0gaW5wdXRNaW5WYWx1ZTsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2MTcuIFVzZSBzaG93TGFiZWwgaW5zdGVhZC4gV2lsbCBiZSByZW1vdmVkIGluIHYxOS5cbiAgICovXG4gIHNldFZpc2libGVMYWJlbCh2aXNpYmxlTGFiZWw6IGJvb2xlYW4pIHsgdGhpcy52aXNpYmxlTGFiZWwgPSB2aXNpYmxlTGFiZWw7IH1cblxuICBkZWZhdWx0RW1wdHkoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZmllbGRDdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmIChmaWVsZEN1cnJlbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGZpZWxkQ3VycmVudFZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZpZWxkVHlwZSA9PT0gdGhpcy5fZm9ybUNvbmZpZy5maWVsZFR5cGVzLmFycmF5XG4gICAgICAmJiBBcnJheS5pc0FycmF5KGZpZWxkQ3VycmVudFZhbHVlKSAmJiBmaWVsZEN1cnJlbnRWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgaWYgKHRoaXMuX2ZpZWxkVHlwZSA9PT0gdGhpcy5fZm9ybUNvbmZpZy5maWVsZFR5cGVzLnBob25lKSB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmllbGRDdXJyZW50VmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGZpZWxkQ3VycmVudFZhbHVlLmxlbmd0aCAhPT0gMiB8fCAhZmllbGRDdXJyZW50VmFsdWVbMF0gfHwgIWZpZWxkQ3VycmVudFZhbHVlWzFdKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgY29uc3QgYXJyYXlGaWVsZFR5cGVzID0gdGhpcy5fZm9ybUNvbmZpZy5hcnJheUZpZWxkVHlwZXMgPz8gbnVsbDtcbiAgICBpZiAoYXJyYXlGaWVsZFR5cGVzICYmIE9iamVjdC5rZXlzKGFycmF5RmllbGRUeXBlcykuaW5jbHVkZXModGhpcy5fZmllbGRUeXBlKSkge1xuICAgICAgbGV0IGFycmF5U2l6ZSA9IGFycmF5RmllbGRUeXBlc1t0aGlzLl9maWVsZFR5cGVdO1xuICAgICAgYXJyYXlTaXplID0gIU51bWJlci5pc05hTigrYXJyYXlTaXplKSA/ICthcnJheVNpemUgOiAwO1xuICAgICAgaWYgKGFycmF5U2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkoZmllbGRDdXJyZW50VmFsdWUpICYmIGZpZWxkQ3VycmVudFZhbHVlLmxlbmd0aCA9PT0gMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkoZmllbGRDdXJyZW50VmFsdWUpICYmIGZpZWxkQ3VycmVudFZhbHVlLmxlbmd0aCA8IGFycmF5U2l6ZSk7XG4gICAgfTtcbiAgICByZXR1cm4gZmllbGRDdXJyZW50VmFsdWUgPT09ICcnO1xuICB9XG5cblxuICBub3RpZnlFZGl0aW9uUGFydGlhbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICB0aGlzLl9lZGl0aW9uUGFydGlhbC5uZXh0KHsgY29kZTogdGhpcy5fZmllbGRDb2RlLCBpbnRyaW5zaWNWYWxpZGF0aW9uOiB0cnVlIH0pO1xuICB9XG5cbiAgdHJpZ2dlckN1c3RvbUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBldmVudERhdGE6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX2N1c3RvbUV2ZW50Lm5leHQoeyBjb2RlOiB0aGlzLl9maWVsZENvZGUsIGV2ZW50TmFtZSwgZXZlbnREYXRhIH0pO1xuICB9XG5cbiAgbm90aWZ5RWRpdGlvbkZpbmlzaCgpOiB2b2lkIHtcbiAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICB0aGlzLnJlc2V0RXJyb3IoKTtcbiAgICBjb25zdCB2YWxpZGF0aW9uQ29uZmlnOiBhbnkgPSB0aGlzLl9mb3JtQ29uZmlnLmZpZWxkVmFsaWRhdGlvbnM/Llt0aGlzLl9maWVsZFR5cGVdID8/IHt9O1xuICAgIGNvbnN0IHsgdHlwZSwgdmFsaWRhdGlvbiB9ID0gdmFsaWRhdGlvbkNvbmZpZztcbiAgICBsZXQgbWVzc2FnZSA9IHZhbGlkYXRpb25Db25maWc/Lm1lc3NhZ2U7XG4gICAgbGV0IGludHJpbnNpY1ZhbGlkYXRpb24gPSB0cnVlO1xuICAgIGlmIChmaWVsZFZhbHVlICYmICh2YWxpZGF0aW9uIHx8IHRoaXMuX2ZpZWxkRm9ybWF0KSkge1xuICAgICAgaWYgKHR5cGUgPT09ICdyZWdleHAnKSB7XG4gICAgICAgIGludHJpbnNpY1ZhbGlkYXRpb24gPSAodmFsaWRhdGlvbj8udGVzdChmaWVsZFZhbHVlKSA/PyB0cnVlKVxuICAgICAgICAgICYmICh0aGlzLl9maWVsZEZvcm1hdD8udGVzdChmaWVsZFZhbHVlKSA/PyB0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsaWRhdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCB7IHZhbGlkLCBtZXNzYWdlOiBjdXN0b21NZXNzYWdlIH0gPSB2YWxpZGF0aW9uKGZpZWxkVmFsdWUsIHRoaXMpO1xuICAgICAgICBpbnRyaW5zaWNWYWxpZGF0aW9uID0gdmFsaWQ7XG4gICAgICAgIG1lc3NhZ2UgPSBjdXN0b21NZXNzYWdlO1xuICAgICAgfVxuICAgICAgaWYgKCFpbnRyaW5zaWNWYWxpZGF0aW9uKSB7XG4gICAgICAgIHRoaXMuc2V0RXJyb3IoJzk5JywgbWVzc2FnZSA/PyB0aGlzLl9pbnRyaW5zaWNFcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW50cmluc2ljVmFsaWRhdGlvbiAmJiBmaWVsZFZhbHVlICYmIHRoaXMuX21pblZhbHVlICYmIGZpZWxkVmFsdWUgPCB0aGlzLl9taW5WYWx1ZSkge1xuICAgICAgaW50cmluc2ljVmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgICAgY29uc3QgZm9ybWF0ZWRNaW5WYWx1ZSA9ICFpc05hTigrdGhpcy5fbWluVmFsdWUpXG4gICAgICAgID8gTnVtYmVyKHRoaXMuX21pblZhbHVlKS50b0xvY2FsZVN0cmluZygnZXMtQ08nKVxuICAgICAgICA6IHRoaXMuX21pblZhbHVlO1xuICAgICAgdGhpcy5zZXRFcnJvcignOTknLCBgRWwgdmFsb3IgZGUgJHt0aGlzLnRpdGxlfSBubyBwdWVkZSBzZXIgaW5mZXJpb3IgYSAke2Zvcm1hdGVkTWluVmFsdWV9YCk7XG4gICAgfVxuICAgIGlmIChpbnRyaW5zaWNWYWxpZGF0aW9uICYmIGZpZWxkVmFsdWUgJiYgdGhpcy5fbWF4VmFsdWUgJiYgZmllbGRWYWx1ZSA+IHRoaXMuX21heFZhbHVlKSB7XG4gICAgICBpbnRyaW5zaWNWYWxpZGF0aW9uID0gZmFsc2U7XG4gICAgICBjb25zdCBmb3JtYXRlZE1heFZhbHVlID0gIWlzTmFOKCt0aGlzLl9tYXhWYWx1ZSlcbiAgICAgICAgPyBOdW1iZXIodGhpcy5fbWF4VmFsdWUpLnRvTG9jYWxlU3RyaW5nKCdlcy1DTycpXG4gICAgICAgIDogdGhpcy5fbWF4VmFsdWU7XG4gICAgICB0aGlzLnNldEVycm9yKCc5OScsIGBFbCB2YWxvciBkZSAke3RoaXMudGl0bGV9IG5vIHB1ZWRlIHNlciBzdXBlcmlvciBhICR7Zm9ybWF0ZWRNYXhWYWx1ZX1gKTtcbiAgICB9XG4gICAgaWYgKGludHJpbnNpY1ZhbGlkYXRpb24gJiYgZmllbGRWYWx1ZSAmJiB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ3N0cmluZydcbiAgICAgICYmIHRoaXMuX21pbkxlbmd0aCAmJiBmaWVsZFZhbHVlPy5sZW5ndGggPCB0aGlzLl9taW5MZW5ndGgpIHtcbiAgICAgIGludHJpbnNpY1ZhbGlkYXRpb24gPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0RXJyb3IoJzk5JywgYExvbmdpdHVkIGRlICR7dGhpcy5fZmllbGRUaXRsZX0gZGViZSBzZXIgZGUgYWwgbWVub3MgJHt0aGlzLl9taW5MZW5ndGh9YCk7XG4gICAgfVxuICAgIHRoaXMuX2VkaXRpb25GaW5pc2gubmV4dCh7IGNvZGU6IHRoaXMuX2ZpZWxkQ29kZSwgaW50cmluc2ljVmFsaWRhdGlvbiB9KTtcbiAgfVxuXG4gIG5vdGlmeUVkaXRpb25EZXRhaWxSZXF1ZXN0KGRldGFpbDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZGV0YWlsRXZlbnQ6IERldGFpbEV2ZW50ID0geyBjb2RlOiB0aGlzLl9maWVsZENvZGUsIGRldGFpbCB9O1xuICAgIHRoaXMuX2RldGFpbFJlcXVlc3QubmV4dChkZXRhaWxFdmVudCk7XG4gIH1cblxuICBzZXRFcnJvcihjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyB8IG51bGwsIHR5cGU6IHN0cmluZyA9IERFRkFVTFRfRVJST1JfVFlQRSkge1xuICAgIHRoaXMuc2V0QXR0cihhdHRycy5lcnJvckNvZGUsIGNvZGUgPz8gTk9fRVJST1IpO1xuICAgIHRoaXMuc2V0QXR0cihhdHRycy5lcnJvclR5cGUsICh0aGlzLl9lcnJvckNvZGUgPT09IE5PX0VSUk9SKSA/ICcnIDogdHlwZSk7XG4gICAgdGhpcy5zZXRBdHRyKGF0dHJzLmVycm9yTWVzc2FnZSwgbWVzc2FnZSA/PyAnJyk7XG4gIH1cblxuICB1cGRhdGVGcm9tU2VydmVyKGZsZDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgZmllbGRLZXlzID0gT2JqZWN0LmtleXMoZmxkKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZmllbGRLZXlzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgYXR0ck5hbWUgPSBmaWVsZEtleXNbaW5kZXhdO1xuICAgICAgY29uc3QgYXR0clZhbHVlID0gZmxkW2F0dHJOYW1lXTtcbiAgICAgIGlmIChkaXJlY3RDaGFuZ2VzLmluY2x1ZGVzKGF0dHJOYW1lKSkge1xuICAgICAgICAodGhpcyBhcyBhbnkpW2F0dHJOYW1lXSA9IGF0dHJWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIChhdHRyTmFtZSA9PT0gJ2xhYmVsJykgJiYgKHRoaXMudGl0bGUgPSBhdHRyVmFsdWUpO1xuICAgICAgICAoYXR0ck5hbWUgPT09ICdsYWJlbFZpc2libGUnKSAmJiAodGhpcy52aXNpYmxlTGFiZWwgPSBhdHRyVmFsdWUpO1xuICAgICAgICAoYXR0ck5hbWUgPT09ICdlZGl0YWJsZScpICYmIHRoaXMuc2V0RWRpdGFibGUoYXR0clZhbHVlKTtcbiAgICAgICAgKGF0dHJOYW1lID09PSAndmlzaWJsZScpICYmIHRoaXMuc2V0VmlzaWJpbGl0eShhdHRyVmFsdWUpO1xuICAgICAgICAoYXR0ck5hbWUgPT09ICd2YWx1ZScpICYmICh0aGlzLl9zZXRWYWx1ZShhdHRyVmFsdWUpICYmICh0aGlzLmhhc0NoYW5nZWQgPSBmYWxzZSkpO1xuICAgICAgICAoYXR0ck5hbWUgPT09ICdmaWVsZFZhbHVlJykgJiYgKHRoaXMuX3NldFZhbHVlKGF0dHJWYWx1ZSkgJiYgKHRoaXMuaGFzQ2hhbmdlZCA9IGZhbHNlKSk7XG4gICAgICAgIChhdHRyTmFtZSA9PT0gJ2ZpZWxkT3B0aW9ucycpICYmICh0aGlzLm9wdGlvbnMgPSBhdHRyVmFsdWUpO1xuICAgICAgICAoYXR0ck5hbWUgPT09ICdmaWVsZFRpdGxlJykgJiYgKHRoaXMudGl0bGUgPSBhdHRyVmFsdWUpO1xuICAgICAgICAoYXR0ck5hbWUgPT09ICdmaWVsZFR5cGVDb2RlJykgJiYgKHRoaXMudHlwZSA9IGF0dHJWYWx1ZSk7XG4gICAgICAgIChhdHRyTmFtZSA9PT0gJ2ZpZWxkVHlwZScpICYmICh0aGlzLnR5cGUgPSBhdHRyVmFsdWUpO1xuICAgICAgICAoYXR0ck5hbWUgPT09ICd0b29sdGlwVGV4dCcpICYmICh0aGlzLnRvb2x0aXAgPSBhdHRyVmFsdWUpO1xuICAgICAgICAoYXR0ck5hbWUgPT09ICdjdXN0b21BdHRyaWJ1dGVzJykgJiYgKHRoaXMuc2V0Q3VzdG9tQXR0cmlidXRlcyhhdHRyVmFsdWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRWYWx1ZShuZXdWYWx1ZTogYW55LCB3aWRnZXRVcGRhdGU6IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgaWYgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG5ld1ZhbHVlID09PSBudWxsICYmIHRoaXMucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBsZXQgbmV3RmluYWxWYWx1ZTtcbiAgICBpZiAodGhpcy5fZmllbGRUeXBlID09PSB0aGlzLl9mb3JtQ29uZmlnLmZpZWxkVHlwZXMuYm9vbGVhblxuICAgICAgfHwgdGhpcy5fZmllbGRUeXBlID09PSB0aGlzLl9mb3JtQ29uZmlnLmZpZWxkVHlwZXMuY2hlY2spIHtcbiAgICAgIG5ld0ZpbmFsVmFsdWUgPSB5bihuZXdWYWx1ZSkgPz8gZmFsc2U7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9maWVsZFR5cGUgPT09IHRoaXMuX2Zvcm1Db25maWcuZmllbGRUeXBlcy5hcnJheVxuICAgICAgfHwgdGhpcy5fZmllbGRUeXBlID09PSB0aGlzLl9mb3JtQ29uZmlnLmZpZWxkVHlwZXMubWFwKSB7XG4gICAgICBpZiAobmV3VmFsdWUgPT09IG51bGwgfHwgbmV3VmFsdWUgPT09ICcnKSB7XG4gICAgICAgIG5ld0ZpbmFsVmFsdWUgPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShuZXdWYWx1ZSkpIHtcbiAgICAgICAgbmV3RmluYWxWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3RmluYWxWYWx1ZSA9IG5ld1ZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJywnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RmluYWxWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IG5ld0ZpbmFsVmFsdWUpIHtcbiAgICAgIHRoaXMuX2hhc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgaWYgKHdpZGdldFVwZGF0ZSkge1xuICAgICAgICB0aGlzLnNldEF0dHIoYXR0cnMudmFsdWUsIG5ld0ZpbmFsVmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBuZXdGaW5hbFZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl19