@plait/core 0.50.1 → 0.51.0

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 (53) hide show
  1. package/README.md +30 -28
  2. package/board/board.component.interface.d.ts +0 -5
  3. package/esm2022/board/board.component.interface.mjs +1 -1
  4. package/esm2022/board/board.component.mjs +9 -6
  5. package/esm2022/interfaces/board.mjs +3 -3
  6. package/esm2022/interfaces/direction.mjs +1 -1
  7. package/esm2022/interfaces/point.mjs +20 -5
  8. package/esm2022/interfaces/rectangle-client.mjs +57 -2
  9. package/esm2022/plugins/create-board.mjs +5 -5
  10. package/esm2022/plugins/with-hand.mjs +6 -6
  11. package/esm2022/plugins/with-history.mjs +4 -4
  12. package/esm2022/plugins/with-hotkey.mjs +10 -56
  13. package/esm2022/plugins/with-moving.mjs +97 -37
  14. package/esm2022/plugins/with-selection.mjs +36 -19
  15. package/esm2022/utils/common.mjs +18 -6
  16. package/esm2022/utils/dom/common.mjs +17 -1
  17. package/esm2022/utils/drawing/arrow.mjs +23 -0
  18. package/esm2022/utils/drawing/circle.mjs +4 -0
  19. package/esm2022/utils/drawing/line.mjs +47 -0
  20. package/esm2022/utils/drawing/rectangle.mjs +34 -0
  21. package/esm2022/utils/element.mjs +11 -22
  22. package/esm2022/utils/helper.mjs +2 -2
  23. package/esm2022/utils/id-creator.mjs +2 -2
  24. package/esm2022/utils/index.mjs +5 -5
  25. package/esm2022/utils/math.mjs +37 -4
  26. package/esm2022/utils/moving-element.mjs +2 -7
  27. package/esm2022/utils/selected-element.mjs +15 -2
  28. package/esm2022/utils/weak-maps.mjs +1 -1
  29. package/fesm2022/plait-core.mjs +426 -267
  30. package/fesm2022/plait-core.mjs.map +1 -1
  31. package/interfaces/board.d.ts +4 -4
  32. package/interfaces/direction.d.ts +2 -0
  33. package/interfaces/point.d.ts +7 -2
  34. package/interfaces/rectangle-client.d.ts +7 -6
  35. package/package.json +1 -1
  36. package/plugins/with-moving.d.ts +4 -0
  37. package/styles/styles.scss +4 -0
  38. package/utils/common.d.ts +2 -1
  39. package/utils/dom/common.d.ts +1 -0
  40. package/utils/helper.d.ts +1 -1
  41. package/utils/index.d.ts +4 -4
  42. package/utils/math.d.ts +14 -1
  43. package/utils/moving-element.d.ts +0 -1
  44. package/utils/selected-element.d.ts +2 -1
  45. package/utils/weak-maps.d.ts +8 -2
  46. package/esm2022/utils/draw/arrow.mjs +0 -23
  47. package/esm2022/utils/draw/circle.mjs +0 -4
  48. package/esm2022/utils/draw/line.mjs +0 -47
  49. package/esm2022/utils/draw/rectangle.mjs +0 -34
  50. /package/utils/{draw → drawing}/arrow.d.ts +0 -0
  51. /package/utils/{draw → drawing}/circle.d.ts +0 -0
  52. /package/utils/{draw → drawing}/line.d.ts +0 -0
  53. /package/utils/{draw → drawing}/rectangle.d.ts +0 -0
