modern-path2d 0.2.6 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +50 -53
- package/dist/index.d.cts +4 -4
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +1 -1
- package/dist/index.mjs +50 -53
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -497,7 +497,7 @@ function parseArcCommand(path, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, s
|
|
|
497
497
|
const cy = Math.sin(xAxisRotation) * cxp + Math.cos(xAxisRotation) * cyp + (start.y + end.y) / 2;
|
|
498
498
|
const theta = svgAngle(1, 0, (x1p - cxp) / rx, (y1p - cyp) / ry);
|
|
499
499
|
const delta = svgAngle((x1p - cxp) / rx, (y1p - cyp) / ry, (-x1p - cxp) / rx, (-y1p - cyp) / ry) % (Math.PI * 2);
|
|
500
|
-
path.ellipse(cx, cy, rx, ry, xAxisRotation, theta, theta + delta, sweepFlag ===
|
|
500
|
+
path.ellipse(cx, cy, rx, ry, xAxisRotation, theta, theta + delta, sweepFlag === 0);
|
|
501
501
|
}
|
|
502
502
|
|
|
503
503
|
function getReflection(a, b) {
|
|
@@ -806,78 +806,71 @@ function parsePathDataArgs(input, flags, stride = 0) {
|
|
|
806
806
|
}
|
|
807
807
|
|
|
808
808
|
function pathCommandsToPathData(commands) {
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
809
|
+
let first;
|
|
810
|
+
let prev;
|
|
811
|
+
const data = [];
|
|
812
812
|
for (let i = 0, len = commands.length; i < len; i++) {
|
|
813
813
|
const cmd = commands[i];
|
|
814
814
|
switch (cmd.type) {
|
|
815
815
|
case "m":
|
|
816
816
|
case "M":
|
|
817
|
-
if (cmd.x === prev.
|
|
817
|
+
if (cmd.x.toFixed(4) === prev?.x.toFixed(4) && cmd.y.toFixed(4) === prev?.y.toFixed(4)) {
|
|
818
818
|
continue;
|
|
819
819
|
}
|
|
820
|
-
data
|
|
821
|
-
prev.x
|
|
822
|
-
|
|
823
|
-
first.x = cmd.x;
|
|
824
|
-
first.y = cmd.y;
|
|
820
|
+
data.push(`${cmd.type} ${cmd.x} ${cmd.y}`);
|
|
821
|
+
prev = { x: cmd.x, y: cmd.y };
|
|
822
|
+
first = { x: cmd.x, y: cmd.y };
|
|
825
823
|
break;
|
|
826
824
|
case "h":
|
|
827
825
|
case "H":
|
|
828
|
-
data
|
|
829
|
-
prev
|
|
826
|
+
data.push(`${cmd.type} ${cmd.x}`);
|
|
827
|
+
prev = { x: cmd.x, y: prev?.y ?? 0 };
|
|
830
828
|
break;
|
|
831
829
|
case "v":
|
|
832
830
|
case "V":
|
|
833
|
-
data
|
|
834
|
-
prev
|
|
831
|
+
data.push(`${cmd.type} ${cmd.y}`);
|
|
832
|
+
prev = { x: prev?.x ?? 0, y: cmd.y };
|
|
835
833
|
break;
|
|
836
834
|
case "l":
|
|
837
835
|
case "L":
|
|
838
|
-
data
|
|
839
|
-
prev.x
|
|
840
|
-
prev.y = cmd.y;
|
|
836
|
+
data.push(`${cmd.type} ${cmd.x} ${cmd.y}`);
|
|
837
|
+
prev = { x: cmd.x, y: cmd.y };
|
|
841
838
|
break;
|
|
842
839
|
case "c":
|
|
843
840
|
case "C":
|
|
844
|
-
data
|
|
845
|
-
prev.x
|
|
846
|
-
prev.y = cmd.y;
|
|
841
|
+
data.push(`${cmd.type} ${cmd.x1} ${cmd.y1} ${cmd.x2} ${cmd.y2} ${cmd.x} ${cmd.y}`);
|
|
842
|
+
prev = { x: cmd.x, y: cmd.y };
|
|
847
843
|
break;
|
|
848
844
|
case "s":
|
|
849
845
|
case "S":
|
|
850
|
-
data
|
|
851
|
-
prev.x
|
|
852
|
-
prev.y = cmd.y;
|
|
846
|
+
data.push(`${cmd.type} ${cmd.x2} ${cmd.y2} ${cmd.x} ${cmd.y}`);
|
|
847
|
+
prev = { x: cmd.x, y: cmd.y };
|
|
853
848
|
break;
|
|
854
849
|
case "q":
|
|
855
850
|
case "Q":
|
|
856
|
-
data
|
|
857
|
-
prev.x
|
|
858
|
-
prev.y = cmd.y;
|
|
851
|
+
data.push(`${cmd.type} ${cmd.x1} ${cmd.y1} ${cmd.x} ${cmd.y}`);
|
|
852
|
+
prev = { x: cmd.x, y: cmd.y };
|
|
859
853
|
break;
|
|
860
854
|
case "t":
|
|
861
855
|
case "T":
|
|
862
|
-
data
|
|
863
|
-
prev.x
|
|
864
|
-
prev.y = cmd.y;
|
|
856
|
+
data.push(`${cmd.type} ${cmd.x} ${cmd.y}`);
|
|
857
|
+
prev = { x: cmd.x, y: cmd.y };
|
|
865
858
|
break;
|
|
866
859
|
case "a":
|
|
867
860
|
case "A":
|
|
868
|
-
data
|
|
869
|
-
prev.x
|
|
870
|
-
prev.y = cmd.y;
|
|
861
|
+
data.push(`${cmd.type} ${cmd.rx} ${cmd.ry} ${cmd.angle} ${cmd.largeArcFlag} ${cmd.sweepFlag} ${cmd.x} ${cmd.y}`);
|
|
862
|
+
prev = { x: cmd.x, y: cmd.y };
|
|
871
863
|
break;
|
|
872
864
|
case "z":
|
|
873
865
|
case "Z":
|
|
874
|
-
data
|
|
875
|
-
|
|
876
|
-
|
|
866
|
+
data.push(cmd.type);
|
|
867
|
+
if (first) {
|
|
868
|
+
prev = { x: first.x, y: first.y };
|
|
869
|
+
}
|
|
877
870
|
break;
|
|
878
871
|
}
|
|
879
872
|
}
|
|
880
|
-
return data;
|
|
873
|
+
return data.join(" ");
|
|
881
874
|
}
|
|
882
875
|
|
|
883
876
|
const RE$2 = /[a-df-z][^a-df-z]*/gi;
|
|
@@ -2036,7 +2029,7 @@ class CurvePath extends Curve {
|
|
|
2036
2029
|
super();
|
|
2037
2030
|
__publicField$1(this, "curves", []);
|
|
2038
2031
|
__publicField$1(this, "startPoint");
|
|
2039
|
-
__publicField$1(this, "currentPoint"
|
|
2032
|
+
__publicField$1(this, "currentPoint");
|
|
2040
2033
|
__publicField$1(this, "autoClose", false);
|
|
2041
2034
|
__publicField$1(this, "_cacheLengths", []);
|
|
2042
2035
|
if (points) {
|
|
@@ -2134,7 +2127,7 @@ class CurvePath extends Curve {
|
|
|
2134
2127
|
return points;
|
|
2135
2128
|
}
|
|
2136
2129
|
_setCurrentPoint(point) {
|
|
2137
|
-
this.currentPoint
|
|
2130
|
+
this.currentPoint = new Vector2(point.x, point.y);
|
|
2138
2131
|
if (!this.startPoint) {
|
|
2139
2132
|
this.startPoint = this.currentPoint.clone();
|
|
2140
2133
|
}
|
|
@@ -2144,24 +2137,25 @@ class CurvePath extends Curve {
|
|
|
2144
2137
|
const start = this.startPoint;
|
|
2145
2138
|
if (start) {
|
|
2146
2139
|
const end = this.currentPoint;
|
|
2147
|
-
if (!start.equals(end)) {
|
|
2140
|
+
if (end && !start.equals(end)) {
|
|
2148
2141
|
this.curves.push(new LineCurve(end.clone(), start));
|
|
2149
|
-
|
|
2142
|
+
end.copy(start);
|
|
2150
2143
|
}
|
|
2151
2144
|
this.startPoint = void 0;
|
|
2152
2145
|
}
|
|
2153
2146
|
return this;
|
|
2154
2147
|
}
|
|
2155
2148
|
moveTo(x, y) {
|
|
2156
|
-
this.currentPoint
|
|
2149
|
+
this.currentPoint = new Vector2(x, y);
|
|
2157
2150
|
this.startPoint = this.currentPoint.clone();
|
|
2158
2151
|
return this;
|
|
2159
2152
|
}
|
|
2160
2153
|
lineTo(x, y) {
|
|
2161
|
-
|
|
2154
|
+
const start = this.currentPoint;
|
|
2155
|
+
if (!start?.equals({ x, y })) {
|
|
2162
2156
|
this.curves.push(
|
|
2163
2157
|
new LineCurve(
|
|
2164
|
-
|
|
2158
|
+
start?.clone() ?? new Vector2(),
|
|
2165
2159
|
new Vector2(x, y)
|
|
2166
2160
|
)
|
|
2167
2161
|
);
|
|
@@ -2170,10 +2164,11 @@ class CurvePath extends Curve {
|
|
|
2170
2164
|
return this;
|
|
2171
2165
|
}
|
|
2172
2166
|
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {
|
|
2173
|
-
|
|
2167
|
+
const start = this.currentPoint;
|
|
2168
|
+
if (!start?.equals({ x, y })) {
|
|
2174
2169
|
this.curves.push(
|
|
2175
2170
|
new CubicBezierCurve(
|
|
2176
|
-
|
|
2171
|
+
start?.clone() ?? new Vector2(),
|
|
2177
2172
|
new Vector2(cp1x, cp1y),
|
|
2178
2173
|
new Vector2(cp2x, cp2y),
|
|
2179
2174
|
new Vector2(x, y)
|
|
@@ -2184,10 +2179,11 @@ class CurvePath extends Curve {
|
|
|
2184
2179
|
return this;
|
|
2185
2180
|
}
|
|
2186
2181
|
quadraticCurveTo(cpx, cpy, x, y) {
|
|
2187
|
-
|
|
2182
|
+
const start = this.currentPoint;
|
|
2183
|
+
if (!start?.equals({ x, y })) {
|
|
2188
2184
|
this.curves.push(
|
|
2189
2185
|
new QuadraticBezierCurve(
|
|
2190
|
-
|
|
2186
|
+
start?.clone() ?? new Vector2(),
|
|
2191
2187
|
new Vector2(cpx, cpy),
|
|
2192
2188
|
new Vector2(x, y)
|
|
2193
2189
|
)
|
|
@@ -2201,7 +2197,7 @@ class CurvePath extends Curve {
|
|
|
2201
2197
|
return this;
|
|
2202
2198
|
}
|
|
2203
2199
|
relativeArc(x, y, radius, startAngle, endAngle, counterclockwise) {
|
|
2204
|
-
const point = this.currentPoint;
|
|
2200
|
+
const point = this.currentPoint ?? new Vector2();
|
|
2205
2201
|
this.arc(x + point.x, y + point.y, radius, startAngle, endAngle, counterclockwise);
|
|
2206
2202
|
return this;
|
|
2207
2203
|
}
|
|
@@ -2223,7 +2219,7 @@ class CurvePath extends Curve {
|
|
|
2223
2219
|
);
|
|
2224
2220
|
if (this.curves.length > 0) {
|
|
2225
2221
|
const first = curve.getPoint(0);
|
|
2226
|
-
if (!first.equals(this.currentPoint)) {
|
|
2222
|
+
if (!this.currentPoint || !first.equals(this.currentPoint)) {
|
|
2227
2223
|
this.lineTo(first.x, first.y);
|
|
2228
2224
|
}
|
|
2229
2225
|
}
|
|
@@ -2232,7 +2228,7 @@ class CurvePath extends Curve {
|
|
|
2232
2228
|
return this;
|
|
2233
2229
|
}
|
|
2234
2230
|
relativeEllipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, counterclockwise) {
|
|
2235
|
-
const point = this.currentPoint;
|
|
2231
|
+
const point = this.currentPoint ?? new Vector2();
|
|
2236
2232
|
this.ellipse(x + point.x, y + point.y, radiusX, radiusY, rotation, startAngle, endAngle, counterclockwise);
|
|
2237
2233
|
return this;
|
|
2238
2234
|
}
|
|
@@ -2248,7 +2244,8 @@ class CurvePath extends Curve {
|
|
|
2248
2244
|
return this;
|
|
2249
2245
|
}
|
|
2250
2246
|
splineThru(points) {
|
|
2251
|
-
this.
|
|
2247
|
+
const currentPoint = this.currentPoint ?? new Vector2();
|
|
2248
|
+
this.curves.push(new SplineCurve([currentPoint].concat(points)));
|
|
2252
2249
|
this._setCurrentPoint(points[points.length - 1]);
|
|
2253
2250
|
return this;
|
|
2254
2251
|
}
|
|
@@ -2281,7 +2278,7 @@ class CurvePath extends Curve {
|
|
|
2281
2278
|
this.curves.push(source.curves[i].clone());
|
|
2282
2279
|
}
|
|
2283
2280
|
this.autoClose = source.autoClose;
|
|
2284
|
-
this.currentPoint
|
|
2281
|
+
this.currentPoint = source.currentPoint?.clone();
|
|
2285
2282
|
return this;
|
|
2286
2283
|
}
|
|
2287
2284
|
}
|
|
@@ -2365,7 +2362,7 @@ class Path2D {
|
|
|
2365
2362
|
}
|
|
2366
2363
|
moveTo(x, y) {
|
|
2367
2364
|
const { currentPoint, curves } = this.currentPath;
|
|
2368
|
-
if (!currentPoint
|
|
2365
|
+
if (!currentPoint?.equals({ x, y })) {
|
|
2369
2366
|
if (curves.length) {
|
|
2370
2367
|
this.currentPath = new CurvePath().moveTo(x, y);
|
|
2371
2368
|
this.paths.push(this.currentPath);
|
package/dist/index.d.cts
CHANGED
|
@@ -369,7 +369,7 @@ declare class SplineCurve extends Curve {
|
|
|
369
369
|
declare class CurvePath extends Curve {
|
|
370
370
|
curves: Curve[];
|
|
371
371
|
startPoint?: Vector2;
|
|
372
|
-
currentPoint
|
|
372
|
+
currentPoint?: Vector2;
|
|
373
373
|
autoClose: boolean;
|
|
374
374
|
protected _cacheLengths: number[];
|
|
375
375
|
constructor(points?: Vector2[]);
|
|
@@ -408,7 +408,7 @@ declare class CurvePath extends Curve {
|
|
|
408
408
|
}
|
|
409
409
|
|
|
410
410
|
/**
|
|
411
|
-
* @
|
|
411
|
+
* @link https://developer.mozilla.org/zh-CN/docs/Web/API/Path2D
|
|
412
412
|
*/
|
|
413
413
|
declare class Path2D {
|
|
414
414
|
currentPath: CurvePath;
|
|
@@ -464,8 +464,8 @@ declare class Path2D {
|
|
|
464
464
|
declare function addPathCommandsToPath2D(commands: PathCommand[], path: Path2D | CurvePath): void;
|
|
465
465
|
|
|
466
466
|
/**
|
|
467
|
-
* https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes
|
|
468
|
-
* https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion
|
|
467
|
+
* @link https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes
|
|
468
|
+
* @link https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion
|
|
469
469
|
* From
|
|
470
470
|
* rx ry x-axis-rotation large-arc-flag sweep-flag x y
|
|
471
471
|
* To
|
package/dist/index.d.mts
CHANGED
|
@@ -369,7 +369,7 @@ declare class SplineCurve extends Curve {
|
|
|
369
369
|
declare class CurvePath extends Curve {
|
|
370
370
|
curves: Curve[];
|
|
371
371
|
startPoint?: Vector2;
|
|
372
|
-
currentPoint
|
|
372
|
+
currentPoint?: Vector2;
|
|
373
373
|
autoClose: boolean;
|
|
374
374
|
protected _cacheLengths: number[];
|
|
375
375
|
constructor(points?: Vector2[]);
|
|
@@ -408,7 +408,7 @@ declare class CurvePath extends Curve {
|
|
|
408
408
|
}
|
|
409
409
|
|
|
410
410
|
/**
|
|
411
|
-
* @
|
|
411
|
+
* @link https://developer.mozilla.org/zh-CN/docs/Web/API/Path2D
|
|
412
412
|
*/
|
|
413
413
|
declare class Path2D {
|
|
414
414
|
currentPath: CurvePath;
|
|
@@ -464,8 +464,8 @@ declare class Path2D {
|
|
|
464
464
|
declare function addPathCommandsToPath2D(commands: PathCommand[], path: Path2D | CurvePath): void;
|
|
465
465
|
|
|
466
466
|
/**
|
|
467
|
-
* https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes
|
|
468
|
-
* https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion
|
|
467
|
+
* @link https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes
|
|
468
|
+
* @link https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion
|
|
469
469
|
* From
|
|
470
470
|
* rx ry x-axis-rotation large-arc-flag sweep-flag x y
|
|
471
471
|
* To
|
package/dist/index.d.ts
CHANGED
|
@@ -369,7 +369,7 @@ declare class SplineCurve extends Curve {
|
|
|
369
369
|
declare class CurvePath extends Curve {
|
|
370
370
|
curves: Curve[];
|
|
371
371
|
startPoint?: Vector2;
|
|
372
|
-
currentPoint
|
|
372
|
+
currentPoint?: Vector2;
|
|
373
373
|
autoClose: boolean;
|
|
374
374
|
protected _cacheLengths: number[];
|
|
375
375
|
constructor(points?: Vector2[]);
|
|
@@ -408,7 +408,7 @@ declare class CurvePath extends Curve {
|
|
|
408
408
|
}
|
|
409
409
|
|
|
410
410
|
/**
|
|
411
|
-
* @
|
|
411
|
+
* @link https://developer.mozilla.org/zh-CN/docs/Web/API/Path2D
|
|
412
412
|
*/
|
|
413
413
|
declare class Path2D {
|
|
414
414
|
currentPath: CurvePath;
|
|
@@ -464,8 +464,8 @@ declare class Path2D {
|
|
|
464
464
|
declare function addPathCommandsToPath2D(commands: PathCommand[], path: Path2D | CurvePath): void;
|
|
465
465
|
|
|
466
466
|
/**
|
|
467
|
-
* https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes
|
|
468
|
-
* https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion
|
|
467
|
+
* @link https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes
|
|
468
|
+
* @link https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion
|
|
469
469
|
* From
|
|
470
470
|
* rx ry x-axis-rotation large-arc-flag sweep-flag x y
|
|
471
471
|
* To
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(p,C){typeof exports=="object"&&typeof module<"u"?C(exports):typeof define=="function"&&define.amd?define(["exports"],C):(p=typeof globalThis<"u"?globalThis:p||self,C(p.modernPath2d={}))})(this,function(p){"use strict";var ie=Object.defineProperty;var re=(p,C,q)=>C in p?ie(p,C,{enumerable:!0,configurable:!0,writable:!0,value:q}):p[C]=q;var T=(p,C,q)=>re(p,typeof C!="symbol"?C+"":C,q);const C={arcs:"bevel",bevel:"bevel",miter:"miter","miter-clip":"miter",round:"round"};function q(o,e){const{fill:t="#000",stroke:s="none",strokeWidth:i=s==="none"?0:1,strokeLinecap:r="round",strokeLinejoin:n="miter",strokeMiterlimit:c=0,strokeDasharray:h=[],strokeDashoffset:a=0,shadowOffsetX:l=0,shadowOffsetY:y=0,shadowBlur:f=0,shadowColor:d="rgba(0, 0, 0, 0)"}=e;o.fillStyle=t,o.strokeStyle=s,o.lineWidth=i,o.lineCap=r,o.lineJoin=C[n],o.miterLimit=c,o.setLineDash(h),o.lineDashOffset=a,o.shadowOffsetX=l,o.shadowOffsetY=y,o.shadowBlur=f,o.shadowColor=d}class u{constructor(e=0,t=0){this.x=e,this.y=t}static get MAX(){return new u(1/0,1/0)}static get MIN(){return new u(-1/0,-1/0)}get array(){return[this.x,this.y]}set(e,t){return this.x=e,this.y=t,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}divide(e){return this.x/=e.x,this.y/=e.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}rotate(e,t={x:0,y:0}){const s=-e/180*Math.PI,i=this.x-t.x,r=-(this.y-t.y),n=Math.sin(s),c=Math.cos(s);return this.set(t.x+(i*c-r*n),t.y-(i*n+r*c)),this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,s=this.y-e.y;return t*t+s*s}lengthSquared(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.lengthSquared())}scale(e,t=e,s={x:0,y:0}){const i=e<0?s.x-this.x+s.x:this.x,r=t<0?s.y-this.y+s.y:this.y;return this.x=i*Math.abs(e),this.y=r*Math.abs(t),this}skew(e,t=0,s={x:0,y:0}){const i=this.x-s.x,r=this.y-s.y;return this.x=s.x+(i+Math.tan(e)*r),this.y=s.y+(r+Math.tan(t)*i),this}min(...e){return this.x=Math.min(this.x,...e.map(t=>t.x)),this.y=Math.min(this.y,...e.map(t=>t.y)),this}max(...e){return this.x=Math.max(this.x,...e.map(t=>t.x)),this.y=Math.max(this.y,...e.map(t=>t.y)),this}normalize(){return this.scale(1/(this.length()||1))}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this}divideVectors(e,t){return this.x=e.x/t.x,this.y=e.y/t.y,this}lerpVectors(e,t,s){return this.x=e.x+(t.x-e.x)*s,this.y=e.y+(t.y-e.y)*s,this}equals(e){return this.x===e.x&&this.y===e.y}applyMatrix3(e){const t=this.x,s=this.y,i=e.elements;return this.x=i[0]*t+i[3]*s+i[6],this.y=i[1]*t+i[4]*s+i[7],this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new u(this.x,this.y)}}class L{constructor(e=0,t=0,s=0,i=0){this.left=e,this.top=t,this.width=s,this.height=i}get x(){return this.left}set x(e){this.left=e}get y(){return this.top}set y(e){this.top=e}get right(){return this.left+this.width}get bottom(){return this.top+this.height}get center(){return new u((this.left+this.right)/2,(this.top+this.bottom)/2)}get array(){return[this.left,this.top,this.width,this.height]}static from(...e){if(e.length===0)return new L;if(e.length===1)return e[0].clone();const t=e[0],s=e.slice(1).reduce((i,r)=>(i.left=Math.min(i.left,r.left),i.top=Math.min(i.top,r.top),i.right=Math.max(i.right,r.right),i.bottom=Math.max(i.bottom,r.bottom),i),{left:(t==null?void 0:t.left)??0,top:(t==null?void 0:t.top)??0,right:(t==null?void 0:t.right)??0,bottom:(t==null?void 0:t.bottom)??0});return new L(s.left,s.top,s.right-s.left,s.bottom-s.top)}translate(e,t){return this.left+=e,this.top+=t,this}copy(e){return this.left=e.left,this.top=e.top,this.width=e.width,this.height=e.height,this}clone(){return new L(this.left,this.top,this.width,this.height)}}class b{constructor(e=1,t=0,s=0,i=0,r=1,n=0,c=0,h=0,a=1){T(this,"elements",[]);this.set(e,t,s,i,r,n,c,h,a)}set(e,t,s,i,r,n,c,h,a){const l=this.elements;return l[0]=e,l[1]=i,l[2]=c,l[3]=t,l[4]=r,l[5]=h,l[6]=s,l[7]=n,l[8]=a,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,s=e.elements;return t[0]=s[0],t[1]=s[1],t[2]=s[2],t[3]=s[3],t[4]=s[4],t[5]=s[5],t[6]=s[6],t[7]=s[7],t[8]=s[8],this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const s=e.elements,i=t.elements,r=this.elements,n=s[0],c=s[3],h=s[6],a=s[1],l=s[4],y=s[7],f=s[2],d=s[5],g=s[8],x=i[0],m=i[3],w=i[6],E=i[1],v=i[4],S=i[7],N=i[2],z=i[5],D=i[8];return r[0]=n*x+c*E+h*N,r[3]=n*m+c*v+h*z,r[6]=n*w+c*S+h*D,r[1]=a*x+l*E+y*N,r[4]=a*m+l*v+y*z,r[7]=a*w+l*S+y*D,r[2]=f*x+d*E+g*N,r[5]=f*m+d*v+g*z,r[8]=f*w+d*S+g*D,this}invert(){const e=this.elements,t=e[0],s=e[1],i=e[2],r=e[3],n=e[4],c=e[5],h=e[6],a=e[7],l=e[8],y=l*n-c*a,f=c*h-l*r,d=a*r-n*h,g=t*y+s*f+i*d;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);const x=1/g;return e[0]=y*x,e[1]=(i*a-l*s)*x,e[2]=(c*s-i*n)*x,e[3]=f*x,e[4]=(l*t-i*h)*x,e[5]=(i*r-c*t)*x,e[6]=d*x,e[7]=(s*h-a*t)*x,e[8]=(n*t-s*r)*x,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}scale(e,t){return this.premultiply(W.makeScale(e,t)),this}rotate(e){return this.premultiply(W.makeRotation(-e)),this}translate(e,t){return this.premultiply(W.makeTranslation(e,t)),this}makeTranslation(e,t){return this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),s=Math.sin(e);return this.set(t,-s,0,s,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}fromArray(e,t=0){for(let s=0;s<9;s++)this.elements[s]=e[s+t];return this}clone(){return new this.constructor().fromArray(this.elements)}}const W=new b;function K(o,e,t,s){const i=o*t+e*s,r=Math.sqrt(o*o+e*e)*Math.sqrt(t*t+s*s);let n=Math.acos(Math.max(-1,Math.min(1,i/r)));return o*s-e*t<0&&(n=-n),n}function tt(o,e,t,s,i,r,n,c){if(e===0||t===0){o.lineTo(c.x,c.y);return}s=s*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const h=(n.x-c.x)/2,a=(n.y-c.y)/2,l=Math.cos(s)*h+Math.sin(s)*a,y=-Math.sin(s)*h+Math.cos(s)*a;let f=e*e,d=t*t;const g=l*l,x=y*y,m=g/f+x/d;if(m>1){const Ct=Math.sqrt(m);e=Ct*e,t=Ct*t,f=e*e,d=t*t}const w=f*x+d*g,E=(f*d-w)/w;let v=Math.sqrt(Math.max(0,E));i===r&&(v=-v);const S=v*e*y/t,N=-v*t*l/e,z=Math.cos(s)*S-Math.sin(s)*N+(n.x+c.x)/2,D=Math.sin(s)*S+Math.cos(s)*N+(n.y+c.y)/2,U=K(1,0,(l-S)/e,(y-N)/t),J=K((l-S)/e,(y-N)/t,(-l-S)/e,(-y-N)/t)%(Math.PI*2);o.ellipse(z,D,e,t,s,U,U+J,r===1)}function O(o,e){return o-(e-o)}function Y(o,e){const t=new u,s=new u;for(let i=0,r=o.length;i<r;i++){const n=o[i];if(n.type==="m"||n.type==="M")n.type==="m"?t.add(n):t.copy(n),e.moveTo(t.x,t.y),s.copy(t);else if(n.type==="h"||n.type==="H")n.type==="h"?t.x+=n.x:t.x=n.x,e.lineTo(t.x,t.y),s.copy(t);else if(n.type==="v"||n.type==="V")n.type==="v"?t.y+=n.y:t.y=n.y,e.lineTo(t.x,t.y),s.copy(t);else if(n.type==="l"||n.type==="L")n.type==="l"?t.add(n):t.copy(n),e.lineTo(t.x,t.y),s.copy(t);else if(n.type==="c"||n.type==="C")n.type==="c"?(e.bezierCurveTo(t.x+n.x1,t.y+n.y1,t.x+n.x2,t.y+n.y2,t.x+n.x,t.y+n.y),s.x=t.x+n.x2,s.y=t.y+n.y2,t.add(n)):(e.bezierCurveTo(n.x1,n.y1,n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.copy(n));else if(n.type==="s"||n.type==="S")n.type==="s"?(e.bezierCurveTo(O(t.x,s.x),O(t.y,s.y),t.x+n.x2,t.y+n.y2,t.x+n.x,t.y+n.y),s.x=t.x+n.x2,s.y=t.y+n.y2,t.add(n)):(e.bezierCurveTo(O(t.x,s.x),O(t.y,s.y),n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.copy(n));else if(n.type==="q"||n.type==="Q")n.type==="q"?(e.quadraticCurveTo(t.x+n.x1,t.y+n.y1,t.x+n.x,t.y+n.y),s.x=t.x+n.x1,s.y=t.y+n.y1,t.add(n)):(e.quadraticCurveTo(n.x1,n.y1,n.x,n.y),s.x=n.x1,s.y=n.y1,t.copy(n));else if(n.type==="t"||n.type==="T"){const c=O(t.x,s.x),h=O(t.y,s.y);s.x=c,s.y=h,n.type==="t"?(e.quadraticCurveTo(c,h,t.x+n.x,t.y+n.y),t.add(n)):(e.quadraticCurveTo(c,h,n.x,n.y),t.copy(n))}else if(n.type==="a"||n.type==="A"){const c=t.clone();if(n.type==="a"){if(n.x===0&&n.y===0)continue;t.add(n)}else{if(t.equals(n))continue;t.copy(n)}s.copy(t),tt(e,n.rx,n.ry,n.angle,n.largeArcFlag,n.sweepFlag,c,t)}else n.type==="z"||n.type==="Z"?(e.startPoint&&t.copy(e.startPoint),e.closePath()):console.warn("Unsupported commands",n)}}const P={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function A(o,e,t=0){let c=0,h=!0,a="",l="";const y=[];function f(m,w,E){const v=new SyntaxError(`Unexpected character "${m}" at index ${w}.`);throw v.partial=E,v}function d(){a!==""&&(l===""?y.push(Number(a)):y.push(Number(a)*10**Number(l))),a="",l=""}let g;const x=o.length;for(let m=0;m<x;m++){if(g=o[m],Array.isArray(e)&&e.includes(y.length%t)&&P.FLAGS.test(g)){c=1,a=g,d();continue}if(c===0){if(P.WHITESPACE.test(g))continue;if(P.DIGIT.test(g)||P.SIGN.test(g)){c=1,a=g;continue}if(P.POINT.test(g)){c=2,a=g;continue}P.COMMA.test(g)&&(h&&f(g,m,y),h=!0)}if(c===1){if(P.DIGIT.test(g)){a+=g;continue}if(P.POINT.test(g)){a+=g,c=2;continue}if(P.EXP.test(g)){c=3;continue}P.SIGN.test(g)&&a.length===1&&P.SIGN.test(a[0])&&f(g,m,y)}if(c===2){if(P.DIGIT.test(g)){a+=g;continue}if(P.EXP.test(g)){c=3;continue}P.POINT.test(g)&&a[a.length-1]==="."&&f(g,m,y)}if(c===3){if(P.DIGIT.test(g)){l+=g;continue}if(P.SIGN.test(g)){if(l===""){l+=g;continue}l.length===1&&P.SIGN.test(l)&&f(g,m,y)}}P.WHITESPACE.test(g)?(d(),c=0,h=!1):P.COMMA.test(g)?(d(),c=0,h=!0):P.SIGN.test(g)?(d(),c=1,a=g):P.POINT.test(g)?(d(),c=2,a=g):f(g,m,y)}return d(),y}function et(o){const e={x:0,y:0},t={x:0,y:0};let s="";for(let i=0,r=o.length;i<r;i++){const n=o[i];switch(n.type){case"m":case"M":if(n.x===t.x&&n.y===t.y)continue;s+=`${n.type} ${n.x} ${n.y}`,t.x=n.x,t.y=n.y,e.x=n.x,e.y=n.y;break;case"h":case"H":s+=`${n.type} ${n.x}`,t.x=n.x;break;case"v":case"V":s+=`${n.type} ${n.y}`,t.y=n.y;break;case"l":case"L":s+=`${n.type} ${n.x} ${n.y}`,t.x=n.x,t.y=n.y;break;case"c":case"C":s+=`${n.type} ${n.x1} ${n.y1} ${n.x2} ${n.y2} ${n.x} ${n.y}`,t.x=n.x,t.y=n.y;break;case"s":case"S":s+=`${n.type} ${n.x2} ${n.y2} ${n.x} ${n.y}`,t.x=n.x,t.y=n.y;break;case"q":case"Q":s+=`${n.type} ${n.x1} ${n.y1} ${n.x} ${n.y}`,t.x=n.x,t.y=n.y;break;case"t":case"T":s+=`${n.type} ${n.x} ${n.y}`,t.x=n.x,t.y=n.y;break;case"a":case"A":s+=`${n.type} ${n.rx} ${n.ry} ${n.angle} ${n.largeArcFlag} ${n.sweepFlag} ${n.x} ${n.y}`,t.x=n.x,t.y=n.y;break;case"z":case"Z":s+=n.type,t.x=e.x,t.y=e.y;break}}return s}const vt=/[a-df-z][^a-df-z]*/gi;function G(o){const e=[],t=o.match(vt);if(!t)return e;for(let s=0,i=t.length;s<i;s++){const r=t[s],n=r.charAt(0),c=r.slice(1).trim();let h;switch(n){case"m":case"M":h=A(c);for(let a=0,l=h.length;a<l;a+=2)a===0?e.push({type:n,x:h[a],y:h[a+1]}):e.push({type:n==="m"?"l":"L",x:h[a],y:h[a+1]});break;case"h":case"H":h=A(c);for(let a=0,l=h.length;a<l;a++)e.push({type:n,x:h[a]});break;case"v":case"V":h=A(c);for(let a=0,l=h.length;a<l;a++)e.push({type:n,y:h[a]});break;case"l":case"L":h=A(c);for(let a=0,l=h.length;a<l;a+=2)e.push({type:n,x:h[a],y:h[a+1]});break;case"c":case"C":h=A(c);for(let a=0,l=h.length;a<l;a+=6)e.push({type:n,x1:h[a],y1:h[a+1],x2:h[a+2],y2:h[a+3],x:h[a+4],y:h[a+5]});break;case"s":case"S":h=A(c);for(let a=0,l=h.length;a<l;a+=4)e.push({type:n,x2:h[a],y2:h[a+1],x:h[a+2],y:h[a+3]});break;case"q":case"Q":h=A(c);for(let a=0,l=h.length;a<l;a+=4)e.push({type:n,x1:h[a],y1:h[a+1],x:h[a+2],y:h[a+3]});break;case"t":case"T":h=A(c);for(let a=0,l=h.length;a<l;a+=2)e.push({type:n,x:h[a],y:h[a+1]});break;case"a":case"A":h=A(c,[3,4],7);for(let a=0,l=h.length;a<l;a+=7)e.push({type:n,rx:h[a],ry:h[a+1],angle:h[a+2],largeArcFlag:h[a+3],sweepFlag:h[a+4],x:h[a+5],y:h[a+6]});break;case"z":case"Z":e.push({type:n});break;default:console.warn(r)}}return e}class k{constructor(){T(this,"arcLengthDivisions",200);T(this,"_cacheArcLengths");T(this,"_needsUpdate",!1)}isClockwise(){const e=this.getPoint(1),t=this.getPoint(.5),s=this.getPoint(1);return(t.x-e.x)*(s.y-t.y)-(t.y-e.y)*(s.x-t.x)<0}getPointAt(e,t=new u){return this.getPoint(this.getUToTMapping(e),t)}getPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPoint(s/e));return t}forEachControlPoints(e){return this.getControlPoints().forEach(e),this}getSpacedPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPointAt(s/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this._cacheArcLengths&&this._cacheArcLengths.length===e+1&&!this._needsUpdate)return this._cacheArcLengths;this._needsUpdate=!1;const t=[];let s,i=this.getPoint(0),r=0;t.push(0);for(let n=1;n<=e;n++)s=this.getPoint(n/e),r+=s.distanceTo(i),t.push(r),i=s;return this._cacheArcLengths=t,t}updateArcLengths(){this._needsUpdate=!0,this.getLengths()}getUToTMapping(e,t){const s=this.getLengths();let i=0;const r=s.length;let n;t?n=t:n=e*s[r-1];let c=0,h=r-1,a;for(;c<=h;)if(i=Math.floor(c+(h-c)/2),a=s[i]-n,a<0)c=i+1;else if(a>0)h=i-1;else{h=i;break}if(i=h,s[i]===n)return i/(r-1);const l=s[i],f=s[i+1]-l,d=(n-l)/f;return(i+d)/(r-1)}getTangent(e,t=new u){const i=Math.max(0,e-1e-4),r=Math.min(1,e+1e-4);return t.copy(this.getPoint(r).sub(this.getPoint(i)).normalize())}getTangentAt(e,t){return this.getTangent(this.getUToTMapping(e),t)}getNormal(e,t=new u){return this.getTangent(e,t),t.set(-t.y,t.x).normalize()}getNormalAt(e,t){return this.getNormal(this.getUToTMapping(e),t)}getTForPoint(e,t=.001){let s=0,i=1,r=(s+i)/2;for(;i-s>t;){r=(s+i)/2;const n=this.getPoint(r);if(n.distanceTo(e)<t)return r;n.x<e.x?s=r:i=r}return r}matrix(e){return this.forEachControlPoints(t=>t.applyMatrix3(e)),this}getMinMax(e=u.MAX,t=u.MIN){return this.getPoints().forEach(s=>{e.min(s),t.max(s)}),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new L(e.x,e.y,t.x-e.x,t.y-e.y)}toCommands(){return this.getPoints().map((e,t)=>t===0?{type:"M",x:e.x,y:e.y}:{type:"L",x:e.x,y:e.y})}toData(){return et(this.toCommands())}drawTo(e){return this.toCommands().forEach(t=>{switch(t.type){case"M":e.moveTo(t.x,t.y);break;case"L":e.lineTo(t.x,t.y);break}}),this}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}clone(){return new this.constructor().copy(this)}}class F extends k{constructor(e,t,s=0,i=Math.PI*2){super(),this.center=e,this.radius=t,this.start=s,this.end=i}getPoint(e){const{radius:t,center:s}=this;return s.clone().add(this.getNormal(e).clone().scale(t))}getTangent(e,t=new u){const{x:s,y:i}=this.getNormal(e);return t.set(-i,s)}getNormal(e,t=new u){const{start:s,end:i}=this,r=e*(i-s)+s-.5*Math.PI;return t.set(Math.cos(r),Math.sin(r))}getControlPoints(){return[this.center]}getMinMax(e=u.MAX,t=u.MIN){return e.x=Math.min(e.x,this.center.x-this.radius),e.y=Math.min(e.y,this.center.y-this.radius),t.x=Math.max(t.x,this.center.x+this.radius),t.y=Math.max(t.y,this.center.y+this.radius),{min:e,max:t}}}function st(o,e,t,s,i){const r=(s-e)*.5,n=(i-t)*.5,c=o*o,h=o*c;return(2*t-2*s+r+n)*h+(-3*t+3*s-2*r-n)*c+r*o+t}function bt(o,e){const t=1-o;return t*t*e}function At(o,e){return 2*(1-o)*o*e}function kt(o,e){return o*o*e}function nt(o,e,t,s){return bt(o,e)+At(o,t)+kt(o,s)}function It(o,e){const t=1-o;return t*t*t*e}function St(o,e){const t=1-o;return 3*t*t*o*e}function Nt(o,e){return 3*(1-o)*o*o*e}function $t(o,e){return o*o*o*e}function it(o,e,t,s,i){return It(o,e)+St(o,t)+Nt(o,s)+$t(o,i)}class rt extends k{constructor(e=new u,t=new u,s=new u,i=new u){super(),this.start=e,this.startControl=t,this.endControl=s,this.end=i}getPoint(e,t=new u){const{start:s,startControl:i,endControl:r,end:n}=this;return t.set(it(e,s.x,i.x,r.x,n.x),it(e,s.y,i.y,r.y,n.y))}getControlPoints(){return[this.start,this.startControl,this.endControl,this.end]}_solveQuadratic(e,t,s){const i=t*t-4*e*s;if(i<0)return[];const r=Math.sqrt(i),n=(-t+r)/(2*e),c=(-t-r)/(2*e);return[n,c].filter(h=>h>=0&&h<=1)}getMinMax(e=u.MAX,t=u.MIN){const s=this.start,i=this.startControl,r=this.endControl,n=this.end,c=this._solveQuadratic(3*(i.x-s.x),6*(r.x-i.x),3*(n.x-r.x)),h=this._solveQuadratic(3*(i.y-s.y),6*(r.y-i.y),3*(n.y-r.y)),a=[0,1,...c,...h];return((y,f)=>{for(const d of y)for(let g=0;g<=f;g++){const x=g/f-.5,m=Math.min(1,Math.max(0,d+x)),w=this.getPoint(m);e.x=Math.min(e.x,w.x),e.y=Math.min(e.y,w.y),t.x=Math.max(t.x,w.x),t.y=Math.max(t.y,w.y)}})(a,10),{min:e,max:t}}toCommands(){const{start:e,startControl:t,endControl:s,end:i}=this;return[{type:"M",x:e.x,y:e.y},{type:"C",x1:t.x,y1:t.y,x2:s.x,y2:s.y,x:i.x,y:i.y}]}drawTo(e){const{start:t,startControl:s,endControl:i,end:r}=this;return e.lineTo(t.x,t.y),e.bezierCurveTo(s.x,s.y,i.x,i.y,r.x,r.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.startControl.copy(e.startControl),this.endControl.copy(e.endControl),this.end.copy(e.end),this}}const Et=new b,ot=new b,at=new b,_=new u;class ht extends k{constructor(e=new u,t=1,s=1,i=0,r=0,n=Math.PI*2,c=!1){super(),this.center=e,this.radiusX=t,this.radiusY=s,this.rotation=i,this.startAngle=r,this.endAngle=n,this.clockwise=c}isClockwise(){return this.clockwise}getPoint(e,t=new u){const s=Math.PI*2;let i=this.endAngle-this.startAngle;const r=Math.abs(i)<Number.EPSILON;for(;i<0;)i+=s;for(;i>s;)i-=s;i<Number.EPSILON&&(r?i=0:i=s),this.clockwise&&!r&&(i===s?i=-s:i=i-s);const n=this.startAngle+e*i;let c=this.center.x+this.radiusX*Math.cos(n),h=this.center.y+this.radiusY*Math.sin(n);if(this.rotation!==0){const a=Math.cos(this.rotation),l=Math.sin(this.rotation),y=c-this.center.x,f=h-this.center.y;c=y*a-f*l+this.center.x,h=y*l+f*a+this.center.y}return t.set(c,h)}toCommands(){const{center:e,radiusX:t,radiusY:s,startAngle:i,endAngle:r,clockwise:n,rotation:c}=this,{x:h,y:a}=e,l=h+t*Math.cos(i)*Math.cos(c)-s*Math.sin(i)*Math.sin(c),y=a+t*Math.cos(i)*Math.sin(c)+s*Math.sin(i)*Math.cos(c),f=Math.abs(i-r),d=f>Math.PI?1:0,g=n?1:0,x=c*180/Math.PI;if(f>=2*Math.PI){const m=i+Math.PI,w=h+t*Math.cos(m)*Math.cos(c)-s*Math.sin(m)*Math.sin(c),E=a+t*Math.cos(m)*Math.sin(c)+s*Math.sin(m)*Math.cos(c);return[{type:"M",x:l,y},{type:"A",rx:t,ry:s,angle:x,largeArcFlag:0,sweepFlag:g,x:w,y:E},{type:"A",rx:t,ry:s,angle:x,largeArcFlag:0,sweepFlag:g,x:l,y}]}else{const m=h+t*Math.cos(r)*Math.cos(c)-s*Math.sin(r)*Math.sin(c),w=a+t*Math.cos(r)*Math.sin(c)+s*Math.sin(r)*Math.cos(c);return[{type:"M",x:l,y},{type:"A",rx:t,ry:s,angle:x,largeArcFlag:d,sweepFlag:g,x:m,y:w}]}}drawTo(e){const{center:t,radiusX:s,radiusY:i,rotation:r,startAngle:n,endAngle:c,clockwise:h}=this;return e.ellipse(t.x,t.y,s,i,r,n,c,!h),this}matrix(e){return _.set(this.center.x,this.center.y),_.applyMatrix3(e),this.center.x=_.x,this.center.y=_.y,zt(e)?Lt(this,e):qt(this,e),this}getControlPoints(){return[this.center]}getMinMax(e=u.MAX,t=u.MIN){const{center:s,radiusX:i,radiusY:r,rotation:n}=this,{x:c,y:h}=s,a=Math.cos(n),l=Math.sin(n),y=Math.sqrt(i*i*a*a+r*r*l*l),f=Math.sqrt(i*i*l*l+r*r*a*a);return e.x=Math.min(e.x,c-y),e.y=Math.min(e.y,h-f),t.x=Math.max(t.x,c+y),t.y=Math.max(t.y,h+f),{min:e,max:t}}copy(e){return super.copy(e),this.center.x=e.center.x,this.center.y=e.center.y,this.radiusX=e.radiusX,this.radiusY=e.radiusY,this.startAngle=e.startAngle,this.endAngle=e.endAngle,this.clockwise=e.clockwise,this.rotation=e.rotation,this}}function Lt(o,e){const t=o.radiusX,s=o.radiusY,i=Math.cos(o.rotation),r=Math.sin(o.rotation),n=new u(t*i,t*r),c=new u(-s*r,s*i),h=n.applyMatrix3(e),a=c.applyMatrix3(e),l=Et.set(h.x,a.x,0,h.y,a.y,0,0,0,1),y=ot.copy(l).invert(),g=at.copy(y).transpose().multiply(y).elements,x=Dt(g[0],g[1],g[4]),m=Math.sqrt(x.rt1),w=Math.sqrt(x.rt2);if(o.radiusX=1/m,o.radiusY=1/w,o.rotation=Math.atan2(x.sn,x.cs),!((o.endAngle-o.startAngle)%(2*Math.PI)<Number.EPSILON)){const v=ot.set(m,0,0,0,w,0,0,0,1),S=at.set(x.cs,x.sn,0,-x.sn,x.cs,0,0,0,1),N=v.multiply(S).multiply(l),z=D=>{const{x:U,y:J}=new u(Math.cos(D),Math.sin(D)).applyMatrix3(N);return Math.atan2(J,U)};o.startAngle=z(o.startAngle),o.endAngle=z(o.endAngle),ct(e)&&(o.clockwise=!o.clockwise)}}function qt(o,e){const t=lt(e),s=ut(e);o.radiusX*=t,o.radiusY*=s;const i=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);o.rotation+=i,ct(e)&&(o.startAngle*=-1,o.endAngle*=-1,o.clockwise=!o.clockwise)}function ct(o){const e=o.elements;return e[0]*e[4]-e[1]*e[3]<0}function zt(o){const e=o.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const s=lt(o),i=ut(o);return Math.abs(t/(s*i))>Number.EPSILON}function lt(o){const e=o.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function ut(o){const e=o.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function Dt(o,e,t){let s,i,r,n,c;const h=o+t,a=o-t,l=Math.sqrt(a*a+4*e*e);return h>0?(s=.5*(h+l),c=1/s,i=o*c*t-e*c*e):h<0?i=.5*(h-l):(s=.5*l,i=-.5*l),a>0?r=a+l:r=a-l,Math.abs(r)>2*Math.abs(e)?(c=-2*e/r,n=1/Math.sqrt(1+c*c),r=c*n):Math.abs(e)===0?(r=1,n=0):(c=-.5*r/e,r=1/Math.sqrt(1+c*c),n=c*r),a>0&&(c=r,r=-n,n=c),{rt1:s,rt2:i,cs:r,sn:n}}class X extends k{constructor(e=new u,t=new u){super(),this.start=e,this.end=t}getPoint(e,t=new u){return e===1?t.copy(this.end):t.copy(this.end).sub(this.start).scale(e).add(this.start),t}getPointAt(e,t=new u){return this.getPoint(e,t)}getTangent(e,t=new u){return t.subVectors(this.end,this.start).normalize()}getTangentAt(e,t=new u){return this.getTangent(e,t)}getControlPoints(){return[this.start,this.end]}getMinMax(e=u.MAX,t=u.MIN){const{start:s,end:i}=this;return e.x=Math.min(e.x,s.x,i.x),e.y=Math.min(e.y,s.y,i.y),t.x=Math.max(t.x,s.x,i.x),t.y=Math.max(t.y,s.y,i.y),{min:e,max:t}}toCommands(){const{start:e,end:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}drawTo(e){const{start:t,end:s}=this;return e.lineTo(t.x,t.y),e.lineTo(s.x,s.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.end.copy(e.end),this}}class Xt extends k{constructor(t,s,i=0,r=1){super();T(this,"curveT",0);this.center=t,this.size=s,this.start=i,this.end=r,this.update()}update(){const{x:t,y:s}=this.center,i=new u(t+.5*this.size,s-.5*this.size),r=new u(t-.5*this.size,s-.5*this.size),n=new u(t,s+.5*this.size),c=new F(i,Math.SQRT1_2*this.size,-.25*Math.PI,.75*Math.PI),h=new F(r,Math.SQRT1_2*this.size,-.75*Math.PI,.25*Math.PI),a=new F(n,.5*Math.SQRT1_2*this.size,.75*Math.PI,1.25*Math.PI),l=new u(t,s+this.size),y=new u(t+this.size,s),f=new u().lerpVectors(y,l,.75),d=new u(t-this.size,s),g=new u().lerpVectors(d,l,.75),x=new X(y,f),m=new X(g,d);return this.curves=[c,x,a,m,h],this}getPoint(t){return this.getCurve(t).getPoint(this.curveT)}getPointAt(t){return this.getPoint(t)}getCurve(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=9*Math.PI/8+1.5;let i;const r=.5*Math.PI;return s<r?(i=0,this.curveT=s/r):s<r+.75?(i=1,this.curveT=(s-r)/.75):s<5*Math.PI/8+.75?(i=2,this.curveT=(s-r-.75)/(Math.PI/8)):s<5*Math.PI/8+1.5?(i=3,this.curveT=(s-5*Math.PI/8-.75)/.75):(i=4,this.curveT=(s-5*Math.PI/8-1.5)/r),this.curves[i]}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}toCommands(){return this.curves.flatMap(t=>t.toCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class Ot extends k{constructor(t,s=0,i=0,r=0,n=1){super();T(this,"curves",[]);T(this,"curveT",0);T(this,"points",[]);this.center=t,this.radius=s,this.number=i,this.start=r,this.end=n,this.update()}update(){for(let t=0;t<this.number;t++){let s=t*2*Math.PI/this.number;s-=.5*Math.PI,this.points.push(new u(this.radius*Math.cos(s),this.radius*Math.sin(s)).add(this.center))}for(let t=0;t<this.number;t++)this.curves.push(new X(this.points[t],this.points[(t+1)%this.number]));return this}getCurve(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1);const i=s*this.number,r=Math.floor(i);return this.curveT=i-r,this.curves[r]}getPoint(t,s){return this.getCurve(t).getPoint(this.curveT,s)}getPointAt(t,s){return this.getPoint(t,s)}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}toCommands(){return this.curves.flatMap(t=>t.toCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class yt extends k{constructor(e=new u,t=new u,s=new u){super(),this.start=e,this.control=t,this.end=s}getPoint(e,t=new u){const{start:s,control:i,end:r}=this;return t.set(nt(e,s.x,i.x,r.x),nt(e,s.y,i.y,r.y)),t}getControlPoints(){return[this.start,this.control,this.end]}getMinMax(e=u.MAX,t=u.MIN){const{start:s,control:i,end:r}=this,n=.5*(s.x+i.x),c=.5*(s.y+i.y),h=.5*(s.x+r.x),a=.5*(s.y+r.y);return e.x=Math.min(e.x,s.x,r.x,n,h),e.y=Math.min(e.y,s.y,r.y,c,a),t.x=Math.max(t.x,s.x,r.x,n,h),t.y=Math.max(t.y,s.y,r.y,c,a),{min:e,max:t}}toCommands(){const{start:e,control:t,end:s}=this;return[{type:"M",x:e.x,y:e.y},{type:"Q",x1:t.x,y1:t.y,x:s.x,y:s.y}]}drawTo(e){const{start:t,control:s,end:i}=this;return e.lineTo(t.x,t.y),e.quadraticCurveTo(s.x,s.y,i.x,i.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.control.copy(e.control),this.end.copy(e.end),this}}class gt extends k{constructor(t,s,i=1,r=0,n=1){super();T(this,"curves",[]);T(this,"curveT",0);this.center=t,this.rx=s,this.aspectRatio=i,this.start=r,this.end=n,this.update()}get x(){return this.center.x-this.rx}get y(){return this.center.y-this.rx/this.aspectRatio}get width(){return this.rx*2}get height(){return this.rx/this.aspectRatio*2}update(){const{x:t,y:s}=this.center,i=this.rx,r=this.rx/this.aspectRatio,n=[new u(t-i,s-r),new u(t+i,s-r),new u(t+i,s+r),new u(t-i,s+r)];for(let c=0;c<4;c++)this.curves.push(new X(n[c].clone(),n[(c+1)%4].clone()));return this}getCurve(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=(1+this.aspectRatio)*2;let i;return s<this.aspectRatio?(i=0,this.curveT=s/this.aspectRatio):s<this.aspectRatio+1?(i=1,this.curveT=(s-this.aspectRatio)/1):s<2*this.aspectRatio+1?(i=2,this.curveT=(s-this.aspectRatio-1)/this.aspectRatio):(i=3,this.curveT=(s-2*this.aspectRatio-1)/1),this.curves[i]}getPoint(t,s){return this.getCurve(t).getPoint(this.curveT,s)}getPointAt(t,s){return this.getPoint(t,s)}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}toCommands(){return this.curves.flatMap(t=>t.toCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class ft extends k{constructor(e=[]){super(),this.points=e}getPoint(e,t=new u){const{points:s}=this,i=(s.length-1)*e,r=Math.floor(i),n=i-r,c=s[r===0?r:r-1],h=s[r],a=s[r>s.length-2?s.length-1:r+1],l=s[r>s.length-3?s.length-1:r+2];return t.set(st(n,c.x,h.x,a.x,l.x),st(n,c.y,h.y,a.y,l.y)),t}getControlPoints(){return this.points}copy(e){super.copy(e),this.points=[];for(let t=0,s=e.points.length;t<s;t++)this.points.push(e.points[t].clone());return this}}class R extends k{constructor(t){super();T(this,"curves",[]);T(this,"startPoint");T(this,"currentPoint",new u);T(this,"autoClose",!1);T(this,"_cacheLengths",[]);t&&this.addPoints(t)}addCurve(t){return this.curves.push(t),this}addPoints(t){this.moveTo(t[0].x,t[0].y);for(let s=1,i=t.length;s<i;s++){const{x:r,y:n}=t[s];this.lineTo(r,n)}return this}addCommands(t){return Y(t,this),this}addData(t){return this.addCommands(G(t)),this}getPoint(t,s=new u){const i=t*this.getLength(),r=this.getCurveLengths();let n=0;for(;n<r.length;){if(r[n]>=i){const c=r[n]-i,h=this.curves[n],a=h.getLength();return h.getPointAt(a===0?0:1-c/a,s)}n++}return s}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){super.updateArcLengths(),this._cacheLengths=[],this.getCurveLengths()}getCurveLengths(){if(this._cacheLengths.length===this.curves.length)return this._cacheLengths;const t=[];let s=0;for(let i=0,r=this.curves.length;i<r;i++)s+=this.curves[i].getLength(),t.push(s);return this._cacheLengths=t,t}getSpacedPoints(t=40){const s=[];for(let i=0;i<=t;i++)s.push(this.getPoint(i/t));return this.autoClose&&s.push(s[0]),s}getPoints(t=12){const s=[],i=this.curves;let r;for(let n=0,c=i.length;n<c;n++){const a=i[n].getPoints(t);for(let l=0;l<a.length;l++){const y=a[l];r!=null&&r.equals(y)||(s.push(y),r=y)}}return this.autoClose&&s.length>1&&!s[s.length-1].equals(s[0])&&s.push(s[0]),s}_setCurrentPoint(t){return this.currentPoint.copy(t),this.startPoint||(this.startPoint=this.currentPoint.clone()),this}closePath(){const t=this.startPoint;if(t){const s=this.currentPoint;t.equals(s)||(this.curves.push(new X(s.clone(),t)),this.currentPoint.copy(t)),this.startPoint=void 0}return this}moveTo(t,s){return this.currentPoint.set(t,s),this.startPoint=this.currentPoint.clone(),this}lineTo(t,s){return this.currentPoint.equals({x:t,y:s})||this.curves.push(new X(this.currentPoint.clone(),new u(t,s))),this._setCurrentPoint({x:t,y:s}),this}bezierCurveTo(t,s,i,r,n,c){return this.currentPoint.equals({x:n,y:c})||this.curves.push(new rt(this.currentPoint.clone(),new u(t,s),new u(i,r),new u(n,c))),this._setCurrentPoint({x:n,y:c}),this}quadraticCurveTo(t,s,i,r){return this.currentPoint.equals({x:i,y:r})||this.curves.push(new yt(this.currentPoint.clone(),new u(t,s),new u(i,r))),this._setCurrentPoint({x:i,y:r}),this}arc(t,s,i,r,n,c){return this.ellipse(t,s,i,i,0,r,n,c),this}relativeArc(t,s,i,r,n,c){const h=this.currentPoint;return this.arc(t+h.x,s+h.y,i,r,n,c),this}arcTo(t,s,i,r,n){return console.warn("Method arcTo not supported yet"),this}ellipse(t,s,i,r,n,c,h,a=!0){const l=new ht(new u(t,s),i,r,n,c,h,!a);if(this.curves.length>0){const y=l.getPoint(0);y.equals(this.currentPoint)||this.lineTo(y.x,y.y)}return this.curves.push(l),this._setCurrentPoint(l.getPoint(1)),this}relativeEllipse(t,s,i,r,n,c,h,a){const l=this.currentPoint;return this.ellipse(t+l.x,s+l.y,i,r,n,c,h,a),this}rect(t,s,i,r){return this.curves.push(new gt(new u(t+i/2,s+r/2),i/2,i/r)),this._setCurrentPoint({x:t,y:s}),this}splineThru(t){return this.curves.push(new ft([this.currentPoint.clone()].concat(t))),this._setCurrentPoint(t[t.length-1]),this}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}getBoundingBox(){const{min:t,max:s}=this.getMinMax();return new L(t.x,t.y,s.x-t.x,s.y-t.y)}toCommands(){return this.curves.flatMap(t=>t.toCommands())}drawTo(t){var i;const s=(i=this.curves[0])==null?void 0:i.getPoint(0);return s&&t.moveTo(s.x,s.y),this.curves.forEach(r=>r.drawTo(t)),this.autoClose&&t.closePath(),this}copy(t){super.copy(t),this.curves=[];for(let s=0,i=t.curves.length;s<i;s++)this.curves.push(t.curves[s].clone());return this.autoClose=t.autoClose,this.currentPoint.copy(t.currentPoint),this}}function Rt(o){return o.replace(/[^a-z0-9]/gi,"-").replace(/\B([A-Z])/g,"-$1").toLowerCase()}function Ft(o,e,t,s){const i=e.clone().sub(o),r=s.clone().sub(t),n=t.clone().sub(o),c=i.cross(r);if(c===0)return new u((o.x+t.x)/2,(o.y+t.y)/2);const h=n.cross(r)/c;return Math.abs(h)>1?new u((o.x+t.x)/2,(o.y+t.y)/2):new u(o.x+h*i.x,o.y+h*i.y)}class I{constructor(e,t={}){T(this,"currentPath",new R);T(this,"paths",[this.currentPath]);T(this,"style");e&&(e instanceof I?this.addPath(e):Array.isArray(e)?this.addCommands(e):this.addData(e)),this.style=t}get startPoint(){return this.currentPath.startPoint}get currentPoint(){return this.currentPath.currentPoint}get strokeWidth(){return this.style.strokeWidth??((this.style.stroke??"none")==="none"?0:1)}addPath(e){return e instanceof I?this.paths.push(...e.paths.map(t=>t.clone())):this.paths.push(e),this}closePath(){const e=this.startPoint;return e&&(this.currentPath.closePath(),this.currentPath.curves.length>0&&(this.currentPath=new R().moveTo(e.x,e.y),this.paths.push(this.currentPath))),this}moveTo(e,t){const{currentPoint:s,curves:i}=this.currentPath;return s.equals({x:e,y:t})||(i.length?(this.currentPath=new R().moveTo(e,t),this.paths.push(this.currentPath)):this.currentPath.moveTo(e,t)),this}lineTo(e,t){return this.currentPath.lineTo(e,t),this}bezierCurveTo(e,t,s,i,r,n){return this.currentPath.bezierCurveTo(e,t,s,i,r,n),this}quadraticCurveTo(e,t,s,i){return this.currentPath.quadraticCurveTo(e,t,s,i),this}arc(e,t,s,i,r,n){return this.currentPath.arc(e,t,s,i,r,n),this}arcTo(e,t,s,i,r){return this.currentPath.arcTo(e,t,s,i,r),this}ellipse(e,t,s,i,r,n,c,h){return this.currentPath.ellipse(e,t,s,i,r,n,c,h),this}rect(e,t,s,i){return this.currentPath.rect(e,t,s,i),this}addCommands(e){return Y(e,this),this}addData(e){return this.addCommands(G(e)),this}splineThru(e){return this.currentPath.splineThru(e),this}getControlPoints(){return this.paths.flatMap(e=>e.getControlPoints())}getCurves(){return this.paths.flatMap(e=>e.curves)}scale(e,t=e,s={x:0,y:0}){return this.getControlPoints().forEach(i=>{i.scale(e,t,s)}),this}skew(e,t=0,s={x:0,y:0}){return this.getControlPoints().forEach(i=>{i.skew(e,t,s)}),this}rotate(e,t={x:0,y:0}){return this.getControlPoints().forEach(s=>{s.rotate(e,t)}),this}bold(e){if(e===0)return this;const t=this.getCurves(),s=[],i=[],r=[];t.forEach((c,h)=>{const a=c.getControlPoints(),l=c.isClockwise();r[h]=a,i[h]=l;const y=a[0],f=a[a.length-1]??y;s.push({start:l?f:y,end:l?y:f,index:h})});const n=[];return s.forEach((c,h)=>{n[h]=[],s.forEach((a,l)=>{l!==h&&a.start.equals(c.end)&&n[h].push(a.index)})}),t.forEach((c,h)=>{const a=i[h];r[h].forEach(y=>{const f=c.getTForPoint(y),d=c.getNormal(f).scale(a?e:-e);y.add(d)})}),n.forEach((c,h)=>{const a=r[h];c.forEach(l=>{const y=r[l],f=Ft(a[a.length-1],a[a.length-2]??a[a.length-1],y[0],y[1]??y[0]);f&&(a[a.length-1].copy(f),y[0].copy(f))})}),this}matrix(e){return this.getCurves().forEach(t=>t.matrix(e)),this}getMinMax(e=u.MAX,t=u.MIN,s=!0){const i=this.strokeWidth;return this.getCurves().forEach(r=>{if(r.getMinMax(e,t),s&&i>1){const n=i/2,c=r.isClockwise(),h=[];for(let a=0;a<=1;a+=1/r.arcLengthDivisions){const l=r.getPoint(a),y=r.getNormal(a),f=y.clone().scale(c?n:-n),d=y.clone().scale(c?-n:n);h.push(l.clone().add(f),l.clone().add(d),l.clone().add({x:n,y:0}),l.clone().add({x:-n,y:0}),l.clone().add({x:0,y:n}),l.clone().add({x:0,y:-n}),l.clone().add({x:n,y:n}),l.clone().add({x:-n,y:-n}))}e.min(...h),t.max(...h)}}),{min:e,max:t}}getBoundingBox(e=!0){const{min:t,max:s}=this.getMinMax(void 0,void 0,e);return new L(t.x,t.y,s.x-t.x,s.y-t.y)}drawTo(e,t={}){t={...this.style,...t};const{fill:s="#000",stroke:i="none"}=t;return e.beginPath(),e.save(),q(e,t),this.paths.forEach(r=>{r.drawTo(e)}),s!=="none"&&e.fill(),i!=="none"&&e.stroke(),e.restore(),this}drawControlPointsTo(e,t={}){t={...this.style,...t};const{fill:s="#000",stroke:i="none"}=t;return e.beginPath(),e.save(),q(e,t),this.getControlPoints().forEach(r=>{e.moveTo(r.x,r.y),e.arc(r.x,r.y,4,0,Math.PI*2)}),s!=="none"&&e.fill(),i!=="none"&&e.stroke(),e.restore(),this}toCommands(){return this.paths.flatMap(e=>e.toCommands())}toData(){return this.paths.map(e=>e.toData()).join(" ")}toSvgPathString(){const e={...this.style,fill:this.style.fill??"#000",stroke:this.style.stroke??"none"},t={};for(const i in e)e[i]!==void 0&&(t[Rt(i)]=e[i]);Object.assign(t,{"stroke-width":`${this.strokeWidth}px`});let s="";for(const i in t)t[i]!==void 0&&(s+=`${i}:${t[i]};`);return`<path d="${this.toData()}" style="${s}"></path>`}toSvgString(){const{x:e,y:t,width:s,height:i}=this.getBoundingBox(),r=this.toSvgPathString();return`<svg viewBox="${e} ${t} ${s} ${i}" width="${s}px" height="${i}px" xmlns="http://www.w3.org/2000/svg">${r}</svg>`}toSvgUrl(){return`data:image/svg+xml;base64,${btoa(this.toSvgString())}`}toSvg(){return new DOMParser().parseFromString(this.toSvgString(),"image/svg+xml").documentElement}toCanvas(e={}){const{pixelRatio:t=2,...s}=e,{left:i,top:r,width:n,height:c}=this.getBoundingBox(),h=document.createElement("canvas");h.width=n*t,h.height=c*t,h.style.width=`${n}px`,h.style.height=`${c}px`;const a=h.getContext("2d");return a&&(a.scale(t,t),a.translate(-i,-r),this.drawTo(a,s)),h}copy(e){return this.currentPath=e.currentPath.clone(),this.paths=e.paths.map(t=>t.clone()),this.style={...e.style},this}clone(){return new this.constructor().copy(this)}}const Q="px",pt=90,dt=["mm","cm","in","pt","pc","px"],V={mm:{mm:1,cm:.1,in:1/25.4,pt:72/25.4,pc:6/25.4,px:-1},cm:{mm:10,cm:1,in:1/2.54,pt:72/2.54,pc:6/2.54,px:-1},in:{mm:25.4,cm:2.54,in:1,pt:72,pc:6,px:-1},pt:{mm:25.4/72,cm:2.54/72,in:1/72,pt:1,pc:6/72,px:-1},pc:{mm:25.4/6,cm:2.54/6,in:1/6,pt:72/6,pc:1,px:-1},px:{px:1}};function M(o){let e="px";if(typeof o=="string"||o instanceof String)for(let s=0,i=dt.length;s<i;s++){const r=dt[s];if(o.endsWith(r)){e=r,o=o.substring(0,o.length-r.length);break}}let t;return e==="px"&&Q!=="px"?t=V.in[Q]/pt:(t=V[e][Q],t<0&&(t=V[e].in*pt)),t*Number.parseFloat(o)}const _t=new b,B=new b,xt=new b,mt=new b;function Bt(o,e,t){if(!(o.hasAttribute("transform")||o.nodeName==="use"&&(o.hasAttribute("x")||o.hasAttribute("y"))))return null;const s=Ut(o);return t.length>0&&s.premultiply(t[t.length-1]),e.copy(s),t.push(s),s}function Ut(o){const e=new b,t=_t;if(o.nodeName==="use"&&(o.hasAttribute("x")||o.hasAttribute("y"))&&e.translate(M(o.getAttribute("x")),M(o.getAttribute("y"))),o.hasAttribute("transform")){const s=o.getAttribute("transform").split(")");for(let i=s.length-1;i>=0;i--){const r=s[i].trim();if(r==="")continue;const n=r.indexOf("("),c=r.length;if(n>0&&n<c){const h=r.slice(0,n),a=A(r.slice(n+1));switch(t.identity(),h){case"translate":if(a.length>=1){const l=a[0];let y=0;a.length>=2&&(y=a[1]),t.translate(l,y)}break;case"rotate":if(a.length>=1){let l=0,y=0,f=0;l=a[0]*Math.PI/180,a.length>=3&&(y=a[1],f=a[2]),B.makeTranslation(-y,-f),xt.makeRotation(l),mt.multiplyMatrices(xt,B),B.makeTranslation(y,f),t.multiplyMatrices(B,mt)}break;case"scale":a.length>=1&&t.scale(a[0],a[1]??a[0]);break;case"skewX":a.length===1&&t.set(1,Math.tan(a[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":a.length===1&&t.set(1,0,0,Math.tan(a[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":a.length===6&&t.set(a[0],a[2],a[4],a[1],a[3],a[5],0,0,1);break}}e.premultiply(t)}}return e}function Wt(o){return new I().addPath(new R().arc(M(o.getAttribute("cx")||0),M(o.getAttribute("cy")||0),M(o.getAttribute("r")||0),0,Math.PI*2))}function Yt(o,e){if(!(!o.sheet||!o.sheet.cssRules||!o.sheet.cssRules.length))for(let t=0;t<o.sheet.cssRules.length;t++){const s=o.sheet.cssRules[t];if(s.type!==1)continue;const i=s.selectorText.split(/,/g).filter(Boolean).map(n=>n.trim()),r={};for(let n=s.style.length,c=0;c<n;c++){const h=s.style.item(c);r[h]=s.style.getPropertyValue(h)}for(let n=0;n<i.length;n++)e[i[n]]=Object.assign(e[i[n]]||{},{...r})}}function Gt(o){return new I().addPath(new R().ellipse(M(o.getAttribute("cx")||0),M(o.getAttribute("cy")||0),M(o.getAttribute("rx")||0),M(o.getAttribute("ry")||0),0,0,Math.PI*2))}function Qt(o){return new I().moveTo(M(o.getAttribute("x1")||0),M(o.getAttribute("y1")||0)).lineTo(M(o.getAttribute("x2")||0),M(o.getAttribute("y2")||0))}function Vt(o){const e=new I,t=o.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const jt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Ht(o){var s;const e=new I;let t=0;return(s=o.getAttribute("points"))==null||s.replace(jt,(i,r,n)=>{const c=M(r),h=M(n);return t===0?e.moveTo(c,h):e.lineTo(c,h),t++,i}),e.currentPath.autoClose=!0,e}const Zt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Jt(o){var s;const e=new I;let t=0;return(s=o.getAttribute("points"))==null||s.replace(Zt,(i,r,n)=>{const c=M(r),h=M(n);return t===0?e.moveTo(c,h):e.lineTo(c,h),t++,i}),e.currentPath.autoClose=!1,e}function Kt(o){const e=M(o.getAttribute("x")||0),t=M(o.getAttribute("y")||0),s=M(o.getAttribute("rx")||o.getAttribute("ry")||0),i=M(o.getAttribute("ry")||o.getAttribute("rx")||0),r=M(o.getAttribute("width")),n=M(o.getAttribute("height")),c=1-.551915024494,h=new I;return h.moveTo(e+s,t),h.lineTo(e+r-s,t),(s!==0||i!==0)&&h.bezierCurveTo(e+r-s*c,t,e+r,t+i*c,e+r,t+i),h.lineTo(e+r,t+n-i),(s!==0||i!==0)&&h.bezierCurveTo(e+r,t+n-i*c,e+r-s*c,t+n,e+r-s,t+n),h.lineTo(e+s,t+n),(s!==0||i!==0)&&h.bezierCurveTo(e+s*c,t+n,e,t+n-i*c,e,t+n-i),h.lineTo(e,t+i),(s!==0||i!==0)&&h.bezierCurveTo(e,t+i*c,e+s*c,t,e+s,t),h}function $(o,e,t){e=Object.assign({},e);let s={};if(o.hasAttribute("class")){const a=o.getAttribute("class").split(/\s/).filter(Boolean).map(l=>l.trim());for(let l=0;l<a.length;l++)s=Object.assign(s,t[`.${a[l]}`])}o.hasAttribute("id")&&(s=Object.assign(s,t[`#${o.getAttribute("id")}`]));for(let a=o.style.length,l=0;l<a;l++){const y=o.style.item(l),f=o.style.getPropertyValue(y);e[y]=f,s[y]=f}function i(a,l,y=r){o.hasAttribute(a)&&(e[l]=y(o.getAttribute(a))),s[a]&&(e[l]=y(s[a]))}function r(a){return a.startsWith("url")&&console.warn("url access in attributes is not implemented."),a}function n(a){return Math.max(0,Math.min(1,M(a)))}function c(a){return Math.max(0,M(a))}function h(a){return a.split(" ").filter(l=>l!=="").map(l=>M(l))}return i("fill","fill"),i("fill-opacity","fillOpacity",n),i("fill-rule","fillRule"),i("opacity","opacity",n),i("stroke","stroke"),i("stroke-opacity","strokeOpacity",n),i("stroke-width","strokeWidth",c),i("stroke-linecap","strokeLinecap"),i("stroke-linejoin","strokeLinejoin"),i("stroke-miterlimit","strokeMiterlimit",c),i("stroke-dasharray","strokeDasharray",h),i("stroke-dashoffset","strokeDashoffset",M),i("visibility","visibility"),e}function j(o,e,t=[],s={}){var y;if(o.nodeType!==1)return t;let i=!1,r=null,n={...e};switch(o.nodeName){case"svg":n=$(o,n,s);break;case"style":Yt(o,s);break;case"g":n=$(o,n,s);break;case"path":n=$(o,n,s),o.hasAttribute("d")&&(r=Vt(o));break;case"rect":n=$(o,n,s),r=Kt(o);break;case"polygon":n=$(o,n,s),r=Ht(o);break;case"polyline":n=$(o,n,s),r=Jt(o);break;case"circle":n=$(o,n,s),r=Wt(o);break;case"ellipse":n=$(o,n,s),r=Gt(o);break;case"line":n=$(o,n,s),r=Qt(o);break;case"defs":i=!0;break;case"use":{n=$(o,n,s);const d=(o.getAttributeNS("http://www.w3.org/1999/xlink","href")||"").substring(1),g=(y=o.viewportElement)==null?void 0:y.getElementById(d);g?j(g,n,t,s):console.warn(`'use node' references non-existent node id: ${d}`);break}default:console.warn(o);break}if(n.display==="none")return t;Object.assign(e,n);const c=new b,h=[],a=Bt(o,c,h);r&&(r.matrix(c),t.push(r),r.style=e);const l=o.childNodes;for(let f=0,d=l.length;f<d;f++){const g=l[f];i&&g.nodeName!=="style"&&g.nodeName!=="defs"||j(g,e,t,s)}return a&&(h.pop(),h.length>0?c.copy(h[h.length-1]):c.identity()),t}const Mt="data:image/svg+xml;",Pt=`${Mt}base64,`,wt=`${Mt}charset=utf8,`;function Tt(o){if(typeof o=="string"){let e;return o.startsWith(Pt)?(o=o.substring(Pt.length,o.length),e=atob(o)):o.startsWith(wt)?(o=o.substring(wt.length,o.length),e=decodeURIComponent(o)):e=o,new DOMParser().parseFromString(e,"image/svg+xml").documentElement}else return o}function te(o){return j(Tt(o),{})}function H(o,e=!0){if(!o.length)return;const t=u.MAX,s=u.MIN;return o.forEach(i=>i.getMinMax(t,s,e)),new L(t.x,t.y,s.x-t.x,s.y-t.y)}function Z(o){const{x:e,y:t,width:s,height:i}=H(o),r=o.map(n=>n.toSvgPathString()).join("");return`<svg viewBox="${e} ${t} ${s} ${i}" width="${s}px" height="${i}px" xmlns="http://www.w3.org/2000/svg">${r}</svg>`}function ee(o){return`data:image/svg+xml;base64,${btoa(Z(o))}`}function se(o){return new DOMParser().parseFromString(Z(o),"image/svg+xml").documentElement}function ne(o,e={}){const{pixelRatio:t=2,...s}=e,{left:i,top:r,width:n,height:c}=H(o),h=document.createElement("canvas");h.width=n*t,h.height=c*t,h.style.width=`${n}px`,h.style.height=`${c}px`;const a=h.getContext("2d");return a&&(a.scale(t,t),a.translate(-i,-r),o.forEach(l=>{l.drawTo(a,s)})),h}p.BoundingBox=L,p.CircleCurve=F,p.CubicBezierCurve=rt,p.Curve=k,p.CurvePath=R,p.EllipseCurve=ht,p.HeartCurve=Xt,p.LineCurve=X,p.Matrix3=b,p.Path2D=I,p.PloygonCurve=Ot,p.QuadraticBezierCurve=yt,p.RectangularCurve=gt,p.SplineCurve=ft,p.Vector2=u,p.addPathCommandsToPath2D=Y,p.getPathsBoundingBox=H,p.parseArcCommand=tt,p.parsePathDataArgs=A,p.parseSvg=te,p.parseSvgToDom=Tt,p.pathCommandsToPathData=et,p.pathDataToPathCommands=G,p.pathsToCanvas=ne,p.pathsToSvg=se,p.pathsToSvgString=Z,p.pathsToSvgUrl=ee,p.setCanvasContext=q,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})});
|
|
1
|
+
(function(p,C){typeof exports=="object"&&typeof module<"u"?C(exports):typeof define=="function"&&define.amd?define(["exports"],C):(p=typeof globalThis<"u"?globalThis:p||self,C(p.modernPath2d={}))})(this,function(p){"use strict";var ie=Object.defineProperty;var re=(p,C,q)=>C in p?ie(p,C,{enumerable:!0,configurable:!0,writable:!0,value:q}):p[C]=q;var T=(p,C,q)=>re(p,typeof C!="symbol"?C+"":C,q);const C={arcs:"bevel",bevel:"bevel",miter:"miter","miter-clip":"miter",round:"round"};function q(o,e){const{fill:t="#000",stroke:s="none",strokeWidth:i=s==="none"?0:1,strokeLinecap:r="round",strokeLinejoin:n="miter",strokeMiterlimit:c=0,strokeDasharray:a=[],strokeDashoffset:h=0,shadowOffsetX:l=0,shadowOffsetY:y=0,shadowBlur:f=0,shadowColor:d="rgba(0, 0, 0, 0)"}=e;o.fillStyle=t,o.strokeStyle=s,o.lineWidth=i,o.lineCap=r,o.lineJoin=C[n],o.miterLimit=c,o.setLineDash(a),o.lineDashOffset=h,o.shadowOffsetX=l,o.shadowOffsetY=y,o.shadowBlur=f,o.shadowColor=d}class u{constructor(e=0,t=0){this.x=e,this.y=t}static get MAX(){return new u(1/0,1/0)}static get MIN(){return new u(-1/0,-1/0)}get array(){return[this.x,this.y]}set(e,t){return this.x=e,this.y=t,this}add(e){return this.x+=e.x,this.y+=e.y,this}sub(e){return this.x-=e.x,this.y-=e.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}divide(e){return this.x/=e.x,this.y/=e.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}rotate(e,t={x:0,y:0}){const s=-e/180*Math.PI,i=this.x-t.x,r=-(this.y-t.y),n=Math.sin(s),c=Math.cos(s);return this.set(t.x+(i*c-r*n),t.y-(i*n+r*c)),this}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,s=this.y-e.y;return t*t+s*s}lengthSquared(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.lengthSquared())}scale(e,t=e,s={x:0,y:0}){const i=e<0?s.x-this.x+s.x:this.x,r=t<0?s.y-this.y+s.y:this.y;return this.x=i*Math.abs(e),this.y=r*Math.abs(t),this}skew(e,t=0,s={x:0,y:0}){const i=this.x-s.x,r=this.y-s.y;return this.x=s.x+(i+Math.tan(e)*r),this.y=s.y+(r+Math.tan(t)*i),this}min(...e){return this.x=Math.min(this.x,...e.map(t=>t.x)),this.y=Math.min(this.y,...e.map(t=>t.y)),this}max(...e){return this.x=Math.max(this.x,...e.map(t=>t.x)),this.y=Math.max(this.y,...e.map(t=>t.y)),this}normalize(){return this.scale(1/(this.length()||1))}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this}divideVectors(e,t){return this.x=e.x/t.x,this.y=e.y/t.y,this}lerpVectors(e,t,s){return this.x=e.x+(t.x-e.x)*s,this.y=e.y+(t.y-e.y)*s,this}equals(e){return this.x===e.x&&this.y===e.y}applyMatrix3(e){const t=this.x,s=this.y,i=e.elements;return this.x=i[0]*t+i[3]*s+i[6],this.y=i[1]*t+i[4]*s+i[7],this}copy(e){return this.x=e.x,this.y=e.y,this}clone(){return new u(this.x,this.y)}}class L{constructor(e=0,t=0,s=0,i=0){this.left=e,this.top=t,this.width=s,this.height=i}get x(){return this.left}set x(e){this.left=e}get y(){return this.top}set y(e){this.top=e}get right(){return this.left+this.width}get bottom(){return this.top+this.height}get center(){return new u((this.left+this.right)/2,(this.top+this.bottom)/2)}get array(){return[this.left,this.top,this.width,this.height]}static from(...e){if(e.length===0)return new L;if(e.length===1)return e[0].clone();const t=e[0],s=e.slice(1).reduce((i,r)=>(i.left=Math.min(i.left,r.left),i.top=Math.min(i.top,r.top),i.right=Math.max(i.right,r.right),i.bottom=Math.max(i.bottom,r.bottom),i),{left:(t==null?void 0:t.left)??0,top:(t==null?void 0:t.top)??0,right:(t==null?void 0:t.right)??0,bottom:(t==null?void 0:t.bottom)??0});return new L(s.left,s.top,s.right-s.left,s.bottom-s.top)}translate(e,t){return this.left+=e,this.top+=t,this}copy(e){return this.left=e.left,this.top=e.top,this.width=e.width,this.height=e.height,this}clone(){return new L(this.left,this.top,this.width,this.height)}}class b{constructor(e=1,t=0,s=0,i=0,r=1,n=0,c=0,a=0,h=1){T(this,"elements",[]);this.set(e,t,s,i,r,n,c,a,h)}set(e,t,s,i,r,n,c,a,h){const l=this.elements;return l[0]=e,l[1]=i,l[2]=c,l[3]=t,l[4]=r,l[5]=a,l[6]=s,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,s=e.elements;return t[0]=s[0],t[1]=s[1],t[2]=s[2],t[3]=s[3],t[4]=s[4],t[5]=s[5],t[6]=s[6],t[7]=s[7],t[8]=s[8],this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const s=e.elements,i=t.elements,r=this.elements,n=s[0],c=s[3],a=s[6],h=s[1],l=s[4],y=s[7],f=s[2],d=s[5],g=s[8],x=i[0],m=i[3],w=i[6],E=i[1],v=i[4],S=i[7],N=i[2],z=i[5],D=i[8];return r[0]=n*x+c*E+a*N,r[3]=n*m+c*v+a*z,r[6]=n*w+c*S+a*D,r[1]=h*x+l*E+y*N,r[4]=h*m+l*v+y*z,r[7]=h*w+l*S+y*D,r[2]=f*x+d*E+g*N,r[5]=f*m+d*v+g*z,r[8]=f*w+d*S+g*D,this}invert(){const e=this.elements,t=e[0],s=e[1],i=e[2],r=e[3],n=e[4],c=e[5],a=e[6],h=e[7],l=e[8],y=l*n-c*h,f=c*a-l*r,d=h*r-n*a,g=t*y+s*f+i*d;if(g===0)return this.set(0,0,0,0,0,0,0,0,0);const x=1/g;return e[0]=y*x,e[1]=(i*h-l*s)*x,e[2]=(c*s-i*n)*x,e[3]=f*x,e[4]=(l*t-i*a)*x,e[5]=(i*r-c*t)*x,e[6]=d*x,e[7]=(s*a-h*t)*x,e[8]=(n*t-s*r)*x,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}scale(e,t){return this.premultiply(W.makeScale(e,t)),this}rotate(e){return this.premultiply(W.makeRotation(-e)),this}translate(e,t){return this.premultiply(W.makeTranslation(e,t)),this}makeTranslation(e,t){return this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),s=Math.sin(e);return this.set(t,-s,0,s,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}fromArray(e,t=0){for(let s=0;s<9;s++)this.elements[s]=e[s+t];return this}clone(){return new this.constructor().fromArray(this.elements)}}const W=new b;function K(o,e,t,s){const i=o*t+e*s,r=Math.sqrt(o*o+e*e)*Math.sqrt(t*t+s*s);let n=Math.acos(Math.max(-1,Math.min(1,i/r)));return o*s-e*t<0&&(n=-n),n}function tt(o,e,t,s,i,r,n,c){if(e===0||t===0){o.lineTo(c.x,c.y);return}s=s*Math.PI/180,e=Math.abs(e),t=Math.abs(t);const a=(n.x-c.x)/2,h=(n.y-c.y)/2,l=Math.cos(s)*a+Math.sin(s)*h,y=-Math.sin(s)*a+Math.cos(s)*h;let f=e*e,d=t*t;const g=l*l,x=y*y,m=g/f+x/d;if(m>1){const Ct=Math.sqrt(m);e=Ct*e,t=Ct*t,f=e*e,d=t*t}const w=f*x+d*g,E=(f*d-w)/w;let v=Math.sqrt(Math.max(0,E));i===r&&(v=-v);const S=v*e*y/t,N=-v*t*l/e,z=Math.cos(s)*S-Math.sin(s)*N+(n.x+c.x)/2,D=Math.sin(s)*S+Math.cos(s)*N+(n.y+c.y)/2,U=K(1,0,(l-S)/e,(y-N)/t),J=K((l-S)/e,(y-N)/t,(-l-S)/e,(-y-N)/t)%(Math.PI*2);o.ellipse(z,D,e,t,s,U,U+J,r===0)}function O(o,e){return o-(e-o)}function Y(o,e){const t=new u,s=new u;for(let i=0,r=o.length;i<r;i++){const n=o[i];if(n.type==="m"||n.type==="M")n.type==="m"?t.add(n):t.copy(n),e.moveTo(t.x,t.y),s.copy(t);else if(n.type==="h"||n.type==="H")n.type==="h"?t.x+=n.x:t.x=n.x,e.lineTo(t.x,t.y),s.copy(t);else if(n.type==="v"||n.type==="V")n.type==="v"?t.y+=n.y:t.y=n.y,e.lineTo(t.x,t.y),s.copy(t);else if(n.type==="l"||n.type==="L")n.type==="l"?t.add(n):t.copy(n),e.lineTo(t.x,t.y),s.copy(t);else if(n.type==="c"||n.type==="C")n.type==="c"?(e.bezierCurveTo(t.x+n.x1,t.y+n.y1,t.x+n.x2,t.y+n.y2,t.x+n.x,t.y+n.y),s.x=t.x+n.x2,s.y=t.y+n.y2,t.add(n)):(e.bezierCurveTo(n.x1,n.y1,n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.copy(n));else if(n.type==="s"||n.type==="S")n.type==="s"?(e.bezierCurveTo(O(t.x,s.x),O(t.y,s.y),t.x+n.x2,t.y+n.y2,t.x+n.x,t.y+n.y),s.x=t.x+n.x2,s.y=t.y+n.y2,t.add(n)):(e.bezierCurveTo(O(t.x,s.x),O(t.y,s.y),n.x2,n.y2,n.x,n.y),s.x=n.x2,s.y=n.y2,t.copy(n));else if(n.type==="q"||n.type==="Q")n.type==="q"?(e.quadraticCurveTo(t.x+n.x1,t.y+n.y1,t.x+n.x,t.y+n.y),s.x=t.x+n.x1,s.y=t.y+n.y1,t.add(n)):(e.quadraticCurveTo(n.x1,n.y1,n.x,n.y),s.x=n.x1,s.y=n.y1,t.copy(n));else if(n.type==="t"||n.type==="T"){const c=O(t.x,s.x),a=O(t.y,s.y);s.x=c,s.y=a,n.type==="t"?(e.quadraticCurveTo(c,a,t.x+n.x,t.y+n.y),t.add(n)):(e.quadraticCurveTo(c,a,n.x,n.y),t.copy(n))}else if(n.type==="a"||n.type==="A"){const c=t.clone();if(n.type==="a"){if(n.x===0&&n.y===0)continue;t.add(n)}else{if(t.equals(n))continue;t.copy(n)}s.copy(t),tt(e,n.rx,n.ry,n.angle,n.largeArcFlag,n.sweepFlag,c,t)}else n.type==="z"||n.type==="Z"?(e.startPoint&&t.copy(e.startPoint),e.closePath()):console.warn("Unsupported commands",n)}}const P={SEPARATOR:/[ \t\r\n,.\-+]/,WHITESPACE:/[ \t\r\n]/,DIGIT:/\d/,SIGN:/[-+]/,POINT:/\./,COMMA:/,/,EXP:/e/i,FLAGS:/[01]/};function A(o,e,t=0){let c=0,a=!0,h="",l="";const y=[];function f(m,w,E){const v=new SyntaxError(`Unexpected character "${m}" at index ${w}.`);throw v.partial=E,v}function d(){h!==""&&(l===""?y.push(Number(h)):y.push(Number(h)*10**Number(l))),h="",l=""}let g;const x=o.length;for(let m=0;m<x;m++){if(g=o[m],Array.isArray(e)&&e.includes(y.length%t)&&P.FLAGS.test(g)){c=1,h=g,d();continue}if(c===0){if(P.WHITESPACE.test(g))continue;if(P.DIGIT.test(g)||P.SIGN.test(g)){c=1,h=g;continue}if(P.POINT.test(g)){c=2,h=g;continue}P.COMMA.test(g)&&(a&&f(g,m,y),a=!0)}if(c===1){if(P.DIGIT.test(g)){h+=g;continue}if(P.POINT.test(g)){h+=g,c=2;continue}if(P.EXP.test(g)){c=3;continue}P.SIGN.test(g)&&h.length===1&&P.SIGN.test(h[0])&&f(g,m,y)}if(c===2){if(P.DIGIT.test(g)){h+=g;continue}if(P.EXP.test(g)){c=3;continue}P.POINT.test(g)&&h[h.length-1]==="."&&f(g,m,y)}if(c===3){if(P.DIGIT.test(g)){l+=g;continue}if(P.SIGN.test(g)){if(l===""){l+=g;continue}l.length===1&&P.SIGN.test(l)&&f(g,m,y)}}P.WHITESPACE.test(g)?(d(),c=0,a=!1):P.COMMA.test(g)?(d(),c=0,a=!0):P.SIGN.test(g)?(d(),c=1,h=g):P.POINT.test(g)?(d(),c=2,h=g):f(g,m,y)}return d(),y}function et(o){let e,t;const s=[];for(let i=0,r=o.length;i<r;i++){const n=o[i];switch(n.type){case"m":case"M":if(n.x.toFixed(4)===(t==null?void 0:t.x.toFixed(4))&&n.y.toFixed(4)===(t==null?void 0:t.y.toFixed(4)))continue;s.push(`${n.type} ${n.x} ${n.y}`),t={x:n.x,y:n.y},e={x:n.x,y:n.y};break;case"h":case"H":s.push(`${n.type} ${n.x}`),t={x:n.x,y:(t==null?void 0:t.y)??0};break;case"v":case"V":s.push(`${n.type} ${n.y}`),t={x:(t==null?void 0:t.x)??0,y:n.y};break;case"l":case"L":s.push(`${n.type} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"c":case"C":s.push(`${n.type} ${n.x1} ${n.y1} ${n.x2} ${n.y2} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"s":case"S":s.push(`${n.type} ${n.x2} ${n.y2} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"q":case"Q":s.push(`${n.type} ${n.x1} ${n.y1} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"t":case"T":s.push(`${n.type} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"a":case"A":s.push(`${n.type} ${n.rx} ${n.ry} ${n.angle} ${n.largeArcFlag} ${n.sweepFlag} ${n.x} ${n.y}`),t={x:n.x,y:n.y};break;case"z":case"Z":s.push(n.type),e&&(t={x:e.x,y:e.y});break}}return s.join(" ")}const vt=/[a-df-z][^a-df-z]*/gi;function G(o){const e=[],t=o.match(vt);if(!t)return e;for(let s=0,i=t.length;s<i;s++){const r=t[s],n=r.charAt(0),c=r.slice(1).trim();let a;switch(n){case"m":case"M":a=A(c);for(let h=0,l=a.length;h<l;h+=2)h===0?e.push({type:n,x:a[h],y:a[h+1]}):e.push({type:n==="m"?"l":"L",x:a[h],y:a[h+1]});break;case"h":case"H":a=A(c);for(let h=0,l=a.length;h<l;h++)e.push({type:n,x:a[h]});break;case"v":case"V":a=A(c);for(let h=0,l=a.length;h<l;h++)e.push({type:n,y:a[h]});break;case"l":case"L":a=A(c);for(let h=0,l=a.length;h<l;h+=2)e.push({type:n,x:a[h],y:a[h+1]});break;case"c":case"C":a=A(c);for(let h=0,l=a.length;h<l;h+=6)e.push({type:n,x1:a[h],y1:a[h+1],x2:a[h+2],y2:a[h+3],x:a[h+4],y:a[h+5]});break;case"s":case"S":a=A(c);for(let h=0,l=a.length;h<l;h+=4)e.push({type:n,x2:a[h],y2:a[h+1],x:a[h+2],y:a[h+3]});break;case"q":case"Q":a=A(c);for(let h=0,l=a.length;h<l;h+=4)e.push({type:n,x1:a[h],y1:a[h+1],x:a[h+2],y:a[h+3]});break;case"t":case"T":a=A(c);for(let h=0,l=a.length;h<l;h+=2)e.push({type:n,x:a[h],y:a[h+1]});break;case"a":case"A":a=A(c,[3,4],7);for(let h=0,l=a.length;h<l;h+=7)e.push({type:n,rx:a[h],ry:a[h+1],angle:a[h+2],largeArcFlag:a[h+3],sweepFlag:a[h+4],x:a[h+5],y:a[h+6]});break;case"z":case"Z":e.push({type:n});break;default:console.warn(r)}}return e}class k{constructor(){T(this,"arcLengthDivisions",200);T(this,"_cacheArcLengths");T(this,"_needsUpdate",!1)}isClockwise(){const e=this.getPoint(1),t=this.getPoint(.5),s=this.getPoint(1);return(t.x-e.x)*(s.y-t.y)-(t.y-e.y)*(s.x-t.x)<0}getPointAt(e,t=new u){return this.getPoint(this.getUToTMapping(e),t)}getPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPoint(s/e));return t}forEachControlPoints(e){return this.getControlPoints().forEach(e),this}getSpacedPoints(e=5){const t=[];for(let s=0;s<=e;s++)t.push(this.getPointAt(s/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this._cacheArcLengths&&this._cacheArcLengths.length===e+1&&!this._needsUpdate)return this._cacheArcLengths;this._needsUpdate=!1;const t=[];let s,i=this.getPoint(0),r=0;t.push(0);for(let n=1;n<=e;n++)s=this.getPoint(n/e),r+=s.distanceTo(i),t.push(r),i=s;return this._cacheArcLengths=t,t}updateArcLengths(){this._needsUpdate=!0,this.getLengths()}getUToTMapping(e,t){const s=this.getLengths();let i=0;const r=s.length;let n;t?n=t:n=e*s[r-1];let c=0,a=r-1,h;for(;c<=a;)if(i=Math.floor(c+(a-c)/2),h=s[i]-n,h<0)c=i+1;else if(h>0)a=i-1;else{a=i;break}if(i=a,s[i]===n)return i/(r-1);const l=s[i],f=s[i+1]-l,d=(n-l)/f;return(i+d)/(r-1)}getTangent(e,t=new u){const i=Math.max(0,e-1e-4),r=Math.min(1,e+1e-4);return t.copy(this.getPoint(r).sub(this.getPoint(i)).normalize())}getTangentAt(e,t){return this.getTangent(this.getUToTMapping(e),t)}getNormal(e,t=new u){return this.getTangent(e,t),t.set(-t.y,t.x).normalize()}getNormalAt(e,t){return this.getNormal(this.getUToTMapping(e),t)}getTForPoint(e,t=.001){let s=0,i=1,r=(s+i)/2;for(;i-s>t;){r=(s+i)/2;const n=this.getPoint(r);if(n.distanceTo(e)<t)return r;n.x<e.x?s=r:i=r}return r}matrix(e){return this.forEachControlPoints(t=>t.applyMatrix3(e)),this}getMinMax(e=u.MAX,t=u.MIN){return this.getPoints().forEach(s=>{e.min(s),t.max(s)}),{min:e,max:t}}getBoundingBox(){const{min:e,max:t}=this.getMinMax();return new L(e.x,e.y,t.x-e.x,t.y-e.y)}toCommands(){return this.getPoints().map((e,t)=>t===0?{type:"M",x:e.x,y:e.y}:{type:"L",x:e.x,y:e.y})}toData(){return et(this.toCommands())}drawTo(e){return this.toCommands().forEach(t=>{switch(t.type){case"M":e.moveTo(t.x,t.y);break;case"L":e.lineTo(t.x,t.y);break}}),this}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}clone(){return new this.constructor().copy(this)}}class R extends k{constructor(e,t,s=0,i=Math.PI*2){super(),this.center=e,this.radius=t,this.start=s,this.end=i}getPoint(e){const{radius:t,center:s}=this;return s.clone().add(this.getNormal(e).clone().scale(t))}getTangent(e,t=new u){const{x:s,y:i}=this.getNormal(e);return t.set(-i,s)}getNormal(e,t=new u){const{start:s,end:i}=this,r=e*(i-s)+s-.5*Math.PI;return t.set(Math.cos(r),Math.sin(r))}getControlPoints(){return[this.center]}getMinMax(e=u.MAX,t=u.MIN){return e.x=Math.min(e.x,this.center.x-this.radius),e.y=Math.min(e.y,this.center.y-this.radius),t.x=Math.max(t.x,this.center.x+this.radius),t.y=Math.max(t.y,this.center.y+this.radius),{min:e,max:t}}}function st(o,e,t,s,i){const r=(s-e)*.5,n=(i-t)*.5,c=o*o,a=o*c;return(2*t-2*s+r+n)*a+(-3*t+3*s-2*r-n)*c+r*o+t}function bt(o,e){const t=1-o;return t*t*e}function At(o,e){return 2*(1-o)*o*e}function kt(o,e){return o*o*e}function nt(o,e,t,s){return bt(o,e)+At(o,t)+kt(o,s)}function It(o,e){const t=1-o;return t*t*t*e}function St(o,e){const t=1-o;return 3*t*t*o*e}function Nt(o,e){return 3*(1-o)*o*o*e}function $t(o,e){return o*o*o*e}function it(o,e,t,s,i){return It(o,e)+St(o,t)+Nt(o,s)+$t(o,i)}class rt extends k{constructor(e=new u,t=new u,s=new u,i=new u){super(),this.start=e,this.startControl=t,this.endControl=s,this.end=i}getPoint(e,t=new u){const{start:s,startControl:i,endControl:r,end:n}=this;return t.set(it(e,s.x,i.x,r.x,n.x),it(e,s.y,i.y,r.y,n.y))}getControlPoints(){return[this.start,this.startControl,this.endControl,this.end]}_solveQuadratic(e,t,s){const i=t*t-4*e*s;if(i<0)return[];const r=Math.sqrt(i),n=(-t+r)/(2*e),c=(-t-r)/(2*e);return[n,c].filter(a=>a>=0&&a<=1)}getMinMax(e=u.MAX,t=u.MIN){const s=this.start,i=this.startControl,r=this.endControl,n=this.end,c=this._solveQuadratic(3*(i.x-s.x),6*(r.x-i.x),3*(n.x-r.x)),a=this._solveQuadratic(3*(i.y-s.y),6*(r.y-i.y),3*(n.y-r.y)),h=[0,1,...c,...a];return((y,f)=>{for(const d of y)for(let g=0;g<=f;g++){const x=g/f-.5,m=Math.min(1,Math.max(0,d+x)),w=this.getPoint(m);e.x=Math.min(e.x,w.x),e.y=Math.min(e.y,w.y),t.x=Math.max(t.x,w.x),t.y=Math.max(t.y,w.y)}})(h,10),{min:e,max:t}}toCommands(){const{start:e,startControl:t,endControl:s,end:i}=this;return[{type:"M",x:e.x,y:e.y},{type:"C",x1:t.x,y1:t.y,x2:s.x,y2:s.y,x:i.x,y:i.y}]}drawTo(e){const{start:t,startControl:s,endControl:i,end:r}=this;return e.lineTo(t.x,t.y),e.bezierCurveTo(s.x,s.y,i.x,i.y,r.x,r.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.startControl.copy(e.startControl),this.endControl.copy(e.endControl),this.end.copy(e.end),this}}const Et=new b,ot=new b,ht=new b,_=new u;class at extends k{constructor(e=new u,t=1,s=1,i=0,r=0,n=Math.PI*2,c=!1){super(),this.center=e,this.radiusX=t,this.radiusY=s,this.rotation=i,this.startAngle=r,this.endAngle=n,this.clockwise=c}isClockwise(){return this.clockwise}getPoint(e,t=new u){const s=Math.PI*2;let i=this.endAngle-this.startAngle;const r=Math.abs(i)<Number.EPSILON;for(;i<0;)i+=s;for(;i>s;)i-=s;i<Number.EPSILON&&(r?i=0:i=s),this.clockwise&&!r&&(i===s?i=-s:i=i-s);const n=this.startAngle+e*i;let c=this.center.x+this.radiusX*Math.cos(n),a=this.center.y+this.radiusY*Math.sin(n);if(this.rotation!==0){const h=Math.cos(this.rotation),l=Math.sin(this.rotation),y=c-this.center.x,f=a-this.center.y;c=y*h-f*l+this.center.x,a=y*l+f*h+this.center.y}return t.set(c,a)}toCommands(){const{center:e,radiusX:t,radiusY:s,startAngle:i,endAngle:r,clockwise:n,rotation:c}=this,{x:a,y:h}=e,l=a+t*Math.cos(i)*Math.cos(c)-s*Math.sin(i)*Math.sin(c),y=h+t*Math.cos(i)*Math.sin(c)+s*Math.sin(i)*Math.cos(c),f=Math.abs(i-r),d=f>Math.PI?1:0,g=n?1:0,x=c*180/Math.PI;if(f>=2*Math.PI){const m=i+Math.PI,w=a+t*Math.cos(m)*Math.cos(c)-s*Math.sin(m)*Math.sin(c),E=h+t*Math.cos(m)*Math.sin(c)+s*Math.sin(m)*Math.cos(c);return[{type:"M",x:l,y},{type:"A",rx:t,ry:s,angle:x,largeArcFlag:0,sweepFlag:g,x:w,y:E},{type:"A",rx:t,ry:s,angle:x,largeArcFlag:0,sweepFlag:g,x:l,y}]}else{const m=a+t*Math.cos(r)*Math.cos(c)-s*Math.sin(r)*Math.sin(c),w=h+t*Math.cos(r)*Math.sin(c)+s*Math.sin(r)*Math.cos(c);return[{type:"M",x:l,y},{type:"A",rx:t,ry:s,angle:x,largeArcFlag:d,sweepFlag:g,x:m,y:w}]}}drawTo(e){const{center:t,radiusX:s,radiusY:i,rotation:r,startAngle:n,endAngle:c,clockwise:a}=this;return e.ellipse(t.x,t.y,s,i,r,n,c,!a),this}matrix(e){return _.set(this.center.x,this.center.y),_.applyMatrix3(e),this.center.x=_.x,this.center.y=_.y,zt(e)?Lt(this,e):qt(this,e),this}getControlPoints(){return[this.center]}getMinMax(e=u.MAX,t=u.MIN){const{center:s,radiusX:i,radiusY:r,rotation:n}=this,{x:c,y:a}=s,h=Math.cos(n),l=Math.sin(n),y=Math.sqrt(i*i*h*h+r*r*l*l),f=Math.sqrt(i*i*l*l+r*r*h*h);return e.x=Math.min(e.x,c-y),e.y=Math.min(e.y,a-f),t.x=Math.max(t.x,c+y),t.y=Math.max(t.y,a+f),{min:e,max:t}}copy(e){return super.copy(e),this.center.x=e.center.x,this.center.y=e.center.y,this.radiusX=e.radiusX,this.radiusY=e.radiusY,this.startAngle=e.startAngle,this.endAngle=e.endAngle,this.clockwise=e.clockwise,this.rotation=e.rotation,this}}function Lt(o,e){const t=o.radiusX,s=o.radiusY,i=Math.cos(o.rotation),r=Math.sin(o.rotation),n=new u(t*i,t*r),c=new u(-s*r,s*i),a=n.applyMatrix3(e),h=c.applyMatrix3(e),l=Et.set(a.x,h.x,0,a.y,h.y,0,0,0,1),y=ot.copy(l).invert(),g=ht.copy(y).transpose().multiply(y).elements,x=Dt(g[0],g[1],g[4]),m=Math.sqrt(x.rt1),w=Math.sqrt(x.rt2);if(o.radiusX=1/m,o.radiusY=1/w,o.rotation=Math.atan2(x.sn,x.cs),!((o.endAngle-o.startAngle)%(2*Math.PI)<Number.EPSILON)){const v=ot.set(m,0,0,0,w,0,0,0,1),S=ht.set(x.cs,x.sn,0,-x.sn,x.cs,0,0,0,1),N=v.multiply(S).multiply(l),z=D=>{const{x:U,y:J}=new u(Math.cos(D),Math.sin(D)).applyMatrix3(N);return Math.atan2(J,U)};o.startAngle=z(o.startAngle),o.endAngle=z(o.endAngle),ct(e)&&(o.clockwise=!o.clockwise)}}function qt(o,e){const t=lt(e),s=ut(e);o.radiusX*=t,o.radiusY*=s;const i=t>Number.EPSILON?Math.atan2(e.elements[1],e.elements[0]):Math.atan2(-e.elements[3],e.elements[4]);o.rotation+=i,ct(e)&&(o.startAngle*=-1,o.endAngle*=-1,o.clockwise=!o.clockwise)}function ct(o){const e=o.elements;return e[0]*e[4]-e[1]*e[3]<0}function zt(o){const e=o.elements,t=e[0]*e[3]+e[1]*e[4];if(t===0)return!1;const s=lt(o),i=ut(o);return Math.abs(t/(s*i))>Number.EPSILON}function lt(o){const e=o.elements;return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function ut(o){const e=o.elements;return Math.sqrt(e[3]*e[3]+e[4]*e[4])}function Dt(o,e,t){let s,i,r,n,c;const a=o+t,h=o-t,l=Math.sqrt(h*h+4*e*e);return a>0?(s=.5*(a+l),c=1/s,i=o*c*t-e*c*e):a<0?i=.5*(a-l):(s=.5*l,i=-.5*l),h>0?r=h+l:r=h-l,Math.abs(r)>2*Math.abs(e)?(c=-2*e/r,n=1/Math.sqrt(1+c*c),r=c*n):Math.abs(e)===0?(r=1,n=0):(c=-.5*r/e,r=1/Math.sqrt(1+c*c),n=c*r),h>0&&(c=r,r=-n,n=c),{rt1:s,rt2:i,cs:r,sn:n}}class X extends k{constructor(e=new u,t=new u){super(),this.start=e,this.end=t}getPoint(e,t=new u){return e===1?t.copy(this.end):t.copy(this.end).sub(this.start).scale(e).add(this.start),t}getPointAt(e,t=new u){return this.getPoint(e,t)}getTangent(e,t=new u){return t.subVectors(this.end,this.start).normalize()}getTangentAt(e,t=new u){return this.getTangent(e,t)}getControlPoints(){return[this.start,this.end]}getMinMax(e=u.MAX,t=u.MIN){const{start:s,end:i}=this;return e.x=Math.min(e.x,s.x,i.x),e.y=Math.min(e.y,s.y,i.y),t.x=Math.max(t.x,s.x,i.x),t.y=Math.max(t.y,s.y,i.y),{min:e,max:t}}toCommands(){const{start:e,end:t}=this;return[{type:"M",x:e.x,y:e.y},{type:"L",x:t.x,y:t.y}]}drawTo(e){const{start:t,end:s}=this;return e.lineTo(t.x,t.y),e.lineTo(s.x,s.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.end.copy(e.end),this}}class Xt extends k{constructor(t,s,i=0,r=1){super();T(this,"curveT",0);this.center=t,this.size=s,this.start=i,this.end=r,this.update()}update(){const{x:t,y:s}=this.center,i=new u(t+.5*this.size,s-.5*this.size),r=new u(t-.5*this.size,s-.5*this.size),n=new u(t,s+.5*this.size),c=new R(i,Math.SQRT1_2*this.size,-.25*Math.PI,.75*Math.PI),a=new R(r,Math.SQRT1_2*this.size,-.75*Math.PI,.25*Math.PI),h=new R(n,.5*Math.SQRT1_2*this.size,.75*Math.PI,1.25*Math.PI),l=new u(t,s+this.size),y=new u(t+this.size,s),f=new u().lerpVectors(y,l,.75),d=new u(t-this.size,s),g=new u().lerpVectors(d,l,.75),x=new X(y,f),m=new X(g,d);return this.curves=[c,x,h,m,a],this}getPoint(t){return this.getCurve(t).getPoint(this.curveT)}getPointAt(t){return this.getPoint(t)}getCurve(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=9*Math.PI/8+1.5;let i;const r=.5*Math.PI;return s<r?(i=0,this.curveT=s/r):s<r+.75?(i=1,this.curveT=(s-r)/.75):s<5*Math.PI/8+.75?(i=2,this.curveT=(s-r-.75)/(Math.PI/8)):s<5*Math.PI/8+1.5?(i=3,this.curveT=(s-5*Math.PI/8-.75)/.75):(i=4,this.curveT=(s-5*Math.PI/8-1.5)/r),this.curves[i]}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}toCommands(){return this.curves.flatMap(t=>t.toCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class Ot extends k{constructor(t,s=0,i=0,r=0,n=1){super();T(this,"curves",[]);T(this,"curveT",0);T(this,"points",[]);this.center=t,this.radius=s,this.number=i,this.start=r,this.end=n,this.update()}update(){for(let t=0;t<this.number;t++){let s=t*2*Math.PI/this.number;s-=.5*Math.PI,this.points.push(new u(this.radius*Math.cos(s),this.radius*Math.sin(s)).add(this.center))}for(let t=0;t<this.number;t++)this.curves.push(new X(this.points[t],this.points[(t+1)%this.number]));return this}getCurve(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1);const i=s*this.number,r=Math.floor(i);return this.curveT=i-r,this.curves[r]}getPoint(t,s){return this.getCurve(t).getPoint(this.curveT,s)}getPointAt(t,s){return this.getPoint(t,s)}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}toCommands(){return this.curves.flatMap(t=>t.toCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class yt extends k{constructor(e=new u,t=new u,s=new u){super(),this.start=e,this.control=t,this.end=s}getPoint(e,t=new u){const{start:s,control:i,end:r}=this;return t.set(nt(e,s.x,i.x,r.x),nt(e,s.y,i.y,r.y)),t}getControlPoints(){return[this.start,this.control,this.end]}getMinMax(e=u.MAX,t=u.MIN){const{start:s,control:i,end:r}=this,n=.5*(s.x+i.x),c=.5*(s.y+i.y),a=.5*(s.x+r.x),h=.5*(s.y+r.y);return e.x=Math.min(e.x,s.x,r.x,n,a),e.y=Math.min(e.y,s.y,r.y,c,h),t.x=Math.max(t.x,s.x,r.x,n,a),t.y=Math.max(t.y,s.y,r.y,c,h),{min:e,max:t}}toCommands(){const{start:e,control:t,end:s}=this;return[{type:"M",x:e.x,y:e.y},{type:"Q",x1:t.x,y1:t.y,x:s.x,y:s.y}]}drawTo(e){const{start:t,control:s,end:i}=this;return e.lineTo(t.x,t.y),e.quadraticCurveTo(s.x,s.y,i.x,i.y),this}copy(e){return super.copy(e),this.start.copy(e.start),this.control.copy(e.control),this.end.copy(e.end),this}}class gt extends k{constructor(t,s,i=1,r=0,n=1){super();T(this,"curves",[]);T(this,"curveT",0);this.center=t,this.rx=s,this.aspectRatio=i,this.start=r,this.end=n,this.update()}get x(){return this.center.x-this.rx}get y(){return this.center.y-this.rx/this.aspectRatio}get width(){return this.rx*2}get height(){return this.rx/this.aspectRatio*2}update(){const{x:t,y:s}=this.center,i=this.rx,r=this.rx/this.aspectRatio,n=[new u(t-i,s-r),new u(t+i,s-r),new u(t+i,s+r),new u(t-i,s+r)];for(let c=0;c<4;c++)this.curves.push(new X(n[c].clone(),n[(c+1)%4].clone()));return this}getCurve(t){let s=(t*(this.end-this.start)+this.start)%1;s<0&&(s+=1),s*=(1+this.aspectRatio)*2;let i;return s<this.aspectRatio?(i=0,this.curveT=s/this.aspectRatio):s<this.aspectRatio+1?(i=1,this.curveT=(s-this.aspectRatio)/1):s<2*this.aspectRatio+1?(i=2,this.curveT=(s-this.aspectRatio-1)/this.aspectRatio):(i=3,this.curveT=(s-2*this.aspectRatio-1)/1),this.curves[i]}getPoint(t,s){return this.getCurve(t).getPoint(this.curveT,s)}getPointAt(t,s){return this.getPoint(t,s)}getTangent(t,s){return this.getCurve(t).getTangent(this.curveT,s)}getNormal(t,s){return this.getCurve(t).getNormal(this.curveT,s)}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}toCommands(){return this.curves.flatMap(t=>t.toCommands())}drawTo(t){return this.curves.forEach(s=>s.drawTo(t)),this}}class ft extends k{constructor(e=[]){super(),this.points=e}getPoint(e,t=new u){const{points:s}=this,i=(s.length-1)*e,r=Math.floor(i),n=i-r,c=s[r===0?r:r-1],a=s[r],h=s[r>s.length-2?s.length-1:r+1],l=s[r>s.length-3?s.length-1:r+2];return t.set(st(n,c.x,a.x,h.x,l.x),st(n,c.y,a.y,h.y,l.y)),t}getControlPoints(){return this.points}copy(e){super.copy(e),this.points=[];for(let t=0,s=e.points.length;t<s;t++)this.points.push(e.points[t].clone());return this}}class F extends k{constructor(t){super();T(this,"curves",[]);T(this,"startPoint");T(this,"currentPoint");T(this,"autoClose",!1);T(this,"_cacheLengths",[]);t&&this.addPoints(t)}addCurve(t){return this.curves.push(t),this}addPoints(t){this.moveTo(t[0].x,t[0].y);for(let s=1,i=t.length;s<i;s++){const{x:r,y:n}=t[s];this.lineTo(r,n)}return this}addCommands(t){return Y(t,this),this}addData(t){return this.addCommands(G(t)),this}getPoint(t,s=new u){const i=t*this.getLength(),r=this.getCurveLengths();let n=0;for(;n<r.length;){if(r[n]>=i){const c=r[n]-i,a=this.curves[n],h=a.getLength();return a.getPointAt(h===0?0:1-c/h,s)}n++}return s}getControlPoints(){return this.curves.flatMap(t=>t.getControlPoints())}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){super.updateArcLengths(),this._cacheLengths=[],this.getCurveLengths()}getCurveLengths(){if(this._cacheLengths.length===this.curves.length)return this._cacheLengths;const t=[];let s=0;for(let i=0,r=this.curves.length;i<r;i++)s+=this.curves[i].getLength(),t.push(s);return this._cacheLengths=t,t}getSpacedPoints(t=40){const s=[];for(let i=0;i<=t;i++)s.push(this.getPoint(i/t));return this.autoClose&&s.push(s[0]),s}getPoints(t=12){const s=[],i=this.curves;let r;for(let n=0,c=i.length;n<c;n++){const h=i[n].getPoints(t);for(let l=0;l<h.length;l++){const y=h[l];r!=null&&r.equals(y)||(s.push(y),r=y)}}return this.autoClose&&s.length>1&&!s[s.length-1].equals(s[0])&&s.push(s[0]),s}_setCurrentPoint(t){return this.currentPoint=new u(t.x,t.y),this.startPoint||(this.startPoint=this.currentPoint.clone()),this}closePath(){const t=this.startPoint;if(t){const s=this.currentPoint;s&&!t.equals(s)&&(this.curves.push(new X(s.clone(),t)),s.copy(t)),this.startPoint=void 0}return this}moveTo(t,s){return this.currentPoint=new u(t,s),this.startPoint=this.currentPoint.clone(),this}lineTo(t,s){const i=this.currentPoint;return i!=null&&i.equals({x:t,y:s})||this.curves.push(new X((i==null?void 0:i.clone())??new u,new u(t,s))),this._setCurrentPoint({x:t,y:s}),this}bezierCurveTo(t,s,i,r,n,c){const a=this.currentPoint;return a!=null&&a.equals({x:n,y:c})||this.curves.push(new rt((a==null?void 0:a.clone())??new u,new u(t,s),new u(i,r),new u(n,c))),this._setCurrentPoint({x:n,y:c}),this}quadraticCurveTo(t,s,i,r){const n=this.currentPoint;return n!=null&&n.equals({x:i,y:r})||this.curves.push(new yt((n==null?void 0:n.clone())??new u,new u(t,s),new u(i,r))),this._setCurrentPoint({x:i,y:r}),this}arc(t,s,i,r,n,c){return this.ellipse(t,s,i,i,0,r,n,c),this}relativeArc(t,s,i,r,n,c){const a=this.currentPoint??new u;return this.arc(t+a.x,s+a.y,i,r,n,c),this}arcTo(t,s,i,r,n){return console.warn("Method arcTo not supported yet"),this}ellipse(t,s,i,r,n,c,a,h=!0){const l=new at(new u(t,s),i,r,n,c,a,!h);if(this.curves.length>0){const y=l.getPoint(0);(!this.currentPoint||!y.equals(this.currentPoint))&&this.lineTo(y.x,y.y)}return this.curves.push(l),this._setCurrentPoint(l.getPoint(1)),this}relativeEllipse(t,s,i,r,n,c,a,h){const l=this.currentPoint??new u;return this.ellipse(t+l.x,s+l.y,i,r,n,c,a,h),this}rect(t,s,i,r){return this.curves.push(new gt(new u(t+i/2,s+r/2),i/2,i/r)),this._setCurrentPoint({x:t,y:s}),this}splineThru(t){const s=this.currentPoint??new u;return this.curves.push(new ft([s].concat(t))),this._setCurrentPoint(t[t.length-1]),this}getMinMax(t=u.MAX,s=u.MIN){return this.curves.forEach(i=>i.getMinMax(t,s)),{min:t,max:s}}getBoundingBox(){const{min:t,max:s}=this.getMinMax();return new L(t.x,t.y,s.x-t.x,s.y-t.y)}toCommands(){return this.curves.flatMap(t=>t.toCommands())}drawTo(t){var i;const s=(i=this.curves[0])==null?void 0:i.getPoint(0);return s&&t.moveTo(s.x,s.y),this.curves.forEach(r=>r.drawTo(t)),this.autoClose&&t.closePath(),this}copy(t){var s;super.copy(t),this.curves=[];for(let i=0,r=t.curves.length;i<r;i++)this.curves.push(t.curves[i].clone());return this.autoClose=t.autoClose,this.currentPoint=(s=t.currentPoint)==null?void 0:s.clone(),this}}function Ft(o){return o.replace(/[^a-z0-9]/gi,"-").replace(/\B([A-Z])/g,"-$1").toLowerCase()}function Rt(o,e,t,s){const i=e.clone().sub(o),r=s.clone().sub(t),n=t.clone().sub(o),c=i.cross(r);if(c===0)return new u((o.x+t.x)/2,(o.y+t.y)/2);const a=n.cross(r)/c;return Math.abs(a)>1?new u((o.x+t.x)/2,(o.y+t.y)/2):new u(o.x+a*i.x,o.y+a*i.y)}class I{constructor(e,t={}){T(this,"currentPath",new F);T(this,"paths",[this.currentPath]);T(this,"style");e&&(e instanceof I?this.addPath(e):Array.isArray(e)?this.addCommands(e):this.addData(e)),this.style=t}get startPoint(){return this.currentPath.startPoint}get currentPoint(){return this.currentPath.currentPoint}get strokeWidth(){return this.style.strokeWidth??((this.style.stroke??"none")==="none"?0:1)}addPath(e){return e instanceof I?this.paths.push(...e.paths.map(t=>t.clone())):this.paths.push(e),this}closePath(){const e=this.startPoint;return e&&(this.currentPath.closePath(),this.currentPath.curves.length>0&&(this.currentPath=new F().moveTo(e.x,e.y),this.paths.push(this.currentPath))),this}moveTo(e,t){const{currentPoint:s,curves:i}=this.currentPath;return s!=null&&s.equals({x:e,y:t})||(i.length?(this.currentPath=new F().moveTo(e,t),this.paths.push(this.currentPath)):this.currentPath.moveTo(e,t)),this}lineTo(e,t){return this.currentPath.lineTo(e,t),this}bezierCurveTo(e,t,s,i,r,n){return this.currentPath.bezierCurveTo(e,t,s,i,r,n),this}quadraticCurveTo(e,t,s,i){return this.currentPath.quadraticCurveTo(e,t,s,i),this}arc(e,t,s,i,r,n){return this.currentPath.arc(e,t,s,i,r,n),this}arcTo(e,t,s,i,r){return this.currentPath.arcTo(e,t,s,i,r),this}ellipse(e,t,s,i,r,n,c,a){return this.currentPath.ellipse(e,t,s,i,r,n,c,a),this}rect(e,t,s,i){return this.currentPath.rect(e,t,s,i),this}addCommands(e){return Y(e,this),this}addData(e){return this.addCommands(G(e)),this}splineThru(e){return this.currentPath.splineThru(e),this}getControlPoints(){return this.paths.flatMap(e=>e.getControlPoints())}getCurves(){return this.paths.flatMap(e=>e.curves)}scale(e,t=e,s={x:0,y:0}){return this.getControlPoints().forEach(i=>{i.scale(e,t,s)}),this}skew(e,t=0,s={x:0,y:0}){return this.getControlPoints().forEach(i=>{i.skew(e,t,s)}),this}rotate(e,t={x:0,y:0}){return this.getControlPoints().forEach(s=>{s.rotate(e,t)}),this}bold(e){if(e===0)return this;const t=this.getCurves(),s=[],i=[],r=[];t.forEach((c,a)=>{const h=c.getControlPoints(),l=c.isClockwise();r[a]=h,i[a]=l;const y=h[0],f=h[h.length-1]??y;s.push({start:l?f:y,end:l?y:f,index:a})});const n=[];return s.forEach((c,a)=>{n[a]=[],s.forEach((h,l)=>{l!==a&&h.start.equals(c.end)&&n[a].push(h.index)})}),t.forEach((c,a)=>{const h=i[a];r[a].forEach(y=>{const f=c.getTForPoint(y),d=c.getNormal(f).scale(h?e:-e);y.add(d)})}),n.forEach((c,a)=>{const h=r[a];c.forEach(l=>{const y=r[l],f=Rt(h[h.length-1],h[h.length-2]??h[h.length-1],y[0],y[1]??y[0]);f&&(h[h.length-1].copy(f),y[0].copy(f))})}),this}matrix(e){return this.getCurves().forEach(t=>t.matrix(e)),this}getMinMax(e=u.MAX,t=u.MIN,s=!0){const i=this.strokeWidth;return this.getCurves().forEach(r=>{if(r.getMinMax(e,t),s&&i>1){const n=i/2,c=r.isClockwise(),a=[];for(let h=0;h<=1;h+=1/r.arcLengthDivisions){const l=r.getPoint(h),y=r.getNormal(h),f=y.clone().scale(c?n:-n),d=y.clone().scale(c?-n:n);a.push(l.clone().add(f),l.clone().add(d),l.clone().add({x:n,y:0}),l.clone().add({x:-n,y:0}),l.clone().add({x:0,y:n}),l.clone().add({x:0,y:-n}),l.clone().add({x:n,y:n}),l.clone().add({x:-n,y:-n}))}e.min(...a),t.max(...a)}}),{min:e,max:t}}getBoundingBox(e=!0){const{min:t,max:s}=this.getMinMax(void 0,void 0,e);return new L(t.x,t.y,s.x-t.x,s.y-t.y)}drawTo(e,t={}){t={...this.style,...t};const{fill:s="#000",stroke:i="none"}=t;return e.beginPath(),e.save(),q(e,t),this.paths.forEach(r=>{r.drawTo(e)}),s!=="none"&&e.fill(),i!=="none"&&e.stroke(),e.restore(),this}drawControlPointsTo(e,t={}){t={...this.style,...t};const{fill:s="#000",stroke:i="none"}=t;return e.beginPath(),e.save(),q(e,t),this.getControlPoints().forEach(r=>{e.moveTo(r.x,r.y),e.arc(r.x,r.y,4,0,Math.PI*2)}),s!=="none"&&e.fill(),i!=="none"&&e.stroke(),e.restore(),this}toCommands(){return this.paths.flatMap(e=>e.toCommands())}toData(){return this.paths.map(e=>e.toData()).join(" ")}toSvgPathString(){const e={...this.style,fill:this.style.fill??"#000",stroke:this.style.stroke??"none"},t={};for(const i in e)e[i]!==void 0&&(t[Ft(i)]=e[i]);Object.assign(t,{"stroke-width":`${this.strokeWidth}px`});let s="";for(const i in t)t[i]!==void 0&&(s+=`${i}:${t[i]};`);return`<path d="${this.toData()}" style="${s}"></path>`}toSvgString(){const{x:e,y:t,width:s,height:i}=this.getBoundingBox(),r=this.toSvgPathString();return`<svg viewBox="${e} ${t} ${s} ${i}" width="${s}px" height="${i}px" xmlns="http://www.w3.org/2000/svg">${r}</svg>`}toSvgUrl(){return`data:image/svg+xml;base64,${btoa(this.toSvgString())}`}toSvg(){return new DOMParser().parseFromString(this.toSvgString(),"image/svg+xml").documentElement}toCanvas(e={}){const{pixelRatio:t=2,...s}=e,{left:i,top:r,width:n,height:c}=this.getBoundingBox(),a=document.createElement("canvas");a.width=n*t,a.height=c*t,a.style.width=`${n}px`,a.style.height=`${c}px`;const h=a.getContext("2d");return h&&(h.scale(t,t),h.translate(-i,-r),this.drawTo(h,s)),a}copy(e){return this.currentPath=e.currentPath.clone(),this.paths=e.paths.map(t=>t.clone()),this.style={...e.style},this}clone(){return new this.constructor().copy(this)}}const Q="px",pt=90,dt=["mm","cm","in","pt","pc","px"],V={mm:{mm:1,cm:.1,in:1/25.4,pt:72/25.4,pc:6/25.4,px:-1},cm:{mm:10,cm:1,in:1/2.54,pt:72/2.54,pc:6/2.54,px:-1},in:{mm:25.4,cm:2.54,in:1,pt:72,pc:6,px:-1},pt:{mm:25.4/72,cm:2.54/72,in:1/72,pt:1,pc:6/72,px:-1},pc:{mm:25.4/6,cm:2.54/6,in:1/6,pt:72/6,pc:1,px:-1},px:{px:1}};function M(o){let e="px";if(typeof o=="string"||o instanceof String)for(let s=0,i=dt.length;s<i;s++){const r=dt[s];if(o.endsWith(r)){e=r,o=o.substring(0,o.length-r.length);break}}let t;return e==="px"&&Q!=="px"?t=V.in[Q]/pt:(t=V[e][Q],t<0&&(t=V[e].in*pt)),t*Number.parseFloat(o)}const _t=new b,B=new b,xt=new b,mt=new b;function Bt(o,e,t){if(!(o.hasAttribute("transform")||o.nodeName==="use"&&(o.hasAttribute("x")||o.hasAttribute("y"))))return null;const s=Ut(o);return t.length>0&&s.premultiply(t[t.length-1]),e.copy(s),t.push(s),s}function Ut(o){const e=new b,t=_t;if(o.nodeName==="use"&&(o.hasAttribute("x")||o.hasAttribute("y"))&&e.translate(M(o.getAttribute("x")),M(o.getAttribute("y"))),o.hasAttribute("transform")){const s=o.getAttribute("transform").split(")");for(let i=s.length-1;i>=0;i--){const r=s[i].trim();if(r==="")continue;const n=r.indexOf("("),c=r.length;if(n>0&&n<c){const a=r.slice(0,n),h=A(r.slice(n+1));switch(t.identity(),a){case"translate":if(h.length>=1){const l=h[0];let y=0;h.length>=2&&(y=h[1]),t.translate(l,y)}break;case"rotate":if(h.length>=1){let l=0,y=0,f=0;l=h[0]*Math.PI/180,h.length>=3&&(y=h[1],f=h[2]),B.makeTranslation(-y,-f),xt.makeRotation(l),mt.multiplyMatrices(xt,B),B.makeTranslation(y,f),t.multiplyMatrices(B,mt)}break;case"scale":h.length>=1&&t.scale(h[0],h[1]??h[0]);break;case"skewX":h.length===1&&t.set(1,Math.tan(h[0]*Math.PI/180),0,0,1,0,0,0,1);break;case"skewY":h.length===1&&t.set(1,0,0,Math.tan(h[0]*Math.PI/180),1,0,0,0,1);break;case"matrix":h.length===6&&t.set(h[0],h[2],h[4],h[1],h[3],h[5],0,0,1);break}}e.premultiply(t)}}return e}function Wt(o){return new I().addPath(new F().arc(M(o.getAttribute("cx")||0),M(o.getAttribute("cy")||0),M(o.getAttribute("r")||0),0,Math.PI*2))}function Yt(o,e){if(!(!o.sheet||!o.sheet.cssRules||!o.sheet.cssRules.length))for(let t=0;t<o.sheet.cssRules.length;t++){const s=o.sheet.cssRules[t];if(s.type!==1)continue;const i=s.selectorText.split(/,/g).filter(Boolean).map(n=>n.trim()),r={};for(let n=s.style.length,c=0;c<n;c++){const a=s.style.item(c);r[a]=s.style.getPropertyValue(a)}for(let n=0;n<i.length;n++)e[i[n]]=Object.assign(e[i[n]]||{},{...r})}}function Gt(o){return new I().addPath(new F().ellipse(M(o.getAttribute("cx")||0),M(o.getAttribute("cy")||0),M(o.getAttribute("rx")||0),M(o.getAttribute("ry")||0),0,0,Math.PI*2))}function Qt(o){return new I().moveTo(M(o.getAttribute("x1")||0),M(o.getAttribute("y1")||0)).lineTo(M(o.getAttribute("x2")||0),M(o.getAttribute("y2")||0))}function Vt(o){const e=new I,t=o.getAttribute("d");return!t||t==="none"?null:(e.addData(t),e)}const jt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Ht(o){var s;const e=new I;let t=0;return(s=o.getAttribute("points"))==null||s.replace(jt,(i,r,n)=>{const c=M(r),a=M(n);return t===0?e.moveTo(c,a):e.lineTo(c,a),t++,i}),e.currentPath.autoClose=!0,e}const Zt=/([+-]?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)(?:,|\s)([+-]?\d*\.?\d+(?:e[+-]?\d+)?)/g;function Jt(o){var s;const e=new I;let t=0;return(s=o.getAttribute("points"))==null||s.replace(Zt,(i,r,n)=>{const c=M(r),a=M(n);return t===0?e.moveTo(c,a):e.lineTo(c,a),t++,i}),e.currentPath.autoClose=!1,e}function Kt(o){const e=M(o.getAttribute("x")||0),t=M(o.getAttribute("y")||0),s=M(o.getAttribute("rx")||o.getAttribute("ry")||0),i=M(o.getAttribute("ry")||o.getAttribute("rx")||0),r=M(o.getAttribute("width")),n=M(o.getAttribute("height")),c=1-.551915024494,a=new I;return a.moveTo(e+s,t),a.lineTo(e+r-s,t),(s!==0||i!==0)&&a.bezierCurveTo(e+r-s*c,t,e+r,t+i*c,e+r,t+i),a.lineTo(e+r,t+n-i),(s!==0||i!==0)&&a.bezierCurveTo(e+r,t+n-i*c,e+r-s*c,t+n,e+r-s,t+n),a.lineTo(e+s,t+n),(s!==0||i!==0)&&a.bezierCurveTo(e+s*c,t+n,e,t+n-i*c,e,t+n-i),a.lineTo(e,t+i),(s!==0||i!==0)&&a.bezierCurveTo(e,t+i*c,e+s*c,t,e+s,t),a}function $(o,e,t){e=Object.assign({},e);let s={};if(o.hasAttribute("class")){const h=o.getAttribute("class").split(/\s/).filter(Boolean).map(l=>l.trim());for(let l=0;l<h.length;l++)s=Object.assign(s,t[`.${h[l]}`])}o.hasAttribute("id")&&(s=Object.assign(s,t[`#${o.getAttribute("id")}`]));for(let h=o.style.length,l=0;l<h;l++){const y=o.style.item(l),f=o.style.getPropertyValue(y);e[y]=f,s[y]=f}function i(h,l,y=r){o.hasAttribute(h)&&(e[l]=y(o.getAttribute(h))),s[h]&&(e[l]=y(s[h]))}function r(h){return h.startsWith("url")&&console.warn("url access in attributes is not implemented."),h}function n(h){return Math.max(0,Math.min(1,M(h)))}function c(h){return Math.max(0,M(h))}function a(h){return h.split(" ").filter(l=>l!=="").map(l=>M(l))}return i("fill","fill"),i("fill-opacity","fillOpacity",n),i("fill-rule","fillRule"),i("opacity","opacity",n),i("stroke","stroke"),i("stroke-opacity","strokeOpacity",n),i("stroke-width","strokeWidth",c),i("stroke-linecap","strokeLinecap"),i("stroke-linejoin","strokeLinejoin"),i("stroke-miterlimit","strokeMiterlimit",c),i("stroke-dasharray","strokeDasharray",a),i("stroke-dashoffset","strokeDashoffset",M),i("visibility","visibility"),e}function j(o,e,t=[],s={}){var y;if(o.nodeType!==1)return t;let i=!1,r=null,n={...e};switch(o.nodeName){case"svg":n=$(o,n,s);break;case"style":Yt(o,s);break;case"g":n=$(o,n,s);break;case"path":n=$(o,n,s),o.hasAttribute("d")&&(r=Vt(o));break;case"rect":n=$(o,n,s),r=Kt(o);break;case"polygon":n=$(o,n,s),r=Ht(o);break;case"polyline":n=$(o,n,s),r=Jt(o);break;case"circle":n=$(o,n,s),r=Wt(o);break;case"ellipse":n=$(o,n,s),r=Gt(o);break;case"line":n=$(o,n,s),r=Qt(o);break;case"defs":i=!0;break;case"use":{n=$(o,n,s);const d=(o.getAttributeNS("http://www.w3.org/1999/xlink","href")||"").substring(1),g=(y=o.viewportElement)==null?void 0:y.getElementById(d);g?j(g,n,t,s):console.warn(`'use node' references non-existent node id: ${d}`);break}default:console.warn(o);break}if(n.display==="none")return t;Object.assign(e,n);const c=new b,a=[],h=Bt(o,c,a);r&&(r.matrix(c),t.push(r),r.style=e);const l=o.childNodes;for(let f=0,d=l.length;f<d;f++){const g=l[f];i&&g.nodeName!=="style"&&g.nodeName!=="defs"||j(g,e,t,s)}return h&&(a.pop(),a.length>0?c.copy(a[a.length-1]):c.identity()),t}const Mt="data:image/svg+xml;",Pt=`${Mt}base64,`,wt=`${Mt}charset=utf8,`;function Tt(o){if(typeof o=="string"){let e;return o.startsWith(Pt)?(o=o.substring(Pt.length,o.length),e=atob(o)):o.startsWith(wt)?(o=o.substring(wt.length,o.length),e=decodeURIComponent(o)):e=o,new DOMParser().parseFromString(e,"image/svg+xml").documentElement}else return o}function te(o){return j(Tt(o),{})}function H(o,e=!0){if(!o.length)return;const t=u.MAX,s=u.MIN;return o.forEach(i=>i.getMinMax(t,s,e)),new L(t.x,t.y,s.x-t.x,s.y-t.y)}function Z(o){const{x:e,y:t,width:s,height:i}=H(o),r=o.map(n=>n.toSvgPathString()).join("");return`<svg viewBox="${e} ${t} ${s} ${i}" width="${s}px" height="${i}px" xmlns="http://www.w3.org/2000/svg">${r}</svg>`}function ee(o){return`data:image/svg+xml;base64,${btoa(Z(o))}`}function se(o){return new DOMParser().parseFromString(Z(o),"image/svg+xml").documentElement}function ne(o,e={}){const{pixelRatio:t=2,...s}=e,{left:i,top:r,width:n,height:c}=H(o),a=document.createElement("canvas");a.width=n*t,a.height=c*t,a.style.width=`${n}px`,a.style.height=`${c}px`;const h=a.getContext("2d");return h&&(h.scale(t,t),h.translate(-i,-r),o.forEach(l=>{l.drawTo(h,s)})),a}p.BoundingBox=L,p.CircleCurve=R,p.CubicBezierCurve=rt,p.Curve=k,p.CurvePath=F,p.EllipseCurve=at,p.HeartCurve=Xt,p.LineCurve=X,p.Matrix3=b,p.Path2D=I,p.PloygonCurve=Ot,p.QuadraticBezierCurve=yt,p.RectangularCurve=gt,p.SplineCurve=ft,p.Vector2=u,p.addPathCommandsToPath2D=Y,p.getPathsBoundingBox=H,p.parseArcCommand=tt,p.parsePathDataArgs=A,p.parseSvg=te,p.parseSvgToDom=Tt,p.pathCommandsToPathData=et,p.pathDataToPathCommands=G,p.pathsToCanvas=ne,p.pathsToSvg=se,p.pathsToSvgString=Z,p.pathsToSvgUrl=ee,p.setCanvasContext=q,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})});
|
package/dist/index.mjs
CHANGED
|
@@ -495,7 +495,7 @@ function parseArcCommand(path, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, s
|
|
|
495
495
|
const cy = Math.sin(xAxisRotation) * cxp + Math.cos(xAxisRotation) * cyp + (start.y + end.y) / 2;
|
|
496
496
|
const theta = svgAngle(1, 0, (x1p - cxp) / rx, (y1p - cyp) / ry);
|
|
497
497
|
const delta = svgAngle((x1p - cxp) / rx, (y1p - cyp) / ry, (-x1p - cxp) / rx, (-y1p - cyp) / ry) % (Math.PI * 2);
|
|
498
|
-
path.ellipse(cx, cy, rx, ry, xAxisRotation, theta, theta + delta, sweepFlag ===
|
|
498
|
+
path.ellipse(cx, cy, rx, ry, xAxisRotation, theta, theta + delta, sweepFlag === 0);
|
|
499
499
|
}
|
|
500
500
|
|
|
501
501
|
function getReflection(a, b) {
|
|
@@ -804,78 +804,71 @@ function parsePathDataArgs(input, flags, stride = 0) {
|
|
|
804
804
|
}
|
|
805
805
|
|
|
806
806
|
function pathCommandsToPathData(commands) {
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
807
|
+
let first;
|
|
808
|
+
let prev;
|
|
809
|
+
const data = [];
|
|
810
810
|
for (let i = 0, len = commands.length; i < len; i++) {
|
|
811
811
|
const cmd = commands[i];
|
|
812
812
|
switch (cmd.type) {
|
|
813
813
|
case "m":
|
|
814
814
|
case "M":
|
|
815
|
-
if (cmd.x === prev.
|
|
815
|
+
if (cmd.x.toFixed(4) === prev?.x.toFixed(4) && cmd.y.toFixed(4) === prev?.y.toFixed(4)) {
|
|
816
816
|
continue;
|
|
817
817
|
}
|
|
818
|
-
data
|
|
819
|
-
prev.x
|
|
820
|
-
|
|
821
|
-
first.x = cmd.x;
|
|
822
|
-
first.y = cmd.y;
|
|
818
|
+
data.push(`${cmd.type} ${cmd.x} ${cmd.y}`);
|
|
819
|
+
prev = { x: cmd.x, y: cmd.y };
|
|
820
|
+
first = { x: cmd.x, y: cmd.y };
|
|
823
821
|
break;
|
|
824
822
|
case "h":
|
|
825
823
|
case "H":
|
|
826
|
-
data
|
|
827
|
-
prev
|
|
824
|
+
data.push(`${cmd.type} ${cmd.x}`);
|
|
825
|
+
prev = { x: cmd.x, y: prev?.y ?? 0 };
|
|
828
826
|
break;
|
|
829
827
|
case "v":
|
|
830
828
|
case "V":
|
|
831
|
-
data
|
|
832
|
-
prev
|
|
829
|
+
data.push(`${cmd.type} ${cmd.y}`);
|
|
830
|
+
prev = { x: prev?.x ?? 0, y: cmd.y };
|
|
833
831
|
break;
|
|
834
832
|
case "l":
|
|
835
833
|
case "L":
|
|
836
|
-
data
|
|
837
|
-
prev.x
|
|
838
|
-
prev.y = cmd.y;
|
|
834
|
+
data.push(`${cmd.type} ${cmd.x} ${cmd.y}`);
|
|
835
|
+
prev = { x: cmd.x, y: cmd.y };
|
|
839
836
|
break;
|
|
840
837
|
case "c":
|
|
841
838
|
case "C":
|
|
842
|
-
data
|
|
843
|
-
prev.x
|
|
844
|
-
prev.y = cmd.y;
|
|
839
|
+
data.push(`${cmd.type} ${cmd.x1} ${cmd.y1} ${cmd.x2} ${cmd.y2} ${cmd.x} ${cmd.y}`);
|
|
840
|
+
prev = { x: cmd.x, y: cmd.y };
|
|
845
841
|
break;
|
|
846
842
|
case "s":
|
|
847
843
|
case "S":
|
|
848
|
-
data
|
|
849
|
-
prev.x
|
|
850
|
-
prev.y = cmd.y;
|
|
844
|
+
data.push(`${cmd.type} ${cmd.x2} ${cmd.y2} ${cmd.x} ${cmd.y}`);
|
|
845
|
+
prev = { x: cmd.x, y: cmd.y };
|
|
851
846
|
break;
|
|
852
847
|
case "q":
|
|
853
848
|
case "Q":
|
|
854
|
-
data
|
|
855
|
-
prev.x
|
|
856
|
-
prev.y = cmd.y;
|
|
849
|
+
data.push(`${cmd.type} ${cmd.x1} ${cmd.y1} ${cmd.x} ${cmd.y}`);
|
|
850
|
+
prev = { x: cmd.x, y: cmd.y };
|
|
857
851
|
break;
|
|
858
852
|
case "t":
|
|
859
853
|
case "T":
|
|
860
|
-
data
|
|
861
|
-
prev.x
|
|
862
|
-
prev.y = cmd.y;
|
|
854
|
+
data.push(`${cmd.type} ${cmd.x} ${cmd.y}`);
|
|
855
|
+
prev = { x: cmd.x, y: cmd.y };
|
|
863
856
|
break;
|
|
864
857
|
case "a":
|
|
865
858
|
case "A":
|
|
866
|
-
data
|
|
867
|
-
prev.x
|
|
868
|
-
prev.y = cmd.y;
|
|
859
|
+
data.push(`${cmd.type} ${cmd.rx} ${cmd.ry} ${cmd.angle} ${cmd.largeArcFlag} ${cmd.sweepFlag} ${cmd.x} ${cmd.y}`);
|
|
860
|
+
prev = { x: cmd.x, y: cmd.y };
|
|
869
861
|
break;
|
|
870
862
|
case "z":
|
|
871
863
|
case "Z":
|
|
872
|
-
data
|
|
873
|
-
|
|
874
|
-
|
|
864
|
+
data.push(cmd.type);
|
|
865
|
+
if (first) {
|
|
866
|
+
prev = { x: first.x, y: first.y };
|
|
867
|
+
}
|
|
875
868
|
break;
|
|
876
869
|
}
|
|
877
870
|
}
|
|
878
|
-
return data;
|
|
871
|
+
return data.join(" ");
|
|
879
872
|
}
|
|
880
873
|
|
|
881
874
|
const RE$2 = /[a-df-z][^a-df-z]*/gi;
|
|
@@ -2034,7 +2027,7 @@ class CurvePath extends Curve {
|
|
|
2034
2027
|
super();
|
|
2035
2028
|
__publicField$1(this, "curves", []);
|
|
2036
2029
|
__publicField$1(this, "startPoint");
|
|
2037
|
-
__publicField$1(this, "currentPoint"
|
|
2030
|
+
__publicField$1(this, "currentPoint");
|
|
2038
2031
|
__publicField$1(this, "autoClose", false);
|
|
2039
2032
|
__publicField$1(this, "_cacheLengths", []);
|
|
2040
2033
|
if (points) {
|
|
@@ -2132,7 +2125,7 @@ class CurvePath extends Curve {
|
|
|
2132
2125
|
return points;
|
|
2133
2126
|
}
|
|
2134
2127
|
_setCurrentPoint(point) {
|
|
2135
|
-
this.currentPoint
|
|
2128
|
+
this.currentPoint = new Vector2(point.x, point.y);
|
|
2136
2129
|
if (!this.startPoint) {
|
|
2137
2130
|
this.startPoint = this.currentPoint.clone();
|
|
2138
2131
|
}
|
|
@@ -2142,24 +2135,25 @@ class CurvePath extends Curve {
|
|
|
2142
2135
|
const start = this.startPoint;
|
|
2143
2136
|
if (start) {
|
|
2144
2137
|
const end = this.currentPoint;
|
|
2145
|
-
if (!start.equals(end)) {
|
|
2138
|
+
if (end && !start.equals(end)) {
|
|
2146
2139
|
this.curves.push(new LineCurve(end.clone(), start));
|
|
2147
|
-
|
|
2140
|
+
end.copy(start);
|
|
2148
2141
|
}
|
|
2149
2142
|
this.startPoint = void 0;
|
|
2150
2143
|
}
|
|
2151
2144
|
return this;
|
|
2152
2145
|
}
|
|
2153
2146
|
moveTo(x, y) {
|
|
2154
|
-
this.currentPoint
|
|
2147
|
+
this.currentPoint = new Vector2(x, y);
|
|
2155
2148
|
this.startPoint = this.currentPoint.clone();
|
|
2156
2149
|
return this;
|
|
2157
2150
|
}
|
|
2158
2151
|
lineTo(x, y) {
|
|
2159
|
-
|
|
2152
|
+
const start = this.currentPoint;
|
|
2153
|
+
if (!start?.equals({ x, y })) {
|
|
2160
2154
|
this.curves.push(
|
|
2161
2155
|
new LineCurve(
|
|
2162
|
-
|
|
2156
|
+
start?.clone() ?? new Vector2(),
|
|
2163
2157
|
new Vector2(x, y)
|
|
2164
2158
|
)
|
|
2165
2159
|
);
|
|
@@ -2168,10 +2162,11 @@ class CurvePath extends Curve {
|
|
|
2168
2162
|
return this;
|
|
2169
2163
|
}
|
|
2170
2164
|
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {
|
|
2171
|
-
|
|
2165
|
+
const start = this.currentPoint;
|
|
2166
|
+
if (!start?.equals({ x, y })) {
|
|
2172
2167
|
this.curves.push(
|
|
2173
2168
|
new CubicBezierCurve(
|
|
2174
|
-
|
|
2169
|
+
start?.clone() ?? new Vector2(),
|
|
2175
2170
|
new Vector2(cp1x, cp1y),
|
|
2176
2171
|
new Vector2(cp2x, cp2y),
|
|
2177
2172
|
new Vector2(x, y)
|
|
@@ -2182,10 +2177,11 @@ class CurvePath extends Curve {
|
|
|
2182
2177
|
return this;
|
|
2183
2178
|
}
|
|
2184
2179
|
quadraticCurveTo(cpx, cpy, x, y) {
|
|
2185
|
-
|
|
2180
|
+
const start = this.currentPoint;
|
|
2181
|
+
if (!start?.equals({ x, y })) {
|
|
2186
2182
|
this.curves.push(
|
|
2187
2183
|
new QuadraticBezierCurve(
|
|
2188
|
-
|
|
2184
|
+
start?.clone() ?? new Vector2(),
|
|
2189
2185
|
new Vector2(cpx, cpy),
|
|
2190
2186
|
new Vector2(x, y)
|
|
2191
2187
|
)
|
|
@@ -2199,7 +2195,7 @@ class CurvePath extends Curve {
|
|
|
2199
2195
|
return this;
|
|
2200
2196
|
}
|
|
2201
2197
|
relativeArc(x, y, radius, startAngle, endAngle, counterclockwise) {
|
|
2202
|
-
const point = this.currentPoint;
|
|
2198
|
+
const point = this.currentPoint ?? new Vector2();
|
|
2203
2199
|
this.arc(x + point.x, y + point.y, radius, startAngle, endAngle, counterclockwise);
|
|
2204
2200
|
return this;
|
|
2205
2201
|
}
|
|
@@ -2221,7 +2217,7 @@ class CurvePath extends Curve {
|
|
|
2221
2217
|
);
|
|
2222
2218
|
if (this.curves.length > 0) {
|
|
2223
2219
|
const first = curve.getPoint(0);
|
|
2224
|
-
if (!first.equals(this.currentPoint)) {
|
|
2220
|
+
if (!this.currentPoint || !first.equals(this.currentPoint)) {
|
|
2225
2221
|
this.lineTo(first.x, first.y);
|
|
2226
2222
|
}
|
|
2227
2223
|
}
|
|
@@ -2230,7 +2226,7 @@ class CurvePath extends Curve {
|
|
|
2230
2226
|
return this;
|
|
2231
2227
|
}
|
|
2232
2228
|
relativeEllipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, counterclockwise) {
|
|
2233
|
-
const point = this.currentPoint;
|
|
2229
|
+
const point = this.currentPoint ?? new Vector2();
|
|
2234
2230
|
this.ellipse(x + point.x, y + point.y, radiusX, radiusY, rotation, startAngle, endAngle, counterclockwise);
|
|
2235
2231
|
return this;
|
|
2236
2232
|
}
|
|
@@ -2246,7 +2242,8 @@ class CurvePath extends Curve {
|
|
|
2246
2242
|
return this;
|
|
2247
2243
|
}
|
|
2248
2244
|
splineThru(points) {
|
|
2249
|
-
this.
|
|
2245
|
+
const currentPoint = this.currentPoint ?? new Vector2();
|
|
2246
|
+
this.curves.push(new SplineCurve([currentPoint].concat(points)));
|
|
2250
2247
|
this._setCurrentPoint(points[points.length - 1]);
|
|
2251
2248
|
return this;
|
|
2252
2249
|
}
|
|
@@ -2279,7 +2276,7 @@ class CurvePath extends Curve {
|
|
|
2279
2276
|
this.curves.push(source.curves[i].clone());
|
|
2280
2277
|
}
|
|
2281
2278
|
this.autoClose = source.autoClose;
|
|
2282
|
-
this.currentPoint
|
|
2279
|
+
this.currentPoint = source.currentPoint?.clone();
|
|
2283
2280
|
return this;
|
|
2284
2281
|
}
|
|
2285
2282
|
}
|
|
@@ -2363,7 +2360,7 @@ class Path2D {
|
|
|
2363
2360
|
}
|
|
2364
2361
|
moveTo(x, y) {
|
|
2365
2362
|
const { currentPoint, curves } = this.currentPath;
|
|
2366
|
-
if (!currentPoint
|
|
2363
|
+
if (!currentPoint?.equals({ x, y })) {
|
|
2367
2364
|
if (curves.length) {
|
|
2368
2365
|
this.currentPath = new CurvePath().moveTo(x, y);
|
|
2369
2366
|
this.paths.push(this.currentPath);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "modern-path2d",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.8",
|
|
5
5
|
"packageManager": "pnpm@9.9.0",
|
|
6
6
|
"description": "A modern Path2D library, fully compatible with Web Path2D, with additional support for path animation, path deformation, path playback, etc.",
|
|
7
7
|
"author": "wxm",
|