@alfresco/adf-process-services 8.1.0-16320806191 → 9.1.0-16312921641

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 (125) hide show
  1. package/fesm2022/adf-process-services.mjs +297 -301
  2. package/fesm2022/adf-process-services.mjs.map +1 -1
  3. package/package.json +4 -6
  4. package/esm2022/adf-process-services.mjs +0 -5
  5. package/esm2022/lib/app-list/apps-list.component.mjs +0 -195
  6. package/esm2022/lib/app-list/icon.model.mjs +0 -166
  7. package/esm2022/lib/app-list/index.mjs +0 -18
  8. package/esm2022/lib/app-list/public-api.mjs +0 -23
  9. package/esm2022/lib/app-list/select-apps-dialog/select-apps-dialog.component.mjs +0 -53
  10. package/esm2022/lib/attachment/create-process-attachment/create-process-attachment.component.mjs +0 -73
  11. package/esm2022/lib/attachment/create-task-attachment/create-task-attachment.component.mjs +0 -73
  12. package/esm2022/lib/attachment/index.mjs +0 -18
  13. package/esm2022/lib/attachment/process-attachment-list/process-attachment-list.component.mjs +0 -197
  14. package/esm2022/lib/attachment/public-api.mjs +0 -31
  15. package/esm2022/lib/attachment/task-attachment-list/task-attachment-list.component.mjs +0 -196
  16. package/esm2022/lib/compat/types.mjs +0 -18
  17. package/esm2022/lib/form/events/validate-dynamic-table-row.event.mjs +0 -26
  18. package/esm2022/lib/form/form-custom-outcomes.component.mjs +0 -31
  19. package/esm2022/lib/form/form-list/form-list.component.mjs +0 -50
  20. package/esm2022/lib/form/form.component.mjs +0 -346
  21. package/esm2022/lib/form/index.mjs +0 -18
  22. package/esm2022/lib/form/model/form-definition.model.mjs +0 -92
  23. package/esm2022/lib/form/process-form-rendering.service.mjs +0 -55
  24. package/esm2022/lib/form/public-api.mjs +0 -32
  25. package/esm2022/lib/form/services/activiti-alfresco.service.mjs +0 -113
  26. package/esm2022/lib/form/services/ecm-model.service.mjs +0 -156
  27. package/esm2022/lib/form/services/editor.service.mjs +0 -87
  28. package/esm2022/lib/form/services/external-alfresco-api.service.mjs +0 -57
  29. package/esm2022/lib/form/services/index.mjs +0 -26
  30. package/esm2022/lib/form/services/model.service.mjs +0 -130
  31. package/esm2022/lib/form/services/process-content.service.mjs +0 -223
  32. package/esm2022/lib/form/services/process-definition.service.mjs +0 -93
  33. package/esm2022/lib/form/services/task-form.service.mjs +0 -127
  34. package/esm2022/lib/form/services/task.service.mjs +0 -77
  35. package/esm2022/lib/form/start-form/start-form.component.mjs +0 -141
  36. package/esm2022/lib/form/widgets/content-widget/attach-file-widget-dialog-component.interface.mjs +0 -18
  37. package/esm2022/lib/form/widgets/content-widget/attach-file-widget-dialog.component.mjs +0 -115
  38. package/esm2022/lib/form/widgets/content-widget/attach-file-widget-dialog.service.mjs +0 -100
  39. package/esm2022/lib/form/widgets/content-widget/attach-file-widget.component.mjs +0 -254
  40. package/esm2022/lib/form/widgets/content-widget/attach-folder-widget.component.mjs +0 -93
  41. package/esm2022/lib/form/widgets/content-widget/index.mjs +0 -18
  42. package/esm2022/lib/form/widgets/content-widget/public-api.mjs +0 -22
  43. package/esm2022/lib/form/widgets/document/content.widget.mjs +0 -125
  44. package/esm2022/lib/form/widgets/document/document.widget.mjs +0 -61
  45. package/esm2022/lib/form/widgets/dropdown/dropdown.widget.mjs +0 -182
  46. package/esm2022/lib/form/widgets/dynamic-table/dynamic-table.widget.mjs +0 -192
  47. package/esm2022/lib/form/widgets/dynamic-table/editors/amount/amount.editor.mjs +0 -47
  48. package/esm2022/lib/form/widgets/dynamic-table/editors/boolean/boolean.editor.mjs +0 -42
  49. package/esm2022/lib/form/widgets/dynamic-table/editors/date/date.editor.mjs +0 -84
  50. package/esm2022/lib/form/widgets/dynamic-table/editors/datetime/datetime.editor.mjs +0 -84
  51. package/esm2022/lib/form/widgets/dynamic-table/editors/dropdown/dropdown.editor.mjs +0 -95
  52. package/esm2022/lib/form/widgets/dynamic-table/editors/models/cell-validator.model.mjs +0 -18
  53. package/esm2022/lib/form/widgets/dynamic-table/editors/models/date-cell-validator-model.mjs +0 -47
  54. package/esm2022/lib/form/widgets/dynamic-table/editors/models/dynamic-row-validation-summary.model.mjs +0 -24
  55. package/esm2022/lib/form/widgets/dynamic-table/editors/models/dynamic-table-column-option.model.mjs +0 -18
  56. package/esm2022/lib/form/widgets/dynamic-table/editors/models/dynamic-table-column.model.mjs +0 -18
  57. package/esm2022/lib/form/widgets/dynamic-table/editors/models/dynamic-table-row.model.mjs +0 -18
  58. package/esm2022/lib/form/widgets/dynamic-table/editors/models/dynamic-table.widget.model.mjs +0 -159
  59. package/esm2022/lib/form/widgets/dynamic-table/editors/models/number-cell-validator.model.mjs +0 -45
  60. package/esm2022/lib/form/widgets/dynamic-table/editors/models/required-cell-validator.model.mjs +0 -40
  61. package/esm2022/lib/form/widgets/dynamic-table/editors/row-editor/row.editor.mjs +0 -89
  62. package/esm2022/lib/form/widgets/dynamic-table/editors/text/text.editor.mjs +0 -47
  63. package/esm2022/lib/form/widgets/dynamic-table/index.mjs +0 -18
  64. package/esm2022/lib/form/widgets/dynamic-table/public-api.mjs +0 -44
  65. package/esm2022/lib/form/widgets/file-viewer/file-viewer.widget.mjs +0 -46
  66. package/esm2022/lib/form/widgets/functional-group/functional-group.widget.mjs +0 -167
  67. package/esm2022/lib/form/widgets/index.mjs +0 -18
  68. package/esm2022/lib/form/widgets/people/people.widget.mjs +0 -169
  69. package/esm2022/lib/form/widgets/public-api.mjs +0 -54
  70. package/esm2022/lib/form/widgets/radio-buttons/radio-buttons.widget.mjs +0 -97
  71. package/esm2022/lib/form/widgets/typeahead/typeahead.widget.mjs +0 -152
  72. package/esm2022/lib/form/widgets/upload/upload.widget.mjs +0 -128
  73. package/esm2022/lib/people/components/people/people.component.mjs +0 -124
  74. package/esm2022/lib/people/components/people-list/people-list.component.mjs +0 -74
  75. package/esm2022/lib/people/components/people-search/people-search.component.mjs +0 -83
  76. package/esm2022/lib/people/components/people-search-field/people-search-field.component.mjs +0 -90
  77. package/esm2022/lib/people/components/people-selector/people-selector.component.mjs +0 -76
  78. package/esm2022/lib/people/helpers/get-display-user.mjs +0 -22
  79. package/esm2022/lib/people/index.mjs +0 -18
  80. package/esm2022/lib/people/interfaces/perform-search-callback.interface.mjs +0 -18
  81. package/esm2022/lib/people/public-api.mjs +0 -35
  82. package/esm2022/lib/process-comments/index.mjs +0 -21
  83. package/esm2022/lib/process-comments/process-comments.component.mjs +0 -45
  84. package/esm2022/lib/process-comments/services/comment-process.service.mjs +0 -77
  85. package/esm2022/lib/process-list/components/process-audit/process-audit.directive.mjs +0 -105
  86. package/esm2022/lib/process-list/components/process-filters/process-filters.component.mjs +0 -211
  87. package/esm2022/lib/process-list/components/process-instance-details/process-instance-details.component.mjs +0 -142
  88. package/esm2022/lib/process-list/components/process-instance-header/process-instance-header.component.mjs +0 -123
  89. package/esm2022/lib/process-list/components/process-instance-tasks/process-instance-tasks.component.mjs +0 -163
  90. package/esm2022/lib/process-list/components/process-list/process-list.component.mjs +0 -327
  91. package/esm2022/lib/process-list/components/start-process/start-process.component.mjs +0 -423
  92. package/esm2022/lib/process-list/index.mjs +0 -18
  93. package/esm2022/lib/process-list/public-api.mjs +0 -44
  94. package/esm2022/lib/process-list/services/process-filter.service.mjs +0 -182
  95. package/esm2022/lib/process-list/services/process.service.mjs +0 -259
  96. package/esm2022/lib/process.module.mjs +0 -132
  97. package/esm2022/lib/services/apps-process.service.mjs +0 -58
  98. package/esm2022/lib/services/people-process.service.mjs +0 -124
  99. package/esm2022/lib/services/task-comments.service.mjs +0 -65
  100. package/esm2022/lib/task-comments/index.mjs +0 -21
  101. package/esm2022/lib/task-comments/task-comments.component.mjs +0 -44
  102. package/esm2022/lib/task-list/components/attach-form/attach-form.component.mjs +0 -127
  103. package/esm2022/lib/task-list/components/checklist/checklist.component.mjs +0 -140
  104. package/esm2022/lib/task-list/components/start-task/start-task.component.mjs +0 -221
  105. package/esm2022/lib/task-list/components/task-details/task-details.component.mjs +0 -360
  106. package/esm2022/lib/task-list/components/task-filters/task-filters.component.mjs +0 -261
  107. package/esm2022/lib/task-list/components/task-form/claim-task.directive.mjs +0 -77
  108. package/esm2022/lib/task-list/components/task-form/task-form.component.mjs +0 -313
  109. package/esm2022/lib/task-list/components/task-form/unclaim-task.directive.mjs +0 -77
  110. package/esm2022/lib/task-list/components/task-header/task-header.component.mjs +0 -361
  111. package/esm2022/lib/task-list/components/task-list/task-list.component.mjs +0 -359
  112. package/esm2022/lib/task-list/components/task-standalone/task-standalone.component.mjs +0 -82
  113. package/esm2022/lib/task-list/index.mjs +0 -18
  114. package/esm2022/lib/task-list/models/form.model.mjs +0 -26
  115. package/esm2022/lib/task-list/models/task-details.event.mjs +0 -32
  116. package/esm2022/lib/task-list/models/task-preset.model.mjs +0 -41
  117. package/esm2022/lib/task-list/models/user-event.model.mjs +0 -18
  118. package/esm2022/lib/task-list/models/user-group.model.mjs +0 -18
  119. package/esm2022/lib/task-list/public-api.mjs +0 -60
  120. package/esm2022/lib/task-list/services/process-upload.service.mjs +0 -42
  121. package/esm2022/lib/task-list/services/task-filter.service.mjs +0 -249
  122. package/esm2022/lib/task-list/services/task-upload.service.mjs +0 -42
  123. package/esm2022/lib/task-list/services/tasklist.service.mjs +0 -251
  124. package/esm2022/lib/task-list/validators/task-description.validator.mjs +0 -26
  125. package/esm2022/public-api.mjs +0 -30
