diff --git a/dist/svg-path-commander.cjs b/dist/svg-path-commander.cjs index 6ced08e..e3ce8c9 100644 --- a/dist/svg-path-commander.cjs +++ b/dist/svg-path-commander.cjs @@ -1,2 +1,2 @@ -"use strict";var zt=Object.create;var Me=Object.defineProperty;var Rt=Object.getOwnPropertyDescriptor;var Vt=Object.getOwnPropertyNames;var Qt=Object.getPrototypeOf,qt=Object.prototype.hasOwnProperty;var Dt=(t,e)=>{for(var n in e)Me(t,n,{get:e[n],enumerable:!0})},it=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Vt(e))!qt.call(t,r)&&r!==n&&Me(t,r,{get:()=>e[r],enumerable:!(o=Rt(e,r))||o.enumerable});return t};var Ye=(t,e,n)=>(n=t!=null?zt(Qt(t)):{},it(e||!t||!t.__esModule?Me(n,"default",{value:t,enumerable:!0}):n,t)),Et=t=>it(Me({},"__esModule",{value:!0}),t);var pn={};Dt(pn,{CSSMatrix:()=>kt.default,absolutizeSegment:()=>_,arcToCubic:()=>pe,default:()=>cn,distanceEpsilon:()=>me,error:()=>w,finalizeSegment:()=>xe,getClosestPoint:()=>xt,getDrawDirection:()=>Pt,getPathArea:()=>Ge,getPathBBox:()=>Ie,getPointAtLength:()=>te,getPropertiesAtLength:()=>de,getPropertiesAtPoint:()=>re,getSVGMatrix:()=>He,getSegmentAtLength:()=>St,getSegmentOfPoint:()=>At,getTotalLength:()=>K,invalidPathValue:()=>H,isAbsoluteArray:()=>_e,isArcCommand:()=>ze,isCurveArray:()=>Ct,isDigit:()=>j,isDigitStart:()=>ke,isMoveCommand:()=>Re,isNormalizedArray:()=>Ue,isPathArray:()=>ne,isPathCommand:()=>we,isPointInStroke:()=>Tt,isRelativeArray:()=>Mt,isSpace:()=>Ne,isValidPath:()=>Ke,iterate:()=>M,lineToCubic:()=>Se,normalizePath:()=>F,normalizeSegment:()=>Y,optimizePath:()=>Be,paramsCount:()=>Z,paramsParser:()=>U,parsePathString:()=>T,pathParser:()=>W,pathToAbsolute:()=>X,pathToCurve:()=>ee,pathToRelative:()=>Ve,pathToString:()=>fe,projection2d:()=>Te,quadToCubic:()=>Qe,relativizeSegment:()=>ce,reverseCurve:()=>vt,reversePath:()=>ye,roundPath:()=>Nt,roundSegment:()=>ie,scanFlag:()=>Le,scanParam:()=>ve,scanSegment:()=>le,segmentToCubic:()=>qe,shapeParams:()=>oe,shapeToPath:()=>Lt,shapeToPathArray:()=>Je,shortenSegment:()=>$e,skipSpaces:()=>G,splitCubic:()=>wt,splitPath:()=>je,transformPath:()=>Ze});module.exports=Et(pn);var Ot={origin:[0,0,0],round:4},O=Ot;var It={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Z=It;var $t=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=Z[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,Z[n]))),!!Z[n]););},xe=$t;var Bt="SVGPathCommander Error",w=Bt;var jt=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${w}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},Le=jt;var Ht=t=>t>=48&&t<=57,j=Ht;var Zt="Invalid path value",H=Zt;var Gt=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${w}: ${H} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!j(u)&&u!==46){t.err=`${w}: ${H} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),Ne=_t;var Ut=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},we=Kt;var Ft=t=>j(t)||t===43||t===45||t===46,ke=Ft;var Jt=t=>(t|32)===97,ze=Jt;var Wt=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},Re=Wt;var Xt=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=Z[n[o].toLowerCase()];if(t.segmentStart=o,!we(s)){t.err=`${w}: ${H} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!Re(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${w}: ${H} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,G(t),t.data=[],!a){xe(t);return}for(;;){for(let m=a;m>0;m-=1){if(ze(s)&&(m===3||m===4)?Le(t):ve(t),t.err.length)return;t.data.push(t.param),G(t),t.index=t.max||!ke(n.charCodeAt(t.index)))break}xe(t)},le=Xt;var W=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var Yt=t=>{if(typeof t!="string")return t.slice(0);let e=new W(t);for(G(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,l=0,c=0;for(let f=0;f{let e=T(t);return M(e,_)},X=rr;var nr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=T(t);return M(e,ce)},Ve=or;var ar=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},Pe=ar;var ut=(t,e,n,o,r,s,a,i,m,u)=>{let l=t,c=e,f=n,h=o,p=i,b=m,d=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],y,g,x,C,R;if(u)[g,x,C,R]=u;else{y=Pe(l,c,-S),l=y.x,c=y.y,y=Pe(p,b,-S),p=y.x,b=y.y;let N=(l-p)/2,D=(c-b)/2,z=N*N/(f*f)+D*D/(h*h);z>1&&(z=Math.sqrt(z),f*=z,h*=z);let We=f*f,Xe=h*h,mt=(s===a?-1:1)*Math.sqrt(Math.abs((We*Xe-We*D*D-Xe*N*N)/(We*D*D+Xe*N*N)));C=mt*f*D/h+(l+p)/2,R=mt*-h*N/f+(c+b)/2,g=Math.asin(((c-R)/h*10**9>>0)/10**9),x=Math.asin(((b-R)/h*10**9>>0)/10**9),g=lx&&(g-=Math.PI*2),!a&&x>g&&(x-=Math.PI*2)}let V=x-g;if(Math.abs(V)>d){let N=x,D=p,z=b;x=g+d*(a&&x>g?1:-1),p=C+f*Math.cos(x),b=R+h*Math.sin(x),A=ut(p,b,f,h,r,0,a,D,z,[x,N,C,R])}V=x-g;let k=Math.cos(g),L=Math.sin(g),$=Math.cos(x),ae=Math.sin(x),Q=Math.tan(V/4),P=4/3*f*Q,q=4/3*h*Q,B=[l,c],E=[l+P*L,c-q*k],J=[p+P*ae,b-q*$],ue=[p,b];if(E[0]=2*B[0]-E[0],E[1]=2*B[1]-E[1],u)return[E[0],E[1],J[0],J[1],ue[0],ue[1]].concat(A);A=[E[0],E[1],J[0],J[1],ue[0],ue[1]].concat(A);let se=[];for(let N=0,D=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},Qe=sr;var mr=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},I=mr;var ir=(t,e,n,o)=>{let r=I([t,e],[n,o],.3333333333333333),s=I([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Se=ir;var ur=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(pe(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(Qe(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Se(a,i,r,s)):n==="Z"?["C"].concat(Se(a,i,m,u)):t},qe=ur;var lr=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:l}=e,c=t.slice(1),f=c.map((h,p)=>h+(r?p%2?l:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=c.slice(0,-2).concat(c[5]+(r?u:0),c[6]+(r?l:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?l:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let h=s*2-i,p=a*2-m;return e.x1=h,e.y1=p,["C",h,p].concat(f)}else if(o==="T"){let h=s*2-(e.qx?e.qx:0),p=a*2-(e.qy?e.qy:0);return e.qx=h,e.qy=p,["Q",h,p].concat(f)}else if(o==="Q"){let[h,p]=f;return e.qx=h,e.qy=p,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},Y=lr;var cr={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},U=cr;var pr=t=>{let e={...U},n=T(t);return M(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=Y(o,e),m=qe(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let l=m.length;return e.x1=+m[l-2],e.y1=+m[l-1],e.x2=+m[l-4]||e.x1,e.y2=+m[l-3]||e.y1,m})},ee=pr;var fr=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},v=fr;var hr=(t,e)=>{let n=t.length,{round:o}=O,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;aMath.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),et=br;var he=(t,e,n,o)=>et([t,e],[n,o]),De=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=et([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=I([t,e],[n,o],r/a);s={x:i,y:m}}}return s},tt=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]};var ct=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},be=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),l=n*i(s),c=o*a(s);return[t+m*l-u*c,e+u*l+m*c]},lt=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},rt=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:l,cos:c,sqrt:f,PI:h}=Math,p=u(n),b=u(o),S=(r%360+360)%360*(h/180);if(t===i&&e===m)return{rx:p,ry:b,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||b===0)return{rx:p,ry:b,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,y=(e-m)/2,g={x:c(S)*A+l(S)*y,y:-l(S)*A+c(S)*y},x=g.x**2/p**2+g.y**2/b**2;x>1&&(p*=f(x),b*=f(x));let C=p**2*b**2-p**2*g.y**2-b**2*g.x**2,R=p**2*g.y**2+b**2*g.x**2,V=C/R;V=V<0?0:V;let k=(s!==a?1:-1)*f(V),L={x:k*(p*g.y/b),y:k*(-(b*g.x)/p)},$={x:c(S)*L.x-l(S)*L.y+(t+i)/2,y:l(S)*L.x+c(S)*L.y+(e+m)/2},ae={x:(g.x-L.x)/p,y:(g.y-L.y)/b},Q=lt({x:1,y:0},ae),P={x:(-g.x-L.x)/p,y:(-g.y-L.y)/b},q=lt(ae,P);!a&&q>0?q-=2*h:a&&q<0&&(q+=2*h),q%=2*h;let B=Q+q;return{center:$,startAngle:Q,endAngle:B,rx:p,ry:b}},Ee=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:l,startAngle:c,endAngle:f}=rt(t,e,n,o,r,s,a,i,m);return ct(u,l,f-c)},pt=(t,e,n,o,r,s,a,i,m,u)=>{let l={x:t,y:e},{center:c,rx:f,ry:h,startAngle:p,endAngle:b}=rt(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let d=ct(f,h,b-p);if(u<=0)l={x:t,y:e};else if(u>=d)l={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||h===0)return De(t,e,i,m,u);let{PI:S,cos:A,sin:y}=Math,g=b-p,C=(r%360+360)%360*(S/180),R=p+g*(u/d),V=f*A(R),k=h*y(R);l={x:A(C)*V-y(C)*k+c.x,y:y(C)*V+A(C)*k+c.y}}}return l},ft=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:l,ry:c,startAngle:f,endAngle:h}=rt(t,e,n,o,r,s,a,i,m),p=h-f,{min:b,max:d,tan:S,atan2:A,PI:y}=Math,{x:g,y:x}=u,C=r*y/180,R=S(C),V=A(-c*R,l),k=V,L=V+y,$=A(c,l*R),ae=$+y,Q=[i],P=[m],q=b(t,i),B=d(t,i),E=b(e,m),J=d(e,m),ue=h-p*1e-5,se=be(g,x,l,c,C,ue),N=h-p*.99999,D=be(g,x,l,c,C,N);if(se[0]>B||D[0]>B){let z=be(g,x,l,c,C,k);Q.push(z[0]),P.push(z[1])}if(se[0]J||D[1]>J){let z=be(g,x,l,c,C,$);Q.push(z[0]),P.push(z[1])}return q=b.apply([],Q),E=b.apply([],P),B=d.apply([],Q),J=d.apply([],P),[q,E,B,J]};var ht=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],gr=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],yr=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,l=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,l=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+l*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+l*r[3].y,t:e}},xr=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},Pr=t=>{let n=ht.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;odr(n[0],o))},Sr=1e-8,Oe=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)0&&l<1){let f=t*(1-l)*(1-l)*(1-l)+e*3*(1-l)*(1-l)*l+n*3*(1-l)*l*l+o*l*l*l;fm&&(m=f)}}return[i,m]};var Ar=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},Ae=(t,e,n,o,r,s,a,i)=>ge([t,e,n,o,r,s,a,i]),bt=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",l={x:t,y:e};if(u){let c=ge([t,e,n,o,r,s,a,i]);m<=0||(m>=c?l={x:a,y:i}:l=Ar([t,e,n,o,r,s,a,i],m/c))}return l},ot=(t,e,n,o,r,s,a,i)=>{let m=nt([t,n,r,a]),u=nt([e,o,s,i]);return[m[0],u[0],m[1],u[1]]};var Cr=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},Ce=(t,e,n,o,r,s)=>ge([t,e,n,o,r,s]),gt=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=ge([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=Cr([t,e,n,o,r,s],a/u))}return m},at=(t,e,n,o,r,s)=>{let a=Oe([t,n,r]),i=Oe([e,o,s]);return[a[0],i[0],a[1],i[1]]};var Tr=t=>{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=T(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,l=-1/0,c=0,f=0,h=0,p=0,b=0,d=0,S=0,A=0,y=0,g=0;M(e,(R,V,k,L)=>{[n]=R;let $=n.toUpperCase(),Q=$!==n?_(R,V,k,L):R.slice(0),P=$==="V"?["L",k,Q[1]]:$==="H"?["L",Q[1],L]:Q;[n]=P,"TQ".includes($)||(y=0,g=0);if(n==="M")[,o,r]=P,c=o,f=r,h=o,p=r;else if(n==="L")[c,f,h,p]=tt(k,L,P[1],P[2]);else if(n==="A")[c,f,h,p]=ft(k,L,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(n==="S"){let q=b*2-S,B=d*2-A;[c,f,h,p]=ot(k,L,q,B,P[1],P[2],P[3],P[4])}else n==="C"?[c,f,h,p]=ot(k,L,P[1],P[2],P[3],P[4],P[5],P[6]):n==="T"?(y=b*2-y,g=d*2-g,[c,f,h,p]=at(k,L,y,g,P[1],P[2])):n==="Q"?(y=P[1],g=P[2],[c,f,h,p]=at(k,L,P[1],P[2],P[3],P[4])):n==="Z"&&([c,f,h,p]=tt(k,L,o,r));i=a(c,i),m=a(f,m),u=s(h,u),l=s(p,l),[b,d]=n==="Z"?[o,r]:P.slice(-2),[S,A]=n==="C"?[P[3],P[4]]:n==="S"?[P[1],P[2]]:[b,d]});let x=u-i,C=l-m;return{width:x,height:C,x:i,y:m,x2:u,y2:l,cx:i+x/2,cy:m+C/2,cz:Math.max(x,C)+Math.min(x,C)/2}},Ie=Tr;var Mr=t=>{let e=T(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,l=0,c=0;return M(e,(f,h,p,b)=>{[m]=f;let d=m.toUpperCase(),A=d!==m?_(f,h,p,b):f.slice(0),y=d==="V"?["L",p,A[1]]:d==="H"?["L",A[1],b]:A;[m]=y,"TQ".includes(d)||(a=0,i=0);if(m==="M")[,u,l]=y;else if(m==="L")c+=he(p,b,y[1],y[2]);else if(m==="A")c+=Ee(p,b,y[1],y[2],y[3],y[4],y[5],y[6],y[7]);else if(m==="S"){let g=n*2-r,x=o*2-s;c+=Ae(p,b,g,x,y[1],y[2],y[3],y[4])}else m==="C"?c+=Ae(p,b,y[1],y[2],y[3],y[4],y[5],y[6]):m==="T"?(a=n*2-a,i=o*2-i,c+=Ce(p,b,a,i,y[1],y[2])):m==="Q"?(a=y[1],i=y[2],c+=Ce(p,b,y[1],y[2],y[3],y[4])):m==="Z"&&(c+=he(p,b,u,l));[n,o]=m==="Z"?[u,l]:y.slice(-2),[r,s]=m==="C"?[y[3],y[4]]:m==="S"?[y[1],y[2]]:[n,o]}),c},K=Mr;var me=1e-5;var Lr=t=>{let e=T(t),n={...U};return M(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=Y(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},F=Lr;var vr=(t,e)=>{let n=F(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),l=typeof e=="number",c={x:m,y:u},f=0,h=c,p=0;return!l||e{[s]=b,o=s==="M",r=o?r:[S,A].concat(b.slice(1));if(o?([,m,u]=b,c={x:m,y:u},f=0):s==="L"?(c=De(r[0],r[1],r[2],r[3],e-p),f=he(r[0],r[1],r[2],r[3])):s==="A"?(c=pt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-p),f=Ee(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(c=bt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-p),f=Ae(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(c=gt(r[0],r[1],r[2],r[3],r[4],r[5],e-p),f=Ce(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],c={x:m,y:u},f=he(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),pp-me?{x:a,y:i}:h)},te=vr;var Nr=(t,e,n,o)=>{let[r]=t,{round:s}=O,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:l,y2:c,x:f,y:h}=n,[p,b]=i.slice(-2),d=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(v(f,a)===v(p,a))return["V",b];if(v(h,a)===v(b,a))return["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(v(S,a)===v(m*2-l,a)&&v(A,a)===v(u*2-c,a)||v(m,a)===v(l*2-f,a)&&v(u,a)===v(c*2-h,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&v(S,a)===v(m*2-l,a)&&v(A,a)===v(u*2-c,a))return["T",i[2],i[3]]}return d},$e=Nr;var wr=(t,e)=>{let n=t.slice(1).map(o=>v(o,e));return[t[0]].concat(n)},ie=wr;var kr=(t,e)=>{let n=X(t),o=typeof e=="number"&&e>=0?e:2,r={...U},s=[],a="M",i="Z";return M(n,(m,u,l,c)=>{r.x=l,r.y=c;let f=Y(m,r),h=m;if([a]=m,s[u]=a,u){i=s[u-1];let b=$e(m,f,r,i),d=ie(b,o),S=d.join(""),A=ce(b,u,l,c),y=ie(A,o),g=y.join("");h=S.length{let e=X(t),n=F(e),o=e.length,r=e[o-1][0]==="Z",s=M(e,(a,i)=>{let m=n[i],u=i&&e[i-1],l=u&&u[0],c=e[i+1],f=c&&c[0],[h]=a,[p,b]=n[i?i-1:o-1].slice(-2),d=a;switch(h){case"M":d=r?["Z"]:[h,p,b];break;case"A":d=[h,a[1],a[2],a[3],a[4],a[5]===1?0:1,p,b];break;case"C":c&&f==="S"?d=["S",a[1],a[2],p,b]:d=[h,a[3],a[4],a[1],a[2],p,b];break;case"S":l&&"CS".includes(l)&&(!c||f!=="S")?d=["C",m[3],m[4],m[1],m[2],p,b]:d=[h,m[1],m[2],p,b];break;case"Q":c&&f==="T"?d=["T",p,b]:d=[h,a[1],a[2],p,b];break;case"T":l&&"QT".includes(l)&&(!c||f!=="T")?d=["Q",m[1],m[2],p,b]:d=[h,p,b];break;case"Z":d=["M",p,b];break;case"H":d=[h,p];break;case"V":d=[h,b];break;default:d=[h].concat(a.slice(1,-2),p,b)}return d});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},ye=zr;var Rr=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...U};return t.forEach(u=>{let[l]=u,c=l.toUpperCase(),f=l.toLowerCase(),h=l===f,p=u.slice(1);c==="M"?(o+=1,[r,s]=p,r+=h?m.x:0,s+=h?m.y:0,a=r,i=s,n=[h?[c,a,i]:u]):(c==="Z"?(r=a,s=i):c==="H"?([,r]=u,r+=h?m.x:0):c==="V"?([,s]=u,s+=h?m.y:0):([r,s]=u.slice(-2),r+=h?m.x:0,s+=h?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},je=Rr;var yt=Ye(require("@thednp/dommatrix"),1),Vr=t=>{let e=new yt.default,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},He=Vr;var dt=Ye(require("@thednp/dommatrix"),1),Qr=(t,e)=>{let n=dt.default.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},qr=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=Qr(t,[e[0],e[1],0,1]),u=a-o,l=i-r,c=m-s;return[u*(Math.abs(s)/Math.abs(c)||1)+o,l*(Math.abs(s)/Math.abs(c)||1)+r]},Te=qr;var Dr=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=T(t),l=e&&Object.keys(e);if(!e||l&&!l.length)return u.slice(0);e.origin||Object.assign(e,{origin:O.origin});let c=e.origin,f=He(e);return f.isIdentity?u.slice(0):M(u,(h,p,b,d)=>{[m]=h;let S=m.toUpperCase(),y=S!==m?_(h,p,b,d):h.slice(0),g=S==="A"?["C"].concat(pe(b,d,y[1],y[2],y[3],y[4],y[5],y[6],y[7])):S==="V"?["L",b,y[1]]:S==="H"?["L",y[1],d]:y;m=g[0];let x=m==="C"&&g.length>7,C=x?g.slice(0,7):g.slice(0);if(x&&(u.splice(p+1,0,["C"].concat(g.slice(7))),g=C),m==="L"){[r,s]=Te(f,[g[1],g[2]],c);n!==r&&o!==s?g=["L",r,s]:o===s?g=["H",r]:n===r&&(g=["V",s])}else for(a=1,i=g.length;a{let n=T(t),o=n.slice(0),r=K(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=K(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=K(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:l})=>l<=e)},de=Er;var Or=(t,e)=>{let n=T(t),o=F(n),r=K(o),s=g=>{let x=g.x-e.x,C=g.y-e.y;return x*x+C*C},a=8,i,m={x:0,y:0},u=0,l=0,c=1/0;for(let g=0;g<=r;g+=a)i=te(o,g),u=s(i),u1e-6&&(p=l-a,f=te(o,p),d=s(f),b=l+a,h=te(o,b),S=s(h),p>=0&&dre(t,e).closest,xt=Ir;var $r=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,Br=t=>{let e=0,n=0,o=0;return ee(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=$r(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},Ge=Br;var jr=t=>Ge(ee(t))>=0,Pt=jr;var Hr=(t,e)=>de(t,e).segment,St=Hr;var Zr=(t,e)=>re(t,e).segment,At=Zr;var Gr=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return Z[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,ne=Gr;var _r=t=>ne(t)&&t.every(([e])=>e===e.toUpperCase()),_e=_r;var Ur=t=>_e(t)&&t.every(([e])=>"ACLMQZ".includes(e)),Ue=Ur;var Kr=t=>Ue(t)&&t.every(([e])=>"MC".includes(e)),Ct=Kr;var Fr=(t,e)=>{let{distance:n}=re(t,e);return Math.abs(n)ne(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),Mt=Jr;var Wr=t=>{if(typeof t!="string"||!t.length)return!1;let e=new W(t);for(G(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Fe=Yr;var en=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},tn=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},nn=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},on=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},an=t=>{let e=Object.keys(oe),n=Fe(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${w}: "${o}" is not SVGElement`);let r=n?o:t.type,s=oe[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=rn(a):r==="ellipse"?i=nn(a):["polyline","polygon"].includes(r)?i=tn(a):r==="rect"?i=on(a):r==="line"?i=en(a):["glyph","path"].includes(r)&&(i=T(n?t.getAttribute("d")||"":t.d||"")),ne(i)&&i.length?i:!1},Je=an;var sn=(t,e,n)=>{let o=n||document,r=Object.keys(oe),s=Fe(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${w}: "${a}" is already SVGPathElement`);if(a&&r.every(p=>a!==p))throw TypeError(`${w}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=oe[m],l={type:m},c=O.round,f=Je(t),h=f&&f.length?fe(f,c):"";return s?(u.forEach(p=>{l[p]=t.getAttribute(p)}),Object.values(t.attributes).forEach(({name:p,value:b})=>{u.includes(p)||i.setAttribute(p,b)})):(Object.assign(l,t),Object.keys(l).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,b=>`-${b.toLowerCase()}`),l[p])})),Ke(h)?(i.setAttribute("d",h),e&&s&&(t.before(i,t),t.remove()),i):!1},Lt=sn;var mn=t=>{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},vt=mn;var un=(t,e)=>{let{round:n}=O;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):M(t,o=>ie(o,n))},Nt=un;var ln=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=I(o,r,n),m=I(r,s,n),u=I(s,a,n),l=I(i,m,n),c=I(m,u,n),f=I(l,c,n);return[["C",i[0],i[1],l[0],l[1],f[0],f[1]],["C",c[0],c[1],u[0],u[1],a[0],a[1]]]},wt=ln;var st=class{constructor(e,n){let o=n||{},r=typeof e>"u";if(r||!e.length)throw TypeError(`${w}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=T(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=O.round;let m=O.origin;if(Array.isArray(a)&&a.length>=2){let[u,l,c]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(l)?0:l,Number.isNaN(c)?0:c]}return this.round=i,this.origin=m,this}get bbox(){return Ie(this.segments)}get length(){return K(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return te(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=X(e),this}toRelative(){let{segments:e}=this;return this.segments=Ve(e),this}toCurve(){let{segments:e}=this;return this.segments=ee(e),this}reverse(e){let{segments:n}=this,o=je(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?ye(i):i.slice(0):ye(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:ye(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=F(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=Be(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,l]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,l||s]}else a.origin=[o,r,s];return this.segments=Ze(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return fe(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}},cn=st;0&&(module.exports={CSSMatrix,absolutizeSegment,arcToCubic,distanceEpsilon,error,finalizeSegment,getClosestPoint,getDrawDirection,getPathArea,getPathBBox,getPointAtLength,getPropertiesAtLength,getPropertiesAtPoint,getSVGMatrix,getSegmentAtLength,getSegmentOfPoint,getTotalLength,invalidPathValue,isAbsoluteArray,isArcCommand,isCurveArray,isDigit,isDigitStart,isMoveCommand,isNormalizedArray,isPathArray,isPathCommand,isPointInStroke,isRelativeArray,isSpace,isValidPath,iterate,lineToCubic,normalizePath,normalizeSegment,optimizePath,paramsCount,paramsParser,parsePathString,pathParser,pathToAbsolute,pathToCurve,pathToRelative,pathToString,projection2d,quadToCubic,relativizeSegment,reverseCurve,reversePath,roundPath,roundSegment,scanFlag,scanParam,scanSegment,segmentToCubic,shapeParams,shapeToPath,shapeToPathArray,shortenSegment,skipSpaces,splitCubic,splitPath,transformPath}); +"use strict";var Ut=Object.create;var Je=Object.defineProperty;var Ft=Object.getOwnPropertyDescriptor;var Kt=Object.getOwnPropertyNames;var Jt=Object.getPrototypeOf,Wt=Object.prototype.hasOwnProperty;var Xt=(t,e)=>{for(var n in e)Je(t,n,{get:e[n],enumerable:!0})},Rt=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Kt(e))!Wt.call(t,r)&&r!==n&&Je(t,r,{get:()=>e[r],enumerable:!(o=Ft(e,r))||o.enumerable});return t};var We=(t,e,n)=>(n=t!=null?Ut(Jt(t)):{},Rt(e||!t||!t.__esModule?Je(n,"default",{value:t,enumerable:!0}):n,t)),Yt=t=>Rt(Je({},"__esModule",{value:!0}),t);var An={};Xt(An,{CSSMatrix:()=>_t.default,absolutizeSegment:()=>Z,arcToCubic:()=>ce,arcTools:()=>tt,bezierTools:()=>nt,cubicTools:()=>at,default:()=>Sn,distanceEpsilon:()=>se,distanceSquareRoot:()=>re,finalizeSegment:()=>ye,getClosestPoint:()=>ut,getDrawDirection:()=>lt,getPathArea:()=>Qe,getPathBBox:()=>_e,getPointAtLength:()=>me,getPropertiesAtLength:()=>pe,getPropertiesAtPoint:()=>X,getSVGMatrix:()=>$e,getSegmentAtLength:()=>ct,getSegmentOfPoint:()=>pt,getTotalLength:()=>K,invalidPathValue:()=>$,isAbsoluteArray:()=>De,isArcCommand:()=>Ve,isCurveArray:()=>ft,isDigit:()=>B,isDigitStart:()=>ze,isMoveCommand:()=>Re,isNormalizedArray:()=>Ee,isPathArray:()=>Y,isPathCommand:()=>we,isPointInStroke:()=>gt,isRelativeArray:()=>ht,isSpace:()=>Ne,isValidPath:()=>Oe,iterate:()=>T,lineToCubic:()=>Pe,lineTools:()=>Ye,midPoint:()=>E,normalizePath:()=>J,normalizeSegment:()=>W,optimizePath:()=>Ue,paramsCount:()=>j,paramsParser:()=>G,parsePathString:()=>L,pathParser:()=>F,pathToAbsolute:()=>oe,pathToCurve:()=>ae,pathToRelative:()=>Ge,pathToString:()=>xe,polygonTools:()=>it,projection2d:()=>Ae,quadToCubic:()=>ke,quadTools:()=>mt,relativizeSegment:()=>le,reverseCurve:()=>yt,reversePath:()=>Se,rotateVector:()=>ne,roundPath:()=>Pt,roundSegment:()=>ie,roundTo:()=>M,scanFlag:()=>Le,scanParam:()=>ve,scanSegment:()=>ue,segmentToCubic:()=>qe,shapeParams:()=>ee,shapeToPath:()=>dt,shapeToPathArray:()=>Ie,shortenSegment:()=>Be,skipSpaces:()=>H,splitCubic:()=>xt,splitPath:()=>Fe,transformPath:()=>Ke});module.exports=Yt(An);var Zt=We(require("@thednp/dommatrix"),1);var er=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},E=er;var tr=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),re=tr;var he=(t,e,n,o)=>re([t,e],[n,o]),je=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=re([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=E([t,e],[n,o],r/a);s={x:i,y:m}}}return s},Xe=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]},Ye={getLineBBox:Xe,getLineLength:he,getPointAtLineLength:je};var Tt=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},be=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),l=n*i(s),c=o*a(s);return[t+m*l-u*c,e+u*l+m*c]},Ct=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},et=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:l,cos:c,sqrt:f,PI:g}=Math,p=u(n),h=u(o),S=(r%360+360)%360*(g/180);if(t===i&&e===m)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||h===0)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,d=(e-m)/2,b={x:c(S)*A+l(S)*d,y:-l(S)*A+c(S)*d},P=b.x**2/p**2+b.y**2/h**2;P>1&&(p*=f(P),h*=f(P));let C=p**2*h**2-p**2*b.y**2-h**2*b.x**2,V=p**2*b.y**2+h**2*b.x**2,k=C/V;k=k<0?0:k;let w=(s!==a?1:-1)*f(k),v={x:w*(p*b.y/h),y:w*(-(h*b.x)/p)},_={x:c(S)*v.x-l(S)*v.y+(t+i)/2,y:l(S)*v.x+c(S)*v.y+(e+m)/2},fe={x:(b.x-v.x)/p,y:(b.y-v.y)/h},q=Ct({x:1,y:0},fe),x={x:(-b.x-v.x)/p,y:(-b.y-v.y)/h},Q=Ct(fe,x);!a&&Q>0?Q-=2*g:a&&Q<0&&(Q+=2*g),Q%=2*g;let U=q+Q;return{center:_,startAngle:q,endAngle:U,rx:p,ry:h}},He=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:l,startAngle:c,endAngle:f}=et(t,e,n,o,r,s,a,i,m);return Tt(u,l,f-c)},Mt=(t,e,n,o,r,s,a,i,m,u)=>{let l={x:t,y:e},{center:c,rx:f,ry:g,startAngle:p,endAngle:h}=et(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let y=Tt(f,g,h-p);if(u<=0)l={x:t,y:e};else if(u>=y)l={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||g===0)return je(t,e,i,m,u);let{PI:S,cos:A,sin:d}=Math,b=h-p,C=(r%360+360)%360*(S/180),V=p+b*(u/y),k=f*A(V),w=g*d(V);l={x:A(C)*k-d(C)*w+c.x,y:d(C)*k+A(C)*w+c.y}}}return l},Lt=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:l,ry:c,startAngle:f,endAngle:g}=et(t,e,n,o,r,s,a,i,m),p=g-f,{min:h,max:y,tan:S,atan2:A,PI:d}=Math,{x:b,y:P}=u,C=r*d/180,V=S(C),k=A(-c*V,l),w=k,v=k+d,_=A(c,l*V),fe=_+d,q=[i],x=[m],Q=h(t,i),U=y(t,i),O=h(e,m),te=y(e,m),Ce=g-p*1e-5,ge=be(b,P,l,c,C,Ce),N=g-p*.99999,D=be(b,P,l,c,C,N);if(ge[0]>U||D[0]>U){let z=be(b,P,l,c,C,w);q.push(z[0]),x.push(z[1])}if(ge[0]te||D[1]>te){let z=be(b,P,l,c,C,_);q.push(z[0]),x.push(z[1])}return Q=h.apply([],q),O=h.apply([],x),U=y.apply([],q),te=y.apply([],x),[Q,O,U,te]},tt={angleBetween:Ct,arcLength:Tt,arcPoint:be,getArcBBox:Lt,getArcLength:He,getArcProps:et,getPointAtArcLength:Mt};var vt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],kt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],qt=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,l=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,l=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+l*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+l*r[3].y,t:e}},Dt=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},Et=t=>{let n=vt.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oQt(n[0],o))},Ot=1e-8,Ze=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)0&&l<1){let f=t*(1-l)*(1-l)*(1-l)+e*3*(1-l)*(1-l)*l+n*3*(1-l)*l*l+o*l*l*l;fm&&(m=f)}}return[i,m]},nt={bezierLength:Et,calculateBezier:Dt,CBEZIER_MINMAX_EPSILON:Ot,computeBezier:Qt,Cvalues:kt,deriveBezier:qt,getBezierLength:de,minmaxC:rt,minmaxQ:Ze,Tvalues:vt};var It=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},Te=(t,e,n,o,r,s,a,i)=>de([t,e,n,o,r,s,a,i]),Nt=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",l={x:t,y:e};if(u){let c=de([t,e,n,o,r,s,a,i]);m<=0||(m>=c?l={x:a,y:i}:l=It([t,e,n,o,r,s,a,i],m/c))}return l},ot=(t,e,n,o,r,s,a,i)=>{let m=rt([t,n,r,a]),u=rt([e,o,s,i]);return[m[0],u[0],m[1],u[1]]},at={getCubicBBox:ot,getCubicLength:Te,getPointAtCubicLength:Nt,getPointAtCubicSegmentLength:It};var Bt=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},Me=(t,e,n,o,r,s)=>de([t,e,n,o,r,s]),wt=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=de([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=Bt([t,e,n,o,r,s],a/u))}return m},st=(t,e,n,o,r,s)=>{let a=Ze([t,n,r]),i=Ze([e,o,s]);return[a[0],i[0],a[1],i[1]]},mt={getPointAtQuadLength:wt,getPointAtQuadSegmentLength:Bt,getQuadBBox:st,getQuadLength:Me};var rr=t=>{let e=t.length,n=-1,o,r=t[e-1],s=0;for(;++nt.reduce((e,n,o)=>o?e+re(t[o-1],n):0,0),it={polygonArea:rr,polygonLength:nr};var or=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},ne=or;var ar=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},M=ar;var sr={origin:[0,0,0],round:4},I=sr;var mr={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},j=mr;var ir=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=j[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,j[n]))),!!j[n]););},ye=ir;var ur="SVGPathCommander Error",R=ur;var lr=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${R}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},Le=lr;var cr=t=>t>=48&&t<=57,B=cr;var pr="Invalid path value",$=pr;var fr=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${R}: ${$} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!B(u)&&u!==46){t.err=`${R}: ${$} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),Ne=gr;var hr=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},we=br;var dr=t=>B(t)||t===43||t===45||t===46,ze=dr;var yr=t=>(t|32)===97,Ve=yr;var Pr=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},Re=Pr;var xr=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=j[n[o].toLowerCase()];if(t.segmentStart=o,!we(s)){t.err=`${R}: ${$} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!Re(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${R}: ${$} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,H(t),t.data=[],!a){ye(t);return}for(;;){for(let m=a;m>0;m-=1){if(Ve(s)&&(m===3||m===4)?Le(t):ve(t),t.err.length)return;t.data.push(t.param),H(t),t.index=t.max||!ze(n.charCodeAt(t.index)))break}ye(t)},ue=xr;var F=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var Sr=t=>{if(typeof t!="string")return t.slice(0);let e=new F(t);for(H(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,l=0,c=0;for(let f=0;f{let e=L(t);return T(e,Z)},oe=Tr;var Mr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=L(t);return T(e,le)},Ge=Lr;var $t=(t,e,n,o,r,s,a,i,m,u)=>{let l=t,c=e,f=n,g=o,p=i,h=m,y=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],d,b,P,C,V;if(u)[b,P,C,V]=u;else{d=ne(l,c,-S),l=d.x,c=d.y,d=ne(p,h,-S),p=d.x,h=d.y;let N=(l-p)/2,D=(c-h)/2,z=N*N/(f*f)+D*D/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);let St=f*f,At=g*g,Vt=(s===a?-1:1)*Math.sqrt(Math.abs((St*At-St*D*D-At*N*N)/(St*D*D+At*N*N)));C=Vt*f*D/g+(l+p)/2,V=Vt*-g*N/f+(c+h)/2,b=Math.asin(((c-V)/g*10**9>>0)/10**9),P=Math.asin(((h-V)/g*10**9>>0)/10**9),b=lP&&(b-=Math.PI*2),!a&&P>b&&(P-=Math.PI*2)}let k=P-b;if(Math.abs(k)>y){let N=P,D=p,z=h;P=b+y*(a&&P>b?1:-1),p=C+f*Math.cos(P),h=V+g*Math.sin(P),A=$t(p,h,f,g,r,0,a,D,z,[P,N,C,V])}k=P-b;let w=Math.cos(b),v=Math.sin(b),_=Math.cos(P),fe=Math.sin(P),q=Math.tan(k/4),x=4/3*f*q,Q=4/3*g*q,U=[l,c],O=[l+x*v,c-Q*w],te=[p+x*fe,h-Q*_],Ce=[p,h];if(O[0]=2*U[0]-O[0],O[1]=2*U[1]-O[1],u)return[O[0],O[1],te[0],te[1],Ce[0],Ce[1]].concat(A);A=[O[0],O[1],te[0],te[1],Ce[0],Ce[1]].concat(A);let ge=[];for(let N=0,D=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},ke=vr;var Nr=(t,e,n,o)=>{let r=E([t,e],[n,o],.3333333333333333),s=E([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Pe=Nr;var wr=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(ce(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(ke(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Pe(a,i,r,s)):n==="Z"?["C"].concat(Pe(a,i,m,u)):t},qe=wr;var zr=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:l}=e,c=t.slice(1),f=c.map((g,p)=>g+(r?p%2?l:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=c.slice(0,-2).concat(c[5]+(r?u:0),c[6]+(r?l:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?l:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let g=s*2-i,p=a*2-m;return e.x1=g,e.y1=p,["C",g,p].concat(f)}else if(o==="T"){let g=s*2-(e.qx?e.qx:0),p=a*2-(e.qy?e.qy:0);return e.qx=g,e.qy=p,["Q",g,p].concat(f)}else if(o==="Q"){let[g,p]=f;return e.qx=g,e.qy=p,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},W=zr;var Vr={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},G=Vr;var Rr=t=>{let e={...G},n=L(t);return T(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=W(o,e),m=qe(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let l=m.length;return e.x1=+m[l-2],e.y1=+m[l-1],e.x2=+m[l-4]||e.x1,e.y2=+m[l-3]||e.y1,m})},ae=Rr;var kr=(t,e)=>{let n=t.length,{round:o}=I,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;a{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=L(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,l=-1/0,c=0,f=0,g=0,p=0,h=0,y=0,S=0,A=0,d=0,b=0;T(e,(V,k,w,v)=>{[n]=V;let _=n.toUpperCase(),q=_!==n?Z(V,k,w,v):V.slice(0),x=_==="V"?["L",w,q[1]]:_==="H"?["L",q[1],v]:q;[n]=x,"TQ".includes(_)||(d=0,b=0);if(n==="M")[,o,r]=x,c=o,f=r,g=o,p=r;else if(n==="L")[c,f,g,p]=Xe(w,v,x[1],x[2]);else if(n==="A")[c,f,g,p]=Lt(w,v,x[1],x[2],x[3],x[4],x[5],x[6],x[7]);else if(n==="S"){let Q=h*2-S,U=y*2-A;[c,f,g,p]=ot(w,v,Q,U,x[1],x[2],x[3],x[4])}else n==="C"?[c,f,g,p]=ot(w,v,x[1],x[2],x[3],x[4],x[5],x[6]):n==="T"?(d=h*2-d,b=y*2-b,[c,f,g,p]=st(w,v,d,b,x[1],x[2])):n==="Q"?(d=x[1],b=x[2],[c,f,g,p]=st(w,v,x[1],x[2],x[3],x[4])):n==="Z"&&([c,f,g,p]=Xe(w,v,o,r));i=a(c,i),m=a(f,m),u=s(g,u),l=s(p,l),[h,y]=n==="Z"?[o,r]:x.slice(-2),[S,A]=n==="C"?[x[3],x[4]]:n==="S"?[x[1],x[2]]:[h,y]});let P=u-i,C=l-m;return{width:P,height:C,x:i,y:m,x2:u,y2:l,cx:i+P/2,cy:m+C/2,cz:Math.max(P,C)+Math.min(P,C)/2}},_e=qr;var Qr=t=>{let e=L(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,l=0,c=0;return T(e,(f,g,p,h)=>{[m]=f;let y=m.toUpperCase(),A=y!==m?Z(f,g,p,h):f.slice(0),d=y==="V"?["L",p,A[1]]:y==="H"?["L",A[1],h]:A;[m]=d,"TQ".includes(y)||(a=0,i=0);if(m==="M")[,u,l]=d;else if(m==="L")c+=he(p,h,d[1],d[2]);else if(m==="A")c+=He(p,h,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(m==="S"){let b=n*2-r,P=o*2-s;c+=Te(p,h,b,P,d[1],d[2],d[3],d[4])}else m==="C"?c+=Te(p,h,d[1],d[2],d[3],d[4],d[5],d[6]):m==="T"?(a=n*2-a,i=o*2-i,c+=Me(p,h,a,i,d[1],d[2])):m==="Q"?(a=d[1],i=d[2],c+=Me(p,h,d[1],d[2],d[3],d[4])):m==="Z"&&(c+=he(p,h,u,l));[n,o]=m==="Z"?[u,l]:d.slice(-2),[r,s]=m==="C"?[d[3],d[4]]:m==="S"?[d[1],d[2]]:[n,o]}),c},K=Qr;var se=1e-5;var Dr=t=>{let e=L(t),n={...G};return T(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=W(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},J=Dr;var Er=(t,e)=>{let n=J(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),l=typeof e=="number",c={x:m,y:u},f=0,g=c,p=0;return!l||e{[s]=h,o=s==="M",r=o?r:[S,A].concat(h.slice(1));if(o?([,m,u]=h,c={x:m,y:u},f=0):s==="L"?(c=je(r[0],r[1],r[2],r[3],e-p),f=he(r[0],r[1],r[2],r[3])):s==="A"?(c=Mt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-p),f=He(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(c=Nt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-p),f=Te(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(c=wt(r[0],r[1],r[2],r[3],r[4],r[5],e-p),f=Me(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],c={x:m,y:u},f=he(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),pp-se?{x:a,y:i}:g)},me=Er;var Or=(t,e)=>{let n=L(t),o=n.slice(0),r=K(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=K(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=K(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:l})=>l<=e)},pe=Or;var Ir=(t,e)=>{let n=L(t),o=J(n),r=K(o),s=b=>{let P=b.x-e.x,C=b.y-e.y;return P*P+C*C},a=8,i,m={x:0,y:0},u=0,l=0,c=1/0;for(let b=0;b<=r;b+=a)i=me(o,b),u=s(i),u1e-6&&(p=l-a,f=me(o,p),y=s(f),h=l+a,g=me(o,h),S=s(g),p>=0&&yX(t,e).closest,ut=Br;var $r=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,jr=t=>{let e=0,n=0,o=0;return ae(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=$r(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},Qe=jr;var Hr=t=>Qe(ae(t))>=0,lt=Hr;var Zr=(t,e)=>pe(t,e).segment,ct=Zr;var Gr=(t,e)=>X(t,e).segment,pt=Gr;var _r=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return j[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,Y=_r;var Ur=t=>Y(t)&&t.every(([e])=>e===e.toUpperCase()),De=Ur;var Fr=t=>De(t)&&t.every(([e])=>"ACLMQZ".includes(e)),Ee=Fr;var Kr=t=>Ee(t)&&t.every(([e])=>"MC".includes(e)),ft=Kr;var Jr=(t,e)=>{let{distance:n}=X(t,e);return Math.abs(n)Y(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),ht=Wr;var Xr=t=>{if(typeof t!="string"||!t.length)return!1;let e=new F(t);for(H(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,bt=en;var tn=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},rn=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},on=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},an=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},sn=t=>{let e=Object.keys(ee),n=bt(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${R}: "${o}" is not SVGElement`);let r=n?o:t.type,s=ee[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=nn(a):r==="ellipse"?i=on(a):["polyline","polygon"].includes(r)?i=rn(a):r==="rect"?i=an(a):r==="line"?i=tn(a):["glyph","path"].includes(r)&&(i=L(n?t.getAttribute("d")||"":t.d||"")),Y(i)&&i.length?i:!1},Ie=sn;var mn=(t,e,n)=>{let o=n||document,r=Object.keys(ee),s=bt(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${R}: "${a}" is already SVGPathElement`);if(a&&r.every(p=>a!==p))throw TypeError(`${R}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=ee[m],l={type:m},c=I.round,f=Ie(t),g=f&&f.length?xe(f,c):"";return s?(u.forEach(p=>{l[p]=t.getAttribute(p)}),Object.values(t.attributes).forEach(({name:p,value:h})=>{u.includes(p)||i.setAttribute(p,h)})):(Object.assign(l,t),Object.keys(l).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`),l[p])})),Oe(g)?(i.setAttribute("d",g),e&&s&&(t.before(i,t),t.remove()),i):!1},dt=mn;var un=(t,e,n,o)=>{let[r]=t,{round:s}=I,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:l,y2:c,x:f,y:g}=n,[p,h]=i.slice(-2),y=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(M(f,a)===M(p,a))return["V",h];if(M(g,a)===M(h,a))return["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(M(S,a)===M(m*2-l,a)&&M(A,a)===M(u*2-c,a)||M(m,a)===M(l*2-f,a)&&M(u,a)===M(c*2-g,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&M(S,a)===M(m*2-l,a)&&M(A,a)===M(u*2-c,a))return["T",i[2],i[3]]}return y},Be=un;var ln=(t,e)=>{let n=t.slice(1).map(o=>M(o,e));return[t[0]].concat(n)},ie=ln;var cn=(t,e)=>{let n=oe(t),o=typeof e=="number"&&e>=0?e:2,r={...G},s=[],a="M",i="Z";return T(n,(m,u,l,c)=>{r.x=l,r.y=c;let f=W(m,r),g=m;if([a]=m,s[u]=a,u){i=s[u-1];let h=Be(m,f,r,i),y=ie(h,o),S=y.join(""),A=le(h,u,l,c),d=ie(A,o),b=d.join("");g=S.length{let e=oe(t),n=J(e),o=e.length,r=e[o-1][0]==="Z",s=T(e,(a,i)=>{let m=n[i],u=i&&e[i-1],l=u&&u[0],c=e[i+1],f=c&&c[0],[g]=a,[p,h]=n[i?i-1:o-1].slice(-2),y=a;switch(g){case"M":y=r?["Z"]:[g,p,h];break;case"A":y=[g,a[1],a[2],a[3],a[4],a[5]===1?0:1,p,h];break;case"C":c&&f==="S"?y=["S",a[1],a[2],p,h]:y=[g,a[3],a[4],a[1],a[2],p,h];break;case"S":l&&"CS".includes(l)&&(!c||f!=="S")?y=["C",m[3],m[4],m[1],m[2],p,h]:y=[g,m[1],m[2],p,h];break;case"Q":c&&f==="T"?y=["T",p,h]:y=[g,a[1],a[2],p,h];break;case"T":l&&"QT".includes(l)&&(!c||f!=="T")?y=["Q",m[1],m[2],p,h]:y=[g,p,h];break;case"Z":y=["M",p,h];break;case"H":y=[g,p];break;case"V":y=[g,h];break;default:y=[g].concat(a.slice(1,-2),p,h)}return y});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},Se=pn;var fn=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...G};return t.forEach(u=>{let[l]=u,c=l.toUpperCase(),f=l.toLowerCase(),g=l===f,p=u.slice(1);c==="M"?(o+=1,[r,s]=p,r+=g?m.x:0,s+=g?m.y:0,a=r,i=s,n=[g?[c,a,i]:u]):(c==="Z"?(r=a,s=i):c==="H"?([,r]=u,r+=g?m.x:0):c==="V"?([,s]=u,s+=g?m.y:0):([r,s]=u.slice(-2),r+=g?m.x:0,s+=g?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},Fe=fn;var jt=We(require("@thednp/dommatrix"),1),gn=t=>{let e=new jt.default,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},$e=gn;var Ht=We(require("@thednp/dommatrix"),1),hn=(t,e)=>{let n=Ht.default.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},bn=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=hn(t,[e[0],e[1],0,1]),u=a-o,l=i-r,c=m-s;return[u*(Math.abs(s)/Math.abs(c)||1)+o,l*(Math.abs(s)/Math.abs(c)||1)+r]},Ae=bn;var dn=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=L(t),l=e&&Object.keys(e);if(!e||l&&!l.length)return u.slice(0);e.origin||Object.assign(e,{origin:I.origin});let c=e.origin,f=$e(e);return f.isIdentity?u.slice(0):T(u,(g,p,h,y)=>{[m]=g;let S=m.toUpperCase(),d=S!==m?Z(g,p,h,y):g.slice(0),b=S==="A"?["C"].concat(ce(h,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):S==="V"?["L",h,d[1]]:S==="H"?["L",d[1],y]:d;m=b[0];let P=m==="C"&&b.length>7,C=P?b.slice(0,7):b.slice(0);if(P&&(u.splice(p+1,0,["C"].concat(b.slice(7))),b=C),m==="L"){[r,s]=Ae(f,[b[1],b[2]],c);n!==r&&o!==s?b=["L",r,s]:o===s?b=["H",r]:n===r&&(b=["V",s])}else for(a=1,i=b.length;a{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},yt=yn;var Pn=(t,e)=>{let{round:n}=I;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):T(t,o=>ie(o,n))},Pt=Pn;var xn=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=E(o,r,n),m=E(r,s,n),u=E(s,a,n),l=E(i,m,n),c=E(m,u,n),f=E(l,c,n);return[["C",i[0],i[1],l[0],l[1],f[0],f[1]],["C",c[0],c[1],u[0],u[1],a[0],a[1]]]},xt=xn;var zt=class{constructor(e,n){let o=n||{},r=typeof e>"u";if(r||!e.length)throw TypeError(`${R}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=L(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=I.round;let m=I.origin;if(Array.isArray(a)&&a.length>=2){let[u,l,c]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(l)?0:l,Number.isNaN(c)?0:c]}return this.round=i,this.origin=m,this}get bbox(){return _e(this.segments)}get length(){return K(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return me(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=oe(e),this}toRelative(){let{segments:e}=this;return this.segments=Ge(e),this}toCurve(){let{segments:e}=this;return this.segments=ae(e),this}reverse(e){let{segments:n}=this,o=Fe(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?Se(i):i.slice(0):Se(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:Se(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=J(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=Ue(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,l]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,l||s]}else a.origin=[o,r,s];return this.segments=Ke(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return xe(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}static get CSSMatrix(){return Zt.default}static get arcTools(){return tt}static get bezierTools(){return nt}static get cubicTools(){return at}static get lineTools(){return Ye}static get polygonTools(){return it}static get quadTools(){return mt}static get pathToAbsolute(){return oe}static get pathToRelative(){return Ge}static get pathToCurve(){return ae}static get pathToString(){return xe}static get distanceSquareRoot(){return re}static get midPoint(){return E}static get rotateVector(){return ne}static get roundTo(){return M}static get parsePathString(){return L}static get finalizeSegment(){return ye}static get invalidPathValue(){return $}static get isArcCommand(){return Ve}static get isDigit(){return B}static get isDigitStart(){return ze}static get isMoveCommand(){return Re}static get isPathCommand(){return we}static get isSpace(){return Ne}static get paramsCount(){return j}static get paramsParser(){return G}static get pathParser(){return F}static get scanFlag(){return Le}static get scanParam(){return ve}static get scanSegment(){return ue}static get skipSpaces(){return H}static get distanceEpsilon(){return se}static get getClosestPoint(){return ut}static get getDrawDirection(){return lt}static get getPathArea(){return Qe}static get getPathBBox(){return _e}static get getPointAtLength(){return me}static get getPropertiesAtLength(){return pe}static get getPropertiesAtPoint(){return X}static get getSegmentAtLength(){return ct}static get getSegmentOfPoint(){return pt}static get getTotalLength(){return K}static get isAbsoluteArray(){return De}static get isCurveArray(){return ft}static get isNormalizedArray(){return Ee}static get isPathArray(){return Y}static get isPointInStroke(){return gt}static get isRelativeArray(){return ht}static get isValidPath(){return Oe}static get shapeParams(){return ee}static get shapeToPath(){return dt}static get shapeToPathArray(){return Ie}static get absolutizeSegment(){return Z}static get arcToCubic(){return ce}static get getSVGMatrix(){return $e}static get iterate(){return T}static get lineToCubic(){return Pe}static get normalizePath(){return J}static get normalizeSegment(){return W}static get optimizePath(){return Ue}static get projection2d(){return Ae}static get quadToCubic(){return ke}static get relativizeSegment(){return le}static get reverseCurve(){return yt}static get reversePath(){return Se}static get roundPath(){return Pt}static get roundSegment(){return ie}static get segmentToCubic(){return qe}static get shortenSegment(){return Be}static get splitCubic(){return xt}static get splitPath(){return Fe}static get transformPath(){return Ke}},Gt=zt;var _t=We(require("@thednp/dommatrix"),1),Sn=Gt;0&&(module.exports={CSSMatrix,absolutizeSegment,arcToCubic,arcTools,bezierTools,cubicTools,distanceEpsilon,distanceSquareRoot,finalizeSegment,getClosestPoint,getDrawDirection,getPathArea,getPathBBox,getPointAtLength,getPropertiesAtLength,getPropertiesAtPoint,getSVGMatrix,getSegmentAtLength,getSegmentOfPoint,getTotalLength,invalidPathValue,isAbsoluteArray,isArcCommand,isCurveArray,isDigit,isDigitStart,isMoveCommand,isNormalizedArray,isPathArray,isPathCommand,isPointInStroke,isRelativeArray,isSpace,isValidPath,iterate,lineToCubic,lineTools,midPoint,normalizePath,normalizeSegment,optimizePath,paramsCount,paramsParser,parsePathString,pathParser,pathToAbsolute,pathToCurve,pathToRelative,pathToString,polygonTools,projection2d,quadToCubic,quadTools,relativizeSegment,reverseCurve,reversePath,rotateVector,roundPath,roundSegment,roundTo,scanFlag,scanParam,scanSegment,segmentToCubic,shapeParams,shapeToPath,shapeToPathArray,shortenSegment,skipSpaces,splitCubic,splitPath,transformPath}); //# sourceMappingURL=svg-path-commander.cjs.map \ No newline at end of file diff --git a/dist/svg-path-commander.cjs.map b/dist/svg-path-commander.cjs.map index 7719121..192d5da 100644 --- a/dist/svg-path-commander.cjs.map +++ b/dist/svg-path-commander.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/index.ts","../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/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/math/rotateVector.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/math/midPoint.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/math/roundTo.ts","../src/convert/pathToString.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/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.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/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/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\n// import CSSMatrix from \"@thednp/dommatrix\";\n// import { arcTools } from \"./math/arcTools\";\n// import { bezierTools } from \"./math/bezier\";\n// import { cubicTools } from \"./math/cubicTools\";\n// import { lineTools } from \"./math/lineTools\";\n// import { quadTools } from \"./math/quadTools\";\n// import { polygonTools } from \"./math/polygonTools\";\n\n// import distanceSquareRoot from \"./math/distanceSquareRoot\";\n// import midPoint from \"./math/midPoint\";\n// import rotateVector from \"./math/rotateVector\";\n// import roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\n\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\n// import finalizeSegment from \"./parser/finalizeSegment\";\n// import invalidPathValue from \"./parser/invalidPathValue\";\n// import isArcCommand from \"./parser/isArcCommand\";\n// import isDigit from \"./parser/isDigit\";\n// import isDigitStart from \"./parser/isDigitStart\";\n// import isMoveCommand from \"./parser/isMoveCommand\";\n// import isPathCommand from \"./parser/isPathCommand\";\n// import isSpace from \"./parser/isSpace\";\n// import paramsCount from \"./parser/paramsCount\";\n// import paramsParser from \"./parser/paramsParser\";\n// import pathParser from \"./parser/pathParser\";\n// import scanFlag from \"./parser/scanFlag\";\n// import scanParam from \"./parser/scanParam\";\n// import scanSegment from \"./parser/scanSegment\";\n// import skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\n// import distanceEpsilon from \"./util/distanceEpsilon\";\n// import getClosestPoint from \"./util/getClosestPoint\";\n// import getDrawDirection from \"./util/getDrawDirection\";\n// import getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\n// import getPropertiesAtLength from \"./util/getPropertiesAtLength\";\n// import getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\n// import getSegmentAtLength from \"./util/getSegmentAtLength\";\n// import getSegmentOfPoint from \"./util/getSegmentOfPoint\";\n// import isAbsoluteArray from \"./util/isAbsoluteArray\";\n// import isCurveArray from \"./util/isCurveArray\";\n// import isNormalizedArray from \"./util/isNormalizedArray\";\n// import isPathArray from \"./util/isPathArray\";\n// import isPointInStroke from \"./util/isPointInStroke\";\n// import isRelativeArray from \"./util/isRelativeArray\";\n// import isValidPath from \"./util/isValidPath\";\n// import shapeParams from \"./util/shapeParams\";\n// import shapeToPath from \"./util/shapeToPath\";\n// import shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\n// import absolutizeSegment from \"./process/absolutizeSegment\";\n// import arcToCubic from \"./process/arcToCubic\";\n// import getSVGMatrix from \"./process/getSVGMatrix\";\n// import iterate from \"./process/iterate\";\n// import lineToCubic from \"./process/lineToCubic\";\n// import normalizeSegment from \"./process/normalizeSegment\";\n// import projection2d from \"./process/projection2d\";\n// import quadToCubic from \"./process/quadToCubic\";\n// import relativizeSegment from \"./process/relativizeSegment\";\n// import reverseCurve from \"./process/reverseCurve\";\n// import roundPath from \"./process/roundPath\";\n// import roundSegment from \"./process/roundSegment\";\n// import segmentToCubic from \"./process/segmentToCubic\";\n// import shortenSegment from \"./process/shortenSegment\";\n// import splitCubic from \"./process/splitCubic\";\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 \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) {\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 * @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 * @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 * @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 * @param onlySubpath option to reverse all sub-paths except first\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 * @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 * @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 refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\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 * @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 * @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 * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n // static get CSSMatrix() {\n // return CSSMatrix;\n // }\n // static get arcTools() {\n // return arcTools;\n // }\n // static get bezierTools() {\n // return bezierTools;\n // }\n\n // static get cubicTools() {\n // return cubicTools;\n // }\n // static get lineTools() {\n // return lineTools;\n // }\n // static get polygonTools() {\n // return polygonTools;\n // }\n // static get quadTools() {\n // return quadTools;\n // }\n // static get pathToAbsolute() {\n // return pathToAbsolute;\n // }\n // static get pathToRelative() {\n // return pathToRelative;\n // }\n // static get pathToCurve() {\n // return pathToCurve;\n // }\n // static get pathToString() {\n // return pathToString;\n // }\n // static get distanceSquareRoot() {\n // return distanceSquareRoot;\n // }\n // static get midPoint() {\n // return midPoint;\n // }\n // static get rotateVector() {\n // return rotateVector;\n // }\n // static get roundTo() {\n // return roundTo;\n // }\n // static get parsePathString() {\n // return parsePathString;\n // }\n // static get finalizeSegment() {\n // return finalizeSegment;\n // }\n // static get invalidPathValue() {\n // return invalidPathValue;\n // }\n // static get isArcCommand() {\n // return isArcCommand;\n // }\n // static get isDigit() {\n // return isDigit;\n // }\n // static get isDigitStart() {\n // return isDigitStart;\n // }\n // static get isMoveCommand() {\n // return isMoveCommand;\n // }\n // static get isPathCommand() {\n // return isPathCommand;\n // }\n // static get isSpace() {\n // return isSpace;\n // }\n // static get paramsCount() {\n // return paramsCount;\n // }\n // static get paramsParser() {\n // return paramsParser;\n // }\n // static get pathParser() {\n // return pathParser;\n // }\n // static get scanFlag() {\n // return scanFlag;\n // }\n // static get scanParam() {\n // return scanParam;\n // }\n // static get scanSegment() {\n // return scanSegment;\n // }\n // static get skipSpaces() {\n // return skipSpaces;\n // }\n // static get distanceEpsilon() {\n // return distanceEpsilon;\n // }\n // static get getClosestPoint() {\n // return getClosestPoint;\n // }\n // static get getDrawDirection() {\n // return getDrawDirection;\n // }\n // static get getPathArea() {\n // return getPathArea;\n // }\n // static get getPathBBox() {\n // return getPathBBox;\n // }\n // static get getPointAtLength() {\n // return getPointAtLength;\n // }\n // static get getPropertiesAtLength() {\n // return getPropertiesAtLength;\n // }\n // static get getPropertiesAtPoint() {\n // return getPropertiesAtPoint;\n // }\n // static get getSegmentAtLength() {\n // return getSegmentAtLength;\n // }\n // static get getSegmentOfPoint() {\n // return getSegmentOfPoint;\n // }\n // static get getTotalLength() {\n // return getTotalLength;\n // }\n // static get isAbsoluteArray() {\n // return isAbsoluteArray;\n // }\n // static get isCurveArray() {\n // return isCurveArray;\n // }\n // static get isNormalizedArray() {\n // return isNormalizedArray;\n // }\n // static get isPathArray() {\n // return isPathArray;\n // }\n // static get isPointInStroke() {\n // return isPointInStroke;\n // }\n // static get isRelativeArray() {\n // return isRelativeArray;\n // }\n // static get isValidPath() {\n // return isValidPath;\n // }\n // static get shapeParams() {\n // return shapeParams;\n // }\n // static get shapeToPath() {\n // return shapeToPath;\n // }\n // static get shapeToPathArray() {\n // return shapeToPathArray;\n // }\n // static get absolutizeSegment() {\n // return absolutizeSegment;\n // }\n // static get arcToCubic() {\n // return arcToCubic;\n // }\n // static get getSVGMatrix() {\n // return getSVGMatrix;\n // }\n // static get iterate() {\n // return iterate;\n // }\n // static get lineToCubic() {\n // return lineToCubic;\n // }\n // static get normalizePath() {\n // return normalizePath;\n // }\n // static get normalizeSegment() {\n // return normalizeSegment;\n // }\n // static get optimizePath() {\n // return optimizePath;\n // }\n // static get projection2d() {\n // return projection2d;\n // }\n // static get quadToCubic() {\n // return quadToCubic;\n // }\n // static get relativizeSegment() {\n // return relativizeSegment;\n // }\n // static get reverseCurve() {\n // return reverseCurve;\n // }\n // static get reversePath() {\n // return reversePath;\n // }\n // static get roundPath() {\n // return roundPath;\n // }\n // static get roundSegment() {\n // return roundSegment;\n // }\n // static get segmentToCubic() {\n // return segmentToCubic;\n // }\n // static get shortenSegment() {\n // return shortenSegment;\n // }\n // static get splitCubic() {\n // return splitCubic;\n // }\n // static get splitPath() {\n // return splitPath;\n // }\n // static get transformPath() {\n // return transformPath;\n // }\n}\n\n// export {\n// absolutizeSegment,\n// arcToCubic,\n// arcTools,\n// bezierTools,\n// CSSMatrix,\n// cubicTools,\n// distanceEpsilon,\n// distanceSquareRoot,\n// finalizeSegment,\n// getClosestPoint,\n// getDrawDirection,\n// getPathArea,\n// getPathBBox,\n// getPointAtLength,\n// getPropertiesAtLength,\n// getPropertiesAtPoint,\n// getSegmentAtLength,\n// getSegmentOfPoint,\n// getSVGMatrix,\n// getTotalLength,\n// invalidPathValue,\n// isAbsoluteArray,\n// isArcCommand,\n// isCurveArray,\n// isDigit,\n// isDigitStart,\n// isMoveCommand,\n// isNormalizedArray,\n// isPathArray,\n// isPathCommand,\n// isPointInStroke,\n// isRelativeArray,\n// isSpace,\n// isValidPath,\n// iterate,\n// lineToCubic,\n// lineTools,\n// midPoint,\n// normalizePath,\n// normalizeSegment,\n// optimizePath,\n// paramsCount,\n// paramsParser,\n// parsePathString,\n// pathParser,\n// pathToAbsolute,\n// pathToCurve,\n// pathToRelative,\n// pathToString,\n// polygonTools,\n// projection2d,\n// quadToCubic,\n// quadTools,\n// relativizeSegment,\n// reverseCurve,\n// reversePath,\n// rotateVector,\n// roundPath,\n// roundSegment,\n// roundTo,\n// scanFlag,\n// scanParam,\n// scanSegment,\n// segmentToCubic,\n// shapeParams,\n// shapeToPath,\n// shapeToPathArray,\n// shortenSegment,\n// skipSpaces,\n// splitCubic,\n// splitPath,\n// transformPath,\n// };\n\nexport { default as CSSMatrix} from \"@thednp/dommatrix\";\nexport { default as pathToAbsolute} from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative} from \"./convert/pathToRelative\";\nexport { default as pathToCurve} from \"./convert/pathToCurve\";\nexport { default as pathToString} from \"./convert/pathToString\";\n\nexport { default as error} from \"./parser/error\";\nexport { default as parsePathString} from \"./parser/parsePathString\";\nexport { default as finalizeSegment} from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue} from \"./parser/invalidPathValue\";\nexport { default as isArcCommand} from \"./parser/isArcCommand\";\nexport { default as isDigit} from \"./parser/isDigit\";\nexport { default as isDigitStart} from \"./parser/isDigitStart\";\nexport { default as isMoveCommand} from \"./parser/isMoveCommand\";\nexport { default as isPathCommand} from \"./parser/isPathCommand\";\nexport { default as isSpace} from \"./parser/isSpace\";\nexport { default as paramsCount} from \"./parser/paramsCount\";\nexport { default as paramsParser} from \"./parser/paramsParser\";\nexport { default as pathParser} from \"./parser/pathParser\";\nexport { default as scanFlag} from \"./parser/scanFlag\";\nexport { default as scanParam} from \"./parser/scanParam\";\nexport { default as scanSegment} from \"./parser/scanSegment\";\nexport { default as skipSpaces} from \"./parser/skipSpaces\";\nexport { default as getPathBBox} from \"./util/getPathBBox\";\nexport { default as getTotalLength} from \"./util/getTotalLength\";\nexport { default as distanceEpsilon} from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint} from \"./util/getClosestPoint\";\nexport { default as getDrawDirection} from \"./util/getDrawDirection\";\nexport { default as getPathArea} from \"./util/getPathArea\";\nexport { default as getPointAtLength} from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength} from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint} from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength} from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint} from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray} from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray} from \"./util/isCurveArray\";\nexport { default as isNormalizedArray} from \"./util/isNormalizedArray\";\nexport { default as isPathArray} from \"./util/isPathArray\";\nexport { default as isPointInStroke} from \"./util/isPointInStroke\";\nexport { default as isRelativeArray} from \"./util/isRelativeArray\";\nexport { default as isValidPath} from \"./util/isValidPath\";\nexport { default as shapeParams} from \"./util/shapeParams\";\nexport { default as shapeToPath} from \"./util/shapeToPath\";\nexport { default as shapeToPathArray} from \"./util/shapeToPathArray\";\nexport { default as normalizePath} from \"./process/normalizePath\";\nexport { default as optimizePath} from \"./process/optimizePath\";\nexport { default as reversePath} from \"./process/reversePath\";\nexport { default as splitPath} from \"./process/splitPath\";\nexport { default as transformPath} from \"./process/transformPath\";\nexport { default as absolutizeSegment} from \"./process/absolutizeSegment\";\nexport { default as arcToCubic} from \"./process/arcToCubic\";\nexport { default as getSVGMatrix} from \"./process/getSVGMatrix\";\nexport { default as iterate} from \"./process/iterate\";\nexport { default as lineToCubic} from \"./process/lineToCubic\";\nexport { default as normalizeSegment} from \"./process/normalizeSegment\";\nexport { default as projection2d} from \"./process/projection2d\";\nexport { default as quadToCubic} from \"./process/quadToCubic\";\nexport { default as relativizeSegment} from \"./process/relativizeSegment\";\nexport { default as reverseCurve} from \"./process/reverseCurve\";\nexport { default as roundPath} from \"./process/roundPath\";\nexport {default as roundSegment} from \"./process/roundSegment\";\nexport { default as segmentToCubic} from \"./process/segmentToCubic\";\nexport {default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic} from \"./process/splitCubic\";\n\nexport default SVGPathCommander;\n \n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\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\nexport default paramsCount;\n","import paramsCount 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 */\nconst 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 >= paramsCount[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, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./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 */\nconst 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\nexport default scanFlag;\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 */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./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 */\nconst 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};\nexport default scanParam;\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\nconst 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};\nexport default isSpace;\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 */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\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 */\nconst 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};\nexport default isPathCommand;\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 */\nconst 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};\nexport default isDigitStart;\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 */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst 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};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts 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 \"./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 */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[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) && 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 && 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};\nexport default scanSegment;\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\n */\nexport default 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 * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\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\nexport default parsePathString;\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 */\nconst 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};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n 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 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 if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\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 | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\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 */\nconst 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\nexport default relativizeSegment;\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 | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\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 */\nconst 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\nexport default rotateVector;\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 * @return the resulting cubic-bezier segment(s)\n */\nconst 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};\nexport default arcToCubic;\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 */\nconst 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};\nexport default quadToCubic;\n","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 */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\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 */\nconst 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};\nexport default lineToCubic;\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 */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\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\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\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, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\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 */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\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};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\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\nexport default paramsParser;\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 value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\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 });\n};\nexport default pathToCurve;\n","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\nexport default roundTo;\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\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\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 : /* istanbul ignore next @preserve */ \"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\nexport default pathToString;\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 */\nconst 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\nexport default distanceSquareRoot;\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 * @param distance the distance to point in [0-1] range\n * @returns the extrema 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 a [0-1] ratio\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 { 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 boundig 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) => {\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]] as [\n number,\n number,\n number,\n number,\n ];\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 boundig 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 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\nconst getPathBBox = (pathInput: PathArray | 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\nexport default getPathBBox;\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 shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\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\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\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 });\n};\nexport default normalizePath;\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 of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\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 // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\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\nexport default getPointAtLength;\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 */\nconst 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\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\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\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } 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` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\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 : /* istanbul ignore next @preserve */ 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 = seg;\n [pathCommand] = seg;\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\nexport default optimizePath;\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` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\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;\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]) as PathSegment;\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 ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"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] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"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] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\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 PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\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 ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\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 `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst 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};\nexport default getSVGMatrix;\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 * @return 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 */\nconst 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};\nexport default projection2d;\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` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\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 let pathCommand = \"M\";\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 typeof path;\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 typeof path;\n\n return 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 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)) 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(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\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 });\n};\n\nexport default transformPath;\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 */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\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 PathArray;\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 PathArray;\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(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\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 */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\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\nexport default getPropertiesAtPoint;\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 */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\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 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 length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\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};\nexport default getPathArea;\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 */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\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 */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\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 */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount 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 */\nconst 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 paramsCount[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};\nexport default isPathArray;\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 */\nconst 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};\nexport default isAbsoluteArray;\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 are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst 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};\nexport default isNormalizedArray;\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 */\nconst 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};\nexport default isCurveArray;\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 */\nconst isPointInStroke = (\n pathInput: string | PathArray,\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};\nexport default isPointInStroke;\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 */\nconst 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};\nexport default isRelativeArray;\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 */\nconst 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};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst 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\nexport default shapeParams;\n","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\nexport default isElement;\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 \"../parser/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\n * @returns a new line `pathArray`\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` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\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 (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\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\n * @return an ellipse `pathArray`\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` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\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 ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\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) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\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};\nexport default shapeToPathArray;\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 \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. 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 `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst 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;\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 Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\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\nexport default shapeToPath;\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 */\nconst 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\nexport default reverseCurve;\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 */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\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 : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["src_exports","__export","absolutizeSegment_default","arcToCubic_default","src_default","distanceEpsilon_default","error_default","finalizeSegment_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPathBBox_default","getPointAtLength_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSVGMatrix_default","getSegmentAtLength_default","getSegmentOfPoint_default","getTotalLength_default","invalidPathValue_default","isAbsoluteArray_default","isArcCommand_default","isCurveArray_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isNormalizedArray_default","isPathArray_default","isPathCommand_default","isPointInStroke_default","isRelativeArray_default","isSpace_default","isValidPath_default","iterate_default","lineToCubic_default","normalizePath_default","normalizeSegment_default","optimizePath_default","paramsCount_default","paramsParser_default","parsePathString_default","PathParser","pathToAbsolute_default","pathToCurve_default","pathToRelative_default","pathToString_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","reversePath_default","roundPath_default","roundSegment_default","scanFlag_default","scanParam_default","scanSegment_default","segmentToCubic_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","shortenSegment_default","skipSpaces_default","splitCubic_default","splitPath_default","transformPath_default","__toCommonJS","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","roundTo","n","round","pow","roundTo_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","import_dommatrix","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","import_dommatrix","translatePoint","cssm","v","m","CSSMatrix","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","import_dommatrix","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","src_default"]} \ No newline at end of file +{"version":3,"sources":["../src/index.ts","../src/main.ts","../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/parser/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/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.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/process/splitCubic.ts"],"sourcesContent":["\"use strict\";\n\nimport SVGPathCommander from \"./main\";\n\nexport default SVGPathCommander;\n\nexport { default as CSSMatrix } from \"@thednp/dommatrix\";\nexport { arcTools } from \"./math/arcTools\";\nexport { bezierTools } from \"./math/bezier\";\nexport { cubicTools } from \"./math/cubicTools\";\nexport { lineTools } from \"./math/lineTools\";\nexport { quadTools } from \"./math/quadTools\";\nexport { polygonTools } from \"./math/polygonTools\";\n\nexport { default as distanceSquareRoot } from \"./math/distanceSquareRoot\";\nexport { default as midPoint } from \"./math/midPoint\";\nexport { default as rotateVector } from \"./math/rotateVector\";\nexport { default as roundTo } from \"./math/roundTo\";\n\nexport * from \"./types\";\nexport * from \"./interface\";\n\nexport { default as pathToAbsolute } from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative } from \"./convert/pathToRelative\";\nexport { default as pathToCurve } from \"./convert/pathToCurve\";\nexport { default as pathToString } from \"./convert/pathToString\";\n\nexport { default as parsePathString } from \"./parser/parsePathString\";\nexport { default as finalizeSegment } from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue } from \"./parser/invalidPathValue\";\nexport { default as isArcCommand } from \"./parser/isArcCommand\";\nexport { default as isDigit } from \"./parser/isDigit\";\nexport { default as isDigitStart } from \"./parser/isDigitStart\";\nexport { default as isMoveCommand } from \"./parser/isMoveCommand\";\nexport { default as isPathCommand } from \"./parser/isPathCommand\";\nexport { default as isSpace } from \"./parser/isSpace\";\nexport { default as paramsCount } from \"./parser/paramsCount\";\nexport { default as paramsParser } from \"./parser/paramsParser\";\nexport { default as pathParser } from \"./parser/pathParser\";\nexport { default as scanFlag } from \"./parser/scanFlag\";\nexport { default as scanParam } from \"./parser/scanParam\";\nexport { default as scanSegment } from \"./parser/scanSegment\";\nexport { default as skipSpaces } from \"./parser/skipSpaces\";\nexport { default as getPathBBox } from \"./util/getPathBBox\";\nexport { default as getTotalLength } from \"./util/getTotalLength\";\nexport { default as distanceEpsilon } from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint } from \"./util/getClosestPoint\";\nexport { default as getDrawDirection } from \"./util/getDrawDirection\";\nexport { default as getPathArea } from \"./util/getPathArea\";\nexport { default as getPointAtLength } from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength } from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint } from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength } from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint } from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray } from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray } from \"./util/isCurveArray\";\nexport { default as isNormalizedArray } from \"./util/isNormalizedArray\";\nexport { default as isPathArray } from \"./util/isPathArray\";\nexport { default as isPointInStroke } from \"./util/isPointInStroke\";\nexport { default as isRelativeArray } from \"./util/isRelativeArray\";\nexport { default as isValidPath } from \"./util/isValidPath\";\nexport { default as shapeParams } from \"./util/shapeParams\";\nexport { default as shapeToPath } from \"./util/shapeToPath\";\nexport { default as shapeToPathArray } from \"./util/shapeToPathArray\";\nexport { default as normalizePath } from \"./process/normalizePath\";\nexport { default as optimizePath } from \"./process/optimizePath\";\nexport { default as reversePath } from \"./process/reversePath\";\nexport { default as splitPath } from \"./process/splitPath\";\nexport { default as transformPath } from \"./process/transformPath\";\nexport { default as absolutizeSegment } from \"./process/absolutizeSegment\";\nexport { default as arcToCubic } from \"./process/arcToCubic\";\nexport { default as getSVGMatrix } from \"./process/getSVGMatrix\";\nexport { default as iterate } from \"./process/iterate\";\nexport { default as lineToCubic } from \"./process/lineToCubic\";\nexport { default as normalizeSegment } from \"./process/normalizeSegment\";\nexport { default as projection2d } from \"./process/projection2d\";\nexport { default as quadToCubic } from \"./process/quadToCubic\";\nexport { default as relativizeSegment } from \"./process/relativizeSegment\";\nexport { default as reverseCurve } from \"./process/reverseCurve\";\nexport { default as roundPath } from \"./process/roundPath\";\nexport { default as roundSegment } from \"./process/roundSegment\";\nexport { default as segmentToCubic } from \"./process/segmentToCubic\";\nexport { default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic } from \"./process/splitCubic\";\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\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 \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) {\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 * @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 * @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 * @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 * @param onlySubpath option to reverse all sub-paths except first\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 * @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 * @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 refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\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 * @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 * @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 * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;","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 */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\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 */\nconst 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\nexport default distanceSquareRoot;\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 * @param distance the distance to point in [0-1] range\n * @returns the extrema 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 a [0-1] ratio\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 { 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 boundig 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) => {\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]] as [\n number,\n number,\n number,\n number,\n ];\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 boundig 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 * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon 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 /* eslint-disable-next-line */\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};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, 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 */\nconst 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\nexport default rotateVector;\n","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\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\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\nexport default paramsCount;\n","import paramsCount 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 */\nconst 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 >= paramsCount[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, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./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 */\nconst 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\nexport default scanFlag;\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 */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./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 */\nconst 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};\nexport default scanParam;\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\nconst 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};\nexport default isSpace;\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 */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\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 */\nconst 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};\nexport default isPathCommand;\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 */\nconst 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};\nexport default isDigitStart;\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 */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst 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};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts 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 \"./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 */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[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) && 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 && 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};\nexport default scanSegment;\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\n */\nexport default 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 * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\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\nexport default parsePathString;\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 */\nconst 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};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n 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 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 if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\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 | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\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 */\nconst 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\nexport default relativizeSegment;\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 | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\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 * @return the resulting cubic-bezier segment(s)\n */\nconst 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};\nexport default arcToCubic;\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 */\nconst 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};\nexport default quadToCubic;\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 */\nconst 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};\nexport default lineToCubic;\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 */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\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\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\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, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\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 */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\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};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\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\nexport default paramsParser;\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 value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\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 });\n};\nexport default pathToCurve;\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\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\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 : /* istanbul ignore next @preserve */ \"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\nexport default pathToString;\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\nconst getPathBBox = (pathInput: PathArray | 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\nexport default getPathBBox;\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 shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\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\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\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 });\n};\nexport default normalizePath;\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 of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\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 // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\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\nexport default getPointAtLength;\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 */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\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 PathArray;\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 PathArray;\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(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\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 */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\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\nexport default getPropertiesAtPoint;\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 */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\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 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 length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\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};\nexport default getPathArea;\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 */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\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 */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\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 */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount 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 */\nconst 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 paramsCount[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};\nexport default isPathArray;\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 */\nconst 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};\nexport default isAbsoluteArray;\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 are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst 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};\nexport default isNormalizedArray;\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 */\nconst 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};\nexport default isCurveArray;\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 */\nconst isPointInStroke = (\n pathInput: string | PathArray,\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};\nexport default isPointInStroke;\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 */\nconst 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};\nexport default isRelativeArray;\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 */\nconst 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};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst 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\nexport default shapeParams;\n","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\nexport default isElement;\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 \"../parser/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\n * @returns a new line `pathArray`\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` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\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 (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\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\n * @return an ellipse `pathArray`\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` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\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 ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\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) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\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};\nexport default shapeToPathArray;\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 \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. 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 `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst 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;\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 Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\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\nexport default shapeToPath;\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 */\nconst 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\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\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\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } 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` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\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 : /* istanbul ignore next @preserve */ 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 = seg;\n [pathCommand] = seg;\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\nexport default optimizePath;\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` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\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;\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]) as PathSegment;\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 ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"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] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"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] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\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 PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\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 ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\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 `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst 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};\nexport default getSVGMatrix;\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 * @return 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 */\nconst 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};\nexport default projection2d;\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` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\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 let pathCommand = \"M\";\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 typeof path;\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 typeof path;\n\n return 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 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)) 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(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\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 });\n};\n\nexport default transformPath;\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 */\nconst 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\nexport default reverseCurve;\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 */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\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 : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["src_exports","__export","absolutizeSegment_default","arcToCubic_default","arcTools","bezierTools","cubicTools","src_default","distanceEpsilon_default","distanceSquareRoot_default","finalizeSegment_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPathBBox_default","getPointAtLength_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSVGMatrix_default","getSegmentAtLength_default","getSegmentOfPoint_default","getTotalLength_default","invalidPathValue_default","isAbsoluteArray_default","isArcCommand_default","isCurveArray_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isNormalizedArray_default","isPathArray_default","isPathCommand_default","isPointInStroke_default","isRelativeArray_default","isSpace_default","isValidPath_default","iterate_default","lineToCubic_default","lineTools","midPoint_default","normalizePath_default","normalizeSegment_default","optimizePath_default","paramsCount_default","paramsParser_default","parsePathString_default","PathParser","pathToAbsolute_default","pathToCurve_default","pathToRelative_default","pathToString_default","polygonTools","projection2d_default","quadToCubic_default","quadTools","relativizeSegment_default","reverseCurve_default","reversePath_default","rotateVector_default","roundPath_default","roundSegment_default","roundTo_default","scanFlag_default","scanParam_default","scanSegment_default","segmentToCubic_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","shortenSegment_default","skipSpaces_default","splitCubic_default","splitPath_default","transformPath_default","__toCommonJS","import_dommatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","import_dommatrix","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","import_dommatrix","translatePoint","cssm","v","m","CSSMatrix","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","main_default","import_dommatrix","src_default","main_default"]} \ No newline at end of file diff --git a/dist/svg-path-commander.d.cts b/dist/svg-path-commander.d.cts index ea5d02b..38c5a07 100644 --- a/dist/svg-path-commander.d.cts +++ b/dist/svg-path-commander.d.cts @@ -1,6 +1,177 @@ import CSSMatrix from '@thednp/dommatrix'; export { default as CSSMatrix } from '@thednp/dommatrix'; +type SpaceNumber = 0x1680 | 0x180e | 0x2000 | 0x2001 | 0x2002 | 0x2003 | 0x2004 | 0x2005 | 0x2006 | 0x2007 | 0x2008 | 0x2009 | 0x200a | 0x202f | 0x205f | 0x3000 | 0xfeff | 0x0a | 0x0d | 0x2028 | 0x2029 | 0x20 | 0x09 | 0x0b | 0x0c | 0xa0 | 0x1680; +type PathCommandNumber = 0x6d | 0x7a | 0x6c | 0x68 | 0x76 | 0x63 | 0x73 | 0x71 | 0x74 | 0x61; +type DigitNumber = 0x30 | 0x31 | 0x32 | 0x33 | 0x34 | 0x35 | 0x36 | 0x37 | 0x38 | 0x39; +type MCommand = "M"; +type mCommand = "m"; +type LCommand = "L"; +type lCommand = "l"; +type VCommand = "V"; +type vCommand = "v"; +type HCommand = "H"; +type hCommand = "h"; +type ZCommand = "Z"; +type zCommand = "z"; +type CCommand = "C"; +type cCommand = "c"; +type SCommand = "S"; +type sCommand = "s"; +type QCommand = "Q"; +type qCommand = "q"; +type TCommand = "T"; +type tCommand = "t"; +type ACommand = "A"; +type aCommand = "a"; +type AbsoluteCommand = MCommand | LCommand | VCommand | HCommand | ZCommand | CCommand | SCommand | QCommand | TCommand | ACommand; +type RelativeCommand = mCommand | lCommand | vCommand | hCommand | zCommand | cCommand | sCommand | qCommand | tCommand | aCommand; +type PathCommand = AbsoluteCommand | RelativeCommand; +type MSegment = [MCommand, number, number]; +type mSegment = [mCommand, number, number]; +type MoveSegment = MSegment | mSegment; +type LSegment = [LCommand, number, number]; +type lSegment = [lCommand, number, number]; +type LineSegment = LSegment | lSegment; +type VSegment = [VCommand, number]; +type vSegment = [vCommand, number]; +type VertLineSegment = vSegment | VSegment; +type HSegment = [HCommand, number]; +type hSegment = [hCommand, number]; +type HorLineSegment = HSegment | hSegment; +type ZSegment = [ZCommand]; +type zSegment = [zCommand]; +type CloseSegment = ZSegment | zSegment; +type CSegment = [ + CCommand, + number, + number, + number, + number, + number, + number +]; +type cSegment = [ + cCommand, + number, + number, + number, + number, + number, + number +]; +type CubicSegment = CSegment | cSegment; +type SSegment = [SCommand, number, number, number, number]; +type sSegment = [sCommand, number, number, number, number]; +type ShortCubicSegment = SSegment | sSegment; +type QSegment = [QCommand, number, number, number, number]; +type qSegment = [qCommand, number, number, number, number]; +type QuadSegment = QSegment | qSegment; +type TSegment = [TCommand, number, number]; +type tSegment = [tCommand, number, number]; +type ShortQuadSegment = TSegment | tSegment; +type ASegment = [ + ACommand, + number, + number, + number, + number, + number, + number, + number +]; +type aSegment = [ + aCommand, + number, + number, + number, + number, + number, + number, + number +]; +type ArcSegment = ASegment | aSegment; +type PathSegment = MoveSegment | LineSegment | VertLineSegment | HorLineSegment | CloseSegment | CubicSegment | ShortCubicSegment | QuadSegment | ShortQuadSegment | ArcSegment; +type ShortSegment = VertLineSegment | HorLineSegment | ShortCubicSegment | ShortQuadSegment | CloseSegment; +type AbsoluteSegment = MSegment | LSegment | VSegment | HSegment | CSegment | SSegment | QSegment | TSegment | ASegment | ZSegment; +type RelativeSegment = mSegment | lSegment | vSegment | hSegment | cSegment | sSegment | qSegment | tSegment | aSegment | zSegment; +type NormalSegment = MSegment | LSegment | CSegment | QSegment | ASegment | ZSegment; +type PathArray = [MSegment | mSegment, ...PathSegment[]]; +type AbsoluteArray = [MSegment, ...AbsoluteSegment[]]; +type RelativeArray = [MSegment, ...RelativeSegment[]]; +type NormalArray = [MSegment, ...NormalSegment[]]; +type CurveArray = [MSegment, ...CSegment[]]; +type PolygonArray = [MSegment, ...LSegment[], ZSegment]; +type PolylineArray = [MSegment, ...LSegment[]]; +type ShapeTypes = SVGPolylineElement | SVGPolygonElement | SVGLineElement | SVGEllipseElement | SVGCircleElement | SVGRectElement; +type ShapeTags = "line" | "polyline" | "polygon" | "ellipse" | "circle" | "rect" | "glyph"; +type ShapeOps = LineAttr | PolyAttr | PolyAttr | EllipseAttr | CircleAttr | RectAttr | GlyphAttr; +type TransformObjectValues = Partial & { + origin: [number, number, number]; +}; +type Point = { + x: number; + y: number; +}; +type PointTuple = [number, number]; +type DerivedPoint = Point & { + t: number; +}; +type QuadPoints = [Point, Point, Point, Point, Point, Point]; +type CubicPoints = [ + Point, + Point, + Point, + Point, + Point, + Point, + Point, + Point +]; +type DerivedQuadPoints = [ + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint +]; +type DerivedCubicPoints = [ + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint +]; +type QuadCoordinates = [number, number, number, number, number, number]; +type CubicCoordinates = [ + number, + number, + number, + number, + number, + number, + number, + number +]; +type ArcCoordinates = [ + number, + number, + number, + number, + number, + number, + number, + number, + number +]; +type LineCoordinates = [number, number, number, number]; +type DeriveCallback = (t: number) => Point; +type IteratorCallback = (segment: PathSegment, index: number, lastX: number, lastY: number) => PathSegment | false | void | undefined; + type SegmentProperties = { segment: PathSegment; index: number; @@ -136,176 +307,459 @@ type TransformEntries = [ TransformObject[TransformProps] ][]; -type SpaceNumber = 0x1680 | 0x180e | 0x2000 | 0x2001 | 0x2002 | 0x2003 | 0x2004 | 0x2005 | 0x2006 | 0x2007 | 0x2008 | 0x2009 | 0x200a | 0x202f | 0x205f | 0x3000 | 0xfeff | 0x0a | 0x0d | 0x2028 | 0x2029 | 0x20 | 0x09 | 0x0b | 0x0c | 0xa0 | 0x1680; -type PathCommandNumber = 0x6d | 0x7a | 0x6c | 0x68 | 0x76 | 0x63 | 0x73 | 0x71 | 0x74 | 0x61; -type DigitNumber = 0x30 | 0x31 | 0x32 | 0x33 | 0x34 | 0x35 | 0x36 | 0x37 | 0x38 | 0x39; -type MCommand = "M"; -type mCommand = "m"; -type LCommand = "L"; -type lCommand = "l"; -type VCommand = "V"; -type vCommand = "v"; -type HCommand = "H"; -type hCommand = "h"; -type ZCommand = "Z"; -type zCommand = "z"; -type CCommand = "C"; -type cCommand = "c"; -type SCommand = "S"; -type sCommand = "s"; -type QCommand = "Q"; -type qCommand = "q"; -type TCommand = "T"; -type tCommand = "t"; -type ACommand = "A"; -type aCommand = "a"; -type AbsoluteCommand = MCommand | LCommand | VCommand | HCommand | ZCommand | CCommand | SCommand | QCommand | TCommand | ACommand; -type RelativeCommand = mCommand | lCommand | vCommand | hCommand | zCommand | cCommand | sCommand | qCommand | tCommand | aCommand; -type PathCommand = AbsoluteCommand | RelativeCommand; -type MSegment = [MCommand, number, number]; -type mSegment = [mCommand, number, number]; -type MoveSegment = MSegment | mSegment; -type LSegment = [LCommand, number, number]; -type lSegment = [lCommand, number, number]; -type LineSegment = LSegment | lSegment; -type VSegment = [VCommand, number]; -type vSegment = [vCommand, number]; -type VertLineSegment = vSegment | VSegment; -type HSegment = [HCommand, number]; -type hSegment = [hCommand, number]; -type HorLineSegment = HSegment | hSegment; -type ZSegment = [ZCommand]; -type zSegment = [zCommand]; -type CloseSegment = ZSegment | zSegment; -type CSegment = [ - CCommand, - number, - number, - number, - number, - number, - number -]; -type cSegment = [ - cCommand, - number, - number, - number, - number, - number, - number -]; -type CubicSegment = CSegment | cSegment; -type SSegment = [SCommand, number, number, number, number]; -type sSegment = [sCommand, number, number, number, number]; -type ShortCubicSegment = SSegment | sSegment; -type QSegment = [QCommand, number, number, number, number]; -type qSegment = [qCommand, number, number, number, number]; -type QuadSegment = QSegment | qSegment; -type TSegment = [TCommand, number, number]; -type tSegment = [tCommand, number, number]; -type ShortQuadSegment = TSegment | tSegment; -type ASegment = [ - ACommand, - number, - number, - number, - number, - number, - number, - number -]; -type aSegment = [ - aCommand, - number, - number, - number, - number, - number, - number, - number -]; -type ArcSegment = ASegment | aSegment; -type PathSegment = MoveSegment | LineSegment | VertLineSegment | HorLineSegment | CloseSegment | CubicSegment | ShortCubicSegment | QuadSegment | ShortQuadSegment | ArcSegment; -type ShortSegment = VertLineSegment | HorLineSegment | ShortCubicSegment | ShortQuadSegment | CloseSegment; -type AbsoluteSegment = MSegment | LSegment | VSegment | HSegment | CSegment | SSegment | QSegment | TSegment | ASegment | ZSegment; -type RelativeSegment = mSegment | lSegment | vSegment | hSegment | cSegment | sSegment | qSegment | tSegment | aSegment | zSegment; -type NormalSegment = MSegment | LSegment | CSegment | QSegment | ASegment | ZSegment; -type PathArray = [MSegment | mSegment, ...PathSegment[]]; -type AbsoluteArray = [MSegment, ...AbsoluteSegment[]]; -type RelativeArray = [MSegment, ...RelativeSegment[]]; -type NormalArray = [MSegment, ...NormalSegment[]]; -type CurveArray = [MSegment, ...CSegment[]]; -type PolygonArray = [MSegment, ...LSegment[], ZSegment]; -type PolylineArray = [MSegment, ...LSegment[]]; -type ShapeTypes = SVGPolylineElement | SVGPolygonElement | SVGLineElement | SVGEllipseElement | SVGCircleElement | SVGRectElement; -type ShapeTags = "line" | "polyline" | "polygon" | "ellipse" | "circle" | "rect" | "glyph"; -type ShapeOps = LineAttr | PolyAttr | PolyAttr | EllipseAttr | CircleAttr | RectAttr | GlyphAttr; -type TransformObjectValues = Partial & { +/** + * The `PathParser` is used by the `parsePathString` static method + * to generate a `pathArray`. + * + * @param pathString + */ +declare class PathParser { + segments: PathArray | PathSegment[]; + pathValue: string; + max: number; + index: number; + param: number; + segmentStart: number; + data: (string | number)[]; + err: string; + constructor(pathString: string); +} + +/** + * Creates a new SVGPathCommander instance with the following properties: + * * segments: `pathArray` + * * round: number + * * origin: [number, number, number?] + * + * @class + * @author thednp + * @returns a new SVGPathCommander instance + */ +declare class SVGPathCommander { + segments: PathArray; + round: number | "off"; origin: [number, number, number]; + /** + * @constructor + * @param pathValue the path string + * @param config instance options + */ + constructor(pathValue: string, config?: Partial); + get bbox(): { + x: number; + y: number; + width: number; + height: number; + x2: number; + y2: number; + cx: number; + cy: number; + cz: number; + }; + get length(): number; + /** + * Returns the path bounding box, equivalent to native `path.getBBox()`. + * + * @public + * @returns the pathBBox + */ + getBBox(): { + x: number; + y: number; + width: number; + height: number; + x2: number; + y2: number; + cx: number; + cy: number; + cz: number; + }; + /** + * Returns the total path length, equivalent to native `path.getTotalLength()`. + * + * @public + * @returns the path total length + */ + getTotalLength(): number; + /** + * Returns an `{x,y}` point in the path stroke at a given length, + * equivalent to the native `path.getPointAtLength()`. + * + * @public + * @param length the length + * @returns the requested point + */ + getPointAtLength(length: number): { + x: number; + y: number; + }; + /** + * Convert path to absolute values + * + * @public + */ + toAbsolute(): this; + /** + * Convert path to relative values + * + * @public + */ + toRelative(): this; + /** + * Convert path to cubic-bezier values. In addition, un-necessary `Z` + * segment is removed if previous segment extends to the `M` segment. + * + * @public + */ + toCurve(): this; + /** + * Reverse the order of the segments and their values. + * + * @param onlySubpath option to reverse all sub-paths except first + * @public + */ + reverse(onlySubpath?: boolean): this; + /** + * Normalize path in 2 steps: + * * convert `pathArray`(s) to absolute values + * * convert shorthand notation to standard notation + * + * @public + */ + normalize(): this; + /** + * Optimize `pathArray` values: + * * convert segments to absolute and/or relative values + * * select segments with shortest resulted string + * * round values to the specified `decimals` option value + * + * @public + */ + optimize(): this; + /** + * Transform path using values from an `Object` defined as `transformObject`. + * + * @see TransformObject for a quick refference + * + * @param source a `transformObject`as described above + * @public + */ + transform(source?: Partial): this; + /** + * Rotate path 180deg vertically + * + * @public + */ + flipX(): this; + /** + * Rotate path 180deg horizontally + * + * @public + */ + flipY(): this; + /** + * Export the current path to be used + * for the `d` (description) attribute. + * + * @public + * @return the path string + */ + toString(): string; + /** + * Remove the instance. + * + * @public + * @return void + */ + dispose(): void; + static get CSSMatrix(): typeof CSSMatrix; + static get arcTools(): { + angleBetween: (v0: Point, v1: Point) => number; + arcLength: (rx: number, ry: number, theta: number) => number; + arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; + getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; + getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; + getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { + rx: number; + ry: number; + startAngle: number; + endAngle: number; + center: { + x: number; + y: number; + }; + }; + getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { + x: number; + y: number; + }; + }; + static get bezierTools(): { + bezierLength: (derivativeFn: DeriveCallback) => number; + calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; + CBEZIER_MINMAX_EPSILON: number; + computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; + Cvalues: number[]; + deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; + getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; + minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; + minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; + Tvalues: number[]; + }; + static get cubicTools(): { + getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; + getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; + getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { + x: number; + y: number; + }; + }; + static get lineTools(): { + getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; + getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; + getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + }; + static get polygonTools(): { + polygonArea: (polygon: PointTuple[]) => number; + polygonLength: (polygon: PointTuple[]) => number; + }; + static get quadTools(): { + getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { + x: number; + y: number; + }; + getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; + getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; + }; + static get pathToAbsolute(): (pathInput: string | PathArray) => AbsoluteArray; + static get pathToRelative(): (pathInput: string | PathArray) => RelativeArray; + static get pathToCurve(): (pathInput: string | PathArray) => CurveArray; + static get pathToString(): (path: PathArray, roundOption?: number | "off") => string; + static get distanceSquareRoot(): (a: PointTuple, b: PointTuple) => number; + static get midPoint(): (a: PointTuple, b: PointTuple, t: number) => PointTuple; + static get rotateVector(): (x: number, y: number, rad: number) => { + x: number; + y: number; + }; + static get roundTo(): (n: number, round: number) => number; + static get parsePathString(): (pathInput: string | T) => PathArray; + static get finalizeSegment(): (path: PathParser) => void; + static get invalidPathValue(): string; + static get isArcCommand(): (code: number) => code is 97; + static get isDigit(): (code: number) => code is DigitNumber; + static get isDigitStart(): (code: number) => code is DigitNumber | 43 | 45 | 46; + static get isMoveCommand(): (code: number) => code is 109 | 77; + static get isPathCommand(): (code: number) => code is PathCommandNumber; + static get isSpace(): (ch: number) => ch is SpaceNumber; + static get paramsCount(): { + a: number; + c: number; + h: number; + l: number; + m: number; + r: number; + q: number; + s: number; + t: number; + v: number; + z: number; + }; + static get paramsParser(): ParserParams; + static get pathParser(): typeof PathParser; + static get scanFlag(): (path: PathParser) => void; + static get scanParam(): (path: PathParser) => void; + static get scanSegment(): (path: PathParser) => void; + static get skipSpaces(): (path: PathParser) => void; + static get distanceEpsilon(): number; + static get getClosestPoint(): (pathInput: string | PathArray, point: { + x: number; + y: number; + }) => { + x: number; + y: number; + }; + static get getDrawDirection(): (path: string | PathArray) => boolean; + static get getPathArea(): (path: PathArray) => number; + static get getPathBBox(): (pathInput: PathArray | string) => { + x: number; + y: number; + width: number; + height: number; + x2: number; + y2: number; + cx: number; + cy: number; + cz: number; + }; + static get getPointAtLength(): (pathInput: string | PathArray, distance?: number) => { + x: number; + y: number; + }; + static get getPropertiesAtLength(): (pathInput: string | PathArray, distance?: number) => SegmentProperties; + static get getPropertiesAtPoint(): (pathInput: string | PathArray, point: Point) => PointProperties; + static get getSegmentAtLength(): (pathInput: string | PathArray, distance?: number) => PathSegment | undefined; + static get getSegmentOfPoint(): (path: string | PathArray, point: { + x: number; + y: number; + }) => SegmentProperties | undefined; + static get getTotalLength(): (pathInput: string | PathArray) => number; + static get isAbsoluteArray(): (path: unknown) => path is AbsoluteArray; + static get isCurveArray(): (path: unknown) => path is CurveArray; + static get isNormalizedArray(): (path: unknown) => path is NormalArray; + static get isPathArray(): (path: unknown) => path is PathArray; + static get isPointInStroke(): (pathInput: string | PathArray, point: { + x: number; + y: number; + }) => boolean; + static get isRelativeArray(): (path: unknown) => path is RelativeArray; + static get isValidPath(): (pathString: string) => boolean; + static get shapeParams(): ShapeParams; + static get shapeToPath(): (element: ShapeTypes | ShapeOps, replace?: boolean, ownerDocument?: Document) => SVGPathElement | false; + static get shapeToPathArray(): (element: ShapeTypes | ShapeOps) => false | PathArray; + static get absolutizeSegment(): (segment: PathSegment, index: number, lastX: number, lastY: number) => AbsoluteSegment; + static get arcToCubic(): (X1: number, Y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, X2: number, Y2: number, recursive?: [number, number, number, number]) => number[]; + static get getSVGMatrix(): (transform: TransformObjectValues) => CSSMatrix; + static get iterate(): (path: PathArray, iterator: IteratorCallback) => T; + static get lineToCubic(): (x1: number, y1: number, x2: number, y2: number) => number[]; + static get normalizePath(): (pathInput: string | PathArray) => NormalArray; + static get normalizeSegment(): (segment: PathSegment, params: ParserParams) => NormalSegment; + static get optimizePath(): (pathInput: PathArray, roundOption?: number) => PathArray; + static get projection2d(): (m: CSSMatrix, point2D: PointTuple, origin: [number, number, number]) => PointTuple; + static get quadToCubic(): (x1: number, y1: number, qx: number, qy: number, x2: number, y2: number) => [number, number, number, number, number, number]; + static get relativizeSegment(): (segment: PathSegment, index: number, lastX: number, lastY: number) => MSegment | RelativeSegment; + static get reverseCurve(): (path: CurveArray) => CurveArray; + static get reversePath(): (pathInput: PathArray) => PathArray; + static get roundPath(): (path: PathArray, roundOption?: number | "off") => PathArray; + static get roundSegment(): (segment: T, roundOption: number) => T; + static get segmentToCubic(): (segment: PathSegment, params: ParserParams) => MSegment | CSegment; + static get shortenSegment(): (segment: AbsoluteSegment, normalSegment: NormalSegment, params: ParserParams, prevCommand: PathCommand) => ShortSegment; + static get splitCubic(): (pts: number[], ratio?: number) => [CubicSegment, CubicSegment]; + static get splitPath(): (pathInput: PathArray) => PathArray[]; + static get transformPath(): (pathInput: PathArray | string, transform?: Partial) => PathArray; +} + +declare const arcTools: { + angleBetween: (v0: Point, v1: Point) => number; + arcLength: (rx: number, ry: number, theta: number) => number; + arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; + getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; + getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; + getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { + rx: number; + ry: number; + startAngle: number; + endAngle: number; + center: { + x: number; + y: number; + }; + }; + getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { + x: number; + y: number; + }; +}; + +declare const bezierTools: { + bezierLength: (derivativeFn: DeriveCallback) => number; + calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; + CBEZIER_MINMAX_EPSILON: number; + computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; + Cvalues: number[]; + deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; + getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; + minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; + minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; + Tvalues: number[]; +}; + +declare const cubicTools: { + getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; + getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; + getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { + x: number; + y: number; + }; }; -type Point = { + +declare const lineTools: { + getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; + getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; + getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; +}; + +declare const quadTools: { + getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { + x: number; + y: number; + }; + getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; + getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; +}; + +declare const polygonTools: { + polygonArea: (polygon: PointTuple[]) => number; + polygonLength: (polygon: PointTuple[]) => number; +}; + +/** + * Returns the square root of the distance + * between two given points. + * + * @param a the first point coordinates + * @param b the second point coordinates + * @returns the distance value + */ +declare const distanceSquareRoot: (a: PointTuple, b: PointTuple) => number; + +/** + * Returns the coordinates of a specified distance + * ratio between two points. + * + * @param a the first point coordinates + * @param b the second point coordinates + * @param t the ratio + * @returns the midpoint coordinates + */ +declare const midPoint: (a: PointTuple, b: PointTuple, t: number) => PointTuple; + +/** + * Returns an {x,y} vector rotated by a given + * angle in radian. + * + * @param x the initial vector x + * @param y the initial vector y + * @param rad the radian vector angle + * @returns the rotated vector + */ +declare const rotateVector: (x: number, y: number, rad: number) => { x: number; y: number; }; -type PointTuple = [number, number]; -type DerivedPoint = Point & { - t: number; -}; -type QuadPoints = [Point, Point, Point, Point, Point, Point]; -type CubicPoints = [ - Point, - Point, - Point, - Point, - Point, - Point, - Point, - Point -]; -type DerivedQuadPoints = [ - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint -]; -type DerivedCubicPoints = [ - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint -]; -type QuadCoordinates = [number, number, number, number, number, number]; -type CubicCoordinates = [ - number, - number, - number, - number, - number, - number, - number, - number -]; -type ArcCoordinates = [ - number, - number, - number, - number, - number, - number, - number, - number, - number -]; -type LineCoordinates = [number, number, number, number]; -type DeriveCallback = (t: number) => Point; -type IteratorCallback = (segment: PathSegment, index: number, lastX: number, lastY: number) => PathSegment | false | void | undefined; + +declare const roundTo: (n: number, round: number) => number; /** * Parses a path string value or object and returns an array @@ -347,8 +801,6 @@ declare const pathToCurve: (pathInput: string | PathArray) => CurveArray; */ declare const pathToString: (path: PathArray, roundOption?: number | "off") => string; -declare const error = "SVGPathCommander Error"; - /** * Parses a path string value and returns an array * of segments we like to call `pathArray`. @@ -358,24 +810,6 @@ declare const error = "SVGPathCommander Error"; */ declare const parsePathString: (pathInput: string | T) => PathArray; -/** - * The `PathParser` is used by the `parsePathString` static method - * to generate a `pathArray`. - * - * @param pathString - */ -declare class PathParser { - segments: PathArray | PathSegment[]; - pathValue: string; - max: number; - index: number; - param: number; - segmentStart: number; - data: (string | number)[]; - err: string; - constructor(pathString: string); -} - /** * Breaks the parsing of a pathString once a segment is finalized. * @@ -906,153 +1340,4 @@ declare const shortenSegment: (segment: AbsoluteSegment, normalSegment: NormalSe */ declare const splitCubic: (pts: number[], ratio?: number) => [CubicSegment, CubicSegment]; -/** - * Creates a new SVGPathCommander instance with the following properties: - * * segments: `pathArray` - * * round: number - * * origin: [number, number, number?] - * - * @class - * @author thednp - * @returns a new SVGPathCommander instance - */ -declare class SVGPathCommander { - segments: PathArray; - round: number | "off"; - origin: [number, number, number]; - /** - * @constructor - * @param pathValue the path string - * @param config instance options - */ - constructor(pathValue: string, config?: Partial); - get bbox(): { - x: number; - y: number; - width: number; - height: number; - x2: number; - y2: number; - cx: number; - cy: number; - cz: number; - }; - get length(): number; - /** - * Returns the path bounding box, equivalent to native `path.getBBox()`. - * - * @public - * @returns the pathBBox - */ - getBBox(): { - x: number; - y: number; - width: number; - height: number; - x2: number; - y2: number; - cx: number; - cy: number; - cz: number; - }; - /** - * Returns the total path length, equivalent to native `path.getTotalLength()`. - * - * @public - * @returns the path total length - */ - getTotalLength(): number; - /** - * Returns an `{x,y}` point in the path stroke at a given length, - * equivalent to the native `path.getPointAtLength()`. - * - * @public - * @param length the length - * @returns the requested point - */ - getPointAtLength(length: number): { - x: number; - y: number; - }; - /** - * Convert path to absolute values - * - * @public - */ - toAbsolute(): this; - /** - * Convert path to relative values - * - * @public - */ - toRelative(): this; - /** - * Convert path to cubic-bezier values. In addition, un-necessary `Z` - * segment is removed if previous segment extends to the `M` segment. - * - * @public - */ - toCurve(): this; - /** - * Reverse the order of the segments and their values. - * - * @param onlySubpath option to reverse all sub-paths except first - * @public - */ - reverse(onlySubpath?: boolean): this; - /** - * Normalize path in 2 steps: - * * convert `pathArray`(s) to absolute values - * * convert shorthand notation to standard notation - * - * @public - */ - normalize(): this; - /** - * Optimize `pathArray` values: - * * convert segments to absolute and/or relative values - * * select segments with shortest resulted string - * * round values to the specified `decimals` option value - * - * @public - */ - optimize(): this; - /** - * Transform path using values from an `Object` defined as `transformObject`. - * - * @see TransformObject for a quick refference - * - * @param source a `transformObject`as described above - * @public - */ - transform(source?: Partial): this; - /** - * Rotate path 180deg vertically - * - * @public - */ - flipX(): this; - /** - * Rotate path 180deg horizontally - * - * @public - */ - flipY(): this; - /** - * Export the current path to be used - * for the `d` (description) attribute. - * - * @public - * @return the path string - */ - toString(): string; - /** - * Remove the instance. - * - * @public - * @return void - */ - dispose(): void; -} - -export { type ACommand, type ASegment, type AbsoluteArray, type AbsoluteCommand, type AbsoluteSegment, type ArcCoordinates, type ArcSegment, type CCommand, type CSegment, type CircleAttr, type CloseSegment, type CubicCoordinates, type CubicPoints, type CubicSegment, type CurveArray, type DeriveCallback, type DerivedCubicPoints, type DerivedPoint, type DerivedQuadPoints, type DigitNumber, type EllipseAttr, type GlyphAttr, type HCommand, type HSegment, type HorLineSegment, type IteratorCallback, type LCommand, type LSegment, type LengthFactory, type LineAttr, type LineCoordinates, type LineSegment, type MCommand, type MSegment, type MoveSegment, type NormalArray, type NormalSegment, type Options, type ParserParams, type PathArray, type PathBBox, type PathCommand, type PathCommandNumber, type PathSegment, type PathTransform, type Point, type PointProperties, type PointTuple, type PolyAttr, type PolygonArray, type PolylineArray, type QCommand, type QSegment, type QuadCoordinates, type QuadPoints, type QuadSegment, type RectAttr, type RelativeArray, type RelativeCommand, type RelativeSegment, type SCommand, type SSegment, type SegmentLimits, type SegmentProperties, type ShapeOps, type ShapeParams, type ShapeTags, type ShapeTypes, type ShortCubicSegment, type ShortQuadSegment, type ShortSegment, type SpaceNumber, type TCommand, type TSegment, type TransformEntries, type TransformObject, type TransformObjectValues, type TransformProps, type VCommand, type VSegment, type VertLineSegment, type ZCommand, type ZSegment, type aCommand, type aSegment, absolutizeSegment, arcToCubic, type cCommand, type cSegment, SVGPathCommander as default, DISTANCE_EPSILON as distanceEpsilon, error, finalizeSegment, getClosestPoint, getDrawDirection, getPathArea, getPathBBox, getPointAtLength, getPropertiesAtLength, getPropertiesAtPoint, getSVGMatrix, getSegmentAtLength, getSegmentOfPoint, getTotalLength, type hCommand, type hSegment, invalidPathValue, isAbsoluteArray, isArcCommand, isCurveArray, isDigit, isDigitStart, isMoveCommand, isNormalizedArray, isPathArray, isPathCommand, isPointInStroke, isRelativeArray, isSpace, isValidPath, iterate, type lCommand, type lSegment, lineToCubic, type mCommand, type mSegment, normalizePath, normalizeSegment, optimizePath, paramsCount, paramsParser, parsePathString, PathParser as pathParser, pathToAbsolute, pathToCurve, pathToRelative, pathToString, projection2d, type qCommand, type qSegment, quadToCubic, relativizeSegment, reverseCurve, reversePath, roundPath, roundSegment, type sCommand, type sSegment, scanFlag, scanParam, scanSegment, segmentToCubic, shapeParams, shapeToPath, shapeToPathArray, shortenSegment, skipSpaces, splitCubic, splitPath, type tCommand, type tSegment, transformPath, type vCommand, type vSegment, type zCommand, type zSegment }; +export { type ACommand, type ASegment, type AbsoluteArray, type AbsoluteCommand, type AbsoluteSegment, type ArcCoordinates, type ArcSegment, type CCommand, type CSegment, type CircleAttr, type CloseSegment, type CubicCoordinates, type CubicPoints, type CubicSegment, type CurveArray, type DeriveCallback, type DerivedCubicPoints, type DerivedPoint, type DerivedQuadPoints, type DigitNumber, type EllipseAttr, type GlyphAttr, type HCommand, type HSegment, type HorLineSegment, type IteratorCallback, type LCommand, type LSegment, type LengthFactory, type LineAttr, type LineCoordinates, type LineSegment, type MCommand, type MSegment, type MoveSegment, type NormalArray, type NormalSegment, type Options, type ParserParams, type PathArray, type PathBBox, type PathCommand, type PathCommandNumber, type PathSegment, type PathTransform, type Point, type PointProperties, type PointTuple, type PolyAttr, type PolygonArray, type PolylineArray, type QCommand, type QSegment, type QuadCoordinates, type QuadPoints, type QuadSegment, type RectAttr, type RelativeArray, type RelativeCommand, type RelativeSegment, type SCommand, type SSegment, type SegmentLimits, type SegmentProperties, type ShapeOps, type ShapeParams, type ShapeTags, type ShapeTypes, type ShortCubicSegment, type ShortQuadSegment, type ShortSegment, type SpaceNumber, type TCommand, type TSegment, type TransformEntries, type TransformObject, type TransformObjectValues, type TransformProps, type VCommand, type VSegment, type VertLineSegment, type ZCommand, type ZSegment, type aCommand, type aSegment, absolutizeSegment, arcToCubic, arcTools, bezierTools, type cCommand, type cSegment, cubicTools, SVGPathCommander as default, DISTANCE_EPSILON as distanceEpsilon, distanceSquareRoot, finalizeSegment, getClosestPoint, getDrawDirection, getPathArea, getPathBBox, getPointAtLength, getPropertiesAtLength, getPropertiesAtPoint, getSVGMatrix, getSegmentAtLength, getSegmentOfPoint, getTotalLength, type hCommand, type hSegment, invalidPathValue, isAbsoluteArray, isArcCommand, isCurveArray, isDigit, isDigitStart, isMoveCommand, isNormalizedArray, isPathArray, isPathCommand, isPointInStroke, isRelativeArray, isSpace, isValidPath, iterate, type lCommand, type lSegment, lineToCubic, lineTools, type mCommand, type mSegment, midPoint, normalizePath, normalizeSegment, optimizePath, paramsCount, paramsParser, parsePathString, PathParser as pathParser, pathToAbsolute, pathToCurve, pathToRelative, pathToString, polygonTools, projection2d, type qCommand, type qSegment, quadToCubic, quadTools, relativizeSegment, reverseCurve, reversePath, rotateVector, roundPath, roundSegment, roundTo, type sCommand, type sSegment, scanFlag, scanParam, scanSegment, segmentToCubic, shapeParams, shapeToPath, shapeToPathArray, shortenSegment, skipSpaces, splitCubic, splitPath, type tCommand, type tSegment, transformPath, type vCommand, type vSegment, type zCommand, type zSegment }; diff --git a/dist/svg-path-commander.d.ts b/dist/svg-path-commander.d.ts index ea5d02b..38c5a07 100644 --- a/dist/svg-path-commander.d.ts +++ b/dist/svg-path-commander.d.ts @@ -1,6 +1,177 @@ import CSSMatrix from '@thednp/dommatrix'; export { default as CSSMatrix } from '@thednp/dommatrix'; +type SpaceNumber = 0x1680 | 0x180e | 0x2000 | 0x2001 | 0x2002 | 0x2003 | 0x2004 | 0x2005 | 0x2006 | 0x2007 | 0x2008 | 0x2009 | 0x200a | 0x202f | 0x205f | 0x3000 | 0xfeff | 0x0a | 0x0d | 0x2028 | 0x2029 | 0x20 | 0x09 | 0x0b | 0x0c | 0xa0 | 0x1680; +type PathCommandNumber = 0x6d | 0x7a | 0x6c | 0x68 | 0x76 | 0x63 | 0x73 | 0x71 | 0x74 | 0x61; +type DigitNumber = 0x30 | 0x31 | 0x32 | 0x33 | 0x34 | 0x35 | 0x36 | 0x37 | 0x38 | 0x39; +type MCommand = "M"; +type mCommand = "m"; +type LCommand = "L"; +type lCommand = "l"; +type VCommand = "V"; +type vCommand = "v"; +type HCommand = "H"; +type hCommand = "h"; +type ZCommand = "Z"; +type zCommand = "z"; +type CCommand = "C"; +type cCommand = "c"; +type SCommand = "S"; +type sCommand = "s"; +type QCommand = "Q"; +type qCommand = "q"; +type TCommand = "T"; +type tCommand = "t"; +type ACommand = "A"; +type aCommand = "a"; +type AbsoluteCommand = MCommand | LCommand | VCommand | HCommand | ZCommand | CCommand | SCommand | QCommand | TCommand | ACommand; +type RelativeCommand = mCommand | lCommand | vCommand | hCommand | zCommand | cCommand | sCommand | qCommand | tCommand | aCommand; +type PathCommand = AbsoluteCommand | RelativeCommand; +type MSegment = [MCommand, number, number]; +type mSegment = [mCommand, number, number]; +type MoveSegment = MSegment | mSegment; +type LSegment = [LCommand, number, number]; +type lSegment = [lCommand, number, number]; +type LineSegment = LSegment | lSegment; +type VSegment = [VCommand, number]; +type vSegment = [vCommand, number]; +type VertLineSegment = vSegment | VSegment; +type HSegment = [HCommand, number]; +type hSegment = [hCommand, number]; +type HorLineSegment = HSegment | hSegment; +type ZSegment = [ZCommand]; +type zSegment = [zCommand]; +type CloseSegment = ZSegment | zSegment; +type CSegment = [ + CCommand, + number, + number, + number, + number, + number, + number +]; +type cSegment = [ + cCommand, + number, + number, + number, + number, + number, + number +]; +type CubicSegment = CSegment | cSegment; +type SSegment = [SCommand, number, number, number, number]; +type sSegment = [sCommand, number, number, number, number]; +type ShortCubicSegment = SSegment | sSegment; +type QSegment = [QCommand, number, number, number, number]; +type qSegment = [qCommand, number, number, number, number]; +type QuadSegment = QSegment | qSegment; +type TSegment = [TCommand, number, number]; +type tSegment = [tCommand, number, number]; +type ShortQuadSegment = TSegment | tSegment; +type ASegment = [ + ACommand, + number, + number, + number, + number, + number, + number, + number +]; +type aSegment = [ + aCommand, + number, + number, + number, + number, + number, + number, + number +]; +type ArcSegment = ASegment | aSegment; +type PathSegment = MoveSegment | LineSegment | VertLineSegment | HorLineSegment | CloseSegment | CubicSegment | ShortCubicSegment | QuadSegment | ShortQuadSegment | ArcSegment; +type ShortSegment = VertLineSegment | HorLineSegment | ShortCubicSegment | ShortQuadSegment | CloseSegment; +type AbsoluteSegment = MSegment | LSegment | VSegment | HSegment | CSegment | SSegment | QSegment | TSegment | ASegment | ZSegment; +type RelativeSegment = mSegment | lSegment | vSegment | hSegment | cSegment | sSegment | qSegment | tSegment | aSegment | zSegment; +type NormalSegment = MSegment | LSegment | CSegment | QSegment | ASegment | ZSegment; +type PathArray = [MSegment | mSegment, ...PathSegment[]]; +type AbsoluteArray = [MSegment, ...AbsoluteSegment[]]; +type RelativeArray = [MSegment, ...RelativeSegment[]]; +type NormalArray = [MSegment, ...NormalSegment[]]; +type CurveArray = [MSegment, ...CSegment[]]; +type PolygonArray = [MSegment, ...LSegment[], ZSegment]; +type PolylineArray = [MSegment, ...LSegment[]]; +type ShapeTypes = SVGPolylineElement | SVGPolygonElement | SVGLineElement | SVGEllipseElement | SVGCircleElement | SVGRectElement; +type ShapeTags = "line" | "polyline" | "polygon" | "ellipse" | "circle" | "rect" | "glyph"; +type ShapeOps = LineAttr | PolyAttr | PolyAttr | EllipseAttr | CircleAttr | RectAttr | GlyphAttr; +type TransformObjectValues = Partial & { + origin: [number, number, number]; +}; +type Point = { + x: number; + y: number; +}; +type PointTuple = [number, number]; +type DerivedPoint = Point & { + t: number; +}; +type QuadPoints = [Point, Point, Point, Point, Point, Point]; +type CubicPoints = [ + Point, + Point, + Point, + Point, + Point, + Point, + Point, + Point +]; +type DerivedQuadPoints = [ + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint +]; +type DerivedCubicPoints = [ + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint, + DerivedPoint +]; +type QuadCoordinates = [number, number, number, number, number, number]; +type CubicCoordinates = [ + number, + number, + number, + number, + number, + number, + number, + number +]; +type ArcCoordinates = [ + number, + number, + number, + number, + number, + number, + number, + number, + number +]; +type LineCoordinates = [number, number, number, number]; +type DeriveCallback = (t: number) => Point; +type IteratorCallback = (segment: PathSegment, index: number, lastX: number, lastY: number) => PathSegment | false | void | undefined; + type SegmentProperties = { segment: PathSegment; index: number; @@ -136,176 +307,459 @@ type TransformEntries = [ TransformObject[TransformProps] ][]; -type SpaceNumber = 0x1680 | 0x180e | 0x2000 | 0x2001 | 0x2002 | 0x2003 | 0x2004 | 0x2005 | 0x2006 | 0x2007 | 0x2008 | 0x2009 | 0x200a | 0x202f | 0x205f | 0x3000 | 0xfeff | 0x0a | 0x0d | 0x2028 | 0x2029 | 0x20 | 0x09 | 0x0b | 0x0c | 0xa0 | 0x1680; -type PathCommandNumber = 0x6d | 0x7a | 0x6c | 0x68 | 0x76 | 0x63 | 0x73 | 0x71 | 0x74 | 0x61; -type DigitNumber = 0x30 | 0x31 | 0x32 | 0x33 | 0x34 | 0x35 | 0x36 | 0x37 | 0x38 | 0x39; -type MCommand = "M"; -type mCommand = "m"; -type LCommand = "L"; -type lCommand = "l"; -type VCommand = "V"; -type vCommand = "v"; -type HCommand = "H"; -type hCommand = "h"; -type ZCommand = "Z"; -type zCommand = "z"; -type CCommand = "C"; -type cCommand = "c"; -type SCommand = "S"; -type sCommand = "s"; -type QCommand = "Q"; -type qCommand = "q"; -type TCommand = "T"; -type tCommand = "t"; -type ACommand = "A"; -type aCommand = "a"; -type AbsoluteCommand = MCommand | LCommand | VCommand | HCommand | ZCommand | CCommand | SCommand | QCommand | TCommand | ACommand; -type RelativeCommand = mCommand | lCommand | vCommand | hCommand | zCommand | cCommand | sCommand | qCommand | tCommand | aCommand; -type PathCommand = AbsoluteCommand | RelativeCommand; -type MSegment = [MCommand, number, number]; -type mSegment = [mCommand, number, number]; -type MoveSegment = MSegment | mSegment; -type LSegment = [LCommand, number, number]; -type lSegment = [lCommand, number, number]; -type LineSegment = LSegment | lSegment; -type VSegment = [VCommand, number]; -type vSegment = [vCommand, number]; -type VertLineSegment = vSegment | VSegment; -type HSegment = [HCommand, number]; -type hSegment = [hCommand, number]; -type HorLineSegment = HSegment | hSegment; -type ZSegment = [ZCommand]; -type zSegment = [zCommand]; -type CloseSegment = ZSegment | zSegment; -type CSegment = [ - CCommand, - number, - number, - number, - number, - number, - number -]; -type cSegment = [ - cCommand, - number, - number, - number, - number, - number, - number -]; -type CubicSegment = CSegment | cSegment; -type SSegment = [SCommand, number, number, number, number]; -type sSegment = [sCommand, number, number, number, number]; -type ShortCubicSegment = SSegment | sSegment; -type QSegment = [QCommand, number, number, number, number]; -type qSegment = [qCommand, number, number, number, number]; -type QuadSegment = QSegment | qSegment; -type TSegment = [TCommand, number, number]; -type tSegment = [tCommand, number, number]; -type ShortQuadSegment = TSegment | tSegment; -type ASegment = [ - ACommand, - number, - number, - number, - number, - number, - number, - number -]; -type aSegment = [ - aCommand, - number, - number, - number, - number, - number, - number, - number -]; -type ArcSegment = ASegment | aSegment; -type PathSegment = MoveSegment | LineSegment | VertLineSegment | HorLineSegment | CloseSegment | CubicSegment | ShortCubicSegment | QuadSegment | ShortQuadSegment | ArcSegment; -type ShortSegment = VertLineSegment | HorLineSegment | ShortCubicSegment | ShortQuadSegment | CloseSegment; -type AbsoluteSegment = MSegment | LSegment | VSegment | HSegment | CSegment | SSegment | QSegment | TSegment | ASegment | ZSegment; -type RelativeSegment = mSegment | lSegment | vSegment | hSegment | cSegment | sSegment | qSegment | tSegment | aSegment | zSegment; -type NormalSegment = MSegment | LSegment | CSegment | QSegment | ASegment | ZSegment; -type PathArray = [MSegment | mSegment, ...PathSegment[]]; -type AbsoluteArray = [MSegment, ...AbsoluteSegment[]]; -type RelativeArray = [MSegment, ...RelativeSegment[]]; -type NormalArray = [MSegment, ...NormalSegment[]]; -type CurveArray = [MSegment, ...CSegment[]]; -type PolygonArray = [MSegment, ...LSegment[], ZSegment]; -type PolylineArray = [MSegment, ...LSegment[]]; -type ShapeTypes = SVGPolylineElement | SVGPolygonElement | SVGLineElement | SVGEllipseElement | SVGCircleElement | SVGRectElement; -type ShapeTags = "line" | "polyline" | "polygon" | "ellipse" | "circle" | "rect" | "glyph"; -type ShapeOps = LineAttr | PolyAttr | PolyAttr | EllipseAttr | CircleAttr | RectAttr | GlyphAttr; -type TransformObjectValues = Partial & { +/** + * The `PathParser` is used by the `parsePathString` static method + * to generate a `pathArray`. + * + * @param pathString + */ +declare class PathParser { + segments: PathArray | PathSegment[]; + pathValue: string; + max: number; + index: number; + param: number; + segmentStart: number; + data: (string | number)[]; + err: string; + constructor(pathString: string); +} + +/** + * Creates a new SVGPathCommander instance with the following properties: + * * segments: `pathArray` + * * round: number + * * origin: [number, number, number?] + * + * @class + * @author thednp + * @returns a new SVGPathCommander instance + */ +declare class SVGPathCommander { + segments: PathArray; + round: number | "off"; origin: [number, number, number]; + /** + * @constructor + * @param pathValue the path string + * @param config instance options + */ + constructor(pathValue: string, config?: Partial); + get bbox(): { + x: number; + y: number; + width: number; + height: number; + x2: number; + y2: number; + cx: number; + cy: number; + cz: number; + }; + get length(): number; + /** + * Returns the path bounding box, equivalent to native `path.getBBox()`. + * + * @public + * @returns the pathBBox + */ + getBBox(): { + x: number; + y: number; + width: number; + height: number; + x2: number; + y2: number; + cx: number; + cy: number; + cz: number; + }; + /** + * Returns the total path length, equivalent to native `path.getTotalLength()`. + * + * @public + * @returns the path total length + */ + getTotalLength(): number; + /** + * Returns an `{x,y}` point in the path stroke at a given length, + * equivalent to the native `path.getPointAtLength()`. + * + * @public + * @param length the length + * @returns the requested point + */ + getPointAtLength(length: number): { + x: number; + y: number; + }; + /** + * Convert path to absolute values + * + * @public + */ + toAbsolute(): this; + /** + * Convert path to relative values + * + * @public + */ + toRelative(): this; + /** + * Convert path to cubic-bezier values. In addition, un-necessary `Z` + * segment is removed if previous segment extends to the `M` segment. + * + * @public + */ + toCurve(): this; + /** + * Reverse the order of the segments and their values. + * + * @param onlySubpath option to reverse all sub-paths except first + * @public + */ + reverse(onlySubpath?: boolean): this; + /** + * Normalize path in 2 steps: + * * convert `pathArray`(s) to absolute values + * * convert shorthand notation to standard notation + * + * @public + */ + normalize(): this; + /** + * Optimize `pathArray` values: + * * convert segments to absolute and/or relative values + * * select segments with shortest resulted string + * * round values to the specified `decimals` option value + * + * @public + */ + optimize(): this; + /** + * Transform path using values from an `Object` defined as `transformObject`. + * + * @see TransformObject for a quick refference + * + * @param source a `transformObject`as described above + * @public + */ + transform(source?: Partial): this; + /** + * Rotate path 180deg vertically + * + * @public + */ + flipX(): this; + /** + * Rotate path 180deg horizontally + * + * @public + */ + flipY(): this; + /** + * Export the current path to be used + * for the `d` (description) attribute. + * + * @public + * @return the path string + */ + toString(): string; + /** + * Remove the instance. + * + * @public + * @return void + */ + dispose(): void; + static get CSSMatrix(): typeof CSSMatrix; + static get arcTools(): { + angleBetween: (v0: Point, v1: Point) => number; + arcLength: (rx: number, ry: number, theta: number) => number; + arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; + getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; + getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; + getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { + rx: number; + ry: number; + startAngle: number; + endAngle: number; + center: { + x: number; + y: number; + }; + }; + getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { + x: number; + y: number; + }; + }; + static get bezierTools(): { + bezierLength: (derivativeFn: DeriveCallback) => number; + calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; + CBEZIER_MINMAX_EPSILON: number; + computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; + Cvalues: number[]; + deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; + getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; + minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; + minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; + Tvalues: number[]; + }; + static get cubicTools(): { + getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; + getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; + getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { + x: number; + y: number; + }; + }; + static get lineTools(): { + getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; + getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; + getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + }; + static get polygonTools(): { + polygonArea: (polygon: PointTuple[]) => number; + polygonLength: (polygon: PointTuple[]) => number; + }; + static get quadTools(): { + getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { + x: number; + y: number; + }; + getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; + getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; + }; + static get pathToAbsolute(): (pathInput: string | PathArray) => AbsoluteArray; + static get pathToRelative(): (pathInput: string | PathArray) => RelativeArray; + static get pathToCurve(): (pathInput: string | PathArray) => CurveArray; + static get pathToString(): (path: PathArray, roundOption?: number | "off") => string; + static get distanceSquareRoot(): (a: PointTuple, b: PointTuple) => number; + static get midPoint(): (a: PointTuple, b: PointTuple, t: number) => PointTuple; + static get rotateVector(): (x: number, y: number, rad: number) => { + x: number; + y: number; + }; + static get roundTo(): (n: number, round: number) => number; + static get parsePathString(): (pathInput: string | T) => PathArray; + static get finalizeSegment(): (path: PathParser) => void; + static get invalidPathValue(): string; + static get isArcCommand(): (code: number) => code is 97; + static get isDigit(): (code: number) => code is DigitNumber; + static get isDigitStart(): (code: number) => code is DigitNumber | 43 | 45 | 46; + static get isMoveCommand(): (code: number) => code is 109 | 77; + static get isPathCommand(): (code: number) => code is PathCommandNumber; + static get isSpace(): (ch: number) => ch is SpaceNumber; + static get paramsCount(): { + a: number; + c: number; + h: number; + l: number; + m: number; + r: number; + q: number; + s: number; + t: number; + v: number; + z: number; + }; + static get paramsParser(): ParserParams; + static get pathParser(): typeof PathParser; + static get scanFlag(): (path: PathParser) => void; + static get scanParam(): (path: PathParser) => void; + static get scanSegment(): (path: PathParser) => void; + static get skipSpaces(): (path: PathParser) => void; + static get distanceEpsilon(): number; + static get getClosestPoint(): (pathInput: string | PathArray, point: { + x: number; + y: number; + }) => { + x: number; + y: number; + }; + static get getDrawDirection(): (path: string | PathArray) => boolean; + static get getPathArea(): (path: PathArray) => number; + static get getPathBBox(): (pathInput: PathArray | string) => { + x: number; + y: number; + width: number; + height: number; + x2: number; + y2: number; + cx: number; + cy: number; + cz: number; + }; + static get getPointAtLength(): (pathInput: string | PathArray, distance?: number) => { + x: number; + y: number; + }; + static get getPropertiesAtLength(): (pathInput: string | PathArray, distance?: number) => SegmentProperties; + static get getPropertiesAtPoint(): (pathInput: string | PathArray, point: Point) => PointProperties; + static get getSegmentAtLength(): (pathInput: string | PathArray, distance?: number) => PathSegment | undefined; + static get getSegmentOfPoint(): (path: string | PathArray, point: { + x: number; + y: number; + }) => SegmentProperties | undefined; + static get getTotalLength(): (pathInput: string | PathArray) => number; + static get isAbsoluteArray(): (path: unknown) => path is AbsoluteArray; + static get isCurveArray(): (path: unknown) => path is CurveArray; + static get isNormalizedArray(): (path: unknown) => path is NormalArray; + static get isPathArray(): (path: unknown) => path is PathArray; + static get isPointInStroke(): (pathInput: string | PathArray, point: { + x: number; + y: number; + }) => boolean; + static get isRelativeArray(): (path: unknown) => path is RelativeArray; + static get isValidPath(): (pathString: string) => boolean; + static get shapeParams(): ShapeParams; + static get shapeToPath(): (element: ShapeTypes | ShapeOps, replace?: boolean, ownerDocument?: Document) => SVGPathElement | false; + static get shapeToPathArray(): (element: ShapeTypes | ShapeOps) => false | PathArray; + static get absolutizeSegment(): (segment: PathSegment, index: number, lastX: number, lastY: number) => AbsoluteSegment; + static get arcToCubic(): (X1: number, Y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, X2: number, Y2: number, recursive?: [number, number, number, number]) => number[]; + static get getSVGMatrix(): (transform: TransformObjectValues) => CSSMatrix; + static get iterate(): (path: PathArray, iterator: IteratorCallback) => T; + static get lineToCubic(): (x1: number, y1: number, x2: number, y2: number) => number[]; + static get normalizePath(): (pathInput: string | PathArray) => NormalArray; + static get normalizeSegment(): (segment: PathSegment, params: ParserParams) => NormalSegment; + static get optimizePath(): (pathInput: PathArray, roundOption?: number) => PathArray; + static get projection2d(): (m: CSSMatrix, point2D: PointTuple, origin: [number, number, number]) => PointTuple; + static get quadToCubic(): (x1: number, y1: number, qx: number, qy: number, x2: number, y2: number) => [number, number, number, number, number, number]; + static get relativizeSegment(): (segment: PathSegment, index: number, lastX: number, lastY: number) => MSegment | RelativeSegment; + static get reverseCurve(): (path: CurveArray) => CurveArray; + static get reversePath(): (pathInput: PathArray) => PathArray; + static get roundPath(): (path: PathArray, roundOption?: number | "off") => PathArray; + static get roundSegment(): (segment: T, roundOption: number) => T; + static get segmentToCubic(): (segment: PathSegment, params: ParserParams) => MSegment | CSegment; + static get shortenSegment(): (segment: AbsoluteSegment, normalSegment: NormalSegment, params: ParserParams, prevCommand: PathCommand) => ShortSegment; + static get splitCubic(): (pts: number[], ratio?: number) => [CubicSegment, CubicSegment]; + static get splitPath(): (pathInput: PathArray) => PathArray[]; + static get transformPath(): (pathInput: PathArray | string, transform?: Partial) => PathArray; +} + +declare const arcTools: { + angleBetween: (v0: Point, v1: Point) => number; + arcLength: (rx: number, ry: number, theta: number) => number; + arcPoint: (cx: number, cy: number, rx: number, ry: number, alpha: number, theta: number) => PointTuple; + getArcBBox: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => [number, number, number, number]; + getArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => number; + getArcProps: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number) => { + rx: number; + ry: number; + startAngle: number; + endAngle: number; + center: { + x: number; + y: number; + }; + }; + getPointAtArcLength: (x1: number, y1: number, RX: number, RY: number, angle: number, LAF: number, SF: number, x: number, y: number, distance?: number) => { + x: number; + y: number; + }; +}; + +declare const bezierTools: { + bezierLength: (derivativeFn: DeriveCallback) => number; + calculateBezier: (derivativeFn: DeriveCallback, t: number) => number; + CBEZIER_MINMAX_EPSILON: number; + computeBezier: (points: DerivedQuadPoints | DerivedCubicPoints, t: number) => DerivedPoint; + Cvalues: number[]; + deriveBezier: (points: QuadPoints | CubicPoints) => (DerivedQuadPoints | DerivedCubicPoints)[]; + getBezierLength: (curve: CubicCoordinates | QuadCoordinates) => number; + minmaxC: ([v1, cp1, cp2, v2]: [number, number, number, number]) => PointTuple; + minmaxQ: ([v1, cp, v2]: [number, number, number]) => PointTuple; + Tvalues: number[]; +}; + +declare const cubicTools: { + getCubicBBox: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => [number, number, number, number]; + getCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number) => number; + getPointAtCubicLength: (x1: number, y1: number, c1x: number, c1y: number, c2x: number, c2y: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtCubicSegmentLength: ([x1, y1, c1x, c1y, c2x, c2y, x2, y2]: CubicCoordinates, t: number) => { + x: number; + y: number; + }; }; -type Point = { + +declare const lineTools: { + getLineBBox: (x1: number, y1: number, x2: number, y2: number) => [number, number, number, number]; + getLineLength: (x1: number, y1: number, x2: number, y2: number) => number; + getPointAtLineLength: (x1: number, y1: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; +}; + +declare const quadTools: { + getPointAtQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number, distance?: number) => { + x: number; + y: number; + }; + getPointAtQuadSegmentLength: ([x1, y1, cx, cy, x2, y2]: QuadCoordinates, t: number) => { + x: number; + y: number; + }; + getQuadBBox: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => [number, number, number, number]; + getQuadLength: (x1: number, y1: number, cx: number, cy: number, x2: number, y2: number) => number; +}; + +declare const polygonTools: { + polygonArea: (polygon: PointTuple[]) => number; + polygonLength: (polygon: PointTuple[]) => number; +}; + +/** + * Returns the square root of the distance + * between two given points. + * + * @param a the first point coordinates + * @param b the second point coordinates + * @returns the distance value + */ +declare const distanceSquareRoot: (a: PointTuple, b: PointTuple) => number; + +/** + * Returns the coordinates of a specified distance + * ratio between two points. + * + * @param a the first point coordinates + * @param b the second point coordinates + * @param t the ratio + * @returns the midpoint coordinates + */ +declare const midPoint: (a: PointTuple, b: PointTuple, t: number) => PointTuple; + +/** + * Returns an {x,y} vector rotated by a given + * angle in radian. + * + * @param x the initial vector x + * @param y the initial vector y + * @param rad the radian vector angle + * @returns the rotated vector + */ +declare const rotateVector: (x: number, y: number, rad: number) => { x: number; y: number; }; -type PointTuple = [number, number]; -type DerivedPoint = Point & { - t: number; -}; -type QuadPoints = [Point, Point, Point, Point, Point, Point]; -type CubicPoints = [ - Point, - Point, - Point, - Point, - Point, - Point, - Point, - Point -]; -type DerivedQuadPoints = [ - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint -]; -type DerivedCubicPoints = [ - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint, - DerivedPoint -]; -type QuadCoordinates = [number, number, number, number, number, number]; -type CubicCoordinates = [ - number, - number, - number, - number, - number, - number, - number, - number -]; -type ArcCoordinates = [ - number, - number, - number, - number, - number, - number, - number, - number, - number -]; -type LineCoordinates = [number, number, number, number]; -type DeriveCallback = (t: number) => Point; -type IteratorCallback = (segment: PathSegment, index: number, lastX: number, lastY: number) => PathSegment | false | void | undefined; + +declare const roundTo: (n: number, round: number) => number; /** * Parses a path string value or object and returns an array @@ -347,8 +801,6 @@ declare const pathToCurve: (pathInput: string | PathArray) => CurveArray; */ declare const pathToString: (path: PathArray, roundOption?: number | "off") => string; -declare const error = "SVGPathCommander Error"; - /** * Parses a path string value and returns an array * of segments we like to call `pathArray`. @@ -358,24 +810,6 @@ declare const error = "SVGPathCommander Error"; */ declare const parsePathString: (pathInput: string | T) => PathArray; -/** - * The `PathParser` is used by the `parsePathString` static method - * to generate a `pathArray`. - * - * @param pathString - */ -declare class PathParser { - segments: PathArray | PathSegment[]; - pathValue: string; - max: number; - index: number; - param: number; - segmentStart: number; - data: (string | number)[]; - err: string; - constructor(pathString: string); -} - /** * Breaks the parsing of a pathString once a segment is finalized. * @@ -906,153 +1340,4 @@ declare const shortenSegment: (segment: AbsoluteSegment, normalSegment: NormalSe */ declare const splitCubic: (pts: number[], ratio?: number) => [CubicSegment, CubicSegment]; -/** - * Creates a new SVGPathCommander instance with the following properties: - * * segments: `pathArray` - * * round: number - * * origin: [number, number, number?] - * - * @class - * @author thednp - * @returns a new SVGPathCommander instance - */ -declare class SVGPathCommander { - segments: PathArray; - round: number | "off"; - origin: [number, number, number]; - /** - * @constructor - * @param pathValue the path string - * @param config instance options - */ - constructor(pathValue: string, config?: Partial); - get bbox(): { - x: number; - y: number; - width: number; - height: number; - x2: number; - y2: number; - cx: number; - cy: number; - cz: number; - }; - get length(): number; - /** - * Returns the path bounding box, equivalent to native `path.getBBox()`. - * - * @public - * @returns the pathBBox - */ - getBBox(): { - x: number; - y: number; - width: number; - height: number; - x2: number; - y2: number; - cx: number; - cy: number; - cz: number; - }; - /** - * Returns the total path length, equivalent to native `path.getTotalLength()`. - * - * @public - * @returns the path total length - */ - getTotalLength(): number; - /** - * Returns an `{x,y}` point in the path stroke at a given length, - * equivalent to the native `path.getPointAtLength()`. - * - * @public - * @param length the length - * @returns the requested point - */ - getPointAtLength(length: number): { - x: number; - y: number; - }; - /** - * Convert path to absolute values - * - * @public - */ - toAbsolute(): this; - /** - * Convert path to relative values - * - * @public - */ - toRelative(): this; - /** - * Convert path to cubic-bezier values. In addition, un-necessary `Z` - * segment is removed if previous segment extends to the `M` segment. - * - * @public - */ - toCurve(): this; - /** - * Reverse the order of the segments and their values. - * - * @param onlySubpath option to reverse all sub-paths except first - * @public - */ - reverse(onlySubpath?: boolean): this; - /** - * Normalize path in 2 steps: - * * convert `pathArray`(s) to absolute values - * * convert shorthand notation to standard notation - * - * @public - */ - normalize(): this; - /** - * Optimize `pathArray` values: - * * convert segments to absolute and/or relative values - * * select segments with shortest resulted string - * * round values to the specified `decimals` option value - * - * @public - */ - optimize(): this; - /** - * Transform path using values from an `Object` defined as `transformObject`. - * - * @see TransformObject for a quick refference - * - * @param source a `transformObject`as described above - * @public - */ - transform(source?: Partial): this; - /** - * Rotate path 180deg vertically - * - * @public - */ - flipX(): this; - /** - * Rotate path 180deg horizontally - * - * @public - */ - flipY(): this; - /** - * Export the current path to be used - * for the `d` (description) attribute. - * - * @public - * @return the path string - */ - toString(): string; - /** - * Remove the instance. - * - * @public - * @return void - */ - dispose(): void; -} - -export { type ACommand, type ASegment, type AbsoluteArray, type AbsoluteCommand, type AbsoluteSegment, type ArcCoordinates, type ArcSegment, type CCommand, type CSegment, type CircleAttr, type CloseSegment, type CubicCoordinates, type CubicPoints, type CubicSegment, type CurveArray, type DeriveCallback, type DerivedCubicPoints, type DerivedPoint, type DerivedQuadPoints, type DigitNumber, type EllipseAttr, type GlyphAttr, type HCommand, type HSegment, type HorLineSegment, type IteratorCallback, type LCommand, type LSegment, type LengthFactory, type LineAttr, type LineCoordinates, type LineSegment, type MCommand, type MSegment, type MoveSegment, type NormalArray, type NormalSegment, type Options, type ParserParams, type PathArray, type PathBBox, type PathCommand, type PathCommandNumber, type PathSegment, type PathTransform, type Point, type PointProperties, type PointTuple, type PolyAttr, type PolygonArray, type PolylineArray, type QCommand, type QSegment, type QuadCoordinates, type QuadPoints, type QuadSegment, type RectAttr, type RelativeArray, type RelativeCommand, type RelativeSegment, type SCommand, type SSegment, type SegmentLimits, type SegmentProperties, type ShapeOps, type ShapeParams, type ShapeTags, type ShapeTypes, type ShortCubicSegment, type ShortQuadSegment, type ShortSegment, type SpaceNumber, type TCommand, type TSegment, type TransformEntries, type TransformObject, type TransformObjectValues, type TransformProps, type VCommand, type VSegment, type VertLineSegment, type ZCommand, type ZSegment, type aCommand, type aSegment, absolutizeSegment, arcToCubic, type cCommand, type cSegment, SVGPathCommander as default, DISTANCE_EPSILON as distanceEpsilon, error, finalizeSegment, getClosestPoint, getDrawDirection, getPathArea, getPathBBox, getPointAtLength, getPropertiesAtLength, getPropertiesAtPoint, getSVGMatrix, getSegmentAtLength, getSegmentOfPoint, getTotalLength, type hCommand, type hSegment, invalidPathValue, isAbsoluteArray, isArcCommand, isCurveArray, isDigit, isDigitStart, isMoveCommand, isNormalizedArray, isPathArray, isPathCommand, isPointInStroke, isRelativeArray, isSpace, isValidPath, iterate, type lCommand, type lSegment, lineToCubic, type mCommand, type mSegment, normalizePath, normalizeSegment, optimizePath, paramsCount, paramsParser, parsePathString, PathParser as pathParser, pathToAbsolute, pathToCurve, pathToRelative, pathToString, projection2d, type qCommand, type qSegment, quadToCubic, relativizeSegment, reverseCurve, reversePath, roundPath, roundSegment, type sCommand, type sSegment, scanFlag, scanParam, scanSegment, segmentToCubic, shapeParams, shapeToPath, shapeToPathArray, shortenSegment, skipSpaces, splitCubic, splitPath, type tCommand, type tSegment, transformPath, type vCommand, type vSegment, type zCommand, type zSegment }; +export { type ACommand, type ASegment, type AbsoluteArray, type AbsoluteCommand, type AbsoluteSegment, type ArcCoordinates, type ArcSegment, type CCommand, type CSegment, type CircleAttr, type CloseSegment, type CubicCoordinates, type CubicPoints, type CubicSegment, type CurveArray, type DeriveCallback, type DerivedCubicPoints, type DerivedPoint, type DerivedQuadPoints, type DigitNumber, type EllipseAttr, type GlyphAttr, type HCommand, type HSegment, type HorLineSegment, type IteratorCallback, type LCommand, type LSegment, type LengthFactory, type LineAttr, type LineCoordinates, type LineSegment, type MCommand, type MSegment, type MoveSegment, type NormalArray, type NormalSegment, type Options, type ParserParams, type PathArray, type PathBBox, type PathCommand, type PathCommandNumber, type PathSegment, type PathTransform, type Point, type PointProperties, type PointTuple, type PolyAttr, type PolygonArray, type PolylineArray, type QCommand, type QSegment, type QuadCoordinates, type QuadPoints, type QuadSegment, type RectAttr, type RelativeArray, type RelativeCommand, type RelativeSegment, type SCommand, type SSegment, type SegmentLimits, type SegmentProperties, type ShapeOps, type ShapeParams, type ShapeTags, type ShapeTypes, type ShortCubicSegment, type ShortQuadSegment, type ShortSegment, type SpaceNumber, type TCommand, type TSegment, type TransformEntries, type TransformObject, type TransformObjectValues, type TransformProps, type VCommand, type VSegment, type VertLineSegment, type ZCommand, type ZSegment, type aCommand, type aSegment, absolutizeSegment, arcToCubic, arcTools, bezierTools, type cCommand, type cSegment, cubicTools, SVGPathCommander as default, DISTANCE_EPSILON as distanceEpsilon, distanceSquareRoot, finalizeSegment, getClosestPoint, getDrawDirection, getPathArea, getPathBBox, getPointAtLength, getPropertiesAtLength, getPropertiesAtPoint, getSVGMatrix, getSegmentAtLength, getSegmentOfPoint, getTotalLength, type hCommand, type hSegment, invalidPathValue, isAbsoluteArray, isArcCommand, isCurveArray, isDigit, isDigitStart, isMoveCommand, isNormalizedArray, isPathArray, isPathCommand, isPointInStroke, isRelativeArray, isSpace, isValidPath, iterate, type lCommand, type lSegment, lineToCubic, lineTools, type mCommand, type mSegment, midPoint, normalizePath, normalizeSegment, optimizePath, paramsCount, paramsParser, parsePathString, PathParser as pathParser, pathToAbsolute, pathToCurve, pathToRelative, pathToString, polygonTools, projection2d, type qCommand, type qSegment, quadToCubic, quadTools, relativizeSegment, reverseCurve, reversePath, rotateVector, roundPath, roundSegment, roundTo, type sCommand, type sSegment, scanFlag, scanParam, scanSegment, segmentToCubic, shapeParams, shapeToPath, shapeToPathArray, shortenSegment, skipSpaces, splitCubic, splitPath, type tCommand, type tSegment, transformPath, type vCommand, type vSegment, type zCommand, type zSegment }; diff --git a/dist/svg-path-commander.js b/dist/svg-path-commander.js index db26400..ee4e86b 100644 --- a/dist/svg-path-commander.js +++ b/dist/svg-path-commander.js @@ -1,2 +1,2 @@ -var SVGPathCommander=function(x){"use strict";const _={origin:[0,0,0],round:4},W={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Me=t=>{let e=t.pathValue[t.segmentStart],r=e.toLowerCase();const{data:s}=t;for(;s.length>=W[r]&&(r==="m"&&s.length>2?(t.segments.push([e].concat(s.splice(0,2))),r="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(s.splice(0,W[r]))),!!W[r]););},R="SVGPathCommander Error",Ee=t=>{const{index:e,pathValue:r}=t,s=r.charCodeAt(e);if(s===48){t.param=0,t.index+=1;return}if(s===49){t.param=1,t.index+=1;return}t.err=`${R}: invalid Arc flag "${r[e]}", expecting 0 or 1 at index ${e}`},G=t=>t>=48&&t<=57,U="Invalid path value",Re=t=>{const{max:e,pathValue:r,index:s}=t;let n=s,i=!1,o=!1,a=!1,c=!1,l;if(n>=e){t.err=`${R}: ${U} at index ${n}, "pathValue" is missing param`;return}if(l=r.charCodeAt(n),(l===43||l===45)&&(n+=1,l=r.charCodeAt(n)),!G(l)&&l!==46){t.err=`${R}: ${U} at index ${n}, "${r[n]}" is not a number`;return}if(l!==46){if(i=l===48,n+=1,l=r.charCodeAt(n),i&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),X=t=>{const{pathValue:e,max:r}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Ze=t=>G(t)||t===43||t===45||t===46,De=t=>(t|32)===97,Oe=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},Ce=t=>{var c;const{max:e,pathValue:r,index:s,segments:n}=t,i=r.charCodeAt(s),o=W[r[s].toLowerCase()];if(t.segmentStart=s,!Qe(i)){t.err=`${R}: ${U} "${r[s]}" is not a path command at index ${s}`;return}const a=n[n.length-1];if(!Oe(i)&&((c=a==null?void 0:a[0])==null?void 0:c.toLocaleLowerCase())==="z"){t.err=`${R}: ${U} "${r[s]}" is not a MoveTo path command at index ${s}`;return}if(t.index+=1,X(t),t.data=[],!o){Me(t);return}for(;;){for(let l=o;l>0;l-=1){if(De(i)&&(l===3||l===4)?Ee(t):Re(t),t.err.length)return;t.data.push(t.param),X(t),t.index=t.max||!Ze(r.charCodeAt(t.index)))break}Me(t)};class Pe{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const Q=t=>{if(typeof t!="string")return t.slice(0);const e=new Pe(t);for(X(e);e.index{const[n]=t,i=n.toUpperCase();if(e===0||i===n)return t;if(i==="A")return[i,t[1],t[2],t[3],t[4],t[5],t[6]+r,t[7]+s];if(i==="V")return[i,t[1]+s];if(i==="H")return[i,t[1]+r];if(i==="L")return[i,t[1]+r,t[2]+s];{const a=[],c=t.length;for(let l=1;l{let r=t.length,s,n="M",i="M",o=!1,a=0,c=0,l=0,m=0,h=0;for(let f=0;f{const e=Q(t);return Z(e,ne)},Se=(t,e,r,s)=>{const[n]=t,i=n.toLowerCase();if(e===0||n===i)return t;if(i==="a")return[i,t[1],t[2],t[3],t[4],t[5],t[6]-r,t[7]-s];if(i==="v")return[i,t[1]-s];if(i==="h")return[i,t[1]-r];if(i==="l")return[i,t[1]-r,t[2]-s];{const a=[],c=t.length;for(let l=1;l{const e=Q(t);return Z(e,Se)},le=(t,e,r)=>{const{sin:s,cos:n}=Math,i=t*n(r)-e*s(r),o=t*s(r)+e*n(r);return{x:i,y:o}},me=(t,e,r,s,n,i,o,a,c,l)=>{let m=t,h=e,f=r,y=s,u=a,g=c;const A=Math.PI*120/180,p=Math.PI/180*(+n||0);let M=[],d,b,C,S,k;if(l)[b,C,S,k]=l;else{d=le(m,h,-p),m=d.x,h=d.y,d=le(u,g,-p),u=d.x,g=d.y;const L=(m-u)/2,V=(h-g)/2;let T=L*L/(f*f)+V*V/(y*y);T>1&&(T=Math.sqrt(T),f*=T,y*=T);const Ie=f*f,Ve=y*y,St=(i===o?-1:1)*Math.sqrt(Math.abs((Ie*Ve-Ie*V*V-Ve*L*L)/(Ie*V*V+Ve*L*L)));S=St*f*V/y+(m+u)/2,k=St*-y*L/f+(h+g)/2,b=Math.asin(((h-k)/y*10**9>>0)/10**9),C=Math.asin(((g-k)/y*10**9>>0)/10**9),b=mC&&(b-=Math.PI*2),!o&&C>b&&(C-=Math.PI*2)}let z=C-b;if(Math.abs(z)>A){const L=C,V=u,T=g;C=b+A*(o&&C>b?1:-1),u=S+f*Math.cos(C),g=k+y*Math.sin(C),M=me(u,g,f,y,n,0,o,V,T,[C,L,S,k])}z=C-b;const v=Math.cos(b),w=Math.sin(b),D=Math.cos(C),J=Math.sin(C),q=Math.tan(z/4),P=4/3*f*q,I=4/3*y*q,O=[m,h],j=[m+P*w,h-I*v],F=[u+P*J,g-I*D],te=[u,g];if(j[0]=2*O[0]-j[0],j[1]=2*O[1]-j[1],l)return[j[0],j[1],F[0],F[1],te[0],te[1]].concat(M);M=[j[0],j[1],F[0],F[1],te[0],te[1]].concat(M);const K=[];for(let L=0,V=M.length;L{const o=.3333333333333333,a=2/3;return[o*t+a*r,o*e+a*s,o*n+a*r,o*i+a*s,n,i]},B=(t,e,r)=>{const[s,n]=t,[i,o]=e;return[s+(i-s)*r,n+(o-n)*r]},Ne=(t,e,r,s)=>{const n=B([t,e],[r,s],.3333333333333333),i=B([t,e],[r,s],2/3);return[n[0],n[1],i[0],i[1],r,s]},Fe=(t,e)=>{const[r]=t,s=t.slice(1).map(Number),[n,i]=s,{x1:o,y1:a,x:c,y:l}=e;return"TQ".includes(r)||(e.qx=null,e.qy=null),r==="M"?(e.x=n,e.y=i,t):r==="A"?["C"].concat(me(o,a,s[0],s[1],s[2],s[3],s[4],s[5],s[6])):r==="Q"?(e.qx=n,e.qy=i,["C"].concat(He(o,a,s[0],s[1],s[2],s[3]))):r==="L"?["C"].concat(Ne(o,a,n,i)):r==="Z"?["C"].concat(Ne(o,a,c,l)):t},ue=(t,e)=>{const[r]=t,s=r.toUpperCase(),n=r!==s,{x1:i,y1:o,x2:a,y2:c,x:l,y:m}=e,h=t.slice(1);let f=h.map((y,u)=>y+(n?u%2?m:l:0));if("TQ".includes(s)||(e.qx=null,e.qy=null),s==="A")return f=h.slice(0,-2).concat(h[5]+(n?l:0),h[6]+(n?m:0)),["A"].concat(f);if(s==="H")return["L",t[1]+(n?l:0),o];if(s==="V")return["L",i,t[1]+(n?m:0)];if(s==="L")return["L",t[1]+(n?l:0),t[2]+(n?m:0)];if(s==="M")return["M",t[1]+(n?l:0),t[2]+(n?m:0)];if(s==="C")return["C"].concat(f);if(s==="S"){const y=i*2-a,u=o*2-c;return e.x1=y,e.y1=u,["C",y,u].concat(f)}else if(s==="T"){const y=i*2-(e.qx?e.qx:0),u=o*2-(e.qy?e.qy:0);return e.qx=y,e.qy=u,["Q",y,u].concat(f)}else if(s==="Q"){const[y,u]=f;return e.qx=y,e.qy=u,["Q"].concat(f)}else if(s==="Z")return["Z"];return t},re={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},he=t=>{const e={...re},r=Q(t);return Z(r,(s,n,i,o)=>{e.x=i,e.y=o;const a=ue(s,e);let c=Fe(a,e);c[0]==="C"&&c.length>7&&(r.splice(n+1,0,["C"].concat(c.slice(7))),c=c.slice(0,7));const m=c.length;return e.x1=+c[m-2],e.y1=+c[m-1],e.x2=+c[m-4]||e.x1,e.y2=+c[m-3]||e.y1,c})},$=(t,e)=>{const r=e>=1?10**e:1;return e>0?Math.round(t*r)/r:Math.round(t)},we=(t,e)=>{const r=t.length;let{round:s}=_,n=t[0],i="";s=e==="off"||typeof e=="number"&&e>=0?e:typeof s=="number"&&s>=0?s:"off";for(let o=0;oMath.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),fe=(t,e,r,s)=>Ge([t,e],[r,s]),Ue=(t,e,r,s,n)=>{let i={x:t,y:e};if(typeof n=="number"){const o=Ge([t,e],[r,s]);if(n<=0)i={x:t,y:e};else if(n>=o)i={x:r,y:s};else{const[a,c]=B([t,e],[r,s],n/o);i={x:a,y:c}}}return i},_e=(t,e,r,s)=>{const{min:n,max:i}=Math;return[n(t,r),n(e,s),i(t,r),i(e,s)]},Je=(t,e,r)=>{const s=r/2,n=Math.sin(s),i=Math.cos(s),o=t**2*n**2,a=e**2*i**2,c=Math.sqrt(o+a)*r;return Math.abs(c)},Y=(t,e,r,s,n,i)=>{const{sin:o,cos:a}=Math,c=a(n),l=o(n),m=r*a(i),h=s*o(i);return[t+c*m-l*h,e+l*m+c*h]},Ke=(t,e)=>{const{x:r,y:s}=t,{x:n,y:i}=e,o=r*n+s*i,a=Math.sqrt((r**2+s**2)*(n**2+i**2));return(r*i-s*n<0?-1:1)*Math.acos(o/a)},Le=(t,e,r,s,n,i,o,a,c)=>{const{abs:l,sin:m,cos:h,sqrt:f,PI:y}=Math;let u=l(r),g=l(s);const p=(n%360+360)%360*(y/180);if(t===a&&e===c)return{rx:u,ry:g,startAngle:0,endAngle:0,center:{x:a,y:c}};if(u===0||g===0)return{rx:u,ry:g,startAngle:0,endAngle:0,center:{x:(a+t)/2,y:(c+e)/2}};const M=(t-a)/2,d=(e-c)/2,b={x:h(p)*M+m(p)*d,y:-m(p)*M+h(p)*d},C=b.x**2/u**2+b.y**2/g**2;C>1&&(u*=f(C),g*=f(C));const S=u**2*g**2-u**2*b.y**2-g**2*b.x**2,k=u**2*b.y**2+g**2*b.x**2;let z=S/k;z=z<0?0:z;const v=(i!==o?1:-1)*f(z),w={x:v*(u*b.y/g),y:v*(-(g*b.x)/u)},D={x:h(p)*w.x-m(p)*w.y+(t+a)/2,y:m(p)*w.x+h(p)*w.y+(e+c)/2},J={x:(b.x-w.x)/u,y:(b.y-w.y)/g},q=Ke({x:1,y:0},J),P={x:(-b.x-w.x)/u,y:(-b.y-w.y)/g};let I=Ke(J,P);!o&&I>0?I-=2*y:o&&I<0&&(I+=2*y),I%=2*y;const O=q+I;return{center:D,startAngle:q,endAngle:O,rx:u,ry:g}},We=(t,e,r,s,n,i,o,a,c)=>{const{rx:l,ry:m,startAngle:h,endAngle:f}=Le(t,e,r,s,n,i,o,a,c);return Je(l,m,f-h)},Nt=(t,e,r,s,n,i,o,a,c,l)=>{let m={x:t,y:e};const{center:h,rx:f,ry:y,startAngle:u,endAngle:g}=Le(t,e,r,s,n,i,o,a,c);if(typeof l=="number"){const A=Je(f,y,g-u);if(l<=0)m={x:t,y:e};else if(l>=A)m={x:a,y:c};else{if(t===a&&e===c)return{x:a,y:c};if(f===0||y===0)return Ue(t,e,a,c,l);const{PI:p,cos:M,sin:d}=Math,b=g-u,S=(n%360+360)%360*(p/180),k=u+b*(l/A),z=f*M(k),v=y*d(k);m={x:M(S)*z-d(S)*v+h.x,y:d(S)*z+M(S)*v+h.y}}}return m},wt=(t,e,r,s,n,i,o,a,c)=>{const{center:l,rx:m,ry:h,startAngle:f,endAngle:y}=Le(t,e,r,s,n,i,o,a,c),u=y-f,{min:g,max:A,tan:p,atan2:M,PI:d}=Math,{x:b,y:C}=l,S=n*d/180,k=p(S),z=M(-h*k,m),v=z,w=z+d,D=M(h,m*k),J=D+d,q=[a],P=[c];let I=g(t,a),O=A(t,a),j=g(e,c),F=A(e,c);const te=y-u*1e-5,K=Y(b,C,m,h,S,te),L=y-u*.99999,V=Y(b,C,m,h,S,L);if(K[0]>O||V[0]>O){const T=Y(b,C,m,h,S,v);q.push(T[0]),P.push(T[1])}if(K[0]F||V[1]>F){const T=Y(b,C,m,h,S,D);q.push(T[0]),P.push(T[1])}return I=g.apply([],q),j=g.apply([],P),O=A.apply([],q),F=A.apply([],P),[I,j,O,F]},Xe=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Lt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],vt=t=>{const e=[];for(let r=t,s=r.length,n=s-1;s>1;s-=1,n-=1){const i=[];for(let o=0;o{if(e===0)return t[0].t=0,t[0];const r=t.length-1;if(e===1)return t[r].t=1,t[r];const s=1-e;let n=t;if(r===0)return t[0].t=e,t[0];if(r===1)return{x:s*n[0].x+e*n[1].x,y:s*n[0].y+e*n[1].y,t:e};const i=s*s,o=e*e;let a=0,c=0,l=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],a=i,c=s*e*2,l=o):r===3&&(a=i*s,c=i*e*3,l=s*o*3,m=e*o),{x:a*n[0].x+c*n[1].x+l*n[2].x+m*n[3].x,y:a*n[0].y+c*n[1].y+l*n[2].y+m*n[3].y,t:e}},$t=(t,e)=>{const r=t(e),s=r.x*r.x+r.y*r.y;return Math.sqrt(s)},kt=t=>{const r=Xe.length;let s=0;for(let n=0,i;n{const e=[];for(let s=0,n=t.length,i=2;sTt(r[0],s))},zt=1e-8,ve=([t,e,r])=>{const s=Math.min(t,r),n=Math.max(t,r);if(e>=t?r>=e:r<=e)return[s,n];const i=(t*r-e*e)/(t-2*e+r);return i{const n=t-3*e+3*r-s;if(Math.abs(n)0&&m<1){const f=t*(1-m)*(1-m)*(1-m)+e*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+s*m*m*m;fc&&(c=f)}return[a,c]},qt=([t,e,r,s,n,i,o,a],c)=>{const l=1-c;return{x:l**3*t+3*l**2*c*r+3*l*c**2*n+c**3*o,y:l**3*e+3*l**2*c*s+3*l*c**2*i+c**3*a}},Te=(t,e,r,s,n,i,o,a)=>ye([t,e,r,s,n,i,o,a]),It=(t,e,r,s,n,i,o,a,c)=>{const l=typeof c=="number";let m={x:t,y:e};if(l){const h=ye([t,e,r,s,n,i,o,a]);c<=0||(c>=h?m={x:o,y:a}:m=qt([t,e,r,s,n,i,o,a],c/h))}return m},et=(t,e,r,s,n,i,o,a)=>{const c=Ye([t,r,n,o]),l=Ye([e,s,i,a]);return[c[0],l[0],c[1],l[1]]},Vt=([t,e,r,s,n,i],o)=>{const a=1-o;return{x:a**2*t+2*a*o*r+o**2*n,y:a**2*e+2*a*o*s+o**2*i}},$e=(t,e,r,s,n,i)=>ye([t,e,r,s,n,i]),Et=(t,e,r,s,n,i,o)=>{const a=typeof o=="number";let c={x:t,y:e};if(a){const l=ye([t,e,r,s,n,i]);o<=0||(o>=l?c={x:n,y:i}:c=Vt([t,e,r,s,n,i],o/l))}return c},tt=(t,e,r,s,n,i)=>{const o=ve([t,r,n]),a=ve([e,s,i]);return[o[0],a[0],o[1],a[1]]},nt=t=>{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const e=Q(t);let r="M",s=0,n=0;const{max:i,min:o}=Math;let a=1/0,c=1/0,l=-1/0,m=-1/0,h=0,f=0,y=0,u=0,g=0,A=0,p=0,M=0,d=0,b=0;Z(e,(k,z,v,w)=>{[r]=k;const D=r.toUpperCase(),q=D!==r?ne(k,z,v,w):k.slice(0),P=D==="V"?["L",v,q[1]]:D==="H"?["L",q[1],w]:q;if([r]=P,"TQ".includes(D)||(d=0,b=0),r==="M")[,s,n]=P,h=s,f=n,y=s,u=n;else if(r==="L")[h,f,y,u]=_e(v,w,P[1],P[2]);else if(r==="A")[h,f,y,u]=wt(v,w,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(r==="S"){const I=g*2-p,O=A*2-M;[h,f,y,u]=et(v,w,I,O,P[1],P[2],P[3],P[4])}else r==="C"?[h,f,y,u]=et(v,w,P[1],P[2],P[3],P[4],P[5],P[6]):r==="T"?(d=g*2-d,b=A*2-b,[h,f,y,u]=tt(v,w,d,b,P[1],P[2])):r==="Q"?(d=P[1],b=P[2],[h,f,y,u]=tt(v,w,P[1],P[2],P[3],P[4])):r==="Z"&&([h,f,y,u]=_e(v,w,s,n));a=o(h,a),c=o(f,c),l=i(y,l),m=i(u,m),[g,A]=r==="Z"?[s,n]:P.slice(-2),[p,M]=r==="C"?[P[3],P[4]]:r==="S"?[P[1],P[2]]:[g,A]});const C=l-a,S=m-c;return{width:C,height:S,x:a,y:c,x2:l,y2:m,cx:a+C/2,cy:c+S/2,cz:Math.max(C,S)+Math.min(C,S)/2}},ee=t=>{const e=Q(t);let r=0,s=0,n=0,i=0,o=0,a=0,c="M",l=0,m=0,h=0;return Z(e,(f,y,u,g)=>{[c]=f;const A=c.toUpperCase(),M=A!==c?ne(f,y,u,g):f.slice(0),d=A==="V"?["L",u,M[1]]:A==="H"?["L",M[1],g]:M;if([c]=d,"TQ".includes(A)||(o=0,a=0),c==="M")[,l,m]=d;else if(c==="L")h+=fe(u,g,d[1],d[2]);else if(c==="A")h+=We(u,g,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(c==="S"){const b=r*2-n,C=s*2-i;h+=Te(u,g,b,C,d[1],d[2],d[3],d[4])}else c==="C"?h+=Te(u,g,d[1],d[2],d[3],d[4],d[5],d[6]):c==="T"?(o=r*2-o,a=s*2-a,h+=$e(u,g,o,a,d[1],d[2])):c==="Q"?(o=d[1],a=d[2],h+=$e(u,g,d[1],d[2],d[3],d[4])):c==="Z"&&(h+=fe(u,g,l,m));[r,s]=c==="Z"?[l,m]:d.slice(-2),[n,i]=c==="C"?[d[3],d[4]]:c==="S"?[d[1],d[2]]:[r,s]}),h},ge=1e-5,se=t=>{const e=Q(t),r={...re};return Z(e,(s,n,i,o)=>{r.x=i,r.y=o;const a=ue(s,r),c=a.length;return r.x1=+a[c-2],r.y1=+a[c-1],r.x2=+a[c-4]||r.x1,r.y2=+a[c-3]||r.y1,a})},ie=(t,e)=>{const r=se(t);let s=!1,n=[],i="M",o=0,a=0,[c,l]=r[0].slice(1);const m=typeof e=="number";let h={x:c,y:l},f=0,y=h,u=0;return!m||e{if([i]=g,s=i==="M",n=s?n:[p,M].concat(g.slice(1)),s?([,c,l]=g,h={x:c,y:l},f=0):i==="L"?(h=Ue(n[0],n[1],n[2],n[3],e-u),f=fe(n[0],n[1],n[2],n[3])):i==="A"?(h=Nt(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],e-u),f=We(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):i==="C"?(h=It(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],e-u),f=Te(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):i==="Q"?(h=Et(n[0],n[1],n[2],n[3],n[4],n[5],e-u),f=$e(n[0],n[1],n[2],n[3],n[4],n[5])):i==="Z"&&(n=[p,M,c,l],h={x:c,y:l},f=fe(n[0],n[1],n[2],n[3])),[o,a]=n.slice(-2),uu-ge?{x:o,y:a}:y)},rt=(t,e,r,s)=>{const[n]=t,{round:i}=_,o=i,a=e.slice(1),{x1:c,y1:l,x2:m,y2:h,x:f,y}=r,[u,g]=a.slice(-2),A=t;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if($(f,o)===$(u,o))return["V",g];if($(y,o)===$(g,o))return["H",u]}else if(n==="C"){const[p,M]=a;if(r.x1=p,r.y1=M,"CS".includes(s)&&($(p,o)===$(c*2-m,o)&&$(M,o)===$(l*2-h,o)||$(c,o)===$(m*2-f,o)&&$(l,o)===$(h*2-y,o)))return["S",a[2],a[3],a[4],a[5]]}else if(n==="Q"){const[p,M]=a;if(r.qx=p,r.qy=M,"QT".includes(s)&&$(p,o)===$(c*2-m,o)&&$(M,o)===$(l*2-h,o))return["T",a[2],a[3]]}return A},de=(t,e)=>{const r=t.slice(1).map(s=>$(s,e));return[t[0]].concat(r)},st=(t,e)=>{const r=ae(t),s=typeof e=="number"&&e>=0?e:2,n={...re},i=[];let o="M",a="Z";return Z(r,(c,l,m,h)=>{n.x=m,n.y=h;const f=ue(c,n);let y=c;if([o]=c,i[l]=o,l){a=i[l-1];const g=rt(c,f,n,a),A=de(g,s),p=A.join(""),M=Se(g,l,m,h),d=de(M,s),b=d.join("");y=p.length{const e=ae(t),r=se(e),s=e.length,n=e[s-1][0]==="Z",i=Z(e,(o,a)=>{const c=r[a],l=a&&e[a-1],m=l&&l[0],h=e[a+1],f=h&&h[0],[y]=o,[u,g]=r[a?a-1:s-1].slice(-2);let A=o;switch(y){case"M":A=n?["Z"]:[y,u,g];break;case"A":A=[y,o[1],o[2],o[3],o[4],o[5]===1?0:1,u,g];break;case"C":h&&f==="S"?A=["S",o[1],o[2],u,g]:A=[y,o[3],o[4],o[1],o[2],u,g];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?A=["C",c[3],c[4],c[1],c[2],u,g]:A=[y,c[1],c[2],u,g];break;case"Q":h&&f==="T"?A=["T",u,g]:A=[y,o[1],o[2],u,g];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?A=["Q",c[1],c[2],u,g]:A=[y,u,g];break;case"Z":A=["M",u,g];break;case"H":A=[y,u];break;case"V":A=[y,g];break;default:A=[y].concat(o.slice(1,-2),u,g)}return A});return n?i.reverse():[i[0]].concat(i.slice(1).reverse())},it=t=>{const e=[];let r,s=-1,n=0,i=0,o=0,a=0;const c={...re};return t.forEach(l=>{const[m]=l,h=m.toUpperCase(),f=m.toLowerCase(),y=m===f,u=l.slice(1);h==="M"?(s+=1,[n,i]=u,n+=y?c.x:0,i+=y?c.y:0,o=n,a=i,r=[y?[h,o,a]:l]):(h==="Z"?(n=o,i=a):h==="H"?([,n]=l,n+=y?c.x:0):h==="V"?([,i]=l,i+=y?c.y:0):([n,i]=l.slice(-2),n+=y?c.x:0,i+=y?c.y:0),r.push(l)),c.x=n,c.y=i,e[s]=r}),e};var Rt=Object.defineProperty,jt=(t,e,r)=>e in t?Rt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,E=(t,e,r)=>jt(t,typeof e!="symbol"?e+"":e,r);const Qt={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},ot=t=>(t instanceof Float64Array||t instanceof Float32Array||Array.isArray(t)&&t.every(e=>typeof e=="number"))&&[6,16].some(e=>t.length===e),ct=t=>t instanceof DOMMatrix||t instanceof N||typeof t=="object"&&Object.keys(Qt).every(e=>t&&e in t),oe=t=>{const e=new N,r=Array.from(t);if(!ot(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[s,n,i,o,a,c,l,m,h,f,y,u,g,A,p,M]=r;e.m11=s,e.a=s,e.m21=a,e.c=a,e.m31=h,e.m41=g,e.e=g,e.m12=n,e.b=n,e.m22=c,e.d=c,e.m32=f,e.m42=A,e.f=A,e.m13=i,e.m23=l,e.m33=y,e.m43=p,e.m14=o,e.m24=m,e.m34=u,e.m44=M}else if(r.length===6){const[s,n,i,o,a,c]=r;e.m11=s,e.a=s,e.m12=n,e.b=n,e.m21=i,e.c=i,e.m22=o,e.d=o,e.m41=a,e.e=a,e.m42=c,e.f=c}return e},at=t=>{if(ct(t))return oe([t.m11,t.m12,t.m13,t.m14,t.m21,t.m22,t.m23,t.m24,t.m31,t.m32,t.m33,t.m34,t.m41,t.m42,t.m43,t.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(t)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},lt=t=>{if(typeof t!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(t)}" is not a string.`);const e=String(t).replace(/\s/g,"");let r=new N;const s=`CSSMatrix: invalid transform string "${t}"`;return e.split(")").filter(n=>n).forEach(n=>{const[i,o]=n.split("(");if(!o)throw TypeError(s);const a=o.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[c,l,m,h]=a,f=[c,l,m],y=[c,l,m,h];if(i==="perspective"&&c&&[l,m].every(u=>u===void 0))r.m34=-1/c;else if(i.includes("matrix")&&[6,16].includes(a.length)&&a.every(u=>!Number.isNaN(+u))){const u=a.map(g=>Math.abs(g)<1e-6?0:g);r=r.multiply(oe(u))}else if(i==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(c,l,m);else if(i==="translate"&&c&&m===void 0)r=r.translate(c,l||0,0);else if(i==="rotate3d"&&y.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(c,l,m,h);else if(i==="rotate"&&c&&[l,m].every(u=>u===void 0))r=r.rotate(0,0,c);else if(i==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(c,l,m);else if(i==="scale"&&!Number.isNaN(c)&&(c!==1||l!==1)&&m===void 0){const u=Number.isNaN(+l)?c:l;r=r.scale(c,u,1)}else if(i==="skew"&&(c||!Number.isNaN(c)&&l)&&m===void 0)r=r.skew(c,l||0);else if(["translate","rotate","scale","skew"].some(u=>i.includes(u))&&/[XYZ]/.test(i)&&c&&[l,m].every(u=>u===void 0))if(i==="skewX"||i==="skewY")r=r[i](c);else{const u=i.replace(/[XYZ]/,""),g=i.replace(u,""),A=["X","Y","Z"].indexOf(g),p=u==="scale"?1:0,M=[A===0?c:p,A===1?c:p,A===2?c:p];r=r[u](...M)}else throw TypeError(s)}),r},ke=(t,e)=>e?[t.a,t.b,t.c,t.d,t.e,t.f]:[t.m11,t.m12,t.m13,t.m14,t.m21,t.m22,t.m23,t.m24,t.m31,t.m32,t.m33,t.m34,t.m41,t.m42,t.m43,t.m44],mt=(t,e,r)=>{const s=new N;return s.m41=t,s.e=t,s.m42=e,s.f=e,s.m43=r,s},ut=(t,e,r)=>{const s=new N,n=Math.PI/180,i=t*n,o=e*n,a=r*n,c=Math.cos(i),l=-Math.sin(i),m=Math.cos(o),h=-Math.sin(o),f=Math.cos(a),y=-Math.sin(a),u=m*f,g=-m*y;s.m11=u,s.a=u,s.m12=g,s.b=g,s.m13=h;const A=l*h*f+c*y;s.m21=A,s.c=A;const p=c*f-l*h*y;return s.m22=p,s.d=p,s.m23=-l*m,s.m31=l*y-c*h*f,s.m32=l*f+c*h*y,s.m33=c*m,s},ht=(t,e,r,s)=>{const n=new N,i=Math.sqrt(t*t+e*e+r*r);if(i===0)return n;const o=t/i,a=e/i,c=r/i,l=s*(Math.PI/360),m=Math.sin(l),h=Math.cos(l),f=m*m,y=o*o,u=a*a,g=c*c,A=1-2*(u+g)*f;n.m11=A,n.a=A;const p=2*(o*a*f+c*m*h);n.m12=p,n.b=p,n.m13=2*(o*c*f-a*m*h);const M=2*(a*o*f-c*m*h);n.m21=M,n.c=M;const d=1-2*(g+y)*f;return n.m22=d,n.d=d,n.m23=2*(a*c*f+o*m*h),n.m31=2*(c*o*f+a*m*h),n.m32=2*(c*a*f-o*m*h),n.m33=1-2*(y+u)*f,n},ft=(t,e,r)=>{const s=new N;return s.m11=t,s.a=t,s.m22=e,s.d=e,s.m33=r,s},xe=(t,e)=>{const r=new N;if(t){const s=t*Math.PI/180,n=Math.tan(s);r.m21=n,r.c=n}if(e){const s=e*Math.PI/180,n=Math.tan(s);r.m12=n,r.b=n}return r},yt=t=>xe(t,0),gt=t=>xe(0,t),H=(t,e)=>{const r=e.m11*t.m11+e.m12*t.m21+e.m13*t.m31+e.m14*t.m41,s=e.m11*t.m12+e.m12*t.m22+e.m13*t.m32+e.m14*t.m42,n=e.m11*t.m13+e.m12*t.m23+e.m13*t.m33+e.m14*t.m43,i=e.m11*t.m14+e.m12*t.m24+e.m13*t.m34+e.m14*t.m44,o=e.m21*t.m11+e.m22*t.m21+e.m23*t.m31+e.m24*t.m41,a=e.m21*t.m12+e.m22*t.m22+e.m23*t.m32+e.m24*t.m42,c=e.m21*t.m13+e.m22*t.m23+e.m23*t.m33+e.m24*t.m43,l=e.m21*t.m14+e.m22*t.m24+e.m23*t.m34+e.m24*t.m44,m=e.m31*t.m11+e.m32*t.m21+e.m33*t.m31+e.m34*t.m41,h=e.m31*t.m12+e.m32*t.m22+e.m33*t.m32+e.m34*t.m42,f=e.m31*t.m13+e.m32*t.m23+e.m33*t.m33+e.m34*t.m43,y=e.m31*t.m14+e.m32*t.m24+e.m33*t.m34+e.m34*t.m44,u=e.m41*t.m11+e.m42*t.m21+e.m43*t.m31+e.m44*t.m41,g=e.m41*t.m12+e.m42*t.m22+e.m43*t.m32+e.m44*t.m42,A=e.m41*t.m13+e.m42*t.m23+e.m43*t.m33+e.m44*t.m43,p=e.m41*t.m14+e.m42*t.m24+e.m43*t.m34+e.m44*t.m44;return oe([r,s,n,i,o,a,c,l,m,h,f,y,u,g,A,p])};class N{constructor(e){return 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}get isIdentity(){return 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}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(e){return typeof e=="string"&&e.length&&e!=="none"?lt(e):Array.isArray(e)||e instanceof Float64Array||e instanceof Float32Array?oe(e):typeof e=="object"?at(e):this}toFloat32Array(e){return Float32Array.from(ke(this,e))}toFloat64Array(e){return Float64Array.from(ke(this,e))}toString(){const{is2D:e}=this,r=this.toFloat64Array(e).join(", ");return`${e?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:e,isIdentity:r}=this;return{...this,is2D:e,isIdentity:r}}multiply(e){return H(this,e)}translate(e,r,s){const n=e;let i=r,o=s;return typeof i>"u"&&(i=0),typeof o>"u"&&(o=0),H(this,mt(n,i,o))}scale(e,r,s){const n=e;let i=r,o=s;return typeof i>"u"&&(i=e),typeof o>"u"&&(o=1),H(this,ft(n,i,o))}rotate(e,r,s){let n=e,i=r||0,o=s||0;return typeof e=="number"&&typeof r>"u"&&typeof s>"u"&&(o=n,n=0,i=0),H(this,ut(n,i,o))}rotateAxisAngle(e,r,s,n){if([e,r,s,n].some(i=>Number.isNaN(+i)))throw new TypeError("CSSMatrix: expecting 4 values");return H(this,ht(e,r,s,n))}skewX(e){return H(this,yt(e))}skewY(e){return H(this,gt(e))}skew(e,r){return H(this,xe(e,r))}transformPoint(e){const r=this.m11*e.x+this.m21*e.y+this.m31*e.z+this.m41*e.w,s=this.m12*e.x+this.m22*e.y+this.m32*e.z+this.m42*e.w,n=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;return e instanceof DOMPoint?new DOMPoint(r,s,n,i):{x:r,y:s,z:n,w:i}}}E(N,"Translate",mt),E(N,"Rotate",ut),E(N,"RotateAxisAngle",ht),E(N,"Scale",ft),E(N,"SkewX",yt),E(N,"SkewY",gt),E(N,"Skew",xe),E(N,"Multiply",H),E(N,"fromArray",oe),E(N,"fromMatrix",at),E(N,"fromString",lt),E(N,"toArray",ke),E(N,"isCompatibleArray",ot),E(N,"isCompatibleObject",ct);const dt=t=>{let e=new N;const{origin:r}=t,[s,n]=r,{translate:i}=t,{rotate:o}=t,{skew:a}=t,{scale:c}=t;return Array.isArray(i)&&i.length>=2&&i.every(l=>!Number.isNaN(+l))&&i.some(l=>l!==0)?e=e.translate(...i):typeof i=="number"&&!Number.isNaN(i)&&(e=e.translate(i)),(o||a||c)&&(e=e.translate(s,n),Array.isArray(o)&&o.length>=2&&o.every(l=>!Number.isNaN(+l))&&o.some(l=>l!==0)?e=e.rotate(...o):typeof o=="number"&&!Number.isNaN(o)&&(e=e.rotate(o)),Array.isArray(a)&&a.length===2&&a.every(l=>!Number.isNaN(+l))&&a.some(l=>l!==0)?(e=a[0]?e.skewX(a[0]):e,e=a[1]?e.skewY(a[1]):e):typeof a=="number"&&!Number.isNaN(a)&&(e=e.skewX(a)),Array.isArray(c)&&c.length>=2&&c.every(l=>!Number.isNaN(+l))&&c.some(l=>l!==1)?e=e.scale(...c):typeof c=="number"&&!Number.isNaN(c)&&(e=e.scale(c)),e=e.translate(-s,-n)),e},Zt=(t,e)=>{let r=N.Translate(e[0],e[1],e[2]);return[,,,r.m44]=e,r=t.multiply(r),[r.m41,r.m42,r.m43,r.m44]},ze=(t,e,r)=>{const[s,n,i]=r,[o,a,c]=Zt(t,[e[0],e[1],0,1]),l=o-s,m=a-n,h=c-i;return[l*(Math.abs(i)/Math.abs(h)||1)+s,m*(Math.abs(i)/Math.abs(h)||1)+n]},bt=(t,e)=>{let r=0,s=0,n=0,i=0,o=0,a=0,c="M";const l=Q(t),m=e&&Object.keys(e);if(!e||m&&!m.length)return l.slice(0);e.origin||Object.assign(e,{origin:_.origin});const h=e.origin,f=dt(e);return f.isIdentity?l.slice(0):Z(l,(y,u,g,A)=>{[c]=y;const p=c.toUpperCase(),d=p!==c?ne(y,u,g,A):y.slice(0);let b=p==="A"?["C"].concat(me(g,A,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):p==="V"?["L",g,d[1]]:p==="H"?["L",d[1],A]:d;c=b[0];const C=c==="C"&&b.length>7,S=C?b.slice(0,7):b.slice(0);if(C&&(l.splice(u+1,0,["C"].concat(b.slice(7))),b=S),c==="L")[n,i]=ze(f,[b[1],b[2]],h),r!==n&&s!==i?b=["L",n,i]:s===i?b=["H",n]:r===n&&(b=["V",i]);else for(o=1,a=b.length;o{const r=Q(t);let s=r.slice(0),n=ee(s),i=s.length-1,o=0,a=0,c=r[0];if(i<=0||!e||!Number.isFinite(e))return{segment:c,index:0,length:a,lengthAtSegment:o};if(e>=n)return s=r.slice(0,-1),o=ee(s),a=n-o,c=r[i],{segment:c,index:i,length:a,lengthAtSegment:o};const l=[];for(;i>0;)c=s[i],s=s.slice(0,-1),o=ee(s),a=n-o,n=o,l.push({segment:c,index:i,length:a,lengthAtSegment:o}),i-=1;return l.find(({lengthAtSegment:m})=>m<=e)},Ae=(t,e)=>{const r=Q(t),s=se(r),n=ee(s),i=b=>{const C=b.x-e.x,S=b.y-e.y;return C*C+S*S};let o=8,a,c={x:0,y:0},l=0,m=0,h=1/0;for(let b=0;b<=n;b+=o)a=ie(s,b),l=i(a),l1e-6&&(u=m-o,f=ie(s,u),A=i(f),g=m+o,y=ie(s,g),p=i(y),u>=0&&AAe(t,e).closest,Ot=(t,e,r,s,n,i,o,a)=>3*((a-e)*(r+n)-(o-t)*(s+i)+s*(t-n)-r*(e-i)+a*(n+t/3)-o*(i+e/3))/20,xt=t=>{let e=0,r=0,s=0;return he(t).map(n=>{switch(n[0]){case"M":return[,e,r]=n,0;default:return s=Ot(e,r,n[1],n[2],n[3],n[4],n[5],n[6]),[e,r]=n.slice(-2),s}}).reduce((n,i)=>n+i,0)},Bt=t=>xt(he(t))>=0,Ht=(t,e)=>qe(t,e).segment,Ft=(t,e)=>Ae(t,e).segment,pe=t=>Array.isArray(t)&&t.every(e=>{const r=e[0].toLowerCase();return W[r]===e.length-1&&"achlmqstvz".includes(r)&&e.slice(1).every(Number.isFinite)})&&t.length>0,At=t=>pe(t)&&t.every(([e])=>e===e.toUpperCase()),pt=t=>At(t)&&t.every(([e])=>"ACLMQZ".includes(e)),Gt=t=>pt(t)&&t.every(([e])=>"MC".includes(e)),Ut=(t,e)=>{const{distance:r}=Ae(t,e);return Math.abs(r)pe(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),Mt=t=>{if(typeof t!="string"||!t.length)return!1;const e=new Pe(t);for(X(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Jt=t=>{let{x1:e,y1:r,x2:s,y2:n}=t;return[e,r,s,n]=[e,r,s,n].map(i=>+i),[["M",e,r],["L",s,n]]},Kt=t=>{const e=[],r=(t.points||"").trim().split(/[\s|,]/).map(n=>+n);let s=0;for(;s{let{cx:e,cy:r,r:s}=t;return[e,r,s]=[e,r,s].map(n=>+n),[["M",e-s,r],["a",s,s,0,1,0,2*s,0],["a",s,s,0,1,0,-2*s,0]]},Xt=t=>{let{cx:e,cy:r}=t,s=t.rx||0,n=t.ry||s;return[e,r,s,n]=[e,r,s,n].map(i=>+i),[["M",e-s,r],["a",s,n,0,1,0,2*s,0],["a",s,n,0,1,0,-2*s,0]]},Yt=t=>{const e=+t.x||0,r=+t.y||0,s=+t.width,n=+t.height;let i=+(t.rx||0),o=+(t.ry||i);return i||o?(i*2>s&&(i-=(i*2-s)/2),o*2>n&&(o-=(o*2-n)/2),[["M",e+i,r],["h",s-i*2],["s",i,0,i,o],["v",n-o*2],["s",0,o,-i,o],["h",-s+i*2],["s",-i,0,-i,-o],["v",-n+o*2],["s",0,-o,i,-o]]):[["M",e,r],["h",s],["v",n],["H",e],["Z"]]},Pt=t=>{const e=Object.keys(ce),r=Ct(t),s=r?t.tagName:null;if(s&&[...e,"path"].every(c=>s!==c))throw TypeError(`${R}: "${s}" is not SVGElement`);const n=r?s:t.type,i=ce[n],o={type:n};r?i.forEach(c=>{o[c]=t.getAttribute(c)}):Object.assign(o,t);let a=[];return n==="circle"?a=Wt(o):n==="ellipse"?a=Xt(o):["polyline","polygon"].includes(n)?a=Kt(o):n==="rect"?a=Yt(o):n==="line"?a=Jt(o):["glyph","path"].includes(n)&&(a=Q(r?t.getAttribute("d")||"":t.d||"")),pe(a)&&a.length?a:!1},en=(t,e,r)=>{const s=r||document,n=Object.keys(ce),i=Ct(t),o=i?t.tagName:null;if(o==="path")throw TypeError(`${R}: "${o}" is already SVGPathElement`);if(o&&n.every(u=>o!==u))throw TypeError(`${R}: "${o}" is not SVGElement`);const a=s.createElementNS("http://www.w3.org/2000/svg","path"),c=i?o:t.type,l=ce[c],m={type:c},h=_.round,f=Pt(t),y=f&&f.length?we(f,h):"";return i?(l.forEach(u=>{m[u]=t.getAttribute(u)}),Object.values(t.attributes).forEach(({name:u,value:g})=>{l.includes(u)||a.setAttribute(u,g)})):(Object.assign(m,t),Object.keys(m).forEach(u=>{!l.includes(u)&&u!=="type"&&a.setAttribute(u.replace(/[A-Z]/g,g=>`-${g.toLowerCase()}`),m[u])})),Mt(y)?(a.setAttribute("d",y),e&&i&&(t.before(a,t),t.remove()),a):!1},tn=t=>{const e=t.slice(1).map((r,s,n)=>s?n[s-1].slice(-2).concat(r.slice(1)):t[0].slice(1).concat(r.slice(1))).map(r=>r.map((s,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(r=>["C"].concat(r.slice(2))))},nn=(t,e)=>{let{round:r}=_;return r=e==="off"||typeof e=="number"&&e>=0?e:typeof r=="number"&&r>=0?r:"off",r==="off"?t.slice(0):Z(t,s=>de(s,r))},rn=(t,e=.5)=>{const r=e,s=t.slice(0,2),n=t.slice(2,4),i=t.slice(4,6),o=t.slice(6,8),a=B(s,n,r),c=B(n,i,r),l=B(i,o,r),m=B(a,c,r),h=B(c,l,r),f=B(m,h,r);return[["C",a[0],a[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],l[0],l[1],o[0],o[1]]]};class sn{constructor(e,r){const s=r||{},n=typeof e>"u";if(n||!e.length)throw TypeError(`${R}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=Q(e);const{round:i,origin:o}=s;let a;Number.isInteger(i)||i==="off"?a=i:a=_.round;let c=_.origin;if(Array.isArray(o)&&o.length>=2){const[l,m,h]=o.map(Number);c=[Number.isNaN(l)?0:l,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=a,this.origin=c,this}get bbox(){return nt(this.segments)}get length(){return ee(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return ie(this.segments,e)}toAbsolute(){const{segments:e}=this;return this.segments=ae(e),this}toRelative(){const{segments:e}=this;return this.segments=Be(e),this}toCurve(){const{segments:e}=this;return this.segments=he(e),this}reverse(e){const{segments:r}=this,s=it(r),n=s.length>1?s:!1,i=n?n.map((a,c)=>e?c?be(a):a.slice(0):be(a)):r.slice(0);let o=[];return n?o=i.flat(1):o=e?r:be(r),this.segments=o.slice(0),this}normalize(){const{segments:e}=this;return this.segments=se(e),this}optimize(){const{segments:e}=this,r=this.round==="off"?2:this.round;return this.segments=st(e,r),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(c=>c in e))return this;const{segments:r,origin:[s,n,i]}=this,o={};for(const[c,l]of Object.entries(e))c==="skew"&&Array.isArray(l)||(c==="rotate"||c==="translate"||c==="origin"||c==="scale")&&Array.isArray(l)?o[c]=l.map(Number):c!=="origin"&&typeof Number(l)=="number"&&(o[c]=Number(l));const{origin:a}=o;if(Array.isArray(a)&&a.length>=2){const[c,l,m]=a.map(Number);o.origin=[Number.isNaN(c)?s:c,Number.isNaN(l)?n:l,m||i]}else o.origin=[s,n,i];return this.segments=bt(r,o),this}flipX(){const{cx:e,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,r,0]}),this}flipY(){const{cx:e,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,r,0]}),this}toString(){return we(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}}return x.CSSMatrix=N,x.absolutizeSegment=ne,x.arcToCubic=me,x.default=sn,x.distanceEpsilon=ge,x.error=R,x.finalizeSegment=Me,x.getClosestPoint=Dt,x.getDrawDirection=Bt,x.getPathArea=xt,x.getPathBBox=nt,x.getPointAtLength=ie,x.getPropertiesAtLength=qe,x.getPropertiesAtPoint=Ae,x.getSVGMatrix=dt,x.getSegmentAtLength=Ht,x.getSegmentOfPoint=Ft,x.getTotalLength=ee,x.invalidPathValue=U,x.isAbsoluteArray=At,x.isArcCommand=De,x.isCurveArray=Gt,x.isDigit=G,x.isDigitStart=Ze,x.isMoveCommand=Oe,x.isNormalizedArray=pt,x.isPathArray=pe,x.isPathCommand=Qe,x.isPointInStroke=Ut,x.isRelativeArray=_t,x.isSpace=je,x.isValidPath=Mt,x.iterate=Z,x.lineToCubic=Ne,x.normalizePath=se,x.normalizeSegment=ue,x.optimizePath=st,x.paramsCount=W,x.paramsParser=re,x.parsePathString=Q,x.pathParser=Pe,x.pathToAbsolute=ae,x.pathToCurve=he,x.pathToRelative=Be,x.pathToString=we,x.projection2d=ze,x.quadToCubic=He,x.relativizeSegment=Se,x.reverseCurve=tn,x.reversePath=be,x.roundPath=nn,x.roundSegment=de,x.scanFlag=Ee,x.scanParam=Re,x.scanSegment=Ce,x.segmentToCubic=Fe,x.shapeParams=ce,x.shapeToPath=en,x.shapeToPathArray=Pt,x.shortenSegment=rt,x.skipSpaces=X,x.splitCubic=rn,x.splitPath=it,x.transformPath=bt,Object.defineProperties(x,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),x}({}); +var SVGPathCommander=function(){"use strict";var Ee=Object.defineProperty,Re=(e,t,r)=>t in e?Ee(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,V=(e,t,r)=>Re(e,typeof t!="symbol"?t+"":t,r);const je={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},Ft=e=>(e instanceof Float64Array||e instanceof Float32Array||Array.isArray(e)&&e.every(t=>typeof t=="number"))&&[6,16].some(t=>e.length===t),Gt=e=>e instanceof DOMMatrix||e instanceof S||typeof e=="object"&&Object.keys(je).every(t=>e&&t in e),et=e=>{const t=new S,r=Array.from(e);if(!Ft(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[s,n,i,o,a,c,l,m,h,f,g,u,y,p,b,A]=r;t.m11=s,t.a=s,t.m21=a,t.c=a,t.m31=h,t.m41=y,t.e=y,t.m12=n,t.b=n,t.m22=c,t.d=c,t.m32=f,t.m42=p,t.f=p,t.m13=i,t.m23=l,t.m33=g,t.m43=b,t.m14=o,t.m24=m,t.m34=u,t.m44=A}else if(r.length===6){const[s,n,i,o,a,c]=r;t.m11=s,t.a=s,t.m12=n,t.b=n,t.m21=i,t.c=i,t.m22=o,t.d=o,t.m41=a,t.e=a,t.m42=c,t.f=c}return t},Ut=e=>{if(Gt(e))return et([e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},_t=e=>{if(typeof e!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a string.`);const t=String(e).replace(/\s/g,"");let r=new S;const s=`CSSMatrix: invalid transform string "${e}"`;return t.split(")").filter(n=>n).forEach(n=>{const[i,o]=n.split("(");if(!o)throw TypeError(s);const a=o.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[c,l,m,h]=a,f=[c,l,m],g=[c,l,m,h];if(i==="perspective"&&c&&[l,m].every(u=>u===void 0))r.m34=-1/c;else if(i.includes("matrix")&&[6,16].includes(a.length)&&a.every(u=>!Number.isNaN(+u))){const u=a.map(y=>Math.abs(y)<1e-6?0:y);r=r.multiply(et(u))}else if(i==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(c,l,m);else if(i==="translate"&&c&&m===void 0)r=r.translate(c,l||0,0);else if(i==="rotate3d"&&g.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(c,l,m,h);else if(i==="rotate"&&c&&[l,m].every(u=>u===void 0))r=r.rotate(0,0,c);else if(i==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(c,l,m);else if(i==="scale"&&!Number.isNaN(c)&&(c!==1||l!==1)&&m===void 0){const u=Number.isNaN(+l)?c:l;r=r.scale(c,u,1)}else if(i==="skew"&&(c||!Number.isNaN(c)&&l)&&m===void 0)r=r.skew(c,l||0);else if(["translate","rotate","scale","skew"].some(u=>i.includes(u))&&/[XYZ]/.test(i)&&c&&[l,m].every(u=>u===void 0))if(i==="skewX"||i==="skewY")r=r[i](c);else{const u=i.replace(/[XYZ]/,""),y=i.replace(u,""),p=["X","Y","Z"].indexOf(y),b=u==="scale"?1:0,A=[p===0?c:b,p===1?c:b,p===2?c:b];r=r[u](...A)}else throw TypeError(s)}),r},Nt=(e,t)=>t?[e.a,e.b,e.c,e.d,e.e,e.f]:[e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44],Jt=(e,t,r)=>{const s=new S;return s.m41=e,s.e=e,s.m42=t,s.f=t,s.m43=r,s},Kt=(e,t,r)=>{const s=new S,n=Math.PI/180,i=e*n,o=t*n,a=r*n,c=Math.cos(i),l=-Math.sin(i),m=Math.cos(o),h=-Math.sin(o),f=Math.cos(a),g=-Math.sin(a),u=m*f,y=-m*g;s.m11=u,s.a=u,s.m12=y,s.b=y,s.m13=h;const p=l*h*f+c*g;s.m21=p,s.c=p;const b=c*f-l*h*g;return s.m22=b,s.d=b,s.m23=-l*m,s.m31=l*g-c*h*f,s.m32=l*f+c*h*g,s.m33=c*m,s},Wt=(e,t,r,s)=>{const n=new S,i=Math.sqrt(e*e+t*t+r*r);if(i===0)return n;const o=e/i,a=t/i,c=r/i,l=s*(Math.PI/360),m=Math.sin(l),h=Math.cos(l),f=m*m,g=o*o,u=a*a,y=c*c,p=1-2*(u+y)*f;n.m11=p,n.a=p;const b=2*(o*a*f+c*m*h);n.m12=b,n.b=b,n.m13=2*(o*c*f-a*m*h);const A=2*(a*o*f-c*m*h);n.m21=A,n.c=A;const d=1-2*(y+g)*f;return n.m22=d,n.d=d,n.m23=2*(a*c*f+o*m*h),n.m31=2*(c*o*f+a*m*h),n.m32=2*(c*a*f-o*m*h),n.m33=1-2*(g+u)*f,n},Xt=(e,t,r)=>{const s=new S;return s.m11=e,s.a=e,s.m22=t,s.d=t,s.m33=r,s},mt=(e,t)=>{const r=new S;if(e){const s=e*Math.PI/180,n=Math.tan(s);r.m21=n,r.c=n}if(t){const s=t*Math.PI/180,n=Math.tan(s);r.m12=n,r.b=n}return r},Yt=e=>mt(e,0),te=e=>mt(0,e),B=(e,t)=>{const r=t.m11*e.m11+t.m12*e.m21+t.m13*e.m31+t.m14*e.m41,s=t.m11*e.m12+t.m12*e.m22+t.m13*e.m32+t.m14*e.m42,n=t.m11*e.m13+t.m12*e.m23+t.m13*e.m33+t.m14*e.m43,i=t.m11*e.m14+t.m12*e.m24+t.m13*e.m34+t.m14*e.m44,o=t.m21*e.m11+t.m22*e.m21+t.m23*e.m31+t.m24*e.m41,a=t.m21*e.m12+t.m22*e.m22+t.m23*e.m32+t.m24*e.m42,c=t.m21*e.m13+t.m22*e.m23+t.m23*e.m33+t.m24*e.m43,l=t.m21*e.m14+t.m22*e.m24+t.m23*e.m34+t.m24*e.m44,m=t.m31*e.m11+t.m32*e.m21+t.m33*e.m31+t.m34*e.m41,h=t.m31*e.m12+t.m32*e.m22+t.m33*e.m32+t.m34*e.m42,f=t.m31*e.m13+t.m32*e.m23+t.m33*e.m33+t.m34*e.m43,g=t.m31*e.m14+t.m32*e.m24+t.m33*e.m34+t.m34*e.m44,u=t.m41*e.m11+t.m42*e.m21+t.m43*e.m31+t.m44*e.m41,y=t.m41*e.m12+t.m42*e.m22+t.m43*e.m32+t.m44*e.m42,p=t.m41*e.m13+t.m42*e.m23+t.m43*e.m33+t.m44*e.m43,b=t.m41*e.m14+t.m42*e.m24+t.m43*e.m34+t.m44*e.m44;return et([r,s,n,i,o,a,c,l,m,h,f,g,u,y,p,b])};class S{constructor(t){return 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,t?this.setMatrixValue(t):this}get isIdentity(){return 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}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(t){return typeof t=="string"&&t.length&&t!=="none"?_t(t):Array.isArray(t)||t instanceof Float64Array||t instanceof Float32Array?et(t):typeof t=="object"?Ut(t):this}toFloat32Array(t){return Float32Array.from(Nt(this,t))}toFloat64Array(t){return Float64Array.from(Nt(this,t))}toString(){const{is2D:t}=this,r=this.toFloat64Array(t).join(", ");return`${t?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:t,isIdentity:r}=this;return{...this,is2D:t,isIdentity:r}}multiply(t){return B(this,t)}translate(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=0),typeof o>"u"&&(o=0),B(this,Jt(n,i,o))}scale(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=t),typeof o>"u"&&(o=1),B(this,Xt(n,i,o))}rotate(t,r,s){let n=t,i=r||0,o=s||0;return typeof t=="number"&&typeof r>"u"&&typeof s>"u"&&(o=n,n=0,i=0),B(this,Kt(n,i,o))}rotateAxisAngle(t,r,s,n){if([t,r,s,n].some(i=>Number.isNaN(+i)))throw new TypeError("CSSMatrix: expecting 4 values");return B(this,Wt(t,r,s,n))}skewX(t){return B(this,Yt(t))}skewY(t){return B(this,te(t))}skew(t,r){return B(this,mt(t,r))}transformPoint(t){const r=this.m11*t.x+this.m21*t.y+this.m31*t.z+this.m41*t.w,s=this.m12*t.x+this.m22*t.y+this.m32*t.z+this.m42*t.w,n=this.m13*t.x+this.m23*t.y+this.m33*t.z+this.m43*t.w,i=this.m14*t.x+this.m24*t.y+this.m34*t.z+this.m44*t.w;return t instanceof DOMPoint?new DOMPoint(r,s,n,i):{x:r,y:s,z:n,w:i}}}V(S,"Translate",Jt),V(S,"Rotate",Kt),V(S,"RotateAxisAngle",Wt),V(S,"Scale",Xt),V(S,"SkewX",Yt),V(S,"SkewY",te),V(S,"Skew",mt),V(S,"Multiply",B),V(S,"fromArray",et),V(S,"fromMatrix",Ut),V(S,"fromString",_t),V(S,"toArray",Nt),V(S,"isCompatibleArray",Ft),V(S,"isCompatibleObject",Gt);const O=(e,t,r)=>{const[s,n]=e,[i,o]=t;return[s+(i-s)*r,n+(o-n)*r]},ut=(e,t)=>Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])),nt=(e,t,r,s)=>ut([e,t],[r,s]),wt=(e,t,r,s,n)=>{let i={x:e,y:t};if(typeof n=="number"){const o=ut([e,t],[r,s]);if(n<=0)i={x:e,y:t};else if(n>=o)i={x:r,y:s};else{const[a,c]=O([e,t],[r,s],n/o);i={x:a,y:c}}}return i},Lt=(e,t,r,s)=>{const{min:n,max:i}=Math;return[n(e,r),n(t,s),i(e,r),i(t,s)]},Qe={getLineBBox:Lt,getLineLength:nt,getPointAtLineLength:wt},Tt=(e,t,r)=>{const s=r/2,n=Math.sin(s),i=Math.cos(s),o=e**2*n**2,a=t**2*i**2,c=Math.sqrt(o+a)*r;return Math.abs(c)},U=(e,t,r,s,n,i)=>{const{sin:o,cos:a}=Math,c=a(n),l=o(n),m=r*a(i),h=s*o(i);return[e+c*m-l*h,t+l*m+c*h]},vt=(e,t)=>{const{x:r,y:s}=e,{x:n,y:i}=t,o=r*n+s*i,a=Math.sqrt((r**2+s**2)*(n**2+i**2));return(r*i-s*n<0?-1:1)*Math.acos(o/a)},ht=(e,t,r,s,n,i,o,a,c)=>{const{abs:l,sin:m,cos:h,sqrt:f,PI:g}=Math;let u=l(r),y=l(s);const b=(n%360+360)%360*(g/180);if(e===a&&t===c)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:a,y:c}};if(u===0||y===0)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:(a+e)/2,y:(c+t)/2}};const A=(e-a)/2,d=(t-c)/2,x={x:h(b)*A+m(b)*d,y:-m(b)*A+h(b)*d},M=x.x**2/u**2+x.y**2/y**2;M>1&&(u*=f(M),y*=f(M));const P=u**2*y**2-u**2*x.y**2-y**2*x.x**2,$=u**2*x.y**2+y**2*x.x**2;let q=P/$;q=q<0?0:q;const T=(i!==o?1:-1)*f(q),N={x:T*(u*x.y/y),y:T*(-(y*x.x)/u)},Z={x:h(b)*N.x-m(b)*N.y+(e+a)/2,y:m(b)*N.x+h(b)*N.y+(t+c)/2},J={x:(x.x-N.x)/u,y:(x.y-N.y)/y},z=vt({x:1,y:0},J),C={x:(-x.x-N.x)/u,y:(-x.y-N.y)/y};let k=vt(J,C);!o&&k>0?k-=2*g:o&&k<0&&(k+=2*g),k%=2*g;const D=z+k;return{center:Z,startAngle:z,endAngle:D,rx:u,ry:y}},$t=(e,t,r,s,n,i,o,a,c)=>{const{rx:l,ry:m,startAngle:h,endAngle:f}=ht(e,t,r,s,n,i,o,a,c);return Tt(l,m,f-h)},ee=(e,t,r,s,n,i,o,a,c,l)=>{let m={x:e,y:t};const{center:h,rx:f,ry:g,startAngle:u,endAngle:y}=ht(e,t,r,s,n,i,o,a,c);if(typeof l=="number"){const p=Tt(f,g,y-u);if(l<=0)m={x:e,y:t};else if(l>=p)m={x:a,y:c};else{if(e===a&&t===c)return{x:a,y:c};if(f===0||g===0)return wt(e,t,a,c,l);const{PI:b,cos:A,sin:d}=Math,x=y-u,P=(n%360+360)%360*(b/180),$=u+x*(l/p),q=f*A($),T=g*d($);m={x:A(P)*q-d(P)*T+h.x,y:d(P)*q+A(P)*T+h.y}}}return m},ne=(e,t,r,s,n,i,o,a,c)=>{const{center:l,rx:m,ry:h,startAngle:f,endAngle:g}=ht(e,t,r,s,n,i,o,a,c),u=g-f,{min:y,max:p,tan:b,atan2:A,PI:d}=Math,{x,y:M}=l,P=n*d/180,$=b(P),q=A(-h*$,m),T=q,N=q+d,Z=A(h,m*$),J=Z+d,z=[a],C=[c];let k=y(e,a),D=p(e,a),E=y(t,c),H=p(t,c);const tt=g-u*1e-5,K=U(x,M,m,h,P,tt),w=g-u*.99999,I=U(x,M,m,h,P,w);if(K[0]>D||I[0]>D){const v=U(x,M,m,h,P,T);z.push(v[0]),C.push(v[1])}if(K[0]H||I[1]>H){const v=U(x,M,m,h,P,Z);z.push(v[0]),C.push(v[1])}return k=y.apply([],z),E=y.apply([],C),D=p.apply([],z),H=p.apply([],C),[k,E,D,H]},Ze={angleBetween:vt,arcLength:Tt,arcPoint:U,getArcBBox:ne,getArcLength:$t,getArcProps:ht,getPointAtArcLength:ee},qt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],re=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],se=e=>{const t=[];for(let r=e,s=r.length,n=s-1;s>1;s-=1,n-=1){const i=[];for(let o=0;o{if(t===0)return e[0].t=0,e[0];const r=e.length-1;if(t===1)return e[r].t=1,e[r];const s=1-t;let n=e;if(r===0)return e[0].t=t,e[0];if(r===1)return{x:s*n[0].x+t*n[1].x,y:s*n[0].y+t*n[1].y,t};const i=s*s,o=t*t;let a=0,c=0,l=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],a=i,c=s*t*2,l=o):r===3&&(a=i*s,c=i*t*3,l=s*o*3,m=t*o),{x:a*n[0].x+c*n[1].x+l*n[2].x+m*n[3].x,y:a*n[0].y+c*n[1].y+l*n[2].y+m*n[3].y,t}},oe=(e,t)=>{const r=e(t),s=r.x*r.x+r.y*r.y;return Math.sqrt(s)},ce=e=>{const r=qt.length;let s=0;for(let n=0,i;n{const t=[];for(let s=0,n=e.length,i=2;sie(r[0],s))},ae=1e-8,ft=([e,t,r])=>{const s=Math.min(e,r),n=Math.max(e,r);if(t>=e?r>=t:r<=t)return[s,n];const i=(e*r-t*t)/(e-2*t+r);return i{const n=e-3*t+3*r-s;if(Math.abs(n)0&&m<1){const f=e*(1-m)*(1-m)*(1-m)+t*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+s*m*m*m;fc&&(c=f)}return[a,c]},De={bezierLength:ce,calculateBezier:oe,CBEZIER_MINMAX_EPSILON:ae,computeBezier:ie,Cvalues:re,deriveBezier:se,getBezierLength:rt,minmaxC:zt,minmaxQ:ft,Tvalues:qt},le=([e,t,r,s,n,i,o,a],c)=>{const l=1-c;return{x:l**3*e+3*l**2*c*r+3*l*c**2*n+c**3*o,y:l**3*t+3*l**2*c*s+3*l*c**2*i+c**3*a}},gt=(e,t,r,s,n,i,o,a)=>rt([e,t,r,s,n,i,o,a]),me=(e,t,r,s,n,i,o,a,c)=>{const l=typeof c=="number";let m={x:e,y:t};if(l){const h=rt([e,t,r,s,n,i,o,a]);c<=0||(c>=h?m={x:o,y:a}:m=le([e,t,r,s,n,i,o,a],c/h))}return m},kt=(e,t,r,s,n,i,o,a)=>{const c=zt([e,r,n,o]),l=zt([t,s,i,a]);return[c[0],l[0],c[1],l[1]]},Oe={getCubicBBox:kt,getCubicLength:gt,getPointAtCubicLength:me,getPointAtCubicSegmentLength:le},ue=([e,t,r,s,n,i],o)=>{const a=1-o;return{x:a**2*e+2*a*o*r+o**2*n,y:a**2*t+2*a*o*s+o**2*i}},yt=(e,t,r,s,n,i)=>rt([e,t,r,s,n,i]),he=(e,t,r,s,n,i,o)=>{const a=typeof o=="number";let c={x:e,y:t};if(a){const l=rt([e,t,r,s,n,i]);o<=0||(o>=l?c={x:n,y:i}:c=ue([e,t,r,s,n,i],o/l))}return c},It=(e,t,r,s,n,i)=>{const o=ft([e,r,n]),a=ft([t,s,i]);return[o[0],a[0],o[1],a[1]]},Be={getPointAtQuadLength:he,getPointAtQuadSegmentLength:ue,getQuadBBox:It,getQuadLength:yt},He={polygonArea:e=>{const t=e.length;let r=-1,s,n=e[t-1],i=0;for(;++re.reduce((t,r,s)=>s?t+ut(e[s-1],r):0,0)},st=(e,t,r)=>{const{sin:s,cos:n}=Math,i=e*n(r)-t*s(r),o=e*s(r)+t*n(r);return{x:i,y:o}},L=(e,t)=>{const r=t>=1?10**t:1;return t>0?Math.round(e*r)/r:Math.round(e)},_={origin:[0,0,0],round:4},W={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Vt=e=>{let t=e.pathValue[e.segmentStart],r=t.toLowerCase();const{data:s}=e;for(;s.length>=W[r]&&(r==="m"&&s.length>2?(e.segments.push([t].concat(s.splice(0,2))),r="l",t=t==="m"?"l":"L"):e.segments.push([t].concat(s.splice(0,W[r]))),!!W[r]););},R="SVGPathCommander Error",fe=e=>{const{index:t,pathValue:r}=e,s=r.charCodeAt(t);if(s===48){e.param=0,e.index+=1;return}if(s===49){e.param=1,e.index+=1;return}e.err=`${R}: invalid Arc flag "${r[t]}", expecting 0 or 1 at index ${t}`},F=e=>e>=48&&e<=57,G="Invalid path value",ge=e=>{const{max:t,pathValue:r,index:s}=e;let n=s,i=!1,o=!1,a=!1,c=!1,l;if(n>=t){e.err=`${R}: ${G} at index ${n}, "pathValue" is missing param`;return}if(l=r.charCodeAt(n),(l===43||l===45)&&(n+=1,l=r.charCodeAt(n)),!F(l)&&l!==46){e.err=`${R}: ${G} at index ${n}, "${r[n]}" is not a number`;return}if(l!==46){if(i=l===48,n+=1,l=r.charCodeAt(n),i&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(e),X=e=>{const{pathValue:t,max:r}=e;for(;e.index{switch(e|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},xe=e=>F(e)||e===43||e===45||e===46,pe=e=>(e|32)===97,be=e=>{switch(e|32){case 109:case 77:return!0;default:return!1}},Et=e=>{var c;const{max:t,pathValue:r,index:s,segments:n}=e,i=r.charCodeAt(s),o=W[r[s].toLowerCase()];if(e.segmentStart=s,!de(i)){e.err=`${R}: ${G} "${r[s]}" is not a path command at index ${s}`;return}const a=n[n.length-1];if(!be(i)&&((c=a==null?void 0:a[0])==null?void 0:c.toLocaleLowerCase())==="z"){e.err=`${R}: ${G} "${r[s]}" is not a MoveTo path command at index ${s}`;return}if(e.index+=1,X(e),e.data=[],!o){Vt(e);return}for(;;){for(let l=o;l>0;l-=1){if(pe(i)&&(l===3||l===4)?fe(e):ge(e),e.err.length)return;e.data.push(e.param),X(e),e.index=e.max||!xe(r.charCodeAt(e.index)))break}Vt(e)};class Rt{constructor(t){this.segments=[],this.pathValue=t,this.max=t.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const j=e=>{if(typeof e!="string")return e.slice(0);const t=new Rt(e);for(X(t);t.index{const[n]=e,i=n.toUpperCase();if(t===0||i===n)return e;if(i==="A")return[i,e[1],e[2],e[3],e[4],e[5],e[6]+r,e[7]+s];if(i==="V")return[i,e[1]+s];if(i==="H")return[i,e[1]+r];if(i==="L")return[i,e[1]+r,e[2]+s];{const a=[],c=e.length;for(let l=1;l{let r=e.length,s,n="M",i="M",o=!1,a=0,c=0,l=0,m=0,h=0;for(let f=0;f{const t=j(e);return Q(t,it)},jt=(e,t,r,s)=>{const[n]=e,i=n.toLowerCase();if(t===0||n===i)return e;if(i==="a")return[i,e[1],e[2],e[3],e[4],e[5],e[6]-r,e[7]-s];if(i==="v")return[i,e[1]-s];if(i==="h")return[i,e[1]-r];if(i==="l")return[i,e[1]-r,e[2]-s];{const a=[],c=e.length;for(let l=1;l{const t=j(e);return Q(t,jt)},xt=(e,t,r,s,n,i,o,a,c,l)=>{let m=e,h=t,f=r,g=s,u=a,y=c;const p=Math.PI*120/180,b=Math.PI/180*(+n||0);let A=[],d,x,M,P,$;if(l)[x,M,P,$]=l;else{d=st(m,h,-b),m=d.x,h=d.y,d=st(u,y,-b),u=d.x,y=d.y;const w=(m-u)/2,I=(h-y)/2;let v=w*w/(f*f)+I*I/(g*g);v>1&&(v=Math.sqrt(v),f*=v,g*=v);const Bt=f*f,Ht=g*g,Ve=(i===o?-1:1)*Math.sqrt(Math.abs((Bt*Ht-Bt*I*I-Ht*w*w)/(Bt*I*I+Ht*w*w)));P=Ve*f*I/g+(m+u)/2,$=Ve*-g*w/f+(h+y)/2,x=Math.asin(((h-$)/g*10**9>>0)/10**9),M=Math.asin(((y-$)/g*10**9>>0)/10**9),x=mM&&(x-=Math.PI*2),!o&&M>x&&(M-=Math.PI*2)}let q=M-x;if(Math.abs(q)>p){const w=M,I=u,v=y;M=x+p*(o&&M>x?1:-1),u=P+f*Math.cos(M),y=$+g*Math.sin(M),A=xt(u,y,f,g,n,0,o,I,v,[M,w,P,$])}q=M-x;const T=Math.cos(x),N=Math.sin(x),Z=Math.cos(M),J=Math.sin(M),z=Math.tan(q/4),C=4/3*f*z,k=4/3*g*z,D=[m,h],E=[m+C*N,h-k*T],H=[u+C*J,y-k*Z],tt=[u,y];if(E[0]=2*D[0]-E[0],E[1]=2*D[1]-E[1],l)return[E[0],E[1],H[0],H[1],tt[0],tt[1]].concat(A);A=[E[0],E[1],H[0],H[1],tt[0],tt[1]].concat(A);const K=[];for(let w=0,I=A.length;w{const o=.3333333333333333,a=2/3;return[o*e+a*r,o*t+a*s,o*n+a*r,o*i+a*s,n,i]},Qt=(e,t,r,s)=>{const n=O([e,t],[r,s],.3333333333333333),i=O([e,t],[r,s],2/3);return[n[0],n[1],i[0],i[1],r,s]},Ce=(e,t)=>{const[r]=e,s=e.slice(1).map(Number),[n,i]=s,{x1:o,y1:a,x:c,y:l}=t;return"TQ".includes(r)||(t.qx=null,t.qy=null),r==="M"?(t.x=n,t.y=i,e):r==="A"?["C"].concat(xt(o,a,s[0],s[1],s[2],s[3],s[4],s[5],s[6])):r==="Q"?(t.qx=n,t.qy=i,["C"].concat(Me(o,a,s[0],s[1],s[2],s[3]))):r==="L"?["C"].concat(Qt(o,a,n,i)):r==="Z"?["C"].concat(Qt(o,a,c,l)):e},pt=(e,t)=>{const[r]=e,s=r.toUpperCase(),n=r!==s,{x1:i,y1:o,x2:a,y2:c,x:l,y:m}=t,h=e.slice(1);let f=h.map((g,u)=>g+(n?u%2?m:l:0));if("TQ".includes(s)||(t.qx=null,t.qy=null),s==="A")return f=h.slice(0,-2).concat(h[5]+(n?l:0),h[6]+(n?m:0)),["A"].concat(f);if(s==="H")return["L",e[1]+(n?l:0),o];if(s==="V")return["L",i,e[1]+(n?m:0)];if(s==="L")return["L",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="M")return["M",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="C")return["C"].concat(f);if(s==="S"){const g=i*2-a,u=o*2-c;return t.x1=g,t.y1=u,["C",g,u].concat(f)}else if(s==="T"){const g=i*2-(t.qx?t.qx:0),u=o*2-(t.qy?t.qy:0);return t.qx=g,t.qy=u,["Q",g,u].concat(f)}else if(s==="Q"){const[g,u]=f;return t.qx=g,t.qy=u,["Q"].concat(f)}else if(s==="Z")return["Z"];return e},ot={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},bt=e=>{const t={...ot},r=j(e);return Q(r,(s,n,i,o)=>{t.x=i,t.y=o;const a=pt(s,t);let c=Ce(a,t);c[0]==="C"&&c.length>7&&(r.splice(n+1,0,["C"].concat(c.slice(7))),c=c.slice(0,7));const m=c.length;return t.x1=+c[m-2],t.y1=+c[m-1],t.x2=+c[m-4]||t.x1,t.y2=+c[m-3]||t.y1,c})},Zt=(e,t)=>{const r=e.length;let{round:s}=_,n=e[0],i="";s=t==="off"||typeof t=="number"&&t>=0?t:typeof s=="number"&&s>=0?s:"off";for(let o=0;o{if(!e)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const t=j(e);let r="M",s=0,n=0;const{max:i,min:o}=Math;let a=1/0,c=1/0,l=-1/0,m=-1/0,h=0,f=0,g=0,u=0,y=0,p=0,b=0,A=0,d=0,x=0;Q(t,($,q,T,N)=>{[r]=$;const Z=r.toUpperCase(),z=Z!==r?it($,q,T,N):$.slice(0),C=Z==="V"?["L",T,z[1]]:Z==="H"?["L",z[1],N]:z;if([r]=C,"TQ".includes(Z)||(d=0,x=0),r==="M")[,s,n]=C,h=s,f=n,g=s,u=n;else if(r==="L")[h,f,g,u]=Lt(T,N,C[1],C[2]);else if(r==="A")[h,f,g,u]=ne(T,N,C[1],C[2],C[3],C[4],C[5],C[6],C[7]);else if(r==="S"){const k=y*2-b,D=p*2-A;[h,f,g,u]=kt(T,N,k,D,C[1],C[2],C[3],C[4])}else r==="C"?[h,f,g,u]=kt(T,N,C[1],C[2],C[3],C[4],C[5],C[6]):r==="T"?(d=y*2-d,x=p*2-x,[h,f,g,u]=It(T,N,d,x,C[1],C[2])):r==="Q"?(d=C[1],x=C[2],[h,f,g,u]=It(T,N,C[1],C[2],C[3],C[4])):r==="Z"&&([h,f,g,u]=Lt(T,N,s,n));a=o(h,a),c=o(f,c),l=i(g,l),m=i(u,m),[y,p]=r==="Z"?[s,n]:C.slice(-2),[b,A]=r==="C"?[C[3],C[4]]:r==="S"?[C[1],C[2]]:[y,p]});const M=l-a,P=m-c;return{width:M,height:P,x:a,y:c,x2:l,y2:m,cx:a+M/2,cy:c+P/2,cz:Math.max(M,P)+Math.min(M,P)/2}},Y=e=>{const t=j(e);let r=0,s=0,n=0,i=0,o=0,a=0,c="M",l=0,m=0,h=0;return Q(t,(f,g,u,y)=>{[c]=f;const p=c.toUpperCase(),A=p!==c?it(f,g,u,y):f.slice(0),d=p==="V"?["L",u,A[1]]:p==="H"?["L",A[1],y]:A;if([c]=d,"TQ".includes(p)||(o=0,a=0),c==="M")[,l,m]=d;else if(c==="L")h+=nt(u,y,d[1],d[2]);else if(c==="A")h+=$t(u,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(c==="S"){const x=r*2-n,M=s*2-i;h+=gt(u,y,x,M,d[1],d[2],d[3],d[4])}else c==="C"?h+=gt(u,y,d[1],d[2],d[3],d[4],d[5],d[6]):c==="T"?(o=r*2-o,a=s*2-a,h+=yt(u,y,o,a,d[1],d[2])):c==="Q"?(o=d[1],a=d[2],h+=yt(u,y,d[1],d[2],d[3],d[4])):c==="Z"&&(h+=nt(u,y,l,m));[r,s]=c==="Z"?[l,m]:d.slice(-2),[n,i]=c==="C"?[d[3],d[4]]:c==="S"?[d[1],d[2]]:[r,s]}),h},At=1e-5,ct=e=>{const t=j(e),r={...ot};return Q(t,(s,n,i,o)=>{r.x=i,r.y=o;const a=pt(s,r),c=a.length;return r.x1=+a[c-2],r.y1=+a[c-1],r.x2=+a[c-4]||r.x1,r.y2=+a[c-3]||r.y1,a})},at=(e,t)=>{const r=ct(e);let s=!1,n=[],i="M",o=0,a=0,[c,l]=r[0].slice(1);const m=typeof t=="number";let h={x:c,y:l},f=0,g=h,u=0;return!m||t{if([i]=y,s=i==="M",n=s?n:[b,A].concat(y.slice(1)),s?([,c,l]=y,h={x:c,y:l},f=0):i==="L"?(h=wt(n[0],n[1],n[2],n[3],t-u),f=nt(n[0],n[1],n[2],n[3])):i==="A"?(h=ee(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],t-u),f=$t(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):i==="C"?(h=me(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],t-u),f=gt(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):i==="Q"?(h=he(n[0],n[1],n[2],n[3],n[4],n[5],t-u),f=yt(n[0],n[1],n[2],n[3],n[4],n[5])):i==="Z"&&(n=[b,A,c,l],h={x:c,y:l},f=nt(n[0],n[1],n[2],n[3])),[o,a]=n.slice(-2),uu-At?{x:o,y:a}:g)},Dt=(e,t)=>{const r=j(e);let s=r.slice(0),n=Y(s),i=s.length-1,o=0,a=0,c=r[0];if(i<=0||!t||!Number.isFinite(t))return{segment:c,index:0,length:a,lengthAtSegment:o};if(t>=n)return s=r.slice(0,-1),o=Y(s),a=n-o,c=r[i],{segment:c,index:i,length:a,lengthAtSegment:o};const l=[];for(;i>0;)c=s[i],s=s.slice(0,-1),o=Y(s),a=n-o,n=o,l.push({segment:c,index:i,length:a,lengthAtSegment:o}),i-=1;return l.find(({lengthAtSegment:m})=>m<=t)},Mt=(e,t)=>{const r=j(e),s=ct(r),n=Y(s),i=x=>{const M=x.x-t.x,P=x.y-t.y;return M*M+P*P};let o=8,a,c={x:0,y:0},l=0,m=0,h=1/0;for(let x=0;x<=n;x+=o)a=at(s,x),l=i(a),l1e-6&&(u=m-o,f=at(s,u),p=i(f),y=m+o,g=at(s,y),b=i(g),u>=0&&pMt(e,t).closest,Ge=(e,t,r,s,n,i,o,a)=>3*((a-t)*(r+n)-(o-e)*(s+i)+s*(e-n)-r*(t-i)+a*(n+e/3)-o*(i+t/3))/20,Se=e=>{let t=0,r=0,s=0;return bt(e).map(n=>{switch(n[0]){case"M":return[,t,r]=n,0;default:return s=Ge(t,r,n[1],n[2],n[3],n[4],n[5],n[6]),[t,r]=n.slice(-2),s}}).reduce((n,i)=>n+i,0)},Ue=e=>Se(bt(e))>=0,_e=(e,t)=>Dt(e,t).segment,Je=(e,t)=>Mt(e,t).segment,Ct=e=>Array.isArray(e)&&e.every(t=>{const r=t[0].toLowerCase();return W[r]===t.length-1&&"achlmqstvz".includes(r)&&t.slice(1).every(Number.isFinite)})&&e.length>0,Ne=e=>Ct(e)&&e.every(([t])=>t===t.toUpperCase()),we=e=>Ne(e)&&e.every(([t])=>"ACLMQZ".includes(t)),Ke=e=>we(e)&&e.every(([t])=>"MC".includes(t)),We=(e,t)=>{const{distance:r}=Mt(e,t);return Math.abs(r)Ct(e)&&e.slice(1).every(([t])=>t===t.toLowerCase()),Le=e=>{if(typeof e!="string"||!e.length)return!1;const t=new Rt(e);for(X(t);t.indexe!=null&&typeof e=="object"&&e.nodeType===1,Ye=e=>{let{x1:t,y1:r,x2:s,y2:n}=e;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t,r],["L",s,n]]},tn=e=>{const t=[],r=(e.points||"").trim().split(/[\s|,]/).map(n=>+n);let s=0;for(;s{let{cx:t,cy:r,r:s}=e;return[t,r,s]=[t,r,s].map(n=>+n),[["M",t-s,r],["a",s,s,0,1,0,2*s,0],["a",s,s,0,1,0,-2*s,0]]},nn=e=>{let{cx:t,cy:r}=e,s=e.rx||0,n=e.ry||s;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t-s,r],["a",s,n,0,1,0,2*s,0],["a",s,n,0,1,0,-2*s,0]]},rn=e=>{const t=+e.x||0,r=+e.y||0,s=+e.width,n=+e.height;let i=+(e.rx||0),o=+(e.ry||i);return i||o?(i*2>s&&(i-=(i*2-s)/2),o*2>n&&(o-=(o*2-n)/2),[["M",t+i,r],["h",s-i*2],["s",i,0,i,o],["v",n-o*2],["s",0,o,-i,o],["h",-s+i*2],["s",-i,0,-i,-o],["v",-n+o*2],["s",0,-o,i,-o]]):[["M",t,r],["h",s],["v",n],["H",t],["Z"]]},ve=e=>{const t=Object.keys(lt),r=Te(e),s=r?e.tagName:null;if(s&&[...t,"path"].every(c=>s!==c))throw TypeError(`${R}: "${s}" is not SVGElement`);const n=r?s:e.type,i=lt[n],o={type:n};r?i.forEach(c=>{o[c]=e.getAttribute(c)}):Object.assign(o,e);let a=[];return n==="circle"?a=en(o):n==="ellipse"?a=nn(o):["polyline","polygon"].includes(n)?a=tn(o):n==="rect"?a=rn(o):n==="line"?a=Ye(o):["glyph","path"].includes(n)&&(a=j(r?e.getAttribute("d")||"":e.d||"")),Ct(a)&&a.length?a:!1},sn=(e,t,r)=>{const s=r||document,n=Object.keys(lt),i=Te(e),o=i?e.tagName:null;if(o==="path")throw TypeError(`${R}: "${o}" is already SVGPathElement`);if(o&&n.every(u=>o!==u))throw TypeError(`${R}: "${o}" is not SVGElement`);const a=s.createElementNS("http://www.w3.org/2000/svg","path"),c=i?o:e.type,l=lt[c],m={type:c},h=_.round,f=ve(e),g=f&&f.length?Zt(f,h):"";return i?(l.forEach(u=>{m[u]=e.getAttribute(u)}),Object.values(e.attributes).forEach(({name:u,value:y})=>{l.includes(u)||a.setAttribute(u,y)})):(Object.assign(m,e),Object.keys(m).forEach(u=>{!l.includes(u)&&u!=="type"&&a.setAttribute(u.replace(/[A-Z]/g,y=>`-${y.toLowerCase()}`),m[u])})),Le(g)?(a.setAttribute("d",g),t&&i&&(e.before(a,e),e.remove()),a):!1},$e=(e,t,r,s)=>{const[n]=e,{round:i}=_,o=i,a=t.slice(1),{x1:c,y1:l,x2:m,y2:h,x:f,y:g}=r,[u,y]=a.slice(-2),p=e;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if(L(f,o)===L(u,o))return["V",y];if(L(g,o)===L(y,o))return["H",u]}else if(n==="C"){const[b,A]=a;if(r.x1=b,r.y1=A,"CS".includes(s)&&(L(b,o)===L(c*2-m,o)&&L(A,o)===L(l*2-h,o)||L(c,o)===L(m*2-f,o)&&L(l,o)===L(h*2-g,o)))return["S",a[2],a[3],a[4],a[5]]}else if(n==="Q"){const[b,A]=a;if(r.qx=b,r.qy=A,"QT".includes(s)&&L(b,o)===L(c*2-m,o)&&L(A,o)===L(l*2-h,o))return["T",a[2],a[3]]}return p},Pt=(e,t)=>{const r=e.slice(1).map(s=>L(s,t));return[e[0]].concat(r)},qe=(e,t)=>{const r=dt(e),s=typeof t=="number"&&t>=0?t:2,n={...ot},i=[];let o="M",a="Z";return Q(r,(c,l,m,h)=>{n.x=m,n.y=h;const f=pt(c,n);let g=c;if([o]=c,i[l]=o,l){a=i[l-1];const y=$e(c,f,n,a),p=Pt(y,s),b=p.join(""),A=jt(y,l,m,h),d=Pt(A,s),x=d.join("");g=b.length{const t=dt(e),r=ct(t),s=t.length,n=t[s-1][0]==="Z",i=Q(t,(o,a)=>{const c=r[a],l=a&&t[a-1],m=l&&l[0],h=t[a+1],f=h&&h[0],[g]=o,[u,y]=r[a?a-1:s-1].slice(-2);let p=o;switch(g){case"M":p=n?["Z"]:[g,u,y];break;case"A":p=[g,o[1],o[2],o[3],o[4],o[5]===1?0:1,u,y];break;case"C":h&&f==="S"?p=["S",o[1],o[2],u,y]:p=[g,o[3],o[4],o[1],o[2],u,y];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?p=["C",c[3],c[4],c[1],c[2],u,y]:p=[g,c[1],c[2],u,y];break;case"Q":h&&f==="T"?p=["T",u,y]:p=[g,o[1],o[2],u,y];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?p=["Q",c[1],c[2],u,y]:p=[g,u,y];break;case"Z":p=["M",u,y];break;case"H":p=[g,u];break;case"V":p=[g,y];break;default:p=[g].concat(o.slice(1,-2),u,y)}return p});return n?i.reverse():[i[0]].concat(i.slice(1).reverse())},ze=e=>{const t=[];let r,s=-1,n=0,i=0,o=0,a=0;const c={...ot};return e.forEach(l=>{const[m]=l,h=m.toUpperCase(),f=m.toLowerCase(),g=m===f,u=l.slice(1);h==="M"?(s+=1,[n,i]=u,n+=g?c.x:0,i+=g?c.y:0,o=n,a=i,r=[g?[h,o,a]:l]):(h==="Z"?(n=o,i=a):h==="H"?([,n]=l,n+=g?c.x:0):h==="V"?([,i]=l,i+=g?c.y:0):([n,i]=l.slice(-2),n+=g?c.x:0,i+=g?c.y:0),r.push(l)),c.x=n,c.y=i,t[s]=r}),t},ke=e=>{let t=new S;const{origin:r}=e,[s,n]=r,{translate:i}=e,{rotate:o}=e,{skew:a}=e,{scale:c}=e;return Array.isArray(i)&&i.length>=2&&i.every(l=>!Number.isNaN(+l))&&i.some(l=>l!==0)?t=t.translate(...i):typeof i=="number"&&!Number.isNaN(i)&&(t=t.translate(i)),(o||a||c)&&(t=t.translate(s,n),Array.isArray(o)&&o.length>=2&&o.every(l=>!Number.isNaN(+l))&&o.some(l=>l!==0)?t=t.rotate(...o):typeof o=="number"&&!Number.isNaN(o)&&(t=t.rotate(o)),Array.isArray(a)&&a.length===2&&a.every(l=>!Number.isNaN(+l))&&a.some(l=>l!==0)?(t=a[0]?t.skewX(a[0]):t,t=a[1]?t.skewY(a[1]):t):typeof a=="number"&&!Number.isNaN(a)&&(t=t.skewX(a)),Array.isArray(c)&&c.length>=2&&c.every(l=>!Number.isNaN(+l))&&c.some(l=>l!==1)?t=t.scale(...c):typeof c=="number"&&!Number.isNaN(c)&&(t=t.scale(c)),t=t.translate(-s,-n)),t},on=(e,t)=>{let r=S.Translate(t[0],t[1],t[2]);return[,,,r.m44]=t,r=e.multiply(r),[r.m41,r.m42,r.m43,r.m44]},Ot=(e,t,r)=>{const[s,n,i]=r,[o,a,c]=on(e,[t[0],t[1],0,1]),l=o-s,m=a-n,h=c-i;return[l*(Math.abs(i)/Math.abs(h)||1)+s,m*(Math.abs(i)/Math.abs(h)||1)+n]},Ie=(e,t)=>{let r=0,s=0,n=0,i=0,o=0,a=0,c="M";const l=j(e),m=t&&Object.keys(t);if(!t||m&&!m.length)return l.slice(0);t.origin||Object.assign(t,{origin:_.origin});const h=t.origin,f=ke(t);return f.isIdentity?l.slice(0):Q(l,(g,u,y,p)=>{[c]=g;const b=c.toUpperCase(),d=b!==c?it(g,u,y,p):g.slice(0);let x=b==="A"?["C"].concat(xt(y,p,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):b==="V"?["L",y,d[1]]:b==="H"?["L",d[1],p]:d;c=x[0];const M=c==="C"&&x.length>7,P=M?x.slice(0,7):x.slice(0);if(M&&(l.splice(u+1,0,["C"].concat(x.slice(7))),x=P),c==="L")[n,i]=Ot(f,[x[1],x[2]],h),r!==n&&s!==i?x=["L",n,i]:s===i?x=["H",n]:r===n&&(x=["V",i]);else for(o=1,a=x.length;o{const t=e.slice(1).map((r,s,n)=>s?n[s-1].slice(-2).concat(r.slice(1)):e[0].slice(1).concat(r.slice(1))).map(r=>r.map((s,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(t[0].slice(0,2))].concat(t.map(r=>["C"].concat(r.slice(2))))},an=(e,t)=>{let{round:r}=_;return r=t==="off"||typeof t=="number"&&t>=0?t:typeof r=="number"&&r>=0?r:"off",r==="off"?e.slice(0):Q(e,s=>Pt(s,r))},ln=(e,t=.5)=>{const r=t,s=e.slice(0,2),n=e.slice(2,4),i=e.slice(4,6),o=e.slice(6,8),a=O(s,n,r),c=O(n,i,r),l=O(i,o,r),m=O(a,c,r),h=O(c,l,r),f=O(m,h,r);return[["C",a[0],a[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],l[0],l[1],o[0],o[1]]]};class mn{constructor(t,r){const s=r||{},n=typeof t>"u";if(n||!t.length)throw TypeError(`${R}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=j(t);const{round:i,origin:o}=s;let a;Number.isInteger(i)||i==="off"?a=i:a=_.round;let c=_.origin;if(Array.isArray(o)&&o.length>=2){const[l,m,h]=o.map(Number);c=[Number.isNaN(l)?0:l,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=a,this.origin=c,this}get bbox(){return Pe(this.segments)}get length(){return Y(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(t){return at(this.segments,t)}toAbsolute(){const{segments:t}=this;return this.segments=dt(t),this}toRelative(){const{segments:t}=this;return this.segments=Ae(t),this}toCurve(){const{segments:t}=this;return this.segments=bt(t),this}reverse(t){const{segments:r}=this,s=ze(r),n=s.length>1?s:!1,i=n?n.map((a,c)=>t?c?St(a):a.slice(0):St(a)):r.slice(0);let o=[];return n?o=i.flat(1):o=t?r:St(r),this.segments=o.slice(0),this}normalize(){const{segments:t}=this;return this.segments=ct(t),this}optimize(){const{segments:t}=this,r=this.round==="off"?2:this.round;return this.segments=qe(t,r),this}transform(t){if(!t||typeof t!="object"||typeof t=="object"&&!["translate","rotate","skew","scale"].some(c=>c in t))return this;const{segments:r,origin:[s,n,i]}=this,o={};for(const[c,l]of Object.entries(t))c==="skew"&&Array.isArray(l)||(c==="rotate"||c==="translate"||c==="origin"||c==="scale")&&Array.isArray(l)?o[c]=l.map(Number):c!=="origin"&&typeof Number(l)=="number"&&(o[c]=Number(l));const{origin:a}=o;if(Array.isArray(a)&&a.length>=2){const[c,l,m]=a.map(Number);o.origin=[Number.isNaN(c)?s:c,Number.isNaN(l)?n:l,m||i]}else o.origin=[s,n,i];return this.segments=Ie(r,o),this}flipX(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[t,r,0]}),this}flipY(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[t,r,0]}),this}toString(){return Zt(this.segments,this.round)}dispose(){Object.keys(this).forEach(t=>delete this[t])}static get CSSMatrix(){return S}static get arcTools(){return Ze}static get bezierTools(){return De}static get cubicTools(){return Oe}static get lineTools(){return Qe}static get polygonTools(){return He}static get quadTools(){return Be}static get pathToAbsolute(){return dt}static get pathToRelative(){return Ae}static get pathToCurve(){return bt}static get pathToString(){return Zt}static get distanceSquareRoot(){return ut}static get midPoint(){return O}static get rotateVector(){return st}static get roundTo(){return L}static get parsePathString(){return j}static get finalizeSegment(){return Vt}static get invalidPathValue(){return G}static get isArcCommand(){return pe}static get isDigit(){return F}static get isDigitStart(){return xe}static get isMoveCommand(){return be}static get isPathCommand(){return de}static get isSpace(){return ye}static get paramsCount(){return W}static get paramsParser(){return ot}static get pathParser(){return Rt}static get scanFlag(){return fe}static get scanParam(){return ge}static get scanSegment(){return Et}static get skipSpaces(){return X}static get distanceEpsilon(){return At}static get getClosestPoint(){return Fe}static get getDrawDirection(){return Ue}static get getPathArea(){return Se}static get getPathBBox(){return Pe}static get getPointAtLength(){return at}static get getPropertiesAtLength(){return Dt}static get getPropertiesAtPoint(){return Mt}static get getSegmentAtLength(){return _e}static get getSegmentOfPoint(){return Je}static get getTotalLength(){return Y}static get isAbsoluteArray(){return Ne}static get isCurveArray(){return Ke}static get isNormalizedArray(){return we}static get isPathArray(){return Ct}static get isPointInStroke(){return We}static get isRelativeArray(){return Xe}static get isValidPath(){return Le}static get shapeParams(){return lt}static get shapeToPath(){return sn}static get shapeToPathArray(){return ve}static get absolutizeSegment(){return it}static get arcToCubic(){return xt}static get getSVGMatrix(){return ke}static get iterate(){return Q}static get lineToCubic(){return Qt}static get normalizePath(){return ct}static get normalizeSegment(){return pt}static get optimizePath(){return qe}static get projection2d(){return Ot}static get quadToCubic(){return Me}static get relativizeSegment(){return jt}static get reverseCurve(){return cn}static get reversePath(){return St}static get roundPath(){return an}static get roundSegment(){return Pt}static get segmentToCubic(){return Ce}static get shortenSegment(){return $e}static get splitCubic(){return ln}static get splitPath(){return ze}static get transformPath(){return Ie}}return mn}(); //# sourceMappingURL=svg-path-commander.js.map diff --git a/dist/svg-path-commander.js.map b/dist/svg-path-commander.js.map index 38746a5..836b407 100644 --- a/dist/svg-path-commander.js.map +++ b/dist/svg-path-commander.js.map @@ -1 +1 @@ -{"version":3,"file":"svg-path-commander.js","sources":["../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/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/math/rotateVector.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/math/midPoint.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/math/roundTo.ts","../src/convert/pathToString.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/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.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/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\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\nexport default paramsCount;\n","import paramsCount 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 */\nconst 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 >= paramsCount[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, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./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 */\nconst 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\nexport default scanFlag;\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 */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./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 */\nconst 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};\nexport default scanParam;\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\nconst 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};\nexport default isSpace;\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 */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\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 */\nconst 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};\nexport default isPathCommand;\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 */\nconst 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};\nexport default isDigitStart;\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 */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst 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};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts 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 \"./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 */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[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) && 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 && 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};\nexport default scanSegment;\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\n */\nexport default 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 * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\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\nexport default parsePathString;\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 */\nconst 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};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n 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 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 if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\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 | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\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 */\nconst 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\nexport default relativizeSegment;\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 | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\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 */\nconst 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\nexport default rotateVector;\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 * @return the resulting cubic-bezier segment(s)\n */\nconst 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};\nexport default arcToCubic;\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 */\nconst 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};\nexport default quadToCubic;\n","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 */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\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 */\nconst 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};\nexport default lineToCubic;\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 */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\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\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\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, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\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 */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\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};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\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\nexport default paramsParser;\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 value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\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 });\n};\nexport default pathToCurve;\n","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\nexport default roundTo;\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\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\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 : /* istanbul ignore next @preserve */ \"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\nexport default pathToString;\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 */\nconst 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\nexport default distanceSquareRoot;\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 * @param distance the distance to point in [0-1] range\n * @returns the extrema 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 a [0-1] ratio\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 { 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 boundig 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) => {\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]] as [\n number,\n number,\n number,\n number,\n ];\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 boundig 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 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\nconst getPathBBox = (pathInput: PathArray | 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\nexport default getPathBBox;\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 shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\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\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\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 });\n};\nexport default normalizePath;\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 of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\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 // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\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\nexport default getPointAtLength;\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 */\nconst 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\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\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\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } 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` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\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 : /* istanbul ignore next @preserve */ 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 = seg;\n [pathCommand] = seg;\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\nexport default optimizePath;\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` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\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;\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]) as PathSegment;\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 ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"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] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"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] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\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 PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\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 ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return 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, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return 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 }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\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 `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst 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};\nexport default getSVGMatrix;\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 * @return 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 */\nconst 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};\nexport default projection2d;\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` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\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 let pathCommand = \"M\";\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 typeof path;\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 typeof path;\n\n return 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 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)) 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(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\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 });\n};\n\nexport default transformPath;\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 */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\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 PathArray;\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 PathArray;\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(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\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 */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\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\nexport default getPropertiesAtPoint;\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 */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\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 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 length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\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};\nexport default getPathArea;\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 */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\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 */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\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 */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount 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 */\nconst 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 paramsCount[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};\nexport default isPathArray;\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 */\nconst 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};\nexport default isAbsoluteArray;\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 are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst 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};\nexport default isNormalizedArray;\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 */\nconst 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};\nexport default isCurveArray;\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 */\nconst isPointInStroke = (\n pathInput: string | PathArray,\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};\nexport default isPointInStroke;\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 */\nconst 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};\nexport default isRelativeArray;\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 */\nconst 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};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst 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\nexport default shapeParams;\n","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\nexport default isElement;\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 \"../parser/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\n * @returns a new line `pathArray`\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` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\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 (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\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\n * @return an ellipse `pathArray`\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` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\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 ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\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) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\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};\nexport default shapeToPathArray;\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 \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. 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 `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst 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;\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 Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\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\nexport default shapeToPath;\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 */\nconst 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\nexport default reverseCurve;\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 */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\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 : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\n// import CSSMatrix from \"@thednp/dommatrix\";\n// import { arcTools } from \"./math/arcTools\";\n// import { bezierTools } from \"./math/bezier\";\n// import { cubicTools } from \"./math/cubicTools\";\n// import { lineTools } from \"./math/lineTools\";\n// import { quadTools } from \"./math/quadTools\";\n// import { polygonTools } from \"./math/polygonTools\";\n\n// import distanceSquareRoot from \"./math/distanceSquareRoot\";\n// import midPoint from \"./math/midPoint\";\n// import rotateVector from \"./math/rotateVector\";\n// import roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\n\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\n// import finalizeSegment from \"./parser/finalizeSegment\";\n// import invalidPathValue from \"./parser/invalidPathValue\";\n// import isArcCommand from \"./parser/isArcCommand\";\n// import isDigit from \"./parser/isDigit\";\n// import isDigitStart from \"./parser/isDigitStart\";\n// import isMoveCommand from \"./parser/isMoveCommand\";\n// import isPathCommand from \"./parser/isPathCommand\";\n// import isSpace from \"./parser/isSpace\";\n// import paramsCount from \"./parser/paramsCount\";\n// import paramsParser from \"./parser/paramsParser\";\n// import pathParser from \"./parser/pathParser\";\n// import scanFlag from \"./parser/scanFlag\";\n// import scanParam from \"./parser/scanParam\";\n// import scanSegment from \"./parser/scanSegment\";\n// import skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\n// import distanceEpsilon from \"./util/distanceEpsilon\";\n// import getClosestPoint from \"./util/getClosestPoint\";\n// import getDrawDirection from \"./util/getDrawDirection\";\n// import getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\n// import getPropertiesAtLength from \"./util/getPropertiesAtLength\";\n// import getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\n// import getSegmentAtLength from \"./util/getSegmentAtLength\";\n// import getSegmentOfPoint from \"./util/getSegmentOfPoint\";\n// import isAbsoluteArray from \"./util/isAbsoluteArray\";\n// import isCurveArray from \"./util/isCurveArray\";\n// import isNormalizedArray from \"./util/isNormalizedArray\";\n// import isPathArray from \"./util/isPathArray\";\n// import isPointInStroke from \"./util/isPointInStroke\";\n// import isRelativeArray from \"./util/isRelativeArray\";\n// import isValidPath from \"./util/isValidPath\";\n// import shapeParams from \"./util/shapeParams\";\n// import shapeToPath from \"./util/shapeToPath\";\n// import shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\n// import absolutizeSegment from \"./process/absolutizeSegment\";\n// import arcToCubic from \"./process/arcToCubic\";\n// import getSVGMatrix from \"./process/getSVGMatrix\";\n// import iterate from \"./process/iterate\";\n// import lineToCubic from \"./process/lineToCubic\";\n// import normalizeSegment from \"./process/normalizeSegment\";\n// import projection2d from \"./process/projection2d\";\n// import quadToCubic from \"./process/quadToCubic\";\n// import relativizeSegment from \"./process/relativizeSegment\";\n// import reverseCurve from \"./process/reverseCurve\";\n// import roundPath from \"./process/roundPath\";\n// import roundSegment from \"./process/roundSegment\";\n// import segmentToCubic from \"./process/segmentToCubic\";\n// import shortenSegment from \"./process/shortenSegment\";\n// import splitCubic from \"./process/splitCubic\";\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 \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) {\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 * @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 * @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 * @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 * @param onlySubpath option to reverse all sub-paths except first\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 * @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 * @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 refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\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 * @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 * @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 * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n // static get CSSMatrix() {\n // return CSSMatrix;\n // }\n // static get arcTools() {\n // return arcTools;\n // }\n // static get bezierTools() {\n // return bezierTools;\n // }\n\n // static get cubicTools() {\n // return cubicTools;\n // }\n // static get lineTools() {\n // return lineTools;\n // }\n // static get polygonTools() {\n // return polygonTools;\n // }\n // static get quadTools() {\n // return quadTools;\n // }\n // static get pathToAbsolute() {\n // return pathToAbsolute;\n // }\n // static get pathToRelative() {\n // return pathToRelative;\n // }\n // static get pathToCurve() {\n // return pathToCurve;\n // }\n // static get pathToString() {\n // return pathToString;\n // }\n // static get distanceSquareRoot() {\n // return distanceSquareRoot;\n // }\n // static get midPoint() {\n // return midPoint;\n // }\n // static get rotateVector() {\n // return rotateVector;\n // }\n // static get roundTo() {\n // return roundTo;\n // }\n // static get parsePathString() {\n // return parsePathString;\n // }\n // static get finalizeSegment() {\n // return finalizeSegment;\n // }\n // static get invalidPathValue() {\n // return invalidPathValue;\n // }\n // static get isArcCommand() {\n // return isArcCommand;\n // }\n // static get isDigit() {\n // return isDigit;\n // }\n // static get isDigitStart() {\n // return isDigitStart;\n // }\n // static get isMoveCommand() {\n // return isMoveCommand;\n // }\n // static get isPathCommand() {\n // return isPathCommand;\n // }\n // static get isSpace() {\n // return isSpace;\n // }\n // static get paramsCount() {\n // return paramsCount;\n // }\n // static get paramsParser() {\n // return paramsParser;\n // }\n // static get pathParser() {\n // return pathParser;\n // }\n // static get scanFlag() {\n // return scanFlag;\n // }\n // static get scanParam() {\n // return scanParam;\n // }\n // static get scanSegment() {\n // return scanSegment;\n // }\n // static get skipSpaces() {\n // return skipSpaces;\n // }\n // static get distanceEpsilon() {\n // return distanceEpsilon;\n // }\n // static get getClosestPoint() {\n // return getClosestPoint;\n // }\n // static get getDrawDirection() {\n // return getDrawDirection;\n // }\n // static get getPathArea() {\n // return getPathArea;\n // }\n // static get getPathBBox() {\n // return getPathBBox;\n // }\n // static get getPointAtLength() {\n // return getPointAtLength;\n // }\n // static get getPropertiesAtLength() {\n // return getPropertiesAtLength;\n // }\n // static get getPropertiesAtPoint() {\n // return getPropertiesAtPoint;\n // }\n // static get getSegmentAtLength() {\n // return getSegmentAtLength;\n // }\n // static get getSegmentOfPoint() {\n // return getSegmentOfPoint;\n // }\n // static get getTotalLength() {\n // return getTotalLength;\n // }\n // static get isAbsoluteArray() {\n // return isAbsoluteArray;\n // }\n // static get isCurveArray() {\n // return isCurveArray;\n // }\n // static get isNormalizedArray() {\n // return isNormalizedArray;\n // }\n // static get isPathArray() {\n // return isPathArray;\n // }\n // static get isPointInStroke() {\n // return isPointInStroke;\n // }\n // static get isRelativeArray() {\n // return isRelativeArray;\n // }\n // static get isValidPath() {\n // return isValidPath;\n // }\n // static get shapeParams() {\n // return shapeParams;\n // }\n // static get shapeToPath() {\n // return shapeToPath;\n // }\n // static get shapeToPathArray() {\n // return shapeToPathArray;\n // }\n // static get absolutizeSegment() {\n // return absolutizeSegment;\n // }\n // static get arcToCubic() {\n // return arcToCubic;\n // }\n // static get getSVGMatrix() {\n // return getSVGMatrix;\n // }\n // static get iterate() {\n // return iterate;\n // }\n // static get lineToCubic() {\n // return lineToCubic;\n // }\n // static get normalizePath() {\n // return normalizePath;\n // }\n // static get normalizeSegment() {\n // return normalizeSegment;\n // }\n // static get optimizePath() {\n // return optimizePath;\n // }\n // static get projection2d() {\n // return projection2d;\n // }\n // static get quadToCubic() {\n // return quadToCubic;\n // }\n // static get relativizeSegment() {\n // return relativizeSegment;\n // }\n // static get reverseCurve() {\n // return reverseCurve;\n // }\n // static get reversePath() {\n // return reversePath;\n // }\n // static get roundPath() {\n // return roundPath;\n // }\n // static get roundSegment() {\n // return roundSegment;\n // }\n // static get segmentToCubic() {\n // return segmentToCubic;\n // }\n // static get shortenSegment() {\n // return shortenSegment;\n // }\n // static get splitCubic() {\n // return splitCubic;\n // }\n // static get splitPath() {\n // return splitPath;\n // }\n // static get transformPath() {\n // return transformPath;\n // }\n}\n\n// export {\n// absolutizeSegment,\n// arcToCubic,\n// arcTools,\n// bezierTools,\n// CSSMatrix,\n// cubicTools,\n// distanceEpsilon,\n// distanceSquareRoot,\n// finalizeSegment,\n// getClosestPoint,\n// getDrawDirection,\n// getPathArea,\n// getPathBBox,\n// getPointAtLength,\n// getPropertiesAtLength,\n// getPropertiesAtPoint,\n// getSegmentAtLength,\n// getSegmentOfPoint,\n// getSVGMatrix,\n// getTotalLength,\n// invalidPathValue,\n// isAbsoluteArray,\n// isArcCommand,\n// isCurveArray,\n// isDigit,\n// isDigitStart,\n// isMoveCommand,\n// isNormalizedArray,\n// isPathArray,\n// isPathCommand,\n// isPointInStroke,\n// isRelativeArray,\n// isSpace,\n// isValidPath,\n// iterate,\n// lineToCubic,\n// lineTools,\n// midPoint,\n// normalizePath,\n// normalizeSegment,\n// optimizePath,\n// paramsCount,\n// paramsParser,\n// parsePathString,\n// pathParser,\n// pathToAbsolute,\n// pathToCurve,\n// pathToRelative,\n// pathToString,\n// polygonTools,\n// projection2d,\n// quadToCubic,\n// quadTools,\n// relativizeSegment,\n// reverseCurve,\n// reversePath,\n// rotateVector,\n// roundPath,\n// roundSegment,\n// roundTo,\n// scanFlag,\n// scanParam,\n// scanSegment,\n// segmentToCubic,\n// shapeParams,\n// shapeToPath,\n// shapeToPathArray,\n// shortenSegment,\n// skipSpaces,\n// splitCubic,\n// splitPath,\n// transformPath,\n// };\n\nexport { default as CSSMatrix} from \"@thednp/dommatrix\";\nexport { default as pathToAbsolute} from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative} from \"./convert/pathToRelative\";\nexport { default as pathToCurve} from \"./convert/pathToCurve\";\nexport { default as pathToString} from \"./convert/pathToString\";\n\nexport { default as error} from \"./parser/error\";\nexport { default as parsePathString} from \"./parser/parsePathString\";\nexport { default as finalizeSegment} from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue} from \"./parser/invalidPathValue\";\nexport { default as isArcCommand} from \"./parser/isArcCommand\";\nexport { default as isDigit} from \"./parser/isDigit\";\nexport { default as isDigitStart} from \"./parser/isDigitStart\";\nexport { default as isMoveCommand} from \"./parser/isMoveCommand\";\nexport { default as isPathCommand} from \"./parser/isPathCommand\";\nexport { default as isSpace} from \"./parser/isSpace\";\nexport { default as paramsCount} from \"./parser/paramsCount\";\nexport { default as paramsParser} from \"./parser/paramsParser\";\nexport { default as pathParser} from \"./parser/pathParser\";\nexport { default as scanFlag} from \"./parser/scanFlag\";\nexport { default as scanParam} from \"./parser/scanParam\";\nexport { default as scanSegment} from \"./parser/scanSegment\";\nexport { default as skipSpaces} from \"./parser/skipSpaces\";\nexport { default as getPathBBox} from \"./util/getPathBBox\";\nexport { default as getTotalLength} from \"./util/getTotalLength\";\nexport { default as distanceEpsilon} from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint} from \"./util/getClosestPoint\";\nexport { default as getDrawDirection} from \"./util/getDrawDirection\";\nexport { default as getPathArea} from \"./util/getPathArea\";\nexport { default as getPointAtLength} from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength} from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint} from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength} from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint} from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray} from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray} from \"./util/isCurveArray\";\nexport { default as isNormalizedArray} from \"./util/isNormalizedArray\";\nexport { default as isPathArray} from \"./util/isPathArray\";\nexport { default as isPointInStroke} from \"./util/isPointInStroke\";\nexport { default as isRelativeArray} from \"./util/isRelativeArray\";\nexport { default as isValidPath} from \"./util/isValidPath\";\nexport { default as shapeParams} from \"./util/shapeParams\";\nexport { default as shapeToPath} from \"./util/shapeToPath\";\nexport { default as shapeToPathArray} from \"./util/shapeToPathArray\";\nexport { default as normalizePath} from \"./process/normalizePath\";\nexport { default as optimizePath} from \"./process/optimizePath\";\nexport { default as reversePath} from \"./process/reversePath\";\nexport { default as splitPath} from \"./process/splitPath\";\nexport { default as transformPath} from \"./process/transformPath\";\nexport { default as absolutizeSegment} from \"./process/absolutizeSegment\";\nexport { default as arcToCubic} from \"./process/arcToCubic\";\nexport { default as getSVGMatrix} from \"./process/getSVGMatrix\";\nexport { default as iterate} from \"./process/iterate\";\nexport { default as lineToCubic} from \"./process/lineToCubic\";\nexport { default as normalizeSegment} from \"./process/normalizeSegment\";\nexport { default as projection2d} from \"./process/projection2d\";\nexport { default as quadToCubic} from \"./process/quadToCubic\";\nexport { default as relativizeSegment} from \"./process/relativizeSegment\";\nexport { default as reverseCurve} from \"./process/reverseCurve\";\nexport { default as roundPath} from \"./process/roundPath\";\nexport {default as roundSegment} from \"./process/roundSegment\";\nexport { default as segmentToCubic} from \"./process/segmentToCubic\";\nexport {default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic} from \"./process/splitCubic\";\n\nexport default SVGPathCommander;\n \n"],"names":["defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","max","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","i","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","j","iterate","iterator","pathLen","isRelative","x","y","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","rotateVector","rad","sin","cos","X","Y","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","res","xy","f1","f2","cx","cy","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","midPoint","a","b","ax","ay","bx","by","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","n","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","roundTo","round","pow","pathToString","roundOption","valLen","distanceSquareRoot","getLineLength","getPointAtLineLength","distance","point","length","getLineBBox","min","arcLength","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","alpha","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","getArcProps","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","Tvalues","Cvalues","deriveBezier","points","dpoints","d","c","list","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","l","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","Z","z","s","e","$","P","g","r","m","u","w","o","M","O","F","I","v","D","N","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key"],"mappings":"8CAGA,MAAMA,EAA0B,CAC9B,OAAQ,CAAC,EAAG,EAAG,CAAC,EAChB,MAAO,CACT,ECLMC,EAAc,CAClB,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,CACL,ECJMC,GAAmBC,GAAqB,CAC5C,IAAIC,EAAcD,EAAK,UAAUA,EAAK,YAAY,EAC9CE,EAAkBD,EAAY,YAAY,EACxC,KAAA,CAAE,KAAAE,GAASH,EAEjB,KAAOG,EAAK,QAAUL,EAAYI,CAAe,IAG3CA,IAAoB,KAAOC,EAAK,OAAS,GAC3CH,EAAK,SAAS,KACZ,CAACC,CAAmC,EAAE,OACpCE,EAAK,OAAO,EAAG,CAAC,CAAA,CAEpB,EACkBD,EAAA,IACJD,EAAAA,IAAgB,IAAM,IAAM,KAE1CD,EAAK,SAAS,KACZ,CAACC,CAAmC,EAAE,OACpCE,EAAK,OAAO,EAAGL,EAAYI,CAAe,CAAC,CAAA,CAE/C,EAGE,EAACJ,EAAYI,CAAe,IAA5B,CAIR,ECrCME,EAAQ,yBCSRC,GAAYL,GAAqB,CAC/B,KAAA,CAAE,MAAAM,EAAO,UAAAC,CAAA,EAAcP,EACvBQ,EAAOD,EAAU,WAAWD,CAAK,EAEvC,GAAIE,IAAS,GAAc,CACzBR,EAAK,MAAQ,EACbA,EAAK,OAAS,EACd,MAAA,CAGF,GAAIQ,IAAS,GAAc,CACzBR,EAAK,MAAQ,EACbA,EAAK,OAAS,EACd,MAAA,CAGGA,EAAA,IAAM,GAAGI,CAAK,uBACjBG,EAAUD,CAAK,CACjB,gCAAgCA,CAAK,EACvC,ECpBMG,EAAWD,GACRA,GAAQ,IAAMA,GAAQ,GCTzBE,EAAmB,qBCWnBC,GAAaX,GAAqB,CACtC,KAAM,CAAE,IAAAY,EAAK,UAAAL,EAAW,MAAOM,CAAU,EAAAb,EACzC,IAAIM,EAAQO,EACRC,EAAY,GACZC,EAAa,GACbC,EAAa,GACbC,EAAS,GACTC,EAEJ,GAAIZ,GAASM,EAAK,CAChBZ,EAAK,IACH,GAAGI,CAAK,KAAKM,CAAgB,aAAaJ,CAAK,iCACjD,MAAA,CAYF,GAVKY,EAAAX,EAAU,WAAWD,CAAK,GAE3BY,IAAO,IAAgBA,IAAO,MACvBZ,GAAA,EAEJY,EAAAX,EAAU,WAAWD,CAAK,GAK7B,CAACG,EAAQS,CAAE,GAAKA,IAAO,GAAc,CAElClB,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,aAAaJ,CAAK,MACxDC,EAAUD,CAAK,CACjB,oBACA,MAAA,CAGF,GAAIY,IAAO,GAAc,CAMnB,GALJJ,EAAYI,IAAO,GACVZ,GAAA,EAEJY,EAAAX,EAAU,WAAWD,CAAK,EAE3BQ,GAAaR,EAAQM,GAEnBM,GAAMT,EAAQS,CAAE,EAAG,CAGhBlB,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,aAAaG,CAAK,MACxDN,EAAUM,CAAK,CACjB,mBACA,MAAA,CAIJ,KAAOP,EAAQM,GAAOH,EAAQF,EAAU,WAAWD,CAAK,CAAC,GAC9CA,GAAA,EACIS,EAAA,GAGVG,EAAAX,EAAU,WAAWD,CAAK,CAAA,CAGjC,GAAIY,IAAO,GAAc,CAGvB,IAFSD,EAAA,GACAX,GAAA,EACFG,EAAQF,EAAU,WAAWD,CAAK,CAAC,GAC/BA,GAAA,EACIU,EAAA,GAGVE,EAAAX,EAAU,WAAWD,CAAK,CAAA,CAG7B,GAAAY,IAAO,KAAgBA,IAAO,GAAc,CAC9C,GAAID,GAAU,CAACF,GAAc,CAACC,EAAY,CACnChB,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,aAAaJ,CAAK,MACxDC,EAAUD,CAAK,CACjB,2BACA,MAAA,CAUF,GAPSA,GAAA,EAEJY,EAAAX,EAAU,WAAWD,CAAK,GAE3BY,IAAO,IAAgBA,IAAO,MACvBZ,GAAA,GAEPA,EAAQM,GAAOH,EAAQF,EAAU,WAAWD,CAAK,CAAC,EACpD,KAAOA,EAAQM,GAAOH,EAAQF,EAAU,WAAWD,CAAK,CAAC,GAC9CA,GAAA,MAEN,CACAN,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,aAAaJ,CAAK,MACxDC,EAAUD,CAAK,CACjB,6BACA,MAAA,CACF,CAGFN,EAAK,MAAQM,EACbN,EAAK,MAAQ,CAACA,EAAK,UAAU,MAAMa,EAAOP,CAAK,CACjD,ECpGMa,GAAWD,GACG,CAEhB,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,MAEA,GACA,GACA,KACA,KAEA,GACA,EACA,GACA,GACA,GACF,EAEiB,SAASA,CAAE,EChCxBE,EAAcpB,GAAqB,CACjC,KAAA,CAAE,UAAAO,EAAW,IAAAK,CAAA,EAAQZ,EACpB,KAAAA,EAAK,MAAQY,GAAOO,GAAQZ,EAAU,WAAWP,EAAK,KAAK,CAAC,GACjEA,EAAK,OAAS,CAElB,ECPMqB,GAAiBb,GAA4C,CAEjE,OAAQA,EAAO,GAAM,CACnB,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,IAEI,MAAA,GACT,QACS,MAAA,EAAA,CAEb,EChBMc,GACJd,GAEOC,EAAQD,CAAI,GAAgBA,IAAS,IAC1CA,IAAS,IAAgBA,IAAS,GCRhCe,GAAgBf,IAEZA,EAAO,MAAU,GCFrBgB,GAAiBhB,GAAsC,CAE3D,OAAQA,EAAO,GAAM,CACnB,IAAK,KACL,IAAK,IACI,MAAA,GACT,QACS,MAAA,EAAA,CAEb,ECMMiB,GAAezB,GAAqB,OACxC,KAAM,CAAE,IAAAY,EAAK,UAAAL,EAAW,MAAAD,EAAO,SAAAoB,CAAa,EAAA1B,EACtC2B,EAAUpB,EAAU,WAAWD,CAAK,EACpCsB,EACJC,EAAYtB,EAAUD,CAAK,EAAE,aAAgC,EAK3D,GAHJN,EAAK,aAAeM,EAGhB,CAACe,GAAcM,CAAO,EAAG,CACtB3B,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,KACtCH,EAAUD,CAAK,CACjB,oCAAoCA,CAAK,GACzC,MAAA,CAIF,MAAMwB,EAAcJ,EAASA,EAAS,OAAS,CAAC,EAE9C,GAAA,CAACF,GAAcG,CAAO,KAAKI,EAAAD,GAAA,YAAAA,EAAc,KAAd,YAAAC,EAAkB,uBAAwB,IACrE,CACK/B,EAAA,IAAM,GAAGI,CAAK,KAAKM,CAAgB,KACtCH,EAAUD,CAAK,CACjB,2CAA2CA,CAAK,GAChD,MAAA,CAQF,GALAN,EAAK,OAAS,EACdoB,EAAWpB,CAAI,EAEfA,EAAK,KAAO,CAAC,EAET,CAAC4B,EAAW,CAEd7B,GAAgBC,CAAI,EACpB,MAAA,CAGO,OAAA,CACP,QAASgC,EAAIJ,EAAWI,EAAI,EAAGA,GAAK,EAAG,CAIjC,GAHAT,GAAaI,CAAO,IAAMK,IAAM,GAAKA,IAAM,MAAahC,CAAI,KACjDA,CAAI,EAEfA,EAAK,IAAI,OACX,OAEGA,EAAA,KAAK,KAAKA,EAAK,KAAK,EAEzBoB,EAAWpB,CAAI,EAIbA,EAAK,MAAQY,GAAOL,EAAU,WAAWP,EAAK,KAAK,IAAM,KAEzDA,EAAK,OAAS,EACdoB,EAAWpB,CAAI,EACjB,CAQF,GALIA,EAAK,OAASA,EAAK,KAKnB,CAACsB,GAAaf,EAAU,WAAWP,EAAK,KAAK,CAAC,EAChD,KACF,CAGFD,GAAgBC,CAAI,CACtB,ECnFA,MAAqBiC,EAAW,CAU9B,YAAYC,EAAoB,CAC9B,KAAK,SAAW,CAAC,EACjB,KAAK,UAAYA,EACjB,KAAK,IAAMA,EAAW,OACtB,KAAK,MAAQ,EACb,KAAK,MAAQ,EACb,KAAK,aAAe,EACpB,KAAK,KAAO,CAAC,EACb,KAAK,IAAM,EAAA,CAEf,CChBM,MAAAC,EAAwCC,GAA0B,CAClE,GAAA,OAAOA,GAAc,SAChB,OAAAA,EAAU,MAAM,CAAC,EAGpB,MAAApC,EAAO,IAAIiC,GAAWG,CAAS,EAIrC,IAFAhB,EAAWpB,CAAI,EAERA,EAAK,MAAQA,EAAK,KAAO,CAACA,EAAK,IAAI,QACxCyB,GAAYzB,CAAI,EAKd,GAAA,CAACA,EAAK,IAAI,OACRA,EAAK,SAAS,SAMhBA,EAAK,SAAS,CAAC,EAAE,CAAC,EAAI,SAGlB,OAAA,UAAUA,EAAK,GAAG,EAG1B,OAAOA,EAAK,QACd,ECjBMqC,GAAoB,CACxBC,EACAhC,EACAiC,EACAC,IACG,CACG,KAAA,CAACvC,CAAW,EAAIqC,EAChBG,EAAaxC,EAAY,YAAY,EAIvC,GAAAK,IAAU,GAHKmC,IAAexC,EAGI,OAAAqC,EAEtC,GAAIG,IAAe,IACV,MAAA,CACLA,EACAH,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACRA,EAAqB,CAAC,EAAIC,EAC1BD,EAAqB,CAAC,EAAIE,CAC7B,EACF,GAAWC,IAAe,IACxB,MAAO,CAACA,EAAaH,EAAqB,CAAC,EAAIE,CAAK,EACtD,GAAWC,IAAe,IACxB,MAAO,CAACA,EAAaH,EAAqB,CAAC,EAAIC,CAAK,EACtD,GAAWE,IAAe,IACjB,MAAA,CACLA,EACCH,EAAqB,CAAC,EAAIC,EAC1BD,EAAqB,CAAC,EAAIE,CAC7B,EACK,CAGL,MAAME,EAAY,CAAC,EACbC,EAASL,EAAQ,OACvB,QAASM,EAAI,EAAGA,EAAID,EAAQC,GAAK,EAC/BF,EAAU,KAAMJ,EAAQM,CAAC,GAAgBA,EAAI,EAAIL,EAAQC,EAAM,EAGjE,MAAO,CAACC,CAAwC,EAAE,OAAOC,CAAS,CAAA,CAOtE,ECjEMG,EAAU,CACd7C,EACA8C,IACG,CACH,IAAIC,EAAU/C,EAAK,OACfsC,EACArC,EAAc,IACdwC,EAAa,IACbO,EAAa,GACbC,EAAI,EACJC,EAAI,EACJC,EAAK,EACLC,EAAK,EACLC,EAAS,EAEb,QAASrB,EAAI,EAAGA,EAAIe,EAASf,GAAK,EAAG,CACnCM,EAAUtC,EAAKgC,CAAC,EAChB,CAAC/B,CAAW,EAAIqC,EAChBe,EAASf,EAAQ,OACjBG,EAAaxC,EAAY,YAAY,EACrC+C,EAAaP,IAAexC,EAE5B,MAAMqD,EAAiBR,EAASR,EAASN,EAAGiB,EAAGC,CAAC,EAGhD,GAAII,IAAmB,GACrB,MAIEb,IAAe,KACbQ,EAAAE,EACAD,EAAAE,GACKX,IAAe,IACxBQ,EAAKX,EAAQ,CAAC,GAAgBU,EAAaC,EAAI,GACtCR,IAAe,IACxBS,EAAKZ,EAAQ,CAAC,GAAgBU,EAAaE,EAAI,IAE/CD,EAAKX,EAAQe,EAAS,CAAC,GAAgBL,EAAaC,EAAI,GACxDC,EAAKZ,EAAQe,EAAS,CAAC,GAAgBL,EAAaE,EAAI,GAEpDT,IAAe,MACZU,EAAAF,EACAG,EAAAF,IAILI,IACFtD,EAAKgC,CAAC,EAAIsB,EACNA,EAAe,CAAC,IAAM,MACxBP,EAAU/C,EAAK,QAEnB,CAEK,OAAAA,CACT,ECpDMuD,GAAkBnB,GAAkC,CAClD,MAAApC,EAAOmC,EAAgBC,CAAS,EAE/B,OAAAS,EAAuB7C,EAAMqC,EAAiB,CACvD,ECQMmB,GAAoB,CACxBlB,EACAhC,EACAiC,EACAC,IACG,CACG,KAAA,CAACvC,CAAW,EAAIqC,EAChBmB,EAAaxD,EAAY,YAAY,EAIvC,GAAAK,IAAU,GAHKL,IAAgBwD,EAGG,OAAAnB,EAEtC,GAAImB,IAAe,IACV,MAAA,CACLA,EACAnB,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACRA,EAAqB,CAAC,EAAIC,EAC1BD,EAAqB,CAAC,EAAIE,CAC7B,EACF,GAAWiB,IAAe,IACxB,MAAO,CAACA,EAAanB,EAAqB,CAAC,EAAIE,CAAK,EACtD,GAAWiB,IAAe,IACxB,MAAO,CAACA,EAAanB,EAAqB,CAAC,EAAIC,CAAK,EACtD,GAAWkB,IAAe,IACjB,MAAA,CACLA,EACCnB,EAAqB,CAAC,EAAIC,EAC1BD,EAAqB,CAAC,EAAIE,CAC7B,EACK,CAGL,MAAMkB,EAAY,CAAC,EACbf,EAASL,EAAQ,OACvB,QAASM,EAAI,EAAGA,EAAID,EAAQC,GAAK,EAC/Bc,EAAU,KAAMpB,EAAQM,CAAC,GAAgBA,EAAI,EAAIL,EAAQC,EAAM,EAGjE,MAAO,CAACiB,CAAsC,EAAE,OAAOC,CAAS,CAAA,CAMpE,EC7DMC,GAAkBvB,GAAiD,CACjE,MAAApC,EAAOmC,EAAgBC,CAAS,EAE/B,OAAAS,EAAuB7C,EAAMwD,EAAiB,CACvD,ECPMI,GAAe,CACnBX,EACAC,EACAW,IAC6B,CACvB,KAAA,CAAE,IAAAC,EAAK,IAAAC,CAAA,EAAQ,KACfC,EAAIf,EAAIc,EAAIF,CAAG,EAAIX,EAAIY,EAAID,CAAG,EAC9BI,EAAIhB,EAAIa,EAAID,CAAG,EAAIX,EAAIa,EAAIF,CAAG,EACpC,MAAO,CAAE,EAAGG,EAAG,EAAGC,CAAE,CACtB,ECEMC,GAAa,CACjBC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,IACa,CACb,IAAIC,EAAKV,EACLW,EAAKV,EACLW,EAAKV,EACLW,EAAKV,EACLW,EAAKP,EACLQ,EAAKP,EAGH,MAAAQ,EAAQ,KAAK,GAAK,IAAO,IAEzBtB,EAAO,KAAK,GAAK,KAAQ,CAACU,GAAS,GACzC,IAAIa,EAAM,CAAC,EACPC,EACAC,EACAC,EACAC,EACAC,EAEJ,GAAKb,EA4CH,CAACU,EAAIC,EAAIC,EAAIC,CAAE,EAAIb,MA5CL,CACdS,EAAKzB,GAAaiB,EAAIC,EAAI,CAACjB,CAAG,EAC9BgB,EAAKQ,EAAG,EACRP,EAAKO,EAAG,EACRA,EAAKzB,GAAaqB,EAAIC,EAAI,CAACrB,CAAG,EAC9BoB,EAAKI,EAAG,EACRH,EAAKG,EAAG,EAEF,MAAApC,GAAK4B,EAAKI,GAAM,EAChB/B,GAAK4B,EAAKI,GAAM,EACtB,IAAIQ,EAAKzC,EAAIA,GAAM8B,EAAKA,GAAO7B,EAAIA,GAAM8B,EAAKA,GAC1CU,EAAI,IACFA,EAAA,KAAK,KAAKA,CAAC,EACTX,GAAAW,EACAV,GAAAU,GAER,MAAMC,GAAMZ,EAAKA,EACXa,GAAMZ,EAAKA,EAEXa,IAAKrB,IAAQC,EAAK,GAAK,GAC3B,KAAK,KACH,KAAK,KACFkB,GAAMC,GAAMD,GAAMzC,EAAIA,EAAI0C,GAAM3C,EAAIA,IAAM0C,GAAMzC,EAAIA,EAAI0C,GAAM3C,EAAIA,EAAA,CAEvE,EAEFuC,EAAMK,GAAId,EAAK7B,EAAK8B,GAAMH,EAAKI,GAAM,EACrCQ,EAAMI,GAAI,CAACb,EAAK/B,EAAK8B,GAAMD,EAAKI,GAAM,EAEjCI,EAAA,KAAK,OAASR,EAAKW,GAAMT,EAAM,IAAM,GAAM,GAAK,IAAM,CAAC,EAEvDO,EAAA,KAAK,OAASL,EAAKO,GAAMT,EAAM,IAAM,GAAM,GAAK,IAAM,CAAC,EAE5DM,EAAKT,EAAKW,EAAK,KAAK,GAAKF,EAAKA,EAC9BC,EAAKN,EAAKO,EAAK,KAAK,GAAKD,EAAKA,EAC1BD,EAAK,IAAQA,EAAA,KAAK,GAAK,EAAIA,GAC3BC,EAAK,IAAQA,EAAA,KAAK,GAAK,EAAIA,GAC3Bd,GAAMa,EAAKC,IACbD,GAAM,KAAK,GAAK,GAEd,CAACb,GAAMc,EAAKD,IACdC,GAAM,KAAK,GAAK,EAClB,CAIF,IAAIO,EAAKP,EAAKD,EACd,GAAI,KAAK,IAAIQ,CAAE,EAAIX,EAAM,CACvB,MAAMY,EAAQR,EACRS,EAAQf,EACRgB,EAAQf,EACdK,EAAKD,EAAKH,GAAQV,GAAMc,EAAKD,EAAK,EAAI,IACtCL,EAAKO,EAAKT,EAAK,KAAK,IAAIQ,CAAE,EAC1BL,EAAKO,EAAKT,EAAK,KAAK,IAAIO,CAAE,EACpBH,EAAAlB,GAAWe,EAAIC,EAAIH,EAAIC,EAAIT,EAAO,EAAGE,EAAIuB,EAAOC,EAAO,CAC3DV,EACAQ,EACAP,EACAC,CAAA,CACD,CAAA,CAEHK,EAAKP,EAAKD,EACJ,MAAAY,EAAK,KAAK,IAAIZ,CAAE,EAChBa,EAAK,KAAK,IAAIb,CAAE,EAChBc,EAAK,KAAK,IAAIb,CAAE,EAChBc,EAAK,KAAK,IAAId,CAAE,EAChBe,EAAI,KAAK,IAAIR,EAAK,CAAC,EACnBS,EAAM,EAAI,EAAKxB,EAAKuB,EACpBE,EAAM,EAAI,EAAKxB,EAAKsB,EACpBG,EAAK,CAAC5B,EAAIC,CAAE,EACZ4B,EAAK,CAAC7B,EAAK0B,EAAKJ,EAAIrB,EAAK0B,EAAKN,CAAE,EAChCS,EAAK,CAAC1B,EAAKsB,EAAKF,EAAInB,EAAKsB,EAAKJ,CAAE,EAChCQ,GAAK,CAAC3B,EAAIC,CAAE,EAGlB,GAFAwB,EAAG,CAAC,EAAI,EAAID,EAAG,CAAC,EAAIC,EAAG,CAAC,EACxBA,EAAG,CAAC,EAAI,EAAID,EAAG,CAAC,EAAIC,EAAG,CAAC,EACpB9B,EACK,MAAA,CAAC8B,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,GAAG,CAAC,EAAGA,GAAG,CAAC,CAAC,EAAE,OAAOxB,CAAG,EAExDA,EAAA,CAACsB,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGC,GAAG,CAAC,EAAGA,GAAG,CAAC,CAAC,EAAE,OAAOxB,CAAG,EAC3D,MAAMyB,EAAS,CAAC,EACP,QAAA7E,EAAI,EAAG8E,EAAK1B,EAAI,OAAQpD,EAAI8E,EAAI9E,GAAK,EACrC6E,EAAA7E,CAAC,EAAIA,EAAI,EACZ4B,GAAawB,EAAIpD,EAAI,CAAC,EAAGoD,EAAIpD,CAAC,EAAG6B,CAAG,EAAE,EACtCD,GAAawB,EAAIpD,CAAC,EAAGoD,EAAIpD,EAAI,CAAC,EAAG6B,CAAG,EAAE,EAErC,OAAAgD,CACT,EC7HME,GAAc,CAClBlC,EACAC,EACAkC,EACAC,EACAhC,EACAC,IACqD,CACrD,MAAMgC,EAAM,kBACNC,EAAM,EAAI,EACT,MAAA,CACLD,EAAMrC,EAAKsC,EAAMH,EACjBE,EAAMpC,EAAKqC,EAAMF,EACjBC,EAAMjC,EAAKkC,EAAMH,EACjBE,EAAMhC,EAAKiC,EAAMF,EACjBhC,EACAC,CACF,CACF,EClBMkC,EAAW,CAACC,EAAeC,EAAehB,IAA0B,CAClE,KAAA,CAACiB,EAAIC,CAAE,EAAIH,EACX,CAACI,EAAIC,CAAE,EAAIJ,EACV,MAAA,CAACC,GAAME,EAAKF,GAAMjB,EAAGkB,GAAME,EAAKF,GAAMlB,CAAC,CAChD,ECJMqB,GAAc,CAAC9C,EAAYC,EAAYG,EAAYC,IAAe,CAChE,MAAAgB,EAAKkB,EAAS,CAACvC,EAAIC,CAAE,EAAG,CAACG,EAAIC,CAAE,EAAG,iBAAS,EAC3CkB,EAAKgB,EAAS,CAACvC,EAAIC,CAAE,EAAG,CAACG,EAAIC,CAAE,EAAG,EAAM,CAAG,EACjD,MAAO,CAACgB,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGE,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGnB,EAAIC,CAAE,CAC5C,ECFM0C,GAAiB,CAACtF,EAAsBuF,IAAyB,CAC/D,KAAA,CAAC5H,CAAW,EAAIqC,EAChBwF,EAASxF,EAAQ,MAAM,CAAC,EAAE,IAAI,MAAM,EACpC,CAACW,EAAGC,CAAC,EAAI4E,EAET,CAAE,GAAIC,EAAK,GAAIC,EAAK,EAAGC,EAAI,EAAGC,CAAA,EAAOL,EAO3C,MALK,KAAK,SAAS5H,CAAW,IAC5B4H,EAAO,GAAK,KACZA,EAAO,GAAK,MAGV5H,IAAgB,KAClB4H,EAAO,EAAI5E,EACX4E,EAAO,EAAI3E,EACJZ,GACErC,IAAgB,IAClB,CAAC,GAAsB,EAAE,OAC9BiE,GACE6D,EACAC,EACAF,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,EACRA,EAAO,CAAC,CAAA,CAEZ,EACS7H,IAAgB,KACzB4H,EAAO,GAAK5E,EACZ4E,EAAO,GAAK3E,EACL,CAAC,GAAsB,EAAE,OAC9B6D,GAAYgB,EAAKC,EAAKF,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAGA,EAAO,CAAC,EAAGA,EAAO,CAAC,CAAC,CAClE,GACS7H,IAAgB,IAClB,CAAC,GAAsB,EAAE,OAC9B0H,GAAYI,EAAKC,EAAK/E,EAAGC,CAAC,CAC5B,EACSjD,IAAgB,IAClB,CAAC,GAAsB,EAAE,OAC9B0H,GAAYI,EAAKC,EAAKC,EAAIC,CAAE,CAC9B,EAGK5F,CACT,ECtCM6F,GAAmB,CAAC7F,EAAsBuF,IAAyB,CACjE,KAAA,CAAC5H,CAAW,EAAIqC,EAChBG,EAAaxC,EAAY,YAAY,EACrC+C,EAAa/C,IAAgBwC,EAC7B,CAAE,GAAIsF,EAAK,GAAIC,EAAK,GAAII,EAAK,GAAIC,EAAK,EAAApF,EAAG,EAAAC,CAAM,EAAA2E,EAC/CC,EAASxF,EAAQ,MAAM,CAAC,EAC9B,IAAII,EAAYoF,EAAO,IAAI,CAACQ,EAAG1F,IAAM0F,GAAKtF,EAAcJ,EAAI,EAAIM,EAAID,EAAK,EAAE,EAS3E,GAPK,KAAK,SAASR,CAAU,IAE3BoF,EAAO,GAAK,KACZA,EAAO,GAAK,MAIVpF,IAAe,IACjB,OAAAC,EAAYoF,EAAO,MAAM,EAAG,EAAE,EAAE,OAC9BA,EAAO,CAAC,GAAK9E,EAAaC,EAAI,GAC9B6E,EAAO,CAAC,GAAK9E,EAAaE,EAAI,EAChC,EAEO,CAAC,GAA2B,EAAE,OAAOR,CAAS,EACvD,GAAWD,IAAe,IACjB,MAAA,CACL,IACCH,EAAqB,CAAC,GAAKU,EAAaC,EAAI,GAC7C+E,CACF,EACF,GAAWvF,IAAe,IACjB,MAAA,CACL,IACAsF,EACCzF,EAAqB,CAAC,GAAKU,EAAaE,EAAI,EAC/C,EACF,GAAWT,IAAe,IACjB,MAAA,CACL,IACCH,EAAqB,CAAC,GAAKU,EAAaC,EAAI,GAC5CX,EAAqB,CAAC,GAAKU,EAAaE,EAAI,EAC/C,EACF,GAAWT,IAAe,IACjB,MAAA,CACL,IACCH,EAAqB,CAAC,GAAKU,EAAaC,EAAI,GAC5CX,EAAqB,CAAC,GAAKU,EAAaE,EAAI,EAC/C,EACF,GAAWT,IAAe,IACxB,MAAO,CAAC,GAA2B,EAAE,OAAOC,CAAS,EACvD,GAAWD,IAAe,IAAK,CACvB,MAAAoC,EAAKkD,EAAM,EAAIK,EACftD,EAAKkD,EAAM,EAAIK,EACrB,OAAAR,EAAO,GAAKhD,EACZgD,EAAO,GAAK/C,EACL,CAAC,IAAKD,EAAIC,CAAE,EAAE,OAAOpC,CAAS,CAAA,SAC5BD,IAAe,IAAK,CAC7B,MAAMuE,EAAKe,EAAM,GAAKF,EAAO,GAAKA,EAAO,GAAgC,GACnEZ,EAAKe,EAAM,GAAKH,EAAO,GAAKA,EAAO,GAAgC,GACzE,OAAAA,EAAO,GAAKb,EACZa,EAAO,GAAKZ,EACL,CAAC,IAAKD,EAAIC,CAAE,EAAE,OAAOvE,CAAS,CAAA,SAC5BD,IAAe,IAAK,CACvB,KAAA,CAAC8F,EAAKC,CAAG,EAAI9F,EACnB,OAAAmF,EAAO,GAAKU,EACZV,EAAO,GAAKW,EACL,CAAC,GAA2B,EAAE,OAAO9F,CAAS,CAAA,SAC5CD,IAAe,IACxB,MAAO,CAAC,GAAG,EAIN,OAAAH,CACT,EC3FMmG,GAA6B,CACjC,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,EAAG,EACH,EAAG,EACH,GAAI,KACJ,GAAI,IACN,ECMMC,GAAetG,GAA8C,CAC3D,MAAAyF,EAAS,CAAE,GAAGY,EAAa,EAC3BzI,EAAOmC,EAAgBC,CAAS,EAEtC,OAAOS,EAAoB7C,EAAM,CAAC2I,EAAKrI,EAAOiC,EAAOC,IAAU,CAC7DqF,EAAO,EAAItF,EACXsF,EAAO,EAAIrF,EACL,MAAAoG,EAAgBT,GAAiBQ,EAAKd,CAAM,EAC9C,IAAAgB,EAASjB,GAAegB,EAAef,CAAM,EAC/BgB,EAAO,CAAC,IAAM,KAAOA,EAAO,OAAS,IAGhD7I,EAAA,OACHM,EAAQ,EACR,EACA,CAAC,GAA+B,EAAE,OAAOuI,EAAO,MAAM,CAAC,CAAC,CAC1D,EACSA,EAAAA,EAAO,MAAM,EAAG,CAAC,GAG5B,MAAMlG,EAASkG,EAAO,OACtB,OAAAhB,EAAO,GAAK,CAACgB,EAAOlG,EAAS,CAAC,EAC9BkF,EAAO,GAAK,CAACgB,EAAOlG,EAAS,CAAC,EAC9BkF,EAAO,GAAK,CAACgB,EAAOlG,EAAS,CAAC,GAAKkF,EAAO,GAC1CA,EAAO,GAAK,CAACgB,EAAOlG,EAAS,CAAC,GAAKkF,EAAO,GAEnCgB,CAAA,CACR,CACH,EC7CMC,EAAU,CAACR,EAAWS,IAAkB,CAC5C,MAAMC,EAAMD,GAAS,EAAI,IAAMA,EAAQ,EAEhC,OAAAA,EAAQ,EAAI,KAAK,MAAMT,EAAIU,CAAG,EAAIA,EAAM,KAAK,MAAMV,CAAC,CAC7D,ECQMW,GAAe,CACnBjJ,EACAkJ,IACW,CACX,MAAMnG,EAAU/C,EAAK,OACjB,GAAA,CAAE,MAAA+I,GAAUlJ,EACZyC,EAAUtC,EAAK,CAAC,EAChB6I,EAAS,GAGbE,EAAQG,IAAgB,OAEpB,OAAOA,GAAgB,UAAYA,GAAe,EADlDA,EAGA,OAAOH,GAAU,UAAYA,GAAS,EACtCA,EACqC,MAEzC,QAAS/G,EAAI,EAAGA,EAAIe,EAASf,GAAK,EAAG,CACnCM,EAAUtC,EAAKgC,CAAC,EACV,KAAA,CAAC/B,CAAW,EAAIqC,EAChBwF,EAASxF,EAAQ,MAAM,CAAC,EAE9B,GADUuG,GAAA5I,EACN8I,IAAU,MACFF,GAAAf,EAAO,KAAK,GAAG,MACpB,CACL,IAAIlF,EAAI,EACR,MAAMuG,EAASrB,EAAO,OACtB,KAAOlF,EAAIuG,GACTN,GAAUC,EAAQhB,EAAOlF,CAAC,EAAGmG,CAAK,EAC9BnG,IAAMuG,EAAS,IAAaN,GAAA,KAC3BjG,GAAA,CACP,CACF,CAGK,OAAAiG,CACT,ECvCMO,GAAqB,CAAC/B,EAAeC,IAClC,KAAK,MACTD,EAAE,CAAC,EAAIC,EAAE,CAAC,IAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,IAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,IAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,EAC7D,ECDI+B,GAAgB,CAACxE,EAAYC,EAAYG,EAAYC,IAClDkE,GAAmB,CAACvE,EAAIC,CAAE,EAAG,CAACG,EAAIC,CAAE,CAAC,EAaxCoE,GAAuB,CAC3BzE,EACAC,EACAG,EACAC,EACAqE,IACG,CACH,IAAIC,EAAQ,CAAE,EAAG3E,EAAI,EAAGC,CAAG,EAGvB,GAAA,OAAOyE,GAAa,SAAU,CAC1B,MAAAE,EAASL,GAAmB,CAACvE,EAAIC,CAAE,EAAG,CAACG,EAAIC,CAAE,CAAC,EACpD,GAAIqE,GAAY,EACdC,EAAQ,CAAE,EAAG3E,EAAI,EAAGC,CAAG,UACdyE,GAAYE,EACrBD,EAAQ,CAAE,EAAGvE,EAAI,EAAGC,CAAG,MAClB,CACL,KAAM,CAACjC,EAAGC,CAAC,EAAIkE,EAAS,CAACvC,EAAIC,CAAE,EAAG,CAACG,EAAIC,CAAE,EAAGqE,EAAWE,CAAM,EACrDD,EAAA,CAAE,EAAAvG,EAAG,EAAAC,CAAE,CAAA,CACjB,CAEK,OAAAsG,CACT,EAYME,GAAc,CAAC7E,EAAYC,EAAYG,EAAYC,IAAe,CAChE,KAAA,CAAE,IAAAyE,EAAK,IAAA/I,CAAA,EAAQ,KAErB,MAAO,CAAC+I,EAAI9E,EAAII,CAAE,EAAG0E,EAAI7E,EAAII,CAAE,EAAGtE,EAAIiE,EAAII,CAAE,EAAGrE,EAAIkE,EAAII,CAAE,CAAC,CAM5D,EC3DM0E,GAAY,CAAC7E,EAAYC,EAAY6E,IAAkB,CAC3D,MAAMC,EAAYD,EAAQ,EACpBE,EAAe,KAAK,IAAID,CAAS,EACjCE,EAAe,KAAK,IAAIF,CAAS,EACjCG,EAAQlF,GAAM,EAAIgF,GAAgB,EAClCG,EAAQlF,GAAM,EAAIgF,GAAgB,EAClCP,EAAS,KAAK,KAAKQ,EAAQC,CAAK,EAAIL,EACnC,OAAA,KAAK,IAAIJ,CAAM,CACxB,EAYMU,EAAW,CACf3E,EACAC,EACAV,EACAC,EACAoF,EACAP,IACG,CACG,KAAA,CAAE,IAAA/F,EAAK,IAAAC,CAAA,EAAQ,KAGfsG,EAAOtG,EAAIqG,CAAK,EAChBE,EAAOxG,EAAIsG,CAAK,EAChBnH,EAAI8B,EAAKhB,EAAI8F,CAAK,EAClB3G,EAAI8B,EAAKlB,EAAI+F,CAAK,EAEjB,MAAA,CAACrE,EAAK6E,EAAOpH,EAAIqH,EAAOpH,EAAGuC,EAAK6E,EAAOrH,EAAIoH,EAAOnH,CAAC,CAC5D,EAQMqH,GAAe,CAACC,EAAWC,IAAc,CAC7C,KAAM,CAAE,EAAGC,EAAK,EAAGC,CAAQ,EAAAH,EACrB,CAAE,EAAGI,EAAK,EAAGC,CAAQ,EAAAJ,EACrBK,EAAIJ,EAAME,EAAMD,EAAME,EACtBvC,EAAI,KAAK,MAAMoC,GAAO,EAAIC,GAAO,IAAMC,GAAO,EAAIC,GAAO,EAAE,EAEjE,OADaH,EAAMG,EAAMF,EAAMC,EAAM,EAAI,GAAK,GAChC,KAAK,KAAKE,EAAIxC,CAAC,CAC/B,EAiBMyC,GAAc,CAClBlG,EACAC,EACAT,EACAC,EACAC,EACAC,EACAC,EACAxB,EACAC,IACG,CACH,KAAM,CAAE,IAAA8H,EAAK,IAAAlH,EAAK,IAAAC,EAAK,KAAAkH,EAAM,GAAAC,GAAO,KAChC,IAAAnG,EAAKiG,EAAI3G,CAAE,EACXW,EAAKgG,EAAI1G,CAAE,EAET,MAAA6G,GADS5G,EAAQ,IAAO,KAAO,KACb2G,EAAK,KAGzB,GAAArG,IAAO5B,GAAK6B,IAAO5B,EACd,MAAA,CACL,GAAA6B,EACA,GAAAC,EACA,WAAY,EACZ,SAAU,EACV,OAAQ,CAAE,EAAA/B,EAAG,EAAAC,CAAE,CACjB,EAGE,GAAA6B,IAAO,GAAKC,IAAO,EACd,MAAA,CACL,GAAAD,EACA,GAAAC,EACA,WAAY,EACZ,SAAU,EACV,OAAQ,CAAE,GAAI/B,EAAI4B,GAAM,EAAG,GAAI3B,EAAI4B,GAAM,CAAE,CAC7C,EAGI,MAAAsG,GAAMvG,EAAK5B,GAAK,EAChBoI,GAAMvG,EAAK5B,GAAK,EAEhBoI,EAAmB,CACvB,EAAGvH,EAAIoH,CAAO,EAAIC,EAAKtH,EAAIqH,CAAO,EAAIE,EACtC,EAAG,CAACvH,EAAIqH,CAAO,EAAIC,EAAKrH,EAAIoH,CAAO,EAAIE,CACzC,EAEME,EAAaD,EAAiB,GAAK,EAAIvG,GAAM,EACjDuG,EAAiB,GAAK,EAAItG,GAAM,EAE9BuG,EAAa,IACfxG,GAAMkG,EAAKM,CAAU,EACrBvG,GAAMiG,EAAKM,CAAU,GAGvB,MAAMC,EAAmBzG,GAAM,EAAIC,GAAM,EACvCD,GAAM,EAAIuG,EAAiB,GAAK,EAAItG,GAAM,EAAIsG,EAAiB,GAAK,EAChEG,EAAmB1G,GAAM,EAAIuG,EAAiB,GAAK,EACvDtG,GAAM,EAAIsG,EAAiB,GAAK,EAElC,IAAII,EAAYF,EAAmBC,EAEvBC,EAAAA,EAAY,EAAI,EAAIA,EAChC,MAAMC,GAASnH,IAAQC,EAAK,EAAI,IAAMwG,EAAKS,CAAS,EAC9CE,EAAoB,CACxB,EAAGD,GAAU5G,EAAKuG,EAAiB,EAAKtG,GACxC,EAAG2G,GAAS,EAAE3G,EAAKsG,EAAiB,GAAKvG,EAC3C,EAEM8G,EAAS,CACb,EAAG9H,EAAIoH,CAAO,EAAIS,EAAkB,EAAI9H,EAAIqH,CAAO,EAAIS,EAAkB,GACtE/G,EAAK5B,GAAK,EACb,EAAGa,EAAIqH,CAAO,EAAIS,EAAkB,EAAI7H,EAAIoH,CAAO,EAAIS,EAAkB,GACtE9G,EAAK5B,GAAK,CACf,EAEM4I,EAAc,CAClB,GAAIR,EAAiB,EAAIM,EAAkB,GAAK7G,EAChD,GAAIuG,EAAiB,EAAIM,EAAkB,GAAK5G,CAClD,EAEM+G,EAAaxB,GAAa,CAAE,EAAG,EAAG,EAAG,GAAKuB,CAAW,EAErDE,EAAY,CAChB,GAAI,CAACV,EAAiB,EAAIM,EAAkB,GAAK7G,EACjD,GAAI,CAACuG,EAAiB,EAAIM,EAAkB,GAAK5G,CACnD,EAEI,IAAAiH,EAAa1B,GAAauB,EAAaE,CAAS,EAChD,CAACvH,GAAMwH,EAAa,EACtBA,GAAc,EAAIf,EACTzG,GAAMwH,EAAa,IAC5BA,GAAc,EAAIf,GAEpBe,GAAc,EAAIf,EAElB,MAAMgB,EAAWH,EAAaE,EAUvB,MAAA,CACL,OAAAJ,EACA,WAAAE,EACA,SAAAG,EACA,GAAAnH,EACA,GAAAC,CACF,CACF,EAeMmH,GAAe,CACnBtH,EACAC,EACAT,EACAC,EACAC,EACAC,EACAC,EACAxB,EACAC,IACG,CACH,KAAM,CAAE,GAAA6B,EAAI,GAAAC,EAAI,WAAA+G,EAAY,SAAAG,CAAa,EAAAnB,GACvClG,EACAC,EACAT,EACAC,EACAC,EACAC,EACAC,EACAxB,EACAC,CACF,EACA,OAAO0G,GAAU7E,EAAIC,EAAIkH,EAAWH,CAAU,CAChD,EAiBMK,GAAsB,CAC1BvH,EACAC,EACAT,EACAC,EACAC,EACAC,EACAC,EACAxB,EACAC,EACAqG,IACG,CACH,IAAIC,EAAQ,CAAE,EAAG3E,EAAI,EAAGC,CAAG,EAC3B,KAAM,CAAE,OAAA+G,EAAQ,GAAA9G,EAAI,GAAAC,EAAI,WAAA+G,EAAY,SAAAG,GAAanB,GAC/ClG,EACAC,EACAT,EACAC,EACAC,EACAC,EACAC,EACAxB,EACAC,CACF,EAGI,GAAA,OAAOqG,GAAa,SAAU,CAChC,MAAME,EAASG,GAAU7E,EAAIC,EAAIkH,EAAWH,CAAU,EACtD,GAAIxC,GAAY,EACdC,EAAQ,CAAE,EAAG3E,EAAI,EAAGC,CAAG,UACdyE,GAAYE,EACbD,EAAA,CAAE,EAAAvG,EAAG,EAAAC,CAAE,MACV,CAED,GAAA2B,IAAO5B,GAAK6B,IAAO5B,EACd,MAAA,CAAE,EAAAD,EAAG,EAAAC,CAAE,EAGZ,GAAA6B,IAAO,GAAKC,IAAO,EACrB,OAAOsE,GAAqBzE,EAAIC,EAAI7B,EAAGC,EAAGqG,CAAQ,EAEpD,KAAM,CAAE,GAAA2B,EAAI,IAAAnH,EAAK,IAAAD,CAAQ,EAAA,KACnBmI,EAAaC,EAAWH,EAExBZ,GADS5G,EAAQ,IAAO,KAAO,KACb2G,EAAK,KACvBd,EAAQ2B,EAAaE,GAAc1C,EAAWE,GAC9C4C,EAAoBtH,EAAKhB,EAAIqG,CAAK,EAClCkC,EAAoBtH,EAAKlB,EAAIsG,CAAK,EAEhCZ,EAAA,CACN,EAAGzF,EAAIoH,CAAO,EAAIkB,EAAoBvI,EAAIqH,CAAO,EAAImB,EACnDT,EAAO,EACT,EAAG/H,EAAIqH,CAAO,EAAIkB,EAAoBtI,EAAIoH,CAAO,EAAImB,EACnDT,EAAO,CACX,CAAA,CACF,CAGK,OAAArC,CACT,EAmBM+C,GAAa,CACjB1H,EACAC,EACAT,EACAC,EACAC,EACAC,EACAC,EACAxB,EACAC,IACG,CACH,KAAM,CAAE,OAAA2I,EAAQ,GAAA9G,EAAI,GAAAC,EAAI,WAAA+G,EAAY,SAAAG,GAAanB,GAC/ClG,EACAC,EACAT,EACAC,EACAC,EACAC,EACAC,EACAxB,EACAC,CACF,EACMsJ,EAAaN,EAAWH,EACxB,CAAE,IAAApC,EAAK,IAAA/I,EAAK,IAAA6L,EAAK,MAAAC,EAAO,GAAAxB,GAAO,KAG/B,CAAE,EAAG1F,EAAI,EAAGC,CAAO,EAAAoG,EAGnBzB,EAAS7F,EAAQ2G,EAAM,IACvByB,EAAUF,EAAIrC,CAAK,EAMnBP,EAAQ6C,EAAM,CAAC1H,EAAK2H,EAAS5H,CAAE,EAC/B6H,EAAS/C,EACTgD,EAAShD,EAAQqB,EACjB4B,EAASJ,EAAM1H,EAAID,EAAK4H,CAAO,EAC/BI,EAASD,EAAS5B,EAClB8B,EAAS,CAAC/J,CAAC,EACXgK,EAAS,CAAC/J,CAAC,EAGb,IAAAgK,EAAOvD,EAAI9E,EAAI5B,CAAC,EAChBkK,EAAOvM,EAAIiE,EAAI5B,CAAC,EAChBmK,EAAOzD,EAAI7E,EAAI5B,CAAC,EAChBmK,EAAOzM,EAAIkE,EAAI5B,CAAC,EAGd,MAAAoK,GAAkBpB,EAAWM,EAAa,KAC1Ce,EAAMpD,EAAS3E,EAAIC,EAAIV,EAAIC,EAAIoF,EAAOkD,EAAe,EAGrDE,EAAiBtB,EAAWM,EAAa,OACzCiB,EAAMtD,EAAS3E,EAAIC,EAAIV,EAAIC,EAAIoF,EAAOoD,CAAc,EAU1D,GAAID,EAAI,CAAC,EAAIJ,GAAQM,EAAI,CAAC,EAAIN,EAAM,CAElC,MAAMO,EAAKvD,EAAS3E,EAAIC,EAAIV,EAAIC,EAAIoF,EAAOwC,CAAM,EAC1CI,EAAA,KAAKU,EAAG,CAAC,CAAC,EACVT,EAAA,KAAKS,EAAG,CAAC,CAAC,CAAA,CAInB,GAAIH,EAAI,CAAC,EAAIL,GAAQO,EAAI,CAAC,EAAIP,EAAM,CAElC,MAAMS,EAAKxD,EAAS3E,EAAIC,EAAIV,EAAIC,EAAIoF,EAAOyC,CAAM,EAC1CG,EAAA,KAAKW,EAAG,CAAC,CAAC,EACVV,EAAA,KAAKU,EAAG,CAAC,CAAC,CAAA,CAInB,GAAIJ,EAAI,CAAC,EAAIH,GAAQK,EAAI,CAAC,EAAIL,EAAM,CAElC,MAAMQ,EAAKzD,EAAS3E,EAAIC,EAAIV,EAAIC,EAAIoF,EAAO2C,CAAM,EAC1CC,EAAA,KAAKY,EAAG,CAAC,CAAC,EACVX,EAAA,KAAKW,EAAG,CAAC,CAAC,CAAA,CAInB,GAAIL,EAAI,CAAC,EAAIF,GAAQI,EAAI,CAAC,EAAIJ,EAAM,CAElC,MAAMQ,EAAK1D,EAAS3E,EAAIC,EAAIV,EAAIC,EAAIoF,EAAO0C,CAAM,EAC1CE,EAAA,KAAKa,EAAG,CAAC,CAAC,EACVZ,EAAA,KAAKY,EAAG,CAAC,CAAC,CAAA,CAGnB,OAAAX,EAAOvD,EAAI,MAAM,CAAA,EAAIqD,CAAM,EAC3BI,EAAOzD,EAAI,MAAM,CAAA,EAAIsD,CAAM,EAC3BE,EAAOvM,EAAI,MAAM,CAAA,EAAIoM,CAAM,EAC3BK,EAAOzM,EAAI,MAAM,CAAA,EAAIqM,CAAM,EAEpB,CAACC,EAAME,EAAMD,EAAME,CAAI,CAChC,EC1ZMS,GAAU,CACd,oBACA,mBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,kBACA,iBACA,mBACA,kBACA,mBACA,kBACA,mBACA,kBACA,mBACA,iBACF,EAEMC,GAAU,CACd,mBACA,mBACA,kBACA,kBACA,mBACA,mBACA,kBACA,kBACA,mBACA,mBACA,mBACA,mBACA,mBACA,mBACA,kBACA,kBACA,mBACA,mBACA,mBACA,mBACA,oBACA,oBACA,kBACA,iBACF,EAMMC,GAAgBC,GAAqC,CACzD,MAAMC,EAAU,CAAC,EACjB,QAASpD,EAAImD,EAAQE,EAAIrD,EAAE,OAAQsD,EAAID,EAAI,EAAGA,EAAI,EAAGA,GAAK,EAAGC,GAAK,EAAG,CACnE,MAAMC,EAAO,CAAC,EACd,QAASzL,EAAI,EAAGA,EAAIwL,EAAGxL,GAAK,EAC1ByL,EAAK,KAAK,CACR,EAAGD,GAAKtD,EAAElI,EAAI,CAAC,EAAE,EAAIkI,EAAElI,CAAC,EAAE,GAC1B,EAAGwL,GAAKtD,EAAElI,EAAI,CAAC,EAAE,EAAIkI,EAAElI,CAAC,EAAE,GAC1B,EAAG,CAAA,CACJ,EAEHsL,EAAQ,KAAKG,CAAI,EACbvD,EAAAuD,CAAA,CAEC,OAAAH,CACT,EAMMI,GAAgB,CACpBL,EACA3H,IACG,CAGH,GAAIA,IAAM,EACD,OAAA2H,EAAA,CAAC,EAAE,EAAI,EACPA,EAAO,CAAC,EAGX,MAAAM,EAAQN,EAAO,OAAS,EAG9B,GAAI3H,IAAM,EACD,OAAA2H,EAAAM,CAAK,EAAE,EAAI,EACXN,EAAOM,CAAK,EAGrB,MAAMC,EAAK,EAAIlI,EACf,IAAIwE,EAAImD,EASR,GAAIM,IAAU,EACL,OAAAN,EAAA,CAAC,EAAE,EAAI3H,EACP2H,EAAO,CAAC,EAKjB,GAAIM,IAAU,EACL,MAAA,CACL,EAAGC,EAAK1D,EAAE,CAAC,EAAE,EAAIxE,EAAIwE,EAAE,CAAC,EAAE,EAC1B,EAAG0D,EAAK1D,EAAE,CAAC,EAAE,EAAIxE,EAAIwE,EAAE,CAAC,EAAE,EAC1B,EAAAxE,CACF,EAIF,MAAMmI,EAAMD,EAAKA,EACXE,EAAKpI,EAAIA,EACf,IAAI,EAAI,EACJgB,EAAI,EACJ8G,EAAI,EACJD,EAAI,EAER,OAAII,IAAU,GACZzD,EAAI,CAACA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAG,CAAE,EAAG,EAAG,EAAG,EAAmB,EACjD,EAAA2D,EACJnH,EAAIkH,EAAKlI,EAAI,EACT8H,EAAAM,GACKH,IAAU,IACnB,EAAIE,EAAMD,EACVlH,EAAImH,EAAMnI,EAAI,EACd8H,EAAII,EAAKE,EAAK,EACdP,EAAI7H,EAAIoI,GAEH,CACL,EAAG,EAAI5D,EAAE,CAAC,EAAE,EAAIxD,EAAIwD,EAAE,CAAC,EAAE,EAAIsD,EAAItD,EAAE,CAAC,EAAE,EAAIqD,EAAIrD,EAAE,CAAC,EAAE,EACnD,EAAG,EAAIA,EAAE,CAAC,EAAE,EAAIxD,EAAIwD,EAAE,CAAC,EAAE,EAAIsD,EAAItD,EAAE,CAAC,EAAE,EAAIqD,EAAIrD,EAAE,CAAC,EAAE,EACnD,EAAAxE,CACF,CACF,EAEMqI,GAAkB,CAACC,EAA8BtI,IAAc,CAC7D,MAAA6H,EAAIS,EAAatI,CAAC,EAClBuI,EAAIV,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAAIA,EAAE,EAEvB,OAAA,KAAK,KAAKU,CAAC,CACpB,EAEMC,GAAgBF,GAAiC,CAErD,MAAMG,EAAMjB,GAAQ,OAEpB,IAAIkB,EAAM,EAEV,QAAShN,EAAI,EAAGsE,EAAGtE,EAAI+M,EAAK/M,IACtBsE,EAAA,GAAIwH,GAAQ9L,CAAC,EAAI,GACrBgN,GAAOjB,GAAQ/L,CAAC,EAAI2M,GAAgBC,EAActI,CAAC,EAErD,MAAO,IAAI0I,CACb,EAMMC,GAAmBC,GAA8C,CACrE,MAAMjB,EAAS,CAAC,EACP,QAAAkB,EAAM,EAAGJ,EAAMG,EAAM,OAAQE,EAAO,EAAGD,EAAMJ,EAAKI,GAAOC,EAChEnB,EAAO,KAAK,CACV,EAAGiB,EAAMC,CAAG,EACZ,EAAGD,EAAMC,EAAM,CAAC,CAAA,CACjB,EAEG,MAAAjB,EAAUF,GAAaC,CAAM,EAC5B,OAAAa,GAAcxI,GACZgI,GAAcJ,EAAQ,CAAC,EAAG5H,CAAC,CACnC,CACH,EAGM+I,GAAyB,KAOzBC,GAAU,CAAC,CAAC7E,EAAI8E,EAAIC,CAAE,IAAgC,CAC1D,MAAM7F,EAAM,KAAK,IAAIc,EAAI+E,CAAE,EACrB5O,EAAM,KAAK,IAAI6J,EAAI+E,CAAE,EAG3B,GAAID,GAAM9E,EAAK+E,GAAMD,EAAKC,GAAMD,EAEvB,MAAA,CAAC5F,EAAK/I,CAAG,EAIlB,MAAM6O,GAAKhF,EAAK+E,EAAKD,EAAKA,IAAO9E,EAAK,EAAI8E,EAAKC,GACvC,OAAAC,EAAI9F,EAAM,CAAC8F,EAAG7O,CAAG,EAAI,CAAC+I,EAAK8F,CAAC,CACtC,EAOMC,GAAU,CAAC,CAACjF,EAAIkF,EAAKC,EAAKJ,CAAE,IAAwC,CACxE,MAAMK,EAAIpF,EAAK,EAAIkF,EAAM,EAAIC,EAAMJ,EAInC,GAAI,KAAK,IAAIK,CAAC,EAAIR,GACZ,OAAA5E,IAAO+E,GAAM/E,IAAOkF,EAEf,CAAClF,EAAI+E,CAAE,EAGTF,GAAQ,CAAC7E,EAAI,IAAOA,EAAK,IAAMkF,EAAKlF,EAAK,EAAIkF,EAAM,EAAIC,CAAG,CAAC,EAIpE,MAAME,EAAI,CAACrF,EAAKmF,EAAMnF,EAAK+E,EAAKG,EAAMC,EAAMD,EAAMH,EAAKG,EAAMA,EAAMC,EAAMA,EAGzE,GAAIE,GAAK,EACA,MAAA,CAAC,KAAK,IAAIrF,EAAI+E,CAAE,EAAG,KAAK,IAAI/E,EAAI+E,CAAE,CAAC,EAEtC,MAAAO,EAAI,KAAK,KAAKD,CAAC,EAGrB,IAAInG,EAAM,KAAK,IAAIc,EAAI+E,CAAE,EACrB5O,EAAM,KAAK,IAAI6J,EAAI+E,CAAE,EAEnB,MAAAQ,EAAIvF,EAAK,EAAIkF,EAAMC,EAEzB,QAASK,GAAKD,EAAID,GAAKF,EAAG7N,EAAI,EAAGA,GAAK,EAAGiO,GAAKD,EAAID,GAAKF,EAAG7N,IAEpD,GAAAiO,EAAI,GAAKA,EAAI,EAAG,CAEZ,MAAAC,EAAIzF,GAAM,EAAIwF,IAAM,EAAIA,IAAM,EAAIA,GACtCN,EAAM,GAAK,EAAIM,IAAM,EAAIA,GAAKA,EAAIL,EAAM,GAAK,EAAIK,GAAKA,EAAIA,EAC1DT,EAAKS,EAAIA,EAAIA,EACXC,EAAIvG,IACAA,EAAAuG,GAEJA,EAAItP,IACAA,EAAAsP,EACR,CAIG,MAAA,CAACvG,EAAK/I,CAAG,CAClB,ECrQMuP,GAA+B,CACnC,CAACtL,EAAIC,EAAIsL,EAAKC,EAAKC,EAAKC,EAAKtL,EAAIC,CAAE,EACnCoB,IACG,CACH,MAAMkK,EAAK,EAAIlK,EACR,MAAA,CACL,EAAGkK,GAAM,EAAI3L,EAAK,EAAI2L,GAAM,EAAIlK,EAAI8J,EAAM,EAAII,EAAKlK,GAAK,EAAIgK,EAC1DhK,GAAK,EAAIrB,EACX,EAAGuL,GAAM,EAAI1L,EAAK,EAAI0L,GAAM,EAAIlK,EAAI+J,EAAM,EAAIG,EAAKlK,GAAK,EAAIiK,EAC1DjK,GAAK,EAAIpB,CACb,CACF,EAeMuL,GAAiB,CACrB5L,EACAC,EACAsL,EACAC,EACAC,EACAC,EACAtL,EACAC,IAEO+J,GAAgB,CAACpK,EAAIC,EAAIsL,EAAKC,EAAKC,EAAKC,EAAKtL,EAAIC,CAAE,CAAC,EAiBvDwL,GAAwB,CAC5B7L,EACAC,EACAsL,EACAC,EACAC,EACAC,EACAtL,EACAC,EACAqE,IACG,CACG,MAAAoH,EAAmB,OAAOpH,GAAa,SAC7C,IAAIC,EAAQ,CAAE,EAAG3E,EAAI,EAAGC,CAAG,EAE3B,GAAI6L,EAAkB,CACd,MAAAC,EAAgB3B,GAAgB,CAACpK,EAAIC,EAAIsL,EAAKC,EAAKC,EAAKC,EAAKtL,EAAIC,CAAE,CAAC,EACtEqE,GAAY,IAELA,GAAYqH,EACrBpH,EAAQ,CAAE,EAAGvE,EAAI,EAAGC,CAAG,EAEfsE,EAAA2G,GACN,CAACtL,EAAIC,EAAIsL,EAAKC,EAAKC,EAAKC,EAAKtL,EAAIC,CAAE,EACnCqE,EAAWqH,CACb,EACF,CAEK,OAAApH,CACT,EAgBMqH,GAAe,CACnBhM,EACAC,EACAsL,EACAC,EACAC,EACAC,EACAtL,EACAC,IACG,CACH,MAAM4L,EAAWpB,GAAQ,CAAC7K,EAAIuL,EAAKE,EAAKrL,CAAE,CAAC,EACrC8L,EAAWrB,GAAQ,CAAC5K,EAAIuL,EAAKE,EAAKrL,CAAE,CAAC,EAE3C,MAAO,CAAC4L,EAAS,CAAC,EAAGC,EAAS,CAAC,EAAGD,EAAS,CAAC,EAAGC,EAAS,CAAC,CAAC,CAM5D,ECnHMC,GAA8B,CAClC,CAACnM,EAAIC,EAAIU,EAAIC,EAAIR,EAAIC,CAAE,EACvBoB,IACG,CACH,MAAMkK,EAAK,EAAIlK,EACR,MAAA,CACL,EAAGkK,GAAM,EAAI3L,EAAK,EAAI2L,EAAKlK,EAAId,EAAKc,GAAK,EAAIrB,EAC7C,EAAGuL,GAAM,EAAI1L,EAAK,EAAI0L,EAAKlK,EAAIb,EAAKa,GAAK,EAAIpB,CAC/C,CACF,EAaM+L,GAAgB,CACpBpM,EACAC,EACAU,EACAC,EACAR,EACAC,IAEO+J,GAAgB,CAACpK,EAAIC,EAAIU,EAAIC,EAAIR,EAAIC,CAAE,CAAC,EAe3CgM,GAAuB,CAC3BrM,EACAC,EACAU,EACAC,EACAR,EACAC,EACAqE,IACG,CACG,MAAAoH,EAAmB,OAAOpH,GAAa,SAC7C,IAAIC,EAAQ,CAAE,EAAG3E,EAAI,EAAGC,CAAG,EAG3B,GAAI6L,EAAkB,CACd,MAAAC,EAAgB3B,GAAgB,CAACpK,EAAIC,EAAIU,EAAIC,EAAIR,EAAIC,CAAE,CAAC,EAC1DqE,GAAY,IAELA,GAAYqH,EACrBpH,EAAQ,CAAE,EAAGvE,EAAI,EAAGC,CAAG,EAEfsE,EAAAwH,GACN,CAACnM,EAAIC,EAAIU,EAAIC,EAAIR,EAAIC,CAAE,EACvBqE,EAAWqH,CACb,EACF,CAEK,OAAApH,CACT,EAcM2H,GAAc,CAClBtM,EACAC,EACAU,EACAC,EACAR,EACAC,IACG,CACH,MAAM4L,EAAWxB,GAAQ,CAACzK,EAAIW,EAAIP,CAAE,CAAC,EAC/B8L,EAAWzB,GAAQ,CAACxK,EAAIW,EAAIP,CAAE,CAAC,EACrC,MAAO,CAAC4L,EAAS,CAAC,EAAGC,EAAS,CAAC,EAAGD,EAAS,CAAC,EAAGC,EAAS,CAAC,CAAC,CAM5D,EC9GMK,GAAehP,GAAkC,CACrD,GAAI,CAACA,EACI,MAAA,CACL,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,EACR,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,CACN,EAGI,MAAApC,EAAOmC,EAAgBC,CAAS,EACtC,IAAInC,EAAc,IACdkD,EAAK,EACLC,EAAK,EACH,KAAA,CAAE,IAAAxC,EAAK,IAAA+I,CAAA,EAAQ,KACrB,IAAIuD,EAAO,IACPE,EAAO,IACPD,EAAO,KACPE,EAAO,KACPgE,EAAO,EACPC,EAAO,EACPC,EAAO,EACPC,EAAO,EACPC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EAEdjP,EAAQ7C,EAAM,CAAC2I,EAAKrI,EAAOiC,EAAOC,IAAU,CAC1C,CAACvC,CAAW,EAAI0I,EACV,MAAAlG,EAAaxC,EAAY,YAAY,EAErC8R,EADatP,IAAexC,EAE9BoC,GAAkBsG,EAAKrI,EAAOiC,EAAOC,CAAK,EACzCmG,EAAI,MAAM,CAAC,EAEVC,EAAgBnG,IAAe,IAChC,CAAC,IAAKF,EAAOwP,EAAgB,CAAC,CAAC,EAChCtP,IAAe,IACd,CAAC,IAAKsP,EAAgB,CAAC,EAAGvP,CAAK,EAChCuP,EAYJ,GAVA,CAAC9R,CAAW,EAAI2I,EAEX,KAAK,SAASnG,CAAU,IAEjBoP,EAAA,EACAC,EAAA,GAKR7R,IAAgB,IACjB,EAAEkD,EAAIC,CAAE,EAAIwF,EACNyI,EAAAlO,EACAmO,EAAAlO,EACAmO,EAAApO,EACAqO,EAAApO,UACEnD,IAAgB,IACzB,CAACoR,EAAMC,EAAMC,EAAMC,CAAI,EAAI9H,GACzBnH,EACAC,EACAoG,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACS3I,IAAgB,IACzB,CAACoR,EAAMC,EAAMC,EAAMC,CAAI,EAAIjF,GACzBhK,EACAC,EACAoG,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACS3I,IAAgB,IAAK,CACxB,MAAA+R,EAAOP,EAAU,EAAIE,EACrBM,EAAOP,EAAU,EAAIE,EAE3B,CAACP,EAAMC,EAAMC,EAAMC,CAAI,EAAIX,GACzBtO,EACAC,EACAwP,EACAC,EACArJ,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,CAAA,MACS3I,IAAgB,IACzB,CAACoR,EAAMC,EAAMC,EAAMC,CAAI,EAAIX,GACzBtO,EACAC,EACAoG,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,EACS3I,IAAgB,KACzB4R,EAAUJ,EAAU,EAAII,EACxBC,EAAUJ,EAAU,EAAII,EACxB,CAACT,EAAMC,EAAMC,EAAMC,CAAI,EAAIL,GACzB5O,EACAC,EACAqP,EACAC,EACAlJ,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACS3I,IAAgB,KACzB4R,EAAUjJ,EAAc,CAAC,EACzBkJ,EAAUlJ,EAAc,CAAC,EACzB,CAACyI,EAAMC,EAAMC,EAAMC,CAAI,EAAIL,GACzB5O,EACAC,EACAoG,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACS3I,IAAgB,MACxB,CAAAoR,EAAMC,EAAMC,EAAMC,CAAI,EAAI9H,GAAYnH,EAAOC,EAAOW,EAAIC,CAAE,GAEtD8J,EAAAvD,EAAI0H,EAAMnE,CAAI,EACdE,EAAAzD,EAAI2H,EAAMlE,CAAI,EACdD,EAAAvM,EAAI2Q,EAAMpE,CAAI,EACdE,EAAAzM,EAAI4Q,EAAMnE,CAAI,EAGpB,CAAAoE,EAASC,CAAO,EAAIzR,IAAgB,IACjC,CAACkD,EAAIC,CAAE,EACNwF,EAAc,MAAM,EAAE,EAC1B,CAAA+I,EAASC,CAAO,EAAI3R,IAAgB,IAChC,CAAC2I,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpC3I,IAAgB,IACf,CAAC2I,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpC,CAAC6I,EAASC,CAAO,CAAA,CACtB,EAED,MAAMQ,EAAQ/E,EAAOD,EACfiF,EAAS9E,EAAOD,EAEf,MAAA,CACL,MAAA8E,EACA,OAAAC,EACA,EAAGjF,EACH,EAAGE,EACH,GAAID,EACJ,GAAIE,EACJ,GAAIH,EAAOgF,EAAQ,EACnB,GAAI9E,EAAO+E,EAAS,EAEpB,GAAI,KAAK,IAAID,EAAOC,CAAM,EAAI,KAAK,IAAID,EAAOC,CAAM,EAAI,CAC1D,CACF,EChKMC,GAAkBhQ,GAAkC,CAClD,MAAApC,EAAOmC,EAAgBC,CAAS,EACtC,IAAIqP,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACVC,EAAU,EACV7R,EAAc,IACdkD,EAAK,EACLC,EAAK,EACLiP,EAAc,EAElB,OAAAxP,EAAQ7C,EAAM,CAAC2I,EAAKrI,EAAOiC,EAAOC,IAAU,CAC1C,CAACvC,CAAW,EAAI0I,EACV,MAAAlG,EAAaxC,EAAY,YAAY,EAErC8R,EADatP,IAAexC,EAE9BoC,GAAkBsG,EAAKrI,EAAOiC,EAAOC,CAAK,EACzCmG,EAAI,MAAM,CAAC,EAEVC,EAAgBnG,IAAe,IAChC,CAAC,IAAKF,EAAOwP,EAAgB,CAAC,CAAC,EAChCtP,IAAe,IACd,CAAC,IAAKsP,EAAgB,CAAC,EAAGvP,CAAK,EAChCuP,EAWJ,GAVA,CAAC9R,CAAW,EAAI2I,EAEX,KAAK,SAASnG,CAAU,IAEjBoP,EAAA,EACAC,EAAA,GAKR7R,IAAgB,IAEjB,EAAEkD,EAAIC,CAAE,EAAIwF,UACJ3I,IAAgB,IACVoS,GAAAhJ,GACb9G,EACAC,EACAoG,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACS3I,IAAgB,IACVoS,GAAAlG,GACb5J,EACAC,EACAoG,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,UACS3I,IAAgB,IAAK,CACxB,MAAA+R,EAAOP,EAAU,EAAIE,EACrBM,EAAOP,EAAU,EAAIE,EAEZS,GAAA5B,GACblO,EACAC,EACAwP,EACAC,EACArJ,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,CAAA,MACS3I,IAAgB,IACVoS,GAAA5B,GACblO,EACAC,EACAoG,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,EACS3I,IAAgB,KACzB4R,EAAUJ,EAAU,EAAII,EACxBC,EAAUJ,EAAU,EAAII,EACTO,GAAApB,GACb1O,EACAC,EACAqP,EACAC,EACAlJ,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACS3I,IAAgB,KACzB4R,EAAUjJ,EAAc,CAAC,EACzBkJ,EAAUlJ,EAAc,CAAC,EACVyJ,GAAApB,GACb1O,EACAC,EACAoG,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,EACfA,EAAc,CAAC,CACjB,GACS3I,IAAgB,MACzBoS,GAAehJ,GAAc9G,EAAOC,EAAOW,EAAIC,CAAE,GAIlD,CAAAqO,EAASC,CAAO,EAAIzR,IAAgB,IACjC,CAACkD,EAAIC,CAAE,EACNwF,EAAc,MAAM,EAAE,EAC1B,CAAA+I,EAASC,CAAO,EAAI3R,IAAgB,IAChC,CAAC2I,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpC3I,IAAgB,IACf,CAAC2I,EAAc,CAAC,EAAGA,EAAc,CAAC,CAAC,EACpC,CAAC6I,EAASC,CAAO,CAAA,CACtB,EAEMW,CACT,ECxIMC,GAAmB,KCcnBC,GAAiBnQ,GAAkC,CACjD,MAAApC,EAAOmC,EAAgBC,CAAS,EAChCyF,EAAS,CAAE,GAAGY,EAAa,EAEjC,OAAO5F,EAAqB7C,EAAM,CAAC2I,EAAK6J,EAAGjQ,EAAOC,IAAU,CAC1DqF,EAAO,EAAItF,EACXsF,EAAO,EAAIrF,EACL,MAAAqG,EAASV,GAAiBQ,EAAKd,CAAM,EAErClF,EAASkG,EAAO,OACtB,OAAAhB,EAAO,GAAK,CAACgB,EAAOlG,EAAS,CAAC,EAC9BkF,EAAO,GAAK,CAACgB,EAAOlG,EAAS,CAAC,EAC9BkF,EAAO,GAAK,CAACgB,EAAOlG,EAAS,CAAC,GAAKkF,EAAO,GAC1CA,EAAO,GAAK,CAACgB,EAAOlG,EAAS,CAAC,GAAKkF,EAAO,GAEnCgB,CAAA,CACR,CACH,ECfM4J,GAAmB,CAACrQ,EAA+BmH,IAAsB,CACvE,MAAAvJ,EAAOuS,GAAcnQ,CAAS,EACpC,IAAIsQ,EAAM,GACNvS,EAAO,CAAC,EACRF,EAAc,IACdgD,EAAI,EACJC,EAAI,EACJ,CAACC,EAAIC,CAAE,EAAIpD,EAAK,CAAC,EAAE,MAAM,CAAC,EACxB,MAAA2Q,EAAmB,OAAOpH,GAAa,SAC7C,IAAIC,EAAQ,CAAE,EAAGrG,EAAI,EAAGC,CAAG,EACvBqG,EAAS,EACTkJ,EAAQnJ,EACR6I,EAAc,EAElB,MAAI,CAAC1B,GAAoBpH,EAAW+I,GAAyB9I,GAG7D3G,EAAQ7C,EAAM,CAAC2I,EAAK6J,EAAGjQ,EAAOC,IAAU,CA8FtC,GA7FA,CAACvC,CAAW,EAAI0I,EAChB+J,EAAMzS,IAAgB,IACfE,EAACuS,EAAwDvS,EAAlD,CAACoC,EAAOC,CAAK,EAAE,OAAOmG,EAAI,MAAM,CAAC,CAAa,EAIxD+J,GAED,EAAEvP,EAAIC,CAAE,EAAIuF,EACba,EAAQ,CAAE,EAAGrG,EAAI,EAAGC,CAAG,EACdqG,EAAA,GACAxJ,IAAgB,KACjBuJ,EAAAF,GACNnJ,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNoJ,EAAW8I,CACb,EACA5I,EAASJ,GAAclJ,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,GAChDF,IAAgB,KACjBuJ,EAAA4C,GACNjM,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNoJ,EAAW8I,CACb,EACS5I,EAAA0C,GACPhM,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,CACR,GACSF,IAAgB,KACjBuJ,EAAAkH,GACNvQ,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNoJ,EAAW8I,CACb,EACS5I,EAAAgH,GACPtQ,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,CACR,GACSF,IAAgB,KACjBuJ,EAAA0H,GACN/Q,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNoJ,EAAW8I,CACb,EACS5I,EAAAwH,GACP9Q,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,EACNA,EAAK,CAAC,CACR,GACSF,IAAgB,MACzBE,EAAO,CAACoC,EAAOC,EAAOW,EAAIC,CAAE,EAC5BoG,EAAQ,CAAE,EAAGrG,EAAI,EAAGC,CAAG,EAEvBqG,EAASJ,GAAclJ,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,GAG3D,CAAC8C,EAAGC,CAAC,EAAI/C,EAAK,MAAM,EAAE,EAElBkS,EAAc9I,EACRoJ,EAAAnJ,MAKD,OAAA,GAGM6I,GAAA5I,CACf,CACD,EAIGF,EAAW8I,EAAcC,GACpB,CAAE,EAAArP,EAAG,EAAAC,CAAE,EAGTyP,EACT,EC9HMC,GAAiB,CACrBtQ,EACAsG,EACAf,EACAgL,IACiB,CACX,KAAA,CAAC5S,CAAW,EAAIqC,EAChB,CAAE,MAAOwQ,CAAA,EAAiBjT,EAC1BkJ,EACF+J,EAEEC,EAAenK,EAAc,MAAM,CAAC,EACpC,CAAE,GAAA/D,EAAI,GAAAC,EAAI,GAAAG,EAAI,GAAAC,EAAI,EAAAjC,EAAG,GAAM4E,EAC3B,CAACmL,EAAIC,CAAE,EAAIF,EAAa,MAAM,EAAE,EAChClK,EAASvG,EAQf,GANK,KAAK,SAASrC,CAAW,IAE5B4H,EAAO,GAAK,KACZA,EAAO,GAAK,MAGV5H,IAAgB,IAAK,CACvB,GAAI6I,EAAQ7F,EAAG8F,CAAK,IAAMD,EAAQkK,EAAIjK,CAAK,EAClC,MAAA,CAAC,IAAKkK,CAAE,EACjB,GAAWnK,EAAQ,EAAGC,CAAK,IAAMD,EAAQmK,EAAIlK,CAAK,EACzC,MAAA,CAAC,IAAKiK,CAAE,CACjB,SACS/S,IAAgB,IAAK,CACxB,KAAA,CAACiT,EAAKC,CAAG,EAAIJ,EAInB,GAHAlL,EAAO,GAAKqL,EACZrL,EAAO,GAAKsL,EAGV,KAAK,SAASN,CAAW,IACvB/J,EAAQoK,EAAKnK,CAAK,IAAMD,EAAQjE,EAAK,EAAII,EAAI8D,CAAK,GAClDD,EAAQqK,EAAKpK,CAAK,IAAMD,EAAQhE,EAAK,EAAII,EAAI6D,CAAK,GACjDD,EAAQjE,EAAIkE,CAAK,IAAMD,EAAQ7D,EAAK,EAAIhC,EAAG8F,CAAK,GAC/CD,EAAQhE,EAAIiE,CAAK,IAAMD,EAAQ5D,EAAK,EAAI,EAAG6D,CAAK,GAE7C,MAAA,CACL,IACAgK,EAAa,CAAC,EACdA,EAAa,CAAC,EACdA,EAAa,CAAC,EACdA,EAAa,CAAC,CAChB,CACF,SACS9S,IAAgB,IAAK,CACxB,KAAA,CAAC+G,EAAIC,CAAE,EAAI8L,EAKf,GAJFlL,EAAO,GAAKb,EACZa,EAAO,GAAKZ,EAGV,KAAK,SAAS4L,CAAW,GACzB/J,EAAQ9B,EAAI+B,CAAK,IAAMD,EAAQjE,EAAK,EAAII,EAAI8D,CAAK,GACjDD,EAAQ7B,EAAI8B,CAAK,IAAMD,EAAQhE,EAAK,EAAII,EAAI6D,CAAK,EAEjD,MAAO,CAAC,IAAKgK,EAAa,CAAC,EAAGA,EAAa,CAAC,CAAC,CAC/C,CAIK,OAAAlK,CACT,EClFMuK,GAAe,CACnB9Q,EACA4G,IACG,CACH,MAAMpB,EAAUxF,EAAQ,MAAM,CAAC,EAAe,IAAKgG,GACjDQ,EAAQR,EAAGY,CAAW,CACxB,EACA,MAAO,CAAC5G,EAAQ,CAAC,CAAyB,EAAE,OAAOwF,CAAM,CAC3D,ECOMuL,GAAe,CAACjR,EAAsB8G,IAAyB,CAC7D,MAAAlJ,EAAOuD,GAAenB,CAAS,EAE/B2G,EAAQ,OAAOG,GAAgB,UAAYA,GAAe,EAC5DA,EACqC,EAEnCoK,EAAc,CAAE,GAAG7K,EAAa,EAEhC8K,EAAkB,CAAC,EACzB,IAAItT,EAAc,IACd4S,EAAc,IAElB,OAAOhQ,EAAQ7C,EAAM,CAAC2I,EAAK3G,EAAGO,EAAOC,IAAU,CAC7C8Q,EAAY,EAAI/Q,EAChB+Q,EAAY,EAAI9Q,EACV,MAAAgR,EAAoBrL,GAAiBQ,EAAK2K,CAAW,EAC3D,IAAIzK,EAASF,EAKb,GAJA,CAAC1I,CAAW,EAAI0I,EAGhB4K,EAAgBvR,CAAC,EAAI/B,EACjB+B,EAAG,CAES6Q,EAAAU,EAAgBvR,EAAI,CAAC,EACnC,MAAMyR,EAAeb,GACnBjK,EACA6K,EACAF,EACAT,CACF,EACMa,EAAaN,GAAaK,EAAc1K,CAAK,EAC7C4K,EAAYD,EAAW,KAAK,EAAE,EAC9BE,EAAkBpQ,GAAkBiQ,EAAczR,EAAGO,EAAOC,CAAK,EACjEqR,EAAaT,GAAaQ,EAAiB7K,CAAK,EAChD+K,EAAYD,EAAW,KAAK,EAAE,EACpChL,EAAS8K,EAAU,OAASG,EAAU,OAASJ,EAAaG,CAAA,CAG9D,MAAMlR,EAAS6Q,EAAkB,OACjC,OAAAF,EAAY,GAAK,CAACE,EAAkB7Q,EAAS,CAAC,EAC9C2Q,EAAY,GAAK,CAACE,EAAkB7Q,EAAS,CAAC,EAC9C2Q,EAAY,GAAK,CAACE,EAAkB7Q,EAAS,CAAC,GAAK2Q,EAAY,GAC/DA,EAAY,GAAK,CAACE,EAAkB7Q,EAAS,CAAC,GAAK2Q,EAAY,GAExDzK,CAAA,CACR,CACH,ECzCMkL,GAAe3R,GAAyB,CACtC,MAAA4R,EAAezQ,GAAenB,CAAS,EACvC6R,EAAiB1B,GAAcyB,CAAY,EAC3CE,EAAOF,EAAa,OACpBG,EAAWH,EAAaE,EAAO,CAAC,EAAE,CAAC,IAAM,IAEzCE,EAAevR,EAAQmR,EAAc,CAAC1R,EAASN,IAAM,CACnD,MAAAwR,EAAoBS,EAAejS,CAAC,EACpCqS,EAAUrS,GAAKgS,EAAahS,EAAI,CAAC,EACjC6Q,EAAcwB,GAAWA,EAAQ,CAAC,EAClCC,EAAUN,EAAahS,EAAI,CAAC,EAC5BuS,EAAcD,GAAWA,EAAQ,CAAC,EAClC,CAACrU,CAAW,EAAIqC,EAChB,CAACW,EAAGC,CAAC,EAAI+Q,EAAejS,EAAIA,EAAI,EAAIkS,EAAO,CAAC,EAAE,MAAM,EAAE,EAC5D,IAAIrL,EAASvG,EAEb,OAAQrC,EAAa,CACnB,IAAK,IACH4I,EAAUsL,EAAW,CAAC,GAAG,EAAI,CAAClU,EAAagD,EAAGC,CAAC,EAC/C,MACF,IAAK,IACM2F,EAAA,CACP5I,EACAqC,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,IAAM,EAAI,EAAI,EACvBW,EACAC,CACF,EACA,MACF,IAAK,IACCoR,GAAWC,IAAgB,IACpB1L,EAAA,CAAC,IAAKvG,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAGW,EAAGC,CAAC,EAElC2F,EAAA,CACP5I,EACAqC,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTA,EAAQ,CAAC,EACTW,EACAC,CACF,EAEF,MACF,IAAK,IAED2P,GAAe,KAAK,SAASA,CAAW,IACvC,CAACyB,GAAWC,IAAgB,KAEpB1L,EAAA,CACP,IACA2K,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBvQ,EACAC,CACF,EAES2F,EAAA,CACP5I,EACAuT,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBvQ,EACAC,CACF,EAEF,MACF,IAAK,IACCoR,GAAWC,IAAgB,IACpB1L,EAAA,CAAC,IAAK5F,EAAGC,CAAC,EAEV2F,EAAA,CAAC5I,EAAaqC,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAGW,EAAGC,CAAC,EAErD,MACF,IAAK,IAED2P,GAAe,KAAK,SAASA,CAAW,IACvC,CAACyB,GAAWC,IAAgB,KAEpB1L,EAAA,CACP,IACA2K,EAAkB,CAAC,EACnBA,EAAkB,CAAC,EACnBvQ,EACAC,CACF,EAES2F,EAAA,CAAC5I,EAAagD,EAAGC,CAAC,EAE7B,MACF,IAAK,IACM2F,EAAA,CAAC,IAAK5F,EAAGC,CAAC,EACnB,MACF,IAAK,IACM2F,EAAA,CAAC5I,EAAagD,CAAC,EACxB,MACF,IAAK,IACM4F,EAAA,CAAC5I,EAAaiD,CAAC,EACxB,MACF,QACW2F,EAAA,CAAC5I,CAA0C,EAAE,OACpDqC,EAAQ,MAAM,EAAG,EAAE,EACnBW,EACAC,CACF,CAAA,CAGG,OAAA2F,CAAA,CACR,EAED,OACEsL,EACIC,EAAa,QAAQ,EACrB,CAACA,EAAa,CAAC,CAAgB,EAAE,OAAOA,EAAa,MAAM,CAAC,EAAE,SAAS,CAE/E,EC3HMI,GAAapS,GAAsC,CACvD,MAAMqS,EAAY,CAAC,EACf,IAAAzU,EACA0U,EAAK,GACLzR,EAAI,EACJC,EAAI,EACJC,EAAK,EACLC,EAAK,EACH,MAAAyE,EAAS,CAAE,GAAGY,EAAa,EAEvB,OAAArG,EAAA,QAASuG,GAAQ,CACnB,KAAA,CAAC1I,CAAW,EAAI0I,EAChBlG,EAAaxC,EAAY,YAAY,EACrCwD,EAAaxD,EAAY,YAAY,EACrC+C,EAAa/C,IAAgBwD,EAC7BqE,EAASa,EAAI,MAAM,CAAC,EAEtBlG,IAAe,KACXiS,GAAA,EACL,CAAAzR,EAAGC,CAAC,EAAI4E,EACJ7E,GAAAD,EAAa6E,EAAO,EAAI,EACxB3E,GAAAF,EAAa6E,EAAO,EAAI,EACxB1E,EAAAF,EACAG,EAAAF,EACLlD,EAAO,CAAEgD,EAAa,CAACP,EAAYU,EAAIC,CAAE,EAAIuF,CAAgB,IAEzDlG,IAAe,KACbQ,EAAAE,EACAD,EAAAE,GACKX,IAAe,KACvB,CAAE,CAAAQ,CAAC,EAAI0F,EACR1F,GAAKD,EAAa6E,EAAO,EAAyC,GACzDpF,IAAe,KACvB,CAAE,CAAAS,CAAC,EAAIyF,EACRzF,GAAKF,EAAa6E,EAAO,EAAyC,IAElE,CAAC5E,EAAGC,CAAC,EAAIyF,EAAI,MAAM,EAAE,EAChB1F,GAAAD,EAAa6E,EAAO,EAAI,EACxB3E,GAAAF,EAAa6E,EAAO,EAAI,GAE/B7H,EAAK,KAAK2I,CAAG,GAGfd,EAAO,EAAI5E,EACX4E,EAAO,EAAI3E,EACXuR,EAAUC,CAAE,EAAI1U,CAAA,CACjB,EAEMyU,CACT,ECrEA,IAAIE,GAAI,OAAO,eACXC,GAAI,CAACC,EAAGvO,EAAGwO,IAAMxO,KAAKuO,EAAIF,GAAEE,EAAGvO,EAAG,CAAE,WAAY,GAAI,aAAc,GAAI,SAAU,GAAI,MAAOwO,CAAC,CAAE,EAAID,EAAEvO,CAAC,EAAIwO,EACzGhK,EAAI,CAAC+J,EAAGvO,EAAGwO,IAAMF,GAAEC,EAAG,OAAOvO,GAAK,SAAWA,EAAI,GAAKA,EAAGwO,CAAC,EAC9D,MAAMC,GAAI,CACR,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,GACN,WAAY,EACd,EAAGtF,GAAKoF,IAAOA,aAAa,cAAgBA,aAAa,cAAgB,MAAM,QAAQA,CAAC,GAAKA,EAAE,MAAOvO,GAAM,OAAOA,GAAK,QAAQ,IAAM,CAAC,EAAG,EAAE,EAAE,KAAMA,GAAMuO,EAAE,SAAWvO,CAAC,EAAG0O,GAAKH,GAAMA,aAAa,WAAaA,aAAa3R,GAAK,OAAO2R,GAAK,UAAY,OAAO,KAAKE,EAAC,EAAE,MAAOzO,GAAMuO,GAAKvO,KAAKuO,CAAC,EAAGI,GAAKJ,GAAM,CAC7S,MAAMvO,EAAI,IAAIpD,EAAK4R,EAAI,MAAM,KAAKD,CAAC,EACnC,GAAI,CAACpF,GAAEqF,CAAC,EACN,MAAM,UACJ,eAAeA,EAAE,KAAK,GAAG,CAAC,uCAC3B,EAEH,GAAIA,EAAE,SAAW,GAAI,CACnB,KAAM,CACJxM,EACAtG,EACAkT,EACA7N,EACAwH,EACAsG,EACAzP,EACA0I,EACAgH,EACA,EACAC,EACAC,EACAnH,EACA,EACAoH,EACAjO,CACN,EAAQwN,EACJxO,EAAE,IAAMgC,EAAGhC,EAAE,EAAIgC,EAAGhC,EAAE,IAAMuI,EAAGvI,EAAE,EAAIuI,EAAGvI,EAAE,IAAM8O,EAAG9O,EAAE,IAAM6H,EAAG7H,EAAE,EAAI6H,EAAG7H,EAAE,IAAMtE,EAAGsE,EAAE,EAAItE,EAAGsE,EAAE,IAAM6O,EAAG7O,EAAE,EAAI6O,EAAG7O,EAAE,IAAM,EAAGA,EAAE,IAAM,EAAGA,EAAE,EAAI,EAAGA,EAAE,IAAM4O,EAAG5O,EAAE,IAAMZ,EAAGY,EAAE,IAAM+O,EAAG/O,EAAE,IAAMiP,EAAGjP,EAAE,IAAMe,EAAGf,EAAE,IAAM8H,EAAG9H,EAAE,IAAMgP,EAAGhP,EAAE,IAAMgB,CACvO,SAAawN,EAAE,SAAW,EAAG,CACzB,KAAM,CAACxM,EAAGtG,EAAGkT,EAAG7N,EAAGwH,EAAGsG,CAAC,EAAIL,EAC3BxO,EAAE,IAAMgC,EAAGhC,EAAE,EAAIgC,EAAGhC,EAAE,IAAMtE,EAAGsE,EAAE,EAAItE,EAAGsE,EAAE,IAAM4O,EAAG5O,EAAE,EAAI4O,EAAG5O,EAAE,IAAMe,EAAGf,EAAE,EAAIe,EAAGf,EAAE,IAAMuI,EAAGvI,EAAE,EAAIuI,EAAGvI,EAAE,IAAM6O,EAAG7O,EAAE,EAAI6O,CACzH,CACE,OAAO7O,CACT,EAAGtC,GAAK6Q,GAAM,CACZ,GAAIG,GAAEH,CAAC,EACL,OAAOI,GAAE,CACPJ,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,GACR,CAAK,EACH,MAAM,UACJ,eAAe,KAAK,UAAUA,CAAC,CAAC,4DACjC,CACH,EAAGW,GAAKX,GAAM,CACZ,GAAI,OAAOA,GAAK,SACd,MAAM,UAAU,eAAe,KAAK,UAAUA,CAAC,CAAC,oBAAoB,EACtE,MAAMvO,EAAI,OAAOuO,CAAC,EAAE,QAAQ,MAAO,EAAE,EACrC,IAAIC,EAAI,IAAI5R,EACZ,MAAMoF,EAAI,wCAAwCuM,CAAC,IACnD,OAAOvO,EAAE,MAAM,GAAG,EAAE,OAAQtE,GAAMA,CAAC,EAAE,QAASA,GAAM,CAClD,KAAM,CAACkT,EAAG7N,CAAC,EAAIrF,EAAE,MAAM,GAAG,EAC1B,GAAI,CAACqF,EAAG,MAAM,UAAUiB,CAAC,EACzB,MAAMuG,EAAIxH,EAAE,MAAM,GAAG,EAAE,IACpBiO,GAAMA,EAAE,SAAS,KAAK,EAAI,WAAWA,CAAC,GAAK,IAAM,KAAK,IAAM,WAAWA,CAAC,CAC/E,EAAO,CAACH,EAAGzP,EAAG0I,EAAGgH,CAAC,EAAIvG,EAAG,EAAI,CAACsG,EAAGzP,EAAG0I,CAAC,EAAGiH,EAAI,CAACF,EAAGzP,EAAG0I,EAAGgH,CAAC,EACnD,GAAIF,IAAM,eAAiBC,GAAK,CAACzP,EAAG0I,CAAC,EAAE,MAAOkH,GAAMA,IAAM,MAAM,EAC9DR,EAAE,IAAM,GAAKK,UACND,EAAE,SAAS,QAAQ,GAAK,CAAC,EAAG,EAAE,EAAE,SAASrG,EAAE,MAAM,GAAKA,EAAE,MAAOyG,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,EAAG,CAChG,MAAMA,EAAIzG,EAAE,IAAKV,GAAM,KAAK,IAAIA,CAAC,EAAI,KAAO,EAAIA,CAAC,EACjD2G,EAAIA,EAAE,SAASG,GAAEK,CAAC,CAAC,CACpB,SAAUJ,IAAM,eAAiB,EAAE,MAAOI,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,EAChER,EAAIA,EAAE,UAAUK,EAAGzP,EAAG0I,CAAC,UAChB8G,IAAM,aAAeC,GAAK/G,IAAM,OACvC0G,EAAIA,EAAE,UAAUK,EAAGzP,GAAK,EAAG,CAAC,UACrBwP,IAAM,YAAcG,EAAE,MAAOC,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,GAAKF,EAChEN,EAAIA,EAAE,gBAAgBK,EAAGzP,EAAG0I,EAAGgH,CAAC,UACzBF,IAAM,UAAYC,GAAK,CAACzP,EAAG0I,CAAC,EAAE,MAAOkH,GAAMA,IAAM,MAAM,EAC9DR,EAAIA,EAAE,OAAO,EAAG,EAAGK,CAAC,UACbD,IAAM,WAAa,EAAE,MAAOI,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,GAAK,EAAE,KAAMA,GAAMA,IAAM,CAAC,EACpFR,EAAIA,EAAE,MAAMK,EAAGzP,EAAG0I,CAAC,UAInB8G,IAAM,SAAW,CAAC,OAAO,MAAMC,CAAC,IAAMA,IAAM,GAAKzP,IAAM,IAAM0I,IAAM,OACnE,CACA,MAAMD,EAAI,OAAO,MAAM,CAACzI,CAAC,EAAIyP,EAAIzP,EACjCoP,EAAIA,EAAE,MAAMK,EAAGhH,EAAG,CAAC,CACpB,SAAU+G,IAAM,SAAWC,GAAK,CAAC,OAAO,MAAMA,CAAC,GAAKzP,IAAM0I,IAAM,OAC/D0G,EAAIA,EAAE,KAAKK,EAAGzP,GAAK,CAAC,UACb,CAAC,YAAa,SAAU,QAAS,MAAM,EAAE,KAC/C4P,GAAMJ,EAAE,SAASI,CAAC,CACpB,GAAI,QAAQ,KAAKJ,CAAC,GAAKC,GAAK,CAACzP,EAAG0I,CAAC,EAAE,MAAOkH,GAAMA,IAAM,MAAM,EAC3D,GAAIJ,IAAM,SAAWA,IAAM,QACzBJ,EAAIA,EAAEI,CAAC,EAAEC,CAAC,MACP,CACH,MAAMG,EAAIJ,EAAE,QAAQ,QAAS,EAAE,EAAG/G,EAAI+G,EAAE,QAAQI,EAAG,EAAE,EAAG,EAAI,CAAC,IAAK,IAAK,GAAG,EAAE,QAAQnH,CAAC,EAAGoH,EAAID,IAAM,QAAU,EAAI,EAAGhO,EAAI,CACrH,IAAM,EAAI6N,EAAII,EACd,IAAM,EAAIJ,EAAII,EACd,IAAM,EAAIJ,EAAII,CACf,EACDT,EAAIA,EAAEQ,CAAC,EAAE,GAAGhO,CAAC,CACrB,KAEM,OAAM,UAAUgB,CAAC,CACpB,CAAA,EAAGwM,CACN,EAAG7R,GAAI,CAAC4R,EAAGvO,IAAMA,EAAI,CAACuO,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAAI,CACpDA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,IACFA,EAAE,GACJ,EAAG5Q,GAAI,CAAC4Q,EAAGvO,EAAGwO,IAAM,CAClB,MAAMxM,EAAI,IAAIpF,EACd,OAAOoF,EAAE,IAAMuM,EAAGvM,EAAE,EAAIuM,EAAGvM,EAAE,IAAMhC,EAAGgC,EAAE,EAAIhC,EAAGgC,EAAE,IAAMwM,EAAGxM,CAC5D,EAAGmN,GAAI,CAACZ,EAAGvO,EAAGwO,IAAM,CAClB,MAAMxM,EAAI,IAAIpF,EAAKlB,EAAI,KAAK,GAAK,IAAKkT,EAAIL,EAAI7S,EAAGqF,EAAIf,EAAItE,EAAG6M,EAAIiG,EAAI9S,EAAGmT,EAAI,KAAK,IAAID,CAAC,EAAGxP,EAAI,CAAC,KAAK,IAAIwP,CAAC,EAAG9G,EAAI,KAAK,IAAI/G,CAAC,EAAG+N,EAAI,CAAC,KAAK,IAAI/N,CAAC,EAAG,EAAI,KAAK,IAAIwH,CAAC,EAAGwG,EAAI,CAAC,KAAK,IAAIxG,CAAC,EAAGyG,EAAIlH,EAAI,EAAGD,EAAI,CAACC,EAAIiH,EACpM/M,EAAE,IAAMgN,EAAGhN,EAAE,EAAIgN,EAAGhN,EAAE,IAAM6F,EAAG7F,EAAE,EAAI6F,EAAG7F,EAAE,IAAM8M,EAChD,MAAM,EAAI1P,EAAI0P,EAAI,EAAID,EAAIE,EAC1B/M,EAAE,IAAM,EAAGA,EAAE,EAAI,EACjB,MAAMiN,EAAIJ,EAAI,EAAIzP,EAAI0P,EAAIC,EAC1B,OAAO/M,EAAE,IAAMiN,EAAGjN,EAAE,EAAIiN,EAAGjN,EAAE,IAAM,CAAC5C,EAAI0I,EAAG9F,EAAE,IAAM5C,EAAI2P,EAAIF,EAAIC,EAAI,EAAG9M,EAAE,IAAM5C,EAAI,EAAIyP,EAAIC,EAAIC,EAAG/M,EAAE,IAAM6M,EAAI/G,EAAG9F,CAClH,EAAGwH,GAAI,CAAC+E,EAAGvO,EAAGwO,EAAGxM,IAAM,CACrB,MAAMtG,EAAI,IAAIkB,EAAKgS,EAAI,KAAK,KAAKL,EAAIA,EAAIvO,EAAIA,EAAIwO,EAAIA,CAAC,EACtD,GAAII,IAAM,EACR,OAAOlT,EACT,MAAMqF,EAAIwN,EAAIK,EAAGrG,EAAIvI,EAAI4O,EAAGC,EAAIL,EAAII,EAAGxP,EAAI4C,GAAK,KAAK,GAAK,KAAM8F,EAAI,KAAK,IAAI1I,CAAC,EAAG0P,EAAI,KAAK,IAAI1P,CAAC,EAAG,EAAI0I,EAAIA,EAAGiH,EAAIhO,EAAIA,EAAGiO,EAAIzG,EAAIA,EAAGV,EAAIgH,EAAIA,EAAG,EAAI,EAAI,GAAKG,EAAInH,GAAK,EACpKnM,EAAE,IAAM,EAAGA,EAAE,EAAI,EACjB,MAAMuT,EAAI,GAAKlO,EAAIwH,EAAI,EAAIsG,EAAI/G,EAAIgH,GACnCpT,EAAE,IAAMuT,EAAGvT,EAAE,EAAIuT,EAAGvT,EAAE,IAAM,GAAKqF,EAAI8N,EAAI,EAAItG,EAAIT,EAAIgH,GACrD,MAAM9N,EAAI,GAAKuH,EAAIxH,EAAI,EAAI8N,EAAI/G,EAAIgH,GACnCpT,EAAE,IAAMsF,EAAGtF,EAAE,EAAIsF,EACjB,MAAMzB,EAAI,EAAI,GAAKsI,EAAIkH,GAAK,EAC5B,OAAOrT,EAAE,IAAM6D,EAAG7D,EAAE,EAAI6D,EAAG7D,EAAE,IAAM,GAAK6M,EAAIsG,EAAI,EAAI9N,EAAI+G,EAAIgH,GAAIpT,EAAE,IAAM,GAAKmT,EAAI9N,EAAI,EAAIwH,EAAIT,EAAIgH,GAAIpT,EAAE,IAAM,GAAKmT,EAAItG,EAAI,EAAIxH,EAAI+G,EAAIgH,GAAIpT,EAAE,IAAM,EAAI,GAAKqT,EAAIC,GAAK,EAAGtT,CACzK,EAAG0T,GAAI,CAACb,EAAGvO,EAAGwO,IAAM,CAClB,MAAMxM,EAAI,IAAIpF,EACd,OAAOoF,EAAE,IAAMuM,EAAGvM,EAAE,EAAIuM,EAAGvM,EAAE,IAAMhC,EAAGgC,EAAE,EAAIhC,EAAGgC,EAAE,IAAMwM,EAAGxM,CAC5D,EAAGqN,GAAI,CAACd,EAAGvO,IAAM,CACf,MAAMwO,EAAI,IAAI5R,EACd,GAAI2R,EAAG,CACL,MAAMvM,EAAIuM,EAAI,KAAK,GAAK,IAAK7S,EAAI,KAAK,IAAIsG,CAAC,EAC3CwM,EAAE,IAAM9S,EAAG8S,EAAE,EAAI9S,CACrB,CACE,GAAIsE,EAAG,CACL,MAAMgC,EAAIhC,EAAI,KAAK,GAAK,IAAKtE,EAAI,KAAK,IAAIsG,CAAC,EAC3CwM,EAAE,IAAM9S,EAAG8S,EAAE,EAAI9S,CACrB,CACE,OAAO8S,CACT,EAAG7E,GAAK4E,GAAMc,GAAEd,EAAG,CAAC,EAAGe,GAAKf,GAAMc,GAAE,EAAGd,CAAC,EAAGgB,EAAI,CAAChB,EAAGvO,IAAM,CACvD,MAAMwO,EAAIxO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAKvM,EAAIhC,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAK7S,EAAIsE,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAKK,EAAI5O,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAKxN,EAAIf,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAKhG,EAAIvI,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAKM,EAAI7O,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAKnP,EAAIY,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAKzG,EAAI9H,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAKO,EAAI9O,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAK,EAAIvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAKQ,EAAI/O,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAKS,EAAIhP,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAK1G,EAAI7H,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAK,EAAIvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAKU,EAAIjP,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IAAMvO,EAAE,IAAMuO,EAAE,IACjjC,OAAOI,GAAE,CACPH,EACAxM,EACAtG,EACAkT,EACA7N,EACAwH,EACAsG,EACAzP,EACA0I,EACAgH,EACA,EACAC,EACAC,EACAnH,EACA,EACAoH,CACJ,CAAG,CACH,EACA,MAAMrS,CAAE,CAQN,YAAYoD,EAAG,CACb,OAAO,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,EAAI,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAG,KAAK,IAAM,EAAGA,EAAI,KAAK,eAAeA,CAAC,EAAI,IAChV,CAQE,IAAI,YAAa,CACf,OAAO,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,CACtS,CAOE,IAAI,MAAO,CACT,OAAO,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,GAAK,KAAK,MAAQ,CAClH,CAeE,eAAeA,EAAG,CAChB,OAAO,OAAOA,GAAK,UAAYA,EAAE,QAAUA,IAAM,OAASkP,GAAElP,CAAC,EAAI,MAAM,QAAQA,CAAC,GAAKA,aAAa,cAAgBA,aAAa,aAAe2O,GAAE3O,CAAC,EAAI,OAAOA,GAAK,SAAWtC,GAAEsC,CAAC,EAAI,IACvL,CASE,eAAeA,EAAG,CAChB,OAAO,aAAa,KAAKrD,GAAE,KAAMqD,CAAC,CAAC,CACvC,CASE,eAAeA,EAAG,CAChB,OAAO,aAAa,KAAKrD,GAAE,KAAMqD,CAAC,CAAC,CACvC,CAUE,UAAW,CACT,KAAM,CAAE,KAAMA,CAAG,EAAG,KAAMwO,EAAI,KAAK,eAAexO,CAAC,EAAE,KAAK,IAAI,EAC9D,MAAO,GAAGA,EAAI,SAAW,UAAU,IAAIwO,CAAC,GAC5C,CAWE,QAAS,CACP,KAAM,CAAE,KAAMxO,EAAG,WAAYwO,CAAG,EAAG,KACnC,MAAO,CAAE,GAAG,KAAM,KAAMxO,EAAG,WAAYwO,CAAG,CAC9C,CASE,SAASxO,EAAG,CACV,OAAOuP,EAAE,KAAMvP,CAAC,CACpB,CAYE,UAAUA,EAAGwO,EAAGxM,EAAG,CACjB,MAAMtG,EAAIsE,EACV,IAAI4O,EAAIJ,EAAGzN,EAAIiB,EACf,OAAO,OAAO4M,EAAI,MAAQA,EAAI,GAAI,OAAO7N,EAAI,MAAQA,EAAI,GAAIwO,EAAE,KAAM5R,GAAEjC,EAAGkT,EAAG7N,CAAC,CAAC,CACnF,CAYE,MAAMf,EAAGwO,EAAGxM,EAAG,CACb,MAAMtG,EAAIsE,EACV,IAAI4O,EAAIJ,EAAGzN,EAAIiB,EACf,OAAO,OAAO4M,EAAI,MAAQA,EAAI5O,GAAI,OAAOe,EAAI,MAAQA,EAAI,GAAIwO,EAAE,KAAMH,GAAE1T,EAAGkT,EAAG7N,CAAC,CAAC,CACnF,CAaE,OAAOf,EAAGwO,EAAGxM,EAAG,CACd,IAAItG,EAAIsE,EAAG4O,EAAIJ,GAAK,EAAGzN,EAAIiB,GAAK,EAChC,OAAO,OAAOhC,GAAK,UAAY,OAAOwO,EAAI,KAAO,OAAOxM,EAAI,MAAQjB,EAAIrF,EAAGA,EAAI,EAAGkT,EAAI,GAAIW,EAAE,KAAMJ,GAAEzT,EAAGkT,EAAG7N,CAAC,CAAC,CAChH,CAaE,gBAAgBf,EAAGwO,EAAGxM,EAAGtG,EAAG,CAC1B,GAAI,CAACsE,EAAGwO,EAAGxM,EAAGtG,CAAC,EAAE,KAAMkT,GAAM,OAAO,MAAM,CAACA,CAAC,CAAC,EAC3C,MAAM,IAAI,UAAU,+BAA+B,EACrD,OAAOW,EAAE,KAAM/F,GAAExJ,EAAGwO,EAAGxM,EAAGtG,CAAC,CAAC,CAChC,CAQE,MAAMsE,EAAG,CACP,OAAOuP,EAAE,KAAM5F,GAAE3J,CAAC,CAAC,CACvB,CAQE,MAAMA,EAAG,CACP,OAAOuP,EAAE,KAAMD,GAAEtP,CAAC,CAAC,CACvB,CASE,KAAKA,EAAGwO,EAAG,CACT,OAAOe,EAAE,KAAMF,GAAErP,EAAGwO,CAAC,CAAC,CAC1B,CAYE,eAAexO,EAAG,CAChB,MAAMwO,EAAI,KAAK,IAAMxO,EAAE,EAAI,KAAK,IAAMA,EAAE,EAAI,KAAK,IAAMA,EAAE,EAAI,KAAK,IAAMA,EAAE,EAAGgC,EAAI,KAAK,IAAMhC,EAAE,EAAI,KAAK,IAAMA,EAAE,EAAI,KAAK,IAAMA,EAAE,EAAI,KAAK,IAAMA,EAAE,EAAGtE,EAAI,KAAK,IAAMsE,EAAE,EAAI,KAAK,IAAMA,EAAE,EAAI,KAAK,IAAMA,EAAE,EAAI,KAAK,IAAMA,EAAE,EAAG4O,EAAI,KAAK,IAAM5O,EAAE,EAAI,KAAK,IAAMA,EAAE,EAAI,KAAK,IAAMA,EAAE,EAAI,KAAK,IAAMA,EAAE,EAC/R,OAAOA,aAAa,SAAW,IAAI,SAASwO,EAAGxM,EAAGtG,EAAGkT,CAAC,EAAI,CACxD,EAAGJ,EACH,EAAGxM,EACH,EAAGtG,EACH,EAAGkT,CACJ,CACL,CACA,CACApK,EAAE5H,EAAG,YAAae,EAAC,EAAG6G,EAAE5H,EAAG,SAAUuS,EAAC,EAAG3K,EAAE5H,EAAG,kBAAmB4M,EAAC,EAAGhF,EAAE5H,EAAG,QAASwS,EAAC,EAAG5K,EAAE5H,EAAG,QAAS+M,EAAC,EAAGnF,EAAE5H,EAAG,QAAS0S,EAAC,EAAG9K,EAAE5H,EAAG,OAAQyS,EAAC,EAAG7K,EAAE5H,EAAG,WAAY2S,CAAC,EAAG/K,EAAE5H,EAAG,YAAa+R,EAAC,EAAGnK,EAAE5H,EAAG,aAAcc,EAAC,EAAG8G,EAAE5H,EAAG,aAAcsS,EAAC,EAAG1K,EAAE5H,EAAG,UAAWD,EAAC,EAAG6H,EAAE5H,EAAG,oBAAqBuM,EAAC,EAAG3E,EAAE5H,EAAG,qBAAsB8R,EAAC,ECra7S,MAAAc,GAAgBC,GAAgD,CAChE,IAAAC,EAAS,IAAIC,EACX,KAAA,CAAE,OAAAC,GAAWH,EACb,CAACI,EAASC,CAAO,EAAIF,EACrB,CAAE,UAAAG,GAAcN,EAChB,CAAE,OAAAO,GAAWP,EACb,CAAE,KAAAQ,GAASR,EACX,CAAE,MAAAS,GAAUT,EAIhB,OAAA,MAAM,QAAQM,CAAS,GACvBA,EAAU,QAAU,GACpBA,EAAU,MAAOpT,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,GACxCoT,EAAU,KAAMpT,GAAMA,IAAM,CAAC,EAEpB+S,EAAAA,EAAO,UAAU,GAAIK,CAAuC,EAC5D,OAAOA,GAAc,UAAY,CAAC,OAAO,MAAMA,CAAS,IACxDL,EAAAA,EAAO,UAAUK,CAAS,IAGjCC,GAAUC,GAAQC,KAEXR,EAAAA,EAAO,UAAUG,EAASC,CAAO,EAIxC,MAAM,QAAQE,CAAM,GACpBA,EAAO,QAAU,GACjBA,EAAO,MAAOrT,GAAM,CAAC,OAAO,MAAM,CAACA,CAAC,CAAC,GACrCqT,EAAO,KAAMrT,GAAMA,IAAM,CAAC,EAEjB+S,EAAAA,EAAO,OAAO,GAAIM,CAAoC,EACtD,OAAOA,GAAW,UAAY,CAAC,OAAO,MAAMA,CAAM,IAClDN,EAAAA,EAAO,OAAOM,CAAM,GAK7B,MAAM,QAAQC,CAAI,GAAKA,EAAK,SAAW,GAAKA,EAAK,MAAOtT,GACtD,CAAC,OAAO,MAAM,CAACA,CAAC,CAAA,GACbsT,EAAK,KAAMtT,GAAMA,IAAM,CAAC,GAEpB+S,EAAAO,EAAK,CAAC,EAAIP,EAAO,MAAMO,EAAK,CAAC,CAAC,EAAIP,EAClCA,EAAAO,EAAK,CAAC,EAAIP,EAAO,MAAMO,EAAK,CAAC,CAAC,EAAIP,GAClC,OAAOO,GAAS,UAAY,CAAC,OAAO,MAAMA,CAAI,IAC9CP,EAAAA,EAAO,MAAMO,CAAI,GAK1B,MAAM,QAAQC,CAAK,GAAKA,EAAM,QAAU,GAAKA,EAAM,MAAOvT,GACxD,CAAC,OAAO,MAAM,CAACA,CAAC,CAAA,GACbuT,EAAM,KAAMvT,GAAMA,IAAM,CAAC,EAErB+S,EAAAA,EAAO,MAAM,GAAIQ,CAAmC,EACpD,OAAOA,GAAU,UAAY,CAAC,OAAO,MAAMA,CAAK,IAChDR,EAAAA,EAAO,MAAMQ,CAAK,GAG7BR,EAASA,EAAO,UAAU,CAACG,EAAS,CAACC,CAAO,GAGvCJ,CACT,EC9DMS,GAAiB,CACrBC,EACAf,IACqC,CACjC,IAAAR,EAAIc,EAAU,UAAUN,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAGA,EAAE,CAAC,CAAC,EAE5C,UAAOR,EAAE,GAAG,EAAIQ,EACZR,EAAAuB,EAAK,SAASvB,CAAC,EAEZ,CAACA,EAAE,IAAKA,EAAE,IAAKA,EAAE,IAAKA,EAAE,GAAG,CACpC,EAgBMwB,GAAe,CACnBxB,EACAyB,EACAV,IACe,CACf,KAAM,CAACC,EAASC,EAASS,CAAO,EAAIX,EAC9B,CAACjT,EAAGC,EAAG0R,CAAC,EAAI6B,GAAetB,EAAG,CAACyB,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAG,EAAG,CAAC,CAAC,EAE5DE,EAAoB7T,EAAIkT,EACxBY,EAAoB7T,EAAIkT,EACxBY,EAAoBpC,EAAIiC,EAEvB,MAAA,CAELC,GAAqB,KAAK,IAAID,CAAO,EAAI,KAAK,IAAIG,CAAiB,GAAK,GACxEb,EACAY,GAAqB,KAAK,IAAIF,CAAO,EAAI,KAAK,IAAIG,CAAiB,GAAK,GACxEZ,CACF,CACF,EChCMa,GAAgB,CACpB7U,EACA2T,IACG,CAEH,IAAI9S,EAAI,EACJC,EAAI,EAEJgU,EAAK,EACLC,EAAK,EAELvU,EAAI,EACJwU,EAAK,EACLnX,EAAc,IAEZ,MAAAD,EAAOmC,EAAgBC,CAAS,EAChCiV,EAAiBtB,GAAa,OAAO,KAAKA,CAAS,EAGzD,GAAI,CAACA,GAAcsB,GAAkB,CAACA,EAAe,OAC5C,OAAArX,EAAK,MAAM,CAAC,EAIhB+V,EAAU,QACb,OAAO,OAAOA,EAAW,CAAE,OAAQlW,EAAe,OAAQ,EAE5D,MAAMqW,EAASH,EAAU,OACnBuB,EAAiBxB,GAAaC,CAAkC,EAEtE,OAAIuB,EAAe,WAAmBtX,EAAK,MAAM,CAAC,EAE3C6C,EAAuB7C,EAAM,CAAC2I,EAAKrI,EAAOiC,EAAOC,IAAU,CAChE,CAACvC,CAAW,EAAI0I,EACV,MAAAlG,EAAaxC,EAAY,YAAY,EAErC8R,EADatP,IAAexC,EAE9BoC,GAAkBsG,EAAKrI,EAAOiC,EAAOC,CAAK,EACzCmG,EAAI,MAAM,CAAC,EAEhB,IAAIE,EAASpG,IAAe,IAEvB,CAAC,GAAsB,EAAE,OAC1ByB,GACE3B,EACAC,EACAuP,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,EACjBA,EAAgB,CAAC,CAAA,CACnB,EAEAtP,IAAe,IACd,CAAC,IAAKF,EAAOwP,EAAgB,CAAC,CAAC,EAChCtP,IAAe,IACd,CAAC,IAAKsP,EAAgB,CAAC,EAAGvP,CAAK,EAChCuP,EAGJ9R,EAAc4I,EAAO,CAAC,EACtB,MAAM0O,EAAYtX,IAAgB,KAAO4I,EAAO,OAAS,EACnD2O,EACHD,EAAY1O,EAAO,MAAM,EAAG,CAAC,EAAIA,EAAO,MAAM,CAAC,EAalD,GAXI0O,IACGvX,EAAA,OACHM,EAAQ,EACR,EACA,CAAC,GAAkC,EAAE,OACnCuI,EAAO,MAAM,CAAC,CAAA,CAElB,EACSA,EAAA2O,GAGPvX,IAAgB,IAClB,CAACiX,EAAIC,CAAE,EAAIR,GAAaW,EAAgB,CACrCzO,EAAoB,CAAC,EACrBA,EAAoB,CAAC,GACrBqN,CAAM,EAGLjT,IAAMiU,GAAMhU,IAAMiU,EACXtO,EAAA,CAAC,IAAKqO,EAAIC,CAAE,EACZjU,IAAMiU,EACNtO,EAAA,CAAC,IAAKqO,CAAE,EACRjU,IAAMiU,IACNrO,EAAA,CAAC,IAAKsO,CAAE,OAGd,KAAAvU,EAAI,EAAGwU,EAAKvO,EAAO,OAAQjG,EAAIwU,EAAIxU,GAAK,EAC1C,CAAAsU,EAAIC,CAAE,EAAIR,GACTW,EACA,CAAC,CAACzO,EAAOjG,CAAC,EAAG,CAACiG,EAAOjG,EAAI,CAAC,CAAC,EAC3BsT,CACF,EACArN,EAAOjG,CAAC,EAAIsU,EACLrO,EAAAjG,EAAI,CAAC,EAAIuU,EAIhB,OAAAlU,EAAAiU,EACAhU,EAAAiU,EAEGtO,CAAA,CACR,CACH,EC3HM4O,GAAwB,CAC5BrV,EACAmH,IACsB,CAChB,MAAAmO,EAAYvV,EAAgBC,CAAS,EAEvC,IAAAuV,EAAWD,EAAU,MAAM,CAAC,EAC5BE,EAAaxF,GAAeuF,CAAQ,EACpCrX,EAAQqX,EAAS,OAAS,EAC1BE,EAAkB,EAClBpO,EAAS,EACTnH,EAAUoV,EAAU,CAAC,EAGrB,GAAApX,GAAS,GAAK,CAACiJ,GAAY,CAAC,OAAO,SAASA,CAAQ,EAC/C,MAAA,CACL,QAAAjH,EACA,MAAO,EACP,OAAAmH,EACA,gBAAAoO,CACF,EAGF,GAAItO,GAAYqO,EACH,OAAAD,EAAAD,EAAU,MAAM,EAAG,EAAE,EAChCG,EAAkBzF,GAAeuF,CAAQ,EACzClO,EAASmO,EAAaC,EACtBvV,EAAUoV,EAAUpX,CAAK,EAClB,CACL,QAAAgC,EACA,MAAAhC,EACA,OAAAmJ,EACA,gBAAAoO,CACF,EAGF,MAAMnW,EAAW,CAAC,EAClB,KAAOpB,EAAQ,GACbgC,EAAUqV,EAASrX,CAAK,EACbqX,EAAAA,EAAS,MAAM,EAAG,EAAE,EAC/BE,EAAkBzF,GAAeuF,CAAQ,EACzClO,EAASmO,EAAaC,EACTD,EAAAC,EAEbnW,EAAS,KAAK,CACZ,QAAAY,EACA,MAAAhC,EACA,OAAAmJ,EACA,gBAAAoO,CAAA,CACD,EACQvX,GAAA,EAGX,OAAOoB,EAAS,KAAK,CAAC,CAAE,gBAAiBmN,KACvCA,GAAKtF,CACP,CACF,ECnDMuO,GAAuB,CAC3B1V,EACAoH,IACoB,CACd,MAAAxJ,EAAOmC,EAAgBC,CAAS,EAChC2V,EAAaxF,GAAcvS,CAAI,EAC/B4X,EAAaxF,GAAe2F,CAAU,EACtCC,EAAclN,GAAa,CACzB,MAAAM,EAAKN,EAAE,EAAItB,EAAM,EACjB6B,EAAKP,EAAE,EAAItB,EAAM,EAChB,OAAA4B,EAAKA,EAAKC,EAAKA,CACxB,EACA,IAAI4M,EAAY,EACZC,EACAC,EAAU,CAAE,EAAG,EAAG,EAAG,CAAE,EACvBC,EAAe,EACfC,EAAa,EACbC,EAAe,IAGnB,QAASC,EAAa,EAAGA,GAAcX,EAAYW,GAAcN,EACxDC,EAAAzF,GAAiBsF,EAAYQ,CAAU,EAC9CH,EAAeJ,EAAWE,CAAI,EAE1BE,EAAeE,IACPH,EAAAD,EACGG,EAAAE,EACED,EAAAF,GAKNH,GAAA,EACT,IAAAO,EACAC,EACAC,EAAe,EACfC,EAAc,EACdC,EAAiB,EACjBC,EAAgB,EAEpB,KAAOZ,EAAY,OACjBS,EAAeL,EAAaJ,EACnBO,EAAA/F,GAAiBsF,EAAYW,CAAY,EAClDE,EAAiBZ,EAAWQ,CAAM,EAClCG,EAAcN,EAAaJ,EACnBQ,EAAAhG,GAAiBsF,EAAYY,CAAW,EAChDE,EAAgBb,EAAWS,CAAK,EAE5BC,GAAgB,GAAKE,EAAiBN,GAC9BH,EAAAK,EACGH,EAAAK,EACEJ,EAAAM,GACND,GAAef,GAAciB,EAAgBP,GAC5CH,EAAAM,EACGJ,EAAAM,EACEL,EAAAO,GAEFZ,GAAA,EAEX,EAAAA,EAAY,QAAhB,CAGI,MAAA3V,EAAUmV,GAAsBzX,EAAMqY,CAAU,EAChD9O,EAAW,KAAK,KAAK+O,CAAY,EAEhC,MAAA,CAAE,QAAAH,EAAS,SAAA5O,EAAU,QAAAjH,CAAQ,CACtC,EC1EMwW,GAAkB,CACtB1W,EACAoH,IAEOsO,GAAqB1V,EAAWoH,CAAK,EAAE,QCI1CuP,GAAkB,CACtBlU,EACAC,EACAsL,EACAC,EACAC,EACAC,EACAtL,EACAC,IAGG,IACGA,EAAKJ,IAAOsL,EAAME,IACjBrL,EAAKJ,IAAOwL,EAAME,GACnBF,GAAOxL,EAAKyL,GACZF,GAAOtL,EAAKyL,GACZrL,GAAMoL,EAAMzL,EAAK,GACjBI,GAAMsL,EAAMzL,EAAK,IACrB,GAcEkU,GAAehZ,GAAoB,CACvC,IAAIiD,EAAI,EACJC,EAAI,EACJ6L,EAAM,EAEV,OAAOrG,GAAY1I,CAAI,EACpB,IAAK2I,GAAQ,CACJ,OAAAA,EAAI,CAAC,EAAG,CACd,IAAK,IACF,QAAE1F,EAAGC,CAAC,EAAIyF,EACJ,EACT,QACQ,OAAAoG,EAAAgK,GACJ9V,EACAC,EACAyF,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,EACLA,EAAI,CAAC,CACP,EACA,CAAC1F,EAAGC,CAAC,EAAIyF,EAAI,MAAM,EAAE,EACdoG,CAAA,CACX,CACD,EACA,OAAO,CAAC1H,EAAGC,IAAMD,EAAIC,EAAG,CAAC,CAC9B,EClEM2R,GAAoBjZ,GACjBgZ,GAAYtQ,GAAY1I,CAAI,CAAC,GAAK,ECFrCkZ,GAAqB,CACzB9W,EACAmH,IAEOkO,GAAsBrV,EAAWmH,CAAQ,EAAE,QCH9C4P,GAAoB,CACxBnZ,EACAwJ,IAEOsO,GAAqB9X,EAAMwJ,CAAK,EAAE,QCNrC4P,GAAepZ,GAEjB,MAAM,QAAQA,CAAI,GAClBA,EAAK,MAAO2I,GAAqB,CAC/B,MAAM0Q,EAAK1Q,EAAI,CAAC,EAAE,YAAY,EAC9B,OACE7I,EAAYuZ,CAAE,IAAM1Q,EAAI,OAAS,GACjC,aAAa,SAAS0Q,CAAE,GACvB1Q,EAAI,MAAM,CAAC,EAAgB,MAAM,OAAO,QAAQ,CAAA,CAEpD,GACD3I,EAAK,OAAS,ECVZsZ,GAAmBtZ,GAErBoZ,GAAYpZ,CAAI,GAEhBA,EAAK,MAAM,CAAC,CAACiD,CAAC,IAAMA,IAAMA,EAAE,aAAa,ECHvCsW,GAAqBvZ,GAElBsZ,GAAgBtZ,CAAI,GAAKA,EAAK,MAAM,CAAC,CAACwZ,CAAE,IAAM,SAAS,SAASA,CAAE,CAAC,ECHtEC,GAAgBzZ,GAEbuZ,GAAkBvZ,CAAI,GAAKA,EAAK,MAAM,CAAC,CAACwZ,CAAE,IAAM,KAAK,SAASA,CAAE,CAAC,ECDpEE,GAAkB,CACtBtX,EACAoH,IACG,CACH,KAAM,CAAE,SAAAD,CAAa,EAAAuO,GAAqB1V,EAAWoH,CAAK,EACnD,OAAA,KAAK,IAAID,CAAQ,EAAI+I,EAC9B,ECPMqH,GAAmB3Z,GAErBoZ,GAAYpZ,CAAI,GAEhBA,EAAK,MAAM,CAAC,EAAE,MAAM,CAAC,CAACwZ,CAAE,IAAMA,IAAOA,EAAG,aAAa,ECHnDI,GAAe1X,GAAuB,CAC1C,GAAI,OAAOA,GAAe,UAAY,CAACA,EAAW,OACzC,MAAA,GAGH,MAAAlC,EAAO,IAAIiC,GAAWC,CAAU,EAItC,IAFAd,EAAWpB,CAAI,EAERA,EAAK,MAAQA,EAAK,KAAO,CAACA,EAAK,IAAI,QACxCyB,GAAYzB,CAAI,EAGX,MAAA,CAACA,EAAK,IAAI,QAAU,KAAK,SAASA,EAAK,SAAS,CAAC,EAAE,CAAC,CAAC,CAC9D,ECpBM6Z,GAA2B,CAC/B,KAAM,CAAC,KAAM,KAAM,KAAM,IAAI,EAC7B,OAAQ,CAAC,KAAM,KAAM,GAAG,EACxB,QAAS,CAAC,KAAM,KAAM,KAAM,IAAI,EAChC,KAAM,CAAC,QAAS,SAAU,IAAK,IAAK,KAAM,IAAI,EAC9C,QAAS,CAAC,QAAQ,EAClB,SAAU,CAAC,QAAQ,EACnB,MAAO,CAAC,GAAG,CACb,ECbMC,GAAaC,GACKA,GAAS,MAC/B,OAAOA,GAAS,UACfA,EAAc,WAAa,ECmBjBC,GAAeC,GAA8B,CACxD,GAAI,CAAE,GAAApV,EAAI,GAAAC,EAAI,GAAAG,EAAI,GAAAC,CAAO,EAAA+U,EACzB,OAACpV,EAAIC,EAAIG,EAAIC,CAAE,EAAI,CAACL,EAAIC,EAAIG,EAAIC,CAAE,EAAE,IAAKmC,GAAM,CAACA,CAAC,EAC1C,CACL,CAAC,IAAKxC,EAAIC,CAAE,EACZ,CAAC,IAAKG,EAAIC,CAAE,CACd,CACF,EAQagV,GAAeD,GAA8B,CACxD,MAAMvC,EAAY,CAAC,EACbzJ,GAAUgM,EAAK,QAAU,IAC5B,KAAK,EACL,MAAM,QAAQ,EACd,IAAK5S,GAAM,CAACA,CAAC,EAEhB,IAAI/G,EAAQ,EACL,KAAAA,EAAQ2N,EAAO,QACpByJ,EAAU,KAAK,CAACpX,EAAQ,IAAM,IAAK2N,EAAO3N,CAAK,EAAG2N,EAAO3N,EAAQ,CAAC,CAAC,CAAC,EAC3DA,GAAA,EAGH,OAAA2Z,EAAK,OAAS,UAClB,CAAC,GAAGvC,EAAW,CAAC,GAAG,CAAC,EACpBA,CACN,EAQayC,GAAiBF,GAAgC,CAC5D,GAAI,CAAE,GAAAzU,EAAI,GAAAC,EAAI,EAAAyP,CAAM,EAAA+E,EACpB,OAACzU,EAAIC,EAAIyP,CAAC,EAAI,CAAC1P,EAAIC,EAAIyP,CAAC,EAAE,IAAK7N,GAAM,CAACA,CAAC,EAEhC,CACL,CAAC,IAAK7B,EAAK0P,EAAGzP,CAAE,EAChB,CAAC,IAAKyP,EAAGA,EAAG,EAAG,EAAG,EAAG,EAAIA,EAAG,CAAC,EAC7B,CAAC,IAAKA,EAAGA,EAAG,EAAG,EAAG,EAAG,GAAKA,EAAG,CAAC,CAChC,CACF,EAQakF,GAAkBH,GAAiC,CAC1D,GAAA,CAAE,GAAAzU,EAAI,GAAAC,CAAA,EAAOwU,EACblV,EAAKkV,EAAK,IAAM,EAChBjV,EAAKiV,EAAK,IAAMlV,EACpB,OAACS,EAAIC,EAAIV,EAAIC,CAAE,EAAI,CAACQ,EAAIC,EAAIV,EAAIC,CAAE,EAAE,IAAKqC,GAAM,CAACA,CAAC,EAE1C,CACL,CAAC,IAAK7B,EAAKT,EAAIU,CAAE,EACjB,CAAC,IAAKV,EAAIC,EAAI,EAAG,EAAG,EAAG,EAAID,EAAI,CAAC,EAChC,CAAC,IAAKA,EAAIC,EAAI,EAAG,EAAG,EAAG,GAAKD,EAAI,CAAC,CACnC,CACF,EAQasV,GAAoBJ,GAA8B,CACvD,MAAAhX,EAAI,CAACgX,EAAK,GAAK,EACf/W,EAAI,CAAC+W,EAAK,GAAK,EACf5E,EAAI,CAAC4E,EAAK,MACVvU,EAAI,CAACuU,EAAK,OACZ,IAAAlV,EAAK,EAAEkV,EAAK,IAAM,GAClBjV,EAAK,EAAEiV,EAAK,IAAMlV,GAGtB,OAAIA,GAAMC,GAKJD,EAAK,EAAIsQ,IAAUtQ,IAAAA,EAAK,EAAIsQ,GAAK,GAEjCrQ,EAAK,EAAIU,IAAUV,IAAAA,EAAK,EAAIU,GAAK,GAE9B,CACL,CAAC,IAAKzC,EAAI8B,EAAI7B,CAAC,EACf,CAAC,IAAKmS,EAAItQ,EAAK,CAAC,EAChB,CAAC,IAAKA,EAAI,EAAGA,EAAIC,CAAE,EACnB,CAAC,IAAKU,EAAIV,EAAK,CAAC,EAChB,CAAC,IAAK,EAAGA,EAAI,CAACD,EAAIC,CAAE,EACpB,CAAC,IAAK,CAACqQ,EAAItQ,EAAK,CAAC,EACjB,CAAC,IAAK,CAACA,EAAI,EAAG,CAACA,EAAI,CAACC,CAAE,EACtB,CAAC,IAAK,CAACU,EAAIV,EAAK,CAAC,EACjB,CAAC,IAAK,EAAG,CAACA,EAAID,EAAI,CAACC,CAAE,CACvB,GAGK,CAAC,CAAC,IAAK/B,EAAGC,CAAC,EAAG,CAAC,IAAKmS,CAAC,EAAG,CAAC,IAAK3P,CAAC,EAAG,CAAC,IAAKzC,CAAC,EAAG,CAAC,GAAG,CAAC,CAC1D,EAYMqX,GACJC,GACG,CACG,MAAAC,EAAkB,OAAO,KAAKX,EAAW,EACzCY,EAAkBX,GAAUS,CAAO,EACnCG,EAAUD,EAAkBF,EAAQ,QAAU,KAEhD,GAAAG,GAAW,CAAC,GAAGF,EAAiB,MAAM,EAAE,MAAO3F,GAAM6F,IAAY7F,CAAC,EACpE,MAAM,UAAU,GAAGzU,CAAK,MAAMsa,CAAO,qBAAqB,EAGtD,MAAAC,EACHF,EAAkBC,EAAWH,EAAqB,KAG/CK,EAAaf,GAAYc,CAAI,EAC7BE,EAAS,CAAE,KAAAF,CAAK,EAElBF,EACSG,EAAA,QAAS9P,GAAM,CACxB+P,EAAO/P,CAAC,EAAIyP,EAAQ,aAAazP,CAAC,CAAA,CACnC,EAEM,OAAA,OAAO+P,EAAQN,CAAO,EAI/B,IAAI7C,EAAY,CAAC,EAsBjB,OAnBIiD,IAAS,SACXjD,EAAYyC,GAAcU,CAA+B,EAChDF,IAAS,UAClBjD,EAAY0C,GAAeS,CAAgC,EAClD,CAAC,WAAY,SAAS,EAAE,SAASF,CAAI,EAC9CjD,EAAYwC,GAAYW,CAA6B,EAC5CF,IAAS,OAClBjD,EAAY2C,GAAiBQ,CAA6B,EACjDF,IAAS,OAClBjD,EAAYsC,GAAYa,CAA6B,EAC5C,CAAC,QAAS,MAAM,EAAE,SAASF,CAAI,IAC5BjD,EAAAvV,EACVsY,EACIF,EAAQ,aAAa,GAAG,GAA0C,GACjEA,EAAsB,GAAK,EAClC,GAIEnB,GAAY1B,CAAS,GAAKA,EAAU,OAC/BA,EAEF,EACT,ECtKMoD,GAAc,CAClBP,EACAQ,EACAC,IAC2B,CAC3B,MAAMC,EAAMD,GAAiB,SACvBR,EAAkB,OAAO,KAAKX,EAAW,EACzCY,EAAkBX,GAAUS,CAAO,EACnCG,EAAUD,EAAkBF,EAAQ,QAAU,KAEpD,GAAIG,IAAY,OACd,MAAM,UAAU,GAAGta,CAAK,MAAMsa,CAAO,6BAA6B,EAEpE,GAAIA,GAAWF,EAAgB,MAAO3F,GAAM6F,IAAY7F,CAAC,EACvD,MAAM,UAAU,GAAGzU,CAAK,MAAMsa,CAAO,qBAAqB,EAG5D,MAAM1a,EAAOib,EAAI,gBAAgB,6BAA8B,MAAM,EAC/DN,EACHF,EAAkBC,EAAWH,EAAqB,KAG/CK,EAAaf,GAAYc,CAAI,EAC7BE,EAAS,CAAE,KAAAF,CAAK,EAGhB5R,EAAQlJ,EAAe,MACvB6X,EAAY4C,GAAiBC,CAAO,EACpCW,EAAcxD,GAAaA,EAAU,OACvCzO,GAAayO,EAAW3O,CAAK,EAC7B,GAwBA,OAtBA0R,GACSG,EAAA,QAAS9P,GAAM,CACxB+P,EAAO/P,CAAC,EAAIyP,EAAQ,aAAazP,CAAC,CAAA,CACnC,EAEM,OAAA,OAAOyP,EAAQ,UAAU,EAAE,QAAQ,CAAC,CAAE,KAAAY,EAAM,MAAAC,KAAY,CACxDR,EAAW,SAASO,CAAI,GAAQnb,EAAA,aAAamb,EAAMC,CAAK,CAAA,CAC9D,IAEM,OAAA,OAAOP,EAAQN,CAAO,EAE7B,OAAO,KAAKM,CAAM,EAAE,QAAShV,GAAM,CAC7B,CAAC+U,EAAW,SAAS/U,CAAC,GAAKA,IAAM,QAC9B7F,EAAA,aACH6F,EAAE,QAAQ,SAAWsP,GAAM,IAAIA,EAAE,YAAa,CAAA,EAAE,EAChD0F,EAAOhV,CAAC,CACV,CACF,CACD,GAIC+T,GAAYsB,CAAW,GACpBlb,EAAA,aAAa,IAAKkb,CAAW,EAC9BH,GAAWN,IACLF,EAAA,OAAOva,EAAMua,CAAO,EAC5BA,EAAQ,OAAO,GAEVva,GAEF,EACT,EClFMqb,GAAgBrb,GAAqB,CACzC,MAAMsb,EAAetb,EAClB,MAAM,CAAC,EACP,IAAI,CAACiD,EAAGjB,EAAGuZ,IACTvZ,EAEGuZ,EAAUvZ,EAAI,CAAC,EAAE,MAAM,EAAE,EAAE,OAAOiB,EAAE,MAAM,CAAC,CAAC,EAD5CjD,EAAK,CAAC,EAAE,MAAM,CAAC,EAAE,OAAOiD,EAAE,MAAM,CAAC,CAAa,CACF,EAEjD,IAAKA,GAAMA,EAAE,IAAI,CAACuP,EAAGxQ,IAAMiB,EAAEA,EAAE,OAASjB,EAAI,GAAK,EAAKA,EAAI,EAAG,CAAC,CAAC,EAC/D,QAAQ,EAEX,MAAO,CAAC,CAAC,GAA2B,EAAE,OAAOsZ,EAAa,CAAC,EAAE,MAAM,EAAG,CAAC,CAAC,CAAC,EACtE,OACCA,EAAa,IAAKrY,GAAM,CAAC,GAA2B,EAAE,OAAOA,EAAE,MAAM,CAAC,CAAC,CAAC,CAC1E,CACJ,ECXMuY,GAAY,CAACxb,EAAiBkJ,IAAiC,CAC/D,GAAA,CAAE,MAAAH,GAAUlJ,EAWhB,OATAkJ,EAAQG,IAAgB,OAEpB,OAAOA,GAAgB,UAAYA,GAAe,EADlDA,EAGA,OAAOH,GAAU,UAAYA,GAAS,EACtCA,EACqC,MAGrCA,IAAU,MAAc/I,EAAK,MAAM,CAAC,EAEjC6C,EAAqB7C,EAAOsC,GAC1B8Q,GAAa9Q,EAASyG,CAAK,CACnC,CACH,ECpBM0S,GAAa,CACjBC,EACAC,EAAQ,KACyB,CACjC,MAAMrV,EAAIqV,EACJC,EAAKF,EAAI,MAAM,EAAG,CAAC,EACnBhO,EAAKgO,EAAI,MAAM,EAAG,CAAC,EACnB/N,EAAK+N,EAAI,MAAM,EAAG,CAAC,EACnB7N,EAAK6N,EAAI,MAAM,EAAG,CAAC,EACnB9N,EAAKxG,EAASwU,EAAIlO,EAAIpH,CAAC,EACvBuV,EAAKzU,EAASsG,EAAIC,EAAIrH,CAAC,EACvBwV,EAAK1U,EAASuG,EAAIE,EAAIvH,CAAC,EACvByV,EAAK3U,EAASwG,EAAIiO,EAAIvV,CAAC,EACvB0V,EAAK5U,EAASyU,EAAIC,EAAIxV,CAAC,EACvB2V,EAAK7U,EAAS2U,EAAIC,EAAI1V,CAAC,EAEtB,MAAA,CACL,CAAC,IAAKsH,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGmO,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGE,EAAG,CAAC,EAAGA,EAAG,CAAC,CAAC,EAC9C,CAAC,IAAKD,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGF,EAAG,CAAC,EAAGA,EAAG,CAAC,EAAGjO,EAAG,CAAC,EAAGA,EAAG,CAAC,CAAC,CAChD,CACF,ECgEA,MAAMqO,EAAiB,CAWrB,YAAY3b,EAAmBsa,EAA2B,CAClD,MAAAsB,EAAkBtB,GAAU,CAAC,EAC7BuB,EAAY,OAAO7b,EAAc,IAEnC,GAAA6b,GAAa,CAAC7b,EAAU,OACpB,MAAA,UACJ,GAAGH,CAAK,oBAAoBgc,EAAY,YAAc,OAAO,EAC/D,EAGG,KAAA,SAAWja,EAAgB5B,CAAS,EAGzC,KAAM,CAAE,MAAO2I,EAAa,OAAQmT,CAAiB,EAAAF,EACjD,IAAApT,EAEA,OAAO,UAAUG,CAAW,GAAKA,IAAgB,MAC3CH,EAAAG,EAERH,EAAQlJ,EAAe,MAKzB,IAAIqW,EAASrW,EAAe,OAE5B,GAAI,MAAM,QAAQwc,CAAY,GAAKA,EAAa,QAAU,EAAG,CAC3D,KAAM,CAAClG,EAASC,EAASS,CAAO,EAAIwF,EAAa,IAAI,MAAM,EAClDnG,EAAA,CACN,OAAO,MAAMC,CAAO,EAAc,EAAVA,EACxB,OAAO,MAAMC,CAAO,EAAc,EAAVA,EACxB,OAAO,MAAMS,CAAO,EAAc,EAAVA,CAC3B,CAAA,CAGF,YAAK,MAAQ9N,EACb,KAAK,OAASmN,EAEP,IAAA,CAET,IAAI,MAAO,CACF,OAAA9E,GAAY,KAAK,QAAQ,CAAA,CAElC,IAAI,QAAS,CACJ,OAAAgB,GAAe,KAAK,QAAQ,CAAA,CASrC,SAAU,CACR,OAAO,KAAK,IAAA,CASd,gBAAiB,CACf,OAAO,KAAK,MAAA,CAWd,iBAAiB3I,EAAgB,CACxB,OAAAgJ,GAAiB,KAAK,SAAUhJ,CAAM,CAAA,CAQ/C,YAAa,CACL,KAAA,CAAE,SAAA/H,GAAa,KAChB,YAAA,SAAW6B,GAAe7B,CAAQ,EAChC,IAAA,CAQT,YAAa,CACL,KAAA,CAAE,SAAAA,GAAa,KAChB,YAAA,SAAWiC,GAAejC,CAAQ,EAChC,IAAA,CAST,SAAU,CACF,KAAA,CAAE,SAAAA,GAAa,KAChB,YAAA,SAAWgH,GAAYhH,CAAQ,EAC7B,IAAA,CAST,QAAQ4a,EAAuB,CACvB,KAAA,CAAE,SAAA5a,GAAa,KACf6a,EAAQ/H,GAAU9S,CAAQ,EAC1B8a,EAAUD,EAAM,OAAS,EAAIA,EAAQ,GAErCE,EAAoBD,EACtBA,EAAQ,IAAI,CAACvZ,EAAGjB,IACZsa,EACKta,EAAI+R,GAAY9Q,CAAC,EAAIA,EAAE,MAAM,CAAC,EAEhC8Q,GAAY9Q,CAAC,CACrB,EACCvB,EAAS,MAAM,CAAC,EAEpB,IAAI1B,EAAO,CAAC,EACZ,OAAIwc,EACKxc,EAAAyc,EAAkB,KAAK,CAAC,EAExBzc,EAAAsc,EAAc5a,EAAWqS,GAAYrS,CAAQ,EAGjD,KAAA,SAAW1B,EAAK,MAAM,CAAC,EACrB,IAAA,CAUT,WAAY,CACJ,KAAA,CAAE,SAAA0B,GAAa,KAChB,YAAA,SAAW6Q,GAAc7Q,CAAQ,EAC/B,IAAA,CAWT,UAAW,CACH,KAAA,CAAE,SAAAA,GAAa,KACfqH,EAAQ,KAAK,QAAU,MAAQ,EAAI,KAAK,MAEzC,YAAA,SAAWsK,GAAa3R,EAAUqH,CAAK,EACrC,IAAA,CAWT,UAAU2T,EAAmC,CAEzC,GAAA,CAACA,GACD,OAAOA,GAAW,UACjB,OAAOA,GAAW,UACjB,CAAC,CAAC,YAAa,SAAU,OAAQ,OAAO,EAAE,KAAMzZ,GAAMA,KAAKyZ,CAAM,EAE5D,OAAA,KAGH,KAAA,CACJ,SAAAhb,EACA,OAAQ,CAAC8D,EAAIC,EAAIkX,CAAE,CAAA,EACjB,KACE5G,EAAY,CAAC,EACnB,SAAW,CAAClQ,EAAG8P,CAAC,IAAK,OAAO,QAAQ+G,CAAM,EAEpC7W,IAAM,QAAU,MAAM,QAAQ8P,CAAC,IAGhC9P,IAAM,UACLA,IAAM,aACNA,IAAM,UACNA,IAAM,UACR,MAAM,QAAQ8P,CAAC,EANfI,EAAUlQ,CAAC,EAAI8P,EAAE,IAAI,MAAM,EASlB9P,IAAM,UAAY,OAAO,OAAO8P,CAAC,GAAM,WACtCI,EAAAlQ,CAAC,EAAI,OAAO8P,CAAC,GAMrB,KAAA,CAAE,OAAAO,GAAWH,EAEnB,GAAI,MAAM,QAAQG,CAAM,GAAKA,EAAO,QAAU,EAAG,CAC/C,KAAM,CAACC,EAASC,EAASS,CAAO,EAAIX,EAAO,IAAI,MAAM,EACrDH,EAAU,OAAS,CAChB,OAAO,MAAMI,CAAO,EAAc3Q,EAAV2Q,EACxB,OAAO,MAAMC,CAAO,EAAc3Q,EAAV2Q,EACzBS,GAAW8F,CACb,CAAA,MAEA5G,EAAU,OAAS,CAACvQ,EAAIC,EAAIkX,CAAE,EAG3B,YAAA,SAAW1F,GAAcvV,EAAUqU,CAAS,EAC1C,IAAA,CAQT,OAAQ,CACN,KAAM,CAAE,GAAAvQ,EAAI,GAAAC,CAAG,EAAI,KAAK,KACxB,YAAK,UAAU,CAAE,OAAQ,CAAC,EAAG,IAAK,CAAC,EAAG,OAAQ,CAACD,EAAIC,EAAI,CAAC,EAAG,EACpD,IAAA,CAQT,OAAQ,CACN,KAAM,CAAE,GAAAD,EAAI,GAAAC,CAAG,EAAI,KAAK,KACxB,YAAK,UAAU,CAAE,OAAQ,CAAC,IAAK,EAAG,CAAC,EAAG,OAAQ,CAACD,EAAIC,EAAI,CAAC,EAAG,EACpD,IAAA,CAUT,UAAW,CACT,OAAOwD,GAAa,KAAK,SAAU,KAAK,KAAK,CAAA,CAS/C,SAAU,CACD,OAAA,KAAK,IAAI,EAAE,QAAS2T,GAAQ,OAAO,KAAKA,CAAwB,CAAC,CAAA,CA4N5E","x_google_ignoreList":[49]} \ No newline at end of file +{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/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/parser/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/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.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/process/splitCubic.ts","../src/main.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return 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, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return 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 }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","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 */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\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 */\nconst 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\nexport default distanceSquareRoot;\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 * @param distance the distance to point in [0-1] range\n * @returns the extrema 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 a [0-1] ratio\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 { 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 boundig 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) => {\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]] as [\n number,\n number,\n number,\n number,\n ];\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 boundig 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 * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon 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 /* eslint-disable-next-line */\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};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, 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 */\nconst 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\nexport default rotateVector;\n","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\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\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\nexport default paramsCount;\n","import paramsCount 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 */\nconst 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 >= paramsCount[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, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./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 */\nconst 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\nexport default scanFlag;\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 */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./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 */\nconst 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};\nexport default scanParam;\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\nconst 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};\nexport default isSpace;\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 */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\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 */\nconst 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};\nexport default isPathCommand;\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 */\nconst 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};\nexport default isDigitStart;\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 */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst 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};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts 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 \"./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 */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[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) && 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 && 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};\nexport default scanSegment;\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\n */\nexport default 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 * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\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\nexport default parsePathString;\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 */\nconst 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};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n 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 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 if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\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 | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\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 */\nconst 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\nexport default relativizeSegment;\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 | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\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 * @return the resulting cubic-bezier segment(s)\n */\nconst 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};\nexport default arcToCubic;\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 */\nconst 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};\nexport default quadToCubic;\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 */\nconst 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};\nexport default lineToCubic;\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 */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\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\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\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, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\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 */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\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};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\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\nexport default paramsParser;\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 value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\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 });\n};\nexport default pathToCurve;\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\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\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 : /* istanbul ignore next @preserve */ \"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\nexport default pathToString;\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\nconst getPathBBox = (pathInput: PathArray | 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\nexport default getPathBBox;\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 shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\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\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\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 });\n};\nexport default normalizePath;\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 of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\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 // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\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\nexport default getPointAtLength;\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 */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\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 PathArray;\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 PathArray;\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(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\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 */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\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\nexport default getPropertiesAtPoint;\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 */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\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 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 length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\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};\nexport default getPathArea;\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 */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\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 */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\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 */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount 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 */\nconst 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 paramsCount[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};\nexport default isPathArray;\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 */\nconst 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};\nexport default isAbsoluteArray;\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 are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst 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};\nexport default isNormalizedArray;\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 */\nconst 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};\nexport default isCurveArray;\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 */\nconst isPointInStroke = (\n pathInput: string | PathArray,\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};\nexport default isPointInStroke;\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 */\nconst 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};\nexport default isRelativeArray;\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 */\nconst 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};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst 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\nexport default shapeParams;\n","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\nexport default isElement;\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 \"../parser/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\n * @returns a new line `pathArray`\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` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\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 (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\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\n * @return an ellipse `pathArray`\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` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\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 ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\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) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\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};\nexport default shapeToPathArray;\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 \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. 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 `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst 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;\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 Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\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\nexport default shapeToPath;\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 */\nconst 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\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\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\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } 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` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\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 : /* istanbul ignore next @preserve */ 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 = seg;\n [pathCommand] = seg;\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\nexport default optimizePath;\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` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\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;\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]) as PathSegment;\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 ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"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] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"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] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\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 PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\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 ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\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 `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst 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};\nexport default getSVGMatrix;\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 * @return 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 */\nconst 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};\nexport default projection2d;\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` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\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 let pathCommand = \"M\";\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 typeof path;\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 typeof path;\n\n return 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 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)) 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(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\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 });\n};\n\nexport default transformPath;\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 */\nconst 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\nexport default reverseCurve;\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 */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\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 : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\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 \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) {\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 * @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 * @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 * @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 * @param onlySubpath option to reverse all sub-paths except first\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 * @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 * @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 refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\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 * @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 * @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 * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file diff --git a/dist/svg-path-commander.mjs b/dist/svg-path-commander.mjs index 21a7d91..005b9be 100644 --- a/dist/svg-path-commander.mjs +++ b/dist/svg-path-commander.mjs @@ -1,2 +1,2 @@ -var ht={origin:[0,0,0],round:4},O=ht;var bt={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},G=bt;var gt=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=G[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,G[n]))),!!G[n]););},Ae=gt;var yt="SVGPathCommander Error",z=yt;var dt=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${z}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},ze=dt;var xt=t=>t>=48&&t<=57,j=xt;var Pt="Invalid path value",H=Pt;var St=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${z}: ${H} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!j(u)&&u!==46){t.err=`${z}: ${H} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),Ve=At;var Ct=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Qe=Tt;var Mt=t=>j(t)||t===43||t===45||t===46,qe=Mt;var Lt=t=>(t|32)===97,De=Lt;var vt=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},Ee=vt;var Nt=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=G[n[o].toLowerCase()];if(t.segmentStart=o,!Qe(s)){t.err=`${z}: ${H} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!Ee(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${z}: ${H} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,_(t),t.data=[],!a){Ae(t);return}for(;;){for(let m=a;m>0;m-=1){if(De(s)&&(m===3||m===4)?ze(t):Re(t),t.err.length)return;t.data.push(t.param),_(t),t.index=t.max||!qe(n.charCodeAt(t.index)))break}Ae(t)},fe=Nt;var W=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var wt=t=>{if(typeof t!="string")return t.slice(0);let e=new W(t);for(_(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,l=0,c=0;for(let f=0;f{let e=T(t);return M(e,U)},ee=Rt;var Vt=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=T(t);return M(e,he)},Oe=Qt;var qt=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},be=qt;var st=(t,e,n,o,r,s,a,i,m,u)=>{let l=t,c=e,f=n,h=o,p=i,b=m,d=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],y,g,x,C,R;if(u)[g,x,C,R]=u;else{y=be(l,c,-S),l=y.x,c=y.y,y=be(p,b,-S),p=y.x,b=y.y;let N=(l-p)/2,D=(c-b)/2,k=N*N/(f*f)+D*D/(h*h);k>1&&(k=Math.sqrt(k),f*=k,h*=k);let we=f*f,ke=h*h,at=(s===a?-1:1)*Math.sqrt(Math.abs((we*ke-we*D*D-ke*N*N)/(we*D*D+ke*N*N)));C=at*f*D/h+(l+p)/2,R=at*-h*N/f+(c+b)/2,g=Math.asin(((c-R)/h*10**9>>0)/10**9),x=Math.asin(((b-R)/h*10**9>>0)/10**9),g=lx&&(g-=Math.PI*2),!a&&x>g&&(x-=Math.PI*2)}let V=x-g;if(Math.abs(V)>d){let N=x,D=p,k=b;x=g+d*(a&&x>g?1:-1),p=C+f*Math.cos(x),b=R+h*Math.sin(x),A=st(p,b,f,h,r,0,a,D,k,[x,N,C,R])}V=x-g;let w=Math.cos(g),L=Math.sin(g),$=Math.cos(x),X=Math.sin(x),Q=Math.tan(V/4),P=4/3*f*Q,q=4/3*h*Q,B=[l,c],E=[l+P*L,c-q*w],Z=[p+P*X,b-q*$],me=[p,b];if(E[0]=2*B[0]-E[0],E[1]=2*B[1]-E[1],u)return[E[0],E[1],Z[0],Z[1],me[0],me[1]].concat(A);A=[E[0],E[1],Z[0],Z[1],me[0],me[1]].concat(A);let Y=[];for(let N=0,D=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},Ie=Dt;var Et=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},I=Et;var Ot=(t,e,n,o)=>{let r=I([t,e],[n,o],.3333333333333333),s=I([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Ce=Ot;var It=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(ge(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(Ie(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Ce(a,i,r,s)):n==="Z"?["C"].concat(Ce(a,i,m,u)):t},$e=It;var $t=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:l}=e,c=t.slice(1),f=c.map((h,p)=>h+(r?p%2?l:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=c.slice(0,-2).concat(c[5]+(r?u:0),c[6]+(r?l:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?l:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let h=s*2-i,p=a*2-m;return e.x1=h,e.y1=p,["C",h,p].concat(f)}else if(o==="T"){let h=s*2-(e.qx?e.qx:0),p=a*2-(e.qy?e.qy:0);return e.qx=h,e.qy=p,["Q",h,p].concat(f)}else if(o==="Q"){let[h,p]=f;return e.qx=h,e.qy=p,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},te=$t;var Bt={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},K=Bt;var jt=t=>{let e={...K},n=T(t);return M(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=te(o,e),m=$e(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let l=m.length;return e.x1=+m[l-2],e.y1=+m[l-1],e.x2=+m[l-4]||e.x1,e.y2=+m[l-3]||e.y1,m})},re=jt;var Ht=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},v=Ht;var Zt=(t,e)=>{let n=t.length,{round:o}=O,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;aMath.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),Be=Gt;var ie=(t,e,n,o)=>Be([t,e],[n,o]),Te=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=Be([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=I([t,e],[n,o],r/a);s={x:i,y:m}}}return s},je=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]};var it=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},ue=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),l=n*i(s),c=o*a(s);return[t+m*l-u*c,e+u*l+m*c]},mt=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},He=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:l,cos:c,sqrt:f,PI:h}=Math,p=u(n),b=u(o),S=(r%360+360)%360*(h/180);if(t===i&&e===m)return{rx:p,ry:b,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||b===0)return{rx:p,ry:b,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,y=(e-m)/2,g={x:c(S)*A+l(S)*y,y:-l(S)*A+c(S)*y},x=g.x**2/p**2+g.y**2/b**2;x>1&&(p*=f(x),b*=f(x));let C=p**2*b**2-p**2*g.y**2-b**2*g.x**2,R=p**2*g.y**2+b**2*g.x**2,V=C/R;V=V<0?0:V;let w=(s!==a?1:-1)*f(V),L={x:w*(p*g.y/b),y:w*(-(b*g.x)/p)},$={x:c(S)*L.x-l(S)*L.y+(t+i)/2,y:l(S)*L.x+c(S)*L.y+(e+m)/2},X={x:(g.x-L.x)/p,y:(g.y-L.y)/b},Q=mt({x:1,y:0},X),P={x:(-g.x-L.x)/p,y:(-g.y-L.y)/b},q=mt(X,P);!a&&q>0?q-=2*h:a&&q<0&&(q+=2*h),q%=2*h;let B=Q+q;return{center:$,startAngle:Q,endAngle:B,rx:p,ry:b}},Me=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:l,startAngle:c,endAngle:f}=He(t,e,n,o,r,s,a,i,m);return it(u,l,f-c)},ut=(t,e,n,o,r,s,a,i,m,u)=>{let l={x:t,y:e},{center:c,rx:f,ry:h,startAngle:p,endAngle:b}=He(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let d=it(f,h,b-p);if(u<=0)l={x:t,y:e};else if(u>=d)l={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||h===0)return Te(t,e,i,m,u);let{PI:S,cos:A,sin:y}=Math,g=b-p,C=(r%360+360)%360*(S/180),R=p+g*(u/d),V=f*A(R),w=h*y(R);l={x:A(C)*V-y(C)*w+c.x,y:y(C)*V+A(C)*w+c.y}}}return l},lt=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:l,ry:c,startAngle:f,endAngle:h}=He(t,e,n,o,r,s,a,i,m),p=h-f,{min:b,max:d,tan:S,atan2:A,PI:y}=Math,{x:g,y:x}=u,C=r*y/180,R=S(C),V=A(-c*R,l),w=V,L=V+y,$=A(c,l*R),X=$+y,Q=[i],P=[m],q=b(t,i),B=d(t,i),E=b(e,m),Z=d(e,m),me=h-p*1e-5,Y=ue(g,x,l,c,C,me),N=h-p*.99999,D=ue(g,x,l,c,C,N);if(Y[0]>B||D[0]>B){let k=ue(g,x,l,c,C,w);Q.push(k[0]),P.push(k[1])}if(Y[0]Z||D[1]>Z){let k=ue(g,x,l,c,C,$);Q.push(k[0]),P.push(k[1])}return q=b.apply([],Q),E=b.apply([],P),B=d.apply([],Q),Z=d.apply([],P),[q,E,B,Z]};var ct=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],_t=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Ut=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,l=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,l=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+l*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+l*r[3].y,t:e}},Ft=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},Jt=t=>{let n=ct.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oKt(n[0],o))},Wt=1e-8,Le=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)0&&l<1){let f=t*(1-l)*(1-l)*(1-l)+e*3*(1-l)*(1-l)*l+n*3*(1-l)*l*l+o*l*l*l;fm&&(m=f)}}return[i,m]};var Xt=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},de=(t,e,n,o,r,s,a,i)=>le([t,e,n,o,r,s,a,i]),pt=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",l={x:t,y:e};if(u){let c=le([t,e,n,o,r,s,a,i]);m<=0||(m>=c?l={x:a,y:i}:l=Xt([t,e,n,o,r,s,a,i],m/c))}return l},Ge=(t,e,n,o,r,s,a,i)=>{let m=Ze([t,n,r,a]),u=Ze([e,o,s,i]);return[m[0],u[0],m[1],u[1]]};var Yt=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},xe=(t,e,n,o,r,s)=>le([t,e,n,o,r,s]),ft=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=le([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=Yt([t,e,n,o,r,s],a/u))}return m},_e=(t,e,n,o,r,s)=>{let a=Le([t,n,r]),i=Le([e,o,s]);return[a[0],i[0],a[1],i[1]]};var er=t=>{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=T(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,l=-1/0,c=0,f=0,h=0,p=0,b=0,d=0,S=0,A=0,y=0,g=0;M(e,(R,V,w,L)=>{[n]=R;let $=n.toUpperCase(),Q=$!==n?U(R,V,w,L):R.slice(0),P=$==="V"?["L",w,Q[1]]:$==="H"?["L",Q[1],L]:Q;[n]=P,"TQ".includes($)||(y=0,g=0);if(n==="M")[,o,r]=P,c=o,f=r,h=o,p=r;else if(n==="L")[c,f,h,p]=je(w,L,P[1],P[2]);else if(n==="A")[c,f,h,p]=lt(w,L,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(n==="S"){let q=b*2-S,B=d*2-A;[c,f,h,p]=Ge(w,L,q,B,P[1],P[2],P[3],P[4])}else n==="C"?[c,f,h,p]=Ge(w,L,P[1],P[2],P[3],P[4],P[5],P[6]):n==="T"?(y=b*2-y,g=d*2-g,[c,f,h,p]=_e(w,L,y,g,P[1],P[2])):n==="Q"?(y=P[1],g=P[2],[c,f,h,p]=_e(w,L,P[1],P[2],P[3],P[4])):n==="Z"&&([c,f,h,p]=je(w,L,o,r));i=a(c,i),m=a(f,m),u=s(h,u),l=s(p,l),[b,d]=n==="Z"?[o,r]:P.slice(-2),[S,A]=n==="C"?[P[3],P[4]]:n==="S"?[P[1],P[2]]:[b,d]});let x=u-i,C=l-m;return{width:x,height:C,x:i,y:m,x2:u,y2:l,cx:i+x/2,cy:m+C/2,cz:Math.max(x,C)+Math.min(x,C)/2}},Ue=er;var tr=t=>{let e=T(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,l=0,c=0;return M(e,(f,h,p,b)=>{[m]=f;let d=m.toUpperCase(),A=d!==m?U(f,h,p,b):f.slice(0),y=d==="V"?["L",p,A[1]]:d==="H"?["L",A[1],b]:A;[m]=y,"TQ".includes(d)||(a=0,i=0);if(m==="M")[,u,l]=y;else if(m==="L")c+=ie(p,b,y[1],y[2]);else if(m==="A")c+=Me(p,b,y[1],y[2],y[3],y[4],y[5],y[6],y[7]);else if(m==="S"){let g=n*2-r,x=o*2-s;c+=de(p,b,g,x,y[1],y[2],y[3],y[4])}else m==="C"?c+=de(p,b,y[1],y[2],y[3],y[4],y[5],y[6]):m==="T"?(a=n*2-a,i=o*2-i,c+=xe(p,b,a,i,y[1],y[2])):m==="Q"?(a=y[1],i=y[2],c+=xe(p,b,y[1],y[2],y[3],y[4])):m==="Z"&&(c+=ie(p,b,u,l));[n,o]=m==="Z"?[u,l]:y.slice(-2),[r,s]=m==="C"?[y[3],y[4]]:m==="S"?[y[1],y[2]]:[n,o]}),c},F=tr;var ce=1e-5;var rr=t=>{let e=T(t),n={...K};return M(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=te(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},J=rr;var nr=(t,e)=>{let n=J(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),l=typeof e=="number",c={x:m,y:u},f=0,h=c,p=0;return!l||e{[s]=b,o=s==="M",r=o?r:[S,A].concat(b.slice(1));if(o?([,m,u]=b,c={x:m,y:u},f=0):s==="L"?(c=Te(r[0],r[1],r[2],r[3],e-p),f=ie(r[0],r[1],r[2],r[3])):s==="A"?(c=ut(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-p),f=Me(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(c=pt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-p),f=de(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(c=ft(r[0],r[1],r[2],r[3],r[4],r[5],e-p),f=xe(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],c={x:m,y:u},f=ie(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),pp-ce?{x:a,y:i}:h)},ne=nr;var or=(t,e,n,o)=>{let[r]=t,{round:s}=O,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:l,y2:c,x:f,y:h}=n,[p,b]=i.slice(-2),d=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(v(f,a)===v(p,a))return["V",b];if(v(h,a)===v(b,a))return["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(v(S,a)===v(m*2-l,a)&&v(A,a)===v(u*2-c,a)||v(m,a)===v(l*2-f,a)&&v(u,a)===v(c*2-h,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&v(S,a)===v(m*2-l,a)&&v(A,a)===v(u*2-c,a))return["T",i[2],i[3]]}return d},Ke=or;var ar=(t,e)=>{let n=t.slice(1).map(o=>v(o,e));return[t[0]].concat(n)},pe=ar;var sr=(t,e)=>{let n=ee(t),o=typeof e=="number"&&e>=0?e:2,r={...K},s=[],a="M",i="Z";return M(n,(m,u,l,c)=>{r.x=l,r.y=c;let f=te(m,r),h=m;if([a]=m,s[u]=a,u){i=s[u-1];let b=Ke(m,f,r,i),d=pe(b,o),S=d.join(""),A=he(b,u,l,c),y=pe(A,o),g=y.join("");h=S.length{let e=ee(t),n=J(e),o=e.length,r=e[o-1][0]==="Z",s=M(e,(a,i)=>{let m=n[i],u=i&&e[i-1],l=u&&u[0],c=e[i+1],f=c&&c[0],[h]=a,[p,b]=n[i?i-1:o-1].slice(-2),d=a;switch(h){case"M":d=r?["Z"]:[h,p,b];break;case"A":d=[h,a[1],a[2],a[3],a[4],a[5]===1?0:1,p,b];break;case"C":c&&f==="S"?d=["S",a[1],a[2],p,b]:d=[h,a[3],a[4],a[1],a[2],p,b];break;case"S":l&&"CS".includes(l)&&(!c||f!=="S")?d=["C",m[3],m[4],m[1],m[2],p,b]:d=[h,m[1],m[2],p,b];break;case"Q":c&&f==="T"?d=["T",p,b]:d=[h,a[1],a[2],p,b];break;case"T":l&&"QT".includes(l)&&(!c||f!=="T")?d=["Q",m[1],m[2],p,b]:d=[h,p,b];break;case"Z":d=["M",p,b];break;case"H":d=[h,p];break;case"V":d=[h,b];break;default:d=[h].concat(a.slice(1,-2),p,b)}return d});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},Pe=mr;var ir=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...K};return t.forEach(u=>{let[l]=u,c=l.toUpperCase(),f=l.toLowerCase(),h=l===f,p=u.slice(1);c==="M"?(o+=1,[r,s]=p,r+=h?m.x:0,s+=h?m.y:0,a=r,i=s,n=[h?[c,a,i]:u]):(c==="Z"?(r=a,s=i):c==="H"?([,r]=u,r+=h?m.x:0):c==="V"?([,s]=u,s+=h?m.y:0):([r,s]=u.slice(-2),r+=h?m.x:0,s+=h?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},Je=ir;import ur from"@thednp/dommatrix";var lr=t=>{let e=new ur,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},We=lr;import cr from"@thednp/dommatrix";var pr=(t,e)=>{let n=cr.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},fr=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=pr(t,[e[0],e[1],0,1]),u=a-o,l=i-r,c=m-s;return[u*(Math.abs(s)/Math.abs(c)||1)+o,l*(Math.abs(s)/Math.abs(c)||1)+r]},ve=fr;var hr=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=T(t),l=e&&Object.keys(e);if(!e||l&&!l.length)return u.slice(0);e.origin||Object.assign(e,{origin:O.origin});let c=e.origin,f=We(e);return f.isIdentity?u.slice(0):M(u,(h,p,b,d)=>{[m]=h;let S=m.toUpperCase(),y=S!==m?U(h,p,b,d):h.slice(0),g=S==="A"?["C"].concat(ge(b,d,y[1],y[2],y[3],y[4],y[5],y[6],y[7])):S==="V"?["L",b,y[1]]:S==="H"?["L",y[1],d]:y;m=g[0];let x=m==="C"&&g.length>7,C=x?g.slice(0,7):g.slice(0);if(x&&(u.splice(p+1,0,["C"].concat(g.slice(7))),g=C),m==="L"){[r,s]=ve(f,[g[1],g[2]],c);n!==r&&o!==s?g=["L",r,s]:o===s?g=["H",r]:n===r&&(g=["V",s])}else for(a=1,i=g.length;a{let n=T(t),o=n.slice(0),r=F(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=F(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=F(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:l})=>l<=e)},Se=br;var gr=(t,e)=>{let n=T(t),o=J(n),r=F(o),s=g=>{let x=g.x-e.x,C=g.y-e.y;return x*x+C*C},a=8,i,m={x:0,y:0},u=0,l=0,c=1/0;for(let g=0;g<=r;g+=a)i=ne(o,g),u=s(i),u1e-6&&(p=l-a,f=ne(o,p),d=s(f),b=l+a,h=ne(o,b),S=s(h),p>=0&&doe(t,e).closest,dr=yr;var xr=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,Pr=t=>{let e=0,n=0,o=0;return re(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=xr(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},Ye=Pr;var Sr=t=>Ye(re(t))>=0,Ar=Sr;var Cr=(t,e)=>Se(t,e).segment,Tr=Cr;var Mr=(t,e)=>oe(t,e).segment,Lr=Mr;var vr=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return G[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,ae=vr;var Nr=t=>ae(t)&&t.every(([e])=>e===e.toUpperCase()),et=Nr;var wr=t=>et(t)&&t.every(([e])=>"ACLMQZ".includes(e)),tt=wr;var kr=t=>tt(t)&&t.every(([e])=>"MC".includes(e)),zr=kr;var Rr=(t,e)=>{let{distance:n}=oe(t,e);return Math.abs(n)ae(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),qr=Qr;var Dr=t=>{if(typeof t!="string"||!t.length)return!1;let e=new W(t);for(_(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Ne=Or;var Ir=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},$r=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},jr=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},Hr=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},Zr=t=>{let e=Object.keys(se),n=Ne(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${z}: "${o}" is not SVGElement`);let r=n?o:t.type,s=se[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=Br(a):r==="ellipse"?i=jr(a):["polyline","polygon"].includes(r)?i=$r(a):r==="rect"?i=Hr(a):r==="line"?i=Ir(a):["glyph","path"].includes(r)&&(i=T(n?t.getAttribute("d")||"":t.d||"")),ae(i)&&i.length?i:!1},nt=Zr;var Gr=(t,e,n)=>{let o=n||document,r=Object.keys(se),s=Ne(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${z}: "${a}" is already SVGPathElement`);if(a&&r.every(p=>a!==p))throw TypeError(`${z}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=se[m],l={type:m},c=O.round,f=nt(t),h=f&&f.length?ye(f,c):"";return s?(u.forEach(p=>{l[p]=t.getAttribute(p)}),Object.values(t.attributes).forEach(({name:p,value:b})=>{u.includes(p)||i.setAttribute(p,b)})):(Object.assign(l,t),Object.keys(l).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,b=>`-${b.toLowerCase()}`),l[p])})),rt(h)?(i.setAttribute("d",h),e&&s&&(t.before(i,t),t.remove()),i):!1},_r=Gr;var Ur=t=>{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},Kr=Ur;var Fr=(t,e)=>{let{round:n}=O;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):M(t,o=>pe(o,n))},Jr=Fr;var Wr=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=I(o,r,n),m=I(r,s,n),u=I(s,a,n),l=I(i,m,n),c=I(m,u,n),f=I(l,c,n);return[["C",i[0],i[1],l[0],l[1],f[0],f[1]],["C",c[0],c[1],u[0],u[1],a[0],a[1]]]},Xr=Wr;var ot=class{constructor(e,n){let o=n||{},r=typeof e>"u";if(r||!e.length)throw TypeError(`${z}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=T(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=O.round;let m=O.origin;if(Array.isArray(a)&&a.length>=2){let[u,l,c]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(l)?0:l,Number.isNaN(c)?0:c]}return this.round=i,this.origin=m,this}get bbox(){return Ue(this.segments)}get length(){return F(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return ne(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=ee(e),this}toRelative(){let{segments:e}=this;return this.segments=Oe(e),this}toCurve(){let{segments:e}=this;return this.segments=re(e),this}reverse(e){let{segments:n}=this,o=Je(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?Pe(i):i.slice(0):Pe(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:Pe(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=J(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=Fe(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,l]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,l||s]}else a.origin=[o,r,s];return this.segments=Xe(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return ye(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}},om=ot;export{um as CSSMatrix,U as absolutizeSegment,ge as arcToCubic,om as default,ce as distanceEpsilon,z as error,Ae as finalizeSegment,dr as getClosestPoint,Ar as getDrawDirection,Ye as getPathArea,Ue as getPathBBox,ne as getPointAtLength,Se as getPropertiesAtLength,oe as getPropertiesAtPoint,We as getSVGMatrix,Tr as getSegmentAtLength,Lr as getSegmentOfPoint,F as getTotalLength,H as invalidPathValue,et as isAbsoluteArray,De as isArcCommand,zr as isCurveArray,j as isDigit,qe as isDigitStart,Ee as isMoveCommand,tt as isNormalizedArray,ae as isPathArray,Qe as isPathCommand,Vr as isPointInStroke,qr as isRelativeArray,Ve as isSpace,rt as isValidPath,M as iterate,Ce as lineToCubic,J as normalizePath,te as normalizeSegment,Fe as optimizePath,G as paramsCount,K as paramsParser,T as parsePathString,W as pathParser,ee as pathToAbsolute,re as pathToCurve,Oe as pathToRelative,ye as pathToString,ve as projection2d,Ie as quadToCubic,he as relativizeSegment,Kr as reverseCurve,Pe as reversePath,Jr as roundPath,pe as roundSegment,ze as scanFlag,Re as scanParam,fe as scanSegment,$e as segmentToCubic,se as shapeParams,_r as shapeToPath,nt as shapeToPathArray,Ke as shortenSegment,_ as skipSpaces,Xr as splitCubic,Je as splitPath,Xe as transformPath}; +import un from"@thednp/dommatrix";var Bt=(t,e,n)=>{let[o,r]=t,[s,a]=e;return[o+(s-o)*n,r+(a-r)*n]},E=Bt;var $t=(t,e)=>Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),re=$t;var ce=(t,e,n,o)=>re([t,e],[n,o]),Le=(t,e,n,o,r)=>{let s={x:t,y:e};if(typeof r=="number"){let a=re([t,e],[n,o]);if(r<=0)s={x:t,y:e};else if(r>=a)s={x:n,y:o};else{let[i,m]=E([t,e],[n,o],r/a);s={x:i,y:m}}}return s},Ge=(t,e,n,o)=>{let{min:r,max:s}=Math;return[r(t,n),r(e,o),s(t,n),s(e,o)]},ot={getLineBBox:Ge,getLineLength:ce,getPointAtLineLength:Le};var st=(t,e,n)=>{let o=n/2,r=Math.sin(o),s=Math.cos(o),a=t**2*r**2,i=e**2*s**2,m=Math.sqrt(a+i)*n;return Math.abs(m)},pe=(t,e,n,o,r,s)=>{let{sin:a,cos:i}=Math,m=i(r),u=a(r),l=n*i(s),c=o*a(s);return[t+m*l-u*c,e+u*l+m*c]},at=(t,e)=>{let{x:n,y:o}=t,{x:r,y:s}=e,a=n*r+o*s,i=Math.sqrt((n**2+o**2)*(r**2+s**2));return(n*s-o*r<0?-1:1)*Math.acos(a/i)},_e=(t,e,n,o,r,s,a,i,m)=>{let{abs:u,sin:l,cos:c,sqrt:f,PI:g}=Math,p=u(n),h=u(o),S=(r%360+360)%360*(g/180);if(t===i&&e===m)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:i,y:m}};if(p===0||h===0)return{rx:p,ry:h,startAngle:0,endAngle:0,center:{x:(i+t)/2,y:(m+e)/2}};let A=(t-i)/2,d=(e-m)/2,b={x:c(S)*A+l(S)*d,y:-l(S)*A+c(S)*d},P=b.x**2/p**2+b.y**2/h**2;P>1&&(p*=f(P),h*=f(P));let C=p**2*h**2-p**2*b.y**2-h**2*b.x**2,V=p**2*b.y**2+h**2*b.x**2,k=C/V;k=k<0?0:k;let w=(s!==a?1:-1)*f(k),v={x:w*(p*b.y/h),y:w*(-(h*b.x)/p)},j={x:c(S)*v.x-l(S)*v.y+(t+i)/2,y:l(S)*v.x+c(S)*v.y+(e+m)/2},ue={x:(b.x-v.x)/p,y:(b.y-v.y)/h},q=at({x:1,y:0},ue),x={x:(-b.x-v.x)/p,y:(-b.y-v.y)/h},Q=at(ue,x);!a&&Q>0?Q-=2*g:a&&Q<0&&(Q+=2*g),Q%=2*g;let H=q+Q;return{center:j,startAngle:q,endAngle:H,rx:p,ry:h}},ve=(t,e,n,o,r,s,a,i,m)=>{let{rx:u,ry:l,startAngle:c,endAngle:f}=_e(t,e,n,o,r,s,a,i,m);return st(u,l,f-c)},mt=(t,e,n,o,r,s,a,i,m,u)=>{let l={x:t,y:e},{center:c,rx:f,ry:g,startAngle:p,endAngle:h}=_e(t,e,n,o,r,s,a,i,m);if(typeof u=="number"){let y=st(f,g,h-p);if(u<=0)l={x:t,y:e};else if(u>=y)l={x:i,y:m};else{if(t===i&&e===m)return{x:i,y:m};if(f===0||g===0)return Le(t,e,i,m,u);let{PI:S,cos:A,sin:d}=Math,b=h-p,C=(r%360+360)%360*(S/180),V=p+b*(u/y),k=f*A(V),w=g*d(V);l={x:A(C)*k-d(C)*w+c.x,y:d(C)*k+A(C)*w+c.y}}}return l},it=(t,e,n,o,r,s,a,i,m)=>{let{center:u,rx:l,ry:c,startAngle:f,endAngle:g}=_e(t,e,n,o,r,s,a,i,m),p=g-f,{min:h,max:y,tan:S,atan2:A,PI:d}=Math,{x:b,y:P}=u,C=r*d/180,V=S(C),k=A(-c*V,l),w=k,v=k+d,j=A(c,l*V),ue=j+d,q=[i],x=[m],Q=h(t,i),H=y(t,i),O=h(e,m),W=y(e,m),ye=g-p*1e-5,le=pe(b,P,l,c,C,ye),N=g-p*.99999,D=pe(b,P,l,c,C,N);if(le[0]>H||D[0]>H){let z=pe(b,P,l,c,C,w);q.push(z[0]),x.push(z[1])}if(le[0]W||D[1]>W){let z=pe(b,P,l,c,C,j);q.push(z[0]),x.push(z[1])}return Q=h.apply([],q),O=h.apply([],x),H=y.apply([],q),W=y.apply([],x),[Q,O,H,W]},ut={angleBetween:at,arcLength:st,arcPoint:pe,getArcBBox:it,getArcLength:ve,getArcProps:_e,getPointAtArcLength:mt};var lt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],zt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],Vt=t=>{let e=[];for(let n=t,o=n.length,r=o-1;o>1;o-=1,r-=1){let s=[];for(let a=0;a{if(e===0)return t[0].t=0,t[0];let n=t.length-1;if(e===1)return t[n].t=1,t[n];let o=1-e,r=t;if(n===0)return t[0].t=e,t[0];if(n===1)return{x:o*r[0].x+e*r[1].x,y:o*r[0].y+e*r[1].y,t:e};let s=o*o,a=e*e,i=0,m=0,u=0,l=0;return n===2?(r=[r[0],r[1],r[2],{x:0,y:0}],i=s,m=o*e*2,u=a):n===3&&(i=s*o,m=s*e*3,u=o*a*3,l=e*a),{x:i*r[0].x+m*r[1].x+u*r[2].x+l*r[3].x,y:i*r[0].y+m*r[1].y+u*r[2].y+l*r[3].y,t:e}},kt=(t,e)=>{let n=t(e),o=n.x*n.x+n.y*n.y;return Math.sqrt(o)},qt=t=>{let n=lt.length,o=0;for(let r=0,s;r{let e=[];for(let o=0,r=t.length,s=2;oRt(n[0],o))},Qt=1e-8,Ne=([t,e,n])=>{let o=Math.min(t,n),r=Math.max(t,n);if(e>=t?n>=e:n<=e)return[o,r];let s=(t*n-e*e)/(t-2*e+n);return s{let r=t-3*e+3*n-o;if(Math.abs(r)0&&l<1){let f=t*(1-l)*(1-l)*(1-l)+e*3*(1-l)*(1-l)*l+n*3*(1-l)*l*l+o*l*l*l;fm&&(m=f)}}return[i,m]},ct={bezierLength:qt,calculateBezier:kt,CBEZIER_MINMAX_EPSILON:Qt,computeBezier:Rt,Cvalues:zt,deriveBezier:Vt,getBezierLength:fe,minmaxC:Ue,minmaxQ:Ne,Tvalues:lt};var Dt=([t,e,n,o,r,s,a,i],m)=>{let u=1-m;return{x:u**3*t+3*u**2*m*n+3*u*m**2*r+m**3*a,y:u**3*e+3*u**2*m*o+3*u*m**2*s+m**3*i}},Pe=(t,e,n,o,r,s,a,i)=>fe([t,e,n,o,r,s,a,i]),pt=(t,e,n,o,r,s,a,i,m)=>{let u=typeof m=="number",l={x:t,y:e};if(u){let c=fe([t,e,n,o,r,s,a,i]);m<=0||(m>=c?l={x:a,y:i}:l=Dt([t,e,n,o,r,s,a,i],m/c))}return l},Fe=(t,e,n,o,r,s,a,i)=>{let m=Ue([t,n,r,a]),u=Ue([e,o,s,i]);return[m[0],u[0],m[1],u[1]]},ft={getCubicBBox:Fe,getCubicLength:Pe,getPointAtCubicLength:pt,getPointAtCubicSegmentLength:Dt};var Et=([t,e,n,o,r,s],a)=>{let i=1-a;return{x:i**2*t+2*i*a*n+a**2*r,y:i**2*e+2*i*a*o+a**2*s}},xe=(t,e,n,o,r,s)=>fe([t,e,n,o,r,s]),gt=(t,e,n,o,r,s,a)=>{let i=typeof a=="number",m={x:t,y:e};if(i){let u=fe([t,e,n,o,r,s]);a<=0||(a>=u?m={x:r,y:s}:m=Et([t,e,n,o,r,s],a/u))}return m},Ke=(t,e,n,o,r,s)=>{let a=Ne([t,n,r]),i=Ne([e,o,s]);return[a[0],i[0],a[1],i[1]]},ht={getPointAtQuadLength:gt,getPointAtQuadSegmentLength:Et,getQuadBBox:Ke,getQuadLength:xe};var jt=t=>{let e=t.length,n=-1,o,r=t[e-1],s=0;for(;++nt.reduce((e,n,o)=>o?e+re(t[o-1],n):0,0),bt={polygonArea:jt,polygonLength:Ht};var Zt=(t,e,n)=>{let{sin:o,cos:r}=Math,s=t*r(n)-e*o(n),a=t*o(n)+e*r(n);return{x:s,y:a}},ne=Zt;var Gt=(t,e)=>{let n=e>=1?10**e:1;return e>0?Math.round(t*n)/n:Math.round(t)},M=Gt;var _t={origin:[0,0,0],round:4},I=_t;var Ut={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Z=Ut;var Ft=t=>{let e=t.pathValue[t.segmentStart],n=e.toLowerCase(),{data:o}=t;for(;o.length>=Z[n]&&(n==="m"&&o.length>2?(t.segments.push([e].concat(o.splice(0,2))),n="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(o.splice(0,Z[n]))),!!Z[n]););},Se=Ft;var Kt="SVGPathCommander Error",R=Kt;var Jt=t=>{let{index:e,pathValue:n}=t,o=n.charCodeAt(e);if(o===48){t.param=0,t.index+=1;return}if(o===49){t.param=1,t.index+=1;return}t.err=`${R}: invalid Arc flag "${n[e]}", expecting 0 or 1 at index ${e}`},we=Jt;var Wt=t=>t>=48&&t<=57,B=Wt;var Xt="Invalid path value",$=Xt;var Yt=t=>{let{max:e,pathValue:n,index:o}=t,r=o,s=!1,a=!1,i=!1,m=!1,u;if(r>=e){t.err=`${R}: ${$} at index ${r}, "pathValue" is missing param`;return}if(u=n.charCodeAt(r),(u===43||u===45)&&(r+=1,u=n.charCodeAt(r)),!B(u)&&u!==46){t.err=`${R}: ${$} at index ${r}, "${n[r]}" is not a number`;return}if(u!==46){if(s=u===48,r+=1,u=n.charCodeAt(r),s&&r[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),Ve=er;var tr=t=>{let{pathValue:e,max:n}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Re=rr;var nr=t=>B(t)||t===43||t===45||t===46,ke=nr;var or=t=>(t|32)===97,qe=or;var ar=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},Qe=ar;var sr=t=>{let{max:e,pathValue:n,index:o,segments:r}=t,s=n.charCodeAt(o),a=Z[n[o].toLowerCase()];if(t.segmentStart=o,!Re(s)){t.err=`${R}: ${$} "${n[o]}" is not a path command at index ${o}`;return}let i=r[r.length-1];if(!Qe(s)&&i?.[0]?.toLocaleLowerCase()==="z"){t.err=`${R}: ${$} "${n[o]}" is not a MoveTo path command at index ${o}`;return}if(t.index+=1,G(t),t.data=[],!a){Se(t);return}for(;;){for(let m=a;m>0;m-=1){if(qe(s)&&(m===3||m===4)?we(t):ze(t),t.err.length)return;t.data.push(t.param),G(t),t.index=t.max||!ke(n.charCodeAt(t.index)))break}Se(t)},ge=sr;var F=class{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}};var mr=t=>{if(typeof t!="string")return t.slice(0);let e=new F(t);for(G(e);e.index{let[r]=t,s=r.toUpperCase(),a=s===r;if(e===0||a)return t;if(s==="A")return[s,t[1],t[2],t[3],t[4],t[5],t[6]+n,t[7]+o];if(s==="V")return[s,t[1]+o];if(s==="H")return[s,t[1]+n];if(s==="L")return[s,t[1]+n,t[2]+o];{let i=[],m=t.length;for(let u=1;u{let n=t.length,o,r="M",s="M",a=!1,i=0,m=0,u=0,l=0,c=0;for(let f=0;f{let e=L(t);return T(e,_)},oe=lr;var cr=(t,e,n,o)=>{let[r]=t,s=r.toLowerCase(),a=r===s;if(e===0||a)return t;if(s==="a")return[s,t[1],t[2],t[3],t[4],t[5],t[6]-n,t[7]-o];if(s==="v")return[s,t[1]-o];if(s==="h")return[s,t[1]-n];if(s==="l")return[s,t[1]-n,t[2]-o];{let i=[],m=t.length;for(let u=1;u{let e=L(t);return T(e,he)},Je=pr;var Ot=(t,e,n,o,r,s,a,i,m,u)=>{let l=t,c=e,f=n,g=o,p=i,h=m,y=Math.PI*120/180,S=Math.PI/180*(+r||0),A=[],d,b,P,C,V;if(u)[b,P,C,V]=u;else{d=ne(l,c,-S),l=d.x,c=d.y,d=ne(p,h,-S),p=d.x,h=d.y;let N=(l-p)/2,D=(c-h)/2,z=N*N/(f*f)+D*D/(g*g);z>1&&(z=Math.sqrt(z),f*=z,g*=z);let rt=f*f,nt=g*g,wt=(s===a?-1:1)*Math.sqrt(Math.abs((rt*nt-rt*D*D-nt*N*N)/(rt*D*D+nt*N*N)));C=wt*f*D/g+(l+p)/2,V=wt*-g*N/f+(c+h)/2,b=Math.asin(((c-V)/g*10**9>>0)/10**9),P=Math.asin(((h-V)/g*10**9>>0)/10**9),b=lP&&(b-=Math.PI*2),!a&&P>b&&(P-=Math.PI*2)}let k=P-b;if(Math.abs(k)>y){let N=P,D=p,z=h;P=b+y*(a&&P>b?1:-1),p=C+f*Math.cos(P),h=V+g*Math.sin(P),A=Ot(p,h,f,g,r,0,a,D,z,[P,N,C,V])}k=P-b;let w=Math.cos(b),v=Math.sin(b),j=Math.cos(P),ue=Math.sin(P),q=Math.tan(k/4),x=4/3*f*q,Q=4/3*g*q,H=[l,c],O=[l+x*v,c-Q*w],W=[p+x*ue,h-Q*j],ye=[p,h];if(O[0]=2*H[0]-O[0],O[1]=2*H[1]-O[1],u)return[O[0],O[1],W[0],W[1],ye[0],ye[1]].concat(A);A=[O[0],O[1],W[0],W[1],ye[0],ye[1]].concat(A);let le=[];for(let N=0,D=A.length;N{let a=.3333333333333333,i=2/3;return[a*t+i*n,a*e+i*o,a*r+i*n,a*s+i*o,r,s]},De=fr;var gr=(t,e,n,o)=>{let r=E([t,e],[n,o],.3333333333333333),s=E([t,e],[n,o],2/3);return[r[0],r[1],s[0],s[1],n,o]},Ae=gr;var hr=(t,e)=>{let[n]=t,o=t.slice(1).map(Number),[r,s]=o,{x1:a,y1:i,x:m,y:u}=e;return"TQ".includes(n)||(e.qx=null,e.qy=null),n==="M"?(e.x=r,e.y=s,t):n==="A"?["C"].concat(be(a,i,o[0],o[1],o[2],o[3],o[4],o[5],o[6])):n==="Q"?(e.qx=r,e.qy=s,["C"].concat(De(a,i,o[0],o[1],o[2],o[3]))):n==="L"?["C"].concat(Ae(a,i,r,s)):n==="Z"?["C"].concat(Ae(a,i,m,u)):t},Ee=hr;var br=(t,e)=>{let[n]=t,o=n.toUpperCase(),r=n!==o,{x1:s,y1:a,x2:i,y2:m,x:u,y:l}=e,c=t.slice(1),f=c.map((g,p)=>g+(r?p%2?l:u:0));"TQ".includes(o)||(e.qx=null,e.qy=null);if(o==="A")return f=c.slice(0,-2).concat(c[5]+(r?u:0),c[6]+(r?l:0)),["A"].concat(f);if(o==="H")return["L",t[1]+(r?u:0),a];if(o==="V")return["L",s,t[1]+(r?l:0)];if(o==="L")return["L",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="M")return["M",t[1]+(r?u:0),t[2]+(r?l:0)];if(o==="C")return["C"].concat(f);if(o==="S"){let g=s*2-i,p=a*2-m;return e.x1=g,e.y1=p,["C",g,p].concat(f)}else if(o==="T"){let g=s*2-(e.qx?e.qx:0),p=a*2-(e.qy?e.qy:0);return e.qx=g,e.qy=p,["Q",g,p].concat(f)}else if(o==="Q"){let[g,p]=f;return e.qx=g,e.qy=p,["Q"].concat(f)}else if(o==="Z")return["Z"];return t},X=br;var dr={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},U=dr;var yr=t=>{let e={...U},n=L(t);return T(n,(o,r,s,a)=>{e.x=s,e.y=a;let i=X(o,e),m=Ee(i,e);m[0]==="C"&&m.length>7&&(n.splice(r+1,0,["C"].concat(m.slice(7))),m=m.slice(0,7));let l=m.length;return e.x1=+m[l-2],e.y1=+m[l-1],e.x2=+m[l-4]||e.x1,e.y2=+m[l-3]||e.y1,m})},ae=yr;var Pr=(t,e)=>{let n=t.length,{round:o}=I,r=t[0],s="";o=e==="off"||typeof e=="number"&&e>=0?e:typeof o=="number"&&o>=0?o:"off";for(let a=0;a{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};let e=L(t),n="M",o=0,r=0,{max:s,min:a}=Math,i=1/0,m=1/0,u=-1/0,l=-1/0,c=0,f=0,g=0,p=0,h=0,y=0,S=0,A=0,d=0,b=0;T(e,(V,k,w,v)=>{[n]=V;let j=n.toUpperCase(),q=j!==n?_(V,k,w,v):V.slice(0),x=j==="V"?["L",w,q[1]]:j==="H"?["L",q[1],v]:q;[n]=x,"TQ".includes(j)||(d=0,b=0);if(n==="M")[,o,r]=x,c=o,f=r,g=o,p=r;else if(n==="L")[c,f,g,p]=Ge(w,v,x[1],x[2]);else if(n==="A")[c,f,g,p]=it(w,v,x[1],x[2],x[3],x[4],x[5],x[6],x[7]);else if(n==="S"){let Q=h*2-S,H=y*2-A;[c,f,g,p]=Fe(w,v,Q,H,x[1],x[2],x[3],x[4])}else n==="C"?[c,f,g,p]=Fe(w,v,x[1],x[2],x[3],x[4],x[5],x[6]):n==="T"?(d=h*2-d,b=y*2-b,[c,f,g,p]=Ke(w,v,d,b,x[1],x[2])):n==="Q"?(d=x[1],b=x[2],[c,f,g,p]=Ke(w,v,x[1],x[2],x[3],x[4])):n==="Z"&&([c,f,g,p]=Ge(w,v,o,r));i=a(c,i),m=a(f,m),u=s(g,u),l=s(p,l),[h,y]=n==="Z"?[o,r]:x.slice(-2),[S,A]=n==="C"?[x[3],x[4]]:n==="S"?[x[1],x[2]]:[h,y]});let P=u-i,C=l-m;return{width:P,height:C,x:i,y:m,x2:u,y2:l,cx:i+P/2,cy:m+C/2,cz:Math.max(P,C)+Math.min(P,C)/2}},We=xr;var Sr=t=>{let e=L(t),n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=0,l=0,c=0;return T(e,(f,g,p,h)=>{[m]=f;let y=m.toUpperCase(),A=y!==m?_(f,g,p,h):f.slice(0),d=y==="V"?["L",p,A[1]]:y==="H"?["L",A[1],h]:A;[m]=d,"TQ".includes(y)||(a=0,i=0);if(m==="M")[,u,l]=d;else if(m==="L")c+=ce(p,h,d[1],d[2]);else if(m==="A")c+=ve(p,h,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(m==="S"){let b=n*2-r,P=o*2-s;c+=Pe(p,h,b,P,d[1],d[2],d[3],d[4])}else m==="C"?c+=Pe(p,h,d[1],d[2],d[3],d[4],d[5],d[6]):m==="T"?(a=n*2-a,i=o*2-i,c+=xe(p,h,a,i,d[1],d[2])):m==="Q"?(a=d[1],i=d[2],c+=xe(p,h,d[1],d[2],d[3],d[4])):m==="Z"&&(c+=ce(p,h,u,l));[n,o]=m==="Z"?[u,l]:d.slice(-2),[r,s]=m==="C"?[d[3],d[4]]:m==="S"?[d[1],d[2]]:[n,o]}),c},K=Sr;var se=1e-5;var Ar=t=>{let e=L(t),n={...U};return T(e,(o,r,s,a)=>{n.x=s,n.y=a;let i=X(o,n),m=i.length;return n.x1=+i[m-2],n.y1=+i[m-1],n.x2=+i[m-4]||n.x1,n.y2=+i[m-3]||n.y1,i})},J=Ar;var Cr=(t,e)=>{let n=J(t),o=!1,r=[],s="M",a=0,i=0,[m,u]=n[0].slice(1),l=typeof e=="number",c={x:m,y:u},f=0,g=c,p=0;return!l||e{[s]=h,o=s==="M",r=o?r:[S,A].concat(h.slice(1));if(o?([,m,u]=h,c={x:m,y:u},f=0):s==="L"?(c=Le(r[0],r[1],r[2],r[3],e-p),f=ce(r[0],r[1],r[2],r[3])):s==="A"?(c=mt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],e-p),f=ve(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8])):s==="C"?(c=pt(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],e-p),f=Pe(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7])):s==="Q"?(c=gt(r[0],r[1],r[2],r[3],r[4],r[5],e-p),f=xe(r[0],r[1],r[2],r[3],r[4],r[5])):s==="Z"&&(r=[S,A,m,u],c={x:m,y:u},f=ce(r[0],r[1],r[2],r[3])),[a,i]=r.slice(-2),pp-se?{x:a,y:i}:g)},me=Cr;var Tr=(t,e)=>{let n=L(t),o=n.slice(0),r=K(o),s=o.length-1,a=0,i=0,m=n[0];if(s<=0||!e||!Number.isFinite(e))return{segment:m,index:0,length:i,lengthAtSegment:a};if(e>=r)return o=n.slice(0,-1),a=K(o),i=r-a,m=n[s],{segment:m,index:s,length:i,lengthAtSegment:a};let u=[];for(;s>0;)m=o[s],o=o.slice(0,-1),a=K(o),i=r-a,r=a,u.push({segment:m,index:s,length:i,lengthAtSegment:a}),s-=1;return u.find(({lengthAtSegment:l})=>l<=e)},de=Tr;var Mr=(t,e)=>{let n=L(t),o=J(n),r=K(o),s=b=>{let P=b.x-e.x,C=b.y-e.y;return P*P+C*C},a=8,i,m={x:0,y:0},u=0,l=0,c=1/0;for(let b=0;b<=r;b+=a)i=me(o,b),u=s(i),u1e-6&&(p=l-a,f=me(o,p),y=s(f),h=l+a,g=me(o,h),S=s(g),p>=0&&yY(t,e).closest,dt=Lr;var vr=(t,e,n,o,r,s,a,i)=>3*((i-e)*(n+r)-(a-t)*(o+s)+o*(t-r)-n*(e-s)+i*(r+t/3)-a*(s+e/3))/20,Nr=t=>{let e=0,n=0,o=0;return ae(t).map(r=>{switch(r[0]){case"M":return[,e,n]=r,0;default:return o=vr(e,n,r[1],r[2],r[3],r[4],r[5],r[6]),[e,n]=r.slice(-2),o}}).reduce((r,s)=>r+s,0)},Oe=Nr;var wr=t=>Oe(ae(t))>=0,yt=wr;var zr=(t,e)=>de(t,e).segment,Pt=zr;var Vr=(t,e)=>Y(t,e).segment,xt=Vr;var Rr=t=>Array.isArray(t)&&t.every(e=>{let n=e[0].toLowerCase();return Z[n]===e.length-1&&"achlmqstvz".includes(n)&&e.slice(1).every(Number.isFinite)})&&t.length>0,ee=Rr;var kr=t=>ee(t)&&t.every(([e])=>e===e.toUpperCase()),Ie=kr;var qr=t=>Ie(t)&&t.every(([e])=>"ACLMQZ".includes(e)),Be=qr;var Qr=t=>Be(t)&&t.every(([e])=>"MC".includes(e)),St=Qr;var Dr=(t,e)=>{let{distance:n}=Y(t,e);return Math.abs(n)ee(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),Ct=Er;var Or=t=>{if(typeof t!="string"||!t.length)return!1;let e=new F(t);for(G(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Xe=Br;var $r=t=>{let{x1:e,y1:n,x2:o,y2:r}=t;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e,n],["L",o,r]]},jr=t=>{let e=[],n=(t.points||"").trim().split(/[\s|,]/).map(r=>+r),o=0;for(;o{let{cx:e,cy:n,r:o}=t;return[e,n,o]=[e,n,o].map(r=>+r),[["M",e-o,n],["a",o,o,0,1,0,2*o,0],["a",o,o,0,1,0,-2*o,0]]},Zr=t=>{let{cx:e,cy:n}=t,o=t.rx||0,r=t.ry||o;return[e,n,o,r]=[e,n,o,r].map(s=>+s),[["M",e-o,n],["a",o,r,0,1,0,2*o,0],["a",o,r,0,1,0,-2*o,0]]},Gr=t=>{let e=+t.x||0,n=+t.y||0,o=+t.width,r=+t.height,s=+(t.rx||0),a=+(t.ry||s);if(s||a){s*2>o&&(s-=(s*2-o)/2);return a*2>r&&(a-=(a*2-r)/2),[["M",e+s,n],["h",o-s*2],["s",s,0,s,a],["v",r-a*2],["s",0,a,-s,a],["h",-o+s*2],["s",-s,0,-s,-a],["v",-r+a*2],["s",0,-a,s,-a]]}return[["M",e,n],["h",o],["v",r],["H",e],["Z"]]},_r=t=>{let e=Object.keys(te),n=Xe(t),o=n?t.tagName:null;if(o&&[...e,"path"].every(m=>o!==m))throw TypeError(`${R}: "${o}" is not SVGElement`);let r=n?o:t.type,s=te[r],a={type:r};n?s.forEach(m=>{a[m]=t.getAttribute(m)}):Object.assign(a,t);let i=[];return r==="circle"?i=Hr(a):r==="ellipse"?i=Zr(a):["polyline","polygon"].includes(r)?i=jr(a):r==="rect"?i=Gr(a):r==="line"?i=$r(a):["glyph","path"].includes(r)&&(i=L(n?t.getAttribute("d")||"":t.d||"")),ee(i)&&i.length?i:!1},je=_r;var Ur=(t,e,n)=>{let o=n||document,r=Object.keys(te),s=Xe(t),a=s?t.tagName:null;if(a==="path")throw TypeError(`${R}: "${a}" is already SVGPathElement`);if(a&&r.every(p=>a!==p))throw TypeError(`${R}: "${a}" is not SVGElement`);let i=o.createElementNS("http://www.w3.org/2000/svg","path"),m=s?a:t.type,u=te[m],l={type:m},c=I.round,f=je(t),g=f&&f.length?Ce(f,c):"";return s?(u.forEach(p=>{l[p]=t.getAttribute(p)}),Object.values(t.attributes).forEach(({name:p,value:h})=>{u.includes(p)||i.setAttribute(p,h)})):(Object.assign(l,t),Object.keys(l).forEach(p=>{!u.includes(p)&&p!=="type"&&i.setAttribute(p.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`),l[p])})),$e(g)?(i.setAttribute("d",g),e&&s&&(t.before(i,t),t.remove()),i):!1},Tt=Ur;var Fr=(t,e,n,o)=>{let[r]=t,{round:s}=I,a=typeof s=="number"?s:4,i=e.slice(1),{x1:m,y1:u,x2:l,y2:c,x:f,y:g}=n,[p,h]=i.slice(-2),y=t;if("TQ".includes(r)||(n.qx=null,n.qy=null),r==="L"){if(M(f,a)===M(p,a))return["V",h];if(M(g,a)===M(h,a))return["H",p]}else if(r==="C"){let[S,A]=i;if(n.x1=S,n.y1=A,"CS".includes(o)&&(M(S,a)===M(m*2-l,a)&&M(A,a)===M(u*2-c,a)||M(m,a)===M(l*2-f,a)&&M(u,a)===M(c*2-g,a)))return["S",i[2],i[3],i[4],i[5]]}else if(r==="Q"){let[S,A]=i;if(n.qx=S,n.qy=A,"QT".includes(o)&&M(S,a)===M(m*2-l,a)&&M(A,a)===M(u*2-c,a))return["T",i[2],i[3]]}return y},He=Fr;var Kr=(t,e)=>{let n=t.slice(1).map(o=>M(o,e));return[t[0]].concat(n)},ie=Kr;var Jr=(t,e)=>{let n=oe(t),o=typeof e=="number"&&e>=0?e:2,r={...U},s=[],a="M",i="Z";return T(n,(m,u,l,c)=>{r.x=l,r.y=c;let f=X(m,r),g=m;if([a]=m,s[u]=a,u){i=s[u-1];let h=He(m,f,r,i),y=ie(h,o),S=y.join(""),A=he(h,u,l,c),d=ie(A,o),b=d.join("");g=S.length{let e=oe(t),n=J(e),o=e.length,r=e[o-1][0]==="Z",s=T(e,(a,i)=>{let m=n[i],u=i&&e[i-1],l=u&&u[0],c=e[i+1],f=c&&c[0],[g]=a,[p,h]=n[i?i-1:o-1].slice(-2),y=a;switch(g){case"M":y=r?["Z"]:[g,p,h];break;case"A":y=[g,a[1],a[2],a[3],a[4],a[5]===1?0:1,p,h];break;case"C":c&&f==="S"?y=["S",a[1],a[2],p,h]:y=[g,a[3],a[4],a[1],a[2],p,h];break;case"S":l&&"CS".includes(l)&&(!c||f!=="S")?y=["C",m[3],m[4],m[1],m[2],p,h]:y=[g,m[1],m[2],p,h];break;case"Q":c&&f==="T"?y=["T",p,h]:y=[g,a[1],a[2],p,h];break;case"T":l&&"QT".includes(l)&&(!c||f!=="T")?y=["Q",m[1],m[2],p,h]:y=[g,p,h];break;case"Z":y=["M",p,h];break;case"H":y=[g,p];break;case"V":y=[g,h];break;default:y=[g].concat(a.slice(1,-2),p,h)}return y});return r?s.reverse():[s[0]].concat(s.slice(1).reverse())},Te=Wr;var Xr=t=>{let e=[],n,o=-1,r=0,s=0,a=0,i=0,m={...U};return t.forEach(u=>{let[l]=u,c=l.toUpperCase(),f=l.toLowerCase(),g=l===f,p=u.slice(1);c==="M"?(o+=1,[r,s]=p,r+=g?m.x:0,s+=g?m.y:0,a=r,i=s,n=[g?[c,a,i]:u]):(c==="Z"?(r=a,s=i):c==="H"?([,r]=u,r+=g?m.x:0):c==="V"?([,s]=u,s+=g?m.y:0):([r,s]=u.slice(-2),r+=g?m.x:0,s+=g?m.y:0),n.push(u)),m.x=r,m.y=s,e[o]=n}),e},et=Xr;import Yr from"@thednp/dommatrix";var en=t=>{let e=new Yr,{origin:n}=t,[o,r]=n,{translate:s}=t,{rotate:a}=t,{skew:i}=t,{scale:m}=t;return Array.isArray(s)&&s.length>=2&&s.every(u=>!Number.isNaN(+u))&&s.some(u=>u!==0)?e=e.translate(...s):typeof s=="number"&&!Number.isNaN(s)&&(e=e.translate(s)),(a||i||m)&&(e=e.translate(o,r),Array.isArray(a)&&a.length>=2&&a.every(u=>!Number.isNaN(+u))&&a.some(u=>u!==0)?e=e.rotate(...a):typeof a=="number"&&!Number.isNaN(a)&&(e=e.rotate(a)),Array.isArray(i)&&i.length===2&&i.every(u=>!Number.isNaN(+u))&&i.some(u=>u!==0)?(e=i[0]?e.skewX(i[0]):e,e=i[1]?e.skewY(i[1]):e):typeof i=="number"&&!Number.isNaN(i)&&(e=e.skewX(i)),Array.isArray(m)&&m.length>=2&&m.every(u=>!Number.isNaN(+u))&&m.some(u=>u!==1)?e=e.scale(...m):typeof m=="number"&&!Number.isNaN(m)&&(e=e.scale(m)),e=e.translate(-o,-r)),e},Ze=en;import tn from"@thednp/dommatrix";var rn=(t,e)=>{let n=tn.Translate(e[0],e[1],e[2]);return[,,,n.m44]=e,n=t.multiply(n),[n.m41,n.m42,n.m43,n.m44]},nn=(t,e,n)=>{let[o,r,s]=n,[a,i,m]=rn(t,[e[0],e[1],0,1]),u=a-o,l=i-r,c=m-s;return[u*(Math.abs(s)/Math.abs(c)||1)+o,l*(Math.abs(s)/Math.abs(c)||1)+r]},Me=nn;var on=(t,e)=>{let n=0,o=0,r=0,s=0,a=0,i=0,m="M",u=L(t),l=e&&Object.keys(e);if(!e||l&&!l.length)return u.slice(0);e.origin||Object.assign(e,{origin:I.origin});let c=e.origin,f=Ze(e);return f.isIdentity?u.slice(0):T(u,(g,p,h,y)=>{[m]=g;let S=m.toUpperCase(),d=S!==m?_(g,p,h,y):g.slice(0),b=S==="A"?["C"].concat(be(h,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):S==="V"?["L",h,d[1]]:S==="H"?["L",d[1],y]:d;m=b[0];let P=m==="C"&&b.length>7,C=P?b.slice(0,7):b.slice(0);if(P&&(u.splice(p+1,0,["C"].concat(b.slice(7))),b=C),m==="L"){[r,s]=Me(f,[b[1],b[2]],c);n!==r&&o!==s?b=["L",r,s]:o===s?b=["H",r]:n===r&&(b=["V",s])}else for(a=1,i=b.length;a{let e=t.slice(1).map((n,o,r)=>o?r[o-1].slice(-2).concat(n.slice(1)):t[0].slice(1).concat(n.slice(1))).map(n=>n.map((o,r)=>n[n.length-r-2*(1-r%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(n=>["C"].concat(n.slice(2))))},Mt=an;var sn=(t,e)=>{let{round:n}=I;n=e==="off"||typeof e=="number"&&e>=0?e:typeof n=="number"&&n>=0?n:"off";return n==="off"?t.slice(0):T(t,o=>ie(o,n))},Lt=sn;var mn=(t,e=.5)=>{let n=e,o=t.slice(0,2),r=t.slice(2,4),s=t.slice(4,6),a=t.slice(6,8),i=E(o,r,n),m=E(r,s,n),u=E(s,a,n),l=E(i,m,n),c=E(m,u,n),f=E(l,c,n);return[["C",i[0],i[1],l[0],l[1],f[0],f[1]],["C",c[0],c[1],u[0],u[1],a[0],a[1]]]},vt=mn;var Nt=class{constructor(e,n){let o=n||{},r=typeof e>"u";if(r||!e.length)throw TypeError(`${R}: "pathValue" is ${r?"undefined":"empty"}`);this.segments=L(e);let{round:s,origin:a}=o,i;Number.isInteger(s)||s==="off"?i=s:i=I.round;let m=I.origin;if(Array.isArray(a)&&a.length>=2){let[u,l,c]=a.map(Number);m=[Number.isNaN(u)?0:u,Number.isNaN(l)?0:l,Number.isNaN(c)?0:c]}return this.round=i,this.origin=m,this}get bbox(){return We(this.segments)}get length(){return K(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return me(this.segments,e)}toAbsolute(){let{segments:e}=this;return this.segments=oe(e),this}toRelative(){let{segments:e}=this;return this.segments=Je(e),this}toCurve(){let{segments:e}=this;return this.segments=ae(e),this}reverse(e){let{segments:n}=this,o=et(n),r=o.length>1?o:!1,s=r?r.map((i,m)=>e?m?Te(i):i.slice(0):Te(i)):n.slice(0),a=[];return r?a=s.flat(1):a=e?n:Te(n),this.segments=a.slice(0),this}normalize(){let{segments:e}=this;return this.segments=J(e),this}optimize(){let{segments:e}=this,n=this.round==="off"?2:this.round;return this.segments=Ye(e,n),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(m=>m in e))return this;let{segments:n,origin:[o,r,s]}=this,a={};for(let[m,u]of Object.entries(e)){m==="skew"&&Array.isArray(u)||(m==="rotate"||m==="translate"||m==="origin"||m==="scale")&&Array.isArray(u)?a[m]=u.map(Number):m!=="origin"&&typeof Number(u)=="number"&&(a[m]=Number(u))}let{origin:i}=a;if(Array.isArray(i)&&i.length>=2){let[m,u,l]=i.map(Number);a.origin=[Number.isNaN(m)?o:m,Number.isNaN(u)?r:u,l||s]}else a.origin=[o,r,s];return this.segments=tt(n,a),this}flipX(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,n,0]}),this}flipY(){let{cx:e,cy:n}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,n,0]}),this}toString(){return Ce(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}static get CSSMatrix(){return un}static get arcTools(){return ut}static get bezierTools(){return ct}static get cubicTools(){return ft}static get lineTools(){return ot}static get polygonTools(){return bt}static get quadTools(){return ht}static get pathToAbsolute(){return oe}static get pathToRelative(){return Je}static get pathToCurve(){return ae}static get pathToString(){return Ce}static get distanceSquareRoot(){return re}static get midPoint(){return E}static get rotateVector(){return ne}static get roundTo(){return M}static get parsePathString(){return L}static get finalizeSegment(){return Se}static get invalidPathValue(){return $}static get isArcCommand(){return qe}static get isDigit(){return B}static get isDigitStart(){return ke}static get isMoveCommand(){return Qe}static get isPathCommand(){return Re}static get isSpace(){return Ve}static get paramsCount(){return Z}static get paramsParser(){return U}static get pathParser(){return F}static get scanFlag(){return we}static get scanParam(){return ze}static get scanSegment(){return ge}static get skipSpaces(){return G}static get distanceEpsilon(){return se}static get getClosestPoint(){return dt}static get getDrawDirection(){return yt}static get getPathArea(){return Oe}static get getPathBBox(){return We}static get getPointAtLength(){return me}static get getPropertiesAtLength(){return de}static get getPropertiesAtPoint(){return Y}static get getSegmentAtLength(){return Pt}static get getSegmentOfPoint(){return xt}static get getTotalLength(){return K}static get isAbsoluteArray(){return Ie}static get isCurveArray(){return St}static get isNormalizedArray(){return Be}static get isPathArray(){return ee}static get isPointInStroke(){return At}static get isRelativeArray(){return Ct}static get isValidPath(){return $e}static get shapeParams(){return te}static get shapeToPath(){return Tt}static get shapeToPathArray(){return je}static get absolutizeSegment(){return _}static get arcToCubic(){return be}static get getSVGMatrix(){return Ze}static get iterate(){return T}static get lineToCubic(){return Ae}static get normalizePath(){return J}static get normalizeSegment(){return X}static get optimizePath(){return Ye}static get projection2d(){return Me}static get quadToCubic(){return De}static get relativizeSegment(){return he}static get reverseCurve(){return Mt}static get reversePath(){return Te}static get roundPath(){return Lt}static get roundSegment(){return ie}static get segmentToCubic(){return Ee}static get shortenSegment(){return He}static get splitCubic(){return vt}static get splitPath(){return et}static get transformPath(){return tt}},It=Nt;import{default as Li}from"@thednp/dommatrix";var Ci=It;export{Li as CSSMatrix,_ as absolutizeSegment,be as arcToCubic,ut as arcTools,ct as bezierTools,ft as cubicTools,Ci as default,se as distanceEpsilon,re as distanceSquareRoot,Se as finalizeSegment,dt as getClosestPoint,yt as getDrawDirection,Oe as getPathArea,We as getPathBBox,me as getPointAtLength,de as getPropertiesAtLength,Y as getPropertiesAtPoint,Ze as getSVGMatrix,Pt as getSegmentAtLength,xt as getSegmentOfPoint,K as getTotalLength,$ as invalidPathValue,Ie as isAbsoluteArray,qe as isArcCommand,St as isCurveArray,B as isDigit,ke as isDigitStart,Qe as isMoveCommand,Be as isNormalizedArray,ee as isPathArray,Re as isPathCommand,At as isPointInStroke,Ct as isRelativeArray,Ve as isSpace,$e as isValidPath,T as iterate,Ae as lineToCubic,ot as lineTools,E as midPoint,J as normalizePath,X as normalizeSegment,Ye as optimizePath,Z as paramsCount,U as paramsParser,L as parsePathString,F as pathParser,oe as pathToAbsolute,ae as pathToCurve,Je as pathToRelative,Ce as pathToString,bt as polygonTools,Me as projection2d,De as quadToCubic,ht as quadTools,he as relativizeSegment,Mt as reverseCurve,Te as reversePath,ne as rotateVector,Lt as roundPath,ie as roundSegment,M as roundTo,we as scanFlag,ze as scanParam,ge as scanSegment,Ee as segmentToCubic,te as shapeParams,Tt as shapeToPath,je as shapeToPathArray,He as shortenSegment,G as skipSpaces,vt as splitCubic,et as splitPath,tt as transformPath}; //# sourceMappingURL=svg-path-commander.mjs.map \ No newline at end of file diff --git a/dist/svg-path-commander.mjs.map b/dist/svg-path-commander.mjs.map index 6f20162..1b60c3e 100644 --- a/dist/svg-path-commander.mjs.map +++ b/dist/svg-path-commander.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/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/math/rotateVector.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/math/midPoint.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/math/roundTo.ts","../src/convert/pathToString.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/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.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/index.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/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts"],"sourcesContent":["import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\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\nexport default paramsCount;\n","import paramsCount 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 */\nconst 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 >= paramsCount[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, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./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 */\nconst 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\nexport default scanFlag;\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 */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./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 */\nconst 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};\nexport default scanParam;\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\nconst 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};\nexport default isSpace;\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 */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\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 */\nconst 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};\nexport default isPathCommand;\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 */\nconst 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};\nexport default isDigitStart;\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 */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst 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};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts 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 \"./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 */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[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) && 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 && 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};\nexport default scanSegment;\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\n */\nexport default 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 * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\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\nexport default parsePathString;\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 */\nconst 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};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n 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 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 if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\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 | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\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 */\nconst 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\nexport default relativizeSegment;\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 | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\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 */\nconst 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\nexport default rotateVector;\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 * @return the resulting cubic-bezier segment(s)\n */\nconst 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};\nexport default arcToCubic;\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 */\nconst 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};\nexport default quadToCubic;\n","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 */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\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 */\nconst 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};\nexport default lineToCubic;\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 */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\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\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\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, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\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 */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\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};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\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\nexport default paramsParser;\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 value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\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 });\n};\nexport default pathToCurve;\n","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\nexport default roundTo;\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\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\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 : /* istanbul ignore next @preserve */ \"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\nexport default pathToString;\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 */\nconst 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\nexport default distanceSquareRoot;\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 * @param distance the distance to point in [0-1] range\n * @returns the extrema 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 a [0-1] ratio\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 { 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 boundig 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) => {\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]] as [\n number,\n number,\n number,\n number,\n ];\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 boundig 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 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\nconst getPathBBox = (pathInput: PathArray | 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\nexport default getPathBBox;\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 shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\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\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\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 });\n};\nexport default normalizePath;\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 of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\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 // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\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\nexport default getPointAtLength;\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 */\nconst 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\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\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\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } 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` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\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 : /* istanbul ignore next @preserve */ 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 = seg;\n [pathCommand] = seg;\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\nexport default optimizePath;\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` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\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;\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]) as PathSegment;\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 ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"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] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"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] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\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 PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\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 ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\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 `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst 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};\nexport default getSVGMatrix;\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 * @return 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 */\nconst 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};\nexport default projection2d;\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` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\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 let pathCommand = \"M\";\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 typeof path;\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 typeof path;\n\n return 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 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)) 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(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\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 });\n};\n\nexport default transformPath;\n","\"use strict\";\n// import CSSMatrix from \"@thednp/dommatrix\";\n// import { arcTools } from \"./math/arcTools\";\n// import { bezierTools } from \"./math/bezier\";\n// import { cubicTools } from \"./math/cubicTools\";\n// import { lineTools } from \"./math/lineTools\";\n// import { quadTools } from \"./math/quadTools\";\n// import { polygonTools } from \"./math/polygonTools\";\n\n// import distanceSquareRoot from \"./math/distanceSquareRoot\";\n// import midPoint from \"./math/midPoint\";\n// import rotateVector from \"./math/rotateVector\";\n// import roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\n\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\n// import finalizeSegment from \"./parser/finalizeSegment\";\n// import invalidPathValue from \"./parser/invalidPathValue\";\n// import isArcCommand from \"./parser/isArcCommand\";\n// import isDigit from \"./parser/isDigit\";\n// import isDigitStart from \"./parser/isDigitStart\";\n// import isMoveCommand from \"./parser/isMoveCommand\";\n// import isPathCommand from \"./parser/isPathCommand\";\n// import isSpace from \"./parser/isSpace\";\n// import paramsCount from \"./parser/paramsCount\";\n// import paramsParser from \"./parser/paramsParser\";\n// import pathParser from \"./parser/pathParser\";\n// import scanFlag from \"./parser/scanFlag\";\n// import scanParam from \"./parser/scanParam\";\n// import scanSegment from \"./parser/scanSegment\";\n// import skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\n// import distanceEpsilon from \"./util/distanceEpsilon\";\n// import getClosestPoint from \"./util/getClosestPoint\";\n// import getDrawDirection from \"./util/getDrawDirection\";\n// import getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\n// import getPropertiesAtLength from \"./util/getPropertiesAtLength\";\n// import getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\n// import getSegmentAtLength from \"./util/getSegmentAtLength\";\n// import getSegmentOfPoint from \"./util/getSegmentOfPoint\";\n// import isAbsoluteArray from \"./util/isAbsoluteArray\";\n// import isCurveArray from \"./util/isCurveArray\";\n// import isNormalizedArray from \"./util/isNormalizedArray\";\n// import isPathArray from \"./util/isPathArray\";\n// import isPointInStroke from \"./util/isPointInStroke\";\n// import isRelativeArray from \"./util/isRelativeArray\";\n// import isValidPath from \"./util/isValidPath\";\n// import shapeParams from \"./util/shapeParams\";\n// import shapeToPath from \"./util/shapeToPath\";\n// import shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\n// import absolutizeSegment from \"./process/absolutizeSegment\";\n// import arcToCubic from \"./process/arcToCubic\";\n// import getSVGMatrix from \"./process/getSVGMatrix\";\n// import iterate from \"./process/iterate\";\n// import lineToCubic from \"./process/lineToCubic\";\n// import normalizeSegment from \"./process/normalizeSegment\";\n// import projection2d from \"./process/projection2d\";\n// import quadToCubic from \"./process/quadToCubic\";\n// import relativizeSegment from \"./process/relativizeSegment\";\n// import reverseCurve from \"./process/reverseCurve\";\n// import roundPath from \"./process/roundPath\";\n// import roundSegment from \"./process/roundSegment\";\n// import segmentToCubic from \"./process/segmentToCubic\";\n// import shortenSegment from \"./process/shortenSegment\";\n// import splitCubic from \"./process/splitCubic\";\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 \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) {\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 * @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 * @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 * @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 * @param onlySubpath option to reverse all sub-paths except first\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 * @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 * @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 refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\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 * @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 * @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 * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n // static get CSSMatrix() {\n // return CSSMatrix;\n // }\n // static get arcTools() {\n // return arcTools;\n // }\n // static get bezierTools() {\n // return bezierTools;\n // }\n\n // static get cubicTools() {\n // return cubicTools;\n // }\n // static get lineTools() {\n // return lineTools;\n // }\n // static get polygonTools() {\n // return polygonTools;\n // }\n // static get quadTools() {\n // return quadTools;\n // }\n // static get pathToAbsolute() {\n // return pathToAbsolute;\n // }\n // static get pathToRelative() {\n // return pathToRelative;\n // }\n // static get pathToCurve() {\n // return pathToCurve;\n // }\n // static get pathToString() {\n // return pathToString;\n // }\n // static get distanceSquareRoot() {\n // return distanceSquareRoot;\n // }\n // static get midPoint() {\n // return midPoint;\n // }\n // static get rotateVector() {\n // return rotateVector;\n // }\n // static get roundTo() {\n // return roundTo;\n // }\n // static get parsePathString() {\n // return parsePathString;\n // }\n // static get finalizeSegment() {\n // return finalizeSegment;\n // }\n // static get invalidPathValue() {\n // return invalidPathValue;\n // }\n // static get isArcCommand() {\n // return isArcCommand;\n // }\n // static get isDigit() {\n // return isDigit;\n // }\n // static get isDigitStart() {\n // return isDigitStart;\n // }\n // static get isMoveCommand() {\n // return isMoveCommand;\n // }\n // static get isPathCommand() {\n // return isPathCommand;\n // }\n // static get isSpace() {\n // return isSpace;\n // }\n // static get paramsCount() {\n // return paramsCount;\n // }\n // static get paramsParser() {\n // return paramsParser;\n // }\n // static get pathParser() {\n // return pathParser;\n // }\n // static get scanFlag() {\n // return scanFlag;\n // }\n // static get scanParam() {\n // return scanParam;\n // }\n // static get scanSegment() {\n // return scanSegment;\n // }\n // static get skipSpaces() {\n // return skipSpaces;\n // }\n // static get distanceEpsilon() {\n // return distanceEpsilon;\n // }\n // static get getClosestPoint() {\n // return getClosestPoint;\n // }\n // static get getDrawDirection() {\n // return getDrawDirection;\n // }\n // static get getPathArea() {\n // return getPathArea;\n // }\n // static get getPathBBox() {\n // return getPathBBox;\n // }\n // static get getPointAtLength() {\n // return getPointAtLength;\n // }\n // static get getPropertiesAtLength() {\n // return getPropertiesAtLength;\n // }\n // static get getPropertiesAtPoint() {\n // return getPropertiesAtPoint;\n // }\n // static get getSegmentAtLength() {\n // return getSegmentAtLength;\n // }\n // static get getSegmentOfPoint() {\n // return getSegmentOfPoint;\n // }\n // static get getTotalLength() {\n // return getTotalLength;\n // }\n // static get isAbsoluteArray() {\n // return isAbsoluteArray;\n // }\n // static get isCurveArray() {\n // return isCurveArray;\n // }\n // static get isNormalizedArray() {\n // return isNormalizedArray;\n // }\n // static get isPathArray() {\n // return isPathArray;\n // }\n // static get isPointInStroke() {\n // return isPointInStroke;\n // }\n // static get isRelativeArray() {\n // return isRelativeArray;\n // }\n // static get isValidPath() {\n // return isValidPath;\n // }\n // static get shapeParams() {\n // return shapeParams;\n // }\n // static get shapeToPath() {\n // return shapeToPath;\n // }\n // static get shapeToPathArray() {\n // return shapeToPathArray;\n // }\n // static get absolutizeSegment() {\n // return absolutizeSegment;\n // }\n // static get arcToCubic() {\n // return arcToCubic;\n // }\n // static get getSVGMatrix() {\n // return getSVGMatrix;\n // }\n // static get iterate() {\n // return iterate;\n // }\n // static get lineToCubic() {\n // return lineToCubic;\n // }\n // static get normalizePath() {\n // return normalizePath;\n // }\n // static get normalizeSegment() {\n // return normalizeSegment;\n // }\n // static get optimizePath() {\n // return optimizePath;\n // }\n // static get projection2d() {\n // return projection2d;\n // }\n // static get quadToCubic() {\n // return quadToCubic;\n // }\n // static get relativizeSegment() {\n // return relativizeSegment;\n // }\n // static get reverseCurve() {\n // return reverseCurve;\n // }\n // static get reversePath() {\n // return reversePath;\n // }\n // static get roundPath() {\n // return roundPath;\n // }\n // static get roundSegment() {\n // return roundSegment;\n // }\n // static get segmentToCubic() {\n // return segmentToCubic;\n // }\n // static get shortenSegment() {\n // return shortenSegment;\n // }\n // static get splitCubic() {\n // return splitCubic;\n // }\n // static get splitPath() {\n // return splitPath;\n // }\n // static get transformPath() {\n // return transformPath;\n // }\n}\n\n// export {\n// absolutizeSegment,\n// arcToCubic,\n// arcTools,\n// bezierTools,\n// CSSMatrix,\n// cubicTools,\n// distanceEpsilon,\n// distanceSquareRoot,\n// finalizeSegment,\n// getClosestPoint,\n// getDrawDirection,\n// getPathArea,\n// getPathBBox,\n// getPointAtLength,\n// getPropertiesAtLength,\n// getPropertiesAtPoint,\n// getSegmentAtLength,\n// getSegmentOfPoint,\n// getSVGMatrix,\n// getTotalLength,\n// invalidPathValue,\n// isAbsoluteArray,\n// isArcCommand,\n// isCurveArray,\n// isDigit,\n// isDigitStart,\n// isMoveCommand,\n// isNormalizedArray,\n// isPathArray,\n// isPathCommand,\n// isPointInStroke,\n// isRelativeArray,\n// isSpace,\n// isValidPath,\n// iterate,\n// lineToCubic,\n// lineTools,\n// midPoint,\n// normalizePath,\n// normalizeSegment,\n// optimizePath,\n// paramsCount,\n// paramsParser,\n// parsePathString,\n// pathParser,\n// pathToAbsolute,\n// pathToCurve,\n// pathToRelative,\n// pathToString,\n// polygonTools,\n// projection2d,\n// quadToCubic,\n// quadTools,\n// relativizeSegment,\n// reverseCurve,\n// reversePath,\n// rotateVector,\n// roundPath,\n// roundSegment,\n// roundTo,\n// scanFlag,\n// scanParam,\n// scanSegment,\n// segmentToCubic,\n// shapeParams,\n// shapeToPath,\n// shapeToPathArray,\n// shortenSegment,\n// skipSpaces,\n// splitCubic,\n// splitPath,\n// transformPath,\n// };\n\nexport { default as CSSMatrix} from \"@thednp/dommatrix\";\nexport { default as pathToAbsolute} from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative} from \"./convert/pathToRelative\";\nexport { default as pathToCurve} from \"./convert/pathToCurve\";\nexport { default as pathToString} from \"./convert/pathToString\";\n\nexport { default as error} from \"./parser/error\";\nexport { default as parsePathString} from \"./parser/parsePathString\";\nexport { default as finalizeSegment} from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue} from \"./parser/invalidPathValue\";\nexport { default as isArcCommand} from \"./parser/isArcCommand\";\nexport { default as isDigit} from \"./parser/isDigit\";\nexport { default as isDigitStart} from \"./parser/isDigitStart\";\nexport { default as isMoveCommand} from \"./parser/isMoveCommand\";\nexport { default as isPathCommand} from \"./parser/isPathCommand\";\nexport { default as isSpace} from \"./parser/isSpace\";\nexport { default as paramsCount} from \"./parser/paramsCount\";\nexport { default as paramsParser} from \"./parser/paramsParser\";\nexport { default as pathParser} from \"./parser/pathParser\";\nexport { default as scanFlag} from \"./parser/scanFlag\";\nexport { default as scanParam} from \"./parser/scanParam\";\nexport { default as scanSegment} from \"./parser/scanSegment\";\nexport { default as skipSpaces} from \"./parser/skipSpaces\";\nexport { default as getPathBBox} from \"./util/getPathBBox\";\nexport { default as getTotalLength} from \"./util/getTotalLength\";\nexport { default as distanceEpsilon} from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint} from \"./util/getClosestPoint\";\nexport { default as getDrawDirection} from \"./util/getDrawDirection\";\nexport { default as getPathArea} from \"./util/getPathArea\";\nexport { default as getPointAtLength} from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength} from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint} from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength} from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint} from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray} from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray} from \"./util/isCurveArray\";\nexport { default as isNormalizedArray} from \"./util/isNormalizedArray\";\nexport { default as isPathArray} from \"./util/isPathArray\";\nexport { default as isPointInStroke} from \"./util/isPointInStroke\";\nexport { default as isRelativeArray} from \"./util/isRelativeArray\";\nexport { default as isValidPath} from \"./util/isValidPath\";\nexport { default as shapeParams} from \"./util/shapeParams\";\nexport { default as shapeToPath} from \"./util/shapeToPath\";\nexport { default as shapeToPathArray} from \"./util/shapeToPathArray\";\nexport { default as normalizePath} from \"./process/normalizePath\";\nexport { default as optimizePath} from \"./process/optimizePath\";\nexport { default as reversePath} from \"./process/reversePath\";\nexport { default as splitPath} from \"./process/splitPath\";\nexport { default as transformPath} from \"./process/transformPath\";\nexport { default as absolutizeSegment} from \"./process/absolutizeSegment\";\nexport { default as arcToCubic} from \"./process/arcToCubic\";\nexport { default as getSVGMatrix} from \"./process/getSVGMatrix\";\nexport { default as iterate} from \"./process/iterate\";\nexport { default as lineToCubic} from \"./process/lineToCubic\";\nexport { default as normalizeSegment} from \"./process/normalizeSegment\";\nexport { default as projection2d} from \"./process/projection2d\";\nexport { default as quadToCubic} from \"./process/quadToCubic\";\nexport { default as relativizeSegment} from \"./process/relativizeSegment\";\nexport { default as reverseCurve} from \"./process/reverseCurve\";\nexport { default as roundPath} from \"./process/roundPath\";\nexport {default as roundSegment} from \"./process/roundSegment\";\nexport { default as segmentToCubic} from \"./process/segmentToCubic\";\nexport {default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic} from \"./process/splitCubic\";\n\nexport default SVGPathCommander;\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 */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\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 PathArray;\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 PathArray;\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(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\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 */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\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\nexport default getPropertiesAtPoint;\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 */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\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 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 length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\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};\nexport default getPathArea;\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 */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\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 */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\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 */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount 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 */\nconst 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 paramsCount[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};\nexport default isPathArray;\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 */\nconst 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};\nexport default isAbsoluteArray;\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 are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst 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};\nexport default isNormalizedArray;\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 */\nconst 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};\nexport default isCurveArray;\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 */\nconst isPointInStroke = (\n pathInput: string | PathArray,\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};\nexport default isPointInStroke;\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 */\nconst 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};\nexport default isRelativeArray;\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 */\nconst 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};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst 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\nexport default shapeParams;\n","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\nexport default isElement;\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 \"../parser/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\n * @returns a new line `pathArray`\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` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\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 (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\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\n * @return an ellipse `pathArray`\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` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\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 ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\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) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\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};\nexport default shapeToPathArray;\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 \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. 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 `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst 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;\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 Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\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\nexport default shapeToPath;\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 */\nconst 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\nexport default reverseCurve;\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 */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\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 : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n"],"mappings":"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","names":["defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","roundTo","n","round","pow","roundTo_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","CSSMatrix","getSVGMatrix","transform","matrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","CSSMatrix","translatePoint","cssm","v","m","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","src_default"]} \ No newline at end of file +{"version":3,"sources":["../src/main.ts","../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/parser/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/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.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/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\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 \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) {\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 * @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 * @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 * @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 * @param onlySubpath option to reverse all sub-paths except first\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 * @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 * @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 refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\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 * @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 * @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 * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;","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 */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\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 */\nconst 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\nexport default distanceSquareRoot;\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 * @param distance the distance to point in [0-1] range\n * @returns the extrema 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 a [0-1] ratio\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 { 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 boundig 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) => {\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]] as [\n number,\n number,\n number,\n number,\n ];\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 boundig 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 * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon 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 /* eslint-disable-next-line */\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};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, 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 */\nconst 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\nexport default rotateVector;\n","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\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\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\nexport default paramsCount;\n","import paramsCount 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 */\nconst 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 >= paramsCount[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, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./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 */\nconst 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\nexport default scanFlag;\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 */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./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 */\nconst 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};\nexport default scanParam;\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\nconst 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};\nexport default isSpace;\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 */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\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 */\nconst 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};\nexport default isPathCommand;\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 */\nconst 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};\nexport default isDigitStart;\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 */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst 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};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts 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 \"./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 */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[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) && 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 && 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};\nexport default scanSegment;\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\n */\nexport default 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 * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\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\nexport default parsePathString;\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 */\nconst 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};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n 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 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 if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\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 | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\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 */\nconst 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\nexport default relativizeSegment;\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 | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\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 * @return the resulting cubic-bezier segment(s)\n */\nconst 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};\nexport default arcToCubic;\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 */\nconst 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};\nexport default quadToCubic;\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 */\nconst 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};\nexport default lineToCubic;\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 */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\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\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\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, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\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 */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\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};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\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\nexport default paramsParser;\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 value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\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 });\n};\nexport default pathToCurve;\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\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\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 : /* istanbul ignore next @preserve */ \"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\nexport default pathToString;\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\nconst getPathBBox = (pathInput: PathArray | 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\nexport default getPathBBox;\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 shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\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\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\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 });\n};\nexport default normalizePath;\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 of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\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 // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\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\nexport default getPointAtLength;\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 */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\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 PathArray;\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 PathArray;\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(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\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 */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\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\nexport default getPropertiesAtPoint;\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 */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\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 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 length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\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};\nexport default getPathArea;\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 */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\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 */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\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 */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount 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 */\nconst 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 paramsCount[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};\nexport default isPathArray;\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 */\nconst 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};\nexport default isAbsoluteArray;\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 are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst 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};\nexport default isNormalizedArray;\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 */\nconst 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};\nexport default isCurveArray;\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 */\nconst isPointInStroke = (\n pathInput: string | PathArray,\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};\nexport default isPointInStroke;\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 */\nconst 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};\nexport default isRelativeArray;\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 */\nconst 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};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst 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\nexport default shapeParams;\n","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\nexport default isElement;\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 \"../parser/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\n * @returns a new line `pathArray`\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` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\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 (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\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\n * @return an ellipse `pathArray`\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` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\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 ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\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) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\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};\nexport default shapeToPathArray;\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 \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. 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 `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst 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;\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 Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\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\nexport default shapeToPath;\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 */\nconst 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\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\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\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } 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` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\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 : /* istanbul ignore next @preserve */ 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 = seg;\n [pathCommand] = seg;\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\nexport default optimizePath;\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` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\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;\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]) as PathSegment;\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 ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"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] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"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] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\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 PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\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 ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\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 `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst 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};\nexport default getSVGMatrix;\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 * @return 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 */\nconst 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};\nexport default projection2d;\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` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\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 let pathCommand = \"M\";\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 typeof path;\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 typeof path;\n\n return 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 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)) 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(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\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 });\n};\n\nexport default transformPath;\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 */\nconst 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\nexport default reverseCurve;\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 */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\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 : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\n\nimport SVGPathCommander from \"./main\";\n\nexport default SVGPathCommander;\n\nexport { default as CSSMatrix } from \"@thednp/dommatrix\";\nexport { arcTools } from \"./math/arcTools\";\nexport { bezierTools } from \"./math/bezier\";\nexport { cubicTools } from \"./math/cubicTools\";\nexport { lineTools } from \"./math/lineTools\";\nexport { quadTools } from \"./math/quadTools\";\nexport { polygonTools } from \"./math/polygonTools\";\n\nexport { default as distanceSquareRoot } from \"./math/distanceSquareRoot\";\nexport { default as midPoint } from \"./math/midPoint\";\nexport { default as rotateVector } from \"./math/rotateVector\";\nexport { default as roundTo } from \"./math/roundTo\";\n\nexport * from \"./types\";\nexport * from \"./interface\";\n\nexport { default as pathToAbsolute } from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative } from \"./convert/pathToRelative\";\nexport { default as pathToCurve } from \"./convert/pathToCurve\";\nexport { default as pathToString } from \"./convert/pathToString\";\n\nexport { default as parsePathString } from \"./parser/parsePathString\";\nexport { default as finalizeSegment } from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue } from \"./parser/invalidPathValue\";\nexport { default as isArcCommand } from \"./parser/isArcCommand\";\nexport { default as isDigit } from \"./parser/isDigit\";\nexport { default as isDigitStart } from \"./parser/isDigitStart\";\nexport { default as isMoveCommand } from \"./parser/isMoveCommand\";\nexport { default as isPathCommand } from \"./parser/isPathCommand\";\nexport { default as isSpace } from \"./parser/isSpace\";\nexport { default as paramsCount } from \"./parser/paramsCount\";\nexport { default as paramsParser } from \"./parser/paramsParser\";\nexport { default as pathParser } from \"./parser/pathParser\";\nexport { default as scanFlag } from \"./parser/scanFlag\";\nexport { default as scanParam } from \"./parser/scanParam\";\nexport { default as scanSegment } from \"./parser/scanSegment\";\nexport { default as skipSpaces } from \"./parser/skipSpaces\";\nexport { default as getPathBBox } from \"./util/getPathBBox\";\nexport { default as getTotalLength } from \"./util/getTotalLength\";\nexport { default as distanceEpsilon } from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint } from \"./util/getClosestPoint\";\nexport { default as getDrawDirection } from \"./util/getDrawDirection\";\nexport { default as getPathArea } from \"./util/getPathArea\";\nexport { default as getPointAtLength } from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength } from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint } from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength } from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint } from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray } from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray } from \"./util/isCurveArray\";\nexport { default as isNormalizedArray } from \"./util/isNormalizedArray\";\nexport { default as isPathArray } from \"./util/isPathArray\";\nexport { default as isPointInStroke } from \"./util/isPointInStroke\";\nexport { default as isRelativeArray } from \"./util/isRelativeArray\";\nexport { default as isValidPath } from \"./util/isValidPath\";\nexport { default as shapeParams } from \"./util/shapeParams\";\nexport { default as shapeToPath } from \"./util/shapeToPath\";\nexport { default as shapeToPathArray } from \"./util/shapeToPathArray\";\nexport { default as normalizePath } from \"./process/normalizePath\";\nexport { default as optimizePath } from \"./process/optimizePath\";\nexport { default as reversePath } from \"./process/reversePath\";\nexport { default as splitPath } from \"./process/splitPath\";\nexport { default as transformPath } from \"./process/transformPath\";\nexport { default as absolutizeSegment } from \"./process/absolutizeSegment\";\nexport { default as arcToCubic } from \"./process/arcToCubic\";\nexport { default as getSVGMatrix } from \"./process/getSVGMatrix\";\nexport { default as iterate } from \"./process/iterate\";\nexport { default as lineToCubic } from \"./process/lineToCubic\";\nexport { default as normalizeSegment } from \"./process/normalizeSegment\";\nexport { default as projection2d } from \"./process/projection2d\";\nexport { default as quadToCubic } from \"./process/quadToCubic\";\nexport { default as relativizeSegment } from \"./process/relativizeSegment\";\nexport { default as reverseCurve } from \"./process/reverseCurve\";\nexport { default as roundPath } from \"./process/roundPath\";\nexport { default as roundSegment } from \"./process/roundSegment\";\nexport { default as segmentToCubic } from \"./process/segmentToCubic\";\nexport { default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic } from \"./process/splitCubic\";\n"],"mappings":"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","names":["CSSMatrix","midPoint","a","b","t","ax","ay","bx","by","midPoint_default","distanceSquareRoot","a","b","distanceSquareRoot_default","getLineLength","x1","y1","x2","y2","distanceSquareRoot_default","getPointAtLineLength","distance","point","length","x","y","midPoint_default","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","length","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","x","y","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","n","getArcProps","x1","y1","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","distance","point","getPointAtLineLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","min","max","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","p","d","c","list","j","computeBezier","t","order","mt","mt2","t2","a","b","calculateBezier","derivativeFn","l","bezierLength","len","sum","i","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","v1","cp","v2","min","max","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","bezierTools","getPointAtCubicSegmentLength","x1","y1","c1x","c1y","c2x","c2y","x2","y2","t","t1","getCubicLength","getBezierLength","getPointAtCubicLength","distance","distanceIsNumber","point","currentLength","getCubicBBox","cxMinMax","minmaxC","cyMinMax","cubicTools","getPointAtQuadSegmentLength","x1","y1","cx","cy","x2","y2","t","t1","getQuadLength","getBezierLength","getPointAtQuadLength","distance","distanceIsNumber","point","currentLength","getQuadBBox","cxMinMax","minmaxQ","cyMinMax","quadTools","polygonArea","polygon","n","i","a","b","area","polygonLength","length","point","distanceSquareRoot_default","polygonTools","rotateVector","x","y","rad","sin","cos","X","Y","rotateVector_default","roundTo","n","round","pow","roundTo_default","defaultOptions","options_default","paramsCount","paramsCount_default","finalizeSegment","path","pathCommand","relativeCommand","data","paramsCount_default","finalizeSegment_default","error","error_default","scanFlag","path","index","pathValue","code","error_default","scanFlag_default","isDigit","code","isDigit_default","invalidPathValue","invalidPathValue_default","scanParam","path","max","pathValue","start","index","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","error_default","invalidPathValue_default","isDigit_default","scanParam_default","isSpace","ch","isSpace_default","skipSpaces","path","pathValue","max","isSpace_default","skipSpaces_default","isPathCommand","code","isPathCommand_default","isDigitStart","code","isDigit_default","isDigitStart_default","isArcCommand","code","isArcCommand_default","isMoveCommand","code","isMoveCommand_default","scanSegment","path","max","pathValue","index","segments","cmdCode","reqParams","paramsCount_default","isPathCommand_default","error_default","invalidPathValue_default","lastSegment","isMoveCommand_default","skipSpaces_default","finalizeSegment_default","i","isArcCommand_default","scanFlag_default","scanParam_default","isDigitStart_default","scanSegment_default","PathParser","pathString","parsePathString","pathInput","path","PathParser","skipSpaces_default","scanSegment_default","parsePathString_default","absolutizeSegment","segment","index","lastX","lastY","pathCommand","absCommand","isAbsolute","absValues","seglen","j","absolutizeSegment_default","iterate","path","iterator","pathLen","segment","pathCommand","absCommand","isRelative","x","y","mx","my","segLen","i","iteratorResult","iterate_default","pathToAbsolute","pathInput","path","parsePathString_default","iterate_default","absolutizeSegment_default","pathToAbsolute_default","relativizeSegment","segment","index","lastX","lastY","pathCommand","relCommand","isRelative","relValues","seglen","j","relativizeSegment_default","pathToRelative","pathInput","path","parsePathString_default","iterate_default","relativizeSegment_default","pathToRelative_default","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","rad","res","xy","f1","f2","cx","cy","rotateVector_default","x","y","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","i","ii","arcToCubic_default","quadToCubic","x1","y1","qx","qy","x2","y2","r13","r23","quadToCubic_default","lineToCubic","x1","y1","x2","y2","c1","midPoint_default","c2","lineToCubic_default","segmentToCubic","segment","params","pathCommand","values","x","y","px1","py1","px","py","arcToCubic_default","quadToCubic_default","lineToCubic_default","segmentToCubic_default","normalizeSegment","segment","params","pathCommand","absCommand","isRelative","px1","py1","px2","py2","x","y","values","absValues","n","j","x1","y1","qx","qy","nqx","nqy","normalizeSegment_default","paramsParser","paramsParser_default","pathToCurve","pathInput","params","paramsParser_default","path","parsePathString_default","iterate_default","seg","index","lastX","lastY","normalSegment","normalizeSegment_default","result","segmentToCubic_default","seglen","pathToCurve_default","pathToString","path","roundOption","pathLen","round","options_default","segment","result","i","pathCommand","values","j","valLen","roundTo_default","pathToString_default","getPathBBox","pathInput","path","parsePathString_default","pathCommand","mx","my","max","min","xMin","yMin","xMax","yMax","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineBBox","getArcBBox","cp1x","cp1y","getCubicBBox","getQuadBBox","width","height","getPathBBox_default","getTotalLength","pathInput","path","parsePathString_default","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","pathCommand","mx","my","totalLength","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","normalSegment","getLineLength","getArcLength","cp1x","cp1y","getCubicLength","getQuadLength","getTotalLength_default","distanceEpsilon_default","normalizePath","pathInput","path","parsePathString_default","params","paramsParser_default","iterate_default","seg","_","lastX","lastY","result","normalizeSegment_default","seglen","normalizePath_default","getPointAtLength","pathInput","distance","path","normalizePath_default","isM","data","pathCommand","x","y","mx","my","distanceIsNumber","point","length","POINT","totalLength","distanceEpsilon_default","iterate_default","seg","_","lastX","lastY","getPointAtLineLength","getLineLength","getPointAtArcLength","getArcLength","getPointAtCubicLength","getCubicLength","getPointAtQuadLength","getQuadLength","getPointAtLength_default","getPropertiesAtLength","pathInput","distance","pathArray","parsePathString_default","pathTemp","pathLength","getTotalLength_default","index","lengthAtSegment","length","segment","segments","getPropertiesAtLength_default","getPropertiesAtPoint","pathInput","point","path","parsePathString_default","normalPath","normalizePath_default","pathLength","getTotalLength_default","distanceTo","p","dx","dy","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","getPointAtLength_default","before","after","beforeLength","afterLength","beforeDistance","afterDistance","segment","getPropertiesAtLength_default","distance","getPropertiesAtPoint_default","getClosestPoint","pathInput","point","getPropertiesAtPoint_default","getClosestPoint_default","getCubicSegArea","x1","y1","c1x","c1y","c2x","c2y","x2","y2","getPathArea","path","x","y","len","pathToCurve_default","seg","a","b","getPathArea_default","getDrawDirection","path","getPathArea_default","pathToCurve_default","getDrawDirection_default","getSegmentAtLength","pathInput","distance","getPropertiesAtLength_default","getSegmentAtLength_default","getSegmentOfPoint","path","point","getPropertiesAtPoint_default","getSegmentOfPoint_default","isPathArray","path","seg","lk","paramsCount_default","isPathArray_default","isAbsoluteArray","path","isPathArray_default","x","isAbsoluteArray_default","isNormalizedArray","path","isAbsoluteArray_default","pc","isNormalizedArray_default","isCurveArray","path","isNormalizedArray_default","pc","isCurveArray_default","isPointInStroke","pathInput","point","distance","getPropertiesAtPoint_default","distanceEpsilon_default","isPointInStroke_default","isRelativeArray","path","isPathArray_default","pc","isRelativeArray_default","isValidPath","pathString","path","PathParser","skipSpaces_default","scanSegment_default","isValidPath_default","shapeParams","shapeParams_default","isElement","node","isElement_default","getLinePath","attr","x1","y1","x2","y2","a","getPolyPath","pathArray","points","index","getCirclePath","cx","cy","r","getEllipsePath","rx","ry","getRectanglePath","x","y","w","h","shapeToPathArray","element","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","s","error_default","type","shapeAttrs","config","p","parsePathString_default","isPathArray_default","shapeToPathArray_default","shapeToPath","element","replace","ownerDocument","doc","supportedShapes","shapeParams_default","targetIsElement","isElement_default","tagName","error_default","s","path","type","shapeAttrs","config","round","options_default","pathArray","shapeToPathArray_default","description","pathToString_default","name","value","k","m","isValidPath_default","shapeToPath_default","shortenSegment","segment","normalSegment","params","prevCommand","pathCommand","defaultRound","options_default","round","normalValues","x1","y1","x2","y2","x","y","nx","ny","result","roundTo_default","nx1","ny1","qx","qy","shortenSegment_default","roundSegment","segment","roundOption","values","n","roundTo_default","roundSegment_default","optimizePath","pathInput","roundOption","path","pathToAbsolute_default","round","optimParams","paramsParser_default","allPathCommands","pathCommand","prevCommand","iterate_default","seg","i","lastX","lastY","normalizedSegment","normalizeSegment_default","result","shortSegment","shortenSegment_default","absSegment","roundSegment_default","absString","relativeSegment","relativizeSegment_default","relSegment","relString","seglen","optimizePath_default","reversePath","pathInput","absolutePath","pathToAbsolute_default","normalizedPath","normalizePath_default","pLen","isClosed","reversedPath","iterate_default","segment","normalizedSegment","prevSeg","prevCommand","nextSeg","nextCommand","pathCommand","x","y","result","reversePath_default","splitPath","pathInput","composite","path","pi","x","y","mx","my","params","paramsParser_default","seg","pathCommand","absCommand","relCommand","isRelative","values","splitPath_default","CSSMatrix","getSVGMatrix","transform","matrix","origin","originX","originY","translate","rotate","skew","scale","x","getSVGMatrix_default","CSSMatrix","translatePoint","cssm","v","m","projection2d","point2D","origin","originX","originY","originZ","x","y","z","relativePositionX","relativePositionY","relativePositionZ","projection2d_default","transformPath","pathInput","transform","x","y","lx","ly","j","jj","pathCommand","path","parsePathString_default","transformProps","options_default","origin","matrixInstance","getSVGMatrix_default","iterate_default","seg","index","lastX","lastY","absCommand","absoluteSegment","absolutizeSegment_default","result","arcToCubic_default","isLongArc","tempSegment","projection2d_default","transformPath_default","reverseCurve","path","rotatedCurve","x","i","curveOnly","_","reverseCurve_default","roundPath","path","roundOption","round","options_default","iterate_default","segment","roundSegment_default","roundPath_default","splitCubic","pts","ratio","t","p0","p1","p2","p3","p4","midPoint_default","p5","p6","p7","p8","p9","splitCubic_default","SVGPathCommander","pathValue","config","instanceOptions","undefPath","error_default","parsePathString_default","roundOption","originOption","round","options_default","origin","originX","originY","originZ","getPathBBox_default","getTotalLength_default","length","getPointAtLength_default","segments","pathToAbsolute_default","pathToRelative_default","pathToCurve_default","onlySubpath","split","splitPath_default","subPath","absoluteMultiPath","x","i","reversePath_default","path","normalizePath_default","optimizePath_default","source","cx","cy","cz","transform","k","v","transformPath_default","pathToString_default","key","CSSMatrix","arcTools","bezierTools","cubicTools","lineTools","polygonTools","quadTools","distanceSquareRoot_default","midPoint_default","rotateVector_default","roundTo_default","finalizeSegment_default","invalidPathValue_default","isArcCommand_default","isDigit_default","isDigitStart_default","isMoveCommand_default","isPathCommand_default","isSpace_default","paramsCount_default","paramsParser_default","PathParser","scanFlag_default","scanParam_default","scanSegment_default","skipSpaces_default","distanceEpsilon_default","getClosestPoint_default","getDrawDirection_default","getPathArea_default","getPropertiesAtLength_default","getPropertiesAtPoint_default","getSegmentAtLength_default","getSegmentOfPoint_default","isAbsoluteArray_default","isCurveArray_default","isNormalizedArray_default","isPathArray_default","isPointInStroke_default","isRelativeArray_default","isValidPath_default","shapeParams_default","shapeToPath_default","shapeToPathArray_default","absolutizeSegment_default","arcToCubic_default","getSVGMatrix_default","iterate_default","lineToCubic_default","normalizeSegment_default","projection2d_default","quadToCubic_default","relativizeSegment_default","reverseCurve_default","roundPath_default","roundSegment_default","segmentToCubic_default","shortenSegment_default","splitCubic_default","main_default","default","src_default","main_default"]} \ No newline at end of file diff --git a/docs/svg-path-commander.js b/docs/svg-path-commander.js index db26400..ee4e86b 100755 --- a/docs/svg-path-commander.js +++ b/docs/svg-path-commander.js @@ -1,2 +1,2 @@ -var SVGPathCommander=function(x){"use strict";const _={origin:[0,0,0],round:4},W={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Me=t=>{let e=t.pathValue[t.segmentStart],r=e.toLowerCase();const{data:s}=t;for(;s.length>=W[r]&&(r==="m"&&s.length>2?(t.segments.push([e].concat(s.splice(0,2))),r="l",e=e==="m"?"l":"L"):t.segments.push([e].concat(s.splice(0,W[r]))),!!W[r]););},R="SVGPathCommander Error",Ee=t=>{const{index:e,pathValue:r}=t,s=r.charCodeAt(e);if(s===48){t.param=0,t.index+=1;return}if(s===49){t.param=1,t.index+=1;return}t.err=`${R}: invalid Arc flag "${r[e]}", expecting 0 or 1 at index ${e}`},G=t=>t>=48&&t<=57,U="Invalid path value",Re=t=>{const{max:e,pathValue:r,index:s}=t;let n=s,i=!1,o=!1,a=!1,c=!1,l;if(n>=e){t.err=`${R}: ${U} at index ${n}, "pathValue" is missing param`;return}if(l=r.charCodeAt(n),(l===43||l===45)&&(n+=1,l=r.charCodeAt(n)),!G(l)&&l!==46){t.err=`${R}: ${U} at index ${n}, "${r[n]}" is not a number`;return}if(l!==46){if(i=l===48,n+=1,l=r.charCodeAt(n),i&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(t),X=t=>{const{pathValue:e,max:r}=t;for(;t.index{switch(t|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},Ze=t=>G(t)||t===43||t===45||t===46,De=t=>(t|32)===97,Oe=t=>{switch(t|32){case 109:case 77:return!0;default:return!1}},Ce=t=>{var c;const{max:e,pathValue:r,index:s,segments:n}=t,i=r.charCodeAt(s),o=W[r[s].toLowerCase()];if(t.segmentStart=s,!Qe(i)){t.err=`${R}: ${U} "${r[s]}" is not a path command at index ${s}`;return}const a=n[n.length-1];if(!Oe(i)&&((c=a==null?void 0:a[0])==null?void 0:c.toLocaleLowerCase())==="z"){t.err=`${R}: ${U} "${r[s]}" is not a MoveTo path command at index ${s}`;return}if(t.index+=1,X(t),t.data=[],!o){Me(t);return}for(;;){for(let l=o;l>0;l-=1){if(De(i)&&(l===3||l===4)?Ee(t):Re(t),t.err.length)return;t.data.push(t.param),X(t),t.index=t.max||!Ze(r.charCodeAt(t.index)))break}Me(t)};class Pe{constructor(e){this.segments=[],this.pathValue=e,this.max=e.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const Q=t=>{if(typeof t!="string")return t.slice(0);const e=new Pe(t);for(X(e);e.index{const[n]=t,i=n.toUpperCase();if(e===0||i===n)return t;if(i==="A")return[i,t[1],t[2],t[3],t[4],t[5],t[6]+r,t[7]+s];if(i==="V")return[i,t[1]+s];if(i==="H")return[i,t[1]+r];if(i==="L")return[i,t[1]+r,t[2]+s];{const a=[],c=t.length;for(let l=1;l{let r=t.length,s,n="M",i="M",o=!1,a=0,c=0,l=0,m=0,h=0;for(let f=0;f{const e=Q(t);return Z(e,ne)},Se=(t,e,r,s)=>{const[n]=t,i=n.toLowerCase();if(e===0||n===i)return t;if(i==="a")return[i,t[1],t[2],t[3],t[4],t[5],t[6]-r,t[7]-s];if(i==="v")return[i,t[1]-s];if(i==="h")return[i,t[1]-r];if(i==="l")return[i,t[1]-r,t[2]-s];{const a=[],c=t.length;for(let l=1;l{const e=Q(t);return Z(e,Se)},le=(t,e,r)=>{const{sin:s,cos:n}=Math,i=t*n(r)-e*s(r),o=t*s(r)+e*n(r);return{x:i,y:o}},me=(t,e,r,s,n,i,o,a,c,l)=>{let m=t,h=e,f=r,y=s,u=a,g=c;const A=Math.PI*120/180,p=Math.PI/180*(+n||0);let M=[],d,b,C,S,k;if(l)[b,C,S,k]=l;else{d=le(m,h,-p),m=d.x,h=d.y,d=le(u,g,-p),u=d.x,g=d.y;const L=(m-u)/2,V=(h-g)/2;let T=L*L/(f*f)+V*V/(y*y);T>1&&(T=Math.sqrt(T),f*=T,y*=T);const Ie=f*f,Ve=y*y,St=(i===o?-1:1)*Math.sqrt(Math.abs((Ie*Ve-Ie*V*V-Ve*L*L)/(Ie*V*V+Ve*L*L)));S=St*f*V/y+(m+u)/2,k=St*-y*L/f+(h+g)/2,b=Math.asin(((h-k)/y*10**9>>0)/10**9),C=Math.asin(((g-k)/y*10**9>>0)/10**9),b=mC&&(b-=Math.PI*2),!o&&C>b&&(C-=Math.PI*2)}let z=C-b;if(Math.abs(z)>A){const L=C,V=u,T=g;C=b+A*(o&&C>b?1:-1),u=S+f*Math.cos(C),g=k+y*Math.sin(C),M=me(u,g,f,y,n,0,o,V,T,[C,L,S,k])}z=C-b;const v=Math.cos(b),w=Math.sin(b),D=Math.cos(C),J=Math.sin(C),q=Math.tan(z/4),P=4/3*f*q,I=4/3*y*q,O=[m,h],j=[m+P*w,h-I*v],F=[u+P*J,g-I*D],te=[u,g];if(j[0]=2*O[0]-j[0],j[1]=2*O[1]-j[1],l)return[j[0],j[1],F[0],F[1],te[0],te[1]].concat(M);M=[j[0],j[1],F[0],F[1],te[0],te[1]].concat(M);const K=[];for(let L=0,V=M.length;L{const o=.3333333333333333,a=2/3;return[o*t+a*r,o*e+a*s,o*n+a*r,o*i+a*s,n,i]},B=(t,e,r)=>{const[s,n]=t,[i,o]=e;return[s+(i-s)*r,n+(o-n)*r]},Ne=(t,e,r,s)=>{const n=B([t,e],[r,s],.3333333333333333),i=B([t,e],[r,s],2/3);return[n[0],n[1],i[0],i[1],r,s]},Fe=(t,e)=>{const[r]=t,s=t.slice(1).map(Number),[n,i]=s,{x1:o,y1:a,x:c,y:l}=e;return"TQ".includes(r)||(e.qx=null,e.qy=null),r==="M"?(e.x=n,e.y=i,t):r==="A"?["C"].concat(me(o,a,s[0],s[1],s[2],s[3],s[4],s[5],s[6])):r==="Q"?(e.qx=n,e.qy=i,["C"].concat(He(o,a,s[0],s[1],s[2],s[3]))):r==="L"?["C"].concat(Ne(o,a,n,i)):r==="Z"?["C"].concat(Ne(o,a,c,l)):t},ue=(t,e)=>{const[r]=t,s=r.toUpperCase(),n=r!==s,{x1:i,y1:o,x2:a,y2:c,x:l,y:m}=e,h=t.slice(1);let f=h.map((y,u)=>y+(n?u%2?m:l:0));if("TQ".includes(s)||(e.qx=null,e.qy=null),s==="A")return f=h.slice(0,-2).concat(h[5]+(n?l:0),h[6]+(n?m:0)),["A"].concat(f);if(s==="H")return["L",t[1]+(n?l:0),o];if(s==="V")return["L",i,t[1]+(n?m:0)];if(s==="L")return["L",t[1]+(n?l:0),t[2]+(n?m:0)];if(s==="M")return["M",t[1]+(n?l:0),t[2]+(n?m:0)];if(s==="C")return["C"].concat(f);if(s==="S"){const y=i*2-a,u=o*2-c;return e.x1=y,e.y1=u,["C",y,u].concat(f)}else if(s==="T"){const y=i*2-(e.qx?e.qx:0),u=o*2-(e.qy?e.qy:0);return e.qx=y,e.qy=u,["Q",y,u].concat(f)}else if(s==="Q"){const[y,u]=f;return e.qx=y,e.qy=u,["Q"].concat(f)}else if(s==="Z")return["Z"];return t},re={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},he=t=>{const e={...re},r=Q(t);return Z(r,(s,n,i,o)=>{e.x=i,e.y=o;const a=ue(s,e);let c=Fe(a,e);c[0]==="C"&&c.length>7&&(r.splice(n+1,0,["C"].concat(c.slice(7))),c=c.slice(0,7));const m=c.length;return e.x1=+c[m-2],e.y1=+c[m-1],e.x2=+c[m-4]||e.x1,e.y2=+c[m-3]||e.y1,c})},$=(t,e)=>{const r=e>=1?10**e:1;return e>0?Math.round(t*r)/r:Math.round(t)},we=(t,e)=>{const r=t.length;let{round:s}=_,n=t[0],i="";s=e==="off"||typeof e=="number"&&e>=0?e:typeof s=="number"&&s>=0?s:"off";for(let o=0;oMath.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])),fe=(t,e,r,s)=>Ge([t,e],[r,s]),Ue=(t,e,r,s,n)=>{let i={x:t,y:e};if(typeof n=="number"){const o=Ge([t,e],[r,s]);if(n<=0)i={x:t,y:e};else if(n>=o)i={x:r,y:s};else{const[a,c]=B([t,e],[r,s],n/o);i={x:a,y:c}}}return i},_e=(t,e,r,s)=>{const{min:n,max:i}=Math;return[n(t,r),n(e,s),i(t,r),i(e,s)]},Je=(t,e,r)=>{const s=r/2,n=Math.sin(s),i=Math.cos(s),o=t**2*n**2,a=e**2*i**2,c=Math.sqrt(o+a)*r;return Math.abs(c)},Y=(t,e,r,s,n,i)=>{const{sin:o,cos:a}=Math,c=a(n),l=o(n),m=r*a(i),h=s*o(i);return[t+c*m-l*h,e+l*m+c*h]},Ke=(t,e)=>{const{x:r,y:s}=t,{x:n,y:i}=e,o=r*n+s*i,a=Math.sqrt((r**2+s**2)*(n**2+i**2));return(r*i-s*n<0?-1:1)*Math.acos(o/a)},Le=(t,e,r,s,n,i,o,a,c)=>{const{abs:l,sin:m,cos:h,sqrt:f,PI:y}=Math;let u=l(r),g=l(s);const p=(n%360+360)%360*(y/180);if(t===a&&e===c)return{rx:u,ry:g,startAngle:0,endAngle:0,center:{x:a,y:c}};if(u===0||g===0)return{rx:u,ry:g,startAngle:0,endAngle:0,center:{x:(a+t)/2,y:(c+e)/2}};const M=(t-a)/2,d=(e-c)/2,b={x:h(p)*M+m(p)*d,y:-m(p)*M+h(p)*d},C=b.x**2/u**2+b.y**2/g**2;C>1&&(u*=f(C),g*=f(C));const S=u**2*g**2-u**2*b.y**2-g**2*b.x**2,k=u**2*b.y**2+g**2*b.x**2;let z=S/k;z=z<0?0:z;const v=(i!==o?1:-1)*f(z),w={x:v*(u*b.y/g),y:v*(-(g*b.x)/u)},D={x:h(p)*w.x-m(p)*w.y+(t+a)/2,y:m(p)*w.x+h(p)*w.y+(e+c)/2},J={x:(b.x-w.x)/u,y:(b.y-w.y)/g},q=Ke({x:1,y:0},J),P={x:(-b.x-w.x)/u,y:(-b.y-w.y)/g};let I=Ke(J,P);!o&&I>0?I-=2*y:o&&I<0&&(I+=2*y),I%=2*y;const O=q+I;return{center:D,startAngle:q,endAngle:O,rx:u,ry:g}},We=(t,e,r,s,n,i,o,a,c)=>{const{rx:l,ry:m,startAngle:h,endAngle:f}=Le(t,e,r,s,n,i,o,a,c);return Je(l,m,f-h)},Nt=(t,e,r,s,n,i,o,a,c,l)=>{let m={x:t,y:e};const{center:h,rx:f,ry:y,startAngle:u,endAngle:g}=Le(t,e,r,s,n,i,o,a,c);if(typeof l=="number"){const A=Je(f,y,g-u);if(l<=0)m={x:t,y:e};else if(l>=A)m={x:a,y:c};else{if(t===a&&e===c)return{x:a,y:c};if(f===0||y===0)return Ue(t,e,a,c,l);const{PI:p,cos:M,sin:d}=Math,b=g-u,S=(n%360+360)%360*(p/180),k=u+b*(l/A),z=f*M(k),v=y*d(k);m={x:M(S)*z-d(S)*v+h.x,y:d(S)*z+M(S)*v+h.y}}}return m},wt=(t,e,r,s,n,i,o,a,c)=>{const{center:l,rx:m,ry:h,startAngle:f,endAngle:y}=Le(t,e,r,s,n,i,o,a,c),u=y-f,{min:g,max:A,tan:p,atan2:M,PI:d}=Math,{x:b,y:C}=l,S=n*d/180,k=p(S),z=M(-h*k,m),v=z,w=z+d,D=M(h,m*k),J=D+d,q=[a],P=[c];let I=g(t,a),O=A(t,a),j=g(e,c),F=A(e,c);const te=y-u*1e-5,K=Y(b,C,m,h,S,te),L=y-u*.99999,V=Y(b,C,m,h,S,L);if(K[0]>O||V[0]>O){const T=Y(b,C,m,h,S,v);q.push(T[0]),P.push(T[1])}if(K[0]F||V[1]>F){const T=Y(b,C,m,h,S,D);q.push(T[0]),P.push(T[1])}return I=g.apply([],q),j=g.apply([],P),O=A.apply([],q),F=A.apply([],P),[I,j,O,F]},Xe=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],Lt=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],vt=t=>{const e=[];for(let r=t,s=r.length,n=s-1;s>1;s-=1,n-=1){const i=[];for(let o=0;o{if(e===0)return t[0].t=0,t[0];const r=t.length-1;if(e===1)return t[r].t=1,t[r];const s=1-e;let n=t;if(r===0)return t[0].t=e,t[0];if(r===1)return{x:s*n[0].x+e*n[1].x,y:s*n[0].y+e*n[1].y,t:e};const i=s*s,o=e*e;let a=0,c=0,l=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],a=i,c=s*e*2,l=o):r===3&&(a=i*s,c=i*e*3,l=s*o*3,m=e*o),{x:a*n[0].x+c*n[1].x+l*n[2].x+m*n[3].x,y:a*n[0].y+c*n[1].y+l*n[2].y+m*n[3].y,t:e}},$t=(t,e)=>{const r=t(e),s=r.x*r.x+r.y*r.y;return Math.sqrt(s)},kt=t=>{const r=Xe.length;let s=0;for(let n=0,i;n{const e=[];for(let s=0,n=t.length,i=2;sTt(r[0],s))},zt=1e-8,ve=([t,e,r])=>{const s=Math.min(t,r),n=Math.max(t,r);if(e>=t?r>=e:r<=e)return[s,n];const i=(t*r-e*e)/(t-2*e+r);return i{const n=t-3*e+3*r-s;if(Math.abs(n)0&&m<1){const f=t*(1-m)*(1-m)*(1-m)+e*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+s*m*m*m;fc&&(c=f)}return[a,c]},qt=([t,e,r,s,n,i,o,a],c)=>{const l=1-c;return{x:l**3*t+3*l**2*c*r+3*l*c**2*n+c**3*o,y:l**3*e+3*l**2*c*s+3*l*c**2*i+c**3*a}},Te=(t,e,r,s,n,i,o,a)=>ye([t,e,r,s,n,i,o,a]),It=(t,e,r,s,n,i,o,a,c)=>{const l=typeof c=="number";let m={x:t,y:e};if(l){const h=ye([t,e,r,s,n,i,o,a]);c<=0||(c>=h?m={x:o,y:a}:m=qt([t,e,r,s,n,i,o,a],c/h))}return m},et=(t,e,r,s,n,i,o,a)=>{const c=Ye([t,r,n,o]),l=Ye([e,s,i,a]);return[c[0],l[0],c[1],l[1]]},Vt=([t,e,r,s,n,i],o)=>{const a=1-o;return{x:a**2*t+2*a*o*r+o**2*n,y:a**2*e+2*a*o*s+o**2*i}},$e=(t,e,r,s,n,i)=>ye([t,e,r,s,n,i]),Et=(t,e,r,s,n,i,o)=>{const a=typeof o=="number";let c={x:t,y:e};if(a){const l=ye([t,e,r,s,n,i]);o<=0||(o>=l?c={x:n,y:i}:c=Vt([t,e,r,s,n,i],o/l))}return c},tt=(t,e,r,s,n,i)=>{const o=ve([t,r,n]),a=ve([e,s,i]);return[o[0],a[0],o[1],a[1]]},nt=t=>{if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const e=Q(t);let r="M",s=0,n=0;const{max:i,min:o}=Math;let a=1/0,c=1/0,l=-1/0,m=-1/0,h=0,f=0,y=0,u=0,g=0,A=0,p=0,M=0,d=0,b=0;Z(e,(k,z,v,w)=>{[r]=k;const D=r.toUpperCase(),q=D!==r?ne(k,z,v,w):k.slice(0),P=D==="V"?["L",v,q[1]]:D==="H"?["L",q[1],w]:q;if([r]=P,"TQ".includes(D)||(d=0,b=0),r==="M")[,s,n]=P,h=s,f=n,y=s,u=n;else if(r==="L")[h,f,y,u]=_e(v,w,P[1],P[2]);else if(r==="A")[h,f,y,u]=wt(v,w,P[1],P[2],P[3],P[4],P[5],P[6],P[7]);else if(r==="S"){const I=g*2-p,O=A*2-M;[h,f,y,u]=et(v,w,I,O,P[1],P[2],P[3],P[4])}else r==="C"?[h,f,y,u]=et(v,w,P[1],P[2],P[3],P[4],P[5],P[6]):r==="T"?(d=g*2-d,b=A*2-b,[h,f,y,u]=tt(v,w,d,b,P[1],P[2])):r==="Q"?(d=P[1],b=P[2],[h,f,y,u]=tt(v,w,P[1],P[2],P[3],P[4])):r==="Z"&&([h,f,y,u]=_e(v,w,s,n));a=o(h,a),c=o(f,c),l=i(y,l),m=i(u,m),[g,A]=r==="Z"?[s,n]:P.slice(-2),[p,M]=r==="C"?[P[3],P[4]]:r==="S"?[P[1],P[2]]:[g,A]});const C=l-a,S=m-c;return{width:C,height:S,x:a,y:c,x2:l,y2:m,cx:a+C/2,cy:c+S/2,cz:Math.max(C,S)+Math.min(C,S)/2}},ee=t=>{const e=Q(t);let r=0,s=0,n=0,i=0,o=0,a=0,c="M",l=0,m=0,h=0;return Z(e,(f,y,u,g)=>{[c]=f;const A=c.toUpperCase(),M=A!==c?ne(f,y,u,g):f.slice(0),d=A==="V"?["L",u,M[1]]:A==="H"?["L",M[1],g]:M;if([c]=d,"TQ".includes(A)||(o=0,a=0),c==="M")[,l,m]=d;else if(c==="L")h+=fe(u,g,d[1],d[2]);else if(c==="A")h+=We(u,g,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(c==="S"){const b=r*2-n,C=s*2-i;h+=Te(u,g,b,C,d[1],d[2],d[3],d[4])}else c==="C"?h+=Te(u,g,d[1],d[2],d[3],d[4],d[5],d[6]):c==="T"?(o=r*2-o,a=s*2-a,h+=$e(u,g,o,a,d[1],d[2])):c==="Q"?(o=d[1],a=d[2],h+=$e(u,g,d[1],d[2],d[3],d[4])):c==="Z"&&(h+=fe(u,g,l,m));[r,s]=c==="Z"?[l,m]:d.slice(-2),[n,i]=c==="C"?[d[3],d[4]]:c==="S"?[d[1],d[2]]:[r,s]}),h},ge=1e-5,se=t=>{const e=Q(t),r={...re};return Z(e,(s,n,i,o)=>{r.x=i,r.y=o;const a=ue(s,r),c=a.length;return r.x1=+a[c-2],r.y1=+a[c-1],r.x2=+a[c-4]||r.x1,r.y2=+a[c-3]||r.y1,a})},ie=(t,e)=>{const r=se(t);let s=!1,n=[],i="M",o=0,a=0,[c,l]=r[0].slice(1);const m=typeof e=="number";let h={x:c,y:l},f=0,y=h,u=0;return!m||e{if([i]=g,s=i==="M",n=s?n:[p,M].concat(g.slice(1)),s?([,c,l]=g,h={x:c,y:l},f=0):i==="L"?(h=Ue(n[0],n[1],n[2],n[3],e-u),f=fe(n[0],n[1],n[2],n[3])):i==="A"?(h=Nt(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],e-u),f=We(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):i==="C"?(h=It(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],e-u),f=Te(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):i==="Q"?(h=Et(n[0],n[1],n[2],n[3],n[4],n[5],e-u),f=$e(n[0],n[1],n[2],n[3],n[4],n[5])):i==="Z"&&(n=[p,M,c,l],h={x:c,y:l},f=fe(n[0],n[1],n[2],n[3])),[o,a]=n.slice(-2),uu-ge?{x:o,y:a}:y)},rt=(t,e,r,s)=>{const[n]=t,{round:i}=_,o=i,a=e.slice(1),{x1:c,y1:l,x2:m,y2:h,x:f,y}=r,[u,g]=a.slice(-2),A=t;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if($(f,o)===$(u,o))return["V",g];if($(y,o)===$(g,o))return["H",u]}else if(n==="C"){const[p,M]=a;if(r.x1=p,r.y1=M,"CS".includes(s)&&($(p,o)===$(c*2-m,o)&&$(M,o)===$(l*2-h,o)||$(c,o)===$(m*2-f,o)&&$(l,o)===$(h*2-y,o)))return["S",a[2],a[3],a[4],a[5]]}else if(n==="Q"){const[p,M]=a;if(r.qx=p,r.qy=M,"QT".includes(s)&&$(p,o)===$(c*2-m,o)&&$(M,o)===$(l*2-h,o))return["T",a[2],a[3]]}return A},de=(t,e)=>{const r=t.slice(1).map(s=>$(s,e));return[t[0]].concat(r)},st=(t,e)=>{const r=ae(t),s=typeof e=="number"&&e>=0?e:2,n={...re},i=[];let o="M",a="Z";return Z(r,(c,l,m,h)=>{n.x=m,n.y=h;const f=ue(c,n);let y=c;if([o]=c,i[l]=o,l){a=i[l-1];const g=rt(c,f,n,a),A=de(g,s),p=A.join(""),M=Se(g,l,m,h),d=de(M,s),b=d.join("");y=p.length{const e=ae(t),r=se(e),s=e.length,n=e[s-1][0]==="Z",i=Z(e,(o,a)=>{const c=r[a],l=a&&e[a-1],m=l&&l[0],h=e[a+1],f=h&&h[0],[y]=o,[u,g]=r[a?a-1:s-1].slice(-2);let A=o;switch(y){case"M":A=n?["Z"]:[y,u,g];break;case"A":A=[y,o[1],o[2],o[3],o[4],o[5]===1?0:1,u,g];break;case"C":h&&f==="S"?A=["S",o[1],o[2],u,g]:A=[y,o[3],o[4],o[1],o[2],u,g];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?A=["C",c[3],c[4],c[1],c[2],u,g]:A=[y,c[1],c[2],u,g];break;case"Q":h&&f==="T"?A=["T",u,g]:A=[y,o[1],o[2],u,g];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?A=["Q",c[1],c[2],u,g]:A=[y,u,g];break;case"Z":A=["M",u,g];break;case"H":A=[y,u];break;case"V":A=[y,g];break;default:A=[y].concat(o.slice(1,-2),u,g)}return A});return n?i.reverse():[i[0]].concat(i.slice(1).reverse())},it=t=>{const e=[];let r,s=-1,n=0,i=0,o=0,a=0;const c={...re};return t.forEach(l=>{const[m]=l,h=m.toUpperCase(),f=m.toLowerCase(),y=m===f,u=l.slice(1);h==="M"?(s+=1,[n,i]=u,n+=y?c.x:0,i+=y?c.y:0,o=n,a=i,r=[y?[h,o,a]:l]):(h==="Z"?(n=o,i=a):h==="H"?([,n]=l,n+=y?c.x:0):h==="V"?([,i]=l,i+=y?c.y:0):([n,i]=l.slice(-2),n+=y?c.x:0,i+=y?c.y:0),r.push(l)),c.x=n,c.y=i,e[s]=r}),e};var Rt=Object.defineProperty,jt=(t,e,r)=>e in t?Rt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,E=(t,e,r)=>jt(t,typeof e!="symbol"?e+"":e,r);const Qt={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},ot=t=>(t instanceof Float64Array||t instanceof Float32Array||Array.isArray(t)&&t.every(e=>typeof e=="number"))&&[6,16].some(e=>t.length===e),ct=t=>t instanceof DOMMatrix||t instanceof N||typeof t=="object"&&Object.keys(Qt).every(e=>t&&e in t),oe=t=>{const e=new N,r=Array.from(t);if(!ot(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[s,n,i,o,a,c,l,m,h,f,y,u,g,A,p,M]=r;e.m11=s,e.a=s,e.m21=a,e.c=a,e.m31=h,e.m41=g,e.e=g,e.m12=n,e.b=n,e.m22=c,e.d=c,e.m32=f,e.m42=A,e.f=A,e.m13=i,e.m23=l,e.m33=y,e.m43=p,e.m14=o,e.m24=m,e.m34=u,e.m44=M}else if(r.length===6){const[s,n,i,o,a,c]=r;e.m11=s,e.a=s,e.m12=n,e.b=n,e.m21=i,e.c=i,e.m22=o,e.d=o,e.m41=a,e.e=a,e.m42=c,e.f=c}return e},at=t=>{if(ct(t))return oe([t.m11,t.m12,t.m13,t.m14,t.m21,t.m22,t.m23,t.m24,t.m31,t.m32,t.m33,t.m34,t.m41,t.m42,t.m43,t.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(t)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},lt=t=>{if(typeof t!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(t)}" is not a string.`);const e=String(t).replace(/\s/g,"");let r=new N;const s=`CSSMatrix: invalid transform string "${t}"`;return e.split(")").filter(n=>n).forEach(n=>{const[i,o]=n.split("(");if(!o)throw TypeError(s);const a=o.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[c,l,m,h]=a,f=[c,l,m],y=[c,l,m,h];if(i==="perspective"&&c&&[l,m].every(u=>u===void 0))r.m34=-1/c;else if(i.includes("matrix")&&[6,16].includes(a.length)&&a.every(u=>!Number.isNaN(+u))){const u=a.map(g=>Math.abs(g)<1e-6?0:g);r=r.multiply(oe(u))}else if(i==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(c,l,m);else if(i==="translate"&&c&&m===void 0)r=r.translate(c,l||0,0);else if(i==="rotate3d"&&y.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(c,l,m,h);else if(i==="rotate"&&c&&[l,m].every(u=>u===void 0))r=r.rotate(0,0,c);else if(i==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(c,l,m);else if(i==="scale"&&!Number.isNaN(c)&&(c!==1||l!==1)&&m===void 0){const u=Number.isNaN(+l)?c:l;r=r.scale(c,u,1)}else if(i==="skew"&&(c||!Number.isNaN(c)&&l)&&m===void 0)r=r.skew(c,l||0);else if(["translate","rotate","scale","skew"].some(u=>i.includes(u))&&/[XYZ]/.test(i)&&c&&[l,m].every(u=>u===void 0))if(i==="skewX"||i==="skewY")r=r[i](c);else{const u=i.replace(/[XYZ]/,""),g=i.replace(u,""),A=["X","Y","Z"].indexOf(g),p=u==="scale"?1:0,M=[A===0?c:p,A===1?c:p,A===2?c:p];r=r[u](...M)}else throw TypeError(s)}),r},ke=(t,e)=>e?[t.a,t.b,t.c,t.d,t.e,t.f]:[t.m11,t.m12,t.m13,t.m14,t.m21,t.m22,t.m23,t.m24,t.m31,t.m32,t.m33,t.m34,t.m41,t.m42,t.m43,t.m44],mt=(t,e,r)=>{const s=new N;return s.m41=t,s.e=t,s.m42=e,s.f=e,s.m43=r,s},ut=(t,e,r)=>{const s=new N,n=Math.PI/180,i=t*n,o=e*n,a=r*n,c=Math.cos(i),l=-Math.sin(i),m=Math.cos(o),h=-Math.sin(o),f=Math.cos(a),y=-Math.sin(a),u=m*f,g=-m*y;s.m11=u,s.a=u,s.m12=g,s.b=g,s.m13=h;const A=l*h*f+c*y;s.m21=A,s.c=A;const p=c*f-l*h*y;return s.m22=p,s.d=p,s.m23=-l*m,s.m31=l*y-c*h*f,s.m32=l*f+c*h*y,s.m33=c*m,s},ht=(t,e,r,s)=>{const n=new N,i=Math.sqrt(t*t+e*e+r*r);if(i===0)return n;const o=t/i,a=e/i,c=r/i,l=s*(Math.PI/360),m=Math.sin(l),h=Math.cos(l),f=m*m,y=o*o,u=a*a,g=c*c,A=1-2*(u+g)*f;n.m11=A,n.a=A;const p=2*(o*a*f+c*m*h);n.m12=p,n.b=p,n.m13=2*(o*c*f-a*m*h);const M=2*(a*o*f-c*m*h);n.m21=M,n.c=M;const d=1-2*(g+y)*f;return n.m22=d,n.d=d,n.m23=2*(a*c*f+o*m*h),n.m31=2*(c*o*f+a*m*h),n.m32=2*(c*a*f-o*m*h),n.m33=1-2*(y+u)*f,n},ft=(t,e,r)=>{const s=new N;return s.m11=t,s.a=t,s.m22=e,s.d=e,s.m33=r,s},xe=(t,e)=>{const r=new N;if(t){const s=t*Math.PI/180,n=Math.tan(s);r.m21=n,r.c=n}if(e){const s=e*Math.PI/180,n=Math.tan(s);r.m12=n,r.b=n}return r},yt=t=>xe(t,0),gt=t=>xe(0,t),H=(t,e)=>{const r=e.m11*t.m11+e.m12*t.m21+e.m13*t.m31+e.m14*t.m41,s=e.m11*t.m12+e.m12*t.m22+e.m13*t.m32+e.m14*t.m42,n=e.m11*t.m13+e.m12*t.m23+e.m13*t.m33+e.m14*t.m43,i=e.m11*t.m14+e.m12*t.m24+e.m13*t.m34+e.m14*t.m44,o=e.m21*t.m11+e.m22*t.m21+e.m23*t.m31+e.m24*t.m41,a=e.m21*t.m12+e.m22*t.m22+e.m23*t.m32+e.m24*t.m42,c=e.m21*t.m13+e.m22*t.m23+e.m23*t.m33+e.m24*t.m43,l=e.m21*t.m14+e.m22*t.m24+e.m23*t.m34+e.m24*t.m44,m=e.m31*t.m11+e.m32*t.m21+e.m33*t.m31+e.m34*t.m41,h=e.m31*t.m12+e.m32*t.m22+e.m33*t.m32+e.m34*t.m42,f=e.m31*t.m13+e.m32*t.m23+e.m33*t.m33+e.m34*t.m43,y=e.m31*t.m14+e.m32*t.m24+e.m33*t.m34+e.m34*t.m44,u=e.m41*t.m11+e.m42*t.m21+e.m43*t.m31+e.m44*t.m41,g=e.m41*t.m12+e.m42*t.m22+e.m43*t.m32+e.m44*t.m42,A=e.m41*t.m13+e.m42*t.m23+e.m43*t.m33+e.m44*t.m43,p=e.m41*t.m14+e.m42*t.m24+e.m43*t.m34+e.m44*t.m44;return oe([r,s,n,i,o,a,c,l,m,h,f,y,u,g,A,p])};class N{constructor(e){return 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}get isIdentity(){return 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}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(e){return typeof e=="string"&&e.length&&e!=="none"?lt(e):Array.isArray(e)||e instanceof Float64Array||e instanceof Float32Array?oe(e):typeof e=="object"?at(e):this}toFloat32Array(e){return Float32Array.from(ke(this,e))}toFloat64Array(e){return Float64Array.from(ke(this,e))}toString(){const{is2D:e}=this,r=this.toFloat64Array(e).join(", ");return`${e?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:e,isIdentity:r}=this;return{...this,is2D:e,isIdentity:r}}multiply(e){return H(this,e)}translate(e,r,s){const n=e;let i=r,o=s;return typeof i>"u"&&(i=0),typeof o>"u"&&(o=0),H(this,mt(n,i,o))}scale(e,r,s){const n=e;let i=r,o=s;return typeof i>"u"&&(i=e),typeof o>"u"&&(o=1),H(this,ft(n,i,o))}rotate(e,r,s){let n=e,i=r||0,o=s||0;return typeof e=="number"&&typeof r>"u"&&typeof s>"u"&&(o=n,n=0,i=0),H(this,ut(n,i,o))}rotateAxisAngle(e,r,s,n){if([e,r,s,n].some(i=>Number.isNaN(+i)))throw new TypeError("CSSMatrix: expecting 4 values");return H(this,ht(e,r,s,n))}skewX(e){return H(this,yt(e))}skewY(e){return H(this,gt(e))}skew(e,r){return H(this,xe(e,r))}transformPoint(e){const r=this.m11*e.x+this.m21*e.y+this.m31*e.z+this.m41*e.w,s=this.m12*e.x+this.m22*e.y+this.m32*e.z+this.m42*e.w,n=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;return e instanceof DOMPoint?new DOMPoint(r,s,n,i):{x:r,y:s,z:n,w:i}}}E(N,"Translate",mt),E(N,"Rotate",ut),E(N,"RotateAxisAngle",ht),E(N,"Scale",ft),E(N,"SkewX",yt),E(N,"SkewY",gt),E(N,"Skew",xe),E(N,"Multiply",H),E(N,"fromArray",oe),E(N,"fromMatrix",at),E(N,"fromString",lt),E(N,"toArray",ke),E(N,"isCompatibleArray",ot),E(N,"isCompatibleObject",ct);const dt=t=>{let e=new N;const{origin:r}=t,[s,n]=r,{translate:i}=t,{rotate:o}=t,{skew:a}=t,{scale:c}=t;return Array.isArray(i)&&i.length>=2&&i.every(l=>!Number.isNaN(+l))&&i.some(l=>l!==0)?e=e.translate(...i):typeof i=="number"&&!Number.isNaN(i)&&(e=e.translate(i)),(o||a||c)&&(e=e.translate(s,n),Array.isArray(o)&&o.length>=2&&o.every(l=>!Number.isNaN(+l))&&o.some(l=>l!==0)?e=e.rotate(...o):typeof o=="number"&&!Number.isNaN(o)&&(e=e.rotate(o)),Array.isArray(a)&&a.length===2&&a.every(l=>!Number.isNaN(+l))&&a.some(l=>l!==0)?(e=a[0]?e.skewX(a[0]):e,e=a[1]?e.skewY(a[1]):e):typeof a=="number"&&!Number.isNaN(a)&&(e=e.skewX(a)),Array.isArray(c)&&c.length>=2&&c.every(l=>!Number.isNaN(+l))&&c.some(l=>l!==1)?e=e.scale(...c):typeof c=="number"&&!Number.isNaN(c)&&(e=e.scale(c)),e=e.translate(-s,-n)),e},Zt=(t,e)=>{let r=N.Translate(e[0],e[1],e[2]);return[,,,r.m44]=e,r=t.multiply(r),[r.m41,r.m42,r.m43,r.m44]},ze=(t,e,r)=>{const[s,n,i]=r,[o,a,c]=Zt(t,[e[0],e[1],0,1]),l=o-s,m=a-n,h=c-i;return[l*(Math.abs(i)/Math.abs(h)||1)+s,m*(Math.abs(i)/Math.abs(h)||1)+n]},bt=(t,e)=>{let r=0,s=0,n=0,i=0,o=0,a=0,c="M";const l=Q(t),m=e&&Object.keys(e);if(!e||m&&!m.length)return l.slice(0);e.origin||Object.assign(e,{origin:_.origin});const h=e.origin,f=dt(e);return f.isIdentity?l.slice(0):Z(l,(y,u,g,A)=>{[c]=y;const p=c.toUpperCase(),d=p!==c?ne(y,u,g,A):y.slice(0);let b=p==="A"?["C"].concat(me(g,A,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):p==="V"?["L",g,d[1]]:p==="H"?["L",d[1],A]:d;c=b[0];const C=c==="C"&&b.length>7,S=C?b.slice(0,7):b.slice(0);if(C&&(l.splice(u+1,0,["C"].concat(b.slice(7))),b=S),c==="L")[n,i]=ze(f,[b[1],b[2]],h),r!==n&&s!==i?b=["L",n,i]:s===i?b=["H",n]:r===n&&(b=["V",i]);else for(o=1,a=b.length;o{const r=Q(t);let s=r.slice(0),n=ee(s),i=s.length-1,o=0,a=0,c=r[0];if(i<=0||!e||!Number.isFinite(e))return{segment:c,index:0,length:a,lengthAtSegment:o};if(e>=n)return s=r.slice(0,-1),o=ee(s),a=n-o,c=r[i],{segment:c,index:i,length:a,lengthAtSegment:o};const l=[];for(;i>0;)c=s[i],s=s.slice(0,-1),o=ee(s),a=n-o,n=o,l.push({segment:c,index:i,length:a,lengthAtSegment:o}),i-=1;return l.find(({lengthAtSegment:m})=>m<=e)},Ae=(t,e)=>{const r=Q(t),s=se(r),n=ee(s),i=b=>{const C=b.x-e.x,S=b.y-e.y;return C*C+S*S};let o=8,a,c={x:0,y:0},l=0,m=0,h=1/0;for(let b=0;b<=n;b+=o)a=ie(s,b),l=i(a),l1e-6&&(u=m-o,f=ie(s,u),A=i(f),g=m+o,y=ie(s,g),p=i(y),u>=0&&AAe(t,e).closest,Ot=(t,e,r,s,n,i,o,a)=>3*((a-e)*(r+n)-(o-t)*(s+i)+s*(t-n)-r*(e-i)+a*(n+t/3)-o*(i+e/3))/20,xt=t=>{let e=0,r=0,s=0;return he(t).map(n=>{switch(n[0]){case"M":return[,e,r]=n,0;default:return s=Ot(e,r,n[1],n[2],n[3],n[4],n[5],n[6]),[e,r]=n.slice(-2),s}}).reduce((n,i)=>n+i,0)},Bt=t=>xt(he(t))>=0,Ht=(t,e)=>qe(t,e).segment,Ft=(t,e)=>Ae(t,e).segment,pe=t=>Array.isArray(t)&&t.every(e=>{const r=e[0].toLowerCase();return W[r]===e.length-1&&"achlmqstvz".includes(r)&&e.slice(1).every(Number.isFinite)})&&t.length>0,At=t=>pe(t)&&t.every(([e])=>e===e.toUpperCase()),pt=t=>At(t)&&t.every(([e])=>"ACLMQZ".includes(e)),Gt=t=>pt(t)&&t.every(([e])=>"MC".includes(e)),Ut=(t,e)=>{const{distance:r}=Ae(t,e);return Math.abs(r)pe(t)&&t.slice(1).every(([e])=>e===e.toLowerCase()),Mt=t=>{if(typeof t!="string"||!t.length)return!1;const e=new Pe(t);for(X(e);e.indext!=null&&typeof t=="object"&&t.nodeType===1,Jt=t=>{let{x1:e,y1:r,x2:s,y2:n}=t;return[e,r,s,n]=[e,r,s,n].map(i=>+i),[["M",e,r],["L",s,n]]},Kt=t=>{const e=[],r=(t.points||"").trim().split(/[\s|,]/).map(n=>+n);let s=0;for(;s{let{cx:e,cy:r,r:s}=t;return[e,r,s]=[e,r,s].map(n=>+n),[["M",e-s,r],["a",s,s,0,1,0,2*s,0],["a",s,s,0,1,0,-2*s,0]]},Xt=t=>{let{cx:e,cy:r}=t,s=t.rx||0,n=t.ry||s;return[e,r,s,n]=[e,r,s,n].map(i=>+i),[["M",e-s,r],["a",s,n,0,1,0,2*s,0],["a",s,n,0,1,0,-2*s,0]]},Yt=t=>{const e=+t.x||0,r=+t.y||0,s=+t.width,n=+t.height;let i=+(t.rx||0),o=+(t.ry||i);return i||o?(i*2>s&&(i-=(i*2-s)/2),o*2>n&&(o-=(o*2-n)/2),[["M",e+i,r],["h",s-i*2],["s",i,0,i,o],["v",n-o*2],["s",0,o,-i,o],["h",-s+i*2],["s",-i,0,-i,-o],["v",-n+o*2],["s",0,-o,i,-o]]):[["M",e,r],["h",s],["v",n],["H",e],["Z"]]},Pt=t=>{const e=Object.keys(ce),r=Ct(t),s=r?t.tagName:null;if(s&&[...e,"path"].every(c=>s!==c))throw TypeError(`${R}: "${s}" is not SVGElement`);const n=r?s:t.type,i=ce[n],o={type:n};r?i.forEach(c=>{o[c]=t.getAttribute(c)}):Object.assign(o,t);let a=[];return n==="circle"?a=Wt(o):n==="ellipse"?a=Xt(o):["polyline","polygon"].includes(n)?a=Kt(o):n==="rect"?a=Yt(o):n==="line"?a=Jt(o):["glyph","path"].includes(n)&&(a=Q(r?t.getAttribute("d")||"":t.d||"")),pe(a)&&a.length?a:!1},en=(t,e,r)=>{const s=r||document,n=Object.keys(ce),i=Ct(t),o=i?t.tagName:null;if(o==="path")throw TypeError(`${R}: "${o}" is already SVGPathElement`);if(o&&n.every(u=>o!==u))throw TypeError(`${R}: "${o}" is not SVGElement`);const a=s.createElementNS("http://www.w3.org/2000/svg","path"),c=i?o:t.type,l=ce[c],m={type:c},h=_.round,f=Pt(t),y=f&&f.length?we(f,h):"";return i?(l.forEach(u=>{m[u]=t.getAttribute(u)}),Object.values(t.attributes).forEach(({name:u,value:g})=>{l.includes(u)||a.setAttribute(u,g)})):(Object.assign(m,t),Object.keys(m).forEach(u=>{!l.includes(u)&&u!=="type"&&a.setAttribute(u.replace(/[A-Z]/g,g=>`-${g.toLowerCase()}`),m[u])})),Mt(y)?(a.setAttribute("d",y),e&&i&&(t.before(a,t),t.remove()),a):!1},tn=t=>{const e=t.slice(1).map((r,s,n)=>s?n[s-1].slice(-2).concat(r.slice(1)):t[0].slice(1).concat(r.slice(1))).map(r=>r.map((s,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(e[0].slice(0,2))].concat(e.map(r=>["C"].concat(r.slice(2))))},nn=(t,e)=>{let{round:r}=_;return r=e==="off"||typeof e=="number"&&e>=0?e:typeof r=="number"&&r>=0?r:"off",r==="off"?t.slice(0):Z(t,s=>de(s,r))},rn=(t,e=.5)=>{const r=e,s=t.slice(0,2),n=t.slice(2,4),i=t.slice(4,6),o=t.slice(6,8),a=B(s,n,r),c=B(n,i,r),l=B(i,o,r),m=B(a,c,r),h=B(c,l,r),f=B(m,h,r);return[["C",a[0],a[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],l[0],l[1],o[0],o[1]]]};class sn{constructor(e,r){const s=r||{},n=typeof e>"u";if(n||!e.length)throw TypeError(`${R}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=Q(e);const{round:i,origin:o}=s;let a;Number.isInteger(i)||i==="off"?a=i:a=_.round;let c=_.origin;if(Array.isArray(o)&&o.length>=2){const[l,m,h]=o.map(Number);c=[Number.isNaN(l)?0:l,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=a,this.origin=c,this}get bbox(){return nt(this.segments)}get length(){return ee(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(e){return ie(this.segments,e)}toAbsolute(){const{segments:e}=this;return this.segments=ae(e),this}toRelative(){const{segments:e}=this;return this.segments=Be(e),this}toCurve(){const{segments:e}=this;return this.segments=he(e),this}reverse(e){const{segments:r}=this,s=it(r),n=s.length>1?s:!1,i=n?n.map((a,c)=>e?c?be(a):a.slice(0):be(a)):r.slice(0);let o=[];return n?o=i.flat(1):o=e?r:be(r),this.segments=o.slice(0),this}normalize(){const{segments:e}=this;return this.segments=se(e),this}optimize(){const{segments:e}=this,r=this.round==="off"?2:this.round;return this.segments=st(e,r),this}transform(e){if(!e||typeof e!="object"||typeof e=="object"&&!["translate","rotate","skew","scale"].some(c=>c in e))return this;const{segments:r,origin:[s,n,i]}=this,o={};for(const[c,l]of Object.entries(e))c==="skew"&&Array.isArray(l)||(c==="rotate"||c==="translate"||c==="origin"||c==="scale")&&Array.isArray(l)?o[c]=l.map(Number):c!=="origin"&&typeof Number(l)=="number"&&(o[c]=Number(l));const{origin:a}=o;if(Array.isArray(a)&&a.length>=2){const[c,l,m]=a.map(Number);o.origin=[Number.isNaN(c)?s:c,Number.isNaN(l)?n:l,m||i]}else o.origin=[s,n,i];return this.segments=bt(r,o),this}flipX(){const{cx:e,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[e,r,0]}),this}flipY(){const{cx:e,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[e,r,0]}),this}toString(){return we(this.segments,this.round)}dispose(){Object.keys(this).forEach(e=>delete this[e])}}return x.CSSMatrix=N,x.absolutizeSegment=ne,x.arcToCubic=me,x.default=sn,x.distanceEpsilon=ge,x.error=R,x.finalizeSegment=Me,x.getClosestPoint=Dt,x.getDrawDirection=Bt,x.getPathArea=xt,x.getPathBBox=nt,x.getPointAtLength=ie,x.getPropertiesAtLength=qe,x.getPropertiesAtPoint=Ae,x.getSVGMatrix=dt,x.getSegmentAtLength=Ht,x.getSegmentOfPoint=Ft,x.getTotalLength=ee,x.invalidPathValue=U,x.isAbsoluteArray=At,x.isArcCommand=De,x.isCurveArray=Gt,x.isDigit=G,x.isDigitStart=Ze,x.isMoveCommand=Oe,x.isNormalizedArray=pt,x.isPathArray=pe,x.isPathCommand=Qe,x.isPointInStroke=Ut,x.isRelativeArray=_t,x.isSpace=je,x.isValidPath=Mt,x.iterate=Z,x.lineToCubic=Ne,x.normalizePath=se,x.normalizeSegment=ue,x.optimizePath=st,x.paramsCount=W,x.paramsParser=re,x.parsePathString=Q,x.pathParser=Pe,x.pathToAbsolute=ae,x.pathToCurve=he,x.pathToRelative=Be,x.pathToString=we,x.projection2d=ze,x.quadToCubic=He,x.relativizeSegment=Se,x.reverseCurve=tn,x.reversePath=be,x.roundPath=nn,x.roundSegment=de,x.scanFlag=Ee,x.scanParam=Re,x.scanSegment=Ce,x.segmentToCubic=Fe,x.shapeParams=ce,x.shapeToPath=en,x.shapeToPathArray=Pt,x.shortenSegment=rt,x.skipSpaces=X,x.splitCubic=rn,x.splitPath=it,x.transformPath=bt,Object.defineProperties(x,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}}),x}({}); +var SVGPathCommander=function(){"use strict";var Ee=Object.defineProperty,Re=(e,t,r)=>t in e?Ee(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,V=(e,t,r)=>Re(e,typeof t!="symbol"?t+"":t,r);const je={a:1,b:0,c:0,d:1,e:0,f:0,m11:1,m12:0,m13:0,m14:0,m21:0,m22:1,m23:0,m24:0,m31:0,m32:0,m33:1,m34:0,m41:0,m42:0,m43:0,m44:1,is2D:!0,isIdentity:!0},Ft=e=>(e instanceof Float64Array||e instanceof Float32Array||Array.isArray(e)&&e.every(t=>typeof t=="number"))&&[6,16].some(t=>e.length===t),Gt=e=>e instanceof DOMMatrix||e instanceof S||typeof e=="object"&&Object.keys(je).every(t=>e&&t in e),et=e=>{const t=new S,r=Array.from(e);if(!Ft(r))throw TypeError(`CSSMatrix: "${r.join(",")}" must be an array with 6/16 numbers.`);if(r.length===16){const[s,n,i,o,a,c,l,m,h,f,g,u,y,p,b,A]=r;t.m11=s,t.a=s,t.m21=a,t.c=a,t.m31=h,t.m41=y,t.e=y,t.m12=n,t.b=n,t.m22=c,t.d=c,t.m32=f,t.m42=p,t.f=p,t.m13=i,t.m23=l,t.m33=g,t.m43=b,t.m14=o,t.m24=m,t.m34=u,t.m44=A}else if(r.length===6){const[s,n,i,o,a,c]=r;t.m11=s,t.a=s,t.m12=n,t.b=n,t.m21=i,t.c=i,t.m22=o,t.d=o,t.m41=a,t.e=a,t.m42=c,t.f=c}return t},Ut=e=>{if(Gt(e))return et([e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44]);throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a DOMMatrix / CSSMatrix / JSON compatible object.`)},_t=e=>{if(typeof e!="string")throw TypeError(`CSSMatrix: "${JSON.stringify(e)}" is not a string.`);const t=String(e).replace(/\s/g,"");let r=new S;const s=`CSSMatrix: invalid transform string "${e}"`;return t.split(")").filter(n=>n).forEach(n=>{const[i,o]=n.split("(");if(!o)throw TypeError(s);const a=o.split(",").map(u=>u.includes("rad")?parseFloat(u)*(180/Math.PI):parseFloat(u)),[c,l,m,h]=a,f=[c,l,m],g=[c,l,m,h];if(i==="perspective"&&c&&[l,m].every(u=>u===void 0))r.m34=-1/c;else if(i.includes("matrix")&&[6,16].includes(a.length)&&a.every(u=>!Number.isNaN(+u))){const u=a.map(y=>Math.abs(y)<1e-6?0:y);r=r.multiply(et(u))}else if(i==="translate3d"&&f.every(u=>!Number.isNaN(+u)))r=r.translate(c,l,m);else if(i==="translate"&&c&&m===void 0)r=r.translate(c,l||0,0);else if(i==="rotate3d"&&g.every(u=>!Number.isNaN(+u))&&h)r=r.rotateAxisAngle(c,l,m,h);else if(i==="rotate"&&c&&[l,m].every(u=>u===void 0))r=r.rotate(0,0,c);else if(i==="scale3d"&&f.every(u=>!Number.isNaN(+u))&&f.some(u=>u!==1))r=r.scale(c,l,m);else if(i==="scale"&&!Number.isNaN(c)&&(c!==1||l!==1)&&m===void 0){const u=Number.isNaN(+l)?c:l;r=r.scale(c,u,1)}else if(i==="skew"&&(c||!Number.isNaN(c)&&l)&&m===void 0)r=r.skew(c,l||0);else if(["translate","rotate","scale","skew"].some(u=>i.includes(u))&&/[XYZ]/.test(i)&&c&&[l,m].every(u=>u===void 0))if(i==="skewX"||i==="skewY")r=r[i](c);else{const u=i.replace(/[XYZ]/,""),y=i.replace(u,""),p=["X","Y","Z"].indexOf(y),b=u==="scale"?1:0,A=[p===0?c:b,p===1?c:b,p===2?c:b];r=r[u](...A)}else throw TypeError(s)}),r},Nt=(e,t)=>t?[e.a,e.b,e.c,e.d,e.e,e.f]:[e.m11,e.m12,e.m13,e.m14,e.m21,e.m22,e.m23,e.m24,e.m31,e.m32,e.m33,e.m34,e.m41,e.m42,e.m43,e.m44],Jt=(e,t,r)=>{const s=new S;return s.m41=e,s.e=e,s.m42=t,s.f=t,s.m43=r,s},Kt=(e,t,r)=>{const s=new S,n=Math.PI/180,i=e*n,o=t*n,a=r*n,c=Math.cos(i),l=-Math.sin(i),m=Math.cos(o),h=-Math.sin(o),f=Math.cos(a),g=-Math.sin(a),u=m*f,y=-m*g;s.m11=u,s.a=u,s.m12=y,s.b=y,s.m13=h;const p=l*h*f+c*g;s.m21=p,s.c=p;const b=c*f-l*h*g;return s.m22=b,s.d=b,s.m23=-l*m,s.m31=l*g-c*h*f,s.m32=l*f+c*h*g,s.m33=c*m,s},Wt=(e,t,r,s)=>{const n=new S,i=Math.sqrt(e*e+t*t+r*r);if(i===0)return n;const o=e/i,a=t/i,c=r/i,l=s*(Math.PI/360),m=Math.sin(l),h=Math.cos(l),f=m*m,g=o*o,u=a*a,y=c*c,p=1-2*(u+y)*f;n.m11=p,n.a=p;const b=2*(o*a*f+c*m*h);n.m12=b,n.b=b,n.m13=2*(o*c*f-a*m*h);const A=2*(a*o*f-c*m*h);n.m21=A,n.c=A;const d=1-2*(y+g)*f;return n.m22=d,n.d=d,n.m23=2*(a*c*f+o*m*h),n.m31=2*(c*o*f+a*m*h),n.m32=2*(c*a*f-o*m*h),n.m33=1-2*(g+u)*f,n},Xt=(e,t,r)=>{const s=new S;return s.m11=e,s.a=e,s.m22=t,s.d=t,s.m33=r,s},mt=(e,t)=>{const r=new S;if(e){const s=e*Math.PI/180,n=Math.tan(s);r.m21=n,r.c=n}if(t){const s=t*Math.PI/180,n=Math.tan(s);r.m12=n,r.b=n}return r},Yt=e=>mt(e,0),te=e=>mt(0,e),B=(e,t)=>{const r=t.m11*e.m11+t.m12*e.m21+t.m13*e.m31+t.m14*e.m41,s=t.m11*e.m12+t.m12*e.m22+t.m13*e.m32+t.m14*e.m42,n=t.m11*e.m13+t.m12*e.m23+t.m13*e.m33+t.m14*e.m43,i=t.m11*e.m14+t.m12*e.m24+t.m13*e.m34+t.m14*e.m44,o=t.m21*e.m11+t.m22*e.m21+t.m23*e.m31+t.m24*e.m41,a=t.m21*e.m12+t.m22*e.m22+t.m23*e.m32+t.m24*e.m42,c=t.m21*e.m13+t.m22*e.m23+t.m23*e.m33+t.m24*e.m43,l=t.m21*e.m14+t.m22*e.m24+t.m23*e.m34+t.m24*e.m44,m=t.m31*e.m11+t.m32*e.m21+t.m33*e.m31+t.m34*e.m41,h=t.m31*e.m12+t.m32*e.m22+t.m33*e.m32+t.m34*e.m42,f=t.m31*e.m13+t.m32*e.m23+t.m33*e.m33+t.m34*e.m43,g=t.m31*e.m14+t.m32*e.m24+t.m33*e.m34+t.m34*e.m44,u=t.m41*e.m11+t.m42*e.m21+t.m43*e.m31+t.m44*e.m41,y=t.m41*e.m12+t.m42*e.m22+t.m43*e.m32+t.m44*e.m42,p=t.m41*e.m13+t.m42*e.m23+t.m43*e.m33+t.m44*e.m43,b=t.m41*e.m14+t.m42*e.m24+t.m43*e.m34+t.m44*e.m44;return et([r,s,n,i,o,a,c,l,m,h,f,g,u,y,p,b])};class S{constructor(t){return 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,t?this.setMatrixValue(t):this}get isIdentity(){return 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}get is2D(){return this.m31===0&&this.m32===0&&this.m33===1&&this.m34===0&&this.m43===0&&this.m44===1}setMatrixValue(t){return typeof t=="string"&&t.length&&t!=="none"?_t(t):Array.isArray(t)||t instanceof Float64Array||t instanceof Float32Array?et(t):typeof t=="object"?Ut(t):this}toFloat32Array(t){return Float32Array.from(Nt(this,t))}toFloat64Array(t){return Float64Array.from(Nt(this,t))}toString(){const{is2D:t}=this,r=this.toFloat64Array(t).join(", ");return`${t?"matrix":"matrix3d"}(${r})`}toJSON(){const{is2D:t,isIdentity:r}=this;return{...this,is2D:t,isIdentity:r}}multiply(t){return B(this,t)}translate(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=0),typeof o>"u"&&(o=0),B(this,Jt(n,i,o))}scale(t,r,s){const n=t;let i=r,o=s;return typeof i>"u"&&(i=t),typeof o>"u"&&(o=1),B(this,Xt(n,i,o))}rotate(t,r,s){let n=t,i=r||0,o=s||0;return typeof t=="number"&&typeof r>"u"&&typeof s>"u"&&(o=n,n=0,i=0),B(this,Kt(n,i,o))}rotateAxisAngle(t,r,s,n){if([t,r,s,n].some(i=>Number.isNaN(+i)))throw new TypeError("CSSMatrix: expecting 4 values");return B(this,Wt(t,r,s,n))}skewX(t){return B(this,Yt(t))}skewY(t){return B(this,te(t))}skew(t,r){return B(this,mt(t,r))}transformPoint(t){const r=this.m11*t.x+this.m21*t.y+this.m31*t.z+this.m41*t.w,s=this.m12*t.x+this.m22*t.y+this.m32*t.z+this.m42*t.w,n=this.m13*t.x+this.m23*t.y+this.m33*t.z+this.m43*t.w,i=this.m14*t.x+this.m24*t.y+this.m34*t.z+this.m44*t.w;return t instanceof DOMPoint?new DOMPoint(r,s,n,i):{x:r,y:s,z:n,w:i}}}V(S,"Translate",Jt),V(S,"Rotate",Kt),V(S,"RotateAxisAngle",Wt),V(S,"Scale",Xt),V(S,"SkewX",Yt),V(S,"SkewY",te),V(S,"Skew",mt),V(S,"Multiply",B),V(S,"fromArray",et),V(S,"fromMatrix",Ut),V(S,"fromString",_t),V(S,"toArray",Nt),V(S,"isCompatibleArray",Ft),V(S,"isCompatibleObject",Gt);const O=(e,t,r)=>{const[s,n]=e,[i,o]=t;return[s+(i-s)*r,n+(o-n)*r]},ut=(e,t)=>Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])),nt=(e,t,r,s)=>ut([e,t],[r,s]),wt=(e,t,r,s,n)=>{let i={x:e,y:t};if(typeof n=="number"){const o=ut([e,t],[r,s]);if(n<=0)i={x:e,y:t};else if(n>=o)i={x:r,y:s};else{const[a,c]=O([e,t],[r,s],n/o);i={x:a,y:c}}}return i},Lt=(e,t,r,s)=>{const{min:n,max:i}=Math;return[n(e,r),n(t,s),i(e,r),i(t,s)]},Qe={getLineBBox:Lt,getLineLength:nt,getPointAtLineLength:wt},Tt=(e,t,r)=>{const s=r/2,n=Math.sin(s),i=Math.cos(s),o=e**2*n**2,a=t**2*i**2,c=Math.sqrt(o+a)*r;return Math.abs(c)},U=(e,t,r,s,n,i)=>{const{sin:o,cos:a}=Math,c=a(n),l=o(n),m=r*a(i),h=s*o(i);return[e+c*m-l*h,t+l*m+c*h]},vt=(e,t)=>{const{x:r,y:s}=e,{x:n,y:i}=t,o=r*n+s*i,a=Math.sqrt((r**2+s**2)*(n**2+i**2));return(r*i-s*n<0?-1:1)*Math.acos(o/a)},ht=(e,t,r,s,n,i,o,a,c)=>{const{abs:l,sin:m,cos:h,sqrt:f,PI:g}=Math;let u=l(r),y=l(s);const b=(n%360+360)%360*(g/180);if(e===a&&t===c)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:a,y:c}};if(u===0||y===0)return{rx:u,ry:y,startAngle:0,endAngle:0,center:{x:(a+e)/2,y:(c+t)/2}};const A=(e-a)/2,d=(t-c)/2,x={x:h(b)*A+m(b)*d,y:-m(b)*A+h(b)*d},M=x.x**2/u**2+x.y**2/y**2;M>1&&(u*=f(M),y*=f(M));const P=u**2*y**2-u**2*x.y**2-y**2*x.x**2,$=u**2*x.y**2+y**2*x.x**2;let q=P/$;q=q<0?0:q;const T=(i!==o?1:-1)*f(q),N={x:T*(u*x.y/y),y:T*(-(y*x.x)/u)},Z={x:h(b)*N.x-m(b)*N.y+(e+a)/2,y:m(b)*N.x+h(b)*N.y+(t+c)/2},J={x:(x.x-N.x)/u,y:(x.y-N.y)/y},z=vt({x:1,y:0},J),C={x:(-x.x-N.x)/u,y:(-x.y-N.y)/y};let k=vt(J,C);!o&&k>0?k-=2*g:o&&k<0&&(k+=2*g),k%=2*g;const D=z+k;return{center:Z,startAngle:z,endAngle:D,rx:u,ry:y}},$t=(e,t,r,s,n,i,o,a,c)=>{const{rx:l,ry:m,startAngle:h,endAngle:f}=ht(e,t,r,s,n,i,o,a,c);return Tt(l,m,f-h)},ee=(e,t,r,s,n,i,o,a,c,l)=>{let m={x:e,y:t};const{center:h,rx:f,ry:g,startAngle:u,endAngle:y}=ht(e,t,r,s,n,i,o,a,c);if(typeof l=="number"){const p=Tt(f,g,y-u);if(l<=0)m={x:e,y:t};else if(l>=p)m={x:a,y:c};else{if(e===a&&t===c)return{x:a,y:c};if(f===0||g===0)return wt(e,t,a,c,l);const{PI:b,cos:A,sin:d}=Math,x=y-u,P=(n%360+360)%360*(b/180),$=u+x*(l/p),q=f*A($),T=g*d($);m={x:A(P)*q-d(P)*T+h.x,y:d(P)*q+A(P)*T+h.y}}}return m},ne=(e,t,r,s,n,i,o,a,c)=>{const{center:l,rx:m,ry:h,startAngle:f,endAngle:g}=ht(e,t,r,s,n,i,o,a,c),u=g-f,{min:y,max:p,tan:b,atan2:A,PI:d}=Math,{x,y:M}=l,P=n*d/180,$=b(P),q=A(-h*$,m),T=q,N=q+d,Z=A(h,m*$),J=Z+d,z=[a],C=[c];let k=y(e,a),D=p(e,a),E=y(t,c),H=p(t,c);const tt=g-u*1e-5,K=U(x,M,m,h,P,tt),w=g-u*.99999,I=U(x,M,m,h,P,w);if(K[0]>D||I[0]>D){const v=U(x,M,m,h,P,T);z.push(v[0]),C.push(v[1])}if(K[0]H||I[1]>H){const v=U(x,M,m,h,P,Z);z.push(v[0]),C.push(v[1])}return k=y.apply([],z),E=y.apply([],C),D=p.apply([],z),H=p.apply([],C),[k,E,D,H]},Ze={angleBetween:vt,arcLength:Tt,arcPoint:U,getArcBBox:ne,getArcLength:$t,getArcProps:ht,getPointAtArcLength:ee},qt=[-.06405689286260563,.06405689286260563,-.1911188674736163,.1911188674736163,-.3150426796961634,.3150426796961634,-.4337935076260451,.4337935076260451,-.5454214713888396,.5454214713888396,-.6480936519369755,.6480936519369755,-.7401241915785544,.7401241915785544,-.820001985973903,.820001985973903,-.8864155270044011,.8864155270044011,-.9382745520027328,.9382745520027328,-.9747285559713095,.9747285559713095,-.9951872199970213,.9951872199970213],re=[.12793819534675216,.12793819534675216,.1258374563468283,.1258374563468283,.12167047292780339,.12167047292780339,.1155056680537256,.1155056680537256,.10744427011596563,.10744427011596563,.09761865210411388,.09761865210411388,.08619016153195327,.08619016153195327,.0733464814110803,.0733464814110803,.05929858491543678,.05929858491543678,.04427743881741981,.04427743881741981,.028531388628933663,.028531388628933663,.0123412297999872,.0123412297999872],se=e=>{const t=[];for(let r=e,s=r.length,n=s-1;s>1;s-=1,n-=1){const i=[];for(let o=0;o{if(t===0)return e[0].t=0,e[0];const r=e.length-1;if(t===1)return e[r].t=1,e[r];const s=1-t;let n=e;if(r===0)return e[0].t=t,e[0];if(r===1)return{x:s*n[0].x+t*n[1].x,y:s*n[0].y+t*n[1].y,t};const i=s*s,o=t*t;let a=0,c=0,l=0,m=0;return r===2?(n=[n[0],n[1],n[2],{x:0,y:0}],a=i,c=s*t*2,l=o):r===3&&(a=i*s,c=i*t*3,l=s*o*3,m=t*o),{x:a*n[0].x+c*n[1].x+l*n[2].x+m*n[3].x,y:a*n[0].y+c*n[1].y+l*n[2].y+m*n[3].y,t}},oe=(e,t)=>{const r=e(t),s=r.x*r.x+r.y*r.y;return Math.sqrt(s)},ce=e=>{const r=qt.length;let s=0;for(let n=0,i;n{const t=[];for(let s=0,n=e.length,i=2;sie(r[0],s))},ae=1e-8,ft=([e,t,r])=>{const s=Math.min(e,r),n=Math.max(e,r);if(t>=e?r>=t:r<=t)return[s,n];const i=(e*r-t*t)/(e-2*t+r);return i{const n=e-3*t+3*r-s;if(Math.abs(n)0&&m<1){const f=e*(1-m)*(1-m)*(1-m)+t*3*(1-m)*(1-m)*m+r*3*(1-m)*m*m+s*m*m*m;fc&&(c=f)}return[a,c]},De={bezierLength:ce,calculateBezier:oe,CBEZIER_MINMAX_EPSILON:ae,computeBezier:ie,Cvalues:re,deriveBezier:se,getBezierLength:rt,minmaxC:zt,minmaxQ:ft,Tvalues:qt},le=([e,t,r,s,n,i,o,a],c)=>{const l=1-c;return{x:l**3*e+3*l**2*c*r+3*l*c**2*n+c**3*o,y:l**3*t+3*l**2*c*s+3*l*c**2*i+c**3*a}},gt=(e,t,r,s,n,i,o,a)=>rt([e,t,r,s,n,i,o,a]),me=(e,t,r,s,n,i,o,a,c)=>{const l=typeof c=="number";let m={x:e,y:t};if(l){const h=rt([e,t,r,s,n,i,o,a]);c<=0||(c>=h?m={x:o,y:a}:m=le([e,t,r,s,n,i,o,a],c/h))}return m},kt=(e,t,r,s,n,i,o,a)=>{const c=zt([e,r,n,o]),l=zt([t,s,i,a]);return[c[0],l[0],c[1],l[1]]},Oe={getCubicBBox:kt,getCubicLength:gt,getPointAtCubicLength:me,getPointAtCubicSegmentLength:le},ue=([e,t,r,s,n,i],o)=>{const a=1-o;return{x:a**2*e+2*a*o*r+o**2*n,y:a**2*t+2*a*o*s+o**2*i}},yt=(e,t,r,s,n,i)=>rt([e,t,r,s,n,i]),he=(e,t,r,s,n,i,o)=>{const a=typeof o=="number";let c={x:e,y:t};if(a){const l=rt([e,t,r,s,n,i]);o<=0||(o>=l?c={x:n,y:i}:c=ue([e,t,r,s,n,i],o/l))}return c},It=(e,t,r,s,n,i)=>{const o=ft([e,r,n]),a=ft([t,s,i]);return[o[0],a[0],o[1],a[1]]},Be={getPointAtQuadLength:he,getPointAtQuadSegmentLength:ue,getQuadBBox:It,getQuadLength:yt},He={polygonArea:e=>{const t=e.length;let r=-1,s,n=e[t-1],i=0;for(;++re.reduce((t,r,s)=>s?t+ut(e[s-1],r):0,0)},st=(e,t,r)=>{const{sin:s,cos:n}=Math,i=e*n(r)-t*s(r),o=e*s(r)+t*n(r);return{x:i,y:o}},L=(e,t)=>{const r=t>=1?10**t:1;return t>0?Math.round(e*r)/r:Math.round(e)},_={origin:[0,0,0],round:4},W={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},Vt=e=>{let t=e.pathValue[e.segmentStart],r=t.toLowerCase();const{data:s}=e;for(;s.length>=W[r]&&(r==="m"&&s.length>2?(e.segments.push([t].concat(s.splice(0,2))),r="l",t=t==="m"?"l":"L"):e.segments.push([t].concat(s.splice(0,W[r]))),!!W[r]););},R="SVGPathCommander Error",fe=e=>{const{index:t,pathValue:r}=e,s=r.charCodeAt(t);if(s===48){e.param=0,e.index+=1;return}if(s===49){e.param=1,e.index+=1;return}e.err=`${R}: invalid Arc flag "${r[t]}", expecting 0 or 1 at index ${t}`},F=e=>e>=48&&e<=57,G="Invalid path value",ge=e=>{const{max:t,pathValue:r,index:s}=e;let n=s,i=!1,o=!1,a=!1,c=!1,l;if(n>=t){e.err=`${R}: ${G} at index ${n}, "pathValue" is missing param`;return}if(l=r.charCodeAt(n),(l===43||l===45)&&(n+=1,l=r.charCodeAt(n)),!F(l)&&l!==46){e.err=`${R}: ${G} at index ${n}, "${r[n]}" is not a number`;return}if(l!==46){if(i=l===48,n+=1,l=r.charCodeAt(n),i&&n[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279,10,13,8232,8233,32,9,11,12,160].includes(e),X=e=>{const{pathValue:t,max:r}=e;for(;e.index{switch(e|32){case 109:case 122:case 108:case 104:case 118:case 99:case 115:case 113:case 116:case 97:return!0;default:return!1}},xe=e=>F(e)||e===43||e===45||e===46,pe=e=>(e|32)===97,be=e=>{switch(e|32){case 109:case 77:return!0;default:return!1}},Et=e=>{var c;const{max:t,pathValue:r,index:s,segments:n}=e,i=r.charCodeAt(s),o=W[r[s].toLowerCase()];if(e.segmentStart=s,!de(i)){e.err=`${R}: ${G} "${r[s]}" is not a path command at index ${s}`;return}const a=n[n.length-1];if(!be(i)&&((c=a==null?void 0:a[0])==null?void 0:c.toLocaleLowerCase())==="z"){e.err=`${R}: ${G} "${r[s]}" is not a MoveTo path command at index ${s}`;return}if(e.index+=1,X(e),e.data=[],!o){Vt(e);return}for(;;){for(let l=o;l>0;l-=1){if(pe(i)&&(l===3||l===4)?fe(e):ge(e),e.err.length)return;e.data.push(e.param),X(e),e.index=e.max||!xe(r.charCodeAt(e.index)))break}Vt(e)};class Rt{constructor(t){this.segments=[],this.pathValue=t,this.max=t.length,this.index=0,this.param=0,this.segmentStart=0,this.data=[],this.err=""}}const j=e=>{if(typeof e!="string")return e.slice(0);const t=new Rt(e);for(X(t);t.index{const[n]=e,i=n.toUpperCase();if(t===0||i===n)return e;if(i==="A")return[i,e[1],e[2],e[3],e[4],e[5],e[6]+r,e[7]+s];if(i==="V")return[i,e[1]+s];if(i==="H")return[i,e[1]+r];if(i==="L")return[i,e[1]+r,e[2]+s];{const a=[],c=e.length;for(let l=1;l{let r=e.length,s,n="M",i="M",o=!1,a=0,c=0,l=0,m=0,h=0;for(let f=0;f{const t=j(e);return Q(t,it)},jt=(e,t,r,s)=>{const[n]=e,i=n.toLowerCase();if(t===0||n===i)return e;if(i==="a")return[i,e[1],e[2],e[3],e[4],e[5],e[6]-r,e[7]-s];if(i==="v")return[i,e[1]-s];if(i==="h")return[i,e[1]-r];if(i==="l")return[i,e[1]-r,e[2]-s];{const a=[],c=e.length;for(let l=1;l{const t=j(e);return Q(t,jt)},xt=(e,t,r,s,n,i,o,a,c,l)=>{let m=e,h=t,f=r,g=s,u=a,y=c;const p=Math.PI*120/180,b=Math.PI/180*(+n||0);let A=[],d,x,M,P,$;if(l)[x,M,P,$]=l;else{d=st(m,h,-b),m=d.x,h=d.y,d=st(u,y,-b),u=d.x,y=d.y;const w=(m-u)/2,I=(h-y)/2;let v=w*w/(f*f)+I*I/(g*g);v>1&&(v=Math.sqrt(v),f*=v,g*=v);const Bt=f*f,Ht=g*g,Ve=(i===o?-1:1)*Math.sqrt(Math.abs((Bt*Ht-Bt*I*I-Ht*w*w)/(Bt*I*I+Ht*w*w)));P=Ve*f*I/g+(m+u)/2,$=Ve*-g*w/f+(h+y)/2,x=Math.asin(((h-$)/g*10**9>>0)/10**9),M=Math.asin(((y-$)/g*10**9>>0)/10**9),x=mM&&(x-=Math.PI*2),!o&&M>x&&(M-=Math.PI*2)}let q=M-x;if(Math.abs(q)>p){const w=M,I=u,v=y;M=x+p*(o&&M>x?1:-1),u=P+f*Math.cos(M),y=$+g*Math.sin(M),A=xt(u,y,f,g,n,0,o,I,v,[M,w,P,$])}q=M-x;const T=Math.cos(x),N=Math.sin(x),Z=Math.cos(M),J=Math.sin(M),z=Math.tan(q/4),C=4/3*f*z,k=4/3*g*z,D=[m,h],E=[m+C*N,h-k*T],H=[u+C*J,y-k*Z],tt=[u,y];if(E[0]=2*D[0]-E[0],E[1]=2*D[1]-E[1],l)return[E[0],E[1],H[0],H[1],tt[0],tt[1]].concat(A);A=[E[0],E[1],H[0],H[1],tt[0],tt[1]].concat(A);const K=[];for(let w=0,I=A.length;w{const o=.3333333333333333,a=2/3;return[o*e+a*r,o*t+a*s,o*n+a*r,o*i+a*s,n,i]},Qt=(e,t,r,s)=>{const n=O([e,t],[r,s],.3333333333333333),i=O([e,t],[r,s],2/3);return[n[0],n[1],i[0],i[1],r,s]},Ce=(e,t)=>{const[r]=e,s=e.slice(1).map(Number),[n,i]=s,{x1:o,y1:a,x:c,y:l}=t;return"TQ".includes(r)||(t.qx=null,t.qy=null),r==="M"?(t.x=n,t.y=i,e):r==="A"?["C"].concat(xt(o,a,s[0],s[1],s[2],s[3],s[4],s[5],s[6])):r==="Q"?(t.qx=n,t.qy=i,["C"].concat(Me(o,a,s[0],s[1],s[2],s[3]))):r==="L"?["C"].concat(Qt(o,a,n,i)):r==="Z"?["C"].concat(Qt(o,a,c,l)):e},pt=(e,t)=>{const[r]=e,s=r.toUpperCase(),n=r!==s,{x1:i,y1:o,x2:a,y2:c,x:l,y:m}=t,h=e.slice(1);let f=h.map((g,u)=>g+(n?u%2?m:l:0));if("TQ".includes(s)||(t.qx=null,t.qy=null),s==="A")return f=h.slice(0,-2).concat(h[5]+(n?l:0),h[6]+(n?m:0)),["A"].concat(f);if(s==="H")return["L",e[1]+(n?l:0),o];if(s==="V")return["L",i,e[1]+(n?m:0)];if(s==="L")return["L",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="M")return["M",e[1]+(n?l:0),e[2]+(n?m:0)];if(s==="C")return["C"].concat(f);if(s==="S"){const g=i*2-a,u=o*2-c;return t.x1=g,t.y1=u,["C",g,u].concat(f)}else if(s==="T"){const g=i*2-(t.qx?t.qx:0),u=o*2-(t.qy?t.qy:0);return t.qx=g,t.qy=u,["Q",g,u].concat(f)}else if(s==="Q"){const[g,u]=f;return t.qx=g,t.qy=u,["Q"].concat(f)}else if(s==="Z")return["Z"];return e},ot={x1:0,y1:0,x2:0,y2:0,x:0,y:0,qx:null,qy:null},bt=e=>{const t={...ot},r=j(e);return Q(r,(s,n,i,o)=>{t.x=i,t.y=o;const a=pt(s,t);let c=Ce(a,t);c[0]==="C"&&c.length>7&&(r.splice(n+1,0,["C"].concat(c.slice(7))),c=c.slice(0,7));const m=c.length;return t.x1=+c[m-2],t.y1=+c[m-1],t.x2=+c[m-4]||t.x1,t.y2=+c[m-3]||t.y1,c})},Zt=(e,t)=>{const r=e.length;let{round:s}=_,n=e[0],i="";s=t==="off"||typeof t=="number"&&t>=0?t:typeof s=="number"&&s>=0?s:"off";for(let o=0;o{if(!e)return{x:0,y:0,width:0,height:0,x2:0,y2:0,cx:0,cy:0,cz:0};const t=j(e);let r="M",s=0,n=0;const{max:i,min:o}=Math;let a=1/0,c=1/0,l=-1/0,m=-1/0,h=0,f=0,g=0,u=0,y=0,p=0,b=0,A=0,d=0,x=0;Q(t,($,q,T,N)=>{[r]=$;const Z=r.toUpperCase(),z=Z!==r?it($,q,T,N):$.slice(0),C=Z==="V"?["L",T,z[1]]:Z==="H"?["L",z[1],N]:z;if([r]=C,"TQ".includes(Z)||(d=0,x=0),r==="M")[,s,n]=C,h=s,f=n,g=s,u=n;else if(r==="L")[h,f,g,u]=Lt(T,N,C[1],C[2]);else if(r==="A")[h,f,g,u]=ne(T,N,C[1],C[2],C[3],C[4],C[5],C[6],C[7]);else if(r==="S"){const k=y*2-b,D=p*2-A;[h,f,g,u]=kt(T,N,k,D,C[1],C[2],C[3],C[4])}else r==="C"?[h,f,g,u]=kt(T,N,C[1],C[2],C[3],C[4],C[5],C[6]):r==="T"?(d=y*2-d,x=p*2-x,[h,f,g,u]=It(T,N,d,x,C[1],C[2])):r==="Q"?(d=C[1],x=C[2],[h,f,g,u]=It(T,N,C[1],C[2],C[3],C[4])):r==="Z"&&([h,f,g,u]=Lt(T,N,s,n));a=o(h,a),c=o(f,c),l=i(g,l),m=i(u,m),[y,p]=r==="Z"?[s,n]:C.slice(-2),[b,A]=r==="C"?[C[3],C[4]]:r==="S"?[C[1],C[2]]:[y,p]});const M=l-a,P=m-c;return{width:M,height:P,x:a,y:c,x2:l,y2:m,cx:a+M/2,cy:c+P/2,cz:Math.max(M,P)+Math.min(M,P)/2}},Y=e=>{const t=j(e);let r=0,s=0,n=0,i=0,o=0,a=0,c="M",l=0,m=0,h=0;return Q(t,(f,g,u,y)=>{[c]=f;const p=c.toUpperCase(),A=p!==c?it(f,g,u,y):f.slice(0),d=p==="V"?["L",u,A[1]]:p==="H"?["L",A[1],y]:A;if([c]=d,"TQ".includes(p)||(o=0,a=0),c==="M")[,l,m]=d;else if(c==="L")h+=nt(u,y,d[1],d[2]);else if(c==="A")h+=$t(u,y,d[1],d[2],d[3],d[4],d[5],d[6],d[7]);else if(c==="S"){const x=r*2-n,M=s*2-i;h+=gt(u,y,x,M,d[1],d[2],d[3],d[4])}else c==="C"?h+=gt(u,y,d[1],d[2],d[3],d[4],d[5],d[6]):c==="T"?(o=r*2-o,a=s*2-a,h+=yt(u,y,o,a,d[1],d[2])):c==="Q"?(o=d[1],a=d[2],h+=yt(u,y,d[1],d[2],d[3],d[4])):c==="Z"&&(h+=nt(u,y,l,m));[r,s]=c==="Z"?[l,m]:d.slice(-2),[n,i]=c==="C"?[d[3],d[4]]:c==="S"?[d[1],d[2]]:[r,s]}),h},At=1e-5,ct=e=>{const t=j(e),r={...ot};return Q(t,(s,n,i,o)=>{r.x=i,r.y=o;const a=pt(s,r),c=a.length;return r.x1=+a[c-2],r.y1=+a[c-1],r.x2=+a[c-4]||r.x1,r.y2=+a[c-3]||r.y1,a})},at=(e,t)=>{const r=ct(e);let s=!1,n=[],i="M",o=0,a=0,[c,l]=r[0].slice(1);const m=typeof t=="number";let h={x:c,y:l},f=0,g=h,u=0;return!m||t{if([i]=y,s=i==="M",n=s?n:[b,A].concat(y.slice(1)),s?([,c,l]=y,h={x:c,y:l},f=0):i==="L"?(h=wt(n[0],n[1],n[2],n[3],t-u),f=nt(n[0],n[1],n[2],n[3])):i==="A"?(h=ee(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8],t-u),f=$t(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8])):i==="C"?(h=me(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],t-u),f=gt(n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7])):i==="Q"?(h=he(n[0],n[1],n[2],n[3],n[4],n[5],t-u),f=yt(n[0],n[1],n[2],n[3],n[4],n[5])):i==="Z"&&(n=[b,A,c,l],h={x:c,y:l},f=nt(n[0],n[1],n[2],n[3])),[o,a]=n.slice(-2),uu-At?{x:o,y:a}:g)},Dt=(e,t)=>{const r=j(e);let s=r.slice(0),n=Y(s),i=s.length-1,o=0,a=0,c=r[0];if(i<=0||!t||!Number.isFinite(t))return{segment:c,index:0,length:a,lengthAtSegment:o};if(t>=n)return s=r.slice(0,-1),o=Y(s),a=n-o,c=r[i],{segment:c,index:i,length:a,lengthAtSegment:o};const l=[];for(;i>0;)c=s[i],s=s.slice(0,-1),o=Y(s),a=n-o,n=o,l.push({segment:c,index:i,length:a,lengthAtSegment:o}),i-=1;return l.find(({lengthAtSegment:m})=>m<=t)},Mt=(e,t)=>{const r=j(e),s=ct(r),n=Y(s),i=x=>{const M=x.x-t.x,P=x.y-t.y;return M*M+P*P};let o=8,a,c={x:0,y:0},l=0,m=0,h=1/0;for(let x=0;x<=n;x+=o)a=at(s,x),l=i(a),l1e-6&&(u=m-o,f=at(s,u),p=i(f),y=m+o,g=at(s,y),b=i(g),u>=0&&pMt(e,t).closest,Ge=(e,t,r,s,n,i,o,a)=>3*((a-t)*(r+n)-(o-e)*(s+i)+s*(e-n)-r*(t-i)+a*(n+e/3)-o*(i+t/3))/20,Se=e=>{let t=0,r=0,s=0;return bt(e).map(n=>{switch(n[0]){case"M":return[,t,r]=n,0;default:return s=Ge(t,r,n[1],n[2],n[3],n[4],n[5],n[6]),[t,r]=n.slice(-2),s}}).reduce((n,i)=>n+i,0)},Ue=e=>Se(bt(e))>=0,_e=(e,t)=>Dt(e,t).segment,Je=(e,t)=>Mt(e,t).segment,Ct=e=>Array.isArray(e)&&e.every(t=>{const r=t[0].toLowerCase();return W[r]===t.length-1&&"achlmqstvz".includes(r)&&t.slice(1).every(Number.isFinite)})&&e.length>0,Ne=e=>Ct(e)&&e.every(([t])=>t===t.toUpperCase()),we=e=>Ne(e)&&e.every(([t])=>"ACLMQZ".includes(t)),Ke=e=>we(e)&&e.every(([t])=>"MC".includes(t)),We=(e,t)=>{const{distance:r}=Mt(e,t);return Math.abs(r)Ct(e)&&e.slice(1).every(([t])=>t===t.toLowerCase()),Le=e=>{if(typeof e!="string"||!e.length)return!1;const t=new Rt(e);for(X(t);t.indexe!=null&&typeof e=="object"&&e.nodeType===1,Ye=e=>{let{x1:t,y1:r,x2:s,y2:n}=e;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t,r],["L",s,n]]},tn=e=>{const t=[],r=(e.points||"").trim().split(/[\s|,]/).map(n=>+n);let s=0;for(;s{let{cx:t,cy:r,r:s}=e;return[t,r,s]=[t,r,s].map(n=>+n),[["M",t-s,r],["a",s,s,0,1,0,2*s,0],["a",s,s,0,1,0,-2*s,0]]},nn=e=>{let{cx:t,cy:r}=e,s=e.rx||0,n=e.ry||s;return[t,r,s,n]=[t,r,s,n].map(i=>+i),[["M",t-s,r],["a",s,n,0,1,0,2*s,0],["a",s,n,0,1,0,-2*s,0]]},rn=e=>{const t=+e.x||0,r=+e.y||0,s=+e.width,n=+e.height;let i=+(e.rx||0),o=+(e.ry||i);return i||o?(i*2>s&&(i-=(i*2-s)/2),o*2>n&&(o-=(o*2-n)/2),[["M",t+i,r],["h",s-i*2],["s",i,0,i,o],["v",n-o*2],["s",0,o,-i,o],["h",-s+i*2],["s",-i,0,-i,-o],["v",-n+o*2],["s",0,-o,i,-o]]):[["M",t,r],["h",s],["v",n],["H",t],["Z"]]},ve=e=>{const t=Object.keys(lt),r=Te(e),s=r?e.tagName:null;if(s&&[...t,"path"].every(c=>s!==c))throw TypeError(`${R}: "${s}" is not SVGElement`);const n=r?s:e.type,i=lt[n],o={type:n};r?i.forEach(c=>{o[c]=e.getAttribute(c)}):Object.assign(o,e);let a=[];return n==="circle"?a=en(o):n==="ellipse"?a=nn(o):["polyline","polygon"].includes(n)?a=tn(o):n==="rect"?a=rn(o):n==="line"?a=Ye(o):["glyph","path"].includes(n)&&(a=j(r?e.getAttribute("d")||"":e.d||"")),Ct(a)&&a.length?a:!1},sn=(e,t,r)=>{const s=r||document,n=Object.keys(lt),i=Te(e),o=i?e.tagName:null;if(o==="path")throw TypeError(`${R}: "${o}" is already SVGPathElement`);if(o&&n.every(u=>o!==u))throw TypeError(`${R}: "${o}" is not SVGElement`);const a=s.createElementNS("http://www.w3.org/2000/svg","path"),c=i?o:e.type,l=lt[c],m={type:c},h=_.round,f=ve(e),g=f&&f.length?Zt(f,h):"";return i?(l.forEach(u=>{m[u]=e.getAttribute(u)}),Object.values(e.attributes).forEach(({name:u,value:y})=>{l.includes(u)||a.setAttribute(u,y)})):(Object.assign(m,e),Object.keys(m).forEach(u=>{!l.includes(u)&&u!=="type"&&a.setAttribute(u.replace(/[A-Z]/g,y=>`-${y.toLowerCase()}`),m[u])})),Le(g)?(a.setAttribute("d",g),t&&i&&(e.before(a,e),e.remove()),a):!1},$e=(e,t,r,s)=>{const[n]=e,{round:i}=_,o=i,a=t.slice(1),{x1:c,y1:l,x2:m,y2:h,x:f,y:g}=r,[u,y]=a.slice(-2),p=e;if("TQ".includes(n)||(r.qx=null,r.qy=null),n==="L"){if(L(f,o)===L(u,o))return["V",y];if(L(g,o)===L(y,o))return["H",u]}else if(n==="C"){const[b,A]=a;if(r.x1=b,r.y1=A,"CS".includes(s)&&(L(b,o)===L(c*2-m,o)&&L(A,o)===L(l*2-h,o)||L(c,o)===L(m*2-f,o)&&L(l,o)===L(h*2-g,o)))return["S",a[2],a[3],a[4],a[5]]}else if(n==="Q"){const[b,A]=a;if(r.qx=b,r.qy=A,"QT".includes(s)&&L(b,o)===L(c*2-m,o)&&L(A,o)===L(l*2-h,o))return["T",a[2],a[3]]}return p},Pt=(e,t)=>{const r=e.slice(1).map(s=>L(s,t));return[e[0]].concat(r)},qe=(e,t)=>{const r=dt(e),s=typeof t=="number"&&t>=0?t:2,n={...ot},i=[];let o="M",a="Z";return Q(r,(c,l,m,h)=>{n.x=m,n.y=h;const f=pt(c,n);let g=c;if([o]=c,i[l]=o,l){a=i[l-1];const y=$e(c,f,n,a),p=Pt(y,s),b=p.join(""),A=jt(y,l,m,h),d=Pt(A,s),x=d.join("");g=b.length{const t=dt(e),r=ct(t),s=t.length,n=t[s-1][0]==="Z",i=Q(t,(o,a)=>{const c=r[a],l=a&&t[a-1],m=l&&l[0],h=t[a+1],f=h&&h[0],[g]=o,[u,y]=r[a?a-1:s-1].slice(-2);let p=o;switch(g){case"M":p=n?["Z"]:[g,u,y];break;case"A":p=[g,o[1],o[2],o[3],o[4],o[5]===1?0:1,u,y];break;case"C":h&&f==="S"?p=["S",o[1],o[2],u,y]:p=[g,o[3],o[4],o[1],o[2],u,y];break;case"S":m&&"CS".includes(m)&&(!h||f!=="S")?p=["C",c[3],c[4],c[1],c[2],u,y]:p=[g,c[1],c[2],u,y];break;case"Q":h&&f==="T"?p=["T",u,y]:p=[g,o[1],o[2],u,y];break;case"T":m&&"QT".includes(m)&&(!h||f!=="T")?p=["Q",c[1],c[2],u,y]:p=[g,u,y];break;case"Z":p=["M",u,y];break;case"H":p=[g,u];break;case"V":p=[g,y];break;default:p=[g].concat(o.slice(1,-2),u,y)}return p});return n?i.reverse():[i[0]].concat(i.slice(1).reverse())},ze=e=>{const t=[];let r,s=-1,n=0,i=0,o=0,a=0;const c={...ot};return e.forEach(l=>{const[m]=l,h=m.toUpperCase(),f=m.toLowerCase(),g=m===f,u=l.slice(1);h==="M"?(s+=1,[n,i]=u,n+=g?c.x:0,i+=g?c.y:0,o=n,a=i,r=[g?[h,o,a]:l]):(h==="Z"?(n=o,i=a):h==="H"?([,n]=l,n+=g?c.x:0):h==="V"?([,i]=l,i+=g?c.y:0):([n,i]=l.slice(-2),n+=g?c.x:0,i+=g?c.y:0),r.push(l)),c.x=n,c.y=i,t[s]=r}),t},ke=e=>{let t=new S;const{origin:r}=e,[s,n]=r,{translate:i}=e,{rotate:o}=e,{skew:a}=e,{scale:c}=e;return Array.isArray(i)&&i.length>=2&&i.every(l=>!Number.isNaN(+l))&&i.some(l=>l!==0)?t=t.translate(...i):typeof i=="number"&&!Number.isNaN(i)&&(t=t.translate(i)),(o||a||c)&&(t=t.translate(s,n),Array.isArray(o)&&o.length>=2&&o.every(l=>!Number.isNaN(+l))&&o.some(l=>l!==0)?t=t.rotate(...o):typeof o=="number"&&!Number.isNaN(o)&&(t=t.rotate(o)),Array.isArray(a)&&a.length===2&&a.every(l=>!Number.isNaN(+l))&&a.some(l=>l!==0)?(t=a[0]?t.skewX(a[0]):t,t=a[1]?t.skewY(a[1]):t):typeof a=="number"&&!Number.isNaN(a)&&(t=t.skewX(a)),Array.isArray(c)&&c.length>=2&&c.every(l=>!Number.isNaN(+l))&&c.some(l=>l!==1)?t=t.scale(...c):typeof c=="number"&&!Number.isNaN(c)&&(t=t.scale(c)),t=t.translate(-s,-n)),t},on=(e,t)=>{let r=S.Translate(t[0],t[1],t[2]);return[,,,r.m44]=t,r=e.multiply(r),[r.m41,r.m42,r.m43,r.m44]},Ot=(e,t,r)=>{const[s,n,i]=r,[o,a,c]=on(e,[t[0],t[1],0,1]),l=o-s,m=a-n,h=c-i;return[l*(Math.abs(i)/Math.abs(h)||1)+s,m*(Math.abs(i)/Math.abs(h)||1)+n]},Ie=(e,t)=>{let r=0,s=0,n=0,i=0,o=0,a=0,c="M";const l=j(e),m=t&&Object.keys(t);if(!t||m&&!m.length)return l.slice(0);t.origin||Object.assign(t,{origin:_.origin});const h=t.origin,f=ke(t);return f.isIdentity?l.slice(0):Q(l,(g,u,y,p)=>{[c]=g;const b=c.toUpperCase(),d=b!==c?it(g,u,y,p):g.slice(0);let x=b==="A"?["C"].concat(xt(y,p,d[1],d[2],d[3],d[4],d[5],d[6],d[7])):b==="V"?["L",y,d[1]]:b==="H"?["L",d[1],p]:d;c=x[0];const M=c==="C"&&x.length>7,P=M?x.slice(0,7):x.slice(0);if(M&&(l.splice(u+1,0,["C"].concat(x.slice(7))),x=P),c==="L")[n,i]=Ot(f,[x[1],x[2]],h),r!==n&&s!==i?x=["L",n,i]:s===i?x=["H",n]:r===n&&(x=["V",i]);else for(o=1,a=x.length;o{const t=e.slice(1).map((r,s,n)=>s?n[s-1].slice(-2).concat(r.slice(1)):e[0].slice(1).concat(r.slice(1))).map(r=>r.map((s,n)=>r[r.length-n-2*(1-n%2)])).reverse();return[["M"].concat(t[0].slice(0,2))].concat(t.map(r=>["C"].concat(r.slice(2))))},an=(e,t)=>{let{round:r}=_;return r=t==="off"||typeof t=="number"&&t>=0?t:typeof r=="number"&&r>=0?r:"off",r==="off"?e.slice(0):Q(e,s=>Pt(s,r))},ln=(e,t=.5)=>{const r=t,s=e.slice(0,2),n=e.slice(2,4),i=e.slice(4,6),o=e.slice(6,8),a=O(s,n,r),c=O(n,i,r),l=O(i,o,r),m=O(a,c,r),h=O(c,l,r),f=O(m,h,r);return[["C",a[0],a[1],m[0],m[1],f[0],f[1]],["C",h[0],h[1],l[0],l[1],o[0],o[1]]]};class mn{constructor(t,r){const s=r||{},n=typeof t>"u";if(n||!t.length)throw TypeError(`${R}: "pathValue" is ${n?"undefined":"empty"}`);this.segments=j(t);const{round:i,origin:o}=s;let a;Number.isInteger(i)||i==="off"?a=i:a=_.round;let c=_.origin;if(Array.isArray(o)&&o.length>=2){const[l,m,h]=o.map(Number);c=[Number.isNaN(l)?0:l,Number.isNaN(m)?0:m,Number.isNaN(h)?0:h]}return this.round=a,this.origin=c,this}get bbox(){return Pe(this.segments)}get length(){return Y(this.segments)}getBBox(){return this.bbox}getTotalLength(){return this.length}getPointAtLength(t){return at(this.segments,t)}toAbsolute(){const{segments:t}=this;return this.segments=dt(t),this}toRelative(){const{segments:t}=this;return this.segments=Ae(t),this}toCurve(){const{segments:t}=this;return this.segments=bt(t),this}reverse(t){const{segments:r}=this,s=ze(r),n=s.length>1?s:!1,i=n?n.map((a,c)=>t?c?St(a):a.slice(0):St(a)):r.slice(0);let o=[];return n?o=i.flat(1):o=t?r:St(r),this.segments=o.slice(0),this}normalize(){const{segments:t}=this;return this.segments=ct(t),this}optimize(){const{segments:t}=this,r=this.round==="off"?2:this.round;return this.segments=qe(t,r),this}transform(t){if(!t||typeof t!="object"||typeof t=="object"&&!["translate","rotate","skew","scale"].some(c=>c in t))return this;const{segments:r,origin:[s,n,i]}=this,o={};for(const[c,l]of Object.entries(t))c==="skew"&&Array.isArray(l)||(c==="rotate"||c==="translate"||c==="origin"||c==="scale")&&Array.isArray(l)?o[c]=l.map(Number):c!=="origin"&&typeof Number(l)=="number"&&(o[c]=Number(l));const{origin:a}=o;if(Array.isArray(a)&&a.length>=2){const[c,l,m]=a.map(Number);o.origin=[Number.isNaN(c)?s:c,Number.isNaN(l)?n:l,m||i]}else o.origin=[s,n,i];return this.segments=Ie(r,o),this}flipX(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[0,180,0],origin:[t,r,0]}),this}flipY(){const{cx:t,cy:r}=this.bbox;return this.transform({rotate:[180,0,0],origin:[t,r,0]}),this}toString(){return Zt(this.segments,this.round)}dispose(){Object.keys(this).forEach(t=>delete this[t])}static get CSSMatrix(){return S}static get arcTools(){return Ze}static get bezierTools(){return De}static get cubicTools(){return Oe}static get lineTools(){return Qe}static get polygonTools(){return He}static get quadTools(){return Be}static get pathToAbsolute(){return dt}static get pathToRelative(){return Ae}static get pathToCurve(){return bt}static get pathToString(){return Zt}static get distanceSquareRoot(){return ut}static get midPoint(){return O}static get rotateVector(){return st}static get roundTo(){return L}static get parsePathString(){return j}static get finalizeSegment(){return Vt}static get invalidPathValue(){return G}static get isArcCommand(){return pe}static get isDigit(){return F}static get isDigitStart(){return xe}static get isMoveCommand(){return be}static get isPathCommand(){return de}static get isSpace(){return ye}static get paramsCount(){return W}static get paramsParser(){return ot}static get pathParser(){return Rt}static get scanFlag(){return fe}static get scanParam(){return ge}static get scanSegment(){return Et}static get skipSpaces(){return X}static get distanceEpsilon(){return At}static get getClosestPoint(){return Fe}static get getDrawDirection(){return Ue}static get getPathArea(){return Se}static get getPathBBox(){return Pe}static get getPointAtLength(){return at}static get getPropertiesAtLength(){return Dt}static get getPropertiesAtPoint(){return Mt}static get getSegmentAtLength(){return _e}static get getSegmentOfPoint(){return Je}static get getTotalLength(){return Y}static get isAbsoluteArray(){return Ne}static get isCurveArray(){return Ke}static get isNormalizedArray(){return we}static get isPathArray(){return Ct}static get isPointInStroke(){return We}static get isRelativeArray(){return Xe}static get isValidPath(){return Le}static get shapeParams(){return lt}static get shapeToPath(){return sn}static get shapeToPathArray(){return ve}static get absolutizeSegment(){return it}static get arcToCubic(){return xt}static get getSVGMatrix(){return ke}static get iterate(){return Q}static get lineToCubic(){return Qt}static get normalizePath(){return ct}static get normalizeSegment(){return pt}static get optimizePath(){return qe}static get projection2d(){return Ot}static get quadToCubic(){return Me}static get relativizeSegment(){return jt}static get reverseCurve(){return cn}static get reversePath(){return St}static get roundPath(){return an}static get roundSegment(){return Pt}static get segmentToCubic(){return Ce}static get shortenSegment(){return $e}static get splitCubic(){return ln}static get splitPath(){return ze}static get transformPath(){return Ie}}return mn}(); //# sourceMappingURL=svg-path-commander.js.map diff --git a/docs/svg-path-commander.js.map b/docs/svg-path-commander.js.map index 38746a5..836b407 100755 --- a/docs/svg-path-commander.js.map +++ b/docs/svg-path-commander.js.map @@ -1 +1 @@ -{"version":3,"file":"svg-path-commander.js","sources":["../src/options/options.ts","../src/parser/paramsCount.ts","../src/parser/finalizeSegment.ts","../src/parser/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/math/rotateVector.ts","../src/process/arcToCubic.ts","../src/process/quadToCubic.ts","../src/math/midPoint.ts","../src/process/lineToCubic.ts","../src/process/segmentToCubic.ts","../src/process/normalizeSegment.ts","../src/parser/paramsParser.ts","../src/convert/pathToCurve.ts","../src/math/roundTo.ts","../src/convert/pathToString.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/util/getPathBBox.ts","../src/util/getTotalLength.ts","../src/util/distanceEpsilon.ts","../src/process/normalizePath.ts","../src/util/getPointAtLength.ts","../src/process/shortenSegment.ts","../src/process/roundSegment.ts","../src/process/optimizePath.ts","../src/process/reversePath.ts","../src/process/splitPath.ts","../node_modules/.pnpm/@thednp+dommatrix@2.0.11/node_modules/@thednp/dommatrix/dist/dommatrix.mjs","../src/process/getSVGMatrix.ts","../src/process/projection2d.ts","../src/process/transformPath.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/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.ts","../src/process/reverseCurve.ts","../src/process/roundPath.ts","../src/process/splitCubic.ts","../src/index.ts"],"sourcesContent":["import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\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\nexport default paramsCount;\n","import paramsCount 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 */\nconst 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 >= paramsCount[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, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./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 */\nconst 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\nexport default scanFlag;\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 */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./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 */\nconst 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};\nexport default scanParam;\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\nconst 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};\nexport default isSpace;\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 */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\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 */\nconst 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};\nexport default isPathCommand;\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 */\nconst 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};\nexport default isDigitStart;\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 */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst 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};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts 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 \"./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 */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[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) && 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 && 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};\nexport default scanSegment;\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\n */\nexport default 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 * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\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\nexport default parsePathString;\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 */\nconst 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};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n 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 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 if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\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 | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\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 */\nconst 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\nexport default relativizeSegment;\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 | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\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 */\nconst 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\nexport default rotateVector;\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 * @return the resulting cubic-bezier segment(s)\n */\nconst 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};\nexport default arcToCubic;\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 */\nconst 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};\nexport default quadToCubic;\n","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 */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\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 */\nconst 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};\nexport default lineToCubic;\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 */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\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\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\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, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\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 */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\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};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\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\nexport default paramsParser;\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 value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\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 });\n};\nexport default pathToCurve;\n","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\nexport default roundTo;\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\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\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 : /* istanbul ignore next @preserve */ \"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\nexport default pathToString;\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 */\nconst 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\nexport default distanceSquareRoot;\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 * @param distance the distance to point in [0-1] range\n * @returns the extrema 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 a [0-1] ratio\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 { 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 boundig 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) => {\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]] as [\n number,\n number,\n number,\n number,\n ];\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 boundig 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 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\nconst getPathBBox = (pathInput: PathArray | 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\nexport default getPathBBox;\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 shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\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\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\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 });\n};\nexport default normalizePath;\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 of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\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 // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\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\nexport default getPointAtLength;\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 */\nconst 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\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\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\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } 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` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\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 : /* istanbul ignore next @preserve */ 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 = seg;\n [pathCommand] = seg;\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\nexport default optimizePath;\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` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\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;\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]) as PathSegment;\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 ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"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] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"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] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\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 PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\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 ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\n composite[pi] = path;\n });\n\n return composite;\n};\nexport default splitPath;\n","var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return 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, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return 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 }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\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 `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst 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};\nexport default getSVGMatrix;\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 * @return 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 */\nconst 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};\nexport default projection2d;\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` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\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 let pathCommand = \"M\";\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 typeof path;\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 typeof path;\n\n return 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 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)) 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(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\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 });\n};\n\nexport default transformPath;\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 */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\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 PathArray;\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 PathArray;\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(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\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 */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\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\nexport default getPropertiesAtPoint;\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 */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\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 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 length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\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};\nexport default getPathArea;\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 */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\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 */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\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 */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount 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 */\nconst 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 paramsCount[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};\nexport default isPathArray;\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 */\nconst 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};\nexport default isAbsoluteArray;\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 are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst 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};\nexport default isNormalizedArray;\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 */\nconst 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};\nexport default isCurveArray;\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 */\nconst isPointInStroke = (\n pathInput: string | PathArray,\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};\nexport default isPointInStroke;\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 */\nconst 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};\nexport default isRelativeArray;\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 */\nconst 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};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst 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\nexport default shapeParams;\n","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\nexport default isElement;\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 \"../parser/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\n * @returns a new line `pathArray`\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` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\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 (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\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\n * @return an ellipse `pathArray`\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` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\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 ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\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) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\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};\nexport default shapeToPathArray;\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 \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. 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 `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst 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;\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 Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\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\nexport default shapeToPath;\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 */\nconst 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\nexport default reverseCurve;\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 */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\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 : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\n// import CSSMatrix from \"@thednp/dommatrix\";\n// import { arcTools } from \"./math/arcTools\";\n// import { bezierTools } from \"./math/bezier\";\n// import { cubicTools } from \"./math/cubicTools\";\n// import { lineTools } from \"./math/lineTools\";\n// import { quadTools } from \"./math/quadTools\";\n// import { polygonTools } from \"./math/polygonTools\";\n\n// import distanceSquareRoot from \"./math/distanceSquareRoot\";\n// import midPoint from \"./math/midPoint\";\n// import rotateVector from \"./math/rotateVector\";\n// import roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nexport * from \"./types\";\nexport * from \"./interface\";\n\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\n// import finalizeSegment from \"./parser/finalizeSegment\";\n// import invalidPathValue from \"./parser/invalidPathValue\";\n// import isArcCommand from \"./parser/isArcCommand\";\n// import isDigit from \"./parser/isDigit\";\n// import isDigitStart from \"./parser/isDigitStart\";\n// import isMoveCommand from \"./parser/isMoveCommand\";\n// import isPathCommand from \"./parser/isPathCommand\";\n// import isSpace from \"./parser/isSpace\";\n// import paramsCount from \"./parser/paramsCount\";\n// import paramsParser from \"./parser/paramsParser\";\n// import pathParser from \"./parser/pathParser\";\n// import scanFlag from \"./parser/scanFlag\";\n// import scanParam from \"./parser/scanParam\";\n// import scanSegment from \"./parser/scanSegment\";\n// import skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\n// import distanceEpsilon from \"./util/distanceEpsilon\";\n// import getClosestPoint from \"./util/getClosestPoint\";\n// import getDrawDirection from \"./util/getDrawDirection\";\n// import getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\n// import getPropertiesAtLength from \"./util/getPropertiesAtLength\";\n// import getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\n// import getSegmentAtLength from \"./util/getSegmentAtLength\";\n// import getSegmentOfPoint from \"./util/getSegmentOfPoint\";\n// import isAbsoluteArray from \"./util/isAbsoluteArray\";\n// import isCurveArray from \"./util/isCurveArray\";\n// import isNormalizedArray from \"./util/isNormalizedArray\";\n// import isPathArray from \"./util/isPathArray\";\n// import isPointInStroke from \"./util/isPointInStroke\";\n// import isRelativeArray from \"./util/isRelativeArray\";\n// import isValidPath from \"./util/isValidPath\";\n// import shapeParams from \"./util/shapeParams\";\n// import shapeToPath from \"./util/shapeToPath\";\n// import shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\n// import absolutizeSegment from \"./process/absolutizeSegment\";\n// import arcToCubic from \"./process/arcToCubic\";\n// import getSVGMatrix from \"./process/getSVGMatrix\";\n// import iterate from \"./process/iterate\";\n// import lineToCubic from \"./process/lineToCubic\";\n// import normalizeSegment from \"./process/normalizeSegment\";\n// import projection2d from \"./process/projection2d\";\n// import quadToCubic from \"./process/quadToCubic\";\n// import relativizeSegment from \"./process/relativizeSegment\";\n// import reverseCurve from \"./process/reverseCurve\";\n// import roundPath from \"./process/roundPath\";\n// import roundSegment from \"./process/roundSegment\";\n// import segmentToCubic from \"./process/segmentToCubic\";\n// import shortenSegment from \"./process/shortenSegment\";\n// import splitCubic from \"./process/splitCubic\";\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 \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) {\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 * @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 * @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 * @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 * @param onlySubpath option to reverse all sub-paths except first\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 * @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 * @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 refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\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 * @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 * @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 * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n // static get CSSMatrix() {\n // return CSSMatrix;\n // }\n // static get arcTools() {\n // return arcTools;\n // }\n // static get bezierTools() {\n // return bezierTools;\n // }\n\n // static get cubicTools() {\n // return cubicTools;\n // }\n // static get lineTools() {\n // return lineTools;\n // }\n // static get polygonTools() {\n // return polygonTools;\n // }\n // static get quadTools() {\n // return quadTools;\n // }\n // static get pathToAbsolute() {\n // return pathToAbsolute;\n // }\n // static get pathToRelative() {\n // return pathToRelative;\n // }\n // static get pathToCurve() {\n // return pathToCurve;\n // }\n // static get pathToString() {\n // return pathToString;\n // }\n // static get distanceSquareRoot() {\n // return distanceSquareRoot;\n // }\n // static get midPoint() {\n // return midPoint;\n // }\n // static get rotateVector() {\n // return rotateVector;\n // }\n // static get roundTo() {\n // return roundTo;\n // }\n // static get parsePathString() {\n // return parsePathString;\n // }\n // static get finalizeSegment() {\n // return finalizeSegment;\n // }\n // static get invalidPathValue() {\n // return invalidPathValue;\n // }\n // static get isArcCommand() {\n // return isArcCommand;\n // }\n // static get isDigit() {\n // return isDigit;\n // }\n // static get isDigitStart() {\n // return isDigitStart;\n // }\n // static get isMoveCommand() {\n // return isMoveCommand;\n // }\n // static get isPathCommand() {\n // return isPathCommand;\n // }\n // static get isSpace() {\n // return isSpace;\n // }\n // static get paramsCount() {\n // return paramsCount;\n // }\n // static get paramsParser() {\n // return paramsParser;\n // }\n // static get pathParser() {\n // return pathParser;\n // }\n // static get scanFlag() {\n // return scanFlag;\n // }\n // static get scanParam() {\n // return scanParam;\n // }\n // static get scanSegment() {\n // return scanSegment;\n // }\n // static get skipSpaces() {\n // return skipSpaces;\n // }\n // static get distanceEpsilon() {\n // return distanceEpsilon;\n // }\n // static get getClosestPoint() {\n // return getClosestPoint;\n // }\n // static get getDrawDirection() {\n // return getDrawDirection;\n // }\n // static get getPathArea() {\n // return getPathArea;\n // }\n // static get getPathBBox() {\n // return getPathBBox;\n // }\n // static get getPointAtLength() {\n // return getPointAtLength;\n // }\n // static get getPropertiesAtLength() {\n // return getPropertiesAtLength;\n // }\n // static get getPropertiesAtPoint() {\n // return getPropertiesAtPoint;\n // }\n // static get getSegmentAtLength() {\n // return getSegmentAtLength;\n // }\n // static get getSegmentOfPoint() {\n // return getSegmentOfPoint;\n // }\n // static get getTotalLength() {\n // return getTotalLength;\n // }\n // static get isAbsoluteArray() {\n // return isAbsoluteArray;\n // }\n // static get isCurveArray() {\n // return isCurveArray;\n // }\n // static get isNormalizedArray() {\n // return isNormalizedArray;\n // }\n // static get isPathArray() {\n // return isPathArray;\n // }\n // static get isPointInStroke() {\n // return isPointInStroke;\n // }\n // static get isRelativeArray() {\n // return isRelativeArray;\n // }\n // static get isValidPath() {\n // return isValidPath;\n // }\n // static get shapeParams() {\n // return shapeParams;\n // }\n // static get shapeToPath() {\n // return shapeToPath;\n // }\n // static get shapeToPathArray() {\n // return shapeToPathArray;\n // }\n // static get absolutizeSegment() {\n // return absolutizeSegment;\n // }\n // static get arcToCubic() {\n // return arcToCubic;\n // }\n // static get getSVGMatrix() {\n // return getSVGMatrix;\n // }\n // static get iterate() {\n // return iterate;\n // }\n // static get lineToCubic() {\n // return lineToCubic;\n // }\n // static get normalizePath() {\n // return normalizePath;\n // }\n // static get normalizeSegment() {\n // return normalizeSegment;\n // }\n // static get optimizePath() {\n // return optimizePath;\n // }\n // static get projection2d() {\n // return projection2d;\n // }\n // static get quadToCubic() {\n // return quadToCubic;\n // }\n // static get relativizeSegment() {\n // return relativizeSegment;\n // }\n // static get reverseCurve() {\n // return reverseCurve;\n // }\n // static get reversePath() {\n // return reversePath;\n // }\n // static get roundPath() {\n // return roundPath;\n // }\n // static get roundSegment() {\n // return roundSegment;\n // }\n // static get segmentToCubic() {\n // return segmentToCubic;\n // }\n // static get shortenSegment() {\n // return shortenSegment;\n // }\n // static get splitCubic() {\n // return splitCubic;\n // }\n // static get splitPath() {\n // return splitPath;\n // }\n // static get transformPath() {\n // return transformPath;\n // }\n}\n\n// export {\n// absolutizeSegment,\n// arcToCubic,\n// arcTools,\n// bezierTools,\n// CSSMatrix,\n// cubicTools,\n// distanceEpsilon,\n// distanceSquareRoot,\n// finalizeSegment,\n// getClosestPoint,\n// getDrawDirection,\n// getPathArea,\n// getPathBBox,\n// getPointAtLength,\n// getPropertiesAtLength,\n// getPropertiesAtPoint,\n// getSegmentAtLength,\n// getSegmentOfPoint,\n// getSVGMatrix,\n// getTotalLength,\n// invalidPathValue,\n// isAbsoluteArray,\n// isArcCommand,\n// isCurveArray,\n// isDigit,\n// isDigitStart,\n// isMoveCommand,\n// isNormalizedArray,\n// isPathArray,\n// isPathCommand,\n// isPointInStroke,\n// isRelativeArray,\n// isSpace,\n// isValidPath,\n// iterate,\n// lineToCubic,\n// lineTools,\n// midPoint,\n// normalizePath,\n// normalizeSegment,\n// optimizePath,\n// paramsCount,\n// paramsParser,\n// parsePathString,\n// pathParser,\n// pathToAbsolute,\n// pathToCurve,\n// pathToRelative,\n// pathToString,\n// polygonTools,\n// projection2d,\n// quadToCubic,\n// quadTools,\n// relativizeSegment,\n// reverseCurve,\n// reversePath,\n// rotateVector,\n// roundPath,\n// roundSegment,\n// roundTo,\n// scanFlag,\n// scanParam,\n// scanSegment,\n// segmentToCubic,\n// shapeParams,\n// shapeToPath,\n// shapeToPathArray,\n// shortenSegment,\n// skipSpaces,\n// splitCubic,\n// splitPath,\n// transformPath,\n// };\n\nexport { default as CSSMatrix} from \"@thednp/dommatrix\";\nexport { default as pathToAbsolute} from \"./convert/pathToAbsolute\";\nexport { default as pathToRelative} from \"./convert/pathToRelative\";\nexport { default as pathToCurve} from \"./convert/pathToCurve\";\nexport { default as pathToString} from \"./convert/pathToString\";\n\nexport { default as error} from \"./parser/error\";\nexport { default as parsePathString} from \"./parser/parsePathString\";\nexport { default as finalizeSegment} from \"./parser/finalizeSegment\";\nexport { default as invalidPathValue} from \"./parser/invalidPathValue\";\nexport { default as isArcCommand} from \"./parser/isArcCommand\";\nexport { default as isDigit} from \"./parser/isDigit\";\nexport { default as isDigitStart} from \"./parser/isDigitStart\";\nexport { default as isMoveCommand} from \"./parser/isMoveCommand\";\nexport { default as isPathCommand} from \"./parser/isPathCommand\";\nexport { default as isSpace} from \"./parser/isSpace\";\nexport { default as paramsCount} from \"./parser/paramsCount\";\nexport { default as paramsParser} from \"./parser/paramsParser\";\nexport { default as pathParser} from \"./parser/pathParser\";\nexport { default as scanFlag} from \"./parser/scanFlag\";\nexport { default as scanParam} from \"./parser/scanParam\";\nexport { default as scanSegment} from \"./parser/scanSegment\";\nexport { default as skipSpaces} from \"./parser/skipSpaces\";\nexport { default as getPathBBox} from \"./util/getPathBBox\";\nexport { default as getTotalLength} from \"./util/getTotalLength\";\nexport { default as distanceEpsilon} from \"./util/distanceEpsilon\";\nexport { default as getClosestPoint} from \"./util/getClosestPoint\";\nexport { default as getDrawDirection} from \"./util/getDrawDirection\";\nexport { default as getPathArea} from \"./util/getPathArea\";\nexport { default as getPointAtLength} from \"./util/getPointAtLength\";\nexport { default as getPropertiesAtLength} from \"./util/getPropertiesAtLength\";\nexport { default as getPropertiesAtPoint} from \"./util/getPropertiesAtPoint\";\nexport { default as getSegmentAtLength} from \"./util/getSegmentAtLength\";\nexport { default as getSegmentOfPoint} from \"./util/getSegmentOfPoint\";\nexport { default as isAbsoluteArray} from \"./util/isAbsoluteArray\";\nexport { default as isCurveArray} from \"./util/isCurveArray\";\nexport { default as isNormalizedArray} from \"./util/isNormalizedArray\";\nexport { default as isPathArray} from \"./util/isPathArray\";\nexport { default as isPointInStroke} from \"./util/isPointInStroke\";\nexport { default as isRelativeArray} from \"./util/isRelativeArray\";\nexport { default as isValidPath} from \"./util/isValidPath\";\nexport { default as shapeParams} from \"./util/shapeParams\";\nexport { default as shapeToPath} from \"./util/shapeToPath\";\nexport { default as shapeToPathArray} from \"./util/shapeToPathArray\";\nexport { default as normalizePath} from \"./process/normalizePath\";\nexport { default as optimizePath} from \"./process/optimizePath\";\nexport { default as reversePath} from \"./process/reversePath\";\nexport { default as splitPath} from \"./process/splitPath\";\nexport { default as transformPath} from \"./process/transformPath\";\nexport { default as absolutizeSegment} from \"./process/absolutizeSegment\";\nexport { default as arcToCubic} from \"./process/arcToCubic\";\nexport { default as getSVGMatrix} from \"./process/getSVGMatrix\";\nexport { default as iterate} from \"./process/iterate\";\nexport { default as lineToCubic} from \"./process/lineToCubic\";\nexport { default as normalizeSegment} from \"./process/normalizeSegment\";\nexport { default as projection2d} from \"./process/projection2d\";\nexport { default as quadToCubic} from \"./process/quadToCubic\";\nexport { default as relativizeSegment} from \"./process/relativizeSegment\";\nexport { default as reverseCurve} from \"./process/reverseCurve\";\nexport { default as roundPath} from \"./process/roundPath\";\nexport {default as roundSegment} from \"./process/roundSegment\";\nexport { default as segmentToCubic} from \"./process/segmentToCubic\";\nexport {default as shortenSegment } from \"./process/shortenSegment\";\nexport { default as splitCubic} from \"./process/splitCubic\";\n\nexport default SVGPathCommander;\n \n"],"names":["defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","max","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","i","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","j","iterate","iterator","pathLen","isRelative","x","y","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","rotateVector","rad","sin","cos","X","Y","arcToCubic","X1","Y1","RX","RY","angle","LAF","SF","X2","Y2","recursive","x1","y1","rx","ry","x2","y2","d120","res","xy","f1","f2","cx","cy","h","rx2","ry2","k","df","f2old","x2old","y2old","c1","s1","c2","s2","t","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","midPoint","a","b","ax","ay","bx","by","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","n","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","roundTo","round","pow","pathToString","roundOption","valLen","distanceSquareRoot","getLineLength","getPointAtLineLength","distance","point","length","getLineBBox","min","arcLength","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","alpha","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","p","getArcProps","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","Tvalues","Cvalues","deriveBezier","points","dpoints","d","c","list","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","l","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","E","minmaxC","cp1","cp2","K","T","S","L","R","Q","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","Z","z","s","e","$","P","g","r","m","u","w","o","M","O","F","I","v","D","N","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key"],"mappings":"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","x_google_ignoreList":[49]} \ No newline at end of file +{"version":3,"file":"svg-path-commander.js","sources":["../node_modules/.pnpm/@thednp+dommatrix@2.0.11/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/parser/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/isCurveArray.ts","../src/util/isPointInStroke.ts","../src/util/isRelativeArray.ts","../src/util/isValidPath.ts","../src/util/shapeParams.ts","../src/util/isElement.ts","../src/util/shapeToPathArray.ts","../src/util/shapeToPath.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/process/splitCubic.ts","../src/main.ts"],"sourcesContent":["var Z = Object.defineProperty;\nvar z = (s, t, e) => t in s ? Z(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;\nvar p = (s, t, e) => z(s, typeof t != \"symbol\" ? t + \"\" : t, e);\nconst $ = {\n a: 1,\n b: 0,\n c: 0,\n d: 1,\n e: 0,\n f: 0,\n m11: 1,\n m12: 0,\n m13: 0,\n m14: 0,\n m21: 0,\n m22: 1,\n m23: 0,\n m24: 0,\n m31: 0,\n m32: 0,\n m33: 1,\n m34: 0,\n m41: 0,\n m42: 0,\n m43: 0,\n m44: 1,\n is2D: !0,\n isIdentity: !0\n}, E = (s) => (s instanceof Float64Array || s instanceof Float32Array || Array.isArray(s) && s.every((t) => typeof t == \"number\")) && [6, 16].some((t) => s.length === t), P = (s) => s instanceof DOMMatrix || s instanceof y || typeof s == \"object\" && Object.keys($).every((t) => s && t in s), g = (s) => {\n const t = new y(), e = Array.from(s);\n if (!E(e))\n throw TypeError(\n `CSSMatrix: \"${e.join(\",\")}\" must be an array with 6/16 numbers.`\n );\n // istanbul ignore else @preserve\n if (e.length === 16) {\n const [\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M,\n b\n ] = e;\n t.m11 = n, t.a = n, t.m21 = l, t.c = l, t.m31 = u, t.m41 = d, t.e = d, t.m12 = i, t.b = i, t.m22 = m, t.d = m, t.m32 = f, t.m42 = A, t.f = A, t.m13 = r, t.m23 = h, t.m33 = w, t.m43 = M, t.m14 = a, t.m24 = c, t.m34 = o, t.m44 = b;\n } else if (e.length === 6) {\n const [n, i, r, a, l, m] = e;\n t.m11 = n, t.a = n, t.m12 = i, t.b = i, t.m21 = r, t.c = r, t.m22 = a, t.d = a, t.m41 = l, t.e = l, t.m42 = m, t.f = m;\n }\n return t;\n}, X = (s) => {\n if (P(s))\n return g([\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n ]);\n throw TypeError(\n `CSSMatrix: \"${JSON.stringify(s)}\" is not a DOMMatrix / CSSMatrix / JSON compatible object.`\n );\n}, O = (s) => {\n if (typeof s != \"string\")\n throw TypeError(`CSSMatrix: \"${JSON.stringify(s)}\" is not a string.`);\n const t = String(s).replace(/\\s/g, \"\");\n let e = new y();\n const n = `CSSMatrix: invalid transform string \"${s}\"`;\n return t.split(\")\").filter((i) => i).forEach((i) => {\n const [r, a] = i.split(\"(\");\n if (!a) throw TypeError(n);\n const l = a.split(\",\").map(\n (o) => o.includes(\"rad\") ? parseFloat(o) * (180 / Math.PI) : parseFloat(o)\n ), [m, h, c, u] = l, f = [m, h, c], w = [m, h, c, u];\n if (r === \"perspective\" && m && [h, c].every((o) => o === void 0))\n e.m34 = -1 / m;\n else if (r.includes(\"matrix\") && [6, 16].includes(l.length) && l.every((o) => !Number.isNaN(+o))) {\n const o = l.map((d) => Math.abs(d) < 1e-6 ? 0 : d);\n e = e.multiply(g(o));\n } else if (r === \"translate3d\" && f.every((o) => !Number.isNaN(+o)))\n e = e.translate(m, h, c);\n else if (r === \"translate\" && m && c === void 0)\n e = e.translate(m, h || 0, 0);\n else if (r === \"rotate3d\" && w.every((o) => !Number.isNaN(+o)) && u)\n e = e.rotateAxisAngle(m, h, c, u);\n else if (r === \"rotate\" && m && [h, c].every((o) => o === void 0))\n e = e.rotate(0, 0, m);\n else if (r === \"scale3d\" && f.every((o) => !Number.isNaN(+o)) && f.some((o) => o !== 1))\n e = e.scale(m, h, c);\n else if (\n // prop === \"scale\" && !Number.isNaN(x) && x !== 1 && z === undefined\n // prop === \"scale\" && !Number.isNaN(x) && [x, y].some((n) => n !== 1) &&\n r === \"scale\" && !Number.isNaN(m) && (m !== 1 || h !== 1) && c === void 0\n ) {\n const d = Number.isNaN(+h) ? m : h;\n e = e.scale(m, d, 1);\n } else if (r === \"skew\" && (m || !Number.isNaN(m) && h) && c === void 0)\n e = e.skew(m, h || 0);\n else if ([\"translate\", \"rotate\", \"scale\", \"skew\"].some(\n (o) => r.includes(o)\n ) && /[XYZ]/.test(r) && m && [h, c].every((o) => o === void 0))\n if (r === \"skewX\" || r === \"skewY\")\n e = e[r](m);\n else {\n const o = r.replace(/[XYZ]/, \"\"), d = r.replace(o, \"\"), A = [\"X\", \"Y\", \"Z\"].indexOf(d), M = o === \"scale\" ? 1 : 0, b = [\n A === 0 ? m : M,\n A === 1 ? m : M,\n A === 2 ? m : M\n ];\n e = e[o](...b);\n }\n else\n throw TypeError(n);\n }), e;\n}, x = (s, t) => t ? [s.a, s.b, s.c, s.d, s.e, s.f] : [\n s.m11,\n s.m12,\n s.m13,\n s.m14,\n s.m21,\n s.m22,\n s.m23,\n s.m24,\n s.m31,\n s.m32,\n s.m33,\n s.m34,\n s.m41,\n s.m42,\n s.m43,\n s.m44\n], Y = (s, t, e) => {\n const n = new y();\n return n.m41 = s, n.e = s, n.m42 = t, n.f = t, n.m43 = e, n;\n}, F = (s, t, e) => {\n const n = new y(), i = Math.PI / 180, r = s * i, a = t * i, l = e * i, m = Math.cos(r), h = -Math.sin(r), c = Math.cos(a), u = -Math.sin(a), f = Math.cos(l), w = -Math.sin(l), o = c * f, d = -c * w;\n n.m11 = o, n.a = o, n.m12 = d, n.b = d, n.m13 = u;\n const A = h * u * f + m * w;\n n.m21 = A, n.c = A;\n const M = m * f - h * u * w;\n return n.m22 = M, n.d = M, n.m23 = -h * c, n.m31 = h * w - m * u * f, n.m32 = h * f + m * u * w, n.m33 = m * c, n;\n}, T = (s, t, e, n) => {\n const i = new y(), r = Math.sqrt(s * s + t * t + e * e);\n if (r === 0)\n return i;\n const a = s / r, l = t / r, m = e / r, h = n * (Math.PI / 360), c = Math.sin(h), u = Math.cos(h), f = c * c, w = a * a, o = l * l, d = m * m, A = 1 - 2 * (o + d) * f;\n i.m11 = A, i.a = A;\n const M = 2 * (a * l * f + m * c * u);\n i.m12 = M, i.b = M, i.m13 = 2 * (a * m * f - l * c * u);\n const b = 2 * (l * a * f - m * c * u);\n i.m21 = b, i.c = b;\n const k = 1 - 2 * (d + w) * f;\n return i.m22 = k, i.d = k, i.m23 = 2 * (l * m * f + a * c * u), i.m31 = 2 * (m * a * f + l * c * u), i.m32 = 2 * (m * l * f - a * c * u), i.m33 = 1 - 2 * (w + o) * f, i;\n}, I = (s, t, e) => {\n const n = new y();\n return n.m11 = s, n.a = s, n.m22 = t, n.d = t, n.m33 = e, n;\n}, v = (s, t) => {\n const e = new y();\n if (s) {\n const n = s * Math.PI / 180, i = Math.tan(n);\n e.m21 = i, e.c = i;\n }\n if (t) {\n const n = t * Math.PI / 180, i = Math.tan(n);\n e.m12 = i, e.b = i;\n }\n return e;\n}, R = (s) => v(s, 0), D = (s) => v(0, s), N = (s, t) => {\n const e = t.m11 * s.m11 + t.m12 * s.m21 + t.m13 * s.m31 + t.m14 * s.m41, n = t.m11 * s.m12 + t.m12 * s.m22 + t.m13 * s.m32 + t.m14 * s.m42, i = t.m11 * s.m13 + t.m12 * s.m23 + t.m13 * s.m33 + t.m14 * s.m43, r = t.m11 * s.m14 + t.m12 * s.m24 + t.m13 * s.m34 + t.m14 * s.m44, a = t.m21 * s.m11 + t.m22 * s.m21 + t.m23 * s.m31 + t.m24 * s.m41, l = t.m21 * s.m12 + t.m22 * s.m22 + t.m23 * s.m32 + t.m24 * s.m42, m = t.m21 * s.m13 + t.m22 * s.m23 + t.m23 * s.m33 + t.m24 * s.m43, h = t.m21 * s.m14 + t.m22 * s.m24 + t.m23 * s.m34 + t.m24 * s.m44, c = t.m31 * s.m11 + t.m32 * s.m21 + t.m33 * s.m31 + t.m34 * s.m41, u = t.m31 * s.m12 + t.m32 * s.m22 + t.m33 * s.m32 + t.m34 * s.m42, f = t.m31 * s.m13 + t.m32 * s.m23 + t.m33 * s.m33 + t.m34 * s.m43, w = t.m31 * s.m14 + t.m32 * s.m24 + t.m33 * s.m34 + t.m34 * s.m44, o = t.m41 * s.m11 + t.m42 * s.m21 + t.m43 * s.m31 + t.m44 * s.m41, d = t.m41 * s.m12 + t.m42 * s.m22 + t.m43 * s.m32 + t.m44 * s.m42, A = t.m41 * s.m13 + t.m42 * s.m23 + t.m43 * s.m33 + t.m44 * s.m43, M = t.m41 * s.m14 + t.m42 * s.m24 + t.m43 * s.m34 + t.m44 * s.m44;\n return g([\n e,\n n,\n i,\n r,\n a,\n l,\n m,\n h,\n c,\n u,\n f,\n w,\n o,\n d,\n A,\n M\n ]);\n};\nclass y {\n /**\n * @constructor\n * @param init accepts all parameter configurations:\n * * valid CSS transform string,\n * * CSSMatrix/DOMMatrix instance,\n * * a 6/16 elements *Array*.\n */\n constructor(t) {\n return 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, t ? this.setMatrixValue(t) : this;\n }\n /**\n * A `Boolean` whose value is `true` if the matrix is the identity matrix. The identity\n * matrix is one in which every value is 0 except those on the main diagonal from top-left\n * to bottom-right corner (in other words, where the offsets in each direction are equal).\n *\n * @return the current property value\n */\n get isIdentity() {\n return 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 }\n /**\n * A `Boolean` flag whose value is `true` if the matrix was initialized as a 2D matrix\n * and `false` if the matrix is 3D.\n *\n * @return the current property value\n */\n get is2D() {\n return this.m31 === 0 && this.m32 === 0 && this.m33 === 1 && this.m34 === 0 && this.m43 === 0 && this.m44 === 1;\n }\n /**\n * The `setMatrixValue` method replaces the existing matrix with one computed\n * in the browser. EG: `matrix(1,0.25,-0.25,1,0,0)`\n *\n * The method accepts any *Array* values, the result of\n * `DOMMatrix` instance method `toFloat64Array()` / `toFloat32Array()` calls\n * or `CSSMatrix` instance method `toArray()`.\n *\n * This method expects valid *matrix()* / *matrix3d()* string values, as well\n * as other transform functions like *translateX(10px)*.\n *\n * @param source\n * @return the matrix instance\n */\n setMatrixValue(t) {\n return typeof t == \"string\" && t.length && t !== \"none\" ? O(t) : Array.isArray(t) || t instanceof Float64Array || t instanceof Float32Array ? g(t) : typeof t == \"object\" ? X(t) : this;\n }\n /**\n * Returns a *Float32Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat32Array(t) {\n return Float32Array.from(x(this, t));\n }\n /**\n * Returns a *Float64Array* containing elements which comprise the matrix.\n * The method can return either the 16 elements or the 6 elements\n * depending on the value of the `is2D` parameter.\n *\n * @param is2D *Array* representation of the matrix\n * @return an *Array* representation of the matrix\n */\n toFloat64Array(t) {\n return Float64Array.from(x(this, t));\n }\n /**\n * Creates and returns a string representation of the matrix in `CSS` matrix syntax,\n * using the appropriate `CSS` matrix notation.\n *\n * matrix3d *matrix3d(m11, m12, m13, m14, m21, ...)*\n * matrix *matrix(a, b, c, d, e, f)*\n *\n * @return a string representation of the matrix\n */\n toString() {\n const { is2D: t } = this, e = this.toFloat64Array(t).join(\", \");\n return `${t ? \"matrix\" : \"matrix3d\"}(${e})`;\n }\n /**\n * Returns a JSON representation of the `CSSMatrix` instance, a standard *Object*\n * that includes `{a,b,c,d,e,f}` and `{m11,m12,m13,..m44}` properties as well\n * as the `is2D` & `isIdentity` properties.\n *\n * The result can also be used as a second parameter for the `fromMatrix` static method\n * to load values into another matrix instance.\n *\n * @return an *Object* with all matrix values.\n */\n toJSON() {\n const { is2D: t, isIdentity: e } = this;\n return { ...this, is2D: t, isIdentity: e };\n }\n /**\n * The Multiply method returns a new CSSMatrix which is the result of this\n * matrix multiplied by the passed matrix, with the passed matrix to the right.\n * This matrix is not modified.\n *\n * @param m2 CSSMatrix\n * @return The resulted matrix.\n */\n multiply(t) {\n return N(this, t);\n }\n /**\n * The translate method returns a new matrix which is this matrix post\n * multiplied by a translation matrix containing the passed values. If the z\n * component is undefined, a 0 value is used in its place. This matrix is not\n * modified.\n *\n * @param x X component of the translation value.\n * @param y Y component of the translation value.\n * @param z Z component of the translation value.\n * @return The resulted matrix\n */\n translate(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = 0), typeof a > \"u\" && (a = 0), N(this, Y(i, r, a));\n }\n /**\n * The scale method returns a new matrix which is this matrix post multiplied by\n * a scale matrix containing the passed values. If the z component is undefined,\n * a 1 value is used in its place. If the y component is undefined, the x\n * component value is used in its place. This matrix is not modified.\n *\n * @param x The X component of the scale value.\n * @param y The Y component of the scale value.\n * @param z The Z component of the scale value.\n * @return The resulted matrix\n */\n scale(t, e, n) {\n const i = t;\n let r = e, a = n;\n return typeof r > \"u\" && (r = t), typeof a > \"u\" && (a = 1), N(this, I(i, r, a));\n }\n /**\n * The rotate method returns a new matrix which is this matrix post multiplied\n * by each of 3 rotation matrices about the major axes, first X, then Y, then Z.\n * If the y and z components are undefined, the x value is used to rotate the\n * object about the z axis, as though the vector (0,0,x) were passed. All\n * rotation values are in degrees. This matrix is not modified.\n *\n * @param rx The X component of the rotation, or Z if Y and Z are null.\n * @param ry The (optional) Y component of the rotation value.\n * @param rz The (optional) Z component of the rotation value.\n * @return The resulted matrix\n */\n rotate(t, e, n) {\n let i = t, r = e || 0, a = n || 0;\n return typeof t == \"number\" && typeof e > \"u\" && typeof n > \"u\" && (a = i, i = 0, r = 0), N(this, F(i, r, a));\n }\n /**\n * The rotateAxisAngle method returns a new matrix which is this matrix post\n * multiplied by a rotation matrix with the given axis and `angle`. The right-hand\n * rule is used to determine the direction of rotation. All rotation values are\n * in degrees. This matrix is not modified.\n *\n * @param x The X component of the axis vector.\n * @param y The Y component of the axis vector.\n * @param z The Z component of the axis vector.\n * @param angle The angle of rotation about the axis vector, in degrees.\n * @return The resulted matrix\n */\n rotateAxisAngle(t, e, n, i) {\n if ([t, e, n, i].some((r) => Number.isNaN(+r)))\n throw new TypeError(\"CSSMatrix: expecting 4 values\");\n return N(this, T(t, e, n, i));\n }\n /**\n * Specifies a skew transformation along the `x-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewX(t) {\n return N(this, R(t));\n }\n /**\n * Specifies a skew transformation along the `y-axis` by the given angle.\n * This matrix is not modified.\n *\n * @param angle The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skewY(t) {\n return N(this, D(t));\n }\n /**\n * Specifies a skew transformation along both the `x-axis` and `y-axis`.\n * This matrix is not modified.\n *\n * @param angleX The X-angle amount in degrees to skew.\n * @param angleY The angle amount in degrees to skew.\n * @return The resulted matrix\n */\n skew(t, e) {\n return N(this, v(t, e));\n }\n /**\n * Transforms a specified vector using the matrix, returning a new\n * {x,y,z,w} Tuple *Object* comprising the transformed vector.\n * Neither the matrix nor the original vector are altered.\n *\n * The method is equivalent with `transformPoint()` method\n * of the `DOMMatrix` constructor.\n *\n * @param t Tuple with `{x,y,z,w}` components\n * @return the resulting Tuple\n */\n transformPoint(t) {\n const e = this.m11 * t.x + this.m21 * t.y + this.m31 * t.z + this.m41 * t.w, n = this.m12 * t.x + this.m22 * t.y + this.m32 * t.z + this.m42 * t.w, i = this.m13 * t.x + this.m23 * t.y + this.m33 * t.z + this.m43 * t.w, r = this.m14 * t.x + this.m24 * t.y + this.m34 * t.z + this.m44 * t.w;\n return t instanceof DOMPoint ? new DOMPoint(e, n, i, r) : {\n x: e,\n y: n,\n z: i,\n w: r\n };\n }\n}\np(y, \"Translate\", Y), p(y, \"Rotate\", F), p(y, \"RotateAxisAngle\", T), p(y, \"Scale\", I), p(y, \"SkewX\", R), p(y, \"SkewY\", D), p(y, \"Skew\", v), p(y, \"Multiply\", N), p(y, \"fromArray\", g), p(y, \"fromMatrix\", X), p(y, \"fromString\", O), p(y, \"toArray\", x), p(y, \"isCompatibleArray\", E), p(y, \"isCompatibleObject\", P);\nexport {\n y as default\n};\n//# sourceMappingURL=dommatrix.mjs.map\n","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 */\nconst midPoint = (a: PointTuple, b: PointTuple, t: number): PointTuple => {\n const [ax, ay] = a;\n const [bx, by] = b;\n return [ax + (bx - ax) * t, ay + (by - ay) * t];\n};\n\nexport default midPoint;\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 */\nconst 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\nexport default distanceSquareRoot;\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 * @param distance the distance to point in [0-1] range\n * @returns the extrema 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 a [0-1] ratio\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 { 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 boundig 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) => {\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]] as [\n number,\n number,\n number,\n number,\n ];\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 boundig 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 * https://github.com/d3/d3-polygon\n *\n * Returns the area of a polygon.\n *\n * @param polygon an array of coordinates\n * @returns the polygon 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 /* eslint-disable-next-line */\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};\nconst polygonTools = {\n polygonArea,\n polygonLength,\n};\n\nexport { polygonArea, 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 */\nconst 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\nexport default rotateVector;\n","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\nexport default roundTo;\n","import { Options } from \"../interface\";\n\n/** SVGPathCommander default options */\nconst defaultOptions: Options = {\n origin: [0, 0, 0],\n round: 4,\n};\n\nexport default defaultOptions;\n","/** Segment params length */\nconst paramsCount = {\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\nexport default paramsCount;\n","import paramsCount 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 */\nconst 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 >= paramsCount[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, paramsCount[relativeCommand]) as number[],\n ) as PathSegment,\n );\n }\n\n if (!paramsCount[relativeCommand]) {\n break;\n }\n }\n};\nexport default finalizeSegment;\n","const error = \"SVGPathCommander Error\";\nexport default error;\n","import error from \"./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 */\nconst 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\nexport default scanFlag;\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 */\nconst isDigit = (code: number): code is DigitNumber => {\n return code >= 48 && code <= 57; // 0..9\n};\nexport default isDigit;\n","const invalidPathValue = \"Invalid path value\";\nexport default invalidPathValue;\n","import isDigit from \"./isDigit\";\nimport invalidPathValue from \"./invalidPathValue\";\nimport error from \"./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 */\nconst 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};\nexport default scanParam;\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\nconst 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};\nexport default isSpace;\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 */\nconst skipSpaces = (path: PathParser) => {\n const { pathValue, max } = path;\n while (path.index < max && isSpace(pathValue.charCodeAt(path.index))) {\n path.index += 1;\n }\n};\nexport default skipSpaces;\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 */\nconst 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};\nexport default isPathCommand;\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 */\nconst 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};\nexport default isDigitStart;\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 */\nconst isArcCommand = (code: number): code is 0x61 => {\n // eslint-disable-next-line no-bitwise -- Impossible to satisfy\n return (code | 0x20) === 0x61;\n};\nexport default isArcCommand;\n","/**\n * Checks if the character is a MoveTo command.\n *\n * @param code the character to check\n * @returns check result\n */\nconst 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};\nexport default isMoveCommand;\n","import finalizeSegment from \"./finalizeSegment\";\nimport paramCounts 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 \"./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 */\nconst scanSegment = (path: PathParser) => {\n const { max, pathValue, index, segments } = path;\n const cmdCode = pathValue.charCodeAt(index);\n const reqParams =\n paramCounts[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) && 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 && 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};\nexport default scanSegment;\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\n */\nexport default 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 * @param pathInput the string to be parsed\n * @returns the resulted `pathArray` or error string\n */\nconst parsePathString = (pathInput: string | T) => {\n if (typeof pathInput !== \"string\") {\n return pathInput.slice(0) as typeof pathInput;\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\nexport default parsePathString;\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 */\nconst 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};\nexport default absolutizeSegment;\n","// import paramsParser from '../parser/paramsParser';\nimport type {\n AbsoluteCommand,\n IteratorCallback,\n PathArray,\n PathCommand,\n PathSegment,\n} from \"../types\";\n\nconst iterate = (\n path: PathArray,\n iterator: IteratorCallback,\n) => {\n let pathLen = path.length;\n let segment: PathSegment;\n let pathCommand = \"M\" as PathCommand;\n let absCommand = \"M\" as AbsoluteCommand;\n let isRelative = false;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n let segLen = 0;\n\n for (let i = 0; i < pathLen; i += 1) {\n segment = path[i];\n [pathCommand] = segment;\n segLen = segment.length;\n absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n 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 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 if (iteratorResult[0] === \"C\") {\n pathLen = path.length;\n }\n }\n }\n return path as T;\n};\n\nexport default iterate;\n","import parsePathString from \"../parser/parsePathString\";\nimport absolutizeSegment from \"../process/absolutizeSegment\";\nimport type { AbsoluteArray, PathArray } from \"../types\";\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 | object\n * @returns the resulted `pathArray` with absolute values\n */\nconst pathToAbsolute = (pathInput: string | PathArray) => {\n const path = parsePathString(pathInput);\n\n return iterate(path, absolutizeSegment);\n};\nexport default pathToAbsolute;\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 */\nconst 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\nexport default relativizeSegment;\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 | object\n * @returns the resulted `pathArray` with relative values\n */\nconst pathToRelative = (pathInput: string | PathArray): RelativeArray => {\n const path = parsePathString(pathInput);\n\n return iterate(path, relativizeSegment);\n};\nexport default pathToRelative;\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 * @return the resulting cubic-bezier segment(s)\n */\nconst 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};\nexport default arcToCubic;\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 */\nconst 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};\nexport default quadToCubic;\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 */\nconst 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};\nexport default lineToCubic;\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 */\nconst segmentToCubic = (segment: PathSegment, params: ParserParams) => {\n const [pathCommand] = segment;\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\n if (!\"TQ\".includes(pathCommand)) {\n params.qx = null;\n params.qy = null;\n }\n\n if (pathCommand === \"M\") {\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, px, py),\n ) as CSegment;\n }\n\n return segment as MSegment | CSegment;\n};\nexport default segmentToCubic;\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 */\nconst normalizeSegment = (segment: PathSegment, params: ParserParams) => {\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};\nexport default normalizeSegment;\n","import type { ParserParams } from \"../interface\";\n\nconst paramsParser: ParserParams = {\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\nexport default paramsParser;\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 value or 'pathArray' and returns a new one\n * in which all segments are converted to cubic-bezier.\n *\n * In addition, un-necessary `Z` segment is removed if previous segment\n * extends to the `M` segment.\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the resulted `pathArray` converted to cubic-bezier\n */\nconst pathToCurve = (pathInput: string | PathArray): CurveArray => {\n const params = { ...paramsParser };\n const path = parsePathString(pathInput);\n\n return iterate(path, (seg, index, lastX, lastY) => {\n params.x = lastX;\n params.y = lastY;\n const normalSegment = normalizeSegment(seg, params);\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 });\n};\nexport default pathToCurve;\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\n * @returns the concatenated path string\n */\nconst pathToString = (\n path: PathArray,\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 : /* istanbul ignore next @preserve */ \"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\nexport default pathToString;\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\nconst getPathBBox = (pathInput: PathArray | 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\nexport default getPathBBox;\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 shape total length, or the equivalent to `shape.getTotalLength()`.\n *\n * @param pathInput the target `pathArray`\n * @returns the shape total length\n */\nconst getTotalLength = (pathInput: string | PathArray) => {\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\nexport default getTotalLength;\n","const DISTANCE_EPSILON = 0.00001;\n\nexport default DISTANCE_EPSILON;\n","import normalizeSegment from \"./normalizeSegment\";\nimport type { NormalArray, PathArray } from \"../types\";\nimport iterate from \"./iterate\";\nimport parsePathString from \"../parser/parsePathString\";\nimport paramsParser from \"../parser/paramsParser\";\n\n/**\n * Normalizes a `pathArray` object for further processing:\n * * convert segments to absolute values\n * * convert shorthand path commands to their non-shorthand notation\n *\n * @param pathInput the string to be parsed or 'pathArray'\n * @returns the normalized `pathArray`\n */\nconst normalizePath = (pathInput: string | PathArray) => {\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 });\n};\nexport default normalizePath;\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 of a shape.\n *\n * @param pathInput the `pathArray` to look into\n * @param distance the length of the shape to look at\n * @returns the requested {x, y} point coordinates\n */\nconst getPointAtLength = (pathInput: string | PathArray, distance?: number) => {\n const path = normalizePath(pathInput);\n let isM = false;\n let data = [] as number[];\n let pathCommand = \"M\";\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 // for (let i = 0; i < pathLen; i += 1) {\n iterate(path, (seg, _, lastX, lastY) => {\n [pathCommand] = seg;\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\nexport default getPointAtLength;\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 */\nconst getPropertiesAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): SegmentProperties => {\n const pathArray = parsePathString(pathInput);\n\n let pathTemp = pathArray.slice(0) as PathArray;\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 PathArray;\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 PathArray;\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(({ lengthAtSegment: l }) =>\n l <= distance\n ) as SegmentProperties;\n};\n\nexport default getPropertiesAtLength;\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 */\nconst getPropertiesAtPoint = (\n pathInput: string | PathArray,\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\nexport default getPropertiesAtPoint;\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 */\nconst getClosestPoint = (\n pathInput: string | PathArray,\n point: { x: number; y: number },\n) => {\n return getPropertiesAtPoint(pathInput, point).closest;\n};\n\nexport default getClosestPoint;\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 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 length of the cubic-bezier segment\n */\nconst getPathArea = (path: PathArray) => {\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};\nexport default getPathArea;\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 */\nconst getDrawDirection = (path: string | PathArray) => {\n return getPathArea(pathToCurve(path)) >= 0;\n};\n\nexport default getDrawDirection;\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 */\nconst getSegmentAtLength = (\n pathInput: string | PathArray,\n distance?: number,\n): PathSegment | undefined => {\n return getPropertiesAtLength(pathInput, distance).segment;\n};\n\nexport default getSegmentAtLength;\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 */\nconst getSegmentOfPoint = (\n path: string | PathArray,\n point: { x: number; y: number },\n): SegmentProperties | undefined => {\n return getPropertiesAtPoint(path, point).segment;\n};\nexport default getSegmentOfPoint;\n","import type { PathArray, PathSegment, RelativeCommand } from \"../types\";\nimport paramsCount 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 */\nconst 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 paramsCount[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};\nexport default isPathArray;\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 */\nconst 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};\nexport default isAbsoluteArray;\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 are in non-shorthand notation\n * with absolute values.\n *\n * @param {string | SVGPath.pathArray} path the `pathArray` to be checked\n * @returns {boolean} iteration result\n */\nconst 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};\nexport default isNormalizedArray;\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 */\nconst 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};\nexport default isCurveArray;\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 */\nconst isPointInStroke = (\n pathInput: string | PathArray,\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};\nexport default isPointInStroke;\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 */\nconst 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};\nexport default isRelativeArray;\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 */\nconst 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};\nexport default isValidPath;\n","import type { ShapeParams } from \"../interface\";\n\n/**\n * Supported shapes and their specific parameters.\n */\nconst 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\nexport default shapeParams;\n","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\nexport default isElement;\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 \"../parser/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\n * @returns a new line `pathArray`\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` like from polyline/polygon attributes.\n *\n * @param attr shape configuration\n * @return a new polygon/polyline `pathArray`\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 (attr.type === \"polygon\"\n ? [...pathArray, [\"z\"]]\n : pathArray) as PathArray;\n};\n\n/**\n * Returns a new `pathArray` from circle attributes.\n *\n * @param attr shape configuration\n * @return a circle `pathArray`\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\n * @return an ellipse `pathArray`\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` like from rect attributes.\n *\n * @param attr object with properties above\n * @return a new `pathArray` from `` attributes\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 ``, ``,\n * ``, ``, ``, ``, or ``.\n *\n * It can also work with an options object, see the type below\n * @see ShapeOps\n *\n * @param element target shape\n * @return the newly created `` element\n */\nconst shapeToPathArray = (\n element: ShapeTypes | ShapeOps,\n) => {\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) as ShapeOps[\n \"type\"\n ];\n const shapeAttrs = shapeParams[type] as string[];\n const config = { type } as Record;\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};\nexport default shapeToPathArray;\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 \"../parser/error\";\nimport isValidPath from \"./isValidPath\";\nimport isElement from \"./isElement\";\nimport shapeToPathArray from \"./shapeToPathArray\";\nimport shapeParams from \"./shapeParams\";\n\n/**\n * Returns a new `` element created from attributes of a ``, ``,\n * ``, ``, ``, `` or ``. 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 `` element keeps all non-specific\n * attributes like `class`, `fill`, etc.\n *\n * @param element target shape\n * @param replace option to replace target\n * @param ownerDocument document for create element\n * @return the newly created `` element\n */\nconst 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;\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 Object.values(element.attributes).forEach(({ name, value }) => {\n if (!shapeAttrs.includes(name)) path.setAttribute(name, value);\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\nexport default shapeToPath;\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 */\nconst 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\nexport default shortenSegment;\n","import type { PathCommand, PathSegment } from \"../types\";\nimport roundTo from \"../math/roundTo\";\n\nconst roundSegment = (\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\nexport default roundSegment;\n","import type { AbsoluteSegment, PathArray, PathCommand } 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` object:\n * * convert segments to shorthand if possible\n * * select shortest segments from absolute and relative `pathArray`s\n *\n * @param pathInput a string or `pathArray`\n * @param roundOption the amount of decimals to round values to\n * @returns the optimized `pathArray`\n */\nconst optimizePath = (pathInput: PathArray, roundOption?: number) => {\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 : /* istanbul ignore next @preserve */ 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 = seg;\n [pathCommand] = seg;\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\nexport default optimizePath;\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` instance\n * with absolute values.\n *\n * @param pathInput the source `pathArray`\n * @returns the reversed `pathArray`\n */\nconst reversePath = (pathInput: PathArray) => {\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;\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]) as PathSegment;\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 ] as ASegment;\n break;\n case \"C\":\n if (nextSeg && nextCommand === \"S\") {\n result = [\"S\", segment[1], segment[2], x, y] as SSegment;\n } else {\n result = [\n pathCommand,\n segment[3],\n segment[4],\n segment[1],\n segment[2],\n x,\n y,\n ] as CSegment;\n }\n break;\n case \"S\":\n if (\n prevCommand && \"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] as QSegment;\n }\n break;\n case \"T\":\n if (\n prevCommand && \"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] as MSegment;\n break;\n case \"H\":\n result = [pathCommand, x] as HSegment;\n break;\n case \"V\":\n result = [pathCommand, y] as VSegment;\n break;\n default:\n result = [pathCommand as typeof pathCommand | number].concat(\n segment.slice(1, -2),\n x,\n y,\n ) as PathSegment;\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 PathArray;\n};\n\nexport default reversePath;\n","import paramsParser from \"../parser/paramsParser\";\nimport type {\n AbsoluteCommand,\n HSegment,\n MSegment,\n PathArray,\n PointTuple,\n RelativeCommand,\n VSegment,\n} from \"../types\";\n\n/**\n * Split a path into an `Array` of sub-path strings.\n *\n * In the process, values are converted to absolute\n * for visual consistency.\n *\n * @param pathInput the source `pathArray`\n * @return an array with all sub-path strings\n */\nconst splitPath = (pathInput: PathArray): PathArray[] => {\n const composite = [] as PathArray[];\n let path: PathArray;\n let pi = -1;\n let x = 0;\n let y = 0;\n let mx = 0;\n let my = 0;\n const params = { ...paramsParser };\n\n pathInput.forEach((seg) => {\n const [pathCommand] = seg;\n const absCommand = pathCommand.toUpperCase() as AbsoluteCommand;\n const relCommand = pathCommand.toLowerCase() as RelativeCommand;\n const isRelative = pathCommand === relCommand;\n const values = seg.slice(1) as number[];\n\n if (absCommand === \"M\") {\n pi += 1;\n [x, y] = values as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n mx = x;\n my = y;\n path = [(isRelative ? [absCommand, mx, my] : seg) as MSegment];\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 ? params.x : /* istanbul ignore next @preserve */ 0;\n } else if (absCommand === \"V\") {\n [, y] = seg as VSegment;\n y += isRelative ? params.y : /* istanbul ignore next @preserve */ 0;\n } else {\n [x, y] = seg.slice(-2) as PointTuple;\n x += isRelative ? params.x : 0;\n y += isRelative ? params.y : 0;\n }\n path.push(seg);\n }\n\n params.x = x;\n params.y = y;\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 `` elements.\n *\n * @see TransformObjectValues\n *\n * @param transform the `transformObject`\n * @returns a new transformation matrix\n */\nconst 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};\nexport default getSVGMatrix;\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 * @return 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 */\nconst 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};\nexport default projection2d;\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` instance.\n *\n * Since *SVGElement* doesn't support 3D transformation, this function\n * creates a 2D projection of the element.\n *\n * @param path the `pathArray` to apply transformation\n * @param transform the transform functions `Object`\n * @returns the resulted `pathArray`\n */\nconst transformPath = (\n pathInput: PathArray | string,\n transform?: Partial,\n) => {\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 let pathCommand = \"M\";\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 typeof path;\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 typeof path;\n\n return 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 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)) 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(matrixInstance, [\n (result as LSegment)[1],\n (result as LSegment)[2],\n ], origin);\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 });\n};\n\nexport default transformPath;\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 */\nconst 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\nexport default reverseCurve;\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 */\nconst roundPath = (path: PathArray, roundOption?: number | \"off\") => {\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 : /* istanbul ignore next @preserve */ \"off\";\n\n /* istanbul ignore else @preserve */\n if (round === \"off\") return path.slice(0) as PathArray;\n\n return iterate(path, (segment) => {\n return roundSegment(segment, round);\n });\n};\nexport default roundPath;\n","import midPoint from \"../math/midPoint\";\nimport type { CubicSegment, PointTuple } from \"../types\";\n\n/**\n * Split a cubic-bezier segment into two.\n *\n * @param pts the cubic-bezier parameters\n * @param ratio the cubic-bezier parameters\n * @return two new cubic-bezier segments\n */\nconst splitCubic = (\n pts: number[],\n ratio = 0.5,\n): [CubicSegment, CubicSegment] => {\n const t = ratio;\n const p0 = pts.slice(0, 2) as PointTuple;\n const p1 = pts.slice(2, 4) as PointTuple;\n const p2 = pts.slice(4, 6) as PointTuple;\n const p3 = pts.slice(6, 8) as PointTuple;\n const p4 = midPoint(p0, p1, t);\n const p5 = midPoint(p1, p2, t);\n const p6 = midPoint(p2, p3, t);\n const p7 = midPoint(p4, p5, t);\n const p8 = midPoint(p5, p6, t);\n const p9 = midPoint(p7, p8, t);\n\n return [\n [\"C\", p4[0], p4[1], p7[0], p7[1], p9[0], p9[1]],\n [\"C\", p8[0], p8[1], p6[0], p6[1], p3[0], p3[1]],\n ];\n};\nexport default splitCubic;\n","\"use strict\";\nimport CSSMatrix from \"@thednp/dommatrix\";\nimport { arcTools } from \"./math/arcTools\";\nimport { bezierTools } from \"./math/bezier\";\nimport { cubicTools } from \"./math/cubicTools\";\nimport { lineTools } from \"./math/lineTools\";\nimport { quadTools } from \"./math/quadTools\";\nimport { polygonTools } from \"./math/polygonTools\";\n\nimport distanceSquareRoot from \"./math/distanceSquareRoot\";\nimport midPoint from \"./math/midPoint\";\nimport rotateVector from \"./math/rotateVector\";\nimport roundTo from \"./math/roundTo\";\n\nimport type { PathArray, PointTuple, TransformObjectValues } from \"./types\";\nimport type { Options, TransformEntries, TransformObject } from \"./interface\";\nimport defaultOptions from \"./options/options\";\n\nimport pathToAbsolute from \"./convert/pathToAbsolute\";\nimport pathToRelative from \"./convert/pathToRelative\";\nimport pathToCurve from \"./convert/pathToCurve\";\nimport pathToString from \"./convert/pathToString\";\n\nimport error from \"./parser/error\";\nimport parsePathString from \"./parser/parsePathString\";\nimport finalizeSegment from \"./parser/finalizeSegment\";\nimport invalidPathValue from \"./parser/invalidPathValue\";\nimport isArcCommand from \"./parser/isArcCommand\";\nimport isDigit from \"./parser/isDigit\";\nimport isDigitStart from \"./parser/isDigitStart\";\nimport isMoveCommand from \"./parser/isMoveCommand\";\nimport isPathCommand from \"./parser/isPathCommand\";\nimport isSpace from \"./parser/isSpace\";\nimport paramsCount from \"./parser/paramsCount\";\nimport paramsParser from \"./parser/paramsParser\";\nimport pathParser from \"./parser/pathParser\";\nimport scanFlag from \"./parser/scanFlag\";\nimport scanParam from \"./parser/scanParam\";\nimport scanSegment from \"./parser/scanSegment\";\nimport skipSpaces from \"./parser/skipSpaces\";\nimport getPathBBox from \"./util/getPathBBox\";\nimport getTotalLength from \"./util/getTotalLength\";\nimport distanceEpsilon from \"./util/distanceEpsilon\";\nimport getClosestPoint from \"./util/getClosestPoint\";\nimport getDrawDirection from \"./util/getDrawDirection\";\nimport getPathArea from \"./util/getPathArea\";\nimport getPointAtLength from \"./util/getPointAtLength\";\nimport getPropertiesAtLength from \"./util/getPropertiesAtLength\";\nimport getPropertiesAtPoint from \"./util/getPropertiesAtPoint\";\nimport getSegmentAtLength from \"./util/getSegmentAtLength\";\nimport getSegmentOfPoint from \"./util/getSegmentOfPoint\";\nimport isAbsoluteArray from \"./util/isAbsoluteArray\";\nimport isCurveArray from \"./util/isCurveArray\";\nimport isNormalizedArray from \"./util/isNormalizedArray\";\nimport isPathArray from \"./util/isPathArray\";\nimport isPointInStroke from \"./util/isPointInStroke\";\nimport isRelativeArray from \"./util/isRelativeArray\";\nimport isValidPath from \"./util/isValidPath\";\nimport shapeParams from \"./util/shapeParams\";\nimport shapeToPath from \"./util/shapeToPath\";\nimport shapeToPathArray from \"./util/shapeToPathArray\";\nimport normalizePath from \"./process/normalizePath\";\nimport optimizePath from \"./process/optimizePath\";\nimport reversePath from \"./process/reversePath\";\nimport splitPath from \"./process/splitPath\";\nimport transformPath from \"./process/transformPath\";\nimport absolutizeSegment from \"./process/absolutizeSegment\";\nimport arcToCubic from \"./process/arcToCubic\";\nimport getSVGMatrix from \"./process/getSVGMatrix\";\nimport iterate from \"./process/iterate\";\nimport lineToCubic from \"./process/lineToCubic\";\nimport normalizeSegment from \"./process/normalizeSegment\";\nimport projection2d from \"./process/projection2d\";\nimport quadToCubic from \"./process/quadToCubic\";\nimport relativizeSegment from \"./process/relativizeSegment\";\nimport reverseCurve from \"./process/reverseCurve\";\nimport roundPath from \"./process/roundPath\";\nimport roundSegment from \"./process/roundSegment\";\nimport segmentToCubic from \"./process/segmentToCubic\";\nimport shortenSegment from \"./process/shortenSegment\";\nimport splitCubic from \"./process/splitCubic\";\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 \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) {\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 * @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 * @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 * @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 * @param onlySubpath option to reverse all sub-paths except first\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 * @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 * @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 refference\n *\n * @param source a `transformObject`as described above\n * @public\n */\n transform(source?: Partial) {\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 * @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 * @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 * @return the path string\n */\n toString() {\n return pathToString(this.segments, this.round);\n }\n\n /**\n * Remove the instance.\n *\n * @public\n * @return void\n */\n dispose() {\n Object.keys(this).forEach((key) => delete this[key as keyof typeof this]);\n }\n\n static get CSSMatrix() {\n return CSSMatrix;\n }\n static get arcTools() {\n return arcTools;\n }\n static get bezierTools() {\n return bezierTools;\n }\n\n static get cubicTools() {\n return cubicTools;\n }\n static get lineTools() {\n return lineTools;\n }\n static get polygonTools() {\n return polygonTools;\n }\n static get quadTools() {\n return quadTools;\n }\n static get pathToAbsolute() {\n return pathToAbsolute;\n }\n static get pathToRelative() {\n return pathToRelative;\n }\n static get pathToCurve() {\n return pathToCurve;\n }\n static get pathToString() {\n return pathToString;\n }\n static get distanceSquareRoot() {\n return distanceSquareRoot;\n }\n static get midPoint() {\n return midPoint;\n }\n static get rotateVector() {\n return rotateVector;\n }\n static get roundTo() {\n return roundTo;\n }\n static get parsePathString() {\n return parsePathString;\n }\n static get finalizeSegment() {\n return finalizeSegment;\n }\n static get invalidPathValue() {\n return invalidPathValue;\n }\n static get isArcCommand() {\n return isArcCommand;\n }\n static get isDigit() {\n return isDigit;\n }\n static get isDigitStart() {\n return isDigitStart;\n }\n static get isMoveCommand() {\n return isMoveCommand;\n }\n static get isPathCommand() {\n return isPathCommand;\n }\n static get isSpace() {\n return isSpace;\n }\n static get paramsCount() {\n return paramsCount;\n }\n static get paramsParser() {\n return paramsParser;\n }\n static get pathParser() {\n return pathParser;\n }\n static get scanFlag() {\n return scanFlag;\n }\n static get scanParam() {\n return scanParam;\n }\n static get scanSegment() {\n return scanSegment;\n }\n static get skipSpaces() {\n return skipSpaces;\n }\n static get distanceEpsilon() {\n return distanceEpsilon;\n }\n static get getClosestPoint() {\n return getClosestPoint;\n }\n static get getDrawDirection() {\n return getDrawDirection;\n }\n static get getPathArea() {\n return getPathArea;\n }\n static get getPathBBox() {\n return getPathBBox;\n }\n static get getPointAtLength() {\n return getPointAtLength;\n }\n static get getPropertiesAtLength() {\n return getPropertiesAtLength;\n }\n static get getPropertiesAtPoint() {\n return getPropertiesAtPoint;\n }\n static get getSegmentAtLength() {\n return getSegmentAtLength;\n }\n static get getSegmentOfPoint() {\n return getSegmentOfPoint;\n }\n static get getTotalLength() {\n return getTotalLength;\n }\n static get isAbsoluteArray() {\n return isAbsoluteArray;\n }\n static get isCurveArray() {\n return isCurveArray;\n }\n static get isNormalizedArray() {\n return isNormalizedArray;\n }\n static get isPathArray() {\n return isPathArray;\n }\n static get isPointInStroke() {\n return isPointInStroke;\n }\n static get isRelativeArray() {\n return isRelativeArray;\n }\n static get isValidPath() {\n return isValidPath;\n }\n static get shapeParams() {\n return shapeParams;\n }\n static get shapeToPath() {\n return shapeToPath;\n }\n static get shapeToPathArray() {\n return shapeToPathArray;\n }\n static get absolutizeSegment() {\n return absolutizeSegment;\n }\n static get arcToCubic() {\n return arcToCubic;\n }\n static get getSVGMatrix() {\n return getSVGMatrix;\n }\n static get iterate() {\n return iterate;\n }\n static get lineToCubic() {\n return lineToCubic;\n }\n static get normalizePath() {\n return normalizePath;\n }\n static get normalizeSegment() {\n return normalizeSegment;\n }\n static get optimizePath() {\n return optimizePath;\n }\n static get projection2d() {\n return projection2d;\n }\n static get quadToCubic() {\n return quadToCubic;\n }\n static get relativizeSegment() {\n return relativizeSegment;\n }\n static get reverseCurve() {\n return reverseCurve;\n }\n static get reversePath() {\n return reversePath;\n }\n static get roundPath() {\n return roundPath;\n }\n static get roundSegment() {\n return roundSegment;\n }\n static get segmentToCubic() {\n return segmentToCubic;\n }\n static get shortenSegment() {\n return shortenSegment;\n }\n static get splitCubic() {\n return splitCubic;\n }\n static get splitPath() {\n return splitPath;\n }\n static get transformPath() {\n return transformPath;\n }\n}\n\nexport default SVGPathCommander;"],"names":["Z","z","s","e","p","$","E","P","y","g","n","i","r","a","l","m","h","c","u","w","o","d","A","M","b","X","O","x","Y","F","T","k","I","v","R","D","N","midPoint","t","ax","ay","bx","by","distanceSquareRoot","getLineLength","x1","y1","x2","y2","getPointAtLineLength","distance","point","length","getLineBBox","min","max","lineTools","arcLength","rx","ry","theta","halfTheta","sinHalfTheta","cosHalfTheta","term1","term2","arcPoint","cx","cy","alpha","sin","cos","cosA","sinA","angleBetween","v0","v1","v0x","v0y","v1x","v1y","getArcProps","RX","RY","angle","LAF","SF","abs","sqrt","PI","xRotRad","dx","dy","transformedPoint","radiiCheck","cSquareNumerator","cSquareRootDenom","cRadicand","cCoef","transformedCenter","center","startVector","startAngle","endVector","sweepAngle","endAngle","getArcLength","getPointAtArcLength","ellipseComponentX","ellipseComponentY","getArcBBox","deltaAngle","tan","atan2","tangent","angle1","angle2","angle3","angle4","xArray","yArray","xMin","xMax","yMin","yMax","angleAfterStart","pP2","angleBeforeEnd","pP3","p1","p2","p4","p3","arcTools","Tvalues","Cvalues","deriveBezier","points","dpoints","list","j","computeBezier","order","mt","mt2","t2","calculateBezier","derivativeFn","bezierLength","len","sum","getBezierLength","curve","idx","step","CBEZIER_MINMAX_EPSILON","minmaxQ","cp","v2","minmaxC","cp1","cp2","K","S","L","Q","bezierTools","getPointAtCubicSegmentLength","c1x","c1y","c2x","c2y","t1","getCubicLength","getPointAtCubicLength","distanceIsNumber","currentLength","getCubicBBox","cxMinMax","cyMinMax","cubicTools","getPointAtQuadSegmentLength","getQuadLength","getPointAtQuadLength","getQuadBBox","quadTools","polygonTools","polygon","area","rotateVector","rad","roundTo","round","pow","defaultOptions","paramsCount","finalizeSegment","path","pathCommand","relativeCommand","data","error","scanFlag","index","pathValue","code","isDigit","invalidPathValue","scanParam","start","zeroFirst","hasCeiling","hasDecimal","hasDot","ch","isSpace","skipSpaces","isPathCommand","isDigitStart","isArcCommand","isMoveCommand","scanSegment","segments","cmdCode","reqParams","paramCounts","lastSegment","_a","PathParser","pathString","parsePathString","pathInput","absolutizeSegment","segment","lastX","lastY","absCommand","absValues","seglen","iterate","iterator","pathLen","isRelative","mx","my","segLen","iteratorResult","pathToAbsolute","relativizeSegment","relCommand","relValues","pathToRelative","arcToCubic","X1","Y1","X2","Y2","recursive","d120","res","xy","f1","f2","rx2","ry2","df","f2old","x2old","y2old","c1","s1","c2","s2","hx","hy","m1","m2","m3","m4","newres","ii","quadToCubic","qx","qy","r13","r23","lineToCubic","segmentToCubic","params","values","px1","py1","px","py","normalizeSegment","px2","py2","nqx","nqy","paramsParser","pathToCurve","seg","normalSegment","result","pathToString","roundOption","valLen","getPathBBox","minX","minY","maxX","maxY","paramX1","paramY1","paramX2","paramY2","paramQX","paramQY","absoluteSegment","cp1x","cp1y","width","height","getTotalLength","totalLength","DISTANCE_EPSILON","normalizePath","_","getPointAtLength","isM","POINT","getPropertiesAtLength","pathArray","pathTemp","pathLength","lengthAtSegment","getPropertiesAtPoint","normalPath","distanceTo","precision","scan","closest","scanDistance","bestLength","bestDistance","scanLength","before","after","beforeLength","afterLength","beforeDistance","afterDistance","getClosestPoint","getCubicSegArea","getPathArea","getDrawDirection","getSegmentAtLength","getSegmentOfPoint","isPathArray","lk","isAbsoluteArray","isNormalizedArray","pc","isCurveArray","isPointInStroke","isRelativeArray","isValidPath","shapeParams","isElement","node","getLinePath","attr","getPolyPath","getCirclePath","getEllipsePath","getRectanglePath","shapeToPathArray","element","supportedShapes","targetIsElement","tagName","type","shapeAttrs","config","shapeToPath","replace","ownerDocument","doc","description","name","value","shortenSegment","prevCommand","defaultRound","normalValues","nx","ny","nx1","ny1","roundSegment","optimizePath","optimParams","allPathCommands","normalizedSegment","shortSegment","absSegment","absString","relativeSegment","relSegment","relString","reversePath","absolutePath","normalizedPath","pLen","isClosed","reversedPath","prevSeg","nextSeg","nextCommand","splitPath","composite","pi","getSVGMatrix","transform","matrix","CSSMatrix","origin","originX","originY","translate","rotate","skew","scale","translatePoint","cssm","projection2d","point2D","originZ","relativePositionX","relativePositionY","relativePositionZ","transformPath","lx","ly","jj","transformProps","matrixInstance","isLongArc","tempSegment","reverseCurve","rotatedCurve","curveOnly","roundPath","splitCubic","pts","ratio","p0","p5","p6","p7","p8","p9","SVGPathCommander","instanceOptions","undefPath","originOption","onlySubpath","split","subPath","absoluteMultiPath","source","cz","key","pathParser","distanceEpsilon"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 4a4afce..94c5646 100755 --- a/src/index.ts +++ b/src/index.ts @@ -1,741 +1,84 @@ "use strict"; -// import CSSMatrix from "@thednp/dommatrix"; -// import { arcTools } from "./math/arcTools"; -// import { bezierTools } from "./math/bezier"; -// import { cubicTools } from "./math/cubicTools"; -// import { lineTools } from "./math/lineTools"; -// import { quadTools } from "./math/quadTools"; -// import { polygonTools } from "./math/polygonTools"; -// import distanceSquareRoot from "./math/distanceSquareRoot"; -// import midPoint from "./math/midPoint"; -// import rotateVector from "./math/rotateVector"; -// import roundTo from "./math/roundTo"; +import SVGPathCommander from "./main"; -import type { PathArray, PointTuple, TransformObjectValues } from "./types"; -import type { Options, TransformEntries, TransformObject } from "./interface"; -export * from "./types"; -export * from "./interface"; - -import defaultOptions from "./options/options"; - -import pathToAbsolute from "./convert/pathToAbsolute"; -import pathToRelative from "./convert/pathToRelative"; -import pathToCurve from "./convert/pathToCurve"; -import pathToString from "./convert/pathToString"; - -import error from "./parser/error"; -import parsePathString from "./parser/parsePathString"; -// import finalizeSegment from "./parser/finalizeSegment"; -// import invalidPathValue from "./parser/invalidPathValue"; -// import isArcCommand from "./parser/isArcCommand"; -// import isDigit from "./parser/isDigit"; -// import isDigitStart from "./parser/isDigitStart"; -// import isMoveCommand from "./parser/isMoveCommand"; -// import isPathCommand from "./parser/isPathCommand"; -// import isSpace from "./parser/isSpace"; -// import paramsCount from "./parser/paramsCount"; -// import paramsParser from "./parser/paramsParser"; -// import pathParser from "./parser/pathParser"; -// import scanFlag from "./parser/scanFlag"; -// import scanParam from "./parser/scanParam"; -// import scanSegment from "./parser/scanSegment"; -// import skipSpaces from "./parser/skipSpaces"; -import getPathBBox from "./util/getPathBBox"; -import getTotalLength from "./util/getTotalLength"; -// import distanceEpsilon from "./util/distanceEpsilon"; -// import getClosestPoint from "./util/getClosestPoint"; -// import getDrawDirection from "./util/getDrawDirection"; -// import getPathArea from "./util/getPathArea"; -import getPointAtLength from "./util/getPointAtLength"; -// import getPropertiesAtLength from "./util/getPropertiesAtLength"; -// import getPropertiesAtPoint from "./util/getPropertiesAtPoint"; -// import getSegmentAtLength from "./util/getSegmentAtLength"; -// import getSegmentOfPoint from "./util/getSegmentOfPoint"; -// import isAbsoluteArray from "./util/isAbsoluteArray"; -// import isCurveArray from "./util/isCurveArray"; -// import isNormalizedArray from "./util/isNormalizedArray"; -// import isPathArray from "./util/isPathArray"; -// import isPointInStroke from "./util/isPointInStroke"; -// import isRelativeArray from "./util/isRelativeArray"; -// import isValidPath from "./util/isValidPath"; -// import shapeParams from "./util/shapeParams"; -// import shapeToPath from "./util/shapeToPath"; -// import shapeToPathArray from "./util/shapeToPathArray"; -import normalizePath from "./process/normalizePath"; -import optimizePath from "./process/optimizePath"; -import reversePath from "./process/reversePath"; -import splitPath from "./process/splitPath"; -import transformPath from "./process/transformPath"; -// import absolutizeSegment from "./process/absolutizeSegment"; -// import arcToCubic from "./process/arcToCubic"; -// import getSVGMatrix from "./process/getSVGMatrix"; -// import iterate from "./process/iterate"; -// import lineToCubic from "./process/lineToCubic"; -// import normalizeSegment from "./process/normalizeSegment"; -// import projection2d from "./process/projection2d"; -// import quadToCubic from "./process/quadToCubic"; -// import relativizeSegment from "./process/relativizeSegment"; -// import reverseCurve from "./process/reverseCurve"; -// import roundPath from "./process/roundPath"; -// import roundSegment from "./process/roundSegment"; -// import segmentToCubic from "./process/segmentToCubic"; -// import shortenSegment from "./process/shortenSegment"; -// import splitCubic from "./process/splitCubic"; -/** - * Creates a new SVGPathCommander instance with the following properties: - * * segments: `pathArray` - * * round: number - * * origin: [number, number, number?] - * - * @class - * @author thednp - * @returns a new SVGPathCommander instance - */ -class SVGPathCommander { - // declare class properties - declare segments: PathArray; - declare round: number | "off"; - declare origin: [number, number, number]; - - /** - * @constructor - * @param pathValue the path string - * @param config instance options - */ - constructor(pathValue: string, config?: Partial) { - const instanceOptions = config || {}; - const undefPath = typeof pathValue === "undefined"; - - if (undefPath || !pathValue.length) { - throw TypeError( - `${error}: "pathValue" is ${undefPath ? "undefined" : "empty"}`, - ); - } - - this.segments = parsePathString(pathValue); - - // // set instance options.round - const { round: roundOption, origin: originOption } = instanceOptions; - let round: number | "off"; - - if (Number.isInteger(roundOption) || roundOption === "off") { - round = roundOption as number | "off"; - } else { - round = defaultOptions.round as number; - } - - // set instance options.origin - // the SVGPathCommander class will always override the default origin - let origin = defaultOptions.origin as [number, number, number]; - /* istanbul ignore else @preserve */ - if (Array.isArray(originOption) && originOption.length >= 2) { - const [originX, originY, originZ] = originOption.map(Number); - origin = [ - !Number.isNaN(originX) ? originX : 0, - !Number.isNaN(originY) ? originY : 0, - !Number.isNaN(originZ) ? originZ : 0, - ]; - } - - this.round = round; - this.origin = origin; - - return this; - } - get bbox() { - return getPathBBox(this.segments); - } - get length() { - return getTotalLength(this.segments); - } - - /** - * Returns the path bounding box, equivalent to native `path.getBBox()`. - * - * @public - * @returns the pathBBox - */ - getBBox() { - return this.bbox; - } - - /** - * Returns the total path length, equivalent to native `path.getTotalLength()`. - * - * @public - * @returns the path total length - */ - getTotalLength() { - return this.length; - } - - /** - * Returns an `{x,y}` point in the path stroke at a given length, - * equivalent to the native `path.getPointAtLength()`. - * - * @public - * @param length the length - * @returns the requested point - */ - getPointAtLength(length: number) { - return getPointAtLength(this.segments, length); - } - - /** - * Convert path to absolute values - * - * @public - */ - toAbsolute() { - const { segments } = this; - this.segments = pathToAbsolute(segments); - return this; - } - - /** - * Convert path to relative values - * - * @public - */ - toRelative() { - const { segments } = this; - this.segments = pathToRelative(segments); - return this; - } - - /** - * Convert path to cubic-bezier values. In addition, un-necessary `Z` - * segment is removed if previous segment extends to the `M` segment. - * - * @public - */ - toCurve() { - const { segments } = this; - this.segments = pathToCurve(segments); - return this; - } - - /** - * Reverse the order of the segments and their values. - * - * @param onlySubpath option to reverse all sub-paths except first - * @public - */ - reverse(onlySubpath?: boolean) { - const { segments } = this; - const split = splitPath(segments); - const subPath = split.length > 1 ? split : false; - - const absoluteMultiPath = subPath - ? subPath.map((x, i) => { - if (onlySubpath) { - return i ? reversePath(x) : x.slice(0); - } - return reversePath(x); - }) - : segments.slice(0); - - let path = [] as unknown as PathArray; - if (subPath) { - path = absoluteMultiPath.flat(1) as PathArray; - } else { - path = onlySubpath ? segments : reversePath(segments); - } - - this.segments = path.slice(0) as PathArray; - return this; - } - - /** - * Normalize path in 2 steps: - * * convert `pathArray`(s) to absolute values - * * convert shorthand notation to standard notation - * - * @public - */ - normalize() { - const { segments } = this; - this.segments = normalizePath(segments); - return this; - } - - /** - * Optimize `pathArray` values: - * * convert segments to absolute and/or relative values - * * select segments with shortest resulted string - * * round values to the specified `decimals` option value - * - * @public - */ - optimize() { - const { segments } = this; - const round = this.round === "off" ? 2 : this.round; - - this.segments = optimizePath(segments, round); - return this; - } - - /** - * Transform path using values from an `Object` defined as `transformObject`. - * - * @see TransformObject for a quick refference - * - * @param source a `transformObject`as described above - * @public - */ - transform(source?: Partial) { - if ( - !source || - typeof source !== "object" || - (typeof source === "object" && - !["translate", "rotate", "skew", "scale"].some((x) => x in source)) - ) { - return this; - } - - const { - segments, - origin: [cx, cy, cz], - } = this; - const transform = {} as TransformObjectValues; - for (const [k, v] of Object.entries(source) as TransformEntries) { - // istanbul ignore else @preserve - if (k === "skew" && Array.isArray(v)) { - transform[k] = v.map(Number) as PointTuple; - } else if ( - (k === "rotate" || - k === "translate" || - k === "origin" || - k === "scale") && - Array.isArray(v) - ) { - transform[k] = v.map(Number) as [number, number, number]; - } else if (k !== "origin" && typeof Number(v) === "number") { - transform[k] = Number(v); - } - } - - // if origin is not specified - // it's important that we have one - const { origin } = transform; - - if (Array.isArray(origin) && origin.length >= 2) { - const [originX, originY, originZ] = origin.map(Number); - transform.origin = [ - !Number.isNaN(originX) ? originX : cx, - !Number.isNaN(originY) ? originY : cy, - originZ || cz, - ]; - } else { - transform.origin = [cx, cy, cz]; - } - - this.segments = transformPath(segments, transform); - return this; - } - - /** - * Rotate path 180deg vertically - * - * @public - */ - flipX() { - const { cx, cy } = this.bbox; - this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] }); - return this; - } - - /** - * Rotate path 180deg horizontally - * - * @public - */ - flipY() { - const { cx, cy } = this.bbox; - this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] }); - return this; - } - - /** - * Export the current path to be used - * for the `d` (description) attribute. - * - * @public - * @return the path string - */ - toString() { - return pathToString(this.segments, this.round); - } - - /** - * Remove the instance. - * - * @public - * @return void - */ - dispose() { - Object.keys(this).forEach((key) => delete this[key as keyof typeof this]); - } - - // static get CSSMatrix() { - // return CSSMatrix; - // } - // static get arcTools() { - // return arcTools; - // } - // static get bezierTools() { - // return bezierTools; - // } - - // static get cubicTools() { - // return cubicTools; - // } - // static get lineTools() { - // return lineTools; - // } - // static get polygonTools() { - // return polygonTools; - // } - // static get quadTools() { - // return quadTools; - // } - // static get pathToAbsolute() { - // return pathToAbsolute; - // } - // static get pathToRelative() { - // return pathToRelative; - // } - // static get pathToCurve() { - // return pathToCurve; - // } - // static get pathToString() { - // return pathToString; - // } - // static get distanceSquareRoot() { - // return distanceSquareRoot; - // } - // static get midPoint() { - // return midPoint; - // } - // static get rotateVector() { - // return rotateVector; - // } - // static get roundTo() { - // return roundTo; - // } - // static get parsePathString() { - // return parsePathString; - // } - // static get finalizeSegment() { - // return finalizeSegment; - // } - // static get invalidPathValue() { - // return invalidPathValue; - // } - // static get isArcCommand() { - // return isArcCommand; - // } - // static get isDigit() { - // return isDigit; - // } - // static get isDigitStart() { - // return isDigitStart; - // } - // static get isMoveCommand() { - // return isMoveCommand; - // } - // static get isPathCommand() { - // return isPathCommand; - // } - // static get isSpace() { - // return isSpace; - // } - // static get paramsCount() { - // return paramsCount; - // } - // static get paramsParser() { - // return paramsParser; - // } - // static get pathParser() { - // return pathParser; - // } - // static get scanFlag() { - // return scanFlag; - // } - // static get scanParam() { - // return scanParam; - // } - // static get scanSegment() { - // return scanSegment; - // } - // static get skipSpaces() { - // return skipSpaces; - // } - // static get distanceEpsilon() { - // return distanceEpsilon; - // } - // static get getClosestPoint() { - // return getClosestPoint; - // } - // static get getDrawDirection() { - // return getDrawDirection; - // } - // static get getPathArea() { - // return getPathArea; - // } - // static get getPathBBox() { - // return getPathBBox; - // } - // static get getPointAtLength() { - // return getPointAtLength; - // } - // static get getPropertiesAtLength() { - // return getPropertiesAtLength; - // } - // static get getPropertiesAtPoint() { - // return getPropertiesAtPoint; - // } - // static get getSegmentAtLength() { - // return getSegmentAtLength; - // } - // static get getSegmentOfPoint() { - // return getSegmentOfPoint; - // } - // static get getTotalLength() { - // return getTotalLength; - // } - // static get isAbsoluteArray() { - // return isAbsoluteArray; - // } - // static get isCurveArray() { - // return isCurveArray; - // } - // static get isNormalizedArray() { - // return isNormalizedArray; - // } - // static get isPathArray() { - // return isPathArray; - // } - // static get isPointInStroke() { - // return isPointInStroke; - // } - // static get isRelativeArray() { - // return isRelativeArray; - // } - // static get isValidPath() { - // return isValidPath; - // } - // static get shapeParams() { - // return shapeParams; - // } - // static get shapeToPath() { - // return shapeToPath; - // } - // static get shapeToPathArray() { - // return shapeToPathArray; - // } - // static get absolutizeSegment() { - // return absolutizeSegment; - // } - // static get arcToCubic() { - // return arcToCubic; - // } - // static get getSVGMatrix() { - // return getSVGMatrix; - // } - // static get iterate() { - // return iterate; - // } - // static get lineToCubic() { - // return lineToCubic; - // } - // static get normalizePath() { - // return normalizePath; - // } - // static get normalizeSegment() { - // return normalizeSegment; - // } - // static get optimizePath() { - // return optimizePath; - // } - // static get projection2d() { - // return projection2d; - // } - // static get quadToCubic() { - // return quadToCubic; - // } - // static get relativizeSegment() { - // return relativizeSegment; - // } - // static get reverseCurve() { - // return reverseCurve; - // } - // static get reversePath() { - // return reversePath; - // } - // static get roundPath() { - // return roundPath; - // } - // static get roundSegment() { - // return roundSegment; - // } - // static get segmentToCubic() { - // return segmentToCubic; - // } - // static get shortenSegment() { - // return shortenSegment; - // } - // static get splitCubic() { - // return splitCubic; - // } - // static get splitPath() { - // return splitPath; - // } - // static get transformPath() { - // return transformPath; - // } -} +export default SVGPathCommander; -// export { -// absolutizeSegment, -// arcToCubic, -// arcTools, -// bezierTools, -// CSSMatrix, -// cubicTools, -// distanceEpsilon, -// distanceSquareRoot, -// finalizeSegment, -// getClosestPoint, -// getDrawDirection, -// getPathArea, -// getPathBBox, -// getPointAtLength, -// getPropertiesAtLength, -// getPropertiesAtPoint, -// getSegmentAtLength, -// getSegmentOfPoint, -// getSVGMatrix, -// getTotalLength, -// invalidPathValue, -// isAbsoluteArray, -// isArcCommand, -// isCurveArray, -// isDigit, -// isDigitStart, -// isMoveCommand, -// isNormalizedArray, -// isPathArray, -// isPathCommand, -// isPointInStroke, -// isRelativeArray, -// isSpace, -// isValidPath, -// iterate, -// lineToCubic, -// lineTools, -// midPoint, -// normalizePath, -// normalizeSegment, -// optimizePath, -// paramsCount, -// paramsParser, -// parsePathString, -// pathParser, -// pathToAbsolute, -// pathToCurve, -// pathToRelative, -// pathToString, -// polygonTools, -// projection2d, -// quadToCubic, -// quadTools, -// relativizeSegment, -// reverseCurve, -// reversePath, -// rotateVector, -// roundPath, -// roundSegment, -// roundTo, -// scanFlag, -// scanParam, -// scanSegment, -// segmentToCubic, -// shapeParams, -// shapeToPath, -// shapeToPathArray, -// shortenSegment, -// skipSpaces, -// splitCubic, -// splitPath, -// transformPath, -// }; +export { default as CSSMatrix } from "@thednp/dommatrix"; +export { arcTools } from "./math/arcTools"; +export { bezierTools } from "./math/bezier"; +export { cubicTools } from "./math/cubicTools"; +export { lineTools } from "./math/lineTools"; +export { quadTools } from "./math/quadTools"; +export { polygonTools } from "./math/polygonTools"; -export { default as CSSMatrix} from "@thednp/dommatrix"; -export { default as pathToAbsolute} from "./convert/pathToAbsolute"; -export { default as pathToRelative} from "./convert/pathToRelative"; -export { default as pathToCurve} from "./convert/pathToCurve"; -export { default as pathToString} from "./convert/pathToString"; +export { default as distanceSquareRoot } from "./math/distanceSquareRoot"; +export { default as midPoint } from "./math/midPoint"; +export { default as rotateVector } from "./math/rotateVector"; +export { default as roundTo } from "./math/roundTo"; -export { default as error} from "./parser/error"; -export { default as parsePathString} from "./parser/parsePathString"; -export { default as finalizeSegment} from "./parser/finalizeSegment"; -export { default as invalidPathValue} from "./parser/invalidPathValue"; -export { default as isArcCommand} from "./parser/isArcCommand"; -export { default as isDigit} from "./parser/isDigit"; -export { default as isDigitStart} from "./parser/isDigitStart"; -export { default as isMoveCommand} from "./parser/isMoveCommand"; -export { default as isPathCommand} from "./parser/isPathCommand"; -export { default as isSpace} from "./parser/isSpace"; -export { default as paramsCount} from "./parser/paramsCount"; -export { default as paramsParser} from "./parser/paramsParser"; -export { default as pathParser} from "./parser/pathParser"; -export { default as scanFlag} from "./parser/scanFlag"; -export { default as scanParam} from "./parser/scanParam"; -export { default as scanSegment} from "./parser/scanSegment"; -export { default as skipSpaces} from "./parser/skipSpaces"; -export { default as getPathBBox} from "./util/getPathBBox"; -export { default as getTotalLength} from "./util/getTotalLength"; -export { default as distanceEpsilon} from "./util/distanceEpsilon"; -export { default as getClosestPoint} from "./util/getClosestPoint"; -export { default as getDrawDirection} from "./util/getDrawDirection"; -export { default as getPathArea} from "./util/getPathArea"; -export { default as getPointAtLength} from "./util/getPointAtLength"; -export { default as getPropertiesAtLength} from "./util/getPropertiesAtLength"; -export { default as getPropertiesAtPoint} from "./util/getPropertiesAtPoint"; -export { default as getSegmentAtLength} from "./util/getSegmentAtLength"; -export { default as getSegmentOfPoint} from "./util/getSegmentOfPoint"; -export { default as isAbsoluteArray} from "./util/isAbsoluteArray"; -export { default as isCurveArray} from "./util/isCurveArray"; -export { default as isNormalizedArray} from "./util/isNormalizedArray"; -export { default as isPathArray} from "./util/isPathArray"; -export { default as isPointInStroke} from "./util/isPointInStroke"; -export { default as isRelativeArray} from "./util/isRelativeArray"; -export { default as isValidPath} from "./util/isValidPath"; -export { default as shapeParams} from "./util/shapeParams"; -export { default as shapeToPath} from "./util/shapeToPath"; -export { default as shapeToPathArray} from "./util/shapeToPathArray"; -export { default as normalizePath} from "./process/normalizePath"; -export { default as optimizePath} from "./process/optimizePath"; -export { default as reversePath} from "./process/reversePath"; -export { default as splitPath} from "./process/splitPath"; -export { default as transformPath} from "./process/transformPath"; -export { default as absolutizeSegment} from "./process/absolutizeSegment"; -export { default as arcToCubic} from "./process/arcToCubic"; -export { default as getSVGMatrix} from "./process/getSVGMatrix"; -export { default as iterate} from "./process/iterate"; -export { default as lineToCubic} from "./process/lineToCubic"; -export { default as normalizeSegment} from "./process/normalizeSegment"; -export { default as projection2d} from "./process/projection2d"; -export { default as quadToCubic} from "./process/quadToCubic"; -export { default as relativizeSegment} from "./process/relativizeSegment"; -export { default as reverseCurve} from "./process/reverseCurve"; -export { default as roundPath} from "./process/roundPath"; -export {default as roundSegment} from "./process/roundSegment"; -export { default as segmentToCubic} from "./process/segmentToCubic"; -export {default as shortenSegment } from "./process/shortenSegment"; -export { default as splitCubic} from "./process/splitCubic"; +export * from "./types"; +export * from "./interface"; -export default SVGPathCommander; - +export { default as pathToAbsolute } from "./convert/pathToAbsolute"; +export { default as pathToRelative } from "./convert/pathToRelative"; +export { default as pathToCurve } from "./convert/pathToCurve"; +export { default as pathToString } from "./convert/pathToString"; + +export { default as parsePathString } from "./parser/parsePathString"; +export { default as finalizeSegment } from "./parser/finalizeSegment"; +export { default as invalidPathValue } from "./parser/invalidPathValue"; +export { default as isArcCommand } from "./parser/isArcCommand"; +export { default as isDigit } from "./parser/isDigit"; +export { default as isDigitStart } from "./parser/isDigitStart"; +export { default as isMoveCommand } from "./parser/isMoveCommand"; +export { default as isPathCommand } from "./parser/isPathCommand"; +export { default as isSpace } from "./parser/isSpace"; +export { default as paramsCount } from "./parser/paramsCount"; +export { default as paramsParser } from "./parser/paramsParser"; +export { default as pathParser } from "./parser/pathParser"; +export { default as scanFlag } from "./parser/scanFlag"; +export { default as scanParam } from "./parser/scanParam"; +export { default as scanSegment } from "./parser/scanSegment"; +export { default as skipSpaces } from "./parser/skipSpaces"; +export { default as getPathBBox } from "./util/getPathBBox"; +export { default as getTotalLength } from "./util/getTotalLength"; +export { default as distanceEpsilon } from "./util/distanceEpsilon"; +export { default as getClosestPoint } from "./util/getClosestPoint"; +export { default as getDrawDirection } from "./util/getDrawDirection"; +export { default as getPathArea } from "./util/getPathArea"; +export { default as getPointAtLength } from "./util/getPointAtLength"; +export { default as getPropertiesAtLength } from "./util/getPropertiesAtLength"; +export { default as getPropertiesAtPoint } from "./util/getPropertiesAtPoint"; +export { default as getSegmentAtLength } from "./util/getSegmentAtLength"; +export { default as getSegmentOfPoint } from "./util/getSegmentOfPoint"; +export { default as isAbsoluteArray } from "./util/isAbsoluteArray"; +export { default as isCurveArray } from "./util/isCurveArray"; +export { default as isNormalizedArray } from "./util/isNormalizedArray"; +export { default as isPathArray } from "./util/isPathArray"; +export { default as isPointInStroke } from "./util/isPointInStroke"; +export { default as isRelativeArray } from "./util/isRelativeArray"; +export { default as isValidPath } from "./util/isValidPath"; +export { default as shapeParams } from "./util/shapeParams"; +export { default as shapeToPath } from "./util/shapeToPath"; +export { default as shapeToPathArray } from "./util/shapeToPathArray"; +export { default as normalizePath } from "./process/normalizePath"; +export { default as optimizePath } from "./process/optimizePath"; +export { default as reversePath } from "./process/reversePath"; +export { default as splitPath } from "./process/splitPath"; +export { default as transformPath } from "./process/transformPath"; +export { default as absolutizeSegment } from "./process/absolutizeSegment"; +export { default as arcToCubic } from "./process/arcToCubic"; +export { default as getSVGMatrix } from "./process/getSVGMatrix"; +export { default as iterate } from "./process/iterate"; +export { default as lineToCubic } from "./process/lineToCubic"; +export { default as normalizeSegment } from "./process/normalizeSegment"; +export { default as projection2d } from "./process/projection2d"; +export { default as quadToCubic } from "./process/quadToCubic"; +export { default as relativizeSegment } from "./process/relativizeSegment"; +export { default as reverseCurve } from "./process/reverseCurve"; +export { default as roundPath } from "./process/roundPath"; +export { default as roundSegment } from "./process/roundSegment"; +export { default as segmentToCubic } from "./process/segmentToCubic"; +export { default as shortenSegment } from "./process/shortenSegment"; +export { default as splitCubic } from "./process/splitCubic"; diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..7ae0f0f --- /dev/null +++ b/src/main.ts @@ -0,0 +1,597 @@ +"use strict"; +import CSSMatrix from "@thednp/dommatrix"; +import { arcTools } from "./math/arcTools"; +import { bezierTools } from "./math/bezier"; +import { cubicTools } from "./math/cubicTools"; +import { lineTools } from "./math/lineTools"; +import { quadTools } from "./math/quadTools"; +import { polygonTools } from "./math/polygonTools"; + +import distanceSquareRoot from "./math/distanceSquareRoot"; +import midPoint from "./math/midPoint"; +import rotateVector from "./math/rotateVector"; +import roundTo from "./math/roundTo"; + +import type { PathArray, PointTuple, TransformObjectValues } from "./types"; +import type { Options, TransformEntries, TransformObject } from "./interface"; +import defaultOptions from "./options/options"; + +import pathToAbsolute from "./convert/pathToAbsolute"; +import pathToRelative from "./convert/pathToRelative"; +import pathToCurve from "./convert/pathToCurve"; +import pathToString from "./convert/pathToString"; + +import error from "./parser/error"; +import parsePathString from "./parser/parsePathString"; +import finalizeSegment from "./parser/finalizeSegment"; +import invalidPathValue from "./parser/invalidPathValue"; +import isArcCommand from "./parser/isArcCommand"; +import isDigit from "./parser/isDigit"; +import isDigitStart from "./parser/isDigitStart"; +import isMoveCommand from "./parser/isMoveCommand"; +import isPathCommand from "./parser/isPathCommand"; +import isSpace from "./parser/isSpace"; +import paramsCount from "./parser/paramsCount"; +import paramsParser from "./parser/paramsParser"; +import pathParser from "./parser/pathParser"; +import scanFlag from "./parser/scanFlag"; +import scanParam from "./parser/scanParam"; +import scanSegment from "./parser/scanSegment"; +import skipSpaces from "./parser/skipSpaces"; +import getPathBBox from "./util/getPathBBox"; +import getTotalLength from "./util/getTotalLength"; +import distanceEpsilon from "./util/distanceEpsilon"; +import getClosestPoint from "./util/getClosestPoint"; +import getDrawDirection from "./util/getDrawDirection"; +import getPathArea from "./util/getPathArea"; +import getPointAtLength from "./util/getPointAtLength"; +import getPropertiesAtLength from "./util/getPropertiesAtLength"; +import getPropertiesAtPoint from "./util/getPropertiesAtPoint"; +import getSegmentAtLength from "./util/getSegmentAtLength"; +import getSegmentOfPoint from "./util/getSegmentOfPoint"; +import isAbsoluteArray from "./util/isAbsoluteArray"; +import isCurveArray from "./util/isCurveArray"; +import isNormalizedArray from "./util/isNormalizedArray"; +import isPathArray from "./util/isPathArray"; +import isPointInStroke from "./util/isPointInStroke"; +import isRelativeArray from "./util/isRelativeArray"; +import isValidPath from "./util/isValidPath"; +import shapeParams from "./util/shapeParams"; +import shapeToPath from "./util/shapeToPath"; +import shapeToPathArray from "./util/shapeToPathArray"; +import normalizePath from "./process/normalizePath"; +import optimizePath from "./process/optimizePath"; +import reversePath from "./process/reversePath"; +import splitPath from "./process/splitPath"; +import transformPath from "./process/transformPath"; +import absolutizeSegment from "./process/absolutizeSegment"; +import arcToCubic from "./process/arcToCubic"; +import getSVGMatrix from "./process/getSVGMatrix"; +import iterate from "./process/iterate"; +import lineToCubic from "./process/lineToCubic"; +import normalizeSegment from "./process/normalizeSegment"; +import projection2d from "./process/projection2d"; +import quadToCubic from "./process/quadToCubic"; +import relativizeSegment from "./process/relativizeSegment"; +import reverseCurve from "./process/reverseCurve"; +import roundPath from "./process/roundPath"; +import roundSegment from "./process/roundSegment"; +import segmentToCubic from "./process/segmentToCubic"; +import shortenSegment from "./process/shortenSegment"; +import splitCubic from "./process/splitCubic"; +/** + * Creates a new SVGPathCommander instance with the following properties: + * * segments: `pathArray` + * * round: number + * * origin: [number, number, number?] + * + * @class + * @author thednp + * @returns a new SVGPathCommander instance + */ +class SVGPathCommander { + // declare class properties + declare segments: PathArray; + declare round: number | "off"; + declare origin: [number, number, number]; + + /** + * @constructor + * @param pathValue the path string + * @param config instance options + */ + constructor(pathValue: string, config?: Partial) { + const instanceOptions = config || {}; + const undefPath = typeof pathValue === "undefined"; + + if (undefPath || !pathValue.length) { + throw TypeError( + `${error}: "pathValue" is ${undefPath ? "undefined" : "empty"}` + ); + } + + this.segments = parsePathString(pathValue); + + // // set instance options.round + const { round: roundOption, origin: originOption } = instanceOptions; + let round: number | "off"; + + if (Number.isInteger(roundOption) || roundOption === "off") { + round = roundOption as number | "off"; + } else { + round = defaultOptions.round as number; + } + + // set instance options.origin + // the SVGPathCommander class will always override the default origin + let origin = defaultOptions.origin as [number, number, number]; + /* istanbul ignore else @preserve */ + if (Array.isArray(originOption) && originOption.length >= 2) { + const [originX, originY, originZ] = originOption.map(Number); + origin = [ + !Number.isNaN(originX) ? originX : 0, + !Number.isNaN(originY) ? originY : 0, + !Number.isNaN(originZ) ? originZ : 0, + ]; + } + + this.round = round; + this.origin = origin; + + return this; + } + get bbox() { + return getPathBBox(this.segments); + } + get length() { + return getTotalLength(this.segments); + } + + /** + * Returns the path bounding box, equivalent to native `path.getBBox()`. + * + * @public + * @returns the pathBBox + */ + getBBox() { + return this.bbox; + } + + /** + * Returns the total path length, equivalent to native `path.getTotalLength()`. + * + * @public + * @returns the path total length + */ + getTotalLength() { + return this.length; + } + + /** + * Returns an `{x,y}` point in the path stroke at a given length, + * equivalent to the native `path.getPointAtLength()`. + * + * @public + * @param length the length + * @returns the requested point + */ + getPointAtLength(length: number) { + return getPointAtLength(this.segments, length); + } + + /** + * Convert path to absolute values + * + * @public + */ + toAbsolute() { + const { segments } = this; + this.segments = pathToAbsolute(segments); + return this; + } + + /** + * Convert path to relative values + * + * @public + */ + toRelative() { + const { segments } = this; + this.segments = pathToRelative(segments); + return this; + } + + /** + * Convert path to cubic-bezier values. In addition, un-necessary `Z` + * segment is removed if previous segment extends to the `M` segment. + * + * @public + */ + toCurve() { + const { segments } = this; + this.segments = pathToCurve(segments); + return this; + } + + /** + * Reverse the order of the segments and their values. + * + * @param onlySubpath option to reverse all sub-paths except first + * @public + */ + reverse(onlySubpath?: boolean) { + const { segments } = this; + const split = splitPath(segments); + const subPath = split.length > 1 ? split : false; + + const absoluteMultiPath = subPath + ? subPath.map((x, i) => { + if (onlySubpath) { + return i ? reversePath(x) : x.slice(0); + } + return reversePath(x); + }) + : segments.slice(0); + + let path = [] as unknown as PathArray; + if (subPath) { + path = absoluteMultiPath.flat(1) as PathArray; + } else { + path = onlySubpath ? segments : reversePath(segments); + } + + this.segments = path.slice(0) as PathArray; + return this; + } + + /** + * Normalize path in 2 steps: + * * convert `pathArray`(s) to absolute values + * * convert shorthand notation to standard notation + * + * @public + */ + normalize() { + const { segments } = this; + this.segments = normalizePath(segments); + return this; + } + + /** + * Optimize `pathArray` values: + * * convert segments to absolute and/or relative values + * * select segments with shortest resulted string + * * round values to the specified `decimals` option value + * + * @public + */ + optimize() { + const { segments } = this; + const round = this.round === "off" ? 2 : this.round; + + this.segments = optimizePath(segments, round); + return this; + } + + /** + * Transform path using values from an `Object` defined as `transformObject`. + * + * @see TransformObject for a quick refference + * + * @param source a `transformObject`as described above + * @public + */ + transform(source?: Partial) { + if ( + !source || + typeof source !== "object" || + (typeof source === "object" && + !["translate", "rotate", "skew", "scale"].some((x) => x in source)) + ) { + return this; + } + + const { + segments, + origin: [cx, cy, cz], + } = this; + const transform = {} as TransformObjectValues; + for (const [k, v] of Object.entries(source) as TransformEntries) { + // istanbul ignore else @preserve + if (k === "skew" && Array.isArray(v)) { + transform[k] = v.map(Number) as PointTuple; + } else if ( + (k === "rotate" || + k === "translate" || + k === "origin" || + k === "scale") && + Array.isArray(v) + ) { + transform[k] = v.map(Number) as [number, number, number]; + } else if (k !== "origin" && typeof Number(v) === "number") { + transform[k] = Number(v); + } + } + + // if origin is not specified + // it's important that we have one + const { origin } = transform; + + if (Array.isArray(origin) && origin.length >= 2) { + const [originX, originY, originZ] = origin.map(Number); + transform.origin = [ + !Number.isNaN(originX) ? originX : cx, + !Number.isNaN(originY) ? originY : cy, + originZ || cz, + ]; + } else { + transform.origin = [cx, cy, cz]; + } + + this.segments = transformPath(segments, transform); + return this; + } + + /** + * Rotate path 180deg vertically + * + * @public + */ + flipX() { + const { cx, cy } = this.bbox; + this.transform({ rotate: [0, 180, 0], origin: [cx, cy, 0] }); + return this; + } + + /** + * Rotate path 180deg horizontally + * + * @public + */ + flipY() { + const { cx, cy } = this.bbox; + this.transform({ rotate: [180, 0, 0], origin: [cx, cy, 0] }); + return this; + } + + /** + * Export the current path to be used + * for the `d` (description) attribute. + * + * @public + * @return the path string + */ + toString() { + return pathToString(this.segments, this.round); + } + + /** + * Remove the instance. + * + * @public + * @return void + */ + dispose() { + Object.keys(this).forEach((key) => delete this[key as keyof typeof this]); + } + + static get CSSMatrix() { + return CSSMatrix; + } + static get arcTools() { + return arcTools; + } + static get bezierTools() { + return bezierTools; + } + + static get cubicTools() { + return cubicTools; + } + static get lineTools() { + return lineTools; + } + static get polygonTools() { + return polygonTools; + } + static get quadTools() { + return quadTools; + } + static get pathToAbsolute() { + return pathToAbsolute; + } + static get pathToRelative() { + return pathToRelative; + } + static get pathToCurve() { + return pathToCurve; + } + static get pathToString() { + return pathToString; + } + static get distanceSquareRoot() { + return distanceSquareRoot; + } + static get midPoint() { + return midPoint; + } + static get rotateVector() { + return rotateVector; + } + static get roundTo() { + return roundTo; + } + static get parsePathString() { + return parsePathString; + } + static get finalizeSegment() { + return finalizeSegment; + } + static get invalidPathValue() { + return invalidPathValue; + } + static get isArcCommand() { + return isArcCommand; + } + static get isDigit() { + return isDigit; + } + static get isDigitStart() { + return isDigitStart; + } + static get isMoveCommand() { + return isMoveCommand; + } + static get isPathCommand() { + return isPathCommand; + } + static get isSpace() { + return isSpace; + } + static get paramsCount() { + return paramsCount; + } + static get paramsParser() { + return paramsParser; + } + static get pathParser() { + return pathParser; + } + static get scanFlag() { + return scanFlag; + } + static get scanParam() { + return scanParam; + } + static get scanSegment() { + return scanSegment; + } + static get skipSpaces() { + return skipSpaces; + } + static get distanceEpsilon() { + return distanceEpsilon; + } + static get getClosestPoint() { + return getClosestPoint; + } + static get getDrawDirection() { + return getDrawDirection; + } + static get getPathArea() { + return getPathArea; + } + static get getPathBBox() { + return getPathBBox; + } + static get getPointAtLength() { + return getPointAtLength; + } + static get getPropertiesAtLength() { + return getPropertiesAtLength; + } + static get getPropertiesAtPoint() { + return getPropertiesAtPoint; + } + static get getSegmentAtLength() { + return getSegmentAtLength; + } + static get getSegmentOfPoint() { + return getSegmentOfPoint; + } + static get getTotalLength() { + return getTotalLength; + } + static get isAbsoluteArray() { + return isAbsoluteArray; + } + static get isCurveArray() { + return isCurveArray; + } + static get isNormalizedArray() { + return isNormalizedArray; + } + static get isPathArray() { + return isPathArray; + } + static get isPointInStroke() { + return isPointInStroke; + } + static get isRelativeArray() { + return isRelativeArray; + } + static get isValidPath() { + return isValidPath; + } + static get shapeParams() { + return shapeParams; + } + static get shapeToPath() { + return shapeToPath; + } + static get shapeToPathArray() { + return shapeToPathArray; + } + static get absolutizeSegment() { + return absolutizeSegment; + } + static get arcToCubic() { + return arcToCubic; + } + static get getSVGMatrix() { + return getSVGMatrix; + } + static get iterate() { + return iterate; + } + static get lineToCubic() { + return lineToCubic; + } + static get normalizePath() { + return normalizePath; + } + static get normalizeSegment() { + return normalizeSegment; + } + static get optimizePath() { + return optimizePath; + } + static get projection2d() { + return projection2d; + } + static get quadToCubic() { + return quadToCubic; + } + static get relativizeSegment() { + return relativizeSegment; + } + static get reverseCurve() { + return reverseCurve; + } + static get reversePath() { + return reversePath; + } + static get roundPath() { + return roundPath; + } + static get roundSegment() { + return roundSegment; + } + static get segmentToCubic() { + return segmentToCubic; + } + static get shortenSegment() { + return shortenSegment; + } + static get splitCubic() { + return splitCubic; + } + static get splitPath() { + return splitPath; + } + static get transformPath() { + return transformPath; + } +} + +export default SVGPathCommander; \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts index cd68ab2..0c09f2e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -26,15 +26,15 @@ export default defineConfig({ emptyOutDir: false, outDir: 'dist', lib: { - entry: resolve(__dirname, 'src/index.ts'), + entry: resolve(__dirname, 'src/main.ts'), name: NAME, formats: ['iife'], fileName: (format: string) => fileName[format], - + }, sourcemap: true, reportCompressedSize: true, - + }, esbuild: { legalComments: 'none',