@valtimo/task 10.0.1 → 10.2.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.
@@ -13,11 +13,11 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
- import { Component, EventEmitter, Output, ViewChild, ViewEncapsulation } from '@angular/core';
16
+ import { Component, EventEmitter, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
17
17
  import { FormioOptionsImpl, } from '@valtimo/components';
18
18
  import moment from 'moment';
19
19
  import { map, take } from 'rxjs/operators';
20
- import { BehaviorSubject } from 'rxjs';
20
+ import { BehaviorSubject, distinctUntilChanged, Subscription, tap } from 'rxjs';
21
21
  import * as i0 from "@angular/core";
22
22
  import * as i1 from "ngx-toastr";
23
23
  import * as i2 from "@valtimo/form-link";
@@ -57,9 +57,26 @@ export class TaskDetailModalComponent {
57
57
  this.processLinkIsFormFlow$ = this.taskProcessLinkType$.pipe(map(type => type === 'form-flow'));
58
58
  this.formFlowStepType$ = new BehaviorSubject(null);
59
59
  this.formFlowStepTypeIsForm$ = this.formFlowStepType$.pipe(map(type => type === 'form'));
60
+ this.formIoFormData$ = new BehaviorSubject(null);
61
+ this._subscriptions = new Subscription();
60
62
  this.formioOptions = new FormioOptionsImpl();
61
63
  this.formioOptions.disableAlerts = true;
62
64
  }
65
+ ngAfterViewInit() {
66
+ this._subscriptions.add(this.modal.modalShowing$
67
+ .pipe(distinctUntilChanged(), tap(modalShowing => {
68
+ const formIoFormData = this.formIoFormData$.getValue();
69
+ if (!modalShowing && formIoFormData) {
70
+ if (this.taskProcessLinkType$.getValue() === 'form-flow') {
71
+ this.formFlowService.save(this.formFlowInstanceId, formIoFormData).subscribe(() => null, errors => this.form.showErrors(errors));
72
+ }
73
+ }
74
+ }))
75
+ .subscribe());
76
+ }
77
+ ngOnDestroy() {
78
+ this._subscriptions.unsubscribe();
79
+ }
63
80
  openTaskDetails(task) {
64
81
  this.resetTaskProcessLinkType();
65
82
  this.resetFormDefinition();
@@ -105,7 +122,15 @@ export class TaskDetailModalComponent {
105
122
  this.modal.hide();
106
123
  this.router.navigate(['form-links']);
107
124
  }
125
+ onChange(event) {
126
+ if (event.data) {
127
+ this.formIoFormData$.next(event.data);
128
+ }
129
+ }
108
130
  onSubmit(submission) {
131
+ if (submission.data) {
132
+ this.formIoFormData$.next(submission.data);
133
+ }
109
134
  if (this.taskProcessLinkType$.getValue() === 'form') {
110
135
  this.formLinkService
111
136
  .onSubmit(this.task.processDefinitionKey, this.formAssociation.formLink.id, submission.data, this.task.businessKey, this.task.id)
@@ -122,7 +147,7 @@ export class TaskDetailModalComponent {
122
147
  .subscribe((result) => this.handleFormFlowStep(result), errors => this.form.showErrors(errors));
123
148
  }
124
149
  else if (submission.data['back']) {
125
- this.formFlowService.back(this.formFlowInstanceId).subscribe((result) => this.handleFormFlowStep(result), errors => this.form.showErrors(errors));
150
+ this.formFlowService.back(this.formFlowInstanceId, submission.data).subscribe((result) => this.handleFormFlowStep(result), errors => this.form.showErrors(errors));
126
151
  }
127
152
  }
128
153
  }
@@ -202,10 +227,10 @@ export class TaskDetailModalComponent {
202
227
  }
203
228
  }
204
229
  TaskDetailModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TaskDetailModalComponent, deps: [{ token: i1.ToastrService }, { token: i2.FormLinkService }, { token: i2.FormFlowService }, { token: i3.Router }, { token: i4.NGXLogger }, { token: i3.ActivatedRoute }, { token: i5.TaskService }, { token: i6.UserProviderService }, { token: i7.ValtimoModalService }, { token: i8.DocumentService }, { token: i9.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
205
- TaskDetailModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: TaskDetailModalComponent, selector: "valtimo-task-detail-modal", outputs: { formSubmit: "formSubmit", assignmentOfTaskChanged: "assignmentOfTaskChanged" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["form"], descendants: true }, { propertyName: "modal", first: true, predicate: ["taskDetailModal"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2020 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<valtimo-modal\n #taskDetailModal\n elementId=\"taskDetailModal\"\n [title]=\"page?.title\"\n [subtitle]=\"page?.subtitle\"\n [templateBelowSubtitle]=\"assignUserToTask\"\n>\n <div\n body\n *ngIf=\"formDefinition && ((processLinkIsForm$ | async) || (formFlowStepTypeIsForm$ | async))\"\n >\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n <div body *ngIf=\"!formDefinition && !errorMessage\">\n <div class=\"bg-warning text-black mb-0 p-3 text-center\">\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n </div>\n <div body *ngIf=\"errorMessage\">\n <div class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ errorMessage }}\n </div>\n </div>\n <div footer>\n <div class=\"mb-0 p-3 text-center\" *ngIf=\"!formDefinition\">\n <button\n class=\"btn btn-secondary btn-space\"\n type=\"button\"\n (click)=\"gotoFormLinkScreen()\"\n id=\"form-link-button\"\n >\n {{ 'formManagement.gotoFormLinksButton' | translate }}\n </button>\n </div>\n </div>\n</valtimo-modal>\n\n<ng-template #assignUserToTask>\n <valtimo-assign-user-to-task\n *ngIf=\"task && assignmentOfTaskChanged\"\n [taskId]=\"task.id\"\n [assigneeEmail]=\"task.assignee\"\n (assignmentOfTaskChanged)=\"assignmentOfTaskChanged.emit()\"\n ></valtimo-assign-user-to-task>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2020 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 */#taskDetailModal .formio-component-submit{text-align:right}\n"], dependencies: [{ kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.FormioComponent, selector: "valtimo-form-io", inputs: ["form", "options", "submission", "readOnly", "formRefresh$"], outputs: ["submit", "change"] }, { kind: "component", type: i7.ModalComponent, selector: "valtimo-modal", inputs: ["elementId", "title", "subtitle", "templateBelowSubtitle", "showFooter"] }, { kind: "component", type: i11.AssignUserToTaskComponent, selector: "valtimo-assign-user-to-task", inputs: ["taskId", "assigneeEmail"], outputs: ["assignmentOfTaskChanged"] }, { kind: "pipe", type: i10.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None });
230
+ TaskDetailModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: TaskDetailModalComponent, selector: "valtimo-task-detail-modal", outputs: { formSubmit: "formSubmit", assignmentOfTaskChanged: "assignmentOfTaskChanged" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["form"], descendants: true }, { propertyName: "modal", first: true, predicate: ["taskDetailModal"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2020 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<valtimo-modal\n #taskDetailModal\n elementId=\"taskDetailModal\"\n [title]=\"page?.title\"\n [subtitle]=\"page?.subtitle\"\n [templateBelowSubtitle]=\"assignUserToTask\"\n>\n <div\n body\n *ngIf=\"formDefinition && ((processLinkIsForm$ | async) || (formFlowStepTypeIsForm$ | async))\"\n >\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n <div body *ngIf=\"!formDefinition && !errorMessage\">\n <div class=\"bg-warning text-black mb-0 p-3 text-center\">\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n </div>\n <div body *ngIf=\"errorMessage\">\n <div class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ errorMessage }}\n </div>\n </div>\n <div footer>\n <div class=\"mb-0 p-3 text-center\" *ngIf=\"!formDefinition\">\n <button\n class=\"btn btn-secondary btn-space\"\n type=\"button\"\n (click)=\"gotoFormLinkScreen()\"\n id=\"form-link-button\"\n >\n {{ 'formManagement.gotoFormLinksButton' | translate }}\n </button>\n </div>\n </div>\n</valtimo-modal>\n\n<ng-template #assignUserToTask>\n <valtimo-assign-user-to-task\n *ngIf=\"task && assignmentOfTaskChanged\"\n [taskId]=\"task.id\"\n [assigneeEmail]=\"task.assignee\"\n (assignmentOfTaskChanged)=\"assignmentOfTaskChanged.emit()\"\n ></valtimo-assign-user-to-task>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2020 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 */#taskDetailModal{pointer-events:none}#taskDetailModal .formio-component-submit{text-align:right}\n"], dependencies: [{ kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.FormioComponent, selector: "valtimo-form-io", inputs: ["form", "options", "submission", "readOnly", "formRefresh$"], outputs: ["submit", "change"] }, { kind: "component", type: i7.ModalComponent, selector: "valtimo-modal", inputs: ["elementId", "title", "subtitle", "templateBelowSubtitle", "showFooter"] }, { kind: "component", type: i11.AssignUserToTaskComponent, selector: "valtimo-assign-user-to-task", inputs: ["taskId", "assigneeEmail"], outputs: ["assignmentOfTaskChanged"] }, { kind: "pipe", type: i10.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None });
206
231
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TaskDetailModalComponent, decorators: [{
207
232
  type: Component,
208
- args: [{ selector: 'valtimo-task-detail-modal', encapsulation: ViewEncapsulation.None, template: "<!--\n ~ Copyright 2015-2020 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<valtimo-modal\n #taskDetailModal\n elementId=\"taskDetailModal\"\n [title]=\"page?.title\"\n [subtitle]=\"page?.subtitle\"\n [templateBelowSubtitle]=\"assignUserToTask\"\n>\n <div\n body\n *ngIf=\"formDefinition && ((processLinkIsForm$ | async) || (formFlowStepTypeIsForm$ | async))\"\n >\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n <div body *ngIf=\"!formDefinition && !errorMessage\">\n <div class=\"bg-warning text-black mb-0 p-3 text-center\">\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n </div>\n <div body *ngIf=\"errorMessage\">\n <div class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ errorMessage }}\n </div>\n </div>\n <div footer>\n <div class=\"mb-0 p-3 text-center\" *ngIf=\"!formDefinition\">\n <button\n class=\"btn btn-secondary btn-space\"\n type=\"button\"\n (click)=\"gotoFormLinkScreen()\"\n id=\"form-link-button\"\n >\n {{ 'formManagement.gotoFormLinksButton' | translate }}\n </button>\n </div>\n </div>\n</valtimo-modal>\n\n<ng-template #assignUserToTask>\n <valtimo-assign-user-to-task\n *ngIf=\"task && assignmentOfTaskChanged\"\n [taskId]=\"task.id\"\n [assigneeEmail]=\"task.assignee\"\n (assignmentOfTaskChanged)=\"assignmentOfTaskChanged.emit()\"\n ></valtimo-assign-user-to-task>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2020 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 */#taskDetailModal .formio-component-submit{text-align:right}\n"] }]
233
+ args: [{ selector: 'valtimo-task-detail-modal', encapsulation: ViewEncapsulation.None, template: "<!--\n ~ Copyright 2015-2020 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<valtimo-modal\n #taskDetailModal\n elementId=\"taskDetailModal\"\n [title]=\"page?.title\"\n [subtitle]=\"page?.subtitle\"\n [templateBelowSubtitle]=\"assignUserToTask\"\n>\n <div\n body\n *ngIf=\"formDefinition && ((processLinkIsForm$ | async) || (formFlowStepTypeIsForm$ | async))\"\n >\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n <div body *ngIf=\"!formDefinition && !errorMessage\">\n <div class=\"bg-warning text-black mb-0 p-3 text-center\">\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n </div>\n <div body *ngIf=\"errorMessage\">\n <div class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ errorMessage }}\n </div>\n </div>\n <div footer>\n <div class=\"mb-0 p-3 text-center\" *ngIf=\"!formDefinition\">\n <button\n class=\"btn btn-secondary btn-space\"\n type=\"button\"\n (click)=\"gotoFormLinkScreen()\"\n id=\"form-link-button\"\n >\n {{ 'formManagement.gotoFormLinksButton' | translate }}\n </button>\n </div>\n </div>\n</valtimo-modal>\n\n<ng-template #assignUserToTask>\n <valtimo-assign-user-to-task\n *ngIf=\"task && assignmentOfTaskChanged\"\n [taskId]=\"task.id\"\n [assigneeEmail]=\"task.assignee\"\n (assignmentOfTaskChanged)=\"assignmentOfTaskChanged.emit()\"\n ></valtimo-assign-user-to-task>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2020 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 */#taskDetailModal{pointer-events:none}#taskDetailModal .formio-component-submit{text-align:right}\n"] }]
209
234
  }], ctorParameters: function () { return [{ type: i1.ToastrService }, { type: i2.FormLinkService }, { type: i2.FormFlowService }, { type: i3.Router }, { type: i4.NGXLogger }, { type: i3.ActivatedRoute }, { type: i5.TaskService }, { type: i6.UserProviderService }, { type: i7.ValtimoModalService }, { type: i8.DocumentService }, { type: i9.TranslateService }]; }, propDecorators: { form: [{
210
235
  type: ViewChild,
211
236
  args: ['form']
@@ -217,4 +242,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
217
242
  }], assignmentOfTaskChanged: [{
218
243
  type: Output
219
244
  }] } });
220
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvdGFzay1kZXRhaWwtbW9kYWwvdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvdGFzay1kZXRhaWwtbW9kYWwvdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTVGLE9BQU8sRUFFTCxpQkFBaUIsR0FLbEIsTUFBTSxxQkFBcUIsQ0FBQztBQVc3QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFHNUIsT0FBTyxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6QyxPQUFPLEVBQUMsZUFBZSxFQUFhLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBS2pELE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQVFyRCxNQUFNLE9BQU8sd0JBQXdCO0lBdUJuQyxZQUNtQixNQUFxQixFQUNyQixlQUFnQyxFQUNoQyxlQUFnQyxFQUNoQyxNQUFjLEVBQ2QsTUFBaUIsRUFDakIsS0FBcUIsRUFDckIsV0FBd0IsRUFDeEIsbUJBQXdDLEVBQ3hDLFlBQWlDLEVBQ2pDLGVBQWdDLEVBQ2hDLGdCQUFrQztRQVZsQyxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxvQkFBZSxHQUFm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U0FBUzt1QkFBQyxNQUFNO2dCQUNhLEtBQUs7c0JBQWxDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUNsQixVQUFVO3NCQUFuQixNQUFNO2dCQUNHLHVCQUF1QjtzQkFBaEMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxNS0yMDIwIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICBGb3JtaW9Db21wb25lbnQsXG4gIEZvcm1pb09wdGlvbnNJbXBsLFxuICBGb3JtaW9TdWJtaXNzaW9uLFxuICBNb2RhbENvbXBvbmVudCxcbiAgVmFsdGltb0Zvcm1pb09wdGlvbnMsXG4gIFZhbHRpbW9Nb2RhbFNlcnZpY2UsXG59IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtUYXNrLCBUYXNrUHJvY2Vzc0xpbmtUeXBlfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtcbiAgRm9ybUFzc29jaWF0aW9uLFxuICBGb3JtRmxvd0luc3RhbmNlLFxuICBGb3JtRmxvd1NlcnZpY2UsXG4gIEZvcm1GbG93U3RlcFR5cGUsXG4gIEZvcm1MaW5rU2VydmljZSxcbiAgRm9ybVN1Ym1pc3Npb25SZXN1bHQsXG59IGZyb20gJ0B2YWx0aW1vL2Zvcm0tbGluayc7XG5pbXBvcnQge0Zvcm1pb0Zvcm19IGZyb20gJ0Bmb3JtaW8vYW5ndWxhcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge05HWExvZ2dlcn0gZnJvbSAnbmd4LWxvZ2dlcic7XG5pbXBvcnQge1RvYXN0clNlcnZpY2V9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHttYXAsIHRha2V9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7VGFza1NlcnZpY2V9IGZyb20gJy4uL3Rhc2suc2VydmljZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1VzZXJQcm92aWRlclNlcnZpY2V9IGZyb20gJ0B2YWx0aW1vL3NlY3VyaXR5JztcbmltcG9ydCB7RG9jdW1lbnRTZXJ2aWNlfSBmcm9tICdAdmFsdGltby9kb2N1bWVudCc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5tb21lbnQubG9jYWxlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYW5nS2V5JykgfHwgJycpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLXRhc2stZGV0YWlsLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhc2stZGV0YWlsLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgVGFza0RldGFpbE1vZGFsQ29tcG9uZW50IHtcbiAgQFZpZXdDaGlsZCgnZm9ybScpIGZvcm06IEZvcm1pb0NvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgndGFza0RldGFpbE1vZGFsJykgbW9kYWw6IE1vZGFsQ29tcG9uZW50O1xuICBAT3V0cHV0KCkgZm9ybVN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGFzc2lnbm1lbnRPZlRhc2tDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyB0YXNrOiBUYXNrIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBmb3JtRGVmaW5pdGlvbjogRm9ybWlvRm9ybTtcbiAgcHVibGljIGZvcm1GbG93SW5zdGFuY2VJZDogc3RyaW5nO1xuICBwdWJsaWMgZm9ybUZsb3dTdGVwSW5zdGFuY2VJZD86IHN0cmluZztcbiAgcHVibGljIHBhZ2U6IGFueSA9IG51bGw7XG4gIHB1YmxpYyBmb3JtaW9PcHRpb25zOiBWYWx0aW1vRm9ybWlvT3B0aW9ucztcbiAgcHVibGljIGVycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcbiAgcmVhZG9ubHkgaXNBZG1pbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnVzZXJQcm92aWRlclNlcnZpY2VcbiAgICAuZ2V0VXNlclN1YmplY3QoKVxuICAgIC5waXBlKG1hcCh1c2VySWRlbnRpdHkgPT4gdXNlcklkZW50aXR5Py5yb2xlcz8uaW5jbHVkZXMoJ1JPTEVfQURNSU4nKSkpO1xuICBwcml2YXRlIGZvcm1Bc3NvY2lhdGlvbjogRm9ybUFzc29jaWF0aW9uO1xuICBwcml2YXRlIHRhc2tQcm9jZXNzTGlua1R5cGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYXNrUHJvY2Vzc0xpbmtUeXBlIHwgbnVsbD4obnVsbCk7XG4gIHByb2Nlc3NMaW5rSXNGb3JtJCA9IHRoaXMudGFza1Byb2Nlc3NMaW5rVHlwZSQucGlwZShtYXAodHlwZSA9PiB0eXBlID09PSAnZm9ybScpKTtcbiAgcHJvY2Vzc0xpbmtJc0Zvcm1GbG93JCA9IHRoaXMudGFza1Byb2Nlc3NMaW5rVHlwZSQucGlwZShtYXAodHlwZSA9PiB0eXBlID09PSAnZm9ybS1mbG93JykpO1xuICBwcml2YXRlIGZvcm1GbG93U3RlcFR5cGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGb3JtRmxvd1N0ZXBUeXBlIHwgbnVsbD4obnVsbCk7XG4gIGZvcm1GbG93U3RlcFR5cGVJc0Zvcm0kID0gdGhpcy5mb3JtRmxvd1N0ZXBUeXBlJC5waXBlKG1hcCh0eXBlID0+IHR5cGUgPT09ICdmb3JtJykpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybUxpbmtTZXJ2aWNlOiBGb3JtTGlua1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtRmxvd1NlcnZpY2U6IEZvcm1GbG93U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBOR1hMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0YXNrU2VydmljZTogVGFza1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB1c2VyUHJvdmlkZXJTZXJ2aWNlOiBVc2VyUHJvdmlkZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9kYWxTZXJ2aWNlOiBWYWx0aW1vTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnRTZXJ2aWNlOiBEb2N1bWVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuZm9ybWlvT3B0aW9ucyA9IG5ldyBGb3JtaW9PcHRpb25zSW1wbCgpO1xuICAgIHRoaXMuZm9ybWlvT3B0aW9ucy5kaXNhYmxlQWxlcnRzID0gdHJ1ZTtcbiAgfVxuXG4gIG9wZW5UYXNrRGV0YWlscyh0YXNrOiBUYXNrKSB7XG4gICAgdGhpcy5yZXNldFRhc2tQcm9jZXNzTGlua1R5cGUoKTtcbiAgICB0aGlzLnJlc2V0Rm9ybURlZmluaXRpb24oKTtcbiAgICB0aGlzLmdldFRhc2tQcm9jZXNzTGluayh0YXNrLmlkKTtcbiAgICB0aGlzLnNldERvY3VtZW50RGVmaW5pdGlvbk5hbWVJblNlcnZpY2UodGFzayk7XG5cbiAgICB0aGlzLnRhc2sgPSB0YXNrO1xuICAgIHRoaXMucGFnZSA9IHtcbiAgICAgIHRpdGxlOiB0YXNrLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogYCR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3Rhc2tEZXRhaWwudGFza0NyZWF0ZWQnKX0gJHt0YXNrLmNyZWF0ZWR9YCxcbiAgICB9O1xuXG4gICAgdGhpcy5mb3JtTGlua1NlcnZpY2VcbiAgICAgIC5nZXRQcmVGaWxsZWRGb3JtRGVmaW5pdGlvbkJ5Rm9ybUxpbmtJZChcbiAgICAgICAgdGFzay5wcm9jZXNzRGVmaW5pdGlvbktleSxcbiAgICAgICAgdGFzay5idXNpbmVzc0tleSxcbiAgICAgICAgdGFzay50YXNrRGVmaW5pdGlvbktleSxcbiAgICAgICAgdGFzay5pZCAvLyB0YXNrSW5zdGFuY2VJZFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgZm9ybURlZmluaXRpb24gPT4ge1xuICAgICAgICAgIHRoaXMuZm9ybUFzc29jaWF0aW9uID0gZm9ybURlZmluaXRpb24uZm9ybUFzc29jaWF0aW9uO1xuXG4gICAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5mb3JtQXNzb2NpYXRpb24uZm9ybUxpbmsuY2xhc3NOYW1lLnNwbGl0KCcuJyk7XG4gICAgICAgICAgY29uc3QgbGlua1R5cGUgPSBjbGFzc05hbWVbY2xhc3NOYW1lLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgICAgc3dpdGNoIChsaW5rVHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnQnBtbkVsZW1lbnRGb3JtSWRMaW5rJzpcbiAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGVmaW5pdGlvbkFuZE9wZW5Nb2RhbChmb3JtRGVmaW5pdGlvbik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQnBtbkVsZW1lbnRGb3JtRmxvd0lkTGluayc6XG4gICAgICAgICAgICAgIC8vIFdlIGNhbid0IHVzZSB0aGUgZm9ybURlZmluaXRpb24gaGVyZSBiZWNhdXNlIHRoZSBmb3JtIGRlZmluaXRpb24gaXMgcHJvdmlkZWQgcGVyIGZvcm0gZmxvdyBzdGVwXG4gICAgICAgICAgICAgIC8vIEknbSBzdGlsbCBsZWF2aW5nIHRoaXMgaW4gaGVyZSBpbiBjYXNlIHdlIHdhbnQgdG8gYWRkIGZvcm0gZmxvdyBzcGVjaWZpYyBjb2RlLlxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JwbW5FbGVtZW50VXJsTGluayc6XG4gICAgICAgICAgICAgIHRoaXMub3BlblVybExpbmsoZm9ybURlZmluaXRpb24pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JwbW5FbGVtZW50QW5ndWxhclN0YXRlVXJsTGluayc6XG4gICAgICAgICAgICAgIHRoaXMub3BlbkFuZ3VsYXJTdGF0ZVVybExpbmsodGFzaywgZm9ybURlZmluaXRpb24pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmZhdGFsKCdVbnN1cHBvcnRlZCBjbGFzcyBuYW1lJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcnMgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcnM/LmVycm9yPy5kZXRhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3JzLmVycm9yLmRldGFpbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLm1vZGFsLnNob3coKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnb3RvRm9ybUxpbmtTY3JlZW4oKTogdm9pZCB7XG4gICAgdGhpcy5tb2RhbC5oaWRlKCk7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydmb3JtLWxpbmtzJ10pO1xuICB9XG5cbiAgcHVibGljIG9uU3VibWl0KHN1Ym1pc3Npb246IEZvcm1pb1N1Ym1pc3Npb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5nZXRWYWx1ZSgpID09PSAnZm9ybScpIHtcbiAgICAgIHRoaXMuZm9ybUxpbmtTZXJ2aWNlXG4gICAgICAgIC5vblN1Ym1pdChcbiAgICAgICAgICB0aGlzLnRhc2sucHJvY2Vzc0RlZmluaXRpb25LZXksXG4gICAgICAgICAgdGhpcy5mb3JtQXNzb2NpYXRpb24uZm9ybUxpbmsuaWQsXG4gICAgICAgICAgc3VibWlzc2lvbi5kYXRhLFxuICAgICAgICAgIHRoaXMudGFzay5idXNpbmVzc0tleSxcbiAgICAgICAgICB0aGlzLnRhc2suaWRcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgIChfOiBGb3JtU3VibWlzc2lvblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZVRhc2soKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9ycyA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcm0uc2hvd0Vycm9ycyhlcnJvcnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5nZXRWYWx1ZSgpID09PSAnZm9ybS1mbG93Jykge1xuICAgICAgaWYgKHN1Ym1pc3Npb24uZGF0YS5zdWJtaXQpIHtcbiAgICAgICAgdGhpcy5mb3JtRmxvd1NlcnZpY2VcbiAgICAgICAgICAuc3VibWl0U3RlcCh0aGlzLmZvcm1GbG93SW5zdGFuY2VJZCwgdGhpcy5mb3JtRmxvd1N0ZXBJbnN0YW5jZUlkLCBzdWJtaXNzaW9uLmRhdGEpXG4gICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgIChyZXN1bHQ6IEZvcm1GbG93SW5zdGFuY2UpID0+IHRoaXMuaGFuZGxlRm9ybUZsb3dTdGVwKHJlc3VsdCksXG4gICAgICAgICAgICBlcnJvcnMgPT4gdGhpcy5mb3JtLnNob3dFcnJvcnMoZXJyb3JzKVxuICAgICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHN1Ym1pc3Npb24uZGF0YVsnYmFjayddKSB7XG4gICAgICAgIHRoaXMuZm9ybUZsb3dTZXJ2aWNlLmJhY2sodGhpcy5mb3JtRmxvd0luc3RhbmNlSWQpLnN1YnNjcmliZShcbiAgICAgICAgICAocmVzdWx0OiBGb3JtRmxvd0luc3RhbmNlKSA9PiB0aGlzLmhhbmRsZUZvcm1GbG93U3RlcChyZXN1bHQpLFxuICAgICAgICAgIGVycm9ycyA9PiB0aGlzLmZvcm0uc2hvd0Vycm9ycyhlcnJvcnMpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEZvcm1EZWZpbml0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuZm9ybURlZmluaXRpb24gPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYXNrUHJvY2Vzc0xpbmsodGFza0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRhc2tTZXJ2aWNlLmdldFRhc2tQcm9jZXNzTGluayh0YXNrSWQpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgc3dpdGNoIChyZXM/LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgICAgdGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KCdmb3JtJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Zvcm0tZmxvdyc6XG4gICAgICAgICAgdGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KCdmb3JtLWZsb3cnKTtcbiAgICAgICAgICB0aGlzLmdldEZvcm1GbG93U3RlcChyZXM/LnByb3BlcnRpZXMuZm9ybUZsb3dJbnN0YW5jZUlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rm9ybUZsb3dTdGVwKGZvcm1GbG93SW5zdGFuY2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtRmxvd1NlcnZpY2VcbiAgICAgIC5nZXRGb3JtRmxvd1N0ZXAoZm9ybUZsb3dJbnN0YW5jZUlkKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBGb3JtRmxvd0luc3RhbmNlKSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlRm9ybUZsb3dTdGVwKHJlc3VsdCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRm9ybUZsb3dTdGVwKGZvcm1GbG93SW5zdGFuY2U6IEZvcm1GbG93SW5zdGFuY2UpIHtcbiAgICBpZiAoZm9ybUZsb3dJbnN0YW5jZS5zdGVwID09PSBudWxsKSB7XG4gICAgICB0aGlzLmZvcm1GbG93U3RlcFR5cGUkLm5leHQobnVsbCk7XG4gICAgICB0aGlzLmZvcm1GbG93SW5zdGFuY2VJZCA9IG51bGw7XG4gICAgICB0aGlzLmZvcm1GbG93U3RlcEluc3RhbmNlSWQgPSBudWxsO1xuICAgICAgdGhpcy5jb21wbGV0ZVRhc2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uuc2Nyb2xsVG9Ub3AoKTtcbiAgICAgIHRoaXMuZm9ybUZsb3dTdGVwVHlwZSQubmV4dChmb3JtRmxvd0luc3RhbmNlLnN0ZXAudHlwZSk7XG4gICAgICB0aGlzLmZvcm1GbG93SW5zdGFuY2VJZCA9IGZvcm1GbG93SW5zdGFuY2UuaWQ7XG4gICAgICB0aGlzLmZvcm1GbG93U3RlcEluc3RhbmNlSWQgPSBmb3JtRmxvd0luc3RhbmNlLnN0ZXAuaWQ7XG4gICAgICB0aGlzLnNldEZvcm1EZWZpbml0aW9uQW5kT3Blbk1vZGFsKGZvcm1GbG93SW5zdGFuY2Uuc3RlcC50eXBlUHJvcGVydGllcy5kZWZpbml0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbXBsZXRlVGFzaygpIHtcbiAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKFxuICAgICAgYCR7dGhpcy50YXNrLm5hbWV9ICR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3Rhc2tEZXRhaWwudGFza0NvbXBsZXRlZCcpfWBcbiAgICApO1xuICAgIHRoaXMubW9kYWwuaGlkZSgpO1xuICAgIHRoaXMudGFzayA9IG51bGw7XG4gICAgdGhpcy5mb3JtU3VibWl0LmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRUYXNrUHJvY2Vzc0xpbmtUeXBlKCk6IHZvaWQge1xuICAgIHRoaXMudGFza1Byb2Nlc3NMaW5rVHlwZSQubmV4dChudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Rm9ybURlZmluaXRpb25BbmRPcGVuTW9kYWwoZm9ybURlZmluaXRpb246IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZm9ybURlZmluaXRpb24gPSBmb3JtRGVmaW5pdGlvbjtcbiAgICB0aGlzLm1vZGFsLnNob3coKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlblVybExpbmsoZm9ybURlZmluaXRpb246IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHVybCA9IHRoaXMucm91dGVyLnNlcmlhbGl6ZVVybChcbiAgICAgIHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoW2Zvcm1EZWZpbml0aW9uLmZvcm1Bc3NvY2lhdGlvbi5mb3JtTGluay51cmxdKVxuICAgICk7XG5cbiAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbkFuZ3VsYXJTdGF0ZVVybExpbmsodGFzazogVGFzaywgZm9ybURlZmluaXRpb246IGFueSk6IHZvaWQge1xuICAgIHRoaXMucm91dGUucGFyYW1zLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICBjb25zdCB0YXNrSWQgPSB0YXNrPy5pZDtcbiAgICAgIGNvbnN0IGRvY3VtZW50SWQgPSBwYXJhbXM/LmRvY3VtZW50SWQ7XG5cbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtmb3JtRGVmaW5pdGlvbi5mb3JtQXNzb2NpYXRpb24uZm9ybUxpbmsudXJsXSwge1xuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIC4uLih0YXNrSWQgJiYge3Rhc2tJZH0pLFxuICAgICAgICAgIC4uLihkb2N1bWVudElkICYmIHtkb2N1bWVudElkfSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RG9jdW1lbnREZWZpbml0aW9uTmFtZUluU2VydmljZSh0YXNrOiBUYXNrKTogdm9pZCB7XG4gICAgdGhpcy5kb2N1bWVudFNlcnZpY2VcbiAgICAgIC5nZXRQcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uRnJvbVByb2Nlc3NJbnN0YW5jZUlkKHRhc2sucHJvY2Vzc0luc3RhbmNlSWQpXG4gICAgICAuc3Vic2NyaWJlKHByb2Nlc3NEb2N1bWVudERlZmluaXRpb24gPT4ge1xuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5zZXREb2N1bWVudERlZmluaXRpb25OYW1lKFxuICAgICAgICAgIHByb2Nlc3NEb2N1bWVudERlZmluaXRpb24uaWQuZG9jdW1lbnREZWZpbml0aW9uSWQubmFtZVxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDIwIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cblxuPHZhbHRpbW8tbW9kYWxcbiAgI3Rhc2tEZXRhaWxNb2RhbFxuICBlbGVtZW50SWQ9XCJ0YXNrRGV0YWlsTW9kYWxcIlxuICBbdGl0bGVdPVwicGFnZT8udGl0bGVcIlxuICBbc3VidGl0bGVdPVwicGFnZT8uc3VidGl0bGVcIlxuICBbdGVtcGxhdGVCZWxvd1N1YnRpdGxlXT1cImFzc2lnblVzZXJUb1Rhc2tcIlxuPlxuICA8ZGl2XG4gICAgYm9keVxuICAgICpuZ0lmPVwiZm9ybURlZmluaXRpb24gJiYgKChwcm9jZXNzTGlua0lzRm9ybSQgfCBhc3luYykgfHwgKGZvcm1GbG93U3RlcFR5cGVJc0Zvcm0kIHwgYXN5bmMpKVwiXG4gID5cbiAgICA8dmFsdGltby1mb3JtLWlvXG4gICAgICAjZm9ybVxuICAgICAgW2Zvcm1dPVwiZm9ybURlZmluaXRpb25cIlxuICAgICAgKHN1Ym1pdCk9XCJvblN1Ym1pdCgkZXZlbnQpXCJcbiAgICAgIFtvcHRpb25zXT1cImZvcm1pb09wdGlvbnNcIlxuICAgID48L3ZhbHRpbW8tZm9ybS1pbz5cbiAgPC9kaXY+XG4gIDxkaXYgYm9keSAqbmdJZj1cIiFmb3JtRGVmaW5pdGlvbiAmJiAhZXJyb3JNZXNzYWdlXCI+XG4gICAgPGRpdiBjbGFzcz1cImJnLXdhcm5pbmcgdGV4dC1ibGFjayBtYi0wIHAtMyB0ZXh0LWNlbnRlclwiPlxuICAgICAge3tcbiAgICAgICAgKGlzQWRtaW4kIHwgYXN5bmMpXG4gICAgICAgICAgPyAoJ2Zvcm1NYW5hZ2VtZW50Lm5vRm9ybURlZmluaXRpb25Gb3VuZEFkbWluJyB8IHRyYW5zbGF0ZSlcbiAgICAgICAgICA6ICgnZm9ybU1hbmFnZW1lbnQubm9Gb3JtRGVmaW5pdGlvbkZvdW5kVXNlcicgfCB0cmFuc2xhdGUpXG4gICAgICB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBib2R5ICpuZ0lmPVwiZXJyb3JNZXNzYWdlXCI+XG4gICAgPGRpdiBjbGFzcz1cImJnLWRhbmdlciB0ZXh0LWJsYWNrIG1iLTAgcC0zIHRleHQtY2VudGVyXCI+XG4gICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgZm9vdGVyPlxuICAgIDxkaXYgY2xhc3M9XCJtYi0wIHAtMyB0ZXh0LWNlbnRlclwiICpuZ0lmPVwiIWZvcm1EZWZpbml0aW9uXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNwYWNlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJnb3RvRm9ybUxpbmtTY3JlZW4oKVwiXG4gICAgICAgIGlkPVwiZm9ybS1saW5rLWJ1dHRvblwiXG4gICAgICA+XG4gICAgICAgIHt7ICdmb3JtTWFuYWdlbWVudC5nb3RvRm9ybUxpbmtzQnV0dG9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC92YWx0aW1vLW1vZGFsPlxuXG48bmctdGVtcGxhdGUgI2Fzc2lnblVzZXJUb1Rhc2s+XG4gIDx2YWx0aW1vLWFzc2lnbi11c2VyLXRvLXRhc2tcbiAgICAqbmdJZj1cInRhc2sgJiYgYXNzaWdubWVudE9mVGFza0NoYW5nZWRcIlxuICAgIFt0YXNrSWRdPVwidGFzay5pZFwiXG4gICAgW2Fzc2lnbmVlRW1haWxdPVwidGFzay5hc3NpZ25lZVwiXG4gICAgKGFzc2lnbm1lbnRPZlRhc2tDaGFuZ2VkKT1cImFzc2lnbm1lbnRPZlRhc2tDaGFuZ2VkLmVtaXQoKVwiXG4gID48L3ZhbHRpbW8tYXNzaWduLXVzZXItdG8tdGFzaz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
245
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvdGFzay1kZXRhaWwtbW9kYWwvdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvdGFzay1kZXRhaWwtbW9kYWwvdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFFWixNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBRUwsaUJBQWlCLEdBS2xCLE1BQU0scUJBQXFCLENBQUM7QUFXN0IsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRzVCLE9BQU8sRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBYyxZQUFZLEVBQUUsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBSzFGLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQVFyRCxNQUFNLE9BQU8sd0JBQXdCO0lBeUJuQyxZQUNtQixNQUFxQixFQUNyQixlQUFnQyxFQUNoQyxlQUFnQyxFQUNoQyxNQUFjLEVBQ2QsTUFBaUIsRUFDakIsS0FBcUIsRUFDckIsV0FBd0IsRUFDeEIsbUJBQXdDLEVBQ3hDLFlBQWlDLEVBQ2pDLGVBQWdDLEVBQ2hDLGdCQUFrQztRQVZsQyxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLG9CQUFl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QkFBMkIsaUJBR3RCLGlCQUFpQixDQUFDLElBQUk7cVlBR2xCLElBQUk7c0JBQXRCLFNBQVM7dUJBQUMsTUFBTTtnQkFDYSxLQUFLO3NCQUFsQyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDbEIsVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyMCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgRm9ybWlvQ29tcG9uZW50LFxuICBGb3JtaW9PcHRpb25zSW1wbCxcbiAgRm9ybWlvU3VibWlzc2lvbixcbiAgTW9kYWxDb21wb25lbnQsXG4gIFZhbHRpbW9Gb3JtaW9PcHRpb25zLFxuICBWYWx0aW1vTW9kYWxTZXJ2aWNlLFxufSBmcm9tICdAdmFsdGltby9jb21wb25lbnRzJztcbmltcG9ydCB7VGFzaywgVGFza1Byb2Nlc3NMaW5rVHlwZX0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG4gIEZvcm1Bc3NvY2lhdGlvbixcbiAgRm9ybUZsb3dJbnN0YW5jZSxcbiAgRm9ybUZsb3dTZXJ2aWNlLFxuICBGb3JtRmxvd1N0ZXBUeXBlLFxuICBGb3JtTGlua1NlcnZpY2UsXG4gIEZvcm1TdWJtaXNzaW9uUmVzdWx0LFxufSBmcm9tICdAdmFsdGltby9mb3JtLWxpbmsnO1xuaW1wb3J0IHtGb3JtaW9Gb3JtfSBmcm9tICdAZm9ybWlvL2FuZ3VsYXInO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtOR1hMb2dnZXJ9IGZyb20gJ25neC1sb2dnZXInO1xuaW1wb3J0IHtUb2FzdHJTZXJ2aWNlfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7bWFwLCB0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1Rhc2tTZXJ2aWNlfSBmcm9tICcuLi90YXNrLnNlcnZpY2UnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIHRhcH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1VzZXJQcm92aWRlclNlcnZpY2V9IGZyb20gJ0B2YWx0aW1vL3NlY3VyaXR5JztcbmltcG9ydCB7RG9jdW1lbnRTZXJ2aWNlfSBmcm9tICdAdmFsdGltby9kb2N1bWVudCc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5tb21lbnQubG9jYWxlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdsYW5nS2V5JykgfHwgJycpO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLXRhc2stZGV0YWlsLW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhc2stZGV0YWlsLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgVGFza0RldGFpbE1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQFZpZXdDaGlsZCgnZm9ybScpIGZvcm06IEZvcm1pb0NvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgndGFza0RldGFpbE1vZGFsJykgbW9kYWw6IE1vZGFsQ29tcG9uZW50O1xuICBAT3V0cHV0KCkgZm9ybVN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGFzc2lnbm1lbnRPZlRhc2tDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyB0YXNrOiBUYXNrIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBmb3JtRGVmaW5pdGlvbjogRm9ybWlvRm9ybTtcbiAgcHVibGljIGZvcm1GbG93SW5zdGFuY2VJZDogc3RyaW5nO1xuICBwdWJsaWMgZm9ybUZsb3dTdGVwSW5zdGFuY2VJZD86IHN0cmluZztcbiAgcHVibGljIHBhZ2U6IGFueSA9IG51bGw7XG4gIHB1YmxpYyBmb3JtaW9PcHRpb25zOiBWYWx0aW1vRm9ybWlvT3B0aW9ucztcbiAgcHVibGljIGVycm9yTWVzc2FnZTogc3RyaW5nID0gbnVsbDtcbiAgcmVhZG9ubHkgaXNBZG1pbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnVzZXJQcm92aWRlclNlcnZpY2VcbiAgICAuZ2V0VXNlclN1YmplY3QoKVxuICAgIC5waXBlKG1hcCh1c2VySWRlbnRpdHkgPT4gdXNlcklkZW50aXR5Py5yb2xlcz8uaW5jbHVkZXMoJ1JPTEVfQURNSU4nKSkpO1xuICBwcml2YXRlIGZvcm1Bc3NvY2lhdGlvbjogRm9ybUFzc29jaWF0aW9uO1xuICBwcml2YXRlIHRhc2tQcm9jZXNzTGlua1R5cGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYXNrUHJvY2Vzc0xpbmtUeXBlIHwgbnVsbD4obnVsbCk7XG4gIHByb2Nlc3NMaW5rSXNGb3JtJCA9IHRoaXMudGFza1Byb2Nlc3NMaW5rVHlwZSQucGlwZShtYXAodHlwZSA9PiB0eXBlID09PSAnZm9ybScpKTtcbiAgcHJvY2Vzc0xpbmtJc0Zvcm1GbG93JCA9IHRoaXMudGFza1Byb2Nlc3NMaW5rVHlwZSQucGlwZShtYXAodHlwZSA9PiB0eXBlID09PSAnZm9ybS1mbG93JykpO1xuICBwcml2YXRlIGZvcm1GbG93U3RlcFR5cGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxGb3JtRmxvd1N0ZXBUeXBlIHwgbnVsbD4obnVsbCk7XG4gIGZvcm1GbG93U3RlcFR5cGVJc0Zvcm0kID0gdGhpcy5mb3JtRmxvd1N0ZXBUeXBlJC5waXBlKG1hcCh0eXBlID0+IHR5cGUgPT09ICdmb3JtJykpO1xuICBwcml2YXRlIGZvcm1Jb0Zvcm1EYXRhJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRvYXN0cjogVG9hc3RyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvcm1MaW5rU2VydmljZTogRm9ybUxpbmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybUZsb3dTZXJ2aWNlOiBGb3JtRmxvd1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTkdYTG9nZ2VyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFza1NlcnZpY2U6IFRhc2tTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdXNlclByb3ZpZGVyU2VydmljZTogVXNlclByb3ZpZGVyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZGFsU2VydmljZTogVmFsdGltb01vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50U2VydmljZTogRG9jdW1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZVxuICApIHtcbiAgICB0aGlzLmZvcm1pb09wdGlvbnMgPSBuZXcgRm9ybWlvT3B0aW9uc0ltcGwoKTtcbiAgICB0aGlzLmZvcm1pb09wdGlvbnMuZGlzYWJsZUFsZXJ0cyA9IHRydWU7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLm1vZGFsLm1vZGFsU2hvd2luZyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICB0YXAobW9kYWxTaG93aW5nID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1Jb0Zvcm1EYXRhID0gdGhpcy5mb3JtSW9Gb3JtRGF0YSQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGlmICghbW9kYWxTaG93aW5nICYmIGZvcm1Jb0Zvcm1EYXRhKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLmdldFZhbHVlKCkgPT09ICdmb3JtLWZsb3cnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtRmxvd1NlcnZpY2Uuc2F2ZSh0aGlzLmZvcm1GbG93SW5zdGFuY2VJZCwgZm9ybUlvRm9ybURhdGEpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICgpID0+IG51bGwsXG4gICAgICAgICAgICAgICAgICBlcnJvcnMgPT4gdGhpcy5mb3JtLnNob3dFcnJvcnMoZXJyb3JzKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBvcGVuVGFza0RldGFpbHModGFzazogVGFzaykge1xuICAgIHRoaXMucmVzZXRUYXNrUHJvY2Vzc0xpbmtUeXBlKCk7XG4gICAgdGhpcy5yZXNldEZvcm1EZWZpbml0aW9uKCk7XG4gICAgdGhpcy5nZXRUYXNrUHJvY2Vzc0xpbmsodGFzay5pZCk7XG4gICAgdGhpcy5zZXREb2N1bWVudERlZmluaXRpb25OYW1lSW5TZXJ2aWNlKHRhc2spO1xuXG4gICAgdGhpcy50YXNrID0gdGFzaztcbiAgICB0aGlzLnBhZ2UgPSB7XG4gICAgICB0aXRsZTogdGFzay5uYW1lLFxuICAgICAgc3VidGl0bGU6IGAke3RoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd0YXNrRGV0YWlsLnRhc2tDcmVhdGVkJyl9ICR7dGFzay5jcmVhdGVkfWAsXG4gICAgfTtcblxuICAgIHRoaXMuZm9ybUxpbmtTZXJ2aWNlXG4gICAgICAuZ2V0UHJlRmlsbGVkRm9ybURlZmluaXRpb25CeUZvcm1MaW5rSWQoXG4gICAgICAgIHRhc2sucHJvY2Vzc0RlZmluaXRpb25LZXksXG4gICAgICAgIHRhc2suYnVzaW5lc3NLZXksXG4gICAgICAgIHRhc2sudGFza0RlZmluaXRpb25LZXksXG4gICAgICAgIHRhc2suaWQgLy8gdGFza0luc3RhbmNlSWRcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIGZvcm1EZWZpbml0aW9uID0+IHtcbiAgICAgICAgICB0aGlzLmZvcm1Bc3NvY2lhdGlvbiA9IGZvcm1EZWZpbml0aW9uLmZvcm1Bc3NvY2lhdGlvbjtcblxuICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRoaXMuZm9ybUFzc29jaWF0aW9uLmZvcm1MaW5rLmNsYXNzTmFtZS5zcGxpdCgnLicpO1xuICAgICAgICAgIGNvbnN0IGxpbmtUeXBlID0gY2xhc3NOYW1lW2NsYXNzTmFtZS5sZW5ndGggLSAxXTtcblxuICAgICAgICAgIHN3aXRjaCAobGlua1R5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ0JwbW5FbGVtZW50Rm9ybUlkTGluayc6XG4gICAgICAgICAgICAgIHRoaXMuc2V0Rm9ybURlZmluaXRpb25BbmRPcGVuTW9kYWwoZm9ybURlZmluaXRpb24pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0JwbW5FbGVtZW50Rm9ybUZsb3dJZExpbmsnOlxuICAgICAgICAgICAgICAvLyBXZSBjYW4ndCB1c2UgdGhlIGZvcm1EZWZpbml0aW9uIGhlcmUgYmVjYXVzZSB0aGUgZm9ybSBkZWZpbml0aW9uIGlzIHByb3ZpZGVkIHBlciBmb3JtIGZsb3cgc3RlcFxuICAgICAgICAgICAgICAvLyBJJ20gc3RpbGwgbGVhdmluZyB0aGlzIGluIGhlcmUgaW4gY2FzZSB3ZSB3YW50IHRvIGFkZCBmb3JtIGZsb3cgc3BlY2lmaWMgY29kZS5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCcG1uRWxlbWVudFVybExpbmsnOlxuICAgICAgICAgICAgICB0aGlzLm9wZW5VcmxMaW5rKGZvcm1EZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdCcG1uRWxlbWVudEFuZ3VsYXJTdGF0ZVVybExpbmsnOlxuICAgICAgICAgICAgICB0aGlzLm9wZW5Bbmd1bGFyU3RhdGVVcmxMaW5rKHRhc2ssIGZvcm1EZWZpbml0aW9uKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5mYXRhbCgnVW5zdXBwb3J0ZWQgY2xhc3MgbmFtZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3JzID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3JzPy5lcnJvcj8uZGV0YWlsKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9ycy5lcnJvci5kZXRhaWw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5tb2RhbC5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ290b0Zvcm1MaW5rU2NyZWVuKCk6IHZvaWQge1xuICAgIHRoaXMubW9kYWwuaGlkZSgpO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnZm9ybS1saW5rcyddKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmRhdGEpIHtcbiAgICAgIHRoaXMuZm9ybUlvRm9ybURhdGEkLm5leHQoZXZlbnQuZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uU3VibWl0KHN1Ym1pc3Npb246IEZvcm1pb1N1Ym1pc3Npb24pOiB2b2lkIHtcbiAgICBpZiAoc3VibWlzc2lvbi5kYXRhKSB7XG4gICAgICB0aGlzLmZvcm1Jb0Zvcm1EYXRhJC5uZXh0KHN1Ym1pc3Npb24uZGF0YSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLmdldFZhbHVlKCkgPT09ICdmb3JtJykge1xuICAgICAgdGhpcy5mb3JtTGlua1NlcnZpY2VcbiAgICAgICAgLm9uU3VibWl0KFxuICAgICAgICAgIHRoaXMudGFzay5wcm9jZXNzRGVmaW5pdGlvbktleSxcbiAgICAgICAgICB0aGlzLmZvcm1Bc3NvY2lhdGlvbi5mb3JtTGluay5pZCxcbiAgICAgICAgICBzdWJtaXNzaW9uLmRhdGEsXG4gICAgICAgICAgdGhpcy50YXNrLmJ1c2luZXNzS2V5LFxuICAgICAgICAgIHRoaXMudGFzay5pZFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICAgKF86IEZvcm1TdWJtaXNzaW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlVGFzaygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3JzID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5zaG93RXJyb3JzKGVycm9ycyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLmdldFZhbHVlKCkgPT09ICdmb3JtLWZsb3cnKSB7XG4gICAgICBpZiAoc3VibWlzc2lvbi5kYXRhLnN1Ym1pdCkge1xuICAgICAgICB0aGlzLmZvcm1GbG93U2VydmljZVxuICAgICAgICAgIC5zdWJtaXRTdGVwKHRoaXMuZm9ybUZsb3dJbnN0YW5jZUlkLCB0aGlzLmZvcm1GbG93U3RlcEluc3RhbmNlSWQsIHN1Ym1pc3Npb24uZGF0YSlcbiAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgKHJlc3VsdDogRm9ybUZsb3dJbnN0YW5jZSkgPT4gdGhpcy5oYW5kbGVGb3JtRmxvd1N0ZXAocmVzdWx0KSxcbiAgICAgICAgICAgIGVycm9ycyA9PiB0aGlzLmZvcm0uc2hvd0Vycm9ycyhlcnJvcnMpXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoc3VibWlzc2lvbi5kYXRhWydiYWNrJ10pIHtcbiAgICAgICAgdGhpcy5mb3JtRmxvd1NlcnZpY2UuYmFjayh0aGlzLmZvcm1GbG93SW5zdGFuY2VJZCwgc3VibWlzc2lvbi5kYXRhKS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlc3VsdDogRm9ybUZsb3dJbnN0YW5jZSkgPT4gdGhpcy5oYW5kbGVGb3JtRmxvd1N0ZXAocmVzdWx0KSxcbiAgICAgICAgICBlcnJvcnMgPT4gdGhpcy5mb3JtLnNob3dFcnJvcnMoZXJyb3JzKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRGb3JtRGVmaW5pdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1EZWZpbml0aW9uID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFza1Byb2Nlc3NMaW5rKHRhc2tJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50YXNrU2VydmljZS5nZXRUYXNrUHJvY2Vzc0xpbmsodGFza0lkKS5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgIHN3aXRjaCAocmVzPy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgICAgIHRoaXMudGFza1Byb2Nlc3NMaW5rVHlwZSQubmV4dCgnZm9ybScpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmb3JtLWZsb3cnOlxuICAgICAgICAgIHRoaXMudGFza1Byb2Nlc3NMaW5rVHlwZSQubmV4dCgnZm9ybS1mbG93Jyk7XG4gICAgICAgICAgdGhpcy5nZXRGb3JtRmxvd1N0ZXAocmVzPy5wcm9wZXJ0aWVzLmZvcm1GbG93SW5zdGFuY2VJZCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldEZvcm1GbG93U3RlcChmb3JtRmxvd0luc3RhbmNlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZm9ybUZsb3dTZXJ2aWNlXG4gICAgICAuZ2V0Rm9ybUZsb3dTdGVwKGZvcm1GbG93SW5zdGFuY2VJZClcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogRm9ybUZsb3dJbnN0YW5jZSkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUZvcm1GbG93U3RlcChyZXN1bHQpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUZvcm1GbG93U3RlcChmb3JtRmxvd0luc3RhbmNlOiBGb3JtRmxvd0luc3RhbmNlKSB7XG4gICAgaWYgKGZvcm1GbG93SW5zdGFuY2Uuc3RlcCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5mb3JtRmxvd1N0ZXBUeXBlJC5uZXh0KG51bGwpO1xuICAgICAgdGhpcy5mb3JtRmxvd0luc3RhbmNlSWQgPSBudWxsO1xuICAgICAgdGhpcy5mb3JtRmxvd1N0ZXBJbnN0YW5jZUlkID0gbnVsbDtcbiAgICAgIHRoaXMuY29tcGxldGVUYXNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLnNjcm9sbFRvVG9wKCk7XG4gICAgICB0aGlzLmZvcm1GbG93U3RlcFR5cGUkLm5leHQoZm9ybUZsb3dJbnN0YW5jZS5zdGVwLnR5cGUpO1xuICAgICAgdGhpcy5mb3JtRmxvd0luc3RhbmNlSWQgPSBmb3JtRmxvd0luc3RhbmNlLmlkO1xuICAgICAgdGhpcy5mb3JtRmxvd1N0ZXBJbnN0YW5jZUlkID0gZm9ybUZsb3dJbnN0YW5jZS5zdGVwLmlkO1xuICAgICAgdGhpcy5zZXRGb3JtRGVmaW5pdGlvbkFuZE9wZW5Nb2RhbChmb3JtRmxvd0luc3RhbmNlLnN0ZXAudHlwZVByb3BlcnRpZXMuZGVmaW5pdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21wbGV0ZVRhc2soKSB7XG4gICAgdGhpcy50b2FzdHIuc3VjY2VzcyhcbiAgICAgIGAke3RoaXMudGFzay5uYW1lfSAke3RoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd0YXNrRGV0YWlsLnRhc2tDb21wbGV0ZWQnKX1gXG4gICAgKTtcbiAgICB0aGlzLm1vZGFsLmhpZGUoKTtcbiAgICB0aGlzLnRhc2sgPSBudWxsO1xuICAgIHRoaXMuZm9ybVN1Ym1pdC5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIHJlc2V0VGFza1Byb2Nlc3NMaW5rVHlwZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLm5leHQobnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHNldEZvcm1EZWZpbml0aW9uQW5kT3Blbk1vZGFsKGZvcm1EZWZpbml0aW9uOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1EZWZpbml0aW9uID0gZm9ybURlZmluaXRpb247XG4gICAgdGhpcy5tb2RhbC5zaG93KCk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5VcmxMaW5rKGZvcm1EZWZpbml0aW9uOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJvdXRlci5zZXJpYWxpemVVcmwoXG4gICAgICB0aGlzLnJvdXRlci5jcmVhdGVVcmxUcmVlKFtmb3JtRGVmaW5pdGlvbi5mb3JtQXNzb2NpYXRpb24uZm9ybUxpbmsudXJsXSlcbiAgICApO1xuXG4gICAgd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5Bbmd1bGFyU3RhdGVVcmxMaW5rKHRhc2s6IFRhc2ssIGZvcm1EZWZpbml0aW9uOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5waXBlKHRha2UoMSkpLnN1YnNjcmliZShwYXJhbXMgPT4ge1xuICAgICAgY29uc3QgdGFza0lkID0gdGFzaz8uaWQ7XG4gICAgICBjb25zdCBkb2N1bWVudElkID0gcGFyYW1zPy5kb2N1bWVudElkO1xuXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbZm9ybURlZmluaXRpb24uZm9ybUFzc29jaWF0aW9uLmZvcm1MaW5rLnVybF0sIHtcbiAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICAuLi4odGFza0lkICYmIHt0YXNrSWR9KSxcbiAgICAgICAgICAuLi4oZG9jdW1lbnRJZCAmJiB7ZG9jdW1lbnRJZH0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldERvY3VtZW50RGVmaW5pdGlvbk5hbWVJblNlcnZpY2UodGFzazogVGFzayk6IHZvaWQge1xuICAgIHRoaXMuZG9jdW1lbnRTZXJ2aWNlXG4gICAgICAuZ2V0UHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbkZyb21Qcm9jZXNzSW5zdGFuY2VJZCh0YXNrLnByb2Nlc3NJbnN0YW5jZUlkKVxuICAgICAgLnN1YnNjcmliZShwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uID0+IHtcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uuc2V0RG9jdW1lbnREZWZpbml0aW9uTmFtZShcbiAgICAgICAgICBwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uLmlkLmRvY3VtZW50RGVmaW5pdGlvbklkLm5hbWVcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG59XG4iLCI8IS0tXG4gIH4gQ29weXJpZ2h0IDIwMTUtMjAyMCBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gIH5cbiAgfiBMaWNlbnNlZCB1bmRlciBFVVBMLCBWZXJzaW9uIDEuMiAodGhlIFwiTGljZW5zZVwiKTtcbiAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIH5cbiAgfiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gIH5cbiAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAgLS0+XG5cbjx2YWx0aW1vLW1vZGFsXG4gICN0YXNrRGV0YWlsTW9kYWxcbiAgZWxlbWVudElkPVwidGFza0RldGFpbE1vZGFsXCJcbiAgW3RpdGxlXT1cInBhZ2U/LnRpdGxlXCJcbiAgW3N1YnRpdGxlXT1cInBhZ2U/LnN1YnRpdGxlXCJcbiAgW3RlbXBsYXRlQmVsb3dTdWJ0aXRsZV09XCJhc3NpZ25Vc2VyVG9UYXNrXCJcbj5cbiAgPGRpdlxuICAgIGJvZHlcbiAgICAqbmdJZj1cImZvcm1EZWZpbml0aW9uICYmICgocHJvY2Vzc0xpbmtJc0Zvcm0kIHwgYXN5bmMpIHx8IChmb3JtRmxvd1N0ZXBUeXBlSXNGb3JtJCB8IGFzeW5jKSlcIlxuICA+XG4gICAgPHZhbHRpbW8tZm9ybS1pb1xuICAgICAgI2Zvcm1cbiAgICAgIFtmb3JtXT1cImZvcm1EZWZpbml0aW9uXCJcbiAgICAgIChzdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiXG4gICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgW29wdGlvbnNdPVwiZm9ybWlvT3B0aW9uc1wiXG4gICAgPjwvdmFsdGltby1mb3JtLWlvPlxuICA8L2Rpdj5cbiAgPGRpdiBib2R5ICpuZ0lmPVwiIWZvcm1EZWZpbml0aW9uICYmICFlcnJvck1lc3NhZ2VcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYmctd2FybmluZyB0ZXh0LWJsYWNrIG1iLTAgcC0zIHRleHQtY2VudGVyXCI+XG4gICAgICB7e1xuICAgICAgICAoaXNBZG1pbiQgfCBhc3luYylcbiAgICAgICAgICA/ICgnZm9ybU1hbmFnZW1lbnQubm9Gb3JtRGVmaW5pdGlvbkZvdW5kQWRtaW4nIHwgdHJhbnNsYXRlKVxuICAgICAgICAgIDogKCdmb3JtTWFuYWdlbWVudC5ub0Zvcm1EZWZpbml0aW9uRm91bmRVc2VyJyB8IHRyYW5zbGF0ZSlcbiAgICAgIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGJvZHkgKm5nSWY9XCJlcnJvck1lc3NhZ2VcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYmctZGFuZ2VyIHRleHQtYmxhY2sgbWItMCBwLTMgdGV4dC1jZW50ZXJcIj5cbiAgICAgIHt7IGVycm9yTWVzc2FnZSB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBmb290ZXI+XG4gICAgPGRpdiBjbGFzcz1cIm1iLTAgcC0zIHRleHQtY2VudGVyXCIgKm5nSWY9XCIhZm9ybURlZmluaXRpb25cIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc3BhY2VcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cImdvdG9Gb3JtTGlua1NjcmVlbigpXCJcbiAgICAgICAgaWQ9XCJmb3JtLWxpbmstYnV0dG9uXCJcbiAgICAgID5cbiAgICAgICAge3sgJ2Zvcm1NYW5hZ2VtZW50LmdvdG9Gb3JtTGlua3NCdXR0b24nIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L3ZhbHRpbW8tbW9kYWw+XG5cbjxuZy10ZW1wbGF0ZSAjYXNzaWduVXNlclRvVGFzaz5cbiAgPHZhbHRpbW8tYXNzaWduLXVzZXItdG8tdGFza1xuICAgICpuZ0lmPVwidGFzayAmJiBhc3NpZ25tZW50T2ZUYXNrQ2hhbmdlZFwiXG4gICAgW3Rhc2tJZF09XCJ0YXNrLmlkXCJcbiAgICBbYXNzaWduZWVFbWFpbF09XCJ0YXNrLmFzc2lnbmVlXCJcbiAgICAoYXNzaWdubWVudE9mVGFza0NoYW5nZWQpPVwiYXNzaWdubWVudE9mVGFza0NoYW5nZWQuZW1pdCgpXCJcbiAgPjwvdmFsdGltby1hc3NpZ24tdXNlci10by10YXNrPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -18,7 +18,7 @@ import * as i1$1 from 'ngx-toastr';
18
18
  import { ToastrModule } from 'ngx-toastr';
19
19
  import moment from 'moment';
20
20
  import { take, tap, map } from 'rxjs/operators';
21
- import { BehaviorSubject, Subscription, combineLatest } from 'rxjs';
21
+ import { BehaviorSubject, Subscription, combineLatest, distinctUntilChanged, tap as tap$1 } from 'rxjs';
22
22
  import * as i2$2 from '@valtimo/form-link';
23
23
  import * as i3 from '@angular/router';
24
24
  import { RouterModule } from '@angular/router';
@@ -294,9 +294,26 @@ class TaskDetailModalComponent {
294
294
  this.processLinkIsFormFlow$ = this.taskProcessLinkType$.pipe(map(type => type === 'form-flow'));
295
295
  this.formFlowStepType$ = new BehaviorSubject(null);
296
296
  this.formFlowStepTypeIsForm$ = this.formFlowStepType$.pipe(map(type => type === 'form'));
297
+ this.formIoFormData$ = new BehaviorSubject(null);
298
+ this._subscriptions = new Subscription();
297
299
  this.formioOptions = new FormioOptionsImpl();
298
300
  this.formioOptions.disableAlerts = true;
299
301
  }
302
+ ngAfterViewInit() {
303
+ this._subscriptions.add(this.modal.modalShowing$
304
+ .pipe(distinctUntilChanged(), tap$1(modalShowing => {
305
+ const formIoFormData = this.formIoFormData$.getValue();
306
+ if (!modalShowing && formIoFormData) {
307
+ if (this.taskProcessLinkType$.getValue() === 'form-flow') {
308
+ this.formFlowService.save(this.formFlowInstanceId, formIoFormData).subscribe(() => null, errors => this.form.showErrors(errors));
309
+ }
310
+ }
311
+ }))
312
+ .subscribe());
313
+ }
314
+ ngOnDestroy() {
315
+ this._subscriptions.unsubscribe();
316
+ }
300
317
  openTaskDetails(task) {
301
318
  this.resetTaskProcessLinkType();
302
319
  this.resetFormDefinition();
@@ -343,7 +360,15 @@ class TaskDetailModalComponent {
343
360
  this.modal.hide();
344
361
  this.router.navigate(['form-links']);
345
362
  }
363
+ onChange(event) {
364
+ if (event.data) {
365
+ this.formIoFormData$.next(event.data);
366
+ }
367
+ }
346
368
  onSubmit(submission) {
369
+ if (submission.data) {
370
+ this.formIoFormData$.next(submission.data);
371
+ }
347
372
  if (this.taskProcessLinkType$.getValue() === 'form') {
348
373
  this.formLinkService
349
374
  .onSubmit(this.task.processDefinitionKey, this.formAssociation.formLink.id, submission.data, this.task.businessKey, this.task.id)
@@ -360,7 +385,7 @@ class TaskDetailModalComponent {
360
385
  .subscribe((result) => this.handleFormFlowStep(result), errors => this.form.showErrors(errors));
361
386
  }
362
387
  else if (submission.data['back']) {
363
- this.formFlowService.back(this.formFlowInstanceId).subscribe((result) => this.handleFormFlowStep(result), errors => this.form.showErrors(errors));
388
+ this.formFlowService.back(this.formFlowInstanceId, submission.data).subscribe((result) => this.handleFormFlowStep(result), errors => this.form.showErrors(errors));
364
389
  }
365
390
  }
366
391
  }
@@ -437,10 +462,10 @@ class TaskDetailModalComponent {
437
462
  }
438
463
  }
439
464
  TaskDetailModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TaskDetailModalComponent, deps: [{ token: i1$1.ToastrService }, { token: i2$2.FormLinkService }, { token: i2$2.FormFlowService }, { token: i3.Router }, { token: i4$1.NGXLogger }, { token: i3.ActivatedRoute }, { token: TaskService }, { token: i6.UserProviderService }, { token: i7.ValtimoModalService }, { token: i8.DocumentService }, { token: i4.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
440
- TaskDetailModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: TaskDetailModalComponent, selector: "valtimo-task-detail-modal", outputs: { formSubmit: "formSubmit", assignmentOfTaskChanged: "assignmentOfTaskChanged" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["form"], descendants: true }, { propertyName: "modal", first: true, predicate: ["taskDetailModal"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2020 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<valtimo-modal\n #taskDetailModal\n elementId=\"taskDetailModal\"\n [title]=\"page?.title\"\n [subtitle]=\"page?.subtitle\"\n [templateBelowSubtitle]=\"assignUserToTask\"\n>\n <div\n body\n *ngIf=\"formDefinition && ((processLinkIsForm$ | async) || (formFlowStepTypeIsForm$ | async))\"\n >\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n <div body *ngIf=\"!formDefinition && !errorMessage\">\n <div class=\"bg-warning text-black mb-0 p-3 text-center\">\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n </div>\n <div body *ngIf=\"errorMessage\">\n <div class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ errorMessage }}\n </div>\n </div>\n <div footer>\n <div class=\"mb-0 p-3 text-center\" *ngIf=\"!formDefinition\">\n <button\n class=\"btn btn-secondary btn-space\"\n type=\"button\"\n (click)=\"gotoFormLinkScreen()\"\n id=\"form-link-button\"\n >\n {{ 'formManagement.gotoFormLinksButton' | translate }}\n </button>\n </div>\n </div>\n</valtimo-modal>\n\n<ng-template #assignUserToTask>\n <valtimo-assign-user-to-task\n *ngIf=\"task && assignmentOfTaskChanged\"\n [taskId]=\"task.id\"\n [assigneeEmail]=\"task.assignee\"\n (assignmentOfTaskChanged)=\"assignmentOfTaskChanged.emit()\"\n ></valtimo-assign-user-to-task>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2020 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 */#taskDetailModal .formio-component-submit{text-align:right}\n"], dependencies: [{ kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.FormioComponent, selector: "valtimo-form-io", inputs: ["form", "options", "submission", "readOnly", "formRefresh$"], outputs: ["submit", "change"] }, { kind: "component", type: i7.ModalComponent, selector: "valtimo-modal", inputs: ["elementId", "title", "subtitle", "templateBelowSubtitle", "showFooter"] }, { kind: "component", type: AssignUserToTaskComponent, selector: "valtimo-assign-user-to-task", inputs: ["taskId", "assigneeEmail"], outputs: ["assignmentOfTaskChanged"] }, { kind: "pipe", type: i2$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None });
465
+ TaskDetailModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: TaskDetailModalComponent, selector: "valtimo-task-detail-modal", outputs: { formSubmit: "formSubmit", assignmentOfTaskChanged: "assignmentOfTaskChanged" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["form"], descendants: true }, { propertyName: "modal", first: true, predicate: ["taskDetailModal"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2020 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<valtimo-modal\n #taskDetailModal\n elementId=\"taskDetailModal\"\n [title]=\"page?.title\"\n [subtitle]=\"page?.subtitle\"\n [templateBelowSubtitle]=\"assignUserToTask\"\n>\n <div\n body\n *ngIf=\"formDefinition && ((processLinkIsForm$ | async) || (formFlowStepTypeIsForm$ | async))\"\n >\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n <div body *ngIf=\"!formDefinition && !errorMessage\">\n <div class=\"bg-warning text-black mb-0 p-3 text-center\">\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n </div>\n <div body *ngIf=\"errorMessage\">\n <div class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ errorMessage }}\n </div>\n </div>\n <div footer>\n <div class=\"mb-0 p-3 text-center\" *ngIf=\"!formDefinition\">\n <button\n class=\"btn btn-secondary btn-space\"\n type=\"button\"\n (click)=\"gotoFormLinkScreen()\"\n id=\"form-link-button\"\n >\n {{ 'formManagement.gotoFormLinksButton' | translate }}\n </button>\n </div>\n </div>\n</valtimo-modal>\n\n<ng-template #assignUserToTask>\n <valtimo-assign-user-to-task\n *ngIf=\"task && assignmentOfTaskChanged\"\n [taskId]=\"task.id\"\n [assigneeEmail]=\"task.assignee\"\n (assignmentOfTaskChanged)=\"assignmentOfTaskChanged.emit()\"\n ></valtimo-assign-user-to-task>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2020 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 */#taskDetailModal{pointer-events:none}#taskDetailModal .formio-component-submit{text-align:right}\n"], dependencies: [{ kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.FormioComponent, selector: "valtimo-form-io", inputs: ["form", "options", "submission", "readOnly", "formRefresh$"], outputs: ["submit", "change"] }, { kind: "component", type: i7.ModalComponent, selector: "valtimo-modal", inputs: ["elementId", "title", "subtitle", "templateBelowSubtitle", "showFooter"] }, { kind: "component", type: AssignUserToTaskComponent, selector: "valtimo-assign-user-to-task", inputs: ["taskId", "assigneeEmail"], outputs: ["assignmentOfTaskChanged"] }, { kind: "pipe", type: i2$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None });
441
466
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TaskDetailModalComponent, decorators: [{
442
467
  type: Component,
443
- args: [{ selector: 'valtimo-task-detail-modal', encapsulation: ViewEncapsulation.None, template: "<!--\n ~ Copyright 2015-2020 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<valtimo-modal\n #taskDetailModal\n elementId=\"taskDetailModal\"\n [title]=\"page?.title\"\n [subtitle]=\"page?.subtitle\"\n [templateBelowSubtitle]=\"assignUserToTask\"\n>\n <div\n body\n *ngIf=\"formDefinition && ((processLinkIsForm$ | async) || (formFlowStepTypeIsForm$ | async))\"\n >\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n <div body *ngIf=\"!formDefinition && !errorMessage\">\n <div class=\"bg-warning text-black mb-0 p-3 text-center\">\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n </div>\n <div body *ngIf=\"errorMessage\">\n <div class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ errorMessage }}\n </div>\n </div>\n <div footer>\n <div class=\"mb-0 p-3 text-center\" *ngIf=\"!formDefinition\">\n <button\n class=\"btn btn-secondary btn-space\"\n type=\"button\"\n (click)=\"gotoFormLinkScreen()\"\n id=\"form-link-button\"\n >\n {{ 'formManagement.gotoFormLinksButton' | translate }}\n </button>\n </div>\n </div>\n</valtimo-modal>\n\n<ng-template #assignUserToTask>\n <valtimo-assign-user-to-task\n *ngIf=\"task && assignmentOfTaskChanged\"\n [taskId]=\"task.id\"\n [assigneeEmail]=\"task.assignee\"\n (assignmentOfTaskChanged)=\"assignmentOfTaskChanged.emit()\"\n ></valtimo-assign-user-to-task>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2020 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 */#taskDetailModal .formio-component-submit{text-align:right}\n"] }]
468
+ args: [{ selector: 'valtimo-task-detail-modal', encapsulation: ViewEncapsulation.None, template: "<!--\n ~ Copyright 2015-2020 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<valtimo-modal\n #taskDetailModal\n elementId=\"taskDetailModal\"\n [title]=\"page?.title\"\n [subtitle]=\"page?.subtitle\"\n [templateBelowSubtitle]=\"assignUserToTask\"\n>\n <div\n body\n *ngIf=\"formDefinition && ((processLinkIsForm$ | async) || (formFlowStepTypeIsForm$ | async))\"\n >\n <valtimo-form-io\n #form\n [form]=\"formDefinition\"\n (submit)=\"onSubmit($event)\"\n (change)=\"onChange($event)\"\n [options]=\"formioOptions\"\n ></valtimo-form-io>\n </div>\n <div body *ngIf=\"!formDefinition && !errorMessage\">\n <div class=\"bg-warning text-black mb-0 p-3 text-center\">\n {{\n (isAdmin$ | async)\n ? ('formManagement.noFormDefinitionFoundAdmin' | translate)\n : ('formManagement.noFormDefinitionFoundUser' | translate)\n }}\n </div>\n </div>\n <div body *ngIf=\"errorMessage\">\n <div class=\"bg-danger text-black mb-0 p-3 text-center\">\n {{ errorMessage }}\n </div>\n </div>\n <div footer>\n <div class=\"mb-0 p-3 text-center\" *ngIf=\"!formDefinition\">\n <button\n class=\"btn btn-secondary btn-space\"\n type=\"button\"\n (click)=\"gotoFormLinkScreen()\"\n id=\"form-link-button\"\n >\n {{ 'formManagement.gotoFormLinksButton' | translate }}\n </button>\n </div>\n </div>\n</valtimo-modal>\n\n<ng-template #assignUserToTask>\n <valtimo-assign-user-to-task\n *ngIf=\"task && assignmentOfTaskChanged\"\n [taskId]=\"task.id\"\n [assigneeEmail]=\"task.assignee\"\n (assignmentOfTaskChanged)=\"assignmentOfTaskChanged.emit()\"\n ></valtimo-assign-user-to-task>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2020 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 */#taskDetailModal{pointer-events:none}#taskDetailModal .formio-component-submit{text-align:right}\n"] }]
444
469
  }], ctorParameters: function () { return [{ type: i1$1.ToastrService }, { type: i2$2.FormLinkService }, { type: i2$2.FormFlowService }, { type: i3.Router }, { type: i4$1.NGXLogger }, { type: i3.ActivatedRoute }, { type: TaskService }, { type: i6.UserProviderService }, { type: i7.ValtimoModalService }, { type: i8.DocumentService }, { type: i4.TranslateService }]; }, propDecorators: { form: [{
445
470
  type: ViewChild,
446
471
  args: ['form']