@@ -1,360 +0,0 @@
1
- /*!
2
- * @license
3
- * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- */
17
- import { ADF_COMMENTS_SERVICE, CardViewUpdateService, InfoDrawerComponent, InfoDrawerTabComponent } from '@alfresco/adf-core';
18
- import { Component, DestroyRef, EventEmitter, Input, Output, TemplateRef, ViewChild, ViewEncapsulation } from '@angular/core';
19
- import { MatDialog, MatDialogModule } from '@angular/material/dialog';
20
- import { Observable, of } from 'rxjs';
21
- import { TaskListService } from '../../services/tasklist.service';
22
- import { catchError, share } from 'rxjs/operators';
23
- import { TaskFormComponent } from '../task-form/task-form.component';
24
- import { PeopleProcessService } from '../../../services/people-process.service';
25
- import { TaskQueryRepresentation, TaskRepresentation } from '@alfresco/js-api';
26
- import { CommonModule } from '@angular/common';
27
- import { TranslatePipe } from '@ngx-translate/core';
28
- import { AttachFormComponent } from '../attach-form/attach-form.component';
29
- import { PeopleComponent, PeopleSearchComponent } from '../../../people';
30
- import { TaskHeaderComponent } from '../task-header/task-header.component';
31
- import { TaskCommentsComponent, TaskCommentsService } from '../../../task-comments';
32
- import { ChecklistComponent } from '../checklist/checklist.component';
33
- import { MatButtonModule } from '@angular/material/button';
34
- import { MatCardModule } from '@angular/material/card';
35
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
36
- import * as i0 from "@angular/core";
37
- import * as i1 from "../../services/tasklist.service";
38
- import * as i2 from "../../../services/people-process.service";
39
- import * as i3 from "@alfresco/adf-core";
40
- import * as i4 from "@angular/material/dialog";
41
- import * as i5 from "@angular/common";
42
- import * as i6 from "@angular/material/button";
43
- import * as i7 from "@angular/material/card";
44
- /** @deprecated no longer used anywhere, and can be safely removed */
45
- export class TaskDetailsComponent {
46
- constructor(taskListService, peopleProcessService, cardViewUpdateService, dialog, destroyRef) {
47
- this.taskListService = taskListService;
48
- this.peopleProcessService = peopleProcessService;
49
- this.cardViewUpdateService = cardViewUpdateService;
50
- this.dialog = dialog;
51
- this.destroyRef = destroyRef;
52
- /** Automatically renders the next task when the current one is completed. */
53
- this.showNextTask = true;
54
- /** Toggles task details Header component. */
55
- this.showHeader = true;
56
- /** Toggles collapsed/expanded state of the Header component. */
57
- this.showHeaderContent = true;
58
- /** Toggles `Involve People` feature for the Header component. */
59
- this.showInvolvePeople = true;
60
- /** Toggles `Comments` feature for the Header component. */
61
- this.showComments = true;
62
- /** Toggles `Checklist` feature for the Header component. */
63
- this.showChecklist = true;
64
- /** Toggles rendering of the form title. */
65
- this.showFormTitle = false;
66
- /** Toggles rendering of the `Complete` outcome button. */
67
- this.showFormCompleteButton = true;
68
- /** Toggles rendering of the `Save` outcome button. */
69
- this.showFormSaveButton = true;
70
- /**
71
- * Toggles read-only state of the form. All form widgets render as read-only
72
- * if enabled.
73
- */
74
- this.readOnlyForm = false;
75
- /** Toggles rendering of the `Refresh` button. */
76
- this.showFormRefreshButton = true;
77
- /** Field validators for use with the form. */
78
- this.fieldValidators = [];
79
- /** Emitted when the form is submitted with the `Save` or custom outcomes. */
80
- this.formSaved = new EventEmitter();
81
- /** Emitted when the form is submitted with the `Complete` outcome. */
82
- this.formCompleted = new EventEmitter();
83
- /** Emitted when the form field content is clicked. */
84
- this.formContentClicked = new EventEmitter();
85
- /** Emitted when the form is loaded or reloaded. */
86
- this.formLoaded = new EventEmitter();
87
- /** Emitted when a checklist task is created. */
88
- this.taskCreated = new EventEmitter();
89
- /** Emitted when a checklist task is deleted. */
90
- this.taskDeleted = new EventEmitter();
91
- /** Emitted when an error occurs. */
92
- this.error = new EventEmitter();
93
- /**
94
- * Emitted when any outcome is executed. Default behaviour can be prevented
95
- * via `event.preventDefault()`.
96
- */
97
- this.executeOutcome = new EventEmitter();
98
- /** Emitted when a task is assigned. */
99
- this.assignTask = new EventEmitter();
100
- /** Emitted when a task is claimed. */
101
- this.claimedTask = new EventEmitter();
102
- /** Emitted when a task is unclaimed. */
103
- this.unClaimedTask = new EventEmitter();
104
- this.taskFormName = null;
105
- this.taskPeople = [];
106
- this.showAssignee = false;
107
- this.showAttachForm = false;
108
- this.internalReadOnlyForm = false;
109
- }
110
- ngOnInit() {
111
- this.peopleSearch = new Observable((observer) => (this.peopleSearchObserver = observer)).pipe(share());
112
- if (this.taskId) {
113
- this.loadDetails(this.taskId);
114
- }
115
- this.cardViewUpdateService.itemUpdated$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(this.updateTaskDetails.bind(this));
116
- this.cardViewUpdateService.itemClicked$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(this.clickTaskDetails.bind(this));
117
- }
118
- ngOnChanges(changes) {
119
- const taskId = changes.taskId;
120
- this.showAssignee = false;
121
- if (taskId && !taskId.currentValue) {
122
- this.reset();
123
- }
124
- else if (taskId?.currentValue) {
125
- this.loadDetails(taskId.currentValue);
126
- }
127
- }
128
- isAssigned() {
129
- return !!this.taskDetails.assignee;
130
- }
131
- /**
132
- * Complete button clicked
133
- */
134
- onComplete() {
135
- this.onFormCompleted(null);
136
- }
137
- onShowAttachForm() {
138
- this.showAttachForm = true;
139
- }
140
- onCancelAttachForm() {
141
- this.showAttachForm = false;
142
- }
143
- onCompleteAttachForm() {
144
- this.taskFormName = null;
145
- this.showAttachForm = false;
146
- this.taskFormComponent.loadTask(this.taskId);
147
- this.loadDetails(this.taskId);
148
- }
149
- onFormContentClick(content) {
150
- this.formContentClicked.emit(content);
151
- }
152
- onFormSaved(form) {
153
- this.formSaved.emit(form);
154
- }
155
- onFormCompleted(form) {
156
- this.formCompleted.emit(form);
157
- if (this.showNextTask && (this.taskDetails.processInstanceId || this.taskDetails.processDefinitionId)) {
158
- this.loadNextTask(this.taskDetails.processInstanceId, this.taskDetails.processDefinitionId);
159
- }
160
- }
161
- onFormLoaded(form) {
162
- this.taskFormName = form?.name;
163
- this.formLoaded.emit(form);
164
- }
165
- onChecklistTaskCreated(task) {
166
- this.taskCreated.emit(task);
167
- }
168
- onChecklistTaskDeleted(taskId) {
169
- this.taskDeleted.emit(taskId);
170
- }
171
- onFormError(error) {
172
- this.errorDialogRef = this.dialog.open(this.errorDialog, { width: '500px' });
173
- this.error.emit(error);
174
- }
175
- onFormExecuteOutcome(event) {
176
- this.executeOutcome.emit(event);
177
- }
178
- closeErrorDialog() {
179
- this.dialog.closeAll();
180
- }
181
- onClaimAction(taskId) {
182
- this.claimedTask.emit(taskId);
183
- this.loadDetails(taskId);
184
- }
185
- onUnclaimAction(taskId) {
186
- this.unClaimedTask.emit(taskId);
187
- this.loadDetails(taskId);
188
- }
189
- searchUser(searchedWord) {
190
- this.peopleProcessService.getWorkflowUsers(null, searchedWord).subscribe((users) => {
191
- users = users.filter((user) => user.id !== this.taskDetails.assignee.id);
192
- this.peopleSearchObserver.next(users);
193
- });
194
- }
195
- onCloseSearch() {
196
- this.showAssignee = false;
197
- }
198
- assignTaskToUser(selectedUser) {
199
- this.taskListService.assignTask(this.taskDetails.id, selectedUser).subscribe(() => {
200
- this.assignTask.emit();
201
- });
202
- this.showAssignee = false;
203
- }
204
- getTaskHeaderViewClass() {
205
- if (this.showAssignee) {
206
- return 'assign-edit-view';
207
- }
208
- else {
209
- return 'default-view';
210
- }
211
- }
212
- isReadOnlyComment() {
213
- return this.taskDetails?.isCompleted() && this.taskPeople?.length === 0;
214
- }
215
- reset() {
216
- this.taskDetails = null;
217
- }
218
- updateTaskDetails(updateNotification) {
219
- this.taskListService
220
- .updateTask(this.taskId, updateNotification.changed)
221
- .pipe(catchError(() => {
222
- this.cardViewUpdateService.updateElement(updateNotification.target);
223
- return of(null);
224
- }))
225
- .subscribe(() => this.loadDetails(this.taskId));
226
- }
227
- clickTaskDetails(clickNotification) {
228
- if (clickNotification.target.key === 'assignee') {
229
- this.showAssignee = true;
230
- }
231
- if (clickNotification.target.key === 'formName') {
232
- this.showAttachForm = true;
233
- }
234
- }
235
- loadDetails(taskId) {
236
- this.taskPeople = [];
237
- if (taskId) {
238
- this.taskListService.getTaskDetails(taskId).subscribe((res) => {
239
- this.showAttachForm = false;
240
- this.taskDetails = res;
241
- if (this.taskDetails.name === 'null') {
242
- this.taskDetails.name = 'No name';
243
- }
244
- const endDate = res.endDate;
245
- if (endDate && !isNaN(endDate.getTime())) {
246
- this.internalReadOnlyForm = true;
247
- }
248
- else {
249
- this.internalReadOnlyForm = this.readOnlyForm;
250
- }
251
- if (this.taskDetails?.involvedPeople) {
252
- this.taskPeople.push(...this.taskDetails.involvedPeople);
253
- }
254
- });
255
- }
256
- }
257
- loadNextTask(processInstanceId, processDefinitionId) {
258
- const requestNode = new TaskQueryRepresentation({
259
- processInstanceId,
260
- processDefinitionId
261
- });
262
- this.taskListService.getTasks(requestNode).subscribe((response) => {
263
- if (response && response.length > 0) {
264
- this.taskDetails = new TaskRepresentation(response[0]);
265
- }
266
- else {
267
- this.reset();
268
- }
269
- }, (error) => {
270
- this.error.emit(error);
271
- });
272
- }
273
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TaskDetailsComponent, deps: [{ token: i1.TaskListService }, { token: i2.PeopleProcessService }, { token: i3.CardViewUpdateService }, { token: i4.MatDialog }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component }); }
274
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TaskDetailsComponent, isStandalone: true, selector: "adf-task-details", inputs: { taskId: "taskId", showNextTask: "showNextTask", showHeader: "showHeader", showHeaderContent: "showHeaderContent", showInvolvePeople: "showInvolvePeople", showComments: "showComments", showChecklist: "showChecklist", showFormTitle: "showFormTitle", showFormCompleteButton: "showFormCompleteButton", showFormSaveButton: "showFormSaveButton", readOnlyForm: "readOnlyForm", showFormRefreshButton: "showFormRefreshButton", fieldValidators: "fieldValidators" }, outputs: { formSaved: "formSaved", formCompleted: "formCompleted", formContentClicked: "formContentClicked", formLoaded: "formLoaded", taskCreated: "taskCreated", taskDeleted: "taskDeleted", error: "error", executeOutcome: "executeOutcome", assignTask: "assignTask", claimedTask: "claimedTask", unClaimedTask: "unClaimedTask" }, providers: [
275
- {
276
- provide: ADF_COMMENTS_SERVICE,
277
- useClass: TaskCommentsService
278
- }
279
- ], viewQueries: [{ propertyName: "errorDialog", first: true, predicate: ["errorDialog"], descendants: true }, { propertyName: "taskFormComponent", first: true, predicate: ["taskForm"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"!taskDetails\" data-automation-id=\"adf-tasks-details--empty\">\n <ng-template *ngIf=\"noTaskDetailsTemplateComponent\" ngFor [ngForOf]=\"[data]\"\n [ngForTemplate]=\"noTaskDetailsTemplateComponent\">\n {{ 'ADF_TASK_LIST.DETAILS.MESSAGES.NONE' | translate }}\n </ng-template>\n <div *ngIf=\"!noTaskDetailsTemplateComponent\">\n {{ 'ADF_TASK_LIST.DETAILS.MESSAGES.NONE' | translate }}\n </div>\n</div>\n<div *ngIf=\"taskDetails\" class=\"adf-task-details\">\n\n <div *ngIf=\"showHeader\" class=\"adf-task-details-header\">\n <h2 class=\"adf-activiti-task-details__header\">\n <span>{{taskDetails.name || 'No name'}}</span>\n </h2>\n </div>\n\n <div class=\"adf-task-details-core\">\n <div class=\"adf-task-details-core-form\">\n <div *ngIf=\"isAssigned()\">\n <adf-task-form #taskForm\n [taskId]=\"taskDetails.id\"\n [showFormTitle]=\"showFormTitle\"\n [showFormRefreshButton]=\"showFormRefreshButton\"\n [showCancelButton]=\"true\"\n [fieldValidators]=\"fieldValidators\"\n (formSaved)='onFormSaved($event)'\n (formCompleted)='onFormCompleted($event)'\n (formContentClicked)='onFormContentClick($event)'\n (formLoaded)='onFormLoaded($event)'\n (completed)=\"onComplete()\"\n (showAttachForm)=\"onShowAttachForm()\"\n (executeOutcome)='onFormExecuteOutcome($event)'\n (taskClaimed)=\"onClaimAction($event)\"\n (taskUnclaimed)=\"onUnclaimAction($event)\"\n (error)=\"onFormError($event)\" />\n <adf-attach-form *ngIf=\"showAttachForm\"\n [taskId]=\"taskDetails.id\"\n [formKey]=\"taskDetails.formKey\"\n (cancelAttachForm)=\"onCancelAttachForm()\"\n (success)=\"onCompleteAttachForm()\" />\n </div>\n <div *ngIf=\"!isAssigned()\" id=\"claim-message-id\">\n {{ 'ADF_TASK_LIST.DETAILS.MESSAGES.CLAIM' | translate }}\n </div>\n </div>\n <div class=\"adf-task-details-core-sidebar\">\n <adf-info-drawer *ngIf=\"showHeaderContent\" title=\"ADF_TASK_LIST.DETAILS.LABELS.INFO_DRAWER_TITLE\" id=\"adf-task-details-core-sidebar-drawer\" class=\"adf-task-details-core-sidebar-drawer\">\n <adf-info-drawer-tab label=\"ADF_TASK_LIST.DETAILS.LABELS.INFO_DRAWER_TAB_DETAILS_TITLE\">\n <div class=\"adf-assignment-container\" *ngIf=\"showAssignee\">\n <adf-people-search\n [headerTitle]=\"'ADF_TASK_LIST.DETAILS.LABELS.ADD_ASSIGNEE'\"\n [actionLabel]=\"'ADF_TASK_LIST.PEOPLE.ADD_ASSIGNEE'\"\n (searchPeople)=\"searchUser($event)\"\n (success)=\"assignTaskToUser($event)\"\n (closeSearch)=\"onCloseSearch()\"\n [results]=\"peopleSearch\" />\n </div>\n <adf-task-header\n [class]=\"getTaskHeaderViewClass()\"\n [taskDetails]=\"taskDetails\"\n [formName]=\"taskFormName\"\n (claim)=\"onClaimAction($event)\"\n (unclaim)=\"onUnclaimAction($event)\" />\n <adf-people *ngIf=\"showInvolvePeople\"\n [people]=\"taskPeople\"\n [readOnly]=\"internalReadOnlyForm\"\n [taskId]=\"taskDetails.id\" />\n </adf-info-drawer-tab>\n\n <adf-info-drawer-tab label=\"ADF_TASK_LIST.DETAILS.LABELS.INFO_DRAWER_TAB_ACTIVITY_TITLE\">\n <mat-card appearance=\"outlined\" *ngIf=\"showComments\">\n <mat-card-content>\n <adf-task-comments\n [readOnly]=\"isReadOnlyComment()\"\n [taskId]=\"taskDetails.id\"\n />\n </mat-card-content>\n </mat-card>\n </adf-info-drawer-tab>\n\n </adf-info-drawer>\n\n <div *ngIf=\"showHeaderContent\" class=\"adf-task-details-core-sidebar-checklist\">\n <div *ngIf=\"showChecklist\">\n <adf-checklist\n [readOnly]=\"internalReadOnlyForm\"\n [taskId]=\"taskDetails.id\"\n [assignee]=\"taskDetails.assignee?.id\"\n (checklistTaskCreated)=\"onChecklistTaskCreated($event)\"\n (checklistTaskDeleted)=\"onChecklistTaskDeleted($event)\" />\n </div>\n </div>\n </div>\n </div>\n\n <ng-template #errorDialog>\n <h3 matDialogTitle>{{'ADF_TASK_LIST.DETAILS.ERROR.TITLE'|translate}}</h3>\n <mat-dialog-content>\n <p>{{'ADF_TASK_LIST.DETAILS.ERROR.DESCRIPTION'|translate}}</p>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button mat-button type=\"button\" (click)=\"closeErrorDialog()\">{{'ADF_TASK_LIST.DETAILS.ERROR.CLOSE'|translate}}\n </button>\n </mat-dialog-actions>\n </ng-template>\n\n</div>\n", styles: ["adf-task-details{width:100%}adf-task-details .adf-activiti-task-details__header{align-self:flex-end;display:flex;font-size:var(--theme-headline-font-size);font-weight:300;line-height:normal;overflow:hidden;margin:8px 0 16px;cursor:pointer;-webkit-user-select:none;user-select:none}adf-task-details .adf-activiti-task-details__action-button{text-transform:uppercase}adf-task-details .adf-assignment-container{padding:10px 20px;width:auto}adf-task-details adf-task-header.adf-assign-edit-view adf-card-view .adf-property[data-automation-id=header-assignee]{display:none}adf-task-details .adf-task-details-header{display:flex;justify-content:space-between}adf-task-details .adf-task-details-header-toggle{position:relative;top:10px;margin-right:2px;height:23px;cursor:pointer;-webkit-user-select:none;user-select:none}adf-task-details .adf-task-details-toggle{position:relative}adf-task-details .adf-task-details-core{display:flex;flex-direction:column;justify-content:space-between}@media (max-width: 1279.9px){adf-task-details .adf-task-details-core-sidebar-drawer{margin-left:0}}adf-task-details .adf-task-details-core-sidebar-checklist{margin-top:30px;padding-left:20px;padding-right:20px}adf-task-details .adf-task-details-core-form{flex-grow:1;margin-bottom:8px}adf-task-details .adf-task-details-core-form .adf-form-debug-container{display:flex;flex-direction:column;padding:20px 0}adf-task-details .adf-task-details-core-form .adf-form-debug-container .mat-mdc-slide-toggle{margin-left:auto}adf-task-details .adf-task-details-core-form .adf-form-debug-container .mat-mdc-slide-toggle+div{background-color:#000;padding:20px;clear:both;margin-top:30px;color:#fff}adf-task-details .adf-task-details-core-form .mdc-tab__text-label{flex-grow:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: TaskFormComponent, selector: "adf-task-form", inputs: ["taskId", "showFormTitle", "showFormCompleteButton", "showFormSaveButton", "showCancelButton", "readOnlyForm", "showFormRefreshButton", "showFormValidationIcon", "fieldValidators"], outputs: ["formSaved", "formCompleted", "formContentClicked", "formLoaded", "showAttachForm", "executeOutcome", "completed", "formError", "error", "cancel", "taskClaimed", "taskUnclaimed"] }, { kind: "component", type: AttachFormComponent, selector: "adf-attach-form", inputs: ["taskId", "formKey"], outputs: ["cancelAttachForm", "success", "error"] }, { kind: "component", type: PeopleSearchComponent, selector: "adf-people-search", inputs: ["headerTitle", "actionLabel", "results"], outputs: ["searchPeople", "success", "closeSearch"] }, { kind: "component", type: TaskHeaderComponent, selector: "adf-task-header", inputs: ["formName", "taskDetails", "showClaimRelease", "readOnly", "resetChanges"], outputs: ["claim", "unclaim"] }, { kind: "component", type: PeopleComponent, selector: "adf-people", inputs: ["people", "taskId", "readOnly"], outputs: ["error"] }, { kind: "component", type: TaskCommentsComponent, selector: "adf-task-comments", inputs: ["taskId", "readOnly"] }, { kind: "component", type: ChecklistComponent, selector: "adf-checklist", inputs: ["taskId", "readOnly", "assignee"], outputs: ["checklistTaskCreated", "checklistTaskDeleted", "error"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i4.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i4.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i4.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: InfoDrawerTabComponent, selector: "adf-info-drawer-tab", inputs: ["label", "icon"] }, { kind: "component", type: InfoDrawerComponent, selector: "adf-info-drawer", inputs: ["title", "icon", "selectedIndex", "showHeader"], outputs: ["currentTab"] }, { kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i7.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i7.MatCardContent, selector: "mat-card-content" }], encapsulation: i0.ViewEncapsulation.None }); }
280
- }
281
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TaskDetailsComponent, decorators: [{
282
- type: Component,
283
- args: [{ selector: 'adf-task-details', standalone: true, imports: [
284
- CommonModule,
285
- TranslatePipe,
286
- TaskFormComponent,
287
- AttachFormComponent,
288
- PeopleSearchComponent,
289
- TaskHeaderComponent,
290
- PeopleComponent,
291
- TaskCommentsComponent,
292
- ChecklistComponent,
293
- MatDialogModule,
294
- MatButtonModule,
295
- InfoDrawerTabComponent,
296
- InfoDrawerComponent,
297
- MatCardModule
298
- ], providers: [
299
- {
300
- provide: ADF_COMMENTS_SERVICE,
301
- useClass: TaskCommentsService
302
- }
303
- ], encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"!taskDetails\" data-automation-id=\"adf-tasks-details--empty\">\n <ng-template *ngIf=\"noTaskDetailsTemplateComponent\" ngFor [ngForOf]=\"[data]\"\n [ngForTemplate]=\"noTaskDetailsTemplateComponent\">\n {{ 'ADF_TASK_LIST.DETAILS.MESSAGES.NONE' | translate }}\n </ng-template>\n <div *ngIf=\"!noTaskDetailsTemplateComponent\">\n {{ 'ADF_TASK_LIST.DETAILS.MESSAGES.NONE' | translate }}\n </div>\n</div>\n<div *ngIf=\"taskDetails\" class=\"adf-task-details\">\n\n <div *ngIf=\"showHeader\" class=\"adf-task-details-header\">\n <h2 class=\"adf-activiti-task-details__header\">\n <span>{{taskDetails.name || 'No name'}}</span>\n </h2>\n </div>\n\n <div class=\"adf-task-details-core\">\n <div class=\"adf-task-details-core-form\">\n <div *ngIf=\"isAssigned()\">\n <adf-task-form #taskForm\n [taskId]=\"taskDetails.id\"\n [showFormTitle]=\"showFormTitle\"\n [showFormRefreshButton]=\"showFormRefreshButton\"\n [showCancelButton]=\"true\"\n [fieldValidators]=\"fieldValidators\"\n (formSaved)='onFormSaved($event)'\n (formCompleted)='onFormCompleted($event)'\n (formContentClicked)='onFormContentClick($event)'\n (formLoaded)='onFormLoaded($event)'\n (completed)=\"onComplete()\"\n (showAttachForm)=\"onShowAttachForm()\"\n (executeOutcome)='onFormExecuteOutcome($event)'\n (taskClaimed)=\"onClaimAction($event)\"\n (taskUnclaimed)=\"onUnclaimAction($event)\"\n (error)=\"onFormError($event)\" />\n <adf-attach-form *ngIf=\"showAttachForm\"\n [taskId]=\"taskDetails.id\"\n [formKey]=\"taskDetails.formKey\"\n (cancelAttachForm)=\"onCancelAttachForm()\"\n (success)=\"onCompleteAttachForm()\" />\n </div>\n <div *ngIf=\"!isAssigned()\" id=\"claim-message-id\">\n {{ 'ADF_TASK_LIST.DETAILS.MESSAGES.CLAIM' | translate }}\n </div>\n </div>\n <div class=\"adf-task-details-core-sidebar\">\n <adf-info-drawer *ngIf=\"showHeaderContent\" title=\"ADF_TASK_LIST.DETAILS.LABELS.INFO_DRAWER_TITLE\" id=\"adf-task-details-core-sidebar-drawer\" class=\"adf-task-details-core-sidebar-drawer\">\n <adf-info-drawer-tab label=\"ADF_TASK_LIST.DETAILS.LABELS.INFO_DRAWER_TAB_DETAILS_TITLE\">\n <div class=\"adf-assignment-container\" *ngIf=\"showAssignee\">\n <adf-people-search\n [headerTitle]=\"'ADF_TASK_LIST.DETAILS.LABELS.ADD_ASSIGNEE'\"\n [actionLabel]=\"'ADF_TASK_LIST.PEOPLE.ADD_ASSIGNEE'\"\n (searchPeople)=\"searchUser($event)\"\n (success)=\"assignTaskToUser($event)\"\n (closeSearch)=\"onCloseSearch()\"\n [results]=\"peopleSearch\" />\n </div>\n <adf-task-header\n [class]=\"getTaskHeaderViewClass()\"\n [taskDetails]=\"taskDetails\"\n [formName]=\"taskFormName\"\n (claim)=\"onClaimAction($event)\"\n (unclaim)=\"onUnclaimAction($event)\" />\n <adf-people *ngIf=\"showInvolvePeople\"\n [people]=\"taskPeople\"\n [readOnly]=\"internalReadOnlyForm\"\n [taskId]=\"taskDetails.id\" />\n </adf-info-drawer-tab>\n\n <adf-info-drawer-tab label=\"ADF_TASK_LIST.DETAILS.LABELS.INFO_DRAWER_TAB_ACTIVITY_TITLE\">\n <mat-card appearance=\"outlined\" *ngIf=\"showComments\">\n <mat-card-content>\n <adf-task-comments\n [readOnly]=\"isReadOnlyComment()\"\n [taskId]=\"taskDetails.id\"\n />\n </mat-card-content>\n </mat-card>\n </adf-info-drawer-tab>\n\n </adf-info-drawer>\n\n <div *ngIf=\"showHeaderContent\" class=\"adf-task-details-core-sidebar-checklist\">\n <div *ngIf=\"showChecklist\">\n <adf-checklist\n [readOnly]=\"internalReadOnlyForm\"\n [taskId]=\"taskDetails.id\"\n [assignee]=\"taskDetails.assignee?.id\"\n (checklistTaskCreated)=\"onChecklistTaskCreated($event)\"\n (checklistTaskDeleted)=\"onChecklistTaskDeleted($event)\" />\n </div>\n </div>\n </div>\n </div>\n\n <ng-template #errorDialog>\n <h3 matDialogTitle>{{'ADF_TASK_LIST.DETAILS.ERROR.TITLE'|translate}}</h3>\n <mat-dialog-content>\n <p>{{'ADF_TASK_LIST.DETAILS.ERROR.DESCRIPTION'|translate}}</p>\n </mat-dialog-content>\n <mat-dialog-actions>\n <button mat-button type=\"button\" (click)=\"closeErrorDialog()\">{{'ADF_TASK_LIST.DETAILS.ERROR.CLOSE'|translate}}\n </button>\n </mat-dialog-actions>\n </ng-template>\n\n</div>\n", styles: ["adf-task-details{width:100%}adf-task-details .adf-activiti-task-details__header{align-self:flex-end;display:flex;font-size:var(--theme-headline-font-size);font-weight:300;line-height:normal;overflow:hidden;margin:8px 0 16px;cursor:pointer;-webkit-user-select:none;user-select:none}adf-task-details .adf-activiti-task-details__action-button{text-transform:uppercase}adf-task-details .adf-assignment-container{padding:10px 20px;width:auto}adf-task-details adf-task-header.adf-assign-edit-view adf-card-view .adf-property[data-automation-id=header-assignee]{display:none}adf-task-details .adf-task-details-header{display:flex;justify-content:space-between}adf-task-details .adf-task-details-header-toggle{position:relative;top:10px;margin-right:2px;height:23px;cursor:pointer;-webkit-user-select:none;user-select:none}adf-task-details .adf-task-details-toggle{position:relative}adf-task-details .adf-task-details-core{display:flex;flex-direction:column;justify-content:space-between}@media (max-width: 1279.9px){adf-task-details .adf-task-details-core-sidebar-drawer{margin-left:0}}adf-task-details .adf-task-details-core-sidebar-checklist{margin-top:30px;padding-left:20px;padding-right:20px}adf-task-details .adf-task-details-core-form{flex-grow:1;margin-bottom:8px}adf-task-details .adf-task-details-core-form .adf-form-debug-container{display:flex;flex-direction:column;padding:20px 0}adf-task-details .adf-task-details-core-form .adf-form-debug-container .mat-mdc-slide-toggle{margin-left:auto}adf-task-details .adf-task-details-core-form .adf-form-debug-container .mat-mdc-slide-toggle+div{background-color:#000;padding:20px;clear:both;margin-top:30px;color:#fff}adf-task-details .adf-task-details-core-form .mdc-tab__text-label{flex-grow:1}\n"] }]
304
- }], ctorParameters: () => [{ type: i1.TaskListService }, { type: i2.PeopleProcessService }, { type: i3.CardViewUpdateService }, { type: i4.MatDialog }, { type: i0.DestroyRef }], propDecorators: { errorDialog: [{
305
- type: ViewChild,
306
- args: ['errorDialog']
307
- }], taskFormComponent: [{
308
- type: ViewChild,
309
- args: ['taskForm']
310
- }], taskId: [{
311
- type: Input,
312
- args: [{ required: true }]
313
- }], showNextTask: [{
314
- type: Input
315
- }], showHeader: [{
316
- type: Input
317
- }], showHeaderContent: [{
318
- type: Input
319
- }], showInvolvePeople: [{
320
- type: Input
321
- }], showComments: [{
322
- type: Input
323
- }], showChecklist: [{
324
- type: Input
325
- }], showFormTitle: [{
326
- type: Input
327
- }], showFormCompleteButton: [{
328
- type: Input
329
- }], showFormSaveButton: [{
330
- type: Input
331
- }], readOnlyForm: [{
332
- type: Input
333
- }], showFormRefreshButton: [{
334
- type: Input
335
- }], fieldValidators: [{
336
- type: Input
337
- }], formSaved: [{
338
- type: Output
339
- }], formCompleted: [{
340
- type: Output
341
- }], formContentClicked: [{
342
- type: Output
343
- }], formLoaded: [{
344
- type: Output
345
- }], taskCreated: [{
346
- type: Output
347
- }], taskDeleted: [{
348
- type: Output
349
- }], error: [{
350
- type: Output
351
- }], executeOutcome: [{
352
- type: Output
353
- }], assignTask: [{
354
- type: Output
355
- }], claimedTask: [{
356
- type: Output
357
- }], unClaimedTask: [{
358
- type: Output
359
- }] } });
360
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kZXRhaWxzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9wcm9jZXNzLXNlcnZpY2VzL3NyYy9saWIvdGFzay1saXN0L2NvbXBvbmVudHMvdGFzay1kZXRhaWxzL3Rhc2stZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvcHJvY2Vzcy1zZXJ2aWNlcy9zcmMvbGliL3Rhc2stbGlzdC9jb21wb25lbnRzL3Rhc2stZGV0YWlscy90YXNrLWRldGFpbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUNILG9CQUFvQixFQUNwQixxQkFBcUIsRUFNckIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUV6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFnQixNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxVQUFVLEVBQVksRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBMkIsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FB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QUFJLEVBQUU7Z0JBS3pCLFlBQVk7c0JBRFgsS0FBSztnQkFLTixVQUFVO3NCQURULEtBQUs7Z0JBS04saUJBQWlCO3NCQURoQixLQUFLO2dCQUtOLGlCQUFpQjtzQkFEaEIsS0FBSztnQkFLTixZQUFZO3NCQURYLEtBQUs7Z0JBS04sYUFBYTtzQkFEWixLQUFLO2dCQUtOLGFBQWE7c0JBRFosS0FBSztnQkFLTixzQkFBc0I7c0JBRHJCLEtBQUs7Z0JBS04sa0JBQWtCO3NCQURqQixLQUFLO2dCQVFOLFlBQVk7c0JBRFgsS0FBSztnQkFLTixxQkFBcUI7c0JBRHBCLEtBQUs7Z0JBS04sZUFBZTtzQkFEZCxLQUFLO2dCQUtOLFNBQVM7c0JBRFIsTUFBTTtnQkFLUCxhQUFhO3NCQURaLE1BQU07Z0JBS1Asa0JBQWtCO3NCQURqQixNQUFNO2dCQUtQLFVBQVU7c0JBRFQsTUFBTTtnQkFLUCxXQUFXO3NCQURWLE1BQU07Z0JBS1AsV0FBVztzQkFEVixNQUFNO2dCQUtQLEtBQUs7c0JBREosTUFBTTtnQkFRUCxjQUFjO3NCQURiLE1BQU07Z0JBS1AsVUFBVTtzQkFEVCxNQUFNO2dCQUtQLFdBQVc7c0JBRFYsTUFBTTtnQkFLUCxhQUFhO3NCQURaLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gICAgQURGX0NPTU1FTlRTX1NFUlZJQ0UsXG4gICAgQ2FyZFZpZXdVcGRhdGVTZXJ2aWNlLFxuICAgIENsaWNrTm90aWZpY2F0aW9uLFxuICAgIENvbnRlbnRMaW5rTW9kZWwsXG4gICAgRm9ybUZpZWxkVmFsaWRhdG9yLFxuICAgIEZvcm1Nb2RlbCxcbiAgICBGb3JtT3V0Y29tZUV2ZW50LFxuICAgIEluZm9EcmF3ZXJDb21wb25lbnQsXG4gICAgSW5mb0RyYXdlclRhYkNvbXBvbmVudCxcbiAgICBVcGRhdGVOb3RpZmljYXRpb25cbn0gZnJvbSAnQGFsZnJlc2NvL2FkZi1jb3JlJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dNb2R1bGUsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBPYnNlcnZlciwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRhc2tMaXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Rhc2tsaXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgc2hhcmUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUYXNrRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL3Rhc2stZm9ybS90YXNrLWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IFBlb3BsZVByb2Nlc3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGVvcGxlLXByb2Nlc3Muc2VydmljZSc7XG5pbXBvcnQgeyBMaWdodFVzZXJSZXByZXNlbnRhdGlvbiwgVGFza1F1ZXJ5UmVwcmVzZW50YXRpb24sIFRhc2tSZXByZXNlbnRhdGlvbiB9IGZyb20gJ0BhbGZyZXNjby9qcy1hcGknO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFRyYW5zbGF0ZVBpcGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEF0dGFjaEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9hdHRhY2gtZm9ybS9hdHRhY2gtZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGVvcGxlQ29tcG9uZW50LCBQZW9wbGVTZWFyY2hDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9wZW9wbGUnO1xuaW1wb3J0IHsgVGFza0hlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL3Rhc2staGVhZGVyL3Rhc2staGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYXNrQ29tbWVudHNDb21wb25lbnQsIFRhc2tDb21tZW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi90YXNrLWNvbW1lbnRzJztcbmltcG9ydCB7IENoZWNrbGlzdENvbXBvbmVudCB9IGZyb20gJy4uL2NoZWNrbGlzdC9jaGVja2xpc3QuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRDYXJkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2FyZCc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbi8qKiBAZGVwcmVjYXRlZCBubyBsb25nZXIgdXNlZCBhbnl3aGVyZSwgYW5kIGNhbiBiZSBzYWZlbHkgcmVtb3ZlZCAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhZGYtdGFzay1kZXRhaWxzJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBUcmFuc2xhdGVQaXBlLFxuICAgICAgICBUYXNrRm9ybUNvbXBvbmVudCxcbiAgICAgICAgQXR0YWNoRm9ybUNvbXBvbmVudCxcbiAgICAgICAgUGVvcGxlU2VhcmNoQ29tcG9uZW50LFxuICAgICAgICBUYXNrSGVhZGVyQ29tcG9uZW50LFxuICAgICAgICBQZW9wbGVDb21wb25lbnQsXG4gICAgICAgIFRhc2tDb21tZW50c0NvbXBvbmVudCxcbiAgICAgICAgQ2hlY2tsaXN0Q29tcG9uZW50LFxuICAgICAgICBNYXREaWFsb2dNb2R1bGUsXG4gICAgICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgICAgICAgSW5mb0RyYXdlclRhYkNvbXBvbmVudCxcbiAgICAgICAgSW5mb0RyYXdlckNvbXBvbmVudCxcbiAgICAgICAgTWF0Q2FyZE1vZHVsZVxuICAgIF0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IEFERl9DT01NRU5UU19TRVJWSUNFLFxuICAgICAgICAgICAgdXNlQ2xhc3M6IFRhc2tDb21tZW50c1NlcnZpY2VcbiAgICAgICAgfVxuICAgIF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3Rhc2stZGV0YWlscy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdGFzay1kZXRhaWxzLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBUYXNrRGV0YWlsc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgICBAVmlld0NoaWxkKCdlcnJvckRpYWxvZycpXG4gICAgZXJyb3JEaWFsb2c6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICBAVmlld0NoaWxkKCd0YXNrRm9ybScpXG4gICAgdGFza0Zvcm1Db21wb25lbnQ6IFRhc2tGb3JtQ29tcG9uZW50O1xuXG4gICAgLyoqICgqKnJlcXVpcmVkKiopIFRoZSBpZCBvZiB0aGUgdGFzayB3aG9zZSBkZXRhaWxzIHdlIGFyZSBhc2tpbmcgZm9yLiAqL1xuICAgIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gICAgdGFza0lkOiBzdHJpbmc7XG5cbiAgICAvKiogQXV0b21hdGljYWxseSByZW5kZXJzIHRoZSBuZXh0IHRhc2sgd2hlbiB0aGUgY3VycmVudCBvbmUgaXMgY29tcGxldGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd05leHRUYXNrOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBUb2dnbGVzIHRhc2sgZGV0YWlscyBIZWFkZXIgY29tcG9uZW50LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd0hlYWRlcjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogVG9nZ2xlcyBjb2xsYXBzZWQvZXhwYW5kZWQgc3RhdGUgb2YgdGhlIEhlYWRlciBjb21wb25lbnQuICovXG4gICAgQElucHV0KClcbiAgICBzaG93SGVhZGVyQ29udGVudDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogVG9nZ2xlcyBgSW52b2x2ZSBQZW9wbGVgIGZlYXR1cmUgZm9yIHRoZSBIZWFkZXIgY29tcG9uZW50LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd0ludm9sdmVQZW9wbGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIFRvZ2dsZXMgYENvbW1lbnRzYCBmZWF0dXJlIGZvciB0aGUgSGVhZGVyIGNvbXBvbmVudC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dDb21tZW50czogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogVG9nZ2xlcyBgQ2hlY2tsaXN0YCBmZWF0dXJlIGZvciB0aGUgSGVhZGVyIGNvbXBvbmVudC4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dDaGVja2xpc3Q6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIFRvZ2dsZXMgcmVuZGVyaW5nIG9mIHRoZSBmb3JtIHRpdGxlLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd0Zvcm1UaXRsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFRvZ2dsZXMgcmVuZGVyaW5nIG9mIHRoZSBgQ29tcGxldGVgIG91dGNvbWUgYnV0dG9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd0Zvcm1Db21wbGV0ZUJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogVG9nZ2xlcyByZW5kZXJpbmcgb2YgdGhlIGBTYXZlYCBvdXRjb21lIGJ1dHRvbi4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dGb3JtU2F2ZUJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIHJlYWQtb25seSBzdGF0ZSBvZiB0aGUgZm9ybS4gQWxsIGZvcm0gd2lkZ2V0cyByZW5kZXIgYXMgcmVhZC1vbmx5XG4gICAgICogaWYgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHJlYWRPbmx5Rm9ybTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFRvZ2dsZXMgcmVuZGVyaW5nIG9mIHRoZSBgUmVmcmVzaGAgYnV0dG9uLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd0Zvcm1SZWZyZXNoQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBGaWVsZCB2YWxpZGF0b3JzIGZvciB1c2Ugd2l0aCB0aGUgZm9ybS4gKi9cbiAgICBASW5wdXQoKVxuICAgIGZpZWxkVmFsaWRhdG9yczogRm9ybUZpZWxkVmFsaWRhdG9yW10gPSBbXTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkIHdpdGggdGhlIGBTYXZlYCBvciBjdXN0b20gb3V0Y29tZXMuICovXG4gICAgQE91dHB1dCgpXG4gICAgZm9ybVNhdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtTW9kZWw+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZCB3aXRoIHRoZSBgQ29tcGxldGVgIG91dGNvbWUuICovXG4gICAgQE91dHB1dCgpXG4gICAgZm9ybUNvbXBsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9ybU1vZGVsPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgZm9ybSBmaWVsZCBjb250ZW50IGlzIGNsaWNrZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgZm9ybUNvbnRlbnRDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxDb250ZW50TGlua01vZGVsPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgZm9ybSBpcyBsb2FkZWQgb3IgcmVsb2FkZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgZm9ybUxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9ybU1vZGVsPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhIGNoZWNrbGlzdCB0YXNrIGlzIGNyZWF0ZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgdGFza0NyZWF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFRhc2tSZXByZXNlbnRhdGlvbj4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gYSBjaGVja2xpc3QgdGFzayBpcyBkZWxldGVkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHRhc2tEZWxldGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGFuIGVycm9yIG9jY3Vycy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBlcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHRlZCB3aGVuIGFueSBvdXRjb21lIGlzIGV4ZWN1dGVkLiBEZWZhdWx0IGJlaGF2aW91ciBjYW4gYmUgcHJldmVudGVkXG4gICAgICogdmlhIGBldmVudC5wcmV2ZW50RGVmYXVsdCgpYC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBleGVjdXRlT3V0Y29tZSA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9ybU91dGNvbWVFdmVudD4oKTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gYSB0YXNrIGlzIGFzc2lnbmVkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGFzc2lnblRhc2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGEgdGFzayBpcyBjbGFpbWVkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIGNsYWltZWRUYXNrID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGEgdGFzayBpcyB1bmNsYWltZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgdW5DbGFpbWVkVGFzayA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gICAgdGFza0RldGFpbHM6IFRhc2tSZXByZXNlbnRhdGlvbjtcbiAgICB0YXNrRm9ybU5hbWU6IHN0cmluZyA9IG51bGw7XG4gICAgdGFza1Blb3BsZTogTGlnaHRVc2VyUmVwcmVzZW50YXRpb25bXSA9IFtdO1xuICAgIG5vVGFza0RldGFpbHNUZW1wbGF0ZUNvbXBvbmVudDogVGVtcGxhdGVSZWY8YW55PjtcbiAgICBzaG93QXNzaWduZWUgPSBmYWxzZTtcbiAgICBzaG93QXR0YWNoRm9ybSA9IGZhbHNlO1xuICAgIGludGVybmFsUmVhZE9ubHlGb3JtID0gZmFsc2U7XG4gICAgZXJyb3JEaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxUZW1wbGF0ZVJlZjxhbnk+PjtcbiAgICBwZW9wbGVTZWFyY2g6IE9ic2VydmFibGU8TGlnaHRVc2VyUmVwcmVzZW50YXRpb25bXT47XG4gICAgZGF0YTogYW55O1xuXG4gICAgcHJpdmF0ZSBwZW9wbGVTZWFyY2hPYnNlcnZlcjogT2JzZXJ2ZXI8TGlnaHRVc2VyUmVwcmVzZW50YXRpb25bXT47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0YXNrTGlzdFNlcnZpY2U6IFRhc2tMaXN0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwZW9wbGVQcm9jZXNzU2VydmljZTogUGVvcGxlUHJvY2Vzc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2FyZFZpZXdVcGRhdGVTZXJ2aWNlOiBDYXJkVmlld1VwZGF0ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZjogRGVzdHJveVJlZlxuICAgICkge31cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnBlb3BsZVNlYXJjaCA9IG5ldyBPYnNlcnZhYmxlPExpZ2h0VXNlclJlcHJlc2VudGF0aW9uW10+KChvYnNlcnZlcikgPT4gKHRoaXMucGVvcGxlU2VhcmNoT2JzZXJ2ZXIgPSBvYnNlcnZlcikpLnBpcGUoc2hhcmUoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMudGFza0lkKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWREZXRhaWxzKHRoaXMudGFza0lkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FyZFZpZXdVcGRhdGVTZXJ2aWNlLml0ZW1VcGRhdGVkJC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUodGhpcy51cGRhdGVUYXNrRGV0YWlscy5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLmNhcmRWaWV3VXBkYXRlU2VydmljZS5pdGVtQ2xpY2tlZCQucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKHRoaXMuY2xpY2tUYXNrRGV0YWlscy5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRhc2tJZCA9IGNoYW5nZXMudGFza0lkO1xuICAgICAgICB0aGlzLnNob3dBc3NpZ25lZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0YXNrSWQgJiYgIXRhc2tJZC5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXNrSWQ/LmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkRGV0YWlscyh0YXNrSWQuY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzQXNzaWduZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMudGFza0RldGFpbHMuYXNzaWduZWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGxldGUgYnV0dG9uIGNsaWNrZWRcbiAgICAgKi9cbiAgICBvbkNvbXBsZXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uRm9ybUNvbXBsZXRlZChudWxsKTtcbiAgICB9XG5cbiAgICBvblNob3dBdHRhY2hGb3JtKCkge1xuICAgICAgICB0aGlzLnNob3dBdHRhY2hGb3JtID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBvbkNhbmNlbEF0dGFjaEZvcm0oKSB7XG4gICAgICAgIHRoaXMuc2hvd0F0dGFjaEZvcm0gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvbkNvbXBsZXRlQXR0YWNoRm9ybSgpIHtcbiAgICAgICAgdGhpcy50YXNrRm9ybU5hbWUgPSBudWxsO1xuICAgICAgICB0aGlzLnNob3dBdHRhY2hGb3JtID0gZmFsc2U7XG4gICAgICAgIHRoaXMudGFza0Zvcm1Db21wb25lbnQubG9hZFRhc2sodGhpcy50YXNrSWQpO1xuICAgICAgICB0aGlzLmxvYWREZXRhaWxzKHRoaXMudGFza0lkKTtcbiAgICB9XG5cbiAgICBvbkZvcm1Db250ZW50Q2xpY2soY29udGVudDogQ29udGVudExpbmtNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm1Db250ZW50Q2xpY2tlZC5lbWl0KGNvbnRlbnQpO1xuICAgIH1cblxuICAgIG9uRm9ybVNhdmVkKGZvcm06IEZvcm1Nb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm1TYXZlZC5lbWl0KGZvcm0pO1xuICAgIH1cblxuICAgIG9uRm9ybUNvbXBsZXRlZChmb3JtOiBGb3JtTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtQ29tcGxldGVkLmVtaXQoZm9ybSk7XG4gICAgICAgIGlmICh0aGlzLnNob3dOZXh0VGFzayAmJiAodGhpcy50YXNrRGV0YWlscy5wcm9jZXNzSW5zdGFuY2VJZCB8fCB0aGlzLnRhc2tEZXRhaWxzLnByb2Nlc3NEZWZpbml0aW9uSWQpKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWROZXh0VGFzayh0aGlzLnRhc2tEZXRhaWxzLnByb2Nlc3NJbnN0YW5jZUlkLCB0aGlzLnRhc2tEZXRhaWxzLnByb2Nlc3NEZWZpbml0aW9uSWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Gb3JtTG9hZGVkKGZvcm06IEZvcm1Nb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRhc2tGb3JtTmFtZSA9IGZvcm0/Lm5hbWU7XG4gICAgICAgIHRoaXMuZm9ybUxvYWRlZC5lbWl0KGZvcm0pO1xuICAgIH1cblxuICAgIG9uQ2hlY2tsaXN0VGFza0NyZWF0ZWQodGFzazogVGFza1JlcHJlc2VudGF0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGFza0NyZWF0ZWQuZW1pdCh0YXNrKTtcbiAgICB9XG5cbiAgICBvbkNoZWNrbGlzdFRhc2tEZWxldGVkKHRhc2tJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGFza0RlbGV0ZWQuZW1pdCh0YXNrSWQpO1xuICAgIH1cblxuICAgIG9uRm9ybUVycm9yKGVycm9yOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lcnJvckRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4odGhpcy5lcnJvckRpYWxvZywgeyB3aWR0aDogJzUwMHB4JyB9KTtcbiAgICAgICAgdGhpcy5lcnJvci5lbWl0KGVycm9yKTtcbiAgICB9XG5cbiAgICBvbkZvcm1FeGVjdXRlT3V0Y29tZShldmVudDogRm9ybU91dGNvbWVFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmV4ZWN1dGVPdXRjb21lLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIGNsb3NlRXJyb3JEaWFsb2coKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nLmNsb3NlQWxsKCk7XG4gICAgfVxuXG4gICAgb25DbGFpbUFjdGlvbih0YXNrSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsYWltZWRUYXNrLmVtaXQodGFza0lkKTtcbiAgICAgICAgdGhpcy5sb2FkRGV0YWlscyh0YXNrSWQpO1xuICAgIH1cblxuICAgIG9uVW5jbGFpbUFjdGlvbih0YXNrSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnVuQ2xhaW1lZFRhc2suZW1pdCh0YXNrSWQpO1xuICAgICAgICB0aGlzLmxvYWREZXRhaWxzKHRhc2tJZCk7XG4gICAgfVxuXG4gICAgc2VhcmNoVXNlcihzZWFyY2hlZFdvcmQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLnBlb3BsZVByb2Nlc3NTZXJ2aWNlLmdldFdvcmtmbG93VXNlcnMobnVsbCwgc2VhcmNoZWRXb3JkKS5zdWJzY3JpYmUoKHVzZXJzKSA9PiB7XG4gICAgICAgICAgICB1c2VycyA9IHVzZXJzLmZpbHRlcigodXNlcikgPT4gdXNlci5pZCAhPT0gdGhpcy50YXNrRGV0YWlscy5hc3NpZ25lZS5pZCk7XG4gICAgICAgICAgICB0aGlzLnBlb3BsZVNlYXJjaE9ic2VydmVyLm5leHQodXNlcnMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkNsb3NlU2VhcmNoKCkge1xuICAgICAgICB0aGlzLnNob3dBc3NpZ25lZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGFzc2lnblRhc2tUb1VzZXIoc2VsZWN0ZWRVc2VyOiBMaWdodFVzZXJSZXByZXNlbnRhdGlvbikge1xuICAgICAgICB0aGlzLnRhc2tMaXN0U2VydmljZS5hc3NpZ25UYXNrKHRoaXMudGFza0RldGFpbHMuaWQsIHNlbGVjdGVkVXNlcikuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXNzaWduVGFzay5lbWl0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNob3dBc3NpZ25lZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGdldFRhc2tIZWFkZXJWaWV3Q2xhc3MoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd0Fzc2lnbmVlKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2Fzc2lnbi1lZGl0LXZpZXcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICdkZWZhdWx0LXZpZXcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNSZWFkT25seUNvbW1lbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhc2tEZXRhaWxzPy5pc0NvbXBsZXRlZCgpICYmIHRoaXMudGFza1Blb3BsZT8ubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXQoKSB7XG4gICAgICAgIHRoaXMudGFza0RldGFpbHMgPSBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVGFza0RldGFpbHModXBkYXRlTm90aWZpY2F0aW9uOiBVcGRhdGVOb3RpZmljYXRpb24pIHtcbiAgICAgICAgdGhpcy50YXNrTGlzdFNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVUYXNrKHRoaXMudGFza0lkLCB1cGRhdGVOb3RpZmljYXRpb24uY2hhbmdlZClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcmRWaWV3VXBkYXRlU2VydmljZS51cGRhdGVFbGVtZW50KHVwZGF0ZU5vdGlmaWNhdGlvbi50YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5sb2FkRGV0YWlscyh0aGlzLnRhc2tJZCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xpY2tUYXNrRGV0YWlscyhjbGlja05vdGlmaWNhdGlvbjogQ2xpY2tOb3RpZmljYXRpb24pIHtcbiAgICAgICAgaWYgKGNsaWNrTm90aWZpY2F0aW9uLnRhcmdldC5rZXkgPT09ICdhc3NpZ25lZScpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0Fzc2lnbmVlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xpY2tOb3RpZmljYXRpb24udGFyZ2V0LmtleSA9PT0gJ2Zvcm1OYW1lJykge1xuICAgICAgICAgICAgdGhpcy5zaG93QXR0YWNoRm9ybSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWREZXRhaWxzKHRhc2tJZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMudGFza1Blb3BsZSA9IFtdO1xuXG4gICAgICAgIGlmICh0YXNrSWQpIHtcbiAgICAgICAgICAgIHRoaXMudGFza0xpc3RTZXJ2aWNlLmdldFRhc2tEZXRhaWxzKHRhc2tJZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dBdHRhY2hGb3JtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy50YXNrRGV0YWlscyA9IHJlcztcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhc2tEZXRhaWxzLm5hbWUgPT09ICdudWxsJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhc2tEZXRhaWxzLm5hbWUgPSAnTm8gbmFtZSc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kRGF0ZTogYW55ID0gcmVzLmVuZERhdGU7XG4gICAgICAgICAgICAgICAgaWYgKGVuZERhdGUgJiYgIWlzTmFOKGVuZERhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsUmVhZE9ubHlGb3JtID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsUmVhZE9ubHlGb3JtID0gdGhpcy5yZWFkT25seUZvcm07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudGFza0RldGFpbHM/Lmludm9sdmVkUGVvcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFza1Blb3BsZS5wdXNoKC4uLnRoaXMudGFza0RldGFpbHMuaW52b2x2ZWRQZW9wbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkTmV4dFRhc2socHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgcHJvY2Vzc0RlZmluaXRpb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3ROb2RlID0gbmV3IFRhc2tRdWVyeVJlcHJlc2VudGF0aW9uKHtcbiAgICAgICAgICAgIHByb2Nlc3NJbnN0YW5jZUlkLFxuICAgICAgICAgICAgcHJvY2Vzc0RlZmluaXRpb25JZFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50YXNrTGlzdFNlcnZpY2UuZ2V0VGFza3MocmVxdWVzdE5vZGUpLnN1YnNjcmliZShcbiAgICAgICAgICAgIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFza0RldGFpbHMgPSBuZXcgVGFza1JlcHJlc2VudGF0aW9uKHJlc3BvbnNlWzBdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IuZW1pdChlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxufVxuIiwiPGRpdiAqbmdJZj1cIiF0YXNrRGV0YWlsc1wiIGRhdGEtYXV0b21hdGlvbi1pZD1cImFkZi10YXNrcy1kZXRhaWxzLS1lbXB0eVwiPlxuICAgIDxuZy10ZW1wbGF0ZSAqbmdJZj1cIm5vVGFza0RldGFpbHNUZW1wbGF0ZUNvbXBvbmVudFwiIG5nRm9yIFtuZ0Zvck9mXT1cIltkYXRhXVwiXG4gICAgICAgICAgICAgICAgIFtuZ0ZvclRlbXBsYXRlXT1cIm5vVGFza0RldGFpbHNUZW1wbGF0ZUNvbXBvbmVudFwiPlxuICAgICAgICB7eyAnQURGX1RBU0tfTElTVC5ERVRBSUxTLk1FU1NBR0VTLk5PTkUnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8ZGl2ICpuZ0lmPVwiIW5vVGFza0RldGFpbHNUZW1wbGF0ZUNvbXBvbmVudFwiPlxuICAgICAgICB7eyAnQURGX1RBU0tfTElTVC5ERVRBSUxTLk1FU1NBR0VTLk5PTkUnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCJ0YXNrRGV0YWlsc1wiIGNsYXNzPVwiYWRmLXRhc2stZGV0YWlsc1wiPlxuXG4gICAgPGRpdiAqbmdJZj1cInNob3dIZWFkZXJcIiBjbGFzcz1cImFkZi10YXNrLWRldGFpbHMtaGVhZGVyXCI+XG4gICAgICAgIDxoMiBjbGFzcz1cImFkZi1hY3Rpdml0aS10YXNrLWRldGFpbHNfX2hlYWRlclwiPlxuICAgICAgICAgICAgPHNwYW4+e3t0YXNrRGV0YWlscy5uYW1lIHx8ICdObyBuYW1lJ319PC9zcGFuPlxuICAgICAgICA8L2gyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImFkZi10YXNrLWRldGFpbHMtY29yZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLXRhc2stZGV0YWlscy1jb3JlLWZvcm1cIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpc0Fzc2lnbmVkKClcIj5cbiAgICAgICAgICAgICAgICA8YWRmLXRhc2stZm9ybSAjdGFza0Zvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rhc2tJZF09XCJ0YXNrRGV0YWlscy5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Rm9ybVRpdGxlXT1cInNob3dGb3JtVGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0Zvcm1SZWZyZXNoQnV0dG9uXT1cInNob3dGb3JtUmVmcmVzaEJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q2FuY2VsQnV0dG9uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZmllbGRWYWxpZGF0b3JzXT1cImZpZWxkVmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtU2F2ZWQpPSdvbkZvcm1TYXZlZCgkZXZlbnQpJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybUNvbXBsZXRlZCk9J29uRm9ybUNvbXBsZXRlZCgkZXZlbnQpJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybUNvbnRlbnRDbGlja2VkKT0nb25Gb3JtQ29udGVudENsaWNrKCRldmVudCknXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtTG9hZGVkKT0nb25Gb3JtTG9hZGVkKCRldmVudCknXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wbGV0ZWQpPVwib25Db21wbGV0ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHNob3dBdHRhY2hGb3JtKT1cIm9uU2hvd0F0dGFjaEZvcm0oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChleGVjdXRlT3V0Y29tZSk9J29uRm9ybUV4ZWN1dGVPdXRjb21lKCRldmVudCknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh0YXNrQ2xhaW1lZCk9XCJvbkNsYWltQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAodGFza1VuY2xhaW1lZCk9XCJvblVuY2xhaW1BY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcik9XCJvbkZvcm1FcnJvcigkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgICA8YWRmLWF0dGFjaC1mb3JtICpuZ0lmPVwic2hvd0F0dGFjaEZvcm1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rhc2tJZF09XCJ0YXNrRGV0YWlscy5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUtleV09XCJ0YXNrRGV0YWlscy5mb3JtS2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYW5jZWxBdHRhY2hGb3JtKT1cIm9uQ2FuY2VsQXR0YWNoRm9ybSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdWNjZXNzKT1cIm9uQ29tcGxldGVBdHRhY2hGb3JtKClcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQXNzaWduZWQoKVwiIGlkPVwiY2xhaW0tbWVzc2FnZS1pZFwiPlxuICAgICAgICAgICAgICAgIHt7ICdBREZfVEFTS19MSVNULkRFVEFJTFMuTUVTU0FHRVMuQ0xBSU0nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtdGFzay1kZXRhaWxzLWNvcmUtc2lkZWJhclwiPlxuICAgICAgICAgICAgPGFkZi1pbmZvLWRyYXdlciAqbmdJZj1cInNob3dIZWFkZXJDb250ZW50XCIgdGl0bGU9XCJBREZfVEFTS19MSVNULkRFVEFJTFMuTEFCRUxTLklORk9fRFJBV0VSX1RJVExFXCIgaWQ9XCJhZGYtdGFzay1kZXRhaWxzLWNvcmUtc2lkZWJhci1kcmF3ZXJcIiBjbGFzcz1cImFkZi10YXNrLWRldGFpbHMtY29yZS1zaWRlYmFyLWRyYXdlclwiPlxuICAgICAgICAgICAgICAgIDxhZGYtaW5mby1kcmF3ZXItdGFiIGxhYmVsPVwiQURGX1RBU0tfTElTVC5ERVRBSUxTLkxBQkVMUy5JTkZPX0RSQVdFUl9UQUJfREVUQUlMU19USVRMRVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRmLWFzc2lnbm1lbnQtY29udGFpbmVyXCIgKm5nSWY9XCJzaG93QXNzaWduZWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhZGYtcGVvcGxlLXNlYXJjaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoZWFkZXJUaXRsZV09XCInQURGX1RBU0tfTElTVC5ERVRBSUxTLkxBQkVMUy5BRERfQVNTSUdORUUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWN0aW9uTGFiZWxdPVwiJ0FERl9UQVNLX0xJU1QuUEVPUExFLkFERF9BU1NJR05FRSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWFyY2hQZW9wbGUpPVwic2VhcmNoVXNlcigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VjY2Vzcyk9XCJhc3NpZ25UYXNrVG9Vc2VyKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbG9zZVNlYXJjaCk9XCJvbkNsb3NlU2VhcmNoKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXN1bHRzXT1cInBlb3BsZVNlYXJjaFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8YWRmLXRhc2staGVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0VGFza0hlYWRlclZpZXdDbGFzcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0YXNrRGV0YWlsc109XCJ0YXNrRGV0YWlsc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybU5hbWVdPVwidGFza0Zvcm1OYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGFpbSk9XCJvbkNsYWltQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKHVuY2xhaW0pPVwib25VbmNsYWltQWN0aW9uKCRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8YWRmLXBlb3BsZSAqbmdJZj1cInNob3dJbnZvbHZlUGVvcGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Blb3BsZV09XCJ0YXNrUGVvcGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImludGVybmFsUmVhZE9ubHlGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Rhc2tJZF09XCJ0YXNrRGV0YWlscy5pZFwiIC8+XG4gICAgICAgICAgICAgICAgPC9hZGYtaW5mby1kcmF3ZXItdGFiPlxuXG4gICAgICAgICAgICAgICAgPGFkZi1pbmZvLWRyYXdlci10YWIgbGFiZWw9XCJBREZfVEFTS19MSVNULkRFVEFJTFMuTEFCRUxTLklORk9fRFJBV0VSX1RBQl9BQ1RJVklUWV9USVRMRVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNhcmQgYXBwZWFyYW5jZT1cIm91dGxpbmVkXCIgKm5nSWY9XCJzaG93Q29tbWVudHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGYtdGFzay1jb21tZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiaXNSZWFkT25seUNvbW1lbnQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0YXNrSWRdPVwidGFza0RldGFpbHMuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICAgICAgICAgICAgPC9hZGYtaW5mby1kcmF3ZXItdGFiPlxuXG4gICAgICAgICAgICA8L2FkZi1pbmZvLWRyYXdlcj5cblxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dIZWFkZXJDb250ZW50XCIgY2xhc3M9XCJhZGYtdGFzay1kZXRhaWxzLWNvcmUtc2lkZWJhci1jaGVja2xpc3RcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0NoZWNrbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8YWRmLWNoZWNrbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiaW50ZXJuYWxSZWFkT25seUZvcm1cIlxuICAgICAgICAgICAgICAgICAgICAgICBbdGFza0lkXT1cInRhc2tEZXRhaWxzLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgW2Fzc2lnbmVlXT1cInRhc2tEZXRhaWxzLmFzc2lnbmVlPy5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgIChjaGVja2xpc3RUYXNrQ3JlYXRlZCk9XCJvbkNoZWNrbGlzdFRhc2tDcmVhdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tsaXN0VGFza0RlbGV0ZWQpPVwib25DaGVja2xpc3RUYXNrRGVsZXRlZCgkZXZlbnQpXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjZXJyb3JEaWFsb2c+XG4gICAgICAgIDxoMyBtYXREaWFsb2dUaXRsZT57eydBREZfVEFTS19MSVNULkRFVEFJTFMuRVJST1IuVElUTEUnfHRyYW5zbGF0ZX19PC9oMz5cbiAgICAgICAgPG1hdC1kaWFsb2ctY29udGVudD5cbiAgICAgICAgICAgIDxwPnt7J0FERl9UQVNLX0xJU1QuREVUQUlMUy5FUlJPUi5ERVNDUklQVElPTid8dHJhbnNsYXRlfX08L3A+XG4gICAgICAgIDwvbWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiY2xvc2VFcnJvckRpYWxvZygpXCI+e3snQURGX1RBU0tfTElTVC5ERVRBSUxTLkVSUk9SLkNMT1NFJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbjwvZGl2PlxuIl19