@valtimo/form-view-model 12.7.0 → 12.9.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/esm2022/lib/components/form-view-model/form-view-model.component.mjs +127 -106
- package/esm2022/lib/services/view-model.service.mjs +8 -5
- package/fesm2022/valtimo-form-view-model.mjs +134 -111
- package/fesm2022/valtimo-form-view-model.mjs.map +1 -1
- package/lib/components/form-view-model/form-view-model.component.d.ts +14 -4
- package/lib/components/form-view-model/form-view-model.component.d.ts.map +1 -1
- package/lib/services/view-model.service.d.ts +4 -4
- package/lib/services/view-model.service.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -15,18 +15,20 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
|
|
17
17
|
import moment from 'moment';
|
|
18
|
-
import { BehaviorSubject,
|
|
18
|
+
import { BehaviorSubject, combineLatest, filter, Subject, switchMap, take, tap, } from 'rxjs';
|
|
19
19
|
import { FormioModule, } from '@formio/angular';
|
|
20
20
|
import { distinctUntilChanged, map } from 'rxjs/operators';
|
|
21
21
|
import { deepmerge } from 'deepmerge-ts';
|
|
22
|
+
import { HttpErrorResponse } from '@angular/common/http';
|
|
22
23
|
import { CommonModule } from '@angular/common';
|
|
23
|
-
import {
|
|
24
|
+
import { LayerModule } from 'carbon-components-angular';
|
|
24
25
|
import * as i0 from "@angular/core";
|
|
25
26
|
import * as i1 from "../../services";
|
|
26
27
|
import * as i2 from "@ngx-translate/core";
|
|
27
28
|
import * as i3 from "@valtimo/components";
|
|
28
29
|
import * as i4 from "@angular/common";
|
|
29
30
|
import * as i5 from "@formio/angular";
|
|
31
|
+
import * as i6 from "carbon-components-angular";
|
|
30
32
|
moment.defaultFormat = 'DD MMM YYYY HH:mm';
|
|
31
33
|
export class FormViewModelComponent {
|
|
32
34
|
set options(optionsValue) {
|
|
@@ -40,6 +42,8 @@ export class FormViewModelComponent {
|
|
|
40
42
|
const form = {
|
|
41
43
|
loadInitialViewModel: () => instance.loadInitialViewModel(),
|
|
42
44
|
updateViewModel: () => instance.updateViewModel(),
|
|
45
|
+
loadInitialStartFormViewModel: () => instance.loadInitialViewModelForStartForm(),
|
|
46
|
+
updateViewStartFormModel: () => instance.updateViewModelForStartForm(),
|
|
43
47
|
...formValue,
|
|
44
48
|
};
|
|
45
49
|
this.form$.next(form);
|
|
@@ -53,6 +57,9 @@ export class FormViewModelComponent {
|
|
|
53
57
|
set isStartForm(isStartFormValue) {
|
|
54
58
|
this.isStartForm$.next(isStartFormValue);
|
|
55
59
|
}
|
|
60
|
+
set documentId(documentId) {
|
|
61
|
+
this.documentId$.next(documentId);
|
|
62
|
+
}
|
|
56
63
|
set processDefinitionKey(processDefinitionKeyValue) {
|
|
57
64
|
this.processDefinitionKey$.next(processDefinitionKeyValue);
|
|
58
65
|
}
|
|
@@ -64,14 +71,15 @@ export class FormViewModelComponent {
|
|
|
64
71
|
this.translateService = translateService;
|
|
65
72
|
this.stateService = stateService;
|
|
66
73
|
this.formSubmit = new EventEmitter();
|
|
67
|
-
this.errors = [];
|
|
68
74
|
this.refreshForm = new EventEmitter();
|
|
69
75
|
this._preventNextPage = false;
|
|
70
76
|
this._preventPreviousPage = false;
|
|
71
77
|
this._isWizard = false;
|
|
78
|
+
this.pendingUpdateSubscription = null;
|
|
72
79
|
this.submission$ = new BehaviorSubject({});
|
|
73
80
|
this.form$ = new BehaviorSubject(undefined);
|
|
74
81
|
this.formName$ = new BehaviorSubject(undefined);
|
|
82
|
+
this.formErrors$ = new BehaviorSubject([]);
|
|
75
83
|
this.options$ = new BehaviorSubject(undefined);
|
|
76
84
|
this.taskInstanceId$ = new BehaviorSubject(undefined);
|
|
77
85
|
this.tokenSetInLocalStorage$ = new BehaviorSubject(false);
|
|
@@ -80,6 +88,7 @@ export class FormViewModelComponent {
|
|
|
80
88
|
this.focus$ = new BehaviorSubject(null);
|
|
81
89
|
this.loading$ = new BehaviorSubject(true);
|
|
82
90
|
this.isStartForm$ = new BehaviorSubject(false);
|
|
91
|
+
this.documentId$ = new BehaviorSubject(null);
|
|
83
92
|
this.processDefinitionKey$ = new BehaviorSubject(undefined);
|
|
84
93
|
this.documentDefinitionName$ = new BehaviorSubject(undefined);
|
|
85
94
|
this.updateForm = new Subject();
|
|
@@ -90,13 +99,14 @@ export class FormViewModelComponent {
|
|
|
90
99
|
},
|
|
91
100
|
});
|
|
92
101
|
this.formioOptions$ = combineLatest([
|
|
93
|
-
this.currentLanguage$,
|
|
94
102
|
this.options$,
|
|
95
103
|
this._overrideOptions$,
|
|
96
|
-
]).pipe(map(([
|
|
104
|
+
]).pipe(map(([options, overrideOptions]) => {
|
|
105
|
+
return deepmerge(options, overrideOptions);
|
|
106
|
+
}));
|
|
107
|
+
this.renderOptions$ = combineLatest([this.currentLanguage$]).pipe(map(([language]) => {
|
|
97
108
|
const formioTranslations = this.translateService.instant('formioTranslations');
|
|
98
|
-
|
|
99
|
-
...options,
|
|
109
|
+
return {
|
|
100
110
|
language,
|
|
101
111
|
...(typeof formioTranslations === 'object'
|
|
102
112
|
? {
|
|
@@ -107,7 +117,6 @@ export class FormViewModelComponent {
|
|
|
107
117
|
}
|
|
108
118
|
: {}),
|
|
109
119
|
};
|
|
110
|
-
return deepmerge(defaultOptions, overrideOptions);
|
|
111
120
|
}));
|
|
112
121
|
}
|
|
113
122
|
ngOnInit() {
|
|
@@ -118,20 +127,26 @@ export class FormViewModelComponent {
|
|
|
118
127
|
this.loadInitialViewModel();
|
|
119
128
|
}
|
|
120
129
|
this.focusSubscription = this.focus$
|
|
121
|
-
.pipe(
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
130
|
+
.pipe(filter(e => {
|
|
131
|
+
// We only want to handle blur events after entering an input
|
|
132
|
+
return !!e && e.target instanceof HTMLInputElement;
|
|
133
|
+
}))
|
|
134
|
+
.subscribe(() => {
|
|
135
|
+
this.pendingUpdateSubscription?.unsubscribe();
|
|
136
|
+
this.blurSubscription?.unsubscribe();
|
|
137
|
+
this.blurSubscription = this.blur$
|
|
138
|
+
.pipe(filter(e => {
|
|
139
|
+
// Filter out events where relatedTarget is not null.
|
|
140
|
+
// The relatedTarget will be null when no new input is focused.
|
|
141
|
+
return !e.relatedTarget;
|
|
142
|
+
}))
|
|
143
|
+
.subscribe(() => {
|
|
144
|
+
this.blurSubscription?.unsubscribe();
|
|
145
|
+
this.setWaitCursor(true);
|
|
146
|
+
this.updateForm.next(true);
|
|
132
147
|
});
|
|
133
148
|
});
|
|
134
|
-
this.updateSubscription = this.updateForm.
|
|
149
|
+
this.updateSubscription = this.updateForm.subscribe(() => {
|
|
135
150
|
if (this.isStartForm$.value) {
|
|
136
151
|
this.updateViewModelForStartForm();
|
|
137
152
|
}
|
|
@@ -141,64 +156,69 @@ export class FormViewModelComponent {
|
|
|
141
156
|
});
|
|
142
157
|
}
|
|
143
158
|
ngOnDestroy() {
|
|
144
|
-
this.
|
|
145
|
-
this.
|
|
159
|
+
this.blurSubscription?.unsubscribe();
|
|
160
|
+
this.focusSubscription?.unsubscribe();
|
|
161
|
+
this.updateSubscription?.unsubscribe();
|
|
162
|
+
this.pendingUpdateSubscription?.unsubscribe();
|
|
163
|
+
this.setWaitCursor(false);
|
|
146
164
|
}
|
|
147
165
|
beforeSubmitHook(instance) {
|
|
148
166
|
return (submission, callback) => instance.beforeSubmit(submission, callback);
|
|
149
167
|
}
|
|
150
168
|
beforeSubmit(submission, callback) {
|
|
169
|
+
this.pendingUpdateSubscription?.unsubscribe();
|
|
170
|
+
this.setWaitCursor(false);
|
|
151
171
|
combineLatest([
|
|
152
172
|
this.formName$,
|
|
153
173
|
this.taskInstanceId$,
|
|
154
174
|
this.processDefinitionKey$,
|
|
155
175
|
this.documentDefinitionName$,
|
|
156
176
|
this.isStartForm$,
|
|
177
|
+
this.documentId$,
|
|
157
178
|
])
|
|
158
|
-
.pipe(take(1), switchMap(([formName, taskInstanceId, processDefinitionKey, documentDefinitionName, isStartForm,]) => isStartForm
|
|
159
|
-
? this.viewModelService
|
|
160
|
-
|
|
161
|
-
|
|
179
|
+
.pipe(take(1), switchMap(([formName, taskInstanceId, processDefinitionKey, documentDefinitionName, isStartForm, documentId,]) => isStartForm
|
|
180
|
+
? this.viewModelService.submitViewModelForStartForm(formName, processDefinitionKey, documentId, documentDefinitionName, submission.data)
|
|
181
|
+
: this.viewModelService.submitViewModel(formName, taskInstanceId, submission.data)))
|
|
182
|
+
.subscribe({
|
|
183
|
+
next: _ => {
|
|
162
184
|
callback(null, submission);
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
this.
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
}), catchError(error => {
|
|
175
|
-
this.handleFormError(error);
|
|
176
|
-
callback({ message: ' ', component: null }, null);
|
|
177
|
-
return EMPTY; // return an empty observable to complete the stream
|
|
178
|
-
}))))
|
|
179
|
-
.subscribe();
|
|
185
|
+
},
|
|
186
|
+
error: err => {
|
|
187
|
+
this.handleSubmissionError(err, callback);
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
handleSubmissionError(error, callback) {
|
|
192
|
+
callback({ message: '', component: null, silent: true }, null);
|
|
193
|
+
if (error instanceof HttpErrorResponse) {
|
|
194
|
+
this.handleFormError(error);
|
|
195
|
+
}
|
|
180
196
|
}
|
|
181
197
|
handleFormError(error) {
|
|
182
198
|
const formInstance = this.formio.formio;
|
|
183
|
-
this.
|
|
184
|
-
if (error.error
|
|
199
|
+
this.formErrors$.next([]);
|
|
200
|
+
if (error.error?.componentErrors) {
|
|
201
|
+
const errors = [];
|
|
185
202
|
error.error.componentErrors.forEach(componentError => {
|
|
186
203
|
const component = formInstance.getComponent(componentError.component);
|
|
187
204
|
if (component == null) {
|
|
188
|
-
|
|
205
|
+
errors.push(componentError.message);
|
|
189
206
|
}
|
|
190
207
|
else {
|
|
191
|
-
|
|
208
|
+
// `true` makes the error dirty, setting the css class properly
|
|
209
|
+
component.setCustomValidity(componentError.message, true);
|
|
192
210
|
}
|
|
193
211
|
});
|
|
212
|
+
this.formErrors$.next(errors);
|
|
194
213
|
}
|
|
195
|
-
else {
|
|
214
|
+
else if (error.error?.error) {
|
|
196
215
|
const component = formInstance.getComponent(error.error?.component);
|
|
197
216
|
if (component == null) {
|
|
198
|
-
this.
|
|
217
|
+
this.formErrors$.next([error.error.error]);
|
|
199
218
|
}
|
|
200
219
|
else {
|
|
201
|
-
|
|
220
|
+
// `true` makes the error dirty, setting the css class properly
|
|
221
|
+
component.setCustomValidity(error.error.error, true);
|
|
202
222
|
}
|
|
203
223
|
}
|
|
204
224
|
}
|
|
@@ -247,36 +267,11 @@ export class FormViewModelComponent {
|
|
|
247
267
|
}))))
|
|
248
268
|
.subscribe();
|
|
249
269
|
}
|
|
250
|
-
updateViewModel() {
|
|
251
|
-
this.loading$
|
|
252
|
-
.pipe(take(1), switchMap(updating => {
|
|
253
|
-
if (!updating) {
|
|
254
|
-
this.loading$.next(true);
|
|
255
|
-
return combineLatest([this.formName$, this.taskInstanceId$, this.change$]).pipe(take(1), switchMap(([formName, taskInstanceId, change]) => this.viewModelService
|
|
256
|
-
.updateViewModel(formName, taskInstanceId, change.data, this.formio.formio.page, this._isWizard)
|
|
257
|
-
.pipe(tap({
|
|
258
|
-
next: viewModel => {
|
|
259
|
-
const submission = this.submission$.value;
|
|
260
|
-
submission.data = viewModel;
|
|
261
|
-
this.submission$.next(submission);
|
|
262
|
-
this.handlePageChange();
|
|
263
|
-
this.refreshForm.emit({ submission: submission });
|
|
264
|
-
this.loading$.next(false);
|
|
265
|
-
this.errors = [];
|
|
266
|
-
},
|
|
267
|
-
error: error => {
|
|
268
|
-
this.loading$.next(false);
|
|
269
|
-
this.handleFormError(error);
|
|
270
|
-
},
|
|
271
|
-
}))));
|
|
272
|
-
}
|
|
273
|
-
return of(null); // Fallback to return an observable if updating is true
|
|
274
|
-
}))
|
|
275
|
-
.subscribe();
|
|
276
|
-
}
|
|
277
270
|
loadInitialViewModelForStartForm() {
|
|
278
|
-
combineLatest([this.formName$, this.processDefinitionKey$])
|
|
279
|
-
.pipe(take(1), switchMap(([formName, processDefinitionKey]) => this.viewModelService
|
|
271
|
+
combineLatest([this.formName$, this.processDefinitionKey$, this.documentId$])
|
|
272
|
+
.pipe(take(1), switchMap(([formName, processDefinitionKey, documentId]) => this.viewModelService
|
|
273
|
+
.getViewModelForStartForm(formName, processDefinitionKey, documentId)
|
|
274
|
+
.pipe(tap(viewModel => {
|
|
280
275
|
this.submission$.next({ data: viewModel });
|
|
281
276
|
this.change$.pipe(take(1)).subscribe(() => {
|
|
282
277
|
this.loading$.next(false);
|
|
@@ -285,39 +280,63 @@ export class FormViewModelComponent {
|
|
|
285
280
|
}))))
|
|
286
281
|
.subscribe();
|
|
287
282
|
}
|
|
283
|
+
updateViewModel() {
|
|
284
|
+
this.pendingUpdateSubscription?.unsubscribe();
|
|
285
|
+
this.pendingUpdateSubscription = combineLatest([
|
|
286
|
+
this.formName$,
|
|
287
|
+
this.taskInstanceId$,
|
|
288
|
+
this.change$,
|
|
289
|
+
])
|
|
290
|
+
.pipe(take(1), switchMap(([formName, taskInstanceId, change]) => this.viewModelService
|
|
291
|
+
.updateViewModel(formName, taskInstanceId, change.data, this.formio.formio.page, this._isWizard)
|
|
292
|
+
.pipe(tap({
|
|
293
|
+
next: viewModel => this.handleViewModelUpdate(viewModel),
|
|
294
|
+
error: error => this.handleViewModelUpdateError(error),
|
|
295
|
+
}))))
|
|
296
|
+
.subscribe();
|
|
297
|
+
}
|
|
288
298
|
updateViewModelForStartForm() {
|
|
289
|
-
this.
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
this.loading$.next(false);
|
|
303
|
-
this.errors = [];
|
|
304
|
-
},
|
|
305
|
-
error: error => {
|
|
306
|
-
this.loading$.next(false);
|
|
307
|
-
this.handleFormError(error);
|
|
308
|
-
},
|
|
309
|
-
}))));
|
|
310
|
-
}
|
|
311
|
-
return of(null); // Fallback to return an observable if updating is true
|
|
312
|
-
}))
|
|
299
|
+
this.pendingUpdateSubscription?.unsubscribe();
|
|
300
|
+
this.pendingUpdateSubscription = combineLatest([
|
|
301
|
+
this.formName$,
|
|
302
|
+
this.processDefinitionKey$,
|
|
303
|
+
this.change$,
|
|
304
|
+
this.documentId$,
|
|
305
|
+
])
|
|
306
|
+
.pipe(take(1), switchMap(([formName, processDefinitionKey, change, documentId]) => this.viewModelService
|
|
307
|
+
.updateViewModelForStartForm(formName, processDefinitionKey, documentId, change.data, this.formio.formio.page, this._isWizard)
|
|
308
|
+
.pipe(tap({
|
|
309
|
+
next: viewModel => this.handleViewModelUpdate(viewModel),
|
|
310
|
+
error: error => this.handleViewModelUpdateError(error),
|
|
311
|
+
}))))
|
|
313
312
|
.subscribe();
|
|
314
313
|
}
|
|
314
|
+
handleViewModelUpdate(viewModel) {
|
|
315
|
+
const submission = this.submission$.value;
|
|
316
|
+
submission.data = viewModel;
|
|
317
|
+
this.submission$.next(submission);
|
|
318
|
+
this.handlePageChange();
|
|
319
|
+
this.refreshForm.emit({ submission });
|
|
320
|
+
this.pendingUpdateSubscription?.unsubscribe();
|
|
321
|
+
this.pendingUpdateSubscription = null;
|
|
322
|
+
this.formErrors$.next([]);
|
|
323
|
+
this.setWaitCursor(false);
|
|
324
|
+
}
|
|
325
|
+
handleViewModelUpdateError(error) {
|
|
326
|
+
this.pendingUpdateSubscription?.unsubscribe();
|
|
327
|
+
this.pendingUpdateSubscription = null;
|
|
328
|
+
this.handleFormError(error);
|
|
329
|
+
this.setWaitCursor(false);
|
|
330
|
+
}
|
|
331
|
+
setWaitCursor(enabled) {
|
|
332
|
+
document.body.style.cursor = enabled ? 'wait' : 'auto';
|
|
333
|
+
}
|
|
315
334
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormViewModelComponent, deps: [{ token: i1.ViewModelService }, { token: i2.TranslateService }, { token: i3.FormIoStateService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
316
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FormViewModelComponent, isStandalone: true, selector: "valtimo-form-view-model", inputs: { options: "options", submission: "submission", form: "form", formName: "formName", taskInstanceId: "taskInstanceId", isStartForm: "isStartForm", processDefinitionKey: "processDefinitionKey", documentDefinitionName: "documentDefinitionName" }, outputs: { formSubmit: "formSubmit" }, viewQueries: [{ propertyName: "formio", first: true, predicate: ["formio"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"form-container formio-carbon\"\n *ngIf=\"{\n submission: submission$ | async,\n form: form$ | async,\n tokenSetInLocalStorage: tokenSetInLocalStorage$ | async,\n formioOptions: formioOptions$ | async,\n loading: loading$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.loading\" class=\"overlay\">\n <div class=\"spinner\">\n <i class=\"fa fa-spinner fa-spin\"></i>\n </div>\n </div>\n\n <div *ngIf=\"errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of errors\" class=\"pl-2\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n #formio\n [submission]=\"obs.submission\"\n [form]=\"obs.form\"\n [options]=\"obs.formioOptions\"\n [refresh]=\"refreshForm\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n (focusin)=\"onFocus($event)\"\n (focusout)=\"onBlur($event)\"\n (nextPage)=\"onNextPage()\"\n (prevPage)=\"onPreviousPage()\"\n ></formio>\n</div>\n", styles: [".form-container{position:relative}.overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fffc;z-index:1000;display:flex;justify-content:center;align-items:center;pointer-events:all}.spinner{font-size:3rem;color:#007bff}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormioModule }, { kind: "component", type: i5.FormioComponent, selector: "formio" }] }); }
|
|
335
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FormViewModelComponent, isStandalone: true, selector: "valtimo-form-view-model", inputs: { options: "options", submission: "submission", form: "form", formName: "formName", taskInstanceId: "taskInstanceId", isStartForm: "isStartForm", documentId: "documentId", processDefinitionKey: "processDefinitionKey", documentDefinitionName: "documentDefinitionName" }, outputs: { formSubmit: "formSubmit" }, viewQueries: [{ propertyName: "formio", first: true, predicate: ["formio"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"form-container formio-carbon\"\n cdsLayer=\"1.0\"\n *ngIf=\"{\n submission: submission$ | async,\n form: form$ | async,\n tokenSetInLocalStorage: tokenSetInLocalStorage$ | async,\n formioOptions: formioOptions$ | async,\n loading: loading$ | async,\n errors: formErrors$ | async,\n renderOptions: renderOptions$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.loading\" class=\"overlay\">\n <div class=\"spinner\">\n <i class=\"fa fa-spinner fa-spin\"></i>\n </div>\n </div>\n\n <div *ngIf=\"obs.errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of obs.errors\" class=\"pl-2\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n #formio\n [submission]=\"obs.submission\"\n [form]=\"obs.form\"\n [options]=\"obs.formioOptions\"\n [renderOptions]=\"obs.renderOptions\"\n [refresh]=\"refreshForm\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n (focusin)=\"onFocus($event)\"\n (focusout)=\"onBlur($event)\"\n (nextPage)=\"onNextPage()\"\n (prevPage)=\"onPreviousPage()\"\n ></formio>\n</div>\n", styles: [".form-container{position:relative}.overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fffc;z-index:1000;display:flex;justify-content:center;align-items:center;pointer-events:all}.spinner{font-size:3rem;color:#007bff}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormioModule }, { kind: "component", type: i5.FormioComponent, selector: "formio" }, { kind: "ngmodule", type: LayerModule }, { kind: "directive", type: i6.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }] }); }
|
|
317
336
|
}
|
|
318
337
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormViewModelComponent, decorators: [{
|
|
319
338
|
type: Component,
|
|
320
|
-
args: [{ selector: 'valtimo-form-view-model', standalone: true, imports: [CommonModule, FormioModule], template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"form-container formio-carbon\"\n *ngIf=\"{\n submission: submission$ | async,\n form: form$ | async,\n tokenSetInLocalStorage: tokenSetInLocalStorage$ | async,\n formioOptions: formioOptions$ | async,\n loading: loading$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.loading\" class=\"overlay\">\n <div class=\"spinner\">\n <i class=\"fa fa-spinner fa-spin\"></i>\n </div>\n </div>\n\n <div *ngIf=\"errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of errors\" class=\"pl-2\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n #formio\n [submission]=\"obs.submission\"\n [form]=\"obs.form\"\n [options]=\"obs.formioOptions\"\n [refresh]=\"refreshForm\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n (focusin)=\"onFocus($event)\"\n (focusout)=\"onBlur($event)\"\n (nextPage)=\"onNextPage()\"\n (prevPage)=\"onPreviousPage()\"\n ></formio>\n</div>\n", styles: [".form-container{position:relative}.overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fffc;z-index:1000;display:flex;justify-content:center;align-items:center;pointer-events:all}.spinner{font-size:3rem;color:#007bff}\n"] }]
|
|
339
|
+
args: [{ selector: 'valtimo-form-view-model', standalone: true, imports: [CommonModule, FormioModule, LayerModule], template: "<!--\n ~ Copyright 2015-2024 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"form-container formio-carbon\"\n cdsLayer=\"1.0\"\n *ngIf=\"{\n submission: submission$ | async,\n form: form$ | async,\n tokenSetInLocalStorage: tokenSetInLocalStorage$ | async,\n formioOptions: formioOptions$ | async,\n loading: loading$ | async,\n errors: formErrors$ | async,\n renderOptions: renderOptions$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.loading\" class=\"overlay\">\n <div class=\"spinner\">\n <i class=\"fa fa-spinner fa-spin\"></i>\n </div>\n </div>\n\n <div *ngIf=\"obs.errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of obs.errors\" class=\"pl-2\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n #formio\n [submission]=\"obs.submission\"\n [form]=\"obs.form\"\n [options]=\"obs.formioOptions\"\n [renderOptions]=\"obs.renderOptions\"\n [refresh]=\"refreshForm\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n (focusin)=\"onFocus($event)\"\n (focusout)=\"onBlur($event)\"\n (nextPage)=\"onNextPage()\"\n (prevPage)=\"onPreviousPage()\"\n ></formio>\n</div>\n", styles: [".form-container{position:relative}.overlay{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fffc;z-index:1000;display:flex;justify-content:center;align-items:center;pointer-events:all}.spinner{font-size:3rem;color:#007bff}\n"] }]
|
|
321
340
|
}], ctorParameters: () => [{ type: i1.ViewModelService }, { type: i2.TranslateService }, { type: i3.FormIoStateService }], propDecorators: { formio: [{
|
|
322
341
|
type: ViewChild,
|
|
323
342
|
args: ['formio']
|
|
@@ -333,6 +352,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
333
352
|
type: Input
|
|
334
353
|
}], isStartForm: [{
|
|
335
354
|
type: Input
|
|
355
|
+
}], documentId: [{
|
|
356
|
+
type: Input
|
|
336
357
|
}], processDefinitionKey: [{
|
|
337
358
|
type: Input
|
|
338
359
|
}], documentDefinitionName: [{
|
|
@@ -340,4 +361,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
340
361
|
}], formSubmit: [{
|
|
341
362
|
type: Output
|
|
342
363
|
}] } });
|
|
343
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZm9ybS12aWV3LW1vZGVsL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLXZpZXctbW9kZWwvZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZm9ybS12aWV3LW1vZGVsL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLXZpZXctbW9kZWwvZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixhQUFhLEVBQ2IsWUFBWSxFQUNaLEtBQUssRUFBRSxNQUFNLEVBRWIsRUFBRSxFQUFFLE9BQU8sRUFDWCxTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsRUFBRSxjQUFjLEdBQ3BCLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUVMLFlBQVksR0FJYixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBSXZDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sUUFBUSxDQUFDOzs7Ozs7O0FBRS9CLE1BQU0sQ0FBQyxhQUFhLEdBQUcsbUJBQW1CLENBQUM7QUFT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TUFBTSxHQUFHLEVBQUUsQ0FBQztvQkFDbkIsQ0FBQztvQkFDRCxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUU7d0JBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzFCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzlCLENBQUM7aUJBQ0YsQ0FBQyxDQUNILENBQ0osQ0FDRixDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsdURBQXVEO1FBQzFFLENBQUMsQ0FBQyxDQUNIO2FBQ0EsU0FBUyxFQUFFLENBQUM7SUFDakIsQ0FBQzsrR0F6WVUsc0JBQXNCO21HQUF0QixzQkFBc0Isd2RDdERuQywrb0RBc0RBLGdUREZZLFlBQVksb1RBQUUsWUFBWTs7NEZBRXpCLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSx5QkFBeUIsY0FHdkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQztxSkFHaEIsTUFBTTtzQkFBMUIsU0FBUzt1QkFBQyxRQUFRO2dCQUVOLE9BQU87c0JBQW5CLEtBQUs7Z0JBSU8sVUFBVTtzQkFBdEIsS0FBSztnQkFJTyxJQUFJO3NCQUFoQixLQUFLO2dCQVVPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBSU8sY0FBYztzQkFBMUIsS0FBSztnQkFJTyxXQUFXO3NCQUF2QixLQUFLO2dCQUlPLG9CQUFvQjtzQkFBaEMsS0FBSztnQkFJTyxzQkFBc0I7c0JBQWxDLEtBQUs7Z0JBSUksVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDI0IFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY2F0Y2hFcnJvcixcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBFTVBUWSwgZmlsdGVyLFxuICBPYnNlcnZhYmxlLFxuICBvZiwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRhcCwgd2l0aExhdGVzdEZyb20sXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRm9ybWlvQ29tcG9uZW50LFxuICBGb3JtaW9Nb2R1bGUsXG4gIEZvcm1pb09wdGlvbnMsXG4gIEZvcm1pb1N1Ym1pc3Npb24sXG4gIEZvcm1pb1N1Ym1pc3Npb25DYWxsYmFjayxcbn0gZnJvbSAnQGZvcm1pby9hbmd1bGFyJztcbmltcG9ydCB7Vmlld01vZGVsU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge2RlZXBtZXJnZX0gZnJvbSAnZGVlcG1lcmdlLXRzJztcbmltcG9ydCB7Rm9ybUlvU3RhdGVTZXJ2aWNlLCBWYWx0aW1vRm9ybWlvT3B0aW9uc30gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtIdHRwRXJyb3JSZXNwb25zZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge2lzRXF1YWx9IGZyb20gJ2xvZGFzaCc7XG5cbm1vbWVudC5kZWZhdWx0Rm9ybWF0ID0gJ0REIE1NTSBZWVlZIEhIOm1tJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsdGltby1mb3JtLXZpZXctbW9kZWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC5jc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybWlvTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybVZpZXdNb2RlbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnZm9ybWlvJykgZm9ybWlvOiBGb3JtaW9Db21wb25lbnQ7XG5cbiAgQElucHV0KCkgc2V0IG9wdGlvbnMob3B0aW9uc1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLm9wdGlvbnMkLm5leHQob3B0aW9uc1ZhbHVlKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBzdWJtaXNzaW9uKHN1Ym1pc3Npb25WYWx1ZTogRm9ybWlvU3VibWlzc2lvbikge1xuICAgIHRoaXMuc3VibWlzc2lvbiQubmV4dChzdWJtaXNzaW9uVmFsdWUpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZvcm0oZm9ybVZhbHVlOiBvYmplY3QpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXM7XG4gICAgY29uc3QgZm9ybSA9IHtcbiAgICAgIGxvYWRJbml0aWFsVmlld01vZGVsOiAoKSA9PiBpbnN0YW5jZS5sb2FkSW5pdGlhbFZpZXdNb2RlbCgpLFxuICAgICAgdXBkYXRlVmlld01vZGVsOiAoKSA9PiBpbnN0YW5jZS51cGRhdGVWaWV3TW9kZWwoKSxcbiAgICAgIC4uLmZvcm1WYWx1ZSxcbiAgICB9O1xuICAgIHRoaXMuZm9ybSQubmV4dChmb3JtKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBmb3JtTmFtZShmb3JtTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5mb3JtTmFtZSQubmV4dChmb3JtTmFtZSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGFza0luc3RhbmNlSWQodGFza0luc3RhbmNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMudGFza0luc3RhbmNlSWQkLm5leHQodGFza0luc3RhbmNlSWQpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGlzU3RhcnRGb3JtKGlzU3RhcnRGb3JtVmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzU3RhcnRGb3JtJC5uZXh0KGlzU3RhcnRGb3JtVmFsdWUpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHByb2Nlc3NEZWZpbml0aW9uS2V5KHByb2Nlc3NEZWZpbml0aW9uS2V5VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25LZXkkLm5leHQocHJvY2Vzc0RlZmluaXRpb25LZXlWYWx1ZSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZG9jdW1lbnREZWZpbml0aW9uTmFtZShkb2N1bWVudERlZmluaXRpb25OYW1lVmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQubmV4dChkb2N1bWVudERlZmluaXRpb25OYW1lVmFsdWUpO1xuICB9XG5cbiAgQE91dHB1dCgpIGZvcm1TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBwdWJsaWMgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgcmVmcmVzaEZvcm0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJpdmF0ZSBfcHJldmVudE5leHRQYWdlID0gZmFsc2U7XG4gIHByaXZhdGUgX3ByZXZlbnRQcmV2aW91c1BhZ2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNXaXphcmQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgcmVhZG9ubHkgc3VibWlzc2lvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oe30pO1xuICBwdWJsaWMgcmVhZG9ubHkgZm9ybSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG9iamVjdD4odW5kZWZpbmVkKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1OYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPih1bmRlZmluZWQpO1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFZhbHRpbW9Gb3JtaW9PcHRpb25zPih1bmRlZmluZWQpO1xuICBwdWJsaWMgcmVhZG9ubHkgdGFza0luc3RhbmNlSWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KHVuZGVmaW5lZCk7XG4gIHB1YmxpYyByZWFkb25seSB0b2tlblNldEluTG9jYWxTdG9yYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGJsdXIkID0gbmV3IFN1YmplY3Q8Rm9jdXNFdmVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvY3VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rm9jdXNFdmVudD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHB1YmxpYyByZWFkb25seSBpc1N0YXJ0Rm9ybSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IHByb2Nlc3NEZWZpbml0aW9uS2V5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPih1bmRlZmluZWQpO1xuICBwdWJsaWMgcmVhZG9ubHkgZG9jdW1lbnREZWZpbml0aW9uTmFtZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odW5kZWZpbmVkKTtcbiAgcHVibGljIHJlYWRvbmx5IHVwZGF0ZUZvcm0gPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBjdXJyZW50TGFuZ3VhZ2UkID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0cmVhbSgna2V5JykucGlwZShcbiAgICBtYXAoKCkgPT4gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfb3ZlcnJpZGVPcHRpb25zJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rm9ybWlvT3B0aW9ucz4oe1xuICAgIGhvb2tzOiB7XG4gICAgICBiZWZvcmVTdWJtaXQ6IHRoaXMuYmVmb3JlU3VibWl0SG9vayh0aGlzKSxcbiAgICB9LFxuICB9KTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZm9ybWlvT3B0aW9ucyQ6IE9ic2VydmFibGU8VmFsdGltb0Zvcm1pb09wdGlvbnMgfCBGb3JtaW9PcHRpb25zPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuY3VycmVudExhbmd1YWdlJCxcbiAgICB0aGlzLm9wdGlvbnMkLFxuICAgIHRoaXMuX292ZXJyaWRlT3B0aW9ucyQsXG4gIF0pLnBpcGUoXG4gICAgbWFwKChbbGFuZ3VhZ2UsIG9wdGlvbnMsIG92ZXJyaWRlT3B0aW9uc10pID0+IHtcbiAgICAgIGNvbnN0IGZvcm1pb1RyYW5zbGF0aW9ucyA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdmb3JtaW9UcmFuc2xhdGlvbnMnKTtcblxuICAgICAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGxhbmd1YWdlLFxuICAgICAgICAuLi4odHlwZW9mIGZvcm1pb1RyYW5zbGF0aW9ucyA9PT0gJ29iamVjdCdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgIGxhbmd1YWdlLFxuICAgICAgICAgICAgaTE4bjoge1xuICAgICAgICAgICAgICBbbGFuZ3VhZ2VdOiB0aGlzLnN0YXRlU2VydmljZS5mbGF0dGVuVHJhbnNsYXRpb25zT2JqZWN0KGZvcm1pb1RyYW5zbGF0aW9ucyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBkZWVwbWVyZ2UoZGVmYXVsdE9wdGlvbnMsIG92ZXJyaWRlT3B0aW9ucyk7XG4gICAgfSlcbiAgKTtcblxuICBwcml2YXRlIGZvY3VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb25cbiAgcHJpdmF0ZSB1cGRhdGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvblxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld01vZGVsU2VydmljZTogVmlld01vZGVsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZVNlcnZpY2U6IEZvcm1Jb1N0YXRlU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzU3RhcnRGb3JtJC52YWx1ZSkge1xuICAgICAgdGhpcy5sb2FkSW5pdGlhbFZpZXdNb2RlbEZvclN0YXJ0Rm9ybSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRJbml0aWFsVmlld01vZGVsKCk7XG4gICAgfVxuXG4gICAgdGhpcy5mb2N1c1N1YnNjcmlwdGlvbiA9IHRoaXMuZm9jdXMkXG4gICAgICAucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLmNoYW5nZSQpKVxuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgY29uc3QgZGF0YUF0Rm9jdXMgPSAhIWRhdGFbMV0gJiYgISFkYXRhWzFdLmRhdGEgPyBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGFbMV0uZGF0YSkpIDogbnVsbFxuICAgICAgICB0aGlzLmJsdXIkXG4gICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLmNoYW5nZSQpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoZGF0YUJsdXIgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YUVxdWFsID0gaXNFcXVhbChkYXRhQXRGb2N1cywgZGF0YUJsdXJbMV0/LmRhdGEpXG4gICAgICAgICAgICBpZighZGF0YUVxdWFsKSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybS5uZXh0KHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICB0aGlzLnVwZGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMudXBkYXRlRm9ybS5waXBlKGZpbHRlcihpdCA9PiBpdCksIGRlYm91bmNlVGltZSg1MDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNTdGFydEZvcm0kLnZhbHVlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmlld01vZGVsRm9yU3RhcnRGb3JtKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXdNb2RlbCgpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgdGhpcy51cGRhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICB9XG5cbiAgcHVibGljIGJlZm9yZVN1Ym1pdEhvb2soaW5zdGFuY2U6IEZvcm1WaWV3TW9kZWxDb21wb25lbnQpOiAoc3VibWlzc2lvbiwgY2FsbGJhY2spID0+IHZvaWQge1xuICAgIHJldHVybiAoc3VibWlzc2lvbiwgY2FsbGJhY2spID0+IGluc3RhbmNlLmJlZm9yZVN1Ym1pdChzdWJtaXNzaW9uLCBjYWxsYmFjayk7XG4gIH1cblxuICBwdWJsaWMgYmVmb3JlU3VibWl0KHN1Ym1pc3Npb246IGFueSwgY2FsbGJhY2s6IEZvcm1pb1N1Ym1pc3Npb25DYWxsYmFjayk6IHZvaWQge1xuICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5mb3JtTmFtZSQsXG4gICAgICB0aGlzLnRhc2tJbnN0YW5jZUlkJCxcbiAgICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25LZXkkLFxuICAgICAgdGhpcy5kb2N1bWVudERlZmluaXRpb25OYW1lJCxcbiAgICAgIHRoaXMuaXNTdGFydEZvcm0kLFxuICAgIF0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKFxuICAgICAgICAgIChbXG4gICAgICAgICAgICBmb3JtTmFtZSxcbiAgICAgICAgICAgIHRhc2tJbnN0YW5jZUlkLFxuICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25LZXksXG4gICAgICAgICAgICBkb2N1bWVudERlZmluaXRpb25OYW1lLFxuICAgICAgICAgICAgaXNTdGFydEZvcm0sXG4gICAgICAgICAgXSkgPT5cbiAgICAgICAgICAgIGlzU3RhcnRGb3JtXG4gICAgICAgICAgICAgID8gdGhpcy52aWV3TW9kZWxTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAuc3VibWl0Vmlld01vZGVsRm9yU3RhcnRGb3JtKFxuICAgICAgICAgICAgICAgICAgICBmb3JtTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHN1Ym1pc3Npb24uZGF0YVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgc3VibWlzc2lvbik7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRm9ybUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7bWVzc2FnZTogJyAnLCBjb21wb25lbnQ6IG51bGx9LCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7IC8vIHJldHVybiBhbiBlbXB0eSBvYnNlcnZhYmxlIHRvIGNvbXBsZXRlIHRoZSBzdHJlYW1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiB0aGlzLnZpZXdNb2RlbFNlcnZpY2VcbiAgICAgICAgICAgICAgICAgIC5zdWJtaXRWaWV3TW9kZWwoZm9ybU5hbWUsIHRhc2tJbnN0YW5jZUlkLCBzdWJtaXNzaW9uLmRhdGEpXG4gICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBzdWJtaXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGb3JtRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHttZXNzYWdlOiAnICcsIGNvbXBvbmVudDogbnVsbH0sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTsgLy8gcmV0dXJuIGFuIGVtcHR5IG9ic2VydmFibGUgdG8gY29tcGxldGUgdGhlIHN0cmVhbVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZvcm1FcnJvcihlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpOiB2b2lkIHtcbiAgICBjb25zdCBmb3JtSW5zdGFuY2UgPSB0aGlzLmZvcm1pby5mb3JtaW87XG4gICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICBpZiAoZXJyb3IuZXJyb3IuY29tcG9uZW50RXJyb3JzKSB7XG4gICAgICBlcnJvci5lcnJvci5jb21wb25lbnRFcnJvcnMuZm9yRWFjaChjb21wb25lbnRFcnJvciA9PiB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGZvcm1JbnN0YW5jZS5nZXRDb21wb25lbnQoY29tcG9uZW50RXJyb3IuY29tcG9uZW50KTtcbiAgICAgICAgaWYgKGNvbXBvbmVudCA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5lcnJvcnMucHVzaChjb21wb25lbnRFcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQ/LnNldEN1c3RvbVZhbGlkaXR5KGNvbXBvbmVudEVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZm9ybUluc3RhbmNlLmdldENvbXBvbmVudChlcnJvci5lcnJvcj8uY29tcG9uZW50KTtcbiAgICAgIGlmIChjb21wb25lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmVycm9ycy5wdXNoKGVycm9yLmVycm9yLmVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudD8uc2V0Q3VzdG9tVmFsaWRpdHkoZXJyb3IuZXJyb3IuZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvblN1Ym1pdChzdWJtaXNzaW9uOiBGb3JtaW9TdWJtaXNzaW9uKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtU3VibWl0Lm5leHQoc3VibWlzc2lvbik7XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1cygkZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmZvY3VzJC5uZXh0KCRldmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25CbHVyKGJsdXJFdmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuYmx1ciQubmV4dChibHVyRXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uQ2hhbmdlKG9iamVjdDogYW55KTogdm9pZCB7XG4gICAgaWYgKG9iamVjdC5kYXRhKSB7XG4gICAgICB0aGlzLmNoYW5nZSQubmV4dChvYmplY3QpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbk5leHRQYWdlKCk6IHZvaWQge1xuICAgIHRoaXMuX3ByZXZlbnROZXh0UGFnZSA9IHRydWU7XG4gICAgdGhpcy5mb3JtaW8uZm9ybWlvLnNldFBhZ2UodGhpcy5mb3JtaW8uZm9ybWlvLnBhZ2UgLSAxKTtcbiAgICB0aGlzLnVwZGF0ZUZvcm0ubmV4dCh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBvblByZXZpb3VzUGFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9wcmV2ZW50UHJldmlvdXNQYWdlID0gdHJ1ZTtcbiAgICB0aGlzLmZvcm1pby5mb3JtaW8uc2V0UGFnZSh0aGlzLmZvcm1pby5mb3JtaW8ucGFnZSArIDEpO1xuICAgIHRoaXMudXBkYXRlRm9ybS5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVQYWdlQ2hhbmdlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9wcmV2ZW50TmV4dFBhZ2UpIHtcbiAgICAgIHRoaXMuX3ByZXZlbnROZXh0UGFnZSA9IGZhbHNlO1xuICAgICAgdGhpcy5mb3JtaW8uZm9ybWlvLnNldFBhZ2UodGhpcy5mb3JtaW8uZm9ybWlvLnBhZ2UgKyAxKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3ByZXZlbnRQcmV2aW91c1BhZ2UpIHtcbiAgICAgIHRoaXMuX3ByZXZlbnRQcmV2aW91c1BhZ2UgPSBmYWxzZTtcbiAgICAgIHRoaXMuZm9ybWlvLmZvcm1pby5zZXRQYWdlKHRoaXMuZm9ybWlvLmZvcm1pby5wYWdlIC0gMSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGxvYWRJbml0aWFsVmlld01vZGVsKCk6IHZvaWQge1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuZm9ybU5hbWUkLCB0aGlzLnRhc2tJbnN0YW5jZUlkJF0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKChbZm9ybU5hbWUsIHRhc2tJbnN0YW5jZUlkXSkgPT5cbiAgICAgICAgICB0aGlzLnZpZXdNb2RlbFNlcnZpY2UuZ2V0Vmlld01vZGVsKGZvcm1OYW1lLCB0YXNrSW5zdGFuY2VJZCkucGlwZShcbiAgICAgICAgICAgIHRhcCh2aWV3TW9kZWwgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnN1Ym1pc3Npb24kLm5leHQoe2RhdGE6IHZpZXdNb2RlbH0pO1xuICAgICAgICAgICAgICB0aGlzLmNoYW5nZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLl9pc1dpemFyZCA9IHRoaXMuZm9ybWlvLmZvcm0uZGlzcGxheSA9PT0gJ3dpemFyZCc7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVZpZXdNb2RlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmckXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKHVwZGF0aW5nID0+IHtcbiAgICAgICAgICBpZiAoIXVwZGF0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdGhpcy5mb3JtTmFtZSQsIHRoaXMudGFza0luc3RhbmNlSWQkLCB0aGlzLmNoYW5nZSRdKS5waXBlKFxuICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICBzd2l0Y2hNYXAoKFtmb3JtTmFtZSwgdGFza0luc3RhbmNlSWQsIGNoYW5nZV0pID0+XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3TW9kZWxTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAudXBkYXRlVmlld01vZGVsKFxuICAgICAgICAgICAgICAgICAgICBmb3JtTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdGFza0luc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZS5kYXRhLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1pby5mb3JtaW8ucGFnZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNXaXphcmRcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YXAoe1xuICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IHZpZXdNb2RlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJtaXNzaW9uID0gdGhpcy5zdWJtaXNzaW9uJC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pc3Npb24uZGF0YSA9IHZpZXdNb2RlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWlzc2lvbiQubmV4dChzdWJtaXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoRm9ybS5lbWl0KHtzdWJtaXNzaW9uOiBzdWJtaXNzaW9ufSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGb3JtRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvZihudWxsKTsgLy8gRmFsbGJhY2sgdG8gcmV0dXJuIGFuIG9ic2VydmFibGUgaWYgdXBkYXRpbmcgaXMgdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIGxvYWRJbml0aWFsVmlld01vZGVsRm9yU3RhcnRGb3JtKCk6IHZvaWQge1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuZm9ybU5hbWUkLCB0aGlzLnByb2Nlc3NEZWZpbml0aW9uS2V5JF0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKChbZm9ybU5hbWUsIHByb2Nlc3NEZWZpbml0aW9uS2V5XSkgPT5cbiAgICAgICAgICB0aGlzLnZpZXdNb2RlbFNlcnZpY2UuZ2V0Vmlld01vZGVsRm9yU3RhcnRGb3JtKGZvcm1OYW1lLCBwcm9jZXNzRGVmaW5pdGlvbktleSkucGlwZShcbiAgICAgICAgICAgIHRhcCh2aWV3TW9kZWwgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnN1Ym1pc3Npb24kLm5leHQoe2RhdGE6IHZpZXdNb2RlbH0pO1xuICAgICAgICAgICAgICB0aGlzLmNoYW5nZSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLl9pc1dpemFyZCA9IHRoaXMuZm9ybWlvLmZvcm0uZGlzcGxheSA9PT0gJ3dpemFyZCc7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVZpZXdNb2RlbEZvclN0YXJ0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmckXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKHVwZGF0aW5nID0+IHtcbiAgICAgICAgICBpZiAoIXVwZGF0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdGhpcy5mb3JtTmFtZSQsIHRoaXMucHJvY2Vzc0RlZmluaXRpb25LZXkkLCB0aGlzLmNoYW5nZSRdKS5waXBlKFxuICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICBzd2l0Y2hNYXAoKFtmb3JtTmFtZSwgcHJvY2Vzc0RlZmluaXRpb25LZXksIGNoYW5nZV0pID0+XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3TW9kZWxTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAudXBkYXRlVmlld01vZGVsRm9yU3RhcnRGb3JtKFxuICAgICAgICAgICAgICAgICAgICBmb3JtTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZS5kYXRhLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1pby5mb3JtaW8ucGFnZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNXaXphcmRcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YXAoe1xuICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IHZpZXdNb2RlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJtaXNzaW9uID0gdGhpcy5zdWJtaXNzaW9uJC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pc3Npb24uZGF0YSA9IHZpZXdNb2RlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWlzc2lvbiQubmV4dChzdWJtaXNzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoRm9ybS5lbWl0KHtzdWJtaXNzaW9uOiBzdWJtaXNzaW9ufSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGb3JtRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvZihudWxsKTsgLy8gRmFsbGJhY2sgdG8gcmV0dXJuIGFuIG9ic2VydmFibGUgaWYgdXBkYXRpbmcgaXMgdHJ1ZVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG5cbjxkaXZcbiAgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBmb3JtaW8tY2FyYm9uXCJcbiAgKm5nSWY9XCJ7XG4gICAgc3VibWlzc2lvbjogc3VibWlzc2lvbiQgfCBhc3luYyxcbiAgICBmb3JtOiBmb3JtJCB8IGFzeW5jLFxuICAgIHRva2VuU2V0SW5Mb2NhbFN0b3JhZ2U6IHRva2VuU2V0SW5Mb2NhbFN0b3JhZ2UkIHwgYXN5bmMsXG4gICAgZm9ybWlvT3B0aW9uczogZm9ybWlvT3B0aW9ucyQgfCBhc3luYyxcbiAgICBsb2FkaW5nOiBsb2FkaW5nJCB8IGFzeW5jLFxuICB9IGFzIG9ic1wiXG4+XG4gIDxkaXYgKm5nSWY9XCJvYnMubG9hZGluZ1wiIGNsYXNzPVwib3ZlcmxheVwiPlxuICAgIDxkaXYgY2xhc3M9XCJzcGlubmVyXCI+XG4gICAgICA8aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtc3BpblwiPjwvaT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAqbmdJZj1cImVycm9ycy5sZW5ndGggPiAwXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgcHQtNSBwYi01IG1iLTJcIj5cbiAgICA8b2w+XG4gICAgICA8bGkgKm5nRm9yPVwibGV0IGVycm9yIG9mIGVycm9yc1wiIGNsYXNzPVwicGwtMlwiPlxuICAgICAgICB7eyBlcnJvciB9fVxuICAgICAgPC9saT5cbiAgICA8L29sPlxuICA8L2Rpdj5cblxuICA8Zm9ybWlvXG4gICAgI2Zvcm1pb1xuICAgIFtzdWJtaXNzaW9uXT1cIm9icy5zdWJtaXNzaW9uXCJcbiAgICBbZm9ybV09XCJvYnMuZm9ybVwiXG4gICAgW29wdGlvbnNdPVwib2JzLmZvcm1pb09wdGlvbnNcIlxuICAgIFtyZWZyZXNoXT1cInJlZnJlc2hGb3JtXCJcbiAgICAoc3VibWl0KT1cIm9uU3VibWl0KCRldmVudClcIlxuICAgIChjaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXG4gICAgKGZvY3VzaW4pPVwib25Gb2N1cygkZXZlbnQpXCJcbiAgICAoZm9jdXNvdXQpPVwib25CbHVyKCRldmVudClcIlxuICAgIChuZXh0UGFnZSk9XCJvbk5leHRQYWdlKClcIlxuICAgIChwcmV2UGFnZSk9XCJvblByZXZpb3VzUGFnZSgpXCJcbiAgPjwvZm9ybWlvPlxuPC9kaXY+XG4iXX0=
|
|
364
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZm9ybS12aWV3LW1vZGVsL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLXZpZXctbW9kZWwvZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRpbW8vZm9ybS12aWV3LW1vZGVsL3NyYy9saWIvY29tcG9uZW50cy9mb3JtLXZpZXctbW9kZWwvZm9ybS12aWV3LW1vZGVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixNQUFNLEVBRU4sT0FBTyxFQUVQLFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUVMLFlBQVksR0FJYixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBR3ZDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7O0FBRXRELE1BQU0sQ0FBQyxhQUFhLEdBQUcsbUJBQW1CLENBQUM7QUFTM0Ms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QUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRU0sMEJBQTBCLENBQUMsS0FBd0I7UUFDeEQsSUFBSSxDQUFDLHlCQUF5QixFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7UUFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTyxhQUFhLENBQUMsT0FBZ0I7UUFDcEMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDekQsQ0FBQzsrR0FoYVUsc0JBQXNCO21HQUF0QixzQkFBc0Isa2ZDckRuQyxveURBMERBLGdURFBZLFlBQVksb1RBQUUsWUFBWSxtR0FBRSxXQUFXOzs0RkFFdEMsc0JBQXNCO2tCQVBsQyxTQUFTOytCQUNFLHlCQUF5QixjQUd2QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQztxSkFHN0IsTUFBTTtzQkFBMUIsU0FBUzt1QkFBQyxRQUFRO2dCQUVOLE9BQU87c0JBQW5CLEtBQUs7Z0JBSU8sVUFBVTtzQkFBdEIsS0FBSztnQkFJTyxJQUFJO3NCQUFoQixLQUFLO2dCQVlPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBSU8sY0FBYztzQkFBMUIsS0FBSztnQkFJTyxXQUFXO3NCQUF2QixLQUFLO2dCQUlPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBSU8sb0JBQW9CO3NCQUFoQyxLQUFLO2dCQUlPLHNCQUFzQjtzQkFBbEMsS0FBSztnQkFJSSxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjQgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBmaWx0ZXIsXG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIFN1YnNjcmlwdGlvbixcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgRm9ybWlvQ29tcG9uZW50LFxuICBGb3JtaW9Nb2R1bGUsXG4gIEZvcm1pb09wdGlvbnMsXG4gIEZvcm1pb1N1Ym1pc3Npb24sXG4gIEZvcm1pb1N1Ym1pc3Npb25DYWxsYmFjayxcbn0gZnJvbSAnQGZvcm1pby9hbmd1bGFyJztcbmltcG9ydCB7Vmlld01vZGVsU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge2RlZXBtZXJnZX0gZnJvbSAnZGVlcG1lcmdlLXRzJztcbmltcG9ydCB7Rm9ybUlvU3RhdGVTZXJ2aWNlLCBWYWx0aW1vRm9ybWlvT3B0aW9uc30gZnJvbSAnQHZhbHRpbW8vY29tcG9uZW50cyc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtIdHRwRXJyb3JSZXNwb25zZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge0xheWVyTW9kdWxlfSBmcm9tICdjYXJib24tY29tcG9uZW50cy1hbmd1bGFyJztcblxubW9tZW50LmRlZmF1bHRGb3JtYXQgPSAnREQgTU1NIFlZWVkgSEg6bW0nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLWZvcm0tdmlldy1tb2RlbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLXZpZXctbW9kZWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9mb3JtLXZpZXctbW9kZWwuY29tcG9uZW50LmNzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3JtaW9Nb2R1bGUsIExheWVyTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybVZpZXdNb2RlbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnZm9ybWlvJykgZm9ybWlvOiBGb3JtaW9Db21wb25lbnQ7XG5cbiAgQElucHV0KCkgc2V0IG9wdGlvbnMob3B0aW9uc1ZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLm9wdGlvbnMkLm5leHQob3B0aW9uc1ZhbHVlKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBzdWJtaXNzaW9uKHN1Ym1pc3Npb25WYWx1ZTogRm9ybWlvU3VibWlzc2lvbikge1xuICAgIHRoaXMuc3VibWlzc2lvbiQubmV4dChzdWJtaXNzaW9uVmFsdWUpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGZvcm0oZm9ybVZhbHVlOiBvYmplY3QpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXM7XG4gICAgY29uc3QgZm9ybSA9IHtcbiAgICAgIGxvYWRJbml0aWFsVmlld01vZGVsOiAoKSA9PiBpbnN0YW5jZS5sb2FkSW5pdGlhbFZpZXdNb2RlbCgpLFxuICAgICAgdXBkYXRlVmlld01vZGVsOiAoKSA9PiBpbnN0YW5jZS51cGRhdGVWaWV3TW9kZWwoKSxcbiAgICAgIGxvYWRJbml0aWFsU3RhcnRGb3JtVmlld01vZGVsOiAoKSA9PiBpbnN0YW5jZS5sb2FkSW5pdGlhbFZpZXdNb2RlbEZvclN0YXJ0Rm9ybSgpLFxuICAgICAgdXBkYXRlVmlld1N0YXJ0Rm9ybU1vZGVsOiAoKSA9PiBpbnN0YW5jZS51cGRhdGVWaWV3TW9kZWxGb3JTdGFydEZvcm0oKSxcbiAgICAgIC4uLmZvcm1WYWx1ZSxcbiAgICB9O1xuICAgIHRoaXMuZm9ybSQubmV4dChmb3JtKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBmb3JtTmFtZShmb3JtTmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5mb3JtTmFtZSQubmV4dChmb3JtTmFtZSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdGFza0luc3RhbmNlSWQodGFza0luc3RhbmNlSWQ6IHN0cmluZykge1xuICAgIHRoaXMudGFza0luc3RhbmNlSWQkLm5leHQodGFza0luc3RhbmNlSWQpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGlzU3RhcnRGb3JtKGlzU3RhcnRGb3JtVmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzU3RhcnRGb3JtJC5uZXh0KGlzU3RhcnRGb3JtVmFsdWUpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGRvY3VtZW50SWQoZG9jdW1lbnRJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5kb2N1bWVudElkJC5uZXh0KGRvY3VtZW50SWQpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IHByb2Nlc3NEZWZpbml0aW9uS2V5KHByb2Nlc3NEZWZpbml0aW9uS2V5VmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMucHJvY2Vzc0RlZmluaXRpb25LZXkkLm5leHQocHJvY2Vzc0RlZmluaXRpb25LZXlWYWx1ZSk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgZG9jdW1lbnREZWZpbml0aW9uTmFtZShkb2N1bWVudERlZmluaXRpb25OYW1lVmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZG9jdW1lbnREZWZpbml0aW9uTmFtZSQubmV4dChkb2N1bWVudERlZmluaXRpb25OYW1lVmFsdWUpO1xuICB9XG5cbiAgQE91dHB1dCgpIGZvcm1TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBwdWJsaWMgcmVmcmVzaEZvcm0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJpdmF0ZSBfcHJldmVudE5leHRQYWdlID0gZmFsc2U7XG4gIHByaXZhdGUgX3ByZXZlbnRQcmV2aW91c1BhZ2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNXaXphcmQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgcGVuZGluZ1VwZGF0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHJlYWRvbmx5IHN1Ym1pc3Npb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHt9KTtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm0kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxvYmplY3Q+KHVuZGVmaW5lZCk7XG4gIHB1YmxpYyByZWFkb25seSBmb3JtTmFtZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odW5kZWZpbmVkKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1FcnJvcnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9ucyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFZhbHRpbW9Gb3JtaW9PcHRpb25zPih1bmRlZmluZWQpO1xuICBwdWJsaWMgcmVhZG9ubHkgdGFza0luc3RhbmNlSWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KHVuZGVmaW5lZCk7XG4gIHB1YmxpYyByZWFkb25seSB0b2tlblNldEluTG9jYWxTdG9yYWdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGJsdXIkID0gbmV3IFN1YmplY3Q8Rm9jdXNFdmVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvY3VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Rm9jdXNFdmVudD4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBsb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIHB1YmxpYyByZWFkb25seSBpc1N0YXJ0Rm9ybSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IGRvY3VtZW50SWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvY2Vzc0RlZmluaXRpb25LZXkkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KHVuZGVmaW5lZCk7XG4gIHB1YmxpYyByZWFkb25seSBkb2N1bWVudERlZmluaXRpb25OYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPih1bmRlZmluZWQpO1xuICBwdWJsaWMgcmVhZG9ubHkgdXBkYXRlRm9ybSA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGN1cnJlbnRMYW5ndWFnZSQgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc3RyZWFtKCdrZXknKS5waXBlKFxuICAgIG1hcCgoKSA9PiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmcpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9vdmVycmlkZU9wdGlvbnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGb3JtaW9PcHRpb25zPih7XG4gICAgaG9va3M6IHtcbiAgICAgIGJlZm9yZVN1Ym1pdDogdGhpcy5iZWZvcmVTdWJtaXRIb29rKHRoaXMpLFxuICAgIH0sXG4gIH0pO1xuXG4gIHB1YmxpYyByZWFkb25seSBmb3JtaW9PcHRpb25zJDogT2JzZXJ2YWJsZTxWYWx0aW1vRm9ybWlvT3B0aW9ucyB8IEZvcm1pb09wdGlvbnM+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5vcHRpb25zJCxcbiAgICB0aGlzLl9vdmVycmlkZU9wdGlvbnMkLFxuICBdKS5waXBlKFxuICAgIG1hcCgoW29wdGlvbnMsIG92ZXJyaWRlT3B0aW9uc10pID0+IHtcbiAgICAgIHJldHVybiBkZWVwbWVyZ2Uob3B0aW9ucywgb3ZlcnJpZGVPcHRpb25zKTtcbiAgICB9KVxuICApO1xuXG4gIHB1YmxpYyByZWFkb25seSByZW5kZXJPcHRpb25zJDogT2JzZXJ2YWJsZTxhbnk+ID0gY29tYmluZUxhdGVzdChbdGhpcy5jdXJyZW50TGFuZ3VhZ2UkXSkucGlwZShcbiAgICBtYXAoKFtsYW5ndWFnZV0pID0+IHtcbiAgICAgIGNvbnN0IGZvcm1pb1RyYW5zbGF0aW9ucyA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdmb3JtaW9UcmFuc2xhdGlvbnMnKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIC4uLih0eXBlb2YgZm9ybWlvVHJhbnNsYXRpb25zID09PSAnb2JqZWN0J1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgaTE4bjoge1xuICAgICAgICAgICAgICAgIFtsYW5ndWFnZV06IHRoaXMuc3RhdGVTZXJ2aWNlLmZsYXR0ZW5UcmFuc2xhdGlvbnNPYmplY3QoZm9ybWlvVHJhbnNsYXRpb25zKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH07XG4gICAgfSlcbiAgKTtcblxuICBwcml2YXRlIGZvY3VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgYmx1clN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIHVwZGF0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld01vZGVsU2VydmljZTogVmlld01vZGVsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGF0ZVNlcnZpY2U6IEZvcm1Jb1N0YXRlU2VydmljZVxuICApIHt9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzU3RhcnRGb3JtJC52YWx1ZSkge1xuICAgICAgdGhpcy5sb2FkSW5pdGlhbFZpZXdNb2RlbEZvclN0YXJ0Rm9ybSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvYWRJbml0aWFsVmlld01vZGVsKCk7XG4gICAgfVxuXG4gICAgdGhpcy5mb2N1c1N1YnNjcmlwdGlvbiA9IHRoaXMuZm9jdXMkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGUgPT4ge1xuICAgICAgICAgIC8vIFdlIG9ubHkgd2FudCB0byBoYW5kbGUgYmx1ciBldmVudHMgYWZ0ZXIgZW50ZXJpbmcgYW4gaW5wdXRcbiAgICAgICAgICByZXR1cm4gISFlICYmIGUudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuYmx1clN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5ibHVyU3Vic2NyaXB0aW9uID0gdGhpcy5ibHVyJFxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKGUgPT4ge1xuICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGV2ZW50cyB3aGVyZSByZWxhdGVkVGFyZ2V0IGlzIG5vdCBudWxsLlxuICAgICAgICAgICAgICAvLyBUaGUgcmVsYXRlZFRhcmdldCB3aWxsIGJlIG51bGwgd2hlbiBubyBuZXcgaW5wdXQgaXMgZm9jdXNlZC5cbiAgICAgICAgICAgICAgcmV0dXJuICFlLnJlbGF0ZWRUYXJnZXQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYmx1clN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0V2FpdEN1cnNvcih0cnVlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybS5uZXh0KHRydWUpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMudXBkYXRlRm9ybS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNTdGFydEZvcm0kLnZhbHVlKSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmlld01vZGVsRm9yU3RhcnRGb3JtKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXdNb2RlbCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuYmx1clN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmZvY3VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMudXBkYXRlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMucGVuZGluZ1VwZGF0ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNldFdhaXRDdXJzb3IoZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIGJlZm9yZVN1Ym1pdEhvb2soaW5zdGFuY2U6IEZvcm1WaWV3TW9kZWxDb21wb25lbnQpOiAoc3VibWlzc2lvbiwgY2FsbGJhY2spID0+IHZvaWQge1xuICAgIHJldHVybiAoc3VibWlzc2lvbiwgY2FsbGJhY2spID0+IGluc3RhbmNlLmJlZm9yZVN1Ym1pdChzdWJtaXNzaW9uLCBjYWxsYmFjayk7XG4gIH1cblxuICBwdWJsaWMgYmVmb3JlU3VibWl0KHN1Ym1pc3Npb246IGFueSwgY2FsbGJhY2s6IEZvcm1pb1N1Ym1pc3Npb25DYWxsYmFjayk6IHZvaWQge1xuICAgIHRoaXMucGVuZGluZ1VwZGF0ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNldFdhaXRDdXJzb3IoZmFsc2UpO1xuXG4gICAgY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmZvcm1OYW1lJCxcbiAgICAgIHRoaXMudGFza0luc3RhbmNlSWQkLFxuICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbktleSQsXG4gICAgICB0aGlzLmRvY3VtZW50RGVmaW5pdGlvbk5hbWUkLFxuICAgICAgdGhpcy5pc1N0YXJ0Rm9ybSQsXG4gICAgICB0aGlzLmRvY3VtZW50SWQkLFxuICAgIF0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKFxuICAgICAgICAgIChbXG4gICAgICAgICAgICBmb3JtTmFtZSxcbiAgICAgICAgICAgIHRhc2tJbnN0YW5jZUlkLFxuICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25LZXksXG4gICAgICAgICAgICBkb2N1bWVudERlZmluaXRpb25OYW1lLFxuICAgICAgICAgICAgaXNTdGFydEZvcm0sXG4gICAgICAgICAgICBkb2N1bWVudElkLFxuICAgICAgICAgIF0pID0+XG4gICAgICAgICAgICBpc1N0YXJ0Rm9ybVxuICAgICAgICAgICAgICA/IHRoaXMudmlld01vZGVsU2VydmljZS5zdWJtaXRWaWV3TW9kZWxGb3JTdGFydEZvcm0oXG4gICAgICAgICAgICAgICAgICBmb3JtTmFtZSxcbiAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZpbml0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgZG9jdW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgIGRvY3VtZW50RGVmaW5pdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICBzdWJtaXNzaW9uLmRhdGFcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogdGhpcy52aWV3TW9kZWxTZXJ2aWNlLnN1Ym1pdFZpZXdNb2RlbChmb3JtTmFtZSwgdGFza0luc3RhbmNlSWQsIHN1Ym1pc3Npb24uZGF0YSlcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IF8gPT4ge1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHN1Ym1pc3Npb24pO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogZXJyID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVN1Ym1pc3Npb25FcnJvcihlcnIsIGNhbGxiYWNrKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTdWJtaXNzaW9uRXJyb3IoZXJyb3I6IGFueSwgY2FsbGJhY2s6IEZvcm1pb1N1Ym1pc3Npb25DYWxsYmFjayk6IHZvaWQge1xuICAgIGNhbGxiYWNrKHttZXNzYWdlOiAnJywgY29tcG9uZW50OiBudWxsLCBzaWxlbnQ6IHRydWV9LCBudWxsKTtcblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgICB0aGlzLmhhbmRsZUZvcm1FcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGb3JtRXJyb3IoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKTogdm9pZCB7XG4gICAgY29uc3QgZm9ybUluc3RhbmNlID0gdGhpcy5mb3JtaW8uZm9ybWlvO1xuICAgIHRoaXMuZm9ybUVycm9ycyQubmV4dChbXSk7XG4gICAgaWYgKGVycm9yLmVycm9yPy5jb21wb25lbnRFcnJvcnMpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IFtdO1xuICAgICAgZXJyb3IuZXJyb3IuY29tcG9uZW50RXJyb3JzLmZvckVhY2goY29tcG9uZW50RXJyb3IgPT4ge1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSBmb3JtSW5zdGFuY2UuZ2V0Q29tcG9uZW50KGNvbXBvbmVudEVycm9yLmNvbXBvbmVudCk7XG4gICAgICAgIGlmIChjb21wb25lbnQgPT0gbnVsbCkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGNvbXBvbmVudEVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGB0cnVlYCBtYWtlcyB0aGUgZXJyb3IgZGlydHksIHNldHRpbmcgdGhlIGNzcyBjbGFzcyBwcm9wZXJseVxuICAgICAgICAgIGNvbXBvbmVudC5zZXRDdXN0b21WYWxpZGl0eShjb21wb25lbnRFcnJvci5tZXNzYWdlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmZvcm1FcnJvcnMkLm5leHQoZXJyb3JzKTtcbiAgICB9IGVsc2UgaWYgKGVycm9yLmVycm9yPy5lcnJvcikge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZm9ybUluc3RhbmNlLmdldENvbXBvbmVudChlcnJvci5lcnJvcj8uY29tcG9uZW50KTtcbiAgICAgIGlmIChjb21wb25lbnQgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmZvcm1FcnJvcnMkLm5leHQoW2Vycm9yLmVycm9yLmVycm9yXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBgdHJ1ZWAgbWFrZXMgdGhlIGVycm9yIGRpcnR5LCBzZXR0aW5nIHRoZSBjc3MgY2xhc3MgcHJvcGVybHlcbiAgICAgICAgY29tcG9uZW50LnNldEN1c3RvbVZhbGlkaXR5KGVycm9yLmVycm9yLmVycm9yLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25TdWJtaXQoc3VibWlzc2lvbjogRm9ybWlvU3VibWlzc2lvbik6IHZvaWQge1xuICAgIHRoaXMuZm9ybVN1Ym1pdC5uZXh0KHN1Ym1pc3Npb24pO1xuICB9XG5cbiAgcHVibGljIG9uRm9jdXMoJGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5mb2N1cyQubmV4dCgkZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uQmx1cihibHVyRXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmJsdXIkLm5leHQoYmx1ckV2ZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNoYW5nZShvYmplY3Q6IGFueSk6IHZvaWQge1xuICAgIGlmIChvYmplY3QuZGF0YSkge1xuICAgICAgdGhpcy5jaGFuZ2UkLm5leHQob2JqZWN0KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25OZXh0UGFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9wcmV2ZW50TmV4dFBhZ2UgPSB0cnVlO1xuICAgIHRoaXMuZm9ybWlvLmZvcm1pby5zZXRQYWdlKHRoaXMuZm9ybWlvLmZvcm1pby5wYWdlIC0gMSk7XG4gICAgdGhpcy51cGRhdGVGb3JtLm5leHQodHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgb25QcmV2aW91c1BhZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5fcHJldmVudFByZXZpb3VzUGFnZSA9IHRydWU7XG4gICAgdGhpcy5mb3JtaW8uZm9ybWlvLnNldFBhZ2UodGhpcy5mb3JtaW8uZm9ybWlvLnBhZ2UgKyAxKTtcbiAgICB0aGlzLnVwZGF0ZUZvcm0ubmV4dCh0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUGFnZUNoYW5nZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcHJldmVudE5leHRQYWdlKSB7XG4gICAgICB0aGlzLl9wcmV2ZW50TmV4dFBhZ2UgPSBmYWxzZTtcbiAgICAgIHRoaXMuZm9ybWlvLmZvcm1pby5zZXRQYWdlKHRoaXMuZm9ybWlvLmZvcm1pby5wYWdlICsgMSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9wcmV2ZW50UHJldmlvdXNQYWdlKSB7XG4gICAgICB0aGlzLl9wcmV2ZW50UHJldmlvdXNQYWdlID0gZmFsc2U7XG4gICAgICB0aGlzLmZvcm1pby5mb3JtaW8uc2V0UGFnZSh0aGlzLmZvcm1pby5mb3JtaW8ucGFnZSAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsb2FkSW5pdGlhbFZpZXdNb2RlbCgpOiB2b2lkIHtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmZvcm1OYW1lJCwgdGhpcy50YXNrSW5zdGFuY2VJZCRdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgoW2Zvcm1OYW1lLCB0YXNrSW5zdGFuY2VJZF0pID0+XG4gICAgICAgICAgdGhpcy52aWV3TW9kZWxTZXJ2aWNlLmdldFZpZXdNb2RlbChmb3JtTmFtZSwgdGFza0luc3RhbmNlSWQpLnBpcGUoXG4gICAgICAgICAgICB0YXAodmlld01vZGVsID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zdWJtaXNzaW9uJC5uZXh0KHtkYXRhOiB2aWV3TW9kZWx9KTtcbiAgICAgICAgICAgICAgdGhpcy5jaGFuZ2UkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdGhpcy5faXNXaXphcmQgPSB0aGlzLmZvcm1pby5mb3JtLmRpc3BsYXkgPT09ICd3aXphcmQnO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkSW5pdGlhbFZpZXdNb2RlbEZvclN0YXJ0Rm9ybSgpOiB2b2lkIHtcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLmZvcm1OYW1lJCwgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbktleSQsIHRoaXMuZG9jdW1lbnRJZCRdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgoW2Zvcm1OYW1lLCBwcm9jZXNzRGVmaW5pdGlvbktleSwgZG9jdW1lbnRJZF0pID0+XG4gICAgICAgICAgdGhpcy52aWV3TW9kZWxTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Vmlld01vZGVsRm9yU3RhcnRGb3JtKGZvcm1OYW1lLCBwcm9jZXNzRGVmaW5pdGlvbktleSwgZG9jdW1lbnRJZClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICB0YXAodmlld01vZGVsID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pc3Npb24kLm5leHQoe2RhdGE6IHZpZXdNb2RlbH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlJC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2lzV2l6YXJkID0gdGhpcy5mb3JtaW8uZm9ybS5kaXNwbGF5ID09PSAnd2l6YXJkJztcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVZpZXdNb2RlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuZm9ybU5hbWUkLFxuICAgICAgdGhpcy50YXNrSW5zdGFuY2VJZCQsXG4gICAgICB0aGlzLmNoYW5nZSQsXG4gICAgXSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBzd2l0Y2hNYXAoKFtmb3JtTmFtZSwgdGFza0luc3RhbmNlSWQsIGNoYW5nZV0pID0+XG4gICAgICAgICAgdGhpcy52aWV3TW9kZWxTZXJ2aWNlXG4gICAgICAgICAgICAudXBkYXRlVmlld01vZGVsKFxuICAgICAgICAgICAgICBmb3JtTmFtZSxcbiAgICAgICAgICAgICAgdGFza0luc3RhbmNlSWQsXG4gICAgICAgICAgICAgIGNoYW5nZS5kYXRhLFxuICAgICAgICAgICAgICB0aGlzLmZvcm1pby5mb3JtaW8ucGFnZSxcbiAgICAgICAgICAgICAgdGhpcy5faXNXaXphcmRcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICB0YXAoe1xuICAgICAgICAgICAgICAgIG5leHQ6IHZpZXdNb2RlbCA9PiB0aGlzLmhhbmRsZVZpZXdNb2RlbFVwZGF0ZSh2aWV3TW9kZWwpLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciA9PiB0aGlzLmhhbmRsZVZpZXdNb2RlbFVwZGF0ZUVycm9yKGVycm9yKSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVZpZXdNb2RlbEZvclN0YXJ0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuZm9ybU5hbWUkLFxuICAgICAgdGhpcy5wcm9jZXNzRGVmaW5pdGlvbktleSQsXG4gICAgICB0aGlzLmNoYW5nZSQsXG4gICAgICB0aGlzLmRvY3VtZW50SWQkLFxuICAgIF0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgc3dpdGNoTWFwKChbZm9ybU5hbWUsIHByb2Nlc3NEZWZpbml0aW9uS2V5LCBjaGFuZ2UsIGRvY3VtZW50SWRdKSA9PlxuICAgICAgICAgIHRoaXMudmlld01vZGVsU2VydmljZVxuICAgICAgICAgICAgLnVwZGF0ZVZpZXdNb2RlbEZvclN0YXJ0Rm9ybShcbiAgICAgICAgICAgICAgZm9ybU5hbWUsXG4gICAgICAgICAgICAgIHByb2Nlc3NEZWZpbml0aW9uS2V5LFxuICAgICAgICAgICAgICBkb2N1bWVudElkLFxuICAgICAgICAgICAgICBjaGFuZ2UuZGF0YSxcbiAgICAgICAgICAgICAgdGhpcy5mb3JtaW8uZm9ybWlvLnBhZ2UsXG4gICAgICAgICAgICAgIHRoaXMuX2lzV2l6YXJkXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgdGFwKHtcbiAgICAgICAgICAgICAgICBuZXh0OiB2aWV3TW9kZWwgPT4gdGhpcy5oYW5kbGVWaWV3TW9kZWxVcGRhdGUodmlld01vZGVsKSxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgPT4gdGhpcy5oYW5kbGVWaWV3TW9kZWxVcGRhdGVFcnJvcihlcnJvciksXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVWaWV3TW9kZWxVcGRhdGUodmlld01vZGVsOiBvYmplY3QpOiB2b2lkIHtcbiAgICBjb25zdCBzdWJtaXNzaW9uID0gdGhpcy5zdWJtaXNzaW9uJC52YWx1ZTtcbiAgICBzdWJtaXNzaW9uLmRhdGEgPSB2aWV3TW9kZWw7XG4gICAgdGhpcy5zdWJtaXNzaW9uJC5uZXh0KHN1Ym1pc3Npb24pO1xuICAgIHRoaXMuaGFuZGxlUGFnZUNoYW5nZSgpO1xuICAgIHRoaXMucmVmcmVzaEZvcm0uZW1pdCh7c3VibWlzc2lvbn0pO1xuICAgIHRoaXMucGVuZGluZ1VwZGF0ZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgIHRoaXMuZm9ybUVycm9ycyQubmV4dChbXSk7XG4gICAgdGhpcy5zZXRXYWl0Q3Vyc29yKGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVWaWV3TW9kZWxVcGRhdGVFcnJvcihlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpOiB2b2lkIHtcbiAgICB0aGlzLnBlbmRpbmdVcGRhdGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5wZW5kaW5nVXBkYXRlU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB0aGlzLmhhbmRsZUZvcm1FcnJvcihlcnJvcik7XG4gICAgdGhpcy5zZXRXYWl0Q3Vyc29yKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0V2FpdEN1cnNvcihlbmFibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSBlbmFibGVkID8gJ3dhaXQnIDogJ2F1dG8nO1xuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyNCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG5cbjxkaXZcbiAgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBmb3JtaW8tY2FyYm9uXCJcbiAgY2RzTGF5ZXI9XCIxLjBcIlxuICAqbmdJZj1cIntcbiAgICBzdWJtaXNzaW9uOiBzdWJtaXNzaW9uJCB8IGFzeW5jLFxuICAgIGZvcm06IGZvcm0kIHwgYXN5bmMsXG4gICAgdG9rZW5TZXRJbkxvY2FsU3RvcmFnZTogdG9rZW5TZXRJbkxvY2FsU3RvcmFnZSQgfCBhc3luYyxcbiAgICBmb3JtaW9PcHRpb25zOiBmb3JtaW9PcHRpb25zJCB8IGFzeW5jLFxuICAgIGxvYWRpbmc6IGxvYWRpbmckIHwgYXN5bmMsXG4gICAgZXJyb3JzOiBmb3JtRXJyb3JzJCB8IGFzeW5jLFxuICAgIHJlbmRlck9wdGlvbnM6IHJlbmRlck9wdGlvbnMkIHwgYXN5bmMsXG4gIH0gYXMgb2JzXCJcbj5cbiAgPGRpdiAqbmdJZj1cIm9icy5sb2FkaW5nXCIgY2xhc3M9XCJvdmVybGF5XCI+XG4gICAgPGRpdiBjbGFzcz1cInNwaW5uZXJcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmEgZmEtc3Bpbm5lciBmYS1zcGluXCI+PC9pPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2ICpuZ0lmPVwib2JzLmVycm9ycy5sZW5ndGggPiAwXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXIgcHQtNSBwYi01IG1iLTJcIj5cbiAgICA8b2w+XG4gICAgICA8bGkgKm5nRm9yPVwibGV0IGVycm9yIG9mIG9icy5lcnJvcnNcIiBjbGFzcz1cInBsLTJcIj5cbiAgICAgICAge3sgZXJyb3IgfX1cbiAgICAgIDwvbGk+XG4gICAgPC9vbD5cbiAgPC9kaXY+XG5cbiAgPGZvcm1pb1xuICAgICNmb3JtaW9cbiAgICBbc3VibWlzc2lvbl09XCJvYnMuc3VibWlzc2lvblwiXG4gICAgW2Zvcm1dPVwib2JzLmZvcm1cIlxuICAgIFtvcHRpb25zXT1cIm9icy5mb3JtaW9PcHRpb25zXCJcbiAgICBbcmVuZGVyT3B0aW9uc109XCJvYnMucmVuZGVyT3B0aW9uc1wiXG4gICAgW3JlZnJlc2hdPVwicmVmcmVzaEZvcm1cIlxuICAgIChzdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiXG4gICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAoZm9jdXNpbik9XCJvbkZvY3VzKCRldmVudClcIlxuICAgIChmb2N1c291dCk9XCJvbkJsdXIoJGV2ZW50KVwiXG4gICAgKG5leHRQYWdlKT1cIm9uTmV4dFBhZ2UoKVwiXG4gICAgKHByZXZQYWdlKT1cIm9uUHJldmlvdXNQYWdlKClcIlxuICA+PC9mb3JtaW8+XG48L2Rpdj5cbiJdfQ==
|