@firestitch/form 9.7.7 → 12.0.2
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/app/components/form-dialog-actions/form-dialog-actions.component.d.ts +21 -18
- package/app/consts/error-messages.const.d.ts +19 -19
- package/app/directives/form/form.directive.d.ts +105 -102
- package/app/directives/form-dialog-close.directive.d.ts +12 -9
- package/app/directives/submit-button.directive.d.ts +31 -28
- package/app/directives/validators/compare.directive.d.ts +15 -12
- package/app/directives/validators/control.directive.d.ts +48 -45
- package/app/directives/validators/daterange.directive.d.ts +13 -10
- package/app/directives/validators/email.directive.d.ts +13 -10
- package/app/directives/validators/emails.directive.d.ts +13 -10
- package/app/directives/validators/function.directive.d.ts +14 -11
- package/app/directives/validators/greater.directive.d.ts +13 -10
- package/app/directives/validators/integer.directive.d.ts +13 -10
- package/app/directives/validators/lesser.directive.d.ts +13 -10
- package/app/directives/validators/max.directive.d.ts +13 -10
- package/app/directives/validators/maxlength.directive.d.ts +13 -10
- package/app/directives/validators/min.directive.d.ts +13 -10
- package/app/directives/validators/minlength.directive.d.ts +13 -10
- package/app/directives/validators/numeric.directive.d.ts +13 -10
- package/app/directives/validators/pattern.directive.d.ts +13 -10
- package/app/directives/validators/phone.directive.d.ts +13 -10
- package/app/directives/validators/required.directive.d.ts +16 -13
- package/app/directives/validators/url.directive.d.ts +14 -11
- package/app/directives/validators/validate.directive.d.ts +14 -11
- package/app/enums/confirm-result.d.ts +7 -7
- package/app/enums/form-status.d.ts +9 -9
- package/app/fs-form.module.d.ts +35 -4
- package/app/guards/form-deactivate.guard.d.ts +12 -9
- package/app/helpers/confirm-result-continue.d.ts +1 -1
- package/app/helpers/confirm-unsaved.d.ts +5 -5
- package/app/helpers/get-form-errors.d.ts +2 -2
- package/app/helpers/index.d.ts +2 -2
- package/app/helpers/is-enabled.d.ts +1 -1
- package/app/interfaces/async-validator.d.ts +14 -14
- package/app/interfaces/confirm-config.d.ts +7 -7
- package/app/interfaces/confirm-tab-group.d.ts +10 -10
- package/app/interfaces/form-deactivate.d.ts +4 -4
- package/app/interfaces/index.d.ts +4 -4
- package/app/interfaces/submit-event.d.ts +5 -5
- package/app/interfaces/submitted-event.d.ts +6 -6
- package/app/interfaces/validator.d.ts +13 -13
- package/app/providers/validate-messages.provider.d.ts +25 -25
- package/app/services/fsform.service.d.ts +10 -7
- package/app/validators/validators.d.ts +12 -12
- package/bundles/firestitch-form.umd.js +2588 -2459
- package/bundles/firestitch-form.umd.js.map +1 -1
- package/esm2015/app/components/form-dialog-actions/form-dialog-actions.component.js +86 -93
- package/esm2015/app/consts/error-messages.const.js +20 -20
- package/esm2015/app/directives/form/form.directive.js +619 -665
- package/esm2015/app/directives/form-dialog-close.directive.js +31 -33
- package/esm2015/app/directives/submit-button.directive.js +131 -138
- package/esm2015/app/directives/validators/compare.directive.js +49 -49
- package/esm2015/app/directives/validators/control.directive.js +257 -273
- package/esm2015/app/directives/validators/daterange.directive.js +41 -41
- package/esm2015/app/directives/validators/email.directive.js +41 -41
- package/esm2015/app/directives/validators/emails.directive.js +41 -41
- package/esm2015/app/directives/validators/function.directive.js +31 -31
- package/esm2015/app/directives/validators/greater.directive.js +40 -40
- package/esm2015/app/directives/validators/integer.directive.js +41 -41
- package/esm2015/app/directives/validators/lesser.directive.js +40 -40
- package/esm2015/app/directives/validators/max.directive.js +36 -36
- package/esm2015/app/directives/validators/maxlength.directive.js +35 -35
- package/esm2015/app/directives/validators/min.directive.js +36 -36
- package/esm2015/app/directives/validators/minlength.directive.js +35 -35
- package/esm2015/app/directives/validators/numeric.directive.js +41 -41
- package/esm2015/app/directives/validators/pattern.directive.js +35 -35
- package/esm2015/app/directives/validators/phone.directive.js +41 -41
- package/esm2015/app/directives/validators/required.directive.js +71 -73
- package/esm2015/app/directives/validators/url.directive.js +47 -49
- package/esm2015/app/directives/validators/validate.directive.js +33 -31
- package/esm2015/app/enums/confirm-result.js +9 -9
- package/esm2015/app/enums/form-status.js +11 -11
- package/esm2015/app/fs-form.module.js +165 -106
- package/esm2015/app/guards/form-deactivate.guard.js +40 -44
- package/esm2015/app/helpers/confirm-result-continue.js +5 -5
- package/esm2015/app/helpers/confirm-unsaved.js +70 -70
- package/esm2015/app/helpers/get-form-errors.js +25 -25
- package/esm2015/app/helpers/index.js +3 -3
- package/esm2015/app/helpers/is-enabled.js +4 -4
- package/esm2015/app/interfaces/async-validator.js +2 -1
- package/esm2015/app/interfaces/confirm-config.js +2 -1
- package/esm2015/app/interfaces/confirm-tab-group.js +2 -1
- package/esm2015/app/interfaces/form-deactivate.js +2 -1
- package/esm2015/app/interfaces/index.js +5 -1
- package/esm2015/app/interfaces/submit-event.js +2 -1
- package/esm2015/app/interfaces/submitted-event.js +2 -1
- package/esm2015/app/interfaces/validator.js +2 -1
- package/esm2015/app/providers/validate-messages.provider.js +11 -11
- package/esm2015/app/services/fsform.service.js +25 -26
- package/esm2015/app/validators/validators.js +97 -97
- package/esm2015/firestitch-form.js +5 -27
- package/esm2015/public_api.js +35 -14
- package/fesm2015/firestitch-form.js +2100 -2107
- package/fesm2015/firestitch-form.js.map +1 -1
- package/firestitch-form.d.ts +5 -26
- package/package.json +7 -8
- package/public_api.d.ts +33 -12
- package/styles.scss +4 -4
- package/bundles/firestitch-form.umd.min.js +0 -16
- package/bundles/firestitch-form.umd.min.js.map +0 -1
- package/esm5/app/components/form-dialog-actions/form-dialog-actions.component.js +0 -96
- package/esm5/app/consts/error-messages.const.js +0 -20
- package/esm5/app/directives/form/form.directive.js +0 -706
- package/esm5/app/directives/form-dialog-close.directive.js +0 -34
- package/esm5/app/directives/submit-button.directive.js +0 -144
- package/esm5/app/directives/validators/compare.directive.js +0 -60
- package/esm5/app/directives/validators/control.directive.js +0 -279
- package/esm5/app/directives/validators/daterange.directive.js +0 -50
- package/esm5/app/directives/validators/email.directive.js +0 -50
- package/esm5/app/directives/validators/emails.directive.js +0 -50
- package/esm5/app/directives/validators/function.directive.js +0 -36
- package/esm5/app/directives/validators/greater.directive.js +0 -49
- package/esm5/app/directives/validators/integer.directive.js +0 -50
- package/esm5/app/directives/validators/lesser.directive.js +0 -49
- package/esm5/app/directives/validators/max.directive.js +0 -45
- package/esm5/app/directives/validators/maxlength.directive.js +0 -44
- package/esm5/app/directives/validators/min.directive.js +0 -45
- package/esm5/app/directives/validators/minlength.directive.js +0 -44
- package/esm5/app/directives/validators/numeric.directive.js +0 -50
- package/esm5/app/directives/validators/pattern.directive.js +0 -44
- package/esm5/app/directives/validators/phone.directive.js +0 -50
- package/esm5/app/directives/validators/required.directive.js +0 -88
- package/esm5/app/directives/validators/url.directive.js +0 -56
- package/esm5/app/directives/validators/validate.directive.js +0 -36
- package/esm5/app/enums/confirm-result.js +0 -9
- package/esm5/app/enums/form-status.js +0 -11
- package/esm5/app/fs-form.module.js +0 -110
- package/esm5/app/guards/form-deactivate.guard.js +0 -45
- package/esm5/app/helpers/confirm-result-continue.js +0 -5
- package/esm5/app/helpers/confirm-unsaved.js +0 -70
- package/esm5/app/helpers/get-form-errors.js +0 -28
- package/esm5/app/helpers/index.js +0 -3
- package/esm5/app/helpers/is-enabled.js +0 -4
- package/esm5/app/interfaces/async-validator.js +0 -1
- package/esm5/app/interfaces/confirm-config.js +0 -1
- package/esm5/app/interfaces/confirm-tab-group.js +0 -1
- package/esm5/app/interfaces/form-deactivate.js +0 -1
- package/esm5/app/interfaces/index.js +0 -1
- package/esm5/app/interfaces/submit-event.js +0 -1
- package/esm5/app/interfaces/submitted-event.js +0 -1
- package/esm5/app/interfaces/validator.js +0 -1
- package/esm5/app/providers/validate-messages.provider.js +0 -12
- package/esm5/app/services/fsform.service.js +0 -27
- package/esm5/app/validators/validators.js +0 -102
- package/esm5/firestitch-form.js +0 -27
- package/esm5/public_api.js +0 -14
- package/fesm5/firestitch-form.js +0 -2396
- package/fesm5/firestitch-form.js.map +0 -1
- package/firestitch-form.metadata.json +0 -1
|
@@ -1,706 +0,0 @@
|
|
|
1
|
-
import { __decorate, __metadata, __param, __read, __spread } from "tslib";
|
|
2
|
-
import { AfterContentInit, ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, Inject, Input, NgZone, OnChanges, OnDestroy, OnInit, Optional, Output, QueryList, SimpleChanges, } from '@angular/core';
|
|
3
|
-
import { AbstractControl, NgForm } from '@angular/forms';
|
|
4
|
-
import { MatDialogRef } from '@angular/material/dialog';
|
|
5
|
-
import { MatTabGroup } from '@angular/material/tabs';
|
|
6
|
-
import { FsMessage, MessageMode } from '@firestitch/message';
|
|
7
|
-
import { FsPrompt } from '@firestitch/prompt';
|
|
8
|
-
import { guid } from '@firestitch/common';
|
|
9
|
-
import { DrawerRef } from '@firestitch/drawer';
|
|
10
|
-
import { BehaviorSubject, defer, fromEvent, iif, isObservable, of, Subject, throwError } from 'rxjs';
|
|
11
|
-
import { catchError, delay, filter, first, map, mergeMap, startWith, switchMap, take, takeUntil, tap } from 'rxjs/operators';
|
|
12
|
-
import { confirmUnsaved } from '../../helpers/confirm-unsaved';
|
|
13
|
-
import { FsFormDialogCloseDirective } from '../form-dialog-close.directive';
|
|
14
|
-
import { ConfirmResult } from './../../enums/confirm-result';
|
|
15
|
-
import { FsForm } from '../../services/fsform.service';
|
|
16
|
-
import { FormStatus } from './../../enums/form-status';
|
|
17
|
-
import { confirmResultContinue } from '../../helpers/confirm-result-continue';
|
|
18
|
-
import { getFormErrors } from '../../helpers/get-form-errors';
|
|
19
|
-
var FsFormDirective = /** @class */ (function () {
|
|
20
|
-
function FsFormDirective(ngForm, _form, _element, _message, _prompt, _ngZone, _dialogRef, _drawerRef) {
|
|
21
|
-
this.ngForm = ngForm;
|
|
22
|
-
this._form = _form;
|
|
23
|
-
this._element = _element;
|
|
24
|
-
this._message = _message;
|
|
25
|
-
this._prompt = _prompt;
|
|
26
|
-
this._ngZone = _ngZone;
|
|
27
|
-
this._dialogRef = _dialogRef;
|
|
28
|
-
this._drawerRef = _drawerRef;
|
|
29
|
-
this.wrapperSelector = '.fs-form-wrapper,.mat-form-field';
|
|
30
|
-
this.messageSelector = '.fs-form-message,.mat-form-field-subscript-wrapper';
|
|
31
|
-
this.hintSelector = '.fs-form-hint,.mat-form-field-hint-wrapper';
|
|
32
|
-
this.labelSelector = '.fs-form-label,.mat-form-field-label';
|
|
33
|
-
this.autocomplete = false;
|
|
34
|
-
this.shortcuts = true; // Ctrl + s
|
|
35
|
-
this.confirm = true;
|
|
36
|
-
this.confirmDialog = true;
|
|
37
|
-
this.confirmDrawer = true;
|
|
38
|
-
this.confirmBrowser = true;
|
|
39
|
-
this.confirmTabs = true;
|
|
40
|
-
this.dirtySubmitButton = true;
|
|
41
|
-
this.successDelay = 0;
|
|
42
|
-
this.errorDelay = 1000;
|
|
43
|
-
this.submitEvent = new EventEmitter();
|
|
44
|
-
this.invalid = new EventEmitter();
|
|
45
|
-
this.valid = new EventEmitter();
|
|
46
|
-
this.submitted = new EventEmitter();
|
|
47
|
-
this.reseted = new EventEmitter();
|
|
48
|
-
this.cleared = new EventEmitter();
|
|
49
|
-
this.fsformClass = true;
|
|
50
|
-
this._tabGroups = new QueryList();
|
|
51
|
-
this._submitButtons = new QueryList();
|
|
52
|
-
this._dialogBackdropEscape = false;
|
|
53
|
-
this._snapshot = {};
|
|
54
|
-
this._status$ = new BehaviorSubject(FormStatus.Valid);
|
|
55
|
-
this._destroy$ = new Subject();
|
|
56
|
-
}
|
|
57
|
-
Object.defineProperty(FsFormDirective.prototype, "submitting", {
|
|
58
|
-
get: function () {
|
|
59
|
-
return this._status$.getValue() === FormStatus.Submitting;
|
|
60
|
-
},
|
|
61
|
-
enumerable: true,
|
|
62
|
-
configurable: true
|
|
63
|
-
});
|
|
64
|
-
Object.defineProperty(FsFormDirective.prototype, "completing", {
|
|
65
|
-
get: function () {
|
|
66
|
-
return this._status$.getValue() === FormStatus.Completing;
|
|
67
|
-
},
|
|
68
|
-
enumerable: true,
|
|
69
|
-
configurable: true
|
|
70
|
-
});
|
|
71
|
-
Object.defineProperty(FsFormDirective.prototype, "_submitEvent", {
|
|
72
|
-
get: function () {
|
|
73
|
-
return {
|
|
74
|
-
ngForm: this.ngForm,
|
|
75
|
-
submitter: this._submitter,
|
|
76
|
-
};
|
|
77
|
-
},
|
|
78
|
-
enumerable: true,
|
|
79
|
-
configurable: true
|
|
80
|
-
});
|
|
81
|
-
Object.defineProperty(FsFormDirective.prototype, "_formValidState$", {
|
|
82
|
-
get: function () {
|
|
83
|
-
this._form.broadcast('valid', this._submitEvent);
|
|
84
|
-
this.submitEvent.emit(this._submitEvent);
|
|
85
|
-
this.valid.emit(this._submitEvent);
|
|
86
|
-
var submittedEvent = {
|
|
87
|
-
ngForm: this.ngForm,
|
|
88
|
-
submitter: this._submitter,
|
|
89
|
-
response: null
|
|
90
|
-
};
|
|
91
|
-
if (!this.submit) {
|
|
92
|
-
return of(submittedEvent);
|
|
93
|
-
}
|
|
94
|
-
var result = this.submit(this._submitEvent);
|
|
95
|
-
if (!isObservable(result)) {
|
|
96
|
-
return of(submittedEvent);
|
|
97
|
-
}
|
|
98
|
-
return result
|
|
99
|
-
.pipe(map(function (response) {
|
|
100
|
-
submittedEvent.response = response;
|
|
101
|
-
return submittedEvent;
|
|
102
|
-
}));
|
|
103
|
-
},
|
|
104
|
-
enumerable: true,
|
|
105
|
-
configurable: true
|
|
106
|
-
});
|
|
107
|
-
Object.defineProperty(FsFormDirective.prototype, "_formInvalidState$", {
|
|
108
|
-
get: function () {
|
|
109
|
-
this._form.broadcast('invalid', this._submitEvent);
|
|
110
|
-
if (this.invalid) {
|
|
111
|
-
this.invalid.emit(this._submitEvent);
|
|
112
|
-
}
|
|
113
|
-
var message = 'Changes not saved. Please review errors highlighted in red.';
|
|
114
|
-
this._message.error(message, { mode: MessageMode.Toast });
|
|
115
|
-
var el = this._element.nativeElement.querySelector('.ng-invalid');
|
|
116
|
-
if (el) {
|
|
117
|
-
el.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
118
|
-
}
|
|
119
|
-
return throwError('Form validation error');
|
|
120
|
-
},
|
|
121
|
-
enumerable: true,
|
|
122
|
-
configurable: true
|
|
123
|
-
});
|
|
124
|
-
Object.defineProperty(FsFormDirective.prototype, "_submitter", {
|
|
125
|
-
get: function () {
|
|
126
|
-
return this._activeSubmitButton
|
|
127
|
-
? this._activeSubmitButton.name
|
|
128
|
-
: null;
|
|
129
|
-
},
|
|
130
|
-
enumerable: true,
|
|
131
|
-
configurable: true
|
|
132
|
-
});
|
|
133
|
-
FsFormDirective.prototype.ngOnInit = function () {
|
|
134
|
-
this._registerConfirmDialogBackdropEscape();
|
|
135
|
-
this._listenHotKeys();
|
|
136
|
-
this._listenWindowClose();
|
|
137
|
-
this._listenSubmit();
|
|
138
|
-
if (!this.autocomplete) {
|
|
139
|
-
this._registerAutocomplete();
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
FsFormDirective.prototype.ngOnChanges = function (changes) {
|
|
143
|
-
if (changes.confirm) {
|
|
144
|
-
this._updateDirtySubmitButtons();
|
|
145
|
-
}
|
|
146
|
-
};
|
|
147
|
-
FsFormDirective.prototype.ngAfterContentInit = function () {
|
|
148
|
-
this._registerConfirm();
|
|
149
|
-
this._registerConfirmDialogClose();
|
|
150
|
-
this._registerConfirmDrawerClose();
|
|
151
|
-
this._registerConfirmTabs();
|
|
152
|
-
this._registerDrawerClose();
|
|
153
|
-
this._registerDirtySubmitButton();
|
|
154
|
-
};
|
|
155
|
-
FsFormDirective.prototype.ngOnDestroy = function () {
|
|
156
|
-
this._destroy$.next();
|
|
157
|
-
this._destroy$.complete();
|
|
158
|
-
};
|
|
159
|
-
FsFormDirective.prototype.createSnapshot = function () {
|
|
160
|
-
this._snapshot = this.ngForm.value;
|
|
161
|
-
};
|
|
162
|
-
FsFormDirective.prototype.reset = function () {
|
|
163
|
-
var _this = this;
|
|
164
|
-
this.ngForm.resetForm();
|
|
165
|
-
Object.keys(this.ngForm.controls)
|
|
166
|
-
.forEach(function (name) {
|
|
167
|
-
var control = _this.ngForm.controls[name];
|
|
168
|
-
control.reset(_this._snapshot[name]);
|
|
169
|
-
});
|
|
170
|
-
this.reseted.emit();
|
|
171
|
-
};
|
|
172
|
-
FsFormDirective.prototype.clear = function () {
|
|
173
|
-
this.ngForm.resetForm();
|
|
174
|
-
this.cleared.emit();
|
|
175
|
-
};
|
|
176
|
-
FsFormDirective.prototype.dirty = function () {
|
|
177
|
-
this.ngForm.form.markAsDirty();
|
|
178
|
-
this._updateDirtySubmitButtons();
|
|
179
|
-
};
|
|
180
|
-
FsFormDirective.prototype.triggerSubmit = function () {
|
|
181
|
-
this.ngForm.ngSubmit.next();
|
|
182
|
-
};
|
|
183
|
-
FsFormDirective.prototype.triggerConfirm = function () {
|
|
184
|
-
var _this = this;
|
|
185
|
-
var submitted = this.submitting ? this.submitted.asObservable() : of({});
|
|
186
|
-
return submitted
|
|
187
|
-
.pipe(take(1), mergeMap(function () { return confirmUnsaved(_this, _this._prompt); }));
|
|
188
|
-
};
|
|
189
|
-
FsFormDirective.prototype.enable = function () {
|
|
190
|
-
this.ngForm.control.enable();
|
|
191
|
-
this._updateDirtySubmitButtons();
|
|
192
|
-
};
|
|
193
|
-
FsFormDirective.prototype.disable = function () {
|
|
194
|
-
this.ngForm.control.disable();
|
|
195
|
-
this._submitButtons.forEach(function (button) {
|
|
196
|
-
button.disable();
|
|
197
|
-
});
|
|
198
|
-
};
|
|
199
|
-
FsFormDirective.prototype.addSubmitButton = function (submitButton) {
|
|
200
|
-
this._submitButtons.reset(__spread(this._submitButtons.toArray(), [
|
|
201
|
-
submitButton,
|
|
202
|
-
]));
|
|
203
|
-
};
|
|
204
|
-
FsFormDirective.prototype.removeSubmitButton = function (submitButton) {
|
|
205
|
-
this._submitButtons.reset(__spread(this._submitButtons.toArray()
|
|
206
|
-
.filter(function (submitButton_) { return (submitButton !== submitButton_); })));
|
|
207
|
-
};
|
|
208
|
-
FsFormDirective.prototype._listenSubmit = function () {
|
|
209
|
-
var _this = this;
|
|
210
|
-
this.ngForm
|
|
211
|
-
.ngSubmit
|
|
212
|
-
.pipe(tap(function (event) {
|
|
213
|
-
event === null || event === void 0 ? void 0 : event.preventDefault();
|
|
214
|
-
}), filter(function () {
|
|
215
|
-
return [FormStatus.Valid, FormStatus.Invalid]
|
|
216
|
-
.includes(_this._status$.getValue());
|
|
217
|
-
}), tap(function () { return _this._markControlsAsTouchedAndUpdateValidity(); }), tap(function () { return _this._broadcastSubmittingEvents(); }), switchMap(function () { return _this._waitUntilStatusPending(); }), tap(function () { return _this._setupActiveSubmitButton(); }), mergeMap(function () {
|
|
218
|
-
return _this.ngForm.status === 'INVALID'
|
|
219
|
-
? _this._formInvalidState$
|
|
220
|
-
: _this._formValidState$;
|
|
221
|
-
}), catchError(function (e, source$) {
|
|
222
|
-
_this._handleError(e);
|
|
223
|
-
return source$;
|
|
224
|
-
}), tap(function (submittedEvent) {
|
|
225
|
-
_this._completeSubmit(true, submittedEvent);
|
|
226
|
-
}), takeUntil(this._destroy$))
|
|
227
|
-
.subscribe(function () { });
|
|
228
|
-
};
|
|
229
|
-
FsFormDirective.prototype._listenWindowClose = function () {
|
|
230
|
-
var _this = this;
|
|
231
|
-
fromEvent(window, 'beforeunload')
|
|
232
|
-
.pipe(takeUntil(this._destroy$))
|
|
233
|
-
.subscribe(function (event) {
|
|
234
|
-
if (_this.confirm && _this.confirmBrowser && _this.ngForm.dirty) {
|
|
235
|
-
event.returnValue = false;
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
};
|
|
239
|
-
FsFormDirective.prototype._listenHotKeys = function () {
|
|
240
|
-
var _this = this;
|
|
241
|
-
this._ngZone.runOutsideAngular(function () {
|
|
242
|
-
fromEvent(document, 'keydown')
|
|
243
|
-
.pipe(takeUntil(_this._destroy$))
|
|
244
|
-
.subscribe(function (event) {
|
|
245
|
-
if (_this._dialogBackdropEscape && event.code === 'Escape') {
|
|
246
|
-
var dialog_1 = document.getElementById(_this._dialogRef.id);
|
|
247
|
-
var paths = event.composedPath();
|
|
248
|
-
if (paths) {
|
|
249
|
-
paths.forEach(function (item) {
|
|
250
|
-
if (dialog_1 === item) {
|
|
251
|
-
_this._ngZone.run(function () {
|
|
252
|
-
_this._formClose();
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
if ((event.ctrlKey || event.metaKey) && event.code === 'KeyS') {
|
|
259
|
-
event.preventDefault();
|
|
260
|
-
if (_this.shortcuts) {
|
|
261
|
-
if (_this._elementInForm(document.activeElement)) {
|
|
262
|
-
_this.ngForm.ngSubmit.next();
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
});
|
|
267
|
-
});
|
|
268
|
-
};
|
|
269
|
-
FsFormDirective.prototype._formClose = function () {
|
|
270
|
-
var _this = this;
|
|
271
|
-
if (this.confirm && this.confirmDialog) {
|
|
272
|
-
this.triggerConfirm()
|
|
273
|
-
.pipe(filter(function (result) { return confirmResultContinue(result); }), switchMap(function (result) {
|
|
274
|
-
return result === ConfirmResult.Pristine || result === ConfirmResult.Discard
|
|
275
|
-
? of(null)
|
|
276
|
-
: _this.submitted.asObservable();
|
|
277
|
-
}), takeUntil(this._destroy$))
|
|
278
|
-
.subscribe(function (result) {
|
|
279
|
-
_this._dialogRef.close(result === null || result === void 0 ? void 0 : result.response);
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
else {
|
|
283
|
-
this._dialogRef.close(null);
|
|
284
|
-
}
|
|
285
|
-
};
|
|
286
|
-
FsFormDirective.prototype._registerDialogClose = function (directive) {
|
|
287
|
-
var _this = this;
|
|
288
|
-
if (!directive.registered) {
|
|
289
|
-
directive.registered = true;
|
|
290
|
-
directive.clicked$
|
|
291
|
-
.pipe(takeUntil(this._destroy$))
|
|
292
|
-
.subscribe(function () {
|
|
293
|
-
_this._formClose();
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
};
|
|
297
|
-
FsFormDirective.prototype._getActiveButton = function () {
|
|
298
|
-
var activeButton = this._submitButtons.find(function (button) {
|
|
299
|
-
return button.active;
|
|
300
|
-
});
|
|
301
|
-
return activeButton ? activeButton : this._submitButtons.first;
|
|
302
|
-
};
|
|
303
|
-
FsFormDirective.prototype._elementInForm = function (el) {
|
|
304
|
-
if (el.isSameNode(this._element.nativeElement)) {
|
|
305
|
-
return true;
|
|
306
|
-
}
|
|
307
|
-
else if (el.parentElement) {
|
|
308
|
-
return this._elementInForm(el.parentElement);
|
|
309
|
-
}
|
|
310
|
-
return false;
|
|
311
|
-
};
|
|
312
|
-
FsFormDirective.prototype._completeSubmit = function (success, submitEvent) {
|
|
313
|
-
var _this = this;
|
|
314
|
-
if (success) {
|
|
315
|
-
this.ngForm.control.markAsPristine();
|
|
316
|
-
this.createSnapshot();
|
|
317
|
-
this.submitted.emit(submitEvent);
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
this._resetButtons();
|
|
321
|
-
}
|
|
322
|
-
if (this._activeSubmitButton) {
|
|
323
|
-
if (success) {
|
|
324
|
-
this._activeSubmitButton.success();
|
|
325
|
-
}
|
|
326
|
-
else {
|
|
327
|
-
this._activeSubmitButton.error();
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
this._status$.next(FormStatus.Submitted);
|
|
331
|
-
if (success) {
|
|
332
|
-
this._status$.next(FormStatus.Success);
|
|
333
|
-
}
|
|
334
|
-
else {
|
|
335
|
-
this._status$.next(FormStatus.Error);
|
|
336
|
-
}
|
|
337
|
-
this._status$.next(FormStatus.Completing);
|
|
338
|
-
var resetDelay = success ? this.successDelay : this.errorDelay;
|
|
339
|
-
of(true)
|
|
340
|
-
.pipe(delay(resetDelay), first(), takeUntil(this._destroy$)).subscribe(function () {
|
|
341
|
-
if (_this.ngForm.form.status === 'VALID') {
|
|
342
|
-
_this._status$.next(FormStatus.Valid);
|
|
343
|
-
}
|
|
344
|
-
else {
|
|
345
|
-
_this._status$.next(FormStatus.Invalid);
|
|
346
|
-
}
|
|
347
|
-
_this._resetButtons();
|
|
348
|
-
_this._updateDirtySubmitButtons();
|
|
349
|
-
});
|
|
350
|
-
};
|
|
351
|
-
FsFormDirective.prototype._resetButtons = function () {
|
|
352
|
-
this._submitButtons.forEach(function (button) {
|
|
353
|
-
button.reset();
|
|
354
|
-
});
|
|
355
|
-
};
|
|
356
|
-
FsFormDirective.prototype._registerConfirm = function () {
|
|
357
|
-
var _this = this;
|
|
358
|
-
this.ngForm.form.valueChanges
|
|
359
|
-
.pipe(takeUntil(this._destroy$))
|
|
360
|
-
.subscribe(function (changes) {
|
|
361
|
-
if (_this.confirm) {
|
|
362
|
-
var existing_1 = Object.keys(_this._snapshot);
|
|
363
|
-
Object.keys(changes)
|
|
364
|
-
.forEach(function (name) {
|
|
365
|
-
if (existing_1.indexOf(name) === -1) {
|
|
366
|
-
_this._snapshot[name] = changes[name];
|
|
367
|
-
}
|
|
368
|
-
});
|
|
369
|
-
}
|
|
370
|
-
});
|
|
371
|
-
};
|
|
372
|
-
FsFormDirective.prototype._registerDrawerClose = function () {
|
|
373
|
-
var _this = this;
|
|
374
|
-
if (this._drawerRef) {
|
|
375
|
-
this._drawerRef.closeStart$
|
|
376
|
-
.pipe(takeUntil(this._destroy$))
|
|
377
|
-
.subscribe(function (subscriber) {
|
|
378
|
-
if (_this.submitting) {
|
|
379
|
-
_this._status$
|
|
380
|
-
.pipe(filter(function (status) { return status === FormStatus.Success || status === FormStatus.Error; }), takeUntil(_this._destroy$))
|
|
381
|
-
.subscribe(function (status) {
|
|
382
|
-
if (status === FormStatus.Success) {
|
|
383
|
-
subscriber.next();
|
|
384
|
-
subscriber.complete();
|
|
385
|
-
}
|
|
386
|
-
else {
|
|
387
|
-
subscriber.error();
|
|
388
|
-
}
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
else {
|
|
392
|
-
subscriber.next();
|
|
393
|
-
subscriber.complete();
|
|
394
|
-
}
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
};
|
|
398
|
-
FsFormDirective.prototype._registerConfirmDrawerClose = function () {
|
|
399
|
-
var _this = this;
|
|
400
|
-
if (this._drawerRef) {
|
|
401
|
-
this._drawerRef.closeStart$
|
|
402
|
-
.pipe(switchMap(function (subscriber) {
|
|
403
|
-
return iif(function () { return _this.confirm && _this.confirmDrawer; }, _this.triggerConfirm()
|
|
404
|
-
.pipe(map(function (result) { return confirmResultContinue(result); }), tap(function (result) {
|
|
405
|
-
if (result) {
|
|
406
|
-
subscriber.next();
|
|
407
|
-
subscriber.complete();
|
|
408
|
-
}
|
|
409
|
-
})), defer(function () {
|
|
410
|
-
subscriber.next();
|
|
411
|
-
subscriber.complete();
|
|
412
|
-
}));
|
|
413
|
-
}), takeUntil(this._destroy$))
|
|
414
|
-
.subscribe();
|
|
415
|
-
}
|
|
416
|
-
};
|
|
417
|
-
FsFormDirective.prototype._registerConfirmTabs = function () {
|
|
418
|
-
var _this = this;
|
|
419
|
-
if (this.tabGroup) {
|
|
420
|
-
this.registerConfirmTabGroup(this.tabGroup);
|
|
421
|
-
}
|
|
422
|
-
this.registerConfirmTabGroups(this._tabGroups.toArray());
|
|
423
|
-
this._tabGroups.changes
|
|
424
|
-
.pipe(takeUntil(this._destroy$))
|
|
425
|
-
.subscribe(function () {
|
|
426
|
-
_this.registerConfirmTabGroups(_this._tabGroups.toArray());
|
|
427
|
-
});
|
|
428
|
-
};
|
|
429
|
-
FsFormDirective.prototype.registerConfirmTabGroups = function (tabGroups) {
|
|
430
|
-
var _this = this;
|
|
431
|
-
tabGroups.forEach(function (tabGroup) {
|
|
432
|
-
_this.registerConfirmTabGroup(tabGroup);
|
|
433
|
-
});
|
|
434
|
-
};
|
|
435
|
-
FsFormDirective.prototype.registerConfirmTabGroup = function (tabGroup) {
|
|
436
|
-
var _this = this;
|
|
437
|
-
var confirmTabGroup = tabGroup;
|
|
438
|
-
if (!confirmTabGroup._originalHandleClick) {
|
|
439
|
-
confirmTabGroup._originalHandleClick = tabGroup._handleClick;
|
|
440
|
-
confirmTabGroup._handlClick$ = new Subject();
|
|
441
|
-
confirmTabGroup._handleClick = function (tab, tabHeader, idx) {
|
|
442
|
-
if (confirmTabGroup._handlClick$.observers.length) {
|
|
443
|
-
confirmTabGroup._handlClick$.next({ tab: tab, tabHeader: tabHeader, idx: idx });
|
|
444
|
-
}
|
|
445
|
-
else {
|
|
446
|
-
confirmTabGroup._originalHandleClick(tab, tabHeader, idx);
|
|
447
|
-
}
|
|
448
|
-
};
|
|
449
|
-
}
|
|
450
|
-
confirmTabGroup._handlClick$
|
|
451
|
-
.pipe(takeUntil(this._destroy$))
|
|
452
|
-
.subscribe(function (event) {
|
|
453
|
-
if (!_this.submitting) {
|
|
454
|
-
if (_this.confirm && _this.confirmTabs) {
|
|
455
|
-
_this.triggerConfirm()
|
|
456
|
-
.pipe(takeUntil(_this._destroy$))
|
|
457
|
-
.subscribe(function (result) {
|
|
458
|
-
if (confirmResultContinue(result)) {
|
|
459
|
-
confirmTabGroup.selectedIndex = event.idx;
|
|
460
|
-
}
|
|
461
|
-
});
|
|
462
|
-
}
|
|
463
|
-
else {
|
|
464
|
-
confirmTabGroup._originalHandleClick(event.tab, event.tabHeader, event.idx);
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
});
|
|
468
|
-
};
|
|
469
|
-
FsFormDirective.prototype._registerConfirmDialogClose = function () {
|
|
470
|
-
var _this = this;
|
|
471
|
-
if (this._dialogRef) {
|
|
472
|
-
this.formDialogClose.forEach(function (item) {
|
|
473
|
-
_this._registerDialogClose(item);
|
|
474
|
-
});
|
|
475
|
-
this.formDialogClose.changes
|
|
476
|
-
.pipe(takeUntil(this._destroy$))
|
|
477
|
-
.subscribe(function (e) {
|
|
478
|
-
e.forEach(function (item) {
|
|
479
|
-
_this._registerDialogClose(item);
|
|
480
|
-
});
|
|
481
|
-
});
|
|
482
|
-
}
|
|
483
|
-
};
|
|
484
|
-
FsFormDirective.prototype._registerConfirmDialogBackdropEscape = function () {
|
|
485
|
-
var _this = this;
|
|
486
|
-
this._dialogBackdropEscape = this._dialogRef && this._dialogRef.disableClose !== true;
|
|
487
|
-
if (this._dialogRef && !this._dialogRef.disableClose) {
|
|
488
|
-
this._dialogRef.disableClose = true;
|
|
489
|
-
this._dialogRef.backdropClick()
|
|
490
|
-
.pipe(takeUntil(this._destroy$))
|
|
491
|
-
.subscribe(function () {
|
|
492
|
-
_this._formClose();
|
|
493
|
-
});
|
|
494
|
-
this._destroy$
|
|
495
|
-
.subscribe(function () {
|
|
496
|
-
_this._dialogRef.disableClose = false;
|
|
497
|
-
});
|
|
498
|
-
}
|
|
499
|
-
};
|
|
500
|
-
FsFormDirective.prototype._registerAutocomplete = function () {
|
|
501
|
-
var _this = this;
|
|
502
|
-
this._registerControl = this.ngForm.form.registerControl.bind(this.ngForm.form);
|
|
503
|
-
this.ngForm.form.registerControl = function (name, control) {
|
|
504
|
-
var el = _this._element.nativeElement.querySelector("input[name='" + name + "']");
|
|
505
|
-
if (el) {
|
|
506
|
-
el.setAttribute('name', name + '_' + guid());
|
|
507
|
-
if (!el.getAttribute('autocomplete')) {
|
|
508
|
-
el.setAttribute('autocomplete', 'none');
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
return _this._registerControl(name, control);
|
|
512
|
-
};
|
|
513
|
-
};
|
|
514
|
-
FsFormDirective.prototype._registerDirtySubmitButton = function () {
|
|
515
|
-
var _this = this;
|
|
516
|
-
if (!this.ngForm) {
|
|
517
|
-
return;
|
|
518
|
-
}
|
|
519
|
-
this.ngForm.form.valueChanges
|
|
520
|
-
.pipe(takeUntil(this._destroy$))
|
|
521
|
-
.subscribe(function () {
|
|
522
|
-
_this._updateDirtySubmitButtons();
|
|
523
|
-
});
|
|
524
|
-
this._submitButtons.changes
|
|
525
|
-
.pipe(takeUntil(this._destroy$))
|
|
526
|
-
.subscribe(function () {
|
|
527
|
-
_this._updateDirtySubmitButtons();
|
|
528
|
-
});
|
|
529
|
-
};
|
|
530
|
-
FsFormDirective.prototype._updateDirtySubmitButtons = function () {
|
|
531
|
-
var _this = this;
|
|
532
|
-
this._submitButtons
|
|
533
|
-
.forEach(function (submitButton) {
|
|
534
|
-
if (!_this.confirm || !_this.dirtySubmitButton || _this.ngForm.dirty || !submitButton.dirtySubmit) {
|
|
535
|
-
submitButton.enable();
|
|
536
|
-
}
|
|
537
|
-
else {
|
|
538
|
-
submitButton.disable();
|
|
539
|
-
}
|
|
540
|
-
});
|
|
541
|
-
};
|
|
542
|
-
FsFormDirective.prototype._broadcastSubmittingEvents = function () {
|
|
543
|
-
this._status$.next(FormStatus.Submitting);
|
|
544
|
-
this._form.broadcast('submit', this.ngForm);
|
|
545
|
-
};
|
|
546
|
-
FsFormDirective.prototype._markControlsAsTouchedAndUpdateValidity = function () {
|
|
547
|
-
Object.values(this.ngForm.controls)
|
|
548
|
-
.forEach(function (control) {
|
|
549
|
-
control.markAsDirty();
|
|
550
|
-
control.markAsTouched();
|
|
551
|
-
control.updateValueAndValidity();
|
|
552
|
-
});
|
|
553
|
-
};
|
|
554
|
-
FsFormDirective.prototype._setupActiveSubmitButton = function () {
|
|
555
|
-
this._activeSubmitButton = this._getActiveButton();
|
|
556
|
-
this._resetButtons();
|
|
557
|
-
if (this._activeSubmitButton) {
|
|
558
|
-
this._activeSubmitButton.process();
|
|
559
|
-
}
|
|
560
|
-
};
|
|
561
|
-
FsFormDirective.prototype._waitUntilStatusPending = function () {
|
|
562
|
-
return this.ngForm.statusChanges
|
|
563
|
-
.pipe(startWith(this.ngForm.status), first(function (state) { return state !== 'PENDING'; }));
|
|
564
|
-
};
|
|
565
|
-
FsFormDirective.prototype._handleError = function (e) {
|
|
566
|
-
console.log('%c Form Submit ', 'color: white; background-color: #D33F49', 'Error occured');
|
|
567
|
-
console.group('Error Details:');
|
|
568
|
-
console.log('Message: ', e);
|
|
569
|
-
console.log('FormRef: ', this);
|
|
570
|
-
if (this.ngForm.invalid) {
|
|
571
|
-
var errors = getFormErrors(this.ngForm.control, null);
|
|
572
|
-
console.log('Validation Errors: ', errors);
|
|
573
|
-
}
|
|
574
|
-
console.groupEnd();
|
|
575
|
-
this._completeSubmit(false, null);
|
|
576
|
-
};
|
|
577
|
-
FsFormDirective.ctorParameters = function () { return [
|
|
578
|
-
{ type: NgForm, decorators: [{ type: Inject, args: [NgForm,] }] },
|
|
579
|
-
{ type: FsForm },
|
|
580
|
-
{ type: ElementRef },
|
|
581
|
-
{ type: FsMessage },
|
|
582
|
-
{ type: FsPrompt },
|
|
583
|
-
{ type: NgZone },
|
|
584
|
-
{ type: MatDialogRef, decorators: [{ type: Optional }, { type: Inject, args: [MatDialogRef,] }] },
|
|
585
|
-
{ type: DrawerRef, decorators: [{ type: Optional }, { type: Inject, args: [DrawerRef,] }] }
|
|
586
|
-
]; };
|
|
587
|
-
__decorate([
|
|
588
|
-
Input(),
|
|
589
|
-
__metadata("design:type", Object)
|
|
590
|
-
], FsFormDirective.prototype, "wrapperSelector", void 0);
|
|
591
|
-
__decorate([
|
|
592
|
-
Input(),
|
|
593
|
-
__metadata("design:type", Object)
|
|
594
|
-
], FsFormDirective.prototype, "messageSelector", void 0);
|
|
595
|
-
__decorate([
|
|
596
|
-
Input(),
|
|
597
|
-
__metadata("design:type", Object)
|
|
598
|
-
], FsFormDirective.prototype, "hintSelector", void 0);
|
|
599
|
-
__decorate([
|
|
600
|
-
Input(),
|
|
601
|
-
__metadata("design:type", Object)
|
|
602
|
-
], FsFormDirective.prototype, "labelSelector", void 0);
|
|
603
|
-
__decorate([
|
|
604
|
-
Input(),
|
|
605
|
-
__metadata("design:type", Object)
|
|
606
|
-
], FsFormDirective.prototype, "autocomplete", void 0);
|
|
607
|
-
__decorate([
|
|
608
|
-
Input(),
|
|
609
|
-
__metadata("design:type", Object)
|
|
610
|
-
], FsFormDirective.prototype, "shortcuts", void 0);
|
|
611
|
-
__decorate([
|
|
612
|
-
Input(),
|
|
613
|
-
__metadata("design:type", Object)
|
|
614
|
-
], FsFormDirective.prototype, "confirm", void 0);
|
|
615
|
-
__decorate([
|
|
616
|
-
Input(),
|
|
617
|
-
__metadata("design:type", Object)
|
|
618
|
-
], FsFormDirective.prototype, "confirmDialog", void 0);
|
|
619
|
-
__decorate([
|
|
620
|
-
Input(),
|
|
621
|
-
__metadata("design:type", Object)
|
|
622
|
-
], FsFormDirective.prototype, "confirmDrawer", void 0);
|
|
623
|
-
__decorate([
|
|
624
|
-
Input(),
|
|
625
|
-
__metadata("design:type", Object)
|
|
626
|
-
], FsFormDirective.prototype, "confirmBrowser", void 0);
|
|
627
|
-
__decorate([
|
|
628
|
-
Input(),
|
|
629
|
-
__metadata("design:type", Object)
|
|
630
|
-
], FsFormDirective.prototype, "confirmTabs", void 0);
|
|
631
|
-
__decorate([
|
|
632
|
-
Input(),
|
|
633
|
-
__metadata("design:type", Object)
|
|
634
|
-
], FsFormDirective.prototype, "dirtySubmitButton", void 0);
|
|
635
|
-
__decorate([
|
|
636
|
-
Input(),
|
|
637
|
-
__metadata("design:type", Function)
|
|
638
|
-
], FsFormDirective.prototype, "submit", void 0);
|
|
639
|
-
__decorate([
|
|
640
|
-
Input(),
|
|
641
|
-
__metadata("design:type", Object)
|
|
642
|
-
], FsFormDirective.prototype, "successDelay", void 0);
|
|
643
|
-
__decorate([
|
|
644
|
-
Input(),
|
|
645
|
-
__metadata("design:type", Object)
|
|
646
|
-
], FsFormDirective.prototype, "errorDelay", void 0);
|
|
647
|
-
__decorate([
|
|
648
|
-
Input(),
|
|
649
|
-
__metadata("design:type", MatTabGroup)
|
|
650
|
-
], FsFormDirective.prototype, "tabGroup", void 0);
|
|
651
|
-
__decorate([
|
|
652
|
-
Output('fsForm'),
|
|
653
|
-
__metadata("design:type", EventEmitter)
|
|
654
|
-
], FsFormDirective.prototype, "submitEvent", void 0);
|
|
655
|
-
__decorate([
|
|
656
|
-
Output(),
|
|
657
|
-
__metadata("design:type", EventEmitter)
|
|
658
|
-
], FsFormDirective.prototype, "invalid", void 0);
|
|
659
|
-
__decorate([
|
|
660
|
-
Output(),
|
|
661
|
-
__metadata("design:type", EventEmitter)
|
|
662
|
-
], FsFormDirective.prototype, "valid", void 0);
|
|
663
|
-
__decorate([
|
|
664
|
-
Output(),
|
|
665
|
-
__metadata("design:type", EventEmitter)
|
|
666
|
-
], FsFormDirective.prototype, "submitted", void 0);
|
|
667
|
-
__decorate([
|
|
668
|
-
Output(),
|
|
669
|
-
__metadata("design:type", EventEmitter)
|
|
670
|
-
], FsFormDirective.prototype, "reseted", void 0);
|
|
671
|
-
__decorate([
|
|
672
|
-
Output(),
|
|
673
|
-
__metadata("design:type", EventEmitter)
|
|
674
|
-
], FsFormDirective.prototype, "cleared", void 0);
|
|
675
|
-
__decorate([
|
|
676
|
-
HostBinding('class.fs-form'),
|
|
677
|
-
__metadata("design:type", Object)
|
|
678
|
-
], FsFormDirective.prototype, "fsformClass", void 0);
|
|
679
|
-
__decorate([
|
|
680
|
-
ContentChildren(FsFormDialogCloseDirective, { descendants: true }),
|
|
681
|
-
__metadata("design:type", QueryList)
|
|
682
|
-
], FsFormDirective.prototype, "formDialogClose", void 0);
|
|
683
|
-
__decorate([
|
|
684
|
-
ContentChildren(MatTabGroup, { descendants: true }),
|
|
685
|
-
__metadata("design:type", QueryList)
|
|
686
|
-
], FsFormDirective.prototype, "_tabGroups", void 0);
|
|
687
|
-
FsFormDirective = __decorate([
|
|
688
|
-
Directive({
|
|
689
|
-
selector: '[fsForm]',
|
|
690
|
-
}),
|
|
691
|
-
__param(0, Inject(NgForm)),
|
|
692
|
-
__param(6, Optional()), __param(6, Inject(MatDialogRef)),
|
|
693
|
-
__param(7, Optional()), __param(7, Inject(DrawerRef)),
|
|
694
|
-
__metadata("design:paramtypes", [NgForm,
|
|
695
|
-
FsForm,
|
|
696
|
-
ElementRef,
|
|
697
|
-
FsMessage,
|
|
698
|
-
FsPrompt,
|
|
699
|
-
NgZone,
|
|
700
|
-
MatDialogRef,
|
|
701
|
-
DrawerRef])
|
|
702
|
-
], FsFormDirective);
|
|
703
|
-
return FsFormDirective;
|
|
704
|
-
}());
|
|
705
|
-
export { FsFormDirective };
|
|
706
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZmlyZXN0aXRjaC9mb3JtLyIsInNvdXJjZXMiOlsiYXBwL2RpcmVjdGl2ZXMvZm9ybS9mb3JtLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNULGFBQWEsR0FDZCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQVUsV0FBVyxFQUFnQixNQUFNLHdCQUF3QixDQUFDO0FBRTNFLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFL0MsT0FBTyxFQUNMLGVBQWUsRUFDZixLQUFLLEVBQ0wsU0FBUyxFQUNULEdBQUcsRUFDSCxZQUFZLEVBRVosRUFBRSxFQUNGLE9BQU8sRUFDUCxVQUFVLEVBQ1gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBQ04sS0FBSyxFQUNMLEdBQUcsRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcs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SUE2dEJDO1NBN3RCWSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgTWF0VGFiLCBNYXRUYWJHcm91cCwgTWF0VGFiSGVhZGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XG5cbmltcG9ydCB7IEZzTWVzc2FnZSwgTWVzc2FnZU1vZGUgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcbmltcG9ydCB7IEZzUHJvbXB0IH0gZnJvbSAnQGZpcmVzdGl0Y2gvcHJvbXB0JztcbmltcG9ydCB7IGd1aWQgfSBmcm9tICdAZmlyZXN0aXRjaC9jb21tb24nO1xuaW1wb3J0IHsgRHJhd2VyUmVmIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZHJhd2VyJztcblxuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBkZWZlcixcbiAgZnJvbUV2ZW50LFxuICBpaWYsXG4gIGlzT2JzZXJ2YWJsZSxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIFN1YmplY3QsXG4gIHRocm93RXJyb3Jcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBjYXRjaEVycm9yLFxuICBkZWxheSxcbiAgZmlsdGVyLFxuICBmaXJzdCxcbiAgbWFwLFxuICBtZXJnZU1hcCxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFwXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgY29uZmlybVVuc2F2ZWQgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2NvbmZpcm0tdW5zYXZlZCc7XG5pbXBvcnQgeyBGc0Zvcm1EaWFsb2dDbG9zZURpcmVjdGl2ZSB9IGZyb20gJy4uL2Zvcm0tZGlhbG9nLWNsb3NlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBGc1N1Ym1pdEJ1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL3N1Ym1pdC1idXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IENvbmZpcm1Db25maWcsIFN1Ym1pdHRlZEV2ZW50LCBDb25maXJtVGFiR3JvdXAgfSBmcm9tICcuLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29uZmlybVJlc3VsdCB9IGZyb20gJy4vLi4vLi4vZW51bXMvY29uZmlybS1yZXN1bHQnO1xuaW1wb3J0IHsgRnNGb3JtIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZnNmb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VibWl0RXZlbnQgfSBmcm9tICcuLy4uLy4uL2ludGVyZmFjZXMvc3VibWl0LWV2ZW50JztcbmltcG9ydCB7IEZvcm1TdGF0dXMgfSBmcm9tICcuLy4uLy4uL2VudW1zL2Zvcm0tc3RhdHVzJztcbmltcG9ydCB7IGNvbmZpcm1SZXN1bHRDb250aW51ZSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvY29uZmlybS1yZXN1bHQtY29udGludWUnO1xuaW1wb3J0IHsgZ2V0Rm9ybUVycm9ycyB9IGZyb20gJy4uLy4uL2hlbHBlcnMvZ2V0LWZvcm0tZXJyb3JzJztcblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZnNGb3JtXScsXG59KVxuZXhwb3J0IGNsYXNzIEZzRm9ybURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3cmFwcGVyU2VsZWN0b3IgPSAnLmZzLWZvcm0td3JhcHBlciwubWF0LWZvcm0tZmllbGQnO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtZXNzYWdlU2VsZWN0b3IgPSAnLmZzLWZvcm0tbWVzc2FnZSwubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXInO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoaW50U2VsZWN0b3IgPSAnLmZzLWZvcm0taGludCwubWF0LWZvcm0tZmllbGQtaGludC13cmFwcGVyJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbGFiZWxTZWxlY3RvciA9ICcuZnMtZm9ybS1sYWJlbCwubWF0LWZvcm0tZmllbGQtbGFiZWwnO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhdXRvY29tcGxldGUgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvcnRjdXRzID0gdHJ1ZTsgLy8gQ3RybCArIHNcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29uZmlybTogQ29uZmlybUNvbmZpZyB8IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb25maXJtRGlhbG9nID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29uZmlybURyYXdlciA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNvbmZpcm1Ccm93c2VyID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29uZmlybVRhYnMgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkaXJ0eVN1Ym1pdEJ1dHRvbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHN1Ym1pdDogKGV2ZW50OiBTdWJtaXRFdmVudCkgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzdWNjZXNzRGVsYXkgPSAwO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlcnJvckRlbGF5ID0gMTAwMDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdGFiR3JvdXA6IE1hdFRhYkdyb3VwO1xuXG4gIEBPdXRwdXQoJ2ZzRm9ybScpXG4gIHB1YmxpYyBzdWJtaXRFdmVudDogRXZlbnRFbWl0dGVyPFN1Ym1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGludmFsaWQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyB2YWxpZDogRXZlbnRFbWl0dGVyPFN1Ym1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHN1Ym1pdHRlZDogRXZlbnRFbWl0dGVyPFN1Ym1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHJlc2V0ZWQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBjbGVhcmVkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZnMtZm9ybScpXG4gIHB1YmxpYyBmc2Zvcm1DbGFzcyA9IHRydWU7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihGc0Zvcm1EaWFsb2dDbG9zZURpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBwdWJsaWMgZm9ybURpYWxvZ0Nsb3NlOiBRdWVyeUxpc3Q8RnNGb3JtRGlhbG9nQ2xvc2VEaXJlY3RpdmU+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0VGFiR3JvdXAsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgcHJpdmF0ZSBfdGFiR3JvdXBzOiBRdWVyeUxpc3Q8TWF0VGFiR3JvdXA+ID0gbmV3IFF1ZXJ5TGlzdCgpO1xuXG4gIHByaXZhdGUgX3N1Ym1pdEJ1dHRvbnM6IFF1ZXJ5TGlzdDxGc1N1Ym1pdEJ1dHRvbkRpcmVjdGl2ZT4gPSBuZXcgUXVlcnlMaXN0KCk7XG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29udHJvbDtcbiAgcHJpdmF0ZSBfYWN0aXZlU3VibWl0QnV0dG9uOiBGc1N1Ym1pdEJ1dHRvbkRpcmVjdGl2ZTtcbiAgcHJpdmF0ZSBfZGlhbG9nQmFja2Ryb3BFc2NhcGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc25hcHNob3Q6IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9ID0ge307XG4gIHByaXZhdGUgX3N0YXR1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KEZvcm1TdGF0dXMuVmFsaWQpO1xuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChOZ0Zvcm0pXG4gICAgcHVibGljIG5nRm9ybTogTmdGb3JtLFxuICAgIHByaXZhdGUgX2Zvcm06IEZzRm9ybSxcbiAgICBwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgX21lc3NhZ2U6IEZzTWVzc2FnZSxcbiAgICBwcml2YXRlIF9wcm9tcHQ6IEZzUHJvbXB0LFxuICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lLFxuXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChNYXREaWFsb2dSZWYpXG4gICAgcHJpdmF0ZSBfZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8YW55PixcblxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRHJhd2VyUmVmKVxuICAgIHByaXZhdGUgX2RyYXdlclJlZjogRHJhd2VyUmVmPGFueT4sXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHN1Ym1pdHRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gRm9ybVN0YXR1cy5TdWJtaXR0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBjb21wbGV0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXMkLmdldFZhbHVlKCkgPT09IEZvcm1TdGF0dXMuQ29tcGxldGluZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9zdWJtaXRFdmVudCgpOiBTdWJtaXRFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nRm9ybTogdGhpcy5uZ0Zvcm0sXG4gICAgICBzdWJtaXR0ZXI6IHRoaXMuX3N1Ym1pdHRlcixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2Zvcm1WYWxpZFN0YXRlJCgpOiBPYnNlcnZhYmxlPFN1Ym1pdHRlZEV2ZW50PiB7XG4gICAgdGhpcy5fZm9ybS5icm9hZGNhc3QoJ3ZhbGlkJywgdGhpcy5fc3VibWl0RXZlbnQpO1xuICAgIHRoaXMuc3VibWl0RXZlbnQuZW1pdCh0aGlzLl9zdWJtaXRFdmVudCk7XG4gICAgdGhpcy52YWxpZC5lbWl0KHRoaXMuX3N1Ym1pdEV2ZW50KTtcblxuICAgIGNvbnN0IHN1Ym1pdHRlZEV2ZW50OiBTdWJtaXR0ZWRFdmVudCA9IHtcbiAgICAgIG5nRm9ybTogdGhpcy5uZ0Zvcm0sXG4gICAgICBzdWJtaXR0ZXI6IHRoaXMuX3N1Ym1pdHRlcixcbiAgICAgIHJlc3BvbnNlOiBudWxsXG4gICAgfTtcblxuICAgIGlmICghdGhpcy5zdWJtaXQpIHtcbiAgICAgIHJldHVybiBvZihzdWJtaXR0ZWRFdmVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdWJtaXQodGhpcy5fc3VibWl0RXZlbnQpO1xuXG4gICAgaWYgKCFpc09ic2VydmFibGUocmVzdWx0KSkge1xuICAgICAgcmV0dXJuIG9mKHN1Ym1pdHRlZEV2ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHN1Ym1pdHRlZEV2ZW50LnJlc3BvbnNlID0gcmVzcG9uc2U7XG5cbiAgICAgICAgICByZXR1cm4gc3VibWl0dGVkRXZlbnQ7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2Zvcm1JbnZhbGlkU3RhdGUkKCk6IE9ic2VydmFibGU8bmV2ZXI+IHtcbiAgICB0aGlzLl9mb3JtLmJyb2FkY2FzdCgnaW52YWxpZCcsIHRoaXMuX3N1Ym1pdEV2ZW50KTtcblxuICAgIGlmICh0aGlzLmludmFsaWQpIHtcbiAgICAgIHRoaXMuaW52YWxpZC5lbWl0KHRoaXMuX3N1Ym1pdEV2ZW50KTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gJ0NoYW5nZXMgbm90IHNhdmVkLiBQbGVhc2UgcmV2aWV3IGVycm9ycyBoaWdobGlnaHRlZCBpbiByZWQuJztcbiAgICB0aGlzLl9tZXNzYWdlLmVycm9yKG1lc3NhZ2UsIHsgbW9kZTogTWVzc2FnZU1vZGUuVG9hc3QgfSk7XG5cbiAgICBjb25zdCBlbCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubmctaW52YWxpZCcpO1xuXG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aHJvd0Vycm9yKCdGb3JtIHZhbGlkYXRpb24gZXJyb3InKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9zdWJtaXR0ZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uXG4gICAgICA/IHRoaXMuX2FjdGl2ZVN1Ym1pdEJ1dHRvbi5uYW1lXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fcmVnaXN0ZXJDb25maXJtRGlhbG9nQmFja2Ryb3BFc2NhcGUoKTtcbiAgICB0aGlzLl9saXN0ZW5Ib3RLZXlzKCk7XG4gICAgdGhpcy5fbGlzdGVuV2luZG93Q2xvc2UoKTtcbiAgICB0aGlzLl9saXN0ZW5TdWJtaXQoKTtcblxuICAgIGlmICghdGhpcy5hdXRvY29tcGxldGUpIHtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyQXV0b2NvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlcy5jb25maXJtKSB7XG4gICAgICB0aGlzLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29uZmlybSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29uZmlybURpYWxvZ0Nsb3NlKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJDb25maXJtRHJhd2VyQ2xvc2UoKTtcbiAgICB0aGlzLl9yZWdpc3RlckNvbmZpcm1UYWJzKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJEcmF3ZXJDbG9zZSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyRGlydHlTdWJtaXRCdXR0b24oKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVTbmFwc2hvdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zbmFwc2hvdCA9IHRoaXMubmdGb3JtLnZhbHVlO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLnJlc2V0Rm9ybSgpO1xuXG4gICAgT2JqZWN0LmtleXModGhpcy5uZ0Zvcm0uY29udHJvbHMpXG4gICAgICAuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLm5nRm9ybS5jb250cm9sc1tuYW1lXTtcbiAgICAgICAgY29udHJvbC5yZXNldCh0aGlzLl9zbmFwc2hvdFtuYW1lXSk7XG4gICAgICB9KTtcbiAgICBcbiAgICB0aGlzLnJlc2V0ZWQuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLnJlc2V0Rm9ybSgpO1xuICAgIHRoaXMuY2xlYXJlZC5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgZGlydHkoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0Zvcm0uZm9ybS5tYXJrQXNEaXJ0eSgpO1xuICAgIHRoaXMuX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpO1xuICB9XG5cbiAgcHVibGljIHRyaWdnZXJTdWJtaXQoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0Zvcm0ubmdTdWJtaXQubmV4dCgpO1xuICB9XG5cbiAgcHVibGljIHRyaWdnZXJDb25maXJtKCk6IE9ic2VydmFibGU8Q29uZmlybVJlc3VsdD4ge1xuICAgIGNvbnN0IHN1Ym1pdHRlZCA9IHRoaXMuc3VibWl0dGluZyA/IHRoaXMuc3VibWl0dGVkLmFzT2JzZXJ2YWJsZSgpIDogb2Yoe30pO1xuXG4gICAgcmV0dXJuIHN1Ym1pdHRlZFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIG1lcmdlTWFwKCgpID0+IGNvbmZpcm1VbnNhdmVkKHRoaXMsIHRoaXMuX3Byb21wdCkpLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBlbmFibGUoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0Zvcm0uY29udHJvbC5lbmFibGUoKTtcblxuICAgIHRoaXMuX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpO1xuICB9XG5cbiAgcHVibGljIGRpc2FibGUoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0Zvcm0uY29udHJvbC5kaXNhYmxlKCk7XG5cbiAgICB0aGlzLl9zdWJtaXRCdXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgYnV0dG9uLmRpc2FibGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRTdWJtaXRCdXR0b24oc3VibWl0QnV0dG9uOiBGc1N1Ym1pdEJ1dHRvbkRpcmVjdGl2ZSk6IHZvaWQge1xuICAgIHRoaXMuX3N1Ym1pdEJ1dHRvbnMucmVzZXQoXG4gICAgICBbXG4gICAgICAgIC4uLnRoaXMuX3N1Ym1pdEJ1dHRvbnMudG9BcnJheSgpLFxuICAgICAgICBzdWJtaXRCdXR0b24sXG4gICAgICBdKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVTdWJtaXRCdXR0b24oc3VibWl0QnV0dG9uOiBGc1N1Ym1pdEJ1dHRvbkRpcmVjdGl2ZSk6IHZvaWQge1xuICAgIHRoaXMuX3N1Ym1pdEJ1dHRvbnMucmVzZXQoXG4gICAgICBbXG4gICAgICAgIC4uLnRoaXMuX3N1Ym1pdEJ1dHRvbnMudG9BcnJheSgpXG4gICAgICAgIC5maWx0ZXIoKHN1Ym1pdEJ1dHRvbl8pID0+IChzdWJtaXRCdXR0b24gIT09IHN1Ym1pdEJ1dHRvbl8pKSxcbiAgICAgIF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuU3VibWl0KCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtXG4gICAgICAubmdTdWJtaXRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pLFxuICAgICAgICBmaWx0ZXIoKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBbIEZvcm1TdGF0dXMuVmFsaWQsIEZvcm1TdGF0dXMuSW52YWxpZCBdXG4gICAgICAgICAgICAuaW5jbHVkZXModGhpcy5fc3RhdHVzJC5nZXRWYWx1ZSgpKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9tYXJrQ29udHJvbHNBc1RvdWNoZWRBbmRVcGRhdGVWYWxpZGl0eSgpKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2Jyb2FkY2FzdFN1Ym1pdHRpbmdFdmVudHMoKSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl93YWl0VW50aWxTdGF0dXNQZW5kaW5nKCkpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fc2V0dXBBY3RpdmVTdWJtaXRCdXR0b24oKSksXG4gICAgICAgIG1lcmdlTWFwKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZ0Zvcm0uc3RhdHVzID09PSAnSU5WQUxJRCdcbiAgICAgICAgICAgID8gdGhpcy5fZm9ybUludmFsaWRTdGF0ZSRcbiAgICAgICAgICAgIDogdGhpcy5fZm9ybVZhbGlkU3RhdGUkO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZSwgc291cmNlJCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yKGUpO1xuXG4gICAgICAgICAgcmV0dXJuIHNvdXJjZSQ7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKHN1Ym1pdHRlZEV2ZW50OiBTdWJtaXR0ZWRFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2NvbXBsZXRlU3VibWl0KHRydWUsIHN1Ym1pdHRlZEV2ZW50KTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge30pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuV2luZG93Q2xvc2UoKTogdm9pZCB7XG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ2JlZm9yZXVubG9hZCcpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb25maXJtICYmIHRoaXMuY29uZmlybUJyb3dzZXIgJiYgdGhpcy5uZ0Zvcm0uZGlydHkpIHtcbiAgICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbkhvdEtleXMoKTogdm9pZCB7XG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ2tleWRvd24nKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2RpYWxvZ0JhY2tkcm9wRXNjYXBlICYmIGV2ZW50LmNvZGUgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICBjb25zdCBkaWFsb2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLl9kaWFsb2dSZWYuaWQpO1xuICAgICAgICAgICAgY29uc3QgcGF0aHMgPSBldmVudC5jb21wb3NlZFBhdGgoKTtcblxuICAgICAgICAgICAgaWYgKHBhdGhzKSB7XG4gICAgICAgICAgICAgIHBhdGhzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRpYWxvZyA9PT0gaXRlbSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1DbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQuY29kZSA9PT0gJ0tleVMnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zaG9ydGN1dHMpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnRJbkZvcm0oZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5nRm9ybS5uZ1N1Ym1pdC5uZXh0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZm9ybUNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpcm0gJiYgdGhpcy5jb25maXJtRGlhbG9nKSB7XG4gICAgICB0aGlzLnRyaWdnZXJDb25maXJtKClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChyZXN1bHQpID0+IGNvbmZpcm1SZXN1bHRDb250aW51ZShyZXN1bHQpKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gQ29uZmlybVJlc3VsdC5QcmlzdGluZSB8fCByZXN1bHQgPT09IENvbmZpcm1SZXN1bHQuRGlzY2FyZFxuICAgICAgICAgICAgICA/IG9mKG51bGwpXG4gICAgICAgICAgICAgIDogdGhpcy5zdWJtaXR0ZWQuYXNPYnNlcnZhYmxlKCk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IFN1Ym1pdHRlZEV2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKHJlc3VsdD8ucmVzcG9uc2UpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZGlhbG9nUmVmLmNsb3NlKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyRGlhbG9nQ2xvc2UoZGlyZWN0aXZlOiBGc0Zvcm1EaWFsb2dDbG9zZURpcmVjdGl2ZSk6IHZvaWQge1xuICAgIGlmICghZGlyZWN0aXZlLnJlZ2lzdGVyZWQpIHtcbiAgICAgIGRpcmVjdGl2ZS5yZWdpc3RlcmVkID0gdHJ1ZTtcblxuICAgICAgZGlyZWN0aXZlLmNsaWNrZWQkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZm9ybUNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldEFjdGl2ZUJ1dHRvbigpOiBGc1N1Ym1pdEJ1dHRvbkRpcmVjdGl2ZSB7XG4gICAgY29uc3QgYWN0aXZlQnV0dG9uID0gdGhpcy5fc3VibWl0QnV0dG9ucy5maW5kKGJ1dHRvbiA9PiB7XG4gICAgICByZXR1cm4gYnV0dG9uLmFjdGl2ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBhY3RpdmVCdXR0b24gPyBhY3RpdmVCdXR0b24gOiB0aGlzLl9zdWJtaXRCdXR0b25zLmZpcnN0O1xuICB9XG5cbiAgcHJpdmF0ZSBfZWxlbWVudEluRm9ybShlbDogRWxlbWVudCk6IGJvb2xlYW4ge1xuXG4gICAgaWYgKGVsLmlzU2FtZU5vZGUodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChlbC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5fZWxlbWVudEluRm9ybShlbC5wYXJlbnRFbGVtZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9jb21wbGV0ZVN1Ym1pdChzdWNjZXNzLCBzdWJtaXRFdmVudDogU3VibWl0dGVkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgdGhpcy5uZ0Zvcm0uY29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgdGhpcy5jcmVhdGVTbmFwc2hvdCgpOyAgXG4gICAgICB0aGlzLnN1Ym1pdHRlZC5lbWl0KHN1Ym1pdEV2ZW50KTsgICAgXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Jlc2V0QnV0dG9ucygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9hY3RpdmVTdWJtaXRCdXR0b24pIHtcbiAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVN1Ym1pdEJ1dHRvbi5zdWNjZXNzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9hY3RpdmVTdWJtaXRCdXR0b24uZXJyb3IoKTtcbiAgICAgIH0gICAgICBcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5TdWJtaXR0ZWQpO1xuXG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLlN1Y2Nlc3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5FcnJvcik7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuQ29tcGxldGluZyk7XG5cbiAgICBjb25zdCByZXNldERlbGF5ID0gc3VjY2VzcyA/IHRoaXMuc3VjY2Vzc0RlbGF5IDogdGhpcy5lcnJvckRlbGF5O1xuXG4gICAgb2YodHJ1ZSlcbiAgICAucGlwZShcbiAgICAgIGRlbGF5KHJlc2V0RGVsYXkpLFxuICAgICAgZmlyc3QoKSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubmdGb3JtLmZvcm0uc3RhdHVzID09PSAnVkFMSUQnKSB7XG4gICAgICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLlZhbGlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLkludmFsaWQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZXNldEJ1dHRvbnMoKTtcbiAgICAgIHRoaXMuX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzZXRCdXR0b25zKCk6IHZvaWQge1xuICAgIHRoaXMuX3N1Ym1pdEJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24ucmVzZXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29uZmlybSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5mb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGNoYW5nZXMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlybSkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gT2JqZWN0LmtleXModGhpcy5fc25hcHNob3QpO1xuXG4gICAgICAgICAgT2JqZWN0LmtleXMoY2hhbmdlcylcbiAgICAgICAgICAgIC5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc25hcHNob3RbbmFtZV0gPSBjaGFuZ2VzW25hbWVdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckRyYXdlckNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kcmF3ZXJSZWYpIHtcbiAgICAgIHRoaXMuX2RyYXdlclJlZi5jbG9zZVN0YXJ0JFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN1Ym1pdHRpbmcpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0dXMkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgZmlsdGVyKChzdGF0dXMpID0+IHN0YXR1cyA9PT0gRm9ybVN0YXR1cy5TdWNjZXNzIHx8IHN0YXR1cyA9PT0gRm9ybVN0YXR1cy5FcnJvciksXG4gICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChzdGF0dXMpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gRm9ybVN0YXR1cy5TdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XG4gICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckNvbmZpcm1EcmF3ZXJDbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZHJhd2VyUmVmKSB7XG4gICAgICB0aGlzLl9kcmF3ZXJSZWYuY2xvc2VTdGFydCRcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgICByZXR1cm4gaWlmKFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5jb25maXJtICYmIHRoaXMuY29uZmlybURyYXdlcixcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckNvbmZpcm0oKVxuICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHJlc3VsdCkgPT4gY29uZmlybVJlc3VsdENvbnRpbnVlKHJlc3VsdCkpLFxuICAgICAgICAgICAgICAgIHRhcCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGRlZmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XG4gICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIClcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb25maXJtVGFicygpOiB2b2lkIHtcbiAgICBpZih0aGlzLnRhYkdyb3VwKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyQ29uZmlybVRhYkdyb3VwKHRoaXMudGFiR3JvdXApO1xuICAgIH1cblxuICAgIHRoaXMucmVnaXN0ZXJDb25maXJtVGFiR3JvdXBzKHRoaXMuX3RhYkdyb3Vwcy50b0FycmF5KCkpO1xuXG4gICAgdGhpcy5fdGFiR3JvdXBzLmNoYW5nZXNcbiAgICAucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JClcbiAgICApXG4gICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnJlZ2lzdGVyQ29uZmlybVRhYkdyb3Vwcyh0aGlzLl90YWJHcm91cHMudG9BcnJheSgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckNvbmZpcm1UYWJHcm91cHModGFiR3JvdXBzOiBNYXRUYWJHcm91cFtdKTogdm9pZCB7XG4gICAgdGFiR3JvdXBzLmZvckVhY2goKHRhYkdyb3VwOiBNYXRUYWJHcm91cCkgPT4ge1xuICAgICAgdGhpcy5yZWdpc3RlckNvbmZpcm1UYWJHcm91cCh0YWJHcm91cCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJDb25maXJtVGFiR3JvdXAodGFiR3JvdXA6IE1hdFRhYkdyb3VwKTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlybVRhYkdyb3VwID0gdGFiR3JvdXAgYXMgQ29uZmlybVRhYkdyb3VwO1xuICAgIGlmICghY29uZmlybVRhYkdyb3VwLl9vcmlnaW5hbEhhbmRsZUNsaWNrKSB7XG4gICAgICBjb25maXJtVGFiR3JvdXAuX29yaWdpbmFsSGFuZGxlQ2xpY2sgPSB0YWJHcm91cC5faGFuZGxlQ2xpY2s7XG4gICAgICBjb25maXJtVGFiR3JvdXAuX2hhbmRsQ2xpY2skID0gbmV3IFN1YmplY3Q8eyB0YWI6IE1hdFRhYjsgdGFiSGVhZGVyOiBNYXRUYWJIZWFkZXI7IGlkeDogbnVtYmVyIH0+KCk7XG4gICAgICBjb25maXJtVGFiR3JvdXAuX2hhbmRsZUNsaWNrID0gKHRhYjogTWF0VGFiLCB0YWJIZWFkZXI6IE1hdFRhYkhlYWRlciwgaWR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYoY29uZmlybVRhYkdyb3VwLl9oYW5kbENsaWNrJC5vYnNlcnZlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uZmlybVRhYkdyb3VwLl9oYW5kbENsaWNrJC5uZXh0KHsgdGFiLCB0YWJIZWFkZXIsIGlkeH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmZpcm1UYWJHcm91cC5fb3JpZ2luYWxIYW5kbGVDbGljayh0YWIsIHRhYkhlYWRlciwgaWR4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbmZpcm1UYWJHcm91cC5faGFuZGxDbGljayRcbiAgICAucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc3VibWl0dGluZykge1xuICAgICAgICBpZiAodGhpcy5jb25maXJtICYmIHRoaXMuY29uZmlybVRhYnMpIHtcbiAgICAgICAgICB0aGlzLnRyaWdnZXJDb25maXJtKClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb25maXJtUmVzdWx0Q29udGludWUocmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIGNvbmZpcm1UYWJHcm91cC5zZWxlY3RlZEluZGV4ID0gZXZlbnQuaWR4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25maXJtVGFiR3JvdXAuX29yaWdpbmFsSGFuZGxlQ2xpY2soZXZlbnQudGFiLCBldmVudC50YWJIZWFkZXIsIGV2ZW50LmlkeCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29uZmlybURpYWxvZ0Nsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kaWFsb2dSZWYpIHtcbiAgICAgIHRoaXMuZm9ybURpYWxvZ0Nsb3NlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyRGlhbG9nQ2xvc2UoaXRlbSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5mb3JtRGlhbG9nQ2xvc2UuY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICAgIGUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICB0aGlzLl9yZWdpc3RlckRpYWxvZ0Nsb3NlKGl0ZW0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29uZmlybURpYWxvZ0JhY2tkcm9wRXNjYXBlKCk6IHZvaWQge1xuICAgIHRoaXMuX2RpYWxvZ0JhY2tkcm9wRXNjYXBlID0gdGhpcy5fZGlhbG9nUmVmICYmIHRoaXMuX2RpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgIT09IHRydWU7XG5cbiAgICBpZiAodGhpcy5fZGlhbG9nUmVmICYmICF0aGlzLl9kaWFsb2dSZWYuZGlzYWJsZUNsb3NlKSB7XG4gICAgICB0aGlzLl9kaWFsb2dSZWYuZGlzYWJsZUNsb3NlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2RpYWxvZ1JlZi5iYWNrZHJvcENsaWNrKClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fZm9ybUNsb3NlKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fZGVzdHJveSRcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9kaWFsb2dSZWYuZGlzYWJsZUNsb3NlID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckF1dG9jb21wbGV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWdpc3RlckNvbnRyb2wgPSB0aGlzLm5nRm9ybS5mb3JtLnJlZ2lzdGVyQ29udHJvbC5iaW5kKHRoaXMubmdGb3JtLmZvcm0pO1xuXG4gICAgdGhpcy5uZ0Zvcm0uZm9ybS5yZWdpc3RlckNvbnRyb2wgPSAobmFtZTogc3RyaW5nLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcblxuICAgICAgY29uc3QgZWw6IEVsZW1lbnQgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT0nJHtuYW1lfSddYCk7XG5cbiAgICAgIGlmIChlbCkge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBuYW1lICsgJ18nICsgZ3VpZCgpKTtcblxuICAgICAgICBpZiAoIWVsLmdldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJykpIHtcbiAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScsICdub25lJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyQ29udHJvbChuYW1lLCBjb250cm9sKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckRpcnR5U3VibWl0QnV0dG9uKCk6IHZvaWQge1xuXG4gICAgaWYgKCF0aGlzLm5nRm9ybSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubmdGb3JtLmZvcm0udmFsdWVDaGFuZ2VzXG4gICAgLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgIClcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fc3VibWl0QnV0dG9ucy5jaGFuZ2VzXG4gICAgLnBpcGUoXG4gICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgIClcbiAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk6IHZvaWQge1xuICAgIHRoaXMuX3N1Ym1pdEJ1dHRvbnNcbiAgICAuZm9yRWFjaCgoc3VibWl0QnV0dG9uOiBGc1N1Ym1pdEJ1dHRvbkRpcmVjdGl2ZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpcm0gfHwgIXRoaXMuZGlydHlTdWJtaXRCdXR0b24gfHwgdGhpcy5uZ0Zvcm0uZGlydHkgfHwgIXN1Ym1pdEJ1dHRvbi5kaXJ0eVN1Ym1pdCkge1xuICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5lbmFibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJtaXRCdXR0b24uZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2Jyb2FkY2FzdFN1Ym1pdHRpbmdFdmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuU3VibWl0dGluZyk7XG4gICAgdGhpcy5fZm9ybS5icm9hZGNhc3QoJ3N1Ym1pdCcsIHRoaXMubmdGb3JtKTtcbiAgfVxuXG4gIHByaXZhdGUgX21hcmtDb250cm9sc0FzVG91Y2hlZEFuZFVwZGF0ZVZhbGlkaXR5KCk6IHZvaWQge1xuICAgIE9iamVjdC52YWx1ZXModGhpcy5uZ0Zvcm0uY29udHJvbHMpXG4gICAgLmZvckVhY2goY29udHJvbCA9PiB7XG4gICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0dXBBY3RpdmVTdWJtaXRCdXR0b24oKTogdm9pZCB7XG4gICAgdGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uID0gdGhpcy5fZ2V0QWN0aXZlQnV0dG9uKCk7XG4gICAgdGhpcy5fcmVzZXRCdXR0b25zKCk7XG5cbiAgICBpZiAodGhpcy5fYWN0aXZlU3VibWl0QnV0dG9uKSB7XG4gICAgICB0aGlzLl9hY3RpdmVTdWJtaXRCdXR0b24ucHJvY2VzcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3dhaXRVbnRpbFN0YXR1c1BlbmRpbmcoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5uZ0Zvcm0uc3RhdHVzQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0aGlzLm5nRm9ybS5zdGF0dXMpLFxuICAgICAgICBmaXJzdCgoc3RhdGUpID0+IHN0YXRlICE9PSAnUEVORElORycpLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUVycm9yKGU6IFN1Ym1pdHRlZEV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coJyVjIEZvcm0gU3VibWl0ICcsICAnY29sb3I6IHdoaXRlOyBiYWNrZ3JvdW5kLWNvbG9yOiAjRDMzRjQ5JywgICdFcnJvciBvY2N1cmVkJyk7XG5cbiAgICBjb25zb2xlLmdyb3VwKCdFcnJvciBEZXRhaWxzOicpO1xuICAgIGNvbnNvbGUubG9nKCdNZXNzYWdlOiAnLCBlKTtcbiAgICBjb25zb2xlLmxvZygnRm9ybVJlZjogJywgdGhpcyk7XG5cbiAgICBpZiAodGhpcy5uZ0Zvcm0uaW52YWxpZCkge1xuICAgICAgY29uc3QgZXJyb3JzID0gZ2V0Rm9ybUVycm9ycyh0aGlzLm5nRm9ybS5jb250cm9sLCBudWxsKTtcbiAgICAgIGNvbnNvbGUubG9nKCdWYWxpZGF0aW9uIEVycm9yczogJywgZXJyb3JzKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG5cbiAgICB0aGlzLl9jb21wbGV0ZVN1Ym1pdChmYWxzZSwgbnVsbCk7XG4gIH1cblxufVxuIl19
|