@plait/common 0.78.0-next.0 → 0.78.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/fesm2022/plait-common.mjs.map +1 -1
  2. package/package.json +1 -3
  3. package/esm2022/algorithms/a-star.mjs +0 -58
  4. package/esm2022/algorithms/data-structures/graph.mjs +0 -47
  5. package/esm2022/algorithms/data-structures/index.mjs +0 -3
  6. package/esm2022/algorithms/data-structures/priority-queue.mjs +0 -13
  7. package/esm2022/algorithms/index.mjs +0 -3
  8. package/esm2022/constants/default.mjs +0 -11
  9. package/esm2022/constants/index.mjs +0 -5
  10. package/esm2022/constants/media.mjs +0 -8
  11. package/esm2022/constants/property.mjs +0 -7
  12. package/esm2022/constants/resize.mjs +0 -12
  13. package/esm2022/core/element-flavour.mjs +0 -8
  14. package/esm2022/core/element-ref.mjs +0 -32
  15. package/esm2022/core/group.component.mjs +0 -39
  16. package/esm2022/core/index.mjs +0 -5
  17. package/esm2022/core/render-component.mjs +0 -2
  18. package/esm2022/generators/active.generator.mjs +0 -50
  19. package/esm2022/generators/generator.mjs +0 -70
  20. package/esm2022/generators/group.generator.mjs +0 -21
  21. package/esm2022/generators/index.mjs +0 -4
  22. package/esm2022/image/image-base.component.mjs +0 -9
  23. package/esm2022/image/image.generator.mjs +0 -98
  24. package/esm2022/image/index.mjs +0 -4
  25. package/esm2022/image/with-image.mjs +0 -8
  26. package/esm2022/plait-common.mjs +0 -5
  27. package/esm2022/plugins/index.mjs +0 -3
  28. package/esm2022/plugins/with-group.mjs +0 -198
  29. package/esm2022/plugins/with-resize.mjs +0 -111
  30. package/esm2022/public-api.mjs +0 -16
  31. package/esm2022/shapes/common.mjs +0 -14
  32. package/esm2022/shapes/index.mjs +0 -2
  33. package/esm2022/text/index.mjs +0 -5
  34. package/esm2022/text/text-manage.mjs +0 -147
  35. package/esm2022/text/text-measure.mjs +0 -59
  36. package/esm2022/text/types.mjs +0 -7
  37. package/esm2022/text/with-text.mjs +0 -8
  38. package/esm2022/transforms/align.mjs +0 -116
  39. package/esm2022/transforms/index.mjs +0 -3
  40. package/esm2022/transforms/property.mjs +0 -40
  41. package/esm2022/types/index.mjs +0 -3
  42. package/esm2022/types/resize.mjs +0 -2
  43. package/esm2022/types/rotate.mjs +0 -2
  44. package/esm2022/utils/animate.mjs +0 -38
  45. package/esm2022/utils/clipboard.mjs +0 -30
  46. package/esm2022/utils/creation-mode.mjs +0 -19
  47. package/esm2022/utils/default-orthogonal-routing.mjs +0 -87
  48. package/esm2022/utils/direction.mjs +0 -93
  49. package/esm2022/utils/drawing/index.mjs +0 -3
  50. package/esm2022/utils/drawing/resize-handle.mjs +0 -25
  51. package/esm2022/utils/drawing/rotate-handle.mjs +0 -22
  52. package/esm2022/utils/elbow-line-route.mjs +0 -256
  53. package/esm2022/utils/elements.mjs +0 -19
  54. package/esm2022/utils/hot-key.mjs +0 -29
  55. package/esm2022/utils/image.mjs +0 -50
  56. package/esm2022/utils/index.mjs +0 -19
  57. package/esm2022/utils/line-path.mjs +0 -80
  58. package/esm2022/utils/math.mjs +0 -24
  59. package/esm2022/utils/memorize.mjs +0 -10
  60. package/esm2022/utils/resize.mjs +0 -137
  61. package/esm2022/utils/rotate.mjs +0 -16
  62. package/esm2022/utils/stroke.mjs +0 -12
  63. package/esm2022/utils/text.mjs +0 -105
  64. package/esm2022/utils/vector.mjs +0 -43