@@ -35,15 +35,15 @@ export interface PlaitBoard {
35
35
  mouseup: (event: MouseEvent) => void;
36
36
  globalMousemove: (event: MouseEvent) => void;
37
37
  globalMouseup: (event: MouseEvent) => void;
38
- keydown: (event: KeyboardEvent) => void;
39
- globalKeydown: (event: KeyboardEvent) => void;
40
- keyup: (event: KeyboardEvent) => void;
38
+ keyDown: (event: KeyboardEvent) => void;
39
+ globalKeyDown: (event: KeyboardEvent) => void;
40
+ keyUp: (event: KeyboardEvent) => void;
41
41
  setFragment: (data: DataTransfer | null, clipboardContext: WritableClipboardContext | null, rectangle: RectangleClient | null, type: 'copy' | 'cut') => void;
42
42
  insertFragment: (data: DataTransfer | null, clipboardData: ClipboardData | null, targetPoint: Point) => void;
43
43
  deleteFragment: (data: DataTransfer | null) => void;
44
44
  getDeletedFragment: (data: PlaitElement[]) => PlaitElement[];
45
45
  getRelatedFragment: (data: PlaitElement[]) => PlaitElement[];
46
- dblclick: (event: MouseEvent) => void;
46
+ dblClick: (event: MouseEvent) => void;
47
47
  drawElement: (context: PlaitPluginElementContext) => SVGGElement[] | ComponentType<PlaitPluginElementComponent>;
48
48
  redrawElement: (context: PlaitPluginElementContext, previousContext?: PlaitPluginElementContext) => SVGGElement[] | void;
49
49
  destroyElement: (context: PlaitPluginElementContext) => void;
@@ -5,3 +5,5 @@ export declare enum Direction {
5
5
  bottom = "bottom"
6
6
  }
7
7
  export type Vector = [number, number];
8
+ export type DirectionFactor = -1 | 0 | 1;
9
+ export type DirectionFactors = [DirectionFactor, DirectionFactor];
@@ -5,6 +5,11 @@ export interface XYPosition {
5
5
  }
6
6
  export declare const Point: {
7
7
  isEquals(point?: Point, otherPoint?: Point): boolean | undefined;
8
- isHorizontalAlign(point?: Point, otherPoint?: Point, tolerance?: number): boolean | undefined;
9
- isVerticalAlign(point?: Point, otherPoint?: Point, tolerance?: number): boolean | undefined;
8
+ isHorizontal(point?: Point, otherPoint?: Point, tolerance?: number): boolean | undefined;
9
+ isOverHorizontal(points: Point[], tolerance?: number): boolean;
10
+ isVertical(point?: Point, otherPoint?: Point, tolerance?: number): boolean | undefined;
11
+ isOverVertical(points: Point[], tolerance?: number): boolean;
12
+ isAlign(points: Point[], tolerance?: number): boolean;
13
+ getOffsetX(point1: Point, point2: Point): number;
14
+ getOffsetY(point1: Point, point2: Point): number;
10
15
  };
@@ -14,12 +14,11 @@ export declare const RectangleClient: {
14
14
  isHit: (origin: RectangleClient, target: RectangleClient) => boolean;
15
15
  isHitX: (origin: RectangleClient, target: RectangleClient) => boolean;
16
16
  isHitY: (origin: RectangleClient, target: RectangleClient) => boolean;
17
- toRectangleClient: (points: Point[]) => {
18
- x: number;
19
- y: number;
20
- width: number;
21
- height: number;
22
- };
17
+ getPoints(rectangle: RectangleClient): [Point, Point];
18
+ getRectangleByCenterPoint(point: Point, width: number, height: number): RectangleClient;
19
+ getRectangleByPoint(point: Point, width: number, height: number): RectangleClient;
20
+ getRectangleByPoints(points: Point[]): RectangleClient;
21
+ getCornerPointsByPoints(points: Point[]): [Point, Point, Point, Point];
23
22
  getOutlineRectangle: (rectangle: RectangleClient, offset: number) => {
24
23
  x: number;
25
24
  y: number;
@@ -34,6 +33,7 @@ export declare const RectangleClient: {
34
33
  };
35
34
  isEqual: (rectangle: RectangleClient, otherRectangle: RectangleClient) => boolean;
36
35
  getCornerPoints: (rectangle: RectangleClient) => [Point, Point, Point, Point];
36
+ getCenterPoint: (rectangle: RectangleClient) => Point;
37
37
  getEdgeCenterPoints: (rectangle: RectangleClient) => [Point, Point, Point, Point];
38
38
  getConnectionPoint: (rectangle: RectangleClient, point: PointOfRectangle) => Point;
39
39
  expand(rectangle: RectangleClient, left: number, top?: number, right?: number, bottom?: number): {
@@ -44,4 +44,5 @@ export declare const RectangleClient: {
44
44
  };
45
45
  getGapCenter(rectangle1: RectangleClient, rectangle2: RectangleClient, isHorizontal: boolean): number;
46
46
  isPointInRectangle(rectangle: RectangleClient, point: Point): boolean;
47
+ getBoundingRectangle(rectangles: RectangleClient[]): RectangleClient;
47
48
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plait/core",
3
- "version": "0.50.1",
3
+ "version": "0.51.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^16.0.0",
6
6
  "@angular/core": "^16.0.0",
@@ -1,2 +1,6 @@
1
1
  import { PlaitBoard } from '../interfaces/board';
2
+ import { PlaitElement } from '../interfaces/element';
2
3
  export declare function withMoving(board: PlaitBoard): PlaitBoard;
4
+ export declare function withArrowMoving(board: PlaitBoard): PlaitBoard;
5
+ export declare function getTargetElements(board: PlaitBoard): PlaitElement[];
6
+ export declare function updatePoints(board: PlaitBoard, targetElements: PlaitElement[], offsetX: number, offsetY: number): PlaitElement[];
@@ -51,6 +51,10 @@
51
51
  }
52
52
  }
53
53
 
54
+ &.pointer-selection {
55
+ cursor: default;
56
+ }
57
+
54
58
  &.ns-resize {
55
59
  cursor: ns-resize;
56
60
  }
package/utils/common.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- export declare const throttleRAF: (fn: () => void) => void;
1
+ import { PlaitBoard } from '../interfaces/board';
2
+ export declare const throttleRAF: (board: PlaitBoard, key: string, fn: () => void) => void;
2
3
  export declare const debounce: (func: () => void, wait: number, options?: {
3
4
  leading: boolean;
4
5
  }) => () => void;
@@ -5,6 +5,7 @@ export declare function createG(): SVGGElement;
5
5
  export declare function createPath(): SVGPathElement;
6
6
  export declare function createRect(rectangle: RectangleClient, options?: Options): SVGRectElement;
7
7
  export declare const setStrokeLinecap: (g: SVGGElement, value: 'round' | 'square') => void;
8
+ export declare const setTransformRotate: (g: SVGGElement, rectangle: RectangleClient, angle: number) => void;
8
9
  export declare const setPathStrokeLinecap: (g: SVGGElement, value: 'round' | 'square') => void;
9
10
  export declare function createMask(): SVGMaskElement;
10
11
  export declare function createSVG(): SVGSVGElement;
package/utils/helper.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export declare function isNullOrUndefined(value: any): boolean;
2
2
  /**
3
- * 规范 point
3
+ * get {x,y} point
4
4
  * @param point
5
5
  * @returns point
6
6
  */
package/utils/index.d.ts CHANGED
@@ -8,10 +8,10 @@ export * from './id-creator';
8
8
  export * from './math';
9
9
  export * from './weak-maps';
10
10
  export * from './selected-element';
11
- export * from './draw/rectangle';
12
- export * from './draw/arrow';
13
- export * from './draw/circle';
14
- export * from './draw/line';
11
+ export * from './drawing/rectangle';
12
+ export * from './drawing/arrow';
13
+ export * from './drawing/circle';
14
+ export * from './drawing/line';
15
15
  export * from './tree';
16
16
  export * from './element';
17
17
  export * from './viewport';
package/utils/math.d.ts CHANGED
@@ -12,5 +12,18 @@ export declare const isPolylineHitRectangle: (points: Point[], rectangle: Rectan
12
12
  export declare const isPointInPolygon: (point: Point, points: Point[]) => boolean;
13
13
  export declare const isPointInEllipse: (point: Point, center: Point, rx: number, ry: number, rotation?: number) => boolean;
14
14
  export declare const isPointInRoundRectangle: (point: Point, rectangle: RectangleClient, radius: number) => boolean;
15
- export declare const downScale: (number: number) => number;
16
15
  export declare const catmullRomFitting: (points: Point[]) => Point[];
16
+ /**
17
+ * the result of slope is based on Cartesian coordinate system
18
+ * x, y are based on the position in the Cartesian coordinate system
19
+ */
20
+ export declare function getEllipseTangentSlope(x: number, y: number, a: number, b: number): number;
21
+ /**
22
+ * x, y are based on the position in the Cartesian coordinate system
23
+ */
24
+ export declare function getVectorFromPointAndSlope(x: number, y: number, slope: number): Point;
25
+ /**
26
+ * The DOM likes values to be fixed to 3 decimal places
27
+ */
28
+ export declare function toDomPrecision(v: number): number;
29
+ export declare function toFixed(v: number): number;
@@ -1,6 +1,5 @@
1
1
  import { PlaitBoard, PlaitElement } from '../interfaces';
2
2
  export declare const getMovingElements: (board: PlaitBoard) => PlaitElement[];
3
3
  export declare const isMovingElements: (board: PlaitBoard) => boolean;
4
- export declare const addMovingElements: (board: PlaitBoard, elements: PlaitElement[]) => void;
5
4
  export declare const removeMovingElements: (board: PlaitBoard) => void;
6
5
  export declare const cacheMovingElements: (board: PlaitBoard, elements: PlaitElement[]) => void;
@@ -2,9 +2,10 @@ import { PlaitBoard } from '../interfaces/board';
2
2
  import { Selection } from '../interfaces/selection';
3
3
  import { PlaitElement } from '../interfaces/element';
4
4
  import { Point } from '../interfaces/point';
5
- import { PlaitOptionsBoard } from '../public-api';
5
+ import { PlaitOptionsBoard } from '../plugins/with-options';
6
6
  export declare const getHitElementsBySelection: (board: PlaitBoard, selection?: Selection, match?: (element: PlaitElement) => boolean) => PlaitElement[];
7
7
  export declare const getHitElementByPoint: (board: PlaitBoard, point: Point, match?: (element: PlaitElement) => boolean) => undefined | PlaitElement;
8
+ export declare const getHitSelectedElements: (board: PlaitBoard, point: Point) => PlaitElement[];
8
9
  export declare const cacheSelectedElements: (board: PlaitBoard, selectedElements: PlaitElement[]) => void;
9
10
  export declare const getSelectedElements: (board: PlaitBoard) => PlaitElement[];
10
11
  export declare const addSelectedElement: (board: PlaitBoard, element: PlaitElement | PlaitElement[]) => void;
@@ -1,5 +1,5 @@
1
1
  import { RoughSVG } from 'roughjs/bin/svg';
2
- import { BoardComponentInterface, BoardElementHostInterface } from '../board/board.component.interface';
2
+ import { BoardComponentInterface } from '../board/board.component.interface';
3
3
  import { PlaitElement } from '../interfaces/element';
4
4
  import { PlaitBoard } from '../interfaces/board';
5
5
  import { Point } from '../interfaces/point';
@@ -15,7 +15,13 @@ export declare const BOARD_TO_AFTER_CHANGE: WeakMap<PlaitBoard, () => void>;
15
15
  export declare const BOARD_TO_COMPONENT: WeakMap<PlaitBoard, BoardComponentInterface>;
16
16
  export declare const BOARD_TO_ROUGH_SVG: WeakMap<PlaitBoard, RoughSVG>;
17
17
  export declare const BOARD_TO_HOST: WeakMap<PlaitBoard, SVGSVGElement>;
18
- export declare const BOARD_TO_ELEMENT_HOST: WeakMap<PlaitBoard, BoardElementHostInterface>;
18
+ export declare const BOARD_TO_ELEMENT_HOST: WeakMap<PlaitBoard, {
19
+ host: SVGGElement;
20
+ upperHost: SVGGElement;
21
+ activeHost: SVGGElement;
22
+ container: HTMLElement;
23
+ viewportContainer: HTMLElement;
24
+ }>;
19
25
  export declare const BOARD_TO_SELECTED_ELEMENT: WeakMap<PlaitBoard, PlaitElement[]>;
20
26
  export declare const BOARD_TO_MOVING_POINT_IN_BOARD: WeakMap<PlaitBoard, Point>;
21
27
  export declare const BOARD_TO_MOVING_POINT: WeakMap<PlaitBoard, Point>;
@@ -1,23 +0,0 @@
1
- import { rotate } from '../math';
2
- export function arrowPoints(start, end, degree = 40) {
3
- const width = Math.abs(start[0] - end[0]);
4
- const height = Math.abs(start[1] - end[1]);
5
- let hypotenuse = Math.hypot(width, height); // 斜边
6
- const realRotateLine = hypotenuse / 2;
7
- const rotateWidth = (realRotateLine / hypotenuse) * width;
8
- const rotateHeight = (realRotateLine / hypotenuse) * height;
9
- const rotatePoint = [
10
- end[0] > start[0] ? end[0] - rotateWidth : end[0] + rotateWidth,
11
- end[1] > start[1] ? end[1] - rotateHeight : end[1] + rotateHeight
12
- ];
13
- const pointRight = rotate(rotatePoint[0], rotatePoint[1], end[0], end[1], (degree * Math.PI) / 180);
14
- const pointLeft = rotate(rotatePoint[0], rotatePoint[1], end[0], end[1], (-degree * Math.PI) / 180);
15
- return { pointLeft, pointRight };
16
- }
17
- export function drawArrow(rs, start, end, options, maxHypotenuseLength = 10, degree = 40) {
18
- const { pointLeft, pointRight } = arrowPoints(start, end, degree);
19
- const arrowLineLeft = rs.linearPath([pointLeft, end], options);
20
- const arrowLineRight = rs.linearPath([pointRight, end], options);
21
- return [arrowLineLeft, arrowLineRight];
22
- }
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy91dGlscy9kcmF3L2Fycm93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFLakMsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFZLEVBQUUsR0FBVSxFQUFFLE1BQU0sR0FBRyxFQUFFO0lBQzdELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSztJQUNqRCxNQUFNLGNBQWMsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUMxRCxNQUFNLFlBQVksR0FBRyxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDNUQsTUFBTSxXQUFXLEdBQUc7UUFDaEIsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVc7UUFDL0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVk7S0FDcEUsQ0FBQztJQUNGLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBVSxDQUFDO0lBQzdHLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFVLENBQUM7SUFDN0csT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUNyQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxFQUFZLEVBQUUsS0FBWSxFQUFFLEdBQVUsRUFBRSxPQUFnQixFQUFFLG1CQUFtQixHQUFHLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRTtJQUNySCxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0QsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRSxPQUFPLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByb3RhdGUgfSBmcm9tICcuLi9tYXRoJztcbmltcG9ydCB7IFJvdWdoU1ZHIH0gZnJvbSAncm91Z2hqcy9iaW4vc3ZnJztcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICdyb3VnaGpzL2Jpbi9jb3JlJztcbmltcG9ydCB7IFBvaW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJvd1BvaW50cyhzdGFydDogUG9pbnQsIGVuZDogUG9pbnQsIGRlZ3JlZSA9IDQwKSB7XG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLmFicyhzdGFydFswXSAtIGVuZFswXSk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5hYnMoc3RhcnRbMV0gLSBlbmRbMV0pO1xuICAgIGxldCBoeXBvdGVudXNlID0gTWF0aC5oeXBvdCh3aWR0aCwgaGVpZ2h0KTsgLy8g5pac6L65XG4gICAgY29uc3QgcmVhbFJvdGF0ZUxpbmUgPSBoeXBvdGVudXNlIC8gMjtcbiAgICBjb25zdCByb3RhdGVXaWR0aCA9IChyZWFsUm90YXRlTGluZSAvIGh5cG90ZW51c2UpICogd2lkdGg7XG4gICAgY29uc3Qgcm90YXRlSGVpZ2h0ID0gKHJlYWxSb3RhdGVMaW5lIC8gaHlwb3RlbnVzZSkgKiBoZWlnaHQ7XG4gICAgY29uc3Qgcm90YXRlUG9pbnQgPSBbXG4gICAgICAgIGVuZFswXSA+IHN0YXJ0WzBdID8gZW5kWzBdIC0gcm90YXRlV2lkdGggOiBlbmRbMF0gKyByb3RhdGVXaWR0aCxcbiAgICAgICAgZW5kWzFdID4gc3RhcnRbMV0gPyBlbmRbMV0gLSByb3RhdGVIZWlnaHQgOiBlbmRbMV0gKyByb3RhdGVIZWlnaHRcbiAgICBdO1xuICAgIGNvbnN0IHBvaW50UmlnaHQgPSByb3RhdGUocm90YXRlUG9pbnRbMF0sIHJvdGF0ZVBvaW50WzFdLCBlbmRbMF0sIGVuZFsxXSwgKGRlZ3JlZSAqIE1hdGguUEkpIC8gMTgwKSBhcyBQb2ludDtcbiAgICBjb25zdCBwb2ludExlZnQgPSByb3RhdGUocm90YXRlUG9pbnRbMF0sIHJvdGF0ZVBvaW50WzFdLCBlbmRbMF0sIGVuZFsxXSwgKC1kZWdyZWUgKiBNYXRoLlBJKSAvIDE4MCkgYXMgUG9pbnQ7XG4gICAgcmV0dXJuIHsgcG9pbnRMZWZ0LCBwb2ludFJpZ2h0IH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkcmF3QXJyb3cocnM6IFJvdWdoU1ZHLCBzdGFydDogUG9pbnQsIGVuZDogUG9pbnQsIG9wdGlvbnM6IE9wdGlvbnMsIG1heEh5cG90ZW51c2VMZW5ndGggPSAxMCwgZGVncmVlID0gNDApOiBTVkdHRWxlbWVudFtdIHtcbiAgICBjb25zdCB7IHBvaW50TGVmdCwgcG9pbnRSaWdodCB9ID0gYXJyb3dQb2ludHMoc3RhcnQsIGVuZCwgZGVncmVlKTtcbiAgICBjb25zdCBhcnJvd0xpbmVMZWZ0ID0gcnMubGluZWFyUGF0aChbcG9pbnRMZWZ0LCBlbmRdLCBvcHRpb25zKTtcbiAgICBjb25zdCBhcnJvd0xpbmVSaWdodCA9IHJzLmxpbmVhclBhdGgoW3BvaW50UmlnaHQsIGVuZF0sIG9wdGlvbnMpO1xuICAgIHJldHVybiBbYXJyb3dMaW5lTGVmdCwgYXJyb3dMaW5lUmlnaHRdO1xufVxuIl19
@@ -1,4 +0,0 @@
1
- export function drawCircle(roughSVG, point, diameter, options) {
2
- return roughSVG.circle(point[0], point[1], diameter, options);
3
- }
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lyY2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvdXRpbHMvZHJhdy9jaXJjbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsTUFBTSxVQUFVLFVBQVUsQ0FBQyxRQUFrQixFQUFFLEtBQVksRUFBRSxRQUFnQixFQUFFLE9BQWdCO0lBQzNGLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUm91Z2hTVkcgfSBmcm9tICdyb3VnaGpzL2Jpbi9zdmcnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3BvaW50JztcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tICdyb3VnaGpzL2Jpbi9jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRyYXdDaXJjbGUocm91Z2hTVkc6IFJvdWdoU1ZHLCBwb2ludDogUG9pbnQsIGRpYW1ldGVyOiBudW1iZXIsIG9wdGlvbnM6IE9wdGlvbnMpOiBTVkdHRWxlbWVudCB7XG4gICAgcmV0dXJuIHJvdWdoU1ZHLmNpcmNsZShwb2ludFswXSwgcG9pbnRbMV0sIGRpYW1ldGVyLCBvcHRpb25zKTtcbn1cbiJdfQ==
@@ -1,47 +0,0 @@
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=
@@ -1,34 +0,0 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjdGFuZ2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvdXRpbHMvZHJhdy9yZWN0YW5nbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFakQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQzlCLEVBQVksRUFDWixFQUFVLEVBQ1YsRUFBVSxFQUNWLEVBQVUsRUFDVixFQUFVLEVBQ1YsT0FBZ0IsRUFDaEIsT0FBTyxHQUFHLEtBQUssRUFDZixZQUFxQjtJQUVyQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUVqQyxJQUFJLE1BQU0sR0FBRyxZQUFZLElBQUksQ0FBQyxDQUFDO0lBQy9CLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNkLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxJQUFJLE1BQU0sR0FBRyxhQUFhLENBQUM7UUFDM0IsSUFBSSxhQUFhLEdBQUcsVUFBVSxFQUFFO1lBQzVCLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztTQUNsRDtLQUNKO0lBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDakMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDakMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztJQUVqQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQ1YsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLE1BQU0sSUFBSSxNQUFNLGNBQWMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLE1BQU0sSUFBSSxNQUFNLGNBQWMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLE1BQU0sSUFBSSxNQUFNLGNBQWMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLE1BQU0sSUFBSSxNQUFNLGNBQWMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUMxVixPQUFPLENBQ1YsQ0FBQztBQUNOLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxLQUFpQixFQUFFLFNBQTBCLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO0lBQzdGLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVHLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0QyxPQUFPLFVBQVUsQ0FBQztBQUN0QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAncm91Z2hqcy9iaW4vY29yZSc7XG5pbXBvcnQgeyBSb3VnaFNWRyB9IGZyb20gJ3JvdWdoanMvYmluL3N2Zyc7XG5pbXBvcnQgeyBNQVhfUkFESVVTIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IFBsYWl0Qm9hcmQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2JvYXJkJztcbmltcG9ydCB7IFJlY3RhbmdsZUNsaWVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVjdGFuZ2xlLWNsaWVudCc7XG5pbXBvcnQgeyBzZXRTdHJva2VMaW5lY2FwIH0gZnJvbSAnLi4vZG9tL2NvbW1vbic7XG5cbi8qKlxuICogZHJhd1JvdW5kUmVjdGFuZ2xlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcmF3Um91bmRSZWN0YW5nbGUoXG4gICAgcnM6IFJvdWdoU1ZHLFxuICAgIHgxOiBudW1iZXIsXG4gICAgeTE6IG51bWJlcixcbiAgICB4MjogbnVtYmVyLFxuICAgIHkyOiBudW1iZXIsXG4gICAgb3B0aW9uczogT3B0aW9ucyxcbiAgICBvdXRsaW5lID0gZmFsc2UsXG4gICAgYm9yZGVyUmFkaXVzPzogbnVtYmVyXG4pIHtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGguYWJzKHgxIC0geDIpO1xuICAgIGNvbnN0IGhlaWdodCA9IE1hdGguYWJzKHkxIC0geTIpO1xuXG4gICAgbGV0IHJhZGl1cyA9IGJvcmRlclJhZGl1cyB8fCAwO1xuICAgIGlmIChyYWRpdXMgPT09IDApIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFJhZGl1cyA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpIC8gODtcbiAgICAgICAgbGV0IHJhZGl1cyA9IGRlZmF1bHRSYWRpdXM7XG4gICAgICAgIGlmIChkZWZhdWx0UmFkaXVzID4gTUFYX1JBRElVUykge1xuICAgICAgICAgICAgcmFkaXVzID0gb3V0bGluZSA/IE1BWF9SQURJVVMgKyAyIDogTUFYX1JBRElVUztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBvaW50MSA9IFt4MSArIHJhZGl1cywgeTFdO1xuICAgIGNvbnN0IHBvaW50MiA9IFt4MiAtIHJhZGl1cywgeTFdO1xuICAgIGNvbnN0IHBvaW50MyA9IFt4MiwgeTEgKyByYWRpdXNdO1xuICAgIGNvbnN0IHBvaW50NCA9IFt4MiwgeTIgLSByYWRpdXNdO1xuICAgIGNvbnN0IHBvaW50NSA9IFt4MiAtIHJhZGl1cywgeTJdO1xuICAgIGNvbnN0IHBvaW50NiA9IFt4MSArIHJhZGl1cywgeTJdO1xuICAgIGNvbnN0IHBvaW50NyA9IFt4MSwgeTIgLSByYWRpdXNdO1xuICAgIGNvbnN0IHBvaW50OCA9IFt4MSwgeTEgKyByYWRpdXNdO1xuXG4gICAgcmV0dXJuIHJzLnBhdGgoXG4gICAgICAgIGBNJHtwb2ludDJbMF19ICR7cG9pbnQyWzFdfSBBICR7cmFkaXVzfSAke3JhZGl1c30sIDAsIDAsIDEsICR7cG9pbnQzWzBdfSAke3BvaW50M1sxXX0gTCAke3BvaW50NFswXX0gJHtwb2ludDRbMV19IEEgJHtyYWRpdXN9ICR7cmFkaXVzfSwgMCwgMCwgMSwgJHtwb2ludDVbMF19ICR7cG9pbnQ1WzFdfSBMICR7cG9pbnQ2WzBdfSAke3BvaW50NlsxXX0gQSAke3JhZGl1c30gJHtyYWRpdXN9LCAwLCAwLCAxLCAke3BvaW50N1swXX0gJHtwb2ludDdbMV19IEwgJHtwb2ludDhbMF19ICR7cG9pbnQ4WzFdfSBBICR7cmFkaXVzfSAke3JhZGl1c30sIDAsIDAsIDEsICR7cG9pbnQxWzBdfSAke3BvaW50MVsxXX0gWmAsXG4gICAgICAgIG9wdGlvbnNcbiAgICApO1xufVxuXG5leHBvcnQgY29uc3QgZHJhd1JlY3RhbmdsZSA9IChib2FyZDogUGxhaXRCb2FyZCwgcmVjdGFuZ2xlOiBSZWN0YW5nbGVDbGllbnQsIG9wdGlvbnM6IE9wdGlvbnMpID0+IHtcbiAgICBjb25zdCByb3VnaFNWRyA9IFBsYWl0Qm9hcmQuZ2V0Um91Z2hTVkcoYm9hcmQpO1xuICAgIGNvbnN0IHJlY3RhbmdsZUcgPSByb3VnaFNWRy5yZWN0YW5nbGUocmVjdGFuZ2xlLngsIHJlY3RhbmdsZS55LCByZWN0YW5nbGUud2lkdGgsIHJlY3RhbmdsZS5oZWlnaHQsIG9wdGlvbnMpO1xuICAgIHNldFN0cm9rZUxpbmVjYXAocmVjdGFuZ2xlRywgJ3JvdW5kJyk7XG4gICAgcmV0dXJuIHJlY3RhbmdsZUc7XG59O1xuIl19
File without changes
File without changes
File without changes
File without changes