@libs-ui/services-diagram-draw 0.2.356-37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +279 -0
- package/canvas.service.d.ts +42 -0
- package/diagram-draw.service.d.ts +91 -0
- package/direction.service.d.ts +43 -0
- package/esm2022/canvas.service.mjs +628 -0
- package/esm2022/diagram-draw.service.mjs +711 -0
- package/esm2022/direction.service.mjs +255 -0
- package/esm2022/index.mjs +6 -0
- package/esm2022/interfaces/canvas.interface.mjs +2 -0
- package/esm2022/interfaces/coordinates.interface.mjs +2 -0
- package/esm2022/interfaces/diagram.interface.mjs +2 -0
- package/esm2022/libs-ui-services-diagram-draw.mjs +5 -0
- package/esm2022/utils/calculator-branch.util.mjs +187 -0
- package/esm2022/utils/calculator-element.util.mjs +335 -0
- package/esm2022/utils/canvas.util.mjs +176 -0
- package/esm2022/utils/diagram.util.mjs +54 -0
- package/esm2022/utils/direction.util.mjs +103 -0
- package/esm2022/utils/horizontal/calculator-branch.util.mjs +243 -0
- package/esm2022/utils/horizontal/calculator-coordinates.util.mjs +315 -0
- package/fesm2022/libs-ui-services-diagram-draw.mjs +2982 -0
- package/fesm2022/libs-ui-services-diagram-draw.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/interfaces/canvas.interface.d.ts +21 -0
- package/interfaces/coordinates.interface.d.ts +40 -0
- package/interfaces/diagram.interface.d.ts +109 -0
- package/package.json +27 -0
- package/utils/calculator-branch.util.d.ts +16 -0
- package/utils/calculator-element.util.d.ts +24 -0
- package/utils/canvas.util.d.ts +21 -0
- package/utils/diagram.util.d.ts +6 -0
- package/utils/direction.util.d.ts +6 -0
- package/utils/horizontal/calculator-branch.util.d.ts +67 -0
- package/utils/horizontal/calculator-coordinates.util.d.ts +42 -0
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { cloneDeep, uuid } from '@libs-ui/utils';
|
|
3
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
4
|
+
import { canvasConfigReadonly } from './diagram-draw.service';
|
|
5
|
+
import { getDefaultConfigConstituentBranches, LibsUiDiagramDrawCanvasUtil } from './utils/canvas.util';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class LibsUiDiagramDrawCanvasService {
|
|
8
|
+
elements;
|
|
9
|
+
flatElements;
|
|
10
|
+
handlerFunction;
|
|
11
|
+
elementRuleConnectable = [];
|
|
12
|
+
translateService = inject(TranslateService);
|
|
13
|
+
set HandlerFunction(handlerFunction) {
|
|
14
|
+
this.handlerFunction = handlerFunction;
|
|
15
|
+
}
|
|
16
|
+
get HandlerFunction() {
|
|
17
|
+
return this.handlerFunction;
|
|
18
|
+
}
|
|
19
|
+
loadElements(elements, positionFirstNode, ruleConnectableElements) {
|
|
20
|
+
if (!elements || !elements.length) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
this.flatElements = [];
|
|
24
|
+
const firstElement = elements[0];
|
|
25
|
+
firstElement.specific_x = positionFirstNode.x;
|
|
26
|
+
firstElement.specific_y = positionFirstNode.y;
|
|
27
|
+
this.Elements = elements;
|
|
28
|
+
this.RuleConnectableElements = ruleConnectableElements;
|
|
29
|
+
}
|
|
30
|
+
set Elements(elements) {
|
|
31
|
+
this.elements = elements;
|
|
32
|
+
}
|
|
33
|
+
get Elements() {
|
|
34
|
+
return this.elements;
|
|
35
|
+
}
|
|
36
|
+
set RuleConnectableElements(elements) {
|
|
37
|
+
this.elementRuleConnectable = elements;
|
|
38
|
+
}
|
|
39
|
+
get RuleConnectableElements() {
|
|
40
|
+
return this.elementRuleConnectable;
|
|
41
|
+
}
|
|
42
|
+
checkRuleDragDrop(beforeElementDrag, currentElementDrag, afterElementDrag, ruleConnectableElements) {
|
|
43
|
+
const ruleItemDrag = ruleConnectableElements.find((item) => item.elementCode === currentElementDrag?.code);
|
|
44
|
+
const ruleAfterItemDrag = ruleConnectableElements.find((item) => afterElementDrag && item.elementCode === afterElementDrag.code);
|
|
45
|
+
if (!!(ruleItemDrag && ruleItemDrag.elementCodeConnectableBefore.find((code) => code === beforeElementDrag?.code)) &&
|
|
46
|
+
(!ruleAfterItemDrag || !!(ruleAfterItemDrag && ruleAfterItemDrag.elementCodeConnectableBefore.find((code) => code === currentElementDrag?.code)))) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
get FlatElements() {
|
|
52
|
+
this.flatElements = [];
|
|
53
|
+
LibsUiDiagramDrawCanvasUtil.buildFlatElement(this.Elements, this.flatElements);
|
|
54
|
+
return this.flatElements;
|
|
55
|
+
}
|
|
56
|
+
checkExistNameElement(name, flatElements) {
|
|
57
|
+
if (!name || !name.trim()) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return flatElements?.find((element) => element.name && element.name.trim() && element.name.trim().toLocaleLowerCase() === name.trim().toLocaleLowerCase()) ? true : false;
|
|
61
|
+
}
|
|
62
|
+
addElement(itemDrop, branchDrop, dataDrop, branchChoice) {
|
|
63
|
+
if (!itemDrop || !dataDrop) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const elementsFlat = this.FlatElements;
|
|
67
|
+
if (dataDrop.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
|
|
68
|
+
let counter = 0;
|
|
69
|
+
const elementsOfCodeDataDrop = this.FlatElements?.filter((element) => element.code === dataDrop.code);
|
|
70
|
+
if (elementsOfCodeDataDrop && elementsOfCodeDataDrop.length) {
|
|
71
|
+
counter = elementsOfCodeDataDrop.reduce((preEl, currentEl) => (Number(currentEl.specific_counter_current_code) > Number(preEl.specific_counter_current_code) ? currentEl : preEl))
|
|
72
|
+
.specific_counter_current_code;
|
|
73
|
+
}
|
|
74
|
+
counter++;
|
|
75
|
+
let name = `${dataDrop.name} ${counter}`;
|
|
76
|
+
while (this.checkExistNameElement(name, elementsFlat)) {
|
|
77
|
+
counter++;
|
|
78
|
+
name = `${dataDrop.name} ${counter}`;
|
|
79
|
+
}
|
|
80
|
+
dataDrop.name = name;
|
|
81
|
+
dataDrop.specific_counter_current_code = counter;
|
|
82
|
+
}
|
|
83
|
+
if (branchDrop) {
|
|
84
|
+
return this.addElementToBranch(itemDrop, branchDrop, cloneDeep(dataDrop), branchChoice);
|
|
85
|
+
}
|
|
86
|
+
const elements = this.Elements;
|
|
87
|
+
const nextCurrentItemDrop = elements?.find((item) => item.id === itemDrop.next_id);
|
|
88
|
+
if (!nextCurrentItemDrop && dataDrop.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const indexItemDrop = elements?.findIndex((item) => item.id === itemDrop.id);
|
|
92
|
+
const newElement = { ...cloneDeep(dataDrop), pre_id: itemDrop.id, next_id: dataDrop.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT ? nextCurrentItemDrop.id : '' };
|
|
93
|
+
if (!dataDrop.id) {
|
|
94
|
+
newElement.id = `${uuid()}`;
|
|
95
|
+
}
|
|
96
|
+
itemDrop.next_id = newElement.id;
|
|
97
|
+
if (nextCurrentItemDrop) {
|
|
98
|
+
nextCurrentItemDrop.pre_id = newElement.id;
|
|
99
|
+
}
|
|
100
|
+
elements?.splice(indexItemDrop + 1, 0, newElement);
|
|
101
|
+
const flatElements = this.FlatElements;
|
|
102
|
+
const afterElement = flatElements?.find((el) => el.pre_id === newElement.id);
|
|
103
|
+
if (!afterElement) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const beforeElement = flatElements?.filter((el) => el.id !== newElement.id && el.next_id === afterElement.id);
|
|
107
|
+
beforeElement?.forEach((element) => {
|
|
108
|
+
element.next_id = newElement.id;
|
|
109
|
+
});
|
|
110
|
+
if (dataDrop.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
this.addElementExitWorkFlow(newElement, branchChoice);
|
|
114
|
+
}
|
|
115
|
+
addElementToBranch(itemDrop, branchDrop, dataDrop, numberBranch) {
|
|
116
|
+
const elements = branchDrop.elements;
|
|
117
|
+
let nextCurrentItemDrop = undefined;
|
|
118
|
+
let indexItemDrop = -1;
|
|
119
|
+
if (elements && elements.length) {
|
|
120
|
+
indexItemDrop = elements.findIndex((item) => item.id === itemDrop.id);
|
|
121
|
+
nextCurrentItemDrop = elements.find((item) => item.id === itemDrop.next_id);
|
|
122
|
+
if (!nextCurrentItemDrop && indexItemDrop === -1) {
|
|
123
|
+
nextCurrentItemDrop = elements[indexItemDrop + 1];
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
let nextId = (nextCurrentItemDrop && nextCurrentItemDrop.id) || itemDrop.next_id;
|
|
127
|
+
if (dataDrop.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
|
|
128
|
+
nextId = '';
|
|
129
|
+
}
|
|
130
|
+
const newElement = { ...dataDrop, pre_id: itemDrop.id, next_id: nextId };
|
|
131
|
+
if (!dataDrop.id) {
|
|
132
|
+
newElement.id = `${uuid()}`;
|
|
133
|
+
}
|
|
134
|
+
if (!itemDrop.branches || !itemDrop.branches.find((branch) => branch === branchDrop)) {
|
|
135
|
+
itemDrop.next_id = newElement.id;
|
|
136
|
+
}
|
|
137
|
+
if (nextCurrentItemDrop) {
|
|
138
|
+
nextCurrentItemDrop.pre_id = newElement.id;
|
|
139
|
+
}
|
|
140
|
+
elements?.splice(indexItemDrop + 1, 0, newElement);
|
|
141
|
+
if (itemDrop && itemDrop.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {
|
|
142
|
+
this.updateNextIdOfChildElementInElementWorkflow(itemDrop, this.FlatElements?.find((item) => item.id === itemDrop.next_id));
|
|
143
|
+
}
|
|
144
|
+
if (dataDrop.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
|
|
145
|
+
this.checkEndMoveElementWhenDropElementCodeExit(branchDrop);
|
|
146
|
+
}
|
|
147
|
+
if (dataDrop.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
this.addElementExitWorkFlow(newElement, numberBranch);
|
|
151
|
+
}
|
|
152
|
+
updateNextIdOfChildElementInElementWorkflow(elementWorkflow, nextElement) {
|
|
153
|
+
if (!elementWorkflow || elementWorkflow.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW || !nextElement) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const flatElement = [];
|
|
157
|
+
LibsUiDiagramDrawCanvasUtil.flatElementHasBranch(nextElement, flatElement);
|
|
158
|
+
elementWorkflow.branches?.forEach((branch) => {
|
|
159
|
+
if (!branch.elements || !branch.elements.length) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const elements = branch.elements;
|
|
163
|
+
elements.forEach((element, index) => {
|
|
164
|
+
if (index !== elements.length - 1) {
|
|
165
|
+
if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && element.next_id) {
|
|
166
|
+
return this.updateNextIdOfChildElementInElementWorkflow(element, elements[index + 1]);
|
|
167
|
+
}
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (element.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT || element.id === nextElement.id) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (element.pre_id === nextElement.id || flatElement.find((item) => item.id === element.id)) {
|
|
174
|
+
// trường hợp gọi đệ quy NextElement là khối trước hoặc cha của các element hiện tại
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {
|
|
178
|
+
if (element.next_id) {
|
|
179
|
+
element.next_id = nextElement.id;
|
|
180
|
+
}
|
|
181
|
+
return this.updateNextIdOfChildElementInElementWorkflow(element, nextElement);
|
|
182
|
+
}
|
|
183
|
+
if (elementWorkflow.next_id !== nextElement.id) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
element.next_id = nextElement.id;
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
checkEndMoveElementWhenDropElementCodeExit(currentBranch) {
|
|
191
|
+
const flatElements = this.FlatElements;
|
|
192
|
+
const elementHasCurrentBranch = flatElements?.find((el) => el.branches && !!el.branches.find((branch) => branch === currentBranch));
|
|
193
|
+
if (!elementHasCurrentBranch) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const nextElement = flatElements?.find((el) => el.id === elementHasCurrentBranch.next_id);
|
|
197
|
+
if (!nextElement) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const dataElementHasCurrentBranch = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();
|
|
201
|
+
LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementHasCurrentBranch, nextElement.id, dataElementHasCurrentBranch, this.FlatElements);
|
|
202
|
+
if (!dataElementHasCurrentBranch.branchEmpty && dataElementHasCurrentBranch.count === 0) {
|
|
203
|
+
elementHasCurrentBranch.next_id = '';
|
|
204
|
+
}
|
|
205
|
+
const elementNextToId = flatElements?.find((el) => el.next_id === nextElement.id); // Khối cha
|
|
206
|
+
if (!elementNextToId || elementNextToId.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW || !elementNextToId.next_id) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
let dataFistElement = dataElementHasCurrentBranch;
|
|
210
|
+
if (elementHasCurrentBranch.id !== elementNextToId.id) {
|
|
211
|
+
dataFistElement = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();
|
|
212
|
+
LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementNextToId, nextElement.id, dataFistElement, this.FlatElements);
|
|
213
|
+
}
|
|
214
|
+
if (dataFistElement.count > 1 || !dataFistElement.branchContainer) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const branchAddItem = dataFistElement.branchContainer;
|
|
218
|
+
if (elementHasCurrentBranch.id === elementNextToId.id) {
|
|
219
|
+
if (nextElement.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
|
|
220
|
+
this.moveElementsToBranch(nextElement, branchAddItem);
|
|
221
|
+
const { element } = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, elementHasCurrentBranch, this.FlatElements);
|
|
222
|
+
const data = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();
|
|
223
|
+
const elementCount = element && element.next_id ? element : elementHasCurrentBranch;
|
|
224
|
+
// Fixbug: 15771
|
|
225
|
+
LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementCount, elementCount.next_id, data, this.FlatElements);
|
|
226
|
+
if (!data.count) {
|
|
227
|
+
return (elementCount.next_id = '');
|
|
228
|
+
}
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
elementHasCurrentBranch.next_id = '';
|
|
232
|
+
const elementHasBranchesNotResetId = this.deleteElement(nextElement);
|
|
233
|
+
if (!elementHasBranchesNotResetId.length) {
|
|
234
|
+
return this.cloneElementAndAddElementEXitToBranch(elementHasCurrentBranch, branchAddItem, nextElement);
|
|
235
|
+
}
|
|
236
|
+
const { data, element } = elementHasBranchesNotResetId[0];
|
|
237
|
+
const infoOfElement = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, element, this.FlatElements);
|
|
238
|
+
const parentOfElement = infoOfElement.element;
|
|
239
|
+
let dataOfElementInfo = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();
|
|
240
|
+
LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(parentOfElement, parentOfElement?.next_id, dataOfElementInfo, this.FlatElements);
|
|
241
|
+
if (elementHasBranchesNotResetId.length === 1) {
|
|
242
|
+
if (data.count > 1) {
|
|
243
|
+
return this.cloneElementAndAddElementEXitToBranch(element, branchAddItem, nextElement);
|
|
244
|
+
}
|
|
245
|
+
if (dataFistElement.branchContainer !== data.branchContainer && dataFistElement.count === 1) {
|
|
246
|
+
this.cloneElementAndAddElementEXitToBranch(elementHasCurrentBranch, branchAddItem, nextElement);
|
|
247
|
+
dataOfElementInfo = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();
|
|
248
|
+
LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(parentOfElement, parentOfElement?.next_id, dataOfElementInfo, this.FlatElements);
|
|
249
|
+
}
|
|
250
|
+
if (dataOfElementInfo.count > 1) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
// Fixbug: 15518
|
|
254
|
+
if (data.branchContainer) {
|
|
255
|
+
this.cloneElementAndAddElementEXitToBranch(element, data.branchContainer, nextElement);
|
|
256
|
+
}
|
|
257
|
+
LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(parentOfElement, parentOfElement?.next_id, LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount(), this.FlatElements);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
this.cloneElementAndAddElementEXitToBranch(element, branchAddItem, nextElement);
|
|
261
|
+
const flatElement = this.FlatElements;
|
|
262
|
+
elementHasBranchesNotResetId.forEach((item) => {
|
|
263
|
+
const { element } = item;
|
|
264
|
+
if (element.next_id && flatElement?.find((item) => item.id === element.next_id)) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const infoFromElement = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, element, flatElement);
|
|
268
|
+
if (infoFromElement.element) {
|
|
269
|
+
element.next_id = infoFromElement.element.next_id;
|
|
270
|
+
this.updateNextIdOfChildElementInElementWorkflow(element, flatElements?.find((item) => item.id === element.next_id)); // FixBug: 15729
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(parentOfElement, parentOfElement?.next_id, LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount(), flatElement);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
if (nextElement.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
|
|
277
|
+
this.moveElementsToBranch(nextElement, branchAddItem);
|
|
278
|
+
// kiểm tra khối cha chứa các element có branch xem có element nào count = 0 để reset next_id = '' của khối đó
|
|
279
|
+
const dataOfElementNextToId = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();
|
|
280
|
+
LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementNextToId, elementNextToId.next_id, dataOfElementNextToId, this.FlatElements);
|
|
281
|
+
if (!dataOfElementNextToId.count) {
|
|
282
|
+
elementNextToId.next_id = '';
|
|
283
|
+
}
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
elementNextToId.next_id = '';
|
|
287
|
+
elementHasCurrentBranch.next_id = '';
|
|
288
|
+
const elementHasBranchesNotResetId = this.deleteElement(nextElement);
|
|
289
|
+
if (dataElementHasCurrentBranch.branchContainer) {
|
|
290
|
+
this.cloneElementAndAddElementEXitToBranch(elementHasCurrentBranch, dataElementHasCurrentBranch.branchContainer, nextElement);
|
|
291
|
+
}
|
|
292
|
+
if (branchAddItem && branchAddItem !== dataElementHasCurrentBranch.branchContainer) {
|
|
293
|
+
this.cloneElementAndAddElementEXitToBranch(elementNextToId, branchAddItem, nextElement); // dòng này sẽ khởi tạo lại next_id của khối cha
|
|
294
|
+
}
|
|
295
|
+
if (!elementHasBranchesNotResetId.length) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
// kiểm tra khối cha chứa các element có branch xem có element nào count = 0 để reset next_id = '' của khối đó
|
|
299
|
+
dataFistElement = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();
|
|
300
|
+
LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementNextToId, nextElement.id, dataFistElement, this.FlatElements);
|
|
301
|
+
if (!dataFistElement.count) {
|
|
302
|
+
// nếu khối cha kiểm tra khối cha chứa các element có branch có count = 0 thì reset next_id = ''
|
|
303
|
+
elementNextToId.next_id = '';
|
|
304
|
+
}
|
|
305
|
+
const newId = elementHasBranchesNotResetId[0].element.next_id;
|
|
306
|
+
elementHasBranchesNotResetId.forEach((item) => (item.element.next_id = newId));
|
|
307
|
+
}
|
|
308
|
+
moveElementsToBranch(elementStart, branchContainer) {
|
|
309
|
+
if (!elementStart || elementStart.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT || !branchContainer || !branchContainer.elements) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const result = this.findContainerHasElementStart(elementStart, this.Elements);
|
|
313
|
+
if (!result) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
const { container, index } = result;
|
|
317
|
+
const elementsHasMove = container.slice(Number(index));
|
|
318
|
+
const elementsOfBranchContainer = branchContainer.elements;
|
|
319
|
+
const lastElementOfBranchContainer = elementsOfBranchContainer[elementsOfBranchContainer.length - 1];
|
|
320
|
+
elementsHasMove.forEach((element) => this.deleteElement(element, true));
|
|
321
|
+
if (lastElementOfBranchContainer && lastElementOfBranchContainer.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
|
|
322
|
+
lastElementOfBranchContainer.next_id = elementStart.id;
|
|
323
|
+
elementStart.pre_id = lastElementOfBranchContainer.id;
|
|
324
|
+
}
|
|
325
|
+
const lastElementMove = elementsHasMove[elementsHasMove.length - 1];
|
|
326
|
+
let nextElement = elementStart;
|
|
327
|
+
if (lastElementMove && lastElementMove.next_id) {
|
|
328
|
+
nextElement = this.FlatElements?.find((item) => item.id === lastElementMove.next_id);
|
|
329
|
+
}
|
|
330
|
+
const preElementStart = container[Number(index) - 1];
|
|
331
|
+
branchContainer.elements.push(...elementsHasMove);
|
|
332
|
+
if (!preElementStart || preElementStart.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
if (nextElement) {
|
|
336
|
+
this.updateNextIdOfChildElementInElementWorkflow(preElementStart, nextElement);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
findContainerHasElementStart(elementStart, containerCapacity) {
|
|
340
|
+
if (!containerCapacity || !containerCapacity.length || !elementStart) {
|
|
341
|
+
return undefined;
|
|
342
|
+
}
|
|
343
|
+
for (const index in containerCapacity) {
|
|
344
|
+
const element = containerCapacity[index];
|
|
345
|
+
if (element.id === elementStart.id) {
|
|
346
|
+
return {
|
|
347
|
+
elementStart: elementStart,
|
|
348
|
+
index: index,
|
|
349
|
+
container: containerCapacity,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
if (!element.branches || !element.branches.length) {
|
|
353
|
+
continue;
|
|
354
|
+
}
|
|
355
|
+
const branches = element.branches;
|
|
356
|
+
for (const branch of branches) {
|
|
357
|
+
const result = this.findContainerHasElementStart(elementStart, branch.elements);
|
|
358
|
+
if (result) {
|
|
359
|
+
return result;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return undefined;
|
|
364
|
+
}
|
|
365
|
+
deleteElement(elementDelete, ignoreUpdatePreId) {
|
|
366
|
+
if (!elementDelete || !elementDelete.id) {
|
|
367
|
+
return [];
|
|
368
|
+
}
|
|
369
|
+
const elementHasBranchesNotResetId = new Array();
|
|
370
|
+
const flatElements = this.FlatElements;
|
|
371
|
+
const elementsHasNextIdToElementDelete = flatElements?.filter((el) => el.next_id === elementDelete.id);
|
|
372
|
+
const elementHasPreIdToElementDelete = flatElements?.find((el) => el.pre_id === elementDelete.id && el.id === elementDelete.next_id);
|
|
373
|
+
if (!ignoreUpdatePreId && elementHasPreIdToElementDelete) {
|
|
374
|
+
elementHasPreIdToElementDelete.pre_id = elementDelete.pre_id;
|
|
375
|
+
}
|
|
376
|
+
elementsHasNextIdToElementDelete?.forEach((elementHasNextIdToElementDelete) => {
|
|
377
|
+
if (elementHasPreIdToElementDelete) {
|
|
378
|
+
elementHasNextIdToElementDelete.next_id = elementHasPreIdToElementDelete.id;
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
if (elementDelete.code !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
|
|
382
|
+
if (!elementHasPreIdToElementDelete && elementDelete.next_id) {
|
|
383
|
+
// Fixbug: 15623
|
|
384
|
+
elementHasNextIdToElementDelete.next_id = elementDelete.next_id;
|
|
385
|
+
}
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
if (elementHasNextIdToElementDelete.branches && elementHasNextIdToElementDelete.branches.length) {
|
|
389
|
+
const data = LibsUiDiagramDrawCanvasUtil.getDefaultStorageBranchEndCount();
|
|
390
|
+
LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(elementHasNextIdToElementDelete, elementDelete.id, data, this.FlatElements);
|
|
391
|
+
if (!data.count) {
|
|
392
|
+
elementHasNextIdToElementDelete.next_id = '';
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
elementHasBranchesNotResetId.push({ element: elementHasNextIdToElementDelete, data });
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
elementHasNextIdToElementDelete.next_id = elementDelete.next_id;
|
|
399
|
+
});
|
|
400
|
+
LibsUiDiagramDrawCanvasUtil.findAndDeleteElementFromContainer(this.Elements, elementDelete);
|
|
401
|
+
return elementHasBranchesNotResetId;
|
|
402
|
+
}
|
|
403
|
+
cloneElementAndAddElementEXitToBranch(elementHasCurrentBranch, branch, dataDrop) {
|
|
404
|
+
if (!dataDrop || !elementHasCurrentBranch || !branch) {
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
let elementDrop = elementHasCurrentBranch;
|
|
408
|
+
if (branch.elements && branch.elements.length) {
|
|
409
|
+
elementDrop = branch.elements[branch.elements.length - 1];
|
|
410
|
+
}
|
|
411
|
+
return this.addElementToBranch(elementDrop, branch, cloneDeep(dataDrop));
|
|
412
|
+
}
|
|
413
|
+
addElementExitWorkFlow(newElement, numberBranch) {
|
|
414
|
+
const exit = {
|
|
415
|
+
element_type: canvasConfigReadonly().TYPE_ELEMENT_EXIT,
|
|
416
|
+
code: canvasConfigReadonly().TYPE_ELEMENT_EXIT,
|
|
417
|
+
name: this.translateService.instant('i18n_end_journey_new'),
|
|
418
|
+
specific_width: canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT,
|
|
419
|
+
specific_height: canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT,
|
|
420
|
+
specific_x: 0,
|
|
421
|
+
specific_y: 0,
|
|
422
|
+
};
|
|
423
|
+
if (newElement.branches && newElement.branches.length) {
|
|
424
|
+
newElement.branches.forEach((item, index) => {
|
|
425
|
+
if (index === numberBranch) {
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
if (!newElement.branches) {
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
this.addElement(newElement, item, exit);
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
addElementExitWhenDeleteDirectionLine(element, branch) {
|
|
436
|
+
const exit = {
|
|
437
|
+
element_type: canvasConfigReadonly().TYPE_ELEMENT_EXIT,
|
|
438
|
+
code: canvasConfigReadonly().TYPE_ELEMENT_EXIT,
|
|
439
|
+
name: this.translateService.instant('i18n_end_journey_new'),
|
|
440
|
+
specific_width: canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT,
|
|
441
|
+
specific_height: canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT,
|
|
442
|
+
specific_x: 0,
|
|
443
|
+
specific_y: 0,
|
|
444
|
+
};
|
|
445
|
+
delete element.nodeOtherConfig;
|
|
446
|
+
this.addElement(element, branch, exit);
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Khi một element bị xoá, hàm này sẽ tự động thêm exit cho tất cả các element phía trước đang trỏ tới element đó.
|
|
450
|
+
*/
|
|
451
|
+
addElementExitForAllElementPreviousWhenElementDelete(elementsDelete) {
|
|
452
|
+
const flatElement = this.FlatElements;
|
|
453
|
+
const flatElementsInElementDelete = [];
|
|
454
|
+
LibsUiDiagramDrawCanvasUtil.buildFlatElement(elementsDelete, flatElementsInElementDelete);
|
|
455
|
+
flatElementsInElementDelete.forEach((elementDel) => {
|
|
456
|
+
if (elementDel.pre_other_id && elementDel.pre_other_id.length) {
|
|
457
|
+
elementDel.pre_other_id.forEach((item) => {
|
|
458
|
+
const element = flatElement?.find((el) => el.id === item);
|
|
459
|
+
if (element?.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && element.branches?.length) {
|
|
460
|
+
element.branches.forEach((branch) => {
|
|
461
|
+
if (!branch.next_other_id || !branch.next_other_id.length) {
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
const indexEl = branch.next_other_id.findIndex((el) => el === elementDel.id);
|
|
465
|
+
if (indexEl !== -1) {
|
|
466
|
+
branch.next_other_id.splice(indexEl, 1);
|
|
467
|
+
}
|
|
468
|
+
if (!branch.next_other_id.length) {
|
|
469
|
+
this.addElementExitWhenDeleteDirectionLine(element, branch);
|
|
470
|
+
element.subCodeOfElement = undefined;
|
|
471
|
+
element.attributeSvgD = undefined;
|
|
472
|
+
element.position_end = undefined;
|
|
473
|
+
branch.nodeOtherConfig = undefined;
|
|
474
|
+
}
|
|
475
|
+
});
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
if (!element || !element.next_other_id) {
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
const indexEl = element.next_other_id.findIndex((el) => el === elementDel.id);
|
|
482
|
+
if (indexEl !== -1) {
|
|
483
|
+
element.next_other_id.splice(indexEl, 1);
|
|
484
|
+
}
|
|
485
|
+
if (!element.next_other_id.length) {
|
|
486
|
+
if (element.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {
|
|
487
|
+
const getConfigDefaultBranches = this.handlerFunction?.getConfigDefaultBranches ?? getDefaultConfigConstituentBranches;
|
|
488
|
+
getConfigDefaultBranches(element.code ?? '', element);
|
|
489
|
+
}
|
|
490
|
+
const branch = LibsUiDiagramDrawCanvasUtil.getBranchOfElement(element.id ?? '', this.FlatElements, canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW);
|
|
491
|
+
this.addElementExitWhenDeleteDirectionLine(element, branch);
|
|
492
|
+
element.subCodeOfElement = undefined;
|
|
493
|
+
element.attributeSvgD = undefined;
|
|
494
|
+
element.position_end = undefined;
|
|
495
|
+
}
|
|
496
|
+
});
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
if (elementDel.next_other_id && elementDel.next_other_id.length) {
|
|
500
|
+
elementDel.next_other_id.forEach((item) => {
|
|
501
|
+
const element = flatElement?.find((el) => el.id === item);
|
|
502
|
+
if (!element || !element.pre_other_id) {
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
const indexEl = element.pre_other_id.findIndex((el) => el === elementDel.id);
|
|
506
|
+
if (indexEl !== -1) {
|
|
507
|
+
element.pre_other_id.splice(indexEl, 1);
|
|
508
|
+
}
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
if (elementDel.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && elementDel.branches?.length) {
|
|
512
|
+
elementDel.branches.forEach((branch) => {
|
|
513
|
+
if (!branch.next_other_id || !branch.next_other_id.length) {
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
branch.next_other_id.forEach((item) => {
|
|
517
|
+
const element = flatElement?.find((el) => el.id === item);
|
|
518
|
+
if (!element || !element.pre_other_id) {
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
const indexEl = element.pre_other_id.findIndex((el) => el === elementDel.id);
|
|
522
|
+
if (indexEl !== -1) {
|
|
523
|
+
element.pre_other_id.splice(indexEl, 1);
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
async removeOrChangeElement(elementRemove, elementChange, branchChoose) {
|
|
531
|
+
if (!elementRemove || elementRemove.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
const flatElements = this.FlatElements;
|
|
535
|
+
const preElement = flatElements?.find((element) => element.id === elementRemove.pre_id);
|
|
536
|
+
const infoOfElementRemove = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, elementRemove, this.FlatElements);
|
|
537
|
+
const exit = {
|
|
538
|
+
element_type: canvasConfigReadonly().TYPE_ELEMENT_EXIT,
|
|
539
|
+
code: canvasConfigReadonly().TYPE_ELEMENT_EXIT,
|
|
540
|
+
name: this.translateService.instant('i18n_out_journey'),
|
|
541
|
+
id: `${uuid()}`,
|
|
542
|
+
specific_width: canvasConfigReadonly().WIDTH_ELEMENT_DEFAULT,
|
|
543
|
+
specific_height: canvasConfigReadonly().HEIGHT_ELEMENT_DEFAULT,
|
|
544
|
+
specific_x: 0,
|
|
545
|
+
specific_y: 0,
|
|
546
|
+
};
|
|
547
|
+
const elementNextBeforeDelete = flatElements?.find((el) => el.pre_id === elementRemove.id && el.id === elementRemove.next_id);
|
|
548
|
+
if (elementNextBeforeDelete && elementNextBeforeDelete.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
|
|
549
|
+
if (preElement && preElement.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && infoOfElementRemove.currentBranch) {
|
|
550
|
+
infoOfElementRemove.currentBranch.nodeOtherConfig = undefined;
|
|
551
|
+
}
|
|
552
|
+
if (preElement && preElement.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {
|
|
553
|
+
preElement.nodeOtherConfig = undefined;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
if (preElement && !elementNextBeforeDelete) {
|
|
557
|
+
preElement.nodeOtherConfig = undefined;
|
|
558
|
+
if (preElement && preElement.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && infoOfElementRemove.currentBranch) {
|
|
559
|
+
infoOfElementRemove.currentBranch.nodeOtherConfig = undefined;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
this.deleteElement(elementRemove);
|
|
563
|
+
// xóa thẳng
|
|
564
|
+
if (!elementChange) {
|
|
565
|
+
if (!elementNextBeforeDelete) {
|
|
566
|
+
this.addElement(preElement, infoOfElementRemove.currentBranch, exit);
|
|
567
|
+
}
|
|
568
|
+
return;
|
|
569
|
+
}
|
|
570
|
+
// thay đơn == đơn, thay đơn = nhánh
|
|
571
|
+
if (elementRemove.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {
|
|
572
|
+
if (!elementRemove.next_id && elementChange.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {
|
|
573
|
+
// 48229
|
|
574
|
+
this.addElement(preElement, infoOfElementRemove.currentBranch, exit);
|
|
575
|
+
}
|
|
576
|
+
this.addElement(preElement, infoOfElementRemove.currentBranch, elementChange, branchChoose);
|
|
577
|
+
if (elementChange.element_type === canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW && elementNextBeforeDelete && elementNextBeforeDelete.code === canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
|
|
578
|
+
this.deleteElement(elementNextBeforeDelete);
|
|
579
|
+
}
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
// thay nhánh = đơn
|
|
583
|
+
if (elementChange.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {
|
|
584
|
+
this.addElement(preElement, infoOfElementRemove.currentBranch, exit);
|
|
585
|
+
this.addElement(preElement, infoOfElementRemove.currentBranch, elementChange, branchChoose);
|
|
586
|
+
return;
|
|
587
|
+
}
|
|
588
|
+
// thay nhánh = nhánh
|
|
589
|
+
this.addElement(preElement, infoOfElementRemove.currentBranch, exit);
|
|
590
|
+
this.addElement(preElement, infoOfElementRemove.currentBranch, elementChange, branchChoose);
|
|
591
|
+
this.deleteElement(exit);
|
|
592
|
+
}
|
|
593
|
+
async deleteChangeElementAndInsertBranchKeep(elementRemove, elementChange, branchKeepElement, branchChoice) {
|
|
594
|
+
const flatElements = this.FlatElements;
|
|
595
|
+
const preElement = flatElements?.find((element) => element.id === elementRemove.pre_id);
|
|
596
|
+
const infoOfElementRemove = LibsUiDiagramDrawCanvasUtil.getElementHasCurrentBranchOrCurrentElement(undefined, elementRemove, this.FlatElements);
|
|
597
|
+
this.addBranchKeepToFlow(branchKeepElement, preElement, infoOfElementRemove.currentBranch);
|
|
598
|
+
this.deleteElement(elementRemove);
|
|
599
|
+
if (elementChange) {
|
|
600
|
+
this.addElement(preElement, infoOfElementRemove.currentBranch, elementChange, branchChoice);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
addBranchKeepToFlow(branchKeepElement, itemDrop, branchDrop) {
|
|
604
|
+
if (!branchKeepElement) {
|
|
605
|
+
return;
|
|
606
|
+
}
|
|
607
|
+
const elements = branchKeepElement.elements;
|
|
608
|
+
const nextCurrentItemDrop = elements[0];
|
|
609
|
+
if (nextCurrentItemDrop) {
|
|
610
|
+
if (itemDrop.element_type !== canvasConfigReadonly().TYPE_ELEMENT_WORKFLOW) {
|
|
611
|
+
itemDrop.next_id = nextCurrentItemDrop && nextCurrentItemDrop.id;
|
|
612
|
+
}
|
|
613
|
+
nextCurrentItemDrop.pre_id = itemDrop.id;
|
|
614
|
+
}
|
|
615
|
+
if (branchDrop) {
|
|
616
|
+
branchDrop.elements.push(...elements);
|
|
617
|
+
return;
|
|
618
|
+
}
|
|
619
|
+
this.Elements.push(...elements);
|
|
620
|
+
}
|
|
621
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiDiagramDrawCanvasService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
622
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiDiagramDrawCanvasService, providedIn: 'root' });
|
|
623
|
+
}
|
|
624
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiDiagramDrawCanvasService, decorators: [{
|
|
625
|
+
type: Injectable,
|
|
626
|
+
args: [{ providedIn: 'root' }]
|
|
627
|
+
}] });
|
|
628
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2RpYWdyYW0tZHJhdy9zcmMvY2FudmFzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUc5RCxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFHdkcsTUFBTSxPQUFPLDhCQUE4QjtJQUNqQyxRQUFRLENBQTBCO0lBQ2xDLFlBQVksQ0FBMEI7SUFDdEMsZUFBZSxDQUFvQjtJQUNuQyxzQkFBc0IsR0FBNEIsRUFBRSxDQUFDO0lBRXJELGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRXBELElBQVcsZUFBZSxDQUFDLGVBQWlDO1FBQzFELElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFTSxZQUFZLENBQUMsUUFBZ0MsRUFBRSxpQkFBMkMsRUFBRSx1QkFBZ0Q7UUFDakosSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxZ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LE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQztRQUM1QyxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4QyxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDeEIsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLG9CQUFvQixFQUFFLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDM0UsUUFBUSxDQUFDLE9BQU8sR0FBRyxtQkFBbUIsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7WUFDbkUsQ0FBQztZQUNELG1CQUFtQixDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQzNDLENBQUM7UUFDRCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztZQUV0QyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQzt3R0E3dUJVLDhCQUE4Qjs0R0FBOUIsOEJBQThCLGNBRGpCLE1BQU07OzRGQUNuQiw4QkFBOEI7a0JBRDFDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIHV1aWQgfSBmcm9tICdAbGlicy11aS91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBjYW52YXNDb25maWdSZWFkb25seSB9IGZyb20gJy4vZGlhZ3JhbS1kcmF3LnNlcnZpY2UnO1xuaW1wb3J0IHsgSUJyYW5jaEVuZENvdW50LCBJSGFuZGxlckZ1bmN0aW9uLCBJUnVsZUNvbm5lY3RhYmxlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NhbnZhcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSURpYWdyYW1FbGVtZW50LCBJRGlhZ3JhbUVsZW1lbnRCcmFuY2ggfSBmcm9tICcuL2ludGVyZmFjZXMvZGlhZ3JhbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdENvbmZpZ0NvbnN0aXR1ZW50QnJhbmNoZXMsIExpYnNVaURpYWdyYW1EcmF3Q2FudmFzVXRpbCB9IGZyb20gJy4vdXRpbHMvY2FudmFzLnV0aWwnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIExpYnNVaURpYWdyYW1EcmF3Q2FudmFzU2VydmljZSB7XG4gIHByaXZhdGUgZWxlbWVudHMhOiBBcnJheTxJRGlhZ3JhbUVsZW1lbnQ+O1xuICBwcml2YXRlIGZsYXRFbGVtZW50cyE6IEFycmF5PElEaWFncmFtRWxlbWVudD47XG4gIHByaXZhdGUgaGFuZGxlckZ1bmN0aW9uITogSUhhbmRsZXJGdW5jdGlvbjtcbiAgcHJpdmF0ZSBlbGVtZW50UnVsZUNvbm5lY3RhYmxlOiBBcnJheTxJUnVsZUNvbm5lY3RhYmxlPiA9IFtdO1xuXG4gIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICBwdWJsaWMgc2V0IEhhbmRsZXJGdW5jdGlvbihoYW5kbGVyRnVuY3Rpb246IElIYW5kbGVyRnVuY3Rpb24pIHtcbiAgICB0aGlzLmhhbmRsZXJGdW5jdGlvbiA9IGhhbmRsZXJGdW5jdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgSGFuZGxlckZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXJGdW5jdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkRWxlbWVudHMoZWxlbWVudHM6IEFycmF5PElEaWFncmFtRWxlbWVudD4sIHBvc2l0aW9uRmlyc3ROb2RlOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sIHJ1bGVDb25uZWN0YWJsZUVsZW1lbnRzOiBBcnJheTxJUnVsZUNvbm5lY3RhYmxlPikge1xuICAgIGlmICghZWxlbWVudHMgfHwgIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmxhdEVsZW1lbnRzID0gW107XG4gICAgY29uc3QgZmlyc3RFbGVtZW50ID0gZWxlbWVudHNbMF07XG4gICAgZmlyc3RFbGVtZW50LnNwZWNpZmljX3ggPSBwb3NpdGlvbkZpcnN0Tm9kZS54O1xuICAgIGZpcnN0RWxlbWVudC5zcGVjaWZpY195ID0gcG9zaXRpb25GaXJzdE5vZGUueTtcbiAgICB0aGlzLkVsZW1lbnRzID0gZWxlbWVudHM7XG4gICAgdGhpcy5SdWxlQ29ubmVjdGFibGVFbGVtZW50cyA9IHJ1bGVDb25uZWN0YWJsZUVsZW1lbnRzO1xuICB9XG5cbiAgcHVibGljIHNldCBFbGVtZW50cyhlbGVtZW50cykge1xuICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50cztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgRWxlbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHM7XG4gIH1cblxuICBzZXQgUnVsZUNvbm5lY3RhYmxlRWxlbWVudHMoZWxlbWVudHM6IEFycmF5PElSdWxlQ29ubmVjdGFibGU+KSB7XG4gICAgdGhpcy5lbGVtZW50UnVsZUNvbm5lY3RhYmxlID0gZWxlbWVudHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IFJ1bGVDb25uZWN0YWJsZUVsZW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSdWxlQ29ubmVjdGFibGU7XG4gIH1cblxuICBwdWJsaWMgY2hlY2tSdWxlRHJhZ0Ryb3AoYmVmb3JlRWxlbWVudERyYWc6IElEaWFncmFtRWxlbWVudCB8IHVuZGVmaW5lZCwgY3VycmVudEVsZW1lbnREcmFnOiBJRGlhZ3JhbUVsZW1lbnQgfCB1bmRlZmluZWQsIGFmdGVyRWxlbWVudERyYWc6IElEaWFncmFtRWxlbWVudCB8IHVuZGVmaW5lZCwgcnVsZUNvbm5lY3RhYmxlRWxlbWVudHM6IEFycmF5PElSdWxlQ29ubmVjdGFibGU+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgcnVsZUl0ZW1EcmFnID0gcnVsZUNvbm5lY3RhYmxlRWxlbWVudHMuZmluZCgoaXRlbSkgPT4gaXRlbS5lbGVtZW50Q29kZSA9PT0gY3VycmVudEVsZW1lbnREcmFnPy5jb2RlKTtcbiAgICBjb25zdCBydWxlQWZ0ZXJJdGVtRHJhZyA9IHJ1bGVDb25uZWN0YWJsZUVsZW1lbnRzLmZpbmQoKGl0ZW0pID0+IGFmdGVyRWxlbWVudERyYWcgJiYgaXRlbS5lbGVtZW50Q29kZSA9PT0gYWZ0ZXJFbGVtZW50RHJhZy5jb2RlKTtcblxuICAgIGlmIChcbiAgICAgICEhKHJ1bGVJdGVtRHJhZyAmJiBydWxlSXRlbURyYWcuZWxlbWVudENvZGVDb25uZWN0YWJsZUJlZm9yZS5maW5kKChjb2RlKSA9PiBjb2RlID09PSBiZWZvcmVFbGVtZW50RHJhZz8uY29kZSkpICYmXG4gICAgICAoIXJ1bGVBZnRlckl0ZW1EcmFnIHx8ICEhKHJ1bGVBZnRlckl0ZW1EcmFnICYmIHJ1bGVBZnRlckl0ZW1EcmFnLmVsZW1lbnRDb2RlQ29ubmVjdGFibGVCZWZvcmUuZmluZCgoY29kZSkgPT4gY29kZSA9PT0gY3VycmVudEVsZW1lbnREcmFnPy5jb2RlKSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZsYXRFbGVtZW50cygpIHtcbiAgICB0aGlzLmZsYXRFbGVtZW50cyA9IFtdO1xuICAgIExpYnNVaURpYWdyYW1EcmF3Q2FudmFzVXRpbC5idWlsZEZsYXRFbGVtZW50KHRoaXMuRWxlbWVudHMgYXMgQXJyYXk8SURpYWdyYW1FbGVtZW50PiwgdGhpcy5mbGF0RWxlbWVudHMpO1xuXG4gICAgcmV0dXJuIHRoaXMuZmxhdEVsZW1lbnRzO1xuICB9XG5cbiAgcHVibGljIGNoZWNrRXhpc3ROYW1lRWxlbWVudChuYW1lOiBzdHJpbmcsIGZsYXRFbGVtZW50czogQXJyYXk8SURpYWdyYW1FbGVtZW50Pikge1xuICAgIGlmICghbmFtZSB8fCAhbmFtZS50cmltKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdEVsZW1lbnRzPy5maW5kKChlbGVtZW50KSA9PiBlbGVtZW50Lm5hbWUgJiYgZWxlbWVudC5uYW1lLnRyaW0oKSAmJiBlbGVtZW50Lm5hbWUudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IG5hbWUudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCkpID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGFkZEVsZW1lbnQoaXRlbURyb3A6IElEaWFncmFtRWxlbWVudCwgYnJhbmNoRHJvcDogSURpYWdyYW1FbGVtZW50QnJhbmNoIHwgdW5kZWZpbmVkLCBkYXRhRHJvcDogSURpYWdyYW1FbGVtZW50LCBicmFuY2hDaG9pY2U/OiBudW1iZXIpIHtcbiAgICBpZiAoIWl0ZW1Ecm9wIHx8ICFkYXRhRHJvcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50c0ZsYXQgPSB0aGlzLkZsYXRFbGVtZW50cztcbiAgICBpZiAoZGF0YURyb3AuY29kZSAhPT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfRVhJVCkge1xuICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuICAgICAgY29uc3QgZWxlbWVudHNPZkNvZGVEYXRhRHJvcCA9IHRoaXMuRmxhdEVsZW1lbnRzPy5maWx0ZXIoKGVsZW1lbnQpID0+IGVsZW1lbnQuY29kZSA9PT0gZGF0YURyb3AuY29kZSk7XG5cbiAgICAgIGlmIChlbGVtZW50c09mQ29kZURhdGFEcm9wICYmIGVsZW1lbnRzT2ZDb2RlRGF0YURyb3AubGVuZ3RoKSB7XG4gICAgICAgIGNvdW50ZXIgPSBlbGVtZW50c09mQ29kZURhdGFEcm9wLnJlZHVjZSgocHJlRWw6IElEaWFncmFtRWxlbWVudCwgY3VycmVudEVsOiBJRGlhZ3JhbUVsZW1lbnQpID0+IChOdW1iZXIoY3VycmVudEVsLnNwZWNpZmljX2NvdW50ZXJfY3VycmVudF9jb2RlKSA+IE51bWJlcihwcmVFbC5zcGVjaWZpY19jb3VudGVyX2N1cnJlbnRfY29kZSkgPyBjdXJyZW50RWwgOiBwcmVFbCkpXG4gICAgICAgICAgLnNwZWNpZmljX2NvdW50ZXJfY3VycmVudF9jb2RlIGFzIG51bWJlcjtcbiAgICAgIH1cbiAgICAgIGNvdW50ZXIrKztcbiAgICAgIGxldCBuYW1lID0gYCR7ZGF0YURyb3AubmFtZX0gJHtjb3VudGVyfWA7XG5cbiAgICAgIHdoaWxlICh0aGlzLmNoZWNrRXhpc3ROYW1lRWxlbWVudChuYW1lIGFzIHN0cmluZywgZWxlbWVudHNGbGF0KSkge1xuICAgICAgICBjb3VudGVyKys7XG4gICAgICAgIG5hbWUgPSBgJHtkYXRhRHJvcC5uYW1lfSAke2NvdW50ZXJ9YDtcbiAgICAgIH1cbiAgICAgIGRhdGFEcm9wLm5hbWUgPSBuYW1lO1xuICAgICAgZGF0YURyb3Auc3BlY2lmaWNfY291bnRlcl9jdXJyZW50X2NvZGUgPSBjb3VudGVyO1xuICAgIH1cbiAgICBpZiAoYnJhbmNoRHJvcCkge1xuICAgICAgcmV0dXJuIHRoaXMuYWRkRWxlbWVudFRvQnJhbmNoKGl0ZW1Ecm9wLCBicmFuY2hEcm9wLCBjbG9uZURlZXAoZGF0YURyb3ApLCBicmFuY2hDaG9pY2UpO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuRWxlbWVudHM7XG4gICAgY29uc3QgbmV4dEN1cnJlbnRJdGVtRHJvcDogSURpYWdyYW1FbGVtZW50ID0gZWxlbWVudHM/LmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGl0ZW1Ecm9wLm5leHRfaWQpIGFzIElEaWFncmFtRWxlbWVudDtcblxuICAgIGlmICghbmV4dEN1cnJlbnRJdGVtRHJvcCAmJiBkYXRhRHJvcC5jb2RlICE9PSBjYW52YXNDb25maWdSZWFkb25seSgpLlRZUEVfRUxFTUVOVF9FWElUKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZGV4SXRlbURyb3AgPSBlbGVtZW50cz8uZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmlkID09PSBpdGVtRHJvcC5pZCk7XG4gICAgY29uc3QgbmV3RWxlbWVudCA9IHsgLi4uY2xvbmVEZWVwKGRhdGFEcm9wKSwgcHJlX2lkOiBpdGVtRHJvcC5pZCwgbmV4dF9pZDogZGF0YURyb3AuY29kZSAhPT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfRVhJVCA/IG5leHRDdXJyZW50SXRlbURyb3AuaWQgOiAnJyB9O1xuXG4gICAgaWYgKCFkYXRhRHJvcC5pZCkge1xuICAgICAgbmV3RWxlbWVudC5pZCA9IGAke3V1aWQoKX1gO1xuICAgIH1cblxuICAgIGl0ZW1Ecm9wLm5leHRfaWQgPSBuZXdFbGVtZW50LmlkO1xuXG4gICAgaWYgKG5leHRDdXJyZW50SXRlbURyb3ApIHtcbiAgICAgIG5leHRDdXJyZW50SXRlbURyb3AucHJlX2lkID0gbmV3RWxlbWVudC5pZDtcbiAgICB9XG4gICAgZWxlbWVudHM/LnNwbGljZSgoaW5kZXhJdGVtRHJvcCBhcyBudW1iZXIpICsgMSwgMCwgbmV3RWxlbWVudCk7XG4gICAgY29uc3QgZmxhdEVsZW1lbnRzID0gdGhpcy5GbGF0RWxlbWVudHM7XG4gICAgY29uc3QgYWZ0ZXJFbGVtZW50ID0gZmxhdEVsZW1lbnRzPy5maW5kKChlbCkgPT4gZWwucHJlX2lkID09PSBuZXdFbGVtZW50LmlkKTtcblxuICAgIGlmICghYWZ0ZXJFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJlZm9yZUVsZW1lbnQgPSBmbGF0RWxlbWVudHM/LmZpbHRlcigoZWwpID0+IGVsLmlkICE9PSBuZXdFbGVtZW50LmlkICYmIGVsLm5leHRfaWQgPT09IGFmdGVyRWxlbWVudC5pZCk7XG5cbiAgICBiZWZvcmVFbGVtZW50Py5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBlbGVtZW50Lm5leHRfaWQgPSBuZXdFbGVtZW50LmlkO1xuICAgIH0pO1xuICAgIGlmIChkYXRhRHJvcC5lbGVtZW50X3R5cGUgIT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX1dPUktGTE9XKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWRkRWxlbWVudEV4aXRXb3JrRmxvdyhuZXdFbGVtZW50LCBicmFuY2hDaG9pY2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFbGVtZW50VG9CcmFuY2goaXRlbURyb3A6IElEaWFncmFtRWxlbWVudCwgYnJhbmNoRHJvcDogSURpYWdyYW1FbGVtZW50QnJhbmNoLCBkYXRhRHJvcDogSURpYWdyYW1FbGVtZW50LCBudW1iZXJCcmFuY2g/OiBudW1iZXIpIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGJyYW5jaERyb3AuZWxlbWVudHM7XG4gICAgbGV0IG5leHRDdXJyZW50SXRlbURyb3AgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGluZGV4SXRlbURyb3AgPSAtMTtcblxuICAgIGlmIChlbGVtZW50cyAmJiBlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGluZGV4SXRlbURyb3AgPSBlbGVtZW50cy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IGl0ZW1Ecm9wLmlkKTtcbiAgICAgIG5leHRDdXJyZW50SXRlbURyb3AgPSBlbGVtZW50cy5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSBpdGVtRHJvcC5uZXh0X2lkKSBhcyBJRGlhZ3JhbUVsZW1lbnQ7XG4gICAgICBpZiAoIW5leHRDdXJyZW50SXRlbURyb3AgJiYgaW5kZXhJdGVtRHJvcCA9PT0gLTEpIHtcbiAgICAgICAgbmV4dEN1cnJlbnRJdGVtRHJvcCA9IGVsZW1lbnRzW2luZGV4SXRlbURyb3AgKyAxXTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IG5leHRJZCA9IChuZXh0Q3VycmVudEl0ZW1Ecm9wICYmIG5leHRDdXJyZW50SXRlbURyb3AuaWQpIHx8IGl0ZW1Ecm9wLm5leHRfaWQ7XG5cbiAgICBpZiAoZGF0YURyb3AuY29kZSA9PT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfRVhJVCkge1xuICAgICAgbmV4dElkID0gJyc7XG4gICAgfVxuICAgIGNvbnN0IG5ld0VsZW1lbnQ6IElEaWFncmFtRWxlbWVudCA9IHsgLi4uZGF0YURyb3AsIHByZV9pZDogaXRlbURyb3AuaWQsIG5leHRfaWQ6IG5leHRJZCB9O1xuXG4gICAgaWYgKCFkYXRhRHJvcC5pZCkge1xuICAgICAgbmV3RWxlbWVudC5pZCA9IGAke3V1aWQoKX1gO1xuICAgIH1cblxuICAgIGlmICghaXRlbURyb3AuYnJhbmNoZXMgfHwgIWl0ZW1Ecm9wLmJyYW5jaGVzLmZpbmQoKGJyYW5jaCkgPT4gYnJhbmNoID09PSBicmFuY2hEcm9wKSkge1xuICAgICAgaXRlbURyb3AubmV4dF9pZCA9IG5ld0VsZW1lbnQuaWQ7XG4gICAgfVxuXG4gICAgaWYgKG5leHRDdXJyZW50SXRlbURyb3ApIHtcbiAgICAgIG5leHRDdXJyZW50SXRlbURyb3AucHJlX2lkID0gbmV3RWxlbWVudC5pZDtcbiAgICB9XG4gICAgZWxlbWVudHM/LnNwbGljZShpbmRleEl0ZW1Ecm9wICsgMSwgMCwgbmV3RWxlbWVudCBhcyBJRGlhZ3JhbUVsZW1lbnQpO1xuICAgIGlmIChpdGVtRHJvcCAmJiBpdGVtRHJvcC5lbGVtZW50X3R5cGUgPT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX1dPUktGTE9XKSB7XG4gICAgICB0aGlzLnVwZGF0ZU5leHRJZE9mQ2hpbGRFbGVtZW50SW5FbGVtZW50V29ya2Zsb3coaXRlbURyb3AsIHRoaXMuRmxhdEVsZW1lbnRzPy5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSBpdGVtRHJvcC5uZXh0X2lkKSBhcyBJRGlhZ3JhbUVsZW1lbnQpO1xuICAgIH1cbiAgICBpZiAoZGF0YURyb3AuY29kZSA9PT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfRVhJVCkge1xuICAgICAgdGhpcy5jaGVja0VuZE1vdmVFbGVtZW50V2hlbkRyb3BFbGVtZW50Q29kZUV4aXQoYnJhbmNoRHJvcCk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGFEcm9wLmVsZW1lbnRfdHlwZSAhPT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfV09SS0ZMT1cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRFbGVtZW50RXhpdFdvcmtGbG93KG5ld0VsZW1lbnQsIG51bWJlckJyYW5jaCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU5leHRJZE9mQ2hpbGRFbGVtZW50SW5FbGVtZW50V29ya2Zsb3coZWxlbWVudFdvcmtmbG93OiBJRGlhZ3JhbUVsZW1lbnQsIG5leHRFbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnRXb3JrZmxvdyB8fCBlbGVtZW50V29ya2Zsb3cuZWxlbWVudF90eXBlICE9PSBjYW52YXNDb25maWdSZWFkb25seSgpLlRZUEVfRUxFTUVOVF9XT1JLRkxPVyB8fCAhbmV4dEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmxhdEVsZW1lbnQ6IEFycmF5PElEaWFncmFtRWxlbWVudD4gPSBbXTtcblxuICAgIExpYnNVaURpYWdyYW1EcmF3Q2FudmFzVXRpbC5mbGF0RWxlbWVudEhhc0JyYW5jaChuZXh0RWxlbWVudCwgZmxhdEVsZW1lbnQpO1xuICAgIGVsZW1lbnRXb3JrZmxvdy5icmFuY2hlcz8uZm9yRWFjaCgoYnJhbmNoKSA9PiB7XG4gICAgICBpZiAoIWJyYW5jaC5lbGVtZW50cyB8fCAhYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50cyA9IGJyYW5jaC5lbGVtZW50cyBhcyBJRGlhZ3JhbUVsZW1lbnRbXTtcblxuICAgICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4ICE9PSBlbGVtZW50cy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQuZWxlbWVudF90eXBlID09PSBjYW52YXNDb25maWdSZWFkb25seSgpLlRZUEVfRUxFTUVOVF9XT1JLRkxPVyAmJiBlbGVtZW50Lm5leHRfaWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU5leHRJZE9mQ2hpbGRFbGVtZW50SW5FbGVtZW50V29ya2Zsb3coZWxlbWVudCwgZWxlbWVudHNbaW5kZXggKyAxXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtZW50LmNvZGUgPT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQgfHwgZWxlbWVudC5pZCA9PT0gbmV4dEVsZW1lbnQuaWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQucHJlX2lkID09PSBuZXh0RWxlbWVudC5pZCB8fCBmbGF0RWxlbWVudC5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSBlbGVtZW50LmlkKSkge1xuICAgICAgICAgIC8vIHRyxrDhu51uZyBo4bujcCBn4buNaSDEkeG7hyBxdXkgTmV4dEVsZW1lbnQgbMOgIGto4buRaSB0csaw4bubYyBob+G6t2MgY2hhIGPhu6dhIGPDoWMgZWxlbWVudCBoaeG7h24gdOG6oWlcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnQuZWxlbWVudF90eXBlID09PSBjYW52YXNDb25maWdSZWFkb25seSgpLlRZUEVfRUxFTUVOVF9XT1JLRkxPVykge1xuICAgICAgICAgIGlmIChlbGVtZW50Lm5leHRfaWQpIHtcbiAgICAgICAgICAgIGVsZW1lbnQubmV4dF9pZCA9IG5leHRFbGVtZW50LmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVOZXh0SWRPZkNoaWxkRWxlbWVudEluRWxlbWVudFdvcmtmbG93KGVsZW1lbnQsIG5leHRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudFdvcmtmbG93Lm5leHRfaWQgIT09IG5leHRFbGVtZW50LmlkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQubmV4dF9pZCA9IG5leHRFbGVtZW50LmlkO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRW5kTW92ZUVsZW1lbnRXaGVuRHJvcEVsZW1lbnRDb2RlRXhpdChjdXJyZW50QnJhbmNoOiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2gpIHtcbiAgICBjb25zdCBmbGF0RWxlbWVudHMgPSB0aGlzLkZsYXRFbGVtZW50cztcbiAgICBjb25zdCBlbGVtZW50SGFzQ3VycmVudEJyYW5jaCA9IGZsYXRFbGVtZW50cz8uZmluZCgoZWwpID0+IGVsLmJyYW5jaGVzICYmICEhZWwuYnJhbmNoZXMuZmluZCgoYnJhbmNoKSA9PiBicmFuY2ggPT09IGN1cnJlbnRCcmFuY2gpKTtcblxuICAgIGlmICghZWxlbWVudEhhc0N1cnJlbnRCcmFuY2gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEVsZW1lbnQ6IElEaWFncmFtRWxlbWVudCA9IGZsYXRFbGVtZW50cz8uZmluZCgoZWwpID0+IGVsLmlkID09PSBlbGVtZW50SGFzQ3VycmVudEJyYW5jaC5uZXh0X2lkKSBhcyBJRGlhZ3JhbUVsZW1lbnQ7XG5cbiAgICBpZiAoIW5leHRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRhdGFFbGVtZW50SGFzQ3VycmVudEJyYW5jaCA9IExpYnNVaURpYWdyYW1EcmF3Q2FudmFzVXRpbC5nZXREZWZhdWx0U3RvcmFnZUJyYW5jaEVuZENvdW50KCk7XG5cbiAgICBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwuZ2V0QnJhbmNoQ29udGFpbmVyQW5kQ291bnRFbGVtZW50SGFzTmV4dElkVG9FbGVtZW50KGVsZW1lbnRIYXNDdXJyZW50QnJhbmNoLCBuZXh0RWxlbWVudC5pZCBhcyBzdHJpbmcsIGRhdGFFbGVtZW50SGFzQ3VycmVudEJyYW5jaCwgdGhpcy5GbGF0RWxlbWVudHMgYXMgSURpYWdyYW1FbGVtZW50W10pO1xuICAgIGlmICghZGF0YUVsZW1lbnRIYXNDdXJyZW50QnJhbmNoLmJyYW5jaEVtcHR5ICYmIGRhdGFFbGVtZW50SGFzQ3VycmVudEJyYW5jaC5jb3VudCA9PT0gMCkge1xuICAgICAgZWxlbWVudEhhc0N1cnJlbnRCcmFuY2gubmV4dF9pZCA9ICcnO1xuICAgIH1cbiAgICBjb25zdCBlbGVtZW50TmV4dFRvSWQgPSBmbGF0RWxlbWVudHM/LmZpbmQoKGVsKSA9PiBlbC5uZXh0X2lkID09PSBuZXh0RWxlbWVudC5pZCk7IC8vIEto4buRaSBjaGFcblxuICAgIGlmICghZWxlbWVudE5leHRUb0lkIHx8IGVsZW1lbnROZXh0VG9JZC5lbGVtZW50X3R5cGUgIT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX1dPUktGTE9XIHx8ICFlbGVtZW50TmV4dFRvSWQubmV4dF9pZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZGF0YUZpc3RFbGVtZW50ID0gZGF0YUVsZW1lbnRIYXNDdXJyZW50QnJhbmNoO1xuXG4gICAgaWYgKGVsZW1lbnRIYXNDdXJyZW50QnJhbmNoLmlkICE9PSBlbGVtZW50TmV4dFRvSWQuaWQpIHtcbiAgICAgIGRhdGFGaXN0RWxlbWVudCA9IExpYnNVaURpYWdyYW1EcmF3Q2FudmFzVXRpbC5nZXREZWZhdWx0U3RvcmFnZUJyYW5jaEVuZENvdW50KCk7XG4gICAgICBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwuZ2V0QnJhbmNoQ29udGFpbmVyQW5kQ291bnRFbGVtZW50SGFzTmV4dElkVG9FbGVtZW50KGVsZW1lbnROZXh0VG9JZCwgbmV4dEVsZW1lbnQuaWQgYXMgc3RyaW5nLCBkYXRhRmlzdEVsZW1lbnQsIHRoaXMuRmxhdEVsZW1lbnRzIGFzIElEaWFncmFtRWxlbWVudFtdKTtcbiAgICB9XG4gICAgaWYgKGRhdGFGaXN0RWxlbWVudC5jb3VudCA+IDEgfHwgIWRhdGFGaXN0RWxlbWVudC5icmFuY2hDb250YWluZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYnJhbmNoQWRkSXRlbSA9IGRhdGFGaXN0RWxlbWVudC5icmFuY2hDb250YWluZXI7XG5cbiAgICBpZiAoZWxlbWVudEhhc0N1cnJlbnRCcmFuY2guaWQgPT09IGVsZW1lbnROZXh0VG9JZC5pZCkge1xuICAgICAgaWYgKG5leHRFbGVtZW50LmNvZGUgIT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQpIHtcbiAgICAgICAgdGhpcy5tb3ZlRWxlbWVudHNUb0JyYW5jaChuZXh0RWxlbWVudCwgYnJhbmNoQWRkSXRlbSk7XG4gICAgICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gTGlic1VpRGlhZ3JhbURyYXdDYW52YXNVdGlsLmdldEVsZW1lbnRIYXNDdXJyZW50QnJhbmNoT3JDdXJyZW50RWxlbWVudCh1bmRlZmluZWQsIGVsZW1lbnRIYXNDdXJyZW50QnJhbmNoLCB0aGlzLkZsYXRFbGVtZW50cyk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwuZ2V0RGVmYXVsdFN0b3JhZ2VCcmFuY2hFbmRDb3VudCgpO1xuICAgICAgICBjb25zdCBlbGVtZW50Q291bnQgPSBlbGVtZW50ICYmIGVsZW1lbnQubmV4dF9pZCA/IGVsZW1lbnQgOiBlbGVtZW50SGFzQ3VycmVudEJyYW5jaDtcbiAgICAgICAgLy8gRml4YnVnOiAxNTc3MVxuXG4gICAgICAgIExpYnNVaURpYWdyYW1EcmF3Q2FudmFzVXRpbC5nZXRCcmFuY2hDb250YWluZXJBbmRDb3VudEVsZW1lbnRIYXNOZXh0SWRUb0VsZW1lbnQoZWxlbWVudENvdW50LCBlbGVtZW50Q291bnQubmV4dF9pZCBhcyBzdHJpbmcsIGRhdGEsIHRoaXMuRmxhdEVsZW1lbnRzIGFzIElEaWFncmFtRWxlbWVudFtdKTtcbiAgICAgICAgaWYgKCFkYXRhLmNvdW50KSB7XG4gICAgICAgICAgcmV0dXJuIChlbGVtZW50Q291bnQubmV4dF9pZCA9ICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnRIYXNDdXJyZW50QnJhbmNoLm5leHRfaWQgPSAnJztcbiAgICAgIGNvbnN0IGVsZW1lbnRIYXNCcmFuY2hlc05vdFJlc2V0SWQgPSB0aGlzLmRlbGV0ZUVsZW1lbnQobmV4dEVsZW1lbnQpO1xuXG4gICAgICBpZiAoIWVsZW1lbnRIYXNCcmFuY2hlc05vdFJlc2V0SWQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lRWxlbWVudEFuZEFkZEVsZW1lbnRFWGl0VG9CcmFuY2goZWxlbWVudEhhc0N1cnJlbnRCcmFuY2gsIGJyYW5jaEFkZEl0ZW0sIG5leHRFbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgZGF0YSwgZWxlbWVudCB9ID0gZWxlbWVudEhhc0JyYW5jaGVzTm90UmVzZXRJZFswXTtcbiAgICAgIGNvbnN0IGluZm9PZkVsZW1lbnQgPSBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwuZ2V0RWxlbWVudEhhc0N1cnJlbnRCcmFuY2hPckN1cnJlbnRFbGVtZW50KHVuZGVmaW5lZCwgZWxlbWVudCwgdGhpcy5GbGF0RWxlbWVudHMpO1xuICAgICAgY29uc3QgcGFyZW50T2ZFbGVtZW50ID0gaW5mb09mRWxlbWVudC5lbGVtZW50O1xuICAgICAgbGV0IGRhdGFPZkVsZW1lbnRJbmZvID0gTGlic1VpRGlhZ3JhbURyYXdDYW52YXNVdGlsLmdldERlZmF1bHRTdG9yYWdlQnJhbmNoRW5kQ291bnQoKTtcblxuICAgICAgTGlic1VpRGlhZ3JhbURyYXdDYW52YXNVdGlsLmdldEJyYW5jaENvbnRhaW5lckFuZENvdW50RWxlbWVudEhhc05leHRJZFRvRWxlbWVudChwYXJlbnRPZkVsZW1lbnQgYXMgSURpYWdyYW1FbGVtZW50LCBwYXJlbnRPZkVsZW1lbnQ/Lm5leHRfaWQgYXMgc3RyaW5nLCBkYXRhT2ZFbGVtZW50SW5mbywgdGhpcy5GbGF0RWxlbWVudHMgYXMgSURpYWdyYW1FbGVtZW50W10pO1xuICAgICAgaWYgKGVsZW1lbnRIYXNCcmFuY2hlc05vdFJlc2V0SWQubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGlmIChkYXRhLmNvdW50ID4gMSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lRWxlbWVudEFuZEFkZEVsZW1lbnRFWGl0VG9CcmFuY2goZWxlbWVudCwgYnJhbmNoQWRkSXRlbSwgbmV4dEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhRmlzdEVsZW1lbnQuYnJhbmNoQ29udGFpbmVyICE9PSBkYXRhLmJyYW5jaENvbnRhaW5lciAmJiBkYXRhRmlzdEVsZW1lbnQuY291bnQgPT09IDEpIHtcbiAgICAgICAgICB0aGlzLmNsb25lRWxlbWVudEFuZEFkZEVsZW1lbnRFWGl0VG9CcmFuY2goZWxlbWVudEhhc0N1cnJlbnRCcmFuY2gsIGJyYW5jaEFkZEl0ZW0sIG5leHRFbGVtZW50KTtcbiAgICAgICAgICBkYXRhT2ZFbGVtZW50SW5mbyA9IExpYnNVaURpYWdyYW1EcmF3Q2FudmFzVXRpbC5nZXREZWZhdWx0U3RvcmFnZUJyYW5jaEVuZENvdW50KCk7XG4gICAgICAgICAgTGlic1VpRGlhZ3JhbURyYXdDYW52YXNVdGlsLmdldEJyYW5jaENvbnRhaW5lckFuZENvdW50RWxlbWVudEhhc05leHRJZFRvRWxlbWVudChwYXJlbnRPZkVsZW1lbnQgYXMgSURpYWdyYW1FbGVtZW50LCBwYXJlbnRPZkVsZW1lbnQ/Lm5leHRfaWQgYXMgc3RyaW5nLCBkYXRhT2ZFbGVtZW50SW5mbywgdGhpcy5GbGF0RWxlbWVudHMgYXMgSURpYWdyYW1FbGVtZW50W10pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhT2ZFbGVtZW50SW5mby5jb3VudCA+IDEpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRml4YnVnOiAxNTUxOFxuICAgICAgICBpZiAoZGF0YS5icmFuY2hDb250YWluZXIpIHtcbiAgICAgICAgICB0aGlzLmNsb25lRWxlbWVudEFuZEFkZEVsZW1lbnRFWGl0VG9CcmFuY2goZWxlbWVudCwgZGF0YS5icmFuY2hDb250YWluZXIsIG5leHRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwuZ2V0QnJhbmNoQ29udGFpbmVyQW5kQ291bnRFbGVtZW50SGFzTmV4dElkVG9FbGVtZW50KFxuICAgICAgICAgIHBhcmVudE9mRWxlbWVudCBhcyBJRGlhZ3JhbUVsZW1lbnQsXG4gICAgICAgICAgcGFyZW50T2ZFbGVtZW50Py5uZXh0X2lkIGFzIHN0cmluZyxcbiAgICAgICAgICBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwuZ2V0RGVmYXVsdFN0b3JhZ2VCcmFuY2hFbmRDb3VudCgpLFxuICAgICAgICAgIHRoaXMuRmxhdEVsZW1lbnRzIGFzIElEaWFncmFtRWxlbWVudFtdXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5jbG9uZUVsZW1lbnRBbmRBZGRFbGVtZW50RVhpdFRvQnJhbmNoKGVsZW1lbnQsIGJyYW5jaEFkZEl0ZW0sIG5leHRFbGVtZW50KTtcbiAgICAgIGNvbnN0IGZsYXRFbGVtZW50ID0gdGhpcy5GbGF0RWxlbWVudHM7XG5cbiAgICAgIGVsZW1lbnRIYXNCcmFuY2hlc05vdFJlc2V0SWQuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBjb25zdCB7IGVsZW1lbnQgfSA9IGl0ZW07XG5cbiAgICAgICAgaWYgKGVsZW1lbnQubmV4dF9pZCAmJiBmbGF0RWxlbWVudD8uZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZWxlbWVudC5uZXh0X2lkKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmZvRnJvbUVsZW1lbnQgPSBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwuZ2V0RWxlbWVudEhhc0N1cnJlbnRCcmFuY2hPckN1cnJlbnRFbGVtZW50KHVuZGVmaW5lZCwgZWxlbWVudCwgZmxhdEVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChpbmZvRnJvbUVsZW1lbnQuZWxlbWVudCkge1xuICAgICAgICAgIGVsZW1lbnQubmV4dF9pZCA9IGluZm9Gcm9tRWxlbWVudC5lbGVtZW50Lm5leHRfaWQ7XG4gICAgICAgICAgdGhpcy51cGRhdGVOZXh0SWRPZkNoaWxkRWxlbWVudEluRWxlbWVudFdvcmtmbG93KGVsZW1lbnQsIGZsYXRFbGVtZW50cz8uZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gZWxlbWVudC5uZXh0X2lkKSBhcyBJRGlhZ3JhbUVsZW1lbnQpOyAvLyBGaXhCdWc6IDE1NzI5XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgTGlic1VpRGlhZ3JhbURyYXdDYW52YXNVdGlsLmdldEJyYW5jaENvbnRhaW5lckFuZENvdW50RWxlbWVudEhhc05leHRJZFRvRWxlbWVudChcbiAgICAgICAgcGFyZW50T2ZFbGVtZW50IGFzIElEaWFncmFtRWxlbWVudCxcbiAgICAgICAgcGFyZW50T2ZFbGVtZW50Py5uZXh0X2lkIGFzIHN0cmluZyxcbiAgICAgICAgTGlic1VpRGlhZ3JhbURyYXdDYW52YXNVdGlsLmdldERlZmF1bHRTdG9yYWdlQnJhbmNoRW5kQ291bnQoKSxcbiAgICAgICAgZmxhdEVsZW1lbnQgYXMgSURpYWdyYW1FbGVtZW50W11cbiAgICAgICk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5leHRFbGVtZW50LmNvZGUgIT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQpIHtcbiAgICAgIHRoaXMubW92ZUVsZW1lbnRzVG9CcmFuY2gobmV4dEVsZW1lbnQsIGJyYW5jaEFkZEl0ZW0pO1xuICAgICAgLy8ga2nhu4NtIHRyYSBraOG7kWkgY2hhIGNo4bupYSBjw6FjIGVsZW1lbnQgY8OzIGJyYW5jaCB4ZW0gY8OzIGVsZW1lbnQgbsOgbyBjb3VudCA9IDAgxJHhu4MgcmVzZXQgbmV4dF9pZCA9ICcnIGPhu6dhIGto4buRaSDEkcOzXG4gICAgICBjb25zdCBkYXRhT2ZFbGVtZW50TmV4dFRvSWQgPSBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwuZ2V0RGVmYXVsdFN0b3JhZ2VCcmFuY2hFbmRDb3VudCgpO1xuXG4gICAgICBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwuZ2V0QnJhbmNoQ29udGFpbmVyQW5kQ291bnRFbGVtZW50SGFzTmV4dElkVG9FbGVtZW50KGVsZW1lbnROZXh0VG9JZCwgZWxlbWVudE5leHRUb0lkLm5leHRfaWQsIGRhdGFPZkVsZW1lbnROZXh0VG9JZCwgdGhpcy5GbGF0RWxlbWVudHMgYXMgSURpYWdyYW1FbGVtZW50W10pO1xuICAgICAgaWYgKCFkYXRhT2ZFbGVtZW50TmV4dFRvSWQuY291bnQpIHtcbiAgICAgICAgZWxlbWVudE5leHRUb0lkLm5leHRfaWQgPSAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbGVtZW50TmV4dFRvSWQubmV4dF9pZCA9ICcnO1xuICAgIGVsZW1lbnRIYXNDdXJyZW50QnJhbmNoLm5leHRfaWQgPSAnJztcbiAgICBjb25zdCBlbGVtZW50SGFzQnJhbmNoZXNOb3RSZXNldElkID0gdGhpcy5kZWxldGVFbGVtZW50KG5leHRFbGVtZW50KTtcblxuICAgIGlmIChkYXRhRWxlbWVudEhhc0N1cnJlbnRCcmFuY2guYnJhbmNoQ29udGFpbmVyKSB7XG4gICAgICB0aGlzLmNsb25lRWxlbWVudEFuZEFkZEVsZW1lbnRFWGl0VG9CcmFuY2goZWxlbWVudEhhc0N1cnJlbnRCcmFuY2gsIGRhdGFFbGVtZW50SGFzQ3VycmVudEJyYW5jaC5icmFuY2hDb250YWluZXIsIG5leHRFbGVtZW50KTtcbiAgICB9XG4gICAgaWYgKGJyYW5jaEFkZEl0ZW0gJiYgYnJhbmNoQWRkSXRlbSAhPT0gZGF0YUVsZW1lbnRIYXNDdXJyZW50QnJhbmNoLmJyYW5jaENvbnRhaW5lcikge1xuICAgICAgdGhpcy5jbG9uZUVsZW1lbnRBbmRBZGRFbGVtZW50RVhpdFRvQnJhbmNoKGVsZW1lbnROZXh0VG9JZCwgYnJhbmNoQWRkSXRlbSwgbmV4dEVsZW1lbnQpOyAvLyBkw7JuZyBuw6B5IHPhur0ga2jhu59pIHThuqFvIGzhuqFpIG5leHRfaWQgY+G7p2Ega2jhu5FpIGNoYVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudEhhc0JyYW5jaGVzTm90UmVzZXRJZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8ga2nhu4NtIHRyYSBraOG7kWkgY2hhIGNo4bupYSBjw6FjIGVsZW1lbnQgY8OzIGJyYW5jaCB4ZW0gY8OzIGVsZW1lbnQgbsOgbyBjb3VudCA9IDAgxJHhu4MgcmVzZXQgbmV4dF9pZCA9ICcnIGPhu6dhIGto4buRaSDEkcOzXG4gICAgZGF0YUZpc3RFbGVtZW50ID0gTGlic1VpRGlhZ3JhbURyYXdDYW52YXNVdGlsLmdldERlZmF1bHRTdG9yYWdlQnJhbmNoRW5kQ291bnQoKTtcbiAgICBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwuZ2V0QnJhbmNoQ29udGFpbmVyQW5kQ291bnRFbGVtZW50SGFzTmV4dElkVG9FbGVtZW50KGVsZW1lbnROZXh0VG9JZCwgbmV4dEVsZW1lbnQuaWQgYXMgc3RyaW5nLCBkYXRhRmlzdEVsZW1lbnQsIHRoaXMuRmxhdEVsZW1lbnRzIGFzIElEaWFncmFtRWxlbWVudFtdKTtcbiAgICBpZiAoIWRhdGFGaXN0RWxlbWVudC5jb3VudCkge1xuICAgICAgLy8gbuG6v3Uga2jhu5FpIGNoYSBraeG7g20gdHJhIGto4buRaSBjaGEgY2jhu6lhIGPDoWMgZWxlbWVudCBjw7MgYnJhbmNoIGPDsyBjb3VudCA9IDAgdGjDrCByZXNldCBuZXh0X2lkID0gJydcbiAgICAgIGVsZW1lbnROZXh0VG9JZC5uZXh0X2lkID0gJyc7XG4gICAgfVxuICAgIGNvbnN0IG5ld0lkID0gZWxlbWVudEhhc0JyYW5jaGVzTm90UmVzZXRJZFswXS5lbGVtZW50Lm5leHRfaWQ7XG5cbiAgICBlbGVtZW50SGFzQnJhbmNoZXNOb3RSZXNldElkLmZvckVhY2goKGl0ZW0pID0+IChpdGVtLmVsZW1lbnQubmV4dF9pZCA9IG5ld0lkKSk7XG4gIH1cblxuICBwcml2YXRlIG1vdmVFbGVtZW50c1RvQnJhbmNoKGVsZW1lbnRTdGFydDogSURpYWdyYW1FbGVtZW50LCBicmFuY2hDb250YWluZXI6IElEaWFncmFtRWxlbWVudEJyYW5jaCkge1xuICAgIGlmICghZWxlbWVudFN0YXJ0IHx8IGVsZW1lbnRTdGFydC5jb2RlID09PSBjYW52YXNDb25maWdSZWFkb25seSgpLlRZUEVfRUxFTUVOVF9FWElUIHx8ICFicmFuY2hDb250YWluZXIgfHwgIWJyYW5jaENvbnRhaW5lci5lbGVtZW50cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZpbmRDb250YWluZXJIYXNFbGVtZW50U3RhcnQoZWxlbWVudFN0YXJ0LCB0aGlzLkVsZW1lbnRzIGFzIElEaWFncmFtRWxlbWVudFtdKTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgY29udGFpbmVyLCBpbmRleCB9ID0gcmVzdWx0O1xuICAgIGNvbnN0IGVsZW1lbnRzSGFzTW92ZTogQXJyYXk8SURpYWdyYW1FbGVtZW50PiA9IGNvbnRhaW5lci5zbGljZShOdW1iZXIoaW5kZXgpKTtcbiAgICBjb25zdCBlbGVtZW50c09mQnJhbmNoQ29udGFpbmVyID0gYnJhbmNoQ29udGFpbmVyLmVsZW1lbnRzO1xuICAgIGNvbnN0IGxhc3RFbGVtZW50T2ZCcmFuY2hDb250YWluZXIgPSBlbGVtZW50c09mQnJhbmNoQ29udGFpbmVyW2VsZW1lbnRzT2ZCcmFuY2hDb250YWluZXIubGVuZ3RoIC0gMV07XG5cbiAgICBlbGVtZW50c0hhc01vdmUuZm9yRWFjaCgoZWxlbWVudCkgPT4gdGhpcy5kZWxldGVFbGVtZW50KGVsZW1lbnQsIHRydWUpKTtcbiAgICBpZiAobGFzdEVsZW1lbnRPZkJyYW5jaENvbnRhaW5lciAmJiBsYXN0RWxlbWVudE9mQnJhbmNoQ29udGFpbmVyLmNvZGUgIT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQpIHtcbiAgICAgIGxhc3RFbGVtZW50T2ZCcmFuY2hDb250YWluZXIubmV4dF9pZCA9IGVsZW1lbnRTdGFydC5pZDtcbiAgICAgIGVsZW1lbnRTdGFydC5wcmVfaWQgPSBsYXN0RWxlbWVudE9mQnJhbmNoQ29udGFpbmVyLmlkO1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RFbGVtZW50TW92ZSA9IGVsZW1lbnRzSGFzTW92ZVtlbGVtZW50c0hhc01vdmUubGVuZ3RoIC0gMV07XG4gICAgbGV0IG5leHRFbGVtZW50ID0gZWxlbWVudFN0YXJ0O1xuXG4gICAgaWYgKGxhc3RFbGVtZW50TW92ZSAmJiBsYXN0RWxlbWVudE1vdmUubmV4dF9pZCkge1xuICAgICAgbmV4dEVsZW1lbnQgPSB0aGlzLkZsYXRFbGVtZW50cz8uZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gbGFzdEVsZW1lbnRNb3ZlLm5leHRfaWQpIGFzIElEaWFncmFtRWxlbWVudDtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVFbGVtZW50U3RhcnQ6IElEaWFncmFtRWxlbWVudCA9IGNvbnRhaW5lcltOdW1iZXIoaW5kZXgpIC0gMV07XG5cbiAgICBicmFuY2hDb250YWluZXIuZWxlbWVudHMucHVzaCguLi5lbGVtZW50c0hhc01vdmUpO1xuICAgIGlmICghcHJlRWxlbWVudFN0YXJ0IHx8IHByZUVsZW1lbnRTdGFydC5lbGVtZW50X3R5cGUgIT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX1dPUktGTE9XKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuZXh0RWxlbWVudCkge1xuICAgICAgdGhpcy51cGRhdGVOZXh0SWRPZkNoaWxkRWxlbWVudEluRWxlbWVudFdvcmtmbG93KHByZUVsZW1lbnRTdGFydCwgbmV4dEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluZENvbnRhaW5lckhhc0VsZW1lbnRTdGFydChlbGVtZW50U3RhcnQ6IElEaWFncmFtRWxlbWVudCwgY29udGFpbmVyQ2FwYWNpdHk6IEFycmF5PElEaWFncmFtRWxlbWVudD4pOiB7IGVsZW1lbnRTdGFydDogSURpYWdyYW1FbGVtZW50OyBpbmRleDogc3RyaW5nOyBjb250YWluZXI6IEFycmF5PElEaWFncmFtRWxlbWVudD4gfSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFjb250YWluZXJDYXBhY2l0eSB8fCAhY29udGFpbmVyQ2FwYWNpdHkubGVuZ3RoIHx8ICFlbGVtZW50U3RhcnQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaW5kZXggaW4gY29udGFpbmVyQ2FwYWNpdHkpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb250YWluZXJDYXBhY2l0eVtpbmRleF07XG5cbiAgICAgIGlmIChlbGVtZW50LmlkID09PSBlbGVtZW50U3RhcnQuaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlbGVtZW50U3RhcnQ6IGVsZW1lbnRTdGFydCxcbiAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgY29udGFpbmVyOiBjb250YWluZXJDYXBhY2l0eSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghZWxlbWVudC5icmFuY2hlcyB8fCAhZWxlbWVudC5icmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBicmFuY2hlcyA9IGVsZW1lbnQuYnJhbmNoZXM7XG5cbiAgICAgIGZvciAoY29uc3QgYnJhbmNoIG9mIGJyYW5jaGVzKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmluZENvbnRhaW5lckhhc0VsZW1lbnRTdGFydChlbGVtZW50U3RhcnQsIGJyYW5jaC5lbGVtZW50cyBhcyBJRGlhZ3JhbUVsZW1lbnRbXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWxldGVFbGVtZW50KGVsZW1lbnREZWxldGU6IElEaWFncmFtRWxlbWVudCwgaWdub3JlVXBkYXRlUHJlSWQ/OiBib29sZWFuKTogQXJyYXk8eyBlbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQ7IGRhdGE6IElCcmFuY2hFbmRDb3VudCB9PiB7XG4gICAgaWYgKCFlbGVtZW50RGVsZXRlIHx8ICFlbGVtZW50RGVsZXRlLmlkKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnRIYXNCcmFuY2hlc05vdFJlc2V0SWQgPSBuZXcgQXJyYXk8eyBlbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQ7IGRhdGE6IElCcmFuY2hFbmRDb3VudCB9PigpO1xuICAgIGNvbnN0IGZsYXRFbGVtZW50cyA9IHRoaXMuRmxhdEVsZW1lbnRzO1xuICAgIGNvbnN0IGVsZW1lbnRzSGFzTmV4dElkVG9FbGVtZW50RGVsZXRlID0gZmxhdEVsZW1lbnRzPy5maWx0ZXIoKGVsKSA9PiBlbC5uZXh0X2lkID09PSBlbGVtZW50RGVsZXRlLmlkKTtcbiAgICBjb25zdCBlbGVtZW50SGFzUHJlSWRUb0VsZW1lbnREZWxldGUgPSBmbGF0RWxlbWVudHM/LmZpbmQoKGVsKSA9PiBlbC5wcmVfaWQgPT09IGVsZW1lbnREZWxldGUuaWQgJiYgZWwuaWQgPT09IGVsZW1lbnREZWxldGUubmV4dF9pZCk7XG5cbiAgICBpZiAoIWlnbm9yZVVwZGF0ZVByZUlkICYmIGVsZW1lbnRIYXNQcmVJZFRvRWxlbWVudERlbGV0ZSkge1xuICAgICAgZWxlbWVudEhhc1ByZUlkVG9FbGVtZW50RGVsZXRlLnByZV9pZCA9IGVsZW1lbnREZWxldGUucHJlX2lkO1xuICAgIH1cbiAgICBlbGVtZW50c0hhc05leHRJZFRvRWxlbWVudERlbGV0ZT8uZm9yRWFjaCgoZWxlbWVudEhhc05leHRJZFRvRWxlbWVudERlbGV0ZSkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnRIYXNQcmVJZFRvRWxlbWVudERlbGV0ZSkge1xuICAgICAgICBlbGVtZW50SGFzTmV4dElkVG9FbGVtZW50RGVsZXRlLm5leHRfaWQgPSBlbGVtZW50SGFzUHJlSWRUb0VsZW1lbnREZWxldGUuaWQ7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVsZW1lbnREZWxldGUuY29kZSAhPT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfRVhJVCkge1xuICAgICAgICBpZiAoIWVsZW1lbnRIYXNQcmVJZFRvRWxlbWVudERlbGV0ZSAmJiBlbGVtZW50RGVsZXRlLm5leHRfaWQpIHtcbiAgICAgICAgICAvLyBGaXhidWc6IDE1NjIzXG4gICAgICAgICAgZWxlbWVudEhhc05leHRJZFRvRWxlbWVudERlbGV0ZS5uZXh0X2lkID0gZWxlbWVudERlbGV0ZS5uZXh0X2lkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGVsZW1lbnRIYXNOZXh0SWRUb0VsZW1lbnREZWxldGUuYnJhbmNoZXMgJiYgZWxlbWVudEhhc05leHRJZFRvRWxlbWVudERlbGV0ZS5icmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IExpYnNVaURpYWdyYW1EcmF3Q2FudmFzVXRpbC5nZXREZWZhdWx0U3RvcmFnZUJyYW5jaEVuZENvdW50KCk7XG5cbiAgICAgICAgTGlic1VpRGlhZ3JhbURyYXdDYW52YXNVdGlsLmdldEJyYW5jaENvbnRhaW5lckFuZENvdW50RWxlbWVudEhhc05leHRJZFRvRWxlbWVudChlbGVtZW50SGFzTmV4dElkVG9FbGVtZW50RGVsZXRlLCBlbGVtZW50RGVsZXRlLmlkIGFzIHN0cmluZywgZGF0YSwgdGhpcy5GbGF0RWxlbWVudHMgYXMgQXJyYXk8SURpYWdyYW1FbGVtZW50Pik7XG4gICAgICAgIGlmICghZGF0YS5jb3VudCkge1xuICAgICAgICAgIGVsZW1lbnRIYXNOZXh0SWRUb0VsZW1lbnREZWxldGUubmV4dF9pZCA9ICcnO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRIYXNCcmFuY2hlc05vdFJlc2V0SWQucHVzaCh7IGVsZW1lbnQ6IGVsZW1lbnRIYXNOZXh0SWRUb0VsZW1lbnREZWxldGUsIGRhdGEgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWxlbWVudEhhc05leHRJZFRvRWxlbWVudERlbGV0ZS5uZXh0X2lkID0gZWxlbWVudERlbGV0ZS5uZXh0X2lkO1xuICAgIH0pO1xuICAgIExpYnNVaURpYWdyYW1EcmF3Q2FudmFzVXRpbC5maW5kQW5kRGVsZXRlRWxlbWVudEZyb21Db250YWluZXIodGhpcy5FbGVtZW50cyBhcyBBcnJheTxJRGlhZ3JhbUVsZW1lbnQ+LCBlbGVtZW50RGVsZXRlKTtcblxuICAgIHJldHVybiBlbGVtZW50SGFzQnJhbmNoZXNOb3RSZXNldElkO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZUVsZW1lbnRBbmRBZGRFbGVtZW50RVhpdFRvQnJhbmNoKGVsZW1lbnRIYXNDdXJyZW50QnJhbmNoOiBJRGlhZ3JhbUVsZW1lbnQsIGJyYW5jaDogSURpYWdyYW1FbGVtZW50QnJhbmNoIHwgdW5kZWZpbmVkLCBkYXRhRHJvcDogSURpYWdyYW1FbGVtZW50KSB7XG4gICAgaWYgKCFkYXRhRHJvcCB8fCAhZWxlbWVudEhhc0N1cnJlbnRCcmFuY2ggfHwgIWJyYW5jaCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBlbGVtZW50RHJvcDogSURpYWdyYW1FbGVtZW50ID0gZWxlbWVudEhhc0N1cnJlbnRCcmFuY2g7XG5cbiAgICBpZiAoYnJhbmNoLmVsZW1lbnRzICYmIGJyYW5jaC5lbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGVsZW1lbnREcm9wID0gYnJhbmNoLmVsZW1lbnRzW2JyYW5jaC5lbGVtZW50cy5sZW5ndGggLSAxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hZGRFbGVtZW50VG9CcmFuY2goZWxlbWVudERyb3AsIGJyYW5jaCwgY2xvbmVEZWVwKGRhdGFEcm9wKSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEVsZW1lbnRFeGl0V29ya0Zsb3cobmV3RWxlbWVudDogSURpYWdyYW1FbGVtZW50LCBudW1iZXJCcmFuY2g/OiBudW1iZXIpIHtcbiAgICBjb25zdCBleGl0ID0ge1xuICAgICAgZWxlbWVudF90eXBlOiBjYW52YXNDb25maWdSZWFkb25seSgpLlRZUEVfRUxFTUVOVF9FWElULFxuICAgICAgY29kZTogY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfRVhJVCxcbiAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdpMThuX2VuZF9qb3VybmV5X25ldycpLFxuICAgICAgc3BlY2lmaWNfd2lkdGg6IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuV0lEVEhfRUxFTUVOVF9ERUZBVUxULFxuICAgICAgc3BlY2lmaWNfaGVpZ2h0OiBjYW52YXNDb25maWdSZWFkb25seSgpLkhFSUdIVF9FTEVNRU5UX0RFRkFVTFQsXG4gICAgICBzcGVjaWZpY194OiAwLFxuICAgICAgc3BlY2lmaWNfeTogMCxcbiAgICB9O1xuXG4gICAgaWYgKG5ld0VsZW1lbnQuYnJhbmNoZXMgJiYgbmV3RWxlbWVudC5icmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgIG5ld0VsZW1lbnQuYnJhbmNoZXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4ID09PSBudW1iZXJCcmFuY2gpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuZXdFbGVtZW50LmJyYW5jaGVzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkRWxlbWVudChuZXdFbGVtZW50LCBpdGVtLCBleGl0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGRFbGVtZW50RXhpdFdoZW5EZWxldGVEaXJlY3Rpb25MaW5lKGVsZW1lbnQ6IElEaWFncmFtRWxlbWVudCwgYnJhbmNoOiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2ggfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBleGl0ID0ge1xuICAgICAgZWxlbWVudF90eXBlOiBjYW52YXNDb25maWdSZWFkb25seSgpLlRZUEVfRUxFTUVOVF9FWElULFxuICAgICAgY29kZTogY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfRVhJVCxcbiAgICAgIG5hbWU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdpMThuX2VuZF9qb3VybmV5X25ldycpLFxuICAgICAgc3BlY2lmaWNfd2lkdGg6IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuV0lEVEhfRUxFTUVOVF9ERUZBVUxULFxuICAgICAgc3BlY2lmaWNfaGVpZ2h0OiBjYW52YXNDb25maWdSZWFkb25seSgpLkhFSUdIVF9FTEVNRU5UX0RFRkFVTFQsXG4gICAgICBzcGVjaWZpY194OiAwLFxuICAgICAgc3BlY2lmaWNfeTogMCxcbiAgICB9O1xuXG4gICAgZGVsZXRlIGVsZW1lbnQubm9kZU90aGVyQ29uZmlnO1xuICAgIHRoaXMuYWRkRWxlbWVudChlbGVtZW50LCBicmFuY2gsIGV4aXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEtoaSBt4buZdCBlbGVtZW50IGLhu4sgeG/DoSwgaMOgbSBuw6B5IHPhur0gdOG7sSDEkeG7mW5nIHRow6ptIGV4aXQgY2hvIHThuqV0IGPhuqMgY8OhYyBlbGVtZW50IHBow61hIHRyxrDhu5tjIMSRYW5nIHRy4buPIHThu5tpIGVsZW1lbnQgxJHDsy5cbiAgICovXG4gIHB1YmxpYyBhZGRFbGVtZW50RXhpdEZvckFsbEVsZW1lbnRQcmV2aW91c1doZW5FbGVtZW50RGVsZXRlKGVsZW1lbnRzRGVsZXRlOiBJRGlhZ3JhbUVsZW1lbnRbXSkge1xuICAgIGNvbnN0IGZsYXRFbGVtZW50ID0gdGhpcy5GbGF0RWxlbWVudHM7XG4gICAgY29uc3QgZmxhdEVsZW1lbnRzSW5FbGVtZW50RGVsZXRlOiBJRGlhZ3JhbUVsZW1lbnRbXSA9IFtdO1xuXG4gICAgTGlic1VpRGlhZ3JhbURyYXdDYW52YXNVdGlsLmJ1aWxkRmxhdEVsZW1lbnQoZWxlbWVudHNEZWxldGUsIGZsYXRFbGVtZW50c0luRWxlbWVudERlbGV0ZSk7XG5cbiAgICBmbGF0RWxlbWVudHNJbkVsZW1lbnREZWxldGUuZm9yRWFjaCgoZWxlbWVudERlbCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnREZWwucHJlX290aGVyX2lkICYmIGVsZW1lbnREZWwucHJlX290aGVyX2lkLmxlbmd0aCkge1xuICAgICAgICBlbGVtZW50RGVsLnByZV9vdGhlcl9pZC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IGZsYXRFbGVtZW50Py5maW5kKChlbCkgPT4gZWwuaWQgPT09IGl0ZW0pO1xuXG4gICAgICAgICAgaWYgKGVsZW1lbnQ/LmVsZW1lbnRfdHlwZSA9PT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfV09SS0ZMT1cgJiYgZWxlbWVudC5icmFuY2hlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbGVtZW50LmJyYW5jaGVzLmZvckVhY2goKGJyYW5jaCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWJyYW5jaC5uZXh0X290aGVyX2lkIHx8ICFicmFuY2gubmV4dF9vdGhlcl9pZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgaW5kZXhFbCA9IGJyYW5jaC5uZXh0X290aGVyX2lkLmZpbmRJbmRleCgoZWwpID0+IGVsID09PSBlbGVtZW50RGVsLmlkKTtcblxuICAgICAgICAgICAgICBpZiAoaW5kZXhFbCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBicmFuY2gubmV4dF9vdGhlcl9pZC5zcGxpY2UoaW5kZXhFbCwgMSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFicmFuY2gubmV4dF9vdGhlcl9pZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEVsZW1lbnRFeGl0V2hlbkRlbGV0ZURpcmVjdGlvbkxpbmUoZWxlbWVudCwgYnJhbmNoKTtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnN1YkNvZGVPZkVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5hdHRyaWJ1dGVTdmdEID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucG9zaXRpb25fZW5kID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGJyYW5jaC5ub2RlT3RoZXJDb25maWcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50Lm5leHRfb3RoZXJfaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbmRleEVsID0gZWxlbWVudC5uZXh0X290aGVyX2lkLmZpbmRJbmRleCgoZWwpID0+IGVsID09PSBlbGVtZW50RGVsLmlkKTtcblxuICAgICAgICAgIGlmIChpbmRleEVsICE9PSAtMSkge1xuICAgICAgICAgICAgZWxlbWVudC5uZXh0X290aGVyX2lkLnNwbGljZShpbmRleEVsLCAxKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWVsZW1lbnQubmV4dF9vdGhlcl9pZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50LmVsZW1lbnRfdHlwZSA9PT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfV09SS0ZMT1cpIHtcbiAgICAgICAgICAgICAgY29uc3QgZ2V0Q29uZmlnRGVmYXVsdEJyYW5jaGVzID0gdGhpcy5oYW5kbGVyRnVuY3Rpb24/LmdldENvbmZpZ0RlZmF1bHRCcmFuY2hlcyA/PyBnZXREZWZhdWx0Q29uZmlnQ29uc3RpdHVlbnRCcmFuY2hlcztcbiAgICAgICAgICAgICAgZ2V0Q29uZmlnRGVmYXVsdEJyYW5jaGVzKGVsZW1lbnQuY29kZSA/PyAnJywgZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBicmFuY2ggPSBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwuZ2V0QnJhbmNoT2ZFbGVtZW50KGVsZW1lbnQuaWQgPz8gJycsIHRoaXMuRmxhdEVsZW1lbnRzLCBjYW52YXNDb25maWdSZWFkb25seSgpLlRZUEVfRUxFTUVOVF9XT1JLRkxPVyk7XG5cbiAgICAgICAgICAgIHRoaXMuYWRkRWxlbWVudEV4aXRXaGVuRGVsZXRlRGlyZWN0aW9uTGluZShlbGVtZW50LCBicmFuY2gpO1xuICAgICAgICAgICAgZWxlbWVudC5zdWJDb2RlT2ZFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZWxlbWVudC5hdHRyaWJ1dGVTdmdEID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgZWxlbWVudC5wb3NpdGlvbl9lbmQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50RGVsLm5leHRfb3RoZXJfaWQgJiYgZWxlbWVudERlbC5uZXh0X290aGVyX2lkLmxlbmd0aCkge1xuICAgICAgICBlbGVtZW50RGVsLm5leHRfb3RoZXJfaWQuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmbGF0RWxlbWVudD8uZmluZCgoZWwpID0+IGVsLmlkID09PSBpdGVtKTtcblxuICAgICAgICAgIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5wcmVfb3RoZXJfaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbmRleEVsID0gZWxlbWVudC5wcmVfb3RoZXJfaWQuZmluZEluZGV4KChlbCkgPT4gZWwgPT09IGVsZW1lbnREZWwuaWQpO1xuXG4gICAgICAgICAgaWYgKGluZGV4RWwgIT09IC0xKSB7XG4gICAgICAgICAgICBlbGVtZW50LnByZV9vdGhlcl9pZC5zcGxpY2UoaW5kZXhFbCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnREZWwuZWxlbWVudF90eXBlID09PSBjYW52YXNDb25maWdSZWFkb25seSgpLlRZUEVfRUxFTUVOVF9XT1JLRkxPVyAmJiBlbGVtZW50RGVsLmJyYW5jaGVzPy5sZW5ndGgpIHtcbiAgICAgICAgZWxlbWVudERlbC5icmFuY2hlcy5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICAgICAgICBpZiAoIWJyYW5jaC5uZXh0X290aGVyX2lkIHx8ICFicmFuY2gubmV4dF9vdGhlcl9pZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmFuY2gubmV4dF9vdGhlcl9pZC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZmxhdEVsZW1lbnQ/LmZpbmQoKGVsKSA9PiBlbC5pZCA9PT0gaXRlbSk7XG5cbiAgICAgICAgICAgIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5wcmVfb3RoZXJfaWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpbmRleEVsID0gZWxlbWVudC5wcmVfb3RoZXJfaWQuZmluZEluZGV4KChlbCkgPT4gZWwgPT09IGVsZW1lbnREZWwuaWQpO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXhFbCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC5wcmVfb3RoZXJfaWQuc3BsaWNlKGluZGV4RWwsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZW1vdmVPckNoYW5nZUVsZW1lbnQoZWxlbWVudFJlbW92ZTogSURpYWdyYW1FbGVtZW50LCBlbGVtZW50Q2hhbmdlOiBJRGlhZ3JhbUVsZW1lbnQgfCB1bmRlZmluZWQsIGJyYW5jaENob29zZT86IG51bWJlcikge1xuICAgIGlmICghZWxlbWVudFJlbW92ZSB8fCBlbGVtZW50UmVtb3ZlLmNvZGUgPT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmxhdEVsZW1lbnRzID0gdGhpcy5GbGF0RWxlbWVudHM7XG4gICAgY29uc3QgcHJlRWxlbWVudCA9IGZsYXRFbGVtZW50cz8uZmluZCgoZWxlbWVudCkgPT4gZWxlbWVudC5pZCA9PT0gZWxlbWVudFJlbW92ZS5wcmVfaWQpO1xuICAgIGNvbnN0IGluZm9PZkVsZW1lbnRSZW1vdmUgPSBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwuZ2V0RWxlbWVudEhhc0N1cnJlbnRCcmFuY2hPckN1cnJlbnRFbGVtZW50KHVuZGVmaW5lZCwgZWxlbWVudFJlbW92ZSwgdGhpcy5GbGF0RWxlbWVudHMpO1xuXG4gICAgY29uc3QgZXhpdCA9IHtcbiAgICAgIGVsZW1lbnRfdHlwZTogY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfRVhJVCxcbiAgICAgIGNvZGU6IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQsXG4gICAgICBuYW1lOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnaTE4bl9vdXRfam91cm5leScpLFxuICAgICAgaWQ6IGAke3V1aWQoKX1gLFxuICAgICAgc3BlY2lmaWNfd2lkdGg6IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuV0lEVEhfRUxFTUVOVF9ERUZBVUxULFxuICAgICAgc3BlY2lmaWNfaGVpZ2h0OiBjYW52YXNDb25maWdSZWFkb25seSgpLkhFSUdIVF9FTEVNRU5UX0RFRkFVTFQsXG4gICAgICBzcGVjaWZpY194OiAwLFxuICAgICAgc3BlY2lmaWNfeTogMCxcbiAgICB9O1xuXG4gICAgY29uc3QgZWxlbWVudE5leHRCZWZvcmVEZWxldGUgPSBmbGF0RWxlbWVudHM/LmZpbmQoKGVsKSA9PiBlbC5wcmVfaWQgPT09IGVsZW1lbnRSZW1vdmUuaWQgJiYgZWwuaWQgPT09IGVsZW1lbnRSZW1vdmUubmV4dF9pZCk7XG5cbiAgICBpZiAoZWxlbWVudE5leHRCZWZvcmVEZWxldGUgJiYgZWxlbWVudE5leHRCZWZvcmVEZWxldGUuY29kZSA9PT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfRVhJVCkge1xuICAgICAgaWYgKHByZUVsZW1lbnQgJiYgcHJlRWxlbWVudC5lbGVtZW50X3R5cGUgPT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX1dPUktGTE9XICYmIGluZm9PZkVsZW1lbnRSZW1vdmUuY3VycmVudEJyYW5jaCkge1xuICAgICAgICBpbmZvT2ZFbGVtZW50UmVtb3ZlLmN1cnJlbnRCcmFuY2gubm9kZU90aGVyQ29uZmlnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKHByZUVsZW1lbnQgJiYgcHJlRWxlbWVudC5lbGVtZW50X3R5cGUgIT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX1dPUktGTE9XKSB7XG4gICAgICAgIHByZUVsZW1lbnQubm9kZU90aGVyQ29uZmlnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcmVFbGVtZW50ICYmICFlbGVtZW50TmV4dEJlZm9yZURlbGV0ZSkge1xuICAgICAgcHJlRWxlbWVudC5ub2RlT3RoZXJDb25maWcgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAocHJlRWxlbWVudCAmJiBwcmVFbGVtZW50LmVsZW1lbnRfdHlwZSA9PT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfV09SS0ZMT1cgJiYgaW5mb09mRWxlbWVudFJlbW92ZS5jdXJyZW50QnJhbmNoKSB7XG4gICAgICAgIGluZm9PZkVsZW1lbnRSZW1vdmUuY3VycmVudEJyYW5jaC5ub2RlT3RoZXJDb25maWcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5kZWxldGVFbGVtZW50KGVsZW1lbnRSZW1vdmUpO1xuXG4gICAgLy8geMOzYSB0aOG6s25nXG4gICAgaWYgKCFlbGVtZW50Q2hhbmdlKSB7XG4gICAgICBpZiAoIWVsZW1lbnROZXh0QmVmb3JlRGVsZXRlKSB7XG4gICAgICAgIHRoaXMuYWRkRWxlbWVudChwcmVFbGVtZW50IGFzIElEaWFncmFtRWxlbWVudCwgaW5mb09mRWxlbWVudFJlbW92ZS5jdXJyZW50QnJhbmNoIGFzIElEaWFncmFtRWxlbWVudEJyYW5jaCwgZXhpdCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB0aGF5IMSRxqFuID09IMSRxqFuLCB0aGF5IMSRxqFuID0gbmjDoW5oXG4gICAgaWYgKGVsZW1lbnRSZW1vdmUuZWxlbWVudF90eXBlICE9PSBjYW52YXNDb25maWdSZWFkb25seSgpLlRZUEVfRUxFTUVOVF9XT1JLRkxPVykge1xuICAgICAgaWYgKCFlbGVtZW50UmVtb3ZlLm5leHRfaWQgJiYgZWxlbWVudENoYW5nZS5lbGVtZW50X3R5cGUgIT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX1dPUktGTE9XKSB7XG4gICAgICAgIC8vIDQ4MjI5XG4gICAgICAgIHRoaXMuYWRkRWxlbWVudChwcmVFbGVtZW50IGFzIElEaWFncmFtRWxlbWVudCwgaW5mb09mRWxlbWVudFJlbW92ZS5jdXJyZW50QnJhbmNoIGFzIElEaWFncmFtRWxlbWVudEJyYW5jaCwgZXhpdCk7XG4gICAgICB9XG4gICAgICB0aGlzLmFkZEVsZW1lbnQocHJlRWxlbWVudCBhcyBJRGlhZ3JhbUVsZW1lbnQsIGluZm9PZkVsZW1lbnRSZW1vdmUuY3VycmVudEJyYW5jaCBhcyBJRGlhZ3JhbUVsZW1lbnRCcmFuY2gsIGVsZW1lbnRDaGFuZ2UsIGJyYW5jaENob29zZSk7XG4gICAgICBpZiAoZWxlbWVudENoYW5nZS5lbGVtZW50X3R5cGUgPT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX1dPUktGTE9XICYmIGVsZW1lbnROZXh0QmVmb3JlRGVsZXRlICYmIGVsZW1lbnROZXh0QmVmb3JlRGVsZXRlLmNvZGUgPT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQpIHtcbiAgICAgICAgdGhpcy5kZWxldGVFbGVtZW50KGVsZW1lbnROZXh0QmVmb3JlRGVsZXRlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRoYXkgbmjDoW5oID0gxJHGoW5cbiAgICBpZiAoZWxlbWVudENoYW5nZS5lbGVtZW50X3R5cGUgIT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX1dPUktGTE9XKSB7XG4gICAgICB0aGlzLmFkZEVsZW1lbnQocHJlRWxlbWVudCBhcyBJRGlhZ3JhbUVsZW1lbnQsIGluZm9PZkVsZW1lbnRSZW1vdmUuY3VycmVudEJyYW5jaCBhcyBJRGlhZ3JhbUVsZW1lbnRCcmFuY2gsIGV4aXQpO1xuICAgICAgdGhpcy5hZGRFbGVtZW50KHByZUVsZW1lbnQgYXMgSURpYWdyYW1FbGVtZW50LCBpbmZvT2ZFbGVtZW50UmVtb3ZlLmN1cnJlbnRCcmFuY2ggYXMgSURpYWdyYW1FbGVtZW50QnJhbmNoLCBlbGVtZW50Q2hhbmdlLCBicmFuY2hDaG9vc2UpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdGhheSBuaMOhbmggPSBuaMOhbmhcbiAgICB0aGlzLmFkZEVsZW1lbnQocHJlRWxlbWVudCBhcyBJRGlhZ3JhbUVsZW1lbnQsIGluZm9PZkVsZW1lbnRSZW1vdmUuY3VycmVudEJyYW5jaCBhcyBJRGlhZ3JhbUVsZW1lbnRCcmFuY2gsIGV4aXQpO1xuICAgIHRoaXMuYWRkRWxlbWVudChwcmVFbGVtZW50IGFzIElEaWFncmFtRWxlbWVudCwgaW5mb09mRWxlbWVudFJlbW92ZS5jdXJyZW50QnJhbmNoIGFzIElEaWFncmFtRWxlbWVudEJyYW5jaCwgZWxlbWVudENoYW5nZSwgYnJhbmNoQ2hvb3NlKTtcbiAgICB0aGlzLmRlbGV0ZUVsZW1lbnQoZXhpdCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZGVsZXRlQ2hhbmdlRWxlbWVudEFuZEluc2VydEJyYW5jaEtlZXAoZWxlbWVudFJlbW92ZTogSURpYWdyYW1FbGVtZW50LCBlbGVtZW50Q2hhbmdlOiBJRGlhZ3JhbUVsZW1lbnQgfCB1bmRlZmluZWQsIGJyYW5jaEtlZXBFbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2ggfCB1bmRlZmluZWQsIGJyYW5jaENob2ljZT86IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGZsYXRFbGVtZW50cyA9IHRoaXMuRmxhdEVsZW1lbnRzO1xuICAgIGNvbnN0IHByZUVsZW1lbnQgPSBmbGF0RWxlbWVudHM/LmZpbmQoKGVsZW1lbnQpID0+IGVsZW1lbnQuaWQgPT09IGVsZW1lbnRSZW1vdmUucHJlX2lkKTtcbiAgICBjb25zdCBpbmZvT2ZFbGVtZW50UmVtb3ZlID0gTGlic1VpRGlhZ3JhbURyYXdDYW52YXNVdGlsLmdldEVsZW1lbnRIYXNDdXJyZW50QnJhbmNoT3JDdXJyZW50RWxlbWVudCh1bmRlZmluZWQsIGVsZW1lbnRSZW1vdmUsIHRoaXMuRmxhdEVsZW1lbnRzKTtcblxuICAgIHRoaXMuYWRkQnJhbmNoS2VlcFRvRmxvdyhicmFuY2hLZWVwRWxlbWVudCwgcHJlRWxlbWVudCBhcyBJRGlhZ3JhbUVsZW1lbnQsIGluZm9PZkVsZW1lbnRSZW1vdmUuY3VycmVudEJyYW5jaCk7XG4gICAgdGhpcy5kZWxldGVFbGVtZW50KGVsZW1lbnRSZW1vdmUpO1xuICAgIGlmIChlbGVtZW50Q2hhbmdlKSB7XG4gICAgICB0aGlzLmFkZEVsZW1lbnQocHJlRWxlbWVudCBhcyBJRGlhZ3JhbUVsZW1lbnQsIGluZm9PZkVsZW1lbnRSZW1vdmUuY3VycmVudEJyYW5jaCBhcyBJRGlhZ3JhbUVsZW1lbnRCcmFuY2gsIGVsZW1lbnRDaGFuZ2UsIGJyYW5jaENob2ljZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRCcmFuY2hLZWVwVG9GbG93KGJyYW5jaEtlZXBFbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2ggfCB1bmRlZmluZWQsIGl0ZW1Ecm9wOiBJRGlhZ3JhbUVsZW1lbnQsIGJyYW5jaERyb3A6IElEaWFncmFtRWxlbWVudEJyYW5jaCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICghYnJhbmNoS2VlcEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWxlbWVudHMgPSBicmFuY2hLZWVwRWxlbWVudC5lbGVtZW50cztcbiAgICBjb25zdCBuZXh0Q3VycmVudEl0ZW1Ecm9wID0gZWxlbWVudHNbMF07XG5cbiAgICBpZiAobmV4dEN1cnJlbnRJdGVtRHJvcCkge1xuICAgICAgaWYgKGl0ZW1Ecm9wLmVsZW1lbnRfdHlwZSAhPT0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5UWVBFX0VMRU1FTlRfV09SS0ZMT1cpIHtcbiAgICAgICAgaXRlbURyb3AubmV4dF9pZCA9IG5leHRDdXJyZW50SXRlbURyb3AgJiYgbmV4dEN1cnJlbnRJdGVtRHJvcC5pZDtcbiAgICAgIH1cbiAgICAgIG5leHRDdXJyZW50SXRlbURyb3AucHJlX2lkID0gaXRlbURyb3AuaWQ7XG4gICAgfVxuICAgIGlmIChicmFuY2hEcm9wKSB7XG4gICAgICBicmFuY2hEcm9wLmVsZW1lbnRzLnB1c2goLi4uZWxlbWVudHMpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuRWxlbWVudHMucHVzaCguLi5lbGVtZW50cyk7XG4gIH1cbn1cbiJdfQ==
|