@@ -1,87 +0,0 @@
1
- // Credits to xyflow
2
- // https://github.com/xyflow/xyflow/blob/main/packages/system/src/utils/edges/smoothstep-edge.ts
3
- import { Direction } from "@plait/core";
4
- import { getDirectionFactor } from "./direction";
5
- export const getPoints = (source, sourcePosition, target, targetPosition, offset) => {
6
- const sourceDirectionFactors = getDirectionFactor(sourcePosition);
7
- const targetDFs = getDirectionFactor(targetPosition);
8
- const sourceGapped = [source[0] + sourceDirectionFactors.x * offset, source[1] + sourceDirectionFactors.y * offset];
9
- const targetGapped = [target[0] + targetDFs.x * offset, target[1] + targetDFs.y * offset];
10
- const dir = getDirection(sourceGapped, sourcePosition, targetGapped);
11
- const dirAccessor = dir.x !== 0 ? 'x' : 'y';
12
- const currDir = dir[dirAccessor];
13
- let points = [];
14
- let centerX, centerY;
15
- const [defaultCenterX, defaultCenterY] = getEdgeCenter({
16
- sourceX: source[0],
17
- sourceY: source[1],
18
- targetX: target[0],
19
- targetY: target[1]
20
- });
21
- // opposite handle positions, default case
22
- if (sourceDirectionFactors[dirAccessor] * targetDFs[dirAccessor] === -1) {
23
- centerX = defaultCenterX;
24
- centerY = defaultCenterY;
25
- // --->
26
- // |
27
- // >---
28
- const verticalSplit = [
29
- [centerX, sourceGapped[1]],
30
- [centerX, targetGapped[1]]
31
- ];
32
- // |
33
- // ---
34
- // |
35
- const horizontalSplit = [
36
- [sourceGapped[0], centerY],
37
- [targetGapped[0], centerY]
38
- ];
39
- if (sourceDirectionFactors[dirAccessor] === currDir) {
40
- points = dirAccessor === 'x' ? verticalSplit : horizontalSplit;
41
- }
42
- else {
43
- points = dirAccessor === 'x' ? horizontalSplit : verticalSplit;
44
- }
45
- }
46
- else {
47
- // sourceTarget means we take x from source and y from target, targetSource is the opposite
48
- const sourceTarget = [[sourceGapped[0], targetGapped[1]]];
49
- const targetSource = [[targetGapped[0], sourceGapped[1]]];
50
- // this handles edges with same handle positions
51
- if (dirAccessor === 'x') {
52
- points = sourceDirectionFactors.x === currDir ? targetSource : sourceTarget;
53
- }
54
- else {
55
- points = sourceDirectionFactors.y === currDir ? sourceTarget : targetSource;
56
- }
57
- // these are conditions for handling mixed handle positions like right -> bottom for example
58
- let flipSourceTarget;
59
- if (sourcePosition !== targetPosition) {
60
- const dirAccessorOpposite = dirAccessor === 'x' ? 1 : 0;
61
- const isSameDir = sourceDirectionFactors[dirAccessor] === targetDFs[dirAccessor === 'x' ? 'y' : 'x'];
62
- const sourceGtTarget = sourceGapped[dirAccessorOpposite] > targetGapped[dirAccessorOpposite];
63
- const sourceLtTarget = sourceGapped[dirAccessorOpposite] < targetGapped[dirAccessorOpposite];
64
- flipSourceTarget =
65
- (sourceDirectionFactors[dirAccessor] === 1 && ((!isSameDir && sourceGtTarget) || (isSameDir && sourceLtTarget))) ||
66
- (sourceDirectionFactors[dirAccessor] !== 1 && ((!isSameDir && sourceLtTarget) || (isSameDir && sourceGtTarget)));
67
- if (flipSourceTarget) {
68
- points = dirAccessor === 'x' ? sourceTarget : targetSource;
69
- }
70
- }
71
- }
72
- return [source, sourceGapped, ...points, targetGapped, target];
73
- };
74
- const getDirection = (source, sourcePosition = Direction.bottom, target) => {
75
- if (sourcePosition === Direction.left || sourcePosition === Direction.right) {
76
- return source[0] < target[0] ? { x: 1, y: 0 } : { x: -1, y: 0 };
77
- }
78
- return source[1] < target[1] ? { x: 0, y: 1 } : { x: 0, y: -1 };
79
- };
80
- function getEdgeCenter({ sourceX, sourceY, targetX, targetY }) {
81
- const xOffset = Math.abs(targetX - sourceX) / 2;
82
- const centerX = targetX < sourceX ? targetX + xOffset : targetX - xOffset;
83
- const yOffset = Math.abs(targetY - sourceY) / 2;
84
- const centerY = targetY < sourceY ? targetY + yOffset : targetY - yOffset;
85
- return [centerX, centerY, xOffset, yOffset];
86
- }
87
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1vcnRob2dvbmFsLXJvdXRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3V0aWxzL2RlZmF1bHQtb3J0aG9nb25hbC1yb3V0aW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUNwQixnR0FBZ0c7QUFFaEcsT0FBTyxFQUFFLFNBQVMsRUFBUyxNQUFNLGFBQWEsQ0FBQztBQUMvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFakQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsTUFBYSxFQUFFLGNBQXlCLEVBQUUsTUFBYSxFQUFFLGNBQXlCLEVBQUUsTUFBYyxFQUFFLEVBQUU7SUFDNUgsTUFBTSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNsRSxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNyRCxNQUFNLFlBQVksR0FBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDM0gsTUFBTSxZQUFZLEdBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDakcsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLFlBQVksRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDckUsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFD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RUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3BFLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNwRSxDQUFDLENBQUM7QUFFRixTQUFTLGFBQWEsQ0FBQyxFQUNuQixPQUFPLEVBQ1AsT0FBTyxFQUNQLE9BQU8sRUFDUCxPQUFPLEVBTVY7SUFDRyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEQsTUFBTSxPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUUxRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEQsTUFBTSxPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUUxRSxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENyZWRpdHMgdG8geHlmbG93XG4vLyBodHRwczovL2dpdGh1Yi5jb20veHlmbG93L3h5Zmxvdy9ibG9iL21haW4vcGFja2FnZXMvc3lzdGVtL3NyYy91dGlscy9lZGdlcy9zbW9vdGhzdGVwLWVkZ2UudHNcblxuaW1wb3J0IHsgRGlyZWN0aW9uLCBQb2ludCB9IGZyb20gXCJAcGxhaXQvY29yZVwiO1xuaW1wb3J0IHsgZ2V0RGlyZWN0aW9uRmFjdG9yIH0gZnJvbSBcIi4vZGlyZWN0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRQb2ludHMgPSAoc291cmNlOiBQb2ludCwgc291cmNlUG9zaXRpb246IERpcmVjdGlvbiwgdGFyZ2V0OiBQb2ludCwgdGFyZ2V0UG9zaXRpb246IERpcmVjdGlvbiwgb2Zmc2V0OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBzb3VyY2VEaXJlY3Rpb25GYWN0b3JzID0gZ2V0RGlyZWN0aW9uRmFjdG9yKHNvdXJjZVBvc2l0aW9uKTtcbiAgICBjb25zdCB0YXJnZXRERnMgPSBnZXREaXJlY3Rpb25GYWN0b3IodGFyZ2V0UG9zaXRpb24pO1xuICAgIGNvbnN0IHNvdXJjZUdhcHBlZDogUG9pbnQgPSBbc291cmNlWzBdICsgc291cmNlRGlyZWN0aW9uRmFjdG9ycy54ICogb2Zmc2V0LCBzb3VyY2VbMV0gKyBzb3VyY2VEaXJlY3Rpb25GYWN0b3JzLnkgKiBvZmZzZXRdO1xuICAgIGNvbnN0IHRhcmdldEdhcHBlZDogUG9pbnQgPSBbdGFyZ2V0WzBdICsgdGFyZ2V0REZzLnggKiBvZmZzZXQsIHRhcmdldFsxXSArIHRhcmdldERGcy55ICogb2Zmc2V0XTtcbiAgICBjb25zdCBkaXIgPSBnZXREaXJlY3Rpb24oc291cmNlR2FwcGVkLCBzb3VyY2VQb3NpdGlvbiwgdGFyZ2V0R2FwcGVkKTtcbiAgICBjb25zdCBkaXJBY2Nlc3NvciA9IGRpci54ICE9PSAwID8gJ3gnIDogJ3knO1xuICAgIGNvbnN0IGN1cnJEaXIgPSBkaXJbZGlyQWNjZXNzb3JdO1xuXG4gICAgbGV0IHBvaW50czogUG9pbnRbXSA9IFtdO1xuICAgIGxldCBjZW50ZXJYLCBjZW50ZXJZO1xuICAgIGNvbnN0IFtkZWZhdWx0Q2VudGVyWCwgZGVmYXVsdENlbnRlclldID0gZ2V0RWRnZUNlbnRlcih7XG4gICAgICAgIHNvdXJjZVg6IHNvdXJjZVswXSxcbiAgICAgICAgc291cmNlWTogc291cmNlWzFdLFxuICAgICAgICB0YXJnZXRYOiB0YXJnZXRbMF0sXG4gICAgICAgIHRhcmdldFk6IHRhcmdldFsxXVxuICAgIH0pO1xuICAgIC8vIG9wcG9zaXRlIGhhbmRsZSBwb3NpdGlvbnMsIGRlZmF1bHQgY2FzZVxuICAgIGlmIChzb3VyY2VEaXJlY3Rpb25GYWN0b3JzW2RpckFjY2Vzc29yXSAqIHRhcmdldERGc1tkaXJBY2Nlc3Nvcl0gPT09IC0xKSB7XG4gICAgICAgIGNlbnRlclggPSBkZWZhdWx0Q2VudGVyWDtcbiAgICAgICAgY2VudGVyWSA9IGRlZmF1bHRDZW50ZXJZO1xuICAgICAgICAvLyAgICAtLS0+XG4gICAgICAgIC8vICAgIHxcbiAgICAgICAgLy8gPi0tLVxuICAgICAgICBjb25zdCB2ZXJ0aWNhbFNwbGl0OiBQb2ludFtdID0gW1xuICAgICAgICAgICAgW2NlbnRlclgsIHNvdXJjZUdhcHBlZFsxXV0sXG4gICAgICAgICAgICBbY2VudGVyWCwgdGFyZ2V0R2FwcGVkWzFdXVxuICAgICAgICBdO1xuICAgICAgICAvLyAgICB8XG4gICAgICAgIC8vICAtLS1cbiAgICAgICAgLy8gIHxcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbFNwbGl0OiBQb2ludFtdID0gW1xuICAgICAgICAgICAgW3NvdXJjZUdhcHBlZFswXSwgY2VudGVyWV0sXG4gICAgICAgICAgICBbdGFyZ2V0R2FwcGVkWzBdLCBjZW50ZXJZXVxuICAgICAgICBdO1xuICAgICAgICBpZiAoc291cmNlRGlyZWN0aW9uRmFjdG9yc1tkaXJBY2Nlc3Nvcl0gPT09IGN1cnJEaXIpIHtcbiAgICAgICAgICAgIHBvaW50cyA9IGRpckFjY2Vzc29yID09PSAneCcgPyB2ZXJ0aWNhbFNwbGl0IDogaG9yaXpvbnRhbFNwbGl0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcG9pbnRzID0gZGlyQWNjZXNzb3IgPT09ICd4JyA/IGhvcml6b250YWxTcGxpdCA6IHZlcnRpY2FsU3BsaXQ7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzb3VyY2VUYXJnZXQgbWVhbnMgd2UgdGFrZSB4IGZyb20gc291cmNlIGFuZCB5IGZyb20gdGFyZ2V0LCB0YXJnZXRTb3VyY2UgaXMgdGhlIG9wcG9zaXRlXG4gICAgICAgIGNvbnN0IHNvdXJjZVRhcmdldDogUG9pbnRbXSA9IFtbc291cmNlR2FwcGVkWzBdLCB0YXJnZXRHYXBwZWRbMV1dXTtcbiAgICAgICAgY29uc3QgdGFyZ2V0U291cmNlOiBQb2ludFtdID0gW1t0YXJnZXRHYXBwZWRbMF0sIHNvdXJjZUdhcHBlZFsxXV1dO1xuICAgICAgICAvLyB0aGlzIGhhbmRsZXMgZWRnZXMgd2l0aCBzYW1lIGhhbmRsZSBwb3NpdGlvbnNcbiAgICAgICAgaWYgKGRpckFjY2Vzc29yID09PSAneCcpIHtcbiAgICAgICAgICAgIHBvaW50cyA9IHNvdXJjZURpcmVjdGlvbkZhY3RvcnMueCA9PT0gY3VyckRpciA/IHRhcmdldFNvdXJjZSA6IHNvdXJjZVRhcmdldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvaW50cyA9IHNvdXJjZURpcmVjdGlvbkZhY3RvcnMueSA9PT0gY3VyckRpciA/IHNvdXJjZVRhcmdldCA6IHRhcmdldFNvdXJjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoZXNlIGFyZSBjb25kaXRpb25zIGZvciBoYW5kbGluZyBtaXhlZCBoYW5kbGUgcG9zaXRpb25zIGxpa2UgcmlnaHQgLT4gYm90dG9tIGZvciBleGFtcGxlXG4gICAgICAgIGxldCBmbGlwU291cmNlVGFyZ2V0O1xuICAgICAgICBpZiAoc291cmNlUG9zaXRpb24gIT09IHRhcmdldFBvc2l0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBkaXJBY2Nlc3Nvck9wcG9zaXRlID0gZGlyQWNjZXNzb3IgPT09ICd4JyA/IDEgOiAwO1xuICAgICAgICAgICAgY29uc3QgaXNTYW1lRGlyID0gc291cmNlRGlyZWN0aW9uRmFjdG9yc1tkaXJBY2Nlc3Nvcl0gPT09IHRhcmdldERGc1tkaXJBY2Nlc3NvciA9PT0gJ3gnID8gJ3knIDogJ3gnXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUd0VGFyZ2V0ID0gc291cmNlR2FwcGVkW2RpckFjY2Vzc29yT3Bwb3NpdGVdID4gdGFyZ2V0R2FwcGVkW2RpckFjY2Vzc29yT3Bwb3NpdGVdO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlTHRUYXJnZXQgPSBzb3VyY2VHYXBwZWRbZGlyQWNjZXNzb3JPcHBvc2l0ZV0gPCB0YXJnZXRHYXBwZWRbZGlyQWNjZXNzb3JPcHBvc2l0ZV07XG4gICAgICAgICAgICBmbGlwU291cmNlVGFyZ2V0ID1cbiAgICAgICAgICAgICAgICAoc291cmNlRGlyZWN0aW9uRmFjdG9yc1tkaXJBY2Nlc3Nvcl0gPT09IDEgJiYgKCghaXNTYW1lRGlyICYmIHNvdXJjZUd0VGFyZ2V0KSB8fCAoaXNTYW1lRGlyICYmIHNvdXJjZUx0VGFyZ2V0KSkpIHx8XG4gICAgICAgICAgICAgICAgKHNvdXJjZURpcmVjdGlvbkZhY3RvcnNbZGlyQWNjZXNzb3JdICE9PSAxICYmICgoIWlzU2FtZURpciAmJiBzb3VyY2VMdFRhcmdldCkgfHwgKGlzU2FtZURpciAmJiBzb3VyY2VHdFRhcmdldCkpKTtcblxuICAgICAgICAgICAgaWYgKGZsaXBTb3VyY2VUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICBwb2ludHMgPSBkaXJBY2Nlc3NvciA9PT0gJ3gnID8gc291cmNlVGFyZ2V0IDogdGFyZ2V0U291cmNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbc291cmNlLCBzb3VyY2VHYXBwZWQsIC4uLnBvaW50cywgdGFyZ2V0R2FwcGVkLCB0YXJnZXRdO1xufTtcblxuY29uc3QgZ2V0RGlyZWN0aW9uID0gKHNvdXJjZTogUG9pbnQsIHNvdXJjZVBvc2l0aW9uID0gRGlyZWN0aW9uLmJvdHRvbSwgdGFyZ2V0OiBQb2ludCkgPT4ge1xuICAgIGlmIChzb3VyY2VQb3NpdGlvbiA9PT0gRGlyZWN0aW9uLmxlZnQgfHwgc291cmNlUG9zaXRpb24gPT09IERpcmVjdGlvbi5yaWdodCkge1xuICAgICAgICByZXR1cm4gc291cmNlWzBdIDwgdGFyZ2V0WzBdID8geyB4OiAxLCB5OiAwIH0gOiB7IHg6IC0xLCB5OiAwIH07XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VbMV0gPCB0YXJnZXRbMV0gPyB7IHg6IDAsIHk6IDEgfSA6IHsgeDogMCwgeTogLTEgfTtcbn07XG5cbmZ1bmN0aW9uIGdldEVkZ2VDZW50ZXIoe1xuICAgIHNvdXJjZVgsXG4gICAgc291cmNlWSxcbiAgICB0YXJnZXRYLFxuICAgIHRhcmdldFlcbn06IHtcbiAgICBzb3VyY2VYOiBudW1iZXI7XG4gICAgc291cmNlWTogbnVtYmVyO1xuICAgIHRhcmdldFg6IG51bWJlcjtcbiAgICB0YXJnZXRZOiBudW1iZXI7XG59KTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICAgIGNvbnN0IHhPZmZzZXQgPSBNYXRoLmFicyh0YXJnZXRYIC0gc291cmNlWCkgLyAyO1xuICAgIGNvbnN0IGNlbnRlclggPSB0YXJnZXRYIDwgc291cmNlWCA/IHRhcmdldFggKyB4T2Zmc2V0IDogdGFyZ2V0WCAtIHhPZmZzZXQ7XG5cbiAgICBjb25zdCB5T2Zmc2V0ID0gTWF0aC5hYnModGFyZ2V0WSAtIHNvdXJjZVkpIC8gMjtcbiAgICBjb25zdCBjZW50ZXJZID0gdGFyZ2V0WSA8IHNvdXJjZVkgPyB0YXJnZXRZICsgeU9mZnNldCA6IHRhcmdldFkgLSB5T2Zmc2V0O1xuXG4gICAgcmV0dXJuIFtjZW50ZXJYLCBjZW50ZXJZLCB4T2Zmc2V0LCB5T2Zmc2V0XTtcbn0iXX0=
@@ -1,93 +0,0 @@
1
- import { Direction } from '@plait/core';
2
- const handleDirectionFactors = {
3
- [Direction.left]: { x: -1, y: 0 },
4
- [Direction.right]: { x: 1, y: 0 },
5
- [Direction.top]: { x: 0, y: -1 },
6
- [Direction.bottom]: { x: 0, y: 1 }
7
- };
8
- export function getOppositeDirection(direction) {
9
- switch (direction) {
10
- case Direction.left:
11
- return Direction.right;
12
- case Direction.right:
13
- return Direction.left;
14
- case Direction.top:
15
- return Direction.bottom;
16
- case Direction.bottom:
17
- return Direction.top;
18
- }
19
- }
20
- export function getDirectionByPointOfRectangle(point) {
21
- if (point[0] === 0) {
22
- return Direction.left;
23
- }
24
- if (point[0] === 1) {
25
- return Direction.right;
26
- }
27
- if (point[1] === 0) {
28
- return Direction.top;
29
- }
30
- if (point[1] === 1) {
31
- return Direction.bottom;
32
- }
33
- return undefined;
34
- }
35
- /**
36
- * this function accepts vector parameter, the vector parameter vector is based on the screen coordinate system
37
- * vector[0] and vector[1] are the x and y components of the vector respectively.
38
- * if the vector has only one direction, the function returns a string in that direction, such as 'right', 'top', 'bottom' or 'left'.
39
- * if the vector has two directions, the function will return the string in which direction it is closer.
40
- */
41
- export function getDirectionByVector(vector) {
42
- const x = vector[0];
43
- const y = vector[1];
44
- if (x === 0 && y === 0) {
45
- return null;
46
- }
47
- if (x === 0) {
48
- return y > 0 ? Direction.bottom : Direction.top;
49
- }
50
- if (y === 0) {
51
- return x > 0 ? Direction.right : Direction.left;
52
- }
53
- const angle = Math.atan2(y, x);
54
- if (angle > -Math.PI / 4 && angle <= Math.PI / 4) {
55
- return Direction.right;
56
- }
57
- else if (angle > Math.PI / 4 && angle <= (3 * Math.PI) / 4) {
58
- return Direction.bottom;
59
- }
60
- else if (angle > (-3 * Math.PI) / 4 && angle <= -Math.PI / 4) {
61
- return Direction.top;
62
- }
63
- else {
64
- return Direction.left;
65
- }
66
- }
67
- export function getDirectionBetweenPointAndPoint(source, target) {
68
- if (source[0] === target[0]) {
69
- if (source[1] >= target[1]) {
70
- return Direction.top;
71
- }
72
- else {
73
- return Direction.bottom;
74
- }
75
- }
76
- if (source[1] === target[1]) {
77
- if (source[0] >= target[0]) {
78
- return Direction.left;
79
- }
80
- else {
81
- return Direction.right;
82
- }
83
- }
84
- throw new Error('can not match direction');
85
- }
86
- export function getDirectionFactor(direction) {
87
- return handleDirectionFactors[direction];
88
- }
89
- export function getDirectionFactorByDirectionComponent(directionComponent) {
90
- const directionFactor = directionComponent === 0 ? directionComponent : directionComponent / Math.abs(directionComponent);
91
- return directionFactor;
92
- }
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL3NyYy91dGlscy9kaXJlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBb0QsTUFBTSxhQUFhLENBQUM7QUFFMUYsTUFBTSxzQkFBc0IsR0FBRztJQUMzQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2pDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDaEMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7Q0FDckMsQ0FBQztBQUVGLE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxTQUFvQjtJQUNyRCxRQUFRLFNBQVMsRUFBRSxDQUFDO1FBQ2hCLEtBQUssU0FBUyxDQUFDLElBQUk7WUFDZixPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFDM0IsS0FBSyxTQUFTLENBQUMsS0FBSztZQUNoQixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDMUIsS0FBSyxTQUFTLENBQUMsR0FBRztZQUNkLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUM1QixLQUFLLFNBQVMsQ0FBQyxNQUFNO1lBQ2pCLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQztJQUM3QixDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyxLQUF1QjtJQUNsRSxJQUFJLEtB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Q0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxQixJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDMUIsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFDM0IsQ0FBQztJQUNMLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxTQUFvQjtJQUNuRCxPQUFPLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRCxNQUFNLFVBQVUsc0NBQXNDLENBQUMsa0JBQTBCO0lBQzdFLE1BQU0sZUFBZSxHQUFHLGtCQUFrQixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUMxSCxPQUFPLGVBQWtDLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGlvbiwgRGlyZWN0aW9uRmFjdG9yLCBQb2ludCwgUG9pbnRPZlJlY3RhbmdsZSwgVmVjdG9yIH0gZnJvbSAnQHBsYWl0L2NvcmUnO1xuXG5jb25zdCBoYW5kbGVEaXJlY3Rpb25GYWN0b3JzID0ge1xuICAgIFtEaXJlY3Rpb24ubGVmdF06IHsgeDogLTEsIHk6IDAgfSxcbiAgICBbRGlyZWN0aW9uLnJpZ2h0XTogeyB4OiAxLCB5OiAwIH0sXG4gICAgW0RpcmVjdGlvbi50b3BdOiB7IHg6IDAsIHk6IC0xIH0sXG4gICAgW0RpcmVjdGlvbi5ib3R0b21dOiB7IHg6IDAsIHk6IDEgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9wcG9zaXRlRGlyZWN0aW9uKGRpcmVjdGlvbjogRGlyZWN0aW9uKSB7XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgY2FzZSBEaXJlY3Rpb24ubGVmdDpcbiAgICAgICAgICAgIHJldHVybiBEaXJlY3Rpb24ucmlnaHQ7XG4gICAgICAgIGNhc2UgRGlyZWN0aW9uLnJpZ2h0OlxuICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbi5sZWZ0O1xuICAgICAgICBjYXNlIERpcmVjdGlvbi50b3A6XG4gICAgICAgICAgICByZXR1cm4gRGlyZWN0aW9uLmJvdHRvbTtcbiAgICAgICAgY2FzZSBEaXJlY3Rpb24uYm90dG9tOlxuICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbi50b3A7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlyZWN0aW9uQnlQb2ludE9mUmVjdGFuZ2xlKHBvaW50OiBQb2ludE9mUmVjdGFuZ2xlKTogRGlyZWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocG9pbnRbMF0gPT09IDApIHtcbiAgICAgICAgcmV0dXJuIERpcmVjdGlvbi5sZWZ0O1xuICAgIH1cbiAgICBpZiAocG9pbnRbMF0gPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIERpcmVjdGlvbi5yaWdodDtcbiAgICB9XG4gICAgaWYgKHBvaW50WzFdID09PSAwKSB7XG4gICAgICAgIHJldHVybiBEaXJlY3Rpb24udG9wO1xuICAgIH1cbiAgICBpZiAocG9pbnRbMV0gPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIERpcmVjdGlvbi5ib3R0b207XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogdGhpcyBmdW5jdGlvbiBhY2NlcHRzIHZlY3RvciBwYXJhbWV0ZXIsIHRoZSB2ZWN0b3IgcGFyYW1ldGVyIHZlY3RvciBpcyBiYXNlZCBvbiB0aGUgc2NyZWVuIGNvb3JkaW5hdGUgc3lzdGVtXG4gKiB2ZWN0b3JbMF0gYW5kIHZlY3RvclsxXSBhcmUgdGhlIHggYW5kIHkgY29tcG9uZW50cyBvZiB0aGUgdmVjdG9yIHJlc3BlY3RpdmVseS5cbiAqIGlmIHRoZSB2ZWN0b3IgaGFzIG9ubHkgb25lIGRpcmVjdGlvbiwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcgaW4gdGhhdCBkaXJlY3Rpb24sIHN1Y2ggYXMgJ3JpZ2h0JywgJ3RvcCcsICdib3R0b20nIG9yICdsZWZ0Jy5cbiAqIGlmIHRoZSB2ZWN0b3IgaGFzIHR3byBkaXJlY3Rpb25zLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIHN0cmluZyBpbiB3aGljaCBkaXJlY3Rpb24gaXQgaXMgY2xvc2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlyZWN0aW9uQnlWZWN0b3IodmVjdG9yOiBWZWN0b3IpOiBEaXJlY3Rpb24gfCBudWxsIHtcbiAgICBjb25zdCB4ID0gdmVjdG9yWzBdO1xuICAgIGNvbnN0IHkgPSB2ZWN0b3JbMV07XG4gICAgaWYgKHggPT09IDAgJiYgeSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHkgPiAwID8gRGlyZWN0aW9uLmJvdHRvbSA6IERpcmVjdGlvbi50b3A7XG4gICAgfVxuICAgIGlmICh5ID09PSAwKSB7XG4gICAgICAgIHJldHVybiB4ID4gMCA/IERpcmVjdGlvbi5yaWdodCA6IERpcmVjdGlvbi5sZWZ0O1xuICAgIH1cbiAgICBjb25zdCBhbmdsZSA9IE1hdGguYXRhbjIoeSwgeCk7XG4gICAgaWYgKGFuZ2xlID4gLU1hdGguUEkgLyA0ICYmIGFuZ2xlIDw9IE1hdGguUEkgLyA0KSB7XG4gICAgICAgIHJldHVybiBEaXJlY3Rpb24ucmlnaHQ7XG4gICAgfSBlbHNlIGlmIChhbmdsZSA+IE1hdGguUEkgLyA0ICYmIGFuZ2xlIDw9ICgzICogTWF0aC5QSSkgLyA0KSB7XG4gICAgICAgIHJldHVybiBEaXJlY3Rpb24uYm90dG9tO1xuICAgIH0gZWxzZSBpZiAoYW5nbGUgPiAoLTMgKiBNYXRoLlBJKSAvIDQgJiYgYW5nbGUgPD0gLU1hdGguUEkgLyA0KSB7XG4gICAgICAgIHJldHVybiBEaXJlY3Rpb24udG9wO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBEaXJlY3Rpb24ubGVmdDtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXJlY3Rpb25CZXR3ZWVuUG9pbnRBbmRQb2ludChzb3VyY2U6IFBvaW50LCB0YXJnZXQ6IFBvaW50KSB7XG4gICAgaWYgKHNvdXJjZVswXSA9PT0gdGFyZ2V0WzBdKSB7XG4gICAgICAgIGlmIChzb3VyY2VbMV0gPj0gdGFyZ2V0WzFdKSB7XG4gICAgICAgICAgICByZXR1cm4gRGlyZWN0aW9uLnRvcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBEaXJlY3Rpb24uYm90dG9tO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzb3VyY2VbMV0gPT09IHRhcmdldFsxXSkge1xuICAgICAgICBpZiAoc291cmNlWzBdID49IHRhcmdldFswXSkge1xuICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbi5sZWZ0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIERpcmVjdGlvbi5yaWdodDtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgbWF0Y2ggZGlyZWN0aW9uJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaXJlY3Rpb25GYWN0b3IoZGlyZWN0aW9uOiBEaXJlY3Rpb24pIHtcbiAgICByZXR1cm4gaGFuZGxlRGlyZWN0aW9uRmFjdG9yc1tkaXJlY3Rpb25dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGlyZWN0aW9uRmFjdG9yQnlEaXJlY3Rpb25Db21wb25lbnQoZGlyZWN0aW9uQ29tcG9uZW50OiBudW1iZXIpOiBEaXJlY3Rpb25GYWN0b3Ige1xuICAgIGNvbnN0IGRpcmVjdGlvbkZhY3RvciA9IGRpcmVjdGlvbkNvbXBvbmVudCA9PT0gMCA/IGRpcmVjdGlvbkNvbXBvbmVudCA6IGRpcmVjdGlvbkNvbXBvbmVudCAvIE1hdGguYWJzKGRpcmVjdGlvbkNvbXBvbmVudCk7XG4gICAgcmV0dXJuIGRpcmVjdGlvbkZhY3RvciBhcyBEaXJlY3Rpb25GYWN0b3I7XG59XG4iXX0=
@@ -1,3 +0,0 @@
1
- export * from './resize-handle';
2
- export * from './rotate-handle';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3V0aWxzL2RyYXdpbmcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9yZXNpemUtaGFuZGxlJztcbmV4cG9ydCAqIGZyb20gJy4vcm90YXRlLWhhbmRsZSc7XG4iXX0=
@@ -1,25 +0,0 @@
1
- import { RESIZE_HANDLE_CLASS_NAME, PlaitBoard, drawCircle } from '@plait/core';
2
- import { PRIMARY_COLOR, RESIZE_HANDLE_DIAMETER } from '../../constants/default';
3
- export const drawHandle = (board, centerPoint) => {
4
- const options = { stroke: '#99999995', strokeWidth: 2, fill: '#FFF', fillStyle: 'solid' };
5
- const handleG = drawCircle(PlaitBoard.getRoughSVG(board), centerPoint, RESIZE_HANDLE_DIAMETER, options);
6
- handleG.classList.add(RESIZE_HANDLE_CLASS_NAME);
7
- return handleG;
8
- };
9
- export function drawFillPrimaryHandle(board, point) {
10
- return drawCircle(PlaitBoard.getRoughSVG(board), point, RESIZE_HANDLE_DIAMETER, {
11
- stroke: '#FFFFFF',
12
- strokeWidth: 1,
13
- fill: `${PRIMARY_COLOR}`,
14
- fillStyle: 'solid'
15
- });
16
- }
17
- export function drawPrimaryHandle(board, point) {
18
- return drawCircle(PlaitBoard.getRoughSVG(board), point, RESIZE_HANDLE_DIAMETER, {
19
- stroke: `${PRIMARY_COLOR}`,
20
- strokeWidth: 2,
21
- fill: `#FFFFFF`,
22
- fillStyle: 'solid'
23
- });
24
- }
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLWhhbmRsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvdXRpbHMvZHJhd2luZy9yZXNpemUtaGFuZGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxVQUFVLEVBQVMsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXRGLE9BQU8sRUFBRSxhQUFhLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVoRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxLQUFpQixFQUFFLFdBQWtCLEVBQUUsRUFBRTtJQUNoRSxNQUFNLE9BQU8sR0FBWSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNuRyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxXQUFXLEVBQUUsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUNoRCxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBaUIsRUFBRSxLQUFZO0lBQ2pFLE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFO1FBQzVFLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFdBQVcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxFQUFFLEdBQUcsYUFBYSxFQUFFO1FBQ3hCLFNBQVMsRUFBRSxPQUFPO0tBQ3JCLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBaUIsRUFBRSxLQUFZO0lBQzdELE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFO1FBQzVFLE1BQU0sRUFBRSxHQUFHLGFBQWEsRUFBRTtRQUMxQixXQUFXLEVBQUUsQ0FBQztRQUNkLElBQUksRUFBRSxTQUFTO1FBQ2YsU0FBUyxFQUFFLE9BQU87S0FDckIsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJFU0laRV9IQU5ETEVfQ0xBU1NfTkFNRSwgUGxhaXRCb2FyZCwgUG9pbnQsIGRyYXdDaXJjbGUgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAncm91Z2hqcy9iaW4vY29yZSc7XG5pbXBvcnQgeyBQUklNQVJZX0NPTE9SLCBSRVNJWkVfSEFORExFX0RJQU1FVEVSIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2RlZmF1bHQnO1xuXG5leHBvcnQgY29uc3QgZHJhd0hhbmRsZSA9IChib2FyZDogUGxhaXRCb2FyZCwgY2VudGVyUG9pbnQ6IFBvaW50KSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uczogT3B0aW9ucyA9IHsgc3Ryb2tlOiAnIzk5OTk5OTk1Jywgc3Ryb2tlV2lkdGg6IDIsIGZpbGw6ICcjRkZGJywgZmlsbFN0eWxlOiAnc29saWQnIH07XG4gICAgY29uc3QgaGFuZGxlRyA9IGRyYXdDaXJjbGUoUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyhib2FyZCksIGNlbnRlclBvaW50LCBSRVNJWkVfSEFORExFX0RJQU1FVEVSLCBvcHRpb25zKTtcbiAgICBoYW5kbGVHLmNsYXNzTGlzdC5hZGQoUkVTSVpFX0hBTkRMRV9DTEFTU19OQU1FKTtcbiAgICByZXR1cm4gaGFuZGxlRztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3RmlsbFByaW1hcnlIYW5kbGUoYm9hcmQ6IFBsYWl0Qm9hcmQsIHBvaW50OiBQb2ludCkge1xuICAgIHJldHVybiBkcmF3Q2lyY2xlKFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcoYm9hcmQpLCBwb2ludCwgUkVTSVpFX0hBTkRMRV9ESUFNRVRFUiwge1xuICAgICAgICBzdHJva2U6ICcjRkZGRkZGJyxcbiAgICAgICAgc3Ryb2tlV2lkdGg6IDEsXG4gICAgICAgIGZpbGw6IGAke1BSSU1BUllfQ09MT1J9YCxcbiAgICAgICAgZmlsbFN0eWxlOiAnc29saWQnXG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3UHJpbWFyeUhhbmRsZShib2FyZDogUGxhaXRCb2FyZCwgcG9pbnQ6IFBvaW50KSB7XG4gICAgcmV0dXJuIGRyYXdDaXJjbGUoUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyhib2FyZCksIHBvaW50LCBSRVNJWkVfSEFORExFX0RJQU1FVEVSLCB7XG4gICAgICAgIHN0cm9rZTogYCR7UFJJTUFSWV9DT0xPUn1gLFxuICAgICAgICBzdHJva2VXaWR0aDogMixcbiAgICAgICAgZmlsbDogYCNGRkZGRkZgLFxuICAgICAgICBmaWxsU3R5bGU6ICdzb2xpZCdcbiAgICB9KTtcbn1cbiJdfQ==
@@ -1,22 +0,0 @@
1
- import { DEFAULT_COLOR, PlaitBoard, createG, setStrokeLinecap } from '@plait/core';
2
- import { ROTATE_HANDLE_DISTANCE_TO_ELEMENT, ROTATE_HANDLE_SIZE } from '../../constants';
3
- const rotateHandleRadius = 6;
4
- export const drawRotateHandle = (board, rectangle) => {
5
- const options = { stroke: DEFAULT_COLOR, strokeWidth: 1, fillStyle: 'solid' };
6
- const handleCenterPoint = [
7
- rectangle.x - ROTATE_HANDLE_DISTANCE_TO_ELEMENT - ROTATE_HANDLE_SIZE / 2,
8
- rectangle.y + rectangle.height + ROTATE_HANDLE_DISTANCE_TO_ELEMENT + ROTATE_HANDLE_SIZE / 2
9
- ];
10
- const rs = PlaitBoard.getRoughSVG(board);
11
- const handleG = createG();
12
- const line = rs.path(`M ${handleCenterPoint[0] + rotateHandleRadius} ${handleCenterPoint[1]} A ${rotateHandleRadius} ${rotateHandleRadius}, 0, 1, 0, ${handleCenterPoint[0]} ${handleCenterPoint[1] + rotateHandleRadius}`, options);
13
- const arrow = rs.polygon([
14
- [handleCenterPoint[0], handleCenterPoint[1] + rotateHandleRadius - 2],
15
- [handleCenterPoint[0], handleCenterPoint[1] + rotateHandleRadius + 2],
16
- [handleCenterPoint[0] + 4.5, handleCenterPoint[1] + rotateHandleRadius]
17
- ], { ...options, fill: DEFAULT_COLOR });
18
- setStrokeLinecap(arrow, 'round');
19
- handleG.append(line, arrow);
20
- return handleG;
21
- };
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRlLWhhbmRsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvdXRpbHMvZHJhd2luZy9yb3RhdGUtaGFuZGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFtQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEcsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFeEYsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFFN0IsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLFNBQTBCLEVBQUUsRUFBRTtJQUM5RSxNQUFNLE9BQU8sR0FBWSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDdkYsTUFBTSxpQkFBaUIsR0FBRztRQUN0QixTQUFTLENBQUMsQ0FBQyxHQUFHLGlDQUFpQyxHQUFHLGtCQUFrQixHQUFHLENBQUM7UUFDeEUsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLGlDQUFpQyxHQUFHLGtCQUFrQixHQUFHLENBQUM7S0FDOUYsQ0FBQztJQUNGLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsTUFBTSxPQUFPLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDMUIsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FDaEIsS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxrQkFBa0IsSUFBSSxrQkFBa0IsY0FDaEgsaUJBQWlCLENBQUMsQ0FBQyxDQUN2QixJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixFQUFFLEVBQy9DLE9BQU8sQ0FDVixDQUFDO0lBQ0YsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FDcEI7UUFDSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUNyRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUNyRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztLQUMxRSxFQUNELEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUN0QyxDQUFDO0lBQ0YsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVCLE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERFRkFVTFRfQ09MT1IsIFBsYWl0Qm9hcmQsIFJlY3RhbmdsZUNsaWVudCwgY3JlYXRlRywgc2V0U3Ryb2tlTGluZWNhcCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICdyb3VnaGpzL2Jpbi9jb3JlJztcbmltcG9ydCB7IFJPVEFURV9IQU5ETEVfRElTVEFOQ0VfVE9fRUxFTUVOVCwgUk9UQVRFX0hBTkRMRV9TSVpFIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcblxuY29uc3Qgcm90YXRlSGFuZGxlUmFkaXVzID0gNjtcblxuZXhwb3J0IGNvbnN0IGRyYXdSb3RhdGVIYW5kbGUgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIHJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50KSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uczogT3B0aW9ucyA9IHsgc3Ryb2tlOiBERUZBVUxUX0NPTE9SLCBzdHJva2VXaWR0aDogMSwgZmlsbFN0eWxlOiAnc29saWQnIH07XG4gICAgY29uc3QgaGFuZGxlQ2VudGVyUG9pbnQgPSBbXG4gICAgICAgIHJlY3RhbmdsZS54IC0gUk9UQVRFX0hBTkRMRV9ESVNUQU5DRV9UT19FTEVNRU5UIC0gUk9UQVRFX0hBTkRMRV9TSVpFIC8gMixcbiAgICAgICAgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0ICsgUk9UQVRFX0hBTkRMRV9ESVNUQU5DRV9UT19FTEVNRU5UICsgUk9UQVRFX0hBTkRMRV9TSVpFIC8gMlxuICAgIF07XG4gICAgY29uc3QgcnMgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKGJvYXJkKTtcbiAgICBjb25zdCBoYW5kbGVHID0gY3JlYXRlRygpO1xuICAgIGNvbnN0IGxpbmUgPSBycy5wYXRoKFxuICAgICAgICBgTSAke2hhbmRsZUNlbnRlclBvaW50WzBdICsgcm90YXRlSGFuZGxlUmFkaXVzfSAke2hhbmRsZUNlbnRlclBvaW50WzFdfSBBICR7cm90YXRlSGFuZGxlUmFkaXVzfSAke3JvdGF0ZUhhbmRsZVJhZGl1c30sIDAsIDEsIDAsICR7XG4gICAgICAgICAgICBoYW5kbGVDZW50ZXJQb2ludFswXVxuICAgICAgICB9ICR7aGFuZGxlQ2VudGVyUG9pbnRbMV0gKyByb3RhdGVIYW5kbGVSYWRpdXN9YCxcbiAgICAgICAgb3B0aW9uc1xuICAgICk7XG4gICAgY29uc3QgYXJyb3cgPSBycy5wb2x5Z29uKFxuICAgICAgICBbXG4gICAgICAgICAgICBbaGFuZGxlQ2VudGVyUG9pbnRbMF0sIGhhbmRsZUNlbnRlclBvaW50WzFdICsgcm90YXRlSGFuZGxlUmFkaXVzIC0gMl0sXG4gICAgICAgICAgICBbaGFuZGxlQ2VudGVyUG9pbnRbMF0sIGhhbmRsZUNlbnRlclBvaW50WzFdICsgcm90YXRlSGFuZGxlUmFkaXVzICsgMl0sXG4gICAgICAgICAgICBbaGFuZGxlQ2VudGVyUG9pbnRbMF0gKyA0LjUsIGhhbmRsZUNlbnRlclBvaW50WzFdICsgcm90YXRlSGFuZGxlUmFkaXVzXVxuICAgICAgICBdLFxuICAgICAgICB7IC4uLm9wdGlvbnMsIGZpbGw6IERFRkFVTFRfQ09MT1IgfVxuICAgICk7XG4gICAgc2V0U3Ryb2tlTGluZWNhcChhcnJvdywgJ3JvdW5kJyk7XG4gICAgaGFuZGxlRy5hcHBlbmQobGluZSwgYXJyb3cpO1xuICAgIHJldHVybiBoYW5kbGVHO1xufTtcbiJdfQ==
@@ -1,256 +0,0 @@
1
- import { Direction, Point, RectangleClient, createDebugGenerator } from '@plait/core';
2
- import { removeDuplicatePoints, simplifyOrthogonalPoints } from '../utils';
3
- import { DEFAULT_ROUTE_MARGIN } from '../constants';
4
- import { AStar, PointGraph } from '../algorithms';
5
- const debugGenerator = createDebugGenerator('debug:plait:elbow-line-routing');
6
- export const generateElbowLineRoute = (options, board) => {
7
- const { nextSourcePoint, nextTargetPoint } = options;
8
- const points = getGraphPoints(options);
9
- const graph = createGraph(points);
10
- const aStar = new AStar(graph);
11
- aStar.search(nextSourcePoint, nextTargetPoint, options.sourcePoint);
12
- let route = aStar.getRoute(nextSourcePoint, nextTargetPoint);
13
- route = [options.sourcePoint, ...route, nextTargetPoint, options.targetPoint];
14
- // Centerline correction: Correct the shortest path route based on the horizontal centerline/vertical centerline
15
- // 1. Find the horizontal center line (centerX)/vertical center line (centerY)
16
- // 2. Find the point that intersects centerX/centerY in route, and find the line segment parallel to centerX/centerY in route
17
- // 3. Construct a rectangle based on the intersection points and parallel lines found in the previous step.
18
- // 4. Determine whether the rectangle intersects with the element. If it does not intersect, the center line can be mapped based on the rectangle constructed in the previous step.
19
- // 5. Determine whether the path after mapping the center line meets the constraints (inflection point cannot be increased)
20
- const isHitX = RectangleClient.isHitX(options.sourceOuterRectangle, options.targetOuterRectangle);
21
- const isHitY = RectangleClient.isHitY(options.sourceOuterRectangle, options.targetOuterRectangle);
22
- const centerX = isHitX ? undefined : RectangleClient.getGapCenter(options.sourceOuterRectangle, options.targetOuterRectangle, true);
23
- const centerY = isHitY ? undefined : RectangleClient.getGapCenter(options.sourceOuterRectangle, options.targetOuterRectangle, false);
24
- route = routeAdjust(route, { centerX, centerY, sourceRectangle: options.sourceRectangle, targetRectangle: options.targetRectangle }, board);
25
- return route;
26
- };
27
- export const routeAdjust = (path, options, board) => {
28
- const { sourceRectangle, targetRectangle, centerX, centerY } = options;
29
- if (board) {
30
- debugGenerator.clear();
31
- }
32
- if (centerX !== undefined) {
33
- const optionsX = getAdjustOptions(path, centerX, true);
34
- const resultX = optionsX.pointOfHit &&
35
- adjust(path, { parallelPaths: optionsX.parallelPaths, pointOfHit: optionsX.pointOfHit, sourceRectangle, targetRectangle }, board);
36
- if (resultX) {
37
- path = resultX;
38
- }
39
- }
40
- if (centerY !== undefined) {
41
- const optionsY = getAdjustOptions(path, centerY, false);
42
- const resultY = optionsY.pointOfHit &&
43
- adjust(path, { parallelPaths: optionsY.parallelPaths, pointOfHit: optionsY.pointOfHit, sourceRectangle, targetRectangle }, board);
44
- if (resultY) {
45
- path = resultY;
46
- }
47
- }
48
- return path;
49
- };
50
- const adjust = (route, options, board) => {
51
- const { parallelPaths, pointOfHit, sourceRectangle, targetRectangle } = options;
52
- let result = null;
53
- parallelPaths.forEach(parallelPath => {
54
- // Construct a rectangle
55
- const tempRectPoints = [pointOfHit, parallelPath[0], parallelPath[1]];
56
- // directly use getCornerPoints will bring the precision issue (eg: 263.6923375175286 - 57.130859375)
57
- const tempRect = RectangleClient.getRectangleByPoints(tempRectPoints);
58
- if (!RectangleClient.isHit(tempRect, sourceRectangle) && !RectangleClient.isHit(tempRect, targetRectangle)) {
59
- const tempCorners = RectangleClient.getCornerPointsByPoints(tempRectPoints);
60
- if (board) {
61
- debugGenerator.drawRectangle(board, tempRect);
62
- }
63
- const indexRangeInPath = [];
64
- const indexRangeInCorner = [];
65
- route.forEach((point, index) => {
66
- const cornerResult = tempCorners.findIndex(corner => Point.isEquals(point, corner));
67
- if (cornerResult !== -1) {
68
- indexRangeInPath.push(index);
69
- indexRangeInCorner.push(cornerResult);
70
- }
71
- });
72
- const newPath = [...route];
73
- const missCorner = tempCorners.find((c, index) => !indexRangeInCorner.includes(index));
74
- const removeLength = Math.abs(indexRangeInPath[0] - indexRangeInPath[indexRangeInPath.length - 1]) + 1;
75
- newPath.splice(indexRangeInPath[0] + 1, removeLength - 2, missCorner);
76
- const turnCount = simplifyOrthogonalPoints([...route]).length - 1;
77
- const simplifyPoints = simplifyOrthogonalPoints([...newPath]);
78
- // if (board) {
79
- // debugGenerator.drawLine(board, simplifyPoints);
80
- // }
81
- const newTurnCount = simplifyPoints.length - 1;
82
- if (newTurnCount <= turnCount) {
83
- result = newPath;
84
- }
85
- }
86
- return null;
87
- });
88
- return result;
89
- };
90
- const getAdjustOptions = (path, centerOfAxis, isHorizontal) => {
91
- const parallelPaths = [];
92
- let start = null;
93
- let pointOfHit = null;
94
- const axis = isHorizontal ? 0 : 1;
95
- for (let index = 0; index < path.length; index++) {
96
- const previous = path[index - 1];
97
- const current = path[index];
98
- if (start === null && previous && previous[axis] === current[axis]) {
99
- start = previous;
100
- }
101
- if (start !== null) {
102
- if (previous[axis] !== current[axis]) {
103
- parallelPaths.push([start, previous]);
104
- start = null;
105
- }
106
- }
107
- if (current[axis] === centerOfAxis) {
108
- pointOfHit = current;
109
- }
110
- }
111
- if (start) {
112
- parallelPaths.push([start, path[path.length - 1]]);
113
- }
114
- return { pointOfHit, parallelPaths };
115
- };
116
- export const getGraphPoints = (options) => {
117
- const { nextSourcePoint, nextTargetPoint, sourceOuterRectangle, targetOuterRectangle } = options;
118
- const x = [];
119
- const y = [];
120
- let result = [];
121
- [sourceOuterRectangle, targetOuterRectangle].forEach(rectangle => {
122
- x.push(rectangle.x, rectangle.x + rectangle.width / 2, rectangle.x + rectangle.width);
123
- y.push(rectangle.y, rectangle.y + rectangle.height / 2, rectangle.y + rectangle.height);
124
- });
125
- const rectanglesX = [
126
- sourceOuterRectangle.x,
127
- sourceOuterRectangle.x + sourceOuterRectangle.width,
128
- targetOuterRectangle.x,
129
- targetOuterRectangle.x + targetOuterRectangle.width
130
- ].sort((a, b) => a - b);
131
- x.push((rectanglesX[1] + rectanglesX[2]) / 2, nextSourcePoint[0], nextTargetPoint[0]);
132
- const rectanglesY = [
133
- sourceOuterRectangle.y,
134
- sourceOuterRectangle.y + sourceOuterRectangle.height,
135
- targetOuterRectangle.y,
136
- targetOuterRectangle.y + targetOuterRectangle.height
137
- ].sort((a, b) => a - b);
138
- y.push((rectanglesY[1] + rectanglesY[2]) / 2, nextSourcePoint[1], nextTargetPoint[1]);
139
- for (let i = 0; i < x.length; i++) {
140
- for (let j = 0; j < y.length; j++) {
141
- const point = [x[i], y[j]];
142
- const isInSource = RectangleClient.isPointInRectangle(sourceOuterRectangle, point);
143
- const isInTarget = RectangleClient.isPointInRectangle(targetOuterRectangle, point);
144
- if (!isInSource && !isInTarget) {
145
- result.push(point);
146
- }
147
- }
148
- }
149
- result = removeDuplicatePoints(result).filter(point => {
150
- const isInSource = RectangleClient.isPointInRectangle(sourceOuterRectangle, point);
151
- const isInTarget = RectangleClient.isPointInRectangle(targetOuterRectangle, point);
152
- return !isInSource && !isInTarget;
153
- });
154
- return result;
155
- };
156
- export const createGraph = (points) => {
157
- const graph = new PointGraph();
158
- const Xs = [];
159
- const Ys = [];
160
- points.forEach(p => {
161
- const x = p[0], y = p[1];
162
- if (Xs.indexOf(x) < 0)
163
- Xs.push(x);
164
- if (Ys.indexOf(y) < 0)
165
- Ys.push(y);
166
- graph.add(p);
167
- });
168
- Xs.sort((a, b) => a - b);
169
- Ys.sort((a, b) => a - b);
170
- const inHotIndex = (p) => graph.has(p);
171
- for (let i = 0; i < Xs.length; i++) {
172
- for (let j = 0; j < Ys.length; j++) {
173
- const point = [Xs[i], Ys[j]];
174
- if (!inHotIndex(point))
175
- continue;
176
- if (i > 0) {
177
- const otherPoint = [Xs[i - 1], Ys[j]];
178
- if (inHotIndex(otherPoint)) {
179
- graph.connect(otherPoint, point);
180
- graph.connect(point, otherPoint);
181
- }
182
- }
183
- if (j > 0) {
184
- const otherPoint = [Xs[i], Ys[j - 1]];
185
- if (inHotIndex(otherPoint)) {
186
- graph.connect(otherPoint, point);
187
- graph.connect(point, otherPoint);
188
- }
189
- }
190
- }
191
- }
192
- return graph;
193
- };
194
- export const reduceRouteMargin = (sourceRectangle, targetRectangle) => {
195
- const defaultOffset = DEFAULT_ROUTE_MARGIN;
196
- let sourceOffset = new Array(4).fill(defaultOffset);
197
- let targetOffset = new Array(4).fill(defaultOffset);
198
- const leftToRight = sourceRectangle.x - (targetRectangle.x + targetRectangle.width);
199
- const rightToLeft = targetRectangle.x - (sourceRectangle.x + sourceRectangle.width);
200
- if (leftToRight > 0 && leftToRight < defaultOffset * 2) {
201
- const offset = leftToRight / 2;
202
- sourceOffset[3] = offset;
203
- targetOffset[1] = offset;
204
- }
205
- if (rightToLeft > 0 && rightToLeft < defaultOffset * 2) {
206
- const offset = rightToLeft / 2;
207
- targetOffset[3] = offset;
208
- sourceOffset[1] = offset;
209
- }
210
- const topToBottom = sourceRectangle.y - (targetRectangle.y + targetRectangle.height);
211
- const bottomToTop = targetRectangle.y - (sourceRectangle.y + sourceRectangle.height);
212
- if (topToBottom > 0 && topToBottom < defaultOffset * 2) {
213
- const offset = topToBottom / 2;
214
- sourceOffset[0] = offset;
215
- targetOffset[2] = offset;
216
- }
217
- if (bottomToTop > 0 && bottomToTop < defaultOffset * 2) {
218
- const offset = bottomToTop / 2;
219
- sourceOffset[2] = offset;
220
- targetOffset[0] = offset;
221
- }
222
- return { sourceOffset, targetOffset };
223
- };
224
- export const getNextPoint = (point, outerRectangle, direction) => {
225
- switch (direction) {
226
- case Direction.top: {
227
- return [point[0], outerRectangle.y];
228
- }
229
- case Direction.bottom: {
230
- return [point[0], outerRectangle.y + outerRectangle.height];
231
- }
232
- case Direction.right: {
233
- return [outerRectangle.x + outerRectangle.width, point[1]];
234
- }
235
- default: {
236
- return [outerRectangle.x, point[1]];
237
- }
238
- }
239
- };
240
- export const getSourceAndTargetOuterRectangle = (sourceRectangle, targetRectangle) => {
241
- const { sourceOffset, targetOffset } = reduceRouteMargin(sourceRectangle, targetRectangle);
242
- const sourceOuterRectangle = RectangleClient.expand(sourceRectangle, sourceOffset[3], sourceOffset[0], sourceOffset[1], sourceOffset[2]);
243
- const targetOuterRectangle = RectangleClient.expand(targetRectangle, targetOffset[3], targetOffset[0], targetOffset[1], targetOffset[2]);
244
- return {
245
- sourceOuterRectangle,
246
- targetOuterRectangle
247
- };
248
- };
249
- export const isSourceAndTargetIntersect = (options) => {
250
- const { sourcePoint, nextSourcePoint, sourceRectangle, sourceOuterRectangle, targetPoint, nextTargetPoint, targetRectangle, targetOuterRectangle } = options;
251
- return (RectangleClient.isPointInRectangle(targetRectangle, sourcePoint) ||
252
- RectangleClient.isPointInRectangle(targetOuterRectangle, nextSourcePoint) ||
253
- RectangleClient.isPointInRectangle(sourceOuterRectangle, nextTargetPoint) ||
254
- RectangleClient.isPointInRectangle(sourceRectangle, targetPoint));
255
- };
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxib3ctbGluZS1yb3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvdXRpbHMvZWxib3ctbGluZS1yb3V0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBRSxlQUFlLEVBQUUsb0JBQW9CLEVBQWtCLE1BQU0sYUFBYSxDQUFDO0FBQ2xILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEQsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbEQsTUFBTSxjQUFjLEdBQUcsb0JBQW9CLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztBQTJCOUUsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxPQUE4QixFQUFFLEtBQWtCLEVBQUUsRUFBRTtJQUN6RixNQUFNLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUNyRCxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkMsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLEtBQUssQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEUsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDN0QsS0FBSyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxHQUFHLEtBQUssRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLFdB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LENBQ2xCLENBQUM7SUFDRixNQUFNLG9CQUFvQixHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQy9DLGVBQWUsRUFDZixZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQ2YsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUNmLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixZQUFZLENBQUMsQ0FBQyxDQUFDLENBQ2xCLENBQUM7SUFDRixPQUFPO1FBQ0gsb0JBQW9CO1FBQ3BCLG9CQUFvQjtLQUN2QixDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxPQUE4QixFQUFFLEVBQUU7SUFDekUsTUFBTSxFQUNGLFdBQVcsRUFDWCxlQUFlLEVBQ2YsZUFBZSxFQUNmLG9CQUFvQixFQUNwQixXQUFXLEVBQ1gsZUFBZSxFQUNmLGVBQWUsRUFDZixvQkFBb0IsRUFDdkIsR0FBRyxPQUFPLENBQUM7SUFFWixPQUFPLENBQ0gsZUFBZSxDQUFDLGtCQUFrQixDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUM7UUFDaEUsZUFBZSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixFQUFFLGVBQWUsQ0FBQztRQUN6RSxlQUFlLENBQUMsa0JBQWtCLENBQUMsb0JBQW9CLEVBQUUsZUFBZSxDQUFDO1FBQ3pFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLENBQ25FLENBQUM7QUFDTixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3Rpb24sIFBsYWl0Qm9hcmQsIFBvaW50LCBSZWN0YW5nbGVDbGllbnQsIGNyZWF0ZURlYnVnR2VuZXJhdG9yLCBEZWJ1Z0dlbmVyYXRvciB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IHJlbW92ZUR1cGxpY2F0ZVBvaW50cywgc2ltcGxpZnlPcnRob2dvbmFsUG9pbnRzIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgREVGQVVMVF9ST1VURV9NQVJHSU4gfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQVN0YXIsIFBvaW50R3JhcGggfSBmcm9tICcuLi9hbGdvcml0aG1zJztcblxuY29uc3QgZGVidWdHZW5lcmF0b3IgPSBjcmVhdGVEZWJ1Z0dlbmVyYXRvcignZGVidWc6cGxhaXQ6ZWxib3ctbGluZS1yb3V0aW5nJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxib3dMaW5lUm91dGVPcHRpb25zIHtcbiAgICBzb3VyY2VQb2ludDogUG9pbnQ7XG4gICAgbmV4dFNvdXJjZVBvaW50OiBQb2ludDtcbiAgICBzb3VyY2VSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudDtcbiAgICBzb3VyY2VPdXRlclJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50O1xuICAgIHRhcmdldFBvaW50OiBQb2ludDtcbiAgICBuZXh0VGFyZ2V0UG9pbnQ6IFBvaW50O1xuICAgIHRhcmdldE91dGVyUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQ7XG4gICAgdGFyZ2V0UmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVBZGp1c3RPcHRpb25zIHtcbiAgICBjZW50ZXJYPzogbnVtYmVyO1xuICAgIGNlbnRlclk/OiBudW1iZXI7XG4gICAgc291cmNlUmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQ7XG4gICAgdGFyZ2V0UmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRqdXN0T3B0aW9ucyB7XG4gICAgcGFyYWxsZWxQYXRoczogW1BvaW50LCBQb2ludF1bXTtcbiAgICBwb2ludE9mSGl0OiBQb2ludDtcbiAgICBzb3VyY2VSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudDtcbiAgICB0YXJnZXRSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudDtcbn1cblxuZXhwb3J0IGNvbnN0IGdlbmVyYXRlRWxib3dMaW5lUm91dGUgPSAob3B0aW9uczogRWxib3dMaW5lUm91dGVPcHRpb25zLCBib2FyZD86IFBsYWl0Qm9hcmQpID0+IHtcbiAgICBjb25zdCB7IG5leHRTb3VyY2VQb2ludCwgbmV4dFRhcmdldFBvaW50IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHBvaW50cyA9IGdldEdyYXBoUG9pbnRzKG9wdGlvbnMpO1xuICAgIGNvbnN0IGdyYXBoID0gY3JlYXRlR3JhcGgocG9pbnRzKTtcbiAgICBjb25zdCBhU3RhciA9IG5ldyBBU3RhcihncmFwaCk7XG4gICAgYVN0YXIuc2VhcmNoKG5leHRTb3VyY2VQb2ludCwgbmV4dFRhcmdldFBvaW50LCBvcHRpb25zLnNvdXJjZVBvaW50KTtcbiAgICBsZXQgcm91dGUgPSBhU3Rhci5nZXRSb3V0ZShuZXh0U291cmNlUG9pbnQsIG5leHRUYXJnZXRQb2ludCk7XG4gICAgcm91dGUgPSBbb3B0aW9ucy5zb3VyY2VQb2ludCwgLi4ucm91dGUsIG5leHRUYXJnZXRQb2ludCwgb3B0aW9ucy50YXJnZXRQb2ludF07XG4gICAgLy8gQ2VudGVybGluZSBjb3JyZWN0aW9uOiBDb3JyZWN0IHRoZSBzaG9ydGVzdCBwYXRoIHJvdXRlIGJhc2VkIG9uIHRoZSBob3Jpem9udGFsIGNlbnRlcmxpbmUvdmVydGljYWwgY2VudGVybGluZVxuICAgIC8vIDEuIEZpbmQgdGhlIGhvcml6b250YWwgY2VudGVyIGxpbmUgKGNlbnRlclgpL3ZlcnRpY2FsIGNlbnRlciBsaW5lIChjZW50ZXJZKVxuICAgIC8vIDIuIEZpbmQgdGhlIHBvaW50IHRoYXQgaW50ZXJzZWN0cyBjZW50ZXJYL2NlbnRlclkgaW4gcm91dGUsIGFuZCBmaW5kIHRoZSBsaW5lIHNlZ21lbnQgcGFyYWxsZWwgdG8gY2VudGVyWC9jZW50ZXJZIGluIHJvdXRlXG4gICAgLy8gMy4gQ29uc3RydWN0IGEgcmVjdGFuZ2xlIGJhc2VkIG9uIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRzIGFuZCBwYXJhbGxlbCBsaW5lcyBmb3VuZCBpbiB0aGUgcHJldmlvdXMgc3RlcC5cbiAgICAvLyA0LiBEZXRlcm1pbmUgd2hldGhlciB0aGUgcmVjdGFuZ2xlIGludGVyc2VjdHMgd2l0aCB0aGUgZWxlbWVudC4gSWYgaXQgZG9lcyBub3QgaW50ZXJzZWN0LCB0aGUgY2VudGVyIGxpbmUgY2FuIGJlIG1hcHBlZCBiYXNlZCBvbiB0aGUgcmVjdGFuZ2xlIGNvbnN0cnVjdGVkIGluIHRoZSBwcmV2aW91cyBzdGVwLlxuICAgIC8vIDUuIERldGVybWluZSB3aGV0aGVyIHRoZSBwYXRoIGFmdGVyIG1hcHBpbmcgdGhlIGNlbnRlciBsaW5lIG1lZXRzIHRoZSBjb25zdHJhaW50cyAoaW5mbGVjdGlvbiBwb2ludCBjYW5ub3QgYmUgaW5jcmVhc2VkKVxuICAgIGNvbnN0IGlzSGl0WCA9IFJlY3RhbmdsZUNsaWVudC5pc0hpdFgob3B0aW9ucy5zb3VyY2VPdXRlclJlY3RhbmdsZSwgb3B0aW9ucy50YXJnZXRPdXRlclJlY3RhbmdsZSk7XG4gICAgY29uc3QgaXNIaXRZID0gUmVjdGFuZ2xlQ2xpZW50LmlzSGl0WShvcHRpb25zLnNvdXJjZU91dGVyUmVjdGFuZ2xlLCBvcHRpb25zLnRhcmdldE91dGVyUmVjdGFuZ2xlKTtcbiAgICBjb25zdCBjZW50ZXJYID0gaXNIaXRYID8gdW5kZWZpbmVkIDogUmVjdGFuZ2xlQ2xpZW50LmdldEdhcENlbnRlcihvcHRpb25zLnNvdXJjZU91dGVyUmVjdGFuZ2xlLCBvcHRpb25zLnRhcmdldE91dGVyUmVjdGFuZ2xlLCB0cnVlKTtcbiAgICBjb25zdCBjZW50ZXJZID0gaXNIaXRZID8gdW5kZWZpbmVkIDogUmVjdGFuZ2xlQ2xpZW50LmdldEdhcENlbnRlcihvcHRpb25zLnNvdXJjZU91dGVyUmVjdGFuZ2xlLCBvcHRpb25zLnRhcmdldE91dGVyUmVjdGFuZ2xlLCBmYWxzZSk7XG4gICAgcm91dGUgPSByb3V0ZUFkanVzdChyb3V0ZSwgeyBjZW50ZXJYLCBjZW50ZXJZLCBzb3VyY2VSZWN0YW5nbGU6IG9wdGlvbnMuc291cmNlUmVjdGFuZ2xlLCB0YXJnZXRSZWN0YW5nbGU6IG9wdGlvbnMudGFyZ2V0UmVjdGFuZ2xlIH0sIGJvYXJkKTtcbiAgICByZXR1cm4gcm91dGU7XG59O1xuXG5leHBvcnQgY29uc3Qgcm91dGVBZGp1c3QgPSAocGF0aDogUG9pbnRbXSwgb3B0aW9uczogUm91dGVBZGp1c3RPcHRpb25zLCBib2FyZD86IFBsYWl0Qm9hcmQpID0+IHtcbiAgICBjb25zdCB7IHNvdXJjZVJlY3RhbmdsZSwgdGFyZ2V0UmVjdGFuZ2xlLCBjZW50ZXJYLCBjZW50ZXJZIH0gPSBvcHRpb25zO1xuICAgIGlmIChib2FyZCkge1xuICAgICAgICBkZWJ1Z0dlbmVyYXRvci5jbGVhcigpO1xuICAgIH1cbiAgICBpZiAoY2VudGVyWCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNYID0gZ2V0QWRqdXN0T3B0aW9ucyhwYXRoLCBjZW50ZXJYLCB0cnVlKTtcbiAgICAgICAgY29uc3QgcmVzdWx0WCA9XG4gICAgICAgICAgICBvcHRpb25zWC5wb2ludE9mSGl0ICYmXG4gICAgICAgICAgICBhZGp1c3QocGF0aCwgeyBwYXJhbGxlbFBhdGhzOiBvcHRpb25zWC5wYXJhbGxlbFBhdGhzLCBwb2ludE9mSGl0OiBvcHRpb25zWC5wb2ludE9mSGl0LCBzb3VyY2VSZWN0YW5nbGUsIHRhcmdldFJlY3RhbmdsZSB9LCBib2FyZCk7XG4gICAgICAgIGlmIChyZXN1bHRYKSB7XG4gICAgICAgICAgICBwYXRoID0gcmVzdWx0WDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoY2VudGVyWSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnNZID0gZ2V0QWRqdXN0T3B0aW9ucyhwYXRoLCBjZW50ZXJZLCBmYWxzZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdFkgPVxuICAgICAgICAgICAgb3B0aW9uc1kucG9pbnRPZkhpdCAmJlxuICAgICAgICAgICAgYWRqdXN0KHBhdGgsIHsgcGFyYWxsZWxQYXRoczogb3B0aW9uc1kucGFyYWxsZWxQYXRocywgcG9pbnRPZkhpdDogb3B0aW9uc1kucG9pbnRPZkhpdCwgc291cmNlUmVjdGFuZ2xlLCB0YXJnZXRSZWN0YW5nbGUgfSwgIGJvYXJkKTtcbiAgICAgICAgaWYgKHJlc3VsdFkpIHtcbiAgICAgICAgICAgIHBhdGggPSByZXN1bHRZO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xufTtcblxuY29uc3QgYWRqdXN0ID0gKHJvdXRlOiBQb2ludFtdLCBvcHRpb25zOiBBZGp1c3RPcHRpb25zLCBib2FyZD86IFBsYWl0Qm9hcmQpOiBudWxsIHwgUG9pbnRbXSA9PiB7XG4gICAgY29uc3QgeyBwYXJhbGxlbFBhdGhzLCBwb2ludE9mSGl0LCBzb3VyY2VSZWN0YW5nbGUsIHRhcmdldFJlY3RhbmdsZSB9ID0gb3B0aW9ucztcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICBwYXJhbGxlbFBhdGhzLmZvckVhY2gocGFyYWxsZWxQYXRoID0+IHtcbiAgICAgICAgLy8gQ29uc3RydWN0IGEgcmVjdGFuZ2xlXG4gICAgICAgIGNvbnN0IHRlbXBSZWN0UG9pbnRzID0gW3BvaW50T2ZIaXQsIHBhcmFsbGVsUGF0aFswXSwgcGFyYWxsZWxQYXRoWzFdXTtcbiAgICAgICAgLy8gZGlyZWN0bHkgdXNlIGdldENvcm5lclBvaW50cyB3aWxsIGJyaW5nIHRoZSBwcmVjaXNpb24gaXNzdWUgKGVnOiAyNjMuNjkyMzM3NTE3NTI4NiAtIDU3LjEzMDg1OTM3NSlcbiAgICAgICAgY29uc3QgdGVtcFJlY3QgPSBSZWN0YW5nbGVDbGllbnQuZ2V0UmVjdGFuZ2xlQnlQb2ludHModGVtcFJlY3RQb2ludHMpO1xuICAgICAgICBpZiAoIVJlY3RhbmdsZUNsaWVudC5pc0hpdCh0ZW1wUmVjdCwgc291cmNlUmVjdGFuZ2xlKSAmJiAhUmVjdGFuZ2xlQ2xpZW50LmlzSGl0KHRlbXBSZWN0LCB0YXJnZXRSZWN0YW5nbGUpKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wQ29ybmVycyA9IFJlY3RhbmdsZUNsaWVudC5nZXRDb3JuZXJQb2ludHNCeVBvaW50cyh0ZW1wUmVjdFBvaW50cyk7XG4gICAgICAgICAgICBpZiAoYm9hcmQpIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z0dlbmVyYXRvci5kcmF3UmVjdGFuZ2xlKGJvYXJkLCB0ZW1wUmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpbmRleFJhbmdlSW5QYXRoOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgaW5kZXhSYW5nZUluQ29ybmVyOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgICAgcm91dGUuZm9yRWFjaCgocG9pbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29ybmVyUmVzdWx0ID0gdGVtcENvcm5lcnMuZmluZEluZGV4KGNvcm5lciA9PiBQb2ludC5pc0VxdWFscyhwb2ludCwgY29ybmVyKSk7XG4gICAgICAgICAgICAgICAgaWYgKGNvcm5lclJlc3VsdCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhSYW5nZUluUGF0aC5wdXNoKGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhSYW5nZUluQ29ybmVyLnB1c2goY29ybmVyUmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BhdGggPSBbLi4ucm91dGVdO1xuICAgICAgICAgICAgY29uc3QgbWlzc0Nvcm5lciA9IHRlbXBDb3JuZXJzLmZpbmQoKGMsIGluZGV4KSA9PiAhaW5kZXhSYW5nZUluQ29ybmVyLmluY2x1ZGVzKGluZGV4KSkgYXMgUG9pbnQ7XG4gICAgICAgICAgICBjb25zdCByZW1vdmVMZW5ndGggPSBNYXRoLmFicyhpbmRleFJhbmdlSW5QYXRoWzBdIC0gaW5kZXhSYW5nZUluUGF0aFtpbmRleFJhbmdlSW5QYXRoLmxlbmd0aCAtIDFdKSArIDE7XG4gICAgICAgICAgICBuZXdQYXRoLnNwbGljZShpbmRleFJhbmdlSW5QYXRoWzBdICsgMSwgcmVtb3ZlTGVuZ3RoIC0gMiwgbWlzc0Nvcm5lcik7XG4gICAgICAgICAgICBjb25zdCB0dXJuQ291bnQgPSBzaW1wbGlmeU9ydGhvZ29uYWxQb2ludHMoWy4uLnJvdXRlXSkubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGNvbnN0IHNpbXBsaWZ5UG9pbnRzID0gc2ltcGxpZnlPcnRob2dvbmFsUG9pbnRzKFsuLi5uZXdQYXRoXSk7XG4gICAgICAgICAgICAvLyBpZiAoYm9hcmQpIHtcbiAgICAgICAgICAgIC8vICAgICBkZWJ1Z0dlbmVyYXRvci5kcmF3TGluZShib2FyZCwgc2ltcGxpZnlQb2ludHMpO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgY29uc3QgbmV3VHVybkNvdW50ID0gc2ltcGxpZnlQb2ludHMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGlmIChuZXdUdXJuQ291bnQgPD0gdHVybkNvdW50KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3UGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgZ2V0QWRqdXN0T3B0aW9ucyA9IChwYXRoOiBQb2ludFtdLCBjZW50ZXJPZkF4aXM6IG51bWJlciwgaXNIb3Jpem9udGFsOiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgcGFyYWxsZWxQYXRoczogW1BvaW50LCBQb2ludF1bXSA9IFtdO1xuICAgIGxldCBzdGFydDogbnVsbCB8IFBvaW50ID0gbnVsbDtcbiAgICBsZXQgcG9pbnRPZkhpdDogbnVsbCB8IFBvaW50ID0gbnVsbDtcbiAgICBjb25zdCBheGlzID0gaXNIb3Jpem9udGFsID8gMCA6IDE7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcGF0aC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBwYXRoW2luZGV4IC0gMV07XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBwYXRoW2luZGV4XTtcbiAgICAgICAgaWYgKHN0YXJ0ID09PSBudWxsICYmIHByZXZpb3VzICYmIHByZXZpb3VzW2F4aXNdID09PSBjdXJyZW50W2F4aXNdKSB7XG4gICAgICAgICAgICBzdGFydCA9IHByZXZpb3VzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHByZXZpb3VzW2F4aXNdICE9PSBjdXJyZW50W2F4aXNdKSB7XG4gICAgICAgICAgICAgICAgcGFyYWxsZWxQYXRocy5wdXNoKFtzdGFydCwgcHJldmlvdXNdKTtcbiAgICAgICAgICAgICAgICBzdGFydCA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN1cnJlbnRbYXhpc10gPT09IGNlbnRlck9mQXhpcykge1xuICAgICAgICAgICAgcG9pbnRPZkhpdCA9IGN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICAgIHBhcmFsbGVsUGF0aHMucHVzaChbc3RhcnQsIHBhdGhbcGF0aC5sZW5ndGggLSAxXV0pO1xuICAgIH1cbiAgICByZXR1cm4geyBwb2ludE9mSGl0LCBwYXJhbGxlbFBhdGhzIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0R3JhcGhQb2ludHMgPSAob3B0aW9uczogRWxib3dMaW5lUm91dGVPcHRpb25zKSA9PiB7XG4gICAgY29uc3QgeyBuZXh0U291cmNlUG9pbnQsIG5leHRUYXJnZXRQb2ludCwgc291cmNlT3V0ZXJSZWN0YW5nbGUsIHRhcmdldE91dGVyUmVjdGFuZ2xlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHg6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgeTogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgcmVzdWx0OiBQb2ludFtdID0gW107XG5cbiAgICBbc291cmNlT3V0ZXJSZWN0YW5nbGUsIHRhcmdldE91dGVyUmVjdGFuZ2xlXS5mb3JFYWNoKHJlY3RhbmdsZSA9PiB7XG4gICAgICAgIHgucHVzaChyZWN0YW5nbGUueCwgcmVjdGFuZ2xlLnggKyByZWN0YW5nbGUud2lkdGggLyAyLCByZWN0YW5nbGUueCArIHJlY3RhbmdsZS53aWR0aCk7XG4gICAgICAgIHkucHVzaChyZWN0YW5nbGUueSwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0IC8gMiwgcmVjdGFuZ2xlLnkgKyByZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICB9KTtcbiAgICBjb25zdCByZWN0YW5nbGVzWCA9IFtcbiAgICAgICAgc291cmNlT3V0ZXJSZWN0YW5nbGUueCxcbiAgICAgICAgc291cmNlT3V0ZXJSZWN0YW5nbGUueCArIHNvdXJjZU91dGVyUmVjdGFuZ2xlLndpZHRoLFxuICAgICAgICB0YXJnZXRPdXRlclJlY3RhbmdsZS54LFxuICAgICAgICB0YXJnZXRPdXRlclJlY3RhbmdsZS54ICsgdGFyZ2V0T3V0ZXJSZWN0YW5nbGUud2lkdGhcbiAgICBdLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICB4LnB1c2goKHJlY3RhbmdsZXNYWzFdICsgcmVjdGFuZ2xlc1hbMl0pIC8gMiwgbmV4dFNvdXJjZVBvaW50WzBdLCBuZXh0VGFyZ2V0UG9pbnRbMF0pO1xuICAgIGNvbnN0IHJlY3RhbmdsZXNZID0gW1xuICAgICAgICBzb3VyY2VPdXRlclJlY3RhbmdsZS55LFxuICAgICAgICBzb3VyY2VPdXRlclJlY3RhbmdsZS55ICsgc291cmNlT3V0ZXJSZWN0YW5nbGUuaGVpZ2h0LFxuICAgICAgICB0YXJnZXRPdXRlclJlY3RhbmdsZS55LFxuICAgICAgICB0YXJnZXRPdXRlclJlY3RhbmdsZS55ICsgdGFyZ2V0T3V0ZXJSZWN0YW5nbGUuaGVpZ2h0XG4gICAgXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgeS5wdXNoKChyZWN0YW5nbGVzWVsxXSArIHJlY3RhbmdsZXNZWzJdKSAvIDIsIG5leHRTb3VyY2VQb2ludFsxXSwgbmV4dFRhcmdldFBvaW50WzFdKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludDogUG9pbnQgPSBbeFtpXSwgeVtqXV07XG4gICAgICAgICAgICBjb25zdCBpc0luU291cmNlID0gUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZShzb3VyY2VPdXRlclJlY3RhbmdsZSwgcG9pbnQpO1xuICAgICAgICAgICAgY29uc3QgaXNJblRhcmdldCA9IFJlY3RhbmdsZUNsaWVudC5pc1BvaW50SW5SZWN0YW5nbGUodGFyZ2V0T3V0ZXJSZWN0YW5nbGUsIHBvaW50KTtcbiAgICAgICAgICAgIGlmICghaXNJblNvdXJjZSAmJiAhaXNJblRhcmdldCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQgPSByZW1vdmVEdXBsaWNhdGVQb2ludHMocmVzdWx0KS5maWx0ZXIocG9pbnQgPT4ge1xuICAgICAgICBjb25zdCBpc0luU291cmNlID0gUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZShzb3VyY2VPdXRlclJlY3RhbmdsZSwgcG9pbnQpO1xuICAgICAgICBjb25zdCBpc0luVGFyZ2V0ID0gUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZSh0YXJnZXRPdXRlclJlY3RhbmdsZSwgcG9pbnQpO1xuICAgICAgICByZXR1cm4gIWlzSW5Tb3VyY2UgJiYgIWlzSW5UYXJnZXQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVHcmFwaCA9IChwb2ludHM6IFBvaW50W10pID0+IHtcbiAgICBjb25zdCBncmFwaCA9IG5ldyBQb2ludEdyYXBoKCk7XG4gICAgY29uc3QgWHM6IG51bWJlcltdID0gW107XG4gICAgY29uc3QgWXM6IG51bWJlcltdID0gW107XG4gICAgcG9pbnRzLmZvckVhY2gocCA9PiB7XG4gICAgICAgIGNvbnN0IHggPSBwWzBdLFxuICAgICAgICAgICAgeSA9IHBbMV07XG4gICAgICAgIGlmIChYcy5pbmRleE9mKHgpIDwgMCkgWHMucHVzaCh4KTtcbiAgICAgICAgaWYgKFlzLmluZGV4T2YoeSkgPCAwKSBZcy5wdXNoKHkpO1xuICAgICAgICBncmFwaC5hZGQocCk7XG4gICAgfSk7XG4gICAgWHMuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgIFlzLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICBjb25zdCBpbkhvdEluZGV4ID0gKHA6IFBvaW50KTogYm9vbGVhbiA9PiBncmFwaC5oYXMocCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBYcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IFlzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBwb2ludDogUG9pbnQgPSBbWHNbaV0sIFlzW2pdXTtcbiAgICAgICAgICAgIGlmICghaW5Ib3RJbmRleChwb2ludCkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJQb2ludDogUG9pbnQgPSBbWHNbaSAtIDFdLCBZc1tqXV07XG4gICAgICAgICAgICAgICAgaWYgKGluSG90SW5kZXgob3RoZXJQb2ludCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JhcGguY29ubmVjdChvdGhlclBvaW50LCBwb2ludCk7XG4gICAgICAgICAgICAgICAgICAgIGdyYXBoLmNvbm5lY3QocG9pbnQsIG90aGVyUG9pbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChqID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyUG9pbnQ6IFBvaW50ID0gW1hzW2ldLCBZc1tqIC0gMV1dO1xuICAgICAgICAgICAgICAgIGlmIChpbkhvdEluZGV4KG90aGVyUG9pbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyYXBoLmNvbm5lY3Qob3RoZXJQb2ludCwgcG9pbnQpO1xuICAgICAgICAgICAgICAgICAgICBncmFwaC5jb25uZWN0KHBvaW50LCBvdGhlclBvaW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdyYXBoO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZHVjZVJvdXRlTWFyZ2luID0gKHNvdXJjZVJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCB0YXJnZXRSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkgPT4ge1xuICAgIGNvbnN0IGRlZmF1bHRPZmZzZXQgPSBERUZBVUxUX1JPVVRFX01BUkdJTjtcbiAgICBsZXQgc291cmNlT2Zmc2V0OiBudW1iZXJbXSA9IG5ldyBBcnJheSg0KS5maWxsKGRlZmF1bHRPZmZzZXQpO1xuICAgIGxldCB0YXJnZXRPZmZzZXQ6IG51bWJlcltdID0gbmV3IEFycmF5KDQpLmZpbGwoZGVmYXVsdE9mZnNldCk7XG4gICAgY29uc3QgbGVmdFRvUmlnaHQgPSBzb3VyY2VSZWN0YW5nbGUueCAtICh0YXJnZXRSZWN0YW5nbGUueCArIHRhcmdldFJlY3RhbmdsZS53aWR0aCk7XG4gICAgY29uc3QgcmlnaHRUb0xlZnQgPSB0YXJnZXRSZWN0YW5nbGUueCAtIChzb3VyY2VSZWN0YW5nbGUueCArIHNvdXJjZVJlY3RhbmdsZS53aWR0aCk7XG4gICAgaWYgKGxlZnRUb1JpZ2h0ID4gMCAmJiBsZWZ0VG9SaWdodCA8IGRlZmF1bHRPZmZzZXQgKiAyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGxlZnRUb1JpZ2h0IC8gMjtcbiAgICAgICAgc291cmNlT2Zmc2V0WzNdID0gb2Zmc2V0O1xuICAgICAgICB0YXJnZXRPZmZzZXRbMV0gPSBvZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKHJpZ2h0VG9MZWZ0ID4gMCAmJiByaWdodFRvTGVmdCA8IGRlZmF1bHRPZmZzZXQgKiAyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHJpZ2h0VG9MZWZ0IC8gMjtcbiAgICAgICAgdGFyZ2V0T2Zmc2V0WzNdID0gb2Zmc2V0O1xuICAgICAgICBzb3VyY2VPZmZzZXRbMV0gPSBvZmZzZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgdG9wVG9Cb3R0b20gPSBzb3VyY2VSZWN0YW5nbGUueSAtICh0YXJnZXRSZWN0YW5nbGUueSArIHRhcmdldFJlY3RhbmdsZS5oZWlnaHQpO1xuICAgIGNvbnN0IGJvdHRvbVRvVG9wID0gdGFyZ2V0UmVjdGFuZ2xlLnkgLSAoc291cmNlUmVjdGFuZ2xlLnkgKyBzb3VyY2VSZWN0YW5nbGUuaGVpZ2h0KTtcbiAgICBpZiAodG9wVG9Cb3R0b20gPiAwICYmIHRvcFRvQm90dG9tIDwgZGVmYXVsdE9mZnNldCAqIDIpIHtcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdG9wVG9Cb3R0b20gLyAyO1xuICAgICAgICBzb3VyY2VPZmZzZXRbMF0gPSBvZmZzZXQ7XG4gICAgICAgIHRhcmdldE9mZnNldFsyXSA9IG9mZnNldDtcbiAgICB9XG4gICAgaWYgKGJvdHRvbVRvVG9wID4gMCAmJiBib3R0b21Ub1RvcCA8IGRlZmF1bHRPZmZzZXQgKiAyKSB7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJvdHRvbVRvVG9wIC8gMjtcbiAgICAgICAgc291cmNlT2Zmc2V0WzJdID0gb2Zmc2V0O1xuICAgICAgICB0YXJnZXRPZmZzZXRbMF0gPSBvZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiB7IHNvdXJjZU9mZnNldCwgdGFyZ2V0T2Zmc2V0IH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TmV4dFBvaW50ID0gKHBvaW50OiBQb2ludCwgb3V0ZXJSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCwgZGlyZWN0aW9uOiBEaXJlY3Rpb24pOiBQb2ludCA9PiB7XG4gICAgc3dpdGNoIChkaXJlY3Rpb24pIHtcbiAgICAgICAgY2FzZSBEaXJlY3Rpb24udG9wOiB7XG4gICAgICAgICAgICByZXR1cm4gW3BvaW50WzBdLCBvdXRlclJlY3RhbmdsZS55XTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIERpcmVjdGlvbi5ib3R0b206IHtcbiAgICAgICAgICAgIHJldHVybiBbcG9pbnRbMF0sIG91dGVyUmVjdGFuZ2xlLnkgKyBvdXRlclJlY3RhbmdsZS5oZWlnaHRdO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgRGlyZWN0aW9uLnJpZ2h0OiB7XG4gICAgICAgICAgICByZXR1cm4gW291dGVyUmVjdGFuZ2xlLnggKyBvdXRlclJlY3RhbmdsZS53aWR0aCwgcG9pbnRbMV1dO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHJldHVybiBbb3V0ZXJSZWN0YW5nbGUueCwgcG9pbnRbMV1dO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldFNvdXJjZUFuZFRhcmdldE91dGVyUmVjdGFuZ2xlID0gKHNvdXJjZVJlY3RhbmdsZTogUmVjdGFuZ2xlQ2xpZW50LCB0YXJnZXRSZWN0YW5nbGU6IFJlY3RhbmdsZUNsaWVudCkgPT4ge1xuICAgIGNvbnN0IHsgc291cmNlT2Zmc2V0LCB0YXJnZXRPZmZzZXQgfSA9IHJlZHVjZVJvdXRlTWFyZ2luKHNvdXJjZVJlY3RhbmdsZSwgdGFyZ2V0UmVjdGFuZ2xlKTtcbiAgICBjb25zdCBzb3VyY2VPdXRlclJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5leHBhbmQoXG4gICAgICAgIHNvdXJjZVJlY3RhbmdsZSxcbiAgICAgICAgc291cmNlT2Zmc2V0WzNdLFxuICAgICAgICBzb3VyY2VPZmZzZXRbMF0sXG4gICAgICAgIHNvdXJjZU9mZnNldFsxXSxcbiAgICAgICAgc291cmNlT2Zmc2V0WzJdXG4gICAgKTtcbiAgICBjb25zdCB0YXJnZXRPdXRlclJlY3RhbmdsZSA9IFJlY3RhbmdsZUNsaWVudC5leHBhbmQoXG4gICAgICAgIHRhcmdldFJlY3RhbmdsZSxcbiAgICAgICAgdGFyZ2V0T2Zmc2V0WzNdLFxuICAgICAgICB0YXJnZXRPZmZzZXRbMF0sXG4gICAgICAgIHRhcmdldE9mZnNldFsxXSxcbiAgICAgICAgdGFyZ2V0T2Zmc2V0WzJdXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzb3VyY2VPdXRlclJlY3RhbmdsZSxcbiAgICAgICAgdGFyZ2V0T3V0ZXJSZWN0YW5nbGVcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGlzU291cmNlQW5kVGFyZ2V0SW50ZXJzZWN0ID0gKG9wdGlvbnM6IEVsYm93TGluZVJvdXRlT3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICAgc291cmNlUG9pbnQsXG4gICAgICAgIG5leHRTb3VyY2VQb2ludCxcbiAgICAgICAgc291cmNlUmVjdGFuZ2xlLFxuICAgICAgICBzb3VyY2VPdXRlclJlY3RhbmdsZSxcbiAgICAgICAgdGFyZ2V0UG9pbnQsXG4gICAgICAgIG5leHRUYXJnZXRQb2ludCxcbiAgICAgICAgdGFyZ2V0UmVjdGFuZ2xlLFxuICAgICAgICB0YXJnZXRPdXRlclJlY3RhbmdsZVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIChcbiAgICAgICAgUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZSh0YXJnZXRSZWN0YW5nbGUsIHNvdXJjZVBvaW50KSB8fFxuICAgICAgICBSZWN0YW5nbGVDbGllbnQuaXNQb2ludEluUmVjdGFuZ2xlKHRhcmdldE91dGVyUmVjdGFuZ2xlLCBuZXh0U291cmNlUG9pbnQpIHx8XG4gICAgICAgIFJlY3RhbmdsZUNsaWVudC5pc1BvaW50SW5SZWN0YW5nbGUoc291cmNlT3V0ZXJSZWN0YW5nbGUsIG5leHRUYXJnZXRQb2ludCkgfHxcbiAgICAgICAgUmVjdGFuZ2xlQ2xpZW50LmlzUG9pbnRJblJlY3RhbmdsZShzb3VyY2VSZWN0YW5nbGUsIHRhcmdldFBvaW50KVxuICAgICk7XG59O1xuIl19
@@ -1,19 +0,0 @@
1
- import { DEFAULT_FILL, TRANSPARENT } from '../constants';
2
- export const getElementArea = (board, element) => {
3
- const rectangle = board.getRectangle(element);
4
- if (rectangle) {
5
- return rectangle.width * rectangle.height;
6
- }
7
- return 0;
8
- };
9
- export const sortElementsByArea = (board, elements, direction = 'asc') => {
10
- return elements.sort((a, b) => {
11
- const areaA = getElementArea(board, a);
12
- const areaB = getElementArea(board, b);
13
- return direction === 'asc' ? areaA - areaB : areaB - areaA;
14
- });
15
- };
16
- export const isFilled = (fill) => {
17
- return fill && fill !== DEFAULT_FILL && fill !== TRANSPARENT;
18
- };
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlbWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vc3JjL3V0aWxzL2VsZW1lbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXpELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBcUIsRUFBRSxFQUFFO0lBQ3ZFLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNaLE9BQU8sU0FBUyxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQzlDLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsS0FBaUIsRUFBRSxRQUF3QixFQUFFLFlBQTRCLEtBQUssRUFBRSxFQUFFO0lBQ2pILE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQixNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkMsT0FBTyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQy9ELENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7SUFDckMsT0FBTyxJQUFJLElBQUksSUFBSSxLQUFLLFlBQVksSUFBSSxJQUFJLEtBQUssV0FBVyxDQUFDO0FBQ2pFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQsIFBsYWl0RWxlbWVudCB9IGZyb20gJ0BwbGFpdC9jb3JlJztcbmltcG9ydCB7IERFRkFVTFRfRklMTCwgVFJBTlNQQVJFTlQgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudEFyZWEgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnQ6IFBsYWl0RWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHJlY3RhbmdsZSA9IGJvYXJkLmdldFJlY3RhbmdsZShlbGVtZW50KTtcbiAgICBpZiAocmVjdGFuZ2xlKSB7XG4gICAgICAgIHJldHVybiByZWN0YW5nbGUud2lkdGggKiByZWN0YW5nbGUuaGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn07XG5cbmV4cG9ydCBjb25zdCBzb3J0RWxlbWVudHNCeUFyZWEgPSAoYm9hcmQ6IFBsYWl0Qm9hcmQsIGVsZW1lbnRzOiBQbGFpdEVsZW1lbnRbXSwgZGlyZWN0aW9uOiAnZGVzYycgfCAnYXNjJyA9ICdhc2MnKSA9PiB7XG4gICAgcmV0dXJuIGVsZW1lbnRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYXJlYUEgPSBnZXRFbGVtZW50QXJlYShib2FyZCwgYSk7XG4gICAgICAgIGNvbnN0IGFyZWFCID0gZ2V0RWxlbWVudEFyZWEoYm9hcmQsIGIpO1xuICAgICAgICByZXR1cm4gZGlyZWN0aW9uID09PSAnYXNjJyA/IGFyZWFBIC0gYXJlYUIgOiBhcmVhQiAtIGFyZWFBO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRmlsbGVkID0gKGZpbGw6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBmaWxsICYmIGZpbGwgIT09IERFRkFVTFRfRklMTCAmJiBmaWxsICE9PSBUUkFOU1BBUkVOVDtcbn07XG4iXX0=