@plait/core 0.24.0-next.1 → 0.24.0-next.11
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/board/board.component.d.ts +1 -1
- package/board/board.component.interface.d.ts +3 -1
- package/constants/selection.d.ts +2 -0
- package/core/children/children.component.d.ts +1 -1
- package/core/element/element.component.d.ts +1 -1
- package/core/element/plugin-element.d.ts +1 -1
- package/core/island/island-base.component.d.ts +4 -2
- package/esm2022/board/board.component.interface.mjs +2 -0
- package/esm2022/board/board.component.mjs +405 -0
- package/esm2022/constants/selection.mjs +4 -0
- package/{esm2020 → esm2022}/core/children/children.component.mjs +6 -6
- package/{esm2020 → esm2022}/core/element/element.component.mjs +4 -4
- package/{esm2020 → esm2022}/core/element/plugin-element.mjs +4 -4
- package/esm2022/core/island/island-base.component.mjs +72 -0
- package/{esm2020 → esm2022}/interfaces/board.mjs +1 -1
- package/esm2022/interfaces/direction.mjs +8 -0
- package/{esm2020 → esm2022}/interfaces/index.mjs +2 -1
- package/esm2022/interfaces/rectangle-client.mjs +68 -0
- package/{esm2020 → esm2022}/plait.module.mjs +5 -5
- package/esm2022/plugins/create-board.mjs +106 -0
- package/esm2022/plugins/with-hotkey.mjs +62 -0
- package/esm2022/plugins/with-moving.mjs +116 -0
- package/esm2022/plugins/with-selection.mjs +193 -0
- package/{esm2020 → esm2022}/services/image-context.service.mjs +4 -4
- package/esm2022/transforms/element.mjs +22 -0
- package/esm2022/transforms/index.mjs +13 -0
- package/esm2022/transforms/selection.mjs +26 -0
- package/esm2022/utils/dom/common.mjs +76 -0
- package/esm2022/utils/dom/foreign.mjs +25 -0
- package/esm2022/utils/draw/line.mjs +47 -0
- package/esm2022/utils/draw/rectangle.mjs +34 -0
- package/esm2022/utils/element.mjs +71 -0
- package/esm2022/utils/math.mjs +176 -0
- package/esm2022/utils/reaction-manager.mjs +340 -0
- package/esm2022/utils/touch.mjs +35 -0
- package/esm2022/utils/weak-maps.mjs +21 -0
- package/{fesm2020 → fesm2022}/plait-core.mjs +2587 -1933
- package/fesm2022/plait-core.mjs.map +1 -0
- package/interfaces/board.d.ts +2 -1
- package/interfaces/direction.d.ts +7 -0
- package/interfaces/index.d.ts +1 -0
- package/interfaces/rectangle-client.d.ts +14 -0
- package/package.json +15 -14
- package/plugins/with-selection.d.ts +5 -1
- package/styles/styles.scss +1 -1
- package/transforms/element.d.ts +6 -0
- package/transforms/index.d.ts +1 -0
- package/transforms/selection.d.ts +2 -2
- package/utils/dom/common.d.ts +6 -0
- package/utils/dom/foreign.d.ts +2 -1
- package/utils/draw/line.d.ts +1 -1
- package/utils/draw/rectangle.d.ts +3 -0
- package/utils/element.d.ts +5 -0
- package/utils/math.d.ts +9 -0
- package/utils/reaction-manager.d.ts +41 -0
- package/utils/touch.d.ts +14 -1
- package/utils/weak-maps.d.ts +4 -2
- package/esm2020/board/board.component.interface.mjs +0 -2
- package/esm2020/board/board.component.mjs +0 -407
- package/esm2020/constants/selection.mjs +0 -2
- package/esm2020/core/island/island-base.component.mjs +0 -69
- package/esm2020/interfaces/rectangle-client.mjs +0 -40
- package/esm2020/plugins/create-board.mjs +0 -101
- package/esm2020/plugins/with-hotkey.mjs +0 -57
- package/esm2020/plugins/with-moving.mjs +0 -97
- package/esm2020/plugins/with-selection.mjs +0 -183
- package/esm2020/transforms/index.mjs +0 -12
- package/esm2020/transforms/selection.mjs +0 -16
- package/esm2020/utils/dom/common.mjs +0 -53
- package/esm2020/utils/dom/foreign.mjs +0 -19
- package/esm2020/utils/draw/line.mjs +0 -43
- package/esm2020/utils/draw/rectangle.mjs +0 -26
- package/esm2020/utils/element.mjs +0 -44
- package/esm2020/utils/math.mjs +0 -48
- package/esm2020/utils/touch.mjs +0 -8
- package/esm2020/utils/weak-maps.mjs +0 -22
- package/fesm2015/plait-core.mjs +0 -3454
- package/fesm2015/plait-core.mjs.map +0 -1
- package/fesm2020/plait-core.mjs.map +0 -1
- /package/{esm2020 → esm2022}/constants/index.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/keycodes.mjs +0 -0
- /package/{esm2020 → esm2022}/constants/resize.mjs +0 -0
- /package/{esm2020 → esm2022}/core/children/effect.mjs +0 -0
- /package/{esm2020 → esm2022}/core/element/context-change.mjs +0 -0
- /package/{esm2020 → esm2022}/core/element/context.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/custom-types.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/element.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/history.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/node.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/operation.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/path-ref.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/path.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/plugin-key.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/plugin.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/point.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/pointer.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/selection.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/theme.mjs +0 -0
- /package/{esm2020 → esm2022}/interfaces/viewport.mjs +0 -0
- /package/{esm2020 → esm2022}/plait-core.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/with-board.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/with-hand.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/with-history.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/with-options.mjs +0 -0
- /package/{esm2020 → esm2022}/plugins/with-viewport.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/core/create-board.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/core/fake-weak-map.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/core/index.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/fake-events/event-objects.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/fake-events/index.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/index.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/test-element.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/board.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/general.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/node.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/theme.mjs +0 -0
- /package/{esm2020 → esm2022}/transforms/viewport.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/board.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/clipboard.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/common.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/dom/environment.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/dom/index.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/draw/arrow.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/draw/circle.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/environment.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/helper.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/history.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/hotkeys.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/id-creator.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/index.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/moving-element.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/selected-element.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/to-image.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/tree.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/viewport.mjs +0 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createG, createPath } from '../dom/common';
|
|
2
|
+
export function drawLine(rs, start, end, options) {
|
|
3
|
+
return rs.linearPath([start, end], options);
|
|
4
|
+
}
|
|
5
|
+
export function drawLinearPath(points, options, closePath) {
|
|
6
|
+
const g = createG();
|
|
7
|
+
const path = createPath();
|
|
8
|
+
let polylinePath = '';
|
|
9
|
+
points.forEach((point, index) => {
|
|
10
|
+
if (index === 0) {
|
|
11
|
+
polylinePath += `M ${point[0]} ${point[1]} `;
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
polylinePath += `L ${point[0]} ${point[1]} `;
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
if (closePath) {
|
|
18
|
+
polylinePath += 'Z';
|
|
19
|
+
}
|
|
20
|
+
path.setAttribute('d', polylinePath);
|
|
21
|
+
path.setAttribute('stroke', `${options?.stroke}`);
|
|
22
|
+
path.setAttribute('stroke-width', `${options?.strokeWidth}`);
|
|
23
|
+
path.setAttribute('fill', `${options?.fill || 'none'}`);
|
|
24
|
+
options?.strokeLineDash && path.setAttribute('stroke-dasharray', `${options.strokeLineDash}`);
|
|
25
|
+
g.appendChild(path);
|
|
26
|
+
return g;
|
|
27
|
+
}
|
|
28
|
+
export function drawBezierPath(points, options) {
|
|
29
|
+
const g = createG();
|
|
30
|
+
const path = createPath();
|
|
31
|
+
let polylinePath = '';
|
|
32
|
+
for (let i = 0; i < points.length - 3; i += 3) {
|
|
33
|
+
if (i === 0) {
|
|
34
|
+
polylinePath += `M ${points[0][0]} ${points[0][1]} `;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
polylinePath += `C ${points[i + 1][0]} ${points[i + 1][1]}, ${points[i + 2][0]} ${points[i + 2][1]}, ${points[i + 3][0]} ${points[i + 3][1]}`;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
path.setAttribute('d', polylinePath);
|
|
41
|
+
path.setAttribute('stroke', `${options?.stroke}`);
|
|
42
|
+
path.setAttribute('stroke-width', `${options?.strokeWidth}`);
|
|
43
|
+
path.setAttribute('fill', `none`);
|
|
44
|
+
g.appendChild(path);
|
|
45
|
+
return g;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3V0aWxzL2RyYXcvbGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVwRCxNQUFNLFVBQVUsUUFBUSxDQUFDLEVBQVksRUFBRSxLQUFZLEVBQUUsR0FBVSxFQUFFLE9BQWdCO0lBQzdFLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxNQUFlLEVBQUUsT0FBaUIsRUFBRSxTQUFtQjtJQUNsRixNQUFNLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUNwQixNQUFNLElBQUksR0FBRyxVQUFVLEVBQUUsQ0FBQztJQUUxQixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDdEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM1QixJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7WUFDYixZQUFZLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7U0FDaEQ7YUFBTTtZQUNILFlBQVksSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUNoRDtJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxTQUFTLEVBQUU7UUFDWCxZQUFZLElBQUksR0FBRyxDQUFDO0tBQ3ZCO0lBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsRUFBRSxHQUFHLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxFQUFFLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sRUFBRSxjQUFjLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQzlGLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFcEIsT0FBTyxDQUFDLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxNQUFlLEVBQUUsT0FBaUI7SUFDN0QsTUFBTSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDcEIsTUFBTSxJQUFJLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFFMUIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNULFlBQVksSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUN4RDthQUFNO1lBQ0gsWUFBWSxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUNuSCxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDbkIsRUFBRSxDQUFDO1NBQ047S0FDSjtJQUVELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsR0FBRyxPQUFPLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM3RCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXBCLE9BQU8sQ0FBQyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdWdoU1ZHIH0gZnJvbSAncm91Z2hqcy9iaW4vc3ZnJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wb2ludCc7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAncm91Z2hqcy9iaW4vY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVHLCBjcmVhdGVQYXRoIH0gZnJvbSAnLi4vZG9tL2NvbW1vbic7XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3TGluZShyczogUm91Z2hTVkcsIHN0YXJ0OiBQb2ludCwgZW5kOiBQb2ludCwgb3B0aW9uczogT3B0aW9ucyk6IFNWR0dFbGVtZW50IHtcbiAgICByZXR1cm4gcnMubGluZWFyUGF0aChbc3RhcnQsIGVuZF0sIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZHJhd0xpbmVhclBhdGgocG9pbnRzOiBQb2ludFtdLCBvcHRpb25zPzogT3B0aW9ucywgY2xvc2VQYXRoPzogYm9vbGVhbikge1xuICAgIGNvbnN0IGcgPSBjcmVhdGVHKCk7XG4gICAgY29uc3QgcGF0aCA9IGNyZWF0ZVBhdGgoKTtcblxuICAgIGxldCBwb2x5bGluZVBhdGggPSAnJztcbiAgICBwb2ludHMuZm9yRWFjaCgocG9pbnQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgcG9seWxpbmVQYXRoICs9IGBNICR7cG9pbnRbMF19ICR7cG9pbnRbMV19IGA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwb2x5bGluZVBhdGggKz0gYEwgJHtwb2ludFswXX0gJHtwb2ludFsxXX0gYDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGNsb3NlUGF0aCkge1xuICAgICAgICBwb2x5bGluZVBhdGggKz0gJ1onO1xuICAgIH1cblxuICAgIHBhdGguc2V0QXR0cmlidXRlKCdkJywgcG9seWxpbmVQYXRoKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSgnc3Ryb2tlJywgYCR7b3B0aW9ucz8uc3Ryb2tlfWApO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKCdzdHJva2Utd2lkdGgnLCBgJHtvcHRpb25zPy5zdHJva2VXaWR0aH1gKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZSgnZmlsbCcsIGAke29wdGlvbnM/LmZpbGwgfHwgJ25vbmUnfWApO1xuICAgIG9wdGlvbnM/LnN0cm9rZUxpbmVEYXNoICYmIHBhdGguc2V0QXR0cmlidXRlKCdzdHJva2UtZGFzaGFycmF5JywgYCR7b3B0aW9ucy5zdHJva2VMaW5lRGFzaH1gKTtcbiAgICBnLmFwcGVuZENoaWxkKHBhdGgpO1xuXG4gICAgcmV0dXJuIGc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3QmV6aWVyUGF0aChwb2ludHM6IFBvaW50W10sIG9wdGlvbnM/OiBPcHRpb25zKSB7XG4gICAgY29uc3QgZyA9IGNyZWF0ZUcoKTtcbiAgICBjb25zdCBwYXRoID0gY3JlYXRlUGF0aCgpO1xuXG4gICAgbGV0IHBvbHlsaW5lUGF0aCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDM7IGkgKz0gMykge1xuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgcG9seWxpbmVQYXRoICs9IGBNICR7cG9pbnRzWzBdWzBdfSAke3BvaW50c1swXVsxXX0gYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvbHlsaW5lUGF0aCArPSBgQyAke3BvaW50c1tpICsgMV1bMF19ICR7cG9pbnRzW2kgKyAxXVsxXX0sICR7cG9pbnRzW2kgKyAyXVswXX0gJHtwb2ludHNbaSArIDJdWzFdfSwgJHtwb2ludHNbaSArIDNdWzBdfSAke1xuICAgICAgICAgICAgICAgIHBvaW50c1tpICsgM11bMV1cbiAgICAgICAgICAgIH1gO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoJ2QnLCBwb2x5bGluZVBhdGgpO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKCdzdHJva2UnLCBgJHtvcHRpb25zPy5zdHJva2V9YCk7XG4gICAgcGF0aC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIGAke29wdGlvbnM/LnN0cm9rZVdpZHRofWApO1xuICAgIHBhdGguc2V0QXR0cmlidXRlKCdmaWxsJywgYG5vbmVgKTtcbiAgICBnLmFwcGVuZENoaWxkKHBhdGgpO1xuXG4gICAgcmV0dXJuIGc7XG59XG4iXX0=
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { MAX_RADIUS } from '../../constants';
|
|
2
|
+
import { PlaitBoard } from '../../interfaces/board';
|
|
3
|
+
import { setStrokeLinecap } from '../dom/common';
|
|
4
|
+
/**
|
|
5
|
+
* drawRoundRectangle
|
|
6
|
+
*/
|
|
7
|
+
export function drawRoundRectangle(rs, x1, y1, x2, y2, options, outline = false, borderRadius) {
|
|
8
|
+
const width = Math.abs(x1 - x2);
|
|
9
|
+
const height = Math.abs(y1 - y2);
|
|
10
|
+
let radius = borderRadius || 0;
|
|
11
|
+
if (radius === 0) {
|
|
12
|
+
const defaultRadius = Math.min(width, height) / 8;
|
|
13
|
+
let radius = defaultRadius;
|
|
14
|
+
if (defaultRadius > MAX_RADIUS) {
|
|
15
|
+
radius = outline ? MAX_RADIUS + 2 : MAX_RADIUS;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const point1 = [x1 + radius, y1];
|
|
19
|
+
const point2 = [x2 - radius, y1];
|
|
20
|
+
const point3 = [x2, y1 + radius];
|
|
21
|
+
const point4 = [x2, y2 - radius];
|
|
22
|
+
const point5 = [x2 - radius, y2];
|
|
23
|
+
const point6 = [x1 + radius, y2];
|
|
24
|
+
const point7 = [x1, y2 - radius];
|
|
25
|
+
const point8 = [x1, y1 + radius];
|
|
26
|
+
return rs.path(`M${point2[0]} ${point2[1]} A ${radius} ${radius}, 0, 0, 1, ${point3[0]} ${point3[1]} L ${point4[0]} ${point4[1]} A ${radius} ${radius}, 0, 0, 1, ${point5[0]} ${point5[1]} L ${point6[0]} ${point6[1]} A ${radius} ${radius}, 0, 0, 1, ${point7[0]} ${point7[1]} L ${point8[0]} ${point8[1]} A ${radius} ${radius}, 0, 0, 1, ${point1[0]} ${point1[1]} Z`, options);
|
|
27
|
+
}
|
|
28
|
+
export const drawRectangle = (board, rectangle, options) => {
|
|
29
|
+
const roughSVG = PlaitBoard.getRoughSVG(board);
|
|
30
|
+
const rectangleG = roughSVG.rectangle(rectangle.x, rectangle.y, rectangle.width, rectangle.height, options);
|
|
31
|
+
setStrokeLinecap(rectangleG, 'round');
|
|
32
|
+
return rectangleG;
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjdGFuZ2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvdXRpbHMvZHJhdy9yZWN0YW5nbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFakQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQzlCLEVBQVksRUFDWixFQUFVLEVBQ1YsRUFBVSxFQUNWLEVBQVUsRUFDVixFQUFVLEVBQ1YsT0FBZ0IsRUFDaEIsT0FBTyxHQUFHLEtBQUssRUFDZixZQUFxQjtJQUVyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUVqQyxJQUFJLE1BQU0sR0FBRyxZQUFZLElBQUksQ0FBQyxDQUFDO0lBQy9CLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNkLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxJQUFJLE1BQU0sR0FBRyxhQUFhLENBQUM7UUFDM0IsSUFBSSxhQUFhLEdBQUcsVUFBVSxFQUFFO1lBQzVCLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztTQUNsRDtLQUNKO0lBR0QsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDakMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUVqQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQ1YsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLE1BQU0sSUFBSSxNQUFNLGNBQWMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLE1BQU0sSUFBSSxNQUFNLGNBQWMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLE1BQU0sSUFBSSxNQUFNLGNBQWMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLE1BQU0sSUFBSSxNQUFNLGNBQWMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUMxVixPQUFPLENBQ1YsQ0FBQztBQUNOLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFpQixFQUFFLFNBQTBCLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO0lBQzdGLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVHLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0QyxPQUFPLFVBQVUsQ0FBQztBQUN0QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAncm91Z2hqcy9iaW4vY29yZSc7XG5pbXBvcnQgeyBSb3VnaFNWRyB9IGZyb20gJ3JvdWdoanMvYmluL3N2Zyc7XG5pbXBvcnQgeyBNQVhfUkFESVVTIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2JvYXJkJztcbmltcG9ydCB7IFJlY3RhbmdsZUNsaWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVjdGFuZ2xlLWNsaWVudCc7XG5pbXBvcnQgeyBzZXRTdHJva2VMaW5lY2FwIH0gZnJvbSAnLi4vZG9tL2NvbW1vbic7XG5cbi8qKlxuICogZHJhd1JvdW5kUmVjdGFuZ2xlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcmF3Um91bmRSZWN0YW5nbGUoXG4gICAgcnM6IFJvdWdoU1ZHLFxuICAgIHgxOiBudW1iZXIsXG4gICAgeTE6IG51bWJlcixcbiAgICB4MjogbnVtYmVyLFxuICAgIHkyOiBudW1iZXIsXG4gICAgb3B0aW9uczogT3B0aW9ucyxcbiAgICBvdXRsaW5lID0gZmFsc2UsXG4gICAgYm9yZGVyUmFkaXVzPzogbnVtYmVyXG4pIHtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGguYWJzKHgxIC0geDIpO1xuICAgIGNvbnN0IGhlaWdodCA9IE1hdGguYWJzKHkxIC0geTIpO1xuXG4gICAgbGV0IHJhZGl1cyA9IGJvcmRlclJhZGl1cyB8fCAwO1xuICAgIGlmIChyYWRpdXMgPT09IDApIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFJhZGl1cyA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpIC8gODtcbiAgICAgICAgbGV0IHJhZGl1cyA9IGRlZmF1bHRSYWRpdXM7XG4gICAgICAgIGlmIChkZWZhdWx0UmFkaXVzID4gTUFYX1JBRElVUykge1xuICAgICAgICAgICAgcmFkaXVzID0gb3V0bGluZSA/IE1BWF9SQURJVVMgKyAyIDogTUFYX1JBRElVUztcbiAgICAgICAgfVxuICAgIH1cbiAgICBcblxuICAgIGNvbnN0IHBvaW50MSA9IFt4MSArIHJhZGl1cywgeTFdO1xuICAgIGNvbnN0IHBvaW50MiA9IFt4MiAtIHJhZGl1cywgeTFdO1xuICAgIGNvbnN0IHBvaW50MyA9IFt4MiwgeTEgKyByYWRpdXNdO1xuICAgIGNvbnN0IHBvaW50NCA9IFt4MiwgeTIgLSByYWRpdXNdO1xuICAgIGNvbnN0IHBvaW50NSA9IFt4MiAtIHJhZGl1cywgeTJdO1xuICAgIGNvbnN0IHBvaW50NiA9IFt4MSArIHJhZGl1cywgeTJdO1xuICAgIGNvbnN0IHBvaW50NyA9IFt4MSwgeTIgLSByYWRpdXNdO1xuICAgIGNvbnN0IHBvaW50OCA9IFt4MSwgeTEgKyByYWRpdXNdO1xuXG4gICAgcmV0dXJuIHJzLnBhdGgoXG4gICAgICAgIGBNJHtwb2ludDJbMF19ICR7cG9pbnQyWzFdfSBBICR7cmFkaXVzfSAke3JhZGl1c30sIDAsIDAsIDEsICR7cG9pbnQzWzBdfSAke3BvaW50M1sxXX0gTCAke3BvaW50NFswXX0gJHtwb2ludDRbMV19IEEgJHtyYWRpdXN9ICR7cmFkaXVzfSwgMCwgMCwgMSwgJHtwb2ludDVbMF19ICR7cG9pbnQ1WzFdfSBMICR7cG9pbnQ2WzBdfSAke3BvaW50NlsxXX0gQSAke3JhZGl1c30gJHtyYWRpdXN9LCAwLCAwLCAxLCAke3BvaW50N1swXX0gJHtwb2ludDdbMV19IEwgJHtwb2ludDhbMF19ICR7cG9pbnQ4WzFdfSBBICR7cmFkaXVzfSAke3JhZGl1c30sIDAsIDAsIDEsICR7cG9pbnQxWzBdfSAke3BvaW50MVsxXX0gWmAsXG4gICAgICAgIG9wdGlvbnNcbiAgICApO1xufVxuXG5leHBvcnQgY29uc3QgZHJhd1JlY3RhbmdsZSA9IChib2FyZDogUGxhaXRCb2FyZCwgcmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIG9wdGlvbnM6IE9wdGlvbnMpID0+IHtcbiAgICBjb25zdCByb3VnaFNWRyA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcoYm9hcmQpO1xuICAgIGNvbnN0IHJlY3RhbmdsZUcgPSByb3VnaFNWRy5yZWN0YW5nbGUocmVjdGFuZ2xlLngsIHJlY3RhbmdsZS55LCByZWN0YW5nbGUud2lkdGgsIHJlY3RhbmdsZS5oZWlnaHQsIG9wdGlvbnMpO1xuICAgIHNldFN0cm9rZUxpbmVjYXAocmVjdGFuZ2xlRywgJ3JvdW5kJyk7XG4gICAgcmV0dXJuIHJlY3RhbmdsZUc7XG59OyJdfQ==
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { PlaitBoard } from '../interfaces';
|
|
2
|
+
import { depthFirstRecursion, getIsRecursionFunc } from './tree';
|
|
3
|
+
export function getRectangleByElements(board, elements, recursion) {
|
|
4
|
+
const boundaryBox = {
|
|
5
|
+
left: Number.MAX_VALUE,
|
|
6
|
+
top: Number.MAX_VALUE,
|
|
7
|
+
right: Number.NEGATIVE_INFINITY,
|
|
8
|
+
bottom: Number.NEGATIVE_INFINITY
|
|
9
|
+
};
|
|
10
|
+
const calcRectangleClient = (node) => {
|
|
11
|
+
const nodeRectangle = board.getRectangle(node);
|
|
12
|
+
if (nodeRectangle) {
|
|
13
|
+
boundaryBox.left = Math.min(boundaryBox.left, nodeRectangle.x);
|
|
14
|
+
boundaryBox.top = Math.min(boundaryBox.top, nodeRectangle.y);
|
|
15
|
+
boundaryBox.right = Math.max(boundaryBox.right, nodeRectangle.x + nodeRectangle.width);
|
|
16
|
+
boundaryBox.bottom = Math.max(boundaryBox.bottom, nodeRectangle.y + nodeRectangle.height);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
console.error(`can not get rectangle of element:`, node);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
elements.forEach(element => {
|
|
23
|
+
if (recursion) {
|
|
24
|
+
depthFirstRecursion(element, node => calcRectangleClient(node), node => board.isRecursion(node));
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
calcRectangleClient(element);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
if (boundaryBox.left === Number.MAX_VALUE) {
|
|
31
|
+
return {
|
|
32
|
+
x: 0,
|
|
33
|
+
y: 0,
|
|
34
|
+
width: 0,
|
|
35
|
+
height: 0
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
x: boundaryBox.left,
|
|
40
|
+
y: boundaryBox.top,
|
|
41
|
+
width: boundaryBox.right - boundaryBox.left,
|
|
42
|
+
height: boundaryBox.bottom - boundaryBox.top
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function getBoardRectangle(board) {
|
|
46
|
+
return getRectangleByElements(board, board.children, true);
|
|
47
|
+
}
|
|
48
|
+
export function getElementById(board, id, dataSource) {
|
|
49
|
+
if (!dataSource) {
|
|
50
|
+
dataSource = findElements(board, { match: (element) => true, recursion: (element) => true });
|
|
51
|
+
}
|
|
52
|
+
let element = dataSource.find((element) => element.id === id);
|
|
53
|
+
return element;
|
|
54
|
+
}
|
|
55
|
+
export function findElements(board, options) {
|
|
56
|
+
let elements = [];
|
|
57
|
+
depthFirstRecursion(board, node => {
|
|
58
|
+
if (!PlaitBoard.isBoard(node) && options.match(node)) {
|
|
59
|
+
elements.push(node);
|
|
60
|
+
}
|
|
61
|
+
}, (value) => {
|
|
62
|
+
if (PlaitBoard.isBoard(value)) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
return getIsRecursionFunc(board)(value) && options.recursion(value);
|
|
67
|
+
}
|
|
68
|
+
}, true);
|
|
69
|
+
return elements;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3V0aWxzL2VsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFZLFVBQVUsRUFBaUMsTUFBTSxlQUFlLENBQUM7QUFDcEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRWpFLE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxLQUFpQixFQUFFLFFBQXdCLEVBQUUsU0FBa0I7SUFDbEcsTUFBTSxXQUFXLEdBQUc7UUFDaEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQUFTO1FBQ3RCLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUztRQUNyQixLQUFLLEVBQUUsTUFBTSxDQUFDLGlCQUFpQjtRQUMvQixNQUFNLEVBQUUsTUFBTSxDQUFDLGlCQUFpQjtLQUNuQyxDQUFDO0lBRUYsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLElBQWtCLEVBQUUsRUFBRTtRQUMvQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLElBQUksYUFBYSxFQUFFO1lBQ2YsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9ELFdBQVcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RCxXQUFXLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2RixXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENB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IFBsYWl0RWxlbWVudCwgUmVjdGFuZ2xlQ2xpZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBkZXB0aEZpcnN0UmVjdXJzaW9uLCBnZXRJc1JlY3Vyc2lvbkZ1bmMgfSBmcm9tICcuL3RyZWUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVjdGFuZ2xlQnlFbGVtZW50cyhib2FyZDogUGxhaXRCb2FyZCwgZWxlbWVudHM6IFBsYWl0RWxlbWVudFtdLCByZWN1cnNpb246IGJvb2xlYW4pOiBSZWN0YW5nbGVDbGllbnQge1xuICAgIGNvbnN0IGJvdW5kYXJ5Qm94ID0ge1xuICAgICAgICBsZWZ0OiBOdW1iZXIuTUFYX1ZBTFVFLFxuICAgICAgICB0b3A6IE51bWJlci5NQVhfVkFMVUUsXG4gICAgICAgIHJpZ2h0OiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXG4gICAgICAgIGJvdHRvbTogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZXG4gICAgfTtcblxuICAgIGNvbnN0IGNhbGNSZWN0YW5nbGVDbGllbnQgPSAobm9kZTogUGxhaXRFbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGVSZWN0YW5nbGUgPSBib2FyZC5nZXRSZWN0YW5nbGUobm9kZSk7XG4gICAgICAgIGlmIChub2RlUmVjdGFuZ2xlKSB7XG4gICAgICAgICAgICBib3VuZGFyeUJveC5sZWZ0ID0gTWF0aC5taW4oYm91bmRhcnlCb3gubGVmdCwgbm9kZVJlY3RhbmdsZS54KTtcbiAgICAgICAgICAgIGJvdW5kYXJ5Qm94LnRvcCA9IE1hdGgubWluKGJvdW5kYXJ5Qm94LnRvcCwgbm9kZVJlY3RhbmdsZS55KTtcbiAgICAgICAgICAgIGJvdW5kYXJ5Qm94LnJpZ2h0ID0gTWF0aC5tYXgoYm91bmRhcnlCb3gucmlnaHQsIG5vZGVSZWN0YW5nbGUueCArIG5vZGVSZWN0YW5nbGUud2lkdGgpO1xuICAgICAgICAgICAgYm91bmRhcnlCb3guYm90dG9tID0gTWF0aC5tYXgoYm91bmRhcnlCb3guYm90dG9tLCBub2RlUmVjdGFuZ2xlLnkgKyBub2RlUmVjdGFuZ2xlLmhlaWdodCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBjYW4gbm90IGdldCByZWN0YW5nbGUgb2YgZWxlbWVudDpgLCBub2RlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAocmVjdXJzaW9uKSB7XG4gICAgICAgICAgICBkZXB0aEZpcnN0UmVjdXJzaW9uKFxuICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgbm9kZSA9PiBjYWxjUmVjdGFuZ2xlQ2xpZW50KG5vZGUpLFxuICAgICAgICAgICAgICAgIG5vZGUgPT4gYm9hcmQuaXNSZWN1cnNpb24obm9kZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxjUmVjdGFuZ2xlQ2xpZW50KGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoYm91bmRhcnlCb3gubGVmdCA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICAgIGhlaWdodDogMFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHg6IGJvdW5kYXJ5Qm94LmxlZnQsXG4gICAgICAgIHk6IGJvdW5kYXJ5Qm94LnRvcCxcbiAgICAgICAgd2lkdGg6IGJvdW5kYXJ5Qm94LnJpZ2h0IC0gYm91bmRhcnlCb3gubGVmdCxcbiAgICAgICAgaGVpZ2h0OiBib3VuZGFyeUJveC5ib3R0b20gLSBib3VuZGFyeUJveC50b3BcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qm9hcmRSZWN0YW5nbGUoYm9hcmQ6IFBsYWl0Qm9hcmQpOiBSZWN0YW5nbGVDbGllbnQge1xuICAgIHJldHVybiBnZXRSZWN0YW5nbGVCeUVsZW1lbnRzKGJvYXJkLCBib2FyZC5jaGlsZHJlbiwgdHJ1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50QnlJZDxUIGV4dGVuZHMgUGxhaXRFbGVtZW50ID0gUGxhaXRFbGVtZW50Pihib2FyZDogUGxhaXRCb2FyZCwgaWQ6IHN0cmluZywgZGF0YVNvdXJjZT86IFBsYWl0RWxlbWVudFtdKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFkYXRhU291cmNlKSB7XG4gICAgICAgIGRhdGFTb3VyY2UgPSBmaW5kRWxlbWVudHMoYm9hcmQsIHsgbWF0Y2g6IChlbGVtZW50KSA9PiB0cnVlLCByZWN1cnNpb246IChlbGVtZW50KSA9PiB0cnVlIH0pO1xuICAgIH1cbiAgICBsZXQgZWxlbWVudCA9IGRhdGFTb3VyY2UuZmluZCgoZWxlbWVudCkgPT4gZWxlbWVudC5pZCA9PT0gaWQpIGFzIFQ7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRWxlbWVudHM8VCBleHRlbmRzIFBsYWl0RWxlbWVudCA9IFBsYWl0RWxlbWVudD4oXG4gICAgYm9hcmQ6IFBsYWl0Qm9hcmQsXG4gICAgb3B0aW9uczoge1xuICAgICAgICBtYXRjaDogKGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4gYm9vbGVhbjtcbiAgICAgICAgcmVjdXJzaW9uOiAoZWxlbWVudDogUGxhaXRFbGVtZW50KSA9PiBib29sZWFuO1xuICAgIH1cbik6IFRbXSB7XG4gICAgbGV0IGVsZW1lbnRzOiBUW10gPSBbXTtcbiAgICBkZXB0aEZpcnN0UmVjdXJzaW9uPEFuY2VzdG9yPihcbiAgICAgICAgYm9hcmQsXG4gICAgICAgIG5vZGUgPT4ge1xuICAgICAgICAgICAgaWYgKCFQbGFpdEJvYXJkLmlzQm9hcmQobm9kZSkgJiYgb3B0aW9ucy5tYXRjaChub2RlKSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2gobm9kZSBhcyBUKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKHZhbHVlOiBBbmNlc3RvcikgPT4ge1xuICAgICAgICAgICAgaWYgKFBsYWl0Qm9hcmQuaXNCb2FyZCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldElzUmVjdXJzaW9uRnVuYyhib2FyZCkodmFsdWUpICYmIG9wdGlvbnMucmVjdXJzaW9uKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZVxuICAgICk7XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xufVxuIl19
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { RectangleClient } from '../interfaces/rectangle-client';
|
|
2
|
+
// https://stackoverflow.com/a/6853926/232122
|
|
3
|
+
export function distanceBetweenPointAndSegment(x, y, x1, y1, x2, y2) {
|
|
4
|
+
const A = x - x1;
|
|
5
|
+
const B = y - y1;
|
|
6
|
+
const C = x2 - x1;
|
|
7
|
+
const D = y2 - y1;
|
|
8
|
+
const dot = A * C + B * D;
|
|
9
|
+
const lenSquare = C * C + D * D;
|
|
10
|
+
let param = -1;
|
|
11
|
+
if (lenSquare !== 0) {
|
|
12
|
+
// in case of 0 length line
|
|
13
|
+
param = dot / lenSquare;
|
|
14
|
+
}
|
|
15
|
+
let xx, yy;
|
|
16
|
+
if (param < 0) {
|
|
17
|
+
xx = x1;
|
|
18
|
+
yy = y1;
|
|
19
|
+
}
|
|
20
|
+
else if (param > 1) {
|
|
21
|
+
xx = x2;
|
|
22
|
+
yy = y2;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
xx = x1 + param * C;
|
|
26
|
+
yy = y1 + param * D;
|
|
27
|
+
}
|
|
28
|
+
const dx = x - xx;
|
|
29
|
+
const dy = y - yy;
|
|
30
|
+
return Math.hypot(dx, dy);
|
|
31
|
+
}
|
|
32
|
+
export function getNearestPointBetweenPointAndSegment(point, linePoints) {
|
|
33
|
+
const x = point[0], y = point[1], x1 = linePoints[0][0], y1 = linePoints[0][1], x2 = linePoints[1][0], y2 = linePoints[1][1];
|
|
34
|
+
const A = x - x1;
|
|
35
|
+
const B = y - y1;
|
|
36
|
+
const C = x2 - x1;
|
|
37
|
+
const D = y2 - y1;
|
|
38
|
+
const dot = A * C + B * D;
|
|
39
|
+
const lenSquare = C * C + D * D;
|
|
40
|
+
let param = -1;
|
|
41
|
+
if (lenSquare !== 0) {
|
|
42
|
+
// in case of 0 length line
|
|
43
|
+
param = dot / lenSquare;
|
|
44
|
+
}
|
|
45
|
+
let xx, yy;
|
|
46
|
+
if (param < 0) {
|
|
47
|
+
xx = x1;
|
|
48
|
+
yy = y1;
|
|
49
|
+
}
|
|
50
|
+
else if (param > 1) {
|
|
51
|
+
xx = x2;
|
|
52
|
+
yy = y2;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
xx = x1 + param * C;
|
|
56
|
+
yy = y1 + param * D;
|
|
57
|
+
}
|
|
58
|
+
return [xx, yy];
|
|
59
|
+
}
|
|
60
|
+
export function distanceBetweenPointAndSegments(points, point) {
|
|
61
|
+
const len = points.length;
|
|
62
|
+
let distance = Infinity;
|
|
63
|
+
for (let i = 0; i < len - 1; i++) {
|
|
64
|
+
const p = points[i];
|
|
65
|
+
const p2 = points[i + 1];
|
|
66
|
+
const currentDistance = distanceBetweenPointAndSegment(point[0], point[1], p[0], p[1], p2[0], p2[1]);
|
|
67
|
+
if (currentDistance < distance) {
|
|
68
|
+
distance = currentDistance;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return distance;
|
|
72
|
+
}
|
|
73
|
+
export function getNearestPointBetweenPointAndSegments(point, points) {
|
|
74
|
+
const len = points.length;
|
|
75
|
+
let distance = Infinity;
|
|
76
|
+
let result = point;
|
|
77
|
+
for (let i = 0; i < len; i++) {
|
|
78
|
+
const p = points[i];
|
|
79
|
+
const p2 = i === len - 1 ? points[0] : points[i + 1];
|
|
80
|
+
const currentDistance = distanceBetweenPointAndSegment(point[0], point[1], p[0], p[1], p2[0], p2[1]);
|
|
81
|
+
if (currentDistance < distance) {
|
|
82
|
+
distance = currentDistance;
|
|
83
|
+
result = getNearestPointBetweenPointAndSegment(point, [p, p2]);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
export function rotate(x1, y1, x2, y2, angle) {
|
|
89
|
+
// 𝑎′𝑥=(𝑎𝑥−𝑐𝑥)cos𝜃−(𝑎𝑦−𝑐𝑦)sin𝜃+𝑐𝑥
|
|
90
|
+
// 𝑎′𝑦=(𝑎𝑥−𝑐𝑥)sin𝜃+(𝑎𝑦−𝑐𝑦)cos𝜃+𝑐𝑦.
|
|
91
|
+
// https://math.stackexchange.com/questions/2204520/how-do-i-rotate-a-line-segment-in-a-specific-point-on-the-line
|
|
92
|
+
return [(x1 - x2) * Math.cos(angle) - (y1 - y2) * Math.sin(angle) + x2, (x1 - x2) * Math.sin(angle) + (y1 - y2) * Math.cos(angle) + y2];
|
|
93
|
+
}
|
|
94
|
+
export function distanceBetweenPointAndPoint(x1, y1, x2, y2) {
|
|
95
|
+
const dx = x1 - x2;
|
|
96
|
+
const dy = y1 - y2;
|
|
97
|
+
return Math.hypot(dx, dy);
|
|
98
|
+
}
|
|
99
|
+
// https://stackoverflow.com/questions/5254838/calculating-distance-between-a-point-and-a-rectangular-box-nearest-point
|
|
100
|
+
export function distanceBetweenPointAndRectangle(x, y, rect) {
|
|
101
|
+
var dx = Math.max(rect.x - x, 0, x - (rect.x + rect.width));
|
|
102
|
+
var dy = Math.max(rect.y - y, 0, y - (rect.y + rect.height));
|
|
103
|
+
return Math.sqrt(dx * dx + dy * dy);
|
|
104
|
+
}
|
|
105
|
+
export const isLineHitLine = (a, b, c, d) => {
|
|
106
|
+
const crossProduct = (v1, v2) => v1[0] * v2[1] - v1[1] * v2[0];
|
|
107
|
+
const ab = [b[0] - a[0], b[1] - a[1]];
|
|
108
|
+
const ac = [c[0] - a[0], c[1] - a[1]];
|
|
109
|
+
const ad = [d[0] - a[0], d[1] - a[1]];
|
|
110
|
+
const ca = [a[0] - c[0], a[1] - c[1]];
|
|
111
|
+
const cb = [b[0] - c[0], b[1] - c[1]];
|
|
112
|
+
const cd = [d[0] - c[0], d[1] - c[1]];
|
|
113
|
+
return crossProduct(ab, ac) * crossProduct(ab, ad) <= 0 && crossProduct(cd, ca) * crossProduct(cd, cb) <= 0;
|
|
114
|
+
};
|
|
115
|
+
export const isPolylineHitRectangle = (points, rectangle) => {
|
|
116
|
+
const rectanglePoints = RectangleClient.getCornerPoints(rectangle);
|
|
117
|
+
for (let i = 1; i < points.length; i++) {
|
|
118
|
+
const isIntersect = isLineHitLine(points[i], points[i - 1], rectanglePoints[0], rectanglePoints[1]) ||
|
|
119
|
+
isLineHitLine(points[i], points[i - 1], rectanglePoints[1], rectanglePoints[2]) ||
|
|
120
|
+
isLineHitLine(points[i], points[i - 1], rectanglePoints[2], rectanglePoints[3]) ||
|
|
121
|
+
isLineHitLine(points[i], points[i - 1], rectanglePoints[3], rectanglePoints[0]);
|
|
122
|
+
if (isIntersect) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return false;
|
|
127
|
+
};
|
|
128
|
+
//https://stackoverflow.com/questions/22521982/check-if-point-is-inside-a-polygon
|
|
129
|
+
export const isPointInPolygon = (point, points) => {
|
|
130
|
+
// ray-casting algorithm based on
|
|
131
|
+
// https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html
|
|
132
|
+
const x = point[0], y = point[1];
|
|
133
|
+
let inside = false;
|
|
134
|
+
for (var i = 0, j = points.length - 1; i < points.length; j = i++) {
|
|
135
|
+
let xi = points[i][0], yi = points[i][1];
|
|
136
|
+
let xj = points[j][0], yj = points[j][1];
|
|
137
|
+
let intersect = yi > y != yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi;
|
|
138
|
+
if (intersect)
|
|
139
|
+
inside = !inside;
|
|
140
|
+
}
|
|
141
|
+
return inside;
|
|
142
|
+
};
|
|
143
|
+
export const isPointInEllipse = (point, center, rx, ry, rotation = 0) => {
|
|
144
|
+
const cosAngle = Math.cos(rotation);
|
|
145
|
+
const sinAngle = Math.sin(rotation);
|
|
146
|
+
const x1 = (point[0] - center[0]) * cosAngle + (point[1] - center[1]) * sinAngle;
|
|
147
|
+
const y1 = (point[1] - center[1]) * cosAngle - (point[0] - center[0]) * sinAngle;
|
|
148
|
+
return (x1 * x1) / (rx * rx) + (y1 * y1) / (ry * ry) <= 1;
|
|
149
|
+
};
|
|
150
|
+
export const isPointInRoundRectangle = (point, rectangle, radius) => {
|
|
151
|
+
const { x: rectX, y: rectY, width, height } = rectangle;
|
|
152
|
+
const isInRectangle = point[0] >= rectX && point[0] <= rectX + width && point[1] >= rectY && point[1] <= rectY + height;
|
|
153
|
+
const handleLeftTop = point[0] >= rectX &&
|
|
154
|
+
point[0] <= rectX + radius &&
|
|
155
|
+
point[1] >= rectY &&
|
|
156
|
+
point[1] <= rectY + radius &&
|
|
157
|
+
Math.hypot(point[0] - (rectX + radius), point[1] - (rectY + radius)) > radius;
|
|
158
|
+
const handleLeftBottom = point[0] >= rectX &&
|
|
159
|
+
point[0] <= rectX + radius &&
|
|
160
|
+
point[1] >= rectY + height &&
|
|
161
|
+
point[1] <= rectY + height - radius &&
|
|
162
|
+
Math.hypot(point[0] - (rectX + radius), point[1] - (rectY + height - radius)) > radius;
|
|
163
|
+
const handleRightTop = point[0] >= rectX + width - radius &&
|
|
164
|
+
point[0] <= rectX + width &&
|
|
165
|
+
point[1] >= rectY &&
|
|
166
|
+
point[1] <= rectY + radius &&
|
|
167
|
+
Math.hypot(point[0] - (rectX + width - radius), point[1] - (rectY + radius)) > radius;
|
|
168
|
+
const handleRightBottom = point[0] >= rectX + width - radius &&
|
|
169
|
+
point[0] <= rectX + width &&
|
|
170
|
+
point[1] >= rectY + height - radius &&
|
|
171
|
+
point[1] <= rectY + height &&
|
|
172
|
+
Math.hypot(point[0] - (rectX + width - radius), point[1] - (rectY + height - radius)) > radius;
|
|
173
|
+
const isInCorner = handleLeftTop || handleLeftBottom || handleRightTop || handleRightBottom;
|
|
174
|
+
return isInRectangle && !isInCorner;
|
|
175
|
+
};
|
|
176
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL3V0aWxzL21hdGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWpFLDZDQUE2QztBQUM3QyxNQUFNLFVBQVUsOEJBQThCLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFVLEVBQUUsRUFBVSxFQUFFLEVBQVUsRUFBRSxFQUFVO0lBQy9HLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDakIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNqQixNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFFbEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNmLElBQUksU0FBUyxLQUFLLENBQUMsRUFBRTtRQUNqQiwyQkFBMkI7UUFDM0IsS0FBSyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUM7S0FDM0I7SUFFRCxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDWCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7UUFDWCxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ1IsRUFBRSxHQUFHLEVBQUUsQ0FBQztLQUNYO1NBQU0sSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1FBQ2xCLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDUixFQUFFLEdBQUcsRUFBRSxDQUFDO0tBQ1g7U0FBTTtRQUNILEVBQUUsR0FBRyxFQUFFLEdB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QUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUM3RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQVEsRUFBRSxDQUFRLEVBQUUsQ0FBUSxFQUFFLENBQVEsRUFBVyxFQUFFO0lBQzdFLE1BQU0sWUFBWSxHQUFHLENBQUMsRUFBUyxFQUFFLEVBQVMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTdFLE1BQU0sRUFBRSxHQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxFQUFFLEdBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxNQUFNLEVBQUUsR0FBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sRUFBRSxHQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxFQUFFLEdBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxNQUFNLEVBQUUsR0FBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTdDLE9BQU8sWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsTUFBZSxFQUFFLFNBQTBCLEVBQUUsRUFBRTtJQUNsRixNQUFNLGVBQWUsR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRW5FLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3BDLE1BQU0sV0FBVyxHQUNiLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9FLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFD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QyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25HLE1BQU0sVUFBVSxHQUFHLGFBQWEsSUFBSSxnQkFBZ0IsSUFBSSxjQUFjLElBQUksaUJBQWlCLENBQUM7SUFFNUYsT0FBTyxhQUFhLElBQUksQ0FBQyxVQUFVLENBQUM7QUFDeEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFJlY3RhbmdsZUNsaWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVjdGFuZ2xlLWNsaWVudCc7XG5cbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS82ODUzOTI2LzIzMjEyMlxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlQmV0d2VlblBvaW50QW5kU2VnbWVudCh4OiBudW1iZXIsIHk6IG51bWJlciwgeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlcikge1xuICAgIGNvbnN0IEEgPSB4IC0geDE7XG4gICAgY29uc3QgQiA9IHkgLSB5MTtcbiAgICBjb25zdCBDID0geDIgLSB4MTtcbiAgICBjb25zdCBEID0geTIgLSB5MTtcblxuICAgIGNvbnN0IGRvdCA9IEEgKiBDICsgQiAqIEQ7XG4gICAgY29uc3QgbGVuU3F1YXJlID0gQyAqIEMgKyBEICogRDtcbiAgICBsZXQgcGFyYW0gPSAtMTtcbiAgICBpZiAobGVuU3F1YXJlICE9PSAwKSB7XG4gICAgICAgIC8vIGluIGNhc2Ugb2YgMCBsZW5ndGggbGluZVxuICAgICAgICBwYXJhbSA9IGRvdCAvIGxlblNxdWFyZTtcbiAgICB9XG5cbiAgICBsZXQgeHgsIHl5O1xuICAgIGlmIChwYXJhbSA8IDApIHtcbiAgICAgICAgeHggPSB4MTtcbiAgICAgICAgeXkgPSB5MTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtID4gMSkge1xuICAgICAgICB4eCA9IHgyO1xuICAgICAgICB5eSA9IHkyO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHh4ID0geDEgKyBwYXJhbSAqIEM7XG4gICAgICAgIHl5ID0geTEgKyBwYXJhbSAqIEQ7XG4gICAgfVxuXG4gICAgY29uc3QgZHggPSB4IC0geHg7XG4gICAgY29uc3QgZHkgPSB5IC0geXk7XG4gICAgcmV0dXJuIE1hdGguaHlwb3QoZHgsIGR5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5lYXJlc3RQb2ludEJldHdlZW5Qb2ludEFuZFNlZ21lbnQocG9pbnQ6IFBvaW50LCBsaW5lUG9pbnRzOiBbUG9pbnQsIFBvaW50XSkge1xuICAgIGNvbnN0IHggPSBwb2ludFswXSxcbiAgICAgICAgeSA9IHBvaW50WzFdLFxuICAgICAgICB4MSA9IGxpbmVQb2ludHNbMF1bMF0sXG4gICAgICAgIHkxID0gbGluZVBvaW50c1swXVsxXSxcbiAgICAgICAgeDIgPSBsaW5lUG9pbnRzWzFdWzBdLFxuICAgICAgICB5MiA9IGxpbmVQb2ludHNbMV1bMV07XG4gICAgY29uc3QgQSA9IHggLSB4MTtcbiAgICBjb25zdCBCID0geSAtIHkxO1xuICAgIGNvbnN0IEMgPSB4MiAtIHgxO1xuICAgIGNvbnN0IEQgPSB5MiAtIHkxO1xuXG4gICAgY29uc3QgZG90ID0gQSAqIEMgKyBCICogRDtcbiAgICBjb25zdCBsZW5TcXVhcmUgPSBDICogQyArIEQgKiBEO1xuICAgIGxldCBwYXJhbSA9IC0xO1xuICAgIGlmIChsZW5TcXVhcmUgIT09IDApIHtcbiAgICAgICAgLy8gaW4gY2FzZSBvZiAwIGxlbmd0aCBsaW5lXG4gICAgICAgIHBhcmFtID0gZG90IC8gbGVuU3F1YXJlO1xuICAgIH1cblxuICAgIGxldCB4eCwgeXk7XG4gICAgaWYgKHBhcmFtIDwgMCkge1xuICAgICAgICB4eCA9IHgxO1xuICAgICAgICB5eSA9IHkxO1xuICAgIH0gZWxzZSBpZiAocGFyYW0gPiAxKSB7XG4gICAgICAgIHh4ID0geDI7XG4gICAgICAgIHl5ID0geTI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgeHggPSB4MSArIHBhcmFtICogQztcbiAgICAgICAgeXkgPSB5MSArIHBhcmFtICogRDtcbiAgICB9XG5cbiAgICByZXR1cm4gW3h4LCB5eV0gYXMgUG9pbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFNlZ21lbnRzKHBvaW50czogUG9pbnRbXSwgcG9pbnQ6IFBvaW50KSB7XG4gICAgY29uc3QgbGVuID0gcG9pbnRzLmxlbmd0aDtcbiAgICBsZXQgZGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbiAtIDE7IGkrKykge1xuICAgICAgICBjb25zdCBwID0gcG9pbnRzW2ldO1xuICAgICAgICBjb25zdCBwMiA9IHBvaW50c1tpICsgMV07XG4gICAgICAgIGNvbnN0IGN1cnJlbnREaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kU2VnbWVudChwb2ludFswXSwgcG9pbnRbMV0sIHBbMF0sIHBbMV0sIHAyWzBdLCBwMlsxXSk7XG4gICAgICAgIGlmIChjdXJyZW50RGlzdGFuY2UgPCBkaXN0YW5jZSkge1xuICAgICAgICAgICAgZGlzdGFuY2UgPSBjdXJyZW50RGlzdGFuY2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpc3RhbmNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmVhcmVzdFBvaW50QmV0d2VlblBvaW50QW5kU2VnbWVudHMocG9pbnQ6IFBvaW50LCBwb2ludHM6IFBvaW50W10pIHtcbiAgICBjb25zdCBsZW4gPSBwb2ludHMubGVuZ3RoO1xuICAgIGxldCBkaXN0YW5jZSA9IEluZmluaXR5O1xuICAgIGxldCByZXN1bHQ6IFBvaW50ID0gcG9pbnQ7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHAgPSBwb2ludHNbaV07XG4gICAgICAgIGNvbnN0IHAyID0gaSA9PT0gbGVuIC0gMSA/IHBvaW50c1swXSA6IHBvaW50c1tpICsgMV07XG4gICAgICAgIGNvbnN0IGN1cnJlbnREaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50QW5kU2VnbWVudChwb2ludFswXSwgcG9pbnRbMV0sIHBbMF0sIHBbMV0sIHAyWzBdLCBwMlsxXSk7XG4gICAgICAgIGlmIChjdXJyZW50RGlzdGFuY2UgPCBkaXN0YW5jZSkge1xuICAgICAgICAgICAgZGlzdGFuY2UgPSBjdXJyZW50RGlzdGFuY2U7XG4gICAgICAgICAgICByZXN1bHQgPSBnZXROZWFyZXN0UG9pbnRCZXR3ZWVuUG9pbnRBbmRTZWdtZW50KHBvaW50LCBbcCwgcDJdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIsIGFuZ2xlOiBudW1iZXIpIHtcbiAgICAvLyDwnZGO4oCy8J2RpT0o8J2RjvCdkaXiiJLwnZGQ8J2RpSljb3PwnZyD4oiSKPCdkY7wnZGm4oiS8J2RkPCdkaYpc2lu8J2cgyvwnZGQ8J2RpVxuICAgIC8vIPCdkY7igLLwnZGmPSjwnZGO8J2RpeKIkvCdkZDwnZGlKXNpbvCdnIMrKPCdkY7wnZGm4oiS8J2RkPCdkaYpY29z8J2cgyvwnZGQ8J2Rpi5cbiAgICAvLyBodHRwczovL21hdGguc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzIyMDQ1MjAvaG93LWRvLWktcm90YXRlLWEtbGluZS1zZWdtZW50LWluLWEtc3BlY2lmaWMtcG9pbnQtb24tdGhlLWxpbmVcbiAgICByZXR1cm4gWyh4MSAtIHgyKSAqIE1hdGguY29zKGFuZ2xlKSAtICh5MSAtIHkyKSAqIE1hdGguc2luKGFuZ2xlKSArIHgyLCAoeDEgLSB4MikgKiBNYXRoLnNpbihhbmdsZSkgKyAoeTEgLSB5MikgKiBNYXRoLmNvcyhhbmdsZSkgKyB5Ml07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXN0YW5jZUJldHdlZW5Qb2ludEFuZFBvaW50KHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpIHtcbiAgICBjb25zdCBkeCA9IHgxIC0geDI7XG4gICAgY29uc3QgZHkgPSB5MSAtIHkyO1xuICAgIHJldHVybiBNYXRoLmh5cG90KGR4LCBkeSk7XG59XG5cbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzUyNTQ4MzgvY2FsY3VsYXRpbmctZGlzdGFuY2UtYmV0d2Vlbi1hLXBvaW50LWFuZC1hLXJlY3Rhbmd1bGFyLWJveC1uZWFyZXN0LXBvaW50XG5leHBvcnQgZnVuY3Rpb24gZGlzdGFuY2VCZXR3ZWVuUG9pbnRBbmRSZWN0YW5nbGUoeDogbnVtYmVyLCB5OiBudW1iZXIsIHJlY3Q6IFJlY3RhbmdsZUNsaWVudCkge1xuICAgIHZhciBkeCA9IE1hdGgubWF4KHJlY3QueCAtIHgsIDAsIHggLSAocmVjdC54ICsgcmVjdC53aWR0aCkpO1xuICAgIHZhciBkeSA9IE1hdGgubWF4KHJlY3QueSAtIHksIDAsIHkgLSAocmVjdC55ICsgcmVjdC5oZWlnaHQpKTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcbn1cblxuZXhwb3J0IGNvbnN0IGlzTGluZUhpdExpbmUgPSAoYTogUG9pbnQsIGI6IFBvaW50LCBjOiBQb2ludCwgZDogUG9pbnQpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBjcm9zc1Byb2R1Y3QgPSAodjE6IFBvaW50LCB2MjogUG9pbnQpID0+IHYxWzBdICogdjJbMV0gLSB2MVsxXSAqIHYyWzBdO1xuXG4gICAgY29uc3QgYWI6IFBvaW50ID0gW2JbMF0gLSBhWzBdLCBiWzFdIC0gYVsxXV07XG4gICAgY29uc3QgYWM6IFBvaW50ID0gW2NbMF0gLSBhWzBdLCBjWzFdIC0gYVsxXV07XG4gICAgY29uc3QgYWQ6IFBvaW50ID0gW2RbMF0gLSBhWzBdLCBkWzFdIC0gYVsxXV07XG5cbiAgICBjb25zdCBjYTogUG9pbnQgPSBbYVswXSAtIGNbMF0sIGFbMV0gLSBjWzFdXTtcbiAgICBjb25zdCBjYjogUG9pbnQgPSBbYlswXSAtIGNbMF0sIGJbMV0gLSBjWzFdXTtcbiAgICBjb25zdCBjZDogUG9pbnQgPSBbZFswXSAtIGNbMF0sIGRbMV0gLSBjWzFdXTtcblxuICAgIHJldHVybiBjcm9zc1Byb2R1Y3QoYWIsIGFjKSAqIGNyb3NzUHJvZHVjdChhYiwgYWQpIDw9IDAgJiYgY3Jvc3NQcm9kdWN0KGNkLCBjYSkgKiBjcm9zc1Byb2R1Y3QoY2QsIGNiKSA8PSAwO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUG9seWxpbmVIaXRSZWN0YW5nbGUgPSAocG9pbnRzOiBQb2ludFtdLCByZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkgPT4ge1xuICAgIGNvbnN0IHJlY3RhbmdsZVBvaW50cyA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHMocmVjdGFuZ2xlKTtcblxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGlzSW50ZXJzZWN0ID1cbiAgICAgICAgICAgIGlzTGluZUhpdExpbmUocG9pbnRzW2ldLCBwb2ludHNbaSAtIDFdLCByZWN0YW5nbGVQb2ludHNbMF0sIHJlY3RhbmdsZVBvaW50c1sxXSkgfHxcbiAgICAgICAgICAgIGlzTGluZUhpdExpbmUocG9pbnRzW2ldLCBwb2ludHNbaSAtIDFdLCByZWN0YW5nbGVQb2ludHNbMV0sIHJlY3RhbmdsZVBvaW50c1syXSkgfHxcbiAgICAgICAgICAgIGlzTGluZUhpdExpbmUocG9pbnRzW2ldLCBwb2ludHNbaSAtIDFdLCByZWN0YW5nbGVQb2ludHNbMl0sIHJlY3RhbmdsZVBvaW50c1szXSkgfHxcbiAgICAgICAgICAgIGlzTGluZUhpdExpbmUocG9pbnRzW2ldLCBwb2ludHNbaSAtIDFdLCByZWN0YW5nbGVQb2ludHNbM10sIHJlY3RhbmdsZVBvaW50c1swXSk7XG4gICAgICAgIGlmIChpc0ludGVyc2VjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vL2h0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIyNTIxOTgyL2NoZWNrLWlmLXBvaW50LWlzLWluc2lkZS1hLXBvbHlnb25cbmV4cG9ydCBjb25zdCBpc1BvaW50SW5Qb2x5Z29uID0gKHBvaW50OiBQb2ludCwgcG9pbnRzOiBQb2ludFtdKSA9PiB7XG4gICAgLy8gcmF5LWNhc3RpbmcgYWxnb3JpdGhtIGJhc2VkIG9uXG4gICAgLy8gaHR0cHM6Ly93cmYuZWNzZS5ycGkuZWR1L1Jlc2VhcmNoL1Nob3J0X05vdGVzL3BucG9seS5odG1sXG5cbiAgICBjb25zdCB4ID0gcG9pbnRbMF0sXG4gICAgICAgIHkgPSBwb2ludFsxXTtcblxuICAgIGxldCBpbnNpZGUgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpID0gMCwgaiA9IHBvaW50cy5sZW5ndGggLSAxOyBpIDwgcG9pbnRzLmxlbmd0aDsgaiA9IGkrKykge1xuICAgICAgICBsZXQgeGkgPSBwb2ludHNbaV1bMF0sXG4gICAgICAgICAgICB5aSA9IHBvaW50c1tpXVsxXTtcbiAgICAgICAgbGV0IHhqID0gcG9pbnRzW2pdWzBdLFxuICAgICAgICAgICAgeWogPSBwb2ludHNbal1bMV07XG5cbiAgICAgICAgbGV0IGludGVyc2VjdCA9IHlpID4geSAhPSB5aiA+IHkgJiYgeCA8ICgoeGogLSB4aSkgKiAoeSAtIHlpKSkgLyAoeWogLSB5aSkgKyB4aTtcbiAgICAgICAgaWYgKGludGVyc2VjdCkgaW5zaWRlID0gIWluc2lkZTtcbiAgICB9XG4gICAgcmV0dXJuIGluc2lkZTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1BvaW50SW5FbGxpcHNlID0gKHBvaW50OiBQb2ludCwgY2VudGVyOiBQb2ludCwgcng6IG51bWJlciwgcnk6IG51bWJlciwgcm90YXRpb24gPSAwKSA9PiB7XG4gICAgY29uc3QgY29zQW5nbGUgPSBNYXRoLmNvcyhyb3RhdGlvbik7XG4gICAgY29uc3Qgc2luQW5nbGUgPSBNYXRoLnNpbihyb3RhdGlvbik7XG4gICAgY29uc3QgeDEgPSAocG9pbnRbMF0gLSBjZW50ZXJbMF0pICogY29zQW5nbGUgKyAocG9pbnRbMV0gLSBjZW50ZXJbMV0pICogc2luQW5nbGU7XG4gICAgY29uc3QgeTEgPSAocG9pbnRbMV0gLSBjZW50ZXJbMV0pICogY29zQW5nbGUgLSAocG9pbnRbMF0gLSBjZW50ZXJbMF0pICogc2luQW5nbGU7XG5cbiAgICByZXR1cm4gKHgxICogeDEpIC8gKHJ4ICogcngpICsgKHkxICogeTEpIC8gKHJ5ICogcnkpIDw9IDE7XG59O1xuXG5leHBvcnQgY29uc3QgaXNQb2ludEluUm91bmRSZWN0YW5nbGUgPSAocG9pbnQ6IFBvaW50LCByZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgcmFkaXVzOiBudW1iZXIpID0+IHtcbiAgICBjb25zdCB7IHg6IHJlY3RYLCB5OiByZWN0WSwgd2lkdGgsIGhlaWdodCB9ID0gcmVjdGFuZ2xlO1xuICAgIGNvbnN0IGlzSW5SZWN0YW5nbGUgPSBwb2ludFswXSA+PSByZWN0WCAmJiBwb2ludFswXSA8PSByZWN0WCArIHdpZHRoICYmIHBvaW50WzFdID49IHJlY3RZICYmIHBvaW50WzFdIDw9IHJlY3RZICsgaGVpZ2h0O1xuICAgIGNvbnN0IGhhbmRsZUxlZnRUb3AgPVxuICAgICAgICBwb2ludFswXSA+PSByZWN0WCAmJlxuICAgICAgICBwb2ludFswXSA8PSByZWN0WCArIHJhZGl1cyAmJlxuICAgICAgICBwb2ludFsxXSA+PSByZWN0WSAmJlxuICAgICAgICBwb2ludFsxXSA8PSByZWN0WSArIHJhZGl1cyAmJlxuICAgICAgICBNYXRoLmh5cG90KHBvaW50WzBdIC0gKHJlY3RYICsgcmFkaXVzKSwgcG9pbnRbMV0gLSAocmVjdFkgKyByYWRpdXMpKSA+IHJhZGl1cztcbiAgICBjb25zdCBoYW5kbGVMZWZ0Qm90dG9tID1cbiAgICAgICAgcG9pbnRbMF0gPj0gcmVjdFggJiZcbiAgICAgICAgcG9pbnRbMF0gPD0gcmVjdFggKyByYWRpdXMgJiZcbiAgICAgICAgcG9pbnRbMV0gPj0gcmVjdFkgKyBoZWlnaHQgJiZcbiAgICAgICAgcG9pbnRbMV0gPD0gcmVjdFkgKyBoZWlnaHQgLSByYWRpdXMgJiZcbiAgICAgICAgTWF0aC5oeXBvdChwb2ludFswXSAtIChyZWN0WCArIHJhZGl1cyksIHBvaW50WzFdIC0gKHJlY3RZICsgaGVpZ2h0IC0gcmFkaXVzKSkgPiByYWRpdXM7XG4gICAgY29uc3QgaGFuZGxlUmlnaHRUb3AgPVxuICAgICAgICBwb2ludFswXSA+PSByZWN0WCArIHdpZHRoIC0gcmFkaXVzICYmXG4gICAgICAgIHBvaW50WzBdIDw9IHJlY3RYICsgd2lkdGggJiZcbiAgICAgICAgcG9pbnRbMV0gPj0gcmVjdFkgJiZcbiAgICAgICAgcG9pbnRbMV0gPD0gcmVjdFkgKyByYWRpdXMgJiZcbiAgICAgICAgTWF0aC5oeXBvdChwb2ludFswXSAtIChyZWN0WCArIHdpZHRoIC0gcmFkaXVzKSwgcG9pbnRbMV0gLSAocmVjdFkgKyByYWRpdXMpKSA+IHJhZGl1cztcbiAgICBjb25zdCBoYW5kbGVSaWdodEJvdHRvbSA9XG4gICAgICAgIHBvaW50WzBdID49IHJlY3RYICsgd2lkdGggLSByYWRpdXMgJiZcbiAgICAgICAgcG9pbnRbMF0gPD0gcmVjdFggKyB3aWR0aCAmJlxuICAgICAgICBwb2ludFsxXSA+PSByZWN0WSArIGhlaWdodCAtIHJhZGl1cyAmJlxuICAgICAgICBwb2ludFsxXSA8PSByZWN0WSArIGhlaWdodCAmJlxuICAgICAgICBNYXRoLmh5cG90KHBvaW50WzBdIC0gKHJlY3RYICsgd2lkdGggLSByYWRpdXMpLCBwb2ludFsxXSAtIChyZWN0WSArIGhlaWdodCAtIHJhZGl1cykpID4gcmFkaXVzO1xuICAgIGNvbnN0IGlzSW5Db3JuZXIgPSBoYW5kbGVMZWZ0VG9wIHx8IGhhbmRsZUxlZnRCb3R0b20gfHwgaGFuZGxlUmlnaHRUb3AgfHwgaGFuZGxlUmlnaHRCb3R0b207XG5cbiAgICByZXR1cm4gaXNJblJlY3RhbmdsZSAmJiAhaXNJbkNvcm5lcjtcbn07XG4iXX0=
|