@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.
Files changed (33) hide show
  1. package/README.md +279 -0
  2. package/canvas.service.d.ts +42 -0
  3. package/diagram-draw.service.d.ts +91 -0
  4. package/direction.service.d.ts +43 -0
  5. package/esm2022/canvas.service.mjs +628 -0
  6. package/esm2022/diagram-draw.service.mjs +711 -0
  7. package/esm2022/direction.service.mjs +255 -0
  8. package/esm2022/index.mjs +6 -0
  9. package/esm2022/interfaces/canvas.interface.mjs +2 -0
  10. package/esm2022/interfaces/coordinates.interface.mjs +2 -0
  11. package/esm2022/interfaces/diagram.interface.mjs +2 -0
  12. package/esm2022/libs-ui-services-diagram-draw.mjs +5 -0
  13. package/esm2022/utils/calculator-branch.util.mjs +187 -0
  14. package/esm2022/utils/calculator-element.util.mjs +335 -0
  15. package/esm2022/utils/canvas.util.mjs +176 -0
  16. package/esm2022/utils/diagram.util.mjs +54 -0
  17. package/esm2022/utils/direction.util.mjs +103 -0
  18. package/esm2022/utils/horizontal/calculator-branch.util.mjs +243 -0
  19. package/esm2022/utils/horizontal/calculator-coordinates.util.mjs +315 -0
  20. package/fesm2022/libs-ui-services-diagram-draw.mjs +2982 -0
  21. package/fesm2022/libs-ui-services-diagram-draw.mjs.map +1 -0
  22. package/index.d.ts +5 -0
  23. package/interfaces/canvas.interface.d.ts +21 -0
  24. package/interfaces/coordinates.interface.d.ts +40 -0
  25. package/interfaces/diagram.interface.d.ts +109 -0
  26. package/package.json +27 -0
  27. package/utils/calculator-branch.util.d.ts +16 -0
  28. package/utils/calculator-element.util.d.ts +24 -0
  29. package/utils/canvas.util.d.ts +21 -0
  30. package/utils/diagram.util.d.ts +6 -0
  31. package/utils/direction.util.d.ts +6 -0
  32. package/utils/horizontal/calculator-branch.util.d.ts +67 -0
  33. 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==