@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,335 @@
|
|
|
1
|
+
import { canvasConfigReadonly } from '../diagram-draw.service';
|
|
2
|
+
import { MoLibDiagramCalculatorBranchUtil } from './calculator-branch.util';
|
|
3
|
+
import { buildFlatElement } from './diagram.util';
|
|
4
|
+
export class MoLibDiagramCalculatorCoordinatesUtil {
|
|
5
|
+
static setXYElements(elements, config, positionX) {
|
|
6
|
+
if (!elements || !elements.length) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
elements.forEach((currentElement, index) => {
|
|
10
|
+
currentElement.specific_x = (currentElement.specific_x ?? 0) + (positionX ?? 0);
|
|
11
|
+
const preElement = elements[index - 1];
|
|
12
|
+
if (preElement) {
|
|
13
|
+
currentElement.specific_x = (preElement.specific_x ?? 0) + (preElement.specific_width ?? 0) / 2 - (currentElement.specific_width ?? 0) / 2;
|
|
14
|
+
currentElement.specific_y = (preElement.specific_y ?? 0) + (preElement.specific_height ?? 0) + checkElementGetHeight(preElement.nodeOtherConfig);
|
|
15
|
+
if (preElement.position_end_branch) {
|
|
16
|
+
currentElement.specific_y = preElement.position_end_branch;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const top = currentElement.specific_y ?? 0;
|
|
20
|
+
const left = (currentElement.specific_x ?? 0) + (currentElement.specific_width ?? 0) / 2;
|
|
21
|
+
let lineBetweenElements = (currentElement.specific_height ?? 0) + checkElementGetHeight(currentElement.nodeOtherConfig);
|
|
22
|
+
if (currentElement.branches && currentElement.branches.length) {
|
|
23
|
+
lineBetweenElements = (currentElement.specific_height ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;
|
|
24
|
+
}
|
|
25
|
+
const maxY = (currentElement.specific_y ?? 0) + (currentElement.specific_height ?? 0) + 200;
|
|
26
|
+
const maxXLeft = (currentElement.specific_x ?? 0) + (currentElement.specific_width ?? 0) + 100;
|
|
27
|
+
const configSvg = config.widthHeightSvgCanvas;
|
|
28
|
+
configSvg.heightSvg = maxY > configSvg.heightSvg ? maxY : configSvg.heightSvg;
|
|
29
|
+
configSvg.widthSvg = maxXLeft > configSvg.widthSvg ? maxXLeft : configSvg.widthSvg;
|
|
30
|
+
checkMaxLeft(config, currentElement.specific_x, currentElement.branches?.[0].positionMaxLeft);
|
|
31
|
+
if (!currentElement.branches || !currentElement.branches.length) {
|
|
32
|
+
// các element không có nhánh mới vẽ đường thẳng
|
|
33
|
+
const drawFormToHeightExit = (currentElement.subCodeOfElement || currentElement.code) === canvasConfigReadonly().TYPE_ELEMENT_EXIT ? (currentElement.specific_height ?? 0) / 2 : lineBetweenElements;
|
|
34
|
+
currentElement.attributeSvgD = `M ${left} ${top} l 0 ${drawFormToHeightExit}`;
|
|
35
|
+
currentElement.position_end = top + lineBetweenElements;
|
|
36
|
+
if (currentElement.nodeOtherConfig) {
|
|
37
|
+
const waitHeight = getHeightWaitConfig(currentElement.nodeOtherConfig);
|
|
38
|
+
const distanceElementToWait = (currentElement.specific_height ?? 0) + canvasConfigReadonly().DISTANCE_TO_WAIT;
|
|
39
|
+
const topStartLine2 = top + distanceElementToWait + waitHeight;
|
|
40
|
+
currentElement.attributeSvgD = `M ${left} ${top} l 0 ${distanceElementToWait}`;
|
|
41
|
+
currentElement.position_end = topStartLine2 + lineBetweenElements;
|
|
42
|
+
currentElement.nodeOtherConfig.specific_y = top + distanceElementToWait;
|
|
43
|
+
currentElement.nodeOtherConfig.specific_x = left;
|
|
44
|
+
delete currentElement.nodeOtherConfig.attributeSvgD;
|
|
45
|
+
if (currentElement.subCodeOfElement !== canvasConfigReadonly().TYPE_ELEMENT_EXIT) {
|
|
46
|
+
currentElement.nodeOtherConfig.attributeSvgD = `M ${left} ${topStartLine2} l 0 ${canvasConfigReadonly().WAIT_TO_ELEMENT}`;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// start các element có nhánh
|
|
52
|
+
const half = Math.ceil(currentElement.branches.length / 2);
|
|
53
|
+
const aboveHalf = currentElement.branches.slice(0, half);
|
|
54
|
+
const underHalf = currentElement.branches.slice(half);
|
|
55
|
+
let brachMiddle;
|
|
56
|
+
if (aboveHalf.length !== underHalf.length) {
|
|
57
|
+
brachMiddle = aboveHalf.pop();
|
|
58
|
+
}
|
|
59
|
+
// TÍNH CHIỀU Cao TỐI ĐA CỦA NHÁNH
|
|
60
|
+
const maxHeightBranch = {
|
|
61
|
+
height: 0,
|
|
62
|
+
};
|
|
63
|
+
MoLibDiagramCalculatorCoordinatesUtil.calculatorMaxBranchHeight(currentElement, maxHeightBranch);
|
|
64
|
+
currentElement.maxHeightBranch = maxHeightBranch.height;
|
|
65
|
+
const maxWidthBrachMiddle = { width: 0, aboveWidth: 0, underWidth: 0 };
|
|
66
|
+
const lineFormElementToBranching = (currentElement.specific_height ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;
|
|
67
|
+
if (brachMiddle) {
|
|
68
|
+
this.calculatorWidthBranch(brachMiddle.elements, maxWidthBrachMiddle);
|
|
69
|
+
brachMiddle.widthBranch = {
|
|
70
|
+
width: maxWidthBrachMiddle.width,
|
|
71
|
+
above: maxWidthBrachMiddle.aboveWidth,
|
|
72
|
+
under: maxWidthBrachMiddle.underWidth,
|
|
73
|
+
};
|
|
74
|
+
MoLibDiagramCalculatorBranchUtil.drawStraightLine(left, lineFormElementToBranching, top, brachMiddle, maxHeightBranch.height, config);
|
|
75
|
+
}
|
|
76
|
+
let hasNextSameParentElementNext = false;
|
|
77
|
+
const aboveHalfReverse = aboveHalf.reverse();
|
|
78
|
+
aboveHalfReverse.forEach((branch, indexBranch) => {
|
|
79
|
+
if (!hasNextSameParentElementNext) {
|
|
80
|
+
const flatElementOnBranch = [];
|
|
81
|
+
buildFlatElement(branch.elements, flatElementOnBranch);
|
|
82
|
+
hasNextSameParentElementNext = !flatElementOnBranch || !flatElementOnBranch.length ? true : flatElementOnBranch.find((item) => item.next_id === currentElement.next_id) ? true : false;
|
|
83
|
+
}
|
|
84
|
+
branch.onTheSide = 'above';
|
|
85
|
+
const maxWidthBranch = { width: 0, aboveWidth: 0, underWidth: 0 }; // tính chiều ngang để cách nhánh trên or dưới
|
|
86
|
+
this.calculatorWidthBranch(branch.elements, maxWidthBranch);
|
|
87
|
+
branch.widthBranch = {
|
|
88
|
+
width: maxWidthBranch.width,
|
|
89
|
+
above: maxWidthBranch.aboveWidth,
|
|
90
|
+
under: maxWidthBranch.underWidth,
|
|
91
|
+
};
|
|
92
|
+
const branchPre = aboveHalfReverse[indexBranch - 1];
|
|
93
|
+
let lineBetweenBranch = maxWidthBranch.underWidth + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;
|
|
94
|
+
if (branchPre) {
|
|
95
|
+
lineBetweenBranch += (branchPre.widthBranch?.width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;
|
|
96
|
+
}
|
|
97
|
+
if (brachMiddle) {
|
|
98
|
+
lineBetweenBranch += (brachMiddle.widthBranch?.above ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;
|
|
99
|
+
}
|
|
100
|
+
// nhánh trái
|
|
101
|
+
MoLibDiagramCalculatorBranchUtil.leftLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch.height, currentElement, config);
|
|
102
|
+
});
|
|
103
|
+
underHalf.forEach((branch, indexBranch) => {
|
|
104
|
+
if (!hasNextSameParentElementNext) {
|
|
105
|
+
const flatElementOnBranch = [];
|
|
106
|
+
buildFlatElement(branch.elements, flatElementOnBranch);
|
|
107
|
+
hasNextSameParentElementNext = !flatElementOnBranch || !flatElementOnBranch.length ? true : flatElementOnBranch.find((item) => item.next_id === currentElement.next_id) ? true : false;
|
|
108
|
+
}
|
|
109
|
+
branch.onTheSide = 'under';
|
|
110
|
+
const maxWidthBranch = { width: 0, aboveWidth: 0, underWidth: 0 }; // tính chiều cao để cách nhánh trên or dưới
|
|
111
|
+
this.calculatorWidthBranch(branch.elements, maxWidthBranch);
|
|
112
|
+
branch.widthBranch = {
|
|
113
|
+
width: maxWidthBranch.width,
|
|
114
|
+
above: maxWidthBranch.aboveWidth,
|
|
115
|
+
under: maxWidthBranch.underWidth,
|
|
116
|
+
};
|
|
117
|
+
const branchPre = underHalf[indexBranch - 1];
|
|
118
|
+
let lineBetweenBranch = maxWidthBranch.aboveWidth + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;
|
|
119
|
+
if (branchPre) {
|
|
120
|
+
lineBetweenBranch += (branchPre.widthBranch?.width ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;
|
|
121
|
+
}
|
|
122
|
+
if (brachMiddle) {
|
|
123
|
+
lineBetweenBranch += (brachMiddle.widthBranch?.under ?? 0) + canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT / 2;
|
|
124
|
+
}
|
|
125
|
+
// nhánh phải
|
|
126
|
+
MoLibDiagramCalculatorBranchUtil.rightLine(left, lineFormElementToBranching, top, lineBetweenBranch, branch, maxHeightBranch.height, currentElement, config);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
// Set translateX và translateY để có thể render nodes
|
|
130
|
+
this.setTranslatePositions(elements);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Set translateX và translateY từ specific_x và specific_y cho tất cả elements (bao gồm branches)
|
|
134
|
+
*/
|
|
135
|
+
static setTranslatePositions(elements) {
|
|
136
|
+
elements.forEach((element) => {
|
|
137
|
+
// Set position cho element chính
|
|
138
|
+
element.translateX = element.specific_x;
|
|
139
|
+
element.translateY = element.specific_y;
|
|
140
|
+
// Set position cho nodeOtherConfig nếu có
|
|
141
|
+
if (element.nodeOtherConfig) {
|
|
142
|
+
const offsetX = (element.nodeOtherConfig.specific_width ?? 0) / 2;
|
|
143
|
+
element.nodeOtherConfig.translateX = (element.nodeOtherConfig.specific_x ?? 0) - offsetX;
|
|
144
|
+
element.nodeOtherConfig.translateY = element.nodeOtherConfig.specific_y;
|
|
145
|
+
}
|
|
146
|
+
// Recursively set positions cho elements trong branches
|
|
147
|
+
if (element.branches && element.branches.length > 0) {
|
|
148
|
+
element.branches.forEach((branch) => {
|
|
149
|
+
// Set position cho branch nodeOtherConfig nếu có
|
|
150
|
+
if (branch.nodeOtherConfig) {
|
|
151
|
+
const offsetX = (branch.nodeOtherConfig.specific_width ?? 0) / 2;
|
|
152
|
+
branch.nodeOtherConfig.translateX = (branch.nodeOtherConfig.specific_x ?? 0) - offsetX;
|
|
153
|
+
branch.nodeOtherConfig.translateY = branch.nodeOtherConfig.specific_y;
|
|
154
|
+
}
|
|
155
|
+
// Recursively set positions cho elements trong branch
|
|
156
|
+
if (branch.elements && branch.elements.length > 0) {
|
|
157
|
+
this.setTranslatePositions(branch.elements);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
static calculatorMaxBranchHeight(element, maxHeightBranch) {
|
|
164
|
+
if (!element.branches || !element.branches.length) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
element.branches.forEach((branch) => {
|
|
168
|
+
if (!branch.elements || !branch.elements.length) {
|
|
169
|
+
const lineBranchNoHasElement = canvasConfigReadonly().ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT;
|
|
170
|
+
maxHeightBranch.height = lineBranchNoHasElement > maxHeightBranch.height ? lineBranchNoHasElement : maxHeightBranch.height;
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const total = {
|
|
174
|
+
height: 0,
|
|
175
|
+
};
|
|
176
|
+
this.plusHeightElementInBranch(branch.elements, total);
|
|
177
|
+
maxHeightBranch.height = total.height > maxHeightBranch.height ? total.height : maxHeightBranch.height;
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
static plusHeightElementInBranch(elements, total) {
|
|
181
|
+
elements.forEach((element) => {
|
|
182
|
+
const margin = !element.branches || !element.branches.length ? checkElementGetHeight(element.nodeOtherConfig) : canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH;
|
|
183
|
+
total.height += (element.specific_height ?? 0) + margin;
|
|
184
|
+
if (!element.branches || !element.branches.length) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
total.height += 64; // từ chiều đường thẳng ngang xuống đến nhánh đầu tiên
|
|
188
|
+
const theMostElementsInBranch = {
|
|
189
|
+
height: 0,
|
|
190
|
+
};
|
|
191
|
+
element.branches.forEach((branch) => {
|
|
192
|
+
const heightInBranch = { height: 0 };
|
|
193
|
+
heightInBranch.height += canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST + 20; // đường cong kết thúc nhánh + 10px đường cong
|
|
194
|
+
if (!branch.elements || !branch.elements.length) {
|
|
195
|
+
heightInBranch.height += canvasConfigReadonly().ELEMENT_WIDTH_DEFAULT_BRANCH_WHEN_NOT_ELEMENT;
|
|
196
|
+
if (theMostElementsInBranch.height < heightInBranch.height) {
|
|
197
|
+
theMostElementsInBranch.height = heightInBranch.height;
|
|
198
|
+
}
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
this.plusHeightElementInBranch(branch.elements, heightInBranch);
|
|
202
|
+
if (theMostElementsInBranch.height < heightInBranch.height) {
|
|
203
|
+
theMostElementsInBranch.height = heightInBranch.height;
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
total.height += theMostElementsInBranch.height;
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
static calculatorWidthBranch(elements, maxWidth, log) {
|
|
210
|
+
if (!elements || !elements.length) {
|
|
211
|
+
const width = canvasConfigReadonly().DEFAULT_BRANCH_WHEN_NO_ELEMENT;
|
|
212
|
+
maxWidth.width = width;
|
|
213
|
+
maxWidth.aboveWidth = width / 2;
|
|
214
|
+
maxWidth.underWidth = width / 2;
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
const maxWidthInElements = { width: 0, aboveWidth: 0, underWidth: 0 };
|
|
218
|
+
elements.forEach((element) => {
|
|
219
|
+
if (!element.branches || !element.branches.length) {
|
|
220
|
+
// tính chiều cao của từng element 1, vì chiều cao của từng thằng có thể khác nhau
|
|
221
|
+
if ((element.specific_width ?? 0) < maxWidthInElements.width) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const width = element.specific_width ?? 0;
|
|
225
|
+
maxWidthInElements.width = width;
|
|
226
|
+
maxWidthInElements.aboveWidth = width / 2;
|
|
227
|
+
maxWidthInElements.underWidth = width / 2;
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const widthElementIncludeBranch = { width: 0, aboveWidth: 0, underWidth: 0 };
|
|
231
|
+
const width = element.specific_width ?? 0;
|
|
232
|
+
if (width > widthElementIncludeBranch.width) {
|
|
233
|
+
widthElementIncludeBranch.width = width;
|
|
234
|
+
widthElementIncludeBranch.aboveWidth = width / 2;
|
|
235
|
+
widthElementIncludeBranch.underWidth = width / 2;
|
|
236
|
+
}
|
|
237
|
+
const half = Math.ceil(element.branches.length / 2);
|
|
238
|
+
const aboveHalf = element.branches.slice(0, half);
|
|
239
|
+
const underHalf = element.branches.slice(half);
|
|
240
|
+
let brachMiddle;
|
|
241
|
+
if (aboveHalf.length !== underHalf.length) {
|
|
242
|
+
brachMiddle = aboveHalf.pop();
|
|
243
|
+
}
|
|
244
|
+
if (brachMiddle) {
|
|
245
|
+
brachMiddle.onTheSide = 'center';
|
|
246
|
+
}
|
|
247
|
+
aboveHalf.forEach((branch) => (branch.onTheSide = 'above'));
|
|
248
|
+
underHalf.forEach((branch) => (branch.onTheSide = 'under'));
|
|
249
|
+
// tính chiều cao của từng nhánh 1, rồi tính tổng => so sánh với chiều cao xem element có nhánh nào cao nhất thì lấy
|
|
250
|
+
const widthBranch = { width: 0, aboveWidth: 0, underWidth: 0 };
|
|
251
|
+
element.branches.forEach((branch) => {
|
|
252
|
+
const width = { width: 0, aboveWidth: 0, underWidth: 0 }; // tính chiều cao của từng nhánh 1
|
|
253
|
+
this.calculatorWidthBranch(branch.elements, width, log);
|
|
254
|
+
switch (branch.onTheSide) {
|
|
255
|
+
case 'above':
|
|
256
|
+
widthBranch.aboveWidth += width.width;
|
|
257
|
+
break;
|
|
258
|
+
case 'under':
|
|
259
|
+
widthBranch.underWidth += width.width;
|
|
260
|
+
break;
|
|
261
|
+
case 'center':
|
|
262
|
+
widthBranch.aboveWidth += width.aboveWidth;
|
|
263
|
+
widthBranch.underWidth += width.underWidth;
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
const marginBetweenBranch = (element.branches.length - 1) * canvasConfigReadonly().ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT;
|
|
268
|
+
widthBranch.aboveWidth += marginBetweenBranch / 2;
|
|
269
|
+
widthBranch.underWidth += marginBetweenBranch / 2;
|
|
270
|
+
const maxAboveWidth = Math.max(widthElementIncludeBranch.aboveWidth, widthBranch.aboveWidth);
|
|
271
|
+
const maxUnderWidth = Math.max(widthElementIncludeBranch.underWidth, widthBranch.underWidth);
|
|
272
|
+
if (maxWidthInElements.aboveWidth < maxAboveWidth) {
|
|
273
|
+
maxWidthInElements.aboveWidth = maxAboveWidth;
|
|
274
|
+
}
|
|
275
|
+
if (maxWidthInElements.underWidth < maxUnderWidth) {
|
|
276
|
+
maxWidthInElements.underWidth = maxUnderWidth;
|
|
277
|
+
}
|
|
278
|
+
maxWidthInElements.width = maxWidthInElements.aboveWidth + maxWidthInElements.underWidth;
|
|
279
|
+
});
|
|
280
|
+
maxWidth.width += maxWidthInElements.aboveWidth + maxWidthInElements.underWidth;
|
|
281
|
+
maxWidth.aboveWidth += maxWidthInElements.aboveWidth;
|
|
282
|
+
maxWidth.underWidth += maxWidthInElements.underWidth;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
const checkElementGetHeight = (hasWaitConfig) => {
|
|
286
|
+
if (hasWaitConfig) {
|
|
287
|
+
return canvasConfigReadonly().DISTANCE_TO_WAIT + getHeightWaitConfig(hasWaitConfig) + canvasConfigReadonly().WAIT_TO_ELEMENT;
|
|
288
|
+
}
|
|
289
|
+
return canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT;
|
|
290
|
+
};
|
|
291
|
+
export const getDistanceFromBranchToFirstBlock = (hasWaitConfig) => {
|
|
292
|
+
if (hasWaitConfig) {
|
|
293
|
+
return canvasConfigReadonly().DISTANCE_TO_WAIT + getHeightWaitConfig(hasWaitConfig) + canvasConfigReadonly().WAIT_TO_ELEMENT;
|
|
294
|
+
}
|
|
295
|
+
return canvasConfigReadonly().ELEMENT_MARGIN_DEFAULT_BRANCH_TO_ELEMENT_FIRST;
|
|
296
|
+
};
|
|
297
|
+
export const getHeightWaitConfig = (hasWaitConfig) => {
|
|
298
|
+
if (hasWaitConfig) {
|
|
299
|
+
return (hasWaitConfig.specific_height ?? canvasConfigReadonly().ELEMENT_WAIT_DEFAULT) + canvasConfigReadonly().DISTANCE_WAIT_TO_NEXT_LINE;
|
|
300
|
+
}
|
|
301
|
+
return canvasConfigReadonly().ELEMENT_WAIT_DEFAULT + canvasConfigReadonly().DISTANCE_WAIT_TO_NEXT_LINE;
|
|
302
|
+
};
|
|
303
|
+
export const checkMaxLeft = (config, specific_x, positionMaxLeft) => {
|
|
304
|
+
let numberTranslatePosition = config.positionMaxLeft;
|
|
305
|
+
if (numberTranslatePosition === 0 && specific_x && specific_x > 0 && specific_x < 50) {
|
|
306
|
+
numberTranslatePosition = -50;
|
|
307
|
+
}
|
|
308
|
+
if (specific_x && specific_x < numberTranslatePosition) {
|
|
309
|
+
numberTranslatePosition = specific_x;
|
|
310
|
+
}
|
|
311
|
+
if (positionMaxLeft && positionMaxLeft < numberTranslatePosition) {
|
|
312
|
+
numberTranslatePosition = positionMaxLeft;
|
|
313
|
+
}
|
|
314
|
+
if (numberTranslatePosition === config.positionMaxLeft) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
config.positionMaxLeft = numberTranslatePosition;
|
|
318
|
+
};
|
|
319
|
+
export const checkMaxTop = (config, specific_y, positionMaxTop) => {
|
|
320
|
+
let numberTranslatePosition = config.positionMaxTop;
|
|
321
|
+
if (numberTranslatePosition === 0 && specific_y && specific_y > 0 && specific_y < 100) {
|
|
322
|
+
numberTranslatePosition = specific_y - 120;
|
|
323
|
+
}
|
|
324
|
+
if (specific_y && specific_y < numberTranslatePosition) {
|
|
325
|
+
numberTranslatePosition = specific_y;
|
|
326
|
+
}
|
|
327
|
+
if (positionMaxTop && positionMaxTop < numberTranslatePosition) {
|
|
328
|
+
numberTranslatePosition = positionMaxTop;
|
|
329
|
+
}
|
|
330
|
+
if (numberTranslatePosition === config.positionMaxTop) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
config.positionMaxTop = numberTranslatePosition;
|
|
334
|
+
};
|
|
335
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRvci1lbGVtZW50LnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2RpYWdyYW0tZHJhdy9zcmMvdXRpbHMvY2FsY3VsYXRvci1lbGVtZW50LnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHL0QsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEQsTUFBTSxPQUFPLHFDQUFxQztJQUNoRCxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQWdDLEVBQUUsTUFBNkIsRUFBRSxTQUFrQjtRQUN0RyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xDLE9BQU87UUFDVCxDQUFDO1FBQ0QsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUN6QyxjQUFjLENBQUMsVUFBVSxHQUFHLENBQUMsY0FBYyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNoRixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRXZDLElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2YsY0FBYyxDQUFDLFVBQVUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsY0FBYyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMzSSxjQUFjLENBQUMsVUFBVSxHQUFH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YyxHQUFHLHVCQUF1QixFQUFFLENBQUM7UUFDL0QsdUJBQXVCLEdBQUcsY0FBYyxDQUFDO0lBQzNDLENBQUM7SUFDRCxJQUFJLHVCQUF1QixLQUFLLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0RCxPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sQ0FBQyxjQUFjLEdBQUcsdUJBQXVCLENBQUM7QUFDbEQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FudmFzQ29uZmlnUmVhZG9ubHkgfSBmcm9tICcuLi9kaWFncmFtLWRyYXcuc2VydmljZSc7XG5pbXBvcnQgeyBJRGF0YURpYWdyYW1Db25maWdTdmcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Nvb3JkaW5hdGVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRGlhZ3JhbUVsZW1lbnQsIElEaWFncmFtRWxlbWVudEJyYW5jaCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZGlhZ3JhbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTW9MaWJEaWFncmFtQ2FsY3VsYXRvckJyYW5jaFV0aWwgfSBmcm9tICcuL2NhbGN1bGF0b3ItYnJhbmNoLnV0aWwnO1xuaW1wb3J0IHsgYnVpbGRGbGF0RWxlbWVudCB9IGZyb20gJy4vZGlhZ3JhbS51dGlsJztcblxuZXhwb3J0IGNsYXNzIE1vTGliRGlhZ3JhbUNhbGN1bGF0b3JDb29yZGluYXRlc1V0aWwge1xuICBzdGF0aWMgc2V0WFlFbGVtZW50cyhlbGVtZW50czogQXJyYXk8SURpYWdyYW1FbGVtZW50PiwgY29uZmlnOiBJRGF0YURpYWdyYW1Db25maWdTdmcsIHBvc2l0aW9uWD86IG51bWJlcikge1xuICAgIGlmICghZWxlbWVudHMgfHwgIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbGVtZW50cy5mb3JFYWNoKChjdXJyZW50RWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgIGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3ggPSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCA/PyAwKSArIChwb3NpdGlvblggPz8gMCk7XG4gICAgICBjb25zdCBwcmVFbGVtZW50ID0gZWxlbWVudHNbaW5kZXggLSAxXTtcblxuICAgICAgaWYgKHByZUVsZW1lbnQpIHtcbiAgICAgICAgY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCA9IChwcmVFbGVtZW50LnNwZWNpZmljX3ggPz8gMCkgKyAocHJlRWxlbWVudC5zcGVjaWZpY193aWR0aCA/PyAwKSAvIDIgLSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfd2lkdGggPz8gMCkgLyAyO1xuICAgICAgICBjdXJyZW50RWxlbWVudC5zcGVjaWZpY195ID0gKHByZUVsZW1lbnQuc3BlY2lmaWNfeSA/PyAwKSArIChwcmVFbGVtZW50LnNwZWNpZmljX2hlaWdodCA/PyAwKSArIGNoZWNrRWxlbWVudEdldEhlaWdodChwcmVFbGVtZW50Lm5vZGVPdGhlckNvbmZpZyk7XG4gICAgICAgIGlmIChwcmVFbGVtZW50LnBvc2l0aW9uX2VuZF9icmFuY2gpIHtcbiAgICAgICAgICBjdXJyZW50RWxlbWVudC5zcGVjaWZpY195ID0gcHJlRWxlbWVudC5wb3NpdGlvbl9lbmRfYnJhbmNoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRvcCA9IGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3kgPz8gMDtcbiAgICAgIGNvbnN0IGxlZnQgPSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCA/PyAwKSArIChjdXJyZW50RWxlbWVudC5zcGVjaWZpY193aWR0aCA/PyAwKSAvIDI7XG4gICAgICBsZXQgbGluZUJldHdlZW5FbGVtZW50cyA9IChjdXJyZW50RWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgKyBjaGVja0VsZW1lbnRHZXRIZWlnaHQoY3VycmVudEVsZW1lbnQubm9kZU90aGVyQ29uZmlnKTtcblxuICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmJyYW5jaGVzICYmIGN1cnJlbnRFbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgICBsaW5lQmV0d2VlbkVsZW1lbnRzID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX2hlaWdodCA/PyAwKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fREVGQVVMVF9CUkFOQ0g7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1heFkgPSAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeSA/PyAwKSArIChjdXJyZW50RWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgKyAyMDA7XG4gICAgICBjb25zdCBtYXhYTGVmdCA9IChjdXJyZW50RWxlbWVudC5zcGVjaWZpY194ID8/IDApICsgKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX3dpZHRoID8/IDApICsgMTAwO1xuXG4gICAgICBjb25zdCBjb25maWdTdmcgPSBjb25maWcud2lkdGhIZWlnaHRTdmdDYW52YXM7XG5cbiAgICAgIGNvbmZpZ1N2Zy5oZWlnaHRTdmcgPSBtYXhZID4gY29uZmlnU3ZnLmhlaWdodFN2ZyA/IG1heFkgOiBjb25maWdTdmcuaGVpZ2h0U3ZnO1xuICAgICAgY29uZmlnU3ZnLndpZHRoU3ZnID0gbWF4WExlZnQgPiBjb25maWdTdmcud2lkdGhTdmcgPyBtYXhYTGVmdCA6IGNvbmZpZ1N2Zy53aWR0aFN2ZztcblxuICAgICAgY2hlY2tNYXhMZWZ0KGNvbmZpZywgY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfeCwgY3VycmVudEVsZW1lbnQuYnJhbmNoZXM/LlswXS5wb3NpdGlvbk1heExlZnQpO1xuICAgICAgaWYgKCFjdXJyZW50RWxlbWVudC5icmFuY2hlcyB8fCAhY3VycmVudEVsZW1lbnQuYnJhbmNoZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIGPDoWMgZWxlbWVudCBraMO0bmcgY8OzIG5ow6FuaCBt4bubaSB24bq9IMSRxrDhu51uZyB0aOG6s25nXG4gICAgICAgIGNvbnN0IGRyYXdGb3JtVG9IZWlnaHRFeGl0ID0gKGN1cnJlbnRFbGVtZW50LnN1YkNvZGVPZkVsZW1lbnQgfHwgY3VycmVudEVsZW1lbnQuY29kZSkgPT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQgPyAoY3VycmVudEVsZW1lbnQuc3BlY2lmaWNfaGVpZ2h0ID8/IDApIC8gMiA6IGxpbmVCZXR3ZWVuRWxlbWVudHM7XG5cbiAgICAgICAgY3VycmVudEVsZW1lbnQuYXR0cmlidXRlU3ZnRCA9IGBNICR7bGVmdH0gJHt0b3B9IGwgMCAke2RyYXdGb3JtVG9IZWlnaHRFeGl0fWA7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50LnBvc2l0aW9uX2VuZCA9IHRvcCArIGxpbmVCZXR3ZWVuRWxlbWVudHM7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHdhaXRIZWlnaHQgPSBnZXRIZWlnaHRXYWl0Q29uZmlnKGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZyk7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2VFbGVtZW50VG9XYWl0ID0gKGN1cnJlbnRFbGVtZW50LnNwZWNpZmljX2hlaWdodCA/PyAwKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRElTVEFOQ0VfVE9fV0FJVDtcbiAgICAgICAgICBjb25zdCB0b3BTdGFydExpbmUyID0gdG9wICsgZGlzdGFuY2VFbGVtZW50VG9XYWl0ICsgd2FpdEhlaWdodDtcblxuICAgICAgICAgIGN1cnJlbnRFbGVtZW50LmF0dHJpYnV0ZVN2Z0QgPSBgTSAke2xlZnR9ICR7dG9wfSBsIDAgJHtkaXN0YW5jZUVsZW1lbnRUb1dhaXR9YDtcbiAgICAgICAgICBjdXJyZW50RWxlbWVudC5wb3NpdGlvbl9lbmQgPSB0b3BTdGFydExpbmUyICsgbGluZUJldHdlZW5FbGVtZW50cztcblxuICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY195ID0gdG9wICsgZGlzdGFuY2VFbGVtZW50VG9XYWl0O1xuICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY194ID0gbGVmdDtcbiAgICAgICAgICBkZWxldGUgY3VycmVudEVsZW1lbnQubm9kZU90aGVyQ29uZmlnLmF0dHJpYnV0ZVN2Z0Q7XG4gICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LnN1YkNvZGVPZkVsZW1lbnQgIT09IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuVFlQRV9FTEVNRU5UX0VYSVQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5hdHRyaWJ1dGVTdmdEID0gYE0gJHtsZWZ0fSAke3RvcFN0YXJ0TGluZTJ9IGwgMCAke2NhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuV0FJVF9UT19FTEVNRU5UfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBzdGFydCBjw6FjIGVsZW1lbnQgY8OzIG5ow6FuaFxuICAgICAgY29uc3QgaGFsZiA9IE1hdGguY2VpbChjdXJyZW50RWxlbWVudC5icmFuY2hlcy5sZW5ndGggLyAyKTtcbiAgICAgIGNvbnN0IGFib3ZlSGFsZiA9IGN1cnJlbnRFbGVtZW50LmJyYW5jaGVzLnNsaWNlKDAsIGhhbGYpO1xuICAgICAgY29uc3QgdW5kZXJIYWxmID0gY3VycmVudEVsZW1lbnQuYnJhbmNoZXMuc2xpY2UoaGFsZik7XG4gICAgICBsZXQgYnJhY2hNaWRkbGU6IElEaWFncmFtRWxlbWVudEJyYW5jaCB8IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGFib3ZlSGFsZi5sZW5ndGggIT09IHVuZGVySGFsZi5sZW5ndGgpIHtcbiAgICAgICAgYnJhY2hNaWRkbGUgPSBhYm92ZUhhbGYucG9wKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFTDjU5IIENISeG7gFUgQ2FvIFThu5BJIMSQQSBD4bumQSBOSMOBTkhcbiAgICAgIGNvbnN0IG1heEhlaWdodEJyYW5jaCA9IHtcbiAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgfTtcblxuICAgICAgTW9MaWJEaWFncmFtQ2FsY3VsYXRvckNvb3JkaW5hdGVzVXRpbC5jYWxjdWxhdG9yTWF4QnJhbmNoSGVpZ2h0KGN1cnJlbnRFbGVtZW50LCBtYXhIZWlnaHRCcmFuY2gpO1xuICAgICAgY3VycmVudEVsZW1lbnQubWF4SGVpZ2h0QnJhbmNoID0gbWF4SGVpZ2h0QnJhbmNoLmhlaWdodDtcbiAgICAgIGNvbnN0IG1heFdpZHRoQnJhY2hNaWRkbGUgPSB7IHdpZHRoOiAwLCBhYm92ZVdpZHRoOiAwLCB1bmRlcldpZHRoOiAwIH07XG4gICAgICBjb25zdCBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZyA9IChjdXJyZW50RWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfTUFSR0lOX0RFRkFVTFRfQlJBTkNIO1xuXG4gICAgICBpZiAoYnJhY2hNaWRkbGUpIHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdG9yV2lkdGhCcmFuY2goYnJhY2hNaWRkbGUuZWxlbWVudHMsIG1heFdpZHRoQnJhY2hNaWRkbGUpO1xuICAgICAgICBicmFjaE1pZGRsZS53aWR0aEJyYW5jaCA9IHtcbiAgICAgICAgICB3aWR0aDogbWF4V2lkdGhCcmFjaE1pZGRsZS53aWR0aCxcbiAgICAgICAgICBhYm92ZTogbWF4V2lkdGhCcmFjaE1pZGRsZS5hYm92ZVdpZHRoLFxuICAgICAgICAgIHVuZGVyOiBtYXhXaWR0aEJyYWNoTWlkZGxlLnVuZGVyV2lkdGgsXG4gICAgICAgIH07XG4gICAgICAgIE1vTGliRGlhZ3JhbUNhbGN1bGF0b3JCcmFuY2hVdGlsLmRyYXdTdHJhaWdodExpbmUobGVmdCwgbGluZUZvcm1FbGVtZW50VG9CcmFuY2hpbmcsIHRvcCwgYnJhY2hNaWRkbGUsIG1heEhlaWdodEJyYW5jaC5oZWlnaHQsIGNvbmZpZyk7XG4gICAgICB9XG5cbiAgICAgIGxldCBoYXNOZXh0U2FtZVBhcmVudEVsZW1lbnROZXh0ID0gZmFsc2U7XG4gICAgICBjb25zdCBhYm92ZUhhbGZSZXZlcnNlID0gYWJvdmVIYWxmLnJldmVyc2UoKTtcblxuICAgICAgYWJvdmVIYWxmUmV2ZXJzZS5mb3JFYWNoKChicmFuY2gsIGluZGV4QnJhbmNoKSA9PiB7XG4gICAgICAgIGlmICghaGFzTmV4dFNhbWVQYXJlbnRFbGVtZW50TmV4dCkge1xuICAgICAgICAgIGNvbnN0IGZsYXRFbGVtZW50T25CcmFuY2g6IElEaWFncmFtRWxlbWVudFtdID0gW107XG5cbiAgICAgICAgICBidWlsZEZsYXRFbGVtZW50KGJyYW5jaC5lbGVtZW50cywgZmxhdEVsZW1lbnRPbkJyYW5jaCk7XG5cbiAgICAgICAgICBoYXNOZXh0U2FtZVBhcmVudEVsZW1lbnROZXh0ID0gIWZsYXRFbGVtZW50T25CcmFuY2ggfHwgIWZsYXRFbGVtZW50T25CcmFuY2gubGVuZ3RoID8gdHJ1ZSA6IGZsYXRFbGVtZW50T25CcmFuY2guZmluZCgoaXRlbSkgPT4gaXRlbS5uZXh0X2lkID09PSBjdXJyZW50RWxlbWVudC5uZXh0X2lkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyYW5jaC5vblRoZVNpZGUgPSAnYWJvdmUnO1xuICAgICAgICBjb25zdCBtYXhXaWR0aEJyYW5jaCA9IHsgd2lkdGg6IDAsIGFib3ZlV2lkdGg6IDAsIHVuZGVyV2lkdGg6IDAgfTsgLy8gdMOtbmggY2hp4buBdSBuZ2FuZyDEkeG7gyBjw6FjaCBuaMOhbmggdHLDqm4gb3IgZMaw4bubaVxuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRvcldpZHRoQnJhbmNoKGJyYW5jaC5lbGVtZW50cywgbWF4V2lkdGhCcmFuY2gpO1xuICAgICAgICBicmFuY2gud2lkdGhCcmFuY2ggPSB7XG4gICAgICAgICAgd2lkdGg6IG1heFdpZHRoQnJhbmNoLndpZHRoLFxuICAgICAgICAgIGFib3ZlOiBtYXhXaWR0aEJyYW5jaC5hYm92ZVdpZHRoLFxuICAgICAgICAgIHVuZGVyOiBtYXhXaWR0aEJyYW5jaC51bmRlcldpZHRoLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBicmFuY2hQcmUgPSBhYm92ZUhhbGZSZXZlcnNlW2luZGV4QnJhbmNoIC0gMV07XG5cbiAgICAgICAgbGV0IGxpbmVCZXR3ZWVuQnJhbmNoID0gbWF4V2lkdGhCcmFuY2gudW5kZXJXaWR0aCArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVCAvIDI7XG5cbiAgICAgICAgaWYgKGJyYW5jaFByZSkge1xuICAgICAgICAgIGxpbmVCZXR3ZWVuQnJhbmNoICs9IChicmFuY2hQcmUud2lkdGhCcmFuY2g/LndpZHRoID8/IDApICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9CRVRXRUVOX0JSQU5DSF9ERUZBVUxUO1xuICAgICAgICB9XG4gICAgICAgIGlmIChicmFjaE1pZGRsZSkge1xuICAgICAgICAgIGxpbmVCZXR3ZWVuQnJhbmNoICs9IChicmFjaE1pZGRsZS53aWR0aEJyYW5jaD8uYWJvdmUgPz8gMCkgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfTUFSR0lOX0JFVFdFRU5fQlJBTkNIX0RFRkFVTFQgLyAyO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5ow6FuaCB0csOhaVxuXG4gICAgICAgIE1vTGliRGlhZ3JhbUNhbGN1bGF0b3JCcmFuY2hVdGlsLmxlZnRMaW5lKGxlZnQsIGxpbmVGb3JtRWxlbWVudFRvQnJhbmNoaW5nLCB0b3AsIGxpbmVCZXR3ZWVuQnJhbmNoLCBicmFuY2gsIG1heEhlaWdodEJyYW5jaC5oZWlnaHQsIGN1cnJlbnRFbGVtZW50LCBjb25maWcpO1xuICAgICAgfSk7XG5cbiAgICAgIHVuZGVySGFsZi5mb3JFYWNoKChicmFuY2gsIGluZGV4QnJhbmNoKSA9PiB7XG4gICAgICAgIGlmICghaGFzTmV4dFNhbWVQYXJlbnRFbGVtZW50TmV4dCkge1xuICAgICAgICAgIGNvbnN0IGZsYXRFbGVtZW50T25CcmFuY2g6IElEaWFncmFtRWxlbWVudFtdID0gW107XG5cbiAgICAgICAgICBidWlsZEZsYXRFbGVtZW50KGJyYW5jaC5lbGVtZW50cywgZmxhdEVsZW1lbnRPbkJyYW5jaCk7XG5cbiAgICAgICAgICBoYXNOZXh0U2FtZVBhcmVudEVsZW1lbnROZXh0ID0gIWZsYXRFbGVtZW50T25CcmFuY2ggfHwgIWZsYXRFbGVtZW50T25CcmFuY2gubGVuZ3RoID8gdHJ1ZSA6IGZsYXRFbGVtZW50T25CcmFuY2guZmluZCgoaXRlbSkgPT4gaXRlbS5uZXh0X2lkID09PSBjdXJyZW50RWxlbWVudC5uZXh0X2lkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBicmFuY2gub25UaGVTaWRlID0gJ3VuZGVyJztcbiAgICAgICAgY29uc3QgbWF4V2lkdGhCcmFuY2ggPSB7IHdpZHRoOiAwLCBhYm92ZVdpZHRoOiAwLCB1bmRlcldpZHRoOiAwIH07IC8vIHTDrW5oIGNoaeG7gXUgY2FvIMSR4buDIGPDoWNoIG5ow6FuaCB0csOqbiBvciBkxrDhu5tpXG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdG9yV2lkdGhCcmFuY2goYnJhbmNoLmVsZW1lbnRzLCBtYXhXaWR0aEJyYW5jaCk7XG4gICAgICAgIGJyYW5jaC53aWR0aEJyYW5jaCA9IHtcbiAgICAgICAgICB3aWR0aDogbWF4V2lkdGhCcmFuY2gud2lkdGgsXG4gICAgICAgICAgYWJvdmU6IG1heFdpZHRoQnJhbmNoLmFib3ZlV2lkdGgsXG4gICAgICAgICAgdW5kZXI6IG1heFdpZHRoQnJhbmNoLnVuZGVyV2lkdGgsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJyYW5jaFByZSA9IHVuZGVySGFsZltpbmRleEJyYW5jaCAtIDFdO1xuICAgICAgICBsZXQgbGluZUJldHdlZW5CcmFuY2ggPSBtYXhXaWR0aEJyYW5jaC5hYm92ZVdpZHRoICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9CRVRXRUVOX0JSQU5DSF9ERUZBVUxUIC8gMjtcblxuICAgICAgICBpZiAoYnJhbmNoUHJlKSB7XG4gICAgICAgICAgbGluZUJldHdlZW5CcmFuY2ggKz0gKGJyYW5jaFByZS53aWR0aEJyYW5jaD8ud2lkdGggPz8gMCkgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkVMRU1FTlRfTUFSR0lOX0JFVFdFRU5fQlJBTkNIX0RFRkFVTFQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJyYWNoTWlkZGxlKSB7XG4gICAgICAgICAgbGluZUJldHdlZW5CcmFuY2ggKz0gKGJyYWNoTWlkZGxlLndpZHRoQnJhbmNoPy51bmRlciA/PyAwKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVCAvIDI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBuaMOhbmggcGjhuqNpXG4gICAgICAgIE1vTGliRGlhZ3JhbUNhbGN1bGF0b3JCcmFuY2hVdGlsLnJpZ2h0TGluZShsZWZ0LCBsaW5lRm9ybUVsZW1lbnRUb0JyYW5jaGluZywgdG9wLCBsaW5lQmV0d2VlbkJyYW5jaCwgYnJhbmNoLCBtYXhIZWlnaHRCcmFuY2guaGVpZ2h0LCBjdXJyZW50RWxlbWVudCwgY29uZmlnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gU2V0IHRyYW5zbGF0ZVggdsOgIHRyYW5zbGF0ZVkgxJHhu4MgY8OzIHRo4buDIHJlbmRlciBub2Rlc1xuICAgIHRoaXMuc2V0VHJhbnNsYXRlUG9zaXRpb25zKGVsZW1lbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdHJhbnNsYXRlWCB2w6AgdHJhbnNsYXRlWSB04burIHNwZWNpZmljX3ggdsOgIHNwZWNpZmljX3kgY2hvIHThuqV0IGPhuqMgZWxlbWVudHMgKGJhbyBn4buTbSBicmFuY2hlcylcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNldFRyYW5zbGF0ZVBvc2l0aW9ucyhlbGVtZW50czogQXJyYXk8SURpYWdyYW1FbGVtZW50Pikge1xuICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIC8vIFNldCBwb3NpdGlvbiBjaG8gZWxlbWVudCBjaMOtbmhcbiAgICAgIGVsZW1lbnQudHJhbnNsYXRlWCA9IGVsZW1lbnQuc3BlY2lmaWNfeDtcbiAgICAgIGVsZW1lbnQudHJhbnNsYXRlWSA9IGVsZW1lbnQuc3BlY2lmaWNfeTtcblxuICAgICAgLy8gU2V0IHBvc2l0aW9uIGNobyBub2RlT3RoZXJDb25maWcgbuG6v3UgY8OzXG4gICAgICBpZiAoZWxlbWVudC5ub2RlT3RoZXJDb25maWcpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IChlbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY193aWR0aCA/PyAwKSAvIDI7XG5cbiAgICAgICAgZWxlbWVudC5ub2RlT3RoZXJDb25maWcudHJhbnNsYXRlWCA9IChlbGVtZW50Lm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY194ID8/IDApIC0gb2Zmc2V0WDtcbiAgICAgICAgZWxlbWVudC5ub2RlT3RoZXJDb25maWcudHJhbnNsYXRlWSA9IGVsZW1lbnQubm9kZU90aGVyQ29uZmlnLnNwZWNpZmljX3k7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNldCBwb3NpdGlvbnMgY2hvIGVsZW1lbnRzIHRyb25nIGJyYW5jaGVzXG4gICAgICBpZiAoZWxlbWVudC5icmFuY2hlcyAmJiBlbGVtZW50LmJyYW5jaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZWxlbWVudC5icmFuY2hlcy5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICAgICAgICAvLyBTZXQgcG9zaXRpb24gY2hvIGJyYW5jaCBub2RlT3RoZXJDb25maWcgbuG6v3UgY8OzXG4gICAgICAgICAgaWYgKGJyYW5jaC5ub2RlT3RoZXJDb25maWcpIHtcbiAgICAgICAgICAgIGNvbnN0IG9mZnNldFggPSAoYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY193aWR0aCA/PyAwKSAvIDI7XG4gICAgICAgICAgICBicmFuY2gubm9kZU90aGVyQ29uZmlnLnRyYW5zbGF0ZVggPSAoYnJhbmNoLm5vZGVPdGhlckNvbmZpZy5zcGVjaWZpY194ID8/IDApIC0gb2Zmc2V0WDtcbiAgICAgICAgICAgIGJyYW5jaC5ub2RlT3RoZXJDb25maWcudHJhbnNsYXRlWSA9IGJyYW5jaC5ub2RlT3RoZXJDb25maWcuc3BlY2lmaWNfeTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZWN1cnNpdmVseSBzZXQgcG9zaXRpb25zIGNobyBlbGVtZW50cyB0cm9uZyBicmFuY2hcbiAgICAgICAgICBpZiAoYnJhbmNoLmVsZW1lbnRzICYmIGJyYW5jaC5lbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldFRyYW5zbGF0ZVBvc2l0aW9ucyhicmFuY2guZWxlbWVudHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgY2FsY3VsYXRvck1heEJyYW5jaEhlaWdodChlbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQsIG1heEhlaWdodEJyYW5jaDogeyBoZWlnaHQ6IG51bWJlciB9KSB7XG4gICAgaWYgKCFlbGVtZW50LmJyYW5jaGVzIHx8ICFlbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsZW1lbnQuYnJhbmNoZXMuZm9yRWFjaCgoYnJhbmNoKSA9PiB7XG4gICAgICBpZiAoIWJyYW5jaC5lbGVtZW50cyB8fCAhYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBsaW5lQnJhbmNoTm9IYXNFbGVtZW50ID0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX1dJRFRIX0RFRkFVTFRfQlJBTkNIX1dIRU5fTk9UX0VMRU1FTlQ7XG5cbiAgICAgICAgbWF4SGVpZ2h0QnJhbmNoLmhlaWdodCA9IGxpbmVCcmFuY2hOb0hhc0VsZW1lbnQgPiBtYXhIZWlnaHRCcmFuY2guaGVpZ2h0ID8gbGluZUJyYW5jaE5vSGFzRWxlbWVudCA6IG1heEhlaWdodEJyYW5jaC5oZWlnaHQ7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0b3RhbCA9IHtcbiAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5wbHVzSGVpZ2h0RWxlbWVudEluQnJhbmNoKGJyYW5jaC5lbGVtZW50cywgdG90YWwpO1xuICAgICAgbWF4SGVpZ2h0QnJhbmNoLmhlaWdodCA9IHRvdGFsLmhlaWdodCA+IG1heEhlaWdodEJyYW5jaC5oZWlnaHQgPyB0b3RhbC5oZWlnaHQgOiBtYXhIZWlnaHRCcmFuY2guaGVpZ2h0O1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIHBsdXNIZWlnaHRFbGVtZW50SW5CcmFuY2goZWxlbWVudHM6IElEaWFncmFtRWxlbWVudFtdLCB0b3RhbDogeyBoZWlnaHQ6IG51bWJlciB9KSB7XG4gICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgbWFyZ2luID0gIWVsZW1lbnQuYnJhbmNoZXMgfHwgIWVsZW1lbnQuYnJhbmNoZXMubGVuZ3RoID8gY2hlY2tFbGVtZW50R2V0SGVpZ2h0KGVsZW1lbnQubm9kZU90aGVyQ29uZmlnKSA6IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fREVGQVVMVF9CUkFOQ0g7XG5cbiAgICAgIHRvdGFsLmhlaWdodCArPSAoZWxlbWVudC5zcGVjaWZpY19oZWlnaHQgPz8gMCkgKyBtYXJnaW47XG4gICAgICBpZiAoIWVsZW1lbnQuYnJhbmNoZXMgfHwgIWVsZW1lbnQuYnJhbmNoZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRvdGFsLmhlaWdodCArPSA2NDsgLy8gdOG7qyBjaGnhu4F1IMSRxrDhu51uZyB0aOG6s25nIG5nYW5nIHh14buRbmcgxJHhur9uIG5ow6FuaCDEkeG6p3UgdGnDqm5cbiAgICAgIGNvbnN0IHRoZU1vc3RFbGVtZW50c0luQnJhbmNoID0ge1xuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICB9O1xuXG4gICAgICBlbGVtZW50LmJyYW5jaGVzLmZvckVhY2goKGJyYW5jaCkgPT4ge1xuICAgICAgICBjb25zdCBoZWlnaHRJbkJyYW5jaCA9IHsgaGVpZ2h0OiAwIH07XG5cbiAgICAgICAgaGVpZ2h0SW5CcmFuY2guaGVpZ2h0ICs9IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fREVGQVVMVF9CUkFOQ0hfVE9fRUxFTUVOVF9GSVJTVCArIDIwOyAvLyDEkcaw4budbmcgY29uZyBr4bq/dCB0aMO6YyBuaMOhbmggKyAxMHB4IMSRxrDhu51uZyBjb25nXG4gICAgICAgIGlmICghYnJhbmNoLmVsZW1lbnRzIHx8ICFicmFuY2guZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgaGVpZ2h0SW5CcmFuY2guaGVpZ2h0ICs9IGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9XSURUSF9ERUZBVUxUX0JSQU5DSF9XSEVOX05PVF9FTEVNRU5UO1xuXG4gICAgICAgICAgaWYgKHRoZU1vc3RFbGVtZW50c0luQnJhbmNoLmhlaWdodCA8IGhlaWdodEluQnJhbmNoLmhlaWdodCkge1xuICAgICAgICAgICAgdGhlTW9zdEVsZW1lbnRzSW5CcmFuY2guaGVpZ2h0ID0gaGVpZ2h0SW5CcmFuY2guaGVpZ2h0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBsdXNIZWlnaHRFbGVtZW50SW5CcmFuY2goYnJhbmNoLmVsZW1lbnRzLCBoZWlnaHRJbkJyYW5jaCk7XG4gICAgICAgIGlmICh0aGVNb3N0RWxlbWVudHNJbkJyYW5jaC5oZWlnaHQgPCBoZWlnaHRJbkJyYW5jaC5oZWlnaHQpIHtcbiAgICAgICAgICB0aGVNb3N0RWxlbWVudHNJbkJyYW5jaC5oZWlnaHQgPSBoZWlnaHRJbkJyYW5jaC5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0b3RhbC5oZWlnaHQgKz0gdGhlTW9zdEVsZW1lbnRzSW5CcmFuY2guaGVpZ2h0O1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGNhbGN1bGF0b3JXaWR0aEJyYW5jaChlbGVtZW50czogSURpYWdyYW1FbGVtZW50W10gfCB1bmRlZmluZWQsIG1heFdpZHRoOiB7IHdpZHRoOiBudW1iZXI7IGFib3ZlV2lkdGg6IG51bWJlcjsgdW5kZXJXaWR0aDogbnVtYmVyIH0sIGxvZz86IGJvb2xlYW4pIHtcbiAgICBpZiAoIWVsZW1lbnRzIHx8ICFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5ERUZBVUxUX0JSQU5DSF9XSEVOX05PX0VMRU1FTlQ7XG5cbiAgICAgIG1heFdpZHRoLndpZHRoID0gd2lkdGg7XG4gICAgICBtYXhXaWR0aC5hYm92ZVdpZHRoID0gd2lkdGggLyAyO1xuICAgICAgbWF4V2lkdGgudW5kZXJXaWR0aCA9IHdpZHRoIC8gMjtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG1heFdpZHRoSW5FbGVtZW50cyA9IHsgd2lkdGg6IDAsIGFib3ZlV2lkdGg6IDAsIHVuZGVyV2lkdGg6IDAgfTtcblxuICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGlmICghZWxlbWVudC5icmFuY2hlcyB8fCAhZWxlbWVudC5icmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gdMOtbmggY2hp4buBdSBjYW8gY+G7p2EgdOG7q25nIGVsZW1lbnQgMSwgdsOsIGNoaeG7gXUgY2FvIGPhu6dhIHThu6tuZyB0aOG6sW5nIGPDsyB0aOG7gyBraMOhYyBuaGF1XG4gICAgICAgIGlmICgoZWxlbWVudC5zcGVjaWZpY193aWR0aCA/PyAwKSA8IG1heFdpZHRoSW5FbGVtZW50cy53aWR0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3aWR0aCA9IGVsZW1lbnQuc3BlY2lmaWNfd2lkdGggPz8gMDtcblxuICAgICAgICBtYXhXaWR0aEluRWxlbWVudHMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgbWF4V2lkdGhJbkVsZW1lbnRzLmFib3ZlV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgICAgIG1heFdpZHRoSW5FbGVtZW50cy51bmRlcldpZHRoID0gd2lkdGggLyAyO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHdpZHRoRWxlbWVudEluY2x1ZGVCcmFuY2ggPSB7IHdpZHRoOiAwLCBhYm92ZVdpZHRoOiAwLCB1bmRlcldpZHRoOiAwIH07XG4gICAgICBjb25zdCB3aWR0aCA9IGVsZW1lbnQuc3BlY2lmaWNfd2lkdGggPz8gMDtcblxuICAgICAgaWYgKHdpZHRoID4gd2lkdGhFbGVtZW50SW5jbHVkZUJyYW5jaC53aWR0aCkge1xuICAgICAgICB3aWR0aEVsZW1lbnRJbmNsdWRlQnJhbmNoLndpZHRoID0gd2lkdGg7XG4gICAgICAgIHdpZHRoRWxlbWVudEluY2x1ZGVCcmFuY2guYWJvdmVXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICAgICAgd2lkdGhFbGVtZW50SW5jbHVkZUJyYW5jaC51bmRlcldpZHRoID0gd2lkdGggLyAyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoYWxmID0gTWF0aC5jZWlsKGVsZW1lbnQuYnJhbmNoZXMubGVuZ3RoIC8gMik7XG4gICAgICBjb25zdCBhYm92ZUhhbGYgPSBlbGVtZW50LmJyYW5jaGVzLnNsaWNlKDAsIGhhbGYpO1xuICAgICAgY29uc3QgdW5kZXJIYWxmID0gZWxlbWVudC5icmFuY2hlcy5zbGljZShoYWxmKTtcbiAgICAgIGxldCBicmFjaE1pZGRsZTtcblxuICAgICAgaWYgKGFib3ZlSGFsZi5sZW5ndGggIT09IHVuZGVySGFsZi5sZW5ndGgpIHtcbiAgICAgICAgYnJhY2hNaWRkbGUgPSBhYm92ZUhhbGYucG9wKCk7XG4gICAgICB9XG4gICAgICBpZiAoYnJhY2hNaWRkbGUpIHtcbiAgICAgICAgYnJhY2hNaWRkbGUub25UaGVTaWRlID0gJ2NlbnRlcic7XG4gICAgICB9XG4gICAgICBhYm92ZUhhbGYuZm9yRWFjaCgoYnJhbmNoKSA9PiAoYnJhbmNoLm9uVGhlU2lkZSA9ICdhYm92ZScpKTtcbiAgICAgIHVuZGVySGFsZi5mb3JFYWNoKChicmFuY2gpID0+IChicmFuY2gub25UaGVTaWRlID0gJ3VuZGVyJykpO1xuXG4gICAgICAvLyB0w61uaCBjaGnhu4F1IGNhbyBj4bunYSB04burbmcgbmjDoW5oIDEsIHLhu5NpIHTDrW5oIHThu5VuZyA9PiBzbyBzw6FuaCB24bubaSBjaGnhu4F1IGNhbyB4ZW0gZWxlbWVudCBjw7MgbmjDoW5oIG7DoG8gY2FvIG5o4bqldCB0aMOsIGzhuqV5XG4gICAgICBjb25zdCB3aWR0aEJyYW5jaCA9IHsgd2lkdGg6IDAsIGFib3ZlV2lkdGg6IDAsIHVuZGVyV2lkdGg6IDAgfTtcblxuICAgICAgZWxlbWVudC5icmFuY2hlcy5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB7IHdpZHRoOiAwLCBhYm92ZVdpZHRoOiAwLCB1bmRlcldpZHRoOiAwIH07IC8vIHTDrW5oIGNoaeG7gXUgY2FvIGPhu6dhIHThu6tuZyBuaMOhbmggMVxuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRvcldpZHRoQnJhbmNoKGJyYW5jaC5lbGVtZW50cywgd2lkdGgsIGxvZyk7XG4gICAgICAgIHN3aXRjaCAoYnJhbmNoLm9uVGhlU2lkZSkge1xuICAgICAgICAgIGNhc2UgJ2Fib3ZlJzpcbiAgICAgICAgICAgIHdpZHRoQnJhbmNoLmFib3ZlV2lkdGggKz0gd2lkdGgud2lkdGg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3VuZGVyJzpcbiAgICAgICAgICAgIHdpZHRoQnJhbmNoLnVuZGVyV2lkdGggKz0gd2lkdGgud2lkdGg7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgICAgICB3aWR0aEJyYW5jaC5hYm92ZVdpZHRoICs9IHdpZHRoLmFib3ZlV2lkdGg7XG4gICAgICAgICAgICB3aWR0aEJyYW5jaC51bmRlcldpZHRoICs9IHdpZHRoLnVuZGVyV2lkdGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG1hcmdpbkJldHdlZW5CcmFuY2ggPSAoZWxlbWVudC5icmFuY2hlcy5sZW5ndGggLSAxKSAqIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fQkVUV0VFTl9CUkFOQ0hfREVGQVVMVDtcblxuICAgICAgd2lkdGhCcmFuY2guYWJvdmVXaWR0aCArPSBtYXJnaW5CZXR3ZWVuQnJhbmNoIC8gMjtcbiAgICAgIHdpZHRoQnJhbmNoLnVuZGVyV2lkdGggKz0gbWFyZ2luQmV0d2VlbkJyYW5jaCAvIDI7XG4gICAgICBjb25zdCBtYXhBYm92ZVdpZHRoID0gTWF0aC5tYXgod2lkdGhFbGVtZW50SW5jbHVkZUJyYW5jaC5hYm92ZVdpZHRoLCB3aWR0aEJyYW5jaC5hYm92ZVdpZHRoKTtcbiAgICAgIGNvbnN0IG1heFVuZGVyV2lkdGggPSBNYXRoLm1heCh3aWR0aEVsZW1lbnRJbmNsdWRlQnJhbmNoLnVuZGVyV2lkdGgsIHdpZHRoQnJhbmNoLnVuZGVyV2lkdGgpO1xuXG4gICAgICBpZiAobWF4V2lkdGhJbkVsZW1lbnRzLmFib3ZlV2lkdGggPCBtYXhBYm92ZVdpZHRoKSB7XG4gICAgICAgIG1heFdpZHRoSW5FbGVtZW50cy5hYm92ZVdpZHRoID0gbWF4QWJvdmVXaWR0aDtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhXaWR0aEluRWxlbWVudHMudW5kZXJXaWR0aCA8IG1heFVuZGVyV2lkdGgpIHtcbiAgICAgICAgbWF4V2lkdGhJbkVsZW1lbnRzLnVuZGVyV2lkdGggPSBtYXhVbmRlcldpZHRoO1xuICAgICAgfVxuXG4gICAgICBtYXhXaWR0aEluRWxlbWVudHMud2lkdGggPSBtYXhXaWR0aEluRWxlbWVudHMuYWJvdmVXaWR0aCArIG1heFdpZHRoSW5FbGVtZW50cy51bmRlcldpZHRoO1xuICAgIH0pO1xuXG4gICAgbWF4V2lkdGgud2lkdGggKz0gbWF4V2lkdGhJbkVsZW1lbnRzLmFib3ZlV2lkdGggKyBtYXhXaWR0aEluRWxlbWVudHMudW5kZXJXaWR0aDtcbiAgICBtYXhXaWR0aC5hYm92ZVdpZHRoICs9IG1heFdpZHRoSW5FbGVtZW50cy5hYm92ZVdpZHRoO1xuICAgIG1heFdpZHRoLnVuZGVyV2lkdGggKz0gbWF4V2lkdGhJbkVsZW1lbnRzLnVuZGVyV2lkdGg7XG4gIH1cbn1cblxuY29uc3QgY2hlY2tFbGVtZW50R2V0SGVpZ2h0ID0gKGhhc1dhaXRDb25maWc/OiBJRGlhZ3JhbUVsZW1lbnQpID0+IHtcbiAgaWYgKGhhc1dhaXRDb25maWcpIHtcbiAgICByZXR1cm4gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5ESVNUQU5DRV9UT19XQUlUICsgZ2V0SGVpZ2h0V2FpdENvbmZpZyhoYXNXYWl0Q29uZmlnKSArIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuV0FJVF9UT19FTEVNRU5UO1xuICB9XG5cbiAgcmV0dXJuIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9NQVJHSU5fREVGQVVMVDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREaXN0YW5jZUZyb21CcmFuY2hUb0ZpcnN0QmxvY2sgPSAoaGFzV2FpdENvbmZpZz86IElEaWFncmFtRWxlbWVudCkgPT4ge1xuICBpZiAoaGFzV2FpdENvbmZpZykge1xuICAgIHJldHVybiBjYW52YXNDb25maWdSZWFkb25seSgpLkRJU1RBTkNFX1RPX1dBSVQgKyBnZXRIZWlnaHRXYWl0Q29uZmlnKGhhc1dhaXRDb25maWcpICsgY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5XQUlUX1RPX0VMRU1FTlQ7XG4gIH1cblxuICByZXR1cm4gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX01BUkdJTl9ERUZBVUxUX0JSQU5DSF9UT19FTEVNRU5UX0ZJUlNUO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEhlaWdodFdhaXRDb25maWcgPSAoaGFzV2FpdENvbmZpZz86IElEaWFncmFtRWxlbWVudCkgPT4ge1xuICBpZiAoaGFzV2FpdENvbmZpZykge1xuICAgIHJldHVybiAoaGFzV2FpdENvbmZpZy5zcGVjaWZpY19oZWlnaHQgPz8gY2FudmFzQ29uZmlnUmVhZG9ubHkoKS5FTEVNRU5UX1dBSVRfREVGQVVMVCkgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkRJU1RBTkNFX1dBSVRfVE9fTkVYVF9MSU5FO1xuICB9XG5cbiAgcmV0dXJuIGNhbnZhc0NvbmZpZ1JlYWRvbmx5KCkuRUxFTUVOVF9XQUlUX0RFRkFVTFQgKyBjYW52YXNDb25maWdSZWFkb25seSgpLkRJU1RBTkNFX1dBSVRfVE9fTkVYVF9MSU5FO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrTWF4TGVmdCA9IChjb25maWc6IElEYXRhRGlhZ3JhbUNvbmZpZ1N2Zywgc3BlY2lmaWNfeDogbnVtYmVyIHwgdW5kZWZpbmVkLCBwb3NpdGlvbk1heExlZnQ6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4ge1xuICBsZXQgbnVtYmVyVHJhbnNsYXRlUG9zaXRpb24gPSBjb25maWcucG9zaXRpb25NYXhMZWZ0O1xuXG4gIGlmIChudW1iZXJUcmFuc2xhdGVQb3NpdGlvbiA9PT0gMCAmJiBzcGVjaWZpY194ICYmIHNwZWNpZmljX3ggPiAwICYmIHNwZWNpZmljX3ggPCA1MCkge1xuICAgIG51bWJlclRyYW5zbGF0ZVBvc2l0aW9uID0gLTUwO1xuICB9XG5cbiAgaWYgKHNwZWNpZmljX3ggJiYgc3BlY2lmaWNfeCA8IG51bWJlclRyYW5zbGF0ZVBvc2l0aW9uKSB7XG4gICAgbnVtYmVyVHJhbnNsYXRlUG9zaXRpb24gPSBzcGVjaWZpY194O1xuICB9XG5cbiAgaWYgKHBvc2l0aW9uTWF4TGVmdCAmJiBwb3NpdGlvbk1heExlZnQgPCBudW1iZXJUcmFuc2xhdGVQb3NpdGlvbikge1xuICAgIG51bWJlclRyYW5zbGF0ZVBvc2l0aW9uID0gcG9zaXRpb25NYXhMZWZ0O1xuICB9XG4gIGlmIChudW1iZXJUcmFuc2xhdGVQb3NpdGlvbiA9PT0gY29uZmlnLnBvc2l0aW9uTWF4TGVmdCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25maWcucG9zaXRpb25NYXhMZWZ0ID0gbnVtYmVyVHJhbnNsYXRlUG9zaXRpb247XG59O1xuXG5leHBvcnQgY29uc3QgY2hlY2tNYXhUb3AgPSAoY29uZmlnOiBJRGF0YURpYWdyYW1Db25maWdTdmcsIHNwZWNpZmljX3k6IG51bWJlciB8IHVuZGVmaW5lZCwgcG9zaXRpb25NYXhUb3A6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4ge1xuICBsZXQgbnVtYmVyVHJhbnNsYXRlUG9zaXRpb24gPSBjb25maWcucG9zaXRpb25NYXhUb3A7XG5cbiAgaWYgKG51bWJlclRyYW5zbGF0ZVBvc2l0aW9uID09PSAwICYmIHNwZWNpZmljX3kgJiYgc3BlY2lmaWNfeSA+IDAgJiYgc3BlY2lmaWNfeSA8IDEwMCkge1xuICAgIG51bWJlclRyYW5zbGF0ZVBvc2l0aW9uID0gc3BlY2lmaWNfeSAtIDEyMDtcbiAgfVxuXG4gIGlmIChzcGVjaWZpY195ICYmIHNwZWNpZmljX3kgPCBudW1iZXJUcmFuc2xhdGVQb3NpdGlvbikge1xuICAgIG51bWJlclRyYW5zbGF0ZVBvc2l0aW9uID0gc3BlY2lmaWNfeTtcbiAgfVxuXG4gIGlmIChwb3NpdGlvbk1heFRvcCAmJiBwb3NpdGlvbk1heFRvcCA8IG51bWJlclRyYW5zbGF0ZVBvc2l0aW9uKSB7XG4gICAgbnVtYmVyVHJhbnNsYXRlUG9zaXRpb24gPSBwb3NpdGlvbk1heFRvcDtcbiAgfVxuICBpZiAobnVtYmVyVHJhbnNsYXRlUG9zaXRpb24gPT09IGNvbmZpZy5wb3NpdGlvbk1heFRvcCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25maWcucG9zaXRpb25NYXhUb3AgPSBudW1iZXJUcmFuc2xhdGVQb3NpdGlvbjtcbn07XG4iXX0=
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
export class LibsUiDiagramDrawCanvasUtil {
|
|
2
|
+
static buildFlatElement(elements, flatElementsContainer) {
|
|
3
|
+
elements.forEach((element) => {
|
|
4
|
+
flatElementsContainer.push(element);
|
|
5
|
+
if (!element.branches || !element.branches.length) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
LibsUiDiagramDrawCanvasUtil.flatElementHasBranch(element, flatElementsContainer);
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
static flatElementHasBranch(element, flatElementsContainer) {
|
|
12
|
+
if (!element.branches || !element.branches.length) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
element.branches.forEach((branch) => {
|
|
16
|
+
if (!branch.elements || !branch.elements.length) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
LibsUiDiagramDrawCanvasUtil.buildFlatElement(branch.elements, flatElementsContainer);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
static getDefaultStorageBranchEndCount() {
|
|
23
|
+
return { branchContainer: undefined, count: 0, branchEmpty: 0 };
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* data: sử dụng reference Object type nên count sẽ đệ quy cho đến node cuối cùng
|
|
27
|
+
* data.branchContainer: branch cuối cùng của element không next đến idElement
|
|
28
|
+
* data.count: số lượng branch có next_id đến idElement
|
|
29
|
+
*/
|
|
30
|
+
static getBranchContainerAndCountElementHasNextIdToElement(element, idElement, data, flowFlatElements) {
|
|
31
|
+
if (!element || !element.branches) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
element.branches.forEach((branch) => {
|
|
35
|
+
if (!branch.elements || !branch.elements.length) {
|
|
36
|
+
data.count++;
|
|
37
|
+
data.branchContainer = branch;
|
|
38
|
+
data.branchEmpty++;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const lastElement = branch.elements[branch.elements.length - 1];
|
|
42
|
+
if (!lastElement.next_id) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (lastElement.branches && lastElement.branches.length) {
|
|
46
|
+
const dataOfLastElement = this.getDefaultStorageBranchEndCount();
|
|
47
|
+
LibsUiDiagramDrawCanvasUtil.getBranchContainerAndCountElementHasNextIdToElement(lastElement, idElement, dataOfLastElement, flowFlatElements);
|
|
48
|
+
if (!dataOfLastElement.count) {
|
|
49
|
+
lastElement.next_id = '';
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
data.count++;
|
|
53
|
+
data.branchContainer = branch;
|
|
54
|
+
if (dataOfLastElement.count === 1) {
|
|
55
|
+
return (data.branchContainer = dataOfLastElement.branchContainer);
|
|
56
|
+
}
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const nextOfLastElement = flowFlatElements.find((el) => el.id === lastElement.next_id);
|
|
60
|
+
if (nextOfLastElement && nextOfLastElement.id !== idElement) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
data.count++;
|
|
64
|
+
data.branchContainer = branch;
|
|
65
|
+
return;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
static getElementHasCurrentBranchOrCurrentElement(currentBranch, currentElement, flatElements) {
|
|
69
|
+
const data = {
|
|
70
|
+
currentBranch: undefined,
|
|
71
|
+
element: undefined,
|
|
72
|
+
};
|
|
73
|
+
if (!flatElements || !flatElements.length || (!currentBranch && !currentElement)) {
|
|
74
|
+
return data;
|
|
75
|
+
}
|
|
76
|
+
if (!currentElement) {
|
|
77
|
+
data.currentBranch = currentBranch;
|
|
78
|
+
data.element = flatElements.find((el) => el.branches && !!el.branches.find((branch) => branch === currentBranch));
|
|
79
|
+
return data;
|
|
80
|
+
}
|
|
81
|
+
const elementsHasBranches = flatElements.filter((item) => item.branches && item.branches.length);
|
|
82
|
+
if (!elementsHasBranches) {
|
|
83
|
+
return data;
|
|
84
|
+
}
|
|
85
|
+
for (const element of elementsHasBranches) {
|
|
86
|
+
const branches = element.branches;
|
|
87
|
+
if (!branches) {
|
|
88
|
+
return data;
|
|
89
|
+
}
|
|
90
|
+
for (const branch of branches) {
|
|
91
|
+
if (!branch.elements || !branch.elements.length) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (branch.elements.find((item) => item.id === currentElement.id)) {
|
|
95
|
+
data.currentBranch = branch;
|
|
96
|
+
data.element = element;
|
|
97
|
+
return data;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return data;
|
|
102
|
+
}
|
|
103
|
+
static findAndDeleteElementFromContainer(containerElement, elementDelete) {
|
|
104
|
+
for (const index in containerElement) {
|
|
105
|
+
const elementOfIndex = containerElement[index];
|
|
106
|
+
if (elementOfIndex.id === elementDelete.id) {
|
|
107
|
+
containerElement.splice(+index, 1);
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
if (!elementOfIndex.branches || !elementOfIndex.branches.length) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
for (const branch of elementOfIndex.branches) {
|
|
114
|
+
if (!branch.elements || !branch.elements.length) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (this.findAndDeleteElementFromContainer(branch.elements, elementDelete)) {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
static getBranchOfElement(elementId, flatElements, elementTypeWorkflow) {
|
|
125
|
+
const flatElementHasBranch = flatElements.filter((item) => item.element_type === elementTypeWorkflow);
|
|
126
|
+
if (!flatElementHasBranch) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
for (const item of flatElementHasBranch) {
|
|
130
|
+
if (!item.branches || !item.branches.length) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
for (const branch of item.branches) {
|
|
134
|
+
const index = branch.elements.findIndex((el) => el.id === elementId);
|
|
135
|
+
if (index === -1) {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
return branch;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export const getDefaultConfigConstituentBranches = (code, dataDefault) => {
|
|
145
|
+
dataDefault.branches = [
|
|
146
|
+
{
|
|
147
|
+
elements: [],
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
elements: [],
|
|
151
|
+
},
|
|
152
|
+
];
|
|
153
|
+
return dataDefault;
|
|
154
|
+
};
|
|
155
|
+
export const findAndDeleteElementFromContainer = (containerElement, elementDelete) => {
|
|
156
|
+
for (const index in containerElement) {
|
|
157
|
+
const elementOfIndex = containerElement[index];
|
|
158
|
+
if (elementOfIndex.id === elementDelete.id) {
|
|
159
|
+
containerElement.splice(+index, 1);
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
if (!elementOfIndex.branches || !elementOfIndex.branches.length) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
for (const branch of elementOfIndex.branches) {
|
|
166
|
+
if (!branch.elements || !branch.elements.length) {
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (findAndDeleteElementFromContainer(branch.elements, elementDelete)) {
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return false;
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2RpYWdyYW0tZHJhdy9zcmMvdXRpbHMvY2FudmFzLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxPQUFPLDJCQUEyQjtJQUN0QyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBZ0MsRUFBRSxxQkFBNkM7UUFDckcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzNCLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xELE9BQU87WUFDVCxDQUFDO1lBQ0QsMkJBQTJCLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDbkYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLG9CQUFvQixDQUFDLE9BQXdCLEVBQUUscUJBQTZDO1FBQ2pHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsRCxPQUFPO1FBQ1QsQ0FBQztRQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoRCxPQUFPO1lBQ1QsQ0FBQztZQUNELDJCQUEyQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUE2QixFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDNUcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lB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RSxFQUFFLENBQUM7WUFDM0MsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRW5DLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoRSxTQUFTO1FBQ1gsQ0FBQztRQUVELEtBQUssTUFBTSxNQUFNLElBQUksY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDaEQsU0FBUztZQUNYLENBQUM7WUFDRCxJQUFJLGlDQUFpQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDdEUsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElCcmFuY2hFbmRDb3VudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2FudmFzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRGlhZ3JhbUVsZW1lbnQsIElEaWFncmFtRWxlbWVudEJyYW5jaCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZGlhZ3JhbS5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgTGlic1VpRGlhZ3JhbURyYXdDYW52YXNVdGlsIHtcbiAgc3RhdGljIGJ1aWxkRmxhdEVsZW1lbnQoZWxlbWVudHM6IEFycmF5PElEaWFncmFtRWxlbWVudD4sIGZsYXRFbGVtZW50c0NvbnRhaW5lcjogQXJyYXk8SURpYWdyYW1FbGVtZW50Pikge1xuICAgIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGZsYXRFbGVtZW50c0NvbnRhaW5lci5wdXNoKGVsZW1lbnQpO1xuICAgICAgaWYgKCFlbGVtZW50LmJyYW5jaGVzIHx8ICFlbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBMaWJzVWlEaWFncmFtRHJhd0NhbnZhc1V0aWwuZmxhdEVsZW1lbnRIYXNCcmFuY2goZWxlbWVudCwgZmxhdEVsZW1lbnRzQ29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBmbGF0RWxlbWVudEhhc0JyYW5jaChlbGVtZW50OiBJRGlhZ3JhbUVsZW1lbnQsIGZsYXRFbGVtZW50c0NvbnRhaW5lcjogQXJyYXk8SURpYWdyYW1FbGVtZW50Pikge1xuICAgIGlmICghZWxlbWVudC5icmFuY2hlcyB8fCAhZWxlbWVudC5icmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudC5icmFuY2hlcy5mb3JFYWNoKChicmFuY2gpID0+IHtcbiAgICAgIGlmICghYnJhbmNoLmVsZW1lbnRzIHx8ICFicmFuY2guZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIExpYnNVaURpYWdyYW1EcmF3Q2FudmFzVXRpbC5idWlsZEZsYXRFbGVtZW50KGJyYW5jaC5lbGVtZW50cyBhcyBJRGlhZ3JhbUVsZW1lbnRbXSwgZmxhdEVsZW1lbnRzQ29udGFpbmVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXREZWZhdWx0U3RvcmFnZUJyYW5jaEVuZENvdW50KCk6IElCcmFuY2hFbmRDb3VudCB7XG4gICAgcmV0dXJuIHsgYnJhbmNoQ29udGFpbmVyOiB1bmRlZmluZWQsIGNvdW50OiAwLCBicmFuY2hFbXB0eTogMCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGRhdGE6IHPhu60gZOG7pW5nIHJlZmVyZW5jZSBPYmplY3QgdHlwZSBuw6puIGNvdW50IHPhur0gxJHhu4cgcXV5IGNobyDEkeG6v24gbm9kZSBjdeG7kWkgY8O5bmdcbiAgICogZGF0YS5icmFuY2hDb250YWluZXI6IGJyYW5jaCBjdeG7kWkgY8O5bmcgY+G7p2EgZWxlbWVudCBraMO0bmcgbmV4dCDEkeG6v24gaWRFbGVtZW50XG4gICAqIGRhdGEuY291bnQ6IHPhu5EgbMaw4bujbmcgYnJhbmNoIGPDsyBuZXh0X2lkIMSR4bq/biBpZEVsZW1lbnRcbiAgICovXG4gIHN0YXRpYyBnZXRCcmFuY2hDb250YWluZXJBbmRDb3VudEVsZW1lbnRIYXNOZXh0SWRUb0VsZW1lbnQoZWxlbWVudDogSURpYWdyYW1FbGVtZW50LCBpZEVsZW1lbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGF0YTogSUJyYW5jaEVuZENvdW50LCBmbG93RmxhdEVsZW1lbnRzOiBBcnJheTxJRGlhZ3JhbUVsZW1lbnQ+KSB7XG4gICAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LmJyYW5jaGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsZW1lbnQuYnJhbmNoZXMuZm9yRWFjaCgoYnJhbmNoKSA9PiB7XG4gICAgICBpZiAoIWJyYW5jaC5lbGVtZW50cyB8fCAhYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICBkYXRhLmNvdW50Kys7XG4gICAgICAgIGRhdGEuYnJhbmNoQ29udGFpbmVyID0gYnJhbmNoO1xuICAgICAgICBkYXRhLmJyYW5jaEVtcHR5Kys7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbGFzdEVsZW1lbnQgPSBicmFuY2guZWxlbWVudHNbYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAoIWxhc3RFbGVtZW50Lm5leHRfaWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGxhc3RFbGVtZW50LmJyYW5jaGVzICYmIGxhc3RFbGVtZW50LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBkYXRhT2ZMYXN0RWxlbWVudCA9IHRoaXMuZ2V0RGVmYXVsdFN0b3JhZ2VCcmFuY2hFbmRDb3VudCgpO1xuXG4gICAgICAgIExpYnNVaURpYWdyYW1EcmF3Q2FudmFzVXRpbC5nZXRCcmFuY2hDb250YWluZXJBbmRDb3VudEVsZW1lbnRIYXNOZXh0SWRUb0VsZW1lbnQobGFzdEVsZW1lbnQgYXMgSURpYWdyYW1FbGVtZW50LCBpZEVsZW1lbnQsIGRhdGFPZkxhc3RFbGVtZW50LCBmbG93RmxhdEVsZW1lbnRzKTtcbiAgICAgICAgaWYgKCFkYXRhT2ZMYXN0RWxlbWVudC5jb3VudCkge1xuICAgICAgICAgIGxhc3RFbGVtZW50Lm5leHRfaWQgPSAnJztcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLmNvdW50Kys7XG4gICAgICAgIGRhdGEuYnJhbmNoQ29udGFpbmVyID0gYnJhbmNoO1xuICAgICAgICBpZiAoZGF0YU9mTGFzdEVsZW1lbnQuY291bnQgPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gKGRhdGEuYnJhbmNoQ29udGFpbmVyID0gZGF0YU9mTGFzdEVsZW1lbnQuYnJhbmNoQ29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5leHRPZkxhc3RFbGVtZW50ID0gZmxvd0ZsYXRFbGVtZW50cy5maW5kKChlbCkgPT4gZWwuaWQgPT09IGxhc3RFbGVtZW50Lm5leHRfaWQpO1xuXG4gICAgICBpZiAobmV4dE9mTGFzdEVsZW1lbnQgJiYgbmV4dE9mTGFzdEVsZW1lbnQuaWQgIT09IGlkRWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkYXRhLmNvdW50Kys7XG4gICAgICBkYXRhLmJyYW5jaENvbnRhaW5lciA9IGJyYW5jaDtcblxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGdldEVsZW1lbnRIYXNDdXJyZW50QnJhbmNoT3JDdXJyZW50RWxlbWVudChjdXJyZW50QnJhbmNoPzogSURpYWdyYW1FbGVtZW50QnJhbmNoLCBjdXJyZW50RWxlbWVudD86IElEaWFncmFtRWxlbWVudCwgZmxhdEVsZW1lbnRzPzogQXJyYXk8SURpYWdyYW1FbGVtZW50Pik6IHsgY3VycmVudEJyYW5jaD86IElEaWFncmFtRWxlbWVudEJyYW5jaDsgZWxlbWVudD86IElEaWFncmFtRWxlbWVudCB9IHtcbiAgICBjb25zdCBkYXRhOiB7IGN1cnJlbnRCcmFuY2g/OiBJRGlhZ3JhbUVsZW1lbnRCcmFuY2g7IGVsZW1lbnQ/OiBJRGlhZ3JhbUVsZW1lbnQgfSA9IHtcbiAgICAgIGN1cnJlbnRCcmFuY2g6IHVuZGVmaW5lZCxcbiAgICAgIGVsZW1lbnQ6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgaWYgKCFmbGF0RWxlbWVudHMgfHwgIWZsYXRFbGVtZW50cy5sZW5ndGggfHwgKCFjdXJyZW50QnJhbmNoICYmICFjdXJyZW50RWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGlmICghY3VycmVudEVsZW1lbnQpIHtcbiAgICAgIGRhdGEuY3VycmVudEJyYW5jaCA9IGN1cnJlbnRCcmFuY2g7XG4gICAgICBkYXRhLmVsZW1lbnQgPSBmbGF0RWxlbWVudHMuZmluZCgoZWwpID0+IGVsLmJyYW5jaGVzICYmICEhZWwuYnJhbmNoZXMuZmluZCgoYnJhbmNoKSA9PiBicmFuY2ggPT09IGN1cnJlbnRCcmFuY2gpKTtcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnRzSGFzQnJhbmNoZXMgPSBmbGF0RWxlbWVudHMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmJyYW5jaGVzICYmIGl0ZW0uYnJhbmNoZXMubGVuZ3RoKTtcblxuICAgIGlmICghZWxlbWVudHNIYXNCcmFuY2hlcykge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50c0hhc0JyYW5jaGVzKSB7XG4gICAgICBjb25zdCBicmFuY2hlcyA9IGVsZW1lbnQuYnJhbmNoZXM7XG5cbiAgICAgIGlmICghYnJhbmNoZXMpIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBicmFuY2hlcykge1xuICAgICAgICBpZiAoIWJyYW5jaC5lbGVtZW50cyB8fCAhYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChicmFuY2guZWxlbWVudHMuZmluZCgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gY3VycmVudEVsZW1lbnQuaWQpKSB7XG4gICAgICAgICAgZGF0YS5jdXJyZW50QnJhbmNoID0gYnJhbmNoO1xuICAgICAgICAgIGRhdGEuZWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgc3RhdGljIGZpbmRBbmREZWxldGVFbGVtZW50RnJvbUNvbnRhaW5lcihjb250YWluZXJFbGVtZW50OiBBcnJheTxJRGlhZ3JhbUVsZW1lbnQ+LCBlbGVtZW50RGVsZXRlOiBJRGlhZ3JhbUVsZW1lbnQpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGluZGV4IGluIGNvbnRhaW5lckVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRPZkluZGV4ID0gY29udGFpbmVyRWxlbWVudFtpbmRleF07XG5cbiAgICAgIGlmIChlbGVtZW50T2ZJbmRleC5pZCA9PT0gZWxlbWVudERlbGV0ZS5pZCkge1xuICAgICAgICBjb250YWluZXJFbGVtZW50LnNwbGljZSgraW5kZXgsIDEpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFlbGVtZW50T2ZJbmRleC5icmFuY2hlcyB8fCAhZWxlbWVudE9mSW5kZXguYnJhbmNoZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBlbGVtZW50T2ZJbmRleC5icmFuY2hlcykge1xuICAgICAgICBpZiAoIWJyYW5jaC5lbGVtZW50cyB8fCAhYnJhbmNoLmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbmRBbmREZWxldGVFbGVtZW50RnJvbUNvbnRhaW5lcihicmFuY2guZWxlbWVudHMsIGVsZW1lbnREZWxldGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldEJyYW5jaE9mRWxlbWVudChlbGVtZW50SWQ6IHN0cmluZywgZmxhdEVsZW1lbnRzOiBBcnJheTxJRGlhZ3JhbUVsZW1lbnQ+LCBlbGVtZW50VHlwZVdvcmtmbG93OiBzdHJpbmcpIHtcbiAgICBjb25zdCBmbGF0RWxlbWVudEhhc0JyYW5jaCA9IGZsYXRFbGVtZW50cy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZWxlbWVudF90eXBlID09PSBlbGVtZW50VHlwZVdvcmtmbG93KTtcblxuICAgIGlmICghZmxhdEVsZW1lbnRIYXNCcmFuY2gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZmxhdEVsZW1lbnRIYXNCcmFuY2gpIHtcbiAgICAgIGlmICghaXRlbS5icmFuY2hlcyB8fCAhaXRlbS5icmFuY2hlcy5sZW5ndGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGJyYW5jaCBvZiBpdGVtLmJyYW5jaGVzKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gYnJhbmNoLmVsZW1lbnRzLmZpbmRJbmRleCgoZWwpID0+IGVsLmlkID09PSBlbGVtZW50SWQpO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBicmFuY2g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0Q29uZmlnQ29uc3RpdHVlbnRCcmFuY2hlcyA9IChjb2RlOiBzdHJpbmcsIGRhdGFEZWZhdWx0OiBJRGlhZ3JhbUVsZW1lbnQpID0+IHtcbiAgZGF0YURlZmF1bHQuYnJhbmNoZXMgPSBbXG4gICAge1xuICAgICAgZWxlbWVudHM6IFtdLFxuICAgIH0sXG4gICAge1xuICAgICAgZWxlbWVudHM6IFtdLFxuICAgIH0sXG4gIF07XG5cbiAgcmV0dXJuIGRhdGFEZWZhdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRBbmREZWxldGVFbGVtZW50RnJvbUNvbnRhaW5lciA9IChjb250YWluZXJFbGVtZW50OiBBcnJheTxJRGlhZ3JhbUVsZW1lbnQ+LCBlbGVtZW50RGVsZXRlOiBJRGlhZ3JhbUVsZW1lbnQpOiBib29sZWFuID0+IHtcbiAgZm9yIChjb25zdCBpbmRleCBpbiBjb250YWluZXJFbGVtZW50KSB7XG4gICAgY29uc3QgZWxlbWVudE9mSW5kZXggPSBjb250YWluZXJFbGVtZW50W2luZGV4XTtcblxuICAgIGlmIChlbGVtZW50T2ZJbmRleC5pZCA9PT0gZWxlbWVudERlbGV0ZS5pZCkge1xuICAgICAgY29udGFpbmVyRWxlbWVudC5zcGxpY2UoK2luZGV4LCAxKTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghZWxlbWVudE9mSW5kZXguYnJhbmNoZXMgfHwgIWVsZW1lbnRPZkluZGV4LmJyYW5jaGVzLmxlbmd0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBicmFuY2ggb2YgZWxlbWVudE9mSW5kZXguYnJhbmNoZXMpIHtcbiAgICAgIGlmICghYnJhbmNoLmVsZW1lbnRzIHx8ICFicmFuY2guZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGZpbmRBbmREZWxldGVFbGVtZW50RnJvbUNvbnRhaW5lcihicmFuY2guZWxlbWVudHMsIGVsZW1lbnREZWxldGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG4iXX0=
|