@valtimo/task 10.8.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/esm2022/lib/assign-user-to-task/assign-user-to-task.component.mjs +122 -0
  2. package/esm2022/lib/models/task-list.model.mjs +28 -0
  3. package/{esm2020 → esm2022}/lib/models/task.model.mjs +1 -1
  4. package/esm2022/lib/task-detail-modal/task-detail-modal.component.mjs +210 -0
  5. package/esm2022/lib/task-list/task-list.component.mjs +252 -0
  6. package/esm2022/lib/task-permissions.mjs +34 -0
  7. package/{esm2020 → esm2022}/lib/task-routing.module.mjs +5 -5
  8. package/esm2022/lib/task.module.mjs +119 -0
  9. package/esm2022/lib/task.service.mjs +72 -0
  10. package/esm2022/public_api.mjs +26 -0
  11. package/fesm2022/valtimo-task.mjs +912 -0
  12. package/fesm2022/valtimo-task.mjs.map +1 -0
  13. package/lib/assign-user-to-task/assign-user-to-task.component.d.ts +4 -4
  14. package/lib/assign-user-to-task/assign-user-to-task.component.d.ts.map +1 -1
  15. package/lib/models/task-list.model.d.ts +0 -1
  16. package/lib/models/task-list.model.d.ts.map +1 -1
  17. package/lib/models/task.model.d.ts +7 -7
  18. package/lib/models/task.model.d.ts.map +1 -1
  19. package/lib/task-detail-modal/task-detail-modal.component.d.ts +29 -34
  20. package/lib/task-detail-modal/task-detail-modal.component.d.ts.map +1 -1
  21. package/lib/task-list/task-list.component.d.ts +22 -16
  22. package/lib/task-list/task-list.component.d.ts.map +1 -1
  23. package/lib/task-permissions.d.ts +8 -0
  24. package/lib/task-permissions.d.ts.map +1 -0
  25. package/lib/task.module.d.ts +1 -1
  26. package/lib/task.module.d.ts.map +1 -1
  27. package/lib/task.service.d.ts +2 -2
  28. package/lib/task.service.d.ts.map +1 -1
  29. package/package.json +10 -16
  30. package/public_api.d.ts +1 -0
  31. package/public_api.d.ts.map +1 -1
  32. package/esm2020/lib/assign-user-to-task/assign-user-to-task.component.mjs +0 -123
  33. package/esm2020/lib/models/task-list.model.mjs +0 -29
  34. package/esm2020/lib/task-detail-modal/task-detail-modal.component.mjs +0 -269
  35. package/esm2020/lib/task-list/task-list.component.mjs +0 -222
  36. package/esm2020/lib/task.module.mjs +0 -113
  37. package/esm2020/lib/task.service.mjs +0 -69
  38. package/esm2020/public_api.mjs +0 -25
  39. package/fesm2015/valtimo-task.mjs +0 -861
  40. package/fesm2015/valtimo-task.mjs.map +0 -1
  41. package/fesm2020/valtimo-task.mjs +0 -898
  42. package/fesm2020/valtimo-task.mjs.map +0 -1
  43. /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
  44. /package/{esm2020 → esm2022}/lib/models/task-definition.model.mjs +0 -0
  45. /package/{esm2020 → esm2022}/valtimo-task.mjs +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"public_api.d.ts","sourceRoot":"","sources":["../../../projects/valtimo/task/src/public_api.ts"],"names":[],"mappings":"AAoBA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qDAAqD,CAAC;AACpE,cAAc,qCAAqC,CAAC;AACpD,cAAc,yDAAyD,CAAC"}
