svg-path-commander 2.2.0 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/index.js +169 -163
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +2 -2
- package/dist/index.min.js.map +1 -1
- package/dist/util.d.ts +23 -19
- package/dist/util.js +168 -162
- package/dist/util.js.map +1 -1
- package/package.json +23 -16
- package/tsdown.config.ts +0 -75
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.min.js","names":[],"sources":["../package.json","../node_modules/.pnpm/@thednp+dommatrix@3.0.4/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/util/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isPolygonArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/morph/samplePolygon.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/util/isMultiPath.ts","../src/util/isPolylineArray.ts","../src/util/isClosedPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/morph/fixPath.ts","../src/morph/splitCubicSegment.ts","../src/morph/pathToPolyline.ts","../src/morph/splitLineToCount.ts","../src/morph/getPathSplits.ts","../src/morph/splitLinePathToCount.ts","../src/morph/splitCubicToCount.ts","../src/morph/splitCurvePathToCount.ts","../src/morph/getRotatedPath.ts","../src/morph/equalizeSegments.ts","../src/util/pathIntersection.ts","../src/morph/createPlaceholder.ts","../src/morph/matchPaths.ts","../src/morph/classifyPaths.ts","../src/morph/equalizePaths.ts","../src/main.ts","../src/index.ts"],"sourcesContent":["","//#region src/index.ts\nvar e = {\n\ta: 1,\n\tb: 0,\n\tc: 0,\n\td: 1,\n\te: 0,\n\tf: 0,\n\tm11: 1,\n\tm12: 0,\n\tm13: 0,\n\tm14: 0,\n\tm21: 0,\n\tm22: 1,\n\tm23: 0,\n\tm24: 0,\n\tm31: 0,\n\tm32: 0,\n\tm33: 1,\n\tm34: 0,\n\tm41: 0,\n\tm42: 0,\n\tm43: 0,\n\tm44: 1,\n\tis2D: !0,\n\tisIdentity: !0\n}, t = (e) => (e instanceof Float64Array || e instanceof Float32Array || Array.isArray(e) && e.every((e) => typeof e == \"number\")) && [6, 16].some((t) => e.length === t), n = (t) => t instanceof DOMMatrix || t instanceof h || typeof t == \"object\" && Object.keys(e).every((e) => t && e in t), r = (e) => {\n\tlet n = new h(), r = Array.from(e);\n\tif (!t(r)) throw TypeError(`CSSMatrix: \"${r.join(\",\")}\" must be an array with 6/16 numbers.`);\n\t// istanbul ignore else @preserve\n\tif (r.length === 16) {\n\t\tlet [e, t, i, a, o, s, c, l, u, d, f, p, m, h, g, _] = r;\n\t\tn.m11 = e, n.a = e, n.m21 = o, n.c = o, n.m31 = u, n.m41 = m, n.e = m, n.m12 = t, n.b = t, n.m22 = s, n.d = s, n.m32 = d, n.m42 = h, n.f = h, n.m13 = i, n.m23 = c, n.m33 = f, n.m43 = g, n.m14 = a, n.m24 = l, n.m34 = p, n.m44 = _;\n\t} else if (r.length === 6) {\n\t\tlet [e, t, i, a, o, s] = r;\n\t\tn.m11 = e, n.a = e, n.m12 = t, n.b = t, n.m21 = i, n.c = i, n.m22 = a, n.d = a, n.m41 = o, n.e = o, n.m42 = s, n.f = s;\n\t}\n\treturn n;\n}, i = (e) => {\n\tif (n(e)) return r([\n\t\te.m11,\n\t\te.m12,\n\t\te.m13,\n\t\te.m14,\n\t\te.m21,\n\t\te.m22,\n\t\te.m23,\n\t\te.m24,\n\t\te.m31,\n\t\te.m32,\n\t\te.m33,\n\t\te.m34,\n\t\te.m41,\n\t\te.m42,\n\t\te.m43,\n\t\te.m44\n\t]);\n\tthrow TypeError(`CSSMatrix: \"${JSON.stringify(e)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`);\n}, a = (e) => {\n\tif (typeof e != \"string\") throw TypeError(`CSSMatrix: \"${JSON.stringify(e)}\" is not a string.`);\n\tlet t = String(e).replace(/\\s/g, \"\"), n = new h(), i = `CSSMatrix: invalid transform string \"${e}\"`;\n\treturn t.split(\")\").filter((e) => e).forEach((e) => {\n\t\tlet [t, a] = e.split(\"(\");\n\t\tif (!a) throw TypeError(i);\n\t\tlet o = a.split(\",\").map((e) => e.includes(\"rad\") ? 180 / Math.PI * parseFloat(e) : parseFloat(e)), [s, c, l, u] = o, d = [\n\t\t\ts,\n\t\t\tc,\n\t\t\tl\n\t\t], f = [\n\t\t\ts,\n\t\t\tc,\n\t\t\tl,\n\t\t\tu\n\t\t];\n\t\tif (t === \"perspective\" && s && [c, l].every((e) => e === void 0)) n.m34 = -1 / s;\n\t\telse if (t.includes(\"matrix\") && [6, 16].includes(o.length) && o.every((e) => !Number.isNaN(+e))) {\n\t\t\tlet e = o.map((e) => Math.abs(e) < 1e-6 ? 0 : e);\n\t\t\tn.multiplySelf(r(e));\n\t\t} else if (t === \"translate3d\" && d.every((e) => !Number.isNaN(+e))) n.translateSelf(s, c, l);\n\t\telse if (t === \"translate\" && s && l === void 0) n.translateSelf(s, c || 0, 0);\n\t\telse if (t === \"rotate3d\" && f.every((e) => !Number.isNaN(+e)) && u) n.rotateAxisAngleSelf(s, c, l, u);\n\t\telse if (t === \"rotate\" && s && [c, l].every((e) => e === void 0)) n.rotateSelf(0, 0, s);\n\t\telse if (t === \"scale3d\" && d.every((e) => !Number.isNaN(+e)) && d.some((e) => e !== 1)) n.scaleSelf(s, c, l);\n\t\telse if (t === \"scale\" && !Number.isNaN(s) && (s !== 1 || c !== 1) && l === void 0) {\n\t\t\tlet e = Number.isNaN(+c) ? s : c;\n\t\t\tn.scaleSelf(s, e, 1);\n\t\t} else if (t === \"skew\" && (s || !Number.isNaN(s) && c) && l === void 0) n.skewSelf(s, c || 0);\n\t\telse if ([\n\t\t\t\"translate\",\n\t\t\t\"rotate\",\n\t\t\t\"scale\",\n\t\t\t\"skew\"\n\t\t].some((e) => t.includes(e)) && /[XYZ]/.test(t) && s && [c, l].every((e) => e === void 0)) if (t === \"skewX\" || t === \"skewY\") n[t === \"skewX\" ? \"skewXSelf\" : \"skewYSelf\"](s);\n\t\telse {\n\t\t\tlet e = t.replace(/[XYZ]/, \"\"), r = t.replace(e, \"\"), i = [\n\t\t\t\t\"X\",\n\t\t\t\t\"Y\",\n\t\t\t\t\"Z\"\n\t\t\t].indexOf(r), a = e === \"scale\" ? 1 : 0, o = e + \"Self\", c = [\n\t\t\t\ti === 0 ? s : a,\n\t\t\t\ti === 1 ? s : a,\n\t\t\t\ti === 2 ? s : a\n\t\t\t];\n\t\t\tn[o](...c);\n\t\t}\n\t\telse throw TypeError(i);\n\t}), n;\n}, o = (e, t) => t ? [\n\te.a,\n\te.b,\n\te.c,\n\te.d,\n\te.e,\n\te.f\n] : [\n\te.m11,\n\te.m12,\n\te.m13,\n\te.m14,\n\te.m21,\n\te.m22,\n\te.m23,\n\te.m24,\n\te.m31,\n\te.m32,\n\te.m33,\n\te.m34,\n\te.m41,\n\te.m42,\n\te.m43,\n\te.m44\n], s = (e, t, n) => {\n\tlet r = new h();\n\treturn r.m41 = e, r.e = e, r.m42 = t, r.f = t, r.m43 = n, r;\n}, c = (e, t, n) => {\n\tlet r = new h(), i = Math.PI / 180, a = e * i, o = t * i, s = n * i, c = Math.cos(a), l = -Math.sin(a), u = Math.cos(o), d = -Math.sin(o), f = Math.cos(s), p = -Math.sin(s), m = u * f, g = -u * p;\n\tr.m11 = m, r.a = m, r.m12 = g, r.b = g, r.m13 = d;\n\tlet _ = l * d * f + c * p;\n\tr.m21 = _, r.c = _;\n\tlet v = c * f - l * d * p;\n\treturn r.m22 = v, r.d = v, r.m23 = -l * u, r.m31 = l * p - c * d * f, r.m32 = l * f + c * d * p, r.m33 = c * u, r;\n}, l = (e = 0, t = 0, n = 0, r = 0) => {\n\tlet i = new h(), a = Math.sqrt(e * e + t * t + n * n);\n\tif (a === 0) return i;\n\tlet o = e / a, s = t / a, c = n / a, l = Math.PI / 360 * r, u = Math.sin(l), d = Math.cos(l), f = u * u, p = o * o, m = s * s, g = c * c, _ = 1 - 2 * (m + g) * f;\n\ti.m11 = _, i.a = _;\n\tlet v = 2 * (o * s * f + c * u * d);\n\ti.m12 = v, i.b = v, i.m13 = 2 * (o * c * f - s * u * d);\n\tlet y = 2 * (s * o * f - c * u * d);\n\ti.m21 = y, i.c = y;\n\tlet b = 1 - 2 * (g + p) * f;\n\treturn i.m22 = b, i.d = b, i.m23 = 2 * (s * c * f + o * u * d), i.m31 = 2 * (c * o * f + s * u * d), i.m32 = 2 * (c * s * f - o * u * d), i.m33 = 1 - 2 * (p + m) * f, i;\n}, u = (e, t, n) => {\n\tlet r = new h();\n\treturn r.m11 = e, r.a = e, r.m22 = t, r.d = t, r.m33 = n, r;\n}, d = (e, t) => {\n\tlet n = new h();\n\tif (e) {\n\t\tlet t = e * Math.PI / 180, r = Math.tan(t);\n\t\tn.m21 = r, n.c = r;\n\t}\n\tif (t) {\n\t\tlet e = t * Math.PI / 180, r = Math.tan(e);\n\t\tn.m12 = r, n.b = r;\n\t}\n\treturn n;\n}, f = (e) => d(e, 0), p = (e) => d(0, e), m = (e, t) => r([\n\tt.m11 * e.m11 + t.m12 * e.m21 + t.m13 * e.m31 + t.m14 * e.m41,\n\tt.m11 * e.m12 + t.m12 * e.m22 + t.m13 * e.m32 + t.m14 * e.m42,\n\tt.m11 * e.m13 + t.m12 * e.m23 + t.m13 * e.m33 + t.m14 * e.m43,\n\tt.m11 * e.m14 + t.m12 * e.m24 + t.m13 * e.m34 + t.m14 * e.m44,\n\tt.m21 * e.m11 + t.m22 * e.m21 + t.m23 * e.m31 + t.m24 * e.m41,\n\tt.m21 * e.m12 + t.m22 * e.m22 + t.m23 * e.m32 + t.m24 * e.m42,\n\tt.m21 * e.m13 + t.m22 * e.m23 + t.m23 * e.m33 + t.m24 * e.m43,\n\tt.m21 * e.m14 + t.m22 * e.m24 + t.m23 * e.m34 + t.m24 * e.m44,\n\tt.m31 * e.m11 + t.m32 * e.m21 + t.m33 * e.m31 + t.m34 * e.m41,\n\tt.m31 * e.m12 + t.m32 * e.m22 + t.m33 * e.m32 + t.m34 * e.m42,\n\tt.m31 * e.m13 + t.m32 * e.m23 + t.m33 * e.m33 + t.m34 * e.m43,\n\tt.m31 * e.m14 + t.m32 * e.m24 + t.m33 * e.m34 + t.m34 * e.m44,\n\tt.m41 * e.m11 + t.m42 * e.m21 + t.m43 * e.m31 + t.m44 * e.m41,\n\tt.m41 * e.m12 + t.m42 * e.m22 + t.m43 * e.m32 + t.m44 * e.m42,\n\tt.m41 * e.m13 + t.m42 * e.m23 + t.m43 * e.m33 + t.m44 * e.m43,\n\tt.m41 * e.m14 + t.m42 * e.m24 + t.m43 * e.m34 + t.m44 * e.m44\n]), h = class {\n\tstatic Translate = s;\n\tstatic Rotate = c;\n\tstatic RotateAxisAngle = l;\n\tstatic Scale = u;\n\tstatic SkewX = f;\n\tstatic SkewY = p;\n\tstatic Skew = d;\n\tstatic Multiply = m;\n\tstatic fromArray = r;\n\tstatic fromMatrix = i;\n\tstatic fromString = a;\n\tstatic toArray = o;\n\tstatic isCompatibleArray = t;\n\tstatic isCompatibleObject = n;\n\tconstructor(e) {\n\t\treturn this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, e ? this.setMatrixValue(e) : this;\n\t}\n\tget isIdentity() {\n\t\treturn this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n\t}\n\tget is2D() {\n\t\treturn this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n\t}\n\tsetMatrixValue(e) {\n\t\treturn typeof e == \"string\" && e.length && e !== \"none\" ? a(e) : Array.isArray(e) || e instanceof Float64Array || e instanceof Float32Array ? r(e) : typeof e == \"object\" ? i(e) : this;\n\t}\n\ttoFloat32Array(e) {\n\t\treturn Float32Array.from(o(this, e));\n\t}\n\ttoFloat64Array(e) {\n\t\treturn Float64Array.from(o(this, e));\n\t}\n\ttoString() {\n\t\tlet { is2D: e } = this, t = this.toFloat64Array(e).join(\", \");\n\t\treturn `${e ? \"matrix\" : \"matrix3d\"}(${t})`;\n\t}\n\ttoJSON() {\n\t\tlet { is2D: e, isIdentity: t } = this;\n\t\treturn {\n\t\t\t...this,\n\t\t\tis2D: e,\n\t\t\tisIdentity: t\n\t\t};\n\t}\n\tmultiply(e) {\n\t\treturn m(this, e);\n\t}\n\ttranslate(e, t, n) {\n\t\treturn this.multiply(s(e, t ?? 0, n ?? 0));\n\t}\n\tscale(e, t, n) {\n\t\treturn this.multiply(u(e, t ?? e, n ?? 1));\n\t}\n\trotate(e, t, n) {\n\t\tlet r = e, i = t || 0, a = n || 0;\n\t\treturn typeof e == \"number\" && t === void 0 && n === void 0 && (a = r, r = 0, i = 0), this.multiply(c(r, i, a));\n\t}\n\trotateAxisAngle(e = 0, t = 0, n = 0, r = 0) {\n\t\tif ([\n\t\t\te,\n\t\t\tt,\n\t\t\tn,\n\t\t\tr\n\t\t].some((e) => !Number.isFinite(e))) throw TypeError(\"CSSMatrix: expecting 4 values\");\n\t\treturn Math.sqrt(e * e + t * t + n * n) === 0 ? i(this) : this.multiply(l(e, t, n, r));\n\t}\n\tskewX(e) {\n\t\treturn this.multiply(f(e));\n\t}\n\tskewY(e) {\n\t\treturn this.multiply(p(e));\n\t}\n\tskew(e, t) {\n\t\treturn this.multiply(d(e, t));\n\t}\n\tmultiplySelf(e) {\n\t\tlet t = m(this, e);\n\t\treturn Object.assign(this, t), this;\n\t}\n\ttranslateSelf(e, t, n) {\n\t\treturn this.multiplySelf(s(e, t ?? 0, n ?? 0));\n\t}\n\tscaleSelf(e, t, n) {\n\t\treturn this.multiplySelf(u(e, t ?? e, n ?? 1));\n\t}\n\trotateSelf(e, t, n) {\n\t\tlet r = e, i = t || 0, a = n || 0;\n\t\treturn typeof e == \"number\" && t === void 0 && n === void 0 && (a = r, r = 0, i = 0), this.multiplySelf(c(r, i, a));\n\t}\n\trotateAxisAngleSelf(e = 0, t = 0, n = 0, r = 0) {\n\t\tif ([\n\t\t\te,\n\t\t\tt,\n\t\t\tn,\n\t\t\tr\n\t\t].some((e) => !Number.isFinite(e))) throw TypeError(\"CSSMatrix: expecting 4 values\");\n\t\treturn Math.sqrt(e * e + t * t + n * n) === 0 ? this : this.multiplySelf(l(e, t, n, r));\n\t}\n\tskewXSelf(e) {\n\t\treturn this.multiplySelf(f(e));\n\t}\n\tskewYSelf(e) {\n\t\treturn this.multiplySelf(p(e));\n\t}\n\tskewSelf(e, t) {\n\t\treturn this.multiplySelf(d(e, t));\n\t}\n\ttransformPoint(e) {\n\t\tlet t = this.m11 * e.x + this.m21 * e.y + this.m31 * e.z + this.m41 * e.w, n = this.m12 * e.x + this.m22 * e.y + this.m32 * e.z + this.m42 * e.w, r = this.m13 * e.x + this.m23 * e.y + this.m33 * e.z + this.m43 * e.w, i = this.m14 * e.x + this.m24 * e.y + this.m34 * e.z + this.m44 * e.w;\n\t\treturn e instanceof DOMPoint ? new DOMPoint(t, n, r, i) : {\n\t\t\tx: t,\n\t\t\ty: n,\n\t\t\tz: r,\n\t\t\tw: i\n\t\t};\n\t}\n};\n//#endregion\nexport { h as default };\n\n//# sourceMappingURL=dommatrix.mjs.map","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nexport const midPoint = (\n [ax, ay]: PointTuple,\n [bx, by]: PointTuple,\n t: number,\n): PointTuple => {\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nexport const distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n","import { midPoint } from \"./midPoint\";\nimport { distanceSquareRoot } from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the bounding box for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength, lineTools };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance along the arc\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n arcTools,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n\nexport {\n bezierLength,\n bezierTools,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { BBoxMaxima, type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the bounding box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n): BBoxMaxima => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the bounding box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n quadTools,\n};\n","import { distanceSquareRoot } from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * @see https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon Array of [x, y]\n * @returns Signed area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\n/**\n * Computes the centroid (geometric center) of a polygon.\n * Uses average of all endpoint coordinates (robust for polygons and curves).\n *\n * @param polygon A polygon with consists of [x, y] tuples\n * @returns [x, y] centroid\n */\nconst polygonCentroid = (polygon: PointTuple[]): PointTuple => {\n if (polygon.length === 0) return [0, 0];\n\n let sumX = 0;\n let sumY = 0;\n\n for (const [x, y] of polygon) {\n sumX += x;\n sumY += y;\n }\n\n const count = polygon.length;\n return [sumX / count, sumY / count];\n};\n\nconst polygonTools = {\n polygonArea,\n polygonLength,\n polygonCentroid,\n};\n\nexport { polygonArea, polygonCentroid, polygonLength, polygonTools };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nexport const rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n","/**\n * Rounds a number to the specified number of decimal places.\n *\n * @param n - The number to round\n * @param round - Number of decimal places\n * @returns The rounded number\n */\nexport const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nexport const defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n","/** Segment params length */\n\nexport const paramsCounts = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n","import { paramsCounts } from \"./paramsCount\";\nimport { PathParser } from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path - The PathParser instance\n */\nexport const finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCounts[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCounts[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCounts[relativeCommand]) {\n break;\n }\n }\n};\n","/** Error prefix used in all SVGPathCommander TypeError messages. */\nexport const error = \"SVGPathCommanderError\";\n","import { error } from \"../util/error\";\nimport type { PathParser } from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path - The PathParser instance\n */\nexport const scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nexport const isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\n","/** Error message prefix used when a path string cannot be parsed. */\nexport const invalidPathValue = \"Invalid path value\";\n","import { isDigit } from \"./isDigit\";\nimport { invalidPathValue } from \"./invalidPathValue\";\nimport { error } from \"../util/error\";\nimport type { PathParser } from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path - The PathParser instance\n */\nexport const scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nexport const isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\n","import { isSpace } from \"./isSpace\";\nimport type { PathParser } from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path - The PathParser instance\n */\nexport const skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nexport const isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\n","import { isDigit } from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nexport const isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nexport const isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nexport const isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\n","import { finalizeSegment } from \"./finalizeSegment\";\nimport { paramsCounts } from \"./paramsCount\";\nimport { scanFlag } from \"./scanFlag\";\nimport { scanParam } from \"./scanParam\";\nimport { skipSpaces } from \"./skipSpaces\";\nimport { isPathCommand } from \"./isPathCommand\";\nimport { isDigitStart } from \"./isDigitStart\";\nimport { isArcCommand } from \"./isArcCommand\";\nimport { isMoveCommand } from \"./isMoveCommand\";\nimport { invalidPathValue } from \"./invalidPathValue\";\nimport { error } from \"../util/error\";\n\nimport { type PathParser } from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path - The PathParser instance\n */\nexport const scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramsCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) &&\n lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max &&\n pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString - The SVG path string to parse\n */\nexport class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import { scanSegment } from \"./scanSegment\";\nimport { skipSpaces } from \"./skipSpaces\";\nimport { PathParser } from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `PathArray`.\n *\n * If parameter value is already a `PathArray`,\n * return a clone of it.\n\n * @example\n * parsePathString(\"M 0 0L50 50\")\n * // => [[\"M\",0,0],[\"L\",50,50]]\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nexport const parsePathString = <T extends PathArray>(pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as T;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nexport const absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\n","// import paramsParser from '../parser/paramsParser';\nimport type { AbsoluteCommand, IteratorCallback, PathArray } from \"../types\";\n\n/**\n * Iterates over a `PathArray`, executing a callback for each segment.\n * The callback can:\n * - Read current position (`x`, `y`)\n * - Modify the segment (return new segment)\n * - Stop early (return `false`)\n *\n * The iterator maintains accurate current point (`x`, `y`) and subpath start (`mx`, `my`)\n * while correctly handling relative/absolute commands, including H/V and Z.\n *\n * **Important**: If the callback returns a new segment with more coordinates (e.g., Q → C),\n * the path length may increase, and iteration will continue over new segments.\n *\n * @template T - Specific PathArray type (e.g., CurveArray, PolylineArray)\n * @param path - The source `PathArray` to iterate over\n * @param iterator - Callback function for each segment\n * @param iterator.segment - Current path segment\n * @param iterator.index - Index of current segment\n * @param iterator.x - Current X position (after applying relative offset)\n * @param iterator.y - Current Y position (after applying relative offset)\n * @returns The modified `path` (or original if no changes)\n *\n * @example\n * iterate(path, (seg, i, x, y) => {\n * if (seg[0] === 'L') return ['C', x, y, seg[1], seg[2], seg[1], seg[2]];\n * });\n */\nexport const iterate = <T extends PathArray>(\n path: T,\n iterator: IteratorCallback<T>,\n) => {\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n\n let i = 0;\n while (i < path.length) {\n const segment = path[i];\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n const segLen = segment.length;\n\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n }\n\n i += 1;\n }\n return path as T;\n};\n","import type { AbsoluteArray, PathArray } from \"../types\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { absolutizeSegment } from \"../process/absolutizeSegment\";\nimport { iterate } from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput - The path string or PathArray\n * @returns The resulted PathArray with absolute values\n *\n * @example\n * ```ts\n * pathToAbsolute('M10 10l80 80')\n * // => [['M', 10, 10], ['L', 90, 90]]\n * ```\n */\nexport const pathToAbsolute = <T extends PathArray>(pathInput: string | T) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment) as AbsoluteArray;\n};\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nexport const relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n","import type { PathArray, RelativeArray } from \"../types\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { iterate } from \"../process/iterate\";\nimport { relativizeSegment } from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput - The path string or PathArray\n * @returns The resulted PathArray with relative values\n *\n * @example\n * ```ts\n * pathToRelative('M10 10L90 90')\n * // => [['M', 10, 10], ['l', 80, 80]]\n * ```\n */\nexport const pathToRelative = <T extends PathArray>(\n pathInput: string | T,\n): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment) as RelativeArray;\n};\n","import { rotateVector } from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @returns the resulting cubic-bezier segment(s)\n */\nexport const arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nexport const quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\n","import { midPoint } from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nexport const lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\n","import { arcToCubic } from \"./arcToCubic\";\nimport { quadToCubic } from \"./quadToCubic\";\nimport { lineToCubic } from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nexport const segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const pathCommand = segment[0];\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n // const { x1: px1, y1: py1, x: px, y: py } = params;\n const { x1: px1, y1: py1 } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.mx = x;\n params.my = y;\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, params.mx, params.my),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nexport const normalizeSegment = (\n segment: PathSegment,\n params: ParserParams,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\n","import type { ParserParams } from \"../interface\";\n\n/**\n * Default parser parameters object used to track position state\n * while iterating through path segments.\n */\nexport const paramsParser: ParserParams = {\n mx: 0,\n my: 0,\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n","import { segmentToCubic } from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport { iterate } from \"../process/iterate\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { normalizeSegment } from \"../process/normalizeSegment\";\nimport { paramsParser } from \"../parser/paramsParser\";\n\n/**\n * Parses a path string or PathArray and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * @param pathInput - The path string or PathArray\n * @returns The resulted CurveArray with all segments as cubic beziers\n *\n * @example\n * ```ts\n * pathToCurve('M10 50q15 -25 30 0')\n * // => [['M', 10, 50], ['C', 25, 25, 40, 50, 40, 50]]\n * ```\n */\nexport const pathToCurve = <T extends PathArray>(\n pathInput: string | T,\n): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n // let mx = 0;\n // let my = 0;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n if (normalSegment[0] === \"M\") {\n params.mx = normalSegment[1];\n params.my = normalSegment[2];\n }\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n }) as CurveArray;\n};\n","import type { PathArray, PathSegment } from \"../types\";\nimport { defaultOptions } from \"../options/options\";\nimport { roundTo } from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the PathArray segments.\n *\n * @param path - The PathArray object\n * @param roundOption - Amount of decimals to round values to, or \"off\"\n * @returns The concatenated path string\n *\n * @example\n * ```ts\n * pathToString([['M', 10, 10], ['L', 90, 90]], 2)\n * // => 'M10 10L90 90'\n * ```\n */\nexport const pathToString = <T extends PathArray>(\n path: T,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n","import { iterate } from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { absolutizeSegment } from \"../process/absolutizeSegment\";\n\n/**\n * Calculates the bounding box of a path.\n *\n * @param pathInput - The path string or PathArray\n * @returns An object with width, height, x, y, x2, y2, cx, cy, cz properties\n *\n * @example\n * ```ts\n * getPathBBox('M0 0L100 0L100 100L0 100Z')\n * // => { x: 0, y: 0, width: 100, height: 100, x2: 100, y2: 100, cx: 50, cy: 50, cz: 150 }\n * ```\n */\nexport const getPathBBox = <T extends PathArray>(pathInput: T | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport { iterate } from \"../process/iterate\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { absolutizeSegment } from \"../process/absolutizeSegment\";\n\n/**\n * Returns the total length of a path, equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput - The target path string or PathArray\n * @returns The total length of the path\n *\n * @example\n * ```ts\n * getTotalLength('M0 0L100 0L100 100L0 100Z')\n * // => 300\n * ```\n */\nexport const getTotalLength = <T extends PathArray>(pathInput: string | T) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n","/** Small threshold value used for floating-point distance comparisons in path calculations. */\nconst DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import type { NormalArray, PathArray } from \"../types\";\nimport { normalizeSegment } from \"./normalizeSegment\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { paramsParser } from \"../parser/paramsParser\";\nimport { iterate } from \"./iterate\";\n\n/**\n * Parses a path string or PathArray, then iterates the result for:\n * * converting segments to absolute values\n * * converting shorthand commands to their non-shorthand notation\n *\n * @param pathInput - The path string or PathArray\n * @returns The normalized PathArray\n *\n * @example\n * ```ts\n * normalizePath('M10 90s20 -80 40 -80s20 80 40 80')\n * // => [['M', 10, 90], ['C', 30, 90, 25, 10, 50, 10], ['C', 75, 10, 70, 90, 90, 90]]\n * ```\n */\nexport const normalizePath = (pathInput: string | PathArray): NormalArray => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n }) as NormalArray;\n};\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport { iterate } from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport { normalizePath } from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length along a path.\n *\n * @param pathInput - The PathArray or path string to look into\n * @param distance - The distance along the path\n * @returns The requested {x, y} point coordinates\n *\n * @example\n * ```ts\n * getPointAtLength('M0 0L100 0L100 100Z', 50)\n * // => { x: 50, y: 0 }\n * ```\n */\nexport const getPointAtLength = <T extends PathArray>(\n pathInput: string | T,\n distance?: number,\n) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n iterate(path, (seg, _, lastX, lastY) => {\n const pathCommand = seg[0];\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { getTotalLength } from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nexport const getPropertiesAtLength = <T extends PathArray>(\n pathInput: string | T,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as T;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as T;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as T;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(\n ({ lengthAtSegment: l }) => l <= distance,\n ) as SegmentProperties;\n};\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport { getPointAtLength } from \"./getPointAtLength\";\nimport { getPropertiesAtLength } from \"./getPropertiesAtLength\";\nimport { getTotalLength } from \"./getTotalLength\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { normalizePath } from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nexport const getPropertiesAtPoint = <T extends PathArray>(\n pathInput: string | T,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n","import type { PathArray } from \"../types\";\nimport { getPropertiesAtPoint } from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nexport const getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n","import { pathToCurve } from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the signed area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path - The shape PathArray\n * @returns The signed area of the shape (positive for clockwise, negative for counter-clockwise)\n *\n * @example\n * ```ts\n * getPathArea([['M', 0, 0], ['L', 100, 0], ['L', 100, 100], ['L', 0, 100], ['Z']])\n * // => -10000 (counter-clockwise square)\n * ```\n */\nexport const getPathArea = <T extends PathArray>(path: T) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\n","import { getPathArea } from \"./getPathArea\";\nimport { pathToCurve } from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nexport const getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n","import type { PathArray, PathSegment } from \"../types\";\nimport { getPropertiesAtLength } from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nexport const getSegmentAtLength = <T extends PathArray>(\n pathInput: string | T,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport { getPropertiesAtPoint } from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nexport const getSegmentOfPoint = <T extends PathArray>(\n path: string | T,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport { paramsCounts } from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nexport const isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCounts[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\n","import type { AbsoluteArray } from \"../types\";\nimport { isPathArray } from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nexport const isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\n","import type { NormalArray } from \"../types\";\nimport { isAbsoluteArray } from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments in non-shorthand notation\n * with absolute values.\n *\n * @param path - the array to be checked\n * @returns true if the array is a normalized path array\n */\nexport const isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\n","import { isNormalizedArray } from \"./isNormalizedArray\";\nimport { PathArray, PolygonArray } from \"../types\";\n/**\n * Checks if a path is a polygon (only M, L, H, V, Z commands).\n * @param pathArray PathArray (pre-normalize if needed)\n * @returns boolean\n */\nexport const isPolygonArray = (path: PathArray): path is PolygonArray => {\n return isNormalizedArray(path) && path.every(([pc]) => \"MLVHZ\".includes(pc));\n};\n","import { CurveArray } from \"../types\";\nimport { isNormalizedArray } from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nexport const isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\n","import type { PathArray } from \"../types\";\nimport { getPropertiesAtPoint } from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nexport const isPointInStroke = <T extends PathArray>(\n pathInput: string | T,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\n","import type { RelativeArray } from \"../types\";\nimport { isPathArray } from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nexport const isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\n","import { scanSegment } from \"../parser/scanSegment\";\nimport { skipSpaces } from \"../parser/skipSpaces\";\nimport { PathParser } from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nexport const isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\n","// src/morph/samplePolygon.ts\n\nimport { error } from \"../util/error\";\nimport { iterate } from \"../process/iterate\";\nimport type { NormalArray, PointTuple } from \"../types\";\n\n/**\n * Samples points from a path to form a polygon approximation.\n * Collects endpoints of each segment (M start + ends of L/C/etc).\n *\n * If `sampleSize` parameter is provided, it will return a polygon\n * equivalent to the original `PathArray`.\n * @param path `PolygonPathArray` or `CurvePathArray`\n * @returns Array of [x, y] points\n */\nexport function samplePolygon<T extends NormalArray>(\n path: T,\n): PointTuple[] {\n const points: PointTuple[] = [];\n\n let [mx, my] = [0, 0];\n\n iterate(path, (seg) => {\n const cmd = seg[0];\n if (cmd === \"M\") {\n [mx, my] = [seg[1] as number, seg[2] as number];\n points.push([mx, my]);\n } else if (cmd === \"L\") {\n points.push([seg[1] as number, seg[2] as number]);\n } else if (cmd === \"C\") {\n points.push([seg[5] as number, seg[6] as number]);\n } else if (cmd === \"A\") {\n points.push([seg[6] as number, seg[7] as number]);\n } else if (cmd === \"Z\") {\n points.push([mx, my]);\n } else {\n throw new TypeError(`${error}: path command \"${cmd}\" is not supported`);\n }\n });\n\n return points;\n}\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nexport const shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n","/**\n * Checks if a value is a DOM Element.\n *\n * @param node - The value to check\n * @returns True if the value is a DOM Element (nodeType === 1)\n */\nexport const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport { error } from \"./error\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { shapeParams } from \"./shapeParams\";\nimport { isPathArray } from \"./isPathArray\";\nimport { isElement } from \"./isElement\";\n\n/**\n * Returns a new PathArray from line attributes.\n *\n * @param attr - Shape configuration with x1, y1, x2, y2\n * @returns A new line PathArray\n *\n * @example\n * ```ts\n * getLinePath({ x1: 0, y1: 0, x2: 100, y2: 100 })\n * // => [['M', 0, 0], ['L', 100, 100]]\n * ```\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new PathArray from polyline/polygon attributes.\n *\n * @param attr - Shape configuration with points string\n * @returns A new polygon/polyline PathArray\n *\n * @example\n * ```ts\n * getPolyPath({ type: 'polygon', points: '0,0 100,0 100,100 0,100' })\n * // => [['M', 0, 0], ['L', 100, 0], ['L', 100, 100], ['L', 0, 100], ['z']]\n * ```\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (\n attr.type === \"polygon\" ? [...pathArray, [\"z\"]] : pathArray\n ) as PathArray;\n};\n\n/**\n * Returns a new PathArray from circle attributes.\n *\n * @param attr - Shape configuration with cx, cy, r\n * @returns A circle PathArray\n *\n * @example\n * ```ts\n * getCirclePath({ cx: 50, cy: 50, r: 25 })\n * // => [['M', 25, 50], ['a', 25, 25, 0, 1, 0, 50, 0], ['a', 25, 25, 0, 1, 0, -50, 0]]\n * ```\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new PathArray from ellipse attributes.\n *\n * @param attr - Shape configuration with cx, cy, rx, ry\n * @returns An ellipse PathArray\n *\n * @example\n * ```ts\n * getEllipsePath({ cx: 50, cy: 50, rx: 30, ry: 20 })\n * // => [['M', 20, 50], ['a', 30, 20, 0, 1, 0, 60, 0], ['a', 30, 20, 0, 1, 0, -60, 0]]\n * ```\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new PathArray from rect attributes.\n *\n * @param attr - Object with x, y, width, height, and optional rx/ry\n * @returns A new PathArray from `<rect>` attributes\n *\n * @example\n * ```ts\n * getRectanglePath({ x: 0, y: 0, width: 100, height: 50, ry: 10 })\n * // => [['M', 10, 0], ['h', 80], ['a', 10, 10, 0, 0, 1, 10, 10], ...]\n * ```\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a `<line>`, `<polyline>`,\n * `<polygon>`, `<rect>`, `<ellipse>`, `<circle>`, <path> or `<glyph>`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @returns the newly created `<path>` element\n */\nexport const shapeToPathArray = (element: ShapeTypes | ShapeOps) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type = (\n targetIsElement ? tagName : (element as ShapeOps).type\n ) as ShapeOps[\"type\"];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record<string, string>;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport { pathToString } from \"../convert/pathToString\";\nimport { defaultOptions } from \"../options/options\";\nimport { error } from \"./error\";\nimport { isValidPath } from \"./isValidPath\";\nimport { isElement } from \"./isElement\";\nimport { shapeToPathArray } from \"./shapeToPathArray\";\nimport { shapeParams } from \"./shapeParams\";\n\n/**\n * Returns a new `<path>` element created from attributes of a `<line>`, `<polyline>`,\n * `<polygon>`, `<rect>`, `<ellipse>`, `<circle>` or `<glyph>`. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `<path>` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element - Target shape element or shape options object\n * @param replace - Option to replace target element\n * @param ownerDocument - Document for creating the element\n * @returns The newly created `<path>` element, or false if the path is invalid\n *\n * @example\n * ```ts\n * const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n * circle.setAttribute('cx', '50')\n * circle.setAttribute('cy', '50')\n * circle.setAttribute('r', '25')\n * const path = shapeToPath(circle)\n * path.getAttribute('d')\n * // => 'M50 25A25 25 0 1 1 50 75A25 25 0 1 1 50 25Z'\n * ```\n */\nexport const shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record<string, string>;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n for (let i = 0; i < element.attributes.length; i++) {\n const attr = element.attributes[i];\n if (attr && !shapeAttrs.includes(attr.name)) {\n path.setAttribute(attr.name, attr.value);\n }\n }\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n","import { type PathArray } from \"../types\";\nimport { error } from \"./error\";\nimport { isPathArray } from \"./isPathArray\";\n\n/**\n * Determines if an SVG path contains multiple subpaths.\n * Accepts path string or PathArray.\n * @param path - 'M10,10 L20,20 Z M30,30 L40,40' → true\n * @returns boolean\n */\nexport const isMultiPath = <T extends PathArray>(\n path: string | T,\n): boolean => {\n if (typeof path === \"string\") {\n // Count all 'M' and 'm' occurrences\n const matches = path.match(/[Mm]/g);\n return matches ? matches.length > 1 : false;\n }\n\n // istanbul ignore else\n if (isPathArray(path)) {\n let moveCount = 0;\n for (const segment of path) {\n if (segment[0].toUpperCase() === \"M\") {\n moveCount++;\n if (moveCount > 1) return true;\n }\n }\n return false;\n }\n\n throw new TypeError(error + \": expected string or PathArray\");\n};\n","import { isNormalizedArray } from \"./isNormalizedArray\";\nimport { PathArray, PolylineArray } from \"../types\";\n/**\n * Checks if a path is a polyline (only M, L, H, V commands).\n * @param pathArray PathArray (pre-normalize if needed)\n * @returns boolean\n */\nexport function isPolylineArray(path: PathArray): path is PolylineArray {\n return isNormalizedArray(path) && path.every(([pc]) => \"MLVH\".includes(pc));\n}\n","import { PathArray } from \"../types\";\n\n/**\n * Check if a PathArray is closed, which means its last segment is a Z.\n * @param path\n * @returns true if the path is closed\n */\nexport const isClosedPath = <T extends PathArray>(path: T) => {\n return path[path.length - 1][0].toUpperCase() === \"Z\";\n};\n","import { defaultOptions } from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport { roundTo } from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nexport const shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n","import type { PathCommand, PathSegment } from \"../types\";\nimport { roundTo } from \"../math/roundTo\";\n\n/**\n * Rounds the numeric values of a path segment to the specified precision.\n *\n * @param segment - The path segment to round\n * @param roundOption - Number of decimal places\n * @returns The rounded segment\n */\nexport const roundSegment = <T extends PathSegment>(\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n","import type {\n AbsoluteSegment,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\nimport { pathToAbsolute } from \"../convert/pathToAbsolute\";\nimport { shortenSegment } from \"./shortenSegment\";\nimport { paramsParser } from \"../parser/paramsParser\";\nimport { iterate } from \"./iterate\";\nimport { normalizeSegment } from \"./normalizeSegment\";\nimport { relativizeSegment } from \"./relativizeSegment\";\nimport { roundSegment } from \"./roundSegment\";\n\n/**\n * Optimizes a PathArray:\n * * converts segments to shorthand if possible\n * * selects shortest representation from absolute and relative forms\n *\n * @param pathInput - A path string or PathArray\n * @param roundOption - Number of decimal places for rounding\n * @returns The optimized PathArray\n *\n * @example\n * ```ts\n * optimizePath('M10 10L10 10L90 90', 2)\n * // => [['M', 10, 10], ['l', 0, 0], ['l', 80, 80]]\n * ```\n */\nexport const optimizePath = <T extends PathArray>(\n pathInput: T,\n roundOption?: number,\n): PathArray => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result: PathSegment = seg;\n pathCommand = seg[0];\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n","import type {\n // ASegment,\n CSegment,\n // HSegment,\n // MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n // VSegment,\n} from \"../types\";\nimport { pathToAbsolute } from \"../convert/pathToAbsolute\";\nimport { normalizePath } from \"./normalizePath\";\nimport { iterate } from \"./iterate\";\n\n/**\n * Reverses all segments of a PathArray and returns a new PathArray\n * with absolute values.\n *\n * @param pathInput - The source PathArray\n * @returns The reversed PathArray\n *\n * @example\n * ```ts\n * reversePath([['M', 0, 0], ['L', 100, 0], ['L', 100, 100], ['L', 0, 100], ['Z']])\n * // => [['M', 0, 100], ['L', 0, 0], ['L', 100, 0], ['L', 100, 100], ['Z']]\n * ```\n */\nexport const reversePath = <T extends PathArray>(pathInput: T) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const pathCommand = segment[0];\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = isClosed ? [\"Z\"] : [pathCommand, x, y];\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ];\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y];\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ];\n }\n break;\n case \"S\":\n if (\n prevCommand &&\n \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y];\n }\n break;\n case \"T\":\n if (\n prevCommand &&\n \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y];\n break;\n case \"H\":\n result = [pathCommand, x];\n break;\n case \"V\":\n result = [pathCommand, y];\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as typeof segment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as T;\n};\n","// import paramsParser from \"../parser/paramsParser\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n VSegment,\n} from \"../types\";\nimport { iterate } from \"./iterate\";\n\n/**\n * Split a path string or PathArray into an array of sub-paths.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput - The source path string or PathArray\n * @returns An array of sub-path PathArrays\n *\n * @example\n * ```ts\n * splitPath('M0 0L100 0ZM200 0L300 0Z')\n * // => [\n * // [['M', 0, 0], ['L', 100, 0], ['Z']],\n * // [['M', 200, 0], ['L', 300, 0], ['Z']]\n * // ]\n * ```\n */\nexport const splitPath = <T extends PathArray>(pathInput: T | string): T[] => {\n const composite: T[] = [];\n const parsedPath = parsePathString(pathInput);\n let path = [] as unknown as T;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n\n iterate(parsedPath, (seg, _, prevX, prevY) => {\n const cmd = seg[0];\n const absCommand = cmd.toUpperCase() as AbsoluteCommand;\n const isRelative = cmd === cmd.toLowerCase();\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n\n [x, y] = values as PointTuple;\n x += isRelative ? prevX : 0;\n y += isRelative ? prevY : 0;\n mx = x;\n my = y;\n path = [\n (isRelative ? [absCommand, mx, my] : seg) as MSegment,\n ] as unknown as T;\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? prevX : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? prevY : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? prevX : 0;\n y += isRelative ? prevY : 0;\n }\n path.push(seg);\n }\n\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `<path>` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nexport const getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @returns the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nexport const projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\n","import { getSVGMatrix } from \"./getSVGMatrix\";\nimport { projection2d } from \"./projection2d\";\nimport { defaultOptions } from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport { iterate } from \"./iterate\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { absolutizeSegment } from \"./absolutizeSegment\";\nimport { arcToCubic } from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a PathArray.\n *\n * Since SVGElement doesn't support 3D transformation, this function\n * creates a 2D projection of the path element.\n *\n * @param pathInput - The PathArray or path string to transform\n * @param transform - The transform functions object (translate, rotate, skew, scale, origin)\n * @returns The transformed PathArray\n *\n * @example\n * ```ts\n * transformPath('M0 0L100 0L100 100L0 100Z', { translate: [10, 20], scale: 2 })\n * // => [['M', 10, 20], ['L', 210, 20], ['L', 210, 220], ['L', 10, 220], ['Z']]\n * ```\n */\nexport const transformPath = <T extends PathArray>(\n pathInput: T | string,\n transform?: Partial<TransformObject>,\n): T | AbsoluteArray => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as T;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as T;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n let [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment = (\n isLongArc ? result.slice(0, 7) : result.slice(0)\n ) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(\n matrixInstance,\n [(result as LSegment)[1], (result as LSegment)[2]],\n origin,\n );\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n }) as AbsoluteArray;\n};\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nexport const reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n","import type { PathArray } from \"../types\";\nimport { defaultOptions } from \"../options/options\";\nimport { iterate } from \"./iterate\";\nimport { roundSegment } from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nexport const roundPath = <T extends PathArray>(\n path: T,\n roundOption?: number | \"off\",\n): T => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as T;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\n","// src/morph/fixPath.ts\nimport type { PathArray } from \"../types\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { normalizePath } from \"../process/normalizePath\";\nimport { isClosedPath } from \"../util/isClosedPath\";\n\n/**\n * Checks a `PathArray` for an unnecessary `Z` segment\n * and returns a new `PathArray` without it.\n * In short, if the segment before `Z` extends to `M`,\n * the `Z` segment must be removed.\n *\n * The `pathInput` must be a single path, without\n * sub-paths. For multi-path `<path>` elements,\n * use `splitPath` first and apply this utility on each\n * sub-path separately.\n *\n * @param pathInput the `pathArray` source\n * @returns void\n */\nexport const fixPath = <T extends PathArray>(pathInput: T | string) => {\n const pathArray = parsePathString(pathInput);\n\n /* istanbul ignore else */\n if (isClosedPath(pathArray)) {\n const normalArray = normalizePath(pathArray);\n const length = pathArray.length;\n const segBeforeZ = length - 2;\n const [mx, my] = normalArray[0].slice(1);\n const [x, y] = normalArray[segBeforeZ].slice(-2);\n\n if (mx === x && my === y) {\n pathArray.splice(length - 1, 1);\n }\n }\n};\n","// src/morph/splitCubicSegment.ts\n\nimport { midPoint } from \"../math/midPoint\";\nimport { CubicCoordinates } from \"../types\";\n\n/**\n * Split a cubic Bézier into two cubics at parameter t [0–1].\n *\n * @param x1 - Start point X\n * @param y1 - Start point Y\n * @param x2 - First control point X\n * @param y2 - First control point Y\n * @param x3 - Second control point X\n * @param y3 - Second control point Y\n * @param x4 - End point X\n * @param y4 - End point Y\n * @param t - Parameter in range [0, 1] at which to split\n * @returns Array of two cubic segments, each as [x1,y1, x2,y2, x3,y3, x4,y4]\n */\nexport function splitCubicSegment(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n x4: number,\n y4: number,\n t: number,\n): [CubicCoordinates, CubicCoordinates] {\n const [px01, py01] = midPoint([x1, y1], [x2, y2], t);\n const [px12, py12] = midPoint([x2, y2], [x3, y3], t);\n const [px23, py23] = midPoint([x3, y3], [x4, y4], t);\n\n const [cx0, cy0] = midPoint([px01, py01], [px12, py12], t);\n const [cx1, cy1] = midPoint([px12, py12], [px23, py23], t);\n\n const [px, py] = midPoint([cx0, cy0], [cx1, cy1], t);\n\n return [\n [x1, y1, px01, py01, cx0, cy0, px, py], // first segment\n [px, py, cx1, cy1, px23, py23, x4, y4], // second segment\n ];\n}\n","// src/convert/pathToPolyline.ts\nimport type {\n LSegment,\n PointTuple,\n PolygonArray,\n PolylineArray,\n // PathArray,\n} from \"../types\";\nimport { normalizePath } from \"../process/normalizePath\";\nimport { isPolygonArray } from \"../util/isPolygonArray\";\nimport { isPolylineArray } from \"../util/isPolylineArray\";\nimport { isClosedPath } from \"../util/isClosedPath\";\nimport { error } from \"../util/error\";\n\n/**\n * Converts any `PolyLineArray`/`PolygonArray` path (closed or open) to an explicit polyline (M + L*).\n * If the path is closed (has Z), the Z is replaced with an explicit L back to the initial M point.\n * This allows uniform processing without special-casing Z.\n *\n * @param path string or PathArray\n * @returns PolylineArray (M + L*) — never contains Z\n */\nexport const pathToPolyline = <T extends PolygonArray | PolylineArray>(\n path: string | T,\n): PolylineArray => {\n const normal = normalizePath(path);\n if (!isPolygonArray(normal) && !isPolylineArray(normal)) {\n throw TypeError(\n `${error}: pathValue is not a polyline/polygon`,\n );\n }\n\n // If not closed, return as-is (already a polyline)\n if (!isClosedPath(normal)) {\n return normal as PolylineArray;\n }\n\n // Closed → replace Z with explicit L to initial M\n const result: PolylineArray = [normal[0]]; // Keep M\n const [mx, my] = normal[0].slice(1) as PointTuple;\n\n for (let i = 1; i < normal.length; i++) {\n const seg = normal[i];\n if (seg[0].toUpperCase() === \"Z\") {\n result.push([\"L\", mx, my]);\n } else {\n result.push(seg as LSegment);\n }\n }\n\n return result;\n};\n","// src/morph/splitLineToCount.ts\n\n/**\n * Split a line segment into `count` smaller segments of equal length\n * using the same repeated front-cutting strategy as splitCubicToCount.\n *\n * Does NOT mutate input.\n *\n * @param x1 - Start point X\n * @param y1 - Start point Y\n * @param x2 - End point X\n * @param y2 - End point Y\n * @param count - Number of segments to split into\n * @returns Array of `count` line segments, each as [x1, y1, x2, y2]\n */\nexport default function splitLineToCount(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n count: number,\n): Array<[number, number, number, number]> {\n if (count <= 1) return [[x1, y1, x2, y2]];\n\n const result: Array<[number, number, number, number]> = [];\n const dx = x2 - x1;\n const dy = y2 - y1;\n\n let currentX = x1;\n let currentY = y1;\n\n // Loop count times to produce count segments\n // We generate points at 1/count, 2/count, ..., count/count\n let i = 0;\n while (i < count) {\n const t = 1 / (count - i);\n const nextX = x1 + t * dx;\n const nextY = y1 + t * dy;\n\n result.push([currentX, currentY, nextX, nextY]);\n\n currentX = nextX;\n currentY = nextY;\n i++;\n }\n\n return result;\n}\n","// src/morph/getPathSplits.ts\n\nimport type { CSegment, CurveArray, PointTuple, PolylineArray } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getTotalLength } from \"../util/getTotalLength\";\nimport { isPolylineArray } from \"../util/isPolylineArray\";\nimport { error } from \"../util/error\";\nimport { iterate } from \"../process/iterate\";\n\n/**\n * Determine the right amount of splits for each segment in a given PathArray\n * and for a target total amount of sub-segments.\n * For a triangle path \"M0,0 L600,300 L0,600 Z\" we have 3 equal lines,\n * we can easily do 4 splits per line and go to town, however, most triangles\n * are not even so we need to take side lengths into account.\n * @param path The target PathArray\n * @param target The total amount of sub-segments\n * @returns an array of numbers reprezenting the sub-segment count for each segment\n */\nexport function getPathSplits<T extends PolylineArray | CurveArray>(\n path: T,\n target: number,\n): number[] {\n if (target <= 1) throw new TypeError(`${error}: target must be >= 2`);\n\n const totalLength = getTotalLength(path);\n if (totalLength === 0) return Array(path.length).fill(1);\n\n const idealSegLen = totalLength / target; // minus M segment\n const isPoly = isPolylineArray(path);\n\n const splits: number[] = [1]; // M gets 0 splits\n const lengths: number[] = [0]; // M has 0 length\n\n // First pass: measure each segment length\n iterate(path, (seg, i, prevX, prevY) => {\n if (i > 0) {\n const [endX, endY] = seg.slice(-2) as PointTuple;\n const segLen = isPoly\n ? getLineLength(prevX, prevY, endX, endY)\n : getCubicLength(\n prevX,\n prevY,\n seg[1],\n seg[2],\n (seg as CSegment)[3],\n (seg as CSegment)[4],\n (seg as CSegment)[5],\n (seg as CSegment)[6],\n );\n lengths.push(segLen);\n splits.push(1); // placeholder\n }\n });\n\n // Second pass: distribute splits proportionally\n let totalAllocated = 1; // 1 stands for first M segment\n\n for (let i = 1; i < lengths.length; i++) {\n const segLen = lengths[i];\n const desired = segLen > idealSegLen ? Math.round(segLen / idealSegLen) : 1;\n\n splits[i] = desired;\n totalAllocated += desired;\n }\n\n // Third pass: adjust to hit exact target\n let diff = target - totalAllocated;\n\n if (diff !== 0) {\n const candidates: PointTuple[] = [];\n for (let i = 1; i < lengths.length; i++) {\n // istanbul ignore else\n if (lengths[i] > 0) {\n candidates.push([i, lengths[i]]);\n }\n }\n\n const cLen = candidates.length;\n\n // istanbul ignore else - impossible to test that edge case\n if (diff < 0) {\n // sort ascending\n candidates.sort((a, b) => a[1] - b[1]);\n for (let i = 0; i < cLen; i++) {\n const idx = candidates[i][0];\n if (splits[idx] > 1 && candidates[i][1] > 0) {\n splits[idx]--;\n diff++;\n }\n if (diff === 0) break;\n else if (i === cLen - 1) i = 0;\n }\n } else if (diff > 0) {\n // sort descending\n candidates.sort((a, b) => b[1] - a[1]);\n for (let i = 0; i < cLen; i++) {\n const idx = candidates[i][0];\n if (candidates[i][1] > 0) {\n splits[idx]++;\n diff--;\n }\n if (diff === 0) break;\n else if (i === cLen - 1) i = 0;\n }\n }\n }\n return splits;\n}\n","// src/morph/splitLinePathToCount.ts\n\nimport type { PointTuple, PolylineArray } from \"../types\";\nimport splitLineToCount from \"./splitLineToCount\";\nimport { getPathSplits } from \"./getPathSplits\";\nimport { error } from \"../util/error\";\n\n/**\n * Splits a PolylineArray so that it has exactly `target` line segments.\n *\n * @param path - The polyline array to split\n * @param target - The desired number of line segments\n * @returns The modified polyline array with the target segment count\n */\nexport function splitLinePathToCount<T extends PolylineArray>(\n path: T,\n target: number,\n): T {\n if (path.length < 2 || target <= 1) return path;\n\n const splits = getPathSplits(path, target);\n let totalAdded = 0;\n\n const newPath = [path[0]] as unknown as T;\n const pathLen = path.length;\n let currentX = path[0][1];\n let currentY = path[0][2];\n\n // Build path using splits\n for (let i = 1; i < pathLen; i++) {\n const seg = path[i];\n const [endX, endY] = seg.slice(1) as PointTuple;\n\n const count = splits[i];\n\n // istanbul ignore else\n if (count >= 1) {\n const subLines = splitLineToCount(currentX, currentY, endX, endY, count);\n\n for (const sub of subLines) {\n newPath.push([\"L\", sub[2], sub[3]]);\n totalAdded++;\n }\n }\n\n currentX = endX;\n currentY = endY;\n }\n\n // Final safety: if somehow still wrong, log it\n // istanbul ignore if - this might possibly be impossible to test\n if (newPath.length !== target) {\n console.warn(\n `${error}: requested ${target} segments, got ${newPath.length}. Adjusted on last segment.`,\n );\n }\n\n return newPath;\n}\n","// src/morph/splitCubicToCount.ts\n\nimport { CubicCoordinates } from \"../types\";\nimport { splitCubicSegment } from \"./splitCubicSegment\";\n\n/**\n * Split a cubic Bézier into `count` segments of roughly equal parameter length.\n * Does NOT mutate input parameters.\n *\n * @param x1 - Start point X\n * @param y1 - Start point Y\n * @param x2 - First control point X\n * @param y2 - First control point Y\n * @param x3 - Second control point X\n * @param y3 - Second control point Y\n * @param x4 - End point X\n * @param y4 - End point Y\n * @param count - Number of segments to split into\n * @returns Array of `count` cubic segments, each as [x1,y1,x2,y2,x3,y3,x4,y4]\n */\nexport function splitCubicToCount(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n x4: number,\n y4: number,\n count: number,\n): Array<CubicCoordinates> {\n if (count <= 1) return [[x1, y1, x2, y2, x3, y3, x4, y4]];\n\n const result: Array<CubicCoordinates> = [];\n\n // Work on local copies to avoid mutating inputs\n let cx1 = x1;\n let cy1 = y1;\n let cx2 = x2;\n let cy2 = y2;\n let cx3 = x3;\n let cy3 = y3;\n let cx4 = x4;\n let cy4 = y4;\n\n let i = 0;\n while (i < count) {\n const t = 1 / (count - i);\n const [first, second] = splitCubicSegment(\n cx1,\n cy1,\n cx2,\n cy2,\n cx3,\n cy3,\n cx4,\n cy4,\n t,\n );\n\n result.push(first);\n\n // Update working curve to the remaining (second) part\n [cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4] = second;\n i++;\n }\n\n return result;\n}\n","// src/morph/splitCubicPathToCount.ts\nimport type { CSegment, CurveArray, PointTuple } from \"../types\";\nimport { splitCubicToCount } from \"./splitCubicToCount.ts\";\nimport { getPathSplits } from \"./getPathSplits.ts\";\nimport { error } from \"../util/error.ts\";\n\n/**\n * Splits a CurveArray so that it has exactly `target` cubic segments.\n *\n * @param path - The curve array to split\n * @param target - The desired number of cubic segments\n * @returns The modified curve array with the target segment count\n */\nexport function splitCurvePathToCount<T extends CurveArray>(\n path: T,\n target: number,\n): T {\n // istanbul ignore else\n if (path.length < 2 || target <= 1) return path;\n\n const splits = getPathSplits(path, target);\n let totalAdded = 0;\n\n const newPath = [path[0]] as unknown as T; // keep M\n const pathLen = path.length;\n let currentX = path[0][1];\n let currentY = path[0][2];\n\n for (let i = 1; i < pathLen; i++) {\n const seg = path[i] as CSegment /*| ZSegment*/;\n const [endX, endY] = seg.slice(-2) as PointTuple;\n\n const count = splits[i];\n\n // istanbul ignore else\n if (count >= 1) {\n const subs = splitCubicToCount(\n currentX,\n currentY,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n count,\n );\n\n for (const sub of subs) {\n newPath.push([\"C\", sub[2], sub[3], sub[4], sub[5], sub[6], sub[7]]);\n totalAdded++;\n }\n }\n currentX = endX;\n currentY = endY;\n }\n\n // Final safety: if somehow still wrong, log it\n // istanbul ignore if\n if (newPath.length !== target) {\n console.warn(\n `${error}: requested ${target} segments, got ${newPath.length}.`,\n );\n }\n\n return newPath;\n}\n","// src/morph/getRotatedPath.ts\n\nimport {\n CSegment,\n // CurveArray,\n LSegment,\n MorphPathArray,\n MSegment,\n PointTuple,\n // PolylineArray,\n ZSegment,\n} from \"../types.ts\";\nimport { error } from \"../util/error.ts\";\n\n/**\n * Returns all possible rotations of a path (line or curve) by shifting the start point.\n * Each rotation is a new PathArray starting at a different original segment.\n *\n * @param path PathArray (M + L/C + optional Z) — must be single subpath, normalized\n * @returns PathArray[] — array of all possible rotations\n */\nexport function getRotations<T extends MorphPathArray>(a: T) {\n const pathLen = a.length;\n const pointCount = pathLen - 1;\n let path: T;\n const result = [] as T[];\n\n for (let idx = 0; idx < pathLen; idx++) {\n path = [] as unknown as T;\n for (let i = 0; i < pathLen; i++) {\n let oldSegIdx = idx + i;\n let seg: LSegment | CSegment | MSegment | ZSegment;\n\n if (i === 0 || (a[oldSegIdx] && a[oldSegIdx][0] === \"M\")) {\n seg = a[oldSegIdx];\n path.push([\"M\", ...seg.slice(-2)] as MSegment);\n continue;\n }\n if (oldSegIdx >= pathLen) {\n oldSegIdx -= pointCount;\n }\n path.push(a[oldSegIdx] as never);\n }\n result.push(path);\n }\n return result;\n}\n\n/**\n * Finds the best rotation of pathA to match pathB by minimizing sum of squared distances\n * between corresponding endpoints.\n *\n * Works with both polygon (L) and curve (C) arrays.\n *\n * @param pathA PathArray to rotate (will be modified in rotation options)\n * @param pathB PathArray reference (fixed)\n * @returns PathArray — best rotation of pathA\n */\nexport function getRotatedPath<T extends MorphPathArray>(\n pathA: T,\n pathB: T,\n computedRotations?: T[],\n): T {\n const rotations = computedRotations || getRotations(pathA);\n const segCountA = pathA.length;\n const segCountB = pathB.length;\n\n if (segCountA !== segCountB) {\n throw new TypeError(\n error +\n \": paths must have the same number of segments after equalization\",\n );\n }\n\n let bestIndex = 0;\n let minDistanceSq = Infinity;\n\n for (let ri = 0; ri < rotations.length; ri++) {\n const rotation = rotations[ri];\n const rLen = rotation.length;\n let sumDistSq = 0;\n\n // Compare endpoints of each segment (skip M, use end coords of L/C)\n for (let i = 0; i < rLen; i++) {\n const segA = rotation[i];\n const segB = pathB[i];\n\n const endA = segA.slice(-2) as PointTuple;\n const endB = segB.slice(-2) as PointTuple;\n\n const dx = endA[0] - endB[0];\n const dy = endA[1] - endB[1];\n sumDistSq += dx * dx + dy * dy;\n }\n\n if (sumDistSq < minDistanceSq) {\n minDistanceSq = sumDistSq;\n bestIndex = ri;\n }\n }\n\n return rotations[bestIndex];\n}\n","// src/morph/equalizeSegments.ts\nimport type {\n CurveArray,\n EqualizationOptions,\n MorphPathArray,\n PathArray,\n PolylineArray,\n} from \"../types\";\nimport { pathToCurve } from \"../convert/pathToCurve\";\nimport { pathToPolyline } from \"./pathToPolyline\";\nimport { reversePath } from \"../process/reversePath\";\nimport { normalizePath } from \"../process/normalizePath\";\nimport { splitLinePathToCount } from \"./splitLinePathToCount\";\nimport { splitCurvePathToCount } from \"./splitCurvePathToCount\";\nimport { samplePolygon } from \"./samplePolygon\";\nimport { polygonArea } from \"../math/polygonTools\";\nimport { getRotatedPath } from \"./getRotatedPath\";\nimport { fixPath } from \"./fixPath\";\nimport { isPolygonArray } from \"../util/isPolygonArray\";\nimport { isPolylineArray } from \"../util/isPolylineArray\";\nimport { getTotalLength } from \"../util/getTotalLength\";\nimport { roundPath } from \"../process/roundPath\";\n\nconst equalizeSegmentsDefaults: EqualizationOptions = {\n mode: \"auto\", // \"line\" | \"curve\" | \"auto\"\n sampleSize: 10, // for line option\n roundValues: 4, // 4 decimals\n reverse: true,\n close: false,\n target: undefined,\n};\n\n/**\n * Equalizes two paths for morphing (single subpath only).\n *\n * @see https://minus-ze.ro/posts/morphing-arbitrary-paths-in-svg/\n * @param path1 - First path string or PathArray\n * @param path2 - Second path string or PathArray\n * @param initialCfg - Equalization options\n * @returns Tuple of two equalized MorphPathArrays\n *\n * @example\n * ```ts\n * const [eq1, eq2] = equalizeSegments('M0 0L100 0L50 100Z', 'M0 0L100 0L100 100L0 100Z')\n * // eq1.length === eq2.length\n * ```\n */\nexport const equalizeSegments = (\n path1: PathArray | string,\n path2: PathArray | string,\n initialCfg: EqualizationOptions = {},\n): [MorphPathArray, MorphPathArray] => {\n const { close, mode, reverse, roundValues, target: initialTarget } = Object\n .assign(equalizeSegmentsDefaults, initialCfg);\n let p1 = normalizePath(path1) as MorphPathArray;\n let p2 = normalizePath(path2) as MorphPathArray;\n\n // fix paths\n fixPath(p1);\n fixPath(p2);\n\n let bothPoly = (isPolygonArray(p1) || isPolylineArray(p1)) &&\n (isPolygonArray(p2) || isPolylineArray(p2));\n\n if (bothPoly && mode === \"auto\") {\n p1 = pathToPolyline(p1 as PolylineArray);\n p2 = pathToPolyline(p2 as PolylineArray);\n } else {\n bothPoly = false;\n p1 = pathToCurve(p1);\n p2 = pathToCurve(p2);\n }\n\n // Sample and check draw direction\n const area1 = polygonArea(samplePolygon(p1));\n const area2 = polygonArea(samplePolygon(p2));\n\n if (reverse !== false && (Math.sign(area1) !== Math.sign(area2))) {\n p2 = reversePath(p2);\n }\n\n // Get segment counts\n const segCount1 = p1.length;\n const segCount2 = p2.length;\n const minTarget = Math.max(segCount1, segCount2);\n let target = minTarget;\n\n if (typeof initialTarget !== \"number\") {\n const len1 = getTotalLength(p1);\n const len2 = getTotalLength(p2);\n const avgLen = (len1 + len2) / 2;\n const maxSegCount = Math.max(segCount1, segCount2);\n const avgSegLen = avgLen / maxSegCount;\n const idealSegCount = Math.max(\n minTarget,\n Math.round(avgLen / Math.max(avgSegLen, 1)),\n );\n target = Math.min(idealSegCount, Math.max(segCount1, segCount2) * 3);\n } else {\n if (initialTarget >= minTarget) target = initialTarget;\n else {\n console.warn(\n 'equalizeSegments \"target\" option: ' + initialTarget +\n \", expected >= \" + minTarget,\n );\n }\n }\n\n let equalP1: MorphPathArray = p1;\n let equalP2: MorphPathArray = p2;\n\n if (bothPoly) {\n equalP1 = splitLinePathToCount(\n p1 as PolylineArray,\n target,\n ) as MorphPathArray;\n equalP2 = splitLinePathToCount(\n p2 as PolylineArray,\n target,\n ) as MorphPathArray;\n } else {\n equalP1 = splitCurvePathToCount(p1 as CurveArray, target) as MorphPathArray;\n equalP2 = splitCurvePathToCount(p2 as CurveArray, target) as MorphPathArray;\n }\n\n // Point alignment\n equalP2 = getRotatedPath(equalP2, equalP1);\n\n if (typeof roundValues === \"number\" && roundValues !== 4) {\n equalP1 = roundPath(equalP1, roundValues);\n equalP2 = roundPath(equalP2, roundValues);\n }\n\n if (close) {\n equalP1.push([\"Z\"] as never);\n equalP2.push([\"Z\"] as never);\n }\n\n return [equalP1, equalP2];\n};\n","import type {\n BBoxMaxima,\n CubicCoordinates,\n IntersectionOptions,\n IntersectionPoint,\n PathArray,\n PointAtLength,\n PointTuple,\n} from \"../types.ts\";\nimport { pathToCurve } from \"../convert/pathToCurve.ts\";\nimport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n} from \"../math/cubicTools.ts\";\nimport { distanceEpsilon } from \"../util.ts\";\nimport { roundTo } from \"../math/roundTo.ts\";\n\nconst intersect = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n x4: number,\n y4: number,\n) => {\n if (\n Math.max(x1, x2) < Math.min(x3, x4) ||\n Math.min(x1, x2) > Math.max(x3, x4) ||\n Math.max(y1, y2) < Math.min(y3, y4) ||\n Math.min(y1, y2) > Math.max(y3, y4)\n ) {\n return;\n }\n const nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n if (!denominator) {\n return;\n }\n const px = nx / denominator,\n py = ny / denominator,\n px2 = roundTo(px, 2),\n py2 = roundTo(py, 2);\n if (\n px2 < roundTo(Math.min(x1, x2), 2) ||\n px2 > roundTo(Math.max(x1, x2), 2) ||\n px2 < roundTo(Math.min(x3, x4), 2) ||\n px2 > roundTo(Math.max(x3, x4), 2) ||\n py2 < roundTo(Math.min(y1, y2), 2) ||\n py2 > roundTo(Math.max(y1, y2), 2) ||\n py2 < roundTo(Math.min(y3, y4), 2) ||\n py2 > roundTo(Math.max(y3, y4), 2)\n ) {\n return;\n }\n return { x: px, y: py };\n};\n\n/**\n * Checks if a point is inside a bounding box.\n *\n * @param bbox - The bounding box as [minX, minY, maxX, maxY]\n * @param point - The point as [x, y]\n * @returns True if the point is inside or on the edge of the bounding box\n */\nexport const isPointInsideBBox = (\n bbox: BBoxMaxima,\n [x, y]: PointTuple,\n): boolean => {\n const [minX, minY, maxX, maxY] = bbox;\n return x >= minX && x <= maxX && y >= minY && y <= maxY;\n};\n\n/**\n * Checks if two bounding boxes intersect.\n *\n * @param a - First bounding box as [minX, minY, maxX, maxY]\n * @param b - Second bounding box as [minX, minY, maxX, maxY]\n * @returns True if the bounding boxes overlap\n */\nexport const boundingBoxIntersect = (a: BBoxMaxima, b: BBoxMaxima): boolean => {\n const [ax1, ay1, ax2, ay2] = a;\n const [bx1, by1, bx2, by2] = b;\n // return ax1 <= bx2 && ax2 >= bx1 && ay1 <= by2 && ay2 >= by1;\n return (\n isPointInsideBBox(b, [ax1, ay1]) ||\n isPointInsideBBox(b, [ax2, ay1]) ||\n isPointInsideBBox(b, [ax1, ay2]) ||\n isPointInsideBBox(b, [ax2, ay2]) ||\n isPointInsideBBox(a, [bx1, by1]) ||\n isPointInsideBBox(a, [bx2, by1]) ||\n isPointInsideBBox(a, [bx1, by2]) ||\n isPointInsideBBox(a, [bx2, by2]) ||\n // edge overlap without corner inside\n (ax1 < bx2 && ax1 > bx1 || bx1 < ax2 && bx1 > ax1) &&\n (ay1 < by2 && ay1 > by1 || by1 < ay2 && by1 > ay1)\n );\n};\n\nconst interHelper = (\n bez1: CubicCoordinates,\n bez2: CubicCoordinates,\n config?: IntersectionOptions,\n) => {\n const bbox1 = getCubicBBox(...bez1);\n const bbox2 = getCubicBBox(...bez2);\n const { justCount, epsilon } = Object.assign({\n justCount: true,\n epsilon: distanceEpsilon,\n }, config);\n\n if (!boundingBoxIntersect(bbox1, bbox2)) {\n return justCount ? 0 : [] as IntersectionPoint[];\n }\n const l1 = getCubicLength(...bez1),\n l2 = getCubicLength(...bez2),\n n1 = Math.max((l1 / 5) >> 0, 1),\n n2 = Math.max((l2 / 5) >> 0, 1),\n points1: PointAtLength[] = [],\n points2: PointAtLength[] = [],\n xy: Record<string, string> = {};\n // deno-lint-ignore prefer-const\n let res = justCount ? 0 : [] as IntersectionPoint[];\n for (let i = 0; i < n1 + 1; i++) {\n const p = getPointAtCubicLength(...bez1, (i / n1) * l1);\n points1.push({ x: p.x, y: p.y, t: i / n1 });\n }\n for (let i = 0; i < n2 + 1; i++) {\n const p = getPointAtCubicLength(...bez2, (i / n2) * l2);\n points2.push({ x: p.x, y: p.y, t: i / n2 });\n }\n for (let i = 0; i < n1; i++) {\n for (let j = 0; j < n2; j++) {\n const maxLimit = 1 + epsilon,\n di = points1[i],\n di1 = points1[i + 1],\n dj = points2[j],\n dj1 = points2[j + 1],\n ci = Math.abs(di1.x - di.x) < .001 ? \"y\" : \"x\",\n cj = Math.abs(dj1.x - dj.x) < .001 ? \"y\" : \"x\",\n is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\n if (is) {\n if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) {\n continue;\n }\n xy[is.x.toFixed(4)] = is.y.toFixed(4);\n const t1 = di.t +\n Math.abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\n t2 = dj.t +\n Math.abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n\n // istanbul ignore else\n if (t1 >= 0 && t1 <= maxLimit && t2 >= 0 && t2 <= maxLimit) {\n if (justCount) {\n (res as number)++;\n } else {\n (res as IntersectionPoint[]).push({\n x: is.x,\n y: is.y,\n t1: Math.min(t1, 1),\n t2: Math.min(t2, 1),\n });\n }\n }\n }\n }\n }\n return res;\n};\n\n/**\n * Finds intersection points between two paths.\n *\n * @param pathInput1 - First path string or PathArray\n * @param pathInput2 - Second path string or PathArray\n * @param justCount - If true, returns the count of intersections; if false, returns the intersection points\n * @returns The number of intersections (when justCount is true) or an array of IntersectionPoint objects\n *\n * @example\n * ```ts\n * pathsIntersection('M0 50C0 0,100 0,100 50', 'M50 0C100 0,100 100,50 100', true)\n * // => 1\n * pathsIntersection('M0 50C0 0,100 0,100 50', 'M50 0C100 0,100 100,50 100', false)\n * // => [{ x: 50, y: 25, t1: 0.5, t2: 0.5 }]\n * ```\n */\nexport const pathsIntersection = <T extends string | PathArray>(\n pathInput1: T,\n pathInput2: T,\n justCount = /* istanbul ignore next */ true,\n) => {\n const path1 = pathToCurve(pathInput1);\n const path2 = pathToCurve(pathInput2);\n let x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n x1m = 0,\n y1m = 0,\n x2m = 0,\n y2m = 0,\n bez1: CubicCoordinates = [x1, y1, x1, y1, x1m, y1m, x1m, y1m],\n bez2: CubicCoordinates = [x2, y2, x2, y2, x2m, y2m, x2m, y2m],\n countResult = 0;\n const pointsResult: IntersectionPoint[] = [];\n const pathLen1 = path1.length;\n const pathLen2 = path2.length;\n\n for (let i = 0; i < pathLen1; i++) {\n const seg1 = path1[i];\n if (seg1[0] == \"M\") {\n x1 = seg1[1];\n y1 = seg1[2];\n x1m = x1;\n y1m = y1;\n } else {\n /* istanbul ignore else */\n if (seg1[0] == \"C\") {\n bez1 = [x1, y1, seg1[1], seg1[2], seg1[3], seg1[4], seg1[5], seg1[6]];\n x1 = bez1[6];\n y1 = bez1[7];\n } else {\n bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n x1 = x1m;\n y1 = y1m;\n }\n for (let j = 0; j < pathLen2; j++) {\n const seg2 = path2[j];\n // istanbul ignore else\n if (seg2[0] == \"M\") {\n x2 = seg2[1];\n y2 = seg2[2];\n x2m = x2;\n y2m = y2;\n } else if (seg2[0] == \"C\") {\n bez2 = [\n x2,\n y2,\n seg2[1],\n seg2[2],\n seg2[3],\n seg2[4],\n seg2[5],\n seg2[6],\n ];\n x2 = bez2[6];\n y2 = bez2[7];\n // dead code, pathToCurve is almost always made of M/C\n // } else {\n // bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n // x2 = x2m;\n // y2 = y2m;\n }\n const intr = interHelper(bez1, bez2, { justCount });\n if (justCount) {\n // (res as number) += intr;\n countResult += intr as number;\n } else {\n // Include additional segment properties, maybe not\n // const kk = (intr as IntersectionPoint[]).length;\n // for (let k = 0; k < kk; k++) {\n // intr[k].segment1 = i;\n // intr[k].segment2 = j;\n // intr[k].bez1 = bez1;\n // intr[k].bez2 = bez2;\n // }\n // (res as IntersectionPoint[]) = (res as IntersectionPoint[]).concat(intr);\n pointsResult.push(...intr as IntersectionPoint[]);\n }\n }\n }\n }\n return justCount ? countResult : pointsResult;\n};\n","import type { NormalArray } from \"../types.ts\";\n\n/**\n * Create a degenerate `PathArray` at a given coordinate\n * to serve as a pair for another `PathArray`.\n * @param param0 An [x, y] tuple for the coordinate\n * @returns A new degenerate `PathArray`\n */\nexport const createPlaceholder = (\n [atx, aty]: [number, number],\n): NormalArray => {\n // Tiny square at point\n const r = 0.001;\n return [\n [\"M\", atx, aty],\n [\"L\", atx + r, aty],\n [\"L\", atx + r, aty + r],\n [\"L\", atx, aty + r],\n [\"L\", atx, aty],\n [\"Z\"],\n ];\n};\n","import type { NormalArray, PathFeature, PointTuple } from \"../types.ts\";\nimport {\n boundingBoxIntersect,\n isPointInsideBBox,\n} from \"../util/pathIntersection\";\nimport { createPlaceholder } from \"./createPlaceholder\";\n\ninterface CandidateScore {\n index: number;\n hasOverlap: boolean;\n boxIntersect: boolean;\n sizeDifference: number;\n centeredDistance: number;\n}\n\nfunction getBestMatch(\n target: PathFeature,\n candidates: PathFeature[],\n): PathFeature | null {\n const targetBBox = target.bbox;\n\n // Single pass: collect metrics for every candidate\n const potentialCandidates: CandidateScore[] = [];\n\n for (let i = 0; i < candidates.length; i++) {\n const { bbox, size } = candidates[i];\n\n const dx = targetBBox.cx - bbox.cx;\n const dy = targetBBox.cy - bbox.cy;\n const centeredDistance = Math.sqrt(dx * dx + dy * dy);\n\n const sizeDifference = Math.abs(target.size - size) /\n Math.max(target.size, size, 1e-6);\n\n const hasOverlap = isPointInsideBBox(\n [targetBBox.x, targetBBox.y, targetBBox.x2, targetBBox.y2],\n [bbox.cx, bbox.cy],\n ) || isPointInsideBBox(\n [bbox.x, bbox.y, bbox.x2, bbox.y2],\n [targetBBox.cx, targetBBox.cy],\n );\n\n const boxIntersect = boundingBoxIntersect(\n [targetBBox.x, targetBBox.y, targetBBox.x2, targetBBox.y2],\n [bbox.x, bbox.y, bbox.x2, bbox.y2],\n );\n\n potentialCandidates.push({\n index: i,\n hasOverlap,\n boxIntersect,\n sizeDifference,\n centeredDistance,\n });\n }\n\n // Filter phase: strict overlap — pick smallest distance\n const overlaping = potentialCandidates.filter((c) =>\n c.hasOverlap && c.boxIntersect\n );\n if (overlaping.length > 0) {\n let best = overlaping[0];\n for (let i = 1; i < overlaping.length; i++) {\n if (overlaping[i].centeredDistance < best.centeredDistance) {\n best = overlaping[i];\n }\n }\n return candidates.splice(best.index, 1)[0];\n }\n\n return null;\n}\n\n/**\n * Matches paths from two sets by proximity and size similarity.\n * Unmatched paths receive placeholder paths at their centroid.\n *\n * @param fromPaths - Source path features to match from\n * @param toPaths - Target path features to match to\n * @returns Array of paired NormalArrays [from, to]\n */\nexport function matchPaths(\n fromPaths: PathFeature[],\n toPaths: PathFeature[],\n): [NormalArray, NormalArray][] {\n const pairs: [NormalArray, NormalArray][] = [];\n\n fromPaths.sort((a, b) => b.size - a.size);\n toPaths.sort((a, b) => b.size - a.size);\n\n while (fromPaths.length > 0) {\n const from = fromPaths.shift()!;\n const bestTo = getBestMatch(from, toPaths);\n\n if (bestTo) {\n pairs.push([from.path, bestTo.path]);\n } else {\n const fromCentroid: PointTuple = [from.bbox.cx, from.bbox.cy];\n pairs.push([from.path, createPlaceholder(fromCentroid)]);\n }\n }\n\n while (toPaths.length > 0) {\n const to = toPaths.shift()!;\n const toCentroid: PointTuple = [to.bbox.cx, to.bbox.cy];\n pairs.push([createPlaceholder(toCentroid), to.path]);\n }\n\n return pairs;\n}\n","import type { NormalArray, PathFeature } from \"../types.ts\";\nimport { getPathBBox } from \"../util/getPathBBox.ts\";\nimport { polygonArea } from \"../math/polygonTools.ts\";\nimport { samplePolygon } from \"./samplePolygon.ts\";\nimport { isPolygonArray } from \"../util/isPolygonArray.ts\";\nimport { isPolylineArray } from \"../util/isPolylineArray.ts\";\n\n/**\n * Classifies paths into outer (containing) and inner (hole) paths.\n *\n * @param paths - Array of normalized path arrays to classify\n * @returns Object with `outers` (containing shapes) and `inners` (holes)\n */\nexport const classifyPaths = (\n paths: NormalArray[],\n): {\n outers: PathFeature[];\n inners: PathFeature[];\n} => {\n const outers: PathFeature[] = [];\n const inners: PathFeature[] = [];\n\n for (const path of paths) {\n const signedArea = polygonArea(samplePolygon(path));\n const bbox = getPathBBox(path);\n const feature: PathFeature = {\n isPoly: isPolygonArray(path) || isPolylineArray(path),\n size: bbox.width * bbox.height,\n path,\n signedArea,\n area: Math.abs(signedArea),\n bbox,\n };\n\n if (signedArea > 0) {\n outers.push(feature);\n } else {\n inners.push(feature);\n }\n }\n\n return { outers, inners };\n};\n","import type {\n MorphPathArray,\n PathArray,\n PathsEqualizationOptions,\n} from \"../types.ts\";\nimport { isMultiPath } from \"../util/isMultiPath\";\nimport { splitPath } from \"../process/splitPath\";\nimport { equalizeSegments } from \"./equalizeSegments\";\nimport { matchPaths } from \"./matchPaths\";\nimport { normalizePath } from \"../process/normalizePath\";\nimport { reversePath } from \"../process/reversePath\";\nimport { polygonArea } from \"../math/polygonTools\";\nimport { samplePolygon } from \"./samplePolygon\";\nimport { classifyPaths } from \"./classifyPaths.ts\";\n\nconst equalizePathsDefaults: PathsEqualizationOptions = {\n mode: \"auto\", // \"line\" | \"curve\" | \"auto\"\n roundValues: 4, // 4 decimals\n close: false,\n sampleSize: 10,\n};\n\n/**\n * Equalizes two paths for morphing (single/multi subpath).\n *\n * @see https://minus-ze.ro/posts/morphing-arbitrary-paths-in-svg/\n * @param pathInput1 - First path string or PathArray\n * @param pathInput2 - Second path string or PathArray\n * @param initialCfg - Configuration options for equalization\n * @returns Tuple of two equalized MorphPathArrays\n *\n * @example\n * ```ts\n * const [eq1, eq2] = equalizePaths('M0 0L100 0L50 100Z', 'M0 0L100 0L100 100L0 100Z')\n * // eq1.length === eq2.length — ready for morphing\n * ```\n */\nexport const equalizePaths = (\n pathInput1: string | PathArray,\n pathInput2: string | PathArray,\n initialCfg = {},\n) => {\n const cfg = Object.assign(equalizePathsDefaults, initialCfg);\n const p1 = normalizePath(pathInput1);\n const p2 = normalizePath(pathInput2);\n\n const multi1 = isMultiPath(p1);\n const multi2 = isMultiPath(p2);\n\n if (!multi1 && !multi2) {\n // Single subpath — use fast path\n return equalizeSegments(p1, p2, cfg);\n }\n\n // Global direction alignment (optional — helps with overall winding)\n const globalArea1 = polygonArea(samplePolygon(p1));\n const globalArea2 = polygonArea(samplePolygon(p2));\n\n let path1 = p1;\n let path2 = p2;\n\n // all paths must be clockwise\n if (Math.sign(globalArea1) < 0) {\n path1 = reversePath(path1);\n }\n if (Math.sign(globalArea2) < 0) {\n path2 = reversePath(path2);\n }\n\n // Multi-subpath: split and match\n const multiPath1 = splitPath(path1);\n const multiPath2 = splitPath(path2);\n\n const { outers: outers1, inners: inners1 } = classifyPaths(multiPath1);\n const { outers: outers2, inners: inners2 } = classifyPaths(multiPath2);\n\n // Match outers\n const outerPairs = matchPaths(outers1, outers2);\n\n // Match holes (simple: pair by area, ignore nesting for now)\n const innerPairs = matchPaths(inners1, inners2);\n\n // Equalize each pair\n const equalizedPairs: [MorphPathArray, MorphPathArray][] = [];\n\n for (const [from, to] of [...outerPairs, ...innerPairs]) {\n const [eqFrom, eqTo] = equalizeSegments(from, to, {\n ...cfg,\n reverse: false,\n });\n equalizedPairs.push([eqFrom, eqTo]);\n }\n\n // Reassemble into final morphable paths\n const finalFrom = equalizedPairs.map((p) => p[0]).flat() as MorphPathArray;\n const finalTo = equalizedPairs.map((p) => p[1]).flat() as MorphPathArray;\n\n return [finalFrom, finalTo] as [MorphPathArray, MorphPathArray];\n};\n","\"use strict\";\nimport { version } from \"../package.json\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools.ts\";\nimport { bezierTools } from \"./math/bezier.ts\";\nimport { cubicTools } from \"./math/cubicTools.ts\";\nimport { lineTools } from \"./math/lineTools.ts\";\nimport { quadTools } from \"./math/quadTools.ts\";\nimport { polygonTools } from \"./math/polygonTools.ts\";\n\nimport { distanceSquareRoot } from \"./math/distanceSquareRoot.ts\";\nimport { midPoint } from \"./math/midPoint.ts\";\nimport { rotateVector } from \"./math/rotateVector.ts\";\nimport { roundTo } from \"./math/roundTo.ts\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types.ts\";\nimport type {\n Options,\n TransformEntries,\n TransformObject,\n} from \"./interface.ts\";\nimport { defaultOptions } from \"./options/options.ts\";\n\nimport { pathToAbsolute } from \"./convert/pathToAbsolute.ts\";\nimport { pathToRelative } from \"./convert/pathToRelative.ts\";\nimport { pathToCurve } from \"./convert/pathToCurve.ts\";\nimport { pathToString } from \"./convert/pathToString.ts\";\n\nimport { error } from \"./util/error.ts\";\nimport { parsePathString } from \"./parser/parsePathString.ts\";\nimport { finalizeSegment } from \"./parser/finalizeSegment.ts\";\nimport { invalidPathValue } from \"./parser/invalidPathValue.ts\";\nimport { isArcCommand } from \"./parser/isArcCommand.ts\";\nimport { isDigit } from \"./parser/isDigit.ts\";\nimport { isDigitStart } from \"./parser/isDigitStart.ts\";\nimport { isMoveCommand } from \"./parser/isMoveCommand.ts\";\nimport { isPathCommand } from \"./parser/isPathCommand.ts\";\nimport { isSpace } from \"./parser/isSpace.ts\";\nimport { paramsCounts } from \"./parser/paramsCount.ts\";\nimport { paramsParser } from \"./parser/paramsParser.ts\";\nimport { PathParser } from \"./parser/pathParser.ts\";\nimport { scanFlag } from \"./parser/scanFlag.ts\";\nimport { scanParam } from \"./parser/scanParam.ts\";\nimport { scanSegment } from \"./parser/scanSegment.ts\";\nimport { skipSpaces } from \"./parser/skipSpaces.ts\";\nimport { getPathBBox } from \"./util/getPathBBox.ts\";\nimport { getTotalLength } from \"./util/getTotalLength.ts\";\nimport { getClosestPoint } from \"./util/getClosestPoint.ts\";\nimport { getDrawDirection } from \"./util/getDrawDirection.ts\";\nimport { getPathArea } from \"./util/getPathArea.ts\";\nimport { getPointAtLength } from \"./util/getPointAtLength.ts\";\nimport { getPropertiesAtLength } from \"./util/getPropertiesAtLength.ts\";\nimport { getPropertiesAtPoint } from \"./util/getPropertiesAtPoint.ts\";\nimport { getSegmentAtLength } from \"./util/getSegmentAtLength.ts\";\nimport { getSegmentOfPoint } from \"./util/getSegmentOfPoint.ts\";\nimport { isAbsoluteArray } from \"./util/isAbsoluteArray.ts\";\nimport { isPolygonArray } from \"./util/isPolygonArray.ts\";\nimport { isCurveArray } from \"./util/isCurveArray.ts\";\nimport { isNormalizedArray } from \"./util/isNormalizedArray.ts\";\nimport { isPathArray } from \"./util/isPathArray.ts\";\nimport { isPointInStroke } from \"./util/isPointInStroke.ts\";\nimport { isRelativeArray } from \"./util/isRelativeArray.ts\";\nimport { isValidPath } from \"./util/isValidPath.ts\";\nimport { samplePolygon } from \"./morph/samplePolygon.ts\";\nimport { shapeParams } from \"./util/shapeParams.ts\";\nimport { shapeToPath } from \"./util/shapeToPath.ts\";\nimport { shapeToPathArray } from \"./util/shapeToPathArray.ts\";\nimport { isMultiPath } from \"./util/isMultiPath.ts\";\nimport { isPolylineArray } from \"./util/isPolylineArray.ts\";\nimport { isClosedPath } from \"./util/isClosedPath.ts\";\n\nimport { normalizePath } from \"./process/normalizePath.ts\";\nimport { optimizePath } from \"./process/optimizePath.ts\";\nimport { reversePath } from \"./process/reversePath.ts\";\nimport { splitPath } from \"./process/splitPath.ts\";\nimport { transformPath } from \"./process/transformPath.ts\";\nimport { absolutizeSegment } from \"./process/absolutizeSegment.ts\";\nimport { arcToCubic } from \"./process/arcToCubic.ts\";\nimport { getSVGMatrix } from \"./process/getSVGMatrix.ts\";\nimport { iterate } from \"./process/iterate.ts\";\nimport { lineToCubic } from \"./process/lineToCubic.ts\";\nimport { normalizeSegment } from \"./process/normalizeSegment.ts\";\nimport { projection2d } from \"./process/projection2d.ts\";\nimport { quadToCubic } from \"./process/quadToCubic.ts\";\nimport { relativizeSegment } from \"./process/relativizeSegment.ts\";\nimport { reverseCurve } from \"./process/reverseCurve.ts\";\nimport { roundPath } from \"./process/roundPath.ts\";\nimport { roundSegment } from \"./process/roundSegment.ts\";\nimport { segmentToCubic } from \"./process/segmentToCubic.ts\";\nimport { shortenSegment } from \"./process/shortenSegment.ts\";\n\nimport { fixPath } from \"./morph/fixPath.ts\";\nimport { splitCubicSegment } from \"./morph/splitCubicSegment.ts\";\nimport { equalizeSegments } from \"./morph/equalizeSegments.ts\";\nimport { equalizePaths } from \"./morph/equalizePaths.ts\";\nimport {\n boundingBoxIntersect,\n isPointInsideBBox,\n pathsIntersection,\n} from \"./util/pathIntersection.ts\";\nimport distanceEpsilon from \"./util/distanceEpsilon.ts\";\n\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp <https://github.com/thednp/svg-path-commander>\n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial<Options>) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`,\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values.\n *\n * @example\n * ```ts\n * new SVGPathCommander('M10 10l80 80').toAbsolute().toString()\n * // => 'M10 10L90 90'\n * ```\n *\n * @returns this for chaining\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values.\n *\n * @example\n * ```ts\n * new SVGPathCommander('M10 10L90 90').toRelative().toString()\n * // => 'M10 10l80 80'\n * ```\n *\n * @returns this for chaining\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @example\n * ```ts\n * new SVGPathCommander('M10 50q15 -25 30 0').toCurve().toString()\n * // => 'M10 50C25 25 40 50 40 50'\n * ```\n *\n * @returns this for chaining\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @example\n * ```ts\n * new SVGPathCommander('M0 0L100 0L100 100L0 100Z').reverse().toString()\n * // => 'M0 100L0 0L100 0L100 100Z'\n * ```\n *\n * @param onlySubpath - option to reverse all sub-paths except first\n * @returns this for chaining\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @example\n * ```ts\n * new SVGPathCommander('M10 90s20 -80 40 -80s20 80 40 80').normalize().toString()\n * // => 'M10 90C30 90 25 10 50 10C75 10 70 90 90 90'\n * ```\n *\n * @returns this for chaining\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @example\n * ```ts\n * new SVGPathCommander('M10 10L10 10L90 90').optimize().toString()\n * // => 'M10 10l0 0 80 80'\n * ```\n *\n * @returns this for chaining\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick reference\n *\n * @param source a `transformObject` as described above\n * @returns this for chaining\n * @public\n */\n transform(source?: Partial<TransformObject>) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically.\n *\n * @example\n * ```ts\n * const path = new SVGPathCommander('M0 0L100 0L100 100L0 100Z')\n * path.flipX().toString()\n * ```\n *\n * @returns this for chaining\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally.\n *\n * @example\n * ```ts\n * const path = new SVGPathCommander('M0 0L100 0L100 100L0 100Z')\n * path.flipY().toString()\n * ```\n *\n * @returns this for chaining\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @returns the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @returns void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static options = defaultOptions;\n static CSSMatrix = CSSMatrix;\n static arcTools = arcTools;\n static bezierTools = bezierTools;\n static cubicTools = cubicTools;\n static lineTools = lineTools;\n static polygonTools = polygonTools;\n static quadTools = quadTools;\n\n static pathToAbsolute = pathToAbsolute;\n static pathToRelative = pathToRelative;\n static pathToCurve = pathToCurve;\n static pathToString = pathToString;\n\n static distanceSquareRoot = distanceSquareRoot;\n static midPoint = midPoint;\n static rotateVector = rotateVector;\n static roundTo = roundTo;\n\n static parsePathString = parsePathString;\n static finalizeSegment = finalizeSegment;\n static invalidPathValue = invalidPathValue;\n\n static isArcCommand = isArcCommand;\n static isDigit = isDigit;\n static isDigitStart = isDigitStart;\n static isMoveCommand = isMoveCommand;\n static isPathCommand = isPathCommand;\n static isSpace = isSpace;\n\n static paramsCount = paramsCounts;\n static paramsParser = paramsParser;\n static PathParser = PathParser;\n static scanFlag = scanFlag;\n static scanParam = scanParam;\n static scanSegment = scanSegment;\n static skipSpaces = skipSpaces;\n\n static distanceEpsilon = distanceEpsilon;\n\n static fixPath = fixPath;\n static getClosestPoint = getClosestPoint;\n static getDrawDirection = getDrawDirection;\n static getPathArea = getPathArea;\n static getPathBBox = getPathBBox;\n static getPointAtLength = getPointAtLength;\n static getPropertiesAtLength = getPropertiesAtLength;\n static getPropertiesAtPoint = getPropertiesAtPoint;\n static getSegmentAtLength = getSegmentAtLength;\n static getSegmentOfPoint = getSegmentOfPoint;\n static getTotalLength = getTotalLength;\n\n static isAbsoluteArray = isAbsoluteArray;\n static isCurveArray = isCurveArray;\n static isPolygonArray = isPolygonArray;\n static isNormalizedArray = isNormalizedArray;\n static isPathArray = isPathArray;\n static isPointInStroke = isPointInStroke;\n static isRelativeArray = isRelativeArray;\n static isValidPath = isValidPath;\n\n static samplePolygon = samplePolygon;\n static shapeParams = shapeParams;\n static shapeToPath = shapeToPath;\n static shapeToPathArray = shapeToPathArray;\n\n static absolutizeSegment = absolutizeSegment;\n static arcToCubic = arcToCubic;\n static getSVGMatrix = getSVGMatrix;\n static iterate = iterate;\n static lineToCubic = lineToCubic;\n static normalizePath = normalizePath;\n static normalizeSegment = normalizeSegment;\n static optimizePath = optimizePath;\n static projection2d = projection2d;\n static quadToCubic = quadToCubic;\n static relativizeSegment = relativizeSegment;\n static reverseCurve = reverseCurve;\n static reversePath = reversePath;\n static roundPath = roundPath;\n static roundSegment = roundSegment;\n static segmentToCubic = segmentToCubic;\n static shortenSegment = shortenSegment;\n static splitPath = splitPath;\n static equalizePaths = equalizePaths;\n static equalizeSegments = equalizeSegments;\n static splitCubicSegment = splitCubicSegment;\n static transformPath = transformPath;\n static isPointInsideBBox = isPointInsideBBox;\n static pathsIntersection = pathsIntersection;\n static boundingBoxIntersect = boundingBoxIntersect;\n static isMultiPath = isMultiPath;\n static isClosedPath = isClosedPath;\n static isPolylineArray = isPolylineArray;\n static version = version;\n}\n\nexport default SVGPathCommander;\n","\"use strict\";\n\nimport SVGPathCommander from \"./main.ts\";\n\nexport * from \"./types.ts\";\nexport * from \"./interface.ts\";\n\nexport default SVGPathCommander;\nexport {};\n"],"x_google_ignoreList":[1],"mappings":"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E,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM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"}
|
|
1
|
+
{"version":3,"file":"index.min.js","names":[],"sources":["../package.json","../node_modules/.pnpm/@thednp+dommatrix@3.0.4/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/math/midPoint.ts","../src/math/distanceSquareRoot.ts","../src/math/lineTools.ts","../src/math/arcTools.ts","../src/math/bezier.ts","../src/math/cubicTools.ts","../src/math/quadTools.ts","../src/math/polygonTools.ts","../src/math/rotateVector.ts","../src/math/roundTo.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/util/error.ts","../src/parser/scanFlag.ts","../src/parser/isDigit.ts","../src/parser/invalidPathValue.ts","../src/parser/scanParam.ts","../src/parser/isSpace.ts","../src/parser/skipSpaces.ts","../src/parser/isPathCommand.ts","../src/parser/isDigitStart.ts","../src/parser/isArcCommand.ts","../src/parser/isMoveCommand.ts","../src/parser/scanSegment.ts","../src/parser/pathParser.ts","../src/parser/parsePathString.ts","../src/process/absolutizeSegment.ts","../src/process/iterate.ts","../src/convert/pathToAbsolute.ts","../src/process/relativizeSegment.ts","../src/convert/pathToRelative.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/convert/pathToString.ts","../src/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/util/getPropertiesAtLength.ts","../src/util/getPropertiesAtPoint.ts","../src/util/getClosestPoint.ts","../src/util/getPathArea.ts","../src/util/getDrawDirection.ts","../src/util/getSegmentAtLength.ts","../src/util/getSegmentOfPoint.ts","../src/util/isPathArray.ts","../src/util/isAbsoluteArray.ts","../src/util/isNormalizedArray.ts","../src/util/isPolygonArray.ts","../src/util/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/morph/samplePolygon.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/util/isMultiPath.ts","../src/util/isPolylineArray.ts","../src/util/isClosedPath.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/morph/fixPath.ts","../src/morph/splitCubicSegment.ts","../src/morph/pathToPolyline.ts","../src/morph/splitLineToCount.ts","../src/morph/getPathSplits.ts","../src/morph/splitLinePathToCount.ts","../src/morph/splitCubicToCount.ts","../src/morph/splitCurvePathToCount.ts","../src/morph/getRotatedPath.ts","../src/morph/equalizeSegments.ts","../src/intersect/isPointInsideBBox.ts","../src/intersect/boundingBoxIntersect.ts","../src/morph/createPlaceholder.ts","../src/morph/matchPaths.ts","../src/morph/classifyPaths.ts","../src/morph/equalizePaths.ts","../src/intersect/interHelper.ts","../src/intersect/pathIntersection.ts","../src/main.ts","../src/index.ts"],"sourcesContent":["","//#region src/index.ts\nvar e = {\n\ta: 1,\n\tb: 0,\n\tc: 0,\n\td: 1,\n\te: 0,\n\tf: 0,\n\tm11: 1,\n\tm12: 0,\n\tm13: 0,\n\tm14: 0,\n\tm21: 0,\n\tm22: 1,\n\tm23: 0,\n\tm24: 0,\n\tm31: 0,\n\tm32: 0,\n\tm33: 1,\n\tm34: 0,\n\tm41: 0,\n\tm42: 0,\n\tm43: 0,\n\tm44: 1,\n\tis2D: !0,\n\tisIdentity: !0\n}, t = (e) => (e instanceof Float64Array || e instanceof Float32Array || Array.isArray(e) && e.every((e) => typeof e == \"number\")) && [6, 16].some((t) => e.length === t), n = (t) => t instanceof DOMMatrix || t instanceof h || typeof t == \"object\" && Object.keys(e).every((e) => t && e in t), r = (e) => {\n\tlet n = new h(), r = Array.from(e);\n\tif (!t(r)) throw TypeError(`CSSMatrix: \"${r.join(\",\")}\" must be an array with 6/16 numbers.`);\n\t// istanbul ignore else @preserve\n\tif (r.length === 16) {\n\t\tlet [e, t, i, a, o, s, c, l, u, d, f, p, m, h, g, _] = r;\n\t\tn.m11 = e, n.a = e, n.m21 = o, n.c = o, n.m31 = u, n.m41 = m, n.e = m, n.m12 = t, n.b = t, n.m22 = s, n.d = s, n.m32 = d, n.m42 = h, n.f = h, n.m13 = i, n.m23 = c, n.m33 = f, n.m43 = g, n.m14 = a, n.m24 = l, n.m34 = p, n.m44 = _;\n\t} else if (r.length === 6) {\n\t\tlet [e, t, i, a, o, s] = r;\n\t\tn.m11 = e, n.a = e, n.m12 = t, n.b = t, n.m21 = i, n.c = i, n.m22 = a, n.d = a, n.m41 = o, n.e = o, n.m42 = s, n.f = s;\n\t}\n\treturn n;\n}, i = (e) => {\n\tif (n(e)) return r([\n\t\te.m11,\n\t\te.m12,\n\t\te.m13,\n\t\te.m14,\n\t\te.m21,\n\t\te.m22,\n\t\te.m23,\n\t\te.m24,\n\t\te.m31,\n\t\te.m32,\n\t\te.m33,\n\t\te.m34,\n\t\te.m41,\n\t\te.m42,\n\t\te.m43,\n\t\te.m44\n\t]);\n\tthrow TypeError(`CSSMatrix: \"${JSON.stringify(e)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`);\n}, a = (e) => {\n\tif (typeof e != \"string\") throw TypeError(`CSSMatrix: \"${JSON.stringify(e)}\" is not a string.`);\n\tlet t = String(e).replace(/\\s/g, \"\"), n = new h(), i = `CSSMatrix: invalid transform string \"${e}\"`;\n\treturn t.split(\")\").filter((e) => e).forEach((e) => {\n\t\tlet [t, a] = e.split(\"(\");\n\t\tif (!a) throw TypeError(i);\n\t\tlet o = a.split(\",\").map((e) => e.includes(\"rad\") ? 180 / Math.PI * parseFloat(e) : parseFloat(e)), [s, c, l, u] = o, d = [\n\t\t\ts,\n\t\t\tc,\n\t\t\tl\n\t\t], f = [\n\t\t\ts,\n\t\t\tc,\n\t\t\tl,\n\t\t\tu\n\t\t];\n\t\tif (t === \"perspective\" && s && [c, l].every((e) => e === void 0)) n.m34 = -1 / s;\n\t\telse if (t.includes(\"matrix\") && [6, 16].includes(o.length) && o.every((e) => !Number.isNaN(+e))) {\n\t\t\tlet e = o.map((e) => Math.abs(e) < 1e-6 ? 0 : e);\n\t\t\tn.multiplySelf(r(e));\n\t\t} else if (t === \"translate3d\" && d.every((e) => !Number.isNaN(+e))) n.translateSelf(s, c, l);\n\t\telse if (t === \"translate\" && s && l === void 0) n.translateSelf(s, c || 0, 0);\n\t\telse if (t === \"rotate3d\" && f.every((e) => !Number.isNaN(+e)) && u) n.rotateAxisAngleSelf(s, c, l, u);\n\t\telse if (t === \"rotate\" && s && [c, l].every((e) => e === void 0)) n.rotateSelf(0, 0, s);\n\t\telse if (t === \"scale3d\" && d.every((e) => !Number.isNaN(+e)) && d.some((e) => e !== 1)) n.scaleSelf(s, c, l);\n\t\telse if (t === \"scale\" && !Number.isNaN(s) && (s !== 1 || c !== 1) && l === void 0) {\n\t\t\tlet e = Number.isNaN(+c) ? s : c;\n\t\t\tn.scaleSelf(s, e, 1);\n\t\t} else if (t === \"skew\" && (s || !Number.isNaN(s) && c) && l === void 0) n.skewSelf(s, c || 0);\n\t\telse if ([\n\t\t\t\"translate\",\n\t\t\t\"rotate\",\n\t\t\t\"scale\",\n\t\t\t\"skew\"\n\t\t].some((e) => t.includes(e)) && /[XYZ]/.test(t) && s && [c, l].every((e) => e === void 0)) if (t === \"skewX\" || t === \"skewY\") n[t === \"skewX\" ? \"skewXSelf\" : \"skewYSelf\"](s);\n\t\telse {\n\t\t\tlet e = t.replace(/[XYZ]/, \"\"), r = t.replace(e, \"\"), i = [\n\t\t\t\t\"X\",\n\t\t\t\t\"Y\",\n\t\t\t\t\"Z\"\n\t\t\t].indexOf(r), a = e === \"scale\" ? 1 : 0, o = e + \"Self\", c = [\n\t\t\t\ti === 0 ? s : a,\n\t\t\t\ti === 1 ? s : a,\n\t\t\t\ti === 2 ? s : a\n\t\t\t];\n\t\t\tn[o](...c);\n\t\t}\n\t\telse throw TypeError(i);\n\t}), n;\n}, o = (e, t) => t ? [\n\te.a,\n\te.b,\n\te.c,\n\te.d,\n\te.e,\n\te.f\n] : [\n\te.m11,\n\te.m12,\n\te.m13,\n\te.m14,\n\te.m21,\n\te.m22,\n\te.m23,\n\te.m24,\n\te.m31,\n\te.m32,\n\te.m33,\n\te.m34,\n\te.m41,\n\te.m42,\n\te.m43,\n\te.m44\n], s = (e, t, n) => {\n\tlet r = new h();\n\treturn r.m41 = e, r.e = e, r.m42 = t, r.f = t, r.m43 = n, r;\n}, c = (e, t, n) => {\n\tlet r = new h(), i = Math.PI / 180, a = e * i, o = t * i, s = n * i, c = Math.cos(a), l = -Math.sin(a), u = Math.cos(o), d = -Math.sin(o), f = Math.cos(s), p = -Math.sin(s), m = u * f, g = -u * p;\n\tr.m11 = m, r.a = m, r.m12 = g, r.b = g, r.m13 = d;\n\tlet _ = l * d * f + c * p;\n\tr.m21 = _, r.c = _;\n\tlet v = c * f - l * d * p;\n\treturn r.m22 = v, r.d = v, r.m23 = -l * u, r.m31 = l * p - c * d * f, r.m32 = l * f + c * d * p, r.m33 = c * u, r;\n}, l = (e = 0, t = 0, n = 0, r = 0) => {\n\tlet i = new h(), a = Math.sqrt(e * e + t * t + n * n);\n\tif (a === 0) return i;\n\tlet o = e / a, s = t / a, c = n / a, l = Math.PI / 360 * r, u = Math.sin(l), d = Math.cos(l), f = u * u, p = o * o, m = s * s, g = c * c, _ = 1 - 2 * (m + g) * f;\n\ti.m11 = _, i.a = _;\n\tlet v = 2 * (o * s * f + c * u * d);\n\ti.m12 = v, i.b = v, i.m13 = 2 * (o * c * f - s * u * d);\n\tlet y = 2 * (s * o * f - c * u * d);\n\ti.m21 = y, i.c = y;\n\tlet b = 1 - 2 * (g + p) * f;\n\treturn i.m22 = b, i.d = b, i.m23 = 2 * (s * c * f + o * u * d), i.m31 = 2 * (c * o * f + s * u * d), i.m32 = 2 * (c * s * f - o * u * d), i.m33 = 1 - 2 * (p + m) * f, i;\n}, u = (e, t, n) => {\n\tlet r = new h();\n\treturn r.m11 = e, r.a = e, r.m22 = t, r.d = t, r.m33 = n, r;\n}, d = (e, t) => {\n\tlet n = new h();\n\tif (e) {\n\t\tlet t = e * Math.PI / 180, r = Math.tan(t);\n\t\tn.m21 = r, n.c = r;\n\t}\n\tif (t) {\n\t\tlet e = t * Math.PI / 180, r = Math.tan(e);\n\t\tn.m12 = r, n.b = r;\n\t}\n\treturn n;\n}, f = (e) => d(e, 0), p = (e) => d(0, e), m = (e, t) => r([\n\tt.m11 * e.m11 + t.m12 * e.m21 + t.m13 * e.m31 + t.m14 * e.m41,\n\tt.m11 * e.m12 + t.m12 * e.m22 + t.m13 * e.m32 + t.m14 * e.m42,\n\tt.m11 * e.m13 + t.m12 * e.m23 + t.m13 * e.m33 + t.m14 * e.m43,\n\tt.m11 * e.m14 + t.m12 * e.m24 + t.m13 * e.m34 + t.m14 * e.m44,\n\tt.m21 * e.m11 + t.m22 * e.m21 + t.m23 * e.m31 + t.m24 * e.m41,\n\tt.m21 * e.m12 + t.m22 * e.m22 + t.m23 * e.m32 + t.m24 * e.m42,\n\tt.m21 * e.m13 + t.m22 * e.m23 + t.m23 * e.m33 + t.m24 * e.m43,\n\tt.m21 * e.m14 + t.m22 * e.m24 + t.m23 * e.m34 + t.m24 * e.m44,\n\tt.m31 * e.m11 + t.m32 * e.m21 + t.m33 * e.m31 + t.m34 * e.m41,\n\tt.m31 * e.m12 + t.m32 * e.m22 + t.m33 * e.m32 + t.m34 * e.m42,\n\tt.m31 * e.m13 + t.m32 * e.m23 + t.m33 * e.m33 + t.m34 * e.m43,\n\tt.m31 * e.m14 + t.m32 * e.m24 + t.m33 * e.m34 + t.m34 * e.m44,\n\tt.m41 * e.m11 + t.m42 * e.m21 + t.m43 * e.m31 + t.m44 * e.m41,\n\tt.m41 * e.m12 + t.m42 * e.m22 + t.m43 * e.m32 + t.m44 * e.m42,\n\tt.m41 * e.m13 + t.m42 * e.m23 + t.m43 * e.m33 + t.m44 * e.m43,\n\tt.m41 * e.m14 + t.m42 * e.m24 + t.m43 * e.m34 + t.m44 * e.m44\n]), h = class {\n\tstatic Translate = s;\n\tstatic Rotate = c;\n\tstatic RotateAxisAngle = l;\n\tstatic Scale = u;\n\tstatic SkewX = f;\n\tstatic SkewY = p;\n\tstatic Skew = d;\n\tstatic Multiply = m;\n\tstatic fromArray = r;\n\tstatic fromMatrix = i;\n\tstatic fromString = a;\n\tstatic toArray = o;\n\tstatic isCompatibleArray = t;\n\tstatic isCompatibleObject = n;\n\tconstructor(e) {\n\t\treturn this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0, this.m11 = 1, this.m12 = 0, this.m13 = 0, this.m14 = 0, this.m21 = 0, this.m22 = 1, this.m23 = 0, this.m24 = 0, this.m31 = 0, this.m32 = 0, this.m33 = 1, this.m34 = 0, this.m41 = 0, this.m42 = 0, this.m43 = 0, this.m44 = 1, e ? this.setMatrixValue(e) : this;\n\t}\n\tget isIdentity() {\n\t\treturn this.m11 === 1 && this.m12 === 0 && this.m13 === 0 && this.m14 === 0 && this.m21 === 0 && this.m22 === 1 && this.m23 === 0 && this.m24 === 0 && this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m41 === 0 && this.m42 === 0 && this.m43 === 0 && this.m44 === 1;\n\t}\n\tget is2D() {\n\t\treturn this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n\t}\n\tsetMatrixValue(e) {\n\t\treturn typeof e == \"string\" && e.length && e !== \"none\" ? a(e) : Array.isArray(e) || e instanceof Float64Array || e instanceof Float32Array ? r(e) : typeof e == \"object\" ? i(e) : this;\n\t}\n\ttoFloat32Array(e) {\n\t\treturn Float32Array.from(o(this, e));\n\t}\n\ttoFloat64Array(e) {\n\t\treturn Float64Array.from(o(this, e));\n\t}\n\ttoString() {\n\t\tlet { is2D: e } = this, t = this.toFloat64Array(e).join(\", \");\n\t\treturn `${e ? \"matrix\" : \"matrix3d\"}(${t})`;\n\t}\n\ttoJSON() {\n\t\tlet { is2D: e, isIdentity: t } = this;\n\t\treturn {\n\t\t\t...this,\n\t\t\tis2D: e,\n\t\t\tisIdentity: t\n\t\t};\n\t}\n\tmultiply(e) {\n\t\treturn m(this, e);\n\t}\n\ttranslate(e, t, n) {\n\t\treturn this.multiply(s(e, t ?? 0, n ?? 0));\n\t}\n\tscale(e, t, n) {\n\t\treturn this.multiply(u(e, t ?? e, n ?? 1));\n\t}\n\trotate(e, t, n) {\n\t\tlet r = e, i = t || 0, a = n || 0;\n\t\treturn typeof e == \"number\" && t === void 0 && n === void 0 && (a = r, r = 0, i = 0), this.multiply(c(r, i, a));\n\t}\n\trotateAxisAngle(e = 0, t = 0, n = 0, r = 0) {\n\t\tif ([\n\t\t\te,\n\t\t\tt,\n\t\t\tn,\n\t\t\tr\n\t\t].some((e) => !Number.isFinite(e))) throw TypeError(\"CSSMatrix: expecting 4 values\");\n\t\treturn Math.sqrt(e * e + t * t + n * n) === 0 ? i(this) : this.multiply(l(e, t, n, r));\n\t}\n\tskewX(e) {\n\t\treturn this.multiply(f(e));\n\t}\n\tskewY(e) {\n\t\treturn this.multiply(p(e));\n\t}\n\tskew(e, t) {\n\t\treturn this.multiply(d(e, t));\n\t}\n\tmultiplySelf(e) {\n\t\tlet t = m(this, e);\n\t\treturn Object.assign(this, t), this;\n\t}\n\ttranslateSelf(e, t, n) {\n\t\treturn this.multiplySelf(s(e, t ?? 0, n ?? 0));\n\t}\n\tscaleSelf(e, t, n) {\n\t\treturn this.multiplySelf(u(e, t ?? e, n ?? 1));\n\t}\n\trotateSelf(e, t, n) {\n\t\tlet r = e, i = t || 0, a = n || 0;\n\t\treturn typeof e == \"number\" && t === void 0 && n === void 0 && (a = r, r = 0, i = 0), this.multiplySelf(c(r, i, a));\n\t}\n\trotateAxisAngleSelf(e = 0, t = 0, n = 0, r = 0) {\n\t\tif ([\n\t\t\te,\n\t\t\tt,\n\t\t\tn,\n\t\t\tr\n\t\t].some((e) => !Number.isFinite(e))) throw TypeError(\"CSSMatrix: expecting 4 values\");\n\t\treturn Math.sqrt(e * e + t * t + n * n) === 0 ? this : this.multiplySelf(l(e, t, n, r));\n\t}\n\tskewXSelf(e) {\n\t\treturn this.multiplySelf(f(e));\n\t}\n\tskewYSelf(e) {\n\t\treturn this.multiplySelf(p(e));\n\t}\n\tskewSelf(e, t) {\n\t\treturn this.multiplySelf(d(e, t));\n\t}\n\ttransformPoint(e) {\n\t\tlet t = this.m11 * e.x + this.m21 * e.y + this.m31 * e.z + this.m41 * e.w, n = this.m12 * e.x + this.m22 * e.y + this.m32 * e.z + this.m42 * e.w, r = this.m13 * e.x + this.m23 * e.y + this.m33 * e.z + this.m43 * e.w, i = this.m14 * e.x + this.m24 * e.y + this.m34 * e.z + this.m44 * e.w;\n\t\treturn e instanceof DOMPoint ? new DOMPoint(t, n, r, i) : {\n\t\t\tx: t,\n\t\t\ty: n,\n\t\t\tz: r,\n\t\t\tw: i\n\t\t};\n\t}\n};\n//#endregion\nexport { h as default };\n\n//# sourceMappingURL=dommatrix.mjs.map","import { PointTuple } from \"../types\";\n\n/**\n * Returns the coordinates of a specified distance\n * ratio between two points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @param t the ratio\n * @returns the midpoint coordinates\n */\nexport const midPoint = (\n [ax, ay]: PointTuple,\n [bx, by]: PointTuple,\n t: number,\n): PointTuple => {\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n","import { type PointTuple } from \"../types\";\n\n/**\n * Returns the square root of the distance\n * between two given points.\n *\n * @param a the first point coordinates\n * @param b the second point coordinates\n * @returns the distance value\n */\nexport const distanceSquareRoot = (a: PointTuple, b: PointTuple) => {\n return Math.sqrt(\n (a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]),\n );\n};\n","import { midPoint } from \"./midPoint\";\nimport { distanceSquareRoot } from \"./distanceSquareRoot\";\n\n/**\n * Returns length for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the line segment length\n */\nconst getLineLength = (x1: number, y1: number, x2: number, y2: number) => {\n return distanceSquareRoot([x1, y1], [x2, y2]);\n};\n\n/**\n * Returns a point along the line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to point in [0-1] range\n * @returns the point at length\n */\nconst getPointAtLineLength = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = distanceSquareRoot([x1, y1], [x2, y2]);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x: x2, y: y2 };\n } else {\n const [x, y] = midPoint([x1, y1], [x2, y2], distance / length);\n point = { x, y };\n }\n }\n return point;\n};\n\n/**\n * Returns bounding box for line segments (MoveTo, LineTo).\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the bounding box for line segments\n */\nconst getLineBBox = (x1: number, y1: number, x2: number, y2: number) => {\n const { min, max } = Math;\n\n return [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] as [\n number,\n number,\n number,\n number,\n ];\n};\n\nconst lineTools = {\n getLineBBox,\n getLineLength,\n getPointAtLineLength,\n};\n\nexport { getLineBBox, getLineLength, getPointAtLineLength, lineTools };\n","import { getPointAtLineLength } from \"./lineTools\";\nimport type { Point, PointTuple } from \"../types\";\n\n/**\n * Returns the Arc segment length.\n * @param rx radius along X axis\n * @param ry radius along Y axis\n * @param theta the angle in radians\n * @returns the arc length\n */\nconst arcLength = (rx: number, ry: number, theta: number) => {\n const halfTheta = theta / 2;\n const sinHalfTheta = Math.sin(halfTheta);\n const cosHalfTheta = Math.cos(halfTheta);\n const term1 = rx ** 2 * sinHalfTheta ** 2;\n const term2 = ry ** 2 * cosHalfTheta ** 2;\n const length = Math.sqrt(term1 + term2) * theta;\n return Math.abs(length);\n};\n\n/**\n * Find point on ellipse at given angle around ellipse (theta);\n * @param cx the center X\n * @param cy the center Y\n * @param rx the radius X\n * @param ry the radius Y\n * @param alpha the arc rotation angle in radians\n * @param theta the arc sweep angle in radians\n * @returns a point around ellipse at given angle\n */\nconst arcPoint = (\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n alpha: number,\n theta: number,\n) => {\n const { sin, cos } = Math;\n // theta is angle in radians around arc\n // alpha is angle of rotation of ellipse in radians\n const cosA = cos(alpha);\n const sinA = sin(alpha);\n const x = rx * cos(theta);\n const y = ry * sin(theta);\n\n return [cx + cosA * x - sinA * y, cy + sinA * x + cosA * y] as PointTuple;\n};\n\n/**\n * Returns the angle between two points.\n * @param v0 starting point\n * @param v1 ending point\n * @returns the angle in radian\n */\nconst angleBetween = (v0: Point, v1: Point) => {\n const { x: v0x, y: v0y } = v0;\n const { x: v1x, y: v1y } = v1;\n const p = v0x * v1x + v0y * v1y;\n const n = Math.sqrt((v0x ** 2 + v0y ** 2) * (v1x ** 2 + v1y ** 2));\n const sign = v0x * v1y - v0y * v1x < 0 ? -1 : 1;\n return sign * Math.acos(p / n);\n};\n\n/**\n * Returns the following properties for an Arc segment: center, start angle,\n * end angle, and radiuses on X and Y axis.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns properties specific to Arc segments\n */\nconst getArcProps = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { abs, sin, cos, sqrt, PI } = Math;\n let rx = abs(RX);\n let ry = abs(RY);\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n\n // istanbul ignore next @preserve\n if (x1 === x && y1 === y) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x, y },\n };\n }\n\n if (rx === 0 || ry === 0) {\n return {\n rx,\n ry,\n startAngle: 0,\n endAngle: 0,\n center: { x: (x + x1) / 2, y: (y + y1) / 2 },\n };\n }\n\n const dx = (x1 - x) / 2;\n const dy = (y1 - y) / 2;\n\n const transformedPoint = {\n x: cos(xRotRad) * dx + sin(xRotRad) * dy,\n y: -sin(xRotRad) * dx + cos(xRotRad) * dy,\n };\n\n const radiiCheck = transformedPoint.x ** 2 / rx ** 2 +\n transformedPoint.y ** 2 / ry ** 2;\n\n if (radiiCheck > 1) {\n rx *= sqrt(radiiCheck);\n ry *= sqrt(radiiCheck);\n }\n\n const cSquareNumerator = rx ** 2 * ry ** 2 -\n rx ** 2 * transformedPoint.y ** 2 - ry ** 2 * transformedPoint.x ** 2;\n const cSquareRootDenom = rx ** 2 * transformedPoint.y ** 2 +\n ry ** 2 * transformedPoint.x ** 2;\n\n let cRadicand = cSquareNumerator / cSquareRootDenom;\n /* istanbul ignore next @preserve */\n cRadicand = cRadicand < 0 ? 0 : cRadicand;\n const cCoef = (LAF !== SF ? 1 : -1) * sqrt(cRadicand);\n const transformedCenter = {\n x: cCoef * ((rx * transformedPoint.y) / ry),\n y: cCoef * (-(ry * transformedPoint.x) / rx),\n };\n\n const center = {\n x: cos(xRotRad) * transformedCenter.x - sin(xRotRad) * transformedCenter.y +\n (x1 + x) / 2,\n y: sin(xRotRad) * transformedCenter.x + cos(xRotRad) * transformedCenter.y +\n (y1 + y) / 2,\n };\n\n const startVector = {\n x: (transformedPoint.x - transformedCenter.x) / rx,\n y: (transformedPoint.y - transformedCenter.y) / ry,\n };\n\n const startAngle = angleBetween({ x: 1, y: 0 }, startVector);\n\n const endVector = {\n x: (-transformedPoint.x - transformedCenter.x) / rx,\n y: (-transformedPoint.y - transformedCenter.y) / ry,\n };\n\n let sweepAngle = angleBetween(startVector, endVector);\n if (!SF && sweepAngle > 0) {\n sweepAngle -= 2 * PI;\n } else if (SF && sweepAngle < 0) {\n sweepAngle += 2 * PI;\n }\n sweepAngle %= 2 * PI;\n\n const endAngle = startAngle + sweepAngle;\n\n // point.ellipticalArcStartAngle = startAngle;\n // point.ellipticalArcEndAngle = startAngle + sweepAngle;\n // point.ellipticalArcAngle = alpha;\n\n // point.ellipticalArcCenter = center;\n // point.resultantRx = rx;\n // point.resultantRy = ry;\n\n return {\n center,\n startAngle,\n endAngle,\n rx,\n ry,\n };\n};\n\n/**\n * Returns the length of an Arc segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the length of the Arc segment\n */\nconst getArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n return arcLength(rx, ry, endAngle - startAngle);\n};\n\n/**\n * Returns a point along an Arc segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance along the arc\n * @returns a point along the Arc segment\n */\nconst getPointAtArcLength = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n distance?: number,\n) => {\n let point = { x: x1, y: y1 };\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n\n /* istanbul ignore else @preserve */\n if (typeof distance === \"number\") {\n const length = arcLength(rx, ry, endAngle - startAngle);\n if (distance <= 0) {\n point = { x: x1, y: y1 };\n } else if (distance >= length) {\n point = { x, y };\n } else {\n /* istanbul ignore next @preserve */\n if (x1 === x && y1 === y) {\n return { x, y };\n }\n /* istanbul ignore next @preserve */\n if (rx === 0 || ry === 0) {\n return getPointAtLineLength(x1, y1, x, y, distance);\n }\n const { PI, cos, sin } = Math;\n const sweepAngle = endAngle - startAngle;\n const xRot = ((angle % 360) + 360) % 360;\n const xRotRad = xRot * (PI / 180);\n const alpha = startAngle + sweepAngle * (distance / length);\n const ellipseComponentX = rx * cos(alpha);\n const ellipseComponentY = ry * sin(alpha);\n\n point = {\n x: cos(xRotRad) * ellipseComponentX - sin(xRotRad) * ellipseComponentY +\n center.x,\n y: sin(xRotRad) * ellipseComponentX + cos(xRotRad) * ellipseComponentY +\n center.y,\n };\n }\n }\n\n return point;\n};\n\n/**\n * Returns the extrema for an Arc segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @see https://github.com/herrstrietzel/svg-pathdata-getbbox\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param RX the radius on X axis\n * @param RY the radius on Y axis\n * @param angle the ellipse rotation in degrees\n * @param LAF the large arc flag\n * @param SF the sweep flag\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the Arc segment\n */\nconst getArcBBox = (\n x1: number,\n y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n x: number,\n y: number,\n) => {\n const { center, rx, ry, startAngle, endAngle } = getArcProps(\n x1,\n y1,\n RX,\n RY,\n angle,\n LAF,\n SF,\n x,\n y,\n );\n const deltaAngle = endAngle - startAngle;\n const { min, max, tan, atan2, PI } = Math;\n\n // circle/elipse center coordinates\n const { x: cx, y: cy } = center;\n\n // rotation to radians\n const alpha = (angle * PI) / 180;\n const tangent = tan(alpha);\n\n /**\n * find min/max from zeroes of directional derivative along x and y\n * along x axis\n */\n const theta = atan2(-ry * tangent, rx);\n const angle1 = theta;\n const angle2 = theta + PI;\n const angle3 = atan2(ry, rx * tangent);\n const angle4 = angle3 + PI;\n const xArray = [x];\n const yArray = [y];\n\n // inner bounding box\n let xMin = min(x1, x);\n let xMax = max(x1, x);\n let yMin = min(y1, y);\n let yMax = max(y1, y);\n\n // on path point close after start\n const angleAfterStart = endAngle - deltaAngle * 0.00001;\n const pP2 = arcPoint(cx, cy, rx, ry, alpha, angleAfterStart);\n\n // on path point close before end\n const angleBeforeEnd = endAngle - deltaAngle * 0.99999;\n const pP3 = arcPoint(cx, cy, rx, ry, alpha, angleBeforeEnd);\n\n /**\n * expected extremes\n * if leaving inner bounding box\n * (between segment start and end point)\n * otherwise exclude elliptic extreme points\n */\n\n // right\n if (pP2[0] > xMax || pP3[0] > xMax) {\n // get point for this theta\n const p1 = arcPoint(cx, cy, rx, ry, alpha, angle1);\n xArray.push(p1[0]);\n yArray.push(p1[1]);\n }\n\n // left\n if (pP2[0] < xMin || pP3[0] < xMin) {\n // get anti-symmetric point\n const p2 = arcPoint(cx, cy, rx, ry, alpha, angle2);\n xArray.push(p2[0]);\n yArray.push(p2[1]);\n }\n\n // top\n if (pP2[1] < yMin || pP3[1] < yMin) {\n // get anti-symmetric point\n const p4 = arcPoint(cx, cy, rx, ry, alpha, angle4);\n xArray.push(p4[0]);\n yArray.push(p4[1]);\n }\n\n // bottom\n if (pP2[1] > yMax || pP3[1] > yMax) {\n // get point for this theta\n const p3 = arcPoint(cx, cy, rx, ry, alpha, angle3);\n xArray.push(p3[0]);\n yArray.push(p3[1]);\n }\n\n xMin = min.apply([], xArray);\n yMin = min.apply([], yArray);\n xMax = max.apply([], xArray);\n yMax = max.apply([], yArray);\n\n return [xMin, yMin, xMax, yMax] as [number, number, number, number];\n};\n\nconst arcTools = {\n angleBetween,\n arcLength,\n arcPoint,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n\nexport {\n angleBetween,\n arcLength,\n arcPoint,\n arcTools,\n getArcBBox,\n getArcLength,\n getArcProps,\n getPointAtArcLength,\n};\n","import type {\n CubicCoordinates,\n CubicPoints,\n DeriveCallback,\n DerivedCubicPoints,\n DerivedPoint,\n DerivedQuadPoints,\n PointTuple,\n QuadCoordinates,\n QuadPoints,\n} from \"../types\";\n\n/**\n * Tools from bezier.js by Mike 'Pomax' Kamermans\n * @see https://github.com/Pomax/bezierjs\n */\n\nconst Tvalues = [\n -0.0640568928626056260850430826247450385909,\n 0.0640568928626056260850430826247450385909,\n -0.1911188674736163091586398207570696318404,\n 0.1911188674736163091586398207570696318404,\n -0.3150426796961633743867932913198102407864,\n 0.3150426796961633743867932913198102407864,\n -0.4337935076260451384870842319133497124524,\n 0.4337935076260451384870842319133497124524,\n -0.5454214713888395356583756172183723700107,\n 0.5454214713888395356583756172183723700107,\n -0.6480936519369755692524957869107476266696,\n 0.6480936519369755692524957869107476266696,\n -0.7401241915785543642438281030999784255232,\n 0.7401241915785543642438281030999784255232,\n -0.8200019859739029219539498726697452080761,\n 0.8200019859739029219539498726697452080761,\n -0.8864155270044010342131543419821967550873,\n 0.8864155270044010342131543419821967550873,\n -0.9382745520027327585236490017087214496548,\n 0.9382745520027327585236490017087214496548,\n -0.9747285559713094981983919930081690617411,\n 0.9747285559713094981983919930081690617411,\n -0.9951872199970213601799974097007368118745,\n 0.9951872199970213601799974097007368118745,\n];\n\nconst Cvalues = [\n 0.1279381953467521569740561652246953718517,\n 0.1279381953467521569740561652246953718517,\n 0.1258374563468282961213753825111836887264,\n 0.1258374563468282961213753825111836887264,\n 0.121670472927803391204463153476262425607,\n 0.121670472927803391204463153476262425607,\n 0.1155056680537256013533444839067835598622,\n 0.1155056680537256013533444839067835598622,\n 0.1074442701159656347825773424466062227946,\n 0.1074442701159656347825773424466062227946,\n 0.0976186521041138882698806644642471544279,\n 0.0976186521041138882698806644642471544279,\n 0.086190161531953275917185202983742667185,\n 0.086190161531953275917185202983742667185,\n 0.0733464814110803057340336152531165181193,\n 0.0733464814110803057340336152531165181193,\n 0.0592985849154367807463677585001085845412,\n 0.0592985849154367807463677585001085845412,\n 0.0442774388174198061686027482113382288593,\n 0.0442774388174198061686027482113382288593,\n 0.0285313886289336631813078159518782864491,\n 0.0285313886289336631813078159518782864491,\n 0.0123412297999871995468056670700372915759,\n 0.0123412297999871995468056670700372915759,\n];\n\n/**\n * @param points\n * @returns\n */\nconst deriveBezier = (points: QuadPoints | CubicPoints) => {\n const dpoints = [] as (DerivedCubicPoints | DerivedQuadPoints)[];\n for (let p = points, d = p.length, c = d - 1; d > 1; d -= 1, c -= 1) {\n const list = [] as unknown as DerivedCubicPoints | DerivedQuadPoints;\n for (let j = 0; j < c; j += 1) {\n list.push({\n x: c * (p[j + 1].x - p[j].x),\n y: c * (p[j + 1].y - p[j].y),\n t: 0,\n });\n }\n dpoints.push(list);\n p = list;\n }\n return dpoints;\n};\n\n/**\n * @param points\n * @param t\n */\nconst computeBezier = (\n points: DerivedQuadPoints | DerivedCubicPoints,\n t: number,\n) => {\n // shortcuts\n /* istanbul ignore next @preserve */\n if (t === 0) {\n points[0].t = 0;\n return points[0];\n }\n\n const order = points.length - 1;\n\n /* istanbul ignore next @preserve */\n if (t === 1) {\n points[order].t = 1;\n return points[order];\n }\n\n const mt = 1 - t;\n let p = points as typeof points | [\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n DerivedPoint,\n ];\n\n // constant?\n /* istanbul ignore next @preserve */\n if (order === 0) {\n points[0].t = t;\n return points[0];\n }\n\n // linear?\n /* istanbul ignore else @preserve */\n if (order === 1) {\n return {\n x: mt * p[0].x + t * p[1].x,\n y: mt * p[0].y + t * p[1].y,\n t,\n };\n }\n\n // quadratic/cubic curve?\n const mt2 = mt * mt;\n const t2 = t * t;\n let a = 0;\n let b = 0;\n let c = 0;\n let d = 0;\n /* istanbul ignore else @preserve */\n if (order === 2) {\n p = [p[0], p[1], p[2], { x: 0, y: 0 } as DerivedPoint];\n a = mt2;\n b = mt * t * 2;\n c = t2;\n } else if (order === 3) {\n a = mt2 * mt;\n b = mt2 * t * 3;\n c = mt * t2 * 3;\n d = t * t2;\n }\n return {\n x: a * p[0].x + b * p[1].x + c * p[2].x + d * p[3].x,\n y: a * p[0].y + b * p[1].y + c * p[2].y + d * p[3].y,\n t,\n };\n};\n\nconst calculateBezier = (derivativeFn: DeriveCallback, t: number) => {\n const d = derivativeFn(t);\n const l = d.x * d.x + d.y * d.y;\n\n return Math.sqrt(l);\n};\n\nconst bezierLength = (derivativeFn: DeriveCallback) => {\n const z = 0.5;\n const len = Tvalues.length;\n\n let sum = 0;\n\n for (let i = 0, t; i < len; i++) {\n t = z * Tvalues[i] + z;\n sum += Cvalues[i] * calculateBezier(derivativeFn, t);\n }\n return z * sum;\n};\n\n/**\n * Returns the length of CubicBezier / Quad segment.\n * @param curve cubic / quad bezier segment\n */\nconst getBezierLength = (curve: CubicCoordinates | QuadCoordinates) => {\n const points = [] as unknown as CubicPoints | QuadPoints;\n for (let idx = 0, len = curve.length, step = 2; idx < len; idx += step) {\n points.push({\n x: curve[idx],\n y: curve[idx + 1],\n });\n }\n const dpoints = deriveBezier(points);\n return bezierLength((t: number) => {\n return computeBezier(dpoints[0], t);\n });\n};\n\n// Precision for consider cubic polynom as quadratic one\nconst CBEZIER_MINMAX_EPSILON = 0.00000001;\n\n/**\n * Returns the most extreme points in a Quad Bezier segment.\n * @param A an array which consist of X/Y values\n */\n// https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L89\nconst minmaxQ = ([v1, cp, v2]: [number, number, number]) => {\n const min = Math.min(v1, v2);\n const max = Math.max(v1, v2);\n\n /* istanbul ignore next @preserve */\n if (cp >= v1 ? v2 >= cp : v2 <= cp) {\n // if no extremum in ]0,1[\n return [min, max] as PointTuple;\n }\n\n // check if the extremum E is min or max\n const E = (v1 * v2 - cp * cp) / (v1 - 2 * cp + v2);\n return (E < min ? [E, max] : [min, E]) as PointTuple;\n};\n\n/**\n * Returns the most extreme points in a Cubic Bezier segment.\n * @param A an array which consist of X/Y values\n * @see https://github.com/kpym/SVGPathy/blob/acd1a50c626b36d81969f6e98e8602e128ba4302/lib/box.js#L127\n */\nconst minmaxC = ([v1, cp1, cp2, v2]: [number, number, number, number]) => {\n const K = v1 - 3 * cp1 + 3 * cp2 - v2;\n\n // if the polynomial is (almost) quadratic and not cubic\n /* istanbul ignore next @preserve */\n if (Math.abs(K) < CBEZIER_MINMAX_EPSILON) {\n if (v1 === v2 && v1 === cp1) {\n // no curve, point targeting same location\n return [v1, v2] as PointTuple;\n }\n\n return minmaxQ([v1, -0.5 * v1 + 1.5 * cp1, v1 - 3 * cp1 + 3 * cp2]);\n }\n\n // the reduced discriminant of the derivative\n const T = -v1 * cp2 + v1 * v2 - cp1 * cp2 - cp1 * v2 + cp1 * cp1 + cp2 * cp2;\n\n // if the polynomial is monotone in [0,1]\n if (T <= 0) {\n return [Math.min(v1, v2), Math.max(v1, v2)] as PointTuple;\n }\n const S = Math.sqrt(T);\n\n // potential extrema\n let min = Math.min(v1, v2);\n let max = Math.max(v1, v2);\n\n const L = v1 - 2 * cp1 + cp2;\n // check local extrema\n for (let R = (L + S) / K, i = 1; i <= 2; R = (L - S) / K, i++) {\n // istanbul ignore next @preserve\n if (R > 0 && R < 1) {\n // if the extrema is for R in [0,1]\n const Q = v1 * (1 - R) * (1 - R) * (1 - R) +\n cp1 * 3 * (1 - R) * (1 - R) * R + cp2 * 3 * (1 - R) * R * R +\n v2 * R * R * R;\n if (Q < min) {\n min = Q;\n }\n if (Q > max) {\n max = Q;\n }\n }\n }\n\n return [min, max] as PointTuple;\n};\nconst bezierTools = {\n bezierLength,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n\nexport {\n bezierLength,\n bezierTools,\n calculateBezier,\n CBEZIER_MINMAX_EPSILON,\n computeBezier,\n Cvalues,\n deriveBezier,\n getBezierLength,\n minmaxC,\n minmaxQ,\n Tvalues,\n};\n","import { getBezierLength, minmaxC } from \"./bezier\";\nimport { BBoxMaxima, type CubicCoordinates } from \"../types\";\n\n/**\n * Returns a point at a given length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the point at cubic-bezier segment length\n */\nconst getPointAtCubicSegmentLength = (\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 3 * x1 + 3 * t1 ** 2 * t * c1x + 3 * t1 * t ** 2 * c2x +\n t ** 3 * x2,\n y: t1 ** 3 * y1 + 3 * t1 ** 2 * t * c1y + 3 * t1 * t ** 2 * c2y +\n t ** 3 * y2,\n };\n};\n\n/**\n * Returns the length of a CubicBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the CubicBezier segment length\n */\nconst getCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n};\n\n/**\n * Returns the point along a CubicBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at CubicBezier length\n */\nconst getPointAtCubicLength = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, c1x, c1y, c2x, c2y, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtCubicSegmentLength(\n [x1, y1, c1x, c1y, c2x, c2y, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the bounding box of a CubicBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the CubicBezier segment\n */\nconst getCubicBBox = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n): BBoxMaxima => {\n const cxMinMax = minmaxC([x1, c1x, c2x, x2]);\n const cyMinMax = minmaxC([y1, c1y, c2y, y2]);\n\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]];\n};\n\nconst cubicTools = {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n\nexport {\n cubicTools,\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n getPointAtCubicSegmentLength,\n};\n","import { getBezierLength, minmaxQ } from \"./bezier\";\nimport { type QuadCoordinates } from \"../types\";\n\n/**\n * Returns the {x,y} coordinates of a point at a\n * given length of a quadratic-bezier segment.\n *\n * @see https://github.com/substack/point-at-length\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param t a [0-1] ratio\n * @returns the requested {x,y} coordinates\n */\nconst getPointAtQuadSegmentLength = (\n [x1, y1, cx, cy, x2, y2]: QuadCoordinates,\n t: number,\n) => {\n const t1 = 1 - t;\n return {\n x: t1 ** 2 * x1 + 2 * t1 * t * cx + t ** 2 * x2,\n y: t1 ** 2 * y1 + 2 * t1 * t * cy + t ** 2 * y2,\n };\n};\n\n/**\n * Returns the length of a QuadraticBezier segment.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the QuadraticBezier segment length\n */\nconst getQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n return getBezierLength([x1, y1, cx, cy, x2, y2]);\n};\n\n/**\n * Returns the point along a QuadraticBezier segment at a given distance.\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @param distance the distance to look at\n * @returns the point at QuadraticBezier length\n */\nconst getPointAtQuadLength = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n distance?: number,\n) => {\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: x1, y: y1 };\n\n /* istanbul ignore else @preserve */\n if (distanceIsNumber) {\n const currentLength = getBezierLength([x1, y1, cx, cy, x2, y2]);\n if (distance <= 0) {\n // first point already defined\n } else if (distance >= currentLength) {\n point = { x: x2, y: y2 };\n } else {\n point = getPointAtQuadSegmentLength(\n [x1, y1, cx, cy, x2, y2],\n distance / currentLength,\n );\n }\n }\n return point;\n};\n\n/**\n * Returns the bounding box of a QuadraticBezier segment in the following format:\n * [MIN_X, MIN_Y, MAX_X, MAX_Y]\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param cx the control point X\n * @param cy the control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the extrema of the QuadraticBezier segment\n */\nconst getQuadBBox = (\n x1: number,\n y1: number,\n cx: number,\n cy: number,\n x2: number,\n y2: number,\n) => {\n const cxMinMax = minmaxQ([x1, cx, x2]);\n const cyMinMax = minmaxQ([y1, cy, y2]);\n return [cxMinMax[0], cyMinMax[0], cxMinMax[1], cyMinMax[1]] as [\n number,\n number,\n number,\n number,\n ];\n};\nconst quadTools = {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n};\n\nexport {\n getPointAtQuadLength,\n getPointAtQuadSegmentLength,\n getQuadBBox,\n getQuadLength,\n quadTools,\n};\n","import { distanceSquareRoot } from \"./distanceSquareRoot\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * d3-polygon-area\n * @see https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon Array of [x, y]\n * @returns Signed area\n */\nconst polygonArea = (polygon: PointTuple[]) => {\n const n = polygon.length;\n let i = -1;\n let a: PointTuple;\n let b = polygon[n - 1];\n let area = 0;\n\n while (++i < n) {\n a = b;\n b = polygon[i];\n area += a[1] * b[0] - a[0] * b[1];\n }\n\n return area / 2;\n};\n\n/**\n * d3-polygon-length\n * https://github.com/d3/d3-polygon\n *\n * Returns the perimeter of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon length\n */\nconst polygonLength = (polygon: PointTuple[]) => {\n return polygon.reduce((length, point, i) => {\n if (i) {\n return length + distanceSquareRoot(polygon[i - 1], point);\n }\n return 0;\n }, 0);\n};\n\n/**\n * Computes the centroid (geometric center) of a polygon.\n * Uses average of all endpoint coordinates (robust for polygons and curves).\n *\n * @param polygon A polygon with consists of [x, y] tuples\n * @returns [x, y] centroid\n */\nconst polygonCentroid = (polygon: PointTuple[]): PointTuple => {\n if (polygon.length === 0) return [0, 0];\n\n let sumX = 0;\n let sumY = 0;\n\n for (const [x, y] of polygon) {\n sumX += x;\n sumY += y;\n }\n\n const count = polygon.length;\n return [sumX / count, sumY / count];\n};\n\nconst polygonTools = {\n polygonArea,\n polygonLength,\n polygonCentroid,\n};\n\nexport { polygonArea, polygonCentroid, polygonLength, polygonTools };\n","/**\n * Returns an {x,y} vector rotated by a given\n * angle in radian.\n *\n * @param x the initial vector x\n * @param y the initial vector y\n * @param rad the radian vector angle\n * @returns the rotated vector\n */\nexport const rotateVector = (\n x: number,\n y: number,\n rad: number,\n): { x: number; y: number } => {\n const { sin, cos } = Math;\n const X = x * cos(rad) - y * sin(rad);\n const Y = x * sin(rad) + y * cos(rad);\n return { x: X, y: Y };\n};\n","/**\n * Rounds a number to the specified number of decimal places.\n *\n * @param n - The number to round\n * @param round - Number of decimal places\n * @returns The rounded number\n */\nexport const roundTo = (n: number, round: number) => {\n const pow = round >= 1 ? 10 ** round : 1;\n\n return round > 0 ? Math.round(n * pow) / pow : Math.round(n);\n};\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nexport const defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n","/** Segment params length */\n\nexport const paramsCounts = {\n a: 7,\n c: 6,\n h: 1,\n l: 2,\n m: 2,\n r: 4,\n q: 4,\n s: 4,\n t: 2,\n v: 1,\n z: 0,\n};\n","import { paramsCounts } from \"./paramsCount\";\nimport { PathParser } from \"./pathParser\";\nimport type { PathCommand, PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Breaks the parsing of a pathString once a segment is finalized.\n *\n * @param path - The PathParser instance\n */\nexport const finalizeSegment = (path: PathParser) => {\n let pathCommand = path.pathValue[path.segmentStart] as PathCommand;\n let relativeCommand = pathCommand.toLowerCase() as RelativeCommand;\n const { data } = path;\n\n while (data.length >= paramsCounts[relativeCommand]) {\n // overloaded `moveTo`\n // https://github.com/rveciana/svg-path-properties/blob/master/src/parse.ts\n if (relativeCommand === \"m\" && data.length > 2) {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, 2) as number[],\n ) as PathSegment,\n );\n relativeCommand = \"l\";\n pathCommand = pathCommand === \"m\" ? \"l\" : \"L\";\n } else {\n path.segments.push(\n [pathCommand as PathCommand | number].concat(\n data.splice(0, paramsCounts[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCounts[relativeCommand]) {\n break;\n }\n }\n};\n","/** Error prefix used in all SVGPathCommander TypeError messages. */\nexport const error = \"SVGPathCommanderError\";\n","import { error } from \"../util/error\";\nimport type { PathParser } from \"./pathParser\";\n\n/**\n * Validates an A (arc-to) specific path command value.\n * Usually a `large-arc-flag` or `sweep-flag`.\n *\n * @param path - The PathParser instance\n */\nexport const scanFlag = (path: PathParser) => {\n const { index, pathValue } = path;\n const code = pathValue.charCodeAt(index);\n\n if (code === 0x30 /* 0 */) {\n path.param = 0;\n path.index += 1;\n return;\n }\n\n if (code === 0x31 /* 1 */) {\n path.param = 1;\n path.index += 1;\n return;\n }\n\n path.err = `${error}: invalid Arc flag \"${\n pathValue[index]\n }\", expecting 0 or 1 at index ${index}`;\n};\n","import { DigitNumber } from \"../types\";\n\n/**\n * Checks if a character is a digit.\n *\n * @param code the character to check\n * @returns check result\n */\nexport const isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\n","/** Error message prefix used when a path string cannot be parsed. */\nexport const invalidPathValue = \"Invalid path value\";\n","import { isDigit } from \"./isDigit\";\nimport { invalidPathValue } from \"./invalidPathValue\";\nimport { error } from \"../util/error\";\nimport type { PathParser } from \"./pathParser\";\n\n/**\n * Validates every character of the path string,\n * every path command, negative numbers or floating point numbers.\n *\n * @param path - The PathParser instance\n */\nexport const scanParam = (path: PathParser) => {\n const { max, pathValue, index: start } = path;\n let index = start;\n let zeroFirst = false;\n let hasCeiling = false;\n let hasDecimal = false;\n let hasDot = false;\n let ch;\n\n if (index >= max) {\n path.err =\n `${error}: ${invalidPathValue} at index ${index}, \"pathValue\" is missing param`;\n return;\n }\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n // ch = (index < max) ? pathValue.charCodeAt(index) : 0;\n ch = pathValue.charCodeAt(index);\n }\n\n // This logic is shamelessly borrowed from Esprima\n // https://github.com/ariya/esprimas\n if (!isDigit(ch) && ch !== 0x2e /* . */) {\n // path.err = 'SvgPath: param should start with 0..9 or `.` (at pos ' + index + ')';\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" is not a number`;\n return;\n }\n\n if (ch !== 0x2e /* . */) {\n zeroFirst = ch === 0x30 /* 0 */;\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (zeroFirst && index < max) {\n // decimal number starts with '0' such as '09' is illegal.\n if (ch && isDigit(ch)) {\n // path.err = 'SvgPath: numbers started with `0` such as `09`\n // are illegal (at pos ' + start + ')';\n path.err = `${error}: ${invalidPathValue} at index ${start}, \"${\n pathValue[start]\n }\" illegal number`;\n return;\n }\n }\n\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasCeiling = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x2e /* . */) {\n hasDot = true;\n index += 1;\n while (isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n hasDecimal = true;\n }\n\n ch = pathValue.charCodeAt(index);\n }\n\n if (ch === 0x65 /* e */ || ch === 0x45 /* E */) {\n if (hasDot && !hasCeiling && !hasDecimal) {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid float exponent`;\n return;\n }\n\n index += 1;\n\n ch = pathValue.charCodeAt(index);\n\n if (ch === 0x2b /* + */ || ch === 0x2d /* - */) {\n index += 1;\n }\n if (index < max && isDigit(pathValue.charCodeAt(index))) {\n while (index < max && isDigit(pathValue.charCodeAt(index))) {\n index += 1;\n }\n } else {\n path.err = `${error}: ${invalidPathValue} at index ${index}, \"${\n pathValue[index]\n }\" invalid integer exponent`;\n return;\n }\n }\n\n path.index = index;\n path.param = +path.pathValue.slice(start, index);\n};\n","import type { SpaceNumber } from \"../types\";\n\n/**\n * Checks if the character is a space.\n *\n * @param ch the character to check\n * @returns check result\n */\n\nexport const isSpace = (ch: number): ch is SpaceNumber => {\n const allSpaces = [\n // Special spaces\n 0x1680,\n 0x180e,\n 0x2000,\n 0x2001,\n 0x2002,\n 0x2003,\n 0x2004,\n 0x2005,\n 0x2006,\n 0x2007,\n 0x2008,\n 0x2009,\n 0x200a,\n 0x202f,\n 0x205f,\n 0x3000,\n 0xfeff,\n // Line terminators\n 0x0a,\n 0x0d,\n 0x2028,\n 0x2029,\n // White spaces\n 0x20,\n 0x09,\n 0x0b,\n 0x0c,\n 0xa0,\n ];\n\n return allSpaces.includes(ch);\n};\n","import { isSpace } from \"./isSpace\";\nimport type { PathParser } from \"./pathParser\";\n\n/**\n * Points the parser to the next character in the\n * path string every time it encounters any kind of\n * space character.\n *\n * @param path - The PathParser instance\n */\nexport const skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\n","import type { PathCommandNumber } from \"../types\";\n\n/**\n * Checks if the character is a path command.\n *\n * @param code the character to check\n * @returns check result\n */\nexport const isPathCommand = (code: number): code is PathCommandNumber => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x7a /* z */:\n case 0x6c /* l */:\n case 0x68 /* h */:\n case 0x76 /* v */:\n case 0x63 /* c */:\n case 0x73 /* s */:\n case 0x71 /* q */:\n case 0x74 /* t */:\n case 0x61 /* a */:\n // case 0x72/* r */:\n return true;\n default:\n return false;\n }\n};\n","import { isDigit } from \"./isDigit\";\nimport type { DigitNumber } from \"../types\";\n\n/**\n * Checks if the character is or belongs to a number.\n * [0-9]|+|-|.\n *\n * @param code the character to check\n * @returns check result\n */\nexport const isDigitStart = (\n code: number,\n): code is DigitNumber | 0x2b | 0x2d | 0x2e => {\n return isDigit(code) /* 0..9 */ || code === 0x2b /* + */ ||\n code === 0x2d /* - */ || code === 0x2e; /* . */\n};\n","/**\n * Checks if the character is an A (arc-to) path command.\n *\n * @param code the character to check\n * @returns check result\n */\nexport const isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nexport const isMoveCommand = (code: number): code is 0x6d | 0x4d => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n switch (code | 0x20) {\n case 0x6d /* m */:\n case 0x4d /* M */:\n return true;\n default:\n return false;\n }\n};\n","import { finalizeSegment } from \"./finalizeSegment\";\nimport { paramsCounts } from \"./paramsCount\";\nimport { scanFlag } from \"./scanFlag\";\nimport { scanParam } from \"./scanParam\";\nimport { skipSpaces } from \"./skipSpaces\";\nimport { isPathCommand } from \"./isPathCommand\";\nimport { isDigitStart } from \"./isDigitStart\";\nimport { isArcCommand } from \"./isArcCommand\";\nimport { isMoveCommand } from \"./isMoveCommand\";\nimport { invalidPathValue } from \"./invalidPathValue\";\nimport { error } from \"../util/error\";\n\nimport { type PathParser } from \"./pathParser\";\nimport type { PathSegment, RelativeCommand } from \"../types\";\n\n/**\n * Scans every character in the path string to determine\n * where a segment starts and where it ends.\n *\n * @param path - The PathParser instance\n */\nexport const scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramsCounts[pathValue[index].toLowerCase() as RelativeCommand];\n\n path.segmentStart = index;\n\n // segments always start with a path command\n if (!isPathCommand(cmdCode)) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a path command at index ${index}`;\n return;\n }\n\n // after a Z segment, we only expect a MoveTo path command\n const lastSegment = segments[segments.length - 1] as PathSegment | undefined;\n if (\n !isMoveCommand(cmdCode) &&\n lastSegment?.[0]?.toLocaleLowerCase() === \"z\"\n ) {\n path.err = `${error}: ${invalidPathValue} \"${\n pathValue[index]\n }\" is not a MoveTo path command at index ${index}`;\n return;\n }\n\n path.index += 1;\n skipSpaces(path);\n\n path.data = [];\n\n if (!reqParams) {\n // Z\n finalizeSegment(path);\n return;\n }\n\n for (;;) {\n for (let i = reqParams; i > 0; i -= 1) {\n if (isArcCommand(cmdCode) && (i === 3 || i === 4)) scanFlag(path);\n else scanParam(path);\n\n if (path.err.length) {\n return;\n }\n path.data.push(path.param);\n\n skipSpaces(path);\n\n // after ',' param is mandatory\n if (\n path.index < max &&\n pathValue.charCodeAt(path.index) === 0x2c /* , */\n ) {\n path.index += 1;\n skipSpaces(path);\n }\n }\n\n if (path.index >= path.max) {\n break;\n }\n\n // Stop on next segment\n if (!isDigitStart(pathValue.charCodeAt(path.index))) {\n break;\n }\n }\n\n finalizeSegment(path);\n};\n","import type { PathArray, PathSegment } from \"../types\";\n\n/**\n * The `PathParser` is used by the `parsePathString` static method\n * to generate a `pathArray`.\n *\n * @param pathString - The SVG path string to parse\n */\nexport class PathParser {\n declare segments: PathArray | PathSegment[];\n declare pathValue: string;\n declare max: number;\n declare index: number;\n declare param: number;\n declare segmentStart: number;\n declare data: (string | number)[];\n declare err: string;\n\n constructor(pathString: string) {\n this.segments = [];\n this.pathValue = pathString;\n this.max = pathString.length;\n this.index = 0;\n this.param = 0.0;\n this.segmentStart = 0;\n this.data = [];\n this.err = \"\";\n }\n}\n","import { scanSegment } from \"./scanSegment\";\nimport { skipSpaces } from \"./skipSpaces\";\nimport { PathParser } from \"./pathParser\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Parses a path string value and returns an array\n * of segments we like to call `PathArray`.\n *\n * If parameter value is already a `PathArray`,\n * return a clone of it.\n\n * @example\n * parsePathString(\"M 0 0L50 50\")\n * // => [[\"M\",0,0],[\"L\",50,50]]\n *\n * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nexport const parsePathString = <T extends PathArray>(pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as T;\n }\n\n const path = new PathParser(pathInput);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n // handle valid paths first\n // handle errors second\n if (!path.err.length) {\n if (path.segments.length) {\n /**\n * force absolute first M\n * getPathBBox calculation requires first segment to be absolute\n * @see https://github.com/thednp/svg-path-commander/pull/49\n */\n path.segments[0][0] = \"M\";\n }\n } else {\n throw TypeError(path.err);\n }\n\n return path.segments as PathArray;\n};\n","import type {\n AbsoluteCommand,\n AbsoluteSegment,\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n PathSegment,\n QSegment,\n SSegment,\n TSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Returns an absolute segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the absolute segment\n */\nexport const absolutizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isAbsolute = absCommand === pathCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isAbsolute) return segment as MSegment | AbsoluteSegment;\n // const values = segment.slice(1) as number[];\n if (absCommand === \"A\") {\n return [\n absCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as ASegment)[6] + lastX,\n (segment as ASegment)[7] + lastY,\n ] as ASegment;\n } else if (absCommand === \"V\") {\n return [absCommand, (segment as VSegment)[1] + lastY] as VSegment;\n } else if (absCommand === \"H\") {\n return [absCommand, (segment as HSegment)[1] + lastX] as HSegment;\n } else if (absCommand === \"L\") {\n return [\n absCommand,\n (segment as LSegment)[1] + lastX,\n (segment as LSegment)[2] + lastY,\n ] as LSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const absValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n absValues.push((segment[j] as number) + (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [absCommand as typeof absCommand | number].concat(absValues) as\n | MSegment\n | QSegment\n | TSegment\n | SSegment\n | CSegment;\n }\n};\n","// import paramsParser from '../parser/paramsParser';\nimport type { AbsoluteCommand, IteratorCallback, PathArray } from \"../types\";\n\n/**\n * Iterates over a `PathArray`, executing a callback for each segment.\n * The callback can:\n * - Read current position (`x`, `y`)\n * - Modify the segment (return new segment)\n * - Stop early (return `false`)\n *\n * The iterator maintains accurate current point (`x`, `y`) and subpath start (`mx`, `my`)\n * while correctly handling relative/absolute commands, including H/V and Z.\n *\n * **Important**: If the callback returns a new segment with more coordinates (e.g., Q → C),\n * the path length may increase, and iteration will continue over new segments.\n *\n * @template T - Specific PathArray type (e.g., CurveArray, PolylineArray)\n * @param path - The source `PathArray` to iterate over\n * @param iterator - Callback function for each segment\n * @param iterator.segment - Current path segment\n * @param iterator.index - Index of current segment\n * @param iterator.x - Current X position (after applying relative offset)\n * @param iterator.y - Current Y position (after applying relative offset)\n * @returns The modified `path` (or original if no changes)\n *\n * @example\n * iterate(path, (seg, i, x, y) => {\n * if (seg[0] === 'L') return ['C', x, y, seg[1], seg[2], seg[1], seg[2]];\n * });\n */\nexport const iterate = <T extends PathArray>(\n path: T,\n iterator: IteratorCallback<T>,\n) => {\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n\n let i = 0;\n while (i < path.length) {\n const segment = path[i];\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const isRelative = absCommand !== pathCommand;\n\n const iteratorResult = iterator(segment, i, x, y);\n // some methods like getPointAtLength would like to break\n // when task is complete\n if (iteratorResult === false) {\n break;\n }\n\n // segment = path[i];\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n x = (segment[1] as number) + (isRelative ? x : 0);\n } else if (absCommand === \"V\") {\n y = (segment[1] as number) + (isRelative ? y : 0);\n } else {\n const segLen = segment.length;\n\n x = (segment[segLen - 2] as number) + (isRelative ? x : 0);\n y = (segment[segLen - 1] as number) + (isRelative ? y : 0);\n\n if (absCommand === \"M\") {\n mx = x;\n my = y;\n }\n }\n\n if (iteratorResult) {\n path[i] = iteratorResult;\n }\n\n i += 1;\n }\n return path as T;\n};\n","import type { AbsoluteArray, PathArray } from \"../types\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { absolutizeSegment } from \"../process/absolutizeSegment\";\nimport { iterate } from \"../process/iterate\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to absolute values.\n *\n * @param pathInput - The path string or PathArray\n * @returns The resulted PathArray with absolute values\n *\n * @example\n * ```ts\n * pathToAbsolute('M10 10l80 80')\n * // => [['M', 10, 10], ['L', 90, 90]]\n * ```\n */\nexport const pathToAbsolute = <T extends PathArray>(pathInput: string | T) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment) as AbsoluteArray;\n};\n","import type {\n aSegment,\n cSegment,\n hSegment,\n lSegment,\n MSegment,\n PathSegment,\n qSegment,\n RelativeCommand,\n RelativeSegment,\n sSegment,\n tSegment,\n vSegment,\n} from \"../types\";\n\n/**\n * Returns a relative segment of a `PathArray` object.\n *\n * @param segment the segment object\n * @param index the segment index\n * @param lastX the last known X value\n * @param lastY the last known Y value\n * @returns the relative segment\n */\nexport const relativizeSegment = (\n segment: PathSegment,\n index: number,\n lastX: number,\n lastY: number,\n) => {\n const [pathCommand] = segment;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n\n /* istanbul ignore else @preserve */\n if (index === 0 || isRelative) return segment as MSegment | RelativeSegment;\n\n if (relCommand === \"a\") {\n return [\n relCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5],\n (segment as aSegment)[6] - lastX,\n (segment as aSegment)[7] - lastY,\n ] as aSegment;\n } else if (relCommand === \"v\") {\n return [relCommand, (segment as vSegment)[1] - lastY] as vSegment;\n } else if (relCommand === \"h\") {\n return [relCommand, (segment as hSegment)[1] - lastX] as hSegment;\n } else if (relCommand === \"l\") {\n return [\n relCommand,\n (segment as lSegment)[1] - lastX,\n (segment as lSegment)[2] - lastY,\n ] as lSegment;\n } else {\n // use brakets for `eslint: no-case-declaration`\n // https://stackoverflow.com/a/50753272/803358\n const relValues = [] as number[];\n const seglen = segment.length;\n for (let j = 1; j < seglen; j += 1) {\n relValues.push((segment[j] as number) - (j % 2 ? lastX : lastY));\n }\n // for c, s, q, t\n return [relCommand as RelativeCommand | number].concat(relValues) as\n | qSegment\n | tSegment\n | sSegment\n | cSegment;\n }\n};\n","import type { PathArray, RelativeArray } from \"../types\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { iterate } from \"../process/iterate\";\nimport { relativizeSegment } from \"../process/relativizeSegment\";\n\n/**\n * Parses a path string value or object and returns an array\n * of segments, all converted to relative values.\n *\n * @param pathInput - The path string or PathArray\n * @returns The resulted PathArray with relative values\n *\n * @example\n * ```ts\n * pathToRelative('M10 10L90 90')\n * // => [['M', 10, 10], ['l', 80, 80]]\n * ```\n */\nexport const pathToRelative = <T extends PathArray>(\n pathInput: string | T,\n): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment) as RelativeArray;\n};\n","import { rotateVector } from \"../math/rotateVector\";\n\n/**\n * Converts A (arc-to) segments to C (cubic-bezier-to).\n *\n * For more information of where this math came from visit:\n * http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n *\n * @param X1 the starting x position\n * @param Y1 the starting y position\n * @param RX x-radius of the arc\n * @param RY y-radius of the arc\n * @param angle x-axis-rotation of the arc\n * @param LAF large-arc-flag of the arc\n * @param SF sweep-flag of the arc\n * @param X2 the ending x position\n * @param Y2 the ending y position\n * @param recursive the parameters needed to split arc into 2 segments\n * @returns the resulting cubic-bezier segment(s)\n */\nexport const arcToCubic = (\n X1: number,\n Y1: number,\n RX: number,\n RY: number,\n angle: number,\n LAF: number,\n SF: number,\n X2: number,\n Y2: number,\n recursive?: [number, number, number, number],\n): number[] => {\n let x1 = X1;\n let y1 = Y1;\n let rx = RX;\n let ry = RY;\n let x2 = X2;\n let y2 = Y2;\n // for more information of where this Math came from visit:\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n const d120 = (Math.PI * 120) / 180;\n\n const rad = (Math.PI / 180) * (+angle || 0);\n let res = [] as number[];\n let xy;\n let f1;\n let f2;\n let cx;\n let cy;\n\n if (!recursive) {\n xy = rotateVector(x1, y1, -rad);\n x1 = xy.x;\n y1 = xy.y;\n xy = rotateVector(x2, y2, -rad);\n x2 = xy.x;\n y2 = xy.y;\n\n const x = (x1 - x2) / 2;\n const y = (y1 - y2) / 2;\n let h = (x * x) / (rx * rx) + (y * y) / (ry * ry);\n if (h > 1) {\n h = Math.sqrt(h);\n rx *= h;\n ry *= h;\n }\n const rx2 = rx * rx;\n const ry2 = ry * ry;\n\n const k = (LAF === SF ? -1 : 1) *\n Math.sqrt(\n Math.abs(\n (rx2 * ry2 - rx2 * y * y - ry2 * x * x) / (rx2 * y * y + ry2 * x * x),\n ),\n );\n\n cx = (k * rx * y) / ry + (x1 + x2) / 2;\n cy = (k * -ry * x) / rx + (y1 + y2) / 2;\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f1 = Math.asin(((((y1 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy no-bitwise\n f2 = Math.asin(((((y2 - cy) / ry) * 10 ** 9) >> 0) / 10 ** 9);\n\n f1 = x1 < cx ? Math.PI - f1 : f1;\n f2 = x2 < cx ? Math.PI - f2 : f2;\n if (f1 < 0) f1 = Math.PI * 2 + f1;\n if (f2 < 0) f2 = Math.PI * 2 + f2;\n if (SF && f1 > f2) {\n f1 -= Math.PI * 2;\n }\n if (!SF && f2 > f1) {\n f2 -= Math.PI * 2;\n }\n } else {\n [f1, f2, cx, cy] = recursive;\n }\n let df = f2 - f1;\n if (Math.abs(df) > d120) {\n const f2old = f2;\n const x2old = x2;\n const y2old = y2;\n f2 = f1 + d120 * (SF && f2 > f1 ? 1 : -1);\n x2 = cx + rx * Math.cos(f2);\n y2 = cy + ry * Math.sin(f2);\n res = arcToCubic(x2, y2, rx, ry, angle, 0, SF, x2old, y2old, [\n f2,\n f2old,\n cx,\n cy,\n ]);\n }\n df = f2 - f1;\n const c1 = Math.cos(f1);\n const s1 = Math.sin(f1);\n const c2 = Math.cos(f2);\n const s2 = Math.sin(f2);\n const t = Math.tan(df / 4);\n const hx = (4 / 3) * rx * t;\n const hy = (4 / 3) * ry * t;\n const m1 = [x1, y1];\n const m2 = [x1 + hx * s1, y1 - hy * c1];\n const m3 = [x2 + hx * s2, y2 - hy * c2];\n const m4 = [x2, y2];\n m2[0] = 2 * m1[0] - m2[0];\n m2[1] = 2 * m1[1] - m2[1];\n if (recursive) {\n return [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n }\n res = [m2[0], m2[1], m3[0], m3[1], m4[0], m4[1]].concat(res);\n const newres = [];\n for (let i = 0, ii = res.length; i < ii; i += 1) {\n newres[i] = i % 2\n ? rotateVector(res[i - 1], res[i], rad).y\n : rotateVector(res[i], res[i + 1], rad).x;\n }\n return newres;\n};\n","/**\n * Converts a Q (quadratic-bezier) segment to C (cubic-bezier).\n *\n * @param x1 curve start x\n * @param y1 curve start y\n * @param qx control point x\n * @param qy control point y\n * @param x2 curve end x\n * @param y2 curve end y\n * @returns the cubic-bezier segment\n */\nexport const quadToCubic = (\n x1: number,\n y1: number,\n qx: number,\n qy: number,\n x2: number,\n y2: number,\n): [number, number, number, number, number, number] => {\n const r13 = 1 / 3;\n const r23 = 2 / 3;\n return [\n r13 * x1 + r23 * qx, // cpx1\n r13 * y1 + r23 * qy, // cpy1\n r13 * x2 + r23 * qx, // cpx2\n r13 * y2 + r23 * qy, // cpy2\n x2,\n y2, // x,y\n ];\n};\n","import { midPoint } from \"../math/midPoint\";\n\n/**\n * Converts an L (line-to) segment to C (cubic-bezier).\n *\n * @param x1 line start x\n * @param y1 line start y\n * @param x2 line end x\n * @param y2 line end y\n * @returns the cubic-bezier segment\n */\nexport const lineToCubic = (x1: number, y1: number, x2: number, y2: number) => {\n const c1 = midPoint([x1, y1], [x2, y2], 1.0 / 3.0);\n const c2 = midPoint([x1, y1], [x2, y2], 2.0 / 3.0);\n return [c1[0], c1[1], c2[0], c2[1], x2, y2];\n};\n","import { arcToCubic } from \"./arcToCubic\";\nimport { quadToCubic } from \"./quadToCubic\";\nimport { lineToCubic } from \"./lineToCubic\";\nimport type { CSegment, MSegment, PathSegment } from \"../types\";\nimport type { ParserParams } from \"../interface\";\n\n/**\n * Converts any segment to C (cubic-bezier).\n *\n * @param segment the source segment\n * @param params the source segment parameters\n * @returns the cubic-bezier segment\n */\nexport const segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const pathCommand = segment[0];\n const values = segment.slice(1).map(Number);\n const [x, y] = values;\n // let args;\n // const { x1: px1, y1: py1, x: px, y: py } = params;\n const { x1: px1, y1: py1 } = params;\n\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\n params.mx = x;\n params.my = y;\n params.x = x;\n params.y = y;\n return segment;\n } else if (pathCommand === \"A\") {\n return [\"C\" as string | number].concat(\n arcToCubic(\n px1,\n py1,\n values[0],\n values[1],\n values[2],\n values[3],\n values[4],\n values[5],\n values[6],\n ),\n ) as CSegment;\n } else if (pathCommand === \"Q\") {\n params.qx = x;\n params.qy = y;\n return [\"C\" as string | number].concat(\n quadToCubic(px1, py1, values[0], values[1], values[2], values[3]),\n ) as CSegment;\n } else if (pathCommand === \"L\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, x, y),\n ) as CSegment;\n } else if (pathCommand === \"Z\") {\n return [\"C\" as string | number].concat(\n lineToCubic(px1, py1, params.mx, params.my),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\n","import type { ParserParams } from \"../interface\";\nimport type {\n ASegment,\n CSegment,\n HSegment,\n LSegment,\n MSegment,\n NormalSegment,\n PathCommand,\n PathSegment,\n PointTuple,\n QSegment,\n VSegment,\n} from \"../types\";\n\n/**\n * Normalizes a single segment of a `pathArray` object.\n *\n * @param segment the segment object\n * @param params the normalization parameters\n * @returns the normalized segment\n */\nexport const normalizeSegment = (\n segment: PathSegment,\n params: ParserParams,\n) => {\n const [pathCommand] = segment;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = pathCommand !== absCommand;\n const { x1: px1, y1: py1, x2: px2, y2: py2, x, y } = params;\n const values = segment.slice(1) as number[];\n let absValues = values.map((n, j) => n + (isRelative ? (j % 2 ? y : x) : 0));\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n // istanbul ignore else @preserve\n if (absCommand === \"A\") {\n absValues = values.slice(0, -2).concat(\n values[5] + (isRelative ? x : 0),\n values[6] + (isRelative ? y : 0),\n );\n\n return [\"A\" as PathCommand | number].concat(absValues) as ASegment;\n } else if (absCommand === \"H\") {\n return [\n \"L\",\n (segment as HSegment)[1] + (isRelative ? x : 0),\n py1,\n ] as LSegment;\n } else if (absCommand === \"V\") {\n return [\n \"L\",\n px1,\n (segment as VSegment)[1] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"L\") {\n return [\n \"L\",\n (segment as LSegment)[1] + (isRelative ? x : 0),\n (segment as LSegment)[2] + (isRelative ? y : 0),\n ] as LSegment;\n } else if (absCommand === \"M\") {\n return [\n \"M\",\n (segment as MSegment)[1] + (isRelative ? x : 0),\n (segment as MSegment)[2] + (isRelative ? y : 0),\n ] as MSegment;\n } else if (absCommand === \"C\") {\n return [\"C\" as PathCommand | number].concat(absValues) as CSegment;\n } else if (absCommand === \"S\") {\n const x1 = px1 * 2 - px2;\n const y1 = py1 * 2 - py2;\n params.x1 = x1;\n params.y1 = y1;\n return [\"C\", x1, y1].concat(absValues) as CSegment;\n } else if (absCommand === \"T\") {\n const qx = px1 * 2 - (params.qx ? params.qx : /* istanbul ignore next */ 0);\n const qy = py1 * 2 - (params.qy ? params.qy : /* istanbul ignore next */ 0);\n params.qx = qx;\n params.qy = qy;\n return [\"Q\", qx, qy].concat(absValues) as QSegment;\n } else if (absCommand === \"Q\") {\n const [nqx, nqy] = absValues as PointTuple;\n params.qx = nqx;\n params.qy = nqy;\n return [\"Q\" as PathCommand | number].concat(absValues) as QSegment;\n } else if (absCommand === \"Z\") {\n return [\"Z\"] as NormalSegment;\n }\n\n // istanbul ignore next @preserve\n return segment as NormalSegment;\n};\n","import type { ParserParams } from \"../interface\";\n\n/**\n * Default parser parameters object used to track position state\n * while iterating through path segments.\n */\nexport const paramsParser: ParserParams = {\n mx: 0,\n my: 0,\n x1: 0,\n y1: 0,\n x2: 0,\n y2: 0,\n x: 0,\n y: 0,\n qx: null,\n qy: null,\n};\n","import { segmentToCubic } from \"../process/segmentToCubic\";\nimport { AbsoluteCommand, CSegment, CurveArray, PathArray } from \"../types\";\nimport { iterate } from \"../process/iterate\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { normalizeSegment } from \"../process/normalizeSegment\";\nimport { paramsParser } from \"../parser/paramsParser\";\n\n/**\n * Parses a path string or PathArray and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * @param pathInput - The path string or PathArray\n * @returns The resulted CurveArray with all segments as cubic beziers\n *\n * @example\n * ```ts\n * pathToCurve('M10 50q15 -25 30 0')\n * // => [['M', 10, 50], ['C', 25, 25, 40, 50, 40, 50]]\n * ```\n */\nexport const pathToCurve = <T extends PathArray>(\n pathInput: string | T,\n): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n // let mx = 0;\n // let my = 0;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\n if (normalSegment[0] === \"M\") {\n params.mx = normalSegment[1];\n params.my = normalSegment[2];\n }\n let result = segmentToCubic(normalSegment, params);\n const isLongArc = result[0] === \"C\" && result.length > 7;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as AbsoluteCommand | number].concat(result.slice(7)) as CSegment,\n );\n result = result.slice(0, 7) as CSegment;\n }\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n }) as CurveArray;\n};\n","import type { PathArray, PathSegment } from \"../types\";\nimport { defaultOptions } from \"../options/options\";\nimport { roundTo } from \"../math/roundTo\";\n\n/**\n * Returns a valid `d` attribute string value created\n * by rounding values and concatenating the PathArray segments.\n *\n * @param path - The PathArray object\n * @param roundOption - Amount of decimals to round values to, or \"off\"\n * @returns The concatenated path string\n *\n * @example\n * ```ts\n * pathToString([['M', 10, 10], ['L', 90, 90]], 2)\n * // => 'M10 10L90 90'\n * ```\n */\nexport const pathToString = <T extends PathArray>(\n path: T,\n roundOption?: number | \"off\",\n): string => {\n const pathLen = path.length;\n let { round } = defaultOptions;\n let segment = path[0] as PathSegment;\n let result = \"\";\n\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : \"off\";\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n const [pathCommand] = segment;\n const values = segment.slice(1) as number[];\n result += pathCommand;\n if (round === \"off\") {\n result += values.join(\" \");\n } else {\n let j = 0;\n const valLen = values.length;\n while (j < valLen) {\n result += roundTo(values[j], round);\n if (j !== valLen - 1) result += \" \";\n j += 1;\n }\n }\n }\n\n return result;\n};\n","import { iterate } from \"../process/iterate\";\nimport { PathBBox } from \"../interface\";\nimport { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineBBox } from \"../math/lineTools\";\nimport { getArcBBox } from \"../math/arcTools\";\nimport { getCubicBBox } from \"../math/cubicTools\";\nimport { getQuadBBox } from \"../math/quadTools\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { absolutizeSegment } from \"../process/absolutizeSegment\";\n\n/**\n * Calculates the bounding box of a path.\n *\n * @param pathInput - The path string or PathArray\n * @returns An object with width, height, x, y, x2, y2, cx, cy, cz properties\n *\n * @example\n * ```ts\n * getPathBBox('M0 0L100 0L100 100L0 100Z')\n * // => { x: 0, y: 0, width: 100, height: 100, x2: 100, y2: 100, cx: 50, cy: 50, cz: 150 }\n * ```\n */\nexport const getPathBBox = <T extends PathArray>(pathInput: T | string) => {\n if (!pathInput) {\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n x2: 0,\n y2: 0,\n cx: 0,\n cy: 0,\n cz: 0,\n };\n }\n\n const path = parsePathString(pathInput);\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n const { max, min } = Math;\n let xMin = Infinity;\n let yMin = Infinity;\n let xMax = -Infinity;\n let yMax = -Infinity;\n let minX = 0;\n let minY = 0;\n let maxX = 0;\n let maxY = 0;\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n [, mx, my] = normalSegment as MSegment;\n minX = mx;\n minY = my;\n maxX = mx;\n maxY = my;\n } else if (pathCommand === \"L\") {\n [minX, minY, maxX, maxY] = getLineBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n [minX, minY, maxX, maxY] = getArcBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n [minX, minY, maxX, maxY] = getCubicBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n [minX, minY, maxX, maxY] = getQuadBBox(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n [minX, minY, maxX, maxY] = getLineBBox(lastX, lastY, mx, my);\n }\n xMin = min(minX, xMin);\n yMin = min(minY, yMin);\n xMax = max(maxX, xMax);\n yMax = max(maxY, yMax);\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n const width = xMax - xMin;\n const height = yMax - yMin;\n\n return {\n width,\n height,\n x: xMin,\n y: yMin,\n x2: xMax,\n y2: yMax,\n cx: xMin + width / 2,\n cy: yMin + height / 2,\n // an estimated guess\n cz: Math.max(width, height) + Math.min(width, height) / 2,\n } satisfies PathBBox;\n};\n","import type { LSegment, MSegment, PathArray, PointTuple } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getArcLength } from \"../math/arcTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getQuadLength } from \"../math/quadTools\";\nimport { iterate } from \"../process/iterate\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { absolutizeSegment } from \"../process/absolutizeSegment\";\n\n/**\n * Returns the total length of a path, equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput - The target path string or PathArray\n * @returns The total length of the path\n *\n * @example\n * ```ts\n * getTotalLength('M0 0L100 0L100 100L0 100Z')\n * // => 300\n * ```\n */\nexport const getTotalLength = <T extends PathArray>(pathInput: string | T) => {\n const path = parsePathString(pathInput);\n let paramX1 = 0;\n let paramY1 = 0;\n let paramX2 = 0;\n let paramY2 = 0;\n let paramQX = 0;\n let paramQY = 0;\n let pathCommand = \"M\";\n let mx = 0;\n let my = 0;\n let totalLength = 0;\n\n iterate(path, (seg, index, lastX, lastY) => {\n [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as typeof seg);\n\n const normalSegment = absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n [pathCommand] = normalSegment;\n\n if (!\"TQ\".includes(absCommand)) {\n // optional but good to be cautious\n paramQX = 0;\n paramQY = 0;\n }\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (pathCommand === \"M\") {\n // remember mx, my for Z\n [, mx, my] = normalSegment as MSegment;\n } else if (pathCommand === \"L\") {\n totalLength += getLineLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"A\") {\n totalLength += getArcLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n normalSegment[7] as number,\n );\n } else if (pathCommand === \"S\") {\n const cp1x = paramX1 * 2 - paramX2;\n const cp1y = paramY1 * 2 - paramY2;\n\n totalLength += getCubicLength(\n lastX,\n lastY,\n cp1x,\n cp1y,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"C\") {\n totalLength += getCubicLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n normalSegment[5] as number,\n normalSegment[6] as number,\n );\n } else if (pathCommand === \"T\") {\n paramQX = paramX1 * 2 - paramQX;\n paramQY = paramY1 * 2 - paramQY;\n totalLength += getQuadLength(\n lastX,\n lastY,\n paramQX,\n paramQY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n );\n } else if (pathCommand === \"Q\") {\n paramQX = normalSegment[1] as number;\n paramQY = normalSegment[2] as number;\n totalLength += getQuadLength(\n lastX,\n lastY,\n normalSegment[1] as number,\n normalSegment[2] as number,\n normalSegment[3] as number,\n normalSegment[4] as number,\n );\n } else if (pathCommand === \"Z\") {\n totalLength += getLineLength(lastX, lastY, mx, my);\n }\n\n // update params\n [paramX1, paramY1] = pathCommand === \"Z\"\n ? [mx, my]\n : (normalSegment.slice(-2) as PointTuple);\n [paramX2, paramY2] = pathCommand === \"C\"\n ? ([normalSegment[3], normalSegment[4]] as PointTuple)\n : pathCommand === \"S\"\n ? ([normalSegment[1], normalSegment[2]] as PointTuple)\n : [paramX1, paramY1];\n });\n\n return totalLength;\n};\n","/** Small threshold value used for floating-point distance comparisons in path calculations. */\nconst DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import type { NormalArray, PathArray } from \"../types\";\nimport { normalizeSegment } from \"./normalizeSegment\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { paramsParser } from \"../parser/paramsParser\";\nimport { iterate } from \"./iterate\";\n\n/**\n * Parses a path string or PathArray, then iterates the result for:\n * * converting segments to absolute values\n * * converting shorthand commands to their non-shorthand notation\n *\n * @param pathInput - The path string or PathArray\n * @returns The normalized PathArray\n *\n * @example\n * ```ts\n * normalizePath('M10 90s20 -80 40 -80s20 80 40 80')\n * // => [['M', 10, 90], ['C', 30, 90, 25, 10, 50, 10], ['C', 75, 10, 70, 90, 90, 90]]\n * ```\n */\nexport const normalizePath = (pathInput: string | PathArray): NormalArray => {\n const path = parsePathString(pathInput);\n const params = { ...paramsParser };\n\n return iterate(path, (seg, _, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const result = normalizeSegment(seg, params);\n\n const seglen = result.length;\n params.x1 = +result[seglen - 2];\n params.y1 = +result[seglen - 1];\n params.x2 = +result[seglen - 4] || params.x1;\n params.y2 = +result[seglen - 3] || params.y1;\n\n return result;\n }) as NormalArray;\n};\n","import DISTANCE_EPSILON from \"./distanceEpsilon\";\nimport type { MSegment, PathArray, PointTuple } from \"../types\";\nimport { iterate } from \"../process/iterate\";\nimport { getLineLength, getPointAtLineLength } from \"../math/lineTools\";\nimport { getArcLength, getPointAtArcLength } from \"../math/arcTools\";\nimport { getCubicLength, getPointAtCubicLength } from \"../math/cubicTools\";\nimport { getPointAtQuadLength, getQuadLength } from \"../math/quadTools\";\nimport { normalizePath } from \"../process/normalizePath\";\n\n/**\n * Returns [x,y] coordinates of a point at a given length along a path.\n *\n * @param pathInput - The PathArray or path string to look into\n * @param distance - The distance along the path\n * @returns The requested {x, y} point coordinates\n *\n * @example\n * ```ts\n * getPointAtLength('M0 0L100 0L100 100Z', 50)\n * // => { x: 50, y: 0 }\n * ```\n */\nexport const getPointAtLength = <T extends PathArray>(\n pathInput: string | T,\n distance?: number,\n) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let x = 0;\n let y = 0;\n let [mx, my] = path[0].slice(1) as PointTuple;\n const distanceIsNumber = typeof distance === \"number\";\n let point = { x: mx, y: my };\n let length = 0;\n let POINT = point;\n let totalLength = 0;\n\n if (!distanceIsNumber || distance < DISTANCE_EPSILON) return point;\n\n iterate(path, (seg, _, lastX, lastY) => {\n const pathCommand = seg[0];\n isM = pathCommand === \"M\";\n data = !isM ? [lastX, lastY].concat(seg.slice(1) as number[]) : data;\n\n // this segment is always ZERO\n /* istanbul ignore else @preserve */\n if (isM) {\n // remember mx, my for Z\n [, mx, my] = seg as MSegment;\n point = { x: mx, y: my };\n length = 0;\n } else if (pathCommand === \"L\") {\n point = getPointAtLineLength(\n data[0],\n data[1],\n data[2],\n data[3],\n distance - totalLength,\n );\n length = getLineLength(data[0], data[1], data[2], data[3]);\n } else if (pathCommand === \"A\") {\n point = getPointAtArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n distance - totalLength,\n );\n length = getArcLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n data[8],\n );\n } else if (pathCommand === \"C\") {\n point = getPointAtCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n distance - totalLength,\n );\n length = getCubicLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n data[6],\n data[7],\n );\n } else if (pathCommand === \"Q\") {\n point = getPointAtQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n distance - totalLength,\n );\n length = getQuadLength(\n data[0],\n data[1],\n data[2],\n data[3],\n data[4],\n data[5],\n );\n } else if (pathCommand === \"Z\") {\n data = [lastX, lastY, mx, my];\n point = { x: mx, y: my };\n\n length = getLineLength(data[0], data[1], data[2], data[3]);\n }\n\n [x, y] = data.slice(-2);\n\n if (totalLength < distance) {\n POINT = point;\n } else {\n // totalLength >= distance\n // stop right here\n // stop iterator now!\n return false;\n }\n\n totalLength += length;\n return;\n });\n\n // native `getPointAtLength` behavior when the given distance\n // is higher than total length\n if (distance > totalLength - DISTANCE_EPSILON) {\n return { x, y };\n }\n\n return POINT;\n};\n","import type { PathArray, PathSegment } from \"../types\";\nimport type { SegmentProperties } from \"../interface\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { getTotalLength } from \"./getTotalLength\";\n\n/**\n * Returns the segment, its index and length as well as\n * the length to that segment at a given length in a path.\n *\n * @param pathInput target `pathArray`\n * @param distance the given length\n * @returns the requested properties\n */\nexport const getPropertiesAtLength = <T extends PathArray>(\n pathInput: string | T,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as T;\n let pathLength = getTotalLength(pathTemp);\n let index = pathTemp.length - 1;\n let lengthAtSegment = 0;\n let length = 0;\n let segment = pathArray[0] as PathSegment;\n\n // If the path is empty, return 0.\n if (index <= 0 || !distance || !Number.isFinite(distance)) {\n return {\n segment,\n index: 0,\n length,\n lengthAtSegment,\n };\n }\n\n if (distance >= pathLength) {\n pathTemp = pathArray.slice(0, -1) as T;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n segment = pathArray[index];\n return {\n segment,\n index,\n length,\n lengthAtSegment,\n };\n }\n\n const segments = [] as SegmentProperties[];\n while (index > 0) {\n segment = pathTemp[index];\n pathTemp = pathTemp.slice(0, -1) as T;\n lengthAtSegment = getTotalLength(pathTemp);\n length = pathLength - lengthAtSegment;\n pathLength = lengthAtSegment;\n\n segments.push({\n segment,\n index,\n length,\n lengthAtSegment,\n });\n index -= 1;\n }\n\n return segments.find(\n ({ lengthAtSegment: l }) => l <= distance,\n ) as SegmentProperties;\n};\n","import type { PathArray, Point } from \"../types\";\nimport type { PointProperties } from \"../interface\";\nimport { getPointAtLength } from \"./getPointAtLength\";\nimport { getPropertiesAtLength } from \"./getPropertiesAtLength\";\nimport { getTotalLength } from \"./getTotalLength\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { normalizePath } from \"../process/normalizePath\";\n\n/**\n * Returns the point and segment in path closest to a given point as well as\n * the distance to the path stroke.\n *\n * @see https://bl.ocks.org/mbostock/8027637\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the requested properties\n */\nexport const getPropertiesAtPoint = <T extends PathArray>(\n pathInput: string | T,\n point: Point,\n): PointProperties => {\n const path = parsePathString(pathInput);\n const normalPath = normalizePath(path);\n const pathLength = getTotalLength(normalPath);\n const distanceTo = (p: Point) => {\n const dx = p.x - point.x;\n const dy = p.y - point.y;\n return dx * dx + dy * dy;\n };\n let precision = 8;\n let scan: Point;\n let closest = { x: 0, y: 0 }; // make TS happy\n let scanDistance = 0;\n let bestLength = 0;\n let bestDistance = Infinity;\n\n // linear scan for coarse approximation\n for (let scanLength = 0; scanLength <= pathLength; scanLength += precision) {\n scan = getPointAtLength(normalPath, scanLength);\n scanDistance = distanceTo(scan);\n\n if (scanDistance < bestDistance) {\n closest = scan;\n bestLength = scanLength;\n bestDistance = scanDistance;\n }\n }\n\n // binary search for precise estimate\n precision /= 2;\n let before: { x: number; y: number };\n let after: { x: number; y: number };\n let beforeLength = 0;\n let afterLength = 0;\n let beforeDistance = 0;\n let afterDistance = 0;\n\n while (precision > 0.000001) {\n beforeLength = bestLength - precision;\n before = getPointAtLength(normalPath, beforeLength);\n beforeDistance = distanceTo(before);\n afterLength = bestLength + precision;\n after = getPointAtLength(normalPath, afterLength);\n afterDistance = distanceTo(after);\n\n if (beforeLength >= 0 && beforeDistance < bestDistance) {\n closest = before;\n bestLength = beforeLength;\n bestDistance = beforeDistance;\n } else if (afterLength <= pathLength && afterDistance < bestDistance) {\n closest = after;\n bestLength = afterLength;\n bestDistance = afterDistance;\n } else {\n precision /= 2;\n }\n if (precision < 0.00001) break;\n }\n\n const segment = getPropertiesAtLength(path, bestLength);\n const distance = Math.sqrt(bestDistance);\n\n return { closest, distance, segment };\n};\n","import type { PathArray } from \"../types\";\nimport { getPropertiesAtPoint } from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the point in path closest to a given point.\n *\n * @param pathInput target `pathArray`\n * @param point the given point\n * @returns the best match\n */\nexport const getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n","import { pathToCurve } from \"../convert/pathToCurve\";\nimport type { PathArray, PointTuple } from \"../types\";\n\n/**\n * Returns the area of a single cubic-bezier segment.\n *\n * http://objectmix.com/graphics/133553-area-closed-bezier-curve.html\n *\n * @param x1 the starting point X\n * @param y1 the starting point Y\n * @param c1x the first control point X\n * @param c1y the first control point Y\n * @param c2x the second control point X\n * @param c2y the second control point Y\n * @param x2 the ending point X\n * @param y2 the ending point Y\n * @returns the area of the cubic-bezier segment\n */\nconst getCubicSegArea = (\n x1: number,\n y1: number,\n c1x: number,\n c1y: number,\n c2x: number,\n c2y: number,\n x2: number,\n y2: number,\n) => {\n return (\n (3 *\n ((y2 - y1) * (c1x + c2x) -\n (x2 - x1) * (c1y + c2y) +\n c1y * (x1 - c2x) -\n c1x * (y1 - c2y) +\n y2 * (c2x + x1 / 3) -\n x2 * (c2y + y1 / 3))) /\n 20\n );\n};\n\n/**\n * Returns the signed area of a shape.\n *\n * @author Jürg Lehni & Jonathan Puckey\n *\n * @see https://github.com/paperjs/paper.js/blob/develop/src/path/Path.js\n *\n * @param path - The shape PathArray\n * @returns The signed area of the shape (positive for clockwise, negative for counter-clockwise)\n *\n * @example\n * ```ts\n * getPathArea([['M', 0, 0], ['L', 100, 0], ['L', 100, 100], ['L', 0, 100], ['Z']])\n * // => -10000 (counter-clockwise square)\n * ```\n */\nexport const getPathArea = <T extends PathArray>(path: T) => {\n let x = 0;\n let y = 0;\n let len = 0;\n\n return pathToCurve(path)\n .map((seg) => {\n switch (seg[0]) {\n case \"M\":\n [, x, y] = seg;\n return 0;\n default:\n len = getCubicSegArea(\n x,\n y,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n );\n [x, y] = seg.slice(-2) as PointTuple;\n return len;\n }\n })\n .reduce((a, b) => a + b, 0);\n};\n","import { getPathArea } from \"./getPathArea\";\nimport { pathToCurve } from \"../convert/pathToCurve\";\nimport type { PathArray } from \"../types\";\n\n/**\n * Check if a path is drawn clockwise and returns true if so,\n * false otherwise.\n *\n * @param path the path string or `pathArray`\n * @returns true when clockwise or false if not\n */\nexport const getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n","import type { PathArray, PathSegment } from \"../types\";\nimport { getPropertiesAtLength } from \"./getPropertiesAtLength\";\n\n/**\n * Returns the segment at a given length.\n *\n * @param pathInput the target `pathArray`\n * @param distance the distance in path to look at\n * @returns the requested segment\n */\nexport const getSegmentAtLength = <T extends PathArray>(\n pathInput: string | T,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n","import type { SegmentProperties } from \"../interface\";\nimport type { PathArray } from \"../types\";\nimport { getPropertiesAtPoint } from \"./getPropertiesAtPoint\";\n\n/**\n * Returns the path segment which contains a given point.\n *\n * @param path the `pathArray` to look into\n * @param point the point of the shape to look for\n * @returns the requested segment\n */\nexport const getSegmentOfPoint = <T extends PathArray>(\n path: string | T,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport { paramsCounts } from \"../parser/paramsCount\";\n\n/**\n * Iterates an array to check if it's an actual `pathArray`.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nexport const isPathArray = (path: unknown): path is PathArray => {\n return (\n Array.isArray(path) &&\n path.every((seg: PathSegment) => {\n const lk = seg[0].toLowerCase() as RelativeCommand;\n return (\n paramsCounts[lk] === seg.length - 1 &&\n \"achlmqstvz\".includes(lk) &&\n (seg.slice(1) as unknown[]).every(Number.isFinite)\n );\n }) &&\n path.length > 0\n );\n};\n","import type { AbsoluteArray } from \"../types\";\nimport { isPathArray } from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all absolute values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nexport const isAbsoluteArray = (path: unknown): path is AbsoluteArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` also checks if it's `Array`\n path.every(([x]) => x === x.toUpperCase())\n );\n};\n","import type { NormalArray } from \"../types\";\nimport { isAbsoluteArray } from \"./isAbsoluteArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all segments in non-shorthand notation\n * with absolute values.\n *\n * @param path - the array to be checked\n * @returns true if the array is a normalized path array\n */\nexport const isNormalizedArray = (path: unknown): path is NormalArray => {\n // `isAbsoluteArray` also checks if it's `Array`\n return isAbsoluteArray(path) && path.every(([pc]) => \"ACLMQZ\".includes(pc));\n};\n","import { isNormalizedArray } from \"./isNormalizedArray\";\nimport { PathArray, PolygonArray } from \"../types\";\n/**\n * Checks if a path is a polygon (only M, L, H, V, Z commands).\n * @param pathArray PathArray (pre-normalize if needed)\n * @returns boolean\n */\nexport const isPolygonArray = (path: PathArray): path is PolygonArray => {\n return isNormalizedArray(path) && path.every(([pc]) => \"MLVHZ\".includes(pc));\n};\n","import { CurveArray } from \"../types\";\nimport { isNormalizedArray } from \"./isNormalizedArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with all C (cubic bezier) segments.\n *\n * @param path the `Array` to be checked\n * @returns iteration result\n */\nexport const isCurveArray = (path: unknown): path is CurveArray => {\n // `isPathArray` also checks if it's `Array`\n return isNormalizedArray(path) && path.every(([pc]) => \"MC\".includes(pc));\n};\n","import type { PathArray } from \"../types\";\nimport { getPropertiesAtPoint } from \"./getPropertiesAtPoint\";\nimport DISTANCE_EPSILON from \"./distanceEpsilon\";\n\n/**\n * Checks if a given point is in the stroke of a path.\n *\n * @param pathInput target path\n * @param point the given `{x,y}` point\n * @returns the query result\n */\nexport const isPointInStroke = <T extends PathArray>(\n pathInput: string | T,\n point: { x: number; y: number },\n) => {\n const { distance } = getPropertiesAtPoint(pathInput, point);\n return Math.abs(distance) < DISTANCE_EPSILON; // 0.01 might be more permissive\n};\n","import type { RelativeArray } from \"../types\";\nimport { isPathArray } from \"./isPathArray\";\n\n/**\n * Iterates an array to check if it's a `pathArray`\n * with relative values.\n *\n * @param path the `pathArray` to be checked\n * @returns iteration result\n */\nexport const isRelativeArray = (path: unknown): path is RelativeArray => {\n return (\n isPathArray(path) &&\n // `isPathArray` checks if it's `Array`\n path.slice(1).every(([pc]) => pc === pc.toLowerCase())\n );\n};\n","import { scanSegment } from \"../parser/scanSegment\";\nimport { skipSpaces } from \"../parser/skipSpaces\";\nimport { PathParser } from \"../parser/pathParser\";\n\n/**\n * Parses a path string value to determine its validity\n * then returns true if it's valid or false otherwise.\n *\n * @param pathString the path string to be parsed\n * @returns the path string validity\n */\nexport const isValidPath = (pathString: string) => {\n if (typeof pathString !== \"string\" || !pathString.length) {\n return false;\n }\n\n const path = new PathParser(pathString);\n\n skipSpaces(path);\n\n while (path.index < path.max && !path.err.length) {\n scanSegment(path);\n }\n\n return !path.err.length && \"mM\".includes(path.segments[0][0]);\n};\n","// src/morph/samplePolygon.ts\n\nimport { error } from \"../util/error\";\nimport { iterate } from \"../process/iterate\";\nimport type { NormalArray, PointTuple } from \"../types\";\n\n/**\n * Samples points from a path to form a polygon approximation.\n * Collects endpoints of each segment (M start + ends of L/C/etc).\n *\n * If `sampleSize` parameter is provided, it will return a polygon\n * equivalent to the original `PathArray`.\n * @param path `PolygonPathArray` or `CurvePathArray`\n * @returns Array of [x, y] points\n */\nexport function samplePolygon<T extends NormalArray>(\n path: T,\n): PointTuple[] {\n const points: PointTuple[] = [];\n\n let [mx, my] = [0, 0];\n\n iterate(path, (seg) => {\n const cmd = seg[0];\n if (cmd === \"M\") {\n [mx, my] = [seg[1] as number, seg[2] as number];\n points.push([mx, my]);\n } else if (cmd === \"L\") {\n points.push([seg[1] as number, seg[2] as number]);\n } else if (cmd === \"C\") {\n points.push([seg[5] as number, seg[6] as number]);\n } else if (cmd === \"A\") {\n points.push([seg[6] as number, seg[7] as number]);\n } else if (cmd === \"Z\") {\n points.push([mx, my]);\n } else {\n throw new TypeError(`${error}: path command \"${cmd}\" is not supported`);\n }\n });\n\n return points;\n}\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nexport const shapeParams: ShapeParams = {\n line: [\"x1\", \"y1\", \"x2\", \"y2\"],\n circle: [\"cx\", \"cy\", \"r\"],\n ellipse: [\"cx\", \"cy\", \"rx\", \"ry\"],\n rect: [\"width\", \"height\", \"x\", \"y\", \"rx\", \"ry\"],\n polygon: [\"points\"],\n polyline: [\"points\"],\n glyph: [\"d\"],\n};\n","/**\n * Checks if a value is a DOM Element.\n *\n * @param node - The value to check\n * @returns True if the value is a DOM Element (nodeType === 1)\n */\nexport const isElement = (node?: unknown): node is Element =>\n node !== undefined && node !== null &&\n typeof node === \"object\" &&\n (node as Node).nodeType === 1; // ELEMENT_NODE\n","import type {\n CircleAttr,\n EllipseAttr,\n GlyphAttr,\n LineAttr,\n PolyAttr,\n RectAttr,\n ShapeParams,\n} from \"../interface\";\nimport type { PathArray, PathSegment, ShapeOps, ShapeTypes } from \"../types\";\nimport { error } from \"./error\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { shapeParams } from \"./shapeParams\";\nimport { isPathArray } from \"./isPathArray\";\nimport { isElement } from \"./isElement\";\n\n/**\n * Returns a new PathArray from line attributes.\n *\n * @param attr - Shape configuration with x1, y1, x2, y2\n * @returns A new line PathArray\n *\n * @example\n * ```ts\n * getLinePath({ x1: 0, y1: 0, x2: 100, y2: 100 })\n * // => [['M', 0, 0], ['L', 100, 100]]\n * ```\n */\nexport const getLinePath = (attr: LineAttr): PathArray => {\n let { x1, y1, x2, y2 } = attr;\n [x1, y1, x2, y2] = [x1, y1, x2, y2].map((a) => +a);\n return [\n [\"M\", x1, y1],\n [\"L\", x2, y2],\n ];\n};\n\n/**\n * Returns a new PathArray from polyline/polygon attributes.\n *\n * @param attr - Shape configuration with points string\n * @returns A new polygon/polyline PathArray\n *\n * @example\n * ```ts\n * getPolyPath({ type: 'polygon', points: '0,0 100,0 100,100 0,100' })\n * // => [['M', 0, 0], ['L', 100, 0], ['L', 100, 100], ['L', 0, 100], ['z']]\n * ```\n */\nexport const getPolyPath = (attr: PolyAttr): PathArray => {\n const pathArray = [] as PathSegment[];\n const points = (attr.points || \"\")\n .trim()\n .split(/[\\s|,]/)\n .map((a) => +a);\n\n let index = 0;\n while (index < points.length) {\n pathArray.push([index ? \"L\" : \"M\", points[index], points[index + 1]]);\n index += 2;\n }\n\n return (\n attr.type === \"polygon\" ? [...pathArray, [\"z\"]] : pathArray\n ) as PathArray;\n};\n\n/**\n * Returns a new PathArray from circle attributes.\n *\n * @param attr - Shape configuration with cx, cy, r\n * @returns A circle PathArray\n *\n * @example\n * ```ts\n * getCirclePath({ cx: 50, cy: 50, r: 25 })\n * // => [['M', 25, 50], ['a', 25, 25, 0, 1, 0, 50, 0], ['a', 25, 25, 0, 1, 0, -50, 0]]\n * ```\n */\nexport const getCirclePath = (attr: CircleAttr): PathArray => {\n let { cx, cy, r } = attr;\n [cx, cy, r] = [cx, cy, r].map((a) => +a);\n\n return [\n [\"M\", cx - r, cy],\n [\"a\", r, r, 0, 1, 0, 2 * r, 0],\n [\"a\", r, r, 0, 1, 0, -2 * r, 0],\n ];\n};\n\n/**\n * Returns a new PathArray from ellipse attributes.\n *\n * @param attr - Shape configuration with cx, cy, rx, ry\n * @returns An ellipse PathArray\n *\n * @example\n * ```ts\n * getEllipsePath({ cx: 50, cy: 50, rx: 30, ry: 20 })\n * // => [['M', 20, 50], ['a', 30, 20, 0, 1, 0, 60, 0], ['a', 30, 20, 0, 1, 0, -60, 0]]\n * ```\n */\nexport const getEllipsePath = (attr: EllipseAttr): PathArray => {\n let { cx, cy } = attr;\n let rx = attr.rx || 0;\n let ry = attr.ry || rx;\n [cx, cy, rx, ry] = [cx, cy, rx, ry].map((a) => +a);\n\n return [\n [\"M\", cx - rx, cy],\n [\"a\", rx, ry, 0, 1, 0, 2 * rx, 0],\n [\"a\", rx, ry, 0, 1, 0, -2 * rx, 0],\n ];\n};\n\n/**\n * Returns a new PathArray from rect attributes.\n *\n * @param attr - Object with x, y, width, height, and optional rx/ry\n * @returns A new PathArray from `<rect>` attributes\n *\n * @example\n * ```ts\n * getRectanglePath({ x: 0, y: 0, width: 100, height: 50, ry: 10 })\n * // => [['M', 10, 0], ['h', 80], ['a', 10, 10, 0, 0, 1, 10, 10], ...]\n * ```\n */\nexport const getRectanglePath = (attr: RectAttr): PathArray => {\n const x = +attr.x || 0;\n const y = +attr.y || 0;\n const w = +attr.width;\n const h = +attr.height;\n let rx = +(attr.rx || 0);\n let ry = +(attr.ry || rx);\n\n // Validity checks from http://www.w3.org/TR/SVG/shapes.html#RectElement:\n if (rx || ry) {\n // rx = !rx ? ry : rx;\n // ry = !ry ? rx : ry;\n\n /* istanbul ignore else @preserve */\n if (rx * 2 > w) rx -= (rx * 2 - w) / 2;\n /* istanbul ignore else @preserve */\n if (ry * 2 > h) ry -= (ry * 2 - h) / 2;\n\n return [\n [\"M\", x + rx, y],\n [\"h\", w - rx * 2],\n [\"s\", rx, 0, rx, ry],\n [\"v\", h - ry * 2],\n [\"s\", 0, ry, -rx, ry],\n [\"h\", -w + rx * 2],\n [\"s\", -rx, 0, -rx, -ry],\n [\"v\", -h + ry * 2],\n [\"s\", 0, -ry, rx, -ry],\n ];\n }\n\n return [[\"M\", x, y], [\"h\", w], [\"v\", h], [\"H\", x], [\"Z\"]];\n};\n\n/**\n * Returns a new `pathArray` created from attributes of a `<line>`, `<polyline>`,\n * `<polygon>`, `<rect>`, `<ellipse>`, `<circle>`, <path> or `<glyph>`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @returns the newly created `<path>` element\n */\nexport const shapeToPathArray = (element: ShapeTypes | ShapeOps) => {\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName && [...supportedShapes, \"path\"].every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const type = (\n targetIsElement ? tagName : (element as ShapeOps).type\n ) as ShapeOps[\"type\"];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record<string, string>;\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n } else {\n Object.assign(config, element);\n }\n\n // set d\n let pathArray = [] as unknown as PathArray;\n\n /* istanbul ignore else */\n if (type === \"circle\") {\n pathArray = getCirclePath(config as unknown as CircleAttr);\n } else if (type === \"ellipse\") {\n pathArray = getEllipsePath(config as unknown as EllipseAttr);\n } else if ([\"polyline\", \"polygon\"].includes(type)) {\n pathArray = getPolyPath(config as unknown as PolyAttr);\n } else if (type === \"rect\") {\n pathArray = getRectanglePath(config as unknown as RectAttr);\n } else if (type === \"line\") {\n pathArray = getLinePath(config as unknown as LineAttr);\n } else if ([\"glyph\", \"path\"].includes(type)) {\n pathArray = parsePathString(\n targetIsElement\n ? element.getAttribute(\"d\") || /* istanbul ignore next @preserve */ \"\"\n : (element as GlyphAttr).d || \"\",\n );\n }\n\n // replace target element\n if (isPathArray(pathArray) && pathArray.length) {\n return pathArray;\n }\n return false;\n};\n","import type { ShapeParams } from \"../interface\";\nimport type { ShapeOps, ShapeTypes } from \"../types\";\nimport { pathToString } from \"../convert/pathToString\";\nimport { defaultOptions } from \"../options/options\";\nimport { error } from \"./error\";\nimport { isValidPath } from \"./isValidPath\";\nimport { isElement } from \"./isElement\";\nimport { shapeToPathArray } from \"./shapeToPathArray\";\nimport { shapeParams } from \"./shapeParams\";\n\n/**\n * Returns a new `<path>` element created from attributes of a `<line>`, `<polyline>`,\n * `<polygon>`, `<rect>`, `<ellipse>`, `<circle>` or `<glyph>`. If `replace` parameter\n * is `true`, it will replace the target. The default `ownerDocument` is your current\n * `document` browser page, if you want to use in server-side using `jsdom`, you can\n * pass the `jsdom` `document` to `ownDocument`.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * The newly created `<path>` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element - Target shape element or shape options object\n * @param replace - Option to replace target element\n * @param ownerDocument - Document for creating the element\n * @returns The newly created `<path>` element, or false if the path is invalid\n *\n * @example\n * ```ts\n * const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle')\n * circle.setAttribute('cx', '50')\n * circle.setAttribute('cy', '50')\n * circle.setAttribute('r', '25')\n * const path = shapeToPath(circle)\n * path.getAttribute('d')\n * // => 'M50 25A25 25 0 1 1 50 75A25 25 0 1 1 50 25Z'\n * ```\n */\nexport const shapeToPath = (\n element: ShapeTypes | ShapeOps,\n replace?: boolean,\n ownerDocument?: Document,\n): SVGPathElement | false => {\n const doc = ownerDocument || document;\n const supportedShapes = Object.keys(shapeParams) as (keyof ShapeParams)[];\n const targetIsElement = isElement(element);\n const tagName = targetIsElement ? element.tagName : null;\n\n if (tagName === \"path\") {\n throw TypeError(`${error}: \"${tagName}\" is already SVGPathElement`);\n }\n if (tagName && supportedShapes.every((s) => tagName !== s)) {\n throw TypeError(`${error}: \"${tagName}\" is not SVGElement`);\n }\n\n const path = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n const type =\n (targetIsElement ? tagName : (element as ShapeOps).type) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record<string, string>;\n\n // set d\n const round = defaultOptions.round as number;\n const pathArray = shapeToPathArray(element);\n const description = pathArray && pathArray.length\n ? pathToString(pathArray, round)\n : \"\";\n\n if (targetIsElement) {\n shapeAttrs.forEach((p) => {\n config[p] = element.getAttribute(p) as string;\n });\n // set no-specific shape attributes: fill, stroke, etc\n for (let i = 0; i < element.attributes.length; i++) {\n const attr = element.attributes[i];\n if (attr && !shapeAttrs.includes(attr.name)) {\n path.setAttribute(attr.name, attr.value);\n }\n }\n } else {\n Object.assign(config, element);\n // set no-specific shape attributes: fill, stroke, etc\n Object.keys(config).forEach((k) => {\n if (!shapeAttrs.includes(k) && k !== \"type\") {\n path.setAttribute(\n k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`),\n config[k],\n );\n }\n });\n }\n\n // replace target element\n if (isValidPath(description)) {\n path.setAttribute(\"d\", description);\n if (replace && targetIsElement) {\n element.before(path, element);\n element.remove();\n }\n return path;\n }\n return false;\n};\n","import { type PathArray } from \"../types\";\nimport { error } from \"./error\";\nimport { isPathArray } from \"./isPathArray\";\n\n/**\n * Determines if an SVG path contains multiple subpaths.\n * Accepts path string or PathArray.\n * @param path - 'M10,10 L20,20 Z M30,30 L40,40' → true\n * @returns boolean\n */\nexport const isMultiPath = <T extends PathArray>(\n path: string | T,\n): boolean => {\n if (typeof path === \"string\") {\n // Count all 'M' and 'm' occurrences\n const matches = path.match(/[Mm]/g);\n return matches ? matches.length > 1 : false;\n }\n\n // istanbul ignore else\n if (isPathArray(path)) {\n let moveCount = 0;\n for (const segment of path) {\n if (segment[0].toUpperCase() === \"M\") {\n moveCount++;\n if (moveCount > 1) return true;\n }\n }\n return false;\n }\n\n throw new TypeError(error + \": expected string or PathArray\");\n};\n","import { isNormalizedArray } from \"./isNormalizedArray\";\nimport { PathArray, PolylineArray } from \"../types\";\n/**\n * Checks if a path is a polyline (only M, L, H, V commands).\n * @param pathArray PathArray (pre-normalize if needed)\n * @returns boolean\n */\nexport function isPolylineArray(path: PathArray): path is PolylineArray {\n return isNormalizedArray(path) && path.every(([pc]) => \"MLVH\".includes(pc));\n}\n","import { PathArray } from \"../types\";\n\n/**\n * Check if a PathArray is closed, which means its last segment is a Z.\n * @param path\n * @returns true if the path is closed\n */\nexport const isClosedPath = <T extends PathArray>(path: T) => {\n return path[path.length - 1][0].toUpperCase() === \"Z\";\n};\n","import { defaultOptions } from \"../options/options\";\nimport type { ParserParams } from \"../interface\";\nimport { roundTo } from \"../math/roundTo\";\nimport type {\n AbsoluteSegment,\n NormalSegment,\n PathCommand,\n ShortSegment,\n SSegment,\n TSegment,\n} from \"../types\";\n\n/**\n * Shorten a single segment of a `pathArray` object.\n *\n * @param segment the `absoluteSegment` object\n * @param normalSegment the `normalSegment` object\n * @param params the coordinates of the previous segment\n * @param prevCommand the path command of the previous segment\n * @returns the shortened segment\n */\nexport const shortenSegment = (\n segment: AbsoluteSegment,\n normalSegment: NormalSegment,\n params: ParserParams,\n prevCommand: PathCommand,\n): ShortSegment => {\n const [pathCommand] = segment;\n const { round: defaultRound } = defaultOptions;\n const round = typeof defaultRound === \"number\"\n ? defaultRound\n : /* istanbul ignore next */ 4;\n const normalValues = normalSegment.slice(1) as number[];\n const { x1, y1, x2, y2, x, y } = params;\n const [nx, ny] = normalValues.slice(-2);\n const result = segment;\n\n if (!\"TQ\".includes(pathCommand)) {\n // optional but good to be cautious\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"L\") {\n if (roundTo(x, round) === roundTo(nx, round)) {\n return [\"V\", ny];\n } else if (roundTo(y, round) === roundTo(ny, round)) {\n return [\"H\", nx];\n }\n } else if (pathCommand === \"C\") {\n const [nx1, ny1] = normalValues;\n params.x1 = nx1;\n params.y1 = ny1;\n\n if (\n \"CS\".includes(prevCommand) &&\n ((roundTo(nx1, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(ny1, round) === roundTo(y1 * 2 - y2, round)) ||\n (roundTo(x1, round) === roundTo(x2 * 2 - x, round) &&\n roundTo(y1, round) === roundTo(y2 * 2 - y, round)))\n ) {\n return [\n \"S\",\n normalValues[2],\n normalValues[3],\n normalValues[4],\n normalValues[5],\n ] as SSegment;\n }\n } else if (pathCommand === \"Q\") {\n const [qx, qy] = normalValues;\n params.qx = qx;\n params.qy = qy;\n\n if (\n \"QT\".includes(prevCommand) &&\n roundTo(qx, round) === roundTo(x1 * 2 - x2, round) &&\n roundTo(qy, round) === roundTo(y1 * 2 - y2, round)\n ) {\n return [\"T\", normalValues[2], normalValues[3]] as TSegment;\n }\n }\n\n // ['V', 'H', 'S', 'T', 'Z'].includes(pathCommand)\n return result as ShortSegment;\n};\n","import type { PathCommand, PathSegment } from \"../types\";\nimport { roundTo } from \"../math/roundTo\";\n\n/**\n * Rounds the numeric values of a path segment to the specified precision.\n *\n * @param segment - The path segment to round\n * @param roundOption - Number of decimal places\n * @returns The rounded segment\n */\nexport const roundSegment = <T extends PathSegment>(\n segment: T,\n roundOption: number,\n) => {\n const values = (segment.slice(1) as number[]).map((n) =>\n roundTo(n, roundOption)\n );\n return [segment[0] as PathCommand | number].concat(values) as T;\n};\n","import type {\n AbsoluteSegment,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\nimport { pathToAbsolute } from \"../convert/pathToAbsolute\";\nimport { shortenSegment } from \"./shortenSegment\";\nimport { paramsParser } from \"../parser/paramsParser\";\nimport { iterate } from \"./iterate\";\nimport { normalizeSegment } from \"./normalizeSegment\";\nimport { relativizeSegment } from \"./relativizeSegment\";\nimport { roundSegment } from \"./roundSegment\";\n\n/**\n * Optimizes a PathArray:\n * * converts segments to shorthand if possible\n * * selects shortest representation from absolute and relative forms\n *\n * @param pathInput - A path string or PathArray\n * @param roundOption - Number of decimal places for rounding\n * @returns The optimized PathArray\n *\n * @example\n * ```ts\n * optimizePath('M10 10L10 10L90 90', 2)\n * // => [['M', 10, 10], ['l', 0, 0], ['l', 80, 80]]\n * ```\n */\nexport const optimizePath = <T extends PathArray>(\n pathInput: T,\n roundOption?: number,\n): PathArray => {\n const path = pathToAbsolute(pathInput);\n // allow for ZERO decimals or use an aggressive value of 2\n const round = typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : 2;\n // this utility overrides the iterator params\n const optimParams = { ...paramsParser };\n\n const allPathCommands = [] as PathCommand[];\n let pathCommand = \"M\" as PathCommand;\n let prevCommand = \"Z\" as PathCommand;\n\n return iterate(path, (seg, i, lastX, lastY) => {\n optimParams.x = lastX;\n optimParams.y = lastY;\n const normalizedSegment = normalizeSegment(seg, optimParams);\n let result: PathSegment = seg;\n pathCommand = seg[0];\n\n // Save current path command\n allPathCommands[i] = pathCommand;\n if (i) {\n // Get previous path command for `shortenSegment`\n prevCommand = allPathCommands[i - 1];\n const shortSegment = shortenSegment(\n seg as AbsoluteSegment,\n normalizedSegment,\n optimParams,\n prevCommand,\n );\n const absSegment = roundSegment(shortSegment, round);\n const absString = absSegment.join(\"\");\n const relativeSegment = relativizeSegment(shortSegment, i, lastX, lastY);\n const relSegment = roundSegment(relativeSegment, round);\n const relString = relSegment.join(\"\");\n result = absString.length < relString.length ? absSegment : relSegment;\n }\n\n const seglen = normalizedSegment.length;\n optimParams.x1 = +normalizedSegment[seglen - 2];\n optimParams.y1 = +normalizedSegment[seglen - 1];\n optimParams.x2 = +normalizedSegment[seglen - 4] || optimParams.x1;\n optimParams.y2 = +normalizedSegment[seglen - 3] || optimParams.y1;\n\n return result;\n });\n};\n","import type {\n // ASegment,\n CSegment,\n // HSegment,\n // MSegment,\n PathArray,\n PathSegment,\n PointTuple,\n QSegment,\n SSegment,\n TSegment,\n // VSegment,\n} from \"../types\";\nimport { pathToAbsolute } from \"../convert/pathToAbsolute\";\nimport { normalizePath } from \"./normalizePath\";\nimport { iterate } from \"./iterate\";\n\n/**\n * Reverses all segments of a PathArray and returns a new PathArray\n * with absolute values.\n *\n * @param pathInput - The source PathArray\n * @returns The reversed PathArray\n *\n * @example\n * ```ts\n * reversePath([['M', 0, 0], ['L', 100, 0], ['L', 100, 100], ['L', 0, 100], ['Z']])\n * // => [['M', 0, 100], ['L', 0, 0], ['L', 100, 0], ['L', 100, 100], ['Z']]\n * ```\n */\nexport const reversePath = <T extends PathArray>(pathInput: T) => {\n const absolutePath = pathToAbsolute(pathInput);\n const normalizedPath = normalizePath(absolutePath);\n const pLen = absolutePath.length;\n const isClosed = absolutePath[pLen - 1][0] === \"Z\";\n\n const reversedPath = iterate(absolutePath, (segment, i) => {\n const normalizedSegment = normalizedPath[i];\n const prevSeg = i && absolutePath[i - 1];\n const prevCommand = prevSeg && prevSeg[0];\n const nextSeg = absolutePath[i + 1];\n const nextCommand = nextSeg && nextSeg[0];\n const pathCommand = segment[0];\n const [x, y] = normalizedPath[i ? i - 1 : pLen - 1].slice(-2) as PointTuple;\n let result = segment;\n\n switch (pathCommand) {\n case \"M\":\n result = isClosed ? [\"Z\"] : [pathCommand, x, y];\n break;\n case \"A\":\n result = [\n pathCommand,\n segment[1],\n segment[2],\n segment[3],\n segment[4],\n segment[5] === 1 ? 0 : 1,\n x,\n y,\n ];\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y];\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ];\n }\n break;\n case \"S\":\n if (\n prevCommand &&\n \"CS\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"S\")\n ) {\n result = [\n \"C\",\n normalizedSegment[3],\n normalizedSegment[4],\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as CSegment;\n } else {\n result = [\n pathCommand,\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as SSegment;\n }\n break;\n case \"Q\":\n if (nextSeg && nextCommand === \"T\") {\n result = [\"T\", x, y] as TSegment;\n } else {\n result = [pathCommand, segment[1], segment[2], x, y];\n }\n break;\n case \"T\":\n if (\n prevCommand &&\n \"QT\".includes(prevCommand) &&\n (!nextSeg || nextCommand !== \"T\")\n ) {\n result = [\n \"Q\",\n normalizedSegment[1],\n normalizedSegment[2],\n x,\n y,\n ] as QSegment;\n } else {\n result = [pathCommand, x, y] as TSegment;\n }\n break;\n case \"Z\":\n result = [\"M\", x, y];\n break;\n case \"H\":\n result = [pathCommand, x];\n break;\n case \"V\":\n result = [pathCommand, y];\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as typeof segment;\n }\n\n return result;\n });\n\n return (\n isClosed\n ? reversedPath.reverse()\n : [reversedPath[0] as PathSegment].concat(reversedPath.slice(1).reverse())\n ) as T;\n};\n","// import paramsParser from \"../parser/paramsParser\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n VSegment,\n} from \"../types\";\nimport { iterate } from \"./iterate\";\n\n/**\n * Split a path string or PathArray into an array of sub-paths.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput - The source path string or PathArray\n * @returns An array of sub-path PathArrays\n *\n * @example\n * ```ts\n * splitPath('M0 0L100 0ZM200 0L300 0Z')\n * // => [\n * // [['M', 0, 0], ['L', 100, 0], ['Z']],\n * // [['M', 200, 0], ['L', 300, 0], ['Z']]\n * // ]\n * ```\n */\nexport const splitPath = <T extends PathArray>(pathInput: T | string): T[] => {\n const composite: T[] = [];\n const parsedPath = parsePathString(pathInput);\n let path = [] as unknown as T;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n\n iterate(parsedPath, (seg, _, prevX, prevY) => {\n const cmd = seg[0];\n const absCommand = cmd.toUpperCase() as AbsoluteCommand;\n const isRelative = cmd === cmd.toLowerCase();\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n\n [x, y] = values as PointTuple;\n x += isRelative ? prevX : 0;\n y += isRelative ? prevY : 0;\n mx = x;\n my = y;\n path = [\n (isRelative ? [absCommand, mx, my] : seg) as MSegment,\n ] as unknown as T;\n } else {\n if (absCommand === \"Z\") {\n x = mx;\n y = my;\n } else if (absCommand === \"H\") {\n [, x] = seg as HSegment;\n x += isRelative ? prevX : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? prevY : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? prevX : 0;\n y += isRelative ? prevY : 0;\n }\n path.push(seg);\n }\n\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","import CSSMatrix from \"@thednp/dommatrix\";\n// import type { TransformObject } from '../interface';\nimport type { TransformObjectValues } from \"../types\";\n\n/**\n * Returns a transformation matrix to apply to `<path>` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nexport const getSVGMatrix = (transform: TransformObjectValues): CSSMatrix => {\n let matrix = new CSSMatrix();\n const { origin } = transform;\n const [originX, originY] = origin as [number, number, number];\n const { translate } = transform;\n const { rotate } = transform;\n const { skew } = transform;\n const { scale } = transform;\n\n // set translate\n if (\n Array.isArray(translate) &&\n translate.length >= 2 &&\n translate.every((x) => !Number.isNaN(+x)) &&\n translate.some((x) => x !== 0)\n ) {\n matrix = matrix.translate(...(translate as [number, number, number?]));\n } else if (typeof translate === \"number\" && !Number.isNaN(translate)) {\n matrix = matrix.translate(translate);\n }\n\n if (rotate || skew || scale) {\n // set SVG transform-origin, always defined\n matrix = matrix.translate(originX, originY);\n\n // set rotation\n if (\n Array.isArray(rotate) &&\n rotate.length >= 2 &&\n rotate.every((x) => !Number.isNaN(+x)) &&\n rotate.some((x) => x !== 0)\n ) {\n matrix = matrix.rotate(...(rotate as [number, number, number?]));\n } else if (typeof rotate === \"number\" && !Number.isNaN(rotate)) {\n matrix = matrix.rotate(rotate);\n }\n\n // set skew(s)\n if (\n Array.isArray(skew) && skew.length === 2 && skew.every((x) =>\n !Number.isNaN(+x)\n ) && skew.some((x) => x !== 0)\n ) {\n matrix = skew[0] ? matrix.skewX(skew[0]) : matrix;\n matrix = skew[1] ? matrix.skewY(skew[1]) : matrix;\n } else if (typeof skew === \"number\" && !Number.isNaN(skew)) {\n matrix = matrix.skewX(skew);\n }\n\n // set scale\n if (\n Array.isArray(scale) && scale.length >= 2 && scale.every((x) =>\n !Number.isNaN(+x)\n ) && scale.some((x) => x !== 1)\n ) {\n matrix = matrix.scale(...(scale as [number, number, number?]));\n } else if (typeof scale === \"number\" && !Number.isNaN(scale)) {\n matrix = matrix.scale(scale);\n }\n // set SVG transform-origin\n matrix = matrix.translate(-originX, -originY);\n }\n\n return matrix;\n};\n","import CSSMatrix from \"@thednp/dommatrix\";\nimport { type PointTuple } from \"../types\";\n\n/**\n * Transforms a specified point using a matrix, returning a new\n * Tuple *Object* comprising of the transformed point.\n * Neither the matrix nor the original point are altered.\n *\n * @copyright thednp © 2021\n *\n * @param cssm CSSMatrix instance\n * @param v Tuple\n * @returns the resulting Tuple\n */\nconst translatePoint = (\n cssm: CSSMatrix,\n v: [number, number, number, number],\n): [number, number, number, number] => {\n let m = CSSMatrix.Translate(v[0], v[1], v[2]);\n\n [, , , m.m44] = v;\n m = cssm.multiply(m);\n\n return [m.m41, m.m42, m.m43, m.m44];\n};\n\n/**\n * Returns the [x,y] projected coordinates for a given an [x,y] point\n * and an [x,y,z] perspective origin point.\n *\n * Equation found here =>\n * http://en.wikipedia.org/wiki/3D_projection#Diagram\n * Details =>\n * https://stackoverflow.com/questions/23792505/predicted-rendering-of-css-3d-transformed-pixel\n *\n * @param m the transformation matrix\n * @param point2D the initial [x,y] coordinates\n * @param origin the [x,y,z] transform origin\n * @returns the projected [x,y] coordinates\n */\nexport const projection2d = (\n m: CSSMatrix,\n point2D: PointTuple,\n origin: [number, number, number],\n): PointTuple => {\n const [originX, originY, originZ] = origin;\n const [x, y, z] = translatePoint(m, [point2D[0], point2D[1], 0, 1]);\n\n const relativePositionX = x - originX;\n const relativePositionY = y - originY;\n const relativePositionZ = z - originZ;\n\n return [\n // protect against division by ZERO\n relativePositionX * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originX,\n relativePositionY * (Math.abs(originZ) / Math.abs(relativePositionZ) || 1) +\n originY,\n ];\n};\n","import { getSVGMatrix } from \"./getSVGMatrix\";\nimport { projection2d } from \"./projection2d\";\nimport { defaultOptions } from \"../options/options\";\nimport type {\n AbsoluteArray,\n AbsoluteSegment,\n CSegment,\n LSegment,\n PathArray,\n TransformObjectValues,\n} from \"../types\";\nimport type { TransformObject } from \"../interface\";\nimport { iterate } from \"./iterate\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { absolutizeSegment } from \"./absolutizeSegment\";\nimport { arcToCubic } from \"./arcToCubic\";\n\n/**\n * Apply a 2D / 3D transformation to a PathArray.\n *\n * Since SVGElement doesn't support 3D transformation, this function\n * creates a 2D projection of the path element.\n *\n * @param pathInput - The PathArray or path string to transform\n * @param transform - The transform functions object (translate, rotate, skew, scale, origin)\n * @returns The transformed PathArray\n *\n * @example\n * ```ts\n * transformPath('M0 0L100 0L100 100L0 100Z', { translate: [10, 20], scale: 2 })\n * // => [['M', 10, 20], ['L', 210, 20], ['L', 210, 220], ['L', 10, 220], ['Z']]\n * ```\n */\nexport const transformPath = <T extends PathArray>(\n pathInput: T | string,\n transform?: Partial<TransformObject>,\n): T | AbsoluteArray => {\n // last x and y transformed values\n let x = 0;\n let y = 0;\n // new x and y transformed\n let lx = 0;\n let ly = 0;\n // segment params iteration index and length\n let j = 0;\n let jj = 0;\n // transform uses it's own set of params\n const path = parsePathString(pathInput);\n const transformProps = transform && Object.keys(transform);\n\n // when used as a static method, invalidate somehow\n if (!transform || (transformProps && !transformProps.length)) {\n return path.slice(0) as T;\n }\n\n // transform origin is extremely important\n if (!transform.origin) {\n Object.assign(transform, { origin: defaultOptions.origin });\n }\n const origin = transform.origin as [number, number, number];\n const matrixInstance = getSVGMatrix(transform as TransformObjectValues);\n\n if (matrixInstance.isIdentity) return path.slice(0) as T;\n\n return iterate(path, (seg, index, lastX, lastY) => {\n let [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase();\n const isRelative = absCommand !== pathCommand;\n const absoluteSegment = isRelative\n ? absolutizeSegment(seg, index, lastX, lastY)\n : (seg.slice(0) as AbsoluteSegment);\n\n let result = absCommand === \"A\"\n // ? segmentToCubic(absoluteSegment, transformParams)\n ? ([\"C\" as string | number].concat(\n arcToCubic(\n lastX,\n lastY,\n absoluteSegment[1] as number,\n absoluteSegment[2] as number,\n absoluteSegment[3] as number,\n absoluteSegment[4] as number,\n absoluteSegment[5] as number,\n absoluteSegment[6] as number,\n absoluteSegment[7] as number,\n ),\n ) as CSegment)\n : absCommand === \"V\"\n ? ([\"L\", lastX, absoluteSegment[1]] as LSegment)\n : absCommand === \"H\"\n ? ([\"L\", absoluteSegment[1], lastY] as LSegment)\n : absoluteSegment;\n\n // update pathCommand\n pathCommand = result[0];\n const isLongArc = pathCommand === \"C\" && result.length > 7;\n const tempSegment = (\n isLongArc ? result.slice(0, 7) : result.slice(0)\n ) as AbsoluteSegment;\n\n if (isLongArc) {\n path.splice(\n index + 1,\n 0,\n [\"C\" as typeof pathCommand | number].concat(\n result.slice(7),\n ) as CSegment,\n );\n result = tempSegment as CSegment;\n }\n\n if (pathCommand === \"L\") {\n [lx, ly] = projection2d(\n matrixInstance,\n [(result as LSegment)[1], (result as LSegment)[2]],\n origin,\n );\n\n /* istanbul ignore else @preserve */\n if (x !== lx && y !== ly) {\n result = [\"L\", lx, ly];\n } else if (y === ly) {\n result = [\"H\", lx];\n } else if (x === lx) {\n result = [\"V\", ly];\n }\n } else {\n for (j = 1, jj = result.length; j < jj; j += 2) {\n [lx, ly] = projection2d(\n matrixInstance,\n [+result[j], +result[j + 1]],\n origin,\n );\n result[j] = lx;\n result[j + 1] = ly;\n }\n }\n // now update x and y\n x = lx;\n y = ly;\n\n return result;\n }) as AbsoluteArray;\n};\n","import type { CSegment, CurveArray, MSegment, PathCommand } from \"../types\";\n\n/**\n * Reverses all segments of a `pathArray`\n * which consists of only C (cubic-bezier) path commands.\n *\n * @param path the source `pathArray`\n * @returns the reversed `pathArray`\n */\nexport const reverseCurve = (path: CurveArray) => {\n const rotatedCurve = path\n .slice(1)\n .map((x, i, curveOnly) =>\n !i\n ? path[0].slice(1).concat(x.slice(1) as number[])\n : curveOnly[i - 1].slice(-2).concat(x.slice(1))\n )\n .map((x) => x.map((_, i) => x[x.length - i - 2 * (1 - (i % 2))]))\n .reverse() as (MSegment | CSegment)[];\n\n return [[\"M\" as PathCommand | number].concat(rotatedCurve[0].slice(0, 2))]\n .concat(\n rotatedCurve.map((x) => [\"C\" as PathCommand | number].concat(x.slice(2))),\n ) as CurveArray;\n};\n","import type { PathArray } from \"../types\";\nimport { defaultOptions } from \"../options/options\";\nimport { iterate } from \"./iterate\";\nimport { roundSegment } from \"./roundSegment\";\n\n/**\n * Rounds the values of a `pathArray` instance to\n * a specified amount of decimals and returns it.\n *\n * @param path the source `pathArray`\n * @param roundOption the amount of decimals to round numbers to\n * @returns the resulted `pathArray` with rounded values\n */\nexport const roundPath = <T extends PathArray>(\n path: T,\n roundOption?: number | \"off\",\n): T => {\n let { round } = defaultOptions;\n // allow for ZERO decimals\n round = roundOption === \"off\"\n ? roundOption\n : typeof roundOption === \"number\" && roundOption >= 0\n ? roundOption\n : typeof round === \"number\" && round >= 0\n ? round\n : \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as T;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\n","// src/morph/fixPath.ts\nimport type { PathArray } from \"../types\";\nimport { parsePathString } from \"../parser/parsePathString\";\nimport { normalizePath } from \"../process/normalizePath\";\nimport { isClosedPath } from \"../util/isClosedPath\";\n\n/**\n * Checks a `PathArray` for an unnecessary `Z` segment\n * and removes it. The `PathArray` is modified in place.\n * In short, if the segment before `Z` extends to `M`,\n * the `Z` segment must be removed.\n *\n * The `pathInput` must be a single path, without\n * sub-paths. For multi-path `<path>` elements,\n * use `splitPath` first and apply this utility on each\n * sub-path separately.\n *\n * @param pathInput the `pathArray` source\n * @returns void\n */\nexport const fixPath = <T extends PathArray>(pathInput: T | string) => {\n const pathArray = parsePathString(pathInput);\n\n /* istanbul ignore else */\n if (isClosedPath(pathArray)) {\n const normalArray = normalizePath(pathArray);\n const length = pathArray.length;\n const segBeforeZ = length - 2;\n const [mx, my] = normalArray[0].slice(1);\n const [x, y] = normalArray[segBeforeZ].slice(-2);\n\n if (mx === x && my === y) {\n pathArray.splice(length - 1, 1);\n }\n }\n};\n","// src/morph/splitCubicSegment.ts\n\nimport { midPoint } from \"../math/midPoint\";\nimport { CubicCoordinates } from \"../types\";\n\n/**\n * Split a cubic Bézier into two cubics at parameter t [0–1].\n *\n * @param x1 - Start point X\n * @param y1 - Start point Y\n * @param x2 - First control point X\n * @param y2 - First control point Y\n * @param x3 - Second control point X\n * @param y3 - Second control point Y\n * @param x4 - End point X\n * @param y4 - End point Y\n * @param t - Parameter in range [0, 1] at which to split\n * @returns Array of two cubic segments, each as [x1,y1, x2,y2, x3,y3, x4,y4]\n */\nexport function splitCubicSegment(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n x4: number,\n y4: number,\n t: number,\n): [CubicCoordinates, CubicCoordinates] {\n const [px01, py01] = midPoint([x1, y1], [x2, y2], t);\n const [px12, py12] = midPoint([x2, y2], [x3, y3], t);\n const [px23, py23] = midPoint([x3, y3], [x4, y4], t);\n\n const [cx0, cy0] = midPoint([px01, py01], [px12, py12], t);\n const [cx1, cy1] = midPoint([px12, py12], [px23, py23], t);\n\n const [px, py] = midPoint([cx0, cy0], [cx1, cy1], t);\n\n return [\n [x1, y1, px01, py01, cx0, cy0, px, py], // first segment\n [px, py, cx1, cy1, px23, py23, x4, y4], // second segment\n ];\n}\n","// src/convert/pathToPolyline.ts\nimport type {\n LSegment,\n PointTuple,\n PolygonArray,\n PolylineArray,\n // PathArray,\n} from \"../types\";\nimport { normalizePath } from \"../process/normalizePath\";\nimport { isPolygonArray } from \"../util/isPolygonArray\";\nimport { isPolylineArray } from \"../util/isPolylineArray\";\nimport { isClosedPath } from \"../util/isClosedPath\";\nimport { error } from \"../util/error\";\n\n/**\n * Converts any `PolyLineArray`/`PolygonArray` path (closed or open) to an explicit polyline (M + L*).\n * If the path is closed (has Z), the Z is replaced with an explicit L back to the initial M point.\n * This allows uniform processing without special-casing Z.\n *\n * @param path string or PathArray\n * @returns PolylineArray (M + L*) — never contains Z\n */\nexport const pathToPolyline = <T extends PolygonArray | PolylineArray>(\n path: string | T,\n): PolylineArray => {\n const normal = normalizePath(path);\n if (!isPolygonArray(normal) && !isPolylineArray(normal)) {\n throw TypeError(\n `${error}: pathValue is not a polyline/polygon`,\n );\n }\n\n // If not closed, return as-is (already a polyline)\n if (!isClosedPath(normal)) {\n return normal as PolylineArray;\n }\n\n // Closed → replace Z with explicit L to initial M\n const result: PolylineArray = [normal[0]]; // Keep M\n const [mx, my] = normal[0].slice(1) as PointTuple;\n\n for (let i = 1; i < normal.length; i++) {\n const seg = normal[i];\n if (seg[0].toUpperCase() === \"Z\") {\n result.push([\"L\", mx, my]);\n } else {\n result.push(seg as LSegment);\n }\n }\n\n return result;\n};\n","// src/morph/splitLineToCount.ts\n\n/**\n * Split a line segment into `count` smaller segments of equal length\n * using the same repeated front-cutting strategy as splitCubicToCount.\n *\n * Does NOT mutate input.\n *\n * @param x1 - Start point X\n * @param y1 - Start point Y\n * @param x2 - End point X\n * @param y2 - End point Y\n * @param count - Number of segments to split into\n * @returns Array of `count` line segments, each as [x1, y1, x2, y2]\n */\nexport default function splitLineToCount(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n count: number,\n): Array<[number, number, number, number]> {\n if (count <= 1) return [[x1, y1, x2, y2]];\n\n const result: Array<[number, number, number, number]> = [];\n const dx = x2 - x1;\n const dy = y2 - y1;\n\n let currentX = x1;\n let currentY = y1;\n\n // Loop count times to produce count segments\n // We generate points at 1/count, 2/count, ..., count/count\n let i = 0;\n while (i < count) {\n const t = 1 / (count - i);\n const nextX = x1 + t * dx;\n const nextY = y1 + t * dy;\n\n result.push([currentX, currentY, nextX, nextY]);\n\n currentX = nextX;\n currentY = nextY;\n i++;\n }\n\n return result;\n}\n","// src/morph/getPathSplits.ts\n\nimport type { CSegment, CurveArray, PointTuple, PolylineArray } from \"../types\";\nimport { getLineLength } from \"../math/lineTools\";\nimport { getCubicLength } from \"../math/cubicTools\";\nimport { getTotalLength } from \"../util/getTotalLength\";\nimport { isPolylineArray } from \"../util/isPolylineArray\";\nimport { error } from \"../util/error\";\nimport { iterate } from \"../process/iterate\";\n\n/**\n * Determine the right amount of splits for each segment in a given PathArray\n * and for a target total amount of sub-segments.\n * For a triangle path \"M0,0 L600,300 L0,600 Z\" we have 3 equal lines,\n * we can easily do 4 splits per line and go to town, however, most triangles\n * are not even so we need to take side lengths into account.\n * @param path The target PathArray\n * @param target The total amount of sub-segments\n * @returns an array of numbers reprezenting the sub-segment count for each segment\n */\nexport function getPathSplits<T extends PolylineArray | CurveArray>(\n path: T,\n target: number,\n): number[] {\n if (target <= 1) throw new TypeError(`${error}: target must be >= 2`);\n\n const totalLength = getTotalLength(path);\n if (totalLength === 0) return Array(path.length).fill(1);\n\n const idealSegLen = totalLength / target; // minus M segment\n const isPoly = isPolylineArray(path);\n\n const splits: number[] = [1]; // M gets 0 splits\n const lengths: number[] = [0]; // M has 0 length\n\n // First pass: measure each segment length\n iterate(path, (seg, i, prevX, prevY) => {\n if (i > 0) {\n const [endX, endY] = seg.slice(-2) as PointTuple;\n const segLen = isPoly\n ? getLineLength(prevX, prevY, endX, endY)\n : getCubicLength(\n prevX,\n prevY,\n seg[1],\n seg[2],\n (seg as CSegment)[3],\n (seg as CSegment)[4],\n (seg as CSegment)[5],\n (seg as CSegment)[6],\n );\n lengths.push(segLen);\n splits.push(1); // placeholder\n }\n });\n\n // Second pass: distribute splits proportionally\n let totalAllocated = 1; // 1 stands for first M segment\n\n for (let i = 1; i < lengths.length; i++) {\n const segLen = lengths[i];\n const desired = segLen > idealSegLen ? Math.round(segLen / idealSegLen) : 1;\n\n splits[i] = desired;\n totalAllocated += desired;\n }\n\n // Third pass: adjust to hit exact target\n let diff = target - totalAllocated;\n\n if (diff !== 0) {\n const candidates: PointTuple[] = [];\n for (let i = 1; i < lengths.length; i++) {\n // istanbul ignore else\n if (lengths[i] > 0) {\n candidates.push([i, lengths[i]]);\n }\n }\n\n const cLen = candidates.length;\n\n // istanbul ignore else - impossible to test that edge case\n if (diff < 0) {\n // sort ascending\n candidates.sort((a, b) => a[1] - b[1]);\n for (let i = 0; i < cLen; i++) {\n const idx = candidates[i][0];\n if (splits[idx] > 1 && candidates[i][1] > 0) {\n splits[idx]--;\n diff++;\n }\n if (diff === 0) break;\n else if (i === cLen - 1) i = 0;\n }\n } else if (diff > 0) {\n // sort descending\n candidates.sort((a, b) => b[1] - a[1]);\n for (let i = 0; i < cLen; i++) {\n const idx = candidates[i][0];\n if (candidates[i][1] > 0) {\n splits[idx]++;\n diff--;\n }\n if (diff === 0) break;\n else if (i === cLen - 1) i = 0;\n }\n }\n }\n return splits;\n}\n","// src/morph/splitLinePathToCount.ts\n\nimport type { PointTuple, PolylineArray } from \"../types\";\nimport splitLineToCount from \"./splitLineToCount\";\nimport { getPathSplits } from \"./getPathSplits\";\nimport { error } from \"../util/error\";\n\n/**\n * Splits a PolylineArray so that it has exactly `target` line segments.\n *\n * @param path - The polyline array to split\n * @param target - The desired number of line segments\n * @returns The modified polyline array with the target segment count\n */\nexport function splitLinePathToCount<T extends PolylineArray>(\n path: T,\n target: number,\n): T {\n if (path.length < 2 || target <= 1) return path;\n\n const splits = getPathSplits(path, target);\n let totalAdded = 0;\n\n const newPath = [path[0]] as unknown as T;\n const pathLen = path.length;\n let currentX = path[0][1];\n let currentY = path[0][2];\n\n // Build path using splits\n for (let i = 1; i < pathLen; i++) {\n const seg = path[i];\n const [endX, endY] = seg.slice(1) as PointTuple;\n\n const count = splits[i];\n\n // istanbul ignore else\n if (count >= 1) {\n const subLines = splitLineToCount(currentX, currentY, endX, endY, count);\n\n for (const sub of subLines) {\n newPath.push([\"L\", sub[2], sub[3]]);\n totalAdded++;\n }\n }\n\n currentX = endX;\n currentY = endY;\n }\n\n // Final safety: if somehow still wrong, log it\n // istanbul ignore if - this might possibly be impossible to test\n if (newPath.length !== target) {\n console.warn(\n `${error}: requested ${target} segments, got ${newPath.length}. Adjusted on last segment.`,\n );\n }\n\n return newPath;\n}\n","// src/morph/splitCubicToCount.ts\n\nimport { CubicCoordinates } from \"../types\";\nimport { splitCubicSegment } from \"./splitCubicSegment\";\n\n/**\n * Split a cubic Bézier into `count` segments of roughly equal parameter length.\n * Does NOT mutate input parameters.\n *\n * @param x1 - Start point X\n * @param y1 - Start point Y\n * @param x2 - First control point X\n * @param y2 - First control point Y\n * @param x3 - Second control point X\n * @param y3 - Second control point Y\n * @param x4 - End point X\n * @param y4 - End point Y\n * @param count - Number of segments to split into\n * @returns Array of `count` cubic segments, each as [x1,y1,x2,y2,x3,y3,x4,y4]\n */\nexport function splitCubicToCount(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n x4: number,\n y4: number,\n count: number,\n): Array<CubicCoordinates> {\n if (count <= 1) return [[x1, y1, x2, y2, x3, y3, x4, y4]];\n\n const result: Array<CubicCoordinates> = [];\n\n // Work on local copies to avoid mutating inputs\n let cx1 = x1;\n let cy1 = y1;\n let cx2 = x2;\n let cy2 = y2;\n let cx3 = x3;\n let cy3 = y3;\n let cx4 = x4;\n let cy4 = y4;\n\n let i = 0;\n while (i < count) {\n const t = 1 / (count - i);\n const [first, second] = splitCubicSegment(\n cx1,\n cy1,\n cx2,\n cy2,\n cx3,\n cy3,\n cx4,\n cy4,\n t,\n );\n\n result.push(first);\n\n // Update working curve to the remaining (second) part\n [cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4] = second;\n i++;\n }\n\n return result;\n}\n","// src/morph/splitCubicPathToCount.ts\nimport type { CSegment, CurveArray, PointTuple } from \"../types\";\nimport { splitCubicToCount } from \"./splitCubicToCount.ts\";\nimport { getPathSplits } from \"./getPathSplits.ts\";\nimport { error } from \"../util/error.ts\";\n\n/**\n * Splits a CurveArray so that it has exactly `target` cubic segments.\n *\n * @param path - The curve array to split\n * @param target - The desired number of cubic segments\n * @returns The modified curve array with the target segment count\n */\nexport function splitCurvePathToCount<T extends CurveArray>(\n path: T,\n target: number,\n): T {\n // istanbul ignore else\n if (path.length < 2 || target <= 1) return path;\n\n const splits = getPathSplits(path, target);\n let totalAdded = 0;\n\n const newPath = [path[0]] as unknown as T; // keep M\n const pathLen = path.length;\n let currentX = path[0][1];\n let currentY = path[0][2];\n\n for (let i = 1; i < pathLen; i++) {\n const seg = path[i] as CSegment /*| ZSegment*/;\n const [endX, endY] = seg.slice(-2) as PointTuple;\n\n const count = splits[i];\n\n // istanbul ignore else\n if (count >= 1) {\n const subs = splitCubicToCount(\n currentX,\n currentY,\n seg[1],\n seg[2],\n seg[3],\n seg[4],\n seg[5],\n seg[6],\n count,\n );\n\n for (const sub of subs) {\n newPath.push([\"C\", sub[2], sub[3], sub[4], sub[5], sub[6], sub[7]]);\n totalAdded++;\n }\n }\n currentX = endX;\n currentY = endY;\n }\n\n // Final safety: if somehow still wrong, log it\n // istanbul ignore if\n if (newPath.length !== target) {\n console.warn(\n `${error}: requested ${target} segments, got ${newPath.length}.`,\n );\n }\n\n return newPath;\n}\n","// src/morph/getRotatedPath.ts\n\nimport {\n CSegment,\n // CurveArray,\n LSegment,\n MorphPathArray,\n MSegment,\n PointTuple,\n // PolylineArray,\n ZSegment,\n} from \"../types.ts\";\nimport { error } from \"../util/error.ts\";\n\n/**\n * Returns all possible rotations of a path (line or curve) by shifting the start point.\n * Each rotation is a new PathArray starting at a different original segment.\n *\n * @param path PathArray (M + L/C + optional Z) — must be single subpath, normalized\n * @returns PathArray[] — array of all possible rotations\n */\nexport function getRotations<T extends MorphPathArray>(a: T) {\n const pathLen = a.length;\n const pointCount = pathLen - 1;\n let path: T;\n const result = [] as T[];\n\n for (let idx = 0; idx < pathLen; idx++) {\n path = [] as unknown as T;\n for (let i = 0; i < pathLen; i++) {\n let oldSegIdx = idx + i;\n let seg: LSegment | CSegment | MSegment | ZSegment;\n\n if (i === 0 || (a[oldSegIdx] && a[oldSegIdx][0] === \"M\")) {\n seg = a[oldSegIdx];\n path.push([\"M\", ...seg.slice(-2)] as MSegment);\n continue;\n }\n if (oldSegIdx >= pathLen) {\n oldSegIdx -= pointCount;\n }\n path.push(a[oldSegIdx] as never);\n }\n result.push(path);\n }\n return result;\n}\n\n/**\n * Finds the best rotation of pathA to match pathB by minimizing sum of squared distances\n * between corresponding endpoints.\n *\n * Works with both polygon (L) and curve (C) arrays.\n *\n * @param pathA PathArray to rotate (will be modified in rotation options)\n * @param pathB PathArray reference (fixed)\n * @returns PathArray — best rotation of pathA\n */\nexport function getRotatedPath<T extends MorphPathArray>(\n pathA: T,\n pathB: T,\n computedRotations?: T[],\n): T {\n const rotations = computedRotations || getRotations(pathA);\n const segCountA = pathA.length;\n const segCountB = pathB.length;\n\n if (segCountA !== segCountB) {\n throw new TypeError(\n error +\n \": paths must have the same number of segments after equalization\",\n );\n }\n\n let bestIndex = 0;\n let minDistanceSq = Infinity;\n\n for (let ri = 0; ri < rotations.length; ri++) {\n const rotation = rotations[ri];\n const rLen = rotation.length;\n let sumDistSq = 0;\n\n // Compare endpoints of each segment (skip M, use end coords of L/C)\n for (let i = 0; i < rLen; i++) {\n const segA = rotation[i];\n const segB = pathB[i];\n\n const endA = segA.slice(-2) as PointTuple;\n const endB = segB.slice(-2) as PointTuple;\n\n const dx = endA[0] - endB[0];\n const dy = endA[1] - endB[1];\n sumDistSq += dx * dx + dy * dy;\n }\n\n if (sumDistSq < minDistanceSq) {\n minDistanceSq = sumDistSq;\n bestIndex = ri;\n }\n }\n\n return rotations[bestIndex];\n}\n","// src/morph/equalizeSegments.ts\nimport type {\n CurveArray,\n EqualizationOptions,\n MorphPathArray,\n PathArray,\n PolylineArray,\n} from \"../types\";\nimport { pathToCurve } from \"../convert/pathToCurve\";\nimport { pathToPolyline } from \"./pathToPolyline\";\nimport { reversePath } from \"../process/reversePath\";\nimport { normalizePath } from \"../process/normalizePath\";\nimport { splitLinePathToCount } from \"./splitLinePathToCount\";\nimport { splitCurvePathToCount } from \"./splitCurvePathToCount\";\nimport { samplePolygon } from \"./samplePolygon\";\nimport { polygonArea } from \"../math/polygonTools\";\nimport { getRotatedPath } from \"./getRotatedPath\";\nimport { fixPath } from \"./fixPath\";\nimport { isPolygonArray } from \"../util/isPolygonArray\";\nimport { isPolylineArray } from \"../util/isPolylineArray\";\nimport { getTotalLength } from \"../util/getTotalLength\";\nimport { roundPath } from \"../process/roundPath\";\n\nconst equalizeSegmentsDefaults: EqualizationOptions = {\n mode: \"auto\", // \"line\" | \"curve\" | \"auto\"\n sampleSize: 10, // for line option\n roundValues: 4, // 4 decimals\n reverse: true,\n close: false,\n target: undefined,\n};\n\n/**\n * Equalizes two paths for morphing (single subpath only).\n *\n * @see https://minus-ze.ro/posts/morphing-arbitrary-paths-in-svg/\n * @param path1 - First path string or PathArray\n * @param path2 - Second path string or PathArray\n * @param initialCfg - Equalization options\n * @returns Tuple of two equalized MorphPathArrays\n *\n * @example\n * ```ts\n * const [eq1, eq2] = equalizeSegments('M0 0L100 0L50 100Z', 'M0 0L100 0L100 100L0 100Z')\n * // eq1.length === eq2.length\n * ```\n */\nexport const equalizeSegments = (\n path1: PathArray | string,\n path2: PathArray | string,\n initialCfg: EqualizationOptions = {},\n): [MorphPathArray, MorphPathArray] => {\n const { close, mode, reverse, roundValues, target: initialTarget } = Object\n .assign(equalizeSegmentsDefaults, initialCfg);\n let p1 = normalizePath(path1) as MorphPathArray;\n let p2 = normalizePath(path2) as MorphPathArray;\n\n // fix paths\n fixPath(p1);\n fixPath(p2);\n\n let bothPoly = (isPolygonArray(p1) || isPolylineArray(p1)) &&\n (isPolygonArray(p2) || isPolylineArray(p2));\n\n if (bothPoly && mode === \"auto\") {\n p1 = pathToPolyline(p1 as PolylineArray);\n p2 = pathToPolyline(p2 as PolylineArray);\n } else {\n bothPoly = false;\n p1 = pathToCurve(p1);\n p2 = pathToCurve(p2);\n }\n\n // Sample and check draw direction\n const area1 = polygonArea(samplePolygon(p1));\n const area2 = polygonArea(samplePolygon(p2));\n\n if (reverse !== false && (Math.sign(area1) !== Math.sign(area2))) {\n p2 = reversePath(p2);\n }\n\n // Get segment counts\n const segCount1 = p1.length;\n const segCount2 = p2.length;\n const minTarget = Math.max(segCount1, segCount2);\n let target = minTarget;\n\n if (typeof initialTarget !== \"number\") {\n const len1 = getTotalLength(p1);\n const len2 = getTotalLength(p2);\n const avgLen = (len1 + len2) / 2;\n const maxSegCount = Math.max(segCount1, segCount2);\n const avgSegLen = avgLen / maxSegCount;\n const idealSegCount = Math.max(\n minTarget,\n Math.round(avgLen / Math.max(avgSegLen, 1)),\n );\n target = Math.min(idealSegCount, Math.max(segCount1, segCount2) * 3);\n } else {\n if (initialTarget >= minTarget) target = initialTarget;\n else {\n console.warn(\n 'equalizeSegments \"target\" option: ' + initialTarget +\n \", expected >= \" + minTarget,\n );\n }\n }\n\n let equalP1: MorphPathArray = p1;\n let equalP2: MorphPathArray = p2;\n\n if (bothPoly) {\n equalP1 = splitLinePathToCount(\n p1 as PolylineArray,\n target,\n ) as MorphPathArray;\n equalP2 = splitLinePathToCount(\n p2 as PolylineArray,\n target,\n ) as MorphPathArray;\n } else {\n equalP1 = splitCurvePathToCount(p1 as CurveArray, target) as MorphPathArray;\n equalP2 = splitCurvePathToCount(p2 as CurveArray, target) as MorphPathArray;\n }\n\n // Point alignment\n equalP2 = getRotatedPath(equalP2, equalP1);\n\n if (typeof roundValues === \"number\" && roundValues !== 4) {\n equalP1 = roundPath(equalP1, roundValues);\n equalP2 = roundPath(equalP2, roundValues);\n }\n\n if (close) {\n equalP1.push([\"Z\"] as never);\n equalP2.push([\"Z\"] as never);\n }\n\n return [equalP1, equalP2];\n};\n","import type { BBoxMaxima, PointTuple } from \"../types.ts\";\n\n/**\n * Checks if a point is inside a bounding box.\n *\n * @param bbox - The bounding box as [minX, minY, maxX, maxY]\n * @param point - The point as [x, y]\n * @returns True if the point is inside or on the edge of the bounding box\n */\nexport const isPointInsideBBox = (\n bbox: BBoxMaxima,\n [x, y]: PointTuple,\n): boolean => {\n const [minX, minY, maxX, maxY] = bbox;\n return x >= minX && x <= maxX && y >= minY && y <= maxY;\n};\n","import type { BBoxMaxima } from \"../types.ts\";\n\nimport { isPointInsideBBox } from \"./isPointInsideBBox.ts\";\n\n/**\n * Checks if two bounding boxes intersect.\n *\n * @param a - First bounding box as [minX, minY, maxX, maxY]\n * @param b - Second bounding box as [minX, minY, maxX, maxY]\n * @returns True if the bounding boxes overlap\n */\nexport const boundingBoxIntersect = (a: BBoxMaxima, b: BBoxMaxima): boolean => {\n const [ax1, ay1, ax2, ay2] = a;\n const [bx1, by1, bx2, by2] = b;\n // return ax1 <= bx2 && ax2 >= bx1 && ay1 <= by2 && ay2 >= by1;\n return (\n isPointInsideBBox(b, [ax1, ay1]) ||\n isPointInsideBBox(b, [ax2, ay1]) ||\n isPointInsideBBox(b, [ax1, ay2]) ||\n isPointInsideBBox(b, [ax2, ay2]) ||\n isPointInsideBBox(a, [bx1, by1]) ||\n isPointInsideBBox(a, [bx2, by1]) ||\n isPointInsideBBox(a, [bx1, by2]) ||\n isPointInsideBBox(a, [bx2, by2]) ||\n // edge overlap without corner inside\n (ax1 < bx2 && ax1 > bx1 || bx1 < ax2 && bx1 > ax1) &&\n (ay1 < by2 && ay1 > by1 || by1 < ay2 && by1 > ay1)\n );\n};\n","import type { NormalArray } from \"../types.ts\";\n\n/**\n * Create a degenerate `PathArray` at a given coordinate\n * to serve as a pair for another `PathArray`.\n * @param param0 An [x, y] tuple for the coordinate\n * @returns A new degenerate `PathArray`\n */\nexport const createPlaceholder = (\n [atx, aty]: [number, number],\n): NormalArray => {\n // Tiny square at point\n const r = 0.001;\n return [\n [\"M\", atx, aty],\n [\"L\", atx + r, aty],\n [\"L\", atx + r, aty + r],\n [\"L\", atx, aty + r],\n [\"L\", atx, aty],\n [\"Z\"],\n ];\n};\n","import type { NormalArray, PathFeature, PointTuple } from \"../types.ts\";\nimport { isPointInsideBBox } from \"../intersect/isPointInsideBBox.ts\";\nimport { boundingBoxIntersect } from \"../intersect/boundingBoxIntersect.ts\";\nimport { createPlaceholder } from \"./createPlaceholder\";\n\ninterface CandidateScore {\n index: number;\n hasOverlap: boolean;\n boxIntersect: boolean;\n sizeDifference: number;\n centeredDistance: number;\n}\n\nfunction getBestMatch(\n target: PathFeature,\n candidates: PathFeature[],\n): PathFeature | null {\n const targetBBox = target.bbox;\n\n // Single pass: collect metrics for every candidate\n const potentialCandidates: CandidateScore[] = [];\n\n for (let i = 0; i < candidates.length; i++) {\n const { bbox, size } = candidates[i];\n\n const dx = targetBBox.cx - bbox.cx;\n const dy = targetBBox.cy - bbox.cy;\n const centeredDistance = Math.sqrt(dx * dx + dy * dy);\n\n const sizeDifference = Math.abs(target.size - size) /\n Math.max(target.size, size, 1e-6);\n\n const hasOverlap = isPointInsideBBox(\n [targetBBox.x, targetBBox.y, targetBBox.x2, targetBBox.y2],\n [bbox.cx, bbox.cy],\n ) || isPointInsideBBox(\n [bbox.x, bbox.y, bbox.x2, bbox.y2],\n [targetBBox.cx, targetBBox.cy],\n );\n\n const boxIntersect = boundingBoxIntersect(\n [targetBBox.x, targetBBox.y, targetBBox.x2, targetBBox.y2],\n [bbox.x, bbox.y, bbox.x2, bbox.y2],\n );\n\n potentialCandidates.push({\n index: i,\n hasOverlap,\n boxIntersect,\n sizeDifference,\n centeredDistance,\n });\n }\n\n // Filter phase: strict overlap — pick smallest distance\n const overlaping = potentialCandidates.filter((c) =>\n c.hasOverlap && c.boxIntersect\n );\n if (overlaping.length > 0) {\n let best = overlaping[0];\n for (let i = 1; i < overlaping.length; i++) {\n if (overlaping[i].centeredDistance < best.centeredDistance) {\n best = overlaping[i];\n }\n }\n return candidates.splice(best.index, 1)[0];\n }\n\n return null;\n}\n\n/**\n * Matches paths from two sets by proximity and size similarity.\n * Unmatched paths receive placeholder paths at their centroid.\n *\n * @param fromPaths - Source path features to match from\n * @param toPaths - Target path features to match to\n * @returns Array of paired NormalArrays [from, to]\n */\nexport function matchPaths(\n fromPaths: PathFeature[],\n toPaths: PathFeature[],\n): [NormalArray, NormalArray][] {\n const pairs: [NormalArray, NormalArray][] = [];\n\n fromPaths.sort((a, b) => b.size - a.size);\n toPaths.sort((a, b) => b.size - a.size);\n\n while (fromPaths.length > 0) {\n const from = fromPaths.shift()!;\n const bestTo = getBestMatch(from, toPaths);\n\n if (bestTo) {\n pairs.push([from.path, bestTo.path]);\n } else {\n const fromCentroid: PointTuple = [from.bbox.cx, from.bbox.cy];\n pairs.push([from.path, createPlaceholder(fromCentroid)]);\n }\n }\n\n while (toPaths.length > 0) {\n const to = toPaths.shift()!;\n const toCentroid: PointTuple = [to.bbox.cx, to.bbox.cy];\n pairs.push([createPlaceholder(toCentroid), to.path]);\n }\n\n return pairs;\n}\n","import type { NormalArray, PathFeature } from \"../types.ts\";\nimport { getPathBBox } from \"../util/getPathBBox.ts\";\nimport { polygonArea } from \"../math/polygonTools.ts\";\nimport { samplePolygon } from \"./samplePolygon.ts\";\nimport { isPolygonArray } from \"../util/isPolygonArray.ts\";\nimport { isPolylineArray } from \"../util/isPolylineArray.ts\";\n\n/**\n * Classifies paths into outer (containing) and inner (hole) paths.\n *\n * @param paths - Array of normalized path arrays to classify\n * @returns Object with `outers` (containing shapes) and `inners` (holes)\n */\nexport const classifyPaths = (\n paths: NormalArray[],\n): {\n outers: PathFeature[];\n inners: PathFeature[];\n} => {\n const outers: PathFeature[] = [];\n const inners: PathFeature[] = [];\n\n for (const path of paths) {\n const signedArea = polygonArea(samplePolygon(path));\n const bbox = getPathBBox(path);\n const feature: PathFeature = {\n isPoly: isPolygonArray(path) || isPolylineArray(path),\n size: bbox.width * bbox.height,\n path,\n signedArea,\n area: Math.abs(signedArea),\n bbox,\n };\n\n if (signedArea > 0) {\n outers.push(feature);\n } else {\n inners.push(feature);\n }\n }\n\n return { outers, inners };\n};\n","import type {\n MorphPathArray,\n PathArray,\n PathsEqualizationOptions,\n} from \"../types.ts\";\nimport { isMultiPath } from \"../util/isMultiPath\";\nimport { splitPath } from \"../process/splitPath\";\nimport { equalizeSegments } from \"./equalizeSegments\";\nimport { matchPaths } from \"./matchPaths\";\nimport { normalizePath } from \"../process/normalizePath\";\nimport { reversePath } from \"../process/reversePath\";\nimport { polygonArea } from \"../math/polygonTools\";\nimport { samplePolygon } from \"./samplePolygon\";\nimport { classifyPaths } from \"./classifyPaths.ts\";\n\nconst equalizePathsDefaults: PathsEqualizationOptions = {\n mode: \"auto\", // \"line\" | \"curve\" | \"auto\"\n roundValues: 4, // 4 decimals\n close: false,\n sampleSize: 10,\n};\n\n/**\n * Equalizes two paths for morphing (single/multi subpath).\n *\n * @see https://minus-ze.ro/posts/morphing-arbitrary-paths-in-svg/\n * @param pathInput1 - First path string or PathArray\n * @param pathInput2 - Second path string or PathArray\n * @param initialCfg - Configuration options for equalization\n * @returns Tuple of two equalized MorphPathArrays\n *\n * @example\n * ```ts\n * const [eq1, eq2] = equalizePaths('M0 0L100 0L50 100Z', 'M0 0L100 0L100 100L0 100Z')\n * // eq1.length === eq2.length — ready for morphing\n * ```\n */\nexport const equalizePaths = (\n pathInput1: string | PathArray,\n pathInput2: string | PathArray,\n initialCfg = {},\n) => {\n const cfg = Object.assign(equalizePathsDefaults, initialCfg);\n const p1 = normalizePath(pathInput1);\n const p2 = normalizePath(pathInput2);\n\n const multi1 = isMultiPath(p1);\n const multi2 = isMultiPath(p2);\n\n if (!multi1 && !multi2) {\n // Single subpath — use fast path\n return equalizeSegments(p1, p2, cfg);\n }\n\n // Global direction alignment (optional — helps with overall winding)\n const globalArea1 = polygonArea(samplePolygon(p1));\n const globalArea2 = polygonArea(samplePolygon(p2));\n\n let path1 = p1;\n let path2 = p2;\n\n // all paths must be clockwise\n if (Math.sign(globalArea1) < 0) {\n path1 = reversePath(path1);\n }\n if (Math.sign(globalArea2) < 0) {\n path2 = reversePath(path2);\n }\n\n // Multi-subpath: split and match\n const multiPath1 = splitPath(path1);\n const multiPath2 = splitPath(path2);\n\n const { outers: outers1, inners: inners1 } = classifyPaths(multiPath1);\n const { outers: outers2, inners: inners2 } = classifyPaths(multiPath2);\n\n // Match outers\n const outerPairs = matchPaths(outers1, outers2);\n\n // Match holes (simple: pair by area, ignore nesting for now)\n const innerPairs = matchPaths(inners1, inners2);\n\n // Equalize each pair\n const equalizedPairs: [MorphPathArray, MorphPathArray][] = [];\n\n for (const [from, to] of [...outerPairs, ...innerPairs]) {\n const [eqFrom, eqTo] = equalizeSegments(from, to, {\n ...cfg,\n reverse: false,\n });\n equalizedPairs.push([eqFrom, eqTo]);\n }\n\n // Reassemble into final morphable paths\n const finalFrom = equalizedPairs.map((p) => p[0]).flat() as MorphPathArray;\n const finalTo = equalizedPairs.map((p) => p[1]).flat() as MorphPathArray;\n\n return [finalFrom, finalTo] as [MorphPathArray, MorphPathArray];\n};\n","import type {\n CubicCoordinates,\n IntersectionOptions,\n IntersectionPoint,\n PointAtLength,\n} from \"../types.ts\";\nimport {\n getCubicBBox,\n getCubicLength,\n getPointAtCubicLength,\n} from \"../math/cubicTools.ts\";\nimport { distanceEpsilon } from \"../util.ts\";\nimport { roundTo } from \"../math/roundTo.ts\";\nimport { boundingBoxIntersect } from \"./boundingBoxIntersect.ts\";\n\nconst intersect = (\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n x3: number,\n y3: number,\n x4: number,\n y4: number,\n) => {\n if (\n Math.max(x1, x2) < Math.min(x3, x4) ||\n Math.min(x1, x2) > Math.max(x3, x4) ||\n Math.max(y1, y2) < Math.min(y3, y4) ||\n Math.min(y1, y2) > Math.max(y3, y4)\n ) {\n return;\n }\n const nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4),\n ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4),\n denominator = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n\n if (!denominator) {\n return;\n }\n const px = nx / denominator,\n py = ny / denominator,\n px2 = roundTo(px, 2),\n py2 = roundTo(py, 2);\n if (\n px2 < roundTo(Math.min(x1, x2), 2) ||\n px2 > roundTo(Math.max(x1, x2), 2) ||\n px2 < roundTo(Math.min(x3, x4), 2) ||\n px2 > roundTo(Math.max(x3, x4), 2) ||\n py2 < roundTo(Math.min(y1, y2), 2) ||\n py2 > roundTo(Math.max(y1, y2), 2) ||\n py2 < roundTo(Math.min(y3, y4), 2) ||\n py2 > roundTo(Math.max(y3, y4), 2)\n ) {\n return;\n }\n return { x: px, y: py };\n};\n\nexport const interHelper = (\n bez1: CubicCoordinates,\n bez2: CubicCoordinates,\n config?: IntersectionOptions,\n) => {\n const bbox1 = getCubicBBox(...bez1);\n const bbox2 = getCubicBBox(...bez2);\n const { justCount, epsilon } = Object.assign({\n justCount: true,\n epsilon: distanceEpsilon,\n }, config);\n\n if (!boundingBoxIntersect(bbox1, bbox2)) {\n return justCount ? 0 : [] as IntersectionPoint[];\n }\n const l1 = getCubicLength(...bez1),\n l2 = getCubicLength(...bez2),\n n1 = Math.max((l1 / 5) >> 0, 1),\n n2 = Math.max((l2 / 5) >> 0, 1),\n points1: PointAtLength[] = [],\n points2: PointAtLength[] = [],\n xy: Record<string, string> = {};\n // deno-lint-ignore prefer-const\n let res = justCount ? 0 : [] as IntersectionPoint[];\n for (let i = 0; i < n1 + 1; i++) {\n const p = getPointAtCubicLength(...bez1, (i / n1) * l1);\n points1.push({ x: p.x, y: p.y, t: i / n1 });\n }\n for (let i = 0; i < n2 + 1; i++) {\n const p = getPointAtCubicLength(...bez2, (i / n2) * l2);\n points2.push({ x: p.x, y: p.y, t: i / n2 });\n }\n for (let i = 0; i < n1; i++) {\n for (let j = 0; j < n2; j++) {\n const maxLimit = 1 + epsilon,\n di = points1[i],\n di1 = points1[i + 1],\n dj = points2[j],\n dj1 = points2[j + 1],\n ci = Math.abs(di1.x - di.x) < .001 ? \"y\" : \"x\",\n cj = Math.abs(dj1.x - dj.x) < .001 ? \"y\" : \"x\",\n is = intersect(di.x, di.y, di1.x, di1.y, dj.x, dj.y, dj1.x, dj1.y);\n if (is) {\n if (xy[is.x.toFixed(4)] == is.y.toFixed(4)) {\n continue;\n }\n xy[is.x.toFixed(4)] = is.y.toFixed(4);\n const t1 = di.t +\n Math.abs((is[ci] - di[ci]) / (di1[ci] - di[ci])) * (di1.t - di.t),\n t2 = dj.t +\n Math.abs((is[cj] - dj[cj]) / (dj1[cj] - dj[cj])) * (dj1.t - dj.t);\n\n // istanbul ignore else\n if (t1 >= 0 && t1 <= maxLimit && t2 >= 0 && t2 <= maxLimit) {\n if (justCount) {\n (res as number)++;\n } else {\n (res as IntersectionPoint[]).push({\n x: is.x,\n y: is.y,\n t1: Math.min(t1, 1),\n t2: Math.min(t2, 1),\n });\n }\n }\n }\n }\n }\n return res;\n};\n","import type {\n CubicCoordinates,\n IntersectionPoint,\n PathArray,\n} from \"../types.ts\";\nimport { pathToCurve } from \"../convert/pathToCurve.ts\";\nimport { interHelper } from \"./interHelper.ts\";\n\n/**\n * Finds intersection points between two paths.\n *\n * @param pathInput1 - First path string or PathArray\n * @param pathInput2 - Second path string or PathArray\n * @param justCount - If true, returns the count of intersections; if false, returns the intersection points\n * @returns The number of intersections (when justCount is true) or an array of IntersectionPoint objects\n *\n * @example\n * ```ts\n * pathsIntersection('M0 50C0 0,100 0,100 50', 'M50 0C100 0,100 100,50 100', true)\n * // => 1\n * pathsIntersection('M0 50C0 0,100 0,100 50', 'M50 0C100 0,100 100,50 100', false)\n * // => [{ x: 50, y: 25, t1: 0.5, t2: 0.5 }]\n * ```\n */\nexport const pathsIntersection = <T extends string | PathArray>(\n pathInput1: T,\n pathInput2: T,\n justCount = /* istanbul ignore next */ true,\n) => {\n const path1 = pathToCurve(pathInput1);\n const path2 = pathToCurve(pathInput2);\n let x1 = 0,\n y1 = 0,\n x2 = 0,\n y2 = 0,\n x1m = 0,\n y1m = 0,\n x2m = 0,\n y2m = 0,\n bez1: CubicCoordinates = [x1, y1, x1, y1, x1m, y1m, x1m, y1m],\n bez2: CubicCoordinates = [x2, y2, x2, y2, x2m, y2m, x2m, y2m],\n countResult = 0;\n const pointsResult: IntersectionPoint[] = [];\n const pathLen1 = path1.length;\n const pathLen2 = path2.length;\n\n for (let i = 0; i < pathLen1; i++) {\n const seg1 = path1[i];\n if (seg1[0] == \"M\") {\n x1 = seg1[1];\n y1 = seg1[2];\n x1m = x1;\n y1m = y1;\n } else {\n /* istanbul ignore else */\n if (seg1[0] == \"C\") {\n bez1 = [x1, y1, seg1[1], seg1[2], seg1[3], seg1[4], seg1[5], seg1[6]];\n x1 = bez1[6];\n y1 = bez1[7];\n } else {\n bez1 = [x1, y1, x1, y1, x1m, y1m, x1m, y1m];\n x1 = x1m;\n y1 = y1m;\n }\n for (let j = 0; j < pathLen2; j++) {\n const seg2 = path2[j];\n // istanbul ignore else\n if (seg2[0] == \"M\") {\n x2 = seg2[1];\n y2 = seg2[2];\n x2m = x2;\n y2m = y2;\n } else if (seg2[0] == \"C\") {\n bez2 = [\n x2,\n y2,\n seg2[1],\n seg2[2],\n seg2[3],\n seg2[4],\n seg2[5],\n seg2[6],\n ];\n x2 = bez2[6];\n y2 = bez2[7];\n // dead code, pathToCurve is almost always made of M/C\n // } else {\n // bez2 = [x2, y2, x2, y2, x2m, y2m, x2m, y2m];\n // x2 = x2m;\n // y2 = y2m;\n }\n const intr = interHelper(bez1, bez2, { justCount });\n if (justCount) {\n // (res as number) += intr;\n countResult += intr as number;\n } else {\n // Include additional segment properties, maybe not\n // const kk = (intr as IntersectionPoint[]).length;\n // for (let k = 0; k < kk; k++) {\n // intr[k].segment1 = i;\n // intr[k].segment2 = j;\n // intr[k].bez1 = bez1;\n // intr[k].bez2 = bez2;\n // }\n // (res as IntersectionPoint[]) = (res as IntersectionPoint[]).concat(intr);\n pointsResult.push(...intr as IntersectionPoint[]);\n }\n }\n }\n }\n return justCount ? countResult : pointsResult;\n};\n","\"use strict\";\nimport { version } from \"../package.json\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools.ts\";\nimport { bezierTools } from \"./math/bezier.ts\";\nimport { cubicTools } from \"./math/cubicTools.ts\";\nimport { lineTools } from \"./math/lineTools.ts\";\nimport { quadTools } from \"./math/quadTools.ts\";\nimport { polygonTools } from \"./math/polygonTools.ts\";\n\nimport { distanceSquareRoot } from \"./math/distanceSquareRoot.ts\";\nimport { midPoint } from \"./math/midPoint.ts\";\nimport { rotateVector } from \"./math/rotateVector.ts\";\nimport { roundTo } from \"./math/roundTo.ts\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types.ts\";\nimport type {\n Options,\n TransformEntries,\n TransformObject,\n} from \"./interface.ts\";\nimport { defaultOptions } from \"./options/options.ts\";\n\nimport { pathToAbsolute } from \"./convert/pathToAbsolute.ts\";\nimport { pathToRelative } from \"./convert/pathToRelative.ts\";\nimport { pathToCurve } from \"./convert/pathToCurve.ts\";\nimport { pathToString } from \"./convert/pathToString.ts\";\n\nimport { error } from \"./util/error.ts\";\nimport { parsePathString } from \"./parser/parsePathString.ts\";\nimport { finalizeSegment } from \"./parser/finalizeSegment.ts\";\nimport { invalidPathValue } from \"./parser/invalidPathValue.ts\";\nimport { isArcCommand } from \"./parser/isArcCommand.ts\";\nimport { isDigit } from \"./parser/isDigit.ts\";\nimport { isDigitStart } from \"./parser/isDigitStart.ts\";\nimport { isMoveCommand } from \"./parser/isMoveCommand.ts\";\nimport { isPathCommand } from \"./parser/isPathCommand.ts\";\nimport { isSpace } from \"./parser/isSpace.ts\";\nimport { paramsCounts } from \"./parser/paramsCount.ts\";\nimport { paramsParser } from \"./parser/paramsParser.ts\";\nimport { PathParser } from \"./parser/pathParser.ts\";\nimport { scanFlag } from \"./parser/scanFlag.ts\";\nimport { scanParam } from \"./parser/scanParam.ts\";\nimport { scanSegment } from \"./parser/scanSegment.ts\";\nimport { skipSpaces } from \"./parser/skipSpaces.ts\";\nimport { getPathBBox } from \"./util/getPathBBox.ts\";\nimport { getTotalLength } from \"./util/getTotalLength.ts\";\nimport { getClosestPoint } from \"./util/getClosestPoint.ts\";\nimport { getDrawDirection } from \"./util/getDrawDirection.ts\";\nimport { getPathArea } from \"./util/getPathArea.ts\";\nimport { getPointAtLength } from \"./util/getPointAtLength.ts\";\nimport { getPropertiesAtLength } from \"./util/getPropertiesAtLength.ts\";\nimport { getPropertiesAtPoint } from \"./util/getPropertiesAtPoint.ts\";\nimport { getSegmentAtLength } from \"./util/getSegmentAtLength.ts\";\nimport { getSegmentOfPoint } from \"./util/getSegmentOfPoint.ts\";\nimport { isAbsoluteArray } from \"./util/isAbsoluteArray.ts\";\nimport { isPolygonArray } from \"./util/isPolygonArray.ts\";\nimport { isCurveArray } from \"./util/isCurveArray.ts\";\nimport { isNormalizedArray } from \"./util/isNormalizedArray.ts\";\nimport { isPathArray } from \"./util/isPathArray.ts\";\nimport { isPointInStroke } from \"./util/isPointInStroke.ts\";\nimport { isRelativeArray } from \"./util/isRelativeArray.ts\";\nimport { isValidPath } from \"./util/isValidPath.ts\";\nimport { samplePolygon } from \"./morph/samplePolygon.ts\";\nimport { shapeParams } from \"./util/shapeParams.ts\";\nimport { shapeToPath } from \"./util/shapeToPath.ts\";\nimport { shapeToPathArray } from \"./util/shapeToPathArray.ts\";\nimport { isMultiPath } from \"./util/isMultiPath.ts\";\nimport { isPolylineArray } from \"./util/isPolylineArray.ts\";\nimport { isClosedPath } from \"./util/isClosedPath.ts\";\n\nimport { normalizePath } from \"./process/normalizePath.ts\";\nimport { optimizePath } from \"./process/optimizePath.ts\";\nimport { reversePath } from \"./process/reversePath.ts\";\nimport { splitPath } from \"./process/splitPath.ts\";\nimport { transformPath } from \"./process/transformPath.ts\";\nimport { absolutizeSegment } from \"./process/absolutizeSegment.ts\";\nimport { arcToCubic } from \"./process/arcToCubic.ts\";\nimport { getSVGMatrix } from \"./process/getSVGMatrix.ts\";\nimport { iterate } from \"./process/iterate.ts\";\nimport { lineToCubic } from \"./process/lineToCubic.ts\";\nimport { normalizeSegment } from \"./process/normalizeSegment.ts\";\nimport { projection2d } from \"./process/projection2d.ts\";\nimport { quadToCubic } from \"./process/quadToCubic.ts\";\nimport { relativizeSegment } from \"./process/relativizeSegment.ts\";\nimport { reverseCurve } from \"./process/reverseCurve.ts\";\nimport { roundPath } from \"./process/roundPath.ts\";\nimport { roundSegment } from \"./process/roundSegment.ts\";\nimport { segmentToCubic } from \"./process/segmentToCubic.ts\";\nimport { shortenSegment } from \"./process/shortenSegment.ts\";\n\nimport { fixPath } from \"./morph/fixPath.ts\";\nimport { splitCubicSegment } from \"./morph/splitCubicSegment.ts\";\nimport { equalizeSegments } from \"./morph/equalizeSegments.ts\";\nimport { equalizePaths } from \"./morph/equalizePaths.ts\";\nimport { pathsIntersection } from \"./intersect/pathIntersection.ts\";\nimport { boundingBoxIntersect } from \"./intersect/boundingBoxIntersect.ts\";\nimport { isPointInsideBBox } from \"./intersect/isPointInsideBBox.ts\";\nimport distanceEpsilon from \"./util/distanceEpsilon.ts\";\n\n/**\n * Creates a new SVGPathCommander instance with the following properties:\n * * segments: `pathArray`\n * * round: number\n * * origin: [number, number, number?]\n *\n * @class\n * @author thednp <https://github.com/thednp/svg-path-commander>\n * @returns a new SVGPathCommander instance\n */\nclass SVGPathCommander {\n // declare class properties\n declare segments: PathArray;\n declare round: number | \"off\";\n declare origin: [number, number, number];\n\n /**\n * @constructor\n * @param pathValue the path string\n * @param config instance options\n */\n constructor(pathValue: string, config?: Partial<Options>) {\n const instanceOptions = config || {};\n const undefPath = typeof pathValue === \"undefined\";\n\n if (undefPath || !pathValue.length) {\n throw TypeError(\n `${error}: \"pathValue\" is ${undefPath ? \"undefined\" : \"empty\"}`,\n );\n }\n\n this.segments = parsePathString(pathValue);\n\n // // set instance options.round\n const { round: roundOption, origin: originOption } = instanceOptions;\n let round: number | \"off\";\n\n if (Number.isInteger(roundOption) || roundOption === \"off\") {\n round = roundOption as number | \"off\";\n } else {\n round = defaultOptions.round as number;\n }\n\n // set instance options.origin\n // the SVGPathCommander class will always override the default origin\n let origin = defaultOptions.origin as [number, number, number];\n /* istanbul ignore else @preserve */\n if (Array.isArray(originOption) && originOption.length >= 2) {\n const [originX, originY, originZ] = originOption.map(Number);\n origin = [\n !Number.isNaN(originX) ? originX : 0,\n !Number.isNaN(originY) ? originY : 0,\n !Number.isNaN(originZ) ? originZ : 0,\n ];\n }\n\n this.round = round;\n this.origin = origin;\n\n return this;\n }\n get bbox() {\n return getPathBBox(this.segments);\n }\n get length() {\n return getTotalLength(this.segments);\n }\n\n /**\n * Returns the path bounding box, equivalent to native `path.getBBox()`.\n *\n * @public\n * @returns the pathBBox\n */\n getBBox() {\n return this.bbox;\n }\n\n /**\n * Returns the total path length, equivalent to native `path.getTotalLength()`.\n *\n * @public\n * @returns the path total length\n */\n getTotalLength() {\n return this.length;\n }\n\n /**\n * Returns an `{x,y}` point in the path stroke at a given length,\n * equivalent to the native `path.getPointAtLength()`.\n *\n * @public\n * @param length the length\n * @returns the requested point\n */\n getPointAtLength(length: number) {\n return getPointAtLength(this.segments, length);\n }\n\n /**\n * Convert path to absolute values.\n *\n * @example\n * ```ts\n * new SVGPathCommander('M10 10l80 80').toAbsolute().toString()\n * // => 'M10 10L90 90'\n * ```\n *\n * @returns this for chaining\n * @public\n */\n toAbsolute() {\n const { segments } = this;\n this.segments = pathToAbsolute(segments);\n return this;\n }\n\n /**\n * Convert path to relative values.\n *\n * @example\n * ```ts\n * new SVGPathCommander('M10 10L90 90').toRelative().toString()\n * // => 'M10 10l80 80'\n * ```\n *\n * @returns this for chaining\n * @public\n */\n toRelative() {\n const { segments } = this;\n this.segments = pathToRelative(segments);\n return this;\n }\n\n /**\n * Convert path to cubic-bezier values. In addition, un-necessary `Z`\n * segment is removed if previous segment extends to the `M` segment.\n *\n * @example\n * ```ts\n * new SVGPathCommander('M10 50q15 -25 30 0').toCurve().toString()\n * // => 'M10 50C25 25 40 50 40 50'\n * ```\n *\n * @returns this for chaining\n * @public\n */\n toCurve() {\n const { segments } = this;\n this.segments = pathToCurve(segments);\n return this;\n }\n\n /**\n * Reverse the order of the segments and their values.\n *\n * @example\n * ```ts\n * new SVGPathCommander('M0 0L100 0L100 100L0 100Z').reverse().toString()\n * // => 'M0 100L0 0L100 0L100 100Z'\n * ```\n *\n * @param onlySubpath - option to reverse all sub-paths except first\n * @returns this for chaining\n * @public\n */\n reverse(onlySubpath?: boolean) {\n const { segments } = this;\n const split = splitPath(segments);\n const subPath = split.length > 1 ? split : false;\n\n const absoluteMultiPath = subPath\n ? subPath.map((x, i) => {\n if (onlySubpath) {\n return i ? reversePath(x) : x.slice(0);\n }\n return reversePath(x);\n })\n : segments.slice(0);\n\n let path = [] as unknown as PathArray;\n if (subPath) {\n path = absoluteMultiPath.flat(1) as PathArray;\n } else {\n path = onlySubpath ? segments : reversePath(segments);\n }\n\n this.segments = path.slice(0) as PathArray;\n return this;\n }\n\n /**\n * Normalize path in 2 steps:\n * * convert `pathArray`(s) to absolute values\n * * convert shorthand notation to standard notation\n *\n * @example\n * ```ts\n * new SVGPathCommander('M10 90s20 -80 40 -80s20 80 40 80').normalize().toString()\n * // => 'M10 90C30 90 25 10 50 10C75 10 70 90 90 90'\n * ```\n *\n * @returns this for chaining\n * @public\n */\n normalize() {\n const { segments } = this;\n this.segments = normalizePath(segments);\n return this;\n }\n\n /**\n * Optimize `pathArray` values:\n * * convert segments to absolute and/or relative values\n * * select segments with shortest resulted string\n * * round values to the specified `decimals` option value\n *\n * @example\n * ```ts\n * new SVGPathCommander('M10 10L10 10L90 90').optimize().toString()\n * // => 'M10 10l0 0 80 80'\n * ```\n *\n * @returns this for chaining\n * @public\n */\n optimize() {\n const { segments } = this;\n const round = this.round === \"off\" ? 2 : this.round;\n\n this.segments = optimizePath(segments, round);\n return this;\n }\n\n /**\n * Transform path using values from an `Object` defined as `transformObject`.\n *\n * @see TransformObject for a quick reference\n *\n * @param source a `transformObject` as described above\n * @returns this for chaining\n * @public\n */\n transform(source?: Partial<TransformObject>) {\n if (\n !source ||\n typeof source !== \"object\" ||\n (typeof source === \"object\" &&\n ![\"translate\", \"rotate\", \"skew\", \"scale\"].some((x) => x in source))\n ) {\n return this;\n }\n\n const {\n segments,\n origin: [cx, cy, cz],\n } = this;\n const transform = {} as TransformObjectValues;\n for (const [k, v] of Object.entries(source) as TransformEntries) {\n // istanbul ignore else @preserve\n if (k === \"skew\" && Array.isArray(v)) {\n transform[k] = v.map(Number) as PointTuple;\n } else if (\n (k === \"rotate\" ||\n k === \"translate\" ||\n k === \"origin\" ||\n k === \"scale\") &&\n Array.isArray(v)\n ) {\n transform[k] = v.map(Number) as [number, number, number];\n } else if (k !== \"origin\" && typeof Number(v) === \"number\") {\n transform[k] = Number(v);\n }\n }\n\n // if origin is not specified\n // it's important that we have one\n const { origin } = transform;\n\n if (Array.isArray(origin) && origin.length >= 2) {\n const [originX, originY, originZ] = origin.map(Number);\n transform.origin = [\n !Number.isNaN(originX) ? originX : cx,\n !Number.isNaN(originY) ? originY : cy,\n originZ || cz,\n ];\n } else {\n transform.origin = [cx, cy, cz];\n }\n\n this.segments = transformPath(segments, transform);\n return this;\n }\n\n /**\n * Rotate path 180deg vertically.\n *\n * @example\n * ```ts\n * const path = new SVGPathCommander('M0 0L100 0L100 100L0 100Z')\n * path.flipX().toString()\n * ```\n *\n * @returns this for chaining\n * @public\n */\n flipX() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Rotate path 180deg horizontally.\n *\n * @example\n * ```ts\n * const path = new SVGPathCommander('M0 0L100 0L100 100L0 100Z')\n * path.flipY().toString()\n * ```\n *\n * @returns this for chaining\n * @public\n */\n flipY() {\n const { cx, cy } = this.bbox;\n this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] });\n return this;\n }\n\n /**\n * Export the current path to be used\n * for the `d` (description) attribute.\n *\n * @public\n * @returns the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @returns void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static options = defaultOptions;\n static CSSMatrix = CSSMatrix;\n static arcTools = arcTools;\n static bezierTools = bezierTools;\n static cubicTools = cubicTools;\n static lineTools = lineTools;\n static polygonTools = polygonTools;\n static quadTools = quadTools;\n\n static pathToAbsolute = pathToAbsolute;\n static pathToRelative = pathToRelative;\n static pathToCurve = pathToCurve;\n static pathToString = pathToString;\n\n static distanceSquareRoot = distanceSquareRoot;\n static midPoint = midPoint;\n static rotateVector = rotateVector;\n static roundTo = roundTo;\n\n static parsePathString = parsePathString;\n static finalizeSegment = finalizeSegment;\n static invalidPathValue = invalidPathValue;\n\n static isArcCommand = isArcCommand;\n static isDigit = isDigit;\n static isDigitStart = isDigitStart;\n static isMoveCommand = isMoveCommand;\n static isPathCommand = isPathCommand;\n static isSpace = isSpace;\n\n static paramsCount = paramsCounts;\n static paramsParser = paramsParser;\n static PathParser = PathParser;\n static scanFlag = scanFlag;\n static scanParam = scanParam;\n static scanSegment = scanSegment;\n static skipSpaces = skipSpaces;\n\n static distanceEpsilon = distanceEpsilon;\n\n static fixPath = fixPath;\n static getClosestPoint = getClosestPoint;\n static getDrawDirection = getDrawDirection;\n static getPathArea = getPathArea;\n static getPathBBox = getPathBBox;\n static getPointAtLength = getPointAtLength;\n static getPropertiesAtLength = getPropertiesAtLength;\n static getPropertiesAtPoint = getPropertiesAtPoint;\n static getSegmentAtLength = getSegmentAtLength;\n static getSegmentOfPoint = getSegmentOfPoint;\n static getTotalLength = getTotalLength;\n\n static isAbsoluteArray = isAbsoluteArray;\n static isCurveArray = isCurveArray;\n static isPolygonArray = isPolygonArray;\n static isNormalizedArray = isNormalizedArray;\n static isPathArray = isPathArray;\n static isPointInStroke = isPointInStroke;\n static isRelativeArray = isRelativeArray;\n static isValidPath = isValidPath;\n\n static samplePolygon = samplePolygon;\n static shapeParams = shapeParams;\n static shapeToPath = shapeToPath;\n static shapeToPathArray = shapeToPathArray;\n\n static absolutizeSegment = absolutizeSegment;\n static arcToCubic = arcToCubic;\n static getSVGMatrix = getSVGMatrix;\n static iterate = iterate;\n static lineToCubic = lineToCubic;\n static normalizePath = normalizePath;\n static normalizeSegment = normalizeSegment;\n static optimizePath = optimizePath;\n static projection2d = projection2d;\n static quadToCubic = quadToCubic;\n static relativizeSegment = relativizeSegment;\n static reverseCurve = reverseCurve;\n static reversePath = reversePath;\n static roundPath = roundPath;\n static roundSegment = roundSegment;\n static segmentToCubic = segmentToCubic;\n static shortenSegment = shortenSegment;\n static splitPath = splitPath;\n static equalizePaths = equalizePaths;\n static equalizeSegments = equalizeSegments;\n static splitCubicSegment = splitCubicSegment;\n static transformPath = transformPath;\n static isPointInsideBBox = isPointInsideBBox;\n static pathsIntersection = pathsIntersection;\n static boundingBoxIntersect = boundingBoxIntersect;\n static isMultiPath = isMultiPath;\n static isClosedPath = isClosedPath;\n static isPolylineArray = isPolylineArray;\n static version = version;\n}\n\nexport default SVGPathCommander;\n","\"use strict\";\n\nimport SVGPathCommander from \"./main.ts\";\n\nexport * from \"./types.ts\";\nexport * from \"./interface.ts\";\n\nexport default SVGPathCommander;\nexport {};\n"],"x_google_ignoreList":[1],"mappings":";kPCCI,EAAI,CACP,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,KAAM,CAAC,EACP,WAAY,CAAC,EACb,CAAE,EAAK,IAAO,aAAa,cAAgB,aAAa,cAAgB,MAAM,QAAQ,EAAE,EAAI,EAAE,MAAO,GAAM,OAAO,GAAK,SAAS,GAAK,CAAC,EAAG,GAAG,CAAC,KAAM,GAAM,EAAE,SAAW,EAAE,CAAE,EAAK,GAAM,aAAa,WAAa,aAAa,GAAK,OAAO,GAAK,UAAY,OAAO,KAAK,EAAE,CAAC,MAAO,GAAM,GAAK,KAAK,EAAE,CAAE,EAAK,GAAM,CAC9S,IAAI,EAAI,IAAI,EAAK,EAAI,MAAM,KAAK,EAAE,CAClC,GAAI,CAAC,EAAE,EAAE,CAAE,MAAM,UAAU,eAAe,EAAE,KAAK,IAAI,CAAC,uCAAuC,CAE7F,GAAI,EAAE,SAAW,GAAI,CACpB,GAAI,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAAK,EACvD,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,EAAE,IAAM,EAAG,EAAE,IAAM,EAAG,EAAE,IAAM,EAAG,EAAE,IAAM,EAAG,EAAE,IAAM,EAAG,EAAE,IAAM,EAAG,EAAE,IAAM,UACzN,EAAE,SAAW,EAAG,CAC1B,GAAI,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GAAK,EACzB,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,EAAE,EAAI,EAEtH,OAAO,GACL,EAAK,GAAM,CACb,GAAI,EAAE,EAAE,CAAE,OAAO,EAAE,CAClB,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,CAAC,CACF,MAAM,UAAU,eAAe,KAAK,UAAU,EAAE,CAAC,4DAA4D,EAC3G,EAAK,GAAM,CACb,GAAI,OAAO,GAAK,SAAU,MAAM,UAAU,eAAe,KAAK,UAAU,EAAE,CAAC,oBAAoB,CAC/F,IAAI,EAAI,OAAO,EAAE,CAAC,QAAQ,MAAO,GAAG,CAAE,EAAI,IAAI,EAAK,EAAI,wCAAwC,EAAE,GACjG,OAAO,EAAE,MAAM,IAAI,CAAC,OAAQ,GAAM,EAAE,CAAC,QAAS,GAAM,CACnD,GAAI,CAAC,EAAG,GAAK,EAAE,MAAM,IAAI,CACzB,GAAI,CAAC,EAAG,MAAM,UAAU,EAAE,CAC1B,IAAI,EAAI,EAAE,MAAM,IAAI,CAAC,IAAK,GAAM,EAAE,SAAS,MAAM,CAAG,IAAM,KAAK,GAAK,WAAW,EAAE,CAAG,WAAW,EAAE,CAAC,CAAE,CAAC,EAAG,EAAG,EAAG,GAAK,EAAG,EAAI,CACzH,EACA,EACA,EACA,CAAE,EAAI,CACN,EACA,EACA,EACA,EACA,CACD,GAAI,IAAM,eAAiB,GAAK,CAAC,EAAG,EAAE,CAAC,MAAO,GAAM,IAAM,IAAK,GAAE,CAAE,EAAE,IAAM,GAAK,UACvE,EAAE,SAAS,SAAS,EAAI,CAAC,EAAG,GAAG,CAAC,SAAS,EAAE,OAAO,EAAI,EAAE,MAAO,GAAM,CAAC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAE,CACjG,IAAI,EAAI,EAAE,IAAK,GAAM,KAAK,IAAI,EAAE,CAAG,KAAO,EAAI,EAAE,CAChD,EAAE,aAAa,EAAE,EAAE,CAAC,SACV,IAAM,eAAiB,EAAE,MAAO,GAAM,CAAC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAE,EAAE,cAAc,EAAG,EAAG,EAAE,SACpF,IAAM,aAAe,GAAK,IAAM,IAAK,GAAG,EAAE,cAAc,EAAG,GAAK,EAAG,EAAE,SACrE,IAAM,YAAc,EAAE,MAAO,GAAM,CAAC,OAAO,MAAM,CAAC,EAAE,CAAC,EAAI,EAAG,EAAE,oBAAoB,EAAG,EAAG,EAAG,EAAE,SAC7F,IAAM,UAAY,GAAK,CAAC,EAAG,EAAE,CAAC,MAAO,GAAM,IAAM,IAAK,GAAE,CAAE,EAAE,WAAW,EAAG,EAAG,EAAE,SAC/E,IAAM,WAAa,EAAE,MAAO,GAAM,CAAC,OAAO,MAAM,CAAC,EAAE,CAAC,EAAI,EAAE,KAAM,GAAM,IAAM,EAAE,CAAE,EAAE,UAAU,EAAG,EAAG,EAAE,SACpG,IAAM,SAAW,CAAC,OAAO,MAAM,EAAE,GAAK,IAAM,GAAK,IAAM,IAAM,IAAM,IAAK,GAAG,CACnF,IAAI,EAAI,OAAO,MAAM,CAAC,EAAE,CAAG,EAAI,EAC/B,EAAE,UAAU,EAAG,EAAG,EAAE,SACV,IAAM,SAAW,GAAK,CAAC,OAAO,MAAM,EAAE,EAAI,IAAM,IAAM,IAAK,GAAG,EAAE,SAAS,EAAG,GAAK,EAAE,SACrF,CACR,YACA,SACA,QACA,OACA,CAAC,KAAM,GAAM,EAAE,SAAS,EAAE,CAAC,EAAI,QAAQ,KAAK,EAAE,EAAI,GAAK,CAAC,EAAG,EAAE,CAAC,MAAO,GAAM,IAAM,IAAK,GAAE,CAAE,GAAI,IAAM,SAAW,IAAM,QAAS,EAAE,IAAM,QAAU,YAAc,aAAa,EAAE,KACzK,CACJ,IAAI,EAAI,EAAE,QAAQ,QAAS,GAAG,CAAE,EAAI,EAAE,QAAQ,EAAG,GAAG,CAAE,EAAI,CACzD,IACA,IACA,IACA,CAAC,QAAQ,EAAE,CAAE,EAAI,IAAM,QAAU,EAAI,EAAG,EAAI,EAAI,OAAQ,EAAI,CAC5D,IAAM,EAAI,EAAI,EACd,IAAM,EAAI,EAAI,EACd,IAAM,EAAI,EAAI,EACd,CACD,EAAE,GAAG,GAAG,EAAE,MAEN,MAAM,UAAU,EAAE,EACtB,CAAE,GACF,GAAK,EAAG,IAAM,EAAI,CACpB,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,CAAG,CACH,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,EAAE,IACF,CAAE,GAAK,EAAG,EAAG,IAAM,CACnB,IAAI,EAAI,IAAI,EACZ,MAAO,GAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,GACxD,GAAK,EAAG,EAAG,IAAM,CACnB,IAAI,EAAI,IAAI,EAAK,EAAI,KAAK,GAAK,IAAK,EAAI,EAAI,EAAG,EAAI,EAAI,EAAG,EAAI,EAAI,EAAG,EAAI,KAAK,IAAI,EAAE,CAAE,EAAI,CAAC,KAAK,IAAI,EAAE,CAAE,EAAI,KAAK,IAAI,EAAE,CAAE,EAAI,CAAC,KAAK,IAAI,EAAE,CAAE,EAAI,KAAK,IAAI,EAAE,CAAE,EAAI,CAAC,KAAK,IAAI,EAAE,CAAE,EAAI,EAAI,EAAG,EAAI,CAAC,EAAI,EAClM,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAChD,IAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EACxB,EAAE,IAAM,EAAG,EAAE,EAAI,EACjB,IAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EACxB,MAAO,GAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,CAAC,EAAI,EAAG,EAAE,IAAM,EAAI,EAAI,EAAI,EAAI,EAAG,EAAE,IAAM,EAAI,EAAI,EAAI,EAAI,EAAG,EAAE,IAAM,EAAI,EAAG,GAC9G,GAAK,EAAI,EAAG,EAAI,EAAG,EAAI,EAAG,EAAI,IAAM,CACtC,IAAI,EAAI,IAAI,EAAK,EAAI,KAAK,KAAK,EAAI,EAAI,EAAI,EAAI,EAAI,EAAE,CACrD,GAAI,IAAM,EAAG,OAAO,EACpB,IAAI,EAAI,EAAI,EAAG,EAAI,EAAI,EAAG,EAAI,EAAI,EAAG,EAAI,KAAK,GAAK,IAAM,EAAG,EAAI,KAAK,IAAI,EAAE,CAAE,EAAI,KAAK,IAAI,EAAE,CAAE,EAAI,EAAI,EAAG,EAAI,EAAI,EAAG,EAAI,EAAI,EAAG,EAAI,EAAI,EAAG,EAAI,EAAI,GAAK,EAAI,GAAK,EAChK,EAAE,IAAM,EAAG,EAAE,EAAI,EACjB,IAAI,EAAI,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,GACjC,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,GACrD,IAAI,EAAI,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,GACjC,EAAE,IAAM,EAAG,EAAE,EAAI,EACjB,IAAI,EAAI,EAAI,GAAK,EAAI,GAAK,EAC1B,MAAO,GAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,GAAI,EAAE,IAAM,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,GAAI,EAAE,IAAM,GAAK,EAAI,EAAI,EAAI,EAAI,EAAI,GAAI,EAAE,IAAM,EAAI,GAAK,EAAI,GAAK,EAAG,GACrK,GAAK,EAAG,EAAG,IAAM,CACnB,IAAI,EAAI,IAAI,EACZ,MAAO,GAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,EAAE,EAAI,EAAG,EAAE,IAAM,EAAG,GACxD,GAAK,EAAG,IAAM,CAChB,IAAI,EAAI,IAAI,EACZ,GAAI,EAAG,CACN,IAAI,EAAI,EAAI,KAAK,GAAK,IAAK,EAAI,KAAK,IAAI,EAAE,CAC1C,EAAE,IAAM,EAAG,EAAE,EAAI,EAElB,GAAI,EAAG,CACN,IAAI,EAAI,EAAI,KAAK,GAAK,IAAK,EAAI,KAAK,IAAI,EAAE,CAC1C,EAAE,IAAM,EAAG,EAAE,EAAI,EAElB,OAAO,GACL,EAAK,GAAM,EAAE,EAAG,EAAE,CAAE,EAAK,GAAM,EAAE,EAAG,EAAE,CAAE,GAAK,EAAG,IAAM,EAAE,CAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAC1D,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM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"}
|