@libs-ui/components-draw-line 0.2.70 → 0.2.72
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/draw-line.directive.d.ts +2 -0
- package/esm2022/draw-line.directive.mjs +65 -10
- package/esm2022/util/calculator-branch.util.mjs +1 -1
- package/esm2022/util/calculator-diretion-element.until.mjs +34 -23
- package/esm2022/util/connect-navigation-new-element.util.mjs +7 -10
- package/esm2022/util/line-connect-bottom-left.until.mjs +23 -31
- package/fesm2022/libs-ui-components-draw-line.mjs +124 -70
- package/fesm2022/libs-ui-components-draw-line.mjs.map +1 -1
- package/package.json +1 -1
- package/util/calculator-diretion-element.until.d.ts +8 -4
|
@@ -34,7 +34,6 @@ export class MoCanvasConnectNavigationBottomLeftElementUtil {
|
|
|
34
34
|
const listLine = separatedPoints.filter(item => item.id === 'checkAndAvoidBlocksYLeft');
|
|
35
35
|
const elements = listLine.filter(item => item.start.x === straightLine.endPath.x || item.end.x === straightLine.endPath.x);
|
|
36
36
|
elements.forEach(item => {
|
|
37
|
-
console.log('directionStartX', directionStartX);
|
|
38
37
|
if (item.start.x === straightLine.endPath.x) {
|
|
39
38
|
item.start.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartX, item.start.x, (lineCurve));
|
|
40
39
|
}
|
|
@@ -44,34 +43,31 @@ export class MoCanvasConnectNavigationBottomLeftElementUtil {
|
|
|
44
43
|
});
|
|
45
44
|
}
|
|
46
45
|
// // kiểm tra ngay khi cua có vướng ai không rồi hẵng vẽ Q1
|
|
47
|
-
const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(straightLine.endPath.x ?? 0,
|
|
46
|
+
const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(straightLine.endPath.x ?? 0, endPositionOrigin.x, straightLine.endPath.y ?? 0, 'x', obstacleRect);
|
|
48
47
|
const directionNextX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(straightLine.endPath.x ?? 0, endPositionOrigin.x, 'x');
|
|
49
48
|
const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, `${directionStartY}-${directionNextX}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
|
|
50
|
-
|
|
49
|
+
const elementBlockRoadX = (elementBlockRoad?.x ?? 0) + (elementBlockRoad?.width ?? 0);
|
|
50
|
+
if (elementBlockRoad && Math.abs((elementBlockRoadX) - (straightLine.endPath.x ?? 0)) <= lineCurve * 2) {
|
|
51
51
|
coordQ1.x1 = straightLine.endPath.x ?? 0;
|
|
52
52
|
coordQ1.y1 = straightLine.endPath.y ?? 0;
|
|
53
53
|
coordQ1.x = straightLine.endPath.x ?? 0;
|
|
54
54
|
coordQ1.y = straightLine.endPath.y ?? 0;
|
|
55
55
|
}
|
|
56
56
|
// kiểm tra và vẽ hướng ngang
|
|
57
|
-
const directionXToEnd = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0,
|
|
58
|
-
endPosition.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionXToEnd, endPosition.x, lineCurve);
|
|
59
|
-
if (Math.abs((coordQ1.y ?? 0) - endPosition.y) <= lineCurve) {
|
|
60
|
-
endPosition.y -= lineCurve;
|
|
61
|
-
}
|
|
57
|
+
const directionXToEnd = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0, endPosition.x, 'x');
|
|
62
58
|
const pathHorizontal = [];
|
|
63
|
-
const
|
|
59
|
+
const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, pathHorizontal);
|
|
64
60
|
if (directionXToEnd === 'left' && endPath.x > (coordQ1.x ?? 0)) {
|
|
65
|
-
separatedPoints.push({ start: straightLine.endPath, end:
|
|
61
|
+
separatedPoints.push({ start: straightLine.endPath, end: endPosition, mode: 'vertical', id: '6a ' + directionStartY });
|
|
66
62
|
return;
|
|
67
63
|
}
|
|
68
64
|
const end = { x: (coordQ1.x ?? 0), y: coordQ1.y ?? 0 };
|
|
69
|
-
separatedPoints.push({ start: straightLine.endPath, end: end, mode: 'vertical-single-curve', id: '6a ' + directionStartY }); // góc cong từ đường thẳng sang ngang
|
|
70
65
|
separatedPoints.push(...pathHorizontal);
|
|
71
|
-
|
|
66
|
+
separatedPoints.push({ start: straightLine.endPath, end: end, mode: 'vertical-single-curve', id: '6a ' + directionStartY }); // góc cong từ đường thẳng sang ngang
|
|
67
|
+
if (endPath.x === endPosition.x && endPath.y < endPosition.y) {
|
|
72
68
|
const itemLast = pathHorizontal.find(item => item.end.x === endPath.x);
|
|
73
69
|
if (itemLast) {
|
|
74
|
-
itemLast.end.x =
|
|
70
|
+
itemLast.end.x = endPosition.x + 50;
|
|
75
71
|
endPath.x = itemLast.end.x;
|
|
76
72
|
}
|
|
77
73
|
}
|
|
@@ -97,34 +93,30 @@ export class MoCanvasConnectNavigationBottomLeftElementUtil {
|
|
|
97
93
|
separatedPointsCheckAndAvoidBlocks = [];
|
|
98
94
|
}
|
|
99
95
|
if (Math.abs((endPath.y ?? 0) - endPosition.y) < 15) {
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
96
|
+
const element = separatedPointsCheckAndAvoidBlocks.find(item => (item.end.y === endPath.y && item.end.x === endPath.x));
|
|
97
|
+
const elementQR = separatedPointsCheckAndAvoidBlocks.find(item => (item.end.y === element?.start.y && item.end.x === element.start.x));
|
|
98
|
+
if (element) {
|
|
99
|
+
element.start.y = endPosition.y;
|
|
100
|
+
element.end.y = endPosition.y;
|
|
101
|
+
}
|
|
102
|
+
if (elementQR) {
|
|
103
|
+
elementQR.end.y = endPosition.y;
|
|
104
|
+
}
|
|
109
105
|
}
|
|
110
106
|
separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsCheckAndAvoidBlocks);
|
|
111
107
|
if (endPath.y === endPosition.y) {
|
|
112
108
|
separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: endPosition, mode: 'horizontal' });
|
|
113
109
|
return;
|
|
114
110
|
}
|
|
111
|
+
if (Math.abs((endPath.y ?? 0) - endPosition.y) < 15) {
|
|
112
|
+
separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: endPosition, mode: 'vertical' });
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
115
|
// // sau khi đã đi ngang và tránh các khối, tiếp theo là đi tiếp hướng lên xuống để về khối cần nối tới, cần check xem điểm end X nó đang ở hướng nào
|
|
116
116
|
const directionY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPosition.y, 'y');
|
|
117
117
|
const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `right-${directionY === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
|
|
118
118
|
const endPositionY = cloneDeep(endPosition);
|
|
119
119
|
endPositionY.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, endPositionY.y, lineCurve);
|
|
120
|
-
// // cần check khi đi thẳng lên có vướng khối nào không để tiến lên, nhưng cần phải xem x của nó có quá gần endX không, gần quá thì
|
|
121
|
-
const elementBlockRoadStraightLineY = MoCanvasCalculatorDirectionElementUtil.checkBlocksElementStraightY((endPath.x ?? 0) + 10, endPath.y ?? 0, endPositionY, obstacleRect);
|
|
122
|
-
if (elementBlockRoadStraightLineY) {
|
|
123
|
-
coordQ1.x = (elementBlockRoadStraightLineY.x ?? 0) + (elementBlockRoadStraightLineY.width ?? 0) + lineCurve;
|
|
124
|
-
}
|
|
125
|
-
if (Math.abs((coordQ1.x ?? 0) - endPosition.x) < 20 && directionY === 'under') {
|
|
126
|
-
coordQ1.x = endPosition.x + 20; // trường hợp right quay xuống dưới điểm end khá gần điểm start => không đủ khoảng cách quay mũi tên vào
|
|
127
|
-
}
|
|
128
120
|
separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: { x: coordQ1.x ?? 0, y: (coordQ1.y ?? 0) }, mode: 'horizontal-single-curve', id: 'g' });
|
|
129
121
|
let avoidBlocksYLine = [];
|
|
130
122
|
const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksY(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPositionY, directionY, obstacleRect, avoidBlocksYLine);
|
|
@@ -152,4 +144,4 @@ export class MoCanvasConnectNavigationBottomLeftElementUtil {
|
|
|
152
144
|
return;
|
|
153
145
|
}
|
|
154
146
|
}
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jb25uZWN0LWJvdHRvbS1sZWZ0LnVudGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2RyYXctbGluZS9zcmMvdXRpbC9saW5lLWNvbm5lY3QtYm90dG9tLWxlZnQudW50aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTdGLE1BQU0sT0FBTyw4Q0FBOEM7SUFDekQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFnQixFQUFFLFVBQWlCLEVBQUUsS0FBYSxFQUFFLFNBQWlCLEVBQUUsWUFBcUIsRUFBRSxlQUErQjtRQUMzSSxNQUFNLGlCQUFpQixHQUFHO1lBQ3hCLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNkLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNmLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNqRCxNQUFNLGVBQWUsR0FBRyxzQ0FBc0MsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUV2SCxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFFeEIsSUFBSSxlQUFlLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDaEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQTtZQUMzRSxNQUFNLElBQUksR0FB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LEtBQUssWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN0QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzVDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDckIsQ0FBQztnQkFDRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQzFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbkIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUU5SixPQUFPO0lBQ1QsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSBcIkBsaWJzLXVpL3V0aWxzXCI7XG5pbXBvcnQgeyBJUG9pbnQsIElQb2ludHMsIElSZWN0IH0gZnJvbSBcIi4uL2RyYXctbGluZS5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IE1vQ2FudmFzQ2FsY3VsYXRvckJyYW5jaFV0aWwgfSBmcm9tIFwiLi9jYWxjdWxhdG9yLWJyYW5jaC51dGlsXCI7XG5pbXBvcnQgeyBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbCB9IGZyb20gXCIuL2NhbGN1bGF0b3ItZGlyZXRpb24tZWxlbWVudC51bnRpbFwiO1xuXG5leHBvcnQgY2xhc3MgTW9DYW52YXNDb25uZWN0TmF2aWdhdGlvbkJvdHRvbUxlZnRFbGVtZW50VXRpbCB7XG4gIHN0YXRpYyBsaW5lTGVmdChwb2ludE5leHQ6IElSZWN0LCBwb2ludFN0YXJ0OiBJUmVjdCwgc3RhcnQ6IElQb2ludCwgbGluZUN1cnZlOiBudW1iZXIsIG9ic3RhY2xlUmVjdDogSVJlY3RbXSwgc2VwYXJhdGVkUG9pbnRzOiBBcnJheTxJUG9pbnRzPikge1xuICAgIGNvbnN0IGVuZFBvc2l0aW9uT3JpZ2luID0ge1xuICAgICAgeDogcG9pbnROZXh0LngsXG4gICAgICB5OiBwb2ludE5leHQueVxuICAgIH07XG4gICAgY29uc3QgZW5kUG9zaXRpb24gPSBjbG9uZURlZXAoZW5kUG9zaXRpb25PcmlnaW4pO1xuICAgIGNvbnN0IGRpcmVjdGlvblN0YXJ0WSA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmNoZWNrVXBEb3duTGVmdFJpZ2h0KHN0YXJ0LnksIGVuZFBvc2l0aW9uT3JpZ2luLnksICd5Jyk7XG5cbiAgICBsZXQgbmV3UG9zaXRpb24gPSBzdGFydDtcblxuICAgIGlmIChkaXJlY3Rpb25TdGFydFkgPT09ICdhYm92ZScpIHtcbiAgICAgIGNvbnN0IHN0YXJ0UUwgPSB7IGx4OiBzdGFydC54IC0gbGluZUN1cnZlLCBseTogKHN0YXJ0LnkgPz8gMCkgKyBsaW5lQ3VydmUgfVxuICAgICAgY29uc3QgbGluZSA9IHtcbiAgICAgICAgc3RhcnQ6IHsgeDogKHN0YXJ0LnggPz8gMCksIHk6IHN0YXJ0LnkgPz8gMCB9LFxuICAgICAgICBlbmQ6IHsgeDogc3RhcnRRTC5seCA/PyAwLCB5OiBzdGFydFFMLmx5ID8/IDAgfVxuICAgICAgfVxuICAgICAgbmV3UG9zaXRpb24gPSB7XG4gICAgICAgIHg6IHBvaW50U3RhcnQueCAtIChsaW5lQ3VydmUgKyAxMCksXG4gICAgICAgIHk6IE1vQ2FudmFzQ2FsY3VsYXRvckJyYW5jaFV0aWwubWF0aE9wZXJhdG9yc0NhbGN1bGF0aW9uKGRpcmVjdGlvblN0YXJ0WSwgbGluZS5lbmQueSwgbGluZUN1cnZlLCB0cnVlKVxuICAgICAgfVxuXG4gICAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiBsaW5lLnN0YXJ0LCBlbmQ6IGxpbmUuZW5kLCBtb2RlOiAndmVydGljYWwtc2luZ2xlLWN1cnZlJywgaWQ6ICcxJyB9KTsgLy8gbGluZSB24bq9IMSRaSBraOG7j2kga2jhu5FpIMSR4bqndSB0acOqblxuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogbGluZS5lbmQsIGVuZDogbmV3UG9zaXRpb24sIG1vZGU6ICdob3Jpem9udGFsLXNpbmdsZS1jdXJ2ZScsIGlkOiAnMScgfSk7IC8vIGxpbmUgduG6vSDEkWkga2jhu49pIGto4buRaSDEkeG6p3UgdGnDqm5cbiAgICB9XG5cbiAgICAvLyBraeG7g20gdHJhIGjGsOG7m25nIHRo4bqzbmcgxJHhur9uIGVuZCwgbuG6v3UgY8OzIGto4buRaSB0aMOsIHRyw6FuaFxuICAgIGVuZFBvc2l0aW9uT3JpZ2luLnkgPSBNb0NhbnZhc0NhbGN1bGF0b3JCcmFuY2hVdGlsLm1hdGhPcGVyYXRvcnNDYWxjdWxhdGlvbihkaXJlY3Rpb25TdGFydFksIGVuZFBvc2l0aW9uT3JpZ2luLnksIGxpbmVDdXJ2ZSk7XG4gICAgY29uc3Qgc3RyYWlnaHRMaW5lID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tBbmRBdm9pZEJsb2Nrc1lMZWZ0KG5ld1Bvc2l0aW9uLnggPz8gMCwgbmV3UG9zaXRpb24ueSA/PyAwLCBsaW5lQ3VydmUsIGVuZFBvc2l0aW9uT3JpZ2luLCBkaXJlY3Rpb25TdGFydFksIG9ic3RhY2xlUmVjdCwgc2VwYXJhdGVkUG9pbnRzKTtcblxuICAgIGNvbnN0IGRpcmVjdGlvblN0YXJ0WCA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmNoZWNrVXBEb3duTGVmdFJpZ2h0KHN0cmFpZ2h0TGluZS5lbmRQYXRoLngsIGVuZFBvc2l0aW9uT3JpZ2luLngsICd4Jyk7XG4gICAgaWYgKGRpcmVjdGlvblN0YXJ0WCA9PT0gJ2NlbnRlcicgJiYgZGlyZWN0aW9uU3RhcnRZID09PSAndW5kZXInKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKChzdHJhaWdodExpbmUuZW5kUGF0aC54ID8/IDApIC0gZW5kUG9zaXRpb25PcmlnaW4ueCkgPCBsaW5lQ3VydmUpIHtcbiAgICAgIGNvbnN0IGxpc3RMaW5lID0gc2VwYXJhdGVkUG9pbnRzLmZpbHRlcihpdGVtID0+IGl0ZW0uaWQgPT09ICdjaGVja0FuZEF2b2lkQmxvY2tzWUxlZnQnKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gbGlzdExpbmUuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zdGFydC54ID09PSBzdHJhaWdodExpbmUuZW5kUGF0aC54IHx8IGl0ZW0uZW5kLnggPT09IHN0cmFpZ2h0TGluZS5lbmRQYXRoLngpO1xuICAgICAgZWxlbWVudHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2RpcmVjdGlvblN0YXJ0WCcsIGRpcmVjdGlvblN0YXJ0WCk7XG4gICAgICAgIGlmIChpdGVtLnN0YXJ0LnggPT09IHN0cmFpZ2h0TGluZS5lbmRQYXRoLngpIHtcbiAgICAgICAgICBpdGVtLnN0YXJ0LnggPSBNb0NhbnZhc0NhbGN1bGF0b3JCcmFuY2hVdGlsLm1hdGhPcGVyYXRvcnNDYWxjdWxhdGlvbihkaXJlY3Rpb25TdGFydFgsIGl0ZW0uc3RhcnQueCwgKGxpbmVDdXJ2ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLmVuZC54ID09PSBzdHJhaWdodExpbmUuZW5kUGF0aC54KSB7XG4gICAgICAgICAgaXRlbS5lbmQueCA9IE1vQ2FudmFzQ2FsY3VsYXRvckJyYW5jaFV0aWwubWF0aE9wZXJhdG9yc0NhbGN1bGF0aW9uKGRpcmVjdGlvblN0YXJ0WCwgaXRlbS5lbmQueCwgKGxpbmVDdXJ2ZSkpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIC8vIGtp4buDbSB0cmEgbmdheSBraGkgY3VhIGPDsyB2xrDhu5tuZyBhaSBraMO0bmcgcuG7k2kgaOG6tW5nIHbhur0gUTFcbiAgICBjb25zdCBlbGVtZW50QmxvY2tSb2FkID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tMaW5lUGFzc0Jsb2NrSG9yaXpvbnRhbChzdHJhaWdodExpbmUuZW5kUGF0aC54ID8/IDAsIGVuZFBvc2l0aW9uLngsIHN0cmFpZ2h0TGluZS5lbmRQYXRoLnkgPz8gMCwgJ3gnLCBvYnN0YWNsZVJlY3QpIGFzIElSZWN0O1xuICAgIGNvbnN0IGRpcmVjdGlvbk5leHRYID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tVcERvd25MZWZ0UmlnaHQoc3RyYWlnaHRMaW5lLmVuZFBhdGgueCA/PyAwLCBlbmRQb3NpdGlvbk9yaWdpbi54LCAneCcpO1xuICAgIGNvbnN0IGNvb3JkUTEgPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5kcmF3TGluZVEoeyB4OiBzdHJhaWdodExpbmUuZW5kUGF0aC54ID8/IDAsIHk6IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnkgPz8gMCB9LFxuICAgICAgYCR7ZGlyZWN0aW9uU3RhcnRZfS0ke2RpcmVjdGlvbk5leHRYfWAsIGxpbmVDdXJ2ZSwgbGluZUN1cnZlKTsgLy8gdMOtbmggxJFv4bqhbiBjb25nIHThu6sgxJHGsOG7nW5nIG5nYW5nIHNhbmcgxJHGsOG7nW5nIHRo4bqzbmdcblxuICAgIGlmIChlbGVtZW50QmxvY2tSb2FkKSB7XG4gICAgICBjb29yZFExLngxID0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueCA/PyAwO1xuICAgICAgY29vcmRRMS55MSA9IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnkgPz8gMDtcbiAgICAgIGNvb3JkUTEueCA9IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnggPz8gMDtcbiAgICAgIGNvb3JkUTEueSA9IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnkgPz8gMDtcbiAgICB9XG5cbiAgICAvLyBraeG7g20gdHJhIHbDoCB24bq9IGjGsOG7m25nIG5nYW5nXG4gICAgY29uc3QgZGlyZWN0aW9uWFRvRW5kID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tVcERvd25MZWZ0UmlnaHQoY29vcmRRMS54ID8/IDAsIGVuZFBvc2l0aW9uT3JpZ2luLngsICd4Jyk7XG5cbiAgICBlbmRQb3NpdGlvbi54ID0gTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbC5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uWFRvRW5kLCBlbmRQb3NpdGlvbi54LCBsaW5lQ3VydmUpO1xuICAgIGlmIChNYXRoLmFicygoY29vcmRRMS55ID8/IDApIC0gZW5kUG9zaXRpb24ueSkgPD0gbGluZUN1cnZlKSB7XG4gICAgICBlbmRQb3NpdGlvbi55IC09IGxpbmVDdXJ2ZTtcbiAgICB9XG4gICAgY29uc3QgcGF0aEhvcml6b250YWw6IElQb2ludHNbXSA9IFtdO1xuICAgIGNvbnN0IHsgZW5kUGF0aCB9ID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tBbmRBdm9pZEJsb2Nrc0xlZnQoY29vcmRRMS54ID8/IDAsIGNvb3JkUTEueSA/PyAwLCBsaW5lQ3VydmUsIGVuZFBvc2l0aW9uT3JpZ2luLCBvYnN0YWNsZVJlY3QsIHBhdGhIb3Jpem9udGFsKTtcblxuICAgIGlmIChkaXJlY3Rpb25YVG9FbmQgPT09ICdsZWZ0JyAmJiBlbmRQYXRoLnggPiAoY29vcmRRMS54ID8/IDApKSB7XG4gICAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiBzdHJhaWdodExpbmUuZW5kUGF0aCwgZW5kOiBlbmRQb3NpdGlvbk9yaWdpbiwgbW9kZTogJ3ZlcnRpY2FsJywgaWQ6ICc2YSAnICsgZGlyZWN0aW9uU3RhcnRZIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbmQgPSB7IHg6IChjb29yZFExLnggPz8gMCksIHk6IGNvb3JkUTEueSA/PyAwIH07XG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogc3RyYWlnaHRMaW5lLmVuZFBhdGgsIGVuZDogZW5kLCBtb2RlOiAndmVydGljYWwtc2luZ2xlLWN1cnZlJywgaWQ6ICc2YSAnICsgZGlyZWN0aW9uU3RhcnRZIH0pOyAvLyBnw7NjIGNvbmcgdOG7qyDEkcaw4budbmcgdGjhurNuZyBzYW5nIG5nYW5nXG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goLi4ucGF0aEhvcml6b250YWwpXG4gICAgaWYgKGVuZFBhdGgueCA9PT0gZW5kUG9zaXRpb25PcmlnaW4ueCAmJiBlbmRQYXRoLnkgPCBlbmRQb3NpdGlvbk9yaWdpbi55KSB7XG4gICAgICBjb25zdCBpdGVtTGFzdCA9IHBhdGhIb3Jpem9udGFsLmZpbmQoaXRlbSA9PiBpdGVtLmVuZC54ID09PSBlbmRQYXRoLngpO1xuICAgICAgaWYgKGl0ZW1MYXN0KSB7XG4gICAgICAgIGl0ZW1MYXN0LmVuZC54ID0gZW5kUG9zaXRpb25PcmlnaW4ueCArIDUwO1xuICAgICAgICBlbmRQYXRoLnggPSBpdGVtTGFzdC5lbmQueDtcbiAgICAgIH1cbiAgICB9XG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogZW5kUGF0aCwgZW5kOiB7IHg6IHBvaW50TmV4dC54LCB5OiBwb2ludE5leHQueSB9LCBtb2RlOiAnaG9yaXpvbnRhbCcsIGlkOiAnbGluZUVuZCcgfSk7XG4gIH1cblxuICBzdGF0aWMgcmlnaHRMZWZ0KGVsZW1lbnROZXh0OiBJUmVjdCwgc3RhcnQ6IElQb2ludCwgbGluZUN1cnZlOiBudW1iZXIsIG9ic3RhY2xlUmVjdDogSVJlY3RbXSwgc2VwYXJhdGVkUG9pbnRzOiBBcnJheTxJUG9pbnRzPikge1xuICAgIGNvbnN0IGVuZFBvc2l0aW9uID0ge1xuICAgICAgeDogZWxlbWVudE5leHQueCxcbiAgICAgIHk6IGVsZW1lbnROZXh0LnlcbiAgICB9O1xuXG4gICAgLy8gduG6vSAxIMSRxrDhu51uZyB0aOG6s25nIHThu6sgxJFp4buDbSBzdGFydCByYSBuZ2/DoGkgxJHDo1xuICAgIGNvbnN0IGVuZCA9IHsgeDogKHN0YXJ0LnggPz8gMCkgKyAxMCwgeTogKHN0YXJ0LnkgPz8gMCkgKyAxMCB9O1xuICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogKHN0YXJ0LnggPz8gMCksIHk6IHN0YXJ0LnkgPz8gMCB9LCBlbmQ6IGVuZCwgbW9kZTogJ3ZlcnRpY2FsLXNpbmdsZS1jdXJ2ZScsIGlkOiAnMScgfSk7XG5cbiAgICBjb25zdCBlbmRQb3NpdGlvblggPSBjbG9uZURlZXAoZW5kUG9zaXRpb24pO1xuICAgIGVuZFBvc2l0aW9uWC54IC09IDUwO1xuXG4gICAgbGV0IHNlcGFyYXRlZFBvaW50c0NoZWNrQW5kQXZvaWRCbG9ja3M6IEFycmF5PElQb2ludHM+ID0gW107XG4gICAgbGV0IHsgZW5kUGF0aCB9ID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tBbmRBdm9pZEJsb2NrcyhlbmQueCA/PyAwLCAoZW5kLnkgPz8gMCksIGxpbmVDdXJ2ZSwgZW5kUG9zaXRpb25YLCBvYnN0YWNsZVJlY3QsIHNlcGFyYXRlZFBvaW50c0NoZWNrQW5kQXZvaWRCbG9ja3MpO1xuXG4gICAgaWYgKE1hdGguYWJzKChzdGFydC54ID8/IDApIC0gZW5kUG9zaXRpb24ueCkgPCAxMCB8fCBlbmQueCA+IGVuZFBhdGgueCkge1xuICAgICAgZW5kUGF0aCA9IHtcbiAgICAgICAgeDogZW5kLngsXG4gICAgICAgIHk6IGVuZC55XG4gICAgICB9O1xuXG4gICAgICBzZXBhcmF0ZWRQb2ludHNDaGVja0FuZEF2b2lkQmxvY2tzID0gW107XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKChlbmRQYXRoLnkgPz8gMCkgLSBlbmRQb3NpdGlvbi55KSA8IDE1KSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IHNlcGFyYXRlZFBvaW50c0NoZWNrQW5kQXZvaWRCbG9ja3MuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zdGFydC55ID09PSBlbmRQYXRoLnkgfHwgaXRlbS5lbmQueSA9PT0gZW5kUGF0aC55KTtcbiAgICAgIGVsZW1lbnRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtLnN0YXJ0LnkgPT09IGVuZFBhdGgueSkge1xuICAgICAgICAgIGl0ZW0uc3RhcnQueSAtPSAxMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5lbmQueSA9PT0gZW5kUGF0aC55KSB7XG4gICAgICAgICAgaXRlbS5lbmQueSAtPSAxMDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBzZXBhcmF0ZWRQb2ludHMuc3BsaWNlKHNlcGFyYXRlZFBvaW50cy5sZW5ndGgsIDAsIC4uLnNlcGFyYXRlZFBvaW50c0NoZWNrQW5kQXZvaWRCbG9ja3MpO1xuXG4gICAgaWYgKGVuZFBhdGgueSA9PT0gZW5kUG9zaXRpb24ueSkge1xuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBlbmRQYXRoLnggPz8gMCwgeTogZW5kUGF0aC55IH0sIGVuZDogZW5kUG9zaXRpb24sIG1vZGU6ICdob3Jpem9udGFsJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAvLyBzYXUga2hpIMSRw6MgxJFpIG5nYW5nIHbDoCB0csOhbmggY8OhYyBraOG7kWksIHRp4bq/cCB0aGVvIGzDoCDEkWkgdGnhur9wIGjGsOG7m25nIGzDqm4geHXhu5FuZyDEkeG7gyB24buBIGto4buRaSBj4bqnbiBu4buRaSB04bubaSwgY+G6p24gY2hlY2sgeGVtIMSRaeG7g20gZW5kIFggbsOzIMSRYW5nIOG7nyBoxrDhu5tuZyBuw6BvXG4gICAgY29uc3QgZGlyZWN0aW9uWSA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmNoZWNrVXBEb3duTGVmdFJpZ2h0KGVuZFBhdGgueSwgZW5kUG9zaXRpb24ueSwgJ3knKTtcblxuICAgIGNvbnN0IGNvb3JkUTEgPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5kcmF3TGluZVEoeyB4OiBlbmRQYXRoLnggPz8gMCwgeTogZW5kUGF0aC55ID8/IDAgfSwgYHJpZ2h0LSR7ZGlyZWN0aW9uWSA9PT0gJ2Fib3ZlJyA/ICdhYm92ZScgOiAndW5kZXInfWAsIGxpbmVDdXJ2ZSwgbGluZUN1cnZlKTsgLy8gdMOtbmggxJFv4bqhbiBjb25nIHThu6sgxJHGsOG7nW5nIG5nYW5nIHNhbmcgxJHGsOG7nW5nIHRo4bqzbmdcbiAgICBjb25zdCBlbmRQb3NpdGlvblkgPSBjbG9uZURlZXAoZW5kUG9zaXRpb24pO1xuICAgIGVuZFBvc2l0aW9uWS55ID0gTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbC5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uWSwgZW5kUG9zaXRpb25ZLnksIGxpbmVDdXJ2ZSk7XG5cbiAgICAvLyAvLyBj4bqnbiBjaGVjayBraGkgxJFpIHRo4bqzbmcgbMOqbiBjw7Mgdsaw4bubbmcga2jhu5FpIG7DoG8ga2jDtG5nIMSR4buDIHRp4bq/biBsw6puLCBuaMawbmcgY+G6p24gcGjhuqNpIHhlbSB4IGPhu6dhIG7DsyBjw7MgcXXDoSBn4bqnbiBlbmRYIGtow7RuZywgZ+G6p24gcXXDoSB0aMOsIFxuICAgIGNvbnN0IGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVZID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tCbG9ja3NFbGVtZW50U3RyYWlnaHRZKChlbmRQYXRoLnggPz8gMCkgKyAxMCwgZW5kUGF0aC55ID8/IDAsIGVuZFBvc2l0aW9uWSwgb2JzdGFjbGVSZWN0KTtcbiAgICBpZiAoZWxlbWVudEJsb2NrUm9hZFN0cmFpZ2h0TGluZVkpIHtcbiAgICAgIGNvb3JkUTEueCA9IChlbGVtZW50QmxvY2tSb2FkU3RyYWlnaHRMaW5lWS54ID8/IDApICsgKGVsZW1lbnRCbG9ja1JvYWRTdHJhaWdodExpbmVZLndpZHRoID8/IDApICsgbGluZUN1cnZlO1xuICAgIH1cbiAgICBpZiAoTWF0aC5hYnMoKGNvb3JkUTEueCA/PyAwKSAtIGVuZFBvc2l0aW9uLngpIDwgMjAgJiYgZGlyZWN0aW9uWSA9PT0gJ3VuZGVyJykge1xuICAgICAgY29vcmRRMS54ID0gZW5kUG9zaXRpb24ueCArIDIwOyAgLy8gdHLGsOG7nW5nIGjhu6NwIHJpZ2h0IHF1YXkgeHXhu5FuZyBkxrDhu5tpIMSRaeG7g20gZW5kIGtow6EgZ+G6p24gxJFp4buDbSBzdGFydCA9PiBraMO0bmcgxJHhu6cga2hv4bqjbmcgY8OhY2ggcXVheSBtxalpIHTDqm4gdsOgb1xuICAgIH1cbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IGVuZFBhdGgueCA/PyAwLCB5OiBlbmRQYXRoLnkgfSwgZW5kOiB7IHg6IGNvb3JkUTEueCA/PyAwLCB5OiAoY29vcmRRMS55ID8/IDApIH0sIG1vZGU6ICdob3Jpem9udGFsLXNpbmdsZS1jdXJ2ZScsIGlkOiAnZycgfSk7XG5cbiAgICBsZXQgYXZvaWRCbG9ja3NZTGluZTogSVBvaW50c1tdID0gW107XG4gICAgY29uc3Qgc3RyYWlnaHRMaW5lID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tBbmRBdm9pZEJsb2Nrc1koY29vcmRRMS54ID8/IDAsIGNvb3JkUTEueSA/PyAwLCBsaW5lQ3VydmUsIGVuZFBvc2l0aW9uWSwgZGlyZWN0aW9uWSwgb2JzdGFjbGVSZWN0LCBhdm9pZEJsb2Nrc1lMaW5lKTtcbiAgICBpZiAoZGlyZWN0aW9uWSA9PT0gJ3VuZGVyJyAmJiAoY29vcmRRMS55ID8/IDApID4gZW5kUG9zaXRpb25ZLnkpIHtcbiAgICAgIGF2b2lkQmxvY2tzWUxpbmUgPSBbXTtcbiAgICAgIHN0cmFpZ2h0TGluZS5lbmRQYXRoID0geyB4OiBjb29yZFExLnggPz8gMCwgeTogY29vcmRRMS55ID8/IDAgfTtcbiAgICB9XG4gICAgaWYgKGRpcmVjdGlvblkgPT09ICdhYm92ZScgJiYgc3RyYWlnaHRMaW5lLmVuZFBhdGgueSA8PSBlbmRQb3NpdGlvbi55KSB7XG4gICAgICBhdm9pZEJsb2Nrc1lMaW5lID0gW107XG4gICAgICBzdHJhaWdodExpbmUuZW5kUGF0aCA9IHsgeDogY29vcmRRMS54ID8/IDAsIHk6IGNvb3JkUTEueSA/PyAwIH07XG4gICAgfVxuICAgIGlmIChNYXRoLmFicygoc3RyYWlnaHRMaW5lLmVuZFBhdGgueCA/PyAwKSAtIGVuZFBvc2l0aW9uLngpIDwgMTUpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXZvaWRCbG9ja3NZTGluZS5maWx0ZXIoaXRlbSA9PiBpdGVtLnN0YXJ0LnggPT09IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnggfHwgaXRlbS5lbmQueCA9PT0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueCk7XG4gICAgICBlbGVtZW50cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS5zdGFydC54ID09PSBzdHJhaWdodExpbmUuZW5kUGF0aC54KSB7XG4gICAgICAgICAgaXRlbS5zdGFydC54ICs9IDMwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtLmVuZC54ID09PSBzdHJhaWdodExpbmUuZW5kUGF0aC54KSB7XG4gICAgICAgICAgaXRlbS5lbmQueCArPSAzMDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCguLi5hdm9pZEJsb2Nrc1lMaW5lKTtcbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnggPz8gMCwgeTogc3RyYWlnaHRMaW5lLmVuZFBhdGgueSA/PyAwIH0sIGVuZDogZW5kUG9zaXRpb24sIG1vZGU6ICd2ZXJ0aWNhbC1zaW5nbGUtY3VydmUnLCBpZDogJzQnIH0pO1xuXG4gICAgcmV0dXJuO1xuICB9XG59Il19
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS1jb25uZWN0LWJvdHRvbS1sZWZ0LnVudGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2RyYXctbGluZS9zcmMvdXRpbC9saW5lLWNvbm5lY3QtYm90dG9tLWxlZnQudW50aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTdGLE1BQU0sT0FBTyw4Q0FBOEM7SUFDekQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFnQixFQUFFLFVBQWlCLEVBQUUsS0FBYSxFQUFFLFNBQWlCLEVBQUUsWUFBcUIsRUFBRSxlQUErQjtRQUMzSSxNQUFNLGlCQUFpQixHQUFHO1lBQ3hCLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNkLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNmLENBQUM7UUFDRixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNqRCxNQUFNLGVBQWUsR0FBRyxzQ0FBc0MsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUV2SCxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFFeEIsSUFBSSxlQUFlLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDaEMsTUFBTSxPQUFPLEdBQUcsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUM1RSxNQUFNLElBQUksR0FB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SSxFQUFFLENBQUM7Z0JBQ3JCLENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUMxQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25CLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztRQUMxQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFOUosT0FBTztJQUNULENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gXCJAbGlicy11aS91dGlsc1wiO1xuaW1wb3J0IHsgSVBvaW50LCBJUG9pbnRzLCBJUmVjdCB9IGZyb20gXCIuLi9kcmF3LWxpbmUuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBNb0NhbnZhc0NhbGN1bGF0b3JCcmFuY2hVdGlsIH0gZnJvbSBcIi4vY2FsY3VsYXRvci1icmFuY2gudXRpbFwiO1xuaW1wb3J0IHsgTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwgfSBmcm9tIFwiLi9jYWxjdWxhdG9yLWRpcmV0aW9uLWVsZW1lbnQudW50aWxcIjtcblxuZXhwb3J0IGNsYXNzIE1vQ2FudmFzQ29ubmVjdE5hdmlnYXRpb25Cb3R0b21MZWZ0RWxlbWVudFV0aWwge1xuICBzdGF0aWMgbGluZUxlZnQocG9pbnROZXh0OiBJUmVjdCwgcG9pbnRTdGFydDogSVJlY3QsIHN0YXJ0OiBJUG9pbnQsIGxpbmVDdXJ2ZTogbnVtYmVyLCBvYnN0YWNsZVJlY3Q6IElSZWN0W10sIHNlcGFyYXRlZFBvaW50czogQXJyYXk8SVBvaW50cz4pIHtcbiAgICBjb25zdCBlbmRQb3NpdGlvbk9yaWdpbiA9IHtcbiAgICAgIHg6IHBvaW50TmV4dC54LFxuICAgICAgeTogcG9pbnROZXh0LnlcbiAgICB9O1xuICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gY2xvbmVEZWVwKGVuZFBvc2l0aW9uT3JpZ2luKTtcbiAgICBjb25zdCBkaXJlY3Rpb25TdGFydFkgPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5jaGVja1VwRG93bkxlZnRSaWdodChzdGFydC55LCBlbmRQb3NpdGlvbk9yaWdpbi55LCAneScpO1xuXG4gICAgbGV0IG5ld1Bvc2l0aW9uID0gc3RhcnQ7XG5cbiAgICBpZiAoZGlyZWN0aW9uU3RhcnRZID09PSAnYWJvdmUnKSB7XG4gICAgICBjb25zdCBzdGFydFFMID0geyBseDogc3RhcnQueCAtIGxpbmVDdXJ2ZSwgbHk6IChzdGFydC55ID8/IDApICsgbGluZUN1cnZlIH07XG4gICAgICBjb25zdCBsaW5lID0ge1xuICAgICAgICBzdGFydDogeyB4OiAoc3RhcnQueCA/PyAwKSwgeTogc3RhcnQueSA/PyAwIH0sXG4gICAgICAgIGVuZDogeyB4OiBzdGFydFFMLmx4ID8/IDAsIHk6IHN0YXJ0UUwubHkgPz8gMCB9XG4gICAgICB9O1xuXG4gICAgICBuZXdQb3NpdGlvbiA9IHtcbiAgICAgICAgeDogcG9pbnRTdGFydC54IC0gKGxpbmVDdXJ2ZSArIDEwKSxcbiAgICAgICAgeTogTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbC5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uU3RhcnRZLCBsaW5lLmVuZC55LCBsaW5lQ3VydmUsIHRydWUpXG4gICAgICB9O1xuXG4gICAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiBsaW5lLnN0YXJ0LCBlbmQ6IGxpbmUuZW5kLCBtb2RlOiAndmVydGljYWwtc2luZ2xlLWN1cnZlJywgaWQ6ICcxJyB9KTsgLy8gbGluZSB24bq9IMSRaSBraOG7j2kga2jhu5FpIMSR4bqndSB0acOqblxuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogbGluZS5lbmQsIGVuZDogbmV3UG9zaXRpb24sIG1vZGU6ICdob3Jpem9udGFsLXNpbmdsZS1jdXJ2ZScsIGlkOiAnMScgfSk7IC8vIGxpbmUgduG6vSDEkWkga2jhu49pIGto4buRaSDEkeG6p3UgdGnDqm5cbiAgICB9XG5cbiAgICAvLyBraeG7g20gdHJhIGjGsOG7m25nIHRo4bqzbmcgxJHhur9uIGVuZCwgbuG6v3UgY8OzIGto4buRaSB0aMOsIHRyw6FuaFxuICAgIGVuZFBvc2l0aW9uT3JpZ2luLnkgPSBNb0NhbnZhc0NhbGN1bGF0b3JCcmFuY2hVdGlsLm1hdGhPcGVyYXRvcnNDYWxjdWxhdGlvbihkaXJlY3Rpb25TdGFydFksIGVuZFBvc2l0aW9uT3JpZ2luLnksIGxpbmVDdXJ2ZSk7XG4gICAgY29uc3Qgc3RyYWlnaHRMaW5lID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tBbmRBdm9pZEJsb2Nrc1lMZWZ0KG5ld1Bvc2l0aW9uLnggPz8gMCwgbmV3UG9zaXRpb24ueSA/PyAwLCBsaW5lQ3VydmUsIGVuZFBvc2l0aW9uT3JpZ2luLCBkaXJlY3Rpb25TdGFydFksIG9ic3RhY2xlUmVjdCwgc2VwYXJhdGVkUG9pbnRzKTtcbiAgICBjb25zdCBkaXJlY3Rpb25TdGFydFggPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5jaGVja1VwRG93bkxlZnRSaWdodChzdHJhaWdodExpbmUuZW5kUGF0aC54LCBlbmRQb3NpdGlvbk9yaWdpbi54LCAneCcpO1xuXG4gICAgaWYgKGRpcmVjdGlvblN0YXJ0WCA9PT0gJ2NlbnRlcicgJiYgZGlyZWN0aW9uU3RhcnRZID09PSAndW5kZXInKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKE1hdGguYWJzKChzdHJhaWdodExpbmUuZW5kUGF0aC54ID8/IDApIC0gZW5kUG9zaXRpb25PcmlnaW4ueCkgPCBsaW5lQ3VydmUpIHtcbiAgICAgIGNvbnN0IGxpc3RMaW5lID0gc2VwYXJhdGVkUG9pbnRzLmZpbHRlcihpdGVtID0+IGl0ZW0uaWQgPT09ICdjaGVja0FuZEF2b2lkQmxvY2tzWUxlZnQnKTtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gbGlzdExpbmUuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zdGFydC54ID09PSBzdHJhaWdodExpbmUuZW5kUGF0aC54IHx8IGl0ZW0uZW5kLnggPT09IHN0cmFpZ2h0TGluZS5lbmRQYXRoLngpO1xuXG4gICAgICBlbGVtZW50cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS5zdGFydC54ID09PSBzdHJhaWdodExpbmUuZW5kUGF0aC54KSB7XG4gICAgICAgICAgaXRlbS5zdGFydC54ID0gTW9DYW52YXNDYWxjdWxhdG9yQnJhbmNoVXRpbC5tYXRoT3BlcmF0b3JzQ2FsY3VsYXRpb24oZGlyZWN0aW9uU3RhcnRYLCBpdGVtLnN0YXJ0LngsIChsaW5lQ3VydmUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5lbmQueCA9PT0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueCkge1xuICAgICAgICAgIGl0ZW0uZW5kLnggPSBNb0NhbnZhc0NhbGN1bGF0b3JCcmFuY2hVdGlsLm1hdGhPcGVyYXRvcnNDYWxjdWxhdGlvbihkaXJlY3Rpb25TdGFydFgsIGl0ZW0uZW5kLngsIChsaW5lQ3VydmUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gLy8ga2nhu4NtIHRyYSBuZ2F5IGtoaSBjdWEgY8OzIHbGsOG7m25nIGFpIGtow7RuZyBy4buTaSBo4bq1bmcgduG6vSBRMVxuICAgIGNvbnN0IGVsZW1lbnRCbG9ja1JvYWQgPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5jaGVja0xpbmVQYXNzQmxvY2tIb3Jpem9udGFsKHN0cmFpZ2h0TGluZS5lbmRQYXRoLnggPz8gMCwgZW5kUG9zaXRpb25PcmlnaW4ueCwgc3RyYWlnaHRMaW5lLmVuZFBhdGgueSA/PyAwLCAneCcsIG9ic3RhY2xlUmVjdCkgYXMgSVJlY3Q7XG4gICAgY29uc3QgZGlyZWN0aW9uTmV4dFggPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5jaGVja1VwRG93bkxlZnRSaWdodChzdHJhaWdodExpbmUuZW5kUGF0aC54ID8/IDAsIGVuZFBvc2l0aW9uT3JpZ2luLngsICd4Jyk7XG4gICAgY29uc3QgY29vcmRRMSA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmRyYXdMaW5lUSh7IHg6IHN0cmFpZ2h0TGluZS5lbmRQYXRoLnggPz8gMCwgeTogc3RyYWlnaHRMaW5lLmVuZFBhdGgueSA/PyAwIH0sXG4gICAgICBgJHtkaXJlY3Rpb25TdGFydFl9LSR7ZGlyZWN0aW9uTmV4dFh9YCwgbGluZUN1cnZlLCBsaW5lQ3VydmUpOyAvLyB0w61uaCDEkW/huqFuIGNvbmcgdOG7qyDEkcaw4budbmcgbmdhbmcgc2FuZyDEkcaw4budbmcgdGjhurNuZ1xuICAgIGNvbnN0IGVsZW1lbnRCbG9ja1JvYWRYID0gKGVsZW1lbnRCbG9ja1JvYWQ/LnggPz8gMCkgKyAoZWxlbWVudEJsb2NrUm9hZD8ud2lkdGggPz8gMCk7XG5cbiAgICBpZiAoZWxlbWVudEJsb2NrUm9hZCAmJiBNYXRoLmFicygoZWxlbWVudEJsb2NrUm9hZFgpIC0gKHN0cmFpZ2h0TGluZS5lbmRQYXRoLnggPz8gMCkpIDw9IGxpbmVDdXJ2ZSAqIDIpIHtcbiAgICAgIGNvb3JkUTEueDEgPSBzdHJhaWdodExpbmUuZW5kUGF0aC54ID8/IDA7XG4gICAgICBjb29yZFExLnkxID0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueSA/PyAwO1xuICAgICAgY29vcmRRMS54ID0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueCA/PyAwO1xuICAgICAgY29vcmRRMS55ID0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueSA/PyAwO1xuICAgIH1cblxuICAgIC8vIGtp4buDbSB0cmEgdsOgIHbhur0gaMaw4bubbmcgbmdhbmdcbiAgICBjb25zdCBkaXJlY3Rpb25YVG9FbmQgPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5jaGVja1VwRG93bkxlZnRSaWdodChjb29yZFExLnggPz8gMCwgZW5kUG9zaXRpb24ueCwgJ3gnKTtcbiAgICBjb25zdCBwYXRoSG9yaXpvbnRhbDogSVBvaW50c1tdID0gW107XG4gICAgY29uc3QgZW5kUGF0aCA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmNoZWNrQW5kQXZvaWRCbG9ja3NMZWZ0KGNvb3JkUTEueCA/PyAwLCBjb29yZFExLnkgPz8gMCwgbGluZUN1cnZlLCBlbmRQb3NpdGlvbiwgb2JzdGFjbGVSZWN0LCBwYXRoSG9yaXpvbnRhbCk7XG5cbiAgICBpZiAoZGlyZWN0aW9uWFRvRW5kID09PSAnbGVmdCcgJiYgZW5kUGF0aC54ID4gKGNvb3JkUTEueCA/PyAwKSkge1xuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogc3RyYWlnaHRMaW5lLmVuZFBhdGgsIGVuZDogZW5kUG9zaXRpb24sIG1vZGU6ICd2ZXJ0aWNhbCcsIGlkOiAnNmEgJyArIGRpcmVjdGlvblN0YXJ0WSB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbmQgPSB7IHg6IChjb29yZFExLnggPz8gMCksIHk6IGNvb3JkUTEueSA/PyAwIH07XG5cbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCguLi5wYXRoSG9yaXpvbnRhbCk7XG4gICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogc3RyYWlnaHRMaW5lLmVuZFBhdGgsIGVuZDogZW5kLCBtb2RlOiAndmVydGljYWwtc2luZ2xlLWN1cnZlJywgaWQ6ICc2YSAnICsgZGlyZWN0aW9uU3RhcnRZIH0pOyAvLyBnw7NjIGNvbmcgdOG7qyDEkcaw4budbmcgdGjhurNuZyBzYW5nIG5nYW5nXG4gICAgaWYgKGVuZFBhdGgueCA9PT0gZW5kUG9zaXRpb24ueCAmJiBlbmRQYXRoLnkgPCBlbmRQb3NpdGlvbi55KSB7XG4gICAgICBjb25zdCBpdGVtTGFzdCA9IHBhdGhIb3Jpem9udGFsLmZpbmQoaXRlbSA9PiBpdGVtLmVuZC54ID09PSBlbmRQYXRoLngpO1xuXG4gICAgICBpZiAoaXRlbUxhc3QpIHtcbiAgICAgICAgaXRlbUxhc3QuZW5kLnggPSBlbmRQb3NpdGlvbi54ICsgNTA7XG4gICAgICAgIGVuZFBhdGgueCA9IGl0ZW1MYXN0LmVuZC54O1xuICAgICAgfVxuICAgIH1cbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiBlbmRQYXRoLCBlbmQ6IHsgeDogcG9pbnROZXh0LngsIHk6IHBvaW50TmV4dC55IH0sIG1vZGU6ICdob3Jpem9udGFsJywgaWQ6ICdsaW5lRW5kJyB9KTtcbiAgfVxuXG4gIHN0YXRpYyByaWdodExlZnQoZWxlbWVudE5leHQ6IElSZWN0LCBzdGFydDogSVBvaW50LCBsaW5lQ3VydmU6IG51bWJlciwgb2JzdGFjbGVSZWN0OiBJUmVjdFtdLCBzZXBhcmF0ZWRQb2ludHM6IEFycmF5PElQb2ludHM+KSB7XG4gICAgY29uc3QgZW5kUG9zaXRpb24gPSB7XG4gICAgICB4OiBlbGVtZW50TmV4dC54LFxuICAgICAgeTogZWxlbWVudE5leHQueVxuICAgIH07XG5cbiAgICAvLyB24bq9IDEgxJHGsOG7nW5nIHRo4bqzbmcgdOG7qyDEkWnhu4NtIHN0YXJ0IHJhIG5nb8OgaSDEkcOjXG4gICAgY29uc3QgZW5kID0geyB4OiAoc3RhcnQueCA/PyAwKSArIDEwLCB5OiAoc3RhcnQueSA/PyAwKSArIDEwIH07XG5cbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IChzdGFydC54ID8/IDApLCB5OiBzdGFydC55ID8/IDAgfSwgZW5kOiBlbmQsIG1vZGU6ICd2ZXJ0aWNhbC1zaW5nbGUtY3VydmUnLCBpZDogJzEnIH0pO1xuXG4gICAgY29uc3QgZW5kUG9zaXRpb25YID0gY2xvbmVEZWVwKGVuZFBvc2l0aW9uKTtcblxuICAgIGVuZFBvc2l0aW9uWC54IC09IDUwO1xuXG4gICAgbGV0IHNlcGFyYXRlZFBvaW50c0NoZWNrQW5kQXZvaWRCbG9ja3M6IEFycmF5PElQb2ludHM+ID0gW107XG5cbiAgICBsZXQgeyBlbmRQYXRoIH0gPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5jaGVja0FuZEF2b2lkQmxvY2tzKGVuZC54ID8/IDAsIChlbmQueSA/PyAwKSwgbGluZUN1cnZlLCBlbmRQb3NpdGlvblgsIG9ic3RhY2xlUmVjdCwgc2VwYXJhdGVkUG9pbnRzQ2hlY2tBbmRBdm9pZEJsb2Nrcyk7XG5cbiAgICBpZiAoTWF0aC5hYnMoKHN0YXJ0LnggPz8gMCkgLSBlbmRQb3NpdGlvbi54KSA8IDEwIHx8IGVuZC54ID4gZW5kUGF0aC54KSB7XG4gICAgICBlbmRQYXRoID0ge1xuICAgICAgICB4OiBlbmQueCxcbiAgICAgICAgeTogZW5kLnlcbiAgICAgIH07XG5cbiAgICAgIHNlcGFyYXRlZFBvaW50c0NoZWNrQW5kQXZvaWRCbG9ja3MgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAoTWF0aC5hYnMoKGVuZFBhdGgueSA/PyAwKSAtIGVuZFBvc2l0aW9uLnkpIDwgMTUpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBzZXBhcmF0ZWRQb2ludHNDaGVja0FuZEF2b2lkQmxvY2tzLmZpbmQoaXRlbSA9PiAoaXRlbS5lbmQueSA9PT0gZW5kUGF0aC55ICYmIGl0ZW0uZW5kLnggPT09IGVuZFBhdGgueCkpO1xuICAgICAgY29uc3QgZWxlbWVudFFSID0gc2VwYXJhdGVkUG9pbnRzQ2hlY2tBbmRBdm9pZEJsb2Nrcy5maW5kKGl0ZW0gPT4gKGl0ZW0uZW5kLnkgPT09IGVsZW1lbnQ/LnN0YXJ0LnkgJiYgaXRlbS5lbmQueCA9PT0gZWxlbWVudC5zdGFydC54KSk7XG5cbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIGVsZW1lbnQuc3RhcnQueSA9IGVuZFBvc2l0aW9uLnk7XG4gICAgICAgIGVsZW1lbnQuZW5kLnkgPSBlbmRQb3NpdGlvbi55O1xuICAgICAgfVxuICAgICAgaWYgKGVsZW1lbnRRUikge1xuICAgICAgICBlbGVtZW50UVIuZW5kLnkgPSBlbmRQb3NpdGlvbi55O1xuICAgICAgfVxuICAgIH1cblxuICAgIHNlcGFyYXRlZFBvaW50cy5zcGxpY2Uoc2VwYXJhdGVkUG9pbnRzLmxlbmd0aCwgMCwgLi4uc2VwYXJhdGVkUG9pbnRzQ2hlY2tBbmRBdm9pZEJsb2Nrcyk7XG5cbiAgICBpZiAoZW5kUGF0aC55ID09PSBlbmRQb3NpdGlvbi55KSB7XG4gICAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IGVuZFBhdGgueCA/PyAwLCB5OiBlbmRQYXRoLnkgfSwgZW5kOiBlbmRQb3NpdGlvbiwgbW9kZTogJ2hvcml6b250YWwnIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChNYXRoLmFicygoZW5kUGF0aC55ID8/IDApIC0gZW5kUG9zaXRpb24ueSkgPCAxNSkge1xuICAgICAgc2VwYXJhdGVkUG9pbnRzLnB1c2goeyBzdGFydDogeyB4OiBlbmRQYXRoLnggPz8gMCwgeTogZW5kUGF0aC55IH0sIGVuZDogZW5kUG9zaXRpb24sIG1vZGU6ICd2ZXJ0aWNhbCcgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAvLyBzYXUga2hpIMSRw6MgxJFpIG5nYW5nIHbDoCB0csOhbmggY8OhYyBraOG7kWksIHRp4bq/cCB0aGVvIGzDoCDEkWkgdGnhur9wIGjGsOG7m25nIGzDqm4geHXhu5FuZyDEkeG7gyB24buBIGto4buRaSBj4bqnbiBu4buRaSB04bubaSwgY+G6p24gY2hlY2sgeGVtIMSRaeG7g20gZW5kIFggbsOzIMSRYW5nIOG7nyBoxrDhu5tuZyBuw6BvXG4gICAgY29uc3QgZGlyZWN0aW9uWSA9IE1vQ2FudmFzQ2FsY3VsYXRvckRpcmVjdGlvbkVsZW1lbnRVdGlsLmNoZWNrVXBEb3duTGVmdFJpZ2h0KGVuZFBhdGgueSwgZW5kUG9zaXRpb24ueSwgJ3knKTtcblxuICAgIGNvbnN0IGNvb3JkUTEgPSBNb0NhbnZhc0NhbGN1bGF0b3JEaXJlY3Rpb25FbGVtZW50VXRpbC5kcmF3TGluZVEoeyB4OiBlbmRQYXRoLnggPz8gMCwgeTogZW5kUGF0aC55ID8/IDAgfSwgYHJpZ2h0LSR7ZGlyZWN0aW9uWSA9PT0gJ2Fib3ZlJyA/ICdhYm92ZScgOiAndW5kZXInfWAsIGxpbmVDdXJ2ZSwgbGluZUN1cnZlKTsgLy8gdMOtbmggxJFv4bqhbiBjb25nIHThu6sgxJHGsOG7nW5nIG5nYW5nIHNhbmcgxJHGsOG7nW5nIHRo4bqzbmdcbiAgICBjb25zdCBlbmRQb3NpdGlvblkgPSBjbG9uZURlZXAoZW5kUG9zaXRpb24pO1xuXG4gICAgZW5kUG9zaXRpb25ZLnkgPSBNb0NhbnZhc0NhbGN1bGF0b3JCcmFuY2hVdGlsLm1hdGhPcGVyYXRvcnNDYWxjdWxhdGlvbihkaXJlY3Rpb25ZLCBlbmRQb3NpdGlvblkueSwgbGluZUN1cnZlKTtcbiAgICBzZXBhcmF0ZWRQb2ludHMucHVzaCh7IHN0YXJ0OiB7IHg6IGVuZFBhdGgueCA/PyAwLCB5OiBlbmRQYXRoLnkgfSwgZW5kOiB7IHg6IGNvb3JkUTEueCA/PyAwLCB5OiAoY29vcmRRMS55ID8/IDApIH0sIG1vZGU6ICdob3Jpem9udGFsLXNpbmdsZS1jdXJ2ZScsIGlkOiAnZycgfSk7XG5cbiAgICBsZXQgYXZvaWRCbG9ja3NZTGluZTogSVBvaW50c1tdID0gW107XG4gICAgY29uc3Qgc3RyYWlnaHRMaW5lID0gTW9DYW52YXNDYWxjdWxhdG9yRGlyZWN0aW9uRWxlbWVudFV0aWwuY2hlY2tBbmRBdm9pZEJsb2Nrc1koY29vcmRRMS54ID8/IDAsIGNvb3JkUTEueSA/PyAwLCBsaW5lQ3VydmUsIGVuZFBvc2l0aW9uWSwgZGlyZWN0aW9uWSwgb2JzdGFjbGVSZWN0LCBhdm9pZEJsb2Nrc1lMaW5lKTtcblxuICAgIGlmIChkaXJlY3Rpb25ZID09PSAndW5kZXInICYmIChjb29yZFExLnkgPz8gMCkgPiBlbmRQb3NpdGlvblkueSkge1xuICAgICAgYXZvaWRCbG9ja3NZTGluZSA9IFtdO1xuICAgICAgc3RyYWlnaHRMaW5lLmVuZFBhdGggPSB7IHg6IGNvb3JkUTEueCA/PyAwLCB5OiBjb29yZFExLnkgPz8gMCB9O1xuICAgIH1cbiAgICBpZiAoZGlyZWN0aW9uWSA9PT0gJ2Fib3ZlJyAmJiBzdHJhaWdodExpbmUuZW5kUGF0aC55IDw9IGVuZFBvc2l0aW9uLnkpIHtcbiAgICAgIGF2b2lkQmxvY2tzWUxpbmUgPSBbXTtcbiAgICAgIHN0cmFpZ2h0TGluZS5lbmRQYXRoID0geyB4OiBjb29yZFExLnggPz8gMCwgeTogY29vcmRRMS55ID8/IDAgfTtcbiAgICB9XG4gICAgaWYgKE1hdGguYWJzKChzdHJhaWdodExpbmUuZW5kUGF0aC54ID8/IDApIC0gZW5kUG9zaXRpb24ueCkgPCAxNSkge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSBhdm9pZEJsb2Nrc1lMaW5lLmZpbHRlcihpdGVtID0+IGl0ZW0uc3RhcnQueCA9PT0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueCB8fCBpdGVtLmVuZC54ID09PSBzdHJhaWdodExpbmUuZW5kUGF0aC54KTtcblxuICAgICAgZWxlbWVudHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uc3RhcnQueCA9PT0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueCkge1xuICAgICAgICAgIGl0ZW0uc3RhcnQueCArPSAzMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXRlbS5lbmQueCA9PT0gc3RyYWlnaHRMaW5lLmVuZFBhdGgueCkge1xuICAgICAgICAgIGl0ZW0uZW5kLnggKz0gMzA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKC4uLmF2b2lkQmxvY2tzWUxpbmUpO1xuICAgIHNlcGFyYXRlZFBvaW50cy5wdXNoKHsgc3RhcnQ6IHsgeDogc3RyYWlnaHRMaW5lLmVuZFBhdGgueCA/PyAwLCB5OiBzdHJhaWdodExpbmUuZW5kUGF0aC55ID8/IDAgfSwgZW5kOiBlbmRQb3NpdGlvbiwgbW9kZTogJ3ZlcnRpY2FsLXNpbmdsZS1jdXJ2ZScsIGlkOiAnNCcgfSk7XG5cbiAgICByZXR1cm47XG4gIH1cbn0iXX0=
|
|
@@ -107,19 +107,21 @@ class MoCanvasCalculatorDirectionElementUtil {
|
|
|
107
107
|
x: Q1.x ?? 0,
|
|
108
108
|
y: (directionY === 'under' ? bottomElementBlockRoad : topElementBlockRoad)
|
|
109
109
|
};
|
|
110
|
-
if (
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
110
|
+
if (MoCanvasConnectNavigationNewElementUtil.START_MODE !== 'bottom-left') {
|
|
111
|
+
if ((directionY === 'under' && bottomElementBlockRoad - (Q1.y ?? 0) <= 0)
|
|
112
|
+
|| (directionY === 'above' && topElementBlockRoad - (Q1.y ?? 0) >= 0)) {
|
|
113
|
+
L1.y = Q1.y ?? 0;
|
|
114
|
+
}
|
|
115
|
+
if (Math.abs((L1.y ?? 0) - endY) <= 10) {
|
|
116
|
+
L1.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, L1.y, lineCurve);
|
|
117
|
+
}
|
|
116
118
|
}
|
|
117
119
|
const Q2 = this.drawLineQ({ x: L1.x, y: L1.y ?? 0 }, `${directionY === 'under' ? 'under' : 'above'}-${directionX}`, lineCurve, lineCurve);
|
|
118
120
|
const pathQ1 = `Q ${Q1.x1},${Q1.y1} ${Q1.x},${Q1.y} L ${L1.x} ${L1.y}`;
|
|
119
121
|
const pathQ2 = `Q ${Q2.x1},${Q2.y1} ${Q2.x},${Q2.y}`;
|
|
120
122
|
separatedPoints.push({ start: { x: coordLX ?? startX, y: startY }, end: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, mode: 'horizontal-single-curve', id: key, name: 'qr' });
|
|
121
|
-
separatedPoints.push({ start: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, end: { x: L1.x ?? 0, y: L1.y
|
|
122
|
-
separatedPoints.push({ start: { x: L1.x ?? 0, y: L1.y
|
|
123
|
+
separatedPoints.push({ start: { x: Q1.x ?? 0, y: Q1.y ?? 0 }, end: { x: L1.x ?? 0, y: L1.y }, mode: 'horizontal', id: key, name: 'lr' });
|
|
124
|
+
separatedPoints.push({ start: { x: L1.x ?? 0, y: L1.y }, end: { x: Q2.x ?? 0, y: Q2.y ?? 0 }, mode: 'vertical-single-curve', id: key, name: 'q2r' });
|
|
123
125
|
return {
|
|
124
126
|
pathByPassQ: `${pathQ1} ${pathQ2}`,
|
|
125
127
|
endPath: {
|
|
@@ -204,15 +206,12 @@ class MoCanvasCalculatorDirectionElementUtil {
|
|
|
204
206
|
return elementBlockRoad.reduce((a, b) => (Math.abs(((a.y ?? 0) - startY))) < (Math.abs(((b.y ?? 0) - startY))) ? a : b);
|
|
205
207
|
}
|
|
206
208
|
// kiểm tra hướng sang phải là tránh khối
|
|
207
|
-
static checkAndAvoidBlocksLeft(startX, startY, lineCurve, endPosition, obstacleRect, separatedPoints
|
|
209
|
+
static checkAndAvoidBlocksLeft(startX, startY, lineCurve, endPosition, obstacleRect, separatedPoints) {
|
|
208
210
|
const coordLX = { x: endPosition.x, y: startY };
|
|
209
211
|
const elementBlockRoad = this.checkLinePassBlockHorizontal(startX, endPosition.x, startY, 'x', obstacleRect);
|
|
210
212
|
if (!elementBlockRoad) {
|
|
211
213
|
separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: '14' });
|
|
212
|
-
return
|
|
213
|
-
path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,
|
|
214
|
-
endPath: coordLX
|
|
215
|
-
};
|
|
214
|
+
return coordLX;
|
|
216
215
|
}
|
|
217
216
|
const directionX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(startX, endPosition.x, 'x');
|
|
218
217
|
const specificXElement = directionX === 'right' ? (elementBlockRoad.x ?? 0) : ((elementBlockRoad.x ?? 0) + (elementBlockRoad.width ?? 0));
|
|
@@ -225,14 +224,17 @@ class MoCanvasCalculatorDirectionElementUtil {
|
|
|
225
224
|
coordLX.x = startX;
|
|
226
225
|
startXBypassElement = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionX, coordLX.x, lineCurve);
|
|
227
226
|
}
|
|
228
|
-
|
|
229
|
-
|
|
227
|
+
let lineByPassBlock = [];
|
|
228
|
+
let { endPath } = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSide(startXBypassElement ?? 0, coordLX.y ?? 0, endPosition.y, lineCurve, elementBlockRoad, directionX, lineByPassBlock, undefined, coordLX.x);
|
|
229
|
+
if (MoCanvasConnectNavigationNewElementUtil.START_MODE === 'bottom-left' && elementBlockRoad.x + (elementBlockRoad.width) / 2 === endPosition.x && Math.abs(endPosition.y - elementBlockRoad.y) <= 20) { // check xem khối chắn có phải là khối đích hay không?
|
|
230
|
+
lineByPassBlock = [];
|
|
231
|
+
const data = MoCanvasCalculatorDirectionElementUtil.byPassElementOnRightSideNewMode(startXBypassElement ?? 0, coordLX.y ?? 0, endPosition.y, lineByPassBlock, undefined, coordLX.x);
|
|
232
|
+
endPath = data.endPath;
|
|
233
|
+
}
|
|
234
|
+
separatedPoints.push(...lineByPassBlock);
|
|
230
235
|
separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: '15' });
|
|
231
|
-
const
|
|
232
|
-
return
|
|
233
|
-
path: data.path,
|
|
234
|
-
endPath: data.endPath
|
|
235
|
-
};
|
|
236
|
+
const dataEndPath = this.checkAndAvoidBlocksLeft(endPath.x ?? 0, endPath.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);
|
|
237
|
+
return dataEndPath;
|
|
236
238
|
}
|
|
237
239
|
// kiểm tra hướng sang phải là tránh khối
|
|
238
240
|
static checkAndAvoidBlocks(startX, startY, lineCurve, endPosition, obstacleRect, separatedPoints, pathPre) {
|
|
@@ -247,7 +249,7 @@ class MoCanvasCalculatorDirectionElementUtil {
|
|
|
247
249
|
}
|
|
248
250
|
coordLX.x = toX;
|
|
249
251
|
}
|
|
250
|
-
separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: '
|
|
252
|
+
separatedPoints.push({ start: { x: startX, y: startY }, end: coordLX, mode: 'horizontal', id: 'checkAndAvoidBlocks', name: 'end' });
|
|
251
253
|
return {
|
|
252
254
|
path: pathPre ? `${pathPre} L ${coordLX.x} ${coordLX.y}` : `L ${coordLX.x} ${coordLX.y}`,
|
|
253
255
|
endPath: coordLX
|
|
@@ -325,7 +327,7 @@ class MoCanvasCalculatorDirectionElementUtil {
|
|
|
325
327
|
const bottomElementBlockRoad = (elementBlockRoadStraightLineX.y ?? 0) + (elementBlockRoadStraightLineX.height ?? 0);
|
|
326
328
|
let toY = (directionY === 'under' ? topElementBlockRoad : bottomElementBlockRoad);
|
|
327
329
|
toY = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, toY, lineCurve * 2);
|
|
328
|
-
if (toY > startY) {
|
|
330
|
+
if (toY > startY && MoCanvasConnectNavigationNewElementUtil.START_MODE !== 'bottom-left') {
|
|
329
331
|
coordLX.y = toY;
|
|
330
332
|
}
|
|
331
333
|
}
|
|
@@ -364,6 +366,15 @@ class MoCanvasCalculatorDirectionElementUtil {
|
|
|
364
366
|
endPath: data.endPath
|
|
365
367
|
};
|
|
366
368
|
}
|
|
369
|
+
static byPassElementOnRightSideNewMode(startX, startY, endY, separatedPoints, key, coordLX) {
|
|
370
|
+
const start = { x: coordLX ?? startX, y: startY };
|
|
371
|
+
const end = { x: (start.x ?? 0) - 20, y: endY };
|
|
372
|
+
separatedPoints.push({ start: start, end: end, mode: 'horizontal', id: key, name: 'q2r' });
|
|
373
|
+
return {
|
|
374
|
+
pathByPassQ: ``,
|
|
375
|
+
endPath: end
|
|
376
|
+
};
|
|
377
|
+
}
|
|
367
378
|
}
|
|
368
379
|
|
|
369
380
|
class MoCanvasConnectNavigationBottomLeftElementUtil {
|
|
@@ -399,7 +410,6 @@ class MoCanvasConnectNavigationBottomLeftElementUtil {
|
|
|
399
410
|
const listLine = separatedPoints.filter(item => item.id === 'checkAndAvoidBlocksYLeft');
|
|
400
411
|
const elements = listLine.filter(item => item.start.x === straightLine.endPath.x || item.end.x === straightLine.endPath.x);
|
|
401
412
|
elements.forEach(item => {
|
|
402
|
-
console.log('directionStartX', directionStartX);
|
|
403
413
|
if (item.start.x === straightLine.endPath.x) {
|
|
404
414
|
item.start.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartX, item.start.x, (lineCurve));
|
|
405
415
|
}
|
|
@@ -409,34 +419,31 @@ class MoCanvasConnectNavigationBottomLeftElementUtil {
|
|
|
409
419
|
});
|
|
410
420
|
}
|
|
411
421
|
// // kiểm tra ngay khi cua có vướng ai không rồi hẵng vẽ Q1
|
|
412
|
-
const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(straightLine.endPath.x ?? 0,
|
|
422
|
+
const elementBlockRoad = MoCanvasCalculatorDirectionElementUtil.checkLinePassBlockHorizontal(straightLine.endPath.x ?? 0, endPositionOrigin.x, straightLine.endPath.y ?? 0, 'x', obstacleRect);
|
|
413
423
|
const directionNextX = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(straightLine.endPath.x ?? 0, endPositionOrigin.x, 'x');
|
|
414
424
|
const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: straightLine.endPath.x ?? 0, y: straightLine.endPath.y ?? 0 }, `${directionStartY}-${directionNextX}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
|
|
415
|
-
|
|
425
|
+
const elementBlockRoadX = (elementBlockRoad?.x ?? 0) + (elementBlockRoad?.width ?? 0);
|
|
426
|
+
if (elementBlockRoad && Math.abs((elementBlockRoadX) - (straightLine.endPath.x ?? 0)) <= lineCurve * 2) {
|
|
416
427
|
coordQ1.x1 = straightLine.endPath.x ?? 0;
|
|
417
428
|
coordQ1.y1 = straightLine.endPath.y ?? 0;
|
|
418
429
|
coordQ1.x = straightLine.endPath.x ?? 0;
|
|
419
430
|
coordQ1.y = straightLine.endPath.y ?? 0;
|
|
420
431
|
}
|
|
421
432
|
// kiểm tra và vẽ hướng ngang
|
|
422
|
-
const directionXToEnd = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0,
|
|
423
|
-
endPosition.x = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionXToEnd, endPosition.x, lineCurve);
|
|
424
|
-
if (Math.abs((coordQ1.y ?? 0) - endPosition.y) <= lineCurve) {
|
|
425
|
-
endPosition.y -= lineCurve;
|
|
426
|
-
}
|
|
433
|
+
const directionXToEnd = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0, endPosition.x, 'x');
|
|
427
434
|
const pathHorizontal = [];
|
|
428
|
-
const
|
|
435
|
+
const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, pathHorizontal);
|
|
429
436
|
if (directionXToEnd === 'left' && endPath.x > (coordQ1.x ?? 0)) {
|
|
430
|
-
separatedPoints.push({ start: straightLine.endPath, end:
|
|
437
|
+
separatedPoints.push({ start: straightLine.endPath, end: endPosition, mode: 'vertical', id: '6a ' + directionStartY });
|
|
431
438
|
return;
|
|
432
439
|
}
|
|
433
440
|
const end = { x: (coordQ1.x ?? 0), y: coordQ1.y ?? 0 };
|
|
434
|
-
separatedPoints.push({ start: straightLine.endPath, end: end, mode: 'vertical-single-curve', id: '6a ' + directionStartY }); // góc cong từ đường thẳng sang ngang
|
|
435
441
|
separatedPoints.push(...pathHorizontal);
|
|
436
|
-
|
|
442
|
+
separatedPoints.push({ start: straightLine.endPath, end: end, mode: 'vertical-single-curve', id: '6a ' + directionStartY }); // góc cong từ đường thẳng sang ngang
|
|
443
|
+
if (endPath.x === endPosition.x && endPath.y < endPosition.y) {
|
|
437
444
|
const itemLast = pathHorizontal.find(item => item.end.x === endPath.x);
|
|
438
445
|
if (itemLast) {
|
|
439
|
-
itemLast.end.x =
|
|
446
|
+
itemLast.end.x = endPosition.x + 50;
|
|
440
447
|
endPath.x = itemLast.end.x;
|
|
441
448
|
}
|
|
442
449
|
}
|
|
@@ -462,34 +469,30 @@ class MoCanvasConnectNavigationBottomLeftElementUtil {
|
|
|
462
469
|
separatedPointsCheckAndAvoidBlocks = [];
|
|
463
470
|
}
|
|
464
471
|
if (Math.abs((endPath.y ?? 0) - endPosition.y) < 15) {
|
|
465
|
-
const
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
}
|
|
472
|
+
const element = separatedPointsCheckAndAvoidBlocks.find(item => (item.end.y === endPath.y && item.end.x === endPath.x));
|
|
473
|
+
const elementQR = separatedPointsCheckAndAvoidBlocks.find(item => (item.end.y === element?.start.y && item.end.x === element.start.x));
|
|
474
|
+
if (element) {
|
|
475
|
+
element.start.y = endPosition.y;
|
|
476
|
+
element.end.y = endPosition.y;
|
|
477
|
+
}
|
|
478
|
+
if (elementQR) {
|
|
479
|
+
elementQR.end.y = endPosition.y;
|
|
480
|
+
}
|
|
474
481
|
}
|
|
475
482
|
separatedPoints.splice(separatedPoints.length, 0, ...separatedPointsCheckAndAvoidBlocks);
|
|
476
483
|
if (endPath.y === endPosition.y) {
|
|
477
484
|
separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: endPosition, mode: 'horizontal' });
|
|
478
485
|
return;
|
|
479
486
|
}
|
|
487
|
+
if (Math.abs((endPath.y ?? 0) - endPosition.y) < 15) {
|
|
488
|
+
separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: endPosition, mode: 'vertical' });
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
480
491
|
// // sau khi đã đi ngang và tránh các khối, tiếp theo là đi tiếp hướng lên xuống để về khối cần nối tới, cần check xem điểm end X nó đang ở hướng nào
|
|
481
492
|
const directionY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPosition.y, 'y');
|
|
482
493
|
const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `right-${directionY === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
|
|
483
494
|
const endPositionY = cloneDeep(endPosition);
|
|
484
495
|
endPositionY.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionY, endPositionY.y, lineCurve);
|
|
485
|
-
// // cần check khi đi thẳng lên có vướng khối nào không để tiến lên, nhưng cần phải xem x của nó có quá gần endX không, gần quá thì
|
|
486
|
-
const elementBlockRoadStraightLineY = MoCanvasCalculatorDirectionElementUtil.checkBlocksElementStraightY((endPath.x ?? 0) + 10, endPath.y ?? 0, endPositionY, obstacleRect);
|
|
487
|
-
if (elementBlockRoadStraightLineY) {
|
|
488
|
-
coordQ1.x = (elementBlockRoadStraightLineY.x ?? 0) + (elementBlockRoadStraightLineY.width ?? 0) + lineCurve;
|
|
489
|
-
}
|
|
490
|
-
if (Math.abs((coordQ1.x ?? 0) - endPosition.x) < 20 && directionY === 'under') {
|
|
491
|
-
coordQ1.x = endPosition.x + 20; // trường hợp right quay xuống dưới điểm end khá gần điểm start => không đủ khoảng cách quay mũi tên vào
|
|
492
|
-
}
|
|
493
496
|
separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y }, end: { x: coordQ1.x ?? 0, y: (coordQ1.y ?? 0) }, mode: 'horizontal-single-curve', id: 'g' });
|
|
494
497
|
let avoidBlocksYLine = [];
|
|
495
498
|
const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksY(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPositionY, directionY, obstacleRect, avoidBlocksYLine);
|
|
@@ -629,21 +632,18 @@ class MoCanvasConnectNavigationNewElementUtil {
|
|
|
629
632
|
endPosition.y = MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartY, endY, (lineCurve * 2));
|
|
630
633
|
const pathQ = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: (start.x ?? 0) + 10, y: start.y ?? 0 }, `right-${directionStartY === 'under' ? 'under' : 'above'}`, lineCurve, lineCurve);
|
|
631
634
|
const startQL = { lx: pathQ.x, ly: MoCanvasCalculatorBranchUtil.mathOperatorsCalculation(directionStartY, (pathQ.y ?? 0), ((elementFrom.height ?? 0) / 2), true) };
|
|
632
|
-
const dPathStart = `Q ${pathQ.x1} ${pathQ.y1} ${pathQ.x} ${pathQ.y} L ${startQL.lx} ${startQL.ly}`;
|
|
633
635
|
separatedPoints.push({ start: { x: (start.x ?? 0), y: start.y ?? 0 }, end: { x: pathQ.x ?? 0, y: pathQ.y ?? 0 }, mode: 'horizontal-single-curve', id: '1' });
|
|
634
636
|
separatedPoints.push({ start: { x: pathQ.x ?? 0, y: pathQ.y ?? 0 }, end: { x: startQL.lx ?? 0, y: startQL.ly }, mode: 'horizontal', id: '2' });
|
|
635
637
|
if (directionStartY === 'center') {
|
|
636
638
|
const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: startQL.lx ?? 0, y: startQL.ly ?? 0 }, `above-left`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
|
|
637
|
-
const pathQ1 = `Q ${coordQ1.x1},${coordQ1.y1} ${coordQ1.x},${coordQ1.y}`; // từ ngang sang thẳng phải có đường cong
|
|
638
639
|
separatedPoints.push({ start: { x: startQL.lx ?? 0, y: startQL.ly }, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'vertical-single-curve', id: '3' });
|
|
639
|
-
const
|
|
640
|
+
const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);
|
|
640
641
|
const directionStartY2 = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPositionOrigin.y, 'y');
|
|
641
642
|
const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `left-${directionStartY2 === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
|
|
642
|
-
const pathQ2 = `Q ${coordQ2.x1},${coordQ2.y1} ${coordQ2.x},${coordQ2.y}`; // từ ngang sang thẳng phải có đường cong
|
|
643
643
|
separatedPoints.push({ start: { x: endPath.x ?? 0, y: endPath.y ?? 0 }, end: { x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, mode: 'horizontal-single-curve', id: '4' });
|
|
644
|
-
|
|
644
|
+
this.closeLine({ x: coordQ2.x ?? 0, y: coordQ2.y ?? 0 }, endPositionOrigin, lineCurve, elementNext, separatedPoints);
|
|
645
645
|
return {
|
|
646
|
-
dPath:
|
|
646
|
+
dPath: ``,
|
|
647
647
|
};
|
|
648
648
|
}
|
|
649
649
|
const straightLine = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksYLeft(startQL.lx ?? 0, startQL.ly ?? 0, lineCurve, endPosition, directionStartY, obstacleRect, separatedPoints);
|
|
@@ -684,7 +684,7 @@ class MoCanvasConnectNavigationNewElementUtil {
|
|
|
684
684
|
coordQ1.y = straightLine.endPath.y ?? 0;
|
|
685
685
|
}
|
|
686
686
|
separatedPoints.push({ start: straightLine.endPath, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'vertical-single-curve', id: '6a ' + directionStartY });
|
|
687
|
-
const
|
|
687
|
+
const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);
|
|
688
688
|
const directionStartY2 = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPositionOrigin.y, 'y');
|
|
689
689
|
const directionNextY = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(coordQ1.x ?? 0, endPath.x, 'x');
|
|
690
690
|
const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `${directionNextY}-${directionStartY2 === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
|
|
@@ -749,7 +749,7 @@ class MoCanvasConnectNavigationNewElementUtil {
|
|
|
749
749
|
const coordQ1 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: startQL.lx ?? 0, y: startQL.ly ?? 0 }, `above-left`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
|
|
750
750
|
// từ ngang sang thẳng phải có đường cong
|
|
751
751
|
separatedPoints.push({ start: { x: startQL.lx ?? 0, y: startQL.ly }, end: { x: coordQ1.x ?? 0, y: coordQ1.y ?? 0 }, mode: 'vertical-single-curve', id: '3' });
|
|
752
|
-
const
|
|
752
|
+
const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, separatedPoints);
|
|
753
753
|
const directionStartY2 = MoCanvasCalculatorDirectionElementUtil.checkUpDownLeftRight(endPath.y, endPositionOrigin.y, 'y');
|
|
754
754
|
const coordQ2 = MoCanvasCalculatorDirectionElementUtil.drawLineQ({ x: endPath.x ?? 0, y: endPath.y ?? 0 }, `left-${directionStartY2 === 'above' ? 'above' : 'under'}`, lineCurve, lineCurve); // tính đoạn cong từ đường ngang sang đường thẳng
|
|
755
755
|
// từ ngang sang thẳng phải có đường cong
|
|
@@ -803,7 +803,7 @@ class MoCanvasConnectNavigationNewElementUtil {
|
|
|
803
803
|
endPosition.y -= lineCurve;
|
|
804
804
|
}
|
|
805
805
|
const pathHorizontal = [];
|
|
806
|
-
const
|
|
806
|
+
const endPath = MoCanvasCalculatorDirectionElementUtil.checkAndAvoidBlocksLeft(coordQ1.x ?? 0, coordQ1.y ?? 0, lineCurve, endPosition, obstacleRect, pathHorizontal);
|
|
807
807
|
if (directionXToEnd === 'left' && endPath.x > (coordQ1.x ?? 0)) {
|
|
808
808
|
separatedPoints.push({ start: straightLine.endPath, end: endPositionOrigin, mode: 'vertical', id: '6a ' + directionStartY });
|
|
809
809
|
this.closeLineWithLineTopBottom(endPositionOrigin, endPositionOrigin, lineCurve, elementNext, separatedPoints);
|
|
@@ -1066,9 +1066,29 @@ class LibsUiComponentsDrawLineDirective {
|
|
|
1066
1066
|
this.buildPathAndDraw(data, points, mode);
|
|
1067
1067
|
return;
|
|
1068
1068
|
}
|
|
1069
|
+
let path = '';
|
|
1069
1070
|
points.separatedPoints.forEach(separatedPoints => {
|
|
1070
|
-
this.
|
|
1071
|
+
path += this.buildPathAndDrawSeparatedPoints(data, separatedPoints, separatedPoints.mode || mode);
|
|
1071
1072
|
});
|
|
1073
|
+
const pathElement = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
1074
|
+
this.svgElement.append(pathElement);
|
|
1075
|
+
points.pathElement = pathElement;
|
|
1076
|
+
const styleConfig = {
|
|
1077
|
+
stroke: data.lineStyle?.stroke ?? '#9CA2AD',
|
|
1078
|
+
strokeDasharray: data.lineStyle?.strokeDasharray,
|
|
1079
|
+
strokeWidth: data.lineStyle?.strokeWidth ?? '1px',
|
|
1080
|
+
fill: data.lineStyle?.fill ?? 'none',
|
|
1081
|
+
curve: data.lineStyle?.curve ?? 10,
|
|
1082
|
+
distancePoint: data.lineStyle?.distancePoint ?? 10
|
|
1083
|
+
};
|
|
1084
|
+
points.pathElement?.setAttribute('stroke', styleConfig.stroke);
|
|
1085
|
+
points.pathElement?.setAttribute('fill', styleConfig.fill);
|
|
1086
|
+
points.pathElement?.setAttribute('stroke-width', styleConfig.strokeWidth);
|
|
1087
|
+
if (styleConfig.strokeDasharray) {
|
|
1088
|
+
points.pathElement?.setAttribute('stroke-dasharray', styleConfig.strokeDasharray);
|
|
1089
|
+
}
|
|
1090
|
+
points.pathElement?.setAttribute('d', path);
|
|
1091
|
+
this.drawRectAndInitEvent(data, mode);
|
|
1072
1092
|
});
|
|
1073
1093
|
}
|
|
1074
1094
|
updateViewBox(viewBoxConfig) {
|
|
@@ -1118,9 +1138,6 @@ class LibsUiComponentsDrawLineDirective {
|
|
|
1118
1138
|
MoCanvasConnectNavigationNewElementUtil.ELEMENT_MARGIN_BETWEEN_BRANCH_DEFAULT = this.viewBoxConfig?.marginBetweenElement ?? 32;
|
|
1119
1139
|
}
|
|
1120
1140
|
MoCanvasConnectNavigationNewElementUtil.setXYConnectElements(elementStart ?? { ...points.start, width: 1, height: 1 }, elementEnd ?? { ...points.end, width: 1, height: 1 }, obstacleRects, separatedPoints, curve);
|
|
1121
|
-
separatedPoints?.forEach(item => {
|
|
1122
|
-
item.pathElement = this.createPathAndArrowElement(name).pathElement;
|
|
1123
|
-
});
|
|
1124
1141
|
}
|
|
1125
1142
|
buildPathAndDraw(data, points, mode) {
|
|
1126
1143
|
let dPath = {};
|
|
@@ -1283,7 +1300,7 @@ class LibsUiComponentsDrawLineDirective {
|
|
|
1283
1300
|
};
|
|
1284
1301
|
const pointEnd = cloneDeep(points.end);
|
|
1285
1302
|
const arrowElement = points.arrowElement;
|
|
1286
|
-
const direction = data.arrowDirection || this.getDirection(points,
|
|
1303
|
+
const direction = data.arrowDirection || this.getDirection(points, data.startEndMode);
|
|
1287
1304
|
switch (direction) {
|
|
1288
1305
|
case 'right':
|
|
1289
1306
|
if (mode.includes('horizontal') || mode.includes('vertical')) {
|
|
@@ -1324,7 +1341,7 @@ class LibsUiComponentsDrawLineDirective {
|
|
|
1324
1341
|
circleElement.setAttribute('stroke-width', `${circleStyle?.strokeWidth ?? '1px'}`);
|
|
1325
1342
|
return circleElement;
|
|
1326
1343
|
}
|
|
1327
|
-
getDirection(points,
|
|
1344
|
+
getDirection(points, startEndMode) {
|
|
1328
1345
|
let pointStart = { ...points.start };
|
|
1329
1346
|
if (points.separatedPoints) {
|
|
1330
1347
|
const lineToEnd = points.separatedPoints.find(item => item.end.x === points.end.x && item.end.y === points.end.y);
|
|
@@ -1334,10 +1351,20 @@ class LibsUiComponentsDrawLineDirective {
|
|
|
1334
1351
|
}
|
|
1335
1352
|
const modeHorizontal = pointStart.x < points.end.x ? 'right' : 'left';
|
|
1336
1353
|
const modeVertical = pointStart.y < points.end.y ? 'bottom' : 'top';
|
|
1337
|
-
if (
|
|
1338
|
-
|
|
1354
|
+
if (!startEndMode) {
|
|
1355
|
+
if (Math.abs(points.end.x - pointStart.x) > Math.abs(points.end.y - pointStart.y)) {
|
|
1356
|
+
return modeHorizontal;
|
|
1357
|
+
}
|
|
1358
|
+
return modeVertical;
|
|
1359
|
+
}
|
|
1360
|
+
switch (startEndMode) {
|
|
1361
|
+
case 'bottom-left':
|
|
1362
|
+
return modeHorizontal;
|
|
1363
|
+
case 'right-left':
|
|
1364
|
+
return modeHorizontal;
|
|
1365
|
+
case 'bottom-top':
|
|
1366
|
+
return modeVertical;
|
|
1339
1367
|
}
|
|
1340
|
-
return modeVertical;
|
|
1341
1368
|
}
|
|
1342
1369
|
initEvent(data) {
|
|
1343
1370
|
const points = data.points;
|
|
@@ -1459,6 +1486,33 @@ class LibsUiComponentsDrawLineDirective {
|
|
|
1459
1486
|
Array.from(this.svgElement.getElementsByTagName('rect'))?.forEach(item => item.remove());
|
|
1460
1487
|
Array.from(this.svgElement.getElementsByTagName('text'))?.forEach(item => item.remove());
|
|
1461
1488
|
}
|
|
1489
|
+
buildPathAndDrawSeparatedPoints(data, points, mode) {
|
|
1490
|
+
let dPath = {};
|
|
1491
|
+
const styleConfig = {
|
|
1492
|
+
curve: data.lineStyle?.curve ?? 10,
|
|
1493
|
+
distancePoint: data.lineStyle?.distancePoint ?? 10
|
|
1494
|
+
};
|
|
1495
|
+
let { curve, distancePoint } = styleConfig;
|
|
1496
|
+
mode = mode || "quart-in";
|
|
1497
|
+
if (mode !== 'quart-in') {
|
|
1498
|
+
curve = curve ?? 10;
|
|
1499
|
+
distancePoint = distancePoint ?? 10;
|
|
1500
|
+
}
|
|
1501
|
+
if (mode === 'quart-in' || points.start.x === points.end.x || points.start.y === points.end.y) {
|
|
1502
|
+
this.drawBalancedCurve(dPath, points);
|
|
1503
|
+
if (mode === 'quart-in') {
|
|
1504
|
+
dPath = {};
|
|
1505
|
+
this.drawBendBothEndsCurve(dPath, points);
|
|
1506
|
+
}
|
|
1507
|
+
return this.builDAttributeToString(dPath);
|
|
1508
|
+
}
|
|
1509
|
+
const result = this.calculatorDistancePointAndCurve(points, distancePoint, curve, mode);
|
|
1510
|
+
distancePoint = result.distancePoint;
|
|
1511
|
+
curve = result.curve;
|
|
1512
|
+
this.buildDAttributeByPointEndModeHorizontal(dPath, points, distancePoint || 0, curve || 0, mode);
|
|
1513
|
+
this.buildDAttributeByPointEndModeVertical(dPath, points, distancePoint || 0, curve || 0, mode);
|
|
1514
|
+
return this.builDAttributeToString(dPath);
|
|
1515
|
+
}
|
|
1462
1516
|
ngOnDestroy() {
|
|
1463
1517
|
this.onDestroy.next();
|
|
1464
1518
|
this.onDestroy.complete();
|