1
+ {"version":3,"file":"public_api.d.ts","sourceRoot":"","sources":["../../../projects/valtimo/task/src/public_api.ts"],"names":[],"mappings":"AAoBA,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qDAAqD,CAAC;AACpE,cAAc,qCAAqC,CAAC;AACpD,cAAc,yDAAyD,CAAC;AACxE,cAAc,wBAAwB,CAAC"}
@@ -1,123 +0,0 @@
1
- /*
2
- * Copyright 2015-2023 Ritense BV, the Netherlands.
3
- *
4
- * Licensed under EUPL, Version 1.2 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { Component, EventEmitter, Input, Output, } from '@angular/core';
17
- import { BehaviorSubject, combineLatest, Subscription } from 'rxjs';
18
- import { take, tap } from 'rxjs/operators';
19
- import * as i0 from "@angular/core";
20
- import * as i1 from "../task.service";
21
- import * as i2 from "@angular/common";
22
- import * as i3 from "@valtimo/components";
23
- import * as i4 from "@ngx-translate/core";
24
- export class AssignUserToTaskComponent {
25
- constructor(taskService) {
26
- this.taskService = taskService;
27
- this.assignmentOfTaskChanged = new EventEmitter();
28
- this.candidateUsersForTask$ = new BehaviorSubject(undefined);
29
- this.disabled$ = new BehaviorSubject(true);
30
- this.assignedEmailOnServer$ = new BehaviorSubject(null);
31
- this.userEmailToAssign = null;
32
- this.assignedUserFullName$ = new BehaviorSubject(null);
33
- this._subscriptions = new Subscription();
34
- }
35
- ngOnInit() {
36
- this._subscriptions.add(this.taskService.getCandidateUsers(this.taskId).subscribe(candidateUsers => {
37
- this.candidateUsersForTask$.next(candidateUsers);
38
- if (this.assigneeEmail) {
39
- this.assignedEmailOnServer$.next(this.assigneeEmail);
40
- this.userEmailToAssign = this.assigneeEmail;
41
- this.assignedUserFullName$.next(this.getAssignedUserName(candidateUsers, this.assigneeEmail));
42
- }
43
- this.enable();
44
- }));
45
- }
46
- ngOnChanges(changes) {
47
- this.candidateUsersForTask$.pipe(take(1)).subscribe(candidateUsers => {
48
- const currentUserEmail = changes.assigneeEmail?.currentValue || this.assigneeEmail;
49
- this.assignedEmailOnServer$.next(currentUserEmail || null);
50
- this.userEmailToAssign = currentUserEmail || null;
51
- this.assignedUserFullName$.next(this.getAssignedUserName(candidateUsers, currentUserEmail));
52
- });
53
- }
54
- ngOnDestroy() {
55
- this._subscriptions.unsubscribe();
56
- }
57
- assignTask(userEmail) {
58
- this.disable();
59
- combineLatest([
60
- this.candidateUsersForTask$,
61
- this.taskService.assignTask(this.taskId, { assignee: userEmail }),
62
- ])
63
- .pipe(take(1), tap(([candidateUsers]) => {
64
- this.userEmailToAssign = userEmail;
65
- this.assignedEmailOnServer$.next(userEmail);
66
- this.assignedUserFullName$.next(this.getAssignedUserName(candidateUsers, userEmail));
67
- this.emitChange();
68
- this.enable();
69
- }))
70
- .subscribe();
71
- }
72
- unassignTask() {
73
- this.disable();
74
- this.taskService
75
- .unassignTask(this.taskId)
76
- .pipe(tap(() => {
77
- this.clear();
78
- this.emitChange();
79
- this.enable();
80
- }))
81
- .subscribe();
82
- }
83
- getAssignedUserName(users, userEmail) {
84
- if (users && userEmail) {
85
- const findUser = users.find(user => user.email === userEmail);
86
- return findUser ? findUser.label : userEmail;
87
- }
88
- return userEmail || '-';
89
- }
90
- mapUsersForDropdown(users) {
91
- return (users &&
92
- users
93
- .map(user => ({ ...user, lastName: user.lastName?.split(' ').splice(-1)[0] || '' }))
94
- .sort((a, b) => a.lastName.localeCompare(b.lastName))
95
- .map(user => ({ text: user.label, id: user.email })));
96
- }
97
- clear() {
98
- this.assignedEmailOnServer$.next(null);
99
- this.userEmailToAssign = null;
100
- }
101
- emitChange() {
102
- this.assignmentOfTaskChanged.emit();
103
- }
104
- enable() {
105
- this.disabled$.next(false);
106
- }
107
- disable() {
108
- this.disabled$.next(true);
109
- }
110
- }
111
- AssignUserToTaskComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AssignUserToTaskComponent, deps: [{ token: i1.TaskService }], target: i0.ɵɵFactoryTarget.Component });
112
- AssignUserToTaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: AssignUserToTaskComponent, selector: "valtimo-assign-user-to-task", inputs: { taskId: "taskId", assigneeEmail: "assigneeEmail" }, outputs: { assignmentOfTaskChanged: "assignmentOfTaskChanged" }, usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2023 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<ng-container\n *ngIf=\"{\n candidateUsers: candidateUsersForTask$ | async,\n disabled: disabled$ | async,\n emailOnServer: assignedEmailOnServer$ | async\n } as obs\"\n>\n <div class=\"container-fluid\">\n <div class=\"row mt-2 mb-2\">\n <div class=\"col-12 pl-0 d-flex flex-row align-items-center\">\n <ng-container *ngIf=\"obs.candidateUsers; else loading\">\n <valtimo-searchable-dropdown-select\n [style]=\"'underlinedText'\"\n [items]=\"mapUsersForDropdown(obs.candidateUsers)\"\n [buttonText]=\"'assignTask.header' | translate\"\n [searchText]=\"'interface.typeToSearch' | translate\"\n [noResultsText]=\"'interface.noSearchResults' | translate\"\n [disabled]=\"obs.disabled\"\n [selectedText]=\"'assignTask.assignedTo' | translate\"\n [selectedTextValue]=\"assignedUserFullName$ | async\"\n [clearSelectionButtonTitle]=\"'assignTask.remove' | translate\"\n [hasSelection]=\"userEmailToAssign === obs.emailOnServer && obs.emailOnServer !== null\"\n [width]=\"250\"\n (itemSelected)=\"assignTask($event)\"\n (clearSelection)=\"unassignTask()\"\n >\n </valtimo-searchable-dropdown-select>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <h5>\n <b>{{ 'assignTask.fetchingUsers' | translate }}</b>\n </h5>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 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 */.container-fluid{color:#959595}i{font-size:13px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.SearchableDropdownSelectComponent, selector: "valtimo-searchable-dropdown-select", inputs: ["style", "items", "buttonText", "searchText", "noResultsText", "disabled", "selectedText", "selectedTextValue", "clearSelectionButtonTitle", "hasSelection", "width", "hasPermission"], outputs: ["itemSelected", "clearSelection"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] });
113
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AssignUserToTaskComponent, decorators: [{
114
- type: Component,
115
- args: [{ selector: 'valtimo-assign-user-to-task', template: "<!--\n ~ Copyright 2015-2023 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<ng-container\n *ngIf=\"{\n candidateUsers: candidateUsersForTask$ | async,\n disabled: disabled$ | async,\n emailOnServer: assignedEmailOnServer$ | async\n } as obs\"\n>\n <div class=\"container-fluid\">\n <div class=\"row mt-2 mb-2\">\n <div class=\"col-12 pl-0 d-flex flex-row align-items-center\">\n <ng-container *ngIf=\"obs.candidateUsers; else loading\">\n <valtimo-searchable-dropdown-select\n [style]=\"'underlinedText'\"\n [items]=\"mapUsersForDropdown(obs.candidateUsers)\"\n [buttonText]=\"'assignTask.header' | translate\"\n [searchText]=\"'interface.typeToSearch' | translate\"\n [noResultsText]=\"'interface.noSearchResults' | translate\"\n [disabled]=\"obs.disabled\"\n [selectedText]=\"'assignTask.assignedTo' | translate\"\n [selectedTextValue]=\"assignedUserFullName$ | async\"\n [clearSelectionButtonTitle]=\"'assignTask.remove' | translate\"\n [hasSelection]=\"userEmailToAssign === obs.emailOnServer && obs.emailOnServer !== null\"\n [width]=\"250\"\n (itemSelected)=\"assignTask($event)\"\n (clearSelection)=\"unassignTask()\"\n >\n </valtimo-searchable-dropdown-select>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-container>\n\n<ng-template #loading>\n <h5>\n <b>{{ 'assignTask.fetchingUsers' | translate }}</b>\n </h5>\n</ng-template>\n", styles: ["/*!\n * Copyright 2015-2023 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 */.container-fluid{color:#959595}i{font-size:13px}\n"] }]
116
- }], ctorParameters: function () { return [{ type: i1.TaskService }]; }, propDecorators: { taskId: [{
117
- type: Input
118
- }], assigneeEmail: [{
119
- type: Input
120
- }], assignmentOfTaskChanged: [{
121
- type: Output
122
- }] } });
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaWduLXVzZXItdG8tdGFzay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0aW1vL3Rhc2svc3JjL2xpYi9hc3NpZ24tdXNlci10by10YXNrL2Fzc2lnbi11c2VyLXRvLXRhc2suY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvYXNzaWduLXVzZXItdG8tdGFzay9hc3NpZ24tdXNlci10by10YXNrLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUgsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFDLElBQUksRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBU3pDLE1BQU0sT0FBTyx5QkFBeUI7SUFZcEMsWUFBb0IsV0FBd0I7UUFBeEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFUbEMsNEJBQXVCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV2RCwyQkFBc0IsR0FBRyxJQUFJLGVBQWUsQ0FBYyxTQUFTLENBQUMsQ0FBQztRQUNyRSxjQUFTLEdBQUcsSUFBSSxlQUFlLENBQVUsSUFBSSxDQUFDLENBQUM7UUFDL0MsMkJBQXNCLEdBQUcsSUFBSSxlQUFlLENBQVMsSUFBSSxDQUFDLENBQUM7UUFDM0Qsc0JBQWlCLEdBQVcsSUFBSSxDQUFDO1FBQ2pDLDBCQUFxQixHQUFHLElBQUksZUFBZSxDQUFTLElBQUksQ0FBQyxDQUFDO1FBQ2xELG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUVHLENBQUM7SUFF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Q2hCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRU8sTUFBTTtRQUNaLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFTyxPQUFPO1FBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQzs7c0hBN0dVLHlCQUF5QjswR0FBekIseUJBQXlCLHVOQ3JDdEMsZ21FQXNEQTsyRkRqQmEseUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLDZCQUE2QjtrR0FLOUIsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0ksdUJBQXVCO3NCQUFoQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDE1LTIwMjMgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtEcm9wZG93bkl0ZW19IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3Rha2UsIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtUYXNrU2VydmljZX0gZnJvbSAnLi4vdGFzay5zZXJ2aWNlJztcbmltcG9ydCB7TmFtZWRVc2VyfSBmcm9tICdAdmFsdGltby9jb25maWcnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWx0aW1vLWFzc2lnbi11c2VyLXRvLXRhc2snLFxuICB0ZW1wbGF0ZVVybDogJy4vYXNzaWduLXVzZXItdG8tdGFzay5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Fzc2lnbi11c2VyLXRvLXRhc2suY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQXNzaWduVXNlclRvVGFza0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSB0YXNrSWQ6IHN0cmluZztcbiAgQElucHV0KCkgYXNzaWduZWVFbWFpbDogc3RyaW5nO1xuICBAT3V0cHV0KCkgYXNzaWdubWVudE9mVGFza0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY2FuZGlkYXRlVXNlcnNGb3JUYXNrJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TmFtZWRVc2VyW10+KHVuZGVmaW5lZCk7XG4gIGRpc2FibGVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG4gIGFzc2lnbmVkRW1haWxPblNlcnZlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4obnVsbCk7XG4gIHVzZXJFbWFpbFRvQXNzaWduOiBzdHJpbmcgPSBudWxsO1xuICBhc3NpZ25lZFVzZXJGdWxsTmFtZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4obnVsbCk7XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0YXNrU2VydmljZTogVGFza1NlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc2tTZXJ2aWNlLmdldENhbmRpZGF0ZVVzZXJzKHRoaXMudGFza0lkKS5zdWJzY3JpYmUoY2FuZGlkYXRlVXNlcnMgPT4ge1xuICAgICAgICB0aGlzLmNhbmRpZGF0ZVVzZXJzRm9yVGFzayQubmV4dChjYW5kaWRhdGVVc2Vycyk7XG4gICAgICAgIGlmICh0aGlzLmFzc2lnbmVlRW1haWwpIHtcbiAgICAgICAgICB0aGlzLmFzc2lnbmVkRW1haWxPblNlcnZlciQubmV4dCh0aGlzLmFzc2lnbmVlRW1haWwpO1xuICAgICAgICAgIHRoaXMudXNlckVtYWlsVG9Bc3NpZ24gPSB0aGlzLmFzc2lnbmVlRW1haWw7XG4gICAgICAgICAgdGhpcy5hc3NpZ25lZFVzZXJGdWxsTmFtZSQubmV4dChcbiAgICAgICAgICAgIHRoaXMuZ2V0QXNzaWduZWRVc2VyTmFtZShjYW5kaWRhdGVVc2VycywgdGhpcy5hc3NpZ25lZUVtYWlsKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbmFibGUoKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICB0aGlzLmNhbmRpZGF0ZVVzZXJzRm9yVGFzayQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoY2FuZGlkYXRlVXNlcnMgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFVzZXJFbWFpbCA9IGNoYW5nZXMuYXNzaWduZWVFbWFpbD8uY3VycmVudFZhbHVlIHx8IHRoaXMuYXNzaWduZWVFbWFpbDtcbiAgICAgIHRoaXMuYXNzaWduZWRFbWFpbE9uU2VydmVyJC5uZXh0KGN1cnJlbnRVc2VyRW1haWwgfHwgbnVsbCk7XG4gICAgICB0aGlzLnVzZXJFbWFpbFRvQXNzaWduID0gY3VycmVudFVzZXJFbWFpbCB8fCBudWxsO1xuICAgICAgdGhpcy5hc3NpZ25lZFVzZXJGdWxsTmFtZSQubmV4dCh0aGlzLmdldEFzc2lnbmVkVXNlck5hbWUoY2FuZGlkYXRlVXNlcnMsIGN1cnJlbnRVc2VyRW1haWwpKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGFzc2lnblRhc2sodXNlckVtYWlsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGUoKTtcbiAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuY2FuZGlkYXRlVXNlcnNGb3JUYXNrJCxcbiAgICAgIHRoaXMudGFza1NlcnZpY2UuYXNzaWduVGFzayh0aGlzLnRhc2tJZCwge2Fzc2lnbmVlOiB1c2VyRW1haWx9KSxcbiAgICBdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHRhcCgoW2NhbmRpZGF0ZVVzZXJzXSkgPT4ge1xuICAgICAgICAgIHRoaXMudXNlckVtYWlsVG9Bc3NpZ24gPSB1c2VyRW1haWw7XG4gICAgICAgICAgdGhpcy5hc3NpZ25lZEVtYWlsT25TZXJ2ZXIkLm5leHQodXNlckVtYWlsKTtcbiAgICAgICAgICB0aGlzLmFzc2lnbmVkVXNlckZ1bGxOYW1lJC5uZXh0KHRoaXMuZ2V0QXNzaWduZWRVc2VyTmFtZShjYW5kaWRhdGVVc2VycywgdXNlckVtYWlsKSk7XG4gICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgICAgICAgdGhpcy5lbmFibGUoKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHVuYXNzaWduVGFzaygpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGUoKTtcbiAgICB0aGlzLnRhc2tTZXJ2aWNlXG4gICAgICAudW5hc3NpZ25UYXNrKHRoaXMudGFza0lkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBnZXRBc3NpZ25lZFVzZXJOYW1lKHVzZXJzOiBOYW1lZFVzZXJbXSwgdXNlckVtYWlsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh1c2VycyAmJiB1c2VyRW1haWwpIHtcbiAgICAgIGNvbnN0IGZpbmRVc2VyID0gdXNlcnMuZmluZCh1c2VyID0+IHVzZXIuZW1haWwgPT09IHVzZXJFbWFpbCk7XG4gICAgICByZXR1cm4gZmluZFVzZXIgPyBmaW5kVXNlci5sYWJlbCA6IHVzZXJFbWFpbDtcbiAgICB9XG4gICAgcmV0dXJuIHVzZXJFbWFpbCB8fCAnLSc7XG4gIH1cblxuICBtYXBVc2Vyc0ZvckRyb3Bkb3duKHVzZXJzOiBOYW1lZFVzZXJbXSk6IERyb3Bkb3duSXRlbVtdIHtcbiAgICByZXR1cm4gKFxuICAgICAgdXNlcnMgJiZcbiAgICAgIHVzZXJzXG4gICAgICAgIC5tYXAodXNlciA9PiAoey4uLnVzZXIsIGxhc3ROYW1lOiB1c2VyLmxhc3ROYW1lPy5zcGxpdCgnICcpLnNwbGljZSgtMSlbMF0gfHwgJyd9KSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubGFzdE5hbWUubG9jYWxlQ29tcGFyZShiLmxhc3ROYW1lKSlcbiAgICAgICAgLm1hcCh1c2VyID0+ICh7dGV4dDogdXNlci5sYWJlbCwgaWQ6IHVzZXIuZW1haWx9KSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2lnbmVkRW1haWxPblNlcnZlciQubmV4dChudWxsKTtcbiAgICB0aGlzLnVzZXJFbWFpbFRvQXNzaWduID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2lnbm1lbnRPZlRhc2tDaGFuZ2VkLmVtaXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQkLm5leHQodHJ1ZSk7XG4gIH1cbn1cbiIsIjwhLS1cbiAgfiBDb3B5cmlnaHQgMjAxNS0yMDIzIFJpdGVuc2UgQlYsIHRoZSBOZXRoZXJsYW5kcy5cbiAgflxuICB+IExpY2Vuc2VkIHVuZGVyIEVVUEwsIFZlcnNpb24gMS4yICh0aGUgXCJMaWNlbnNlXCIpO1xuICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgflxuICB+IGh0dHBzOi8vam9pbnVwLmVjLmV1cm9wYS5ldS9jb2xsZWN0aW9uL2V1cGwvZXVwbC10ZXh0LWV1cGwtMTJcbiAgflxuICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgYmFzaXMsXG4gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICAtLT5cblxuPG5nLWNvbnRhaW5lclxuICAqbmdJZj1cIntcbiAgICBjYW5kaWRhdGVVc2VyczogY2FuZGlkYXRlVXNlcnNGb3JUYXNrJCB8IGFzeW5jLFxuICAgIGRpc2FibGVkOiBkaXNhYmxlZCQgfCBhc3luYyxcbiAgICBlbWFpbE9uU2VydmVyOiBhc3NpZ25lZEVtYWlsT25TZXJ2ZXIkIHwgYXN5bmNcbiAgfSBhcyBvYnNcIlxuPlxuICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+XG4gICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yIG1iLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgcGwtMCBkLWZsZXggZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJvYnMuY2FuZGlkYXRlVXNlcnM7IGVsc2UgbG9hZGluZ1wiPlxuICAgICAgICAgIDx2YWx0aW1vLXNlYXJjaGFibGUtZHJvcGRvd24tc2VsZWN0XG4gICAgICAgICAgICBbc3R5bGVdPVwiJ3VuZGVybGluZWRUZXh0J1wiXG4gICAgICAgICAgICBbaXRlbXNdPVwibWFwVXNlcnNGb3JEcm9wZG93bihvYnMuY2FuZGlkYXRlVXNlcnMpXCJcbiAgICAgICAgICAgIFtidXR0b25UZXh0XT1cIidhc3NpZ25UYXNrLmhlYWRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW3NlYXJjaFRleHRdPVwiJ2ludGVyZmFjZS50eXBlVG9TZWFyY2gnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIFtub1Jlc3VsdHNUZXh0XT1cIidpbnRlcmZhY2Uubm9TZWFyY2hSZXN1bHRzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwib2JzLmRpc2FibGVkXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZFRleHRdPVwiJ2Fzc2lnblRhc2suYXNzaWduZWRUbycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW3NlbGVjdGVkVGV4dFZhbHVlXT1cImFzc2lnbmVkVXNlckZ1bGxOYW1lJCB8IGFzeW5jXCJcbiAgICAgICAgICAgIFtjbGVhclNlbGVjdGlvbkJ1dHRvblRpdGxlXT1cIidhc3NpZ25UYXNrLnJlbW92ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW2hhc1NlbGVjdGlvbl09XCJ1c2VyRW1haWxUb0Fzc2lnbiA9PT0gb2JzLmVtYWlsT25TZXJ2ZXIgJiYgb2JzLmVtYWlsT25TZXJ2ZXIgIT09IG51bGxcIlxuICAgICAgICAgICAgW3dpZHRoXT1cIjI1MFwiXG4gICAgICAgICAgICAoaXRlbVNlbGVjdGVkKT1cImFzc2lnblRhc2soJGV2ZW50KVwiXG4gICAgICAgICAgICAoY2xlYXJTZWxlY3Rpb24pPVwidW5hc3NpZ25UYXNrKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3ZhbHRpbW8tc2VhcmNoYWJsZS1kcm9wZG93bi1zZWxlY3Q+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZz5cbiAgPGg1PlxuICAgIDxiPnt7ICdhc3NpZ25UYXNrLmZldGNoaW5nVXNlcnMnIHwgdHJhbnNsYXRlIH19PC9iPlxuICA8L2g1PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
@@ -1,29 +0,0 @@
1
- /*
2
- * Copyright 2015-2023 Ritense BV, the Netherlands.
3
- *
4
- * Licensed under EUPL, Version 1.2 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- export class TaskList {
17
- constructor() {
18
- this.tasks = [];
19
- this.fields = [];
20
- this.pagination = {
21
- collectionSize: 0,
22
- page: 1,
23
- size: 10,
24
- maxPaginationItemSize: 5,
25
- };
26
- this.page = 0;
27
- }
28
- }
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1saXN0Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvbW9kZWxzL3Rhc2stbGlzdC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE1BQU0sT0FBTyxRQUFRO0lBQXJCO1FBQ1MsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNsQixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osZUFBVSxHQUFHO1lBQ1gsY0FBYyxFQUFFLENBQUM7WUFDakIsSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLEVBQUUsRUFBRTtZQUNSLHFCQUFxQixFQUFFLENBQUM7U0FDekIsQ0FBQztRQUNGLFNBQUksR0FBRyxDQUFDLENBQUM7SUFDWCxDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyMyBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgY2xhc3MgVGFza0xpc3Qge1xuICBwdWJsaWMgdGFza3MgPSBbXTtcbiAgZmllbGRzID0gW107XG4gIHBhZ2luYXRpb24gPSB7XG4gICAgY29sbGVjdGlvblNpemU6IDAsXG4gICAgcGFnZTogMSxcbiAgICBzaXplOiAxMCxcbiAgICBtYXhQYWdpbmF0aW9uSXRlbVNpemU6IDUsXG4gIH07XG4gIHBhZ2UgPSAwO1xufVxuIl19
@@ -1,269 +0,0 @@
1
- /*
2
- * Copyright 2015-2023 Ritense BV, the Netherlands.
3
- *
4
- * Licensed under EUPL, Version 1.2 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" basis,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { Component, EventEmitter, Output, ViewChild, ViewEncapsulation, } from '@angular/core';
17
- import { FormioOptionsImpl, } from '@valtimo/components';
18
- import moment from 'moment';
19
- import { map, take } from 'rxjs/operators';
20
- import { BehaviorSubject, distinctUntilChanged, Subscription, tap } from 'rxjs';
21
- import * as i0 from "@angular/core";
22
- import * as i1 from "ngx-toastr";
23
- import * as i2 from "@valtimo/form-link";
24
- import * as i3 from "@angular/router";
25
- import * as i4 from "ngx-logger";
26
- import * as i5 from "../task.service";
27
- import * as i6 from "@valtimo/security";
28
- import * as i7 from "@valtimo/components";
29
- import * as i8 from "@valtimo/document";
30
- import * as i9 from "@ngx-translate/core";
31
- import * as i10 from "@angular/common";
32
- import * as i11 from "../assign-user-to-task/assign-user-to-task.component";
33
- moment.locale(localStorage.getItem('langKey') || '');
34
- export class TaskDetailModalComponent {
35
- constructor(toastr, formLinkService, processLinkService, formFlowService, router, logger, route, taskService, userProviderService, modalService, stateService, documentService, translateService) {
36
- this.toastr = toastr;
37
- this.formLinkService = formLinkService;
38
- this.processLinkService = processLinkService;
39
- this.formFlowService = formFlowService;
40
- this.router = router;
41
- this.logger = logger;
42
- this.route = route;
43
- this.taskService = taskService;
44
- this.userProviderService = userProviderService;
45
- this.modalService = modalService;
46
- this.stateService = stateService;
47
- this.documentService = documentService;
48
- this.translateService = translateService;
49
- this.formSubmit = new EventEmitter();
50
- this.assignmentOfTaskChanged = new EventEmitter();
51
- this.task = null;
52
- this.page = null;
53
- this.errorMessage = null;
54
- this.isAdmin$ = this.userProviderService
55
- .getUserSubject()
56
- .pipe(map(userIdentity => userIdentity?.roles?.includes('ROLE_ADMIN')));
57
- this.taskProcessLinkType$ = new BehaviorSubject(null);
58
- this.processLinkIsForm$ = this.taskProcessLinkType$.pipe(map(type => type === 'form'));
59
- this.processLinkIsFormFlow$ = this.taskProcessLinkType$.pipe(map(type => type === 'form-flow'));
60
- this.formIoFormData$ = new BehaviorSubject(null);
61
- this._subscriptions = new Subscription();
62
- this.loading$ = new BehaviorSubject(true);
63
- this.formioOptions = new FormioOptionsImpl();
64
- this.formioOptions.disableAlerts = true;
65
- }
66
- ngAfterViewInit() {
67
- this._subscriptions.add(this.modal.modalShowing$
68
- .pipe(distinctUntilChanged(), tap(modalShowing => {
69
- if (!modalShowing) {
70
- if (this.formFlow) {
71
- this.formFlow.saveData();
72
- }
73
- }
74
- }))
75
- .subscribe());
76
- }
77
- ngOnDestroy() {
78
- this._subscriptions.unsubscribe();
79
- }
80
- openTaskDetails(task) {
81
- this.resetTaskProcessLinkType();
82
- this.resetFormDefinition();
83
- this.getTaskProcessLink(task.id);
84
- this.setDocumentDefinitionNameInService(task);
85
- const documentId = task.businessKey;
86
- this.stateService.setDocumentId(documentId);
87
- this.task = task;
88
- this.page = {
89
- title: task.name,
90
- subtitle: `${this.translateService.instant('taskDetail.taskCreated')} ${task.created}`,
91
- };
92
- //only load from formlink when process link failed for backwards compatibility
93
- if (!this.taskProcessLinkType$.getValue()) {
94
- this.formLinkService
95
- .getPreFilledFormDefinitionByFormLinkId(task.processDefinitionKey, documentId, task.taskDefinitionKey, task.id // taskInstanceId
96
- )
97
- .subscribe(formDefinition => {
98
- this.formAssociation = formDefinition.formAssociation;
99
- const className = this.formAssociation.formLink.className.split('.');
100
- const linkType = className[className.length - 1];
101
- switch (linkType) {
102
- case 'BpmnElementFormIdLink':
103
- this.setFormDefinitionAndOpenModal(formDefinition);
104
- break;
105
- case 'BpmnElementFormFlowIdLink':
106
- // We can't use the formDefinition here because the form definition is provided per form flow step
107
- // I'm still leaving this in here in case we want to add form flow specific code.
108
- this.modal.show();
109
- break;
110
- case 'BpmnElementUrlLink':
111
- this.openUrlLink(formDefinition);
112
- break;
113
- case 'BpmnElementAngularStateUrlLink':
114
- this.openAngularStateUrlLink(task, formDefinition);
115
- break;
116
- default:
117
- this.logger.fatal('Unsupported class name');
118
- }
119
- }, errors => {
120
- if (errors?.error?.detail) {
121
- this.errorMessage = errors.error.detail;
122
- }
123
- this.modal.show();
124
- });
125
- }
126
- }
127
- gotoFormLinkScreen() {
128
- this.modal.hide();
129
- this.router.navigate(['form-links']);
130
- }
131
- onChange(event) {
132
- if (event.data) {
133
- this.formIoFormData$.next(event.data);
134
- }
135
- }
136
- onSubmit(submission) {
137
- if (submission.data) {
138
- this.formIoFormData$.next(submission.data);
139
- }
140
- if (this.taskProcessLinkType$.getValue() === 'form') {
141
- if (this.processLinkId) {
142
- this.processLinkService
143
- .submitForm(this.processLinkId, submission.data, this.task.businessKey, this.task.id)
144
- .subscribe({
145
- next: (_) => {
146
- this.completeTask();
147
- },
148
- error: errors => {
149
- this.form.showErrors(errors);
150
- },
151
- });
152
- }
153
- else {
154
- this.formLinkService
155
- .onSubmit(this.task.processDefinitionKey, this.formAssociation.formLink.id, submission.data, this.task.businessKey, this.task.id)
156
- .subscribe((_) => {
157
- this.completeTask();
158
- }, errors => {
159
- this.form.showErrors(errors);
160
- });
161
- }
162
- }
163
- }
164
- resetFormDefinition() {
165
- this.formDefinition = null;
166
- this.loading$.next(true);
167
- }
168
- getTaskProcessLink(taskId) {
169
- this.taskService.getTaskProcessLink(taskId).subscribe({
170
- next: res => {
171
- if (res != null) {
172
- switch (res?.type) {
173
- case 'form':
174
- this.taskProcessLinkType$.next('form');
175
- this.processLinkId = res.processLinkId;
176
- this.setFormDefinitionAndOpenModal(res.properties.prefilledForm);
177
- break;
178
- case 'form-flow':
179
- this.taskProcessLinkType$.next('form-flow');
180
- this.formFlowInstanceId = res.properties.formFlowInstanceId;
181
- break;
182
- }
183
- this.loading$.next(false);
184
- }
185
- else {
186
- this.getLegacyTaskProcessLink(taskId);
187
- }
188
- },
189
- error: _ => {
190
- this.getLegacyTaskProcessLink(taskId);
191
- },
192
- });
193
- }
194
- completeTask() {
195
- this.toastr.success(`${this.task.name} ${this.translateService.instant('taskDetail.taskCompleted')}`);
196
- this.modal.hide();
197
- this.task = null;
198
- this.formSubmit.emit();
199
- }
200
- getLegacyTaskProcessLink(taskId) {
201
- this.taskService.getTaskProcessLinkV1(taskId).subscribe(resV1 => {
202
- switch (resV1?.type) {
203
- case 'form':
204
- this.taskProcessLinkType$.next('form');
205
- break;
206
- case 'form-flow':
207
- this.taskProcessLinkType$.next('form-flow');
208
- this.formFlowInstanceId = resV1.properties.formFlowInstanceId;
209
- break;
210
- }
211
- this.loading$.next(false);
212
- });
213
- }
214
- resetTaskProcessLinkType() {
215
- this.taskProcessLinkType$.next(null);
216
- this.processLinkId = null;
217
- this.formAssociation = null;
218
- }
219
- setFormDefinitionAndOpenModal(formDefinition) {
220
- this.taskProcessLinkType$.next('form');
221
- this.formDefinition = formDefinition;
222
- this.modal.show();
223
- }
224
- openUrlLink(formDefinition) {
225
- const url = this.router.serializeUrl(this.router.createUrlTree([formDefinition.formAssociation.formLink.url]));
226
- window.open(url, '_blank');
227
- }
228
- openAngularStateUrlLink(task, formDefinition) {
229
- this.route.params.pipe(take(1)).subscribe(params => {
230
- const taskId = task?.id;
231
- const documentId = params?.documentId;
232
- this.router.navigate([formDefinition.formAssociation.formLink.url], {
233
- state: {
234
- ...(taskId && { taskId }),
235
- ...(documentId && { documentId }),
236
- },
237
- });
238
- });
239
- }
240
- setDocumentDefinitionNameInService(task) {
241
- this.documentService
242
- .getProcessDocumentDefinitionFromProcessInstanceId(task.processInstanceId)
243
- .subscribe(processDocumentDefinition => {
244
- const documentDefinitionName = processDocumentDefinition.id.documentDefinitionId.name;
245
- this.modalService.setDocumentDefinitionName(documentDefinitionName);
246
- this.stateService.setDocumentDefinitionName(documentDefinitionName);
247
- });
248
- }
249
- }
250
- TaskDetailModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TaskDetailModalComponent, deps: [{ token: i1.ToastrService }, { token: i2.FormLinkService }, { token: i2.ProcessLinkService }, { token: i2.FormFlowService }, { token: i3.Router }, { token: i4.NGXLogger }, { token: i3.ActivatedRoute }, { token: i5.TaskService }, { token: i6.UserProviderService }, { token: i7.ValtimoModalService }, { token: i7.FormIoStateService }, { token: i8.DocumentService }, { token: i9.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
251
- TaskDetailModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: TaskDetailModalComponent, selector: "valtimo-task-detail-modal", outputs: { formSubmit: "formSubmit", assignmentOfTaskChanged: "assignmentOfTaskChanged" }, viewQueries: [{ propertyName: "form", first: true, predicate: ["form"], descendants: true }, { propertyName: "formFlow", first: true, predicate: ["formFlow"], descendants: true }, { propertyName: "modal", first: true, predicate: ["taskDetailModal"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright 2015-2023 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 *ngIf=\"{\n loading: loading$ | async\n } as obs\"\n elementId=\"taskDetailModal\"\n [title]=\"page?.title\"\n [subtitle]=\"page?.subtitle\"\n [templateBelowSubtitle]=\"assignUserToTask\"\n>\n <div body *ngIf=\"formDefinition && (processLinkIsForm$ | async)\">\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=\"processLinkIsFormFlow$ | async\">\n <valtimo-form-flow\n #formFlow\n [formIoFormData]=\"formIoFormData$\"\n [formFlowInstanceId]=\"formFlowInstanceId\"\n (formFlowComplete)=\"completeTask()\"\n ></valtimo-form-flow>\n </div>\n <div body *ngIf=\"obs.loading\">\n <div class=\"text-black mb-0 p-3 text-center\">\n {{ 'formManagement.loading' | translate }}\n </div>\n </div>\n <div body *ngIf=\"obs.loading === false && !formDefinition && !formFlowInstanceId && !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-2023 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: i2.FormFlowComponent, selector: "valtimo-form-flow", inputs: ["formIoFormData", "formFlowInstanceId"], outputs: ["formFlowComplete"] }, { 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 });
252
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: TaskDetailModalComponent, decorators: [{
253
- type: Component,
254
- args: [{ selector: 'valtimo-task-detail-modal', encapsulation: ViewEncapsulation.None, template: "<!--\n ~ Copyright 2015-2023 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 *ngIf=\"{\n loading: loading$ | async\n } as obs\"\n elementId=\"taskDetailModal\"\n [title]=\"page?.title\"\n [subtitle]=\"page?.subtitle\"\n [templateBelowSubtitle]=\"assignUserToTask\"\n>\n <div body *ngIf=\"formDefinition && (processLinkIsForm$ | async)\">\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=\"processLinkIsFormFlow$ | async\">\n <valtimo-form-flow\n #formFlow\n [formIoFormData]=\"formIoFormData$\"\n [formFlowInstanceId]=\"formFlowInstanceId\"\n (formFlowComplete)=\"completeTask()\"\n ></valtimo-form-flow>\n </div>\n <div body *ngIf=\"obs.loading\">\n <div class=\"text-black mb-0 p-3 text-center\">\n {{ 'formManagement.loading' | translate }}\n </div>\n </div>\n <div body *ngIf=\"obs.loading === false && !formDefinition && !formFlowInstanceId && !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-2023 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"] }]
255
- }], ctorParameters: function () { return [{ type: i1.ToastrService }, { type: i2.FormLinkService }, { type: i2.ProcessLinkService }, { type: i2.FormFlowService }, { type: i3.Router }, { type: i4.NGXLogger }, { type: i3.ActivatedRoute }, { type: i5.TaskService }, { type: i6.UserProviderService }, { type: i7.ValtimoModalService }, { type: i7.FormIoStateService }, { type: i8.DocumentService }, { type: i9.TranslateService }]; }, propDecorators: { form: [{
256
- type: ViewChild,
257
- args: ['form']
258
- }], formFlow: [{
259
- type: ViewChild,
260
- args: ['formFlow']
261
- }], modal: [{
262
- type: ViewChild,
263
- args: ['taskDetailModal']
264
- }], formSubmit: [{
265
- type: Output
266
- }], assignmentOfTaskChanged: [{
267
- type: Output
268
- }] } });
269
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvdGFzay1kZXRhaWwtbW9kYWwvdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGltby90YXNrL3NyYy9saWIvdGFzay1kZXRhaWwtbW9kYWwvdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFFWixNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBRUwsaUJBQWlCLEdBTWxCLE1BQU0scUJBQXFCLENBQUM7QUFXN0IsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRzVCLE9BQU8sRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBYyxZQUFZLEVBQUUsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7O0FBSzFGLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQVFyRCxNQUFNLE9BQU8sd0JBQXdCO0lBeUJuQyxZQUNtQixNQUFxQixFQUNyQixlQUFnQyxFQUNoQyxrQkFBc0MsRUFDdEMsZUFBZ0MsRUFDaEMsTUFBYyxFQUNkLE1BQWlCLEVBQ2pCLEtBQXFCLEVBQ3JCLFdBQXdCLEVBQ3hCLG1CQUF3QyxFQUN4QyxZQUFpQyxFQUNqQyxZQUFnQyxFQUNoQyxlQUFnQyxFQUNoQyxnQkFBa0M7UUFabEMsV0FBTSxH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QmEsd0JBQXdCO2tCQU5wQyxTQUFTOytCQUNFLDJCQUEyQixpQkFHdEIsaUJBQWlCLENBQUMsSUFBSTt1Y0FHbEIsSUFBSTtzQkFBdEIsU0FBUzt1QkFBQyxNQUFNO2dCQUNNLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFDUyxLQUFLO3NCQUFsQyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDbEIsVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyx1QkFBdUI7c0JBQWhDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMTUtMjAyMyBSaXRlbnNlIEJWLCB0aGUgTmV0aGVybGFuZHMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwczovL2pvaW51cC5lYy5ldXJvcGEuZXUvY29sbGVjdGlvbi9ldXBsL2V1cGwtdGV4dC1ldXBsLTEyXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIGJhc2lzLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgRm9ybWlvQ29tcG9uZW50LFxuICBGb3JtaW9PcHRpb25zSW1wbCxcbiAgRm9ybUlvU3RhdGVTZXJ2aWNlLFxuICBGb3JtaW9TdWJtaXNzaW9uLFxuICBNb2RhbENvbXBvbmVudCxcbiAgVmFsdGltb0Zvcm1pb09wdGlvbnMsXG4gIFZhbHRpbW9Nb2RhbFNlcnZpY2UsXG59IGZyb20gJ0B2YWx0aW1vL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtUYXNrLCBUYXNrUHJvY2Vzc0xpbmtUeXBlfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtcbiAgRm9ybUFzc29jaWF0aW9uLFxuICBGb3JtRmxvd0NvbXBvbmVudCxcbiAgRm9ybUZsb3dTZXJ2aWNlLFxuICBGb3JtTGlua1NlcnZpY2UsXG4gIEZvcm1TdWJtaXNzaW9uUmVzdWx0LFxuICBQcm9jZXNzTGlua1NlcnZpY2UsXG59IGZyb20gJ0B2YWx0aW1vL2Zvcm0tbGluayc7XG5pbXBvcnQge0Zvcm1pb0Zvcm19IGZyb20gJ0Bmb3JtaW8vYW5ndWxhcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQge05HWExvZ2dlcn0gZnJvbSAnbmd4LWxvZ2dlcic7XG5pbXBvcnQge1RvYXN0clNlcnZpY2V9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHttYXAsIHRha2V9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7VGFza1NlcnZpY2V9IGZyb20gJy4uL3Rhc2suc2VydmljZSc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgdGFwfSBmcm9tICdyeGpzJztcbmltcG9ydCB7VXNlclByb3ZpZGVyU2VydmljZX0gZnJvbSAnQHZhbHRpbW8vc2VjdXJpdHknO1xuaW1wb3J0IHtEb2N1bWVudFNlcnZpY2V9IGZyb20gJ0B2YWx0aW1vL2RvY3VtZW50JztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbm1vbWVudC5sb2NhbGUobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xhbmdLZXknKSB8fCAnJyk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbHRpbW8tdGFzay1kZXRhaWwtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFzay1kZXRhaWwtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YXNrLWRldGFpbC1tb2RhbC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBUYXNrRGV0YWlsTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKCdmb3JtJykgZm9ybTogRm9ybWlvQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdmb3JtRmxvdycpIGZvcm1GbG93OiBGb3JtRmxvd0NvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgndGFza0RldGFpbE1vZGFsJykgbW9kYWw6IE1vZGFsQ29tcG9uZW50O1xuICBAT3V0cHV0KCkgZm9ybVN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGFzc2lnbm1lbnRPZlRhc2tDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyB0YXNrOiBUYXNrIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBmb3JtRGVmaW5pdGlvbjogRm9ybWlvRm9ybTtcbiAgcHVibGljIGZvcm1GbG93SW5zdGFuY2VJZDogc3RyaW5nO1xuICBwdWJsaWMgcGFnZTogYW55ID0gbnVsbDtcbiAgcHVibGljIGZvcm1pb09wdGlvbnM6IFZhbHRpbW9Gb3JtaW9PcHRpb25zO1xuICBwdWJsaWMgZXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBudWxsO1xuICByZWFkb25seSBpc0FkbWluJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMudXNlclByb3ZpZGVyU2VydmljZVxuICAgIC5nZXRVc2VyU3ViamVjdCgpXG4gICAgLnBpcGUobWFwKHVzZXJJZGVudGl0eSA9PiB1c2VySWRlbnRpdHk/LnJvbGVzPy5pbmNsdWRlcygnUk9MRV9BRE1JTicpKSk7XG4gIHByaXZhdGUgZm9ybUFzc29jaWF0aW9uOiBGb3JtQXNzb2NpYXRpb247XG4gIHByaXZhdGUgcHJvY2Vzc0xpbmtJZDogc3RyaW5nO1xuICBwcml2YXRlIHRhc2tQcm9jZXNzTGlua1R5cGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYXNrUHJvY2Vzc0xpbmtUeXBlIHwgbnVsbD4obnVsbCk7XG4gIHByb2Nlc3NMaW5rSXNGb3JtJCA9IHRoaXMudGFza1Byb2Nlc3NMaW5rVHlwZSQucGlwZShtYXAodHlwZSA9PiB0eXBlID09PSAnZm9ybScpKTtcbiAgcHJvY2Vzc0xpbmtJc0Zvcm1GbG93JCA9IHRoaXMudGFza1Byb2Nlc3NMaW5rVHlwZSQucGlwZShtYXAodHlwZSA9PiB0eXBlID09PSAnZm9ybS1mbG93JykpO1xuICBmb3JtSW9Gb3JtRGF0YSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHJlYWRvbmx5IGxvYWRpbmckID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRvYXN0cjogVG9hc3RyU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZvcm1MaW5rU2VydmljZTogRm9ybUxpbmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvY2Vzc0xpbmtTZXJ2aWNlOiBQcm9jZXNzTGlua1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtRmxvd1NlcnZpY2U6IEZvcm1GbG93U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBOR1hMb2dnZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0YXNrU2VydmljZTogVGFza1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSB1c2VyUHJvdmlkZXJTZXJ2aWNlOiBVc2VyUHJvdmlkZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9kYWxTZXJ2aWNlOiBWYWx0aW1vTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhdGVTZXJ2aWNlOiBGb3JtSW9TdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudFNlcnZpY2U6IERvY3VtZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5mb3JtaW9PcHRpb25zID0gbmV3IEZvcm1pb09wdGlvbnNJbXBsKCk7XG4gICAgdGhpcy5mb3JtaW9PcHRpb25zLmRpc2FibGVBbGVydHMgPSB0cnVlO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5tb2RhbC5tb2RhbFNob3dpbmckXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgdGFwKG1vZGFsU2hvd2luZyA9PiB7XG4gICAgICAgICAgICBpZiAoIW1vZGFsU2hvd2luZykge1xuICAgICAgICAgICAgICBpZiAodGhpcy5mb3JtRmxvdykge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUZsb3cuc2F2ZURhdGEoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG9wZW5UYXNrRGV0YWlscyh0YXNrOiBUYXNrKSB7XG4gICAgdGhpcy5yZXNldFRhc2tQcm9jZXNzTGlua1R5cGUoKTtcbiAgICB0aGlzLnJlc2V0Rm9ybURlZmluaXRpb24oKTtcbiAgICB0aGlzLmdldFRhc2tQcm9jZXNzTGluayh0YXNrLmlkKTtcbiAgICB0aGlzLnNldERvY3VtZW50RGVmaW5pdGlvbk5hbWVJblNlcnZpY2UodGFzayk7XG4gICAgY29uc3QgZG9jdW1lbnRJZCA9IHRhc2suYnVzaW5lc3NLZXk7XG4gICAgdGhpcy5zdGF0ZVNlcnZpY2Uuc2V0RG9jdW1lbnRJZChkb2N1bWVudElkKTtcblxuICAgIHRoaXMudGFzayA9IHRhc2s7XG4gICAgdGhpcy5wYWdlID0ge1xuICAgICAgdGl0bGU6IHRhc2submFtZSxcbiAgICAgIHN1YnRpdGxlOiBgJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgndGFza0RldGFpbC50YXNrQ3JlYXRlZCcpfSAke3Rhc2suY3JlYXRlZH1gLFxuICAgIH07XG5cbiAgICAvL29ubHkgbG9hZCBmcm9tIGZvcm1saW5rIHdoZW4gcHJvY2VzcyBsaW5rIGZhaWxlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICBpZiAoIXRoaXMudGFza1Byb2Nlc3NMaW5rVHlwZSQuZ2V0VmFsdWUoKSkge1xuICAgICAgdGhpcy5mb3JtTGlua1NlcnZpY2VcbiAgICAgICAgLmdldFByZUZpbGxlZEZvcm1EZWZpbml0aW9uQnlGb3JtTGlua0lkKFxuICAgICAgICAgIHRhc2sucHJvY2Vzc0RlZmluaXRpb25LZXksXG4gICAgICAgICAgZG9jdW1lbnRJZCxcbiAgICAgICAgICB0YXNrLnRhc2tEZWZpbml0aW9uS2V5LFxuICAgICAgICAgIHRhc2suaWQgLy8gdGFza0luc3RhbmNlSWRcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgIGZvcm1EZWZpbml0aW9uID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUFzc29jaWF0aW9uID0gZm9ybURlZmluaXRpb24uZm9ybUFzc29jaWF0aW9uO1xuXG4gICAgICAgICAgICBjb25zdCBjbGFzc05hbWUgPSB0aGlzLmZvcm1Bc3NvY2lhdGlvbi5mb3JtTGluay5jbGFzc05hbWUuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmtUeXBlID0gY2xhc3NOYW1lW2NsYXNzTmFtZS5sZW5ndGggLSAxXTtcblxuICAgICAgICAgICAgc3dpdGNoIChsaW5rVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlICdCcG1uRWxlbWVudEZvcm1JZExpbmsnOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9ybURlZmluaXRpb25BbmRPcGVuTW9kYWwoZm9ybURlZmluaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdCcG1uRWxlbWVudEZvcm1GbG93SWRMaW5rJzpcbiAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCB1c2UgdGhlIGZvcm1EZWZpbml0aW9uIGhlcmUgYmVjYXVzZSB0aGUgZm9ybSBkZWZpbml0aW9uIGlzIHByb3ZpZGVkIHBlciBmb3JtIGZsb3cgc3RlcFxuICAgICAgICAgICAgICAgIC8vIEknbSBzdGlsbCBsZWF2aW5nIHRoaXMgaW4gaGVyZSBpbiBjYXNlIHdlIHdhbnQgdG8gYWRkIGZvcm0gZmxvdyBzcGVjaWZpYyBjb2RlLlxuICAgICAgICAgICAgICAgIHRoaXMubW9kYWwuc2hvdygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdCcG1uRWxlbWVudFVybExpbmsnOlxuICAgICAgICAgICAgICAgIHRoaXMub3BlblVybExpbmsoZm9ybURlZmluaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdCcG1uRWxlbWVudEFuZ3VsYXJTdGF0ZVVybExpbmsnOlxuICAgICAgICAgICAgICAgIHRoaXMub3BlbkFuZ3VsYXJTdGF0ZVVybExpbmsodGFzaywgZm9ybURlZmluaXRpb24pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmZhdGFsKCdVbnN1cHBvcnRlZCBjbGFzcyBuYW1lJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcnMgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9ycz8uZXJyb3I/LmRldGFpbCkge1xuICAgICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IGVycm9ycy5lcnJvci5kZXRhaWw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubW9kYWwuc2hvdygpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ290b0Zvcm1MaW5rU2NyZWVuKCk6IHZvaWQge1xuICAgIHRoaXMubW9kYWwuaGlkZSgpO1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnZm9ybS1saW5rcyddKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmRhdGEpIHtcbiAgICAgIHRoaXMuZm9ybUlvRm9ybURhdGEkLm5leHQoZXZlbnQuZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uU3VibWl0KHN1Ym1pc3Npb246IEZvcm1pb1N1Ym1pc3Npb24pOiB2b2lkIHtcbiAgICBpZiAoc3VibWlzc2lvbi5kYXRhKSB7XG4gICAgICB0aGlzLmZvcm1Jb0Zvcm1EYXRhJC5uZXh0KHN1Ym1pc3Npb24uZGF0YSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLmdldFZhbHVlKCkgPT09ICdmb3JtJykge1xuICAgICAgaWYgKHRoaXMucHJvY2Vzc0xpbmtJZCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NMaW5rU2VydmljZVxuICAgICAgICAgIC5zdWJtaXRGb3JtKHRoaXMucHJvY2Vzc0xpbmtJZCwgc3VibWlzc2lvbi5kYXRhLCB0aGlzLnRhc2suYnVzaW5lc3NLZXksIHRoaXMudGFzay5pZClcbiAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChfOiBGb3JtU3VibWlzc2lvblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlVGFzaygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvcnMgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmZvcm0uc2hvd0Vycm9ycyhlcnJvcnMpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZm9ybUxpbmtTZXJ2aWNlXG4gICAgICAgICAgLm9uU3VibWl0KFxuICAgICAgICAgICAgdGhpcy50YXNrLnByb2Nlc3NEZWZpbml0aW9uS2V5LFxuICAgICAgICAgICAgdGhpcy5mb3JtQXNzb2NpYXRpb24uZm9ybUxpbmsuaWQsXG4gICAgICAgICAgICBzdWJtaXNzaW9uLmRhdGEsXG4gICAgICAgICAgICB0aGlzLnRhc2suYnVzaW5lc3NLZXksXG4gICAgICAgICAgICB0aGlzLnRhc2suaWRcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgIChfOiBGb3JtU3VibWlzc2lvblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlVGFzaygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9ycyA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZm9ybS5zaG93RXJyb3JzKGVycm9ycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0Rm9ybURlZmluaXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtRGVmaW5pdGlvbiA9IG51bGw7XG4gICAgdGhpcy5sb2FkaW5nJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYXNrUHJvY2Vzc0xpbmsodGFza0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnRhc2tTZXJ2aWNlLmdldFRhc2tQcm9jZXNzTGluayh0YXNrSWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiByZXMgPT4ge1xuICAgICAgICBpZiAocmVzICE9IG51bGwpIHtcbiAgICAgICAgICBzd2l0Y2ggKHJlcz8udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgICAgICAgIHRoaXMudGFza1Byb2Nlc3NMaW5rVHlwZSQubmV4dCgnZm9ybScpO1xuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NMaW5rSWQgPSByZXMucHJvY2Vzc0xpbmtJZDtcbiAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGVmaW5pdGlvbkFuZE9wZW5Nb2RhbChyZXMucHJvcGVydGllcy5wcmVmaWxsZWRGb3JtKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmb3JtLWZsb3cnOlxuICAgICAgICAgICAgICB0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLm5leHQoJ2Zvcm0tZmxvdycpO1xuICAgICAgICAgICAgICB0aGlzLmZvcm1GbG93SW5zdGFuY2VJZCA9IHJlcy5wcm9wZXJ0aWVzLmZvcm1GbG93SW5zdGFuY2VJZDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5nZXRMZWdhY3lUYXNrUHJvY2Vzc0xpbmsodGFza0lkKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiBfID0+IHtcbiAgICAgICAgdGhpcy5nZXRMZWdhY3lUYXNrUHJvY2Vzc0xpbmsodGFza0lkKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBjb21wbGV0ZVRhc2soKSB7XG4gICAgdGhpcy50b2FzdHIuc3VjY2VzcyhcbiAgICAgIGAke3RoaXMudGFzay5uYW1lfSAke3RoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd0YXNrRGV0YWlsLnRhc2tDb21wbGV0ZWQnKX1gXG4gICAgKTtcbiAgICB0aGlzLm1vZGFsLmhpZGUoKTtcbiAgICB0aGlzLnRhc2sgPSBudWxsO1xuICAgIHRoaXMuZm9ybVN1Ym1pdC5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIGdldExlZ2FjeVRhc2tQcm9jZXNzTGluayh0YXNrSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudGFza1NlcnZpY2UuZ2V0VGFza1Byb2Nlc3NMaW5rVjEodGFza0lkKS5zdWJzY3JpYmUocmVzVjEgPT4ge1xuICAgICAgc3dpdGNoIChyZXNWMT8udHlwZSkge1xuICAgICAgICBjYXNlICdmb3JtJzpcbiAgICAgICAgICB0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLm5leHQoJ2Zvcm0nKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZm9ybS1mbG93JzpcbiAgICAgICAgICB0aGlzLnRhc2tQcm9jZXNzTGlua1R5cGUkLm5leHQoJ2Zvcm0tZmxvdycpO1xuICAgICAgICAgIHRoaXMuZm9ybUZsb3dJbnN0YW5jZUlkID0gcmVzVjEucHJvcGVydGllcy5mb3JtRmxvd0luc3RhbmNlSWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aGlzLmxvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFRhc2tQcm9jZXNzTGlua1R5cGUoKTogdm9pZCB7XG4gICAgdGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KG51bGwpO1xuICAgIHRoaXMucHJvY2Vzc0xpbmtJZCA9IG51bGw7XG4gICAgdGhpcy5mb3JtQXNzb2NpYXRpb24gPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRGb3JtRGVmaW5pdGlvbkFuZE9wZW5Nb2RhbChmb3JtRGVmaW5pdGlvbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy50YXNrUHJvY2Vzc0xpbmtUeXBlJC5uZXh0KCdmb3JtJyk7XG4gICAgdGhpcy5mb3JtRGVmaW5pdGlvbiA9IGZvcm1EZWZpbml0aW9uO1xuICAgIHRoaXMubW9kYWwuc2hvdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuVXJsTGluayhmb3JtRGVmaW5pdGlvbjogYW55KTogdm9pZCB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5yb3V0ZXIuc2VyaWFsaXplVXJsKFxuICAgICAgdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbZm9ybURlZmluaXRpb24uZm9ybUFzc29jaWF0aW9uLmZvcm1MaW5rLnVybF0pXG4gICAgKTtcblxuICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuQW5ndWxhclN0YXRlVXJsTGluayh0YXNrOiBUYXNrLCBmb3JtRGVmaW5pdGlvbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgIGNvbnN0IHRhc2tJZCA9IHRhc2s/LmlkO1xuICAgICAgY29uc3QgZG9jdW1lbnRJZCA9IHBhcmFtcz8uZG9jdW1lbnRJZDtcblxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Zvcm1EZWZpbml0aW9uLmZvcm1Bc3NvY2lhdGlvbi5mb3JtTGluay51cmxdLCB7XG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgLi4uKHRhc2tJZCAmJiB7dGFza0lkfSksXG4gICAgICAgICAgLi4uKGRvY3VtZW50SWQgJiYge2RvY3VtZW50SWR9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREb2N1bWVudERlZmluaXRpb25OYW1lSW5TZXJ2aWNlKHRhc2s6IFRhc2spOiB2b2lkIHtcbiAgICB0aGlzLmRvY3VtZW50U2VydmljZVxuICAgICAgLmdldFByb2Nlc3NEb2N1bWVudERlZmluaXRpb25Gcm9tUHJvY2Vzc0luc3RhbmNlSWQodGFzay5wcm9jZXNzSW5zdGFuY2VJZClcbiAgICAgIC5zdWJzY3JpYmUocHJvY2Vzc0RvY3VtZW50RGVmaW5pdGlvbiA9PiB7XG4gICAgICAgIGNvbnN0IGRvY3VtZW50RGVmaW5pdGlvbk5hbWUgPSBwcm9jZXNzRG9jdW1lbnREZWZpbml0aW9uLmlkLmRvY3VtZW50RGVmaW5pdGlvbklkLm5hbWU7XG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLnNldERvY3VtZW50RGVmaW5pdGlvbk5hbWUoZG9jdW1lbnREZWZpbml0aW9uTmFtZSk7XG4gICAgICAgIHRoaXMuc3RhdGVTZXJ2aWNlLnNldERvY3VtZW50RGVmaW5pdGlvbk5hbWUoZG9jdW1lbnREZWZpbml0aW9uTmFtZSk7XG4gICAgICB9KTtcbiAgfVxufVxuIiwiPCEtLVxuICB+IENvcHlyaWdodCAyMDE1LTIwMjMgUml0ZW5zZSBCViwgdGhlIE5ldGhlcmxhbmRzLlxuICB+XG4gIH4gTGljZW5zZWQgdW5kZXIgRVVQTCwgVmVyc2lvbiAxLjIgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICB+XG4gIH4gaHR0cHM6Ly9qb2ludXAuZWMuZXVyb3BhLmV1L2NvbGxlY3Rpb24vZXVwbC9ldXBsLXRleHQtZXVwbC0xMlxuICB+XG4gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBiYXNpcyxcbiAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gIC0tPlxuXG48dmFsdGltby1tb2RhbFxuICAjdGFza0RldGFpbE1vZGFsXG4gICpuZ0lmPVwie1xuICAgIGxvYWRpbmc6IGxvYWRpbmckIHwgYXN5bmNcbiAgfSBhcyBvYnNcIlxuICBlbGVtZW50SWQ9XCJ0YXNrRGV0YWlsTW9kYWxcIlxuICBbdGl0bGVdPVwicGFnZT8udGl0bGVcIlxuICBbc3VidGl0bGVdPVwicGFnZT8uc3VidGl0bGVcIlxuICBbdGVtcGxhdGVCZWxvd1N1YnRpdGxlXT1cImFzc2lnblVzZXJUb1Rhc2tcIlxuPlxuICA8ZGl2IGJvZHkgKm5nSWY9XCJmb3JtRGVmaW5pdGlvbiAmJiAocHJvY2Vzc0xpbmtJc0Zvcm0kIHwgYXN5bmMpXCI+XG4gICAgPHZhbHRpbW8tZm9ybS1pb1xuICAgICAgI2Zvcm1cbiAgICAgIFtmb3JtXT1cImZvcm1EZWZpbml0aW9uXCJcbiAgICAgIChzdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiXG4gICAgICAoY2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgW29wdGlvbnNdPVwiZm9ybWlvT3B0aW9uc1wiXG4gICAgPjwvdmFsdGltby1mb3JtLWlvPlxuICA8L2Rpdj5cbiAgPGRpdiBib2R5ICpuZ0lmPVwicHJvY2Vzc0xpbmtJc0Zvcm1GbG93JCB8IGFzeW5jXCI+XG4gICAgPHZhbHRpbW8tZm9ybS1mbG93XG4gICAgICAjZm9ybUZsb3dcbiAgICAgIFtmb3JtSW9Gb3JtRGF0YV09XCJmb3JtSW9Gb3JtRGF0YSRcIlxuICAgICAgW2Zvcm1GbG93SW5zdGFuY2VJZF09XCJmb3JtRmxvd0luc3RhbmNlSWRcIlxuICAgICAgKGZvcm1GbG93Q29tcGxldGUpPVwiY29tcGxldGVUYXNrKClcIlxuICAgID48L3ZhbHRpbW8tZm9ybS1mbG93PlxuICA8L2Rpdj5cbiAgPGRpdiBib2R5ICpuZ0lmPVwib2JzLmxvYWRpbmdcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1ibGFjayBtYi0wIHAtMyB0ZXh0LWNlbnRlclwiPlxuICAgICAge3sgJ2Zvcm1NYW5hZ2VtZW50LmxvYWRpbmcnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGJvZHkgKm5nSWY9XCJvYnMubG9hZGluZyA9PT0gZmFsc2UgJiYgIWZvcm1EZWZpbml0aW9uICYmICFmb3JtRmxvd0luc3RhbmNlSWQgJiYgIWVycm9yTWVzc2FnZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJiZy13YXJuaW5nIHRleHQtYmxhY2sgbWItMCBwLTMgdGV4dC1jZW50ZXJcIj5cbiAgICAgIHt7XG4gICAgICAgIChpc0FkbWluJCB8IGFzeW5jKVxuICAgICAgICAgID8gKCdmb3JtTWFuYWdlbWVudC5ub0Zvcm1EZWZpbml0aW9uRm91bmRBZG1pbicgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgOiAoJ2Zvcm1NYW5hZ2VtZW50Lm5vRm9ybURlZmluaXRpb25Gb3VuZFVzZXInIHwgdHJhbnNsYXRlKVxuICAgICAgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgYm9keSAqbmdJZj1cImVycm9yTWVzc2FnZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJiZy1kYW5nZXIgdGV4dC1ibGFjayBtYi0wIHAtMyB0ZXh0LWNlbnRlclwiPlxuICAgICAge3sgZXJyb3JNZXNzYWdlIH19XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGZvb3Rlcj5cbiAgICA8ZGl2IGNsYXNzPVwibWItMCBwLTMgdGV4dC1jZW50ZXJcIiAqbmdJZj1cIiFmb3JtRGVmaW5pdGlvblwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zcGFjZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwiZ290b0Zvcm1MaW5rU2NyZWVuKClcIlxuICAgICAgICBpZD1cImZvcm0tbGluay1idXR0b25cIlxuICAgICAgPlxuICAgICAgICB7eyAnZm9ybU1hbmFnZW1lbnQuZ290b0Zvcm1MaW5rc0J1dHRvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvdmFsdGltby1tb2RhbD5cblxuPG5nLXRlbXBsYXRlICNhc3NpZ25Vc2VyVG9UYXNrPlxuICA8dmFsdGltby1hc3NpZ24tdXNlci10by10YXNrXG4gICAgKm5nSWY9XCJ0YXNrICYmIGFzc2lnbm1lbnRPZlRhc2tDaGFuZ2VkXCJcbiAgICBbdGFza0lkXT1cInRhc2suaWRcIlxuICAgIFthc3NpZ25lZUVtYWlsXT1cInRhc2suYXNzaWduZWVcIlxuICAgIChhc3NpZ25tZW50T2ZUYXNrQ2hhbmdlZCk9XCJhc3NpZ25tZW50T2ZUYXNrQ2hhbmdlZC5lbWl0KClcIlxuICA+PC92YWx0aW1vLWFzc2lnbi11c2VyLXRvLXRhc2s+XG48L25nLXRlbXBsYXRlPlxuIl19