@klippa/ngx-enhancy-forms 18.33.24 → 20.0.0
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/fesm2022/klippa-ngx-enhancy-forms.mjs +167 -148
- package/fesm2022/klippa-ngx-enhancy-forms.mjs.map +1 -1
- package/index.d.ts +707 -3
- package/package.json +5 -7
- package/esm2022/klippa-ngx-enhancy-forms.mjs +0 -5
- package/esm2022/lib/elementIsTruncatedCb.component.mjs +0 -58
- package/esm2022/lib/elements/button/button.component.mjs +0 -57
- package/esm2022/lib/elements/checkbox/checkbox.component.mjs +0 -23
- package/esm2022/lib/elements/date-picker/date-picker.component.mjs +0 -108
- package/esm2022/lib/elements/date-time-picker/date-time-picker.component.mjs +0 -436
- package/esm2022/lib/elements/email/email-input.component.mjs +0 -21
- package/esm2022/lib/elements/file-input/file-input.component.mjs +0 -76
- package/esm2022/lib/elements/hour-minute-input/hour-minute-input.component.mjs +0 -90
- package/esm2022/lib/elements/loading-indicator/loading-indicator.component.mjs +0 -20
- package/esm2022/lib/elements/number-input/number-input.component.mjs +0 -31
- package/esm2022/lib/elements/password-field/password-field.component.mjs +0 -21
- package/esm2022/lib/elements/radio/radio.component.mjs +0 -34
- package/esm2022/lib/elements/select/select-footer/select-footer.component.mjs +0 -15
- package/esm2022/lib/elements/select/select.component.mjs +0 -385
- package/esm2022/lib/elements/sortable-grouped-items/sortable-grouped-items.component.mjs +0 -54
- package/esm2022/lib/elements/sortable-items/sortable-items.component.mjs +0 -189
- package/esm2022/lib/elements/text-area/text-area.component.mjs +0 -23
- package/esm2022/lib/elements/text-input/text-input.component.mjs +0 -52
- package/esm2022/lib/elements/toggle/toggle.component.mjs +0 -21
- package/esm2022/lib/elements/value-accessor-base/multiple-value-accessor-base.component.mjs +0 -61
- package/esm2022/lib/elements/value-accessor-base/value-accessor-base.component.mjs +0 -167
- package/esm2022/lib/form/form-caption/form-caption.component.mjs +0 -31
- package/esm2022/lib/form/form-caption-end/form-caption-end.component.mjs +0 -34
- package/esm2022/lib/form/form-element/form-element.component.mjs +0 -317
- package/esm2022/lib/form/form-error/form-error.component.mjs +0 -40
- package/esm2022/lib/form/form-submit-button/form-submit-button.component.mjs +0 -71
- package/esm2022/lib/form/form-validation-error/form-validation-error.mjs +0 -22
- package/esm2022/lib/form/form.component.mjs +0 -442
- package/esm2022/lib/material.module.mjs +0 -22
- package/esm2022/lib/ngx-enhancy-forms.module.mjs +0 -191
- package/esm2022/lib/onRender.component.mjs +0 -19
- package/esm2022/lib/types.mjs +0 -2
- package/esm2022/lib/util/angular.mjs +0 -9
- package/esm2022/lib/util/arrays.mjs +0 -48
- package/esm2022/lib/util/classes.mjs +0 -2
- package/esm2022/lib/util/dom.mjs +0 -15
- package/esm2022/lib/util/objects.mjs +0 -38
- package/esm2022/lib/util/values.mjs +0 -23
- package/esm2022/lib/validators/dateValidator.mjs +0 -6
- package/esm2022/lib/validators/timeValidator.mjs +0 -6
- package/esm2022/lib/warning-icon/warning-icon.component.mjs +0 -17
- package/esm2022/lib/withTooltip.component.mjs +0 -185
- package/esm2022/public-api.mjs +0 -38
- package/lib/elementIsTruncatedCb.component.d.ts +0 -14
- package/lib/elements/button/button.component.d.ts +0 -16
- package/lib/elements/checkbox/checkbox.component.d.ts +0 -8
- package/lib/elements/date-picker/date-picker.component.d.ts +0 -26
- package/lib/elements/date-time-picker/date-time-picker.component.d.ts +0 -83
- package/lib/elements/email/email-input.component.d.ts +0 -7
- package/lib/elements/file-input/file-input.component.d.ts +0 -18
- package/lib/elements/hour-minute-input/hour-minute-input.component.d.ts +0 -20
- package/lib/elements/loading-indicator/loading-indicator.component.d.ts +0 -7
- package/lib/elements/number-input/number-input.component.d.ts +0 -9
- package/lib/elements/password-field/password-field.component.d.ts +0 -7
- package/lib/elements/radio/radio.component.d.ts +0 -21
- package/lib/elements/select/select-footer/select-footer.component.d.ts +0 -7
- package/lib/elements/select/select.component.d.ts +0 -91
- package/lib/elements/sortable-grouped-items/sortable-grouped-items.component.d.ts +0 -12
- package/lib/elements/sortable-items/sortable-items.component.d.ts +0 -29
- package/lib/elements/text-area/text-area.component.d.ts +0 -9
- package/lib/elements/text-input/text-input.component.d.ts +0 -19
- package/lib/elements/toggle/toggle.component.d.ts +0 -7
- package/lib/elements/value-accessor-base/multiple-value-accessor-base.component.d.ts +0 -14
- package/lib/elements/value-accessor-base/value-accessor-base.component.d.ts +0 -50
- package/lib/form/form-caption/form-caption.component.d.ts +0 -11
- package/lib/form/form-caption-end/form-caption-end.component.d.ts +0 -12
- package/lib/form/form-element/form-element.component.d.ts +0 -81
- package/lib/form/form-error/form-error.component.d.ts +0 -15
- package/lib/form/form-submit-button/form-submit-button.component.d.ts +0 -21
- package/lib/form/form-validation-error/form-validation-error.d.ts +0 -10
- package/lib/form/form.component.d.ts +0 -58
- package/lib/material.module.d.ts +0 -11
- package/lib/ngx-enhancy-forms.module.d.ts +0 -41
- package/lib/onRender.component.d.ts +0 -8
- package/lib/types.d.ts +0 -16
- package/lib/util/angular.d.ts +0 -2
- package/lib/util/arrays.d.ts +0 -8
- package/lib/util/classes.d.ts +0 -1
- package/lib/util/dom.d.ts +0 -2
- package/lib/util/objects.d.ts +0 -1
- package/lib/util/values.d.ts +0 -6
- package/lib/validators/dateValidator.d.ts +0 -3
- package/lib/validators/timeValidator.d.ts +0 -3
- package/lib/warning-icon/warning-icon.component.d.ts +0 -6
- package/lib/withTooltip.component.d.ts +0 -23
- package/public-api.d.ts +0 -34
|
@@ -1,442 +0,0 @@
|
|
|
1
|
-
import { Component, Directive, EventEmitter, Input, Optional, Output, SkipSelf } from '@angular/core';
|
|
2
|
-
import { FormArray, FormControl, FormGroup, UntypedFormArray, UntypedFormControl, UntypedFormGroup } from '@angular/forms';
|
|
3
|
-
import { isValueSet } from '../util/values';
|
|
4
|
-
import { deepMerge } from '../util/objects';
|
|
5
|
-
import { cloneDeep } from 'lodash';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/forms";
|
|
8
|
-
export const invalidFieldsSymbol = Symbol('Not all fields are valid');
|
|
9
|
-
export class SubFormDirective {
|
|
10
|
-
constructor() {
|
|
11
|
-
this.manuallyTriggerInjection = false;
|
|
12
|
-
this.allowInjectionToOverwrite = false;
|
|
13
|
-
}
|
|
14
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: SubFormDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
15
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.0", type: SubFormDirective, selector: "klp-sub-form", inputs: { injectInto: "injectInto", at: "at", manuallyTriggerInjection: "manuallyTriggerInjection", allowInjectionToOverwrite: "allowInjectionToOverwrite" }, ngImport: i0 }); }
|
|
16
|
-
}
|
|
17
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: SubFormDirective, decorators: [{
|
|
18
|
-
type: Directive,
|
|
19
|
-
args: [{
|
|
20
|
-
// tslint:disable-next-line:directive-selector
|
|
21
|
-
selector: 'klp-sub-form',
|
|
22
|
-
}]
|
|
23
|
-
}], propDecorators: { injectInto: [{
|
|
24
|
-
type: Input
|
|
25
|
-
}], at: [{
|
|
26
|
-
type: Input
|
|
27
|
-
}], manuallyTriggerInjection: [{
|
|
28
|
-
type: Input
|
|
29
|
-
}], allowInjectionToOverwrite: [{
|
|
30
|
-
type: Input
|
|
31
|
-
}] } });
|
|
32
|
-
export class FormComponent {
|
|
33
|
-
constructor(parent, subFormDirective) {
|
|
34
|
-
this.parent = parent;
|
|
35
|
-
this.subFormDirective = subFormDirective;
|
|
36
|
-
this.readOnly = false;
|
|
37
|
-
this.showErrorMessages = true;
|
|
38
|
-
this.errorMessageLocation = 'belowCaption';
|
|
39
|
-
this.warnings = new Map();
|
|
40
|
-
this.immutableValues = {};
|
|
41
|
-
this.errors = new Map();
|
|
42
|
-
this.allowSubmitOn = 'buttonAndEnter';
|
|
43
|
-
this.onInjected = new EventEmitter();
|
|
44
|
-
// we keep track of what form controls are actually rendered. Only those count when looking at form validation
|
|
45
|
-
this.activeControls = [];
|
|
46
|
-
}
|
|
47
|
-
ngOnInit() {
|
|
48
|
-
this.topLevelFormControl = this.formGroup ?? this.formArray;
|
|
49
|
-
if (isValueSet(this.patchValueInterceptor)) {
|
|
50
|
-
this.addSupportForPatchValueInterceptor();
|
|
51
|
-
}
|
|
52
|
-
if (isValueSet(this.parent) && isValueSet(this.subFormDirective)) {
|
|
53
|
-
if (this.subFormDirective.manuallyTriggerInjection) {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
// if the `formComponentToInject` is not set, just attach the first that requests an injection
|
|
57
|
-
this.attachAsSubForm();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
_ext_attachAsSubForm() {
|
|
61
|
-
if (!isValueSet(this.parent)) {
|
|
62
|
-
throw new Error('No parent to inject this form into was found.');
|
|
63
|
-
}
|
|
64
|
-
if (!isValueSet(this.subFormDirective)) {
|
|
65
|
-
throw new Error('Subform directive not found.');
|
|
66
|
-
}
|
|
67
|
-
this.attachAsSubForm();
|
|
68
|
-
}
|
|
69
|
-
attachAsSubForm() {
|
|
70
|
-
const injectInto = this.subFormDirective.injectInto;
|
|
71
|
-
const injectAt = this.subFormDirective.at;
|
|
72
|
-
const allowInjectionToOverwrite = this.subFormDirective.allowInjectionToOverwrite;
|
|
73
|
-
if (injectInto instanceof UntypedFormArray) {
|
|
74
|
-
if (!allowInjectionToOverwrite) {
|
|
75
|
-
if (injectInto.at(injectAt) instanceof FormGroup || injectInto.at(injectAt) instanceof FormArray) {
|
|
76
|
-
throw new Error(`There already is a subform injected at ${injectAt}. Make sure this property does not have a formGroup or formArray already attached when linking it to a subForm.`);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
if (typeof injectAt !== 'number') {
|
|
80
|
-
throw new Error(`cannot index FormArray with ${typeof injectAt}`);
|
|
81
|
-
}
|
|
82
|
-
if (injectInto.at(injectAt)?.disabled) {
|
|
83
|
-
this.topLevelFormControl.disable();
|
|
84
|
-
}
|
|
85
|
-
const source = injectInto.at(injectAt);
|
|
86
|
-
const valueBeforeInject = source?.value;
|
|
87
|
-
if (isValueSet(valueBeforeInject)) {
|
|
88
|
-
this.topLevelFormControl.patchValue(valueBeforeInject);
|
|
89
|
-
}
|
|
90
|
-
injectInto.setControl(injectAt, this.topLevelFormControl);
|
|
91
|
-
this.onInjected.emit(valueBeforeInject);
|
|
92
|
-
}
|
|
93
|
-
else if (injectInto instanceof UntypedFormGroup) {
|
|
94
|
-
if (!allowInjectionToOverwrite) {
|
|
95
|
-
if (injectInto.get(injectAt) instanceof FormGroup || injectInto.get(injectAt) instanceof FormArray) {
|
|
96
|
-
throw new Error(`There already is a subform injected at ${injectAt}. Make sure this property does not have a formGroup or formArray already attached when linking it to a subForm.`);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
if (typeof injectAt !== 'string') {
|
|
100
|
-
throw new Error(`cannot index FormGroup with ${typeof injectAt}`);
|
|
101
|
-
}
|
|
102
|
-
if (injectInto.get(injectAt)?.disabled) {
|
|
103
|
-
this.topLevelFormControl.disable();
|
|
104
|
-
}
|
|
105
|
-
const source = injectInto.get(injectAt);
|
|
106
|
-
const valueBeforeInject = source?.value;
|
|
107
|
-
if (isValueSet(valueBeforeInject)) {
|
|
108
|
-
this.topLevelFormControl.patchValue(valueBeforeInject);
|
|
109
|
-
}
|
|
110
|
-
injectInto.setControl(injectAt, this.topLevelFormControl);
|
|
111
|
-
this.onInjected.emit(valueBeforeInject);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
ngOnChanges(simpleChanges) {
|
|
115
|
-
if (simpleChanges.readOnly?.currentValue === true) {
|
|
116
|
-
this.activeControls.forEach(e => e.formControl.disable());
|
|
117
|
-
}
|
|
118
|
-
if (isValueSet(simpleChanges.warnings?.currentValue)) {
|
|
119
|
-
this.patchFormWarningsMap();
|
|
120
|
-
}
|
|
121
|
-
if (isValueSet(simpleChanges.errors?.currentValue)) {
|
|
122
|
-
this.patchFormErrorsMap();
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
ngOnDestroy() {
|
|
126
|
-
if (isValueSet(this.parent) && isValueSet(this.subFormDirective)) {
|
|
127
|
-
const injectInto = this.subFormDirective.injectInto;
|
|
128
|
-
const injectAt = this.subFormDirective.at;
|
|
129
|
-
if (injectInto instanceof UntypedFormArray) {
|
|
130
|
-
const idx = injectInto.controls.findIndex(e => e === this.topLevelFormControl);
|
|
131
|
-
injectInto.removeAt(idx);
|
|
132
|
-
}
|
|
133
|
-
else if (injectInto instanceof UntypedFormGroup) {
|
|
134
|
-
if (typeof injectAt !== 'string') {
|
|
135
|
-
throw new Error(`cannot index FormGroup with ${typeof injectAt}`);
|
|
136
|
-
}
|
|
137
|
-
injectInto.setControl(injectAt, new FormControl());
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
patchFormWarningsMap() {
|
|
142
|
-
const setFn = this.warnings.set;
|
|
143
|
-
this.warnings.set = (key, value) => {
|
|
144
|
-
const prevVal = this.warnings.get(key);
|
|
145
|
-
const result = setFn.call(this.warnings, key, value);
|
|
146
|
-
if (prevVal !== value) {
|
|
147
|
-
this.getFormElementByFormControl(key)?.determinePopupState();
|
|
148
|
-
}
|
|
149
|
-
return result;
|
|
150
|
-
};
|
|
151
|
-
const deleteFn = this.warnings.delete;
|
|
152
|
-
this.warnings.delete = (key) => {
|
|
153
|
-
const result = deleteFn.call(this.warnings, key);
|
|
154
|
-
this.getFormElementByFormControl(key)?.determinePopupState();
|
|
155
|
-
return result;
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
patchFormErrorsMap() {
|
|
159
|
-
const setFn = this.errors.set;
|
|
160
|
-
this.errors.set = (key, value) => {
|
|
161
|
-
const prevVal = this.errors.get(key);
|
|
162
|
-
const result = setFn.call(this.errors, key, value);
|
|
163
|
-
key.setErrors({ ...key.errors, formLevel: value });
|
|
164
|
-
if (prevVal !== value) {
|
|
165
|
-
this.getFormElementByFormControl(key)?.determinePopupState();
|
|
166
|
-
}
|
|
167
|
-
return result;
|
|
168
|
-
};
|
|
169
|
-
const deleteFn = this.errors.delete;
|
|
170
|
-
this.errors.delete = (key) => {
|
|
171
|
-
const newErrorsObject = key.errors;
|
|
172
|
-
delete newErrorsObject.formLevel;
|
|
173
|
-
key.setErrors(newErrorsObject);
|
|
174
|
-
const result = deleteFn.call(this.errors, key);
|
|
175
|
-
this.getFormElementByFormControl(key)?.determinePopupState();
|
|
176
|
-
return result;
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
addSupportForPatchValueInterceptor() {
|
|
180
|
-
const fn = this.topLevelFormControl.patchValue;
|
|
181
|
-
const newFn = (value, options) => {
|
|
182
|
-
this.patchValueInterceptor(value).then((val) => {
|
|
183
|
-
setTimeout(() => {
|
|
184
|
-
fn.call(this.topLevelFormControl, val, options);
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
};
|
|
188
|
-
this.topLevelFormControl.patchValue = newFn;
|
|
189
|
-
}
|
|
190
|
-
registerControl(formControl, formElement) {
|
|
191
|
-
this.activeControls.push({ formControl, formElement });
|
|
192
|
-
let parentImmutableValueFn;
|
|
193
|
-
if (this.parent) {
|
|
194
|
-
parentImmutableValueFn = this.parent.registerControl(formControl, formElement);
|
|
195
|
-
}
|
|
196
|
-
if (this.readOnly) {
|
|
197
|
-
formControl.disable();
|
|
198
|
-
}
|
|
199
|
-
const enableFn = formControl.enable;
|
|
200
|
-
formControl.enable = (opts) => {
|
|
201
|
-
if (!this.readOnly) {
|
|
202
|
-
enableFn.call(formControl, opts);
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
const getImmutableValueFn = () => {
|
|
206
|
-
const path = this.getPathFromParentToControl(formControl);
|
|
207
|
-
const immutableValue = this.getImmutableValueFromPath(path);
|
|
208
|
-
const immutableValueFromParent = parentImmutableValueFn?.();
|
|
209
|
-
return cloneDeep(immutableValue !== undefined ? immutableValue : immutableValueFromParent);
|
|
210
|
-
};
|
|
211
|
-
const setValueFn = formControl.setValue;
|
|
212
|
-
formControl.setValue = (value, options) => {
|
|
213
|
-
const immutableValue = getImmutableValueFn();
|
|
214
|
-
if (immutableValue !== undefined && options?.emitModelToViewChange !== true) {
|
|
215
|
-
if (!isValueSet(options)) {
|
|
216
|
-
options = {};
|
|
217
|
-
}
|
|
218
|
-
options.emitModelToViewChange = true;
|
|
219
|
-
}
|
|
220
|
-
setValueFn.call(formControl, immutableValue !== undefined ? immutableValue : value, options);
|
|
221
|
-
};
|
|
222
|
-
const immutableValue = getImmutableValueFn();
|
|
223
|
-
if (immutableValue !== undefined) {
|
|
224
|
-
formControl.setValue(immutableValue);
|
|
225
|
-
}
|
|
226
|
-
return getImmutableValueFn;
|
|
227
|
-
}
|
|
228
|
-
getPathFromParentToControl(control) {
|
|
229
|
-
const path = [];
|
|
230
|
-
let currentControl = control;
|
|
231
|
-
while (currentControl.parent) {
|
|
232
|
-
const parent = currentControl.parent;
|
|
233
|
-
if (parent instanceof FormGroup) {
|
|
234
|
-
const key = Object.entries(parent.controls).find(([key, value]) => value === currentControl)[0];
|
|
235
|
-
path.push(key);
|
|
236
|
-
}
|
|
237
|
-
else if (parent instanceof FormArray) {
|
|
238
|
-
const idx = parent.controls.findIndex(e => e === currentControl);
|
|
239
|
-
path.push(idx);
|
|
240
|
-
}
|
|
241
|
-
currentControl = parent;
|
|
242
|
-
}
|
|
243
|
-
return path.reverse();
|
|
244
|
-
}
|
|
245
|
-
getImmutableValueFromPath(path) {
|
|
246
|
-
let current = this.immutableValues;
|
|
247
|
-
for (const key of path) {
|
|
248
|
-
if (!isValueSet(current?.[key])) {
|
|
249
|
-
return undefined;
|
|
250
|
-
}
|
|
251
|
-
current = current[key];
|
|
252
|
-
}
|
|
253
|
-
return current;
|
|
254
|
-
}
|
|
255
|
-
unregisterControl(formControl) {
|
|
256
|
-
this.activeControls = this.activeControls.filter((e) => e.formControl !== formControl);
|
|
257
|
-
if (this.parent) {
|
|
258
|
-
this.parent.unregisterControl(formControl);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
addFormGroupControls(formGroup, result) {
|
|
262
|
-
Object.values(formGroup.controls).forEach((value) => {
|
|
263
|
-
if (value instanceof UntypedFormGroup) {
|
|
264
|
-
this.addFormGroupControls(value, result);
|
|
265
|
-
}
|
|
266
|
-
else if (value instanceof UntypedFormArray) {
|
|
267
|
-
this.addFormArrayControls(value, result);
|
|
268
|
-
}
|
|
269
|
-
else if (value instanceof UntypedFormControl) {
|
|
270
|
-
this.addFormControl(value, result);
|
|
271
|
-
}
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
addFormArrayControls(formArray, result) {
|
|
275
|
-
formArray.controls.forEach((value) => {
|
|
276
|
-
if (value instanceof UntypedFormGroup) {
|
|
277
|
-
this.addFormGroupControls(value, result);
|
|
278
|
-
}
|
|
279
|
-
else if (value instanceof UntypedFormArray) {
|
|
280
|
-
this.addFormArrayControls(value, result);
|
|
281
|
-
}
|
|
282
|
-
else if (value instanceof UntypedFormControl) {
|
|
283
|
-
this.addFormControl(value, result);
|
|
284
|
-
}
|
|
285
|
-
});
|
|
286
|
-
}
|
|
287
|
-
getAllFormControls() {
|
|
288
|
-
const result = [];
|
|
289
|
-
if (this.topLevelFormControl instanceof FormGroup) {
|
|
290
|
-
this.addFormGroupControls(this.topLevelFormControl, result);
|
|
291
|
-
}
|
|
292
|
-
else if (this.topLevelFormControl instanceof FormArray) {
|
|
293
|
-
this.addFormArrayControls(this.topLevelFormControl, result);
|
|
294
|
-
}
|
|
295
|
-
return result;
|
|
296
|
-
}
|
|
297
|
-
addFormControl(control, result) {
|
|
298
|
-
result.push(control);
|
|
299
|
-
}
|
|
300
|
-
disableInactiveFormControl(control) {
|
|
301
|
-
if (!this.activeControls.some((e) => e.formControl === control)) {
|
|
302
|
-
control.disable();
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
getFormElementByFormControl(control) {
|
|
306
|
-
return this.activeControls.find((e) => e.formControl === control)?.formElement;
|
|
307
|
-
}
|
|
308
|
-
getWarningToShow(control) {
|
|
309
|
-
return this.warnings.get(control);
|
|
310
|
-
}
|
|
311
|
-
trySubmit() {
|
|
312
|
-
this.topLevelFormControl.markAllAsTouched();
|
|
313
|
-
const allControls = this.getAllFormControls();
|
|
314
|
-
const originalDisabledStates = allControls.map(e => {
|
|
315
|
-
return { control: e, disabled: e.disabled };
|
|
316
|
-
});
|
|
317
|
-
allControls.forEach(e => this.disableInactiveFormControl(e));
|
|
318
|
-
allControls.forEach(e => e.updateValueAndValidity());
|
|
319
|
-
const formGroupValue = this.topLevelFormControl.value;
|
|
320
|
-
if (this.topLevelFormControl instanceof FormGroup) {
|
|
321
|
-
const renderedAndEnabledValues = this.getRenderedFieldValuesFormGroup(this.topLevelFormControl, true);
|
|
322
|
-
const renderedButDisabledValues = this.getRenderedFieldValuesFormGroup(this.topLevelFormControl, false);
|
|
323
|
-
return new Promise((resolve, reject) => {
|
|
324
|
-
if (this.topLevelFormControl.pending) {
|
|
325
|
-
const sub = this.topLevelFormControl.statusChanges.subscribe((res) => {
|
|
326
|
-
if (res !== 'PENDING') {
|
|
327
|
-
sub.unsubscribe();
|
|
328
|
-
this.handleSubmission(originalDisabledStates, renderedAndEnabledValues, renderedButDisabledValues, formGroupValue)
|
|
329
|
-
.then(resolve)
|
|
330
|
-
.catch(reject);
|
|
331
|
-
}
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
else {
|
|
335
|
-
this.handleSubmission(originalDisabledStates, renderedAndEnabledValues, renderedButDisabledValues, formGroupValue)
|
|
336
|
-
.then(resolve)
|
|
337
|
-
.catch(reject);
|
|
338
|
-
}
|
|
339
|
-
});
|
|
340
|
-
}
|
|
341
|
-
throw new Error('Submitting a FormArray as topLevel not supported (yet). Wrap it in a FormGroup.');
|
|
342
|
-
}
|
|
343
|
-
handleSubmission(originalDisabledStates, renderedAndEnabledValues, renderedButDisabledValues, formGroupValue) {
|
|
344
|
-
if (this.topLevelFormControl.invalid) {
|
|
345
|
-
this.activeControls.find((e) => e.formControl.invalid)?.formElement?.scrollTo();
|
|
346
|
-
this.setDisabledStatesForAllControls(originalDisabledStates);
|
|
347
|
-
return Promise.reject(invalidFieldsSymbol);
|
|
348
|
-
}
|
|
349
|
-
else {
|
|
350
|
-
this.setDisabledStatesForAllControls(originalDisabledStates);
|
|
351
|
-
const renderedValues = deepMerge(renderedAndEnabledValues, renderedButDisabledValues);
|
|
352
|
-
return Promise.resolve([formGroupValue, renderedValues]);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
getRenderedFieldValuesFormGroup(formGroup, enabled, valueObject = {}) {
|
|
356
|
-
Object.entries(formGroup.controls).forEach(([name, control]) => {
|
|
357
|
-
if (control instanceof FormControl && control.enabled === enabled && this.activeControls.some(e => e.formControl === control)) {
|
|
358
|
-
valueObject[name] = control.value;
|
|
359
|
-
}
|
|
360
|
-
else if (control instanceof FormArray) {
|
|
361
|
-
valueObject[name] = [];
|
|
362
|
-
this.getRenderedFieldValuesFormArray(control, enabled, valueObject[name]);
|
|
363
|
-
}
|
|
364
|
-
else if (control instanceof FormGroup) {
|
|
365
|
-
valueObject[name] = {};
|
|
366
|
-
this.getRenderedFieldValuesFormGroup(control, enabled, valueObject[name]);
|
|
367
|
-
}
|
|
368
|
-
});
|
|
369
|
-
return valueObject;
|
|
370
|
-
}
|
|
371
|
-
getRenderedFieldValuesFormArray(formArray, enabled, valueArray) {
|
|
372
|
-
formArray.controls.forEach((control) => {
|
|
373
|
-
if (control instanceof FormControl && control.enabled === enabled && this.activeControls.some(e => e.formControl === control)) {
|
|
374
|
-
valueArray.push(control.value);
|
|
375
|
-
}
|
|
376
|
-
else if (control instanceof FormArray) {
|
|
377
|
-
const newArray = [];
|
|
378
|
-
valueArray.push(newArray);
|
|
379
|
-
this.getRenderedFieldValuesFormArray(control, enabled, newArray);
|
|
380
|
-
}
|
|
381
|
-
else if (control instanceof FormGroup) {
|
|
382
|
-
const newObject = {};
|
|
383
|
-
valueArray.push(newObject);
|
|
384
|
-
this.getRenderedFieldValuesFormGroup(control, enabled, newObject);
|
|
385
|
-
}
|
|
386
|
-
});
|
|
387
|
-
}
|
|
388
|
-
_ext_getRenderedFieldValues() {
|
|
389
|
-
if (this.topLevelFormControl instanceof FormGroup) {
|
|
390
|
-
const renderedAndEnabledValues = this.getRenderedFieldValuesFormGroup(this.topLevelFormControl, true);
|
|
391
|
-
const renderedButDisabledValues = this.getRenderedFieldValuesFormGroup(this.topLevelFormControl, false);
|
|
392
|
-
const allRenderedValues = deepMerge(renderedAndEnabledValues, renderedButDisabledValues);
|
|
393
|
-
return allRenderedValues;
|
|
394
|
-
}
|
|
395
|
-
throw new Error('Getting values from a FormArray as topLevel is not supported (yet).');
|
|
396
|
-
}
|
|
397
|
-
setDisabledStatesForAllControls(originalDisabledStates) {
|
|
398
|
-
originalDisabledStates.forEach((e) => {
|
|
399
|
-
if (e.disabled) {
|
|
400
|
-
e.control.disable();
|
|
401
|
-
}
|
|
402
|
-
else {
|
|
403
|
-
e.control.enable();
|
|
404
|
-
}
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: FormComponent, deps: [{ token: FormComponent, optional: true, skipSelf: true }, { token: SubFormDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
408
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.0", type: FormComponent, selector: "klp-form", inputs: { readOnly: "readOnly", showErrorMessages: "showErrorMessages", errorMessageLocation: "errorMessageLocation", formGroup: "formGroup", formArray: "formArray", warnings: "warnings", immutableValues: "immutableValues", errors: "errors", patchValueInterceptor: "patchValueInterceptor", allowSubmitOn: "allowSubmitOn" }, outputs: { onInjected: "onInjected" }, usesOnChanges: true, ngImport: i0, template: "<form>\n\t<ng-content></ng-content>\n</form>\n\n\n", styles: [":host{display:block}:host.row{display:flex}:host form{height:inherit}\n"], dependencies: [{ 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.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] }); }
|
|
409
|
-
}
|
|
410
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: FormComponent, decorators: [{
|
|
411
|
-
type: Component,
|
|
412
|
-
args: [{ selector: 'klp-form', template: "<form>\n\t<ng-content></ng-content>\n</form>\n\n\n", styles: [":host{display:block}:host.row{display:flex}:host form{height:inherit}\n"] }]
|
|
413
|
-
}], ctorParameters: () => [{ type: FormComponent, decorators: [{
|
|
414
|
-
type: SkipSelf
|
|
415
|
-
}, {
|
|
416
|
-
type: Optional
|
|
417
|
-
}] }, { type: SubFormDirective, decorators: [{
|
|
418
|
-
type: Optional
|
|
419
|
-
}] }], propDecorators: { readOnly: [{
|
|
420
|
-
type: Input
|
|
421
|
-
}], showErrorMessages: [{
|
|
422
|
-
type: Input
|
|
423
|
-
}], errorMessageLocation: [{
|
|
424
|
-
type: Input
|
|
425
|
-
}], formGroup: [{
|
|
426
|
-
type: Input
|
|
427
|
-
}], formArray: [{
|
|
428
|
-
type: Input
|
|
429
|
-
}], warnings: [{
|
|
430
|
-
type: Input
|
|
431
|
-
}], immutableValues: [{
|
|
432
|
-
type: Input
|
|
433
|
-
}], errors: [{
|
|
434
|
-
type: Input
|
|
435
|
-
}], patchValueInterceptor: [{
|
|
436
|
-
type: Input
|
|
437
|
-
}], allowSubmitOn: [{
|
|
438
|
-
type: Input
|
|
439
|
-
}], onInjected: [{
|
|
440
|
-
type: Output
|
|
441
|
-
}] } });
|
|
442
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rbGlwcGEvbmd4LWVuaGFuY3ktZm9ybXMvc3JjL2xpYi9mb3JtL2Zvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2xpcHBhL25neC1lbmhhbmN5LWZvcm1zL3NyYy9saWIvZm9ybS9mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBSUwsUUFBUSxFQUNSLE1BQU0sRUFFTixRQUFRLEVBRVIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sUUFBUSxDQUFDOzs7QUFFakMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFNdEUsTUFBTSxPQUFPLGdCQUFnQjtJQUo3QjtRQU9VLDZCQUF3QixHQUFZLEtBQUssQ0FBQztRQUMxQyw4QkFBeUIsR0FBWSxLQUFLLENBQUM7S0FDcEQ7OEdBTFksZ0JBQWdCO2tHQUFoQixnQkFBZ0I7OzJGQUFoQixnQkFBZ0I7a0JBSjVCLFNBQVM7bUJBQUM7b0JBQ1YsOENBQThDO29CQUM5QyxRQUFRLEVBQUUsY0FBYztpQkFDeEI7OEJBRVMsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csd0JB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YUFBYSxnYkM5QzFCLG9EQUtBOzsyRkR5Q2EsYUFBYTtrQkFMekIsU0FBUzsrQkFDQyxVQUFVOzswQkF5QlAsUUFBUTs7MEJBQUksUUFBUTs7MEJBQW1DLFFBQVE7eUNBcEI1RCxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFDVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsZUFBZTtzQkFBOUIsS0FBSztnQkFDVSxNQUFNO3NCQUFyQixLQUFLO2dCQUNVLHFCQUFxQjtzQkFBcEMsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixLQUFLO2dCQUNXLFVBQVU7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdERpcmVjdGl2ZSxcblx0RXZlbnRFbWl0dGVyLFxuXHRJbnB1dCxcblx0T25DaGFuZ2VzLFxuXHRPbkRlc3Ryb3ksXG5cdE9uSW5pdCxcblx0T3B0aW9uYWwsXG5cdE91dHB1dCxcblx0U2ltcGxlQ2hhbmdlcyxcblx0U2tpcFNlbGYsXG5cdFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0QWJzdHJhY3RDb250cm9sLFxuXHRGb3JtQXJyYXksXG5cdEZvcm1Db250cm9sLFxuXHRGb3JtR3JvdXAsXG5cdFVudHlwZWRGb3JtQXJyYXksXG5cdFVudHlwZWRGb3JtQ29udHJvbCxcblx0VW50eXBlZEZvcm1Hcm91cFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0Zvcm1FbGVtZW50Q29tcG9uZW50fSBmcm9tICcuL2Zvcm0tZWxlbWVudC9mb3JtLWVsZW1lbnQuY29tcG9uZW50JztcbmltcG9ydCB7aXNWYWx1ZVNldH0gZnJvbSAnLi4vdXRpbC92YWx1ZXMnO1xuaW1wb3J0IHtkZWVwTWVyZ2V9IGZyb20gJy4uL3V0aWwvb2JqZWN0cyc7XG5pbXBvcnQge2Nsb25lRGVlcH0gZnJvbSAnbG9kYXNoJztcblxuZXhwb3J0IGNvbnN0IGludmFsaWRGaWVsZHNTeW1ib2wgPSBTeW1ib2woJ05vdCBhbGwgZmllbGRzIGFyZSB2YWxpZCcpO1xuXG5ARGlyZWN0aXZlKHtcblx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxuXHRzZWxlY3RvcjogJ2tscC1zdWItZm9ybScsXG59KVxuZXhwb3J0IGNsYXNzIFN1YkZvcm1EaXJlY3RpdmUge1xuXHRASW5wdXQoKSBpbmplY3RJbnRvOiBVbnR5cGVkRm9ybUFycmF5IHwgVW50eXBlZEZvcm1Hcm91cDtcblx0QElucHV0KCkgYXQ6IG51bWJlciB8IHN0cmluZztcblx0QElucHV0KCkgbWFudWFsbHlUcmlnZ2VySW5qZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cdEBJbnB1dCgpIGFsbG93SW5qZWN0aW9uVG9PdmVyd3JpdGU6IGJvb2xlYW4gPSBmYWxzZTtcbn1cblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAna2xwLWZvcm0nLFxuXHR0ZW1wbGF0ZVVybDogJy4vZm9ybS5jb21wb25lbnQuaHRtbCcsXG5cdHN0eWxlVXJsczogWycuL2Zvcm0uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuXHRASW5wdXQoKSBwdWJsaWMgcmVhZE9ubHkgPSBmYWxzZTtcblx0QElucHV0KCkgcHVibGljIHNob3dFcnJvck1lc3NhZ2VzID0gdHJ1ZTtcblx0QElucHV0KCkgcHVibGljIGVycm9yTWVzc2FnZUxvY2F0aW9uOiAnYmVsb3dDYXB0aW9uJyB8ICdyaWdodE9mQ2FwdGlvbicgPSAnYmVsb3dDYXB0aW9uJztcblx0QElucHV0KCkgcHVibGljIGZvcm1Hcm91cDogRm9ybUdyb3VwO1xuXHRASW5wdXQoKSBwdWJsaWMgZm9ybUFycmF5OiBGb3JtQXJyYXk7XG5cdEBJbnB1dCgpIHB1YmxpYyB3YXJuaW5nczogTWFwPEFic3RyYWN0Q29udHJvbCwgc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pj4gPSBuZXcgTWFwPEFic3RyYWN0Q29udHJvbCwgc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55Pj4oKTtcblx0QElucHV0KCkgcHVibGljIGltbXV0YWJsZVZhbHVlczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXHRASW5wdXQoKSBwdWJsaWMgZXJyb3JzOiBNYXA8QWJzdHJhY3RDb250cm9sLCBzdHJpbmc+ID0gbmV3IE1hcDxBYnN0cmFjdENvbnRyb2wsIHN0cmluZz4oKTtcblx0QElucHV0KCkgcHVibGljIHBhdGNoVmFsdWVJbnRlcmNlcHRvcjogKHZhbHVlczogYW55KSA9PiBQcm9taXNlPGFueT47XG5cdEBJbnB1dCgpIHB1YmxpYyBhbGxvd1N1Ym1pdE9uOiAnYnV0dG9uQW5kRW50ZXInIHwgJ2J1dHRvbk9ubHknID0gJ2J1dHRvbkFuZEVudGVyJztcblx0QE91dHB1dCgpIHB1YmxpYyBvbkluamVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ8c3RyaW5nLCBhbnk+PigpO1xuXG5cdHByaXZhdGUgdG9wTGV2ZWxGb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sO1xuXG5cdC8vIHdlIGtlZXAgdHJhY2sgb2Ygd2hhdCBmb3JtIGNvbnRyb2xzIGFyZSBhY3R1YWxseSByZW5kZXJlZC4gT25seSB0aG9zZSBjb3VudCB3aGVuIGxvb2tpbmcgYXQgZm9ybSB2YWxpZGF0aW9uXG5cdHByaXZhdGUgYWN0aXZlQ29udHJvbHM6IEFycmF5PHtcblx0XHRmb3JtQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sO1xuXHRcdGZvcm1FbGVtZW50OiBGb3JtRWxlbWVudENvbXBvbmVudDtcblx0fT4gPSBbXTtcblxuXHRjb25zdHJ1Y3RvcihAU2tpcFNlbGYoKSBAT3B0aW9uYWwoKSBwcml2YXRlIHBhcmVudDogRm9ybUNvbXBvbmVudCwgQE9wdGlvbmFsKCkgcHJpdmF0ZSBzdWJGb3JtRGlyZWN0aXZlOiBTdWJGb3JtRGlyZWN0aXZlKSB7XG5cdH1cblxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcblx0XHR0aGlzLnRvcExldmVsRm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1Hcm91cCA/PyB0aGlzLmZvcm1BcnJheTtcblx0XHRpZiAoaXNWYWx1ZVNldCh0aGlzLnBhdGNoVmFsdWVJbnRlcmNlcHRvcikpIHtcblx0XHRcdHRoaXMuYWRkU3VwcG9ydEZvclBhdGNoVmFsdWVJbnRlcmNlcHRvcigpO1xuXHRcdH1cblx0XHRpZiAoaXNWYWx1ZVNldCh0aGlzLnBhcmVudCkgJiYgaXNWYWx1ZVNldCh0aGlzLnN1YkZvcm1EaXJlY3RpdmUpKSB7XG5cdFx0XHRpZiAodGhpcy5zdWJGb3JtRGlyZWN0aXZlLm1hbnVhbGx5VHJpZ2dlckluamVjdGlvbikge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHQvLyBpZiB0aGUgYGZvcm1Db21wb25lbnRUb0luamVjdGAgaXMgbm90IHNldCwganVzdCBhdHRhY2ggdGhlIGZpcnN0IHRoYXQgcmVxdWVzdHMgYW4gaW5qZWN0aW9uXG5cdFx0XHR0aGlzLmF0dGFjaEFzU3ViRm9ybSgpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBfZXh0X2F0dGFjaEFzU3ViRm9ybSgpOiB2b2lkIHtcblx0XHRpZiAoIWlzVmFsdWVTZXQodGhpcy5wYXJlbnQpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ05vIHBhcmVudCB0byBpbmplY3QgdGhpcyBmb3JtIGludG8gd2FzIGZvdW5kLicpO1xuXHRcdH1cblx0XHRpZiAoIWlzVmFsdWVTZXQodGhpcy5zdWJGb3JtRGlyZWN0aXZlKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdTdWJmb3JtIGRpcmVjdGl2ZSBub3QgZm91bmQuJyk7XG5cdFx0fVxuXHRcdHRoaXMuYXR0YWNoQXNTdWJGb3JtKCk7XG5cdH1cblxuXHRwcml2YXRlIGF0dGFjaEFzU3ViRm9ybSgpOiB2b2lkIHtcblx0XHRjb25zdCBpbmplY3RJbnRvID0gdGhpcy5zdWJGb3JtRGlyZWN0aXZlLmluamVjdEludG87XG5cdFx0Y29uc3QgaW5qZWN0QXQgPSB0aGlzLnN1YkZvcm1EaXJlY3RpdmUuYXQ7XG5cdFx0Y29uc3QgYWxsb3dJbmplY3Rpb25Ub092ZXJ3cml0ZSA9IHRoaXMuc3ViRm9ybURpcmVjdGl2ZS5hbGxvd0luamVjdGlvblRvT3ZlcndyaXRlO1xuXHRcdGlmIChpbmplY3RJbnRvIGluc3RhbmNlb2YgVW50eXBlZEZvcm1BcnJheSkge1xuXHRcdFx0aWYgKCFhbGxvd0luamVjdGlvblRvT3ZlcndyaXRlKSB7XG5cdFx0XHRcdGlmIChpbmplY3RJbnRvLmF0KGluamVjdEF0IGFzIG51bWJlcikgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgaW5qZWN0SW50by5hdChpbmplY3RBdCBhcyBudW1iZXIpIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBUaGVyZSBhbHJlYWR5IGlzIGEgc3ViZm9ybSBpbmplY3RlZCBhdCAke2luamVjdEF0fS4gTWFrZSBzdXJlIHRoaXMgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIGZvcm1Hcm91cCBvciBmb3JtQXJyYXkgYWxyZWFkeSBhdHRhY2hlZCB3aGVuIGxpbmtpbmcgaXQgdG8gYSBzdWJGb3JtLmApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAodHlwZW9mIGluamVjdEF0ICE9PSAnbnVtYmVyJykge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYGNhbm5vdCBpbmRleCBGb3JtQXJyYXkgd2l0aCAke3R5cGVvZiBpbmplY3RBdH1gKTtcblx0XHRcdH1cblx0XHRcdGlmIChpbmplY3RJbnRvLmF0KGluamVjdEF0KT8uZGlzYWJsZWQpIHtcblx0XHRcdFx0dGhpcy50b3BMZXZlbEZvcm1Db250cm9sLmRpc2FibGUoKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHNvdXJjZSA9IGluamVjdEludG8uYXQoaW5qZWN0QXQpO1xuXHRcdFx0Y29uc3QgdmFsdWVCZWZvcmVJbmplY3QgPSBzb3VyY2U/LnZhbHVlO1xuXHRcdFx0aWYgKGlzVmFsdWVTZXQodmFsdWVCZWZvcmVJbmplY3QpKSB7XG5cdFx0XHRcdHRoaXMudG9wTGV2ZWxGb3JtQ29udHJvbC5wYXRjaFZhbHVlKHZhbHVlQmVmb3JlSW5qZWN0KTtcblx0XHRcdH1cblx0XHRcdGluamVjdEludG8uc2V0Q29udHJvbChpbmplY3RBdCwgdGhpcy50b3BMZXZlbEZvcm1Db250cm9sKTtcblx0XHRcdHRoaXMub25JbmplY3RlZC5lbWl0KHZhbHVlQmVmb3JlSW5qZWN0KTtcblx0XHR9IGVsc2UgaWYgKGluamVjdEludG8gaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUdyb3VwKSB7XG5cdFx0XHRpZiAoIWFsbG93SW5qZWN0aW9uVG9PdmVyd3JpdGUpIHtcblx0XHRcdFx0aWYgKGluamVjdEludG8uZ2V0KGluamVjdEF0IGFzIHN0cmluZykgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgaW5qZWN0SW50by5nZXQoaW5qZWN0QXQgYXMgc3RyaW5nKSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgVGhlcmUgYWxyZWFkeSBpcyBhIHN1YmZvcm0gaW5qZWN0ZWQgYXQgJHtpbmplY3RBdH0uIE1ha2Ugc3VyZSB0aGlzIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSBmb3JtR3JvdXAgb3IgZm9ybUFycmF5IGFscmVhZHkgYXR0YWNoZWQgd2hlbiBsaW5raW5nIGl0IHRvIGEgc3ViRm9ybS5gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKHR5cGVvZiBpbmplY3RBdCAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBjYW5ub3QgaW5kZXggRm9ybUdyb3VwIHdpdGggJHt0eXBlb2YgaW5qZWN0QXR9YCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaW5qZWN0SW50by5nZXQoaW5qZWN0QXQpPy5kaXNhYmxlZCkge1xuXHRcdFx0XHR0aGlzLnRvcExldmVsRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgc291cmNlID0gaW5qZWN0SW50by5nZXQoaW5qZWN0QXQpO1xuXHRcdFx0Y29uc3QgdmFsdWVCZWZvcmVJbmplY3QgPSBzb3VyY2U/LnZhbHVlO1xuXHRcdFx0aWYgKGlzVmFsdWVTZXQodmFsdWVCZWZvcmVJbmplY3QpKSB7XG5cdFx0XHRcdHRoaXMudG9wTGV2ZWxGb3JtQ29udHJvbC5wYXRjaFZhbHVlKHZhbHVlQmVmb3JlSW5qZWN0KTtcblx0XHRcdH1cblx0XHRcdGluamVjdEludG8uc2V0Q29udHJvbChpbmplY3RBdCwgdGhpcy50b3BMZXZlbEZvcm1Db250cm9sKTtcblx0XHRcdHRoaXMub25JbmplY3RlZC5lbWl0KHZhbHVlQmVmb3JlSW5qZWN0KTtcblx0XHR9XG5cdH1cblxuXHRuZ09uQ2hhbmdlcyhzaW1wbGVDaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG5cdFx0aWYgKHNpbXBsZUNoYW5nZXMucmVhZE9ubHk/LmN1cnJlbnRWYWx1ZSA9PT0gdHJ1ZSkge1xuXHRcdFx0dGhpcy5hY3RpdmVDb250cm9scy5mb3JFYWNoKGUgPT4gZS5mb3JtQ29udHJvbC5kaXNhYmxlKCkpO1xuXHRcdH1cblx0XHRpZiAoaXNWYWx1ZVNldChzaW1wbGVDaGFuZ2VzLndhcm5pbmdzPy5jdXJyZW50VmFsdWUpKSB7XG5cdFx0XHR0aGlzLnBhdGNoRm9ybVdhcm5pbmdzTWFwKCk7XG5cdFx0fVxuXHRcdGlmIChpc1ZhbHVlU2V0KHNpbXBsZUNoYW5nZXMuZXJyb3JzPy5jdXJyZW50VmFsdWUpKSB7XG5cdFx0XHR0aGlzLnBhdGNoRm9ybUVycm9yc01hcCgpO1xuXHRcdH1cblx0fVxuXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xuXHRcdGlmIChpc1ZhbHVlU2V0KHRoaXMucGFyZW50KSAmJiBpc1ZhbHVlU2V0KHRoaXMuc3ViRm9ybURpcmVjdGl2ZSkpIHtcblx0XHRcdGNvbnN0IGluamVjdEludG8gPSB0aGlzLnN1YkZvcm1EaXJlY3RpdmUuaW5qZWN0SW50bztcblx0XHRcdGNvbnN0IGluamVjdEF0ID0gdGhpcy5zdWJGb3JtRGlyZWN0aXZlLmF0O1xuXHRcdFx0aWYgKGluamVjdEludG8gaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUFycmF5KSB7XG5cdFx0XHRcdGNvbnN0IGlkeCA9IGluamVjdEludG8uY29udHJvbHMuZmluZEluZGV4KGUgPT4gZSA9PT0gdGhpcy50b3BMZXZlbEZvcm1Db250cm9sKTtcblx0XHRcdFx0aW5qZWN0SW50by5yZW1vdmVBdChpZHgpO1xuXHRcdFx0fSBlbHNlIGlmIChpbmplY3RJbnRvIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkge1xuXHRcdFx0XHRpZiAodHlwZW9mIGluamVjdEF0ICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihgY2Fubm90IGluZGV4IEZvcm1Hcm91cCB3aXRoICR7dHlwZW9mIGluamVjdEF0fWApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluamVjdEludG8uc2V0Q29udHJvbChpbmplY3RBdCwgbmV3IEZvcm1Db250cm9sKCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcGF0Y2hGb3JtV2FybmluZ3NNYXAoKTogdm9pZCB7XG5cdFx0Y29uc3Qgc2V0Rm4gPSB0aGlzLndhcm5pbmdzLnNldDtcblx0XHR0aGlzLndhcm5pbmdzLnNldCA9IChrZXk6IEFic3RyYWN0Q29udHJvbCwgdmFsdWU6IHN0cmluZyk6IE1hcDxBYnN0cmFjdENvbnRyb2wsIHN0cmluZz4gPT4ge1xuXHRcdFx0Y29uc3QgcHJldlZhbCA9IHRoaXMud2FybmluZ3MuZ2V0KGtleSk7XG5cdFx0XHRjb25zdCByZXN1bHQgPSBzZXRGbi5jYWxsKHRoaXMud2FybmluZ3MsIGtleSwgdmFsdWUpO1xuXHRcdFx0aWYgKHByZXZWYWwgIT09IHZhbHVlKSB7XG5cdFx0XHRcdHRoaXMuZ2V0Rm9ybUVsZW1lbnRCeUZvcm1Db250cm9sKGtleSk/LmRldGVybWluZVBvcHVwU3RhdGUoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fTtcblxuXHRcdGNvbnN0IGRlbGV0ZUZuID0gdGhpcy53YXJuaW5ncy5kZWxldGU7XG5cdFx0dGhpcy53YXJuaW5ncy5kZWxldGUgPSAoa2V5OiBBYnN0cmFjdENvbnRyb2wpOiBib29sZWFuID0+IHtcblx0XHRcdGNvbnN0IHJlc3VsdCA9IGRlbGV0ZUZuLmNhbGwodGhpcy53YXJuaW5ncywga2V5KTtcblx0XHRcdHRoaXMuZ2V0Rm9ybUVsZW1lbnRCeUZvcm1Db250cm9sKGtleSk/LmRldGVybWluZVBvcHVwU3RhdGUoKTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgcGF0Y2hGb3JtRXJyb3JzTWFwKCk6IHZvaWQge1xuXHRcdGNvbnN0IHNldEZuID0gdGhpcy5lcnJvcnMuc2V0O1xuXHRcdHRoaXMuZXJyb3JzLnNldCA9IChrZXk6IEFic3RyYWN0Q29udHJvbCwgdmFsdWU6IHN0cmluZyk6IE1hcDxBYnN0cmFjdENvbnRyb2wsIHN0cmluZz4gPT4ge1xuXHRcdFx0Y29uc3QgcHJldlZhbCA9IHRoaXMuZXJyb3JzLmdldChrZXkpO1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gc2V0Rm4uY2FsbCh0aGlzLmVycm9ycywga2V5LCB2YWx1ZSk7XG5cdFx0XHRrZXkuc2V0RXJyb3JzKHsgLi4ua2V5LmVycm9ycywgZm9ybUxldmVsOiB2YWx1ZX0pO1xuXHRcdFx0aWYgKHByZXZWYWwgIT09IHZhbHVlKSB7XG5cdFx0XHRcdHRoaXMuZ2V0Rm9ybUVsZW1lbnRCeUZvcm1Db250cm9sKGtleSk/LmRldGVybWluZVBvcHVwU3RhdGUoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fTtcblxuXHRcdGNvbnN0IGRlbGV0ZUZuID0gdGhpcy5lcnJvcnMuZGVsZXRlO1xuXHRcdHRoaXMuZXJyb3JzLmRlbGV0ZSA9IChrZXk6IEFic3RyYWN0Q29udHJvbCk6IGJvb2xlYW4gPT4ge1xuXHRcdFx0Y29uc3QgbmV3RXJyb3JzT2JqZWN0ID0ga2V5LmVycm9ycztcblx0XHRcdGRlbGV0ZSBuZXdFcnJvcnNPYmplY3QuZm9ybUxldmVsO1xuXHRcdFx0a2V5LnNldEVycm9ycyhuZXdFcnJvcnNPYmplY3QpO1xuXHRcdFx0Y29uc3QgcmVzdWx0ID0gZGVsZXRlRm4uY2FsbCh0aGlzLmVycm9ycywga2V5KTtcblx0XHRcdHRoaXMuZ2V0Rm9ybUVsZW1lbnRCeUZvcm1Db250cm9sKGtleSk/LmRldGVybWluZVBvcHVwU3RhdGUoKTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgYWRkU3VwcG9ydEZvclBhdGNoVmFsdWVJbnRlcmNlcHRvcigpOiB2b2lkIHtcblx0XHRjb25zdCBmbiA9IHRoaXMudG9wTGV2ZWxGb3JtQ29udHJvbC5wYXRjaFZhbHVlO1xuXHRcdGNvbnN0IG5ld0ZuID0gKFxuXHRcdFx0dmFsdWU6IHtcblx0XHRcdFx0W2tleTogc3RyaW5nXTogYW55O1xuXHRcdFx0fSxcblx0XHRcdG9wdGlvbnM/OiB7XG5cdFx0XHRcdG9ubHlTZWxmPzogYm9vbGVhbjtcblx0XHRcdFx0ZW1pdEV2ZW50PzogYm9vbGVhbjtcblx0XHRcdH1cblx0XHQpOiB2b2lkID0+IHtcblx0XHRcdHRoaXMucGF0Y2hWYWx1ZUludGVyY2VwdG9yKHZhbHVlKS50aGVuKCh2YWwpID0+IHtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdFx0Zm4uY2FsbCh0aGlzLnRvcExldmVsRm9ybUNvbnRyb2wsIHZhbCwgb3B0aW9ucyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHR0aGlzLnRvcExldmVsRm9ybUNvbnRyb2wucGF0Y2hWYWx1ZSA9IG5ld0ZuO1xuXHR9XG5cblx0cHVibGljIHJlZ2lzdGVyQ29udHJvbChmb3JtQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sLCBmb3JtRWxlbWVudDogRm9ybUVsZW1lbnRDb21wb25lbnQpOiAoKSA9PiBhbnkge1xuXHRcdHRoaXMuYWN0aXZlQ29udHJvbHMucHVzaCh7Zm9ybUNvbnRyb2wsIGZvcm1FbGVtZW50fSk7XG5cdFx0bGV0IHBhcmVudEltbXV0YWJsZVZhbHVlRm46ICgpID0+IGFueTtcblx0XHRpZiAodGhpcy5wYXJlbnQpIHtcblx0XHRcdHBhcmVudEltbXV0YWJsZVZhbHVlRm4gPSB0aGlzLnBhcmVudC5yZWdpc3RlckNvbnRyb2woZm9ybUNvbnRyb2wsIGZvcm1FbGVtZW50KTtcblx0XHR9XG5cdFx0aWYgKHRoaXMucmVhZE9ubHkpIHtcblx0XHRcdGZvcm1Db250cm9sLmRpc2FibGUoKTtcblx0XHR9XG5cblx0XHRjb25zdCBlbmFibGVGbjogKG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSA9PiB2b2lkID0gZm9ybUNvbnRyb2wuZW5hYmxlO1xuXHRcdGZvcm1Db250cm9sLmVuYWJsZSA9IChvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSkgPT4ge1xuXHRcdFx0aWYgKCF0aGlzLnJlYWRPbmx5KSB7XG5cdFx0XHRcdGVuYWJsZUZuLmNhbGwoZm9ybUNvbnRyb2wsIG9wdHMpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCBnZXRJbW11dGFibGVWYWx1ZUZuID0gKCk6IGFueSA9PiB7XG5cdFx0XHRjb25zdCBwYXRoID0gdGhpcy5nZXRQYXRoRnJvbVBhcmVudFRvQ29udHJvbChmb3JtQ29udHJvbCk7XG5cdFx0XHRjb25zdCBpbW11dGFibGVWYWx1ZSA9IHRoaXMuZ2V0SW1tdXRhYmxlVmFsdWVGcm9tUGF0aChwYXRoKTtcblx0XHRcdGNvbnN0IGltbXV0YWJsZVZhbHVlRnJvbVBhcmVudCA9IHBhcmVudEltbXV0YWJsZVZhbHVlRm4/LigpO1xuXHRcdFx0cmV0dXJuIGNsb25lRGVlcChpbW11dGFibGVWYWx1ZSAhPT0gdW5kZWZpbmVkICA/ICBpbW11dGFibGVWYWx1ZSA6IGltbXV0YWJsZVZhbHVlRnJvbVBhcmVudCk7XG5cdFx0fTtcblxuXHRcdGNvbnN0IHNldFZhbHVlRm46ICh2YWx1ZTogdW5rbm93biwgb3B0aW9ucz86IHtcblx0XHRcdG9ubHlTZWxmPzogYm9vbGVhbjtcblx0XHRcdGVtaXRFdmVudD86IGJvb2xlYW47XG5cdFx0XHRlbWl0TW9kZWxUb1ZpZXdDaGFuZ2U/OiBib29sZWFuO1xuXHRcdFx0ZW1pdFZpZXdUb01vZGVsQ2hhbmdlPzogYm9vbGVhbjtcblx0XHR9KSA9PiB2b2lkID0gZm9ybUNvbnRyb2wuc2V0VmFsdWU7XG5cdFx0Zm9ybUNvbnRyb2wuc2V0VmFsdWUgPSAodmFsdWU6IHVua25vd24sIG9wdGlvbnM/OiB7XG5cdFx0XHRvbmx5U2VsZj86IGJvb2xlYW47XG5cdFx0XHRlbWl0RXZlbnQ/OiBib29sZWFuO1xuXHRcdFx0ZW1pdE1vZGVsVG9WaWV3Q2hhbmdlPzogYm9vbGVhbjtcblx0XHRcdGVtaXRWaWV3VG9Nb2RlbENoYW5nZT86IGJvb2xlYW47XG5cdFx0fSkgPT4ge1xuXHRcdFx0Y29uc3QgaW1tdXRhYmxlVmFsdWUgPSBnZXRJbW11dGFibGVWYWx1ZUZuKCk7XG5cdFx0XHRpZiAoaW1tdXRhYmxlVmFsdWUgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zPy5lbWl0TW9kZWxUb1ZpZXdDaGFuZ2UgIT09IHRydWUpIHtcblx0XHRcdFx0aWYgKCFpc1ZhbHVlU2V0KG9wdGlvbnMpKSB7XG5cdFx0XHRcdFx0b3B0aW9ucyA9IHt9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdG9wdGlvbnMuZW1pdE1vZGVsVG9WaWV3Q2hhbmdlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHNldFZhbHVlRm4uY2FsbChmb3JtQ29udHJvbCwgaW1tdXRhYmxlVmFsdWUgIT09IHVuZGVmaW5lZCA/IGltbXV0YWJsZVZhbHVlIDogdmFsdWUsIG9wdGlvbnMpO1xuXHRcdH07XG5cblx0XHRjb25zdCBpbW11dGFibGVWYWx1ZSA9IGdldEltbXV0YWJsZVZhbHVlRm4oKTtcblx0XHRpZiAoaW1tdXRhYmxlVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Zm9ybUNvbnRyb2wuc2V0VmFsdWUoaW1tdXRhYmxlVmFsdWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBnZXRJbW11dGFibGVWYWx1ZUZuO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRQYXRoRnJvbVBhcmVudFRvQ29udHJvbChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBBcnJheTxzdHJpbmc+IHtcblx0XHRjb25zdCBwYXRoID0gW107XG5cdFx0bGV0IGN1cnJlbnRDb250cm9sID0gY29udHJvbDtcblx0XHR3aGlsZSAoY3VycmVudENvbnRyb2wucGFyZW50KSB7XG5cdFx0XHRjb25zdCBwYXJlbnQgPSBjdXJyZW50Q29udHJvbC5wYXJlbnQ7XG5cdFx0XHRpZiAocGFyZW50IGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG5cdFx0XHRcdGNvbnN0IGtleSA9IE9iamVjdC5lbnRyaWVzKHBhcmVudC5jb250cm9scykuZmluZCgoW2tleSwgdmFsdWVdKSA9PiB2YWx1ZSA9PT0gY3VycmVudENvbnRyb2wpWzBdO1xuXHRcdFx0XHRwYXRoLnB1c2goa2V5KTtcblx0XHRcdH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG5cdFx0XHRcdGNvbnN0IGlkeCA9IHBhcmVudC5jb250cm9scy5maW5kSW5kZXgoZSA9PiBlID09PSBjdXJyZW50Q29udHJvbCk7XG5cdFx0XHRcdHBhdGgucHVzaChpZHgpO1xuXHRcdFx0fVxuXHRcdFx0Y3VycmVudENvbnRyb2wgPSBwYXJlbnQ7XG5cdFx0fVxuXHRcdHJldHVybiBwYXRoLnJldmVyc2UoKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0SW1tdXRhYmxlVmFsdWVGcm9tUGF0aChwYXRoOiBBcnJheTxzdHJpbmc+KTogYW55IHtcblx0XHRsZXQgY3VycmVudCA9IHRoaXMuaW1tdXRhYmxlVmFsdWVzO1xuXHRcdGZvciAoY29uc3Qga2V5IG9mIHBhdGgpIHtcblx0XHRcdGlmICghaXNWYWx1ZVNldChjdXJyZW50Py5ba2V5XSkpIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblx0XHRcdGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG5cdFx0fVxuXHRcdHJldHVybiBjdXJyZW50O1xuXHR9XG5cblx0cHVibGljIHVucmVnaXN0ZXJDb250cm9sKGZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wpOiB2b2lkIHtcblx0XHR0aGlzLmFjdGl2ZUNvbnRyb2xzID0gdGhpcy5hY3RpdmVDb250cm9scy5maWx0ZXIoKGUpID0+IGUuZm9ybUNvbnRyb2wgIT09IGZvcm1Db250cm9sKTtcblx0XHRpZiAodGhpcy5wYXJlbnQpIHtcblx0XHRcdHRoaXMucGFyZW50LnVucmVnaXN0ZXJDb250cm9sKGZvcm1Db250cm9sKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFkZEZvcm1Hcm91cENvbnRyb2xzKGZvcm1Hcm91cDogVW50eXBlZEZvcm1Hcm91cCwgcmVzdWx0OiBBcnJheTxVbnR5cGVkRm9ybUNvbnRyb2w+KTogdm9pZCB7XG5cdFx0T2JqZWN0LnZhbHVlcyhmb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goKHZhbHVlKSA9PiB7XG5cdFx0XHRpZiAodmFsdWUgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUdyb3VwKSB7XG5cdFx0XHRcdHRoaXMuYWRkRm9ybUdyb3VwQ29udHJvbHModmFsdWUsIHJlc3VsdCk7XG5cdFx0XHR9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVW50eXBlZEZvcm1BcnJheSkge1xuXHRcdFx0XHR0aGlzLmFkZEZvcm1BcnJheUNvbnRyb2xzKHZhbHVlLCByZXN1bHQpO1xuXHRcdFx0fSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVudHlwZWRGb3JtQ29udHJvbCkge1xuXHRcdFx0XHR0aGlzLmFkZEZvcm1Db250cm9sKHZhbHVlLCByZXN1bHQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBhZGRGb3JtQXJyYXlDb250cm9scyhmb3JtQXJyYXk6IFVudHlwZWRGb3JtQXJyYXksIHJlc3VsdDogQXJyYXk8VW50eXBlZEZvcm1Db250cm9sPik6IHZvaWQge1xuXHRcdGZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuXHRcdFx0aWYgKHZhbHVlIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkge1xuXHRcdFx0XHR0aGlzLmFkZEZvcm1Hcm91cENvbnRyb2xzKHZhbHVlLCByZXN1bHQpO1xuXHRcdFx0fSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVudHlwZWRGb3JtQXJyYXkpIHtcblx0XHRcdFx0dGhpcy5hZGRGb3JtQXJyYXlDb250cm9scyh2YWx1ZSwgcmVzdWx0KTtcblx0XHRcdH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUNvbnRyb2wpIHtcblx0XHRcdFx0dGhpcy5hZGRGb3JtQ29udHJvbCh2YWx1ZSwgcmVzdWx0KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0QWxsRm9ybUNvbnRyb2xzKCk6IEFycmF5PFVudHlwZWRGb3JtQ29udHJvbD4ge1xuXHRcdGNvbnN0IHJlc3VsdCA9IFtdO1xuXHRcdGlmICh0aGlzLnRvcExldmVsRm9ybUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcblx0XHRcdHRoaXMuYWRkRm9ybUdyb3VwQ29udHJvbHModGhpcy50b3BMZXZlbEZvcm1Db250cm9sLCByZXN1bHQpO1xuXHRcdH0gZWxzZSBpZiAodGhpcy50b3BMZXZlbEZvcm1Db250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG5cdFx0XHR0aGlzLmFkZEZvcm1BcnJheUNvbnRyb2xzKHRoaXMudG9wTGV2ZWxGb3JtQ29udHJvbCwgcmVzdWx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByaXZhdGUgYWRkRm9ybUNvbnRyb2woY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sLCByZXN1bHQ6IEFycmF5PFVudHlwZWRGb3JtQ29udHJvbD4pOiB2b2lkIHtcblx0XHRyZXN1bHQucHVzaChjb250cm9sKTtcblx0fVxuXG5cdHByaXZhdGUgZGlzYWJsZUluYWN0aXZlRm9ybUNvbnRyb2woY29udHJvbDogVW50eXBlZEZvcm1Db250cm9sKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLmFjdGl2ZUNvbnRyb2xzLnNvbWUoKGUpID0+IGUuZm9ybUNvbnRyb2wgPT09IGNvbnRyb2wpKSB7XG5cdFx0XHRjb250cm9sLmRpc2FibGUoKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZ2V0Rm9ybUVsZW1lbnRCeUZvcm1Db250cm9sKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IEZvcm1FbGVtZW50Q29tcG9uZW50IHtcblx0XHRyZXR1cm4gdGhpcy5hY3RpdmVDb250cm9scy5maW5kKChlKSA9PiBlLmZvcm1Db250cm9sID09PSBjb250cm9sKT8uZm9ybUVsZW1lbnQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0V2FybmluZ1RvU2hvdyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+IHtcblx0XHRyZXR1cm4gdGhpcy53YXJuaW5ncy5nZXQoY29udHJvbCk7XG5cdH1cblxuXHRwdWJsaWMgdHJ5U3VibWl0KCk6IFByb21pc2U8YW55PiB7XG5cdFx0dGhpcy50b3BMZXZlbEZvcm1Db250cm9sLm1hcmtBbGxBc1RvdWNoZWQoKTtcblx0XHRjb25zdCBhbGxDb250cm9sczogQXJyYXk8VW50eXBlZEZvcm1Db250cm9sPiA9IHRoaXMuZ2V0QWxsRm9ybUNvbnRyb2xzKCk7XG5cdFx0Y29uc3Qgb3JpZ2luYWxEaXNhYmxlZFN0YXRlcyA9IGFsbENvbnRyb2xzLm1hcChlID0+IHtcblx0XHRcdHJldHVybiB7Y29udHJvbDogZSwgZGlzYWJsZWQ6IGUuZGlzYWJsZWR9O1xuXHRcdH0pO1xuXHRcdGFsbENvbnRyb2xzLmZvckVhY2goZSA9PiB0aGlzLmRpc2FibGVJbmFjdGl2ZUZvcm1Db250cm9sKGUpKTtcblx0XHRhbGxDb250cm9scy5mb3JFYWNoKGUgPT4gZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCkpO1xuXHRcdGNvbnN0IGZvcm1Hcm91cFZhbHVlID0gdGhpcy50b3BMZXZlbEZvcm1Db250cm9sLnZhbHVlO1xuXHRcdGlmICh0aGlzLnRvcExldmVsRm9ybUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcblx0XHRcdGNvbnN0IHJlbmRlcmVkQW5kRW5hYmxlZFZhbHVlcyA9IHRoaXMuZ2V0UmVuZGVyZWRGaWVsZFZhbHVlc0Zvcm1Hcm91cCh0aGlzLnRvcExldmVsRm9ybUNvbnRyb2wsIHRydWUpO1xuXHRcdFx0Y29uc3QgcmVuZGVyZWRCdXREaXNhYmxlZFZhbHVlcyA9IHRoaXMuZ2V0UmVuZGVyZWRGaWVsZFZhbHVlc0Zvcm1Hcm91cCh0aGlzLnRvcExldmVsRm9ybUNvbnRyb2wsIGZhbHNlKTtcblxuXHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMudG9wTGV2ZWxGb3JtQ29udHJvbC5wZW5kaW5nKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc3ViID0gdGhpcy50b3BMZXZlbEZvcm1Db250cm9sLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKChyZXMpID0+IHtcblx0XHRcdFx0XHRcdGlmIChyZXMgIT09ICdQRU5ESU5HJykge1xuXHRcdFx0XHRcdFx0XHRzdWIudW5zdWJzY3JpYmUoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5oYW5kbGVTdWJtaXNzaW9uKG9yaWdpbmFsRGlzYWJsZWRTdGF0ZXMsIHJlbmRlcmVkQW5kRW5hYmxlZFZhbHVlcywgcmVuZGVyZWRCdXREaXNhYmxlZFZhbHVlcywgZm9ybUdyb3VwVmFsdWUpXG5cdFx0XHRcdFx0XHRcdC50aGVuKHJlc29sdmUpXG5cdFx0XHRcdFx0XHRcdC5jYXRjaChyZWplY3QpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuaGFuZGxlU3VibWlzc2lvbihvcmlnaW5hbERpc2FibGVkU3RhdGVzLCByZW5kZXJlZEFuZEVuYWJsZWRWYWx1ZXMsIHJlbmRlcmVkQnV0RGlzYWJsZWRWYWx1ZXMsIGZvcm1Hcm91cFZhbHVlKVxuXHRcdFx0XHRcdC50aGVuKHJlc29sdmUpXG5cdFx0XHRcdFx0LmNhdGNoKHJlamVjdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1N1Ym1pdHRpbmcgYSBGb3JtQXJyYXkgYXMgdG9wTGV2ZWwgbm90IHN1cHBvcnRlZCAoeWV0KS4gV3JhcCBpdCBpbiBhIEZvcm1Hcm91cC4nKTtcblx0fVxuXG5cdHByaXZhdGUgaGFuZGxlU3VibWlzc2lvbihcblx0XHRvcmlnaW5hbERpc2FibGVkU3RhdGVzOiBBcnJheTx7IGNvbnRyb2w6IEZvcm1Db250cm9sPGFueT47IGRpc2FibGVkOiBib29sZWFuIH0+LFxuXHRcdHJlbmRlcmVkQW5kRW5hYmxlZFZhbHVlczogUmVjb3JkPGFueSwgYW55Pixcblx0XHRyZW5kZXJlZEJ1dERpc2FibGVkVmFsdWVzOiBSZWNvcmQ8YW55LCBhbnk+LFxuXHRcdGZvcm1Hcm91cFZhbHVlKTogUHJvbWlzZTxhbnk+XG5cdHtcblx0XHRpZiAodGhpcy50b3BMZXZlbEZvcm1Db250cm9sLmludmFsaWQpIHtcblx0XHRcdHRoaXMuYWN0aXZlQ29udHJvbHMuZmluZCgoZSkgPT4gZS5mb3JtQ29udHJvbC5pbnZhbGlkKT8uZm9ybUVsZW1lbnQ/LnNjcm9sbFRvKCk7XG5cdFx0XHR0aGlzLnNldERpc2FibGVkU3RhdGVzRm9yQWxsQ29udHJvbHMob3JpZ2luYWxEaXNhYmxlZFN0YXRlcyk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QoaW52YWxpZEZpZWxkc1N5bWJvbCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc2V0RGlzYWJsZWRTdGF0ZXNGb3JBbGxDb250cm9scyhvcmlnaW5hbERpc2FibGVkU3RhdGVzKTtcblx0XHRcdGNvbnN0IHJlbmRlcmVkVmFsdWVzID0gZGVlcE1lcmdlKHJlbmRlcmVkQW5kRW5hYmxlZFZhbHVlcywgcmVuZGVyZWRCdXREaXNhYmxlZFZhbHVlcyk7XG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtmb3JtR3JvdXBWYWx1ZSwgcmVuZGVyZWRWYWx1ZXNdKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldFJlbmRlcmVkRmllbGRWYWx1ZXNGb3JtR3JvdXAoZm9ybUdyb3VwOiBGb3JtR3JvdXAsIGVuYWJsZWQ6IGJvb2xlYW4sIHZhbHVlT2JqZWN0ID0ge30pOiBvYmplY3Qge1xuXHRcdE9iamVjdC5lbnRyaWVzKGZvcm1Hcm91cC5jb250cm9scykuZm9yRWFjaCgoW25hbWUsIGNvbnRyb2xdKSA9PiB7XG5cdFx0XHRpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sICYmIGNvbnRyb2wuZW5hYmxlZCA9PT0gZW5hYmxlZCAmJiB0aGlzLmFjdGl2ZUNvbnRyb2xzLnNvbWUoZSA9PiBlLmZvcm1Db250cm9sID09PSBjb250cm9sKSkge1xuXHRcdFx0XHR2YWx1ZU9iamVjdFtuYW1lXSA9IGNvbnRyb2wudmFsdWU7XG5cdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcblx0XHRcdFx0dmFsdWVPYmplY3RbbmFtZV0gPSBbXTtcblx0XHRcdFx0dGhpcy5nZXRSZW5kZXJlZEZpZWxkVmFsdWVzRm9ybUFycmF5KGNvbnRyb2wsIGVuYWJsZWQsIHZhbHVlT2JqZWN0W25hbWVdKTtcblx0XHRcdH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuXHRcdFx0XHR2YWx1ZU9iamVjdFtuYW1lXSA9IHt9O1xuXHRcdFx0XHR0aGlzLmdldFJlbmRlcmVkRmllbGRWYWx1ZXNGb3JtR3JvdXAoY29udHJvbCwgZW5hYmxlZCwgdmFsdWVPYmplY3RbbmFtZV0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHJldHVybiB2YWx1ZU9iamVjdDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0UmVuZGVyZWRGaWVsZFZhbHVlc0Zvcm1BcnJheShmb3JtQXJyYXk6IEZvcm1BcnJheSwgZW5hYmxlZDogYm9vbGVhbiwgdmFsdWVBcnJheTogQXJyYXk8YW55Pik6IHZvaWQge1xuXHRcdGZvcm1BcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcblx0XHRcdGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wgJiYgY29udHJvbC5lbmFibGVkID09PSBlbmFibGVkICYmIHRoaXMuYWN0aXZlQ29udHJvbHMuc29tZShlID0+IGUuZm9ybUNvbnRyb2wgPT09IGNvbnRyb2wpKSB7XG5cdFx0XHRcdHZhbHVlQXJyYXkucHVzaChjb250cm9sLnZhbHVlKTtcblx0XHRcdH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuXHRcdFx0XHRjb25zdCBuZXdBcnJheSA9IFtdO1xuXHRcdFx0XHR2YWx1ZUFycmF5LnB1c2gobmV3QXJyYXkpO1xuXHRcdFx0XHR0aGlzLmdldFJlbmRlcmVkRmllbGRWYWx1ZXNGb3JtQXJyYXkoY29udHJvbCwgZW5hYmxlZCwgbmV3QXJyYXkpO1xuXHRcdFx0fSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG5cdFx0XHRcdGNvbnN0IG5ld09iamVjdCA9IHt9O1xuXHRcdFx0XHR2YWx1ZUFycmF5LnB1c2gobmV3T2JqZWN0KTtcblx0XHRcdFx0dGhpcy5nZXRSZW5kZXJlZEZpZWxkVmFsdWVzRm9ybUdyb3VwKGNvbnRyb2wsIGVuYWJsZWQsIG5ld09iamVjdCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgX2V4dF9nZXRSZW5kZXJlZEZpZWxkVmFsdWVzKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuXHRcdGlmICh0aGlzLnRvcExldmVsRm9ybUNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcblx0XHRcdGNvbnN0IHJlbmRlcmVkQW5kRW5hYmxlZFZhbHVlcyA9IHRoaXMuZ2V0UmVuZGVyZWRGaWVsZFZhbHVlc0Zvcm1Hcm91cCh0aGlzLnRvcExldmVsRm9ybUNvbnRyb2wsIHRydWUpO1xuXHRcdFx0Y29uc3QgcmVuZGVyZWRCdXREaXNhYmxlZFZhbHVlcyA9IHRoaXMuZ2V0UmVuZGVyZWRGaWVsZFZhbHVlc0Zvcm1Hcm91cCh0aGlzLnRvcExldmVsRm9ybUNvbnRyb2wsIGZhbHNlKTtcblx0XHRcdGNvbnN0IGFsbFJlbmRlcmVkVmFsdWVzID0gZGVlcE1lcmdlKHJlbmRlcmVkQW5kRW5hYmxlZFZhbHVlcywgcmVuZGVyZWRCdXREaXNhYmxlZFZhbHVlcyk7XG5cdFx0XHRyZXR1cm4gYWxsUmVuZGVyZWRWYWx1ZXM7XG5cdFx0fVxuXHRcdHRocm93IG5ldyBFcnJvcignR2V0dGluZyB2YWx1ZXMgZnJvbSBhIEZvcm1BcnJheSBhcyB0b3BMZXZlbCBpcyBub3Qgc3VwcG9ydGVkICh5ZXQpLicpO1xuXHR9XG5cblx0cHJpdmF0ZSBzZXREaXNhYmxlZFN0YXRlc0ZvckFsbENvbnRyb2xzKG9yaWdpbmFsRGlzYWJsZWRTdGF0ZXM6IEFycmF5PHsgY29udHJvbDogQWJzdHJhY3RDb250cm9sOyBkaXNhYmxlZDogYm9vbGVhbiB9Pik6IHZvaWQge1xuXHRcdG9yaWdpbmFsRGlzYWJsZWRTdGF0ZXMuZm9yRWFjaCgoZSkgPT4ge1xuXHRcdFx0aWYgKGUuZGlzYWJsZWQpIHtcblx0XHRcdFx0ZS5jb250cm9sLmRpc2FibGUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGUuY29udHJvbC5lbmFibGUoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxufVxuIiwiPGZvcm0+XG5cdDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZm9ybT5cblxuXG4iXX0=
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
// material.module.ts
|
|
2
|
-
import { NgModule } from '@angular/core';
|
|
3
|
-
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
4
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
5
|
-
import { MatNativeDateModule } from '@angular/material/core';
|
|
6
|
-
import { MatInputModule } from '@angular/material/input';
|
|
7
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
export class MaterialModule {
|
|
10
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MaterialModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
11
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.0", ngImport: i0, type: MaterialModule, imports: [MatDatepickerModule, MatFormFieldModule, MatNativeDateModule, MatInputModule, MatButtonModule], exports: [MatDatepickerModule, MatFormFieldModule, MatNativeDateModule, MatInputModule, MatButtonModule] }); }
|
|
12
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MaterialModule, providers: [MatDatepickerModule], imports: [MatDatepickerModule, MatFormFieldModule, MatNativeDateModule, MatInputModule, MatButtonModule, MatDatepickerModule, MatFormFieldModule, MatNativeDateModule, MatInputModule, MatButtonModule] }); }
|
|
13
|
-
}
|
|
14
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: MaterialModule, decorators: [{
|
|
15
|
-
type: NgModule,
|
|
16
|
-
args: [{
|
|
17
|
-
imports: [MatDatepickerModule, MatFormFieldModule, MatNativeDateModule, MatInputModule, MatButtonModule],
|
|
18
|
-
exports: [MatDatepickerModule, MatFormFieldModule, MatNativeDateModule, MatInputModule, MatButtonModule],
|
|
19
|
-
providers: [MatDatepickerModule],
|
|
20
|
-
}]
|
|
21
|
-
}] });
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2xpcHBhL25neC1lbmhhbmN5LWZvcm1zL3NyYy9saWIvbWF0ZXJpYWwubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFCQUFxQjtBQUVyQixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBTzNELE1BQU0sT0FBTyxjQUFjOzhHQUFkLGNBQWM7K0dBQWQsY0FBYyxZQUpoQixtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsZUFBZSxhQUM3RixtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsZUFBZTsrR0FHM0YsY0FBYyxhQUZmLENBQUMsbUJBQW1CLENBQUMsWUFGdEIsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFDN0YsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGVBQWU7OzJGQUczRixjQUFjO2tCQUwxQixRQUFRO21CQUFDO29CQUNULE9BQU8sRUFBRSxDQUFDLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxlQUFlLENBQUM7b0JBQ3hHLE9BQU8sRUFBRSxDQUFDLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxlQUFlLENBQUM7b0JBQ3hHLFNBQVMsRUFBRSxDQUFDLG1CQUFtQixDQUFDO2lCQUNoQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIG1hdGVyaWFsLm1vZHVsZS50c1xuXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGF0ZXBpY2tlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXROYXRpdmVEYXRlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5cbkBOZ01vZHVsZSh7XG5cdGltcG9ydHM6IFtNYXREYXRlcGlja2VyTW9kdWxlLCBNYXRGb3JtRmllbGRNb2R1bGUsIE1hdE5hdGl2ZURhdGVNb2R1bGUsIE1hdElucHV0TW9kdWxlLCBNYXRCdXR0b25Nb2R1bGVdLFxuXHRleHBvcnRzOiBbTWF0RGF0ZXBpY2tlck1vZHVsZSwgTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXROYXRpdmVEYXRlTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlXSxcblx0cHJvdmlkZXJzOiBbTWF0RGF0ZXBpY2tlck1vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIE1hdGVyaWFsTW9kdWxlIHt9XG4iXX0=
|